@ifc-lite/encoding 1.14.3 → 1.14.5

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.
package/dist/guid.d.ts ADDED
@@ -0,0 +1,7 @@
1
+ export declare function uuidToIfcGuid(uuid: string): string;
2
+ export declare function ifcGuidToUuid(ifcGuid: string): string;
3
+ export declare function generateIfcGuid(): string;
4
+ export declare function generateUuid(): string;
5
+ export declare function isValidIfcGuid(ifcGuid: string): boolean;
6
+ export declare function isValidUuid(uuid: string): boolean;
7
+ //# sourceMappingURL=guid.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"guid.d.ts","sourceRoot":"","sources":["../src/guid.ts"],"names":[],"mappings":"AAmBA,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CA2BlD;AAED,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAmCrD;AAED,wBAAgB,eAAe,IAAI,MAAM,CAExC;AAED,wBAAgB,YAAY,IAAI,MAAM,CAuBrC;AAED,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAiBvD;AAED,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAOjD"}
package/dist/guid.js ADDED
@@ -0,0 +1,115 @@
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
+ * IFC GUID (IfcGloballyUniqueId) conversion utilities.
6
+ *
7
+ * IFC uses a 22-character base64 encoding of a 128-bit UUID using the custom
8
+ * buildingSMART alphabet. This module owns the canonical encode/decode and
9
+ * validation logic for that representation across the repo.
10
+ */
11
+ const IFC_GUID_CHARS = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz_$';
12
+ const IFC_GUID_CHAR_TO_VALUE = {};
13
+ for (let i = 0; i < IFC_GUID_CHARS.length; i++) {
14
+ IFC_GUID_CHAR_TO_VALUE[IFC_GUID_CHARS[i]] = i;
15
+ }
16
+ export function uuidToIfcGuid(uuid) {
17
+ const hex = uuid.replace(/-/g, '').toUpperCase();
18
+ if (hex.length !== 32) {
19
+ throw new Error(`Invalid UUID: expected 32 hex characters, got ${hex.length}`);
20
+ }
21
+ const bytes = new Uint8Array(16);
22
+ for (let i = 0; i < 16; i++) {
23
+ bytes[i] = parseInt(hex.substring(i * 2, i * 2 + 2), 16);
24
+ }
25
+ let result = '';
26
+ result += IFC_GUID_CHARS[(bytes[0] >> 6) & 0x03];
27
+ result += IFC_GUID_CHARS[bytes[0] & 0x3F];
28
+ for (let i = 1; i < 16; i += 3) {
29
+ const b0 = bytes[i] || 0;
30
+ const b1 = bytes[i + 1] || 0;
31
+ const b2 = bytes[i + 2] || 0;
32
+ result += IFC_GUID_CHARS[(b0 >> 2) & 0x3F];
33
+ result += IFC_GUID_CHARS[((b0 & 0x03) << 4) | ((b1 >> 4) & 0x0F)];
34
+ result += IFC_GUID_CHARS[((b1 & 0x0F) << 2) | ((b2 >> 6) & 0x03)];
35
+ result += IFC_GUID_CHARS[b2 & 0x3F];
36
+ }
37
+ return result;
38
+ }
39
+ export function ifcGuidToUuid(ifcGuid) {
40
+ if (ifcGuid.length !== 22) {
41
+ throw new Error(`Invalid IFC GUID: expected 22 characters, got ${ifcGuid.length}`);
42
+ }
43
+ const values = [];
44
+ for (const char of ifcGuid) {
45
+ const value = IFC_GUID_CHAR_TO_VALUE[char];
46
+ if (value === undefined) {
47
+ throw new Error(`Invalid IFC GUID character: ${char}`);
48
+ }
49
+ values.push(value);
50
+ }
51
+ const bytes = new Uint8Array(16);
52
+ bytes[0] = ((values[0] & 0x03) << 6) | (values[1] & 0x3F);
53
+ let byteIndex = 1;
54
+ for (let i = 2; i < 22; i += 4) {
55
+ const v0 = values[i];
56
+ const v1 = values[i + 1];
57
+ const v2 = values[i + 2];
58
+ const v3 = values[i + 3];
59
+ bytes[byteIndex++] = ((v0 & 0x3F) << 2) | ((v1 >> 4) & 0x03);
60
+ bytes[byteIndex++] = ((v1 & 0x0F) << 4) | ((v2 >> 2) & 0x0F);
61
+ bytes[byteIndex++] = ((v2 & 0x03) << 6) | (v3 & 0x3F);
62
+ }
63
+ let hex = '';
64
+ for (const byte of bytes) {
65
+ hex += byte.toString(16).padStart(2, '0');
66
+ }
67
+ return `${hex.substring(0, 8)}-${hex.substring(8, 12)}-${hex.substring(12, 16)}-${hex.substring(16, 20)}-${hex.substring(20, 32)}`.toLowerCase();
68
+ }
69
+ export function generateIfcGuid() {
70
+ return uuidToIfcGuid(generateUuid());
71
+ }
72
+ export function generateUuid() {
73
+ if (typeof crypto !== 'undefined' && crypto.randomUUID) {
74
+ return crypto.randomUUID();
75
+ }
76
+ const bytes = new Uint8Array(16);
77
+ if (typeof crypto !== 'undefined' && crypto.getRandomValues) {
78
+ crypto.getRandomValues(bytes);
79
+ }
80
+ else {
81
+ for (let i = 0; i < 16; i++) {
82
+ bytes[i] = Math.floor(Math.random() * 256);
83
+ }
84
+ }
85
+ bytes[6] = (bytes[6] & 0x0F) | 0x40;
86
+ bytes[8] = (bytes[8] & 0x3F) | 0x80;
87
+ let hex = '';
88
+ for (const byte of bytes) {
89
+ hex += byte.toString(16).padStart(2, '0');
90
+ }
91
+ return `${hex.substring(0, 8)}-${hex.substring(8, 12)}-${hex.substring(12, 16)}-${hex.substring(16, 20)}-${hex.substring(20, 32)}`;
92
+ }
93
+ export function isValidIfcGuid(ifcGuid) {
94
+ if (typeof ifcGuid !== 'string' || ifcGuid.length !== 22) {
95
+ return false;
96
+ }
97
+ const firstCharValue = IFC_GUID_CHAR_TO_VALUE[ifcGuid[0]];
98
+ if (firstCharValue === undefined || firstCharValue > 3) {
99
+ return false;
100
+ }
101
+ for (let i = 1; i < ifcGuid.length; i++) {
102
+ if (IFC_GUID_CHAR_TO_VALUE[ifcGuid[i]] === undefined) {
103
+ return false;
104
+ }
105
+ }
106
+ return true;
107
+ }
108
+ export function isValidUuid(uuid) {
109
+ if (typeof uuid !== 'string') {
110
+ return false;
111
+ }
112
+ const uuidRegex = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;
113
+ return uuidRegex.test(uuid);
114
+ }
115
+ //# sourceMappingURL=guid.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"guid.js","sourceRoot":"","sources":["../src/guid.ts"],"names":[],"mappings":"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"}
@@ -5,7 +5,16 @@
5
5
  * - \X4\XXXXXXXX\X0\ - Unicode 4-byte hex for chars outside BMP
