circuitscript 0.3.2 → 0.4.1

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 (147) hide show
  1. package/dist/cjs/BaseVisitor.js +394 -262
  2. package/dist/cjs/LexerDiagnosticListener.js +375 -0
  3. package/dist/cjs/{ComponentAnnotater.js → annotate/ComponentAnnotater.js} +29 -15
  4. package/dist/cjs/annotate/DefaultPostAnnotationCallback.js +126 -0
  5. package/dist/cjs/{RefdesAnnotationVisitor.js → annotate/RefdesAnnotationVisitor.js} +8 -82
  6. package/dist/cjs/annotate/utils.js +70 -0
  7. package/dist/cjs/antlr/CircuitScriptLexer.js +279 -286
  8. package/dist/cjs/antlr/CircuitScriptParser.js +1954 -3535
  9. package/dist/cjs/antlr/CircuitScriptParserVisitor.js +7 -0
  10. package/dist/cjs/cache/deserializer.js +34 -0
  11. package/dist/cjs/cache/hash.js +8 -0
  12. package/dist/cjs/cache/serializer.js +122 -0
  13. package/dist/cjs/cache/storage.js +45 -0
  14. package/dist/cjs/cache/types.js +4 -0
  15. package/dist/cjs/{environment.js → environment/environment.js} +18 -6
  16. package/dist/cjs/environment/esm-environment.js +21 -0
  17. package/dist/cjs/environment/helpers.js +8 -0
  18. package/dist/cjs/execute.js +49 -15
  19. package/dist/cjs/globals.js +9 -1
  20. package/dist/cjs/helpers.js +3 -485
  21. package/dist/cjs/importResolver.js +102 -0
  22. package/dist/cjs/index.js +12 -7
  23. package/dist/cjs/lexer.js +48 -12
  24. package/dist/cjs/main.js +14 -4
  25. package/dist/cjs/objects/ClassComponent.js +1 -1
  26. package/dist/cjs/objects/ExecutionScope.js +0 -1
  27. package/dist/cjs/objects/types.js +17 -1
  28. package/dist/cjs/parser.js +18 -4
  29. package/dist/cjs/pipeline.js +284 -0
  30. package/dist/cjs/regenerate-tests.js +4 -3
  31. package/dist/cjs/render/KiCadNetListOutputHandler.js +30 -0
  32. package/dist/cjs/render/PaperSizes.js +46 -0
  33. package/dist/cjs/{draw_symbols.js → render/draw_symbols.js} +58 -36
  34. package/dist/cjs/{export.js → render/export.js} +2 -2
  35. package/dist/cjs/{geometry.js → render/geometry.js} +5 -5
  36. package/dist/cjs/{graph.js → render/graph.js} +7 -7
  37. package/dist/cjs/{layout.js → render/layout.js} +8 -8
  38. package/dist/cjs/{render.js → render/render.js} +9 -8
  39. package/dist/cjs/rules-check/no-connect-on-connected-pin.js +1 -1
  40. package/dist/cjs/rules-check/unconnected-pins.js +1 -1
  41. package/dist/cjs/{SemanticTokenVisitor.js → semantic-tokens/SemanticTokenVisitor.js} +12 -14
  42. package/dist/cjs/semantic-tokens/getSemanticTokens.js +55 -0
  43. package/dist/cjs/sizing.js +2 -2
  44. package/dist/cjs/utils.js +2 -2
  45. package/dist/cjs/validate/SymbolValidatorResolveVisitor.js +6 -0
  46. package/dist/cjs/validate/SymbolValidatorVisitor.js +34 -39
  47. package/dist/cjs/validate/validateScript.js +54 -0
  48. package/dist/cjs/validate.js +5 -4
  49. package/dist/cjs/visitor.js +140 -204
  50. package/dist/esm/BaseVisitor.js +396 -264
  51. package/dist/esm/LexerDiagnosticListener.js +371 -0
  52. package/dist/esm/{ComponentAnnotater.js → annotate/ComponentAnnotater.js} +29 -15
  53. package/dist/esm/annotate/DefaultPostAnnotationCallback.js +122 -0
  54. package/dist/esm/{RefdesAnnotationVisitor.js → annotate/RefdesAnnotationVisitor.js} +8 -82
  55. package/dist/esm/annotate/utils.js +66 -0
  56. package/dist/esm/antlr/CircuitScriptLexer.js +279 -286
  57. package/dist/esm/antlr/CircuitScriptParser.js +1962 -3522
  58. package/dist/esm/antlr/{CircuitScriptVisitor.js → CircuitScriptParserVisitor.js} +14 -35
  59. package/dist/esm/cache/deserializer.js +30 -0
  60. package/dist/esm/cache/hash.js +4 -0
  61. package/dist/esm/cache/serializer.js +118 -0
  62. package/dist/esm/cache/storage.js +39 -0
  63. package/dist/esm/cache/types.js +1 -0
  64. package/dist/esm/{environment.js → environment/environment.js} +18 -6
  65. package/dist/esm/environment/esm-environment.js +17 -0
  66. package/dist/esm/environment/helpers.js +4 -0
  67. package/dist/esm/execute.js +49 -15
  68. package/dist/esm/globals.js +8 -0
  69. package/dist/esm/helpers.js +5 -474
  70. package/dist/esm/importResolver.js +96 -0
  71. package/dist/esm/index.js +12 -7
  72. package/dist/esm/lexer.js +51 -12
  73. package/dist/esm/main.js +13 -3
  74. package/dist/esm/objects/ClassComponent.js +1 -1
  75. package/dist/esm/objects/ExecutionScope.js +0 -1
  76. package/dist/esm/objects/types.js +21 -1
  77. package/dist/esm/parser.js +19 -5
  78. package/dist/esm/pipeline.js +276 -0
  79. package/dist/esm/regenerate-tests.js +3 -2
  80. package/dist/esm/render/KiCadNetListOutputHandler.js +20 -0
  81. package/dist/esm/render/PaperSizes.js +41 -0
  82. package/dist/esm/{draw_symbols.js → render/draw_symbols.js} +58 -36
  83. package/dist/esm/{export.js → render/export.js} +2 -2
  84. package/dist/esm/{geometry.js → render/geometry.js} +5 -5
  85. package/dist/esm/{graph.js → render/graph.js} +7 -7
  86. package/dist/esm/{layout.js → render/layout.js} +8 -8
  87. package/dist/esm/{render.js → render/render.js} +8 -7
  88. package/dist/esm/rules-check/no-connect-on-connected-pin.js +1 -1
  89. package/dist/esm/rules-check/unconnected-pins.js +1 -1
  90. package/dist/esm/{SemanticTokenVisitor.js → semantic-tokens/SemanticTokenVisitor.js} +12 -14
  91. package/dist/esm/semantic-tokens/getSemanticTokens.js +51 -0
  92. package/dist/esm/sizing.js +2 -2
  93. package/dist/esm/utils.js +2 -2
  94. package/dist/esm/validate/SymbolValidatorResolveVisitor.js +3 -0
  95. package/dist/esm/validate/SymbolValidatorVisitor.js +36 -41
  96. package/dist/esm/validate/validateScript.js +50 -0
  97. package/dist/esm/validate.js +4 -3
  98. package/dist/esm/visitor.js +142 -206
  99. package/dist/libs/std.cst +15 -19
  100. package/dist/types/BaseVisitor.d.ts +25 -18
  101. package/dist/types/BomGeneration.d.ts +1 -1
  102. package/dist/types/LexerDiagnosticListener.d.ts +85 -0
  103. package/dist/types/{ComponentAnnotater.d.ts → annotate/ComponentAnnotater.d.ts} +1 -1
  104. package/dist/types/annotate/DefaultPostAnnotationCallback.d.ts +7 -0
  105. package/dist/types/{RefdesAnnotationVisitor.d.ts → annotate/RefdesAnnotationVisitor.d.ts} +6 -8
  106. package/dist/types/annotate/utils.d.ts +6 -0
  107. package/dist/types/antlr/CircuitScriptLexer.d.ts +71 -70
  108. package/dist/types/antlr/CircuitScriptParser.d.ts +357 -515
  109. package/dist/types/antlr/{CircuitScriptVisitor.d.ts → CircuitScriptParserVisitor.d.ts} +27 -69
  110. package/dist/types/cache/deserializer.d.ts +5 -0
  111. package/dist/types/cache/hash.d.ts +1 -0
  112. package/dist/types/cache/serializer.d.ts +3 -0
  113. package/dist/types/cache/storage.d.ts +4 -0
  114. package/dist/types/cache/types.d.ts +20 -0
  115. package/dist/types/{environment.d.ts → environment/environment.d.ts} +5 -4
  116. package/dist/types/environment/esm-environment.d.ts +4 -0
  117. package/dist/types/environment/helpers.d.ts +2 -0
  118. package/dist/types/execute.d.ts +3 -2
  119. package/dist/types/globals.d.ts +1 -0
  120. package/dist/types/helpers.d.ts +31 -36
  121. package/dist/types/importResolver.d.ts +4 -0
  122. package/dist/types/index.d.ts +12 -7
  123. package/dist/types/lexer.d.ts +9 -5
  124. package/dist/types/objects/ClassComponent.d.ts +1 -1
  125. package/dist/types/objects/ExecutionScope.d.ts +1 -4
  126. package/dist/types/objects/types.d.ts +16 -2
  127. package/dist/types/parser.d.ts +9 -2
  128. package/dist/types/pipeline.d.ts +9 -0
  129. package/dist/types/render/KiCadNetListOutputHandler.d.ts +10 -0
  130. package/dist/types/render/PaperSizes.d.ts +12 -0
  131. package/dist/types/{draw_symbols.d.ts → render/draw_symbols.d.ts} +4 -4
  132. package/dist/types/{export.d.ts → render/export.d.ts} +1 -1
  133. package/dist/types/{geometry.d.ts → render/geometry.d.ts} +2 -2
  134. package/dist/types/{graph.d.ts → render/graph.d.ts} +6 -6
  135. package/dist/types/{layout.d.ts → render/layout.d.ts} +10 -10
  136. package/dist/types/{render.d.ts → render/render.d.ts} +1 -1
  137. package/dist/types/{SemanticTokenVisitor.d.ts → semantic-tokens/SemanticTokenVisitor.d.ts} +6 -6
  138. package/dist/types/semantic-tokens/getSemanticTokens.d.ts +6 -0
  139. package/dist/types/sizing.d.ts +1 -1
  140. package/dist/types/utils.d.ts +1 -1
  141. package/dist/types/validate/SymbolValidatorResolveVisitor.d.ts +3 -0
  142. package/dist/types/validate/SymbolValidatorVisitor.d.ts +8 -8
  143. package/dist/types/validate/validateScript.d.ts +3 -0
  144. package/dist/types/visitor.d.ts +8 -14
  145. package/libs/std.cst +15 -19
  146. package/package.json +3 -6
  147. package/dist/cjs/antlr/CircuitScriptVisitor.js +0 -7
