@jlcpcb/core 0.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.
Files changed (44) hide show
  1. package/CHANGELOG.md +10 -0
  2. package/README.md +474 -0
  3. package/package.json +48 -0
  4. package/src/api/easyeda-community.ts +259 -0
  5. package/src/api/easyeda.ts +153 -0
  6. package/src/api/index.ts +7 -0
  7. package/src/api/jlc.ts +185 -0
  8. package/src/constants/design-rules.ts +119 -0
  9. package/src/constants/footprints.ts +68 -0
  10. package/src/constants/index.ts +7 -0
  11. package/src/constants/kicad.ts +147 -0
  12. package/src/converter/category-router.ts +638 -0
  13. package/src/converter/footprint-mapper.ts +236 -0
  14. package/src/converter/footprint.ts +949 -0
  15. package/src/converter/global-lib-table.ts +394 -0
  16. package/src/converter/index.ts +46 -0
  17. package/src/converter/lib-table.ts +181 -0
  18. package/src/converter/svg-arc.ts +179 -0
  19. package/src/converter/symbol-templates.ts +214 -0
  20. package/src/converter/symbol.ts +1682 -0
  21. package/src/converter/value-normalizer.ts +262 -0
  22. package/src/index.ts +25 -0
  23. package/src/parsers/easyeda-shapes.ts +628 -0
  24. package/src/parsers/http-client.ts +96 -0
  25. package/src/parsers/index.ts +38 -0
  26. package/src/parsers/utils.ts +29 -0
  27. package/src/services/component-service.ts +100 -0
  28. package/src/services/fix-service.ts +50 -0
  29. package/src/services/index.ts +9 -0
  30. package/src/services/library-service.ts +696 -0
  31. package/src/types/component.ts +61 -0
  32. package/src/types/easyeda-community.ts +78 -0
  33. package/src/types/easyeda.ts +356 -0
  34. package/src/types/index.ts +12 -0
  35. package/src/types/jlc.ts +84 -0
  36. package/src/types/kicad.ts +136 -0
  37. package/src/types/mcp.ts +77 -0
  38. package/src/types/project.ts +60 -0
  39. package/src/utils/conversion.ts +104 -0
  40. package/src/utils/file-system.ts +143 -0
  41. package/src/utils/index.ts +8 -0
  42. package/src/utils/logger.ts +96 -0
  43. package/src/utils/validation.ts +110 -0
  44. package/tsconfig.json +9 -0
