@ifc-lite/parser 1.1.7 → 1.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 (94) hide show
  1. package/LICENSE +373 -0
  2. package/README.md +1 -1
  3. package/dist/classification-extractor.js +3 -3
  4. package/dist/classification-extractor.js.map +1 -1
  5. package/dist/columnar-parser.d.ts +86 -2
  6. package/dist/columnar-parser.d.ts.map +1 -1
  7. package/dist/columnar-parser.js +440 -173
  8. package/dist/columnar-parser.js.map +1 -1
  9. package/dist/entity-extractor.d.ts.map +1 -1
  10. package/dist/entity-extractor.js +23 -11
  11. package/dist/entity-extractor.js.map +1 -1
  12. package/dist/generated/entities.d.ts +3 -2
  13. package/dist/generated/entities.d.ts.map +1 -1
  14. package/dist/generated/entities.js +6 -3
  15. package/dist/generated/entities.js.map +1 -1
  16. package/dist/generated/enums.d.ts.map +1 -1
  17. package/dist/generated/enums.js +0 -3
  18. package/dist/generated/enums.js.map +1 -1
  19. package/dist/generated/index.d.ts +4 -2
  20. package/dist/generated/index.d.ts.map +1 -1
  21. package/dist/generated/index.js +4 -2
  22. package/dist/generated/index.js.map +1 -1
  23. package/dist/generated/schema-registry.d.ts.map +1 -1
  24. package/dist/generated/schema-registry.js +8 -3
  25. package/dist/generated/schema-registry.js.map +1 -1
  26. package/dist/generated/selects.d.ts +3 -0
  27. package/dist/generated/selects.d.ts.map +1 -1
  28. package/dist/generated/selects.js +6 -3
  29. package/dist/generated/selects.js.map +1 -1
  30. package/dist/generated/serializers.d.ts +71 -0
  31. package/dist/generated/serializers.d.ts.map +1 -0
  32. package/dist/generated/serializers.js +236 -0
  33. package/dist/generated/serializers.js.map +1 -0
  34. package/dist/generated/test-compile.d.ts +1 -6
  35. package/dist/generated/test-compile.d.ts.map +1 -1
  36. package/dist/generated/test-compile.js +30 -25
  37. package/dist/generated/test-compile.js.map +1 -1
  38. package/dist/generated/type-ids.d.ts +815 -0
  39. package/dist/generated/type-ids.d.ts.map +1 -0
  40. package/dist/generated/type-ids.js +1669 -0
  41. package/dist/generated/type-ids.js.map +1 -0
  42. package/dist/generated/types.d.ts +9 -542
  43. package/dist/generated/types.d.ts.map +1 -1
  44. package/dist/generated/types.js +6 -497
  45. package/dist/generated/types.js.map +1 -1
  46. package/dist/georef-extractor.js +2 -2
  47. package/dist/georef-extractor.js.map +1 -1
  48. package/dist/index.d.ts +38 -3
  49. package/dist/index.d.ts.map +1 -1
  50. package/dist/index.js +233 -41
  51. package/dist/index.js.map +1 -1
  52. package/dist/material-extractor.js +8 -8
  53. package/dist/material-extractor.js.map +1 -1
  54. package/dist/parser.worker.d.ts +2 -0
  55. package/dist/parser.worker.d.ts.map +1 -0
  56. package/dist/parser.worker.js +43 -0
  57. package/dist/parser.worker.js.map +1 -0
  58. package/dist/property-extractor.d.ts +5 -1
  59. package/dist/property-extractor.d.ts.map +1 -1
  60. package/dist/property-extractor.js +22 -1
  61. package/dist/property-extractor.js.map +1 -1
  62. package/dist/quantity-extractor.d.ts +5 -1
  63. package/dist/quantity-extractor.d.ts.map +1 -1
  64. package/dist/quantity-extractor.js +29 -1
  65. package/dist/quantity-extractor.js.map +1 -1
  66. package/dist/relationship-extractor.d.ts +5 -1
  67. package/dist/relationship-extractor.d.ts.map +1 -1
  68. package/dist/relationship-extractor.js +27 -2
  69. package/dist/relationship-extractor.js.map +1 -1
  70. package/dist/spatial-hierarchy-builder.d.ts +4 -3
  71. package/dist/spatial-hierarchy-builder.d.ts.map +1 -1
  72. package/dist/spatial-hierarchy-builder.js +46 -34
  73. package/dist/spatial-hierarchy-builder.js.map +1 -1
  74. package/dist/style-extractor.d.ts +1 -0
  75. package/dist/style-extractor.d.ts.map +1 -1
  76. package/dist/style-extractor.js +18 -0
  77. package/dist/style-extractor.js.map +1 -1
  78. package/dist/tokenizer.d.ts +11 -0
  79. package/dist/tokenizer.d.ts.map +1 -1
  80. package/dist/tokenizer.js +150 -10
  81. package/dist/tokenizer.js.map +1 -1
  82. package/dist/unit-extractor.d.ts +22 -0
  83. package/dist/unit-extractor.d.ts.map +1 -0
  84. package/dist/unit-extractor.js +205 -0
  85. package/dist/unit-extractor.js.map +1 -0
  86. package/dist/worker-parser.d.ts +28 -0
  87. package/dist/worker-parser.d.ts.map +1 -0
  88. package/dist/worker-parser.js +81 -0
  89. package/dist/worker-parser.js.map +1 -0
  90. package/package.json +9 -8
  91. package/dist/examples/comprehensive-extraction.d.ts +0 -76
  92. package/dist/examples/comprehensive-extraction.d.ts.map +0 -1
  93. package/dist/examples/comprehensive-extraction.js +0 -228
  94. package/dist/examples/comprehensive-extraction.js.map +0 -1
