@ifc-lite/parser 4.3.2 → 5.1.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 (162) hide show
  1. package/dist/attribute-helpers.d.ts +38 -4
  2. package/dist/attribute-helpers.d.ts.map +1 -1
  3. package/dist/attribute-helpers.js +71 -4
  4. package/dist/attribute-helpers.js.map +1 -1
  5. package/dist/classification-resolver.d.ts +28 -2
  6. package/dist/classification-resolver.d.ts.map +1 -1
  7. package/dist/classification-resolver.js +24 -6
  8. package/dist/classification-resolver.js.map +1 -1
  9. package/dist/columnar-parser-attributes.d.ts.map +1 -1
  10. package/dist/columnar-parser-attributes.js +35 -5
  11. package/dist/columnar-parser-attributes.js.map +1 -1
  12. package/dist/columnar-parser-indexes.d.ts.map +1 -1
  13. package/dist/columnar-parser-indexes.js +14 -2
  14. package/dist/columnar-parser-indexes.js.map +1 -1
  15. package/dist/columnar-parser-relationships.d.ts.map +1 -1
  16. package/dist/columnar-parser-relationships.js +6 -1
  17. package/dist/columnar-parser-relationships.js.map +1 -1
  18. package/dist/columnar-parser.d.ts +4 -2
  19. package/dist/columnar-parser.d.ts.map +1 -1
  20. package/dist/columnar-parser.js +18 -56
  21. package/dist/columnar-parser.js.map +1 -1
  22. package/dist/compact-entity-index-transport.d.ts +23 -0
  23. package/dist/compact-entity-index-transport.d.ts.map +1 -0
  24. package/dist/compact-entity-index-transport.js +28 -0
  25. package/dist/compact-entity-index-transport.js.map +1 -0
  26. package/dist/compact-entity-index.d.ts +1 -10
  27. package/dist/compact-entity-index.d.ts.map +1 -1
  28. package/dist/compact-entity-index.js +29 -26
  29. package/dist/compact-entity-index.js.map +1 -1
  30. package/dist/data-store-transport.d.ts +9 -26
  31. package/dist/data-store-transport.d.ts.map +1 -1
  32. package/dist/data-store-transport.js +16 -35
  33. package/dist/data-store-transport.js.map +1 -1
  34. package/dist/entity-extractor.d.ts.map +1 -1
  35. package/dist/entity-extractor.js +101 -6
  36. package/dist/entity-extractor.js.map +1 -1
  37. package/dist/entity-refs-from-index.d.ts.map +1 -1
  38. package/dist/entity-refs-from-index.js +24 -15
  39. package/dist/entity-refs-from-index.js.map +1 -1
  40. package/dist/entity-scanner.d.ts +63 -0
  41. package/dist/entity-scanner.d.ts.map +1 -1
  42. package/dist/entity-scanner.js +79 -2
  43. package/dist/entity-scanner.js.map +1 -1
  44. package/dist/express-id.d.ts +47 -0
  45. package/dist/express-id.d.ts.map +1 -0
  46. package/dist/express-id.js +57 -0
  47. package/dist/express-id.js.map +1 -0
  48. package/dist/generated/entities.d.ts +1 -1
  49. package/dist/generated/entities.d.ts.map +1 -1
  50. package/dist/generated/schema-registry.js +146 -146
  51. package/dist/generated/schema-registry.js.map +1 -1
  52. package/dist/georef-epset.d.ts +25 -0
  53. package/dist/georef-epset.d.ts.map +1 -0
  54. package/dist/georef-epset.js +214 -0
  55. package/dist/georef-epset.js.map +1 -0
  56. package/dist/georef-extractor.d.ts.map +1 -1
  57. package/dist/georef-extractor.js +38 -175
  58. package/dist/georef-extractor.js.map +1 -1
  59. package/dist/georef-map-conversion.d.ts +29 -0
  60. package/dist/georef-map-conversion.d.ts.map +1 -0
  61. package/dist/georef-map-conversion.js +75 -0
  62. package/dist/georef-map-conversion.js.map +1 -0
  63. package/dist/ifc-schema.d.ts +4 -2
  64. package/dist/ifc-schema.d.ts.map +1 -1
  65. package/dist/ifc-schema.js +15 -5
  66. package/dist/ifc-schema.js.map +1 -1
  67. package/dist/index.d.ts +5 -2
  68. package/dist/index.d.ts.map +1 -1
  69. package/dist/index.js +5 -2
  70. package/dist/index.js.map +1 -1
  71. package/dist/material-extractor.d.ts +2 -17
  72. package/dist/material-extractor.d.ts.map +1 -1
  73. package/dist/material-extractor.js +12 -37
  74. package/dist/material-extractor.js.map +1 -1
  75. package/dist/material-layer-reader.d.ts +45 -0
  76. package/dist/material-layer-reader.d.ts.map +1 -0
  77. package/dist/material-layer-reader.js +63 -0
  78. package/dist/material-layer-reader.js.map +1 -0
  79. package/dist/material-resolver.d.ts.map +1 -1
  80. package/dist/material-resolver.js +14 -14
  81. package/dist/material-resolver.js.map +1 -1
  82. package/dist/measure-unit-scale.d.ts +41 -0
  83. package/dist/measure-unit-scale.d.ts.map +1 -0
  84. package/dist/measure-unit-scale.js +53 -0
  85. package/dist/measure-unit-scale.js.map +1 -0
  86. package/dist/on-demand-extractors.d.ts +4 -20
  87. package/dist/on-demand-extractors.d.ts.map +1 -1
  88. package/dist/on-demand-extractors.js +54 -264
  89. package/dist/on-demand-extractors.js.map +1 -1
  90. package/dist/on-demand-georeferencing.d.ts +3 -3
  91. package/dist/on-demand-georeferencing.js +27 -4
  92. package/dist/on-demand-georeferencing.js.map +1 -1
  93. package/dist/owning-project.d.ts +54 -0
  94. package/dist/owning-project.d.ts.map +1 -0
  95. package/dist/owning-project.js +76 -0
  96. package/dist/owning-project.js.map +1 -0
  97. package/dist/parser.worker.d.ts +14 -0
  98. package/dist/parser.worker.d.ts.map +1 -1
  99. package/dist/parser.worker.js +16 -3
  100. package/dist/parser.worker.js.map +1 -1
  101. package/dist/project-units-symbols.d.ts +33 -0
  102. package/dist/project-units-symbols.d.ts.map +1 -0
  103. package/dist/project-units-symbols.js +265 -0
  104. package/dist/project-units-symbols.js.map +1 -0
  105. package/dist/project-units.d.ts +11 -19
  106. package/dist/project-units.d.ts.map +1 -1
  107. package/dist/project-units.js +9 -267
  108. package/dist/project-units.js.map +1 -1
  109. package/dist/property-set-merge.d.ts +65 -8
  110. package/dist/property-set-merge.d.ts.map +1 -1
  111. package/dist/property-set-merge.js +130 -29
  112. package/dist/property-set-merge.js.map +1 -1
  113. package/dist/property-value-parser.d.ts +55 -0
  114. package/dist/property-value-parser.d.ts.map +1 -0
  115. package/dist/property-value-parser.js +277 -0
  116. package/dist/property-value-parser.js.map +1 -0
  117. package/dist/quantity-collect.d.ts +42 -3
  118. package/dist/quantity-collect.d.ts.map +1 -1
  119. package/dist/quantity-collect.js +114 -7
  120. package/dist/quantity-collect.js.map +1 -1
  121. package/dist/query-backend-maps.d.ts +5 -8
  122. package/dist/query-backend-maps.d.ts.map +1 -1
  123. package/dist/query-backend-maps.js +155 -15
  124. package/dist/query-backend-maps.js.map +1 -1
  125. package/dist/relationship-extractor.d.ts.map +1 -1
  126. package/dist/relationship-extractor.js +18 -0
  127. package/dist/relationship-extractor.js.map +1 -1
  128. package/dist/scan-entities-balanced.d.ts +38 -0
  129. package/dist/scan-entities-balanced.d.ts.map +1 -0
  130. package/dist/scan-entities-balanced.js +258 -0
  131. package/dist/scan-entities-balanced.js.map +1 -0
  132. package/dist/scan-worker-inline.d.ts +17 -11
  133. package/dist/scan-worker-inline.d.ts.map +1 -1
  134. package/dist/scan-worker-inline.js +9 -235
  135. package/dist/scan-worker-inline.js.map +1 -1
  136. package/dist/scan-worker-source.d.ts +9 -0
  137. package/dist/scan-worker-source.d.ts.map +1 -0
  138. package/dist/scan-worker-source.js +383 -0
  139. package/dist/scan-worker-source.js.map +1 -0
  140. package/dist/spatial-hierarchy-builder.js +3 -3
  141. package/dist/spatial-hierarchy-builder.js.map +1 -1
  142. package/dist/step-lexing.d.ts +2 -0
  143. package/dist/step-lexing.d.ts.map +1 -1
  144. package/dist/step-lexing.js +116 -18
  145. package/dist/step-lexing.js.map +1 -1
  146. package/dist/step-trivia.d.ts +60 -0
  147. package/dist/step-trivia.d.ts.map +1 -0
  148. package/dist/step-trivia.js +63 -0
  149. package/dist/step-trivia.js.map +1 -0
  150. package/dist/tokenizer.d.ts +20 -21
  151. package/dist/tokenizer.d.ts.map +1 -1
  152. package/dist/tokenizer.js +164 -203
  153. package/dist/tokenizer.js.map +1 -1
  154. package/dist/unit-extractor.d.ts +43 -1
  155. package/dist/unit-extractor.d.ts.map +1 -1
  156. package/dist/unit-extractor.js +63 -4
  157. package/dist/unit-extractor.js.map +1 -1
  158. package/dist/worker-parser.d.ts +11 -1
  159. package/dist/worker-parser.d.ts.map +1 -1
  160. package/dist/worker-parser.js +25 -5
  161. package/dist/worker-parser.js.map +1 -1
  162. package/package.json +6 -6
