woodml-parser 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (82) hide show
  1. package/README.md +181 -0
  2. package/dist/cli.d.ts +7 -0
  3. package/dist/cli.d.ts.map +1 -0
  4. package/dist/cli.js +554 -0
  5. package/dist/cli.js.map +1 -0
  6. package/dist/cost.d.ts +94 -0
  7. package/dist/cost.d.ts.map +1 -0
  8. package/dist/cost.js +340 -0
  9. package/dist/cost.js.map +1 -0
  10. package/dist/cost.test.d.ts +2 -0
  11. package/dist/cost.test.d.ts.map +1 -0
  12. package/dist/cost.test.js +241 -0
  13. package/dist/cost.test.js.map +1 -0
  14. package/dist/example.d.ts +6 -0
  15. package/dist/example.d.ts.map +1 -0
  16. package/dist/example.js +136 -0
  17. package/dist/example.js.map +1 -0
  18. package/dist/formulas.d.ts +23 -0
  19. package/dist/formulas.d.ts.map +1 -0
  20. package/dist/formulas.js +442 -0
  21. package/dist/formulas.js.map +1 -0
  22. package/dist/formulas.test.d.ts +5 -0
  23. package/dist/formulas.test.d.ts.map +1 -0
  24. package/dist/formulas.test.js +360 -0
  25. package/dist/formulas.test.js.map +1 -0
  26. package/dist/index.d.ts +23 -0
  27. package/dist/index.d.ts.map +1 -0
  28. package/dist/index.js +93 -0
  29. package/dist/index.js.map +1 -0
  30. package/dist/integration.test.d.ts +6 -0
  31. package/dist/integration.test.d.ts.map +1 -0
  32. package/dist/integration.test.js +271 -0
  33. package/dist/integration.test.js.map +1 -0
  34. package/dist/optimizer.d.ts +119 -0
  35. package/dist/optimizer.d.ts.map +1 -0
  36. package/dist/optimizer.js +423 -0
  37. package/dist/optimizer.js.map +1 -0
  38. package/dist/optimizer.test.d.ts +2 -0
  39. package/dist/optimizer.test.d.ts.map +1 -0
  40. package/dist/optimizer.test.js +225 -0
  41. package/dist/optimizer.test.js.map +1 -0
  42. package/dist/parser.d.ts +59 -0
  43. package/dist/parser.d.ts.map +1 -0
  44. package/dist/parser.js +305 -0
  45. package/dist/parser.js.map +1 -0
  46. package/dist/parser.test.d.ts +5 -0
  47. package/dist/parser.test.d.ts.map +1 -0
  48. package/dist/parser.test.js +486 -0
  49. package/dist/parser.test.js.map +1 -0
  50. package/dist/pdf.d.ts +36 -0
  51. package/dist/pdf.d.ts.map +1 -0
  52. package/dist/pdf.js +316 -0
  53. package/dist/pdf.js.map +1 -0
  54. package/dist/svg.d.ts +73 -0
  55. package/dist/svg.d.ts.map +1 -0
  56. package/dist/svg.js +613 -0
  57. package/dist/svg.js.map +1 -0
  58. package/dist/svg.test.d.ts +5 -0
  59. package/dist/svg.test.d.ts.map +1 -0
  60. package/dist/svg.test.js +333 -0
  61. package/dist/svg.test.js.map +1 -0
  62. package/dist/templates.d.ts +126 -0
  63. package/dist/templates.d.ts.map +1 -0
  64. package/dist/templates.js +448 -0
  65. package/dist/templates.js.map +1 -0
  66. package/dist/templates.test.d.ts +5 -0
  67. package/dist/templates.test.d.ts.map +1 -0
  68. package/dist/templates.test.js +630 -0
  69. package/dist/templates.test.js.map +1 -0
  70. package/dist/types.d.ts +250 -0
  71. package/dist/types.d.ts.map +1 -0
  72. package/dist/types.js +7 -0
  73. package/dist/types.js.map +1 -0
  74. package/dist/units.d.ts +53 -0
  75. package/dist/units.d.ts.map +1 -0
  76. package/dist/units.js +359 -0
  77. package/dist/units.js.map +1 -0
  78. package/dist/units.test.d.ts +5 -0
  79. package/dist/units.test.d.ts.map +1 -0
  80. package/dist/units.test.js +364 -0
  81. package/dist/units.test.js.map +1 -0
  82. package/package.json +46 -0
