@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,301 @@
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
+ exports.cmdExport = cmdExport;
37
+ const path = __importStar(require("path"));
38
+ const fs = __importStar(require("fs"));
39
+ const child_process_1 = require("child_process");
40
+ const config_1 = require("../config");
41
+ const utils_1 = require("../utils");
42
+ const bom_1 = require("../utils/bom");
43
+ const cpl_1 = require("../utils/cpl");
44
+ /**
45
+ * export: Export manufacturing files (Gerber, Drill, BOM, CPL) for JLCPCB.
46
+ *
47
+ * Generates:
48
+ * - Gerber files (all copper, paste, silkscreen, mask layers + edge cuts)
49
+ * - Drill files (Excellon format)
50
+ * - Drill map files (Gerber X2 format)
51
+ * - BOM CSV (JLCPCB format with LCSC Part #)
52
+ * - CPL CSV (JLCPCB pick & place format)
53
+ *
54
+ * All files are zipped into a single archive.
55
+ */
56
+ async function cmdExport(args) {
57
+ const entry = args[0];
58
+ const schematicPath = await (0, utils_1.resolveSchematic)(entry);
59
+ const schematicDir = path.dirname(schematicPath);
60
+ const projectName = path.basename(schematicDir);
61
+ const { kicadCliPath } = (0, config_1.getConfig)();
62
+ console.log(`\nšŸ“¦ Exporting JLCPCB files: ${projectName}\n`);
63
+ // ── Step 0: Load the TypeScript schematic to get component registry ──
64
+ let components = [];
65
+ try {
66
+ const mod = require(schematicPath);
67
+ const schematic = mod.default;
68
+ if (!schematic || typeof schematic._generateWithCapture !== "function") {
69
+ (0, utils_1.die)(`${schematicPath} must default-export a Schematic instance.`);
70
+ }
71
+ console.log(` -> Loading circuit: ${schematic.name}...`);
72
+ const snapshot = schematic._generateWithCapture();
73
+ components = snapshot.components;
74
+ console.log(` -> Found ${components.length} components in circuit registry.`);
75
+ }
76
+ catch (err) {
77
+ console.warn(` āš ļø Failed to load schematic TS: ${err.message}`);
78
+ console.warn(` āš ļø BOM will fall back to parsing .kicad_sch if available.`);
79
+ }
80
+ // ── Step 1: Find the .kicad_pcb file ──
81
+ let pcbFile = path.join(schematicDir, `${projectName}.kicad_pcb`);
82
+ if (!fs.existsSync(pcbFile)) {
83
+ const files = fs
84
+ .readdirSync(schematicDir)
85
+ .filter((f) => f.endsWith(".kicad_pcb") && !f.startsWith("_autosave"));
86
+ if (files.length === 0) {
87
+ (0, utils_1.die)(`No .kicad_pcb file found in ${schematicDir}. Have you opened and saved it in KiCad?`);
88
+ }
89
+ pcbFile = path.join(schematicDir, files[0]);
90
+ }
91
+ console.log(` -> PCB file: ${path.basename(pcbFile)}`);
92
+ // ── Output directories ──
93
+ const outputBase = path.join(schematicDir, "jlcpcb");
94
+ const gerberDir = path.join(outputBase, "gerbers");
95
+ // Clean and recreate
96
+ if (fs.existsSync(outputBase)) {
97
+ fs.rmSync(outputBase, { recursive: true, force: true });
98
+ }
99
+ fs.mkdirSync(gerberDir, { recursive: true });
100
+ try {
101
+ // ══════════════════════════════════════════════
102
+ // 1. GERBER FILES
103
+ // ══════════════════════════════════════════════
104
+ // Layers: All copper, all paste, all silkscreen, all mask, edge cuts
105
+ // Options:
106
+ // - Check zone fills before plotting (handled by KiCad internally)
107
+ // - Tent vias (default behavior)
108
+ // - Use Protel filename extensions (default, --no-protel-ext omitted)
109
+ // - Subtract soldermask from silkscreen (--subtract-soldermask)
110
+ console.log(" -> Generating Gerber files...");
111
+ (0, child_process_1.execSync)([
112
+ `"${kicadCliPath}"`,
113
+ "pcb", "export", "gerbers",
114
+ `--output`, `"${gerberDir}/"`,
115
+ `--layers`, `"F.Cu,B.Cu,F.Paste,B.Paste,F.Silkscreen,B.Silkscreen,F.Mask,B.Mask,Edge.Cuts"`,
116
+ `--subtract-soldermask`,
117
+ `"${pcbFile}"`,
118
+ ].join(" "), { stdio: "pipe" });
119
+ console.log(" āœ“ Gerber files generated (Protel extensions, soldermask subtracted)");
120
+ // ══════════════════════════════════════════════
121
+ // 2. DRILL FILES
122
+ // ══════════════════════════════════════════════
123
+ // Options:
124
+ // - Format: Excellon
125
+ // - Oval Holes Drill Mode: alternate (--excellon-oval-format alternate)
126
+ // - Drill Origin: absolute (--drill-origin absolute)
127
+ // - Drill Units: mm (--excellon-units mm)
128
+ // - Zeros Format: decimal (--excellon-zeros-format decimal)
129
+ console.log(" -> Generating Drill files...");
130
+ (0, child_process_1.execSync)([
131
+ `"${kicadCliPath}"`,
132
+ "pcb", "export", "drill",
133
+ `--output`, `"${gerberDir}/"`,
134
+ `--format`, `excellon`,
135
+ `--drill-origin`, `absolute`,
136
+ `--excellon-units`, `mm`,
137
+ `--excellon-zeros-format`, `decimal`,
138
+ `--excellon-oval-format`, `alternate`,
139
+ `"${pcbFile}"`,
140
+ ].join(" "), { stdio: "pipe" });
141
+ console.log(" āœ“ Drill files generated (absolute origin, mm, decimal zeros, alternate oval)");
142
+ // ══════════════════════════════════════════════
143
+ // 3. DRILL MAP FILES
144
+ // ══════════════════════════════════════════════
145
+ // Generate drill map in Gerber X2 format
146
+ console.log(" -> Generating Drill Map files...");
147
+ (0, child_process_1.execSync)([
148
+ `"${kicadCliPath}"`,
149
+ "pcb", "export", "drill",
150
+ `--output`, `"${gerberDir}/"`,
151
+ `--format`, `excellon`,
152
+ `--drill-origin`, `absolute`,
153
+ `--excellon-units`, `mm`,
154
+ `--excellon-zeros-format`, `decimal`,
155
+ `--excellon-oval-format`, `alternate`,
156
+ `--generate-map`,
157
+ `--map-format`, `gerberx2`,
158
+ `"${pcbFile}"`,
159
+ ].join(" "), { stdio: "pipe" });
160
+ console.log(" āœ“ Drill map generated (Gerber X2 format)");
161
+ // ══════════════════════════════════════════════
162
+ // 4. CPL FILE (Component Placement List)
163
+ // ══════════════════════════════════════════════
164
+ // KiCad generates ASCII pos → we convert to JLCPCB CSV format
165
+ console.log(" -> Generating CPL (Pick & Place) file...");
166
+ // First export in ASCII format (which we can parse reliably)
167
+ const rawPosFile = path.join(outputBase, `_raw_pos_${projectName}.txt`);
168
+ (0, child_process_1.execSync)([
169
+ `"${kicadCliPath}"`,
170
+ "pcb", "export", "pos",
171
+ `--output`, `"${rawPosFile}"`,
172
+ `--format`, `ascii`,
173
+ `--units`, `mm`,
174
+ `--side`, `both`,
175
+ `--exclude-dnp`,
176
+ `"${pcbFile}"`,
177
+ ].join(" "), { stdio: "pipe" });
178
+ // Convert KiCad pos output → JLCPCB CPL format
179
+ const cplFile = path.join(outputBase, `CPL-${projectName}.csv`);
180
+ (0, cpl_1.convertPosToCpl)(rawPosFile, cplFile);
181
+ // Clean up raw file
182
+ fs.unlinkSync(rawPosFile);
183
+ console.log(" āœ“ CPL file generated (JLCPCB format)");
184
+ // ══════════════════════════════════════════════
185
+ // 5. BOM FILE
186
+ // ══════════════════════════════════════════════
187
+ let bomFile = null;
188
+ if (components.length > 0) {
189
+ // Generate BOM from our TypeScript circuit registry
190
+ bomFile = (0, bom_1.generateBom)(projectName, outputBase, components);
191
+ }
192
+ else {
193
+ console.warn(" āš ļø No components loaded from TS circuit. Skipping BOM generation.");
194
+ }
195
+ // ══════════════════════════════════════════════
196
+ // 6. 3D RENDERS
197
+ // ══════════════════════════════════════════════
198
+ console.log(" -> Generating 3D renders...");
199
+ const renderDir = path.join(outputBase, "renders");
200
+ fs.mkdirSync(renderDir, { recursive: true });
201
+ const topRender = path.join(renderDir, `${projectName}-top.png`);
202
+ const bottomRender = path.join(renderDir, `${projectName}-bottom.png`);
203
+ try {
204
+ (0, child_process_1.execSync)([
205
+ `"${kicadCliPath}"`,
206
+ "pcb",
207
+ "render",
208
+ "--output",
209
+ `"${topRender}"`,
210
+ "--side",
211
+ "top",
212
+ "--width",
213
+ "2048",
214
+ "--height",
215
+ "1536",
216
+ "--quality",
217
+ "high",
218
+ `"${pcbFile}"`,
219
+ ].join(" "), { stdio: "pipe" });
220
+ (0, child_process_1.execSync)([
221
+ `"${kicadCliPath}"`,
222
+ "pcb",
223
+ "render",
224
+ "--output",
225
+ `"${bottomRender}"`,
226
+ "--side",
227
+ "bottom",
228
+ "--width",
229
+ "2048",
230
+ "--height",
231
+ "1536",
232
+ "--quality",
233
+ "high",
234
+ `"${pcbFile}"`,
235
+ ].join(" "), { stdio: "pipe" });
236
+ const angledRender = path.join(renderDir, `${projectName}-angled.png`);
237
+ (0, child_process_1.execSync)([
238
+ `"${kicadCliPath}"`,
239
+ "pcb",
240
+ "render",
241
+ "--output",
242
+ `"${angledRender}"`,
243
+ "--rotate",
244
+ "315,0,45",
245
+ "--width",
246
+ "2048",
247
+ "--height",
248
+ "1536",
249
+ "--quality",
250
+ "high",
251
+ `"${pcbFile}"`,
252
+ ].join(" "), { stdio: "pipe" });
253
+ console.log(" āœ“ 3D renders generated (top, bottom, angled)");
254
+ }
255
+ catch (err) {
256
+ console.warn(` āš ļø 3D rendering failed: ${err.message}`);
257
+ }
258
+ // ══════════════════════════════════════════════
259
+ // 7. ZIP ARCHIVE
260
+ // ══════════════════════════════════════════════
261
+ const zipFile = path.join(schematicDir, `JLCPCB-${projectName}.zip`);
262
+ if (fs.existsSync(zipFile)) {
263
+ fs.unlinkSync(zipFile);
264
+ }
265
+ console.log(` -> Creating ZIP archive: ${path.basename(zipFile)}`);
266
+ // Collect all files to zip
267
+ const filesToZip = [];
268
+ // Add gerber + drill files
269
+ const gerberFiles = fs.readdirSync(gerberDir).map((f) => path.join(gerberDir, f));
270
+ filesToZip.push(...gerberFiles);
271
+ // Add CPL
272
+ if (fs.existsSync(cplFile)) {
273
+ filesToZip.push(cplFile);
274
+ }
275
+ // Add BOM
276
+ if (bomFile && fs.existsSync(bomFile)) {
277
+ filesToZip.push(bomFile);
278
+ }
279
+ // Use system zip with -j (junk paths = flat archive)
280
+ const fileArgs = filesToZip.map((f) => `"${f}"`).join(" ");
281
+ (0, child_process_1.execSync)(`zip -j "${zipFile}" ${fileArgs}`, { stdio: "pipe" });
282
+ // ══════════════════════════════════════════════
283
+ // Summary
284
+ // ══════════════════════════════════════════════
285
+ const gerberCount = fs.readdirSync(gerberDir).length;
286
+ console.log(`\nāœ… JLCPCB export successful!`);
287
+ console.log(` šŸ“‚ ZIP archive: ${zipFile}`);
288
+ console.log(` šŸ“‚ Manufacturing files: ${outputBase}`);
289
+ console.log(` • ${gerberCount} Gerber/Drill files`);
290
+ if (bomFile)
291
+ console.log(` • BOM: ${path.basename(bomFile)}`);
292
+ console.log(` • CPL: ${path.basename(cplFile)}`);
293
+ if (fs.existsSync(topRender)) {
294
+ console.log(` • Renders: ${path.basename(topRender)}, ${path.basename(bottomRender)}, ${path.basename(path.join(renderDir, `${projectName}-angled.png`))}`);
295
+ }
296
+ }
297
+ catch (err) {
298
+ (0, utils_1.die)(`Export failed: ${err.message}`);
299
+ }
300
+ }
301
+ //# sourceMappingURL=export.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"export.js","sourceRoot":"","sources":["../../../../src/cli/commands/export.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * lib: Generate / update the KiCad library from TypeScript definitions.
3
+ *
4
+ * Usage:
5
+ * npm run lib
6
+ *
7
+ * Automatically scans src/module for all modules and generates symbols/footprints.
8
+ * Also generates 3D models when make3DModel() is implemented.
9
+ */
10
+ export declare function cmdLib(args: string[]): Promise<void>;
@@ -0,0 +1,158 @@
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
+ exports.cmdLib = cmdLib;
37
+ const path = __importStar(require("path"));
38
+ const fs = __importStar(require("fs"));
39
+ const config_1 = require("../config");
40
+ const utils_1 = require("../utils");
41
+ const validate_1 = require("./validate");
42
+ /**
43
+ * lib: Generate / update the KiCad library from TypeScript definitions.
44
+ *
45
+ * Usage:
46
+ * npm run lib
47
+ *
48
+ * Automatically scans src/module for all modules and generates symbols/footprints.
49
+ * Also generates 3D models when make3DModel() is implemented.
50
+ */
51
+ async function cmdLib(args) {
52
+ console.log(`\nšŸ“š KiCad Library Generator`);
53
+ const { projectRoot, sourceRoot } = (0, config_1.getConfig)();
54
+ const LIB_DIR = path.join(projectRoot, ".kicad");
55
+ const SYMBOLS_FILE = path.join(LIB_DIR, "Project_Symbols.kicad_sym");
56
+ const FOOTPRINTS_DIR = path.join(LIB_DIR, "Project_Footprints.pretty");
57
+ const MODELS_3D_DIR = path.join(LIB_DIR, "3d");
58
+ const MODULES_DIR = path.join(sourceRoot, "module");
59
+ const { KicadLibrary } = require("../../synth/KicadLibrary");
60
+ const mergedLib = new KicadLibrary();
61
+ if (!fs.existsSync(MODULES_DIR)) {
62
+ (0, utils_1.die)(`Modules directory not found: ${MODULES_DIR}`);
63
+ }
64
+ const files = fs.readdirSync(MODULES_DIR)
65
+ .filter(file => file.endsWith(".ts") && !file.endsWith(".test.ts") && file !== "index.ts");
66
+ if (files.length === 0) {
67
+ console.log(" āš ļø No modules found in src/module.");
68
+ return;
69
+ }
70
+ // Track footprints by class name so we can attach 3D models
71
+ const footprintsByClass = new Map();
72
+ const classesWithMake3D = [];
73
+ for (const file of files) {
74
+ const className = path.basename(file, ".ts");
75
+ const modulePath = path.join(MODULES_DIR, file);
76
+ console.log(` → Processing: ${className} (${file})`);
77
+ try {
78
+ // Clear cache to ensure we get fresh definitions
79
+ delete require.cache[require.resolve(modulePath)];
80
+ const mod = require(modulePath);
81
+ const Class = mod[className];
82
+ if (!Class) {
83
+ console.warn(` āš ļø Warning: Could not find named export "${className}" in ${file}`);
84
+ continue;
85
+ }
86
+ if (typeof Class.makeFootprint === "function") {
87
+ const fp = Class.makeFootprint();
88
+ mergedLib.addFootprint(fp);
89
+ footprintsByClass.set(className, fp);
90
+ }
91
+ else {
92
+ console.warn(` āš ļø Warning: ${className} has no static makeFootprint() method.`);
93
+ }
94
+ if (typeof Class.makeSymbol === "function") {
95
+ mergedLib.addSymbol(Class.makeSymbol());
96
+ }
97
+ else {
98
+ console.warn(` āš ļø Warning: ${className} has no static makeSymbol() method.`);
99
+ }
100
+ // Check for 3D model support
101
+ if (typeof Class.make3DModel === "function") {
102
+ classesWithMake3D.push({ className, Class });
103
+ }
104
+ }
105
+ catch (err) {
106
+ console.error(` āŒ Error processing module ${className}: ${err.message}`);
107
+ }
108
+ }
109
+ const symbolCount = mergedLib.symbols.length;
110
+ const footprintCount = mergedLib.footprints.length;
111
+ if (symbolCount === 0 && footprintCount === 0) {
112
+ console.log("\n āš ļø No symbols or footprints were successfully generated.");
113
+ return;
114
+ }
115
+ // Generate 3D models
116
+ if (classesWithMake3D.length > 0) {
117
+ console.log(`\n🧊 Generating 3D models...`);
118
+ for (const { className, Class } of classesWithMake3D) {
119
+ try {
120
+ const modelResult = Class.make3DModel();
121
+ const model = modelResult && typeof modelResult.then === "function"
122
+ ? await modelResult
123
+ : modelResult;
124
+ if (model) {
125
+ const result = await model.export({
126
+ outDir: MODELS_3D_DIR,
127
+ baseName: className,
128
+ formats: ["wrl"],
129
+ });
130
+ if (result.wrlPath) {
131
+ // Link the 3D model into the footprint
132
+ const fp = footprintsByClass.get(className);
133
+ if (fp && typeof fp.set3DModel === "function") {
134
+ fp.set3DModel({ path: result.wrlPath });
135
+ }
136
+ console.log(` āœ… 3D Model → .kicad/3d/${className}.wrl`);
137
+ }
138
+ }
139
+ }
140
+ catch (err) {
141
+ console.error(` āŒ Error generating 3D model for ${className}: ${err?.message ?? err}`);
142
+ if (err?.stack)
143
+ console.error(err.stack);
144
+ }
145
+ }
146
+ }
147
+ console.log(`\nšŸ“¦ Writing library: ${symbolCount} symbol(s), ${footprintCount} footprint(s)\n`);
148
+ if (symbolCount > 0) {
149
+ mergedLib.writeSymbols(SYMBOLS_FILE);
150
+ console.log(` āœ… Symbols → ${path.relative(projectRoot, SYMBOLS_FILE)}`);
151
+ }
152
+ if (footprintCount > 0) {
153
+ const paths = mergedLib.writeFootprints(FOOTPRINTS_DIR);
154
+ console.log(` āœ… Footprints → ${path.relative(projectRoot, FOOTPRINTS_DIR)}/`);
155
+ }
156
+ await (0, validate_1.cmdValidate)(args);
157
+ }
158
+ //# sourceMappingURL=lib.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lib.js","sourceRoot":"","sources":["../../../../src/cli/commands/lib.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ /**
2
+ * parts: Search JLC Parts for components
3
+ */
4
+ export declare function cmdParts(args: string[]): Promise<void>;
@@ -0,0 +1,104 @@
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
+ exports.cmdParts = cmdParts;
37
+ const path = __importStar(require("path"));
38
+ const readline = __importStar(require("readline"));
39
+ const child_process_1 = require("child_process");
40
+ const config_1 = require("../config");
41
+ const utils_1 = require("../utils");
42
+ /**
43
+ * parts: Search JLC Parts for components
44
+ */
45
+ async function cmdParts(args) {
46
+ const { projectRoot, pythonPath, scriptsDir } = (0, config_1.getConfig)();
47
+ let footprint;
48
+ let value;
49
+ // Parse --footprint and --value flags
50
+ for (let i = 0; i < args.length; i++) {
51
+ if (args[i] === "--footprint" && args[i + 1]) {
52
+ footprint = args[++i];
53
+ }
54
+ else if (args[i] === "--value" && args[i + 1]) {
55
+ value = args[++i];
56
+ }
57
+ }
58
+ if (footprint || value) {
59
+ // Direct search mode
60
+ console.log(`\nšŸ” Searching JLC Parts...`);
61
+ if (footprint)
62
+ console.log(` Footprint: ${footprint}`);
63
+ if (value)
64
+ console.log(` Value: ${value}`);
65
+ console.log();
66
+ // Delegate to existing search script
67
+ const searchArgs = [footprint, value].filter(Boolean).join(" ");
68
+ try {
69
+ (0, child_process_1.execSync)(`${pythonPath} ${path.join(scriptsDir, "search_lib.py")} --jlc "${searchArgs}"`, {
70
+ cwd: projectRoot,
71
+ stdio: "inherit",
72
+ });
73
+ }
74
+ catch {
75
+ (0, utils_1.die)("Parts search failed.");
76
+ }
77
+ }
78
+ else {
79
+ // Interactive TUI mode
80
+ console.log("\nšŸ” JLC Parts Search (Interactive)\n" + "─".repeat(40));
81
+ const rl = readline.createInterface({ input: process.stdin, output: process.stdout });
82
+ const askAndSearch = async () => {
83
+ return new Promise((resolve) => {
84
+ rl.question("Search query (or 'q' to quit): ", async (query) => {
85
+ if (query.trim().toLowerCase() === "q") {
86
+ rl.close();
87
+ resolve();
88
+ return;
89
+ }
90
+ try {
91
+ (0, child_process_1.execSync)(`${pythonPath} ${path.join(scriptsDir, "search_lib.py")} --jlc "${query.trim()}"`, { cwd: projectRoot, stdio: "inherit" });
92
+ }
93
+ catch {
94
+ console.log(" (search returned no results or errored)");
95
+ }
96
+ console.log();
97
+ resolve(askAndSearch());
98
+ });
99
+ });
100
+ };
101
+ await askAndSearch();
102
+ }
103
+ }
104
+ //# sourceMappingURL=parts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parts.js","sourceRoot":"","sources":["../../../../src/cli/commands/parts.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ /**
2
+ * Commands to automate configuration of the project's environment.
3
+ */
4
+ export declare function cmdSetup(args: string[]): Promise<void>;