package/dist/tokenizer.js CHANGED
@@ -75,6 +75,145 @@ export class StepTokenizer {
75
75
  }
76
76
  }
77
77
  }
78
+ /**
79
+ * FAST scan - skips to semicolon instead of matching parentheses
80
+ * ~5-10x faster for large files, yields length=0 (calculate on-demand)
81
+ */
82
+ *scanEntitiesFast() {
83
+ this.position = 0;
84
+ this.lineNumber = 1;
85
+ // Pre-compute common byte codes
86
+ const HASH = 0x23; // '#'
87
+ const EQUALS = 0x3D; // '='
88
+ const LPAREN = 0x28; // '('
89
+ const SEMICOLON = 0x3B; // ';'
90
+ const QUOTE = 0x27; // '\''
91
+ const NEWLINE = 0x0A; // '\n'
92
+ const buf = this.buffer;
93
+ const len = buf.length;
94
+ let pos = 0;
95
+ let line = 1;
96
+ while (pos < len) {
97
+ const char = buf[pos];
98
+ if (char === HASH) {
99
+ const startOffset = pos;
100
+ const startLine = line;
101
+ pos++; // Skip '#'
102
+ // Read express ID (inline for speed)
103
+ let expressId = 0;
104
+ let hasDigits = false;
105
+ while (pos < len) {
106
+ const c = buf[pos];
107
+ if (c >= 0x30 && c <= 0x39) { // '0'-'9'
108
+ expressId = expressId * 10 + (c - 0x30);
109
+ hasDigits = true;
110
+ pos++;
111
+ }
112
+ else {
113
+ break;
114
+ }
115
+ }
116
+ if (!hasDigits)
117
+ continue;
118
+ // Skip whitespace (inline)
119
+ while (pos < len) {
120
+ const c = buf[pos];
121
+ if (c === 0x20 || c === 0x09 || c === 0x0D) {
122
+ pos++;
123
+ }
124
+ else if (c === NEWLINE) {
125
+ line++;
126
+ pos++;
127
+ }
128
+ else
129
+ break;
130
+ }
131
+ // Check for '='
132
+ if (pos >= len || buf[pos] !== EQUALS)
133
+ continue;
134
+ pos++;
135
+ // Skip whitespace
136
+ while (pos < len) {
137
+ const c = buf[pos];
138
+ if (c === 0x20 || c === 0x09 || c === 0x0D) {
139
+ pos++;
140
+ }
141
+ else if (c === NEWLINE) {
142
+ line++;
143
+ pos++;
144
+ }
145
+ else
146
+ break;
147
+ }
148
+ // Read type name (inline)
149
+ const typeStart = pos;
150
+ if (pos >= len || buf[pos] < 0x41 || buf[pos] > 0x5A)
151
+ continue; // Must start A-Z
152
+ while (pos < len) {
153
+ const c = buf[pos];
154
+ if ((c >= 0x41 && c <= 0x5A) || (c >= 0x61 && c <= 0x7A) ||
155
+ (c >= 0x30 && c <= 0x39) || c === 0x5F) {
156
+ pos++;
157
+ }
158
+ else {
159
+ break;
160
+ }
161
+ }
162
+ if (pos === typeStart)
163
+ continue;
164
+ // Decode type name
165
+ const type = String.fromCharCode(...buf.subarray(typeStart, pos));
166
+ // Skip whitespace
167
+ while (pos < len) {
168
+ const c = buf[pos];
169
+ if (c === 0x20 || c === 0x09 || c === 0x0D) {
170
+ pos++;
171
+ }
172
+ else if (c === NEWLINE) {
173
+ line++;
174
+ pos++;
175
+ }
176
+ else
177
+ break;
178
+ }
179
+ // Check for '('
180
+ if (pos >= len || buf[pos] !== LPAREN)
181
+ continue;
182
+ // FAST: Skip to semicolon (handling strings)
183
+ let inString = false;
184
+ while (pos < len) {
185
+ const c = buf[pos];
186
+ if (c === QUOTE) {
187
+ if (inString && pos + 1 < len && buf[pos + 1] === QUOTE) {
188
+ pos += 2; // Skip escaped quote
189
+ continue;
190
+ }
191
+ inString = !inString;
192
+ }
193
+ else if (c === SEMICOLON && !inString) {
194
+ // Found end of entity
195
+ const entityLength = pos - startOffset + 1; // Include semicolon
196
+ yield { expressId, type, offset: startOffset, length: entityLength, line: startLine };
197
+ pos++;
198
+ break;
199
+ }
200
+ else if (c === NEWLINE) {
201
+ line++;
202
+ }
203
+ pos++;
204
+ }
205
+ }
206
+ else if (char === NEWLINE) {
207
+ line++;
208
+ pos++;
209
+ }
210
+ else {
211
+ pos++;
212
+ }
213
+ }
214
+ this.position = pos;
215
+ this.lineNumber = line;
216
+ }
78
217
  readExpressId() {
79
218
  let id = 0;
80
219
  let digits = 0;
@@ -139,23 +278,24 @@ export class StepTokenizer {
139
278
  let pos = this.position;
140
279
  let depth = 0;
141
280
  let inString = false;
142
- let escapeNext = false;
143
281
  while (pos < this.buffer.length) {
144
282
  const char = this.buffer[pos];
145
- if (escapeNext) {
146
- escapeNext = false;
147
- pos++;
148
- continue;
149
- }
150
283
  if (char === 0x27) { // Single quote (string delimiter)
151
- inString = !inString;
284
+ if (inString) {
285
+ // Check for escaped quote ('') - STEP uses doubled quotes
286
+ if (pos + 1 < this.buffer.length && this.buffer[pos + 1] === 0x27) {
287
+ pos += 2; // Skip escaped quote
288
+ continue;
289
+ }
290
+ inString = false;
291
+ }
292
+ else {
293
+ inString = true;
294
+ }
152
295
  pos++;
153
296
  continue;
154
297
  }
155
298
  if (inString) {
156
- if (char === 0x5C) { // Backslash (escape)
157
- escapeNext = true;
158
- }
159
299
  pos++;
160
300
  continue;
161
301
  }
@@ -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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"}
@@ -0,0 +1,22 @@
1
+ /**
2
+ * Unit extraction for IFC files
3
+ *
4
+ * Extracts length unit scale factor from IFCPROJECT -> IFCUNITASSIGNMENT -> IFCSIUNIT/IFCCONVERSIONBASEDUNIT
5
+ * Used to convert elevation values and other length measurements to meters.
6
+ */
7
+ import type { EntityRef } from './types.js';
8
+ /**
9
+ * Extract length unit scale factor from IFC file
10
+ *
11
+ * Follows the chain: IFCPROJECT → IFCUNITASSIGNMENT → IFCSIUNIT/IFCCONVERSIONBASEDUNIT
12
+ * Returns the multiplier to convert coordinates to meters.
13
+ *
14
+ * @param source - Raw IFC file bytes
15
+ * @param entityIndex - Entity index with byId and byType maps
16
+ * @returns Scale factor to apply to length values (e.g., 0.001 for millimeters)
17
+ */
18
+ export declare function extractLengthUnitScale(source: Uint8Array, entityIndex: {
19
+ byId: Map<number, EntityRef>;
20
+ byType: Map<string, number[]>;
21
+ }): number;
22
+ //# sourceMappingURL=unit-extractor.d.ts.map
@@ -0,0 +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;AAwC5C;;;;;;;;;GASG;AACH,wBAAgB,sBAAsB,CACpC,MAAM,EAAE,UAAU,EAClB,WAAW,EAAE;IAAE,IAAI,EAAE,GAAG,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;IAAC,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAA;CAAE,GAC3E,MAAM,CAmLR"}
@@ -0,0 +1,205 @@
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 { EntityExtractor } from './entity-extractor.js';
5
+ /**
6
+ * SI Prefix multipliers as defined in IFC specification
7
+ */
8
+ const SI_PREFIX_MULTIPLIERS = {
9
+ 'ATTO': 1e-18,
10
+ 'FEMTO': 1e-15,
11
+ 'PICO': 1e-12,
12
+ 'NANO': 1e-9,
13
+ 'MICRO': 1e-6,
14
+ 'MILLI': 1e-3, // Most common: millimeters
15
+ 'CENTI': 1e-2, // Centimeters
16
+ 'DECI': 1e-1, // Decimeters
17
+ 'DECA': 1e1,
18
+ 'HECTO': 1e2,
19
+ 'KILO': 1e3,
20
+ 'MEGA': 1e6,
21
+ 'GIGA': 1e9,
22
+ 'TERA': 1e12,
23
+ 'PETA': 1e15,
24
+ 'EXA': 1e18,
25
+ };
26
+ /**
27
+ * Known conversion factors for imperial/conversion-based units to meters
28
+ */
29
+ const CONVERSION_BASED_UNIT_FACTORS = {
30
+ 'FOOT': 0.3048,
31
+ 'FEET': 0.3048,
32
+ "'FOOT'": 0.3048,
33
+ 'INCH': 0.0254,
34
+ "'INCH'": 0.0254,
35
+ 'YARD': 0.9144,
36
+ "'YARD'": 0.9144,
37
+ 'MILE': 1609.344,
38
+ "'MILE'": 1609.344,
39
+ };
40
+ /**
41
+ * Extract length unit scale factor from IFC file
42
+ *
43
+ * Follows the chain: IFCPROJECT → IFCUNITASSIGNMENT → IFCSIUNIT/IFCCONVERSIONBASEDUNIT
44
+ * Returns the multiplier to convert coordinates to meters.
45
+ *
46
+ * @param source - Raw IFC file bytes
47
+ * @param entityIndex - Entity index with byId and byType maps
48
+ * @returns Scale factor to apply to length values (e.g., 0.001 for millimeters)
49
+ */
50
+ export function extractLengthUnitScale(source, entityIndex) {
51
+ const extractor = new EntityExtractor(source);
52
+ // Find IFCPROJECT
53
+ const projectIds = entityIndex.byType.get('IFCPROJECT') || [];
54
+ if (projectIds.length === 0) {
55
+ console.warn('[UnitExtractor] No IFCPROJECT found, defaulting to meters');
56
+ return 1.0;
57
+ }
58
+ const projectRef = entityIndex.byId.get(projectIds[0]);
59
+ if (!projectRef) {
60
+ return 1.0;
61
+ }
62
+ const projectEntity = extractor.extractEntity(projectRef);
63
+ if (!projectEntity) {
64
+ return 1.0;
65
+ }
66
+ // IFCPROJECT attributes:
67
+ // [0] GlobalId, [1] OwnerHistory, [2] Name, [3] Description, [4] ObjectType,
68
+ // [5] LongName, [6] Phase, [7] RepresentationContexts, [8] UnitsInContext
69
+ const attrs = projectEntity.attributes || [];
70
+ const unitsRef = attrs[8];
71
+ if (typeof unitsRef !== 'number') {
72
+ console.warn('[UnitExtractor] No UnitsInContext reference, defaulting to meters');
73
+ return 1.0;
74
+ }
75
+ // Resolve IFCUNITASSIGNMENT
76
+ const unitAssignmentRef = entityIndex.byId.get(unitsRef);
77
+ if (!unitAssignmentRef) {
78
+ return 1.0;
79
+ }
80
+ const unitAssignment = extractor.extractEntity(unitAssignmentRef);
81
+ if (!unitAssignment || unitAssignment.type.toUpperCase() !== 'IFCUNITASSIGNMENT') {
82
+ return 1.0;
83
+ }
84
+ // Guard against missing attributes
85
+ if (!unitAssignment.attributes || !Array.isArray(unitAssignment.attributes)) {
86
+ return 1.0;
87
+ }
88
+ // IFCUNITASSIGNMENT has a single attribute: Units (list of references)
89
+ const unitsList = unitAssignment.attributes[0];
90
+ if (!Array.isArray(unitsList)) {
91
+ return 1.0;
92
+ }
93
+ // Search for length unit
94
+ for (const unitRef of unitsList) {
95
+ if (typeof unitRef !== 'number')
96
+ continue;
97
+ const unitEntityRef = entityIndex.byId.get(unitRef);
98
+ if (!unitEntityRef)
99
+ continue;
100
+ const unitEntity = extractor.extractEntity(unitEntityRef);
101
+ if (!unitEntity)
102
+ continue;
103
+ const unitType = unitEntity.type.toUpperCase();
104
+ const unitAttrs = unitEntity.attributes || [];
105
+ // Handle IFCSIUNIT
106
+ if (unitType === 'IFCSIUNIT') {
107
+ // IFCSIUNIT: [0] Dimensions, [1] UnitType, [2] Prefix, [3] Name
108
+ const unitTypeValue = unitAttrs[1];
109
+ // Check if this is a length unit (enum value like .LENGTHUNIT.)
110
+ const isLengthUnit = typeof unitTypeValue === 'string' &&
111
+ unitTypeValue.replace(/\./g, '').toUpperCase() === 'LENGTHUNIT';
112
+ if (!isLengthUnit)
113
+ continue;
114
+ // Extract prefix (can be null/$, enum like .MILLI., or string)
115
+ const prefix = unitAttrs[2];
116
+ if (prefix === null || prefix === undefined || prefix === '$') {
117
+ // No prefix = base meters
118
+ return 1.0;
119
+ }
120
+ // Clean up enum value (remove dots)
121
+ const prefixStr = typeof prefix === 'string'
122
+ ? prefix.replace(/\./g, '').toUpperCase()
123
+ : '';
124
+ const multiplier = SI_PREFIX_MULTIPLIERS[prefixStr];
125
+ if (multiplier !== undefined) {
126
+ console.log(`[UnitExtractor] Found SI unit with prefix ${prefixStr}, scale = ${multiplier}`);
127
+ return multiplier;
128
+ }
129
+ return 1.0;
130
+ }
131
+ // Handle IFCCONVERSIONBASEDUNIT (imperial units)
132
+ if (unitType === 'IFCCONVERSIONBASEDUNIT') {
133
+ // IFCCONVERSIONBASEDUNIT: [0] Dimensions, [1] UnitType, [2] Name, [3] ConversionFactor
134
+ const unitTypeValue = unitAttrs[1];
135
+ const isLengthUnit = typeof unitTypeValue === 'string' &&
136
+ unitTypeValue.replace(/\./g, '').toUpperCase() === 'LENGTHUNIT';
137
+ if (!isLengthUnit)
138
+ continue;
139
+ // Try to get known conversion factor by name
140
+ const unitName = unitAttrs[2];
141
+ if (typeof unitName === 'string') {
142
+ const nameUpper = unitName.toUpperCase();
143
+ const knownFactor = CONVERSION_BASED_UNIT_FACTORS[nameUpper];
144
+ if (knownFactor !== undefined) {
145
+ console.log(`[UnitExtractor] Found conversion-based unit ${unitName}, scale = ${knownFactor}`);
146
+ return knownFactor;
147
+ }
148
+ }
149
+ // Try to extract from ConversionFactor (IFCMEASUREWITHUNIT reference)
150
+ const conversionRef = unitAttrs[3];
151
+ if (typeof conversionRef === 'number') {
152
+ const measureRef = entityIndex.byId.get(conversionRef);
153
+ if (measureRef) {
154
+ const measureEntity = extractor.extractEntity(measureRef);
155
+ if (measureEntity) {
156
+ // IFCMEASUREWITHUNIT: [0] ValueComponent, [1] UnitComponent
157
+ const valueAttr = measureEntity.attributes[0];
158
+ const unitComponentRef = measureEntity.attributes[1];
159
+ let conversionValue;
160
+ if (typeof valueAttr === 'number') {
161
+ conversionValue = valueAttr;
162
+ }
163
+ else if (Array.isArray(valueAttr) && valueAttr.length === 2 && typeof valueAttr[1] === 'number') {
164
+ // Typed value like ['IFCLENGTHMEASURE', 0.3048]
165
+ conversionValue = valueAttr[1];
166
+ }
167
+ if (conversionValue !== undefined && conversionValue > 0) {
168
+ // IMPORTANT: ValueComponent is expressed in UnitComponent's units.
169
+ // If UnitComponent is a prefixed SI unit (e.g., millimeters),
170
+ // we must multiply by that unit's scale factor.
171
+ let unitComponentScale = 1.0;
172
+ if (typeof unitComponentRef === 'number') {
173
+ const unitCompEntityRef = entityIndex.byId.get(unitComponentRef);
174
+ if (unitCompEntityRef) {
175
+ const unitCompEntity = extractor.extractEntity(unitCompEntityRef);
176
+ if (unitCompEntity && unitCompEntity.type.toUpperCase() === 'IFCSIUNIT') {
177
+ // IFCSIUNIT: [0] Dimensions, [1] UnitType, [2] Prefix, [3] Name
178
+ const unitCompAttrs = unitCompEntity.attributes || [];
179
+ const prefix = unitCompAttrs[2];
180
+ if (prefix !== null && prefix !== undefined && prefix !== '$') {
181
+ const prefixStr = typeof prefix === 'string'
182
+ ? prefix.replace(/\./g, '').toUpperCase()
183
+ : '';
184
+ const prefixMultiplier = SI_PREFIX_MULTIPLIERS[prefixStr];
185
+ if (prefixMultiplier !== undefined) {
186
+ unitComponentScale = prefixMultiplier;
187
+ }
188
+ }
189
+ }
190
+ }
191
+ }
192
+ const finalScale = conversionValue * unitComponentScale;
193
+ console.log(`[UnitExtractor] Found conversion factor ${conversionValue} * ${unitComponentScale} = ${finalScale} from IFCMEASUREWITHUNIT`);
194
+ return finalScale;
195
+ }
196
+ }
197
+ }
198
+ }
199
+ }
200
+ }
201
+ // No length unit found, default to meters
202
+ console.warn('[UnitExtractor] No length unit found, defaulting to meters');
203
+ return 1.0;
204
+ }
205
+ //# sourceMappingURL=unit-extractor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"unit-extractor.js","sourceRoot":"","sources":["../src/unit-extractor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,28 @@
1
+ /**
2
+ * Worker-based parser wrapper for parallel data model parsing
3
+ * Spawns a Web Worker to parse IFC data model without blocking main thread
4
+ */
5
+ import type { IfcDataStore } from './columnar-parser.js';
6
+ import type { ParseOptions } from './index.js';
7
+ export interface WorkerParserOptions extends ParseOptions {
8
+ /** Worker URL (default: auto-detect) */
9
+ workerUrl?: string;
10
+ }
11
+ /**
12
+ * Parser that uses Web Worker for true parallel execution
13
+ */
14
+ export declare class WorkerParser {
15
+ private worker;
16
+ private workerUrl;
17
+ constructor(options?: WorkerParserOptions);
18
+ /**
19
+ * Parse IFC file into columnar data store using Web Worker
20
+ * Returns immediately, parsing happens in parallel
21
+ */
22
+ parseColumnar(buffer: ArrayBuffer, options?: ParseOptions): Promise<IfcDataStore>;
23
+ /**
24
+ * Terminate the worker (cleanup)
25
+ */
26
+ terminate(): void;
27
+ }
28
+ //# sourceMappingURL=worker-parser.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"worker-parser.d.ts","sourceRoot":"","sources":["../src/worker-parser.ts"],"names":[],"mappings":"AAIA;;;GAGG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACzD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAO/C,MAAM,WAAW,mBAAoB,SAAQ,YAAY;IACvD,wCAAwC;IACxC,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;GAEG;AACH,qBAAa,YAAY;IACvB,OAAO,CAAC,MAAM,CAAuB;IACrC,OAAO,CAAC,SAAS,CAAS;gBAEd,OAAO,GAAE,mBAAwB;IAK7C;;;OAGG;IACG,aAAa,CACjB,MAAM,EAAE,WAAW,EACnB,OAAO,GAAE,YAAiB,GACzB,OAAO,CAAC,YAAY,CAAC;IAyDxB;;OAEG;IACH,SAAS,IAAI,IAAI;CAMlB"}
@@ -0,0 +1,81 @@
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 worker URL using Vite's worker bundling - this ensures the worker
5
+ // is properly compiled and bundled for production builds
6
+ // @ts-ignore - Vite-specific import syntax
7
+ import ParserWorkerUrl from './parser.worker.ts?worker&url';
8
+ /**
9
+ * Parser that uses Web Worker for true parallel execution
10
+ */
11
+ export class WorkerParser {
12
+ worker = null;
13
+ workerUrl;
14
+ constructor(options = {}) {
15
+ // Use provided worker URL or the Vite-bundled worker URL
16
+ this.workerUrl = options.workerUrl ?? ParserWorkerUrl;
17
+ }
18
+ /**
19
+ * Parse IFC file into columnar data store using Web Worker
20
+ * Returns immediately, parsing happens in parallel
21
+ */
22
+ async parseColumnar(buffer, options = {}) {
23
+ return new Promise((resolve, reject) => {
24
+ // Generate unique ID for this parse request
25
+ const id = `parse_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`;
26
+ // Create worker
27
+ try {
28
+ this.worker = new Worker(this.workerUrl, { type: 'module' });
29
+ }
30
+ catch (error) {
31
+ // Fallback: if worker creation fails, reject
32
+ reject(new Error(`Failed to create worker: ${error}`));
33
+ return;
34
+ }
35
+ // Handle worker messages
36
+ this.worker.onmessage = (e) => {
37
+ const { type, id: msgId, progress, dataStore, error } = e.data;
38
+ if (msgId !== id) {
39
+ return; // Ignore messages for other requests
40
+ }
41
+ switch (type) {
42
+ case 'progress':
43
+ // Forward progress updates
44
+ options.onProgress?.(progress);
45
+ break;
46
+ case 'complete':
47
+ // Clean up worker
48
+ this.worker?.terminate();
49
+ this.worker = null;
50
+ resolve(dataStore);
51
+ break;
52
+ case 'error':
53
+ // Clean up worker
54
+ this.worker?.terminate();
55
+ this.worker = null;
56
+ reject(new Error(error));
57
+ break;
58
+ }
59
+ };
60
+ this.worker.onerror = (error) => {
61
+ // Clean up worker
62
+ this.worker?.terminate();
63
+ this.worker = null;
64
+ reject(new Error(`Worker error: ${error.message}`));
65
+ };
66
+ // Transfer buffer to worker (caller is responsible for cloning if needed)
67
+ // The worker will transfer/detach this buffer, so caller must clone before calling
68
+ this.worker.postMessage({ buffer, id }, [buffer]);
69
+ });
70
+ }
71
+ /**
72
+ * Terminate the worker (cleanup)
73
+ */
74
+ terminate() {
75
+ if (this.worker) {
76
+ this.worker.terminate();
77
+ this.worker = null;
78
+ }
79
+ }
80
+ }
81
+ //# sourceMappingURL=worker-parser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"worker-parser.js","sourceRoot":"","sources":["../src/worker-parser.ts"],"names":[],"mappings":"AAAA;;+DAE+D;AAU/D,2EAA2E;AAC3E,yDAAyD;AACzD,2CAA2C;AAC3C,OAAO,eAAe,MAAM,+BAA+B,CAAC;AAO5D;;GAEG;AACH,MAAM,OAAO,YAAY;IACf,MAAM,GAAkB,IAAI,CAAC;IAC7B,SAAS,CAAS;IAE1B,YAAY,UAA+B,EAAE;QAC3C,yDAAyD;QACzD,IAAI,CAAC,SAAS,GAAG,OAAO,CAAC,SAAS,IAAI,eAAe,CAAC;IACxD,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,aAAa,CACjB,MAAmB,EACnB,UAAwB,EAAE;QAE1B,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YACrC,4CAA4C;YAC5C,MAAM,EAAE,GAAG,SAAS,IAAI,CAAC,GAAG,EAAE,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;YAE5E,gBAAgB;YAChB,IAAI,CAAC;gBACH,IAAI,CAAC,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,SAAS,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC;YAC/D,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,6CAA6C;gBAC7C,MAAM,CAAC,IAAI,KAAK,CAAC,4BAA4B,KAAK,EAAE,CAAC,CAAC,CAAC;gBACvD,OAAO;YACT,CAAC;YAED,yBAAyB;YACzB,IAAI,CAAC,MAAM,CAAC,SAAS,GAAG,CAAC,CAAe,EAAE,EAAE;gBAC1C,MAAM,EAAE,IAAI,EAAE,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,KAAK,EAAE,GAAG,CAAC,CAAC,IAAI,CAAC;gBAE/D,IAAI,KAAK,KAAK,EAAE,EAAE,CAAC;oBACjB,OAAO,CAAC,qCAAqC;gBAC/C,CAAC;gBAED,QAAQ,IAAI,EAAE,CAAC;oBACb,KAAK,UAAU;wBACb,2BAA2B;wBAC3B,OAAO,CAAC,UAAU,EAAE,CAAC,QAAQ,CAAC,CAAC;wBAC/B,MAAM;oBAER,KAAK,UAAU;wBACb,kBAAkB;wBAClB,IAAI,CAAC,MAAM,EAAE,SAAS,EAAE,CAAC;wBACzB,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;wBACnB,OAAO,CAAC,SAAS,CAAC,CAAC;wBACnB,MAAM;oBAER,KAAK,OAAO;wBACV,kBAAkB;wBAClB,IAAI,CAAC,MAAM,EAAE,SAAS,EAAE,CAAC;wBACzB,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;wBACnB,MAAM,CAAC,IAAI,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC;wBACzB,MAAM;gBACV,CAAC;YACH,CAAC,CAAC;YAEF,IAAI,CAAC,MAAM,CAAC,OAAO,GAAG,CAAC,KAAK,EAAE,EAAE;gBAC9B,kBAAkB;gBAClB,IAAI,CAAC,MAAM,EAAE,SAAS,EAAE,CAAC;gBACzB,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;gBACnB,MAAM,CAAC,IAAI,KAAK,CAAC,iBAAiB,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;YACtD,CAAC,CAAC;YAEF,0EAA0E;YAC1E,mFAAmF;YACnF,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC;QACpD,CAAC,CAAC,CAAC;IACL,CAAC;IAED;;OAEG;IACH,SAAS;QACP,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YAChB,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC;YACxB,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;QACrB,CAAC;IACH,CAAC;CACF"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ifc-lite/parser",
3
- "version": "1.1.7",
3
+ "version": "1.2.0",
4
4
  "description": "IFC/STEP parser for IFC-Lite",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -11,12 +11,9 @@
11
11
  "types": "./dist/index.d.ts"
12
12
  }
13
13
  },
14
- "scripts": {
15
- "build": "tsc || true",
16
- "dev": "tsc --watch"
17
- },
18
14
  "dependencies": {
19
- "@ifc-lite/data": "workspace:*"
15
+ "@ifc-lite/data": "^1.1.7",
16
+ "@ifc-lite/ifcx": "^1.2.0"
20
17
  },
21
18
  "devDependencies": {
22
19
  "typescript": "^5.3.0"
@@ -43,5 +40,9 @@
43
40
  "files": [
44
41
  "dist",
45
42
  "README.md"
46
- ]
47
- }
43
+ ],
44
+ "scripts": {
45
+ "build": "tsc || true",
46
+ "dev": "tsc --watch"
47
+ }
48
+ }