diff --git a/apps/desktop/drizzle.config.ts b/apps/desktop/drizzle.config.ts new file mode 100644 index 0000000..870e0ea --- /dev/null +++ b/apps/desktop/drizzle.config.ts @@ -0,0 +1,19 @@ +import { defineConfig } from 'drizzle-kit' +import envPaths from 'env-paths' +import { join } from 'path' +import { mkdirSync } from 'fs' +import { getENV } from './src/bun/lib/get-env' + +const env = getENV() + +const { data } = envPaths(env.appName, { suffix: '' }) +mkdirSync(data, { recursive: true }) + +export default defineConfig({ + out: './drizzle', + schema: './src/bun/lib/db/schema.ts', + dialect: 'sqlite', + dbCredentials: { + url: join(data, env.dbFilename), + }, +}) diff --git a/apps/desktop/drizzle/20260514040815_regular_sunspot/migration.sql b/apps/desktop/drizzle/20260514040815_regular_sunspot/migration.sql new file mode 100644 index 0000000..bd62f8a --- /dev/null +++ b/apps/desktop/drizzle/20260514040815_regular_sunspot/migration.sql @@ -0,0 +1,10 @@ +CREATE TABLE `token_metadata` ( + `name` text, + `symbol` text NOT NULL, + `decimals` integer, + `logo` text, + `contractAddress` text NOT NULL, + `chainId` text NOT NULL +); +--> statement-breakpoint +CREATE UNIQUE INDEX `contract_unique` ON `token_metadata` (`chainId`,`contractAddress`); \ No newline at end of file diff --git a/apps/desktop/drizzle/20260514040815_regular_sunspot/snapshot.json b/apps/desktop/drizzle/20260514040815_regular_sunspot/snapshot.json new file mode 100644 index 0000000..5d6e17b --- /dev/null +++ b/apps/desktop/drizzle/20260514040815_regular_sunspot/snapshot.json @@ -0,0 +1,93 @@ +{ + "version": "7", + "dialect": "sqlite", + "id": "2845d968-33cd-48b6-8944-03e0e46a4a90", + "prevIds": [ + "00000000-0000-0000-0000-000000000000" + ], + "ddl": [ + { + "name": "token_metadata", + "entityType": "tables" + }, + { + "type": "text", + "notNull": false, + "autoincrement": false, + "default": null, + "generated": null, + "name": "name", + "entityType": "columns", + "table": "token_metadata" + }, + { + "type": "text", + "notNull": true, + "autoincrement": false, + "default": null, + "generated": null, + "name": "symbol", + "entityType": "columns", + "table": "token_metadata" + }, + { + "type": "integer", + "notNull": false, + "autoincrement": false, + "default": null, + "generated": null, + "name": "decimals", + "entityType": "columns", + "table": "token_metadata" + }, + { + "type": "text", + "notNull": false, + "autoincrement": false, + "default": null, + "generated": null, + "name": "logo", + "entityType": "columns", + "table": "token_metadata" + }, + { + "type": "text", + "notNull": true, + "autoincrement": false, + "default": null, + "generated": null, + "name": "contractAddress", + "entityType": "columns", + "table": "token_metadata" + }, + { + "type": "text", + "notNull": true, + "autoincrement": false, + "default": null, + "generated": null, + "name": "chainId", + "entityType": "columns", + "table": "token_metadata" + }, + { + "columns": [ + { + "value": "chainId", + "isExpression": false + }, + { + "value": "contractAddress", + "isExpression": false + } + ], + "isUnique": true, + "where": null, + "origin": "manual", + "name": "contract_unique", + "entityType": "indexes", + "table": "token_metadata" + } + ], + "renames": [] +} \ No newline at end of file diff --git a/apps/desktop/electrobun.config.ts b/apps/desktop/electrobun.config.ts index 6076d67..b7440b5 100644 --- a/apps/desktop/electrobun.config.ts +++ b/apps/desktop/electrobun.config.ts @@ -11,6 +11,7 @@ export default { copy: { 'dist/index.html': 'views/mainview/index.html', 'dist/assets': 'views/mainview/assets', + 'drizzle': 'drizzle', }, // Ignore Vite output in watch mode — HMR handles view rebuilds separately watchIgnore: ['dist/**'], diff --git a/apps/desktop/package.json b/apps/desktop/package.json index 9846d54..196ef8f 100644 --- a/apps/desktop/package.json +++ b/apps/desktop/package.json @@ -9,11 +9,14 @@ "hmr": "vite --port 5173", "build:dev": "vite build && electrobun build", "build:canary": "vite build && electrobun build --env=canary", - "build:stable": "vite build && electrobun build --env=stable" + "build:stable": "vite build && electrobun build --env=stable", + "db:push": "bun x --bun drizzle-kit push", + "db:generate": "drizzle-kit generate" }, "dependencies": { - "@koins/utils": "workspace:*", "@alchemy/wallet-apis": "^5.0.0-beta.28", + "@koins/utils": "workspace:*", + "drizzle-orm": "^1.0.0-beta.22", "electrobun": "^1.18.1", "ethers": "^6.16.0", "mode-watcher": "^1.1.0", @@ -27,9 +30,13 @@ "@sveltejs/vite-plugin-svelte": "^7.0.0", "@tailwindcss/vite": "^4.2.2", "@tanstack/table-core": "^8.21.3", + "@types/env-paths": "^2.1.2", + "@types/node": "^25.7.0", "bits-ui": "^2.16.5", + "bun-types": "^1.3.14", "clsx": "^2.1.1", "concurrently": "^9.2.1", + "drizzle-kit": "^1.0.0-beta.22", "embla-carousel-svelte": "^8.6.0", "formsnap": "^2.0.1", "layerchart": "2.0.0-next.48", @@ -46,6 +53,7 @@ "tailwind-merge": "^3.5.0", "tailwind-variants": "^3.2.2", "tailwindcss": "^4.2.2", + "tsx": "^4.21.0", "tw-animate-css": "^1.4.0", "typescript": "^6.0.2", "vaul-svelte": "^1.0.0-next.7", diff --git a/apps/desktop/src/bun/index.ts b/apps/desktop/src/bun/index.ts index de28575..cdb29ce 100644 --- a/apps/desktop/src/bun/index.ts +++ b/apps/desktop/src/bun/index.ts @@ -2,15 +2,30 @@ import { ApplicationMenu, BrowserView, BrowserWindow, + PATHS, Updater, + Utils, defineElectrobunRPC, type RPCSchema, - Utils, } from 'electrobun/bun' import { inspect } from 'util' import { getTokenMetadata, getTokensBalances } from './lib/alchemy' import { tryCatch } from '@koins/utils' import { getTransactionHistory } from './lib/alchemy/get-transaction-history' +import { migrate } from 'drizzle-orm/bun-sqlite/migrator' +import { db } from './lib/db' +import { join } from 'path' +import { getENV } from './lib/get-env' + +const env = getENV() + +console.log(env) + +if (env.env === 'prod') { + migrate(db, { + migrationsFolder: join(PATHS.RESOURCES_FOLDER, 'app', 'drizzle'), + }) +} const DEV_SERVER_PORT = 5173 const DEV_SERVER_URL = `http://localhost:${DEV_SERVER_PORT}` diff --git a/apps/desktop/src/bun/lib/alchemy/get-token-metadata.ts b/apps/desktop/src/bun/lib/alchemy/get-token-metadata.ts index 3445956..f39a751 100644 --- a/apps/desktop/src/bun/lib/alchemy/get-token-metadata.ts +++ b/apps/desktop/src/bun/lib/alchemy/get-token-metadata.ts @@ -1,3 +1,6 @@ +import { eq, and } from 'drizzle-orm' +import { db } from '../db' +import { tokenMetadata } from '../db/schema' import { post } from './call' import { getChainID, getURL } from './network' @@ -9,6 +12,30 @@ export const getTokenMetadata = async ( const chainId = getChainID(chainid) if (!chainId) return + const cached = db + .select() + .from(tokenMetadata) + .where( + and( + eq(tokenMetadata.chainId, chainId), + eq(tokenMetadata.contractAddress, tokenAddress.toLowerCase()), + ), + ) + .get() + + if (cached) { + return { + jsonrpc: '2.0' as const, + id: 0, + result: { + name: cached.name ?? null, + symbol: cached.symbol, + decimals: cached.decimals ?? null, + logo: cached.logo ?? null, + }, + } + } + const url = getURL({ chainId, key, @@ -26,5 +53,23 @@ export const getTokenMetadata = async ( params: [tokenAddress], }) + if (result?.result?.symbol) { + try { + await db + .insert(tokenMetadata) + .values({ + name: result.result.name, + symbol: result.result.symbol, + decimals: result.result.decimals, + logo: result.result.logo, + contractAddress: tokenAddress.toLowerCase(), + chainId, + }) + .onConflictDoNothing() + } catch (e) { + console.log('Failed to cache token metadata', e) + } + } + return result } diff --git a/apps/desktop/src/bun/lib/alchemy/get-transaction-history.ts b/apps/desktop/src/bun/lib/alchemy/get-transaction-history.ts index a028989..7eb2f88 100644 --- a/apps/desktop/src/bun/lib/alchemy/get-transaction-history.ts +++ b/apps/desktop/src/bun/lib/alchemy/get-transaction-history.ts @@ -35,6 +35,7 @@ export const getTransactionHistory = async ( const outRequest = post<{ transfers: Transaction[] + pageKey: string }>(url, body(address, undefined)) const inRequest = post<{ diff --git a/apps/desktop/src/bun/lib/db/index.ts b/apps/desktop/src/bun/lib/db/index.ts new file mode 100644 index 0000000..d595d89 --- /dev/null +++ b/apps/desktop/src/bun/lib/db/index.ts @@ -0,0 +1,5 @@ +import { drizzle } from 'drizzle-orm/bun-sqlite' +import { sqlite } from '../sqlite' +import { relations } from './relations' + +export const db = drizzle({ client: sqlite, relations }) diff --git a/apps/desktop/src/bun/lib/db/relations.ts b/apps/desktop/src/bun/lib/db/relations.ts new file mode 100644 index 0000000..ae8b602 --- /dev/null +++ b/apps/desktop/src/bun/lib/db/relations.ts @@ -0,0 +1,4 @@ +import { defineRelations } from 'drizzle-orm' +import * as schema from './schema' + +export const relations = defineRelations(schema, () => ({})) diff --git a/apps/desktop/src/bun/lib/db/schema.ts b/apps/desktop/src/bun/lib/db/schema.ts new file mode 100644 index 0000000..c0e6b28 --- /dev/null +++ b/apps/desktop/src/bun/lib/db/schema.ts @@ -0,0 +1,19 @@ +import { int, sqliteTable, text, uniqueIndex } from 'drizzle-orm/sqlite-core' + +export const tokenMetadata = sqliteTable( + 'token_metadata', + { + name: text(), + symbol: text().notNull(), + decimals: int(), + logo: text(), + contractAddress: text().notNull(), + chainId: text().notNull(), + }, + (table) => ({ + contractUnique: uniqueIndex('contract_unique').on( + table.chainId, + table.contractAddress, + ), + }), +) diff --git a/apps/desktop/src/bun/lib/get-env.ts b/apps/desktop/src/bun/lib/get-env.ts new file mode 100644 index 0000000..6570e16 --- /dev/null +++ b/apps/desktop/src/bun/lib/get-env.ts @@ -0,0 +1,19 @@ +const env = Bun.env.ELECTROBUN_ENV as 'dev' | 'prod' | undefined + +export const getENV = () => { + let appName + let dbFilename + if (env === 'prod') { + appName = 'koins' + dbFilename = 'koins.db' + } else { + appName = 'koins-dev' + dbFilename = 'koins-dev.db' + } + + return { + env: env || 'dev', + appName, + dbFilename, + } +} diff --git a/apps/desktop/src/bun/lib/sqlite/index.ts b/apps/desktop/src/bun/lib/sqlite/index.ts new file mode 100644 index 0000000..e1b3510 --- /dev/null +++ b/apps/desktop/src/bun/lib/sqlite/index.ts @@ -0,0 +1,16 @@ +import { Database } from 'bun:sqlite' +import envPaths from 'env-paths' +import { join } from 'path' +import { mkdirSync } from 'fs' +import { getENV } from '../get-env' + +const env = getENV() + +const { data } = envPaths(env.appName, { suffix: '' }) +mkdirSync(data, { recursive: true }) + +console.log(data) + +export const sqlite = new Database(join(data, env.dbFilename), { + create: true, +}) diff --git a/apps/desktop/tsconfig.json b/apps/desktop/tsconfig.json index eba9202..e65edee 100644 --- a/apps/desktop/tsconfig.json +++ b/apps/desktop/tsconfig.json @@ -12,6 +12,7 @@ "paths": { "$lib": ["./src/lib"], "$lib/*": ["./src/lib/*"] - } + }, + "types": ["bun-types", "node"] } } diff --git a/bun.lock b/bun.lock index 752d989..80cc66b 100644 --- a/bun.lock +++ b/bun.lock @@ -15,6 +15,7 @@ "dependencies": { "@alchemy/wallet-apis": "^5.0.0-beta.28", "@koins/utils": "workspace:*", + "drizzle-orm": "^1.0.0-beta.22", "electrobun": "^1.18.1", "ethers": "^6.16.0", "mode-watcher": "^1.1.0", @@ -28,9 +29,13 @@ "@sveltejs/vite-plugin-svelte": "^7.0.0", "@tailwindcss/vite": "^4.2.2", "@tanstack/table-core": "^8.21.3", + "@types/env-paths": "^2.1.2", + "@types/node": "^25.7.0", "bits-ui": "^2.16.5", + "bun-types": "^1.3.14", "clsx": "^2.1.1", "concurrently": "^9.2.1", + "drizzle-kit": "^1.0.0-beta.22", "embla-carousel-svelte": "^8.6.0", "formsnap": "^2.0.1", "layerchart": "2.0.0-next.48", @@ -47,6 +52,7 @@ "tailwind-merge": "^3.5.0", "tailwind-variants": "^3.2.2", "tailwindcss": "^4.2.2", + "tsx": "^4.21.0", "tw-animate-css": "^1.4.0", "typescript": "^6.0.2", "vaul-svelte": "^1.0.0-next.7", @@ -92,6 +98,8 @@ "@dagrejs/graphlib": ["@dagrejs/graphlib@3.0.4", "", {}, "sha512-HxZ7fCvAwTLCWCO0WjDkzAFQze8LdC6iOpKbetDKHIuDfIgMlIzYzqZ4nxwLlclQX+3ZVeZ1K2OuaOE2WWcyOg=="], + "@drizzle-team/brocli": ["@drizzle-team/brocli@0.11.0", "", {}, "sha512-hD3pekGiPg0WPCCGAZmusBBJsDqGUR66Y452YgQsZOnkdQ7ViEPKuyP4huUGEZQefp8g34RRodXYmJ2TbCH+tg=="], + "@emnapi/core": ["@emnapi/core@1.10.0", "", { "dependencies": { "@emnapi/wasi-threads": "1.2.1", "tslib": "^2.4.0" } }, "sha512-yq6OkJ4p82CAfPl0u9mQebQHKPJkY7WrIuk205cTYnYe+k2Z8YBh11FrbRG/H6ihirqcacOgl2BIO8oyMQLeXw=="], "@emnapi/runtime": ["@emnapi/runtime@1.10.0", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-ewvYlk86xUoGI0zQRNq/mC+16R1QeDlKQy21Ki3oSYXNgLb45GV1P6A0M+/s6nyCuNDqe5VpaY84BzXGwVbwFA=="], @@ -176,6 +184,8 @@ "@jridgewell/trace-mapping": ["@jridgewell/trace-mapping@0.3.31", "", { "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", "@jridgewell/sourcemap-codec": "^1.4.14" } }, "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw=="], + "@js-temporal/polyfill": ["@js-temporal/polyfill@0.5.1", "", { "dependencies": { "jsbi": "^4.3.0" } }, "sha512-hloP58zRVCRSpgDxmqCWJNlizAlUgJFqG2ypq79DCvyv9tHjRYMDOcPFjzfl/A1/YxDvRCZz8wvZvmapQnKwFQ=="], + "@koins/utils": ["@koins/utils@workspace:packages/utils"], "@layerstack/svelte-actions": ["@layerstack/svelte-actions@1.0.1-next.18", "", { "dependencies": { "@floating-ui/dom": "^1.7.0", "@layerstack/utils": "2.0.0-next.18", "d3-scale": "^4.0.2" } }, "sha512-gxPzCnJ1c9LTfWtRqLUzefCx+k59ZpxDUQ2XB+LokveZQPe7IDSOwHaBOEMlaGoGrtwc3Ft8dSZq+2WT2o9u/g=="], @@ -318,11 +328,13 @@ "@types/d3-contour": ["@types/d3-contour@3.0.6", "", { "dependencies": { "@types/d3-array": "*", "@types/geojson": "*" } }, "sha512-BjzLgXGnCWjUSYGfH1cpdo41/hgdWETu4YxpezoztawmqsvCeep+8QGfiY6YbDvfgHz/DkjeIkkZVJavB4a3rg=="], + "@types/env-paths": ["@types/env-paths@2.1.2", "", { "dependencies": { "env-paths": "*" } }, "sha512-T3JRXIjZ11Eaz2dI3FrwUbqpuokrsXZxqpOmOR0w83IiuTOCZEqFE5sVZ1ewYc24Ni1BHHyj6vX05jb6+S8GLA=="], + "@types/estree": ["@types/estree@1.0.8", "", {}, "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w=="], "@types/geojson": ["@types/geojson@7946.0.16", "", {}, "sha512-6C8nqWur3j98U6+lXDfTUWIfgvZU+EumvpHKcYjujKH7woYyLj2sUmff0tRhrqM7BohUw7Pz3ZB1jj2gW9Fvmg=="], - "@types/node": ["@types/node@22.19.15", "", { "dependencies": { "undici-types": "~6.21.0" } }, "sha512-F0R/h2+dsy5wJAUe3tAU6oqa2qbWY5TpNfL/RGmo1y38hiyO1w3x2jPtt76wmuaJI4DQnOBu21cNXQ2STIUUWg=="], + "@types/node": ["@types/node@25.7.0", "", { "dependencies": { "undici-types": "~7.21.0" } }, "sha512-z+pdZyxE+RTQE9AcboAZCb4otwcrvgHD+GlBpPgn0emDVt0ohrTMhAwlr2Wd9nZ+nihhYFxO2pThz3C5qSu2Eg=="], "@types/trusted-types": ["@types/trusted-types@2.0.7", "", {}, "sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw=="], @@ -376,7 +388,7 @@ "bits-ui": ["bits-ui@2.18.1", "", { "dependencies": { "@floating-ui/core": "^1.7.1", "@floating-ui/dom": "^1.7.1", "esm-env": "^1.1.2", "runed": "^0.35.1", "svelte-toolbelt": "^0.10.6", "tabbable": "^6.2.0" }, "peerDependencies": { "@internationalized/date": "^3.8.1", "svelte": "^5.33.0" } }, "sha512-KkemzKFH4T3gt3H+P86JcnAWExjByv/6vlwjm/BoCwTPHu03yiCdxbghdJLvFReQTe0acCAiRcKfmixxD6XvlA=="], - "bun-types": ["bun-types@1.3.13", "", { "dependencies": { "@types/node": "*" } }, "sha512-QXKeHLlOLqQX9LgYaHJfzdBaV21T63HhFJnvuRCcjZiaUDpbs5ED1MgxbMra71CsryN/1dAoXuJJJwIv/2drVA=="], + "bun-types": ["bun-types@1.3.14", "", { "dependencies": { "@types/node": "*" } }, "sha512-4N0ig0fEomHt5R0KCFWjovxow98rIoRwKolrYdCcknNwMekCXRnWEUvgu5soYV8QXtVsrUD8B95MBOZGPvr6KQ=="], "cac": ["cac@6.7.14", "", {}, "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ=="], @@ -494,6 +506,10 @@ "dlv": ["dlv@1.1.3", "", {}, "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA=="], + "drizzle-kit": ["drizzle-kit@1.0.0-beta.22", "", { "dependencies": { "@drizzle-team/brocli": "^0.11.0", "@js-temporal/polyfill": "^0.5.1", "esbuild": "^0.25.10", "get-tsconfig": "^4.13.6", "jiti": "^2.6.1" }, "bin": { "drizzle-kit": "bin.cjs" } }, "sha512-9HTZuQRljQKTgCx4UhiGn8KYYfHGk4+B/bRR1714W67kz0qgJvdrG527i8rQD8uUyET9UTGR1u8syySJD4znGw=="], + + "drizzle-orm": ["drizzle-orm@1.0.0-beta.22", "", { "peerDependencies": { "@aws-sdk/client-rds-data": ">=3", "@cloudflare/workers-types": ">=4", "@effect/sql": "^0.48.5", "@effect/sql-pg": "^0.49.7", "@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.13", "@sinclair/typebox": ">=0.34.8", "@sqlitecloud/drivers": ">=1.0.653", "@tidbcloud/serverless": "*", "@tursodatabase/database": ">=0.2.1", "@tursodatabase/database-common": ">=0.2.1", "@tursodatabase/database-wasm": ">=0.2.1", "@types/better-sqlite3": "*", "@types/mssql": "^9.1.4", "@types/pg": "*", "@types/sql.js": "*", "@upstash/redis": ">=1.34.7", "@vercel/postgres": ">=0.8.0", "@xata.io/client": "*", "arktype": ">=2.0.0", "better-sqlite3": ">=9.3.0", "bun-types": "*", "expo-sqlite": ">=14.0.0", "gel": ">=2", "mssql": "^11.0.1", "mysql2": ">=2", "pg": ">=8", "postgres": ">=3", "sql.js": ">=1", "sqlite3": ">=5", "typebox": ">=1.0.0", "valibot": ">=1.0.0-beta.7", "zod": "^3.25.0 || ^4.0.0" }, "optionalPeers": ["@aws-sdk/client-rds-data", "@cloudflare/workers-types", "@effect/sql", "@effect/sql-pg", "@electric-sql/pglite", "@libsql/client", "@libsql/client-wasm", "@neondatabase/serverless", "@op-engineering/op-sqlite", "@opentelemetry/api", "@planetscale/database", "@sinclair/typebox", "@sqlitecloud/drivers", "@tidbcloud/serverless", "@tursodatabase/database", "@tursodatabase/database-common", "@tursodatabase/database-wasm", "@types/better-sqlite3", "@types/mssql", "@types/pg", "@types/sql.js", "@upstash/redis", "@vercel/postgres", "@xata.io/client", "arktype", "better-sqlite3", "bun-types", "expo-sqlite", "gel", "mssql", "mysql2", "pg", "postgres", "sql.js", "sqlite3", "typebox", "valibot", "zod"] }, "sha512-F+DZyVIvH0oVKa/w08Cle1xfoH+pc+htIXHG/frnMLG72aby9NYYr9oc+9XvghnoO4umxFItduz0OMmQJMnenw=="], + "dts-resolver": ["dts-resolver@2.1.3", "", { "peerDependencies": { "oxc-resolver": ">=11.0.0" }, "optionalPeers": ["oxc-resolver"] }, "sha512-bihc7jPC90VrosXNzK0LTE2cuLP6jr0Ro8jk+kMugHReJVLIpHz/xadeq3MhuwyO4TD4OA3L1Q8pBBFRc08Tsw=="], "dunder-proto": ["dunder-proto@1.0.1", "", { "dependencies": { "call-bind-apply-helpers": "^1.0.1", "es-errors": "^1.3.0", "gopd": "^1.2.0" } }, "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A=="], @@ -514,6 +530,8 @@ "enhanced-resolve": ["enhanced-resolve@5.20.1", "", { "dependencies": { "graceful-fs": "^4.2.4", "tapable": "^2.3.0" } }, "sha512-Qohcme7V1inbAfvjItgw0EaxVX5q2rdVEZHRBrEQdRZTssLDGsL8Lwrznl8oQ/6kuTJONLaDcGjkNP247XEhcA=="], + "env-paths": ["env-paths@4.0.0", "", { "dependencies": { "is-safe-filename": "^0.1.0" } }, "sha512-pxP8eL2SwwaTRi/KHYwLYXinDs7gL3jxFcBYmEdYfZmZXbaVDvdppd0XBU8qVz03rDfKZMXg1omHCbsJjZrMsw=="], + "es-define-property": ["es-define-property@1.0.1", "", {}, "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g=="], "es-errors": ["es-errors@1.3.0", "", {}, "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw=="], @@ -622,6 +640,8 @@ "is-regex": ["is-regex@1.2.1", "", { "dependencies": { "call-bound": "^1.0.2", "gopd": "^1.2.0", "has-tostringtag": "^1.0.2", "hasown": "^2.0.2" } }, "sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g=="], + "is-safe-filename": ["is-safe-filename@0.1.1", "", {}, "sha512-4SrR7AdnY11LHfDKTZY1u6Ga3RuxZdl3YKWWShO5iyuG5h8QS4GD2tOb04peBJ5I7pXbR+CGBNEhTcwK+FzN3g=="], + "is-set": ["is-set@2.0.3", "", {}, "sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg=="], "is-shared-array-buffer": ["is-shared-array-buffer@1.0.4", "", { "dependencies": { "call-bound": "^1.0.3" } }, "sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A=="], @@ -646,6 +666,8 @@ "joi": ["joi@17.13.3", "", { "dependencies": { "@hapi/hoek": "^9.3.0", "@hapi/topo": "^5.1.0", "@sideway/address": "^4.1.5", "@sideway/formula": "^3.0.1", "@sideway/pinpoint": "^2.0.0" } }, "sha512-otDA4ldcIx+ZXsKHWmp0YizCweVRZG96J10b0FevjfuncLO1oX59THoAmHkNubYJ+9gWsYsp5k8v4ib6oDv1fA=="], + "jsbi": ["jsbi@4.3.2", "", {}, "sha512-9fqMSQbhJykSeii05nxKl4m6Eqn2P6rOlYiS+C5Dr/HPIU/7yZxu5qzbs40tgaFORiw2Amd0mirjxatXYMkIew=="], + "jsesc": ["jsesc@3.1.0", "", { "bin": { "jsesc": "bin/jsesc" } }, "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA=="], "json-schema-to-ts": ["json-schema-to-ts@3.1.1", "", { "dependencies": { "@babel/runtime": "^7.18.3", "ts-algebra": "^2.0.0" } }, "sha512-+DWg8jCJG2TEnpy7kOm/7/AxaYoaRbjVB4LFZLySZlWn8exGs3A4OLJR966cVvU26N7X9TWxl+Jsw7dzAqKT6g=="], @@ -844,7 +866,7 @@ "supports-color": ["supports-color@8.1.1", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q=="], - "sv-router": ["sv-router@0.16.0", "", { "dependencies": { "esm-env": "^1.2.2" }, "peerDependencies": { "svelte": "^5" }, "bin": { "sv-router": "src/cli/index.js" } }, "sha512-x5SiV6Hp6GRmGXAgu1H4g/x9oKhVIMeUwYodA+QF1JdzcWsCXsOGyWjcwjSNR+Mw2iiculGPynpys8MfA6PJRA=="], + "sv-router": ["sv-router@0.16.1", "", { "dependencies": { "esm-env": "^1.2.2" }, "peerDependencies": { "svelte": "^5" }, "bin": { "sv-router": "./src/cli/index.js" } }, "sha512-l8Bm29A0KYjWLuzwsny6CjWLXjjXuQYoq/ircOcOG08h81tE2qkTSyZFZAb0lbGslPd3+C7zDSqBAwy86PFkFQ=="], "svelte": ["svelte@5.55.5", "", { "dependencies": { "@jridgewell/remapping": "^2.3.4", "@jridgewell/sourcemap-codec": "^1.5.0", "@sveltejs/acorn-typescript": "^1.0.5", "@types/estree": "^1.0.5", "@types/trusted-types": "^2.0.7", "acorn": "^8.12.1", "aria-query": "5.3.1", "axobject-query": "^4.1.0", "clsx": "^2.1.1", "devalue": "^5.6.4", "esm-env": "^1.2.1", "esrap": "^2.2.4", "is-reference": "^3.0.3", "locate-character": "^3.0.0", "magic-string": "^0.30.11", "zimmerframe": "^1.1.2" } }, "sha512-2uCs/LZ9us+AktdzYJM8OcxQ8qnPS1kpaO7syGT/MgO+6Qr1Ybl+TqPq+97u7PHqmmMlye5ZkoyXONy5mjjAbw=="], @@ -904,7 +926,7 @@ "unconfig-core": ["unconfig-core@7.5.0", "", { "dependencies": { "@quansync/fs": "^1.0.0", "quansync": "^1.0.0" } }, "sha512-Su3FauozOGP44ZmKdHy2oE6LPjk51M/TRRjHv2HNCWiDvfvCoxC2lno6jevMA91MYAdCdwP05QnWdWpSbncX/w=="], - "undici-types": ["undici-types@6.21.0", "", {}, "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ=="], + "undici-types": ["undici-types@7.21.0", "", {}, "sha512-w9IMgQrz4O0YN1LtB7K5P63vhlIOvC7opSmouCJ+ZywlPAlO9gIkJ+otk6LvGpAs2wg4econaCz3TvQ9xPoyuQ=="], "valibot": ["valibot@1.4.0", "", { "peerDependencies": { "typescript": ">=5" }, "optionalPeers": ["typescript"] }, "sha512-iC/x7fVcSyOwlm/VSt7RlHnzNGLGvR9GnxdifUeWoCJo0q4ZZvrVkIHC6faTlkxG47I2Y4UrFquPuVHCrOnrLg=="], @@ -980,8 +1002,12 @@ "@tybys/wasm-util/tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], + "@types/bun/bun-types": ["bun-types@1.3.13", "", { "dependencies": { "@types/node": "*" } }, "sha512-QXKeHLlOLqQX9LgYaHJfzdBaV21T63HhFJnvuRCcjZiaUDpbs5ED1MgxbMra71CsryN/1dAoXuJJJwIv/2drVA=="], + "ast-types/tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], + "bun-types/@types/node": ["@types/node@22.19.15", "", { "dependencies": { "undici-types": "~6.21.0" } }, "sha512-F0R/h2+dsy5wJAUe3tAU6oqa2qbWY5TpNfL/RGmo1y38hiyO1w3x2jPtt76wmuaJI4DQnOBu21cNXQ2STIUUWg=="], + "chalk/supports-color": ["supports-color@7.2.0", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw=="], "d3-dsv/commander": ["commander@7.2.0", "", {}, "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw=="], @@ -1040,6 +1066,10 @@ "@alchemy/wallet-api-types/ox/@noble/hashes": ["@noble/hashes@1.8.0", "", {}, "sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A=="], + "@types/bun/bun-types/@types/node": ["@types/node@22.19.15", "", { "dependencies": { "undici-types": "~6.21.0" } }, "sha512-F0R/h2+dsy5wJAUe3tAU6oqa2qbWY5TpNfL/RGmo1y38hiyO1w3x2jPtt76wmuaJI4DQnOBu21cNXQ2STIUUWg=="], + + "bun-types/@types/node/undici-types": ["undici-types@6.21.0", "", {}, "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ=="], + "d3-sankey/d3-array/internmap": ["internmap@1.0.1", "", {}, "sha512-lDB5YccMydFBtasVtxnZ3MRBHuaoE8GKsppq+EchKL2U4nK/DmEpPHNH8MZe5HkMtpSiTSOZwfN0tzYjO/lJEw=="], "d3-sankey/d3-shape/d3-path": ["d3-path@1.0.9", "", {}, "sha512-VLaYcn81dtHVTjEHd8B+pbe9yHWpXKZUC87PzoFmsFrJqgFwDe/qxfp5MlfsfM1V5E/iVt0MmEbWQ7FVIXh/bg=="], @@ -1133,5 +1163,7 @@ "vite/rolldown/@rolldown/binding-win32-x64-msvc": ["@rolldown/binding-win32-x64-msvc@1.0.0-rc.18", "", { "os": "win32", "cpu": "x64" }, "sha512-7H+3yqGgmnlDTRRhw/xpYY9J1kf4GC681nVc4GqKhExZTDrVVrV2tsOR9kso0fvgBdcTCcQShx4SLLoHgaLwhg=="], "vite/rolldown/@rolldown/pluginutils": ["@rolldown/pluginutils@1.0.0-rc.18", "", {}, "sha512-CUY5Mnhe64xQBGZEEXQ5WyZwsc1JU3vAZLIxtrsBt3LO6UOb+C8GunVKqe9sT8NeWb4lqSaoJtp2xo6GxT1MNw=="], + + "@types/bun/bun-types/@types/node/undici-types": ["undici-types@6.21.0", "", {}, "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ=="], } }