@intelligentelectron/universal-netlist 0.0.12

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 (105) hide show
  1. package/CHANGELOG.md +121 -0
  2. package/LICENSE +190 -0
  3. package/NOTICE +4 -0
  4. package/README.md +246 -0
  5. package/dist/circuit-traversal.d.ts +73 -0
  6. package/dist/circuit-traversal.d.ts.map +1 -0
  7. package/dist/circuit-traversal.js +299 -0
  8. package/dist/circuit-traversal.js.map +1 -0
  9. package/dist/cli/commands.d.ts +23 -0
  10. package/dist/cli/commands.d.ts.map +1 -0
  11. package/dist/cli/commands.js +140 -0
  12. package/dist/cli/commands.js.map +1 -0
  13. package/dist/cli/prompts.d.ts +10 -0
  14. package/dist/cli/prompts.d.ts.map +1 -0
  15. package/dist/cli/prompts.js +22 -0
  16. package/dist/cli/prompts.js.map +1 -0
  17. package/dist/cli/shell.d.ts +15 -0
  18. package/dist/cli/shell.d.ts.map +1 -0
  19. package/dist/cli/shell.js +66 -0
  20. package/dist/cli/shell.js.map +1 -0
  21. package/dist/cli/updater.d.ts +46 -0
  22. package/dist/cli/updater.d.ts.map +1 -0
  23. package/dist/cli/updater.js +319 -0
  24. package/dist/cli/updater.js.map +1 -0
  25. package/dist/index.d.ts +16 -0
  26. package/dist/index.d.ts.map +1 -0
  27. package/dist/index.js +63 -0
  28. package/dist/index.js.map +1 -0
  29. package/dist/parsers/altium/connectivity.d.ts +32 -0
  30. package/dist/parsers/altium/connectivity.d.ts.map +1 -0
  31. package/dist/parsers/altium/connectivity.js +308 -0
  32. package/dist/parsers/altium/connectivity.js.map +1 -0
  33. package/dist/parsers/altium/discovery.d.ts +30 -0
  34. package/dist/parsers/altium/discovery.d.ts.map +1 -0
  35. package/dist/parsers/altium/discovery.js +174 -0
  36. package/dist/parsers/altium/discovery.js.map +1 -0
  37. package/dist/parsers/altium/hierarchy.d.ts +29 -0
  38. package/dist/parsers/altium/hierarchy.d.ts.map +1 -0
  39. package/dist/parsers/altium/hierarchy.js +94 -0
  40. package/dist/parsers/altium/hierarchy.js.map +1 -0
  41. package/dist/parsers/altium/index.d.ts +53 -0
  42. package/dist/parsers/altium/index.d.ts.map +1 -0
  43. package/dist/parsers/altium/index.js +404 -0
  44. package/dist/parsers/altium/index.js.map +1 -0
  45. package/dist/parsers/altium/net-extractor.d.ts +24 -0
  46. package/dist/parsers/altium/net-extractor.d.ts.map +1 -0
  47. package/dist/parsers/altium/net-extractor.js +295 -0
  48. package/dist/parsers/altium/net-extractor.js.map +1 -0
  49. package/dist/parsers/altium/ole-reader.d.ts +91 -0
  50. package/dist/parsers/altium/ole-reader.d.ts.map +1 -0
  51. package/dist/parsers/altium/ole-reader.js +304 -0
  52. package/dist/parsers/altium/ole-reader.js.map +1 -0
  53. package/dist/parsers/altium/record-parser.d.ts +21 -0
  54. package/dist/parsers/altium/record-parser.d.ts.map +1 -0
  55. package/dist/parsers/altium/record-parser.js +117 -0
  56. package/dist/parsers/altium/record-parser.js.map +1 -0
  57. package/dist/parsers/altium/schemas.d.ts +277 -0
  58. package/dist/parsers/altium/schemas.d.ts.map +1 -0
  59. package/dist/parsers/altium/schemas.js +246 -0
  60. package/dist/parsers/altium/schemas.js.map +1 -0
  61. package/dist/parsers/altium/types.d.ts +213 -0
  62. package/dist/parsers/altium/types.d.ts.map +1 -0
  63. package/dist/parsers/altium/types.js +180 -0
  64. package/dist/parsers/altium/types.js.map +1 -0
  65. package/dist/parsers/cadence/discovery.d.ts +45 -0
  66. package/dist/parsers/cadence/discovery.d.ts.map +1 -0
  67. package/dist/parsers/cadence/discovery.js +277 -0
  68. package/dist/parsers/cadence/discovery.js.map +1 -0
  69. package/dist/parsers/cadence/index.d.ts +41 -0
  70. package/dist/parsers/cadence/index.d.ts.map +1 -0
  71. package/dist/parsers/cadence/index.js +139 -0
  72. package/dist/parsers/cadence/index.js.map +1 -0
  73. package/dist/parsers/cadence/pstchip-parser.d.ts +23 -0
  74. package/dist/parsers/cadence/pstchip-parser.d.ts.map +1 -0
  75. package/dist/parsers/cadence/pstchip-parser.js +82 -0
  76. package/dist/parsers/cadence/pstchip-parser.js.map +1 -0
  77. package/dist/parsers/cadence/pstxnet-parser.d.ts +15 -0
  78. package/dist/parsers/cadence/pstxnet-parser.d.ts.map +1 -0
  79. package/dist/parsers/cadence/pstxnet-parser.js +55 -0
  80. package/dist/parsers/cadence/pstxnet-parser.js.map +1 -0
  81. package/dist/parsers/cadence/pstxprt-parser.d.ts +24 -0
  82. package/dist/parsers/cadence/pstxprt-parser.d.ts.map +1 -0
  83. package/dist/parsers/cadence/pstxprt-parser.js +75 -0
  84. package/dist/parsers/cadence/pstxprt-parser.js.map +1 -0
  85. package/dist/parsers/index.d.ts +33 -0
  86. package/dist/parsers/index.d.ts.map +1 -0
  87. package/dist/parsers/index.js +49 -0
  88. package/dist/parsers/index.js.map +1 -0
  89. package/dist/server.d.ts +16 -0
  90. package/dist/server.d.ts.map +1 -0
  91. package/dist/server.js +277 -0
  92. package/dist/server.js.map +1 -0
  93. package/dist/service.d.ts +129 -0
  94. package/dist/service.d.ts.map +1 -0
  95. package/dist/service.js +759 -0
  96. package/dist/service.js.map +1 -0
  97. package/dist/types.d.ts +242 -0
  98. package/dist/types.d.ts.map +1 -0
  99. package/dist/types.js +27 -0
  100. package/dist/types.js.map +1 -0
  101. package/dist/version.d.ts +10 -0
  102. package/dist/version.d.ts.map +1 -0
  103. package/dist/version.js +25 -0
  104. package/dist/version.js.map +1 -0
  105. package/package.json +74 -0
