@dudousxd/nestjs-filter 1.7.1 → 1.8.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.
@@ -0,0 +1,69 @@
1
+ /**
2
+ * Encodes keyset cursor values into a compact, URL-safe opaque string
3
+ * (base64url of a JSON array). The shape is intentionally opaque to clients —
4
+ * only this module reads it back.
5
+ *
6
+ * `Date` values are encoded as `{ $d: <iso> }` so they round-trip to `Date`
7
+ * instances on decode (plain JSON would yield a string and break date keyset
8
+ * comparisons).
9
+ */
10
+ export function encodeCursor(values) {
11
+ // Pre-map Date values to a tagged form. We cannot detect dates in the
12
+ // JSON.stringify replacer because Date.toJSON() has already converted them to
13
+ // strings by the time the replacer sees the value.
14
+ const tagged = values.map((v) => (v instanceof Date ? { $d: v.toISOString() } : v));
15
+ const json = JSON.stringify(tagged);
16
+ return Buffer.from(json, 'utf8').toString('base64url');
17
+ }
18
+ /**
19
+ * Decodes an opaque cursor string back into its keyset values. Returns `null`
20
+ * when the cursor is malformed (bad base64, bad JSON, or not an array) so the
21
+ * caller can ignore an invalid cursor instead of crashing.
22
+ */
23
+ export function decodeCursor(cursor) {
24
+ try {
25
+ const json = Buffer.from(cursor, 'base64url').toString('utf8');
26
+ const parsed = JSON.parse(json, (_key, value) => {
27
+ if (value && typeof value === 'object' && typeof value.$d === 'string') {
28
+ return new Date(value.$d);
29
+ }
30
+ return value;
31
+ });
32
+ return Array.isArray(parsed) ? parsed : null;
33
+ }
34
+ catch {
35
+ return null;
36
+ }
37
+ }
38
+ /**
39
+ * Builds the keyset `SortItem[]` for cursor pagination: the caller's effective
40
+ * sorts, with a stable primary-key tiebreaker appended if it is not already
41
+ * present. The tiebreaker inherits the direction of the last sort column so the
42
+ * overall ordering stays monotonic (important for a correct `(cols, pk) > (...)`
43
+ * comparison).
44
+ */
45
+ export function buildKeyset(sorts, primaryKey) {
46
+ const hasPk = sorts.some((s) => s.field === primaryKey);
47
+ if (hasPk)
48
+ return sorts;
49
+ const lastDirection = sorts[sorts.length - 1]?.direction ?? 'asc';
50
+ return [...sorts, { field: primaryKey, direction: lastDirection }];
51
+ }
52
+ /**
53
+ * Extracts the keyset values from a fetched row, in keyset column order.
54
+ * Supports dotted relation paths (e.g. `author.name`) by walking the object.
55
+ */
56
+ export function extractCursorValues(row, keyset) {
57
+ return keyset.map((s) => {
58
+ if (!s.field.includes('.'))
59
+ return row[s.field];
60
+ let current = row;
61
+ for (const segment of s.field.split('.')) {
62
+ if (current == null || typeof current !== 'object')
63
+ return undefined;
64
+ current = current[segment];
65
+ }
66
+ return current;
67
+ });
68
+ }
69
+ //# sourceMappingURL=cursor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cursor.js","sourceRoot":"","sources":["../../src/pagination/cursor.ts"],"names":[],"mappings":"AASA;;;;;;;;GAQG;AACH,MAAM,UAAU,YAAY,CAAC,MAAoB;IAC/C,sEAAsE;IACtE,8EAA8E;IAC9E,mDAAmD;IACnD,MAAM,MAAM,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,YAAY,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACpF,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;IACpC,OAAO,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;AACzD,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,YAAY,CAAC,MAAc;IACzC,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;QAC/D,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE;YAC9C,IAAI,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,OAAO,KAAK,CAAC,EAAE,KAAK,QAAQ,EAAE,CAAC;gBACvE,OAAO,IAAI,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;YAC5B,CAAC;YACD,OAAO,KAAK,CAAC;QACf,CAAC,CAAC,CAAC;QACH,OAAO,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC;IAC/C,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,WAAW,CAAC,KAAiB,EAAE,UAAkB;IAC/D,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,KAAK,UAAU,CAAC,CAAC;IACxD,IAAI,KAAK;QAAE,OAAO,KAAK,CAAC;IACxB,MAAM,aAAa,GAAG,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,EAAE,SAAS,IAAI,KAAK,CAAC;IAClE,OAAO,CAAC,GAAG,KAAK,EAAE,EAAE,KAAK,EAAE,UAAU,EAAE,SAAS,EAAE,aAAa,EAAE,CAAC,CAAC;AACrE,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,mBAAmB,CACjC,GAA4B,EAC5B,MAAkB;IAElB,OAAO,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;QACtB,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC;YAAE,OAAO,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;QAChD,IAAI,OAAO,GAAY,GAAG,CAAC;QAC3B,KAAK,MAAM,OAAO,IAAI,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC;YACzC,IAAI,OAAO,IAAI,IAAI,IAAI,OAAO,OAAO,KAAK,QAAQ;gBAAE,OAAO,SAAS,CAAC;YACrE,OAAO,GAAI,OAAmC,CAAC,OAAO,CAAC,CAAC;QAC1D,CAAC;QACD,OAAO,OAAO,CAAC;IACjB,CAAC,CAAC,CAAC;AACL,CAAC"}
package/dist/runner.d.ts CHANGED
@@ -2,7 +2,7 @@ import { type Type } from '@nestjs/common';
2
2
  import { ModuleRef } from '@nestjs/core';
