@ifc-lite/rules 0.2.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/LICENSE +373 -0
- package/README.md +45 -0
- package/dist/engine/rule-engine-chunk.d.ts +25 -0
- package/dist/engine/rule-engine-chunk.d.ts.map +1 -0
- package/dist/engine/rule-engine-chunk.js +43 -0
- package/dist/engine/rule-engine-chunk.js.map +1 -0
- package/dist/engine/rule-engine-compare.d.ts +17 -0
- package/dist/engine/rule-engine-compare.d.ts.map +1 -0
- package/dist/engine/rule-engine-compare.js +69 -0
- package/dist/engine/rule-engine-compare.js.map +1 -0
- package/dist/engine/rule-engine-requirements.d.ts +37 -0
- package/dist/engine/rule-engine-requirements.d.ts.map +1 -0
- package/dist/engine/rule-engine-requirements.js +293 -0
- package/dist/engine/rule-engine-requirements.js.map +1 -0
- package/dist/engine/rule-engine-sets.d.ts +46 -0
- package/dist/engine/rule-engine-sets.d.ts.map +1 -0
- package/dist/engine/rule-engine-sets.js +298 -0
- package/dist/engine/rule-engine-sets.js.map +1 -0
- package/dist/engine/rule-engine-unit.d.ts +23 -0
- package/dist/engine/rule-engine-unit.d.ts.map +1 -0
- package/dist/engine/rule-engine-unit.js +64 -0
- package/dist/engine/rule-engine-unit.js.map +1 -0
- package/dist/engine/rule-engine.d.ts +29 -0
- package/dist/engine/rule-engine.d.ts.map +1 -0
- package/dist/engine/rule-engine.js +244 -0
- package/dist/engine/rule-engine.js.map +1 -0
- package/dist/filter/effective-filter-fields.d.ts +13 -0
- package/dist/filter/effective-filter-fields.d.ts.map +1 -0
- package/dist/filter/effective-filter-fields.js +44 -0
- package/dist/filter/effective-filter-fields.js.map +1 -0
- package/dist/filter/entity-predefined-type.d.ts +24 -0
- package/dist/filter/entity-predefined-type.d.ts.map +1 -0
- package/dist/filter/entity-predefined-type.js +34 -0
- package/dist/filter/entity-predefined-type.js.map +1 -0
- package/dist/filter/filter-evaluate-groups.d.ts +36 -0
- package/dist/filter/filter-evaluate-groups.d.ts.map +1 -0
- package/dist/filter/filter-evaluate-groups.js +111 -0
- package/dist/filter/filter-evaluate-groups.js.map +1 -0
- package/dist/filter/filter-evaluate-model-tag.d.ts +22 -0
- package/dist/filter/filter-evaluate-model-tag.d.ts.map +1 -0
- package/dist/filter/filter-evaluate-model-tag.js +35 -0
- package/dist/filter/filter-evaluate-model-tag.js.map +1 -0
- package/dist/filter/filter-evaluate-mutations.d.ts +51 -0
- package/dist/filter/filter-evaluate-mutations.d.ts.map +1 -0
- package/dist/filter/filter-evaluate-mutations.js +111 -0
- package/dist/filter/filter-evaluate-mutations.js.map +1 -0
- package/dist/filter/filter-evaluate-yield.d.ts +9 -0
- package/dist/filter/filter-evaluate-yield.d.ts.map +1 -0
- package/dist/filter/filter-evaluate-yield.js +32 -0
- package/dist/filter/filter-evaluate-yield.js.map +1 -0
- package/dist/filter/filter-evaluate.d.ts +120 -0
- package/dist/filter/filter-evaluate.d.ts.map +1 -0
- package/dist/filter/filter-evaluate.js +408 -0
- package/dist/filter/filter-evaluate.js.map +1 -0
- package/dist/filter/filter-group-rule.d.ts +23 -0
- package/dist/filter/filter-group-rule.d.ts.map +1 -0
- package/dist/filter/filter-group-rule.js +69 -0
- package/dist/filter/filter-group-rule.js.map +1 -0
- package/dist/filter/filter-groups.d.ts +65 -0
- package/dist/filter/filter-groups.d.ts.map +1 -0
- package/dist/filter/filter-groups.js +136 -0
- package/dist/filter/filter-groups.js.map +1 -0
- package/dist/filter/filter-iteration-source.d.ts +26 -0
- package/dist/filter/filter-iteration-source.d.ts.map +1 -0
- package/dist/filter/filter-iteration-source.js +154 -0
- package/dist/filter/filter-iteration-source.js.map +1 -0
- package/dist/filter/filter-iteration.d.ts +5 -0
- package/dist/filter/filter-iteration.d.ts.map +1 -0
- package/dist/filter/filter-iteration.js +25 -0
- package/dist/filter/filter-iteration.js.map +1 -0
- package/dist/filter/filter-match.d.ts +114 -0
- package/dist/filter/filter-match.d.ts.map +1 -0
- package/dist/filter/filter-match.js +302 -0
- package/dist/filter/filter-match.js.map +1 -0
- package/dist/filter/filter-ops.d.ts +90 -0
- package/dist/filter/filter-ops.d.ts.map +1 -0
- package/dist/filter/filter-ops.js +202 -0
- package/dist/filter/filter-ops.js.map +1 -0
- package/dist/filter/filter-rule-guards.d.ts +4 -0
- package/dist/filter/filter-rule-guards.d.ts.map +1 -0
- package/dist/filter/filter-rule-guards.js +74 -0
- package/dist/filter/filter-rule-guards.js.map +1 -0
- package/dist/filter/filter-rules.d.ts +275 -0
- package/dist/filter/filter-rules.d.ts.map +1 -0
- package/dist/filter/filter-rules.js +68 -0
- package/dist/filter/filter-rules.js.map +1 -0
- package/dist/filter/lens-material-names.d.ts +13 -0
- package/dist/filter/lens-material-names.d.ts.map +1 -0
- package/dist/filter/lens-material-names.js +36 -0
- package/dist/filter/lens-material-names.js.map +1 -0
- package/dist/filter/measure-units.d.ts +29 -0
- package/dist/filter/measure-units.d.ts.map +1 -0
- package/dist/filter/measure-units.js +72 -0
- package/dist/filter/measure-units.js.map +1 -0
- package/dist/filter/model-tag.d.ts +65 -0
- package/dist/filter/model-tag.d.ts.map +1 -0
- package/dist/filter/model-tag.js +57 -0
- package/dist/filter/model-tag.js.map +1 -0
- package/dist/filter/read-measure-subject.d.ts +28 -0
- package/dist/filter/read-measure-subject.d.ts.map +1 -0
- package/dist/filter/read-measure-subject.js +116 -0
- package/dist/filter/read-measure-subject.js.map +1 -0
- package/dist/filter/read-subject.d.ts +72 -0
- package/dist/filter/read-subject.d.ts.map +1 -0
- package/dist/filter/read-subject.js +128 -0
- package/dist/filter/read-subject.js.map +1 -0
- package/dist/filter/subject-match.d.ts +27 -0
- package/dist/filter/subject-match.d.ts.map +1 -0
- package/dist/filter/subject-match.js +52 -0
- package/dist/filter/subject-match.js.map +1 -0
- package/dist/filter/subject-read-options.d.ts +33 -0
- package/dist/filter/subject-read-options.d.ts.map +1 -0
- package/dist/filter/subject-read-options.js +8 -0
- package/dist/filter/subject-read-options.js.map +1 -0
- package/dist/ids/ids-facet-to-rules.d.ts +20 -0
- package/dist/ids/ids-facet-to-rules.d.ts.map +1 -0
- package/dist/ids/ids-facet-to-rules.js +230 -0
- package/dist/ids/ids-facet-to-rules.js.map +1 -0
- package/dist/ids/ids-regex.d.ts +44 -0
- package/dist/ids/ids-regex.d.ts.map +1 -0
- package/dist/ids/ids-regex.js +334 -0
- package/dist/ids/ids-regex.js.map +1 -0
- package/dist/ids/ids-to-rule-set.d.ts +39 -0
- package/dist/ids/ids-to-rule-set.d.ts.map +1 -0
- package/dist/ids/ids-to-rule-set.js +103 -0
- package/dist/ids/ids-to-rule-set.js.map +1 -0
- package/dist/ids/ids-xml-writer.d.ts +11 -0
- package/dist/ids/ids-xml-writer.d.ts.map +1 -0
- package/dist/ids/ids-xml-writer.js +172 -0
- package/dist/ids/ids-xml-writer.js.map +1 -0
- package/dist/ids/rule-set-to-ids.d.ts +45 -0
- package/dist/ids/rule-set-to-ids.d.ts.map +1 -0
- package/dist/ids/rule-set-to-ids.js +140 -0
- package/dist/ids/rule-set-to-ids.js.map +1 -0
- package/dist/ids/rule-to-ids-facets.d.ts +52 -0
- package/dist/ids/rule-to-ids-facets.d.ts.map +1 -0
- package/dist/ids/rule-to-ids-facets.js +291 -0
- package/dist/ids/rule-to-ids-facets.js.map +1 -0
- package/dist/ids/stored-unit-scale.d.ts +15 -0
- package/dist/ids/stored-unit-scale.d.ts.map +1 -0
- package/dist/ids/stored-unit-scale.js +64 -0
- package/dist/ids/stored-unit-scale.js.map +1 -0
- package/dist/index.d.ts +39 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +46 -0
- package/dist/index.js.map +1 -0
- package/dist/rule-set/between-chip.d.ts +54 -0
- package/dist/rule-set/between-chip.d.ts.map +1 -0
- package/dist/rule-set/between-chip.js +95 -0
- package/dist/rule-set/between-chip.js.map +1 -0
- package/dist/rule-set/requirement-invariants.d.ts +25 -0
- package/dist/rule-set/requirement-invariants.d.ts.map +1 -0
- package/dist/rule-set/requirement-invariants.js +29 -0
- package/dist/rule-set/requirement-invariants.js.map +1 -0
- package/dist/rule-set/requirement-text.d.ts +20 -0
- package/dist/rule-set/requirement-text.d.ts.map +1 -0
- package/dist/rule-set/requirement-text.js +179 -0
- package/dist/rule-set/requirement-text.js.map +1 -0
- package/dist/rule-set/rule-set-io-requirement.d.ts +22 -0
- package/dist/rule-set/rule-set-io-requirement.d.ts.map +1 -0
- package/dist/rule-set/rule-set-io-requirement.js +140 -0
- package/dist/rule-set/rule-set-io-requirement.js.map +1 -0
- package/dist/rule-set/rule-set-io-shared.d.ts +24 -0
- package/dist/rule-set/rule-set-io-shared.d.ts.map +1 -0
- package/dist/rule-set/rule-set-io-shared.js +48 -0
- package/dist/rule-set/rule-set-io-shared.js.map +1 -0
- package/dist/rule-set/rule-set-io-subject.d.ts +10 -0
- package/dist/rule-set/rule-set-io-subject.d.ts.map +1 -0
- package/dist/rule-set/rule-set-io-subject.js +67 -0
- package/dist/rule-set/rule-set-io-subject.js.map +1 -0
- package/dist/rule-set/rule-set-io.d.ts +37 -0
- package/dist/rule-set/rule-set-io.d.ts.map +1 -0
- package/dist/rule-set/rule-set-io.js +142 -0
- package/dist/rule-set/rule-set-io.js.map +1 -0
- package/dist/rule-set/rule-set.d.ts +109 -0
- package/dist/rule-set/rule-set.d.ts.map +1 -0
- package/dist/rule-set/rule-set.js +5 -0
- package/dist/rule-set/rule-set.js.map +1 -0
- package/package.json +59 -0
|
@@ -0,0 +1,8 @@
|
|
|
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
|
+
/** Whether `rule` has to be matched through the subject reader. */
|
|
5
|
+
export function readsThroughSubject(rule) {
|
|
6
|
+
return rule.valueUnit !== undefined || rule.inherit !== undefined;
|
|
7
|
+
}
|
|
8
|
+
//# sourceMappingURL=subject-read-options.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"subject-read-options.js","sourceRoot":"","sources":["../../src/filter/subject-read-options.ts"],"names":[],"mappings":"AAAA;;+DAE+D;AAkC/D,mEAAmE;AACnE,MAAM,UAAU,mBAAmB,CAAC,IAAwB;IAC1D,OAAO,IAAI,CAAC,SAAS,KAAK,SAAS,IAAI,IAAI,CAAC,OAAO,KAAK,SAAS,CAAC;AACpE,CAAC"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* One IDS facet → the `FilterRule`s that check exactly the same thing, or
|
|
3
|
+
* the reason it has none (#5225). Used by `ids-to-rule-set.ts` for the
|
|
4
|
+
* facets of both applicability and (required) requirements.
|
|
5
|
+
*/
|
|
6
|
+
import type { IDSFacet } from '@ifc-lite/ids';
|
|
7
|
+
import type { FilterRule } from '../filter/filter-rules.js';
|
|
8
|
+
export type FacetRules = {
|
|
9
|
+
ok: true;
|
|
10
|
+
rules: FilterRule[];
|
|
11
|
+
dropped?: string[];
|
|
12
|
+
} | {
|
|
13
|
+
ok: false;
|
|
14
|
+
reason: string;
|
|
15
|
+
};
|
|
16
|
+
type Role = 'applicability' | 'requirement';
|
|
17
|
+
/** Map one facet. `role` matters only for the entity facet and GlobalId. */
|
|
18
|
+
export declare function facetToRules(facet: IDSFacet, role: Role): FacetRules;
|
|
19
|
+
export {};
|
|
20
|
+
//# sourceMappingURL=ids-facet-to-rules.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ids-facet-to-rules.d.ts","sourceRoot":"","sources":["../../src/ids/ids-facet-to-rules.ts"],"names":[],"mappings":"AAIA;;;;GAIG;AAEH,OAAO,KAAK,EAAiB,QAAQ,EAAE,MAAM,eAAe,CAAC;AAE7D,OAAO,KAAK,EAAE,UAAU,EAAuB,MAAM,2BAA2B,CAAC;AAIjF,MAAM,MAAM,UAAU,GAClB;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,KAAK,EAAE,UAAU,EAAE,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,EAAE,CAAA;CAAE,GACrD;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC;AASlC,KAAK,IAAI,GAAG,eAAe,GAAG,aAAa,CAAC;AA8K5C,4EAA4E;AAC5E,wBAAgB,YAAY,CAAC,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAE,IAAI,GAAG,UAAU,CA4BpE"}
|
|
@@ -0,0 +1,230 @@
|
|
|
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
|
+
import { normalizeIfcTypeName } from '@ifc-lite/parser';
|
|
5
|
+
import { Rule } from '../filter/filter-rules.js';
|
|
6
|
+
import { idsPatternToJsRegex } from './ids-regex.js';
|
|
7
|
+
/**
|
|
8
|
+
* IDS states measure values in SI units, so every imported numeric property
|
|
9
|
+
* and quantity check compares in SI (`valueUnit: 'si'`): the engine converts
|
|
10
|
+
* each value with its own unit before comparing (#5225 decision).
|
|
11
|
+
*/
|
|
12
|
+
const SI = { valueUnit: 'si' };
|
|
13
|
+
/** JS-escape `text` so it matches only itself inside a regex. */
|
|
14
|
+
function escapeJs(text) {
|
|
15
|
+
return text.replace(/[\\^$.*+?()[\]{}|/-]/g, '\\$&');
|
|
16
|
+
}
|
|
17
|
+
function describe(c) {
|
|
18
|
+
return c.type === 'simpleValue' ? `"${c.value}"` : `a ${c.type} restriction`;
|
|
19
|
+
}
|
|
20
|
+
/** Anything a single-family constraint does not cover blocks the facet. */
|
|
21
|
+
function compound(c) {
|
|
22
|
+
return c.type !== 'simpleValue' && !!c.and && c.and.length > 0;
|
|
23
|
+
}
|
|
24
|
+
function textOperand(c) {
|
|
25
|
+
if (compound(c))
|
|
26
|
+
return 'a restriction combining several facets has no rule equivalent';
|
|
27
|
+
switch (c.type) {
|
|
28
|
+
case 'simpleValue':
|
|
29
|
+
return { op: 'eq', value: c.value };
|
|
30
|
+
case 'pattern': {
|
|
31
|
+
const converted = idsPatternToJsRegex(c.pattern);
|
|
32
|
+
return converted.ok ? { op: 'matches', value: converted.pattern } : `pattern "${c.pattern}": ${converted.reason}`;
|
|
33
|
+
}
|
|
34
|
+
case 'enumeration': {
|
|
35
|
+
if (c.values.length === 0)
|
|
36
|
+
return 'an empty enumeration matches nothing';
|
|
37
|
+
if (c.base && c.base !== 'xs:string') {
|
|
38
|
+
return `an enumeration of ${c.base} values compares numbers, which a text rule cannot`;
|
|
39
|
+
}
|
|
40
|
+
if (c.values.length === 1)
|
|
41
|
+
return { op: 'eq', value: c.values[0] };
|
|
42
|
+
return { op: 'matches', value: `/^(?:${c.values.map(escapeJs).join('|')})$/u` };
|
|
43
|
+
}
|
|
44
|
+
case 'bounds':
|
|
45
|
+
return 'a numeric bound on a name has no rule equivalent';
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
/** Numeric bounds → `gt`/`gte`/`lt`/`lte` pairs, or why not. */
|
|
49
|
+
function numericOps(c) {
|
|
50
|
+
if (c.type !== 'bounds')
|
|
51
|
+
return 'not a numeric bound';
|
|
52
|
+
if (compound(c))
|
|
53
|
+
return 'a restriction combining several facets has no rule equivalent';
|
|
54
|
+
const lengthLike = [c.length, c.minLength, c.maxLength, c.totalDigits, c.fractionDigits];
|
|
55
|
+
if (lengthLike.some((v) => v !== undefined))
|
|
56
|
+
return 'length and digit restrictions have no rule equivalent';
|
|
57
|
+
const bounds = [c.minInclusive, c.minExclusive, c.maxInclusive, c.maxExclusive];
|
|
58
|
+
if (bounds.some((v) => v !== undefined && !Number.isFinite(v)))
|
|
59
|
+
return 'a bound that is not a finite number';
|
|
60
|
+
const ops = [];
|
|
61
|
+
if (c.minInclusive !== undefined)
|
|
62
|
+
ops.push({ op: 'gte', value: c.minInclusive });
|
|
63
|
+
if (c.minExclusive !== undefined)
|
|
64
|
+
ops.push({ op: 'gt', value: c.minExclusive });
|
|
65
|
+
if (c.maxInclusive !== undefined)
|
|
66
|
+
ops.push({ op: 'lte', value: c.maxInclusive });
|
|
67
|
+
if (c.maxExclusive !== undefined)
|
|
68
|
+
ops.push({ op: 'lt', value: c.maxExclusive });
|
|
69
|
+
return ops.length > 0 ? ops : 'an empty bound';
|
|
70
|
+
}
|
|
71
|
+
/** Set/property NAME: literal text, or a regex literal (read by `nameMatches`). */
|
|
72
|
+
function nameOperand(c, what) {
|
|
73
|
+
if (c.type === 'simpleValue')
|
|
74
|
+
return { name: c.value, kind: 'literal' };
|
|
75
|
+
if (c.type === 'pattern') {
|
|
76
|
+
const operand = textOperand(c);
|
|
77
|
+
return typeof operand === 'string' ? `${what}: ${operand}` : { name: operand.value };
|
|
78
|
+
}
|
|
79
|
+
return `${what} given as ${describe(c)} has no rule equivalent`;
|
|
80
|
+
}
|
|
81
|
+
/** Values for an `in` rule (`ifcType`, `predefinedType`, `globalId`). */
|
|
82
|
+
function setValues(c, what) {
|
|
83
|
+
if (compound(c))
|
|
84
|
+
return `${what}: a restriction combining several facets has no rule equivalent`;
|
|
85
|
+
if (c.type === 'simpleValue')
|
|
86
|
+
return [c.value];
|
|
87
|
+
if (c.type === 'enumeration' && c.values.length > 0) {
|
|
88
|
+
if (c.base && c.base !== 'xs:string')
|
|
89
|
+
return `${what}: an enumeration of ${c.base} values has no rule equivalent`;
|
|
90
|
+
return [...c.values];
|
|
91
|
+
}
|
|
92
|
+
return `${what} given as ${describe(c)} has no rule equivalent`;
|
|
93
|
+
}
|
|
94
|
+
function entityRules(facet, role) {
|
|
95
|
+
if (role === 'requirement') {
|
|
96
|
+
return { ok: false, reason: 'an entity facet in the requirements is exact-class, which a rule requirement cannot express' };
|
|
97
|
+
}
|
|
98
|
+
const names = setValues(facet.name, 'entity name');
|
|
99
|
+
if (typeof names === 'string')
|
|
100
|
+
return { ok: false, reason: names };
|
|
101
|
+
const rules = [{ kind: 'ifcType', op: 'in', values: names.map(normalizeIfcTypeName), exactClass: true }];
|
|
102
|
+
if (facet.predefinedType) {
|
|
103
|
+
const types = setValues(facet.predefinedType, 'predefinedType');
|
|
104
|
+
if (typeof types === 'string')
|
|
105
|
+
return { ok: false, reason: types };
|
|
106
|
+
rules.push(Rule.predefinedType(types, 'in'));
|
|
107
|
+
}
|
|
108
|
+
return { ok: true, rules };
|
|
109
|
+
}
|
|
110
|
+
function attributeRules(facet, role) {
|
|
111
|
+
if (facet.name.type !== 'simpleValue') {
|
|
112
|
+
return { ok: false, reason: `an attribute name given as ${describe(facet.name)} has no rule equivalent` };
|
|
113
|
+
}
|
|
114
|
+
const name = facet.name.value;
|
|
115
|
+
if (name === 'GlobalId' || name === 'PredefinedType') {
|
|
116
|
+
if (name === 'GlobalId' && role === 'requirement') {
|
|
117
|
+
return { ok: false, reason: 'a GlobalId requirement has no rule equivalent (GlobalId only selects elements)' };
|
|
118
|
+
}
|
|
119
|
+
if (!facet.value)
|
|
120
|
+
return { ok: false, reason: `a presence check on ${name} has no rule equivalent` };
|
|
121
|
+
const values = setValues(facet.value, name);
|
|
122
|
+
if (typeof values === 'string')
|
|
123
|
+
return { ok: false, reason: values };
|
|
124
|
+
return { ok: true, rules: [name === 'GlobalId' ? Rule.globalId(values, 'in') : Rule.predefinedType(values, 'in')] };
|
|
125
|
+
}
|
|
126
|
+
if (!facet.value)
|
|
127
|
+
return { ok: true, rules: [Rule.attribute(name, 'isSet', '')] };
|
|
128
|
+
if (facet.value.type === 'bounds') {
|
|
129
|
+
const ops = numericOps(facet.value);
|
|
130
|
+
if (typeof ops === 'string')
|
|
131
|
+
return { ok: false, reason: `${name}: ${ops}` };
|
|
132
|
+
return { ok: true, rules: ops.map(({ op, value }) => Rule.attribute(name, op, String(value))) };
|
|
133
|
+
}
|
|
134
|
+
const operand = textOperand(facet.value);
|
|
135
|
+
if (typeof operand === 'string')
|
|
136
|
+
return { ok: false, reason: `${name}: ${operand}` };
|
|
137
|
+
return { ok: true, rules: [Rule.attribute(name, operand.op, operand.value)] };
|
|
138
|
+
}
|
|
139
|
+
function propertyRules(facet) {
|
|
140
|
+
const result = propertyRulesIgnoringDataType(facet);
|
|
141
|
+
if (!result.ok || !facet.dataType)
|
|
142
|
+
return result;
|
|
143
|
+
// Maintainer decision on #5225: a dataType is dropped, never a reason to
|
|
144
|
+
// refuse the facet; the rule vocabulary has no data-type check. Each
|
|
145
|
+
// dropped one is reported, so the loss is visible.
|
|
146
|
+
const dataType = facet.dataType.type === 'simpleValue' ? facet.dataType.value : describe(facet.dataType);
|
|
147
|
+
const set = facet.propertySet.type === 'simpleValue' ? facet.propertySet.value : describe(facet.propertySet);
|
|
148
|
+
const base = facet.baseName.type === 'simpleValue' ? facet.baseName.value : describe(facet.baseName);
|
|
149
|
+
return { ...result, dropped: [`${set}.${base}: data type ${dataType} not checked`] };
|
|
150
|
+
}
|
|
151
|
+
function propertyRulesIgnoringDataType(facet) {
|
|
152
|
+
const set = nameOperand(facet.propertySet, 'propertySet');
|
|
153
|
+
if (typeof set === 'string')
|
|
154
|
+
return { ok: false, reason: set };
|
|
155
|
+
const base = nameOperand(facet.baseName, 'baseName');
|
|
156
|
+
if (typeof base === 'string')
|
|
157
|
+
return { ok: false, reason: base };
|
|
158
|
+
const kinds = {
|
|
159
|
+
...(set.kind ? { setNameKind: set.kind } : {}),
|
|
160
|
+
...(base.kind ? { propertyNameKind: base.kind } : {}),
|
|
161
|
+
};
|
|
162
|
+
const label = `${set.name}.${base.name}`;
|
|
163
|
+
// `Qto_` is IFC's reserved prefix for quantity sets, which the rule
|
|
164
|
+
// engine reads through the `quantity` subject, not `property`.
|
|
165
|
+
if (set.kind === 'literal' && set.name.startsWith('Qto_')) {
|
|
166
|
+
const qtyKinds = { setNameKind: set.kind, ...(base.kind ? { quantityNameKind: base.kind } : {}) };
|
|
167
|
+
if (!facet.value)
|
|
168
|
+
return { ok: false, reason: `${label}: a quantity presence check has no rule equivalent` };
|
|
169
|
+
if (facet.value.type === 'simpleValue') {
|
|
170
|
+
const text = facet.value.value.trim();
|
|
171
|
+
const n = Number(text);
|
|
172
|
+
if (text === '' || !Number.isFinite(n))
|
|
173
|
+
return { ok: false, reason: `${label}: "${facet.value.value}" is not a number` };
|
|
174
|
+
return { ok: true, rules: [{ ...Rule.quantity(set.name, base.name, 'eq', n, qtyKinds), ...SI }] };
|
|
175
|
+
}
|
|
176
|
+
const ops = numericOps(facet.value);
|
|
177
|
+
if (typeof ops === 'string')
|
|
178
|
+
return { ok: false, reason: `${label}: ${ops}` };
|
|
179
|
+
return { ok: true, rules: ops.map(({ op, value }) => ({ ...Rule.quantity(set.name, base.name, op, value, qtyKinds), ...SI })) };
|
|
180
|
+
}
|
|
181
|
+
if (!facet.value)
|
|
182
|
+
return { ok: true, rules: [Rule.property(set.name, base.name, 'isSet', '', kinds)] };
|
|
183
|
+
if (facet.value.type === 'bounds') {
|
|
184
|
+
const ops = numericOps(facet.value);
|
|
185
|
+
if (typeof ops === 'string')
|
|
186
|
+
return { ok: false, reason: `${label}: ${ops}` };
|
|
187
|
+
return { ok: true, rules: ops.map(({ op, value }) => ({ ...Rule.property(set.name, base.name, op, String(value), kinds), ...SI })) };
|
|
188
|
+
}
|
|
189
|
+
const operand = textOperand(facet.value);
|
|
190
|
+
if (typeof operand === 'string')
|
|
191
|
+
return { ok: false, reason: `${label}: ${operand}` };
|
|
192
|
+
// A numeric simple value compares numerically, so in SI like a bound;
|
|
193
|
+
// on a label property the value has no unit and SI changes nothing.
|
|
194
|
+
const numeric = operand.op === 'eq' && operand.value.trim() !== '' && Number.isFinite(Number(operand.value));
|
|
195
|
+
const rule = Rule.property(set.name, base.name, operand.op, operand.value, kinds);
|
|
196
|
+
return { ok: true, rules: [numeric ? { ...rule, ...SI } : rule] };
|
|
197
|
+
}
|
|
198
|
+
/** Map one facet. `role` matters only for the entity facet and GlobalId. */
|
|
199
|
+
export function facetToRules(facet, role) {
|
|
200
|
+
switch (facet.type) {
|
|
201
|
+
case 'entity':
|
|
202
|
+
return entityRules(facet, role);
|
|
203
|
+
case 'attribute':
|
|
204
|
+
return attributeRules(facet, role);
|
|
205
|
+
case 'property':
|
|
206
|
+
return propertyRules(facet);
|
|
207
|
+
case 'classification': {
|
|
208
|
+
if (facet.value) {
|
|
209
|
+
return { ok: false, reason: 'a classification code check matches the code only; the rule matches a code OR a name' };
|
|
210
|
+
}
|
|
211
|
+
if (facet.system && facet.system.type !== 'simpleValue') {
|
|
212
|
+
return { ok: false, reason: `a classification system given as ${describe(facet.system)} has no rule equivalent` };
|
|
213
|
+
}
|
|
214
|
+
return { ok: true, rules: [Rule.classification(facet.system?.value ?? '', 'isSet', '')] };
|
|
215
|
+
}
|
|
216
|
+
case 'material': {
|
|
217
|
+
// No material presence operator exists; any non-empty material name
|
|
218
|
+
// is the same check (and `ruleSetToIds` exports it back as presence).
|
|
219
|
+
if (!facet.value)
|
|
220
|
+
return { ok: true, rules: [Rule.material('matches', '.', 'regex')] };
|
|
221
|
+
const operand = textOperand(facet.value);
|
|
222
|
+
if (typeof operand === 'string')
|
|
223
|
+
return { ok: false, reason: `material: ${operand}` };
|
|
224
|
+
return { ok: true, rules: [Rule.material(operand.op, operand.value)] };
|
|
225
|
+
}
|
|
226
|
+
case 'partOf':
|
|
227
|
+
return { ok: false, reason: 'a partOf facet (containment, aggregation, …) has no rule equivalent' };
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
//# sourceMappingURL=ids-facet-to-rules.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ids-facet-to-rules.js","sourceRoot":"","sources":["../../src/ids/ids-facet-to-rules.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
export type RegexConversion = {
|
|
2
|
+
ok: true;
|
|
3
|
+
pattern: string;
|
|
4
|
+
} | {
|
|
5
|
+
ok: false;
|
|
6
|
+
reason: string;
|
|
7
|
+
};
|
|
8
|
+
/** `text` as an XSD regex matching exactly that text. */
|
|
9
|
+
export declare function escapeXsdLiteral(text: string): string;
|
|
10
|
+
/** A JS regex as the engine reads it: the source plus its flags. */
|
|
11
|
+
export interface JsRegex {
|
|
12
|
+
source: string;
|
|
13
|
+
flags: string;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* The regex a `matches` operand stands for, following `regexOpMatches`:
|
|
17
|
+
* `valueKind: 'regex'` means the whole string is the source; no kind means
|
|
18
|
+
* a `/body/flags` literal is a pattern and anything else is a bare source.
|
|
19
|
+
*/
|
|
20
|
+
export declare function jsRegexOf(value: string, valueKind: 'regex' | 'literal' | undefined): JsRegex;
|
|
21
|
+
/**
|
|
22
|
+
* Whether `regex` can read a character outside the Basic Multilingual Plane
|
|
23
|
+
* (an emoji, rare CJK) differently from its IDS pattern. Without the `u`
|
|
24
|
+
* flag JavaScript sees such a character as two UTF-16 code units, so `.`,
|
|
25
|
+
* a negated class `[^…]` or `\D` can match half of it, while an XSD pattern
|
|
26
|
+
* always works on whole characters. Every other construct the translation
|
|
27
|
+
* accepts means the same in both dialects.
|
|
28
|
+
*/
|
|
29
|
+
export declare function hasAstralCaveat(regex: JsRegex): boolean;
|
|
30
|
+
/**
|
|
31
|
+
* Translate the engine's unanchored JS regex into an IDS pattern that
|
|
32
|
+
* accepts exactly the same values. `^…$` anchors (or the `^(?:…)$` wrapper
|
|
33
|
+
* `idsPatternToJsRegex` produces) become the XSD pattern's implicit whole-
|
|
34
|
+
* value match; an unanchored side becomes `.*`.
|
|
35
|
+
*/
|
|
36
|
+
export declare function jsRegexToIdsPattern(regex: JsRegex): RegexConversion;
|
|
37
|
+
/**
|
|
38
|
+
* Translate an IDS pattern into the rule operand that accepts the same
|
|
39
|
+
* values: a `/^(?:…)$/u` literal (the `u` flag because XSD's `\d`, `\i`,
|
|
40
|
+
* `\c` and `\w` translate to Unicode property escapes). XSD's `^` and `$`
|
|
41
|
+
* are ordinary characters, so they are escaped first.
|
|
42
|
+
*/
|
|
43
|
+
export declare function idsPatternToJsRegex(xsd: string): RegexConversion;
|
|
44
|
+
//# sourceMappingURL=ids-regex.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ids-regex.d.ts","sourceRoot":"","sources":["../../src/ids/ids-regex.ts"],"names":[],"mappings":"AAkBA,MAAM,MAAM,eAAe,GACvB;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GAC7B;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC;AAKlC,yDAAyD;AACzD,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAIrD;AAED,oEAAoE;AACpE,MAAM,WAAW,OAAO;IACtB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;CACf;AAED;;;;GAIG;AACH,wBAAgB,SAAS,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,GAAG,SAAS,GAAG,SAAS,GAAG,OAAO,CAM5F;AAED;;;;;;;GAOG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAmBvD;AA2HD;;;;;GAKG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,OAAO,GAAG,eAAe,CAoCnE;AAED;;;;;GAKG;AACH,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,MAAM,GAAG,eAAe,CAyBhE"}
|