refactor(duckdb-wasm): split into two packages

This commit is contained in:
Neko Ayaka
2025-02-18 12:39:55 +08:00
parent f4deff0afa
commit 19998372a7
21 changed files with 234 additions and 144 deletions
@@ -69,6 +69,7 @@
"dependencies": {
"@date-fns/tz": "^1.2.0",
"@duckdb/duckdb-wasm": "^1.29.0",
"@proj-airi/duckdb-wasm": "workspace:^",
"apache-arrow": "^19.0.0",
"date-fns": "^4.1.0",
"defu": "^6.1.4",
@@ -1,19 +1 @@
import type { DuckDBBundles } from '@duckdb/duckdb-wasm'
export function getBundles(): DuckDBBundles {
return {
mvp: {
mainModule: './duckdb-mvp.wasm',
mainWorker: './duckdb-browser-mvp.worker.js',
},
eh: {
mainModule: './duckdb-eh.wasm',
mainWorker: './duckdb-browser-eh.worker.js',
},
coi: {
mainModule: './duckdb-coi.wasm',
mainWorker: './duckdb-browser-coi.worker.js',
pthreadWorker: './duckdb-browser-coi.pthread.worker.js',
},
}
}
export { getBundles } from '@proj-airi/duckdb-wasm/bundles/default-browser'
@@ -1,19 +1 @@
import type { DuckDBBundles } from '@duckdb/duckdb-wasm'
export async function getBundles(): Promise<DuckDBBundles> {
const { createRequire } = await import('node:module')
const { dirname, resolve } = await import('node:path')
const require = createRequire(import.meta.url)
const DUCKDB_DIST = dirname(require.resolve('@duckdb/duckdb-wasm'))
return {
mvp: {
mainModule: resolve(DUCKDB_DIST, './duckdb-mvp.wasm'),
mainWorker: resolve(DUCKDB_DIST, './duckdb-node-mvp.worker.cjs'),
},
eh: {
mainModule: resolve(DUCKDB_DIST, './duckdb-eh.wasm'),
mainWorker: resolve(DUCKDB_DIST, './duckdb-node-eh.worker.cjs'),
},
}
}
export { getBundles } from '@proj-airi/duckdb-wasm/bundles/default-node'
@@ -1,28 +1 @@
/* eslint-disable perfectionist/sort-imports */
import type { DuckDBBundles } from '@duckdb/duckdb-wasm'
import ehMainWorker from '@duckdb/duckdb-wasm/dist/duckdb-browser-eh.worker.js?url'
import ehMainModule from '@duckdb/duckdb-wasm/dist/duckdb-eh.wasm?url'
import mvpMainWorker from '@duckdb/duckdb-wasm/dist/duckdb-browser-mvp.worker.js?url'
import mvpMainModule from '@duckdb/duckdb-wasm/dist/duckdb-mvp.wasm?url'
import coiMainModule from '@duckdb/duckdb-wasm/dist/duckdb-coi.wasm?url'
import coiMainWorker from '@duckdb/duckdb-wasm/dist/duckdb-browser-coi.worker.js?url'
import coiPthreadWorker from '@duckdb/duckdb-wasm/dist/duckdb-browser-coi.pthread.worker.js?url'
export function getImportUrlBundles(): DuckDBBundles {
return {
mvp: {
mainModule: mvpMainModule,
mainWorker: mvpMainWorker,
},
eh: {
mainModule: ehMainModule,
mainWorker: ehMainWorker,
},
coi: {
mainModule: coiMainModule,
mainWorker: coiMainWorker,
pthreadWorker: coiPthreadWorker,
},
}
}
export { getImportUrlBundles } from '@proj-airi/duckdb-wasm/bundles/import-url-browser'
@@ -1,28 +1 @@
/* eslint-disable perfectionist/sort-imports */
import type { DuckDBBundles } from '@duckdb/duckdb-wasm'
import ehMainWorker from '@duckdb/duckdb-wasm/dist/duckdb-node-eh.worker.cjs?url'
import ehMainModule from '@duckdb/duckdb-wasm/dist/duckdb-eh.wasm?url'
import mvpMainWorker from '@duckdb/duckdb-wasm/dist/duckdb-node-mvp.worker.cjs?url'
import mvpMainModule from '@duckdb/duckdb-wasm/dist/duckdb-mvp.wasm?url'
function transformUrl(url: string) {
if (url.startsWith('/@fs/')) {
return url.replace('/@fs/', 'file://')
}
return url
}
export async function getImportUrlBundles(): Promise<DuckDBBundles> {
return {
mvp: {
mainModule: transformUrl(mvpMainModule),
mainWorker: transformUrl(mvpMainWorker),
},
eh: {
mainModule: transformUrl(ehMainModule),
mainWorker: transformUrl(ehMainWorker),
},
}
}
export { getImportUrlBundles } from '@proj-airi/duckdb-wasm/bundles/import-url-node'
@@ -1,4 +0,0 @@
export * from './duckdb'
export * from './duckdb-common'
export * from './duckdb-format'
export * from './duckdb-types'
+6 -6
View File
@@ -1,13 +1,13 @@
import type { DuckDBBundles, Logger } from '@duckdb/duckdb-wasm'
import type { DuckDBWasmClient } from '@proj-airi/duckdb-wasm'
import type { DrizzleConfig, RelationalSchemaConfig, TablesRelationalConfig } from 'drizzle-orm'
import type { DuckDBWasmClient } from './dialect'
import type { DuckDBWasmQueryResultHKT } from './session'
import { ConsoleLogger } from '@duckdb/duckdb-wasm'
import { connect, getEnvironment } from '@proj-airi/duckdb-wasm'
import { createTableRelationsHelpers, DefaultLogger, entityKind, extractTablesRelationalConfig, isConfig } from 'drizzle-orm'
import { PgDatabase, PgDialect } from 'drizzle-orm/pg-core'
import { connect, getEnvironment } from './dialect'
import { DuckDBWasmSession } from './session'
export class DuckDBWasmDatabase<
@@ -78,13 +78,13 @@ export function drizzle<
return construct(new Promise<DuckDBWasmClient>((resolve) => {
getEnvironment().then((env) => {
if (env === 'browser') {
import('./bundles/import-url-browser')
import('@proj-airi/duckdb-wasm/bundles/import-url-browser')
.then(res => res.getImportUrlBundles())
.then(bundles => connect({ bundles, logger }))
.then(resolve)
}
else if (env === 'node') {
import('./bundles/import-url-node')
import('@proj-airi/duckdb-wasm/bundles/import-url-node')
.then(res => res.getImportUrlBundles())
.then(bundles => connect({ bundles, logger }))
.then(resolve)
@@ -125,13 +125,13 @@ export function drizzle<
return construct(new Promise<DuckDBWasmClient>((resolve) => {
getEnvironment().then((env) => {
if (env === 'browser') {
import('./bundles/import-url-browser')
import('@proj-airi/duckdb-wasm/bundles/import-url-browser')
.then(res => res.getImportUrlBundles())
.then(bundles => connect({ bundles, logger }))
.then(resolve)
}
else if (env === 'node') {
import('./bundles/import-url-node')
import('@proj-airi/duckdb-wasm/bundles/import-url-node')
.then(res => res.getImportUrlBundles())
.then(bundles => connect({ bundles, logger }))
.then(resolve)
@@ -1,7 +1,7 @@
import { getBundles } from '@proj-airi/duckdb-wasm/bundles/default-node'
import { describe, expect, it } from 'vitest'
import { drizzle } from '.'
import { getBundles } from './bundles/default-node'
describe('drizzle', { timeout: 10000 }, async () => {
it('should connect to a DuckDBWasm database', async () => {
+2 -2
View File
@@ -1,7 +1,7 @@
export type { ConnectOptionalOptions, ConnectOptions, ConnectRequiredOptions, DuckDBWasmClient } from './dialect'
export { connect, mapColumnData } from './dialect'
export * from './driver'
export * from './migrator'
export * from './session'
export type { AsyncDuckDBConnection, DuckDBBundles, Logger } from '@duckdb/duckdb-wasm'
export { AsyncDuckDB, ConsoleLogger, getJsDelivrBundles, selectBundle, VoidLogger } from '@duckdb/duckdb-wasm'
export type { ConnectOptionalOptions, ConnectOptions, ConnectRequiredOptions, DuckDBWasmClient } from '@proj-airi/duckdb-wasm'
export { connect, mapColumnData } from '@proj-airi/duckdb-wasm'
+2 -3
View File
@@ -1,13 +1,12 @@
import type { DuckDBWasmClient } from '@proj-airi/duckdb-wasm'
import type { Schema, StructRow } from 'apache-arrow'
import type { Assume, Logger, Query, RelationalSchemaConfig, TablesRelationalConfig } from 'drizzle-orm'
import type { PgDialect, PgQueryResultHKT, PgTransactionConfig, PreparedQueryConfig, SelectedFieldsOrdered } from 'drizzle-orm/pg-core'
import type { DuckDBWasmClient } from './dialect'
import { beginTransaction, mapColumnData, withSavepoint } from '@proj-airi/duckdb-wasm'
import { entityKind, fillPlaceholders, NoopLogger } from 'drizzle-orm'
import { PgPreparedQuery, PgSession, PgTransaction } from 'drizzle-orm/pg-core'
import { beginTransaction, mapColumnData, withSavepoint } from './dialect'
export type Row = Record<string, any>
export type RowList<T extends Row[]> = T
+77
View File
@@ -0,0 +1,77 @@
{
"name": "@proj-airi/duckdb-wasm",
"type": "module",
"version": "0.1.6",
"private": true,
"description": "",
"author": {
"name": "Neko Ayaka",
"email": "neko@ayaka.moe",
"url": "https://github.com/nekomeowww"
},
"license": "MIT",
"repository": {
"type": "git",
"url": "https://github.com/moeru-ai/airi.git",
"directory": "packages/duckdb-wasm"
},
"exports": {
".": {
"types": "./dist/index.d.ts",
"import": "./dist/index.mjs",
"node": "./dist/index.cjs"
},
"./bundles/default-browser": {
"types": "./dist/bundles/default-browser.d.ts",
"import": "./dist/bundles/default-browser.mjs"
},
"./bundles/default-node": {
"types": "./dist/bundles/default-node.d.ts",
"import": "./dist/bundles/default-node.mjs",
"node": "./dist/bundles/default-node.cjs"
},
"./bundles/import-url-browser": {
"types": "./dist/bundles/import-url-browser.d.ts",
"import": "./dist/bundles/import-url-browser.mjs"
},
"./bundles/import-url-node": {
"types": "./dist/bundles/import-url-node.d.ts",
"import": "./dist/bundles/import-url-node.mjs",
"node": "./dist/bundles/import-url-node.cjs"
}
},
"main": "./dist/index.cjs",
"module": "./dist/index.mjs",
"types": "./dist/index.d.ts",
"files": [
"README.md",
"dist",
"package.json"
],
"scripts": {
"dev": "pnpm run stub && pnpm run play:dev",
"stub": "unbuild --stub",
"build": "unbuild && pnpm run play:build",
"typecheck": "tsc --noEmit"
},
"peerDependencies": {
"web-worker": "^1.5.0"
},
"peerDependenciesMeta": {
"web-worker": {
"optional": true
}
},
"dependencies": {
"@date-fns/tz": "^1.2.0",
"@duckdb/duckdb-wasm": "^1.29.0",
"apache-arrow": "^19.0.0",
"date-fns": "^4.1.0",
"defu": "^6.1.4",
"drizzle-orm": "^0.39.2",
"es-toolkit": "^1.32.0"
},
"devDependencies": {
"drizzle-kit": "^0.30.4"
}
}
@@ -0,0 +1,19 @@
import type { DuckDBBundles } from '@duckdb/duckdb-wasm'
export function getBundles(): DuckDBBundles {
return {
mvp: {
mainModule: './duckdb-mvp.wasm',
mainWorker: './duckdb-browser-mvp.worker.js',
},
eh: {
mainModule: './duckdb-eh.wasm',
mainWorker: './duckdb-browser-eh.worker.js',
},
coi: {
mainModule: './duckdb-coi.wasm',
mainWorker: './duckdb-browser-coi.worker.js',
pthreadWorker: './duckdb-browser-coi.pthread.worker.js',
},
}
}
@@ -0,0 +1,19 @@
import type { DuckDBBundles } from '@duckdb/duckdb-wasm'
export async function getBundles(): Promise<DuckDBBundles> {
const { createRequire } = await import('node:module')
const { dirname, resolve } = await import('node:path')
const require = createRequire(import.meta.url)
const DUCKDB_DIST = dirname(require.resolve('@duckdb/duckdb-wasm'))
return {
mvp: {
mainModule: resolve(DUCKDB_DIST, './duckdb-mvp.wasm'),
mainWorker: resolve(DUCKDB_DIST, './duckdb-node-mvp.worker.cjs'),
},
eh: {
mainModule: resolve(DUCKDB_DIST, './duckdb-eh.wasm'),
mainWorker: resolve(DUCKDB_DIST, './duckdb-node-eh.worker.cjs'),
},
}
}
@@ -0,0 +1,28 @@
/* eslint-disable perfectionist/sort-imports */
import type { DuckDBBundles } from '@duckdb/duckdb-wasm'
import ehMainWorker from '@duckdb/duckdb-wasm/dist/duckdb-browser-eh.worker.js?url'
import ehMainModule from '@duckdb/duckdb-wasm/dist/duckdb-eh.wasm?url'
import mvpMainWorker from '@duckdb/duckdb-wasm/dist/duckdb-browser-mvp.worker.js?url'
import mvpMainModule from '@duckdb/duckdb-wasm/dist/duckdb-mvp.wasm?url'
import coiMainModule from '@duckdb/duckdb-wasm/dist/duckdb-coi.wasm?url'
import coiMainWorker from '@duckdb/duckdb-wasm/dist/duckdb-browser-coi.worker.js?url'
import coiPthreadWorker from '@duckdb/duckdb-wasm/dist/duckdb-browser-coi.pthread.worker.js?url'
export function getImportUrlBundles(): DuckDBBundles {
return {
mvp: {
mainModule: mvpMainModule,
mainWorker: mvpMainWorker,
},
eh: {
mainModule: ehMainModule,
mainWorker: ehMainWorker,
},
coi: {
mainModule: coiMainModule,
mainWorker: coiMainWorker,
pthreadWorker: coiPthreadWorker,
},
}
}
@@ -0,0 +1,28 @@
/* eslint-disable perfectionist/sort-imports */
import type { DuckDBBundles } from '@duckdb/duckdb-wasm'
import ehMainWorker from '@duckdb/duckdb-wasm/dist/duckdb-node-eh.worker.cjs?url'
import ehMainModule from '@duckdb/duckdb-wasm/dist/duckdb-eh.wasm?url'
import mvpMainWorker from '@duckdb/duckdb-wasm/dist/duckdb-node-mvp.worker.cjs?url'
import mvpMainModule from '@duckdb/duckdb-wasm/dist/duckdb-mvp.wasm?url'
function transformUrl(url: string) {
if (url.startsWith('/@fs/')) {
return url.replace('/@fs/', 'file://')
}
return url
}
export async function getImportUrlBundles(): Promise<DuckDBBundles> {
return {
mvp: {
mainModule: transformUrl(mvpMainModule),
mainWorker: transformUrl(mvpMainWorker),
},
eh: {
mainModule: transformUrl(ehMainModule),
mainWorker: transformUrl(ehMainWorker),
},
}
}
@@ -1,6 +1,6 @@
import type { TZDate } from '@date-fns/tz'
import type { Field, StructRow } from 'apache-arrow'
import type { DataType } from './duckdb-types'
import type { DataType } from './types'
import { TZDateMini } from '@date-fns/tz'
import { DataType as ArrowDataType, IntervalUnit, Struct, TimeUnit, util } from 'apache-arrow'
@@ -22,7 +22,7 @@ import {
} from 'date-fns'
import { trimEnd } from 'es-toolkit'
import { isNullOrUndefined, notNullOrUndefined } from './duckdb-common'
import { isNullOrUndefined, notNullOrUndefined } from './common'
import {
isBooleanType,
isDatetimeType,
@@ -36,7 +36,7 @@ import {
isObjectType,
isPeriodType,
isTimeType,
} from './duckdb-types'
} from './types'
/**
* The frequency strings defined in pandas.
+4
View File
@@ -0,0 +1,4 @@
export * from './common'
export * from './duckdb'
export * from './format'
export * from './types'
@@ -2,7 +2,7 @@ import type { Dictionary, Field, Struct, StructRow, Vector } from 'apache-arrow'
import { DataType as ArrowDataType } from 'apache-arrow'
import { isNullOrUndefined } from './duckdb-common'
import { isNullOrUndefined } from './common'
/** Data types used by ArrowJS. */
export type DataType =
@@ -35,11 +35,12 @@ export enum DataFrameCellType {
* @returns The list of strings.
*/
export function convertVectorToList(vector: Vector<any>): string[] {
const values = []
const values: string[] = []
for (let i = 0; i < vector.length; i++) {
values.push(vector.get(i))
}
return values
}
+37 -29
View File
@@ -122,6 +122,9 @@ importers:
'@duckdb/duckdb-wasm':
specifier: ^1.29.0
version: 1.29.0
'@proj-airi/duckdb-wasm':
specifier: workspace:^
version: link:../duckdb-wasm
apache-arrow:
specifier: ^19.0.0
version: 19.0.0
@@ -166,6 +169,37 @@ importers:
specifier: ^2.2.0
version: 2.2.0(typescript@5.7.3)
packages/duckdb-wasm:
dependencies:
'@date-fns/tz':
specifier: ^1.2.0
version: 1.2.0
'@duckdb/duckdb-wasm':
specifier: ^1.29.0
version: 1.29.0
apache-arrow:
specifier: ^19.0.0
version: 19.0.0
date-fns:
specifier: ^4.1.0
version: 4.1.0
defu:
specifier: ^6.1.4
version: 6.1.4
drizzle-orm:
specifier: ^0.39.2
version: 0.39.2(@types/pg@8.11.11)(pg@8.13.1)(react@18.3.1)
es-toolkit:
specifier: ^1.32.0
version: 1.32.0
web-worker:
specifier: ^1.5.0
version: 1.5.0
devDependencies:
drizzle-kit:
specifier: ^0.30.4
version: 0.30.4
packages/elevenlabs:
devDependencies:
elevenlabs:
@@ -1032,7 +1066,7 @@ importers:
version: 1.35.0
'@gcornut/valibot-json-schema':
specifier: ^0.42.0
version: 0.42.0(esbuild@0.19.12)(typescript@5.7.3)
version: 0.42.0(esbuild@0.25.0)(typescript@5.7.3)
'@grammyjs/files':
specifier: ^1.1.1
version: 1.1.1(grammy@1.34.1(encoding@0.1.13))
@@ -1041,7 +1075,7 @@ importers:
version: 1.0.7
'@typeschema/valibot':
specifier: ^0.14.0
version: 0.14.0(@gcornut/valibot-json-schema@0.42.0(esbuild@0.19.12)(typescript@5.7.3))(@types/json-schema@7.0.15)(valibot@1.0.0-beta.9(typescript@5.7.3))
version: 0.14.0(@gcornut/valibot-json-schema@0.42.0(esbuild@0.25.0)(typescript@5.7.3))(@types/json-schema@7.0.15)(valibot@1.0.0-beta.9(typescript@5.7.3))
'@xsai/generate-text':
specifier: 'catalog:'
version: 0.1.0-beta.2
@@ -13090,16 +13124,6 @@ snapshots:
'@formkit/auto-animate@0.8.2': {}
'@gcornut/valibot-json-schema@0.42.0(esbuild@0.19.12)(typescript@5.7.3)':
dependencies:
valibot: 0.42.1(typescript@5.7.3)
optionalDependencies:
'@types/json-schema': 7.0.15
esbuild-runner: 2.2.2(esbuild@0.19.12)
transitivePeerDependencies:
- esbuild
- typescript
'@gcornut/valibot-json-schema@0.42.0(esbuild@0.25.0)(typescript@5.7.3)':
dependencies:
valibot: 0.42.1(typescript@5.7.3)
@@ -14611,20 +14635,11 @@ snapshots:
dependencies:
'@typeschema/core': 0.14.0(@types/json-schema@7.0.15)
optionalDependencies:
'@typeschema/valibot': 0.14.0(@gcornut/valibot-json-schema@0.42.0(esbuild@0.19.12)(typescript@5.7.3))(@types/json-schema@7.0.15)(valibot@1.0.0-beta.9(typescript@5.7.3))
'@typeschema/valibot': 0.14.0(@gcornut/valibot-json-schema@0.42.0(esbuild@0.25.0)(typescript@5.7.3))(@types/json-schema@7.0.15)(valibot@1.0.0-beta.9(typescript@5.7.3))
'@typeschema/zod': 0.14.0(@types/json-schema@7.0.15)(zod-to-json-schema@3.24.1(zod@3.24.1))(zod@3.24.1)
transitivePeerDependencies:
- '@types/json-schema'
'@typeschema/valibot@0.14.0(@gcornut/valibot-json-schema@0.42.0(esbuild@0.19.12)(typescript@5.7.3))(@types/json-schema@7.0.15)(valibot@1.0.0-beta.9(typescript@5.7.3))':
dependencies:
'@typeschema/core': 0.14.0(@types/json-schema@7.0.15)
optionalDependencies:
'@gcornut/valibot-json-schema': 0.42.0(esbuild@0.19.12)(typescript@5.7.3)
valibot: 1.0.0-beta.9(typescript@5.7.3)
transitivePeerDependencies:
- '@types/json-schema'
'@typeschema/valibot@0.14.0(@gcornut/valibot-json-schema@0.42.0(esbuild@0.25.0)(typescript@5.7.3))(@types/json-schema@7.0.15)(valibot@1.0.0-beta.9(typescript@5.7.3))':
dependencies:
'@typeschema/core': 0.14.0(@types/json-schema@7.0.15)
@@ -17236,13 +17251,6 @@ snapshots:
transitivePeerDependencies:
- supports-color
esbuild-runner@2.2.2(esbuild@0.19.12):
dependencies:
esbuild: 0.19.12
source-map-support: 0.5.21
tslib: 2.4.0
optional: true
esbuild-runner@2.2.2(esbuild@0.25.0):
dependencies:
esbuild: 0.25.0