@ifc-lite/rules 0.4.1 → 0.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.
Files changed (78) hide show
  1. package/README.md +2 -0
  2. package/dist/engine/rule-engine-requirements.d.ts.map +1 -1
  3. package/dist/engine/rule-engine-requirements.js +3 -2
  4. package/dist/engine/rule-engine-requirements.js.map +1 -1
  5. package/dist/engine/rule-engine-sets.d.ts.map +1 -1
  6. package/dist/engine/rule-engine-sets.js +2 -1
  7. package/dist/engine/rule-engine-sets.js.map +1 -1
  8. package/dist/filter/filter-evaluate-groups.d.ts.map +1 -1
  9. package/dist/filter/filter-evaluate-groups.js +4 -0
  10. package/dist/filter/filter-evaluate-groups.js.map +1 -1
  11. package/dist/filter/filter-evaluate.d.ts +5 -0
  12. package/dist/filter/filter-evaluate.d.ts.map +1 -1
  13. package/dist/filter/filter-evaluate.js +38 -56
  14. package/dist/filter/filter-evaluate.js.map +1 -1
  15. package/dist/filter/filter-iteration-source.d.ts.map +1 -1
  16. package/dist/filter/filter-iteration-source.js +3 -1
  17. package/dist/filter/filter-iteration-source.js.map +1 -1
  18. package/dist/filter/filter-list-condition.d.ts +57 -0
  19. package/dist/filter/filter-list-condition.d.ts.map +1 -0
  20. package/dist/filter/filter-list-condition.js +68 -0
  21. package/dist/filter/filter-list-condition.js.map +1 -0
  22. package/dist/filter/filter-match.d.ts +8 -17
  23. package/dist/filter/filter-match.d.ts.map +1 -1
  24. package/dist/filter/filter-match.js +61 -118
  25. package/dist/filter/filter-match.js.map +1 -1
  26. package/dist/filter/filter-operator-types.d.ts +46 -0
  27. package/dist/filter/filter-operator-types.d.ts.map +1 -0
  28. package/dist/filter/filter-operator-types.js +5 -0
  29. package/dist/filter/filter-operator-types.js.map +1 -0
  30. package/dist/filter/filter-ops.d.ts +2 -2
  31. package/dist/filter/filter-ops.d.ts.map +1 -1
  32. package/dist/filter/filter-ops.js +25 -5
  33. package/dist/filter/filter-ops.js.map +1 -1
  34. package/dist/filter/filter-rule-guards.d.ts.map +1 -1
  35. package/dist/filter/filter-rule-guards.js +31 -3
  36. package/dist/filter/filter-rule-guards.js.map +1 -1
  37. package/dist/filter/filter-rules.d.ts +15 -39
  38. package/dist/filter/filter-rules.d.ts.map +1 -1
  39. package/dist/filter/filter-rules.js +2 -1
  40. package/dist/filter/filter-rules.js.map +1 -1
  41. package/dist/filter/filter-storey.d.ts +18 -0
  42. package/dist/filter/filter-storey.d.ts.map +1 -0
  43. package/dist/filter/filter-storey.js +109 -0
  44. package/dist/filter/filter-storey.js.map +1 -0
  45. package/dist/filter/legacy-operator-adapters.d.ts +47 -0
  46. package/dist/filter/legacy-operator-adapters.d.ts.map +1 -0
  47. package/dist/filter/legacy-operator-adapters.js +74 -0
  48. package/dist/filter/legacy-operator-adapters.js.map +1 -0
  49. package/dist/filter/read-measure-subject.d.ts +3 -2
  50. package/dist/filter/read-measure-subject.d.ts.map +1 -1
  51. package/dist/filter/read-measure-subject.js +18 -5
  52. package/dist/filter/read-measure-subject.js.map +1 -1
  53. package/dist/filter/read-subject.d.ts.map +1 -1
  54. package/dist/filter/read-subject.js +2 -1
  55. package/dist/filter/read-subject.js.map +1 -1
  56. package/dist/filter/subject-read-options.d.ts +17 -1
  57. package/dist/filter/subject-read-options.d.ts.map +1 -1
  58. package/dist/filter/subject-read-options.js +9 -1
  59. package/dist/filter/subject-read-options.js.map +1 -1
  60. package/dist/ids/rule-to-ids-facets.d.ts.map +1 -1
  61. package/dist/ids/rule-to-ids-facets.js +5 -0
  62. package/dist/ids/rule-to-ids-facets.js.map +1 -1
  63. package/dist/index.d.ts +3 -0
  64. package/dist/index.d.ts.map +1 -1
  65. package/dist/index.js +3 -0
  66. package/dist/index.js.map +1 -1
  67. package/dist/rule-set/between-chip.js +1 -1
  68. package/dist/rule-set/between-chip.js.map +1 -1
  69. package/dist/rule-set/requirement-text.d.ts.map +1 -1
  70. package/dist/rule-set/requirement-text.js +1 -0
  71. package/dist/rule-set/requirement-text.js.map +1 -1
  72. package/dist/rule-set/rule-set-io-requirement.d.ts.map +1 -1
  73. package/dist/rule-set/rule-set-io-requirement.js +2 -0
  74. package/dist/rule-set/rule-set-io-requirement.js.map +1 -1
  75. package/dist/rule-set/rule-set-io-subject.d.ts.map +1 -1
  76. package/dist/rule-set/rule-set-io-subject.js +5 -0
  77. package/dist/rule-set/rule-set-io-subject.js.map +1 -1
  78. package/package.json +9 -9