@@ -3,29 +3,13 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
3
3
  return (mod && mod.__esModule) ? mod : { "default": mod };
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.getPaperSize = exports.isSupportedPaperSize = exports.PaperGridReferences = exports.pxToMM = exports.milsToMM = exports.UnitDimension = exports.detectJSModuleType = exports.KiCadNetListOutputHandler = exports.ParseOutputHandler = exports.renderScriptCustom = exports.renderScript = exports.validateScript = exports.ParseErrorStrategy = exports.getSemanticTokens = exports.prepareFile = exports.JSModuleType = void 0;
7
- const path_1 = __importDefault(require("path"));
8
- const pdfkit_1 = __importDefault(require("pdfkit"));
9
- const export_js_1 = require("./export.js");
10
- const layout_js_1 = require("./layout.js");
11
- const parser_js_1 = require("./parser.js");
12
- const render_js_1 = require("./render.js");
6
+ exports.milsToMM = exports.UnitDimension = exports.detectJSModuleType = exports.RefdesOutputType = exports.ParseErrorStrategy = exports.TokenErrorListener = exports.prepareFile = exports.JSModuleType = void 0;
13
7
  const utils_js_1 = require("./utils.js");
14
- const visitor_js_1 = require("./visitor.js");
15
- const SymbolValidatorVisitor_js_1 = require("./validate/SymbolValidatorVisitor.js");
16
- const SymbolValidatorResolveVisitor_js_1 = require("./validate/SymbolValidatorResolveVisitor.js");
17
8
  const antlr4ng_1 = require("antlr4ng");