3
3
  import type { FilterAdapter } from './adapter/adapter.js';
4
4
  import type { ContextAccessor } from './context-accessor.js';
5
- import type { EntityDescription, FilterContext, FilterModuleOptions, SortItem } from './types.js';
5
+ import type { CursorPage, EntityDescription, FilterContext, FilterModuleOptions, SortItem } from './types.js';
6
6
  export declare class FilterRunner {
7
7
  private readonly moduleRef;
8
8
  private readonly options;
@@ -46,7 +46,9 @@ export declare class FilterRunner {
46
46
  * the `meta.fields` payload of generic, table-name-driven endpoints.
47
47
  */
48
48
  describe(entity: Type<unknown>): EntityDescription;
49
- apply<F extends object, Q>(FilterClass: Type<F>, input: unknown, qb: Q, context?: FilterContext): Promise<Q>;
49
+ apply<F extends object, Q>(FilterClass: Type<F>, input: unknown, qb: Q, context?: FilterContext, internal?: {
50
+ native?: boolean;
51
+ }): Promise<Q>;
50
52
  private resolveFilter;
51
53
  private runSetup;
52
54
  /**
@@ -125,7 +127,10 @@ export declare class FilterRunner {
125
127
  * @param context - Optional filter context.
126
128
  * @returns The query builder with filters applied.
127
129
  */
128
- applyDynamic<Q>(entity: Type<unknown>, input: unknown, qb: Q, context?: FilterContext): Promise<Q>;
130
+ applyDynamic<Q>(entity: Type<unknown>, input: unknown, qb: Q, context?: FilterContext, internal?: {
131
+ skipSortAndPagination?: boolean;
132
+ native?: boolean;
133
+ }): Promise<Q>;
129
134
  /**
130
135
  * Runs a dynamic query and **executes** it, returning the page of rows plus
131
136
  * the total count — with pagination-safe relation loading. Unlike
@@ -146,6 +151,31 @@ export declare class FilterRunner {
146
151
  rows: E[];
147
152
  total: number;
148
153
  }>;
154
+ /**
155
+ * Runs a dynamic query with **keyset (cursor) pagination** and executes it,
156
+ * returning a stable, non-overlapping page plus opaque forward/backward
157
+ * cursors. Unlike offset pagination (which drifts and re-scans as rows are
158
+ * inserted), keyset pagination seeks past a boundary row using a
159
+ * `WHERE (sortcols, pk) > (...)` predicate, so it is O(1) per page and stable
160
+ * under concurrent writes.
161
+ *
162
+ * The keyset is the request's effective sort (or `defaultSort`) plus the
163
+ * entity's primary key as a stable tiebreaker. Multi-column sort composes
164
+ * naturally. Direction is honored per column (asc → seek forward with `>`,
165
+ * desc → with `<`); for backward paging (`before`) the comparison and order
166
+ * are reversed internally and the result re-reversed so `items` is always in
167
+ * the requested order.
168
+ *
169
+ * Requires an adapter implementing `getResult`, `getPrimaryKey`,
170
+ * `applyKeysetPagination` and `applyKeysetOrderAndLimit`. Additive — does not
171
+ * change `apply`/`applyDynamic`/`findAndCount`.
172
+ */
173
+ findPage<E>(entity: Type<E>, input: unknown, opts?: {
174
+ qb?: unknown;
175
+ context?: FilterContext;
176
+ }): Promise<CursorPage<E>>;
177
+ /** Flips every keyset column's direction (for backward cursor paging). */
178
+ private reverseKeyset;
149
179
  /**
150
180
  * Splits include paths into join-safe (to-one) and deferred (to-many) sets,
151
181
  * by the cardinality of each path's first relation segment.
@@ -159,11 +189,47 @@ export declare class FilterRunner {
159
189
  * No-op (pass-through) when the adapter exposes no metadata.
160
190
  */
161
191
  private pruneUnknownColumnFilters;
192
+ /**
193
+ * Enforces per-field operator allowlists on a `where` ColumnFilter tree.
194
+ *
195
+ * For each clause whose `field` carries an operator restriction (declared as
196
+ * `{ field, operators }` in `@Filterable.allowed`), the clause's operator
197
+ * (after alias normalization) must be in the permitted set. A disallowed
198
+ * operator is dropped (default) or raises a `BadRequestException` when
199
+ * `throwOnInvalid` is set. Fields without a restriction (plain-string allowed
200
+ * entries, or no allowlist at all) pass through unchanged. Recurses AND/OR.
201
+ */
202
+ private enforceOperatorAllowlist;
203
+ /**
204
+ * Enforces a per-field operator allowlist on an auto-field value, mirroring
205
+ * the adapter's value-shape interpretation:
206
+ *
207
+ * - scalar → `equals`
208
+ * - array → `in`
209
+ * - operator object (`{ gte, lte }`) → each key is an operator
210
+ *
211
+ * Returns the value to apply, or `undefined` when the whole auto-field should
212
+ * be skipped (e.g. a scalar whose implied `equals` is not permitted, or an
213
+ * operator object reduced to no permitted keys). For operator objects, only
214
+ * the disallowed keys are stripped. When `throwOnInvalid` is set, a
215
+ * disallowed operator raises instead of being dropped.
216
+ */
217
+ private enforceAutoFieldOperators;
162
218
  /**
163
219
  * Applies global search for dynamic mode: auto-detects all string columns
164
220
  * from entity metadata (no filter class with static search config).
165
221
  */
166
222
  private applyGlobalSearchDynamic;
223
+ /**
224
+ * Resolves the effective `throwOnInvalid` policy: per-@Filterable wins over
225
+ * the module option, which defaults to `false` (silent-drop, legacy behavior).
226
+ */
227
+ private resolveThrowOnInvalid;
228
+ /**
229
+ * Resolves the effective `defaultSort`: per-@Filterable wins over the module
230
+ * option. Returns undefined when neither is set.
231
+ */
232
+ private resolveDefaultSort;
167
233
  private handleUnknownKey;
168
234
  /**
169
235
  * Parses raw sort input into an array of SortItem objects.
@@ -181,6 +247,15 @@ export declare class FilterRunner {
181
247
  * Silently skips invalid fields.
182
248
  */
183
249
  private validateSorts;
250
+ /**
251
+ * Applies a list of sorts, routing computed/virtual aliases to
252
+ * `applyComputedSort` (their dev-provided SQL expression) and regular columns
253
+ * to `applySort`. Order is preserved across the mix so the resulting
254
+ * `ORDER BY` matches the requested column order. Regular columns are still
255
+ * validated against the allowlist / entity metadata; computed aliases bypass
256
+ * that check because they are dev-declared, not real columns.
257
+ */
258
+ private applySortsWithComputed;
184
259
  /**
185
260
  * Parses raw distinct input into an array of field names.
186
261
  *
@@ -1 +1 @@
1
- {"version":3,"file":"runner.d.ts","sourceRoot":"","sources":["../src/runner.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"runner.d.ts","sourceRoot":"","sources":["../src/runner.ts"],"names":[],"mappings":"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"}