@@ -0,0 +1,304 @@
1
+ /**
2
+ * OLE/CFB File Reader
3
+ *
4
+ * Custom implementation of Microsoft Compound File Binary (CFB) format parser.
5
+ * Based on MS-CFB specification:
6
+ * https://learn.microsoft.com/en-us/openspecs/windows_protocols/ms-cfb/
7
+ *
8
+ * Only implements the subset needed to read streams from Altium .SchDoc files.
9
+ */
10
+ import { readFileSync } from 'fs';
11
+ // OLE magic signature: D0 CF 11 E0 A1 B1 1A E1
12
+ const OLE_MAGIC = Buffer.from([0xd0, 0xcf, 0x11, 0xe0, 0xa1, 0xb1, 0x1a, 0xe1]);
13
+ // Header size is always 512 bytes
14
+ const HEADER_SIZE = 512;
15
+ // Directory entry size is always 128 bytes
16
+ const DIR_ENTRY_SIZE = 128;
17
+ // Special sector values
18
+ const ENDOFCHAIN = 0xfffffffe;
19
+ const FREESECT = 0xffffffff;
20
+ const FATSECT = 0xfffffffd;
21
+ const DIFSECT = 0xfffffffc;
22
+ /**
23
+ * OLE/CFB file reader class
24
+ *
25
+ * Reads Microsoft Compound File Binary format files.
26
+ */
27
+ export class OleReader {
28
+ buffer;
29
+ header;
30
+ fat;
31
+ miniFat;
32
+ directories;
33
+ miniStream;
34
+ /**
35
+ * Create a new OleReader instance for reading OLE compound files.
36
+ */
37
+ constructor(filePath) {
38
+ this.buffer = readFileSync(filePath);
39
+ this.validateMagic();
40
+ this.header = this.parseHeader();
41
+ this.fat = this.buildFat();
42
+ this.directories = this.readDirectories();
43
+ this.miniFat = this.buildMiniFat();
44
+ this.miniStream = this.readMiniStream();
45
+ }
46
+ /**
47
+ * Read a named stream from the OLE file.
48
+ */
49
+ readStream(name) {
50
+ const entry = this.findDirectoryEntry(name);
51
+ if (!entry) {
52
+ throw new Error(`Stream "${name}" not found in OLE file`);
53
+ }
54
+ return this.readStreamData(entry);
55
+ }
56
+ /**
57
+ * List all stream names in the file.
58
+ */
59
+ listStreams() {
60
+ return this.directories.filter((d) => d.type === 2).map((d) => d.name);
61
+ }
62
+ /**
63
+ * Validate the OLE magic signature.
64
+ */
65
+ validateMagic() {
66
+ const signature = this.buffer.subarray(0, 8);
67
+ if (!signature.equals(OLE_MAGIC)) {
68
+ throw new Error('Invalid OLE file: magic signature mismatch');
69
+ }
70
+ }
71
+ /**
72
+ * Parse the 512-byte header.
73
+ */
74
+ parseHeader() {
75
+ // Minor version at offset 24 (2 bytes) - not used
76
+ // Major version at offset 26 (2 bytes)
77
+ const majorVersion = this.buffer.readUInt16LE(26);
78
+ // Byte order at offset 28 should be 0xFFFE (little-endian)
79
+ const byteOrder = this.buffer.readUInt16LE(28);
80
+ if (byteOrder !== 0xfffe) {
81
+ throw new Error('Invalid OLE file: unexpected byte order');
82
+ }
83
+ // Sector size power at offset 30 (2 bytes)
84
+ const sectorSizePower = this.buffer.readUInt16LE(30);
85
+ const sectorSize = 1 << sectorSizePower;
86
+ // Mini sector size power at offset 32 (2 bytes)
87
+ const miniSectorSizePower = this.buffer.readUInt16LE(32);
88
+ const miniSectorSize = 1 << miniSectorSizePower;
89
+ // Mini stream cutoff at offset 56 (4 bytes)
90
+ const miniStreamCutoff = this.buffer.readUInt32LE(56);
91
+ // First directory sector at offset 48 (4 bytes)
92
+ const dirStartSector = this.buffer.readUInt32LE(48);
93
+ // First mini FAT sector at offset 60 (4 bytes)
94
+ const miniFatStartSector = this.buffer.readUInt32LE(60);
95
+ // Number of mini FAT sectors at offset 64 (4 bytes)
96
+ const numMiniFatSectors = this.buffer.readUInt32LE(64);
97
+ // First DIFAT sector at offset 68 (4 bytes)
98
+ const difatStartSector = this.buffer.readUInt32LE(68);
99
+ // Number of DIFAT sectors at offset 72 (4 bytes)
100
+ const numDifatSectors = this.buffer.readUInt32LE(72);
101
+ // FAT sector locations at offset 76 (109 entries * 4 bytes = 436 bytes)
102
+ const fatSectors = [];
103
+ for (let i = 0; i < 109; i++) {
104
+ const sector = this.buffer.readUInt32LE(76 + i * 4);
105
+ if (sector !== FREESECT) {
106
+ fatSectors.push(sector);
107
+ }
108
+ }
109
+ return {
110
+ majorVersion,
111
+ sectorSize,
112
+ miniSectorSize,
113
+ miniStreamCutoff,
114
+ dirStartSector,
115
+ miniFatStartSector,
116
+ numMiniFatSectors,
117
+ difatStartSector,
118
+ numDifatSectors,
119
+ fatSectors,
120
+ };
121
+ }
122
+ /**
123
+ * Build the complete FAT by reading all FAT sectors.
124
+ */
125
+ buildFat() {
126
+ const fat = [];
127
+ const entriesPerSector = this.header.sectorSize / 4;
128
+ // Read FAT sectors from header DIFAT
129
+ for (const sectorNum of this.header.fatSectors) {
130
+ const sectorData = this.readSector(sectorNum);
131
+ for (let i = 0; i < entriesPerSector; i++) {
132
+ fat.push(sectorData.readUInt32LE(i * 4));
133
+ }
134
+ }
135
+ // If there are additional DIFAT sectors, read them too
136
+ if (this.header.numDifatSectors > 0) {
137
+ let difatSector = this.header.difatStartSector;
138
+ for (let d = 0; d < this.header.numDifatSectors; d++) {
139
+ const difatData = this.readSector(difatSector);
140
+ // Each DIFAT sector has (sectorSize/4 - 1) FAT sector references
141
+ // and the last entry points to the next DIFAT sector
142
+ for (let i = 0; i < entriesPerSector - 1; i++) {
143
+ const fatSectorNum = difatData.readUInt32LE(i * 4);
144
+ if (fatSectorNum !== FREESECT) {
145
+ const sectorData = this.readSector(fatSectorNum);
146
+ for (let j = 0; j < entriesPerSector; j++) {
147
+ fat.push(sectorData.readUInt32LE(j * 4));
148
+ }
149
+ }
150
+ }
151
+ // Next DIFAT sector
152
+ difatSector = difatData.readUInt32LE((entriesPerSector - 1) * 4);
153
+ }
154
+ }
155
+ return fat;
156
+ }
157
+ /**
158
+ * Build the mini FAT.
159
+ */
160
+ buildMiniFat() {
161
+ const miniFat = [];
162
+ if (this.header.miniFatStartSector === ENDOFCHAIN) {
163
+ return miniFat;
164
+ }
165
+ const entriesPerSector = this.header.sectorSize / 4;
166
+ const sectorChain = this.getSectorChain(this.header.miniFatStartSector);
167
+ for (const sectorNum of sectorChain) {
168
+ const sectorData = this.readSector(sectorNum);
169
+ for (let i = 0; i < entriesPerSector; i++) {
170
+ miniFat.push(sectorData.readUInt32LE(i * 4));
171
+ }
172
+ }
173
+ return miniFat;
174
+ }
175
+ /**
176
+ * Read the mini stream from the root entry.
177
+ */
178
+ readMiniStream() {
179
+ const rootEntry = this.directories[0];
180
+ if (!rootEntry || rootEntry.size === 0) {
181
+ return Buffer.alloc(0);
182
+ }
183
+ // Mini stream is stored as a regular stream in the root entry
184
+ return this.readRegularStream(rootEntry.startSector, rootEntry.size);
185
+ }
186
+ /**
187
+ * Read all directory entries.
188
+ */
189
+ readDirectories() {
190
+ const directories = [];
191
+ const entriesPerSector = this.header.sectorSize / DIR_ENTRY_SIZE;
192
+ const sectorChain = this.getSectorChain(this.header.dirStartSector);
193
+ for (const sectorNum of sectorChain) {
194
+ const sectorData = this.readSector(sectorNum);
195
+ for (let i = 0; i < entriesPerSector; i++) {
196
+ const entryOffset = i * DIR_ENTRY_SIZE;
197
+ const entry = this.parseDirectoryEntry(sectorData.subarray(entryOffset, entryOffset + DIR_ENTRY_SIZE));
198
+ if (entry.type !== 0) {
199
+ directories.push(entry);
200
+ }
201
+ }
202
+ }
203
+ return directories;
204
+ }
205
+ /**
206
+ * Parse a single 128-byte directory entry.
207
+ */
208
+ parseDirectoryEntry(data) {
209
+ // Name is UTF-16LE, up to 64 bytes (32 chars), null-terminated
210
+ const nameLength = data.readUInt16LE(64);
211
+ const nameBytes = nameLength > 2 ? nameLength - 2 : 0;
212
+ const name = data.subarray(0, nameBytes).toString('utf16le');
213
+ // Entry type at offset 66 (1 byte)
214
+ const type = data.readUInt8(66);
215
+ // Starting sector at offset 116 (4 bytes)
216
+ const startSector = data.readUInt32LE(116);
217
+ // Size at offset 120 (8 bytes for v4, 4 bytes for v3)
218
+ // For v3, only first 4 bytes are used
219
+ const size = data.readUInt32LE(120);
220
+ return { name, type, startSector, size };
221
+ }
222
+ /**
223
+ * Find a directory entry by name.
224
+ */
225
+ findDirectoryEntry(name) {
226
+ return this.directories.find((d) => d.name.toLowerCase() === name.toLowerCase() && d.type === 2);
227
+ }
228
+ /**
229
+ * Read stream data from a directory entry.
230
+ */
231
+ readStreamData(entry) {
232
+ if (entry.size < this.header.miniStreamCutoff) {
233
+ return this.readMiniStreamData(entry.startSector, entry.size);
234
+ }
235
+ return this.readRegularStream(entry.startSector, entry.size);
236
+ }
237
+ /**
238
+ * Read a regular stream (>= 4096 bytes).
239
+ */
240
+ readRegularStream(startSector, size) {
241
+ const result = Buffer.alloc(size);
242
+ let offset = 0;
243
+ let sector = startSector;
244
+ while (sector !== ENDOFCHAIN && offset < size) {
245
+ const sectorData = this.readSector(sector);
246
+ const bytesToCopy = Math.min(this.header.sectorSize, size - offset);
247
+ sectorData.copy(result, offset, 0, bytesToCopy);
248
+ offset += bytesToCopy;
249
+ sector = this.fat[sector];
250
+ }
251
+ return result;
252
+ }
253
+ /**
254
+ * Read from mini stream (< 4096 bytes).
255
+ */
256
+ readMiniStreamData(startSector, size) {
257
+ const result = Buffer.alloc(size);
258
+ let offset = 0;
259
+ let sector = startSector;
260
+ while (sector !== ENDOFCHAIN && offset < size) {
261
+ const miniOffset = sector * this.header.miniSectorSize;
262
+ const bytesToCopy = Math.min(this.header.miniSectorSize, size - offset);
263
+ this.miniStream.copy(result, offset, miniOffset, miniOffset + bytesToCopy);
264
+ offset += bytesToCopy;
265
+ sector = this.miniFat[sector];
266
+ }
267
+ return result;
268
+ }
269
+ /**
270
+ * Read a sector by its index.
271
+ */
272
+ readSector(sectorNum) {
273
+ // Sectors start after the 512-byte header
274
+ const offset = HEADER_SIZE + sectorNum * this.header.sectorSize;
275
+ return this.buffer.subarray(offset, offset + this.header.sectorSize);
276
+ }
277
+ /**
278
+ * Get the chain of sectors for a stream.
279
+ */
280
+ getSectorChain(startSector) {
281
+ const chain = [];
282
+ let sector = startSector;
283
+ while (sector !== ENDOFCHAIN &&
284
+ sector !== FREESECT &&
285
+ sector !== FATSECT &&
286
+ sector !== DIFSECT) {
287
+ chain.push(sector);
288
+ sector = this.fat[sector];
289
+ // Safety check to prevent infinite loops
290
+ if (chain.length > 1000000) {
291
+ throw new Error('Sector chain too long, possible corruption');
292
+ }
293
+ }
294
+ return chain;
295
+ }
296
+ }
297
+ /**
298
+ * Read a stream from an OLE file.
299
+ */
300
+ export const readOleStream = (filePath, streamName = 'FileHeader') => {
301
+ const ole = new OleReader(filePath);
302
+ return ole.readStream(streamName);
303
+ };
304
+ //# sourceMappingURL=ole-reader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ole-reader.js","sourceRoot":"","sources":["../../../src/parsers/altium/ole-reader.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ /**
2
+ * Altium Record Parser
3
+ *
4
+ * Parses the binary FileHeader stream from Altium .SchDoc files
5
+ * into structured record objects.
6
+ *
7
+ * Based on the Python Altium-Schematic-Parser library parsing logic.
8
+ */
9
+ import type { AltiumRecord, AltiumSchematic } from './types.js';
10
+ /**
11
+ * Parse the FileHeader stream buffer into an AltiumSchematic structure.
12
+ *
13
+ * The stream format uses a 5-byte delimiter pattern: XXX\x00\x00|
14
+ * where XXX are 3 arbitrary bytes (length indicator).
15
+ */
16
+ export declare const parseRecords: (buffer: Buffer) => AltiumSchematic;
17
+ /**
18
+ * Find all records matching a key-value pair.
19
+ */
20
+ export declare const findRecords: (schematic: AltiumSchematic, key: string, value: string) => AltiumRecord[];
21
+ //# sourceMappingURL=record-parser.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"record-parser.d.ts","sourceRoot":"","sources":["../../../src/parsers/altium/record-parser.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAwEhE;;;;;GAKG;AACH,eAAO,MAAM,YAAY,GAAI,QAAQ,MAAM,KAAG,eA2B7C,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,WAAW,GACtB,WAAW,eAAe,EAC1B,KAAK,MAAM,EACX,OAAO,MAAM,KACZ,YAAY,EAmBd,CAAC"}
@@ -0,0 +1,117 @@
1
+ /**
2
+ * Altium Record Parser
3
+ *
4
+ * Parses the binary FileHeader stream from Altium .SchDoc files
5
+ * into structured record objects.
6
+ *
7
+ * Based on the Python Altium-Schematic-Parser library parsing logic.
8
+ */
9
+ /**
10
+ * Split buffer by the 5-byte delimiter pattern.
11
+ *
12
+ * The pattern is: XXX\x00\x00| where XXX are any 3 bytes
13
+ * We look for the \x00\x00| sequence and include the 3 bytes before it
14
+ */
15
+ const splitByDelimiter = (buffer) => {
16
+ const segments = [];
17
+ let start = 0;
18
+ for (let i = 0; i < buffer.length - 2; i++) {
19
+ // Look for \x00\x00|
20
+ if (buffer[i] === 0x00 &&
21
+ buffer[i + 1] === 0x00 &&
22
+ buffer[i + 2] === 0x7c // '|'
23
+ ) {
24
+ // The delimiter includes 3 bytes before \x00\x00|
25
+ // So we capture up to i-3 (or start if we're at the beginning)
26
+ const delimiterStart = Math.max(start, i - 3);
27
+ if (delimiterStart > start) {
28
+ segments.push(buffer.subarray(start, delimiterStart));
29
+ }
30
+ // Skip past the delimiter (3 bytes + \x00\x00|)
31
+ start = i + 3;
32
+ i = start - 1; // Will be incremented by loop
33
+ }
34
+ }
35
+ // Add the last segment
36
+ if (start < buffer.length) {
37
+ segments.push(buffer.subarray(start));
38
+ }
39
+ return segments;
40
+ };
41
+ /**
42
+ * Parse a single segment into a record object.
43
+ *
44
+ * Format: KEY=VALUE|KEY=VALUE|...
45
+ */
46
+ const parseSegment = (segment, index) => {
47
+ const record = { index };
48
+ // Convert to string, handling potential encoding issues
49
+ const str = segment.toString('utf-8');
50
+ // Split by pipe character
51
+ const pairs = str.split('|');
52
+ for (const pair of pairs) {
53
+ if (!pair)
54
+ continue;
55
+ // Split by first equals sign only (value may contain '=')
56
+ const eqIndex = pair.indexOf('=');
57
+ if (eqIndex === -1)
58
+ continue;
59
+ const key = pair.substring(0, eqIndex).trim();
60
+ const value = pair.substring(eqIndex + 1);
61
+ if (key) {
62
+ // Store with original key casing
63
+ record[key] = value;
64
+ }
65
+ }
66
+ return record;
67
+ };
68
+ /**
69
+ * Parse the FileHeader stream buffer into an AltiumSchematic structure.
70
+ *
71
+ * The stream format uses a 5-byte delimiter pattern: XXX\x00\x00|
72
+ * where XXX are 3 arbitrary bytes (length indicator).
73
+ */
74
+ export const parseRecords = (buffer) => {
75
+ // Skip first 5 bytes and last byte (as per Python implementation)
76
+ const trimmedBuffer = buffer.subarray(5, buffer.length - 1);
77
+ // Split by the delimiter pattern: .{3}\x00\x00|
78
+ // This pattern is: 3 bytes (length) + 2 null bytes + pipe
79
+ const segments = splitByDelimiter(trimmedBuffer);
80
+ // Parse each segment into a record
81
+ const datums = [];
82
+ for (let i = 0; i < segments.length; i++) {
83
+ const segment = segments[i];
84
+ if (segment.length === 0)
85
+ continue;
86
+ const record = parseSegment(segment, i);
87
+ if (Object.keys(record).length > 1) {
88
+ // Has more than just index
89
+ datums.push(record);
90
+ }
91
+ }
92
+ // Separate header records from other records
93
+ const header = datums.filter((d) => 'HEADER' in d);
94
+ const records = datums.filter((d) => 'RECORD' in d);
95
+ return { header, records };
96
+ };
97
+ /**
98
+ * Find all records matching a key-value pair.
99
+ */
100
+ export const findRecords = (schematic, key, value) => {
101
+ const found = [];
102
+ const searchRecord = (record) => {
103
+ if (record[key] === value) {
104
+ found.push(record);
105
+ }
106
+ if (record.children) {
107
+ for (const child of record.children) {
108
+ searchRecord(child);
109
+ }
110
+ }
111
+ };
112
+ for (const record of schematic.records) {
113
+ searchRecord(record);
114
+ }
115
+ return found;
116
+ };
117
+ //# sourceMappingURL=record-parser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"record-parser.js","sourceRoot":"","sources":["../../../src/parsers/altium/record-parser.ts"],"names":[],"mappings":"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"}