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.
Files changed (145) hide show
  1. package/README.md +135 -137
  2. package/dist/DivKit.d.ts.map +1 -1
  3. package/dist/DivKit.js +24 -7
  4. package/dist/DivKit.js.map +1 -1
  5. package/dist/actions/array.d.ts.map +1 -1
  6. package/dist/actions/array.js +1 -1
  7. package/dist/actions/array.js.map +1 -1
  8. package/dist/actions/copyToClipboard.d.ts.map +1 -1
  9. package/dist/actions/copyToClipboard.js +2 -1
  10. package/dist/actions/copyToClipboard.js.map +1 -1
  11. package/dist/actions/dict.d.ts.map +1 -1
  12. package/dist/actions/dict.js.map +1 -1
  13. package/dist/actions/updateStructure.d.ts.map +1 -1
  14. package/dist/actions/updateStructure.js.map +1 -1
  15. package/dist/components/container/DivContainer.d.ts.map +1 -1
  16. package/dist/components/container/DivContainer.js +3 -5
  17. package/dist/components/container/DivContainer.js.map +1 -1
  18. package/dist/components/image/DivImage.d.ts.map +1 -1
  19. package/dist/components/image/DivImage.js +1 -6
  20. package/dist/components/image/DivImage.js.map +1 -1
  21. package/dist/components/state/DivState.d.ts.map +1 -1
  22. package/dist/components/state/DivState.js +3 -5
  23. package/dist/components/state/DivState.js.map +1 -1
  24. package/dist/components/text/DivText.d.ts.map +1 -1
  25. package/dist/components/text/DivText.js +4 -4
  26. package/dist/components/text/DivText.js.map +1 -1
  27. package/dist/components/utilities/Outer.d.ts.map +1 -1
  28. package/dist/components/utilities/Outer.js +6 -5
  29. package/dist/components/utilities/Outer.js.map +1 -1
  30. package/dist/context/index.d.ts.map +1 -1
  31. package/dist/context/index.js.map +1 -1
  32. package/dist/expressions/eval.d.ts.map +1 -1
  33. package/dist/expressions/eval.js +19 -11
  34. package/dist/expressions/eval.js.map +1 -1
  35. package/dist/expressions/funcs/array.d.ts.map +1 -1
  36. package/dist/expressions/funcs/array.js +72 -168
  37. package/dist/expressions/funcs/array.js.map +1 -1
  38. package/dist/expressions/funcs/colors.d.ts.map +1 -1
  39. package/dist/expressions/funcs/colors.js.map +1 -1
  40. package/dist/expressions/funcs/customFuncs.d.ts.map +1 -1
  41. package/dist/expressions/funcs/customFuncs.js +6 -4
  42. package/dist/expressions/funcs/customFuncs.js.map +1 -1
  43. package/dist/expressions/funcs/datetime.d.ts.map +1 -1
  44. package/dist/expressions/funcs/datetime.js +1 -1
  45. package/dist/expressions/funcs/datetime.js.map +1 -1
  46. package/dist/expressions/funcs/dict.d.ts.map +1 -1
  47. package/dist/expressions/funcs/dict.js.map +1 -1
  48. package/dist/expressions/funcs/funcs.d.ts.map +1 -1
  49. package/dist/expressions/funcs/funcs.js +21 -13
  50. package/dist/expressions/funcs/funcs.js.map +1 -1
  51. package/dist/expressions/funcs/math.d.ts.map +1 -1
  52. package/dist/expressions/funcs/math.js +40 -20
  53. package/dist/expressions/funcs/math.js.map +1 -1
  54. package/dist/expressions/funcs/std.d.ts.map +1 -1
  55. package/dist/expressions/funcs/std.js +4 -4
  56. package/dist/expressions/funcs/std.js.map +1 -1
  57. package/dist/expressions/funcs/strings.d.ts.map +1 -1
  58. package/dist/expressions/funcs/strings.js +1 -2
  59. package/dist/expressions/funcs/strings.js.map +1 -1
  60. package/dist/expressions/funcs/trigonometry.js +2 -2
  61. package/dist/expressions/funcs/trigonometry.js.map +1 -1
  62. package/dist/expressions/json.d.ts +2 -2
  63. package/dist/expressions/json.d.ts.map +1 -1
  64. package/dist/expressions/json.js +6 -4
  65. package/dist/expressions/json.js.map +1 -1
  66. package/dist/expressions/utils.d.ts.map +1 -1
  67. package/dist/expressions/utils.js +9 -10
  68. package/dist/expressions/utils.js.map +1 -1
  69. package/dist/expressions/variable.d.ts.map +1 -1
  70. package/dist/expressions/variable.js +3 -7
  71. package/dist/expressions/variable.js.map +1 -1
  72. package/dist/expressions/walk.d.ts.map +1 -1
  73. package/dist/expressions/walk.js.map +1 -1
  74. package/dist/hooks/index.d.ts.map +1 -1
  75. package/dist/hooks/index.js.map +1 -1
  76. package/dist/hooks/useAction.d.ts.map +1 -1
  77. package/dist/hooks/useAction.js.map +1 -1
  78. package/dist/hooks/useDerivedFromVars.d.ts.map +1 -1
  79. package/dist/hooks/useDerivedFromVars.js.map +1 -1
  80. package/dist/hooks/useVariable.d.ts.map +1 -1
  81. package/dist/hooks/useVariable.js +4 -4
  82. package/dist/hooks/useVariable.js.map +1 -1
  83. package/dist/index.d.ts.map +1 -1
  84. package/dist/index.js.map +1 -1
  85. package/dist/stores/createObservable.d.ts.map +1 -1
  86. package/dist/stores/createObservable.js.map +1 -1
  87. package/dist/utils/applyTemplate.d.ts +2 -2
  88. package/dist/utils/applyTemplate.d.ts.map +1 -1
  89. package/dist/utils/applyTemplate.js +13 -13
  90. package/dist/utils/applyTemplate.js.map +1 -1
  91. package/dist/utils/correctColor.d.ts.map +1 -1
  92. package/dist/utils/correctColor.js +8 -6
  93. package/dist/utils/correctColor.js.map +1 -1
  94. package/dist/utils/formatDate.d.ts.map +1 -1
  95. package/dist/utils/formatDate.js +7 -10
  96. package/dist/utils/formatDate.js.map +1 -1
  97. package/dist/utils/wrapError.d.ts.map +1 -1
  98. package/dist/utils/wrapError.js.map +1 -1
  99. package/package.json +2 -2
  100. package/src/DivKit.tsx +258 -220
  101. package/src/actions/array.ts +91 -64
  102. package/src/actions/copyToClipboard.ts +28 -19
  103. package/src/actions/dict.ts +36 -26
  104. package/src/actions/updateStructure.ts +86 -61
  105. package/src/components/README.md +38 -18
  106. package/src/components/container/DivContainer.tsx +4 -14
  107. package/src/components/image/DivImage.tsx +1 -11
  108. package/src/components/state/DivState.tsx +3 -9
  109. package/src/components/text/DivText.tsx +8 -20
  110. package/src/components/utilities/Outer.tsx +9 -19
  111. package/src/components/utilities/README.md +33 -29
  112. package/src/context/index.ts +2 -11
  113. package/src/expressions/ast.d.ts +16 -9
  114. package/src/expressions/eval.ts +82 -37
  115. package/src/expressions/funcs/array.ts +129 -209
  116. package/src/expressions/funcs/colors.ts +1 -3
  117. package/src/expressions/funcs/customFuncs.ts +6 -4
  118. package/src/expressions/funcs/datetime.ts +10 -3
  119. package/src/expressions/funcs/dict.ts +16 -2
  120. package/src/expressions/funcs/funcs.ts +75 -89
  121. package/src/expressions/funcs/math.ts +103 -43
  122. package/src/expressions/funcs/std.ts +4 -7
  123. package/src/expressions/funcs/strings.ts +9 -25
  124. package/src/expressions/funcs/trigonometry.ts +2 -2
  125. package/src/expressions/json.ts +60 -53
  126. package/src/expressions/utils.ts +24 -22
  127. package/src/expressions/variable.ts +5 -21
  128. package/src/expressions/walk.ts +6 -3
  129. package/src/hooks/README.md +61 -53
  130. package/src/hooks/index.ts +3 -18
  131. package/src/hooks/useAction.ts +1 -3
  132. package/src/hooks/useDerivedFromVars.ts +3 -13
  133. package/src/hooks/useVariable.ts +7 -17
  134. package/src/index.ts +10 -48
  135. package/src/stores/createObservable.ts +35 -35
  136. package/src/types/alignment.d.ts +15 -6
  137. package/src/types/background.d.ts +6 -2
  138. package/src/types/base.d.ts +41 -9
  139. package/src/types/componentContext.d.ts +27 -22
  140. package/src/types/container.d.ts +1 -4
  141. package/src/types/text.d.ts +1 -1
  142. package/src/utils/applyTemplate.ts +103 -109
  143. package/src/utils/correctColor.ts +9 -8
  144. package/src/utils/formatDate.ts +175 -86
  145. package/src/utils/wrapError.ts +7 -4
