@ifc-lite/parser 2.1.7 → 2.1.9

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 (49) hide show
  1. package/dist/classification-extractor.d.ts +1 -1
  2. package/dist/classification-extractor.d.ts.map +1 -1
  3. package/dist/classification-resolver.d.ts +18 -0
  4. package/dist/classification-resolver.d.ts.map +1 -0
  5. package/dist/classification-resolver.js +126 -0
  6. package/dist/classification-resolver.js.map +1 -0
  7. package/dist/columnar-parser-attributes.d.ts +39 -0
  8. package/dist/columnar-parser-attributes.d.ts.map +1 -0
  9. package/dist/columnar-parser-attributes.js +225 -0
  10. package/dist/columnar-parser-attributes.js.map +1 -0
  11. package/dist/columnar-parser-indexes.d.ts +42 -0
  12. package/dist/columnar-parser-indexes.d.ts.map +1 -0
  13. package/dist/columnar-parser-indexes.js +102 -0
  14. package/dist/columnar-parser-indexes.js.map +1 -0
  15. package/dist/columnar-parser-relationships.d.ts +17 -0
  16. package/dist/columnar-parser-relationships.d.ts.map +1 -0
  17. package/dist/columnar-parser-relationships.js +95 -0
  18. package/dist/columnar-parser-relationships.js.map +1 -0
  19. package/dist/columnar-parser.d.ts +6 -21
  20. package/dist/columnar-parser.d.ts.map +1 -1
  21. package/dist/columnar-parser.js +154 -445
  22. package/dist/columnar-parser.js.map +1 -1
  23. package/dist/compact-entity-index.d.ts +1 -0
  24. package/dist/compact-entity-index.d.ts.map +1 -1
  25. package/dist/compact-entity-index.js +52 -0
  26. package/dist/compact-entity-index.js.map +1 -1
  27. package/dist/georef-extractor.d.ts +7 -1
  28. package/dist/georef-extractor.d.ts.map +1 -1
  29. package/dist/georef-extractor.js +29 -5
  30. package/dist/georef-extractor.js.map +1 -1
  31. package/dist/index.d.ts +7 -0
  32. package/dist/index.d.ts.map +1 -1
  33. package/dist/index.js +24 -17
  34. package/dist/index.js.map +1 -1
  35. package/dist/material-extractor.d.ts +1 -1
  36. package/dist/material-extractor.d.ts.map +1 -1
  37. package/dist/material-resolver.d.ts +37 -0
  38. package/dist/material-resolver.d.ts.map +1 -0
  39. package/dist/material-resolver.js +230 -0
  40. package/dist/material-resolver.js.map +1 -0
  41. package/dist/on-demand-extractors.d.ts +4 -51
  42. package/dist/on-demand-extractors.d.ts.map +1 -1
  43. package/dist/on-demand-extractors.js +17 -341
  44. package/dist/on-demand-extractors.js.map +1 -1
  45. package/dist/style-extractor.js.map +1 -1
  46. package/dist/worker-parser.d.ts.map +1 -1
  47. package/dist/worker-parser.js +2 -4
  48. package/dist/worker-parser.js.map +1 -1
  49. package/package.json +1 -1
@@ -16,7 +16,7 @@
16
16
  * - DIN 276 (Germany)
17
17
  * - SfB (Sweden/Denmark)
18
18
  */
