@apexdevtools/apex-parser 5.0.0 → 5.1.0-beta.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 (79) hide show
  1. package/CHANGELOG.md +12 -0
  2. package/README.md +55 -4
  3. package/dist/browser/apex-parser.mjs +64579 -0
  4. package/dist/browser/apex-parser.mjs.map +1 -0
  5. package/dist/browser/apex-parser.umd.js +64784 -0
  6. package/dist/browser/apex-parser.umd.js.map +1 -0
  7. package/dist/cjs/ApexErrorListener.cjs +31 -0
  8. package/dist/cjs/ApexErrorListener.cjs.map +1 -0
  9. package/dist/cjs/ApexParserFactory.cjs +83 -0
  10. package/dist/cjs/ApexParserFactory.cjs.map +1 -0
  11. package/dist/cjs/CaseInsensitiveInputStream.cjs +30 -0
  12. package/dist/cjs/CaseInsensitiveInputStream.cjs.map +1 -0
  13. package/dist/cjs/Check.cjs +172 -0
  14. package/dist/cjs/Check.cjs.map +1 -0
  15. package/dist/cjs/antlr/ApexLexer.cjs +23244 -0
  16. package/dist/cjs/antlr/ApexLexer.cjs.map +1 -0
  17. package/dist/cjs/antlr/ApexParser.cjs +38369 -0
  18. package/dist/cjs/antlr/ApexParser.cjs.map +1 -0
  19. package/dist/cjs/antlr/ApexParserListener.cjs +1915 -0
  20. package/dist/cjs/antlr/ApexParserListener.cjs.map +1 -0
  21. package/dist/cjs/antlr/ApexParserVisitor.cjs +1147 -0
  22. package/dist/cjs/antlr/ApexParserVisitor.cjs.map +1 -0
  23. package/dist/cjs/index.cjs +214 -0
  24. package/dist/cjs/index.cjs.map +1 -0
  25. package/dist/esm/ApexErrorListener.js +27 -0
  26. package/dist/esm/ApexErrorListener.js.map +1 -0
  27. package/dist/esm/ApexParserFactory.js +78 -0
  28. package/dist/esm/ApexParserFactory.js.map +1 -0
  29. package/dist/esm/CaseInsensitiveInputStream.js +28 -0
  30. package/dist/esm/CaseInsensitiveInputStream.js.map +1 -0
  31. package/dist/esm/Check.js +169 -0
  32. package/dist/esm/Check.js.map +1 -0
  33. package/dist/esm/antlr/ApexLexer.js +23240 -0
  34. package/dist/esm/antlr/ApexLexer.js.map +1 -0
  35. package/dist/esm/antlr/ApexParser.js +38179 -0
  36. package/dist/esm/antlr/ApexParser.js.map +1 -0
  37. package/dist/esm/antlr/ApexParserListener.js +1911 -0
  38. package/dist/esm/antlr/ApexParserListener.js.map +1 -0
  39. package/dist/esm/antlr/ApexParserVisitor.js +1143 -0
  40. package/dist/esm/antlr/ApexParserVisitor.js.map +1 -0
  41. package/dist/esm/index.js +9 -0
  42. package/dist/esm/index.js.map +1 -0
  43. package/dist/types/ApexErrorListener.d.cts +26 -0
  44. package/dist/{src → types}/ApexErrorListener.d.ts +4 -3
  45. package/dist/types/ApexParserFactory.d.cts +81 -0
  46. package/dist/{src → types}/ApexParserFactory.d.ts +12 -0
  47. package/dist/types/CaseInsensitiveInputStream.d.ts +14 -0
  48. package/dist/types/Check.d.ts +36 -0
  49. package/dist/types/antlr/ApexLexer.d.cts +275 -0
  50. package/dist/{src → types}/antlr/ApexLexer.d.ts +54 -53
  51. package/dist/types/antlr/ApexParser.d.cts +3126 -0
  52. package/dist/{src → types}/antlr/ApexParser.d.ts +113 -85
  53. package/dist/{src/antlr/ApexParserListener.js → types/antlr/ApexParserListener.d.cts} +568 -366
  54. package/dist/{src → types}/antlr/ApexParserListener.d.ts +22 -0
  55. package/dist/{src/antlr/ApexParserVisitor.js → types/antlr/ApexParserVisitor.d.cts} +379 -185
  56. package/dist/{src → types}/antlr/ApexParserVisitor.d.ts +14 -0
  57. package/dist/types/index.browser.d.cts +8 -0
  58. package/dist/types/index.browser.d.ts +8 -0
  59. package/dist/types/index.d.ts +9 -0
  60. package/package.json +89 -21
  61. package/dist/src/ApexErrorListener.js +0 -61
  62. package/dist/src/ApexErrorListener.js.map +0 -1
  63. package/dist/src/ApexParserFactory.js +0 -116
  64. package/dist/src/ApexParserFactory.js.map +0 -1
  65. package/dist/src/CaseInsensitiveInputStream.js +0 -64
  66. package/dist/src/CaseInsensitiveInputStream.js.map +0 -1
  67. package/dist/src/Check.js +0 -205
  68. package/dist/src/Check.js.map +0 -1
  69. package/dist/src/antlr/ApexLexer.js +0 -1573
  70. package/dist/src/antlr/ApexLexer.js.map +0 -1
  71. package/dist/src/antlr/ApexParser.js +0 -20786
  72. package/dist/src/antlr/ApexParser.js.map +0 -1
  73. package/dist/src/antlr/ApexParserListener.js.map +0 -1
  74. package/dist/src/antlr/ApexParserVisitor.js.map +0 -1
  75. package/dist/src/index.js +0 -37
  76. package/dist/src/index.js.map +0 -1
  77. /package/dist/{src/CaseInsensitiveInputStream.d.ts → types/CaseInsensitiveInputStream.d.cts} +0 -0
  78. /package/dist/{src/Check.d.ts → types/Check.d.cts} +0 -0
  79. /package/dist/{src/index.d.ts → types/index.d.cts} +0 -0
