@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.
Files changed (179) hide show
  1. package/LICENSE +373 -0
  2. package/README.md +45 -0
  3. package/dist/engine/rule-engine-chunk.d.ts +25 -0
  4. package/dist/engine/rule-engine-chunk.d.ts.map +1 -0
  5. package/dist/engine/rule-engine-chunk.js +43 -0
  6. package/dist/engine/rule-engine-chunk.js.map +1 -0
  7. package/dist/engine/rule-engine-compare.d.ts +17 -0
  8. package/dist/engine/rule-engine-compare.d.ts.map +1 -0
  9. package/dist/engine/rule-engine-compare.js +69 -0
  10. package/dist/engine/rule-engine-compare.js.map +1 -0
  11. package/dist/engine/rule-engine-requirements.d.ts +37 -0
  12. package/dist/engine/rule-engine-requirements.d.ts.map +1 -0
  13. package/dist/engine/rule-engine-requirements.js +293 -0
  14. package/dist/engine/rule-engine-requirements.js.map +1 -0
  15. package/dist/engine/rule-engine-sets.d.ts +46 -0
  16. package/dist/engine/rule-engine-sets.d.ts.map +1 -0
  17. package/dist/engine/rule-engine-sets.js +298 -0
  18. package/dist/engine/rule-engine-sets.js.map +1 -0
  19. package/dist/engine/rule-engine-unit.d.ts +23 -0
  20. package/dist/engine/rule-engine-unit.d.ts.map +1 -0
  21. package/dist/engine/rule-engine-unit.js +64 -0
  22. package/dist/engine/rule-engine-unit.js.map +1 -0
  23. package/dist/engine/rule-engine.d.ts +29 -0
  24. package/dist/engine/rule-engine.d.ts.map +1 -0
  25. package/dist/engine/rule-engine.js +244 -0
  26. package/dist/engine/rule-engine.js.map +1 -0
  27. package/dist/filter/effective-filter-fields.d.ts +13 -0
  28. package/dist/filter/effective-filter-fields.d.ts.map +1 -0
  29. package/dist/filter/effective-filter-fields.js +44 -0
  30. package/dist/filter/effective-filter-fields.js.map +1 -0
  31. package/dist/filter/entity-predefined-type.d.ts +24 -0
  32. package/dist/filter/entity-predefined-type.d.ts.map +1 -0
  33. package/dist/filter/entity-predefined-type.js +34 -0
  34. package/dist/filter/entity-predefined-type.js.map +1 -0
  35. package/dist/filter/filter-evaluate-groups.d.ts +36 -0
  36. package/dist/filter/filter-evaluate-groups.d.ts.map +1 -0
  37. package/dist/filter/filter-evaluate-groups.js +111 -0
  38. package/dist/filter/filter-evaluate-groups.js.map +1 -0
  39. package/dist/filter/filter-evaluate-model-tag.d.ts +22 -0
  40. package/dist/filter/filter-evaluate-model-tag.d.ts.map +1 -0
  41. package/dist/filter/filter-evaluate-model-tag.js +35 -0
  42. package/dist/filter/filter-evaluate-model-tag.js.map +1 -0
  43. package/dist/filter/filter-evaluate-mutations.d.ts +51 -0
  44. package/dist/filter/filter-evaluate-mutations.d.ts.map +1 -0
  45. package/dist/filter/filter-evaluate-mutations.js +111 -0
  46. package/dist/filter/filter-evaluate-mutations.js.map +1 -0
  47. package/dist/filter/filter-evaluate-yield.d.ts +9 -0
  48. package/dist/filter/filter-evaluate-yield.d.ts.map +1 -0
  49. package/dist/filter/filter-evaluate-yield.js +32 -0
  50. package/dist/filter/filter-evaluate-yield.js.map +1 -0
  51. package/dist/filter/filter-evaluate.d.ts +120 -0
  52. package/dist/filter/filter-evaluate.d.ts.map +1 -0
  53. package/dist/filter/filter-evaluate.js +408 -0
  54. package/dist/filter/filter-evaluate.js.map +1 -0
  55. package/dist/filter/filter-group-rule.d.ts +23 -0
  56. package/dist/filter/filter-group-rule.d.ts.map +1 -0
  57. package/dist/filter/filter-group-rule.js +69 -0
  58. package/dist/filter/filter-group-rule.js.map +1 -0
  59. package/dist/filter/filter-groups.d.ts +65 -0
  60. package/dist/filter/filter-groups.d.ts.map +1 -0
  61. package/dist/filter/filter-groups.js +136 -0
  62. package/dist/filter/filter-groups.js.map +1 -0
  63. package/dist/filter/filter-iteration-source.d.ts +26 -0
  64. package/dist/filter/filter-iteration-source.d.ts.map +1 -0
  65. package/dist/filter/filter-iteration-source.js +154 -0
  66. package/dist/filter/filter-iteration-source.js.map +1 -0
  67. package/dist/filter/filter-iteration.d.ts +5 -0
  68. package/dist/filter/filter-iteration.d.ts.map +1 -0
  69. package/dist/filter/filter-iteration.js +25 -0
  70. package/dist/filter/filter-iteration.js.map +1 -0
  71. package/dist/filter/filter-match.d.ts +114 -0
  72. package/dist/filter/filter-match.d.ts.map +1 -0
  73. package/dist/filter/filter-match.js +302 -0
  74. package/dist/filter/filter-match.js.map +1 -0
  75. package/dist/filter/filter-ops.d.ts +90 -0
  76. package/dist/filter/filter-ops.d.ts.map +1 -0
  77. package/dist/filter/filter-ops.js +202 -0
  78. package/dist/filter/filter-ops.js.map +1 -0
  79. package/dist/filter/filter-rule-guards.d.ts +4 -0
  80. package/dist/filter/filter-rule-guards.d.ts.map +1 -0
  81. package/dist/filter/filter-rule-guards.js +74 -0
  82. package/dist/filter/filter-rule-guards.js.map +1 -0
  83. package/dist/filter/filter-rules.d.ts +275 -0
  84. package/dist/filter/filter-rules.d.ts.map +1 -0
  85. package/dist/filter/filter-rules.js +68 -0
  86. package/dist/filter/filter-rules.js.map +1 -0
  87. package/dist/filter/lens-material-names.d.ts +13 -0
  88. package/dist/filter/lens-material-names.d.ts.map +1 -0
  89. package/dist/filter/lens-material-names.js +36 -0
  90. package/dist/filter/lens-material-names.js.map +1 -0
  91. package/dist/filter/measure-units.d.ts +29 -0
  92. package/dist/filter/measure-units.d.ts.map +1 -0
  93. package/dist/filter/measure-units.js +72 -0
  94. package/dist/filter/measure-units.js.map +1 -0
  95. package/dist/filter/model-tag.d.ts +65 -0
  96. package/dist/filter/model-tag.d.ts.map +1 -0
  97. package/dist/filter/model-tag.js +57 -0
  98. package/dist/filter/model-tag.js.map +1 -0
  99. package/dist/filter/read-measure-subject.d.ts +28 -0
  100. package/dist/filter/read-measure-subject.d.ts.map +1 -0
  101. package/dist/filter/read-measure-subject.js +116 -0
  102. package/dist/filter/read-measure-subject.js.map +1 -0
  103. package/dist/filter/read-subject.d.ts +72 -0
  104. package/dist/filter/read-subject.d.ts.map +1 -0
  105. package/dist/filter/read-subject.js +128 -0
  106. package/dist/filter/read-subject.js.map +1 -0
  107. package/dist/filter/subject-match.d.ts +27 -0
  108. package/dist/filter/subject-match.d.ts.map +1 -0
  109. package/dist/filter/subject-match.js +52 -0
  110. package/dist/filter/subject-match.js.map +1 -0
  111. package/dist/filter/subject-read-options.d.ts +33 -0
  112. package/dist/filter/subject-read-options.d.ts.map +1 -0
  113. package/dist/filter/subject-read-options.js +8 -0
  114. package/dist/filter/subject-read-options.js.map +1 -0
  115. package/dist/ids/ids-facet-to-rules.d.ts +20 -0
  116. package/dist/ids/ids-facet-to-rules.d.ts.map +1 -0
  117. package/dist/ids/ids-facet-to-rules.js +230 -0
  118. package/dist/ids/ids-facet-to-rules.js.map +1 -0
  119. package/dist/ids/ids-regex.d.ts +44 -0
  120. package/dist/ids/ids-regex.d.ts.map +1 -0
  121. package/dist/ids/ids-regex.js +334 -0
  122. package/dist/ids/ids-regex.js.map +1 -0
  123. package/dist/ids/ids-to-rule-set.d.ts +39 -0
  124. package/dist/ids/ids-to-rule-set.d.ts.map +1 -0
  125. package/dist/ids/ids-to-rule-set.js +103 -0
  126. package/dist/ids/ids-to-rule-set.js.map +1 -0
  127. package/dist/ids/ids-xml-writer.d.ts +11 -0
  128. package/dist/ids/ids-xml-writer.d.ts.map +1 -0
  129. package/dist/ids/ids-xml-writer.js +172 -0
  130. package/dist/ids/ids-xml-writer.js.map +1 -0
  131. package/dist/ids/rule-set-to-ids.d.ts +45 -0
  132. package/dist/ids/rule-set-to-ids.d.ts.map +1 -0
  133. package/dist/ids/rule-set-to-ids.js +140 -0
  134. package/dist/ids/rule-set-to-ids.js.map +1 -0
  135. package/dist/ids/rule-to-ids-facets.d.ts +52 -0
  136. package/dist/ids/rule-to-ids-facets.d.ts.map +1 -0
  137. package/dist/ids/rule-to-ids-facets.js +291 -0
  138. package/dist/ids/rule-to-ids-facets.js.map +1 -0
  139. package/dist/ids/stored-unit-scale.d.ts +15 -0
  140. package/dist/ids/stored-unit-scale.d.ts.map +1 -0
  141. package/dist/ids/stored-unit-scale.js +64 -0
  142. package/dist/ids/stored-unit-scale.js.map +1 -0
  143. package/dist/index.d.ts +39 -0
  144. package/dist/index.d.ts.map +1 -0
  145. package/dist/index.js +46 -0
  146. package/dist/index.js.map +1 -0
  147. package/dist/rule-set/between-chip.d.ts +54 -0
  148. package/dist/rule-set/between-chip.d.ts.map +1 -0
  149. package/dist/rule-set/between-chip.js +95 -0
  150. package/dist/rule-set/between-chip.js.map +1 -0
  151. package/dist/rule-set/requirement-invariants.d.ts +25 -0
  152. package/dist/rule-set/requirement-invariants.d.ts.map +1 -0
  153. package/dist/rule-set/requirement-invariants.js +29 -0
  154. package/dist/rule-set/requirement-invariants.js.map +1 -0
  155. package/dist/rule-set/requirement-text.d.ts +20 -0
  156. package/dist/rule-set/requirement-text.d.ts.map +1 -0
  157. package/dist/rule-set/requirement-text.js +179 -0
  158. package/dist/rule-set/requirement-text.js.map +1 -0
  159. package/dist/rule-set/rule-set-io-requirement.d.ts +22 -0
  160. package/dist/rule-set/rule-set-io-requirement.d.ts.map +1 -0
  161. package/dist/rule-set/rule-set-io-requirement.js +140 -0
  162. package/dist/rule-set/rule-set-io-requirement.js.map +1 -0
  163. package/dist/rule-set/rule-set-io-shared.d.ts +24 -0
  164. package/dist/rule-set/rule-set-io-shared.d.ts.map +1 -0
  165. package/dist/rule-set/rule-set-io-shared.js +48 -0
  166. package/dist/rule-set/rule-set-io-shared.js.map +1 -0
  167. package/dist/rule-set/rule-set-io-subject.d.ts +10 -0
  168. package/dist/rule-set/rule-set-io-subject.d.ts.map +1 -0
  169. package/dist/rule-set/rule-set-io-subject.js +67 -0
  170. package/dist/rule-set/rule-set-io-subject.js.map +1 -0
  171. package/dist/rule-set/rule-set-io.d.ts +37 -0
  172. package/dist/rule-set/rule-set-io.d.ts.map +1 -0
  173. package/dist/rule-set/rule-set-io.js +142 -0
  174. package/dist/rule-set/rule-set-io.js.map +1 -0
  175. package/dist/rule-set/rule-set.d.ts +109 -0
  176. package/dist/rule-set/rule-set.d.ts.map +1 -0
  177. package/dist/rule-set/rule-set.js +5 -0
  178. package/dist/rule-set/rule-set.js.map +1 -0
  179. package/package.json +59 -0
