@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.
- package/README.md +21 -0
- package/dist/columnar-parser-root-attributes.d.ts +2 -5
- package/dist/columnar-parser-root-attributes.d.ts.map +1 -1
- package/dist/columnar-parser-root-attributes.js +22 -2
- package/dist/columnar-parser-root-attributes.js.map +1 -1
- package/dist/columnar-parser.d.ts +4 -0
- package/dist/columnar-parser.d.ts.map +1 -1
- package/dist/columnar-parser.js +2 -47
- package/dist/columnar-parser.js.map +1 -1
- package/dist/cost-category-buckets.d.ts +5 -0
- package/dist/cost-category-buckets.d.ts.map +1 -0
- package/dist/cost-category-buckets.js +37 -0
- package/dist/cost-category-buckets.js.map +1 -0
- package/dist/cost-compatibility-tree.d.ts +4 -0
- package/dist/cost-compatibility-tree.d.ts.map +1 -0
- package/dist/cost-compatibility-tree.js +46 -0
- package/dist/cost-compatibility-tree.js.map +1 -0
- package/dist/cost-evaluation-arithmetic.d.ts +16 -0
- package/dist/cost-evaluation-arithmetic.d.ts.map +1 -0
- package/dist/cost-evaluation-arithmetic.js +181 -0
- package/dist/cost-evaluation-arithmetic.js.map +1 -0
- package/dist/cost-evaluation-context.d.ts +20 -0
- package/dist/cost-evaluation-context.d.ts.map +1 -0
- package/dist/cost-evaluation-context.js +54 -0
- package/dist/cost-evaluation-context.js.map +1 -0
- package/dist/cost-evaluation-result.d.ts +5 -0
- package/dist/cost-evaluation-result.d.ts.map +1 -0
- package/dist/cost-evaluation-result.js +20 -0
- package/dist/cost-evaluation-result.js.map +1 -0
- package/dist/cost-evaluator.d.ts +6 -0
- package/dist/cost-evaluator.d.ts.map +1 -0
- package/dist/cost-evaluator.js +398 -0
- package/dist/cost-evaluator.js.map +1 -0
- package/dist/cost-extractor.d.ts +4 -8
- package/dist/cost-extractor.d.ts.map +1 -1
- package/dist/cost-extractor.js +346 -334
- package/dist/cost-extractor.js.map +1 -1
- package/dist/cost-overlay.d.ts +72 -0
- package/dist/cost-overlay.d.ts.map +1 -0
- package/dist/cost-overlay.js +5 -0
- package/dist/cost-overlay.js.map +1 -0
- package/dist/cost-quantities.d.ts +5 -0
- package/dist/cost-quantities.d.ts.map +1 -0
- package/dist/cost-quantities.js +116 -0
- package/dist/cost-quantities.js.map +1 -0
- package/dist/cost-quantity-evaluator.d.ts +23 -0
- package/dist/cost-quantity-evaluator.d.ts.map +1 -0
- package/dist/cost-quantity-evaluator.js +153 -0
- package/dist/cost-quantity-evaluator.js.map +1 -0
- package/dist/cost-reader.d.ts +59 -0
- package/dist/cost-reader.d.ts.map +1 -0
- package/dist/cost-reader.js +210 -0
- package/dist/cost-reader.js.map +1 -0
- package/dist/cost-relationships.d.ts +7 -0
- package/dist/cost-relationships.d.ts.map +1 -0
- package/dist/cost-relationships.js +237 -0
- package/dist/cost-relationships.js.map +1 -0
- package/dist/cost-step-lexemes.d.ts +16 -0
- package/dist/cost-step-lexemes.d.ts.map +1 -0
- package/dist/cost-step-lexemes.js +131 -0
- package/dist/cost-step-lexemes.js.map +1 -0
- package/dist/cost-types.d.ts +218 -76
- package/dist/cost-types.d.ts.map +1 -1
- package/dist/cost-units.d.ts +38 -0
- package/dist/cost-units.d.ts.map +1 -0
- package/dist/cost-units.js +348 -0
- package/dist/cost-units.js.map +1 -0
- package/dist/cost-value-evaluation-session.d.ts +19 -0
- package/dist/cost-value-evaluation-session.d.ts.map +1 -0
- package/dist/cost-value-evaluation-session.js +25 -0
- package/dist/cost-value-evaluation-session.js.map +1 -0
- package/dist/cost.d.ts +5 -0
- package/dist/cost.d.ts.map +1 -0
- package/dist/cost.js +6 -0
- package/dist/cost.js.map +1 -0
- package/dist/entity-extractor.d.ts.map +1 -1
- package/dist/entity-extractor.js +5 -2
- package/dist/entity-extractor.js.map +1 -1
- package/dist/index.d.ts +1 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/on-demand-extractors.d.ts +3 -4
- package/dist/on-demand-extractors.d.ts.map +1 -1
- package/dist/on-demand-extractors.js +9 -6
- package/dist/on-demand-extractors.js.map +1 -1
- package/dist/project-units.d.ts.map +1 -1
- package/dist/project-units.js +8 -2
- package/dist/project-units.js.map +1 -1
- package/dist/property-unit.d.ts +24 -0
- package/dist/property-unit.d.ts.map +1 -0
- package/dist/property-unit.js +29 -0
- package/dist/property-unit.js.map +1 -0
- package/dist/step-entity-parameters.d.ts +9 -0
- package/dist/step-entity-parameters.d.ts.map +1 -0
- package/dist/step-entity-parameters.js +30 -0
- package/dist/step-entity-parameters.js.map +1 -0
- package/dist/worker-parser.d.ts +29 -1
- package/dist/worker-parser.d.ts.map +1 -1
- package/dist/worker-parser.js +80 -7
- package/dist/worker-parser.js.map +1 -1
- package/package.json +6 -5
- package/dist/cost-schedule-2x3.d.ts +0 -31
- package/dist/cost-schedule-2x3.d.ts.map +0 -1
- package/dist/cost-schedule-2x3.js +0 -75
- 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":"AAAA;;+DAE+D;AAyB/D,SAAS,YAAY,CAAC,IAAmB,EAAE,KAAoB;IAC7D,OAAO,IAAI,CAAC,QAAQ,KAAK,KAAK,CAAC,QAAQ,IAAI,IAAI,CAAC,SAAS,KAAK,KAAK,CAAC,SAAS;QAC3E,IAAI,CAAC,aAAa,KAAK,KAAK,CAAC,aAAa,CAAC;AAC/C,CAAC;AAED,SAAS,MAAM,CAAC,MAAqB,EAAE,OAAe,EAAE,MAA0B;IAChF,IAAI,MAAM,CAAC,MAAM,EAAE,QAAQ,EAAE;QAAE,OAAO,MAAM,CAAC;IAC7C,MAAM,CAAC,gBAAgB,EAAE,iBAAiB,OAAO,gCAAgC,EAAE,OAAO,CAAC,CAAC;IAC5F,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;AAC3B,CAAC;AAED,SAAS,qBAAqB,CAC5B,QAAyB,EAAE,OAAe,EAAE,MAA0B;IAEtE,MAAM,UAAU,GAAG,IAAI,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC;IAC5G,IAAI,UAAU,CAAC,IAAI,IAAI,CAAC;QAAE,OAAO,UAAU,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC;IAClE,MAAM,CAAC,mBAAmB,EAAE,8DAA8D,EAAE,OAAO,CAAC,CAAC;IACrG,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,wBAAwB,CAC/B,QAAyB,EAAE,OAAe,EAAE,MAA0B;IAEtE,IAAI,aAAa,GAAG,CAAC,CAAC;IACtB,MAAM,UAAU,GAAG,IAAI,GAAG,EAAiC,CAAC;IAC5D,QAAQ,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QAC3B,MAAM,IAAI,GAAG,CAAC,CAAC;QACf,IAAI,OAAO,CAAC,QAAQ,IAAI,OAAO,CAAC,QAAQ,KAAK,SAAS;YAAE,aAAa,IAAI,IAAI,CAAC;aACzE,IAAI,OAAO,CAAC,SAAS,KAAK,SAAS,IAAI,OAAO,CAAC,SAAS,KAAK,OAAO,EAAE,CAAC;YAC1E,UAAU,CAAC,GAAG,CAAC,OAAO,CAAC,SAAS,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,OAAO,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;QACrF,CAAC;QACD,IAAI,OAAO,CAAC,aAAa,KAAK,SAAS,EAAE,CAAC;YACxC,UAAU,CAAC,GAAG,CAAC,OAAO,CAAC,aAAa,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,OAAO,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;QAC7F,CAAC;IACH,CAAC,CAAC,CAAC;IACH,MAAM,OAAO,GAAG,CAAC,GAAG,UAAU,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,QAAQ,CAAC,EAAE,EAAE,CAAC,QAAQ,KAAK,CAAC,CAAC,CAAC;IACzE,MAAM,MAAM,GAAG,aAAa,KAAK,CAAC,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,CAAC;IAC3D,MAAM,QAAQ,GAAG,aAAa,KAAK,CAAC,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,IAAI,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;IACpF,MAAM,KAAK,GAAG,aAAa,KAAK,CAAC,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,CAAC;IAC1D,MAAM,IAAI,GAAG,aAAa,KAAK,CAAC,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,IAAI,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;IACjF,IAAI,MAAM;QAAE,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC;IAC3D,IAAI,QAAQ;QAAE,OAAO,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC;IACnE,IAAI,KAAK;QAAE,OAAO;YAChB,QAAQ,EAAE,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,QAAQ,IAAI,KAAK,CAAC,QAAQ,KAAK,SAAS,CAAC,EAAE,QAAQ;YAC1F,QAAQ,EAAE,IAAI;SACf,CAAC;IACF,IAAI,IAAI;QAAE,OAAO;YACf,QAAQ,EAAE,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,QAAQ,IAAI,KAAK,CAAC,QAAQ,KAAK,SAAS,CAAC,EAAE,QAAQ;YAC1F,aAAa,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,IAAI;SAC7C,CAAC;IACF,MAAM,CAAC,mBAAmB,EAAE,2DAA2D,EAAE,OAAO,CAAC,CAAC;IAClG,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,kBAAkB,CACzB,QAAyB,EAAE,OAAe,EAAE,MAA0B;IAEtE,MAAM,UAAU,GAAG,IAAI,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,CAAC,KAAK,EAAmB,EAAE,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC;IAC9H,IAAI,UAAU,CAAC,IAAI,GAAG,CAAC,EAAE,CAAC;QACxB,MAAM,CAAC,gBAAgB,EAAE,8CAA8C,EAAE,OAAO,CAAC,CAAC;QAClF,OAAO,KAAK,CAAC;IACf,CAAC;IACD,MAAM,MAAM,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAC3F,IAAI,aAAa,GAAG,CAAC,CAAC;IACtB,MAAM,UAAU,GAAG,IAAI,GAAG,EAAiC,CAAC;IAC5D,KAAK,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,MAAM,EAAE,CAAC;QACvC,IAAI,OAAO,CAAC,QAAQ,IAAI,OAAO,CAAC,QAAQ,KAAK,SAAS;YAAE,aAAa,IAAI,IAAI,CAAC;aACzE,IAAI,OAAO,CAAC,SAAS,KAAK,SAAS,IAAI,OAAO,CAAC,SAAS,KAAK,OAAO,EAAE,CAAC;YAC1E,UAAU,CAAC,GAAG,CAAC,OAAO,CAAC,SAAS,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,OAAO,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;QACrF,CAAC;QACD,IAAI,OAAO,CAAC,aAAa,KAAK,SAAS,EAAE,CAAC;YACxC,UAAU,CAAC,GAAG,CAAC,OAAO,CAAC,aAAa,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,OAAO,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;QAC7F,CAAC;IACH,CAAC;IACD,MAAM,OAAO,GAAG,CAAC,GAAG,UAAU,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,QAAQ,CAAC,EAAE,EAAE,CAAC,QAAQ,KAAK,CAAC,CAAC,CAAC;IACzE,IAAI,aAAa,KAAK,CAAC,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC;IAChG,IAAI,aAAa,KAAK,CAAC,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,IAAI,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC;QACvE,OAAO,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC;IACvD,CAAC;IACD,IAAI,aAAa,KAAK,CAAC,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;IAC3G,IAAI,aAAa,KAAK,CAAC,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,IAAI,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC;QACxE,OAAO,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,aAAa,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;IAC1F,CAAC;IACD,MAAM,CAAC,mBAAmB,EAAE,gEAAgE,EAAE,OAAO,CAAC,CAAC;IACvG,OAAO,KAAK,CAAC;AACf,CAAC;AAED,MAAM,UAAU,YAAY,CAC1B,QAAgB,EAAE,QAAyB,EAAE,OAAe,EAAE,MAA0B,EACxF,qBAA8C;IAE9C,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC1B,MAAM,CAAC,eAAe,EAAE,iBAAiB,OAAO,6BAA6B,EAAE,OAAO,CAAC,CAAC;QACxF,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;IAC3B,CAAC;IACD,IAAI,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,OAAO,IAAI,KAAK,CAAC,MAAM,KAAK,SAAS,CAAC,EAAE,CAAC;QACxE,MAAM,CAAC,eAAe,EAAE,iBAAiB,OAAO,2CAA2C,EAAE,OAAO,CAAC,CAAC;QACtG,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;IAC3B,CAAC;IACD,MAAM,OAAO,GAAG,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,MAAiB,CAAC,CAAC;IAC/D,IAAI,QAAQ,KAAK,KAAK,IAAI,QAAQ,KAAK,UAAU,EAAE,CAAC;QAClD,MAAM,sBAAsB,GAAG,IAAI,GAAG,CACpC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,KAAK,SAAS,CAAC,CAChF,CAAC;QACF,IAAI,sBAAsB,CAAC,IAAI,KAAK,CAAC,IAAI,qBAAqB,EAAE,CAAC;YAC/D,MAAM,SAAS,GAAG,sBAAsB,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,KAA8B,CAAC;YACxF,QAAQ,GAAG,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,aAAa,KAAK,SAAS,IAAI,KAAK,CAAC,QAAQ,KAAK,SAAS;gBAChG,CAAC,CAAC,qBAAqB,CAAC,KAAK,EAAE,SAAS,CAAC;gBACzC,CAAC,CAAC,KAAK,CAAC,CAAC;YACX,IAAI,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,OAAO,IAAI,KAAK,CAAC,MAAM,KAAK,SAAS,CAAC;gBAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;QACpG,CAAC;QACD,IAAI,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,EAAE,CAAC;YACvE,MAAM,UAAU,GAAG,IAAI,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC;YAClF,MAAM,CAAC,UAAU,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,mBAAmB,EACjE,UAAU,QAAQ,CAAC,WAAW,EAAE,8BAA8B,EAAE,OAAO,CAAC,CAAC;YAC3E,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;QAC3B,CAAC;QACD,MAAM,aAAa,GAAG,qBAAqB,CAAC,QAAQ,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;QACvE,IAAI,aAAa,KAAK,KAAK;YAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;QACtD,MAAM,iBAAiB,GAAG,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,MAAiB,CAAC,CAAC;QACzE,IAAI,MAAM,GAAG,iBAAiB,CAAC,CAAC,CAAC,CAAC;QAClC,KAAK,MAAM,IAAI,IAAI,iBAAiB,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;YAC9C,MAAM,QAAQ,GAAG,QAAQ,KAAK,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YAC7E,MAAM,WAAW,GAAG,QAAQ,KAAK,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC;YACrF,IAAI,QAAQ,CAAC,MAAM,EAAE,IAAI,CAAC,WAAW,EAAE,CAAC;gBACtC,MAAM,CAAC,gBAAgB,EAAE,iBAAiB,OAAO,uBAAuB,QAAQ,CAAC,WAAW,EAAE,EAAE,EAAE,OAAO,CAAC,CAAC;gBAC3G,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;YAC3B,CAAC;YACD,MAAM,GAAG,QAAQ,CAAC;QACpB,CAAC;QACD,OAAO,MAAM,CAAC;YACZ,MAAM,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,SAAS,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,SAAS;YACxE,aAAa,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ;YAC7C,eAAe,EAAE,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,eAAe,CAAC,EAAE,eAAe;SAChF,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;IACtB,CAAC;IACD,IAAI,QAAQ,KAAK,UAAU,EAAE,CAAC;QAC5B,MAAM,QAAQ,GAAG,wBAAwB,CAAC,QAAQ,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;QACrE,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;QAC3B,CAAC;QACD,IAAI,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;QACxB,KAAK,MAAM,IAAI,IAAI,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;YACpC,MAAM,UAAU,GAAG,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YACpC,IAAI,UAAU,CAAC,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC;gBAC9D,MAAM,CAAC,gBAAgB,EAAE,iBAAiB,OAAO,oCAAoC,EAAE,OAAO,CAAC,CAAC;gBAChG,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;YAC3B,CAAC;YACD,MAAM,GAAG,UAAU,CAAC;QACtB,CAAC;QACD,OAAO,MAAM,CAAC;YACZ,MAAM,EAAE,GAAG,QAAQ;YACnB,eAAe,EAAE,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,eAAe,CAAC,EAAE,eAAe;SAChF,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;IACtB,CAAC;IACD,IAAI,QAAQ,KAAK,QAAQ,EAAE,CAAC;QAC1B,KAAK,MAAM,OAAO,IAAI,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;YACvC,IAAI,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC;gBACrB,MAAM,CAAC,kBAAkB,EAAE,iBAAiB,OAAO,kBAAkB,EAAE,OAAO,CAAC,CAAC;gBAChF,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;YAC3B,CAAC;QACH,CAAC;QACD,MAAM,UAAU,GAAG,kBAAkB,CAAC,QAAQ,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;QACjE,IAAI,UAAU,KAAK,KAAK;YAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;QACnD,IAAI,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;QACxB,KAAK,MAAM,IAAI,IAAI,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;YACpC,MAAM,OAAO,GAAG,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YACjC,IAAI,OAAO,CAAC,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,EAAE,CAAC;gBACzC,MAAM,CAAC,gBAAgB,EAAE,iBAAiB,OAAO,8BAA8B,EAAE,OAAO,CAAC,CAAC;gBAC1F,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;YAC3B,CAAC;YACD,MAAM,GAAG,OAAO,CAAC;QACnB,CAAC;QACD,OAAO,MAAM,CAAC;YACZ,MAAM,EAAE,GAAG,UAAU;YACrB,eAAe,EAAE,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,eAAe,CAAC,EAAE,eAAe;SAChF,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;IACtB,CAAC;IACD,MAAM,CAAC,2BAA2B,EAAE,uBAAuB,QAAQ,IAAI,WAAW,mBAAmB,EAAE,OAAO,CAAC,CAAC;IAChH,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;AAC3B,CAAC"}
|
|
@@ -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"}
|