@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.
@@ -1,5 +1,6 @@
1
1
  import { sql } from '@truto/sqlite-builder';
2
- import type { JoinDef, OrderBy } from './types.js';
2
+ import { type ResolvedJoin } from './joins.js';
3
+ import type { ExposeDef, JoinDef, OrderBy } from './types.js';
3
4
  /**
4
5
  * Coerce an untrusted value into a scalar that is safe to bind as a SQL
5
6
  * parameter, throwing on anything else.
@@ -12,25 +13,30 @@ import type { JoinDef, OrderBy } from './types.js';
12
13
  * unescaped — it is always emitted as a bound `?` placeholder instead.
13
14
  */
14
15
  export declare function toBindableValue(value: unknown): string | number | boolean | Date | null;
15
- /**
16
- * Build a SELECT query with joins and pagination.
17
- *
18
- * `joinColumnOverrides[joinName]` overrides the columns pulled from that
19
- * join's remote table for this query only (instead of using the join's
20
- * configured `remote.select`). The base service uses this to honour the
21
- * caller's `select: ['$alias.col', ...]` request.
22
- */
23
- export declare function buildSelect(table: string, options?: {
16
+ export interface BuildSelectOptions {
24
17
  columns?: string[];
25
18
  where?: Record<string, unknown>;
19
+ /** @deprecated Use resolvedJoins instead. */
26
20
  joins?: Record<string, JoinDef>;
21
+ /** @deprecated Use resolvedJoins instead. */
27
22
  include?: Record<string, boolean>;
23
+ /** @deprecated Use resolvedJoins instead. */
28
24
  joinColumnOverrides?: Record<string, string[]>;
25
+ resolvedJoins?: ResolvedJoin[];
26
+ expose?: readonly ExposeDef[];
29
27
  orderBy?: OrderBy[];
30
28
  limit?: number;
31
29
  offset?: number;
32
30
  cursorConditions?: ReturnType<typeof sql>;
33
- }): ReturnType<typeof sql>;
31
+ }
32
+ /**
33
+ * Build a SELECT query with joins and pagination.
34
+ */
35
+ export declare function buildSelect(table: string, options?: BuildSelectOptions): ReturnType<typeof sql>;
36
+ /**
37
+ * Build a JOIN clause from the base table (legacy single-hop API).
38
+ */
39
+ export declare function buildJoin(baseTable: string, joinDef: JoinDef): ReturnType<typeof sql>;
34
40
  /**
35
41
  * Build an INSERT query
36
42
  */
