Feature: add author, size, readme display for extension store page (#74)

* fix: update email field in KunkunExtManifest to be optional and nullable

* refactor: update Supabase type generation command and enhance database types structure

- Changed the Supabase type generation command to include a specific project reference and output path.
- Refactored the database types in `database.types.ts` for improved readability and added new fields, including `extension_state` and `package_json` in the `ext_publish` table.
- Ensured consistent formatting across type definitions for better maintainability.

* feat: add optional README path to ExtPackageJson and enhance tests for README retrieval

* feat: add optional readmeContent to ExtensionPublishValidationData and retrieve README in validateJsrPackageAsKunkunExtension

* feat: add optional readme field to database types for improved package metadata

* feat: enhance StoreExtDetail to display package metadata including author and contributors

- Added packageJson prop to StoreExtDetail for improved extension metadata display.
- Implemented rendering of author and contributors from packageJson.
- Integrated README content display in StoreExtDetail if available.
- Updated +page.svelte to parse and provide packageJson data using valibot for validation.

* feat: enhance TauriLink component to support conditional rendering based on Tauri environment

- Added detection for Tauri environment using the browser variable.
- Updated the TauriLink component to render a button when in Tauri, and an anchor tag for external links otherwise.
- Improved user experience by ensuring appropriate link behavior based on the application context.

* feat: add unpacked size to npm registry

* feat: replace size in ext_publish table to tarball_size, add unpacked_size (only applicable to npm)

* feat: add pretty-bytes dependency and update debug package version

- Added `pretty-bytes` package with version 6.1.1 to `package.json`.
- Updated `debug` package to use `supports-color@9.4.0` in `pnpm-lock.yaml` for improved compatibility.

* feat: add tarball_size field to database types for improved package metadata

* feat: add readme fetching for npm registry, readme from github

* fix: remove console.log from NPM API test to clean up output

* style: update extension store details

* style: update README section in StoreExtDetail component for improved styling

* fix: update command input placeholder text in English, Russian, and Chinese translations for clarity

* chore: bump version to 0.1.18 in package.json

* fix: lint
This commit is contained in:
Huakun Shen 2025-01-23 07:07:29 -05:00 committed by GitHub
parent f03cb6cbad
commit 0cc744592f
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
27 changed files with 597 additions and 440 deletions

View File

@ -9,7 +9,7 @@
"common_check": "Check",
"common_install": "Install",
"home_command_input_placeholder": "Type a command or search...",
"home_command_input_placeholder": "Type \"\/\" to search...",
"home_command_input_dropdown_quit": "Quit",
"home_command_input_dropdown_developer_title": "Developer",
"home_command_input_dropdown_close_window": "Close Window",

View File

@ -9,7 +9,7 @@
"common_check": "Проверить",
"common_install": "Установить",
"home_command_input_placeholder": "Введите команду или поисковый запрос…",
"home_command_input_placeholder": "Нажмите \"/\" для поиска...",
"home_command_input_dropdown_quit": "Выйти",
"home_command_input_dropdown_developer_title": "Разработчик",
"home_command_input_dropdown_close_window": "Закрыть окно",

View File

@ -9,7 +9,7 @@
"common_check": "检查",
"common_install": "安装",
"home_command_input_placeholder": "输入命令或搜索...",
"home_command_input_placeholder": "按 \"/\" 开始搜索...",
"home_command_input_dropdown_quit": "退出",
"home_command_input_dropdown_developer_title": "开发者",
"home_command_input_dropdown_close_window": "关闭窗口",

View File

@ -1,6 +1,6 @@
{
"name": "@kksh/desktop",
"version": "0.1.17",
"version": "0.1.18",
"description": "",
"type": "module",
"scripts": {
@ -16,11 +16,13 @@
"license": "MIT",
"dependencies": {
"@formkit/auto-animate": "^0.8.2",
"@inlang/paraglide-sveltekit": "0.15.5",
"@kksh/extension": "workspace:*",
"@kksh/supabase": "workspace:*",
"@kksh/ui": "workspace:*",
"@kksh/utils": "workspace:*",
"@std/semver": "npm:@jsr/std__semver@^1.0.3",
"@supabase/supabase-js": "^2.48.0",
"@tanstack/table-core": "^8.20.5",
"@tauri-apps/api": "^2.1.1",
"@tauri-apps/plugin-shell": "^2.2.0",
@ -35,11 +37,11 @@
"sveltekit-superforms": "^2.22.1",
"tauri-plugin-clipboard-api": "^2.1.11",
"tauri-plugin-user-input-api": "workspace:*",
"uuid": "^11.0.3",
"@inlang/paraglide-sveltekit": "0.15.5"
"uuid": "^11.0.3"
},
"devDependencies": {
"@eslint/js": "^9.18.0",
"@inlang/paraglide-js": "1.11.8",
"@kksh/types": "workspace:*",
"@sveltejs/adapter-static": "^3.0.6",
"@sveltejs/kit": "^2.12.1",
@ -69,7 +71,6 @@
"tslib": "^2.8.1",
"typescript": "^5.6.3",
"typescript-eslint": "^8.20.0",
"vite": "^6.0.3",
"@inlang/paraglide-js": "1.11.8"
"vite": "^6.0.3"
}
}

View File

@ -34,13 +34,13 @@
import { goto } from "$app/navigation"
import { ArrowBigUpIcon, CircleXIcon, EllipsisVerticalIcon, RefreshCcwIcon } from "lucide-svelte"
import { onMount } from "svelte"
import { toast } from "svelte-sonner"
const win = getCurrentWindow()
let inputEle: HTMLInputElement | null = $state(null)
function onKeyDown(event: KeyboardEvent) {
if (event.key === "Escape") {
if ((event.target as HTMLInputElement).value === "") {
getCurrentWindow().hide()
win.hide()
} else {
;(event.target as HTMLInputElement).value = ""
$appState.searchTerm = ""
@ -49,16 +49,19 @@
}
onMount(() => {
Promise.all([Window.getByLabel("splashscreen"), getCurrentWindow()]).then(
([splashscreenWin, mainWin]) => {
if (splashscreenWin) {
splashscreenWin.close()
}
mainWin.show()
Window.getByLabel("splashscreen").then((splashscreenWin) => {
if (splashscreenWin) {
splashscreenWin.close()
}
)
win.show()
})
win.onFocusChanged(({ payload: focused }) => {
if (focused) {
win.show()
inputEle?.focus()
}
})
inputEle?.focus()
appConfigLoaded.subscribe((loaded) => {
// wait for appConfig store to be loaded, it's async and saved to disk when changed, so we use another store appConfigLoaded
// to keep track of the loading status

View File

@ -4,6 +4,7 @@
import { extensions, installedStoreExts } from "@/stores/extensions.js"
import { supabaseAPI } from "@/supabase"
import { goBack } from "@/utils/route.js"
import { ExtPackageJson } from "@kksh/api/models"
import { ExtPublishMetadata } from "@kksh/supabase/models"
import type { Tables } from "@kksh/supabase/types"
import { Button } from "@kksh/svelte5"
@ -17,7 +18,8 @@
import { onMount } from "svelte"
import { toast } from "svelte-sonner"
import { derived as storeDerived } from "svelte/store"
import { getInstallExtras } from "./helper.js"
import * as v from "valibot"
import { getInstallExtras } from "./helper"
const { data } = $props()
const extPublish: Tables<"ext_publish"> & { metadata: ExtPublishMetadata } = $derived(
@ -29,6 +31,11 @@
return $e.find((e) => e.kunkun.identifier === extPublish.identifier)
})
const packageJson = $derived.by(() => {
const parsed = v.safeParse(ExtPackageJson, data.extPublish.package_json)
return parsed.success ? parsed.output : null
})
const isUpgradable = $derived(
$installedExt
? greaterThan(parseSemver(extPublish.version), parseSemver($installedExt.version))
@ -168,6 +175,7 @@
</Button>
<StoreExtDetail
class="px-5"
{packageJson}
{extPublish}
{ext}
{manifest}

2
deno.lock generated
View File

@ -5715,7 +5715,7 @@
"@supabase/ssr@0.5.2_@supabase+supabase-js@2.47.12": {
"integrity": "sha512-n3plRhr2Bs8Xun1o4S3k1CDv17iH5QY9YcoEvXX3bxV1/5XSasA0mNXYycFmADIdtdE6BG9MRjP5CGIs8qxC8A==",
"dependencies": [
"@supabase/supabase-js",
"@supabase/supabase-js": "^2.48.0"
"@types/cookie",
"cookie@0.7.2"
]

View File

@ -30,7 +30,7 @@
"dependencies": {
"@changesets/cli": "^2.27.11",
"@iconify/svelte": "^4.2.0",
"@supabase/supabase-js": "^2.47.11",
"@supabase/supabase-js": "^2.48.0",
"@tauri-apps/api": "^2.2.0",
"@tauri-apps/cli": "^2.2.2",
"@tauri-apps/plugin-deep-link": "^2.2.0",

View File

@ -134,7 +134,7 @@ export type KunkunExtManifest = v.InferOutput<typeof KunkunExtManifest>
const Person = v.union([
v.object({
name: v.string("GitHub Username"),
email: v.string("Email of the person"),
email: v.optional(v.nullable(v.string("Email of the person"))),
url: v.optional(v.nullable(v.string("URL of the person")))
}),
v.string("GitHub Username")
@ -167,6 +167,7 @@ export type License = v.InferOutput<typeof License>
export const ExtPackageJson = v.object({
name: v.string("Package name for the extension (just a regular npm package name)"),
version: v.string("Version of the extension"),
readme: v.optional(v.string("Custom README.md path of the extension")),
license: License,
author: v.optional(Person),
draft: v.optional(v.boolean("Whether the extension is a draft, draft will not be published")),

View File

@ -0,0 +1,14 @@
import { describe, expect, it } from "bun:test"
import { getRawFileFromGitHub } from "../utils"
describe("getRawFileFromGitHub", () => {
it("should return the content of the file", async () => {
const content = await getRawFileFromGitHub(
"kunkunsh",
"kunkun-ext-download-twitter-video",
"71e5b74b4baaca68433c11cc6233138ca40fd32a",
"README.md"
)
expect(content).toBeDefined()
})
})

View File

@ -60,6 +60,16 @@ describe("Test the helper functions", () => {
expect(parsed).toBeDefined()
})
test("Get Package's README", async () => {
const readme = await getJsrPackageSrcFile(
"kunkun",
"ext-image-processing",
"0.0.20",
"README.md"
)
expect(readme).toBeDefined()
})
test("Get Package's README.md", async () => {
const readme = await getJsrPackageSrcFile("kunkun", "api", "0.0.47", "README.md")
expect(readme).toBeDefined()

View File

@ -1,3 +1,4 @@
import https from "https"
import {
client,
getPackage,
@ -344,6 +345,17 @@ export async function validateJsrPackageAsKunkunExtension(payload: {
}
}
/* -------------------------------------------------------------------------- */
/* get README content */
/* -------------------------------------------------------------------------- */
const readmeContent = await getJsrPackageSrcFile(
payload.jsrPackage.scope,
payload.jsrPackage.name,
payload.jsrPackage.version,
parseResult.output.readme ?? "README.md"
)
/* -------------------------------------------------------------------------- */
/* get @kksh/api dependency version */
/* -------------------------------------------------------------------------- */
@ -357,6 +369,7 @@ export async function validateJsrPackageAsKunkunExtension(payload: {
return {
data: {
pkgJson: parseResult.output,
readmeContent,
tarballUrl,
license: parseResult.output.license,
shasum,

View File

@ -62,10 +62,12 @@ export type SigstoreAttestation = v.InferOutput<typeof SigstoreAttestation>
export const ExtensionPublishValidationData = v.object({
pkgJson: ExtPackageJson,
tarballUrl: v.string(),
readmeContent: v.optional(v.string()),
shasum: v.string(),
apiVersion: v.string(),
rekorLogIndex: v.string(),
tarballSize: v.number(),
unpackedSize: v.optional(v.number()),
license: License,
github: v.object({
githubActionInvocationId: v.string(),

View File

@ -59,4 +59,13 @@ describe("NPM API", () => {
expect(await npmPackageExists("kunkun-ext-ossinsight", "0.0.1")).toBe(true)
expect(await npmPackageExists("kunkun-ext-non-existing", "0.0.1")).toBe(false)
})
test("validate npm package as kunkun extension", async () => {
const result = await validateNpmPackageAsKunkunExtension({
pkgName: "kunkun-ext-hacker-news",
version: "0.0.10",
githubUsername: "huakunshen"
})
expect(result.error).toBeUndefined()
})
})

View File

@ -7,6 +7,7 @@ import {
} from "../github"
import type { ExtensionPublishValidationData } from "../models"
import { getInfoFromRekorLog } from "../sigstore"
import { getRawFileFromGitHub, getTarballSize } from "../utils"
import {
NpmPkgMetadata,
NpmPkgVersionMetadata,
@ -207,7 +208,7 @@ export async function validateNpmPackageAsKunkunExtension(payload: {
const parseResult = v.safeParse(ExtPackageJson, packageJson)
if (!parseResult.success) {
console.log(v.flatten(parseResult.issues))
console.error(v.flatten(parseResult.issues))
return { error: `package.json format not valid` }
}
/* -------------------------------------------------------------------------- */
@ -228,15 +229,24 @@ export async function validateNpmPackageAsKunkunExtension(payload: {
error: `Extension ${parseResult.output.kunkun.identifier} doesn't not have @kksh/api as a dependency`
}
}
const tarballSize = await getTarballSize(tarballUrl, "GET") // NPM HEAD request doesn't support content-length
const readmeContent = await getRawFileFromGitHub(
githubRepo.owner,
githubRepo.repo,
provenance.summary.sourceRepositoryDigest,
parseResult.output.readme ?? "README.md"
)
return {
data: {
pkgJson: parseResult.output,
license: licenseParsed.output,
readmeContent,
tarballUrl,
shasum,
apiVersion,
tarballSize: 0,
tarballSize,
unpackedSize: packageJson.dist?.unpackedSize,
rekorLogIndex: logIndex,
github: {
githubActionInvocationId: rekorGit.githubActionInvocationId,

View File

@ -3,11 +3,22 @@
* @param url tarball url, can technically be any url
* @returns tarball size in bytes
*/
export function getTarballSize(url: string): Promise<number> {
return fetch(url, { method: "HEAD" }).then((res) => {
export function getTarballSize(url: string, method: "HEAD" | "GET" = "HEAD"): Promise<number> {
return fetch(url, { method }).then((res) => {
if (!(res.ok && res.status === 200)) {
throw new Error("Failed to fetch tarball size")
}
return Number(res.headers.get("Content-Length"))
})
}
export function getRawFileFromGitHub(
owner: string,
repo: string,
commit: string,
filePath: string
): Promise<string | undefined> {
return fetch(`https://raw.githubusercontent.com/${owner}/${repo}/${commit}/${filePath}`)
.then((res) => (res.ok ? res.text() : undefined))
.catch((e) => undefined)
}

View File

@ -16,7 +16,7 @@
"devDependencies": {
"@types/bun": "latest",
"@kksh/supabase": "workspace:*",
"@supabase/supabase-js": "^2.47.16",
"@supabase/supabase-js": "^2.48.0",
"@valibot/to-json-schema": "1.0.0-beta.4"
},
"peerDependencies": {

View File

@ -1,3 +1,4 @@
```bash
npx supabase gen types --lang=typescript --project-id $PROJECT_REF --schema public > ../api/src/supabase/database.types.ts
export PROJECT_REF=qzehioyfmxlgkeuujwlh
npx supabase gen types --lang=typescript --project-id $PROJECT_REF --schema public > ./src/database.types.ts
```

View File

@ -13,7 +13,7 @@
"dependencies": {
"@kksh/api": "workspace:*",
"@supabase/ssr": "^0.5.2",
"@supabase/supabase-js": "^2.47.12"
"@supabase/supabase-js": "^2.48.0"
},
"devDependencies": {
"@types/bun": "latest"

View File

@ -1,295 +1,325 @@
export type Json = string | number | boolean | null | { [key: string]: Json | undefined } | Json[]
export type Json =
| string
| number
| boolean
| null
| { [key: string]: Json | undefined }
| Json[]
export type Database = {
public: {
Tables: {
events: {
Row: {
created_at: string
data: Json | null
event_type: Database["public"]["Enums"]["event_type"]
id: number
ip: string
}
Insert: {
created_at?: string
data?: Json | null
event_type: Database["public"]["Enums"]["event_type"]
id?: number
ip: string
}
Update: {
created_at?: string
data?: Json | null
event_type?: Database["public"]["Enums"]["event_type"]
id?: number
ip?: string
}
Relationships: []
}
ext_images: {
Row: {
created_at: string
image_path: string
sha512: string
}
Insert: {
created_at?: string
image_path: string
sha512: string
}
Update: {
created_at?: string
image_path?: string
sha512?: string
}
Relationships: []
}
ext_publish: {
Row: {
api_version: string | null
cmd_count: number
created_at: string
demo_images: string[]
downloads: number
id: number
identifier: string
manifest: Json
metadata: Json | null
name: string
shasum: string
size: number
tarball_path: string
version: string
}
Insert: {
api_version?: string | null
cmd_count: number
created_at?: string
demo_images: string[]
downloads: number
id?: number
identifier: string
manifest: Json
metadata?: Json | null
name: string
shasum: string
size: number
tarball_path: string
version: string
}
Update: {
api_version?: string | null
cmd_count?: number
created_at?: string
demo_images?: string[]
downloads?: number
id?: number
identifier?: string
manifest?: Json
metadata?: Json | null
name?: string
shasum?: string
size?: number
tarball_path?: string
version?: string
}
Relationships: [
{
foreignKeyName: "ext_publish_identifier_fkey"
columns: ["identifier"]
isOneToOne: false
referencedRelation: "extensions"
referencedColumns: ["identifier"]
}
]
}
extensions: {
Row: {
api_version: string
author_id: string | null
created_at: string
downloads: number
icon: Json | null
identifier: string
long_description: string | null
name: string
readme: string | null
short_description: string
version: string
}
Insert: {
api_version: string
author_id?: string | null
created_at?: string
downloads: number
icon?: Json | null
identifier: string
long_description?: string | null
name: string
readme?: string | null
short_description: string
version: string
}
Update: {
api_version?: string
author_id?: string | null
created_at?: string
downloads?: number
icon?: Json | null
identifier?: string
long_description?: string | null
name?: string
readme?: string | null
short_description?: string
version?: string
}
Relationships: []
}
stargazers: {
Row: {
created_at: string
id: number
star_date: string
username: string
}
Insert: {
created_at?: string
id?: number
star_date: string
username: string
}
Update: {
created_at?: string
id?: number
star_date?: string
username?: string
}
Relationships: []
}
}
Views: {
[_ in never]: never
}
Functions: {
get_aggregated_downloads: {
Args: Record<PropertyKey, never>
Returns: {
identifier: string
total_downloads: number
}[]
}
get_aggregated_downloads_with_details: {
Args: Record<PropertyKey, never>
Returns: {
identifier: string
total_downloads: number
name: string
short_description: string
}[]
}
increment_downloads: {
Args: {
t_identifier: string
t_version: string
}
Returns: number
}
}
Enums: {
event_type: "download" | "updater" | "schema" | "nightly_schema"
}
CompositeTypes: {
[_ in never]: never
}
}
public: {
Tables: {
events: {
Row: {
created_at: string
data: Json | null
event_type: Database["public"]["Enums"]["event_type"]
id: number
ip: string
}
Insert: {
created_at?: string
data?: Json | null
event_type: Database["public"]["Enums"]["event_type"]
id?: number
ip: string
}
Update: {
created_at?: string
data?: Json | null
event_type?: Database["public"]["Enums"]["event_type"]
id?: number
ip?: string
}
Relationships: []
}
ext_images: {
Row: {
created_at: string
image_path: string
sha512: string
}
Insert: {
created_at?: string
image_path: string
sha512: string
}
Update: {
created_at?: string
image_path?: string
sha512?: string
}
Relationships: []
}
ext_publish: {
Row: {
api_version: string | null
cmd_count: number
created_at: string
demo_images: string[]
downloads: number
extension_state: Database["public"]["Enums"]["extension_state"]
id: number
identifier: string
manifest: Json
metadata: Json | null
name: string
package_json: Json | null
readme: string | null
shasum: string
tarball_path: string
tarball_size: number
unpacked_size: number | null
version: string
}
Insert: {
api_version?: string | null
cmd_count: number
created_at?: string
demo_images: string[]
downloads: number
extension_state?: Database["public"]["Enums"]["extension_state"]
id?: number
identifier: string
manifest: Json
metadata?: Json | null
name: string
package_json?: Json | null
readme?: string | null
shasum: string
tarball_path: string
tarball_size: number
unpacked_size?: number | null
version: string
}
Update: {
api_version?: string | null
cmd_count?: number
created_at?: string
demo_images?: string[]
downloads?: number
extension_state?: Database["public"]["Enums"]["extension_state"]
id?: number
identifier?: string
manifest?: Json
metadata?: Json | null
name?: string
package_json?: Json | null
readme?: string | null
shasum?: string
tarball_path?: string
tarball_size?: number
unpacked_size?: number | null
version?: string
}
Relationships: [
{
foreignKeyName: "ext_publish_identifier_fkey"
columns: ["identifier"]
isOneToOne: false
referencedRelation: "extensions"
referencedColumns: ["identifier"]
},
]
}
extensions: {
Row: {
api_version: string
author_id: string | null
created_at: string
downloads: number
icon: Json | null
identifier: string
long_description: string | null
name: string
readme: string | null
short_description: string
tarball_size: number | null
version: string
}
Insert: {
api_version: string
author_id?: string | null
created_at?: string
downloads: number
icon?: Json | null
identifier: string
long_description?: string | null
name: string
readme?: string | null
short_description: string
tarball_size?: number | null
version: string
}
Update: {
api_version?: string
author_id?: string | null
created_at?: string
downloads?: number
icon?: Json | null
identifier?: string
long_description?: string | null
name?: string
readme?: string | null
short_description?: string
tarball_size?: number | null
version?: string
}
Relationships: []
}
stargazers: {
Row: {
created_at: string
id: number
star_date: string
username: string
}
Insert: {
created_at?: string
id?: number
star_date: string
username: string
}
Update: {
created_at?: string
id?: number
star_date?: string
username?: string
}
Relationships: []
}
}
Views: {
[_ in never]: never
}
Functions: {
get_aggregated_downloads: {
Args: Record<PropertyKey, never>
Returns: {
identifier: string
total_downloads: number
}[]
}
get_aggregated_downloads_with_details: {
Args: Record<PropertyKey, never>
Returns: {
identifier: string
total_downloads: number
name: string
short_description: string
}[]
}
increment_downloads: {
Args: {
t_identifier: string
t_version: string
}
Returns: number
}
}
Enums: {
event_type: "download" | "updater" | "schema" | "nightly_schema"
extension_state: "public" | "pending" | "under_review" | "private"
}
CompositeTypes: {
[_ in never]: never
}
}
}
type PublicSchema = Database[Extract<keyof Database, "public">]
export type Tables<
PublicTableNameOrOptions extends
| keyof (PublicSchema["Tables"] & PublicSchema["Views"])
| { schema: keyof Database },
TableName extends PublicTableNameOrOptions extends { schema: keyof Database }
? keyof (Database[PublicTableNameOrOptions["schema"]]["Tables"] &
Database[PublicTableNameOrOptions["schema"]]["Views"])
: never = never
PublicTableNameOrOptions extends
| keyof (PublicSchema["Tables"] & PublicSchema["Views"])
| { schema: keyof Database },
TableName extends PublicTableNameOrOptions extends { schema: keyof Database }
? keyof (Database[PublicTableNameOrOptions["schema"]]["Tables"] &
Database[PublicTableNameOrOptions["schema"]]["Views"])
: never = never,
> = PublicTableNameOrOptions extends { schema: keyof Database }
? (Database[PublicTableNameOrOptions["schema"]]["Tables"] &
Database[PublicTableNameOrOptions["schema"]]["Views"])[TableName] extends {
Row: infer R
}
? R
: never
: PublicTableNameOrOptions extends keyof (PublicSchema["Tables"] & PublicSchema["Views"])
? (PublicSchema["Tables"] & PublicSchema["Views"])[PublicTableNameOrOptions] extends {
Row: infer R
}
? R
: never
: never
? (Database[PublicTableNameOrOptions["schema"]]["Tables"] &
Database[PublicTableNameOrOptions["schema"]]["Views"])[TableName] extends {
Row: infer R
}
? R
: never
: PublicTableNameOrOptions extends keyof (PublicSchema["Tables"] &
PublicSchema["Views"])
? (PublicSchema["Tables"] &
PublicSchema["Views"])[PublicTableNameOrOptions] extends {
Row: infer R
}
? R
: never
: never
export type TablesInsert<
PublicTableNameOrOptions extends keyof PublicSchema["Tables"] | { schema: keyof Database },
TableName extends PublicTableNameOrOptions extends { schema: keyof Database }
? keyof Database[PublicTableNameOrOptions["schema"]]["Tables"]
: never = never
PublicTableNameOrOptions extends
| keyof PublicSchema["Tables"]
| { schema: keyof Database },
TableName extends PublicTableNameOrOptions extends { schema: keyof Database }
? keyof Database[PublicTableNameOrOptions["schema"]]["Tables"]
: never = never,
> = PublicTableNameOrOptions extends { schema: keyof Database }
? Database[PublicTableNameOrOptions["schema"]]["Tables"][TableName] extends {
Insert: infer I
}
? I
: never
: PublicTableNameOrOptions extends keyof PublicSchema["Tables"]
? PublicSchema["Tables"][PublicTableNameOrOptions] extends {
Insert: infer I
}
? I
: never
: never
? Database[PublicTableNameOrOptions["schema"]]["Tables"][TableName] extends {
Insert: infer I
}
? I
: never
: PublicTableNameOrOptions extends keyof PublicSchema["Tables"]
? PublicSchema["Tables"][PublicTableNameOrOptions] extends {
Insert: infer I
}
? I
: never
: never
export type TablesUpdate<
PublicTableNameOrOptions extends keyof PublicSchema["Tables"] | { schema: keyof Database },
TableName extends PublicTableNameOrOptions extends { schema: keyof Database }
? keyof Database[PublicTableNameOrOptions["schema"]]["Tables"]
: never = never
PublicTableNameOrOptions extends
| keyof PublicSchema["Tables"]
| { schema: keyof Database },
TableName extends PublicTableNameOrOptions extends { schema: keyof Database }
? keyof Database[PublicTableNameOrOptions["schema"]]["Tables"]
: never = never,
> = PublicTableNameOrOptions extends { schema: keyof Database }
? Database[PublicTableNameOrOptions["schema"]]["Tables"][TableName] extends {
Update: infer U
}
? U
: never
: PublicTableNameOrOptions extends keyof PublicSchema["Tables"]
? PublicSchema["Tables"][PublicTableNameOrOptions] extends {
Update: infer U
}
? U
: never
: never
? Database[PublicTableNameOrOptions["schema"]]["Tables"][TableName] extends {
Update: infer U
}
? U
: never
: PublicTableNameOrOptions extends keyof PublicSchema["Tables"]
? PublicSchema["Tables"][PublicTableNameOrOptions] extends {
Update: infer U
}
? U
: never
: never
export type Enums<
PublicEnumNameOrOptions extends keyof PublicSchema["Enums"] | { schema: keyof Database },
EnumName extends PublicEnumNameOrOptions extends { schema: keyof Database }
? keyof Database[PublicEnumNameOrOptions["schema"]]["Enums"]
: never = never
PublicEnumNameOrOptions extends
| keyof PublicSchema["Enums"]
| { schema: keyof Database },
EnumName extends PublicEnumNameOrOptions extends { schema: keyof Database }
? keyof Database[PublicEnumNameOrOptions["schema"]]["Enums"]
: never = never,
> = PublicEnumNameOrOptions extends { schema: keyof Database }
? Database[PublicEnumNameOrOptions["schema"]]["Enums"][EnumName]
: PublicEnumNameOrOptions extends keyof PublicSchema["Enums"]
? PublicSchema["Enums"][PublicEnumNameOrOptions]
: never
? Database[PublicEnumNameOrOptions["schema"]]["Enums"][EnumName]
: PublicEnumNameOrOptions extends keyof PublicSchema["Enums"]
? PublicSchema["Enums"][PublicEnumNameOrOptions]
: never
export type CompositeTypes<
PublicCompositeTypeNameOrOptions extends
| keyof PublicSchema["CompositeTypes"]
| { schema: keyof Database },
CompositeTypeName extends PublicCompositeTypeNameOrOptions extends {
schema: keyof Database
}
? keyof Database[PublicCompositeTypeNameOrOptions["schema"]]["CompositeTypes"]
: never = never
PublicCompositeTypeNameOrOptions extends
| keyof PublicSchema["CompositeTypes"]
| { schema: keyof Database },
CompositeTypeName extends PublicCompositeTypeNameOrOptions extends {
schema: keyof Database
}
? keyof Database[PublicCompositeTypeNameOrOptions["schema"]]["CompositeTypes"]
: never = never,
> = PublicCompositeTypeNameOrOptions extends { schema: keyof Database }
? Database[PublicCompositeTypeNameOrOptions["schema"]]["CompositeTypes"][CompositeTypeName]
: PublicCompositeTypeNameOrOptions extends keyof PublicSchema["CompositeTypes"]
? PublicSchema["CompositeTypes"][PublicCompositeTypeNameOrOptions]
: never
? Database[PublicCompositeTypeNameOrOptions["schema"]]["CompositeTypes"][CompositeTypeName]
: PublicCompositeTypeNameOrOptions extends keyof PublicSchema["CompositeTypes"]
? PublicSchema["CompositeTypes"][PublicCompositeTypeNameOrOptions]
: never

View File

@ -7,7 +7,7 @@
},
"devDependencies": {
"@kksh/supabase": "workspace:*",
"@supabase/supabase-js": "^2.47.16",
"@supabase/supabase-js": "^2.48.0",
"@kksh/ci": "workspace:*",
"@types/bun": "latest"
},

View File

@ -73,6 +73,7 @@
"@std/semver": "npm:@jsr/std__semver@^1.0.3",
"dompurify": "^3.2.3",
"gsap": "^3.12.7",
"pretty-bytes": "^6.1.1",
"shiki-magic-move": "^0.5.2",
"svelte-markdown": "^0.4.1",
"valibot": "1.0.0-beta.12"

View File

@ -1,5 +1,6 @@
<script lang="ts">
import { cn } from "@kksh/ui/utils"
import { browser } from "$app/environment"
import type { Snippet } from "svelte"
import type { HTMLAttributes } from "svelte/elements"
import { open } from "tauri-plugin-shellx-api"
@ -14,17 +15,32 @@
children: Snippet
} = $props()
// @ts-expect-error window.__TAURI_INTERNALS__ is not defined in the browser
const isInTauri = browser ? !!window.__TAURI_INTERNALS__ : false
function handleClick() {
open(href)
}
</script>
<button
class={cn(
"text-left font-medium text-blue-600 hover:cursor-pointer hover:underline dark:text-blue-500",
className
)}
onclick={handleClick}
>
{@render children?.()}
</button>
{#if isInTauri}
<button
class={cn(
"text-left font-medium text-blue-600 hover:cursor-pointer hover:underline dark:text-blue-500",
className
)}
onclick={handleClick}
>
{@render children?.()}
</button>
{:else}
<a
{href}
target="_blank"
class={cn(
"text-left font-medium text-blue-600 hover:cursor-pointer hover:underline dark:text-blue-500",
className
)}
>
{@render children?.()}
</a>
{/if}

View File

@ -26,7 +26,7 @@
<div class="flex w-60 items-center space-x-4">
<BadgeCheckIcon class="h-8 w-8 text-green-500" />
<div>
<span class="text-sm text-gray-200">Built and signed on</span>
<span class="text-sm text-gray-800 dark:text-gray-200">Built and signed on</span>
<h1 class="text-xl font-bold">GitHub Actions</h1>
<a href={githubActionInvocationId} class="text-sm underline" target="_blank">
View build summary

View File

@ -8,11 +8,14 @@
import { Constants, IconMultiplexer } from "@kksh/ui"
import { cn } from "@kksh/ui/utils"
import { CircleCheckBigIcon, MoveRightIcon, Trash2Icon } from "lucide-svelte"
import prettyBytes from "pretty-bytes"
import * as v from "valibot"
import DialogImageCarousel from "../common/DialogImageCarousel.svelte"
import PlatformsIcons from "../common/PlatformsIcons.svelte"
import TauriLink from "../common/TauriLink.svelte"
import GitHubProvenanceCard from "./GitHubProvenanceCard.svelte"
import PermissionInspector from "./PermissionInspector.svelte"
import Markdown from "./templates/Markdown.svelte"
let {
extPublish,
@ -25,6 +28,7 @@
onInstallSelected,
onUpgradeSelected,
onUninstallSelected,
packageJson,
showBtn,
loading,
imageDialogOpen = $bindable(false)
@ -32,6 +36,7 @@
extPublish: Tables<"ext_publish">
ext: Tables<"extensions">
installedExt?: ExtPackageJson
packageJson: ExtPackageJson | null
manifest: KunkunExtManifest
demoImages: string[]
class?: string
@ -128,6 +133,19 @@
{/if}
</Button>
{/snippet}
{#snippet person(author: ExtPackageJson["author"])}
{#if author}
{#if typeof author === "string"}
<span>{author}</span>
{:else if author.url}
<TauriLink href={author.url}>{author.name}</TauriLink>
{:else}
<span>{author.name}</span>
{/if}
{/if}
{/snippet}
<div data-tauri-drag-region class="h-14"></div>
<ScrollArea class={cn("w-full pb-12", className)}>
<div class="flex flex-col items-center justify-between gap-4 sm:flex-row">
@ -149,6 +167,9 @@
<pre class="text-muted-foreground text-xs">{extPublish.identifier}</pre>
<pre class="text-muted-foreground text-xs">Version: {extPublish.version}</pre>
<pre class="text-muted-foreground text-xs">Downloads: {ext.downloads}</pre>
<pre class="text-muted-foreground text-xs">
Size: {prettyBytes(extPublish.tarball_size)}
</pre>
</div>
</div>
<div class="flex items-center space-x-2">
@ -221,27 +242,52 @@
<div class="text-sm">{manifest?.shortDescription}</div>
<div class="text-sm">{manifest?.longDescription}</div>
<Separator class="my-3" />
<h2 class="text-lg font-bold">Commands</h2>
<ul>
{#if manifest}
{#each [...(manifest.customUiCmds ?? []), ...(manifest.templateUiCmds ?? [])] as cmd}
<li>
<div class="flex items-center space-x-3">
{#if manifest}
<IconMultiplexer icon={manifest.icon} class="inline h-6 w-6" />
{/if}
<div>
<span class="text-dm">{cmd.name}</span>
<h2 class="text-xs">{cmd.description}</h2>
</div>
<PlatformsIcons platforms={cmd.platforms} />
</div>
<Separator class="my-3" />
</li>
{/each}
{/if}
</ul>
<div class="grid grid-cols-3 gap-4">
<div class="col-span-2">
<h2 class="text-lg font-bold">Commands</h2>
<ul>
{#if manifest}
{#each [...(manifest.customUiCmds ?? []), ...(manifest.templateUiCmds ?? [])] as cmd}
<li>
<div class="flex items-center space-x-3">
{#if manifest}
<IconMultiplexer icon={manifest.icon} class="inline h-6 w-6" />
{/if}
<div>
<span class="text-dm">{cmd.name}</span>
<h2 class="text-xs">{cmd.description}</h2>
</div>
<PlatformsIcons platforms={cmd.platforms} />
</div>
<Separator class="my-3" />
</li>
{/each}
{/if}
</ul>
</div>
<div>
<h2 class="text-lg font-bold">Author</h2>
{#if packageJson?.author}
<ul class="list-disc pl-5">
<li>{@render person(packageJson?.author)}</li>
</ul>
{:else}
<span>N/A</span>
{/if}
<br />
<h2 class="text-lg font-bold">Contributors</h2>
<ul class="list-disc pl-5">
{#each packageJson?.contributors ?? [] as contributor}
<li>{@render person(contributor)}</li>
{/each}
</ul>
</div>
</div>
<Separator class="my-3" />
<h2 class="text-lg font-bold">README</h2>
{#if extPublish?.readme}
<Markdown markdown={extPublish.readme} class="bg-secondary p-4 max-w-full rounded-md" />
{/if}
</ScrollArea>
<footer class="fixed bottom-0 mb-1 flex h-10 w-full space-x-2 px-2" use:autoAnimate>

View File

@ -23,6 +23,7 @@
"placeholder:text-muted-foreground flex h-10 w-full select-none rounded-md bg-transparent py-3 text-sm outline-none disabled:cursor-not-allowed disabled:opacity-50",
className
)}
autofocus
bind:ref
bind:value
{...restProps}

186
pnpm-lock.yaml generated
View File

@ -15,8 +15,8 @@ importers:
specifier: ^4.2.0
version: 4.2.0(svelte@5.16.6)
'@supabase/supabase-js':
specifier: ^2.47.11
version: 2.47.11
specifier: ^2.48.0
version: 2.48.0
'@tauri-apps/api':
specifier: ^2.2.0
version: 2.2.0
@ -150,7 +150,7 @@ importers:
devDependencies:
'@types/bun':
specifier: latest
version: 1.1.17
version: 1.2.0
'@types/debug':
specifier: ^4.1.12
version: 4.1.12
@ -190,7 +190,7 @@ importers:
devDependencies:
'@types/bun':
specifier: latest
version: 1.1.17
version: 1.2.0
'@types/fs-extra':
specifier: ^11.0.4
version: 11.0.4
@ -227,6 +227,9 @@ importers:
'@std/semver':
specifier: npm:@jsr/std__semver@^1.0.3
version: '@jsr/std__semver@1.0.3'
'@supabase/supabase-js':
specifier: ^2.48.0
version: 2.48.0
'@tanstack/table-core':
specifier: ^8.20.5
version: 8.20.5
@ -308,7 +311,7 @@ importers:
version: 2.1.0
'@types/bun':
specifier: latest
version: 1.1.17
version: 1.2.0
'@types/semver':
specifier: ^7.5.8
version: 7.5.8
@ -459,7 +462,7 @@ importers:
devDependencies:
'@types/bun':
specifier: latest
version: 1.1.17
version: 1.2.0
'@types/lodash':
specifier: ^4.17.14
version: 4.17.14
@ -499,7 +502,7 @@ importers:
version: link:../typescript-config
'@types/bun':
specifier: latest
version: 1.1.17
version: 1.2.0
packages/config-eslint:
dependencies:
@ -542,7 +545,7 @@ importers:
devDependencies:
'@types/bun':
specifier: latest
version: 1.1.17
version: 1.2.0
packages/extensions/demo-worker-template-ext:
dependencies:
@ -567,7 +570,7 @@ importers:
version: 11.1.6(rollup@4.30.1)(tslib@2.8.1)(typescript@5.6.3)
'@types/bun':
specifier: latest
version: 1.1.17
version: 1.2.0
rollup-plugin-visualizer:
specifier: ^5.12.0
version: 5.12.0(rollup@4.30.1)
@ -674,7 +677,7 @@ importers:
devDependencies:
'@types/bun':
specifier: latest
version: 1.1.17
version: 1.2.0
packages/grpc:
dependencies:
@ -693,7 +696,7 @@ importers:
version: 0.7.13
'@types/bun':
specifier: latest
version: 1.1.17
version: 1.2.0
'@types/google-protobuf':
specifier: ^3.15.12
version: 3.15.12
@ -708,7 +711,7 @@ importers:
dependencies:
'@huakunshen/jsr-client':
specifier: ^0.1.5
version: 0.1.5(axios@1.7.9)(react@18.3.1)(typescript@5.7.2)
version: 0.1.5(axios@1.7.9)(react@18.3.1)(typescript@5.7.3)
'@kksh/api':
specifier: workspace:*
version: link:../api
@ -717,14 +720,14 @@ importers:
version: 21.1.0
typescript:
specifier: ^5.0.0
version: 5.7.2
version: 5.7.3
devDependencies:
'@types/bun':
specifier: latest
version: 1.1.17
version: 1.2.0
verify-package-export:
specifier: ^0.0.2
version: 0.0.2(typescript@5.7.2)
version: 0.0.2(typescript@5.7.3)
packages/schema:
dependencies:
@ -745,11 +748,11 @@ importers:
specifier: workspace:*
version: link:../supabase
'@supabase/supabase-js':
specifier: ^2.47.16
version: 2.47.16
specifier: ^2.48.0
version: 2.48.0
'@types/bun':
specifier: latest
version: 1.1.17
version: 1.2.0
'@valibot/to-json-schema':
specifier: 1.0.0-beta.4
version: 1.0.0-beta.4(valibot@1.0.0-beta.10(typescript@5.6.3))
@ -761,17 +764,17 @@ importers:
version: link:../api
'@supabase/ssr':
specifier: ^0.5.2
version: 0.5.2(@supabase/supabase-js@2.47.12)
version: 0.5.2(@supabase/supabase-js@2.48.0)
'@supabase/supabase-js':
specifier: ^2.47.12
version: 2.47.12
specifier: ^2.48.0
version: 2.48.0
typescript:
specifier: ^5.0.0
version: 5.5.4
devDependencies:
'@types/bun':
specifier: latest
version: 1.1.17
version: 1.2.0
packages/tauri-plugins/jarvis:
dependencies:
@ -786,11 +789,11 @@ importers:
specifier: workspace:*
version: link:../../supabase
'@supabase/supabase-js':
specifier: ^2.47.16
version: 2.47.16
specifier: ^2.48.0
version: 2.48.0
'@types/bun':
specifier: latest
version: 1.1.17
version: 1.2.0
packages/templates/template-ext-headless:
dependencies:
@ -809,7 +812,7 @@ importers:
devDependencies:
'@types/bun':
specifier: latest
version: 1.1.17
version: 1.2.0
packages/templates/template-ext-next:
dependencies:
@ -1155,7 +1158,7 @@ importers:
devDependencies:
'@types/bun':
specifier: latest
version: 1.1.17
version: 1.2.0
packages/types:
dependencies:
@ -1165,7 +1168,7 @@ importers:
devDependencies:
'@types/bun':
specifier: latest
version: 1.1.17
version: 1.2.0
packages/typescript-config: {}
@ -1192,6 +1195,9 @@ importers:
gsap:
specifier: ^3.12.7
version: 3.12.7
pretty-bytes:
specifier: ^6.1.1
version: 6.1.1
shiki-magic-move:
specifier: ^0.5.2
version: 0.5.2(react@18.3.1)(shiki@1.27.2)(svelte@5.16.6)(vue@3.5.13(typescript@5.7.3))
@ -1219,7 +1225,7 @@ importers:
version: 0.1.14(lucide-svelte@0.471.0(svelte@5.16.6))(svelte-sonner@0.3.28(svelte@5.16.6))(svelte@5.16.6)(sveltekit-superforms@2.22.1(@sveltejs/kit@2.15.2(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.16.6)(vite@6.0.7(@types/node@22.10.5)(jiti@2.4.0)(terser@5.36.0)(yaml@2.6.1)))(svelte@5.16.6)(vite@6.0.7(@types/node@22.10.5)(jiti@2.4.0)(terser@5.36.0)(yaml@2.6.1)))(@types/json-schema@7.0.15)(svelte@5.16.6)(typescript@5.7.3))(typescript@5.7.3)
'@types/bun':
specifier: latest
version: 1.1.17
version: 1.2.0
'@typescript-eslint/eslint-plugin':
specifier: ^8.20.0
version: 8.20.0(@typescript-eslint/parser@8.20.0(eslint@9.17.0(jiti@2.4.0))(typescript@5.7.3))(eslint@9.17.0(jiti@2.4.0))(typescript@5.7.3)
@ -1298,7 +1304,7 @@ importers:
devDependencies:
'@types/bun':
specifier: latest
version: 1.1.17
version: 1.2.0
vendors/tauri-plugin-keyring:
dependencies:
@ -4639,14 +4645,8 @@ packages:
resolution: {integrity: sha512-1ibVeYUacxWYi9i0cf5efil6adJ9WRyZBLivgjs+AUpewx1F3xPi7gLgaASI2SmIQxPoCEjAsLAzKPgMJVgOUQ==}
engines: {node: 4.x || >=6.0.0}
'@supabase/postgrest-js@1.17.10':
resolution: {integrity: sha512-GlcwOjEmPcXfaEU0wHg1MgHU+peR+zZFyaEWjr7a7EOCB1gCtw3nW7ABfnPPH411coXHV90eb/isDgT9HRshLg==}
'@supabase/postgrest-js@1.17.11':
resolution: {integrity: sha512-AOqqgQEhLVqzOMmA8Q0bxQFMfbozbjjQ1Tt4kprkstIKdRl4yZRaMdoVxFkCpU8ivmAe2xNfAVkNK+l16a9P0A==}
'@supabase/postgrest-js@1.17.9':
resolution: {integrity: sha512-HyMOyy3t6K0/oFNDlHryOhnK4sfMNip8J0LrqJ/65NrBlHD3xOcDf4OV/5YCHI4g195ByuQ0wfmyFqIgMl3dxg==}
'@supabase/postgrest-js@1.18.0':
resolution: {integrity: sha512-DqUEVF5ZFytrYLAuywnUR0srhZbzSoLZePMfGFamYMNdMttBLwAWXJNJ5kBDHn2gK2n87NwLsIshUbdyxPtpsw==}
'@supabase/realtime-js@2.11.2':
resolution: {integrity: sha512-u/XeuL2Y0QEhXSoIPZZwR6wMXgB+RQbJzG9VErA3VghVt7uRfSVsjeqd7m5GhX3JR6dM/WRmLbVR8URpDWG4+w==}
@ -4659,14 +4659,8 @@ packages:
'@supabase/storage-js@2.7.1':
resolution: {integrity: sha512-asYHcyDR1fKqrMpytAS1zjyEfvxuOIp1CIXX7ji4lHHcJKqyk+sLl/Vxgm4sN6u8zvuUtae9e4kDxQP2qrwWBA==}
'@supabase/supabase-js@2.47.11':
resolution: {integrity: sha512-1gD7rxZFY0wl3abzJ75H62bi4wtkeOxHM0niu1/fIfWsVEDDLOfzfhgD0uTOwFx51Y+/s7+b9EHr3dhWwTYNDQ==}
'@supabase/supabase-js@2.47.12':
resolution: {integrity: sha512-My8X5K1KwOBFjQhAqIf7QJaQhP5EILjJwAgjzRNjstlMLJmdVBctwRYD6IGDWKzw+i6/aNGuRd5c9/pI/Y6UFw==}
'@supabase/supabase-js@2.47.16':
resolution: {integrity: sha512-FnoV0miLnYUL8ZTS94tSIyn+ogCwh5DB5f1fj1n4wHGNAqJSKFb8OQzLVlRFAH7cB9TKQ5eon3/n2lXUWY7GfA==}
'@supabase/supabase-js@2.48.0':
resolution: {integrity: sha512-8ql5ra3NOIHLBYoFZpxYHRx05J/FmJAQW9EYax0lU4DsU1/5PC4yb2hxMcCIf0oimLcBgsogIaAqba+/9jaUVg==}
'@sveltejs/adapter-auto@3.3.1':
resolution: {integrity: sha512-5Sc7WAxYdL6q9j/+D0jJKjGREGlfIevDyHSQ2eNETHcB1TKlQWHcAo8AS8H1QdjNvSXpvOwNjykDUHPEAyGgdQ==}
@ -5020,8 +5014,8 @@ packages:
'@types/btoa-lite@1.0.2':
resolution: {integrity: sha512-ZYbcE2x7yrvNFJiU7xJGrpF/ihpkM7zKgw8bha3LNJSesvTtUNxbpzaT7WXBIryf6jovisrxTBvymxMeLLj1Mg==}
'@types/bun@1.1.17':
resolution: {integrity: sha512-zZt0Kao/8hAwNOXh4bmt8nKbMEd4QD8n7PeTGF+NZTVY5ouXhU/TX7jUj4He1p7mgY+WdplnU1B6MB1j17vdzg==}
'@types/bun@1.2.0':
resolution: {integrity: sha512-5N1JqdahfpBlAv4wy6svEYcd/YfO2GNrbL95JOmFx8nkE6dbK4R0oSE5SpBA4vBRqgrOUAXF8Dpiz+gi7r80SA==}
'@types/cookie@0.6.0':
resolution: {integrity: sha512-4Kh9a6B2bQciAhf7FSuMRRkUWecJgJu9nPnx3yzpsfXX/c50REIqpHY4C82bXP90qrLtXtkDxTZosYO3UpOwlA==}
@ -5203,9 +5197,6 @@ packages:
'@types/node@12.20.55':
resolution: {integrity: sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==}
'@types/node@20.12.14':
resolution: {integrity: sha512-scnD59RpYD91xngrQQLGkE+6UrHUPzeKZWhhjBSa3HSkwjbQc38+q3RoIVEwxQGRw3M+j5hpNAM+lgV3cVormg==}
'@types/node@20.17.6':
resolution: {integrity: sha512-VEI7OdvK2wP7XHnsuXbAJnEpEkF6NjSN45QJlL4VGqZSXsnicpesdTWsg9RISeSdYd3yeRj/y3k5KGjUXYnFwQ==}
@ -6020,8 +6011,8 @@ packages:
buffer@6.0.3:
resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==}
bun-types@1.1.44:
resolution: {integrity: sha512-jtcekoZeSINgEcHSISzhR13w/cyE+Fankw2Cpl4c0fN3lRmKVAX0i9ay4FyK4lOxUK1HG4HkuIlrPvXKz4Y7sw==}
bun-types@1.2.0:
resolution: {integrity: sha512-KEaJxyZfbV/c4eyG0vyehDpYmBGreNiQbZIqvVHJwZ4BmeuWlNZ7EAzMN2Zcd7ailmS/tGVW0BgYbGf+lGEpWw==}
bundle-name@4.1.0:
resolution: {integrity: sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q==}
@ -10907,9 +10898,6 @@ packages:
unctx@2.3.1:
resolution: {integrity: sha512-PhKke8ZYauiqh3FEMVNm7ljvzQiph0Mt3GBRve03IJm7ukfaON2OBK795tLwhbyfzknuRRkW0+Ze+CQUmzOZ+A==}
undici-types@5.26.5:
resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==}
undici-types@6.19.8:
resolution: {integrity: sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==}
@ -12987,6 +12975,22 @@ snapshots:
- supports-color
- xstate
'@huakunshen/jsr-client@0.1.5(axios@1.7.9)(react@18.3.1)(typescript@5.7.3)':
dependencies:
'@hey-api/client-fetch': 0.6.0
'@zodios/core': 10.9.6(axios@1.7.9)(zod@3.24.1)
openapi-fetch: 0.13.4
openapi-typescript-helpers: 0.0.15
openapi-zod-client: 1.18.2(react@18.3.1)
typescript: 5.7.3
zod: 3.24.1
transitivePeerDependencies:
- axios
- debug
- react
- supports-color
- xstate
'@humanfs/core@0.19.1': {}
'@humanfs/node@0.16.6':
@ -15881,15 +15885,7 @@ snapshots:
dependencies:
whatwg-url: 5.0.0
'@supabase/postgrest-js@1.17.10':
dependencies:
'@supabase/node-fetch': 2.6.15
'@supabase/postgrest-js@1.17.11':
dependencies:
'@supabase/node-fetch': 2.6.15
'@supabase/postgrest-js@1.17.9':
'@supabase/postgrest-js@1.18.0':
dependencies:
'@supabase/node-fetch': 2.6.15
@ -15903,9 +15899,9 @@ snapshots:
- bufferutil
- utf-8-validate
'@supabase/ssr@0.5.2(@supabase/supabase-js@2.47.12)':
'@supabase/ssr@0.5.2(@supabase/supabase-js@2.48.0)':
dependencies:
'@supabase/supabase-js': 2.47.12
'@supabase/supabase-js': 2.48.0
'@types/cookie': 0.6.0
cookie: 0.7.2
@ -15913,36 +15909,12 @@ snapshots:
dependencies:
'@supabase/node-fetch': 2.6.15
'@supabase/supabase-js@2.47.11':
'@supabase/supabase-js@2.48.0':
dependencies:
'@supabase/auth-js': 2.67.3
'@supabase/functions-js': 2.4.4
'@supabase/node-fetch': 2.6.15
'@supabase/postgrest-js': 1.17.9
'@supabase/realtime-js': 2.11.2
'@supabase/storage-js': 2.7.1
transitivePeerDependencies:
- bufferutil
- utf-8-validate
'@supabase/supabase-js@2.47.12':
dependencies:
'@supabase/auth-js': 2.67.3
'@supabase/functions-js': 2.4.4
'@supabase/node-fetch': 2.6.15
'@supabase/postgrest-js': 1.17.10
'@supabase/realtime-js': 2.11.2
'@supabase/storage-js': 2.7.1
transitivePeerDependencies:
- bufferutil
- utf-8-validate
'@supabase/supabase-js@2.47.16':
dependencies:
'@supabase/auth-js': 2.67.3
'@supabase/functions-js': 2.4.4
'@supabase/node-fetch': 2.6.15
'@supabase/postgrest-js': 1.17.11
'@supabase/postgrest-js': 1.18.0
'@supabase/realtime-js': 2.11.2
'@supabase/storage-js': 2.7.1
transitivePeerDependencies:
@ -16329,9 +16301,9 @@ snapshots:
'@types/btoa-lite@1.0.2': {}
'@types/bun@1.1.17':
'@types/bun@1.2.0':
dependencies:
bun-types: 1.1.44
bun-types: 1.2.0
'@types/cookie@0.6.0': {}
@ -16542,10 +16514,6 @@ snapshots:
'@types/node@12.20.55': {}
'@types/node@20.12.14':
dependencies:
undici-types: 5.26.5
'@types/node@20.17.6':
dependencies:
undici-types: 6.19.8
@ -17792,9 +17760,9 @@ snapshots:
base64-js: 1.5.1
ieee754: 1.2.1
bun-types@1.1.44:
bun-types@1.2.0:
dependencies:
'@types/node': 20.12.14
'@types/node': 22.10.5
'@types/ws': 8.5.13
bundle-name@4.1.0:
@ -23382,8 +23350,6 @@ snapshots:
magic-string: 0.30.17
unplugin: 1.16.0
undici-types@5.26.5: {}
undici-types@6.19.8: {}
undici-types@6.20.0: {}
@ -23609,6 +23575,10 @@ snapshots:
optionalDependencies:
typescript: 5.7.2
valibot@1.0.0-beta.11(typescript@5.7.3):
optionalDependencies:
typescript: 5.7.3
valibot@1.0.0-beta.12(typescript@5.6.3):
optionalDependencies:
typescript: 5.6.3
@ -23673,6 +23643,16 @@ snapshots:
- supports-color
- typescript
verify-package-export@0.0.2(typescript@5.7.3):
dependencies:
'@oclif/core': 4.2.2
'@oclif/plugin-help': 6.2.21
'@oclif/plugin-plugins': 5.4.25
valibot: 1.0.0-beta.11(typescript@5.7.3)
transitivePeerDependencies:
- supports-color
- typescript
verror@1.10.0:
dependencies:
assert-plus: 1.0.0