@@ -0,0 +1,57 @@
1
+ /**
2
+ * `listCondition` (#6190): a Lists value predicate carried inside a Rules
3
+ * `FilterGroup`, as an explicit adapter rather than a canonical kind.
4
+ *
5
+ * The fields are the saved Lists condition, verbatim: `source`, `psetName`
6
+ * (a pset/qto name, or the durable zone-SET id for `zone`), `propertyName`
7
+ * (an attribute/property/quantity name, the spatial level for `spatial`, the
8
+ * zone display mode for `zone`, the axis for `geometry`), `operator`, `value`
9
+ * and `inherit`. Their meaning is the Lists engine's and nothing else's:
10
+ * this package never reads the value itself. The host supplies a
11
+ * {@link ListConditionMatcher} on the evaluator model (`@ifc-lite/lists`'
12
+ * `listConditionMatcher(provider)`), so one implementation answers the
13
+ * predicate whether it runs as a list scope or inside an OR group.
14
+ *
15
+ * Why not canonical kinds: the canonical readers differ from the Lists ones
16
+ * on purpose. `material` also matches Categories and skips layer labels,
17
+ * `storey` hops through a containing space, `model` compares a durable
18
+ * source fingerprint rather than the file name, `attribute` rejects
19
+ * `GlobalId`, and property inheritance merges per property. Converting a
20
+ * saved Lists predicate to one of them would change which rows it keeps.
21
+ * Zones and world coordinates are viewer data the IFC store does not hold.
22
+ */
23
+ export declare const LIST_CONDITION_SOURCES: readonly ["attribute", "property", "quantity", "material", "classification", "spatial", "model", "zone", "geometry"];
24
+ export type ListConditionSource = (typeof LIST_CONDITION_SOURCES)[number];
25
+ export declare const LIST_CONDITION_OPERATORS: readonly ["equals", "notEquals", "contains", "gt", "lt", "gte", "lte", "exists"];
26
+ export type ListConditionOperator = (typeof LIST_CONDITION_OPERATORS)[number];
27
+ export interface ListConditionRule {
28
+ kind: 'listCondition';
29
+ source: ListConditionSource;
30
+ /** Pset / qto name; the durable zone-SET id for `zone`. */
31
+ psetName?: string;
32
+ /** Attribute, property or quantity name; spatial level; zone display mode; axis. */
33
+ propertyName: string;
34
+ operator: ListConditionOperator;
35
+ value: string | number | boolean;
36
+ /** property / quantity only (#5433). */
37
+ inherit?: 'type' | 'aggregation';
38
+ }
39
+ /** Answers one `listCondition` rule for one element of the model it is attached to. */
40
+ export type ListConditionMatcher = (expressId: number, rule: ListConditionRule) => boolean;
41
+ /** Structural guard: every field the Lists engine reads has the type it reads. */
42
+ export declare function isListConditionRule(value: unknown): value is ListConditionRule;
43
+ export declare function listConditionRule(condition: Omit<ListConditionRule, 'kind'>): ListConditionRule;
44
+ /** Refuse, before any element is read, a run whose rules hold a `listCondition`
45
+ * but whose model has no matcher. Checked up front rather than when the rule is
46
+ * reached: a cheaper failing rule earlier in an AND group would otherwise
47
+ * short-circuit past it, and the run would return no rows instead of saying why. */
48
+ export declare function assertListConditionsAnswerable(rules: readonly {
49
+ kind: string;
50
+ }[], models: readonly {
51
+ id: string;
52
+ listConditions?: ListConditionMatcher;
53
+ store?: unknown;
54
+ }[]): void;
55
+ /** A model without a matcher cannot answer the predicate; saying so beats matching nothing. */
56
+ export declare function matchListConditionRule(rule: ListConditionRule, expressId: number, matcher: ListConditionMatcher | undefined): boolean;
57
+ //# sourceMappingURL=filter-list-condition.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"filter-list-condition.d.ts","sourceRoot":"","sources":["../../src/filter/filter-list-condition.ts"],"names":[],"mappings":"AAIA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAEH,eAAO,MAAM,sBAAsB,sHAEzB,CAAC;AACX,MAAM,MAAM,mBAAmB,GAAG,CAAC,OAAO,sBAAsB,CAAC,CAAC,MAAM,CAAC,CAAC;AAE1E,eAAO,MAAM,wBAAwB,kFAE3B,CAAC;AACX,MAAM,MAAM,qBAAqB,GAAG,CAAC,OAAO,wBAAwB,CAAC,CAAC,MAAM,CAAC,CAAC;AAE9E,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,eAAe,CAAC;IACtB,MAAM,EAAE,mBAAmB,CAAC;IAC5B,2DAA2D;IAC3D,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,oFAAoF;IACpF,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,qBAAqB,CAAC;IAChC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC;IACjC,wCAAwC;IACxC,OAAO,CAAC,EAAE,MAAM,GAAG,aAAa,CAAC;CAClC;AAED,uFAAuF;AACvF,MAAM,MAAM,oBAAoB,GAAG,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,iBAAiB,KAAK,OAAO,CAAC;AAK3F,kFAAkF;AAClF,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,iBAAiB,CAQ9E;AAED,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,IAAI,CAAC,iBAAiB,EAAE,MAAM,CAAC,GAAG,iBAAiB,CAE/F;AAED;;;oFAGoF;AACpF,wBAAgB,8BAA8B,CAC5C,KAAK,EAAE,SAAS;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,EAAE,EAClC,MAAM,EAAE,SAAS;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,cAAc,CAAC,EAAE,oBAAoB,CAAC;IAAC,KAAK,CAAC,EAAE,OAAO,CAAA;CAAE,EAAE,GACxF,IAAI,CAON;AAED,+FAA+F;AAC/F,wBAAgB,sBAAsB,CACpC,IAAI,EAAE,iBAAiB,EACvB,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,oBAAoB,GAAG,SAAS,GACxC,OAAO,CAKT"}
@@ -0,0 +1,68 @@
1
+ /* This Source Code Form is subject to the terms of the Mozilla Public
2
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
3
+ * file, You can obtain one at https://mozilla.org/MPL/2.0/. */
4
+ /**
5
+ * `listCondition` (#6190): a Lists value predicate carried inside a Rules
6
+ * `FilterGroup`, as an explicit adapter rather than a canonical kind.
7
+ *
8
+ * The fields are the saved Lists condition, verbatim: `source`, `psetName`
9
+ * (a pset/qto name, or the durable zone-SET id for `zone`), `propertyName`
10
+ * (an attribute/property/quantity name, the spatial level for `spatial`, the
11
+ * zone display mode for `zone`, the axis for `geometry`), `operator`, `value`
12
+ * and `inherit`. Their meaning is the Lists engine's and nothing else's:
13
+ * this package never reads the value itself. The host supplies a
14
+ * {@link ListConditionMatcher} on the evaluator model (`@ifc-lite/lists`'
15
+ * `listConditionMatcher(provider)`), so one implementation answers the
16
+ * predicate whether it runs as a list scope or inside an OR group.
17
+ *
18
+ * Why not canonical kinds: the canonical readers differ from the Lists ones
19
+ * on purpose. `material` also matches Categories and skips layer labels,
20
+ * `storey` hops through a containing space, `model` compares a durable
21
+ * source fingerprint rather than the file name, `attribute` rejects
22
+ * `GlobalId`, and property inheritance merges per property. Converting a
23
+ * saved Lists predicate to one of them would change which rows it keeps.
24
+ * Zones and world coordinates are viewer data the IFC store does not hold.
25
+ */
26
+ export const LIST_CONDITION_SOURCES = [
27
+ 'attribute', 'property', 'quantity', 'material', 'classification', 'spatial', 'model', 'zone', 'geometry',
28
+ ];
29
+ export const LIST_CONDITION_OPERATORS = [
30
+ 'equals', 'notEquals', 'contains', 'gt', 'lt', 'gte', 'lte', 'exists',
31
+ ];
32
+ const SOURCES = new Set(LIST_CONDITION_SOURCES);
33
+ const OPERATORS = new Set(LIST_CONDITION_OPERATORS);
34
+ /** Structural guard: every field the Lists engine reads has the type it reads. */
35
+ export function isListConditionRule(value) {
36
+ if (typeof value !== 'object' || value === null)
37
+ return false;
38
+ const r = value;
39
+ return r.kind === 'listCondition' && SOURCES.has(r.source) && OPERATORS.has(r.operator)
40
+ && typeof r.propertyName === 'string'
41
+ && (r.psetName === undefined || typeof r.psetName === 'string')
42
+ && (typeof r.value === 'string' || typeof r.value === 'number' || typeof r.value === 'boolean')
43
+ && (r.inherit === undefined || r.inherit === 'type' || r.inherit === 'aggregation');
44
+ }
45
+ export function listConditionRule(condition) {
46
+ return { kind: 'listCondition', ...condition };
47
+ }
48
+ /** Refuse, before any element is read, a run whose rules hold a `listCondition`
49
+ * but whose model has no matcher. Checked up front rather than when the rule is
50
+ * reached: a cheaper failing rule earlier in an AND group would otherwise
51
+ * short-circuit past it, and the run would return no rows instead of saying why. */
52
+ export function assertListConditionsAnswerable(rules, models) {
53
+ const rule = rules.find((r) => r.kind === 'listCondition');
54
+ if (!rule)
55
+ return;
56
+ const model = models.find((m) => m.store !== null && !m.listConditions);
57
+ if (model) {
58
+ throw new Error(`A Lists ${rule.source} condition needs the Lists data provider for model "${model.id}"; run it through a list.`);
59
+ }
60
+ }
61
+ /** A model without a matcher cannot answer the predicate; saying so beats matching nothing. */
62
+ export function matchListConditionRule(rule, expressId, matcher) {
63
+ if (!matcher) {
64
+ throw new Error(`A Lists ${rule.source} condition needs the Lists data provider; run it through a list.`);
65
+ }
66
+ return matcher(expressId, rule);
67
+ }
68
+ //# sourceMappingURL=filter-list-condition.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"filter-list-condition.js","sourceRoot":"","sources":["../../src/filter/filter-list-condition.ts"],"names":[],"mappings":"AAAA;;+DAE+D;AAE/D;;;;;;;;;;;;;;;;;;;;;GAqBG;AAEH,MAAM,CAAC,MAAM,sBAAsB,GAAG;IACpC,WAAW,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,gBAAgB,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,EAAE,UAAU;CACjG,CAAC;AAGX,MAAM,CAAC,MAAM,wBAAwB,GAAG;IACtC,QAAQ,EAAE,WAAW,EAAE,UAAU,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ;CAC7D,CAAC;AAmBX,MAAM,OAAO,GAAyB,IAAI,GAAG,CAAC,sBAAsB,CAAC,CAAC;AACtE,MAAM,SAAS,GAAyB,IAAI,GAAG,CAAC,wBAAwB,CAAC,CAAC;AAE1E,kFAAkF;AAClF,MAAM,UAAU,mBAAmB,CAAC,KAAc;IAChD,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI;QAAE,OAAO,KAAK,CAAC;IAC9D,MAAM,CAAC,GAAG,KAAgC,CAAC;IAC3C,OAAO,CAAC,CAAC,IAAI,KAAK,eAAe,IAAI,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC;WAClF,OAAO,CAAC,CAAC,YAAY,KAAK,QAAQ;WAClC,CAAC,CAAC,CAAC,QAAQ,KAAK,SAAS,IAAI,OAAO,CAAC,CAAC,QAAQ,KAAK,QAAQ,CAAC;WAC5D,CAAC,OAAO,CAAC,CAAC,KAAK,KAAK,QAAQ,IAAI,OAAO,CAAC,CAAC,KAAK,KAAK,QAAQ,IAAI,OAAO,CAAC,CAAC,KAAK,KAAK,SAAS,CAAC;WAC5F,CAAC,CAAC,CAAC,OAAO,KAAK,SAAS,IAAI,CAAC,CAAC,OAAO,KAAK,MAAM,IAAI,CAAC,CAAC,OAAO,KAAK,aAAa,CAAC,CAAC;AACxF,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,SAA0C;IAC1E,OAAO,EAAE,IAAI,EAAE,eAAe,EAAE,GAAG,SAAS,EAAE,CAAC;AACjD,CAAC;AAED;;;oFAGoF;AACpF,MAAM,UAAU,8BAA8B,CAC5C,KAAkC,EAClC,MAAyF;IAEzF,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAA0B,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,eAAe,CAAC,CAAC;IACnF,IAAI,CAAC,IAAI;QAAE,OAAO;IAClB,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,KAAK,IAAI,IAAI,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC;IACxE,IAAI,KAAK,EAAE,CAAC;QACV,MAAM,IAAI,KAAK,CAAC,WAAW,IAAI,CAAC,MAAM,uDAAuD,KAAK,CAAC,EAAE,2BAA2B,CAAC,CAAC;IACpI,CAAC;AACH,CAAC;AAED,+FAA+F;AAC/F,MAAM,UAAU,sBAAsB,CACpC,IAAuB,EACvB,SAAiB,EACjB,OAAyC;IAEzC,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,MAAM,IAAI,KAAK,CAAC,WAAW,IAAI,CAAC,MAAM,kEAAkE,CAAC,CAAC;IAC5G,CAAC;IACD,OAAO,OAAO,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;AAClC,CAAC"}
@@ -7,7 +7,7 @@
7
7
  * `filter-evaluate.test.ts` via the evaluator's `__internal` re-export.
