@ifc-lite/ids 3.1.0 → 3.3.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (228) hide show
  1. package/README.md +10 -1
  2. package/dist/audit/coherence/cardinality.js +4 -1
  3. package/dist/audit/coherence/cardinality.js.map +1 -1
  4. package/dist/audit/coherence/index.d.ts +0 -1
  5. package/dist/audit/coherence/index.d.ts.map +1 -1
  6. package/dist/audit/coherence/index.js +59 -45
  7. package/dist/audit/coherence/index.js.map +1 -1
  8. package/dist/audit/coherence/regex.d.ts +3 -3
  9. package/dist/audit/coherence/regex.js +3 -3
  10. package/dist/audit/ifc-schema/attribute-value.d.ts +19 -0
  11. package/dist/audit/ifc-schema/attribute-value.d.ts.map +1 -0
  12. package/dist/audit/ifc-schema/attribute-value.js +71 -0
  13. package/dist/audit/ifc-schema/attribute-value.js.map +1 -0
  14. package/dist/audit/ifc-schema/datatype-check.d.ts +9 -1
  15. package/dist/audit/ifc-schema/datatype-check.d.ts.map +1 -1
  16. package/dist/audit/ifc-schema/datatype-check.js +24 -2
  17. package/dist/audit/ifc-schema/datatype-check.js.map +1 -1
  18. package/dist/audit/ifc-schema/entity-requirement.d.ts +21 -0
  19. package/dist/audit/ifc-schema/entity-requirement.d.ts.map +1 -0
  20. package/dist/audit/ifc-schema/entity-requirement.js +45 -0
  21. package/dist/audit/ifc-schema/entity-requirement.js.map +1 -0
  22. package/dist/audit/ifc-schema/index.d.ts.map +1 -1
  23. package/dist/audit/ifc-schema/index.js +105 -19
  24. package/dist/audit/ifc-schema/index.js.map +1 -1
  25. package/dist/audit/index.d.ts.map +1 -1
  26. package/dist/audit/index.js +8 -2
  27. package/dist/audit/index.js.map +1 -1
  28. package/dist/audit/parser-shim.d.ts +15 -1
  29. package/dist/audit/parser-shim.d.ts.map +1 -1
  30. package/dist/audit/parser-shim.js +2 -2
  31. package/dist/audit/parser-shim.js.map +1 -1
  32. package/dist/audit/structural/index.d.ts +3 -1
  33. package/dist/audit/structural/index.d.ts.map +1 -1
  34. package/dist/audit/structural/index.js +48 -179
  35. package/dist/audit/structural/index.js.map +1 -1
  36. package/dist/audit/structural/shapes.d.ts +47 -0
  37. package/dist/audit/structural/shapes.d.ts.map +1 -0
  38. package/dist/audit/structural/shapes.js +185 -0
  39. package/dist/audit/structural/shapes.js.map +1 -0
  40. package/dist/audit/types.d.ts +9 -1
  41. package/dist/audit/types.d.ts.map +1 -1
  42. package/dist/audit/xsd/index.js +1 -1
  43. package/dist/audit/xsd/index.js.map +1 -1
  44. package/dist/bounded-cache.d.ts +18 -0
  45. package/dist/bounded-cache.d.ts.map +1 -0
  46. package/dist/bounded-cache.js +40 -0
  47. package/dist/bounded-cache.js.map +1 -0
  48. package/dist/bridge/data-accessor.d.ts.map +1 -1
  49. package/dist/bridge/data-accessor.js +49 -25
  50. package/dist/bridge/data-accessor.js.map +1 -1
  51. package/dist/bridge/index.d.ts +1 -0
  52. package/dist/bridge/index.d.ts.map +1 -1
  53. package/dist/bridge/index.js +1 -0
  54. package/dist/bridge/index.js.map +1 -1
  55. package/dist/bridge/measure-conversion.d.ts +51 -0
  56. package/dist/bridge/measure-conversion.d.ts.map +1 -0
  57. package/dist/bridge/measure-conversion.js +106 -0
  58. package/dist/bridge/measure-conversion.js.map +1 -0
  59. package/dist/bridge/predefined-property-sets.d.ts +24 -0
  60. package/dist/bridge/predefined-property-sets.d.ts.map +1 -0
  61. package/dist/bridge/predefined-property-sets.js +86 -0
  62. package/dist/bridge/predefined-property-sets.js.map +1 -0
  63. package/dist/bridge/predefined-types.d.ts +34 -13
  64. package/dist/bridge/predefined-types.d.ts.map +1 -1
  65. package/dist/bridge/predefined-types.js +40 -71
  66. package/dist/bridge/predefined-types.js.map +1 -1
  67. package/dist/bridge/project-property.d.ts +43 -0
  68. package/dist/bridge/project-property.d.ts.map +1 -0
  69. package/dist/bridge/project-property.js +60 -0
  70. package/dist/bridge/project-property.js.map +1 -0
  71. package/dist/bridge/properties.d.ts +4 -3
  72. package/dist/bridge/properties.d.ts.map +1 -1
  73. package/dist/bridge/properties.js +64 -111
  74. package/dist/bridge/properties.js.map +1 -1
  75. package/dist/bridge/property-overlay-resolver.d.ts +10 -0
  76. package/dist/bridge/property-overlay-resolver.d.ts.map +1 -1
  77. package/dist/bridge/property-overlay-resolver.js +53 -4
  78. package/dist/bridge/property-overlay-resolver.js.map +1 -1
  79. package/dist/bridge/units.d.ts +49 -20
  80. package/dist/bridge/units.d.ts.map +1 -1
  81. package/dist/bridge/units.js +134 -84
  82. package/dist/bridge/units.js.map +1 -1
  83. package/dist/constraint-types.d.ts +30 -14
  84. package/dist/constraint-types.d.ts.map +1 -1
  85. package/dist/constraints/comparators.d.ts +4 -1
  86. package/dist/constraints/comparators.d.ts.map +1 -1
  87. package/dist/constraints/comparators.js +6 -1
  88. package/dist/constraints/comparators.js.map +1 -1
  89. package/dist/constraints/describe.d.ts.map +1 -1
  90. package/dist/constraints/describe.js +67 -21
  91. package/dist/constraints/describe.js.map +1 -1
  92. package/dist/constraints/match-bounds.d.ts +25 -0
  93. package/dist/constraints/match-bounds.d.ts.map +1 -0
  94. package/dist/constraints/match-bounds.js +112 -0
  95. package/dist/constraints/match-bounds.js.map +1 -0
  96. package/dist/constraints/match-family.d.ts.map +1 -1
  97. package/dist/constraints/match-family.js +25 -90
  98. package/dist/constraints/match-family.js.map +1 -1
  99. package/dist/constraints/xsd-datetime.js +6 -6
  100. package/dist/constraints/xsd-examples.d.ts +20 -0
  101. package/dist/constraints/xsd-examples.d.ts.map +1 -0
  102. package/dist/constraints/xsd-examples.js +187 -0
  103. package/dist/constraints/xsd-examples.js.map +1 -0
  104. package/dist/constraints/xsd-lexical.d.ts +2 -0
  105. package/dist/constraints/xsd-lexical.d.ts.map +1 -0
  106. package/dist/constraints/xsd-lexical.js +49 -0
  107. package/dist/constraints/xsd-lexical.js.map +1 -0
  108. package/dist/constraints/xsd-order.d.ts +33 -0
  109. package/dist/constraints/xsd-order.d.ts.map +1 -0
  110. package/dist/constraints/xsd-order.js +211 -0
  111. package/dist/constraints/xsd-order.js.map +1 -0
  112. package/dist/constraints/xsd-regex-ast.d.ts +37 -0
  113. package/dist/constraints/xsd-regex-ast.d.ts.map +1 -0
  114. package/dist/constraints/xsd-regex-ast.js +137 -0
  115. package/dist/constraints/xsd-regex-ast.js.map +1 -0
  116. package/dist/constraints/xsd-regex-blocks.d.ts +7 -0
  117. package/dist/constraints/xsd-regex-blocks.d.ts.map +1 -0
  118. package/dist/constraints/xsd-regex-blocks.js +68 -0
  119. package/dist/constraints/xsd-regex-blocks.js.map +1 -0
  120. package/dist/constraints/xsd-regex.d.ts +2 -45
  121. package/dist/constraints/xsd-regex.d.ts.map +1 -1
  122. package/dist/constraints/xsd-regex.js +231 -134
  123. package/dist/constraints/xsd-regex.js.map +1 -1
  124. package/dist/facets/entity-facet.d.ts.map +1 -1
  125. package/dist/facets/entity-facet.js +4 -1
  126. package/dist/facets/entity-facet.js.map +1 -1
  127. package/dist/facets/partof-facet.d.ts.map +1 -1
  128. package/dist/facets/partof-facet.js +80 -19
  129. package/dist/facets/partof-facet.js.map +1 -1
  130. package/dist/facets/predefined-type-match.d.ts +8 -3
  131. package/dist/facets/predefined-type-match.d.ts.map +1 -1
  132. package/dist/facets/predefined-type-match.js.map +1 -1
  133. package/dist/index.d.ts +9 -2
  134. package/dist/index.d.ts.map +1 -1
  135. package/dist/index.js +24 -0
  136. package/dist/index.js.map +1 -1
  137. package/dist/parser/dom.d.ts +4 -0
  138. package/dist/parser/dom.d.ts.map +1 -1
  139. package/dist/parser/dom.js +5 -0
  140. package/dist/parser/dom.js.map +1 -1
  141. package/dist/parser/parse-restriction.d.ts.map +1 -1
  142. package/dist/parser/parse-restriction.js +32 -14
  143. package/dist/parser/parse-restriction.js.map +1 -1
  144. package/dist/parser/xml-parser.d.ts +7 -4
  145. package/dist/parser/xml-parser.d.ts.map +1 -1
  146. package/dist/parser/xml-parser.js +30 -45
  147. package/dist/parser/xml-parser.js.map +1 -1
  148. package/dist/preview/audit.d.ts +16 -0
  149. package/dist/preview/audit.d.ts.map +1 -0
  150. package/dist/preview/audit.js +58 -0
  151. package/dist/preview/audit.js.map +1 -0
  152. package/dist/preview/features.d.ts +30 -0
  153. package/dist/preview/features.d.ts.map +1 -0
  154. package/dist/preview/features.js +96 -0
  155. package/dist/preview/features.js.map +1 -0
  156. package/dist/preview/parse-ids11.d.ts +9 -0
  157. package/dist/preview/parse-ids11.d.ts.map +1 -0
  158. package/dist/preview/parse-ids11.js +90 -0
  159. package/dist/preview/parse-ids11.js.map +1 -0
  160. package/dist/preview/partof-nested.d.ts +27 -0
  161. package/dist/preview/partof-nested.d.ts.map +1 -0
  162. package/dist/preview/partof-nested.js +61 -0
  163. package/dist/preview/partof-nested.js.map +1 -0
  164. package/dist/preview/tolerance.d.ts +15 -0
  165. package/dist/preview/tolerance.d.ts.map +1 -0
  166. package/dist/preview/tolerance.js +66 -0
  167. package/dist/preview/tolerance.js.map +1 -0
  168. package/dist/preview/types.d.ts +67 -0
  169. package/dist/preview/types.d.ts.map +1 -0
  170. package/dist/preview/types.js +5 -0
  171. package/dist/preview/types.js.map +1 -0
  172. package/dist/report-types.d.ts +7 -0
  173. package/dist/report-types.d.ts.map +1 -1
  174. package/dist/translation/describe-constraint.js +16 -14
  175. package/dist/translation/describe-constraint.js.map +1 -1
  176. package/dist/translation/locales/de.d.ts +2 -0
  177. package/dist/translation/locales/de.d.ts.map +1 -1
  178. package/dist/translation/locales/de.js +2 -0
  179. package/dist/translation/locales/de.js.map +1 -1
  180. package/dist/translation/locales/en.d.ts +2 -0
  181. package/dist/translation/locales/en.d.ts.map +1 -1
  182. package/dist/translation/locales/en.js +2 -0
  183. package/dist/translation/locales/en.js.map +1 -1
  184. package/dist/translation/locales/fr.d.ts +2 -0
  185. package/dist/translation/locales/fr.d.ts.map +1 -1
  186. package/dist/translation/locales/fr.js +2 -0
  187. package/dist/translation/locales/fr.js.map +1 -1
  188. package/dist/translation/locales/index.d.ts +1 -0
  189. package/dist/translation/locales/index.d.ts.map +1 -1
  190. package/dist/translation/locales/index.js +1 -0
  191. package/dist/translation/locales/index.js.map +1 -1
  192. package/dist/translation/locales/it.d.ts +198 -0
  193. package/dist/translation/locales/it.d.ts.map +1 -0
  194. package/dist/translation/locales/it.js +235 -0
  195. package/dist/translation/locales/it.js.map +1 -0
  196. package/dist/translation/service.d.ts +2 -6
  197. package/dist/translation/service.d.ts.map +1 -1
  198. package/dist/translation/service.js +17 -25
  199. package/dist/translation/service.js.map +1 -1
  200. package/dist/types.d.ts +26 -31
  201. package/dist/types.d.ts.map +1 -1
  202. package/dist/validation/format-failure-reason.js +1 -1
  203. package/dist/validation/format-failure-reason.js.map +1 -1
  204. package/dist/validation/pass-rate.d.ts +14 -0
  205. package/dist/validation/pass-rate.d.ts.map +1 -0
  206. package/dist/validation/pass-rate.js +25 -0
  207. package/dist/validation/pass-rate.js.map +1 -0
  208. package/dist/validation/prohibited-specification.d.ts +31 -0
  209. package/dist/validation/prohibited-specification.d.ts.map +1 -0
  210. package/dist/validation/prohibited-specification.js +25 -0
  211. package/dist/validation/prohibited-specification.js.map +1 -0
  212. package/dist/validation/validator.d.ts +4 -2
  213. package/dist/validation/validator.d.ts.map +1 -1
  214. package/dist/validation/validator.js +23 -18
  215. package/dist/validation/validator.js.map +1 -1
  216. package/dist/writer/constraint.d.ts +8 -0
  217. package/dist/writer/constraint.d.ts.map +1 -0
  218. package/dist/writer/constraint.js +142 -0
  219. package/dist/writer/constraint.js.map +1 -0
  220. package/dist/writer/index.d.ts +48 -0
  221. package/dist/writer/index.d.ts.map +1 -0
  222. package/dist/writer/index.js +209 -0
  223. package/dist/writer/index.js.map +1 -0
  224. package/dist/writer/xml-lines.d.ts +17 -0
  225. package/dist/writer/xml-lines.d.ts.map +1 -0
  226. package/dist/writer/xml-lines.js +69 -0
  227. package/dist/writer/xml-lines.js.map +1 -0
  228. package/package.json +5 -5