@@ -0,0 +1,119 @@
1
+ /**
2
+ * Default design rules for common PCB manufacturers
3
+ */
4
+
5
+ export interface DesignRules {
6
+ name: string;
7
+ minTraceWidth: number; // mm
8
+ minTraceClearance: number; // mm
9
+ minViaDrill: number; // mm
10
+ minViaPad: number; // mm
11
+ minHoleDrill: number; // mm
12
+ minAnnularRing: number; // mm
13
+ minSilkscreenWidth: number; // mm
14
+ minSilkscreenClearance: number; // mm
15
+ }
16
+
17
+ // JLCPCB standard capabilities
18
+ export const JLCPCB_STANDARD: DesignRules = {
19
+ name: 'JLCPCB Standard',
20
+ minTraceWidth: 0.127, // 5 mil
21
+ minTraceClearance: 0.127, // 5 mil
22
+ minViaDrill: 0.3,
23
+ minViaPad: 0.6,
24
+ minHoleDrill: 0.3,
25
+ minAnnularRing: 0.13,
26
+ minSilkscreenWidth: 0.15,
27
+ minSilkscreenClearance: 0.15,
28
+ };
29
+
30
+ // JLCPCB advanced capabilities (extra cost)
31
+ export const JLCPCB_ADVANCED: DesignRules = {
32
+ name: 'JLCPCB Advanced',
33
+ minTraceWidth: 0.09, // 3.5 mil
34
+ minTraceClearance: 0.09, // 3.5 mil
35
+ minViaDrill: 0.15,
36
+ minViaPad: 0.4,
37
+ minHoleDrill: 0.15,
38
+ minAnnularRing: 0.075,
39
+ minSilkscreenWidth: 0.1,
40
+ minSilkscreenClearance: 0.1,
41
+ };
42
+
43
+ // PCBWay standard capabilities
44
+ export const PCBWAY_STANDARD: DesignRules = {
45
+ name: 'PCBWay Standard',
46
+ minTraceWidth: 0.127, // 5 mil
47
+ minTraceClearance: 0.127, // 5 mil
48
+ minViaDrill: 0.3,
49
+ minViaPad: 0.6,
50
+ minHoleDrill: 0.3,
51
+ minAnnularRing: 0.15,
52
+ minSilkscreenWidth: 0.15,
53
+ minSilkscreenClearance: 0.15,
54
+ };
55
+
56
+ // OSH Park standard capabilities
57
+ export const OSHPARK_STANDARD: DesignRules = {
58
+ name: 'OSH Park',
59
+ minTraceWidth: 0.152, // 6 mil
60
+ minTraceClearance: 0.152, // 6 mil
61
+ minViaDrill: 0.254, // 10 mil
62
+ minViaPad: 0.508,
63
+ minHoleDrill: 0.254,
64
+ minAnnularRing: 0.127,
65
+ minSilkscreenWidth: 0.15,
66
+ minSilkscreenClearance: 0.15,
67
+ };
68
+
69
+ // Conservative rules for hobby/hand soldering
70
+ export const HOBBY_RULES: DesignRules = {
71
+ name: 'Hobby/Hand Solder',
72
+ minTraceWidth: 0.3, // 12 mil
73
+ minTraceClearance: 0.3, // 12 mil
74
+ minViaDrill: 0.4,
75
+ minViaPad: 0.8,
76
+ minHoleDrill: 0.4,
77
+ minAnnularRing: 0.2,
78
+ minSilkscreenWidth: 0.2,
79
+ minSilkscreenClearance: 0.2,
80
+ };
81
+
82
+ // Standard trace widths for different current levels (1oz copper, 10C rise)
83
+ export const TRACE_WIDTH_CURRENT: Record<string, number> = {
84
+ '0.5A': 0.2,
85
+ '1A': 0.5,
86
+ '2A': 1.0,
87
+ '3A': 1.5,
88
+ '5A': 2.5,
89
+ '10A': 5.0,
90
+ };
91
+
92
+ // Default layer stackups
93
+ export const LAYER_STACKUPS = {
94
+ '2-layer': {
95
+ layers: ['F.Cu', 'B.Cu'],
96
+ copperThickness: 0.035, // 1oz = 35um
97
+ boardThickness: 1.6, // mm
98
+ },
99
+ '4-layer': {
100
+ layers: ['F.Cu', 'In1.Cu', 'In2.Cu', 'B.Cu'],
101
+ copperThickness: 0.035,
102
+ boardThickness: 1.6,
103
+ },
104
+ } as const;
105
+
106
+ export function getDesignRulesForManufacturer(manufacturer: string): DesignRules {
107
+ switch (manufacturer.toLowerCase()) {
108
+ case 'jlcpcb':
109
+ return JLCPCB_STANDARD;
110
+ case 'jlcpcb-advanced':
111
+ return JLCPCB_ADVANCED;
112
+ case 'pcbway':
113
+ return PCBWAY_STANDARD;
114
+ case 'oshpark':
115
+ return OSHPARK_STANDARD;
116
+ default:
117
+ return HOBBY_RULES;
118
+ }
119
+ }
@@ -0,0 +1,68 @@
1
+ /**
2
+ * Standard footprint patterns and dimensions
3
+ */
4
+
5
+ // Common SMD resistor/capacitor sizes (metric)
6
+ export const SMD_PACKAGE_SIZES: Record<string, { length: number; width: number }> = {
7
+ '0201': { length: 0.6, width: 0.3 },
8
+ '0402': { length: 1.0, width: 0.5 },
9
+ '0603': { length: 1.6, width: 0.8 },
10
+ '0805': { length: 2.0, width: 1.25 },
11
+ '1206': { length: 3.2, width: 1.6 },
12
+ '1210': { length: 3.2, width: 2.5 },
13
+ '1812': { length: 4.5, width: 3.2 },
14
+ '2010': { length: 5.0, width: 2.5 },
15
+ '2512': { length: 6.3, width: 3.2 },
16
+ };
17
+
18
+ // Common IC package patterns
19
+ export const IC_PACKAGE_PATTERNS = {
20
+ // SOIC packages
21
+ SOIC8: { pins: 8, pitch: 1.27, width: 3.9 },
22
+ SOIC14: { pins: 14, pitch: 1.27, width: 3.9 },
23
+ SOIC16: { pins: 16, pitch: 1.27, width: 3.9 },
24
+
25
+ // TSSOP packages
26
+ TSSOP8: { pins: 8, pitch: 0.65, width: 3.0 },
27
+ TSSOP14: { pins: 14, pitch: 0.65, width: 4.4 },
28
+ TSSOP16: { pins: 16, pitch: 0.65, width: 4.4 },
29
+ TSSOP20: { pins: 20, pitch: 0.65, width: 4.4 },
30
+
31
+ // QFP packages
32
+ LQFP32: { pins: 32, pitch: 0.8, size: 7.0 },
33
+ LQFP48: { pins: 48, pitch: 0.5, size: 7.0 },
34
+ LQFP64: { pins: 64, pitch: 0.5, size: 10.0 },
35
+ LQFP100: { pins: 100, pitch: 0.5, size: 14.0 },
36
+ LQFP144: { pins: 144, pitch: 0.5, size: 20.0 },
37
+
38
+ // QFN packages
39
+ QFN16: { pins: 16, pitch: 0.5, size: 3.0 },
40
+ QFN20: { pins: 20, pitch: 0.5, size: 4.0 },
41
+ QFN24: { pins: 24, pitch: 0.5, size: 4.0 },
42
+ QFN32: { pins: 32, pitch: 0.5, size: 5.0 },
43
+ QFN48: { pins: 48, pitch: 0.5, size: 7.0 },
44
+
45
+ // BGA packages
46
+ BGA100: { pins: 100, pitch: 0.8 },
47
+ BGA144: { pins: 144, pitch: 0.8 },
48
+ BGA256: { pins: 256, pitch: 0.8 },
49
+ } as const;
50
+
51
+ // Standard connector pitches
52
+ export const CONNECTOR_PITCHES = {
53
+ STANDARD_2_54MM: 2.54, // 100 mil
54
+ STANDARD_2MM: 2.0,
55
+ FINE_1_27MM: 1.27, // 50 mil
56
+ FINE_1MM: 1.0,
57
+ USB_C: 0.5,
58
+ FPC_0_5MM: 0.5,
59
+ FPC_1MM: 1.0,
60
+ } as const;
61
+
62
+ // Mounting hole sizes (M2, M2.5, M3, M4)
63
+ export const MOUNTING_HOLES = {
64
+ M2: { drill: 2.2, pad: 4.0 },
65
+ M2_5: { drill: 2.7, pad: 5.0 },
66
+ M3: { drill: 3.2, pad: 6.0 },
67
+ M4: { drill: 4.3, pad: 8.0 },
68
+ } as const;
@@ -0,0 +1,7 @@
1
+ /**
2
+ * ai-eda-common constants
3
+ */
4
+
5
+ export * from './kicad.js';
6
+ export * from './footprints.js';
7
+ export * from './design-rules.js';
@@ -0,0 +1,147 @@
1
+ /**
2
+ * KiCad layer names and constants
3
+ */
4
+
5
+ // Standard layer names
6
+ export const KICAD_LAYERS = {
7
+ // Copper layers
8
+ F_CU: 'F.Cu',
9
+ B_CU: 'B.Cu',
10
+ IN1_CU: 'In1.Cu',
11
+ IN2_CU: 'In2.Cu',
12
+ IN3_CU: 'In3.Cu',
13
+ IN4_CU: 'In4.Cu',
14
+
15
+ // Technical layers - front
16
+ F_ADHES: 'F.Adhes',
17
+ F_PASTE: 'F.Paste',
18
+ F_SILKS: 'F.SilkS',
19
+ F_MASK: 'F.Mask',
20
+ F_CRTYD: 'F.CrtYd',
21
+ F_FAB: 'F.Fab',
22
+
23
+ // Technical layers - back
24
+ B_ADHES: 'B.Adhes',
25
+ B_PASTE: 'B.Paste',
26
+ B_SILKS: 'B.SilkS',
27
+ B_MASK: 'B.Mask',
28
+ B_CRTYD: 'B.CrtYd',
29
+ B_FAB: 'B.Fab',
30
+
31
+ // Other layers
32
+ EDGE_CUTS: 'Edge.Cuts',
33
+ MARGIN: 'Margin',
34
+ DWGS_USER: 'Dwgs.User',
35
+ CMTS_USER: 'Cmts.User',
36
+ ECO1_USER: 'Eco1.User',
37
+ ECO2_USER: 'Eco2.User',
38
+ } as const;
39
+
40
+ // Layer groups for common operations
41
+ export const KICAD_LAYER_GROUPS = {
42
+ ALL_CU: ['*.Cu'],
43
+ ALL_MASK: ['*.Mask'],
44
+ FRONT_LAYERS: ['F.Cu', 'F.Paste', 'F.Mask'],
45
+ BACK_LAYERS: ['B.Cu', 'B.Paste', 'B.Mask'],
46
+ SMD_FRONT: ['F.Cu', 'F.Paste', 'F.Mask'],
47
+ SMD_BACK: ['B.Cu', 'B.Paste', 'B.Mask'],
48
+ THT: ['*.Cu', '*.Mask'],
49
+ } as const;
50
+
51
+ // Default text sizes
52
+ export const KICAD_DEFAULTS = {
53
+ TEXT_SIZE: 1.27, // mm (standard KiCad 9)
54
+ TEXT_THICKNESS: 0.15, // mm
55
+ WIRE_WIDTH: 0.25, // mm (schematic)
56
+ GRID_SCHEMATIC: 2.54, // mm (100 mil)
57
+ GRID_PCB: 0.25, // mm
58
+ PIN_LENGTH: 1.27, // mm (50 mil - KiCad 9 default)
59
+ PIN_NAME_OFFSET: 0, // mm (0 for hidden names)
60
+ } as const;
61
+
62
+ // Symbol generator version (KiCad 9 format)
63
+ export const KICAD_SYMBOL_VERSION = '20241209';
64
+ export const KICAD_FOOTPRINT_VERSION = '20241209';
65
+
66
+ // Pin electrical types
67
+ export const KICAD_PIN_TYPES = [
68
+ 'input',
69
+ 'output',
70
+ 'bidirectional',
71
+ 'tri_state',
72
+ 'passive',
73
+ 'free',
74
+ 'unspecified',
75
+ 'power_in',
76
+ 'power_out',
77
+ 'open_collector',
78
+ 'open_emitter',
79
+ 'no_connect',
80
+ ] as const;
81
+
82
+ // Pad shapes
83
+ export const KICAD_PAD_SHAPES = [
84
+ 'circle',
85
+ 'rect',
86
+ 'oval',
87
+ 'trapezoid',
88
+ 'roundrect',
89
+ 'custom',
90
+ ] as const;
91
+
92
+ // Pad types
93
+ export const KICAD_PAD_TYPES = [
94
+ 'thru_hole',
95
+ 'smd',
96
+ 'connect',
97
+ 'np_thru_hole',
98
+ ] as const;
99
+
100
+ // Global library configuration
101
+ export const KICAD_LIBRARY_NAME = 'EDA-MCP';
102
+ export const KICAD_LIBRARY_DESCRIPTION = 'AI-EDA Component Library (JLC/EasyEDA)';
103
+
104
+ // Supported KiCad versions (newest first)
105
+ export const KICAD_VERSIONS = ['9.0', '8.0'] as const;
106
+
107
+ /**
108
+ * Get global KiCad library paths for a specific platform
109
+ * Returns paths in the format that kicad-sch-mcp's search pattern expects:
110
+ * ~/Documents/KiCad/{version}/symbols/*.kicad_sym
111
+ */
112
+ export function getGlobalKicadLibraryPaths(
113
+ homeDir: string,
114
+ platform: 'darwin' | 'win32' | 'linux',
115
+ version: string = '9.0'
116
+ ): {
117
+ base: string;
118
+ symbols: string;
119
+ footprints: string;
120
+ models3d: string;
121
+ } | null {
122
+ let baseDir: string;
123
+
124
+ switch (platform) {
125
+ case 'darwin':
126
+ // macOS: ~/Documents/KiCad/9.0/
127
+ baseDir = `${homeDir}/Documents/KiCad/${version}`;
128
+ break;
129
+ case 'win32':
130
+ // Windows: %USERPROFILE%/Documents/KiCad/9.0/
131
+ baseDir = `${homeDir}/Documents/KiCad/${version}`;
132
+ break;
133
+ case 'linux':
134
+ // Linux: ~/.local/share/kicad/9.0/ or ~/Documents/KiCad/9.0/
135
+ baseDir = `${homeDir}/Documents/KiCad/${version}`;
136
+ break;
137
+ default:
138
+ return null;
139
+ }
140
+
141
+ return {
142
+ base: baseDir,
143
+ symbols: `${baseDir}/symbols`,
144
+ footprints: `${baseDir}/footprints`,
145
+ models3d: `${baseDir}/3dmodels`,
146
+ };
147
+ }