diff --git a/apps/desktop/src/lib/orm/cmds.ts b/apps/desktop/src/lib/orm/cmds.ts index 3620def..e69de29 100644 --- a/apps/desktop/src/lib/orm/cmds.ts +++ b/apps/desktop/src/lib/orm/cmds.ts @@ -1,355 +0,0 @@ -import * as relations from "@kksh/drizzle/relations" -import * as schema from "@kksh/drizzle/schema" -import { - CmdType, - Ext, - ExtCmd, - ExtData, - SearchMode, - SearchModeEnum, - SQLSortOrder, - SQLSortOrderEnum -} from "@kunkunapi/src/models" -import * as orm from "drizzle-orm" -import type { SelectedFields } from "drizzle-orm/sqlite-core" -import * as v from "valibot" -import { db } from "./database" - -/* -------------------------------------------------------------------------- */ -/* Built-in Extensions */ -/* -------------------------------------------------------------------------- */ - -/* -------------------------------------------------------------------------- */ -/* Extension CRUD */ -/* -------------------------------------------------------------------------- */ -export async function getUniqueExtensionByIdentifier(identifier: string): Promise { - const ext = await db - .select() - .from(schema.extensions) - .where(orm.eq(schema.extensions.identifier, identifier)) - .get() - return v.parse(v.optional(Ext), ext) -} - -/** - * Use this function when you expect the extension to exist. Such as builtin extensions. - * @param identifier - * @returns - */ -export function getExtensionByIdentifierExpectExists(identifier: string): Promise { - return getUniqueExtensionByIdentifier(identifier).then((ext) => { - if (!ext) { - throw new Error(`Unexpexted Error: Extension ${identifier} not found`) - } - return ext - }) -} - -export async function getAllExtensions(): Promise { - const exts = await db.select().from(schema.extensions).all() - return v.parse(v.array(Ext), exts) -} - -/** - * There can be duplicate extensions with the same identifier. Store and Dev extensions can have the same identifier. - * But install path must be unique. - * @param path - */ -export async function getUniqueExtensionByPath(path: string) { - const ext = await db - .select() - .from(schema.extensions) - .where(orm.eq(schema.extensions.path, path)) - .get() - return v.parse(Ext, ext) -} - -export function getAllExtensionsByIdentifier(identifier: string): Promise { - return db - .select() - .from(schema.extensions) - .where(orm.eq(schema.extensions.identifier, identifier)) - .all() - .then((exts) => v.parse(v.array(Ext), exts)) -} - -export function deleteExtensionByPath(path: string): Promise { - return db - .delete(schema.extensions) - .where(orm.eq(schema.extensions.path, path)) - .run() - .then(() => undefined) -} - -export function deleteExtensionByExtId(extId: number): Promise { - return db - .delete(schema.extensions) - .where(orm.eq(schema.extensions.extId, extId)) - .run() - .then(() => undefined) -} - -/* -------------------------------------------------------------------------- */ -/* Extension Command CRUD */ -/* -------------------------------------------------------------------------- */ - -// export async function getExtensionWithCmdsByIdentifier(identifier: string): Promise { -// const ext = await db -// .select({ -// ...schema.extensions, -// commands: relations.commandsRelations -// }) -// .from(schema.extensions) -// .leftJoin(schema.commands, orm.eq(schema.extensions.extId, schema.commands.extId)) -// .where(orm.eq(schema.extensions.identifier, identifier)) -// .get() - -// // return v.parse(v.nullable(ExtWithCmds), ext); -// } - -export async function getCmdById(cmdId: number): Promise { - const cmd = await db - .select() - .from(schema.commands) - .where(orm.eq(schema.commands.cmdId, cmdId)) - .get() - return v.parse(ExtCmd, cmd) -} - -export async function getAllCmds(): Promise { - const cmds = await db.select().from(schema.commands).all() - return v.parse(v.array(ExtCmd), cmds) -} - -export function getCommandsByExtId(extId: number) { - return db - .select() - .from(schema.commands) - .where(orm.eq(schema.commands.extId, extId)) - .all() - .then((cmds) => v.parse(v.array(ExtCmd), cmds)) -} - -export function deleteCmdById(cmdId: number) { - return db - .delete(schema.commands) - .where(orm.eq(schema.commands.cmdId, cmdId)) - .run() - .then(() => undefined) -} - -export function updateCmdByID(data: { - cmdId: number - name: string - cmdType: CmdType - data: string - alias?: string - hotkey?: string - enabled: boolean -}) { - return db - .update(schema.commands) - .set({ - name: data.name, - type: data.cmdType, - data: data.data, - alias: data.alias, // optional - hotkey: data.hotkey, // optional - enabled: data.enabled - // in drizzle schema, use integer({ mode: 'boolean' }) for boolean sqlite - // enabled: data.enabled ? String(data.enabled) : undefined - }) - .where(orm.eq(schema.commands.cmdId, data.cmdId)) - .run() - .then(() => undefined) -} - -/* -------------------------------------------------------------------------- */ -/* Extension Data CRUD */ -/* -------------------------------------------------------------------------- */ -export const ExtDataField = v.union([v.literal("data"), v.literal("search_text")]) -export type ExtDataField = v.InferOutput - -function convertRawExtDataToExtData(rawData?: { - createdAt: string - updatedAt: string - data: null | string - searchText?: null | string - dataId: number - extId: number - dataType: string -}): ExtData | undefined { - if (!rawData) { - return rawData - } - const parsedRes = v.safeParse(ExtData, { - ...rawData, - createdAt: new Date(rawData.createdAt), - updatedAt: new Date(rawData.updatedAt), - data: rawData.data ?? undefined, - searchText: rawData.searchText ?? undefined - }) - if (parsedRes.success) { - return parsedRes.output - } else { - console.error("Extension Data Parse Failure", parsedRes.issues) - throw new Error("Fail to parse extension data") - } -} - -export function createExtensionData(data: { - extId: number - dataType: string - data: string - searchText?: string -}) { - return db.insert(schema.extensionData).values(data).run() -} - -export function getExtensionDataById(dataId: number, fields?: ExtDataField[]) { - const _fields = fields ?? [] - const selectQuery: SelectedFields = { - dataId: schema.extensionData.dataId, - extId: schema.extensionData.extId, - dataType: schema.extensionData.dataType, - metadata: schema.extensionData.metadata, - createdAt: schema.extensionData.createdAt, - updatedAt: schema.extensionData.updatedAt - // data: schema.extensionData.data, - // searchText: schema.extensionData.searchText - } - if (_fields.includes("data")) { - selectQuery["data"] = schema.extensionData.data - } - if (_fields.includes("search_text")) { - selectQuery["searchText"] = schema.extensionData.searchText - } - return db - .select(selectQuery) - .from(schema.extensionData) - .where(orm.eq(schema.extensionData.dataId, dataId)) - .get() - .then((rawData) => { - console.log("Raw Data", rawData) - // @ts-expect-error - rawData is unknown, but will be safe parsed with valibot - return convertRawExtDataToExtData(rawData) - }) -} - -export async function searchExtensionData(searchParams: { - extId: number - searchMode: SearchMode - dataId?: number - dataType?: string - searchText?: string - afterCreatedAt?: string - beforeCreatedAt?: string - limit?: number - offset?: number - orderByCreatedAt?: SQLSortOrder - orderByUpdatedAt?: SQLSortOrder - fields?: ExtDataField[] -}): Promise { - const fields = v.parse(v.optional(v.array(ExtDataField), []), searchParams.fields) - const _fields = fields ?? [] - - // Build the select query based on fields - const selectQuery: SelectedFields = { - dataId: schema.extensionData.dataId, - extId: schema.extensionData.extId, - dataType: schema.extensionData.dataType, - createdAt: schema.extensionData.createdAt, - updatedAt: schema.extensionData.updatedAt - } - - if (_fields.includes("data")) { - selectQuery["data"] = schema.extensionData.data - } - if (_fields.includes("search_text")) { - selectQuery["searchText"] = schema.extensionData.searchText - } - - // Build the query - let baseQuery = db.select(selectQuery).from(schema.extensionData) - - // Add FTS join if needed - if (searchParams.searchMode === SearchModeEnum.FTS && searchParams.searchText) { - // @ts-expect-error - The join type is correct but TypeScript can't infer it properly - baseQuery = baseQuery.innerJoin( - schema.extensionDataFts, - orm.eq(schema.extensionData.dataId, schema.extensionDataFts.dataId) - ) - } - - // Add conditions - const conditions = [orm.eq(schema.extensionData.extId, searchParams.extId)] - - if (searchParams.dataId) { - conditions.push(orm.eq(schema.extensionData.dataId, searchParams.dataId)) - } - - if (searchParams.dataType) { - conditions.push(orm.eq(schema.extensionData.dataType, searchParams.dataType)) - } - - if (searchParams.searchText) { - switch (searchParams.searchMode) { - case SearchModeEnum.ExactMatch: - conditions.push(orm.eq(schema.extensionData.searchText, searchParams.searchText)) - break - case SearchModeEnum.Like: - conditions.push(orm.like(schema.extensionData.searchText, `%${searchParams.searchText}%`)) - break - case SearchModeEnum.FTS: - conditions.push( - orm.sql`${schema.extensionDataFts.searchText} MATCH ${searchParams.searchText}` - ) - break - } - } - - if (searchParams.afterCreatedAt) { - conditions.push(orm.gt(schema.extensionData.createdAt, searchParams.afterCreatedAt)) - } - - if (searchParams.beforeCreatedAt) { - conditions.push(orm.lt(schema.extensionData.createdAt, searchParams.beforeCreatedAt)) - } - - // Build the final query with all conditions and modifiers - const query = baseQuery - .where(orm.and(...conditions)) - .orderBy( - searchParams.orderByCreatedAt - ? searchParams.orderByCreatedAt === SQLSortOrderEnum.Asc - ? orm.asc(schema.extensionData.createdAt) - : orm.desc(schema.extensionData.createdAt) - : searchParams.orderByUpdatedAt - ? searchParams.orderByUpdatedAt === SQLSortOrderEnum.Asc - ? orm.asc(schema.extensionData.updatedAt) - : orm.desc(schema.extensionData.updatedAt) - : orm.asc(schema.extensionData.createdAt) // Default ordering - ) - .limit(searchParams.limit ?? 100) // Default limit - .offset(searchParams.offset ?? 0) // Default offset - - // Execute query and convert results - const results = await query.all() - return results - .map((rawData) => { - // @ts-expect-error - rawData is unknown, but will be safe parsed with valibot - return convertRawExtDataToExtData(rawData) - }) - .filter((item): item is ExtData => item !== undefined) -} - -// export async function getNCommands(n: number): -// export function createExtension(ext: { -// identifier: string -// version: string -// enabled?: boolean -// path?: string -// data?: any -// }) { -// return invoke(generateJarvisPluginCommand("create_extension"), ext) -// } diff --git a/apps/desktop/src/lib/orm/database.ts b/apps/desktop/src/lib/orm/database.ts index e405b7c..031c5d6 100644 --- a/apps/desktop/src/lib/orm/database.ts +++ b/apps/desktop/src/lib/orm/database.ts @@ -1,60 +1,60 @@ -/* eslint-disable @typescript-eslint/no-explicit-any */ -import { db as dbCmd } from "@kksh/api/commands" -import * as schema from "@kksh/drizzle/schema" -import { error } from "@tauri-apps/plugin-log" -import { drizzle } from "drizzle-orm/sqlite-proxy" +// /* eslint-disable @typescript-eslint/no-explicit-any */ +// import { db as dbCmd } from "@kksh/api/commands" +// import * as schema from "@kksh/drizzle/schema" +// import { error } from "@tauri-apps/plugin-log" +// import { drizzle } from "drizzle-orm/sqlite-proxy" -/** - * Loads the sqlite database via the Tauri Proxy. - */ -// export const sqlite = await Database.load("sqlite:test.db"); +// /** +// * Loads the sqlite database via the Tauri Proxy. +// */ +// // export const sqlite = await Database.load("sqlite:test.db"); -/** - * The drizzle database instance. - */ -export const db = drizzle( - async (sql, params, method) => { - let rows: any = [] - let results = [] - console.log({ - sql, - params, - method - }) - console.log(sql) - // If the query is a SELECT, use the select method - if (isSelectQuery(sql)) { - rows = await dbCmd.select(sql, params).catch((e) => { - error("SQL Error:", e) - return [] - }) - } else { - // Otherwise, use the execute method - rows = await dbCmd.execute(sql, params).catch((e) => { - error("SQL Error:", e) - return [] - }) - return { rows: [] } - } +// /** +// * The drizzle database instance. +// */ +// export const db = drizzle( +// async (sql, params, method) => { +// let rows: any = [] +// let results = [] +// console.log({ +// sql, +// params, +// method +// }) +// console.log(sql) +// // If the query is a SELECT, use the select method +// if (isSelectQuery(sql)) { +// rows = await dbCmd.select(sql, params).catch((e) => { +// error("SQL Error:", e) +// return [] +// }) +// } else { +// // Otherwise, use the execute method +// rows = await dbCmd.execute(sql, params).catch((e) => { +// error("SQL Error:", e) +// return [] +// }) +// return { rows: [] } +// } - rows = rows.map((row: any) => { - return Object.values(row) - }) +// rows = rows.map((row: any) => { +// return Object.values(row) +// }) - // If the method is "all", return all rows - results = method === "all" ? rows : rows[0] - return { rows: results } - }, - // Pass the schema to the drizzle instance - { schema: schema, logger: true } -) +// // If the method is "all", return all rows +// results = method === "all" ? rows : rows[0] +// return { rows: results } +// }, +// // Pass the schema to the drizzle instance +// { schema: schema, logger: true } +// ) -/** - * Checks if the given SQL query is a SELECT query. - * @param sql The SQL query to check. - * @returns True if the query is a SELECT query, false otherwise. - */ -function isSelectQuery(sql: string): boolean { - const selectRegex = /^\s*SELECT\b/i - return selectRegex.test(sql) -} +// /** +// * Checks if the given SQL query is a SELECT query. +// * @param sql The SQL query to check. +// * @returns True if the query is a SELECT query, false otherwise. +// */ +// function isSelectQuery(sql: string): boolean { +// const selectRegex = /^\s*SELECT\b/i +// return selectRegex.test(sql) +// } diff --git a/packages/drizzle/package.json b/packages/drizzle/package.json index 65ddc1c..ae2cdab 100644 --- a/packages/drizzle/package.json +++ b/packages/drizzle/package.json @@ -16,8 +16,10 @@ "typescript": "^5" }, "dependencies": { - "@libsql/client": "^0.15.0", + "@kksh/api": "workspace:*", + "@libsql/client": "^0.15.1", + "@tauri-apps/plugin-log": "^2.3.1", "dotenv": "^16.4.7", - "drizzle-orm": "^0.40.1" + "drizzle-orm": "^0.41.0" } } diff --git a/packages/drizzle/src/apis.ts b/packages/drizzle/src/apis.ts new file mode 100644 index 0000000..073b3be --- /dev/null +++ b/packages/drizzle/src/apis.ts @@ -0,0 +1,389 @@ +import * as relations from "@kksh/drizzle/relations" +import * as schema from "../drizzle/schema" +import { + CmdType, + Ext, + ExtCmd, + ExtData, + SearchMode, + SearchModeEnum, + SQLSortOrder, + SQLSortOrderEnum +} from "@kksh/api/models" +import * as orm from "drizzle-orm" +import type { SelectedFields } from "drizzle-orm/sqlite-core" +import * as v from "valibot" +import { db } from "./proxy" + +/* -------------------------------------------------------------------------- */ +/* Built-in Extensions */ +/* -------------------------------------------------------------------------- */ +export function getExtClipboard() { + // return getExtensionByIdentifierExpectExists(KUNKUN_EXT_IDENTIFIER.KUNKUN_CLIPBOARD_EXT_IDENTIFIER) +} +export function getExtQuickLinks() { + // return getExtensionByIdentifierExpectExists( + // KUNKUN_EXT_IDENTIFIER.KUNKUN_QUICK_LINKS_EXT_IDENTIFIER + // ) +} +export function getExtRemote() { + // return getExtensionByIdentifierExpectExists(KUNKUN_EXT_IDENTIFIER.KUNKUN_REMOTE_EXT_IDENTIFIER) +} +export function getExtScriptCmd() { + // return getExtensionByIdentifierExpectExists( + // KUNKUN_EXT_IDENTIFIER.KUNKUN_SCRIPT_CMD_EXT_IDENTIFIER + // ) +} +export function getExtDev() { + // return getExtensionByIdentifierExpectExists(KUNKUN_EXT_IDENTIFIER.KUNKUN_DEV_EXT_IDENTIFIER) +} + +/* -------------------------------------------------------------------------- */ +/* Extension CRUD */ +/* -------------------------------------------------------------------------- */ +export async function getUniqueExtensionByIdentifier(identifier: string): Promise { + const ext = await db + .select() + .from(schema.extensions) + .where(orm.eq(schema.extensions.identifier, identifier)) + .get() + return v.parse(v.optional(Ext), ext) +} + +/** + * Use this function when you expect the extension to exist. Such as builtin extensions. + * @param identifier + * @returns + */ +export function getExtensionByIdentifierExpectExists(identifier: string): Promise { + return getUniqueExtensionByIdentifier(identifier).then((ext) => { + if (!ext) { + throw new Error(`Unexpexted Error: Extension ${identifier} not found`) + } + return ext + }) +} + +export async function getAllExtensions(): Promise { + const exts = await db.select().from(schema.extensions).all() + return v.parse(v.array(Ext), exts) +} + +/** + * There can be duplicate extensions with the same identifier. Store and Dev extensions can have the same identifier. + * But install path must be unique. + * @param path + */ +export async function getUniqueExtensionByPath(path: string) { + const ext = await db + .select() + .from(schema.extensions) + .where(orm.eq(schema.extensions.path, path)) + .get() + return v.parse(Ext, ext) +} + +export function getAllExtensionsByIdentifier(identifier: string): Promise { + return db + .select() + .from(schema.extensions) + .where(orm.eq(schema.extensions.identifier, identifier)) + .all() + .then((exts) => v.parse(v.array(Ext), exts)) +} + +export function deleteExtensionByPath(path: string): Promise { + return db + .delete(schema.extensions) + .where(orm.eq(schema.extensions.path, path)) + .run() + .then(() => undefined) +} + +export function deleteExtensionByExtId(extId: number): Promise { + return db + .delete(schema.extensions) + .where(orm.eq(schema.extensions.extId, extId)) + .run() + .then(() => undefined) +} + +/* -------------------------------------------------------------------------- */ +/* Extension Command CRUD */ +/* -------------------------------------------------------------------------- */ + +// export async function getExtensionWithCmdsByIdentifier(identifier: string): Promise { +// const ext = await db +// .select({ +// ...schema.extensions, +// commands: relations.commandsRelations +// }) +// .from(schema.extensions) +// .leftJoin(schema.commands, orm.eq(schema.extensions.extId, schema.commands.extId)) +// .where(orm.eq(schema.extensions.identifier, identifier)) +// .get() + +// // return v.parse(v.nullable(ExtWithCmds), ext); +// } + +export async function getCmdById(cmdId: number): Promise { + const cmd = await db + .select() + .from(schema.commands) + .where(orm.eq(schema.commands.cmdId, cmdId)) + .get() + return v.parse(ExtCmd, cmd) +} + +export async function getAllCmds(): Promise { + const cmds = await db.select().from(schema.commands).all() + return v.parse(v.array(ExtCmd), cmds) +} + +export function getCommandsByExtId(extId: number) { + return db + .select() + .from(schema.commands) + .where(orm.eq(schema.commands.extId, extId)) + .all() + .then((cmds) => v.parse(v.array(ExtCmd), cmds)) +} + +export function deleteCmdById(cmdId: number) { + return db + .delete(schema.commands) + .where(orm.eq(schema.commands.cmdId, cmdId)) + .run() + .then(() => undefined) +} + +export function updateCmdByID(data: { + cmdId: number + name: string + cmdType: CmdType + data: string + alias?: string + hotkey?: string + enabled: boolean +}) { + return db + .update(schema.commands) + .set({ + name: data.name, + type: data.cmdType, + data: data.data, + alias: data.alias, // optional + hotkey: data.hotkey, // optional + enabled: data.enabled + // in drizzle schema, use integer({ mode: 'boolean' }) for boolean sqlite + // enabled: data.enabled ? String(data.enabled) : undefined + }) + .where(orm.eq(schema.commands.cmdId, data.cmdId)) + .run() + .then(() => undefined) +} + +/* -------------------------------------------------------------------------- */ +/* Extension Data CRUD */ +/* -------------------------------------------------------------------------- */ +export const ExtDataField = v.union([v.literal("data"), v.literal("search_text")]) +export type ExtDataField = v.InferOutput + +function convertRawExtDataToExtData(rawData?: { + createdAt: string + updatedAt: string + data: null | string + searchText?: null | string + dataId: number + extId: number + dataType: string +}): ExtData | undefined { + if (!rawData) { + return rawData + } + const parsedRes = v.safeParse(ExtData, { + ...rawData, + createdAt: new Date(rawData.createdAt), + updatedAt: new Date(rawData.updatedAt), + data: rawData.data ?? undefined, + searchText: rawData.searchText ?? undefined + }) + if (parsedRes.success) { + return parsedRes.output + } else { + console.error("Extension Data Parse Failure", parsedRes.issues) + throw new Error("Fail to parse extension data") + } +} + +export function createExtensionData(data: { + extId: number + dataType: string + data: string + searchText?: string +}) { + return db.insert(schema.extensionData).values(data).run() +} + +export function getExtensionDataById(dataId: number, fields?: ExtDataField[]) { + const _fields = fields ?? [] + const selectQuery: SelectedFields = { + dataId: schema.extensionData.dataId, + extId: schema.extensionData.extId, + dataType: schema.extensionData.dataType, + metadata: schema.extensionData.metadata, + createdAt: schema.extensionData.createdAt, + updatedAt: schema.extensionData.updatedAt + // data: schema.extensionData.data, + // searchText: schema.extensionData.searchText + } + if (_fields.includes("data")) { + selectQuery["data"] = schema.extensionData.data + } + if (_fields.includes("search_text")) { + selectQuery["searchText"] = schema.extensionData.searchText + } + return db + .select(selectQuery) + .from(schema.extensionData) + .where(orm.eq(schema.extensionData.dataId, dataId)) + .get() + .then((rawData) => { + console.log("Raw Data", rawData) + // @ts-expect-error - rawData is unknown, but will be safe parsed with valibot + return convertRawExtDataToExtData(rawData) + }) +} + +export async function searchExtensionData(searchParams: { + extId: number + searchMode: SearchMode + dataId?: number + dataType?: string + searchText?: string + afterCreatedAt?: string + beforeCreatedAt?: string + limit?: number + offset?: number + orderByCreatedAt?: SQLSortOrder + orderByUpdatedAt?: SQLSortOrder + fields?: ExtDataField[] +}): Promise { + const fields = v.parse(v.optional(v.array(ExtDataField), []), searchParams.fields) + const _fields = fields ?? [] + + // Build the select query based on fields + const selectQuery: SelectedFields = { + dataId: schema.extensionData.dataId, + extId: schema.extensionData.extId, + dataType: schema.extensionData.dataType, + createdAt: schema.extensionData.createdAt, + updatedAt: schema.extensionData.updatedAt + } + + if (_fields.includes("data")) { + selectQuery["data"] = schema.extensionData.data + } + if (_fields.includes("search_text")) { + selectQuery["searchText"] = schema.extensionData.searchText + } + + // Build the query + let baseQuery = db.select(selectQuery).from(schema.extensionData) + + // Add FTS join if needed + if (searchParams.searchMode === SearchModeEnum.FTS && searchParams.searchText) { + // @ts-expect-error - The join type is correct but TypeScript can't infer it properly + baseQuery = baseQuery.innerJoin( + schema.extensionDataFts, + orm.eq(schema.extensionData.dataId, schema.extensionDataFts.dataId) + ) + } + + // Add conditions + const conditions = [orm.eq(schema.extensionData.extId, searchParams.extId)] + + if (searchParams.dataId) { + conditions.push(orm.eq(schema.extensionData.dataId, searchParams.dataId)) + } + + if (searchParams.dataType) { + conditions.push(orm.eq(schema.extensionData.dataType, searchParams.dataType)) + } + + if (searchParams.searchText) { + switch (searchParams.searchMode) { + case SearchModeEnum.ExactMatch: + conditions.push(orm.eq(schema.extensionData.searchText, searchParams.searchText)) + break + case SearchModeEnum.Like: + conditions.push(orm.like(schema.extensionData.searchText, `%${searchParams.searchText}%`)) + break + case SearchModeEnum.FTS: + conditions.push( + orm.sql`${schema.extensionDataFts.searchText} MATCH ${searchParams.searchText}` + ) + break + } + } + + if (searchParams.afterCreatedAt) { + conditions.push(orm.gt(schema.extensionData.createdAt, searchParams.afterCreatedAt)) + } + + if (searchParams.beforeCreatedAt) { + conditions.push(orm.lt(schema.extensionData.createdAt, searchParams.beforeCreatedAt)) + } + + // Build the final query with all conditions and modifiers + const query = baseQuery + .where(orm.and(...conditions)) + .orderBy( + searchParams.orderByCreatedAt + ? searchParams.orderByCreatedAt === SQLSortOrderEnum.Asc + ? orm.asc(schema.extensionData.createdAt) + : orm.desc(schema.extensionData.createdAt) + : searchParams.orderByUpdatedAt + ? searchParams.orderByUpdatedAt === SQLSortOrderEnum.Asc + ? orm.asc(schema.extensionData.updatedAt) + : orm.desc(schema.extensionData.updatedAt) + : orm.asc(schema.extensionData.createdAt) // Default ordering + ) + .limit(searchParams.limit ?? 100) // Default limit + .offset(searchParams.offset ?? 0) // Default offset + + // Execute query and convert results + const results = await query.all() + return results + .map((rawData) => { + // @ts-expect-error - rawData is unknown, but will be safe parsed with valibot + return convertRawExtDataToExtData(rawData) + }) + .filter((item): item is ExtData => item !== undefined) +} + + +export function deleteExtensionDataById(dataId: number) { + + // return invoke(generateJarvisPluginCommand("delete_extension_data_by_id"), { dataId }) +} + +export function updateExtensionDataById(data: { + dataId: number + data: string + searchText?: string +}) { + // return invoke(generateJarvisPluginCommand("update_extension_data_by_id"), data) +} + + +// export async function getNCommands(n: number): +// export function createExtension(ext: { +// identifier: string +// version: string +// enabled?: boolean +// path?: string +// data?: any +// }) { +// return invoke(generateJarvisPluginCommand("create_extension"), ext) +// } diff --git a/packages/drizzle/src/proxy.ts b/packages/drizzle/src/proxy.ts new file mode 100644 index 0000000..e17687d --- /dev/null +++ b/packages/drizzle/src/proxy.ts @@ -0,0 +1,60 @@ +/* eslint-disable @typescript-eslint/no-explicit-any */ +import { db as dbCmd } from "@kksh/api/commands" +import * as schema from "../drizzle/schema" +import { error } from "@tauri-apps/plugin-log" +import { drizzle } from "drizzle-orm/sqlite-proxy" + +/** + * Loads the sqlite database via the Tauri Proxy. + */ +// export const sqlite = await Database.load("sqlite:test.db"); + +/** + * The drizzle database instance. + */ +export const db = drizzle( + async (sql, params, method) => { + let rows: any = [] + let results = [] + console.log({ + sql, + params, + method + }) + console.log(sql) + // If the query is a SELECT, use the select method + if (isSelectQuery(sql)) { + rows = await dbCmd.select(sql, params).catch((e) => { + error("SQL Error:", e) + return [] + }) + } else { + // Otherwise, use the execute method + rows = await dbCmd.execute(sql, params).catch((e) => { + error("SQL Error:", e) + return [] + }) + return { rows: [] } + } + + rows = rows.map((row: any) => { + return Object.values(row) + }) + + // If the method is "all", return all rows + results = method === "all" ? rows : rows[0] + return { rows: results } + }, + // Pass the schema to the drizzle instance + { schema: schema, logger: true } +) + +/** + * Checks if the given SQL query is a SELECT query. + * @param sql The SQL query to check. + * @returns True if the query is a SELECT query, false otherwise. + */ +function isSelectQuery(sql: string): boolean { + const selectRegex = /^\s*SELECT\b/i + return selectRegex.test(sql) +} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index d1cea59..5e7edcc 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -150,7 +150,7 @@ importers: devDependencies: '@types/bun': specifier: latest - version: 1.2.6 + version: 1.2.8 '@types/debug': specifier: ^4.1.12 version: 4.1.12 @@ -190,7 +190,7 @@ importers: devDependencies: '@types/bun': specifier: latest - version: 1.2.6 + version: 1.2.8 '@types/fs-extra': specifier: ^11.0.4 version: 11.0.4 @@ -256,7 +256,7 @@ importers: version: 3.2.4 drizzle-orm: specifier: ^0.40.1 - version: 0.40.1(@libsql/client@0.15.0)(bun-types@1.2.6)(gel@2.0.1) + version: 0.40.1(@libsql/client@0.15.1)(bun-types@1.2.7)(gel@2.0.1) eslint: specifier: ^9.21.0 version: 9.21.0(jiti@2.4.0) @@ -338,7 +338,7 @@ importers: version: 2.3.1 '@types/bun': specifier: latest - version: 1.2.6 + version: 1.2.8 '@types/semver': specifier: ^7.5.8 version: 7.5.8 @@ -489,7 +489,7 @@ importers: devDependencies: '@types/bun': specifier: latest - version: 1.2.6 + version: 1.2.8 '@types/lodash': specifier: ^4.17.14 version: 4.17.14 @@ -529,7 +529,7 @@ importers: version: link:../typescript-config '@types/bun': specifier: latest - version: 1.2.6 + version: 1.2.8 packages/config-eslint: dependencies: @@ -551,22 +551,28 @@ importers: packages/drizzle: dependencies: + '@kksh/api': + specifier: workspace:* + version: link:../api '@libsql/client': - specifier: ^0.15.0 - version: 0.15.0 + specifier: ^0.15.1 + version: 0.15.1 + '@tauri-apps/plugin-log': + specifier: ^2.3.1 + version: 2.3.1 dotenv: specifier: ^16.4.7 version: 16.4.7 drizzle-orm: - specifier: ^0.40.1 - version: 0.40.1(@libsql/client@0.15.0)(bun-types@1.2.6)(gel@2.0.1) + specifier: ^0.41.0 + version: 0.41.0(@libsql/client@0.15.1)(bun-types@1.2.7)(gel@2.0.1) typescript: specifier: ^5 version: 5.7.3 devDependencies: '@types/bun': specifier: latest - version: 1.2.6 + version: 1.2.8 drizzle-kit: specifier: ^0.30.5 version: 0.30.5 @@ -597,7 +603,7 @@ importers: devDependencies: '@types/bun': specifier: latest - version: 1.2.6 + version: 1.2.8 '@types/semver': specifier: ^7.5.8 version: 7.5.8 @@ -628,7 +634,7 @@ importers: version: 11.1.6(rollup@4.34.2)(tslib@2.8.1)(typescript@5.7.3) '@types/bun': specifier: latest - version: 1.2.6 + version: 1.2.8 rollup-plugin-visualizer: specifier: ^5.12.0 version: 5.12.0(rollup@4.34.2) @@ -735,7 +741,7 @@ importers: devDependencies: '@types/bun': specifier: latest - version: 1.2.6 + version: 1.2.8 packages/grpc: dependencies: @@ -754,7 +760,7 @@ importers: version: 0.7.13 '@types/bun': specifier: latest - version: 1.2.6 + version: 1.2.8 '@types/google-protobuf': specifier: ^3.15.12 version: 3.15.12 @@ -782,7 +788,7 @@ importers: devDependencies: '@types/bun': specifier: latest - version: 1.2.6 + version: 1.2.8 verify-package-export: specifier: ^0.0.3 version: 0.0.3(typescript@5.7.3) @@ -807,7 +813,7 @@ importers: version: 2.48.0 '@types/bun': specifier: latest - version: 1.2.6 + version: 1.2.8 '@valibot/to-json-schema': specifier: 1.0.0 version: 1.0.0(valibot@1.0.0(typescript@5.7.3)) @@ -820,7 +826,7 @@ importers: devDependencies: '@types/bun': specifier: latest - version: 1.2.6 + version: 1.2.8 packages/tauri-plugins/jarvis: dependencies: @@ -836,7 +842,7 @@ importers: version: 2.48.0 '@types/bun': specifier: latest - version: 1.2.6 + version: 1.2.8 packages/templates/template-ext-headless: dependencies: @@ -855,7 +861,7 @@ importers: devDependencies: '@types/bun': specifier: latest - version: 1.2.6 + version: 1.2.8 packages/templates/template-ext-next: dependencies: @@ -919,7 +925,7 @@ importers: version: 6.12.1(magicast@0.3.5)(rollup@4.34.2) nuxt: specifier: ^3.12.4 - version: 3.14.159(@libsql/client@0.15.0)(@parcel/watcher@2.5.0)(@types/node@22.13.1)(drizzle-orm@0.40.1(@libsql/client@0.15.0)(bun-types@1.2.6)(gel@2.0.1))(eslint@9.21.0(jiti@2.4.0))(ioredis@5.4.1)(magicast@0.3.5)(optionator@0.9.4)(rollup@4.34.2)(terser@5.36.0)(typescript@5.6.3)(vite@5.4.11(@types/node@22.13.1)(terser@5.36.0))(vue-tsc@2.1.10(typescript@5.6.3)) + version: 3.14.159(@libsql/client@0.15.1)(@parcel/watcher@2.5.0)(@types/node@22.13.1)(drizzle-orm@0.41.0(@libsql/client@0.15.1)(bun-types@1.2.7)(gel@2.0.1))(eslint@9.21.0(jiti@2.4.0))(ioredis@5.4.1)(magicast@0.3.5)(optionator@0.9.4)(rollup@4.34.2)(terser@5.36.0)(typescript@5.6.3)(vite@5.4.11(@types/node@22.13.1)(terser@5.36.0))(vue-tsc@2.1.10(typescript@5.6.3)) tailwindcss: specifier: ^3.4.7 version: 3.4.15 @@ -1207,7 +1213,7 @@ importers: devDependencies: '@types/bun': specifier: latest - version: 1.2.6 + version: 1.2.8 packages/types: dependencies: @@ -1217,7 +1223,7 @@ importers: devDependencies: '@types/bun': specifier: latest - version: 1.2.6 + version: 1.2.8 packages/typescript-config: {} @@ -1313,7 +1319,7 @@ importers: version: 0.1.15(lucide-svelte@0.471.0(svelte@5.20.5))(svelte-sonner@0.3.28(svelte@5.20.5))(svelte@5.20.5)(sveltekit-superforms@2.22.1(@sveltejs/kit@2.17.3(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.20.5)(vite@6.2.0(@types/node@22.13.1)(jiti@2.4.0)(terser@5.36.0)(tsx@4.19.3)(yaml@2.6.1)))(svelte@5.20.5)(vite@6.2.0(@types/node@22.13.1)(jiti@2.4.0)(terser@5.36.0)(tsx@4.19.3)(yaml@2.6.1)))(@types/json-schema@7.0.15)(svelte@5.20.5)(typescript@5.7.3))(typescript@5.7.3) '@types/bun': specifier: latest - version: 1.2.6 + version: 1.2.8 '@typescript-eslint/eslint-plugin': specifier: ^8.20.0 version: 8.20.0(@typescript-eslint/parser@8.20.0(eslint@9.21.0(jiti@2.4.0))(typescript@5.7.3))(eslint@9.21.0(jiti@2.4.0))(typescript@5.7.3) @@ -1395,7 +1401,7 @@ importers: devDependencies: '@types/bun': specifier: latest - version: 1.2.6 + version: 1.2.8 vendors/tauri-plugin-keyring: dependencies: @@ -3340,19 +3346,19 @@ packages: '@kwsites/promise-deferred@1.1.1': resolution: {integrity: sha512-GaHYm+c0O9MjZRu0ongGBRbinu8gVAMd2UZjji6jVmqKtZluZnptXGWhz1E8j8D2HJ3f/yMxKAUC0b+57wncIw==} - '@libsql/client@0.15.0': - resolution: {integrity: sha512-AkJg9mxnAVCtHAVndZ8YwxqG43nSYVNZHAEX55MZ0R06rBcCoYLwjAr8grxC02/tNZpf4KMJj+BVPqNnQOD8ZQ==} + '@libsql/client@0.15.1': + resolution: {integrity: sha512-BzAj/nEoiH8FhOrFCrN9NFll97iMbTUQA/RfZbc+Na/Iyu9w/vt1+0zLf7OaQCTeQ+7g5ScanLuRMidTcz9XgQ==} - '@libsql/core@0.15.0': - resolution: {integrity: sha512-8SReMzkCPmqoDl1tkAa9FCmoxDmiiuDM2eM8cTlKnMD6xG2jUczvckYM/x7VCWy0O9zu0LR/u7sEYEd2CPPTJA==} + '@libsql/core@0.15.1': + resolution: {integrity: sha512-7RDXHxD+H1UTBG67mCVEjTmbJfcEo0bFFyb4wFaGWYrrKAkDcYq7BhG67lTqd4EHSzUV7Ur/lk6f/EBMplm+Kg==} - '@libsql/darwin-arm64@0.5.1': - resolution: {integrity: sha512-ETWRV8+h2l1P4/BB+ct1yWoBJMokUfCLe8W7TEbGo/9mAqk4NWkacVlAJgRdVIFQsA+3/vrQF7LyaIQOSEELTg==} + '@libsql/darwin-arm64@0.5.3': + resolution: {integrity: sha512-yAitxSuiaLT465uAvqXi1TzirXb+IOxa6sfC+uIuyCzAusLEhOFlEhutqenVx93lhPkJZJIiZkK1pIETIatnfg==} cpu: [arm64] os: [darwin] - '@libsql/darwin-x64@0.5.1': - resolution: {integrity: sha512-zB1Sid7vTBt/PiiLyQmw9AXZZv3MziNRx/rJ6xc/HTUYG7c2QHwOMikVuad1Lafvvf3OyGYSAPHKg9hdvNFP9A==} + '@libsql/darwin-x64@0.5.3': + resolution: {integrity: sha512-ZBVinaZcCxVoTuCTdW7vY97XIc13RjCEFG16Ix+zemtJbGFCTos7EUhkGWuWIWG/1HXYpFbXu4d5d7p6p4TlQA==} cpu: [x64] os: [darwin] @@ -3366,28 +3372,28 @@ packages: '@libsql/isomorphic-ws@0.1.5': resolution: {integrity: sha512-DtLWIH29onUYR00i0GlQ3UdcTRC6EP4u9w/h9LxpUZJWRMARk6dQwZ6Jkd+QdwVpuAOrdxt18v0K2uIYR3fwFg==} - '@libsql/linux-arm64-gnu@0.5.1': - resolution: {integrity: sha512-RbDc3fcRH5gjg2UUsMTPncSMCqTZ6re59t4jhNFpaLb3n2raD8S3XfvMq9LFqirzK+JDKHhxRPTow0E+QLaLJQ==} + '@libsql/linux-arm64-gnu@0.5.3': + resolution: {integrity: sha512-20qUC4O16qhGl1GPIBABgroytzLoML5hhVYrM5jaYhRHg2kFN9PytKV+M75vlyLiJk7CJwkRUxD4Xwo4OODRVg==} cpu: [arm64] os: [linux] - '@libsql/linux-arm64-musl@0.5.1': - resolution: {integrity: sha512-JwK6Ne8dmtt+D+0zESwKvrjnylSDHNN7Mt9gb+TbWZZVvmro8n/ApvRVJh8ZO3R7dH32rUJoc2cQmKD6B691sA==} + '@libsql/linux-arm64-musl@0.5.3': + resolution: {integrity: sha512-sv19UXkNo+J6lGSfv4tKjViqciU5MHdtcmaiyJ5BcsEouwDLp5gDbyr1iJHoQw+nWpsiNp1OO4x8JoqC6sZHkA==} cpu: [arm64] os: [linux] - '@libsql/linux-x64-gnu@0.5.1': - resolution: {integrity: sha512-9U1yo0H8OaxGsVPQFDm/SrQjhyMFUHinmfPOwQcLjcnWwv1GqfNdYlGnp2ZfdJr2QOx7k5klouJjJgy8KzhY4g==} + '@libsql/linux-x64-gnu@0.5.3': + resolution: {integrity: sha512-fE/tkqGneXfMzQ5TY7ptoQXk8bRVGu6fVSmPiegCqmCcF457uO/7yqpQZyMav4viXAgmIkI15nyEo01ekaeBCg==} cpu: [x64] os: [linux] - '@libsql/linux-x64-musl@0.5.1': - resolution: {integrity: sha512-2TEX6SJqi88wPbv1ZHiTHtqaWOf+Mj7L8jOSgQY/aMoPzV5VFtDFF68ApIUNR6L+4eMwlD28NpahwJf8ilWYIw==} + '@libsql/linux-x64-musl@0.5.3': + resolution: {integrity: sha512-g/JIAmLJcsmhubfDtw5K4ipVx89Kr7V1cuoTFc/jDtBQNpfLVDOtNii3TTxvLg/yH+HRipE5Cus8hJdtysJXcw==} cpu: [x64] os: [linux] - '@libsql/win32-x64-msvc@0.5.1': - resolution: {integrity: sha512-rOtBBJhLuCeSgXBWIRNTLADdSLfwsII6za/ci5+XJKSiSi0STO4bcGEfVKLEJ6HDqdCJ2zdH1WGc9rTwhsUB0g==} + '@libsql/win32-x64-msvc@0.5.3': + resolution: {integrity: sha512-X7apIBRZNSSRh446NvUfq7AthUdH2OSLAAkzhOW48wCQxYheXU791WyOiroNl7s5HuIvJGAJUCR9hFLICYgWRg==} cpu: [x64] os: [win32] @@ -5625,6 +5631,9 @@ packages: '@tauri-apps/plugin-log@2.2.3': resolution: {integrity: sha512-noDkZXU0kPG1bP3qoF6om+q5TgQ65LWpsV/TnfrHyg2lEn0vE+WJWTItiIh7OUA1/xxC+hdb9ODy2bM2e+jHEw==} + '@tauri-apps/plugin-log@2.3.1': + resolution: {integrity: sha512-nnKGHENWt7teqvUlIKxd6bp2wCUrrLvCvajN6CWbyrHBNKPi/pyKELzD511siEMDEdndbiZ/GEhiK0xBtZopRg==} + '@tauri-apps/plugin-notification@2.0.0': resolution: {integrity: sha512-6qEDYJS7mgXZWLXA0EFL+DVCJh8sJlzSoyw6B50pxhLPVFjc5Vr5DVzl5W3mUHaYhod5wsC984eQnlCCGqxYDA==} @@ -5717,8 +5726,8 @@ packages: '@types/btoa-lite@1.0.2': resolution: {integrity: sha512-ZYbcE2x7yrvNFJiU7xJGrpF/ihpkM7zKgw8bha3LNJSesvTtUNxbpzaT7WXBIryf6jovisrxTBvymxMeLLj1Mg==} - '@types/bun@1.2.6': - resolution: {integrity: sha512-fY9CAmTdJH1Llx7rugB0FpgWK2RKuHCs3g2cFDYXUutIy1QGiPQxKkGY8owhfZ4MXWNfxwIbQLChgH5gDsY7vw==} + '@types/bun@1.2.8': + resolution: {integrity: sha512-t8L1RvJVUghW5V+M/fL3Thbxcs0HwNsXsnTEBEfEVqGteiJToOlZ/fyOEaR1kZsNqnu+3XA4RI/qmnX4w6+S+w==} '@types/cookie@0.6.0': resolution: {integrity: sha512-4Kh9a6B2bQciAhf7FSuMRRkUWecJgJu9nPnx3yzpsfXX/c50REIqpHY4C82bXP90qrLtXtkDxTZosYO3UpOwlA==} @@ -6784,8 +6793,8 @@ packages: buffer@6.0.3: resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==} - bun-types@1.2.6: - resolution: {integrity: sha512-FbCKyr5KDiPULUzN/nm5oqQs9nXCHD8dVc64BArxJadCvbNzAI6lUWGh9fSJZWeDIRD38ikceBU8Kj/Uh+53oQ==} + bun-types@1.2.7: + resolution: {integrity: sha512-P4hHhk7kjF99acXqKvltyuMQ2kf/rzIw3ylEDpCxDS9Xa0X0Yp/gJu/vDCucmWpiur5qJ0lwB2bWzOXa2GlHqA==} bundle-name@4.1.0: resolution: {integrity: sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q==} @@ -7787,6 +7796,95 @@ packages: sqlite3: optional: true + drizzle-orm@0.41.0: + resolution: {integrity: sha512-7A4ZxhHk9gdlXmTdPj/lREtP+3u8KvZ4yEN6MYVxBzZGex5Wtdc+CWSbu7btgF6TB0N+MNPrvW7RKBbxJchs/Q==} + peerDependencies: + '@aws-sdk/client-rds-data': '>=3' + '@cloudflare/workers-types': '>=4' + '@electric-sql/pglite': '>=0.2.0' + '@libsql/client': '>=0.10.0' + '@libsql/client-wasm': '>=0.10.0' + '@neondatabase/serverless': '>=0.10.0' + '@op-engineering/op-sqlite': '>=2' + '@opentelemetry/api': ^1.4.1 + '@planetscale/database': '>=1' + '@prisma/client': '*' + '@tidbcloud/serverless': '*' + '@types/better-sqlite3': '*' + '@types/pg': '*' + '@types/sql.js': '*' + '@vercel/postgres': '>=0.8.0' + '@xata.io/client': '*' + better-sqlite3: '>=7' + bun-types: '*' + expo-sqlite: '>=14.0.0' + gel: '>=2' + knex: '*' + kysely: '*' + mysql2: '>=2' + pg: '>=8' + postgres: '>=3' + prisma: '*' + sql.js: '>=1' + sqlite3: '>=5' + peerDependenciesMeta: + '@aws-sdk/client-rds-data': + optional: true + '@cloudflare/workers-types': + optional: true + '@electric-sql/pglite': + optional: true + '@libsql/client': + optional: true + '@libsql/client-wasm': + optional: true + '@neondatabase/serverless': + optional: true + '@op-engineering/op-sqlite': + optional: true + '@opentelemetry/api': + optional: true + '@planetscale/database': + optional: true + '@prisma/client': + optional: true + '@tidbcloud/serverless': + optional: true + '@types/better-sqlite3': + optional: true + '@types/pg': + optional: true + '@types/sql.js': + optional: true + '@vercel/postgres': + optional: true + '@xata.io/client': + optional: true + better-sqlite3: + optional: true + bun-types: + optional: true + expo-sqlite: + optional: true + gel: + optional: true + knex: + optional: true + kysely: + optional: true + mysql2: + optional: true + pg: + optional: true + postgres: + optional: true + prisma: + optional: true + sql.js: + optional: true + sqlite3: + optional: true + duplexer@0.1.2: resolution: {integrity: sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==} @@ -9349,8 +9447,9 @@ packages: libphonenumber-js@1.11.12: resolution: {integrity: sha512-QkJn9/D7zZ1ucvT++TQSvZuSA2xAWeUytU+DiEQwbPKLyrDpvbul2AFs1CGbRAPpSCCk47aRAb5DX5mmcayp4g==} - libsql@0.5.1: - resolution: {integrity: sha512-ePnm5zj6T//GKiTY/v5b0a272NX73hqdRORmD8gzz1nUui9051dtTt6t0XCrIqxwJAHSmQiZcfAx3YSASn9Y+A==} + libsql@0.5.3: + resolution: {integrity: sha512-S3WR8WNCJV1VXraBFUKjDA6+8LcNDJMLm+83qohm1O3YM1iVqV2+/XN3SXOxpxVjuL4g/rLrjO5kzygkPefCFQ==} + cpu: [x64, arm64, wasm32] os: [darwin, linux, win32] lilconfig@2.1.0: @@ -15406,25 +15505,25 @@ snapshots: '@kwsites/promise-deferred@1.1.1': {} - '@libsql/client@0.15.0': + '@libsql/client@0.15.1': dependencies: - '@libsql/core': 0.15.0 + '@libsql/core': 0.15.1 '@libsql/hrana-client': 0.7.0 js-base64: 3.7.7 - libsql: 0.5.1 + libsql: 0.5.3 promise-limit: 2.7.0 transitivePeerDependencies: - bufferutil - utf-8-validate - '@libsql/core@0.15.0': + '@libsql/core@0.15.1': dependencies: js-base64: 3.7.7 - '@libsql/darwin-arm64@0.5.1': + '@libsql/darwin-arm64@0.5.3': optional: true - '@libsql/darwin-x64@0.5.1': + '@libsql/darwin-x64@0.5.3': optional: true '@libsql/hrana-client@0.7.0': @@ -15447,19 +15546,19 @@ snapshots: - bufferutil - utf-8-validate - '@libsql/linux-arm64-gnu@0.5.1': + '@libsql/linux-arm64-gnu@0.5.3': optional: true - '@libsql/linux-arm64-musl@0.5.1': + '@libsql/linux-arm64-musl@0.5.3': optional: true - '@libsql/linux-x64-gnu@0.5.1': + '@libsql/linux-x64-gnu@0.5.3': optional: true - '@libsql/linux-x64-musl@0.5.1': + '@libsql/linux-x64-musl@0.5.3': optional: true - '@libsql/win32-x64-msvc@0.5.1': + '@libsql/win32-x64-msvc@0.5.3': optional: true '@liuli-util/fs-extra@0.1.0': @@ -18080,6 +18179,10 @@ snapshots: dependencies: '@tauri-apps/api': 2.3.0 + '@tauri-apps/plugin-log@2.3.1': + dependencies: + '@tauri-apps/api': 2.3.0 + '@tauri-apps/plugin-notification@2.0.0': dependencies: '@tauri-apps/api': 2.3.0 @@ -18192,9 +18295,9 @@ snapshots: '@types/btoa-lite@1.0.2': {} - '@types/bun@1.2.6': + '@types/bun@1.2.8': dependencies: - bun-types: 1.2.6 + bun-types: 1.2.7 '@types/cookie@0.6.0': {} @@ -19736,7 +19839,7 @@ snapshots: base64-js: 1.5.1 ieee754: 1.2.1 - bun-types@1.2.6: + bun-types@1.2.7: dependencies: '@types/node': 22.13.1 '@types/ws': 8.5.14 @@ -20371,10 +20474,10 @@ snapshots: dayjs@1.11.13: optional: true - db0@0.2.1(@libsql/client@0.15.0)(drizzle-orm@0.40.1(@libsql/client@0.15.0)(bun-types@1.2.6)(gel@2.0.1)): + db0@0.2.1(@libsql/client@0.15.1)(drizzle-orm@0.41.0(@libsql/client@0.15.1)(bun-types@1.2.7)(gel@2.0.1)): optionalDependencies: - '@libsql/client': 0.15.0 - drizzle-orm: 0.40.1(@libsql/client@0.15.0)(bun-types@1.2.6)(gel@2.0.1) + '@libsql/client': 0.15.1 + drizzle-orm: 0.41.0(@libsql/client@0.15.1)(bun-types@1.2.7)(gel@2.0.1) de-indent@1.0.2: {} @@ -20631,10 +20734,16 @@ snapshots: transitivePeerDependencies: - supports-color - drizzle-orm@0.40.1(@libsql/client@0.15.0)(bun-types@1.2.6)(gel@2.0.1): + drizzle-orm@0.40.1(@libsql/client@0.15.1)(bun-types@1.2.7)(gel@2.0.1): optionalDependencies: - '@libsql/client': 0.15.0 - bun-types: 1.2.6 + '@libsql/client': 0.15.1 + bun-types: 1.2.7 + gel: 2.0.1 + + drizzle-orm@0.41.0(@libsql/client@0.15.1)(bun-types@1.2.7)(gel@2.0.1): + optionalDependencies: + '@libsql/client': 0.15.1 + bun-types: 1.2.7 gel: 2.0.1 duplexer@0.1.2: {} @@ -22730,18 +22839,18 @@ snapshots: libphonenumber-js@1.11.12: optional: true - libsql@0.5.1: + libsql@0.5.3: dependencies: '@neon-rs/load': 0.0.4 detect-libc: 2.0.2 optionalDependencies: - '@libsql/darwin-arm64': 0.5.1 - '@libsql/darwin-x64': 0.5.1 - '@libsql/linux-arm64-gnu': 0.5.1 - '@libsql/linux-arm64-musl': 0.5.1 - '@libsql/linux-x64-gnu': 0.5.1 - '@libsql/linux-x64-musl': 0.5.1 - '@libsql/win32-x64-msvc': 0.5.1 + '@libsql/darwin-arm64': 0.5.3 + '@libsql/darwin-x64': 0.5.3 + '@libsql/linux-arm64-gnu': 0.5.3 + '@libsql/linux-arm64-musl': 0.5.3 + '@libsql/linux-x64-gnu': 0.5.3 + '@libsql/linux-x64-musl': 0.5.3 + '@libsql/win32-x64-msvc': 0.5.3 lilconfig@2.1.0: {} @@ -23466,7 +23575,7 @@ snapshots: - '@babel/core' - babel-plugin-macros - nitropack@2.10.4(@libsql/client@0.15.0)(drizzle-orm@0.40.1(@libsql/client@0.15.0)(bun-types@1.2.6)(gel@2.0.1))(typescript@5.6.3): + nitropack@2.10.4(@libsql/client@0.15.1)(drizzle-orm@0.41.0(@libsql/client@0.15.1)(bun-types@1.2.7)(gel@2.0.1))(typescript@5.6.3): dependencies: '@cloudflare/kv-asset-handler': 0.3.4 '@netlify/functions': 2.8.2 @@ -23490,7 +23599,7 @@ snapshots: cookie-es: 1.2.2 croner: 9.0.0 crossws: 0.3.1 - db0: 0.2.1(@libsql/client@0.15.0)(drizzle-orm@0.40.1(@libsql/client@0.15.0)(bun-types@1.2.6)(gel@2.0.1)) + db0: 0.2.1(@libsql/client@0.15.1)(drizzle-orm@0.41.0(@libsql/client@0.15.1)(bun-types@1.2.7)(gel@2.0.1)) defu: 6.1.4 destr: 2.0.3 dot-prop: 9.0.0 @@ -23627,7 +23736,7 @@ snapshots: nuxi@3.15.0: {} - nuxt@3.14.159(@libsql/client@0.15.0)(@parcel/watcher@2.5.0)(@types/node@22.13.1)(drizzle-orm@0.40.1(@libsql/client@0.15.0)(bun-types@1.2.6)(gel@2.0.1))(eslint@9.21.0(jiti@2.4.0))(ioredis@5.4.1)(magicast@0.3.5)(optionator@0.9.4)(rollup@4.34.2)(terser@5.36.0)(typescript@5.6.3)(vite@5.4.11(@types/node@22.13.1)(terser@5.36.0))(vue-tsc@2.1.10(typescript@5.6.3)): + nuxt@3.14.159(@libsql/client@0.15.1)(@parcel/watcher@2.5.0)(@types/node@22.13.1)(drizzle-orm@0.41.0(@libsql/client@0.15.1)(bun-types@1.2.7)(gel@2.0.1))(eslint@9.21.0(jiti@2.4.0))(ioredis@5.4.1)(magicast@0.3.5)(optionator@0.9.4)(rollup@4.34.2)(terser@5.36.0)(typescript@5.6.3)(vite@5.4.11(@types/node@22.13.1)(terser@5.36.0))(vue-tsc@2.1.10(typescript@5.6.3)): dependencies: '@nuxt/devalue': 2.0.2 '@nuxt/devtools': 1.6.0(rollup@4.34.2)(vite@5.4.11(@types/node@22.13.1)(terser@5.36.0))(vue@3.5.13(typescript@5.6.3)) @@ -23664,7 +23773,7 @@ snapshots: magic-string: 0.30.12 mlly: 1.7.3 nanotar: 0.1.1 - nitropack: 2.10.4(@libsql/client@0.15.0)(drizzle-orm@0.40.1(@libsql/client@0.15.0)(bun-types@1.2.6)(gel@2.0.1))(typescript@5.6.3) + nitropack: 2.10.4(@libsql/client@0.15.1)(drizzle-orm@0.41.0(@libsql/client@0.15.1)(bun-types@1.2.7)(gel@2.0.1))(typescript@5.6.3) nuxi: 3.15.0 nypm: 0.3.12 ofetch: 1.4.1