From e9e814b23f0fdb326fb48998101bfac5e8e1ec3f Mon Sep 17 00:00:00 2001
From: Huakun Shen <huakun.shen@huakunshen.com>
Date: Thu, 3 Apr 2025 10:56:35 -0400
Subject: [PATCH] Update drizzle-orm to version 0.41.0 and implement clipboard
 cleanup functionality

- Updated drizzle-orm dependency in package.json and pnpm-lock.yaml to version 0.41.0.
- Added a new utility function `cleanClipboard` to remove clipboard entries older than 10 days.
- Integrated clipboard cleanup into the initialization process, logging success or failure.
- Refactored drizzle exports to include `proxyDB` for better access to the database proxy.
- Minor cleanup in the proxy.ts file to remove commented-out debug logs.
---
 apps/desktop/package.json                     |  2 +-
 apps/desktop/src/lib/utils/clipboard.ts       | 42 ++++++++
 apps/desktop/src/lib/utils/init.ts            | 11 ++-
 packages/drizzle/index.ts                     |  1 +
 packages/drizzle/package.json                 |  1 +
 packages/drizzle/src/proxy.ts                 | 12 +--
 .../permissions/autogenerated/reference.md    |  2 -
 pnpm-lock.yaml                                | 99 +------------------
 8 files changed, 62 insertions(+), 108 deletions(-)
 create mode 100644 apps/desktop/src/lib/utils/clipboard.ts

diff --git a/apps/desktop/package.json b/apps/desktop/package.json
index 1649263..f901268 100644
--- a/apps/desktop/package.json
+++ b/apps/desktop/package.json
@@ -32,7 +32,7 @@
 		"@tauri-apps/plugin-stronghold": "^2.2.0",
 		"@tauri-store/svelte": "^2.1.1",
 		"dompurify": "^3.2.4",
-		"drizzle-orm": "^0.40.1",
+		"drizzle-orm": "^0.41.0",
 		"eslint": "^9.21.0",
 		"fuse.js": "^7.1.0",
 		"gsap": "^3.12.7",
diff --git a/apps/desktop/src/lib/utils/clipboard.ts b/apps/desktop/src/lib/utils/clipboard.ts
new file mode 100644
index 0000000..a5a24e5
--- /dev/null
+++ b/apps/desktop/src/lib/utils/clipboard.ts
@@ -0,0 +1,42 @@
+import { proxyDB, schema } from "@kksh/drizzle"
+import { getExtClipboard } from "@kksh/drizzle/api"
+import { error, info } from "@tauri-apps/plugin-log"
+import * as orm from "drizzle-orm"
+
+/**
+ * For now, simply delete all clipboard data older than 10 days
+ */
+export async function cleanClipboard() {
+	const clipboardExt = await getExtClipboard()
+	const tenDaysAgo = new Date()
+	tenDaysAgo.setDate(tenDaysAgo.getDate() - 8)
+
+	try {
+		// Select data older than 10 days to check what will be deleted
+		const oldClipboardData = await proxyDB
+			.select({ count: orm.count() })
+			.from(schema.extensionData)
+			.where(
+				orm.and(
+					orm.eq(schema.extensionData.extId, clipboardExt.extId),
+					orm.lt(schema.extensionData.createdAt, tenDaysAgo.toISOString())
+				)
+			)
+		const nLinesToDelete = oldClipboardData.at(0)?.count ?? 0
+		info(`Found ${nLinesToDelete} clipboard entries older than 10 days to clean up`)
+
+		// Now delete the old data
+		const deleted = await proxyDB
+			.delete(schema.extensionData)
+			.where(
+				orm.and(
+					orm.eq(schema.extensionData.extId, clipboardExt.extId),
+					orm.lt(schema.extensionData.createdAt, tenDaysAgo.toISOString())
+				)
+			)
+
+		console.log("deleted", deleted)
+	} catch (e) {
+		error(`Error during clipboard cleanup: ${e}`)
+	}
+}
diff --git a/apps/desktop/src/lib/utils/init.ts b/apps/desktop/src/lib/utils/init.ts
index bd8751c..59731cb 100644
--- a/apps/desktop/src/lib/utils/init.ts
+++ b/apps/desktop/src/lib/utils/init.ts
@@ -1,7 +1,8 @@
 import { appConfig, extensions } from "@/stores"
 import { getCurrentWindow } from "@tauri-apps/api/window"
-import { info } from "@tauri-apps/plugin-log"
+import { error, info } from "@tauri-apps/plugin-log"
 import { dev } from "$app/environment"
