@tobisk/pcbs 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 (168) hide show
  1. package/LICENSE.md +21 -0
  2. package/README.md +186 -0
  3. package/dist/src/cli/cli.d.ts +6 -0
  4. package/dist/src/cli/cli.js +87 -0
  5. package/dist/src/cli/cli.js.map +1 -0
  6. package/dist/src/cli/codegen.d.ts +25 -0
  7. package/dist/src/cli/codegen.js +170 -0
  8. package/dist/src/cli/codegen.js.map +1 -0
  9. package/dist/src/cli/commands/export.d.ts +13 -0
  10. package/dist/src/cli/commands/export.js +301 -0
  11. package/dist/src/cli/commands/export.js.map +1 -0
  12. package/dist/src/cli/commands/lib.d.ts +10 -0
  13. package/dist/src/cli/commands/lib.js +158 -0
  14. package/dist/src/cli/commands/lib.js.map +1 -0
  15. package/dist/src/cli/commands/parts.d.ts +4 -0
  16. package/dist/src/cli/commands/parts.js +104 -0
  17. package/dist/src/cli/commands/parts.js.map +1 -0
  18. package/dist/src/cli/commands/setup.d.ts +4 -0
  19. package/dist/src/cli/commands/setup.js +86 -0
  20. package/dist/src/cli/commands/setup.js.map +1 -0
  21. package/dist/src/cli/commands/synth.d.ts +4 -0
  22. package/dist/src/cli/commands/synth.js +75 -0
  23. package/dist/src/cli/commands/synth.js.map +1 -0
  24. package/dist/src/cli/commands/types.d.ts +1 -0
  25. package/dist/src/cli/commands/types.js +140 -0
  26. package/dist/src/cli/commands/types.js.map +1 -0
  27. package/dist/src/cli/commands/validate.d.ts +5 -0
  28. package/dist/src/cli/commands/validate.js +105 -0
  29. package/dist/src/cli/commands/validate.js.map +1 -0
  30. package/dist/src/cli/config.d.ts +9 -0
  31. package/dist/src/cli/config.js +80 -0
  32. package/dist/src/cli/config.js.map +1 -0
  33. package/dist/src/cli/env.d.ts +4 -0
  34. package/dist/src/cli/env.js +166 -0
  35. package/dist/src/cli/env.js.map +1 -0
  36. package/dist/src/cli/search-jlc.d.ts +0 -0
  37. package/dist/src/cli/search-jlc.js +23 -0
  38. package/dist/src/cli/search-jlc.js.map +1 -0
  39. package/dist/src/cli/synthesis.d.ts +11 -0
  40. package/dist/src/cli/synthesis.js +120 -0
  41. package/dist/src/cli/synthesis.js.map +1 -0
  42. package/dist/src/cli/utils/bom.d.ts +19 -0
  43. package/dist/src/cli/utils/bom.js +130 -0
  44. package/dist/src/cli/utils/bom.js.map +1 -0
  45. package/dist/src/cli/utils/cpl.d.ts +18 -0
  46. package/dist/src/cli/utils/cpl.js +101 -0
  47. package/dist/src/cli/utils/cpl.js.map +1 -0
  48. package/dist/src/cli/utils.d.ts +11 -0
  49. package/dist/src/cli/utils.js +136 -0
  50. package/dist/src/cli/utils.js.map +1 -0
  51. package/dist/src/generate-kicad-types.d.ts +1 -0
  52. package/dist/src/generate-kicad-types.js +137 -0
  53. package/dist/src/generate-kicad-types.js.map +1 -0
  54. package/dist/src/synth/3d/Kicad3DModel.d.ts +81 -0
  55. package/dist/src/synth/3d/Kicad3DModel.js +250 -0
  56. package/dist/src/synth/3d/Kicad3DModel.js.map +1 -0
  57. package/dist/src/synth/3d/booleans.d.ts +10 -0
  58. package/dist/src/synth/3d/booleans.js +30 -0
  59. package/dist/src/synth/3d/booleans.js.map +1 -0
  60. package/dist/src/synth/3d/fillet.d.ts +14 -0
  61. package/dist/src/synth/3d/fillet.js +47 -0
  62. package/dist/src/synth/3d/fillet.js.map +1 -0
  63. package/dist/src/synth/3d/index.d.ts +7 -0
  64. package/dist/src/synth/3d/index.js +14 -0
  65. package/dist/src/synth/3d/index.js.map +1 -0
  66. package/dist/src/synth/3d/occ-loader.d.ts +5 -0
  67. package/dist/src/synth/3d/occ-loader.js +77 -0
  68. package/dist/src/synth/3d/occ-loader.js.map +1 -0
  69. package/dist/src/synth/3d/occ.d.ts +3 -0
  70. package/dist/src/synth/3d/occ.js +31 -0
  71. package/dist/src/synth/3d/occ.js.map +1 -0
  72. package/dist/src/synth/3d/primitives.d.ts +38 -0
  73. package/dist/src/synth/3d/primitives.js +58 -0
  74. package/dist/src/synth/3d/primitives.js.map +1 -0
  75. package/dist/src/synth/3d/stepWriter.d.ts +7 -0
  76. package/dist/src/synth/3d/stepWriter.js +72 -0
  77. package/dist/src/synth/3d/stepWriter.js.map +1 -0
  78. package/dist/src/synth/3d/transforms.d.ts +18 -0
  79. package/dist/src/synth/3d/transforms.js +74 -0
  80. package/dist/src/synth/3d/transforms.js.map +1 -0
  81. package/dist/src/synth/3d/types.d.ts +54 -0
  82. package/dist/src/synth/3d/types.js +21 -0
  83. package/dist/src/synth/3d/types.js.map +1 -0
  84. package/dist/src/synth/3d/vrmlWriter.d.ts +5 -0
  85. package/dist/src/synth/3d/vrmlWriter.js +171 -0
  86. package/dist/src/synth/3d/vrmlWriter.js.map +1 -0
  87. package/dist/src/synth/Component.d.ts +67 -0
  88. package/dist/src/synth/Component.js +185 -0
  89. package/dist/src/synth/Component.js.map +1 -0
  90. package/dist/src/synth/Composable.d.ts +73 -0
  91. package/dist/src/synth/Composable.js +128 -0
  92. package/dist/src/synth/Composable.js.map +1 -0
  93. package/dist/src/synth/KicadFootprint.d.ts +97 -0
  94. package/dist/src/synth/KicadFootprint.js +312 -0
  95. package/dist/src/synth/KicadFootprint.js.map +1 -0
  96. package/dist/src/synth/KicadLibrary.d.ts +66 -0
  97. package/dist/src/synth/KicadLibrary.js +162 -0
  98. package/dist/src/synth/KicadLibrary.js.map +1 -0
  99. package/dist/src/synth/KicadSymbol.d.ts +71 -0
  100. package/dist/src/synth/KicadSymbol.js +190 -0
  101. package/dist/src/synth/KicadSymbol.js.map +1 -0
  102. package/dist/src/synth/Layout.d.ts +37 -0
  103. package/dist/src/synth/Layout.js +58 -0
  104. package/dist/src/synth/Layout.js.map +1 -0
  105. package/dist/src/synth/Markers.d.ts +35 -0
  106. package/dist/src/synth/Markers.js +48 -0
  107. package/dist/src/synth/Markers.js.map +1 -0
  108. package/dist/src/synth/Module.d.ts +56 -0
  109. package/dist/src/synth/Module.js +65 -0
  110. package/dist/src/synth/Module.js.map +1 -0
  111. package/dist/src/synth/Net.d.ts +23 -0
  112. package/dist/src/synth/Net.js +95 -0
  113. package/dist/src/synth/Net.js.map +1 -0
  114. package/dist/src/synth/Registry.d.ts +36 -0
  115. package/dist/src/synth/Registry.js +75 -0
  116. package/dist/src/synth/Registry.js.map +1 -0
  117. package/dist/src/synth/Schematic.d.ts +36 -0
  118. package/dist/src/synth/Schematic.js +51 -0
  119. package/dist/src/synth/Schematic.js.map +1 -0
  120. package/dist/src/synth/index.d.ts +21 -0
  121. package/dist/src/synth/index.js +46 -0
  122. package/dist/src/synth/index.js.map +1 -0
  123. package/dist/src/synth/kicad-types-placeholder.d.ts +6 -0
  124. package/dist/src/synth/kicad-types-placeholder.js +7 -0
  125. package/dist/src/synth/kicad-types-placeholder.js.map +1 -0
  126. package/dist/src/synth/types.d.ts +111 -0
  127. package/dist/src/synth/types.js +23 -0
  128. package/dist/src/synth/types.js.map +1 -0
  129. package/dist/src/tests/3d-model.test.d.ts +1 -0
  130. package/dist/src/tests/3d-model.test.js +282 -0
  131. package/dist/src/tests/3d-model.test.js.map +1 -0
  132. package/dist/src/tests/codegen.test.d.ts +1 -0
  133. package/dist/src/tests/codegen.test.js +80 -0
  134. package/dist/src/tests/codegen.test.js.map +1 -0
  135. package/dist/src/tests/dmx_node.test.d.ts +1 -0
  136. package/dist/src/tests/dmx_node.test.js +42 -0
  137. package/dist/src/tests/dmx_node.test.js.map +1 -0
  138. package/dist/src/tests/dnc.test.d.ts +1 -0
  139. package/dist/src/tests/dnc.test.js +100 -0
  140. package/dist/src/tests/dnc.test.js.map +1 -0
  141. package/dist/src/tests/kicad-lib.test.d.ts +1 -0
  142. package/dist/src/tests/kicad-lib.test.js +465 -0
  143. package/dist/src/tests/kicad-lib.test.js.map +1 -0
  144. package/dist/src/tests/layout.test.d.ts +1 -0
  145. package/dist/src/tests/layout.test.js +92 -0
  146. package/dist/src/tests/layout.test.js.map +1 -0
  147. package/dist/src/tests/migration.test.d.ts +1 -0
  148. package/dist/src/tests/migration.test.js +58 -0
  149. package/dist/src/tests/migration.test.js.map +1 -0
  150. package/dist/src/tests/net_merging.test.d.ts +1 -0
  151. package/dist/src/tests/net_merging.test.js +97 -0
  152. package/dist/src/tests/net_merging.test.js.map +1 -0
  153. package/dist/src/tests/occ-minimal.test.d.ts +1 -0
  154. package/dist/src/tests/occ-minimal.test.js +14 -0
  155. package/dist/src/tests/occ-minimal.test.js.map +1 -0
  156. package/dist/src/tests/placement.test.d.ts +1 -0
  157. package/dist/src/tests/placement.test.js +130 -0
  158. package/dist/src/tests/placement.test.js.map +1 -0
  159. package/dist/src/tests/synthesis.test.d.ts +1 -0
  160. package/dist/src/tests/synthesis.test.js +88 -0
  161. package/dist/src/tests/synthesis.test.js.map +1 -0
  162. package/dist/src/types/kicad-library.d.ts +6 -0
  163. package/dist/src/types/kicad-library.js +7 -0
  164. package/dist/src/types/kicad-library.js.map +1 -0
  165. package/dist/src/types/kicad-library.ts +61770 -0
  166. package/package.json +57 -0
  167. package/scripts/patch-opencascade.ts +18 -0
  168. package/scripts/wasm-stub.js +1 -0