8
8
  */
9
9
  import { extractPropertiesOnDemand, extractQuantitiesOnDemand, type IfcDataStore, type MaterialInfo, type ClassificationInfo } from '@ifc-lite/parser';
10
- import { type PropertyRule, type QuantityRule, type ClassificationRule, type AttributeRule, type StoreyRule, type ParentRule, type TextKind, type ValueOp } from './filter-rules.js';
10
+ import { type PropertyRule, type QuantityRule, type ClassificationRule, type AttributeRule, type ParentRule, type TextKind, type ValueOp } from './filter-rules.js';
11
11
  /**
12
12
  * Compare a rule's property-set / property name against a row's.
13
13
  *
@@ -28,11 +28,16 @@ import { type PropertyRule, type QuantityRule, type ClassificationRule, type Att
28
28
  * docstring for the full contract. This function does not catch that; it
29
29
  * propagates to `filter-evaluate.ts`'s caller, which must.
30
30
  */
31
- export declare function nameMatches(rulePattern: string, rowName: string, kind?: TextKind): boolean;
31
+ export declare function nameMatches(rulePattern: string, rowName: string, kind?: TextKind, caseMode?: 'exact'): boolean;
32
32
  export interface PsetRow {
33
33
  setName: string;
34
34
  propertyName: string;
35
35
  value: string;
36
+ /** Retain primitive type so a converted Bulk condition cannot match a different typed value. */
37
+ valueType?: 'string' | 'number' | 'boolean' | 'null';
38
+ /** The scalar display value read by saved v1 Lists before multi-value
39
+ * expansion. `null` is different from an explicitly empty value. */
40
+ legacyListValue?: string | null;
36
41
  }
