Feature: license check (#67)

* feat: add required license field to manifest

* chore: add license MIT to all templates

* feat: add license check to jsr and npm validation

* fix: supabase export

split every item into its own subexport for better debugability

* fix: supabase imports

* feat: hide app when escape is pressed

* fix: update package version in api test from 0.0.6 to 0.0.20

* fix: update test for kunkun extension with new version and commit details

* fix: update kunkun extension test to use version 0.0.4

* fix: update kunkun extension test to reflect new version 0.0.20 and updated commit details

* feat: display downloads in extension details

* feat: add downloads display to store
This commit is contained in:
Huakun Shen 2025-01-18 22:55:43 -05:00 committed by GitHub
parent 7a3b6f3983
commit 402208e95a
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
40 changed files with 344 additions and 137 deletions

View File

@ -1,10 +1,10 @@
import { appIsDev } from "@kksh/api/commands" import { appIsDev } from "@kksh/api/commands"
import { appDataDir, join } from "@tauri-apps/api/path" import { appDataDir, join } from "@tauri-apps/api/path"
import * as fs from "@tauri-apps/plugin-fs" import * as fs from "@tauri-apps/plugin-fs"
import { PUBLIC_SUPABASE_ANON_KEY, PUBLIC_SUPABASE_PROJECT_ID } from "$env/static/public" import { PUBLIC_SUPABASE_ANON_KEY, PUBLIC_SUPABASE_URL } from "$env/static/public"
export const SUPABASE_ANON_KEY = PUBLIC_SUPABASE_ANON_KEY export const SUPABASE_ANON_KEY = PUBLIC_SUPABASE_ANON_KEY
export const SUPABASE_URL = `https://${PUBLIC_SUPABASE_PROJECT_ID}.supabase.co` export const SUPABASE_URL = PUBLIC_SUPABASE_URL
export const SUPABASE_GRAPHQL_ENDPOINT = `${SUPABASE_URL}/graphql/v1` export const SUPABASE_GRAPHQL_ENDPOINT = `${SUPABASE_URL}/graphql/v1`
export function getExtensionsFolder() { export function getExtensionsFolder() {
return appDataDir() return appDataDir()

View File

@ -1,7 +1,19 @@
import { createSB, SupabaseAPI } from "@kksh/supabase" import { SupabaseAPI } from "@kksh/supabase/api"
import type { Database } from "@kksh/supabase/types"
import { createClient, SupabaseClient } from "@supabase/supabase-js"
import { SUPABASE_ANON_KEY, SUPABASE_URL } from "./constants" import { SUPABASE_ANON_KEY, SUPABASE_URL } from "./constants"
export const supabase = createSB(SUPABASE_URL, SUPABASE_ANON_KEY) // export const supabase = createSB(SUPABASE_URL, SUPABASE_ANON_KEY)
export const supabase: SupabaseClient<Database> = createClient<Database>(
SUPABASE_URL,
SUPABASE_ANON_KEY,
{
auth: {
flowType: "pkce"
}
}
)
export const storage = supabase.storage export const storage = supabase.storage
export const supabaseExtensionsStorage = supabase.storage.from("extensions") export const supabaseExtensionsStorage = supabase.storage.from("extensions")
export const supabaseAPI = new SupabaseAPI(supabase) export const supabaseAPI = new SupabaseAPI(supabase)

View File

@ -37,8 +37,12 @@
let inputEle: HTMLInputElement | null = $state(null) let inputEle: HTMLInputElement | null = $state(null)
function onKeyDown(event: KeyboardEvent) { function onKeyDown(event: KeyboardEvent) {
if (event.key === "Escape") { if (event.key === "Escape") {
;(event.target as HTMLInputElement).value = "" if ((event.target as HTMLInputElement).value === "") {
$appState.searchTerm = "" getCurrentWindow().hide()
} else {
;(event.target as HTMLInputElement).value = ""
$appState.searchTerm = ""
}
} }
} }

View File

@ -4,8 +4,9 @@
import { supabaseAPI } from "@/supabase" import { supabaseAPI } from "@/supabase"
import { goBackOnEscapeClearSearchTerm, goHomeOnEscapeClearSearchTerm } from "@/utils/key" import { goBackOnEscapeClearSearchTerm, goHomeOnEscapeClearSearchTerm } from "@/utils/key"
import { goBack, goHome } from "@/utils/route" import { goBack, goHome } from "@/utils/route"
import { SBExt, type Tables } from "@kksh/supabase" import { SBExt } from "@kksh/supabase/models"
import type { ExtPublishMetadata } from "@kksh/supabase/models" import type { ExtPublishMetadata } from "@kksh/supabase/models"
import { type Tables } from "@kksh/supabase/types"
import { Button, Command } from "@kksh/svelte5" import { Button, Command } from "@kksh/svelte5"
import { Constants } from "@kksh/ui" import { Constants } from "@kksh/ui"
import { ExtListItem } from "@kksh/ui/extension" import { ExtListItem } from "@kksh/ui/extension"

View File

@ -2,7 +2,7 @@ import { appConfig, extensions, installedStoreExts } from "@/stores"
import { supabaseAPI } from "@/supabase" import { supabaseAPI } from "@/supabase"
import type { ExtPackageJsonExtra } from "@kksh/api/models" import type { ExtPackageJsonExtra } from "@kksh/api/models"
import { isExtPathInDev, isUpgradable } from "@kksh/extension" import { isExtPathInDev, isUpgradable } from "@kksh/extension"
import { SBExt } from "@kksh/supabase" import { SBExt } from "@kksh/supabase/models"
import { error } from "@sveltejs/kit" import { error } from "@sveltejs/kit"
import { derived, get, type Readable } from "svelte/store" import { derived, get, type Readable } from "svelte/store"
import type { PageLoad } from "./$types" import type { PageLoad } from "./$types"

View File

@ -19,15 +19,18 @@
import { getInstallExtras } from "./helper.js" import { getInstallExtras } from "./helper.js"
const { data } = $props() const { data } = $props()
const ext: Tables<"ext_publish"> & { metadata: ExtPublishMetadata } = $derived(data.ext) const extPublish: Tables<"ext_publish"> & { metadata: ExtPublishMetadata } = $derived(
data.extPublish
)
const ext: Tables<"extensions"> = $derived(data.ext)
const manifest = $derived(data.manifest) const manifest = $derived(data.manifest)
const installedExt = storeDerived(installedStoreExts, ($e) => { const installedExt = storeDerived(installedStoreExts, ($e) => {
return $e.find((e) => e.kunkun.identifier === ext.identifier) return $e.find((e) => e.kunkun.identifier === extPublish.identifier)
}) })
const isUpgradable = $derived( const isUpgradable = $derived(
$installedExt $installedExt
? greaterThan(parseSemver(ext.version), parseSemver($installedExt.version)) ? greaterThan(parseSemver(extPublish.version), parseSemver($installedExt.version))
: false : false
) )
$effect(() => { $effect(() => {
@ -67,30 +70,30 @@
}) })
const demoImages = $derived( const demoImages = $derived(
ext.demo_images.map((src) => supabaseAPI.translateExtensionFilePathToUrl(src)) extPublish.demo_images.map((src) => supabaseAPI.translateExtensionFilePathToUrl(src))
) )
async function onInstallSelected() { async function onInstallSelected() {
loading.install = true loading.install = true
const tarballUrl = ext.tarball_path.startsWith("http") const tarballUrl = extPublish.tarball_path.startsWith("http")
? ext.tarball_path ? extPublish.tarball_path
: supabaseAPI.translateExtensionFilePathToUrl(ext.tarball_path) : supabaseAPI.translateExtensionFilePathToUrl(extPublish.tarball_path)
const installExtras = await getInstallExtras(ext) const installExtras = await getInstallExtras(extPublish)
const installDir = await getExtensionsFolder() const installDir = await getExtensionsFolder()
return extensions return extensions
.installFromTarballUrl(tarballUrl, installDir, installExtras) .installFromTarballUrl(tarballUrl, installDir, installExtras)
.then(() => toast.success(`Plugin ${ext.name} Installed`)) .then(() => toast.success(`Plugin ${extPublish.name} Installed`))
.then((loadedExt) => { .then((loadedExt) => {
info(`Successfully installed ${ext.name}`) info(`Successfully installed ${extPublish.name}`)
supabaseAPI.incrementDownloads({ supabaseAPI.incrementDownloads({
identifier: ext.identifier, identifier: extPublish.identifier,
version: ext.version version: extPublish.version
}) })
showBtn.install = false showBtn.install = false
showBtn.uninstall = true showBtn.uninstall = true
}) })
.catch((err) => { .catch((err) => {
error(`Fail to install tarball (${ext.identifier}): ${err}`) error(`Fail to install tarball (${extPublish.identifier}): ${err}`)
toast.error("Fail to install tarball", { description: err }) toast.error("Fail to install tarball", { description: err })
}) })
.finally(() => { .finally(() => {
@ -100,11 +103,13 @@
function onUpgradeSelected() { function onUpgradeSelected() {
loading.upgrade = true loading.upgrade = true
const tarballUrl = supabaseAPI.translateExtensionFilePathToUrl(ext.tarball_path) const tarballUrl = supabaseAPI.translateExtensionFilePathToUrl(extPublish.tarball_path)
return extensions return extensions
.upgradeStoreExtension(ext.identifier, tarballUrl) .upgradeStoreExtension(extPublish.identifier, tarballUrl)
.then((newExt) => { .then((newExt) => {
toast.success(`${ext.name} Upgraded from ${$installedExt?.version} to ${newExt.version}`) toast.success(
`${extPublish.name} Upgraded from ${$installedExt?.version} to ${newExt.version}`
)
}) })
.catch((err) => { .catch((err) => {
toast.error("Fail to upgrade extension", { description: err }) toast.error("Fail to upgrade extension", { description: err })
@ -121,7 +126,7 @@
function onUninstallSelected() { function onUninstallSelected() {
loading.uninstall = true loading.uninstall = true
return extensions return extensions
.uninstallStoreExtensionByIdentifier(ext.identifier) .uninstallStoreExtensionByIdentifier(extPublish.identifier)
.then((uninstalledExt) => { .then((uninstalledExt) => {
toast.success(`${uninstalledExt.name} Uninstalled`) toast.success(`${uninstalledExt.name} Uninstalled`)
loading.uninstall = false loading.uninstall = false
@ -130,7 +135,7 @@
}) })
.catch((err) => { .catch((err) => {
toast.error("Fail to uninstall extension", { description: err }) toast.error("Fail to uninstall extension", { description: err })
error(`Fail to uninstall store extension (${ext.identifier}): ${err}`) error(`Fail to uninstall store extension (${extPublish.identifier}): ${err}`)
}) })
.finally(() => {}) .finally(() => {})
} }
@ -162,6 +167,7 @@
</Button> </Button>
<StoreExtDetail <StoreExtDetail
class="px-5" class="px-5"
{extPublish}
{ext} {ext}
{manifest} {manifest}
installedExt={$installedExt} installedExt={$installedExt}

View File

@ -11,29 +11,40 @@ import type { PageLoad } from "./$types"
export const load: PageLoad = async ({ export const load: PageLoad = async ({
params params
}): Promise<{ }): Promise<{
ext: Tables<"ext_publish"> & { metadata: ExtPublishMetadata } extPublish: Tables<"ext_publish"> & { metadata: ExtPublishMetadata }
ext: Tables<"extensions">
manifest: KunkunExtManifest manifest: KunkunExtManifest
params: { params: {
identifier: string identifier: string
} }
}> => { }> => {
const { error: dbError, data: ext } = await supabaseAPI.getLatestExtPublish(params.identifier) const { error: dbError, data: extPublish } = await supabaseAPI.getLatestExtPublish(
const metadataParse = v.safeParse(ExtPublishMetadata, ext?.metadata ?? {}) params.identifier
)
const metadataParse = v.safeParse(ExtPublishMetadata, extPublish?.metadata ?? {})
if (dbError) { if (dbError) {
return error(400, { return error(400, {
message: dbError.message message: dbError.message
}) })
} }
const metadata = metadataParse.success ? metadataParse.output : {} const metadata = metadataParse.success ? metadataParse.output : {}
const parseManifest = v.safeParse(KunkunExtManifest, ext.manifest) const parseManifest = v.safeParse(KunkunExtManifest, extPublish.manifest)
if (!parseManifest.success) { if (!parseManifest.success) {
const errMsg = "Invalid extension manifest, you may need to upgrade your app." const errMsg = "Invalid extension manifest, you may need to upgrade your app."
toast.error(errMsg) toast.error(errMsg)
throw error(400, errMsg) throw error(400, errMsg)
} }
const { data: ext, error: extError } = await supabaseAPI.getExtension(params.identifier)
if (extError) {
return error(400, {
message: extError.message
})
}
return { return {
ext: { ...ext, metadata }, extPublish: { ...extPublish, metadata },
ext,
params, params,
manifest: parseManifest.output manifest: parseManifest.output
} }

View File

@ -139,10 +139,35 @@ const Person = v.union([
}), }),
v.string("GitHub Username") v.string("GitHub Username")
]) ])
export const License = v.union([
v.literal("AGPL-3.0-only"),
v.literal("Apache-2.0"),
v.literal("BSD-2-Clause"),
v.literal("BSD-3-Clause"),
v.literal("BSL-1.0"),
v.literal("CC0-1.0"),
v.literal("CDDL-1.0"),
v.literal("CDDL-1.1"),
v.literal("EPL-1.0"),
v.literal("EPL-2.0"),
v.literal("GPL-2.0-only"),
v.literal("GPL-3.0-only"),
v.literal("ISC"),
v.literal("LGPL-2.0-only"),
v.literal("LGPL-2.1-only"),
v.literal("LGPL-2.1-or-later"),
v.literal("LGPL-3.0-only"),
v.literal("LGPL-3.0-or-later"),
v.literal("MIT"),
v.literal("MPL-2.0"),
v.literal("MS-PL"),
v.literal("UNLICENSED")
])
export type License = v.InferOutput<typeof License>
export const ExtPackageJson = v.object({ 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"), version: v.string("Version of the extension"),
license: License,
author: v.optional(Person), 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")), contributors: v.optional(v.array(Person, "Contributors of the extension")),

View File

@ -5,27 +5,34 @@
import { writeFileSync } from "fs" import { writeFileSync } from "fs"
import { join } from "path" import { join } from "path"
import { REPO_ROOT } from "@/path" import { REPO_ROOT } from "@/path"
import * as v from "valibot"
console.log("Init Env") console.log("Init Env")
const defaultEnvUrl = `https://storage.kunkun.sh/env.json` const defaultEnvUrl = `https://storage.kunkun.sh/env.json`
const res = await fetch(defaultEnvUrl) const res = await fetch(defaultEnvUrl)
const env = await res.json() const env = v.parse(
v.object({
SUPABASE_URL: v.string(),
SUPABASE_ANON_KEY: v.string()
}),
await res.json()
)
let envContent = "" let envContent = ""
if (!process.env.SUPABASE_ANON_KEY) { if (!process.env.SUPABASE_ANON_KEY) {
process.env.SUPABASE_ANON_KEY = env.SUPABASE_ANON_KEY process.env.SUPABASE_ANON_KEY = env.SUPABASE_ANON_KEY
} }
if (!process.env.SUPABASE_PROJECT_ID) { if (!process.env.SUPABASE_URL) {
process.env.SUPABASE_PROJECT_ID = env.SUPABASE_PROJECT_ID process.env.SUPABASE_URL = env.SUPABASE_URL
} }
if (process.env.SUPABASE_ANON_KEY) { if (process.env.SUPABASE_ANON_KEY) {
envContent += `SUPABASE_ANON_KEY=${process.env.SUPABASE_ANON_KEY}\n` envContent += `SUPABASE_ANON_KEY=${process.env.SUPABASE_ANON_KEY}\n`
} }
if (process.env.SUPABASE_PROJECT_ID) { if (process.env.SUPABASE_URL) {
const supabaseUrl = `https://${process.env.SUPABASE_PROJECT_ID}.supabase.co` const supabaseUrl = process.env.SUPABASE_URL
const supabaseGraphqlEndpoint = `${supabaseUrl}/graphql/v1` const supabaseGraphqlEndpoint = `${supabaseUrl}/graphql/v1`
envContent += ` envContent += `
SUPABASE_GRAPHQL_ENDPOINT=${supabaseGraphqlEndpoint} SUPABASE_GRAPHQL_ENDPOINT=${supabaseGraphqlEndpoint}
@ -47,7 +54,7 @@ writeFileSync(
join(REPO_ROOT, "apps/desktop/.env"), join(REPO_ROOT, "apps/desktop/.env"),
` `
PUBLIC_SUPABASE_ANON_KEY=${process.env.SUPABASE_ANON_KEY} PUBLIC_SUPABASE_ANON_KEY=${process.env.SUPABASE_ANON_KEY}
PUBLIC_SUPABASE_PROJECT_ID=${process.env.SUPABASE_PROJECT_ID} PUBLIC_SUPABASE_URL=${process.env.SUPABASE_URL}
` `
) )
// writeFileSync(join(__dirname, "../packages/gql/.env"), envContent) // writeFileSync(join(__dirname, "../packages/gql/.env"), envContent)

View File

@ -5,7 +5,7 @@
import { isCompatible } from "@kksh/api" import { isCompatible } from "@kksh/api"
import { db, decompressTarball } from "@kksh/api/commands" import { db, decompressTarball } from "@kksh/api/commands"
import type { ExtPackageJsonExtra } from "@kksh/api/models" import type { ExtPackageJsonExtra } from "@kksh/api/models"
import { SBExt } from "@kksh/supabase" import { SBExt } from "@kksh/supabase/models"
import { greaterThan, parse as parseSemver } from "@std/semver" import { greaterThan, parse as parseSemver } from "@std/semver"
import * as path from "@tauri-apps/api/path" import * as path from "@tauri-apps/api/path"
import * as dialog from "@tauri-apps/plugin-dialog" import * as dialog from "@tauri-apps/plugin-dialog"

View File

@ -1,11 +1,16 @@
import { db } from "@kksh/api/commands" import { db } from "@kksh/api/commands"
import { ExtPackageJson, ExtPackageJsonExtra } from "@kksh/api/models" import { ExtPackageJson, ExtPackageJsonExtra, License } from "@kksh/api/models"
import { basename, dirname, join } from "@tauri-apps/api/path" import { basename, dirname, join } from "@tauri-apps/api/path"
import { readDir, readTextFile } from "@tauri-apps/plugin-fs" import { readDir, readTextFile } from "@tauri-apps/plugin-fs"
import { debug, error } from "@tauri-apps/plugin-log" import { debug, error } from "@tauri-apps/plugin-log"
import * as v from "valibot" import * as v from "valibot"
import { upsertExtension } from "./db" import { upsertExtension } from "./db"
const OptionalExtPackageJson = v.object({
...ExtPackageJson.entries,
license: v.optional(License, "MIT") // TODO: remove this optional package json later
})
/** /**
* *
* @param manifestPath absolute path to package.json * @param manifestPath absolute path to package.json
@ -15,10 +20,10 @@ export function loadExtensionManifestFromDisk(manifestPath: string): Promise<Ext
debug(`loadExtensionManifestFromDisk: ${manifestPath}`) debug(`loadExtensionManifestFromDisk: ${manifestPath}`)
return readTextFile(manifestPath).then(async (content) => { return readTextFile(manifestPath).then(async (content) => {
const json = JSON.parse(content) const json = JSON.parse(content)
const parse = v.safeParse(ExtPackageJson, json) const parse = v.safeParse(OptionalExtPackageJson, json)
if (parse.issues) { if (parse.issues) {
error(`Fail to load extension from ${manifestPath}. See console for parse error.`) error(`Fail to load extension from ${manifestPath}. See console for parse error.`)
console.error("Parse Error:", v.flatten<typeof ExtPackageJson>(parse.issues)) console.error("Parse Error:", v.flatten<typeof OptionalExtPackageJson>(parse.issues))
throw new Error(`Invalid manifest: ${manifestPath}`) throw new Error(`Invalid manifest: ${manifestPath}`)
} else { } else {
// debug(`Loaded extension ${parse.output.kunkun.identifier} from ${manifestPath}`) // debug(`Loaded extension ${parse.output.kunkun.identifier} from ${manifestPath}`)

View File

@ -3,6 +3,7 @@
"name": "demo-template-extension", "name": "demo-template-extension",
"version": "0.0.5", "version": "0.0.5",
"type": "module", "type": "module",
"license": "MIT",
"kunkun": { "kunkun": {
"name": "Demo Template Extension", "name": "Demo Template Extension",
"shortDescription": "Demo Template Extension", "shortDescription": "Demo Template Extension",

View File

@ -2,7 +2,7 @@
"$schema": "https://schema.kunkun.sh", "$schema": "https://schema.kunkun.sh",
"name": "ext-sveltekit-exp", "name": "ext-sveltekit-exp",
"version": "0.0.5", "version": "0.0.5",
"private": true, "license": "MIT",
"kunkun": { "kunkun": {
"name": "TODO: Change Display Name", "name": "TODO: Change Display Name",
"shortDescription": "A Custom UI template for sveltekit", "shortDescription": "A Custom UI template for sveltekit",

View File

@ -3,6 +3,7 @@
"name": "form-view", "name": "form-view",
"version": "0.0.4", "version": "0.0.4",
"type": "module", "type": "module",
"license": "MIT",
"kunkun": { "kunkun": {
"name": "Form View", "name": "Form View",
"shortDescription": "A Worker Extension Template", "shortDescription": "A Worker Extension Template",

View File

@ -52,7 +52,7 @@ describe("Test the helper functions", () => {
const packageJson = await getJsrPackageSrcFile( const packageJson = await getJsrPackageSrcFile(
"kunkun", "kunkun",
"ext-image-processing", "ext-image-processing",
"0.0.6", "0.0.20",
"package.json" "package.json"
) )
expect(packageJson).toBeDefined() expect(packageJson).toBeDefined()

View File

@ -66,13 +66,13 @@ describe("Validate Jsr package as Kunkun extension", () => {
jsrPackage: { jsrPackage: {
scope: "kunkun", scope: "kunkun",
name: "ext-image-processing", name: "ext-image-processing",
version: "0.0.18" version: "0.0.20"
}, },
githubUsername: "HuakunShen" githubUsername: "HuakunShen"
}) })
expect(res.data).toBeDefined() expect(res.data).toBeDefined()
expect(res.data?.rekorLogIndex).toBe("161854127") expect(res.data?.rekorLogIndex).toBe("163385336")
expect(res.data?.github.commit).toBe("4db8d65b5e3fa115da6e31bd945f5c610c4a21cb") expect(res.data?.github.commit).toBe("56fb480efbcb4497fa5483d4a660a82f83dc8ac3")
expect(res.data?.github.owner).toBe("kunkunsh") expect(res.data?.github.owner).toBe("kunkunsh")
expect(res.data?.github.repo).toBe("kunkun-ext-image-processing") expect(res.data?.github.repo).toBe("kunkun-ext-image-processing")
// expect(res.data?.github.githubActionInvocationId).toBe("48b7dff528bc6a175ce9ee99e6d8de0c718e70a0") // expect(res.data?.github.githubActionInvocationId).toBe("48b7dff528bc6a175ce9ee99e6d8de0c718e70a0")

View File

@ -4,7 +4,7 @@ import {
getPackageVersion, getPackageVersion,
type GitHubRepository type GitHubRepository
} from "@huakunshen/jsr-client/hey-api-client" } from "@huakunshen/jsr-client/hey-api-client"
import { ExtPackageJson } from "@kksh/api/models" import { ExtPackageJson, License } from "@kksh/api/models"
import * as v from "valibot" import * as v from "valibot"
import { authenticatedUserIsMemberOfGitHubOrg, userIsPublicMemberOfGitHubOrg } from "../github" import { authenticatedUserIsMemberOfGitHubOrg, userIsPublicMemberOfGitHubOrg } from "../github"
import type { ExtensionPublishValidationData } from "../models" import type { ExtensionPublishValidationData } from "../models"
@ -300,6 +300,15 @@ export async function validateJsrPackageAsKunkunExtension(payload: {
} catch (error) { } catch (error) {
return { error: "Failed to parse package.json" } return { error: "Failed to parse package.json" }
} }
if (!packageJson.license) {
return { error: "Package license field is not found" }
}
const licenseParsed = v.safeParse(License, packageJson.license)
if (!licenseParsed.success) {
return { error: `Package license field ${packageJson.license} is not valid` }
}
if (packageJson.version !== payload.jsrPackage.version) { if (packageJson.version !== payload.jsrPackage.version) {
// no need to fetch jsr.json or deno.json content, as we already know the version is valid with JSR API // no need to fetch jsr.json or deno.json content, as we already know the version is valid with JSR API
return { return {
@ -349,6 +358,7 @@ export async function validateJsrPackageAsKunkunExtension(payload: {
data: { data: {
pkgJson: parseResult.output, pkgJson: parseResult.output,
tarballUrl, tarballUrl,
license: parseResult.output.license,
shasum, shasum,
apiVersion, apiVersion,
tarballSize, tarballSize,

View File

@ -1,4 +1,4 @@
import { ExtPackageJson } from "@kksh/api/models" import { ExtPackageJson, License } from "@kksh/api/models"
import * as v from "valibot" import * as v from "valibot"
export const RawRekorLogEntry = v.object({ export const RawRekorLogEntry = v.object({
@ -66,6 +66,7 @@ export const ExtensionPublishValidationData = v.object({
apiVersion: v.string(), apiVersion: v.string(),
rekorLogIndex: v.string(), rekorLogIndex: v.string(),
tarballSize: v.number(), tarballSize: v.number(),
license: License,
github: v.object({ github: v.object({
githubActionInvocationId: v.string(), githubActionInvocationId: v.string(),
commit: v.string(), commit: v.string(),

View File

@ -5,13 +5,13 @@ describe("validate kunkun extension", () => {
test("A working extension", async () => { test("A working extension", async () => {
const res = await validateNpmPackageAsKunkunExtension({ const res = await validateNpmPackageAsKunkunExtension({
pkgName: "kunkun-ext-ossinsight", pkgName: "kunkun-ext-ossinsight",
version: "0.0.1", version: "0.0.4",
githubUsername: "huakunshen" githubUsername: "huakunshen"
}) })
expect(res.error).toBeUndefined() expect(res.error).toBeUndefined()
expect(res.data?.github.commit).toBe("8af7eced43a5d240fa3390c7e297178ecb63c344") expect(res.data?.github.commit).toBe("50b8de4b8801d1c9fa55eb44ff678cd1b3370691")
expect(res.data?.github.owner).toBe("kunkunsh") expect(res.data?.github.owner).toBe("kunkunsh")
expect(res.data?.rekorLogIndex).toBe("162214778") expect(res.data?.rekorLogIndex).toBe("163394172")
expect(res.data?.github.repo).toBe("kunkun-ext-ossinsight") expect(res.data?.github.repo).toBe("kunkun-ext-ossinsight")
}) })
@ -32,7 +32,7 @@ describe("validate kunkun extension", () => {
( (
await validateNpmPackageAsKunkunExtension({ await validateNpmPackageAsKunkunExtension({
pkgName: "kunkun-ext-ossinsight", pkgName: "kunkun-ext-ossinsight",
version: "0.0.1", version: "0.0.4",
githubUsername: "huakun" githubUsername: "huakun"
}) })
).error ).error

View File

@ -1,4 +1,4 @@
import { ExtPackageJson } from "@kksh/api/models" import { ExtPackageJson, License } from "@kksh/api/models"
import * as v from "valibot" import * as v from "valibot"
import { import {
authenticatedUserIsMemberOfGitHubOrg, authenticatedUserIsMemberOfGitHubOrg,
@ -196,6 +196,15 @@ export async function validateNpmPackageAsKunkunExtension(payload: {
return { error: "Could not find package.json in NPM package" } return { error: "Could not find package.json in NPM package" }
} }
if (!packageJson.license) {
return { error: "Package license field is not found" }
}
const licenseParsed = v.safeParse(License, packageJson.license)
if (!licenseParsed.success) {
return { error: `Package license field ${packageJson.license} is not valid` }
}
const parseResult = v.safeParse(ExtPackageJson, packageJson) const parseResult = v.safeParse(ExtPackageJson, packageJson)
if (!parseResult.success) { if (!parseResult.success) {
console.log(v.flatten(parseResult.issues)) console.log(v.flatten(parseResult.issues))
@ -223,6 +232,7 @@ export async function validateNpmPackageAsKunkunExtension(payload: {
return { return {
data: { data: {
pkgJson: parseResult.output, pkgJson: parseResult.output,
license: licenseParsed.output,
tarballUrl, tarballUrl,
shasum, shasum,
apiVersion, apiVersion,

View File

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

View File

@ -1,10 +1,11 @@
import { ExtPackageJson } from "@kksh/api/models" import { ExtPackageJson } from "@kksh/api/models"
import { createSB } from "@kksh/supabase" import { type Database } from "@kksh/supabase/types"
import { createClient } from "@supabase/supabase-js"
import { parse, string } from "valibot" import { parse, string } from "valibot"
import * as v from "valibot" import * as v from "valibot"
import { getJsonSchema } from "../src" import { getJsonSchema } from "../src"
const supabase = createSB( const supabase = createClient<Database>(
parse(string(), process.env.SUPABASE_URL), parse(string(), process.env.SUPABASE_URL),
parse(string(), process.env.SUPABASE_SERVICE_ROLE_KEY) parse(string(), process.env.SUPABASE_SERVICE_ROLE_KEY)
) )

View File

@ -6,6 +6,7 @@
}, },
"exports": { "exports": {
".": "./src/index.ts", ".": "./src/index.ts",
"./api": "./src/api.ts",
"./models": "./src/models.ts", "./models": "./src/models.ts",
"./types": "./src/database.types.ts" "./types": "./src/database.types.ts"
}, },

View File

@ -42,6 +42,15 @@ export class SupabaseAPI {
.single() .single()
} }
getExtension(identifier: string) {
return this.supabase
.from("extensions")
.select("*")
.eq("identifier", identifier)
.limit(1)
.single()
}
async incrementDownloads({ async incrementDownloads({
identifier, identifier,
version version

View File

@ -1,14 +1,10 @@
import { createClient } from "@supabase/supabase-js" import { createClient } from "@supabase/supabase-js"
import type { Database } from "./database.types" import type { Database } from "./database.types"
export function createSB(supabaseUrl: string, supabaseAnonKey: string) { // export function createSB(supabaseUrl: string, supabaseAnonKey: string) {
return createClient<Database>(supabaseUrl, supabaseAnonKey, { // return createClient<Database>(supabaseUrl, supabaseAnonKey, {
auth: { // auth: {
flowType: "pkce" // flowType: "pkce"
} // }
}) // })
} // }
export { SupabaseAPI } from "./api"
export type { Database, Tables } from "./database.types"
export { SBExt } from "./models"

View File

@ -7,10 +7,11 @@
}, },
"devDependencies": { "devDependencies": {
"@kksh/supabase": "workspace:*", "@kksh/supabase": "workspace:*",
"@supabase/supabase-js": "^2.47.16",
"@kksh/ci": "workspace:*", "@kksh/ci": "workspace:*",
"@types/bun": "latest" "@types/bun": "latest"
}, },
"peerDependencies": { "peerDependencies": {
"typescript": "^5.0.0" "typescript": "^5.7.3"
} }
} }

View File

@ -1,3 +1,4 @@
## Permission Table ## Permission Table
<table> <table>
@ -6,6 +7,7 @@
<th>Description</th> <th>Description</th>
</tr> </tr>
<tr> <tr>
<td> <td>

View File

@ -1,11 +1,12 @@
import { writeFileSync } from "fs" import { writeFileSync } from "fs"
import { createSB } from "@kksh/supabase" import { type Database } from "@kksh/supabase/types"
import { createClient } from "@supabase/supabase-js"
if (!process.env.SUPABASE_URL || !process.env.SUPABASE_ANON_KEY) { if (!process.env.SUPABASE_URL || !process.env.SUPABASE_ANON_KEY) {
throw new Error("SUPABASE_URL and SUPABASE_ANON_KEY must be set") throw new Error("SUPABASE_URL and SUPABASE_ANON_KEY must be set")
} }
const supabase = createSB(process.env.SUPABASE_URL, process.env.SUPABASE_ANON_KEY) const supabase = createClient<Database>(process.env.SUPABASE_URL, process.env.SUPABASE_ANON_KEY)
const { data, error } = await supabase.storage.from("pub").download("server_public_key.pem") const { data, error } = await supabase.storage.from("pub").download("server_public_key.pem")
if (error) { if (error) {

View File

@ -2,6 +2,7 @@
"$schema": "./node_modules/@kksh/api/dist/schema.json", "$schema": "./node_modules/@kksh/api/dist/schema.json",
"name": "template-ext-headless", "name": "template-ext-headless",
"version": "0.0.4", "version": "0.0.4",
"license": "MIT",
"type": "module", "type": "module",
"kunkun": { "kunkun": {
"name": "TODO: Extension Display Name", "name": "TODO: Extension Display Name",

View File

@ -2,7 +2,7 @@
"$schema": "./node_modules/@kksh/api/dist/schema.json", "$schema": "./node_modules/@kksh/api/dist/schema.json",
"name": "template-ext-next", "name": "template-ext-next",
"version": "0.1.3", "version": "0.1.3",
"private": true, "license": "MIT",
"kunkun": { "kunkun": {
"name": "TODO: Change Display Name", "name": "TODO: Change Display Name",
"shortDescription": "A Custom UI template for next", "shortDescription": "A Custom UI template for next",

View File

@ -2,8 +2,8 @@
"$schema": "./node_modules/@kksh/api/dist/schema.json", "$schema": "./node_modules/@kksh/api/dist/schema.json",
"name": "template-ext-nuxt", "name": "template-ext-nuxt",
"version": "0.0.5", "version": "0.0.5",
"private": true,
"type": "module", "type": "module",
"license": "MIT",
"kunkun": { "kunkun": {
"name": "TODO: Change Display Name", "name": "TODO: Change Display Name",
"shortDescription": "A Custom UI template for nuxt", "shortDescription": "A Custom UI template for nuxt",

View File

@ -1,7 +1,7 @@
{ {
"$schema": "./node_modules/@kksh/api/dist/schema.json", "$schema": "./node_modules/@kksh/api/dist/schema.json",
"name": "template-ext-react", "name": "template-ext-react",
"private": true, "license": "MIT",
"version": "0.0.4", "version": "0.0.4",
"type": "module", "type": "module",
"kunkun": { "kunkun": {

View File

@ -1,7 +1,7 @@
{ {
"$schema": "./node_modules/@kksh/api/dist/schema.json", "$schema": "./node_modules/@kksh/api/dist/schema.json",
"name": "template-ext-svelte", "name": "template-ext-svelte",
"private": true, "license": "MIT",
"version": "0.0.4", "version": "0.0.4",
"type": "module", "type": "module",
"kunkun": { "kunkun": {

View File

@ -2,7 +2,7 @@
"$schema": "./node_modules/@kksh/api/dist/schema.json", "$schema": "./node_modules/@kksh/api/dist/schema.json",
"name": "template-ext-sveltekit", "name": "template-ext-sveltekit",
"version": "0.0.5", "version": "0.0.5",
"private": true, "license": "MIT",
"kunkun": { "kunkun": {
"name": "TODO: Change Display Name", "name": "TODO: Change Display Name",
"shortDescription": "A Custom UI template for sveltekit", "shortDescription": "A Custom UI template for sveltekit",

View File

@ -1,6 +1,6 @@
{ {
"name": "template-ext-vue", "name": "template-ext-vue",
"private": true, "license": "MIT",
"version": "0.0.2", "version": "0.0.2",
"type": "module", "type": "module",
"scripts": { "scripts": {

View File

@ -2,6 +2,7 @@
"$schema": "./node_modules/@kksh/api/dist/schema.json", "$schema": "./node_modules/@kksh/api/dist/schema.json",
"name": "template-ext-worker", "name": "template-ext-worker",
"version": "0.0.4", "version": "0.0.4",
"license": "MIT",
"type": "module", "type": "module",
"kunkun": { "kunkun": {
"name": "TODO: Extension Display Name", "name": "TODO: Extension Display Name",

View File

@ -44,7 +44,7 @@
type="single" type="single"
value={valueString} value={valueString}
controlledValue controlledValue
onValueChange={(v) => { onValueChange={(v: string) => {
if (!v) return if (!v) return
date = today(getLocalTimeZone()).add({ days: Number.parseInt(v) }) date = today(getLocalTimeZone()).add({ days: Number.parseInt(v) })
}} }}

View File

@ -1,7 +1,7 @@
<script lang="ts"> <script lang="ts">
import Icon from "@iconify/svelte" import Icon from "@iconify/svelte"
import { Icon as TIcon } from "@kksh/api/models" import { Icon as TIcon } from "@kksh/api/models"
import { SBExt } from "@kksh/supabase" import { SBExt } from "@kksh/supabase/models"
import { Button, Command } from "@kksh/svelte5" import { Button, Command } from "@kksh/svelte5"
import { Constants, IconMultiplexer } from "@kksh/ui" import { Constants, IconMultiplexer } from "@kksh/ui"
import { cn, humanReadableNumber } from "@kksh/ui/utils" import { cn, humanReadableNumber } from "@kksh/ui/utils"

View File

@ -15,6 +15,7 @@
import PermissionInspector from "./PermissionInspector.svelte" import PermissionInspector from "./PermissionInspector.svelte"
let { let {
extPublish,
ext, ext,
installedExt, installedExt,
manifest, manifest,
@ -28,7 +29,8 @@
loading, loading,
imageDialogOpen = $bindable(false) imageDialogOpen = $bindable(false)
}: { }: {
ext: Tables<"ext_publish"> extPublish: Tables<"ext_publish">
ext: Tables<"extensions">
installedExt?: ExtPackageJson installedExt?: ExtPackageJson
manifest: KunkunExtManifest manifest: KunkunExtManifest
demoImages: string[] demoImages: string[]
@ -60,7 +62,7 @@
} }
const metadata = $derived.by(() => { const metadata = $derived.by(() => {
const parseRes = v.safeParse(ExtPublishMetadata, ext.metadata) const parseRes = v.safeParse(ExtPublishMetadata, extPublish.metadata)
if (!parseRes.success) { if (!parseRes.success) {
console.error(v.flatten(parseRes.issues)) console.error(v.flatten(parseRes.issues))
return return
@ -91,7 +93,7 @@
<Icon icon="carbon:upgrade" class="inline h-5 w-5" /> <Icon icon="carbon:upgrade" class="inline h-5 w-5" />
<small>{installedExt?.version}</small> <small>{installedExt?.version}</small>
<MoveRightIcon class="w-4" /> <MoveRightIcon class="w-4" />
<small>{ext.version}</small> <small>{extPublish.version}</small>
{/if} {/if}
</Button> </Button>
{/snippet} {/snippet}
@ -134,7 +136,7 @@
<IconMultiplexer <IconMultiplexer
icon={manifest.icon} icon={manifest.icon}
class={cn(Constants.CLASSNAMES.EXT_LOGO, "h-full w-full")} class={cn(Constants.CLASSNAMES.EXT_LOGO, "h-full w-full")}
data-flip-id={`${Constants.CLASSNAMES.EXT_LOGO}-${ext.identifier}`} data-flip-id={`${Constants.CLASSNAMES.EXT_LOGO}-${extPublish.identifier}`}
/> />
</span> </span>
<div class="flex flex-col justify-center"> <div class="flex flex-col justify-center">
@ -144,8 +146,9 @@
<CircleCheckBigIcon class="ml-2 inline text-green-400" /> <CircleCheckBigIcon class="ml-2 inline text-green-400" />
{/if} {/if}
</span> </span>
<pre class="text-muted-foreground text-xs">{ext.identifier}</pre> <pre class="text-muted-foreground text-xs">{extPublish.identifier}</pre>
<pre class="text-muted-foreground text-xs">Version: {ext.version}</pre> <pre class="text-muted-foreground text-xs">Version: {extPublish.version}</pre>
<pre class="text-muted-foreground text-xs">Downloads: {ext.downloads}</pre>
</div> </div>
</div> </div>
<div class="flex items-center space-x-2"> <div class="flex items-center space-x-2">

199
pnpm-lock.yaml generated
View File

@ -499,10 +499,10 @@ importers:
dependencies: dependencies:
'@typescript-eslint/eslint-plugin': '@typescript-eslint/eslint-plugin':
specifier: ^8.20.0 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) version: 8.20.0(@typescript-eslint/parser@8.20.0(eslint@9.17.0(jiti@2.4.0))(typescript@5.7.3))(eslint@9.17.0(jiti@2.4.0))(typescript@5.7.3)
'@typescript-eslint/parser': '@typescript-eslint/parser':
specifier: ^8.20.0 specifier: ^8.20.0
version: 8.20.0(eslint@9.17.0(jiti@2.4.0))(typescript@5.7.2) version: 8.20.0(eslint@9.17.0(jiti@2.4.0))(typescript@5.7.3)
eslint-config-prettier: eslint-config-prettier:
specifier: ^10.0.1 specifier: ^10.0.1
version: 10.0.1(eslint@9.17.0(jiti@2.4.0)) version: 10.0.1(eslint@9.17.0(jiti@2.4.0))
@ -728,9 +728,6 @@ importers:
'@kksh/api': '@kksh/api':
specifier: workspace:* specifier: workspace:*
version: link:../api version: link:../api
'@kksh/supabase':
specifier: workspace:*
version: link:../supabase
typescript: typescript:
specifier: ^5.0.0 specifier: ^5.0.0
version: 5.6.3 version: 5.6.3
@ -738,12 +735,18 @@ importers:
specifier: ^1.0.0-beta.10 specifier: ^1.0.0-beta.10
version: 1.0.0-beta.10(typescript@5.6.3) version: 1.0.0-beta.10(typescript@5.6.3)
devDependencies: devDependencies:
'@kksh/supabase':
specifier: workspace:*
version: link:../supabase
'@supabase/supabase-js':
specifier: ^2.47.16
version: 2.47.16
'@types/bun': '@types/bun':
specifier: latest specifier: latest
version: 1.1.16 version: 1.1.16
'@valibot/to-json-schema': '@valibot/to-json-schema':
specifier: 1.0.0-beta.3 specifier: 1.0.0-beta.4
version: 1.0.0-beta.3(valibot@1.0.0-beta.10(typescript@5.6.3)) version: 1.0.0-beta.4(valibot@1.0.0-beta.10(typescript@5.6.3))
packages/supabase: packages/supabase:
dependencies: dependencies:
@ -767,8 +770,8 @@ importers:
packages/tauri-plugins/jarvis: packages/tauri-plugins/jarvis:
dependencies: dependencies:
typescript: typescript:
specifier: ^5.0.0 specifier: ^5.7.3
version: 5.6.3 version: 5.7.3
devDependencies: devDependencies:
'@kksh/ci': '@kksh/ci':
specifier: workspace:* specifier: workspace:*
@ -776,6 +779,9 @@ importers:
'@kksh/supabase': '@kksh/supabase':
specifier: workspace:* specifier: workspace:*
version: link:../../supabase version: link:../../supabase
'@supabase/supabase-js':
specifier: ^2.47.16
version: 2.47.16
'@types/bun': '@types/bun':
specifier: latest specifier: latest
version: 1.1.16 version: 1.1.16
@ -1179,7 +1185,7 @@ importers:
version: 3.12.7 version: 3.12.7
shiki-magic-move: shiki-magic-move:
specifier: ^0.5.2 specifier: ^0.5.2
version: 0.5.2(react@18.3.1)(shiki@1.27.2)(svelte@5.16.6)(vue@3.5.13(typescript@5.7.2)) version: 0.5.2(react@18.3.1)(shiki@1.27.2)(svelte@5.16.6)(vue@3.5.13(typescript@5.7.3))
svelte: svelte:
specifier: ^5.0.0 specifier: ^5.0.0
version: 5.16.6 version: 5.16.6
@ -1188,7 +1194,7 @@ importers:
version: 0.4.1(svelte@5.16.6) version: 0.4.1(svelte@5.16.6)
valibot: valibot:
specifier: 1.0.0-beta.12 specifier: 1.0.0-beta.12
version: 1.0.0-beta.12(typescript@5.7.2) version: 1.0.0-beta.12(typescript@5.7.3)
devDependencies: devDependencies:
'@eslint/js': '@eslint/js':
specifier: ^9.18.0 specifier: ^9.18.0
@ -1201,16 +1207,16 @@ importers:
version: link:../api version: link:../api
'@kksh/svelte5': '@kksh/svelte5':
specifier: ^0.1.14 specifier: ^0.1.14
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) version: 0.1.14(lucide-svelte@0.471.0(svelte@5.16.6))(svelte-sonner@0.3.28(svelte@5.16.6))(svelte@5.16.6)(sveltekit-superforms@2.22.1(@sveltejs/kit@2.15.2(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.16.6)(vite@6.0.7(@types/node@22.10.5)(jiti@2.4.0)(terser@5.36.0)(yaml@2.6.1)))(svelte@5.16.6)(vite@6.0.7(@types/node@22.10.5)(jiti@2.4.0)(terser@5.36.0)(yaml@2.6.1)))(@types/json-schema@7.0.15)(svelte@5.16.6)(typescript@5.7.3))(typescript@5.7.3)
'@types/bun': '@types/bun':
specifier: latest specifier: latest
version: 1.1.16 version: 1.1.16
'@typescript-eslint/eslint-plugin': '@typescript-eslint/eslint-plugin':
specifier: ^8.20.0 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) version: 8.20.0(@typescript-eslint/parser@8.20.0(eslint@9.17.0(jiti@2.4.0))(typescript@5.7.3))(eslint@9.17.0(jiti@2.4.0))(typescript@5.7.3)
'@typescript-eslint/parser': '@typescript-eslint/parser':
specifier: ^8.20.0 specifier: ^8.20.0
version: 8.20.0(eslint@9.17.0(jiti@2.4.0))(typescript@5.7.2) version: 8.20.0(eslint@9.17.0(jiti@2.4.0))(typescript@5.7.3)
bits-ui: bits-ui:
specifier: 1.0.0-next.77 specifier: 1.0.0-next.77
version: 1.0.0-next.77(svelte@5.16.6) version: 1.0.0-next.77(svelte@5.16.6)
@ -1225,7 +1231,7 @@ importers:
version: 2.46.1(eslint@9.17.0(jiti@2.4.0))(svelte@5.16.6) version: 2.46.1(eslint@9.17.0(jiti@2.4.0))(svelte@5.16.6)
formsnap: formsnap:
specifier: 2.0.0-next.1 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)) 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.3))
globals: globals:
specifier: ^15.14.0 specifier: ^15.14.0
version: 15.14.0 version: 15.14.0
@ -1249,7 +1255,7 @@ importers:
version: 0.3.28(svelte@5.16.6) version: 0.3.28(svelte@5.16.6)
sveltekit-superforms: sveltekit-superforms:
specifier: ^2.22.1 specifier: ^2.22.1
version: 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) version: 2.22.1(@sveltejs/kit@2.15.2(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.16.6)(vite@6.0.7(@types/node@22.10.5)(jiti@2.4.0)(terser@5.36.0)(yaml@2.6.1)))(svelte@5.16.6)(vite@6.0.7(@types/node@22.10.5)(jiti@2.4.0)(terser@5.36.0)(yaml@2.6.1)))(@types/json-schema@7.0.15)(svelte@5.16.6)(typescript@5.7.3)
tailwind-merge: tailwind-merge:
specifier: ^2.6.0 specifier: ^2.6.0
version: 2.6.0 version: 2.6.0
@ -1267,7 +1273,7 @@ importers:
version: 2.0.14 version: 2.0.14
typescript-eslint: typescript-eslint:
specifier: ^8.20.0 specifier: ^8.20.0
version: 8.20.0(eslint@9.17.0(jiti@2.4.0))(typescript@5.7.2) version: 8.20.0(eslint@9.17.0(jiti@2.4.0))(typescript@5.7.3)
zod: zod:
specifier: ^3.24.1 specifier: ^3.24.1
version: 3.24.1 version: 3.24.1
@ -4432,6 +4438,9 @@ packages:
'@supabase/postgrest-js@1.17.10': '@supabase/postgrest-js@1.17.10':
resolution: {integrity: sha512-GlcwOjEmPcXfaEU0wHg1MgHU+peR+zZFyaEWjr7a7EOCB1gCtw3nW7ABfnPPH411coXHV90eb/isDgT9HRshLg==} resolution: {integrity: sha512-GlcwOjEmPcXfaEU0wHg1MgHU+peR+zZFyaEWjr7a7EOCB1gCtw3nW7ABfnPPH411coXHV90eb/isDgT9HRshLg==}
'@supabase/postgrest-js@1.17.11':
resolution: {integrity: sha512-AOqqgQEhLVqzOMmA8Q0bxQFMfbozbjjQ1Tt4kprkstIKdRl4yZRaMdoVxFkCpU8ivmAe2xNfAVkNK+l16a9P0A==}
'@supabase/postgrest-js@1.17.9': '@supabase/postgrest-js@1.17.9':
resolution: {integrity: sha512-HyMOyy3t6K0/oFNDlHryOhnK4sfMNip8J0LrqJ/65NrBlHD3xOcDf4OV/5YCHI4g195ByuQ0wfmyFqIgMl3dxg==} resolution: {integrity: sha512-HyMOyy3t6K0/oFNDlHryOhnK4sfMNip8J0LrqJ/65NrBlHD3xOcDf4OV/5YCHI4g195ByuQ0wfmyFqIgMl3dxg==}
@ -4452,6 +4461,9 @@ packages:
'@supabase/supabase-js@2.47.12': '@supabase/supabase-js@2.47.12':
resolution: {integrity: sha512-My8X5K1KwOBFjQhAqIf7QJaQhP5EILjJwAgjzRNjstlMLJmdVBctwRYD6IGDWKzw+i6/aNGuRd5c9/pI/Y6UFw==} resolution: {integrity: sha512-My8X5K1KwOBFjQhAqIf7QJaQhP5EILjJwAgjzRNjstlMLJmdVBctwRYD6IGDWKzw+i6/aNGuRd5c9/pI/Y6UFw==}
'@supabase/supabase-js@2.47.16':
resolution: {integrity: sha512-FnoV0miLnYUL8ZTS94tSIyn+ogCwh5DB5f1fj1n4wHGNAqJSKFb8OQzLVlRFAH7cB9TKQ5eon3/n2lXUWY7GfA==}
'@sveltejs/adapter-auto@3.3.1': '@sveltejs/adapter-auto@3.3.1':
resolution: {integrity: sha512-5Sc7WAxYdL6q9j/+D0jJKjGREGlfIevDyHSQ2eNETHcB1TKlQWHcAo8AS8H1QdjNvSXpvOwNjykDUHPEAyGgdQ==} resolution: {integrity: sha512-5Sc7WAxYdL6q9j/+D0jJKjGREGlfIevDyHSQ2eNETHcB1TKlQWHcAo8AS8H1QdjNvSXpvOwNjykDUHPEAyGgdQ==}
peerDependencies: peerDependencies:
@ -5262,8 +5274,8 @@ packages:
'@unovis/ts': 1.4.4 '@unovis/ts': 1.4.4
vue: ^3 vue: ^3
'@valibot/to-json-schema@1.0.0-beta.3': '@valibot/to-json-schema@1.0.0-beta.4':
resolution: {integrity: sha512-20XQh1u5sOLwS3NOB7oHCo3clQ9h4GlavXgLKMux2PYpHowb7P97cND0dg8T3+fE1WoKVACcLppvzAPpSx0F+Q==} resolution: {integrity: sha512-wXBdCyoqec+NLCl5ihitXzZXD4JAjPK3+HfskSXzfhiNFvKje0A/v1LygqKidUgIbaJtREmq/poJGbaS/0MKuQ==}
peerDependencies: peerDependencies:
valibot: ^1.0.0 || ^1.0.0-beta.5 || ^1.0.0-rc valibot: ^1.0.0 || ^1.0.0-beta.5 || ^1.0.0-rc
@ -10517,6 +10529,11 @@ packages:
engines: {node: '>=14.17'} engines: {node: '>=14.17'}
hasBin: true hasBin: true
typescript@5.7.3:
resolution: {integrity: sha512-84MVSjMEHP+FQRPy3pX9sTVV/INIex71s9TL2Gm5FG/WG1SqXeKyZ0k7/blY/4FdOzI12CBy1vGc4og/eus0fw==}
engines: {node: '>=14.17'}
hasBin: true
uc.micro@2.1.0: uc.micro@2.1.0:
resolution: {integrity: sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A==} resolution: {integrity: sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A==}
@ -13036,6 +13053,24 @@ snapshots:
transitivePeerDependencies: transitivePeerDependencies:
- sveltekit-superforms - 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.3))(typescript@5.7.3)':
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.3))
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.3
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))': '@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: dependencies:
'@internationalized/date': 3.5.6 '@internationalized/date': 3.5.6
@ -15101,6 +15136,10 @@ snapshots:
dependencies: dependencies:
'@supabase/node-fetch': 2.6.15 '@supabase/node-fetch': 2.6.15
'@supabase/postgrest-js@1.17.11':
dependencies:
'@supabase/node-fetch': 2.6.15
'@supabase/postgrest-js@1.17.9': '@supabase/postgrest-js@1.17.9':
dependencies: dependencies:
'@supabase/node-fetch': 2.6.15 '@supabase/node-fetch': 2.6.15
@ -15149,6 +15188,18 @@ snapshots:
- bufferutil - bufferutil
- utf-8-validate - utf-8-validate
'@supabase/supabase-js@2.47.16':
dependencies:
'@supabase/auth-js': 2.67.3
'@supabase/functions-js': 2.4.4
'@supabase/node-fetch': 2.6.15
'@supabase/postgrest-js': 1.17.11
'@supabase/realtime-js': 2.11.2
'@supabase/storage-js': 2.7.1
transitivePeerDependencies:
- bufferutil
- utf-8-validate
'@sveltejs/adapter-auto@3.3.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)))': '@sveltejs/adapter-auto@3.3.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)))':
dependencies: dependencies:
'@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)) '@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))
@ -15907,20 +15958,20 @@ snapshots:
transitivePeerDependencies: transitivePeerDependencies:
- supports-color - 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)': '@typescript-eslint/eslint-plugin@8.20.0(@typescript-eslint/parser@8.20.0(eslint@9.17.0(jiti@2.4.0))(typescript@5.7.3))(eslint@9.17.0(jiti@2.4.0))(typescript@5.7.3)':
dependencies: dependencies:
'@eslint-community/regexpp': 4.12.1 '@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/parser': 8.20.0(eslint@9.17.0(jiti@2.4.0))(typescript@5.7.3)
'@typescript-eslint/scope-manager': 8.20.0 '@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/type-utils': 8.20.0(eslint@9.17.0(jiti@2.4.0))(typescript@5.7.3)
'@typescript-eslint/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.3)
'@typescript-eslint/visitor-keys': 8.20.0 '@typescript-eslint/visitor-keys': 8.20.0
eslint: 9.17.0(jiti@2.4.0) eslint: 9.17.0(jiti@2.4.0)
graphemer: 1.4.0 graphemer: 1.4.0
ignore: 5.3.2 ignore: 5.3.2
natural-compare: 1.4.0 natural-compare: 1.4.0
ts-api-utils: 2.0.0(typescript@5.7.2) ts-api-utils: 2.0.0(typescript@5.7.3)
typescript: 5.7.2 typescript: 5.7.3
transitivePeerDependencies: transitivePeerDependencies:
- supports-color - supports-color
@ -15973,15 +16024,15 @@ snapshots:
transitivePeerDependencies: transitivePeerDependencies:
- supports-color - supports-color
'@typescript-eslint/parser@8.20.0(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.3)':
dependencies: dependencies:
'@typescript-eslint/scope-manager': 8.20.0 '@typescript-eslint/scope-manager': 8.20.0
'@typescript-eslint/types': 8.20.0 '@typescript-eslint/types': 8.20.0
'@typescript-eslint/typescript-estree': 8.20.0(typescript@5.7.2) '@typescript-eslint/typescript-estree': 8.20.0(typescript@5.7.3)
'@typescript-eslint/visitor-keys': 8.20.0 '@typescript-eslint/visitor-keys': 8.20.0
debug: 4.4.0(supports-color@9.4.0) debug: 4.4.0(supports-color@9.4.0)
eslint: 9.17.0(jiti@2.4.0) eslint: 9.17.0(jiti@2.4.0)
typescript: 5.7.2 typescript: 5.7.3
transitivePeerDependencies: transitivePeerDependencies:
- supports-color - supports-color
@ -16045,14 +16096,14 @@ snapshots:
transitivePeerDependencies: transitivePeerDependencies:
- supports-color - supports-color
'@typescript-eslint/type-utils@8.20.0(eslint@9.17.0(jiti@2.4.0))(typescript@5.7.2)': '@typescript-eslint/type-utils@8.20.0(eslint@9.17.0(jiti@2.4.0))(typescript@5.7.3)':
dependencies: dependencies:
'@typescript-eslint/typescript-estree': 8.20.0(typescript@5.7.2) '@typescript-eslint/typescript-estree': 8.20.0(typescript@5.7.3)
'@typescript-eslint/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.3)
debug: 4.4.0(supports-color@9.4.0) debug: 4.4.0(supports-color@9.4.0)
eslint: 9.17.0(jiti@2.4.0) eslint: 9.17.0(jiti@2.4.0)
ts-api-utils: 2.0.0(typescript@5.7.2) ts-api-utils: 2.0.0(typescript@5.7.3)
typescript: 5.7.2 typescript: 5.7.3
transitivePeerDependencies: transitivePeerDependencies:
- supports-color - supports-color
@ -16120,7 +16171,7 @@ snapshots:
transitivePeerDependencies: transitivePeerDependencies:
- supports-color - supports-color
'@typescript-eslint/typescript-estree@8.20.0(typescript@5.7.2)': '@typescript-eslint/typescript-estree@8.20.0(typescript@5.7.3)':
dependencies: dependencies:
'@typescript-eslint/types': 8.20.0 '@typescript-eslint/types': 8.20.0
'@typescript-eslint/visitor-keys': 8.20.0 '@typescript-eslint/visitor-keys': 8.20.0
@ -16129,8 +16180,8 @@ snapshots:
is-glob: 4.0.3 is-glob: 4.0.3
minimatch: 9.0.5 minimatch: 9.0.5
semver: 7.6.3 semver: 7.6.3
ts-api-utils: 2.0.0(typescript@5.7.2) ts-api-utils: 2.0.0(typescript@5.7.3)
typescript: 5.7.2 typescript: 5.7.3
transitivePeerDependencies: transitivePeerDependencies:
- supports-color - supports-color
@ -16178,14 +16229,14 @@ snapshots:
transitivePeerDependencies: transitivePeerDependencies:
- supports-color - supports-color
'@typescript-eslint/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.3)':
dependencies: dependencies:
'@eslint-community/eslint-utils': 4.4.1(eslint@9.17.0(jiti@2.4.0)) '@eslint-community/eslint-utils': 4.4.1(eslint@9.17.0(jiti@2.4.0))
'@typescript-eslint/scope-manager': 8.20.0 '@typescript-eslint/scope-manager': 8.20.0
'@typescript-eslint/types': 8.20.0 '@typescript-eslint/types': 8.20.0
'@typescript-eslint/typescript-estree': 8.20.0(typescript@5.7.2) '@typescript-eslint/typescript-estree': 8.20.0(typescript@5.7.3)
eslint: 9.17.0(jiti@2.4.0) eslint: 9.17.0(jiti@2.4.0)
typescript: 5.7.2 typescript: 5.7.3
transitivePeerDependencies: transitivePeerDependencies:
- supports-color - supports-color
@ -16285,7 +16336,7 @@ snapshots:
'@unovis/ts': 1.4.4 '@unovis/ts': 1.4.4
vue: 3.5.13(typescript@5.6.3) vue: 3.5.13(typescript@5.6.3)
'@valibot/to-json-schema@1.0.0-beta.3(valibot@1.0.0-beta.10(typescript@5.6.3))': '@valibot/to-json-schema@1.0.0-beta.4(valibot@1.0.0-beta.10(typescript@5.6.3))':
dependencies: dependencies:
valibot: 1.0.0-beta.10(typescript@5.6.3) valibot: 1.0.0-beta.10(typescript@5.6.3)
@ -16563,11 +16614,11 @@ snapshots:
'@vue/shared': 3.5.13 '@vue/shared': 3.5.13
vue: 3.5.13(typescript@5.6.3) vue: 3.5.13(typescript@5.6.3)
'@vue/server-renderer@3.5.13(vue@3.5.13(typescript@5.7.2))': '@vue/server-renderer@3.5.13(vue@3.5.13(typescript@5.7.3))':
dependencies: dependencies:
'@vue/compiler-ssr': 3.5.13 '@vue/compiler-ssr': 3.5.13
'@vue/shared': 3.5.13 '@vue/shared': 3.5.13
vue: 3.5.13(typescript@5.7.2) vue: 3.5.13(typescript@5.7.3)
optional: true optional: true
'@vue/shared@3.5.13': {} '@vue/shared@3.5.13': {}
@ -18607,6 +18658,12 @@ snapshots:
svelte-toolbelt: 0.4.6(svelte@5.16.6) svelte-toolbelt: 0.4.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) 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)
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.3)):
dependencies:
svelte: 5.16.6
svelte-toolbelt: 0.4.6(svelte@5.16.6)
sveltekit-superforms: 2.22.1(@sveltejs/kit@2.15.2(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.16.6)(vite@6.0.7(@types/node@22.10.5)(jiti@2.4.0)(terser@5.36.0)(yaml@2.6.1)))(svelte@5.16.6)(vite@6.0.7(@types/node@22.10.5)(jiti@2.4.0)(terser@5.36.0)(yaml@2.6.1)))(@types/json-schema@7.0.15)(svelte@5.16.6)(typescript@5.7.3)
fraction.js@4.3.7: {} fraction.js@4.3.7: {}
fresh@0.5.2: {} fresh@0.5.2: {}
@ -21423,7 +21480,7 @@ snapshots:
interpret: 1.4.0 interpret: 1.4.0
rechoir: 0.6.2 rechoir: 0.6.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)): 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.3)):
dependencies: dependencies:
diff-match-patch-es: 0.1.1 diff-match-patch-es: 0.1.1
ohash: 1.1.4 ohash: 1.1.4
@ -21431,7 +21488,7 @@ snapshots:
react: 18.3.1 react: 18.3.1
shiki: 1.27.2 shiki: 1.27.2
svelte: 5.16.6 svelte: 5.16.6
vue: 3.5.13(typescript@5.7.2) vue: 3.5.13(typescript@5.7.3)
shiki@1.27.2: shiki@1.27.2:
dependencies: dependencies:
@ -21846,6 +21903,33 @@ snapshots:
- '@types/json-schema' - '@types/json-schema'
- typescript - typescript
sveltekit-superforms@2.22.1(@sveltejs/kit@2.15.2(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.16.6)(vite@6.0.7(@types/node@22.10.5)(jiti@2.4.0)(terser@5.36.0)(yaml@2.6.1)))(svelte@5.16.6)(vite@6.0.7(@types/node@22.10.5)(jiti@2.4.0)(terser@5.36.0)(yaml@2.6.1)))(@types/json-schema@7.0.15)(svelte@5.16.6)(typescript@5.7.3):
dependencies:
'@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))
devalue: 5.1.1
memoize-weak: 1.0.2
svelte: 5.16.6
ts-deepmerge: 7.0.2
optionalDependencies:
'@exodus/schemasafe': 1.3.0
'@gcornut/valibot-json-schema': 0.31.0
'@sinclair/typebox': 0.34.12
'@typeschema/class-validator': 0.3.0(@types/json-schema@7.0.15)(class-validator@0.14.1)
'@vinejs/vine': 2.1.0
arktype: 2.0.0-rc.26
class-validator: 0.14.1
effect: 3.11.8
joi: 17.13.3
json-schema-to-ts: 3.1.1
superstruct: 2.0.2
valibot: 1.0.0-beta.12(typescript@5.7.3)
yup: 1.6.1
zod: 3.24.1
zod-to-json-schema: 3.24.1(zod@3.24.1)
transitivePeerDependencies:
- '@types/json-schema'
- typescript
svg-tags@1.0.0: {} svg-tags@1.0.0: {}
svgo@3.3.2: svgo@3.3.2:
@ -22183,6 +22267,10 @@ snapshots:
dependencies: dependencies:
typescript: 5.7.2 typescript: 5.7.2
ts-api-utils@2.0.0(typescript@5.7.3):
dependencies:
typescript: 5.7.3
ts-deepmerge@7.0.2: {} ts-deepmerge@7.0.2: {}
ts-graphviz@2.1.4: ts-graphviz@2.1.4:
@ -22365,13 +22453,13 @@ snapshots:
transitivePeerDependencies: transitivePeerDependencies:
- supports-color - supports-color
typescript-eslint@8.20.0(eslint@9.17.0(jiti@2.4.0))(typescript@5.7.2): typescript-eslint@8.20.0(eslint@9.17.0(jiti@2.4.0))(typescript@5.7.3):
dependencies: 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/eslint-plugin': 8.20.0(@typescript-eslint/parser@8.20.0(eslint@9.17.0(jiti@2.4.0))(typescript@5.7.3))(eslint@9.17.0(jiti@2.4.0))(typescript@5.7.3)
'@typescript-eslint/parser': 8.20.0(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.3)
'@typescript-eslint/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.3)
eslint: 9.17.0(jiti@2.4.0) eslint: 9.17.0(jiti@2.4.0)
typescript: 5.7.2 typescript: 5.7.3
transitivePeerDependencies: transitivePeerDependencies:
- supports-color - supports-color
@ -22383,6 +22471,8 @@ snapshots:
typescript@5.7.2: {} typescript@5.7.2: {}
typescript@5.7.3: {}
uc.micro@2.1.0: {} uc.micro@2.1.0: {}
ufo@1.5.4: {} ufo@1.5.4: {}
@ -22636,6 +22726,11 @@ snapshots:
valibot@1.0.0-beta.12(typescript@5.7.2): valibot@1.0.0-beta.12(typescript@5.7.2):
optionalDependencies: optionalDependencies:
typescript: 5.7.2 typescript: 5.7.2
optional: true
valibot@1.0.0-beta.12(typescript@5.7.3):
optionalDependencies:
typescript: 5.7.3
valibot@1.0.0-beta.9(typescript@5.6.3): valibot@1.0.0-beta.9(typescript@5.6.3):
optionalDependencies: optionalDependencies:
@ -22952,15 +23047,15 @@ snapshots:
optionalDependencies: optionalDependencies:
typescript: 5.6.3 typescript: 5.6.3
vue@3.5.13(typescript@5.7.2): vue@3.5.13(typescript@5.7.3):
dependencies: dependencies:
'@vue/compiler-dom': 3.5.13 '@vue/compiler-dom': 3.5.13
'@vue/compiler-sfc': 3.5.13 '@vue/compiler-sfc': 3.5.13
'@vue/runtime-dom': 3.5.13 '@vue/runtime-dom': 3.5.13
'@vue/server-renderer': 3.5.13(vue@3.5.13(typescript@5.7.2)) '@vue/server-renderer': 3.5.13(vue@3.5.13(typescript@5.7.3))
'@vue/shared': 3.5.13 '@vue/shared': 3.5.13
optionalDependencies: optionalDependencies:
typescript: 5.7.2 typescript: 5.7.3
optional: true optional: true
walkdir@0.4.1: {} walkdir@0.4.1: {}