diff --git a/apps/desktop/messages/en.json b/apps/desktop/messages/en.json index 5a3709d..4b28197 100644 --- a/apps/desktop/messages/en.json +++ b/apps/desktop/messages/en.json @@ -9,7 +9,7 @@ "common_check": "Check", "common_install": "Install", - "home_command_input_placeholder": "Type a command or search...", + "home_command_input_placeholder": "Type \"\/\" to search...", "home_command_input_dropdown_quit": "Quit", "home_command_input_dropdown_developer_title": "Developer", "home_command_input_dropdown_close_window": "Close Window", diff --git a/apps/desktop/messages/ru.json b/apps/desktop/messages/ru.json index 8b0051b..e8422c2 100644 --- a/apps/desktop/messages/ru.json +++ b/apps/desktop/messages/ru.json @@ -9,7 +9,7 @@ "common_check": "Проверить", "common_install": "Установить", - "home_command_input_placeholder": "Введите команду или поисковый запрос…", + "home_command_input_placeholder": "Нажмите \"/\" для поиска...", "home_command_input_dropdown_quit": "Выйти", "home_command_input_dropdown_developer_title": "Разработчик", "home_command_input_dropdown_close_window": "Закрыть окно", diff --git a/apps/desktop/messages/zh.json b/apps/desktop/messages/zh.json index 4010365..3630a48 100644 --- a/apps/desktop/messages/zh.json +++ b/apps/desktop/messages/zh.json @@ -9,7 +9,7 @@ "common_check": "检查", "common_install": "安装", - "home_command_input_placeholder": "输入命令或搜索...", + "home_command_input_placeholder": "按 \"/\" 开始搜索...", "home_command_input_dropdown_quit": "退出", "home_command_input_dropdown_developer_title": "开发者", "home_command_input_dropdown_close_window": "关闭窗口", diff --git a/apps/desktop/package.json b/apps/desktop/package.json index d444be4..d1ada9c 100644 --- a/apps/desktop/package.json +++ b/apps/desktop/package.json @@ -1,6 +1,6 @@ { "name": "@kksh/desktop", - "version": "0.1.17", + "version": "0.1.18", "description": "", "type": "module", "scripts": { @@ -16,11 +16,13 @@ "license": "MIT", "dependencies": { "@formkit/auto-animate": "^0.8.2", + "@inlang/paraglide-sveltekit": "0.15.5", "@kksh/extension": "workspace:*", "@kksh/supabase": "workspace:*", "@kksh/ui": "workspace:*", "@kksh/utils": "workspace:*", "@std/semver": "npm:@jsr/std__semver@^1.0.3", + "@supabase/supabase-js": "^2.48.0", "@tanstack/table-core": "^8.20.5", "@tauri-apps/api": "^2.1.1", "@tauri-apps/plugin-shell": "^2.2.0", @@ -35,11 +37,11 @@ "sveltekit-superforms": "^2.22.1", "tauri-plugin-clipboard-api": "^2.1.11", "tauri-plugin-user-input-api": "workspace:*", - "uuid": "^11.0.3", - "@inlang/paraglide-sveltekit": "0.15.5" + "uuid": "^11.0.3" }, "devDependencies": { "@eslint/js": "^9.18.0", + "@inlang/paraglide-js": "1.11.8", "@kksh/types": "workspace:*", "@sveltejs/adapter-static": "^3.0.6", "@sveltejs/kit": "^2.12.1", @@ -69,7 +71,6 @@ "tslib": "^2.8.1", "typescript": "^5.6.3", "typescript-eslint": "^8.20.0", - "vite": "^6.0.3", - "@inlang/paraglide-js": "1.11.8" + "vite": "^6.0.3" } } diff --git a/apps/desktop/src/routes/app/+page.svelte b/apps/desktop/src/routes/app/+page.svelte index 41dc1c6..e88fe5b 100644 --- a/apps/desktop/src/routes/app/+page.svelte +++ b/apps/desktop/src/routes/app/+page.svelte @@ -34,13 +34,13 @@ import { goto } from "$app/navigation" import { ArrowBigUpIcon, CircleXIcon, EllipsisVerticalIcon, RefreshCcwIcon } from "lucide-svelte" import { onMount } from "svelte" - import { toast } from "svelte-sonner" + const win = getCurrentWindow() let inputEle: HTMLInputElement | null = $state(null) function onKeyDown(event: KeyboardEvent) { if (event.key === "Escape") { if ((event.target as HTMLInputElement).value === "") { - getCurrentWindow().hide() + win.hide() } else { ;(event.target as HTMLInputElement).value = "" $appState.searchTerm = "" @@ -49,16 +49,19 @@ } onMount(() => { - Promise.all([Window.getByLabel("splashscreen"), getCurrentWindow()]).then( - ([splashscreenWin, mainWin]) => { - if (splashscreenWin) { - splashscreenWin.close() - } - - mainWin.show() + Window.getByLabel("splashscreen").then((splashscreenWin) => { + if (splashscreenWin) { + splashscreenWin.close() } - ) - + win.show() + }) + win.onFocusChanged(({ payload: focused }) => { + if (focused) { + win.show() + inputEle?.focus() + } + }) + inputEle?.focus() appConfigLoaded.subscribe((loaded) => { // wait for appConfig store to be loaded, it's async and saved to disk when changed, so we use another store appConfigLoaded // to keep track of the loading status diff --git a/apps/desktop/src/routes/app/extension/store/[identifier]/+page.svelte b/apps/desktop/src/routes/app/extension/store/[identifier]/+page.svelte index fc7afc7..03b4ea9 100644 --- a/apps/desktop/src/routes/app/extension/store/[identifier]/+page.svelte +++ b/apps/desktop/src/routes/app/extension/store/[identifier]/+page.svelte @@ -4,6 +4,7 @@ import { extensions, installedStoreExts } from "@/stores/extensions.js" import { supabaseAPI } from "@/supabase" import { goBack } from "@/utils/route.js" + import { ExtPackageJson } from "@kksh/api/models" import { ExtPublishMetadata } from "@kksh/supabase/models" import type { Tables } from "@kksh/supabase/types" import { Button } from "@kksh/svelte5" @@ -17,7 +18,8 @@ import { onMount } from "svelte" import { toast } from "svelte-sonner" import { derived as storeDerived } from "svelte/store" - import { getInstallExtras } from "./helper.js" + import * as v from "valibot" + import { getInstallExtras } from "./helper" const { data } = $props() const extPublish: Tables<"ext_publish"> & { metadata: ExtPublishMetadata } = $derived( @@ -29,6 +31,11 @@ return $e.find((e) => e.kunkun.identifier === extPublish.identifier) }) + const packageJson = $derived.by(() => { + const parsed = v.safeParse(ExtPackageJson, data.extPublish.package_json) + return parsed.success ? parsed.output : null + }) + const isUpgradable = $derived( $installedExt ? greaterThan(parseSemver(extPublish.version), parseSemver($installedExt.version)) @@ -168,6 +175,7 @@ const Person = v.union([ v.object({ name: v.string("GitHub Username"), - email: v.string("Email of the person"), + email: v.optional(v.nullable(v.string("Email of the person"))), url: v.optional(v.nullable(v.string("URL of the person"))) }), v.string("GitHub Username") @@ -167,6 +167,7 @@ export type License = v.InferOutput export const ExtPackageJson = v.object({ name: v.string("Package name for the extension (just a regular npm package name)"), version: v.string("Version of the extension"), + readme: v.optional(v.string("Custom README.md path of the extension")), license: License, author: v.optional(Person), draft: v.optional(v.boolean("Whether the extension is a draft, draft will not be published")), diff --git a/packages/package-registry/src/__tests__/utils.test.ts b/packages/package-registry/src/__tests__/utils.test.ts new file mode 100644 index 0000000..3cd018a --- /dev/null +++ b/packages/package-registry/src/__tests__/utils.test.ts @@ -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() + }) +}) diff --git a/packages/package-registry/src/jsr/__tests__/api.test.ts b/packages/package-registry/src/jsr/__tests__/api.test.ts index ea97b02..e7c1585 100644 --- a/packages/package-registry/src/jsr/__tests__/api.test.ts +++ b/packages/package-registry/src/jsr/__tests__/api.test.ts @@ -60,6 +60,16 @@ describe("Test the helper functions", () => { expect(parsed).toBeDefined() }) + test("Get Package's README", async () => { + const readme = await getJsrPackageSrcFile( + "kunkun", + "ext-image-processing", + "0.0.20", + "README.md" + ) + expect(readme).toBeDefined() + }) + test("Get Package's README.md", async () => { const readme = await getJsrPackageSrcFile("kunkun", "api", "0.0.47", "README.md") expect(readme).toBeDefined() diff --git a/packages/package-registry/src/jsr/index.ts b/packages/package-registry/src/jsr/index.ts index 6f53236..253ed7d 100644 --- a/packages/package-registry/src/jsr/index.ts +++ b/packages/package-registry/src/jsr/index.ts @@ -1,3 +1,4 @@ +import https from "https" import { client, getPackage, @@ -344,6 +345,17 @@ export async function validateJsrPackageAsKunkunExtension(payload: { } } + /* -------------------------------------------------------------------------- */ + /* get README content */ + /* -------------------------------------------------------------------------- */ + + const readmeContent = await getJsrPackageSrcFile( + payload.jsrPackage.scope, + payload.jsrPackage.name, + payload.jsrPackage.version, + parseResult.output.readme ?? "README.md" + ) + /* -------------------------------------------------------------------------- */ /* get @kksh/api dependency version */ /* -------------------------------------------------------------------------- */ @@ -357,6 +369,7 @@ export async function validateJsrPackageAsKunkunExtension(payload: { return { data: { pkgJson: parseResult.output, + readmeContent, tarballUrl, license: parseResult.output.license, shasum, diff --git a/packages/package-registry/src/models.ts b/packages/package-registry/src/models.ts index 3614bba..bf33f42 100644 --- a/packages/package-registry/src/models.ts +++ b/packages/package-registry/src/models.ts @@ -62,10 +62,12 @@ export type SigstoreAttestation = v.InferOutput export const ExtensionPublishValidationData = v.object({ pkgJson: ExtPackageJson, tarballUrl: v.string(), + readmeContent: v.optional(v.string()), shasum: v.string(), apiVersion: v.string(), rekorLogIndex: v.string(), tarballSize: v.number(), + unpackedSize: v.optional(v.number()), license: License, github: v.object({ githubActionInvocationId: v.string(), diff --git a/packages/package-registry/src/npm/__tests__/api.test.ts b/packages/package-registry/src/npm/__tests__/api.test.ts index a7ff86c..a18d487 100644 --- a/packages/package-registry/src/npm/__tests__/api.test.ts +++ b/packages/package-registry/src/npm/__tests__/api.test.ts @@ -59,4 +59,13 @@ describe("NPM API", () => { expect(await npmPackageExists("kunkun-ext-ossinsight", "0.0.1")).toBe(true) expect(await npmPackageExists("kunkun-ext-non-existing", "0.0.1")).toBe(false) }) + + test("validate npm package as kunkun extension", async () => { + const result = await validateNpmPackageAsKunkunExtension({ + pkgName: "kunkun-ext-hacker-news", + version: "0.0.10", + githubUsername: "huakunshen" + }) + expect(result.error).toBeUndefined() + }) }) diff --git a/packages/package-registry/src/npm/index.ts b/packages/package-registry/src/npm/index.ts index cfcf455..2624d49 100644 --- a/packages/package-registry/src/npm/index.ts +++ b/packages/package-registry/src/npm/index.ts @@ -7,6 +7,7 @@ import { } from "../github" import type { ExtensionPublishValidationData } from "../models" import { getInfoFromRekorLog } from "../sigstore" +import { getRawFileFromGitHub, getTarballSize } from "../utils" import { NpmPkgMetadata, NpmPkgVersionMetadata, @@ -207,7 +208,7 @@ export async function validateNpmPackageAsKunkunExtension(payload: { const parseResult = v.safeParse(ExtPackageJson, packageJson) if (!parseResult.success) { - console.log(v.flatten(parseResult.issues)) + console.error(v.flatten(parseResult.issues)) return { error: `package.json format not valid` } } /* -------------------------------------------------------------------------- */ @@ -228,15 +229,24 @@ export async function validateNpmPackageAsKunkunExtension(payload: { error: `Extension ${parseResult.output.kunkun.identifier} doesn't not have @kksh/api as a dependency` } } + const tarballSize = await getTarballSize(tarballUrl, "GET") // NPM HEAD request doesn't support content-length + const readmeContent = await getRawFileFromGitHub( + githubRepo.owner, + githubRepo.repo, + provenance.summary.sourceRepositoryDigest, + parseResult.output.readme ?? "README.md" + ) return { data: { pkgJson: parseResult.output, license: licenseParsed.output, + readmeContent, tarballUrl, shasum, apiVersion, - tarballSize: 0, + tarballSize, + unpackedSize: packageJson.dist?.unpackedSize, rekorLogIndex: logIndex, github: { githubActionInvocationId: rekorGit.githubActionInvocationId, diff --git a/packages/package-registry/src/utils.ts b/packages/package-registry/src/utils.ts index 30c9f75..554f933 100644 --- a/packages/package-registry/src/utils.ts +++ b/packages/package-registry/src/utils.ts @@ -3,11 +3,22 @@ * @param url tarball url, can technically be any url * @returns tarball size in bytes */ -export function getTarballSize(url: string): Promise { - return fetch(url, { method: "HEAD" }).then((res) => { +export function getTarballSize(url: string, method: "HEAD" | "GET" = "HEAD"): Promise { + return fetch(url, { method }).then((res) => { if (!(res.ok && res.status === 200)) { throw new Error("Failed to fetch tarball size") } return Number(res.headers.get("Content-Length")) }) } + +export function getRawFileFromGitHub( + owner: string, + repo: string, + commit: string, + filePath: string +): Promise { + return fetch(`https://raw.githubusercontent.com/${owner}/${repo}/${commit}/${filePath}`) + .then((res) => (res.ok ? res.text() : undefined)) + .catch((e) => undefined) +} diff --git a/packages/schema/package.json b/packages/schema/package.json index ecb0a1e..37bb881 100644 --- a/packages/schema/package.json +++ b/packages/schema/package.json @@ -16,7 +16,7 @@ "devDependencies": { "@types/bun": "latest", "@kksh/supabase": "workspace:*", - "@supabase/supabase-js": "^2.47.16", + "@supabase/supabase-js": "^2.48.0", "@valibot/to-json-schema": "1.0.0-beta.4" }, "peerDependencies": { diff --git a/packages/supabase/README.md b/packages/supabase/README.md index 78445f7..72503d0 100644 --- a/packages/supabase/README.md +++ b/packages/supabase/README.md @@ -1,3 +1,4 @@ ```bash -npx supabase gen types --lang=typescript --project-id $PROJECT_REF --schema public > ../api/src/supabase/database.types.ts +export PROJECT_REF=qzehioyfmxlgkeuujwlh +npx supabase gen types --lang=typescript --project-id $PROJECT_REF --schema public > ./src/database.types.ts ``` diff --git a/packages/supabase/package.json b/packages/supabase/package.json index f6cbe6c..35f1be8 100644 --- a/packages/supabase/package.json +++ b/packages/supabase/package.json @@ -13,7 +13,7 @@ "dependencies": { "@kksh/api": "workspace:*", "@supabase/ssr": "^0.5.2", - "@supabase/supabase-js": "^2.47.12" + "@supabase/supabase-js": "^2.48.0" }, "devDependencies": { "@types/bun": "latest" diff --git a/packages/supabase/src/database.types.ts b/packages/supabase/src/database.types.ts index bfce769..79617f7 100644 --- a/packages/supabase/src/database.types.ts +++ b/packages/supabase/src/database.types.ts @@ -1,295 +1,325 @@ -export type Json = string | number | boolean | null | { [key: string]: Json | undefined } | Json[] +export type Json = + | string + | number + | boolean + | null + | { [key: string]: Json | undefined } + | Json[] export type Database = { - public: { - Tables: { - events: { - Row: { - created_at: string - data: Json | null - event_type: Database["public"]["Enums"]["event_type"] - id: number - ip: string - } - Insert: { - created_at?: string - data?: Json | null - event_type: Database["public"]["Enums"]["event_type"] - id?: number - ip: string - } - Update: { - created_at?: string - data?: Json | null - event_type?: Database["public"]["Enums"]["event_type"] - id?: number - ip?: string - } - Relationships: [] - } - ext_images: { - Row: { - created_at: string - image_path: string - sha512: string - } - Insert: { - created_at?: string - image_path: string - sha512: string - } - Update: { - created_at?: string - image_path?: string - sha512?: string - } - Relationships: [] - } - ext_publish: { - Row: { - api_version: string | null - cmd_count: number - created_at: string - demo_images: string[] - downloads: number - id: number - identifier: string - manifest: Json - metadata: Json | null - name: string - shasum: string - size: number - tarball_path: string - version: string - } - Insert: { - api_version?: string | null - cmd_count: number - created_at?: string - demo_images: string[] - downloads: number - id?: number - identifier: string - manifest: Json - metadata?: Json | null - name: string - shasum: string - size: number - tarball_path: string - version: string - } - Update: { - api_version?: string | null - cmd_count?: number - created_at?: string - demo_images?: string[] - downloads?: number - id?: number - identifier?: string - manifest?: Json - metadata?: Json | null - name?: string - shasum?: string - size?: number - tarball_path?: string - version?: string - } - Relationships: [ - { - foreignKeyName: "ext_publish_identifier_fkey" - columns: ["identifier"] - isOneToOne: false - referencedRelation: "extensions" - referencedColumns: ["identifier"] - } - ] - } - extensions: { - Row: { - api_version: string - author_id: string | null - created_at: string - downloads: number - icon: Json | null - identifier: string - long_description: string | null - name: string - readme: string | null - short_description: string - version: string - } - Insert: { - api_version: string - author_id?: string | null - created_at?: string - downloads: number - icon?: Json | null - identifier: string - long_description?: string | null - name: string - readme?: string | null - short_description: string - version: string - } - Update: { - api_version?: string - author_id?: string | null - created_at?: string - downloads?: number - icon?: Json | null - identifier?: string - long_description?: string | null - name?: string - readme?: string | null - short_description?: string - version?: string - } - Relationships: [] - } - stargazers: { - Row: { - created_at: string - id: number - star_date: string - username: string - } - Insert: { - created_at?: string - id?: number - star_date: string - username: string - } - Update: { - created_at?: string - id?: number - star_date?: string - username?: string - } - Relationships: [] - } - } - Views: { - [_ in never]: never - } - Functions: { - get_aggregated_downloads: { - Args: Record - Returns: { - identifier: string - total_downloads: number - }[] - } - get_aggregated_downloads_with_details: { - Args: Record - Returns: { - identifier: string - total_downloads: number - name: string - short_description: string - }[] - } - increment_downloads: { - Args: { - t_identifier: string - t_version: string - } - Returns: number - } - } - Enums: { - event_type: "download" | "updater" | "schema" | "nightly_schema" - } - CompositeTypes: { - [_ in never]: never - } - } + public: { + Tables: { + events: { + Row: { + created_at: string + data: Json | null + event_type: Database["public"]["Enums"]["event_type"] + id: number + ip: string + } + Insert: { + created_at?: string + data?: Json | null + event_type: Database["public"]["Enums"]["event_type"] + id?: number + ip: string + } + Update: { + created_at?: string + data?: Json | null + event_type?: Database["public"]["Enums"]["event_type"] + id?: number + ip?: string + } + Relationships: [] + } + ext_images: { + Row: { + created_at: string + image_path: string + sha512: string + } + Insert: { + created_at?: string + image_path: string + sha512: string + } + Update: { + created_at?: string + image_path?: string + sha512?: string + } + Relationships: [] + } + ext_publish: { + Row: { + api_version: string | null + cmd_count: number + created_at: string + demo_images: string[] + downloads: number + extension_state: Database["public"]["Enums"]["extension_state"] + id: number + identifier: string + manifest: Json + metadata: Json | null + name: string + package_json: Json | null + readme: string | null + shasum: string + tarball_path: string + tarball_size: number + unpacked_size: number | null + version: string + } + Insert: { + api_version?: string | null + cmd_count: number + created_at?: string + demo_images: string[] + downloads: number + extension_state?: Database["public"]["Enums"]["extension_state"] + id?: number + identifier: string + manifest: Json + metadata?: Json | null + name: string + package_json?: Json | null + readme?: string | null + shasum: string + tarball_path: string + tarball_size: number + unpacked_size?: number | null + version: string + } + Update: { + api_version?: string | null + cmd_count?: number + created_at?: string + demo_images?: string[] + downloads?: number + extension_state?: Database["public"]["Enums"]["extension_state"] + id?: number + identifier?: string + manifest?: Json + metadata?: Json | null + name?: string + package_json?: Json | null + readme?: string | null + shasum?: string + tarball_path?: string + tarball_size?: number + unpacked_size?: number | null + version?: string + } + Relationships: [ + { + foreignKeyName: "ext_publish_identifier_fkey" + columns: ["identifier"] + isOneToOne: false + referencedRelation: "extensions" + referencedColumns: ["identifier"] + }, + ] + } + extensions: { + Row: { + api_version: string + author_id: string | null + created_at: string + downloads: number + icon: Json | null + identifier: string + long_description: string | null + name: string + readme: string | null + short_description: string + tarball_size: number | null + version: string + } + Insert: { + api_version: string + author_id?: string | null + created_at?: string + downloads: number + icon?: Json | null + identifier: string + long_description?: string | null + name: string + readme?: string | null + short_description: string + tarball_size?: number | null + version: string + } + Update: { + api_version?: string + author_id?: string | null + created_at?: string + downloads?: number + icon?: Json | null + identifier?: string + long_description?: string | null + name?: string + readme?: string | null + short_description?: string + tarball_size?: number | null + version?: string + } + Relationships: [] + } + stargazers: { + Row: { + created_at: string + id: number + star_date: string + username: string + } + Insert: { + created_at?: string + id?: number + star_date: string + username: string + } + Update: { + created_at?: string + id?: number + star_date?: string + username?: string + } + Relationships: [] + } + } + Views: { + [_ in never]: never + } + Functions: { + get_aggregated_downloads: { + Args: Record + Returns: { + identifier: string + total_downloads: number + }[] + } + get_aggregated_downloads_with_details: { + Args: Record + Returns: { + identifier: string + total_downloads: number + name: string + short_description: string + }[] + } + increment_downloads: { + Args: { + t_identifier: string + t_version: string + } + Returns: number + } + } + Enums: { + event_type: "download" | "updater" | "schema" | "nightly_schema" + extension_state: "public" | "pending" | "under_review" | "private" + } + CompositeTypes: { + [_ in never]: never + } + } } type PublicSchema = Database[Extract] export type Tables< - PublicTableNameOrOptions extends - | keyof (PublicSchema["Tables"] & PublicSchema["Views"]) - | { schema: keyof Database }, - TableName extends PublicTableNameOrOptions extends { schema: keyof Database } - ? keyof (Database[PublicTableNameOrOptions["schema"]]["Tables"] & - Database[PublicTableNameOrOptions["schema"]]["Views"]) - : never = never + PublicTableNameOrOptions extends + | keyof (PublicSchema["Tables"] & PublicSchema["Views"]) + | { schema: keyof Database }, + TableName extends PublicTableNameOrOptions extends { schema: keyof Database } + ? keyof (Database[PublicTableNameOrOptions["schema"]]["Tables"] & + Database[PublicTableNameOrOptions["schema"]]["Views"]) + : never = never, > = PublicTableNameOrOptions extends { schema: keyof Database } - ? (Database[PublicTableNameOrOptions["schema"]]["Tables"] & - Database[PublicTableNameOrOptions["schema"]]["Views"])[TableName] extends { - Row: infer R - } - ? R - : never - : PublicTableNameOrOptions extends keyof (PublicSchema["Tables"] & PublicSchema["Views"]) - ? (PublicSchema["Tables"] & PublicSchema["Views"])[PublicTableNameOrOptions] extends { - Row: infer R - } - ? R - : never - : never + ? (Database[PublicTableNameOrOptions["schema"]]["Tables"] & + Database[PublicTableNameOrOptions["schema"]]["Views"])[TableName] extends { + Row: infer R + } + ? R + : never + : PublicTableNameOrOptions extends keyof (PublicSchema["Tables"] & + PublicSchema["Views"]) + ? (PublicSchema["Tables"] & + PublicSchema["Views"])[PublicTableNameOrOptions] extends { + Row: infer R + } + ? R + : never + : never export type TablesInsert< - PublicTableNameOrOptions extends keyof PublicSchema["Tables"] | { schema: keyof Database }, - TableName extends PublicTableNameOrOptions extends { schema: keyof Database } - ? keyof Database[PublicTableNameOrOptions["schema"]]["Tables"] - : never = never + PublicTableNameOrOptions extends + | keyof PublicSchema["Tables"] + | { schema: keyof Database }, + TableName extends PublicTableNameOrOptions extends { schema: keyof Database } + ? keyof Database[PublicTableNameOrOptions["schema"]]["Tables"] + : never = never, > = PublicTableNameOrOptions extends { schema: keyof Database } - ? Database[PublicTableNameOrOptions["schema"]]["Tables"][TableName] extends { - Insert: infer I - } - ? I - : never - : PublicTableNameOrOptions extends keyof PublicSchema["Tables"] - ? PublicSchema["Tables"][PublicTableNameOrOptions] extends { - Insert: infer I - } - ? I - : never - : never + ? Database[PublicTableNameOrOptions["schema"]]["Tables"][TableName] extends { + Insert: infer I + } + ? I + : never + : PublicTableNameOrOptions extends keyof PublicSchema["Tables"] + ? PublicSchema["Tables"][PublicTableNameOrOptions] extends { + Insert: infer I + } + ? I + : never + : never export type TablesUpdate< - PublicTableNameOrOptions extends keyof PublicSchema["Tables"] | { schema: keyof Database }, - TableName extends PublicTableNameOrOptions extends { schema: keyof Database } - ? keyof Database[PublicTableNameOrOptions["schema"]]["Tables"] - : never = never + PublicTableNameOrOptions extends + | keyof PublicSchema["Tables"] + | { schema: keyof Database }, + TableName extends PublicTableNameOrOptions extends { schema: keyof Database } + ? keyof Database[PublicTableNameOrOptions["schema"]]["Tables"] + : never = never, > = PublicTableNameOrOptions extends { schema: keyof Database } - ? Database[PublicTableNameOrOptions["schema"]]["Tables"][TableName] extends { - Update: infer U - } - ? U - : never - : PublicTableNameOrOptions extends keyof PublicSchema["Tables"] - ? PublicSchema["Tables"][PublicTableNameOrOptions] extends { - Update: infer U - } - ? U - : never - : never + ? Database[PublicTableNameOrOptions["schema"]]["Tables"][TableName] extends { + Update: infer U + } + ? U + : never + : PublicTableNameOrOptions extends keyof PublicSchema["Tables"] + ? PublicSchema["Tables"][PublicTableNameOrOptions] extends { + Update: infer U + } + ? U + : never + : never export type Enums< - PublicEnumNameOrOptions extends keyof PublicSchema["Enums"] | { schema: keyof Database }, - EnumName extends PublicEnumNameOrOptions extends { schema: keyof Database } - ? keyof Database[PublicEnumNameOrOptions["schema"]]["Enums"] - : never = never + PublicEnumNameOrOptions extends + | keyof PublicSchema["Enums"] + | { schema: keyof Database }, + EnumName extends PublicEnumNameOrOptions extends { schema: keyof Database } + ? keyof Database[PublicEnumNameOrOptions["schema"]]["Enums"] + : never = never, > = PublicEnumNameOrOptions extends { schema: keyof Database } - ? Database[PublicEnumNameOrOptions["schema"]]["Enums"][EnumName] - : PublicEnumNameOrOptions extends keyof PublicSchema["Enums"] - ? PublicSchema["Enums"][PublicEnumNameOrOptions] - : never + ? Database[PublicEnumNameOrOptions["schema"]]["Enums"][EnumName] + : PublicEnumNameOrOptions extends keyof PublicSchema["Enums"] + ? PublicSchema["Enums"][PublicEnumNameOrOptions] + : never export type CompositeTypes< - PublicCompositeTypeNameOrOptions extends - | keyof PublicSchema["CompositeTypes"] - | { schema: keyof Database }, - CompositeTypeName extends PublicCompositeTypeNameOrOptions extends { - schema: keyof Database - } - ? keyof Database[PublicCompositeTypeNameOrOptions["schema"]]["CompositeTypes"] - : never = never + PublicCompositeTypeNameOrOptions extends + | keyof PublicSchema["CompositeTypes"] + | { schema: keyof Database }, + CompositeTypeName extends PublicCompositeTypeNameOrOptions extends { + schema: keyof Database + } + ? keyof Database[PublicCompositeTypeNameOrOptions["schema"]]["CompositeTypes"] + : never = never, > = PublicCompositeTypeNameOrOptions extends { schema: keyof Database } - ? Database[PublicCompositeTypeNameOrOptions["schema"]]["CompositeTypes"][CompositeTypeName] - : PublicCompositeTypeNameOrOptions extends keyof PublicSchema["CompositeTypes"] - ? PublicSchema["CompositeTypes"][PublicCompositeTypeNameOrOptions] - : never + ? Database[PublicCompositeTypeNameOrOptions["schema"]]["CompositeTypes"][CompositeTypeName] + : PublicCompositeTypeNameOrOptions extends keyof PublicSchema["CompositeTypes"] + ? PublicSchema["CompositeTypes"][PublicCompositeTypeNameOrOptions] + : never diff --git a/packages/tauri-plugins/jarvis/package.json b/packages/tauri-plugins/jarvis/package.json index 24694a7..d613919 100644 --- a/packages/tauri-plugins/jarvis/package.json +++ b/packages/tauri-plugins/jarvis/package.json @@ -7,7 +7,7 @@ }, "devDependencies": { "@kksh/supabase": "workspace:*", - "@supabase/supabase-js": "^2.47.16", + "@supabase/supabase-js": "^2.48.0", "@kksh/ci": "workspace:*", "@types/bun": "latest" }, diff --git a/packages/ui/package.json b/packages/ui/package.json index f53da89..d58b29a 100644 --- a/packages/ui/package.json +++ b/packages/ui/package.json @@ -73,6 +73,7 @@ "@std/semver": "npm:@jsr/std__semver@^1.0.3", "dompurify": "^3.2.3", "gsap": "^3.12.7", + "pretty-bytes": "^6.1.1", "shiki-magic-move": "^0.5.2", "svelte-markdown": "^0.4.1", "valibot": "1.0.0-beta.12" diff --git a/packages/ui/src/components/common/TauriLink.svelte b/packages/ui/src/components/common/TauriLink.svelte index a29bf52..8a048b1 100644 --- a/packages/ui/src/components/common/TauriLink.svelte +++ b/packages/ui/src/components/common/TauriLink.svelte @@ -1,5 +1,6 @@ - +{#if isInTauri} + +{:else} + + {@render children?.()} + +{/if} diff --git a/packages/ui/src/components/extension/GitHubProvenanceCard.svelte b/packages/ui/src/components/extension/GitHubProvenanceCard.svelte index 92212c1..8fd00c7 100644 --- a/packages/ui/src/components/extension/GitHubProvenanceCard.svelte +++ b/packages/ui/src/components/extension/GitHubProvenanceCard.svelte @@ -26,7 +26,7 @@
- Built and signed on + Built and signed on

GitHub Actions

View build summary diff --git a/packages/ui/src/components/extension/StoreExtDetail.svelte b/packages/ui/src/components/extension/StoreExtDetail.svelte index 65427b8..3431a27 100644 --- a/packages/ui/src/components/extension/StoreExtDetail.svelte +++ b/packages/ui/src/components/extension/StoreExtDetail.svelte @@ -8,11 +8,14 @@ import { Constants, IconMultiplexer } from "@kksh/ui" import { cn } from "@kksh/ui/utils" import { CircleCheckBigIcon, MoveRightIcon, Trash2Icon } from "lucide-svelte" + import prettyBytes from "pretty-bytes" import * as v from "valibot" import DialogImageCarousel from "../common/DialogImageCarousel.svelte" import PlatformsIcons from "../common/PlatformsIcons.svelte" + import TauriLink from "../common/TauriLink.svelte" import GitHubProvenanceCard from "./GitHubProvenanceCard.svelte" import PermissionInspector from "./PermissionInspector.svelte" + import Markdown from "./templates/Markdown.svelte" let { extPublish, @@ -25,6 +28,7 @@ onInstallSelected, onUpgradeSelected, onUninstallSelected, + packageJson, showBtn, loading, imageDialogOpen = $bindable(false) @@ -32,6 +36,7 @@ extPublish: Tables<"ext_publish"> ext: Tables<"extensions"> installedExt?: ExtPackageJson + packageJson: ExtPackageJson | null manifest: KunkunExtManifest demoImages: string[] class?: string @@ -128,6 +133,19 @@ {/if} {/snippet} + +{#snippet person(author: ExtPackageJson["author"])} + {#if author} + {#if typeof author === "string"} + {author} + {:else if author.url} + {author.name} + {:else} + {author.name} + {/if} + {/if} +{/snippet} +
@@ -149,6 +167,9 @@
{extPublish.identifier}
Version: {extPublish.version}
Downloads: {ext.downloads}
+
+					Size: {prettyBytes(extPublish.tarball_size)}
+				
@@ -221,27 +242,52 @@
{manifest?.shortDescription}
{manifest?.longDescription}
-

Commands

- -
    - {#if manifest} - {#each [...(manifest.customUiCmds ?? []), ...(manifest.templateUiCmds ?? [])] as cmd} -
  • -
    - {#if manifest} - - {/if} -
    - {cmd.name} -

    {cmd.description}

    -
    - -
    - -
  • - {/each} - {/if} -
+
+
+

Commands

+
    + {#if manifest} + {#each [...(manifest.customUiCmds ?? []), ...(manifest.templateUiCmds ?? [])] as cmd} +
  • +
    + {#if manifest} + + {/if} +
    + {cmd.name} +

    {cmd.description}

    +
    + +
    + +
  • + {/each} + {/if} +
+
+
+

Author

+ {#if packageJson?.author} +
    +
  • {@render person(packageJson?.author)}
  • +
+ {:else} + N/A + {/if} +
+

Contributors

+
    + {#each packageJson?.contributors ?? [] as contributor} +
  • {@render person(contributor)}
  • + {/each} +
+
+
+ +

README

+ {#if extPublish?.readme} + + {/if}