@@ -0,0 +1,136 @@
1
+ "use strict";
2
+ /**
3
+ * WoodML Parser Example
4
+ * Demonstrates parsing a WoodML file and generating a cut list
5
+ */
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ const index_1 = require("./index");
8
+ const woodmlSource = `
9
+ woodml: "1.0"
10
+
11
+ project:
12
+ name: "Simple Side Table"
13
+ units: imperial
14
+
15
+ formulas:
16
+ vars:
17
+ table_height: 26"
18
+ top_length: 20"
19
+ top_width: 16"
20
+ leg_size: 1-1/4"
21
+ apron_width: 3-1/2"
22
+
23
+ computed:
24
+ leg_length: $table_height - 3/4"
25
+ long_apron: $top_length - (2 * $leg_size)
26
+ short_apron: $top_width - (2 * $leg_size)
27
+
28
+ materials:
29
+ lumber:
30
+ - id: cherry_4_4
31
+ species: cherry
32
+ thickness: 4/4
33
+ board_feet: 6
34
+
35
+ parts:
36
+ - id: top
37
+ name: "Table Top"
38
+ material: cherry_4_4
39
+ dimensions:
40
+ length: $top_length
41
+ width: $top_width
42
+ thickness: 3/4"
43
+
44
+ - id: leg
45
+ name: "Leg"
46
+ material: cherry_4_4
47
+ dimensions:
48
+ length: $leg_length
49
+ width: $leg_size
50
+ thickness: $leg_size
51
+ quantity: 4
52
+
53
+ - id: long_apron
54
+ name: "Long Apron"
55
+ material: cherry_4_4
56
+ dimensions:
57
+ length: $long_apron
58
+ width: $apron_width
59
+ thickness: 3/4"
60
+ quantity: 2
61
+
62
+ - id: short_apron
63
+ name: "Short Apron"
64
+ material: cherry_4_4
65
+ dimensions:
66
+ length: $short_apron
67
+ width: $apron_width
68
+ thickness: 3/4"
69
+ quantity: 2
70
+
71
+ joinery:
72
+ - type: mortise_and_tenon
73
+ parts: [leg, long_apron]
74
+ - type: mortise_and_tenon
75
+ parts: [leg, short_apron]
76
+ `;
77
+ function main() {
78
+ console.log('='.repeat(60));
79
+ console.log('WoodML Parser Example');
80
+ console.log('='.repeat(60));
81
+ console.log();
82
+ // Parse the document
83
+ console.log('Parsing WoodML document...');
84
+ const doc = (0, index_1.parse)(woodmlSource);
85
+ console.log(`Project: ${doc.project?.name}`);
86
+ console.log(`WoodML Version: ${doc.woodml}`);
87
+ console.log();
88
+ // Validate
89
+ console.log('Validating document...');
90
+ const errors = (0, index_1.validateDocument)(doc);
91
+ if (errors.length > 0) {
92
+ for (const error of errors) {
93
+ console.log(` [${error.severity.toUpperCase()}] ${error.path}: ${error.message}`);
94
+ }
95
+ }
96
+ else {
97
+ console.log(' No validation errors found!');
98
+ }
99
+ console.log();
100
+ // Parse and resolve all formulas
101
+ console.log('Resolving formulas and dimensions...');
102
+ const resolved = (0, index_1.parseAndResolve)(woodmlSource);
103
+ console.log('\nResolved Variables:');
104
+ for (const [name, value] of Object.entries(resolved.resolvedVariables)) {
105
+ if (typeof value === 'object' && 'original' in value) {
106
+ console.log(` $${name} = ${value.original} (${value.value.toFixed(3)}")`);
107
+ }
108
+ else {
109
+ console.log(` $${name} = ${value}`);
110
+ }
111
+ }
112
+ console.log();
113
+ // Generate cut list
114
+ console.log('Generating Cut List:');
115
+ console.log('-'.repeat(60));
116
+ const cutList = (0, index_1.generateCutList)(resolved);
117
+ console.log((0, index_1.formatCutList)(cutList));
118
+ console.log();
119
+ // Calculate total board feet
120
+ const totalBf = (0, index_1.calculateBoardFeet)(resolved);
121
+ console.log(`\nTotal Board Feet Required: ${totalBf.toFixed(2)} BF`);
122
+ console.log(`Add 20% waste factor: ${(totalBf * 1.2).toFixed(2)} BF`);
123
+ console.log();
124
+ // Show parts breakdown
125
+ console.log('Parts Breakdown:');
126
+ console.log('-'.repeat(60));
127
+ for (const part of resolved.resolvedParts) {
128
+ const dims = part.dimensions;
129
+ console.log(`\n${part.name || part.id}:`);
130
+ console.log(` Material: ${part.material}`);
131
+ console.log(` Dimensions: ${dims.length.value.toFixed(2)}" x ${dims.width.value.toFixed(2)}" x ${dims.thickness.value.toFixed(2)}"`);
132
+ console.log(` Quantity: ${part.resolvedQuantity}`);
133
+ }
134
+ }
135
+ main();
136
+ //# sourceMappingURL=example.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"example.js","sourceRoot":"","sources":["../src/example.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,23 @@
1
+ /**
2
+ * WoodML Formula Evaluation
3
+ * Handles variable substitution and arithmetic operations
4
+ */
5
+ import { Dimension, UnitSystem, Formulas } from './types';
6
+ export type FormulaValue = Dimension | number;
7
+ export interface FormulaContext {
8
+ variables: Map<string, FormulaValue>;
9
+ defaultUnit: UnitSystem;
10
+ }
11
+ /**
12
+ * Create a formula context with variables
13
+ */
14
+ export declare function createContext(variables: Record<string, string | number>, defaultUnit?: UnitSystem): FormulaContext;
15
+ /**
16
+ * Evaluate a formula expression
17
+ */
18
+ export declare function evaluateFormula(expression: string, context: FormulaContext): FormulaValue;
19
+ /**
20
+ * Resolve all formulas in a Formulas object
21
+ */
22
+ export declare function resolveFormulas(formulas: Formulas, defaultUnit?: UnitSystem): Map<string, FormulaValue>;
23
+ //# sourceMappingURL=formulas.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"formulas.d.ts","sourceRoot":"","sources":["../src/formulas.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAO1D,MAAM,MAAM,YAAY,GAAG,SAAS,GAAG,MAAM,CAAC;AAE9C,MAAM,WAAW,cAAc;IAC7B,SAAS,EAAE,GAAG,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;IACrC,WAAW,EAAE,UAAU,CAAC;CACzB;AA8bD;;GAEG;AACH,wBAAgB,aAAa,CAC3B,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC,EAC1C,WAAW,GAAE,UAAuB,GACnC,cAAc,CAgBhB;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,cAAc,GAAG,YAAY,CAIzF;AAED;;GAEG;AACH,wBAAgB,eAAe,CAC7B,QAAQ,EAAE,QAAQ,EAClB,WAAW,GAAE,UAAuB,GACnC,GAAG,CAAC,MAAM,EAAE,YAAY,CAAC,CAkD3B"}
@@ -0,0 +1,442 @@
1
+ "use strict";
2
+ /**
3
+ * WoodML Formula Evaluation
4
+ * Handles variable substitution and arithmetic operations
5
+ */
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.createContext = createContext;
8
+ exports.evaluateFormula = evaluateFormula;
9
+ exports.resolveFormulas = resolveFormulas;
10
+ const units_1 = require("./units");
11
+ // ============================================
12
+ // CONSTANTS
13
+ // ============================================
14
+ const GOLDEN_RATIO = 1.618033988749895;
15
+ // Wood movement coefficients (tangential, per % MC change)
16
+ const WOOD_MOVEMENT = {
17
+ red_oak: 0.00369,
18
+ white_oak: 0.00365,
19
+ cherry: 0.00274,
20
+ walnut: 0.00274,
21
+ maple: 0.00353,
22
+ pine: 0.00263,
23
+ ash: 0.00274,
24
+ birch: 0.00338,
25
+ poplar: 0.00289,
26
+ mahogany: 0.00256,
27
+ };
28
+ function tokenize(expression) {
29
+ const tokens = [];
30
+ let pos = 0;
31
+ const patterns = [
32
+ ['DIMENSION', /^(\d+(-\d+\/\d+)?"|(\d+\/\d+)"|(\d+)'(\d+(-\d+\/\d+)?)?"|(\d+(\.\d+)?)(mm|cm|m))/i],
33
+ ['FUNCTION', /^(min|max|round|floor|ceil|abs|sqrt|sin|cos|tan|asin|acos|atan|board_feet|square_feet|linear_feet|miter_angle|compound_miter|diagonal|wood_movement|golden_ratio|fibonacci|circle_circumference|circle_area|circle_diameter)\s*(?=\()/i],
34
+ ['VARIABLE', /^\$[a-zA-Z_][a-zA-Z0-9_]*/],
35
+ ['NUMBER', /^\d+(\.\d+)?/],
36
+ ['OPERATOR', /^[+\-*/^]/],
37
+ ['LPAREN', /^\(/],
38
+ ['RPAREN', /^\)/],
39
+ ['COMMA', /^,/],
40
+ ];
41
+ while (pos < expression.length) {
42
+ // Skip whitespace
43
+ const wsMatch = expression.slice(pos).match(/^\s+/);
44
+ if (wsMatch) {
45
+ pos += wsMatch[0].length;
46
+ continue;
47
+ }
48
+ let matched = false;
49
+ for (const [type, pattern] of patterns) {
50
+ const match = expression.slice(pos).match(pattern);
51
+ if (match) {
52
+ tokens.push({ type, value: match[0], position: pos });
53
+ pos += match[0].length;
54
+ matched = true;
55
+ break;
56
+ }
57
+ }
58
+ if (!matched) {
59
+ throw new Error(`Unexpected character at position ${pos}: "${expression[pos]}"`);
60
+ }
61
+ }
62
+ return tokens;
63
+ }
64
+ // ============================================
65
+ // PARSER (RECURSIVE DESCENT)
66
+ // ============================================
67
+ class FormulaParser {
68
+ tokens;
69
+ pos = 0;
70
+ context;
71
+ constructor(tokens, context) {
72
+ this.tokens = tokens;
73
+ this.context = context;
74
+ }
75
+ parse() {
76
+ const result = this.parseExpression();
77
+ if (this.pos < this.tokens.length) {
78
+ throw new Error(`Unexpected token: ${this.tokens[this.pos].value}`);
79
+ }
80
+ return result;
81
+ }
82
+ parseExpression() {
83
+ return this.parseAdditive();
84
+ }
85
+ parseAdditive() {
86
+ let left = this.parseMultiplicative();
87
+ while (this.match('+', '-')) {
88
+ const op = this.previous().value;
89
+ const right = this.parseMultiplicative();
90
+ left = this.applyOperator(left, op, right);
91
+ }
92
+ return left;
93
+ }
94
+ parseMultiplicative() {
95
+ let left = this.parsePower();
96
+ while (this.match('*', '/')) {
97
+ const op = this.previous().value;
98
+ const right = this.parsePower();
99
+ left = this.applyOperator(left, op, right);
100
+ }
101
+ return left;
102
+ }
103
+ parsePower() {
104
+ let left = this.parseUnary();
105
+ while (this.match('^')) {
106
+ const right = this.parseUnary();
107
+ left = this.applyOperator(left, '^', right);
108
+ }
109
+ return left;
110
+ }
111
+ parseUnary() {
112
+ if (this.match('-')) {
113
+ const value = this.parseUnary();
114
+ if (typeof value === 'number') {
115
+ return -value;
116
+ }
117
+ return { ...value, value: -value.value };
118
+ }
119
+ return this.parsePrimary();
120
+ }
121
+ parsePrimary() {
122
+ // Function call
123
+ if (this.check('FUNCTION')) {
124
+ return this.parseFunction();
125
+ }
126
+ // Parenthesized expression
127
+ if (this.match('(')) {
128
+ const expr = this.parseExpression();
129
+ this.consume('RPAREN', 'Expected closing parenthesis');
130
+ return expr;
131
+ }
132
+ // Variable reference
133
+ if (this.check('VARIABLE')) {
134
+ const token = this.advance();
135
+ const varName = token.value.slice(1); // Remove $
136
+ const value = this.context.variables.get(varName);
137
+ if (value === undefined) {
138
+ throw new Error(`Undefined variable: ${varName}`);
139
+ }
140
+ return value;
141
+ }
142
+ // Dimension
143
+ if (this.check('DIMENSION')) {
144
+ const token = this.advance();
145
+ return (0, units_1.parseDimension)(token.value, this.context.defaultUnit);
146
+ }
147
+ // Number
148
+ if (this.check('NUMBER')) {
149
+ const token = this.advance();
150
+ return parseFloat(token.value);
151
+ }
152
+ throw new Error(`Unexpected token: ${this.peek()?.value || 'end of expression'}`);
153
+ }
154
+ parseFunction() {
155
+ const funcToken = this.advance();
156
+ const funcName = funcToken.value.toLowerCase();
157
+ this.consume('LPAREN', 'Expected opening parenthesis after function name');
158
+ const args = [];
159
+ if (!this.check('RPAREN')) {
160
+ do {
161
+ args.push(this.parseExpression());
162
+ } while (this.match(','));
163
+ }
164
+ this.consume('RPAREN', 'Expected closing parenthesis');
165
+ return this.evaluateFunction(funcName, args);
166
+ }
167
+ evaluateFunction(name, args) {
168
+ const getNumber = (v) => {
169
+ if (typeof v === 'number')
170
+ return v;
171
+ return (0, units_1.toInches)(v);
172
+ };
173
+ const getDimension = (v) => {
174
+ if (typeof v === 'number') {
175
+ return { value: v, unit: this.context.defaultUnit, original: String(v) };
176
+ }
177
+ return v;
178
+ };
179
+ switch (name) {
180
+ case 'min':
181
+ return Math.min(...args.map(getNumber));
182
+ case 'max':
183
+ return Math.max(...args.map(getNumber));
184
+ case 'abs':
185
+ return Math.abs(getNumber(args[0]));
186
+ case 'sqrt':
187
+ return Math.sqrt(getNumber(args[0]));
188
+ case 'round': {
189
+ const value = getNumber(args[0]);
190
+ const precision = args[1] ? getNumber(args[1]) : 1;
191
+ return Math.round(value / precision) * precision;
192
+ }
193
+ case 'floor': {
194
+ const value = getNumber(args[0]);
195
+ const precision = args[1] ? getNumber(args[1]) : 1;
196
+ return Math.floor(value / precision) * precision;
197
+ }
198
+ case 'ceil': {
199
+ const value = getNumber(args[0]);
200
+ const precision = args[1] ? getNumber(args[1]) : 1;
201
+ return Math.ceil(value / precision) * precision;
202
+ }
203
+ case 'sin':
204
+ return Math.sin((getNumber(args[0]) * Math.PI) / 180);
205
+ case 'cos':
206
+ return Math.cos((getNumber(args[0]) * Math.PI) / 180);
207
+ case 'tan':
208
+ return Math.tan((getNumber(args[0]) * Math.PI) / 180);
209
+ case 'asin':
210
+ return (Math.asin(getNumber(args[0])) * 180) / Math.PI;
211
+ case 'acos':
212
+ return (Math.acos(getNumber(args[0])) * 180) / Math.PI;
213
+ case 'atan':
214
+ return (Math.atan(getNumber(args[0])) * 180) / Math.PI;
215
+ case 'board_feet': {
216
+ const length = getNumber(args[0]);
217
+ const width = getNumber(args[1]);
218
+ const thickness = getNumber(args[2]);
219
+ return (length * width * thickness) / 144;
220
+ }
221
+ case 'square_feet': {
222
+ const length = getNumber(args[0]);
223
+ const width = getNumber(args[1]);
224
+ return (length * width) / 144;
225
+ }
226
+ case 'miter_angle': {
227
+ const sides = getNumber(args[0]);
228
+ return 90 - 180 / sides;
229
+ }
230
+ case 'diagonal': {
231
+ const width = getNumber(args[0]);
232
+ const height = getNumber(args[1]);
233
+ const result = Math.sqrt(width * width + height * height);
234
+ return {
235
+ value: result,
236
+ unit: this.context.defaultUnit,
237
+ original: `diagonal(${args[0]}, ${args[1]})`,
238
+ };
239
+ }
240
+ case 'golden_ratio':
241
+ return GOLDEN_RATIO;
242
+ case 'fibonacci': {
243
+ const n = Math.floor(getNumber(args[0]));
244
+ let a = 0, b = 1;
245
+ for (let i = 0; i < n; i++) {
246
+ [a, b] = [b, a + b];
247
+ }
248
+ return a;
249
+ }
250
+ case 'wood_movement': {
251
+ const width = getNumber(args[0]);
252
+ const species = String(args[1]).toLowerCase().replace(/['"]/g, '');
253
+ const humidityChange = getNumber(args[2]);
254
+ const coefficient = WOOD_MOVEMENT[species] || 0.003;
255
+ const movement = width * coefficient * humidityChange;
256
+ return {
257
+ value: movement,
258
+ unit: this.context.defaultUnit,
259
+ original: `wood_movement(${width}, ${species}, ${humidityChange})`,
260
+ };
261
+ }
262
+ case 'circle_circumference': {
263
+ const diameter = getNumber(args[0]);
264
+ return {
265
+ value: Math.PI * diameter,
266
+ unit: this.context.defaultUnit,
267
+ original: `circle_circumference(${diameter})`,
268
+ };
269
+ }
270
+ case 'circle_area': {
271
+ const diameter = getNumber(args[0]);
272
+ const radius = diameter / 2;
273
+ return Math.PI * radius * radius; // Returns square inches
274
+ }
275
+ case 'circle_diameter': {
276
+ const circumference = getNumber(args[0]);
277
+ return {
278
+ value: circumference / Math.PI,
279
+ unit: this.context.defaultUnit,
280
+ original: `circle_diameter(${circumference})`,
281
+ };
282
+ }
283
+ default:
284
+ throw new Error(`Unknown function: ${name}`);
285
+ }
286
+ }
287
+ applyOperator(left, op, right) {
288
+ const leftNum = typeof left === 'number' ? left : (0, units_1.toInches)(left);
289
+ const rightNum = typeof right === 'number' ? right : (0, units_1.toInches)(right);
290
+ let result;
291
+ switch (op) {
292
+ case '+':
293
+ result = leftNum + rightNum;
294
+ break;
295
+ case '-':
296
+ result = leftNum - rightNum;
297
+ break;
298
+ case '*':
299
+ result = leftNum * rightNum;
300
+ break;
301
+ case '/':
302
+ if (rightNum === 0)
303
+ throw new Error('Division by zero');
304
+ result = leftNum / rightNum;
305
+ break;
306
+ case '^':
307
+ result = Math.pow(leftNum, rightNum);
308
+ break;
309
+ default:
310
+ throw new Error(`Unknown operator: ${op}`);
311
+ }
312
+ // If either operand was a dimension, result is a dimension
313
+ // Exception: dimension * dimension loses units (area)
314
+ if (op === '*' && typeof left !== 'number' && typeof right !== 'number') {
315
+ return result; // Returns unitless number
316
+ }
317
+ if (typeof left !== 'number') {
318
+ return { value: result, unit: left.unit, original: `(${left.original} ${op} ${right})` };
319
+ }
320
+ if (typeof right !== 'number') {
321
+ return { value: result, unit: right.unit, original: `(${left} ${op} ${right.original})` };
322
+ }
323
+ return result;
324
+ }
325
+ // Parser helpers
326
+ match(...values) {
327
+ for (const value of values) {
328
+ if (this.check('OPERATOR') && this.peek()?.value === value) {
329
+ this.advance();
330
+ return true;
331
+ }
332
+ if (this.check('LPAREN') && value === '(') {
333
+ this.advance();
334
+ return true;
335
+ }
336
+ if (this.check('COMMA') && value === ',') {
337
+ this.advance();
338
+ return true;
339
+ }
340
+ }
341
+ return false;
342
+ }
343
+ check(type) {
344
+ return this.peek()?.type === type;
345
+ }
346
+ peek() {
347
+ return this.tokens[this.pos];
348
+ }
349
+ previous() {
350
+ return this.tokens[this.pos - 1];
351
+ }
352
+ advance() {
353
+ if (this.pos < this.tokens.length)
354
+ this.pos++;
355
+ return this.previous();
356
+ }
357
+ consume(type, message) {
358
+ if (this.check(type))
359
+ return this.advance();
360
+ throw new Error(message);
361
+ }
362
+ }
363
+ // ============================================
364
+ // PUBLIC API
365
+ // ============================================
366
+ /**
367
+ * Create a formula context with variables
368
+ */
369
+ function createContext(variables, defaultUnit = 'imperial') {
370
+ const varMap = new Map();
371
+ for (const [name, value] of Object.entries(variables)) {
372
+ if (typeof value === 'number') {
373
+ varMap.set(name, value);
374
+ }
375
+ else {
376
+ try {
377
+ varMap.set(name, (0, units_1.parseDimension)(value, defaultUnit));
378
+ }
379
+ catch {
380
+ varMap.set(name, value); // Store as-is for string values
381
+ }
382
+ }
383
+ }
384
+ return { variables: varMap, defaultUnit };
385
+ }
386
+ /**
387
+ * Evaluate a formula expression
388
+ */
389
+ function evaluateFormula(expression, context) {
390
+ const tokens = tokenize(expression);
391
+ const parser = new FormulaParser(tokens, context);
392
+ return parser.parse();
393
+ }
394
+ /**
395
+ * Resolve all formulas in a Formulas object
396
+ */
397
+ function resolveFormulas(formulas, defaultUnit = 'imperial') {
398
+ const resolved = new Map();
399
+ // First pass: resolve vars
400
+ if (formulas.vars) {
401
+ for (const [name, value] of Object.entries(formulas.vars)) {
402
+ try {
403
+ resolved.set(name, (0, units_1.parseDimension)(value, defaultUnit));
404
+ }
405
+ catch {
406
+ // If not a dimension, try as number
407
+ const num = parseFloat(value);
408
+ if (!isNaN(num)) {
409
+ resolved.set(name, num);
410
+ }
411
+ }
412
+ }
413
+ }
414
+ // Second pass: resolve computed (may reference vars)
415
+ if (formulas.computed) {
416
+ const context = { variables: resolved, defaultUnit };
417
+ // Multiple passes for dependencies
418
+ const computed = { ...formulas.computed };
419
+ let maxPasses = 10;
420
+ while (Object.keys(computed).length > 0 && maxPasses > 0) {
421
+ const remaining = {};
422
+ for (const [name, expression] of Object.entries(computed)) {
423
+ try {
424
+ const value = evaluateFormula(expression, context);
425
+ resolved.set(name, value);
426
+ context.variables.set(name, value);
427
+ }
428
+ catch {
429
+ remaining[name] = expression;
430
+ }
431
+ }
432
+ if (Object.keys(remaining).length === Object.keys(computed).length) {
433
+ throw new Error(`Circular reference or undefined variables in: ${Object.keys(remaining).join(', ')}`);
434
+ }
435
+ Object.keys(computed).forEach(k => delete computed[k]);
436
+ Object.assign(computed, remaining);
437
+ maxPasses--;
438
+ }
439
+ }
440
+ return resolved;
441
+ }
442
+ //# sourceMappingURL=formulas.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"formulas.js","sourceRoot":"","sources":["../src/formulas.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Unit Tests for WoodML Formulas Module
3
+ */
4
+ export {};
5
+ //# sourceMappingURL=formulas.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"formulas.test.d.ts","sourceRoot":"","sources":["../src/formulas.test.ts"],"names":[],"mappings":"AAAA;;GAEG"}