6
6
  * - \X\XX\ - ISO-8859-1 hex encoding
7
7
  * - \S\X - Extended ASCII with escape
8
- * - \P..\ - Code page switches (stripped)
8
+ * - \P..\ - Code page switches (supported as directives and removed)
9
9
  */
10
10
  export declare function decodeIfcString(str: string): string;
11
+ /**
12
+ * Encode a Unicode string to IFC STEP string escapes.
13
+ *
14
+ * - Printable ASCII (32..126) is kept as-is.
15
+ * - 8-bit values are encoded as \X\HH.
16
+ * - BMP values are encoded as \X2\HHHH\X0\.
17
+ * - Non-BMP values are encoded as \X4\HHHHHHHH\X0\.
18
+ */
19
+ export declare function encodeIfcString(str: string): string;
11
20
  //# sourceMappingURL=ifc-string.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"ifc-string.d.ts","sourceRoot":"","sources":["../src/ifc-string.ts"],"names":[],"mappings":"AAIA;;;;;;;;GAQG;AACH,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CA4CnD"}
1
+ {"version":3,"file":"ifc-string.d.ts","sourceRoot":"","sources":["../src/ifc-string.ts"],"names":[],"mappings":"AAIA;;;;;;;;GAQG;AACH,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAwEnD;AAED;;;;;;;GAOG;AACH,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CA6BnD"}
@@ -8,45 +8,104 @@
8
8
  * - \X4\XXXXXXXX\X0\ - Unicode 4-byte hex for chars outside BMP
