@adonis-agora/filter 0.4.0 → 0.6.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/CHANGELOG.md +12 -0
- package/dist/src/aggregate.d.ts +61 -0
- package/dist/src/aggregate.d.ts.map +1 -0
- package/dist/src/aggregate.js +132 -0
- package/dist/src/aggregate.js.map +1 -0
- package/dist/src/aggregate_path.d.ts +25 -0
- package/dist/src/aggregate_path.d.ts.map +1 -0
- package/dist/src/aggregate_path.js +35 -0
- package/dist/src/aggregate_path.js.map +1 -0
- package/dist/src/field_aliases.d.ts +2 -0
- package/dist/src/field_aliases.d.ts.map +1 -1
- package/dist/src/field_aliases.js +4 -0
- package/dist/src/field_aliases.js.map +1 -1
- package/dist/src/filter_spec.d.ts +46 -1
- package/dist/src/filter_spec.d.ts.map +1 -1
- package/dist/src/filter_spec.js +16 -0
- package/dist/src/filter_spec.js.map +1 -1
- package/dist/src/generate_client.d.ts.map +1 -1
- package/dist/src/generate_client.js +5 -0
- package/dist/src/generate_client.js.map +1 -1
- package/dist/src/index.d.ts +8 -4
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +5 -3
- package/dist/src/index.js.map +1 -1
- package/dist/src/lucid_adapter.d.ts +45 -1
- package/dist/src/lucid_adapter.d.ts.map +1 -1
- package/dist/src/lucid_adapter.js +123 -0
- package/dist/src/lucid_adapter.js.map +1 -1
- package/dist/src/lucid_macros.d.ts +7 -3
- package/dist/src/lucid_macros.d.ts.map +1 -1
- package/dist/src/lucid_macros.js +12 -2
- package/dist/src/lucid_macros.js.map +1 -1
- package/dist/src/parse_request.d.ts +8 -0
- package/dist/src/parse_request.d.ts.map +1 -1
- package/dist/src/parse_request.js +24 -0
- package/dist/src/parse_request.js.map +1 -1
- package/dist/src/runner.d.ts.map +1 -1
- package/dist/src/runner.js +108 -17
- package/dist/src/runner.js.map +1 -1
- package/dist/src/testing.d.ts +2 -0
- package/dist/src/testing.d.ts.map +1 -1
- package/dist/src/testing.js +4 -0
- package/dist/src/testing.js.map +1 -1
- package/dist/src/types.d.ts +51 -0
- package/dist/src/types.d.ts.map +1 -1
- package/package.json +5 -1
package/dist/src/index.js
CHANGED
|
@@ -4,16 +4,18 @@ export { FILTER_OPERATORS, OPERATOR_ALIASES } from './operators.js';
|
|
|
4
4
|
export { InvalidColumnFilterError, MAX_FILTER_DEPTH, normalizeOperator, validateColumnFilter, validateColumnFilters, } from './validate-column-filter.js';
|
|
5
5
|
export { isOperatorObject, valueToColumnFilters } from './value-shape.js';
|
|
6
6
|
export { escapeLike } from './escape-like.js';
|
|
7
|
+
export { parseAggregatePath } from './aggregate_path.js';
|
|
8
|
+
export { discoverAggregateSources } from './aggregate.js';
|
|
7
9
|
export { defineFilter, FilterDefinitionError, specToFilterConfig, } from './filter_spec.js';
|
|
8
10
|
export { filterableFieldPaths, generateFilterClient, generateFilterClients, sortableFieldPaths, } from './generate_client.js';
|
|
9
11
|
export { applyCursorFromRequest, applyFilterFromRequest } from './apply_from_request.js';
|
|
10
12
|
export { registerFilterMacros } from './lucid_macros.js';
|
|
11
|
-
export { parseFilterRequest, parseSort, toColumnFilters } from './parse_request.js';
|
|
13
|
+
export { parseDistinct, parseFilterRequest, parseSort, toColumnFilters } from './parse_request.js';
|
|
12
14
|
export { parseSpatieRequest } from './spatie_parser.js';
|
|
13
15
|
export { applyCursor, applyFilter } from './runner.js';
|
|
14
|
-
export { applyColumnFilters, applyFullTextSearch, applyKeyset, applySearch, applySort, applyVectorSimilarity, } from './lucid_adapter.js';
|
|
16
|
+
export { applyColumnFilters, applyComputedField, applyComputedSort, applyDistinct, applyFullTextSearch, applyKeyset, applySearch, applySort, applyVectorSimilarity, resolveComputedExpression, } from './lucid_adapter.js';
|
|
15
17
|
export { buildCursorPage, buildKeyset, decodeCursor, encodeCursor, extractCursorValues, reverseKeyset, } from './cursor.js';
|
|
16
|
-
export { remapFilterAliases, remapSortAliases, resolveFieldAlias } from './field_aliases.js';
|
|
18
|
+
export { remapDistinctAliases, remapFilterAliases, remapSortAliases, resolveFieldAlias, } from './field_aliases.js';
|
|
17
19
|
export { normalizeInput } from './normalizer.js';
|
|
18
20
|
export { resolveInputFromRequest } from './source_resolver.js';
|
|
19
21
|
//# sourceMappingURL=index.js.map
|
package/dist/src/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,kEAAkE;AAClE,MAAM,CAAC,MAAM,OAAO,GAAG,OAAO,CAAC;AAQ/B,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AACpE,OAAO,EACL,wBAAwB,EACxB,gBAAgB,EAChB,iBAAiB,EACjB,oBAAoB,EACpB,qBAAqB,GACtB,MAAM,6BAA6B,CAAC;AACrC,OAAO,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAC;AAC1E,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,kEAAkE;AAClE,MAAM,CAAC,MAAM,OAAO,GAAG,OAAO,CAAC;AAQ/B,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AACpE,OAAO,EACL,wBAAwB,EACxB,gBAAgB,EAChB,iBAAiB,EACjB,oBAAoB,EACpB,qBAAqB,GACtB,MAAM,6BAA6B,CAAC;AACrC,OAAO,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAC;AAC1E,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AAEzD,OAAO,EAAE,wBAAwB,EAAE,MAAM,gBAAgB,CAAC;AAe1D,OAAO,EACL,YAAY,EACZ,qBAAqB,EACrB,kBAAkB,GACnB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EACL,oBAAoB,EACpB,oBAAoB,EACpB,qBAAqB,EACrB,kBAAkB,GACnB,MAAM,sBAAsB,CAAC;AAiB9B,OAAO,EAAE,sBAAsB,EAAE,sBAAsB,EAAE,MAAM,yBAAyB,CAAC;AAMzF,OAAO,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AAEzD,OAAO,EAAE,aAAa,EAAE,kBAAkB,EAAE,SAAS,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AACnG,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAExD,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAEvD,OAAO,EACL,kBAAkB,EAClB,kBAAkB,EAClB,iBAAiB,EACjB,aAAa,EACb,mBAAmB,EACnB,WAAW,EACX,WAAW,EACX,SAAS,EACT,qBAAqB,EACrB,yBAAyB,GAK1B,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EACL,eAAe,EACf,WAAW,EACX,YAAY,EACZ,YAAY,EACZ,mBAAmB,EACnB,aAAa,GACd,MAAM,aAAa,CAAC;AAErB,OAAO,EACL,oBAAoB,EACpB,kBAAkB,EAClB,gBAAgB,EAChB,iBAAiB,GAClB,MAAM,oBAAoB,CAAC;AAE5B,OAAO,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAEjD,OAAO,EAAE,uBAAuB,EAAE,MAAM,sBAAsB,CAAC"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { ColumnFilter } from './operators.js';
|
|
2
|
-
import type { SortItem } from './types.js';
|
|
2
|
+
import type { ComputedSource, SortItem } from './types.js';
|
|
3
3
|
/**
|
|
4
4
|
* The structural subset of a Lucid `ModelQueryBuilder` / `DatabaseQueryBuilder`
|
|
5
5
|
* the adapter drives. An `@adonisjs/lucid` query builder satisfies it — declared
|
|
@@ -58,6 +58,15 @@ export interface QueryBuilderLike {
|
|
|
58
58
|
* {@link QueryBuilderLike.whereRaw}.
|
|
59
59
|
*/
|
|
60
60
|
orderByRaw(sql: string, bindings?: readonly unknown[]): QueryBuilderLike;
|
|
61
|
+
/**
|
|
62
|
+
* Restrict the query to DISTINCT tuples of `columns` — Lucid's `distinct`.
|
|
63
|
+
* Used by {@link applyDistinct} to execute a client `.distinct(...)`
|
|
64
|
+
* projection. The columns are the already alias-resolved, allow-listed field
|
|
65
|
+
* names; a variadic column list matches Lucid's signature exactly. Optional on
|
|
66
|
+
* real Lucid builders; the recording mock implements it so the translation
|
|
67
|
+
* stays unit-testable.
|
|
68
|
+
*/
|
|
69
|
+
distinct(...columns: string[]): QueryBuilderLike;
|
|
61
70
|
limit(count: number): QueryBuilderLike;
|
|
62
71
|
}
|
|
63
72
|
/**
|
|
@@ -197,6 +206,41 @@ export declare function applyFullTextSearch(qb: QueryBuilderLike, opts: FullText
|
|
|
197
206
|
export declare function applyColumnFilters(qb: QueryBuilderLike, filters: ColumnFilter[]): void;
|
|
198
207
|
/** Apply sort directives to a Lucid query builder, in order. */
|
|
199
208
|
export declare function applySort(qb: QueryBuilderLike, sorts: SortItem[]): void;
|
|
209
|
+
/**
|
|
210
|
+
* Apply a DISTINCT projection over `columns` to a Lucid query builder — the
|
|
211
|
+
* executable half of the client's `.distinct(...)` (which until now the server
|
|
212
|
+
* silently ignored). A no-op for an empty list. The columns are the
|
|
213
|
+
* already-validated, alias-resolved field names (the runner resolves aliases and
|
|
214
|
+
* enforces the allow-list before calling this), so nothing client-controlled is
|
|
215
|
+
* interpolated: Lucid quotes each identifier itself.
|
|
216
|
+
*/
|
|
217
|
+
export declare function applyDistinct(qb: QueryBuilderLike, columns: string[]): void;
|
|
218
|
+
/**
|
|
219
|
+
* Resolve a {@link ComputedSource} to its final SQL expression string. The
|
|
220
|
+
* string form is verbatim; the function form is invoked with the root table
|
|
221
|
+
* {@link ComputedContext} so it can splice the outer alias into a correlated
|
|
222
|
+
* subquery. Either way the result is dev-authored — never client text.
|
|
223
|
+
*/
|
|
224
|
+
export declare function resolveComputedExpression(source: ComputedSource, alias: string): string;
|
|
225
|
+
/**
|
|
226
|
+
* Apply a filter on a dev-declared **computed field** to a Lucid query builder.
|
|
227
|
+
*
|
|
228
|
+
* The already-resolved `expression` is inlined as the raw left-hand side (it is
|
|
229
|
+
* dev-authored — a verbatim string or a function's output — never client text);
|
|
230
|
+
* the client's filter VALUE always rides through as a positional `?` binding,
|
|
231
|
+
* exactly the injection-safety contract real-column filters have. The whole
|
|
232
|
+
* expression is parenthesized so a compound source
|
|
233
|
+
* (`first || ' ' || last`, `(SELECT …)`) composes under the operator without a
|
|
234
|
+
* precedence surprise.
|
|
235
|
+
*/
|
|
236
|
+
export declare function applyComputedField(qb: QueryBuilderLike, expression: string, filter: ColumnFilter): void;
|
|
237
|
+
/**
|
|
238
|
+
* Append an ORDER BY on a dev-declared **computed field** to a Lucid query
|
|
239
|
+
* builder via `orderByRaw`. Uses append semantics (like `orderBy`) so a computed
|
|
240
|
+
* sort composes with real-column sorts in request order. The expression is
|
|
241
|
+
* dev-authored and parenthesized; the direction is a validated literal.
|
|
242
|
+
*/
|
|
243
|
+
export declare function applyComputedSort(qb: QueryBuilderLike, expression: string, direction: 'asc' | 'desc'): void;
|
|
200
244
|
/**
|
|
201
245
|
* Apply a keyset (cursor) seek predicate to a Lucid query builder for row-value
|
|
202
246
|
* comparison across the keyset columns.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"lucid_adapter.d.ts","sourceRoot":"","sources":["../../src/lucid_adapter.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAkB,MAAM,gBAAgB,CAAC;AACnE,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"lucid_adapter.d.ts","sourceRoot":"","sources":["../../src/lucid_adapter.ts"],"names":[],"mappings":"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"}
|
|
@@ -247,6 +247,129 @@ export function applySort(qb, sorts) {
|
|
|
247
247
|
qb.orderBy(sort.field, sort.direction);
|
|
248
248
|
}
|
|
249
249
|
}
|
|
250
|
+
/**
|
|
251
|
+
* Apply a DISTINCT projection over `columns` to a Lucid query builder — the
|
|
252
|
+
* executable half of the client's `.distinct(...)` (which until now the server
|
|
253
|
+
* silently ignored). A no-op for an empty list. The columns are the
|
|
254
|
+
* already-validated, alias-resolved field names (the runner resolves aliases and
|
|
255
|
+
* enforces the allow-list before calling this), so nothing client-controlled is
|
|
256
|
+
* interpolated: Lucid quotes each identifier itself.
|
|
257
|
+
*/
|
|
258
|
+
export function applyDistinct(qb, columns) {
|
|
259
|
+
if (columns.length === 0)
|
|
260
|
+
return;
|
|
261
|
+
qb.distinct(...columns);
|
|
262
|
+
}
|
|
263
|
+
/**
|
|
264
|
+
* Resolve a {@link ComputedSource} to its final SQL expression string. The
|
|
265
|
+
* string form is verbatim; the function form is invoked with the root table
|
|
266
|
+
* {@link ComputedContext} so it can splice the outer alias into a correlated
|
|
267
|
+
* subquery. Either way the result is dev-authored — never client text.
|
|
268
|
+
*/
|
|
269
|
+
export function resolveComputedExpression(source, alias) {
|
|
270
|
+
return typeof source === 'function' ? source({ alias }) : source;
|
|
271
|
+
}
|
|
272
|
+
/**
|
|
273
|
+
* Apply a filter on a dev-declared **computed field** to a Lucid query builder.
|
|
274
|
+
*
|
|
275
|
+
* The already-resolved `expression` is inlined as the raw left-hand side (it is
|
|
276
|
+
* dev-authored — a verbatim string or a function's output — never client text);
|
|
277
|
+
* the client's filter VALUE always rides through as a positional `?` binding,
|
|
278
|
+
* exactly the injection-safety contract real-column filters have. The whole
|
|
279
|
+
* expression is parenthesized so a compound source
|
|
280
|
+
* (`first || ' ' || last`, `(SELECT …)`) composes under the operator without a
|
|
281
|
+
* precedence surprise.
|
|
282
|
+
*/
|
|
283
|
+
export function applyComputedField(qb, expression, filter) {
|
|
284
|
+
const op = normalizeOperator(filter.operator);
|
|
285
|
+
const value = filter.value;
|
|
286
|
+
const lhs = `(${expression})`;
|
|
287
|
+
switch (op) {
|
|
288
|
+
case 'equals':
|
|
289
|
+
qb.whereRaw(`${lhs} = ?`, [value]);
|
|
290
|
+
break;
|
|
291
|
+
case 'notEquals':
|
|
292
|
+
qb.whereRaw(`${lhs} <> ?`, [value]);
|
|
293
|
+
break;
|
|
294
|
+
case 'gt':
|
|
295
|
+
qb.whereRaw(`${lhs} > ?`, [value]);
|
|
296
|
+
break;
|
|
297
|
+
case 'gte':
|
|
298
|
+
qb.whereRaw(`${lhs} >= ?`, [value]);
|
|
299
|
+
break;
|
|
300
|
+
case 'lt':
|
|
301
|
+
qb.whereRaw(`${lhs} < ?`, [value]);
|
|
302
|
+
break;
|
|
303
|
+
case 'lte':
|
|
304
|
+
qb.whereRaw(`${lhs} <= ?`, [value]);
|
|
305
|
+
break;
|
|
306
|
+
case 'in':
|
|
307
|
+
case 'isAnyOf': {
|
|
308
|
+
const values = Array.isArray(value) ? value : [];
|
|
309
|
+
// An empty IN list matches nothing — emit an always-false predicate rather
|
|
310
|
+
// than invalid `IN ()` SQL.
|
|
311
|
+
if (values.length === 0)
|
|
312
|
+
qb.whereRaw('1 = 0');
|
|
313
|
+
else
|
|
314
|
+
qb.whereRaw(`${lhs} in (${values.map(() => '?').join(', ')})`, values);
|
|
315
|
+
break;
|
|
316
|
+
}
|
|
317
|
+
case 'notIn': {
|
|
318
|
+
const values = Array.isArray(value) ? value : [];
|
|
319
|
+
if (values.length === 0)
|
|
320
|
+
qb.whereRaw('1 = 1');
|
|
321
|
+
else
|
|
322
|
+
qb.whereRaw(`${lhs} not in (${values.map(() => '?').join(', ')})`, values);
|
|
323
|
+
break;
|
|
324
|
+
}
|
|
325
|
+
case 'between': {
|
|
326
|
+
const [low, high] = value;
|
|
327
|
+
qb.whereRaw(`${lhs} between ? and ?`, [low, high]);
|
|
328
|
+
break;
|
|
329
|
+
}
|
|
330
|
+
case 'notBetween': {
|
|
331
|
+
const [low, high] = value;
|
|
332
|
+
qb.whereRaw(`${lhs} not between ? and ?`, [low, high]);
|
|
333
|
+
break;
|
|
334
|
+
}
|
|
335
|
+
case 'contains':
|
|
336
|
+
case 'iContains':
|
|
337
|
+
qb.whereRaw(`${lhs} ilike ?`, [like(value, 'contains')]);
|
|
338
|
+
break;
|
|
339
|
+
case 'notContains':
|
|
340
|
+
qb.whereRaw(`(${lhs} not ilike ? or ${lhs} is null)`, [like(value, 'contains')]);
|
|
341
|
+
break;
|
|
342
|
+
case 'startsWith':
|
|
343
|
+
qb.whereRaw(`${lhs} ilike ?`, [like(value, 'startsWith')]);
|
|
344
|
+
break;
|
|
345
|
+
case 'endsWith':
|
|
346
|
+
qb.whereRaw(`${lhs} ilike ?`, [like(value, 'endsWith')]);
|
|
347
|
+
break;
|
|
348
|
+
case 'isNull':
|
|
349
|
+
case 'notExists':
|
|
350
|
+
qb.whereRaw(`${lhs} is null`);
|
|
351
|
+
break;
|
|
352
|
+
case 'isNotNull':
|
|
353
|
+
case 'exists':
|
|
354
|
+
qb.whereRaw(`${lhs} is not null`);
|
|
355
|
+
break;
|
|
356
|
+
case 'isEmpty':
|
|
357
|
+
qb.whereRaw(`${lhs} = ?`, ['']);
|
|
358
|
+
break;
|
|
359
|
+
case 'isNotEmpty':
|
|
360
|
+
qb.whereRaw(`${lhs} <> ?`, ['']);
|
|
361
|
+
break;
|
|
362
|
+
}
|
|
363
|
+
}
|
|
364
|
+
/**
|
|
365
|
+
* Append an ORDER BY on a dev-declared **computed field** to a Lucid query
|
|
366
|
+
* builder via `orderByRaw`. Uses append semantics (like `orderBy`) so a computed
|
|
367
|
+
* sort composes with real-column sorts in request order. The expression is
|
|
368
|
+
* dev-authored and parenthesized; the direction is a validated literal.
|
|
369
|
+
*/
|
|
370
|
+
export function applyComputedSort(qb, expression, direction) {
|
|
371
|
+
qb.orderByRaw(`(${expression}) ${direction === 'desc' ? 'desc' : 'asc'}`);
|
|
372
|
+
}
|
|
250
373
|
/**
|
|
251
374
|
* Apply a keyset (cursor) seek predicate to a Lucid query builder for row-value
|
|
252
375
|
* comparison across the keyset columns.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"lucid_adapter.js","sourceRoot":"","sources":["../../src/lucid_adapter.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"lucid_adapter.js","sourceRoot":"","sources":["../../src/lucid_adapter.ts"],"names":[],"mappings":"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"}
|
|
@@ -39,14 +39,18 @@ declare module '@adonisjs/lucid/types/model' {
|
|
|
39
39
|
* allow-listed filter/sort/search) and return the query for chaining — the
|
|
40
40
|
* method form of the free `applyFilterFromRequest`. Pagination is resolved
|
|
41
41
|
* but not returned here; use {@link filterPaginate} when you need it.
|
|
42
|
+
*
|
|
43
|
+
* `ctx` is optional: when omitted, the active `HttpContext` is read from
|
|
44
|
+
* AsyncLocalStorage (`HttpContext.getOrFail()`). Pass it explicitly outside a
|
|
45
|
+
* request scope (e.g. a job/command), where there is no ambient context.
|
|
42
46
|
*/
|
|
43
|
-
applyFilterFromRequest(spec: FilterSpec, ctx
|
|
47
|
+
applyFilterFromRequest(spec: FilterSpec, ctx?: FilterRequestContext, options?: ApplyFromRequestOptions): this;
|
|
44
48
|
/**
|
|
45
49
|
* Apply a {@link FilterSpec} from the request context and paginate with the
|
|
46
50
|
* resolved `{ page, size }`, returning Lucid's paginator — filter + paginate
|
|
47
|
-
* in one terminal call.
|
|
51
|
+
* in one terminal call. `ctx` is optional (see {@link applyFilterFromRequest}).
|
|
48
52
|
*/
|
|
49
|
-
filterPaginate(spec: FilterSpec, ctx
|
|
53
|
+
filterPaginate(spec: FilterSpec, ctx?: FilterRequestContext, options?: ApplyFromRequestOptions): ReturnType<this['paginate']>;
|
|
50
54
|
}
|
|
51
55
|
}
|
|
52
56
|
//# sourceMappingURL=lucid_macros.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"lucid_macros.d.ts","sourceRoot":"","sources":["../../src/lucid_macros.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"lucid_macros.d.ts","sourceRoot":"","sources":["../../src/lucid_macros.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,KAAK,uBAAuB,EAC5B,KAAK,oBAAoB,EAE1B,MAAM,yBAAyB,CAAC;AACjC,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAanD;;;;;;;GAOG;AACH,MAAM,WAAW,qBAAqB;IACpC,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,IAAI,EAAE,OAAO,EAAE,GAAG,IAAI,EAAE,KAAK,EAAE,KAAK,OAAO,GAAG,IAAI,CAAC;CAC7E;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAgB,oBAAoB,CAAC,iBAAiB,EAAE,qBAAqB,GAAG,IAAI,CAoBnF;AAED,OAAO,QAAQ,6BAA6B,CAAC;IAC3C,UAAU,yBAAyB,CAAC,KAAK,SAAS,UAAU,EAAE,MAAM,GAAG,YAAY,CAAC,KAAK,CAAC;QACxF;;;;;;;;;WASG;QACH,sBAAsB,CACpB,IAAI,EAAE,UAAU,EAChB,GAAG,CAAC,EAAE,oBAAoB,EAC1B,OAAO,CAAC,EAAE,uBAAuB,GAChC,IAAI,CAAC;QACR;;;;WAIG;QACH,cAAc,CACZ,IAAI,EAAE,UAAU,EAChB,GAAG,CAAC,EAAE,oBAAoB,EAC1B,OAAO,CAAC,EAAE,uBAAuB,GAChC,UAAU,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC;KACjC;CACF"}
|
package/dist/src/lucid_macros.js
CHANGED
|
@@ -1,4 +1,14 @@
|
|
|
1
|
+
import { HttpContext } from '@adonisjs/core/http';
|
|
1
2
|
import { applyFilterFromRequest, } from './apply_from_request.js';
|
|
3
|
+
/**
|
|
4
|
+
* O ctx da request para o macro: explícito, ou o `HttpContext` ativo lido do AsyncLocalStorage do
|
|
5
|
+
* Adonis quando omitido. `getOrFail()` lança quando não há request em escopo (ex.: chamada dentro de
|
|
6
|
+
* um job/command) — nesse caso passe o ctx explicitamente. Fica no macro (camada Adonis); o
|
|
7
|
+
* `applyFilterFromRequest` livre continua framework-agnostic, exigindo o ctx.
|
|
8
|
+
*/
|
|
9
|
+
function resolveCtx(ctx) {
|
|
10
|
+
return ctx ?? HttpContext.getOrFail();
|
|
11
|
+
}
|
|
2
12
|
/**
|
|
3
13
|
* Register the chainable filter macros onto a Lucid query-builder class (the
|
|
4
14
|
* method-call form of {@link applyFilterFromRequest}). Call this from a provider's
|
|
@@ -21,11 +31,11 @@ import { applyFilterFromRequest, } from './apply_from_request.js';
|
|
|
21
31
|
*/
|
|
22
32
|
export function registerFilterMacros(ModelQueryBuilder) {
|
|
23
33
|
ModelQueryBuilder.macro('applyFilterFromRequest', function (spec, ctx, options) {
|
|
24
|
-
applyFilterFromRequest(this, spec, ctx, options);
|
|
34
|
+
applyFilterFromRequest(this, spec, resolveCtx(ctx), options);
|
|
25
35
|
return this;
|
|
26
36
|
});
|
|
27
37
|
ModelQueryBuilder.macro('filterPaginate', function (spec, ctx, options) {
|
|
28
|
-
const { page, size } = applyFilterFromRequest(this, spec, ctx, options);
|
|
38
|
+
const { page, size } = applyFilterFromRequest(this, spec, resolveCtx(ctx), options);
|
|
29
39
|
return this.paginate(page, size);
|
|
30
40
|
});
|
|
31
41
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"lucid_macros.js","sourceRoot":"","sources":["../../src/lucid_macros.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"lucid_macros.js","sourceRoot":"","sources":["../../src/lucid_macros.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAElD,OAAO,EAGL,sBAAsB,GACvB,MAAM,yBAAyB,CAAC;AAIjC;;;;;GAKG;AACH,SAAS,UAAU,CAAC,GAAqC;IACvD,OAAO,GAAG,IAAI,WAAW,CAAC,SAAS,EAAE,CAAC;AACxC,CAAC;AAcD;;;;;;;;;;;;;;;;;;;GAmBG;AACH,MAAM,UAAU,oBAAoB,CAAC,iBAAwC;IAC3E,iBAAiB,CAAC,KAAK,CAAC,wBAAwB,EAAE,UAEhD,IAAgB,EAChB,GAA0B,EAC1B,OAAiC;QAEjC,sBAAsB,CAAC,IAAI,EAAE,IAAI,EAAE,UAAU,CAAC,GAAG,CAAC,EAAE,OAAO,CAAC,CAAC;QAC7D,OAAO,IAAI,CAAC;IACd,CAAiD,CAAC,CAAC;IAEnD,iBAAiB,CAAC,KAAK,CAAC,gBAAgB,EAAE,UAExC,IAAgB,EAChB,GAA0B,EAC1B,OAAiC;QAEjC,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,sBAAsB,CAAC,IAAI,EAAE,IAAI,EAAE,UAAU,CAAC,GAAG,CAAC,EAAE,OAAO,CAAC,CAAC;QACpF,OAAO,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IACnC,CAAiD,CAAC,CAAC;AACrD,CAAC"}
|
|
@@ -2,6 +2,13 @@ import type { ColumnFilter } from './operators.js';
|
|
|
2
2
|
import type { FilterInput, SortItem } from './types.js';
|
|
3
3
|
/** Map one `filter[field]=…` entry to `ColumnFilter[]` (Spatie/JSON:API shapes). */
|
|
4
4
|
export declare function toColumnFilters(field: string, value: unknown): ColumnFilter[];
|
|
5
|
+
/**
|
|
6
|
+
* Parse the `distinct` param into a de-duplicated list of field names. Accepts a
|
|
7
|
+
* comma-separated string (`distinct=afsc,base`) or a repeated/array form
|
|
8
|
+
* (`distinct[]=afsc&distinct[]=base`) — the shapes the client's `toQueryString()`
|
|
9
|
+
* and structured `build()` emit. Non-string entries are ignored.
|
|
10
|
+
*/
|
|
11
|
+
export declare function parseDistinct(distinct: unknown): string[];
|
|
5
12
|
/** Parse the `sort` param (`-createdAt,name` or `sort[]=…`) into ordered {@link SortItem}s. */
|
|
6
13
|
export declare function parseSort(sort: unknown): SortItem[];
|
|
7
14
|
/**
|
|
@@ -13,6 +20,7 @@ export declare function parseSort(sort: unknown): SortItem[];
|
|
|
13
20
|
* - `filter[id]=1,2,3` / `filter[id][]=1&filter[id][]=2` → IN
|
|
14
21
|
* - `filter[age][gte]=18` → operator filter
|
|
15
22
|
* - `sort=-createdAt,name` → sort items
|
|
23
|
+
* - `distinct=afsc,base` / `distinct[]=afsc&distinct[]=base` → distinct fields
|
|
16
24
|
* - `search=term`, `page`/`size` (or `page[number]`/`page[size]`)
|
|
17
25
|
*
|
|
18
26
|
* Pure reshape — no validation or allow-listing here; that happens in
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"parse_request.d.ts","sourceRoot":"","sources":["../../src/parse_request.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAuB,MAAM,gBAAgB,CAAC;AACxE,OAAO,KAAK,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAWxD,oFAAoF;AACpF,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,YAAY,EAAE,CA4B7E;AAED,+FAA+F;AAC/F,wBAAgB,SAAS,CAAC,IAAI,EAAE,OAAO,GAAG,QAAQ,EAAE,CAanD;AAcD
|
|
1
|
+
{"version":3,"file":"parse_request.d.ts","sourceRoot":"","sources":["../../src/parse_request.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAuB,MAAM,gBAAgB,CAAC;AACxE,OAAO,KAAK,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAWxD,oFAAoF;AACpF,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,YAAY,EAAE,CA4B7E;AAED;;;;;GAKG;AACH,wBAAgB,aAAa,CAAC,QAAQ,EAAE,OAAO,GAAG,MAAM,EAAE,CAYzD;AAED,+FAA+F;AAC/F,wBAAgB,SAAS,CAAC,IAAI,EAAE,OAAO,GAAG,QAAQ,EAAE,CAanD;AAcD;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,kBAAkB,CAAC,EAAE,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,WAAW,CAwB3E"}
|
|
@@ -38,6 +38,26 @@ export function toColumnFilters(field, value) {
|
|
|
38
38
|
// Bare scalar → equals.
|
|
39
39
|
return [{ field, operator: 'equals', value }];
|
|
40
40
|
}
|
|
41
|
+
/**
|
|
42
|
+
* Parse the `distinct` param into a de-duplicated list of field names. Accepts a
|
|
43
|
+
* comma-separated string (`distinct=afsc,base`) or a repeated/array form
|
|
44
|
+
* (`distinct[]=afsc&distinct[]=base`) — the shapes the client's `toQueryString()`
|
|
45
|
+
* and structured `build()` emit. Non-string entries are ignored.
|
|
46
|
+
*/
|
|
47
|
+
export function parseDistinct(distinct) {
|
|
48
|
+
let raw = [];
|
|
49
|
+
if (typeof distinct === 'string')
|
|
50
|
+
raw = distinct.split(',');
|
|
51
|
+
else if (Array.isArray(distinct))
|
|
52
|
+
raw = distinct.filter((s) => typeof s === 'string');
|
|
53
|
+
const out = [];
|
|
54
|
+
for (const entry of raw) {
|
|
55
|
+
const field = entry.trim();
|
|
56
|
+
if (field.length > 0 && !out.includes(field))
|
|
57
|
+
out.push(field);
|
|
58
|
+
}
|
|
59
|
+
return out;
|
|
60
|
+
}
|
|
41
61
|
/** Parse the `sort` param (`-createdAt,name` or `sort[]=…`) into ordered {@link SortItem}s. */
|
|
42
62
|
export function parseSort(sort) {
|
|
43
63
|
let raw = [];
|
|
@@ -77,6 +97,7 @@ function parsePagination(qs) {
|
|
|
77
97
|
* - `filter[id]=1,2,3` / `filter[id][]=1&filter[id][]=2` → IN
|
|
78
98
|
* - `filter[age][gte]=18` → operator filter
|
|
79
99
|
* - `sort=-createdAt,name` → sort items
|
|
100
|
+
* - `distinct=afsc,base` / `distinct[]=afsc&distinct[]=base` → distinct fields
|
|
80
101
|
* - `search=term`, `page`/`size` (or `page[number]`/`page[size]`)
|
|
81
102
|
*
|
|
82
103
|
* Pure reshape — no validation or allow-listing here; that happens in
|
|
@@ -95,6 +116,9 @@ export function parseFilterRequest(qs) {
|
|
|
95
116
|
const sort = parseSort(qs.sort);
|
|
96
117
|
if (sort.length > 0)
|
|
97
118
|
out.sort = sort;
|
|
119
|
+
const distinct = parseDistinct(qs.distinct);
|
|
120
|
+
if (distinct.length > 0)
|
|
121
|
+
out.distinct = distinct;
|
|
98
122
|
if (typeof qs.search === 'string' && qs.search.length > 0)
|
|
99
123
|
out.search = qs.search;
|
|
100
124
|
const { page, size } = parsePagination(qs);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"parse_request.js","sourceRoot":"","sources":["../../src/parse_request.ts"],"names":[],"mappings":"AAGA,SAAS,KAAK,CAAC,KAAc;IAC3B,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IACtE,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;QACrD,MAAM,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;QACxB,IAAI,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC;YAAE,OAAO,CAAC,CAAC;IACnC,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,oFAAoF;AACpF,MAAM,UAAU,eAAe,CAAC,KAAa,EAAE,KAAc;IAC3D,gDAAgD;IAChD,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACzB,OAAO,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;IAC5C,CAAC;IACD,yEAAyE;IACzE,IAAI,KAAK,IAAI,IAAI,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC/C,OAAO,MAAM,CAAC,OAAO,CAAC,KAAgC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,EAAE,OAAO,CAAC,EAAE,EAAE,CAAC,CAAC;YACpF,KAAK;YACL,QAAQ,EAAE,QAA+B;YACzC,KAAK,EAAE,OAAO;SACf,CAAC,CAAC,CAAC;IACN,CAAC;IACD,+DAA+D;IAC/D,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;QACrD,OAAO;YACL;gBACE,KAAK;gBACL,QAAQ,EAAE,IAAI;gBACd,KAAK,EAAE,KAAK;qBACT,KAAK,CAAC,GAAG,CAAC;qBACV,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;qBACpB,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC;aAC/B;SACF,CAAC;IACJ,CAAC;IACD,wBAAwB;IACxB,OAAO,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,CAAC;AAChD,CAAC;AAED,+FAA+F;AAC/F,MAAM,UAAU,SAAS,CAAC,IAAa;IACrC,IAAI,GAAG,GAAa,EAAE,CAAC;IACvB,IAAI,OAAO,IAAI,KAAK,QAAQ;QAAE,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;SAC/C,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC;QAAE,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAe,EAAE,CAAC,OAAO,CAAC,KAAK,QAAQ,CAAC,CAAC;IAE3F,MAAM,KAAK,GAAe,EAAE,CAAC;IAC7B,KAAK,MAAM,KAAK,IAAI,GAAG,EAAE,CAAC;QACxB,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;QAC3B,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;YAAE,SAAS;QACjC,IAAI,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC;YAAE,KAAK,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,MAAM,EAAE,CAAC,CAAC;;YAC/E,KAAK,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC,CAAC;IAC/C,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,eAAe,CAAC,EAA2B;IAClD,IAAI,IAAI,GAAG,KAAK,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC;IAC1B,IAAI,IAAI,GAAG,KAAK,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC;IAC1B,mDAAmD;IACnD,IAAI,EAAE,CAAC,IAAI,IAAI,IAAI,IAAI,OAAO,EAAE,CAAC,IAAI,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;QAC9E,MAAM,CAAC,GAAG,EAAE,CAAC,IAA+B,CAAC;QAC7C,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,IAAI,CAAC;QAC/B,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC;IAC/B,CAAC;IACD,OAAO,EAAE,GAAG,CAAC,IAAI,KAAK,SAAS,IAAI,EAAE,IAAI,EAAE,CAAC,EAAE,GAAG,CAAC,IAAI,KAAK,SAAS,IAAI,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;AACtF,CAAC;AAED
|
|
1
|
+
{"version":3,"file":"parse_request.js","sourceRoot":"","sources":["../../src/parse_request.ts"],"names":[],"mappings":"AAGA,SAAS,KAAK,CAAC,KAAc;IAC3B,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IACtE,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;QACrD,MAAM,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;QACxB,IAAI,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC;YAAE,OAAO,CAAC,CAAC;IACnC,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,oFAAoF;AACpF,MAAM,UAAU,eAAe,CAAC,KAAa,EAAE,KAAc;IAC3D,gDAAgD;IAChD,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACzB,OAAO,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;IAC5C,CAAC;IACD,yEAAyE;IACzE,IAAI,KAAK,IAAI,IAAI,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC/C,OAAO,MAAM,CAAC,OAAO,CAAC,KAAgC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,EAAE,OAAO,CAAC,EAAE,EAAE,CAAC,CAAC;YACpF,KAAK;YACL,QAAQ,EAAE,QAA+B;YACzC,KAAK,EAAE,OAAO;SACf,CAAC,CAAC,CAAC;IACN,CAAC;IACD,+DAA+D;IAC/D,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;QACrD,OAAO;YACL;gBACE,KAAK;gBACL,QAAQ,EAAE,IAAI;gBACd,KAAK,EAAE,KAAK;qBACT,KAAK,CAAC,GAAG,CAAC;qBACV,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;qBACpB,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC;aAC/B;SACF,CAAC;IACJ,CAAC;IACD,wBAAwB;IACxB,OAAO,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,CAAC;AAChD,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,aAAa,CAAC,QAAiB;IAC7C,IAAI,GAAG,GAAa,EAAE,CAAC;IACvB,IAAI,OAAO,QAAQ,KAAK,QAAQ;QAAE,GAAG,GAAG,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;SACvD,IAAI,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC;QAC9B,GAAG,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAe,EAAE,CAAC,OAAO,CAAC,KAAK,QAAQ,CAAC,CAAC;IAEnE,MAAM,GAAG,GAAa,EAAE,CAAC;IACzB,KAAK,MAAM,KAAK,IAAI,GAAG,EAAE,CAAC;QACxB,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;QAC3B,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC;YAAE,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAChE,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,+FAA+F;AAC/F,MAAM,UAAU,SAAS,CAAC,IAAa;IACrC,IAAI,GAAG,GAAa,EAAE,CAAC;IACvB,IAAI,OAAO,IAAI,KAAK,QAAQ;QAAE,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;SAC/C,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC;QAAE,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAe,EAAE,CAAC,OAAO,CAAC,KAAK,QAAQ,CAAC,CAAC;IAE3F,MAAM,KAAK,GAAe,EAAE,CAAC;IAC7B,KAAK,MAAM,KAAK,IAAI,GAAG,EAAE,CAAC;QACxB,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;QAC3B,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;YAAE,SAAS;QACjC,IAAI,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC;YAAE,KAAK,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,MAAM,EAAE,CAAC,CAAC;;YAC/E,KAAK,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC,CAAC;IAC/C,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,eAAe,CAAC,EAA2B;IAClD,IAAI,IAAI,GAAG,KAAK,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC;IAC1B,IAAI,IAAI,GAAG,KAAK,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC;IAC1B,mDAAmD;IACnD,IAAI,EAAE,CAAC,IAAI,IAAI,IAAI,IAAI,OAAO,EAAE,CAAC,IAAI,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;QAC9E,MAAM,CAAC,GAAG,EAAE,CAAC,IAA+B,CAAC;QAC7C,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,IAAI,CAAC;QAC/B,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC;IAC/B,CAAC;IACD,OAAO,EAAE,GAAG,CAAC,IAAI,KAAK,SAAS,IAAI,EAAE,IAAI,EAAE,CAAC,EAAE,GAAG,CAAC,IAAI,KAAK,SAAS,IAAI,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;AACtF,CAAC;AAED;;;;;;;;;;;;;;GAcG;AACH,MAAM,UAAU,kBAAkB,CAAC,EAA2B;IAC5D,MAAM,GAAG,GAAgB,EAAE,CAAC;IAE5B,IAAI,EAAE,CAAC,MAAM,IAAI,IAAI,IAAI,OAAO,EAAE,CAAC,MAAM,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC;QACpF,MAAM,OAAO,GAAmB,EAAE,CAAC;QACnC,KAAK,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC,MAAiC,CAAC,EAAE,CAAC;YAClF,OAAO,CAAC,IAAI,CAAC,GAAG,eAAe,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC;QACjD,CAAC;QACD,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC;YAAE,GAAG,CAAC,OAAO,GAAG,OAAO,CAAC;IAChD,CAAC;IAED,MAAM,IAAI,GAAG,SAAS,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC;IAChC,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC;QAAE,GAAG,CAAC,IAAI,GAAG,IAAI,CAAC;IAErC,MAAM,QAAQ,GAAG,aAAa,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC;IAC5C,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC;QAAE,GAAG,CAAC,QAAQ,GAAG,QAAQ,CAAC;IAEjD,IAAI,OAAO,EAAE,CAAC,MAAM,KAAK,QAAQ,IAAI,EAAE,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC;QAAE,GAAG,CAAC,MAAM,GAAG,EAAE,CAAC,MAAM,CAAC;IAElF,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,eAAe,CAAC,EAAE,CAAC,CAAC;IAC3C,IAAI,IAAI,KAAK,SAAS;QAAE,GAAG,CAAC,IAAI,GAAG,IAAI,CAAC;IACxC,IAAI,IAAI,KAAK,SAAS;QAAE,GAAG,CAAC,IAAI,GAAG,IAAI,CAAC;IAExC,OAAO,GAAG,CAAC;AACb,CAAC"}
|
package/dist/src/runner.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runner.d.ts","sourceRoot":"","sources":["../../src/runner.ts"],"names":[],"mappings":"AACA,OAAO,EACL,KAAK,YAAY,EACjB,KAAK,cAAc,EAIpB,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"runner.d.ts","sourceRoot":"","sources":["../../src/runner.ts"],"names":[],"mappings":"AACA,OAAO,EACL,KAAK,YAAY,EACjB,KAAK,cAAc,EAIpB,MAAM,aAAa,CAAC;AAOrB,OAAO,EACL,KAAK,gBAAgB,EAWtB,MAAM,oBAAoB,CAAC;AAE5B,OAAO,KAAK,EAAkB,YAAY,EAAE,WAAW,EAAY,MAAM,YAAY,CAAC;AAItF,sFAAsF;AACtF,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;CACd;AA+RD;;;;;;;;;;;;GAYG;AACH,wBAAgB,WAAW,CACzB,EAAE,EAAE,gBAAgB,EACpB,KAAK,EAAE,WAAW,EAClB,MAAM,EAAE,YAAY,GACnB,kBAAkB,CAmCpB;AAED,mGAAmG;AACnG,MAAM,WAAW,YAAa,SAAQ,YAAY;IAChD,wFAAwF;IACxF,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,WAAW,CACzB,EAAE,EAAE,gBAAgB,EACpB,KAAK,EAAE,WAAW,GAAG,YAAY,EACjC,MAAM,EAAE,YAAY,GACnB,cAAc,CA0BhB"}
|
package/dist/src/runner.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { coerceFilterValue } from './coerce_value.js';
|
|
2
2
|
import { buildKeyset, decodeCursor, reverseKeyset, } from './cursor.js';
|
|
3
|
-
import { remapFilterAliases, remapSortAliases } from './field_aliases.js';
|
|
4
|
-
import { applyColumnFilters, applyFullTextSearch, applyKeyset, applySearch, applySort, applyVectorSimilarity, } from './lucid_adapter.js';
|
|
3
|
+
import { remapDistinctAliases, remapFilterAliases, remapSortAliases, resolveFieldAlias, } from './field_aliases.js';
|
|
4
|
+
import { applyColumnFilters, applyComputedField, applyComputedSort, applyDistinct, applyFullTextSearch, applyKeyset, applySearch, applySort, applyVectorSimilarity, resolveComputedExpression, } from './lucid_adapter.js';
|
|
5
5
|
import { InvalidColumnFilterError, validateColumnFilters } from './validate-column-filter.js';
|
|
6
6
|
function isAllowed(field, allow) {
|
|
7
7
|
if (allow === '*')
|
|
@@ -13,6 +13,26 @@ function isAllowed(field, allow) {
|
|
|
13
13
|
function clamp(n, min, max) {
|
|
14
14
|
return Math.min(max, Math.max(min, n));
|
|
15
15
|
}
|
|
16
|
+
/**
|
|
17
|
+
* Own-property lookup of a declared computed field. A client-supplied field name
|
|
18
|
+
* is never trusted as a bare map key (prototype-pollution guard) — only an
|
|
19
|
+
* OWN, non-inherited key resolves to a computed source.
|
|
20
|
+
*/
|
|
21
|
+
function computedKey(computed, field) {
|
|
22
|
+
return (computed !== undefined &&
|
|
23
|
+
typeof field === 'string' &&
|
|
24
|
+
field.length > 0 &&
|
|
25
|
+
Object.hasOwn(computed, field));
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* A top-level filter that targets a declared computed field: a leaf (has a
|
|
29
|
+
* field, no AND/OR children) whose name is an own key of the computed map.
|
|
30
|
+
* Computed fields are only recognised at the top level of `input.filters` — the
|
|
31
|
+
* shape the client emits — never nested inside a boolean group.
|
|
32
|
+
*/
|
|
33
|
+
function isComputedLeaf(filter, computed) {
|
|
34
|
+
return computedKey(computed, filter.field) && filter.AND === undefined && filter.OR === undefined;
|
|
35
|
+
}
|
|
16
36
|
/**
|
|
17
37
|
* Operators whose value is a LIKE pattern rather than a column-typed value. Their argument stays a
|
|
18
38
|
* string no matter what kind the column is declared as — coercing `contains: '3'` on a numeric
|
|
@@ -102,18 +122,35 @@ function prune(filter, allowed, throwOnInvalid, fieldTypes) {
|
|
|
102
122
|
function applyFilterConditions(qb, input, config) {
|
|
103
123
|
const throwOnInvalid = config.throwOnInvalid ?? false;
|
|
104
124
|
if (input.filters && input.filters.length > 0) {
|
|
105
|
-
//
|
|
106
|
-
//
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
125
|
+
// Computed fields are a separate namespace from real columns: a top-level
|
|
126
|
+
// leaf on a declared computed key is routed to the computed hook (its
|
|
127
|
+
// declaration IS its allow-list) and NEVER run through the column
|
|
128
|
+
// alias/validate/allow-list path below. Everything else is a normal column
|
|
129
|
+
// filter. Checked before alias resolution so a computed key is not remapped.
|
|
130
|
+
const columnFilters = [];
|
|
131
|
+
for (const filter of input.filters) {
|
|
132
|
+
if (isComputedLeaf(filter, config.computed)) {
|
|
133
|
+
const expression = resolveComputedExpression(config.computed?.[filter.field], config.table ?? '');
|
|
134
|
+
applyComputedField(qb, expression, filter);
|
|
135
|
+
}
|
|
136
|
+
else {
|
|
137
|
+
columnFilters.push(filter);
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
if (columnFilters.length > 0) {
|
|
141
|
+
// Alias resolution runs FIRST — the allow-list, validation and query builder
|
|
142
|
+
// all see the resolved target column, never the client-facing alias key.
|
|
143
|
+
const aliased = config.aliases
|
|
144
|
+
? columnFilters.map((f) => remapFilterAliases(f, config.aliases))
|
|
145
|
+
: columnFilters;
|
|
146
|
+
// Structural validation next (operator/value shape, depth, field charset).
|
|
147
|
+
validateColumnFilters(aliased);
|
|
148
|
+
const safe = aliased
|
|
149
|
+
.map((f) => prune(f, config.allowed, throwOnInvalid, config.fieldTypes))
|
|
150
|
+
.filter((f) => f !== null);
|
|
151
|
+
if (safe.length > 0) {
|
|
152
|
+
applyColumnFilters(qb, safe);
|
|
153
|
+
}
|
|
117
154
|
}
|
|
118
155
|
}
|
|
119
156
|
if (input.search) {
|
|
@@ -138,6 +175,57 @@ function applyFilterConditions(qb, input, config) {
|
|
|
138
175
|
}
|
|
139
176
|
}
|
|
140
177
|
}
|
|
178
|
+
/**
|
|
179
|
+
* Resolve the alias-mapped, allow-listed distinct fields for the request. A
|
|
180
|
+
* distinct field is a projected column, so it is gated by the SAME `allowed`
|
|
181
|
+
* boundary a `where` field is — aliases resolve first, then the allow-list;
|
|
182
|
+
* unknown fields are dropped (or rejected under `throwOnInvalid`).
|
|
183
|
+
*/
|
|
184
|
+
function resolveSafeDistinct(fields, config) {
|
|
185
|
+
const throwOnInvalid = config.throwOnInvalid ?? false;
|
|
186
|
+
const aliased = config.aliases
|
|
187
|
+
? remapDistinctAliases(fields, config.aliases)
|
|
188
|
+
: fields;
|
|
189
|
+
const safe = [];
|
|
190
|
+
for (const field of aliased) {
|
|
191
|
+
if (isAllowed(field, config.allowed)) {
|
|
192
|
+
if (!safe.includes(field))
|
|
193
|
+
safe.push(field);
|
|
194
|
+
}
|
|
195
|
+
else if (throwOnInvalid) {
|
|
196
|
+
throw new InvalidColumnFilterError(`Field "${field}" is not a distinct-able column.`);
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
return safe;
|
|
200
|
+
}
|
|
201
|
+
/**
|
|
202
|
+
* Apply the request's sort directives in order, routing each to the right hook:
|
|
203
|
+
* a declared computed field goes to `applyComputedSort` (an appended
|
|
204
|
+
* `orderByRaw`), a real column goes through alias resolution + the `sortable`
|
|
205
|
+
* allow-list to `applySort` (an appended `orderBy`). Both hooks append, so a
|
|
206
|
+
* computed sort and a real-column sort compose in request order — a client can
|
|
207
|
+
* sort by `fullName` then `id` and get exactly that ORDER BY sequence.
|
|
208
|
+
*/
|
|
209
|
+
function applySortsWithComputed(qb, sort, config) {
|
|
210
|
+
const throwOnInvalid = config.throwOnInvalid ?? false;
|
|
211
|
+
const sortable = config.sortable ?? config.allowed;
|
|
212
|
+
for (const item of sort) {
|
|
213
|
+
if (computedKey(config.computed, item.field)) {
|
|
214
|
+
const expression = resolveComputedExpression(config.computed?.[item.field], config.table ?? '');
|
|
215
|
+
applyComputedSort(qb, expression, item.direction);
|
|
216
|
+
continue;
|
|
217
|
+
}
|
|
218
|
+
const field = config.aliases
|
|
219
|
+
? resolveFieldAlias(config.aliases, item.field)
|
|
220
|
+
: item.field;
|
|
221
|
+
if (isAllowed(field, sortable)) {
|
|
222
|
+
applySort(qb, [{ field, direction: item.direction }]);
|
|
223
|
+
}
|
|
224
|
+
else if (throwOnInvalid) {
|
|
225
|
+
throw new InvalidColumnFilterError(`Field "${item.field}" is not sortable.`);
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
}
|
|
141
229
|
/** Resolve the alias-mapped, allow-listed sort directives for the request. */
|
|
142
230
|
function resolveSafeSort(sort, config) {
|
|
143
231
|
const throwOnInvalid = config.throwOnInvalid ?? false;
|
|
@@ -189,9 +277,12 @@ export function applyFilter(qb, input, config) {
|
|
|
189
277
|
});
|
|
190
278
|
}
|
|
191
279
|
if (input.sort && input.sort.length > 0) {
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
280
|
+
applySortsWithComputed(qb, input.sort, config);
|
|
281
|
+
}
|
|
282
|
+
if (input.distinct && input.distinct.length > 0) {
|
|
283
|
+
const safeDistinct = resolveSafeDistinct(input.distinct, config);
|
|
284
|
+
if (safeDistinct.length > 0) {
|
|
285
|
+
applyDistinct(qb, safeDistinct);
|
|
195
286
|
}
|
|
196
287
|
}
|
|
197
288
|
const size = clamp(input.size ?? config.defaultSize ?? 25, 1, config.maxSize ?? 100);
|