mirror of
https://github.com/kunkunsh/kunkun.git
synced 2025-04-11 17:29:44 +00:00
Merge branch 'develop' into command-redesign
This commit is contained in:
commit
b78c78da3b
121
.github/workflows/test-build.yml
vendored
Normal file
121
.github/workflows/test-build.yml
vendored
Normal file
@ -0,0 +1,121 @@
|
|||||||
|
name: "Desktop Test build"
|
||||||
|
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
branches:
|
||||||
|
- "test-build"
|
||||||
|
tags:
|
||||||
|
- "v*"
|
||||||
|
workflow_dispatch:
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
publish-tauri:
|
||||||
|
permissions:
|
||||||
|
contents: write
|
||||||
|
strategy:
|
||||||
|
fail-fast: false
|
||||||
|
matrix:
|
||||||
|
settings:
|
||||||
|
- platform: "macos-14" # for Arm based macs (M1 and above).
|
||||||
|
args: "--target aarch64-apple-darwin --verbose --config src-tauri/tauri.conf.publish.json"
|
||||||
|
- platform: "macos-13" # for Intel based macs.
|
||||||
|
args: "--target x86_64-apple-darwin --verbose --config src-tauri/tauri.conf.publish.json"
|
||||||
|
# Universal Build no longer supported after adding openssl, which is not cross-compilable.
|
||||||
|
- platform: "macos-14" # for Both Arm and Intel based macs.
|
||||||
|
args: "--target universal-apple-darwin --verbose --config src-tauri/tauri.conf.publish.json"
|
||||||
|
- platform: "ubuntu-22.04" # for Tauri v1 you could replace this with ubuntu-20.04.
|
||||||
|
args: "--verbose --config src-tauri/tauri.conf.publish.json"
|
||||||
|
- platform: "windows-latest"
|
||||||
|
args: "--verbose --config src-tauri/tauri.conf.publish.json"
|
||||||
|
|
||||||
|
runs-on: ${{ matrix.settings.platform }}
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v4
|
||||||
|
with:
|
||||||
|
submodules: "true"
|
||||||
|
|
||||||
|
- name: Install Dependencies (ubuntu only)
|
||||||
|
if: matrix.settings.platform == 'ubuntu-22.04' # This must match the platform value defined above.
|
||||||
|
run: |
|
||||||
|
sudo apt-get update
|
||||||
|
sudo apt-get install -y libwebkit2gtk-4.1-dev libappindicator3-dev librsvg2-dev patchelf libxdo-dev
|
||||||
|
# You can remove the one that doesn't apply to your app to speed up the workflow a bit.
|
||||||
|
- name: Install protobuf (Mac)
|
||||||
|
if: startsWith(matrix.settings.platform, 'macos')
|
||||||
|
run: |
|
||||||
|
brew install protobuf
|
||||||
|
brew install openssl
|
||||||
|
- name: Install Protobuf (Ubuntu)
|
||||||
|
if: matrix.settings.platform == 'ubuntu-22.04'
|
||||||
|
run: |
|
||||||
|
sudo apt install -y protobuf-compiler
|
||||||
|
- uses: pnpm/action-setup@v4
|
||||||
|
- name: Setup Node
|
||||||
|
uses: actions/setup-node@v4
|
||||||
|
with:
|
||||||
|
node-version: lts/*
|
||||||
|
cache: "pnpm" # Set this to npm, yarn or pnpm.
|
||||||
|
cache-dependency-path: ./pnpm-lock.yaml
|
||||||
|
- name: Install protoc and openssl for windows
|
||||||
|
if: matrix.settings.platform == 'windows-latest'
|
||||||
|
run: |
|
||||||
|
choco install protoc
|
||||||
|
choco install openssl
|
||||||
|
echo OPENSSL_DIR='C:\Program Files\OpenSSL' >> $env:GITHUB_ENV
|
||||||
|
echo OPENSSL_INCLUDE_DIR='C:\Program Files\OpenSSL\include' >> $env:GITHUB_ENV
|
||||||
|
echo OPENSSL_LIB_DIR='C:\Program Files\OpenSSL\lib\VC\x64\MDd' >> $env:GITHUB_ENV
|
||||||
|
|
||||||
|
- name: Install Rust stable
|
||||||
|
uses: dtolnay/rust-toolchain@stable
|
||||||
|
with:
|
||||||
|
# Those targets are only used on macos runners so it's in an `if` to slightly speed up windows and linux builds.
|
||||||
|
targets: ${{ matrix.settings.platform == 'macos-14' && 'aarch64-apple-darwin,x86_64-apple-darwin' || '' }}
|
||||||
|
- name: Add rust target (macos only)
|
||||||
|
if: matrix.settings.platform == 'macos-14'
|
||||||
|
run: |
|
||||||
|
rustup target add aarch64-apple-darwin
|
||||||
|
rustup target add x86_64-apple-darwin
|
||||||
|
- name: Rust Cache
|
||||||
|
uses: swatinem/rust-cache@v2
|
||||||
|
with:
|
||||||
|
workspaces: ". -> target"
|
||||||
|
- uses: oven-sh/setup-bun@v1
|
||||||
|
with:
|
||||||
|
bun-version: latest
|
||||||
|
- name: Install Dependencies
|
||||||
|
run: pnpm install
|
||||||
|
- name: Environment Check
|
||||||
|
run: |
|
||||||
|
# pnpm --filter=@kksh/ci run ci-env-check
|
||||||
|
bun packages/ci/scripts/ci-env-check.ts
|
||||||
|
- name: Build Packages
|
||||||
|
env:
|
||||||
|
NODE_OPTIONS: --max-old-space-size=4096
|
||||||
|
run: pnpm build
|
||||||
|
- name: Get App Version
|
||||||
|
if: matrix.settings.platform == 'windows-latest'
|
||||||
|
id: appversion
|
||||||
|
run: |
|
||||||
|
echo "version=$(node -p "require('./apps/desktop/package.json').version")" >> $env:GITHUB_OUTPUT
|
||||||
|
- uses: tauri-apps/tauri-action@v0
|
||||||
|
env:
|
||||||
|
CI: false
|
||||||
|
KUNKUN_PUBLISH: true
|
||||||
|
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
NODE_OPTIONS: --max-old-space-size=4096
|
||||||
|
APPLE_CERTIFICATE: ${{ secrets.APPLE_CERTIFICATE }}
|
||||||
|
APPLE_CERTIFICATE_PASSWORD: ${{ secrets.APPLE_CERTIFICATE_PASSWORD }}
|
||||||
|
APPLE_SIGNING_IDENTITY: ${{ secrets.APPLE_SIGNING_IDENTITY }}
|
||||||
|
APPLE_ID: ${{ secrets.APPLE_ID }}
|
||||||
|
APPLE_PASSWORD: ${{ secrets.APPLE_PASSWORD }}
|
||||||
|
APPLE_TEAM_ID: ${{ secrets.APPLE_TEAM_ID }}
|
||||||
|
TAURI_SIGNING_PRIVATE_KEY: ${{ secrets.TAURI_SIGNING_PRIVATE_KEY }}
|
||||||
|
TAURI_SIGNING_PRIVATE_KEY_PASSWORD: ${{ secrets.TAURI_SIGNING_PRIVATE_KEY_PASSWORD }}
|
||||||
|
with:
|
||||||
|
tagName: Kunkun-v__VERSION__ # the action automatically replaces \_\_VERSION\_\_ with the app version.
|
||||||
|
releaseName: "Kunkun v__VERSION__"
|
||||||
|
releaseBody: "See the assets to download this version and install."
|
||||||
|
releaseDraft: false
|
||||||
|
prerelease: false
|
||||||
|
args: ${{ matrix.settings.args }} ${{ contains(steps.appversion.outputs.version, 'beta') && matrix.settings.platform == 'windows-latest' && '-b nsis' || '' }}
|
||||||
|
projectPath: "./apps/desktop"
|
@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@kksh/desktop",
|
"name": "@kksh/desktop",
|
||||||
"version": "0.1.37-beta.1",
|
"version": "0.1.37",
|
||||||
"description": "",
|
"description": "",
|
||||||
"type": "module",
|
"type": "module",
|
||||||
"scripts": {
|
"scripts": {
|
||||||
@ -32,7 +32,7 @@
|
|||||||
"@tauri-apps/plugin-stronghold": "^2.2.0",
|
"@tauri-apps/plugin-stronghold": "^2.2.0",
|
||||||
"@tauri-store/svelte": "^2.1.1",
|
"@tauri-store/svelte": "^2.1.1",
|
||||||
"dompurify": "^3.2.4",
|
"dompurify": "^3.2.4",
|
||||||
"drizzle-orm": "^0.40.1",
|
"drizzle-orm": "^0.41.0",
|
||||||
"eslint": "^9.21.0",
|
"eslint": "^9.21.0",
|
||||||
"fuse.js": "^7.1.0",
|
"fuse.js": "^7.1.0",
|
||||||
"gsap": "^3.12.7",
|
"gsap": "^3.12.7",
|
||||||
|
44
apps/desktop/src/lib/utils/clipboard.ts
Normal file
44
apps/desktop/src/lib/utils/clipboard.ts
Normal file
@ -0,0 +1,44 @@
|
|||||||
|
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 nDays = 10
|
||||||
|
const clipboardExt = await getExtClipboard()
|
||||||
|
const nDaysAgo = new Date()
|
||||||
|
nDaysAgo.setDate(nDaysAgo.getDate() - nDays)
|
||||||
|
|
||||||
|
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, nDaysAgo.toISOString())
|
||||||
|
)
|
||||||
|
)
|
||||||
|
const nLinesToDelete = oldClipboardData.at(0)?.count ?? 0
|
||||||
|
console.info(`Found ${nLinesToDelete} clipboard entries older than ${nDays} days to clean up`)
|
||||||
|
info(`Found ${nLinesToDelete} clipboard entries older than ${nDays} 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, nDaysAgo.toISOString())
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
|
console.log("deleted", deleted)
|
||||||
|
} catch (e) {
|
||||||
|
error(`Error during clipboard cleanup: ${e}`)
|
||||||
|
}
|
||||||
|
}
|
13
apps/desktop/src/lib/utils/db.ts
Normal file
13
apps/desktop/src/lib/utils/db.ts
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
import { proxyDB } from "@kksh/drizzle"
|
||||||
|
import { error, info } from "@tauri-apps/plugin-log"
|
||||||
|
import { sql } from "drizzle-orm"
|
||||||
|
|
||||||
|
export async function vacuumSqlite() {
|
||||||
|
const statement = sql`VACUUM`
|
||||||
|
try {
|
||||||
|
await proxyDB.run(statement)
|
||||||
|
info("Vacuumed sqlite")
|
||||||
|
} catch (error) {
|
||||||
|
console.error(`Failed to vacuum sqlite: ${error}`)
|
||||||
|
}
|
||||||
|
}
|
@ -1,14 +1,16 @@
|
|||||||
import { appConfig, extensions } from "@/stores"
|
import { appConfig, extensions } from "@/stores"
|
||||||
import { getCurrentWindow } from "@tauri-apps/api/window"
|
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 { dev } from "$app/environment"
|
||||||
|
import { cleanClipboard } from "./clipboard"
|
||||||
|
import { vacuumSqlite } from "./db"
|
||||||
import { mapKeyToTauriKey, registerAppHotkey } from "./hotkey"
|
import { mapKeyToTauriKey, registerAppHotkey } from "./hotkey"
|
||||||
import { listenToReloadOneExtension } from "./tauri-events"
|
import { listenToReloadOneExtension } from "./tauri-events"
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Initialize the app
|
* Initialize the app
|
||||||
*/
|
*/
|
||||||
export function init() {
|
export async function init() {
|
||||||
const window = getCurrentWindow()
|
const window = getCurrentWindow()
|
||||||
if (window.label === "main") {
|
if (window.label === "main") {
|
||||||
initMainWindow()
|
initMainWindow()
|
||||||
@ -17,7 +19,14 @@ export function init() {
|
|||||||
extensions.reloadExtension(extPath)
|
extensions.reloadExtension(extPath)
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
await cleanClipboard()
|
||||||
|
.then(() => {
|
||||||
|
info("Cleaned clipboard")
|
||||||
|
})
|
||||||
|
.catch((e) => {
|
||||||
|
error(`Failed to clean clipboard: ${e}`)
|
||||||
|
})
|
||||||
|
vacuumSqlite()
|
||||||
if (!dev) {
|
if (!dev) {
|
||||||
// document.addEventListener("contextmenu", function (event) {
|
// document.addEventListener("contextmenu", function (event) {
|
||||||
// event.preventDefault()
|
// event.preventDefault()
|
||||||
|
@ -53,7 +53,7 @@
|
|||||||
unlisteners.forEach((unlistener) => unlistener())
|
unlisteners.forEach((unlistener) => unlistener())
|
||||||
})
|
})
|
||||||
onMount(async () => {
|
onMount(async () => {
|
||||||
attachConsole().then((unlistener) => unlisteners.push(unlistener))
|
await attachConsole().then((unlistener) => unlisteners.push(unlistener))
|
||||||
initDeeplink().then((unlistener) => unlisteners.push(unlistener))
|
initDeeplink().then((unlistener) => unlisteners.push(unlistener))
|
||||||
shellx
|
shellx
|
||||||
.fixPathEnv()
|
.fixPathEnv()
|
||||||
|
@ -1,3 +1,4 @@
|
|||||||
export * as schema from "./drizzle/schema"
|
export * as schema from "./drizzle/schema"
|
||||||
export * as relations from "./drizzle/relations"
|
export * as relations from "./drizzle/relations"
|
||||||
export * as db from "./src/apis"
|
export * as db from "./src/apis"
|
||||||
|
export { db as proxyDB } from "./src/proxy"
|
||||||
|
@ -5,6 +5,7 @@
|
|||||||
"exports": {
|
"exports": {
|
||||||
".": "./index.ts",
|
".": "./index.ts",
|
||||||
"./api": "./src/apis.ts",
|
"./api": "./src/apis.ts",
|
||||||
|
"./proxy": "./src/proxy.ts",
|
||||||
"./schema": "./drizzle/schema.ts",
|
"./schema": "./drizzle/schema.ts",
|
||||||
"./relations": "./drizzle/relations.ts"
|
"./relations": "./drizzle/relations.ts"
|
||||||
},
|
},
|
||||||
|
@ -11,12 +11,12 @@ export const db = drizzle<typeof schema>(
|
|||||||
async (sqlQuery, params, method) => {
|
async (sqlQuery, params, method) => {
|
||||||
let rows: any = []
|
let rows: any = []
|
||||||
let results = []
|
let results = []
|
||||||
console.log({
|
// console.log({
|
||||||
sql: sqlQuery,
|
// sql: sqlQuery,
|
||||||
params,
|
// params,
|
||||||
method
|
// method
|
||||||
})
|
// })
|
||||||
console.log(sqlQuery)
|
// console.log(sqlQuery)
|
||||||
// If the query is a SELECT, use the select method
|
// If the query is a SELECT, use the select method
|
||||||
if (isSelectQuery(sqlQuery)) {
|
if (isSelectQuery(sqlQuery)) {
|
||||||
rows = await sql.select(sqlQuery, params).catch((e) => {
|
rows = await sql.select(sqlQuery, params).catch((e) => {
|
||||||
|
@ -1,4 +1,3 @@
|
|||||||
|
|
||||||
## Permission Table
|
## Permission Table
|
||||||
|
|
||||||
<table>
|
<table>
|
||||||
@ -7,7 +6,6 @@
|
|||||||
<th>Description</th>
|
<th>Description</th>
|
||||||
</tr>
|
</tr>
|
||||||
|
|
||||||
|
|
||||||
<tr>
|
<tr>
|
||||||
<td>
|
<td>
|
||||||
|
|
||||||
|
99
pnpm-lock.yaml
generated
99
pnpm-lock.yaml
generated
@ -258,8 +258,8 @@ importers:
|
|||||||
specifier: ^3.2.4
|
specifier: ^3.2.4
|
||||||
version: 3.2.4
|
version: 3.2.4
|
||||||
drizzle-orm:
|
drizzle-orm:
|
||||||
specifier: ^0.40.1
|
specifier: ^0.41.0
|
||||||
version: 0.40.1(@libsql/client@0.15.1)(bun-types@1.2.7)(gel@2.0.1)
|
version: 0.41.0(@libsql/client@0.15.1)(bun-types@1.2.7)(gel@2.0.1)
|
||||||
eslint:
|
eslint:
|
||||||
specifier: ^9.21.0
|
specifier: ^9.21.0
|
||||||
version: 9.21.0(jiti@2.4.0)
|
version: 9.21.0(jiti@2.4.0)
|
||||||
@ -7719,95 +7719,6 @@ packages:
|
|||||||
resolution: {integrity: sha512-l6dMSE100u7sDaTbLczibrQZjA35jLsHNqIV+jmhNVO3O8jzM6kywMOmV9uOz9ZVSCMPQhAZEFjL/qDPVrqpUA==}
|
resolution: {integrity: sha512-l6dMSE100u7sDaTbLczibrQZjA35jLsHNqIV+jmhNVO3O8jzM6kywMOmV9uOz9ZVSCMPQhAZEFjL/qDPVrqpUA==}
|
||||||
hasBin: true
|
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:
|
drizzle-orm@0.41.0:
|
||||||
resolution: {integrity: sha512-7A4ZxhHk9gdlXmTdPj/lREtP+3u8KvZ4yEN6MYVxBzZGex5Wtdc+CWSbu7btgF6TB0N+MNPrvW7RKBbxJchs/Q==}
|
resolution: {integrity: sha512-7A4ZxhHk9gdlXmTdPj/lREtP+3u8KvZ4yEN6MYVxBzZGex5Wtdc+CWSbu7btgF6TB0N+MNPrvW7RKBbxJchs/Q==}
|
||||||
peerDependencies:
|
peerDependencies:
|
||||||
@ -20759,12 +20670,6 @@ snapshots:
|
|||||||
transitivePeerDependencies:
|
transitivePeerDependencies:
|
||||||
- supports-color
|
- 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):
|
drizzle-orm@0.41.0(@libsql/client@0.15.1)(bun-types@1.2.7)(gel@2.0.1):
|
||||||
optionalDependencies:
|
optionalDependencies:
|
||||||
'@libsql/client': 0.15.1
|
'@libsql/client': 0.15.1
|
||||||
|
Loading…
x
Reference in New Issue
Block a user