easyeda-mcp-pro 0.3.2 → 0.5.2
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/README.md +369 -52
- package/dist/bom-quality/adapter.d.ts +90 -0
- package/dist/bom-quality/adapter.js +295 -0
- package/dist/bom-quality/adapter.js.map +1 -0
- package/dist/bom-quality/index.d.ts +10 -0
- package/dist/bom-quality/index.js +9 -0
- package/dist/bom-quality/index.js.map +1 -0
- package/dist/bom-quality/quality.d.ts +28 -0
- package/dist/bom-quality/quality.js +179 -0
- package/dist/bom-quality/quality.js.map +1 -0
- package/dist/bom-quality/types.d.ts +94 -0
- package/dist/bom-quality/types.js +12 -0
- package/dist/bom-quality/types.js.map +1 -0
- package/dist/bridge/manager.d.ts +41 -0
- package/dist/bridge/manager.js +334 -47
- package/dist/bridge/manager.js.map +1 -1
- package/dist/bridge/protocol.d.ts +48 -1
- package/dist/bridge/protocol.js +43 -1
- package/dist/bridge/protocol.js.map +1 -1
- package/dist/bridge/types.d.ts +6 -0
- package/dist/bridge/types.js +6 -0
- package/dist/bridge/types.js.map +1 -1
- package/dist/catalog/errors.d.ts +49 -0
- package/dist/catalog/errors.js +60 -0
- package/dist/catalog/errors.js.map +1 -0
- package/dist/catalog/index.d.ts +15 -0
- package/dist/catalog/index.js +17 -0
- package/dist/catalog/index.js.map +1 -0
- package/dist/catalog/schema.d.ts +268 -0
- package/dist/catalog/schema.js +245 -0
- package/dist/catalog/schema.js.map +1 -0
- package/dist/catalog/starter.d.ts +159 -0
- package/dist/catalog/starter.js +579 -0
- package/dist/catalog/starter.js.map +1 -0
- package/dist/catalog/validation.d.ts +48 -0
- package/dist/catalog/validation.js +263 -0
- package/dist/catalog/validation.js.map +1 -0
- package/dist/circuit/circuit-ir.d.ts +460 -0
- package/dist/circuit/circuit-ir.js +292 -0
- package/dist/circuit/circuit-ir.js.map +1 -0
- package/dist/circuit/compiler.d.ts +55 -0
- package/dist/circuit/compiler.js +197 -0
- package/dist/circuit/compiler.js.map +1 -0
- package/dist/circuit/design-intent.d.ts +94 -0
- package/dist/circuit/design-intent.js +118 -0
- package/dist/circuit/design-intent.js.map +1 -0
- package/dist/circuit/errors.d.ts +50 -0
- package/dist/circuit/errors.js +61 -0
- package/dist/circuit/errors.js.map +1 -0
- package/dist/circuit/index.d.ts +17 -0
- package/dist/circuit/index.js +18 -0
- package/dist/circuit/index.js.map +1 -0
- package/dist/circuit/types.d.ts +186 -0
- package/dist/circuit/types.js +123 -0
- package/dist/circuit/types.js.map +1 -0
- package/dist/cli/auto-setup.d.ts +5 -0
- package/dist/cli/auto-setup.js +355 -0
- package/dist/cli/auto-setup.js.map +1 -0
- package/dist/cli/client-definitions.d.ts +34 -0
- package/dist/cli/client-definitions.js +194 -0
- package/dist/cli/client-definitions.js.map +1 -0
- package/dist/cli/local-setup.d.ts +5 -1
- package/dist/cli/local-setup.js +40 -6
- package/dist/cli/local-setup.js.map +1 -1
- package/dist/config/env.d.ts +6 -1
- package/dist/config/env.js +93 -5
- package/dist/config/env.js.map +1 -1
- package/dist/config/profiles.js +4 -4
- package/dist/config/version.d.ts +1 -1
- package/dist/config/version.js +1 -1
- package/dist/export-manifest/errors.d.ts +55 -0
- package/dist/export-manifest/errors.js +69 -0
- package/dist/export-manifest/errors.js.map +1 -0
- package/dist/export-manifest/index.d.ts +10 -0
- package/dist/export-manifest/index.js +9 -0
- package/dist/export-manifest/index.js.map +1 -0
- package/dist/export-manifest/types.d.ts +170 -0
- package/dist/export-manifest/types.js +36 -0
- package/dist/export-manifest/types.js.map +1 -0
- package/dist/export-manifest/validation.d.ts +39 -0
- package/dist/export-manifest/validation.js +298 -0
- package/dist/export-manifest/validation.js.map +1 -0
- package/dist/index.js +20 -0
- package/dist/index.js.map +1 -1
- package/dist/net-validation/errors.d.ts +89 -0
- package/dist/net-validation/errors.js +69 -0
- package/dist/net-validation/errors.js.map +1 -0
- package/dist/net-validation/fixtures.d.ts +38 -0
- package/dist/net-validation/fixtures.js +215 -0
- package/dist/net-validation/fixtures.js.map +1 -0
- package/dist/net-validation/index.d.ts +10 -0
- package/dist/net-validation/index.js +9 -0
- package/dist/net-validation/index.js.map +1 -0
- package/dist/net-validation/schema.d.ts +118 -0
- package/dist/net-validation/schema.js +140 -0
- package/dist/net-validation/schema.js.map +1 -0
- package/dist/net-validation/validation.d.ts +45 -0
- package/dist/net-validation/validation.js +369 -0
- package/dist/net-validation/validation.js.map +1 -0
- package/dist/pcb-constraints/errors.d.ts +39 -0
- package/dist/pcb-constraints/errors.js +133 -0
- package/dist/pcb-constraints/errors.js.map +1 -0
- package/dist/pcb-constraints/index.d.ts +9 -0
- package/dist/pcb-constraints/index.js +9 -0
- package/dist/pcb-constraints/index.js.map +1 -0
- package/dist/pcb-constraints/types.d.ts +102 -0
- package/dist/pcb-constraints/types.js +7 -0
- package/dist/pcb-constraints/types.js.map +1 -0
- package/dist/pcb-constraints/validation.d.ts +70 -0
- package/dist/pcb-constraints/validation.js +309 -0
- package/dist/pcb-constraints/validation.js.map +1 -0
- package/dist/server/factory.js +2 -0
- package/dist/server/factory.js.map +1 -1
- package/dist/server/transports/http.d.ts +20 -1
- package/dist/server/transports/http.js +156 -34
- package/dist/server/transports/http.js.map +1 -1
- package/dist/storage/database.d.ts +25 -0
- package/dist/storage/database.js +126 -51
- package/dist/storage/database.js.map +1 -1
- package/dist/tools/{L0_diagnostics.d.ts → L0_diagnostics_api.d.ts} +2 -2
- package/dist/tools/L0_diagnostics_api.js +152 -0
- package/dist/tools/L0_diagnostics_api.js.map +1 -0
- package/dist/tools/L0_diagnostics_core.d.ts +6 -0
- package/dist/tools/{L0_diagnostics.js → L0_diagnostics_core.js} +50 -124
- package/dist/tools/L0_diagnostics_core.js.map +1 -0
- package/dist/tools/L1_board.js +20 -4
- package/dist/tools/L1_board.js.map +1 -1
- package/dist/tools/{L1_bom.d.ts → L1_bom_core.d.ts} +2 -2
- package/dist/tools/{L1_bom.js → L1_bom_core.js} +21 -101
- package/dist/tools/L1_bom_core.js.map +1 -0
- package/dist/tools/{L1_schematic.d.ts → L1_bom_sourcing.d.ts} +2 -2
- package/dist/tools/L1_bom_sourcing.js +265 -0
- package/dist/tools/L1_bom_sourcing.js.map +1 -0
- package/dist/tools/L1_drc_erc.js +15 -3
- package/dist/tools/L1_drc_erc.js.map +1 -1
- package/dist/tools/L1_export.js +20 -4
- package/dist/tools/L1_export.js.map +1 -1
- package/dist/tools/L1_pcb_constraints.d.ts +6 -0
- package/dist/tools/L1_pcb_constraints.js +234 -0
- package/dist/tools/L1_pcb_constraints.js.map +1 -0
- package/dist/tools/L1_pcb_write.js +26 -12
- package/dist/tools/L1_pcb_write.js.map +1 -1
- package/dist/tools/L1_schematic_read.d.ts +6 -0
- package/dist/tools/{L1_schematic.js → L1_schematic_read.js} +125 -190
- package/dist/tools/L1_schematic_read.js.map +1 -0
- package/dist/tools/L1_schematic_write.d.ts +6 -0
- package/dist/tools/L1_schematic_write.js +516 -0
- package/dist/tools/L1_schematic_write.js.map +1 -0
- package/dist/tools/register.js +15 -7
- package/dist/tools/register.js.map +1 -1
- package/dist/tools/registry.d.ts +41 -7
- package/dist/tools/registry.js +111 -12
- package/dist/tools/registry.js.map +1 -1
- package/dist/tools/types.d.ts +16 -0
- package/dist/utils/logger.d.ts +1 -1
- package/dist/utils/logger.js +1 -1
- package/dist/utils/logger.js.map +1 -1
- package/dist/vendors/base-http-client.d.ts +48 -0
- package/dist/vendors/base-http-client.js +75 -0
- package/dist/vendors/base-http-client.js.map +1 -0
- package/dist/vendors/digikey/client.js +10 -19
- package/dist/vendors/digikey/client.js.map +1 -1
- package/dist/vendors/jlcpcb/client.js +41 -70
- package/dist/vendors/jlcpcb/client.js.map +1 -1
- package/dist/vendors/lcsc/client.js +5 -18
- package/dist/vendors/lcsc/client.js.map +1 -1
- package/dist/vendors/mouser/client.js +4 -12
- package/dist/vendors/mouser/client.js.map +1 -1
- package/easyeda-bridge-extension.eext +0 -0
- package/package.json +41 -26
- package/dist/tools/L0_diagnostics.js.map +0 -1
- package/dist/tools/L1_bom.js.map +0 -1
- package/dist/tools/L1_schematic.js.map +0 -1
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Device catalog validation rules.
|
|
3
|
+
*
|
|
4
|
+
* Validates a DeviceCatalog against business rules beyond schema-level
|
|
5
|
+
* constraints (type correctness, required fields). These rules check for:
|
|
6
|
+
*
|
|
7
|
+
* - Duplicate device IDs
|
|
8
|
+
* - Missing symbol references
|
|
9
|
+
* - Missing footprint references
|
|
10
|
+
* - Missing pin maps (for ICs and connectors)
|
|
11
|
+
* - Incompatible package assignments
|
|
12
|
+
* - Missing manufacturer part numbers
|
|
13
|
+
* - Missing assembly availability hints
|
|
14
|
+
* - Duplicate supplier IDs within a single device
|
|
15
|
+
*
|
|
16
|
+
* @module
|
|
17
|
+
*/
|
|
18
|
+
import { CatalogValidationError } from './errors.js';
|
|
19
|
+
import type { DeviceCatalog, DeviceEntry } from './schema.js';
|
|
20
|
+
export interface CatalogValidationResult {
|
|
21
|
+
valid: boolean;
|
|
22
|
+
errors: CatalogValidationError[];
|
|
23
|
+
warnings: CatalogValidationError[];
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Validate a DeviceCatalog against all business rules.
|
|
27
|
+
*
|
|
28
|
+
* Returns both errors (catalog is invalid) and warnings (catalog is valid
|
|
29
|
+
* but has issues the user should address).
|
|
30
|
+
*
|
|
31
|
+
* Schema-level validation (type correctness, required fields) is handled
|
|
32
|
+
* by `DeviceCatalogSchema.parse()` / `validateDeviceCatalog()`.
|
|
33
|
+
* This function adds domain-specific cross-field validation.
|
|
34
|
+
*/
|
|
35
|
+
export declare function validateCatalog(catalog: DeviceCatalog): CatalogValidationResult;
|
|
36
|
+
/**
|
|
37
|
+
* Validate a catalog and throw if any errors are found.
|
|
38
|
+
*
|
|
39
|
+
* Returns structured errors+warnings on success.
|
|
40
|
+
* Throws `CatalogError` with all validation errors if the catalog is invalid.
|
|
41
|
+
*/
|
|
42
|
+
export declare function validateCatalogOrThrow(catalog: DeviceCatalog): CatalogValidationResult;
|
|
43
|
+
/**
|
|
44
|
+
* Validate a single device entry against common rules.
|
|
45
|
+
*
|
|
46
|
+
* This is useful for pre-validation before adding a device to a catalog.
|
|
47
|
+
*/
|
|
48
|
+
export declare function validateDeviceEntry(entry: DeviceEntry): CatalogValidationResult;
|
|
@@ -0,0 +1,263 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Device catalog validation rules.
|
|
3
|
+
*
|
|
4
|
+
* Validates a DeviceCatalog against business rules beyond schema-level
|
|
5
|
+
* constraints (type correctness, required fields). These rules check for:
|
|
6
|
+
*
|
|
7
|
+
* - Duplicate device IDs
|
|
8
|
+
* - Missing symbol references
|
|
9
|
+
* - Missing footprint references
|
|
10
|
+
* - Missing pin maps (for ICs and connectors)
|
|
11
|
+
* - Incompatible package assignments
|
|
12
|
+
* - Missing manufacturer part numbers
|
|
13
|
+
* - Missing assembly availability hints
|
|
14
|
+
* - Duplicate supplier IDs within a single device
|
|
15
|
+
*
|
|
16
|
+
* @module
|
|
17
|
+
*/
|
|
18
|
+
import { CatalogError, CatalogErrorCode, catalogValidationError, } from './errors.js';
|
|
19
|
+
import { DEVICE_CATALOG_SCHEMA_VERSION } from './schema.js';
|
|
20
|
+
// ── Constants ─────────────────────────────────────────────────────────────
|
|
21
|
+
/** Device categories that are expected to have a pin mapping. */
|
|
22
|
+
const CATEGORIES_REQUIRING_PIN_MAP = new Set([
|
|
23
|
+
'microcontroller',
|
|
24
|
+
'sensor',
|
|
25
|
+
'power',
|
|
26
|
+
'communication',
|
|
27
|
+
'interface',
|
|
28
|
+
'connector',
|
|
29
|
+
'memory',
|
|
30
|
+
'logic',
|
|
31
|
+
'amplifier',
|
|
32
|
+
'converter',
|
|
33
|
+
]);
|
|
34
|
+
/** Categories that require a footprint (all functional devices). */
|
|
35
|
+
const CATEGORIES_REQUIRING_FOOTPRINT = new Set([
|
|
36
|
+
'microcontroller',
|
|
37
|
+
'sensor',
|
|
38
|
+
'power',
|
|
39
|
+
'communication',
|
|
40
|
+
'interface',
|
|
41
|
+
'connector',
|
|
42
|
+
'memory',
|
|
43
|
+
'logic',
|
|
44
|
+
'amplifier',
|
|
45
|
+
'converter',
|
|
46
|
+
'passive',
|
|
47
|
+
'electromechanical',
|
|
48
|
+
'protection',
|
|
49
|
+
'clocking',
|
|
50
|
+
]);
|
|
51
|
+
/** Categories that require a symbol. */
|
|
52
|
+
const CATEGORIES_REQUIRING_SYMBOL = new Set([
|
|
53
|
+
'microcontroller',
|
|
54
|
+
'sensor',
|
|
55
|
+
'power',
|
|
56
|
+
'communication',
|
|
57
|
+
'interface',
|
|
58
|
+
'connector',
|
|
59
|
+
'memory',
|
|
60
|
+
'logic',
|
|
61
|
+
'amplifier',
|
|
62
|
+
'converter',
|
|
63
|
+
'passive',
|
|
64
|
+
'electromechanical',
|
|
65
|
+
'protection',
|
|
66
|
+
'clocking',
|
|
67
|
+
'custom',
|
|
68
|
+
]);
|
|
69
|
+
// ── Individual rule checks ────────────────────────────────────────────────
|
|
70
|
+
function checkDuplicateIds(catalog) {
|
|
71
|
+
const errors = [];
|
|
72
|
+
const seen = new Map();
|
|
73
|
+
for (const device of catalog.devices) {
|
|
74
|
+
const id = device.id;
|
|
75
|
+
if (seen.has(id)) {
|
|
76
|
+
errors.push(catalogValidationError(CatalogErrorCode.DEVICE_DUPLICATE_ID, `Duplicate device ID: "${id}"`, {
|
|
77
|
+
deviceId: id,
|
|
78
|
+
firstIndex: seen.get(id),
|
|
79
|
+
}));
|
|
80
|
+
}
|
|
81
|
+
seen.set(id, seen.size);
|
|
82
|
+
}
|
|
83
|
+
return errors;
|
|
84
|
+
}
|
|
85
|
+
function checkMissingSymbol(catalog) {
|
|
86
|
+
const errors = [];
|
|
87
|
+
for (const device of catalog.devices) {
|
|
88
|
+
if (CATEGORIES_REQUIRING_SYMBOL.has(device.category)) {
|
|
89
|
+
if (!device.symbolRef || device.symbolRef.trim().length === 0) {
|
|
90
|
+
errors.push(catalogValidationError(CatalogErrorCode.DEVICE_MISSING_SYMBOL, `Device "${device.id}" (category: ${device.category}) is missing a symbol reference`, { deviceId: device.id, category: device.category }));
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
return errors;
|
|
95
|
+
}
|
|
96
|
+
function checkMissingFootprint(catalog) {
|
|
97
|
+
const errors = [];
|
|
98
|
+
for (const device of catalog.devices) {
|
|
99
|
+
if (CATEGORIES_REQUIRING_FOOTPRINT.has(device.category)) {
|
|
100
|
+
if (!device.footprintRef || device.footprintRef.trim().length === 0) {
|
|
101
|
+
errors.push(catalogValidationError(CatalogErrorCode.DEVICE_MISSING_FOOTPRINT, `Device "${device.id}" (category: ${device.category}) is missing a footprint reference`, { deviceId: device.id, category: device.category }));
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
return errors;
|
|
106
|
+
}
|
|
107
|
+
function checkMissingPinMap(catalog) {
|
|
108
|
+
const errors = [];
|
|
109
|
+
for (const device of catalog.devices) {
|
|
110
|
+
if (CATEGORIES_REQUIRING_PIN_MAP.has(device.category)) {
|
|
111
|
+
if (!device.pinMapping || device.pinMapping.length === 0) {
|
|
112
|
+
errors.push(catalogValidationError(CatalogErrorCode.DEVICE_MISSING_PIN_MAP, `Device "${device.id}" (category: ${device.category}) is missing a pin map`, { deviceId: device.id, category: device.category }));
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
return errors;
|
|
117
|
+
}
|
|
118
|
+
function checkMissingMpn(catalog) {
|
|
119
|
+
const errors = [];
|
|
120
|
+
for (const device of catalog.devices) {
|
|
121
|
+
if (!device.mpn || device.mpn.trim().length === 0) {
|
|
122
|
+
errors.push(catalogValidationError(CatalogErrorCode.DEVICE_MISSING_MPN, `Device "${device.id}" is missing a manufacturer part number (MPN)`, { deviceId: device.id }));
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
return errors;
|
|
126
|
+
}
|
|
127
|
+
function checkMissingAssemblyData(catalog) {
|
|
128
|
+
const warnings = [];
|
|
129
|
+
for (const device of catalog.devices) {
|
|
130
|
+
if (!device.assemblyHint) {
|
|
131
|
+
// Not an error for passive components, but warn for ICs and electromechanical
|
|
132
|
+
if (device.category === 'microcontroller' ||
|
|
133
|
+
device.category === 'connector' ||
|
|
134
|
+
device.category === 'sensor') {
|
|
135
|
+
warnings.push(catalogValidationError(CatalogErrorCode.DEVICE_MISSING_ASSEMBLY_DATA, `Device "${device.id}" (category: ${device.category}) has no assembly availability hints`, { deviceId: device.id, category: device.category }));
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
return warnings;
|
|
140
|
+
}
|
|
141
|
+
function checkDuplicateSupplierIds(catalog) {
|
|
142
|
+
const errors = [];
|
|
143
|
+
for (const device of catalog.devices) {
|
|
144
|
+
const seen = new Set();
|
|
145
|
+
const supplierIds = device.supplierIds ?? [];
|
|
146
|
+
for (const sid of supplierIds) {
|
|
147
|
+
const key = `${sid.supplier}:${sid.partId}`;
|
|
148
|
+
if (seen.has(key)) {
|
|
149
|
+
errors.push(catalogValidationError(CatalogErrorCode.DEVICE_DUPLICATE_SUPPLIER_ID, `Device "${device.id}" has duplicate supplier ID "${key}"`, { deviceId: device.id, supplierKey: key }));
|
|
150
|
+
}
|
|
151
|
+
seen.add(key);
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
return errors;
|
|
155
|
+
}
|
|
156
|
+
// ── Main validation entry point ───────────────────────────────────────────
|
|
157
|
+
/**
|
|
158
|
+
* Validate a DeviceCatalog against all business rules.
|
|
159
|
+
*
|
|
160
|
+
* Returns both errors (catalog is invalid) and warnings (catalog is valid
|
|
161
|
+
* but has issues the user should address).
|
|
162
|
+
*
|
|
163
|
+
* Schema-level validation (type correctness, required fields) is handled
|
|
164
|
+
* by `DeviceCatalogSchema.parse()` / `validateDeviceCatalog()`.
|
|
165
|
+
* This function adds domain-specific cross-field validation.
|
|
166
|
+
*/
|
|
167
|
+
export function validateCatalog(catalog) {
|
|
168
|
+
const errors = [];
|
|
169
|
+
const warnings = [];
|
|
170
|
+
// Schema version check (warning only — allow forward compatibility)
|
|
171
|
+
if (catalog.$schema !== DEVICE_CATALOG_SCHEMA_VERSION) {
|
|
172
|
+
warnings.push(catalogValidationError(CatalogErrorCode.CATALOG_SCHEMA_VERSION_MISMATCH, `Catalog schema version "${catalog.$schema}" does not match expected "${DEVICE_CATALOG_SCHEMA_VERSION}"`, {
|
|
173
|
+
expected: DEVICE_CATALOG_SCHEMA_VERSION,
|
|
174
|
+
actual: catalog.$schema,
|
|
175
|
+
}));
|
|
176
|
+
}
|
|
177
|
+
// Run all validation rules
|
|
178
|
+
errors.push(...checkDuplicateIds(catalog));
|
|
179
|
+
errors.push(...checkMissingSymbol(catalog));
|
|
180
|
+
errors.push(...checkMissingFootprint(catalog));
|
|
181
|
+
errors.push(...checkMissingPinMap(catalog));
|
|
182
|
+
errors.push(...checkMissingMpn(catalog));
|
|
183
|
+
warnings.push(...checkMissingAssemblyData(catalog));
|
|
184
|
+
errors.push(...checkDuplicateSupplierIds(catalog));
|
|
185
|
+
return {
|
|
186
|
+
valid: errors.length === 0,
|
|
187
|
+
errors,
|
|
188
|
+
warnings,
|
|
189
|
+
};
|
|
190
|
+
}
|
|
191
|
+
/**
|
|
192
|
+
* Validate a catalog and throw if any errors are found.
|
|
193
|
+
*
|
|
194
|
+
* Returns structured errors+warnings on success.
|
|
195
|
+
* Throws `CatalogError` with all validation errors if the catalog is invalid.
|
|
196
|
+
*/
|
|
197
|
+
export function validateCatalogOrThrow(catalog) {
|
|
198
|
+
const result = validateCatalog(catalog);
|
|
199
|
+
if (!result.valid) {
|
|
200
|
+
throw new CatalogError({
|
|
201
|
+
code: CatalogErrorCode.CATALOG_INVALID,
|
|
202
|
+
message: `Catalog validation failed with ${result.errors.length} error(s)`,
|
|
203
|
+
errors: result.errors,
|
|
204
|
+
});
|
|
205
|
+
}
|
|
206
|
+
return result;
|
|
207
|
+
}
|
|
208
|
+
function validateRequiredFields(entry) {
|
|
209
|
+
const errors = [];
|
|
210
|
+
// MPN check
|
|
211
|
+
if (!entry.mpn || entry.mpn.trim().length === 0) {
|
|
212
|
+
errors.push(catalogValidationError(CatalogErrorCode.DEVICE_MISSING_MPN, `Device "${entry.id}" is missing an MPN`, { deviceId: entry.id }));
|
|
213
|
+
}
|
|
214
|
+
// Symbol check for functional categories
|
|
215
|
+
if (CATEGORIES_REQUIRING_SYMBOL.has(entry.category)) {
|
|
216
|
+
if (!entry.symbolRef || entry.symbolRef.trim().length === 0) {
|
|
217
|
+
errors.push(catalogValidationError(CatalogErrorCode.DEVICE_MISSING_SYMBOL, `Device "${entry.id}" is missing a symbol reference`, { deviceId: entry.id, category: entry.category }));
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
// Footprint check
|
|
221
|
+
if (CATEGORIES_REQUIRING_FOOTPRINT.has(entry.category)) {
|
|
222
|
+
if (!entry.footprintRef || entry.footprintRef.trim().length === 0) {
|
|
223
|
+
errors.push(catalogValidationError(CatalogErrorCode.DEVICE_MISSING_FOOTPRINT, `Device "${entry.id}" is missing a footprint reference`, { deviceId: entry.id, category: entry.category }));
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
return errors;
|
|
227
|
+
}
|
|
228
|
+
function validatePinConfiguration(entry) {
|
|
229
|
+
const errors = [];
|
|
230
|
+
// Pin map check for complex devices
|
|
231
|
+
if (CATEGORIES_REQUIRING_PIN_MAP.has(entry.category)) {
|
|
232
|
+
if (!entry.pinMapping || entry.pinMapping.length === 0) {
|
|
233
|
+
errors.push(catalogValidationError(CatalogErrorCode.DEVICE_MISSING_PIN_MAP, `Device "${entry.id}" is missing a pin map`, { deviceId: entry.id, category: entry.category }));
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
return errors;
|
|
237
|
+
}
|
|
238
|
+
function validateMetadata(entry) {
|
|
239
|
+
const warnings = [];
|
|
240
|
+
// Assembly data warning for critical categories
|
|
241
|
+
if (!entry.assemblyHint) {
|
|
242
|
+
if (entry.category === 'microcontroller' ||
|
|
243
|
+
entry.category === 'connector' ||
|
|
244
|
+
entry.category === 'sensor') {
|
|
245
|
+
warnings.push(catalogValidationError(CatalogErrorCode.DEVICE_MISSING_ASSEMBLY_DATA, `Device "${entry.id}" has no assembly availability hints`, { deviceId: entry.id, category: entry.category }));
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
return warnings;
|
|
249
|
+
}
|
|
250
|
+
/**
|
|
251
|
+
* Validate a single device entry against common rules.
|
|
252
|
+
*
|
|
253
|
+
* This is useful for pre-validation before adding a device to a catalog.
|
|
254
|
+
*/
|
|
255
|
+
export function validateDeviceEntry(entry) {
|
|
256
|
+
const errors = [
|
|
257
|
+
...validateRequiredFields(entry),
|
|
258
|
+
...validatePinConfiguration(entry),
|
|
259
|
+
];
|
|
260
|
+
const warnings = validateMetadata(entry);
|
|
261
|
+
return { valid: errors.length === 0, errors, warnings };
|
|
262
|
+
}
|
|
263
|
+
//# sourceMappingURL=validation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validation.js","sourceRoot":"","sources":["../../src/catalog/validation.ts"],"names":[],"mappings":"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"}
|