@@ -43,24 +49,29 @@ export declare function buildUpdate(table: string, data: Record<string, unknown>
43
49
  * Build a DELETE query
44
50
  */
45
51
  export declare function buildDelete(table: string, where: Record<string, unknown>): ReturnType<typeof sql>;
52
+ export interface BuildCountOptions {
53
+ where?: Record<string, unknown>;
54
+ resolvedJoins?: ResolvedJoin[];
55
+ expose?: readonly ExposeDef[];
56
+ primaryKey?: string;
57
+ }
46
58
  /**
47
- * Build a COUNT query
48
- */
49
- export declare function buildCount(table: string, where?: Record<string, unknown>): ReturnType<typeof sql>;
50
- /**
51
- * Build a SELECT query for a single record by primary key
59
+ * Build a COUNT query, optionally with the same join graph as list/get.
52
60
  */
53
- export declare function buildSelectById(table: string, primaryKey: string | string[], id: string | number | Record<string, unknown>, options?: {
61
+ export declare function buildCount(table: string, whereOrOptions?: Record<string, unknown> | BuildCountOptions, legacyWhere?: Record<string, unknown>): ReturnType<typeof sql>;
62
+ export interface BuildSelectByIdOptions {
54
63
  columns?: string[];
55
64
  joins?: Record<string, JoinDef>;
56
65
  include?: Record<string, boolean>;
57
66
  joinColumnOverrides?: Record<string, string[]>;
58
- /**
59
- * Optional row-level scoping filter, AND-combined with the primary-key
60
- * match (used to enforce ownership / tenant isolation).
61
- */
67
+ resolvedJoins?: ResolvedJoin[];
68
+ expose?: readonly ExposeDef[];
62
69
  where?: Record<string, unknown>;
63
- }): ReturnType<typeof sql>;
70
+ }
71
+ /**
72
+ * Build a SELECT query for a single record by primary key
73
+ */
74
+ export declare function buildSelectById(table: string, primaryKey: string | string[], id: string | number | Record<string, unknown>, options?: BuildSelectByIdOptions): ReturnType<typeof sql>;
64
75
  /**
65
76
  * Escape a column name using sql.ident
66
77
  */
@@ -1 +1 @@
1
- {"version":3,"file":"sql-builder.d.ts","sourceRoot":"","sources":["../src/sql-builder.ts"],"names":[],"mappings":"AAAA,OAAO,EAAiB,GAAG,EAAE,MAAM,uBAAuB,CAAA;AAE1D,OAAO,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,YAAY,CAAA;AAElD;;;;;;;;;;GAUG;AACH,wBAAgB,eAAe,CAC7B,KAAK,EAAE,OAAO,GACb,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,IAAI,GAAG,IAAI,CAWzC;AAED;;;;;;;GAOG;AACH,wBAAgB,WAAW,CACzB,KAAK,EAAE,MAAM,EACb,OAAO,GAAE;IACP,OAAO,CAAC,EAAE,MAAM,EAAE,CAAA;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IAC/B,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IAC/B,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IACjC,mBAAmB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAA;IAC9C,OAAO,CAAC,EAAE,OAAO,EAAE,CAAA;IACnB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,gBAAgB,CAAC,EAAE,UAAU,CAAC,OAAO,GAAG,CAAC,CAAA;CACrC,GACL,UAAU,CAAC,OAAO,GAAG,CAAC,CA8GxB;AAqCD;;GAEG;AACH,wBAAgB,WAAW,CACzB,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC5B,UAAU,CAAC,OAAO,GAAG,CAAC,CAyBxB;AAED;;GAEG;AACH,wBAAgB,WAAW,CACzB,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC7B,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC7B,UAAU,CAAC,OAAO,GAAG,CAAC,CA2BxB;AAED;;GAEG;AACH,wBAAgB,WAAW,CACzB,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC7B,UAAU,CAAC,OAAO,GAAG,CAAC,CAgBxB;AAED;;GAEG;AACH,wBAAgB,UAAU,CACxB,KAAK,EAAE,MAAM,EACb,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC9B,UAAU,CAAC,OAAO,GAAG,CAAC,CAgBxB;AAED;;GAEG;AACH,wBAAgB,eAAe,CAC7B,KAAK,EAAE,MAAM,EACb,UAAU,EAAE,MAAM,GAAG,MAAM,EAAE,EAC7B,EAAE,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC7C,OAAO,GAAE;IACP,OAAO,CAAC,EAAE,MAAM,EAAE,CAAA;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IAC/B,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IACjC,mBAAmB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAA;IAC9C;;;OAGG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAC3B,GACL,UAAU,CAAC,OAAO,GAAG,CAAC,CA4CxB;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAEnD;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAEjD"}
1
+ {"version":3,"file":"sql-builder.d.ts","sourceRoot":"","sources":["../src/sql-builder.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,6 @@
1
1
  import { compileFilter, sql } from '@truto/sqlite-builder';
2
2
  import { SqlBuilderError } from './errors.js';
3
+ import { buildExposeSelectColumns, buildJoinFragments, buildJoinSelectColumns, isUnsafeObjectKey, legacyJoinColumnAlias, resolveOrderByColumn, translateWhereForJoins, } from './joins.js';
3
4
  /**
4
5
  * Coerce an untrusted value into a scalar that is safe to bind as a SQL
5
6
  * parameter, throwing on anything else.
@@ -24,41 +25,44 @@ export function toBindableValue(value) {
24
25
  }
25
26
  /**
26
27
  * Build a SELECT query with joins and pagination.
27
- *
28
- * `joinColumnOverrides[joinName]` overrides the columns pulled from that
29
- * join's remote table for this query only (instead of using the join's
30
- * configured `remote.select`). The base service uses this to honour the
31
- * caller's `select: ['$alias.col', ...]` request.
32
28
  */
33
29
  export function buildSelect(table, options = {}) {
34
30
  try {
35
- // Build column list
36
31
  const selectColumns = [];
37
32
  if (options.columns && options.columns.length > 0) {
38
- selectColumns.push(...options.columns.map((col) =>
39
- // A bare '*' must be emitted as `"table".*`, not run through
40
- // sql.ident('table.*') (which rejects the wildcard identifier).
41
- col === '*'
33
+ selectColumns.push(...options.columns.map((col) => col === '*'
42
34
  ? sql `${sql.ident(table)}.*`
43
35
  : sql.ident(`${table}.${col}`)));
44
36
  }
45
37
  else {
46
38
  selectColumns.push(sql `${sql.ident(table)}.*`);
47
39
  }
48
- if (options.joins && options.include) {
40
+ const resolved = options.resolvedJoins ?? [];
41
+ if (resolved.length > 0) {
42
+ selectColumns.push(...buildJoinSelectColumns(resolved));
43
+ }
44
+ else if (options.joins && options.include) {
45
+ // Legacy flat join path (backward compat)
49
46
  for (const [joinName, joinDef] of Object.entries(options.joins)) {
50
47
  if (options.include[joinName]) {
51
48
  const joinAlias = joinDef.remote.alias || joinName;
52
49
  const cols = options.joinColumnOverrides?.[joinName] ?? joinDef.remote.select;
53
- const joinColumns = cols.map((col) => sql `${sql.ident(`${joinDef.remote.table}.${col}`)} as ${sql.ident(`${joinAlias}_${col}`)}`);
50
+ const joinColumns = cols.map((col) => sql `${sql.ident(`${joinDef.remote.table}.${col}`)} as ${sql.ident(legacyJoinColumnAlias(joinAlias, col))}`);
54
51
  selectColumns.push(...joinColumns);
55
52
  }
56
53
  }
57
54
  }
58
- // Start building the query using sql.join for the column fragments
55
+ if (options.expose && options.expose.length > 0) {
56
+ selectColumns.push(...buildExposeSelectColumns(options.expose, resolved, table));
57
+ }
59
58
  let query = sql `SELECT ${sql.join(selectColumns, ', ')} FROM ${sql.ident(table)}`;
60
- // Add joins
61
- if (options.joins && options.include) {
59
+ if (resolved.length > 0) {
60
+ const joinFragments = buildJoinFragments(resolved);
61
+ if (joinFragments.length > 0) {
62
+ query = sql.join([query, ...joinFragments], ' ');
63
+ }
64
+ }
65
+ else if (options.joins && options.include) {
62
66
  const joinFragments = [];
63
67
  for (const [joinName, joinDef] of Object.entries(options.joins)) {
64
68
  if (options.include[joinName]) {
@@ -69,28 +73,25 @@ export function buildSelect(table, options = {}) {
69
73
  query = sql.join([query, ...joinFragments], ' ');
70
74
  }
71
75
  }
72
- // Build final query parts
73
76
  const finalParts = [query];
74
- // Build WHERE conditions
75
77
  const whereFragments = [];
76
- // Regular WHERE conditions
77
78
  if (options.where && Object.keys(options.where).length > 0) {
78
- const whereFilter = compileFilter(options.where);
79
- whereFragments.push(whereFilter);
79
+ const translated = resolved.length > 0
80
+ ? translateWhereForJoins(options.where, table, resolved, options.expose)
81
+ : options.where;
82
+ whereFragments.push(compileFilter(translated));
80
83
  }
81
- // Cursor conditions
82
84
  if (options.cursorConditions && options.cursorConditions.text) {
83
85
  whereFragments.push(options.cursorConditions);
84
86
  }
85
- // Add WHERE clause if needed
86
87
  if (whereFragments.length > 0) {
87
88
  const whereClause = sql.join(whereFragments, ' AND ');
88
89
  finalParts.push(sql `WHERE ${whereClause}`);
89
90
  }
90
- // Add ORDER BY
91
91
  if (options.orderBy && options.orderBy.length > 0) {
92
92
  const orderFragments = options.orderBy.map((order) => {
93
- const col = sql.ident(`${table}.${order.column}`);
93
+ const colRef = resolveOrderByColumn(order.column, table, resolved, options.expose);
94
+ const col = sql.ident(colRef);
94
95
  switch (order.direction.toLowerCase()) {
95
96
  case 'asc':
96
97
  return sql `${col} ASC`;
@@ -102,15 +103,12 @@ export function buildSelect(table, options = {}) {
102
103
  });
103
104
  finalParts.push(sql `ORDER BY ${sql.join(orderFragments, ', ')}`);
104
105
  }
105
- // Add LIMIT
106
106
  if (options.limit) {
107
107
  finalParts.push(sql `LIMIT ${options.limit}`);
108
108
  }
109
- // Add OFFSET
110
109
  if (options.offset) {
111
110
  finalParts.push(sql `OFFSET ${options.offset}`);
112
111
  }
113
- // If no WHERE conditions, just join all parts
114
112
  return sql.join(finalParts, ' ');
115
113
  }
116
114
  catch (error) {
@@ -118,13 +116,18 @@ export function buildSelect(table, options = {}) {
118
116
  }
119
117
  }
120
118
  /**
121
- * Build a JOIN clause
119
+ * Build a JOIN clause from the base table (legacy single-hop API).
122
120
  */
123
- function buildJoin(baseTable, joinDef) {
124
- const { remote, localPk, through } = joinDef;
121
+ export function buildJoin(baseTable, joinDef) {
122
+ const localCol = joinDef.localColumn ?? joinDef.localPk;
123
+ if (!localCol) {
124
+ throw new SqlBuilderError('JoinDef requires localColumn or localPk', {
125
+ joinDef,
126
+ });
127
+ }
128
+ const { remote, through } = joinDef;
125
129
  if (through) {
126
- // Many-to-many join through junction table
127
- const throughJoin = sql `LEFT JOIN ${sql.ident(through.table)} ON ${sql.ident(`${baseTable}.${localPk}`)} = ${sql.ident(`${through.table}.${through.from}`)}`;
130
+ const throughJoin = sql `LEFT JOIN ${sql.ident(through.table)} ON ${sql.ident(`${baseTable}.${localCol}`)} = ${sql.ident(`${through.table}.${through.from}`)}`;
128
131
  const remoteJoin = sql `LEFT JOIN ${sql.ident(remote.table)} ON ${sql.ident(`${through.table}.${through.to}`)} = ${sql.ident(`${remote.table}.${remote.pk}`)}`;
129
132
  const joinFragments = [throughJoin, remoteJoin];
130
133
  if (joinDef.where && Object.keys(joinDef.where).length > 0) {
@@ -132,16 +135,13 @@ function buildJoin(baseTable, joinDef) {
132
135
  }
133
136
  return sql.join(joinFragments, ' ');
134
137
  }
135
- else {
136
- // Direct join
137
- const joinFragments = [
138
- sql `LEFT JOIN ${sql.ident(remote.table)} ON ${sql.ident(`${baseTable}.${localPk}`)} = ${sql.ident(`${remote.table}.${remote.pk}`)}`,
139
- ];
140
- if (joinDef.where && Object.keys(joinDef.where).length > 0) {
141
- joinFragments.push(sql `AND ${compileFilter(joinDef.where)}`);
142
- }
143
- return sql.join(joinFragments, ' ');
138
+ const joinFragments = [
139
+ sql `LEFT JOIN ${sql.ident(remote.table)} ON ${sql.ident(`${baseTable}.${localCol}`)} = ${sql.ident(`${remote.table}.${remote.pk}`)}`,
140
+ ];
141
+ if (joinDef.where && Object.keys(joinDef.where).length > 0) {
142
+ joinFragments.push(sql `AND ${compileFilter(joinDef.where)}`);
144
143
  }
144
+ return sql.join(joinFragments, ' ');
145
145
  }
146
146
  /**
147
147
  * Build an INSERT query
@@ -150,10 +150,6 @@ export function buildInsert(table, data) {
150
150
  try {
151
151
  const columns = Object.keys(data);
152
152
  const values = Object.values(data);
153
- // Create individual placeholders for the VALUES clause. `toBindableValue`
154
- // forces each value to be bound as a parameter and throws on non-scalar
155
- // objects — preventing a `{ text, values }`-shaped value from being
156
- // spliced in as a raw SQL fragment.
157
153
  const placeholderFragments = values.map((value) => sql `${toBindableValue(value)}`);
158
154
  const query = sql `
159
155
  INSERT INTO ${sql.ident(table)} (${sql.ident(columns)})
@@ -170,12 +166,7 @@ export function buildInsert(table, data) {
170
166
  */
171
167
  export function buildUpdate(table, data, where) {
172
168
  try {
173
- // Build SET clauses using sql fragments. `toBindableValue` forces each
174
- // value to be bound as a parameter (and rejects non-scalar objects),
175
- // preventing a `{ text, values }`-shaped value from being spliced in as
176
- // raw SQL.
177
169
  const setFragments = Object.entries(data).map(([column, value]) => sql `${sql.ident(column)} = ${toBindableValue(value)}`);
178
- // Build WHERE clause
179
170
  const whereFilter = compileFilter(where);
180
171
  const queryParts = [
181
172
  sql `UPDATE ${sql.ident(table)}`,
@@ -205,19 +196,50 @@ export function buildDelete(table, where) {
205
196
  }
206
197
  }
207
198
  /**
208
- * Build a COUNT query
199
+ * Build a COUNT query, optionally with the same join graph as list/get.
209
200
  */
210
- export function buildCount(table, where) {
201
+ export function buildCount(table, whereOrOptions, legacyWhere) {
211
202
  try {
212
- const queryParts = [sql `SELECT COUNT(*) as count FROM ${sql.ident(table)}`];
203
+ let where;
204
+ let resolved = [];
205
+ let expose;
206
+ let primaryKey = 'id';
207
+ if (whereOrOptions &&
208
+ ('resolvedJoins' in whereOrOptions ||
209
+ 'expose' in whereOrOptions ||
210
+ 'primaryKey' in whereOrOptions)) {
211
+ const opts = whereOrOptions;
212
+ where = opts.where;
213
+ resolved = opts.resolvedJoins ?? [];
214
+ expose = opts.expose;
215
+ primaryKey = opts.primaryKey ?? 'id';
216
+ }
217
+ else {
218
+ where = whereOrOptions ?? legacyWhere;
219
+ }
220
+ const countExpr = resolved.length > 0
221
+ ? sql `COUNT(DISTINCT ${sql.ident(`${table}.${primaryKey}`)})`
222
+ : sql `COUNT(*)`;
223
+ const queryParts = [
224
+ sql `SELECT ${countExpr} as count FROM ${sql.ident(table)}`,
225
+ ];
226
+ if (resolved.length > 0) {
227
+ const joinFragments = buildJoinFragments(resolved);
228
+ if (joinFragments.length > 0) {
229
+ queryParts.push(sql.join(joinFragments, ' '));
230
+ }
231
+ }
213
232
  if (where && Object.keys(where).length > 0) {
214
- const whereFilter = compileFilter(where);
233
+ const translated = resolved.length > 0
234
+ ? translateWhereForJoins(where, table, resolved, expose)
235
+ : where;
236
+ const whereFilter = compileFilter(translated);
215
237
  queryParts.push(sql `WHERE ${whereFilter}`);
216
238
  }
217
239
  return sql.join(queryParts, ' ');
218
240
  }
219
241
  catch (error) {
220
- throw new SqlBuilderError(`Failed to build COUNT query: ${error instanceof Error ? error.message : 'Unknown error'}`, { table, where, error });
242
+ throw new SqlBuilderError(`Failed to build COUNT query: ${error instanceof Error ? error.message : 'Unknown error'}`, { table, whereOrOptions, error });
221
243
  }
222
244
  }
223
245
  /**
@@ -226,36 +248,50 @@ export function buildCount(table, where) {
226
248
  export function buildSelectById(table, primaryKey, id, options = {}) {
227
249
  const { where: scope, ...restOptions } = options;
228
250
  const where = {};
229
- // Check if there are active JOINs that could cause column ambiguity
230
- const hasActiveJoins = options.joins &&
231
- options.include &&
232
- Object.keys(options.include).some((key) => options.include[key]);
233
- // The scope filter columns live on the base table, so when joins are active
234
- // they must be qualified under `$table` (same as the PK) to avoid ambiguity.
251
+ const hasActiveJoins = (options.resolvedJoins && options.resolvedJoins.length > 0) ||
252
+ (options.joins &&
253
+ options.include &&
254
+ Object.keys(options.include).some((key) => options.include[key]));
235
255
  const hasScope = scope && Object.keys(scope).length > 0;
256
+ let baseScope = {};
257
+ let joinScope = {};
258
+ if (hasScope) {
259
+ const translated = hasActiveJoins
260
+ ? translateWhereForJoins(scope, table, options.resolvedJoins ?? [], options.expose)
261
+ : { ...scope };
262
+ for (const [key, value] of Object.entries(translated)) {
263
+ if (key.startsWith('$')) {
264
+ if (!isUnsafeObjectKey(key.slice(1)))
265
+ joinScope[key] = value;
266
+ }
267
+ else if (!isUnsafeObjectKey(key)) {
268
+ baseScope[key] = value;
269
+ }
270
+ }
271
+ }
236
272
  if (Array.isArray(primaryKey)) {
237
273
  if (typeof id !== 'object' || id === null || Array.isArray(id)) {
238
274
  throw new SqlBuilderError('Composite primary key requires an object with key-value pairs', { primaryKey, id });
239
275
  }
240
276
  if (hasActiveJoins) {
241
- // Use qualified table syntax to avoid column ambiguity
242
- where[`$${table}`] = { ...id, ...(hasScope ? scope : {}) };
277
+ where[`$${table}`] = { ...id, ...baseScope };
278
+ Object.assign(where, joinScope);
243
279
  }
244
280
  else {
245
281
  Object.assign(where, id);
246
282
  if (hasScope)
247
- Object.assign(where, scope);
283
+ Object.assign(where, baseScope);
248
284
  }
249
285
  }
250
286
  else {
251
287
  if (hasActiveJoins) {
252
- // Use qualified table syntax to avoid column ambiguity
253
- where[`$${table}`] = { [primaryKey]: id, ...(hasScope ? scope : {}) };
288
+ where[`$${table}`] = { [primaryKey]: id, ...baseScope };
289
+ Object.assign(where, joinScope);
254
290
  }
255
291
  else {
256
292
  where[primaryKey] = id;
257
293
  if (hasScope)
258
- Object.assign(where, scope);
294
+ Object.assign(where, baseScope);
259
295
  }
260
296
  }
261
297
  return buildSelect(table, {
@@ -1 +1 @@
1
- {"version":3,"file":"sql-builder.js","sourceRoot":"","sources":["../src/sql-builder.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"sql-builder.js","sourceRoot":"","sources":["../src/sql-builder.ts"],"names":[],"mappings":"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"}
package/dist/types.d.ts CHANGED
@@ -153,7 +153,7 @@ export interface ListParams<TSelect extends readonly SelectField[] | undefined =
153
153
  limit?: number;
154
154
  orderBy?: OrderBy[];
155
155
  where?: Record<string, unknown>;
156
- include?: Record<string, boolean>;
156
+ include?: IncludeMap;
157
157
  includeSecrets?: boolean;
158
158
  select?: TSelect;
159
159
  }
@@ -170,12 +170,14 @@ export interface ListResult<T> {
170
170
  */
171
171
  export interface CountParams {
172
172
  where?: Record<string, unknown>;
173
+ /** Join graph to use when filtering on joined / exposed columns. */
174
+ include?: IncludeMap;
173
175
  }
174
176
  /**
175
177
  * Get parameters
176
178
  */
177
179
  export interface GetParams<TSelect extends readonly SelectField[] | undefined = undefined> {
178
- include?: Record<string, boolean>;
180
+ include?: IncludeMap;
179
181
  includeSecrets?: boolean;
180
182
  select?: TSelect;
181
183
  /**
@@ -190,7 +192,7 @@ export interface GetParams<TSelect extends readonly SelectField[] | undefined =
190
192
  * Create parameters
191
193
  */
192
194
  export interface CreateParams<TSelect extends readonly SelectField[] | undefined = undefined> {
193
- include?: Record<string, boolean>;
195
+ include?: IncludeMap;
194
196
  includeSecrets?: boolean;
195
197
  select?: TSelect;
196
198
  }
@@ -198,7 +200,7 @@ export interface CreateParams<TSelect extends readonly SelectField[] | undefined
198
200
  * Update parameters
199
201
  */
200
202
  export interface UpdateParams<TSelect extends readonly SelectField[] | undefined = undefined> {
201
- include?: Record<string, boolean>;
203
+ include?: IncludeMap;
202
204
  includeSecrets?: boolean;
203
205
  select?: TSelect;
204
206
  /**
@@ -213,7 +215,7 @@ export interface UpdateParams<TSelect extends readonly SelectField[] | undefined
213
215
  * Delete parameters
214
216
  */
215
217
  export interface DeleteParams {
216
- include?: Record<string, boolean>;
218
+ include?: IncludeMap;
217
219
  /**
218
220
  * Additional row-level scoping filter, AND-combined with the primary-key
219
221
  * match. Use this (typically from a `before` hook) to enforce ownership /
@@ -238,12 +240,43 @@ export interface MethodOptions {
238
240
  * Join definition kinds
239
241
  */
240
242
  export type JoinKind = 'one' | 'many';
243
+ /**
244
+ * Top-level column projection from a joined column.
245
+ *
246
+ * @example `{ from: '$environment_integration.environment_id', as: 'environment_id' }`
247
+ */
248
+ export interface ExposeDef {
249
+ /** Qualified join path, e.g. `$environment_integration.environment_id`. */
250
+ from: string;
251
+ /** Top-level alias on the returned row. */
252
+ as: string;
253
+ }
254
+ /**
255
+ * Include spec for a single join. `true` includes default columns; an object
256
+ * may set `select` and/or enable nested joins by key.
257
+ */
258
+ export type IncludeSpec = boolean | IncludeNode;
259
+ export interface IncludeNode {
260
+ select?: string[];
261
+ [nestedJoin: string]: boolean | IncludeSpec | string[] | undefined;
262
+ }
263
+ /** Map of join names to include specs (supports nested includes). */
264
+ export type IncludeMap = Record<string, IncludeSpec>;
241
265
  /**
242
266
  * Join definition
243
267
  */
244
268
  export interface JoinDef {
245
269
  kind: JoinKind;
246
- localPk: string;
270
+ /**
271
+ * @deprecated Prefer `localColumn` for FK joins; kept for backward compat.
272
+ * Parent-table column used in the ON clause when `localColumn` is omitted.
273
+ */
274
+ localPk?: string;
275
+ /**
276
+ * Local FK column on the parent table (base table or parent join's remote
277
+ * table). Falls back to `localPk` when omitted.
278
+ */
279
+ localColumn?: string;
247
280
  through?: {
248
281
  table: string;
249
282
  from: string;
@@ -257,6 +290,8 @@ export interface JoinDef {
257
290
  };
258
291
  where?: Record<string, unknown>;
259
292
  schema: z.ZodTypeAny;
293
+ /** Nested joins reachable from this join's remote table. */
294
+ joins?: Record<string, JoinDef>;
260
295
  }
261
296
  /**
262
297
  * Secret field definition.
@@ -331,6 +366,11 @@ export interface ServiceOptions<TRow extends z.ZodTypeAny, TCreate extends z.Zod
331
366
  createSchema: TCreate;
332
367
  updateSchema: TUpdate;
333
368
  joins?: TJoins;
369
+ /**
370
+ * Project joined columns onto the top-level row, e.g.
371
+ * `{ from: '$environment_integration.environment_id', as: 'environment_id' }`.
372
+ */
373
+ expose?: ExposeDef[];
334
374
  secrets?: TSecrets;
335
375
  timestamps?: TimestampConfig;
336
376
  hooks?: Partial<HookMap<BaseCtx>>;
@@ -343,8 +383,17 @@ export interface ServiceOptions<TRow extends z.ZodTypeAny, TCreate extends z.Zod
343
383
  /**
344
384
  * Compute join types based on include parameter
345
385
  */
346
- export type ComputeJoins<TJoins extends Record<string, JoinDef>, TInclude extends Record<string, boolean> | undefined> = TInclude extends Record<string, boolean> ? {
347
- [K in keyof TInclude & keyof TJoins]: TInclude[K] extends true ? TJoins[K]['kind'] extends 'one' ? z.infer<TJoins[K]['schema']> | null : z.infer<TJoins[K]['schema']>[] : never;
386
+ type IncludeEnabled<T> = T extends true ? true : T extends Record<string, unknown> ? true : false;
387
+ type JoinResultType<TJoin extends JoinDef> = TJoin['kind'] extends 'one' ? z.infer<TJoin['schema']> | null : z.infer<TJoin['schema']>[];
388
+ type ComputeNestedJoins<TNested extends Record<string, JoinDef> | undefined, TInclude extends IncludeNode | undefined> = TNested extends Record<string, JoinDef> ? TInclude extends IncludeNode ? {
389
+ [K in keyof TNested & keyof TInclude]: K extends 'select' ? never : IncludeEnabled<TInclude[K]> extends true ? TNested[K] extends JoinDef ? JoinResultType<TNested[K]> & (TNested[K]['joins'] extends Record<string, JoinDef> ? ComputeNestedJoins<TNested[K]['joins'], TInclude[K] extends IncludeNode ? TInclude[K] : undefined> : Record<string, never>) : never : never;
390
+ } : Record<string, never> : Record<string, never>;
391
+ export type ComputeJoins<TJoins extends Record<string, JoinDef>, TInclude extends IncludeMap | undefined> = TInclude extends IncludeMap ? {
392
+ [K in keyof TInclude & keyof TJoins]: IncludeEnabled<TInclude[K]> extends true ? TJoins[K] extends JoinDef ? JoinResultType<TJoins[K]> & ComputeNestedJoins<TJoins[K]['joins'], TInclude[K] extends IncludeNode ? TInclude[K] : undefined> : never : never;
393
+ } : Record<string, never>;
394
+ /** Merge exposed column types onto a row type. */
395
+ export type ComputeExposed<TExpose extends readonly ExposeDef[] | undefined> = TExpose extends readonly ExposeDef[] ? {
396
+ [E in TExpose[number] as E['as']]: unknown;
348
397
  } : Record<string, never>;
349
398
  /**
350
399
  * Extract row type from service
@@ -358,4 +407,5 @@ export type ServiceCreate<T> = T extends BaseService<any, infer TCreate, any, an
358
407
  * Extract update type from service
359
408
  */
360
409
  export type ServiceUpdate<T> = T extends BaseService<any, any, infer TUpdate, any, any> ? z.infer<TUpdate> : never;
410
+ export {};
361
411
  //# sourceMappingURL=types.d.ts.map