37
42
  export type PsetRows = ReadonlyArray<PsetRow>;
38
43
  export interface QtyRow {
@@ -53,7 +58,7 @@ export declare function propertyCandidates(p: {
53
58
  values?: readonly string[];
54
59
  structure?: string;
55
60
  }): string[];
56
- export declare function flattenPsets(psets: ReturnType<typeof extractPropertiesOnDemand>): PsetRows;
61
+ export declare function flattenPsets(psets: ReturnType<typeof extractPropertiesOnDemand>, includeLegacyListValues?: boolean): PsetRows;
57
62
  export declare function flattenQtys(qtos: ReturnType<typeof extractQuantitiesOnDemand>): QtyRows;
58
63
  export declare function stringifyValue(value: unknown): string;
59
64
  export declare function matchPropertyRule(rule: PropertyRule, rows: PsetRows): boolean;
@@ -75,20 +80,6 @@ export type AttrRows = ReadonlyArray<{
75
80
  */
76
81
  export declare function matchAttributeRule(rule: AttributeRule, attrs: AttrRows): boolean;
77
82
  export declare function matchQuantityRule(rule: QuantityRule, rows: QtyRows): boolean;
78
- export declare function defaultStoreyName(store: IfcDataStore, expressId: number): string;
79
- /** Does `expressId` (in `modelId`) sit in a storey ref'd by `rule.refs`?
80
- * `IfcBuildingStorey.Name` isn't unique, so once a `StoreyRule` carries
81
- * an exact (modelId, expressId) ref (mirrored from a HierarchyPanel
82
- * click), matching bypasses Name entirely. Reaches through a containing
83
- * space via {@link storeyIdOf}, same as the Name-matched path. */
84
- export declare function storeyMatchesRefs(store: IfcDataStore, expressId: number, modelId: string, rule: StoreyRule): boolean;
85
- /** Index-prefilter twin of {@link storeyMatchesRefs}/Name matching: the
86
- * bucket of elements a `storey op:'in'` rule narrows to for `modelId`.
87
- * Includes each matched storey's directly-contained elements AND every
88
- * element `bySpace` lists for a space belonging to that storey, so this
89
- * prefilter can never exclude a candidate the (also widened) per-entity
90
- * check in `filter-evaluate.ts` would go on to match. */
91
- export declare function unionByStorey(store: IfcDataStore, rule: StoreyRule, modelId: string | undefined): number[] | null;
92
83
  /** Collect the *individual* material names an element exposes - each layer /
93
84
  * constituent / profile material, or the single plain material - for the
94
85
  * multi-valued `material` rule matcher and the material dropdown. Shares the
@@ -1 +1 @@
1
- {"version":3,"file":"filter-match.d.ts","sourceRoot":"","sources":["../../src/filter/filter-match.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"filter-match.d.ts","sourceRoot":"","sources":["../../src/filter/filter-match.ts"],"names":[],"mappings":"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"}
@@ -6,7 +6,7 @@ import { collectSpatialAncestors } from '@ifc-lite/data';
6
6
  import { valueOpMatches, numericOpMatches, matchStringAnyNone } from './filter-ops.js';
7
7
  import { lensMaterialNames } from './lens-material-names.js';
8
8
  import { parsePropertyValue } from '@ifc-lite/encoding';
9
- import { compileNameMatcher, isNamePattern } from '@ifc-lite/lists';
9
+ import { compileNameMatcher, isNamePattern } from '@ifc-lite/regex-guard';
10
10
  /**
11
11
  * Compare a rule's property-set / property name against a row's.
12
12
  *
@@ -27,11 +27,13 @@ import { compileNameMatcher, isNamePattern } from '@ifc-lite/lists';
27
27
  * docstring for the full contract. This function does not catch that; it
28
28
  * propagates to `filter-evaluate.ts`'s caller, which must.
29
29
  */
30
- export function nameMatches(rulePattern, rowName, kind) {
30
+ export function nameMatches(rulePattern, rowName, kind, caseMode) {
31
31
  if (kind === 'regex')
32
32
  return compileNameMatcher(`/${rulePattern}/`)(rowName);
33
33
  if (kind === undefined && isNamePattern(rulePattern))
34
34
  return compileNameMatcher(rulePattern)(rowName);
35
+ if (caseMode === 'exact')
36
+ return rowName === rulePattern;
35
37
  return rowName.toLowerCase() === rulePattern.toLowerCase();
36
38
  }
37
39
  /** Structures whose `values` are the candidates a rule reads (#5475). */
@@ -48,10 +50,27 @@ export function propertyCandidates(p) {
48
50
  return [...p.values];
49
51
  return [stringifyValue(p.value)];
50
52
  }
51
- export function flattenPsets(psets) {
53
+ function legacyListValue(value) {
54
+ if (value === null || value === undefined)
55
+ return null;
56
+ const display = parsePropertyValue(value).displayValue;
57
+ if (display === '\u2014')
58
+ return null;
59
+ if (typeof value === 'number')
60
+ return String(value);
61
+ if (Array.isArray(value) && value.length === 2 && typeof value[1] === 'number')
62
+ return String(value[1]);
63
+ return display;
64
+ }
65
+ export function flattenPsets(psets, includeLegacyListValues = false) {
52
66
  const out = [];
53
67
  for (const set of psets) {
54
68
  for (const p of set.properties) {
69
+ const valueType = p.value === null || p.value === undefined ? 'null'
70
+ : typeof p.value === 'string' ? 'string'
71
+ : typeof p.value === 'number' ? 'number'
72
+ : typeof p.value === 'boolean' ? 'boolean' : undefined;
73
+ const firstValue = includeLegacyListValues ? legacyListValue(p.value) : undefined;
55
74
  for (const value of propertyCandidates(p))
56
75
  out.push({
57
76
  setName: set.name,
@@ -65,6 +84,8 @@ export function flattenPsets(psets) {
65
84
  // are case-insensitive, so this doesn't change matching outcomes
66
85
  // for either the search chips or free-typed "true"/"false".
67
86
  value,
87
+ valueType,
88
+ ...(includeLegacyListValues ? { legacyListValue: firstValue } : {}),
68
89
  });
69
90
  }
70
91
  }
@@ -93,22 +114,43 @@ export function stringifyValue(value) {
93
114
  return String(value);
94
115
  }
95
116
  export function matchPropertyRule(rule, rows) {
96
- // isSet / isNotSet are presence checks against (setName, propertyName).
97
- if (rule.op === 'isSet' || rule.op === 'isNotSet') {
98
- const present = rows.some((r) => nameMatches(rule.setName, r.setName, rule.setNameKind) &&
99
- nameMatches(rule.propertyName, r.propertyName, rule.propertyNameKind));
100
- return rule.op === 'isSet' ? present : !present;
117
+ // V1 Lists only stored value comparisons and isNonEmpty. Rules presence
118
+ // operators keep their ordinary row-presence semantics on this public flag.
119
+ if (rule.legacyListFirst && rule.op !== 'isSet' && rule.op !== 'isNotSet'
120
+ && rule.op !== 'isNull' && rule.op !== 'isNotNull') {
121
+ const first = rows.find((r) => nameMatches(rule.setName, r.setName, rule.setNameKind, rule.nameCaseMode) &&
122
+ nameMatches(rule.propertyName, r.propertyName, rule.propertyNameKind, rule.nameCaseMode));
123
+ const value = first?.legacyListValue === undefined
124
+ ? first?.valueType === 'null' ? null : first?.value ?? null
125
+ : first.legacyListValue;
126
+ if (rule.op === 'isNonEmpty')
127
+ return value !== null && value !== '';
128
+ if (value === null)
129
+ return false;
130
+ return valueOpMatches(rule.op, value, rule.value, rule.valueKind, rule.comparison);
101
131
  }
102
- const matching = rows.filter((r) => nameMatches(rule.setName, r.setName, rule.setNameKind) &&
103
- nameMatches(rule.propertyName, r.propertyName, rule.propertyNameKind));
132
+ const matching = rows.filter((r) => nameMatches(rule.setName, r.setName, rule.setNameKind, rule.nameCaseMode) &&
133
+ nameMatches(rule.propertyName, r.propertyName, rule.propertyNameKind, rule.nameCaseMode));
134
+ // Presence, non-null and non-empty are distinct in imported filters.
135
+ if (rule.op === 'isSet')
136
+ return matching.length > 0;
137
+ if (rule.op === 'isNotSet')
138
+ return matching.length === 0;
139
+ if (rule.op === 'isNull')
140
+ return matching.length === 0 || matching.some((r) => r.valueType === 'null');
141
+ if (rule.op === 'isNotNull')
142
+ return matching.some((r) => r.valueType !== 'null');
143
+ if (rule.op === 'isNonEmpty')
144
+ return matching.some((r) => r.valueType !== 'null' && r.value.length > 0);
145
+ const comparable = rule.comparison ? matching.filter((r) => r.valueType !== 'null') : matching;
104
146
  // A negated op holds when NO candidate has the value (a list [A, B] is
105
147
  // not "!= A"), the ANY/NONE convention `material` and `parent` use and
106
148
  // validation's `checkValueOp` applies (#5475). With a single candidate
107
149
  // this is the same answer as before.
108
150
  const positive = NEGATED_VALUE_OP[rule.op];
109
151
  if (positive)
110
- return matching.length > 0 && !matching.some((r) => valueOpMatches(positive, r.value, rule.value, rule.valueKind));
111
- return matching.some((r) => valueOpMatches(rule.op, r.value, rule.value, rule.valueKind));
152
+ return comparable.length > 0 && !comparable.some((r) => valueOpMatches(positive, r.value, rule.value, rule.valueKind, rule.comparison));
153
+ return comparable.some((r) => valueOpMatches(rule.op, r.value, rule.value, rule.valueKind, rule.comparison));
112
154
  }
113
155
  /** A negated value op's positive form: the negation holds when NO candidate satisfies it (#5475). */
114
156
  export const NEGATED_VALUE_OP = { ne: 'eq', notContains: 'contains', notMatches: 'matches' };
@@ -128,120 +170,21 @@ export function matchAttributeRule(rule, attrs) {
128
170
  const present = (stringified ?? '').length > 0;
129
171
  return rule.op === 'isSet' ? present : !present;
130
172
  }
173
+ if (rule.op === 'isNull')
174
+ return found === undefined;
175
+ if (rule.op === 'isNotNull')
176
+ return found !== undefined;
177
+ if (rule.op === 'isNonEmpty')
178
+ return (stringified ?? '').length > 0;
131
179
  if (stringified === undefined)
132
180
  return false;
133
- return valueOpMatches(rule.op, stringified, rule.value, rule.valueKind);
181
+ return valueOpMatches(rule.op, stringified, rule.value, rule.valueKind, rule.comparison);
134
182
  }
135
183
  export function matchQuantityRule(rule, rows) {
136
184
  return rows.some((r) => nameMatches(rule.setName, r.setName, rule.setNameKind) &&
137
185
  nameMatches(rule.quantityName, r.quantityName, rule.quantityNameKind) &&
138
186
  numericOpMatches(rule.op, r.value, rule.value));
139
187
  }
140
- // ── Storey lookup fallback ────────────────────────────────────────────────────
141
- /**
142
- * Storey id an element belongs to: its own direct containment
143
- * (`elementToStorey`, set for an element the storey directly contains plus
144
- * its `IfcRelAggregates`-aggregated parts) OR — one hop through a
145
- * containing `IfcSpace`/`IfcSpatialZone` — the storey THAT space belongs
146
- * to. A space is itself mapped to its storey in `elementToStorey`
147
- * (`SpatialHierarchyBuilder` walks a storey's own spatial children), so
148
- * this is a composition of two maps that already exist plus
149
- * `getContainingSpace` (`@ifc-lite/data`'s `spatialLookups`), not a new
150
- * traversal. The single home for "which storey" so the per-entity
151
- * evaluator (`defaultStoreyName`/`storeyMatchesRefs`) and the bulk index
152
- * prefilter (`unionByStorey`) cannot answer it two different ways.
153
- *
154
- * Reaches exactly one level down from the storey: an element inside a
155
- * space nested inside another space (rather than directly under the
156
- * storey) is not resolved — see `docs/guide/selector-syntax.md`.
157
- */
158
- function storeyIdOf(hierarchy, expressId) {
159
- const direct = hierarchy.elementToStorey.get(expressId);
160
- if (direct !== undefined)
161
- return direct;
162
- // `getContainingSpace` is part of the `spatialLookups()` contract every
163
- // real hierarchy carries, but several tests in this suite build a
164
- // hand-rolled partial `spatialHierarchy` mock (`byStorey`/`elementToStorey`
165
- // only) to exercise the ref/name-matching paths in isolation — guard
166
- // rather than assume every field is present.
167
- const spaceId = hierarchy.getContainingSpace?.(expressId);
168
- if (spaceId == null)
169
- return undefined;
170
- return hierarchy.elementToStorey.get(spaceId);
171
- }
172
- /** Every element `bySpace` lists for a space belonging to `storeyId` — the
173
- * bulk-prefilter twin of {@link storeyIdOf}'s one-hop space widening.
174
- * `bySpace` is absent on the same partial test mocks {@link storeyIdOf}
175
- * guards against. */
176
- function spaceElementsOfStorey(hierarchy, storeyId) {
177
- const out = [];
178
- if (!hierarchy.bySpace)
179
- return out;
180
- for (const [spaceId, elements] of hierarchy.bySpace) {
181
- if (hierarchy.elementToStorey.get(spaceId) !== storeyId)
182
- continue;
183
- for (const id of elements)
184
- out.push(id);
185
- }
186
- return out;
187
- }
188
- export function defaultStoreyName(store, expressId) {
189
- const hierarchy = store.spatialHierarchy;
190
- if (!hierarchy)
191
- return '';
192
- const storeyId = storeyIdOf(hierarchy, expressId);
193
- if (!storeyId)
194
- return '';
195
- return store.entities.getName(storeyId);
196
- }
197
- /** Does `expressId` (in `modelId`) sit in a storey ref'd by `rule.refs`?
198
- * `IfcBuildingStorey.Name` isn't unique, so once a `StoreyRule` carries
199
- * an exact (modelId, expressId) ref (mirrored from a HierarchyPanel
200
- * click), matching bypasses Name entirely. Reaches through a containing
201
- * space via {@link storeyIdOf}, same as the Name-matched path. */
202
- export function storeyMatchesRefs(store, expressId, modelId, rule) {
203
- const hierarchy = store.spatialHierarchy;
204
- const storeyId = hierarchy ? storeyIdOf(hierarchy, expressId) : undefined;
205
- return storeyId != null && !!rule.refs?.some((r) => r.modelId === modelId && r.expressId === storeyId);
206
- }
207
- /** Index-prefilter twin of {@link storeyMatchesRefs}/Name matching: the
208
- * bucket of elements a `storey op:'in'` rule narrows to for `modelId`.
209
- * Includes each matched storey's directly-contained elements AND every
210
- * element `bySpace` lists for a space belonging to that storey, so this
211
- * prefilter can never exclude a candidate the (also widened) per-entity
212
- * check in `filter-evaluate.ts` would go on to match. */
213
- export function unionByStorey(store, rule, modelId) {
214
- const hierarchy = store.spatialHierarchy;
215
- if (!hierarchy)
216
- return null;
217
- const out = [];
218
- if (rule.refs) {
219
- for (const ref of rule.refs) {
220
- if (ref.modelId !== modelId)
221
- continue;
222
- const elements = hierarchy.byStorey.get(ref.expressId);
223
- if (elements)
224
- for (const id of elements)
225
- out.push(id);
226
- for (const id of spaceElementsOfStorey(hierarchy, ref.expressId))
227
- out.push(id);
228
- }
229
- return out.length > 0 ? out : null;
230
- }
231
- const wanted = new Set(rule.values.map((n) => n.toLowerCase()));
232
- for (const storeyId of hierarchy.byStorey.keys()) {
233
- const name = store.entities.getName(storeyId);
234
- if (!wanted.has(name.toLowerCase()))
235
- continue;
236
- const elements = hierarchy.byStorey.get(storeyId);
237
- if (elements)
238
- for (const id of elements)
239
- out.push(id);
240
- for (const id of spaceElementsOfStorey(hierarchy, storeyId))
241
- out.push(id);
242
- }
243
- return out.length > 0 ? out : null;
244
- }
245
188
  // ── Material / classification / elevation resolution ─────────────────────────
246
189
  /** Collect the *individual* material names an element exposes - each layer /
247
190
  * constituent / profile material, or the single plain material - for the
@@ -1 +1 @@
1
- {"version":3,"file":"filter-match.js","sourceRoot":"","sources":["../../src/filter/filter-match.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"filter-match.js","sourceRoot":"","sources":["../../src/filter/filter-match.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,46 @@
1
+ /** Set-membership: storey, ifcType, predefinedType. */
2
+ export type SetOp = 'in' | 'notIn';
3
+ /** String comparisons (Name rule). */
4
+ export type StringOp = 'eq' | 'ne' | 'contains' | 'notContains' | 'startsWith' | 'matches' | 'notMatches';
5
+ /** Numeric comparisons (Quantity rule). */
6
+ export type NumericOp = 'eq' | 'ne' | 'gt' | 'gte' | 'lt' | 'lte';
7
+ /** Mixed string+numeric+presence ops for Property values. */
8
+ export type ValueOp = 'eq' | 'ne' | 'gt' | 'gte' | 'lt' | 'lte' | 'contains' | 'notContains' | 'startsWith' | 'endsWith' | 'matches' | 'notMatches' | 'isSet' | 'isNotSet' | 'isNonEmpty' | 'isNull' | 'isNotNull';
9
+ /** Comparison details needed when a saved Lens or List condition is
10
+ * converted to the common rule vocabulary (#5892). Defaults keep existing
11
+ * search/validation behavior. */
12
+ export interface ValueComparison {
13
+ /** Search folds case; saved Lens/List equality keeps significant case except IFC booleans. */
14
+ caseMode?: 'fold' | 'exact' | 'lensBoolean' | 'ifcBoolean';
15
+ /** Lists use Number(), while search and Lens use parseFloat() for numeric comparisons. */
16
+ numericMode?: 'prefix' | 'strict';
17
+ }
18
+ /** Classification value+presence ops. A classification is matched against
19
+ * its code / name string, so this is the StringOp comparison subset plus
20
+ * presence — numeric ops don't apply. */
21
+ export type ClassificationOp = 'eq' | 'ne' | 'contains' | 'notContains' | 'matches' | 'notMatches' | 'isSet' | 'isNotSet';
22
+ /** Top-level rule combinator. */
23
+ export type Combinator = 'AND' | 'OR';
24
+ /**
25
+ * How a rule reads one of its strings — the producer saying so, because the
26
+ * string itself cannot.
27
+ *
28
+ * `'regex'` is a regular-expression SOURCE: the WHOLE string is the pattern,
29
+ * slashes included. `'literal'` is exact text that is never a pattern, however
30
+ * it happens to be spelled. Absent means free text a human typed into a chip
31
+ * field, which keeps the Lists-panel convention (#1591): a `/body/flags`
32
+ * literal is a pattern, anything else is plain text.
33
+ *
34
+ * Guessing this back out of the text is the #4091 defect class — matched the
35
+ * wrong thing, said nothing — reappearing at the adapter seam. The selector
36
+ * grammar knows which it parsed: quoting is its ONLY escape hatch for a
37
+ * literal name, so `"/Wall/".FireRating` is the plain name `/Wall/`, and
38
+ * `Name=/\/tmp\//` is the source `/tmp/`. Sniffed for slashes, the first
39
+ * matches every `…Wall…` set and the second matches `tmp`.
40
+ *
41
+ * A property-set or property NAME has no operator beside it, so both kinds
42
+ * have to be declared. A VALUE's op already says whether it is a pattern, so
43
+ * only `'regex'` is ever recorded there.
44
+ */
45
+ export type TextKind = 'literal' | 'regex';
46
+ //# sourceMappingURL=filter-operator-types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"filter-operator-types.d.ts","sourceRoot":"","sources":["../../src/filter/filter-operator-types.ts"],"names":[],"mappings":"AAKA,uDAAuD;AACvD,MAAM,MAAM,KAAK,GAAG,IAAI,GAAG,OAAO,CAAC;AAEnC,sCAAsC;AACtC,MAAM,MAAM,QAAQ,GAChB,IAAI,GACJ,IAAI,GACJ,UAAU,GACV,aAAa,GACb,YAAY,GACZ,SAAS,GACT,YAAY,CAAC;AAEjB,2CAA2C;AAC3C,MAAM,MAAM,SAAS,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,KAAK,GAAG,IAAI,GAAG,KAAK,CAAC;AAElE,6DAA6D;AAC7D,MAAM,MAAM,OAAO,GACf,IAAI,GACJ,IAAI,GACJ,IAAI,GACJ,KAAK,GACL,IAAI,GACJ,KAAK,GACL,UAAU,GACV,aAAa,GACb,YAAY,GACZ,UAAU,GACV,SAAS,GACT,YAAY,GACZ,OAAO,GACP,UAAU,GACV,YAAY,GACZ,QAAQ,GACR,WAAW,CAAC;AAEhB;;iCAEiC;AACjC,MAAM,WAAW,eAAe;IAC9B,8FAA8F;IAC9F,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,GAAG,aAAa,GAAG,YAAY,CAAC;IAC3D,0FAA0F;IAC1F,WAAW,CAAC,EAAE,QAAQ,GAAG,QAAQ,CAAC;CACnC;AAED;;0CAE0C;AAC1C,MAAM,MAAM,gBAAgB,GACxB,IAAI,GACJ,IAAI,GACJ,UAAU,GACV,aAAa,GACb,SAAS,GACT,YAAY,GACZ,OAAO,GACP,UAAU,CAAC;AAEf,iCAAiC;AACjC,MAAM,MAAM,UAAU,GAAG,KAAK,GAAG,IAAI,CAAC;AAEtC;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,MAAM,MAAM,QAAQ,GAAG,SAAS,GAAG,OAAO,CAAC"}
@@ -0,0 +1,5 @@
1
+ /* This Source Code Form is subject to the terms of the Mozilla Public
2
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
3
+ * file, You can obtain one at https://mozilla.org/MPL/2.0/. */
4
+ export {};
5
+ //# sourceMappingURL=filter-operator-types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"filter-operator-types.js","sourceRoot":"","sources":["../../src/filter/filter-operator-types.ts"],"names":[],"mappings":"AAAA;;+DAE+D"}
@@ -1,4 +1,4 @@
1
- import type { NumericOp, SetOp, StringOp, TextKind, ValueOp } from './filter-rules.js';
1
+ import type { NumericOp, SetOp, StringOp, TextKind, ValueComparison, ValueOp } from './filter-rules.js';
2
2
  /**
3
3
  * Trailing options accepted by every op-matching function below (#5138 PR 3).
4
4
  * Omitted entirely = today's behaviour EXACTLY: search, saved filters and
@@ -86,5 +86,5 @@ export declare function numericOpMatches(op: NumericOp, candidate: number, value
86
86
  * (filter-evaluate.ts) decides them before calling here — but we still
87
87
  * accept them so the function is total.
88
88
  */
89
- export declare function valueOpMatches(op: ValueOp, psetVal: string, ruleVal: string, valueKind?: TextKind, opts?: OpMatchOptions): boolean;
89
+ export declare function valueOpMatches(op: ValueOp, psetVal: string, ruleVal: string, valueKind?: TextKind, opts?: OpMatchOptions & ValueComparison): boolean;
90
90
  //# sourceMappingURL=filter-ops.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"filter-ops.d.ts","sourceRoot":"","sources":["../../src/filter/filter-ops.ts"],"names":[],"mappings":"AAgBA,OAAO,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AAEvF;;;;;;;;GAQG;AACH,MAAM,WAAW,cAAc;IAC7B,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAgBD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkCG;AACH,wBAAgB,cAAc,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,GAAG,SAAS,GAAG,OAAO,CAIpG;AAED,wBAAgB,YAAY,CAC1B,EAAE,EAAE,KAAK,EACT,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,SAAS,MAAM,EAAE,EACzB,IAAI,CAAC,EAAE,cAAc,GACpB,OAAO,CAIT;AAED;;;;;;GAMG;AACH,wBAAgB,iBAAiB,CAAC,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,MAAM,EAAE,GAAG,OAAO,CAGlG;AAED;;;;GAIG;AACH,wBAAgB,eAAe,CAC7B,EAAE,EAAE,QAAQ,EACZ,SAAS,EAAE,MAAM,GAAG,SAAS,EAC7B,KAAK,EAAE,MAAM,EACb,SAAS,CAAC,EAAE,QAAQ,EACpB,IAAI,CAAC,EAAE,cAAc,GACpB,OAAO,CAyBT;AAED;;;;;;GAMG;AACH,wBAAgB,kBAAkB,CAChC,EAAE,EAAE,QAAQ,EACZ,UAAU,EAAE,SAAS,CAAC,MAAM,GAAG,SAAS,CAAC,EAAE,EAC3C,KAAK,EAAE,MAAM,EACb,SAAS,CAAC,EAAE,QAAQ,EACpB,IAAI,CAAC,EAAE,cAAc,GACpB,OAAO,CAeT;AAED;;;;;;;GAOG;AACH,wBAAgB,gBAAgB,CAAC,EAAE,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,cAAc,GAAG,OAAO,CAyBhH;AAED;;;;;GAKG;AACH,wBAAgB,cAAc,CAC5B,EAAE,EAAE,OAAO,EACX,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,MAAM,EACf,SAAS,CAAC,EAAE,QAAQ,EACpB,IAAI,CAAC,EAAE,cAAc,GACpB,OAAO,CAoBT"}
1
+ {"version":3,"file":"filter-ops.d.ts","sourceRoot":"","sources":["../../src/filter/filter-ops.ts"],"names":[],"mappings":"AAgBA,OAAO,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,eAAe,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AAExG;;;;;;;;GAQG;AACH,MAAM,WAAW,cAAc;IAC7B,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAgCD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkCG;AACH,wBAAgB,cAAc,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,GAAG,SAAS,GAAG,OAAO,CAIpG;AAED,wBAAgB,YAAY,CAC1B,EAAE,EAAE,KAAK,EACT,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,SAAS,MAAM,EAAE,EACzB,IAAI,CAAC,EAAE,cAAc,GACpB,OAAO,CAIT;AAED;;;;;;GAMG;AACH,wBAAgB,iBAAiB,CAAC,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,MAAM,EAAE,GAAG,OAAO,CAGlG;AAED;;;;GAIG;AACH,wBAAgB,eAAe,CAC7B,EAAE,EAAE,QAAQ,EACZ,SAAS,EAAE,MAAM,GAAG,SAAS,EAC7B,KAAK,EAAE,MAAM,EACb,SAAS,CAAC,EAAE,QAAQ,EACpB,IAAI,CAAC,EAAE,cAAc,GACpB,OAAO,CAyBT;AAED;;;;;;GAMG;AACH,wBAAgB,kBAAkB,CAChC,EAAE,EAAE,QAAQ,EACZ,UAAU,EAAE,SAAS,CAAC,MAAM,GAAG,SAAS,CAAC,EAAE,EAC3C,KAAK,EAAE,MAAM,EACb,SAAS,CAAC,EAAE,QAAQ,EACpB,IAAI,CAAC,EAAE,cAAc,GACpB,OAAO,CAeT;AAED;;;;;;;GAOG;AACH,wBAAgB,gBAAgB,CAAC,EAAE,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,cAAc,GAAG,OAAO,CAyBhH;AAED;;;;;GAKG;AACH,wBAAgB,cAAc,CAC5B,EAAE,EAAE,OAAO,EACX,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,MAAM,EACf,SAAS,CAAC,EAAE,QAAQ,EACpB,IAAI,CAAC,EAAE,cAAc,GAAG,eAAe,GACtC,OAAO,CA0BT"}