diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 07576a1..a244d5a 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -56,7 +56,9 @@ jobs: run: pnpm build - name: JS Test if: matrix.os == 'ubuntu-24.04' - run: pnpm test + run: | + pnpm test + pnpm lint - name: Cargo Build and Test if: matrix.os == 'ubuntu-24.04' run: | diff --git a/README.md b/README.md index 55bb260..4d3d108 100644 --- a/README.md +++ b/README.md @@ -8,10 +8,9 @@ - https://docs.kunkun.sh/guides/demo/ - Download extension from https://kunkun.sh/download -[![wakatime](https://wakatime.com/badge/user/94be0fbf-cb9d-411d-8526-d0c4a4e82e1a/project/455bfd3f-4faf-4c2a-afe9-556d9ee1a0f7.svg)](https://wakatime.com/badge/user/94be0fbf-cb9d-411d-8526-d0c4a4e82e1a/project/455bfd3f-4faf-4c2a-afe9-556d9ee1a0f7) ![GitHub last commit](https://img.shields.io/github/last-commit/kunkunsh/kunkun) [![YouTube badge][]][YouTube link] -[![Discord Invite](https://dcbadge.limes.pink/api/server/7dzw3TYeTU)](https://discord.gg/7dzw3TYeTU) +[Discord Invite](https://discord.gg/7dzw3TYeTU) - Website: https://kunkun.sh/ - Documentation: https://docs.kunkun.sh/ diff --git a/apps/desktop/.prettierignore b/apps/desktop/.prettierignore new file mode 100644 index 0000000..4f1c01d --- /dev/null +++ b/apps/desktop/.prettierignore @@ -0,0 +1 @@ +src-tauri \ No newline at end of file diff --git a/apps/desktop/app.d.ts b/apps/desktop/app.d.ts index 9959563..c843c98 100644 --- a/apps/desktop/app.d.ts +++ b/apps/desktop/app.d.ts @@ -1,7 +1,7 @@ import type { AttributifyAttributes } from "@unocss/preset-attributify" declare module "svelte/elements" { - // eslint-disable-next-line @typescript-eslint/no-empty-object-type, @typescript-eslint/no-unused-vars + // eslint-disable-next-line @typescript-eslint/no-empty-object-type interface HTMLAttributes extends AttributifyAttributes {} } diff --git a/apps/desktop/components.json b/apps/desktop/components.json index a1939f9..260ea62 100644 --- a/apps/desktop/components.json +++ b/apps/desktop/components.json @@ -14,4 +14,4 @@ }, "typescript": true, "registry": "https://next.shadcn-svelte.com/registry" -} \ No newline at end of file +} diff --git a/apps/desktop/eslint.config.js b/apps/desktop/eslint.config.js new file mode 100644 index 0000000..4b02638 --- /dev/null +++ b/apps/desktop/eslint.config.js @@ -0,0 +1,42 @@ +import js from "@eslint/js" +import prettier from "eslint-config-prettier" +import svelte from "eslint-plugin-svelte" +import globals from "globals" +import ts from "typescript-eslint" + +export default ts.config( + js.configs.recommended, + ...ts.configs.recommended, + ...svelte.configs["flat/recommended"], + prettier, + ...svelte.configs["flat/prettier"], + { + languageOptions: { + globals: { + ...globals.browser, + ...globals.node + } + } + }, + { + files: ["**/*.svelte"], + + languageOptions: { + parserOptions: { + parser: ts.parser + } + } + }, + { + ignores: ["build/", ".svelte-kit/", "dist/"] + }, + { + rules: { + "no-unused-vars": "off", + "@typescript-eslint/no-unused-vars": "off", + // The following 2 rules are disabled because they cause errors that I am unable to solve + "@typescript-eslint/no-unused-expressions": "off", + "svelte/no-inner-declarations": "off" + } + } +) diff --git a/apps/desktop/package.json b/apps/desktop/package.json index 963cbb3..921f01c 100644 --- a/apps/desktop/package.json +++ b/apps/desktop/package.json @@ -8,6 +8,7 @@ "dev": "vite dev", "build": "vite build", "preview": "vite preview", + "lint": "prettier --check . && eslint .", "check": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json", "check:watch": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json --watch", "tauri": "tauri" @@ -22,7 +23,6 @@ "@std/semver": "npm:@jsr/std__semver@^1.0.3", "@tanstack/table-core": "^8.20.5", "@tauri-apps/api": "^2.1.1", - "tauri-plugin-user-input-api": "workspace:*", "@tauri-apps/plugin-shell": "^2.2.0", "@tauri-apps/plugin-stronghold": "^2.2.0", "dompurify": "^3.2.3", @@ -34,9 +34,11 @@ "svelte-sonner": "^0.3.28", "sveltekit-superforms": "^2.22.1", "tauri-plugin-clipboard-api": "^2.1.11", + "tauri-plugin-user-input-api": "workspace:*", "uuid": "^11.0.3" }, "devDependencies": { + "@eslint/js": "^9.18.0", "@kksh/types": "workspace:*", "@sveltejs/adapter-static": "^3.0.6", "@sveltejs/kit": "^2.12.1", @@ -48,10 +50,16 @@ "@tauri-apps/cli": "^2.1.0", "@types/bun": "latest", "@types/semver": "^7.5.8", + "@typescript-eslint/eslint-plugin": "^8.20.0", + "@typescript-eslint/parser": "^8.20.0", "autoprefixer": "^10.4.20", "bits-ui": "1.0.0-next.72", "clsx": "^2.1.1", + "eslint-config-prettier": "^9.1.0", + "eslint-plugin-svelte": "^2.46.1", + "globals": "^15.14.0", "lucide-svelte": "^0.469.0", + "prettier": "^3.4.2", "svelte-radix": "^2.0.1", "tailwind-merge": "^2.5.5", "tailwind-variants": "^0.3.0", @@ -59,6 +67,7 @@ "tailwindcss-animate": "^1.0.7", "tslib": "^2.8.1", "typescript": "^5.6.3", + "typescript-eslint": "^8.20.0", "vite": "^6.0.3" } } diff --git a/apps/desktop/postcss.config.js b/apps/desktop/postcss.config.js index ca47e48..b0fd430 100644 --- a/apps/desktop/postcss.config.js +++ b/apps/desktop/postcss.config.js @@ -1,9 +1,9 @@ export default { - plugins: { + plugins: { tailwindcss: { config: "tailwind.config.ts" // config: "../../packages/ui/tailwind.config.ts" }, autoprefixer: {} - } -}; + } +} diff --git a/apps/desktop/src/app.html b/apps/desktop/src/app.html index aa0e81a..971a944 100644 --- a/apps/desktop/src/app.html +++ b/apps/desktop/src/app.html @@ -1,13 +1,13 @@ - - - - - Kunkun Desktop App - %sveltekit.head% - - -
%sveltekit.body%
- + + + + + Kunkun Desktop App + %sveltekit.head% + + +
%sveltekit.body%
+ diff --git a/apps/desktop/src/lib/cmds/ext.ts b/apps/desktop/src/lib/cmds/ext.ts index 80caa59..f391074 100644 --- a/apps/desktop/src/lib/cmds/ext.ts +++ b/apps/desktop/src/lib/cmds/ext.ts @@ -61,7 +61,7 @@ export async function onHeadlessCmdSelect( if (!extInfoInDB) { return } - const serverAPI: Record = constructJarvisServerAPIWithPermissions( + const serverAPI: IKunkunFullServerAPI = constructJarvisServerAPIWithPermissions( loadedExt.kunkun.permissions, loadedExt.extPath ) diff --git a/apps/desktop/src/lib/components/common/DragNDrop.svelte b/apps/desktop/src/lib/components/common/DragNDrop.svelte index 0cea233..0d2344f 100644 --- a/apps/desktop/src/lib/components/common/DragNDrop.svelte +++ b/apps/desktop/src/lib/components/common/DragNDrop.svelte @@ -4,6 +4,7 @@ import { onDestroy, onMount, type Snippet } from "svelte" let unlisteners: UnlistenFn[] = [] + type Payload = { paths: string[]; position: { x: number; y: number } } const { children, onEnter, @@ -12,10 +13,10 @@ onOver }: { children: Snippet - onEnter?: (event: any) => void + onEnter?: EventCallback onDrop?: EventCallback<{ paths: string[] }> - onCancelled?: (event: any) => void - onOver?: (event: any) => void + onCancelled?: EventCallback + onOver?: EventCallback } = $props() const appWin = getCurrentWebviewWindow() diff --git a/apps/desktop/src/lib/components/standalone/settings/AddDevExtForm.svelte b/apps/desktop/src/lib/components/standalone/settings/AddDevExtForm.svelte index 7110fc8..a7c3cb6 100644 --- a/apps/desktop/src/lib/components/standalone/settings/AddDevExtForm.svelte +++ b/apps/desktop/src/lib/components/standalone/settings/AddDevExtForm.svelte @@ -120,9 +120,17 @@ { + console.log(e) + handleDragNDropInstall(e.payload.paths) }} - onEnter={() => (dragging = true)} + onEnter={(evt) => { + console.log(evt) + dragging = true + }} + onOver={(evt) => { + console.log(evt) + }} onCancelled={() => (dragging = false)} > (set1: Set, set2: Set) { if (set1.size !== set2.size) return false - for (let item of set1) { + for (const item of set1) { if (!set2.has(item)) return false } return true diff --git a/apps/desktop/src/lib/utils/key.ts b/apps/desktop/src/lib/utils/key.ts index 7ee04d3..a285935 100644 --- a/apps/desktop/src/lib/utils/key.ts +++ b/apps/desktop/src/lib/utils/key.ts @@ -107,7 +107,7 @@ export function isShortcut(letters: string[]): boolean { let hasModifier = false let hasNonModifier = false - for (let letter of letters) { + for (const letter of letters) { if (modifierKeySet.has(letter)) { hasModifier = true } else { diff --git a/apps/desktop/src/routes/app/+layout.svelte b/apps/desktop/src/routes/app/+layout.svelte index f4c60da..4914c9a 100644 --- a/apps/desktop/src/routes/app/+layout.svelte +++ b/apps/desktop/src/routes/app/+layout.svelte @@ -92,7 +92,6 @@ winExtMap.unregisterProcess(event.payload.pid) }) ) - } else { } getCurrentWebviewWindow().show() }) diff --git a/apps/desktop/src/routes/app/auth/+page.svelte b/apps/desktop/src/routes/app/auth/+page.svelte index c5ca20b..5c461b6 100644 --- a/apps/desktop/src/routes/app/auth/+page.svelte +++ b/apps/desktop/src/routes/app/auth/+page.svelte @@ -26,7 +26,7 @@ if (error) { toast.error("Failed to sign in with OAuth", { description: error.message }) } else { - data.url && open(data.url) + if (data.url) open(data.url) } } diff --git a/apps/desktop/src/routes/app/extension/clipboard/+page.svelte b/apps/desktop/src/routes/app/extension/clipboard/+page.svelte index d152ca2..d3781b5 100644 --- a/apps/desktop/src/routes/app/extension/clipboard/+page.svelte +++ b/apps/desktop/src/routes/app/extension/clipboard/+page.svelte @@ -75,7 +75,7 @@ $effect(() => { // search sqlite when searchTerm changes - searchTerm + void searchTerm ;(async () => { // console.log("searchTerm", searchTerm) if (searchTerm === "") { diff --git a/apps/desktop/src/routes/app/extension/clipboard/content-preview.svelte b/apps/desktop/src/routes/app/extension/clipboard/content-preview.svelte index ca8ba60..4b07bad 100644 --- a/apps/desktop/src/routes/app/extension/clipboard/content-preview.svelte +++ b/apps/desktop/src/routes/app/extension/clipboard/content-preview.svelte @@ -67,6 +67,7 @@
{txtData}
{:else if highlighted.dataType === "Html"}
+ {@html DOMPurify.sanitize(txtData)}
{:else} diff --git a/apps/desktop/src/routes/app/extension/pin-screenshot/+page.svelte b/apps/desktop/src/routes/app/extension/pin-screenshot/+page.svelte index 215f378..3b68c0e 100644 --- a/apps/desktop/src/routes/app/extension/pin-screenshot/+page.svelte +++ b/apps/desktop/src/routes/app/extension/pin-screenshot/+page.svelte @@ -47,9 +47,10 @@ scale += (e.deltaY < 0 ? 1 : -1) * 0.05 } - function onGestureChange(e: any) { + function onGestureChange(e: Event) { e.preventDefault() - scale = e.scale + // eslint-disable-next-line @typescript-eslint/no-explicit-any + scale = (e as any).scale } $effect(() => { diff --git a/apps/desktop/src/routes/app/extension/store/[identifier]/+page.svelte b/apps/desktop/src/routes/app/extension/store/[identifier]/+page.svelte index 7320a8e..20c2bfe 100644 --- a/apps/desktop/src/routes/app/extension/store/[identifier]/+page.svelte +++ b/apps/desktop/src/routes/app/extension/store/[identifier]/+page.svelte @@ -60,7 +60,7 @@ let imageDialogOpen = $state(false) let delayedImageDialogOpen = $state(false) $effect(() => { - imageDialogOpen // do not remove this line, $effect only subscribe to synchronous variable inside it + void imageDialogOpen // do not remove this line, $effect only subscribe to synchronous variable inside it setTimeout(() => { delayedImageDialogOpen = imageDialogOpen }, 500) diff --git a/apps/desktop/src/routes/app/extension/ui-iframe/+page.svelte b/apps/desktop/src/routes/app/extension/ui-iframe/+page.svelte index f3e2278..f2936a3 100644 --- a/apps/desktop/src/routes/app/extension/ui-iframe/+page.svelte +++ b/apps/desktop/src/routes/app/extension/ui-iframe/+page.svelte @@ -13,9 +13,10 @@ type IApp, type IUiIframe } from "@kksh/api/ui" - import { toast, type IUiIframeServer2 } from "@kksh/api/ui/iframe" + import { toast, type IUiIframeServer1, type IUiIframeServer2 } from "@kksh/api/ui/iframe" import { Button } from "@kksh/svelte5" import { cn } from "@kksh/ui/utils" + import type { IKunkunFullServerAPI } from "@kunkunapi/src/api/server" import { getCurrentWindow } from "@tauri-apps/api/window" import { goto } from "$app/navigation" import { IframeParentIO, RPCChannel } from "kkrpc/browser" @@ -102,19 +103,22 @@ } } - const serverAPI: Record = constructJarvisServerAPIWithPermissions( + const serverAPI: IKunkunFullServerAPI = constructJarvisServerAPIWithPermissions( loadedExt.kunkun.permissions, loadedExt.extPath ) - serverAPI.iframeUi = { - ...serverAPI.iframeUi, - ...iframeUiAPI - } satisfies IUiIframe - serverAPI.db = new db.JarvisExtDB(extInfoInDB.extId) - serverAPI.kv = new db.KV(extInfoInDB.extId) - serverAPI.app = { - language: () => Promise.resolve("en") // TODO: get locale - } satisfies IApp + const serverAPI2 = { + ...serverAPI, + iframeUi: { + ...serverAPI.iframeUi, + ...iframeUiAPI + } satisfies IUiIframeServer1 & IUiIframeServer2, + db: new db.JarvisExtDB(extInfoInDB.extId), + kv: new db.KV(extInfoInDB.extId), + app: { + language: () => Promise.resolve("en") // TODO: get locale + } satisfies IApp + } function onBackBtnClicked() { if (isInMainWindow()) { @@ -137,8 +141,7 @@ }, 200) if (iframeRef?.contentWindow) { const io = new IframeParentIO(iframeRef.contentWindow) - const rpc = new RPCChannel(io, { expose: serverAPI }) - // exposeApiToWindow(iframeRef.contentWindow, serverAPI) + const rpc = new RPCChannel(io, { expose: serverAPI2 }) } else { toast.warning("iframeRef.contentWindow not available") } diff --git a/apps/desktop/src/routes/app/extension/ui-worker/+page.svelte b/apps/desktop/src/routes/app/extension/ui-worker/+page.svelte index 9ddff8f..ebad6b0 100644 --- a/apps/desktop/src/routes/app/extension/ui-worker/+page.svelte +++ b/apps/desktop/src/routes/app/extension/ui-worker/+page.svelte @@ -3,31 +3,22 @@ import { winExtMap } from "@/stores/winExtMap.js" import { listenToFileDrop, listenToRefreshDevExt } from "@/utils/tauri-events.js" import { isInMainWindow } from "@/utils/window.js" - // import { type Remote } from "@huakunshen/comlink" import { db } from "@kksh/api/commands" + import { constructJarvisServerAPIWithPermissions, type IApp, type IUiWorker } from "@kksh/api/ui" import { - constructJarvisServerAPIWithPermissions, - // exposeApiToWorker, - type IApp, - type IUiWorker - } from "@kksh/api/ui" - import { - clipboard, - // constructJarvisExtDBToServerDbAPI, FormNodeNameEnum, FormSchema, ListSchema, - Markdown, MarkdownSchema, NodeNameEnum, toast, - // wrap, type IComponent, type WorkerExtension } from "@kksh/api/ui/worker" import { LoadingBar } from "@kksh/ui" import { Templates } from "@kksh/ui/extension" import { GlobalCommandPaletteFooter } from "@kksh/ui/main" + import type { IKunkunFullServerAPI } from "@kunkunapi/src/api/server" import type { UnlistenFn } from "@tauri-apps/api/event" import { getCurrentWebviewWindow } from "@tauri-apps/api/webviewWindow" import { readTextFile } from "@tauri-apps/plugin-fs" @@ -200,24 +191,26 @@ const blob = new Blob([workerScript], { type: "application/javascript" }) const blobURL = URL.createObjectURL(blob) worker = new Worker(blobURL) - const serverAPI: Record = constructJarvisServerAPIWithPermissions( + const serverAPI: IKunkunFullServerAPI = constructJarvisServerAPIWithPermissions( loadedExt.kunkun.permissions, loadedExt.extPath ) - serverAPI.iframeUi = undefined - serverAPI.workerUi = extUiAPI - serverAPI.db = new db.JarvisExtDB(extInfoInDB.extId) - serverAPI.kv = new db.KV(extInfoInDB.extId) - serverAPI.app = { - language: () => Promise.resolve("en") - } satisfies IApp + const serverAPI2 = { + ...serverAPI, + iframeUi: undefined, + workerUi: extUiAPI, + db: new db.JarvisExtDB(extInfoInDB.extId), + kv: new db.KV(extInfoInDB.extId), + app: { + language: () => Promise.resolve("en") + } satisfies IApp + } + const io = new WorkerParentIO(worker) - const rpc = new RPCChannel(io, { - expose: serverAPI + const rpc = new RPCChannel(io, { + expose: serverAPI2 }) workerAPI = rpc.getAPI() - // exposeApiToWorker(worker, serverAPI) - // workerAPI = wrap(worker) await workerAPI.load() } diff --git a/apps/desktop/src/routes/app/troubleshooters/extension-loading/+page.svelte b/apps/desktop/src/routes/app/troubleshooters/extension-loading/+page.svelte index 43b31b6..0ae0fcc 100644 --- a/apps/desktop/src/routes/app/troubleshooters/extension-loading/+page.svelte +++ b/apps/desktop/src/routes/app/troubleshooters/extension-loading/+page.svelte @@ -45,8 +45,8 @@ } try { const manifest = await loadExtensionManifestFromDisk(pkgJsonPath) - } catch (err: any) { - error = `Failed to load manifest from ${pkgJsonPath}: ${err.message}` + } catch (err) { + error = `Failed to load manifest from ${pkgJsonPath}: ${err}` } tmpResults.push({ diff --git a/apps/desktop/svelte.config.js b/apps/desktop/svelte.config.js index 44f109f..46eb4b5 100644 --- a/apps/desktop/svelte.config.js +++ b/apps/desktop/svelte.config.js @@ -14,6 +14,7 @@ const config = { }), alias: { "@/*": "./src/lib/*", + "@kunkunapi/*": "../../packages/api/*" // "@kksh/ui/*": "../../packages/ui/*", // "@kksh/svelte5/*": "../../node_modules/@kksh/svelte5/src/lib/*" } diff --git a/package.json b/package.json index 5274a3a..1e2467c 100644 --- a/package.json +++ b/package.json @@ -20,7 +20,8 @@ "svelte": "^5.16.6", "svelte-check": "^4.1.1", "turbo": "^2.3.3", - "typescript": "5.7.2" + "typescript": "5.7.2", + "verify-package-export": "^0.0.2" }, "packageManager": "pnpm@9.15.3", "engines": { @@ -45,8 +46,8 @@ "@tauri-apps/plugin-store": "^2.2.0", "@tauri-apps/plugin-updater": "^2.3.1", "supabase": "^2.2.1", - "tauri-plugin-network-api": "workspace:*", "tauri-plugin-keyring-api": "workspace:*", + "tauri-plugin-network-api": "workspace:*", "tauri-plugin-shellx-api": "^2.0.14", "tauri-plugin-system-info-api": "workspace:*", "valibot": "^1.0.0-beta.11", diff --git a/packages/api/__tests__/verify-package-export.test.ts b/packages/api/__tests__/verify-package-export.test.ts index af85b2d..a68be67 100644 --- a/packages/api/__tests__/verify-package-export.test.ts +++ b/packages/api/__tests__/verify-package-export.test.ts @@ -29,6 +29,7 @@ describe("Verify Bundled Package", () => { if (typeof exportPaths === "string") { // special case for "./package.json" const resolvedPath = path.join(pkgRoot, exportPaths) + console.log("resolvedPath", resolvedPath) expect(await Bun.file(resolvedPath).exists()).toBe(true) } else { Object.values(exportPaths).forEach(async (_path: string) => { diff --git a/packages/api/package.json b/packages/api/package.json index f76f28a..56cb48c 100644 --- a/packages/api/package.json +++ b/packages/api/package.json @@ -16,12 +16,12 @@ "./events": "./src/events.ts", "./supabase": "./src/supabase/index.ts", "./supabase/types": "./src/supabase/database.types.ts", - "./package.json": "./package.json", - "./extensions/jsr": "./src/extensions/jsr/index.ts" + "./package.json": "./package.json" }, "license": "MIT", "scripts": { "test": "bun test --coverage", + "postbuild": "verify-package-export verify", "gen:deno:types": "deno types > deno.d.ts", "build:docs": "npx typedoc", "check-types": "tsc --noEmit", @@ -39,7 +39,8 @@ "fs-extra": "^11.2.0", "madge": "^8.0.0", "typedoc": "^0.27.6", - "typescript": "^5.0.0" + "typescript": "^5.0.0", + "verify-package-export": "^0.0.2" }, "dependencies": { "@huakunshen/jsr-client": "^0.1.5", diff --git a/packages/api/src/extensions/jsr/__tests__/api.test.ts b/packages/api/src/extensions/jsr/__tests__/api.test.ts deleted file mode 100644 index 6bf683d..0000000 --- a/packages/api/src/extensions/jsr/__tests__/api.test.ts +++ /dev/null @@ -1,133 +0,0 @@ -import { describe, expect, test } from "bun:test"; -import * as v from "valibot"; -import { ExtPackageJson } from "../../../models/manifest"; -import { - getAllVersionsOfJsrPackage, - getJsrNpmPackageVersionMetadata, - getJsrNpmPkgMetadata, - getJsrPackageGitHubRepo, - getJsrPackageHtml, - getJsrPackageMetadata, - getJsrPackageSrcFile, - getNpmPackageTarballUrl, - isSignedByGitHubAction, - jsrPackageExists, - splitRawJsrPkgName, - translateJsrToNpmPkgName, -} from "../index"; -import { JsrPackageMetadata, NpmPkgMetadata } from "../models"; - -describe("Test the helper functions", () => { - test("Get Package Html", async () => { - const html = await getJsrPackageHtml("kunkun", "kkrpc"); - expect(html).toBeDefined(); - }); - - test("Signed By GitHub Action", async () => { - const kkrpcSigned = await isSignedByGitHubAction( - "kunkun", - "kkrpc", - "0.0.14", - ); - expect(kkrpcSigned).toBe(true); - const kkrpcSignedVersion = await isSignedByGitHubAction( - "kunkun", - "kkrpc", - "0.0.14", - ); - expect(kkrpcSignedVersion).toBe(true); - expect(kkrpcSignedVersion).toBe(true); - const kunkunApiSigned = await isSignedByGitHubAction( - "kunkun", - "api", - "0.0.47", - ); - expect(kunkunApiSigned).toBe(false); - }); - - test("Get Linked GitHub Repo", async () => { - const repo = await getJsrPackageGitHubRepo("kunkun", "kkrpc"); - expect(repo).toBeDefined(); - expect(repo?.owner).toBe("kunkunsh"); - expect(repo?.name).toBe("kkrpc"); - }); - - test("Get Package Metadata", async () => { - const metadata = await getJsrPackageMetadata("kunkun", "api"); - const parsed = v.parse(JsrPackageMetadata, metadata); - expect(parsed).toBeDefined(); - }); - - test("Get Package's package.json", async () => { - const packageJson = await getJsrPackageSrcFile( - "kunkun", - "ext-image-processing", - "0.0.6", - "package.json", - ); - expect(packageJson).toBeDefined(); - const parsed = v.parse(ExtPackageJson, JSON.parse(packageJson!)); - expect(parsed).toBeDefined(); - }); - - test("Get Package's README.md", async () => { - const readme = await getJsrPackageSrcFile( - "kunkun", - "api", - "0.0.47", - "README.md", - ); - expect(readme).toBeDefined(); - }); - - test("Translate Jsr Package Name to Npm Package Name", () => { - const npmPkgName = translateJsrToNpmPkgName("kunkun", "api"); - expect(npmPkgName).toBe("kunkun__api"); - }); - - test("Split Jsr Package Name", async () => { - const { scope, name } = await splitRawJsrPkgName("@kunkun/api"); - expect(scope).toBe("kunkun"); - expect(name).toBe("api"); - expect(splitRawJsrPkgName("kunkun/api")).rejects.toThrow(); - }); - - test("Get Npm Package Metadata", async () => { - const metadata = await getJsrNpmPkgMetadata("kunkun", "api"); - const parsed = v.parse(NpmPkgMetadata, metadata); - expect(parsed).toBeDefined(); - }); - - test("Get Npm Package Version Metadata", async () => { - const metadata = await getJsrNpmPackageVersionMetadata( - "kunkun", - "api", - "0.0.47", - ); - expect(metadata).toBeDefined(); - }); - - test("Get Npm Package Tarball Url", async () => { - const url = await getNpmPackageTarballUrl("kunkun", "api", "0.0.47"); - expect(url).toBeDefined(); - }); - - test("Get All Versions Of Jsr Package", async () => { - const versions = await getAllVersionsOfJsrPackage("kunkun", "api"); - expect(versions).toBeDefined(); - // verify: versions should match npm api - const npmPkgMetadata = await getJsrNpmPkgMetadata("kunkun", "api"); - expect(versions).toEqual(Object.keys(npmPkgMetadata.versions)); - }); - - test("Jsr Package Exists", async () => { - expect(await jsrPackageExists("kunkun", "api")).toBe(true); - expect(await jsrPackageExists("hk", "non-existent-package")).toBe( - false, - ); - expect(await jsrPackageExists("hk", "jsr-client", "0.1.2")).toBe(true); - expect(await jsrPackageExists("hk", "jsr-client", "0.1.500")).toBe( - false, - ); - }); -}); diff --git a/packages/api/src/extensions/jsr/models.ts b/packages/api/src/extensions/jsr/models.ts deleted file mode 100644 index ab36616..0000000 --- a/packages/api/src/extensions/jsr/models.ts +++ /dev/null @@ -1,42 +0,0 @@ -import * as v from "valibot" - -export const JsrPackageMetadata = v.object({ - scope: v.string(), - name: v.string(), - latest: v.string(), - versions: v.record( - v.string(), - v.object({ - yanked: v.optional(v.boolean()) - }) - ) -}) -export type JsrPackageMetadata = v.InferOutput - -export const NpmPkgMetadata = v.object({ - name: v.string(), - description: v.optional(v.string()), - "dist-tags": v.record(v.string(), v.string()), // latest, next, beta, rc - versions: v.record( - v.string(), - v.object({ - name: v.string(), - version: v.string(), - description: v.optional(v.string()), - dist: v.object({ - tarball: v.string(), - shasum: v.string(), - integrity: v.string() - }), - dependencies: v.record(v.string(), v.string()) - }) - ), - time: v.objectWithRest( - { - created: v.string(), - modified: v.string() - }, - v.string() - ) -}) -export type NpmPkgMetadata = v.InferOutput diff --git a/packages/api/src/models/manifest.ts b/packages/api/src/models/manifest.ts index 8dc83a1..2929a6f 100644 --- a/packages/api/src/models/manifest.ts +++ b/packages/api/src/models/manifest.ts @@ -1,36 +1,36 @@ -import { FsPermissionSchema } from "tauri-api-adapter/permissions"; -import * as v from "valibot"; +import { FsPermissionSchema } from "tauri-api-adapter/permissions" +import * as v from "valibot" import { AllKunkunPermission, FsPermissionScopedSchema, KunkunFsPermissionSchema, KunkunManifestPermission, OpenPermissionScopedSchema, - ShellPermissionScopedSchema, -} from "../permissions"; -import { CmdType } from "./extension"; -import { Icon } from "./icon"; + ShellPermissionScopedSchema +} from "../permissions" +import { CmdType } from "./extension" +import { Icon } from "./icon" export enum OSPlatformEnum { linux = "linux", macos = "macos", - windows = "windows", + windows = "windows" } -export const OSPlatform = v.enum_(OSPlatformEnum); -export type OSPlatform = v.InferOutput; -const allPlatforms = Object.values(OSPlatformEnum); +export const OSPlatform = v.enum_(OSPlatformEnum) +export type OSPlatform = v.InferOutput +const allPlatforms = Object.values(OSPlatformEnum) export const TriggerCmd = v.object({ type: v.union([v.literal("text"), v.literal("regex")]), - value: v.string(), -}); -export type TriggerCmd = v.InferOutput; + value: v.string() +}) +export type TriggerCmd = v.InferOutput export enum TitleBarStyleEnum { "visible" = "visible", "transparent" = "transparent", - "overlay" = "overlay", + "overlay" = "overlay" } -export const TitleBarStyle = v.enum_(TitleBarStyleEnum); +export const TitleBarStyle = v.enum_(TitleBarStyleEnum) // JS new WebViewWindow only accepts lowercase, while manifest loaded from Rust is capitalized. I run toLowerCase() on the value before passing it to the WebViewWindow. // This lowercase title bar style schema is used to validate and set the type so TypeScript won't complaint // export const TitleBarStyleAllLower = z.enum(["visible", "transparent", "overlay"]); @@ -66,101 +66,85 @@ export const WindowConfig = v.object({ minimizable: v.optional(v.nullable(v.boolean())), closable: v.optional(v.nullable(v.boolean())), parent: v.optional(v.nullable(v.string())), - visibleOnAllWorkspaces: v.optional(v.nullable(v.boolean())), -}); -export type WindowConfig = v.InferOutput; + visibleOnAllWorkspaces: v.optional(v.nullable(v.boolean())) +}) +export type WindowConfig = v.InferOutput export const BaseCmd = v.object({ main: v.string("HTML file to load, e.g. dist/index.html"), - description: v.optional( - v.nullable(v.string("Description of the Command"), ""), - "", - ), + description: v.optional(v.nullable(v.string("Description of the Command"), ""), ""), name: v.string("Name of the command"), cmds: v.array(TriggerCmd, "Commands to trigger the UI"), icon: v.optional(Icon), platforms: v.optional( v.nullable( - v.array( - OSPlatform, - "Platforms available on. Leave empty for all platforms.", - ), - allPlatforms, + v.array(OSPlatform, "Platforms available on. Leave empty for all platforms."), + allPlatforms ), - allPlatforms, - ), -}); + allPlatforms + ) +}) export const CustomUiCmd = v.object({ ...BaseCmd.entries, type: v.optional(CmdType, CmdType.enum.UiIframe), dist: v.string("Dist folder to load, e.g. dist, build, out"), devMain: v.string( - "URL to load in development to support live reload, e.g. http://localhost:5173/", + "URL to load in development to support live reload, e.g. http://localhost:5173/" ), - window: v.optional(v.nullable(WindowConfig)), -}); -export type CustomUiCmd = v.InferOutput; + window: v.optional(v.nullable(WindowConfig)) +}) +export type CustomUiCmd = v.InferOutput export const TemplateUiCmd = v.object({ ...BaseCmd.entries, type: v.optional(CmdType, CmdType.enum.UiWorker), - window: v.optional(v.nullable(WindowConfig)), -}); + window: v.optional(v.nullable(WindowConfig)) +}) export const HeadlessCmd = v.object({ ...BaseCmd.entries, - type: v.optional(CmdType, CmdType.enum.HeadlessWorker), -}); -export type HeadlessCmd = v.InferOutput; -export type TemplateUiCmd = v.InferOutput; + type: v.optional(CmdType, CmdType.enum.HeadlessWorker) +}) +export type HeadlessCmd = v.InferOutput +export type TemplateUiCmd = v.InferOutput export const PermissionUnion = v.union([ KunkunManifestPermission, FsPermissionScopedSchema, OpenPermissionScopedSchema, - ShellPermissionScopedSchema, -]); -export type PermissionUnion = v.InferOutput; + ShellPermissionScopedSchema +]) +export type PermissionUnion = v.InferOutput export const KunkunExtManifest = v.object({ name: v.string("Name of the extension (Human Readable)"), - shortDescription: v.string( - "Description of the extension (Will be displayed in store)", - ), - longDescription: v.string( - "Long description of the extension (Will be displayed in store)", - ), + shortDescription: v.string("Description of the extension (Will be displayed in store)"), + longDescription: v.string("Long description of the extension (Will be displayed in store)"), identifier: v.string( - "Unique identifier for the extension, must be the same as extension folder name", + "Unique identifier for the extension, must be the same as extension folder name" ), icon: Icon, permissions: v.array( PermissionUnion, - "Permissions Declared by the extension. e.g. clipboard-all. Not declared APIs will be blocked.", + "Permissions Declared by the extension. e.g. clipboard-all. Not declared APIs will be blocked." ), demoImages: v.array(v.string("Demo images for the extension")), customUiCmds: v.optional(v.array(CustomUiCmd, "Custom UI Commands")), templateUiCmds: v.optional(v.array(TemplateUiCmd, "Template UI Commands")), - headlessCmds: v.optional(v.array(HeadlessCmd, "Headless Commands")), -}); -export type KunkunExtManifest = v.InferOutput; + headlessCmds: v.optional(v.array(HeadlessCmd, "Headless Commands")) +}) +export type KunkunExtManifest = v.InferOutput const Person = v.union([ v.object({ name: v.string("GitHub Username"), email: v.string("Email of the person"), - url: v.optional(v.nullable(v.string("URL of the person"))), + url: v.optional(v.nullable(v.string("URL of the person"))) }), - v.string("GitHub Username"), -]); + v.string("GitHub Username") +]) export const ExtPackageJson = v.object({ - name: v.string( - "Package name for the extension (just a regular npm package name)", - ), + name: v.string("Package name for the extension (just a regular npm package name)"), version: v.string("Version of the extension"), author: v.optional(Person), - draft: v.optional( - v.boolean( - "Whether the extension is a draft, draft will not be published", - ), - ), + draft: v.optional(v.boolean("Whether the extension is a draft, draft will not be published")), contributors: v.optional(v.array(Person, "Contributors of the extension")), repository: v.optional( v.union([ @@ -168,17 +152,15 @@ export const ExtPackageJson = v.object({ v.object({ type: v.string("Type of the repository"), url: v.string("URL of the repository"), - directory: v.string("Directory of the repository"), - }), - ]), + directory: v.optional(v.string("Directory of the repository")) + }) + ]) ), dependencies: v.optional(v.record(v.string(), v.string())), kunkun: KunkunExtManifest, - files: v.array( - v.string("Files to include in the extension. e.g. ['dist']"), - ), -}); -export type ExtPackageJson = v.InferOutput; + files: v.optional(v.array(v.string("Files to include in the extension. e.g. ['dist']"))) +}) +export type ExtPackageJson = v.InferOutput /** * Extra fields for ExtPackageJson * e.g. path to the extension @@ -187,8 +169,8 @@ export const ExtPackageJsonExtra = v.object({ ...ExtPackageJson.entries, ...{ extPath: v.string(), - extFolderName: v.string(), - }, -}); + extFolderName: v.string() + } +}) -export type ExtPackageJsonExtra = v.InferOutput; +export type ExtPackageJsonExtra = v.InferOutput diff --git a/packages/api/src/supabase/database.types.ts b/packages/api/src/supabase/database.types.ts index e48bb5d..3044a48 100644 --- a/packages/api/src/supabase/database.types.ts +++ b/packages/api/src/supabase/database.types.ts @@ -1,288 +1,274 @@ -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: [] - } - } - Views: { - [_ in never]: never - } - Functions: { - get_aggregated_downloads: { - Args: Record - Returns: { - identifier: string - total_downloads: number - }[] - } - get_aggregated_downloads_with_details: { - Args: Record - 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 + 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: [] + } + } + Views: { + [_ in never]: never + } + Functions: { + get_aggregated_downloads: { + Args: Record + Returns: { + identifier: string + total_downloads: number + }[] + } + get_aggregated_downloads_with_details: { + Args: Record + 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 + } + } } type PublicSchema = Database[Extract] 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 diff --git a/packages/config-eslint/package.json b/packages/config-eslint/package.json index 31d9c95..9729bee 100644 --- a/packages/config-eslint/package.json +++ b/packages/config-eslint/package.json @@ -2,11 +2,11 @@ "name": "@kksh/eslint-config", "version": "0.0.0", "dependencies": { - "@typescript-eslint/eslint-plugin": "^8.15.0", - "@typescript-eslint/parser": "^8.15.0", - "eslint-config-prettier": "^9.1.0", - "eslint-config-turbo": "^2.3.0", - "eslint-plugin-svelte": "^2.46.0" + "@typescript-eslint/eslint-plugin": "^8.20.0", + "@typescript-eslint/parser": "^8.20.0", + "eslint-config-prettier": "^10.0.1", + "eslint-config-turbo": "^2.3.3", + "eslint-plugin-svelte": "^2.46.1" }, "publishConfig": { "access": "public" diff --git a/packages/extensions/ext-sveltekit-exp/components.json b/packages/extensions/ext-sveltekit-exp/components.json index 5a53aa5..3ceaad9 100644 --- a/packages/extensions/ext-sveltekit-exp/components.json +++ b/packages/extensions/ext-sveltekit-exp/components.json @@ -11,4 +11,4 @@ "utils": "$lib/utils" }, "typescript": true -} \ No newline at end of file +} diff --git a/packages/extensions/ext-sveltekit-exp/deno-src/deno.json b/packages/extensions/ext-sveltekit-exp/deno-src/deno.json index ce35da4..0fd5302 100644 --- a/packages/extensions/ext-sveltekit-exp/deno-src/deno.json +++ b/packages/extensions/ext-sveltekit-exp/deno-src/deno.json @@ -1,9 +1,9 @@ { - "tasks": { - "dev": "deno run --watch main.ts" - }, - "imports": { - "@kunkun/api": "jsr:@kunkun/api@^0.0.40", - "@std/assert": "jsr:@std/assert@1" - } + "tasks": { + "dev": "deno run --watch main.ts" + }, + "imports": { + "@kunkun/api": "jsr:@kunkun/api@^0.0.40", + "@std/assert": "jsr:@std/assert@1" + } } diff --git a/packages/extensions/ext-sveltekit-exp/package.json b/packages/extensions/ext-sveltekit-exp/package.json index 1c583cd..6112cad 100644 --- a/packages/extensions/ext-sveltekit-exp/package.json +++ b/packages/extensions/ext-sveltekit-exp/package.json @@ -43,7 +43,6 @@ "preview": "vite preview", "check": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json", "check:watch": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json --watch", - "lint": "prettier --check . && eslint .", "format": "prettier --write ." }, "dependencies": { diff --git a/packages/extensions/ext-sveltekit-exp/src/app.css b/packages/extensions/ext-sveltekit-exp/src/app.css index 117997f..dc56d5c 100644 --- a/packages/extensions/ext-sveltekit-exp/src/app.css +++ b/packages/extensions/ext-sveltekit-exp/src/app.css @@ -1,4 +1,4 @@ -@import url("@kksh/svelte5/themes"); +@import url('@kksh/svelte5/themes'); @tailwind base; @tailwind components; @tailwind utilities; @@ -77,4 +77,4 @@ body { @apply bg-background text-foreground; } -} \ No newline at end of file +} diff --git a/packages/package-registry/.gitignore b/packages/package-registry/.gitignore new file mode 100644 index 0000000..9b1ee42 --- /dev/null +++ b/packages/package-registry/.gitignore @@ -0,0 +1,175 @@ +# Based on https://raw.githubusercontent.com/github/gitignore/main/Node.gitignore + +# Logs + +logs +_.log +npm-debug.log_ +yarn-debug.log* +yarn-error.log* +lerna-debug.log* +.pnpm-debug.log* + +# Caches + +.cache + +# Diagnostic reports (https://nodejs.org/api/report.html) + +report.[0-9]_.[0-9]_.[0-9]_.[0-9]_.json + +# Runtime data + +pids +_.pid +_.seed +*.pid.lock + +# Directory for instrumented libs generated by jscoverage/JSCover + +lib-cov + +# Coverage directory used by tools like istanbul + +coverage +*.lcov + +# nyc test coverage + +.nyc_output + +# Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files) + +.grunt + +# Bower dependency directory (https://bower.io/) + +bower_components + +# node-waf configuration + +.lock-wscript + +# Compiled binary addons (https://nodejs.org/api/addons.html) + +build/Release + +# Dependency directories + +node_modules/ +jspm_packages/ + +# Snowpack dependency directory (https://snowpack.dev/) + +web_modules/ + +# TypeScript cache + +*.tsbuildinfo + +# Optional npm cache directory + +.npm + +# Optional eslint cache + +.eslintcache + +# Optional stylelint cache + +.stylelintcache + +# Microbundle cache + +.rpt2_cache/ +.rts2_cache_cjs/ +.rts2_cache_es/ +.rts2_cache_umd/ + +# Optional REPL history + +.node_repl_history + +# Output of 'npm pack' + +*.tgz + +# Yarn Integrity file + +.yarn-integrity + +# dotenv environment variable files + +.env +.env.development.local +.env.test.local +.env.production.local +.env.local + +# parcel-bundler cache (https://parceljs.org/) + +.parcel-cache + +# Next.js build output + +.next +out + +# Nuxt.js build / generate output + +.nuxt +dist + +# Gatsby files + +# Comment in the public line in if your project uses Gatsby and not Next.js + +# https://nextjs.org/blog/next-9-1#public-directory-support + +# public + +# vuepress build output + +.vuepress/dist + +# vuepress v2.x temp and cache directory + +.temp + +# Docusaurus cache and generated files + +.docusaurus + +# Serverless directories + +.serverless/ + +# FuseBox cache + +.fusebox/ + +# DynamoDB Local files + +.dynamodb/ + +# TernJS port file + +.tern-port + +# Stores VSCode versions used for testing VSCode extensions + +.vscode-test + +# yarn v2 + +.yarn/cache +.yarn/unplugged +.yarn/build-state.yml +.yarn/install-state.gz +.pnp.* + +# IntelliJ based IDEs +.idea + +# Finder (MacOS) folder config +.DS_Store diff --git a/packages/package-registry/README.md b/packages/package-registry/README.md new file mode 100644 index 0000000..521b511 --- /dev/null +++ b/packages/package-registry/README.md @@ -0,0 +1,3 @@ +# @kksh/package-registry + +This package contains helper functions for interacting with js package registries. diff --git a/packages/package-registry/package.json b/packages/package-registry/package.json new file mode 100644 index 0000000..780eafe --- /dev/null +++ b/packages/package-registry/package.json @@ -0,0 +1,25 @@ +{ + "name": "@kksh/package-registry", + "type": "module", + "scripts": { + "test": "bun test --coverage", + "posttest": "verify-package-export verify" + }, + "exports": { + "./jsr": "./src/jsr/index.ts", + "./npm": "./src/npm/index.ts", + "./github": "./src/github.ts" + }, + "devDependencies": { + "@types/bun": "latest", + "verify-package-export": "^0.0.2" + }, + "peerDependencies": { + "typescript": "^5.0.0" + }, + "dependencies": { + "@huakunshen/jsr-client": "^0.1.5", + "@kksh/api": "workspace:*", + "@octokit/rest": "^21.1.0" + } +} diff --git a/packages/package-registry/src/__tests__/github.test.ts b/packages/package-registry/src/__tests__/github.test.ts new file mode 100644 index 0000000..2e91c1e --- /dev/null +++ b/packages/package-registry/src/__tests__/github.test.ts @@ -0,0 +1,9 @@ +import { expect, test } from "bun:test" +import { parseGitHubRepoFromUri } from "../github" + +test("parse github repo from uri", () => { + expect(parseGitHubRepoFromUri("https://github.com/huakunshen/kunkun-ext-ossinsight")).toEqual({ + owner: "huakunshen", + repo: "kunkun-ext-ossinsight" + }) +}) diff --git a/packages/package-registry/src/__tests__/sigstore.test.ts b/packages/package-registry/src/__tests__/sigstore.test.ts new file mode 100644 index 0000000..bb346d4 --- /dev/null +++ b/packages/package-registry/src/__tests__/sigstore.test.ts @@ -0,0 +1,35 @@ +import { describe, expect, test } from "bun:test" +import * as v from "valibot" +import { RawRekorLog } from "../models" +import { + getInfoFromRekorLog, + getRekorLogId, + parseAttestation, + parseTheOnlyRecord +} from "../sigstore" + +describe("sigstore", async () => { + const log = await getRekorLogId("162240358") + const parsed = v.safeParse(RawRekorLog, log) + + test("get rekor log", async () => { + expect(parsed.success).toBe(true) + }) + + test("parse attestation", async () => { + if (parsed.success) { + const parsed2 = parseTheOnlyRecord(parsed.output) + const attestation = parseAttestation(parsed2) + expect(attestation).toBeDefined() + } + }) + + test("parse all commits from rekor log", async () => { + const git = await getInfoFromRekorLog("162240358") + expect(git).toBeDefined() + expect(git.commit).toBe("48b7dff528bc6a175ce9ee99e6d8de0c718e70a0") + expect(git.githubActionInvocationId).toBe( + "https://github.com/kunkunsh/kunkun-ext-image-processing/actions/runs/12763976478/attempts/1" + ) + }) +}) diff --git a/packages/api/src/extensions/jsr/github.ts b/packages/package-registry/src/github.ts similarity index 76% rename from packages/api/src/extensions/jsr/github.ts rename to packages/package-registry/src/github.ts index fe45faf..d07577f 100644 --- a/packages/api/src/extensions/jsr/github.ts +++ b/packages/package-registry/src/github.ts @@ -32,3 +32,17 @@ export function authenticatedUserIsMemberOfGitHubOrg( return res.data.some((org) => org.login === orgName) }) } + +export function parseGitHubRepoFromUri(uri: string): { + owner: string + repo: string +} { + // check regex + const regex = /https?:\/\/github\.com\/([^\/]+)\/([^\/]+)/ + const match = uri.match(regex) + if (!match) { + throw new Error("Invalid GitHub repository URI") + } + const [, owner, repo] = match + return { owner, repo } +} diff --git a/packages/package-registry/src/jsr/__tests__/api.test.ts b/packages/package-registry/src/jsr/__tests__/api.test.ts new file mode 100644 index 0000000..daec706 --- /dev/null +++ b/packages/package-registry/src/jsr/__tests__/api.test.ts @@ -0,0 +1,124 @@ +import { getPackageVersion } from "@huakunshen/jsr-client/hey-api-client" +import { describe, expect, test } from "bun:test" +import * as v from "valibot" +import { ExtPackageJson } from "../../../../api/src/models/manifest" +import { NpmPkgMetadata } from "../../npm/models" +import { + getAllVersionsOfJsrPackage, + getJsrNpmPackageVersionMetadata, + getJsrNpmPkgMetadata, + getJsrPackageGitHubRepo, + getJsrPackageHtml, + getJsrPackageMetadata, + getJsrPackageSrcFile, + getNpmPackageTarballUrl, + isSignedByGitHubAction, + jsrPackageExists, + splitRawJsrPkgName, + translateJsrToNpmPkgName +} from "../index" +import { JsrPackageMetadata } from "../models" + +describe("Test the helper functions", () => { + test("Get Package Html", async () => { + const html = await getJsrPackageHtml("kunkun", "kkrpc") + expect(html).toBeDefined() + }) + + test("Signed By GitHub Action", async () => { + const kkrpcSigned = await isSignedByGitHubAction("kunkun", "kkrpc", "0.0.14") + expect(kkrpcSigned).toBeDefined() + const kkrpcSignedVersion = await isSignedByGitHubAction("kunkun", "kkrpc", "0.0.14") + expect(kkrpcSignedVersion).toBeDefined() + expect(kkrpcSignedVersion).toBeDefined() + const kunkunApiSigned = await isSignedByGitHubAction("kunkun", "api", "0.0.47") + expect(kunkunApiSigned).toBeNull() + }) + + test("Get Linked GitHub Repo", async () => { + const repo = await getJsrPackageGitHubRepo("kunkun", "kkrpc") + expect(repo).toBeDefined() + expect(repo?.owner).toBe("kunkunsh") + expect(repo?.name).toBe("kkrpc") + }) + + test("Get Package Metadata", async () => { + const metadata = await getJsrPackageMetadata("kunkun", "api") + const parsed = v.parse(JsrPackageMetadata, metadata) + expect(parsed).toBeDefined() + }) + + test("Get Package's package.json", async () => { + const packageJson = await getJsrPackageSrcFile( + "kunkun", + "ext-image-processing", + "0.0.6", + "package.json" + ) + expect(packageJson).toBeDefined() + const parsed = v.parse(ExtPackageJson, JSON.parse(packageJson!)) + expect(parsed).toBeDefined() + }) + + test("Get Package's README.md", async () => { + const readme = await getJsrPackageSrcFile("kunkun", "api", "0.0.47", "README.md") + expect(readme).toBeDefined() + }) + + test("Translate Jsr Package Name to Npm Package Name", () => { + const npmPkgName = translateJsrToNpmPkgName("kunkun", "api") + expect(npmPkgName).toBe("kunkun__api") + }) + + test("Split Jsr Package Name", async () => { + const { scope, name } = await splitRawJsrPkgName("@kunkun/api") + expect(scope).toBe("kunkun") + expect(name).toBe("api") + expect(splitRawJsrPkgName("kunkun/api")).rejects.toThrow() + }) + + test("Get Npm Package Metadata", async () => { + const metadata = await getJsrNpmPkgMetadata("kunkun", "api") + const parsed = v.safeParse(NpmPkgMetadata, metadata) + if (!parsed.success) { + throw new Error("Failed to parse NpmPkgMetadata") + } + expect(parsed.output).toBeDefined() + }) + + test("Get Npm Package Version Metadata", async () => { + const metadata = await getJsrNpmPackageVersionMetadata("kunkun", "api", "0.0.47") + expect(metadata).toBeDefined() + }) + + test("Get Npm Package Tarball Url", async () => { + const url = await getNpmPackageTarballUrl("kunkun", "api", "0.0.47") + expect(url).toBeDefined() + }) + + test("Get All Versions Of Jsr Package", async () => { + const versions = await getAllVersionsOfJsrPackage("kunkun", "api") + expect(versions).toBeDefined() + // verify: versions should match npm api + const npmPkgMetadata = await getJsrNpmPkgMetadata("kunkun", "api") + expect(versions).toEqual(Object.keys(npmPkgMetadata.versions)) + }) + + test("Jsr Package Exists", async () => { + expect(await jsrPackageExists("kunkun", "api")).toBe(true) + expect(await jsrPackageExists("hk", "non-existent-package")).toBe(false) + expect(await jsrPackageExists("hk", "jsr-client", "0.1.2")).toBe(true) + expect(await jsrPackageExists("hk", "jsr-client", "0.1.500")).toBe(false) + }) + + test("get package version info", async () => { + const pkgVersion = await getPackageVersion({ + path: { + scope: "kunkun", + package: "ext-ossinsight", + version: "0.0.1" + } + }) + expect(pkgVersion).toBeDefined() + }) +}) diff --git a/packages/api/src/extensions/jsr/__tests__/ext-pkg.test.ts b/packages/package-registry/src/jsr/__tests__/ext-pkg.test.ts similarity index 81% rename from packages/api/src/extensions/jsr/__tests__/ext-pkg.test.ts rename to packages/package-registry/src/jsr/__tests__/ext-pkg.test.ts index ec9b02c..7442645 100644 --- a/packages/api/src/extensions/jsr/__tests__/ext-pkg.test.ts +++ b/packages/package-registry/src/jsr/__tests__/ext-pkg.test.ts @@ -62,7 +62,7 @@ describe("Validate Jsr package as Kunkun extension", () => { }) test("A valid extension package", async () => { - const res = await await validateJsrPackageAsKunkunExtension({ + const res = await validateJsrPackageAsKunkunExtension({ jsrPackage: { scope: "kunkun", name: "ext-image-processing", @@ -71,5 +71,10 @@ describe("Validate Jsr package as Kunkun extension", () => { githubUsername: "HuakunShen" }) expect(res.data).toBeDefined() + expect(res.data?.rekorLogIndex).toBe("161854127") + expect(res.data?.github.commit).toBe("4db8d65b5e3fa115da6e31bd945f5c610c4a21cb") + expect(res.data?.github.owner).toBe("kunkunsh") + expect(res.data?.github.repo).toBe("kunkun-ext-image-processing") + // expect(res.data?.github.githubActionInvocationId).toBe("48b7dff528bc6a175ce9ee99e6d8de0c718e70a0") }) }) diff --git a/packages/api/src/extensions/jsr/index.ts b/packages/package-registry/src/jsr/index.ts similarity index 86% rename from packages/api/src/extensions/jsr/index.ts rename to packages/package-registry/src/jsr/index.ts index d758991..fd65519 100644 --- a/packages/api/src/extensions/jsr/index.ts +++ b/packages/package-registry/src/jsr/index.ts @@ -4,12 +4,13 @@ import { getPackageVersion, type GitHubRepository } from "@huakunshen/jsr-client/hey-api-client" +import { ExtPackageJson } from "@kksh/api/models" import * as v from "valibot" -import { ExtPackageJson } from "../../models/manifest" -import { authenticatedUserIsMemberOfGitHubOrg, userIsPublicMemberOfGitHubOrg } from "./github" -import type { JsrPackageMetadata, NpmPkgMetadata } from "./models" - -export * from "./github" +import { authenticatedUserIsMemberOfGitHubOrg, userIsPublicMemberOfGitHubOrg } from "../github" +import type { NpmPkgMetadata } from "../npm/models" +import { getInfoFromRekorLog } from "../sigstore" +import { getTarballSize } from "../utils" +import type { JsrPackageMetadata } from "./models" client.setConfig({ baseUrl: "https://api.jsr.io" @@ -57,13 +58,13 @@ export function getJsrPackageHtml(scope: string, name: string, version?: string) /** * Check if a Jsr package is signed by GitHub Actions - * @returns + * @returns rekor log index if signed, undefined if not signed */ export async function isSignedByGitHubAction( scope: string, name: string, version: string -): Promise { +): Promise { const pkgVersion = await getPackageVersion({ path: { scope, @@ -71,7 +72,7 @@ export async function isSignedByGitHubAction( version } }) - return !!pkgVersion.data?.rekorLogId + return pkgVersion.data?.rekorLogId ?? null } export async function getJsrPackageGitHubRepo( @@ -159,7 +160,7 @@ export async function getNpmPackageTarballUrl( version: string ): Promise { const metadata = await getJsrNpmPackageVersionMetadata(scope, name, version) - const tarballUrl: string | undefined = metadata?.dist.tarball + const tarballUrl: string | undefined = metadata?.dist?.tarball return tarballUrl } @@ -198,20 +199,6 @@ export function jsrPackageExists(scope: string, name: string, version?: string): }).then((res) => res.response.ok && res.response.status === 200) } -/** - * Get the tarball size of a Jsr package - * @param url tarball url, can technically be any url - * @returns tarball size in bytes - */ -export function getTarballSize(url: string): Promise { - return fetch(url, { method: "HEAD" }).then((res) => { - if (!(res.ok && res.status === 200)) { - throw new Error("Failed to fetch tarball size") - } - return Number(res.headers.get("Content-Length")) - }) -} - /** * Validate a Jsr package as a Kunkun extension * - check if jsr pkg is linked to a github repo @@ -239,9 +226,19 @@ export async function validateJsrPackageAsKunkunExtension(payload: { shasum: string apiVersion: string tarballSize: number + rekorLogIndex: string + github: { + githubActionInvocationId: string + commit: string + repo: string + owner: string + workflowPath: string + } } }> { - // check if jsr package exists + /* -------------------------------------------------------------------------- */ + /* check if jsr package exists */ + /* -------------------------------------------------------------------------- */ const jsrExists = await jsrPackageExists( payload.jsrPackage.scope, payload.jsrPackage.name, @@ -263,12 +260,12 @@ export async function validateJsrPackageAsKunkunExtension(payload: { /* -------------------------------------------------------------------------- */ /* check if jsr pkg is signed with github action */ /* -------------------------------------------------------------------------- */ - const signed = await isSignedByGitHubAction( + const rekorLogId = await isSignedByGitHubAction( payload.jsrPackage.scope, payload.jsrPackage.name, payload.jsrPackage.version ) - if (!signed) { + if (!rekorLogId) { return { error: "JSR package is not signed by GitHub Actions" } } /* -------------------------------------------------------------------------- */ @@ -277,6 +274,9 @@ export async function validateJsrPackageAsKunkunExtension(payload: { if (!githubRepo.owner) { return { error: "Package's Linked GitHub repository owner is not found." } } + if (!githubRepo.name) { + return { error: "Package's Linked GitHub repository name is not found." } + } if (githubRepo.owner.toLowerCase() !== payload.githubUsername.toLowerCase()) { const isPublicMemeber = await userIsPublicMemberOfGitHubOrg( githubRepo.owner, @@ -332,8 +332,11 @@ export async function validateJsrPackageAsKunkunExtension(payload: { payload.jsrPackage.name, payload.jsrPackage.version ) - const tarballUrl = npmPkgVersionMetadata.dist.tarball - const shasum = npmPkgVersionMetadata.dist.shasum + const tarballUrl = npmPkgVersionMetadata.dist?.tarball + const shasum = npmPkgVersionMetadata.dist?.shasum + if (!shasum) { + return { error: "Could not get shasum for JSR package" } + } if (!tarballUrl) { return { error: "Could not get tarball URL for JSR package" } } @@ -354,14 +357,22 @@ export async function validateJsrPackageAsKunkunExtension(payload: { error: `Extension ${packageJson.kunkun.identifier} doesn't not have @kksh/api as a dependency` } } - + const rekorInfo = await getInfoFromRekorLog(rekorLogId) return { data: { pkgJson: parseResult.output, tarballUrl, shasum, apiVersion, - tarballSize + tarballSize, + rekorLogIndex: rekorLogId, + github: { + githubActionInvocationId: rekorInfo.githubActionInvocationId, + commit: rekorInfo.commit, + repo: githubRepo.name, + owner: githubRepo.owner, + workflowPath: rekorInfo.workflowPath + } } } } diff --git a/packages/package-registry/src/jsr/models.ts b/packages/package-registry/src/jsr/models.ts new file mode 100644 index 0000000..6ff7df2 --- /dev/null +++ b/packages/package-registry/src/jsr/models.ts @@ -0,0 +1,14 @@ +import * as v from "valibot" + +export const JsrPackageMetadata = v.object({ + scope: v.string(), + name: v.string(), + latest: v.string(), + versions: v.record( + v.string(), + v.object({ + yanked: v.optional(v.boolean()) + }) + ) +}) +export type JsrPackageMetadata = v.InferOutput diff --git a/packages/package-registry/src/models.ts b/packages/package-registry/src/models.ts new file mode 100644 index 0000000..32bccc4 --- /dev/null +++ b/packages/package-registry/src/models.ts @@ -0,0 +1,60 @@ +import * as v from "valibot" + +export const RawRekorLogEntry = v.object({ + attestation: v.object({ data: v.string() }), + body: v.string(), + integratedTime: v.number(), + logID: v.string(), + logIndex: v.number(), + verification: v.object({ + inclusionProof: v.object({ + checkpoint: v.string(), + hashes: v.array(v.string()), + logIndex: v.number(), + rootHash: v.string(), + treeSize: v.number() + }), + signedEntryTimestamp: v.string() + }) +}) +export type RawRekorLogEntry = v.InferOutput +export const RawRekorLog = v.record(v.string(), RawRekorLogEntry) +export type RawRekorLog = v.InferOutput + +export const SigstoreAttestation = v.object({ + type: v.optional(v.string()), + subject: v.array( + v.object({ name: v.string(), digest: v.object({ sha256: v.optional(v.string()) }) }) + ), + predicateType: v.string(), + predicate: v.object({ + buildDefinition: v.object({ + buildType: v.string(), + resolvedDependencies: v.array( + v.object({ + uri: v.string(), + digest: v.object({ gitCommit: v.string() }) + }) + ), + internalParameters: v.object({ + github: v.object({ + eventName: v.optional(v.string()), + repositoryId: v.optional(v.string()), + repositoryOwnerId: v.optional(v.string()) + }) + }), + externalParameters: v.object({ + workflow: v.object({ + ref: v.string(), + repository: v.string(), + path: v.string() + }) + }) + }), + runDetails: v.object({ + builder: v.object({ id: v.string() }), + metadata: v.object({ invocationId: v.string() }) + }) + }) +}) +export type SigstoreAttestation = v.InferOutput diff --git a/packages/package-registry/src/npm/__tests__/api.test.ts b/packages/package-registry/src/npm/__tests__/api.test.ts new file mode 100644 index 0000000..a7ff86c --- /dev/null +++ b/packages/package-registry/src/npm/__tests__/api.test.ts @@ -0,0 +1,62 @@ +import { describe, expect, test } from "bun:test" +import * as v from "valibot" +import { + getFullNpmPackageInfo, + getNpmPackageInfoByVersion, + getNpmPackageTarballUrl, + getNpmPkgProvenance, + listPackagesOfMaintainer, + listPackagesOfScope, + npmPackageExists, + validateNpmPackageAsKunkunExtension +} from ".." +import { getTarballSize } from "../../utils" +import { NpmPkgMetadata, NpmPkgVersionMetadata, NpmSearchResultObject, Provenance } from "../models" + +describe("NPM API", () => { + const testPackages: string[] = [ + "react", + "axios", + "express", + "@tauri-apps/api", + "tauri-plugin-clipboard-api" + ] + test("get full npm package info", async () => { + for (const pkg of testPackages) { + const parsed = v.safeParse(NpmPkgMetadata, await getFullNpmPackageInfo(pkg)) + if (!parsed.success) { + console.log(v.flatten(parsed.issues)) + } + } + }) + + test("get npm package version info", async () => { + for (const pkg of testPackages) { + v.parse(NpmPkgVersionMetadata, await getNpmPackageInfoByVersion(pkg, "latest")) + } + }) + + test("get npm package provenance", async () => { + const provenance = await getNpmPkgProvenance("axios", "1.7.9") + expect(provenance).toBeDefined() + console.log(provenance?.summary.transparencyLogUri) + v.parse(Provenance, provenance) + }) + + test("list packages of maintainer", async () => { + const packages = await listPackagesOfMaintainer("huakunshen") + v.parse(v.array(NpmSearchResultObject), packages) + expect(packages.length).toBeGreaterThan(0) + }) + + test("list packages of scope", async () => { + const packages = await listPackagesOfScope("kksh") + v.parse(v.array(NpmSearchResultObject), packages) + expect(packages.length).toBeGreaterThan(0) + }) + + test("npm package exists", async () => { + expect(await npmPackageExists("kunkun-ext-ossinsight", "0.0.1")).toBe(true) + expect(await npmPackageExists("kunkun-ext-non-existing", "0.0.1")).toBe(false) + }) +}) diff --git a/packages/package-registry/src/npm/__tests__/ext.test.ts b/packages/package-registry/src/npm/__tests__/ext.test.ts new file mode 100644 index 0000000..898f8b4 --- /dev/null +++ b/packages/package-registry/src/npm/__tests__/ext.test.ts @@ -0,0 +1,55 @@ +import { describe, expect, test } from "bun:test" +import { validateNpmPackageAsKunkunExtension } from ".." + +describe("validate kunkun extension", () => { + test("A working extension", async () => { + const res = await validateNpmPackageAsKunkunExtension({ + pkgName: "kunkun-ext-ossinsight", + version: "0.0.1", + githubUsername: "huakunshen" + }) + expect(res.error).toBeUndefined() + expect(res.data?.github.commit).toBe("8af7eced43a5d240fa3390c7e297178ecb63c344") + expect(res.data?.github.owner).toBe("kunkunsh") + expect(res.data?.rekorLogIndex).toBe("162214778") + expect(res.data?.github.repo).toBe("kunkun-ext-ossinsight") + }) + + test("Extension without provenance", async () => { + expect( + ( + await validateNpmPackageAsKunkunExtension({ + pkgName: "tauri-plugin-clipboard-api", + version: "2.1.11", + githubUsername: "huakunshen" + }) + ).error + ).toBe("Package doesn't have provenance, not signed by github action") + }) + + test("Extension with wrong github username", async () => { + expect( + ( + await validateNpmPackageAsKunkunExtension({ + pkgName: "kunkun-ext-ossinsight", + version: "0.0.1", + githubUsername: "huakun" + }) + ).error + ).toBe( + "You (huakun) are not authorized to publish this package. Only kunkunsh or its organization members can publish it." + ) + }) + + test("Non existing package", async () => { + expect( + ( + await validateNpmPackageAsKunkunExtension({ + pkgName: "@kksh/non-existing-package", + version: "0.0.1", + githubUsername: "huakunshen" + }) + ).error + ).toBe("Package does not exist") + }) +}) diff --git a/packages/package-registry/src/npm/index.ts b/packages/package-registry/src/npm/index.ts new file mode 100644 index 0000000..097f742 --- /dev/null +++ b/packages/package-registry/src/npm/index.ts @@ -0,0 +1,253 @@ +import { ExtPackageJson } from "@kksh/api/models" +import * as v from "valibot" +import { + authenticatedUserIsMemberOfGitHubOrg, + parseGitHubRepoFromUri, + userIsPublicMemberOfGitHubOrg +} from "../github" +import { getInfoFromRekorLog } from "../sigstore" +import { + NpmPkgMetadata, + NpmPkgVersionMetadata, + NpmSearchResultObject, + NpmSearchResults, + Provenance +} from "./models" + +export * from "./models" + +/** + * Get the full metadata of an npm package + * @param pkgName + * @returns + */ +export function getFullNpmPackageInfo(pkgName: string): Promise { + return fetch(`https://registry.npmjs.org/${pkgName}`).then((res) => (res.ok ? res.json() : null)) +} + +/** + * Fetch the package.json data of an npm package + * @param pkgName + * @param version + * @returns + */ +export function getNpmPackageInfoByVersion( + pkgName: string, + version: string +): Promise { + return fetch(`https://registry.npmjs.org/${pkgName}/${version}`).then((res) => + res.ok ? res.json() : null + ) +} + +/** + * Get the provenance of an npm package + * If a package has no provenance, return null + * @param pkgName + * @param version + * @returns + */ +export function getNpmPkgProvenance(pkgName: string, version: string): Promise { + return fetch(`https://www.npmjs.com/package/${pkgName}/v/${version}/provenance`) + .then((res) => res.json()) + .catch((err) => null) +} + +/** + * List all packages under a scope + * @example + * To get package names under a scope, you can do: + * ```ts + * (await listPackagesOfMaintainer("huakunshen")).map((pkg) => pkg.package.name) + * ``` + * @param username npm organization or username + * @returns + */ +export function listPackagesOfMaintainer(username: string): Promise { + return fetch(`https://registry.npmjs.org/-/v1/search?text=maintainer:${username}&size=250`, { + headers: { + "sec-fetch-dest": "document" + } + }) + .then((res) => res.json()) + .then((res) => v.parse(NpmSearchResults, res).objects) +} + +export function listPackagesOfScope(scope: string): Promise { + return fetch(`https://registry.npmjs.org/-/v1/search?text=${scope}&size=250`, { + headers: { + "sec-fetch-dest": "document" + } + }) + .then((res) => res.json()) + .then((res) => v.parse(NpmSearchResults, res).objects) +} + +export function getNpmPackageTarballUrl( + pkgName: string, + version: string +): Promise { + return getNpmPackageInfoByVersion(pkgName, version).then((res) => res?.dist?.tarball) +} + +export function npmPackageExists(pkgName: string, version: string): Promise { + return getNpmPackageInfoByVersion(pkgName, version).then((res) => res !== null) +} + +/** + * @param url Sample URL: https://search.sigstore.dev/?logIndex=153252145 + * @returns + */ +function parseLogIdFromSigstoreSearchUrl(url: string): string { + const urlObj = new URL(url) + const logIndex = urlObj.searchParams.get("logIndex") + if (!logIndex) { + throw new Error("Could not parse log index from sigstore search url") + } + return logIndex +} + +export async function validateNpmPackageAsKunkunExtension(payload: { + pkgName: string + version: string + githubUsername: string + tarballSizeLimit?: number + githubToken?: string + provenance?: Provenance // provenance API has cors policy, when we run this validation on client side, a provenance should be passed in +}): Promise<{ + error?: string + data?: { + pkgJson: ExtPackageJson + tarballUrl: string + shasum: string + apiVersion: string + rekorLogIndex: string + tarballSize: number + github: { + githubActionInvocationId: string + commit: string + repo: string + owner: string + workflowPath: string + } + } +}> { + /* -------------------------------------------------------------------------- */ + /* check if npm package exist */ + /* -------------------------------------------------------------------------- */ + const pkgExists = await npmPackageExists(payload.pkgName, payload.version) + if (!pkgExists) { + return { error: "Package does not exist" } + } + if (!pkgExists) { + return { error: "NPM package does not exist" } + } + + /* -------------------------------------------------------------------------- */ + /* check if npm package has provenance */ + /* -------------------------------------------------------------------------- */ + const provenance = + payload.provenance ?? (await getNpmPkgProvenance(payload.pkgName, payload.version)) + if (!provenance) { + return { + error: "Package doesn't have provenance, not signed by github action" + } + } + if (provenance.sourceCommitUnreachable) { + return { error: "Package's source commit is unreachable" } + } + if (provenance.sourceCommitNotFound) { + return { error: "Package's source commit is not found" } + } + + /* -------------------------------------------------------------------------- */ + /* get rekor sigstore */ + /* -------------------------------------------------------------------------- */ + if (!provenance?.summary.transparencyLogUri) { + return { error: "Package's rekor log is not found" } + } + const logIndex = parseLogIdFromSigstoreSearchUrl(provenance.summary.transparencyLogUri) + const rekorGit = await getInfoFromRekorLog(logIndex) + if (rekorGit.commit !== provenance.summary.sourceRepositoryDigest) { + return { error: "Package's rekor log commit is not the same as the source commit" } + } + + /* -------------------------------------------------------------------------- */ + /* check if npm pkg is linked to github repo */ + /* -------------------------------------------------------------------------- */ + const repoUri = provenance.summary.sourceRepositoryUri + const githubRepo = parseGitHubRepoFromUri(repoUri) + + /* -------------------------------------------------------------------------- */ + /* Verify Repo Ownership */ + /* -------------------------------------------------------------------------- */ + if (githubRepo.owner !== payload.githubUsername) { + const isPublicMemeber = await userIsPublicMemberOfGitHubOrg( + githubRepo.owner, + payload.githubUsername + ) + let isOrgMember = false + if (payload.githubToken) { + isOrgMember = await authenticatedUserIsMemberOfGitHubOrg( + githubRepo.owner, + payload.githubToken + ) + } + if (!isPublicMemeber && !isOrgMember) { + return { + error: `You (${payload.githubUsername}) are not authorized to publish this package. Only ${githubRepo.owner} or its organization members can publish it.` + } + } + } + + /* -------------------------------------------------------------------------- */ + /* validate package.json format against latest schema */ + /* -------------------------------------------------------------------------- */ + + const packageJson = await getNpmPackageInfoByVersion(payload.pkgName, payload.version) + if (!packageJson) { + return { error: "Could not find package.json in NPM package" } + } + + const parseResult = v.safeParse(ExtPackageJson, packageJson) + if (!parseResult.success) { + console.log(v.flatten(parseResult.issues)) + return { error: `package.json format not valid` } + } + /* -------------------------------------------------------------------------- */ + /* get more package info */ + /* -------------------------------------------------------------------------- */ + const tarballUrl = packageJson.dist?.tarball + if (!tarballUrl) { + return { error: "Could not get tarball URL for NPM package" } + } + const shasum = packageJson.dist?.shasum + if (!shasum) { + return { error: "Could not get shasum for NPM package" } + } + + const apiVersion = parseResult.output.dependencies?.["@kksh/api"] + if (!apiVersion) { + return { + error: `Extension ${parseResult.output.kunkun.identifier} doesn't not have @kksh/api as a dependency` + } + } + + return { + data: { + pkgJson: parseResult.output, + tarballUrl, + shasum, + apiVersion, + tarballSize: 0, + rekorLogIndex: logIndex, + github: { + githubActionInvocationId: rekorGit.githubActionInvocationId, + commit: provenance.summary.sourceRepositoryDigest, + repo: githubRepo.repo, + owner: githubRepo.owner, + workflowPath: rekorGit.workflowPath + } + } + } +} diff --git a/packages/package-registry/src/npm/models.ts b/packages/package-registry/src/npm/models.ts new file mode 100644 index 0000000..86a95b8 --- /dev/null +++ b/packages/package-registry/src/npm/models.ts @@ -0,0 +1,142 @@ +import * as v from "valibot" + +export const NpmPkgVersionMetadata = v.object({ + name: v.string(), + type: v.optional(v.string()), + license: v.optional(v.string()), + version: v.string(), + description: v.optional(v.string()), + dist: v.optional( + v.object({ + integrity: v.string(), + shasum: v.optional(v.string()), + tarball: v.string(), + fileCount: v.optional(v.number()), + unpackedSize: v.optional(v.number()), + attestations: v.optional( + v.object({ + url: v.string(), + provenance: v.object({ + predicateType: v.string() + }) + }) + ), + signatures: v.optional( + v.array( + v.object({ + keyid: v.string(), + sig: v.string() + }) + ) + ) + }) + ), + gitHead: v.optional(v.string()), + _npmUser: v.optional( + v.object({ + name: v.string(), + email: v.string() + }) + ), + maintainers: v.optional( + v.array( + v.object({ + name: v.string(), + email: v.string() + }) + ) + ) +}) +export type NpmPkgVersionMetadata = v.InferOutput + +/** + * Full metadata of an npm package + * Sample URL: https://registry.npmjs.org/@huakunshen/jsr-client + */ +export const NpmPkgMetadata = v.object({ + name: v.string(), + description: v.optional(v.string()), + "dist-tags": v.record(v.string(), v.string()), // latest, next, beta, rc + versions: v.record(v.string(), NpmPkgVersionMetadata), + time: v.objectWithRest( + { + created: v.string(), + modified: v.string() + }, + v.string() + ) +}) +export type NpmPkgMetadata = v.InferOutput + +export const Provenance = v.object({ + summary: v.object({ + subjectAlternativeName: v.string(), + certificateIssuer: v.string(), + issuer: v.string(), + issuerDisplayName: v.string(), + buildTrigger: v.string(), + buildConfigUri: v.string(), + sourceRepositoryUri: v.string(), + sourceRepositoryDigest: v.string(), + sourceRepositoryRef: v.string(), + runInvocationUri: v.string(), + expiresAt: v.string(), + includedAt: v.string(), + resolvedSourceRepositoryCommitUri: v.string(), + transparencyLogUri: v.string(), + buildConfigDisplayName: v.string(), + resolvedBuildConfigUri: v.string(), + artifactName: v.string() + }), + sourceCommitResponseCode: v.number(), + sourceCommitUnreachable: v.boolean(), + sourceCommitNotFound: v.boolean() +}) +export type Provenance = v.InferOutput + +export const NpmSearchResultObject = v.object({ + downloads: v.object({ + monthly: v.number(), + weekly: v.number() + }), + dependents: v.number(), + updated: v.string(), + searchScore: v.number(), + package: v.object({ + name: v.string(), + keywords: v.array(v.string()), + version: v.string(), + description: v.optional(v.string()), + publisher: v.object({ + email: v.string(), + username: v.string() + }), + maintainers: v.array( + v.object({ + email: v.string(), + username: v.string() + }) + ), + license: v.optional(v.string()), + date: v.string(), + links: v.object({ + npm: v.string() + }) + }), + score: v.object({ + final: v.number(), + detail: v.object({ + popularity: v.number(), + quality: v.number(), + maintenance: v.number() + }), + flags: v.optional( + v.object({ + insecure: v.number() + }) + ) + }) +}) +export type NpmSearchResultObject = v.InferOutput +export const NpmSearchResults = v.object({ objects: v.array(NpmSearchResultObject) }) +export type NpmSearchResults = v.InferOutput diff --git a/packages/package-registry/src/sigstore.ts b/packages/package-registry/src/sigstore.ts new file mode 100644 index 0000000..9992642 --- /dev/null +++ b/packages/package-registry/src/sigstore.ts @@ -0,0 +1,67 @@ +import * as v from "valibot" +import { SigstoreAttestation, type RawRekorLog, type RawRekorLogEntry } from "./models" + +export function getRekorLogId(logIndex: string): Promise { + return fetch(`https://rekor.sigstore.dev/api/v1/log/entries?logIndex=${logIndex}`).then((res) => + res.json() + ) +} + +/** + * For our use case (JSR), we expect only one entry in the rekor log, so we can just return the first one + * If there are multiple entries, we throw an error + * @param rekorLog + * @returns + */ +export function parseTheOnlyRecord(rekorLog: RawRekorLog): RawRekorLogEntry { + const entryUUIDs = Object.keys(rekorLog) + if (entryUUIDs.length !== 1) { + throw new Error("Expected exactly one entry in the rekor log") + } + return rekorLog[entryUUIDs[0]] +} + +/** + * Attestation data is base64 encoded, so we need to decode it and parse it with valibot + * @param rekorLog + * @returns + */ +export function parseAttestation(rekorLog: RawRekorLogEntry): SigstoreAttestation { + const attestationData = rekorLog.attestation.data + const decoded = atob(attestationData) + const decodedJson = JSON.parse(decoded) + const parsed = v.safeParse(SigstoreAttestation, decodedJson) + if (!parsed.success) { + console.error(v.flatten(parsed.issues)) + throw new Error("Failed to parse rekor log attestation") + } + return parsed.output +} + +/** + * We expect only one entry in the rekor log, and there should be only one commit in the attestation + * @param logIndex + * @returns + */ +export async function getInfoFromRekorLog(logIndex: string): Promise<{ + commit: string + githubActionInvocationId: string + workflowPath: string + workflowRepository: string +}> { + const rawLog = await getRekorLogId(logIndex) + const record = parseTheOnlyRecord(rawLog) + const attestation = parseAttestation(record) + if (attestation.predicate.buildDefinition.resolvedDependencies.length !== 1) { + throw new Error( + `Expected exactly one commit in the attestation, got: ${attestation.predicate.buildDefinition.resolvedDependencies.length}` + ) + } + + return { + commit: attestation.predicate.buildDefinition.resolvedDependencies[0].digest.gitCommit, + githubActionInvocationId: attestation.predicate.runDetails.metadata.invocationId, + workflowPath: attestation.predicate.buildDefinition.externalParameters.workflow.path, + workflowRepository: attestation.predicate.buildDefinition.externalParameters.workflow.repository + } +} diff --git a/packages/package-registry/src/utils.ts b/packages/package-registry/src/utils.ts new file mode 100644 index 0000000..30c9f75 --- /dev/null +++ b/packages/package-registry/src/utils.ts @@ -0,0 +1,13 @@ +/** + * Get the tarball size of a package + * @param url tarball url, can technically be any url + * @returns tarball size in bytes + */ +export function getTarballSize(url: string): Promise { + return fetch(url, { method: "HEAD" }).then((res) => { + if (!(res.ok && res.status === 200)) { + throw new Error("Failed to fetch tarball size") + } + return Number(res.headers.get("Content-Length")) + }) +} diff --git a/packages/package-registry/tsconfig.json b/packages/package-registry/tsconfig.json new file mode 100644 index 0000000..238655f --- /dev/null +++ b/packages/package-registry/tsconfig.json @@ -0,0 +1,27 @@ +{ + "compilerOptions": { + // Enable latest features + "lib": ["ESNext", "DOM"], + "target": "ESNext", + "module": "ESNext", + "moduleDetection": "force", + "jsx": "react-jsx", + "allowJs": true, + + // Bundler mode + "moduleResolution": "bundler", + "allowImportingTsExtensions": true, + "verbatimModuleSyntax": true, + "noEmit": true, + + // Best practices + "strict": true, + "skipLibCheck": true, + "noFallthroughCasesInSwitch": true, + + // Some stricter flags (disabled by default) + "noUnusedLocals": false, + "noUnusedParameters": false, + "noPropertyAccessFromIndexSignature": false + } +} diff --git a/packages/supabase/src/models.ts b/packages/supabase/src/models.ts index 1f03b32..679907b 100644 --- a/packages/supabase/src/models.ts +++ b/packages/supabase/src/models.ts @@ -2,17 +2,25 @@ * @module @kksh/supabase/models * This module contains some models for supabase database that cannot be code generated, such as JSON fields. */ -import * as v from "valibot"; +import * as v from "valibot" export enum ExtPublishSourceTypeEnum { - jsr = "jsr", - npm = "npm", + jsr = "jsr", + npm = "npm" } export const ExtPublishMetadata = v.object({ - source: v.optional( - v.string("Source of the extension (e.g. url to package)"), - ), - sourceType: v.optional(v.enum(ExtPublishSourceTypeEnum)), -}); -export type ExtPublishMetadata = v.InferOutput; + source: v.optional(v.string("Source of the extension (e.g. url to package)")), + sourceType: v.optional(v.enum(ExtPublishSourceTypeEnum)), + rekorLogIndex: v.optional(v.string("Rekor log index of the extension")), + git: v.optional( + v.object({ + githubActionInvocationId: v.string("GitHub action invocation ID"), + repo: v.string("GitHub repo of the extension"), + owner: v.string("GitHub owner of the extension"), + commit: v.string("Commit hash of the extension"), + workflowPath: v.string("Workflow path of the extension") + }) + ) +}) +export type ExtPublishMetadata = v.InferOutput diff --git a/packages/templates/template-ext-react/src/App.tsx b/packages/templates/template-ext-react/src/App.tsx index 06e5dd3..0a3858b 100644 --- a/packages/templates/template-ext-react/src/App.tsx +++ b/packages/templates/template-ext-react/src/App.tsx @@ -3,7 +3,6 @@ import { ActionPanel, Button, Command, - CommandDemo, CommandEmpty, CommandFooter, CommandGroup, @@ -12,10 +11,7 @@ import { CommandList, CommandSeparator, CommandShortcut, - ThemeCustomizer, ThemeProvider, - ThemeWrapper, - TooltipProvider, VertifcalSeparator } from "@kksh/react" import { diff --git a/packages/templates/template-ext-sveltekit/components.json b/packages/templates/template-ext-sveltekit/components.json index 5a53aa5..3ceaad9 100644 --- a/packages/templates/template-ext-sveltekit/components.json +++ b/packages/templates/template-ext-sveltekit/components.json @@ -11,4 +11,4 @@ "utils": "$lib/utils" }, "typescript": true -} \ No newline at end of file +} diff --git a/packages/templates/template-ext-sveltekit/src/app.css b/packages/templates/template-ext-sveltekit/src/app.css index 117997f..dc56d5c 100644 --- a/packages/templates/template-ext-sveltekit/src/app.css +++ b/packages/templates/template-ext-sveltekit/src/app.css @@ -1,4 +1,4 @@ -@import url("@kksh/svelte5/themes"); +@import url('@kksh/svelte5/themes'); @tailwind base; @tailwind components; @tailwind utilities; @@ -77,4 +77,4 @@ body { @apply bg-background text-foreground; } -} \ No newline at end of file +} diff --git a/packages/ui/eslint.config.js b/packages/ui/eslint.config.js new file mode 100644 index 0000000..4457392 --- /dev/null +++ b/packages/ui/eslint.config.js @@ -0,0 +1,42 @@ +import js from "@eslint/js" +import prettier from "eslint-config-prettier" +import svelte from "eslint-plugin-svelte" +import globals from "globals" +import ts from "typescript-eslint" + +export default ts.config( + js.configs.recommended, + ...ts.configs.recommended, + ...svelte.configs["flat/recommended"], + prettier, + ...svelte.configs["flat/prettier"], + { + languageOptions: { + globals: { + ...globals.browser, + ...globals.node + } + } + }, + { + files: ["**/*.svelte"], + + languageOptions: { + parserOptions: { + parser: ts.parser + } + } + }, + { + ignores: ["build/", ".svelte-kit/", "dist/", "src/components/ui/"] + }, + { + rules: { + "no-unused-vars": "off", + "@typescript-eslint/no-unused-vars": "off", + // The following 2 rules are disabled because they cause errors that I am unable to solve + "@typescript-eslint/no-unused-expressions": "off", + "svelte/no-inner-declarations": "off", + } + } +) diff --git a/packages/ui/package.json b/packages/ui/package.json index 54e9819..2989a73 100644 --- a/packages/ui/package.json +++ b/packages/ui/package.json @@ -37,17 +37,23 @@ "svelte": "^5.0.0" }, "devDependencies": { + "@eslint/js": "^9.18.0", "@iconify/svelte": "^4.2.0", "@kksh/api": "workspace:*", "@kksh/svelte5": "^0.1.14", "@types/bun": "latest", + "@typescript-eslint/eslint-plugin": "^8.20.0", + "@typescript-eslint/parser": "^8.20.0", "bits-ui": "1.0.0-next.77", "clsx": "^2.1.1", + "eslint-config-prettier": "^10.0.1", + "eslint-plugin-svelte": "^2.46.1", "formsnap": "2.0.0-next.1", - "lucide-svelte": "^0.469.0", + "globals": "^15.14.0", + "lucide-svelte": "^0.471.0", "mode-watcher": "^0.5.0", "paneforge": "1.0.0-next.2", - "shiki": "^1.26.1", + "shiki": "^1.27.2", "svelte-radix": "^2.0.1", "svelte-sonner": "^0.3.28", "sveltekit-superforms": "^2.22.1", @@ -56,14 +62,18 @@ "tailwindcss": "^3.4.17", "tailwindcss-animate": "^1.0.7", "tauri-plugin-shellx-api": "^2.0.14", + "typescript-eslint": "^8.20.0", "zod": "^3.24.1" }, "dependencies": { "@formkit/auto-animate": "^0.8.2", - "@internationalized/date": "^3.6.0", + "@internationalized/date": "^3.7.0", + "@kksh/supabase": "workspace:*", "@std/semver": "npm:@jsr/std__semver@^1.0.3", - "gsap": "^3.12.5", + "dompurify": "^3.2.3", + "gsap": "^3.12.7", "shiki-magic-move": "^0.5.2", - "svelte-markdown": "^0.4.1" + "svelte-markdown": "^0.4.1", + "valibot": "1.0.0-beta.12" } } diff --git a/packages/ui/src/components/common/ElementAlert.svelte b/packages/ui/src/components/common/ElementAlert.svelte index c069e3d..5779f31 100644 --- a/packages/ui/src/components/common/ElementAlert.svelte +++ b/packages/ui/src/components/common/ElementAlert.svelte @@ -112,7 +112,6 @@ onclick={() => { if (onClose) { onClose() - } else { } show = false }} diff --git a/packages/ui/src/components/common/IconMultiplexer.svelte b/packages/ui/src/components/common/IconMultiplexer.svelte index 9c68df9..dd7380a 100644 --- a/packages/ui/src/components/common/IconMultiplexer.svelte +++ b/packages/ui/src/components/common/IconMultiplexer.svelte @@ -3,6 +3,8 @@ import { IconEnum, IconType, Icon as TIcon } from "@kksh/api/models" import { Button } from "@kksh/svelte5" import { cn } from "@kksh/ui/utils" + import DOMPurify from "dompurify" + import { onMount } from "svelte" import * as v from "valibot" import { styleObjectToString } from "../../utils/style" @@ -12,8 +14,8 @@ icon, class: className, ...restProps - }: { icon: TIcon; class?: string; [key: string]: any } = $props() - + }: { icon: TIcon; class?: string; "data-flip-id"?: string } = $props() + let cleanedSvg: string | undefined = $state() let remoteIconError = $state(false) function fillHexColor(style: Record, key: string, value?: string) { @@ -34,6 +36,12 @@ }) let style = $derived(styleObjectToString(customStyle)) + + onMount(() => { + if (icon.type === IconEnum.Svg) { + cleanedSvg = DOMPurify.sanitize(icon.value) + } + }) {#if icon.type === IconEnum.RemoteUrl} @@ -89,8 +97,11 @@ {@html icon.value} + + {@html cleanedSvg} + {:else} + import { Card } from "@kksh/svelte5" + import { BadgeCheckIcon } from "lucide-svelte" + + let { + repoOwner, + repoName, + githubActionInvocationId, + commit, + rekorLogIndex, + workflowPath + }: { + repoOwner: string + repoName: string + githubActionInvocationId: string + commit: string + rekorLogIndex: string + workflowPath: string + } = $props() + const workflowRunId = githubActionInvocationId.split("/").at(-3) + const workflowRunUrl = `https://github.com/${repoOwner}/${repoName}/actions/runs/${workflowRunId}/workflow` + + + + +
+ +
+ Built and signed on +

GitHub Actions

+ + View build summary + +
+
+ +
+
diff --git a/packages/ui/src/components/extension/StoreExtDetail.svelte b/packages/ui/src/components/extension/StoreExtDetail.svelte index b29a909..bcba737 100644 --- a/packages/ui/src/components/extension/StoreExtDetail.svelte +++ b/packages/ui/src/components/extension/StoreExtDetail.svelte @@ -3,12 +3,15 @@ import Icon from "@iconify/svelte" import { ExtPackageJson, IconEnum, KunkunExtManifest } from "@kksh/api/models" import { type Tables } from "@kksh/api/supabase/types" - import { Button, ScrollArea, Separator } from "@kksh/svelte5" + import { ExtPublishMetadata, ExtPublishSourceTypeEnum } from "@kksh/supabase/models" + import { Badge, Button, ScrollArea, Separator } from "@kksh/svelte5" import { Constants, IconMultiplexer } from "@kksh/ui" import { cn } from "@kksh/ui/utils" import { CircleCheckBigIcon, MoveRightIcon, Trash2Icon } from "lucide-svelte" + import * as v from "valibot" import DialogImageCarousel from "../common/DialogImageCarousel.svelte" import PlatformsIcons from "../common/PlatformsIcons.svelte" + import GitHubProvenanceCard from "./GitHubProvenanceCard.svelte" import PermissionInspector from "./PermissionInspector.svelte" let { @@ -55,6 +58,15 @@ onEnterPressed?.() } } + + const metadata = $derived.by(() => { + const parseRes = v.safeParse(ExtPublishMetadata, ext.metadata) + if (!parseRes.success) { + console.error(v.flatten(parseRes.issues)) + return + } + return parseRes.output + }) @@ -114,28 +126,62 @@ {/if} {/snippet} -
-
- - - -
- - {manifest?.name} - {#if isInstalled} - - {/if} +
+
+ + -
{ext.identifier}
-
Version: {ext.version}
+
+ + {manifest?.name} + {#if isInstalled} + + {/if} + +
{ext.identifier}
+
Version: {ext.version}
+
+
+
+ {#if metadata && metadata.sourceType === ExtPublishSourceTypeEnum.jsr} + + + + {:else if metadata && metadata.sourceType === ExtPublishSourceTypeEnum.npm} + + + + {/if} + {#if metadata && metadata?.git?.commit && metadata?.rekorLogIndex && metadata?.git?.owner && metadata?.git?.repo} + + + + {metadata.git.owner}/{metadata.git.repo} + + + {/if}
+ {#if metadata && metadata?.git?.commit && metadata?.rekorLogIndex && metadata?.git?.owner && metadata?.git?.repo} + + + {/if} {#if demoImages.length > 0} {#if manifest} - {#each [...manifest.customUiCmds, ...manifest.templateUiCmds] as cmd} + {#each [...(manifest.customUiCmds ?? []), ...(manifest.templateUiCmds ?? [])] as cmd}
  • {#if manifest} diff --git a/packages/ui/src/components/extension/index.ts b/packages/ui/src/components/extension/index.ts index eb6a72c..2872d23 100644 --- a/packages/ui/src/components/extension/index.ts +++ b/packages/ui/src/components/extension/index.ts @@ -2,4 +2,5 @@ export { default as ExtListItem } from "./ExtListItem.svelte" export { default as StoreExtDetail } from "./StoreExtDetail.svelte" export { default as PermissionInspector } from "./PermissionInspector.svelte" export { default as JsrPackageVersionTable } from "./publish/jsr/jsr-package-version-table.svelte" +export { default as NpmPackageVersionTable } from "./publish/npm/npm-package-version-table.svelte" export * as Templates from "./templates" diff --git a/packages/ui/src/components/extension/publish/jsr/jsr-package-version-table.svelte b/packages/ui/src/components/extension/publish/jsr/jsr-package-version-table.svelte index aca72b6..9d9cc0e 100644 --- a/packages/ui/src/components/extension/publish/jsr/jsr-package-version-table.svelte +++ b/packages/ui/src/components/extension/publish/jsr/jsr-package-version-table.svelte @@ -23,6 +23,7 @@ publishedVersions: string[] } = $props() + All versions of the package diff --git a/packages/ui/src/components/extension/publish/npm/npm-package-version-table.svelte b/packages/ui/src/components/extension/publish/npm/npm-package-version-table.svelte new file mode 100644 index 0000000..0fbba99 --- /dev/null +++ b/packages/ui/src/components/extension/publish/npm/npm-package-version-table.svelte @@ -0,0 +1,2 @@ + diff --git a/packages/ui/src/components/extension/templates/form.svelte b/packages/ui/src/components/extension/templates/form.svelte index a719736..b9b2ef0 100644 --- a/packages/ui/src/components/extension/templates/form.svelte +++ b/packages/ui/src/components/extension/templates/form.svelte @@ -18,7 +18,7 @@ }: { formViewContent: FormSchema.Form class?: string - onSubmit?: (formData: Record) => void + onSubmit?: (formData: Record) => void } = $props() const formSchema = $derived(buildFormSchema(formViewContent)) onMount(() => { diff --git a/packages/ui/src/components/layouts/center.svelte b/packages/ui/src/components/layouts/center.svelte index a9d347b..8cd1456 100644 --- a/packages/ui/src/components/layouts/center.svelte +++ b/packages/ui/src/components/layouts/center.svelte @@ -6,6 +6,7 @@ children, class: className, ...restProps + // eslint-disable-next-line @typescript-eslint/no-explicit-any }: { children: Snippet; class?: string; [key: string]: any } = $props() diff --git a/packages/ui/src/utils/command-score.ts b/packages/ui/src/utils/command-score.ts index 0e6c837..9158f97 100644 --- a/packages/ui/src/utils/command-score.ts +++ b/packages/ui/src/utils/command-score.ts @@ -1,6 +1,6 @@ // This file is taken from https://github.com/huntabyte/bits-ui/blob/7f7bf6f6b736cf34e57a0d87aab01074c33efd46/packages/bits-ui/src/lib/bits/command/command.svelte.ts#L1 -// eslint-disable-next-line ts/ban-ts-comment +// eslint-disable-next-line // @ts-nocheck // The scores are arranged so that a continuous match of characters will // result in a total score of 1. diff --git a/packages/ui/src/utils/form.ts b/packages/ui/src/utils/form.ts index 79031d6..afc45de 100644 --- a/packages/ui/src/utils/form.ts +++ b/packages/ui/src/utils/form.ts @@ -12,9 +12,11 @@ function addDefaultToSchema( return schema } +// eslint-disable-next-line @typescript-eslint/no-explicit-any export function buildFormSchema(form: FormSchema.Form): v.ObjectSchema { let schema = v.object({}) for (const field of form.fields) { + // eslint-disable-next-line @typescript-eslint/no-explicit-any let fieldSchema: any = undefined if (field.nodeName === FormNodeNameEnum.Input) { fieldSchema = v.string() diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index e768670..e147a74 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -89,7 +89,7 @@ importers: version: link:packages/api '@kksh/svelte5': specifier: 0.1.14 - version: 0.1.14(lucide-svelte@0.469.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.2))(typescript@5.7.2) + 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.2))(typescript@5.7.2) prettier: specifier: ^3.4.2 version: 3.4.2 @@ -111,6 +111,9 @@ importers: typescript: specifier: 5.7.2 version: 5.7.2 + verify-package-export: + specifier: ^0.0.2 + version: 0.0.2(typescript@5.7.2) apps/cli: dependencies: @@ -267,6 +270,9 @@ importers: specifier: ^11.0.3 version: 11.0.3 devDependencies: + '@eslint/js': + specifier: ^9.18.0 + version: 9.18.0 '@kksh/types': specifier: workspace:* version: link:../../packages/types @@ -300,6 +306,12 @@ importers: '@types/semver': specifier: ^7.5.8 version: 7.5.8 + '@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.6.3))(eslint@9.17.0(jiti@2.4.0))(typescript@5.6.3) + '@typescript-eslint/parser': + specifier: ^8.20.0 + version: 8.20.0(eslint@9.17.0(jiti@2.4.0))(typescript@5.6.3) autoprefixer: specifier: ^10.4.20 version: 10.4.20(postcss@8.4.49) @@ -309,9 +321,21 @@ importers: clsx: specifier: ^2.1.1 version: 2.1.1 + eslint-config-prettier: + specifier: ^9.1.0 + version: 9.1.0(eslint@9.17.0(jiti@2.4.0)) + eslint-plugin-svelte: + specifier: ^2.46.1 + version: 2.46.1(eslint@9.17.0(jiti@2.4.0))(svelte@5.16.6) + globals: + specifier: ^15.14.0 + version: 15.14.0 lucide-svelte: specifier: ^0.469.0 version: 0.469.0(svelte@5.16.6) + prettier: + specifier: ^3.4.2 + version: 3.4.2 svelte-radix: specifier: ^2.0.1 version: 2.0.1(svelte@5.16.6) @@ -333,6 +357,9 @@ importers: typescript: specifier: ^5.6.3 version: 5.6.3 + typescript-eslint: + specifier: ^8.20.0 + version: 8.20.0(eslint@9.17.0(jiti@2.4.0))(typescript@5.6.3) vite: specifier: ^6.0.3 version: 6.0.3(@types/node@22.10.5)(jiti@2.4.0)(terser@5.36.0)(yaml@2.6.1) @@ -341,7 +368,7 @@ importers: dependencies: '@huakunshen/jsr-client': specifier: ^0.1.5 - version: 0.1.5(axios@1.7.9)(react@18.3.1)(typescript@5.6.3) + version: 0.1.5(axios@1.7.9)(react@18.3.1)(typescript@5.7.2) '@octokit/rest': specifier: ^21.1.0 version: 21.1.0 @@ -392,7 +419,7 @@ importers: version: 2.2.1 kkrpc: specifier: ^0.0.13 - version: 0.0.13(typescript@5.6.3) + version: 0.0.13(typescript@5.7.2) lodash: specifier: ^4.17.21 version: 4.17.21 @@ -410,19 +437,19 @@ importers: version: 0.3.28(svelte@5.16.6) tauri-api-adapter: specifier: ^0.3.16 - version: 0.3.16(typescript@5.6.3) + version: 0.3.16(typescript@5.7.2) tauri-plugin-network-api: specifier: 2.0.5 - version: 2.0.5(typescript@5.6.3) + version: 2.0.5(typescript@5.7.2) tauri-plugin-shellx-api: specifier: ^2.0.14 version: 2.0.14 tauri-plugin-system-info-api: specifier: 2.0.8 - version: 2.0.8(typescript@5.6.3) + version: 2.0.8(typescript@5.7.2) valibot: specifier: ^1.0.0-beta.10 - version: 1.0.0-beta.10(typescript@5.6.3) + version: 1.0.0-beta.10(typescript@5.7.2) devDependencies: '@types/bun': specifier: latest @@ -444,13 +471,16 @@ importers: version: 11.2.0 madge: specifier: ^8.0.0 - version: 8.0.0(typescript@5.6.3) + version: 8.0.0(typescript@5.7.2) typedoc: specifier: ^0.27.6 - version: 0.27.6(typescript@5.6.3) + version: 0.27.6(typescript@5.7.2) typescript: specifier: ^5.0.0 - version: 5.6.3 + version: 5.7.2 + verify-package-export: + specifier: ^0.0.2 + version: 0.0.2(typescript@5.7.2) packages/ci: dependencies: @@ -468,20 +498,20 @@ importers: packages/config-eslint: dependencies: '@typescript-eslint/eslint-plugin': - specifier: ^8.15.0 - version: 8.15.0(@typescript-eslint/parser@8.15.0(eslint@9.17.0(jiti@2.4.0))(typescript@5.7.2))(eslint@9.17.0(jiti@2.4.0))(typescript@5.7.2) + 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.2))(eslint@9.17.0(jiti@2.4.0))(typescript@5.7.2) '@typescript-eslint/parser': - specifier: ^8.15.0 - version: 8.15.0(eslint@9.17.0(jiti@2.4.0))(typescript@5.7.2) + specifier: ^8.20.0 + version: 8.20.0(eslint@9.17.0(jiti@2.4.0))(typescript@5.7.2) eslint-config-prettier: - specifier: ^9.1.0 - version: 9.1.0(eslint@9.17.0(jiti@2.4.0)) + specifier: ^10.0.1 + version: 10.0.1(eslint@9.17.0(jiti@2.4.0)) eslint-config-turbo: - specifier: ^2.3.0 - version: 2.3.0(eslint@9.17.0(jiti@2.4.0)) + specifier: ^2.3.3 + version: 2.3.3(eslint@9.17.0(jiti@2.4.0)) eslint-plugin-svelte: - specifier: ^2.46.0 - version: 2.46.0(eslint@9.17.0(jiti@2.4.0))(svelte@5.16.6) + specifier: ^2.46.1 + version: 2.46.1(eslint@9.17.0(jiti@2.4.0))(svelte@5.16.6) packages/extension: dependencies: @@ -668,6 +698,28 @@ importers: specifier: ^2.3.0 version: 2.3.0 + packages/package-registry: + dependencies: + '@huakunshen/jsr-client': + specifier: ^0.1.5 + version: 0.1.5(axios@1.7.9)(react@18.3.1)(typescript@5.7.2) + '@kksh/api': + specifier: workspace:* + version: link:../api + '@octokit/rest': + specifier: ^21.1.0 + version: 21.1.0 + typescript: + specifier: ^5.0.0 + version: 5.7.2 + devDependencies: + '@types/bun': + specifier: latest + version: 1.1.16 + verify-package-export: + specifier: ^0.0.2 + version: 0.0.2(typescript@5.7.2) + packages/schema: dependencies: '@aws-sdk/client-s3': @@ -1111,24 +1163,36 @@ importers: specifier: ^0.8.2 version: 0.8.2 '@internationalized/date': - specifier: ^3.6.0 - version: 3.6.0 + specifier: ^3.7.0 + version: 3.7.0 + '@kksh/supabase': + specifier: workspace:* + version: link:../supabase '@std/semver': specifier: npm:@jsr/std__semver@^1.0.3 version: '@jsr/std__semver@1.0.3' + dompurify: + specifier: ^3.2.3 + version: 3.2.3 gsap: - specifier: ^3.12.5 - version: 3.12.5 + specifier: ^3.12.7 + version: 3.12.7 shiki-magic-move: specifier: ^0.5.2 - version: 0.5.2(react@18.3.1)(shiki@1.26.1)(svelte@5.16.6)(vue@3.5.13(typescript@5.7.2)) + version: 0.5.2(react@18.3.1)(shiki@1.27.2)(svelte@5.16.6)(vue@3.5.13(typescript@5.7.2)) svelte: specifier: ^5.0.0 version: 5.16.6 svelte-markdown: specifier: ^0.4.1 version: 0.4.1(svelte@5.16.6) + valibot: + specifier: 1.0.0-beta.12 + version: 1.0.0-beta.12(typescript@5.7.2) devDependencies: + '@eslint/js': + specifier: ^9.18.0 + version: 9.18.0 '@iconify/svelte': specifier: ^4.2.0 version: 4.2.0(svelte@5.16.6) @@ -1137,22 +1201,37 @@ importers: version: link:../api '@kksh/svelte5': specifier: ^0.1.14 - version: 0.1.14(lucide-svelte@0.469.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.2))(typescript@5.7.2) + 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.2))(typescript@5.7.2) '@types/bun': specifier: latest version: 1.1.16 + '@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.2))(eslint@9.17.0(jiti@2.4.0))(typescript@5.7.2) + '@typescript-eslint/parser': + specifier: ^8.20.0 + version: 8.20.0(eslint@9.17.0(jiti@2.4.0))(typescript@5.7.2) bits-ui: specifier: 1.0.0-next.77 version: 1.0.0-next.77(svelte@5.16.6) clsx: specifier: ^2.1.1 version: 2.1.1 + eslint-config-prettier: + specifier: ^10.0.1 + version: 10.0.1(eslint@9.17.0(jiti@2.4.0)) + eslint-plugin-svelte: + specifier: ^2.46.1 + version: 2.46.1(eslint@9.17.0(jiti@2.4.0))(svelte@5.16.6) formsnap: specifier: 2.0.0-next.1 version: 2.0.0-next.1(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.2)) + globals: + specifier: ^15.14.0 + version: 15.14.0 lucide-svelte: - specifier: ^0.469.0 - version: 0.469.0(svelte@5.16.6) + specifier: ^0.471.0 + version: 0.471.0(svelte@5.16.6) mode-watcher: specifier: ^0.5.0 version: 0.5.0(svelte@5.16.6) @@ -1160,8 +1239,8 @@ importers: specifier: 1.0.0-next.2 version: 1.0.0-next.2(svelte@5.16.6) shiki: - specifier: ^1.26.1 - version: 1.26.1 + specifier: ^1.27.2 + version: 1.27.2 svelte-radix: specifier: ^2.0.1 version: 2.0.1(svelte@5.16.6) @@ -1186,6 +1265,9 @@ importers: tauri-plugin-shellx-api: specifier: ^2.0.14 version: 2.0.14 + typescript-eslint: + specifier: ^8.20.0 + version: 8.20.0(eslint@9.17.0(jiti@2.4.0))(typescript@5.7.2) zod: specifier: ^3.24.1 version: 3.24.1 @@ -2228,6 +2310,10 @@ packages: resolution: {integrity: sha512-Sxc4hqcs1kTu0iID3kcZDW3JHq2a77HO9P8CP6YEA/FpH3Ll8UXE2r/86Rz9YJLKme39S9vU5OWNjC6Xl0Cr3w==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@eslint/js@9.18.0': + resolution: {integrity: sha512-fK6L7rxcq6/z+AaQMtiFTkvbHkBLNlwyRxHpKawP0x3u9+NC6MQTnFW+AdpwC6gfHTW0051cokQgtTN2FqlxQA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@eslint/object-schema@2.1.4': resolution: {integrity: sha512-BsWiH1yFGjXXS2yvrf5LyuoSIIbPrGUWob917o+BTKuZ7qJdxX8aJLRxs1fS9n6r7vESrq1OUqb68dANcFXuQQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -2490,6 +2576,9 @@ packages: '@internationalized/date@3.6.0': resolution: {integrity: sha512-+z6ti+CcJnRlLHok/emGEsWQhe7kfSmEW+/6qCzvKY67YPh7YOBfvc7+/+NXq+zJlbArg30tYpqLjNgcAYv2YQ==} + '@internationalized/date@3.7.0': + resolution: {integrity: sha512-VJ5WS3fcVx0bejE/YHfbDKR/yawZgKqn/if+oEeLqNwBtPzVB06olkfcnojTmEMX+gTpH+FlQ69SHNitJ8/erQ==} + '@internationalized/number@3.5.4': resolution: {integrity: sha512-h9huwWjNqYyE2FXZZewWqmCdkw1HeFds5q4Siuoms3hUQC5iPJK3aBmkFZoDSLN4UD0Bl8G22L/NdHpeOr+/7A==} @@ -2759,6 +2848,18 @@ packages: '@nuxtjs/tailwindcss@6.12.1': resolution: {integrity: sha512-UKmaPRVpxlFqLorhL6neEba2tySlsj6w6yDb7jzS6A0AAjyBQ6k3BQqWO+AaTy2iQLX7eR+1yj3/w43HzY8RtA==} + '@oclif/core@4.2.2': + resolution: {integrity: sha512-5jGzLDu96jG67G2sF21A3u67FJwSRnOnjaJwobiI7sgSg5uuVAHn4j1DahhfC4K7UEcXqXBBH064JyZ9yS4xHg==} + engines: {node: '>=18.0.0'} + + '@oclif/plugin-help@6.2.21': + resolution: {integrity: sha512-nUAnIR96QJvAAFzdJoq9iqInuwY9nxURNaAiGWGUtW5HgrwJOmoY1LqcobkzW89RH3NONtdWmc74sIupWmLtNw==} + engines: {node: '>=18.0.0'} + + '@oclif/plugin-plugins@5.4.25': + resolution: {integrity: sha512-44Yp532BuBoNrNYLf7wfp/2QkNY7ESdK3MgGi3GWCqW75apyX04+xC5RfRsz0KHOA9N7VFqn64PG+Ailo5TJyQ==} + engines: {node: '>=18.0.0'} + '@octokit/auth-token@5.1.1': resolution: {integrity: sha512-rh3G3wDO8J9wSjfI436JUKzHIxq8NaiL0tVeB2aXmG6p/9859aUOAjA9pmSPNGGZxfwmaJ9ozOJImuNVJdpvbA==} engines: {node: '>= 18'} @@ -4066,30 +4167,30 @@ packages: '@rushstack/eslint-patch@1.10.4': resolution: {integrity: sha512-WJgX9nzTqknM393q1QJDJmoW28kUfEnybeTfVNcNAPnIx210RXm2DiXiHzfNPJNIUUb1tJnz/l4QGtJ30PgWmA==} - '@shikijs/core@1.26.1': - resolution: {integrity: sha512-yeo7sG+WZQblKPclUOKRPwkv1PyoHYkJ4gP9DzhFJbTdueKR7wYTI1vfF/bFi1NTgc545yG/DzvVhZgueVOXMA==} + '@shikijs/core@1.27.2': + resolution: {integrity: sha512-ns1dokDr0KE1lQ9mWd4rqaBkhSApk0qGCK1+lOqwnkQSkVZ08UGqXj1Ef8dAcTMZNFkN6PSNjkL5TYNX7pyPbQ==} - '@shikijs/engine-javascript@1.26.1': - resolution: {integrity: sha512-CRhA0b8CaSLxS0E9A4Bzcb3LKBNpykfo9F85ozlNyArxjo2NkijtiwrJZ6eHa+NT5I9Kox2IXVdjUsP4dilsmw==} - - '@shikijs/engine-oniguruma@1.24.2': - resolution: {integrity: sha512-ZN6k//aDNWRJs1uKB12pturKHh7GejKugowOFGAuG7TxDRLod1Bd5JhpOikOiFqPmKjKEPtEA6mRCf7q3ulDyQ==} + '@shikijs/engine-javascript@1.27.2': + resolution: {integrity: sha512-0JB7U5vJc16NShBdxv9hSSJYSKX79+32O7F4oXIxJLdYfomyFvx4B982ackUI9ftO9T3WwagkiiD3nOxOOLiGA==} '@shikijs/engine-oniguruma@1.26.1': resolution: {integrity: sha512-F5XuxN1HljLuvfXv7d+mlTkV7XukC1cawdtOo+7pKgPD83CAB1Sf8uHqP3PK0u7njFH0ZhoXE1r+0JzEgAQ+kg==} - '@shikijs/langs@1.26.1': - resolution: {integrity: sha512-oz/TQiIqZejEIZbGtn68hbJijAOTtYH4TMMSWkWYozwqdpKR3EXgILneQy26WItmJjp3xVspHdiUxUCws4gtuw==} + '@shikijs/engine-oniguruma@1.27.2': + resolution: {integrity: sha512-FZYKD1KN7srvpkz4lbGLOYWlyDU4Rd+2RtuKfABTkafAPOFr+J6umfIwY/TzOQqfNtWjL7SAwPAO0dcOraRLaQ==} - '@shikijs/themes@1.26.1': - resolution: {integrity: sha512-JDxVn+z+wgLCiUhBGx2OQrLCkKZQGzNH3nAxFir4PjUcYiyD8Jdms9izyxIogYmSwmoPTatFTdzyrRKbKlSfPA==} + '@shikijs/langs@1.27.2': + resolution: {integrity: sha512-MSrknKL0DbeXvhtSigMLIzjPOOQfvK7fsbcRv2NUUB0EvuTTomY8/U+lAkczYrXY2+dygKOapJKk8ScFYbtoNw==} - '@shikijs/types@1.24.2': - resolution: {integrity: sha512-bdeWZiDtajGLG9BudI0AHet0b6e7FbR0EsE4jpGaI0YwHm/XJunI9+3uZnzFtX65gsyJ6ngCIWUfA4NWRPnBkQ==} + '@shikijs/themes@1.27.2': + resolution: {integrity: sha512-Yw/uV7EijjWavIIZLoWneTAohcbBqEKj6XMX1bfMqO3llqTKsyXukPp1evf8qPqzUHY7ibauqEaQchhfi857mg==} '@shikijs/types@1.26.1': resolution: {integrity: sha512-d4B00TKKAMaHuFYgRf3L0gwtvqpW4hVdVwKcZYbBfAAQXspgkbWqnFfuFl3MDH6gLbsubOcr+prcnsqah3ny7Q==} + '@shikijs/types@1.27.2': + resolution: {integrity: sha512-DM9OWUyjmdYdnKDpaGB/GEn9XkToyK1tqxuqbmc5PV+5K8WjjwfygL3+cIvbkSw2v1ySwHDgqATq/+98pJ4Kyg==} + '@shikijs/vscode-textmate@10.0.1': resolution: {integrity: sha512-fTIQwLF+Qhuws31iw7Ncl1R3HUDtGwIipiJ9iU+UsDUwMhegFcQKQHd51nZjb7CArq0MvON8rbgCGQYWHUKAdg==} @@ -4985,19 +5086,16 @@ packages: typescript: optional: true - '@typescript-eslint/eslint-plugin@8.15.0': - resolution: {integrity: sha512-+zkm9AR1Ds9uLWN3fkoeXgFppaQ+uEVtfOV62dDmsy9QCNqlRHWNEck4yarvRNrvRcHQLGfqBNui3cimoz8XAg==} + '@typescript-eslint/eslint-plugin@8.19.1': + resolution: {integrity: sha512-tJzcVyvvb9h/PB96g30MpxACd9IrunT7GF9wfA9/0TJ1LxGOJx1TdPzSbBBnNED7K9Ka8ybJsnEpiXPktolTLg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: '@typescript-eslint/parser': ^8.0.0 || ^8.0.0-alpha.0 eslint: ^8.57.0 || ^9.0.0 - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true + typescript: '>=4.8.4 <5.8.0' - '@typescript-eslint/eslint-plugin@8.19.1': - resolution: {integrity: sha512-tJzcVyvvb9h/PB96g30MpxACd9IrunT7GF9wfA9/0TJ1LxGOJx1TdPzSbBBnNED7K9Ka8ybJsnEpiXPktolTLg==} + '@typescript-eslint/eslint-plugin@8.20.0': + resolution: {integrity: sha512-naduuphVw5StFfqp4Gq4WhIBE2gN1GEmMUExpJYknZJdRnc+2gDzB8Z3+5+/Kv33hPQRDGzQO/0opHE72lZZ6A==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: '@typescript-eslint/parser': ^8.0.0 || ^8.0.0-alpha.0 @@ -5014,18 +5112,15 @@ packages: typescript: optional: true - '@typescript-eslint/parser@8.15.0': - resolution: {integrity: sha512-7n59qFpghG4uazrF9qtGKBZXn7Oz4sOMm8dwNWDQY96Xlm2oX67eipqcblDj+oY1lLCbf1oltMZFpUso66Kl1A==} + '@typescript-eslint/parser@8.19.1': + resolution: {integrity: sha512-67gbfv8rAwawjYx3fYArwldTQKoYfezNUT4D5ioWetr/xCrxXxvleo3uuiFuKfejipvq+og7mjz3b0G2bVyUCw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true + typescript: '>=4.8.4 <5.8.0' - '@typescript-eslint/parser@8.19.1': - resolution: {integrity: sha512-67gbfv8rAwawjYx3fYArwldTQKoYfezNUT4D5ioWetr/xCrxXxvleo3uuiFuKfejipvq+og7mjz3b0G2bVyUCw==} + '@typescript-eslint/parser@8.20.0': + resolution: {integrity: sha512-gKXG7A5HMyjDIedBi6bUrDcun8GIjnI8qOwVLiY3rx6T/sHP/19XLJOnIq/FgQvWLHja5JN/LSE7eklNBr612g==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 @@ -5035,14 +5130,14 @@ packages: resolution: {integrity: sha512-jjhdIE/FPF2B7Z1uzc6i3oWKbGcHb87Qw7AWj6jmEqNOfDFbJWtjt/XfwCpvNkpGWlcJaog5vTR+VV8+w9JflA==} engines: {node: ^18.18.0 || >=20.0.0} - '@typescript-eslint/scope-manager@8.15.0': - resolution: {integrity: sha512-QRGy8ADi4J7ii95xz4UoiymmmMd/zuy9azCaamnZ3FM8T5fZcex8UfJcjkiEZjJSztKfEBe3dZ5T/5RHAmw2mA==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/scope-manager@8.19.1': resolution: {integrity: sha512-60L9KIuN/xgmsINzonOcMDSB8p82h95hoBfSBtXuO4jlR1R9L1xSkmVZKgCPVfavDlXihh4ARNjXhh1gGnLC7Q==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@typescript-eslint/scope-manager@8.20.0': + resolution: {integrity: sha512-J7+VkpeGzhOt3FeG1+SzhiMj9NzGD/M6KoGn9f4dbz3YzK9hvbhVTmLj/HiTp9DazIzJ8B4XcM80LrR9Dm1rJw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@typescript-eslint/type-utils@7.18.0': resolution: {integrity: sha512-XL0FJXuCLaDuX2sYqZUUSOJ2sG5/i1AAze+axqmLnSkNEVMVYLF+cbwlB2w8D1tinFuSikHmFta+P+HOofrLeA==} engines: {node: ^18.18.0 || >=20.0.0} @@ -5053,18 +5148,15 @@ packages: typescript: optional: true - '@typescript-eslint/type-utils@8.15.0': - resolution: {integrity: sha512-UU6uwXDoI3JGSXmcdnP5d8Fffa2KayOhUUqr/AiBnG1Gl7+7ut/oyagVeSkh7bxQ0zSXV9ptRh/4N15nkCqnpw==} + '@typescript-eslint/type-utils@8.19.1': + resolution: {integrity: sha512-Rp7k9lhDKBMRJB/nM9Ksp1zs4796wVNyihG9/TU9R6KCJDNkQbc2EOKjrBtLYh3396ZdpXLtr/MkaSEmNMtykw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true + typescript: '>=4.8.4 <5.8.0' - '@typescript-eslint/type-utils@8.19.1': - resolution: {integrity: sha512-Rp7k9lhDKBMRJB/nM9Ksp1zs4796wVNyihG9/TU9R6KCJDNkQbc2EOKjrBtLYh3396ZdpXLtr/MkaSEmNMtykw==} + '@typescript-eslint/type-utils@8.20.0': + resolution: {integrity: sha512-bPC+j71GGvA7rVNAHAtOjbVXbLN5PkwqMvy1cwGeaxUoRQXVuKCebRoLzm+IPW/NtFFpstn1ummSIasD5t60GA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 @@ -5074,14 +5166,14 @@ packages: resolution: {integrity: sha512-iZqi+Ds1y4EDYUtlOOC+aUmxnE9xS/yCigkjA7XpTKV6nCBd3Hp/PRGGmdwnfkV2ThMyYldP1wRpm/id99spTQ==} engines: {node: ^18.18.0 || >=20.0.0} - '@typescript-eslint/types@8.15.0': - resolution: {integrity: sha512-n3Gt8Y/KyJNe0S3yDCD2RVKrHBC4gTUcLTebVBXacPy091E6tNspFLKRXlk3hwT4G55nfr1n2AdFqi/XMxzmPQ==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/types@8.19.1': resolution: {integrity: sha512-JBVHMLj7B1K1v1051ZaMMgLW4Q/jre5qGK0Ew6UgXz1Rqh+/xPzV1aW581OM00X6iOfyr1be+QyW8LOUf19BbA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@typescript-eslint/types@8.20.0': + resolution: {integrity: sha512-cqaMiY72CkP+2xZRrFt3ExRBu0WmVitN/rYPZErA80mHjHx/Svgp8yfbzkJmDoQ/whcytOPO9/IZXnOc+wigRA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@typescript-eslint/typescript-estree@7.18.0': resolution: {integrity: sha512-aP1v/BSPnnyhMHts8cf1qQ6Q1IFwwRvAQGRvBFkWlo3/lH29OXA3Pts+c10nxRxIBrDnoMqzhgdwVe5f2D6OzA==} engines: {node: ^18.18.0 || >=20.0.0} @@ -5091,39 +5183,33 @@ packages: typescript: optional: true - '@typescript-eslint/typescript-estree@8.15.0': - resolution: {integrity: sha512-1eMp2JgNec/niZsR7ioFBlsh/Fk0oJbhaqO0jRyQBMgkz7RrFfkqF9lYYmBoGBaSiLnu8TAPQTwoTUiSTUW9dg==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - '@typescript-eslint/typescript-estree@8.19.1': resolution: {integrity: sha512-jk/TZwSMJlxlNnqhy0Eod1PNEvCkpY6MXOXE/WLlblZ6ibb32i2We4uByoKPv1d0OD2xebDv4hbs3fm11SMw8Q==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <5.8.0' + '@typescript-eslint/typescript-estree@8.20.0': + resolution: {integrity: sha512-Y7ncuy78bJqHI35NwzWol8E0X7XkRVS4K4P4TCyzWkOJih5NDvtoRDW4Ba9YJJoB2igm9yXDdYI/+fkiiAxPzA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '>=4.8.4 <5.8.0' + '@typescript-eslint/utils@7.18.0': resolution: {integrity: sha512-kK0/rNa2j74XuHVcoCZxdFBMF+aq/vH83CXAOHieC+2Gis4mF8jJXT5eAfyD3K0sAxtPuwxaIOIOvhwzVDt/kw==} engines: {node: ^18.18.0 || >=20.0.0} peerDependencies: eslint: ^8.56.0 - '@typescript-eslint/utils@8.15.0': - resolution: {integrity: sha512-k82RI9yGhr0QM3Dnq+egEpz9qB6Un+WLYhmoNcvl8ltMEededhh7otBVVIDDsEEttauwdY/hQoSsOv13lxrFzQ==} + '@typescript-eslint/utils@8.19.1': + resolution: {integrity: sha512-IxG5gLO0Ne+KaUc8iW1A+XuKLd63o4wlbI1Zp692n1xojCl/THvgIKXJXBZixTh5dd5+yTJ/VXH7GJaaw21qXA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true + typescript: '>=4.8.4 <5.8.0' - '@typescript-eslint/utils@8.19.1': - resolution: {integrity: sha512-IxG5gLO0Ne+KaUc8iW1A+XuKLd63o4wlbI1Zp692n1xojCl/THvgIKXJXBZixTh5dd5+yTJ/VXH7GJaaw21qXA==} + '@typescript-eslint/utils@8.20.0': + resolution: {integrity: sha512-dq70RUw6UK9ei7vxc4KQtBRk7qkHZv447OUZ6RPQMQl71I3NZxQJX/f32Smr+iqWrB02pHKn2yAdHBb0KNrRMA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 @@ -5133,14 +5219,14 @@ packages: resolution: {integrity: sha512-cDF0/Gf81QpY3xYyJKDV14Zwdmid5+uuENhjH2EqFaF0ni+yAyq/LzMaIJdhNJXZI7uLzwIlA+V7oWoyn6Curg==} engines: {node: ^18.18.0 || >=20.0.0} - '@typescript-eslint/visitor-keys@8.15.0': - resolution: {integrity: sha512-h8vYOulWec9LhpwfAdZf2bjr8xIp0KNKnpgqSz0qqYYKAW/QZKw3ktRndbiAtUz4acH4QLQavwZBYCc0wulA/Q==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/visitor-keys@8.19.1': resolution: {integrity: sha512-fzmjU8CHK853V/avYZAvuVut3ZTfwN5YtMaoi+X9Y9MA9keaWNHC3zEQ9zvyX/7Hj+5JkNyK1l7TOR2hevHB6Q==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@typescript-eslint/visitor-keys@8.20.0': + resolution: {integrity: sha512-v/BpkeeYAsPkKCkR8BDwcno0llhzWVqPOamQrAEMdpZav2Y9OVjd9dwJyBLJWwf335B5DmlifECIkZRJCaGaHA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@ungap/structured-clone@1.2.0': resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==} @@ -5435,6 +5521,10 @@ packages: resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} engines: {node: '>=12'} + ansis@3.9.0: + resolution: {integrity: sha512-PcDrVe15ldexeZMsVLBAzBwF2KhZgaU0R+CHxH+x5kqn/pO+UWVBZJ+NEXMPpEOLUFeNsnNdoWYc2gwO+MVkDg==} + engines: {node: '>=16'} + any-promise@1.3.0: resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==} @@ -5806,6 +5896,10 @@ packages: class-variance-authority@0.7.0: resolution: {integrity: sha512-jFI8IQw4hczaL4ALINxqLEXQbWcNjoSkloa4IaufXCJr6QawJyw7tuRysRsrE8w2p/4gGaxKIt/hX3qz/IbD1A==} + clean-stack@3.0.1: + resolution: {integrity: sha512-lR9wNiMRcVQjSB3a7xXGLuz4cr4wJuuXlaAEbRutGowQTmlp7R72/DOgN21e8jdwblMWl9UOJMJXarX94pzKdg==} + engines: {node: '>=10'} + clear@0.1.0: resolution: {integrity: sha512-qMjRnoL+JDPJHeLePZJuao6+8orzHMGP04A8CdwCNsKhRbOnKRjefxONR7bwILT3MHecxKBjHkKL/tkZ8r4Uzw==} @@ -6547,6 +6641,11 @@ packages: effect@3.11.8: resolution: {integrity: sha512-N16cwqUDqG7lyYiFyt+in0+OS0Lg9pkMmGPSwxu2j9ZhRHI8S8D69+ffXX+afhl80r6syBSSkkIg/bYRjGGf7A==} + ejs@3.1.10: + resolution: {integrity: sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==} + engines: {node: '>=0.10.0'} + hasBin: true + electron-to-chromium@1.5.50: resolution: {integrity: sha512-eMVObiUQ2LdgeO1F/ySTXsvqvxb6ZH2zPGaMYsWzRDdOddUa77tdmI0ltg+L16UpbWdhPmuF3wIQYyQq65WfZw==} @@ -6712,14 +6811,20 @@ packages: typescript: optional: true + eslint-config-prettier@10.0.1: + resolution: {integrity: sha512-lZBts941cyJyeaooiKxAtzoPHTN+GbQTJFAIdQbRhA4/8whaAraEh47Whw/ZFfrjNSnlAxqfm9i0XVAEkULjCw==} + hasBin: true + peerDependencies: + eslint: '>=7.0.0' + eslint-config-prettier@9.1.0: resolution: {integrity: sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw==} hasBin: true peerDependencies: eslint: '>=7.0.0' - eslint-config-turbo@2.3.0: - resolution: {integrity: sha512-Nm9WZgNoUIJw4bpYQugGCDjzYy1TlUD4sQ/nGblL+HdNqJWCj5NqXbJ1k+TBfYedhr65dlGoAFPYUOfjUOmKVg==} + eslint-config-turbo@2.3.3: + resolution: {integrity: sha512-cM9wSBYowQIrjx2MPCzFE6jTnG4vpTPJKZ/O+Ps3CqrmGK/wtNOsY6WHGMwLtKY/nNbgRahAJH6jGVF6k2coOg==} peerDependencies: eslint: '>6.6.0' @@ -6799,16 +6904,6 @@ packages: peerDependencies: eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7 - eslint-plugin-svelte@2.46.0: - resolution: {integrity: sha512-1A7iEMkzmCZ9/Iz+EAfOGYL8IoIG6zeKEq1SmpxGeM5SXmoQq+ZNnCpXFVJpsxPWYx8jIVGMerQMzX20cqUl0g==} - engines: {node: ^14.17.0 || >=16.0.0} - peerDependencies: - eslint: ^7.0.0 || ^8.0.0-0 || ^9.0.0-0 - svelte: ^3.37.0 || ^4.0.0 || ^5.0.0 - peerDependenciesMeta: - svelte: - optional: true - eslint-plugin-svelte@2.46.1: resolution: {integrity: sha512-7xYr2o4NID/f9OEYMqxsEQsCsj4KaMy4q5sANaKkAb6/QeCjYFxRmDm2S3YC3A3pl1kyPZ/syOx/i7LcWYSbIw==} engines: {node: ^14.17.0 || >=16.0.0} @@ -6819,8 +6914,8 @@ packages: svelte: optional: true - eslint-plugin-turbo@2.3.0: - resolution: {integrity: sha512-2iVUoIhrjp6kI8p0J4NewKPpXaKrHvL4K4eRnNXbqZvP/7xsm4Of+33B3b7m7OsS0UgX8HHOjlB9bEjigKMkMA==} + eslint-plugin-turbo@2.3.3: + resolution: {integrity: sha512-j8UEA0Z+NNCsjZep9G5u5soDQHcXq/x4amrwulk6eHF1U91H2qAjp5I4jQcvJewmccCJbVp734PkHHTRnosjpg==} peerDependencies: eslint: '>6.6.0' @@ -7011,6 +7106,9 @@ packages: file-uri-to-path@1.0.0: resolution: {integrity: sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==} + filelist@1.0.4: + resolution: {integrity: sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==} + filing-cabinet@5.0.2: resolution: {integrity: sha512-RZlFj8lzyu6jqtFBeXNqUjjNG6xm+gwXue3T70pRxw1W40kJwlgq0PSWAmh0nAnn5DHuBIecLXk9+1VKS9ICXA==} engines: {node: '>=18'} @@ -7169,6 +7267,10 @@ packages: get-own-enumerable-property-symbols@3.0.2: resolution: {integrity: sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g==} + get-package-type@0.1.0: + resolution: {integrity: sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==} + engines: {node: '>=8.0.0'} + get-port-please@3.1.2: resolution: {integrity: sha512-Gxc29eLs1fbn6LQ4jSU4vXjlwyZhF5HsGuMAa7gqBP4Rw4yxxltyDUuF5MBclFzDTXO+ACchGQoeela4DSfzdQ==} @@ -7290,6 +7392,9 @@ packages: gsap@3.12.5: resolution: {integrity: sha512-srBfnk4n+Oe/ZnMIOXt3gT605BX9x5+rh/prT2F1SsNJsU1XuMiP0E2aptW481OnonOGACZWBqseH5Z7csHxhQ==} + gsap@3.12.7: + resolution: {integrity: sha512-V4GsyVamhmKefvcAKaoy0h6si0xX7ogwBoBSs2CTJwt7luW0oZzC0LhdkyuKV8PJAXr7Yaj8pMjCKD4GJ+eEMg==} + gzip-size@7.0.0: resolution: {integrity: sha512-O1Ld7Dr+nqPnmGpdhzLmMTQ4vAsD+rHwMm1NLUmoUFFymBOMKxCCrtDxqdBRYXdeEPEi3SyoR4TizJLQrnKBNA==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} @@ -7356,6 +7461,10 @@ packages: hookable@5.5.3: resolution: {integrity: sha512-Yc+BQe8SvoXH1643Qez1zqLRmbA5rCL+sSmk6TVos0LWVfNIB7PGncdlId77WzLGSIB5KaWgTaNTs2lNVEI6VQ==} + hosted-git-info@7.0.2: + resolution: {integrity: sha512-puUZAUKT5m8Zzvs72XWy3HtvVbTWljRE66cP60bxJzAqf2DgICo7lYTY2IHUmLnNpjYvw5bvmoHvPc0QO2a62w==} + engines: {node: ^16.14.0 || >=18.0.0} + html-tags@3.3.1: resolution: {integrity: sha512-ztqyC3kLto0e9WbNp0aeP+M3kTt+nbaIveGmUxAtZa+8iFgKLUOD4YKM5j+f3QD89bra7UeumolZHKuOXnTmeQ==} engines: {node: '>=8'} @@ -7448,6 +7557,10 @@ packages: resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} engines: {node: '>=0.8.19'} + indent-string@4.0.0: + resolution: {integrity: sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==} + engines: {node: '>=8'} + index-to-position@0.1.2: resolution: {integrity: sha512-MWDKS3AS1bGCHLBA2VLImJz42f7bJh8wQsTGCzI3j519/CASStoDONUBVz2I/VID0MpiX3SGSnbOD2xUalbE5g==} engines: {node: '>=18'} @@ -7724,6 +7837,10 @@ packages: isexe@2.0.0: resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + isexe@3.1.1: + resolution: {integrity: sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==} + engines: {node: '>=16'} + isstream@0.1.2: resolution: {integrity: sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==} @@ -7738,6 +7855,11 @@ packages: resolution: {integrity: sha512-bZsjR/iRjl1Nk1UkjGpAzLNfQtzuijhn2g+pbZb98HQ1Gk8vM9hfbxeMBP+M2/UUdwj0RqGG3mlvk2MsAqwvEw==} engines: {node: 20 || >=22} + jake@10.9.2: + resolution: {integrity: sha512-2P4SQ0HrLQ+fw6llpLnOaGAvN2Zu6778SJMrCUwns4fOoG9ayrTiZk3VV8sCPkVZF8ab0zksVpS8FDY5pRCNBA==} + engines: {node: '>=10'} + hasBin: true + jiti@1.21.6: resolution: {integrity: sha512-2yTgeWTWzMWkHu6Jp9NKgePDaYHbntiwvYuuJLbbN9vl7DC9DvXKOB2BC3ZZ92D3cvV/aflH0osDfwpHepQ53w==} hasBin: true @@ -8030,6 +8152,11 @@ packages: peerDependencies: svelte: ^3 || ^4 || ^5.0.0-next.42 + lucide-svelte@0.471.0: + resolution: {integrity: sha512-z+C6G2K089iDGbl8HzTdD5G6i5BvuaBxdIPQDa650Kb8TXBJRODa7YfmaIHy78+Y+YaB75N0lzUIQEclzflJrQ==} + peerDependencies: + svelte: ^3 || ^4 || ^5.0.0-next.42 + lucide-vue-next@0.438.0: resolution: {integrity: sha512-xlPIeYbhfI0gDJwolST7cjc6KAi1oWN9HEWGuK+5gMmoi+a6bJ3mI062+7tqzOdjSE07l7jyBH4mladQVLIQRA==} peerDependencies: @@ -8393,6 +8520,10 @@ packages: resolution: {integrity: sha512-TZKxPvItzai9kN9H/TkmCtx/ZN/hvr3vUycjlfmH0ootY9yFBzNOpiXAdIn1Iteqsvk4lQn6B5PTrt+n6h8k/w==} engines: {node: ^18.17.0 || >=20.5.0} + npm-package-arg@11.0.3: + resolution: {integrity: sha512-sHGJy8sOC1YraBywpzQlIKBE4pBbGbiF95U6Auspzyem956E0+FtDtsx1ZxlOJkQCZ1AFXAY/yuvtFYrOxF+Bw==} + engines: {node: ^16.14.0 || >=18.0.0} + npm-run-path@4.0.1: resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} engines: {node: '>=8'} @@ -8401,6 +8532,80 @@ packages: resolution: {integrity: sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + npm@10.9.2: + resolution: {integrity: sha512-iriPEPIkoMYUy3F6f3wwSZAU93E0Eg6cHwIR6jzzOXWSy+SD/rOODEs74cVONHKSx2obXtuUoyidVEhISrisgQ==} + engines: {node: ^18.17.0 || >=20.5.0} + hasBin: true + bundledDependencies: + - '@isaacs/string-locale-compare' + - '@npmcli/arborist' + - '@npmcli/config' + - '@npmcli/fs' + - '@npmcli/map-workspaces' + - '@npmcli/package-json' + - '@npmcli/promise-spawn' + - '@npmcli/redact' + - '@npmcli/run-script' + - '@sigstore/tuf' + - abbrev + - archy + - cacache + - chalk + - ci-info + - cli-columns + - fastest-levenshtein + - fs-minipass + - glob + - graceful-fs + - hosted-git-info + - ini + - init-package-json + - is-cidr + - json-parse-even-better-errors + - libnpmaccess + - libnpmdiff + - libnpmexec + - libnpmfund + - libnpmhook + - libnpmorg + - libnpmpack + - libnpmpublish + - libnpmsearch + - libnpmteam + - libnpmversion + - make-fetch-happen + - minimatch + - minipass + - minipass-pipeline + - ms + - node-gyp + - nopt + - normalize-package-data + - npm-audit-report + - npm-install-checks + - npm-package-arg + - npm-pick-manifest + - npm-profile + - npm-registry-fetch + - npm-user-validate + - p-map + - pacote + - parse-conflict-json + - proc-log + - qrcode-terminal + - read + - semver + - spdx-expression-parse + - ssri + - supports-color + - tar + - text-table + - tiny-relative-date + - treeverse + - validate-npm-package-name + - which + - write-file-atomic + npmlog@5.0.1: resolution: {integrity: sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==} deprecated: This package is no longer supported. @@ -8450,6 +8655,10 @@ packages: resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} engines: {node: '>= 0.4'} + object-treeify@4.0.1: + resolution: {integrity: sha512-Y6tg5rHfsefSkfKujv2SwHulInROy/rCL5F4w0QOWxut8AnxYxf0YmNhTh95Zfyxpsudo66uqkux0ACFnyMSgQ==} + engines: {node: '>= 16'} + object.assign@4.1.5: resolution: {integrity: sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==} engines: {node: '>= 0.4'} @@ -8491,8 +8700,8 @@ packages: resolution: {integrity: sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==} engines: {node: '>=12'} - oniguruma-to-es@0.10.0: - resolution: {integrity: sha512-zapyOUOCJxt+xhiNRPPMtfJkHGsZ98HHB9qJEkdT8BGytO/+kpe4m1Ngf0MzbzTmhacn11w9yGeDP6tzDhnCdg==} + oniguruma-to-es@2.0.0: + resolution: {integrity: sha512-pE7+9jQgomy10aK6BJKRNHj1Nth0YLOzb3iRuhlz4gRzNSBSd7hga6U8BE6o0SoSuSkqv+PPtt511Msd1Hkl0w==} only@0.0.2: resolution: {integrity: sha512-Fvw+Jemq5fjjyWz6CpKx6w9s7xxqo3+JCyM0WXWeCSOboZ8ABkyvP8ID4CZuChA/wxSx+XSJmdOm8rGVyJ1hdQ==} @@ -9068,6 +9277,10 @@ packages: resolution: {integrity: sha512-973driJZvxiGOQ5ONsFhOF/DtzPMOMtgC11kCpUrPGMTgqp2q/1gwzCquocrN33is0VZ5GFHXZYMM9l6h67v2Q==} engines: {node: '>=10'} + proc-log@4.2.0: + resolution: {integrity: sha512-g8+OnU/L2v+wyiVK+D5fA34J7EH8jZ8DDlvwhRCMxmMj7UCBvxiO1mGeN+36JXIKF4zevU4kRBd8lVgG9vLelA==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + proc-log@5.0.0: resolution: {integrity: sha512-Azwzvl90HaF0aCz1JrDdXQykFakSSNPaPoiZ9fm5qJIMHioDZEi7OAdRwSm6rSoPtY3Qutnm3L7ogmg3dc+wbQ==} engines: {node: ^18.17.0 || >=20.5.0} @@ -9590,8 +9803,8 @@ packages: vue: optional: true - shiki@1.26.1: - resolution: {integrity: sha512-Gqg6DSTk3wYqaZ5OaYtzjcdxcBvX5kCy24yvRJEgjT5U+WHlmqCThLuBUx0juyxQBi+6ug53IGeuQS07DWwpcw==} + shiki@1.27.2: + resolution: {integrity: sha512-QtA1C41oEVixKog+V8I3ia7jjGls7oCZ8Yul8vdHrVBga5uPoyTtMvFF4lMMXIyAZo5A5QbXq91bot2vA6Q+eQ==} shx@0.3.4: resolution: {integrity: sha512-N6A9MLVqjxZYcVn8hLmtneQWIJtp8IKzMP4eMnx+nqkvXoqinUPCbUFLp2UcWTEIUONhlk0ewxr/jaVGlc+J+g==} @@ -9845,6 +10058,10 @@ packages: resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} engines: {node: '>=8'} + supports-color@8.1.1: + resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==} + engines: {node: '>=10'} + supports-color@9.4.0: resolution: {integrity: sha512-VL+lNrEoIXww1coLPOmiEmK/0sGigko5COxI09KzHc2VJXJsQ37UaQ+8quuxjDeA7+KnLGTWRyOXSLLR2Wb4jw==} engines: {node: '>=12'} @@ -10273,6 +10490,13 @@ packages: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <5.8.0' + typescript-eslint@8.20.0: + resolution: {integrity: sha512-Kxz2QRFsgbWj6Xcftlw3Dd154b3cEPFqQC+qMZrMypSijPd4UanKKvoKDrJ4o8AIfZFKAF+7sMaEIR8mTElozA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + typescript: '>=4.8.4 <5.8.0' + typescript@4.9.5: resolution: {integrity: sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==} engines: {node: '>=4.2.0'} @@ -10523,6 +10747,14 @@ packages: typescript: optional: true + valibot@1.0.0-beta.12: + resolution: {integrity: sha512-j3WIxJ0pmUFMfdfUECn3YnZPYOiG0yHYcFEa/+RVgo0I+MXE3ToLt7gNRLtY5pwGfgNmsmhenGZfU5suu9ijUA==} + peerDependencies: + typescript: '>=5' + peerDependenciesMeta: + typescript: + optional: true + valibot@1.0.0-beta.9: resolution: {integrity: sha512-yEX8gMAZ2R1yI2uwOO4NCtVnJQx36zn3vD0omzzj9FhcoblvPukENIiRZXKZwCnqSeV80bMm8wNiGhQ0S8fiww==} peerDependencies: @@ -10531,6 +10763,10 @@ packages: typescript: optional: true + validate-npm-package-name@5.0.1: + resolution: {integrity: sha512-OljLrQ9SQdOUqTaQxqL5dEfZWrXExyyWsozYlAWFawPVNuD83igl7uJD2RTkNMbniIYgt8l81eCJGIdQF7avLQ==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + validator@13.12.0: resolution: {integrity: sha512-c1Q0mCiPlgdTVVVIJIrBuxNicYE+t/7oKeI9MWLj3fh/uq2Pxh/3eeWbVZ4OcGW1TUf53At0njHw5SMdA3tmMg==} engines: {node: '>= 0.10'} @@ -10562,6 +10798,11 @@ packages: peerDependencies: vue: ^3.4.26 + verify-package-export@0.0.2: + resolution: {integrity: sha512-eTxBMzf5O5G+KZYyGg33Zp36rnlbuMAKSR3nNzh299SDLOgxoFDlNVbiy1mANVWJ/uG15qVZv0K4KdwV5u1FZQ==} + engines: {node: '>=18.0.0'} + hasBin: true + verror@1.10.0: resolution: {integrity: sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==} engines: {'0': node >=0.6.0} @@ -10902,6 +11143,11 @@ packages: engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} hasBin: true + which@4.0.0: + resolution: {integrity: sha512-GlaYyEb07DPxYCKhKzplCWBJtvxZcZMrL+4UkrTSJHHPyZU4mYYTv3qaOe77H7EODLSSopAUFAc6W8U4yqvscg==} + engines: {node: ^16.13.0 || >=18.0.0} + hasBin: true + why-is-node-running@2.3.0: resolution: {integrity: sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==} engines: {node: '>=8'} @@ -10910,6 +11156,10 @@ packages: wide-align@1.1.5: resolution: {integrity: sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==} + widest-line@3.1.0: + resolution: {integrity: sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg==} + engines: {node: '>=8'} + word-wrap@1.2.5: resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} engines: {node: '>=0.10.0'} @@ -10987,6 +11237,11 @@ packages: resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} engines: {node: '>=12'} + yarn@1.22.22: + resolution: {integrity: sha512-prL3kGtyG7o9Z9Sv8IPfBNrWTDmXB4Qbes8A9rEzt6wkJV8mUvoirjU0Mp3GGAU06Y0XQyA3/2/RQFVuK7MTfg==} + engines: {node: '>=4.0.0'} + hasBin: true + ylru@1.4.0: resolution: {integrity: sha512-2OQsPNEmBCvXuFlIni/a+Rn+R2pHW9INm0BxXJ4hVDA8TirqMj+J/Rp9ItLatT/5pZqWwefVrTQcHpixsxnVlA==} engines: {node: '>= 4.0.0'} @@ -12261,6 +12516,8 @@ snapshots: '@eslint/js@9.17.0': {} + '@eslint/js@9.18.0': {} + '@eslint/object-schema@2.1.4': {} '@eslint/plugin-kit@0.2.3': @@ -12309,8 +12566,8 @@ snapshots: '@gerrit0/mini-shiki@1.24.4': dependencies: - '@shikijs/engine-oniguruma': 1.24.2 - '@shikijs/types': 1.24.2 + '@shikijs/engine-oniguruma': 1.26.1 + '@shikijs/types': 1.26.1 '@shikijs/vscode-textmate': 9.3.1 '@grpc/grpc-js@1.12.2': @@ -12341,14 +12598,14 @@ snapshots: '@huakunshen/comlink@4.4.1': {} - '@huakunshen/jsr-client@0.1.5(axios@1.7.9)(react@18.3.1)(typescript@5.6.3)': + '@huakunshen/jsr-client@0.1.5(axios@1.7.9)(react@18.3.1)(typescript@5.7.2)': 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.6.3 + typescript: 5.7.2 zod: 3.24.1 transitivePeerDependencies: - axios @@ -12614,6 +12871,10 @@ snapshots: dependencies: '@swc/helpers': 0.5.13 + '@internationalized/date@3.7.0': + dependencies: + '@swc/helpers': 0.5.13 + '@internationalized/number@3.5.4': dependencies: '@swc/helpers': 0.5.13 @@ -12757,6 +13018,24 @@ snapshots: transitivePeerDependencies: - sveltekit-superforms + '@kksh/svelte5@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.2))(typescript@5.7.2)': + dependencies: + '@tanstack/table-core': 8.20.5 + bits-ui: 1.0.0-next.77(svelte@5.16.6) + embla-carousel-svelte: 8.5.2(svelte@5.16.6) + formsnap: 2.0.0-next.1(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.2)) + lucide-svelte: 0.471.0(svelte@5.16.6) + mode-watcher: 0.5.0(svelte@5.16.6) + paneforge: 1.0.0-next.2(svelte@5.16.6) + svelte: 5.16.6 + svelte-persisted-store: 0.12.0(svelte@5.16.6) + svelte-radix: 2.0.1(svelte@5.16.6) + svelte-sonner: 0.3.28(svelte@5.16.6) + typescript: 5.7.2 + vaul-svelte: 1.0.0-next.3(svelte@5.16.6) + transitivePeerDependencies: + - sveltekit-superforms + '@kksh/vue@0.1.3(@popperjs/core@2.11.8)(@vue/devtools-api@7.6.4)(tailwindcss@3.4.15)(vue@3.5.13(typescript@5.6.3))': dependencies: '@internationalized/date': 3.5.6 @@ -13157,6 +13436,47 @@ snapshots: - supports-color - ts-node + '@oclif/core@4.2.2': + dependencies: + ansi-escapes: 4.3.2 + ansis: 3.9.0 + clean-stack: 3.0.1 + cli-spinners: 2.9.2 + debug: 4.4.0(supports-color@8.1.1) + ejs: 3.1.10 + get-package-type: 0.1.0 + globby: 11.1.0 + indent-string: 4.0.0 + is-wsl: 2.2.0 + lilconfig: 3.1.3 + minimatch: 9.0.5 + semver: 7.6.3 + string-width: 4.2.3 + supports-color: 8.1.1 + widest-line: 3.1.0 + wordwrap: 1.0.0 + wrap-ansi: 7.0.0 + + '@oclif/plugin-help@6.2.21': + dependencies: + '@oclif/core': 4.2.2 + + '@oclif/plugin-plugins@5.4.25': + dependencies: + '@oclif/core': 4.2.2 + ansis: 3.9.0 + debug: 4.4.0(supports-color@9.4.0) + npm: 10.9.2 + npm-package-arg: 11.0.3 + npm-run-path: 5.3.0 + object-treeify: 4.0.1 + semver: 7.6.3 + validate-npm-package-name: 5.0.1 + which: 4.0.0 + yarn: 1.22.22 + transitivePeerDependencies: + - supports-color + '@octokit/auth-token@5.1.1': {} '@octokit/core@6.1.3': @@ -14363,49 +14683,49 @@ snapshots: '@rushstack/eslint-patch@1.10.4': {} - '@shikijs/core@1.26.1': + '@shikijs/core@1.27.2': dependencies: - '@shikijs/engine-javascript': 1.26.1 - '@shikijs/engine-oniguruma': 1.26.1 - '@shikijs/types': 1.26.1 + '@shikijs/engine-javascript': 1.27.2 + '@shikijs/engine-oniguruma': 1.27.2 + '@shikijs/types': 1.27.2 '@shikijs/vscode-textmate': 10.0.1 '@types/hast': 3.0.4 hast-util-to-html: 9.0.4 - '@shikijs/engine-javascript@1.26.1': + '@shikijs/engine-javascript@1.27.2': dependencies: - '@shikijs/types': 1.26.1 + '@shikijs/types': 1.27.2 '@shikijs/vscode-textmate': 10.0.1 - oniguruma-to-es: 0.10.0 - - '@shikijs/engine-oniguruma@1.24.2': - dependencies: - '@shikijs/types': 1.24.2 - '@shikijs/vscode-textmate': 9.3.1 + oniguruma-to-es: 2.0.0 '@shikijs/engine-oniguruma@1.26.1': dependencies: '@shikijs/types': 1.26.1 '@shikijs/vscode-textmate': 10.0.1 - '@shikijs/langs@1.26.1': + '@shikijs/engine-oniguruma@1.27.2': dependencies: - '@shikijs/types': 1.26.1 + '@shikijs/types': 1.27.2 + '@shikijs/vscode-textmate': 10.0.1 - '@shikijs/themes@1.26.1': + '@shikijs/langs@1.27.2': dependencies: - '@shikijs/types': 1.26.1 + '@shikijs/types': 1.27.2 - '@shikijs/types@1.24.2': + '@shikijs/themes@1.27.2': dependencies: - '@shikijs/vscode-textmate': 9.3.1 - '@types/hast': 3.0.4 + '@shikijs/types': 1.27.2 '@shikijs/types@1.26.1': dependencies: '@shikijs/vscode-textmate': 10.0.1 '@types/hast': 3.0.4 + '@shikijs/types@1.27.2': + dependencies: + '@shikijs/vscode-textmate': 10.0.1 + '@types/hast': 3.0.4 + '@shikijs/vscode-textmate@10.0.1': {} '@shikijs/vscode-textmate@9.3.1': {} @@ -15536,42 +15856,6 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/eslint-plugin@8.15.0(@typescript-eslint/parser@8.15.0(eslint@8.57.1)(typescript@5.6.3))(eslint@8.57.1)(typescript@5.6.3)': - dependencies: - '@eslint-community/regexpp': 4.12.1 - '@typescript-eslint/parser': 8.15.0(eslint@8.57.1)(typescript@5.6.3) - '@typescript-eslint/scope-manager': 8.15.0 - '@typescript-eslint/type-utils': 8.15.0(eslint@8.57.1)(typescript@5.6.3) - '@typescript-eslint/utils': 8.15.0(eslint@8.57.1)(typescript@5.6.3) - '@typescript-eslint/visitor-keys': 8.15.0 - eslint: 8.57.1 - graphemer: 1.4.0 - ignore: 5.3.2 - natural-compare: 1.4.0 - ts-api-utils: 1.4.0(typescript@5.6.3) - optionalDependencies: - typescript: 5.6.3 - transitivePeerDependencies: - - supports-color - - '@typescript-eslint/eslint-plugin@8.15.0(@typescript-eslint/parser@8.15.0(eslint@9.17.0(jiti@2.4.0))(typescript@5.7.2))(eslint@9.17.0(jiti@2.4.0))(typescript@5.7.2)': - dependencies: - '@eslint-community/regexpp': 4.12.1 - '@typescript-eslint/parser': 8.15.0(eslint@9.17.0(jiti@2.4.0))(typescript@5.7.2) - '@typescript-eslint/scope-manager': 8.15.0 - '@typescript-eslint/type-utils': 8.15.0(eslint@9.17.0(jiti@2.4.0))(typescript@5.7.2) - '@typescript-eslint/utils': 8.15.0(eslint@9.17.0(jiti@2.4.0))(typescript@5.7.2) - '@typescript-eslint/visitor-keys': 8.15.0 - eslint: 9.17.0(jiti@2.4.0) - graphemer: 1.4.0 - ignore: 5.3.2 - natural-compare: 1.4.0 - ts-api-utils: 1.4.0(typescript@5.7.2) - optionalDependencies: - typescript: 5.7.2 - transitivePeerDependencies: - - supports-color - '@typescript-eslint/eslint-plugin@8.19.1(@typescript-eslint/parser@8.19.1(eslint@9.17.0(jiti@2.4.0))(typescript@5.7.2))(eslint@9.17.0(jiti@2.4.0))(typescript@5.7.2)': dependencies: '@eslint-community/regexpp': 4.12.1 @@ -15589,6 +15873,57 @@ snapshots: transitivePeerDependencies: - supports-color + '@typescript-eslint/eslint-plugin@8.20.0(@typescript-eslint/parser@8.20.0(eslint@8.57.1)(typescript@5.6.3))(eslint@8.57.1)(typescript@5.6.3)': + dependencies: + '@eslint-community/regexpp': 4.12.1 + '@typescript-eslint/parser': 8.20.0(eslint@8.57.1)(typescript@5.6.3) + '@typescript-eslint/scope-manager': 8.20.0 + '@typescript-eslint/type-utils': 8.20.0(eslint@8.57.1)(typescript@5.6.3) + '@typescript-eslint/utils': 8.20.0(eslint@8.57.1)(typescript@5.6.3) + '@typescript-eslint/visitor-keys': 8.20.0 + eslint: 8.57.1 + graphemer: 1.4.0 + ignore: 5.3.2 + natural-compare: 1.4.0 + ts-api-utils: 2.0.0(typescript@5.6.3) + typescript: 5.6.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/eslint-plugin@8.20.0(@typescript-eslint/parser@8.20.0(eslint@9.17.0(jiti@2.4.0))(typescript@5.6.3))(eslint@9.17.0(jiti@2.4.0))(typescript@5.6.3)': + dependencies: + '@eslint-community/regexpp': 4.12.1 + '@typescript-eslint/parser': 8.20.0(eslint@9.17.0(jiti@2.4.0))(typescript@5.6.3) + '@typescript-eslint/scope-manager': 8.20.0 + '@typescript-eslint/type-utils': 8.20.0(eslint@9.17.0(jiti@2.4.0))(typescript@5.6.3) + '@typescript-eslint/utils': 8.20.0(eslint@9.17.0(jiti@2.4.0))(typescript@5.6.3) + '@typescript-eslint/visitor-keys': 8.20.0 + eslint: 9.17.0(jiti@2.4.0) + graphemer: 1.4.0 + ignore: 5.3.2 + natural-compare: 1.4.0 + ts-api-utils: 2.0.0(typescript@5.6.3) + typescript: 5.6.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/eslint-plugin@8.20.0(@typescript-eslint/parser@8.20.0(eslint@9.17.0(jiti@2.4.0))(typescript@5.7.2))(eslint@9.17.0(jiti@2.4.0))(typescript@5.7.2)': + dependencies: + '@eslint-community/regexpp': 4.12.1 + '@typescript-eslint/parser': 8.20.0(eslint@9.17.0(jiti@2.4.0))(typescript@5.7.2) + '@typescript-eslint/scope-manager': 8.20.0 + '@typescript-eslint/type-utils': 8.20.0(eslint@9.17.0(jiti@2.4.0))(typescript@5.7.2) + '@typescript-eslint/utils': 8.20.0(eslint@9.17.0(jiti@2.4.0))(typescript@5.7.2) + '@typescript-eslint/visitor-keys': 8.20.0 + eslint: 9.17.0(jiti@2.4.0) + graphemer: 1.4.0 + ignore: 5.3.2 + natural-compare: 1.4.0 + ts-api-utils: 2.0.0(typescript@5.7.2) + typescript: 5.7.2 + transitivePeerDependencies: + - supports-color + '@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.6.3)': dependencies: '@typescript-eslint/scope-manager': 7.18.0 @@ -15602,32 +15937,6 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@8.15.0(eslint@8.57.1)(typescript@5.6.3)': - dependencies: - '@typescript-eslint/scope-manager': 8.15.0 - '@typescript-eslint/types': 8.15.0 - '@typescript-eslint/typescript-estree': 8.15.0(typescript@5.6.3) - '@typescript-eslint/visitor-keys': 8.15.0 - debug: 4.4.0(supports-color@9.4.0) - eslint: 8.57.1 - optionalDependencies: - typescript: 5.6.3 - transitivePeerDependencies: - - supports-color - - '@typescript-eslint/parser@8.15.0(eslint@9.17.0(jiti@2.4.0))(typescript@5.7.2)': - dependencies: - '@typescript-eslint/scope-manager': 8.15.0 - '@typescript-eslint/types': 8.15.0 - '@typescript-eslint/typescript-estree': 8.15.0(typescript@5.7.2) - '@typescript-eslint/visitor-keys': 8.15.0 - debug: 4.4.0(supports-color@9.4.0) - eslint: 9.17.0(jiti@2.4.0) - optionalDependencies: - typescript: 5.7.2 - transitivePeerDependencies: - - supports-color - '@typescript-eslint/parser@8.19.1(eslint@9.17.0(jiti@2.4.0))(typescript@5.7.2)': dependencies: '@typescript-eslint/scope-manager': 8.19.1 @@ -15640,21 +15949,57 @@ snapshots: transitivePeerDependencies: - supports-color + '@typescript-eslint/parser@8.20.0(eslint@8.57.1)(typescript@5.6.3)': + dependencies: + '@typescript-eslint/scope-manager': 8.20.0 + '@typescript-eslint/types': 8.20.0 + '@typescript-eslint/typescript-estree': 8.20.0(typescript@5.6.3) + '@typescript-eslint/visitor-keys': 8.20.0 + debug: 4.4.0(supports-color@9.4.0) + eslint: 8.57.1 + typescript: 5.6.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/parser@8.20.0(eslint@9.17.0(jiti@2.4.0))(typescript@5.6.3)': + dependencies: + '@typescript-eslint/scope-manager': 8.20.0 + '@typescript-eslint/types': 8.20.0 + '@typescript-eslint/typescript-estree': 8.20.0(typescript@5.6.3) + '@typescript-eslint/visitor-keys': 8.20.0 + debug: 4.4.0(supports-color@9.4.0) + eslint: 9.17.0(jiti@2.4.0) + typescript: 5.6.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/parser@8.20.0(eslint@9.17.0(jiti@2.4.0))(typescript@5.7.2)': + dependencies: + '@typescript-eslint/scope-manager': 8.20.0 + '@typescript-eslint/types': 8.20.0 + '@typescript-eslint/typescript-estree': 8.20.0(typescript@5.7.2) + '@typescript-eslint/visitor-keys': 8.20.0 + debug: 4.4.0(supports-color@9.4.0) + eslint: 9.17.0(jiti@2.4.0) + typescript: 5.7.2 + transitivePeerDependencies: + - supports-color + '@typescript-eslint/scope-manager@7.18.0': dependencies: '@typescript-eslint/types': 7.18.0 '@typescript-eslint/visitor-keys': 7.18.0 - '@typescript-eslint/scope-manager@8.15.0': - dependencies: - '@typescript-eslint/types': 8.15.0 - '@typescript-eslint/visitor-keys': 8.15.0 - '@typescript-eslint/scope-manager@8.19.1': dependencies: '@typescript-eslint/types': 8.19.1 '@typescript-eslint/visitor-keys': 8.19.1 + '@typescript-eslint/scope-manager@8.20.0': + dependencies: + '@typescript-eslint/types': 8.20.0 + '@typescript-eslint/visitor-keys': 8.20.0 + '@typescript-eslint/type-utils@7.18.0(eslint@8.57.1)(typescript@5.6.3)': dependencies: '@typescript-eslint/typescript-estree': 7.18.0(typescript@5.6.3) @@ -15667,30 +16012,6 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/type-utils@8.15.0(eslint@8.57.1)(typescript@5.6.3)': - dependencies: - '@typescript-eslint/typescript-estree': 8.15.0(typescript@5.6.3) - '@typescript-eslint/utils': 8.15.0(eslint@8.57.1)(typescript@5.6.3) - debug: 4.4.0(supports-color@9.4.0) - eslint: 8.57.1 - ts-api-utils: 1.4.0(typescript@5.6.3) - optionalDependencies: - typescript: 5.6.3 - transitivePeerDependencies: - - supports-color - - '@typescript-eslint/type-utils@8.15.0(eslint@9.17.0(jiti@2.4.0))(typescript@5.7.2)': - dependencies: - '@typescript-eslint/typescript-estree': 8.15.0(typescript@5.7.2) - '@typescript-eslint/utils': 8.15.0(eslint@9.17.0(jiti@2.4.0))(typescript@5.7.2) - debug: 4.4.0(supports-color@9.4.0) - eslint: 9.17.0(jiti@2.4.0) - ts-api-utils: 1.4.0(typescript@5.7.2) - optionalDependencies: - typescript: 5.7.2 - transitivePeerDependencies: - - supports-color - '@typescript-eslint/type-utils@8.19.1(eslint@9.17.0(jiti@2.4.0))(typescript@5.7.2)': dependencies: '@typescript-eslint/typescript-estree': 8.19.1(typescript@5.7.2) @@ -15702,12 +16023,45 @@ snapshots: transitivePeerDependencies: - supports-color + '@typescript-eslint/type-utils@8.20.0(eslint@8.57.1)(typescript@5.6.3)': + dependencies: + '@typescript-eslint/typescript-estree': 8.20.0(typescript@5.6.3) + '@typescript-eslint/utils': 8.20.0(eslint@8.57.1)(typescript@5.6.3) + debug: 4.4.0(supports-color@9.4.0) + eslint: 8.57.1 + ts-api-utils: 2.0.0(typescript@5.6.3) + typescript: 5.6.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/type-utils@8.20.0(eslint@9.17.0(jiti@2.4.0))(typescript@5.6.3)': + dependencies: + '@typescript-eslint/typescript-estree': 8.20.0(typescript@5.6.3) + '@typescript-eslint/utils': 8.20.0(eslint@9.17.0(jiti@2.4.0))(typescript@5.6.3) + debug: 4.4.0(supports-color@9.4.0) + eslint: 9.17.0(jiti@2.4.0) + ts-api-utils: 2.0.0(typescript@5.6.3) + typescript: 5.6.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/type-utils@8.20.0(eslint@9.17.0(jiti@2.4.0))(typescript@5.7.2)': + dependencies: + '@typescript-eslint/typescript-estree': 8.20.0(typescript@5.7.2) + '@typescript-eslint/utils': 8.20.0(eslint@9.17.0(jiti@2.4.0))(typescript@5.7.2) + debug: 4.4.0(supports-color@9.4.0) + eslint: 9.17.0(jiti@2.4.0) + ts-api-utils: 2.0.0(typescript@5.7.2) + typescript: 5.7.2 + transitivePeerDependencies: + - supports-color + '@typescript-eslint/types@7.18.0': {} - '@typescript-eslint/types@8.15.0': {} - '@typescript-eslint/types@8.19.1': {} + '@typescript-eslint/types@8.20.0': {} + '@typescript-eslint/typescript-estree@7.18.0(typescript@5.6.3)': dependencies: '@typescript-eslint/types': 7.18.0 @@ -15738,36 +16092,6 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/typescript-estree@8.15.0(typescript@5.6.3)': - dependencies: - '@typescript-eslint/types': 8.15.0 - '@typescript-eslint/visitor-keys': 8.15.0 - debug: 4.4.0(supports-color@9.4.0) - fast-glob: 3.3.2 - is-glob: 4.0.3 - minimatch: 9.0.5 - semver: 7.6.3 - ts-api-utils: 1.4.0(typescript@5.6.3) - optionalDependencies: - typescript: 5.6.3 - transitivePeerDependencies: - - supports-color - - '@typescript-eslint/typescript-estree@8.15.0(typescript@5.7.2)': - dependencies: - '@typescript-eslint/types': 8.15.0 - '@typescript-eslint/visitor-keys': 8.15.0 - debug: 4.4.0(supports-color@9.4.0) - fast-glob: 3.3.2 - is-glob: 4.0.3 - minimatch: 9.0.5 - semver: 7.6.3 - ts-api-utils: 1.4.0(typescript@5.7.2) - optionalDependencies: - typescript: 5.7.2 - transitivePeerDependencies: - - supports-color - '@typescript-eslint/typescript-estree@8.19.1(typescript@5.7.2)': dependencies: '@typescript-eslint/types': 8.19.1 @@ -15782,6 +16106,34 @@ snapshots: transitivePeerDependencies: - supports-color + '@typescript-eslint/typescript-estree@8.20.0(typescript@5.6.3)': + dependencies: + '@typescript-eslint/types': 8.20.0 + '@typescript-eslint/visitor-keys': 8.20.0 + debug: 4.4.0(supports-color@9.4.0) + fast-glob: 3.3.2 + is-glob: 4.0.3 + minimatch: 9.0.5 + semver: 7.6.3 + ts-api-utils: 2.0.0(typescript@5.6.3) + typescript: 5.6.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/typescript-estree@8.20.0(typescript@5.7.2)': + dependencies: + '@typescript-eslint/types': 8.20.0 + '@typescript-eslint/visitor-keys': 8.20.0 + debug: 4.4.0(supports-color@9.4.0) + fast-glob: 3.3.2 + is-glob: 4.0.3 + minimatch: 9.0.5 + semver: 7.6.3 + ts-api-utils: 2.0.0(typescript@5.7.2) + typescript: 5.7.2 + transitivePeerDependencies: + - supports-color + '@typescript-eslint/utils@7.18.0(eslint@8.57.1)(typescript@5.6.3)': dependencies: '@eslint-community/eslint-utils': 4.4.1(eslint@8.57.1) @@ -15793,30 +16145,6 @@ snapshots: - supports-color - typescript - '@typescript-eslint/utils@8.15.0(eslint@8.57.1)(typescript@5.6.3)': - dependencies: - '@eslint-community/eslint-utils': 4.4.1(eslint@8.57.1) - '@typescript-eslint/scope-manager': 8.15.0 - '@typescript-eslint/types': 8.15.0 - '@typescript-eslint/typescript-estree': 8.15.0(typescript@5.6.3) - eslint: 8.57.1 - optionalDependencies: - typescript: 5.6.3 - transitivePeerDependencies: - - supports-color - - '@typescript-eslint/utils@8.15.0(eslint@9.17.0(jiti@2.4.0))(typescript@5.7.2)': - dependencies: - '@eslint-community/eslint-utils': 4.4.1(eslint@9.17.0(jiti@2.4.0)) - '@typescript-eslint/scope-manager': 8.15.0 - '@typescript-eslint/types': 8.15.0 - '@typescript-eslint/typescript-estree': 8.15.0(typescript@5.7.2) - eslint: 9.17.0(jiti@2.4.0) - optionalDependencies: - typescript: 5.7.2 - transitivePeerDependencies: - - supports-color - '@typescript-eslint/utils@8.19.1(eslint@9.17.0(jiti@2.4.0))(typescript@5.7.2)': dependencies: '@eslint-community/eslint-utils': 4.4.1(eslint@9.17.0(jiti@2.4.0)) @@ -15828,21 +16156,54 @@ snapshots: transitivePeerDependencies: - supports-color + '@typescript-eslint/utils@8.20.0(eslint@8.57.1)(typescript@5.6.3)': + dependencies: + '@eslint-community/eslint-utils': 4.4.1(eslint@8.57.1) + '@typescript-eslint/scope-manager': 8.20.0 + '@typescript-eslint/types': 8.20.0 + '@typescript-eslint/typescript-estree': 8.20.0(typescript@5.6.3) + eslint: 8.57.1 + typescript: 5.6.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/utils@8.20.0(eslint@9.17.0(jiti@2.4.0))(typescript@5.6.3)': + dependencies: + '@eslint-community/eslint-utils': 4.4.1(eslint@9.17.0(jiti@2.4.0)) + '@typescript-eslint/scope-manager': 8.20.0 + '@typescript-eslint/types': 8.20.0 + '@typescript-eslint/typescript-estree': 8.20.0(typescript@5.6.3) + eslint: 9.17.0(jiti@2.4.0) + typescript: 5.6.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/utils@8.20.0(eslint@9.17.0(jiti@2.4.0))(typescript@5.7.2)': + dependencies: + '@eslint-community/eslint-utils': 4.4.1(eslint@9.17.0(jiti@2.4.0)) + '@typescript-eslint/scope-manager': 8.20.0 + '@typescript-eslint/types': 8.20.0 + '@typescript-eslint/typescript-estree': 8.20.0(typescript@5.7.2) + eslint: 9.17.0(jiti@2.4.0) + typescript: 5.7.2 + transitivePeerDependencies: + - supports-color + '@typescript-eslint/visitor-keys@7.18.0': dependencies: '@typescript-eslint/types': 7.18.0 eslint-visitor-keys: 3.4.3 - '@typescript-eslint/visitor-keys@8.15.0': - dependencies: - '@typescript-eslint/types': 8.15.0 - eslint-visitor-keys: 4.2.0 - '@typescript-eslint/visitor-keys@8.19.1': dependencies: '@typescript-eslint/types': 8.19.1 eslint-visitor-keys: 4.2.0 + '@typescript-eslint/visitor-keys@8.20.0': + dependencies: + '@typescript-eslint/types': 8.20.0 + eslint-visitor-keys: 4.2.0 + '@ungap/structured-clone@1.2.0': {} '@unhead/dom@1.11.11': @@ -16308,6 +16669,8 @@ snapshots: ansi-styles@6.2.1: {} + ansis@3.9.0: {} + any-promise@1.3.0: {} anymatch@3.1.3: @@ -16550,7 +16913,7 @@ snapshots: dependencies: '@floating-ui/core': 1.6.8 '@floating-ui/dom': 1.6.12 - '@internationalized/date': 3.6.0 + '@internationalized/date': 3.7.0 esm-env: 1.2.1 runed: 0.22.0(svelte@5.16.6) svelte: 5.16.6 @@ -16737,6 +17100,10 @@ snapshots: dependencies: clsx: 2.0.0 + clean-stack@3.0.1: + dependencies: + escape-string-regexp: 4.0.0 + clear@0.1.0: {} cli-cursor@3.1.0: @@ -16988,7 +17355,7 @@ snapshots: cssnano@7.0.6(postcss@8.4.49): dependencies: cssnano-preset-default: 7.0.6(postcss@8.4.49) - lilconfig: 3.1.2 + lilconfig: 3.1.3 postcss: 8.4.49 csso@5.0.5: @@ -17225,6 +17592,12 @@ snapshots: dependencies: ms: 2.1.3 + debug@4.4.0(supports-color@8.1.1): + dependencies: + ms: 2.1.3 + optionalDependencies: + supports-color: 8.1.1 + debug@4.4.0(supports-color@9.4.0): dependencies: ms: 2.1.3 @@ -17448,6 +17821,10 @@ snapshots: fast-check: 3.23.0 optional: true + ejs@3.1.10: + dependencies: + jake: 10.9.2 + electron-to-chromium@1.5.50: {} elkjs@0.8.2: {} @@ -17720,12 +18097,12 @@ snapshots: dependencies: '@next/eslint-plugin-next': 15.0.3 '@rushstack/eslint-patch': 1.10.4 - '@typescript-eslint/eslint-plugin': 8.15.0(@typescript-eslint/parser@8.15.0(eslint@8.57.1)(typescript@5.6.3))(eslint@8.57.1)(typescript@5.6.3) - '@typescript-eslint/parser': 8.15.0(eslint@8.57.1)(typescript@5.6.3) + '@typescript-eslint/eslint-plugin': 8.20.0(@typescript-eslint/parser@8.20.0(eslint@8.57.1)(typescript@5.6.3))(eslint@8.57.1)(typescript@5.6.3) + '@typescript-eslint/parser': 8.20.0(eslint@8.57.1)(typescript@5.6.3) eslint: 8.57.1 eslint-import-resolver-node: 0.3.9 - eslint-import-resolver-typescript: 3.6.3(@typescript-eslint/parser@8.15.0(eslint@8.57.1)(typescript@5.6.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.15.0(eslint@8.57.1)(typescript@5.6.3))(eslint@8.57.1))(eslint@8.57.1) - eslint-plugin-import: 2.31.0(@typescript-eslint/parser@8.15.0(eslint@8.57.1)(typescript@5.6.3))(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@8.15.0(eslint@8.57.1)(typescript@5.6.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.15.0(eslint@8.57.1)(typescript@5.6.3))(eslint@8.57.1))(eslint@8.57.1))(eslint@8.57.1) + eslint-import-resolver-typescript: 3.6.3(@typescript-eslint/parser@8.20.0(eslint@8.57.1)(typescript@5.6.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.20.0(eslint@8.57.1)(typescript@5.6.3))(eslint@8.57.1))(eslint@8.57.1) + eslint-plugin-import: 2.31.0(@typescript-eslint/parser@8.20.0(eslint@8.57.1)(typescript@5.6.3))(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@8.20.0(eslint@8.57.1)(typescript@5.6.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.20.0(eslint@8.57.1)(typescript@5.6.3))(eslint@8.57.1))(eslint@8.57.1))(eslint@8.57.1) eslint-plugin-jsx-a11y: 6.10.2(eslint@8.57.1) eslint-plugin-react: 7.37.2(eslint@8.57.1) eslint-plugin-react-hooks: 5.0.0(eslint@8.57.1) @@ -17736,14 +18113,18 @@ snapshots: - eslint-plugin-import-x - supports-color + eslint-config-prettier@10.0.1(eslint@9.17.0(jiti@2.4.0)): + dependencies: + eslint: 9.17.0(jiti@2.4.0) + eslint-config-prettier@9.1.0(eslint@9.17.0(jiti@2.4.0)): dependencies: eslint: 9.17.0(jiti@2.4.0) - eslint-config-turbo@2.3.0(eslint@9.17.0(jiti@2.4.0)): + eslint-config-turbo@2.3.3(eslint@9.17.0(jiti@2.4.0)): dependencies: eslint: 9.17.0(jiti@2.4.0) - eslint-plugin-turbo: 2.3.0(eslint@9.17.0(jiti@2.4.0)) + eslint-plugin-turbo: 2.3.3(eslint@9.17.0(jiti@2.4.0)) eslint-import-resolver-node@0.3.9: dependencies: @@ -17753,37 +18134,37 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@8.15.0(eslint@8.57.1)(typescript@5.6.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.15.0(eslint@8.57.1)(typescript@5.6.3))(eslint@8.57.1))(eslint@8.57.1): + eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@8.20.0(eslint@8.57.1)(typescript@5.6.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.20.0(eslint@8.57.1)(typescript@5.6.3))(eslint@8.57.1))(eslint@8.57.1): dependencies: '@nolyfill/is-core-module': 1.0.39 debug: 4.4.0(supports-color@9.4.0) enhanced-resolve: 5.17.1 eslint: 8.57.1 - eslint-module-utils: 2.12.0(@typescript-eslint/parser@8.15.0(eslint@8.57.1)(typescript@5.6.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@8.15.0(eslint@8.57.1)(typescript@5.6.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.15.0(eslint@8.57.1)(typescript@5.6.3))(eslint@8.57.1))(eslint@8.57.1))(eslint@8.57.1) + eslint-module-utils: 2.12.0(@typescript-eslint/parser@8.20.0(eslint@8.57.1)(typescript@5.6.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@8.20.0(eslint@8.57.1)(typescript@5.6.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.20.0(eslint@8.57.1)(typescript@5.6.3))(eslint@8.57.1))(eslint@8.57.1))(eslint@8.57.1) fast-glob: 3.3.2 get-tsconfig: 4.8.1 is-bun-module: 1.2.1 is-glob: 4.0.3 optionalDependencies: - eslint-plugin-import: 2.31.0(@typescript-eslint/parser@8.15.0(eslint@8.57.1)(typescript@5.6.3))(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@8.15.0(eslint@8.57.1)(typescript@5.6.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.15.0(eslint@8.57.1)(typescript@5.6.3))(eslint@8.57.1))(eslint@8.57.1))(eslint@8.57.1) + eslint-plugin-import: 2.31.0(@typescript-eslint/parser@8.20.0(eslint@8.57.1)(typescript@5.6.3))(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@8.20.0(eslint@8.57.1)(typescript@5.6.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.20.0(eslint@8.57.1)(typescript@5.6.3))(eslint@8.57.1))(eslint@8.57.1))(eslint@8.57.1) transitivePeerDependencies: - '@typescript-eslint/parser' - eslint-import-resolver-node - eslint-import-resolver-webpack - supports-color - eslint-module-utils@2.12.0(@typescript-eslint/parser@8.15.0(eslint@8.57.1)(typescript@5.6.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@8.15.0(eslint@8.57.1)(typescript@5.6.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.15.0(eslint@8.57.1)(typescript@5.6.3))(eslint@8.57.1))(eslint@8.57.1))(eslint@8.57.1): + eslint-module-utils@2.12.0(@typescript-eslint/parser@8.20.0(eslint@8.57.1)(typescript@5.6.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@8.20.0(eslint@8.57.1)(typescript@5.6.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.20.0(eslint@8.57.1)(typescript@5.6.3))(eslint@8.57.1))(eslint@8.57.1))(eslint@8.57.1): dependencies: debug: 3.2.7 optionalDependencies: - '@typescript-eslint/parser': 8.15.0(eslint@8.57.1)(typescript@5.6.3) + '@typescript-eslint/parser': 8.20.0(eslint@8.57.1)(typescript@5.6.3) eslint: 8.57.1 eslint-import-resolver-node: 0.3.9 - eslint-import-resolver-typescript: 3.6.3(@typescript-eslint/parser@8.15.0(eslint@8.57.1)(typescript@5.6.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.15.0(eslint@8.57.1)(typescript@5.6.3))(eslint@8.57.1))(eslint@8.57.1) + eslint-import-resolver-typescript: 3.6.3(@typescript-eslint/parser@8.20.0(eslint@8.57.1)(typescript@5.6.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.20.0(eslint@8.57.1)(typescript@5.6.3))(eslint@8.57.1))(eslint@8.57.1) transitivePeerDependencies: - supports-color - eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.15.0(eslint@8.57.1)(typescript@5.6.3))(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@8.15.0(eslint@8.57.1)(typescript@5.6.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.15.0(eslint@8.57.1)(typescript@5.6.3))(eslint@8.57.1))(eslint@8.57.1))(eslint@8.57.1): + eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.20.0(eslint@8.57.1)(typescript@5.6.3))(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@8.20.0(eslint@8.57.1)(typescript@5.6.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.20.0(eslint@8.57.1)(typescript@5.6.3))(eslint@8.57.1))(eslint@8.57.1))(eslint@8.57.1): dependencies: '@rtsao/scc': 1.1.0 array-includes: 3.1.8 @@ -17794,7 +18175,7 @@ snapshots: doctrine: 2.1.0 eslint: 8.57.1 eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.12.0(@typescript-eslint/parser@8.15.0(eslint@8.57.1)(typescript@5.6.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@8.15.0(eslint@8.57.1)(typescript@5.6.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.15.0(eslint@8.57.1)(typescript@5.6.3))(eslint@8.57.1))(eslint@8.57.1))(eslint@8.57.1) + eslint-module-utils: 2.12.0(@typescript-eslint/parser@8.20.0(eslint@8.57.1)(typescript@5.6.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@8.20.0(eslint@8.57.1)(typescript@5.6.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.20.0(eslint@8.57.1)(typescript@5.6.3))(eslint@8.57.1))(eslint@8.57.1))(eslint@8.57.1) hasown: 2.0.2 is-core-module: 2.15.1 is-glob: 4.0.3 @@ -17806,7 +18187,7 @@ snapshots: string.prototype.trimend: 1.0.8 tsconfig-paths: 3.15.0 optionalDependencies: - '@typescript-eslint/parser': 8.15.0(eslint@8.57.1)(typescript@5.6.3) + '@typescript-eslint/parser': 8.20.0(eslint@8.57.1)(typescript@5.6.3) transitivePeerDependencies: - eslint-import-resolver-typescript - eslint-import-resolver-webpack @@ -17865,25 +18246,6 @@ snapshots: string.prototype.matchall: 4.0.11 string.prototype.repeat: 1.0.0 - eslint-plugin-svelte@2.46.0(eslint@9.17.0(jiti@2.4.0))(svelte@5.16.6): - dependencies: - '@eslint-community/eslint-utils': 4.4.1(eslint@9.17.0(jiti@2.4.0)) - '@jridgewell/sourcemap-codec': 1.5.0 - eslint: 9.17.0(jiti@2.4.0) - eslint-compat-utils: 0.5.1(eslint@9.17.0(jiti@2.4.0)) - esutils: 2.0.3 - known-css-properties: 0.35.0 - postcss: 8.4.49 - postcss-load-config: 3.1.4(postcss@8.4.49) - postcss-safe-parser: 6.0.0(postcss@8.4.49) - postcss-selector-parser: 6.1.2 - semver: 7.6.3 - svelte-eslint-parser: 0.43.0(svelte@5.16.6) - optionalDependencies: - svelte: 5.16.6 - transitivePeerDependencies: - - ts-node - eslint-plugin-svelte@2.46.1(eslint@9.17.0(jiti@2.4.0))(svelte@5.16.6): dependencies: '@eslint-community/eslint-utils': 4.4.1(eslint@9.17.0(jiti@2.4.0)) @@ -17903,7 +18265,7 @@ snapshots: transitivePeerDependencies: - ts-node - eslint-plugin-turbo@2.3.0(eslint@9.17.0(jiti@2.4.0)): + eslint-plugin-turbo@2.3.3(eslint@9.17.0(jiti@2.4.0)): dependencies: dotenv: 16.0.3 eslint: 9.17.0(jiti@2.4.0) @@ -18163,6 +18525,10 @@ snapshots: file-uri-to-path@1.0.0: {} + filelist@1.0.4: + dependencies: + minimatch: 5.1.6 + filing-cabinet@5.0.2: dependencies: app-module-path: 2.2.0 @@ -18335,6 +18701,8 @@ snapshots: get-own-enumerable-property-symbols@3.0.2: {} + get-package-type@0.1.0: {} + get-port-please@3.1.2: {} get-stream@6.0.1: {} @@ -18477,6 +18845,8 @@ snapshots: gsap@3.12.5: {} + gsap@3.12.7: {} + gzip-size@7.0.0: dependencies: duplexer: 0.1.2 @@ -18556,6 +18926,10 @@ snapshots: hookable@5.5.3: {} + hosted-git-info@7.0.2: + dependencies: + lru-cache: 10.4.3 + html-tags@3.3.1: {} html-void-elements@3.0.0: {} @@ -18657,6 +19031,8 @@ snapshots: imurmurhash@0.1.4: {} + indent-string@4.0.0: {} + index-to-position@0.1.2: {} inflight@1.0.6: @@ -18899,6 +19275,8 @@ snapshots: isexe@2.0.0: {} + isexe@3.1.1: {} + isstream@0.1.2: {} iterator.prototype@1.1.3: @@ -18919,6 +19297,13 @@ snapshots: dependencies: '@isaacs/cliui': 8.0.2 + jake@10.9.2: + dependencies: + async: 3.2.6 + chalk: 4.1.2 + filelist: 1.0.4 + minimatch: 3.1.2 + jiti@1.21.6: {} jiti@2.4.0: {} @@ -19018,9 +19403,9 @@ snapshots: kind-of@6.0.3: {} - kkrpc@0.0.12(typescript@5.6.3): + kkrpc@0.0.12(typescript@5.7.2): dependencies: - typescript: 5.6.3 + typescript: 5.7.2 ws: 8.18.0 transitivePeerDependencies: - bufferutil @@ -19034,6 +19419,14 @@ snapshots: - bufferutil - utf-8-validate + kkrpc@0.0.13(typescript@5.7.2): + dependencies: + typescript: 5.7.2 + ws: 8.18.0 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + kleur@3.0.3: {} kleur@4.1.5: {} @@ -19222,6 +19615,10 @@ snapshots: dependencies: svelte: 5.16.6 + lucide-svelte@0.471.0(svelte@5.16.6): + dependencies: + svelte: 5.16.6 + lucide-vue-next@0.438.0(vue@3.5.13(typescript@5.6.3)): dependencies: vue: 3.5.13(typescript@5.6.3) @@ -19230,7 +19627,7 @@ snapshots: lz-string@1.5.0: {} - madge@8.0.0(typescript@5.6.3): + madge@8.0.0(typescript@5.7.2): dependencies: chalk: 4.1.2 commander: 7.2.0 @@ -19245,7 +19642,7 @@ snapshots: ts-graphviz: 2.1.4 walkdir: 0.4.1 optionalDependencies: - typescript: 5.6.3 + typescript: 5.7.2 transitivePeerDependencies: - supports-color @@ -19645,6 +20042,13 @@ snapshots: npm-normalize-package-bin@4.0.0: {} + npm-package-arg@11.0.3: + dependencies: + hosted-git-info: 7.0.2 + proc-log: 4.2.0 + semver: 7.6.3 + validate-npm-package-name: 5.0.1 + npm-run-path@4.0.1: dependencies: path-key: 3.1.1 @@ -19653,6 +20057,8 @@ snapshots: dependencies: path-key: 4.0.0 + npm@10.9.2: {} + npmlog@5.0.1: dependencies: are-we-there-yet: 2.0.0 @@ -19798,6 +20204,8 @@ snapshots: object-keys@1.1.1: {} + object-treeify@4.0.1: {} + object.assign@4.1.5: dependencies: call-bind: 1.0.7 @@ -19854,7 +20262,7 @@ snapshots: dependencies: mimic-fn: 4.0.0 - oniguruma-to-es@0.10.0: + oniguruma-to-es@2.0.0: dependencies: emoji-regex-xs: 1.0.0 regex: 5.1.1 @@ -20377,6 +20785,8 @@ snapshots: dependencies: parse-ms: 2.1.0 + proc-log@4.2.0: {} + proc-log@5.0.0: {} process-nextick-args@2.0.1: {} @@ -21013,24 +21423,24 @@ snapshots: interpret: 1.4.0 rechoir: 0.6.2 - shiki-magic-move@0.5.2(react@18.3.1)(shiki@1.26.1)(svelte@5.16.6)(vue@3.5.13(typescript@5.7.2)): + shiki-magic-move@0.5.2(react@18.3.1)(shiki@1.27.2)(svelte@5.16.6)(vue@3.5.13(typescript@5.7.2)): dependencies: diff-match-patch-es: 0.1.1 ohash: 1.1.4 optionalDependencies: react: 18.3.1 - shiki: 1.26.1 + shiki: 1.27.2 svelte: 5.16.6 vue: 3.5.13(typescript@5.7.2) - shiki@1.26.1: + shiki@1.27.2: dependencies: - '@shikijs/core': 1.26.1 - '@shikijs/engine-javascript': 1.26.1 - '@shikijs/engine-oniguruma': 1.26.1 - '@shikijs/langs': 1.26.1 - '@shikijs/themes': 1.26.1 - '@shikijs/types': 1.26.1 + '@shikijs/core': 1.27.2 + '@shikijs/engine-javascript': 1.27.2 + '@shikijs/engine-oniguruma': 1.27.2 + '@shikijs/langs': 1.27.2 + '@shikijs/themes': 1.27.2 + '@shikijs/types': 1.27.2 '@shikijs/vscode-textmate': 10.0.1 '@types/hast': 3.0.4 @@ -21304,6 +21714,10 @@ snapshots: dependencies: has-flag: 4.0.0 + supports-color@8.1.1: + dependencies: + has-flag: 4.0.0 + supports-color@9.4.0: {} supports-preserve-symlinks-flag@1.0.0: {} @@ -21397,7 +21811,7 @@ snapshots: joi: 17.13.3 json-schema-to-ts: 3.1.1 superstruct: 2.0.2 - valibot: 1.0.0-beta.11(typescript@5.6.3) + valibot: 1.0.0-beta.12(typescript@5.6.3) yup: 1.6.1 zod: 3.24.1 zod-to-json-schema: 3.24.1(zod@3.24.1) @@ -21424,7 +21838,7 @@ snapshots: joi: 17.13.3 json-schema-to-ts: 3.1.1 superstruct: 2.0.2 - valibot: 1.0.0-beta.11(typescript@5.7.2) + valibot: 1.0.0-beta.12(typescript@5.7.2) yup: 1.6.1 zod: 3.24.1 zod-to-json-schema: 3.24.1(zod@3.24.1) @@ -21564,7 +21978,7 @@ snapshots: mkdirp: 3.0.1 yallist: 5.0.0 - tauri-api-adapter@0.3.16(typescript@5.6.3): + tauri-api-adapter@0.3.16(typescript@5.7.2): dependencies: '@tauri-apps/api': 2.2.0 '@tauri-apps/plugin-dialog': 2.2.0 @@ -21575,16 +21989,16 @@ snapshots: '@tauri-apps/plugin-os': 2.2.0 '@tauri-apps/plugin-shell': 2.2.0 '@tauri-apps/plugin-upload': 2.2.1 - kkrpc: 0.0.12(typescript@5.6.3) + kkrpc: 0.0.12(typescript@5.7.2) rimraf: 6.0.1 shx: 0.3.4 - tauri-plugin-clipboard-api: 2.1.11(typescript@5.6.3) - tauri-plugin-network-api: 2.0.5(typescript@5.6.3) + tauri-plugin-clipboard-api: 2.1.11(typescript@5.7.2) + tauri-plugin-network-api: 2.0.5(typescript@5.7.2) tauri-plugin-shellx-api: 2.0.14 - tauri-plugin-system-info-api: 2.0.8(typescript@5.6.3) + tauri-plugin-system-info-api: 2.0.8(typescript@5.7.2) tsc-alias: 1.8.10 - typescript: 5.6.3 - valibot: 1.0.0-beta.11(typescript@5.6.3) + typescript: 5.7.2 + valibot: 1.0.0-beta.11(typescript@5.7.2) transitivePeerDependencies: - bufferutil - utf-8-validate @@ -21623,6 +22037,13 @@ snapshots: transitivePeerDependencies: - typescript + tauri-plugin-clipboard-api@2.1.11(typescript@5.7.2): + dependencies: + '@tauri-apps/api': 2.0.1 + valibot: 0.40.0(typescript@5.7.2) + transitivePeerDependencies: + - typescript + tauri-plugin-network-api@2.0.5(typescript@5.6.3): dependencies: '@tauri-apps/api': 2.2.0 @@ -21630,6 +22051,13 @@ snapshots: transitivePeerDependencies: - typescript + tauri-plugin-network-api@2.0.5(typescript@5.7.2): + dependencies: + '@tauri-apps/api': 2.2.0 + valibot: 1.0.0-beta.11(typescript@5.7.2) + transitivePeerDependencies: + - typescript + tauri-plugin-shellx-api@2.0.11: dependencies: '@tauri-apps/api': 2.2.0 @@ -21645,6 +22073,13 @@ snapshots: transitivePeerDependencies: - typescript + tauri-plugin-system-info-api@2.0.8(typescript@5.7.2): + dependencies: + '@tauri-apps/api': 2.2.0 + valibot: 0.40.0(typescript@5.7.2) + transitivePeerDependencies: + - typescript + term-size@2.2.1: {} terser@5.36.0: @@ -21740,6 +22175,10 @@ snapshots: dependencies: typescript: 5.7.2 + ts-api-utils@2.0.0(typescript@5.6.3): + dependencies: + typescript: 5.6.3 + ts-api-utils@2.0.0(typescript@5.7.2): dependencies: typescript: 5.7.2 @@ -21897,15 +22336,6 @@ snapshots: typescript: 5.6.3 yaml: 2.6.1 - typedoc@0.27.6(typescript@5.6.3): - dependencies: - '@gerrit0/mini-shiki': 1.24.4 - lunr: 2.3.9 - markdown-it: 14.1.0 - minimatch: 9.0.5 - typescript: 5.6.3 - yaml: 2.6.1 - typedoc@0.27.6(typescript@5.7.2): dependencies: '@gerrit0/mini-shiki': 1.24.4 @@ -21925,6 +22355,26 @@ snapshots: transitivePeerDependencies: - supports-color + typescript-eslint@8.20.0(eslint@9.17.0(jiti@2.4.0))(typescript@5.6.3): + dependencies: + '@typescript-eslint/eslint-plugin': 8.20.0(@typescript-eslint/parser@8.20.0(eslint@9.17.0(jiti@2.4.0))(typescript@5.6.3))(eslint@9.17.0(jiti@2.4.0))(typescript@5.6.3) + '@typescript-eslint/parser': 8.20.0(eslint@9.17.0(jiti@2.4.0))(typescript@5.6.3) + '@typescript-eslint/utils': 8.20.0(eslint@9.17.0(jiti@2.4.0))(typescript@5.6.3) + eslint: 9.17.0(jiti@2.4.0) + typescript: 5.6.3 + transitivePeerDependencies: + - supports-color + + typescript-eslint@8.20.0(eslint@9.17.0(jiti@2.4.0))(typescript@5.7.2): + dependencies: + '@typescript-eslint/eslint-plugin': 8.20.0(@typescript-eslint/parser@8.20.0(eslint@9.17.0(jiti@2.4.0))(typescript@5.7.2))(eslint@9.17.0(jiti@2.4.0))(typescript@5.7.2) + '@typescript-eslint/parser': 8.20.0(eslint@9.17.0(jiti@2.4.0))(typescript@5.7.2) + '@typescript-eslint/utils': 8.20.0(eslint@9.17.0(jiti@2.4.0))(typescript@5.7.2) + eslint: 9.17.0(jiti@2.4.0) + typescript: 5.7.2 + transitivePeerDependencies: + - supports-color + typescript@4.9.5: {} typescript@5.5.4: {} @@ -22158,6 +22608,10 @@ snapshots: optionalDependencies: typescript: 5.6.3 + valibot@0.40.0(typescript@5.7.2): + optionalDependencies: + typescript: 5.7.2 + valibot@1.0.0-beta.10(typescript@5.6.3): optionalDependencies: typescript: 5.6.3 @@ -22174,10 +22628,21 @@ snapshots: optionalDependencies: typescript: 5.7.2 + valibot@1.0.0-beta.12(typescript@5.6.3): + optionalDependencies: + typescript: 5.6.3 + optional: true + + valibot@1.0.0-beta.12(typescript@5.7.2): + optionalDependencies: + typescript: 5.7.2 + valibot@1.0.0-beta.9(typescript@5.6.3): optionalDependencies: typescript: 5.6.3 + validate-npm-package-name@5.0.1: {} + validator@13.12.0: optional: true @@ -22212,6 +22677,16 @@ snapshots: type-fest: 4.27.0 vue: 3.5.13(typescript@5.6.3) + verify-package-export@0.0.2(typescript@5.7.2): + 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.2) + transitivePeerDependencies: + - supports-color + - typescript + verror@1.10.0: dependencies: assert-plus: 1.0.0 @@ -22560,6 +23035,10 @@ snapshots: dependencies: isexe: 2.0.0 + which@4.0.0: + dependencies: + isexe: 3.1.1 + why-is-node-running@2.3.0: dependencies: siginfo: 2.0.0 @@ -22569,6 +23048,10 @@ snapshots: dependencies: string-width: 4.2.3 + widest-line@3.1.0: + dependencies: + string-width: 4.2.3 + word-wrap@1.2.5: {} wordwrap@1.0.0: {} @@ -22628,6 +23111,8 @@ snapshots: y18n: 5.0.8 yargs-parser: 21.1.1 + yarn@1.22.22: {} + ylru@1.4.0: {} yocto-queue@0.1.0: {}