hazo_connect 2.3.6 → 2.4.1

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
@@ -241,6 +241,49 @@ const customQuery = userService.query()
241
241
  const result = await customQuery.execute('GET')
242
242
  ```
243
243
 
244
+ #### Auto-UUID Generation
245
+
246
+ The `createCrudService` function automatically generates UUIDs for TEXT primary key columns when inserting records. This feature is particularly useful for SQLite databases where TEXT PRIMARY KEY columns don't auto-generate IDs.
247
+
248
+ **Default Behavior:**
249
+ - Auto-ID generation is **enabled by default** for the 'id' column
250
+ - Uses Node.js built-in `crypto.randomUUID()`
251
+ - Preserves existing IDs when provided
252
+ - Only generates UUIDs when ID is missing (null or undefined)
253
+
254
+ **Configuration Examples:**
255
+
256
+ ```typescript
257
+ // Default - auto-generates UUIDs for 'id' column (enabled by default)
258
+ const userService = createCrudService(hazo, 'users')
259
+
260
+ // Insert without ID - UUID will be auto-generated
261
+ await userService.insert({ name: 'John', email: 'john@example.com' })
262
+ // Result: { id: 'f47ac10b-58cc-4372-a567-0e02b2c3d479', name: 'John', ... }
263
+
264
+ // Insert with ID - provided ID is preserved
265
+ await userService.insert({ id: 'custom-id', name: 'Jane' })
266
+ // Result: { id: 'custom-id', name: 'Jane' }
267
+
268
+ // Opt-out for tables with auto-increment integer IDs
269
+ const logService = createCrudService(hazo, 'logs', { autoId: false })
270
+
271
+ // Custom ID column name
272
+ const itemService = createCrudService(hazo, 'items', {
273
+ autoId: { enabled: true, column: 'item_id' }
274
+ })
275
+ ```
276
+
277
+ **AutoIdConfig Interface:**
278
+
279
+ ```typescript
280
+ interface AutoIdConfig {
281
+ enabled: boolean // Enable/disable auto-ID generation
282
+ column?: string // ID column name (default: 'id')
283
+ type?: 'uuid' // ID type (currently only UUID supported)
284
+ }
285
+ ```
286
+
244
287
  ### Singleton Pattern
245
288
 
246
289
  For multiple API routes sharing a database connection:
@@ -437,6 +480,18 @@ interface CrudService<T> {
437
480
  deleteById(id: unknown): Promise<void>
438
481
  query(): ExecutableQueryBuilder
439
482
  }
483
+
484
+ interface CrudServiceOptions {
485
+ primaryKeys?: string[] // defaults to ['id']
486
+ logger?: Logger
487
+ autoId?: AutoIdConfig | false // Auto-generate IDs on insert (enabled by default)
488
+ }
489
+
490
+ interface AutoIdConfig {
491
+ enabled: boolean
492
+ column?: string // Default: 'id'
493
+ type?: 'uuid' // Currently only UUID supported
494
+ }
440
495
  ```
441
496
 
442
497
  ---
