diff --git a/packages/cubejs-docker/latest-debian-jdk.Dockerfile b/packages/cubejs-docker/latest-debian-jdk.Dockerfile index 76f756b8421d9..c729a8ac9d453 100644 --- a/packages/cubejs-docker/latest-debian-jdk.Dockerfile +++ b/packages/cubejs-docker/latest-debian-jdk.Dockerfile @@ -18,8 +18,6 @@ RUN apt-get update \ # We are copying root yarn.lock file to the context folder during the Publish GH # action. So, a process will use the root lock file here. RUN yarn install --prod \ - # Remove DuckDB sources to reduce image size - && rm -rf /cube/node_modules/duckdb/src \ && yarn cache clean FROM node:22.22.0-bookworm-slim diff --git a/packages/cubejs-docker/latest.Dockerfile b/packages/cubejs-docker/latest.Dockerfile index 78f1b59be2af0..01578a9ff4101 100644 --- a/packages/cubejs-docker/latest.Dockerfile +++ b/packages/cubejs-docker/latest.Dockerfile @@ -17,8 +17,6 @@ RUN apt-get update \ # We are copying root yarn.lock file to the context folder during the Publish GH # action. So, a process will use the root lock file here. RUN yarn install --prod \ - # Remove DuckDB sources to reduce image size - && rm -rf /cube/node_modules/duckdb/src \ && yarn cache clean FROM node:22.22.0-bookworm-slim diff --git a/packages/cubejs-duckdb-driver/package.json b/packages/cubejs-duckdb-driver/package.json index b8ac4a7784860..549bc99d120ac 100644 --- a/packages/cubejs-duckdb-driver/package.json +++ b/packages/cubejs-duckdb-driver/package.json @@ -30,7 +30,7 @@ "@cubejs-backend/base-driver": "1.6.64", "@cubejs-backend/schema-compiler": "1.6.64", "@cubejs-backend/shared": "1.6.64", - "duckdb": "^1.4.1" + "@duckdb/node-api": "1.5.4-r.1" }, "license": "Apache-2.0", "devDependencies": { diff --git a/packages/cubejs-duckdb-driver/src/DuckDBDriver.ts b/packages/cubejs-duckdb-driver/src/DuckDBDriver.ts index 7819873cf5020..d1f67b7f0503c 100644 --- a/packages/cubejs-duckdb-driver/src/DuckDBDriver.ts +++ b/packages/cubejs-duckdb-driver/src/DuckDBDriver.ts @@ -5,13 +5,10 @@ import { QueryOptions, StreamTableData, GenericDataBaseType, - TableStructure, - TableColumnQueryResult, } from '@cubejs-backend/base-driver'; import { getEnv } from '@cubejs-backend/shared'; -import { promisify } from 'util'; import * as stream from 'stream'; -import { Connection, Database } from 'duckdb'; +import { DuckDBConnection, DuckDBInstance, DuckDBValue, timestampMillisValue } from '@duckdb/node-api'; import { DuckDBQuery } from './DuckDBQuery'; import { HydrationStream, transformRow } from './HydrationStream'; @@ -29,10 +26,16 @@ export type DuckDBDriverConfiguration = { }; type InitPromise = { - defaultConnection: Connection, - db: Database; + defaultConnection: DuckDBConnection, + instance: DuckDBInstance; }; +type ExecFn = (sql: string) => Promise; + +const normalizeValues = (values: unknown[] = []): DuckDBValue[] => values.map( + value => (value instanceof Date ? timestampMillisValue(BigInt(value.getTime())) : value as DuckDBValue) +); + const DuckDBToGenericType: Record = { // DATE_TRUNC returns DATE, but Cube Store still doesn't support DATE type // DuckDB's driver transform date/timestamp to Date object, but HydrationStream converts any Date object to ISO timestamp @@ -64,7 +67,7 @@ export class DuckDBDriver extends BaseDriver implements DriverInterface { return DuckDBToGenericType[columnType.toLowerCase()] || super.toGenericType(columnType.toLowerCase(), precision, scale); } - private async installExtensions(extensions: string[], execAsync: (sql: string, ...params: any[]) => Promise, repository: string = ''): Promise { + private async installExtensions(extensions: string[], execAsync: ExecFn, repository: string = ''): Promise { repository = repository ? ` FROM ${repository}` : ''; for (const extension of extensions) { try { @@ -79,7 +82,7 @@ export class DuckDBDriver extends BaseDriver implements DriverInterface { } } - private async loadExtensions(extensions: string[], execAsync: (sql: string, ...params: any[]) => Promise): Promise { + private async loadExtensions(extensions: string[], execAsync: ExecFn): Promise { for (const extension of extensions) { try { await execAsync(`LOAD ${extension}`); @@ -106,17 +109,16 @@ export class DuckDBDriver extends BaseDriver implements DriverInterface { dbUrl = ':memory:'; } - let dbOptions; + let dbOptions: Record | undefined; if (token) { dbOptions = { custom_user_agent: `Cube/${version}` }; } - // Create a new Database instance with the determined URL and custom user agent - const db = new Database(dbUrl, dbOptions); + // Create a new DuckDB instance with the determined URL and custom user agent + const instance = await DuckDBInstance.create(dbUrl, dbOptions); - // Under the hood all methods of Database uses internal default connection, but there is no way to expose it - const defaultConnection = db.connect(); - const execAsync: (sql: string, ...params: any[]) => Promise = promisify(defaultConnection.exec).bind(defaultConnection) as any; + const defaultConnection = await instance.connect(); + const execAsync: ExecFn = (sql: string) => defaultConnection.run(sql); const configuration = [ { @@ -206,7 +208,7 @@ export class DuckDBDriver extends BaseDriver implements DriverInterface { return { defaultConnection, - db + instance }; } @@ -250,13 +252,15 @@ export class DuckDBDriver extends BaseDriver implements DriverInterface { public async query(query: string, values: unknown[] = [], _options?: QueryOptions): Promise { const { defaultConnection } = await this.getInitiatedState(); - const fetchAsync: (sql: string, ...params: any[]) => Promise = promisify(defaultConnection.all).bind(defaultConnection) as any; - const result = await fetchAsync(query, ...values); - return result.map((item) => { + const reader = await defaultConnection.runAndReadAll(query, normalizeValues(values)); + // getRowObjectsJS returns JS built-ins (numbers, bigints, Dates, strings), + // which HydrationStream's transformRow normalizes into Cube's expected shape. + const rows = reader.getRowObjectsJS(); + return rows.map((item) => { transformRow(item); - return item; + return item as R; }); } @@ -265,26 +269,36 @@ export class DuckDBDriver extends BaseDriver implements DriverInterface { values: unknown[], { highWaterMark }: StreamOptions ): Promise { - const { db } = await this.getInitiatedState(); + const { instance } = await this.getInitiatedState(); // new connection, because stream can break with // Attempting to execute an unsuccessful or closed pending query result // PreAggregation queue has a concurrency limit, it's why pool is not needed here - const connection = db.connect(); - const closeAsync = promisify(connection.close).bind(connection); + const connection = await instance.connect(); try { - const asyncIterator = connection.stream(query, ...(values || [])); - const rowStream = stream.Readable.from(asyncIterator, { highWaterMark }).pipe(new HydrationStream()); + const result = await connection.stream(query, normalizeValues(values)); + + // yieldRowObjectJs yields one array of JS-converted row objects per chunk; + // flatten to a row-at-a-time async iterable for the Readable stream. + const rowIterator = async function* rows(): AsyncGenerator> { + for await (const chunk of result.yieldRowObjectJs()) { + for (const row of chunk) { + yield row; + } + } + }; + + const rowStream = stream.Readable.from(rowIterator(), { highWaterMark }).pipe(new HydrationStream()); return { rowStream, release: async () => { - await closeAsync(); + connection.closeSync(); } }; } catch (e) { - await closeAsync(); + connection.closeSync(); throw e; } @@ -300,11 +314,11 @@ export class DuckDBDriver extends BaseDriver implements DriverInterface { public async release(): Promise { if (this.initPromise) { - const { db } = await this.initPromise; - const close = promisify(db.close).bind(db); + const { defaultConnection, instance } = await this.initPromise; this.initPromise = null; - await close(); + defaultConnection.closeSync(); + instance.closeSync(); } } } diff --git a/packages/cubejs-duckdb-driver/test/DuckDBDriver.test.ts b/packages/cubejs-duckdb-driver/test/DuckDBDriver.test.ts index b31bfc17af272..d555bbc46fb1c 100644 --- a/packages/cubejs-duckdb-driver/test/DuckDBDriver.test.ts +++ b/packages/cubejs-duckdb-driver/test/DuckDBDriver.test.ts @@ -40,6 +40,14 @@ describe('DuckDBDriver', () => { ]); }); + test('query with Date parameter', async () => { + const result = await driver.query('SELECT ?::TIMESTAMP AS created', [new Date('2020-04-04T04:04:04.444Z')]); + + expect(result).toEqual([ + { created: '2020-04-04T04:04:04.444Z' } + ]); + }); + test('column types', async () => { expect(await driver.tableColumnTypes('test.select_test')).toEqual([ { @@ -73,4 +81,14 @@ describe('DuckDBDriver', () => { { id: '3', created: '2020-03-03T03:03:03.333Z', created_date: '2020-03-03T00:00:00.000Z', price: '300' } ]); }); + + test('stream with Date parameter', async () => { + const tableData = await driver.stream('SELECT ?::TIMESTAMP AS created', [new Date('2020-04-04T04:04:04.444Z')], { + highWaterMark: 1000, + }); + + expect(await streamToArray(tableData.rowStream as any)).toEqual([ + { created: '2020-04-04T04:04:04.444Z' } + ]); + }); }); diff --git a/yarn.lock b/yarn.lock index 5cef89e2c08a8..44b9dee4807d5 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2899,6 +2899,69 @@ resolved "https://registry.yarnpkg.com/@discoveryjs/json-ext/-/json-ext-0.6.1.tgz#593da7a17a31a72a874e313677183334a49b01c9" integrity sha512-boghen8F0Q8D+0/Q1/1r6DUEieUJ8w2a1gIknExMSHBsJFOr2+0KUfHiVYBvucPwl3+RU5PFBK833FjFCh3BhA== +"@duckdb/node-api@1.5.4-r.1": + version "1.5.4-r.1" + resolved "https://registry.yarnpkg.com/@duckdb/node-api/-/node-api-1.5.4-r.1.tgz#1c6a6c3e0c11243be97f74d02bfa2e153c28265b" + integrity sha512-3PYk/4//svuYmb9RYVM71cCoNa6ngoYWwrMhJaqbm010txzIMWbJCbxrFeqDl+krdIug+Hc/MNCeS0gHsTXSIw== + dependencies: + "@duckdb/node-bindings" "1.5.4-r.1" + +"@duckdb/node-bindings-darwin-arm64@1.5.4-r.1": + version "1.5.4-r.1" + resolved "https://registry.yarnpkg.com/@duckdb/node-bindings-darwin-arm64/-/node-bindings-darwin-arm64-1.5.4-r.1.tgz#751a9ae637b626a3aaf8116f72a185fb106dc0bb" + integrity sha512-fl8EC5xdmI7VAI7bX4W6D7lOGNtxyLvSxGjOY8Ov7viVEKwIcBXXKlMPgh3sw+PiVlwZhKlknuCI8BL5xXpSDg== + +"@duckdb/node-bindings-darwin-x64@1.5.4-r.1": + version "1.5.4-r.1" + resolved "https://registry.yarnpkg.com/@duckdb/node-bindings-darwin-x64/-/node-bindings-darwin-x64-1.5.4-r.1.tgz#26d5a7aa1b7789a13189c12cc0e417d28568b615" + integrity sha512-E8bECZ6abJqunPqVR1NA0Zho7qxanfDWWFuJrKMsU1NCUqyGLyhXqZwsRHAx7J6jrM+lhQ7wOZj1x/N4OVml3A== + +"@duckdb/node-bindings-linux-arm64-musl@1.5.4-r.1": + version "1.5.4-r.1" + resolved "https://registry.yarnpkg.com/@duckdb/node-bindings-linux-arm64-musl/-/node-bindings-linux-arm64-musl-1.5.4-r.1.tgz#3160ebbdfb178877465eacc902f30d64ccfa8ba7" + integrity sha512-96Pyk5Syy18S5DSN0CKkOQ7/CsyVGRML8ewox1qpFDjYvPH1VsULlQoIRwbpw7mkFEy17wuWmbwzb7oKu/nGMw== + +"@duckdb/node-bindings-linux-arm64@1.5.4-r.1": + version "1.5.4-r.1" + resolved "https://registry.yarnpkg.com/@duckdb/node-bindings-linux-arm64/-/node-bindings-linux-arm64-1.5.4-r.1.tgz#5c38d6cc5ecac687d9dacfe9bd28f00d9efd4c3f" + integrity sha512-4EsB+cgRqOE++mdPQ2ZoGJCg4ylmuqdbLDtmo3L19B+C5OzGmrhxlKD4o75eGEtfO52M+w+TdL0qhy0H5XvaKQ== + +"@duckdb/node-bindings-linux-x64-musl@1.5.4-r.1": + version "1.5.4-r.1" + resolved "https://registry.yarnpkg.com/@duckdb/node-bindings-linux-x64-musl/-/node-bindings-linux-x64-musl-1.5.4-r.1.tgz#e6a9a72c6479bc6620ed38838dbeb7a1a23cadd1" + integrity sha512-tWgnttlKfWTktyv+m9YbxaedKBon5wmUoJ9DaIbE3D98KhhUaqmJhnjzso9O8hp6WUeRmwXR//hpT/X6Ft9nYA== + +"@duckdb/node-bindings-linux-x64@1.5.4-r.1": + version "1.5.4-r.1" + resolved "https://registry.yarnpkg.com/@duckdb/node-bindings-linux-x64/-/node-bindings-linux-x64-1.5.4-r.1.tgz#22d83876cde13ab52cd2159d21d068da9101b7a1" + integrity sha512-IldapRydno5kf4VkPCe8yK+j4pCg+j6Qs46UmLnKex/mtIdJa7ifhMYRkvdc5KIAFEC0eEL5c830QeuwcUROyg== + +"@duckdb/node-bindings-win32-arm64@1.5.4-r.1": + version "1.5.4-r.1" + resolved "https://registry.yarnpkg.com/@duckdb/node-bindings-win32-arm64/-/node-bindings-win32-arm64-1.5.4-r.1.tgz#6e74798265e75abb2d16bac0ddac5b8f49a2fcee" + integrity sha512-77apmuNo51bPZzv8xjdeCp+hlU6JLwMPtS1CMViy83ONTsah+CGnpBx1lCnEqPL5Va0meufZyjSdZCVCijLdDA== + +"@duckdb/node-bindings-win32-x64@1.5.4-r.1": + version "1.5.4-r.1" + resolved "https://registry.yarnpkg.com/@duckdb/node-bindings-win32-x64/-/node-bindings-win32-x64-1.5.4-r.1.tgz#c97638bcbcc472a4428d844ca94d4b8d3fcd918e" + integrity sha512-Wme7dScBGqjn2PUJ+RLFiFAblW1qQRBraX7SJc4uKtftZiUJJWZapEUh+doGfb68Qxvw8JhlMBSdaUsSUDJYsw== + +"@duckdb/node-bindings@1.5.4-r.1": + version "1.5.4-r.1" + resolved "https://registry.yarnpkg.com/@duckdb/node-bindings/-/node-bindings-1.5.4-r.1.tgz#1dd1e6389b580721b9e23d0afbdb3003731318cb" + integrity sha512-v834OZZKQ59yAvh8GOEmM+R1foPNgdMGL0VTBgHywgblgQNyq11HvWgT4QGJIUFfo/cQ9WFyf1MFhK0+hV1aiA== + dependencies: + detect-libc "^2.1.2" + optionalDependencies: + "@duckdb/node-bindings-darwin-arm64" "1.5.4-r.1" + "@duckdb/node-bindings-darwin-x64" "1.5.4-r.1" + "@duckdb/node-bindings-linux-arm64" "1.5.4-r.1" + "@duckdb/node-bindings-linux-arm64-musl" "1.5.4-r.1" + "@duckdb/node-bindings-linux-x64" "1.5.4-r.1" + "@duckdb/node-bindings-linux-x64-musl" "1.5.4-r.1" + "@duckdb/node-bindings-win32-arm64" "1.5.4-r.1" + "@duckdb/node-bindings-win32-x64" "1.5.4-r.1" + "@elastic/elasticsearch@7.12.0": version "7.12.0" resolved "https://registry.yarnpkg.com/@elastic/elasticsearch/-/elasticsearch-7.12.0.tgz#dbb51a2841f644b670a56d8c15899e860928856f" @@ -3417,7 +3480,7 @@ dependencies: tslib "^2.4.0" -"@gar/promisify@^1.0.1", "@gar/promisify@^1.1.3": +"@gar/promisify@^1.0.1": version "1.1.3" resolved "https://registry.yarnpkg.com/@gar/promisify/-/promisify-1.1.3.tgz#555193ab2e3bb3b6adc3d551c9c030d9e860daf6" integrity sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw== @@ -4713,19 +4776,6 @@ resolved "https://registry.yarnpkg.com/@lmdb/lmdb-win32-x64/-/lmdb-win32-x64-3.0.13.tgz#93bcd6dc24afd1cc60dd88a65b9e4fab32dcf397" integrity sha512-UCrMJQY/gJnOl3XgbWRZZUvGGBuKy6i0YNSptgMzHBjs+QYDYR1Mt/RLTOPy4fzzves65O1EDmlL//OzEqoLlA== -"@mapbox/node-pre-gyp@^2.0.0": - version "2.0.0" - resolved "https://registry.yarnpkg.com/@mapbox/node-pre-gyp/-/node-pre-gyp-2.0.0.tgz#16d1d9049c0218820da81a12ae084e7fe67790d1" - integrity sha512-llMXd39jtP0HpQLVI37Bf1m2ADlEb35GYSh1SDSLsBhR+5iCxiNGlT31yqbNtVHygHAtMy6dWFERpU2JgufhPg== - dependencies: - consola "^3.2.3" - detect-libc "^2.0.0" - https-proxy-agent "^7.0.5" - node-fetch "^2.6.7" - nopt "^8.0.0" - semver "^7.5.3" - tar "^7.4.0" - "@msgpackr-extract/msgpackr-extract-darwin-arm64@3.0.3": version "3.0.3" resolved "https://registry.yarnpkg.com/@msgpackr-extract/msgpackr-extract-darwin-arm64/-/msgpackr-extract-darwin-arm64-3.0.3.tgz#9edec61b22c3082018a79f6d1c30289ddf3d9d11" @@ -4997,14 +5047,6 @@ "@gar/promisify" "^1.0.1" semver "^7.3.5" -"@npmcli/fs@^2.1.0": - version "2.1.2" - resolved "https://registry.yarnpkg.com/@npmcli/fs/-/fs-2.1.2.tgz#a9e2541a4a2fec2e69c29b35e6060973da79b865" - integrity sha512-yOJKRvohFOaLqipNtwYB9WugyZKhC/DZC4VYPmpaCzDBrA8YpK3qHZ8/HGscMnE4GqbkLNuVcCnxkeQEdGt6LQ== - dependencies: - "@gar/promisify" "^1.1.3" - semver "^7.3.5" - "@npmcli/fs@^3.1.0": version "3.1.1" resolved "https://registry.yarnpkg.com/@npmcli/fs/-/fs-3.1.1.tgz#59cdaa5adca95d135fc00f2bb53f5771575ce726" @@ -5122,14 +5164,6 @@ mkdirp "^1.0.4" rimraf "^3.0.2" -"@npmcli/move-file@^2.0.0": - version "2.0.1" - resolved "https://registry.yarnpkg.com/@npmcli/move-file/-/move-file-2.0.1.tgz#26f6bdc379d87f75e55739bab89db525b06100e4" - integrity sha512-mJd2Z5TjYWq/ttPLLGqArdtnC74J6bOzg4rMDnN+p1xTacZ2yPRCk2y0oSWQtygLR9YVQXgOcONrwtnk3JupxQ== - dependencies: - mkdirp "^1.0.4" - rimraf "^3.0.2" - "@npmcli/name-from-folder@^3.0.0": version "3.0.0" resolved "https://registry.yarnpkg.com/@npmcli/name-from-folder/-/name-from-folder-3.0.0.tgz#ed49b18d16b954149f31240e16630cfec511cd57" @@ -9766,7 +9800,7 @@ abab@^2.0.6: resolved "https://registry.yarnpkg.com/abab/-/abab-2.0.6.tgz#41b80f2c871d19686216b82309231cfd3cb3d291" integrity sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA== -abbrev@1, abbrev@^1.0.0: +abbrev@1: version "1.1.1" resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" integrity sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q== @@ -9895,7 +9929,7 @@ agent-base@^7.0.2, agent-base@^7.1.0, agent-base@^7.1.2: resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-7.1.3.tgz#29435eb821bc4194633a5b89e5bc4703bafc25a1" integrity sha512-jRR5wdylq8CkOe6hei19GGZnxM6rBGwFl3Bg0YItGDimvjGtAvdZk4Pu6Cl4u4Igsws4a1fd1Vq3ezrhn4KmFw== -agentkeepalive@^4.1.3, agentkeepalive@^4.2.1, agentkeepalive@^4.5.0: +agentkeepalive@^4.1.3, agentkeepalive@^4.5.0: version "4.5.0" resolved "https://registry.yarnpkg.com/agentkeepalive/-/agentkeepalive-4.5.0.tgz#2673ad1389b3c418c5a20c5d7364f93ca04be923" integrity sha512-5GG/5IbQQpC9FpkRGsSvZI5QYeSCzlJHdpBQntCsuTOxhKD8lqKhrleg2Yi7yvMIf82Ycmmqln9U8V9qwEiJew== @@ -11115,30 +11149,6 @@ cacache@^15.2.0: tar "^6.0.2" unique-filename "^1.1.1" -cacache@^16.1.0: - version "16.1.3" - resolved "https://registry.yarnpkg.com/cacache/-/cacache-16.1.3.tgz#a02b9f34ecfaf9a78c9f4bc16fceb94d5d67a38e" - integrity sha512-/+Emcj9DAXxX4cwlLmRI9c166RuL3w30zp4R7Joiv2cQTtTtA+jeuCAjH3ZlGnYS3tKENSrKhAzVVP9GVyzeYQ== - dependencies: - "@npmcli/fs" "^2.1.0" - "@npmcli/move-file" "^2.0.0" - chownr "^2.0.0" - fs-minipass "^2.1.0" - glob "^8.0.1" - infer-owner "^1.0.4" - lru-cache "^7.7.1" - minipass "^3.1.6" - minipass-collect "^1.0.2" - minipass-flush "^1.0.5" - minipass-pipeline "^1.2.4" - mkdirp "^1.0.4" - p-map "^4.0.0" - promise-inflight "^1.0.1" - rimraf "^3.0.2" - ssri "^9.0.0" - tar "^6.1.11" - unique-filename "^2.0.0" - cacache@^18.0.0: version "18.0.4" resolved "https://registry.yarnpkg.com/cacache/-/cacache-18.0.4.tgz#4601d7578dadb59c66044e157d02a3314682d6a5" @@ -11927,11 +11937,6 @@ connect-history-api-fallback@^2.0.0: resolved "https://registry.yarnpkg.com/connect-history-api-fallback/-/connect-history-api-fallback-2.0.0.tgz#647264845251a0daf25b97ce87834cace0f5f1c8" integrity sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA== -consola@^3.2.3: - version "3.4.2" - resolved "https://registry.yarnpkg.com/consola/-/consola-3.4.2.tgz#5af110145397bb67afdab77013fdc34cae590ea7" - integrity sha512-5IKcdX0nnYavi6G7TtOhwkYzyjfJlatbjMjuLSfE2kYT5pMDOilZ4OvMhi637CcDICTmz3wARPoyhqyX1Y+XvA== - console-control-strings@^1.0.0, console-control-strings@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e" @@ -13086,7 +13091,7 @@ detect-libc@^2.0.0, detect-libc@^2.0.1: resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-2.0.3.tgz#f0cd503b40f9939b894697d19ad50895e30cf700" integrity sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw== -detect-libc@^2.0.3: +detect-libc@^2.0.3, detect-libc@^2.1.2: version "2.1.2" resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-2.1.2.tgz#689c5dcdc1900ef5583a4cb9f6d7b473742074ad" integrity sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ== @@ -13337,15 +13342,6 @@ draft-js@^0.10.0, draft-js@~0.10.0: immutable "~3.7.4" object-assign "^4.1.0" -duckdb@^1.4.1: - version "1.4.1" - resolved "https://registry.yarnpkg.com/duckdb/-/duckdb-1.4.1.tgz#c34cf2c0c1e8625624c928890a7fe67b38dc40ff" - integrity sha512-ynTVIsJjuUfF4GuTNpJn9xpVw8+gHz1wyHzQhfPJsVCemu3bf620HmJo5nRDTB0LMwfLW/3pTMmh+uze9kHAcw== - dependencies: - "@mapbox/node-pre-gyp" "^2.0.0" - node-addon-api "^7.0.0" - node-gyp "^9.3.0" - dunder-proto@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/dunder-proto/-/dunder-proto-1.0.1.tgz#d7ae667e1dc83482f8b70fd0f6eefc50da30f58a" @@ -15020,7 +15016,7 @@ fs-extra@^9.1.0: jsonfile "^6.0.1" universalify "^2.0.0" -fs-minipass@^2.0.0, fs-minipass@^2.1.0: +fs-minipass@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-2.1.0.tgz#7f5036fdbf12c63c169190cbe4199c852271f9fb" integrity sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg== @@ -15404,17 +15400,6 @@ glob@^7.0.0, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4, glob@^7.1.6: once "^1.3.0" path-is-absolute "^1.0.0" -glob@^8.0.1: - version "8.1.0" - resolved "https://registry.yarnpkg.com/glob/-/glob-8.1.0.tgz#d388f656593ef708ee3e34640fdfb99a9fd1c33e" - integrity sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ== - dependencies: - fs.realpath "^1.0.0" - inflight "^1.0.4" - inherits "2" - minimatch "^5.0.1" - once "^1.3.0" - glob@^9.2.0: version "9.3.5" resolved "https://registry.yarnpkg.com/glob/-/glob-9.3.5.tgz#ca2ed8ca452781a3009685607fdf025a899dfe21" @@ -16067,7 +16052,7 @@ https-proxy-agent@^5.0.0, https-proxy-agent@^5.0.1: agent-base "6" debug "4" -https-proxy-agent@^7.0.0, https-proxy-agent@^7.0.1, https-proxy-agent@^7.0.2, https-proxy-agent@^7.0.5, https-proxy-agent@^7.0.6: +https-proxy-agent@^7.0.0, https-proxy-agent@^7.0.1, https-proxy-agent@^7.0.2, https-proxy-agent@^7.0.6: version "7.0.6" resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz#da8dfeac7da130b05c2ba4b59c9b6cd66611a6b9" integrity sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw== @@ -18528,7 +18513,7 @@ lru-cache@^6.0.0: dependencies: yallist "^4.0.0" -lru-cache@^7.14.1, lru-cache@^7.7.1: +lru-cache@^7.14.1: version "7.18.3" resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-7.18.3.tgz#f793896e0fd0e954a59dfdd82f0773808df6aa89" integrity sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA== @@ -18629,28 +18614,6 @@ make-fetch-happen@15.0.2: promise-retry "^2.0.1" ssri "^12.0.0" -make-fetch-happen@^10.0.3: - version "10.2.1" - resolved "https://registry.yarnpkg.com/make-fetch-happen/-/make-fetch-happen-10.2.1.tgz#f5e3835c5e9817b617f2770870d9492d28678164" - integrity sha512-NgOPbRiaQM10DYXvN3/hhGVI2M5MtITFryzBGxHM5p4wnFxsVCbxkrBrDsk+EZ5OB4jEOT7AjDxtdF+KVEFT7w== - dependencies: - agentkeepalive "^4.2.1" - cacache "^16.1.0" - http-cache-semantics "^4.1.0" - http-proxy-agent "^5.0.0" - https-proxy-agent "^5.0.0" - is-lambda "^1.0.1" - lru-cache "^7.7.1" - minipass "^3.1.6" - minipass-collect "^1.0.2" - minipass-fetch "^2.0.3" - minipass-flush "^1.0.5" - minipass-pipeline "^1.2.4" - negotiator "^0.6.3" - promise-retry "^2.0.1" - socks-proxy-agent "^7.0.0" - ssri "^9.0.0" - make-fetch-happen@^13.0.0, make-fetch-happen@^13.0.1: version "13.0.1" resolved "https://registry.yarnpkg.com/make-fetch-happen/-/make-fetch-happen-13.0.1.tgz#273ba2f78f45e1f3a6dca91cede87d9fa4821e36" @@ -19061,17 +19024,6 @@ minipass-fetch@^1.3.2: optionalDependencies: encoding "^0.1.12" -minipass-fetch@^2.0.3: - version "2.1.2" - resolved "https://registry.yarnpkg.com/minipass-fetch/-/minipass-fetch-2.1.2.tgz#95560b50c472d81a3bc76f20ede80eaed76d8add" - integrity sha512-LT49Zi2/WMROHYoqGgdlQIZh8mLPZmOrN2NdJjMXxYe4nkN6FUyuPuOAOedNJDrx0IRGg9+4guZewtp8hE6TxA== - dependencies: - minipass "^3.1.6" - minipass-sized "^1.0.3" - minizlib "^2.1.2" - optionalDependencies: - encoding "^0.1.13" - minipass-fetch@^3.0.0: version "3.0.4" resolved "https://registry.yarnpkg.com/minipass-fetch/-/minipass-fetch-3.0.4.tgz#4d4d9b9f34053af6c6e597a64be8e66e42bf45b7" @@ -19126,7 +19078,7 @@ minipass-sized@^1.0.3: dependencies: minipass "^3.0.0" -minipass@^3.0.0, minipass@^3.1.0, minipass@^3.1.1, minipass@^3.1.3, minipass@^3.1.6: +minipass@^3.0.0, minipass@^3.1.0, minipass@^3.1.1, minipass@^3.1.3: version "3.3.6" resolved "https://registry.yarnpkg.com/minipass/-/minipass-3.3.6.tgz#7bba384db3a1520d18c9c0e5251c3444e95dd94a" integrity sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw== @@ -19656,22 +19608,6 @@ node-gyp@^12.1.0: tinyglobby "^0.2.12" which "^6.0.0" -node-gyp@^9.3.0: - version "9.3.1" - resolved "https://registry.yarnpkg.com/node-gyp/-/node-gyp-9.3.1.tgz#1e19f5f290afcc9c46973d68700cbd21a96192e4" - integrity sha512-4Q16ZCqq3g8awk6UplT7AuxQ35XN4R/yf/+wSAwcBUAjg7l58RTactWaP8fIDTi0FzI7YcVLujwExakZlfWkXg== - dependencies: - env-paths "^2.2.0" - glob "^7.1.4" - graceful-fs "^4.2.6" - make-fetch-happen "^10.0.3" - nopt "^6.0.0" - npmlog "^6.0.0" - rimraf "^3.0.2" - semver "^7.3.5" - tar "^6.1.2" - which "^2.0.2" - node-int64@^0.3.3: version "0.3.3" resolved "https://registry.yarnpkg.com/node-int64/-/node-int64-0.3.3.tgz#2d6e6b2ece5de8588b43d88d1bc41b26cd1fa84d" @@ -19711,13 +19647,6 @@ nopt@^5.0.0: dependencies: abbrev "1" -nopt@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/nopt/-/nopt-6.0.0.tgz#245801d8ebf409c6df22ab9d95b65e1309cdb16d" - integrity sha512-ZwLpbTgdhuZUnZzjd7nb1ZV+4DoiC6/sfiVKok72ym/4Tlf+DFdlHYmT2JPmcNNWV6Pi3SDf1kT+A4r9RTuT9g== - dependencies: - abbrev "^1.0.0" - nopt@^7.0.0, nopt@^7.2.0: version "7.2.1" resolved "https://registry.yarnpkg.com/nopt/-/nopt-7.2.1.tgz#1cac0eab9b8e97c9093338446eddd40b2c8ca1e7" @@ -23819,15 +23748,6 @@ socks-proxy-agent@^6.0.0: debug "^4.3.1" socks "^2.6.1" -socks-proxy-agent@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/socks-proxy-agent/-/socks-proxy-agent-7.0.0.tgz#dc069ecf34436621acb41e3efa66ca1b5fed15b6" - integrity sha512-Fgl0YPZ902wEsAyiQ+idGd1A7rSFx/ayC1CQVMw5P+EQx2V0SgpGtf6OKFhVjPflPUl9YMmEOnmfjCdMUsygww== - dependencies: - agent-base "^6.0.2" - debug "^4.3.3" - socks "^2.6.2" - socks-proxy-agent@^8.0.1, socks-proxy-agent@^8.0.3, socks-proxy-agent@^8.0.5: version "8.0.5" resolved "https://registry.yarnpkg.com/socks-proxy-agent/-/socks-proxy-agent-8.0.5.tgz#b9cdb4e7e998509d7659d689ce7697ac21645bee" @@ -23837,7 +23757,7 @@ socks-proxy-agent@^8.0.1, socks-proxy-agent@^8.0.3, socks-proxy-agent@^8.0.5: debug "^4.3.4" socks "^2.8.3" -socks@^2.6.1, socks@^2.6.2, socks@^2.8.3: +socks@^2.6.1, socks@^2.8.3: version "2.8.4" resolved "https://registry.yarnpkg.com/socks/-/socks-2.8.4.tgz#07109755cdd4da03269bda4725baa061ab56d5cc" integrity sha512-D3YaD0aRxR3mEcqnidIs7ReYJFVzWdd6fXJYUM8ixcQcJRGTka/b3saV0KflYhyVJXKhb947GndU35SxYNResQ== @@ -24099,13 +24019,6 @@ ssri@^8.0.0, ssri@^8.0.1: dependencies: minipass "^3.1.1" -ssri@^9.0.0: - version "9.0.1" - resolved "https://registry.yarnpkg.com/ssri/-/ssri-9.0.1.tgz#544d4c357a8d7b71a19700074b6883fcb4eae057" - integrity sha512-o57Wcn66jMQvfHG1FlYbWeZWW/dHZhJXjpIcTfXldXEk5nz5lStPo3mK0OJQfGR3RbZUlbISexbljkJzuEj/8Q== - dependencies: - minipass "^3.1.1" - stable@^0.1.8: version "0.1.8" resolved "https://registry.yarnpkg.com/stable/-/stable-0.1.8.tgz#836eb3c8382fe2936feaf544631017ce7d47a3cf" @@ -24190,16 +24103,7 @@ string-length@^4.0.1: char-regex "^1.0.2" strip-ansi "^6.0.0" -"string-width-cjs@npm:string-width@^4.2.0": - version "4.2.3" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" - integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== - dependencies: - emoji-regex "^8.0.0" - is-fullwidth-code-point "^3.0.0" - strip-ansi "^6.0.1" - -"string-width@^1.0.2 || 2 || 3 || 4", string-width@^4.0.0, string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: +"string-width-cjs@npm:string-width@^4.2.0", "string-width@^1.0.2 || 2 || 3 || 4", string-width@^4.0.0, string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: version "4.2.3" resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== @@ -24290,7 +24194,7 @@ string_decoder@~1.1.1: dependencies: safe-buffer "~5.1.0" -"strip-ansi-cjs@npm:strip-ansi@^6.0.1": +"strip-ansi-cjs@npm:strip-ansi@^6.0.1", strip-ansi@^6.0.0, strip-ansi@^6.0.1: version "6.0.1" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== @@ -24318,13 +24222,6 @@ strip-ansi@^5.2.0: dependencies: ansi-regex "^4.1.0" -strip-ansi@^6.0.0, strip-ansi@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" - integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== - dependencies: - ansi-regex "^5.0.1" - strip-ansi@^7.0.1, strip-ansi@^7.1.0: version "7.1.0" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-7.1.0.tgz#d5b6568ca689d8561370b0707685d22434faff45" @@ -24609,18 +24506,6 @@ tar@6.2.1, tar@^6.0.2, tar@^6.1.11, tar@^6.1.2, tar@^6.2.1: mkdirp "^1.0.3" yallist "^4.0.0" -tar@^7.4.0: - version "7.4.3" - resolved "https://registry.yarnpkg.com/tar/-/tar-7.4.3.tgz#88bbe9286a3fcd900e94592cda7a22b192e80571" - integrity sha512-5S7Va8hKfV7W5U6g3aYxXmlPoZVAwUMy9AOKyF2fVuZa2UD3qZjg578OrLRt8PcNN1PleVaL/5/yYATNL0ICUw== - dependencies: - "@isaacs/fs-minipass" "^4.0.0" - chownr "^3.0.0" - minipass "^7.1.2" - minizlib "^3.0.1" - mkdirp "^3.0.1" - yallist "^5.0.0" - tar@^7.4.3, tar@^7.5.2: version "7.5.2" resolved "https://registry.yarnpkg.com/tar/-/tar-7.5.2.tgz#115c061495ec51ff3c6745ff8f6d0871c5b1dedc" @@ -25438,13 +25323,6 @@ unique-filename@^1.1.1: dependencies: unique-slug "^2.0.0" -unique-filename@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/unique-filename/-/unique-filename-2.0.1.tgz#e785f8675a9a7589e0ac77e0b5c34d2eaeac6da2" - integrity sha512-ODWHtkkdx3IAR+veKxFV+VBkUMcN+FaqzUUd7IZzt+0zhDZFPFxhlqwPF3YQvMHx1TD0tdgYl+kuPnJ8E6ql7A== - dependencies: - unique-slug "^3.0.0" - unique-filename@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/unique-filename/-/unique-filename-3.0.0.tgz#48ba7a5a16849f5080d26c760c86cf5cf05770ea" @@ -25473,13 +25351,6 @@ unique-slug@^2.0.0: dependencies: imurmurhash "^0.1.4" -unique-slug@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/unique-slug/-/unique-slug-3.0.0.tgz#6d347cf57c8a7a7a6044aabd0e2d74e4d76dc7c9" - integrity sha512-8EyMynh679x/0gqE9fT9oilG+qEt+ibFyqjuVTsZn1+CMxH+XLlpvr2UZx4nVcCwTpx81nICr2JQFkM+HPLq4w== - dependencies: - imurmurhash "^0.1.4" - unique-slug@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/unique-slug/-/unique-slug-4.0.0.tgz#6bae6bb16be91351badd24cdce741f892a6532e3" @@ -26416,7 +26287,7 @@ workerpool@^9.2.0: resolved "https://registry.yarnpkg.com/workerpool/-/workerpool-9.2.0.tgz#f74427cbb61234708332ed8ab9cbf56dcb1c4371" integrity sha512-PKZqBOCo6CYkVOwAxWxQaSF2Fvb5Iv2fCeTP7buyWI2GiynWr46NcXSgK/idoV6e60dgCBfgYc+Un3HMvmqP8w== -"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0": +"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0", wrap-ansi@^7.0.0: version "7.0.0" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== @@ -26442,15 +26313,6 @@ wrap-ansi@^6.2.0: string-width "^4.1.0" strip-ansi "^6.0.0" -wrap-ansi@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" - integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== - dependencies: - ansi-styles "^4.0.0" - string-width "^4.1.0" - strip-ansi "^6.0.0" - wrap-ansi@^8.1.0: version "8.1.0" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-8.1.0.tgz#56dc22368ee570face1b49819975d9b9a5ead214"