@actions/expressions 0.2.0
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/LICENSE +21 -0
- package/README.md +95 -0
- package/dist/ast.d.ts +66 -0
- package/dist/ast.d.ts.map +1 -0
- package/dist/ast.js +87 -0
- package/dist/ast.js.map +1 -0
- package/dist/completion/descriptionDictionary.d.ts +15 -0
- package/dist/completion/descriptionDictionary.d.ts.map +1 -0
- package/dist/completion/descriptionDictionary.js +33 -0
- package/dist/completion/descriptionDictionary.js.map +1 -0
- package/dist/completion.d.ts +26 -0
- package/dist/completion.d.ts.map +1 -0
- package/dist/completion.js +124 -0
- package/dist/completion.js.map +1 -0
- package/dist/data/array.d.ts +13 -0
- package/dist/data/array.d.ts.map +1 -0
- package/dist/data/array.js +27 -0
- package/dist/data/array.js.map +1 -0
- package/dist/data/boolean.d.ts +10 -0
- package/dist/data/boolean.d.ts.map +1 -0
- package/dist/data/boolean.js +21 -0
- package/dist/data/boolean.js.map +1 -0
- package/dist/data/dictionary.d.ts +17 -0
- package/dist/data/dictionary.d.ts.map +1 -0
- package/dist/data/dictionary.js +48 -0
- package/dist/data/dictionary.js.map +1 -0
- package/dist/data/expressiondata.d.ts +28 -0
- package/dist/data/expressiondata.d.ts.map +1 -0
- package/dist/data/expressiondata.js +28 -0
- package/dist/data/expressiondata.js.map +1 -0
- package/dist/data/index.d.ts +10 -0
- package/dist/data/index.d.ts.map +1 -0
- package/dist/data/index.js +10 -0
- package/dist/data/index.js.map +1 -0
- package/dist/data/null.d.ts +8 -0
- package/dist/data/null.d.ts.map +1 -0
- package/dist/data/null.js +14 -0
- package/dist/data/null.js.map +1 -0
- package/dist/data/number.d.ts +10 -0
- package/dist/data/number.d.ts.map +1 -0
- package/dist/data/number.js +20 -0
- package/dist/data/number.js.map +1 -0
- package/dist/data/replacer.d.ts +7 -0
- package/dist/data/replacer.d.ts.map +1 -0
- package/dist/data/replacer.js +38 -0
- package/dist/data/replacer.js.map +1 -0
- package/dist/data/reviver.d.ts +8 -0
- package/dist/data/reviver.d.ts.map +1 -0
- package/dist/data/reviver.js +37 -0
- package/dist/data/reviver.js.map +1 -0
- package/dist/data/string.d.ts +10 -0
- package/dist/data/string.d.ts.map +1 -0
- package/dist/data/string.js +15 -0
- package/dist/data/string.js.map +1 -0
- package/dist/errors.d.ts +23 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +50 -0
- package/dist/errors.js.map +1 -0
- package/dist/evaluator.d.ts +26 -0
- package/dist/evaluator.d.ts.map +1 -0
- package/dist/evaluator.js +191 -0
- package/dist/evaluator.js.map +1 -0
- package/dist/filtered_array.d.ts +4 -0
- package/dist/filtered_array.d.ts.map +1 -0
- package/dist/filtered_array.js +4 -0
- package/dist/filtered_array.js.map +1 -0
- package/dist/funcs/contains.d.ts +3 -0
- package/dist/funcs/contains.d.ts.map +1 -0
- package/dist/funcs/contains.js +32 -0
- package/dist/funcs/contains.js.map +1 -0
- package/dist/funcs/endswith.d.ts +3 -0
- package/dist/funcs/endswith.d.ts.map +1 -0
- package/dist/funcs/endswith.js +22 -0
- package/dist/funcs/endswith.js.map +1 -0
- package/dist/funcs/format.d.ts +3 -0
- package/dist/funcs/format.d.ts.map +1 -0
- package/dist/funcs/format.js +95 -0
- package/dist/funcs/format.js.map +1 -0
- package/dist/funcs/fromjson.d.ts +3 -0
- package/dist/funcs/fromjson.d.ts.map +1 -0
- package/dist/funcs/fromjson.js +22 -0
- package/dist/funcs/fromjson.js.map +1 -0
- package/dist/funcs/info.d.ts +11 -0
- package/dist/funcs/info.d.ts.map +1 -0
- package/dist/funcs/info.js +2 -0
- package/dist/funcs/info.js.map +1 -0
- package/dist/funcs/join.d.ts +3 -0
- package/dist/funcs/join.d.ts.map +1 -0
- package/dist/funcs/join.js +28 -0
- package/dist/funcs/join.js.map +1 -0
- package/dist/funcs/startswith.d.ts +3 -0
- package/dist/funcs/startswith.d.ts.map +1 -0
- package/dist/funcs/startswith.js +22 -0
- package/dist/funcs/startswith.js.map +1 -0
- package/dist/funcs/tojson.d.ts +3 -0
- package/dist/funcs/tojson.d.ts.map +1 -0
- package/dist/funcs/tojson.js +12 -0
- package/dist/funcs/tojson.js.map +1 -0
- package/dist/funcs.d.ts +12 -0
- package/dist/funcs.d.ts.map +1 -0
- package/dist/funcs.js +43 -0
- package/dist/funcs.js.map +1 -0
- package/dist/idxHelper.d.ts +8 -0
- package/dist/idxHelper.d.ts.map +1 -0
- package/dist/idxHelper.js +19 -0
- package/dist/idxHelper.js.map +1 -0
- package/dist/index.d.ts +10 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +10 -0
- package/dist/index.js.map +1 -0
- package/dist/lexer.d.ts +68 -0
- package/dist/lexer.d.ts.map +1 -0
- package/dist/lexer.js +324 -0
- package/dist/lexer.js.map +1 -0
- package/dist/parser.d.ts +40 -0
- package/dist/parser.d.ts.map +1 -0
- package/dist/parser.js +284 -0
- package/dist/parser.js.map +1 -0
- package/dist/result.d.ts +9 -0
- package/dist/result.d.ts.map +1 -0
- package/dist/result.js +190 -0
- package/dist/result.js.map +1 -0
- package/package.json +64 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright GitHub
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
# actions/expressions
|
|
2
|
+
|
|
3
|
+
`@actions/expressions` is a library to parse and evaluate GitHub Actions [expressions](https://docs.github.com/actions/learn-github-actions/expressions).
|
|
4
|
+
|
|
5
|
+
## Installation
|
|
6
|
+
|
|
7
|
+
The [package](https://www.npmjs.com/package/@actions/expressions) contains TypeScript types and compiled ECMAScript modules.
|
|
8
|
+
|
|
9
|
+
```bash
|
|
10
|
+
npm install @actions/expressions
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
## Usage
|
|
14
|
+
|
|
15
|
+
### Simple example
|
|
16
|
+
|
|
17
|
+
```ts
|
|
18
|
+
import { Parser, Lexer, Evaluator, data } from '@actions/expressions';
|
|
19
|
+
|
|
20
|
+
const lexer = new Lexer("1 == 2");
|
|
21
|
+
const lr = lexer.lex();
|
|
22
|
+
|
|
23
|
+
const parser = new Parser(lr.tokens, [], []);
|
|
24
|
+
const expr = parser.parse();
|
|
25
|
+
|
|
26
|
+
const evaluator = new Evaluator(expr, new data.Dictionary());
|
|
27
|
+
const result = evaluator.evaluate();
|
|
28
|
+
|
|
29
|
+
console.log(result.coerceString()) // false
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
### With context data
|
|
33
|
+
|
|
34
|
+
```ts
|
|
35
|
+
import { Parser, Lexer, Evaluator, data } from '@actions/expressions';
|
|
36
|
+
|
|
37
|
+
const lexer = new Lexer("'monalisa' == context.name");
|
|
38
|
+
const lr = lexer.lex();
|
|
39
|
+
|
|
40
|
+
const parser = new Parser(lr.tokens, ["context"], []);
|
|
41
|
+
const expr = parser.parse();
|
|
42
|
+
|
|
43
|
+
const evaluator = new Evaluator(expr, new data.Dictionary([{
|
|
44
|
+
key: "context"
|
|
45
|
+
value: new data.Dictionary([{
|
|
46
|
+
key: "name"
|
|
47
|
+
value: new data.StringData("monalisa")
|
|
48
|
+
}])
|
|
49
|
+
}]));
|
|
50
|
+
const result = evaluator.evaluate();
|
|
51
|
+
|
|
52
|
+
console.log(result.coerceString()) // true
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
## Contributing
|
|
56
|
+
|
|
57
|
+
See [CONTRIBUTING.md](../CONTRIBUTING.md) at the root of the repository for general guidelines and recommendations.
|
|
58
|
+
|
|
59
|
+
This project is just one of multiple implementations of the GitHub Actions Expressions language. We therefore cannot accept contributions that add new language features or significantly change the behavior of existing language features. If you would like to propose a change to the language itself, please use our [Community Forum](https://github.com/community/community/discussions/categories/actions-and-packages).
|
|
60
|
+
|
|
61
|
+
If you do want to contribute, please run [prettier](https://prettier.io/) to format your code and add unit tests as appropriate before submitting your PR. [./testdata](./testdata) contains test cases that all implementations should pass, please also make sure those tests are still passing.
|
|
62
|
+
|
|
63
|
+
### Build
|
|
64
|
+
|
|
65
|
+
```bash
|
|
66
|
+
npm run build
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
or to watch for changes
|
|
70
|
+
|
|
71
|
+
```bash
|
|
72
|
+
npm run watch
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
### Test
|
|
76
|
+
|
|
77
|
+
```bash
|
|
78
|
+
npm test
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
or to watch for changes and run tests:
|
|
82
|
+
|
|
83
|
+
```bash
|
|
84
|
+
npm run test-watch
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
### Lint
|
|
88
|
+
|
|
89
|
+
```bash
|
|
90
|
+
npm run format-check
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
## License
|
|
94
|
+
|
|
95
|
+
This project is licensed under the terms of the MIT open source license. Please refer to [MIT](../LICENSE) for the full terms.
|
package/dist/ast.d.ts
ADDED
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import { ExpressionData } from "./data";
|
|
2
|
+
import { Token } from "./lexer";
|
|
3
|
+
export interface ExprVisitor<R> {
|
|
4
|
+
visitLiteral(literal: Literal): R;
|
|
5
|
+
visitUnary(unary: Unary): R;
|
|
6
|
+
visitBinary(binary: Binary): R;
|
|
7
|
+
visitLogical(binary: Logical): R;
|
|
8
|
+
visitGrouping(grouping: Grouping): R;
|
|
9
|
+
visitContextAccess(contextAccess: ContextAccess): R;
|
|
10
|
+
visitIndexAccess(indexAccess: IndexAccess): R;
|
|
11
|
+
visitFunctionCall(functionCall: FunctionCall): R;
|
|
12
|
+
}
|
|
13
|
+
export declare abstract class Expr {
|
|
14
|
+
abstract accept<R>(v: ExprVisitor<R>): R;
|
|
15
|
+
}
|
|
16
|
+
export declare class Literal extends Expr {
|
|
17
|
+
literal: ExpressionData;
|
|
18
|
+
token: Token;
|
|
19
|
+
constructor(literal: ExpressionData, token: Token);
|
|
20
|
+
accept<R>(v: ExprVisitor<R>): R;
|
|
21
|
+
}
|
|
22
|
+
export declare class Unary extends Expr {
|
|
23
|
+
operator: Token;
|
|
24
|
+
expr: Expr;
|
|
25
|
+
constructor(operator: Token, expr: Expr);
|
|
26
|
+
accept<R>(v: ExprVisitor<R>): R;
|
|
27
|
+
}
|
|
28
|
+
export declare class FunctionCall extends Expr {
|
|
29
|
+
functionName: Token;
|
|
30
|
+
args: Expr[];
|
|
31
|
+
constructor(functionName: Token, args: Expr[]);
|
|
32
|
+
accept<R>(v: ExprVisitor<R>): R;
|
|
33
|
+
}
|
|
34
|
+
export declare class Binary extends Expr {
|
|
35
|
+
left: Expr;
|
|
36
|
+
operator: Token;
|
|
37
|
+
right: Expr;
|
|
38
|
+
constructor(left: Expr, operator: Token, right: Expr);
|
|
39
|
+
accept<R>(v: ExprVisitor<R>): R;
|
|
40
|
+
}
|
|
41
|
+
export declare class Logical extends Expr {
|
|
42
|
+
operator: Token;
|
|
43
|
+
args: Expr[];
|
|
44
|
+
constructor(operator: Token, args: Expr[]);
|
|
45
|
+
accept<R>(v: ExprVisitor<R>): R;
|
|
46
|
+
}
|
|
47
|
+
export declare class Grouping extends Expr {
|
|
48
|
+
group: Expr;
|
|
49
|
+
constructor(group: Expr);
|
|
50
|
+
accept<R>(v: ExprVisitor<R>): R;
|
|
51
|
+
}
|
|
52
|
+
export declare class ContextAccess extends Expr {
|
|
53
|
+
name: Token;
|
|
54
|
+
constructor(name: Token);
|
|
55
|
+
accept<R>(v: ExprVisitor<R>): R;
|
|
56
|
+
}
|
|
57
|
+
export declare class IndexAccess extends Expr {
|
|
58
|
+
expr: Expr;
|
|
59
|
+
index: Expr;
|
|
60
|
+
constructor(expr: Expr, index: Expr);
|
|
61
|
+
accept<R>(v: ExprVisitor<R>): R;
|
|
62
|
+
}
|
|
63
|
+
export declare class Star extends Expr {
|
|
64
|
+
accept<R>(): R;
|
|
65
|
+
}
|
|
66
|
+
//# sourceMappingURL=ast.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ast.d.ts","sourceRoot":"","sources":["../src/ast.ts"],"names":[],"mappings":"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"}
|
package/dist/ast.js
ADDED
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
export class Expr {
|
|
2
|
+
}
|
|
3
|
+
export class Literal extends Expr {
|
|
4
|
+
constructor(literal, token) {
|
|
5
|
+
super();
|
|
6
|
+
this.literal = literal;
|
|
7
|
+
this.token = token;
|
|
8
|
+
}
|
|
9
|
+
accept(v) {
|
|
10
|
+
return v.visitLiteral(this);
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
export class Unary extends Expr {
|
|
14
|
+
constructor(operator, expr) {
|
|
15
|
+
super();
|
|
16
|
+
this.operator = operator;
|
|
17
|
+
this.expr = expr;
|
|
18
|
+
}
|
|
19
|
+
accept(v) {
|
|
20
|
+
return v.visitUnary(this);
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
export class FunctionCall extends Expr {
|
|
24
|
+
constructor(functionName, args) {
|
|
25
|
+
super();
|
|
26
|
+
this.functionName = functionName;
|
|
27
|
+
this.args = args;
|
|
28
|
+
}
|
|
29
|
+
accept(v) {
|
|
30
|
+
return v.visitFunctionCall(this);
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
export class Binary extends Expr {
|
|
34
|
+
constructor(left, operator, right) {
|
|
35
|
+
super();
|
|
36
|
+
this.left = left;
|
|
37
|
+
this.operator = operator;
|
|
38
|
+
this.right = right;
|
|
39
|
+
}
|
|
40
|
+
accept(v) {
|
|
41
|
+
return v.visitBinary(this);
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
export class Logical extends Expr {
|
|
45
|
+
constructor(operator, args) {
|
|
46
|
+
super();
|
|
47
|
+
this.operator = operator;
|
|
48
|
+
this.args = args;
|
|
49
|
+
}
|
|
50
|
+
accept(v) {
|
|
51
|
+
return v.visitLogical(this);
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
export class Grouping extends Expr {
|
|
55
|
+
constructor(group) {
|
|
56
|
+
super();
|
|
57
|
+
this.group = group;
|
|
58
|
+
}
|
|
59
|
+
accept(v) {
|
|
60
|
+
return v.visitGrouping(this);
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
export class ContextAccess extends Expr {
|
|
64
|
+
constructor(name) {
|
|
65
|
+
super();
|
|
66
|
+
this.name = name;
|
|
67
|
+
}
|
|
68
|
+
accept(v) {
|
|
69
|
+
return v.visitContextAccess(this);
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
export class IndexAccess extends Expr {
|
|
73
|
+
constructor(expr, index) {
|
|
74
|
+
super();
|
|
75
|
+
this.expr = expr;
|
|
76
|
+
this.index = index;
|
|
77
|
+
}
|
|
78
|
+
accept(v) {
|
|
79
|
+
return v.visitIndexAccess(this);
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
export class Star extends Expr {
|
|
83
|
+
accept() {
|
|
84
|
+
throw new Error("Method not implemented.");
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
//# sourceMappingURL=ast.js.map
|
package/dist/ast.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ast.js","sourceRoot":"","sources":["../src/ast.ts"],"names":[],"mappings":"AAcA,MAAM,OAAgB,IAAI;CAEzB;AAED,MAAM,OAAO,OAAQ,SAAQ,IAAI;IAC/B,YAAmB,OAAuB,EAAS,KAAY;QAC7D,KAAK,EAAE,CAAC;QADS,YAAO,GAAP,OAAO,CAAgB;QAAS,UAAK,GAAL,KAAK,CAAO;IAE/D,CAAC;IAED,MAAM,CAAI,CAAiB;QACzB,OAAO,CAAC,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;IAC9B,CAAC;CACF;AAED,MAAM,OAAO,KAAM,SAAQ,IAAI;IAC7B,YAAmB,QAAe,EAAS,IAAU;QACnD,KAAK,EAAE,CAAC;QADS,aAAQ,GAAR,QAAQ,CAAO;QAAS,SAAI,GAAJ,IAAI,CAAM;IAErD,CAAC;IAED,MAAM,CAAI,CAAiB;QACzB,OAAO,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;IAC5B,CAAC;CACF;AAED,MAAM,OAAO,YAAa,SAAQ,IAAI;IACpC,YAAmB,YAAmB,EAAS,IAAY;QACzD,KAAK,EAAE,CAAC;QADS,iBAAY,GAAZ,YAAY,CAAO;QAAS,SAAI,GAAJ,IAAI,CAAQ;IAE3D,CAAC;IAED,MAAM,CAAI,CAAiB;QACzB,OAAO,CAAC,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC;IACnC,CAAC;CACF;AAED,MAAM,OAAO,MAAO,SAAQ,IAAI;IAC9B,YAAmB,IAAU,EAAS,QAAe,EAAS,KAAW;QACvE,KAAK,EAAE,CAAC;QADS,SAAI,GAAJ,IAAI,CAAM;QAAS,aAAQ,GAAR,QAAQ,CAAO;QAAS,UAAK,GAAL,KAAK,CAAM;IAEzE,CAAC;IAED,MAAM,CAAI,CAAiB;QACzB,OAAO,CAAC,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;IAC7B,CAAC;CACF;AAED,MAAM,OAAO,OAAQ,SAAQ,IAAI;IAC/B,YAAmB,QAAe,EAAS,IAAY;QACrD,KAAK,EAAE,CAAC;QADS,aAAQ,GAAR,QAAQ,CAAO;QAAS,SAAI,GAAJ,IAAI,CAAQ;IAEvD,CAAC;IAED,MAAM,CAAI,CAAiB;QACzB,OAAO,CAAC,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;IAC9B,CAAC;CACF;AAED,MAAM,OAAO,QAAS,SAAQ,IAAI;IAChC,YAAmB,KAAW;QAC5B,KAAK,EAAE,CAAC;QADS,UAAK,GAAL,KAAK,CAAM;IAE9B,CAAC;IAED,MAAM,CAAI,CAAiB;QACzB,OAAO,CAAC,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;IAC/B,CAAC;CACF;AAED,MAAM,OAAO,aAAc,SAAQ,IAAI;IACrC,YAAmB,IAAW;QAC5B,KAAK,EAAE,CAAC;QADS,SAAI,GAAJ,IAAI,CAAO;IAE9B,CAAC;IAED,MAAM,CAAI,CAAiB;QACzB,OAAO,CAAC,CAAC,kBAAkB,CAAC,IAAI,CAAC,CAAC;IACpC,CAAC;CACF;AAED,MAAM,OAAO,WAAY,SAAQ,IAAI;IACnC,YAAmB,IAAU,EAAS,KAAW;QAC/C,KAAK,EAAE,CAAC;QADS,SAAI,GAAJ,IAAI,CAAM;QAAS,UAAK,GAAL,KAAK,CAAM;IAEjD,CAAC;IAED,MAAM,CAAI,CAAiB;QACzB,OAAO,CAAC,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC;IAClC,CAAC;CACF;AAED,MAAM,OAAO,IAAK,SAAQ,IAAI;IAC5B,MAAM;QACJ,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAC;IAC7C,CAAC;CACF"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { Dictionary } from "../data/dictionary";
|
|
2
|
+
import { ExpressionData, Pair } from "../data/expressiondata";
|
|
3
|
+
export type DescriptionPair = Pair & {
|
|
4
|
+
description?: string;
|
|
5
|
+
};
|
|
6
|
+
export declare function isDescriptionDictionary(x: ExpressionData): x is DescriptionDictionary;
|
|
7
|
+
export declare class DescriptionDictionary extends Dictionary {
|
|
8
|
+
private readonly descriptions;
|
|
9
|
+
complete: boolean;
|
|
10
|
+
constructor(...pairs: DescriptionPair[]);
|
|
11
|
+
add(key: string, value: ExpressionData, description?: string): void;
|
|
12
|
+
pairs(): DescriptionPair[];
|
|
13
|
+
getDescription(key: string): string | undefined;
|
|
14
|
+
}
|
|
15
|
+
//# sourceMappingURL=descriptionDictionary.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"descriptionDictionary.d.ts","sourceRoot":"","sources":["../../src/completion/descriptionDictionary.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,UAAU,EAAC,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAC,cAAc,EAAQ,IAAI,EAAC,MAAM,wBAAwB,CAAC;AAElE,MAAM,MAAM,eAAe,GAAG,IAAI,GAAG;IAAC,WAAW,CAAC,EAAE,MAAM,CAAA;CAAC,CAAC;AAE5D,wBAAgB,uBAAuB,CAAC,CAAC,EAAE,cAAc,GAAG,CAAC,IAAI,qBAAqB,CAErF;AAED,qBAAa,qBAAsB,SAAQ,UAAU;IACnD,OAAO,CAAC,QAAQ,CAAC,YAAY,CAA6B;IACnD,QAAQ,UAAQ;gBAEX,GAAG,KAAK,EAAE,eAAe,EAAE;IAQ9B,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,cAAc,EAAE,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI;IAYnE,KAAK,IAAI,eAAe,EAAE;IAKnC,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;CAGhD"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { Dictionary } from "../data/dictionary";
|
|
2
|
+
import { Kind } from "../data/expressiondata";
|
|
3
|
+
export function isDescriptionDictionary(x) {
|
|
4
|
+
return x.kind === Kind.Dictionary && x instanceof DescriptionDictionary;
|
|
5
|
+
}
|
|
6
|
+
export class DescriptionDictionary extends Dictionary {
|
|
7
|
+
constructor(...pairs) {
|
|
8
|
+
super();
|
|
9
|
+
this.descriptions = new Map();
|
|
10
|
+
this.complete = true;
|
|
11
|
+
for (const p of pairs) {
|
|
12
|
+
this.add(p.key, p.value, p.description);
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
add(key, value, description) {
|
|
16
|
+
if (this.get(key) !== undefined) {
|
|
17
|
+
// Key already added, ignore
|
|
18
|
+
return;
|
|
19
|
+
}
|
|
20
|
+
super.add(key, value);
|
|
21
|
+
if (description) {
|
|
22
|
+
this.descriptions.set(key, description);
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
pairs() {
|
|
26
|
+
const pairs = super.pairs();
|
|
27
|
+
return pairs.map(p => ({ ...p, description: this.descriptions.get(p.key) }));
|
|
28
|
+
}
|
|
29
|
+
getDescription(key) {
|
|
30
|
+
return this.descriptions.get(key);
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
//# sourceMappingURL=descriptionDictionary.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"descriptionDictionary.js","sourceRoot":"","sources":["../../src/completion/descriptionDictionary.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,UAAU,EAAC,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAiB,IAAI,EAAO,MAAM,wBAAwB,CAAC;AAIlE,MAAM,UAAU,uBAAuB,CAAC,CAAiB;IACvD,OAAO,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,UAAU,IAAI,CAAC,YAAY,qBAAqB,CAAC;AAC1E,CAAC;AAED,MAAM,OAAO,qBAAsB,SAAQ,UAAU;IAInD,YAAY,GAAG,KAAwB;QACrC,KAAK,EAAE,CAAC;QAJO,iBAAY,GAAG,IAAI,GAAG,EAAkB,CAAC;QACnD,aAAQ,GAAG,IAAI,CAAC;QAKrB,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE;YACrB,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,WAAW,CAAC,CAAC;SACzC;IACH,CAAC;IAEQ,GAAG,CAAC,GAAW,EAAE,KAAqB,EAAE,WAAoB;QACnE,IAAI,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,SAAS,EAAE;YAC/B,4BAA4B;YAC5B,OAAO;SACR;QAED,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;QACtB,IAAI,WAAW,EAAE;YACf,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,GAAG,EAAE,WAAW,CAAC,CAAC;SACzC;IACH,CAAC;IAEQ,KAAK;QACZ,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,EAAE,CAAC;QAC5B,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAC,GAAG,CAAC,EAAE,WAAW,EAAE,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,EAAC,CAAC,CAAC,CAAC;IAC7E,CAAC;IAED,cAAc,CAAC,GAAW;QACxB,OAAO,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IACpC,CAAC;CACF"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { Dictionary } from "./data/dictionary";
|
|
2
|
+
import { FunctionDefinition, FunctionInfo } from "./funcs/info";
|
|
3
|
+
import { Token } from "./lexer";
|
|
4
|
+
export type CompletionItem = {
|
|
5
|
+
label: string;
|
|
6
|
+
description?: string;
|
|
7
|
+
function: boolean;
|
|
8
|
+
};
|
|
9
|
+
/**
|
|
10
|
+
* Complete returns a list of completion items for the given expression.
|
|
11
|
+
* The main functionality is auto-completing functions and context access:
|
|
12
|
+
* We can only provide assistance if the input is in one of the following forms (with | denoting the cursor position):
|
|
13
|
+
* - context.path.inp| or context.path['inp| -- auto-complete context access
|
|
14
|
+
* - context.path.| or context.path['| -- auto-complete context access
|
|
15
|
+
* - toJS| -- auto-complete function call or top-level
|
|
16
|
+
* - | -- auto-complete function call or top-level context access
|
|
17
|
+
*
|
|
18
|
+
* @param input Input expression
|
|
19
|
+
* @param context Context available for the expression
|
|
20
|
+
* @param extensionFunctions List of functions available
|
|
21
|
+
* @param functions Optional map of functions to use during evaluation
|
|
22
|
+
* @returns Array of completion items
|
|
23
|
+
*/
|
|
24
|
+
export declare function complete(input: string, context: Dictionary, extensionFunctions: FunctionInfo[], functions?: Map<string, FunctionDefinition>): CompletionItem[];
|
|
25
|
+
export declare function trimTokenVector(tokenVector: Token[]): Token[];
|
|
26
|
+
//# sourceMappingURL=completion.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"completion.d.ts","sourceRoot":"","sources":["../src/completion.ts"],"names":[],"mappings":"AACA,OAAO,EAAC,UAAU,EAAe,MAAM,mBAAmB,CAAC;AAI3D,OAAO,EAAC,kBAAkB,EAAE,YAAY,EAAC,MAAM,cAAc,CAAC;AAC9D,OAAO,EAAQ,KAAK,EAAY,MAAM,SAAS,CAAC;AAGhD,MAAM,MAAM,cAAc,GAAG;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,OAAO,CAAC;CACnB,CAAC;AAEF;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,QAAQ,CACtB,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,UAAU,EACnB,kBAAkB,EAAE,YAAY,EAAE,EAClC,SAAS,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,kBAAkB,CAAC,GAC1C,cAAc,EAAE,CAqDlB;AA6CD,wBAAgB,eAAe,CAAC,WAAW,EAAE,KAAK,EAAE,GAAG,KAAK,EAAE,CAqC7D"}
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
import { isDictionary } from "./data/dictionary";
|
|
2
|
+
import { Evaluator } from "./evaluator";
|
|
3
|
+
import { wellKnownFunctions } from "./funcs";
|
|
4
|
+
import { Lexer, TokenType } from "./lexer";
|
|
5
|
+
import { Parser } from "./parser";
|
|
6
|
+
/**
|
|
7
|
+
* Complete returns a list of completion items for the given expression.
|
|
8
|
+
* The main functionality is auto-completing functions and context access:
|
|
9
|
+
* We can only provide assistance if the input is in one of the following forms (with | denoting the cursor position):
|
|
10
|
+
* - context.path.inp| or context.path['inp| -- auto-complete context access
|
|
11
|
+
* - context.path.| or context.path['| -- auto-complete context access
|
|
12
|
+
* - toJS| -- auto-complete function call or top-level
|
|
13
|
+
* - | -- auto-complete function call or top-level context access
|
|
14
|
+
*
|
|
15
|
+
* @param input Input expression
|
|
16
|
+
* @param context Context available for the expression
|
|
17
|
+
* @param extensionFunctions List of functions available
|
|
18
|
+
* @param functions Optional map of functions to use during evaluation
|
|
19
|
+
* @returns Array of completion items
|
|
20
|
+
*/
|
|
21
|
+
export function complete(input, context, extensionFunctions, functions) {
|
|
22
|
+
// Lex
|
|
23
|
+
const lexer = new Lexer(input);
|
|
24
|
+
const lexResult = lexer.lex();
|
|
25
|
+
// Find interesting part of the tokenVector. For example, for an expression like `github.actor == env.actor.log|`, we are
|
|
26
|
+
// only interested in the `env.actor.log` part for auto-completion
|
|
27
|
+
const tokenInputVector = trimTokenVector(lexResult.tokens);
|
|
28
|
+
// Start by skipping the EOF token
|
|
29
|
+
let tokenIdx = tokenInputVector.length - 2;
|
|
30
|
+
if (tokenIdx >= 0) {
|
|
31
|
+
switch (tokenInputVector[tokenIdx].type) {
|
|
32
|
+
// If there is a (partial) identifier under the cursor, ignore that
|
|
33
|
+
case TokenType.IDENTIFIER:
|
|
34
|
+
tokenIdx--;
|
|
35
|
+
break;
|
|
36
|
+
case TokenType.STRING:
|
|
37
|
+
// TODO: Support string for `context.name['test|`
|
|
38
|
+
return [];
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
if (tokenIdx < 0) {
|
|
42
|
+
// Vector only contains the EOF token. Suggest functions and root context access
|
|
43
|
+
const result = contextKeys(context);
|
|
44
|
+
// Merge with functions
|
|
45
|
+
result.push(...functionItems(extensionFunctions));
|
|
46
|
+
return result;
|
|
47
|
+
}
|
|
48
|
+
// Determine path that led to the last token
|
|
49
|
+
// Use parser & evaluator to determine context to complete.
|
|
50
|
+
const pathTokenVector = tokenInputVector.slice(0, tokenIdx);
|
|
51
|
+
// Include the original EOF token to make the parser happy
|
|
52
|
+
pathTokenVector.push(tokenInputVector[tokenInputVector.length - 1]);
|
|
53
|
+
const p = new Parser(pathTokenVector, context.pairs().map(x => x.key), extensionFunctions);
|
|
54
|
+
const expr = p.parse();
|
|
55
|
+
const ev = new Evaluator(expr, context, functions);
|
|
56
|
+
const result = ev.evaluate();
|
|
57
|
+
return contextKeys(result);
|
|
58
|
+
}
|
|
59
|
+
function functionItems(extensionFunctions) {
|
|
60
|
+
const result = [];
|
|
61
|
+
for (const fdef of [...Object.values(wellKnownFunctions), ...extensionFunctions]) {
|
|
62
|
+
result.push({
|
|
63
|
+
label: fdef.name,
|
|
64
|
+
description: fdef.description,
|
|
65
|
+
function: true
|
|
66
|
+
});
|
|
67
|
+
}
|
|
68
|
+
// Sort functions
|
|
69
|
+
result.sort((a, b) => a.label.localeCompare(b.label));
|
|
70
|
+
return result;
|
|
71
|
+
}
|
|
72
|
+
function contextKeys(context) {
|
|
73
|
+
if (isDictionary(context)) {
|
|
74
|
+
return (context
|
|
75
|
+
.pairs()
|
|
76
|
+
.map(x => completionItemFromContext(x))
|
|
77
|
+
// Sort contexts
|
|
78
|
+
.sort((a, b) => a.label.localeCompare(b.label)));
|
|
79
|
+
}
|
|
80
|
+
return [];
|
|
81
|
+
}
|
|
82
|
+
function completionItemFromContext(pair) {
|
|
83
|
+
const context = pair.key.toString();
|
|
84
|
+
const parenIndex = context.indexOf("(");
|
|
85
|
+
const isFunc = parenIndex >= 0 && context.indexOf(")") >= 0;
|
|
86
|
+
return {
|
|
87
|
+
label: isFunc ? context.substring(0, parenIndex) : context,
|
|
88
|
+
description: pair.description,
|
|
89
|
+
function: isFunc
|
|
90
|
+
};
|
|
91
|
+
}
|
|
92
|
+
export function trimTokenVector(tokenVector) {
|
|
93
|
+
let tokenIdx = tokenVector.length;
|
|
94
|
+
let openParen = 0;
|
|
95
|
+
while (tokenIdx > 0) {
|
|
96
|
+
const token = tokenVector[tokenIdx - 1];
|
|
97
|
+
switch (token.type) {
|
|
98
|
+
case TokenType.LEFT_PAREN:
|
|
99
|
+
if (openParen == 0) {
|
|
100
|
+
// Encountered an open parenthesis without a closing first, stop here
|
|
101
|
+
break;
|
|
102
|
+
}
|
|
103
|
+
openParen--;
|
|
104
|
+
tokenIdx--;
|
|
105
|
+
continue;
|
|
106
|
+
case TokenType.RIGHT_PAREN:
|
|
107
|
+
openParen++;
|
|
108
|
+
tokenIdx--;
|
|
109
|
+
continue;
|
|
110
|
+
case TokenType.IDENTIFIER:
|
|
111
|
+
case TokenType.DOT:
|
|
112
|
+
case TokenType.EOF:
|
|
113
|
+
case TokenType.LEFT_BRACKET:
|
|
114
|
+
case TokenType.RIGHT_BRACKET:
|
|
115
|
+
case TokenType.STRING:
|
|
116
|
+
tokenIdx--;
|
|
117
|
+
continue;
|
|
118
|
+
}
|
|
119
|
+
break;
|
|
120
|
+
}
|
|
121
|
+
// Only keep the part of the token vector we're interested in
|
|
122
|
+
return tokenVector.slice(tokenIdx);
|
|
123
|
+
}
|
|
124
|
+
//# sourceMappingURL=completion.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"completion.js","sourceRoot":"","sources":["../src/completion.ts"],"names":[],"mappings":"AACA,OAAO,EAAa,YAAY,EAAC,MAAM,mBAAmB,CAAC;AAE3D,OAAO,EAAC,SAAS,EAAC,MAAM,aAAa,CAAC;AACtC,OAAO,EAAC,kBAAkB,EAAC,MAAM,SAAS,CAAC;AAE3C,OAAO,EAAC,KAAK,EAAS,SAAS,EAAC,MAAM,SAAS,CAAC;AAChD,OAAO,EAAC,MAAM,EAAC,MAAM,UAAU,CAAC;AAQhC;;;;;;;;;;;;;;GAcG;AACH,MAAM,UAAU,QAAQ,CACtB,KAAa,EACb,OAAmB,EACnB,kBAAkC,EAClC,SAA2C;IAE3C,MAAM;IACN,MAAM,KAAK,GAAG,IAAI,KAAK,CAAC,KAAK,CAAC,CAAC;IAC/B,MAAM,SAAS,GAAG,KAAK,CAAC,GAAG,EAAE,CAAC;IAE9B,yHAAyH;IACzH,kEAAkE;IAClE,MAAM,gBAAgB,GAAG,eAAe,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;IAE3D,kCAAkC;IAClC,IAAI,QAAQ,GAAG,gBAAgB,CAAC,MAAM,GAAG,CAAC,CAAC;IAE3C,IAAI,QAAQ,IAAI,CAAC,EAAE;QACjB,QAAQ,gBAAgB,CAAC,QAAQ,CAAC,CAAC,IAAI,EAAE;YACvC,mEAAmE;YACnE,KAAK,SAAS,CAAC,UAAU;gBACvB,QAAQ,EAAE,CAAC;gBACX,MAAM;YAER,KAAK,SAAS,CAAC,MAAM;gBACnB,iDAAiD;gBACjD,OAAO,EAAE,CAAC;SACb;KACF;IAED,IAAI,QAAQ,GAAG,CAAC,EAAE;QAChB,gFAAgF;QAChF,MAAM,MAAM,GAAG,WAAW,CAAC,OAAO,CAAC,CAAC;QAEpC,uBAAuB;QACvB,MAAM,CAAC,IAAI,CAAC,GAAG,aAAa,CAAC,kBAAkB,CAAC,CAAC,CAAC;QAElD,OAAO,MAAM,CAAC;KACf;IAED,4CAA4C;IAC5C,2DAA2D;IAC3D,MAAM,eAAe,GAAG,gBAAgB,CAAC,KAAK,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC;IAE5D,0DAA0D;IAC1D,eAAe,CAAC,IAAI,CAAC,gBAAgB,CAAC,gBAAgB,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC;IAEpE,MAAM,CAAC,GAAG,IAAI,MAAM,CAClB,eAAe,EACf,OAAO,CAAC,KAAK,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,EAC/B,kBAAkB,CACnB,CAAC;IACF,MAAM,IAAI,GAAG,CAAC,CAAC,KAAK,EAAE,CAAC;IAEvB,MAAM,EAAE,GAAG,IAAI,SAAS,CAAC,IAAI,EAAE,OAAO,EAAE,SAAS,CAAC,CAAC;IACnD,MAAM,MAAM,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC;IAE7B,OAAO,WAAW,CAAC,MAAM,CAAC,CAAC;AAC7B,CAAC;AAED,SAAS,aAAa,CAAC,kBAAkC;IACvD,MAAM,MAAM,GAAqB,EAAE,CAAC;IAEpC,KAAK,MAAM,IAAI,IAAI,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,kBAAkB,CAAC,EAAE,GAAG,kBAAkB,CAAC,EAAE;QAChF,MAAM,CAAC,IAAI,CAAC;YACV,KAAK,EAAE,IAAI,CAAC,IAAI;YAChB,WAAW,EAAE,IAAI,CAAC,WAAW;YAC7B,QAAQ,EAAE,IAAI;SACf,CAAC,CAAC;KACJ;IAED,iBAAiB;IACjB,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;IAEtD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAS,WAAW,CAAC,OAAuB;IAC1C,IAAI,YAAY,CAAC,OAAO,CAAC,EAAE;QACzB,OAAO,CACL,OAAO;aACJ,KAAK,EAAE;aACP,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,yBAAyB,CAAC,CAAC,CAAC,CAAC;YACvC,gBAAgB;aACf,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAClD,CAAC;KACH;IAED,OAAO,EAAE,CAAC;AACZ,CAAC;AAED,SAAS,yBAAyB,CAAC,IAAqB;IACtD,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC;IACpC,MAAM,UAAU,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IACxC,MAAM,MAAM,GAAG,UAAU,IAAI,CAAC,IAAI,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAE5D,OAAO;QACL,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC,CAAC,CAAC,OAAO;QAC1D,WAAW,EAAE,IAAI,CAAC,WAAW;QAC7B,QAAQ,EAAE,MAAM;KACjB,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,WAAoB;IAClD,IAAI,QAAQ,GAAG,WAAW,CAAC,MAAM,CAAC;IAElC,IAAI,SAAS,GAAG,CAAC,CAAC;IAElB,OAAO,QAAQ,GAAG,CAAC,EAAE;QACnB,MAAM,KAAK,GAAG,WAAW,CAAC,QAAQ,GAAG,CAAC,CAAC,CAAC;QACxC,QAAQ,KAAK,CAAC,IAAI,EAAE;YAClB,KAAK,SAAS,CAAC,UAAU;gBACvB,IAAI,SAAS,IAAI,CAAC,EAAE;oBAClB,qEAAqE;oBACrE,MAAM;iBACP;gBACD,SAAS,EAAE,CAAC;gBACZ,QAAQ,EAAE,CAAC;gBACX,SAAS;YAEX,KAAK,SAAS,CAAC,WAAW;gBACxB,SAAS,EAAE,CAAC;gBACZ,QAAQ,EAAE,CAAC;gBACX,SAAS;YAEX,KAAK,SAAS,CAAC,UAAU,CAAC;YAC1B,KAAK,SAAS,CAAC,GAAG,CAAC;YACnB,KAAK,SAAS,CAAC,GAAG,CAAC;YACnB,KAAK,SAAS,CAAC,YAAY,CAAC;YAC5B,KAAK,SAAS,CAAC,aAAa,CAAC;YAC7B,KAAK,SAAS,CAAC,MAAM;gBACnB,QAAQ,EAAE,CAAC;gBACX,SAAS;SACZ;QAED,MAAM;KACP;IAED,6DAA6D;IAC7D,OAAO,WAAW,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;AACrC,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { ExpressionData, ExpressionDataInterface, Kind } from "./expressiondata";
|
|
2
|
+
export declare class Array implements ExpressionDataInterface {
|
|
3
|
+
private v;
|
|
4
|
+
constructor(...data: ExpressionData[]);
|
|
5
|
+
readonly kind = Kind.Array;
|
|
6
|
+
primitive: boolean;
|
|
7
|
+
coerceString(): string;
|
|
8
|
+
number(): number;
|
|
9
|
+
add(value: ExpressionData): void;
|
|
10
|
+
get(index: number): ExpressionData;
|
|
11
|
+
values(): ExpressionData[];
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=array.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"array.d.ts","sourceRoot":"","sources":["../../src/data/array.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,cAAc,EAAE,uBAAuB,EAAE,IAAI,EAAU,MAAM,kBAAkB,CAAC;AAExF,qBAAa,KAAM,YAAW,uBAAuB;IACnD,OAAO,CAAC,CAAC,CAAwB;gBAErB,GAAG,IAAI,EAAE,cAAc,EAAE;IAMrC,SAAgB,IAAI,cAAc;IAE3B,SAAS,UAAS;IAEzB,YAAY,IAAI,MAAM;IAItB,MAAM,IAAI,MAAM;IAIhB,GAAG,CAAC,KAAK,EAAE,cAAc;IAIzB,GAAG,CAAC,KAAK,EAAE,MAAM,GAAG,cAAc;IAIlC,MAAM,IAAI,cAAc,EAAE;CAG3B"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { Kind, kindStr } from "./expressiondata";
|
|
2
|
+
export class Array {
|
|
3
|
+
constructor(...data) {
|
|
4
|
+
this.v = [];
|
|
5
|
+
this.kind = Kind.Array;
|
|
6
|
+
this.primitive = false;
|
|
7
|
+
for (const d of data) {
|
|
8
|
+
this.add(d);
|
|
9
|
+
}
|
|
10
|
+
}
|
|
11
|
+
coerceString() {
|
|
12
|
+
return kindStr(this.kind);
|
|
13
|
+
}
|
|
14
|
+
number() {
|
|
15
|
+
return NaN;
|
|
16
|
+
}
|
|
17
|
+
add(value) {
|
|
18
|
+
this.v.push(value);
|
|
19
|
+
}
|
|
20
|
+
get(index) {
|
|
21
|
+
return this.v[index];
|
|
22
|
+
}
|
|
23
|
+
values() {
|
|
24
|
+
return this.v;
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
//# sourceMappingURL=array.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"array.js","sourceRoot":"","sources":["../../src/data/array.ts"],"names":[],"mappings":"AAAA,OAAO,EAA0C,IAAI,EAAE,OAAO,EAAC,MAAM,kBAAkB,CAAC;AAExF,MAAM,OAAO,KAAK;IAGhB,YAAY,GAAG,IAAsB;QAF7B,MAAC,GAAqB,EAAE,CAAC;QAQjB,SAAI,GAAG,IAAI,CAAC,KAAK,CAAC;QAE3B,cAAS,GAAG,KAAK,CAAC;QAPvB,KAAK,MAAM,CAAC,IAAI,IAAI,EAAE;YACpB,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;SACb;IACH,CAAC;IAMD,YAAY;QACV,OAAO,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC5B,CAAC;IAED,MAAM;QACJ,OAAO,GAAG,CAAC;IACb,CAAC;IAED,GAAG,CAAC,KAAqB;QACvB,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACrB,CAAC;IAED,GAAG,CAAC,KAAa;QACf,OAAO,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;IACvB,CAAC;IAED,MAAM;QACJ,OAAO,IAAI,CAAC,CAAC,CAAC;IAChB,CAAC;CACF"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { ExpressionDataInterface, Kind } from "./expressiondata";
|
|
2
|
+
export declare class BooleanData implements ExpressionDataInterface {
|
|
3
|
+
readonly value: boolean;
|
|
4
|
+
constructor(value: boolean);
|
|
5
|
+
readonly kind = Kind.Boolean;
|
|
6
|
+
primitive: boolean;
|
|
7
|
+
coerceString(): string;
|
|
8
|
+
number(): number;
|
|
9
|
+
}
|
|
10
|
+
//# sourceMappingURL=boolean.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"boolean.d.ts","sourceRoot":"","sources":["../../src/data/boolean.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,uBAAuB,EAAE,IAAI,EAAC,MAAM,kBAAkB,CAAC;AAE/D,qBAAa,WAAY,YAAW,uBAAuB;aAC7B,KAAK,EAAE,OAAO;gBAAd,KAAK,EAAE,OAAO;IAE1C,SAAgB,IAAI,gBAAgB;IAE7B,SAAS,UAAQ;IAExB,YAAY,IAAI,MAAM;IAQtB,MAAM,IAAI,MAAM;CAOjB"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { Kind } from "./expressiondata";
|
|
2
|
+
export class BooleanData {
|
|
3
|
+
constructor(value) {
|
|
4
|
+
this.value = value;
|
|
5
|
+
this.kind = Kind.Boolean;
|
|
6
|
+
this.primitive = true;
|
|
7
|
+
}
|
|
8
|
+
coerceString() {
|
|
9
|
+
if (this.value) {
|
|
10
|
+
return "true";
|
|
11
|
+
}
|
|
12
|
+
return "false";
|
|
13
|
+
}
|
|
14
|
+
number() {
|
|
15
|
+
if (this.value) {
|
|
16
|
+
return 1;
|
|
17
|
+
}
|
|
18
|
+
return 0;
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=boolean.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"boolean.js","sourceRoot":"","sources":["../../src/data/boolean.ts"],"names":[],"mappings":"AAAA,OAAO,EAA0B,IAAI,EAAC,MAAM,kBAAkB,CAAC;AAE/D,MAAM,OAAO,WAAW;IACtB,YAA4B,KAAc;QAAd,UAAK,GAAL,KAAK,CAAS;QAE1B,SAAI,GAAG,IAAI,CAAC,OAAO,CAAC;QAE7B,cAAS,GAAG,IAAI,CAAC;IAJqB,CAAC;IAM9C,YAAY;QACV,IAAI,IAAI,CAAC,KAAK,EAAE;YACd,OAAO,MAAM,CAAC;SACf;QAED,OAAO,OAAO,CAAC;IACjB,CAAC;IAED,MAAM;QACJ,IAAI,IAAI,CAAC,KAAK,EAAE;YACd,OAAO,CAAC,CAAC;SACV;QAED,OAAO,CAAC,CAAC;IACX,CAAC;CACF"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { ExpressionData, ExpressionDataInterface, Kind, Pair } from "./expressiondata";
|
|
2
|
+
export declare class Dictionary implements ExpressionDataInterface {
|
|
3
|
+
private keys;
|
|
4
|
+
private v;
|
|
5
|
+
private indexMap;
|
|
6
|
+
constructor(...pairs: Pair[]);
|
|
7
|
+
readonly kind = Kind.Dictionary;
|
|
8
|
+
primitive: boolean;
|
|
9
|
+
coerceString(): string;
|
|
10
|
+
number(): number;
|
|
11
|
+
add(key: string, value: ExpressionData): void;
|
|
12
|
+
get(key: string): ExpressionData | undefined;
|
|
13
|
+
values(): ExpressionData[];
|
|
14
|
+
pairs(): Pair[];
|
|
15
|
+
}
|
|
16
|
+
export declare function isDictionary(x: ExpressionData): x is Dictionary;
|
|
17
|
+
//# sourceMappingURL=dictionary.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dictionary.d.ts","sourceRoot":"","sources":["../../src/data/dictionary.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,cAAc,EAAE,uBAAuB,EAAE,IAAI,EAAW,IAAI,EAAC,MAAM,kBAAkB,CAAC;AAE9F,qBAAa,UAAW,YAAW,uBAAuB;IACxD,OAAO,CAAC,IAAI,CAAgB;IAC5B,OAAO,CAAC,CAAC,CAAwB;IACjC,OAAO,CAAC,QAAQ,CAA+B;gBAEnC,GAAG,KAAK,EAAE,IAAI,EAAE;IAM5B,SAAgB,IAAI,mBAAmB;IAEhC,SAAS,UAAS;IAEzB,YAAY,IAAI,MAAM;IAItB,MAAM,IAAI,MAAM;IAIhB,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,cAAc;IAUtC,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,cAAc,GAAG,SAAS;IAS5C,MAAM,IAAI,cAAc,EAAE;IAI1B,KAAK,IAAI,IAAI,EAAE;CAShB;AAED,wBAAgB,YAAY,CAAC,CAAC,EAAE,cAAc,GAAG,CAAC,IAAI,UAAU,CAE/D"}
|