@ifc-lite/parser 6.5.0 → 7.1.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 (106) hide show
  1. package/README.md +21 -0
  2. package/dist/columnar-parser-root-attributes.d.ts +2 -5
  3. package/dist/columnar-parser-root-attributes.d.ts.map +1 -1
  4. package/dist/columnar-parser-root-attributes.js +22 -2
  5. package/dist/columnar-parser-root-attributes.js.map +1 -1
  6. package/dist/columnar-parser.d.ts +4 -0
  7. package/dist/columnar-parser.d.ts.map +1 -1
  8. package/dist/columnar-parser.js +2 -47
  9. package/dist/columnar-parser.js.map +1 -1
  10. package/dist/cost-category-buckets.d.ts +5 -0
  11. package/dist/cost-category-buckets.d.ts.map +1 -0
  12. package/dist/cost-category-buckets.js +37 -0
  13. package/dist/cost-category-buckets.js.map +1 -0
  14. package/dist/cost-compatibility-tree.d.ts +4 -0
  15. package/dist/cost-compatibility-tree.d.ts.map +1 -0
  16. package/dist/cost-compatibility-tree.js +46 -0
  17. package/dist/cost-compatibility-tree.js.map +1 -0
  18. package/dist/cost-evaluation-arithmetic.d.ts +16 -0
  19. package/dist/cost-evaluation-arithmetic.d.ts.map +1 -0
  20. package/dist/cost-evaluation-arithmetic.js +181 -0
  21. package/dist/cost-evaluation-arithmetic.js.map +1 -0
  22. package/dist/cost-evaluation-context.d.ts +20 -0
  23. package/dist/cost-evaluation-context.d.ts.map +1 -0
  24. package/dist/cost-evaluation-context.js +54 -0
  25. package/dist/cost-evaluation-context.js.map +1 -0
  26. package/dist/cost-evaluation-result.d.ts +5 -0
  27. package/dist/cost-evaluation-result.d.ts.map +1 -0
  28. package/dist/cost-evaluation-result.js +20 -0
  29. package/dist/cost-evaluation-result.js.map +1 -0
  30. package/dist/cost-evaluator.d.ts +6 -0
  31. package/dist/cost-evaluator.d.ts.map +1 -0
  32. package/dist/cost-evaluator.js +398 -0
  33. package/dist/cost-evaluator.js.map +1 -0
  34. package/dist/cost-extractor.d.ts +4 -8
  35. package/dist/cost-extractor.d.ts.map +1 -1
  36. package/dist/cost-extractor.js +346 -334
  37. package/dist/cost-extractor.js.map +1 -1
  38. package/dist/cost-overlay.d.ts +72 -0
  39. package/dist/cost-overlay.d.ts.map +1 -0
  40. package/dist/cost-overlay.js +5 -0
  41. package/dist/cost-overlay.js.map +1 -0
  42. package/dist/cost-quantities.d.ts +5 -0
  43. package/dist/cost-quantities.d.ts.map +1 -0
  44. package/dist/cost-quantities.js +116 -0
  45. package/dist/cost-quantities.js.map +1 -0
  46. package/dist/cost-quantity-evaluator.d.ts +23 -0
  47. package/dist/cost-quantity-evaluator.d.ts.map +1 -0
  48. package/dist/cost-quantity-evaluator.js +153 -0
  49. package/dist/cost-quantity-evaluator.js.map +1 -0
  50. package/dist/cost-reader.d.ts +59 -0
  51. package/dist/cost-reader.d.ts.map +1 -0
  52. package/dist/cost-reader.js +210 -0
  53. package/dist/cost-reader.js.map +1 -0
  54. package/dist/cost-relationships.d.ts +7 -0
  55. package/dist/cost-relationships.d.ts.map +1 -0
  56. package/dist/cost-relationships.js +237 -0
  57. package/dist/cost-relationships.js.map +1 -0
  58. package/dist/cost-step-lexemes.d.ts +16 -0
  59. package/dist/cost-step-lexemes.d.ts.map +1 -0
  60. package/dist/cost-step-lexemes.js +131 -0
  61. package/dist/cost-step-lexemes.js.map +1 -0
  62. package/dist/cost-types.d.ts +218 -76
  63. package/dist/cost-types.d.ts.map +1 -1
  64. package/dist/cost-units.d.ts +38 -0
  65. package/dist/cost-units.d.ts.map +1 -0
  66. package/dist/cost-units.js +348 -0
  67. package/dist/cost-units.js.map +1 -0
  68. package/dist/cost-value-evaluation-session.d.ts +19 -0
  69. package/dist/cost-value-evaluation-session.d.ts.map +1 -0
  70. package/dist/cost-value-evaluation-session.js +25 -0
  71. package/dist/cost-value-evaluation-session.js.map +1 -0
  72. package/dist/cost.d.ts +5 -0
  73. package/dist/cost.d.ts.map +1 -0
  74. package/dist/cost.js +6 -0
  75. package/dist/cost.js.map +1 -0
  76. package/dist/entity-extractor.d.ts.map +1 -1
  77. package/dist/entity-extractor.js +5 -2
  78. package/dist/entity-extractor.js.map +1 -1
  79. package/dist/index.d.ts +1 -2
  80. package/dist/index.d.ts.map +1 -1
  81. package/dist/index.js +1 -1
  82. package/dist/index.js.map +1 -1
  83. package/dist/on-demand-extractors.d.ts +3 -4
  84. package/dist/on-demand-extractors.d.ts.map +1 -1
  85. package/dist/on-demand-extractors.js +9 -6
  86. package/dist/on-demand-extractors.js.map +1 -1
  87. package/dist/project-units.d.ts.map +1 -1
  88. package/dist/project-units.js +8 -2
  89. package/dist/project-units.js.map +1 -1
  90. package/dist/property-unit.d.ts +24 -0
  91. package/dist/property-unit.d.ts.map +1 -0
  92. package/dist/property-unit.js +29 -0
  93. package/dist/property-unit.js.map +1 -0
  94. package/dist/step-entity-parameters.d.ts +9 -0
  95. package/dist/step-entity-parameters.d.ts.map +1 -0
  96. package/dist/step-entity-parameters.js +30 -0
  97. package/dist/step-entity-parameters.js.map +1 -0
  98. package/dist/worker-parser.d.ts +29 -1
  99. package/dist/worker-parser.d.ts.map +1 -1
  100. package/dist/worker-parser.js +80 -7
  101. package/dist/worker-parser.js.map +1 -1
  102. package/package.json +6 -5
  103. package/dist/cost-schedule-2x3.d.ts +0 -31
  104. package/dist/cost-schedule-2x3.d.ts.map +0 -1
  105. package/dist/cost-schedule-2x3.js +0 -75
  106. package/dist/cost-schedule-2x3.js.map +0 -1
