@flowblade/sqlduck 0.32.0 → 0.34.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -128,75 +128,79 @@ const queryResult = await dbDuckDbMemoryConn.query<{
128
128
 
129
129
  ## Benchmarks
130
130
 
131
- ### Node 24.15
131
+ ### Node 24.19
132
132
 
133
133
  ```
134
- RUN v4.1.5 /home/sebastien/github/flowblade/packages/sqlduck
134
+ RUN v4.1.10 /home/sebastien/github/flowblade/packages/sqlduck
135
135
 
136
136
 
137
- ✓ bench/appender.bench.ts > appender benches 3477ms
138
- name hz min max mean p75 p99 p995 p999 rme samples
139
- · duckdb appender memory, count: 100000, chunk size 2048 2.9578 336.81 339.37 338.09 339.37 339.37 339.37 339.37 ±4.82% 2
140
- · duckdb appender file, count: 100000, chunk size 2048 1.5359 651.07 651.07 651.07 651.07 651.07 651.07 651.07 ±0.00% 1
141
- · duckdb appender, count: 100000, chunk size 1024 2.8450 328.25 374.74 351.50 374.74 374.74 374.74 374.74 ±84.06% 2
137
+ ✓ bench/appender.bench.ts > appender benches 4702ms
138
+ name hz min max mean p75 p99 p995 p999 rme samples
139
+ · duckdb appender memory, count: 100000, chunk size 2048 2.9565 297.19 379.28 338.23 379.28 379.28 379.28 379.28 ±154.25% 2
140
+ · duckdb appender file, count: 100000, chunk size 2048 3.2467 302.16 313.84 308.00 313.84 313.84 313.84 313.84 ±24.10% 2
141
+ · duckdb appender file no wal, count: 100000, chunk size 2048 3.5982 272.83 283.01 277.92 283.01 283.01 283.01 283.01 ±23.29% 2
142
+ · duckdb appender file no wal, count: 100000, chunk size 1024 3.1962 307.89 317.86 312.87 317.86 317.86 317.86 317.86 ±20.24% 2
143
+ · duckdb appender, count: 100000, chunk size 1024 3.9457 238.32 268.56 253.44 268.56 268.56 268.56 268.56 ±75.84% 2
142
144
 
143
- ✓ bench/stream.bench.ts > Bench rowsToColumnsChunks 3514ms
145
+ ✓ bench/stream.bench.ts > Bench rowsToColumnsChunks 2768ms
144
146
  name hz min max mean p75 p99 p995 p999 rme samples
145
- · rowToColumnsChunk with chunkSize 2048 (count: 100000) 10.6932 76.7549 197.03 93.5173 88.9991 197.03 197.03 197.03 ±28.09% 10
146
- · rowToColumnsChunk with transformer with chunkSize 2048 (count: 100000) 10.2660 87.8295 141.15 97.4092 97.0299 141.15 141.15 141.15 ±11.56% 10
147
- · mapFakeRowStream with chunkSize 2048 (count: 100000) 8.3811 113.83 136.27 119.32 118.84 136.27 136.27 136.27 ±4.30% 10
147
+ · rowToColumnsChunk with chunkSize 2048 (count: 100000) 14.7282 55.8866 117.44 67.8968 66.1927 117.44 117.44 117.44 ±18.84% 10
148
+ · rowToColumnsChunk with transformer with chunkSize 2048 (count: 100000) 12.1404 62.2024 138.60 82.3693 80.8803 138.60 138.60 138.60 ±26.30% 10
149
+ · mapFakeRowStream with chunkSize 2048 (count: 100000) 11.5408 79.1225 102.85 86.6494 89.3379 102.85 102.85 102.85 ±5.60% 10
148
150
 
149
- ✓ bench/table-create.bench.ts > Bench getTableCreateFromZod 614ms
151
+ ✓ bench/table-create.bench.ts > Bench getTableCreateFromZod 613ms
150
152
  name hz min max mean p75 p99 p995 p999 rme samples
151
- · getTableCreateFromZod 20,399.65 0.0328 1.2897 0.0490 0.0425 0.1957 0.2681 0.6023 ±1.77% 10201
153
+ · getTableCreateFromZod 24,208.11 0.0247 5.2321 0.0413 0.0434 0.1512 0.2186 0.7364 ±2.68% 12105
152
154
 
153
155
  BENCH Summary
154
156
 
155
- duckdb appender memory, count: 100000, chunk size 2048 - bench/appender.bench.ts > appender benches
156
- 1.04x faster than duckdb appender, count: 100000, chunk size 1024
157
- 1.93x faster than duckdb appender file, count: 100000, chunk size 2048
157
+ duckdb appender, count: 100000, chunk size 1024 - bench/appender.bench.ts > appender benches
158
+ 1.10x faster than duckdb appender file no wal, count: 100000, chunk size 2048
159
+ 1.22x faster than duckdb appender file, count: 100000, chunk size 2048
160
+ 1.23x faster than duckdb appender file no wal, count: 100000, chunk size 1024
161
+ 1.33x faster than duckdb appender memory, count: 100000, chunk size 2048
158
162
 
159
163
  rowToColumnsChunk with chunkSize 2048 (count: 100000) - bench/stream.bench.ts > Bench rowsToColumnsChunks
160
- 1.04x faster than rowToColumnsChunk with transformer with chunkSize 2048 (count: 100000)
164
+ 1.21x faster than rowToColumnsChunk with transformer with chunkSize 2048 (count: 100000)
161
165
  1.28x faster than mapFakeRowStream with chunkSize 2048 (count: 100000)
162
-
163
- getTableCreateFromZod - bench/table-create.bench.ts > Bench getTableCreateFromZod
164
-
165
166
  ```
166
167
 
167
- ### Bun 1.3.13
168
+ ### Bun 1.4.0-dev
168
169
 
169
170
  ```
170
- RUN v4.1.5 /home/sebastien/github/flowblade/packages/sqlduck
171
+ RUN v4.1.10 /home/sebastien/github/flowblade/packages/sqlduck
171
172
 
172
173
 
173
- ✓ bench/appender.bench.ts > appender benches 3382ms
174
- name hz min max mean p75 p99 p995 p999 rme samples
175
- · duckdb appender memory, count: 100000, chunk size 2048 3.0570 310.57 343.67 327.12 343.67 343.67 343.67 343.67 ±64.30% 2
176
- · duckdb appender file, count: 100000, chunk size 2048 2.6163 377.75 386.70 382.22 386.70 386.70 386.70 386.70 ±14.88% 2
177
- · duckdb appender, count: 100000, chunk size 1024 3.0427 319.38 337.93 328.65 337.93 337.93 337.93 337.93 ±35.86% 2
174
+ ✓ bench/appender.bench.ts > appender benches 4421ms
175
+ name hz min max mean p75 p99 p995 p999 rme samples
176
+ · duckdb appender memory, count: 100000, chunk size 2048 3.6500 271.84 276.10 273.97 276.10 276.10 276.10 276.10 ±9.88% 2
177
+ · duckdb appender file, count: 100000, chunk size 2048 3.6469 272.29 276.12 274.21 276.12 276.12 276.12 276.12 ±8.88% 2
178
+ · duckdb appender file no wal, count: 100000, chunk size 2048 3.6858 271.23 271.39 271.31 271.39 271.39 271.39 271.39 ±0.36% 2
179
+ · duckdb appender file no wal, count: 100000, chunk size 1024 3.8828 245.82 269.28 257.55 269.28 269.28 269.28 269.28 ±57.90% 2
180
+ · duckdb appender, count: 100000, chunk size 1024 4.3164 228.90 233.35 231.68 233.35 233.35 233.35 233.35 ±2.60% 3
178
181
 
179
- ✓ bench/stream.bench.ts > Bench rowsToColumnsChunks 3075ms
180
- name hz min max mean p75 p99 p995 p999 rme samples
181
- · rowToColumnsChunk with chunkSize 2048 (count: 100000) 12.5039 68.9091 89.8222 79.9751 84.4430 89.8222 89.8222 89.8222 ±5.45% 10
182
- · rowToColumnsChunk with transformer with chunkSize 2048 (count: 100000) 10.9097 83.6090 124.66 91.6616 92.3154 124.66 124.66 124.66 ±9.42% 10
183
- · mapFakeRowStream with chunkSize 2048 (count: 100000) 10.2729 90.7410 104.18 97.3436 100.41 104.18 104.18 104.18 ±2.93% 10
182
+ ✓ bench/stream.bench.ts > Bench rowsToColumnsChunks 1944ms
183
+ name hz min max mean p75 p99 p995 p999 rme samples
184
+ · rowToColumnsChunk with chunkSize 2048 (count: 100000) 23.3620 34.5897 57.6520 42.8045 46.5939 57.6520 57.6520 57.6520 ±9.96% 12
185
+ · rowToColumnsChunk with transformer with chunkSize 2048 (count: 100000) 19.9773 38.8665 71.6678 50.0569 51.5838 71.6678 71.6678 71.6678 ±14.39% 10
186
+ · mapFakeRowStream with chunkSize 2048 (count: 100000) 19.0996 45.5100 66.2385 52.3572 53.0091 66.2385 66.2385 66.2385 ±7.43% 10
184
187
 
185
- ✓ bench/table-create.bench.ts > Bench getTableCreateFromZod 629ms
188
+ ✓ bench/table-create.bench.ts > Bench getTableCreateFromZod 634ms
186
189
  name hz min max mean p75 p99 p995 p999 rme samples
187
- · getTableCreateFromZod 20,285.23 0.0260 6.9886 0.0493 0.0466 0.1700 0.2249 2.6988 ±6.12% 10143
190
+ · getTableCreateFromZod 30,647.46 0.0177 4.5320 0.0326 0.0335 0.1058 0.1550 0.7740 ±4.73% 15324
188
191
 
189
192
  BENCH Summary
190
193
 
191
194
  rowToColumnsChunk with chunkSize 2048 (count: 100000) - bench/stream.bench.ts > Bench rowsToColumnsChunks
192
- 1.15x faster than rowToColumnsChunk with transformer with chunkSize 2048 (count: 100000)
195
+ 1.17x faster than rowToColumnsChunk with transformer with chunkSize 2048 (count: 100000)
193
196
  1.22x faster than mapFakeRowStream with chunkSize 2048 (count: 100000)
194
197
 
195
- getTableCreateFromZod - bench/table-create.bench.ts > Bench getTableCreateFromZod
198
+ duckdb appender, count: 100000, chunk size 1024 - bench/appender.bench.ts > appender benches
199
+ 1.11x faster than duckdb appender file no wal, count: 100000, chunk size 1024
200
+ 1.17x faster than duckdb appender file no wal, count: 100000, chunk size 2048
201
+ 1.18x faster than duckdb appender memory, count: 100000, chunk size 2048
202
+ 1.18x faster than duckdb appender file, count: 100000, chunk size 2048
196
203
 
197
- duckdb appender memory, count: 100000, chunk size 2048 - bench/appender.bench.ts > appender benches
198
- 1.00x faster than duckdb appender, count: 100000, chunk size 1024
199
- 1.17x faster than duckdb appender file, count: 100000, chunk size 2048
200
204
  ```
201
205
 
202
206
  ### Local scripts
@@ -254,4 +254,8 @@ type MapRelaxedZodSchemaField<T extends z.ZodTypeAny> = T extends z.ZodDate ? st
254
254
  */
255
255
  type InferZodRelaxedDataSchema<T extends z.ZodObject<any>> = { [K in keyof T['shape']]: MapRelaxedZodSchemaField<T['shape'][K]>; };
256
256
  //#endregion
257
- export { assertValidAliasName as a, DuckConnectionParams as c, duckDsnZodSchema as i, duckAllConnectionOptionsZodSchema as l, ensureZodTableSchema as n, assertValidSchemaName as o, duckValidatorsZod as r, assertValidTableName as s, InferZodRelaxedDataSchema as t, duckConnectionParamsZodSchema as u };
257
+ //#region src/validation/zod/table-schema-zod.d.ts
258
+ type ZodSchemaSupportedTypes = z.ZodString | z.ZodNumber | z.ZodInt | z.ZodInt32 | z.ZodUInt32 | z.ZodBigInt | z.ZodBoolean | z.ZodDate | z.ZodISODateTime | z.ZodISOTime | z.ZodISODate | z.ZodEmail | z.ZodURL | z.ZodUUID | z.ZodCUID | z.ZodCUID2 | z.ZodULID | z.ZodEnum;
259
+ type TableSchemaZod = z.ZodObject<Record<string, ZodSchemaSupportedTypes | z.ZodNullable<ZodSchemaSupportedTypes> | z.ZodCodec | z.ZodNullable<z.ZodCodec>>>;
260
+ //#endregion
261
+ export { duckDsnZodSchema as a, assertValidTableName as c, duckConnectionParamsZodSchema as d, duckValidatorsZod as i, DuckConnectionParams as l, InferZodRelaxedDataSchema as n, assertValidAliasName as o, ensureZodTableSchema as r, assertValidSchemaName as s, TableSchemaZod as t, duckAllConnectionOptionsZodSchema as u };
package/dist/index.d.mts CHANGED
@@ -1,4 +1,4 @@
1
- import { c as DuckConnectionParams, t as InferZodRelaxedDataSchema } from "./index-CvC0hHHa.mjs";
1
+ import { l as DuckConnectionParams, n as InferZodRelaxedDataSchema, t as TableSchemaZod } from "./index-BKsJVkXZ.mjs";
2
2
  import { DuckDBConnection, DuckDBType } from "@duckdb/node-api";
3
3
  import { Logger } from "@logtape/logtape";
4
4
  import * as z from "zod";
@@ -77,10 +77,6 @@ declare class Table {
77
77
  withSchema: (schema: string) => Table;
78
78
  }
79
79
  //#endregion
80
- //#region src/table/table-schema-zod.type.d.ts
81
- type ZodSchemaSupportedTypes = z.ZodString | z.ZodNumber | z.ZodInt | z.ZodInt32 | z.ZodUInt32 | z.ZodBigInt | z.ZodBoolean | z.ZodDate | z.ZodISODateTime | z.ZodISOTime | z.ZodISODate | z.ZodEmail | z.ZodURL | z.ZodUUID | z.ZodCUID | z.ZodCUID2 | z.ZodULID | z.ZodEnum;
82
- type TableSchemaZod = z.ZodObject<Record<string, ZodSchemaSupportedTypes | z.ZodNullable<ZodSchemaSupportedTypes> | z.ZodCodec | z.ZodNullable<z.ZodCodec>>>;
83
- //#endregion
84
80
  //#region src/table/get-table-create-from-zod.d.ts
85
81
  type TableCreateOptions = {
86
82
  create?: 'CREATE' | 'CREATE_OR_REPLACE' | 'IF_NOT_EXISTS';
@@ -278,14 +274,23 @@ declare const duckDatabaseManagerZodSchemas: {
278
274
  }, z.core.$strict>;
279
275
  };
280
276
  //#endregion
281
- //#region src/manager/database/commands/duck-database-attach-command.d.ts
282
- type Behaviour = 'OR REPLACE' | 'IF NOT EXISTS';
283
- type DuckDatabaseAttachCommandOptions = {
284
- behaviour?: Behaviour;
285
- };
286
- //#endregion
287
277
  //#region src/manager/database/duck-database-manager.d.ts
288
278
  type GetDatabaseInfo = z.infer<typeof duckDatabaseManagerZodSchemas.getDatabases>;
279
+ type AttachOptions = {
280
+ behaviour: 'OR REPLACE';
281
+ /**
282
+ * Since duckdb 1.5.4, the ATTACH OR REPLACE fails if the database is already attached.
283
+ * If this option is set to true, when an attachOrReplace fails with the already attached
284
+ * message, the database will be detached first with regular detach command an re-tried
285
+ *
286
+ * This option might be deprecated in the future as duckdb will fix the issue upstream
287
+ *
288
+ * @default false
289
+ */
290
+ runDetachIfAttachOrReplaceFailWithAlreadyAttached?: boolean;
291
+ } | {
292
+ behaviour: 'IF NOT EXISTS';
293
+ };
289
294
  declare class DuckDatabaseManager {
290
295
  #private;
291
296
  readonly className = "DuckDatabaseManager";
@@ -307,8 +312,39 @@ declare class DuckDatabaseManager {
307
312
  * console.log(database.alias); // 'mydb'
308
313
  * ```
309
314
  */
310
- attach: (dbParams: DuckConnectionParams, options?: DuckDatabaseAttachCommandOptions) => Promise<Database>;
311
- attachOrReplace: (dbParams: DuckConnectionParams) => Promise<Database>;
315
+ attach: (dbParams: DuckConnectionParams, options?: AttachOptions) => Promise<Database>;
316
+ /**
317
+ * Attach or replace a database to the current connection
318
+ *
319
+ * @example
320
+ * ```typescript
321
+ * const dbManager = new DuckDatabaseManager(conn);
322
+ * const database = dbManager.attachOrReplace({
323
+ * type: 'memory', // can be 'filesystem'...
324
+ * alias: 'mydb',
325
+ * options: { COMPRESS: 'true' },
326
+ * }, {
327
+ * // as tested on duckdb 1.5.5, the attach or replace might not work
328
+ * // and complain about already attached database. Set this to true
329
+ * // to implement a detach / attach if the attachOrReplace fails
330
+ * runDetachIfAttachOrReplaceFailWithAlreadyAttached?: boolean;
331
+ * });
332
+ *
333
+ * console.log(database.alias); // 'mydb'
334
+ * ```
335
+ */
336
+ attachOrReplace: (dbParams: DuckConnectionParams, options?: {
337
+ /**
338
+ * Since duckdb 1.5.4, the ATTACH OR REPLACE fails if the database is already attached.
339
+ * If this option is set to true, when an attachOrReplace fails with the already attached
340
+ * message, the database will be detached first with regular detach command an re-tried
341
+ *
342
+ * This option might be deprecated in the future as duckdb will fix the issue upstream
343
+ *
344
+ * @default false
345
+ */
346
+ runDetachIfAttachOrReplaceFailWithAlreadyAttached?: boolean;
347
+ }) => Promise<Database>;
312
348
  attachIfNotExists: (dbParams: DuckConnectionParams) => Promise<Database>;
313
349
  /**
314
350
  * Check whether a specific database name / alias is currently attached
package/dist/index.mjs CHANGED
@@ -379,6 +379,23 @@ var DuckDatabaseAttachCommand = class {
379
379
  };
380
380
  };
381
381
  //#endregion
382
+ //#region src/manager/database/utils/get-already-attached-database-from-error.ts
383
+ /**
384
+ * Return the database name that is already attached to the error message
385
+ *
386
+ * Note duckdb might complain about already attached databases with a message like
387
+ * Binder Error: Unique file handle conflict: Cannot attach "duckdb_second_attached_file" - the database file "/home/sebastien/github/flowblade/packages/sqlduck/tests/tmp/duckdb_test_reattachable_file.db" is already attached by database "duckdb_first_attached_file"
388
+ */
389
+ const getAlreadyAttachedDatabaseFromError = (error) => {
390
+ if (!(error instanceof Error)) return { isAlreadyAttached: false };
391
+ const dbAlias = /Binder Error:.*Cannot attach.*already attached by database\s+['"“]?\b(?<dbAlias>[\w$]+)\b['"”]?/is.exec(error.message)?.groups?.dbAlias ?? null;
392
+ if (dbAlias === null || dbAlias.trim() === "") return { isAlreadyAttached: false };
393
+ return {
394
+ isAlreadyAttached: true,
395
+ dbAlias
396
+ };
397
+ };
398
+ //#endregion
382
399
  //#region src/manager/database/duck-database-manager.ts
383
400
  var DuckDatabaseManager = class {
384
401
  #conn;
@@ -410,15 +427,48 @@ var DuckDatabaseManager = class {
410
427
  const params = duckConnectionParamsZodSchema.parse(dbParams);
411
428
  const rawSql = new DuckDatabaseAttachCommand(params, options).getRawSql();
412
429
  const { behaviour } = options ?? {};
413
- await this.#executor.getRowObjectsJS([
414
- `attach(${params.alias}`,
415
- behaviour ?? null,
416
- ")"
417
- ].filter(Boolean).join(","), rawSql);
430
+ try {
431
+ await this.#executor.getRowObjectsJS([
432
+ `attach(${params.alias}`,
433
+ behaviour ?? null,
434
+ ")"
435
+ ].filter(Boolean).join(","), rawSql);
436
+ } catch (e) {
437
+ if (options?.behaviour === "OR REPLACE" && options?.runDetachIfAttachOrReplaceFailWithAlreadyAttached === true) {
438
+ const alreadyAttached = getAlreadyAttachedDatabaseFromError(e);
439
+ if (alreadyAttached.isAlreadyAttached === true) {
440
+ await this.detachOrIgnore(alreadyAttached.dbAlias);
441
+ await this.attach(dbParams);
442
+ } else throw e;
443
+ } else throw e;
444
+ }
418
445
  return new Database({ alias: params.alias });
419
446
  };
420
- attachOrReplace = async (dbParams) => {
421
- return this.attach(dbParams, { behaviour: "OR REPLACE" });
447
+ /**
448
+ * Attach or replace a database to the current connection
449
+ *
450
+ * @example
451
+ * ```typescript
452
+ * const dbManager = new DuckDatabaseManager(conn);
453
+ * const database = dbManager.attachOrReplace({
454
+ * type: 'memory', // can be 'filesystem'...
455
+ * alias: 'mydb',
456
+ * options: { COMPRESS: 'true' },
457
+ * }, {
458
+ * // as tested on duckdb 1.5.5, the attach or replace might not work
459
+ * // and complain about already attached database. Set this to true
460
+ * // to implement a detach / attach if the attachOrReplace fails
461
+ * runDetachIfAttachOrReplaceFailWithAlreadyAttached?: boolean;
462
+ * });
463
+ *
464
+ * console.log(database.alias); // 'mydb'
465
+ * ```
466
+ */
467
+ attachOrReplace = async (dbParams, options) => {
468
+ return this.attach(dbParams, {
469
+ behaviour: "OR REPLACE",
470
+ runDetachIfAttachOrReplaceFailWithAlreadyAttached: options?.runDetachIfAttachOrReplaceFailWithAlreadyAttached
471
+ });
422
472
  };
423
473
  attachIfNotExists = async (dbParams) => {
424
474
  return this.attach(dbParams, { behaviour: "IF NOT EXISTS" });
@@ -1,2 +1,2 @@
1
- import { a as assertValidAliasName, i as duckDsnZodSchema, l as duckAllConnectionOptionsZodSchema, n as ensureZodTableSchema, o as assertValidSchemaName, r as duckValidatorsZod, s as assertValidTableName, t as InferZodRelaxedDataSchema, u as duckConnectionParamsZodSchema } from "../../index-CvC0hHHa.mjs";
2
- export { type InferZodRelaxedDataSchema, assertValidAliasName, assertValidSchemaName, assertValidTableName, duckAllConnectionOptionsZodSchema, duckConnectionParamsZodSchema, duckDsnZodSchema, duckValidatorsZod, ensureZodTableSchema };
1
+ import { a as duckDsnZodSchema, c as assertValidTableName, d as duckConnectionParamsZodSchema, i as duckValidatorsZod, n as InferZodRelaxedDataSchema, o as assertValidAliasName, r as ensureZodTableSchema, s as assertValidSchemaName, t as TableSchemaZod, u as duckAllConnectionOptionsZodSchema } from "../../index-BKsJVkXZ.mjs";
2
+ export { type InferZodRelaxedDataSchema, type TableSchemaZod, assertValidAliasName, assertValidSchemaName, assertValidTableName, duckAllConnectionOptionsZodSchema, duckConnectionParamsZodSchema, duckDsnZodSchema, duckValidatorsZod, ensureZodTableSchema };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@flowblade/sqlduck",
3
- "version": "0.32.0",
3
+ "version": "0.34.0",
4
4
  "type": "module",
5
5
  "sideEffects": false,
6
6
  "exports": {
@@ -67,12 +67,12 @@
67
67
  },
68
68
  "dependencies": {
69
69
  "@flowblade/core": "^0.2.29",
70
- "@flowblade/source-duckdb": "^0.26.0",
70
+ "@flowblade/source-duckdb": "^0.27.0",
71
71
  "@flowblade/sql-tag": "^0.3.4",
72
- "@httpx/assert": "^0.17.2",
73
- "@httpx/dsn-parser": "^1.9.12",
74
- "@httpx/plain-object": "^2.1.12",
75
- "@logtape/logtape": "^2.2.4",
72
+ "@httpx/assert": "^0.18.0",
73
+ "@httpx/dsn-parser": "^1.10.0",
74
+ "@httpx/plain-object": "^2.2.0",
75
+ "@logtape/logtape": "^2.3.1",
76
76
  "@standard-schema/spec": "^1.1.0",
77
77
  "is-safe-filename": "0.1.1",
78
78
  "p-queue": "^9.3.3",
@@ -92,47 +92,47 @@
92
92
  }
93
93
  },
94
94
  "devDependencies": {
95
- "@belgattitude/eslint-config-bases": "8.19.0",
96
- "@dotenvx/dotenvx": "2.19.0",
97
- "@duckdb/node-api": "1.5.5-r.2",
95
+ "@belgattitude/eslint-config-bases": "8.19.1",
96
+ "@dotenvx/dotenvx": "2.21.0",
97
+ "@duckdb/node-api": "1.5.5-r.4",
98
98
  "@faker-js/faker": "10.5.0",
99
- "@flowblade/source-kysely": "^1.6.2",
100
- "@httpx/assert": "0.17.2",
99
+ "@flowblade/source-kysely": "^1.7.0",
100
+ "@httpx/assert": "0.18.0",
101
101
  "@mitata/counters": "0.0.8",
102
- "@size-limit/esbuild": "13.0.1",
103
- "@size-limit/file": "13.0.1",
104
- "@testcontainers/mssqlserver": "12.0.4",
102
+ "@size-limit/esbuild": "13.0.3",
103
+ "@size-limit/file": "13.0.3",
104
+ "@testcontainers/mssqlserver": "12.1.0",
105
105
  "@total-typescript/ts-reset": "0.6.1",
106
- "@types/node": "26.1.1",
107
- "@typescript-eslint/eslint-plugin": "8.65.0",
108
- "@typescript-eslint/parser": "8.65.0",
106
+ "@types/node": "26.2.0",
107
+ "@typescript-eslint/eslint-plugin": "8.67.0",
108
+ "@typescript-eslint/parser": "8.67.0",
109
109
  "@typescript/native-preview": "7.0.0-dev.20260707.2",
110
110
  "@vitest/coverage-v8": "4.1.10",
111
111
  "@vitest/ui": "4.1.10",
112
112
  "ansis": "4.3.1",
113
113
  "browserslist-to-esbuild": "2.1.1",
114
- "core-js": "3.49.0",
114
+ "core-js": "3.50.0",
115
115
  "cross-env": "10.1.0",
116
116
  "es-check": "9.6.4",
117
117
  "es-toolkit": "1.50.0",
118
- "esbuild": "0.28.1",
118
+ "esbuild": "0.28.2",
119
119
  "eslint": "8.57.1",
120
- "execa": "10.0.0",
120
+ "execa": "10.0.1",
121
121
  "is-in-ci": "2.0.0",
122
- "kysely": "0.29.4",
122
+ "kysely": "0.29.5",
123
123
  "mitata": "1.0.34",
124
- "npm-run-all2": "9.0.2",
124
+ "npm-run-all2": "9.0.3",
125
125
  "prettier": "3.9.6",
126
- "publint": "0.3.22",
126
+ "publint": "0.3.23",
127
127
  "regexp.escape": "2.0.1",
128
128
  "rimraf": "6.1.3",
129
- "size-limit": "13.0.1",
129
+ "size-limit": "13.0.3",
130
130
  "sql-formatter": "15.8.2",
131
131
  "tarn": "3.1.2",
132
132
  "tedious": "20.0.0",
133
- "testcontainers": "12.0.4",
133
+ "testcontainers": "12.1.0",
134
134
  "tsdown": "0.22.14",
135
- "tsx": "4.23.1",
135
+ "tsx": "4.23.12",
136
136
  "typedoc": "0.28.20",
137
137
  "typedoc-plugin-markdown": "4.12.0",
138
138
  "typescript": "6.0.3",