18
9
  const lexer_js_1 = require("./lexer.js");
19
10
  const CircuitScriptParser_js_1 = require("./antlr/CircuitScriptParser.js");
20
- const SemanticTokenVisitor_js_1 = require("./SemanticTokenVisitor.js");
21
11
  const globals_js_1 = require("./globals.js");
22
- const Frame_js_1 = require("./objects/Frame.js");
23
12
  const big_js_1 = __importDefault(require("big.js"));
24
- const logger_js_1 = require("./logger.js");
25
- const graph_js_1 = require("./graph.js");
26
- const RefdesAnnotationVisitor_js_1 = require("./RefdesAnnotationVisitor.js");
27
- const rules_js_1 = require("./rules-check/rules.js");
28
- const BomGeneration_js_1 = require("./BomGeneration.js");
29
13
  var JSModuleType;
30
14
  (function (JSModuleType) {
31
15
  JSModuleType["CommonJs"] = "cjs";
@@ -47,59 +31,12 @@ function prepareFile(textData) {
47
31
  };
48
32
  }
49
33
  exports.prepareFile = prepareFile;
50
- async function getSemanticTokens(scriptData, options) {
51
- const { parser, lexer, tokens } = prepareFile(scriptData);
52
- const tree = parser.script();
53
- const visitor = new SemanticTokenVisitor_js_1.SemanticTokensVisitor(true, null, options.environment, lexer, scriptData);
54
- parser.removeErrorListeners();
55
- visitor.onImportFile = async (visitor, filePath, textData) => {
56
- let hasError = false;
57
- let hasParseError = false;
58
- if (textData !== null) {
59
- const { parser } = prepareFile(textData);
60
- const tree = parser.script();
61
- try {
62
- visitor.visit(tree);
63
- }
64
- catch (err) {
65
- console.log('Error while parsing: ', err);
66
- hasParseError = true;
67
- hasError = true;
68
- throw new utils_js_1.ParseError(`Error parsing semantic tokens in imported file: ${err}`);
69
- }
70
- }
71
- else {
72
- console.log('File does not exist');
73
- hasError = true;
74
- }
75
- return {
76
- hasError, hasParseError
77
- };
78
- };
79
- await visitor.visitAsync(tree);
80
- const semanticTokens = visitor.getTokens();
81
- const parsedTokens = (0, SemanticTokenVisitor_js_1.prepareTokens)(tokens.getTokens(), lexer, scriptData);
82
- const finalParsedTokens = [];
83
- parsedTokens.forEach(token => {
84
- const location = `${token.line}_${token.column}_${token.length}`;
85
- if (semanticTokens.has(location)) {
86
- finalParsedTokens.push(semanticTokens.get(location));
87
- }
88
- else {
89
- finalParsedTokens.push(token);
90
- }
91
- });
92
- return {
93
- visitor,
94
- parsedTokens: finalParsedTokens
95
- };
96
- }
97
- exports.getSemanticTokens = getSemanticTokens;
98
34
  class TokenErrorListener extends antlr4ng_1.BaseErrorListener {
99
35
  syntaxError(recognizer, offendingSymbol, line, column, msg, e) {
100
36
  console.log(msg);
101
37
  }
102
38
  }
39
+ exports.TokenErrorListener = TokenErrorListener;
103
40
  class ParseErrorStrategy extends antlr4ng_1.DefaultErrorStrategy {
104
41
  reportUnwantedToken(recognizer) {
105
42
  if (this.inErrorRecoveryMode(recognizer)) {
@@ -114,385 +51,12 @@ class ParseErrorStrategy extends antlr4ng_1.DefaultErrorStrategy {
114
51
  }
115
52
  }
116
53
  exports.ParseErrorStrategy = ParseErrorStrategy;
117
- async function validateScript(filePath, scriptData, options) {
118
- const { parser } = prepareFile(scriptData);
119
- parser.removeErrorListeners();
120
- parser.errorHandler = new ParseErrorStrategy();
121
- parser.addErrorListener(new TokenErrorListener());
122
- const tree = parser.script();
123
- const visitor = new SymbolValidatorVisitor_js_1.SymbolValidatorVisitor(true, null, options.environment);
124
- visitor.enterFile(filePath);
125
- visitor.onImportFile = async (visitor, filePath, textData) => {
126
- visitor.enterFile(filePath);
127
- let hasError = false;
128
- let hasParseError = false;
129
- if (textData !== null) {
130
- const { parser } = prepareFile(textData);
131
- const tree = parser.script();
132
- try {
133
- await visitor.visitAsync(tree);
134
- visitor.exitFile();
135
- }
136
- catch (err) {
137
- console.log('got an error while parsing tree: ', err);
138
- hasParseError = true;
139
- hasError = true;
140
- throw new utils_js_1.ParseError(`Error parsing validation in imported file: ${err}`);
141
- }
142
- }
143
- else {
144
- console.log('file does not exist!');
145
- hasError = true;
146
- }
147
- return {
148
- hasError, hasParseError
149
- };
150
- };
151
- await visitor.visitAsync(tree);
152
- const symbolTable = visitor.getSymbols();
153
- symbolTable.clearUndefined();
154
- const visitorResolver = new SymbolValidatorResolveVisitor_js_1.SymbolValidatorResolveVisitor(true, null, options.environment);
155
- visitorResolver.enterFile(filePath);
156
- visitorResolver.setSymbols(visitor.getSymbols());
157
- visitorResolver.onImportFile = visitor.onImportFile;
158
- await visitorResolver.visitAsync(tree);
159
- return visitorResolver;
160
- }
161
- exports.validateScript = validateScript;
162
- async function DefaultPostAnnotationCallback(options, scriptData, tree, tokens, componentLinks, importedLibraries, environment) {
163
- const { inputPath = null, updateSource = false, saveAnnotatedCopy = undefined, } = options;
164
- if (inputPath && (updateSource || saveAnnotatedCopy !== undefined)) {
165
- const sourceAnnotatedFiles = [{
166
- isMainFile: true,
167
- scriptData,
168
- tokens,
169
- tree,
170
- filePath: inputPath,
171
- outputType: RefdesOutputType.WithSource
172
- }];
173
- const externalRefdesLibraries = [];
174
- for (const library of importedLibraries) {
175
- let outputType = RefdesOutputType.None;
176
- if (library.enableRefdesAnnotation) {
177
- outputType = RefdesOutputType.WithSource;
178
- }
179
- else if (library.enableRefdesAnnotationFile) {
180
- outputType = RefdesOutputType.CreateExternalFile;
181
- }
182
- if (outputType !== RefdesOutputType.None) {
183
- const { libraryFilePath, libraryName, tokens: libTokens, tree: libTree } = library;
184
- const libraryScriptData = await environment.readFile(libraryFilePath, { encoding: 'utf8' });
185
- const annotatedFile = {
186
- tokens: libTokens,
187
- tree: libTree,
188
- filePath: libraryFilePath,
189
- scriptData: libraryScriptData,
190
- libraryName,
191
- outputType
192
- };
193
- if (outputType === RefdesOutputType.CreateExternalFile) {
194
- externalRefdesLibraries.push(annotatedFile);
195
- }
196
- else {
197
- sourceAnnotatedFiles.push(annotatedFile);
198
- }
199
- }
200
- }
201
- for (const item of sourceAnnotatedFiles) {
202
- const { scriptData, tokens, tree, filePath, libraryName, isMainFile = false } = item;
203
- const tmpVisitor = new RefdesAnnotationVisitor_js_1.RefdesAnnotationVisitor(true, scriptData, tokens, componentLinks);
204
- await tmpVisitor.visit(tree);
205
- let usePath = filePath;
206
- if (isMainFile && saveAnnotatedCopy === true) {
207
- const dir = environment.dirname(filePath);
208
- const ext = environment.extname(filePath);
209
- const basename = environment.basename(filePath, ext);
210
- usePath = environment.join(dir, `${basename}.annotated${ext}`);
211
- }
212
- else if (isMainFile && typeof saveAnnotatedCopy === 'string') {
213
- usePath = saveAnnotatedCopy;
214
- }
215
- environment.writeFileSync(usePath, tmpVisitor.getOutput());
216
- let display = 'Refdes annotations';
217
- if (libraryName) {
218
- display += ` for library ${libraryName}`;
219
- }
220
- console.log(`${display} saved to ${usePath}`);
221
- }
222
- if (externalRefdesLibraries.length > 0) {
223
- const inputDir = environment.dirname(inputPath);
224
- const inputExt = environment.extname(inputPath);
225
- const inputBasename = environment.basename(inputPath, inputExt);
226
- const refdesFilePath = environment.join(inputDir, `${inputBasename}${globals_js_1.RefdesFileSuffix}`);
227
- const libraries = [];
228
- for (const item of externalRefdesLibraries) {
229
- const { scriptData, tokens, tree, filePath, libraryName } = item;
230
- const tmpVisitor = new RefdesAnnotationVisitor_js_1.RefdesAnnotationVisitor(true, scriptData, tokens, componentLinks);
231
- await tmpVisitor.visit(tree);
232
- const output = tmpVisitor.getOutputForExternalRefdesFile();
233
- const relativeFilePath = environment.relative(inputDir, filePath);
234
- libraries.push({
235
- name: libraryName,
236
- path: relativeFilePath,
237
- items: output,
238
- });
239
- }
240
- const sortedLibs = libraries.sort((a, b) => {
241
- return a.name.localeCompare(b.name);
242
- });
243
- const jsonFile = {
244
- format: 'v1',
245
- description: 'Stores external refdes for libraries',
246
- libraries: sortedLibs,
247
- };
248
- environment.writeFileSync(refdesFilePath, JSON.stringify(jsonFile, null, 4));
249
- console.log(`External refdes annotations saved to ${refdesFilePath}`);
250
- }
251
- }
252
- }
253
54
  var RefdesOutputType;
254
55
  (function (RefdesOutputType) {
255
56
  RefdesOutputType["None"] = "none";
256
57
  RefdesOutputType["WithSource"] = "with-source";
257
58
  RefdesOutputType["CreateExternalFile"] = "create-external-file";
258
- })(RefdesOutputType || (RefdesOutputType = {}));
259
- async function renderScript(scriptData, outputPath, options) {
260
- const parseHandlers = [
261
- new KiCadNetListOutputHandler(),
262
- ];
263
- return renderScriptCustom(scriptData, outputPath, options, parseHandlers, [DefaultPostAnnotationCallback]);
264
- }
265
- exports.renderScript = renderScript;
266
- async function renderScriptCustom(scriptData, outputPath, options, parseHandlers, postAnnotationCallbacks) {
267
- const { dumpNets = false, dumpData = false, showStats = false, enableErc = false, enableBom = false, inputPath = '', bomOutputPath = undefined, environment } = options;
268
- const errors = [];
269
- const onErrorHandler = (message, context, error) => {
270
- if (error && error instanceof utils_js_1.RuntimeExecutionError) {
271
- errors.push(error);
272
- }
273
- else if (error && error instanceof antlr4ng_1.RecognitionException) {
274
- if (context !== null) {
275
- errors.push(new utils_js_1.ParseSyntaxError(message, context.start, context.stop));
276
- }
277
- else {
278
- if (error.recognizer) {
279
- const recognizer = error.recognizer;
280
- errors.push(new utils_js_1.ParseSyntaxError(message, {
281
- line: recognizer.currentTokenStartLine,
282
- column: recognizer.currentTokenColumn
283
- }));
284
- }
285
- else {
286
- errors.push(new utils_js_1.ParseSyntaxError(message));
287
- }
288
- }
289
- }
290
- else {
291
- errors.push(new utils_js_1.ParseError(message, context.start, context.stop));
292
- }
293
- };
294
- environment.setCurrentFile(inputPath);
295
- const visitor = new visitor_js_1.ParserVisitor(true, onErrorHandler, environment);
296
- visitor.onImportFile = async (visitor, filePath, fileData) => {
297
- visitor.enterFile(filePath);
298
- const { hasError, hasParseError, throwError, tree, tokens } = await (0, parser_js_1.parseFileWithVisitor)(visitor, fileData);
299
- visitor.exitFile();
300
- if (hasError || hasParseError) {
301
- let importErrorMsg = "";
302
- if (throwError) {
303
- importErrorMsg = ": " + throwError.message;
304
- }
305
- throw new utils_js_1.ParseError(`Error parsing imported file: ${filePath}${importErrorMsg}`, undefined, undefined, filePath);
306
- }
307
- return { hasError, hasParseError, tree, tokens };
308
- };
309
- visitor.log('reading file');
310
- visitor.log('done reading file');
311
- const dumpDirectory = environment.getRelativeToModule('/dump/');
312
- if (dumpData) {
313
- console.log('Dump data to:', dumpDirectory);
314
- if (!environment.existsSync(dumpDirectory)) {
315
- environment.mkdirSync(dumpDirectory);
316
- }
317
- }
318
- if (inputPath !== '') {
319
- visitor.enterFile(inputPath);
320
- }
321
- const { tree, parser, tokens, parserTimeTaken, lexerTimeTaken, throwError } = await (0, parser_js_1.parseFileWithVisitor)(visitor, scriptData);
322
- (0, utils_js_1.printWarnings)(visitor.getWarnings());
323
- showStats && console.log('Lexing took:', lexerTimeTaken);
324
- showStats && console.log('Parsing took:', parserTimeTaken);
325
- try {
326
- visitor.annotateComponents();
327
- }
328
- catch (err) {
329
- throw new utils_js_1.RenderError(`Error during component annotation: ${err}`, 'annotation');
330
- }
331
- const componentLinks = visitor.getComponentCtxLinks();
332
- const importedLibraries = Array.from(visitor.getScope().libraries.values());
333
- for (let i = 0; i < postAnnotationCallbacks.length; i++) {
334
- await postAnnotationCallbacks[i](options, scriptData, tree, tokens, componentLinks, importedLibraries, environment);
335
- }
336
- if (dumpNets) {
337
- const nets = visitor.dumpNets();
338
- nets.forEach(item => console.log(item.join(" | ")));
339
- }
340
- dumpData && environment.writeFileSync(dumpDirectory + 'tree.lisp', tree.toStringTree(null, parser));
341
- dumpData && environment.writeFileSync(dumpDirectory + 'raw-parser.txt', visitor.logger.dump());
342
- if (throwError) {
343
- throw throwError;
344
- }
345
- let svgOutput = "";
346
- if (errors.length === 0) {
347
- const { frameComponent } = visitor.applySheetFrameComponent();
348
- const { sequence, nets } = visitor.getGraph();
349
- if (enableBom && bomOutputPath) {
350
- const documentVariable = visitor.getScope().variables.get('document');
351
- const bomConfig = documentVariable.bom;
352
- const bomData = (0, BomGeneration_js_1.generateBom)(bomConfig, visitor.getScope().getInstances());
353
- const bomCsvOutput = (0, BomGeneration_js_1.generateBomCSV)(bomData);
354
- await (0, BomGeneration_js_1.saveBomOutputCsv)(environment, bomCsvOutput, bomOutputPath);
355
- console.log('Generated BOM file', bomOutputPath);
356
- }
357
- const tmpSequence = (0, utils_js_1.generateDebugSequenceAction)(sequence).map(item => (0, utils_js_1.sequenceActionString)(item));
358
- dumpData && environment.writeFileSync(dumpDirectory + 'raw-sequence.txt', tmpSequence.join('\n'));
359
- try {
360
- let fileExtension = null;
361
- let outputDefaultZoom = globals_js_1.defaultZoomScale;
362
- if (outputPath) {
363
- fileExtension = path_1.default.extname(outputPath).substring(1);
364
- }
365
- for (let i = 0; i < parseHandlers.length; i++) {
366
- const handler = parseHandlers[i];
367
- if (handler.beforeRender) {
368
- const keepParsing = handler.parse(visitor, outputPath, fileExtension);
369
- if (!keepParsing) {
370
- return {
371
- svgOutput: null,
372
- errors
373
- };
374
- }
375
- }
376
- }
377
- const logger = new logger_js_1.Logger();
378
- const graphEngine = new graph_js_1.NetGraph(logger);
379
- const layoutEngine = new layout_js_1.LayoutEngine(logger);
380
- const layoutTimer = new utils_js_1.SimpleStopwatch();
381
- let sheetFrames;
382
- try {
383
- const { graph, containerFrames } = graphEngine.generateLayoutGraph(sequence, nets);
384
- sheetFrames = layoutEngine.runLayout(graph, containerFrames, nets);
385
- if (enableErc) {
386
- const ercResults = (0, rules_js_1.EvaluateERCRules)(visitor, graph, nets);
387
- if (ercResults.length > 0) {
388
- console.log(`ERC found ${ercResults.length} items:`);
389
- ercResults.forEach((item, index) => {
390
- console.log(`${(index + 1).toString().padStart(3)}. line ${item.start.line}, column ${item.start.column}: ${item.type} - ${item.message}`);
391
- });
392
- }
393
- else {
394
- console.log('No ERC issues found');
395
- }
396
- }
397
- }
398
- catch (err) {
399
- throw new utils_js_1.RenderError(`Error during layout generation: ${err}`, 'layout');
400
- }
401
- layoutEngine.printWarnings();
402
- showStats && console.log('Layout took:', layoutTimer.lap());
403
- dumpData && environment.writeFileSync(dumpDirectory + 'raw-layout.txt', layoutEngine.logger.dump());
404
- const generateSvgTimer = new utils_js_1.SimpleStopwatch();
405
- const renderLogger = new logger_js_1.Logger();
406
- let svgCanvas;
407
- try {
408
- svgCanvas = (0, render_js_1.renderSheetsToSVG)(sheetFrames, renderLogger);
409
- }
410
- catch (err) {
411
- throw new utils_js_1.RenderError(`Error during SVG generation: ${err}`, 'svg_generation');
412
- }
413
- showStats && console.log('Render took:', generateSvgTimer.lap());
414
- dumpData && environment.writeFileSync(dumpDirectory + 'raw-render.txt', renderLogger.dump());
415
- try {
416
- if (fileExtension === "pdf") {
417
- outputDefaultZoom = 1;
418
- }
419
- svgOutput = (0, render_js_1.generateSvgOutput)(svgCanvas, outputDefaultZoom);
420
- }
421
- catch (err) {
422
- throw new utils_js_1.RenderError(`Error generating SVG output: ${err}`, 'svg_output');
423
- }
424
- if (outputPath) {
425
- if (fileExtension === 'svg') {
426
- try {
427
- environment.writeFileSync(outputPath, svgOutput);
428
- }
429
- catch (err) {
430
- throw new utils_js_1.RenderError(`Error writing SVG file: ${err}`, 'file_output');
431
- }
432
- }
433
- else if (fileExtension === 'pdf') {
434
- let sheetSize = "A4";
435
- let sheetSizeDefined = false;
436
- if (frameComponent) {
437
- sheetSize = frameComponent.getParam(Frame_js_1.FrameParamKeys.PaperSize);
438
- sheetSizeDefined = true;
439
- }
440
- try {
441
- const doc = new pdfkit_1.default({
442
- layout: 'landscape',
443
- size: sheetSize
444
- });
445
- const outputStream = environment.createWriteStream(outputPath);
446
- (0, render_js_1.generatePdfOutput)(doc, svgCanvas, sheetSize, sheetSizeDefined, outputDefaultZoom);
447
- doc.pipe(outputStream);
448
- doc.end();
449
- }
450
- catch (err) {
451
- throw new utils_js_1.RenderError(`Error generating PDF file: ${err}`, 'pdf_output');
452
- }
453
- }
454
- else {
455
- throw new utils_js_1.RenderError(`Invalid output format: ${fileExtension}`, 'file_output');
456
- }
457
- console.log('Generated file', outputPath);
458
- }
459
- }
460
- catch (err) {
461
- throw new utils_js_1.RenderError(`Error during rendering: ${err}`, 'output_generation');
462
- }
463
- }
464
- return {
465
- svgOutput,
466
- errors
467
- };
468
- }
469
- exports.renderScriptCustom = renderScriptCustom;
470
- class ParseOutputHandler {
471
- constructor() {
472
- this.beforeRender = false;
473
- this.afterRender = false;
474
- }
475
- }
476
- exports.ParseOutputHandler = ParseOutputHandler;
477
- class KiCadNetListOutputHandler extends ParseOutputHandler {
478
- constructor() {
479
- super(...arguments);
480
- this.beforeRender = true;
481
- }
482
- parse(visitor, outputPath, fileExtension) {
483
- if (outputPath !== null && fileExtension === "net") {
484
- const { tree: kiCadNetList, missingFootprints } = (0, export_js_1.generateKiCadNetList)(visitor.getNetList());
485
- missingFootprints.forEach(entry => {
486
- console.log(`${entry.refdes} (${entry.instanceName}) does not have footprint`);
487
- });
488
- visitor.environment.writeFileSync(outputPath, (0, export_js_1.printTree)(kiCadNetList));
489
- console.log('Generated file', outputPath);
490
- return false;
491
- }
492
- return true;
493
- }
494
- }
495
- exports.KiCadNetListOutputHandler = KiCadNetListOutputHandler;
59
+ })(RefdesOutputType || (exports.RefdesOutputType = RefdesOutputType = {}));
496
60
  function detectJSModuleType() {
497
61
  if (typeof __filename === 'undefined' &&
498
62
  typeof __dirname === 'undefined') {
@@ -536,49 +100,3 @@ function milsToMM(value) {
536
100
  return (0, utils_js_1.resolveToNumericValue)(value.toBigNumber().mul(new big_js_1.default(globals_js_1.MilsToMM)).round(6));
537
101
  }
538
102
  exports.milsToMM = milsToMM;
539
- function pxToMM(value) {
540
- return value * globals_js_1.PxToMM;
541
- }
542
- exports.pxToMM = pxToMM;
543
- const PaperSizes = {
544
- 'A0': [1189, 841],
545
- 'A1': [841, 594],
546
- 'A2': [594, 420],
547
- 'A3': [420, 297],
548
- 'A4': [297, 210],
549
- 'A5': [210, 148],
550
- 'A6': [148, 105],
551
- };
552
- exports.PaperGridReferences = {
553
- 'A0': [16, 24],
554
- 'A1': [12, 16],
555
- 'A2': [8, 12],
556
- 'A3': [6, 8],
557
- 'A4': [4, 6],
558
- };
559
- function isSupportedPaperSize(type) {
560
- if (PaperSizes[type]) {
561
- return true;
562
- }
563
- return false;
564
- }
565
- exports.isSupportedPaperSize = isSupportedPaperSize;
566
- function getPaperSize(type, margin = globals_js_1.defaultPageMarginMM) {
567
- if (PaperSizes[type]) {
568
- const [width, height] = PaperSizes[type];
569
- const useWidth = width - margin * 2;
570
- const useHeight = height - margin * 2;
571
- return {
572
- width: Math.floor(useWidth * (1 / globals_js_1.MilsToMM)),
573
- height: Math.floor(useHeight * (1 / globals_js_1.MilsToMM)),
574
- widthMM: useWidth,
575
- heightMM: useHeight,
576
- originalWidthMM: width,
577
- originalHeightMM: height,
578
- };
579
- }
580
- else {
581
- return getPaperSize('A4');
582
- }
583
- }
584
- exports.getPaperSize = getPaperSize;
@@ -0,0 +1,102 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.loadImportsIntoMemoryStore = exports.resolveAllImportFilepaths = exports.extractImportNames = void 0;
4
+ const IMPORT_SIMPLE_RE = /^import\s+"([^"]+)"/;
5
+ const IMPORT_FROM_RE = /^from\s+"([^"]*)"\s+import\b/;
6
+ function extractImportNames(fileData) {
7
+ const names = [];
8
+ for (const rawLine of fileData.split('\n')) {
9
+ const line = rawLine.trim();
10
+ if (line === '' || line.startsWith('//') || line.startsWith('#'))
11
+ continue;
12
+ const simple = IMPORT_SIMPLE_RE.exec(line);
13
+ if (simple) {
14
+ names.push(simple[1]);
15
+ continue;
16
+ }
17
+ const from = IMPORT_FROM_RE.exec(line);
18
+ if (from) {
19
+ names.push(from[1]);
20
+ continue;
21
+ }
22
+ break;
23
+ }
24
+ return names;
25
+ }
26
+ exports.extractImportNames = extractImportNames;
27
+ async function resolveImportPath(name, environment) {
28
+ let useName = name;
29
+ if (!name.endsWith('.cst')) {
30
+ useName = name + '.cst';
31
+ }
32
+ const absPath = environment.getAbsPathRelativeToCurrentFolder(useName);
33
+ const executionDirectory = environment.getCurrentDirectory();
34
+ const relPath = environment.relative(executionDirectory, absPath);
35
+ if (await environment.exists(relPath)) {
36
+ return relPath;
37
+ }
38
+ const libPath = environment.getRelativeToDefaultLibs(useName);
39
+ if (await environment.exists(libPath)) {
40
+ return libPath;
41
+ }
42
+ return null;
43
+ }
44
+ async function resolveAllImportFilepaths(rootFilePath, scriptData, environment) {
45
+ const visited = new Set();
46
+ const result = [];
47
+ async function walk(filePath, passedInScriptData) {
48
+ if (filePath !== undefined && filePath !== null && filePath !== '') {
49
+ if (visited.has(filePath))
50
+ return;
51
+ visited.add(filePath);
52
+ }
53
+ let fileData;
54
+ if (passedInScriptData === undefined || passedInScriptData === null) {
55
+ try {
56
+ fileData = await environment.readFile(filePath, { encoding: 'utf8' });
57
+ }
58
+ catch {
59
+ return;
60
+ }
61
+ }
62
+ else {
63
+ fileData = passedInScriptData;
64
+ }
65
+ if (fileData) {
66
+ const importNames = extractImportNames(fileData);
67
+ const savedFile = environment.getCurrentFile();
68
+ if (filePath) {
69
+ environment.setCurrentFile(filePath);
70
+ }
71
+ for (const name of importNames) {
72
+ const resolvedPath = await resolveImportPath(name, environment);
73
+ if (resolvedPath) {
74
+ result.push(resolvedPath);
75
+ await walk(resolvedPath);
76
+ }
77
+ }
78
+ if (filePath) {
79
+ environment.setCurrentFile(savedFile);
80
+ }
81
+ }
82
+ }
83
+ await walk(rootFilePath, scriptData);
84
+ const uniqueResults = new Set(result);
85
+ return Array.from(uniqueResults);
86
+ }
87
+ exports.resolveAllImportFilepaths = resolveAllImportFilepaths;
88
+ async function loadImportsIntoMemoryStore(filepaths, environment) {
89
+ const store = new Map();
90
+ for (const filePath of filepaths) {
91
+ if (store.has(filePath))
92
+ continue;
93
+ try {
94
+ const content = await environment.readFile(filePath, { encoding: 'utf8' });
95
+ store.set(filePath, content);
96
+ }
97
+ catch {
98
+ }
99
+ }
100
+ return store;
101
+ }
102
+ exports.loadImportsIntoMemoryStore = loadImportsIntoMemoryStore;
package/dist/cjs/index.js CHANGED
@@ -14,17 +14,20 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
14
  for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