package/dist/helpers.d.ts CHANGED
@@ -35,12 +35,25 @@ export declare function createTableQuery(adapter: HazoConnectAdapter, table: str
35
35
  * @returns Executable query builder
36
36
  */
37
37
  export declare function attachExecute(builder: QueryBuilder, adapter: HazoConnectAdapter, logger?: Logger): ExecutableQueryBuilder;
38
+ /**
39
+ * Configuration for auto-generating IDs on insert.
40
+ */
41
+ export interface AutoIdConfig {
42
+ enabled: boolean;
43
+ column?: string;
44
+ type?: 'uuid';
45
+ }
38
46
  /**
39
47
  * Options when generating CRUD helpers.
40
48
  */
41
49
  export interface CrudServiceOptions {
42
50
  primaryKeys?: string[];
43
51
  logger?: Logger;
52
+ /**
53
+ * Auto-generate IDs on insert. Enabled by default for 'id' column.
54
+ * Set to `false` to disable, or provide custom config.
55
+ */
56
+ autoId?: AutoIdConfig | false;
44
57
  }
45
58
  /**
46
59
  * Minimal CRUD interface backed by hazo_connect.
@@ -1 +1 @@
1
- {"version":3,"file":"helpers.d.ts","sourceRoot":"","sources":["../src/lib/helpers.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAA;AAC9C,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,EAAE,MAAM,SAAS,CAAA;AAEzD;;GAEG;AACH,MAAM,MAAM,WAAW,GAAG,KAAK,GAAG,MAAM,GAAG,KAAK,GAAG,OAAO,GAAG,QAAQ,CAAA;AAErE;;GAEG;AACH,MAAM,MAAM,sBAAsB,GAAG,YAAY,GAAG;IAClD,OAAO,EAAE,CAAC,MAAM,CAAC,EAAE,WAAW,EAAE,IAAI,CAAC,EAAE,OAAO,KAAK,OAAO,CAAC,OAAO,CAAC,CAAA;CACpE,CAAA;AAED;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAC9B,OAAO,EAAE,kBAAkB,EAC3B,KAAK,EAAE,MAAM,EACb,MAAM,CAAC,EAAE,MAAM,GACd,sBAAsB,CAGxB;AAED;;;;;;GAMG;AACH,wBAAgB,aAAa,CAC3B,OAAO,EAAE,YAAY,EACrB,OAAO,EAAE,kBAAkB,EAC3B,MAAM,CAAC,EAAE,MAAM,GACd,sBAAsB,CAWxB;AAED;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,WAAW,CAAC,EAAE,MAAM,EAAE,CAAA;IACtB,MAAM,CAAC,EAAE,MAAM,CAAA;CAChB;AAED;;GAEG;AACH,MAAM,WAAW,WAAW,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IACtF,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,EAAE,EAAE,YAAY,KAAK,YAAY,GAAG,OAAO,CAAC,CAAC,EAAE,CAAC,CAAA;IAClE,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,CAAC,EAAE,CAAC,CAAA;IACvD,SAAS,CAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,CAAC,GAAG,IAAI,CAAC,CAAA;IAC/D,QAAQ,CAAC,EAAE,EAAE,OAAO,GAAG,OAAO,CAAC,CAAC,GAAG,IAAI,CAAC,CAAA;IACxC,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,EAAE,GAAG,OAAO,CAAC,CAAC,EAAE,CAAC,CAAA;IACrD,UAAU,CAAC,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,EAAE,CAAC,CAAA;IACxD,UAAU,CAAC,EAAE,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IACtC,KAAK,IAAI,sBAAsB,CAAA;CAChC;AAED;;;;;;GAMG;AACH,wBAAgB,iBAAiB,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC3F,OAAO,EAAE,kBAAkB,EAC3B,KAAK,EAAE,MAAM,EACb,OAAO,GAAE,kBAAuB,GAC/B,WAAW,CAAC,CAAC,CAAC,CAyFhB;AAED;;;;;;;;GAQG;AACH,wBAAsB,YAAY,CAChC,OAAO,EAAE,kBAAkB,EAC3B,OAAO,EAAE,YAAY,EACrB,MAAM,GAAE,WAAmB,EAC3B,IAAI,CAAC,EAAE,OAAO,EACd,MAAM,CAAC,EAAE,MAAM,GACd,OAAO,CAAC,OAAO,CAAC,CAMlB"}
1
+ {"version":3,"file":"helpers.d.ts","sourceRoot":"","sources":["../src/lib/helpers.ts"],"names":[],"mappings":"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"}
package/dist/helpers.js CHANGED
@@ -13,6 +13,7 @@ exports.createTableQuery = createTableQuery;
13
13
  exports.attachExecute = attachExecute;
14
14
  exports.createCrudService = createCrudService;
15
15
  exports.executeQuery = executeQuery;
16
+ const crypto_1 = require("crypto");
16
17
  const query_builder_1 = require("./query-builder");
17
18
  /**
18
19
  * Create a query builder for a table and attach the adapter execute method.
@@ -54,6 +55,12 @@ function attachExecute(builder, adapter, logger) {
54
55
  function createCrudService(adapter, table, options = {}) {
55
56
  const primaryKeys = options.primaryKeys && options.primaryKeys.length > 0 ? options.primaryKeys : ['id'];
56
57
  const logger = options.logger;
58
+ // Process autoId config - enabled by default for 'id' column
59
+ const autoIdConfig = options.autoId === undefined
60
+ ? { enabled: true, column: 'id' } // Default: enabled
61
+ : options.autoId === false
62
+ ? { enabled: false } // Explicit disable
63
+ : options.autoId; // Custom config
57
64
  function buildQuery() {
58
65
  return createTableQuery(adapter, table, logger);
59
66
  }
@@ -88,7 +95,21 @@ function createCrudService(adapter, table, options = {}) {
88
95
  }
89
96
  async function insert(data) {
90
97
  const qb = buildQuery();
91
- const payload = Array.isArray(data) ? data : [data];
98
+ // Clone payload to avoid mutating original data
99
+ let payload = Array.isArray(data)
100
+ ? data.map(row => ({ ...row }))
101
+ : [{ ...data }];
102
+ // Auto-generate IDs if configured and not provided
103
+ if (autoIdConfig.enabled) {
104
+ const idColumn = autoIdConfig.column || 'id';
105
+ payload = payload.map(row => {
106
+ const rowRecord = row;
107
+ if (rowRecord[idColumn] === undefined || rowRecord[idColumn] === null) {
108
+ return { ...row, [idColumn]: (0, crypto_1.randomUUID)() };
109
+ }
110
+ return row;
111
+ });
112
+ }
92
113
  const result = await qb.execute('POST', payload);
93
114
  if (Array.isArray(result)) {
94
115
  return result;
@@ -1 +1 @@
1
- {"version":3,"file":"helpers.js","sourceRoot":"","sources":["../src/lib/helpers.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"helpers.js","sourceRoot":"","sources":["../src/lib/helpers.ts"],"names":[],"mappings":"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"}
@@ -10,7 +10,7 @@ export { defaultLogger, getDefaultLogger } from '../default-logger';
10
10
  export { QueryBuilder } from '../query-builder';
11
11
  export { createHazoConnect } from '../factory';
12
12
  export { attachExecute, createCrudService, createTableQuery, executeQuery } from '../helpers';
13
- export type { CrudService, CrudServiceOptions, ExecutableQueryBuilder, QueryMethod } from '../helpers';
13
+ export type { AutoIdConfig, CrudService, CrudServiceOptions, ExecutableQueryBuilder, QueryMethod } from '../helpers';
14
14
  export { BaseAdapter } from '../adapters/base-adapter';
15
15
  export { PostgrestAdapter } from '../adapters/postgrest-adapter';
16
16
  export { SqliteAdapter } from '../adapters/sqlite-adapter';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/lib/server/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAqBH,YAAY,EACV,MAAM,EACN,cAAc,EACd,iBAAiB,EACjB,kBAAkB,EAClB,aAAa,EACb,cAAc,EACd,cAAc,EACd,QAAQ,EACR,YAAY,EACZ,gBAAgB,EACjB,MAAM,UAAU,CAAA;AAEjB,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,UAAU,CAAA;AAChD,OAAO,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAA;AAGnE,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAA;AAG/C,OAAO,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAA;AAG9C,OAAO,EACL,aAAa,EACb,iBAAiB,EACjB,gBAAgB,EAChB,YAAY,EACb,MAAM,YAAY,CAAA;AACnB,YAAY,EACV,WAAW,EACX,kBAAkB,EAClB,sBAAsB,EACtB,WAAW,EACZ,MAAM,YAAY,CAAA;AAGnB,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAA;AACtD,OAAO,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAA;AAChE,OAAO,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAA;AAC1D,OAAO,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAA;AAC9D,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAA;AAGtD,OAAO,EACL,qBAAqB,EACrB,sBAAsB,EACtB,qBAAqB,EACrB,sBAAsB,EACvB,MAAM,yBAAyB,CAAA;AAGhC,OAAO,EACL,oBAAoB,EACpB,oBAAoB,EACpB,KAAK,gBAAgB,EACtB,MAAM,2BAA2B,CAAA;AAClC,YAAY,EACV,kBAAkB,EAClB,eAAe,EACf,YAAY,EACZ,WAAW,EACX,WAAW,EACX,eAAe,EACf,OAAO,EACP,eAAe,EACf,iBAAiB,EACjB,oBAAoB,EACrB,MAAM,yBAAyB,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/lib/server/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAqBH,YAAY,EACV,MAAM,EACN,cAAc,EACd,iBAAiB,EACjB,kBAAkB,EAClB,aAAa,EACb,cAAc,EACd,cAAc,EACd,QAAQ,EACR,YAAY,EACZ,gBAAgB,EACjB,MAAM,UAAU,CAAA;AAEjB,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,UAAU,CAAA;AAChD,OAAO,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAA;AAGnE,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAA;AAG/C,OAAO,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAA;AAG9C,OAAO,EACL,aAAa,EACb,iBAAiB,EACjB,gBAAgB,EAChB,YAAY,EACb,MAAM,YAAY,CAAA;AACnB,YAAY,EACV,YAAY,EACZ,WAAW,EACX,kBAAkB,EAClB,sBAAsB,EACtB,WAAW,EACZ,MAAM,YAAY,CAAA;AAGnB,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAA;AACtD,OAAO,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAA;AAChE,OAAO,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAA;AAC1D,OAAO,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAA;AAC9D,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAA;AAGtD,OAAO,EACL,qBAAqB,EACrB,sBAAsB,EACtB,qBAAqB,EACrB,sBAAsB,EACvB,MAAM,yBAAyB,CAAA;AAGhC,OAAO,EACL,oBAAoB,EACpB,oBAAoB,EACpB,KAAK,gBAAgB,EACtB,MAAM,2BAA2B,CAAA;AAClC,YAAY,EACV,kBAAkB,EAClB,eAAe,EACf,YAAY,EACZ,WAAW,EACX,WAAW,EACX,eAAe,EACf,OAAO,EACP,eAAe,EACf,iBAAiB,EACjB,oBAAoB,EACrB,MAAM,yBAAyB,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/lib/server/index.ts"],"names":[],"mappings":";AAAA;;;;;GAKG;AAEH,YAAY,CAAA;AAPZ;;;;;GAKG;;;AAIH;;;GAGG;AACH,SAAS,gBAAgB;IACvB,IAAI,OAAO,MAAM,KAAK,WAAW,EAAE,CAAC;QAClC,MAAM,IAAI,KAAK,CACb,sDAAsD;YACtD,+EAA+E,CAChF,CAAA;IACH,CAAC;AACH,CAAC;AAED,sCAAsC;AACtC,gBAAgB,EAAE,CAAA;AAgBlB,kCAAgD;AAAvC,kGAAA,SAAS,OAAA;AAAE,mGAAA,UAAU,OAAA;AAC9B,oDAAmE;AAA1D,+GAAA,aAAa,OAAA;AAAE,kHAAA,gBAAgB,OAAA;AAExC,uBAAuB;AACvB,kDAA+C;AAAtC,6GAAA,YAAY,OAAA;AAErB,iBAAiB;AACjB,sCAA8C;AAArC,4GAAA,iBAAiB,OAAA;AAE1B,iBAAiB;AACjB,sCAKmB;AAJjB,wGAAA,aAAa,OAAA;AACb,4GAAA,iBAAiB,OAAA;AACjB,2GAAA,gBAAgB,OAAA;AAChB,uGAAA,YAAY,OAAA;AASd,uCAAuC;AACvC,yDAAsD;AAA7C,2GAAA,WAAW,OAAA;AACpB,mEAAgE;AAAvD,qHAAA,gBAAgB,OAAA;AACzB,6DAA0D;AAAjD,+GAAA,aAAa,OAAA;AACtB,iEAA8D;AAArD,mHAAA,eAAe,OAAA;AACxB,yDAAsD;AAA7C,2GAAA,WAAW,OAAA;AAEpB,8BAA8B;AAC9B,yDAKgC;AAJ9B,sHAAA,qBAAqB,OAAA;AACrB,uHAAA,sBAAsB,OAAA;AACtB,sHAAA,qBAAqB,OAAA;AACrB,uHAAA,sBAAsB,OAAA;AAGxB,4CAA4C;AAC5C,8DAIkC;AAHhC,wHAAA,oBAAoB,OAAA;AACpB,wHAAA,oBAAoB,OAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/lib/server/index.ts"],"names":[],"mappings":";AAAA;;;;;GAKG;AAEH,YAAY,CAAA;AAPZ;;;;;GAKG;;;AAIH;;;GAGG;AACH,SAAS,gBAAgB;IACvB,IAAI,OAAO,MAAM,KAAK,WAAW,EAAE,CAAC;QAClC,MAAM,IAAI,KAAK,CACb,sDAAsD;YACtD,+EAA+E,CAChF,CAAA;IACH,CAAC;AACH,CAAC;AAED,sCAAsC;AACtC,gBAAgB,EAAE,CAAA;AAgBlB,kCAAgD;AAAvC,kGAAA,SAAS,OAAA;AAAE,mGAAA,UAAU,OAAA;AAC9B,oDAAmE;AAA1D,+GAAA,aAAa,OAAA;AAAE,kHAAA,gBAAgB,OAAA;AAExC,uBAAuB;AACvB,kDAA+C;AAAtC,6GAAA,YAAY,OAAA;AAErB,iBAAiB;AACjB,sCAA8C;AAArC,4GAAA,iBAAiB,OAAA;AAE1B,iBAAiB;AACjB,sCAKmB;AAJjB,wGAAA,aAAa,OAAA;AACb,4GAAA,iBAAiB,OAAA;AACjB,2GAAA,gBAAgB,OAAA;AAChB,uGAAA,YAAY,OAAA;AAUd,uCAAuC;AACvC,yDAAsD;AAA7C,2GAAA,WAAW,OAAA;AACpB,mEAAgE;AAAvD,qHAAA,gBAAgB,OAAA;AACzB,6DAA0D;AAAjD,+GAAA,aAAa,OAAA;AACtB,iEAA8D;AAArD,mHAAA,eAAe,OAAA;AACxB,yDAAsD;AAA7C,2GAAA,WAAW,OAAA;AAEpB,8BAA8B;AAC9B,yDAKgC;AAJ9B,sHAAA,qBAAqB,OAAA;AACrB,uHAAA,sBAAsB,OAAA;AACtB,sHAAA,qBAAqB,OAAA;AACrB,uHAAA,sBAAsB,OAAA;AAGxB,4CAA4C;AAC5C,8DAIkC;AAHhC,wHAAA,oBAAoB,OAAA;AACpB,wHAAA,oBAAoB,OAAA"}
package/docs/techdoc.md CHANGED
@@ -133,6 +133,7 @@ src/lib/
133
133
 
134
134
  └── __tests__/ # Unit tests
135
135
  ├── factory.test.ts
136
+ ├── helpers_auto_id.test.ts # Auto-UUID generation tests
136
137
  ├── postgrest_adapter.test.ts
137
138
  ├── query_builder.test.ts
138
139
  └── sqlite_adapter.test.ts
@@ -363,8 +364,20 @@ Creates a CRUD service wrapper for a table:
363
364
  function createCrudService<T>(
364
365
  adapter: HazoConnectAdapter,
365
366
  table: string,
366
- options?: { primaryKeys?: string[]; logger?: Logger }
367
+ options?: CrudServiceOptions
367
368
  ): CrudService<T>
369
+
370
+ interface CrudServiceOptions {
371
+ primaryKeys?: string[] // defaults to ['id']
372
+ logger?: Logger
373
+ autoId?: AutoIdConfig | false // Auto-generate IDs on insert (enabled by default)
374
+ }
375
+
376
+ interface AutoIdConfig {
377
+ enabled: boolean
378
+ column?: string // Default: 'id'
379
+ type?: 'uuid' // Currently only UUID supported
380
+ }
368
381
  ```
369
382
 
370
383
  **Methods:**
@@ -372,11 +385,40 @@ function createCrudService<T>(
372
385
  - `findBy(criteria)`: Find by criteria
373
386
  - `findOneBy(criteria)`: Find single record
374
387
  - `findById(id)`: Find by primary key
375
- - `insert(data)`: Insert record(s)
388
+ - `insert(data)`: Insert record(s) - auto-generates UUIDs for missing IDs by default
376
389
  - `updateById(id, patch)`: Update by primary key
377
390
  - `deleteById(id)`: Delete by primary key
378
391
  - `query()`: Get executable query builder
379
392
 
393
+ **Auto-UUID Generation:**
394
+
395
+ The `insert()` method automatically generates UUIDs for TEXT primary key columns when IDs are missing. This feature solves the issue where SQLite TEXT PRIMARY KEY columns don't auto-generate IDs, preventing "NOT NULL constraint failed" errors.
396
+
397
+ **Behavior:**
398
+ - **Enabled by default** for the 'id' column
399
+ - Uses Node.js built-in `crypto.randomUUID()`
400
+ - Preserves existing IDs when provided in the data
401
+ - Only generates UUIDs when ID is null or undefined
402
+ - Clones payload to avoid mutating original data
403
+ - Can be disabled by setting `autoId: false`
404
+ - Supports custom ID column names via `autoId.column`
405
+
406
+ **Example:**
407
+ ```typescript
408
+ // Default - auto-generates UUIDs for 'id' column
409
+ const userService = createCrudService(adapter, 'users')
410
+ await userService.insert({ name: 'John' })
411
+ // Result: { id: 'f47ac10b-...', name: 'John' }
412
+
413
+ // Opt-out for auto-increment integer IDs
414
+ const logService = createCrudService(adapter, 'logs', { autoId: false })
415
+
416
+ // Custom ID column
417
+ const itemService = createCrudService(adapter, 'items', {
418
+ autoId: { enabled: true, column: 'item_id' }
419
+ })
420
+ ```
421
+
380
422
  #### attachExecute
381
423
 
382
424
  Attaches `execute()` method to a QueryBuilder:
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "hazo_connect",
3
- "version": "2.3.6",
3
+ "version": "2.4.1",
4
4
  "description": "Module to connect to the data store (postgres via postgrest, supabase, etc)",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=factory.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"factory.test.d.ts","sourceRoot":"","sources":["../../src/lib/__tests__/factory.test.ts"],"names":[],"mappings":""}
@@ -1,45 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- // factory.test.ts verifies the createHazoConnect factory behavior across configuration inputs.
4
- const factory_1 = require("../factory");
5
- const postgrest_adapter_1 = require("../adapters/postgrest-adapter");
6
- describe("createHazoConnect", () => {
7
- it("returns a PostgrestAdapter when using a config provider", async () => {
8
- const base_url = process.env.POSTGREST_URL;
9
- const config_provider = {
10
- get: (section, key) => {
11
- if (section === "postgrest" && key === "base_url") {
12
- return base_url;
13
- }
14
- return undefined;
15
- },
16
- getSection: (section) => {
17
- if (section === "postgrest") {
18
- return { base_url };
19
- }
20
- return undefined;
21
- }
22
- };
23
- const adapter = (0, factory_1.createHazoConnect)({
24
- type: "postgrest",
25
- configProvider: config_provider
26
- });
27
- expect(adapter).toBeInstanceOf(postgrest_adapter_1.PostgrestAdapter);
28
- const adapter_config = await adapter.getConfig();
29
- expect(adapter_config.base_url).toBe(base_url);
30
- expect(adapter_config.api_key).toBe(process.env.POSTGREST_API_KEY);
31
- });
32
- it("merges direct config with environment API key", async () => {
33
- const base_url = process.env.POSTGREST_URL;
34
- const adapter = (0, factory_1.createHazoConnect)({
35
- type: "postgrest",
36
- postgrest: {
37
- base_url
38
- }
39
- });
40
- const adapter_config = await adapter.getConfig();
41
- expect(adapter_config.base_url).toBe(base_url);
42
- expect(adapter_config.api_key).toBe(process.env.POSTGREST_API_KEY);
43
- });
44
- });
45
- //# sourceMappingURL=factory.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"factory.test.js","sourceRoot":"","sources":["../../src/lib/__tests__/factory.test.ts"],"names":[],"mappings":";;AAAA,+FAA+F;AAC/F,wCAA+C;AAC/C,qEAAiE;AAEjE,QAAQ,CAAC,mBAAmB,EAAE,GAAG,EAAE;IACjC,EAAE,CAAC,yDAAyD,EAAE,KAAK,IAAI,EAAE;QACvE,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,aAAuB,CAAC;QAErD,MAAM,eAAe,GAAG;YACtB,GAAG,EAAE,CAAC,OAAe,EAAE,GAAW,EAAE,EAAE;gBACpC,IAAI,OAAO,KAAK,WAAW,IAAI,GAAG,KAAK,UAAU,EAAE,CAAC;oBAClD,OAAO,QAAQ,CAAC;gBAClB,CAAC;gBACD,OAAO,SAAS,CAAC;YACnB,CAAC;YACD,UAAU,EAAE,CAAC,OAAe,EAAE,EAAE;gBAC9B,IAAI,OAAO,KAAK,WAAW,EAAE,CAAC;oBAC5B,OAAO,EAAE,QAAQ,EAAE,CAAC;gBACtB,CAAC;gBACD,OAAO,SAAS,CAAC;YACnB,CAAC;SACF,CAAC;QAEF,MAAM,OAAO,GAAG,IAAA,2BAAiB,EAAC;YAChC,IAAI,EAAE,WAAW;YACjB,cAAc,EAAE,eAAsB;SACvC,CAAC,CAAC;QAEH,MAAM,CAAC,OAAO,CAAC,CAAC,cAAc,CAAC,oCAAgB,CAAC,CAAC;QACjD,MAAM,cAAc,GAAG,MAAM,OAAO,CAAC,SAAS,EAAE,CAAC;QACjD,MAAM,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAC/C,MAAM,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC;IACrE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,+CAA+C,EAAE,KAAK,IAAI,EAAE;QAC7D,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,aAAuB,CAAC;QAErD,MAAM,OAAO,GAAG,IAAA,2BAAiB,EAAC;YAChC,IAAI,EAAE,WAAW;YACjB,SAAS,EAAE;gBACT,QAAQ;aACT;SACF,CAAC,CAAC;QAEH,MAAM,cAAc,GAAG,MAAM,OAAO,CAAC,SAAS,EAAE,CAAC;QACjD,MAAM,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAC/C,MAAM,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC;IACrE,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=postgrest_adapter.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"postgrest_adapter.test.d.ts","sourceRoot":"","sources":["../../src/lib/__tests__/postgrest_adapter.test.ts"],"names":[],"mappings":""}
@@ -1,32 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- // postgrest_adapter.test.ts ensures PostgREST adapter surfaces helpful error messages.
4
- const postgrest_adapter_1 = require("../adapters/postgrest-adapter");
5
- const originalFetch = global.fetch;
6
- const buildAdapter = () => new postgrest_adapter_1.PostgrestAdapter({
7
- postgrest: {
8
- base_url: "https://example.supabase.co/rest/v1",
9
- api_key: "valid-key"
10
- }
11
- });
12
- describe("PostgrestAdapter error handling", () => {
13
- afterEach(() => {
14
- global.fetch = originalFetch;
15
- });
16
- it("produces a descriptive message when the table is missing", async () => {
17
- const mockResponse = {
18
- ok: false,
19
- status: 404,
20
- statusText: "Not Found",
21
- text: jest.fn().mockResolvedValue(JSON.stringify({
22
- message: "relation \"missing_table\" does not exist"
23
- }))
24
- };
25
- const fetchMock = jest.fn().mockResolvedValue(mockResponse);
26
- global.fetch = fetchMock;
27
- const adapter = buildAdapter();
28
- await expect(adapter.rawQuery("/missing_table", { method: "GET" })).rejects.toThrow("PostgREST could not find resource 'missing_table'");
29
- expect(fetchMock).toHaveBeenCalledTimes(1);
30
- });
31
- });
32
- //# sourceMappingURL=postgrest_adapter.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"postgrest_adapter.test.js","sourceRoot":"","sources":["../../src/lib/__tests__/postgrest_adapter.test.ts"],"names":[],"mappings":";;AAAA,uFAAuF;AACvF,qEAAiE;AAEjE,MAAM,aAAa,GAAG,MAAM,CAAC,KAAK,CAAC;AAEnC,MAAM,YAAY,GAAG,GAAG,EAAE,CACxB,IAAI,oCAAgB,CAAC;IACnB,SAAS,EAAE;QACT,QAAQ,EAAE,qCAAqC;QAC/C,OAAO,EAAE,WAAW;KACrB;CACF,CAAC,CAAC;AAEL,QAAQ,CAAC,iCAAiC,EAAE,GAAG,EAAE;IAC/C,SAAS,CAAC,GAAG,EAAE;QACb,MAAM,CAAC,KAAK,GAAG,aAAa,CAAC;IAC/B,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0DAA0D,EAAE,KAAK,IAAI,EAAE;QACxE,MAAM,YAAY,GAAG;YACnB,EAAE,EAAE,KAAK;YACT,MAAM,EAAE,GAAG;YACX,UAAU,EAAE,WAAW;YACvB,IAAI,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAC/B,IAAI,CAAC,SAAS,CAAC;gBACb,OAAO,EAAE,2CAA2C;aACrD,CAAC,CACH;SACF,CAAC;QAEF,MAAM,SAAS,GAAG,IAAI,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,YAAmB,CAAC,CAAC;QAClE,MAAc,CAAC,KAAK,GAAG,SAAS,CAAC;QAElC,MAAM,OAAO,GAAG,YAAY,EAAE,CAAC;QAE/B,MAAM,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,gBAAgB,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CACjF,mDAAmD,CACpD,CAAC;QAEF,MAAM,CAAC,SAAS,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;IAC7C,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=query_builder.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"query_builder.test.d.ts","sourceRoot":"","sources":["../../src/lib/__tests__/query_builder.test.ts"],"names":[],"mappings":""}
@@ -1,35 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- // query_builder.test.ts validates QueryBuilder behaviors for select and join configuration.
4
- const query_builder_1 = require("../query-builder");
5
- const query_settings_1 = require("../../../tests/config/query_settings");
6
- describe("QueryBuilder", () => {
7
- it("persists the configured table and selection values", () => {
8
- const tableName = query_settings_1.test_table_name || "example_table";
9
- const builder = new query_builder_1.QueryBuilder()
10
- .from(tableName)
11
- .select(["id", "name"])
12
- .limit(25)
13
- .offset(5);
14
- expect(builder.getTable()).toBe(tableName);
15
- expect(builder.getSelectFields()).toEqual(["id", "name"]);
16
- expect(builder.getLimit()).toBe(25);
17
- expect(builder.getOffset()).toBe(5);
18
- });
19
- it("records join metadata using the configured values", () => {
20
- const tableName = query_settings_1.test_table_name || "example_table";
21
- const joinTable = query_settings_1.test_join_table || "related_items";
22
- const joinCondition = query_settings_1.test_join_condition || `${joinTable}.parent_id=${tableName}.id`;
23
- const builder = new query_builder_1.QueryBuilder()
24
- .from(tableName)
25
- .join(joinTable, joinCondition, "left");
26
- const joins = builder.getJoins();
27
- expect(joins).toHaveLength(1);
28
- expect(joins[0]).toEqual({
29
- table: joinTable,
30
- on: joinCondition,
31
- type: "left"
32
- });
33
- });
34
- });
35
- //# sourceMappingURL=query_builder.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"query_builder.test.js","sourceRoot":"","sources":["../../src/lib/__tests__/query_builder.test.ts"],"names":[],"mappings":";;AAAA,4FAA4F;AAC5F,oDAAgD;AAChD,yEAA6G;AAE7G,QAAQ,CAAC,cAAc,EAAE,GAAG,EAAE;IAC5B,EAAE,CAAC,oDAAoD,EAAE,GAAG,EAAE;QAC5D,MAAM,SAAS,GAAG,gCAAe,IAAI,eAAe,CAAC;QACrD,MAAM,OAAO,GAAG,IAAI,4BAAY,EAAE;aAC/B,IAAI,CAAC,SAAS,CAAC;aACf,MAAM,CAAC,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;aACtB,KAAK,CAAC,EAAE,CAAC;aACT,MAAM,CAAC,CAAC,CAAC,CAAC;QAEb,MAAM,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAC3C,MAAM,CAAC,OAAO,CAAC,eAAe,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC;QAC1D,MAAM,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACpC,MAAM,CAAC,OAAO,CAAC,SAAS,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACtC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mDAAmD,EAAE,GAAG,EAAE;QAC3D,MAAM,SAAS,GAAG,gCAAe,IAAI,eAAe,CAAC;QACrD,MAAM,SAAS,GAAG,gCAAe,IAAI,eAAe,CAAC;QACrD,MAAM,aAAa,GACjB,oCAAmB,IAAI,GAAG,SAAS,cAAc,SAAS,KAAK,CAAC;QAElE,MAAM,OAAO,GAAG,IAAI,4BAAY,EAAE;aAC/B,IAAI,CAAC,SAAS,CAAC;aACf,IAAI,CAAC,SAAS,EAAE,aAAa,EAAE,MAAM,CAAC,CAAC;QAE1C,MAAM,KAAK,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAC;QACjC,MAAM,CAAC,KAAK,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QAC9B,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC;YACvB,KAAK,EAAE,SAAS;YAChB,EAAE,EAAE,aAAa;YACjB,IAAI,EAAE,MAAM;SACb,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}