@@ -2,17 +2,37 @@
2
2
  /* eslint-disable no-else-return */
3
3
 
4
4
  import type {
5
- BinaryExpression, BooleanLiteral, CallExpression, CompareOperator,
6
- ConditionalExpression, EqualityOperator, FactorOperator, IntegerLiteral,
5
+ BinaryExpression,
6
+ BooleanLiteral,
7
+ CallExpression,
8
+ CompareOperator,
9
+ ConditionalExpression,
10
+ EqualityOperator,
11
+ FactorOperator,
12
+ IntegerLiteral,
7
13
  LogicalExpression,
8
14
  MethodExpression,
9
- Node, NumberLiteral, StringLiteral, SumOperator,
15
+ Node,
16
+ NumberLiteral,
17
+ StringLiteral,
18
+ SumOperator,
10
19
  TemplateLiteral,
11
20
  TryExpression,
12
- UnaryExpression, Variable
21
+ UnaryExpression,
22
+ Variable
13
23
  } from './ast';
14
24
  import type { WrappedError } from '../utils/wrapError';
15
- import { convertArgs, findBestMatchedFunc, type Func, funcByArgs, type FuncMatch, type FuncMatchError, funcs, methodByArgs, methods } from './funcs/funcs';
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 = 'string' | 'number' | 'integer' | 'boolean' | 'color' | 'url' | 'datetime' | 'dict' | 'array' | 'function';
38
-
39
- export type EvalTypesWithoutDatetime = 'string' | 'number' | 'integer' | 'boolean' | 'color' | 'url' | 'dict' | 'array' | 'function';
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 = StringValue | UrlValue | ColorValue | NumberValue | IntegerValue |
97
- BooleanValue | DatetimeValue | DictValue | ArrayValue | FuncValue;
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 = operator === '+' ?
335
- (left.value as bigint) + (right.value as bigint) :
336
- (left.value as bigint) - (right.value as bigint);
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.map(arg => typeToString(typeof arg === 'string' ? arg : arg.type)).join(', ');
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.slice(1).map(arg => typeToString(arg.type)).join(', ');
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 { logFunctionMatchError, type ArrayValue, type BooleanValue, type ColorValue, type EvalContext, type EvalTypes, type EvalValue, type FuncValue, type IntegerValue, type NumberValue, type StringValue, type UrlValue } from '../eval';
5
- import { checkIntegerOverflow, checkUrl, convertJsValueToDivKit, safeCheckUrl, transformColorValue, typeToString } from '../utils';
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
- type: COLOR,
149
- value: it
150
- }]);
167
+ argMatchers.push([
168
+ {
169
+ type: COLOR,
170
+ value: it
171
+ }
172
+ ]);
151
173
  }