@@ -0,0 +1,282 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ /**
37
+ * 3D Model Pipeline Tests
38
+ *
39
+ * Tests cover:
40
+ * 1. Build model with union + subtract + fillet → export WRL → verify file
41
+ * 2. VRML content verification (header, diffuseColor, IndexedFaceSet)
42
+ * 3. Footprint model block serialization
43
+ * 4. Primitives produce valid shapes
44
+ */
45
+ const vitest_1 = require("vitest");
46
+ const fs = __importStar(require("fs"));
47
+ const path = __importStar(require("path"));
48
+ const os = __importStar(require("os"));
49
+ const KicadFootprint_1 = require("../synth/KicadFootprint");
50
+ const Kicad3DModel_1 = require("../synth/3d/Kicad3DModel");
51
+ const occ_1 = require("../synth/3d/occ");
52
+ let oc;
53
+ // Initialize OCC once for all tests (~2-3 seconds)
54
+ (0, vitest_1.beforeAll)(async () => {
55
+ oc = await (0, occ_1.initOCC)();
56
+ }, 30000);
57
+ // ─── Primitive creation ──────────────────────────────────────────────
58
+ (0, vitest_1.describe)("Primitives", () => {
59
+ (0, vitest_1.it)("creates a box", () => {
60
+ const model = new Kicad3DModel_1.Kicad3DModel();
61
+ model.setOC(oc);
62
+ const box = model.box({ x: 10, y: 20, z: 5 });
63
+ (0, vitest_1.expect)(box._handle.shape).toBeTruthy();
64
+ });
65
+ (0, vitest_1.it)("creates a centered box", () => {
66
+ const model = new Kicad3DModel_1.Kicad3DModel();
67
+ model.setOC(oc);
68
+ const box = model.box({ x: 10, y: 20, z: 5, center: true });
69
+ (0, vitest_1.expect)(box._handle.shape).toBeTruthy();
70
+ });
71
+ (0, vitest_1.it)("creates a sphere", () => {
72
+ const model = new Kicad3DModel_1.Kicad3DModel();
73
+ model.setOC(oc);
74
+ const sphere = model.sphere({ r: 5 });
75
+ (0, vitest_1.expect)(sphere._handle.shape).toBeTruthy();
76
+ });
77
+ (0, vitest_1.it)("creates a cylinder", () => {
78
+ const model = new Kicad3DModel_1.Kicad3DModel();
79
+ model.setOC(oc);
80
+ const cyl = model.cylinder({ r: 3, h: 10 });
81
+ (0, vitest_1.expect)(cyl._handle.shape).toBeTruthy();
82
+ });
83
+ (0, vitest_1.it)("creates a centered cylinder", () => {
84
+ const model = new Kicad3DModel_1.Kicad3DModel();
85
+ model.setOC(oc);
86
+ const cyl = model.cylinder({ r: 3, h: 10, center: true });
87
+ (0, vitest_1.expect)(cyl._handle.shape).toBeTruthy();
88
+ });
89
+ });
90
+ // ─── Transforms ──────────────────────────────────────────────────────
91
+ (0, vitest_1.describe)("Transforms", () => {
92
+ (0, vitest_1.it)("translates a box", () => {
93
+ const model = new Kicad3DModel_1.Kicad3DModel();
94
+ model.setOC(oc);
95
+ const box = model.box({ x: 5, y: 5, z: 5 }).translate({ x: 10, y: 20, z: 30 });
96
+ (0, vitest_1.expect)(box._handle.shape).toBeTruthy();
97
+ });
98
+ (0, vitest_1.it)("rotates a box", () => {
99
+ const model = new Kicad3DModel_1.Kicad3DModel();
100
+ model.setOC(oc);
101
+ const box = model.box({ x: 5, y: 5, z: 5 }).rotate({ z: 45 });
102
+ (0, vitest_1.expect)(box._handle.shape).toBeTruthy();
103
+ });
104
+ (0, vitest_1.it)("chains translate + rotate + color", () => {
105
+ const model = new Kicad3DModel_1.Kicad3DModel();
106
+ model.setOC(oc);
107
+ const box = model.box({ x: 5, y: 5, z: 5 })
108
+ .translate({ x: 10 })
109
+ .rotate({ z: 90 })
110
+ .color("#ff0000");
111
+ (0, vitest_1.expect)(box._handle.shape).toBeTruthy();
112
+ (0, vitest_1.expect)(box._handle.color).toEqual({ r: 1, g: 0, b: 0, a: 1 });
113
+ });
114
+ });
115
+ // ─── Boolean operations ──────────────────────────────────────────────
116
+ (0, vitest_1.describe)("Boolean operations", () => {
117
+ (0, vitest_1.it)("fuses two boxes", () => {
118
+ const model = new Kicad3DModel_1.Kicad3DModel();
119
+ model.setOC(oc);
120
+ const a = model.box({ x: 10, y: 10, z: 10, center: true });
121
+ const b = model.box({ x: 5, y: 5, z: 20, center: true });
122
+ const result = model.union(a, b);
123
+ (0, vitest_1.expect)(result._handle.shape).toBeTruthy();
124
+ (0, vitest_1.expect)(model.solids).toHaveLength(1);
125
+ });
126
+ (0, vitest_1.it)("subtracts a cylinder from a box", () => {
127
+ const model = new Kicad3DModel_1.Kicad3DModel();
128
+ model.setOC(oc);
129
+ const box = model.box({ x: 20, y: 20, z: 10, center: true });
130
+ const hole = model.cylinder({ r: 3, h: 20, center: true });
131
+ const result = model.subtract(box, hole);
132
+ (0, vitest_1.expect)(result._handle.shape).toBeTruthy();
133
+ (0, vitest_1.expect)(model.solids).toHaveLength(1);
134
+ });
135
+ (0, vitest_1.it)("intersects two boxes", () => {
136
+ const model = new Kicad3DModel_1.Kicad3DModel();
137
+ model.setOC(oc);
138
+ const a = model.box({ x: 10, y: 10, z: 10, center: true });
139
+ const b = model.box({ x: 10, y: 10, z: 10, center: true })
140
+ .translate({ x: 5, y: 5 });
141
+ const result = model.intersect(a, b);
142
+ (0, vitest_1.expect)(result._handle.shape).toBeTruthy();
143
+ (0, vitest_1.expect)(model.solids).toHaveLength(1);
144
+ });
145
+ });
146
+ // ─── Fillet ──────────────────────────────────────────────────────────
147
+ (0, vitest_1.describe)("Fillet", () => {
148
+ (0, vitest_1.it)("fillets all edges of a box", () => {
149
+ const model = new Kicad3DModel_1.Kicad3DModel();
150
+ model.setOC(oc);
151
+ const box = model.box({ x: 10, y: 10, z: 10, center: true })
152
+ .fillet({ radius: 1, edges: "all" });
153
+ (0, vitest_1.expect)(box._handle.shape).toBeTruthy();
154
+ });
155
+ (0, vitest_1.it)("creates a rounded box via roundedBox()", () => {
156
+ const model = new Kicad3DModel_1.Kicad3DModel();
157
+ model.setOC(oc);
158
+ const rounded = model.roundedBox({ x: 10, y: 10, z: 10, r: 1.5, center: true });
159
+ (0, vitest_1.expect)(rounded._handle.shape).toBeTruthy();
160
+ });
161
+ });
162
+ // ─── VRML Export ─────────────────────────────────────────────────────
163
+ (0, vitest_1.describe)("VRML export", () => {
164
+ (0, vitest_1.it)("exports a model with union + subtract + fillet to WRL", async () => {
165
+ const tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), "kicad-3d-test-"));
166
+ try {
167
+ const model = new Kicad3DModel_1.Kicad3DModel();
168
+ model.setOC(oc);
169
+ // Build a box, union with another box, subtract a cylinder, fillet
170
+ const body = model.box({ x: 20, y: 15, z: 5, center: true }).color("#1f4fa3");
171
+ const top = model.box({ x: 8, y: 8, z: 10, center: true })
172
+ .translate({ z: 5 })
173
+ .color("#c0c0c0");
174
+ // Don't combine — keep as separate colored solids
175
+ const hole = model.cylinder({ r: 2, h: 20, center: true }).name("hole");
176
+ const bodyWithHole = model.subtract(body, hole);
177
+ const result = await model.export({
178
+ outDir: tmpDir,
179
+ baseName: "test_model",
180
+ formats: ["wrl"],
181
+ });
182
+ // File exists
183
+ (0, vitest_1.expect)(result.wrlPath).toBeDefined();
184
+ (0, vitest_1.expect)(fs.existsSync(result.wrlPath)).toBe(true);
185
+ // Read and verify content
186
+ const content = fs.readFileSync(result.wrlPath, "utf-8");
187
+ // VRML header
188
+ (0, vitest_1.expect)(content).toContain("#VRML V2.0 utf8");
189
+ // Has material color
190
+ (0, vitest_1.expect)(content).toContain("diffuseColor");
191
+ // Has geometry
192
+ (0, vitest_1.expect)(content).toContain("IndexedFaceSet");
193
+ (0, vitest_1.expect)(content).toContain("coordIndex");
194
+ (0, vitest_1.expect)(content).toContain("Coordinate");
195
+ }
196
+ finally {
197
+ fs.rmSync(tmpDir, { recursive: true });
198
+ }
199
+ });
200
+ (0, vitest_1.it)("preserves per-solid colors in VRML", async () => {
201
+ const tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), "kicad-3d-color-"));
202
+ try {
203
+ const model = new Kicad3DModel_1.Kicad3DModel();
204
+ model.setOC(oc);
205
+ model.box({ x: 10, y: 10, z: 2, center: true }).color("#ff0000").name("red");
206
+ model.box({ x: 5, y: 5, z: 5, center: true })
207
+ .translate({ z: 3 })
208
+ .color("#00ff00")
209
+ .name("green");
210
+ const result = await model.export({
211
+ outDir: tmpDir,
212
+ baseName: "color_test",
213
+ formats: ["wrl"],
214
+ });
215
+ const content = fs.readFileSync(result.wrlPath, "utf-8");
216
+ // Should have two Shape nodes, each with diffuseColor
217
+ const shapeCount = (content.match(/Shape\s*\{/g) || []).length;
218
+ (0, vitest_1.expect)(shapeCount).toBe(2);
219
+ // Red color (1 0 0) and green color (0 1 0)
220
+ (0, vitest_1.expect)(content).toContain("diffuseColor 1 0 0");
221
+ (0, vitest_1.expect)(content).toContain("diffuseColor 0 1 0");
222
+ // Solid name comments
223
+ (0, vitest_1.expect)(content).toContain("# red");
224
+ (0, vitest_1.expect)(content).toContain("# green");
225
+ }
226
+ finally {
227
+ fs.rmSync(tmpDir, { recursive: true });
228
+ }
229
+ });
230
+ });
231
+ // ─── Footprint model block ──────────────────────────────────────────
232
+ (0, vitest_1.describe)("Footprint model block", () => {
233
+ (0, vitest_1.it)("serializes (model ...) block with defaults", () => {
234
+ const fp = new KicadFootprint_1.KicadFootprint({ name: "TestPart3D" });
235
+ fp.addPad({
236
+ number: "1", type: "smd", shape: "rect",
237
+ x: 0, y: 0, width: 1, height: 1,
238
+ });
239
+ fp.set3DModel({ path: "${KIPRJMOD}/.kicad/3d/TestPart3D.wrl" });
240
+ const out = fp.serialize();
241
+ (0, vitest_1.expect)(out).toContain('(model "${KIPRJMOD}/.kicad/3d/TestPart3D.wrl"');
242
+ (0, vitest_1.expect)(out).toContain("(offset (xyz 0 0 0))");
243
+ (0, vitest_1.expect)(out).toContain("(scale (xyz 1 1 1))");
244
+ (0, vitest_1.expect)(out).toContain("(rotate (xyz 0 0 0))");
245
+ });
246
+ (0, vitest_1.it)("serializes (model ...) block with custom offset/scale/rotate", () => {
247
+ const fp = new KicadFootprint_1.KicadFootprint({ name: "TestCustom3D" });
248
+ fp.addPad({
249
+ number: "1", type: "smd", shape: "rect",
250
+ x: 0, y: 0, width: 1, height: 1,
251
+ });
252
+ fp.set3DModel({
253
+ path: "${KIPRJMOD}/.kicad/3d/TestCustom3D.wrl",
254
+ offset: { x: 1.5, y: 2.5, z: 0 },
255
+ scale: { x: 1, y: 1, z: 1 },
256
+ rotate: { x: 0, y: 0, z: 90 },
257
+ });
258
+ const out = fp.serialize();
259
+ (0, vitest_1.expect)(out).toContain("(offset (xyz 1.5 2.5 0))");
260
+ (0, vitest_1.expect)(out).toContain("(rotate (xyz 0 0 90))");
261
+ });
262
+ (0, vitest_1.it)("does not serialize model block when no 3D model is set", () => {
263
+ const fp = new KicadFootprint_1.KicadFootprint({ name: "NoModel" });
264
+ fp.addPad({
265
+ number: "1", type: "smd", shape: "rect",
266
+ x: 0, y: 0, width: 1, height: 1,
267
+ });
268
+ const out = fp.serialize();
269
+ (0, vitest_1.expect)(out).not.toContain("(model");
270
+ });
271
+ (0, vitest_1.it)("model block appears before embedded_fonts", () => {
272
+ const fp = new KicadFootprint_1.KicadFootprint({ name: "OrderCheck" });
273
+ fp.set3DModel({ path: "test.wrl" });
274
+ const out = fp.serialize();
275
+ const modelIdx = out.indexOf("(model");
276
+ const fontsIdx = out.indexOf("(embedded_fonts");
277
+ (0, vitest_1.expect)(modelIdx).toBeGreaterThan(-1);
278
+ (0, vitest_1.expect)(fontsIdx).toBeGreaterThan(-1);
279
+ (0, vitest_1.expect)(modelIdx).toBeLessThan(fontsIdx);
280
+ });
281
+ });
282
+ //# sourceMappingURL=3d-model.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"3d-model.test.js","sourceRoot":"","sources":["../../../src/tests/3d-model.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,80 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const vitest_1 = require("vitest");
4
+ const synth_1 = require("../synth");
5
+ const codegen_1 = require("../cli/codegen");
6
+ // ─── Helpers ─────────────────────────────────────────────────────────
7
+ function gen(name, components, nets) {
8
+ return (0, codegen_1.generatePython)({ name, components, nets });
9
+ }
10
+ (0, vitest_1.describe)("Python Code Generation", () => {
11
+ (0, vitest_1.it)("should generate basic component instantiation", () => {
12
+ const r1 = new synth_1.Component({
13
+ symbol: "Device:R",
14
+ ref: "R1",
15
+ footprint: "Resistor_SMD:R_0603_1608Metric",
16
+ });
17
+ const code = gen("Test", [r1], []);
18
+ (0, vitest_1.expect)(code).toContain('r1 = Component(symbol="Device:R", ref="R1", footprint="Resistor_SMD:R_0603_1608Metric")');
19
+ });
20
+ (0, vitest_1.it)("should generate nets and ties", () => {
21
+ const r1 = new synth_1.Component({
22
+ symbol: "Device:R",
23
+ ref: "R1",
24
+ footprint: "Resistor_SMD:R_0603_1608Metric",
25
+ });
26
+ const vcc = new synth_1.Net({ name: "VCC" });
27
+ vcc.tie(r1.pins[1]);
28
+ const code = gen("Test", [r1], [vcc]);
29
+ (0, vitest_1.expect)(code).toContain('net_vcc = Net("VCC")');
30
+ (0, vitest_1.expect)(code).toContain('r1[1] += net_vcc');
31
+ });
32
+ (0, vitest_1.it)("should handle multiple components and nets", () => {
33
+ const r1 = new synth_1.Component({
34
+ symbol: "Device:R",
35
+ ref: "R1",
36
+ footprint: "Resistor_SMD:R_0603_1608Metric",
37
+ });
38
+ const r2 = new synth_1.Component({
39
+ symbol: "Device:R",
40
+ ref: "R2",
41
+ footprint: "Resistor_SMD:R_0603_1608Metric",
42
+ });
43
+ const gnd = new synth_1.Net({ name: "GND" });
44
+ gnd.tie(r1.pins[2]);
45
+ gnd.tie(r2.pins[2]);
46
+ const code = gen("Test", [r1, r2], [gnd]);
47
+ (0, vitest_1.expect)(code).toContain('net_gnd = Net("GND")');
48
+ (0, vitest_1.expect)(code).toContain('r1[2] += net_gnd');
49
+ (0, vitest_1.expect)(code).toContain('r2[2] += net_gnd');
50
+ });
51
+ (0, vitest_1.it)("should include component properties like value and partNo", () => {
52
+ const r1 = new synth_1.Component({
53
+ symbol: "Device:R",
54
+ ref: "R1",
55
+ footprint: "Resistor_SMD:R_0603_1608Metric",
56
+ value: "10k",
57
+ partNo: "C123456",
58
+ });
59
+ const code = gen("Test", [r1], []);
60
+ (0, vitest_1.expect)(code).toContain('value="10k"');
61
+ (0, vitest_1.expect)(code).toContain('LCSC_Number="C123456"');
62
+ });
63
+ (0, vitest_1.it)("should handle pin mapping shorthand", () => {
64
+ const vcc = new synth_1.Net({ name: "VCC" });
65
+ const gnd = new synth_1.Net({ name: "GND" });
66
+ const timer = new synth_1.Component({
67
+ symbol: "Timer:NE555D",
68
+ ref: "U1",
69
+ footprint: "Package_DIP:DIP-8_W7.62mm",
70
+ pins: (pin) => ({
71
+ GND: pin(1),
72
+ OUT: pin(3),
73
+ }),
74
+ });
75
+ timer.pins.GND = gnd;
76
+ const code = gen("Test", [timer], [vcc, gnd]);
77
+ (0, vitest_1.expect)(code).toContain('u1[1] += net_gnd');
78
+ });
79
+ });
80
+ //# sourceMappingURL=codegen.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"codegen.test.js","sourceRoot":"","sources":["../../../src/tests/codegen.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,42 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const vitest_1 = require("vitest");
4
+ const DmxNode_1 = require("../../src/schematics/dmx_node/DmxNode");
5
+ const codegen_1 = require("../cli/codegen");
6
+ (0, vitest_1.describe)("DMX Node Migration Verification", () => {
7
+ (0, vitest_1.it)("should correctly instantiate DmxNode and register components", () => {
8
+ const project = new DmxNode_1.DmxNode();
9
+ const snapshot = project._generateWithCapture();
10
+ const components = snapshot.components;
11
+ // Check key components
12
+ (0, vitest_1.expect)(components.some(c => c.ref === "U1")).toBe(true); // ESP32
13
+ (0, vitest_1.expect)(components.some(c => c.ref === "U2")).toBe(true); // MAX3485 OUT
14
+ (0, vitest_1.expect)(components.some(c => c.ref === "U3")).toBe(true); // MAX3485 IN
15
+ (0, vitest_1.expect)(components.some(c => c.ref === "U4")).toBe(true); // Buck IC
16
+ (0, vitest_1.expect)(components.some(c => c.ref === "J_PWR1")).toBe(true); // USB Power
17
+ // Check mounting holes
18
+ (0, vitest_1.expect)(components.filter(c => c.ref.startsWith("H")).length).toBeGreaterThanOrEqual(4);
19
+ // Check nets
20
+ const nets = snapshot.nets;
21
+ (0, vitest_1.expect)(nets.some(n => n.name === "GND")).toBe(true);
22
+ (0, vitest_1.expect)(nets.some(n => n.name === "+5V")).toBe(true);
23
+ (0, vitest_1.expect)(nets.some(n => n.name === "+VIN")).toBe(true);
24
+ // Check specific connection: TX2 (L_08) to Max3485 OUT DI
25
+ const u1 = components.find(c => c.ref === "U1");
26
+ const u2 = components.find(c => c.ref === "U2");
27
+ const tx2Pin = u1.pins.L_08_TX2;
28
+ const diPin = u2.pins.DI;
29
+ (0, vitest_1.expect)(tx2Pin.net).toBeDefined();
30
+ (0, vitest_1.expect)(tx2Pin.net).toBe(diPin.net);
31
+ // Verify codegen has positions
32
+ const python = (0, codegen_1.generatePython)(snapshot);
33
+ (0, vitest_1.expect)(python).toContain('u1 = Component(');
34
+ (0, vitest_1.expect)(python).toContain('at=(50, 100, 0)');
35
+ (0, vitest_1.expect)(python).toContain('pcb_at=(18, 65, 0)');
36
+ (0, vitest_1.expect)(python).toContain('j_dc1 = Component(');
37
+ (0, vitest_1.expect)(python).toContain('pcb_at=(92, 85, 0)');
38
+ (0, vitest_1.expect)(python).toContain('j_pwr_in = Component(');
39
+ (0, vitest_1.expect)(python).toContain('pcb_at=(92, 85, 0)');
40
+ });
41
+ });
42
+ //# sourceMappingURL=dmx_node.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dmx_node.test.js","sourceRoot":"","sources":["../../../src/tests/dmx_node.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,100 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const vitest_1 = require("vitest");
4
+ const synth_1 = require("../synth");
5
+ const codegen_1 = require("../cli/codegen");
6
+ (0, vitest_1.describe)("DNC Component and Validation", () => {
7
+ (0, vitest_1.it)("allows connecting exactly one functional pin to a DNC component", () => {
8
+ class DncTest extends synth_1.Schematic {
9
+ constructor() { super({ name: "DncTest" }); }
10
+ generate() {
11
+ const dnc = new synth_1.DNC();
12
+ const r1 = new synth_1.Component({
13
+ symbol: "Device:R", ref: "R1",
14
+ footprint: "Resistor_SMD:R_0603_1608Metric",
15
+ });
16
+ const net = new synth_1.Net({ name: "TEST_NET" });
17
+ net.tie(dnc.pins[1]);
18
+ net.tie(r1.pins[1]);
19
+ }
20
+ }
21
+ new DncTest().generate();
22
+ });
23
+ (0, vitest_1.it)("throws when connecting two functional pins to a DNC net", () => {
24
+ class DncTest extends synth_1.Schematic {
25
+ constructor() { super({ name: "DncTest" }); }
26
+ generate() {
27
+ const dnc = new synth_1.DNC();
28
+ const r1 = new synth_1.Component({ symbol: "Device:R", ref: "R1", footprint: "Resistor_SMD:R_0603_1608Metric" });
29
+ const r2 = new synth_1.Component({ symbol: "Device:R", ref: "R2", footprint: "Resistor_SMD:R_0603_1608Metric" });
30
+ const net = new synth_1.Net({ name: "TEST_NET" });
31
+ net.tie(dnc.pins[1]);
32
+ net.tie(r1.pins[1]);
33
+ (0, vitest_1.expect)(() => net.tie(r2.pins[1])).toThrow(/already has a functional connection and is marked as DNC/);
34
+ }
35
+ }
36
+ new DncTest().generate();
37
+ });
38
+ (0, vitest_1.it)("marks a pin as NC by assigning null", () => {
39
+ class NullTest extends synth_1.Schematic {
40
+ constructor() { super({ name: "NullTest" }); }
41
+ generate() {
42
+ const r1 = new synth_1.Component({ symbol: "Device:R", ref: "R1", footprint: "Resistor_SMD:R_0603_1608Metric" });
43
+ r1.pins[1] = null;
44
+ }
45
+ }
46
+ const board = new NullTest();
47
+ const snapshot = board._generateWithCapture();
48
+ const python = (0, codegen_1.generatePython)(snapshot);
49
+ (0, vitest_1.expect)(python).toContain('r1[1] += Net("NC_R1_1")');
50
+ });
51
+ (0, vitest_1.it)("marks a pin as NC by assigning DNC directly", () => {
52
+ class DirectTest extends synth_1.Schematic {
53
+ constructor() { super({ name: "DirectTest" }); }
54
+ generate() {
55
+ const r1 = new synth_1.Component({ symbol: "Device:R", ref: "R1", footprint: "Resistor_SMD:R_0603_1608Metric" });
56
+ r1.pins[2] = new synth_1.DNC();
57
+ }
58
+ }
59
+ const board = new DirectTest();
60
+ const snapshot = board._generateWithCapture();
61
+ const python = (0, codegen_1.generatePython)(snapshot);
62
+ (0, vitest_1.expect)(python).toContain('r1[2] += Net("NC_R1_2")');
63
+ });
64
+ });
65
+ (0, vitest_1.describe)("TP (TestPoint) Component", () => {
66
+ (0, vitest_1.it)("assigns a test point directly to a pin", () => {
67
+ class TpTest extends synth_1.Schematic {
68
+ constructor() { super({ name: "TpTest" }); }
69
+ generate() {
70
+ const r1 = new synth_1.Component({ symbol: "Device:R", ref: "R1", footprint: "Resistor_SMD:R_0603_1608Metric" });
71
+ r1.pins[1] = new synth_1.TP({ ref: "TP1" });
72
+ }
73
+ }
74
+ const board = new TpTest();
75
+ const snapshot = board._generateWithCapture();
76
+ const python = (0, codegen_1.generatePython)(snapshot);
77
+ // TP should be a registered component and connected to R1's pin
78
+ (0, vitest_1.expect)(python).toContain('tp1 = Component(');
79
+ (0, vitest_1.expect)(python).toContain('symbol="Connector:TestPoint"');
80
+ });
81
+ (0, vitest_1.it)("connects TP pin to a shared net", () => {
82
+ class TpNetTest extends synth_1.Schematic {
83
+ constructor() { super({ name: "TpNetTest" }); }
84
+ generate() {
85
+ const r1 = new synth_1.Component({ symbol: "Device:R", ref: "R1", footprint: "Resistor_SMD:R_0603_1608Metric" });
86
+ const vcc = new synth_1.Net({ name: "VCC" });
87
+ vcc.tie(r1.pins[1]);
88
+ // Assign TP to R1 pin 1 — should also be on VCC net
89
+ r1.pins[1] = new synth_1.TP({ ref: "TP_VCC" });
90
+ }
91
+ }
92
+ const board = new TpNetTest();
93
+ const snapshot = board._generateWithCapture();
94
+ const python = (0, codegen_1.generatePython)(snapshot);
95
+ // Both R1 pin 1 and TP should be on VCC
96
+ (0, vitest_1.expect)(python).toContain('tp_vcc = Component(');
97
+ (0, vitest_1.expect)(python).toContain('tp_vcc[1] += net_vcc');
98
+ });
99
+ });
100
+ //# sourceMappingURL=dnc.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dnc.test.js","sourceRoot":"","sources":["../../../src/tests/dnc.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export {};