@tobisk/pcbs 1.0.0 → 1.1.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.
- package/dist/src/cli/cli.js +0 -0
- package/package.json +4 -3
- package/dist/src/tests/dmx_node.test.d.ts +0 -1
- package/dist/src/tests/dmx_node.test.js +0 -42
- package/dist/src/tests/dmx_node.test.js.map +0 -1
- package/dist/src/tests/migration.test.d.ts +0 -1
- package/dist/src/tests/migration.test.js +0 -58
- package/dist/src/tests/migration.test.js.map +0 -1
- package/dist/src/types/kicad-library.d.ts +0 -6
- package/dist/src/types/kicad-library.js +0 -7
- package/dist/src/types/kicad-library.js.map +0 -1
- package/dist/src/types/kicad-library.ts +0 -61770
package/dist/src/cli/cli.js
CHANGED
|
File without changes
|
package/package.json
CHANGED
|
@@ -1,13 +1,14 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@tobisk/pcbs",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.1.0",
|
|
4
4
|
"description": "TypeScript-based PCB Design Framework",
|
|
5
5
|
"publishConfig": {
|
|
6
|
-
"access": "public"
|
|
6
|
+
"access": "public",
|
|
7
|
+
"provenance": true
|
|
7
8
|
},
|
|
8
9
|
"repository": {
|
|
9
10
|
"type": "git",
|
|
10
|
-
"url": "https://github.com/kellertobias/pcbs-framework.git"
|
|
11
|
+
"url": "git+https://github.com/kellertobias/pcbs-framework.git"
|
|
11
12
|
},
|
|
12
13
|
"main": "./dist/src/synth/index.js",
|
|
13
14
|
"types": "./dist/src/synth/index.d.ts",
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|
|
@@ -1,42 +0,0 @@
|
|
|
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
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"dmx_node.test.js","sourceRoot":"","sources":["../../../src/tests/dmx_node.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|
|
@@ -1,58 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
const vitest_1 = require("vitest");
|
|
4
|
-
const Max3485_1 = require("../../src/lib/Max3485");
|
|
5
|
-
const BuckConverter_1 = require("../../src/lib/BuckConverter");
|
|
6
|
-
const Registry_1 = require("../synth/Registry");
|
|
7
|
-
(0, vitest_1.describe)("Component Migration Verification", () => {
|
|
8
|
-
(0, vitest_1.it)("should correctly instantiate Max3485", () => {
|
|
9
|
-
Registry_1.registry.start();
|
|
10
|
-
const transceiver = new Max3485_1.Max3485({ ref: "U1" });
|
|
11
|
-
(0, vitest_1.expect)(transceiver.ref).toBe("U1");
|
|
12
|
-
(0, vitest_1.expect)(transceiver.symbol).toBe("Interface_UART:MAX3485");
|
|
13
|
-
(0, vitest_1.expect)(transceiver.footprint).toBe("Package_SO:SOIC-8_3.9x4.9mm_P1.27mm");
|
|
14
|
-
(0, vitest_1.expect)(transceiver.partNo).toBe("C18148");
|
|
15
|
-
// Check pins
|
|
16
|
-
(0, vitest_1.expect)(transceiver.pins.RO.name).toBe("1");
|
|
17
|
-
(0, vitest_1.expect)(transceiver.pins.VCC.name).toBe("8");
|
|
18
|
-
(0, vitest_1.expect)(transceiver.pins.GND.name).toBe("5");
|
|
19
|
-
});
|
|
20
|
-
(0, vitest_1.it)("should correctly instantiate BuckConverter with 5V target", () => {
|
|
21
|
-
Registry_1.registry.start();
|
|
22
|
-
const buck = new BuckConverter_1.BuckConverter({ ref: "U2", targetVoltage: 5.0 });
|
|
23
|
-
(0, vitest_1.expect)(buck.ref).toBe("U2");
|
|
24
|
-
// Internal components check
|
|
25
|
-
const vinPin = buck.pins.VIN;
|
|
26
|
-
const vinNet = vinPin.net;
|
|
27
|
-
(0, vitest_1.expect)(vinNet).toBeDefined();
|
|
28
|
-
(0, vitest_1.expect)(vinNet?.name).toBe("U2_VIN");
|
|
29
|
-
// Check feedback resistors for 5V
|
|
30
|
-
// R1 = 3000, R2 = 1000
|
|
31
|
-
const components = Array.from(Registry_1.registry.getComponents());
|
|
32
|
-
const r1 = components.find(c => c.ref === "R_FB1_U2");
|
|
33
|
-
const r2 = components.find(c => c.ref === "R_FB2_U2");
|
|
34
|
-
(0, vitest_1.expect)(r1?.value).toBe("3k");
|
|
35
|
-
(0, vitest_1.expect)(r1?.partNo).toBe("C22965");
|
|
36
|
-
(0, vitest_1.expect)(r2?.value).toBe("1k");
|
|
37
|
-
(0, vitest_1.expect)(r2?.partNo).toBe("C21190");
|
|
38
|
-
});
|
|
39
|
-
(0, vitest_1.it)("should correctly instantiate BuckConverter with 12V target", () => {
|
|
40
|
-
Registry_1.registry.start();
|
|
41
|
-
new BuckConverter_1.BuckConverter({ ref: "U3", targetVoltage: 12.0 });
|
|
42
|
-
const components = Array.from(Registry_1.registry.getComponents());
|
|
43
|
-
const r1 = components.find(c => c.ref === "R_FB1_U3");
|
|
44
|
-
const r2 = components.find(c => c.ref === "R_FB2_U3");
|
|
45
|
-
(0, vitest_1.expect)(r1?.value).toBe("13k");
|
|
46
|
-
(0, vitest_1.expect)(r1?.partNo).toBe("C24857");
|
|
47
|
-
(0, vitest_1.expect)(r2?.value).toBe("1.50k");
|
|
48
|
-
(0, vitest_1.expect)(r2?.partNo).toBe("C22843");
|
|
49
|
-
});
|
|
50
|
-
(0, vitest_1.it)("should work with test points in BuckConverter", () => {
|
|
51
|
-
Registry_1.registry.start();
|
|
52
|
-
new BuckConverter_1.BuckConverter({ ref: "U4", addTestPoints: true });
|
|
53
|
-
const components = Array.from(Registry_1.registry.getComponents());
|
|
54
|
-
(0, vitest_1.expect)(components.some(c => c.ref === "TP_VOUT_U4")).toBe(true);
|
|
55
|
-
(0, vitest_1.expect)(components.some(c => c.ref === "TP_FB_U4")).toBe(true);
|
|
56
|
-
});
|
|
57
|
-
});
|
|
58
|
-
//# sourceMappingURL=migration.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"migration.test.js","sourceRoot":"","sources":["../../../src/tests/migration.test.ts"],"names":[],"mappings":"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"}
|