19
- import type { IfcEntity } from './entity-extractor';
19
+ import type { IfcEntity } from './entity-extractor.js';
20
20
  export interface Classification {
21
21
  id: number;
22
22
  name: string;
@@ -1 +1 @@
1
- {"version":3,"file":"classification-extractor.d.ts","sourceRoot":"","sources":["../src/classification-extractor.ts"],"names":[],"mappings":"AAIA;;;;;;;;;;;;;;;;;GAiBG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAGpD,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,eAAe,CAAC,EAAE,MAAM,EAAE,CAAC;CAC5B;AAED,MAAM,WAAW,uBAAuB;IACtC,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,yBAAyB;IACxC,cAAc,EAAE,MAAM,CAAC;IACvB,gBAAgB,EAAE,MAAM,CAAC;IACzB,cAAc,EAAE,MAAM,EAAE,CAAC;CAC1B;AAED,MAAM,WAAW,mBAAmB;IAClC,eAAe,EAAE,GAAG,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;IAC7C,wBAAwB,EAAE,GAAG,CAAC,MAAM,EAAE,uBAAuB,CAAC,CAAC;IAC/D,YAAY,EAAE,yBAAyB,EAAE,CAAC;CAC3C;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CACpC,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE,SAAS,CAAC,EAChC,cAAc,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,GACpC,mBAAmB,CAsCrB;AAmED;;GAEG;AACH,wBAAgB,4BAA4B,CAC1C,SAAS,EAAE,MAAM,EACjB,mBAAmB,EAAE,mBAAmB,GACvC,uBAAuB,EAAE,CAc3B;AAED;;GAEG;AACH,wBAAgB,+BAA+B,CAC7C,SAAS,EAAE,MAAM,EACjB,mBAAmB,EAAE,mBAAmB,GACvC,MAAM,GAAG,SAAS,CAGpB;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CACnC,mBAAmB,EAAE,MAAM,EAC3B,mBAAmB,EAAE,mBAAmB,GACvC,MAAM,EAAE,CA8BV;AAED;;GAEG;AACH,wBAAgB,6BAA6B,CAC3C,mBAAmB,EAAE,mBAAmB,GACvC,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAavB;AAED;;GAEG;AACH,wBAAgB,2BAA2B,CACzC,mBAAmB,EAAE,MAAM,EAC3B,mBAAmB,EAAE,mBAAmB,GACvC,MAAM,GAAG,SAAS,CAmBpB"}
1
+ {"version":3,"file":"classification-extractor.d.ts","sourceRoot":"","sources":["../src/classification-extractor.ts"],"names":[],"mappings":"AAIA;;;;;;;;;;;;;;;;;GAiBG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAGvD,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,eAAe,CAAC,EAAE,MAAM,EAAE,CAAC;CAC5B;AAED,MAAM,WAAW,uBAAuB;IACtC,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,yBAAyB;IACxC,cAAc,EAAE,MAAM,CAAC;IACvB,gBAAgB,EAAE,MAAM,CAAC;IACzB,cAAc,EAAE,MAAM,EAAE,CAAC;CAC1B;AAED,MAAM,WAAW,mBAAmB;IAClC,eAAe,EAAE,GAAG,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;IAC7C,wBAAwB,EAAE,GAAG,CAAC,MAAM,EAAE,uBAAuB,CAAC,CAAC;IAC/D,YAAY,EAAE,yBAAyB,EAAE,CAAC;CAC3C;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CACpC,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE,SAAS,CAAC,EAChC,cAAc,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,GACpC,mBAAmB,CAsCrB;AAmED;;GAEG;AACH,wBAAgB,4BAA4B,CAC1C,SAAS,EAAE,MAAM,EACjB,mBAAmB,EAAE,mBAAmB,GACvC,uBAAuB,EAAE,CAc3B;AAED;;GAEG;AACH,wBAAgB,+BAA+B,CAC7C,SAAS,EAAE,MAAM,EACjB,mBAAmB,EAAE,mBAAmB,GACvC,MAAM,GAAG,SAAS,CAGpB;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CACnC,mBAAmB,EAAE,MAAM,EAC3B,mBAAmB,EAAE,mBAAmB,GACvC,MAAM,EAAE,CA8BV;AAED;;GAEG;AACH,wBAAgB,6BAA6B,CAC3C,mBAAmB,EAAE,mBAAmB,GACvC,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAavB;AAED;;GAEG;AACH,wBAAgB,2BAA2B,CACzC,mBAAmB,EAAE,MAAM,EAC3B,mBAAmB,EAAE,mBAAmB,GACvC,MAAM,GAAG,SAAS,CAmBpB"}
@@ -0,0 +1,18 @@
1
+ import type { IfcDataStore } from './columnar-parser.js';
2
+ export interface ClassificationInfo {
3
+ system?: string;
4
+ identification?: string;
5
+ name?: string;
6
+ location?: string;
7
+ description?: string;
8
+ path?: string[];
9
+ }
10
+ /**
11
+ * Extract classifications for a single entity ON-DEMAND.
12
+ * Uses the onDemandClassificationMap built during parsing.
13
+ * Falls back to relationship graph when on-demand map is not available (e.g., server-loaded models).
14
+ * Also checks type-level associations via IfcRelDefinesByType.
15
+ * Returns an array of classification references with system info.
16
+ */
17
+ export declare function extractClassificationsOnDemand(store: IfcDataStore, entityId: number): ClassificationInfo[];
18
+ //# sourceMappingURL=classification-resolver.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"classification-resolver.d.ts","sourceRoot":"","sources":["../src/classification-resolver.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAEzD,MAAM,WAAW,kBAAkB;IAC/B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;CACnB;AAED;;;;;;GAMG;AACH,wBAAgB,8BAA8B,CAC1C,KAAK,EAAE,YAAY,EACnB,QAAQ,EAAE,MAAM,GACjB,kBAAkB,EAAE,CA0EtB"}
@@ -0,0 +1,126 @@
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
+ /**
5
+ * Classification extraction — resolves IfcClassificationReference chains
6
+ * and IfcClassification systems for entity classification lookups.
7
+ */
8
+ import { EntityExtractor } from './entity-extractor.js';
9
+ import { RelationshipType } from '@ifc-lite/data';
10
+ /**
11
+ * Extract classifications for a single entity ON-DEMAND.
12
+ * Uses the onDemandClassificationMap built during parsing.
13
+ * Falls back to relationship graph when on-demand map is not available (e.g., server-loaded models).
14
+ * Also checks type-level associations via IfcRelDefinesByType.
15
+ * Returns an array of classification references with system info.
16
+ */
17
+ export function extractClassificationsOnDemand(store, entityId) {
18
+ let classRefIds;
19
+ if (store.onDemandClassificationMap) {
20
+ classRefIds = store.onDemandClassificationMap.get(entityId);
21
+ }
22
+ else if (store.relationships) {
23
+ // Fallback: use relationship graph (server-loaded models)
24
+ const related = store.relationships.getRelated(entityId, RelationshipType.AssociatesClassification, 'inverse');
25
+ if (related.length > 0)
26
+ classRefIds = related;
27
+ }
28
+ // Also check type-level classifications via IfcRelDefinesByType
29
+ if (store.relationships) {
30
+ const typeIds = store.relationships.getRelated(entityId, RelationshipType.DefinesByType, 'inverse');
31
+ for (const typeId of typeIds) {
32
+ let typeClassRefs;
33
+ if (store.onDemandClassificationMap) {
34
+ typeClassRefs = store.onDemandClassificationMap.get(typeId);
35
+ }
36
+ else {
37
+ const related = store.relationships.getRelated(typeId, RelationshipType.AssociatesClassification, 'inverse');
38
+ if (related.length > 0)
39
+ typeClassRefs = related;
40
+ }
41
+ if (typeClassRefs && typeClassRefs.length > 0) {
42
+ classRefIds = classRefIds ? [...classRefIds, ...typeClassRefs] : [...typeClassRefs];
43
+ }
44
+ }
45
+ }
46
+ if (!classRefIds || classRefIds.length === 0)
47
+ return [];
48
+ if (!store.source?.length)
49
+ return [];
50
+ const extractor = new EntityExtractor(store.source);
51
+ const results = [];
52
+ for (const classRefId of classRefIds) {
53
+ const ref = store.entityIndex.byId.get(classRefId);
54
+ if (!ref)
55
+ continue;
56
+ const entity = extractor.extractEntity(ref);
57
+ if (!entity)
58
+ continue;
59
+ const typeUpper = entity.type.toUpperCase();
60
+ const attrs = entity.attributes || [];
61
+ if (typeUpper === 'IFCCLASSIFICATIONREFERENCE') {
62
+ // IfcClassificationReference: [Location, Identification, Name, ReferencedSource, Description, Sort]
63
+ const info = {
64
+ location: typeof attrs[0] === 'string' ? attrs[0] : undefined,
65
+ identification: typeof attrs[1] === 'string' ? attrs[1] : undefined,
66
+ name: typeof attrs[2] === 'string' ? attrs[2] : undefined,
67
+ description: typeof attrs[4] === 'string' ? attrs[4] : undefined,
68
+ };
69
+ // Walk up to find the classification system name
70
+ const referencedSourceId = typeof attrs[3] === 'number' ? attrs[3] : undefined;
71
+ if (referencedSourceId) {
72
+ const path = walkClassificationChain(store, extractor, referencedSourceId);
73
+ info.system = path.systemName;
74
+ info.path = path.codes;
75
+ }
76
+ results.push(info);
77
+ }
78
+ else if (typeUpper === 'IFCCLASSIFICATION') {
79
+ // IfcClassification: [Source, Edition, EditionDate, Name, Description, Location, ReferenceTokens]
80
+ results.push({
81
+ system: typeof attrs[3] === 'string' ? attrs[3] : undefined,
82
+ name: typeof attrs[3] === 'string' ? attrs[3] : undefined,
83
+ description: typeof attrs[4] === 'string' ? attrs[4] : undefined,
84
+ location: typeof attrs[5] === 'string' ? attrs[5] : undefined,
85
+ });
86
+ }
87
+ }
88
+ return results;
89
+ }
90
+ /**
91
+ * Walk up the IfcClassificationReference chain to find the root IfcClassification system.
92
+ */
93
+ function walkClassificationChain(store, extractor, startId) {
94
+ const codes = [];
95
+ let currentId = startId;
96
+ const visited = new Set();
97
+ while (currentId !== undefined && !visited.has(currentId)) {
98
+ visited.add(currentId);
99
+ const ref = store.entityIndex.byId.get(currentId);
100
+ if (!ref)
101
+ break;
102
+ const entity = extractor.extractEntity(ref);
103
+ if (!entity)
104
+ break;
105
+ const typeUpper = entity.type.toUpperCase();
106
+ const attrs = entity.attributes || [];
107
+ if (typeUpper === 'IFCCLASSIFICATION') {
108
+ // Root: IfcClassification [Source, Edition, EditionDate, Name, ...]
109
+ const systemName = typeof attrs[3] === 'string' ? attrs[3] : undefined;
110
+ return { systemName, codes };
111
+ }
112
+ if (typeUpper === 'IFCCLASSIFICATIONREFERENCE') {
113
+ // IfcClassificationReference [Location, Identification, Name, ReferencedSource, ...]
114
+ const code = typeof attrs[1] === 'string' ? attrs[1] :
115
+ typeof attrs[2] === 'string' ? attrs[2] : undefined;
116
+ if (code)
117
+ codes.unshift(code);
118
+ currentId = typeof attrs[3] === 'number' ? attrs[3] : undefined;
119
+ }
120
+ else {
121
+ break;
122
+ }
123
+ }
124
+ return { codes };
125
+ }
126
+ //# sourceMappingURL=classification-resolver.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"classification-resolver.js","sourceRoot":"","sources":["../src/classification-resolver.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,39 @@
1
+ /**
2
+ * Low-level buffer attribute utilities for columnar parsing.
3
+ *
4
+ * Pure functions that operate on raw Uint8Array buffers to extract
5
+ * STEP entity attributes without TextDecoder overhead.
6
+ */
7
+ import type { EntityRef } from './types.js';
8
+ /**
9
+ * Find the byte range of a quoted string at a specific attribute position in STEP entity bytes.
10
+ * Returns [start, end) byte offsets (excluding quotes), or null if not found.
11
+ *
12
+ * @param buffer - The IFC file buffer
13
+ * @param entityStart - byte offset of the entity
14
+ * @param entityLen - byte length of the entity
15
+ * @param attrIndex - 0-based attribute index (0=GlobalId, 2=Name)
16
+ */
17
+ export declare function findQuotedAttrRange(buffer: Uint8Array, entityStart: number, entityLen: number, attrIndex: number): [number, number] | null;
18
+ /**
19
+ * Skip N commas at depth 0 in STEP bytes.
20
+ */
21
+ export declare function skipCommas(buffer: Uint8Array, start: number, end: number, count: number): number;
22
+ /** Read a #ID entity reference as a number. Returns -1 if not an entity ref. */
23
+ export declare function readRefId(buffer: Uint8Array, pos: number, end: number): [number, number];
24
+ /** Read a list of entity refs (#id1,#id2,...) or a single #id. Returns [ids, newPos]. */
25
+ export declare function readRefList(buffer: Uint8Array, pos: number, end: number): [number[], number];
26
+ /**
27
+ * Batch extract GlobalId (attr[0]) and Name (attr[2]) for many entities using
28
+ * only 2 TextDecoder.decode() calls total (one for all GlobalIds, one for all Names).
29
+ *
30
+ * This is ~100x faster than calling extractEntity() per entity for large batches
31
+ * because it eliminates per-entity TextDecoder overhead which is significant in Firefox.
32
+ *
33
+ * Returns a Map from expressId → { globalId, name }.
34
+ */
35
+ export declare function batchExtractGlobalIdAndName(buffer: Uint8Array, refs: EntityRef[], yieldIfNeeded?: () => Promise<void>): Promise<Map<number, {
36
+ globalId: string;
37
+ name: string;
38
+ }>>;
39
+ //# sourceMappingURL=columnar-parser-attributes.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"columnar-parser-attributes.d.ts","sourceRoot":"","sources":["../src/columnar-parser-attributes.ts"],"names":[],"mappings":"AAIA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAG5C;;;;;;;;GAQG;AACH,wBAAgB,mBAAmB,CAC/B,MAAM,EAAE,UAAU,EAClB,WAAW,EAAE,MAAM,EACnB,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,MAAM,GAClB,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,IAAI,CAiDzB;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,MAAM,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAkBhG;AAED,gFAAgF;AAChF,wBAAgB,SAAS,CAAC,MAAM,EAAE,UAAU,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAYxF;AAED,yFAAyF;AACzF,wBAAgB,WAAW,CAAC,MAAM,EAAE,UAAU,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,CAAC,MAAM,EAAE,EAAE,MAAM,CAAC,CAsB5F;AAED;;;;;;;;GAQG;AACH,wBAAsB,2BAA2B,CAC7C,MAAM,EAAE,UAAU,EAClB,IAAI,EAAE,SAAS,EAAE,EACjB,aAAa,CAAC,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,GACpC,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC,CAAC,CAmF1D"}
@@ -0,0 +1,225 @@
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 { decodeIfcString } from '@ifc-lite/encoding';
5
+ /**
6
+ * Find the byte range of a quoted string at a specific attribute position in STEP entity bytes.
7
+ * Returns [start, end) byte offsets (excluding quotes), or null if not found.
8
+ *
9
+ * @param buffer - The IFC file buffer
10
+ * @param entityStart - byte offset of the entity
11
+ * @param entityLen - byte length of the entity
12
+ * @param attrIndex - 0-based attribute index (0=GlobalId, 2=Name)
13
+ */
14
+ export function findQuotedAttrRange(buffer, entityStart, entityLen, attrIndex) {
15
+ const end = entityStart + entityLen;
16
+ let pos = entityStart;
17
+ // Skip to opening paren '(' after TYPE name
18
+ while (pos < end && buffer[pos] !== 0x28 /* ( */)
19
+ pos++;
20
+ if (pos >= end)
21
+ return null;
22
+ pos++; // skip '('
23
+ // Skip commas to reach the target attribute
24
+ if (attrIndex > 0) {
25
+ let toSkip = attrIndex;
26
+ let depth = 0;
27
+ let inStr = false;
28
+ while (pos < end && toSkip > 0) {
29
+ const ch = buffer[pos];
30
+ if (ch === 0x27 /* ' */) {
31
+ if (inStr && pos + 1 < end && buffer[pos + 1] === 0x27) {
32
+ pos += 2;
33
+ continue;
34
+ }
35
+ inStr = !inStr;
36
+ }
37
+ else if (!inStr) {
38
+ if (ch === 0x28)
39
+ depth++;
40
+ else if (ch === 0x29)
41
+ depth--;
42
+ else if (ch === 0x2C && depth === 0)
43
+ toSkip--;
44
+ }
45
+ pos++;
46
+ }
47
+ }
48
+ // Skip whitespace
49
+ while (pos < end && (buffer[pos] === 0x20 || buffer[pos] === 0x09))
50
+ pos++;
51
+ // Check for quoted string
52
+ if (pos >= end || buffer[pos] !== 0x27 /* ' */)
53
+ return null;
54
+ pos++; // skip opening quote
55
+ const start = pos;
56
+ // Find closing quote (handle escaped quotes '')
57
+ while (pos < end) {
58
+ if (buffer[pos] === 0x27) {
59
+ if (pos + 1 < end && buffer[pos + 1] === 0x27) {
60
+ pos += 2;
61
+ continue;
62
+ }
63
+ break;
64
+ }
65
+ pos++;
66
+ }
67
+ return [start, pos];
68
+ }
69
+ /**
70
+ * Skip N commas at depth 0 in STEP bytes.
71
+ */
72
+ export function skipCommas(buffer, start, end, count) {
73
+ let pos = start;
74
+ let remaining = count;
75
+ let depth = 0;
76
+ let inString = false;
77
+ while (pos < end && remaining > 0) {
78
+ const ch = buffer[pos];
79
+ if (ch === 0x27) {
80
+ if (inString && pos + 1 < end && buffer[pos + 1] === 0x27) {
81
+ pos += 2;
82
+ continue;
83
+ }
84
+ inString = !inString;
85
+ }
86
+ else if (!inString) {
87
+ if (ch === 0x28)
88
+ depth++;
89
+ else if (ch === 0x29)
90
+ depth--;
91
+ else if (ch === 0x2C && depth === 0)
92
+ remaining--;
93
+ }
94
+ pos++;
95
+ }
96
+ return pos;
97
+ }
98
+ /** Read a #ID entity reference as a number. Returns -1 if not an entity ref. */
99
+ export function readRefId(buffer, pos, end) {
100
+ while (pos < end && (buffer[pos] === 0x20 || buffer[pos] === 0x09))
101
+ pos++;
102
+ if (pos < end && buffer[pos] === 0x23) {
103
+ pos++;
104
+ let num = 0;
105
+ while (pos < end && buffer[pos] >= 0x30 && buffer[pos] <= 0x39) {
106
+ num = num * 10 + (buffer[pos] - 0x30);
107
+ pos++;
108
+ }
109
+ return [num, pos];
110
+ }
111
+ return [-1, pos];
112
+ }
113
+ /** Read a list of entity refs (#id1,#id2,...) or a single #id. Returns [ids, newPos]. */
114
+ export function readRefList(buffer, pos, end) {
115
+ while (pos < end && (buffer[pos] === 0x20 || buffer[pos] === 0x09))
116
+ pos++;
117
+ const ids = [];
118
+ if (pos < end && buffer[pos] === 0x28) {
119
+ pos++;
120
+ while (pos < end && buffer[pos] !== 0x29) {
121
+ while (pos < end && (buffer[pos] === 0x20 || buffer[pos] === 0x09 || buffer[pos] === 0x2C))
122
+ pos++;
123
+ if (pos < end && buffer[pos] === 0x23) {
124
+ const [id, np] = readRefId(buffer, pos, end);
125
+ if (id >= 0)
126
+ ids.push(id);
127
+ pos = np;
128
+ }
129
+ else if (pos < end && buffer[pos] !== 0x29) {
130
+ pos++;
131
+ }
132
+ }
133
+ }
134
+ else if (pos < end && buffer[pos] === 0x23) {
135
+ const [id, np] = readRefId(buffer, pos, end);
136
+ if (id >= 0)
137
+ ids.push(id);
138
+ pos = np;
139
+ }
140
+ return [ids, pos];
141
+ }
142
+ /**
143
+ * Batch extract GlobalId (attr[0]) and Name (attr[2]) for many entities using
144
+ * only 2 TextDecoder.decode() calls total (one for all GlobalIds, one for all Names).
145
+ *
146
+ * This is ~100x faster than calling extractEntity() per entity for large batches
147
+ * because it eliminates per-entity TextDecoder overhead which is significant in Firefox.
148
+ *
149
+ * Returns a Map from expressId → { globalId, name }.
150
+ */
151
+ export async function batchExtractGlobalIdAndName(buffer, refs, yieldIfNeeded) {
152
+ const result = new Map();
153
+ if (refs.length === 0)
154
+ return result;
155
+ const CHUNK_SIZE = 2048;
156
+ // Phase 1: Scan byte ranges for GlobalId and Name positions (no string allocation)
157
+ const gidRanges = []; // [start, end) for each entity
158
+ const nameRanges = [];
159
+ const validIndices = []; // indices into refs for entities with valid ranges
160
+ for (let i = 0; i < refs.length; i++) {
161
+ if (yieldIfNeeded && (i & (CHUNK_SIZE - 1)) === 0) {
162
+ await yieldIfNeeded();
163
+ }
164
+ const ref = refs[i];
165
+ const gidRange = findQuotedAttrRange(buffer, ref.byteOffset, ref.byteLength, 0);
166
+ const nameRange = findQuotedAttrRange(buffer, ref.byteOffset, ref.byteLength, 2);
167
+ gidRanges.push(gidRange ?? [0, 0]);
168
+ nameRanges.push(nameRange ?? [0, 0]);
169
+ validIndices.push(i);
170
+ }
171
+ // Phase 2: Concatenate all GlobalId bytes into one buffer, decode once
172
+ // Use null byte (0x00) as separator (never appears in IFC string content)
173
+ let totalGidBytes = 0;
174
+ let totalNameBytes = 0;
175
+ for (let i = 0; i < validIndices.length; i++) {
176
+ if (yieldIfNeeded && (i & (CHUNK_SIZE - 1)) === 0) {
177
+ await yieldIfNeeded();
178
+ }
179
+ const [gs, ge] = gidRanges[i];
180
+ const [ns, ne] = nameRanges[i];
181
+ totalGidBytes += (ge - gs) + 1; // +1 for separator
182
+ totalNameBytes += (ne - ns) + 1;
183
+ }
184
+ const gidBuf = new Uint8Array(totalGidBytes);
185
+ const nameBuf = new Uint8Array(totalNameBytes);
186
+ let gidOffset = 0;
187
+ let nameOffset = 0;
188
+ for (let i = 0; i < validIndices.length; i++) {
189
+ if (yieldIfNeeded && (i & (CHUNK_SIZE - 1)) === 0) {
190
+ await yieldIfNeeded();
191
+ }
192
+ const [gs, ge] = gidRanges[i];
193
+ const [ns, ne] = nameRanges[i];
194
+ if (ge > gs) {
195
+ gidBuf.set(buffer.subarray(gs, ge), gidOffset);
196
+ gidOffset += ge - gs;
197
+ }
198
+ gidBuf[gidOffset++] = 0; // null separator
199
+ if (ne > ns) {
200
+ nameBuf.set(buffer.subarray(ns, ne), nameOffset);
201
+ nameOffset += ne - ns;
202
+ }
203
+ nameBuf[nameOffset++] = 0;
204
+ }
205
+ // Phase 3: Two TextDecoder calls for ALL entities
206
+ const decoder = new TextDecoder();
207
+ const allGids = decoder.decode(gidBuf.subarray(0, gidOffset));
208
+ const allNames = decoder.decode(nameBuf.subarray(0, nameOffset));
209
+ const gids = allGids.split('\0');
210
+ const names = allNames.split('\0');
211
+ // Phase 4: Build result map
212
+ for (let i = 0; i < validIndices.length; i++) {
213
+ if (yieldIfNeeded && (i & (CHUNK_SIZE - 1)) === 0) {
214
+ await yieldIfNeeded();
215
+ }
216
+ const ref = refs[validIndices[i]];
217
+ const rawName = names[i] || '';
218
+ result.set(ref.expressId, {
219
+ globalId: gids[i] || '',
220
+ name: rawName ? decodeIfcString(rawName) : '',
221
+ });
222
+ }
223
+ return result;
224
+ }
225
+ //# sourceMappingURL=columnar-parser-attributes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"columnar-parser-attributes.js","sourceRoot":"","sources":["../src/columnar-parser-attributes.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,42 @@
1
+ /**
2
+ * Index building and type classification for columnar parsing.
3
+ *
4
+ * Pre-computed type sets for O(1) lookups, type-checking predicates,
5
+ * and interface definitions for spatial and entity-by-ID indexes.
6
+ */
7
+ import type { EntityRef } from './types.js';
8
+ import { RelationshipType, QuantityType } from '@ifc-lite/data';
9
+ export interface SpatialIndex {
10
+ queryAABB(bounds: {
11
+ min: [number, number, number];
12
+ max: [number, number, number];
13
+ }): number[];
14
+ raycast(origin: [number, number, number], direction: [number, number, number]): number[];
15
+ }
16
+ /**
17
+ * Entity-by-ID lookup interface. Supports both Map<number, EntityRef> (legacy)
18
+ * and CompactEntityIndex (memory-optimized typed arrays with LRU cache).
19
+ */
20
+ export type EntityByIdIndex = {
21
+ get(expressId: number): EntityRef | undefined;
22
+ has(expressId: number): boolean;
23
+ readonly size: number;
24
+ keys(): IterableIterator<number>;
25
+ values(): IterableIterator<EntityRef>;
26
+ entries(): IterableIterator<[number, EntityRef]>;
27
+ forEach(callback: (value: EntityRef, key: number) => void): void;
28
+ [Symbol.iterator](): IterableIterator<[number, EntityRef]>;
29
+ };
30
+ export declare const GEOMETRY_TYPES: Set<string>;
31
+ export declare const RELATIONSHIP_TYPES: Set<string>;
32
+ export declare const REL_TYPE_MAP: Record<string, RelationshipType>;
33
+ export declare const QUANTITY_TYPE_MAP: Record<string, QuantityType>;
34
+ export declare const SPATIAL_TYPES: Set<string>;
35
+ export declare const HIERARCHY_REL_TYPES: Set<string>;
36
+ export declare const PROPERTY_REL_TYPES: Set<string>;
37
+ export declare const ASSOCIATION_REL_TYPES: Set<string>;
38
+ export declare const SKIP_DISPLAY_ATTRS: Set<string>;
39
+ export declare const PROPERTY_ENTITY_TYPES: Set<string>;
40
+ export declare const PROPERTY_CONTAINER_TYPES: Set<string>;
41
+ export declare function isIfcTypeLikeEntity(typeUpper: string): boolean;
42
+ //# sourceMappingURL=columnar-parser-indexes.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"columnar-parser-indexes.d.ts","sourceRoot":"","sources":["../src/columnar-parser-indexes.ts"],"names":[],"mappings":"AAIA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAC5C,OAAO,EACH,gBAAgB,EAChB,YAAY,EACf,MAAM,gBAAgB,CAAC;AAGxB,MAAM,WAAW,YAAY;IACzB,SAAS,CAAC,MAAM,EAAE;QAAE,GAAG,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;QAAC,GAAG,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAA;KAAE,GAAG,MAAM,EAAE,CAAC;IAC9F,OAAO,CAAC,MAAM,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,SAAS,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,GAAG,MAAM,EAAE,CAAC;CAC5F;AAED;;;GAGG;AACH,MAAM,MAAM,eAAe,GAAG;IAC1B,GAAG,CAAC,SAAS,EAAE,MAAM,GAAG,SAAS,GAAG,SAAS,CAAC;IAC9C,GAAG,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC;IAChC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,IAAI,IAAI,gBAAgB,CAAC,MAAM,CAAC,CAAC;IACjC,MAAM,IAAI,gBAAgB,CAAC,SAAS,CAAC,CAAC;IACtC,OAAO,IAAI,gBAAgB,CAAC,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC,CAAC;IACjD,OAAO,CAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,SAAS,EAAE,GAAG,EAAE,MAAM,KAAK,IAAI,GAAG,IAAI,CAAC;IACjE,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,gBAAgB,CAAC,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC,CAAC;CAC9D,CAAC;AAGF,eAAO,MAAM,cAAc,aAQzB,CAAC;AAIH,eAAO,MAAM,kBAAkB,aAU7B,CAAC;AAIH,eAAO,MAAM,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,gBAAgB,CAgBzD,CAAC;AAEF,eAAO,MAAM,iBAAiB,EAAE,MAAM,CAAC,MAAM,EAAE,YAAY,CAO1D,CAAC;AAGF,eAAO,MAAM,aAAa,aAOxB,CAAC;AAGH,eAAO,MAAM,mBAAmB,aAS9B,CAAC;AAGH,eAAO,MAAM,kBAAkB,aAE7B,CAAC;AAGH,eAAO,MAAM,qBAAqB,aAGhC,CAAC;AAGH,eAAO,MAAM,kBAAkB,aAAsH,CAAC;AAGtJ,eAAO,MAAM,qBAAqB,aAOhC,CAAC;AAEH,eAAO,MAAM,wBAAwB,aAGnC,CAAC;AAEH,wBAAgB,mBAAmB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAE9D"}
@@ -0,0 +1,102 @@
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 { RelationshipType, QuantityType, } from '@ifc-lite/data';
5
+ // Pre-computed type sets for O(1) lookups
6
+ export const GEOMETRY_TYPES = new Set([
7
+ 'IFCWALL', 'IFCWALLSTANDARDCASE', 'IFCDOOR', 'IFCWINDOW', 'IFCSLAB',
8
+ 'IFCCOLUMN', 'IFCBEAM', 'IFCROOF', 'IFCSTAIR', 'IFCSTAIRFLIGHT',
9
+ 'IFCRAILING', 'IFCRAMP', 'IFCRAMPFLIGHT', 'IFCPLATE', 'IFCMEMBER',
10
+ 'IFCCURTAINWALL', 'IFCFOOTING', 'IFCPILE', 'IFCBUILDINGELEMENTPROXY',
11
+ 'IFCFURNISHINGELEMENT', 'IFCFLOWSEGMENT', 'IFCFLOWTERMINAL',
12
+ 'IFCFLOWCONTROLLER', 'IFCFLOWFITTING', 'IFCSPACE', 'IFCOPENINGELEMENT',
13
+ 'IFCSITE', 'IFCBUILDING', 'IFCBUILDINGSTOREY',
14
+ ]);
15
+ // IMPORTANT: This set MUST include ALL RelationshipType enum values to prevent semantic loss
16
+ // Missing types will be skipped during parsing, causing incomplete relationship graphs
17
+ export const RELATIONSHIP_TYPES = new Set([
18
+ 'IFCRELCONTAINEDINSPATIALSTRUCTURE', 'IFCRELAGGREGATES',
19
+ 'IFCRELDEFINESBYPROPERTIES', 'IFCRELDEFINESBYTYPE',
20
+ 'IFCRELASSOCIATESMATERIAL', 'IFCRELASSOCIATESCLASSIFICATION',
21
+ 'IFCRELASSOCIATESDOCUMENT',
22
+ 'IFCRELVOIDSELEMENT', 'IFCRELFILLSELEMENT',
23
+ 'IFCRELCONNECTSPATHELEMENTS', 'IFCRELCONNECTSELEMENTS',
24
+ 'IFCRELSPACEBOUNDARY',
25
+ 'IFCRELASSIGNSTOGROUP', 'IFCRELASSIGNSTOPRODUCT',
26
+ 'IFCRELREFERENCEDINSPATIALSTRUCTURE',
27
+ ]);
28
+ // Map IFC relationship type strings to RelationshipType enum
29
+ // MUST cover ALL RelationshipType enum values (15 types total)
30
+ export const REL_TYPE_MAP = {
31
+ 'IFCRELCONTAINEDINSPATIALSTRUCTURE': RelationshipType.ContainsElements,
32
+ 'IFCRELAGGREGATES': RelationshipType.Aggregates,
33
+ 'IFCRELDEFINESBYPROPERTIES': RelationshipType.DefinesByProperties,
34
+ 'IFCRELDEFINESBYTYPE': RelationshipType.DefinesByType,
35
+ 'IFCRELASSOCIATESMATERIAL': RelationshipType.AssociatesMaterial,
36
+ 'IFCRELASSOCIATESCLASSIFICATION': RelationshipType.AssociatesClassification,
37
+ 'IFCRELASSOCIATESDOCUMENT': RelationshipType.AssociatesDocument,
38
+ 'IFCRELVOIDSELEMENT': RelationshipType.VoidsElement,
39
+ 'IFCRELFILLSELEMENT': RelationshipType.FillsElement,
40
+ 'IFCRELCONNECTSPATHELEMENTS': RelationshipType.ConnectsPathElements,
41
+ 'IFCRELCONNECTSELEMENTS': RelationshipType.ConnectsElements,
42
+ 'IFCRELSPACEBOUNDARY': RelationshipType.SpaceBoundary,
43
+ 'IFCRELASSIGNSTOGROUP': RelationshipType.AssignsToGroup,
44
+ 'IFCRELASSIGNSTOPRODUCT': RelationshipType.AssignsToProduct,
45
+ 'IFCRELREFERENCEDINSPATIALSTRUCTURE': RelationshipType.ReferencedInSpatialStructure,
46
+ };
47
+ export const QUANTITY_TYPE_MAP = {
48
+ 'IFCQUANTITYLENGTH': QuantityType.Length,
49
+ 'IFCQUANTITYAREA': QuantityType.Area,
50
+ 'IFCQUANTITYVOLUME': QuantityType.Volume,
51
+ 'IFCQUANTITYCOUNT': QuantityType.Count,
52
+ 'IFCQUANTITYWEIGHT': QuantityType.Weight,
53
+ 'IFCQUANTITYTIME': QuantityType.Time,
54
+ };
55
+ // Types needed for spatial hierarchy (small subset)
56
+ export const SPATIAL_TYPES = new Set([
57
+ 'IFCPROJECT', 'IFCSITE', 'IFCBUILDING', 'IFCBUILDINGSTOREY', 'IFCSPACE',
58
+ 'IFCFACILITY', 'IFCFACILITYPART',
59
+ 'IFCBRIDGE', 'IFCBRIDGEPART',
60
+ 'IFCROAD', 'IFCROADPART',
61
+ 'IFCRAILWAY', 'IFCRAILWAYPART',
62
+ 'IFCMARINEFACILITY',
63
+ ]);
64
+ // Relationship types needed for hierarchy and structural relationships
65
+ export const HIERARCHY_REL_TYPES = new Set([
66
+ 'IFCRELAGGREGATES', 'IFCRELCONTAINEDINSPATIALSTRUCTURE',
67
+ 'IFCRELDEFINESBYTYPE',
68
+ // Structural relationships (voids, fills, connections, groups)
69
+ 'IFCRELVOIDSELEMENT', 'IFCRELFILLSELEMENT',
70
+ 'IFCRELCONNECTSPATHELEMENTS', 'IFCRELCONNECTSELEMENTS',
71
+ 'IFCRELSPACEBOUNDARY',
72
+ 'IFCRELASSIGNSTOGROUP', 'IFCRELASSIGNSTOPRODUCT',
73
+ 'IFCRELREFERENCEDINSPATIALSTRUCTURE',
74
+ ]);
75
+ // Relationship types for on-demand property loading
76
+ export const PROPERTY_REL_TYPES = new Set([
77
+ 'IFCRELDEFINESBYPROPERTIES',
78
+ ]);
79
+ // Relationship types for on-demand classification/material loading
80
+ export const ASSOCIATION_REL_TYPES = new Set([
81
+ 'IFCRELASSOCIATESCLASSIFICATION', 'IFCRELASSOCIATESMATERIAL',
82
+ 'IFCRELASSOCIATESDOCUMENT',
83
+ ]);
84
+ // Attributes to skip in extractAllEntityAttributes (shown elsewhere or non-displayable)
85
+ export const SKIP_DISPLAY_ATTRS = new Set(['GlobalId', 'OwnerHistory', 'ObjectPlacement', 'Representation', 'HasPropertySets', 'RepresentationMaps']);
86
+ // Property-related entity types for on-demand extraction
87
+ export const PROPERTY_ENTITY_TYPES = new Set([
88
+ 'IFCPROPERTYSET', 'IFCELEMENTQUANTITY',
89
+ 'IFCPROPERTYSINGLEVALUE', 'IFCPROPERTYENUMERATEDVALUE',
90
+ 'IFCPROPERTYBOUNDEDVALUE', 'IFCPROPERTYTABLEVALUE',
91
+ 'IFCPROPERTYLISTVALUE', 'IFCPROPERTYREFERENCEVALUE',
92
+ 'IFCQUANTITYLENGTH', 'IFCQUANTITYAREA', 'IFCQUANTITYVOLUME',
93
+ 'IFCQUANTITYCOUNT', 'IFCQUANTITYWEIGHT', 'IFCQUANTITYTIME',
94
+ ]);
95
+ export const PROPERTY_CONTAINER_TYPES = new Set([
96
+ 'IFCPROPERTYSET',
97
+ 'IFCELEMENTQUANTITY',
98
+ ]);
99
+ export function isIfcTypeLikeEntity(typeUpper) {
100
+ return typeUpper.endsWith('TYPE') || typeUpper.endsWith('STYLE');
101
+ }
102
+ //# sourceMappingURL=columnar-parser-indexes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"columnar-parser-indexes.js","sourceRoot":"","sources":["../src/columnar-parser-indexes.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ /**
2
+ * Extract relatingObject and relatedObjects from a relationship entity using byte-level scanning.
3
+ * No TextDecoder needed - only extracts numeric entity IDs.
4
+ */
5
+ export declare function extractRelFast(buffer: Uint8Array, byteOffset: number, byteLength: number, typeUpper: string): {
6
+ relatingObject: number;
7
+ relatedObjects: number[];
8
+ } | null;
9
+ /**
10
+ * Extract property rel data: attr[4]=relatedObjects, attr[5]=relatingDef.
11
+ * Numbers only, no TextDecoder.
12
+ */
13
+ export declare function extractPropertyRelFast(buffer: Uint8Array, byteOffset: number, byteLength: number): {
14
+ relatedObjects: number[];
15
+ relatingDef: number;
16
+ } | null;
17
+ //# sourceMappingURL=columnar-parser-relationships.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"columnar-parser-relationships.d.ts","sourceRoot":"","sources":["../src/columnar-parser-relationships.ts"],"names":[],"mappings":"AAaA;;;GAGG;AACH,wBAAgB,cAAc,CAC1B,MAAM,EAAE,UAAU,EAClB,UAAU,EAAE,MAAM,EAClB,UAAU,EAAE,MAAM,EAClB,SAAS,EAAE,MAAM,GAClB;IAAE,cAAc,EAAE,MAAM,CAAC;IAAC,cAAc,EAAE,MAAM,EAAE,CAAA;CAAE,GAAG,IAAI,CA+C7D;AAED;;;GAGG;AACH,wBAAgB,sBAAsB,CAClC,MAAM,EAAE,UAAU,EAClB,UAAU,EAAE,MAAM,EAClB,UAAU,EAAE,MAAM,GACnB;IAAE,cAAc,EAAE,MAAM,EAAE,CAAC;IAAC,WAAW,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAkB1D"}