15
  };
16
16
  Object.defineProperty(exports, "__esModule", { value: true });
17
- __exportStar(require("./draw_symbols.js"), exports);
17
+ __exportStar(require("./render/draw_symbols.js"), exports);
18
18
  __exportStar(require("./execute.js"), exports);
19
- __exportStar(require("./export.js"), exports);
20
- __exportStar(require("./geometry.js"), exports);
19
+ __exportStar(require("./render/export.js"), exports);
20
+ __exportStar(require("./render/geometry.js"), exports);
21
+ __exportStar(require("./pipeline.js"), exports);
21
22
  __exportStar(require("./globals.js"), exports);
22
23
  __exportStar(require("./helpers.js"), exports);
23
- __exportStar(require("./layout.js"), exports);
24
+ __exportStar(require("./render/layout.js"), exports);
25
+ __exportStar(require("./render/render.js"), exports);
26
+ __exportStar(require("./render/KiCadNetListOutputHandler.js"), exports);
24
27
  __exportStar(require("./lexer.js"), exports);
28
+ __exportStar(require("./LexerDiagnosticListener.js"), exports);
25
29
  __exportStar(require("./logger.js"), exports);
26
30
  __exportStar(require("./parser.js"), exports);
27
- __exportStar(require("./render.js"), exports);
28
31
  __exportStar(require("./utils.js"), exports);
29
32
  __exportStar(require("./visitor.js"), exports);
30
33
  __exportStar(require("./sizing.js"), exports);
@@ -33,5 +36,7 @@ __exportStar(require("./builtinMethods.js"), exports);
33
36
  __exportStar(require("./validate/SymbolTable.js"), exports);
34
37
  __exportStar(require("./validate/SymbolValidatorResolveVisitor.js"), exports);
35
38
  __exportStar(require("./validate/SymbolValidatorVisitor.js"), exports);
36
- __exportStar(require("./environment.js"), exports);
37
- __exportStar(require("./RefdesAnnotationVisitor.js"), exports);
39
+ __exportStar(require("./validate/validateScript.js"), exports);
40
+ __exportStar(require("./environment/environment.js"), exports);
41
+ __exportStar(require("./annotate/RefdesAnnotationVisitor.js"), exports);
42
+ __exportStar(require("./semantic-tokens/getSemanticTokens.js"), exports);