@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
|
@@ -0,0 +1,191 @@
|
|
|
1
|
+
import { Star } from "./ast";
|
|
2
|
+
import * as data from "./data";
|
|
3
|
+
import { FilteredArray } from "./filtered_array";
|
|
4
|
+
import { wellKnownFunctions } from "./funcs";
|
|
5
|
+
import { idxHelper } from "./idxHelper";
|
|
6
|
+
import { TokenType } from "./lexer";
|
|
7
|
+
import { equals, falsy, greaterThan, lessThan, truthy } from "./result";
|
|
8
|
+
export class Evaluator {
|
|
9
|
+
/**
|
|
10
|
+
* Creates a new evaluator
|
|
11
|
+
* @param n Parsed expression to evaluate
|
|
12
|
+
* @param context Context data to use
|
|
13
|
+
* @param functions Optional map of function implementations. If given, these will be preferred over the built-in functions.
|
|
14
|
+
*/
|
|
15
|
+
constructor(n, context, functions) {
|
|
16
|
+
this.n = n;
|
|
17
|
+
this.context = context;
|
|
18
|
+
this.functions = functions;
|
|
19
|
+
}
|
|
20
|
+
evaluate() {
|
|
21
|
+
return this.eval(this.n);
|
|
22
|
+
}
|
|
23
|
+
eval(n) {
|
|
24
|
+
return n.accept(this);
|
|
25
|
+
}
|
|
26
|
+
visitLiteral(literal) {
|
|
27
|
+
return literal.literal;
|
|
28
|
+
}
|
|
29
|
+
visitUnary(unary) {
|
|
30
|
+
const r = this.eval(unary.expr);
|
|
31
|
+
if (unary.operator.type === TokenType.BANG) {
|
|
32
|
+
return new data.BooleanData(falsy(r));
|
|
33
|
+
}
|
|
34
|
+
throw new Error(`unknown unary operator: ${unary.operator.lexeme}`);
|
|
35
|
+
}
|
|
36
|
+
visitBinary(binary) {
|
|
37
|
+
const left = this.eval(binary.left);
|
|
38
|
+
const right = this.eval(binary.right);
|
|
39
|
+
switch (binary.operator.type) {
|
|
40
|
+
case TokenType.EQUAL_EQUAL:
|
|
41
|
+
return new data.BooleanData(equals(left, right));
|
|
42
|
+
case TokenType.BANG_EQUAL:
|
|
43
|
+
return new data.BooleanData(!equals(left, right));
|
|
44
|
+
case TokenType.GREATER:
|
|
45
|
+
return new data.BooleanData(greaterThan(left, right));
|
|
46
|
+
case TokenType.GREATER_EQUAL:
|
|
47
|
+
return new data.BooleanData(equals(left, right) || greaterThan(left, right));
|
|
48
|
+
case TokenType.LESS:
|
|
49
|
+
return new data.BooleanData(lessThan(left, right));
|
|
50
|
+
case TokenType.LESS_EQUAL:
|
|
51
|
+
return new data.BooleanData(equals(left, right) || lessThan(left, right));
|
|
52
|
+
}
|
|
53
|
+
throw new Error(`unknown binary operator: ${binary.operator.lexeme}`);
|
|
54
|
+
}
|
|
55
|
+
visitLogical(logical) {
|
|
56
|
+
let result;
|
|
57
|
+
for (const arg of logical.args) {
|
|
58
|
+
result = this.eval(arg);
|
|
59
|
+
// Break?
|
|
60
|
+
if ((logical.operator.type === TokenType.AND && falsy(result)) ||
|
|
61
|
+
(logical.operator.type === TokenType.OR && truthy(result))) {
|
|
62
|
+
break;
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
// result is always assigned before we return here
|
|
66
|
+
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
|
|
67
|
+
return result;
|
|
68
|
+
}
|
|
69
|
+
visitGrouping(grouping) {
|
|
70
|
+
return this.eval(grouping.group);
|
|
71
|
+
}
|
|
72
|
+
visitContextAccess(contextAccess) {
|
|
73
|
+
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
|
|
74
|
+
const r = this.context.get(contextAccess.name.lexeme);
|
|
75
|
+
return r;
|
|
76
|
+
}
|
|
77
|
+
visitIndexAccess(ia) {
|
|
78
|
+
let idx;
|
|
79
|
+
if (ia.index instanceof Star) {
|
|
80
|
+
idx = new idxHelper(true, undefined);
|
|
81
|
+
}
|
|
82
|
+
else {
|
|
83
|
+
let idxResult;
|
|
84
|
+
try {
|
|
85
|
+
idxResult = this.eval(ia.index);
|
|
86
|
+
}
|
|
87
|
+
catch (e) {
|
|
88
|
+
throw new Error(`could not evaluate index for index access: ${e.message}`, { cause: e });
|
|
89
|
+
}
|
|
90
|
+
idx = new idxHelper(false, idxResult);
|
|
91
|
+
}
|
|
92
|
+
const objResult = this.eval(ia.expr);
|
|
93
|
+
let result;
|
|
94
|
+
switch (objResult.kind) {
|
|
95
|
+
case data.Kind.Array: {
|
|
96
|
+
const tobjResult = objResult;
|
|
97
|
+
if (tobjResult instanceof FilteredArray) {
|
|
98
|
+
result = filteredArrayAccess(tobjResult, idx);
|
|
99
|
+
}
|
|
100
|
+
else {
|
|
101
|
+
result = arrayAccess(tobjResult, idx);
|
|
102
|
+
}
|
|
103
|
+
break;
|
|
104
|
+
}
|
|
105
|
+
case data.Kind.Dictionary: {
|
|
106
|
+
const tobjResult = objResult;
|
|
107
|
+
result = objectAccess(tobjResult, idx);
|
|
108
|
+
break;
|
|
109
|
+
}
|
|
110
|
+
default:
|
|
111
|
+
if (idx.star) {
|
|
112
|
+
result = new FilteredArray();
|
|
113
|
+
}
|
|
114
|
+
else {
|
|
115
|
+
result = new data.Null();
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
return result;
|
|
119
|
+
}
|
|
120
|
+
visitFunctionCall(functionCall) {
|
|
121
|
+
// Evaluate arguments
|
|
122
|
+
const args = functionCall.args.map(arg => this.eval(arg));
|
|
123
|
+
// Get function definitions
|
|
124
|
+
const functionName = functionCall.functionName.lexeme.toLowerCase();
|
|
125
|
+
const f = this.functions?.get(functionName) || wellKnownFunctions[functionName];
|
|
126
|
+
return f.call(...args);
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
function filteredArrayAccess(fa, idx) {
|
|
130
|
+
const result = new FilteredArray();
|
|
131
|
+
for (const item of fa.values()) {
|
|
132
|
+
// Check the type of the nested item
|
|
133
|
+
switch (item.kind) {
|
|
134
|
+
case data.Kind.Dictionary: {
|
|
135
|
+
const ti = item;
|
|
136
|
+
if (idx.star) {
|
|
137
|
+
for (const v of ti.values()) {
|
|
138
|
+
result.add(v);
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
else if (idx.str !== undefined) {
|
|
142
|
+
const v = ti.get(idx.str);
|
|
143
|
+
if (v !== undefined) {
|
|
144
|
+
result.add(v);
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
break;
|
|
148
|
+
}
|
|
149
|
+
case data.Kind.Array: {
|
|
150
|
+
const ti = item;
|
|
151
|
+
if (idx.star) {
|
|
152
|
+
for (const v of ti.values()) {
|
|
153
|
+
result.add(v);
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
else if (idx.int !== undefined && idx.int < ti.values().length) {
|
|
157
|
+
result.add(ti.get(idx.int));
|
|
158
|
+
}
|
|
159
|
+
break;
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
return result;
|
|
164
|
+
}
|
|
165
|
+
function arrayAccess(a, idx) {
|
|
166
|
+
if (idx.star) {
|
|
167
|
+
const fa = new FilteredArray();
|
|
168
|
+
for (const item of a.values()) {
|
|
169
|
+
fa.add(item);
|
|
170
|
+
}
|
|
171
|
+
return fa;
|
|
172
|
+
}
|
|
173
|
+
if (idx.int !== undefined && idx.int < a.values().length) {
|
|
174
|
+
return a.get(idx.int);
|
|
175
|
+
}
|
|
176
|
+
return new data.Null();
|
|
177
|
+
}
|
|
178
|
+
function objectAccess(obj, idx) {
|
|
179
|
+
if (idx.star) {
|
|
180
|
+
const fa = new FilteredArray(...obj.values());
|
|
181
|
+
return fa;
|
|
182
|
+
}
|
|
183
|
+
if (idx.str !== undefined) {
|
|
184
|
+
const r = obj.get(idx.str);
|
|
185
|
+
if (r !== undefined) {
|
|
186
|
+
return r;
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
return new data.Null();
|
|
190
|
+
}
|
|
191
|
+
//# sourceMappingURL=evaluator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"evaluator.js","sourceRoot":"","sources":["../src/evaluator.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"filtered_array.d.ts","sourceRoot":"","sources":["../src/filtered_array.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,IAAI,MAAM,QAAQ,CAAC;AAE/B,qBAAa,aAAc,SAAQ,IAAI,CAAC,KAAK;CAAG"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"filtered_array.js","sourceRoot":"","sources":["../src/filtered_array.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,IAAI,MAAM,QAAQ,CAAC;AAE/B,MAAM,OAAO,aAAc,SAAQ,IAAI,CAAC,KAAK;CAAG"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"contains.d.ts","sourceRoot":"","sources":["../../src/funcs/contains.ts"],"names":[],"mappings":"AAEA,OAAO,EAAC,kBAAkB,EAAC,MAAM,QAAQ,CAAC;AAE1C,eAAO,MAAM,QAAQ,EAAE,kBA+BtB,CAAC"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { BooleanData, Kind } from "../data";
|
|
2
|
+
import { equals } from "../result";
|
|
3
|
+
export const contains = {
|
|
4
|
+
name: "contains",
|
|
5
|
+
description: "`contains( search, item )`\n\nReturns `true` if `search` contains `item`. If `search` is an array, this function returns `true` if the `item` is an element in the array. If `search` is a string, this function returns `true` if the `item` is a substring of `search`. This function is not case sensitive. Casts values to a string.",
|
|
6
|
+
minArgs: 2,
|
|
7
|
+
maxArgs: 2,
|
|
8
|
+
call: (...args) => {
|
|
9
|
+
const left = args[0];
|
|
10
|
+
const right = args[1];
|
|
11
|
+
if (left.primitive) {
|
|
12
|
+
const ls = left.coerceString();
|
|
13
|
+
if (right.primitive) {
|
|
14
|
+
const rs = right.coerceString();
|
|
15
|
+
return new BooleanData(ls.toLowerCase().includes(rs.toLowerCase()));
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
else if (left.kind === Kind.Array) {
|
|
19
|
+
const la = left;
|
|
20
|
+
if (la.values().length === 0) {
|
|
21
|
+
return new BooleanData(false);
|
|
22
|
+
}
|
|
23
|
+
for (const v of la.values()) {
|
|
24
|
+
if (equals(right, v)) {
|
|
25
|
+
return new BooleanData(true);
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
return new BooleanData(false);
|
|
30
|
+
}
|
|
31
|
+
};
|
|
32
|
+
//# sourceMappingURL=contains.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"contains.js","sourceRoot":"","sources":["../../src/funcs/contains.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,WAAW,EAAkB,IAAI,EAAC,MAAM,SAAS,CAAC;AAC1D,OAAO,EAAC,MAAM,EAAC,MAAM,WAAW,CAAC;AAGjC,MAAM,CAAC,MAAM,QAAQ,GAAuB;IAC1C,IAAI,EAAE,UAAU;IAChB,WAAW,EACT,0UAA0U;IAC5U,OAAO,EAAE,CAAC;IACV,OAAO,EAAE,CAAC;IACV,IAAI,EAAE,CAAC,GAAG,IAAsB,EAAkB,EAAE;QAClD,MAAM,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;QACrB,MAAM,KAAK,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;QAEtB,IAAI,IAAI,CAAC,SAAS,EAAE;YAClB,MAAM,EAAE,GAAG,IAAI,CAAC,YAAY,EAAE,CAAC;YAC/B,IAAI,KAAK,CAAC,SAAS,EAAE;gBACnB,MAAM,EAAE,GAAG,KAAK,CAAC,YAAY,EAAE,CAAC;gBAChC,OAAO,IAAI,WAAW,CAAC,EAAE,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC;aACrE;SACF;aAAM,IAAI,IAAI,CAAC,IAAI,KAAK,IAAI,CAAC,KAAK,EAAE;YACnC,MAAM,EAAE,GAAG,IAAI,CAAC;YAChB,IAAI,EAAE,CAAC,MAAM,EAAE,CAAC,MAAM,KAAK,CAAC,EAAE;gBAC5B,OAAO,IAAI,WAAW,CAAC,KAAK,CAAC,CAAC;aAC/B;YAED,KAAK,MAAM,CAAC,IAAI,EAAE,CAAC,MAAM,EAAE,EAAE;gBAC3B,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,EAAE;oBACpB,OAAO,IAAI,WAAW,CAAC,IAAI,CAAC,CAAC;iBAC9B;aACF;SACF;QAED,OAAO,IAAI,WAAW,CAAC,KAAK,CAAC,CAAC;IAChC,CAAC;CACF,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"endswith.d.ts","sourceRoot":"","sources":["../../src/funcs/endswith.ts"],"names":[],"mappings":"AAEA,OAAO,EAAC,kBAAkB,EAAC,MAAM,QAAQ,CAAC;AAE1C,eAAO,MAAM,QAAQ,EAAE,kBAsBtB,CAAC"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { BooleanData } from "../data";
|
|
2
|
+
import { toUpperSpecial } from "../result";
|
|
3
|
+
export const endswith = {
|
|
4
|
+
name: "endsWith",
|
|
5
|
+
description: "`endsWith( searchString, searchValue )`\n\nReturns `true` if `searchString` ends with `searchValue`. This function is not case sensitive. Casts values to a string.",
|
|
6
|
+
minArgs: 2,
|
|
7
|
+
maxArgs: 2,
|
|
8
|
+
call: (...args) => {
|
|
9
|
+
const left = args[0];
|
|
10
|
+
if (!left.primitive) {
|
|
11
|
+
return new BooleanData(false);
|
|
12
|
+
}
|
|
13
|
+
const right = args[1];
|
|
14
|
+
if (!right.primitive) {
|
|
15
|
+
return new BooleanData(false);
|
|
16
|
+
}
|
|
17
|
+
const ls = toUpperSpecial(left.coerceString());
|
|
18
|
+
const rs = toUpperSpecial(right.coerceString());
|
|
19
|
+
return new BooleanData(ls.endsWith(rs));
|
|
20
|
+
}
|
|
21
|
+
};
|
|
22
|
+
//# sourceMappingURL=endswith.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"endswith.js","sourceRoot":"","sources":["../../src/funcs/endswith.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,WAAW,EAAiB,MAAM,SAAS,CAAC;AACpD,OAAO,EAAC,cAAc,EAAC,MAAM,WAAW,CAAC;AAGzC,MAAM,CAAC,MAAM,QAAQ,GAAuB;IAC1C,IAAI,EAAE,UAAU;IAChB,WAAW,EACT,qKAAqK;IACvK,OAAO,EAAE,CAAC;IACV,OAAO,EAAE,CAAC;IACV,IAAI,EAAE,CAAC,GAAG,IAAsB,EAAkB,EAAE;QAClD,MAAM,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;QACrB,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE;YACnB,OAAO,IAAI,WAAW,CAAC,KAAK,CAAC,CAAC;SAC/B;QAED,MAAM,KAAK,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;QACtB,IAAI,CAAC,KAAK,CAAC,SAAS,EAAE;YACpB,OAAO,IAAI,WAAW,CAAC,KAAK,CAAC,CAAC;SAC/B;QAED,MAAM,EAAE,GAAG,cAAc,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC,CAAC;QAC/C,MAAM,EAAE,GAAG,cAAc,CAAC,KAAK,CAAC,YAAY,EAAE,CAAC,CAAC;QAEhD,OAAO,IAAI,WAAW,CAAC,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC;IAC1C,CAAC;CACF,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"format.d.ts","sourceRoot":"","sources":["../../src/funcs/format.ts"],"names":[],"mappings":"AACA,OAAO,EAAC,kBAAkB,EAAC,MAAM,QAAQ,CAAC;AAE1C,eAAO,MAAM,MAAM,EAAE,kBAmEpB,CAAC"}
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
import { StringData } from "../data";
|
|
2
|
+
export const format = {
|
|
3
|
+
name: "format",
|
|
4
|
+
description: "`format( string, replaceValue0, replaceValue1, ..., replaceValueN)`\n\nReplaces values in the `string`, with the variable `replaceValueN`. Variables in the `string` are specified using the `{N}` syntax, where `N` is an integer. You must specify at least one `replaceValue` and `string`. There is no maximum for the number of variables (`replaceValueN`) you can use. Escape curly braces using double braces.",
|
|
5
|
+
minArgs: 1,
|
|
6
|
+
maxArgs: 255 /*MAX_ARGUMENTS*/,
|
|
7
|
+
call: (...args) => {
|
|
8
|
+
const fs = args[0].coerceString();
|
|
9
|
+
const result = [];
|
|
10
|
+
let index = 0;
|
|
11
|
+
while (index < fs.length) {
|
|
12
|
+
const lbrace = fs.indexOf("{", index);
|
|
13
|
+
const rbrace = fs.indexOf("}", index);
|
|
14
|
+
// Left brace
|
|
15
|
+
if (lbrace >= 0 && (rbrace < 0 || rbrace > lbrace)) {
|
|
16
|
+
// Escaped left brace
|
|
17
|
+
if (safeCharAt(fs, lbrace + 1) === "{") {
|
|
18
|
+
result.push(fs.substr(index, lbrace - index + 1));
|
|
19
|
+
index = lbrace + 2;
|
|
20
|
+
continue;
|
|
21
|
+
}
|
|
22
|
+
// Left brace, number, optional format specifiers, right brace
|
|
23
|
+
if (rbrace > lbrace + 1) {
|
|
24
|
+
const argIndex = readArgIndex(fs, lbrace + 1);
|
|
25
|
+
if (argIndex.success) {
|
|
26
|
+
// Check parameter count
|
|
27
|
+
if (1 + argIndex.result > args.length - 1) {
|
|
28
|
+
throw new Error(`The following format string references more arguments than were supplied: ${fs}`);
|
|
29
|
+
}
|
|
30
|
+
// Append the portion before the left brace
|
|
31
|
+
if (lbrace > index) {
|
|
32
|
+
result.push(fs.substr(index, lbrace - index));
|
|
33
|
+
}
|
|
34
|
+
// Append the arg
|
|
35
|
+
result.push(`${args[1 + argIndex.result].coerceString()}`);
|
|
36
|
+
index = rbrace + 1;
|
|
37
|
+
continue;
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
throw new Error(`The following format string is invalid: ${fs}`);
|
|
41
|
+
}
|
|
42
|
+
// Right brace
|
|
43
|
+
else if (rbrace >= 0) {
|
|
44
|
+
// Escaped right brace
|
|
45
|
+
if (safeCharAt(fs, rbrace + 1) === "}") {
|
|
46
|
+
result.push(fs.substr(index, rbrace - index + 1));
|
|
47
|
+
index = rbrace + 2;
|
|
48
|
+
}
|
|
49
|
+
else {
|
|
50
|
+
throw new Error(`The following format string is invalid: ${fs}`);
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
// Last segment
|
|
54
|
+
else {
|
|
55
|
+
result.push(fs.substr(index));
|
|
56
|
+
break;
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
return new StringData(result.join(""));
|
|
60
|
+
}
|
|
61
|
+
};
|
|
62
|
+
function safeCharAt(string, index) {
|
|
63
|
+
if (string.length > index) {
|
|
64
|
+
return string[index];
|
|
65
|
+
}
|
|
66
|
+
return "\0";
|
|
67
|
+
}
|
|
68
|
+
function readArgIndex(string, startIndex) {
|
|
69
|
+
// Count the number of digits
|
|
70
|
+
let length = 0;
|
|
71
|
+
for (;;) {
|
|
72
|
+
const nextChar = safeCharAt(string, startIndex + length);
|
|
73
|
+
if (nextChar >= "0" && nextChar <= "9") {
|
|
74
|
+
length++;
|
|
75
|
+
}
|
|
76
|
+
else {
|
|
77
|
+
break;
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
// Validate at least one digit
|
|
81
|
+
if (length < 1) {
|
|
82
|
+
return {
|
|
83
|
+
success: false
|
|
84
|
+
};
|
|
85
|
+
}
|
|
86
|
+
// Parse the number
|
|
87
|
+
const endIndex = startIndex + length - 1;
|
|
88
|
+
const result = parseInt(string.substr(startIndex, length));
|
|
89
|
+
return {
|
|
90
|
+
success: !isNaN(result),
|
|
91
|
+
result: result,
|
|
92
|
+
endIndex: endIndex
|
|
93
|
+
};
|
|
94
|
+
}
|
|
95
|
+
//# sourceMappingURL=format.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"format.js","sourceRoot":"","sources":["../../src/funcs/format.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fromjson.d.ts","sourceRoot":"","sources":["../../src/funcs/fromjson.ts"],"names":[],"mappings":"AAGA,OAAO,EAAC,kBAAkB,EAAC,MAAM,QAAQ,CAAC;AAE1C,eAAO,MAAM,QAAQ,EAAE,kBAoBtB,CAAC"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { reviver } from "../data/reviver";
|
|
2
|
+
import { ExpressionEvaluationError } from "../errors";
|
|
3
|
+
export const fromjson = {
|
|
4
|
+
name: "fromJson",
|
|
5
|
+
description: "`fromJSON(value)`\n\nReturns a JSON object or JSON data type for `value`. You can use this function to provide a JSON object as an evaluated expression or to convert environment variables from a string.",
|
|
6
|
+
minArgs: 1,
|
|
7
|
+
maxArgs: 1,
|
|
8
|
+
call: (...args) => {
|
|
9
|
+
const input = args[0];
|
|
10
|
+
const is = input.coerceString();
|
|
11
|
+
if (is.trim() === "") {
|
|
12
|
+
throw new Error("empty input");
|
|
13
|
+
}
|
|
14
|
+
try {
|
|
15
|
+
return JSON.parse(is, reviver);
|
|
16
|
+
}
|
|
17
|
+
catch (e) {
|
|
18
|
+
throw new ExpressionEvaluationError("Error parsing JSON when evaluating fromJson", { cause: e });
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
};
|
|
22
|
+
//# sourceMappingURL=fromjson.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fromjson.js","sourceRoot":"","sources":["../../src/funcs/fromjson.ts"],"names":[],"mappings":"AACA,OAAO,EAAC,OAAO,EAAC,MAAM,iBAAiB,CAAC;AACxC,OAAO,EAAC,yBAAyB,EAAC,MAAM,WAAW,CAAC;AAGpD,MAAM,CAAC,MAAM,QAAQ,GAAuB;IAC1C,IAAI,EAAE,UAAU;IAChB,WAAW,EACT,4MAA4M;IAC9M,OAAO,EAAE,CAAC;IACV,OAAO,EAAE,CAAC;IACV,IAAI,EAAE,CAAC,GAAG,IAAsB,EAAkB,EAAE;QAClD,MAAM,KAAK,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;QACtB,MAAM,EAAE,GAAG,KAAK,CAAC,YAAY,EAAE,CAAC;QAEhC,IAAI,EAAE,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE;YACpB,MAAM,IAAI,KAAK,CAAC,aAAa,CAAC,CAAC;SAChC;QAED,IAAI;YACF,OAAO,IAAI,CAAC,KAAK,CAAC,EAAE,EAAE,OAAO,CAAmB,CAAC;SAClD;QAAC,OAAO,CAAC,EAAE;YACV,MAAM,IAAI,yBAAyB,CAAC,6CAA6C,EAAE,EAAC,KAAK,EAAE,CAAC,EAAC,CAAC,CAAC;SAChG;IACH,CAAC;CACF,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { ExpressionData } from "../data";
|
|
2
|
+
export interface FunctionInfo {
|
|
3
|
+
name: string;
|
|
4
|
+
description?: string;
|
|
5
|
+
minArgs: number;
|
|
6
|
+
maxArgs: number;
|
|
7
|
+
}
|
|
8
|
+
export interface FunctionDefinition extends FunctionInfo {
|
|
9
|
+
call: (...args: ExpressionData[]) => ExpressionData;
|
|
10
|
+
}
|
|
11
|
+
//# sourceMappingURL=info.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"info.d.ts","sourceRoot":"","sources":["../../src/funcs/info.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,cAAc,EAAC,MAAM,SAAS,CAAC;AAEvC,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IAEb,WAAW,CAAC,EAAE,MAAM,CAAC;IAErB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,kBAAmB,SAAQ,YAAY;IACtD,IAAI,EAAE,CAAC,GAAG,IAAI,EAAE,cAAc,EAAE,KAAK,cAAc,CAAC;CACrD"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"info.js","sourceRoot":"","sources":["../../src/funcs/info.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"join.d.ts","sourceRoot":"","sources":["../../src/funcs/join.ts"],"names":[],"mappings":"AACA,OAAO,EAAC,kBAAkB,EAAC,MAAM,QAAQ,CAAC;AAE1C,eAAO,MAAM,IAAI,EAAE,kBA+BlB,CAAC"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { Kind, StringData } from "../data";
|
|
2
|
+
export const join = {
|
|
3
|
+
name: "join",
|
|
4
|
+
description: "`join( array, optionalSeparator )`\n\nThe value for `array` can be an array or a string. All values in `array` are concatenated into a string. If you provide `optionalSeparator`, it is inserted between the concatenated values. Otherwise, the default separator `,` is used. Casts values to a string.",
|
|
5
|
+
minArgs: 1,
|
|
6
|
+
maxArgs: 2,
|
|
7
|
+
call: (...args) => {
|
|
8
|
+
// Primitive
|
|
9
|
+
if (args[0].primitive) {
|
|
10
|
+
return new StringData(args[0].coerceString());
|
|
11
|
+
}
|
|
12
|
+
// Array
|
|
13
|
+
if (args[0].kind === Kind.Array) {
|
|
14
|
+
// Separator
|
|
15
|
+
let separator = ",";
|
|
16
|
+
if (args.length > 1 && args[1].primitive) {
|
|
17
|
+
separator = args[1].coerceString();
|
|
18
|
+
}
|
|
19
|
+
// Convert items to strings
|
|
20
|
+
return new StringData(args[0]
|
|
21
|
+
.values()
|
|
22
|
+
.map(item => item.coerceString())
|
|
23
|
+
.join(separator));
|
|
24
|
+
}
|
|
25
|
+
return new StringData("");
|
|
26
|
+
}
|
|
27
|
+
};
|
|
28
|
+
//# sourceMappingURL=join.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"join.js","sourceRoot":"","sources":["../../src/funcs/join.ts"],"names":[],"mappings":"AAAA,OAAO,EAAiB,IAAI,EAAE,UAAU,EAAC,MAAM,SAAS,CAAC;AAGzD,MAAM,CAAC,MAAM,IAAI,GAAuB;IACtC,IAAI,EAAE,MAAM;IACZ,WAAW,EACT,4SAA4S;IAC9S,OAAO,EAAE,CAAC;IACV,OAAO,EAAE,CAAC;IACV,IAAI,EAAE,CAAC,GAAG,IAAsB,EAAkB,EAAE;QAClD,YAAY;QACZ,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,EAAE;YACrB,OAAO,IAAI,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,YAAY,EAAE,CAAC,CAAC;SAC/C;QAED,QAAQ;QACR,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,KAAK,EAAE;YAC/B,YAAY;YACZ,IAAI,SAAS,GAAG,GAAG,CAAC;YACpB,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,EAAE;gBACxC,SAAS,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,YAAY,EAAE,CAAC;aACpC;YAED,2BAA2B;YAC3B,OAAO,IAAI,UAAU,CACnB,IAAI,CAAC,CAAC,CAAC;iBACJ,MAAM,EAAE;iBACR,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC;iBAChC,IAAI,CAAC,SAAS,CAAC,CACnB,CAAC;SACH;QAED,OAAO,IAAI,UAAU,CAAC,EAAE,CAAC,CAAC;IAC5B,CAAC;CACF,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"startswith.d.ts","sourceRoot":"","sources":["../../src/funcs/startswith.ts"],"names":[],"mappings":"AAEA,OAAO,EAAC,kBAAkB,EAAC,MAAM,QAAQ,CAAC;AAE1C,eAAO,MAAM,UAAU,EAAE,kBAsBxB,CAAC"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { BooleanData } from "../data";
|
|
2
|
+
import { toUpperSpecial } from "../result";
|
|
3
|
+
export const startswith = {
|
|
4
|
+
name: "startsWith",
|
|
5
|
+
description: "`startsWith( searchString, searchValue )`\n\nReturns `true` when `searchString` starts with `searchValue`. This function is not case sensitive. Casts values to a string.",
|
|
6
|
+
minArgs: 2,
|
|
7
|
+
maxArgs: 2,
|
|
8
|
+
call: (...args) => {
|
|
9
|
+
const left = args[0];
|
|
10
|
+
if (!left.primitive) {
|
|
11
|
+
return new BooleanData(false);
|
|
12
|
+
}
|
|
13
|
+
const right = args[1];
|
|
14
|
+
if (!right.primitive) {
|
|
15
|
+
return new BooleanData(false);
|
|
16
|
+
}
|
|
17
|
+
const ls = toUpperSpecial(left.coerceString());
|
|
18
|
+
const rs = toUpperSpecial(right.coerceString());
|
|
19
|
+
return new BooleanData(ls.startsWith(rs));
|
|
20
|
+
}
|
|
21
|
+
};
|
|
22
|
+
//# sourceMappingURL=startswith.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"startswith.js","sourceRoot":"","sources":["../../src/funcs/startswith.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,WAAW,EAAiB,MAAM,SAAS,CAAC;AACpD,OAAO,EAAC,cAAc,EAAC,MAAM,WAAW,CAAC;AAGzC,MAAM,CAAC,MAAM,UAAU,GAAuB;IAC5C,IAAI,EAAE,YAAY;IAClB,WAAW,EACT,2KAA2K;IAC7K,OAAO,EAAE,CAAC;IACV,OAAO,EAAE,CAAC;IACV,IAAI,EAAE,CAAC,GAAG,IAAsB,EAAkB,EAAE;QAClD,MAAM,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;QACrB,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE;YACnB,OAAO,IAAI,WAAW,CAAC,KAAK,CAAC,CAAC;SAC/B;QAED,MAAM,KAAK,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;QACtB,IAAI,CAAC,KAAK,CAAC,SAAS,EAAE;YACpB,OAAO,IAAI,WAAW,CAAC,KAAK,CAAC,CAAC;SAC/B;QAED,MAAM,EAAE,GAAG,cAAc,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC,CAAC;QAC/C,MAAM,EAAE,GAAG,cAAc,CAAC,KAAK,CAAC,YAAY,EAAE,CAAC,CAAC;QAEhD,OAAO,IAAI,WAAW,CAAC,EAAE,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC,CAAC;IAC5C,CAAC;CACF,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tojson.d.ts","sourceRoot":"","sources":["../../src/funcs/tojson.ts"],"names":[],"mappings":"AAEA,OAAO,EAAC,kBAAkB,EAAC,MAAM,QAAQ,CAAC;AAE1C,eAAO,MAAM,MAAM,EAAE,kBASpB,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { StringData } from "../data";
|
|
2
|
+
import { replacer } from "../data/replacer";
|
|
3
|
+
export const tojson = {
|
|
4
|
+
name: "toJson",
|
|
5
|
+
description: "`toJSON(value)`\n\nReturns a pretty-print JSON representation of `value`. You can use this function to debug the information provided in contexts.",
|
|
6
|
+
minArgs: 1,
|
|
7
|
+
maxArgs: 1,
|
|
8
|
+
call: (...args) => {
|
|
9
|
+
return new StringData(JSON.stringify(args[0], replacer, " "));
|
|
10
|
+
}
|
|
11
|
+
};
|
|
12
|
+
//# sourceMappingURL=tojson.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tojson.js","sourceRoot":"","sources":["../../src/funcs/tojson.ts"],"names":[],"mappings":"AAAA,OAAO,EAAiB,UAAU,EAAC,MAAM,SAAS,CAAC;AACnD,OAAO,EAAC,QAAQ,EAAC,MAAM,kBAAkB,CAAC;AAG1C,MAAM,CAAC,MAAM,MAAM,GAAuB;IACxC,IAAI,EAAE,QAAQ;IACd,WAAW,EACT,oJAAoJ;IACtJ,OAAO,EAAE,CAAC;IACV,OAAO,EAAE,CAAC;IACV,IAAI,EAAE,CAAC,GAAG,IAAsB,EAAkB,EAAE;QAClD,OAAO,IAAI,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,IAAI,CAAC,CAAC,CAAC;IACjE,CAAC;CACF,CAAC"}
|
package/dist/funcs.d.ts
ADDED
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { FunctionDefinition, FunctionInfo } from "./funcs/info";
|
|
2
|
+
import { Token } from "./lexer";
|
|
3
|
+
export type ParseContext = {
|
|
4
|
+
allowUnknownKeywords: boolean;
|
|
5
|
+
extensionContexts: Map<string, boolean>;
|
|
6
|
+
extensionFunctions: Map<string, FunctionInfo>;
|
|
7
|
+
};
|
|
8
|
+
export declare const wellKnownFunctions: {
|
|
9
|
+
[name: string]: FunctionDefinition;
|
|
10
|
+
};
|
|
11
|
+
export declare function validateFunction(context: ParseContext, identifier: Token, argCount: number): void;
|
|
12
|
+
//# sourceMappingURL=funcs.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"funcs.d.ts","sourceRoot":"","sources":["../src/funcs.ts"],"names":[],"mappings":"AAKA,OAAO,EAAC,kBAAkB,EAAE,YAAY,EAAC,MAAM,cAAc,CAAC;AAI9D,OAAO,EAAC,KAAK,EAAC,MAAM,SAAS,CAAC;AAE9B,MAAM,MAAM,YAAY,GAAG;IACzB,oBAAoB,EAAE,OAAO,CAAC;IAC9B,iBAAiB,EAAE,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACxC,kBAAkB,EAAE,GAAG,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;CAC/C,CAAC;AAEF,eAAO,MAAM,kBAAkB,EAAE;IAAC,CAAC,IAAI,EAAE,MAAM,GAAG,kBAAkB,CAAA;CAQnE,CAAC;AAKF,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,QAyB1F"}
|