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

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

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

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

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

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

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

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

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

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

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

* feat: add unpacked size to npm registry

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

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

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

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

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

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

* style: update extension store details

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

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

* chore: bump version to 0.1.18 in package.json

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

2
deno.lock generated
View File

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

View File

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

View File

@ -134,7 +134,7 @@ export type KunkunExtManifest = v.InferOutput<typeof KunkunExtManifest>
const Person = v.union([ const Person = v.union([
v.object({ v.object({
name: v.string("GitHub Username"), name: v.string("GitHub Username"),
email: v.string("Email of the person"), email: v.optional(v.nullable(v.string("Email of the person"))),
url: v.optional(v.nullable(v.string("URL of the person"))) url: v.optional(v.nullable(v.string("URL of the person")))
}), }),
v.string("GitHub Username") v.string("GitHub Username")
@ -167,6 +167,7 @@ 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"),
readme: v.optional(v.string("Custom README.md path of the extension")),
license: License, 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")),

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

186
pnpm-lock.yaml generated
View File

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