@@ -0,0 +1,181 @@
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
+ function sameIdentity(left, right) {
5
+ return left.currency === right.currency && left.dimension === right.dimension &&
6
+ left.rateDimension === right.rateDimension;
7
+ }
8
+ function finite(result, valueId, report) {
9
+ if (result.amount?.isFinite())
10
+ return result;
11
+ report('INVALID_NUMBER', `IfcCostValue #${valueId} produced a non-finite decimal`, valueId);
12
+ return { invalid: true };
13
+ }
14
+ function combinedRateDimension(operands, valueId, report) {
15
+ const dimensions = new Set(operands.map(entry => entry.rateDimension).filter(entry => entry !== undefined));
16
+ if (dimensions.size <= 1)
17
+ return dimensions.values().next().value;
18
+ report('INCOMPATIBLE_UNIT', 'Cannot combine cost rates with different quantity dimensions', valueId);
19
+ return false;
20
+ }
21
+ function multiplicationDimensions(operands, valueId, report) {
22
+ let moneyExponent = 0;
23
+ const dimensions = new Map();
24
+ operands.forEach((operand) => {
25
+ const sign = 1;
26
+ if (operand.monetary || operand.currency !== undefined)
27
+ moneyExponent += sign;
28
+ else if (operand.dimension !== undefined && operand.dimension !== 'ratio') {
29
+ dimensions.set(operand.dimension, (dimensions.get(operand.dimension) ?? 0) + sign);
30
+ }
31
+ if (operand.rateDimension !== undefined) {
32
+ dimensions.set(operand.rateDimension, (dimensions.get(operand.rateDimension) ?? 0) - sign);
33
+ }
34
+ });
35
+ const nonzero = [...dimensions].filter(([, exponent]) => exponent !== 0);
36
+ const scalar = moneyExponent === 0 && nonzero.length === 0;
37
+ const quantity = moneyExponent === 0 && nonzero.length === 1 && nonzero[0][1] === 1;
38
+ const money = moneyExponent === 1 && nonzero.length === 0;
39
+ const rate = moneyExponent === 1 && nonzero.length === 1 && nonzero[0][1] === -1;
40
+ if (scalar)
41
+ return { dimension: 'ratio', monetary: false };
42
+ if (quantity)
43
+ return { dimension: nonzero[0][0], monetary: false };
44
+ if (money)
45
+ return {
46
+ currency: operands.find(entry => entry.monetary || entry.currency !== undefined)?.currency,
47
+ monetary: true,
48
+ };
49
+ if (rate)
50
+ return {
51
+ currency: operands.find(entry => entry.monetary || entry.currency !== undefined)?.currency,
52
+ rateDimension: nonzero[0][0], monetary: true,
53
+ };
54
+ report('INCOMPATIBLE_UNIT', 'Multiplication produces an unsupported compound dimension', valueId);
55
+ return false;
56
+ }
57
+ function divisionDimensions(operands, valueId, report) {
58
+ const currencies = new Set(operands.map(operand => operand.currency).filter((entry) => entry !== undefined));
59
+ if (currencies.size > 1) {
60
+ report('MIXED_CURRENCY', 'Division cannot combine different currencies', valueId);
61
+ return false;
62
+ }
63
+ const signed = operands.map((operand, index) => ({ operand, sign: index === 0 ? 1 : -1 }));
64
+ let moneyExponent = 0;
65
+ const dimensions = new Map();
66
+ for (const { operand, sign } of signed) {
67
+ if (operand.monetary || operand.currency !== undefined)
68
+ moneyExponent += sign;
69
+ else if (operand.dimension !== undefined && operand.dimension !== 'ratio') {
70
+ dimensions.set(operand.dimension, (dimensions.get(operand.dimension) ?? 0) + sign);
71
+ }
72
+ if (operand.rateDimension !== undefined) {
73
+ dimensions.set(operand.rateDimension, (dimensions.get(operand.rateDimension) ?? 0) - sign);
74
+ }
75
+ }
76
+ const nonzero = [...dimensions].filter(([, exponent]) => exponent !== 0);
77
+ if (moneyExponent === 0 && nonzero.length === 0)
78
+ return { dimension: 'ratio', monetary: false };
79
+ if (moneyExponent === 0 && nonzero.length === 1 && nonzero[0][1] === 1) {
80
+ return { dimension: nonzero[0][0], monetary: false };
81
+ }
82
+ if (moneyExponent === 1 && nonzero.length === 0)
83
+ return { currency: operands[0].currency, monetary: true };
84
+ if (moneyExponent === 1 && nonzero.length === 1 && nonzero[0][1] === -1) {
85
+ return { currency: operands[0].currency, rateDimension: nonzero[0][0], monetary: true };
86
+ }
87
+ report('INCOMPATIBLE_UNIT', 'Division produces an unsupported inverse or compound dimension', valueId);
88
+ return false;
89
+ }
90
+ export function combineCosts(operator, operands, valueId, report, normalizeImplicitRate) {
91
+ if (operands.length === 0) {
92
+ report('MISSING_VALUE', `IfcCostValue #${valueId} has no arithmetic operands`, valueId);
93
+ return { invalid: true };
94
+ }
95
+ if (operands.some(entry => entry.invalid || entry.amount === undefined)) {
96
+ report('MISSING_VALUE', `IfcCostValue #${valueId} depends on an invalid arithmetic operand`, valueId);
97
+ return { invalid: true };
98
+ }
99
+ const amounts = operands.map(entry => entry.amount);
100
+ if (operator === 'ADD' || operator === 'SUBTRACT') {
101
+ const explicitRateDimensions = new Set(operands.map(entry => entry.rateDimension).filter(entry => entry !== undefined));
102
+ if (explicitRateDimensions.size === 1 && normalizeImplicitRate) {
103
+ const dimension = explicitRateDimensions.values().next().value;
104
+ operands = operands.map(entry => entry.rateDimension === undefined && entry.currency !== undefined
105
+ ? normalizeImplicitRate(entry, dimension)
106
+ : entry);
107
+ if (operands.some(entry => entry.invalid || entry.amount === undefined))
108
+ return { invalid: true };
109
+ }
110
+ if (operands.slice(1).some(entry => !sameIdentity(operands[0], entry))) {
111
+ const currencies = new Set(operands.map(entry => entry.currency).filter(Boolean));
112
+ report(currencies.size > 1 ? 'MIXED_CURRENCY' : 'INCOMPATIBLE_UNIT', `Cannot ${operator.toLowerCase()} values with different units`, valueId);
113
+ return { invalid: true };
114
+ }
115
+ const rateDimension = combinedRateDimension(operands, valueId, report);
116
+ if (rateDimension === false)
117
+ return { invalid: true };
118
+ const normalizedAmounts = operands.map(entry => entry.amount);
119
+ let amount = normalizedAmounts[0];
120
+ for (const next of normalizedAmounts.slice(1)) {
121
+ const combined = operator === 'ADD' ? amount.plus(next) : amount.minus(next);
122
+ const exactlyZero = operator === 'ADD' ? amount.eq(next.negated()) : amount.eq(next);
123
+ if (combined.isZero() && !exactlyZero) {
124
+ report('INVALID_NUMBER', `IfcCostValue #${valueId} underflowed during ${operator.toLowerCase()}`, valueId);
125
+ return { invalid: true };
126
+ }
127
+ amount = combined;
128
+ }
129
+ return finite({
130
+ amount, currency: operands[0].currency, dimension: operands[0].dimension,
131
+ rateDimension, monetary: operands[0].monetary,
132
+ quantityApplied: operands.find(entry => entry.quantityApplied)?.quantityApplied,
133
+ }, valueId, report);
134
+ }
135
+ if (operator === 'MULTIPLY') {
136
+ const identity = multiplicationDimensions(operands, valueId, report);
137
+ if (!identity) {
138
+ return { invalid: true };
139
+ }
140
+ let amount = amounts[0];
141
+ for (const next of amounts.slice(1)) {
142
+ const multiplied = amount.mul(next);
143
+ if (multiplied.isZero() && !amount.isZero() && !next.isZero()) {
144
+ report('INVALID_NUMBER', `IfcCostValue #${valueId} underflowed during multiplication`, valueId);
145
+ return { invalid: true };
146
+ }
147
+ amount = multiplied;
148
+ }
149
+ return finite({
150
+ amount, ...identity,
151
+ quantityApplied: operands.find(entry => entry.quantityApplied)?.quantityApplied,
152
+ }, valueId, report);
153
+ }
154
+ if (operator === 'DIVIDE') {
155
+ for (const divisor of amounts.slice(1)) {
156
+ if (divisor.isZero()) {
157
+ report('DIVISION_BY_ZERO', `IfcCostValue #${valueId} divides by zero`, valueId);
158
+ return { invalid: true };
159
+ }
160
+ }
161
+ const dimensions = divisionDimensions(operands, valueId, report);
162
+ if (dimensions === false)
163
+ return { invalid: true };
164
+ let amount = amounts[0];
165
+ for (const next of amounts.slice(1)) {
166
+ const divided = amount.div(next);
167
+ if (divided.isZero() && !amount.isZero()) {
168
+ report('INVALID_NUMBER', `IfcCostValue #${valueId} underflowed during division`, valueId);
169
+ return { invalid: true };
170
+ }
171
+ amount = divided;
172
+ }
173
+ return finite({
174
+ amount, ...dimensions,
175
+ quantityApplied: operands.find(entry => entry.quantityApplied)?.quantityApplied,
176
+ }, valueId, report);
177
+ }
178
+ report('UNSUPPORTED_APPLIED_VALUE', `Arithmetic operator ${operator || '(missing)'} is not supported`, valueId);
179
+ return { invalid: true };
180
+ }
181
+ //# sourceMappingURL=cost-evaluation-arithmetic.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cost-evaluation-arithmetic.js","sourceRoot":"","sources":["../src/cost-evaluation-arithmetic.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ import { Decimal } from 'decimal.js';
2
+ import { type QuantityEvaluationCache } from './cost-quantity-evaluator.js';
3
+ import type { CostDiagnostic, CostEvaluationOptions, CostGraphExtraction, CostMeasureWithUnitInfo, CostQuantityDimension, CostQuantityInfo, CostUnitInfo, CostValueInfo } from './cost-types.js';
4
+ export interface CostEvaluationContext {
5
+ DecimalValue: Decimal.Constructor;
6
+ extraction: CostGraphExtraction;
7
+ values: Map<number, CostValueInfo>;
8
+ quantities: Map<number, CostQuantityInfo>;
9
+ units: Map<number, CostUnitInfo>;
10
+ measures: Map<number, CostMeasureWithUnitInfo>;
11
+ mixedProjectCurrency: boolean;
12
+ quantityCache: QuantityEvaluationCache;
13
+ diagnostics: CostDiagnostic[];
14
+ invalidOptions: boolean;
15
+ }
16
+ export declare function diagnostic(context: CostEvaluationContext, Code: CostDiagnostic['Code'], Message: string, expressId: number, Severity?: CostDiagnostic['Severity']): void;
17
+ export declare function decimal(value: string, expressId: number, context: CostEvaluationContext): Decimal | undefined;
18
+ export declare function projectUnit(dimension: CostQuantityDimension, context: CostEvaluationContext): CostUnitInfo | undefined;
19
+ export declare function createContext(extraction: CostGraphExtraction, options?: CostEvaluationOptions): CostEvaluationContext;
20
+ //# sourceMappingURL=cost-evaluation-context.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cost-evaluation-context.d.ts","sourceRoot":"","sources":["../src/cost-evaluation-context.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AACrC,OAAO,EAA2B,KAAK,uBAAuB,EAAE,MAAM,8BAA8B,CAAC;AAErG,OAAO,KAAK,EACV,cAAc,EAAE,qBAAqB,EAAE,mBAAmB,EAAE,uBAAuB,EACnF,qBAAqB,EAAE,gBAAgB,EAAE,YAAY,EAAE,aAAa,EACrE,MAAM,iBAAiB,CAAC;AAEzB,MAAM,WAAW,qBAAqB;IACpC,YAAY,EAAE,OAAO,CAAC,WAAW,CAAC;IAClC,UAAU,EAAE,mBAAmB,CAAC;IAChC,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;IACnC,UAAU,EAAE,GAAG,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAAC;IAC1C,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;IACjC,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE,uBAAuB,CAAC,CAAC;IAC/C,oBAAoB,EAAE,OAAO,CAAC;IAC9B,aAAa,EAAE,uBAAuB,CAAC;IACvC,WAAW,EAAE,cAAc,EAAE,CAAC;IAC9B,cAAc,EAAE,OAAO,CAAC;CACzB;AAED,wBAAgB,UAAU,CAAC,OAAO,EAAE,qBAAqB,EAAE,IAAI,EAAE,cAAc,CAAC,MAAM,CAAC,EAAE,OAAO,EAAE,MAAM,EACtG,SAAS,EAAE,MAAM,EAAE,QAAQ,GAAE,cAAc,CAAC,UAAU,CAAW,GAAG,IAAI,CAEzE;AAED,wBAAgB,OAAO,CACrB,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,qBAAqB,GAC/D,OAAO,GAAG,SAAS,CAUrB;AAED,wBAAgB,WAAW,CACzB,SAAS,EAAE,qBAAqB,EAAE,OAAO,EAAE,qBAAqB,GAC/D,YAAY,GAAG,SAAS,CAG1B;AAED,wBAAgB,aAAa,CAC3B,UAAU,EAAE,mBAAmB,EAAE,OAAO,CAAC,EAAE,qBAAqB,GAC/D,qBAAqB,CAwBvB"}
@@ -0,0 +1,54 @@
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 { Decimal } from 'decimal.js';
5
+ import { quantityEvaluationCache } from './cost-quantity-evaluator.js';
6
+ import { isZeroCostNumericLexeme } from './cost-step-lexemes.js';
7
+ export function diagnostic(context, Code, Message, expressId, Severity = 'error') {
8
+ context.diagnostics.push({ Code, Message, Severity, expressId });
9
+ }
10
+ export function decimal(value, expressId, context) {
11
+ try {
12
+ const parsed = new context.DecimalValue(value);
13
+ if (parsed.isFinite() && !(parsed.isZero() && !isZeroCostNumericLexeme(value)))
14
+ return parsed;
15
+ }
16
+ catch (error) {
17
+ diagnostic(context, 'INVALID_NUMBER', `#${expressId} contains an invalid decimal: ${String(error)}`, expressId);
18
+ return undefined;
19
+ }
20
+ diagnostic(context, 'INVALID_NUMBER', `#${expressId} contains a non-finite or underflowed decimal`, expressId);
21
+ return undefined;
22
+ }
23
+ export function projectUnit(dimension, context) {
24
+ const id = context.extraction.ProjectUnits[dimension];
25
+ return id === undefined ? undefined : context.units.get(id);
26
+ }
27
+ export function createContext(extraction, options) {
28
+ const maximumPrecision = 10_000;
29
+ const requestedPrecision = options?.Precision;
30
+ const invalidOptions = requestedPrecision !== undefined &&
31
+ (!Number.isInteger(requestedPrecision) || requestedPrecision < 1 || requestedPrecision > maximumPrecision);
32
+ const diagnostics = invalidOptions ? [{
33
+ Code: 'INVALID_NUMBER',
34
+ Message: `Cost evaluation Precision must be an integer from 1 through ${maximumPrecision}; received ${String(requestedPrecision)}`,
35
+ Severity: 'error',
36
+ }] : [];
37
+ const DecimalValue = Decimal.clone({
38
+ precision: invalidOptions ? 34 : requestedPrecision ?? 34,
39
+ rounding: Decimal.ROUND_HALF_EVEN, maxE: 6144, minE: -6144,
40
+ });
41
+ const values = new Map();
42
+ for (const value of extraction.CostValues)
43
+ if (value.expressId !== undefined)
44
+ values.set(value.expressId, value);
45
+ return {
46
+ DecimalValue, extraction, values,
47
+ quantities: new Map(extraction.CostQuantities.map(value => [value.expressId, value])),
48
+ units: new Map(extraction.Units.map(value => [value.expressId, value])),
49
+ measures: new Map(extraction.MeasuresWithUnit.map(value => [value.expressId, value])),
50
+ mixedProjectCurrency: extraction.Diagnostics.some(entry => entry.Code === 'MIXED_CURRENCY'),
51
+ quantityCache: quantityEvaluationCache(), diagnostics, invalidOptions,
52
+ };
53
+ }
54
+ //# sourceMappingURL=cost-evaluation-context.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cost-evaluation-context.js","sourceRoot":"","sources":["../src/cost-evaluation-context.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ import type { EvaluatedCost } from './cost-evaluation-arithmetic.js';
2
+ import type { CostDiagnostic, CostEvaluationResult, CostGraphExtraction } from './cost-types.js';
3
+ export declare function unsupportedCostEvaluation(extraction: CostGraphExtraction, expressId: number): CostEvaluationResult | undefined;
4
+ export declare function costEvaluationResult(expressId: number, value: EvaluatedCost, diagnostics: CostDiagnostic[]): CostEvaluationResult;
5
+ //# sourceMappingURL=cost-evaluation-result.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cost-evaluation-result.d.ts","sourceRoot":"","sources":["../src/cost-evaluation-result.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,iCAAiC,CAAC;AACrE,OAAO,KAAK,EAAE,cAAc,EAAE,oBAAoB,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AAEjG,wBAAgB,yBAAyB,CACvC,UAAU,EAAE,mBAAmB,EAAE,SAAS,EAAE,MAAM,GACjD,oBAAoB,GAAG,SAAS,CAOlC;AAED,wBAAgB,oBAAoB,CAClC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,aAAa,EAAE,WAAW,EAAE,cAAc,EAAE,GACrE,oBAAoB,CAMtB"}
@@ -0,0 +1,20 @@
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
+ export function unsupportedCostEvaluation(extraction, expressId) {
5
+ if (extraction.SchemaVersion !== 'IFC2X3' && extraction.SchemaVersion !== 'IFC5')
6
+ return undefined;
7
+ return { expressId, Diagnostics: [{
8
+ Code: extraction.SchemaVersion === 'IFC2X3' ? 'IFC2X3_PARTIAL_READ' : 'UNSUPPORTED_SCHEMA',
9
+ Message: `${extraction.SchemaVersion} cost values are preserved for inspection but not evaluated`,
10
+ Severity: 'warning', expressId,
11
+ }] };
12
+ }
13
+ export function costEvaluationResult(expressId, value, diagnostics) {
14
+ return {
15
+ expressId, Amount: value.invalid ? undefined : value.amount?.toString(), Currency: value.currency,
16
+ Dimension: value.rateDimension ?? value.dimension, QuantityApplied: value.quantityApplied?.toString(),
17
+ Diagnostics: diagnostics,
18
+ };
19
+ }
20
+ //# sourceMappingURL=cost-evaluation-result.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cost-evaluation-result.js","sourceRoot":"","sources":["../src/cost-evaluation-result.ts"],"names":[],"mappings":"AAAA;;+DAE+D;AAK/D,MAAM,UAAU,yBAAyB,CACvC,UAA+B,EAAE,SAAiB;IAElD,IAAI,UAAU,CAAC,aAAa,KAAK,QAAQ,IAAI,UAAU,CAAC,aAAa,KAAK,MAAM;QAAE,OAAO,SAAS,CAAC;IACnG,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,CAAC;gBAChC,IAAI,EAAE,UAAU,CAAC,aAAa,KAAK,QAAQ,CAAC,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,oBAAoB;gBAC1F,OAAO,EAAE,GAAG,UAAU,CAAC,aAAa,6DAA6D;gBACjG,QAAQ,EAAE,SAAS,EAAE,SAAS;aAC/B,CAAC,EAAE,CAAC;AACP,CAAC;AAED,MAAM,UAAU,oBAAoB,CAClC,SAAiB,EAAE,KAAoB,EAAE,WAA6B;IAEtE,OAAO;QACL,SAAS,EAAE,MAAM,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,EAAE,QAAQ,EAAE,EAAE,QAAQ,EAAE,KAAK,CAAC,QAAQ;QACjG,SAAS,EAAE,KAAK,CAAC,aAAa,IAAI,KAAK,CAAC,SAAS,EAAE,eAAe,EAAE,KAAK,CAAC,eAAe,EAAE,QAAQ,EAAE;QACrG,WAAW,EAAE,WAAW;KACzB,CAAC;AACJ,CAAC"}
@@ -0,0 +1,6 @@
1
+ import type { CostEvaluationOptions, CostEvaluationResult, CostGraphExtraction } from './cost-types.js';
2
+ /** Evaluate one IFC4/IFC4X3 applied-value expression using decimal arithmetic. */
3
+ export declare function evaluateCostValue(extraction: CostGraphExtraction, expressId: number, options?: CostEvaluationOptions): CostEvaluationResult;
4
+ /** Evaluate a cost item, including IFC category-based totals of nested cost items. */
5
+ export declare function evaluateCostItem(extraction: CostGraphExtraction, expressId: number, options?: CostEvaluationOptions): CostEvaluationResult;
6
+ //# sourceMappingURL=cost-evaluator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cost-evaluator.d.ts","sourceRoot":"","sources":["../src/cost-evaluator.ts"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAAE,qBAAqB,EAAE,oBAAoB,EAAE,mBAAmB,EACtC,MAAM,iBAAiB,CAAC;AAyOhE,kFAAkF;AAClF,wBAAgB,iBAAiB,CAAC,UAAU,EAAE,mBAAmB,EAAE,SAAS,EAAE,MAAM,EAClF,OAAO,CAAC,EAAE,qBAAqB,GAAG,oBAAoB,CAMvD;AAED,sFAAsF;AACtF,wBAAgB,gBAAgB,CAAC,UAAU,EAAE,mBAAmB,EAAE,SAAS,EAAE,MAAM,EACjF,OAAO,CAAC,EAAE,qBAAqB,GAAG,oBAAoB,CAqIvD"}