@ifc-lite/cli 0.4.0 → 0.5.1

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.
@@ -7,37 +7,140 @@
7
7
  * Evaluate a JavaScript expression against the BIM SDK.
8
8
  * The `bim` object is available with the full SDK API.
9
9
  *
10
+ * When --type is specified, the expression is evaluated per-entity with
11
+ * `ref` bound to each entity reference, enabling patterns like:
12
+ * ifc-lite eval model.ifc "bim.quantity(ref, 'GrossSideArea')" --type IfcWall --limit 3
13
+ *
10
14
  * Examples:
11
15
  * ifc-lite eval model.ifc "bim.query().byType('IfcWall').count()"
12
16
  * ifc-lite eval model.ifc "bim.query().byType('IfcDoor').toArray().map(d => d.name)"
13
17
  */
14
18
  import { createHeadlessContext } from '../loader.js';
15
- import { printJson, fatal } from '../output.js';
19
+ import { printJson, fatal, hasFlag, getFlag } from '../output.js';
20
+ /** Known flags that take a value argument */
21
+ const EVAL_VALUE_FLAGS = new Set(['--type', '--limit']);
22
+ /** Known boolean flags (no value) */
23
+ const EVAL_BOOLEAN_FLAGS = new Set(['--json']);
16
24
  export async function evalCommand(args) {
17
- const positional = args.filter(a => !a.startsWith('-'));
25
+ const jsonOutput = hasFlag(args, '--json');
26
+ const typeFilter = getFlag(args, '--type');
27
+ const limitStr = getFlag(args, '--limit');
28
+ // Parse positional args, skipping known flags and their values.
29
+ // Known value flags (--type, --limit) and boolean flags (--json) are always
30
+ // skipped regardless of position. After the file path is collected, other
31
+ // dash-prefixed tokens (e.g. "-1") are treated as expression parts.
32
+ const positional = [];
33
+ let afterFilePath = false;
34
+ for (let i = 0; i < args.length; i++) {
35
+ const arg = args[i];
36
+ if (arg === '--') {
37
+ afterFilePath = true;
38
+ continue;
39
+ }
40
+ // Always skip known flags, even after the file path
41
+ if (EVAL_VALUE_FLAGS.has(arg)) {
42
+ i++; // skip flag value
43
+ continue;
44
+ }
45
+ if (EVAL_BOOLEAN_FLAGS.has(arg))
46
+ continue;
47
+ // Before the file path, skip any unrecognised flags too
48
+ if (!afterFilePath && arg.startsWith('-'))
49
+ continue;
50
+ positional.push(arg);
51
+ // After collecting the file path, allow dash-prefixed expression tokens
52
+ if (positional.length === 1)
53
+ afterFilePath = true;
54
+ }
18
55
  if (positional.length < 2)
19
56
  fatal('Usage: ifc-lite eval <file.ifc> "<expression>"');
20
57
  const [filePath, ...exprParts] = positional;
21
58
  const expression = exprParts.join(' ');
22
59
  const { bim } = await createHeadlessContext(filePath);
23
- // Build evaluation context
24
- // Detect if expression is a statement (contains const/let/var/for/if/return or ;)
25
- // If so, wrap in async IIFE to allow multi-statement code
60
+ // When --type is specified, iterate entities and evaluate per-entity with `ref` in scope
61
+ if (typeFilter) {
62
+ const types = typeFilter.split(',').map(t => {
63
+ const trimmed = t.trim();
64
+ if (trimmed.startsWith('Ifc') || trimmed.startsWith('IFC') || trimmed.startsWith('ifc'))
65
+ return trimmed;
66
+ return 'Ifc' + trimmed;
67
+ });
68
+ let entities = bim.query().byType(...types).toArray();
69
+ if (limitStr)
70
+ entities = entities.slice(0, parseInt(limitStr, 10));
71
+ const results = [];
72
+ const evalFn = buildEvalFunction(expression, ['bim', 'ref', 'entity']);
73
+ for (const entity of entities) {
74
+ try {
75
+ const result = evalFn(bim, entity.ref, entity);
76
+ const resolved = result instanceof Promise ? await result : result;
77
+ results.push({
78
+ Name: entity.name,
79
+ Type: entity.type,
80
+ GlobalId: entity.globalId,
81
+ result: resolved ?? null,
82
+ });
83
+ }
84
+ catch (err) {
85
+ results.push({
86
+ Name: entity.name,
87
+ Type: entity.type,
88
+ GlobalId: entity.globalId,
89
+ error: err.message,
90
+ });
91
+ }
92
+ }
93
+ if (jsonOutput) {
94
+ printJson({ results });
95
+ }
96
+ else {
97
+ for (const r of results) {
98
+ const val = r.error ? `ERROR: ${r.error}` : formatValue(r.result);
99
+ process.stdout.write(`${r.Name ?? r.GlobalId}: ${val}\n`);
100
+ }
101
+ process.stderr.write(`\n${results.length} entities evaluated\n`);
102
+ }
103
+ return;
104
+ }
105
+ // Standard eval (no --type): evaluate expression once with bim in scope
106
+ const evalFn = buildEvalFunction(expression, ['bim']);
107
+ try {
108
+ const result = evalFn(bim);
109
+ // Handle async results
110
+ const resolved = result instanceof Promise ? await result : result;
111
+ if (jsonOutput) {
112
+ printJson({ result: resolved ?? null });
113
+ }
114
+ else if (resolved === undefined || resolved === null) {
115
+ process.stdout.write('null\n');
116
+ }
117
+ else if (typeof resolved === 'object') {
118
+ printJson(resolved);
119
+ }
120
+ else {
121
+ process.stdout.write(String(resolved) + '\n');
122
+ }
123
+ }
124
+ catch (err) {
125
+ fatal(`Evaluation error: ${err.message}`);
126
+ }
127
+ }
128
+ /**
129
+ * Build an eval function from an expression string.
130
+ * Handles both single expressions and multi-statement code.
131
+ */
132
+ function buildEvalFunction(expression, paramNames) {
26
133
  const isStatement = /^\s*(const |let |var |for |if |while |return |class |function |try |switch |{)/.test(expression)
27
134
  || expression.includes(';');
28
135
  let body;
29
136
  if (isStatement) {
30
- // For multi-statement code: if the last statement is an expression (not a declaration),
31
- // auto-return it so users don't need to write explicit return
32
137
  const statements = expression.split(';').map(s => s.trim()).filter(Boolean);
33
138
  const last = statements[statements.length - 1];
34
139
  const isLastDeclaration = /^(const |let |var |for |if |while |return |class |function |try |switch |{)/.test(last);
35
140
  if (!isLastDeclaration && statements.length > 1) {
36
- // Replace last statement with return
37
141
  statements[statements.length - 1] = `return (${last})`;
38
142
  }
39
143
  else if (isLastDeclaration && /^(const |let |var )\s*(\w+)/.test(last)) {
40
- // If last is a variable declaration, return the variable name
41
144
  const varMatch = last.match(/^(?:const |let |var )\s*(\w+)/);
42
145
  if (varMatch) {
43
146
  statements.push(`return ${varMatch[1]}`);
@@ -48,26 +151,16 @@ export async function evalCommand(args) {
48
151
  else {
49
152
  body = `return (${expression})`;
50
153
  }
51
- const evalFn = new Function('bim', `
154
+ return new Function(...paramNames, `
52
155
  "use strict";
53
156
  ${body};
54
157
  `);
55
- try {
56
- const result = evalFn(bim);
57
- // Handle async results
58
- const resolved = result instanceof Promise ? await result : result;
59
- if (resolved === undefined || resolved === null) {
60
- process.stdout.write('null\n');
61
- }
62
- else if (typeof resolved === 'object') {
63
- printJson(resolved);
64
- }
65
- else {
66
- process.stdout.write(String(resolved) + '\n');
67
- }
68
- }
69
- catch (err) {
70
- fatal(`Evaluation error: ${err.message}`);
71
- }
158
+ }
159
+ function formatValue(value) {
160
+ if (value === null || value === undefined)
161
+ return 'null';
162
+ if (typeof value === 'object')
163
+ return JSON.stringify(value);
164
+ return String(value);
72
165
  }
73
166
  //# sourceMappingURL=eval.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"eval.js","sourceRoot":"","sources":["../../src/commands/eval.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"eval.js","sourceRoot":"","sources":["../../src/commands/eval.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"export.d.ts","sourceRoot":"","sources":["../../src/commands/export.ts"],"names":[],"mappings":"AAwCA,wBAAsB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAwDjE"}
1
+ {"version":3,"file":"export.d.ts","sourceRoot":"","sources":["../../src/commands/export.ts"],"names":[],"mappings":"AAgIA,wBAAsB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CA+GjE"}
@@ -5,7 +5,8 @@
5
5
  * ifc-lite export <file.ifc> --format csv|json|ifc [options]
6
6
  *
7
7
  * Export IFC data to CSV, JSON, or IFC STEP format.
8
- * Supports type filtering, column selection, and schema conversion on export.
8
+ * Supports type filtering, storey filtering, column selection (including quantities),
9
+ * and schema conversion on export.
9
10
  */
10
11
  import { writeFile } from 'node:fs/promises';
11
12
  import { createHeadlessContext } from '../loader.js';
@@ -31,17 +32,109 @@ function parseWhereFilter(filter) {
31
32
  }
32
33
  return { psetName, propName: rest, operator: 'exists' };
33
34
  }
35
+ /**
36
+ * B9/F6: Auto-prefix Ifc for --type if user omits it.
37
+ */
38
+ function normalizeTypeName(typeStr) {
39
+ return typeStr.split(',').map(t => {
40
+ const trimmed = t.trim();
41
+ if (trimmed.startsWith('Ifc') || trimmed.startsWith('IFC') || trimmed.startsWith('ifc')) {
42
+ return trimmed;
43
+ }
44
+ const prefixed = 'Ifc' + trimmed;
45
+ process.stderr.write(`Note: Auto-corrected type "${trimmed}" → "${prefixed}"\n`);
46
+ return prefixed;
47
+ }).join(',');
48
+ }
49
+ /**
50
+ * B5: Resolve a column value from an entity, searching entity attributes,
51
+ * property sets, AND quantity sets (by bare quantity name or QsetName.QuantityName).
52
+ */
53
+ /**
54
+ * Resolve a column value from an entity, returning the raw value
55
+ * (number, boolean, string, or null) to preserve types in JSON output.
56
+ */
57
+ function resolveColumnValue(entity, col, bim) {
58
+ // Native entity attributes
59
+ if (col === 'Name' || col === 'name')
60
+ return entity.name ?? null;
61
+ if (col === 'Type' || col === 'type')
62
+ return entity.type ?? null;
63
+ if (col === 'GlobalId' || col === 'globalId')
64
+ return entity.globalId ?? null;
65
+ if (col === 'Description' || col === 'description')
66
+ return entity.description ?? null;
67
+ if (col === 'ObjectType' || col === 'objectType')
68
+ return entity.objectType ?? null;
69
+ // Dot-separated: PsetName.PropName or QsetName.QuantityName
70
+ const dotIdx = col.indexOf('.');
71
+ if (dotIdx > 0) {
72
+ const setName = col.slice(0, dotIdx);
73
+ const valueName = col.slice(dotIdx + 1);
74
+ // Search property sets
75
+ const props = bim.properties(entity.ref);
76
+ const pset = props.find((p) => p.name === setName);
77
+ if (pset) {
78
+ const prop = pset.properties.find((p) => p.name === valueName);
79
+ if (prop?.value != null)
80
+ return prop.value;
81
+ }
82
+ // Search quantity sets
83
+ const qsets = bim.quantities(entity.ref);
84
+ const qset = qsets.find((q) => q.name === setName);
85
+ if (qset) {
86
+ const qty = qset.quantities.find((q) => q.name === valueName);
87
+ if (qty?.value != null)
88
+ return qty.value;
89
+ }
90
+ return null;
91
+ }
92
+ // B5: Bare quantity name (e.g., "GrossSideArea") — search all quantity sets
93
+ const qsets = bim.quantities(entity.ref);
94
+ for (const qset of qsets) {
95
+ for (const q of qset.quantities) {
96
+ if (q.name === col && q.value != null)
97
+ return q.value;
98
+ }
99
+ }
100
+ // Also search all property sets for bare property name
101
+ const props = bim.properties(entity.ref);
102
+ for (const pset of props) {
103
+ for (const p of pset.properties) {
104
+ if (p.name === col && p.value != null)
105
+ return p.value;
106
+ }
107
+ }
108
+ return null;
109
+ }
110
+ /** Stringify a column value for CSV output */
111
+ function columnValueToCsv(value) {
112
+ if (value == null)
113
+ return '';
114
+ return String(value);
115
+ }
116
+ function escapeCsv(value, sep) {
117
+ if (value.includes(sep) || value.includes('"') || value.includes('\n')) {
118
+ return `"${value.replace(/"/g, '""')}"`;
119
+ }
120
+ return value;
121
+ }
34
122
  export async function exportCommand(args) {
35
123
  const filePath = args.find(a => !a.startsWith('-'));
36
124
  const format = getFlag(args, '--format') ?? 'csv';
37
125
  const outPath = getFlag(args, '--out');
38
- const type = getFlag(args, '--type');
126
+ let type = getFlag(args, '--type');
39
127
  const columnsStr = getFlag(args, '--columns');
40
128
  const separator = getFlag(args, '--separator') ?? ',';
41
129
  const limit = getFlag(args, '--limit');
42
130
  const propFilter = getFlag(args, '--where');
131
+ const storeyFilter = getFlag(args, '--storey');
43
132
  if (!filePath)
44
- fatal('Usage: ifc-lite export <file.ifc> --format csv|json|ifc [--type IfcWall] [--columns Name,Type,GlobalId] [--where PsetName.Prop=Value] [--out file]');
133
+ fatal('Usage: ifc-lite export <file.ifc> --format csv|json|ifc [--type IfcWall] [--columns Name,Type,GlobalId] [--where PsetName.Prop=Value] [--storey Name] [--out file]');
134
+ // B9/F6: Auto-prefix Ifc
135
+ if (type) {
136
+ type = normalizeTypeName(type);
137
+ }
45
138
  const { bim } = await createHeadlessContext(filePath);
46
139
  // Build entity query
47
140
  let q = bim.query();
@@ -52,24 +145,69 @@ export async function exportCommand(args) {
52
145
  const parsed = parseWhereFilter(propFilter);
53
146
  q = q.where(parsed.psetName, parsed.propName, parsed.operator, parsed.value);
54
147
  }
148
+ // Don't apply limit to the query yet — storey filtering must happen first
149
+ let entities = q.toArray();
150
+ // B4: --storey filter (applied before limit so --limit restricts storey-filtered results)
151
+ if (storeyFilter) {
152
+ const storeys = bim.storeys();
153
+ const matchedStorey = storeys.find((s) => s.name === storeyFilter ||
154
+ s.name.toLowerCase().includes(storeyFilter.toLowerCase()) ||
155
+ String(s.ref.expressId) === storeyFilter);
156
+ if (!matchedStorey) {
157
+ const names = storeys.map((s) => s.name).filter(Boolean).join(', ');
158
+ fatal(`Storey "${storeyFilter}" not found. Available: ${names || '(none)'}`);
159
+ }
160
+ const contained = bim.contains(matchedStorey.ref);
161
+ const storeyIds = new Set(contained.map((e) => e.ref.expressId));
162
+ entities = entities.filter((e) => storeyIds.has(e.ref.expressId));
163
+ }
164
+ // Apply limit after storey filtering
55
165
  if (limit) {
56
- q = q.limit(parseInt(limit, 10));
166
+ entities = entities.slice(0, parseInt(limit, 10));
57
167
  }
58
- const entities = q.toArray();
59
- const refs = entities.map(e => e.ref);
168
+ const refs = entities.map((e) => e.ref);
60
169
  const columns = columnsStr
61
170
  ? columnsStr.split(',')
62
171
  : ['Type', 'Name', 'GlobalId', 'Description', 'ObjectType'];
172
+ // Check if any columns need quantity/property resolution (non-native columns)
173
+ const nativeColumns = new Set(['Name', 'name', 'Type', 'type', 'GlobalId', 'globalId', 'Description', 'description', 'ObjectType', 'objectType']);
174
+ const hasCustomColumns = columns.some(c => !nativeColumns.has(c));
63
175
  switch (format) {
64
176
  case 'csv': {
65
- const csv = bim.export.csv(refs, { columns, separator });
66
- await writeOutput(csv, outPath);
177
+ if (hasCustomColumns) {
178
+ // B5: Use our own CSV generation that supports quantity columns
179
+ const rows = [columns];
180
+ for (const entity of entities) {
181
+ rows.push(columns.map(col => columnValueToCsv(resolveColumnValue(entity, col, bim))));
182
+ }
183
+ const csv = rows.map(r => r.map(cell => escapeCsv(cell, separator)).join(separator)).join('\n');
184
+ await writeOutput(csv, outPath);
185
+ }
186
+ else {
187
+ const csv = bim.export.csv(refs, { columns, separator });
188
+ await writeOutput(csv, outPath);
189
+ }
67
190
  break;
68
191
  }
69
192
  case 'json': {
70
- const json = bim.export.json(refs, columns);
71
- const content = JSON.stringify(json, null, 2);
72
- await writeOutput(content, outPath);
193
+ if (hasCustomColumns) {
194
+ // B5: Use our own JSON generation that supports quantity columns (raw values preserved)
195
+ const result = [];
196
+ for (const entity of entities) {
197
+ const row = {};
198
+ for (const col of columns) {
199
+ row[col] = resolveColumnValue(entity, col, bim);
200
+ }
201
+ result.push(row);
202
+ }
203
+ const content = JSON.stringify(result, null, 2);
204
+ await writeOutput(content, outPath);
205
+ }
206
+ else {
207
+ const json = bim.export.json(refs, columns);
208
+ const content = JSON.stringify(json, null, 2);
209
+ await writeOutput(content, outPath);
210
+ }
73
211
  break;
74
212
  }
75
213
  case 'ifc': {
@@ -1 +1 @@
1
- {"version":3,"file":"export.js","sourceRoot":"","sources":["../../src/commands/export.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"export.js","sourceRoot":"","sources":["../../src/commands/export.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function mutateCommand(args: string[]): Promise<void>;
2
+ //# sourceMappingURL=mutate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mutate.d.ts","sourceRoot":"","sources":["../../src/commands/mutate.ts"],"names":[],"mappings":"AA8GA,wBAAsB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CA2IjE"}