@ifc-lite/cli 0.6.1 → 0.7.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 (48) hide show
  1. package/dist/commands/bcf.js.map +1 -1
  2. package/dist/commands/create.d.ts +3 -0
  3. package/dist/commands/create.d.ts.map +1 -1
  4. package/dist/commands/create.js +4 -2
  5. package/dist/commands/create.js.map +1 -1
  6. package/dist/commands/create.test.d.ts +2 -0
  7. package/dist/commands/create.test.d.ts.map +1 -0
  8. package/dist/commands/create.test.js +87 -0
  9. package/dist/commands/create.test.js.map +1 -0
  10. package/dist/commands/export.d.ts.map +1 -1
  11. package/dist/commands/export.js.map +1 -1
  12. package/dist/commands/ids.d.ts.map +1 -1
  13. package/dist/commands/ids.js +35 -4
  14. package/dist/commands/ids.js.map +1 -1
  15. package/dist/commands/mutate.d.ts +36 -0
  16. package/dist/commands/mutate.d.ts.map +1 -1
  17. package/dist/commands/mutate.js +5 -5
  18. package/dist/commands/mutate.js.map +1 -1
  19. package/dist/commands/mutate.test.d.ts +2 -0
  20. package/dist/commands/mutate.test.d.ts.map +1 -0
  21. package/dist/commands/mutate.test.js +283 -0
  22. package/dist/commands/mutate.test.js.map +1 -0
  23. package/dist/commands/query-aggregation.d.ts +19 -0
  24. package/dist/commands/query-aggregation.d.ts.map +1 -0
  25. package/dist/commands/query-aggregation.js +121 -0
  26. package/dist/commands/query-aggregation.js.map +1 -0
  27. package/dist/commands/query-output.d.ts +11 -0
  28. package/dist/commands/query-output.d.ts.map +1 -0
  29. package/dist/commands/query-output.js +349 -0
  30. package/dist/commands/query-output.js.map +1 -0
  31. package/dist/commands/query.d.ts.map +1 -1
  32. package/dist/commands/query.js +3 -453
  33. package/dist/commands/query.js.map +1 -1
  34. package/dist/headless-backend.d.ts +17 -2
  35. package/dist/headless-backend.d.ts.map +1 -1
  36. package/dist/headless-backend.js +141 -14
  37. package/dist/headless-backend.js.map +1 -1
  38. package/dist/headless-backend.test.d.ts +2 -0
  39. package/dist/headless-backend.test.d.ts.map +1 -0
  40. package/dist/headless-backend.test.js +91 -0
  41. package/dist/headless-backend.test.js.map +1 -0
  42. package/dist/loader.d.ts.map +1 -1
  43. package/dist/loader.js.map +1 -1
  44. package/dist/output.test.d.ts +2 -0
  45. package/dist/output.test.d.ts.map +1 -0
  46. package/dist/output.test.js +136 -0
  47. package/dist/output.test.js.map +1 -0
  48. package/package.json +20 -19
