@flowblade/sqlduck 0.33.0 → 0.35.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
package/dist/index.d.mts CHANGED
@@ -274,14 +274,23 @@ declare const duckDatabaseManagerZodSchemas: {
274
274
  }, z.core.$strict>;
275
275
  };
276
276
  //#endregion
277
- //#region src/manager/database/commands/duck-database-attach-command.d.ts
278
- type Behaviour = 'OR REPLACE' | 'IF NOT EXISTS';
279
- type DuckDatabaseAttachCommandOptions = {
280
- behaviour?: Behaviour;
281
- };
282
- //#endregion
283
277
  //#region src/manager/database/duck-database-manager.d.ts
284
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
+ };
285
294
  declare class DuckDatabaseManager {
286
295
  #private;
287
296
  readonly className = "DuckDatabaseManager";
@@ -303,8 +312,39 @@ declare class DuckDatabaseManager {
303
312
  * console.log(database.alias); // 'mydb'
304
313
  * ```
305
314
  */
306
- attach: (dbParams: DuckConnectionParams, options?: DuckDatabaseAttachCommandOptions) => Promise<Database>;
307
- 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>;
308
348
  attachIfNotExists: (dbParams: DuckConnectionParams) => Promise<Database>;
309
349
  /**
310
350
  * Check whether a specific database name / alias is currently attached
@@ -341,6 +381,14 @@ declare class DuckDatabaseManager {
341
381
  analyze: () => Promise<boolean>;
342
382
  checkpoint: (dbAlias: string) => Promise<boolean>;
343
383
  vacuum: () => Promise<boolean>;
384
+ getCurrentDatabase: () => Promise<string | null>;
385
+ getCurrentSchema: () => Promise<string | null>;
386
+ getCurrentCatalog: () => Promise<string | null>;
387
+ /**
388
+ * Set the default database to use
389
+ * @throws if the database alias does not exist
390
+ */
391
+ use: (dbAlias: string) => Promise<true>;
344
392
  /**
345
393
  * Helper to create an initial database file.
346
394
  */
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;
@@ -408,17 +425,61 @@ var DuckDatabaseManager = class {
408
425
  */
409
426
  attach = async (dbParams, options) => {
410
427
  const params = duckConnectionParamsZodSchema.parse(dbParams);
411
- const rawSql = new DuckDatabaseAttachCommand(params, options).getRawSql();
412
- const { behaviour } = options ?? {};
413
- await this.#executor.getRowObjectsJS([
414
- `attach(${params.alias}`,
415
- behaviour ?? null,
416
- ")"
417
- ].filter(Boolean).join(","), rawSql);
428
+ const rawSql = new DuckDatabaseAttachCommand(params, { behaviour: options?.behaviour }).getRawSql();
429
+ const restoreCurrentDb = await this.getCurrentDatabase();
430
+ const tempDbNameHack = "temp_run_detach_if_attached_hack_db";
431
+ let isTempDbNameHackCreated = false;
432
+ try {
433
+ await this.#executor.getRowObjectsJS([`attach(${params.alias}`, options === void 0 ? null : JSON.stringify(options)].filter(Boolean).join(",") + ")", rawSql);
434
+ } catch (e) {
435
+ if (options?.behaviour === "OR REPLACE" && options?.runDetachIfAttachOrReplaceFailWithAlreadyAttached === true) {
436
+ const alreadyAttached = getAlreadyAttachedDatabaseFromError(e);
437
+ if (alreadyAttached.isAlreadyAttached === true) {
438
+ if (alreadyAttached.dbAlias === restoreCurrentDb) {
439
+ await this.attachIfNotExists({
440
+ type: "memory",
441
+ alias: tempDbNameHack
442
+ });
443
+ await this.use(tempDbNameHack);
444
+ isTempDbNameHackCreated = true;
445
+ }
446
+ await this.detachOrIgnore(alreadyAttached.dbAlias);
447
+ await this.attach(dbParams);
448
+ } else throw e;
449
+ } else throw e;
450
+ } finally {
451
+ if (restoreCurrentDb !== null && isTempDbNameHackCreated) {
452
+ await this.use(restoreCurrentDb);
453
+ await this.detachOrIgnore(tempDbNameHack);
454
+ }
455
+ }
418
456
  return new Database({ alias: params.alias });
419
457
  };
420
- attachOrReplace = async (dbParams) => {
421
- return this.attach(dbParams, { behaviour: "OR REPLACE" });
458
+ /**
459
+ * Attach or replace a database to the current connection
460
+ *
461
+ * @example
462
+ * ```typescript
463
+ * const dbManager = new DuckDatabaseManager(conn);
464
+ * const database = dbManager.attachOrReplace({
465
+ * type: 'memory', // can be 'filesystem'...
466
+ * alias: 'mydb',
467
+ * options: { COMPRESS: 'true' },
468
+ * }, {
469
+ * // as tested on duckdb 1.5.5, the attach or replace might not work
470
+ * // and complain about already attached database. Set this to true
471
+ * // to implement a detach / attach if the attachOrReplace fails
472
+ * runDetachIfAttachOrReplaceFailWithAlreadyAttached?: boolean;
473
+ * });
474
+ *
475
+ * console.log(database.alias); // 'mydb'
476
+ * ```
477
+ */
478
+ attachOrReplace = async (dbParams, options) => {
479
+ return this.attach(dbParams, {
480
+ behaviour: "OR REPLACE",
481
+ runDetachIfAttachOrReplaceFailWithAlreadyAttached: options?.runDetachIfAttachOrReplaceFailWithAlreadyAttached
482
+ });
422
483
  };
423
484
  attachIfNotExists = async (dbParams) => {
424
485
  return this.attach(dbParams, { behaviour: "IF NOT EXISTS" });
@@ -526,6 +587,24 @@ var DuckDatabaseManager = class {
526
587
  await this.#executor.getRowObjectsJS("vacuum()", "VACUUM");
527
588
  return true;
528
589
  };
590
+ getCurrentDatabase = async () => {
591
+ return (await this.#executor.getRowObjectsJS("getCurrentDatabase()", "SELECT current_database() as current_database"))[0]?.current_database ?? null;
592
+ };
593
+ getCurrentSchema = async () => {
594
+ return (await this.#executor.getRowObjectsJS("getCurrentSchema()", "SELECT current_schema() as current_schema"))?.[0]?.current_schema ?? null;
595
+ };
596
+ getCurrentCatalog = async () => {
597
+ return (await this.#executor.getRowObjectsJS("getCurrentCatalog()", "SELECT current_catalog() as current_catalog"))?.[0]?.current_catalog ?? null;
598
+ };
599
+ /**
600
+ * Set the default database to use
601
+ * @throws if the database alias does not exist
602
+ */
603
+ use = async (dbAlias) => {
604
+ const safeAlias = duckValidatorsZod.aliasName.parse(dbAlias);
605
+ await this.#executor.getRowObjectsJS(`use(${safeAlias})`, `USE ${safeAlias}`);
606
+ return true;
607
+ };
529
608
  /**
530
609
  * Helper to create an initial database file.
531
610
  */
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@flowblade/sqlduck",
3
- "version": "0.33.0",
3
+ "version": "0.35.0",
4
4
  "type": "module",
5
5
  "sideEffects": false,
6
6
  "exports": {
@@ -69,10 +69,10 @@
69
69
  "@flowblade/core": "^0.2.29",
70
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.3.0",
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",
@@ -93,46 +93,46 @@
93
93
  },
94
94
  "devDependencies": {
95
95
  "@belgattitude/eslint-config-bases": "8.19.1",
96
- "@dotenvx/dotenvx": "2.19.1",
97
- "@duckdb/node-api": "1.5.5-r.3",
96
+ "@dotenvx/dotenvx": "2.21.0",
97
+ "@duckdb/node-api": "1.5.5-r.4",
98
98
  "@faker-js/faker": "10.5.0",
99
99
  "@flowblade/source-kysely": "^1.7.0",
100
- "@httpx/assert": "0.17.2",
100
+ "@httpx/assert": "0.18.0",
101
101
  "@mitata/counters": "0.0.8",
102
102
  "@size-limit/esbuild": "13.0.3",
103
103
  "@size-limit/file": "13.0.3",
104
- "@testcontainers/mssqlserver": "12.0.4",
104
+ "@testcontainers/mssqlserver": "12.1.0",
105
105
  "@total-typescript/ts-reset": "0.6.1",
106
- "@types/node": "26.1.2",
107
- "@typescript-eslint/eslint-plugin": "8.66.0",
108
- "@typescript-eslint/parser": "8.66.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
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
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
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.5",
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",