@dudousxd/nestjs-filter 1.31.0 → 1.32.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +69 -0
- package/dist/adapter/adapter.d.ts +15 -1
- package/dist/adapter/adapter.d.ts.map +1 -1
- package/dist/decorator/filterable.decorator.d.ts.map +1 -1
- package/dist/decorator/filterable.decorator.js +1 -0
- package/dist/decorator/filterable.decorator.js.map +1 -1
- package/dist/input/bracket-keys.d.ts +11 -0
- package/dist/input/bracket-keys.d.ts.map +1 -0
- package/dist/input/bracket-keys.js +103 -0
- package/dist/input/bracket-keys.js.map +1 -0
- package/dist/interceptor/apply-filter.interceptor.d.ts +10 -0
- package/dist/interceptor/apply-filter.interceptor.d.ts.map +1 -1
- package/dist/interceptor/apply-filter.interceptor.js +36 -6
- package/dist/interceptor/apply-filter.interceptor.js.map +1 -1
- package/dist/runner.d.ts +38 -5
- package/dist/runner.d.ts.map +1 -1
- package/dist/runner.js +102 -34
- package/dist/runner.js.map +1 -1
- package/dist/types.d.ts +37 -4
- package/dist/types.d.ts.map +1 -1
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,74 @@
|
|
|
1
1
|
# @dudousxd/nestjs-filter
|
|
2
2
|
|
|
3
|
+
## 1.32.1
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- [`91b4f1d`](https://github.com/DavideCarvalho/nestjs-filter/commit/91b4f1df0e30e47f4c1d17edebc9308f3f4dcd10) Thanks [@DavideCarvalho](https://github.com/DavideCarvalho)! - Structured input on a GET works on Express's default query parser again
|
|
8
|
+
|
|
9
|
+
Express 5 changed its default `query parser` from `qs` ("extended") to `simple`, which does no
|
|
10
|
+
nesting and no arrays. A structured query travels on a GET as bracket notation
|
|
11
|
+
(`filter[where][0][field]=status`), so under NestJS 12 those arrive as literal flat keys — and the
|
|
12
|
+
library read them as unrecognised input.
|
|
13
|
+
|
|
14
|
+
That failed in the worst direction: the keys carrying the predicates were simply not recognised, so
|
|
15
|
+
the query ran **unfiltered** and answered with every row, 200 and all. Nothing logged, nothing threw.
|
|
16
|
+
`groupByCount`/`extent`/`histogram` were worse still — their spec key never arrived either, so the
|
|
17
|
+
request was rejected as malformed.
|
|
18
|
+
|
|
19
|
+
The runner now expands bracket-encoded keys itself, before anything reads the structured sections. A
|
|
20
|
+
host whose parser already nested them (Express 4, `app.set('query parser', 'extended')`, Fastify, or
|
|
21
|
+
any JSON body) is unaffected — the input is returned by reference, untouched.
|
|
22
|
+
|
|
23
|
+
The example app's e2e suite has always set `query parser` to `extended` to work around this. A new
|
|
24
|
+
spec runs the same requests **without** it, so the default-parser path stays covered.
|
|
25
|
+
|
|
26
|
+
## 1.32.0
|
|
27
|
+
|
|
28
|
+
### Minor Changes
|
|
29
|
+
|
|
30
|
+
- [`0e2e58b`](https://github.com/DavideCarvalho/nestjs-filter/commit/0e2e58b0e06f96bd94cbd15c1da380787098b381) Thanks [@DavideCarvalho](https://github.com/DavideCarvalho)! - `groupByCount` takes a `limit` — the top N groups by count
|
|
31
|
+
|
|
32
|
+
A grouping column whose distinct values grow with the data — tags, external ids, a free-text
|
|
33
|
+
label — answers the unbounded aggregate with one row per value, which is a listing wearing an
|
|
34
|
+
aggregate's shape. The caller that wants it most, a value picker, renders a handful.
|
|
35
|
+
|
|
36
|
+
```ts
|
|
37
|
+
filterQuery()
|
|
38
|
+
.where("base.id", "in", baseIds)
|
|
39
|
+
.groupByCount("tag", { limit: 20 });
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
The adapter seam gains `opts.limit` alongside `opts.bucket`, and the MikroORM and TypeORM adapters
|
|
43
|
+
implement it as `ORDER BY COUNT(*) DESC LIMIT n`. Ordering only becomes part of the contract once
|
|
44
|
+
rows are being dropped: without a limit the caller still receives every group in whatever order the
|
|
45
|
+
database returns, exactly as before.
|
|
46
|
+
|
|
47
|
+
A limit that is not a positive integer degrades to the unbounded form rather than failing the
|
|
48
|
+
request, matching how `bucket` already treats a non-positive width. Numeric strings are coerced, so
|
|
49
|
+
`?groupByCount[limit]=20` on a GET route works.
|
|
50
|
+
|
|
51
|
+
- [`0e2e58b`](https://github.com/DavideCarvalho/nestjs-filter/commit/0e2e58b0e06f96bd94cbd15c1da380787098b381) Thanks [@DavideCarvalho](https://github.com/DavideCarvalho)! - A filter can name its own adapter, so one app can host two filterable backends
|
|
52
|
+
|
|
53
|
+
`FilterModule.forRoot`'s adapter is global, which is right for an app whose filterable data all
|
|
54
|
+
lives behind one ORM. It stops being right the moment a second filterable backend shares the
|
|
55
|
+
process — a library that ships its own console over its own read model, a second data source, an
|
|
56
|
+
adapter over an HTTP service. Registering two global adapters does not compose: whichever one DI
|
|
57
|
+
hands over first answers for every filter in the app, including the ones written against the other.
|
|
58
|
+
|
|
59
|
+
```ts
|
|
60
|
+
@Filterable({ entity: DurableRun, adapter: RUN_QUERY_ADAPTER })
|
|
61
|
+
export class RunFilter extends BaseFilter<RunQueryDraft> {}
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
The token is resolved per filter class, for its routes, its `groupByCount`, its `findAndCount` and
|
|
65
|
+
its `fieldExtent`/`fieldHistogram`. Filters that name nothing keep using the global adapter, so an
|
|
66
|
+
app with one backend is unaffected.
|
|
67
|
+
|
|
68
|
+
A declared token that does not resolve throws, rather than falling back: a filter that names the
|
|
69
|
+
adapter it needs and then quietly runs on a different backend's would answer with rows from the
|
|
70
|
+
wrong data source — a failure that looks like a successful query.
|
|
71
|
+
|
|
3
72
|
## 1.31.0
|
|
4
73
|
|
|
5
74
|
### Minor Changes
|
|
@@ -310,12 +310,26 @@ export interface FilterAdapter {
|
|
|
310
310
|
* @param field - The already-validated grouping column (property name), or
|
|
311
311
|
* the `{ alias, source }` pair of a computed/virtual grouping field.
|
|
312
312
|
* @param entity - The root entity class.
|
|
313
|
-
*
|
|
313
|
+
* `opts.limit`, when present, asks for the **top N groups by count**: order by
|
|
314
|
+
* `COUNT(*)` descending and return at most that many rows. It exists because a
|
|
315
|
+
* grouping column whose cardinality grows with the data (tags, external ids, a
|
|
316
|
+
* free-text label) makes the unbounded form a listing rather than an
|
|
317
|
+
* aggregate, and the caller that needs it most — a value picker — only ever
|
|
318
|
+
* renders a handful. Adapters that cannot bound the aggregate may return every
|
|
319
|
+
* group; a caller must not assume the bound was applied.
|
|
320
|
+
*
|
|
321
|
+
* Ordering is otherwise unspecified, and deliberately so: it only becomes
|
|
322
|
+
* meaningful once rows are being dropped, and pinning it unconditionally would
|
|
323
|
+
* add a sort to every existing caller that reads the whole result anyway.
|
|
324
|
+
*
|
|
325
|
+
* @param opts - Optional numeric bucket width for the bucketed variant, and an
|
|
326
|
+
* optional positive `limit` for the top-N form.
|
|
314
327
|
* @returns One `{ value, count }` per group (`value` is the bucket start when
|
|
315
328
|
* bucketed); `count` is the `COUNT(*)` for that group.
|
|
316
329
|
*/
|
|
317
330
|
groupByCount?(qb: unknown, field: GroupByCountField, entity: Type<unknown>, opts?: {
|
|
318
331
|
bucket?: number;
|
|
332
|
+
limit?: number;
|
|
319
333
|
}): Promise<Array<{
|
|
320
334
|
value: unknown;
|
|
321
335
|
count: number;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"adapter.d.ts","sourceRoot":"","sources":["../../src/adapter/adapter.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"adapter.d.ts","sourceRoot":"","sources":["../../src/adapter/adapter.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"filterable.decorator.d.ts","sourceRoot":"","sources":["../../src/decorator/filterable.decorator.ts"],"names":[],"mappings":"AAAA,OAAO,kBAAkB,CAAC;AAG1B,OAAO,KAAK,EAAE,cAAc,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAErE,wBAAgB,UAAU,CAAC,OAAO,EAAE,iBAAiB,GAAG,cAAc,
|
|
1
|
+
{"version":3,"file":"filterable.decorator.d.ts","sourceRoot":"","sources":["../../src/decorator/filterable.decorator.ts"],"names":[],"mappings":"AAAA,OAAO,kBAAkB,CAAC;AAG1B,OAAO,KAAK,EAAE,cAAc,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAErE,wBAAgB,UAAU,CAAC,OAAO,EAAE,iBAAiB,GAAG,cAAc,CAyBrE;AAED,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,MAAM,GAAG,cAAc,GAAG,SAAS,CAEhF"}
|
|
@@ -11,6 +11,7 @@ export function Filterable(options) {
|
|
|
11
11
|
}
|
|
12
12
|
const meta = {
|
|
13
13
|
entity: options.entity,
|
|
14
|
+
...(options.adapter !== undefined && { adapter: options.adapter }),
|
|
14
15
|
...(options.allowed !== undefined && { allowed: options.allowed }),
|
|
15
16
|
...(options.blocked !== undefined && { blocked: options.blocked }),
|
|
16
17
|
autoFields: options.autoFields ?? true,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"filterable.decorator.js","sourceRoot":"","sources":["../../src/decorator/filterable.decorator.ts"],"names":[],"mappings":"AAAA,OAAO,kBAAkB,CAAC;AAC1B,OAAO,EAAE,4BAA4B,EAAE,MAAM,yBAAyB,CAAC;AACvE,OAAO,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AAGnD,MAAM,UAAU,UAAU,CAAC,OAA0B;IACnD,OAAO,CAAC,MAAM,EAAE,EAAE;QAChB,IAAI,CAAC,OAAO,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC;YAChC,MAAM,IAAI,4BAA4B,CAAC,MAAM,CAAC,IAAI,IAAI,iBAAiB,CAAC,CAAC;QAC3E,CAAC;QACD,IAAI,OAAO,CAAC,OAAO,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;YACvC,MAAM,IAAI,KAAK,CAAC,kBAAkB,MAAM,CAAC,IAAI,6CAA6C,CAAC,CAAC;QAC9F,CAAC;QACD,MAAM,IAAI,GAAmB;YAC3B,MAAM,EAAE,OAAO,CAAC,MAAM;YACtB,GAAG,CAAC,OAAO,CAAC,OAAO,KAAK,SAAS,IAAI,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,CAAC;YAClE,GAAG,CAAC,OAAO,CAAC,OAAO,KAAK,SAAS,IAAI,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,CAAC;YAClE,UAAU,EAAE,OAAO,CAAC,UAAU,IAAI,IAAI;YACtC,GAAG,CAAC,OAAO,CAAC,cAAc,KAAK,SAAS,IAAI,EAAE,cAAc,EAAE,OAAO,CAAC,cAAc,EAAE,CAAC;YACvF,GAAG,CAAC,OAAO,CAAC,WAAW,KAAK,SAAS,IAAI,EAAE,WAAW,EAAE,OAAO,CAAC,WAAW,EAAE,CAAC;YAC9E,GAAG,CAAC,OAAO,CAAC,aAAa,KAAK,SAAS,IAAI,EAAE,aAAa,EAAE,OAAO,CAAC,aAAa,EAAE,CAAC;YACpF,GAAG,CAAC,OAAO,CAAC,QAAQ,KAAK,SAAS,IAAI,EAAE,QAAQ,EAAE,OAAO,CAAC,QAAQ,EAAE,CAAC;YACrE,GAAG,CAAC,OAAO,CAAC,OAAO,KAAK,SAAS,IAAI,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,CAAC;YAClE,wDAAwD;YACxD,iEAAiE;YACjE,GAAG,CAAC,OAAO,CAAC,OAAO,KAAK,SAAS,IAAI,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,CAAC;SACnE,CAAC;QACF,OAAO,CAAC,cAAc,CAAC,mBAAmB,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;IAC5D,CAAC,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,MAAc;IAClD,OAAO,OAAO,CAAC,WAAW,CAAC,mBAAmB,EAAE,MAAM,CAA+B,CAAC;AACxF,CAAC"}
|
|
1
|
+
{"version":3,"file":"filterable.decorator.js","sourceRoot":"","sources":["../../src/decorator/filterable.decorator.ts"],"names":[],"mappings":"AAAA,OAAO,kBAAkB,CAAC;AAC1B,OAAO,EAAE,4BAA4B,EAAE,MAAM,yBAAyB,CAAC;AACvE,OAAO,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AAGnD,MAAM,UAAU,UAAU,CAAC,OAA0B;IACnD,OAAO,CAAC,MAAM,EAAE,EAAE;QAChB,IAAI,CAAC,OAAO,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC;YAChC,MAAM,IAAI,4BAA4B,CAAC,MAAM,CAAC,IAAI,IAAI,iBAAiB,CAAC,CAAC;QAC3E,CAAC;QACD,IAAI,OAAO,CAAC,OAAO,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;YACvC,MAAM,IAAI,KAAK,CAAC,kBAAkB,MAAM,CAAC,IAAI,6CAA6C,CAAC,CAAC;QAC9F,CAAC;QACD,MAAM,IAAI,GAAmB;YAC3B,MAAM,EAAE,OAAO,CAAC,MAAM;YACtB,GAAG,CAAC,OAAO,CAAC,OAAO,KAAK,SAAS,IAAI,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,CAAC;YAClE,GAAG,CAAC,OAAO,CAAC,OAAO,KAAK,SAAS,IAAI,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,CAAC;YAClE,GAAG,CAAC,OAAO,CAAC,OAAO,KAAK,SAAS,IAAI,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,CAAC;YAClE,UAAU,EAAE,OAAO,CAAC,UAAU,IAAI,IAAI;YACtC,GAAG,CAAC,OAAO,CAAC,cAAc,KAAK,SAAS,IAAI,EAAE,cAAc,EAAE,OAAO,CAAC,cAAc,EAAE,CAAC;YACvF,GAAG,CAAC,OAAO,CAAC,WAAW,KAAK,SAAS,IAAI,EAAE,WAAW,EAAE,OAAO,CAAC,WAAW,EAAE,CAAC;YAC9E,GAAG,CAAC,OAAO,CAAC,aAAa,KAAK,SAAS,IAAI,EAAE,aAAa,EAAE,OAAO,CAAC,aAAa,EAAE,CAAC;YACpF,GAAG,CAAC,OAAO,CAAC,QAAQ,KAAK,SAAS,IAAI,EAAE,QAAQ,EAAE,OAAO,CAAC,QAAQ,EAAE,CAAC;YACrE,GAAG,CAAC,OAAO,CAAC,OAAO,KAAK,SAAS,IAAI,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,CAAC;YAClE,wDAAwD;YACxD,iEAAiE;YACjE,GAAG,CAAC,OAAO,CAAC,OAAO,KAAK,SAAS,IAAI,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,CAAC;SACnE,CAAC;QACF,OAAO,CAAC,cAAc,CAAC,mBAAmB,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;IAC5D,CAAC,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,MAAc;IAClD,OAAO,OAAO,CAAC,WAAW,CAAC,mBAAmB,EAAE,MAAM,CAA+B,CAAC;AACxF,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Expand bracket-encoded flat keys into the nested shape the rest of the library reads.
|
|
3
|
+
*
|
|
4
|
+
* A no-op — the same object, by reference — when nothing is bracket-encoded, which is every request
|
|
5
|
+
* on a host whose query parser already did this (`qs`, Fastify, a JSON body). So this changes
|
|
6
|
+
* nothing for those, and rescues the ones where the HTTP layer left the work undone.
|
|
7
|
+
*
|
|
8
|
+
* Keys are expanded in the order they arrive, so a duplicate key's last value wins, matching `qs`.
|
|
9
|
+
*/
|
|
10
|
+
export declare function expandBracketKeys(input: Record<string, unknown>): Record<string, unknown>;
|
|
11
|
+
//# sourceMappingURL=bracket-keys.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bracket-keys.d.ts","sourceRoot":"","sources":["../../src/input/bracket-keys.ts"],"names":[],"mappings":"AAyEA;;;;;;;;GAQG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAkBzF"}
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Does this input look like a query object whose bracket notation was never expanded?
|
|
3
|
+
*
|
|
4
|
+
* A structured query travels on a GET as `filter[where][0][field]=status`. Whether the server hands
|
|
5
|
+
* that to the app as `{ filter: { where: [...] } }` or as the literal key
|
|
6
|
+
* `'filter[where][0][field]'` is a property of the HTTP layer, not of the request — and **Express 5
|
|
7
|
+
* changed the default**, from the `qs` ("extended") parser to `simple`, which does neither nesting
|
|
8
|
+
* nor arrays. A route that read a nested filter under NestJS 11 reads a bag of flat strings under
|
|
9
|
+
* NestJS 12 with no error anywhere.
|
|
10
|
+
*
|
|
11
|
+
* That failure is silent in the worst direction: the keys carrying the predicates are simply not
|
|
12
|
+
* recognised, so the query runs UNFILTERED and answers with every row — which reads exactly like a
|
|
13
|
+
* successful request.
|
|
14
|
+
*/
|
|
15
|
+
function hasBracketKeys(input) {
|
|
16
|
+
for (const key of Object.keys(input)) {
|
|
17
|
+
if (key.includes('[') && key.endsWith(']'))
|
|
18
|
+
return true;
|
|
19
|
+
}
|
|
20
|
+
return false;
|
|
21
|
+
}
|
|
22
|
+
/** `a[b][0][c]` → `['a', 'b', '0', 'c']`; `include[]` → `['include', '']`. */
|
|
23
|
+
function segments(key) {
|
|
24
|
+
const head = key.slice(0, key.indexOf('['));
|
|
25
|
+
if (!head)
|
|
26
|
+
return null;
|
|
27
|
+
const rest = key.slice(head.length);
|
|
28
|
+
const out = [head];
|
|
29
|
+
const pattern = /\[([^[\]]*)\]/g;
|
|
30
|
+
let consumed = 0;
|
|
31
|
+
let match = pattern.exec(rest);
|
|
32
|
+
while (match) {
|
|
33
|
+
out.push(match[1]);
|
|
34
|
+
consumed += match[0].length;
|
|
35
|
+
match = pattern.exec(rest);
|
|
36
|
+
}
|
|
37
|
+
// Anything the bracket grammar did not account for means this is not a path we understand — a
|
|
38
|
+
// column literally named `weird[` , say. Leave such a key alone rather than reshaping it.
|
|
39
|
+
return consumed === rest.length ? out : null;
|
|
40
|
+
}
|
|
41
|
+
/** Assign `value` at `path` inside `root`, creating arrays for numeric segments and objects for the
|
|
42
|
+
* rest. An empty segment (`[]`) appends. */
|
|
43
|
+
function assign(root, path, value) {
|
|
44
|
+
let node = root;
|
|
45
|
+
for (let i = 0; i < path.length; i++) {
|
|
46
|
+
const segment = path[i];
|
|
47
|
+
const last = i === path.length - 1;
|
|
48
|
+
const nextIsIndex = !last && (path[i + 1] === '' || /^\d+$/.test(path[i + 1]));
|
|
49
|
+
if (segment === '') {
|
|
50
|
+
// `include[]=a&include[]=b` — the container is whatever the parent already made.
|
|
51
|
+
if (Array.isArray(node))
|
|
52
|
+
node.push(value);
|
|
53
|
+
return;
|
|
54
|
+
}
|
|
55
|
+
if (Array.isArray(node)) {
|
|
56
|
+
const index = Number(segment);
|
|
57
|
+
if (last) {
|
|
58
|
+
node[index] = value;
|
|
59
|
+
return;
|
|
60
|
+
}
|
|
61
|
+
node[index] ??= nextIsIndex ? [] : {};
|
|
62
|
+
node = node[index];
|
|
63
|
+
continue;
|
|
64
|
+
}
|
|
65
|
+
if (last) {
|
|
66
|
+
node[segment] = value;
|
|
67
|
+
return;
|
|
68
|
+
}
|
|
69
|
+
node[segment] ??= nextIsIndex ? [] : {};
|
|
70
|
+
node = node[segment];
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Expand bracket-encoded flat keys into the nested shape the rest of the library reads.
|
|
75
|
+
*
|
|
76
|
+
* A no-op — the same object, by reference — when nothing is bracket-encoded, which is every request
|
|
77
|
+
* on a host whose query parser already did this (`qs`, Fastify, a JSON body). So this changes
|
|
78
|
+
* nothing for those, and rescues the ones where the HTTP layer left the work undone.
|
|
79
|
+
*
|
|
80
|
+
* Keys are expanded in the order they arrive, so a duplicate key's last value wins, matching `qs`.
|
|
81
|
+
*/
|
|
82
|
+
export function expandBracketKeys(input) {
|
|
83
|
+
if (!hasBracketKeys(input))
|
|
84
|
+
return input;
|
|
85
|
+
const out = {};
|
|
86
|
+
for (const [key, value] of Object.entries(input)) {
|
|
87
|
+
const path = key.includes('[') ? segments(key) : null;
|
|
88
|
+
if (!path) {
|
|
89
|
+
out[key] = value;
|
|
90
|
+
continue;
|
|
91
|
+
}
|
|
92
|
+
// A repeated `x[]=a&x[]=b` may already have been collapsed into an array by the HTTP layer;
|
|
93
|
+
// spread it so the append branch sees one value at a time.
|
|
94
|
+
if (path.at(-1) === '' && Array.isArray(value)) {
|
|
95
|
+
for (const item of value)
|
|
96
|
+
assign(out, path, item);
|
|
97
|
+
continue;
|
|
98
|
+
}
|
|
99
|
+
assign(out, path, value);
|
|
100
|
+
}
|
|
101
|
+
return out;
|
|
102
|
+
}
|
|
103
|
+
//# sourceMappingURL=bracket-keys.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bracket-keys.js","sourceRoot":"","sources":["../../src/input/bracket-keys.ts"],"names":[],"mappings":"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"}
|
|
@@ -7,7 +7,17 @@ export declare class ApplyFilterInterceptor implements NestInterceptor {
|
|
|
7
7
|
private cachedRunner;
|
|
8
8
|
private adapterResolved;
|
|
9
9
|
private cachedAdapter;
|
|
10
|
+
/** Adapters resolved from a filter-declared token (`@Filterable({ adapter })`), memoized per
|
|
11
|
+
* token alongside the global one above. */
|
|
12
|
+
private readonly scopedAdapters;
|
|
10
13
|
private getRunner;
|
|
14
|
+
/**
|
|
15
|
+
* The adapter for ONE filter class: its own `@Filterable({ adapter })` token when it names one,
|
|
16
|
+
* else the application-wide adapter. A declared token that does not resolve throws — a filter that
|
|
17
|
+
* names its backend and then silently builds a query against another one would answer from the
|
|
18
|
+
* wrong data source, which reads as a successful request.
|
|
19
|
+
*/
|
|
20
|
+
private getAdapterFor;
|
|
11
21
|
private getAdapter;
|
|
12
22
|
intercept(ctx: ExecutionContext, next: CallHandler): Observable<unknown>;
|
|
13
23
|
private runAll;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"apply-filter.interceptor.d.ts","sourceRoot":"","sources":["../../src/interceptor/apply-filter.interceptor.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,WAAW,EAChB,KAAK,gBAAgB,
|
|
1
|
+
{"version":3,"file":"apply-filter.interceptor.d.ts","sourceRoot":"","sources":["../../src/interceptor/apply-filter.interceptor.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,WAAW,EAChB,KAAK,gBAAgB,EAGrB,KAAK,eAAe,EAErB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AACzC,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,MAAM,CAAC;AAiBvC,qBACa,sBAAuB,YAAW,eAAe;IAChD,OAAO,CAAC,QAAQ,CAAC,SAAS;gBAAT,SAAS,EAAE,SAAS;IAKjD,OAAO,CAAC,YAAY,CAA6B;IACjD,OAAO,CAAC,eAAe,CAAS;IAChC,OAAO,CAAC,aAAa,CAA8B;IACnD;gDAC4C;IAC5C,OAAO,CAAC,QAAQ,CAAC,cAAc,CAA4C;IAE3E,OAAO,CAAC,SAAS;IASjB;;;;;OAKG;IACH,OAAO,CAAC,aAAa;IAsBrB,OAAO,CAAC,UAAU;IAwBlB,SAAS,CAAC,GAAG,EAAE,gBAAgB,EAAE,IAAI,EAAE,WAAW,GAAG,UAAU,CAAC,OAAO,CAAC;YAmB1D,MAAM;CAyCrB"}
|
|
@@ -28,6 +28,9 @@ let ApplyFilterInterceptor = class ApplyFilterInterceptor {
|
|
|
28
28
|
cachedRunner = null;
|
|
29
29
|
adapterResolved = false;
|
|
30
30
|
cachedAdapter = null;
|
|
31
|
+
/** Adapters resolved from a filter-declared token (`@Filterable({ adapter })`), memoized per
|
|
32
|
+
* token alongside the global one above. */
|
|
33
|
+
scopedAdapters = new Map();
|
|
31
34
|
getRunner() {
|
|
32
35
|
if (this.cachedRunner === null) {
|
|
33
36
|
const runner = this.moduleRef.get(FilterRunner, { strict: false });
|
|
@@ -36,6 +39,31 @@ let ApplyFilterInterceptor = class ApplyFilterInterceptor {
|
|
|
36
39
|
}
|
|
37
40
|
return this.cachedRunner;
|
|
38
41
|
}
|
|
42
|
+
/**
|
|
43
|
+
* The adapter for ONE filter class: its own `@Filterable({ adapter })` token when it names one,
|
|
44
|
+
* else the application-wide adapter. A declared token that does not resolve throws — a filter that
|
|
45
|
+
* names its backend and then silently builds a query against another one would answer from the
|
|
46
|
+
* wrong data source, which reads as a successful request.
|
|
47
|
+
*/
|
|
48
|
+
getAdapterFor(token, filterName) {
|
|
49
|
+
if (token === undefined)
|
|
50
|
+
return this.getAdapter();
|
|
51
|
+
const cached = this.scopedAdapters.get(token);
|
|
52
|
+
if (cached)
|
|
53
|
+
return cached;
|
|
54
|
+
let resolved = null;
|
|
55
|
+
try {
|
|
56
|
+
resolved = this.moduleRef.get(token, { strict: false });
|
|
57
|
+
}
|
|
58
|
+
catch {
|
|
59
|
+
resolved = null;
|
|
60
|
+
}
|
|
61
|
+
if (!resolved) {
|
|
62
|
+
throw new Error(`@Filterable on ${filterName} names an adapter token that is not registered. Provide it in a module reachable from this one.`);
|
|
63
|
+
}
|
|
64
|
+
this.scopedAdapters.set(token, resolved);
|
|
65
|
+
return resolved;
|
|
66
|
+
}
|
|
39
67
|
getAdapter() {
|
|
40
68
|
if (this.adapterResolved)
|
|
41
69
|
return this.cachedAdapter;
|
|
@@ -74,19 +102,21 @@ let ApplyFilterInterceptor = class ApplyFilterInterceptor {
|
|
|
74
102
|
}
|
|
75
103
|
const slot = req[APPLY_FILTER_REQ_KEY];
|
|
76
104
|
const runner = this.getRunner();
|
|
77
|
-
|
|
78
|
-
return from(this.runAll(entries, slot, req, runner, adapter)).pipe(switchMap(() => next.handle()));
|
|
105
|
+
return from(this.runAll(entries, slot, req, runner)).pipe(switchMap(() => next.handle()));
|
|
79
106
|
}
|
|
80
|
-
async runAll(entries, slot, req, runner
|
|
81
|
-
if (!adapter) {
|
|
82
|
-
throw new FilterMissingAdapterException();
|
|
83
|
-
}
|
|
107
|
+
async runAll(entries, slot, req, runner) {
|
|
84
108
|
for (const entry of entries) {
|
|
85
109
|
const FilterClass = entry.options.resolve ? entry.options.resolve(req) : entry.filterClass;
|
|
86
110
|
const filterableMeta = getFilterableMetadata(FilterClass);
|
|
87
111
|
if (!filterableMeta) {
|
|
88
112
|
throw new FilterMissingEntityException(FilterClass.name);
|
|
89
113
|
}
|
|
114
|
+
// Resolved PER ENTRY, not once for the request: a route may apply two filters written against
|
|
115
|
+
// different backends, and the builder each gets has to come from its own adapter.
|
|
116
|
+
const adapter = this.getAdapterFor(filterableMeta.adapter, FilterClass.name);
|
|
117
|
+
if (!adapter) {
|
|
118
|
+
throw new FilterMissingAdapterException();
|
|
119
|
+
}
|
|
90
120
|
const qb = adapter.createQueryBuilder(filterableMeta.entity);
|
|
91
121
|
const source = entry.options.source ?? 'auto';
|
|
92
122
|
const rawInput = resolveInputFromRequest(req, source);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"apply-filter.interceptor.js","sourceRoot":"","sources":["../../src/interceptor/apply-filter.interceptor.ts"],"names":[],"mappings":";;;;;;;;;AAAA,OAAO,EAGL,UAAU,
|
|
1
|
+
{"version":3,"file":"apply-filter.interceptor.js","sourceRoot":"","sources":["../../src/interceptor/apply-filter.interceptor.ts"],"names":[],"mappings":"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"}
|
package/dist/runner.d.ts
CHANGED
|
@@ -40,7 +40,12 @@ export declare class FilterRunner {
|
|
|
40
40
|
private readonly options;
|
|
41
41
|
private readonly contextAccessor?;
|
|
42
42
|
private readonly logger;
|
|
43
|
-
|
|
43
|
+
/** The application-wide adapter (`FilterModule.forRoot`'s), used by every filter that does not
|
|
44
|
+
* name its own — see {@link FilterableOptions.adapter}. */
|
|
45
|
+
private defaultAdapter;
|
|
46
|
+
/** Adapters resolved from a filter-declared token, memoized per token: they are application-scoped
|
|
47
|
+
* providers, so re-resolving them per request is pure overhead. */
|
|
48
|
+
private readonly scopedAdapters;
|
|
44
49
|
/** Per-entity metadata cache for `describe()`. Metadata is static at runtime. */
|
|
45
50
|
private readonly descriptionCache;
|
|
46
51
|
constructor(moduleRef: ModuleRef, options: FilterModuleOptions, injectedAdapter: FilterAdapter | null, contextAccessor?: ContextAccessor | undefined);
|
|
@@ -68,6 +73,18 @@ export declare class FilterRunner {
|
|
|
68
73
|
* same path equality filters use), so it stays portable across ORMs.
|
|
69
74
|
*/
|
|
70
75
|
private applyTenantScope;
|
|
76
|
+
/**
|
|
77
|
+
* The adapter that answers for a request, given the classes it is made against.
|
|
78
|
+
*
|
|
79
|
+
* The FIRST source declaring `@Filterable({ adapter })` wins (a filter class before the entity it
|
|
80
|
+
* targets, since the class is the more specific declaration), and everything else falls through to
|
|
81
|
+
* the application-wide adapter. Sources are passed as they are known at the call site; `undefined`
|
|
82
|
+
* entries are skipped, so a dynamic call with no filter class behaves exactly as before.
|
|
83
|
+
*
|
|
84
|
+
* A declared token that does not resolve THROWS rather than falling back: a filter naming the
|
|
85
|
+
* adapter it needs, then quietly running on a different backend's, would answer with rows from the
|
|
86
|
+
* wrong data source — a failure that looks like a successful query.
|
|
87
|
+
*/
|
|
71
88
|
private resolveAdapter;
|
|
72
89
|
/**
|
|
73
90
|
* Warn that a requested feature was skipped because the active adapter doesn't
|
|
@@ -291,6 +308,14 @@ export declare class FilterRunner {
|
|
|
291
308
|
* is the only way in.
|
|
292
309
|
*/
|
|
293
310
|
trustedPageSize?: boolean;
|
|
311
|
+
/**
|
|
312
|
+
* The filter class this dynamic pass runs on behalf of, when there is one — the aggregate
|
|
313
|
+
* modes ({@link groupByCount}, {@link fieldExtent}, {@link fieldHistogram}) apply their WHERE
|
|
314
|
+
* through here while still being scoped to a class. It selects the ADAPTER (see
|
|
315
|
+
* {@link FilterableOptions.adapter}); without it, a class whose entity is backed by a
|
|
316
|
+
* non-global adapter would have its predicates applied to a builder from a different backend.
|
|
317
|
+
*/
|
|
318
|
+
filterClass?: Type<object> | undefined;
|
|
294
319
|
}): Promise<Q>;
|
|
295
320
|
/**
|
|
296
321
|
* Runs a dynamic query and **executes** it, returning the page of rows plus
|
|
@@ -373,10 +398,18 @@ export declare class FilterRunner {
|
|
|
373
398
|
}): Promise<GroupByCountResult>;
|
|
374
399
|
/**
|
|
375
400
|
* Parses and validates the raw `groupByCount` structured-input block into a
|
|
376
|
-
* canonical `{ field, bucket? }`. Returns `null` when no usable
|
|
377
|
-
* present. `bucket` is kept only when it is a finite positive
|
|
378
|
-
* zero/negative/NaN/non-number bucket degrades to the plain
|
|
379
|
-
* group-by-count rather than emitting a divide-by-zero or
|
|
401
|
+
* canonical `{ field, bucket?, limit? }`. Returns `null` when no usable
|
|
402
|
+
* `field` is present. `bucket` is kept only when it is a finite positive
|
|
403
|
+
* number — a zero/negative/NaN/non-number bucket degrades to the plain
|
|
404
|
+
* (non-bucketed) group-by-count rather than emitting a divide-by-zero or
|
|
405
|
+
* nonsensical width. `limit` is kept on the same terms and must additionally
|
|
406
|
+
* be an integer; anything else degrades to the unbounded form, since a
|
|
407
|
+
* fractional or negative row count is not a narrower question, just a
|
|
408
|
+
* malformed one.
|
|
409
|
+
*
|
|
410
|
+
* Both arrive over the wire as strings on a GET route (`?groupByCount[limit]=20`),
|
|
411
|
+
* so numeric strings are coerced before those checks — otherwise the bound a
|
|
412
|
+
* caller asked for would be silently dropped by the shape test alone.
|
|
380
413
|
*/
|
|
381
414
|
private parseGroupByCount;
|
|
382
415
|
/**
|
package/dist/runner.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runner.d.ts","sourceRoot":"","sources":["../src/runner.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"runner.d.ts","sourceRoot":"","sources":["../src/runner.ts"],"names":[],"mappings":"AAAA,OAAO,EAOL,KAAK,IAAI,EACV,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AACzC,OAAO,KAAK,EAEV,WAAW,EAEX,aAAa,EAEd,MAAM,sBAAsB,CAAC;AAI9B,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAmC7D,OAAO,KAAK,EAEV,cAAc,EACd,UAAU,EACV,iBAAiB,EACjB,cAAc,EAGd,aAAa,EAEb,mBAAmB,EAGnB,kBAAkB,EAGlB,QAAQ,EACT,MAAM,YAAY,CAAC;AA4BpB;;;;;;;;;GASG;AACH,MAAM,WAAW,qBAAqB;IACpC,MAAM,EAAE,cAAc,CAAC;IACvB,OAAO,EAAE,OAAO,CAAC;CAClB;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,qBAAqB,CACnC,WAAW,EAAE,QAAQ,EACrB,QAAQ,EAAE,MAAM,GACf,GAAG,CAAC,MAAM,EAAE,qBAAqB,CAAC,CA4BpC;AAED,qBACa,YAAY;IAerB,OAAO,CAAC,QAAQ,CAAC,SAAS;IACK,OAAO,CAAC,QAAQ,CAAC,OAAO;IAIvD,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAC;IAnBnC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAiC;IAExD;gEAC4D;IAC5D,OAAO,CAAC,cAAc,CAAuB;IAE7C;wEACoE;IACpE,OAAO,CAAC,QAAQ,CAAC,cAAc,CAA4C;IAE3E,iFAAiF;IACjF,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAA4C;gBAG1D,SAAS,EAAE,SAAS,EACW,OAAO,EAAE,mBAAmB,EACpD,eAAe,EAAE,aAAa,GAAG,IAAI,EAG5C,eAAe,CAAC,EAAE,eAAe,YAAA;IAKpD;;;;;;;OAOG;IACH,OAAO,CAAC,sBAAsB;IAS9B;;;;;OAKG;IACH;;;;;;;OAOG;IACH,OAAO,CAAC,gBAAgB;IAmBxB;;;;;;;;;;;OAWG;IACH,OAAO,CAAC,cAAc;IAgCtB;;;;OAIG;IACH,OAAO,CAAC,eAAe;IAIvB;;;;;OAKG;IACH,OAAO,CAAC,iBAAiB;IAKzB;;;;;OAKG;IACH,OAAO,CAAC,gBAAgB;IAKxB;;;;;;;;OAQG;IACH,OAAO,CAAC,gBAAgB;IAYxB;;;;;;OAMG;IACH,OAAO,CAAC,wBAAwB;IAehC;;;;;;;OAOG;IACH,QAAQ,CAAC,MAAM,EAAE,IAAI,CAAC,OAAO,CAAC,GAAG,iBAAiB;IA6BlD;;;;;;OAMG;IACH,OAAO,CAAC,YAAY;IAsBpB;;;;;;;;;;;;;;;;;;;;;OAqBG;IACH,OAAO,CAAC,eAAe;IA2GvB;;;;;;;;;;;;OAYG;IACH,OAAO,CAAC,sBAAsB;IAoBxB,KAAK,CAAC,CAAC,SAAS,MAAM,EAAE,CAAC,EAC7B,WAAW,EAAE,IAAI,CAAC,CAAC,CAAC,EACpB,KAAK,EAAE,OAAO,EACd,EAAE,EAAE,CAAC,EACL,OAAO,GAAE,aAAkB,EAC3B,QAAQ,GAAE;QACR,MAAM,CAAC,EAAE,OAAO,CAAC;QACjB,aAAa,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;QACpC,WAAW,CAAC,EAAE,MAAM,GAAG,QAAQ,EAAE,GAAG,SAAS,CAAC;KAC1C,GACL,OAAO,CAAC,CAAC,CAAC;YAghBC,aAAa;YAmBb,QAAQ;IAUtB;;;OAGG;IACH,OAAO,CAAC,wBAAwB;IAKhC;;;OAGG;YACW,aAAa;IAyB3B;;;;;;OAMG;IACH,OAAO,CAAC,sBAAsB;IA2F9B;;;;;;;;OAQG;IACH,OAAO,CAAC,oBAAoB;IAwB5B;;;;;;;;;;;;;;;OAeG;IACH,OAAO,CAAC,iBAAiB;IA6CzB;;;;;;;;;;;;;;;;;;;;;;;;;;;OA2BG;IACH,OAAO,CAAC,sBAAsB;IA4B9B;;;;;;;OAOG;IACH,aAAa,CAAC,GAAG,EAAE,OAAO,GAAG,MAAM,EAAE;IAWrC;;;OAGG;IACH,OAAO,CAAC,gBAAgB;IAyBxB;;OAEG;IACH;;;;;OAKG;IACH,OAAO,CAAC,iBAAiB;IA0CzB;;;;;;;;;;;;OAYG;IACG,YAAY,CAAC,CAAC,EAClB,MAAM,EAAE,IAAI,CAAC,OAAO,CAAC,EACrB,KAAK,EAAE,OAAO,EACd,EAAE,EAAE,CAAC,EACL,OAAO,GAAE,aAAkB,EAC3B,QAAQ,GAAE;QACR,qBAAqB,CAAC,EAAE,OAAO,CAAC;QAChC,MAAM,CAAC,EAAE,OAAO,CAAC;QACjB,aAAa,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;QACpC;;;;;;WAMG;QACH,eAAe,CAAC,EAAE,OAAO,CAAC;QAC1B;;;;;;WAMG;QACH,WAAW,CAAC,EAAE,IAAI,CAAC,MAAM,CAAC,GAAG,SAAS,CAAC;KACnC,GACL,OAAO,CAAC,CAAC,CAAC;IAyKb;;;;;;;;;;;;;;;;;;;;OAoBG;IACG,YAAY,CAAC,CAAC,EAClB,MAAM,EAAE,IAAI,CAAC,CAAC,CAAC,EACf,KAAK,EAAE,OAAO,EACd,IAAI,GAAE;QAAE,EAAE,CAAC,EAAE,OAAO,CAAC;QAAC,OAAO,CAAC,EAAE,aAAa,CAAC;QAAC,eAAe,CAAC,EAAE,OAAO,CAAA;KAAO,GAC9E,OAAO,CAAC;QAAE,IAAI,EAAE,CAAC,EAAE,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;IAkExC;;;;;;;OAOG;IACH,OAAO,CAAC,4BAA4B;IAgBpC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OAmCG;IACG,YAAY,CAAC,CAAC,EAClB,MAAM,EAAE,IAAI,CAAC,CAAC,CAAC,EACf,KAAK,EAAE,OAAO,EACd,IAAI,GAAE;QAAE,EAAE,CAAC,EAAE,OAAO,CAAC;QAAC,OAAO,CAAC,EAAE,aAAa,CAAC;QAAC,WAAW,CAAC,EAAE,IAAI,CAAC,MAAM,CAAC,CAAA;KAAO,GAC/E,OAAO,CAAC,kBAAkB,CAAC;IA4E9B;;;;;;;;;;;;;;OAcG;IACH,OAAO,CAAC,iBAAiB;IAkBzB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OAsDG;IACG,WAAW,CAAC,CAAC,EACjB,MAAM,EAAE,IAAI,CAAC,CAAC,CAAC,EACf,KAAK,EAAE,OAAO,EACd,IAAI,GAAE;QAAE,EAAE,CAAC,EAAE,OAAO,CAAC;QAAC,OAAO,CAAC,EAAE,aAAa,CAAC;QAAC,WAAW,CAAC,EAAE,IAAI,CAAC,MAAM,CAAC,CAAA;KAAO,GAC/E,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;IAqEvC;;;;;;;;;;;;;;;OAeG;IACH,OAAO,CAAC,sBAAsB;IAa9B;;;;;;;;OAQG;YACW,eAAe;IAkB7B;;;;;;;;;;OAUG;IACH,OAAO,CAAC,wBAAwB;IAOhC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OAqDG;IACG,cAAc,CAAC,CAAC,EACpB,MAAM,EAAE,IAAI,CAAC,CAAC,CAAC,EACf,KAAK,EAAE,OAAO,EACd,IAAI,GAAE;QAAE,OAAO,CAAC,EAAE,aAAa,CAAC;QAAC,WAAW,CAAC,EAAE,IAAI,CAAC,MAAM,CAAC,CAAA;KAAO,GACjE,OAAO,CAAC,cAAc,CAAC;IAiH1B;;;;;;;;;;;OAWG;IACH,OAAO,CAAC,cAAc;IAmBtB;;;;;;;;;;;;;;;;OAgBG;IACH,OAAO,CAAC,gBAAgB;IAaxB;;;;;;;;;;;;;;;OAeG;IACH,OAAO,CAAC,kBAAkB;IAmB1B;;;;;;;;;;;;;;;;;;;;;;;;OAwBG;IACH,OAAO,CAAC,eAAe;IAevB;;;;;;;;;;;;;;;;;;;;;OAqBG;IACH,OAAO,CAAC,eAAe;IA2BvB;;;;;;;OAOG;IACH,OAAO,CAAC,QAAQ;IAMhB;;;;;;;;;;;;;;;;;;;;;;;;;OAyBG;IACG,QAAQ,CAAC,CAAC,EACd,MAAM,EAAE,IAAI,CAAC,CAAC,CAAC,EACf,KAAK,EAAE,OAAO,EACd,IAAI,GAAE;QAAE,EAAE,CAAC,EAAE,OAAO,CAAC;QAAC,OAAO,CAAC,EAAE,aAAa,CAAC;QAAC,eAAe,CAAC,EAAE,OAAO,CAAA;KAAO,GAC9E,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;IAoGzB,0EAA0E;IAC1E,OAAO,CAAC,aAAa;IAOrB;;;OAGG;IACH,OAAO,CAAC,0BAA0B;IAqBlC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OAmCG;IACH,OAAO,CAAC,yBAAyB;IAoGjC;;;;;;;;;;;;;;;;;;;;;;;;;;;OA2BG;IACH,OAAO,CAAC,yBAAyB;IAkFjC;;;;;;;;;;;;;;;;;;OAkBG;IACH,OAAO,CAAC,6BAA6B;IAmCrC;;;;;;;;;OASG;IACH,OAAO,CAAC,wBAAwB;IAiChC;;;;;;;;;;;;;OAaG;IACH,OAAO,CAAC,yBAAyB;IAmCjC;;;;;;;;;;;;;;;;OAgBG;IACH,OAAO,CAAC,oBAAoB;IAc5B;;;OAGG;IACH;;;OAGG;IACH,OAAO,CAAC,qBAAqB;IAQ7B;;;;;;;;;;;OAWG;IACH,OAAO,CAAC,kBAAkB;IAY1B;;;;;;;;;;;;;;;OAeG;IACH,OAAO,CAAC,oBAAoB;IAS5B,OAAO,CAAC,gBAAgB;IAQxB;;;;;OAKG;IACH,OAAO,CAAC,UAAU;IAQlB;;;;;OAKG;IACH,OAAO,CAAC,cAAc;IAQtB;;;;;;;;;;;OAWG;IACH,UAAU,CAAC,GAAG,EAAE,OAAO,GAAG,QAAQ,EAAE;IAyBpC;;;OAGG;IACH,OAAO,CAAC,aAAa;IA6CrB;;;;;;;;;;;;;;;OAeG;IACH,OAAO,CAAC,sBAAsB;IAY9B;;;;;;;;;;;;OAYG;IACH,OAAO,CAAC,sBAAsB;IAiE9B;;;;;;;OAOG;IACH,aAAa,CAAC,GAAG,EAAE,OAAO,GAAG,MAAM,EAAE;IAiBrC;;;OAGG;IACH,OAAO,CAAC,gBAAgB;IAqDxB;;;;;;OAMG;IACH,OAAO,CAAC,eAAe;IAoBvB;;;;;;;;;;;;;;;;;;;;OAoBG;IACH,OAAO,CAAC,eAAe;CAKxB"}
|