@@ -0,0 +1,283 @@
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 { describe, it, expect } from 'vitest';
5
+ import { parseWhereFilter, parseSetArg, coerceValue, matchesFilter, splitStepArgs, } from './mutate.js';
6
+ import { PropertyValueType } from '@ifc-lite/data';
7
+ describe('parseWhereFilter', () => {
8
+ it('parses equals filter', () => {
9
+ const result = parseWhereFilter('Pset_WallCommon.IsExternal=true');
10
+ expect(result).toEqual({
11
+ psetName: 'Pset_WallCommon',
12
+ propName: 'IsExternal',
13
+ operator: '=',
14
+ value: 'true',
15
+ });
16
+ });
17
+ it('parses not-equals filter', () => {
18
+ const result = parseWhereFilter('Pset_WallCommon.IsExternal!=true');
19
+ expect(result).toEqual({
20
+ psetName: 'Pset_WallCommon',
21
+ propName: 'IsExternal',
22
+ operator: '!=',
23
+ value: 'true',
24
+ });
25
+ });
26
+ it('parses greater-than filter', () => {
27
+ const result = parseWhereFilter('Qto_WallBaseQuantities.Height>2.5');
28
+ expect(result).toEqual({
29
+ psetName: 'Qto_WallBaseQuantities',
30
+ propName: 'Height',
31
+ operator: '>',
32
+ value: '2.5',
33
+ });
34
+ });
35
+ it('parses less-than filter', () => {
36
+ const result = parseWhereFilter('Qto_SlabBaseQuantities.Width<1');
37
+ expect(result).toEqual({
38
+ psetName: 'Qto_SlabBaseQuantities',
39
+ propName: 'Width',
40
+ operator: '<',
41
+ value: '1',
42
+ });
43
+ });
44
+ it('parses greater-or-equal filter', () => {
45
+ const result = parseWhereFilter('CustomPset.Value>=100');
46
+ expect(result).toEqual({
47
+ psetName: 'CustomPset',
48
+ propName: 'Value',
49
+ operator: '>=',
50
+ value: '100',
51
+ });
52
+ });
53
+ it('parses less-or-equal filter', () => {
54
+ const result = parseWhereFilter('CustomPset.Value<=50');
55
+ expect(result).toEqual({
56
+ psetName: 'CustomPset',
57
+ propName: 'Value',
58
+ operator: '<=',
59
+ value: '50',
60
+ });
61
+ });
62
+ it('parses contains filter (tilde)', () => {
63
+ const result = parseWhereFilter('Pset_WallCommon.Reference~concrete');
64
+ expect(result).toEqual({
65
+ psetName: 'Pset_WallCommon',
66
+ propName: 'Reference',
67
+ operator: 'contains',
68
+ value: 'concrete',
69
+ });
70
+ });
71
+ it('parses exists filter (no operator)', () => {
72
+ const result = parseWhereFilter('Pset_WallCommon.IsExternal');
73
+ expect(result).toEqual({
74
+ psetName: 'Pset_WallCommon',
75
+ propName: 'IsExternal',
76
+ operator: 'exists',
77
+ });
78
+ });
79
+ it('throws for missing dot separator', () => {
80
+ expect(() => parseWhereFilter('NoDotHere=value')).toThrow();
81
+ });
82
+ it('throws for dot at position 0', () => {
83
+ expect(() => parseWhereFilter('.PropName=value')).toThrow();
84
+ });
85
+ it('handles pset names with underscores', () => {
86
+ const result = parseWhereFilter('My_Custom_Pset.SomeProp=123');
87
+ expect(result.psetName).toBe('My_Custom_Pset');
88
+ expect(result.propName).toBe('SomeProp');
89
+ expect(result.value).toBe('123');
90
+ });
91
+ it('handles empty value after operator', () => {
92
+ const result = parseWhereFilter('Pset.Prop=');
93
+ expect(result.value).toBe('');
94
+ });
95
+ });
96
+ describe('parseSetArg', () => {
97
+ it('parses pset.prop=value form', () => {
98
+ const result = parseSetArg('Pset_WallCommon.IsExternal=true');
99
+ expect(result).toEqual({
100
+ psetName: 'Pset_WallCommon',
101
+ propName: 'IsExternal',
102
+ value: 'true',
103
+ isAttribute: false,
104
+ });
105
+ });
106
+ it('parses attribute form (no dot)', () => {
107
+ const result = parseSetArg('Name=TestWall');
108
+ expect(result).toEqual({
109
+ psetName: null,
110
+ propName: 'Name',
111
+ value: 'TestWall',
112
+ isAttribute: true,
113
+ });
114
+ });
115
+ it('parses Description attribute', () => {
116
+ const result = parseSetArg('Description=A test description');
117
+ expect(result).toEqual({
118
+ psetName: null,
119
+ propName: 'Description',
120
+ value: 'A test description',
121
+ isAttribute: true,
122
+ });
123
+ });
124
+ it('handles value containing dots', () => {
125
+ // Dot comes after = sign, so it's an attribute mutation
126
+ const result = parseSetArg('Name=wall.v2');
127
+ expect(result.isAttribute).toBe(true);
128
+ expect(result.propName).toBe('Name');
129
+ expect(result.value).toBe('wall.v2');
130
+ });
131
+ it('handles numeric values', () => {
132
+ const result = parseSetArg('CustomPset.Height=3.5');
133
+ expect(result.psetName).toBe('CustomPset');
134
+ expect(result.propName).toBe('Height');
135
+ expect(result.value).toBe('3.5');
136
+ });
137
+ it('throws for missing equals sign', () => {
138
+ expect(() => parseSetArg('PsetName.PropName')).toThrow();
139
+ });
140
+ it('throws for equals at position 0', () => {
141
+ expect(() => parseSetArg('=value')).toThrow();
142
+ });
143
+ it('handles value with equals sign in it', () => {
144
+ // "Pset.Prop=a=b" should parse as pset=Pset, prop=Prop, value=a=b
145
+ const result = parseSetArg('Pset.Prop=a=b');
146
+ expect(result.psetName).toBe('Pset');
147
+ expect(result.propName).toBe('Prop');
148
+ expect(result.value).toBe('a=b');
149
+ });
150
+ });
151
+ describe('coerceValue', () => {
152
+ it('coerces "true" to boolean true', () => {
153
+ const result = coerceValue('true');
154
+ expect(result.coerced).toBe(true);
155
+ expect(result.valueType).toBe(PropertyValueType.Boolean);
156
+ });
157
+ it('coerces "false" to boolean false', () => {
158
+ const result = coerceValue('false');
159
+ expect(result.coerced).toBe(false);
160
+ expect(result.valueType).toBe(PropertyValueType.Boolean);
161
+ });
162
+ it('coerces integer string to number', () => {
163
+ const result = coerceValue('42');
164
+ expect(result.coerced).toBe(42);
165
+ });
166
+ it('coerces float string to number', () => {
167
+ const result = coerceValue('3.14');
168
+ expect(result.coerced).toBe(3.14);
169
+ });
170
+ it('coerces negative number string', () => {
171
+ const result = coerceValue('-5');
172
+ expect(result.coerced).toBe(-5);
173
+ });
174
+ it('returns string for non-numeric, non-boolean input', () => {
175
+ const result = coerceValue('hello');
176
+ expect(result.coerced).toBe('hello');
177
+ });
178
+ it('distinguishes integer vs real value types', () => {
179
+ const intResult = coerceValue('10');
180
+ const realResult = coerceValue('10.5');
181
+ // Integer and Real have different PropertyValueType values
182
+ expect(intResult.valueType).not.toBe(realResult.valueType);
183
+ });
184
+ });
185
+ describe('matchesFilter', () => {
186
+ it('exists operator returns true for non-null', () => {
187
+ expect(matchesFilter('anything', 'exists')).toBe(true);
188
+ expect(matchesFilter(0, 'exists')).toBe(true);
189
+ expect(matchesFilter(false, 'exists')).toBe(true);
190
+ });
191
+ it('exists operator returns false for null/undefined', () => {
192
+ expect(matchesFilter(null, 'exists')).toBe(false);
193
+ expect(matchesFilter(undefined, 'exists')).toBe(false);
194
+ });
195
+ it('equality with strings', () => {
196
+ expect(matchesFilter('hello', '=', 'hello')).toBe(true);
197
+ expect(matchesFilter('hello', '=', 'world')).toBe(false);
198
+ });
199
+ it('equality with numbers', () => {
200
+ expect(matchesFilter(42, '=', '42')).toBe(true);
201
+ expect(matchesFilter(42, '=', '43')).toBe(false);
202
+ });
203
+ it('inequality', () => {
204
+ expect(matchesFilter('a', '!=', 'b')).toBe(true);
205
+ expect(matchesFilter('a', '!=', 'a')).toBe(false);
206
+ expect(matchesFilter(1, '!=', '2')).toBe(true);
207
+ });
208
+ it('greater than', () => {
209
+ expect(matchesFilter(10, '>', '5')).toBe(true);
210
+ expect(matchesFilter(5, '>', '10')).toBe(false);
211
+ expect(matchesFilter(5, '>', '5')).toBe(false);
212
+ });
213
+ it('less than', () => {
214
+ expect(matchesFilter(3, '<', '5')).toBe(true);
215
+ expect(matchesFilter(5, '<', '3')).toBe(false);
216
+ expect(matchesFilter(5, '<', '5')).toBe(false);
217
+ });
218
+ it('greater or equal', () => {
219
+ expect(matchesFilter(10, '>=', '10')).toBe(true);
220
+ expect(matchesFilter(11, '>=', '10')).toBe(true);
221
+ expect(matchesFilter(9, '>=', '10')).toBe(false);
222
+ });
223
+ it('less or equal', () => {
224
+ expect(matchesFilter(10, '<=', '10')).toBe(true);
225
+ expect(matchesFilter(9, '<=', '10')).toBe(true);
226
+ expect(matchesFilter(11, '<=', '10')).toBe(false);
227
+ });
228
+ it('contains (case-insensitive)', () => {
229
+ expect(matchesFilter('Hello World', 'contains', 'hello')).toBe(true);
230
+ expect(matchesFilter('Hello World', 'contains', 'WORLD')).toBe(true);
231
+ expect(matchesFilter('Hello', 'contains', 'xyz')).toBe(false);
232
+ });
233
+ it('returns false for null actual value with non-exists operator', () => {
234
+ expect(matchesFilter(null, '=', 'value')).toBe(false);
235
+ expect(matchesFilter(null, '>', '5')).toBe(false);
236
+ });
237
+ it('returns false for unknown operator', () => {
238
+ expect(matchesFilter('a', 'unknown', 'a')).toBe(false);
239
+ });
240
+ it('returns false for non-numeric comparison with > or <', () => {
241
+ expect(matchesFilter('abc', '>', 'def')).toBe(false);
242
+ expect(matchesFilter('abc', '<', 'def')).toBe(false);
243
+ });
244
+ });
245
+ describe('splitStepArgs', () => {
246
+ it('splits simple comma-separated values', () => {
247
+ expect(splitStepArgs("'abc',123,$,.T.")).toEqual(["'abc'", '123', '$', '.T.']);
248
+ });
249
+ it('handles nested parentheses', () => {
250
+ expect(splitStepArgs("'hello',(1,2,3),$")).toEqual(["'hello'", '(1,2,3)', '$']);
251
+ });
252
+ it('handles quoted strings with commas', () => {
253
+ expect(splitStepArgs("'hello, world',42")).toEqual(["'hello, world'", '42']);
254
+ });
255
+ it('handles escaped quotes in strings (doubled single quotes)', () => {
256
+ expect(splitStepArgs("'it''s a test',99")).toEqual(["'it''s a test'", '99']);
257
+ });
258
+ it('handles empty input', () => {
259
+ expect(splitStepArgs('')).toEqual([]);
260
+ });
261
+ it('handles single value', () => {
262
+ expect(splitStepArgs('42')).toEqual(['42']);
263
+ });
264
+ it('handles deeply nested parens', () => {
265
+ expect(splitStepArgs('#1,IFCWALL((1,(2,3)),4),#5')).toEqual(['#1', 'IFCWALL((1,(2,3)),4)', '#5']);
266
+ });
267
+ it('handles STEP null ($) and derived (*) markers', () => {
268
+ expect(splitStepArgs('$,$,*')).toEqual(['$', '$', '*']);
269
+ });
270
+ it('handles entity references', () => {
271
+ expect(splitStepArgs('#1,#2,#3')).toEqual(['#1', '#2', '#3']);
272
+ });
273
+ it('handles mixed content typical of IFC STEP lines', () => {
274
+ const result = splitStepArgs("'2aG1gNarLHm9Qs6Q3z97P1',#2,'Wall-001','An external wall',$");
275
+ expect(result).toHaveLength(5);
276
+ expect(result[0]).toBe("'2aG1gNarLHm9Qs6Q3z97P1'");
277
+ expect(result[1]).toBe('#2');
278
+ expect(result[2]).toBe("'Wall-001'");
279
+ expect(result[3]).toBe("'An external wall'");
280
+ expect(result[4]).toBe('$');
281
+ });
282
+ });
283
+ //# sourceMappingURL=mutate.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mutate.test.js","sourceRoot":"","sources":["../../src/commands/mutate.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ /**
2
+ * Aggregation utilities for query command — quantity lookup, sorting,
3
+ * and standard QTO maps.
4
+ */
5
+ /**
6
+ * Standard IFC quantity set definitions — maps entity type to its standard Qto_ sets
7
+ * and the quantities within each set. Used for disambiguation warnings.
8
+ */
9
+ export declare const STANDARD_QTO_MAP: Record<string, Record<string, string[]>>;
10
+ /**
11
+ * Helper: get a quantity value for an entity by name (searching all qsets).
12
+ */
13
+ export declare function getQuantityValue(bim: any, ref: any, quantityName: string): number | null;
14
+ /**
15
+ * F7: Sort entities by quantity, attribute, or property value.
16
+ * Supports: quantity names, entity attributes (name/type/globalId), PsetName.PropName
17
+ */
18
+ export declare function sortEntities(entities: any[], sortBy: string, descending: boolean, bim: any): any[];
19
+ //# sourceMappingURL=query-aggregation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"query-aggregation.d.ts","sourceRoot":"","sources":["../../src/commands/query-aggregation.ts"],"names":[],"mappings":"AAIA;;;GAGG;AAEH;;;GAGG;AACH,eAAO,MAAM,gBAAgB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CA2CrE,CAAC;AAEF;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,YAAY,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAQxF;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAAC,QAAQ,EAAE,GAAG,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,OAAO,EAAE,GAAG,EAAE,GAAG,GAAG,GAAG,EAAE,CA8ClG"}
@@ -0,0 +1,121 @@
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
+ * Aggregation utilities for query command — quantity lookup, sorting,
6
+ * and standard QTO maps.
7
+ */
8
+ /**
9
+ * Standard IFC quantity set definitions — maps entity type to its standard Qto_ sets
10
+ * and the quantities within each set. Used for disambiguation warnings.
11
+ */
12
+ export const STANDARD_QTO_MAP = {
13
+ IfcWall: {
14
+ Qto_WallBaseQuantities: ['Length', 'Width', 'Height', 'GrossFootprintArea', 'NetFootprintArea', 'GrossSideArea', 'NetSideArea', 'GrossVolume', 'NetVolume'],
15
+ },
16
+ IfcSlab: {
17
+ Qto_SlabBaseQuantities: ['Width', 'Length', 'Depth', 'Perimeter', 'GrossArea', 'NetArea', 'GrossVolume', 'NetVolume'],
18
+ },
19
+ IfcDoor: {
20
+ Qto_DoorBaseQuantities: ['Width', 'Height', 'Perimeter', 'Area'],
21
+ },
22
+ IfcWindow: {
23
+ Qto_WindowBaseQuantities: ['Width', 'Height', 'Perimeter', 'Area'],
24
+ },
25
+ IfcColumn: {
26
+ Qto_ColumnBaseQuantities: ['Length', 'CrossSectionArea', 'OuterSurfaceArea', 'GrossSurfaceArea', 'NetSurfaceArea', 'GrossVolume', 'NetVolume', 'GrossWeight', 'NetWeight'],
27
+ },
28
+ IfcBeam: {
29
+ Qto_BeamBaseQuantities: ['Length', 'CrossSectionArea', 'OuterSurfaceArea', 'GrossSurfaceArea', 'NetSurfaceArea', 'GrossVolume', 'NetVolume', 'GrossWeight', 'NetWeight'],
30
+ },
31
+ IfcSpace: {
32
+ Qto_SpaceBaseQuantities: ['Height', 'FinishCeilingHeight', 'FinishFloorHeight', 'GrossPerimeter', 'NetPerimeter', 'GrossFloorArea', 'NetFloorArea', 'GrossWallArea', 'NetWallArea', 'GrossCeilingArea', 'NetCeilingArea', 'GrossVolume', 'NetVolume'],
33
+ },
34
+ IfcRoof: {
35
+ Qto_RoofBaseQuantities: ['GrossArea', 'NetArea', 'ProjectedArea'],
36
+ },
37
+ IfcStair: {
38
+ Qto_StairBaseQuantities: ['Length', 'GrossVolume', 'NetVolume'],
39
+ },
40
+ IfcRailing: {
41
+ Qto_RailingBaseQuantities: ['Length'],
42
+ },
43
+ IfcMember: {
44
+ Qto_MemberBaseQuantities: ['Length', 'CrossSectionArea', 'OuterSurfaceArea', 'GrossSurfaceArea', 'NetSurfaceArea', 'GrossVolume', 'NetVolume', 'GrossWeight', 'NetWeight'],
45
+ },
46
+ IfcPlate: {
47
+ Qto_PlateBaseQuantities: ['Width', 'Length', 'Perimeter', 'GrossArea', 'NetArea', 'GrossVolume', 'NetVolume', 'GrossWeight', 'NetWeight'],
48
+ },
49
+ IfcCovering: {
50
+ Qto_CoveringBaseQuantities: ['Width', 'Length', 'GrossArea', 'NetArea'],
51
+ },
52
+ IfcFooting: {
53
+ Qto_FootingBaseQuantities: ['Length', 'Width', 'Height', 'CrossSectionArea', 'OuterSurfaceArea', 'GrossVolume', 'NetVolume', 'GrossWeight', 'NetWeight'],
54
+ },
55
+ };
56
+ /**
57
+ * Helper: get a quantity value for an entity by name (searching all qsets).
58
+ */
59
+ export function getQuantityValue(bim, ref, quantityName) {
60
+ const qsets = bim.quantities(ref);
61
+ for (const qset of qsets) {
62
+ for (const q of qset.quantities) {
63
+ if (q.name === quantityName)
64
+ return Number(q.value) || 0;
65
+ }
66
+ }
67
+ return null;
68
+ }
69
+ /**
70
+ * F7: Sort entities by quantity, attribute, or property value.
71
+ * Supports: quantity names, entity attributes (name/type/globalId), PsetName.PropName
72
+ */
73
+ export function sortEntities(entities, sortBy, descending, bim) {
74
+ const ATTR_KEYS = ['name', 'type', 'globalId', 'globalid', 'description', 'objectType', 'objecttype'];
75
+ const isAttr = ATTR_KEYS.includes(sortBy) || ATTR_KEYS.includes(sortBy.toLowerCase());
76
+ const isDotted = sortBy.includes('.');
77
+ return entities.slice().sort((a, b) => {
78
+ let valA;
79
+ let valB;
80
+ if (isAttr) {
81
+ // Sort by entity attribute (alphabetical)
82
+ const key = sortBy.toLowerCase() === 'globalid' ? 'globalId'
83
+ : sortBy.toLowerCase() === 'objecttype' ? 'objectType'
84
+ : sortBy.toLowerCase();
85
+ valA = a[key] ?? '';
86
+ valB = b[key] ?? '';
87
+ const cmp = String(valA).localeCompare(String(valB));
88
+ return descending ? -cmp : cmp;
89
+ }
90
+ else if (isDotted) {
91
+ // Sort by PsetName.PropName
92
+ const [psetName, propName] = sortBy.split('.', 2);
93
+ const getVal = (e) => {
94
+ const props = bim.properties(e.ref);
95
+ const pset = props.find((p) => p.name === psetName);
96
+ const prop = pset?.properties?.find((p) => p.name === propName);
97
+ if (prop?.value != null)
98
+ return prop.value;
99
+ // Also check quantity sets
100
+ const qsets = bim.quantities(e.ref);
101
+ const qset = qsets.find((q) => q.name === psetName);
102
+ const qty = qset?.quantities?.find((q) => q.name === propName);
103
+ return qty?.value ?? null;
104
+ };
105
+ valA = getVal(a);
106
+ valB = getVal(b);
107
+ if (typeof valA === 'number' && typeof valB === 'number') {
108
+ return descending ? valB - valA : valA - valB;
109
+ }
110
+ const cmp = String(valA ?? '').localeCompare(String(valB ?? ''));
111
+ return descending ? -cmp : cmp;
112
+ }
113
+ else {
114
+ // Sort by quantity name (numeric)
115
+ valA = getQuantityValue(bim, a.ref, sortBy) ?? 0;
116
+ valB = getQuantityValue(bim, b.ref, sortBy) ?? 0;
117
+ return descending ? valB - valA : valA - valB;
118
+ }
119
+ });
120
+ }
121
+ //# sourceMappingURL=query-aggregation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"query-aggregation.js","sourceRoot":"","sources":["../../src/commands/query-aggregation.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ /** Valid built-in grouping keys */
2
+ export declare const VALID_GROUP_BY_KEYS: string[];
3
+ export declare function outputCount(count: number, jsonOutput: boolean): void;
4
+ export declare function outputSum(entities: any[], quantityName: string, bim: any, jsonOutput: boolean): void;
5
+ /**
6
+ * B7/F2: --avg, --min, --max aggregation functions.
7
+ */
8
+ export declare function outputAggregation(entities: any[], quantityName: string, mode: 'avg' | 'min' | 'max', bim: any, jsonOutput: boolean): void;
9
+ export declare function outputGroupBy(entities: any[], groupByKey: string, sumQuantity: string | undefined, bim: any, jsonOutput: boolean, groupLimit?: number, aggMode?: 'sum' | 'avg' | 'min' | 'max'): void;
10
+ export declare function outputEntities(entities: any[], args: string[], bim: any, jsonOutput: boolean): void;
11
+ //# sourceMappingURL=query-output.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"query-output.d.ts","sourceRoot":"","sources":["../../src/commands/query-output.ts"],"names":[],"mappings":"AAYA,mCAAmC;AACnC,eAAO,MAAM,mBAAmB,UAAiC,CAAC;AAElE,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,OAAO,GAAG,IAAI,CAMpE;AAED,wBAAgB,SAAS,CAAC,QAAQ,EAAE,GAAG,EAAE,EAAE,YAAY,EAAE,MAAM,EAAE,GAAG,EAAE,GAAG,EAAE,UAAU,EAAE,OAAO,GAAG,IAAI,CAgGpG;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,GAAG,EAAE,EAAE,YAAY,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,GAAG,KAAK,GAAG,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,UAAU,EAAE,OAAO,GAAG,IAAI,CAwDzI;AAED,wBAAgB,aAAa,CAAC,QAAQ,EAAE,GAAG,EAAE,EAAE,UAAU,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,SAAS,EAAE,GAAG,EAAE,GAAG,EAAE,UAAU,EAAE,OAAO,EAAE,UAAU,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,KAAK,GAAG,KAAK,GAAG,KAAK,GAAG,KAAK,GAAG,IAAI,CAqGrM;AAED,wBAAgB,cAAc,CAAC,QAAQ,EAAE,GAAG,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,UAAU,EAAE,OAAO,GAAG,IAAI,CAyCnG"}