@dudousxd/nestjs-filter 1.4.1 → 1.5.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 +40 -0
- package/dist/index.d.ts +3 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -2
- package/dist/index.js.map +1 -1
- package/dist/operators/column-filter.dto.d.ts.map +1 -1
- package/dist/operators/column-filter.dto.js +7 -2
- package/dist/operators/column-filter.dto.js.map +1 -1
- package/dist/operators/index.d.ts +3 -3
- package/dist/operators/index.d.ts.map +1 -1
- package/dist/operators/index.js +2 -2
- package/dist/operators/index.js.map +1 -1
- package/dist/operators/types.d.ts +17 -1
- package/dist/operators/types.d.ts.map +1 -1
- package/dist/operators/types.js +15 -0
- package/dist/operators/types.js.map +1 -1
- package/dist/operators/validate-column-filter.d.ts +7 -1
- package/dist/operators/validate-column-filter.d.ts.map +1 -1
- package/dist/operators/validate-column-filter.js +34 -4
- package/dist/operators/validate-column-filter.js.map +1 -1
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,45 @@
|
|
|
1
1
|
# @dudousxd/nestjs-filter
|
|
2
2
|
|
|
3
|
+
## 1.5.0
|
|
4
|
+
|
|
5
|
+
### Minor Changes
|
|
6
|
+
|
|
7
|
+
- [`3837439`](https://github.com/DavideCarvalho/nestjs-filter/commit/38374391123e51458bd9e54a72625d2636be22a7) - Accept SQL-symbol operator aliases (`=`, `==`, `!=`, `<>`, `>`, `>=`, `<`, `<=`)
|
|
8
|
+
as input and normalize them to their canonical `FilterOperator` before
|
|
9
|
+
validation and query building.
|
|
10
|
+
|
|
11
|
+
Clients that build column filters with the familiar SQL symbols (e.g.
|
|
12
|
+
`{ field: "status", operator: "=", value: "open" }`) previously got a 500
|
|
13
|
+
(`InvalidColumnFilterError: Unknown filter operator "="`) once an endpoint moved
|
|
14
|
+
to `@ApplyFilter`, because only the named operators (`equals`, `notEquals`, …)
|
|
15
|
+
were accepted. The legacy arbitrary-query builder accepted the symbols, so this
|
|
16
|
+
was a silent breaking difference during migration.
|
|
17
|
+
|
|
18
|
+
- **core** — new `normalizeOperator()` and `OPERATOR_ALIASES` exports, plus
|
|
19
|
+
`FilterOperatorAlias` / `FilterOperatorInput` types. `validateColumnFilter`
|
|
20
|
+
now accepts aliases and rewrites each one to its canonical form in place
|
|
21
|
+
(recursively through `AND`/`OR`), so downstream query builders never see a
|
|
22
|
+
symbol. `ColumnFilterDto`'s `@IsIn` accepts the aliases too.
|
|
23
|
+
- **mikro-orm / typeorm** — the operator resolvers normalize via
|
|
24
|
+
`normalizeOperator()` at entry, so `resolveOperator()` / `applyOperator()`
|
|
25
|
+
handle aliases even when called directly.
|
|
26
|
+
|
|
27
|
+
Only scalar binary operators have aliases; array/range/unary operators are
|
|
28
|
+
unaffected.
|
|
29
|
+
|
|
30
|
+
## 1.4.3
|
|
31
|
+
|
|
32
|
+
### Patch Changes
|
|
33
|
+
|
|
34
|
+
- [#18](https://github.com/DavideCarvalho/nestjs-filter/pull/18) [`b9d2a87`](https://github.com/DavideCarvalho/nestjs-filter/commit/b9d2a87ae636608f50c5e6bc023e583c7a679b4e) Thanks [@DavideCarvalho](https://github.com/DavideCarvalho)! - Fix pure OR/AND group nodes (global-search OR-of-iContains). The client builder
|
|
35
|
+
serializes an OR/AND group as `{ field: "", operator: "equals", OR: [...] }`
|
|
36
|
+
(empty field), but `validateColumnFilter` rejected the empty field and the
|
|
37
|
+
mikro-orm/typeorm resolvers emitted a broken base condition for it. Now a node
|
|
38
|
+
with `AND`/`OR` and no (or empty) `field` is treated as a pure group: validation
|
|
39
|
+
skips field/operator/value and recurses into the arrays, and the resolvers
|
|
40
|
+
contribute only the nested conditions. Unblocks `.or(...)`/`.and(...)` and
|
|
41
|
+
multi-column global search.
|
|
42
|
+
|
|
3
43
|
## 1.4.1
|
|
4
44
|
|
|
5
45
|
### Patch Changes
|
package/dist/index.d.ts
CHANGED
|
@@ -17,8 +17,8 @@ export type { ApplyFilterOptions, CursorPagination, EntityDescription, FieldMeta
|
|
|
17
17
|
export { resolveInputFromRequest } from './input/source-resolver.js';
|
|
18
18
|
export { normalizeInput } from './input/normalizer.js';
|
|
19
19
|
export { escapeLike } from './utils/escape-like.js';
|
|
20
|
-
export type { ColumnFilter, FilterOperator } from './operators/types.js';
|
|
21
|
-
export { FILTER_OPERATORS } from './operators/types.js';
|
|
20
|
+
export type { ColumnFilter, FilterOperator, FilterOperatorAlias, FilterOperatorInput, } from './operators/types.js';
|
|
21
|
+
export { FILTER_OPERATORS, OPERATOR_ALIASES } from './operators/types.js';
|
|
22
22
|
export { ColumnFilterDto } from './operators/column-filter.dto.js';
|
|
23
|
-
export { validateColumnFilter, validateColumnFilters, InvalidColumnFilterError, MAX_FILTER_DEPTH, } from './operators/validate-column-filter.js';
|
|
23
|
+
export { validateColumnFilter, validateColumnFilters, normalizeOperator, InvalidColumnFilterError, MAX_FILTER_DEPTH, } from './operators/validate-column-filter.js';
|
|
24
24
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,OAAO,UAAU,CAAC;AAE/B,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,YAAY,EAAE,aAAa,EAAE,eAAe,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC/F,OAAO,EAAE,UAAU,EAAE,qBAAqB,EAAE,MAAM,qCAAqC,CAAC;AACxF,OAAO,EACL,SAAS,EACT,eAAe,EACf,mBAAmB,GACpB,MAAM,qCAAqC,CAAC;AAC7C,YAAY,EACV,mBAAmB,EACnB,gBAAgB,GACjB,MAAM,qCAAqC,CAAC;AAC7C,OAAO,EAAE,WAAW,EAAE,sBAAsB,EAAE,MAAM,uCAAuC,CAAC;AAC5F,OAAO,EAAE,SAAS,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,oCAAoC,CAAC;AACjG,YAAY,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,oCAAoC,CAAC;AACvF,OAAO,EAAE,sBAAsB,EAAE,MAAM,2CAA2C,CAAC;AACnF,OAAO,EAAE,qBAAqB,EAAE,MAAM,qCAAqC,CAAC;AAC5E,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EACL,eAAe,EACf,4BAA4B,EAC5B,4BAA4B,EAC5B,+BAA+B,EAC/B,yBAAyB,EACzB,yBAAyB,EACzB,6BAA6B,EAC7B,qBAAqB,GACtB,MAAM,wBAAwB,CAAC;AAChC,OAAO,EACL,qBAAqB,EACrB,cAAc,EACd,mBAAmB,EACnB,mBAAmB,EACnB,wBAAwB,EACxB,yBAAyB,EACzB,qBAAqB,EACrB,oBAAoB,GACrB,MAAM,aAAa,CAAC;AACrB,YAAY,EACV,kBAAkB,EAClB,gBAAgB,EAChB,iBAAiB,EACjB,SAAS,EACT,iBAAiB,EACjB,aAAa,EACb,WAAW,EACX,iBAAiB,EACjB,gBAAgB,EAChB,cAAc,EACd,mBAAmB,EACnB,0BAA0B,EAC1B,wBAAwB,EACxB,eAAe,EACf,WAAW,EACX,gBAAgB,EAChB,YAAY,EACZ,YAAY,EACZ,QAAQ,EACR,eAAe,EACf,cAAc,GACf,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,uBAAuB,EAAE,MAAM,4BAA4B,CAAC;AACrE,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AACpD,YAAY,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,OAAO,UAAU,CAAC;AAE/B,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,YAAY,EAAE,aAAa,EAAE,eAAe,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC/F,OAAO,EAAE,UAAU,EAAE,qBAAqB,EAAE,MAAM,qCAAqC,CAAC;AACxF,OAAO,EACL,SAAS,EACT,eAAe,EACf,mBAAmB,GACpB,MAAM,qCAAqC,CAAC;AAC7C,YAAY,EACV,mBAAmB,EACnB,gBAAgB,GACjB,MAAM,qCAAqC,CAAC;AAC7C,OAAO,EAAE,WAAW,EAAE,sBAAsB,EAAE,MAAM,uCAAuC,CAAC;AAC5F,OAAO,EAAE,SAAS,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,oCAAoC,CAAC;AACjG,YAAY,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,oCAAoC,CAAC;AACvF,OAAO,EAAE,sBAAsB,EAAE,MAAM,2CAA2C,CAAC;AACnF,OAAO,EAAE,qBAAqB,EAAE,MAAM,qCAAqC,CAAC;AAC5E,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EACL,eAAe,EACf,4BAA4B,EAC5B,4BAA4B,EAC5B,+BAA+B,EAC/B,yBAAyB,EACzB,yBAAyB,EACzB,6BAA6B,EAC7B,qBAAqB,GACtB,MAAM,wBAAwB,CAAC;AAChC,OAAO,EACL,qBAAqB,EACrB,cAAc,EACd,mBAAmB,EACnB,mBAAmB,EACnB,wBAAwB,EACxB,yBAAyB,EACzB,qBAAqB,EACrB,oBAAoB,GACrB,MAAM,aAAa,CAAC;AACrB,YAAY,EACV,kBAAkB,EAClB,gBAAgB,EAChB,iBAAiB,EACjB,SAAS,EACT,iBAAiB,EACjB,aAAa,EACb,WAAW,EACX,iBAAiB,EACjB,gBAAgB,EAChB,cAAc,EACd,mBAAmB,EACnB,0BAA0B,EAC1B,wBAAwB,EACxB,eAAe,EACf,WAAW,EACX,gBAAgB,EAChB,YAAY,EACZ,YAAY,EACZ,QAAQ,EACR,eAAe,EACf,cAAc,GACf,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,uBAAuB,EAAE,MAAM,4BAA4B,CAAC;AACrE,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AACpD,YAAY,EACV,YAAY,EACZ,cAAc,EACd,mBAAmB,EACnB,mBAAmB,GACpB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAC1E,OAAO,EAAE,eAAe,EAAE,MAAM,kCAAkC,CAAC;AACnE,OAAO,EACL,oBAAoB,EACpB,qBAAqB,EACrB,iBAAiB,EACjB,wBAAwB,EACxB,gBAAgB,GACjB,MAAM,uCAAuC,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -13,7 +13,7 @@ export { FILTER_MODULE_OPTIONS, FILTER_ADAPTER, FILTERABLE_METADATA, FILTER_FOR_
|
|
|
13
13
|
export { resolveInputFromRequest } from './input/source-resolver.js';
|
|
14
14
|
export { normalizeInput } from './input/normalizer.js';
|
|
15
15
|
export { escapeLike } from './utils/escape-like.js';
|
|
16
|
-
export { FILTER_OPERATORS } from './operators/types.js';
|
|
16
|
+
export { FILTER_OPERATORS, OPERATOR_ALIASES } from './operators/types.js';
|
|
17
17
|
export { ColumnFilterDto } from './operators/column-filter.dto.js';
|
|
18
|
-
export { validateColumnFilter, validateColumnFilters, InvalidColumnFilterError, MAX_FILTER_DEPTH, } from './operators/validate-column-filter.js';
|
|
18
|
+
export { validateColumnFilter, validateColumnFilters, normalizeOperator, InvalidColumnFilterError, MAX_FILTER_DEPTH, } from './operators/validate-column-filter.js';
|
|
19
19
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,OAAO,GAAG,OAAO,CAAC;AAE/B,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAE9C,OAAO,EAAE,UAAU,EAAE,qBAAqB,EAAE,MAAM,qCAAqC,CAAC;AACxF,OAAO,EACL,SAAS,EACT,eAAe,EACf,mBAAmB,GACpB,MAAM,qCAAqC,CAAC;AAK7C,OAAO,EAAE,WAAW,EAAE,sBAAsB,EAAE,MAAM,uCAAuC,CAAC;AAC5F,OAAO,EAAE,SAAS,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,oCAAoC,CAAC;AAEjG,OAAO,EAAE,sBAAsB,EAAE,MAAM,2CAA2C,CAAC;AACnF,OAAO,EAAE,qBAAqB,EAAE,MAAM,qCAAqC,CAAC;AAC5E,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EACL,eAAe,EACf,4BAA4B,EAC5B,4BAA4B,EAC5B,+BAA+B,EAC/B,yBAAyB,EACzB,yBAAyB,EACzB,6BAA6B,EAC7B,qBAAqB,GACtB,MAAM,wBAAwB,CAAC;AAChC,OAAO,EACL,qBAAqB,EACrB,cAAc,EACd,mBAAmB,EACnB,mBAAmB,EACnB,wBAAwB,EACxB,yBAAyB,EACzB,qBAAqB,EACrB,oBAAoB,GACrB,MAAM,aAAa,CAAC;AAwBrB,OAAO,EAAE,uBAAuB,EAAE,MAAM,4BAA4B,CAAC;AACrE,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,OAAO,GAAG,OAAO,CAAC;AAE/B,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAE9C,OAAO,EAAE,UAAU,EAAE,qBAAqB,EAAE,MAAM,qCAAqC,CAAC;AACxF,OAAO,EACL,SAAS,EACT,eAAe,EACf,mBAAmB,GACpB,MAAM,qCAAqC,CAAC;AAK7C,OAAO,EAAE,WAAW,EAAE,sBAAsB,EAAE,MAAM,uCAAuC,CAAC;AAC5F,OAAO,EAAE,SAAS,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,oCAAoC,CAAC;AAEjG,OAAO,EAAE,sBAAsB,EAAE,MAAM,2CAA2C,CAAC;AACnF,OAAO,EAAE,qBAAqB,EAAE,MAAM,qCAAqC,CAAC;AAC5E,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EACL,eAAe,EACf,4BAA4B,EAC5B,4BAA4B,EAC5B,+BAA+B,EAC/B,yBAAyB,EACzB,yBAAyB,EACzB,6BAA6B,EAC7B,qBAAqB,GACtB,MAAM,wBAAwB,CAAC;AAChC,OAAO,EACL,qBAAqB,EACrB,cAAc,EACd,mBAAmB,EACnB,mBAAmB,EACnB,wBAAwB,EACxB,yBAAyB,EACzB,qBAAqB,EACrB,oBAAoB,GACrB,MAAM,aAAa,CAAC;AAwBrB,OAAO,EAAE,uBAAuB,EAAE,MAAM,4BAA4B,CAAC;AACrE,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AAOpD,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAC1E,OAAO,EAAE,eAAe,EAAE,MAAM,kCAAkC,CAAC;AACnE,OAAO,EACL,oBAAoB,EACpB,qBAAqB,EACrB,iBAAiB,EACjB,wBAAwB,EACxB,gBAAgB,GACjB,MAAM,uCAAuC,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"column-filter.dto.d.ts","sourceRoot":"","sources":["../../src/operators/column-filter.dto.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"column-filter.dto.d.ts","sourceRoot":"","sources":["../../src/operators/column-filter.dto.ts"],"names":[],"mappings":"AAUA;;;;;;;;;;;;;GAaG;AACH,qBAAa,eAAe;IAE1B,KAAK,EAAG,MAAM,CAAC;IAIf,QAAQ,EAAG,MAAM,CAAC;IAGlB,KAAK,CAAC,EAAE,OAAO,CAAC;IAMhB,GAAG,CAAC,EAAE,eAAe,EAAE,CAAC;IAMxB,EAAE,CAAC,EAAE,eAAe,EAAE,CAAC;CACxB"}
|
|
@@ -9,7 +9,12 @@ var __metadata = (this && this.__metadata) || function (k, v) {
|
|
|
9
9
|
};
|
|
10
10
|
import { Type } from 'class-transformer';
|
|
11
11
|
import { IsArray, IsIn, IsOptional, IsString, ValidateNested } from 'class-validator';
|
|
12
|
-
import { FILTER_OPERATORS } from './types.js';
|
|
12
|
+
import { FILTER_OPERATORS, OPERATOR_ALIASES } from './types.js';
|
|
13
|
+
/** Canonical operators plus SQL-symbol aliases accepted on input. */
|
|
14
|
+
const ACCEPTED_OPERATORS = [
|
|
15
|
+
...FILTER_OPERATORS,
|
|
16
|
+
...Object.keys(OPERATOR_ALIASES),
|
|
17
|
+
];
|
|
13
18
|
/**
|
|
14
19
|
* Reusable DTO for ColumnFilter with class-validator decorators.
|
|
15
20
|
*
|
|
@@ -37,7 +42,7 @@ __decorate([
|
|
|
37
42
|
], ColumnFilterDto.prototype, "field", void 0);
|
|
38
43
|
__decorate([
|
|
39
44
|
IsString(),
|
|
40
|
-
IsIn(
|
|
45
|
+
IsIn(ACCEPTED_OPERATORS),
|
|
41
46
|
__metadata("design:type", String)
|
|
42
47
|
], ColumnFilterDto.prototype, "operator", void 0);
|
|
43
48
|
__decorate([
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"column-filter.dto.js","sourceRoot":"","sources":["../../src/operators/column-filter.dto.ts"],"names":[],"mappings":";;;;;;;;;AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,mBAAmB,CAAC;AACzC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,QAAQ,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AACtF,OAAO,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"column-filter.dto.js","sourceRoot":"","sources":["../../src/operators/column-filter.dto.ts"],"names":[],"mappings":";;;;;;;;;AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,mBAAmB,CAAC;AACzC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,QAAQ,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AACtF,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAEhE,qEAAqE;AACrE,MAAM,kBAAkB,GAAsB;IAC5C,GAAG,gBAAgB;IACnB,GAAG,MAAM,CAAC,IAAI,CAAC,gBAAgB,CAAC;CACjC,CAAC;AAEF;;;;;;;;;;;;;GAaG;AACH,MAAM,OAAO,eAAe;IAE1B,KAAK,CAAU;IAIf,QAAQ,CAAU;IAGlB,KAAK,CAAW;IAMhB,GAAG,CAAqB;IAMxB,EAAE,CAAqB;CACxB;AApBC;IADC,QAAQ,EAAE;;8CACI;AAIf;IAFC,QAAQ,EAAE;IACV,IAAI,CAAC,kBAAkB,CAAC;;iDACP;AAGlB;IADC,UAAU,EAAE;;8CACG;AAMhB;IAJC,UAAU,EAAE;IACZ,OAAO,EAAE;IACT,cAAc,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;IAC9B,IAAI,CAAC,GAAG,EAAE,CAAC,eAAe,CAAC;;4CACJ;AAMxB;IAJC,UAAU,EAAE;IACZ,OAAO,EAAE;IACT,cAAc,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;IAC9B,IAAI,CAAC,GAAG,EAAE,CAAC,eAAe,CAAC;;2CACL"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
export type { ColumnFilter, FilterOperator } from './types.js';
|
|
2
|
-
export { FILTER_OPERATORS } from './types.js';
|
|
1
|
+
export type { ColumnFilter, FilterOperator, FilterOperatorAlias, FilterOperatorInput, } from './types.js';
|
|
2
|
+
export { FILTER_OPERATORS, OPERATOR_ALIASES } from './types.js';
|
|
3
3
|
export { ColumnFilterDto } from './column-filter.dto.js';
|
|
4
|
-
export { validateColumnFilter, validateColumnFilters, InvalidColumnFilterError, } from './validate-column-filter.js';
|
|
4
|
+
export { validateColumnFilter, validateColumnFilters, normalizeOperator, InvalidColumnFilterError, } from './validate-column-filter.js';
|
|
5
5
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/operators/index.ts"],"names":[],"mappings":"AAAA,YAAY,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/operators/index.ts"],"names":[],"mappings":"AAAA,YAAY,EACV,YAAY,EACZ,cAAc,EACd,mBAAmB,EACnB,mBAAmB,GACpB,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAChE,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EACL,oBAAoB,EACpB,qBAAqB,EACrB,iBAAiB,EACjB,wBAAwB,GACzB,MAAM,6BAA6B,CAAC"}
|
package/dist/operators/index.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export { FILTER_OPERATORS } from './types.js';
|
|
1
|
+
export { FILTER_OPERATORS, OPERATOR_ALIASES } from './types.js';
|
|
2
2
|
export { ColumnFilterDto } from './column-filter.dto.js';
|
|
3
|
-
export { validateColumnFilter, validateColumnFilters, InvalidColumnFilterError, } from './validate-column-filter.js';
|
|
3
|
+
export { validateColumnFilter, validateColumnFilters, normalizeOperator, InvalidColumnFilterError, } from './validate-column-filter.js';
|
|
4
4
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/operators/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/operators/index.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAChE,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EACL,oBAAoB,EACpB,qBAAqB,EACrB,iBAAiB,EACjB,wBAAwB,GACzB,MAAM,6BAA6B,CAAC"}
|
|
@@ -8,12 +8,28 @@ export type FilterOperator = 'equals' | 'notEquals' | 'contains' | 'notContains'
|
|
|
8
8
|
* All valid operator strings, used for runtime validation.
|
|
9
9
|
*/
|
|
10
10
|
export declare const FILTER_OPERATORS: readonly FilterOperator[];
|
|
11
|
+
/**
|
|
12
|
+
* SQL-symbol aliases accepted on input and normalized to a canonical
|
|
13
|
+
* {@link FilterOperator} before validation and query building. Lets callers
|
|
14
|
+
* write the familiar `=`/`!=`/`<`/`>` shorthands instead of the named form.
|
|
15
|
+
*/
|
|
16
|
+
export declare const OPERATOR_ALIASES: Readonly<Record<string, FilterOperator>>;
|
|
17
|
+
/**
|
|
18
|
+
* An operator alias string (e.g. `'='`). Always normalized to a canonical
|
|
19
|
+
* {@link FilterOperator} via `normalizeOperator`.
|
|
20
|
+
*/
|
|
21
|
+
export type FilterOperatorAlias = keyof typeof OPERATOR_ALIASES;
|
|
22
|
+
/**
|
|
23
|
+
* Operator value accepted on input: either a canonical {@link FilterOperator}
|
|
24
|
+
* or one of its SQL-symbol {@link FilterOperatorAlias aliases}.
|
|
25
|
+
*/
|
|
26
|
+
export type FilterOperatorInput = FilterOperator | FilterOperatorAlias;
|
|
11
27
|
/**
|
|
12
28
|
* A single column filter condition with optional AND/OR composition.
|
|
13
29
|
*/
|
|
14
30
|
export interface ColumnFilter {
|
|
15
31
|
field: string;
|
|
16
|
-
operator:
|
|
32
|
+
operator: FilterOperatorInput;
|
|
17
33
|
value?: unknown;
|
|
18
34
|
AND?: ColumnFilter[];
|
|
19
35
|
OR?: ColumnFilter[];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/operators/types.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,MAAM,MAAM,cAAc,GACtB,QAAQ,GACR,WAAW,GACX,UAAU,GACV,aAAa,GACb,WAAW,GACX,YAAY,GACZ,UAAU,GACV,IAAI,GACJ,KAAK,GACL,IAAI,GACJ,KAAK,GACL,SAAS,GACT,YAAY,GACZ,IAAI,GACJ,OAAO,GACP,SAAS,GACT,SAAS,GACT,YAAY,GACZ,QAAQ,GACR,WAAW,GACX,QAAQ,GACR,WAAW,CAAC;AAEhB;;GAEG;AACH,eAAO,MAAM,gBAAgB,EAAE,SAAS,cAAc,EAuB5C,CAAC;AAEX;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/operators/types.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,MAAM,MAAM,cAAc,GACtB,QAAQ,GACR,WAAW,GACX,UAAU,GACV,aAAa,GACb,WAAW,GACX,YAAY,GACZ,UAAU,GACV,IAAI,GACJ,KAAK,GACL,IAAI,GACJ,KAAK,GACL,SAAS,GACT,YAAY,GACZ,IAAI,GACJ,OAAO,GACP,SAAS,GACT,SAAS,GACT,YAAY,GACZ,QAAQ,GACR,WAAW,GACX,QAAQ,GACR,WAAW,CAAC;AAEhB;;GAEG;AACH,eAAO,MAAM,gBAAgB,EAAE,SAAS,cAAc,EAuB5C,CAAC;AAEX;;;;GAIG;AACH,eAAO,MAAM,gBAAgB,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,CAS5D,CAAC;AAEX;;;GAGG;AACH,MAAM,MAAM,mBAAmB,GAAG,MAAM,OAAO,gBAAgB,CAAC;AAEhE;;;GAGG;AACH,MAAM,MAAM,mBAAmB,GAAG,cAAc,GAAG,mBAAmB,CAAC;AAEvE;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,mBAAmB,CAAC;IAC9B,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,GAAG,CAAC,EAAE,YAAY,EAAE,CAAC;IACrB,EAAE,CAAC,EAAE,YAAY,EAAE,CAAC;CACrB"}
|
package/dist/operators/types.js
CHANGED
|
@@ -25,4 +25,19 @@ export const FILTER_OPERATORS = [
|
|
|
25
25
|
'exists',
|
|
26
26
|
'notExists',
|
|
27
27
|
];
|
|
28
|
+
/**
|
|
29
|
+
* SQL-symbol aliases accepted on input and normalized to a canonical
|
|
30
|
+
* {@link FilterOperator} before validation and query building. Lets callers
|
|
31
|
+
* write the familiar `=`/`!=`/`<`/`>` shorthands instead of the named form.
|
|
32
|
+
*/
|
|
33
|
+
export const OPERATOR_ALIASES = {
|
|
34
|
+
'=': 'equals',
|
|
35
|
+
'==': 'equals',
|
|
36
|
+
'!=': 'notEquals',
|
|
37
|
+
'<>': 'notEquals',
|
|
38
|
+
'>': 'gt',
|
|
39
|
+
'>=': 'gte',
|
|
40
|
+
'<': 'lt',
|
|
41
|
+
'<=': 'lte',
|
|
42
|
+
};
|
|
28
43
|
//# sourceMappingURL=types.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/operators/types.ts"],"names":[],"mappings":"AA6BA;;GAEG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAA8B;IACzD,QAAQ;IACR,WAAW;IACX,UAAU;IACV,aAAa;IACb,WAAW;IACX,YAAY;IACZ,UAAU;IACV,IAAI;IACJ,KAAK;IACL,IAAI;IACJ,KAAK;IACL,SAAS;IACT,YAAY;IACZ,IAAI;IACJ,OAAO;IACP,SAAS;IACT,SAAS;IACT,YAAY;IACZ,QAAQ;IACR,WAAW;IACX,QAAQ;IACR,WAAW;CACH,CAAC"}
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/operators/types.ts"],"names":[],"mappings":"AA6BA;;GAEG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAA8B;IACzD,QAAQ;IACR,WAAW;IACX,UAAU;IACV,aAAa;IACb,WAAW;IACX,YAAY;IACZ,UAAU;IACV,IAAI;IACJ,KAAK;IACL,IAAI;IACJ,KAAK;IACL,SAAS;IACT,YAAY;IACZ,IAAI;IACJ,OAAO;IACP,SAAS;IACT,SAAS;IACT,YAAY;IACZ,QAAQ;IACR,WAAW;IACX,QAAQ;IACR,WAAW;CACH,CAAC;AAEX;;;;GAIG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAA6C;IACxE,GAAG,EAAE,QAAQ;IACb,IAAI,EAAE,QAAQ;IACd,IAAI,EAAE,WAAW;IACjB,IAAI,EAAE,WAAW;IACjB,GAAG,EAAE,IAAI;IACT,IAAI,EAAE,KAAK;IACX,GAAG,EAAE,IAAI;IACT,IAAI,EAAE,KAAK;CACH,CAAC"}
|
|
@@ -1,4 +1,10 @@
|
|
|
1
|
-
import { type ColumnFilter } from './types.js';
|
|
1
|
+
import { type ColumnFilter, type FilterOperator } from './types.js';
|
|
2
|
+
/**
|
|
3
|
+
* Normalizes an operator string to its canonical {@link FilterOperator},
|
|
4
|
+
* resolving SQL-symbol aliases (`=` -> `equals`, `!=` -> `notEquals`, ...).
|
|
5
|
+
* Canonical operators (and unknown strings) pass through unchanged.
|
|
6
|
+
*/
|
|
7
|
+
export declare function normalizeOperator(operator: string): FilterOperator;
|
|
2
8
|
/**
|
|
3
9
|
* Maximum allowed nesting depth for AND/OR filter composition.
|
|
4
10
|
* Prevents stack overflow from maliciously deep payloads (DoS).
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"validate-column-filter.d.ts","sourceRoot":"","sources":["../../src/operators/validate-column-filter.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"validate-column-filter.d.ts","sourceRoot":"","sources":["../../src/operators/validate-column-filter.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,YAAY,EAEjB,KAAK,cAAc,EAEpB,MAAM,YAAY,CAAC;AAIpB;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,GAAG,cAAc,CAElE;AAyBD;;;GAGG;AACH,eAAO,MAAM,gBAAgB,KAAK,CAAC;AAEnC,qBAAa,wBAAyB,SAAQ,KAAK;gBACrC,OAAO,EAAE,MAAM;CAI5B;AAED;;;;;;;;GAQG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,YAAY,EAAE,KAAK,SAAI,GAAG,IAAI,CAsG1E;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,YAAY,EAAE,GAAG,IAAI,CAOnE"}
|
|
@@ -1,5 +1,13 @@
|
|
|
1
|
-
import { FILTER_OPERATORS } from './types.js';
|
|
1
|
+
import { FILTER_OPERATORS, OPERATOR_ALIASES, } from './types.js';
|
|
2
2
|
const operatorSet = new Set(FILTER_OPERATORS);
|
|
3
|
+
/**
|
|
4
|
+
* Normalizes an operator string to its canonical {@link FilterOperator},
|
|
5
|
+
* resolving SQL-symbol aliases (`=` -> `equals`, `!=` -> `notEquals`, ...).
|
|
6
|
+
* Canonical operators (and unknown strings) pass through unchanged.
|
|
7
|
+
*/
|
|
8
|
+
export function normalizeOperator(operator) {
|
|
9
|
+
return (OPERATOR_ALIASES[operator] ?? operator);
|
|
10
|
+
}
|
|
3
11
|
/**
|
|
4
12
|
* Operators that require no value (unary operators).
|
|
5
13
|
*/
|
|
@@ -48,6 +56,26 @@ export function validateColumnFilter(filter, depth = 0) {
|
|
|
48
56
|
if (!filter || typeof filter !== 'object') {
|
|
49
57
|
throw new InvalidColumnFilterError('Column filter must be a non-null object.');
|
|
50
58
|
}
|
|
59
|
+
// Pure group node: `{ AND: [...] }` / `{ OR: [...] }` with no column of its
|
|
60
|
+
// own composes child filters and has no field/operator/value to validate.
|
|
61
|
+
// The client builder emits these (sometimes with an empty `field`), so treat
|
|
62
|
+
// an empty field as absent. Validate only the nested arrays, then stop.
|
|
63
|
+
const isGroupNode = (filter.AND !== undefined || filter.OR !== undefined) &&
|
|
64
|
+
(filter.field === undefined || filter.field === '');
|
|
65
|
+
if (isGroupNode) {
|
|
66
|
+
for (const key of ['AND', 'OR']) {
|
|
67
|
+
const group = filter[key];
|
|
68
|
+
if (group !== undefined) {
|
|
69
|
+
if (!Array.isArray(group)) {
|
|
70
|
+
throw new InvalidColumnFilterError(`"${key}" must be an array of ColumnFilter.`);
|
|
71
|
+
}
|
|
72
|
+
for (const sub of group) {
|
|
73
|
+
validateColumnFilter(sub, depth + 1);
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
return;
|
|
78
|
+
}
|
|
51
79
|
// Validate field
|
|
52
80
|
if (typeof filter.field !== 'string' || filter.field.length === 0) {
|
|
53
81
|
throw new InvalidColumnFilterError('Column filter "field" must be a non-empty string.');
|
|
@@ -56,12 +84,14 @@ export function validateColumnFilter(filter, depth = 0) {
|
|
|
56
84
|
if (!/^[a-zA-Z_][a-zA-Z0-9_.]*$/.test(filter.field)) {
|
|
57
85
|
throw new InvalidColumnFilterError(`Column filter field "${filter.field}" contains invalid characters. Only letters, digits, underscores, and dots are allowed.`);
|
|
58
86
|
}
|
|
59
|
-
// Validate operator
|
|
60
|
-
|
|
87
|
+
// Validate operator, accepting SQL-symbol aliases (`=`, `!=`, `<`, ...).
|
|
88
|
+
const op = normalizeOperator(filter.operator);
|
|
89
|
+
if (!operatorSet.has(op)) {
|
|
61
90
|
throw new InvalidColumnFilterError(`Unknown filter operator "${filter.operator}". ` +
|
|
62
91
|
`Valid operators: ${FILTER_OPERATORS.join(', ')}.`);
|
|
63
92
|
}
|
|
64
|
-
|
|
93
|
+
// Persist the canonical form so downstream query builders never see aliases.
|
|
94
|
+
filter.operator = op;
|
|
65
95
|
// Reject null for non-unary operators (point to isNull instead)
|
|
66
96
|
if (!UNARY_OPERATORS.has(op) && filter.value === null) {
|
|
67
97
|
throw new InvalidColumnFilterError(`Operator "${op}" received null. Use "isNull" for NULL checks.`);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"validate-column-filter.js","sourceRoot":"","sources":["../../src/operators/validate-column-filter.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"validate-column-filter.js","sourceRoot":"","sources":["../../src/operators/validate-column-filter.ts"],"names":[],"mappings":"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"}
|