package/dist/tokenizer.js CHANGED
@@ -5,97 +5,44 @@
5
5
  * STEP tokenizer - fast byte-level scanning for entity markers
6
6
  * Leverages Spike 1 approach: ~1,259 MB/s throughput
7
7
  */
8
- import { safeUtf8Decode } from '@ifc-lite/data';
9
- import { countNewlines, opensLiteralOrComment, skipLexical } from './step-lexing.js';
8
+ import { isIndexableExpressId } from './express-id.js';
9
+ import { BalancedEntityScan } from './scan-entities-balanced.js';
10
+ import { countNewlines, opensComment, opensLiteralOrComment, skipComment, skipLexical, skipTrivia, } from './step-lexing.js';
10
11
  export class StepTokenizer {
11
12
  buffer;
12
- position = 0;
13
- lineNumber = 1;
13
+ oversizedIds = 0;
14
+ malformedRecords = 0;
14
15
  constructor(buffer) {
15
16
  this.buffer = buffer;
16
17
  }
18
+ /** Records the last scan refused for an out-of-contract express id
19
+ * (express-id.ts, #3395). Reset per scan; the caller reports it. */
20
+ get oversizedIdCount() { return this.oversizedIds; }
21
+ /** 0 or 1: whether the last `scanEntitiesFast`/`scanEntities` run stopped
22
+ * early on an unclosed `'` string, an unclosed block comment, or a
23
+ * declaration cut off before its own '(' -- never a count of how many,
24
+ * since the scan has no reliable way to resume past the first one it
25
+ * hits. Reset at the start of every scan; the caller reports it. */
26
+ get malformedRecordCount() { return this.malformedRecords; }
17
27
  /**
18
28
  * Scan for all entity declarations (#EXPRESS_ID = TYPE(...))
19
- * Returns entity references without parsing full content
29
+ * Returns entity references without parsing full content.
30
+ *
31
+ * Closes each record on the ')' balancing its argument list. The scan itself
32
+ * lives in `scan-entities-balanced.ts`; only the refusal count comes back
33
+ * here, and it comes back in a `finally` so an abandoned generator still
34
+ * reports what it refused.
20
35
  */
21
36
  *scanEntities() {
22
- this.position = 0;
23
- this.lineNumber = 1;
24
- while (this.position < this.buffer.length) {
25
- // Look for '#' character (entity ID marker)
26
- if (this.buffer[this.position] === 0x23) { // '#'
27
- const startOffset = this.position;
28
- const startLine = this.lineNumber;
29
- // Read express ID
30
- const expressId = this.readExpressId();
31
- if (expressId === null) {
32
- this.position++;
33
- continue;
34
- }
35
- // Skip whitespace
36
- this.skipWhitespace();
37
- // Check for '=' (assignment)
38
- if (this.position >= this.buffer.length || this.buffer[this.position] !== 0x3D) {
39
- this.position++;
40
- continue;
41
- }
42
- this.position++; // Skip '='
43
- // Skip whitespace
44
- this.skipWhitespace();
45
- // Read type name
46
- const type = this.readTypeName();
47
- if (!type) {
48
- this.position++;
49
- continue;
50
- }
51
- // Skip whitespace
52
- this.skipWhitespace();
53
- // Check for '(' (start of parameters)
54
- if (this.position >= this.buffer.length || this.buffer[this.position] !== 0x28) {
55
- this.position++;
56
- continue;
57
- }
58
- // Find matching closing parenthesis to get full entity length
59
- const entityLength = this.findEntityLength(startOffset);
60
- if (entityLength > 0) {
61
- // Step past the whole record, as Rust's next_entity does. Leaving
62
- // `position` at the '(' made this loop re-walk the body, which was
63
- // harmless only while it ignored quotes and comments.
64
- //
65
- // Count from `position`, not from `startOffset`: `position` is on the
66
- // '(' here, and every newline before it was already counted by the
67
- // three skipWhitespace calls above. Counting the whole record instead
68
- // double-counts a newline written between `#1=` and its type name,
69
- // which is ordinary whitespace and legal.
70
- this.lineNumber += countNewlines(this.buffer, this.position, startOffset + entityLength);
71
- this.position = startOffset + entityLength;
72
- yield {
73
- expressId,
74
- type,
75
- offset: startOffset,
76
- length: entityLength,
77
- line: startLine,
78
- };
79
- }
80
- }
81
- else if (this.buffer[this.position] === 0x0A) {
82
- // Newline
83
- this.lineNumber++;
84
- this.position++;
85
- }
86
- else if (opensLiteralOrComment(this.buffer, this.position, this.buffer.length)) {
87
- // A commented-out record satisfies every check above, so a comment has
88
- // to be skipped as a region; a literal has to be skipped so its
89
- // contents cannot look like one. See step-lexing.
90
- const skip = skipLexical(this.buffer, this.position, this.buffer.length);
91
- this.lineNumber += skip.lines;
92
- this.position = skip.next;
93
- if (skip.stop)
94
- return;
95
- }
96
- else {
97
- this.position++;
98
- }
37
+ const scan = new BalancedEntityScan(this.buffer);
38
+ this.oversizedIds = 0;
39
+ this.malformedRecords = 0;
40
+ try {
41
+ yield* scan.run();
42
+ }
43
+ finally {
44
+ this.oversizedIds = scan.oversizedIdCount;
45
+ this.malformedRecords = scan.malformedRecordCount;
99
46
  }
100
47
  }
101
48
  /**
@@ -103,8 +50,8 @@ export class StepTokenizer {
103
50
  * ~5-10x faster for large files, yields length=0 (calculate on-demand)
104
51
  */
105
52
  *scanEntitiesFast() {
106
- this.position = 0;
107
- this.lineNumber = 1;
53
+ this.oversizedIds = 0;
54
+ this.malformedRecords = 0;
108
55
  // Pre-compute common byte codes
109
56
  const HASH = 0x23; // '#'
110
57
  const EQUALS = 0x3D; // '='
@@ -112,6 +59,7 @@ export class StepTokenizer {
112
59
  const SEMICOLON = 0x3B; // ';'
113
60
  const QUOTE = 0x27; // '\''
114
61
  const NEWLINE = 0x0A; // '\n'
62
+ const SLASH = 0x2F; // '/'
115
63
  const buf = this.buffer;
116
64
  const len = buf.length;
117
65
  let pos = 0;
@@ -119,6 +67,22 @@ export class StepTokenizer {
119
67
  // Cache type name strings: IFC files have ~776 unique types repeated
120
68
  // across 8M+ entities. Caching avoids millions of String.fromCharCode allocations.
121
69
  const typeCache = new Map();
70
+ // Set on the way to the single post-loop check at the bottom of this
71
+ // function, not counted at each site: `stopped` for an unclosed string or
72
+ // comment that ran the scan to end of buffer with nothing left to find,
73
+ // `declOpen` while a `#id=TYPE(` header is incomplete. `declOpen` stays
74
+ // armed ONLY when the reason for abandoning is running out of buffer
75
+ // (`pos >= len`); a mismatch with buffer still left (bad byte, oversized
76
+ // id) clears it, because the scan resumes byte-by-byte from wherever it
77
+ // gave up, and a `#ref` token inside the abandoned record's own argument
78
+ // list reads as a fresh, equally incomplete attempt -- one that must not
79
+ // report "cut off" just because nothing later happens to clear it.
80
+ // Per-site increments used to miss whole shapes -- a leading unterminated
81
+ // comment before '=', or a declaration cut off before its own '(' --
82
+ // because each site only knew about its own exit, never the scan's final
83
+ // state.
84
+ let stopped = false;
85
+ let declOpen = false;
122
86
  while (pos < len) {
123
87
  const char = buf[pos];
124
88
  if (char === HASH) {
@@ -141,10 +105,15 @@ export class StepTokenizer {
141
105
  }
142
106
  if (!hasDigits)
143
107
  continue;
144
- // Skip whitespace (inline)
108
+ declOpen = true;
109
+ // Skip whitespace (inline). Kept byte-for-byte in sync with
110
+ // `isSpaceByte` in step-lexing.ts (space, tab, CR, LF, form feed,
111
+ // vertical tab) -- this loop, its two twins below in this method, and
112
+ // the worker's copy in scan-worker-source.ts are the same rule
113
+ // hand-duplicated for speed, not four independent decisions.
145
114
  while (pos < len) {
146
115
  const c = buf[pos];
147
- if (c === 0x20 || c === 0x09 || c === 0x0D) {
116
+ if (c === 0x20 || c === 0x09 || c === 0x0D || c === 0x0C || c === 0x0B) {
148
117
  pos++;
149
118
  }
150
119
  else if (c === NEWLINE) {
@@ -154,14 +123,50 @@ export class StepTokenizer {
154
123
  else
155
124
  break;
156
125
  }
157
- // Check for '='
158
- if (pos >= len || buf[pos] !== EQUALS)
126
+ // 10303-21 allows a comment wherever whitespace is allowed, so
127
+ // `#1 /* was #7 */ =` is a declaration. The inline loop above stays
128
+ // for the common case; this runs only once a comment actually opens,
129
+ // and skipTrivia (step-lexing) then takes the whole run of both.
130
+ if (opensComment(buf, pos, len)) {
131
+ const t = skipTrivia(buf, pos, len);
132
+ line += t.lines;
133
+ pos = t.next;
134
+ if (t.stop) {
135
+ stopped = true;
136
+ break;
137
+ }
138
+ }
139
+ // Check for '='. A byte that is not '=' with buffer left to scan is
140
+ // not a truncation -- clear declOpen so a reference token inside a
141
+ // LATER abandoned record's argument list (see the oversized-id note
142
+ // below) cannot leave it stuck armed with nothing left to clear it.
143
+ if (pos >= len)
144
+ continue;
145
+ if (buf[pos] !== EQUALS) {
146
+ declOpen = false;
159
147
  continue;
148
+ }
160
149
  pos++;
150
+ // Storage contract, not just overflow: see express-id.ts (#3395).
151
+ // Tested only now that `#<digits>[ws]*=` has matched, which is the
152
+ // DECLARATION shape Rust's `EntityScanner` validates before it
153
+ // refuses. Refusing above the '=' check counted references too: the
154
+ // `continue` resumes inside the refused record's argument list
155
+ // (unlike the accepted path, which skips to the terminating ';'), so
156
+ // `#4294967297=IFCWALL(#4294967298,#4294967299,...)` reported three
157
+ // skipped records for the one record actually dropped. A count that
158
+ // overstates is the same class of defect as one that undercounts.
159
+ // Refused for being out of range, not for running out of buffer, so
160
+ // it does not belong to `declOpen`'s "cut off by EOF" story either.
161
+ if (!isIndexableExpressId(expressId)) {
162
+ this.oversizedIds++;
163
+ declOpen = false;
164
+ continue;
165
+ }
161
166
  // Skip whitespace
162
167
  while (pos < len) {
163
168
  const c = buf[pos];
164
- if (c === 0x20 || c === 0x09 || c === 0x0D) {
169
+ if (c === 0x20 || c === 0x09 || c === 0x0D || c === 0x0C || c === 0x0B) {
165
170
  pos++;
166
171
  }
167
172
  else if (c === NEWLINE) {
@@ -171,10 +176,24 @@ export class StepTokenizer {
171
176
  else
172
177
  break;
173
178
  }
174
- // Read type name (inline)
179
+ if (opensComment(buf, pos, len)) {
180
+ const t = skipTrivia(buf, pos, len);
181
+ line += t.lines;
182
+ pos = t.next;
183
+ if (t.stop) {
184
+ stopped = true;
185
+ break;
186
+ }
187
+ }
188
+ // Read type name (inline). Must start A-Z; a bad start byte with
189
+ // buffer left clears declOpen for the same reason as the '=' check.
175
190
  const typeStart = pos;
176
- if (pos >= len || buf[pos] < 0x41 || buf[pos] > 0x5A)
177
- continue; // Must start A-Z
191
+ if (pos >= len)
192
+ continue;
193
+ if (buf[pos] < 0x41 || buf[pos] > 0x5A) {
194
+ declOpen = false;
195
+ continue;
196
+ }
178
197
  while (pos < len) {
179
198
  const c = buf[pos];
180
199
  if ((c >= 0x41 && c <= 0x5A) || (c >= 0x61 && c <= 0x7A) ||
@@ -218,7 +237,7 @@ export class StepTokenizer {
218
237
  // Skip whitespace
219
238
  while (pos < len) {
220
239
  const c = buf[pos];
221
- if (c === 0x20 || c === 0x09 || c === 0x0D) {
240
+ if (c === 0x20 || c === 0x09 || c === 0x0D || c === 0x0C || c === 0x0B) {
222
241
  pos++;
223
242
  }
224
243
  else if (c === NEWLINE) {
@@ -228,11 +247,26 @@ export class StepTokenizer {
228
247
  else
229
248
  break;
230
249
  }
231
- // Check for '('
232
- if (pos >= len || buf[pos] !== LPAREN)
250
+ if (opensComment(buf, pos, len)) {
251
+ const t = skipTrivia(buf, pos, len);
252
+ line += t.lines;
253
+ pos = t.next;
254
+ if (t.stop) {
255
+ stopped = true;
256
+ break;
257
+ }
258
+ }
259
+ // Check for '('. Same EOF-vs-mismatch split as '=' and the type name.
260
+ if (pos >= len)
233
261
  continue;
262
+ if (buf[pos] !== LPAREN) {
263
+ declOpen = false;
264
+ continue;
265
+ }
266
+ declOpen = false; // Header complete: '(' found.
234
267
  // FAST: Skip to semicolon (handling strings)
235
268
  let inString = false;
269
+ let foundTerminator = false;
236
270
  while (pos < len) {
237
271
  const c = buf[pos];
238
272
  if (c === QUOTE) {
@@ -242,11 +276,29 @@ export class StepTokenizer {
242
276
  }
243
277
  inString = !inString;
244
278
  }
279
+ else if (c === SLASH && !inString && opensComment(buf, pos, len)) {
280
+ // The ';' that ends a record can be preceded by a comment holding
281
+ // its own ';'. Take the comment whole -- which also makes the
282
+ // quotes and parens inside it text, the other half of the rule the
283
+ // literal skip above provides in the opposite direction.
284
+ const end = skipComment(buf, pos, len);
285
+ if (end < 0) {
286
+ // Unterminated: this record has no terminator, and neither has
287
+ // anything after it. Drop it and stop, which is the None Rust's
288
+ // find_entity_end returns on the same input.
289
+ pos = len;
290
+ break;
291
+ }
292
+ line += countNewlines(buf, pos, end);
293
+ pos = end;
294
+ continue;
295
+ }
245
296
  else if (c === SEMICOLON && !inString) {
246
297
  // Found end of entity
247
298
  const entityLength = pos - startOffset + 1; // Include semicolon
248
299
  yield { expressId, type, offset: startOffset, length: entityLength, line: startLine };
249
300
  pos++;
301
+ foundTerminator = true;
250
302
  break;
251
303
  }
252
304
  else if (c === NEWLINE) {
@@ -254,6 +306,14 @@ export class StepTokenizer {
254
306
  }
255
307
  pos++;
256
308
  }
309
+ // Ran off the end without an unquoted ';' — usually an unescaped `'`
310
+ // left open, or the unterminated-comment break above; `pos` is
311
+ // already `len`, ending the scan here. Not resynced: with no known
312
+ // terminator, guessing a resume point risks fabricating entities from
313
+ // misaligned bytes. Recorded in `stopped`, not incremented here --
314
+ // see the post-loop check below.
315
+ if (!foundTerminator)
316
+ stopped = true;
257
317
  }
258
318
  else if (char === NEWLINE) {
259
319
  line++;
@@ -268,120 +328,21 @@ export class StepTokenizer {
268
328
  line += skip.lines;
269
329
  pos = skip.next;
270
330
  if (skip.stop) {
271
- this.position = len;
272
- this.lineNumber = line;
273
- return;
274
- }
275
- }
276
- else {
277
- pos++;
278
- }
279
- }
280
- this.position = pos;
281
- this.lineNumber = line;
282
- }
283
- readExpressId() {
284
- let id = 0;
285
- let digits = 0;
286
- let pos = this.position + 1; // Skip '#'
287
- while (pos < this.buffer.length) {
288
- const char = this.buffer[pos];
289
- if (char >= 0x30 && char <= 0x39) { // '0'-'9'
290
- id = id * 10 + (char - 0x30);
291
- digits++;
292
- pos++;
293
- }
294
- else {
295
- break;
296
- }
297
- }
298
- if (digits === 0)
299
- return null;
300
- this.position = pos;
301
- return id;
302
- }
303
- readTypeName() {
304
- let start = this.position;
305
- let end = start;
306
- // Type names start with uppercase letter
307
- if (this.position >= this.buffer.length || this.buffer[this.position] < 0x41 || this.buffer[this.position] > 0x5A) {
308
- return null;
309
- }
310
- while (end < this.buffer.length) {
311
- const char = this.buffer[end];
312
- // Allow letters, numbers, and underscore
313
- if ((char >= 0x41 && char <= 0x5A) || // A-Z
314
- (char >= 0x61 && char <= 0x7A) || // a-z
315
- (char >= 0x30 && char <= 0x39) || // 0-9
316
- char === 0x5F // _
317
- ) {
318
- end++;
319
- }
320
- else {
321
- break;
322
- }
323
- }
324
- if (end === start)
325
- return null;
326
- const typeName = safeUtf8Decode(this.buffer, start, end);
327
- this.position = end;
328
- return typeName;
329
- }
330
- skipWhitespace() {
331
- while (this.position < this.buffer.length) {
332
- const char = this.buffer[this.position];
333
- if (char === 0x20 || char === 0x09 || char === 0x0D || char === 0x0A) { // space, tab, CR, LF
334
- if (char === 0x0A)
335
- this.lineNumber++;
336
- this.position++;
337
- }
338
- else {
339
- break;
340
- }
341
- }
342
- }
343
- findEntityLength(startOffset) {
344
- let pos = this.position;
345
- let depth = 0;
346
- let inString = false;
347
- while (pos < this.buffer.length) {
348
- const char = this.buffer[pos];
349
- if (char === 0x27) { // Single quote (string delimiter)
350
- if (inString) {
351
- // Check for escaped quote ('') - STEP uses doubled quotes
352
- if (pos + 1 < this.buffer.length && this.buffer[pos + 1] === 0x27) {
353
- pos += 2; // Skip escaped quote
354
- continue;
355
- }
356
- inString = false;
357
- }
358
- else {
359
- inString = true;
360
- }
361
- pos++;
362
- continue;
363
- }
364
- if (inString) {
365
- pos++;
366
- continue;
367
- }
368
- if (char === 0x28) { // '('
369
- depth++;
370
- pos++;
371
- }
372
- else if (char === 0x29) { // ')'
373
- depth--;
374
- pos++;
375
- if (depth === 0) {
376
- // Found matching closing parenthesis
377
- return pos - startOffset;
331
+ stopped = true;
332
+ break;
378
333
  }
379
334
  }
380
335
  else {
381
336
  pos++;
382
337
  }
383
338
  }
384
- return 0; // No matching closing parenthesis found
339
+ // ONE post-loop check, not an increment at every exit site above: the
340
+ // scan stopped early if it hit an explicit "no terminator" boundary
341
+ // (`stopped`), or the last `#id=TYPE(` header was cut short before its
342
+ // '(' was found (`declOpen`). Always 0 or 1 -- the scan stops at the
343
+ // first one, so there is nothing further to accumulate.
344
+ if (stopped || declOpen)
345
+ this.malformedRecords = 1;
385
346
  }
386
347
  }
387
348
  //# sourceMappingURL=tokenizer.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"tokenizer.js","sourceRoot":"","sources":["../src/tokenizer.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"tokenizer.js","sourceRoot":"","sources":["../src/tokenizer.ts"],"names":[],"mappings":"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"}
@@ -6,6 +6,8 @@
6
6
  */
7
7
  import type { EntityRef } from './types.js';
8
8
  import type { IfcSourceBytes } from './source-bytes.js';
9
+ import { type RelatedLookup } from './owning-project.js';
10
+ export { resolveOwningIfcProjectId, type RelatedLookup } from './owning-project.js';
9
11
  /**
10
12
  * SI Prefix multipliers, keyed by the members of the `IfcSIPrefix` EXPRESS
11
13
  * enumeration — that enumeration is the authority for which prefixes a unit
@@ -43,6 +45,12 @@ export declare const CONVERSION_BASED_UNIT_FACTORS: Record<string, number>;
43
45
  *
44
46
  * @param source - The IFC file bytes, either raw or behind {@link IfcSourceBytes}
45
47
  * @param entityIndex - Entity index with byId and byType maps
48
+ * @param projectId - Optional express id of the specific `IFCPROJECT` to read
49
+ * units from. Most files declare exactly one, so the default (the file's
50
+ * first `IFCPROJECT`) is correct for the overwhelmingly common case; pass
51
+ * this explicitly when resolving units for an entity that may belong to a
52
+ * later `IFCPROJECT` in a multi-project (federated-merge, see #1332) file
53
+ * — see {@link resolveOwningIfcProjectId}.
46
54
  * @returns Scale factor to apply to length values (e.g., 0.001 for millimeters)
47
55
  */
48
56
  export declare function extractLengthUnitScale(source: Uint8Array | IfcSourceBytes, entityIndex: {
@@ -50,5 +58,39 @@ export declare function extractLengthUnitScale(source: Uint8Array | IfcSourceByt
50
58
  get(expressId: number): EntityRef | undefined;
51
59
  };
52
60
  byType: Map<string, number[]>;
53
- }): number;
61
+ }, projectId?: number): number;
62
+ /**
63
+ * Resolve the length unit scale that applies to ONE entity, correctly for a
64
+ * multi-`IfcProject` file (a {@link MergedExporter} `unitReconciliation: 'auto'`
65
+ * federated export: a model whose length unit differs from the first model's
66
+ * keeps its own `IfcProject`/`IfcUnitAssignment` rather than being rescaled —
67
+ * see that module's docs).
68
+ *
69
+ * {@link extractLengthUnitScale} (and the `dataStore.lengthUnitScale` it feeds)
70
+ * answers for the FIRST `IfcProject` only. That is exactly right for the
71
+ * overwhelmingly common single-project file, but silently wrong for a
72
+ * federated entity that belongs to a LATER project: e.g. a material layer's
73
+ * `LayerThickness` is a raw literal in ITS OWN project's unit, and scaling it
74
+ * by the first project's factor corrupts the value by whatever ratio
75
+ * separates the two units (a millimetre federated model read back with the
76
+ * metres factor turns a 300 mm layer into a fabricated "300 m" one).
77
+ *
78
+ * Resolves the entity's owning project via {@link resolveOwningIfcProjectId} and
79
+ * reads that project's units, falling back to the first project's scale when
80
+ * the walk can't place the entity, OR when the owning project's own
81
+ * `UnitsInContext` declares no `LENGTHUNIT` at all (`UnitsInContext` is
82
+ * OPTIONAL on `IfcContext`, so a federated model can legitimately arrive
83
+ * with none). {@link extractLengthUnitScale} answers an unconfirmed `1.0`
84
+ * for that case too - absence reading as success - which would silently
85
+ * rescale a millimetre-authored value owned by such a project by 1000x
86
+ * instead of taking the file-wide answer, the same safe-miss direction
87
+ * {@link extractLengthUnitScale} already documents for every other ambiguous
88
+ * case.
89
+ */
90
+ export declare function resolveEntityLengthUnitScale(source: Uint8Array | IfcSourceBytes, entityIndex: {
91
+ byId: {
92
+ get(expressId: number): EntityRef | undefined;
93
+ };
94
+ byType: Map<string, number[]>;
95
+ }, relationships: RelatedLookup, expressId: number): number;
54
96
  //# sourceMappingURL=unit-extractor.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"unit-extractor.d.ts","sourceRoot":"","sources":["../src/unit-extractor.ts"],"names":[],"mappings":"AAIA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAE5C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAExD;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,qBAAqB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAiBxD,CAAC;AAEF;;;;;;;GAOG;AACH,eAAO,MAAM,6BAA6B,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAgBhE,CAAC;AAyBF;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,sBAAsB,CACpC,MAAM,EAAE,UAAU,GAAG,cAAc,EACnC,WAAW,EAAE;IAAE,IAAI,EAAE;QAAE,GAAG,CAAC,SAAS,EAAE,MAAM,GAAG,SAAS,GAAG,SAAS,CAAA;KAAE,CAAC;IAAC,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAA;CAAE,GACtG,MAAM,CA8LR"}
1
+ {"version":3,"file":"unit-extractor.d.ts","sourceRoot":"","sources":["../src/unit-extractor.ts"],"names":[],"mappings":"AAIA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAE5C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACxD,OAAO,EAA6B,KAAK,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAGpF,OAAO,EAAE,yBAAyB,EAAE,KAAK,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAEpF;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,qBAAqB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAiBxD,CAAC;AAEF;;;;;;;GAOG;AACH,eAAO,MAAM,6BAA6B,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAgBhE,CAAC;AAyBF;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,wBAAgB,sBAAsB,CACpC,MAAM,EAAE,UAAU,GAAG,cAAc,EACnC,WAAW,EAAE;IAAE,IAAI,EAAE;QAAE,GAAG,CAAC,SAAS,EAAE,MAAM,GAAG,SAAS,GAAG,SAAS,CAAA;KAAE,CAAC;IAAC,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAA;CAAE,EACvG,SAAS,CAAC,EAAE,MAAM,GACjB,MAAM,CAUR;AAuMD;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AACH,wBAAgB,4BAA4B,CAC1C,MAAM,EAAE,UAAU,GAAG,cAAc,EACnC,WAAW,EAAE;IAAE,IAAI,EAAE;QAAE,GAAG,CAAC,SAAS,EAAE,MAAM,GAAG,SAAS,GAAG,SAAS,CAAA;KAAE,CAAC;IAAC,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAA;CAAE,EACvG,aAAa,EAAE,aAAa,EAC5B,SAAS,EAAE,MAAM,GAChB,MAAM,CASR"}