9
9
  * - \X\XX\ - ISO-8859-1 hex encoding
10
10
  * - \S\X - Extended ASCII with escape
11
- * - \P..\ - Code page switches (stripped)
11
+ * - \P..\ - Code page switches (supported as directives and removed)
12
12
  */
13
13
  export function decodeIfcString(str) {
14
14
  if (!str || typeof str !== 'string')
15
15
  return str;
16
- let result = str;
17
- // Decode \X2\XXXX\X0\ patterns (Unicode 2-byte hex, can have multiple chars)
18
- result = result.replace(/\\X2\\([0-9A-Fa-f]+)\\X0\\/g, (_, hex) => {
19
- let decoded = '';
20
- for (let i = 0; i < hex.length; i += 4) {
21
- const charCode = parseInt(hex.substring(i, i + 4), 16);
22
- if (!isNaN(charCode)) {
23
- decoded += String.fromCharCode(charCode);
16
+ let result = '';
17
+ let i = 0;
18
+ while (i < str.length) {
19
+ if (str[i] !== '\\') {
20
+ result += str[i];
21
+ i += 1;
22
+ continue;
23
+ }
24
+ // Handle code page directives like \PA\, \PB\, ... by consuming them.
25
+ if (str[i + 1] === 'P' && str[i + 3] === '\\') {
26
+ i += 4;
27
+ continue;
28
+ }
29
+ // Handle \S\X where byte value is ord(X) + 128 in ISO-8859-1.
30
+ if (str[i + 1] === 'S' && str[i + 2] === '\\' && i + 3 < str.length) {
31
+ result += String.fromCharCode(str.charCodeAt(i + 3) + 128);
32
+ i += 4;
33
+ continue;
34
+ }
35
+ // Handle \X\HH (8-bit value from ISO 10646 row 0 / ISO-8859-1 overlap).
36
+ if (str[i + 1] === 'X' && str[i + 2] === '\\' && i + 5 <= str.length) {
37
+ const hex = str.slice(i + 3, i + 5);
38
+ if (/^[0-9A-Fa-f]{2}$/.test(hex)) {
39
+ result += String.fromCharCode(parseInt(hex, 16));
40
+ i += 5;
41
+ continue;
24
42
  }
25
43
  }
26
- return decoded;
27
- });
28
- // Decode \X4\XXXXXXXX\X0\ patterns (Unicode 4-byte hex for chars outside BMP)
29
- result = result.replace(/\\X4\\([0-9A-Fa-f]+)\\X0\\/g, (_, hex) => {
30
- let decoded = '';
31
- for (let i = 0; i < hex.length; i += 8) {
32
- const codePoint = parseInt(hex.substring(i, i + 8), 16);
33
- if (!isNaN(codePoint)) {
34
- decoded += String.fromCodePoint(codePoint);
44
+ // Handle \X2\....\X0\ (UTF-16 hex code units, 4 chars each).
45
+ if (str.startsWith('\\X2\\', i)) {
46
+ const end = str.indexOf('\\X0\\', i + 4);
47
+ if (end !== -1) {
48
+ const hex = str.slice(i + 4, end);
49
+ if (hex.length % 4 === 0 && /^[0-9A-Fa-f]+$/.test(hex)) {
50
+ for (let j = 0; j < hex.length; j += 4) {
51
+ result += String.fromCharCode(parseInt(hex.slice(j, j + 4), 16));
52
+ }
53
+ i = end + 4;
54
+ continue;
55
+ }
35
56
  }
36
57
  }
37
- return decoded;
38
- });
39
- // Decode \X\XX\ patterns (ISO-8859-1 single byte)
40
- result = result.replace(/\\X\\([0-9A-Fa-f]{2})/g, (_, hex) => {
41
- const charCode = parseInt(hex, 16);
42
- return !isNaN(charCode) ? String.fromCharCode(charCode) : '';
43
- });
44
- // Decode \S\X patterns (Latin extended, offset by 128)
45
- result = result.replace(/\\S\\(.)/g, (_, char) => {
46
- return String.fromCharCode(char.charCodeAt(0) + 128);
47
- });
48
- // Decode \P..\ code page switches (simplified - just remove them)
49
- result = result.replace(/\\P[A-Z]?\\/g, '');
58
+ // Handle \X4\........\X0\ (Unicode scalar values, 8 hex digits each).
59
+ if (str.startsWith('\\X4\\', i)) {
60
+ const end = str.indexOf('\\X0\\', i + 4);
61
+ if (end !== -1) {
62
+ const hex = str.slice(i + 4, end);
63
+ if (hex.length % 8 === 0 && /^[0-9A-Fa-f]+$/.test(hex)) {
64
+ for (let j = 0; j < hex.length; j += 8) {
65
+ result += String.fromCodePoint(parseInt(hex.slice(j, j + 8), 16));
66
+ }
67
+ i = end + 4;
68
+ continue;
69
+ }
70
+ }
71
+ }
72
+ // Unknown escape sequence: keep the backslash and move on.
73
+ result += str[i];
74
+ i += 1;
75
+ }
50
76
  return result;
51
77
  }
78
+ /**
79
+ * Encode a Unicode string to IFC STEP string escapes.
80
+ *
81
+ * - Printable ASCII (32..126) is kept as-is.
82
+ * - 8-bit values are encoded as \X\HH.
83
+ * - BMP values are encoded as \X2\HHHH\X0\.
84
+ * - Non-BMP values are encoded as \X4\HHHHHHHH\X0\.
85
+ */
86
+ export function encodeIfcString(str) {
87
+ if (!str || typeof str !== 'string')
88
+ return str;
89
+ let encoded = '';
90
+ for (const ch of str) {
91
+ const codePoint = ch.codePointAt(0);
92
+ if (codePoint === undefined) {
93
+ continue;
94
+ }
95
+ if (codePoint >= 32 && codePoint <= 126 && ch !== '\\') {
96
+ encoded += ch;
97
+ continue;
98
+ }
99
+ if (codePoint <= 0xFF) {
100
+ encoded += `\\X\\${codePoint.toString(16).toUpperCase().padStart(2, '0')}`;
101
+ continue;
102
+ }
103
+ if (codePoint <= 0xFFFF) {
104
+ encoded += `\\X2\\${codePoint.toString(16).toUpperCase().padStart(4, '0')}\\X0\\`;
105
+ continue;
106
+ }
107
+ encoded += `\\X4\\${codePoint.toString(16).toUpperCase().padStart(8, '0')}\\X0\\`;
108
+ }
109
+ return encoded;
110
+ }
52
111
  //# sourceMappingURL=ifc-string.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ifc-string.js","sourceRoot":"","sources":["../src/ifc-string.ts"],"names":[],"mappings":"AAAA;;+DAE+D;AAE/D;;;;;;;;GAQG;AACH,MAAM,UAAU,eAAe,CAAC,GAAW;IACzC,IAAI,CAAC,GAAG,IAAI,OAAO,GAAG,KAAK,QAAQ;QAAE,OAAO,GAAG,CAAC;IAEhD,IAAI,MAAM,GAAG,GAAG,CAAC;IAEjB,6EAA6E;IAC7E,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,6BAA6B,EAAE,CAAC,CAAC,EAAE,GAAG,EAAE,EAAE;QAChE,IAAI,OAAO,GAAG,EAAE,CAAC;QACjB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;YACvC,MAAM,QAAQ,GAAG,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YACvD,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE,CAAC;gBACrB,OAAO,IAAI,MAAM,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC;YAC3C,CAAC;QACH,CAAC;QACD,OAAO,OAAO,CAAC;IACjB,CAAC,CAAC,CAAC;IAEH,8EAA8E;IAC9E,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,6BAA6B,EAAE,CAAC,CAAC,EAAE,GAAG,EAAE,EAAE;QAChE,IAAI,OAAO,GAAG,EAAE,CAAC;QACjB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;YACvC,MAAM,SAAS,GAAG,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YACxD,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,EAAE,CAAC;gBACtB,OAAO,IAAI,MAAM,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC;YAC7C,CAAC;QACH,CAAC;QACD,OAAO,OAAO,CAAC;IACjB,CAAC,CAAC,CAAC;IAEH,kDAAkD;IAClD,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,wBAAwB,EAAE,CAAC,CAAC,EAAE,GAAG,EAAE,EAAE;QAC3D,MAAM,QAAQ,GAAG,QAAQ,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;QACnC,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IAC/D,CAAC,CAAC,CAAC;IAEH,uDAAuD;IACvD,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE;QAC/C,OAAO,MAAM,CAAC,YAAY,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC;IACvD,CAAC,CAAC,CAAC;IAEH,kEAAkE;IAClE,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,cAAc,EAAE,EAAE,CAAC,CAAC;IAE5C,OAAO,MAAM,CAAC;AAChB,CAAC"}
1
+ {"version":3,"file":"ifc-string.js","sourceRoot":"","sources":["../src/ifc-string.ts"],"names":[],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -1,4 +1,5 @@
1
- export { decodeIfcString } from './ifc-string.js';
1
+ export { decodeIfcString, encodeIfcString } from './ifc-string.js';
2
+ export { uuidToIfcGuid, ifcGuidToUuid, generateIfcGuid, generateUuid, isValidIfcGuid, isValidUuid, } from './guid.js';
2
3
  export { parsePropertyValue } from './property-value.js';
3
4
  export type { ParsedPropertyValue } from './property-value.js';
4
5
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAClD,OAAO,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AACzD,YAAY,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AACnE,OAAO,EACL,aAAa,EACb,aAAa,EACb,eAAe,EACf,YAAY,EACZ,cAAc,EACd,WAAW,GACZ,MAAM,WAAW,CAAC;AACnB,OAAO,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AACzD,YAAY,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC"}
package/dist/index.js CHANGED
@@ -1,6 +1,7 @@
1
1
  /* This Source Code Form is subject to the terms of the Mozilla Public
2
2
  * License, v. 2.0. If a copy of the MPL was not distributed with this
3
3
  * file, You can obtain one at https://mozilla.org/MPL/2.0/. */
4
- export { decodeIfcString } from './ifc-string.js';
4
+ export { decodeIfcString, encodeIfcString } from './ifc-string.js';
5
+ export { uuidToIfcGuid, ifcGuidToUuid, generateIfcGuid, generateUuid, isValidIfcGuid, isValidUuid, } from './guid.js';
5
6
  export { parsePropertyValue } from './property-value.js';
6
7
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;+DAE+D;AAE/D,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAClD,OAAO,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;+DAE+D;AAE/D,OAAO,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AACnE,OAAO,EACL,aAAa,EACb,aAAa,EACb,eAAe,EACf,YAAY,EACZ,cAAc,EACd,WAAW,GACZ,MAAM,WAAW,CAAC;AACnB,OAAO,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ifc-lite/encoding",
3
- "version": "1.14.3",
3
+ "version": "1.14.5",
4
4
  "description": "IFC string encoding/decoding and property value parsing for IFC-Lite",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",