@ifc-lite/codegen 1.0.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 (49) hide show
  1. package/INTEGRATION.md +354 -0
  2. package/LICENSE +373 -0
  3. package/README.md +101 -0
  4. package/dist/cli.d.ts +3 -0
  5. package/dist/cli.d.ts.map +1 -0
  6. package/dist/cli.js +35 -0
  7. package/dist/cli.js.map +1 -0
  8. package/dist/express-parser.d.ts +75 -0
  9. package/dist/express-parser.d.ts.map +1 -0
  10. package/dist/express-parser.js +318 -0
  11. package/dist/express-parser.js.map +1 -0
  12. package/dist/generator.d.ts +10 -0
  13. package/dist/generator.d.ts.map +1 -0
  14. package/dist/generator.js +64 -0
  15. package/dist/generator.js.map +1 -0
  16. package/dist/index.d.ts +9 -0
  17. package/dist/index.d.ts.map +1 -0
  18. package/dist/index.js +12 -0
  19. package/dist/index.js.map +1 -0
  20. package/dist/typescript-generator.d.ts +28 -0
  21. package/dist/typescript-generator.d.ts.map +1 -0
  22. package/dist/typescript-generator.js +400 -0
  23. package/dist/typescript-generator.js.map +1 -0
  24. package/generated/ifc4/entities.ts +6978 -0
  25. package/generated/ifc4/enums.ts +2471 -0
  26. package/generated/ifc4/index.ts +15 -0
  27. package/generated/ifc4/schema-registry.ts +60726 -0
  28. package/generated/ifc4/selects.ts +191 -0
  29. package/generated/ifc4/test-compile.ts +37 -0
  30. package/generated/ifc4/types.ts +3104 -0
  31. package/generated/ifc4x3/entities.ts +7836 -0
  32. package/generated/ifc4x3/enums.ts +3100 -0
  33. package/generated/ifc4x3/index.ts +15 -0
  34. package/generated/ifc4x3/schema-registry.ts +71023 -0
  35. package/generated/ifc4x3/selects.ts +194 -0
  36. package/generated/ifc4x3/types.ts +3707 -0
  37. package/package.json +32 -0
  38. package/schemas/IFC4X3.exp +13984 -0
  39. package/schemas/IFC4_ADD2_TC1.exp +12399 -0
  40. package/src/cli.ts +41 -0
  41. package/src/express-parser.ts +441 -0
  42. package/src/generator.ts +81 -0
  43. package/src/index.ts +31 -0
  44. package/src/typescript-generator.ts +496 -0
  45. package/test/express-parser.test.ts +363 -0
  46. package/test/integration.test.ts +246 -0
  47. package/test/typescript-generator.test.ts +348 -0
  48. package/tsconfig.json +20 -0
  49. package/vitest.config.ts +18 -0
