fixed some supabase errors

This commit is contained in:
Huakun Shen 2025-03-26 03:52:31 -04:00
parent 2418cb103b
commit 2b9df3106f
No known key found for this signature in database
13 changed files with 197 additions and 134 deletions

8
apps/desktop/dev.ts Normal file
View File

@ -0,0 +1,8 @@
import { getExtensionsLatestPublishByIdentifier } from "@kksh/sdk"
const latestPublish = await getExtensionsLatestPublishByIdentifier({
path: {
identifier: "RAG1"
}
})
console.log(latestPublish)

View File

@ -1,8 +1,7 @@
import { extensions } from "@/stores" import { extensions } from "@/stores"
import { supabaseAPI } from "@/supabase"
import { isCompatible } from "@kksh/api" import { isCompatible } from "@kksh/api"
import type { ExtPackageJsonExtra } from "@kksh/api/models" import type { ExtPackageJsonExtra } from "@kksh/api/models"
import { greaterThan } from "@std/semver" import { getExtensionsLatestPublishByIdentifier } from "@kksh/sdk"
import { relaunch } from "@tauri-apps/plugin-process" import { relaunch } from "@tauri-apps/plugin-process"
import { check } from "@tauri-apps/plugin-updater" import { check } from "@tauri-apps/plugin-updater"
import { gt } from "semver" import { gt } from "semver"
@ -32,11 +31,22 @@ export async function checkSingleExtensionUpdate(
installedExt: ExtPackageJsonExtra, installedExt: ExtPackageJsonExtra,
autoupgrade: boolean autoupgrade: boolean
) { ) {
const { data: sbExt, error } = await supabaseAPI.getLatestExtPublish( const {
installedExt.kunkun.identifier data: sbExt,
) error,
response
} = await getExtensionsLatestPublishByIdentifier({
path: {
identifier: "RAG"
}
})
// const { data: sbExt, error } = await supabaseAPI.getLatestExtPublish(
// installedExt.kunkun.identifier
// )
if (error) { if (error) {
return toast.error(`Failed to check update for ${installedExt.kunkun.identifier}: ${error}`) return toast.error(
`Failed to check update for ${installedExt.kunkun.identifier}: ${error} (${response.status})`
)
} }
if (!sbExt) { if (!sbExt) {
@ -49,10 +59,7 @@ export async function checkSingleExtensionUpdate(
) { ) {
if (autoupgrade) { if (autoupgrade) {
await extensions await extensions
.upgradeStoreExtension( .upgradeStoreExtension(sbExt.identifier, sbExt.tarball_path)
sbExt.identifier,
supabaseAPI.translateExtensionFilePathToUrl(sbExt.tarball_path)
)
.then(() => { .then(() => {
toast.success(`${sbExt.name} upgraded`, { toast.success(`${sbExt.name} upgraded`, {
description: `From ${installedExt.version} to ${sbExt.version}` description: `From ${installedExt.version} to ${sbExt.version}`

View File

@ -2,14 +2,13 @@
import { getExtensionsFolder } from "@/constants" import { getExtensionsFolder } from "@/constants"
import { appState, extensions } from "@/stores" import { appState, extensions } from "@/stores"
import { keys } from "@/stores/keys" import { keys } from "@/stores/keys"
import { supabaseAPI } from "@/supabase"
import { goBackOnEscapeClearSearchTerm, goHomeOnEscapeClearSearchTerm } from "@/utils/key"
import { goBack, goHome } from "@/utils/route" import { goBack, goHome } from "@/utils/route"
import { Action as ActionSchema } from "@kksh/api/models" import { Action as ActionSchema, ExtensionStoreListItem, ExtPublish } from "@kksh/api/models"
import { Action } from "@kksh/api/ui" import { Action } from "@kksh/api/ui"
import { SBExt } from "@kksh/supabase/models" import {
import type { ExtPublishMetadata } from "@kksh/supabase/models" getExtensionsLatestPublishByIdentifier,
import { type Tables } from "@kksh/supabase/types" postExtensionsIncrementDownloads
} from "@kksh/sdk"
import { Button, Command } from "@kksh/svelte5" import { Button, Command } from "@kksh/svelte5"
import { Constants } from "@kksh/ui" import { Constants } from "@kksh/ui"
import { ExtListItem } from "@kksh/ui/extension" import { ExtListItem } from "@kksh/ui/extension"
@ -71,51 +70,57 @@
} }
}) })
function onExtItemSelected(ext: SBExt) { function onExtItemSelected(ext: ExtensionStoreListItem) {
goto(`./store/${ext.identifier}`) goto(`./store/${ext.identifier}`)
} }
async function onExtItemUpgrade(ext: SBExt) { async function onExtItemUpgrade(ext: ExtensionStoreListItem) {
const res = await supabaseAPI.getLatestExtPublish(ext.identifier) const { data, error, response } = await getExtensionsLatestPublishByIdentifier({
if (res.error) path: {
identifier: ext.identifier
}
})
if (error)
return toast.error("Fail to get latest extension", { return toast.error("Fail to get latest extension", {
description: res.error.message description: error as string
}) })
const tarballUrl = res.data.tarball_path.startsWith("http") const installExtras = await getInstallExtras(data?.metadata)
? res.data.tarball_path
: supabaseAPI.translateExtensionFilePathToUrl(res.data.tarball_path)
const installExtras = await getInstallExtras(
res.data as Tables<"ext_publish"> & { metadata: ExtPublishMetadata }
)
return extensions return extensions
.upgradeStoreExtension(ext.identifier, tarballUrl, installExtras) .upgradeStoreExtension(ext.identifier, data.tarball_path, installExtras)
.then((newExt) => { .then((newExt) => {
toast.success(`${ext.name} Upgraded to ${newExt.version}`) toast.success(`${ext.name} Upgraded to ${newExt.version}`)
}) })
} }
async function onExtItemInstall(ext: SBExt) { async function onExtItemInstall(ext: ExtensionStoreListItem) {
const res = await supabaseAPI.getLatestExtPublish(ext.identifier) const { data, error, response } = await getExtensionsLatestPublishByIdentifier({
if (res.error) path: {
identifier: ext.identifier
}
})
if (error)
return toast.error("Fail to get latest extension", { return toast.error("Fail to get latest extension", {
description: res.error.message description: error
}) })
const tarballUrl = res.data.tarball_path.startsWith("http") const installExtras = await getInstallExtras(data?.metadata)
? res.data.tarball_path
: supabaseAPI.translateExtensionFilePathToUrl(res.data.tarball_path)
const installExtras = await getInstallExtras(
res.data as Tables<"ext_publish"> & { metadata: ExtPublishMetadata }
)
const installDir = await getExtensionsFolder() const installDir = await getExtensionsFolder()
return extensions return extensions
.installFromTarballUrl(tarballUrl, installDir, installExtras) .installFromTarballUrl(data.tarball_path, installDir, installExtras)
.then(() => toast.success(`Plugin ${ext.name} Installed`)) .then(() => toast.success(`Plugin ${ext.name} Installed`))
.then(() => .then(() =>
supabaseAPI.incrementDownloads({ postExtensionsIncrementDownloads({
identifier: ext.identifier, body: {
version: ext.version identifier: ext.identifier,
version: ext.version
}
}) })
.then(({ error }) => {
if (error) {
console.error(error)
}
})
.catch(console.error)
) )
} }

View File

@ -1,43 +1,40 @@
import { appConfig, appState, extensions, installedStoreExts } from "@/stores" import { appConfig, appState, extensions, installedStoreExts } from "@/stores"
import { supabaseAPI } from "@/supabase" import { goHome } from "@/utils/route"
import type { ExtPackageJsonExtra } from "@kksh/api/models" // import { supabaseAPI } from "@/supabase"
import type { ExtensionStoreListItem, ExtPackageJsonExtra } from "@kksh/api/models"
import { isExtPathInDev, isUpgradable } from "@kksh/extension" import { isExtPathInDev, isUpgradable } from "@kksh/extension"
import { SBExt } from "@kksh/supabase/models" import { getExtensionsStoreList } from "@kksh/sdk"
import { sleep } from "@kksh/utils" import { toast } from "svelte-sonner"
import { error } from "@sveltejs/kit"
import { derived, get, type Readable } from "svelte/store" import { derived, get, type Readable } from "svelte/store"
import type { PageLoad } from "./$types" import type { PageLoad } from "./$types"
export const load: PageLoad = (): Promise<{ export const load: PageLoad = (): Promise<{
storeExtList: SBExt[] storeExtList: ExtensionStoreListItem[]
installedStoreExts: Readable<ExtPackageJsonExtra[]> installedStoreExts: Readable<ExtPackageJsonExtra[]>
installedExtsMap: Readable<Record<string, string>> installedExtsMap: Readable<Record<string, string>>
upgradableExpsMap: Readable<Record<string, boolean>> upgradableExpsMap: Readable<Record<string, boolean>>
}> => { }> => {
appState.setFullScreenLoading(true) appState.setFullScreenLoading(true)
return supabaseAPI return getExtensionsStoreList()
.getExtList() .then(({ data: storeExtList, error, response }) => {
.then(async (storeExtList) => { storeExtList = storeExtList ?? []
// map identifier to extItem if (error) {
toast.error(`Failed to load extension store: ${error} (${response.status})`)
goHome()
return
}
const storeExtsMap = Object.fromEntries(storeExtList.map((ext) => [ext.identifier, ext])) const storeExtsMap = Object.fromEntries(storeExtList.map((ext) => [ext.identifier, ext]))
// const _appConfig = get(appConfig)
// const installedStoreExts = derived(extensions, ($extensions) => {
// if (!_appConfig.extensionPath) return []
// return $extensions.filter((ext) => !isExtPathInDev(_appConfig.extensionPath!, ext.extPath))
// })
// map installed extension identifier to version
const installedExtsMap = derived(installedStoreExts, ($exts) => const installedExtsMap = derived(installedStoreExts, ($exts) =>
Object.fromEntries($exts.map((ext) => [ext.kunkun.identifier, ext.version])) Object.fromEntries($exts.map((ext) => [ext.kunkun.identifier, ext.version]))
) )
const upgradableExpsMap = derived(installedStoreExts, ($exts) => const upgradableExpsMap = derived(installedStoreExts, ($exts) =>
Object.fromEntries( Object.fromEntries(
$exts.map((ext) => { $exts.map((ext) => {
const dbExt: SBExt | undefined = storeExtsMap[ext.kunkun.identifier] const dbExt: ExtensionStoreListItem | undefined = storeExtsMap[ext.kunkun.identifier]
return [ext.kunkun.identifier, dbExt ? isUpgradable(dbExt, ext.version) : false] return [ext.kunkun.identifier, dbExt ? isUpgradable(dbExt, ext.version) : false]
}) })
) )
) )
return { return {
storeExtList, storeExtList,
installedStoreExts, installedStoreExts,

View File

@ -2,11 +2,8 @@
import { getExtensionsFolder } from "@/constants.js" import { getExtensionsFolder } from "@/constants.js"
import { i18n } from "@/i18n.js" import { i18n } from "@/i18n.js"
import { extensions, installedStoreExts } from "@/stores/extensions.js" import { extensions, installedStoreExts } from "@/stores/extensions.js"
import { supabaseAPI } from "@/supabase" import { ExtensionStoreListItem, ExtPackageJson, ExtPublish } from "@kksh/api/models"
import { goBack } from "@/utils/route.js" import { postExtensionsIncrementDownloads } from "@kksh/sdk"
import { ExtPackageJson } from "@kksh/api/models"
import { ExtPublishMetadata } from "@kksh/supabase/models"
import type { Tables } from "@kksh/supabase/types"
import { Button } from "@kksh/svelte5" import { Button } from "@kksh/svelte5"
import { cn } from "@kksh/svelte5/utils" import { cn } from "@kksh/svelte5/utils"
import { Constants } from "@kksh/ui" import { Constants } from "@kksh/ui"
@ -22,10 +19,8 @@
import { getInstallExtras } from "./helper" import { getInstallExtras } from "./helper"
const { data } = $props() const { data } = $props()
const extPublish: Tables<"ext_publish"> & { metadata: ExtPublishMetadata } = $derived( const extPublish: ExtPublish = $derived(data.extPublish)
data.extPublish const ext: ExtensionStoreListItem = $derived(data.ext)
)
const ext: Tables<"extensions"> = $derived(data.ext)
const manifest = $derived(data.manifest) const manifest = $derived(data.manifest)
const installedExt = storeDerived(installedStoreExts, ($e) => { const installedExt = storeDerived(installedStoreExts, ($e) => {
return $e.find((e) => e.kunkun.identifier === extPublish.identifier) return $e.find((e) => e.kunkun.identifier === extPublish.identifier)
@ -77,28 +72,29 @@
}, 500) }, 500)
}) })
const demoImages = $derived( const demoImages = $derived(extPublish.demo_images)
extPublish.demo_images.map((src) =>
src.startsWith("http") ? src : supabaseAPI.translateExtensionFilePathToUrl(src)
)
)
async function onInstallSelected() { async function onInstallSelected() {
loading.install = true loading.install = true
const tarballUrl = extPublish.tarball_path.startsWith("http") const installExtras = await getInstallExtras(extPublish.metadata)
? extPublish.tarball_path
: supabaseAPI.translateExtensionFilePathToUrl(extPublish.tarball_path)
const installExtras = await getInstallExtras(extPublish)
const installDir = await getExtensionsFolder() const installDir = await getExtensionsFolder()
return extensions return extensions
.installFromTarballUrl(tarballUrl, installDir, installExtras) .installFromTarballUrl(extPublish.tarball_path, installDir, installExtras)
.then(() => toast.success(`Plugin ${extPublish.name} Installed`)) .then(() => toast.success(`Plugin ${extPublish.name} Installed`))
.then((loadedExt) => { .then((loadedExt) => {
info(`Successfully installed ${extPublish.name}`) info(`Successfully installed ${extPublish.name}`)
supabaseAPI.incrementDownloads({ postExtensionsIncrementDownloads({
identifier: extPublish.identifier, body: {
version: extPublish.version identifier: extPublish.identifier,
version: extPublish.version
}
}) })
.then(({ error }) => {
if (error) {
console.error(error)
}
})
.catch(console.error)
showBtn.install = false showBtn.install = false
showBtn.uninstall = true showBtn.uninstall = true
}) })
@ -113,9 +109,8 @@
function onUpgradeSelected() { function onUpgradeSelected() {
loading.upgrade = true loading.upgrade = true
const tarballUrl = supabaseAPI.translateExtensionFilePathToUrl(extPublish.tarball_path)
return extensions return extensions
.upgradeStoreExtension(extPublish.identifier, tarballUrl) .upgradeStoreExtension(extPublish.identifier, extPublish.tarball_path)
.then((newExt) => { .then((newExt) => {
toast.success( toast.success(
`${extPublish.name} Upgraded from ${$installedExt?.version} to ${newExt.version}` `${extPublish.name} Upgraded from ${$installedExt?.version} to ${newExt.version}`

View File

@ -1,9 +1,17 @@
import { appState, extensions } from "@/stores" import { appState, extensions } from "@/stores"
import { supabaseAPI } from "@/supabase" import {
import { KunkunExtManifest, type ExtPackageJsonExtra } from "@kksh/api/models" ExtensionStoreListItem,
import { ExtPublishMetadata } from "@kksh/supabase/models" ExtPublish,
import type { Tables } from "@kksh/supabase/types" KunkunExtManifest,
import { sleep } from "@kksh/utils" type ExtPackageJsonExtra
} from "@kksh/api/models"
import {
getExtensionsByIdentifier,
getExtensionsLatestPublishByIdentifier,
type GetExtensionsByIdentifierResponse,
type GetExtensionsLatestPublishByIdentifierResponse,
type GetExtensionsLatestPublishByIdentifierResponses
} from "@kksh/sdk"
import { error } from "@sveltejs/kit" import { error } from "@sveltejs/kit"
import { toast } from "svelte-sonner" import { toast } from "svelte-sonner"
import * as v from "valibot" import * as v from "valibot"
@ -12,43 +20,43 @@ import type { PageLoad } from "./$types"
export const load: PageLoad = ({ export const load: PageLoad = ({
params params
}): Promise<{ }): Promise<{
extPublish: Tables<"ext_publish"> & { metadata: ExtPublishMetadata } // extPublish: GetExtensionsLatestPublishByIdentifierResponses['200']
ext: Tables<"extensions"> ext: GetExtensionsByIdentifierResponse
manifest: KunkunExtManifest manifest: GetExtensionsLatestPublishByIdentifierResponse["manifest"]
params: { params: {
identifier: string identifier: string
} }
}> => { }> => {
appState.setFullScreenLoading(true) appState.setFullScreenLoading(true)
return supabaseAPI return getExtensionsLatestPublishByIdentifier({
.getLatestExtPublish(params.identifier) path: {
.then(async ({ error: dbError, data: extPublish }) => { identifier: params.identifier
const metadataParse = v.safeParse(ExtPublishMetadata, extPublish?.metadata ?? {}) }
if (dbError) { })
.then(async ({ data: extPublish, error: err, response }) => {
if (err || !extPublish) {
console.error(err)
return error(400, { return error(400, {
message: dbError.message message: "Failed to get extension publish"
}) })
} }
const metadata = metadataParse.success ? metadataParse.output : {} const { data: ext, error: extError } = await getExtensionsByIdentifier({
const parseManifest = v.safeParse(KunkunExtManifest, extPublish.manifest) path: {
if (!parseManifest.success) { identifier: params.identifier
const errMsg = "Invalid extension manifest, you may need to upgrade your app." }
toast.error(errMsg) })
throw error(400, errMsg)
}
const { data: ext, error: extError } = await supabaseAPI.getExtension(params.identifier)
if (extError) { if (extError) {
console.error(extError)
return error(400, { return error(400, {
message: extError.message message: "Failed to get extension"
}) })
} }
return { return {
extPublish: { ...extPublish, metadata }, // extPublish,
ext, ext,
params, manifest: extPublish.manifest,
manifest: parseManifest.output params
} }
}) })
.finally(() => { .finally(() => {

View File

@ -1,15 +1,17 @@
import type { ExtPublishMetadata } from "@kksh/supabase/models" import type { ExtPublishMetadata } from "@kunkunapi/src/models"
import type { Tables } from "@kksh/supabase/types"
export async function getInstallExtras( export async function getInstallExtras(
ext: Tables<"ext_publish"> & { metadata?: ExtPublishMetadata } extMetadata?: {
sourceType?: string
source?: string
}
): Promise<{ overwritePackageJson?: string }> { ): Promise<{ overwritePackageJson?: string }> {
const extras: { overwritePackageJson?: string } = {} const extras: { overwritePackageJson?: string } = {}
if (ext.metadata?.sourceType) { if (extMetadata?.sourceType) {
if (ext.metadata?.sourceType === "jsr") { if (extMetadata?.sourceType === "jsr") {
if (ext.metadata?.source) { if (extMetadata?.source) {
try { try {
const res = await fetch(`${ext.metadata.source}/package.json`) const res = await fetch(`${extMetadata.source}/package.json`)
const pkgJsonContent = await res.text() const pkgJsonContent = await res.text()
extras.overwritePackageJson = pkgJsonContent extras.overwritePackageJson = pkgJsonContent
} catch (error) { } catch (error) {

View File

@ -1,5 +1,6 @@
import * as v from "valibot" import * as v from "valibot"
import { BaseIcon } from "./icon" import { BaseIcon } from "./icon"
import { ExtPackageJson, KunkunExtManifest } from "./manifest"
export enum ExtPublishSourceTypeEnum { export enum ExtPublishSourceTypeEnum {
jsr = "jsr", jsr = "jsr",
@ -26,13 +27,14 @@ export const ExtPublishMetadata = v.object({
export type ExtPublishMetadata = v.InferOutput<typeof ExtPublishMetadata> export type ExtPublishMetadata = v.InferOutput<typeof ExtPublishMetadata>
/*** /***
* Correspond to `extensions` table in supabase * Correspond to `extensions` table in supabase, missing a few fields
*/ */
export const ExtensionStoreListItem = v.object({ export const ExtensionStoreListItem = v.object({
identifier: v.string(), identifier: v.string(),
name: v.string(), name: v.string(),
created_at: v.string(), created_at: v.string(),
downloads: v.number(), downloads: v.number(),
author_id: v.string(),
short_description: v.string(), short_description: v.string(),
long_description: v.string(), long_description: v.string(),
version: v.string(), version: v.string(),
@ -41,3 +43,34 @@ export const ExtensionStoreListItem = v.object({
}) })
export type ExtensionStoreListItem = v.InferOutput<typeof ExtensionStoreListItem> export type ExtensionStoreListItem = v.InferOutput<typeof ExtensionStoreListItem>
export enum PublishStateEnum {
"public",
"pending",
"under_review",
"private"
}
export const ExtensionPublishState = v.enum(PublishStateEnum)
export const ExtPublish = v.object({
name: v.string(),
tarball_path: v.string(),
created_at: v.date(),
version: v.string(),
manifest: KunkunExtManifest,
shasum: v.string(),
tarball_size: v.number(),
unpacked_size: v.nullable(v.number()),
cmd_count: v.number(),
identifier: v.string(),
downloads: v.number(),
demo_images: v.array(v.string()),
api_version: v.nullable(v.string()),
extension_state: ExtensionPublishState,
package_json: ExtPackageJson,
metadata: ExtPublishMetadata,
readme: v.nullable(v.string())
})
export type ExtPublish = v.InferOutput<typeof ExtPublish>
export const DBExtension = v.object({})

View File

@ -4,8 +4,8 @@
*/ */
import { isCompatible } from "@kksh/api" import { isCompatible } from "@kksh/api"
import { copy_dir_all, db, decompressTarball } from "@kksh/api/commands" import { copy_dir_all, db, decompressTarball } from "@kksh/api/commands"
import type { ExtPackageJsonExtra } from "@kksh/api/models" import type { ExtensionStoreListItem, ExtPackageJsonExtra } from "@kksh/api/models"
import { SBExt } from "@kksh/supabase/models" // import { SBExt } from "@kksh/supabase/models"
import { greaterThan, parse as parseSemver } from "@std/semver" import { greaterThan, parse as parseSemver } from "@std/semver"
import * as path from "@tauri-apps/api/path" import * as path from "@tauri-apps/api/path"
import * as dialog from "@tauri-apps/plugin-dialog" import * as dialog from "@tauri-apps/plugin-dialog"
@ -193,7 +193,7 @@ export async function uninstallExtensionByPath(extPath: string) {
return fs.remove(extPath, { recursive: true }).then(() => db.deleteExtensionByPath(extPath)) return fs.remove(extPath, { recursive: true }).then(() => db.deleteExtensionByPath(extPath))
} }
export function isUpgradable(dbExt: SBExt, installedExtVersion: string) { export function isUpgradable(dbExt: ExtensionStoreListItem, installedExtVersion: string) {
const upgradable = const upgradable =
greaterThan(parseSemver(dbExt.version), parseSemver(installedExtVersion)) && dbExt.api_version greaterThan(parseSemver(dbExt.version), parseSemver(installedExtVersion)) && dbExt.api_version
? isCompatible(dbExt.api_version) ? isCompatible(dbExt.api_version)

View File

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

View File

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

View File

@ -1,7 +1,6 @@
<script lang="ts"> <script lang="ts">
import Icon from "@iconify/svelte" import Icon from "@iconify/svelte"
import { ExtData, Icon as TIcon } from "@kksh/api/models" import { ExtData, ExtensionStoreListItem, Icon as TIcon } from "@kksh/api/models"
import { SBExt } from "@kksh/supabase/models"
import { Button, Command } from "@kksh/svelte5" import { Button, Command } from "@kksh/svelte5"
import { Constants, IconMultiplexer } from "@kksh/ui" import { Constants, IconMultiplexer } from "@kksh/ui"
import { cn, humanReadableNumber } from "@kksh/ui/utils" import { cn, humanReadableNumber } from "@kksh/ui/utils"
@ -19,7 +18,7 @@
class: className class: className
}: { }: {
class?: string class?: string
ext: SBExt ext: ExtensionStoreListItem
installedVersion?: string installedVersion?: string
onSelect: () => void onSelect: () => void
onUpgrade: () => void onUpgrade: () => void

View File

@ -1,9 +1,16 @@
<script lang="ts"> <script lang="ts">
import autoAnimate from "@formkit/auto-animate" import autoAnimate from "@formkit/auto-animate"
import Icon from "@iconify/svelte" import Icon from "@iconify/svelte"
import { ExtPackageJson, IconEnum, KunkunExtManifest } from "@kksh/api/models" import {
import { ExtPublishMetadata, ExtPublishSourceTypeEnum } from "@kksh/supabase/models" ExtPackageJson,
import { type Tables } from "@kksh/supabase/types" ExtPublish,
ExtPublishMetadata,
ExtPublishSourceTypeEnum,
IconEnum,
KunkunExtManifest
} from "@kksh/api/models"
// import { ExtPublishMetadata, ExtPublishSourceTypeEnum } from "@kksh/supabase/models"
// import { type Tables } from "@kksh/supabase/types"
import { Badge, Button, ScrollArea, Separator, Tooltip } from "@kksh/svelte5" import { Badge, Button, ScrollArea, Separator, Tooltip } from "@kksh/svelte5"
import { Constants, IconMultiplexer } from "@kksh/ui" import { Constants, IconMultiplexer } from "@kksh/ui"
import { cn } from "@kksh/ui/utils" import { cn } from "@kksh/ui/utils"
@ -36,8 +43,11 @@
loading, loading,
imageDialogOpen = $bindable(false) imageDialogOpen = $bindable(false)
}: { }: {
extPublish: Tables<"ext_publish"> extPublish: ExtPublish
ext: Tables<"extensions"> ext: {
author_id: string
downloads: number
}
author?: { author?: {
id: string id: string
name: string name: string