@@ -0,0 +1,31 @@
1
+ 'use strict';
2
+
3
+ var antlr4 = require('antlr4');
4
+
5
+ class ApexErrorListener extends antlr4.ErrorListener {
6
+ syntaxError(recognizer, offendingSymbol, line, column, msg, e) {
7
+ this.apexSyntaxError(line, column, msg);
8
+ }
9
+ }
10
+ class ApexSyntaxError extends Error {
11
+ line;
12
+ column;
13
+ message;
14
+ constructor(line, column, message) {
15
+ super(message);
16
+ this.line = line;
17
+ this.column = column;
18
+ this.name = this.constructor.name;
19
+ }
20
+ }
21
+ class ThrowingErrorListener extends ApexErrorListener {
22
+ static INSTANCE = new ThrowingErrorListener();
23
+ apexSyntaxError(line, column, msg) {
24
+ throw new ApexSyntaxError(line, column, msg);
25
+ }
26
+ }
27
+
28
+ exports.ApexErrorListener = ApexErrorListener;
29
+ exports.ApexSyntaxError = ApexSyntaxError;
30
+ exports.ThrowingErrorListener = ThrowingErrorListener;
31
+ //# sourceMappingURL=ApexErrorListener.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ApexErrorListener.cjs","sources":["../../src/ApexErrorListener.ts"],"sourcesContent":["/*\n [The \"BSD licence\"]\n Copyright (c) 2025 Kevin Jones, Certinia Inc.\n All rights reserved.\n\n Redistribution and use in source and binary forms, with or without\n modification, are permitted provided that the following conditions\n are met:\n 1. Redistributions of source code must retain the above copyright\n notice, this list of conditions and the following disclaimer.\n 2. Redistributions in binary form must reproduce the above copyright\n notice, this list of conditions and the following disclaimer in the\n documentation and/or other materials provided with the distribution.\n 3. The name of the author may not be used to endorse or promote products\n derived from this software without specific prior written permission.\n\n THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR\n IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES\n OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,\n INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT\n NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF\n THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n*/\nimport {\n ErrorListener,\n type RecognitionException,\n type Recognizer,\n type Token,\n} from \"antlr4\";\n\n/**\n * Base `ErrorListener` for Apex parsers.\n *\n * Implement `apexSyntaxError()` to set behaviour. A single instance can be\n * attached to both a lexer and a parser - see `ApexParserFactory.createLexerAndParser`.\n */\nexport abstract class ApexErrorListener extends ErrorListener<Token | number> {\n abstract apexSyntaxError(line: number, column: number, msg: string): void;\n\n syntaxError(\n recognizer: Recognizer<Token | number>,\n offendingSymbol: Token | number,\n line: number,\n column: number,\n msg: string,\n e: RecognitionException | undefined\n ): void {\n this.apexSyntaxError(line, column, msg);\n }\n}\n\nexport class ApexSyntaxError extends Error {\n line: number;\n column: number;\n message!: string;\n\n constructor(line: number, column: number, message: string) {\n super(message);\n\n this.line = line;\n this.column = column;\n this.name = this.constructor.name;\n }\n}\n\n/**\n * `ApexErrorListener` that throws an `ApexSyntaxError` on first reported error.\n *\n * Use ThrowingErrorListener.INSTANCE to share across parsers.\n */\nexport class ThrowingErrorListener extends ApexErrorListener {\n static readonly INSTANCE = new ThrowingErrorListener();\n\n apexSyntaxError(line: number, column: number, msg: string): void {\n throw new ApexSyntaxError(line, column, msg);\n }\n}\n"],"names":["ErrorListener"],"mappings":";;;;AAwCO,MAAe,0BAA0BA,oBAAA,CAA8B;AAAA,EAG5E,YACE,UAAA,EACA,eAAA,EACA,IAAA,EACA,MAAA,EACA,KACA,CAAA,EACM;AACN,IAAA,IAAA,CAAK,eAAA,CAAgB,IAAA,EAAM,MAAA,EAAQ,GAAG,CAAA;AAAA,EACxC;AACF;AAEO,MAAM,wBAAwB,KAAA,CAAM;AAAA,EACzC,IAAA;AAAA,EACA,MAAA;AAAA,EACA,OAAA;AAAA,EAEA,WAAA,CAAY,IAAA,EAAc,MAAA,EAAgB,OAAA,EAAiB;AACzD,IAAA,KAAA,CAAM,OAAO,CAAA;AAEb,IAAA,IAAA,CAAK,IAAA,GAAO,IAAA;AACZ,IAAA,IAAA,CAAK,MAAA,GAAS,MAAA;AACd,IAAA,IAAA,CAAK,IAAA,GAAO,KAAK,WAAA,CAAY,IAAA;AAAA,EAC/B;AACF;AAOO,MAAM,8BAA8B,iBAAA,CAAkB;AAAA,EAC3D,OAAgB,QAAA,GAAW,IAAI,qBAAA,EAAsB;AAAA,EAErD,eAAA,CAAgB,IAAA,EAAc,MAAA,EAAgB,GAAA,EAAmB;AAC/D,IAAA,MAAM,IAAI,eAAA,CAAgB,IAAA,EAAM,MAAA,EAAQ,GAAG,CAAA;AAAA,EAC7C;AACF;;;;;;"}
@@ -0,0 +1,83 @@
1
+ 'use strict';
2
+
3
+ var antlr4 = require('antlr4');
4
+ var ApexLexer = require('./antlr/ApexLexer.cjs');
5
+ var ApexParser = require('./antlr/ApexParser.cjs');
6
+ var ApexErrorListener = require('./ApexErrorListener.cjs');
7
+
8
+ class ApexParserFactory {
9
+ constructor() {
10
+ }
11
+ static createParser(source, throwOnFirstError = false) {
12
+ const parser = new ApexParser.default(
13
+ typeof source === "string" ? new antlr4.CommonTokenStream(this.createLexer(source)) : source
14
+ );
15
+ parser.removeErrorListeners();
16
+ if (throwOnFirstError) {
17
+ parser.addErrorListener(ApexErrorListener.ThrowingErrorListener.INSTANCE);
18
+ }
19
+ return parser;
20
+ }
21
+ static createTokenStream(source) {
22
+ return new antlr4.CommonTokenStream(
23
+ typeof source === "string" ? this.createLexer(source) : source
24
+ );
25
+ }
26
+ static createLexer(source) {
27
+ const lexer = new ApexLexer.default(antlr4.CharStreams.fromString(source));
28
+ lexer.removeErrorListeners();
29
+ return lexer;
30
+ }
31
+ /**
32
+ * Creates a lexer and parser pair with the given error listener attached to
33
+ * both. This is the recommended way to capture all syntax errors when parsing
34
+ * full Apex source - lexer errors (e.g. invalid string escape sequences) are
35
+ * only reported to listeners attached to the lexer, and parser errors are
36
+ * only reported to listeners attached to the parser.
37
+ */
38
+ static createLexerAndParser(source, errorListener) {
39
+ const lexer = this.createLexer(source);
40
+ lexer.addErrorListener(errorListener);
41
+ const parser = this.createParser(new antlr4.CommonTokenStream(lexer));
42
+ parser.addErrorListener(errorListener);
43
+ return { lexer, parser };
44
+ }
45
+ }
46
+ class ApexParserBaseVisitor extends antlr4.ParseTreeVisitor {
47
+ visit(tree) {
48
+ return super.visit(tree);
49
+ }
50
+ visitChildren(node) {
51
+ return super.visitChildren(node);
52
+ }
53
+ visitTerminal(node) {
54
+ return super.visitTerminal(node);
55
+ }
56
+ visitErrorNode(node) {
57
+ return super.visitErrorNode(node);
58
+ }
59
+ }
60
+ class ApexParserBaseListener extends antlr4.ParseTreeListener {
61
+ visitTerminal(node) {
62
+ }
63
+ visitErrorNode(node) {
64
+ }
65
+ enterEveryRule(ctx) {
66
+ }
67
+ exitEveryRule(ctx) {
68
+ }
69
+ }
70
+ class ApexParseTreeWalker extends antlr4.ParseTreeWalker {
71
+ // Preserves the narrower exported type; runtime value is a ParseTreeWalker from antlr4.
72
+ // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-assertion
73
+ static DEFAULT = super.DEFAULT;
74
+ walk(listener, t) {
75
+ super.walk(listener, t);
76
+ }
77
+ }
78
+
79
+ exports.ApexParseTreeWalker = ApexParseTreeWalker;
80
+ exports.ApexParserBaseListener = ApexParserBaseListener;
81
+ exports.ApexParserBaseVisitor = ApexParserBaseVisitor;
82
+ exports.ApexParserFactory = ApexParserFactory;
83
+ //# sourceMappingURL=ApexParserFactory.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ApexParserFactory.cjs","sources":["../../src/ApexParserFactory.ts"],"sourcesContent":["/*\n [The \"BSD licence\"]\n Copyright (c) 2025 Kevin Jones, Certinia Inc.\n All rights reserved.\n\n Redistribution and use in source and binary forms, with or without\n modification, are permitted provided that the following conditions\n are met:\n 1. Redistributions of source code must retain the above copyright\n notice, this list of conditions and the following disclaimer.\n 2. Redistributions in binary form must reproduce the above copyright\n notice, this list of conditions and the following disclaimer in the\n documentation and/or other materials provided with the distribution.\n 3. The name of the author may not be used to endorse or promote products\n derived from this software without specific prior written permission.\n\n THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR\n IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES\n OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,\n INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT\n NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF\n THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n*/\n\nimport {\n CharStreams,\n CommonTokenStream,\n ErrorNode,\n ParserRuleContext,\n ParseTree,\n ParseTreeListener,\n ParseTreeVisitor,\n ParseTreeWalker,\n RuleNode,\n TerminalNode,\n Token,\n} from \"antlr4\";\nimport type ApexParserListener from \"./antlr/ApexParserListener.js\";\nimport type ApexParserVisitor from \"./antlr/ApexParserVisitor.js\";\nimport ApexLexer from \"./antlr/ApexLexer.js\";\nimport ApexParser from \"./antlr/ApexParser.js\";\nimport {\n ApexErrorListener,\n ThrowingErrorListener,\n} from \"./ApexErrorListener.js\";\n\nexport type ApexParserRuleContext = ParserRuleContext;\nexport type ApexErrorNode = ErrorNode;\nexport type ApexParseTree = ParseTree;\nexport type ApexRuleNode = RuleNode;\nexport type ApexTerminalNode = TerminalNode;\nexport type ApexTokenStream = CommonTokenStream;\nexport type ApexToken = Token;\n\n/**\n * A factory for `ApexParser` and its components. Abstracts interaction\n * with core ANTLR types like `CommonTokenStream`.\n */\nexport class ApexParserFactory {\n private constructor() {}\n\n static createParser(\n source: string | ApexTokenStream,\n throwOnFirstError: boolean = false\n ): ApexParser {\n const parser = new ApexParser(\n typeof source === \"string\"\n ? new CommonTokenStream(this.createLexer(source))\n : source\n );\n\n // always remove default console listener\n parser.removeErrorListeners();\n if (throwOnFirstError) {\n parser.addErrorListener(ThrowingErrorListener.INSTANCE);\n }\n return parser;\n }\n\n static createTokenStream(source: string | ApexLexer): ApexTokenStream {\n return new CommonTokenStream(\n typeof source === \"string\" ? this.createLexer(source) : source\n );\n }\n\n static createLexer(source: string): ApexLexer {\n const lexer = new ApexLexer(CharStreams.fromString(source));\n\n // always remove default console listener\n lexer.removeErrorListeners();\n return lexer;\n }\n\n /**\n * Creates a lexer and parser pair with the given error listener attached to\n * both. This is the recommended way to capture all syntax errors when parsing\n * full Apex source - lexer errors (e.g. invalid string escape sequences) are\n * only reported to listeners attached to the lexer, and parser errors are\n * only reported to listeners attached to the parser.\n */\n static createLexerAndParser(\n source: string,\n errorListener: ApexErrorListener\n ): { lexer: ApexLexer; parser: ApexParser } {\n const lexer = this.createLexer(source);\n lexer.addErrorListener(errorListener);\n const parser = this.createParser(new CommonTokenStream(lexer));\n parser.addErrorListener(errorListener);\n return { lexer, parser };\n }\n}\n\n/**\n * A base visitor for an Apex parse tree produced by `ApexParser`. Extend this\n * class to define a subset of visitor operations.\n *\n * @see ApexParserVisitor for tree context visit operations.\n * @param Result The return type of the visit operation. Use `void` for\n * operations with no return type.\n * @example\n * // Implementations can be property or method styles.\n * visitCompilationUnit = (ctx: CompilationUnitContext) => { return result; }\n * visitCompilationUnit(ctx: CompilationUnitContext) { return result; }\n */\nexport class ApexParserBaseVisitor<Result>\n extends ParseTreeVisitor<Result>\n implements ApexParserVisitor<Result>\n{\n visit(tree: ApexParseTree): Result {\n return super.visit(tree);\n }\n\n visitChildren(node: ApexRuleNode): Result {\n return super.visitChildren(node);\n }\n\n visitTerminal(node: ApexTerminalNode): Result {\n return super.visitTerminal(node);\n }\n\n visitErrorNode(node: ApexErrorNode): Result {\n return super.visitErrorNode(node);\n }\n}\n\n/**\n * A base listener for an Apex parse tree produced by `ApexParser`. Extend this\n * class to define a subset of listener operations.\n *\n * @see ApexParserListener for tree context listen operations.\n * @example\n * // Implementations can be property or method styles.\n * enterCompilationUnit = (ctx: CompilationUnitContext) => {}\n * enterCompilationUnit(ctx: CompilationUnitContext) {}\n */\nexport class ApexParserBaseListener\n extends ParseTreeListener\n implements ApexParserListener\n{\n visitTerminal(node: ApexTerminalNode): void {}\n visitErrorNode(node: ApexErrorNode): void {}\n enterEveryRule(ctx: ApexParserRuleContext): void {}\n exitEveryRule(ctx: ApexParserRuleContext): void {}\n}\n\n/**\n * Walker for a parse tree starting at the root and going down recursively\n * with depth-first search.\n *\n * @example\n * const parser = ApexParserFactory.createParser(\"public class Foo {}\");\n * const listener = new MyListener(); // extends ApexParseTreeListener\n * ApexParseTreeWalker.DEFAULT.walk(listener, parser.compilationUnit());\n */\nexport class ApexParseTreeWalker extends ParseTreeWalker {\n // Preserves the narrower exported type; runtime value is a ParseTreeWalker from antlr4.\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-assertion\n static DEFAULT = super.DEFAULT as ApexParseTreeWalker;\n\n walk<T extends ApexParserListener>(listener: T, t: ApexParseTree): void {\n super.walk(listener, t);\n }\n}\n"],"names":["ApexParser","CommonTokenStream","ThrowingErrorListener","ApexLexer","CharStreams","ParseTreeVisitor","ParseTreeListener","ParseTreeWalker"],"mappings":";;;;;;;AA8DO,MAAM,iBAAA,CAAkB;AAAA,EACrB,WAAA,GAAc;AAAA,EAAC;AAAA,EAEvB,OAAO,YAAA,CACL,MAAA,EACA,iBAAA,GAA6B,KAAA,EACjB;AACZ,IAAA,MAAM,SAAS,IAAIA,kBAAA;AAAA,MACjB,OAAO,WAAW,QAAA,GACd,IAAIC,yBAAkB,IAAA,CAAK,WAAA,CAAY,MAAM,CAAC,CAAA,GAC9C;AAAA,KACN;AAGA,IAAA,MAAA,CAAO,oBAAA,EAAqB;AAC5B,IAAA,IAAI,iBAAA,EAAmB;AACrB,MAAA,MAAA,CAAO,gBAAA,CAAiBC,wCAAsB,QAAQ,CAAA;AAAA,IACxD;AACA,IAAA,OAAO,MAAA;AAAA,EACT;AAAA,EAEA,OAAO,kBAAkB,MAAA,EAA6C;AACpE,IAAA,OAAO,IAAID,wBAAA;AAAA,MACT,OAAO,MAAA,KAAW,QAAA,GAAW,IAAA,CAAK,WAAA,CAAY,MAAM,CAAA,GAAI;AAAA,KAC1D;AAAA,EACF;AAAA,EAEA,OAAO,YAAY,MAAA,EAA2B;AAC5C,IAAA,MAAM,QAAQ,IAAIE,iBAAA,CAAUC,kBAAA,CAAY,UAAA,CAAW,MAAM,CAAC,CAAA;AAG1D,IAAA,KAAA,CAAM,oBAAA,EAAqB;AAC3B,IAAA,OAAO,KAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,OAAO,oBAAA,CACL,MAAA,EACA,aAAA,EAC0C;AAC1C,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,WAAA,CAAY,MAAM,CAAA;AACrC,IAAA,KAAA,CAAM,iBAAiB,aAAa,CAAA;AACpC,IAAA,MAAM,SAAS,IAAA,CAAK,YAAA,CAAa,IAAIH,wBAAA,CAAkB,KAAK,CAAC,CAAA;AAC7D,IAAA,MAAA,CAAO,iBAAiB,aAAa,CAAA;AACrC,IAAA,OAAO,EAAE,OAAO,MAAA,EAAO;AAAA,EACzB;AACF;AAcO,MAAM,8BACHI,uBAAA,CAEV;AAAA,EACE,MAAM,IAAA,EAA6B;AACjC,IAAA,OAAO,KAAA,CAAM,MAAM,IAAI,CAAA;AAAA,EACzB;AAAA,EAEA,cAAc,IAAA,EAA4B;AACxC,IAAA,OAAO,KAAA,CAAM,cAAc,IAAI,CAAA;AAAA,EACjC;AAAA,EAEA,cAAc,IAAA,EAAgC;AAC5C,IAAA,OAAO,KAAA,CAAM,cAAc,IAAI,CAAA;AAAA,EACjC;AAAA,EAEA,eAAe,IAAA,EAA6B;AAC1C,IAAA,OAAO,KAAA,CAAM,eAAe,IAAI,CAAA;AAAA,EAClC;AACF;AAYO,MAAM,+BACHC,wBAAA,CAEV;AAAA,EACE,cAAc,IAAA,EAA8B;AAAA,EAAC;AAAA,EAC7C,eAAe,IAAA,EAA2B;AAAA,EAAC;AAAA,EAC3C,eAAe,GAAA,EAAkC;AAAA,EAAC;AAAA,EAClD,cAAc,GAAA,EAAkC;AAAA,EAAC;AACnD;AAWO,MAAM,4BAA4BC,sBAAA,CAAgB;AAAA;AAAA;AAAA,EAGvD,OAAO,UAAU,KAAA,CAAM,OAAA;AAAA,EAEvB,IAAA,CAAmC,UAAa,CAAA,EAAwB;AACtE,IAAA,KAAA,CAAM,IAAA,CAAK,UAAU,CAAC,CAAA;AAAA,EACxB;AACF;;;;;;;"}
@@ -0,0 +1,30 @@
1
+ 'use strict';
2
+
3
+ var antlr4 = require('antlr4');
4
+
5
+ class CaseInsensitiveInputStream extends antlr4.CharStream {
6
+ constructor(data, decodeToUnicodeCodePoints = true) {
7
+ if (typeof data === "string") {
8
+ super(data, decodeToUnicodeCodePoints);
9
+ } else {
10
+ super(data.toString(), decodeToUnicodeCodePoints);
11
+ }
12
+ }
13
+ LA(i) {
14
+ return this.toLower(super.LA(i));
15
+ }
16
+ LT(offset) {
17
+ return this.LA(offset);
18
+ }
19
+ // We only need basic upper to lower conversions
20
+ toLower(c) {
21
+ if (c >= 65 && c <= 90) {
22
+ return c + 32;
23
+ } else {
24
+ return c;
25
+ }
26
+ }
27
+ }
28
+
29
+ exports.CaseInsensitiveInputStream = CaseInsensitiveInputStream;
30
+ //# sourceMappingURL=CaseInsensitiveInputStream.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CaseInsensitiveInputStream.cjs","sources":["../../src/CaseInsensitiveInputStream.ts"],"sourcesContent":["/*\n [The \"BSD licence\"]\n Copyright (c) 2019 Kevin Jones\n All rights reserved.\n\n Redistribution and use in source and binary forms, with or without\n modification, are permitted provided that the following conditions\n are met:\n 1. Redistributions of source code must retain the above copyright\n notice, this list of conditions and the following disclaimer.\n 2. Redistributions in binary form must reproduce the above copyright\n notice, this list of conditions and the following disclaimer in the\n documentation and/or other materials provided with the distribution.\n 3. The name of the author may not be used to endorse or promote products\n derived from this software without specific prior written permission.\n\n THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR\n IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES\n OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,\n INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT\n NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF\n THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n*/\n\nimport { CharStream } from \"antlr4\";\n\n/**\n * Converts char stream to lower case for case insensitive usage.\n *\n * @deprecated since 5.0.0. ApexLexer is generated with ANTLR 4.10\n * `caseInsensitive` option enabled.\n */\nexport class CaseInsensitiveInputStream extends CharStream {\n constructor(data: string, decodeToUnicodeCodePoints?: boolean);\n constructor(stream: CharStream, decodeToUnicodeCodePoints?: boolean);\n constructor(\n data: string | CharStream,\n decodeToUnicodeCodePoints: boolean = true\n ) {\n // Default to unicode code points\n // CharStreams.fromString is always `new CharStream(data, true)`\n // but `new CharStream(data)` defaults to false / UTF-16 code units\n if (typeof data === \"string\") {\n super(data, decodeToUnicodeCodePoints);\n } else {\n super(data.toString(), decodeToUnicodeCodePoints);\n }\n }\n\n LA(i: number): number {\n return this.toLower(super.LA(i));\n }\n\n LT(offset: number): number {\n // same behaviour as CharStream\n return this.LA(offset);\n }\n\n // We only need basic upper to lower conversions\n private toLower(c: number): number {\n if (c >= 65 && c <= 90) {\n return c + 32;\n } else {\n return c;\n }\n }\n}\n"],"names":["CharStream"],"mappings":";;;;AAoCO,MAAM,mCAAmCA,iBAAA,CAAW;AAAA,EAGzD,WAAA,CACE,IAAA,EACA,yBAAA,GAAqC,IAAA,EACrC;AAIA,IAAA,IAAI,OAAO,SAAS,QAAA,EAAU;AAC5B,MAAA,KAAA,CAAM,MAAM,yBAAyB,CAAA;AAAA,IACvC,CAAA,MAAO;AACL,MAAA,KAAA,CAAM,IAAA,CAAK,QAAA,EAAS,EAAG,yBAAyB,CAAA;AAAA,IAClD;AAAA,EACF;AAAA,EAEA,GAAG,CAAA,EAAmB;AACpB,IAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,KAAA,CAAM,EAAA,CAAG,CAAC,CAAC,CAAA;AAAA,EACjC;AAAA,EAEA,GAAG,MAAA,EAAwB;AAEzB,IAAA,OAAO,IAAA,CAAK,GAAG,MAAM,CAAA;AAAA,EACvB;AAAA;AAAA,EAGQ,QAAQ,CAAA,EAAmB;AACjC,IAAA,IAAI,CAAA,IAAK,EAAA,IAAM,CAAA,IAAK,EAAA,EAAI;AACtB,MAAA,OAAO,CAAA,GAAI,EAAA;AAAA,IACb,CAAA,MAAO;AACL,MAAA,OAAO,CAAA;AAAA,IACT;AAAA,EACF;AACF;;;;"}
@@ -0,0 +1,172 @@
1
+ 'use strict';
2
+
3
+ var promises = require('node:fs/promises');
4
+ var node_fs = require('node:fs');
5
+ var node_path = require('node:path');
6
+ var ApexErrorListener = require('./ApexErrorListener.cjs');
7
+ var ApexParserFactory = require('./ApexParserFactory.cjs');
8
+
9
+ async function check(pathStr, fileExt) {
10
+ const path = node_path.resolve(pathStr || process.argv[1] || process.cwd());
11
+ const ext = fileExt || process.argv[2];
12
+ const extensions = ext ? ext.split(",") : [".cls", ".trigger", ".apex"];
13
+ const result = {
14
+ status: 0,
15
+ extensions,
16
+ errors: []
17
+ };
18
+ if (!node_fs.existsSync(path)) {
19
+ console.error(`Path does not exist, aborting: ${path}`);
20
+ result.status = 2;
21
+ } else {
22
+ try {
23
+ result.errors = await parseFiles(path, extensions);
24
+ } catch (err) {
25
+ console.error(`Error processing: ${path}`);
26
+ console.error(err);
27
+ result.status = 1;
28
+ }
29
+ }
30
+ process.exitCode = result.status;
31
+ return result;
32
+ }
33
+ async function checkProject(pathStr) {
34
+ const path = node_path.resolve(pathStr || process.argv[1] || process.cwd());
35
+ const ext = ".cls,.trigger";
36
+ const name = node_path.basename(path);
37
+ const project = findProjectFile(path, 1);
38
+ if (!project) {
39
+ console.error(
40
+ `[${name}]: No valid SFDX project, checking all cls & trigger files`
41
+ );
42
+ const result = await check(path, ext);
43
+ return [
44
+ {
45
+ name,
46
+ path: ".",
47
+ ...result
48
+ }
49
+ ];
50
+ }
51
+ const packages = getProjectPackages(project);
52
+ const projectDir = node_path.dirname(project);
53
+ const projectResult = await Promise.all(
54
+ packages.map(async (pkg) => {
55
+ console.log(`[${name}]: Checking package "${pkg}"`);
56
+ const pkgPath = node_path.resolve(projectDir, pkg);
57
+ const result = await check(pkgPath, ext);
58
+ return {
59
+ name,
60
+ pkg,
61
+ path: node_path.relative(path, pkgPath),
62
+ ...result
63
+ };
64
+ })
65
+ );
66
+ process.exitCode = Math.max(...projectResult.map((r) => r.status));
67
+ return projectResult;
68
+ }
69
+ class CheckApexErrorListener extends ApexErrorListener.ApexErrorListener {
70
+ path;
71
+ errors = [];
72
+ constructor(relativePath) {
73
+ super();
74
+ this.path = relativePath;
75
+ }
76
+ apexSyntaxError(line, column, message) {
77
+ const error = {
78
+ column,
79
+ line,
80
+ message,
81
+ path: this.path
82
+ };
83
+ console.log(JSON.stringify(error));
84
+ this.errors.push(error);
85
+ }
86
+ getErrors() {
87
+ return this.errors;
88
+ }
89
+ }
90
+ async function parseFiles(path, extensions) {
91
+ const parsers = {
92
+ ".cls": (parser) => parser.compilationUnit(),
93
+ ".trigger": (parser) => parser.triggerUnit(),
94
+ ".apex": (parser) => parser.anonymousUnit()
95
+ };
96
+ const ext = Object.keys(parsers);
97
+ extensions.forEach((e) => {
98
+ if (!ext.includes(e)) {
99
+ throw new Error(
100
+ `Unknown extension '${e}' - one or more of [${ext.join(",")}] required.`
101
+ );
102
+ }
103
+ });
104
+ const files = await getPathsInDir(path, extensions);
105
+ return extensions.flatMap((ext2) => parseByType(path, files, ext2, parsers[ext2]));
106
+ }
107
+ async function getPathsInDir(path, ext) {
108
+ const dirent = await promises.readdir(path, {
109
+ withFileTypes: true,
110
+ recursive: true
111
+ });
112
+ return dirent.reduce((files, ent) => {
113
+ if (ent.isFile() && ext.includes(node_path.extname(ent.name))) {
114
+ files.push(node_path.join(ent.parentPath, ent.name));
115
+ }
116
+ return files;
117
+ }, []);
118
+ }
119
+ function parseByType(rootPath, files, endsWith, operation) {
120
+ let parsedCount = 0;
121
+ const errors = [];
122
+ files.filter((name) => name.endsWith(endsWith)).forEach((file) => {
123
+ if (node_fs.lstatSync(file).isFile()) {
124
+ const parser = ApexParserFactory.ApexParserFactory.createParser(
125
+ node_fs.readFileSync(file).toString()
126
+ );
127
+ const relativePath = node_path.relative(rootPath, file);
128
+ const listener = new CheckApexErrorListener(relativePath);
129
+ parser.addErrorListener(listener);
130
+ operation(parser);
131
+ const fileErrors = listener.getErrors();
132
+ if (fileErrors.length) {
133
+ console.log(
134
+ `Found ${fileErrors.length} syntax errors in: ${relativePath}`
135
+ );
136
+ errors.push(...fileErrors);
137
+ }
138
+ parsedCount += 1;
139
+ }
140
+ });
141
+ console.log(`Parsed ${parsedCount} '${endsWith}' files in: ${rootPath}`);
142
+ return errors;
143
+ }
144
+ function findProjectFile(wd, depth) {
145
+ const proj = "sfdx-project.json";
146
+ const files = node_fs.readdirSync(wd).filter((i) => !/(^|\/)\.[^/.]/g.test(i));
147
+ if (files.includes(proj)) {
148
+ return node_path.resolve(wd, proj);
149
+ }
150
+ if (depth) {
151
+ const dirs = files.map((f) => node_path.resolve(wd, f)).filter((f) => node_fs.lstatSync(f).isDirectory());
152
+ const newDepth = depth - 1;
153
+ for (const d of dirs) {
154
+ const p = findProjectFile(d, newDepth);
155
+ if (p) {
156
+ return p;
157
+ }
158
+ }
159
+ }
160
+ return void 0;
161
+ }
162
+ function getProjectPackages(projectFilePath) {
163
+ const config = JSON.parse(
164
+ node_fs.readFileSync(projectFilePath, { encoding: "utf8" })
165
+ );
166
+ const packages = config.packageDirectories || [];
167
+ return packages.flatMap((p) => p.path ? p.path.replace(/\\/g, "/") : []);
168
+ }
169
+
170
+ exports.check = check;
171
+ exports.checkProject = checkProject;
172
+ //# sourceMappingURL=Check.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Check.cjs","sources":["../../src/Check.ts"],"sourcesContent":["/*\n [The \"BSD licence\"]\n Copyright (c) 2020 Kevin Jones\n All rights reserved.\n\n Redistribution and use in source and binary forms, with or without\n modification, are permitted provided that the following conditions\n are met:\n 1. Redistributions of source code must retain the above copyright\n notice, this list of conditions and the following disclaimer.\n 2. Redistributions in binary form must reproduce the above copyright\n notice, this list of conditions and the following disclaimer in the\n documentation and/or other materials provided with the distribution.\n 3. The name of the author may not be used to endorse or promote products\n derived from this software without specific prior written permission.\n\n THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR\n IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES\n OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,\n INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT\n NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF\n THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n*/\n\nimport { readdir } from \"node:fs/promises\";\nimport { readdirSync, readFileSync, lstatSync, existsSync } from \"node:fs\";\nimport { basename, dirname, extname, resolve, relative, join } from \"node:path\";\nimport type ApexParser from \"./antlr/ApexParser.js\";\nimport { ApexErrorListener } from \"./ApexErrorListener.js\";\nimport { ApexParserFactory } from \"./ApexParserFactory.js\";\n\nexport interface CheckError {\n column: number;\n line: number;\n message: string;\n path: string;\n}\n\nexport interface CheckResult {\n extensions: string[];\n errors: CheckError[];\n status: number;\n}\n\nexport interface ProjectCheckResult extends CheckResult {\n name: string;\n path: string;\n pkg?: string;\n}\n\n/**\n * Check Apex files in a path for syntax errors.\n *\n * @param pathStr Path to check. If not provided, uses process.argv or\n * process.cwd().\n * @param fileExt CSV list of file extensions to check\n * (default: `.cls,.trigger,.apex`).\n * @returns Result with status (0 ok, 1 error, 2 missing path) and syntax\n * errors.\n */\nexport async function check(\n pathStr?: string,\n fileExt?: string\n): Promise<CheckResult> {\n const path = resolve(pathStr || process.argv[1] || process.cwd());\n const ext = fileExt || process.argv[2];\n const extensions = ext ? ext.split(\",\") : [\".cls\", \".trigger\", \".apex\"];\n\n const result: CheckResult = {\n status: 0,\n extensions,\n errors: [],\n };\n\n if (!existsSync(path)) {\n console.error(`Path does not exist, aborting: ${path}`);\n result.status = 2;\n } else {\n try {\n result.errors = await parseFiles(path, extensions);\n } catch (err) {\n console.error(`Error processing: ${path}`);\n console.error(err);\n result.status = 1;\n }\n }\n\n process.exitCode = result.status;\n return result;\n}\n\n/**\n * Check an Apex sfdx-project for syntax errors.\n *\n * @param pathStr Path to directory containing an sfdx-project.json at most 1\n * level deep. If not found, reverts to `check()` behaviour.\n * @returns Result for each package with status (0 ok, 1 error, 2 missing path)\n * and syntax errors.\n */\nexport async function checkProject(\n pathStr?: string\n): Promise<ProjectCheckResult[]> {\n const path = resolve(pathStr || process.argv[1] || process.cwd());\n const ext = \".cls,.trigger\";\n const name = basename(path);\n const project = findProjectFile(path, 1);\n\n if (!project) {\n console.error(\n `[${name}]: No valid SFDX project, checking all cls & trigger files`\n );\n const result = await check(path, ext);\n return [\n {\n name,\n path: \".\",\n ...result,\n },\n ];\n }\n\n const packages = getProjectPackages(project);\n const projectDir = dirname(project);\n const projectResult = await Promise.all(\n packages.map(async pkg => {\n console.log(`[${name}]: Checking package \"${pkg}\"`);\n const pkgPath = resolve(projectDir, pkg);\n const result = await check(pkgPath, ext);\n return {\n name,\n pkg,\n path: relative(path, pkgPath),\n ...result,\n };\n })\n );\n\n process.exitCode = Math.max(...projectResult.map(r => r.status));\n return projectResult;\n}\n\nclass CheckApexErrorListener extends ApexErrorListener {\n private path: string;\n private errors: CheckError[] = [];\n\n constructor(relativePath: string) {\n super();\n this.path = relativePath;\n }\n\n apexSyntaxError(line: number, column: number, message: string): void {\n const error: CheckError = {\n column,\n line,\n message,\n path: this.path,\n };\n\n console.log(JSON.stringify(error));\n this.errors.push(error);\n }\n\n getErrors(): CheckError[] {\n return this.errors;\n }\n}\n\nasync function parseFiles(\n path: string,\n extensions: string[]\n): Promise<CheckError[]> {\n const parsers: Record<string, (parser: ApexParser) => void> = {\n \".cls\": parser => parser.compilationUnit(),\n \".trigger\": parser => parser.triggerUnit(),\n \".apex\": parser => parser.anonymousUnit(),\n };\n const ext = Object.keys(parsers);\n extensions.forEach(e => {\n if (!ext.includes(e)) {\n throw new Error(\n `Unknown extension '${e}' - one or more of [${ext.join(\",\")}] required.`\n );\n }\n });\n\n const files = await getPathsInDir(path, extensions);\n return extensions.flatMap(ext => parseByType(path, files, ext, parsers[ext]));\n}\n\nasync function getPathsInDir(path: string, ext: string[]): Promise<string[]> {\n const dirent = await readdir(path, {\n withFileTypes: true,\n recursive: true,\n });\n\n return dirent.reduce<string[]>((files, ent) => {\n if (ent.isFile() && ext.includes(extname(ent.name))) {\n files.push(join(ent.parentPath, ent.name));\n }\n return files;\n }, []);\n}\n\nfunction parseByType(\n rootPath: string,\n files: string[],\n endsWith: string,\n operation: (parser: ApexParser) => void\n): CheckError[] {\n let parsedCount = 0;\n const errors: CheckError[] = [];\n files\n .filter(name => name.endsWith(endsWith))\n .forEach(file => {\n if (lstatSync(file).isFile()) {\n const parser = ApexParserFactory.createParser(\n readFileSync(file).toString()\n );\n const relativePath = relative(rootPath, file);\n const listener = new CheckApexErrorListener(relativePath);\n parser.addErrorListener(listener);\n\n operation(parser);\n\n const fileErrors = listener.getErrors();\n if (fileErrors.length) {\n console.log(\n `Found ${fileErrors.length} syntax errors in: ${relativePath}`\n );\n errors.push(...fileErrors);\n }\n\n parsedCount += 1;\n }\n });\n\n console.log(`Parsed ${parsedCount} '${endsWith}' files in: ${rootPath}`);\n return errors;\n}\n\nfunction findProjectFile(wd: string, depth: number): string | undefined {\n const proj = \"sfdx-project.json\";\n const files = readdirSync(wd).filter(i => !/(^|\\/)\\.[^/.]/g.test(i));\n if (files.includes(proj)) {\n return resolve(wd, proj);\n }\n if (depth) {\n const dirs = files\n .map(f => resolve(wd, f))\n .filter(f => lstatSync(f).isDirectory());\n const newDepth = depth - 1;\n for (const d of dirs) {\n const p = findProjectFile(d, newDepth);\n if (p) {\n return p;\n }\n }\n }\n return undefined;\n}\n\nfunction getProjectPackages(projectFilePath: string): string[] {\n const config = JSON.parse(\n readFileSync(projectFilePath, { encoding: \"utf8\" })\n ) as unknown as {\n packageDirectories?: {\n path?: string;\n }[];\n };\n const packages = config.packageDirectories || [];\n return packages.flatMap(p => (p.path ? p.path.replace(/\\\\/g, \"/\") : []));\n}\n"],"names":["resolve","existsSync","basename","dirname","relative","ApexErrorListener","ext","readdir","extname","join","lstatSync","ApexParserFactory","readFileSync","readdirSync"],"mappings":"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"}