@@ -0,0 +1,142 @@
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
+ function refuse(what) {
5
+ throw new Error(`writeIdsXml: ${what} are not supported by this writer`);
6
+ }
7
+ /**
8
+ * The facet families of one `<xs:restriction>`: the primary constraint and
9
+ * its conjunctive `and` siblings (see `constraint-types.ts`). One restriction
10
+ * holds one base and at most one family of each kind, since XSD ORs sibling
11
+ * patterns and enumerations; anything else has no single-restriction XML and
12
+ * is refused, never written as a weaker or different check.
13
+ */
14
+ function restrictionFamilies(constraint) {
15
+ const families = [constraint];
16
+ for (const sibling of constraint.and ?? []) {
17
+ if (sibling.type === 'simpleValue')
18
+ refuse('simple values inside a conjunctive restriction');
19
+ if (sibling.and?.length)
20
+ refuse('nested conjunctive restriction facets');
21
+ if (families.some((family) => family.type === sibling.type))
22
+ refuse(`two ${sibling.type} families in one conjunctive restriction`);
23
+ families.push(sibling);
24
+ }
25
+ const bases = new Set(families.map((family) => family.base).filter((base) => base !== undefined));
26
+ if (bases.size > 1)
27
+ refuse('conjunctive restriction facets with different bases');
28
+ return families;
29
+ }
30
+ /** `xs:length`, `xs:minLength`, `xs:maxLength` and the digit counts are `xs:nonNegativeInteger`. */
31
+ function countLexical(facet, value) {
32
+ if (!Number.isSafeInteger(value) || value < 0) {
33
+ throw new Error(`writeIdsXml: ${facet} must be a non-negative integer, got ${value}`);
34
+ }
35
+ return String(value);
36
+ }
37
+ /** Bases whose lexical space has an exponent: `xs:double` and `xs:float`. */
38
+ const EXPONENT_BASES = new Set(['xs:double', 'xs:float']);
39
+ /**
40
+ * A bound in its base's lexical space. `String(1e-7)` is `"1e-7"`, which
41
+ * `xs:decimal` and the integer types cannot read, so the exponent is expanded
42
+ * into plain digits there; the digits are the same, so `parseFloat` reads
43
+ * back the identical number.
44
+ */
45
+ function boundLexical(facet, value, base) {
46
+ if (!Number.isFinite(value))
47
+ throw new Error(`writeIdsXml: ${facet} must be a finite number, got ${value}`);
48
+ const text = String(value);
49
+ if (EXPONENT_BASES.has(base) || !/e/i.test(text))
50
+ return text;
51
+ return expandExponent(text);
52
+ }
53
+ function expandExponent(text) {
54
+ const match = /^(-?)(\d+)(?:\.(\d+))?e([+-]\d+)$/i.exec(text);
55
+ if (!match)
56
+ return text;
57
+ const [, sign, whole, fraction = '', exponentText] = match;
58
+ const digits = whole + fraction;
59
+ const point = whole.length + Number(exponentText);
60
+ if (point <= 0)
61
+ return `${sign}0.${'0'.repeat(-point)}${digits}`;
62
+ if (point >= digits.length)
63
+ return `${sign}${digits}${'0'.repeat(point - digits.length)}`;
64
+ return `${sign}${digits.slice(0, point)}.${digits.slice(point)}`;
65
+ }
66
+ function writeBounds(xml, constraint, base) {
67
+ if (constraint.unparseableFacets?.length)
68
+ refuse('unparseable bound facets');
69
+ const bounds = [
70
+ ['xs:minInclusive', constraint.minInclusive],
71
+ ['xs:minExclusive', constraint.minExclusive],
72
+ ['xs:maxInclusive', constraint.maxInclusive],
73
+ ['xs:maxExclusive', constraint.maxExclusive],
74
+ ];
75
+ // Date, time and duration bounds are kept as their validated lexemes, not numbers (#7399).
76
+ const temporal = constraint.temporalBounds;
77
+ const temporalBounds = [
78
+ ['xs:minInclusive', temporal?.minInclusive],
79
+ ['xs:minExclusive', temporal?.minExclusive],
80
+ ['xs:maxInclusive', temporal?.maxInclusive],
81
+ ['xs:maxExclusive', temporal?.maxExclusive],
82
+ ];
83
+ const counts = [
84
+ ['xs:length', constraint.length],
85
+ ['xs:minLength', constraint.minLength],
86
+ ['xs:maxLength', constraint.maxLength],
87
+ ['xs:totalDigits', constraint.totalDigits],
88
+ ['xs:fractionDigits', constraint.fractionDigits],
89
+ ];
90
+ // With no facet the restriction would be empty, which reads back as an empty enumeration.
91
+ if ([...bounds, ...temporalBounds, ...counts].every(([, value]) => value === undefined))
92
+ refuse('bounds restrictions without any facet');
93
+ for (const [facet, value] of bounds) {
94
+ if (value !== undefined)
95
+ xml.empty(facet, { value: boundLexical(facet, value, base) });
96
+ }
97
+ for (const [facet, value] of temporalBounds) {
98
+ if (value !== undefined)
99
+ xml.empty(facet, { value });
100
+ }
101
+ for (const [facet, value] of counts) {
102
+ if (value !== undefined)
103
+ xml.empty(facet, { value: countLexical(facet, value) });
104
+ }
105
+ }
106
+ /** The base written when the model carries none: `xs:double` for a numeric bounds restriction, else `xs:string`. */
107
+ function defaultBase(families) {
108
+ const primary = families[0];
109
+ if (primary.type !== 'bounds')
110
+ return 'xs:string';
111
+ const numeric = [primary.minInclusive, primary.minExclusive, primary.maxInclusive, primary.maxExclusive, primary.totalDigits, primary.fractionDigits];
112
+ return numeric.some((value) => value !== undefined) ? 'xs:double' : 'xs:string';
113
+ }
114
+ function writeRestriction(xml, constraint) {
115
+ const families = restrictionFamilies(constraint);
116
+ const base = families.find((family) => family.base !== undefined)?.base ?? defaultBase(families);
117
+ xml.open('xs:restriction', { base });
118
+ for (const family of families) {
119
+ switch (family.type) {
120
+ case 'pattern':
121
+ xml.empty('xs:pattern', { value: family.pattern });
122
+ break;
123
+ case 'enumeration':
124
+ for (const value of family.values)
125
+ xml.empty('xs:enumeration', { value });
126
+ break;
127
+ case 'bounds':
128
+ writeBounds(xml, family, base);
129
+ break;
130
+ }
131
+ }
132
+ xml.close('xs:restriction');
133
+ }
134
+ export function writeConstraint(xml, tag, constraint) {
135
+ xml.open(tag);
136
+ if (constraint.type === 'simpleValue')
137
+ xml.leaf('simpleValue', constraint.value);
138
+ else
139
+ writeRestriction(xml, constraint);
140
+ xml.close(tag);
141
+ }
142
+ //# sourceMappingURL=constraint.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constraint.js","sourceRoot":"","sources":["../../src/writer/constraint.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,48 @@
1
+ /**
2
+ * Serialise an `IDSDocument` as IDS 1.0 XML (#5225). Covers entity,
3
+ * attribute, property (with `dataType`), classification, material and
4
+ * partOf facets, requirement `instructions`, and every `IDSConstraint`
5
+ * shape: simple values, patterns, enumerations, numeric/length/digit bounds
6
+ * and conjunctive (`and`) restrictions. Element order within a facet
7
+ * follows `ids.xsd`, so `parseIDS` and `auditIDSDocument` read the result
8
+ * back; applicability facets are written in the order given (the caller
9
+ * owns the XSD's entity, partOf, classification, attribute, property,
10
+ * material sequence there). `@ifc-lite/rules`' `ruleSetToIds` and the
11
+ * viewer's reviewed IDS drafts (#6915) serialise through here (moved from
12
+ * `@ifc-lite/rules` by ADR-005).
13
+ */
14
+ import type { IDSDocument } from '../types.js';
15
+ import type { IDSPreviewFlags } from '../preview/types.js';
16
+ /** Formatting of `writeIdsXml`'s output. Every option changes layout or order only, never meaning. */
17
+ export interface IdsXmlFormat {
18
+ /** Indentation of one nesting level: a number of spaces (0–8) or `'\t'`. Default `2`. */
19
+ indent?: number | '\t';
20
+ /** Line ending. Default `'\n'`. */
21
+ newline?: '\n' | '\r\n';
22
+ /**
23
+ * Canonical order, so two documents with the same checks write the same
24
+ * bytes: applicability facets in the `ids.xsd` sequence (entity, partOf,
25
+ * classification, attribute, property, material; stable within a kind)
26
+ * and `ifcVersion` tokens in schema order without duplicates. Both are
27
+ * order-insensitive in IDS. Requirements keep their authored order, which
28
+ * reports show. Default `false`: everything is written in the order given.
29
+ */
30
+ canonical?: boolean;
31
+ }
32
+ /** What `writeIdsXml` may write, as opposed to how (`IdsXmlFormat`). */
33
+ export interface IdsXmlWriteOptions {
34
+ /**
35
+ * IDS 1.1 PREVIEW (unstable). Without `ids11`, a document using a 1.1
36
+ * candidate feature is refused with `IDS11PreviewRequiredError`; with it,
37
+ * such a document is written against the 1.1 schema location. A document
38
+ * using no 1.1 feature is written as IDS 1.0 either way, byte for byte.
39
+ */
40
+ preview?: IDSPreviewFlags;
41
+ }
42
+ /**
43
+ * `doc` as an IDS 1.0 XML string, laid out per `fmt` (two-space indent,
44
+ * `\n`, authored order by default). IDS 1.1 PREVIEW output needs
45
+ * `options.preview.ids11`.
46
+ */
47
+ export declare function writeIdsXml(doc: IDSDocument, fmt?: IdsXmlFormat, options?: IdsXmlWriteOptions): string;
48
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/writer/index.ts"],"names":[],"mappings":"AAIA;;;;;;;;;;;;GAYG;AAEH,OAAO,KAAK,EACV,WAAW,EAMZ,MAAM,aAAa,CAAC;AAIrB,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAoH3D,sGAAsG;AACtG,MAAM,WAAW,YAAY;IAC3B,yFAAyF;IACzF,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,mCAAmC;IACnC,OAAO,CAAC,EAAE,IAAI,GAAG,MAAM,CAAC;IACxB;;;;;;;OAOG;IACH,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAqDD,wEAAwE;AACxE,MAAM,WAAW,kBAAkB;IACjC;;;;;OAKG;IACH,OAAO,CAAC,EAAE,eAAe,CAAC;CAC3B;AAED;;;;GAIG;AACH,wBAAgB,WAAW,CAAC,GAAG,EAAE,WAAW,EAAE,GAAG,GAAE,YAAiB,EAAE,OAAO,GAAE,kBAAuB,GAAG,MAAM,CA8B9G"}
@@ -0,0 +1,209 @@
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 { XmlLines } from './xml-lines.js';
5
+ import { writeConstraint } from './constraint.js';
6
+ import { assertIds11Allowed } from '../preview/features.js';
7
+ const IDS_NS = 'http://standards.buildingsmart.org/IDS';
8
+ const XS_NS = 'http://www.w3.org/2001/XMLSchema';
9
+ const XSI_NS = 'http://www.w3.org/2001/XMLSchema-instance';
10
+ const SCHEMA_LOCATION = `${IDS_NS} http://standards.buildingsmart.org/IDS/1.0/ids.xsd`;
11
+ /**
12
+ * IDS 1.1 PREVIEW. buildingSMART has not published a 1.1 schema URL; this
13
+ * follows the 1.0 pattern and the `version="1.1.0"` of the upstream
14
+ * `ver/1.1.x` branch's `ids.xsd`. An assumption, recorded in the P-12 worklog.
15
+ */
16
+ const SCHEMA_LOCATION_11_PREVIEW = `${IDS_NS} http://standards.buildingsmart.org/IDS/1.1/ids.xsd`;
17
+ const IDS11_PREVIEW_NOTE = 'IDS 1.1 PREVIEW: uses unreleased candidate features; not valid IDS 1.0.';
18
+ /**
19
+ * `IfcRelContainedInSpatialStructure` -> the XSD's upper-case `relations`
20
+ * token. Voids and fills exist in IDS 1.0 only as the combined token, so
21
+ * either alone has no valid XML and is refused.
22
+ */
23
+ function relationToken(relation) {
24
+ if (relation === 'IfcRelVoidsElement' || relation === 'IfcRelFillsElement') {
25
+ throw new Error(`writeIdsXml: partOf relation ${relation} on its own is not supported by this writer (IDS 1.0 has only "IFCRELVOIDSELEMENT IFCRELFILLSELEMENT")`);
26
+ }
27
+ return relation.toUpperCase();
28
+ }
29
+ function writeEntity(xml, facet, attrs = {}) {
30
+ xml.open('entity', attrs);
31
+ writeConstraint(xml, 'name', facet.name);
32
+ if (facet.predefinedType)
33
+ writeConstraint(xml, 'predefinedType', facet.predefinedType);
34
+ xml.close('entity');
35
+ }
36
+ /** `dataType` is an XSD attribute holding one upper-case name, never a restriction. */
37
+ function dataTypeAttr(facet) {
38
+ if (!facet.dataType)
39
+ return undefined;
40
+ if (facet.dataType.type !== 'simpleValue')
41
+ throw new Error('writeIdsXml: a property dataType must be a simple value');
42
+ return facet.dataType.value;
43
+ }
44
+ /**
45
+ * The facet's `instructions` attribute. A requirement's comes from
46
+ * `IDSRequirement.instructions` (IDS 1.0); an applicability facet's from the
47
+ * facet itself (IDS 1.1 PREVIEW, #154). The facet-level field anywhere else
48
+ * has no XML home and is refused rather than dropped.
49
+ */
50
+ function instructionsFor(facet, context, requirementInstructions) {
51
+ if (context === 'applicability')
52
+ return facet.instructions;
53
+ if (facet.instructions !== undefined) {
54
+ throw new Error(`writeIdsXml: a ${context} ${facet.type} facet cannot carry facet-level instructions${context === 'requirement' ? '; use IDSRequirement.instructions' : ''}`);
55
+ }
56
+ return requirementInstructions;
57
+ }
58
+ function writeFacet(xml, facet, cardinality, context, requirementInstructions) {
59
+ const instructions = instructionsFor(facet, context, requirementInstructions);
60
+ switch (facet.type) {
61
+ case 'entity':
62
+ writeEntity(xml, facet, { instructions });
63
+ return;
64
+ case 'attribute':
65
+ xml.open('attribute', { cardinality, instructions });
66
+ writeConstraint(xml, 'name', facet.name);
67
+ if (facet.value)
68
+ writeConstraint(xml, 'value', facet.value);
69
+ xml.close('attribute');
70
+ return;
71
+ case 'property':
72
+ xml.open('property', { dataType: dataTypeAttr(facet), cardinality, instructions, uri: facet.uri });
73
+ writeConstraint(xml, 'propertySet', facet.propertySet);
74
+ writeConstraint(xml, 'baseName', facet.baseName);
75
+ if (facet.value)
76
+ writeConstraint(xml, 'value', facet.value);
77
+ xml.close('property');
78
+ return;
79
+ case 'classification':
80
+ xml.open('classification', { cardinality, instructions, uri: facet.uri });
81
+ if (facet.value)
82
+ writeConstraint(xml, 'value', facet.value);
83
+ if (facet.system)
84
+ writeConstraint(xml, 'system', facet.system);
85
+ xml.close('classification');
86
+ return;
87
+ case 'material':
88
+ xml.open('material', { cardinality, instructions, uri: facet.uri });
89
+ if (facet.value)
90
+ writeConstraint(xml, 'value', facet.value);
91
+ xml.close('material');
92
+ return;
93
+ case 'partOf':
94
+ // `ruleSetToIds` never produces one (a rule's `parent` subject matches
95
+ // an ancestor's Name, not its class). The XSD requires the related
96
+ // entity, so a partOf without one is refused rather than written invalid.
97
+ if (!facet.entity)
98
+ throw new Error('writeIdsXml: a partOf facet needs its related entity');
99
+ // No relation means any part-of relation (#7401), so it stays unwritten;
100
+ // an unrecognised one is written as read, for the auditor to flag.
101
+ xml.open('partOf', {
102
+ relation: facet.anyRelation ? undefined : facet.rawRelation ?? relationToken(facet.relation),
103
+ cardinality,
104
+ instructions,
105
+ });
106
+ writeEntity(xml, facet.entity);
107
+ // IDS 1.1 PREVIEW (#379/#380): conditions on the related parent.
108
+ for (const nested of facet.facets ?? [])
109
+ writeFacet(xml, nested, undefined, 'nested');
110
+ xml.close('partOf');
111
+ return;
112
+ }
113
+ }
114
+ function writeRequirement(xml, requirement) {
115
+ // IDS 1.0 has no cardinality on an entity facet inside requirements.
116
+ const cardinality = requirement.facet.type === 'entity' ? undefined : requirement.optionality;
117
+ writeFacet(xml, requirement.facet, cardinality, 'requirement', requirement.instructions);
118
+ }
119
+ /** The `ids.xsd` applicability sequence; an applicability in another order is not schema-valid. */
120
+ const FACET_ORDER = {
121
+ entity: 0, partOf: 1, classification: 2, attribute: 3, property: 4, material: 5,
122
+ };
123
+ /** `ids.xsd`'s `ifcVersion` tokens, in schema order. The parser reads `IFC4X3_ADD2` as `IFC4X3`. */
124
+ const VERSION_TOKENS = ['IFC2X3', 'IFC4', 'IFC4X3_ADD2'];
125
+ /** `IFC4X3` has no token of its own in IDS 1.0: it is written as `IFC4X3_ADD2`, which reads back as `IFC4X3`. */
126
+ function versionToken(version) {
127
+ return version === 'IFC4X3' ? 'IFC4X3_ADD2' : version;
128
+ }
129
+ function versionTokens(versions, canonical) {
130
+ const tokens = versions.map(versionToken);
131
+ if (!canonical)
132
+ return tokens;
133
+ return VERSION_TOKENS.filter((token) => tokens.includes(token));
134
+ }
135
+ function indentUnit(indent) {
136
+ if (indent === undefined)
137
+ return ' ';
138
+ if (indent === '\t')
139
+ return '\t';
140
+ if (!Number.isInteger(indent) || indent < 0 || indent > 8) {
141
+ throw new Error(`writeIdsXml: indent must be '\\t' or an integer from 0 to 8, got ${indent}`);
142
+ }
143
+ return ' '.repeat(indent);
144
+ }
145
+ function writeSpecification(xml, spec, canonical) {
146
+ const versions = versionTokens(spec.ifcVersions, canonical);
147
+ const facets = canonical
148
+ ? [...spec.applicability.facets].sort((a, b) => FACET_ORDER[a.type] - FACET_ORDER[b.type])
149
+ : spec.applicability.facets;
150
+ xml.open('specification', {
151
+ name: spec.name,
152
+ ifcVersion: versions.join(' '),
153
+ identifier: spec.identifier,
154
+ description: spec.description,
155
+ instructions: spec.instructions,
156
+ });
157
+ const maxOccurs = spec.maxOccurs === undefined ? 'unbounded' : String(spec.maxOccurs);
158
+ xml.open('applicability', { minOccurs: String(spec.minOccurs ?? 0), maxOccurs });
159
+ for (const facet of facets)
160
+ writeFacet(xml, facet, undefined, 'applicability');
161
+ xml.close('applicability');
162
+ if (spec.requirements.length > 0) {
163
+ xml.open('requirements');
164
+ for (const requirement of spec.requirements)
165
+ writeRequirement(xml, requirement);
166
+ xml.close('requirements');
167
+ }
168
+ xml.close('specification');
169
+ }
170
+ /**
171
+ * `doc` as an IDS 1.0 XML string, laid out per `fmt` (two-space indent,
172
+ * `\n`, authored order by default). IDS 1.1 PREVIEW output needs
173
+ * `options.preview.ids11`.
174
+ */
175
+ export function writeIdsXml(doc, fmt = {}, options = {}) {
176
+ const ids11 = assertIds11Allowed(doc, options.preview, 'writeIdsXml', true).length > 0;
177
+ const xml = new XmlLines(indentUnit(fmt.indent));
178
+ const newline = fmt.newline ?? '\n';
179
+ const canonical = fmt.canonical ?? false;
180
+ xml.open('ids', {
181
+ xmlns: IDS_NS,
182
+ 'xmlns:xs': XS_NS,
183
+ 'xmlns:xsi': XSI_NS,
184
+ 'xsi:schemaLocation': ids11 ? SCHEMA_LOCATION_11_PREVIEW : SCHEMA_LOCATION,
185
+ });
186
+ if (ids11)
187
+ xml.comment(IDS11_PREVIEW_NOTE);
188
+ xml.open('info');
189
+ // The `ids.xsd` info sequence. `date` (xs:date) and `author` (an e-mail
190
+ // pattern) are written as given; `auditIDSDocument` reports malformed ones.
191
+ const { title, copyright, version, description, author, date, purpose, milestone } = doc.info;
192
+ xml.leaf('title', title);
193
+ const optional = [
194
+ ['copyright', copyright], ['version', version], ['description', description], ['author', author],
195
+ ['date', date], ['purpose', purpose], ['milestone', milestone],
196
+ ];
197
+ for (const [tag, text] of optional) {
198
+ if (text)
199
+ xml.leaf(tag, text);
200
+ }
201
+ xml.close('info');
202
+ xml.open('specifications');
203
+ for (const spec of doc.specifications)
204
+ writeSpecification(xml, spec, canonical);
205
+ xml.close('specifications');
206
+ xml.close('ids');
207
+ return ['<?xml version="1.0" encoding="UTF-8"?>', ...xml.lines, ''].join(newline);
208
+ }
209
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/writer/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ /** `field` names the element or attribute, so a refusal says what to fix. */
2
+ export declare function escapeXml(text: string, field: string): string;
3
+ export declare class XmlLines {
4
+ private readonly unit;
5
+ readonly lines: string[];
6
+ private depth;
7
+ /** `unit` is the indentation of one nesting level. */
8
+ constructor(unit?: string);
9
+ open(tag: string, attrs?: Record<string, string | undefined>): void;
10
+ close(tag: string): void;
11
+ leaf(tag: string, text: string, attrs?: Record<string, string | undefined>): void;
12
+ /** An XML comment line; `--` cannot appear inside one and is refused. */
13
+ comment(text: string): void;
14
+ empty(tag: string, attrs?: Record<string, string | undefined>): void;
15
+ private indent;
16
+ }
17
+ //# sourceMappingURL=xml-lines.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"xml-lines.d.ts","sourceRoot":"","sources":["../../src/writer/xml-lines.ts"],"names":[],"mappings":"AAWA,6EAA6E;AAC7E,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAc7D;AAOD,qBAAa,QAAQ;IAKP,OAAO,CAAC,QAAQ,CAAC,IAAI;IAJjC,QAAQ,CAAC,KAAK,EAAE,MAAM,EAAE,CAAM;IAC9B,OAAO,CAAC,KAAK,CAAK;IAElB,sDAAsD;gBACzB,IAAI,SAAO;IAExC,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,GAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAM,GAAG,IAAI;IAKvE,KAAK,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI;IAKxB,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,GAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAM,GAAG,IAAI;IAIrF,yEAAyE;IACzE,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAK3B,KAAK,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,GAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAM,GAAG,IAAI;IAIxE,OAAO,CAAC,MAAM;CAGf"}
@@ -0,0 +1,69 @@
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
+ /** XML escaping and the indented line buffer behind `writeIdsXml`. */
5
+ /** Characters XML 1.0 cannot carry, even as character references. */
6
+ // Matching control characters is the point: they are refused, not allowed through.
7
+ // eslint-disable-next-line no-control-regex
8
+ const NOT_XML = /[\u0000-\u0008\u000B\u000C\u000E-\u001F\uFFFE\uFFFF]/;
9
+ /** `field` names the element or attribute, so a refusal says what to fix. */
10
+ export function escapeXml(text, field) {
11
+ const bad = NOT_XML.exec(text);
12
+ if (bad) {
13
+ const code = bad[0].charCodeAt(0).toString(16).toUpperCase().padStart(4, '0');
14
+ throw new Error(`writeIdsXml: ${field} contains control character U+${code}, which XML 1.0 cannot carry`);
15
+ }
16
+ return text
17
+ .replace(/&/g, '&amp;')
18
+ .replace(/</g, '&lt;')
19
+ .replace(/>/g, '&gt;')
20
+ .replace(/"/g, '&quot;')
21
+ .replace(/'/g, '&apos;')
22
+ // A raw CR is normalised away by every XML reader; a reference survives.
23
+ .replace(/\r/g, '&#13;');
24
+ }
25
+ /** Attribute-value normalisation turns raw line breaks and tabs into spaces; references keep them. */
26
+ function escapeAttr(text, field) {
27
+ return escapeXml(text, field).replace(/\n/g, '&#10;').replace(/\t/g, '&#9;');
28
+ }
29
+ export class XmlLines {
30
+ unit;
31
+ lines = [];
32
+ depth = 0;
33
+ /** `unit` is the indentation of one nesting level. */
34
+ constructor(unit = ' ') {
35
+ this.unit = unit;
36
+ }
37
+ open(tag, attrs = {}) {
38
+ this.lines.push(`${this.indent()}<${tag}${renderAttrs(tag, attrs)}>`);
39
+ this.depth++;
40
+ }
41
+ close(tag) {
42
+ this.depth--;
43
+ this.lines.push(`${this.indent()}</${tag}>`);
44
+ }
45
+ leaf(tag, text, attrs = {}) {
46
+ this.lines.push(`${this.indent()}<${tag}${renderAttrs(tag, attrs)}>${escapeXml(text, tag)}</${tag}>`);
47
+ }
48
+ /** An XML comment line; `--` cannot appear inside one and is refused. */
49
+ comment(text) {
50
+ if (text.includes('--'))
51
+ throw new Error('writeIdsXml: an XML comment cannot contain "--"');
52
+ this.lines.push(`${this.indent()}<!-- ${escapeXml(text, 'comment')} -->`);
53
+ }
54
+ empty(tag, attrs = {}) {
55
+ this.lines.push(`${this.indent()}<${tag}${renderAttrs(tag, attrs)}/>`);
56
+ }
57
+ indent() {
58
+ return this.unit.repeat(this.depth);
59
+ }
60
+ }
61
+ function renderAttrs(tag, attrs) {
62
+ let out = '';
63
+ for (const [key, value] of Object.entries(attrs)) {
64
+ if (value !== undefined)
65
+ out += ` ${key}="${escapeAttr(value, `${tag} "${key}"`)}"`;
66
+ }
67
+ return out;
68
+ }
69
+ //# sourceMappingURL=xml-lines.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"xml-lines.js","sourceRoot":"","sources":["../../src/writer/xml-lines.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ifc-lite/ids",
3
- "version": "3.1.0",
3
+ "version": "3.3.1",
4
4
  "description": "IDS (Information Delivery Specification) support for IFC-Lite",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -19,15 +19,15 @@
19
19
  "dependencies": {
20
20
  "@xmldom/xmldom": "^0.9.12",
21
21
  "@ifc-lite/codegen": "1.18.1",
22
- "@ifc-lite/data": "6.1.0",
22
+ "@ifc-lite/data": "6.2.0",
23
23
  "@ifc-lite/encoding": "2.3.0",
24
- "@ifc-lite/parser": "9.1.0",
24
+ "@ifc-lite/parser": "9.4.0",
25
25
  "@ifc-lite/regex-guard": "0.3.0"
26
26
  },
27
27
  "devDependencies": {
28
- "happy-dom": "^20.14.5",
28
+ "happy-dom": "^20.14.6",
29
29
  "typescript": "^6.0.3",
30
- "vitest": "^5.0.2",
30
+ "vitest": "^5.0.3",
31
31
  "xmllint-wasm": "5.3.0",
32
32
  "@ifc-lite/timing-ladder": "^0.1.0"
33
33
  },