@truto/ginger 2.0.1 → 2.1.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
@@ -441,6 +441,96 @@ const user = await service.get(id, {
441
441
  // user.teams → TeamRow[]
442
442
  ```
443
443
 
444
+ #### FK joins vs PK joins
445
+
446
+ By default, a direct (`kind: 'one'`) join uses `localPk` on the base table in the
447
+ `ON` clause (`base.localPk = remote.pk`) — the classic `users.id = profiles.user_id`
448
+ pattern when `remote.pk` is the FK column.
449
+
450
+ When the FK lives on the **base** table instead (e.g.
451
+ `integrated_account.environment_integration_id → environment_integration.id`),
452
+ use `localColumn`:
453
+
454
+ ```typescript
455
+ environment_integration: {
456
+ kind: 'one' as const,
457
+ localColumn: 'environment_integration_id', // FK on base table
458
+ remote: {
459
+ table: 'environment_integration',
460
+ pk: 'id',
461
+ select: ['id', 'environment_id', 'integration_id'],
462
+ },
463
+ schema: EnvironmentIntegrationSchema,
464
+ }
465
+ ```
466
+
467
+ `localPk` remains supported for existing join configs.
468
+
469
+ #### Chained (multi-hop) joins
470
+
471
+ Nest `joins` inside a `JoinDef` to traverse multiple tables in one query:
472
+
473
+ ```typescript
474
+ include: {
475
+ environment_integration: {
476
+ integration: true,
477
+ },
478
+ }
479
+ // → row.environment_integration.integration
480
+ ```
481
+
482
+ #### Top-level `expose`
483
+
484
+ Project joined columns onto the row root (e.g. for wire-compat APIs):
485
+
486
+ ```typescript
487
+ createService({
488
+ // ...
489
+ expose: [
490
+ { from: '$environment_integration.environment_id', as: 'environment_id' },
491
+ ],
492
+ })
493
+ ```
494
+
495
+ #### Join-aware filters, sort, and count
496
+
497
+ Filter, sort, and count on joined or exposed columns:
498
+
499
+ ```typescript
500
+ await service.list({
501
+ auth,
502
+ where: { environment_id: { in: ['env-1'] } },
503
+ orderBy: [{ column: '$integration.name', direction: 'asc' }],
504
+ include: { environment_integration: { integration: true } },
505
+ })
506
+
507
+ await service.count({
508
+ auth,
509
+ where: { environment_id: 'env-1' },
510
+ include: { environment_integration: true },
511
+ })
512
+ ```
513
+
514
+ Use `$table` alias blocks in `where` for explicit qualification. Expose aliases
515
+ (e.g. `environment_id`) are translated automatically.
516
+
517
+ #### List vs detail projections
518
+
519
+ Override joined columns per call via nested `include.select`:
520
+
521
+ ```typescript
522
+ // list — stripped integration
523
+ include: {
524
+ environment_integration: {
525
+ select: ['id', 'environment_id'],
526
+ integration: { select: ['id', 'name'] },
527
+ },
528
+ }
529
+
530
+ // detail — full configured columns
531
+ include: { environment_integration: { integration: true } }
532
+ ```
533
+
444
534
  ### Field selection
445
535
 
446
536
  Limit the columns returned by `list` / `get` / `create` / `update` with a flat
package/dist/index.d.ts CHANGED
@@ -12,7 +12,7 @@
12
12
  * - Safe SQL generation
13
13
  */
14
14
  export { Service } from './service.js';
15
- export type { AuthContext, BaseCtx, BaseService, ComputeJoins, CountParams, CreateParams, CursorToken, Database, ExecResult, PreparedStatement, QueryResult, DeleteParams, ErrorCtx, GetParams, Hook, HookMap, HookPhase, JoinDef, JoinKind, KeyProvider, ListParams, ListResult, MethodName, MethodOptions, OrderBy, OrderDirection, QueryParams, SecretFieldDef, SelectedRow, SelectField, ServiceCreate, ServiceDeps, ServiceOptions, ServiceRow, TimestampConfig, ServiceUpdate, UpdateParams, } from './types.js';
15
+ export type { AuthContext, BaseCtx, BaseService, ComputeExposed, ComputeJoins, CountParams, CreateParams, CursorToken, Database, ExecResult, ExposeDef, PreparedStatement, QueryResult, DeleteParams, ErrorCtx, GetParams, Hook, HookMap, HookPhase, IncludeMap, IncludeNode, IncludeSpec, JoinDef, JoinKind, KeyProvider, ListParams, ListResult, MethodName, MethodOptions, OrderBy, OrderDirection, QueryParams, SecretFieldDef, SelectedRow, SelectField, ServiceCreate, ServiceDeps, ServiceOptions, ServiceRow, TimestampConfig, ServiceUpdate, UpdateParams, } from './types.js';
16
16
  export { AuthError, CursorError, DatabaseError, DependencyError, EncryptionError, HookError, NotFoundError, ServiceError, SqlBuilderError, ValidationError, } from './errors.js';
17
17
  export { decrypt, decryptSecrets, DefaultKeyProvider, encrypt, encryptSecrets, generateSecretKey, getSecretColumns, getSecretLogicalNames, } from './crypto.js';
18
18
  export { buildCursorConditions, createCursor, decodeCursor, encodeCursor, getDefaultOrderBy, reverseOrderBy, validateOrderBy, } from './pagination.js';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAGH,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAA;AAItC,YAAY,EACV,WAAW,EACX,OAAO,EACP,WAAW,EACX,YAAY,EACZ,WAAW,EACX,YAAY,EACZ,WAAW,EAEX,QAAQ,EACR,UAAU,EACV,iBAAiB,EACjB,WAAW,EACX,YAAY,EACZ,QAAQ,EACR,SAAS,EACT,IAAI,EACJ,OAAO,EACP,SAAS,EAET,OAAO,EACP,QAAQ,EACR,WAAW,EAEX,UAAU,EACV,UAAU,EACV,UAAU,EACV,aAAa,EACb,OAAO,EACP,cAAc,EACd,WAAW,EACX,cAAc,EACd,WAAW,EACX,WAAW,EACX,aAAa,EACb,WAAW,EACX,cAAc,EAEd,UAAU,EACV,eAAe,EACf,aAAa,EACb,YAAY,GACb,MAAM,YAAY,CAAA;AAGnB,OAAO,EACL,SAAS,EACT,WAAW,EACX,aAAa,EACb,eAAe,EACf,eAAe,EACf,SAAS,EACT,aAAa,EACb,YAAY,EACZ,eAAe,EACf,eAAe,GAChB,MAAM,aAAa,CAAA;AAGpB,OAAO,EACL,OAAO,EACP,cAAc,EACd,kBAAkB,EAClB,OAAO,EACP,cAAc,EACd,iBAAiB,EACjB,gBAAgB,EAChB,qBAAqB,GACtB,MAAM,aAAa,CAAA;AAGpB,OAAO,EACL,qBAAqB,EACrB,YAAY,EACZ,YAAY,EACZ,YAAY,EACZ,iBAAiB,EACjB,cAAc,EACd,eAAe,GAChB,MAAM,iBAAiB,CAAA;AAGxB,OAAO,EACL,UAAU,EACV,WAAW,EACX,WAAW,EACX,WAAW,EACX,eAAe,EACf,WAAW,EACX,YAAY,EACZ,WAAW,GACZ,MAAM,kBAAkB,CAAA;AAGzB,OAAO,EAAE,aAAa,EAAE,wBAAwB,EAAE,MAAM,qBAAqB,CAAA;AAC7E,YAAY,EACV,iBAAiB,EACjB,kBAAkB,EAClB,uBAAuB,EACvB,gBAAgB,GACjB,MAAM,qBAAqB,CAAA;AAG5B,OAAO,KAAK,CAAC,MAAM,QAAQ,CAAA;AAE3B;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,wBAAgB,aAAa,CAC3B,IAAI,SAAS,OAAO,QAAQ,EAAE,UAAU,EACxC,OAAO,SAAS,OAAO,QAAQ,EAAE,UAAU,EAC3C,OAAO,SAAS,OAAO,QAAQ,EAAE,UAAU,EAC3C,MAAM,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,YAAY,EAAE,OAAO,CAAC,GAAG,MAAM,CAClE,MAAM,EACN,KAAK,CACN,EACD,QAAQ,SACJ,SAAS,OAAO,YAAY,EAAE,cAAc,EAAE,GAC9C,SAAS,GAAG,SAAS,EAEzB,OAAO,EAAE,OAAO,YAAY,EAAE,cAAc,CAC1C,IAAI,EACJ,OAAO,EACP,OAAO,EACP,MAAM,EACN,QAAQ,CACT,GACA,OAAO,cAAc,EAAE,OAAO,CAAC,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,CAAC,CAE1E;;;;AAGD,wBAEC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAGH,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAA;AAItC,YAAY,EACV,WAAW,EACX,OAAO,EACP,WAAW,EACX,cAAc,EACd,YAAY,EACZ,WAAW,EACX,YAAY,EACZ,WAAW,EAEX,QAAQ,EACR,UAAU,EACV,SAAS,EACT,iBAAiB,EACjB,WAAW,EACX,YAAY,EACZ,QAAQ,EACR,SAAS,EACT,IAAI,EACJ,OAAO,EACP,SAAS,EAET,UAAU,EACV,WAAW,EACX,WAAW,EACX,OAAO,EACP,QAAQ,EACR,WAAW,EAEX,UAAU,EACV,UAAU,EACV,UAAU,EACV,aAAa,EACb,OAAO,EACP,cAAc,EACd,WAAW,EACX,cAAc,EACd,WAAW,EACX,WAAW,EACX,aAAa,EACb,WAAW,EACX,cAAc,EAEd,UAAU,EACV,eAAe,EACf,aAAa,EACb,YAAY,GACb,MAAM,YAAY,CAAA;AAGnB,OAAO,EACL,SAAS,EACT,WAAW,EACX,aAAa,EACb,eAAe,EACf,eAAe,EACf,SAAS,EACT,aAAa,EACb,YAAY,EACZ,eAAe,EACf,eAAe,GAChB,MAAM,aAAa,CAAA;AAGpB,OAAO,EACL,OAAO,EACP,cAAc,EACd,kBAAkB,EAClB,OAAO,EACP,cAAc,EACd,iBAAiB,EACjB,gBAAgB,EAChB,qBAAqB,GACtB,MAAM,aAAa,CAAA;AAGpB,OAAO,EACL,qBAAqB,EACrB,YAAY,EACZ,YAAY,EACZ,YAAY,EACZ,iBAAiB,EACjB,cAAc,EACd,eAAe,GAChB,MAAM,iBAAiB,CAAA;AAGxB,OAAO,EACL,UAAU,EACV,WAAW,EACX,WAAW,EACX,WAAW,EACX,eAAe,EACf,WAAW,EACX,YAAY,EACZ,WAAW,GACZ,MAAM,kBAAkB,CAAA;AAGzB,OAAO,EAAE,aAAa,EAAE,wBAAwB,EAAE,MAAM,qBAAqB,CAAA;AAC7E,YAAY,EACV,iBAAiB,EACjB,kBAAkB,EAClB,uBAAuB,EACvB,gBAAgB,GACjB,MAAM,qBAAqB,CAAA;AAG5B,OAAO,KAAK,CAAC,MAAM,QAAQ,CAAA;AAE3B;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,wBAAgB,aAAa,CAC3B,IAAI,SAAS,OAAO,QAAQ,EAAE,UAAU,EACxC,OAAO,SAAS,OAAO,QAAQ,EAAE,UAAU,EAC3C,OAAO,SAAS,OAAO,QAAQ,EAAE,UAAU,EAC3C,MAAM,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,YAAY,EAAE,OAAO,CAAC,GAAG,MAAM,CAClE,MAAM,EACN,KAAK,CACN,EACD,QAAQ,SACJ,SAAS,OAAO,YAAY,EAAE,cAAc,EAAE,GAC9C,SAAS,GAAG,SAAS,EAEzB,OAAO,EAAE,OAAO,YAAY,EAAE,cAAc,CAC1C,IAAI,EACJ,OAAO,EACP,OAAO,EACP,MAAM,EACN,QAAQ,CACT,GACA,OAAO,cAAc,EAAE,OAAO,CAAC,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,CAAC,CAE1E;;;;AAGD,wBAEC"}
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,qBAAqB;AACrB,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAA;AACtC,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAA;AA+CtC,gBAAgB;AAChB,OAAO,EACL,SAAS,EACT,WAAW,EACX,aAAa,EACb,eAAe,EACf,eAAe,EACf,SAAS,EACT,aAAa,EACb,YAAY,EACZ,eAAe,EACf,eAAe,GAChB,MAAM,aAAa,CAAA;AAEpB,uBAAuB;AACvB,OAAO,EACL,OAAO,EACP,cAAc,EACd,kBAAkB,EAClB,OAAO,EACP,cAAc,EACd,iBAAiB,EACjB,gBAAgB,EAChB,qBAAqB,GACtB,MAAM,aAAa,CAAA;AAEpB,uBAAuB;AACvB,OAAO,EACL,qBAAqB,EACrB,YAAY,EACZ,YAAY,EACZ,YAAY,EACZ,iBAAiB,EACjB,cAAc,EACd,eAAe,GAChB,MAAM,iBAAiB,CAAA;AAExB,wBAAwB;AACxB,OAAO,EACL,UAAU,EACV,WAAW,EACX,WAAW,EACX,WAAW,EACX,eAAe,EACf,WAAW,EACX,YAAY,EACZ,WAAW,GACZ,MAAM,kBAAkB,CAAA;AAEzB,oBAAoB;AACpB,OAAO,EAAE,aAAa,EAAE,wBAAwB,EAAE,MAAM,qBAAqB,CAAA;AAQ7E,mCAAmC;AACnC,OAAO,KAAK,CAAC,MAAM,QAAQ,CAAA;AAE3B;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,MAAM,UAAU,aAAa,CAY3B,OAMC;IAED,OAAO,IAAI,OAAO,CAAC,OAAO,CAAC,CAAA;AAC7B,CAAC;AAED,iCAAiC;AACjC,eAAe;IACb,aAAa;CACd,CAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,qBAAqB;AACrB,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAA;AACtC,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAA;AAoDtC,gBAAgB;AAChB,OAAO,EACL,SAAS,EACT,WAAW,EACX,aAAa,EACb,eAAe,EACf,eAAe,EACf,SAAS,EACT,aAAa,EACb,YAAY,EACZ,eAAe,EACf,eAAe,GAChB,MAAM,aAAa,CAAA;AAEpB,uBAAuB;AACvB,OAAO,EACL,OAAO,EACP,cAAc,EACd,kBAAkB,EAClB,OAAO,EACP,cAAc,EACd,iBAAiB,EACjB,gBAAgB,EAChB,qBAAqB,GACtB,MAAM,aAAa,CAAA;AAEpB,uBAAuB;AACvB,OAAO,EACL,qBAAqB,EACrB,YAAY,EACZ,YAAY,EACZ,YAAY,EACZ,iBAAiB,EACjB,cAAc,EACd,eAAe,GAChB,MAAM,iBAAiB,CAAA;AAExB,wBAAwB;AACxB,OAAO,EACL,UAAU,EACV,WAAW,EACX,WAAW,EACX,WAAW,EACX,eAAe,EACf,WAAW,EACX,YAAY,EACZ,WAAW,GACZ,MAAM,kBAAkB,CAAA;AAEzB,oBAAoB;AACpB,OAAO,EAAE,aAAa,EAAE,wBAAwB,EAAE,MAAM,qBAAqB,CAAA;AAQ7E,mCAAmC;AACnC,OAAO,KAAK,CAAC,MAAM,QAAQ,CAAA;AAE3B;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,MAAM,UAAU,aAAa,CAY3B,OAMC;IAED,OAAO,IAAI,OAAO,CAAC,OAAO,CAAC,CAAA;AAC7B,CAAC;AAED,iCAAiC;AACjC,eAAe;IACb,aAAa;CACd,CAAA"}
@@ -0,0 +1,93 @@
1
+ import { sql } from '@truto/sqlite-builder';
2
+ import type { ExposeDef, IncludeMap, JoinDef, OrderBy } from './types.js';
3
+ /** True when `key` must not be used for dynamic assignment on a plain object. */
4
+ export declare function isUnsafeObjectKey(key: string): boolean;
5
+ /** Normalized include tree node after parsing boolean / object include specs. */
6
+ export interface NormalizedIncludeNode {
7
+ enabled: boolean;
8
+ select?: string[] | undefined;
9
+ children: Record<string, NormalizedIncludeNode>;
10
+ }
11
+ /** A single join edge resolved from the include tree, in dependency order. */
12
+ export interface ResolvedJoin {
13
+ /** Dot-separated path, e.g. `environment_integration.integration`. */
14
+ path: string;
15
+ /** Key in the parent joins map. */
16
+ name: string;
17
+ joinDef: JoinDef;
18
+ parentTable: string;
19
+ localColumn: string;
20
+ sqlTable: string;
21
+ /** Prefix for flat SQL column aliases (`${columnPrefix}_${col}` by default). */
22
+ columnPrefix: string;
23
+ select: string[];
24
+ /** Collision-safe flat SQL alias per selected column (assigned after resolve). */
25
+ columnAliases: Record<string, string>;
26
+ }
27
+ export declare function getLocalJoinColumn(joinDef: JoinDef): string;
28
+ /**
29
+ * Parse an include map into a normalized tree. `true` enables a join with
30
+ * default columns; an object enables the join when it has `select` and/or
31
+ * nested children.
32
+ */
33
+ export declare function normalizeInclude(include: IncludeMap | undefined): Record<string, NormalizedIncludeNode>;
34
+ /**
35
+ * Flatten the include tree into an ordered list of joins (parents before
36
+ * children). Also auto-includes joins required by `expose` paths.
37
+ */
38
+ export declare function resolveActiveJoins(rootJoins: Record<string, JoinDef> | undefined, include: Record<string, NormalizedIncludeNode>, expose: readonly ExposeDef[] | undefined, baseTable: string, joinColumnOverrides?: Record<string, string[]>, reservedColumnNames?: readonly string[]): ResolvedJoin[];
39
+ /** Parse `$join.path.column` or `$table.column` qualified paths. */
40
+ export declare function parseQualifiedPath(qualified: string): {
41
+ joinPath: string;
42
+ column: string;
43
+ isTableQualified: boolean;
44
+ };
45
+ /** Build LEFT JOIN fragments for all resolved joins in order. */
46
+ export declare function buildJoinFragments(resolved: ResolvedJoin[]): ReturnType<typeof sql>[];
47
+ /** Legacy flat SQL alias (`prefix_col`) — default for join columns. */
48
+ export declare function legacyJoinColumnAlias(columnPrefix: string, column: string): string;
49
+ /**
50
+ * Assign collision-safe flat SQL aliases on each resolved join.
51
+ *
52
+ * Uses the legacy `prefix_col` form unless that name is already taken by a
53
+ * base-table column, an expose alias, or another join column — then falls
54
+ * back to `prefix__col`.
55
+ */
56
+ export declare function assignJoinColumnAliases(resolved: ResolvedJoin[], reserved: ReadonlySet<string>): void;
57
+ /** Flat SQL alias for a column on a resolved join. */
58
+ export declare function flatAliasForJoinColumn(join: ResolvedJoin, column: string): string;
59
+ /** SELECT column fragments for resolved joins. */
60
+ export declare function buildJoinSelectColumns(resolved: ResolvedJoin[]): ReturnType<typeof sql>[];
61
+ /** SELECT fragments for exposed top-level columns. */
62
+ export declare function buildExposeSelectColumns(expose: readonly ExposeDef[], resolved: ResolvedJoin[], _baseTable: string): ReturnType<typeof sql>[];
63
+ /**
64
+ * Map of SQL table name → join path for compileFilter `$alias` blocks.
65
+ * Also maps expose aliases to their source table.
66
+ */
67
+ export declare function buildJoinFilterContext(resolved: ResolvedJoin[], expose: readonly ExposeDef[] | undefined, baseTable: string): {
68
+ tableToPath: Map<string, string>;
69
+ exposeColumns: Map<string, {
70
+ table: string;
71
+ column: string;
72
+ }>;
73
+ };
74
+ /**
75
+ * Rewrite a where filter so expose aliases and join-table columns compile
76
+ * correctly when joins are active.
77
+ */
78
+ export declare function translateWhereForJoins(where: Record<string, unknown>, baseTable: string, resolved: ResolvedJoin[], expose: readonly ExposeDef[] | undefined): Record<string, unknown>;
79
+ /** Resolve an orderBy column to a SQL identifier string (`table.col`). */
80
+ export declare function resolveOrderByColumn(column: string, baseTable: string, resolved: ResolvedJoin[], expose?: readonly ExposeDef[]): string;
81
+ /** Flat row key used for cursor pagination values. */
82
+ export declare function flatColumnKeyForOrderBy(column: string, _baseTable: string, resolved: ResolvedJoin[], expose: readonly ExposeDef[] | undefined): string;
83
+ /**
84
+ * Nest flat join columns into the include tree shape. Only nests joins present
85
+ * in `include`; expose columns remain at the top level.
86
+ */
87
+ export declare function nestJoinedData(row: Record<string, unknown>, rootJoins: Record<string, JoinDef>, include: Record<string, NormalizedIncludeNode>, resolved: ResolvedJoin[]): Record<string, unknown>;
88
+ /** Whether include tree has any enabled joins. */
89
+ export declare function hasActiveIncludes(include: Record<string, NormalizedIncludeNode>): boolean;
90
+ /** Expand include for API compat: boolean map for top-level only. */
91
+ export declare function topLevelIncludeFlags(include: Record<string, NormalizedIncludeNode>): Record<string, boolean>;
92
+ export declare function validateOrderByWithJoins(orderBy: OrderBy[], baseColumns: string[], _resolved: ResolvedJoin[], expose: readonly ExposeDef[] | undefined, _baseTable: string): void;
93
+ //# sourceMappingURL=joins.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"joins.d.ts","sourceRoot":"","sources":["../src/joins.ts"],"names":[],"mappings":"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"}