+import { cleanClipboard } from "./clipboard"
 import { mapKeyToTauriKey, registerAppHotkey } from "./hotkey"
 import { listenToReloadOneExtension } from "./tauri-events"
 
@@ -17,7 +18,13 @@ export function init() {
 			extensions.reloadExtension(extPath)
 		})
 	}
-
+	cleanClipboard()
+		.then(() => {
+			info("Cleaned clipboard")
+		})
+		.catch((e) => {
+			error(`Failed to clean clipboard: ${e}`)
+		})
 	if (!dev) {
 		// document.addEventListener("contextmenu", function (event) {
 		// 	event.preventDefault()
diff --git a/packages/drizzle/index.ts b/packages/drizzle/index.ts
index 7be6aab..4e2652f 100644
--- a/packages/drizzle/index.ts
+++ b/packages/drizzle/index.ts
@@ -1,3 +1,4 @@
 export * as schema from "./drizzle/schema"
 export * as relations from "./drizzle/relations"
 export * as db from "./src/apis"
+export { db as proxyDB } from "./src/proxy"
diff --git a/packages/drizzle/package.json b/packages/drizzle/package.json
index 630ad3a..556f4d2 100644
--- a/packages/drizzle/package.json
+++ b/packages/drizzle/package.json
@@ -5,6 +5,7 @@
 	"exports": {
 		".": "./index.ts",
 		"./api": "./src/apis.ts",
+		"./proxy": "./src/proxy.ts",
 		"./schema": "./drizzle/schema.ts",
 		"./relations": "./drizzle/relations.ts"
 	},
diff --git a/packages/drizzle/src/proxy.ts b/packages/drizzle/src/proxy.ts
index 2514b2f..7e780d8 100644
--- a/packages/drizzle/src/proxy.ts
+++ b/packages/drizzle/src/proxy.ts
@@ -11,12 +11,12 @@ export const db = drizzle<typeof schema>(
 	async (sqlQuery, params, method) => {
 		let rows: any = []
 		let results = []
-		console.log({
-			sql: sqlQuery,
-			params,
-			method
-		})
-		console.log(sqlQuery)
+		// console.log({
+		// 	sql: sqlQuery,
+		// 	params,
+		// 	method
+		// })
+		// console.log(sqlQuery)
 		// If the query is a SELECT, use the select method
 		if (isSelectQuery(sqlQuery)) {
 			rows = await sql.select(sqlQuery, params).catch((e) => {
diff --git a/packages/tauri-plugins/jarvis/permissions/autogenerated/reference.md b/packages/tauri-plugins/jarvis/permissions/autogenerated/reference.md
index 06546b4..ddf14e4 100644
--- a/packages/tauri-plugins/jarvis/permissions/autogenerated/reference.md
+++ b/packages/tauri-plugins/jarvis/permissions/autogenerated/reference.md
@@ -1,4 +1,3 @@
-
 ## Permission Table
 
 <table>
@@ -7,7 +6,6 @@
 <th>Description</th>
 </tr>
 
-
 <tr>
 <td>
 
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index 1a08ad0..c72213c 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -258,8 +258,8 @@ importers:
         specifier: ^3.2.4
         version: 3.2.4
       drizzle-orm:
-        specifier: ^0.40.1
-        version: 0.40.1(@libsql/client@0.15.1)(bun-types@1.2.7)(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)
       eslint:
         specifier: ^9.21.0
         version: 9.21.0(jiti@2.4.0)
@@ -7719,95 +7719,6 @@ packages:
     resolution: {integrity: sha512-l6dMSE100u7sDaTbLczibrQZjA35jLsHNqIV+jmhNVO3O8jzM6kywMOmV9uOz9ZVSCMPQhAZEFjL/qDPVrqpUA==}
     hasBin: true
 
-  drizzle-orm@0.40.1:
-    resolution: {integrity: sha512-aPNhtiJiPfm3qxz1czrnIDkfvkSdKGXYeZkpG55NPTVI186LmK2fBLMi4dsHpPHlJrZeQ92D322YFPHADBALew==}
-    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
-
   drizzle-orm@0.41.0:
     resolution: {integrity: sha512-7A4ZxhHk9gdlXmTdPj/lREtP+3u8KvZ4yEN6MYVxBzZGex5Wtdc+CWSbu7btgF6TB0N+MNPrvW7RKBbxJchs/Q==}
     peerDependencies:
@@ -20759,12 +20670,6 @@ snapshots:
     transitivePeerDependencies:
       - supports-color
 
-  drizzle-orm@0.40.1(@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
-
   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