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,486 @@
1
+ "use strict";
2
+ /**
3
+ * Unit Tests for WoodML Parser Module
4
+ */
5
+ var __importDefault = (this && this.__importDefault) || function (mod) {
6
+ return (mod && mod.__esModule) ? mod : { "default": mod };
7
+ };
8
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ const node_test_1 = require("node:test");
10
+ const node_assert_1 = __importDefault(require("node:assert"));
11
+ const parser_1 = require("./parser");
12
+ const SIMPLE_PROJECT = `
13
+ woodml: "1.0"
14
+ project:
15
+ name: Test Project
16
+ units: imperial
17
+
18
+ materials:
19
+ lumber:
20
+ - id: walnut
21
+ species: walnut
22
+ thickness: 4/4
23
+
24
+ parts:
25
+ - id: top
26
+ name: Table Top
27
+ material: walnut
28
+ dimensions:
29
+ length: 48"
30
+ width: 24"
31
+ thickness: 1"
32
+ quantity: 1
33
+ `;
34
+ const PROJECT_WITH_FORMULAS = `
35
+ woodml: "1.0"
36
+ project:
37
+ name: Formula Test
38
+ units: imperial
39
+
40
+ formulas:
41
+ vars:
42
+ table_length: 48"
43
+ table_width: 24"
44
+ leg_height: 30"
45
+ computed:
46
+ apron_length: $table_length - 4"
47
+ apron_depth: $leg_height - 1"
48
+
49
+ parts:
50
+ - id: top
51
+ material: oak
52
+ dimensions:
53
+ length: $table_length
54
+ width: $table_width
55
+ thickness: 1"
56
+ - id: apron
57
+ material: oak
58
+ dimensions:
59
+ length: $apron_length
60
+ width: 4"
61
+ thickness: 3/4"
62
+ quantity: 2
63
+ `;
64
+ const PROJECT_WITH_JOINERY = `
65
+ woodml: "1.0"
66
+ project:
67
+ name: Joinery Test
68
+
69
+ materials:
70
+ lumber:
71
+ - id: oak
72
+ species: white_oak
73
+
74
+ parts:
75
+ - id: leg
76
+ material: oak
77
+ dimensions:
78
+ length: 30"
79
+ width: 2"
80
+ thickness: 2"
81
+ quantity: 4
82
+ - id: apron
83
+ material: oak
84
+ dimensions:
85
+ length: 24"
86
+ width: 4"
87
+ thickness: 3/4"
88
+ quantity: 2
89
+
90
+ joinery:
91
+ - type: mortise_and_tenon
92
+ parts: [leg, apron]
93
+ `;
94
+ (0, node_test_1.describe)('WoodMLParser', () => {
95
+ (0, node_test_1.describe)('parse', () => {
96
+ (0, node_test_1.it)('should parse a simple document', () => {
97
+ const parser = new parser_1.WoodMLParser();
98
+ const doc = parser.parse(SIMPLE_PROJECT);
99
+ node_assert_1.default.strictEqual(doc.woodml, '1.0');
100
+ node_assert_1.default.strictEqual(doc.project?.name, 'Test Project');
101
+ node_assert_1.default.strictEqual(doc.project?.units, 'imperial');
102
+ });
103
+ (0, node_test_1.it)('should parse materials', () => {
104
+ const parser = new parser_1.WoodMLParser();
105
+ const doc = parser.parse(SIMPLE_PROJECT);
106
+ node_assert_1.default.ok(doc.materials?.lumber);
107
+ node_assert_1.default.strictEqual(doc.materials.lumber.length, 1);
108
+ node_assert_1.default.strictEqual(doc.materials.lumber[0].id, 'walnut');
109
+ node_assert_1.default.strictEqual(doc.materials.lumber[0].species, 'walnut');
110
+ });
111
+ (0, node_test_1.it)('should parse parts', () => {
112
+ const parser = new parser_1.WoodMLParser();
113
+ const doc = parser.parse(SIMPLE_PROJECT);
114
+ node_assert_1.default.ok(doc.parts);
115
+ node_assert_1.default.strictEqual(doc.parts.length, 1);
116
+ node_assert_1.default.strictEqual(doc.parts[0].id, 'top');
117
+ node_assert_1.default.strictEqual(doc.parts[0].name, 'Table Top');
118
+ });
119
+ (0, node_test_1.it)('should parse formulas section', () => {
120
+ const parser = new parser_1.WoodMLParser();
121
+ const doc = parser.parse(PROJECT_WITH_FORMULAS);
122
+ node_assert_1.default.ok(doc.formulas?.vars);
123
+ node_assert_1.default.strictEqual(doc.formulas.vars.table_length, '48"');
124
+ node_assert_1.default.ok(doc.formulas?.computed);
125
+ node_assert_1.default.strictEqual(doc.formulas.computed.apron_length, '$table_length - 4"');
126
+ });
127
+ (0, node_test_1.it)('should parse joinery', () => {
128
+ const parser = new parser_1.WoodMLParser();
129
+ const doc = parser.parse(PROJECT_WITH_JOINERY);
130
+ node_assert_1.default.ok(doc.joinery);
131
+ node_assert_1.default.strictEqual(doc.joinery.length, 1);
132
+ node_assert_1.default.strictEqual(doc.joinery[0].type, 'mortise_and_tenon');
133
+ node_assert_1.default.deepStrictEqual(doc.joinery[0].parts, ['leg', 'apron']);
134
+ });
135
+ (0, node_test_1.it)('should throw on missing version', () => {
136
+ const parser = new parser_1.WoodMLParser();
137
+ node_assert_1.default.throws(() => parser.parse('project:\n name: Test'), /Missing required "woodml" version field/);
138
+ });
139
+ (0, node_test_1.it)('should set default unit from project', () => {
140
+ const parser = new parser_1.WoodMLParser();
141
+ parser.parse(SIMPLE_PROJECT);
142
+ node_assert_1.default.strictEqual(parser.getDefaultUnit(), 'imperial');
143
+ });
144
+ });
145
+ (0, node_test_1.describe)('parseAndResolve', () => {
146
+ (0, node_test_1.it)('should resolve part dimensions', () => {
147
+ const parser = new parser_1.WoodMLParser();
148
+ const resolved = parser.parseAndResolve(SIMPLE_PROJECT);
149
+ node_assert_1.default.strictEqual(resolved.resolvedParts.length, 1);
150
+ const top = resolved.resolvedParts[0];
151
+ node_assert_1.default.strictEqual(top.dimensions.length.value, 48);
152
+ node_assert_1.default.strictEqual(top.dimensions.width.value, 24);
153
+ node_assert_1.default.strictEqual(top.dimensions.thickness.value, 1);
154
+ });
155
+ (0, node_test_1.it)('should resolve formula variables', () => {
156
+ const parser = new parser_1.WoodMLParser();
157
+ const resolved = parser.parseAndResolve(PROJECT_WITH_FORMULAS);
158
+ node_assert_1.default.ok(resolved.resolvedVariables);
159
+ node_assert_1.default.strictEqual(resolved.resolvedVariables.table_length.value, 48);
160
+ node_assert_1.default.strictEqual(resolved.resolvedVariables.apron_length.value, 44);
161
+ });
162
+ (0, node_test_1.it)('should use resolved variables in part dimensions', () => {
163
+ const parser = new parser_1.WoodMLParser();
164
+ const resolved = parser.parseAndResolve(PROJECT_WITH_FORMULAS);
165
+ const top = resolved.resolvedParts.find(p => p.id === 'top');
166
+ node_assert_1.default.ok(top);
167
+ node_assert_1.default.strictEqual(top.dimensions.length.value, 48);
168
+ const apron = resolved.resolvedParts.find(p => p.id === 'apron');
169
+ node_assert_1.default.ok(apron);
170
+ node_assert_1.default.strictEqual(apron.dimensions.length.value, 44);
171
+ });
172
+ (0, node_test_1.it)('should set resolved quantity', () => {
173
+ const parser = new parser_1.WoodMLParser();
174
+ const resolved = parser.parseAndResolve(PROJECT_WITH_FORMULAS);
175
+ const apron = resolved.resolvedParts.find(p => p.id === 'apron');
176
+ node_assert_1.default.ok(apron);
177
+ node_assert_1.default.strictEqual(apron.resolvedQuantity, 2);
178
+ });
179
+ (0, node_test_1.it)('should default quantity to 1', () => {
180
+ const parser = new parser_1.WoodMLParser();
181
+ const resolved = parser.parseAndResolve(SIMPLE_PROJECT);
182
+ node_assert_1.default.strictEqual(resolved.resolvedParts[0].resolvedQuantity, 1);
183
+ });
184
+ });
185
+ (0, node_test_1.describe)('parseDimension', () => {
186
+ (0, node_test_1.it)('should parse simple dimension', () => {
187
+ const parser = new parser_1.WoodMLParser();
188
+ parser.parse(SIMPLE_PROJECT);
189
+ const dim = parser.parseDimension('24"');
190
+ node_assert_1.default.strictEqual(dim.value, 24);
191
+ });
192
+ (0, node_test_1.it)('should parse dimension with variable after resolution', () => {
193
+ const parser = new parser_1.WoodMLParser();
194
+ parser.parseAndResolve(PROJECT_WITH_FORMULAS);
195
+ const dim = parser.parseDimension('$table_length');
196
+ node_assert_1.default.strictEqual(dim.value, 48);
197
+ });
198
+ });
199
+ });
200
+ (0, node_test_1.describe)('validateDocument', () => {
201
+ (0, node_test_1.it)('should pass valid document', () => {
202
+ const parser = new parser_1.WoodMLParser();
203
+ const doc = parser.parse(SIMPLE_PROJECT);
204
+ const errors = (0, parser_1.validateDocument)(doc);
205
+ node_assert_1.default.strictEqual(errors.length, 0);
206
+ });
207
+ (0, node_test_1.it)('should detect missing version', () => {
208
+ const doc = {
209
+ woodml: '',
210
+ project: { name: 'Test' },
211
+ };
212
+ const errors = (0, parser_1.validateDocument)(doc);
213
+ node_assert_1.default.ok(errors.some(e => e.path === 'woodml'));
214
+ });
215
+ (0, node_test_1.it)('should detect duplicate lumber IDs', () => {
216
+ const doc = {
217
+ woodml: '1.0',
218
+ materials: {
219
+ lumber: [
220
+ { id: 'walnut' },
221
+ { id: 'walnut' },
222
+ ],
223
+ },
224
+ };
225
+ const errors = (0, parser_1.validateDocument)(doc);
226
+ node_assert_1.default.ok(errors.some(e => e.message.includes('Duplicate ID')));
227
+ });
228
+ (0, node_test_1.it)('should detect duplicate part IDs', () => {
229
+ const doc = {
230
+ woodml: '1.0',
231
+ parts: [
232
+ { id: 'top' },
233
+ { id: 'top' },
234
+ ],
235
+ };
236
+ const errors = (0, parser_1.validateDocument)(doc);
237
+ node_assert_1.default.ok(errors.some(e => e.message.includes('Duplicate part ID')));
238
+ });
239
+ (0, node_test_1.it)('should detect unknown material reference', () => {
240
+ const doc = {
241
+ woodml: '1.0',
242
+ materials: {
243
+ lumber: [{ id: 'oak' }],
244
+ },
245
+ parts: [
246
+ { id: 'top', material: 'walnut' },
247
+ ],
248
+ };
249
+ const errors = (0, parser_1.validateDocument)(doc);
250
+ node_assert_1.default.ok(errors.some(e => e.message.includes('Unknown material reference')));
251
+ });
252
+ (0, node_test_1.it)('should detect unknown part reference in joinery', () => {
253
+ const doc = {
254
+ woodml: '1.0',
255
+ parts: [{ id: 'leg' }],
256
+ joinery: [
257
+ { type: 'mortise_and_tenon', parts: ['leg', 'missing_part'] },
258
+ ],
259
+ };
260
+ const errors = (0, parser_1.validateDocument)(doc);
261
+ node_assert_1.default.ok(errors.some(e => e.message.includes('Unknown part reference in joinery')));
262
+ });
263
+ (0, node_test_1.it)('should handle hardware and sheet_goods duplicate detection', () => {
264
+ const doc = {
265
+ woodml: '1.0',
266
+ materials: {
267
+ lumber: [{ id: 'shared_id' }],
268
+ hardware: [{ id: 'shared_id', type: 'screw' }],
269
+ },
270
+ };
271
+ const errors = (0, parser_1.validateDocument)(doc);
272
+ node_assert_1.default.ok(errors.some(e => e.message.includes('Duplicate ID')));
273
+ });
274
+ });
275
+ (0, node_test_1.describe)('calculateBoardFeet', () => {
276
+ (0, node_test_1.it)('should calculate board feet for single part', () => {
277
+ const parser = new parser_1.WoodMLParser();
278
+ const resolved = parser.parseAndResolve(SIMPLE_PROJECT);
279
+ // 48" x 24" x 1" / 144 = 8 board feet
280
+ const bf = (0, parser_1.calculateBoardFeet)(resolved);
281
+ node_assert_1.default.strictEqual(bf, 8);
282
+ });
283
+ (0, node_test_1.it)('should account for quantity', () => {
284
+ const doc = `
285
+ woodml: "1.0"
286
+ parts:
287
+ - id: leg
288
+ dimensions:
289
+ length: 30"
290
+ width: 2"
291
+ thickness: 2"
292
+ quantity: 4
293
+ `;
294
+ const parser = new parser_1.WoodMLParser();
295
+ const resolved = parser.parseAndResolve(doc);
296
+ // 30" x 2" x 2" x 4 / 144 = 3.33 board feet
297
+ const bf = (0, parser_1.calculateBoardFeet)(resolved);
298
+ node_assert_1.default.ok(Math.abs(bf - 3.333) < 0.01);
299
+ });
300
+ (0, node_test_1.it)('should sum multiple parts', () => {
301
+ const parser = new parser_1.WoodMLParser();
302
+ const resolved = parser.parseAndResolve(PROJECT_WITH_FORMULAS);
303
+ const bf = (0, parser_1.calculateBoardFeet)(resolved);
304
+ // top: 48 x 24 x 1 / 144 = 8
305
+ // aprons: 44 x 4 x 0.75 x 2 / 144 = 1.83
306
+ node_assert_1.default.ok(bf > 9.5);
307
+ });
308
+ });
309
+ (0, node_test_1.describe)('generateCutList', () => {
310
+ (0, node_test_1.it)('should generate cut list items', () => {
311
+ const parser = new parser_1.WoodMLParser();
312
+ const resolved = parser.parseAndResolve(SIMPLE_PROJECT);
313
+ const cutList = (0, parser_1.generateCutList)(resolved);
314
+ node_assert_1.default.strictEqual(cutList.length, 1);
315
+ node_assert_1.default.strictEqual(cutList[0].partId, 'top');
316
+ node_assert_1.default.strictEqual(cutList[0].partName, 'Table Top');
317
+ });
318
+ (0, node_test_1.it)('should include formatted dimensions', () => {
319
+ const parser = new parser_1.WoodMLParser();
320
+ const resolved = parser.parseAndResolve(SIMPLE_PROJECT);
321
+ const cutList = (0, parser_1.generateCutList)(resolved);
322
+ node_assert_1.default.strictEqual(cutList[0].length, "4'");
323
+ node_assert_1.default.strictEqual(cutList[0].width, "2'");
324
+ node_assert_1.default.strictEqual(cutList[0].thickness, '1"');
325
+ });
326
+ (0, node_test_1.it)('should include material', () => {
327
+ const parser = new parser_1.WoodMLParser();
328
+ const resolved = parser.parseAndResolve(SIMPLE_PROJECT);
329
+ const cutList = (0, parser_1.generateCutList)(resolved);
330
+ node_assert_1.default.strictEqual(cutList[0].material, 'walnut');
331
+ });
332
+ (0, node_test_1.it)('should include quantity', () => {
333
+ const parser = new parser_1.WoodMLParser();
334
+ const resolved = parser.parseAndResolve(PROJECT_WITH_FORMULAS);
335
+ const cutList = (0, parser_1.generateCutList)(resolved);
336
+ const apron = cutList.find(c => c.partId === 'apron');
337
+ node_assert_1.default.ok(apron);
338
+ node_assert_1.default.strictEqual(apron.quantity, 2);
339
+ });
340
+ (0, node_test_1.it)('should include board feet calculation', () => {
341
+ const parser = new parser_1.WoodMLParser();
342
+ const resolved = parser.parseAndResolve(SIMPLE_PROJECT);
343
+ const cutList = (0, parser_1.generateCutList)(resolved);
344
+ node_assert_1.default.strictEqual(cutList[0].boardFeet, 8);
345
+ });
346
+ (0, node_test_1.it)('should sort by material then size', () => {
347
+ const doc = `
348
+ woodml: "1.0"
349
+ parts:
350
+ - id: small_oak
351
+ material: oak
352
+ dimensions: { length: 12", width: 6", thickness: 1" }
353
+ - id: big_walnut
354
+ material: walnut
355
+ dimensions: { length: 48", width: 24", thickness: 1" }
356
+ - id: big_oak
357
+ material: oak
358
+ dimensions: { length: 48", width: 24", thickness: 1" }
359
+ `;
360
+ const parser = new parser_1.WoodMLParser();
361
+ const resolved = parser.parseAndResolve(doc);
362
+ const cutList = (0, parser_1.generateCutList)(resolved);
363
+ node_assert_1.default.strictEqual(cutList[0].partId, 'big_oak');
364
+ node_assert_1.default.strictEqual(cutList[1].partId, 'small_oak');
365
+ node_assert_1.default.strictEqual(cutList[2].partId, 'big_walnut');
366
+ });
367
+ (0, node_test_1.it)('should handle missing material', () => {
368
+ const doc = `
369
+ woodml: "1.0"
370
+ parts:
371
+ - id: top
372
+ dimensions: { length: 24", width: 12", thickness: 1" }
373
+ `;
374
+ const parser = new parser_1.WoodMLParser();
375
+ const resolved = parser.parseAndResolve(doc);
376
+ const cutList = (0, parser_1.generateCutList)(resolved);
377
+ node_assert_1.default.strictEqual(cutList[0].material, 'unspecified');
378
+ });
379
+ (0, node_test_1.it)('should use part id as name if no name provided', () => {
380
+ const doc = `
381
+ woodml: "1.0"
382
+ parts:
383
+ - id: unnamed_part
384
+ dimensions: { length: 24", width: 12", thickness: 1" }
385
+ `;
386
+ const parser = new parser_1.WoodMLParser();
387
+ const resolved = parser.parseAndResolve(doc);
388
+ const cutList = (0, parser_1.generateCutList)(resolved);
389
+ node_assert_1.default.strictEqual(cutList[0].partName, 'unnamed_part');
390
+ });
391
+ });
392
+ (0, node_test_1.describe)('formatCutList', () => {
393
+ (0, node_test_1.it)('should format cut list as table', () => {
394
+ const parser = new parser_1.WoodMLParser();
395
+ const resolved = parser.parseAndResolve(SIMPLE_PROJECT);
396
+ const cutList = (0, parser_1.generateCutList)(resolved);
397
+ const formatted = (0, parser_1.formatCutList)(cutList);
398
+ node_assert_1.default.ok(formatted.includes('Part'));
399
+ node_assert_1.default.ok(formatted.includes('Material'));
400
+ node_assert_1.default.ok(formatted.includes('Table Top'));
401
+ node_assert_1.default.ok(formatted.includes('walnut'));
402
+ });
403
+ (0, node_test_1.it)('should include total board feet', () => {
404
+ const parser = new parser_1.WoodMLParser();
405
+ const resolved = parser.parseAndResolve(SIMPLE_PROJECT);
406
+ const cutList = (0, parser_1.generateCutList)(resolved);
407
+ const formatted = (0, parser_1.formatCutList)(cutList);
408
+ node_assert_1.default.ok(formatted.includes('Total Board Feet: 8.00'));
409
+ });
410
+ (0, node_test_1.it)('should align columns', () => {
411
+ const parser = new parser_1.WoodMLParser();
412
+ const resolved = parser.parseAndResolve(SIMPLE_PROJECT);
413
+ const cutList = (0, parser_1.generateCutList)(resolved);
414
+ const formatted = (0, parser_1.formatCutList)(cutList);
415
+ const lines = formatted.split('\n');
416
+ // All lines should have consistent column separators
417
+ const pipeCount = (str) => (str.match(/\|/g) || []).length;
418
+ const headerPipes = pipeCount(lines[0]);
419
+ node_assert_1.default.ok(lines.slice(2, -2).every(line => pipeCount(line) === headerPipes));
420
+ });
421
+ });
422
+ (0, node_test_1.describe)('metric units', () => {
423
+ (0, node_test_1.it)('should handle metric project', () => {
424
+ const doc = `
425
+ woodml: "1.0"
426
+ project:
427
+ units: metric
428
+ parts:
429
+ - id: top
430
+ dimensions:
431
+ length: 1200mm
432
+ width: 600mm
433
+ thickness: 25mm
434
+ `;
435
+ const parser = new parser_1.WoodMLParser();
436
+ const resolved = parser.parseAndResolve(doc);
437
+ const top = resolved.resolvedParts[0];
438
+ node_assert_1.default.strictEqual(top.dimensions.length.value, 1200);
439
+ node_assert_1.default.strictEqual(top.dimensions.length.unit, 'metric');
440
+ });
441
+ });
442
+ (0, node_test_1.describe)('edge cases', () => {
443
+ (0, node_test_1.it)('should handle document with no parts', () => {
444
+ const doc = `
445
+ woodml: "1.0"
446
+ project:
447
+ name: Empty Project
448
+ `;
449
+ const parser = new parser_1.WoodMLParser();
450
+ const resolved = parser.parseAndResolve(doc);
451
+ node_assert_1.default.strictEqual(resolved.resolvedParts.length, 0);
452
+ node_assert_1.default.strictEqual((0, parser_1.calculateBoardFeet)(resolved), 0);
453
+ node_assert_1.default.strictEqual((0, parser_1.generateCutList)(resolved).length, 0);
454
+ });
455
+ (0, node_test_1.it)('should handle parts with missing dimensions', () => {
456
+ const doc = `
457
+ woodml: "1.0"
458
+ parts:
459
+ - id: partial
460
+ dimensions:
461
+ length: 24"
462
+ `;
463
+ const parser = new parser_1.WoodMLParser();
464
+ const resolved = parser.parseAndResolve(doc);
465
+ const part = resolved.resolvedParts[0];
466
+ node_assert_1.default.strictEqual(part.dimensions.length.value, 24);
467
+ node_assert_1.default.strictEqual(part.dimensions.width.value, 0);
468
+ node_assert_1.default.strictEqual(part.dimensions.thickness.value, 0);
469
+ });
470
+ (0, node_test_1.it)('should handle depth as alias for width', () => {
471
+ const doc = `
472
+ woodml: "1.0"
473
+ parts:
474
+ - id: box_side
475
+ dimensions:
476
+ length: 24"
477
+ depth: 12"
478
+ thickness: 3/4"
479
+ `;
480
+ const parser = new parser_1.WoodMLParser();
481
+ const resolved = parser.parseAndResolve(doc);
482
+ const part = resolved.resolvedParts[0];
483
+ node_assert_1.default.strictEqual(part.dimensions.width.value, 12);
484
+ });
485
+ });
486
+ //# sourceMappingURL=parser.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parser.test.js","sourceRoot":"","sources":["../src/parser.test.ts"],"names":[],"mappings":";AAAA;;GAEG;;;;;AAEH,yCAAyC;AACzC,8DAAiC;AACjC,qCAMkB;AAGlB,MAAM,cAAc,GAAG;;;;;;;;;;;;;;;;;;;;;CAqBtB,CAAC;AAEF,MAAM,qBAAqB,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA6B7B,CAAC;AAEF,MAAM,oBAAoB,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA6B5B,CAAC;AAEF,IAAA,oBAAQ,EAAC,cAAc,EAAE,GAAG,EAAE;IAC5B,IAAA,oBAAQ,EAAC,OAAO,EAAE,GAAG,EAAE;QACrB,IAAA,cAAE,EAAC,gCAAgC,EAAE,GAAG,EAAE;YACxC,MAAM,MAAM,GAAG,IAAI,qBAAY,EAAE,CAAC;YAClC,MAAM,GAAG,GAAG,MAAM,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC;YAEzC,qBAAM,CAAC,WAAW,CAAC,GAAG,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;YACtC,qBAAM,CAAC,WAAW,CAAC,GAAG,CAAC,OAAO,EAAE,IAAI,EAAE,cAAc,CAAC,CAAC;YACtD,qBAAM,CAAC,WAAW,CAAC,GAAG,CAAC,OAAO,EAAE,KAAK,EAAE,UAAU,CAAC,CAAC;QACrD,CAAC,CAAC,CAAC;QAEH,IAAA,cAAE,EAAC,wBAAwB,EAAE,GAAG,EAAE;YAChC,MAAM,MAAM,GAAG,IAAI,qBAAY,EAAE,CAAC;YAClC,MAAM,GAAG,GAAG,MAAM,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC;YAEzC,qBAAM,CAAC,EAAE,CAAC,GAAG,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;YACjC,qBAAM,CAAC,WAAW,CAAC,GAAG,CAAC,SAAS,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;YACnD,qBAAM,CAAC,WAAW,CAAC,GAAG,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,QAAQ,CAAC,CAAC;YACzD,qBAAM,CAAC,WAAW,CAAC,GAAG,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;QAChE,CAAC,CAAC,CAAC;QAEH,IAAA,cAAE,EAAC,oBAAoB,EAAE,GAAG,EAAE;YAC5B,MAAM,MAAM,GAAG,IAAI,qBAAY,EAAE,CAAC;YAClC,MAAM,GAAG,GAAG,MAAM,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC;YAEzC,qBAAM,CAAC,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;YACrB,qBAAM,CAAC,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;YACxC,qBAAM,CAAC,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC;YAC3C,qBAAM,CAAC,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC;QACrD,CAAC,CAAC,CAAC;QAEH,IAAA,cAAE,EAAC,+BAA+B,EAAE,GAAG,EAAE;YACvC,MAAM,MAAM,GAAG,IAAI,qBAAY,EAAE,CAAC;YAClC,MAAM,GAAG,GAAG,MAAM,CAAC,KAAK,CAAC,qBAAqB,CAAC,CAAC;YAEhD,qBAAM,CAAC,EAAE,CAAC,GAAG,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;YAC9B,qBAAM,CAAC,WAAW,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,YAAY,EAAE,KAAK,CAAC,CAAC;YAC1D,qBAAM,CAAC,EAAE,CAAC,GAAG,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;YAClC,qBAAM,CAAC,WAAW,CAAC,GAAG,CAAC,QAAQ,CAAC,QAAQ,CAAC,YAAY,EAAE,oBAAoB,CAAC,CAAC;QAC/E,CAAC,CAAC,CAAC;QAEH,IAAA,cAAE,EAAC,sBAAsB,EAAE,GAAG,EAAE;YAC9B,MAAM,MAAM,GAAG,IAAI,qBAAY,EAAE,CAAC;YAClC,MAAM,GAAG,GAAG,MAAM,CAAC,KAAK,CAAC,oBAAoB,CAAC,CAAC;YAE/C,qBAAM,CAAC,EAAE,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;YACvB,qBAAM,CAAC,WAAW,CAAC,GAAG,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;YAC1C,qBAAM,CAAC,WAAW,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,mBAAmB,CAAC,CAAC;YAC7D,qBAAM,CAAC,eAAe,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC;QACjE,CAAC,CAAC,CAAC;QAEH,IAAA,cAAE,EAAC,iCAAiC,EAAE,GAAG,EAAE;YACzC,MAAM,MAAM,GAAG,IAAI,qBAAY,EAAE,CAAC;YAClC,qBAAM,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,wBAAwB,CAAC,EAAE,yCAAyC,CAAC,CAAC;QACzG,CAAC,CAAC,CAAC;QAEH,IAAA,cAAE,EAAC,sCAAsC,EAAE,GAAG,EAAE;YAC9C,MAAM,MAAM,GAAG,IAAI,qBAAY,EAAE,CAAC;YAClC,MAAM,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC;YAC7B,qBAAM,CAAC,WAAW,CAAC,MAAM,CAAC,cAAc,EAAE,EAAE,UAAU,CAAC,CAAC;QAC1D,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,IAAA,oBAAQ,EAAC,iBAAiB,EAAE,GAAG,EAAE;QAC/B,IAAA,cAAE,EAAC,gCAAgC,EAAE,GAAG,EAAE;YACxC,MAAM,MAAM,GAAG,IAAI,qBAAY,EAAE,CAAC;YAClC,MAAM,QAAQ,GAAG,MAAM,CAAC,eAAe,CAAC,cAAc,CAAC,CAAC;YAExD,qBAAM,CAAC,WAAW,CAAC,QAAQ,CAAC,aAAa,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;YACrD,MAAM,GAAG,GAAG,QAAQ,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC;YACtC,qBAAM,CAAC,WAAW,CAAC,GAAG,CAAC,UAAU,CAAC,MAAM,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;YACpD,qBAAM,CAAC,WAAW,CAAC,GAAG,CAAC,UAAU,CAAC,KAAK,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;YACnD,qBAAM,CAAC,WAAW,CAAC,GAAG,CAAC,UAAU,CAAC,SAAS,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;QACxD,CAAC,CAAC,CAAC;QAEH,IAAA,cAAE,EAAC,kCAAkC,EAAE,GAAG,EAAE;YAC1C,MAAM,MAAM,GAAG,IAAI,qBAAY,EAAE,CAAC;YAClC,MAAM,QAAQ,GAAG,MAAM,CAAC,eAAe,CAAC,qBAAqB,CAAC,CAAC;YAE/D,qBAAM,CAAC,EAAE,CAAC,QAAQ,CAAC,iBAAiB,CAAC,CAAC;YACtC,qBAAM,CAAC,WAAW,CAAE,QAAQ,CAAC,iBAAiB,CAAC,YAAoB,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;YAC/E,qBAAM,CAAC,WAAW,CAAE,QAAQ,CAAC,iBAAiB,CAAC,YAAoB,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;QACjF,CAAC,CAAC,CAAC;QAEH,IAAA,cAAE,EAAC,kDAAkD,EAAE,GAAG,EAAE;YAC1D,MAAM,MAAM,GAAG,IAAI,qBAAY,EAAE,CAAC;YAClC,MAAM,QAAQ,GAAG,MAAM,CAAC,eAAe,CAAC,qBAAqB,CAAC,CAAC;YAE/D,MAAM,GAAG,GAAG,QAAQ,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,KAAK,CAAC,CAAC;YAC7D,qBAAM,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC;YACf,qBAAM,CAAC,WAAW,CAAC,GAAG,CAAC,UAAU,CAAC,MAAM,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;YAEpD,MAAM,KAAK,GAAG,QAAQ,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,OAAO,CAAC,CAAC;YACjE,qBAAM,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC;YACjB,qBAAM,CAAC,WAAW,CAAC,KAAK,CAAC,UAAU,CAAC,MAAM,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;QACxD,CAAC,CAAC,CAAC;QAEH,IAAA,cAAE,EAAC,8BAA8B,EAAE,GAAG,EAAE;YACtC,MAAM,MAAM,GAAG,IAAI,qBAAY,EAAE,CAAC;YAClC,MAAM,QAAQ,GAAG,MAAM,CAAC,eAAe,CAAC,qBAAqB,CAAC,CAAC;YAE/D,MAAM,KAAK,GAAG,QAAQ,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,OAAO,CAAC,CAAC;YACjE,qBAAM,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC;YACjB,qBAAM,CAAC,WAAW,CAAC,KAAK,CAAC,gBAAgB,EAAE,CAAC,CAAC,CAAC;QAChD,CAAC,CAAC,CAAC;QAEH,IAAA,cAAE,EAAC,8BAA8B,EAAE,GAAG,EAAE;YACtC,MAAM,MAAM,GAAG,IAAI,qBAAY,EAAE,CAAC;YAClC,MAAM,QAAQ,GAAG,MAAM,CAAC,eAAe,CAAC,cAAc,CAAC,CAAC;YAExD,qBAAM,CAAC,WAAW,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,gBAAgB,EAAE,CAAC,CAAC,CAAC;QACpE,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,IAAA,oBAAQ,EAAC,gBAAgB,EAAE,GAAG,EAAE;QAC9B,IAAA,cAAE,EAAC,+BAA+B,EAAE,GAAG,EAAE;YACvC,MAAM,MAAM,GAAG,IAAI,qBAAY,EAAE,CAAC;YAClC,MAAM,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC;YAE7B,MAAM,GAAG,GAAG,MAAM,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC;YACzC,qBAAM,CAAC,WAAW,CAAC,GAAG,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;QACpC,CAAC,CAAC,CAAC;QAEH,IAAA,cAAE,EAAC,uDAAuD,EAAE,GAAG,EAAE;YAC/D,MAAM,MAAM,GAAG,IAAI,qBAAY,EAAE,CAAC;YAClC,MAAM,CAAC,eAAe,CAAC,qBAAqB,CAAC,CAAC;YAE9C,MAAM,GAAG,GAAG,MAAM,CAAC,cAAc,CAAC,eAAe,CAAC,CAAC;YACnD,qBAAM,CAAC,WAAW,CAAC,GAAG,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;QACpC,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,IAAA,oBAAQ,EAAC,kBAAkB,EAAE,GAAG,EAAE;IAChC,IAAA,cAAE,EAAC,4BAA4B,EAAE,GAAG,EAAE;QACpC,MAAM,MAAM,GAAG,IAAI,qBAAY,EAAE,CAAC;QAClC,MAAM,GAAG,GAAG,MAAM,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC;QACzC,MAAM,MAAM,GAAG,IAAA,yBAAgB,EAAC,GAAG,CAAC,CAAC;QAErC,qBAAM,CAAC,WAAW,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;IACvC,CAAC,CAAC,CAAC;IAEH,IAAA,cAAE,EAAC,+BAA+B,EAAE,GAAG,EAAE;QACvC,MAAM,GAAG,GAAmB;YAC1B,MAAM,EAAE,EAAE;YACV,OAAO,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE;SAC1B,CAAC;QACF,MAAM,MAAM,GAAG,IAAA,yBAAgB,EAAC,GAAG,CAAC,CAAC;QAErC,qBAAM,CAAC,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC;IACnD,CAAC,CAAC,CAAC;IAEH,IAAA,cAAE,EAAC,oCAAoC,EAAE,GAAG,EAAE;QAC5C,MAAM,GAAG,GAAmB;YAC1B,MAAM,EAAE,KAAK;YACb,SAAS,EAAE;gBACT,MAAM,EAAE;oBACN,EAAE,EAAE,EAAE,QAAQ,EAAE;oBAChB,EAAE,EAAE,EAAE,QAAQ,EAAE;iBACjB;aACF;SACF,CAAC;QACF,MAAM,MAAM,GAAG,IAAA,yBAAgB,EAAC,GAAG,CAAC,CAAC;QAErC,qBAAM,CAAC,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC;IAClE,CAAC,CAAC,CAAC;IAEH,IAAA,cAAE,EAAC,kCAAkC,EAAE,GAAG,EAAE;QAC1C,MAAM,GAAG,GAAmB;YAC1B,MAAM,EAAE,KAAK;YACb,KAAK,EAAE;gBACL,EAAE,EAAE,EAAE,KAAK,EAAE;gBACb,EAAE,EAAE,EAAE,KAAK,EAAE;aACd;SACF,CAAC;QACF,MAAM,MAAM,GAAG,IAAA,yBAAgB,EAAC,GAAG,CAAC,CAAC;QAErC,qBAAM,CAAC,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,mBAAmB,CAAC,CAAC,CAAC,CAAC;IACvE,CAAC,CAAC,CAAC;IAEH,IAAA,cAAE,EAAC,0CAA0C,EAAE,GAAG,EAAE;QAClD,MAAM,GAAG,GAAmB;YAC1B,MAAM,EAAE,KAAK;YACb,SAAS,EAAE;gBACT,MAAM,EAAE,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC;aACxB;YACD,KAAK,EAAE;gBACL,EAAE,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE;aAClC;SACF,CAAC;QACF,MAAM,MAAM,GAAG,IAAA,yBAAgB,EAAC,GAAG,CAAC,CAAC;QAErC,qBAAM,CAAC,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,4BAA4B,CAAC,CAAC,CAAC,CAAC;IAChF,CAAC,CAAC,CAAC;IAEH,IAAA,cAAE,EAAC,iDAAiD,EAAE,GAAG,EAAE;QACzD,MAAM,GAAG,GAAmB;YAC1B,MAAM,EAAE,KAAK;YACb,KAAK,EAAE,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC;YACtB,OAAO,EAAE;gBACP,EAAE,IAAI,EAAE,mBAAmB,EAAE,KAAK,EAAE,CAAC,KAAK,EAAE,cAAc,CAAC,EAAE;aAC9D;SACF,CAAC;QACF,MAAM,MAAM,GAAG,IAAA,yBAAgB,EAAC,GAAG,CAAC,CAAC;QAErC,qBAAM,CAAC,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,mCAAmC,CAAC,CAAC,CAAC,CAAC;IACvF,CAAC,CAAC,CAAC;IAEH,IAAA,cAAE,EAAC,4DAA4D,EAAE,GAAG,EAAE;QACpE,MAAM,GAAG,GAAmB;YAC1B,MAAM,EAAE,KAAK;YACb,SAAS,EAAE;gBACT,MAAM,EAAE,CAAC,EAAE,EAAE,EAAE,WAAW,EAAE,CAAC;gBAC7B,QAAQ,EAAE,CAAC,EAAE,EAAE,EAAE,WAAW,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;aAC/C;SACF,CAAC;QACF,MAAM,MAAM,GAAG,IAAA,yBAAgB,EAAC,GAAG,CAAC,CAAC;QAErC,qBAAM,CAAC,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC;IAClE,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,IAAA,oBAAQ,EAAC,oBAAoB,EAAE,GAAG,EAAE;IAClC,IAAA,cAAE,EAAC,6CAA6C,EAAE,GAAG,EAAE;QACrD,MAAM,MAAM,GAAG,IAAI,qBAAY,EAAE,CAAC;QAClC,MAAM,QAAQ,GAAG,MAAM,CAAC,eAAe,CAAC,cAAc,CAAC,CAAC;QAExD,sCAAsC;QACtC,MAAM,EAAE,GAAG,IAAA,2BAAkB,EAAC,QAAQ,CAAC,CAAC;QACxC,qBAAM,CAAC,WAAW,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;IAC5B,CAAC,CAAC,CAAC;IAEH,IAAA,cAAE,EAAC,6BAA6B,EAAE,GAAG,EAAE;QACrC,MAAM,GAAG,GAAG;;;;;;;;;CASf,CAAC;QACE,MAAM,MAAM,GAAG,IAAI,qBAAY,EAAE,CAAC;QAClC,MAAM,QAAQ,GAAG,MAAM,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC;QAE7C,4CAA4C;QAC5C,MAAM,EAAE,GAAG,IAAA,2BAAkB,EAAC,QAAQ,CAAC,CAAC;QACxC,qBAAM,CAAC,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,GAAG,KAAK,CAAC,GAAG,IAAI,CAAC,CAAC;IACzC,CAAC,CAAC,CAAC;IAEH,IAAA,cAAE,EAAC,2BAA2B,EAAE,GAAG,EAAE;QACnC,MAAM,MAAM,GAAG,IAAI,qBAAY,EAAE,CAAC;QAClC,MAAM,QAAQ,GAAG,MAAM,CAAC,eAAe,CAAC,qBAAqB,CAAC,CAAC;QAE/D,MAAM,EAAE,GAAG,IAAA,2BAAkB,EAAC,QAAQ,CAAC,CAAC;QACxC,6BAA6B;QAC7B,yCAAyC;QACzC,qBAAM,CAAC,EAAE,CAAC,EAAE,GAAG,GAAG,CAAC,CAAC;IACtB,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,IAAA,oBAAQ,EAAC,iBAAiB,EAAE,GAAG,EAAE;IAC/B,IAAA,cAAE,EAAC,gCAAgC,EAAE,GAAG,EAAE;QACxC,MAAM,MAAM,GAAG,IAAI,qBAAY,EAAE,CAAC;QAClC,MAAM,QAAQ,GAAG,MAAM,CAAC,eAAe,CAAC,cAAc,CAAC,CAAC;QAExD,MAAM,OAAO,GAAG,IAAA,wBAAe,EAAC,QAAQ,CAAC,CAAC;QAC1C,qBAAM,CAAC,WAAW,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;QACtC,qBAAM,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;QAC7C,qBAAM,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC;IACvD,CAAC,CAAC,CAAC;IAEH,IAAA,cAAE,EAAC,qCAAqC,EAAE,GAAG,EAAE;QAC7C,MAAM,MAAM,GAAG,IAAI,qBAAY,EAAE,CAAC;QAClC,MAAM,QAAQ,GAAG,MAAM,CAAC,eAAe,CAAC,cAAc,CAAC,CAAC;QAExD,MAAM,OAAO,GAAG,IAAA,wBAAe,EAAC,QAAQ,CAAC,CAAC;QAC1C,qBAAM,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;QAC5C,qBAAM,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;QAC3C,qBAAM,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;IACjD,CAAC,CAAC,CAAC;IAEH,IAAA,cAAE,EAAC,yBAAyB,EAAE,GAAG,EAAE;QACjC,MAAM,MAAM,GAAG,IAAI,qBAAY,EAAE,CAAC;QAClC,MAAM,QAAQ,GAAG,MAAM,CAAC,eAAe,CAAC,cAAc,CAAC,CAAC;QAExD,MAAM,OAAO,GAAG,IAAA,wBAAe,EAAC,QAAQ,CAAC,CAAC;QAC1C,qBAAM,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;IACpD,CAAC,CAAC,CAAC;IAEH,IAAA,cAAE,EAAC,yBAAyB,EAAE,GAAG,EAAE;QACjC,MAAM,MAAM,GAAG,IAAI,qBAAY,EAAE,CAAC;QAClC,MAAM,QAAQ,GAAG,MAAM,CAAC,eAAe,CAAC,qBAAqB,CAAC,CAAC;QAE/D,MAAM,OAAO,GAAG,IAAA,wBAAe,EAAC,QAAQ,CAAC,CAAC;QAC1C,MAAM,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,OAAO,CAAC,CAAC;QACtD,qBAAM,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC;QACjB,qBAAM,CAAC,WAAW,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC;IACxC,CAAC,CAAC,CAAC;IAEH,IAAA,cAAE,EAAC,uCAAuC,EAAE,GAAG,EAAE;QAC/C,MAAM,MAAM,GAAG,IAAI,qBAAY,EAAE,CAAC;QAClC,MAAM,QAAQ,GAAG,MAAM,CAAC,eAAe,CAAC,cAAc,CAAC,CAAC;QAExD,MAAM,OAAO,GAAG,IAAA,wBAAe,EAAC,QAAQ,CAAC,CAAC;QAC1C,qBAAM,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC;IAC9C,CAAC,CAAC,CAAC;IAEH,IAAA,cAAE,EAAC,mCAAmC,EAAE,GAAG,EAAE;QAC3C,MAAM,GAAG,GAAG;;;;;;;;;;;;CAYf,CAAC;QACE,MAAM,MAAM,GAAG,IAAI,qBAAY,EAAE,CAAC;QAClC,MAAM,QAAQ,GAAG,MAAM,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC;QAE7C,MAAM,OAAO,GAAG,IAAA,wBAAe,EAAC,QAAQ,CAAC,CAAC;QAC1C,qBAAM,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;QACjD,qBAAM,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;QACnD,qBAAM,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;IACtD,CAAC,CAAC,CAAC;IAEH,IAAA,cAAE,EAAC,gCAAgC,EAAE,GAAG,EAAE;QACxC,MAAM,GAAG,GAAG;;;;;CAKf,CAAC;QACE,MAAM,MAAM,GAAG,IAAI,qBAAY,EAAE,CAAC;QAClC,MAAM,QAAQ,GAAG,MAAM,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC;QAE7C,MAAM,OAAO,GAAG,IAAA,wBAAe,EAAC,QAAQ,CAAC,CAAC;QAC1C,qBAAM,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,aAAa,CAAC,CAAC;IACzD,CAAC,CAAC,CAAC;IAEH,IAAA,cAAE,EAAC,gDAAgD,EAAE,GAAG,EAAE;QACxD,MAAM,GAAG,GAAG;;;;;CAKf,CAAC;QACE,MAAM,MAAM,GAAG,IAAI,qBAAY,EAAE,CAAC;QAClC,MAAM,QAAQ,GAAG,MAAM,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC;QAE7C,MAAM,OAAO,GAAG,IAAA,wBAAe,EAAC,QAAQ,CAAC,CAAC;QAC1C,qBAAM,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,cAAc,CAAC,CAAC;IAC1D,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,IAAA,oBAAQ,EAAC,eAAe,EAAE,GAAG,EAAE;IAC7B,IAAA,cAAE,EAAC,iCAAiC,EAAE,GAAG,EAAE;QACzC,MAAM,MAAM,GAAG,IAAI,qBAAY,EAAE,CAAC;QAClC,MAAM,QAAQ,GAAG,MAAM,CAAC,eAAe,CAAC,cAAc,CAAC,CAAC;QACxD,MAAM,OAAO,GAAG,IAAA,wBAAe,EAAC,QAAQ,CAAC,CAAC;QAE1C,MAAM,SAAS,GAAG,IAAA,sBAAa,EAAC,OAAO,CAAC,CAAC;QACzC,qBAAM,CAAC,EAAE,CAAC,SAAS,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC;QACtC,qBAAM,CAAC,EAAE,CAAC,SAAS,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC,CAAC;QAC1C,qBAAM,CAAC,EAAE,CAAC,SAAS,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC,CAAC;QAC3C,qBAAM,CAAC,EAAE,CAAC,SAAS,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC;IAC1C,CAAC,CAAC,CAAC;IAEH,IAAA,cAAE,EAAC,iCAAiC,EAAE,GAAG,EAAE;QACzC,MAAM,MAAM,GAAG,IAAI,qBAAY,EAAE,CAAC;QAClC,MAAM,QAAQ,GAAG,MAAM,CAAC,eAAe,CAAC,cAAc,CAAC,CAAC;QACxD,MAAM,OAAO,GAAG,IAAA,wBAAe,EAAC,QAAQ,CAAC,CAAC;QAE1C,MAAM,SAAS,GAAG,IAAA,sBAAa,EAAC,OAAO,CAAC,CAAC;QACzC,qBAAM,CAAC,EAAE,CAAC,SAAS,CAAC,QAAQ,CAAC,wBAAwB,CAAC,CAAC,CAAC;IAC1D,CAAC,CAAC,CAAC;IAEH,IAAA,cAAE,EAAC,sBAAsB,EAAE,GAAG,EAAE;QAC9B,MAAM,MAAM,GAAG,IAAI,qBAAY,EAAE,CAAC;QAClC,MAAM,QAAQ,GAAG,MAAM,CAAC,eAAe,CAAC,cAAc,CAAC,CAAC;QACxD,MAAM,OAAO,GAAG,IAAA,wBAAe,EAAC,QAAQ,CAAC,CAAC;QAE1C,MAAM,SAAS,GAAG,IAAA,sBAAa,EAAC,OAAO,CAAC,CAAC;QACzC,MAAM,KAAK,GAAG,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAEpC,qDAAqD;QACrD,MAAM,SAAS,GAAG,CAAC,GAAW,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC;QACnE,MAAM,WAAW,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;QACxC,qBAAM,CAAC,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,WAAW,CAAC,CAAC,CAAC;IAC/E,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,IAAA,oBAAQ,EAAC,cAAc,EAAE,GAAG,EAAE;IAC5B,IAAA,cAAE,EAAC,8BAA8B,EAAE,GAAG,EAAE;QACtC,MAAM,GAAG,GAAG;;;;;;;;;;CAUf,CAAC;QACE,MAAM,MAAM,GAAG,IAAI,qBAAY,EAAE,CAAC;QAClC,MAAM,QAAQ,GAAG,MAAM,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC;QAE7C,MAAM,GAAG,GAAG,QAAQ,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC;QACtC,qBAAM,CAAC,WAAW,CAAC,GAAG,CAAC,UAAU,CAAC,MAAM,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;QACtD,qBAAM,CAAC,WAAW,CAAC,GAAG,CAAC,UAAU,CAAC,MAAM,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;IAC3D,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,IAAA,oBAAQ,EAAC,YAAY,EAAE,GAAG,EAAE;IAC1B,IAAA,cAAE,EAAC,sCAAsC,EAAE,GAAG,EAAE;QAC9C,MAAM,GAAG,GAAG;;;;CAIf,CAAC;QACE,MAAM,MAAM,GAAG,IAAI,qBAAY,EAAE,CAAC;QAClC,MAAM,QAAQ,GAAG,MAAM,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC;QAE7C,qBAAM,CAAC,WAAW,CAAC,QAAQ,CAAC,aAAa,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;QACrD,qBAAM,CAAC,WAAW,CAAC,IAAA,2BAAkB,EAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC;QACpD,qBAAM,CAAC,WAAW,CAAC,IAAA,wBAAe,EAAC,QAAQ,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;IAC1D,CAAC,CAAC,CAAC;IAEH,IAAA,cAAE,EAAC,6CAA6C,EAAE,GAAG,EAAE;QACrD,MAAM,GAAG,GAAG;;;;;;CAMf,CAAC;QACE,MAAM,MAAM,GAAG,IAAI,qBAAY,EAAE,CAAC;QAClC,MAAM,QAAQ,GAAG,MAAM,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC;QAE7C,MAAM,IAAI,GAAG,QAAQ,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC;QACvC,qBAAM,CAAC,WAAW,CAAC,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;QACrD,qBAAM,CAAC,WAAW,CAAC,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;QACnD,qBAAM,CAAC,WAAW,CAAC,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;IACzD,CAAC,CAAC,CAAC;IAEH,IAAA,cAAE,EAAC,wCAAwC,EAAE,GAAG,EAAE;QAChD,MAAM,GAAG,GAAG;;;;;;;;CAQf,CAAC;QACE,MAAM,MAAM,GAAG,IAAI,qBAAY,EAAE,CAAC;QAClC,MAAM,QAAQ,GAAG,MAAM,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC;QAE7C,MAAM,IAAI,GAAG,QAAQ,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC;QACvC,qBAAM,CAAC,WAAW,CAAC,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;IACtD,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
package/dist/pdf.d.ts ADDED
@@ -0,0 +1,36 @@
1
+ /**
2
+ * PDF generation for WoodML projects
3
+ * Generates cut sheets, diagrams, and project documentation
4
+ */
5
+ import { ResolvedDocument } from './types';
6
+ import { OptimizationOptions } from './optimizer';
7
+ /**
8
+ * PDF page size in points (1 point = 1/72 inch)
9
+ */
10
+ export interface PageSize {
11
+ width: number;
12
+ height: number;
13
+ }
14
+ export declare const PAGE_SIZES: Record<string, PageSize>;
15
+ /**
16
+ * PDF generation options
17
+ */
18
+ export interface PDFOptions {
19
+ pageSize?: keyof typeof PAGE_SIZES | PageSize;
20
+ orientation?: 'portrait' | 'landscape';
21
+ margin?: number;
22
+ fontSize?: number;
23
+ includeOptimization?: boolean;
24
+ includeDiagrams?: boolean;
25
+ projectInfo?: boolean;
26
+ optimizationOptions?: OptimizationOptions;
27
+ }
28
+ /**
29
+ * Generate a PDF cut sheet for a project
30
+ */
31
+ export declare function generateCutSheetPDF(doc: ResolvedDocument, options?: PDFOptions): string;
32
+ /**
33
+ * Generate a parts diagram PDF
34
+ */
35
+ export declare function generateDiagramPDF(doc: ResolvedDocument, _options?: PDFOptions): string;
36
+ //# sourceMappingURL=pdf.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pdf.d.ts","sourceRoot":"","sources":["../src/pdf.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,gBAAgB,EAAgB,MAAM,SAAS,CAAC;AAGzD,OAAO,EAAuC,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAEvF;;GAEG;AACH,MAAM,WAAW,QAAQ;IACvB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,eAAO,MAAM,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,QAAQ,CAM/C,CAAC;AAEF;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,EAAE,MAAM,OAAO,UAAU,GAAG,QAAQ,CAAC;IAC9C,WAAW,CAAC,EAAE,UAAU,GAAG,WAAW,CAAC;IACvC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAC9B,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,mBAAmB,CAAC,EAAE,mBAAmB,CAAC;CAC3C;AA6OD;;GAEG;AACH,wBAAgB,mBAAmB,CACjC,GAAG,EAAE,gBAAgB,EACrB,OAAO,GAAE,UAAe,GACvB,MAAM,CAkIR;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAChC,GAAG,EAAE,gBAAgB,EACrB,QAAQ,GAAE,UAAe,GACxB,MAAM,CAsBR"}