@@ -0,0 +1,172 @@
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
+ const IDS_NS = 'http://standards.buildingsmart.org/IDS';
5
+ const XS_NS = 'http://www.w3.org/2001/XMLSchema';
6
+ const XSI_NS = 'http://www.w3.org/2001/XMLSchema-instance';
7
+ const SCHEMA_LOCATION = `${IDS_NS} http://standards.buildingsmart.org/IDS/1.0/ids.xsd`;
8
+ function escapeXml(text) {
9
+ return text
10
+ .replace(/&/g, '&')
11
+ .replace(/</g, '&lt;')
12
+ .replace(/>/g, '&gt;')
13
+ .replace(/"/g, '&quot;')
14
+ .replace(/'/g, '&apos;');
15
+ }
16
+ class XmlLines {
17
+ lines = [];
18
+ depth = 0;
19
+ open(tag, attrs = {}) {
20
+ this.lines.push(`${this.indent()}<${tag}${renderAttrs(attrs)}>`);
21
+ this.depth++;
22
+ }
23
+ close(tag) {
24
+ this.depth--;
25
+ this.lines.push(`${this.indent()}</${tag}>`);
26
+ }
27
+ leaf(tag, text, attrs = {}) {
28
+ this.lines.push(`${this.indent()}<${tag}${renderAttrs(attrs)}>${escapeXml(text)}</${tag}>`);
29
+ }
30
+ empty(tag, attrs = {}) {
31
+ this.lines.push(`${this.indent()}<${tag}${renderAttrs(attrs)}/>`);
32
+ }
33
+ indent() {
34
+ return ' '.repeat(this.depth);
35
+ }
36
+ }
37
+ function renderAttrs(attrs) {
38
+ let out = '';
39
+ for (const [key, value] of Object.entries(attrs)) {
40
+ if (value !== undefined)
41
+ out += ` ${key}="${escapeXml(value)}"`;
42
+ }
43
+ return out;
44
+ }
45
+ function writeConstraint(xml, tag, constraint) {
46
+ xml.open(tag);
47
+ switch (constraint.type) {
48
+ case 'simpleValue':
49
+ xml.leaf('simpleValue', constraint.value);
50
+ break;
51
+ case 'pattern':
52
+ xml.open('xs:restriction', { base: constraint.base ?? 'xs:string' });
53
+ xml.empty('xs:pattern', { value: constraint.pattern });
54
+ xml.close('xs:restriction');
55
+ break;
56
+ case 'enumeration':
57
+ xml.open('xs:restriction', { base: constraint.base ?? 'xs:string' });
58
+ for (const value of constraint.values)
59
+ xml.empty('xs:enumeration', { value });
60
+ xml.close('xs:restriction');
61
+ break;
62
+ case 'bounds': {
63
+ xml.open('xs:restriction', { base: constraint.base ?? 'xs:double' });
64
+ const bounds = [
65
+ ['xs:minInclusive', constraint.minInclusive],
66
+ ['xs:minExclusive', constraint.minExclusive],
67
+ ['xs:maxInclusive', constraint.maxInclusive],
68
+ ['xs:maxExclusive', constraint.maxExclusive],
69
+ ];
70
+ for (const [facet, value] of bounds) {
71
+ if (value !== undefined)
72
+ xml.empty(facet, { value: String(value) });
73
+ }
74
+ xml.close('xs:restriction');
75
+ break;
76
+ }
77
+ }
78
+ xml.close(tag);
79
+ }
80
+ function writeFacet(xml, facet, cardinality) {
81
+ switch (facet.type) {
82
+ case 'entity':
83
+ xml.open('entity');
84
+ writeConstraint(xml, 'name', facet.name);
85
+ if (facet.predefinedType)
86
+ writeConstraint(xml, 'predefinedType', facet.predefinedType);
87
+ xml.close('entity');
88
+ return;
89
+ case 'attribute':
90
+ xml.open('attribute', { cardinality });
91
+ writeConstraint(xml, 'name', facet.name);
92
+ if (facet.value)
93
+ writeConstraint(xml, 'value', facet.value);
94
+ xml.close('attribute');
95
+ return;
96
+ case 'property':
97
+ xml.open('property', { cardinality });
98
+ writeConstraint(xml, 'propertySet', facet.propertySet);
99
+ writeConstraint(xml, 'baseName', facet.baseName);
100
+ if (facet.value)
101
+ writeConstraint(xml, 'value', facet.value);
102
+ xml.close('property');
103
+ return;
104
+ case 'classification':
105
+ xml.open('classification', { cardinality });
106
+ if (facet.value)
107
+ writeConstraint(xml, 'value', facet.value);
108
+ if (facet.system)
109
+ writeConstraint(xml, 'system', facet.system);
110
+ xml.close('classification');
111
+ return;
112
+ case 'material':
113
+ xml.open('material', { cardinality });
114
+ if (facet.value)
115
+ writeConstraint(xml, 'value', facet.value);
116
+ xml.close('material');
117
+ return;
118
+ case 'partOf':
119
+ // `ruleSetToIds` never produces one (a rule's `parent` subject matches
120
+ // an ancestor's Name, not its class); refusing here keeps the writer
121
+ // honest if a caller hands it a document from elsewhere.
122
+ throw new Error('writeIdsXml: partOf facets are not supported by this writer');
123
+ }
124
+ }
125
+ function writeRequirement(xml, requirement) {
126
+ // IDS 1.0 has no cardinality on an entity facet inside requirements.
127
+ const cardinality = requirement.facet.type === 'entity' ? undefined : requirement.optionality;
128
+ writeFacet(xml, requirement.facet, cardinality);
129
+ }
130
+ function writeSpecification(xml, spec) {
131
+ xml.open('specification', {
132
+ name: spec.name,
133
+ ifcVersion: spec.ifcVersions.join(' '),
134
+ identifier: spec.identifier,
135
+ description: spec.description,
136
+ instructions: spec.instructions,
137
+ });
138
+ const maxOccurs = spec.maxOccurs === undefined ? 'unbounded' : String(spec.maxOccurs);
139
+ xml.open('applicability', { minOccurs: String(spec.minOccurs ?? 0), maxOccurs });
140
+ for (const facet of spec.applicability.facets)
141
+ writeFacet(xml, facet, undefined);
142
+ xml.close('applicability');
143
+ if (spec.requirements.length > 0) {
144
+ xml.open('requirements');
145
+ for (const requirement of spec.requirements)
146
+ writeRequirement(xml, requirement);
147
+ xml.close('requirements');
148
+ }
149
+ xml.close('specification');
150
+ }
151
+ /** `doc` as an IDS 1.0 XML string. */
152
+ export function writeIdsXml(doc) {
153
+ const xml = new XmlLines();
154
+ xml.open('ids', {
155
+ xmlns: IDS_NS,
156
+ 'xmlns:xs': XS_NS,
157
+ 'xmlns:xsi': XSI_NS,
158
+ 'xsi:schemaLocation': SCHEMA_LOCATION,
159
+ });
160
+ xml.open('info');
161
+ xml.leaf('title', doc.info.title);
162
+ if (doc.info.description)
163
+ xml.leaf('description', doc.info.description);
164
+ xml.close('info');
165
+ xml.open('specifications');
166
+ for (const spec of doc.specifications)
167
+ writeSpecification(xml, spec);
168
+ xml.close('specifications');
169
+ xml.close('ids');
170
+ return `<?xml version="1.0" encoding="UTF-8"?>\n${xml.lines.join('\n')}\n`;
171
+ }
172
+ //# sourceMappingURL=ids-xml-writer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ids-xml-writer.js","sourceRoot":"","sources":["../../src/ids/ids-xml-writer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,45 @@
1
+ /**
2
+ * Export a rule set as an IDS 1.0 document (#5225), for the subset IDS can
3
+ * express. Every rule either becomes one specification that checks the
4
+ * same thing, or is refused with each reason named. Nothing is dropped or
5
+ * approximated silently: a rule-level setting IDS has no room for (a
6
+ * warning severity, a custom tolerance, case-insensitive matching) is a
7
+ * refusal too, because the exported check would give a different verdict.
8
+ *
9
+ * Refused outright: `unique`, `aggregate` and `compare` requirements,
10
+ * negated operators, OR (across groups or inside one), `ifcType` without
11
+ * `exactClass`, `caseSensitive: false`, and model / model-tag targeting.
12
+ * The per-condition mapping is in `rule-to-ids-facets.ts`.
13
+ */
14
+ import type { IDSDocument, IFCVersion } from '@ifc-lite/ids';
15
+ import type { RuleSetFile } from '../rule-set/rule-set.js';
16
+ import type { EvaluatorModel } from '../filter/filter-evaluate.js';
17
+ export interface RuleSetToIdsOptions {
18
+ /** `ifcVersion` of every specification. Default: `['IFC4']`. */
19
+ ifcVersions?: IFCVersion[];
20
+ /**
21
+ * The models the rule set runs on. A numeric property or quantity check
22
+ * compared in model units is exported in SI, converted with the unit
23
+ * these models store that value in (#5225). Without models, or when they
24
+ * disagree, such a rule is refused with the reason; a rule already
25
+ * compared in SI (`valueUnit: 'si'`) exports without them.
26
+ */
27
+ models?: ReadonlyArray<EvaluatorModel>;
28
+ }
29
+ export interface RefusedRule {
30
+ ruleId: string;
31
+ ruleName: string;
32
+ reasons: string[];
33
+ }
34
+ export interface RuleSetToIdsResult {
35
+ /** `null` when no rule could be exported (an IDS needs a specification). */
36
+ xml: string | null;
37
+ document: IDSDocument;
38
+ exportedRuleIds: string[];
39
+ refused: RefusedRule[];
40
+ /** Caveats that apply to the exported specifications as a whole. */
41
+ notes: string[];
42
+ }
43
+ /** Convert `file` to IDS. Never throws; see {@link RuleSetToIdsResult}. */
44
+ export declare function ruleSetToIds(file: RuleSetFile, options?: RuleSetToIdsOptions): RuleSetToIdsResult;
45
+ //# sourceMappingURL=rule-set-to-ids.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rule-set-to-ids.d.ts","sourceRoot":"","sources":["../../src/ids/rule-set-to-ids.ts"],"names":[],"mappings":"AAIA;;;;;;;;;;;;GAYG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAoC,UAAU,EAAE,MAAM,eAAe,CAAC;AAC/F,OAAO,KAAK,EAAmB,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAG5E,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAC;AAMnE,MAAM,WAAW,mBAAmB;IAClC,gEAAgE;IAChE,WAAW,CAAC,EAAE,UAAU,EAAE,CAAC;IAC3B;;;;;;OAMG;IACH,MAAM,CAAC,EAAE,aAAa,CAAC,cAAc,CAAC,CAAC;CACxC;AAED,MAAM,WAAW,WAAW;IAC1B,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,EAAE,CAAC;CACnB;AAED,MAAM,WAAW,kBAAkB;IACjC,4EAA4E;IAC5E,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IACnB,QAAQ,EAAE,WAAW,CAAC;IACtB,eAAe,EAAE,MAAM,EAAE,CAAC;IAC1B,OAAO,EAAE,WAAW,EAAE,CAAC;IACvB,oEAAoE;IACpE,KAAK,EAAE,MAAM,EAAE,CAAC;CACjB;AAkGD,2EAA2E;AAC3E,wBAAgB,YAAY,CAAC,IAAI,EAAE,WAAW,EAAE,OAAO,GAAE,mBAAwB,GAAG,kBAAkB,CAqCrG"}
@@ -0,0 +1,140 @@
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 { groupToFacets } from './rule-to-ids-facets.js';
5
+ import { storedUnitScaleOf } from './stored-unit-scale.js';
6
+ import { writeIdsXml } from './ids-xml-writer.js';
7
+ /** The engine's default relative tolerance, which IDS 1.0 also fixes (bSI #418). */
8
+ const IDS_TOLERANCE = 1e-6;
9
+ /** Literal set/property names match case-insensitively in the rule engine, case-sensitively in IDS. */
10
+ const NAME_CASE_NOTE = 'Property set and property names are matched case-sensitively by IDS; the rule engine matches literal names case-insensitively';
11
+ function cardinalityOf(rule, reasons) {
12
+ const min = rule.cardinality?.minApplicable;
13
+ const max = rule.cardinality?.maxApplicable;
14
+ if (min === undefined && max === undefined)
15
+ return { minOccurs: 0, maxOccurs: 'unbounded' };
16
+ if (max === 0 && (min === undefined || min === 0))
17
+ return { minOccurs: 0, maxOccurs: 0 };
18
+ if (max === undefined && (min === 0 || min === 1))
19
+ return { minOccurs: min, maxOccurs: 'unbounded' };
20
+ reasons.push(`the applicable-count bounds (min ${min ?? 0}, max ${max ?? 'unbounded'}) have no IDS 1.0 form, ` +
21
+ 'which only knows required (at least one), optional and prohibited (none)');
22
+ return {};
23
+ }
24
+ /** Why each requirement kind other than `element` has no IDS form. */
25
+ const NON_ELEMENT_REASON = {
26
+ unique: 'a "unique" requirement compares values across elements; IDS checks one element at a time',
27
+ aggregate: 'an "aggregate" requirement totals values across elements; IDS checks one element at a time',
28
+ compare: 'a "compare" requirement compares two values of one element; IDS only compares a value with a fixed one',
29
+ unit: 'a "unit" requirement checks the unit a value is recorded in, which IDS 1.0 cannot state',
30
+ };
31
+ function ruleToSpecification(rule, ifcVersions, scaleOf) {
32
+ const reasons = [];
33
+ const notes = [];
34
+ if (rule.requirement.kind !== 'element') {
35
+ reasons.push(NON_ELEMENT_REASON[rule.requirement.kind]);
36
+ }
37
+ if (rule.severity === 'warning') {
38
+ reasons.push('IDS has no warning severity: every failed specification is an error');
39
+ }
40
+ if (rule.caseSensitive === false) {
41
+ reasons.push('case-insensitive matching (caseSensitive: false) cannot be expressed in IDS, which is case-sensitive');
42
+ }
43
+ if (rule.tolerance !== undefined && rule.tolerance !== IDS_TOLERANCE) {
44
+ reasons.push(`a numeric tolerance of ${rule.tolerance} differs from the 1e-6 IDS fixes`);
45
+ }
46
+ const cardinality = cardinalityOf(rule, reasons);
47
+ const applicabilityGroups = rule.applicability.groups;
48
+ let applicabilityFacets = [];
49
+ if (applicabilityGroups.length !== 1) {
50
+ reasons.push(applicabilityGroups.length === 0
51
+ ? 'the applicability is empty'
52
+ : 'applicability groups combined with OR cannot be expressed in one IDS specification');
53
+ }
54
+ else {
55
+ const mapped = groupToFacets(applicabilityGroups[0], 'applicability', scaleOf);
56
+ if (mapped.ok) {
57
+ applicabilityFacets = mapped.facets;
58
+ notes.push(...mapped.notes);
59
+ }
60
+ else
61
+ reasons.push(...mapped.reasons.map((r) => `applicability: ${r}`));
62
+ }
63
+ const requirements = [];
64
+ if (rule.requirement.kind === 'element') {
65
+ const groups = rule.requirement.block.groups;
66
+ if (groups.length !== 1) {
67
+ reasons.push(groups.length === 0
68
+ ? 'the requirement has no conditions'
69
+ : 'requirement groups combined with OR cannot be expressed in IDS 1.0');
70
+ }
71
+ else {
72
+ const mapped = groupToFacets(groups[0], 'requirement', scaleOf);
73
+ if (mapped.ok) {
74
+ notes.push(...mapped.notes);
75
+ mapped.facets.forEach((facet, i) => {
76
+ requirements.push({ id: `${rule.id}-${i + 1}`, facet, optionality: 'required' });
77
+ });
78
+ }
79
+ else {
80
+ reasons.push(...mapped.reasons.map((r) => `requirement: ${r}`));
81
+ }
82
+ }
83
+ }
84
+ if (reasons.length > 0)
85
+ return { ok: false, reasons };
86
+ return {
87
+ ok: true,
88
+ notes,
89
+ spec: {
90
+ id: rule.id,
91
+ identifier: rule.id,
92
+ name: rule.name,
93
+ ...(rule.description ? { description: rule.description } : {}),
94
+ ifcVersions,
95
+ applicability: { facets: applicabilityFacets },
96
+ requirements,
97
+ ...cardinality,
98
+ },
99
+ };
100
+ }
101
+ /** Convert `file` to IDS. Never throws; see {@link RuleSetToIdsResult}. */
102
+ export function ruleSetToIds(file, options = {}) {
103
+ const ifcVersions = options.ifcVersions && options.ifcVersions.length > 0 ? options.ifcVersions : ['IFC4'];
104
+ const specifications = [];
105
+ const exportedRuleIds = [];
106
+ const refused = [];
107
+ const notes = new Set();
108
+ const scaleOf = options.models ? storedUnitScaleOf(options.models) : undefined;
109
+ for (const rule of file.rules) {
110
+ const outcome = ruleToSpecification(rule, ifcVersions, scaleOf);
111
+ if (outcome.ok) {
112
+ specifications.push(outcome.spec);
113
+ exportedRuleIds.push(rule.id);
114
+ for (const note of outcome.notes)
115
+ notes.add(note);
116
+ if (outcome.spec.requirements.some((r) => r.facet.type === 'property')
117
+ || outcome.spec.applicability.facets.some((f) => f.type === 'property')) {
118
+ notes.add(NAME_CASE_NOTE);
119
+ }
120
+ }
121
+ else {
122
+ refused.push({ ruleId: rule.id, ruleName: rule.name, reasons: outcome.reasons });
123
+ }
124
+ }
125
+ const document = {
126
+ info: { title: file.name, ...(file.description ? { description: file.description } : {}) },
127
+ specifications,
128
+ };
129
+ if (file.targets && ((file.targets.modelFingerprints?.length ?? 0) > 0 || (file.targets.modelTagIds?.length ?? 0) > 0)) {
130
+ notes.add('The rule set\'s default target models are not part of an IDS; choose the model when running it');
131
+ }
132
+ return {
133
+ xml: specifications.length > 0 ? writeIdsXml(document) : null,
134
+ document,
135
+ exportedRuleIds,
136
+ refused,
137
+ notes: [...notes],
138
+ };
139
+ }
140
+ //# sourceMappingURL=rule-set-to-ids.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rule-set-to-ids.js","sourceRoot":"","sources":["../../src/ids/rule-set-to-ids.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,52 @@
1
+ /**
2
+ * One `FilterGroup` of a rule → the IDS facets that check exactly the same
3
+ * thing, or the reasons it has none (#5225). Used for both the
4
+ * applicability and the `element` requirement of a rule by
5
+ * `rule-set-to-ids.ts`.
6
+ *
7
+ * What maps, and why only this:
8
+ * - `ifcType` (+ `predefinedType`) → one entity facet, only with
9
+ * `exactClass: true`: an IDS entity facet matches the exact class, while
10
+ * a rule without `exactClass` matches subclasses too. Applicability only;
11
+ * in a requirement the engine compares the class without `exactClass`.
12
+ * - `name` / `attribute` / `globalId` → attribute facets.
13
+ * - `property` → property facet; `quantity` → property facet on the
14
+ * quantity set (IDS 1.0 checks quantities through the property facet).
15
+ * - `material` → material facet; `classification` presence → classification
16
+ * facet (a code/name value does not map: the rule matches a reference's
17
+ * code OR name, IDS only its code).
18
+ * - Operators `eq`, `contains`, `startsWith`, `matches`, `isSet`, `in`
19
+ * and the numeric bounds (`gt`/`gte`/`lt`/`lte`, a `between` pair folds
20
+ * into one restriction). Negations have no IDS form in a required facet.
21
+ */
22
+ import type { IDSFacet } from '@ifc-lite/ids';
23
+ import type { FilterGroup } from '../filter/filter-groups.js';
24
+ import type { PropertyRule, QuantityRule } from '../filter/filter-rules.js';
25
+ export type FacetRole = 'applicability' | 'requirement';
26
+ export type GroupFacets = {
27
+ ok: true;
28
+ facets: IDSFacet[];
29
+ notes: string[];
30
+ } | {
31
+ ok: false;
32
+ reasons: string[];
33
+ };
34
+ /**
35
+ * How a numeric check on a value stored in model units reaches SI, which
36
+ * IDS states every measure in (#5225 decision). `scale` converts the
37
+ * rule's operand to SI; `unitless` means the value has no unit, so it
38
+ * exports as it is; `unknown` carries why the unit could not be settled.
39
+ */
40
+ export type StoredUnitScale = {
41
+ kind: 'scale';
42
+ scale: number;
43
+ } | {
44
+ kind: 'unitless';
45
+ } | {
46
+ kind: 'unknown';
47
+ reason: string;
48
+ };
49
+ export type StoredUnitScaleOf = (rule: PropertyRule | QuantityRule) => StoredUnitScale;
50
+ /** Map one group. Every reason is collected, not just the first. */
51
+ export declare function groupToFacets(group: FilterGroup, role: FacetRole, scaleOf?: StoredUnitScaleOf): GroupFacets;
52
+ //# sourceMappingURL=rule-to-ids-facets.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rule-to-ids-facets.d.ts","sourceRoot":"","sources":["../../src/ids/rule-to-ids-facets.ts"],"names":[],"mappings":"AAIA;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,OAAO,KAAK,EAAiB,QAAQ,EAAE,MAAM,eAAe,CAAC;AAC7D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AAC9D,OAAO,KAAK,EAAyB,YAAY,EAAE,YAAY,EAAY,MAAM,2BAA2B,CAAC;AAG7G,MAAM,MAAM,SAAS,GAAG,eAAe,GAAG,aAAa,CAAC;AAExD,MAAM,MAAM,WAAW,GACnB;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,MAAM,EAAE,QAAQ,EAAE,CAAC;IAAC,KAAK,EAAE,MAAM,EAAE,CAAA;CAAE,GACjD;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,OAAO,EAAE,MAAM,EAAE,CAAA;CAAE,CAAC;AAgErC;;;;;GAKG;AACH,MAAM,MAAM,eAAe,GACvB;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GAChC;IAAE,IAAI,EAAE,UAAU,CAAA;CAAE,GACpB;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC;AAExC,MAAM,MAAM,iBAAiB,GAAG,CAAC,IAAI,EAAE,YAAY,GAAG,YAAY,KAAK,eAAe,CAAC;AAoLvF,oEAAoE;AACpE,wBAAgB,aAAa,CAAC,KAAK,EAAE,WAAW,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,GAAE,iBAA4B,GAAG,WAAW,CAsCrH"}