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,333 @@
1
+ "use strict";
2
+ /**
3
+ * Tests for SVG diagram generation
4
+ */
5
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
6
+ if (k2 === undefined) k2 = k;
7
+ var desc = Object.getOwnPropertyDescriptor(m, k);
8
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
9
+ desc = { enumerable: true, get: function() { return m[k]; } };
10
+ }
11
+ Object.defineProperty(o, k2, desc);
12
+ }) : (function(o, m, k, k2) {
13
+ if (k2 === undefined) k2 = k;
14
+ o[k2] = m[k];
15
+ }));
16
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
17
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
18
+ }) : function(o, v) {
19
+ o["default"] = v;
20
+ });
21
+ var __importStar = (this && this.__importStar) || (function () {
22
+ var ownKeys = function(o) {
23
+ ownKeys = Object.getOwnPropertyNames || function (o) {
24
+ var ar = [];
25
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
26
+ return ar;
27
+ };
28
+ return ownKeys(o);
29
+ };
30
+ return function (mod) {
31
+ if (mod && mod.__esModule) return mod;
32
+ var result = {};
33
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
34
+ __setModuleDefault(result, mod);
35
+ return result;
36
+ };
37
+ })();
38
+ Object.defineProperty(exports, "__esModule", { value: true });
39
+ const node_test_1 = require("node:test");
40
+ const assert = __importStar(require("node:assert"));
41
+ const svg_1 = require("./svg");
42
+ // ============================================
43
+ // TEST HELPERS
44
+ // ============================================
45
+ function makeDimension(value, original) {
46
+ return { value, unit: 'imperial', original };
47
+ }
48
+ function makeResolvedPart(id, length, width, thickness, quantity = 1, name, grain) {
49
+ return {
50
+ id,
51
+ name: name || id,
52
+ grain: grain || 'long',
53
+ dimensions: {
54
+ length: makeDimension(length, `${length}"`),
55
+ width: makeDimension(width, `${width}"`),
56
+ thickness: makeDimension(thickness, `${thickness}"`),
57
+ },
58
+ resolvedQuantity: quantity,
59
+ };
60
+ }
61
+ function makeDocument(parts) {
62
+ return {
63
+ woodml: '1.0',
64
+ project: {
65
+ name: 'Test Project',
66
+ units: 'imperial',
67
+ },
68
+ resolvedParts: parts,
69
+ resolvedVariables: {},
70
+ };
71
+ }
72
+ // ============================================
73
+ // SVG GENERATOR TESTS
74
+ // ============================================
75
+ (0, node_test_1.describe)('SVGGenerator', () => {
76
+ (0, node_test_1.describe)('constructor', () => {
77
+ (0, node_test_1.it)('should use default options', () => {
78
+ const generator = new svg_1.SVGGenerator();
79
+ // Just verify it creates successfully
80
+ assert.ok(generator instanceof svg_1.SVGGenerator);
81
+ });
82
+ (0, node_test_1.it)('should accept custom options', () => {
83
+ const generator = new svg_1.SVGGenerator({
84
+ width: 1200,
85
+ height: 800,
86
+ colorScheme: 'blueprint',
87
+ });
88
+ assert.ok(generator instanceof svg_1.SVGGenerator);
89
+ });
90
+ });
91
+ (0, node_test_1.describe)('generatePartsDiagram', () => {
92
+ (0, node_test_1.it)('should generate valid SVG for single part', () => {
93
+ const generator = new svg_1.SVGGenerator();
94
+ const doc = makeDocument([
95
+ makeResolvedPart('top', 24, 12, 0.75),
96
+ ]);
97
+ const svg = generator.generatePartsDiagram(doc);
98
+ assert.ok(svg.includes('<?xml version="1.0"'));
99
+ assert.ok(svg.includes('<svg'));
100
+ assert.ok(svg.includes('</svg>'));
101
+ assert.ok(svg.includes('data-id="top"'));
102
+ });
103
+ (0, node_test_1.it)('should generate valid SVG for multiple parts', () => {
104
+ const generator = new svg_1.SVGGenerator();
105
+ const doc = makeDocument([
106
+ makeResolvedPart('top', 24, 12, 0.75),
107
+ makeResolvedPart('side', 12, 6, 0.75, 2),
108
+ makeResolvedPart('bottom', 24, 12, 0.5),
109
+ ]);
110
+ const svg = generator.generatePartsDiagram(doc);
111
+ assert.ok(svg.includes('data-id="top"'));
112
+ assert.ok(svg.includes('data-id="side"'));
113
+ assert.ok(svg.includes('data-id="bottom"'));
114
+ });
115
+ (0, node_test_1.it)('should handle empty parts list', () => {
116
+ const generator = new svg_1.SVGGenerator();
117
+ const doc = makeDocument([]);
118
+ const svg = generator.generatePartsDiagram(doc);
119
+ assert.ok(svg.includes('No parts to display'));
120
+ });
121
+ (0, node_test_1.it)('should show dimensions when enabled', () => {
122
+ const generator = new svg_1.SVGGenerator({ showDimensions: true });
123
+ const doc = makeDocument([
124
+ makeResolvedPart('panel', 36, 18, 0.75),
125
+ ]);
126
+ const svg = generator.generatePartsDiagram(doc);
127
+ // Quotes are XML-escaped in SVG
128
+ assert.ok(svg.includes('36&quot;'));
129
+ assert.ok(svg.includes('18&quot;'));
130
+ });
131
+ (0, node_test_1.it)('should show part names when enabled', () => {
132
+ const generator = new svg_1.SVGGenerator({ showNames: true });
133
+ const doc = makeDocument([
134
+ makeResolvedPart('side_panel', 24, 12, 0.75, 1, 'Side Panel'),
135
+ ]);
136
+ const svg = generator.generatePartsDiagram(doc);
137
+ assert.ok(svg.includes('Side Panel'));
138
+ });
139
+ (0, node_test_1.it)('should show quantity badge for parts with quantity > 1', () => {
140
+ const generator = new svg_1.SVGGenerator();
141
+ const doc = makeDocument([
142
+ makeResolvedPart('shelf', 30, 10, 0.75, 4),
143
+ ]);
144
+ const svg = generator.generatePartsDiagram(doc);
145
+ assert.ok(svg.includes('×4'));
146
+ });
147
+ });
148
+ (0, node_test_1.describe)('generateSinglePart', () => {
149
+ (0, node_test_1.it)('should generate SVG for a single part', () => {
150
+ const generator = new svg_1.SVGGenerator();
151
+ const part = makeResolvedPart('door', 30, 20, 0.75);
152
+ const svg = generator.generateSinglePart(part);
153
+ assert.ok(svg.includes('<svg'));
154
+ assert.ok(svg.includes('data-id="door"'));
155
+ });
156
+ (0, node_test_1.it)('should scale part appropriately', () => {
157
+ const generator = new svg_1.SVGGenerator({ scale: 5 });
158
+ const part = makeResolvedPart('small', 10, 5, 0.5);
159
+ const svg = generator.generateSinglePart(part);
160
+ // Should contain the part
161
+ assert.ok(svg.includes('<rect'));
162
+ });
163
+ });
164
+ (0, node_test_1.describe)('generateCutListDiagram', () => {
165
+ (0, node_test_1.it)('should generate cut list layout', () => {
166
+ const generator = new svg_1.SVGGenerator();
167
+ const doc = makeDocument([
168
+ makeResolvedPart('piece1', 24, 6, 0.75),
169
+ makeResolvedPart('piece2', 24, 6, 0.75),
170
+ makeResolvedPart('piece3', 12, 8, 0.75),
171
+ ]);
172
+ const svg = generator.generateCutListDiagram(doc);
173
+ assert.ok(svg.includes('<svg'));
174
+ assert.ok(svg.includes('stroke-dasharray')); // Stock outline
175
+ });
176
+ (0, node_test_1.it)('should handle custom stock sizes', () => {
177
+ const generator = new svg_1.SVGGenerator();
178
+ const doc = makeDocument([
179
+ makeResolvedPart('panel', 20, 10, 0.75),
180
+ ]);
181
+ const svg = generator.generateCutListDiagram(doc, 24, 48);
182
+ assert.ok(svg.includes('<svg'));
183
+ });
184
+ });
185
+ (0, node_test_1.describe)('generateExplodedView', () => {
186
+ (0, node_test_1.it)('should generate 3D-style exploded view', () => {
187
+ const generator = new svg_1.SVGGenerator();
188
+ const doc = makeDocument([
189
+ makeResolvedPart('top', 24, 12, 0.75),
190
+ makeResolvedPart('side', 12, 12, 0.75, 2),
191
+ makeResolvedPart('bottom', 24, 12, 0.5),
192
+ ]);
193
+ const svg = generator.generateExplodedView(doc);
194
+ assert.ok(svg.includes('<polygon')); // 3D faces are polygons
195
+ assert.ok(svg.includes('class="part-3d"'));
196
+ });
197
+ });
198
+ (0, node_test_1.describe)('color schemes', () => {
199
+ (0, node_test_1.it)('should apply default color scheme', () => {
200
+ const generator = new svg_1.SVGGenerator({ colorScheme: 'default' });
201
+ const doc = makeDocument([makeResolvedPart('part', 10, 5, 0.5)]);
202
+ const svg = generator.generatePartsDiagram(doc);
203
+ assert.ok(svg.includes('#ffffff')); // White background
204
+ assert.ok(svg.includes('#f5deb3')); // Wheat fill
205
+ });
206
+ (0, node_test_1.it)('should apply blueprint color scheme', () => {
207
+ const generator = new svg_1.SVGGenerator({ colorScheme: 'blueprint' });
208
+ const doc = makeDocument([makeResolvedPart('part', 10, 5, 0.5)]);
209
+ const svg = generator.generatePartsDiagram(doc);
210
+ assert.ok(svg.includes('#1a365d')); // Dark blue background
211
+ });
212
+ (0, node_test_1.it)('should apply monochrome color scheme', () => {
213
+ const generator = new svg_1.SVGGenerator({ colorScheme: 'monochrome' });
214
+ const doc = makeDocument([makeResolvedPart('part', 10, 5, 0.5)]);
215
+ const svg = generator.generatePartsDiagram(doc);
216
+ assert.ok(svg.includes('#f0f0f0')); // Light gray fill
217
+ });
218
+ });
219
+ (0, node_test_1.describe)('grain direction', () => {
220
+ (0, node_test_1.it)('should render horizontal grain lines for long grain', () => {
221
+ const generator = new svg_1.SVGGenerator({ showGrain: true });
222
+ const doc = makeDocument([
223
+ makeResolvedPart('panel', 24, 12, 0.75, 1, 'Panel', 'long'),
224
+ ]);
225
+ const svg = generator.generatePartsDiagram(doc);
226
+ // Should contain path elements for grain
227
+ assert.ok(svg.includes('<path'));
228
+ });
229
+ (0, node_test_1.it)('should not render grain for any direction', () => {
230
+ const generator = new svg_1.SVGGenerator({ showGrain: true });
231
+ const part = makeResolvedPart('panel', 24, 12, 0.75, 1, 'Panel', 'any');
232
+ const doc = makeDocument([part]);
233
+ const svg = generator.generatePartsDiagram(doc);
234
+ // Should still generate valid SVG
235
+ assert.ok(svg.includes('<svg'));
236
+ });
237
+ });
238
+ });
239
+ // ============================================
240
+ // CONVENIENCE FUNCTION TESTS
241
+ // ============================================
242
+ (0, node_test_1.describe)('generateSVG', () => {
243
+ (0, node_test_1.it)('should generate parts diagram by default', () => {
244
+ const doc = makeDocument([makeResolvedPart('test', 12, 6, 0.5)]);
245
+ const svg = (0, svg_1.generateSVG)(doc);
246
+ assert.ok(svg.includes('data-id="test"'));
247
+ });
248
+ (0, node_test_1.it)('should generate exploded view when specified', () => {
249
+ const doc = makeDocument([makeResolvedPart('test', 12, 6, 0.5)]);
250
+ const svg = (0, svg_1.generateSVG)(doc, 'exploded');
251
+ assert.ok(svg.includes('class="part-3d"'));
252
+ });
253
+ (0, node_test_1.it)('should generate cutlist diagram when specified', () => {
254
+ const doc = makeDocument([makeResolvedPart('test', 12, 6, 0.5)]);
255
+ const svg = (0, svg_1.generateSVG)(doc, 'cutlist');
256
+ assert.ok(svg.includes('stroke-dasharray'));
257
+ });
258
+ (0, node_test_1.it)('should accept options', () => {
259
+ const doc = makeDocument([makeResolvedPart('test', 12, 6, 0.5)]);
260
+ const svg = (0, svg_1.generateSVG)(doc, 'parts', { colorScheme: 'blueprint' });
261
+ assert.ok(svg.includes('#1a365d'));
262
+ });
263
+ });
264
+ (0, node_test_1.describe)('generatePartSVG', () => {
265
+ (0, node_test_1.it)('should generate SVG for a single part', () => {
266
+ const part = makeResolvedPart('single', 24, 12, 0.75);
267
+ const svg = (0, svg_1.generatePartSVG)(part);
268
+ assert.ok(svg.includes('<svg'));
269
+ assert.ok(svg.includes('data-id="single"'));
270
+ });
271
+ (0, node_test_1.it)('should respect options', () => {
272
+ const part = makeResolvedPart('single', 24, 12, 0.75);
273
+ const svg = (0, svg_1.generatePartSVG)(part, { showDimensions: false, showNames: false });
274
+ // Should still generate valid SVG
275
+ assert.ok(svg.includes('<svg'));
276
+ });
277
+ });
278
+ // ============================================
279
+ // XML ESCAPING TESTS
280
+ // ============================================
281
+ (0, node_test_1.describe)('XML escaping', () => {
282
+ (0, node_test_1.it)('should escape special characters in part names', () => {
283
+ const generator = new svg_1.SVGGenerator();
284
+ const part = makeResolvedPart('test', 12, 6, 0.5, 1, 'Part <A> & "B"');
285
+ const doc = makeDocument([part]);
286
+ const svg = generator.generatePartsDiagram(doc);
287
+ assert.ok(svg.includes('&lt;'));
288
+ assert.ok(svg.includes('&gt;'));
289
+ assert.ok(svg.includes('&amp;'));
290
+ assert.ok(svg.includes('&quot;'));
291
+ });
292
+ });
293
+ // ============================================
294
+ // DIMENSION RENDERING TESTS
295
+ // ============================================
296
+ (0, node_test_1.describe)('dimension rendering', () => {
297
+ (0, node_test_1.it)('should render horizontal dimensions with arrows', () => {
298
+ const generator = new svg_1.SVGGenerator({ showDimensions: true });
299
+ const doc = makeDocument([makeResolvedPart('part', 20, 10, 0.5)]);
300
+ const svg = generator.generatePartsDiagram(doc);
301
+ assert.ok(svg.includes('class="dimension dimension-h"'));
302
+ assert.ok(svg.includes('<polygon')); // Arrow heads
303
+ });
304
+ (0, node_test_1.it)('should render vertical dimensions', () => {
305
+ const generator = new svg_1.SVGGenerator({ showDimensions: true });
306
+ const doc = makeDocument([makeResolvedPart('part', 20, 10, 0.5)]);
307
+ const svg = generator.generatePartsDiagram(doc);
308
+ assert.ok(svg.includes('class="dimension dimension-v"'));
309
+ });
310
+ });
311
+ // ============================================
312
+ // VIEWBOX AND SIZE TESTS
313
+ // ============================================
314
+ (0, node_test_1.describe)('SVG size and viewBox', () => {
315
+ (0, node_test_1.it)('should set correct width and height', () => {
316
+ const generator = new svg_1.SVGGenerator({ width: 1000, height: 700 });
317
+ const doc = makeDocument([makeResolvedPart('part', 10, 5, 0.5)]);
318
+ const svg = generator.generatePartsDiagram(doc);
319
+ assert.ok(svg.includes('width="1000"'));
320
+ assert.ok(svg.includes('height="700"'));
321
+ assert.ok(svg.includes('viewBox="0 0 1000 700"'));
322
+ });
323
+ (0, node_test_1.it)('should include CSS styles in defs', () => {
324
+ const generator = new svg_1.SVGGenerator();
325
+ const doc = makeDocument([makeResolvedPart('part', 10, 5, 0.5)]);
326
+ const svg = generator.generatePartsDiagram(doc);
327
+ assert.ok(svg.includes('<defs>'));
328
+ assert.ok(svg.includes('<style>'));
329
+ assert.ok(svg.includes('</style>'));
330
+ assert.ok(svg.includes('</defs>'));
331
+ });
332
+ });
333
+ //# sourceMappingURL=svg.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"svg.test.js","sourceRoot":"","sources":["../src/svg.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,126 @@
1
+ /**
2
+ * WoodML Template System
3
+ * Handles parametric template parsing and instantiation
4
+ */
5
+ import { Part, UnitSystem, Joint } from './types';
6
+ export type ParamType = 'dimension' | 'number' | 'string' | 'boolean' | 'material_ref' | 'part_ref' | 'enum';
7
+ export interface TemplateParam {
8
+ type: ParamType;
9
+ description?: string;
10
+ optional?: boolean;
11
+ min?: string | number;
12
+ max?: string | number;
13
+ values?: string[];
14
+ }
15
+ export interface TemplateDefinition {
16
+ name: string;
17
+ description?: string;
18
+ version?: string;
19
+ author?: string;
20
+ params: Record<string, ParamType | TemplateParam>;
21
+ defaults?: Record<string, string | number | boolean>;
22
+ computed?: Record<string, string>;
23
+ parts: TemplatePart[];
24
+ joinery?: TemplateJoint[];
25
+ }
26
+ export interface TemplatePart {
27
+ id: string;
28
+ name?: string;
29
+ material?: string;
30
+ dimensions?: {
31
+ length?: string;
32
+ width?: string;
33
+ depth?: string;
34
+ thickness?: string;
35
+ };
36
+ quantity?: number | string;
37
+ grain?: 'long' | 'short' | 'any';
38
+ notes?: string;
39
+ repeat?: number | string;
40
+ as?: string;
41
+ use?: string;
42
+ params?: Record<string, string | number | boolean>;
43
+ }
44
+ export interface TemplateJoint {
45
+ type: string;
46
+ parts?: string[];
47
+ housing?: string;
48
+ insert?: string;
49
+ tails?: string;
50
+ pins?: string;
51
+ ratio?: string;
52
+ depth?: string;
53
+ position?: string;
54
+ }
55
+ export interface TemplateInstance {
56
+ use: string;
57
+ id: string;
58
+ params: Record<string, string | number | boolean>;
59
+ }
60
+ export interface InstantiatedTemplate {
61
+ parts: Part[];
62
+ joinery: Joint[];
63
+ }
64
+ export declare class TemplateParser {
65
+ private templates;
66
+ private defaultUnit;
67
+ constructor(defaultUnit?: UnitSystem);
68
+ /**
69
+ * Register a template definition
70
+ */
71
+ registerTemplate(template: TemplateDefinition): void;
72
+ /**
73
+ * Parse a template definition from raw data
74
+ */
75
+ parseTemplateDefinition(data: Record<string, unknown>): TemplateDefinition;
76
+ /**
77
+ * Validate template instance parameters
78
+ */
79
+ validateParams(template: TemplateDefinition, providedParams: Record<string, string | number | boolean>): string[];
80
+ /**
81
+ * Instantiate a template with given parameters
82
+ */
83
+ instantiate(templateName: string, instanceId: string, params: Record<string, string | number | boolean>, materials?: Record<string, string>): InstantiatedTemplate;
84
+ /**
85
+ * Process a nested template reference
86
+ */
87
+ private processNestedTemplate;
88
+ /**
89
+ * Process a single template part into a Part
90
+ * Returns array for nested templates (which may produce multiple parts)
91
+ */
92
+ private processTemplatePart;
93
+ /**
94
+ * Process a template joint into a Joint
95
+ */
96
+ private processTemplateJoint;
97
+ /**
98
+ * Substitute ${param} references in a string
99
+ */
100
+ private substituteParams;
101
+ /**
102
+ * Evaluate an expression to a number
103
+ */
104
+ private evaluateNumber;
105
+ /**
106
+ * Get numeric value from a param value for constraint comparison
107
+ */
108
+ private getNumericValue;
109
+ /**
110
+ * Get a registered template
111
+ */
112
+ getTemplate(name: string): TemplateDefinition | undefined;
113
+ /**
114
+ * List all registered templates
115
+ */
116
+ listTemplates(): string[];
117
+ }
118
+ /**
119
+ * Parse template from YAML string
120
+ */
121
+ export declare function parseTemplate(yaml: string, parser: TemplateParser): TemplateDefinition;
122
+ /**
123
+ * Create a new template parser
124
+ */
125
+ export declare function createTemplateParser(defaultUnit?: UnitSystem): TemplateParser;
126
+ //# sourceMappingURL=templates.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"templates.d.ts","sourceRoot":"","sources":["../src/templates.ts"],"names":[],"mappings":"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"}