react-native-divkit 0.1.0-alpha.1 → 0.1.0-alpha.2
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/README.md +135 -137
- package/dist/DivKit.d.ts.map +1 -1
- package/dist/DivKit.js +24 -7
- package/dist/DivKit.js.map +1 -1
- package/dist/actions/array.d.ts.map +1 -1
- package/dist/actions/array.js +1 -1
- package/dist/actions/array.js.map +1 -1
- package/dist/actions/copyToClipboard.d.ts.map +1 -1
- package/dist/actions/copyToClipboard.js +2 -1
- package/dist/actions/copyToClipboard.js.map +1 -1
- package/dist/actions/dict.d.ts.map +1 -1
- package/dist/actions/dict.js.map +1 -1
- package/dist/actions/updateStructure.d.ts.map +1 -1
- package/dist/actions/updateStructure.js.map +1 -1
- package/dist/components/container/DivContainer.d.ts.map +1 -1
- package/dist/components/container/DivContainer.js +3 -5
- package/dist/components/container/DivContainer.js.map +1 -1
- package/dist/components/image/DivImage.d.ts.map +1 -1
- package/dist/components/image/DivImage.js +1 -6
- package/dist/components/image/DivImage.js.map +1 -1
- package/dist/components/state/DivState.d.ts.map +1 -1
- package/dist/components/state/DivState.js +3 -5
- package/dist/components/state/DivState.js.map +1 -1
- package/dist/components/text/DivText.d.ts.map +1 -1
- package/dist/components/text/DivText.js +4 -4
- package/dist/components/text/DivText.js.map +1 -1
- package/dist/components/utilities/Outer.d.ts.map +1 -1
- package/dist/components/utilities/Outer.js +6 -5
- package/dist/components/utilities/Outer.js.map +1 -1
- package/dist/context/index.d.ts.map +1 -1
- package/dist/context/index.js.map +1 -1
- package/dist/expressions/eval.d.ts.map +1 -1
- package/dist/expressions/eval.js +19 -11
- package/dist/expressions/eval.js.map +1 -1
- package/dist/expressions/funcs/array.d.ts.map +1 -1
- package/dist/expressions/funcs/array.js +72 -168
- package/dist/expressions/funcs/array.js.map +1 -1
- package/dist/expressions/funcs/colors.d.ts.map +1 -1
- package/dist/expressions/funcs/colors.js.map +1 -1
- package/dist/expressions/funcs/customFuncs.d.ts.map +1 -1
- package/dist/expressions/funcs/customFuncs.js +6 -4
- package/dist/expressions/funcs/customFuncs.js.map +1 -1
- package/dist/expressions/funcs/datetime.d.ts.map +1 -1
- package/dist/expressions/funcs/datetime.js +1 -1
- package/dist/expressions/funcs/datetime.js.map +1 -1
- package/dist/expressions/funcs/dict.d.ts.map +1 -1
- package/dist/expressions/funcs/dict.js.map +1 -1
- package/dist/expressions/funcs/funcs.d.ts.map +1 -1
- package/dist/expressions/funcs/funcs.js +21 -13
- package/dist/expressions/funcs/funcs.js.map +1 -1
- package/dist/expressions/funcs/math.d.ts.map +1 -1
- package/dist/expressions/funcs/math.js +40 -20
- package/dist/expressions/funcs/math.js.map +1 -1
- package/dist/expressions/funcs/std.d.ts.map +1 -1
- package/dist/expressions/funcs/std.js +4 -4
- package/dist/expressions/funcs/std.js.map +1 -1
- package/dist/expressions/funcs/strings.d.ts.map +1 -1
- package/dist/expressions/funcs/strings.js +1 -2
- package/dist/expressions/funcs/strings.js.map +1 -1
- package/dist/expressions/funcs/trigonometry.js +2 -2
- package/dist/expressions/funcs/trigonometry.js.map +1 -1
- package/dist/expressions/json.d.ts +2 -2
- package/dist/expressions/json.d.ts.map +1 -1
- package/dist/expressions/json.js +6 -4
- package/dist/expressions/json.js.map +1 -1
- package/dist/expressions/utils.d.ts.map +1 -1
- package/dist/expressions/utils.js +9 -10
- package/dist/expressions/utils.js.map +1 -1
- package/dist/expressions/variable.d.ts.map +1 -1
- package/dist/expressions/variable.js +3 -7
- package/dist/expressions/variable.js.map +1 -1
- package/dist/expressions/walk.d.ts.map +1 -1
- package/dist/expressions/walk.js.map +1 -1
- package/dist/hooks/index.d.ts.map +1 -1
- package/dist/hooks/index.js.map +1 -1
- package/dist/hooks/useAction.d.ts.map +1 -1
- package/dist/hooks/useAction.js.map +1 -1
- package/dist/hooks/useDerivedFromVars.d.ts.map +1 -1
- package/dist/hooks/useDerivedFromVars.js.map +1 -1
- package/dist/hooks/useVariable.d.ts.map +1 -1
- package/dist/hooks/useVariable.js +4 -4
- package/dist/hooks/useVariable.js.map +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js.map +1 -1
- package/dist/stores/createObservable.d.ts.map +1 -1
- package/dist/stores/createObservable.js.map +1 -1
- package/dist/utils/applyTemplate.d.ts +2 -2
- package/dist/utils/applyTemplate.d.ts.map +1 -1
- package/dist/utils/applyTemplate.js +13 -13
- package/dist/utils/applyTemplate.js.map +1 -1
- package/dist/utils/correctColor.d.ts.map +1 -1
- package/dist/utils/correctColor.js +8 -6
- package/dist/utils/correctColor.js.map +1 -1
- package/dist/utils/formatDate.d.ts.map +1 -1
- package/dist/utils/formatDate.js +7 -10
- package/dist/utils/formatDate.js.map +1 -1
- package/dist/utils/wrapError.d.ts.map +1 -1
- package/dist/utils/wrapError.js.map +1 -1
- package/package.json +2 -2
- package/src/DivKit.tsx +258 -220
- package/src/actions/array.ts +91 -64
- package/src/actions/copyToClipboard.ts +28 -19
- package/src/actions/dict.ts +36 -26
- package/src/actions/updateStructure.ts +86 -61
- package/src/components/README.md +38 -18
- package/src/components/container/DivContainer.tsx +4 -14
- package/src/components/image/DivImage.tsx +1 -11
- package/src/components/state/DivState.tsx +3 -9
- package/src/components/text/DivText.tsx +8 -20
- package/src/components/utilities/Outer.tsx +9 -19
- package/src/components/utilities/README.md +33 -29
- package/src/context/index.ts +2 -11
- package/src/expressions/ast.d.ts +16 -9
- package/src/expressions/eval.ts +82 -37
- package/src/expressions/funcs/array.ts +129 -209
- package/src/expressions/funcs/colors.ts +1 -3
- package/src/expressions/funcs/customFuncs.ts +6 -4
- package/src/expressions/funcs/datetime.ts +10 -3
- package/src/expressions/funcs/dict.ts +16 -2
- package/src/expressions/funcs/funcs.ts +75 -89
- package/src/expressions/funcs/math.ts +103 -43
- package/src/expressions/funcs/std.ts +4 -7
- package/src/expressions/funcs/strings.ts +9 -25
- package/src/expressions/funcs/trigonometry.ts +2 -2
- package/src/expressions/json.ts +60 -53
- package/src/expressions/utils.ts +24 -22
- package/src/expressions/variable.ts +5 -21
- package/src/expressions/walk.ts +6 -3
- package/src/hooks/README.md +61 -53
- package/src/hooks/index.ts +3 -18
- package/src/hooks/useAction.ts +1 -3
- package/src/hooks/useDerivedFromVars.ts +3 -13
- package/src/hooks/useVariable.ts +7 -17
- package/src/index.ts +10 -48
- package/src/stores/createObservable.ts +35 -35
- package/src/types/alignment.d.ts +15 -6
- package/src/types/background.d.ts +6 -2
- package/src/types/base.d.ts +41 -9
- package/src/types/componentContext.d.ts +27 -22
- package/src/types/container.d.ts +1 -4
- package/src/types/text.d.ts +1 -1
- package/src/utils/applyTemplate.ts +103 -109
- package/src/utils/correctColor.ts +9 -8
- package/src/utils/formatDate.ts +175 -86
- package/src/utils/wrapError.ts +7 -4
package/src/expressions/eval.ts
CHANGED
|
@@ -2,17 +2,37 @@
|
|
|
2
2
|
/* eslint-disable no-else-return */
|
|
3
3
|
|
|
4
4
|
import type {
|
|
5
|
-
BinaryExpression,
|
|
6
|
-
|
|
5
|
+
BinaryExpression,
|
|
6
|
+
BooleanLiteral,
|
|
7
|
+
CallExpression,
|
|
8
|
+
CompareOperator,
|
|
9
|
+
ConditionalExpression,
|
|
10
|
+
EqualityOperator,
|
|
11
|
+
FactorOperator,
|
|
12
|
+
IntegerLiteral,
|
|
7
13
|
LogicalExpression,
|
|
8
14
|
MethodExpression,
|
|
9
|
-
Node,
|
|
15
|
+
Node,
|
|
16
|
+
NumberLiteral,
|
|
17
|
+
StringLiteral,
|
|
18
|
+
SumOperator,
|
|
10
19
|
TemplateLiteral,
|
|
11
20
|
TryExpression,
|
|
12
|
-
UnaryExpression,
|
|
21
|
+
UnaryExpression,
|
|
22
|
+
Variable
|
|
13
23
|
} from './ast';
|
|
14
24
|
import type { WrappedError } from '../utils/wrapError';
|
|
15
|
-
import {
|
|
25
|
+
import {
|
|
26
|
+
convertArgs,
|
|
27
|
+
findBestMatchedFunc,
|
|
28
|
+
type Func,
|
|
29
|
+
funcByArgs,
|
|
30
|
+
type FuncMatch,
|
|
31
|
+
type FuncMatchError,
|
|
32
|
+
funcs,
|
|
33
|
+
methodByArgs,
|
|
34
|
+
methods
|
|
35
|
+
} from './funcs/funcs';
|
|
16
36
|
import {
|
|
17
37
|
checkIntegerOverflow,
|
|
18
38
|
evalError,
|
|
@@ -34,9 +54,28 @@ import type { CustomFunctions } from './funcs/customFuncs';
|
|
|
34
54
|
|
|
35
55
|
export type VariablesMap = Map<string, VariableInstance>;
|
|
36
56
|
|
|
37
|
-
export type EvalTypes =
|
|
38
|
-
|
|
39
|
-
|
|
57
|
+
export type EvalTypes =
|
|
58
|
+
| 'string'
|
|
59
|
+
| 'number'
|
|
60
|
+
| 'integer'
|
|
61
|
+
| 'boolean'
|
|
62
|
+
| 'color'
|
|
63
|
+
| 'url'
|
|
64
|
+
| 'datetime'
|
|
65
|
+
| 'dict'
|
|
66
|
+
| 'array'
|
|
67
|
+
| 'function';
|
|
68
|
+
|
|
69
|
+
export type EvalTypesWithoutDatetime =
|
|
70
|
+
| 'string'
|
|
71
|
+
| 'number'
|
|
72
|
+
| 'integer'
|
|
73
|
+
| 'boolean'
|
|
74
|
+
| 'color'
|
|
75
|
+
| 'url'
|
|
76
|
+
| 'dict'
|
|
77
|
+
| 'array'
|
|
78
|
+
| 'function';
|
|
40
79
|
|
|
41
80
|
export interface EvalValueBase {
|
|
42
81
|
type: string;
|
|
@@ -93,8 +132,17 @@ export interface FuncValue extends EvalValueBase {
|
|
|
93
132
|
value: Func[];
|
|
94
133
|
}
|
|
95
134
|
|
|
96
|
-
export type EvalValue =
|
|
97
|
-
|
|
135
|
+
export type EvalValue =
|
|
136
|
+
| StringValue
|
|
137
|
+
| UrlValue
|
|
138
|
+
| ColorValue
|
|
139
|
+
| NumberValue
|
|
140
|
+
| IntegerValue
|
|
141
|
+
| BooleanValue
|
|
142
|
+
| DatetimeValue
|
|
143
|
+
| DictValue
|
|
144
|
+
| ArrayValue
|
|
145
|
+
| FuncValue;
|
|
98
146
|
|
|
99
147
|
export interface EvalError {
|
|
100
148
|
type: 'error';
|
|
@@ -281,8 +329,8 @@ function evalBinaryEquality<T extends EvalValue>(operator: EqualityOperator, lef
|
|
|
281
329
|
|
|
282
330
|
function evalBinaryCompare<T extends EvalValue>(operator: CompareOperator, left: T, right: T): EvalValue {
|
|
283
331
|
if (
|
|
284
|
-
left.type !== NUMBER && left.type !== INTEGER && left.type !== DATETIME ||
|
|
285
|
-
right.type !== NUMBER && right.type !== INTEGER && right.type !== DATETIME
|
|
332
|
+
(left.type !== NUMBER && left.type !== INTEGER && left.type !== DATETIME) ||
|
|
333
|
+
(right.type !== NUMBER && right.type !== INTEGER && right.type !== DATETIME)
|
|
286
334
|
) {
|
|
287
335
|
evalError(
|
|
288
336
|
`${valToPreview(left)} ${operator} ${valToPreview(right)}`,
|
|
@@ -331,9 +379,10 @@ function evalBinarySum<T extends EvalValue>(ctx: EvalContext, operator: SumOpera
|
|
|
331
379
|
};
|
|
332
380
|
}
|
|
333
381
|
|
|
334
|
-
let res: number | bigint =
|
|
335
|
-
|
|
336
|
-
|
|
382
|
+
let res: number | bigint =
|
|
383
|
+
operator === '+'
|
|
384
|
+
? (left.value as bigint) + (right.value as bigint)
|
|
385
|
+
: (left.value as bigint) - (right.value as bigint);
|
|
337
386
|
|
|
338
387
|
// integer
|
|
339
388
|
if (left.type === INTEGER) {
|
|
@@ -341,10 +390,7 @@ function evalBinarySum<T extends EvalValue>(ctx: EvalContext, operator: SumOpera
|
|
|
341
390
|
res = roundInteger(ctx, res);
|
|
342
391
|
checkIntegerOverflow(ctx, res);
|
|
343
392
|
} catch (err: any) {
|
|
344
|
-
evalError(
|
|
345
|
-
`${valToPreview(left)} ${operator} ${valToPreview(right)}`,
|
|
346
|
-
err.message
|
|
347
|
-
);
|
|
393
|
+
evalError(`${valToPreview(left)} ${operator} ${valToPreview(right)}`, err.message);
|
|
348
394
|
}
|
|
349
395
|
}
|
|
350
396
|
|
|
@@ -373,10 +419,7 @@ function evalBinaryFactor<T extends EvalValue>(
|
|
|
373
419
|
res = (left.value as bigint) * (right.value as bigint);
|
|
374
420
|
} else if (operator === '/' || operator === '%') {
|
|
375
421
|
if (Number(right.value) === 0) {
|
|
376
|
-
evalError(
|
|
377
|
-
`${valToPreview(left)} ${operator} ${valToPreview(right)}`,
|
|
378
|
-
'Division by zero is not supported.'
|
|
379
|
-
);
|
|
422
|
+
evalError(`${valToPreview(left)} ${operator} ${valToPreview(right)}`, 'Division by zero is not supported.');
|
|
380
423
|
}
|
|
381
424
|
if (operator === '/') {
|
|
382
425
|
// bigint | number actually
|
|
@@ -394,10 +437,7 @@ function evalBinaryFactor<T extends EvalValue>(
|
|
|
394
437
|
res = roundInteger(ctx, res);
|
|
395
438
|
checkIntegerOverflow(ctx, res);
|
|
396
439
|
} catch (err: any) {
|
|
397
|
-
evalError(
|
|
398
|
-
`${valToPreview(left)} ${operator} ${valToPreview(right)}`,
|
|
399
|
-
err.message
|
|
400
|
-
);
|
|
440
|
+
evalError(`${valToPreview(left)} ${operator} ${valToPreview(right)}`, err.message);
|
|
401
441
|
}
|
|
402
442
|
}
|
|
403
443
|
|
|
@@ -412,10 +452,7 @@ function evalBinaryExpression(ctx: EvalContext, expr: BinaryExpression): EvalVal
|
|
|
412
452
|
let left = evalAny(ctx, expr.left);
|
|
413
453
|
let right = evalAny(ctx, expr.right);
|
|
414
454
|
|
|
415
|
-
if (
|
|
416
|
-
left.type === 'number' && right.type === 'integer' ||
|
|
417
|
-
left.type === 'integer' && right.type === 'number'
|
|
418
|
-
) {
|
|
455
|
+
if ((left.type === 'number' && right.type === 'integer') || (left.type === 'integer' && right.type === 'number')) {
|
|
419
456
|
if (left.type === 'integer') {
|
|
420
457
|
left = integerToNumber(left);
|
|
421
458
|
} else if (right.type === 'integer') {
|
|
@@ -477,7 +514,7 @@ function evalCallExpression(ctx: EvalContext, expr: CallExpression): EvalValue {
|
|
|
477
514
|
}
|
|
478
515
|
|
|
479
516
|
if (findRes) {
|
|
480
|
-
if ('expected' in findRes || 'type' in findRes && findRes.type === 'missing') {
|
|
517
|
+
if ('expected' in findRes || ('type' in findRes && findRes.type === 'missing')) {
|
|
481
518
|
logFunctionMatchError(funcName, args, findRes);
|
|
482
519
|
}
|
|
483
520
|
func = findRes.func;
|
|
@@ -511,8 +548,7 @@ export function logFunctionMatchError(
|
|
|
511
548
|
): never {
|
|
512
549
|
const argsType = args.map(arg => typeToString(arg.type)).join(', ');
|
|
513
550
|
const prefix = `${funcName}(${argsToStr(args)})`;
|
|
514
|
-
const makeError: (msg: string, details: string) => never =
|
|
515
|
-
isOuterFunc ? evalOuterError : evalError;
|
|
551
|
+
const makeError: (msg: string, details: string) => never = isOuterFunc ? evalOuterError : evalError;
|
|
516
552
|
|
|
517
553
|
if (findRes.type === 'few' && args.length === 0 && findRes.hasOverloads) {
|
|
518
554
|
makeError(prefix, 'Function requires non empty argument list.');
|
|
@@ -528,7 +564,9 @@ export function logFunctionMatchError(
|
|
|
528
564
|
makeError(prefix, `Exactly ${findRes.def.args.length} argument(s) expected.`);
|
|
529
565
|
}
|
|
530
566
|
} else {
|
|
531
|
-
const expectedArgs = findRes.def.args
|
|
567
|
+
const expectedArgs = findRes.def.args
|
|
568
|
+
.map(arg => typeToString(typeof arg === 'string' ? arg : arg.type))
|
|
569
|
+
.join(', ');
|
|
532
570
|
makeError(prefix, `Invalid argument type: expected ${expectedArgs}, got ${argsType}.`);
|
|
533
571
|
}
|
|
534
572
|
}
|
|
@@ -547,8 +585,11 @@ function evalMethodExpression(ctx: EvalContext, expr: MethodExpression): EvalVal
|
|
|
547
585
|
|
|
548
586
|
if (!methodByArgs.has(methodKey)) {
|
|
549
587
|
const findRes = findBestMatchedFunc(methods, methodName, args);
|
|
550
|
-
if ('expected' in findRes || 'type' in findRes && findRes.type === 'missing') {
|
|
551
|
-
const argsType = args
|
|
588
|
+
if ('expected' in findRes || ('type' in findRes && findRes.type === 'missing')) {
|
|
589
|
+
const argsType = args
|
|
590
|
+
.slice(1)
|
|
591
|
+
.map(arg => typeToString(arg.type))
|
|
592
|
+
.join(', ');
|
|
552
593
|
const prefix = `${methodName}(${argsToStr(args.slice(1))})`;
|
|
553
594
|
|
|
554
595
|
if (findRes.type === 'few' && args.length === 1) {
|
|
@@ -599,6 +640,10 @@ function evalVariable(ctx: EvalContext, expr: Variable): EvalValue {
|
|
|
599
640
|
const variable = ctx.variables.get(varName);
|
|
600
641
|
|
|
601
642
|
if (variable) {
|
|
643
|
+
if (!ctx.storeUsedVars) {
|
|
644
|
+
ctx.storeUsedVars = new Set();
|
|
645
|
+
}
|
|
646
|
+
ctx.storeUsedVars.add(variable);
|
|
602
647
|
return variableToValue(variable);
|
|
603
648
|
}
|
|
604
649
|
|
|
@@ -1,8 +1,28 @@
|
|
|
1
1
|
import { parseColor } from '../../utils/correctColor';
|
|
2
2
|
import { toBigInt } from '../bigint';
|
|
3
3
|
import { ARRAY, BOOLEAN, COLOR, DICT, FUNCTION, INTEGER, NUMBER, STRING, URL } from '../const';
|
|
4
|
-
import {
|
|
5
|
-
|
|
4
|
+
import {
|
|
5
|
+
logFunctionMatchError,
|
|
6
|
+
type ArrayValue,
|
|
7
|
+
type BooleanValue,
|
|
8
|
+
type ColorValue,
|
|
9
|
+
type EvalContext,
|
|
10
|
+
type EvalTypes,
|
|
11
|
+
type EvalValue,
|
|
12
|
+
type FuncValue,
|
|
13
|
+
type IntegerValue,
|
|
14
|
+
type NumberValue,
|
|
15
|
+
type StringValue,
|
|
16
|
+
type UrlValue
|
|
17
|
+
} from '../eval';
|
|
18
|
+
import {
|
|
19
|
+
checkIntegerOverflow,
|
|
20
|
+
checkUrl,
|
|
21
|
+
convertJsValueToDivKit,
|
|
22
|
+
safeCheckUrl,
|
|
23
|
+
transformColorValue,
|
|
24
|
+
typeToString
|
|
25
|
+
} from '../utils';
|
|
6
26
|
import { findBestMatchedFuncList, registerFunc, registerMethod, type Func, type FuncMatch } from './funcs';
|
|
7
27
|
|
|
8
28
|
function arrayGetter(jsType: string, runtimeType: string) {
|
|
@@ -14,9 +34,9 @@ function arrayGetter(jsType: string, runtimeType: string) {
|
|
|
14
34
|
|
|
15
35
|
let type: string = typeof val;
|
|
16
36
|
if (
|
|
17
|
-
jsType === 'array' && !Array.isArray(val) ||
|
|
18
|
-
jsType !== 'array' && type !== jsType ||
|
|
19
|
-
type === 'object' && val === null
|
|
37
|
+
(jsType === 'array' && !Array.isArray(val)) ||
|
|
38
|
+
(jsType !== 'array' && type !== jsType) ||
|
|
39
|
+
(type === 'object' && val === null)
|
|
20
40
|
) {
|
|
21
41
|
if (type === 'object') {
|
|
22
42
|
if (Array.isArray(val)) {
|
|
@@ -144,57 +164,75 @@ function filter(ctx: EvalContext, array: ArrayValue, fn: FuncValue): EvalValue {
|
|
|
144
164
|
|
|
145
165
|
if (typeof it === 'string') {
|
|
146
166
|
if (parseColor(it)) {
|
|
147
|
-
argMatchers.push([
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
167
|
+
argMatchers.push([
|
|
168
|
+
{
|
|
169
|
+
type: COLOR,
|
|
170
|
+
value: it
|
|
171
|
+
}
|
|
172
|
+
]);
|
|
151
173
|
}
|
|
152
174
|
if (safeCheckUrl(it)) {
|
|
153
|
-
argMatchers.push([
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
175
|
+
argMatchers.push([
|
|
176
|
+
{
|
|
177
|
+
type: URL,
|
|
178
|
+
value: it
|
|
179
|
+
}
|
|
180
|
+
]);
|
|
157
181
|
}
|
|
158
|
-
argMatchers.push([
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
182
|
+
argMatchers.push([
|
|
183
|
+
{
|
|
184
|
+
type: STRING,
|
|
185
|
+
value: it
|
|
186
|
+
}
|
|
187
|
+
]);
|
|
162
188
|
} else if (typeof it === 'number') {
|
|
163
189
|
if (Math.round(it) === it) {
|
|
164
190
|
checkIntegerOverflow(ctx, it);
|
|
165
|
-
argMatchers.push([
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
191
|
+
argMatchers.push([
|
|
192
|
+
{
|
|
193
|
+
type: INTEGER,
|
|
194
|
+
value: toBigInt(it)
|
|
195
|
+
}
|
|
196
|
+
]);
|
|
169
197
|
}
|
|
170
|
-
argMatchers.push([
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
198
|
+
argMatchers.push([
|
|
199
|
+
{
|
|
200
|
+
type: NUMBER,
|
|
201
|
+
value: it
|
|
202
|
+
}
|
|
203
|
+
]);
|
|
174
204
|
} else if (typeof it === 'bigint') {
|
|
175
205
|
checkIntegerOverflow(ctx, it);
|
|
176
|
-
argMatchers.push([
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
206
|
+
argMatchers.push([
|
|
207
|
+
{
|
|
208
|
+
type: INTEGER,
|
|
209
|
+
value: it
|
|
210
|
+
}
|
|
211
|
+
]);
|
|
180
212
|
} else if (Array.isArray(it)) {
|
|
181
|
-
argMatchers.push([
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
213
|
+
argMatchers.push([
|
|
214
|
+
{
|
|
215
|
+
type: ARRAY,
|
|
216
|
+
value: it
|
|
217
|
+
}
|
|
218
|
+
]);
|
|
185
219
|
} else if (typeof it === 'object') {
|
|
186
220
|
if (it === null) {
|
|
187
221
|
throw new Error('Incorrect value type: Null');
|
|
188
222
|
}
|
|
189
|
-
argMatchers.push([
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
223
|
+
argMatchers.push([
|
|
224
|
+
{
|
|
225
|
+
type: DICT,
|
|
226
|
+
value: it
|
|
227
|
+
}
|
|
228
|
+
]);
|
|
193
229
|
} else if (typeof it === 'boolean') {
|
|
194
|
-
argMatchers.push([
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
230
|
+
argMatchers.push([
|
|
231
|
+
{
|
|
232
|
+
type: BOOLEAN,
|
|
233
|
+
value: it ? 1 : 0
|
|
234
|
+
}
|
|
235
|
+
]);
|
|
198
236
|
} else {
|
|
199
237
|
throw new Error(`Incorrect value type: ${typeToString(typeof it)}`);
|
|
200
238
|
}
|
|
@@ -218,11 +256,7 @@ function filter(ctx: EvalContext, array: ArrayValue, fn: FuncValue): EvalValue {
|
|
|
218
256
|
}
|
|
219
257
|
|
|
220
258
|
const argType = selectedFn.args[0];
|
|
221
|
-
const value = convertJsValueToDivKit(
|
|
222
|
-
ctx,
|
|
223
|
-
it,
|
|
224
|
-
typeof argType === 'string' ? argType : argType.type
|
|
225
|
-
);
|
|
259
|
+
const value = convertJsValueToDivKit(ctx, it, typeof argType === 'string' ? argType : argType.type);
|
|
226
260
|
const res = selectedFn.cb(ctx, value);
|
|
227
261
|
|
|
228
262
|
if (res.type !== BOOLEAN) {
|
|
@@ -235,169 +269,55 @@ function filter(ctx: EvalContext, array: ArrayValue, fn: FuncValue): EvalValue {
|
|
|
235
269
|
}
|
|
236
270
|
|
|
237
271
|
export function registerArray(): void {
|
|
238
|
-
registerFunc('getArrayString', [
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
],
|
|
242
|
-
registerFunc('
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
],
|
|
246
|
-
|
|
247
|
-
registerFunc('
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
],
|
|
251
|
-
registerFunc('
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
],
|
|
255
|
-
|
|
256
|
-
registerFunc('
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
registerFunc('
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
],
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
registerFunc('
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
],
|
|
273
|
-
|
|
274
|
-
registerFunc('
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
],
|
|
278
|
-
registerFunc('
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
],
|
|
287
|
-
registerFunc('getUrlFromArray', [
|
|
288
|
-
ARRAY,
|
|
289
|
-
INTEGER
|
|
290
|
-
], getArrayUrl);
|
|
291
|
-
|
|
292
|
-
registerFunc('getArrayFromArray', [
|
|
293
|
-
ARRAY,
|
|
294
|
-
INTEGER
|
|
295
|
-
], getArrayArray);
|
|
296
|
-
|
|
297
|
-
registerFunc('getDictFromArray', [
|
|
298
|
-
ARRAY,
|
|
299
|
-
INTEGER
|
|
300
|
-
], getArrayDict);
|
|
301
|
-
|
|
302
|
-
registerFunc('getArrayOptString', [
|
|
303
|
-
ARRAY,
|
|
304
|
-
INTEGER,
|
|
305
|
-
STRING
|
|
306
|
-
], getArrayOptString);
|
|
307
|
-
registerFunc('getOptStringFromArray', [
|
|
308
|
-
ARRAY,
|
|
309
|
-
INTEGER,
|
|
310
|
-
STRING
|
|
311
|
-
], getArrayOptString);
|
|
312
|
-
|
|
313
|
-
registerFunc('getArrayOptNumber', [
|
|
314
|
-
ARRAY,
|
|
315
|
-
INTEGER,
|
|
316
|
-
NUMBER
|
|
317
|
-
], getArrayOptNumber);
|
|
318
|
-
registerFunc('getOptNumberFromArray', [
|
|
319
|
-
ARRAY,
|
|
320
|
-
INTEGER,
|
|
321
|
-
NUMBER
|
|
322
|
-
], getArrayOptNumber);
|
|
323
|
-
|
|
324
|
-
registerFunc('getArrayOptInteger', [
|
|
325
|
-
ARRAY,
|
|
326
|
-
INTEGER,
|
|
327
|
-
INTEGER
|
|
328
|
-
], getArrayOptInteger);
|
|
329
|
-
registerFunc('getOptIntegerFromArray', [
|
|
330
|
-
ARRAY,
|
|
331
|
-
INTEGER,
|
|
332
|
-
INTEGER
|
|
333
|
-
], getArrayOptInteger);
|
|
334
|
-
|
|
335
|
-
registerFunc('getArrayOptBoolean', [
|
|
336
|
-
ARRAY,
|
|
337
|
-
INTEGER,
|
|
338
|
-
BOOLEAN
|
|
339
|
-
], getArrayOptBoolean);
|
|
340
|
-
registerFunc('getOptBooleanFromArray', [
|
|
341
|
-
ARRAY,
|
|
342
|
-
INTEGER,
|
|
343
|
-
BOOLEAN
|
|
344
|
-
], getArrayOptBoolean);
|
|
345
|
-
|
|
346
|
-
registerFunc('getArrayOptColor', [
|
|
347
|
-
ARRAY,
|
|
348
|
-
INTEGER,
|
|
349
|
-
COLOR
|
|
350
|
-
], getArrayOptColor);
|
|
351
|
-
registerFunc('getOptColorFromArray', [
|
|
352
|
-
ARRAY,
|
|
353
|
-
INTEGER,
|
|
354
|
-
COLOR
|
|
355
|
-
], getArrayOptColor);
|
|
356
|
-
registerFunc('getArrayOptColor', [
|
|
357
|
-
ARRAY,
|
|
358
|
-
INTEGER,
|
|
359
|
-
STRING
|
|
360
|
-
], getArrayOptColor);
|
|
361
|
-
registerFunc('getOptColorFromArray', [
|
|
362
|
-
ARRAY,
|
|
363
|
-
INTEGER,
|
|
364
|
-
STRING
|
|
365
|
-
], getArrayOptColor);
|
|
366
|
-
|
|
367
|
-
registerFunc('getArrayOptUrl', [
|
|
368
|
-
ARRAY,
|
|
369
|
-
INTEGER,
|
|
370
|
-
URL
|
|
371
|
-
], getArrayOptUrl);
|
|
372
|
-
registerFunc('getOptUrlFromArray', [
|
|
373
|
-
ARRAY,
|
|
374
|
-
INTEGER,
|
|
375
|
-
URL
|
|
376
|
-
], getArrayOptUrl);
|
|
377
|
-
registerFunc('getArrayOptUrl', [
|
|
378
|
-
ARRAY,
|
|
379
|
-
INTEGER,
|
|
380
|
-
STRING
|
|
381
|
-
], getArrayOptUrl);
|
|
382
|
-
registerFunc('getOptUrlFromArray', [
|
|
383
|
-
ARRAY,
|
|
384
|
-
INTEGER,
|
|
385
|
-
STRING
|
|
386
|
-
], getArrayOptUrl);
|
|
387
|
-
|
|
388
|
-
registerFunc('getOptArrayFromArray', [
|
|
389
|
-
ARRAY,
|
|
390
|
-
INTEGER
|
|
391
|
-
], getArrayOptArray);
|
|
392
|
-
|
|
393
|
-
registerFunc('getOptDictFromArray', [
|
|
394
|
-
ARRAY,
|
|
395
|
-
INTEGER
|
|
396
|
-
], getArrayOptDict);
|
|
397
|
-
|
|
398
|
-
registerFunc('len', [
|
|
399
|
-
ARRAY
|
|
400
|
-
], len);
|
|
272
|
+
registerFunc('getArrayString', [ARRAY, INTEGER], getArrayString);
|
|
273
|
+
registerFunc('getStringFromArray', [ARRAY, INTEGER], getArrayString);
|
|
274
|
+
|
|
275
|
+
registerFunc('getArrayNumber', [ARRAY, INTEGER], getArrayNumber);
|
|
276
|
+
registerFunc('getNumberFromArray', [ARRAY, INTEGER], getArrayNumber);
|
|
277
|
+
|
|
278
|
+
registerFunc('getArrayInteger', [ARRAY, INTEGER], getArrayInteger);
|
|
279
|
+
registerFunc('getIntegerFromArray', [ARRAY, INTEGER], getArrayInteger);
|
|
280
|
+
|
|
281
|
+
registerFunc('getArrayBoolean', [ARRAY, INTEGER], getArrayBoolean);
|
|
282
|
+
registerFunc('getBooleanFromArray', [ARRAY, INTEGER], getArrayBoolean);
|
|
283
|
+
|
|
284
|
+
registerFunc('getArrayColor', [ARRAY, INTEGER], getArrayColor);
|
|
285
|
+
registerFunc('getColorFromArray', [ARRAY, INTEGER], getArrayColor);
|
|
286
|
+
|
|
287
|
+
registerFunc('getArrayUrl', [ARRAY, INTEGER], getArrayUrl);
|
|
288
|
+
registerFunc('getUrlFromArray', [ARRAY, INTEGER], getArrayUrl);
|
|
289
|
+
|
|
290
|
+
registerFunc('getArrayFromArray', [ARRAY, INTEGER], getArrayArray);
|
|
291
|
+
|
|
292
|
+
registerFunc('getDictFromArray', [ARRAY, INTEGER], getArrayDict);
|
|
293
|
+
|
|
294
|
+
registerFunc('getArrayOptString', [ARRAY, INTEGER, STRING], getArrayOptString);
|
|
295
|
+
registerFunc('getOptStringFromArray', [ARRAY, INTEGER, STRING], getArrayOptString);
|
|
296
|
+
|
|
297
|
+
registerFunc('getArrayOptNumber', [ARRAY, INTEGER, NUMBER], getArrayOptNumber);
|
|
298
|
+
registerFunc('getOptNumberFromArray', [ARRAY, INTEGER, NUMBER], getArrayOptNumber);
|
|
299
|
+
|
|
300
|
+
registerFunc('getArrayOptInteger', [ARRAY, INTEGER, INTEGER], getArrayOptInteger);
|
|
301
|
+
registerFunc('getOptIntegerFromArray', [ARRAY, INTEGER, INTEGER], getArrayOptInteger);
|
|
302
|
+
|
|
303
|
+
registerFunc('getArrayOptBoolean', [ARRAY, INTEGER, BOOLEAN], getArrayOptBoolean);
|
|
304
|
+
registerFunc('getOptBooleanFromArray', [ARRAY, INTEGER, BOOLEAN], getArrayOptBoolean);
|
|
305
|
+
|
|
306
|
+
registerFunc('getArrayOptColor', [ARRAY, INTEGER, COLOR], getArrayOptColor);
|
|
307
|
+
registerFunc('getOptColorFromArray', [ARRAY, INTEGER, COLOR], getArrayOptColor);
|
|
308
|
+
registerFunc('getArrayOptColor', [ARRAY, INTEGER, STRING], getArrayOptColor);
|
|
309
|
+
registerFunc('getOptColorFromArray', [ARRAY, INTEGER, STRING], getArrayOptColor);
|
|
310
|
+
|
|
311
|
+
registerFunc('getArrayOptUrl', [ARRAY, INTEGER, URL], getArrayOptUrl);
|
|
312
|
+
registerFunc('getOptUrlFromArray', [ARRAY, INTEGER, URL], getArrayOptUrl);
|
|
313
|
+
registerFunc('getArrayOptUrl', [ARRAY, INTEGER, STRING], getArrayOptUrl);
|
|
314
|
+
registerFunc('getOptUrlFromArray', [ARRAY, INTEGER, STRING], getArrayOptUrl);
|
|
315
|
+
|
|
316
|
+
registerFunc('getOptArrayFromArray', [ARRAY, INTEGER], getArrayOptArray);
|
|
317
|
+
|
|
318
|
+
registerFunc('getOptDictFromArray', [ARRAY, INTEGER], getArrayOptDict);
|
|
319
|
+
|
|
320
|
+
registerFunc('len', [ARRAY], len);
|
|
401
321
|
|
|
402
322
|
registerMethod('getString', [ARRAY, INTEGER], getArrayString);
|
|
403
323
|
registerMethod('getInteger', [ARRAY, INTEGER], getArrayInteger);
|
|
@@ -4,9 +4,7 @@ import { registerFunc } from './funcs';
|
|
|
4
4
|
import { COLOR, NUMBER, STRING } from '../const';
|
|
5
5
|
import { safeConvertColor, stringifyColor } from '../utils';
|
|
6
6
|
|
|
7
|
-
function colorGetter(
|
|
8
|
-
field: keyof ParsedColor
|
|
9
|
-
): (_ctx: EvalContext, color: StringValue | ColorValue) => EvalValue {
|
|
7
|
+
function colorGetter(field: keyof ParsedColor): (_ctx: EvalContext, color: StringValue | ColorValue) => EvalValue {
|
|
10
8
|
return (_vars, color) => {
|
|
11
9
|
const parsed = safeConvertColor(color.value);
|
|
12
10
|
|
|
@@ -67,9 +67,11 @@ export function customFunctionWrap(fn: DivFunction): Func {
|
|
|
67
67
|
}),
|
|
68
68
|
cb(ctx, ...args) {
|
|
69
69
|
if (!ast) {
|
|
70
|
-
ast =
|
|
71
|
-
|
|
72
|
-
|
|
70
|
+
ast =
|
|
71
|
+
cacheGet(fn.body) ||
|
|
72
|
+
parse(fn.body, {
|
|
73
|
+
startRule: 'JsonStringContents'
|
|
74
|
+
});
|
|
73
75
|
cacheSet(fn.body, ast!);
|
|
74
76
|
}
|
|
75
77
|
|
|
@@ -99,7 +101,7 @@ export function customFunctionWrap(fn: DivFunction): Func {
|
|
|
99
101
|
}
|
|
100
102
|
|
|
101
103
|
return result;
|
|
102
|
-
}
|
|
104
|
+
}
|
|
103
105
|
};
|
|
104
106
|
}
|
|
105
107
|
|
|
@@ -78,7 +78,7 @@ function setDay(_ctx: EvalContext, datetime: DatetimeValue, day: IntegerValue):
|
|
|
78
78
|
const copy = new Date(datetime.value);
|
|
79
79
|
const intVal = Number(day.value);
|
|
80
80
|
|
|
81
|
-
if (intVal <= 0 && intVal !== -1 || intVal > getMaxDate(copy)) {
|
|
81
|
+
if ((intVal <= 0 && intVal !== -1) || intVal > getMaxDate(copy)) {
|
|
82
82
|
throw new Error(`Unable to set day ${intVal} for date ${valToString(datetime, false)}.`);
|
|
83
83
|
}
|
|
84
84
|
|
|
@@ -156,8 +156,15 @@ function setMillis(_ctx: EvalContext, datetime: DatetimeValue, millis: IntegerVa
|
|
|
156
156
|
}
|
|
157
157
|
|
|
158
158
|
const getter = (
|
|
159
|
-
method:
|
|
160
|
-
|
|
159
|
+
method:
|
|
160
|
+
| 'getUTCFullYear'
|
|
161
|
+
| 'getUTCMonth'
|
|
162
|
+
| 'getUTCDate'
|
|
163
|
+
| 'getUTCDay'
|
|
164
|
+
| 'getUTCHours'
|
|
165
|
+
| 'getUTCMinutes'
|
|
166
|
+
| 'getUTCSeconds'
|
|
167
|
+
| 'getUTCMilliseconds'
|
|
161
168
|
) => {
|
|
162
169
|
return (_ctx: EvalContext, datetime: DatetimeValue): EvalValue => {
|
|
163
170
|
const copy = new Date(datetime.value.getTime());
|