152
174
  if (safeCheckUrl(it)) {
153
- argMatchers.push([{
154
- type: URL,
155
- value: it
156
- }]);
175
+ argMatchers.push([
176
+ {
177
+ type: URL,
178
+ value: it
179
+ }
180
+ ]);
157
181
  }
158
- argMatchers.push([{
159
- type: STRING,
160
- value: it
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
- type: INTEGER,
167
- value: toBigInt(it)
168
- }]);
191
+ argMatchers.push([
192
+ {
193
+ type: INTEGER,
194
+ value: toBigInt(it)
195
+ }
196
+ ]);
169
197
  }
170
- argMatchers.push([{
171
- type: NUMBER,
172
- value: it
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
- type: INTEGER,
178
- value: it
179
- }]);
206
+ argMatchers.push([
207
+ {
208
+ type: INTEGER,
209
+ value: it
210
+ }
211
+ ]);
180
212
  } else if (Array.isArray(it)) {
181
- argMatchers.push([{
182
- type: ARRAY,
183
- value: it
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
- type: DICT,
191
- value: it
192
- }]);
223
+ argMatchers.push([
224
+ {
225
+ type: DICT,
226
+ value: it
227
+ }
228
+ ]);
193
229
  } else if (typeof it === 'boolean') {
194
- argMatchers.push([{
195
- type: BOOLEAN,
196
- value: it ? 1 : 0
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
- ARRAY,
240
- INTEGER
241
- ], getArrayString);
242
- registerFunc('getStringFromArray', [
243
- ARRAY,
244
- INTEGER
245
- ], getArrayString);
246
-
247
- registerFunc('getArrayNumber', [
248
- ARRAY,
249
- INTEGER
250
- ], getArrayNumber);
251
- registerFunc('getNumberFromArray', [
252
- ARRAY,
253
- INTEGER
254
- ], getArrayNumber);
255
-
256
- registerFunc('getArrayInteger', [
257
- ARRAY,
258
- INTEGER
259
- ], getArrayInteger);
260
- registerFunc('getIntegerFromArray', [
261
- ARRAY,
262
- INTEGER
263
- ], getArrayInteger);
264
-
265
- registerFunc('getArrayBoolean', [
266
- ARRAY,
267
- INTEGER
268
- ], getArrayBoolean);
269
- registerFunc('getBooleanFromArray', [
270
- ARRAY,
271
- INTEGER
272
- ], getArrayBoolean);
273
-
274
- registerFunc('getArrayColor', [
275
- ARRAY,
276
- INTEGER
277
- ], getArrayColor);
278
- registerFunc('getColorFromArray', [
279
- ARRAY,
280
- INTEGER
281
- ], getArrayColor);
282
-
283
- registerFunc('getArrayUrl', [
284
- ARRAY,
285
- INTEGER
286
- ], getArrayUrl);
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 = cacheGet(fn.body) || parse(fn.body, {
71
- startRule: 'JsonStringContents'
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: 'getUTCFullYear' | 'getUTCMonth' | 'getUTCDate' | 'getUTCDay' | 'getUTCHours' | 'getUTCMinutes' |
160
- 'getUTCSeconds' | 'getUTCMilliseconds'
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());