@apexdevtools/apex-parser 5.0.0-beta.2 → 5.0.0-beta.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +5 -2
- package/{lib → dist/src}/ApexErrorListener.d.ts +1 -1
- package/{lib → dist/src}/ApexErrorListener.js +8 -11
- package/dist/src/ApexErrorListener.js.map +1 -0
- package/{lib → dist/src}/ApexParserFactory.d.ts +4 -4
- package/{lib → dist/src}/ApexParserFactory.js +14 -23
- package/dist/src/ApexParserFactory.js.map +1 -0
- package/{lib → dist/src}/CaseInsensitiveInputStream.js +2 -6
- package/dist/src/CaseInsensitiveInputStream.js.map +1 -0
- package/{lib → dist/src}/Check.js +30 -37
- package/dist/src/Check.js.map +1 -0
- package/dist/src/antlr/ApexLexer.js +1573 -0
- package/{lib → dist/src}/antlr/ApexLexer.js.map +1 -1
- package/{lib → dist/src}/antlr/ApexParser.js +1935 -2125
- package/dist/src/antlr/ApexParser.js.map +1 -0
- package/dist/src/antlr/ApexParserListener.js +1893 -0
- package/dist/src/antlr/ApexParserListener.js.map +1 -0
- package/dist/src/antlr/ApexParserVisitor.js +1136 -0
- package/dist/src/antlr/ApexParserVisitor.js.map +1 -0
- package/dist/src/index.d.ts +9 -0
- package/dist/src/index.js +37 -0
- package/dist/src/index.js.map +1 -0
- package/package.json +27 -15
- package/patches/antlr4+4.13.2.patch +717 -0
- package/lib/ApexErrorListener.js.map +0 -1
- package/lib/ApexParserFactory.js.map +0 -1
- package/lib/CaseInsensitiveInputStream.js.map +0 -1
- package/lib/Check.js.map +0 -1
- package/lib/antlr/ApexLexer.js +0 -1575
- package/lib/antlr/ApexParser.js.map +0 -1
- package/lib/antlr/ApexParserListener.js +0 -12
- package/lib/antlr/ApexParserListener.js.map +0 -1
- package/lib/antlr/ApexParserVisitor.js +0 -15
- package/lib/antlr/ApexParserVisitor.js.map +0 -1
- package/lib/index.d.ts +0 -9
- package/lib/index.js +0 -58
- package/lib/index.js.map +0 -1
- /package/{lib → dist/src}/CaseInsensitiveInputStream.d.ts +0 -0
- /package/{lib → dist/src}/Check.d.ts +0 -0
- /package/{lib → dist/src}/antlr/ApexLexer.d.ts +0 -0
- /package/{lib → dist/src}/antlr/ApexParser.d.ts +0 -0
- /package/{lib → dist/src}/antlr/ApexParserListener.d.ts +0 -0
- /package/{lib → dist/src}/antlr/ApexParserVisitor.d.ts +0 -0
package/CHANGELOG.md
CHANGED
|
@@ -36,14 +36,17 @@
|
|
|
36
36
|
- A rule `expr*` generates `expr_list()` and `expr(number)`.
|
|
37
37
|
- By contrast Java would have overloads of `expr()`/`expr(int)` returning list or value.
|
|
38
38
|
|
|
39
|
+
- **(BREAKING)** Updated to ES Module format. Node 20/22, TypeScript 5.9 support `require(esm)`.
|
|
40
|
+
- Increased min node version to 20.
|
|
41
|
+
- `antlr4` has been temporarily patched to fix module resolution of the type declaration files.
|
|
42
|
+
- TS ESM projects not using `"module": "node20"` or above may produce type errors (without `skipLibCheck`).
|
|
43
|
+
|
|
39
44
|
- **(BREAKING)** Re-exported antlr classes `CommonTokenStream` and `ParseTreeWalker` removed.
|
|
40
45
|
- Added type aliases like `ApexTokenStream`, `ApexParseTree`, and more to use with listener/visitor/walker.
|
|
41
46
|
- For the walker, use `ApexParseTreeWalker.DEFAULT`. Same instance but typed for `ApexParserListener` and `ApexParseTree`.
|
|
42
47
|
- It should no longer be required to depend on `antlr4` package directly.
|
|
43
48
|
- Can still add the package as a dependency, but remember to match the version `apex-parser` uses.
|
|
44
49
|
|
|
45
|
-
- **(BREAKING)** Updated output to `ES2020` and increased min node version to 16.
|
|
46
|
-
|
|
47
50
|
- `CaseInsensitiveInputStream` (deprecated) type now extends `CharStream` and can be constructed from `string`.
|
|
48
51
|
- Constructor passing in `CharStream` retained to match Java version.
|
|
49
52
|
|
|
@@ -1,6 +1,3 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.ThrowingErrorListener = exports.ApexSyntaxError = exports.ApexErrorListener = void 0;
|
|
4
1
|
/*
|
|
5
2
|
[The "BSD licence"]
|
|
6
3
|
Copyright (c) 2025 Kevin Jones, Certinia Inc.
|
|
@@ -28,19 +25,21 @@ exports.ThrowingErrorListener = exports.ApexSyntaxError = exports.ApexErrorListe
|
|
|
28
25
|
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
|
|
29
26
|
THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
30
27
|
*/
|
|
31
|
-
|
|
28
|
+
import { ErrorListener, } from "antlr4";
|
|
32
29
|
/**
|
|
33
30
|
* Base `ErrorListener` for Apex parsers.
|
|
34
31
|
*
|
|
35
32
|
* Implement `apexSyntaxError()` to set behaviour.
|
|
36
33
|
*/
|
|
37
|
-
class ApexErrorListener extends
|
|
34
|
+
export class ApexErrorListener extends ErrorListener {
|
|
38
35
|
syntaxError(recognizer, offendingSymbol, line, column, msg, e) {
|
|
39
36
|
this.apexSyntaxError(line, column, msg);
|
|
40
37
|
}
|
|
41
38
|
}
|
|
42
|
-
|
|
43
|
-
|
|
39
|
+
export class ApexSyntaxError extends Error {
|
|
40
|
+
line;
|
|
41
|
+
column;
|
|
42
|
+
message;
|
|
44
43
|
constructor(line, column, message) {
|
|
45
44
|
super(message);
|
|
46
45
|
this.line = line;
|
|
@@ -48,17 +47,15 @@ class ApexSyntaxError extends Error {
|
|
|
48
47
|
this.name = this.constructor.name;
|
|
49
48
|
}
|
|
50
49
|
}
|
|
51
|
-
exports.ApexSyntaxError = ApexSyntaxError;
|
|
52
50
|
/**
|
|
53
51
|
* `ApexErrorListener` that throws an `ApexSyntaxError` on first reported error.
|
|
54
52
|
*
|
|
55
53
|
* Use ThrowingErrorListener.INSTANCE to share across parsers.
|
|
56
54
|
*/
|
|
57
|
-
class ThrowingErrorListener extends ApexErrorListener {
|
|
55
|
+
export class ThrowingErrorListener extends ApexErrorListener {
|
|
56
|
+
static INSTANCE = new ThrowingErrorListener();
|
|
58
57
|
apexSyntaxError(line, column, msg) {
|
|
59
58
|
throw new ApexSyntaxError(line, column, msg);
|
|
60
59
|
}
|
|
61
60
|
}
|
|
62
|
-
exports.ThrowingErrorListener = ThrowingErrorListener;
|
|
63
|
-
ThrowingErrorListener.INSTANCE = new ThrowingErrorListener();
|
|
64
61
|
//# sourceMappingURL=ApexErrorListener.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ApexErrorListener.js","sourceRoot":"","sources":["../../src/ApexErrorListener.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;EA0BE;AACF,OAAO,EACL,aAAa,GAId,MAAM,QAAQ,CAAC;AAEhB;;;;GAIG;AACH,MAAM,OAAgB,iBAAkB,SAAQ,aAAoB;IAGlE,WAAW,CACT,UAA6B,EAC7B,eAAsB,EACtB,IAAY,EACZ,MAAc,EACd,GAAW,EACX,CAAmC;QAEnC,IAAI,CAAC,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,CAAC,CAAC;IAC1C,CAAC;CACF;AAED,MAAM,OAAO,eAAgB,SAAQ,KAAK;IACxC,IAAI,CAAS;IACb,MAAM,CAAS;IACf,OAAO,CAAU;IAEjB,YAAY,IAAY,EAAE,MAAc,EAAE,OAAe;QACvD,KAAK,CAAC,OAAO,CAAC,CAAC;QAEf,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC;IACpC,CAAC;CACF;AAED;;;;GAIG;AACH,MAAM,OAAO,qBAAsB,SAAQ,iBAAiB;IAC1D,MAAM,CAAU,QAAQ,GAAG,IAAI,qBAAqB,EAAE,CAAC;IAEvD,eAAe,CAAC,IAAY,EAAE,MAAc,EAAE,GAAW;QACvD,MAAM,IAAI,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,CAAC,CAAC;IAC/C,CAAC"}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { CommonTokenStream, ErrorNode, ParserRuleContext, ParseTree, ParseTreeListener, ParseTreeVisitor, ParseTreeWalker, RuleNode, TerminalNode, Token } from "antlr4";
|
|
2
|
-
import ApexParserListener from "./antlr/ApexParserListener";
|
|
3
|
-
import ApexParserVisitor from "./antlr/ApexParserVisitor";
|
|
4
|
-
import ApexLexer from "./antlr/ApexLexer";
|
|
5
|
-
import ApexParser from "./antlr/ApexParser";
|
|
2
|
+
import type ApexParserListener from "./antlr/ApexParserListener.js";
|
|
3
|
+
import type ApexParserVisitor from "./antlr/ApexParserVisitor.js";
|
|
4
|
+
import ApexLexer from "./antlr/ApexLexer.js";
|
|
5
|
+
import ApexParser from "./antlr/ApexParser.js";
|
|
6
6
|
export type ApexParserRuleContext = ParserRuleContext;
|
|
7
7
|
export type ApexErrorNode = ErrorNode;
|
|
8
8
|
export type ApexParseTree = ParseTree;
|
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
"use strict";
|
|
2
1
|
/*
|
|
3
2
|
[The "BSD licence"]
|
|
4
3
|
Copyright (c) 2025 Kevin Jones, Certinia Inc.
|
|
@@ -26,41 +25,37 @@
|
|
|
26
25
|
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
|
|
27
26
|
THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
28
27
|
*/
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
const ApexLexer_1 = require("./antlr/ApexLexer");
|
|
34
|
-
const ApexParser_1 = require("./antlr/ApexParser");
|
|
35
|
-
const ApexErrorListener_1 = require("./ApexErrorListener");
|
|
28
|
+
import { CharStreams, CommonTokenStream, ParseTreeListener, ParseTreeVisitor, ParseTreeWalker, } from "antlr4";
|
|
29
|
+
import ApexLexer from "./antlr/ApexLexer.js";
|
|
30
|
+
import ApexParser from "./antlr/ApexParser.js";
|
|
31
|
+
import { ThrowingErrorListener } from "./ApexErrorListener.js";
|
|
36
32
|
/**
|
|
37
33
|
* A factory for `ApexParser` and its components. Abstracts interaction
|
|
38
34
|
* with core ANTLR types like `CommonTokenStream`.
|
|
39
35
|
*/
|
|
40
|
-
class ApexParserFactory {
|
|
36
|
+
export class ApexParserFactory {
|
|
41
37
|
constructor() { }
|
|
42
38
|
static createParser(source, throwOnFirstError = false) {
|
|
43
|
-
const parser = new
|
|
44
|
-
? new
|
|
39
|
+
const parser = new ApexParser(typeof source === "string"
|
|
40
|
+
? new CommonTokenStream(this.createLexer(source))
|
|
45
41
|
: source);
|
|
46
42
|
// always remove default console listener
|
|
47
43
|
parser.removeErrorListeners();
|
|
48
44
|
if (throwOnFirstError) {
|
|
49
|
-
parser.addErrorListener(
|
|
45
|
+
parser.addErrorListener(ThrowingErrorListener.INSTANCE);
|
|
50
46
|
}
|
|
51
47
|
return parser;
|
|
52
48
|
}
|
|
53
49
|
static createTokenStream(source) {
|
|
54
|
-
return new
|
|
50
|
+
return new CommonTokenStream(typeof source === "string" ? this.createLexer(source) : source);
|
|
55
51
|
}
|
|
56
52
|
static createLexer(source) {
|
|
57
|
-
const lexer = new
|
|
53
|
+
const lexer = new ApexLexer(CharStreams.fromString(source));
|
|
58
54
|
// always remove default console listener
|
|
59
55
|
lexer.removeErrorListeners();
|
|
60
56
|
return lexer;
|
|
61
57
|
}
|
|
62
58
|
}
|
|
63
|
-
exports.ApexParserFactory = ApexParserFactory;
|
|
64
59
|
/**
|
|
65
60
|
* A base visitor for an Apex parse tree produced by `ApexParser`. Extend this
|
|
66
61
|
* class to define a subset of visitor operations.
|
|
@@ -73,7 +68,7 @@ exports.ApexParserFactory = ApexParserFactory;
|
|
|
73
68
|
* visitCompilationUnit = (ctx: CompilationUnitContext) => { return result; }
|
|
74
69
|
* visitCompilationUnit(ctx: CompilationUnitContext) { return result; }
|
|
75
70
|
*/
|
|
76
|
-
class ApexParserBaseVisitor extends
|
|
71
|
+
export class ApexParserBaseVisitor extends ParseTreeVisitor {
|
|
77
72
|
visit(tree) {
|
|
78
73
|
return super.visit(tree);
|
|
79
74
|
}
|
|
@@ -87,7 +82,6 @@ class ApexParserBaseVisitor extends antlr4_1.ParseTreeVisitor {
|
|
|
87
82
|
return super.visitErrorNode(node);
|
|
88
83
|
}
|
|
89
84
|
}
|
|
90
|
-
exports.ApexParserBaseVisitor = ApexParserBaseVisitor;
|
|
91
85
|
/**
|
|
92
86
|
* A base listener for an Apex parse tree produced by `ApexParser`. Extend this
|
|
93
87
|
* class to define a subset of listener operations.
|
|
@@ -98,13 +92,12 @@ exports.ApexParserBaseVisitor = ApexParserBaseVisitor;
|
|
|
98
92
|
* enterCompilationUnit = (ctx: CompilationUnitContext) => {}
|
|
99
93
|
* enterCompilationUnit(ctx: CompilationUnitContext) {}
|
|
100
94
|
*/
|
|
101
|
-
class ApexParserBaseListener extends
|
|
95
|
+
export class ApexParserBaseListener extends ParseTreeListener {
|
|
102
96
|
visitTerminal(node) { }
|
|
103
97
|
visitErrorNode(node) { }
|
|
104
98
|
enterEveryRule(ctx) { }
|
|
105
99
|
exitEveryRule(ctx) { }
|
|
106
100
|
}
|
|
107
|
-
exports.ApexParserBaseListener = ApexParserBaseListener;
|
|
108
101
|
/**
|
|
109
102
|
* Walker for a parse tree starting at the root and going down recursively
|
|
110
103
|
* with depth-first search.
|
|
@@ -114,12 +107,10 @@ exports.ApexParserBaseListener = ApexParserBaseListener;
|
|
|
114
107
|
* const listener = new MyListener(); // extends ApexParseTreeListener
|
|
115
108
|
* ApexParseTreeWalker.DEFAULT.walk(listener, parser.compilationUnit());
|
|
116
109
|
*/
|
|
117
|
-
class ApexParseTreeWalker extends
|
|
110
|
+
export class ApexParseTreeWalker extends ParseTreeWalker {
|
|
111
|
+
static DEFAULT = super.DEFAULT;
|
|
118
112
|
walk(listener, t) {
|
|
119
113
|
super.walk(listener, t);
|
|
120
114
|
}
|
|
121
115
|
}
|
|
122
|
-
exports.ApexParseTreeWalker = ApexParseTreeWalker;
|
|
123
|
-
_a = ApexParseTreeWalker;
|
|
124
|
-
ApexParseTreeWalker.DEFAULT = Reflect.get(_b, "DEFAULT", _a);
|
|
125
116
|
//# sourceMappingURL=ApexParserFactory.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ApexParserFactory.js","sourceRoot":"","sources":["../../src/ApexParserFactory.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;EA0BE;AAEF,OAAO,EACL,WAAW,EACX,iBAAiB,EAIjB,iBAAiB,EACjB,gBAAgB,EAChB,eAAe,GAIhB,MAAM,QAAQ,CAAC;AAGhB,OAAO,SAAS,MAAM,sBAAsB,CAAC;AAC7C,OAAO,UAAU,MAAM,uBAAuB,CAAC;AAC/C,OAAO,EAAE,qBAAqB,EAAE,MAAM,wBAAwB,CAAC;AAU/D;;;GAGG;AACH,MAAM,OAAO,iBAAiB;IAC5B,gBAAuB,CAAC;IAExB,MAAM,CAAC,YAAY,CACjB,MAAgC,EAChC,oBAA6B,KAAK;QAElC,MAAM,MAAM,GAAG,IAAI,UAAU,CAC3B,OAAO,MAAM,KAAK,QAAQ;YACxB,CAAC,CAAC,IAAI,iBAAiB,CAAC,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;YACjD,CAAC,CAAC,MAAM,CACX,CAAC;QAEF,yCAAyC;QACzC,MAAM,CAAC,oBAAoB,EAAE,CAAC;QAC9B,IAAI,iBAAiB,EAAE,CAAC;YACtB,MAAM,CAAC,gBAAgB,CAAC,qBAAqB,CAAC,QAAQ,CAAC,CAAC;QAC1D,CAAC;QACD,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,MAAM,CAAC,iBAAiB,CAAC,MAA0B;QACjD,OAAO,IAAI,iBAAiB,CAC1B,OAAO,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAC/D,CAAC;IACJ,CAAC;IAED,MAAM,CAAC,WAAW,CAAC,MAAc;QAC/B,MAAM,KAAK,GAAG,IAAI,SAAS,CAAC,WAAW,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC;QAE5D,yCAAyC;QACzC,KAAK,CAAC,oBAAoB,EAAE,CAAC;QAC7B,OAAO,KAAK,CAAC;IACf,CAAC;CACF;AAED;;;;;;;;;;;GAWG;AACH,MAAM,OAAO,qBACX,SAAQ,gBAAwB;IAGhC,KAAK,CAAC,IAAmB;QACvB,OAAO,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC3B,CAAC;IAED,aAAa,CAAC,IAAkB;QAC9B,OAAO,KAAK,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;IACnC,CAAC;IAED,aAAa,CAAC,IAAsB;QAClC,OAAO,KAAK,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;IACnC,CAAC;IAED,cAAc,CAAC,IAAmB;QAChC,OAAO,KAAK,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC;IACpC,CAAC;CACF;AAED;;;;;;;;;GASG;AACH,MAAM,OAAO,sBACX,SAAQ,iBAAiB;IAGzB,aAAa,CAAC,IAAsB,IAAS,CAAC;IAC9C,cAAc,CAAC,IAAmB,IAAS,CAAC;IAC5C,cAAc,CAAC,GAA0B,IAAS,CAAC;IACnD,aAAa,CAAC,GAA0B,IAAS,CAAC;CACnD;AAED;;;;;;;;GAQG;AACH,MAAM,OAAO,mBAAoB,SAAQ,eAAe;IACtD,MAAM,CAAC,OAAO,GAAG,KAAK,CAAC,OAA8B,CAAC;IAEtD,IAAI,CAA+B,QAAW,EAAE,CAAgB;QAC9D,KAAK,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC;IAC1B,CAAC"}
|
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
"use strict";
|
|
2
1
|
/*
|
|
3
2
|
[The "BSD licence"]
|
|
4
3
|
Copyright (c) 2019 Kevin Jones
|
|
@@ -26,16 +25,14 @@
|
|
|
26
25
|
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
|
|
27
26
|
THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
28
27
|
*/
|
|
29
|
-
|
|
30
|
-
exports.CaseInsensitiveInputStream = void 0;
|
|
31
|
-
const antlr4_1 = require("antlr4");
|
|
28
|
+
import { CharStream } from "antlr4";
|
|
32
29
|
/**
|
|
33
30
|
* Converts char stream to lower case for case insensitive usage.
|
|
34
31
|
*
|
|
35
32
|
* @deprecated since 5.0.0. ApexLexer is generated with ANTLR 4.10
|
|
36
33
|
* `caseInsensitive` option enabled.
|
|
37
34
|
*/
|
|
38
|
-
class CaseInsensitiveInputStream extends
|
|
35
|
+
export class CaseInsensitiveInputStream extends CharStream {
|
|
39
36
|
constructor(data, decodeToUnicodeCodePoints = true) {
|
|
40
37
|
// Default to unicode code points
|
|
41
38
|
// CharStreams.fromString is always `new CharStream(data, true)`
|
|
@@ -64,5 +61,4 @@ class CaseInsensitiveInputStream extends antlr4_1.CharStream {
|
|
|
64
61
|
}
|
|
65
62
|
}
|
|
66
63
|
}
|
|
67
|
-
exports.CaseInsensitiveInputStream = CaseInsensitiveInputStream;
|
|
68
64
|
//# sourceMappingURL=CaseInsensitiveInputStream.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CaseInsensitiveInputStream.js","sourceRoot":"","sources":["../../src/CaseInsensitiveInputStream.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;EA0BE;AAEF,OAAO,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AAEpC;;;;;GAKG;AACH,MAAM,OAAO,0BAA2B,SAAQ,UAAU;IAGxD,YACE,IAAyB,EACzB,4BAAqC,IAAI;QAEzC,iCAAiC;QACjC,gEAAgE;QAChE,mEAAmE;QACnE,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE,CAAC;YAC7B,KAAK,CAAC,IAAI,EAAE,yBAAyB,CAAC,CAAC;QACzC,CAAC;aAAM,CAAC;YACN,KAAK,CAAC,IAAI,CAAC,QAAQ,EAAE,EAAE,yBAAyB,CAAC,CAAC;QACpD,CAAC;IACH,CAAC;IAED,EAAE,CAAC,CAAS;QACV,OAAO,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IACnC,CAAC;IAED,EAAE,CAAC,MAAc;QACf,+BAA+B;QAC/B,OAAO,IAAI,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC;IACzB,CAAC;IAED,gDAAgD;IACxC,OAAO,CAAC,CAAS;QACvB,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC;YACvB,OAAO,CAAC,GAAG,EAAE,CAAC;QAChB,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,CAAC;QACX,CAAC;IACH,CAAC;CACF"}
|
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
"use strict";
|
|
2
1
|
/*
|
|
3
2
|
[The "BSD licence"]
|
|
4
3
|
Copyright (c) 2020 Kevin Jones
|
|
@@ -26,13 +25,11 @@
|
|
|
26
25
|
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
|
|
27
26
|
THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
28
27
|
*/
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
const ApexErrorListener_1 = require("./ApexErrorListener");
|
|
35
|
-
const ApexParserFactory_1 = require("./ApexParserFactory");
|
|
28
|
+
import { readdir } from "node:fs/promises";
|
|
29
|
+
import { readdirSync, readFileSync, lstatSync, existsSync } from "node:fs";
|
|
30
|
+
import { basename, dirname, extname, resolve, relative, join } from "node:path";
|
|
31
|
+
import { ApexErrorListener } from "./ApexErrorListener.js";
|
|
32
|
+
import { ApexParserFactory } from "./ApexParserFactory.js";
|
|
36
33
|
/**
|
|
37
34
|
* Check Apex files in a path for syntax errors.
|
|
38
35
|
*
|
|
@@ -43,8 +40,8 @@ const ApexParserFactory_1 = require("./ApexParserFactory");
|
|
|
43
40
|
* @returns Result with status (0 ok, 1 error, 2 missing path) and syntax
|
|
44
41
|
* errors.
|
|
45
42
|
*/
|
|
46
|
-
async function check(pathStr, fileExt) {
|
|
47
|
-
const path =
|
|
43
|
+
export async function check(pathStr, fileExt) {
|
|
44
|
+
const path = resolve(pathStr || process.argv[1] || process.cwd());
|
|
48
45
|
const ext = fileExt || process.argv[2];
|
|
49
46
|
const extensions = ext ? ext.split(",") : [".cls", ".trigger", ".apex"];
|
|
50
47
|
const result = {
|
|
@@ -52,7 +49,7 @@ async function check(pathStr, fileExt) {
|
|
|
52
49
|
extensions,
|
|
53
50
|
errors: [],
|
|
54
51
|
};
|
|
55
|
-
if (!
|
|
52
|
+
if (!existsSync(path)) {
|
|
56
53
|
console.error(`Path does not exist, aborting: ${path}`);
|
|
57
54
|
result.status = 2;
|
|
58
55
|
}
|
|
@@ -69,7 +66,6 @@ async function check(pathStr, fileExt) {
|
|
|
69
66
|
process.exitCode = result.status;
|
|
70
67
|
return result;
|
|
71
68
|
}
|
|
72
|
-
exports.check = check;
|
|
73
69
|
/**
|
|
74
70
|
* Check an Apex sfdx-project for syntax errors.
|
|
75
71
|
*
|
|
@@ -78,13 +74,12 @@ exports.check = check;
|
|
|
78
74
|
* @returns Result for each package with status (0 ok, 1 error, 2 missing path)
|
|
79
75
|
* and syntax errors.
|
|
80
76
|
*/
|
|
81
|
-
async function checkProject(pathStr) {
|
|
82
|
-
const path =
|
|
77
|
+
export async function checkProject(pathStr) {
|
|
78
|
+
const path = resolve(pathStr || process.argv[1] || process.cwd());
|
|
83
79
|
const ext = ".cls,.trigger";
|
|
84
|
-
const name =
|
|
80
|
+
const name = basename(path);
|
|
85
81
|
const project = findProjectFile(path, 1);
|
|
86
|
-
|
|
87
|
-
if (packages.length == 0) {
|
|
82
|
+
if (!project) {
|
|
88
83
|
console.error(`[${name}]: No valid SFDX project, checking all cls & trigger files`);
|
|
89
84
|
const result = await check(path, ext);
|
|
90
85
|
return [
|
|
@@ -95,26 +90,27 @@ async function checkProject(pathStr) {
|
|
|
95
90
|
},
|
|
96
91
|
];
|
|
97
92
|
}
|
|
98
|
-
const
|
|
93
|
+
const packages = getProjectPackages(project);
|
|
94
|
+
const projectDir = dirname(project);
|
|
99
95
|
const projectResult = await Promise.all(packages.map(async (pkg) => {
|
|
100
96
|
console.log(`[${name}]: Checking package "${pkg}"`);
|
|
101
|
-
const pkgPath =
|
|
97
|
+
const pkgPath = resolve(projectDir, pkg);
|
|
102
98
|
const result = await check(pkgPath, ext);
|
|
103
99
|
return {
|
|
104
100
|
name,
|
|
105
101
|
pkg,
|
|
106
|
-
path:
|
|
102
|
+
path: relative(path, pkgPath),
|
|
107
103
|
...result,
|
|
108
104
|
};
|
|
109
105
|
}));
|
|
110
106
|
process.exitCode = Math.max(...projectResult.map(r => r.status));
|
|
111
107
|
return projectResult;
|
|
112
108
|
}
|
|
113
|
-
|
|
114
|
-
|
|
109
|
+
class CheckApexErrorListener extends ApexErrorListener {
|
|
110
|
+
path;
|
|
111
|
+
errors = [];
|
|
115
112
|
constructor(relativePath) {
|
|
116
113
|
super();
|
|
117
|
-
this.errors = [];
|
|
118
114
|
this.path = relativePath;
|
|
119
115
|
}
|
|
120
116
|
apexSyntaxError(line, column, message) {
|
|
@@ -147,13 +143,13 @@ async function parseFiles(path, extensions) {
|
|
|
147
143
|
return extensions.flatMap(ext => parseByType(path, files, ext, parsers[ext]));
|
|
148
144
|
}
|
|
149
145
|
async function getPathsInDir(path, ext) {
|
|
150
|
-
const dirent = await
|
|
146
|
+
const dirent = await readdir(path, {
|
|
151
147
|
withFileTypes: true,
|
|
152
148
|
recursive: true,
|
|
153
149
|
});
|
|
154
150
|
return dirent.reduce((files, ent) => {
|
|
155
|
-
if (ent.isFile() && ext.includes(
|
|
156
|
-
files.push(
|
|
151
|
+
if (ent.isFile() && ext.includes(extname(ent.name))) {
|
|
152
|
+
files.push(join(ent.parentPath, ent.name));
|
|
157
153
|
}
|
|
158
154
|
return files;
|
|
159
155
|
}, []);
|
|
@@ -164,9 +160,9 @@ function parseByType(rootPath, files, endsWith, operation) {
|
|
|
164
160
|
files
|
|
165
161
|
.filter(name => name.endsWith(endsWith))
|
|
166
162
|
.forEach(file => {
|
|
167
|
-
if (
|
|
168
|
-
const parser =
|
|
169
|
-
const relativePath =
|
|
163
|
+
if (lstatSync(file).isFile()) {
|
|
164
|
+
const parser = ApexParserFactory.createParser(readFileSync(file).toString());
|
|
165
|
+
const relativePath = relative(rootPath, file);
|
|
170
166
|
const listener = new CheckApexErrorListener(relativePath);
|
|
171
167
|
parser.addErrorListener(listener);
|
|
172
168
|
operation(parser);
|
|
@@ -183,14 +179,14 @@ function parseByType(rootPath, files, endsWith, operation) {
|
|
|
183
179
|
}
|
|
184
180
|
function findProjectFile(wd, depth) {
|
|
185
181
|
const proj = "sfdx-project.json";
|
|
186
|
-
const files =
|
|
182
|
+
const files = readdirSync(wd).filter(i => !/(^|\/)\.[^/.]/g.test(i));
|
|
187
183
|
if (files.includes(proj)) {
|
|
188
|
-
return
|
|
184
|
+
return resolve(wd, proj);
|
|
189
185
|
}
|
|
190
186
|
if (depth) {
|
|
191
187
|
const dirs = files
|
|
192
|
-
.map(f =>
|
|
193
|
-
.filter(f =>
|
|
188
|
+
.map(f => resolve(wd, f))
|
|
189
|
+
.filter(f => lstatSync(f).isDirectory());
|
|
194
190
|
const newDepth = depth - 1;
|
|
195
191
|
for (const d of dirs) {
|
|
196
192
|
const p = findProjectFile(d, newDepth);
|
|
@@ -202,10 +198,7 @@ function findProjectFile(wd, depth) {
|
|
|
202
198
|
return undefined;
|
|
203
199
|
}
|
|
204
200
|
function getProjectPackages(projectFilePath) {
|
|
205
|
-
|
|
206
|
-
return [];
|
|
207
|
-
}
|
|
208
|
-
const config = JSON.parse((0, node_fs_1.readFileSync)(projectFilePath, { encoding: "utf8" }));
|
|
201
|
+
const config = JSON.parse(readFileSync(projectFilePath, { encoding: "utf8" }));
|
|
209
202
|
const packages = config.packageDirectories || [];
|
|
210
203
|
return packages.flatMap(p => (p.path ? p.path.replace(/\\/g, "/") : []));
|
|
211
204
|
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Check.js","sourceRoot":"","sources":["../../src/Check.ts"],"names":[],"mappings":"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"}
|