@@ -0,0 +1,400 @@
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 { getAllAttributes, getInheritanceChain } from './express-parser.js';
5
+ /**
6
+ * Generate all TypeScript code from EXPRESS schema
7
+ */
8
+ export function generateTypeScript(schema) {
9
+ return {
10
+ entities: generateEntityInterfaces(schema),
11
+ types: generateTypeAliases(schema),
12
+ enums: generateEnums(schema),
13
+ selects: generateSelectTypes(schema),
14
+ schemaRegistry: generateSchemaRegistry(schema),
15
+ };
16
+ }
17
+ /**
18
+ * Generate entity interfaces
19
+ */
20
+ function generateEntityInterfaces(schema) {
21
+ let code = `/**
22
+ * IFC Entity Interfaces
23
+ * Generated from EXPRESS schema: ${schema.name}
24
+ *
25
+ * DO NOT EDIT - This file is auto-generated
26
+ */
27
+
28
+ `;
29
+ // Sort entities by dependency order (parents before children)
30
+ const sortedEntities = topologicalSort(schema.entities);
31
+ for (const entity of sortedEntities) {
32
+ code += generateEntityInterface(entity, schema);
33
+ code += '\n\n';
34
+ }
35
+ return code;
36
+ }
37
+ /**
38
+ * Generate a single entity interface
39
+ */
40
+ function generateEntityInterface(entity, schema) {
41
+ let code = '';
42
+ // Add JSDoc comment
43
+ code += `/**\n * ${entity.name}\n`;
44
+ if (entity.isAbstract) {
45
+ code += ` * @abstract\n`;
46
+ }
47
+ if (entity.supertype) {
48
+ code += ` * @extends ${entity.supertype}\n`;
49
+ }
50
+ code += ` */\n`;
51
+ // Generate interface
52
+ code += `export interface ${entity.name}`;
53
+ // Add extends clause
54
+ if (entity.supertype) {
55
+ code += ` extends ${entity.supertype}`;
56
+ }
57
+ code += ` {\n`;
58
+ // Add attributes (only this level, not inherited)
59
+ for (const attr of entity.attributes) {
60
+ code += generateAttribute(attr);
61
+ }
62
+ code += `}`;
63
+ return code;
64
+ }
65
+ /**
66
+ * Generate an attribute declaration
67
+ */
68
+ function generateAttribute(attr) {
69
+ let code = ` ${attr.name}`;
70
+ // Add optional marker
71
+ if (attr.optional) {
72
+ code += '?';
73
+ }
74
+ code += ': ';
75
+ // Map EXPRESS type to TypeScript type
76
+ let tsType = mapExpressTypeToTypeScript(attr.type);
77
+ // Wrap in array if needed
78
+ // Note: attr.type may already contain [] for nested collections from the parser
79
+ if (attr.isArray || attr.isList || attr.isSet) {
80
+ tsType = `${tsType}[]`;
81
+ }
82
+ code += tsType;
83
+ code += ';\n';
84
+ return code;
85
+ }
86
+ /**
87
+ * Map EXPRESS types to TypeScript types
88
+ */
89
+ function mapExpressTypeToTypeScript(expressType) {
90
+ // Handle basic EXPRESS types
91
+ const typeMap = {
92
+ REAL: 'number',
93
+ INTEGER: 'number',
94
+ NUMBER: 'number',
95
+ BOOLEAN: 'boolean',
96
+ LOGICAL: 'boolean | null',
97
+ STRING: 'string',
98
+ BINARY: 'string',
99
+ };
100
+ // Check if it's a measure type (ends with Measure)
101
+ if (expressType.endsWith('Measure')) {
102
+ return 'number';
103
+ }
104
+ // Check if it's a simple type in our map
105
+ const upperType = expressType.toUpperCase();
106
+ if (typeMap[upperType]) {
107
+ return typeMap[upperType];
108
+ }
109
+ // Check for IFC types
110
+ if (expressType.startsWith('Ifc')) {
111
+ return expressType;
112
+ }
113
+ // Default: use as-is (likely a custom type or entity reference)
114
+ return expressType;
115
+ }
116
+ /**
117
+ * Generate type aliases
118
+ */
119
+ function generateTypeAliases(schema) {
120
+ let code = `/**
121
+ * IFC Type Aliases
122
+ * Generated from EXPRESS schema: ${schema.name}
123
+ *
124
+ * DO NOT EDIT - This file is auto-generated
125
+ */
126
+
127
+ `;
128
+ for (const type of schema.types) {
129
+ code += `/** ${type.name} */\n`;
130
+ code += `export type ${type.name} = ${mapExpressTypeToTypeScript(type.underlyingType)};\n\n`;
131
+ }
132
+ return code;
133
+ }
134
+ /**
135
+ * Generate enum definitions
136
+ */
137
+ function generateEnums(schema) {
138
+ let code = `/**
139
+ * IFC Enumerations
140
+ * Generated from EXPRESS schema: ${schema.name}
141
+ *
142
+ * DO NOT EDIT - This file is auto-generated
143
+ */
144
+
145
+ `;
146
+ for (const enumDef of schema.enums) {
147
+ code += generateEnum(enumDef);
148
+ code += '\n\n';
149
+ }
150
+ return code;
151
+ }
152
+ /**
153
+ * Generate a single enum
154
+ */
155
+ function generateEnum(enumDef) {
156
+ let code = `/** ${enumDef.name} */\n`;
157
+ code += `export enum ${enumDef.name} {\n`;
158
+ for (const value of enumDef.values) {
159
+ // Convert to PascalCase for enum member
160
+ const memberName = value.toUpperCase();
161
+ code += ` ${memberName} = '${value}',\n`;
162
+ }
163
+ code += `}`;
164
+ return code;
165
+ }
166
+ /**
167
+ * Generate SELECT type unions
168
+ */
169
+ function generateSelectTypes(schema) {
170
+ let code = `/**
171
+ * IFC SELECT Types (Unions)
172
+ * Generated from EXPRESS schema: ${schema.name}
173
+ *
174
+ * DO NOT EDIT - This file is auto-generated
175
+ */
176
+
177
+ `;
178
+ for (const select of schema.selects) {
179
+ code += `/** ${select.name} */\n`;
180
+ code += `export type ${select.name} = `;
181
+ // Join types with |
182
+ const tsTypes = select.types.map(t => mapExpressTypeToTypeScript(t));
183
+ code += tsTypes.join(' | ');
184
+ code += ';\n\n';
185
+ }
186
+ return code;
187
+ }
188
+ /**
189
+ * Generate schema registry with runtime metadata
190
+ */
191
+ function generateSchemaRegistry(schema) {
192
+ let code = `/**
193
+ * IFC Schema Registry
194
+ * Generated from EXPRESS schema: ${schema.name}
195
+ *
196
+ * Runtime metadata for IFC entities, types, and relationships.
197
+ *
198
+ * DO NOT EDIT - This file is auto-generated
199
+ */
200
+
201
+ export interface EntityMetadata {
202
+ name: string;
203
+ isAbstract: boolean;
204
+ parent?: string;
205
+ attributes: AttributeMetadata[];
206
+ allAttributes?: AttributeMetadata[]; // Including inherited
207
+ inheritanceChain?: string[]; // From root to entity
208
+ }
209
+
210
+ export interface AttributeMetadata {
211
+ name: string;
212
+ type: string;
213
+ optional: boolean;
214
+ isArray: boolean;
215
+ isList: boolean;
216
+ isSet: boolean;
217
+ arrayBounds?: [number, number];
218
+ }
219
+
220
+ export interface SchemaRegistry {
221
+ name: string;
222
+ entities: Record<string, EntityMetadata>;
223
+ types: Record<string, string>; // name -> underlying type
224
+ enums: Record<string, string[]>; // name -> values
225
+ selects: Record<string, string[]>; // name -> types
226
+ }
227
+
228
+ export const SCHEMA_REGISTRY: SchemaRegistry = {
229
+ name: '${schema.name}',
230
+
231
+ entities: {
232
+ `;
233
+ // Generate entity metadata
234
+ for (const entity of schema.entities) {
235
+ code += generateEntityMetadata(entity, schema);
236
+ }
237
+ code += ` },
238
+
239
+ types: {
240
+ `;
241
+ // Generate type metadata (escape single quotes in underlying types)
242
+ for (const type of schema.types) {
243
+ const escapedType = type.underlyingType.replace(/'/g, "\\'").replace(/\n/g, ' ');
244
+ code += ` ${type.name}: '${escapedType}',\n`;
245
+ }
246
+ code += ` },
247
+
248
+ enums: {
249
+ `;
250
+ // Generate enum metadata (escape single quotes in values)
251
+ for (const enumDef of schema.enums) {
252
+ const escapedValues = enumDef.values.map(v => `'${v.replace(/'/g, "\\'")}'`);
253
+ code += ` ${enumDef.name}: [${escapedValues.join(', ')}],\n`;
254
+ }
255
+ code += ` },
256
+
257
+ selects: {
258
+ `;
259
+ // Generate select metadata (escape single quotes in types)
260
+ for (const select of schema.selects) {
261
+ const escapedTypes = select.types.map(t => `'${t.replace(/'/g, "\\'")}'`);
262
+ code += ` ${select.name}: [${escapedTypes.join(', ')}],\n`;
263
+ }
264
+ code += ` },
265
+ };
266
+
267
+ /**
268
+ * Get entity metadata by name (case-insensitive)
269
+ */
270
+ export function getEntityMetadata(typeName: string): EntityMetadata | undefined {
271
+ // Normalize to IfcXxx format
272
+ const normalized = normalizeTypeName(typeName);
273
+ return SCHEMA_REGISTRY.entities[normalized];
274
+ }
275
+
276
+ /**
277
+ * Get all attributes for an entity (including inherited)
278
+ */
279
+ export function getAllAttributesForEntity(typeName: string): AttributeMetadata[] {
280
+ const metadata = getEntityMetadata(typeName);
281
+ return metadata?.allAttributes || [];
282
+ }
283
+
284
+ /**
285
+ * Get inheritance chain for an entity
286
+ */
287
+ export function getInheritanceChainForEntity(typeName: string): string[] {
288
+ const metadata = getEntityMetadata(typeName);
289
+ return metadata?.inheritanceChain || [];
290
+ }
291
+
292
+ /**
293
+ * Check if a type is a known entity
294
+ */
295
+ export function isKnownEntity(typeName: string): boolean {
296
+ const normalized = normalizeTypeName(typeName);
297
+ return normalized in SCHEMA_REGISTRY.entities;
298
+ }
299
+
300
+ /**
301
+ * Normalize type name to IfcXxx format
302
+ */
303
+ function normalizeTypeName(name: string): string {
304
+ // Convert IFCWALL -> IfcWall
305
+ if (name.toUpperCase().startsWith('IFC')) {
306
+ return 'Ifc' + name.substring(3).charAt(0).toUpperCase() +
307
+ name.substring(4).toLowerCase();
308
+ }
309
+ return name;
310
+ }
311
+ `;
312
+ return code;
313
+ }
314
+ /**
315
+ * Generate metadata for a single entity
316
+ */
317
+ function generateEntityMetadata(entity, schema) {
318
+ let code = ` ${entity.name}: {\n`;
319
+ code += ` name: '${entity.name}',\n`;
320
+ code += ` isAbstract: ${entity.isAbstract},\n`;
321
+ if (entity.supertype) {
322
+ code += ` parent: '${entity.supertype}',\n`;
323
+ }
324
+ code += ` attributes: [\n`;
325
+ for (const attr of entity.attributes) {
326
+ code += ` {\n`;
327
+ code += ` name: '${attr.name}',\n`;
328
+ code += ` type: '${attr.type}',\n`;
329
+ code += ` optional: ${attr.optional},\n`;
330
+ code += ` isArray: ${attr.isArray},\n`;
331
+ code += ` isList: ${attr.isList},\n`;
332
+ code += ` isSet: ${attr.isSet},\n`;
333
+ if (attr.arrayBounds) {
334
+ code += ` arrayBounds: [${attr.arrayBounds[0]}, ${attr.arrayBounds[1]}],\n`;
335
+ }
336
+ code += ` },\n`;
337
+ }
338
+ code += ` ],\n`;
339
+ // Add all attributes (including inherited)
340
+ const allAttrs = getAllAttributes(entity, schema);
341
+ code += ` allAttributes: [\n`;
342
+ for (const attr of allAttrs) {
343
+ code += ` {\n`;
344
+ code += ` name: '${attr.name}',\n`;
345
+ code += ` type: '${attr.type}',\n`;
346
+ code += ` optional: ${attr.optional},\n`;
347
+ code += ` isArray: ${attr.isArray},\n`;
348
+ code += ` isList: ${attr.isList},\n`;
349
+ code += ` isSet: ${attr.isSet},\n`;
350
+ if (attr.arrayBounds) {
351
+ code += ` arrayBounds: [${attr.arrayBounds[0]}, ${attr.arrayBounds[1]}],\n`;
352
+ }
353
+ code += ` },\n`;
354
+ }
355
+ code += ` ],\n`;
356
+ // Add inheritance chain
357
+ const chain = getInheritanceChain(entity, schema);
358
+ code += ` inheritanceChain: [${chain.map(c => `'${c}'`).join(', ')}],\n`;
359
+ code += ` },\n`;
360
+ return code;
361
+ }
362
+ /**
363
+ * Topological sort of entities by dependency order
364
+ * Ensures parent entities are generated before children
365
+ */
366
+ function topologicalSort(entities) {
367
+ const sorted = [];
368
+ const visited = new Set();
369
+ function visit(entity) {
370
+ if (visited.has(entity.name)) {
371
+ return;
372
+ }
373
+ visited.add(entity.name);
374
+ // Visit parent first
375
+ if (entity.supertype) {
376
+ const parent = entities.find(e => e.name === entity.supertype);
377
+ if (parent) {
378
+ visit(parent);
379
+ }
380
+ }
381
+ sorted.push(entity);
382
+ }
383
+ for (const entity of entities) {
384
+ visit(entity);
385
+ }
386
+ return sorted;
387
+ }
388
+ /**
389
+ * Write generated code to files
390
+ */
391
+ export function writeGeneratedFiles(code, outputDir) {
392
+ return {
393
+ entities: `${outputDir}/entities.ts`,
394
+ types: `${outputDir}/types.ts`,
395
+ enums: `${outputDir}/enums.ts`,
396
+ selects: `${outputDir}/selects.ts`,
397
+ schema: `${outputDir}/schema-registry.ts`,
398
+ };
399
+ }
400
+ //# sourceMappingURL=typescript-generator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"typescript-generator.js","sourceRoot":"","sources":["../src/typescript-generator.ts"],"names":[],"mappings":"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"}