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 +55 -0
- package/dist/helpers.d.ts +13 -0
- package/dist/helpers.d.ts.map +1 -1
- package/dist/helpers.js +22 -1
- package/dist/helpers.js.map +1 -1
- package/dist/server/index.d.ts +1 -1
- package/dist/server/index.d.ts.map +1 -1
- package/dist/server/index.js.map +1 -1
- package/docs/techdoc.md +44 -2
- package/package.json +1 -1
- package/dist/__tests__/factory.test.d.ts +0 -2
- package/dist/__tests__/factory.test.d.ts.map +0 -1
- package/dist/__tests__/factory.test.js +0 -45
- package/dist/__tests__/factory.test.js.map +0 -1
- package/dist/__tests__/postgrest_adapter.test.d.ts +0 -2
- package/dist/__tests__/postgrest_adapter.test.d.ts.map +0 -1
- package/dist/__tests__/postgrest_adapter.test.js +0 -32
- package/dist/__tests__/postgrest_adapter.test.js.map +0 -1
- package/dist/__tests__/query_builder.test.d.ts +0 -2
- package/dist/__tests__/query_builder.test.d.ts.map +0 -1
- package/dist/__tests__/query_builder.test.js +0 -35
- package/dist/__tests__/query_builder.test.js.map +0 -1
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.
|
package/dist/helpers.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"helpers.d.ts","sourceRoot":"","sources":["../src/lib/helpers.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;
|
|
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
|
-
|
|
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;
|
package/dist/helpers.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"helpers.js","sourceRoot":"","sources":["../src/lib/helpers.ts"],"names":[],"mappings":";AAAA;;;;;;;;GAQG;;
|
|
1
|
+
{"version":3,"file":"helpers.js","sourceRoot":"","sources":["../src/lib/helpers.ts"],"names":[],"mappings":"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"}
|
package/dist/server/index.d.ts
CHANGED
|
@@ -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"}
|
package/dist/server/index.js.map
CHANGED
|
@@ -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;
|
|
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?:
|
|
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 +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 +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 +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"}
|