react-native-divkit 0.1.0-alpha.1

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 (322) hide show
  1. package/LICENSE +176 -0
  2. package/README.md +340 -0
  3. package/dist/DivKit.d.ts +68 -0
  4. package/dist/DivKit.d.ts.map +1 -0
  5. package/dist/DivKit.js +400 -0
  6. package/dist/DivKit.js.map +1 -0
  7. package/dist/actions/array.d.ts +8 -0
  8. package/dist/actions/array.d.ts.map +1 -0
  9. package/dist/actions/array.js +139 -0
  10. package/dist/actions/array.js.map +1 -0
  11. package/dist/actions/copyToClipboard.d.ts +22 -0
  12. package/dist/actions/copyToClipboard.d.ts.map +1 -0
  13. package/dist/actions/copyToClipboard.js +63 -0
  14. package/dist/actions/copyToClipboard.js.map +1 -0
  15. package/dist/actions/dict.d.ts +6 -0
  16. package/dist/actions/dict.d.ts.map +1 -0
  17. package/dist/actions/dict.js +58 -0
  18. package/dist/actions/dict.js.map +1 -0
  19. package/dist/actions/index.d.ts +11 -0
  20. package/dist/actions/index.d.ts.map +1 -0
  21. package/dist/actions/index.js +11 -0
  22. package/dist/actions/index.js.map +1 -0
  23. package/dist/actions/updateStructure.d.ts +6 -0
  24. package/dist/actions/updateStructure.d.ts.map +1 -0
  25. package/dist/actions/updateStructure.js +116 -0
  26. package/dist/actions/updateStructure.js.map +1 -0
  27. package/dist/components/DivComponent.d.ts +29 -0
  28. package/dist/components/DivComponent.d.ts.map +1 -0
  29. package/dist/components/DivComponent.js +62 -0
  30. package/dist/components/DivComponent.js.map +1 -0
  31. package/dist/components/container/DivContainer.d.ts +26 -0
  32. package/dist/components/container/DivContainer.d.ts.map +1 -0
  33. package/dist/components/container/DivContainer.js +172 -0
  34. package/dist/components/container/DivContainer.js.map +1 -0
  35. package/dist/components/container/index.d.ts +3 -0
  36. package/dist/components/container/index.d.ts.map +1 -0
  37. package/dist/components/container/index.js +2 -0
  38. package/dist/components/container/index.js.map +1 -0
  39. package/dist/components/image/DivImage.d.ts +29 -0
  40. package/dist/components/image/DivImage.d.ts.map +1 -0
  41. package/dist/components/image/DivImage.js +122 -0
  42. package/dist/components/image/DivImage.js.map +1 -0
  43. package/dist/components/image/index.d.ts +3 -0
  44. package/dist/components/image/index.d.ts.map +1 -0
  45. package/dist/components/image/index.js +2 -0
  46. package/dist/components/image/index.js.map +1 -0
  47. package/dist/components/index.d.ts +14 -0
  48. package/dist/components/index.d.ts.map +1 -0
  49. package/dist/components/index.js +11 -0
  50. package/dist/components/index.js.map +1 -0
  51. package/dist/components/state/DivState.d.ts +26 -0
  52. package/dist/components/state/DivState.d.ts.map +1 -0
  53. package/dist/components/state/DivState.js +121 -0
  54. package/dist/components/state/DivState.js.map +1 -0
  55. package/dist/components/state/index.d.ts +3 -0
  56. package/dist/components/state/index.d.ts.map +1 -0
  57. package/dist/components/state/index.js +2 -0
  58. package/dist/components/state/index.js.map +1 -0
  59. package/dist/components/text/DivText.d.ts +28 -0
  60. package/dist/components/text/DivText.d.ts.map +1 -0
  61. package/dist/components/text/DivText.js +143 -0
  62. package/dist/components/text/DivText.js.map +1 -0
  63. package/dist/components/text/index.d.ts +3 -0
  64. package/dist/components/text/index.d.ts.map +1 -0
  65. package/dist/components/text/index.js +2 -0
  66. package/dist/components/text/index.js.map +1 -0
  67. package/dist/components/utilities/Outer.d.ts +17 -0
  68. package/dist/components/utilities/Outer.d.ts.map +1 -0
  69. package/dist/components/utilities/Outer.js +210 -0
  70. package/dist/components/utilities/Outer.js.map +1 -0
  71. package/dist/components/utilities/Unknown.d.ts +11 -0
  72. package/dist/components/utilities/Unknown.d.ts.map +1 -0
  73. package/dist/components/utilities/Unknown.js +50 -0
  74. package/dist/components/utilities/Unknown.js.map +1 -0
  75. package/dist/components/utilities/index.d.ts +5 -0
  76. package/dist/components/utilities/index.d.ts.map +1 -0
  77. package/dist/components/utilities/index.js +3 -0
  78. package/dist/components/utilities/index.js.map +1 -0
  79. package/dist/context/ActionContext.d.ts +25 -0
  80. package/dist/context/ActionContext.d.ts.map +1 -0
  81. package/dist/context/ActionContext.js +20 -0
  82. package/dist/context/ActionContext.js.map +1 -0
  83. package/dist/context/DivKitContext.d.ts +33 -0
  84. package/dist/context/DivKitContext.d.ts.map +1 -0
  85. package/dist/context/DivKitContext.js +14 -0
  86. package/dist/context/DivKitContext.js.map +1 -0
  87. package/dist/context/EnabledContext.d.ts +31 -0
  88. package/dist/context/EnabledContext.d.ts.map +1 -0
  89. package/dist/context/EnabledContext.js +31 -0
  90. package/dist/context/EnabledContext.js.map +1 -0
  91. package/dist/context/StateContext.d.ts +57 -0
  92. package/dist/context/StateContext.d.ts.map +1 -0
  93. package/dist/context/StateContext.js +20 -0
  94. package/dist/context/StateContext.js.map +1 -0
  95. package/dist/context/index.d.ts +9 -0
  96. package/dist/context/index.d.ts.map +1 -0
  97. package/dist/context/index.js +9 -0
  98. package/dist/context/index.js.map +1 -0
  99. package/dist/expressions/bigint.d.ts +8 -0
  100. package/dist/expressions/bigint.d.ts.map +1 -0
  101. package/dist/expressions/bigint.js +31 -0
  102. package/dist/expressions/bigint.js.map +1 -0
  103. package/dist/expressions/const.d.ts +15 -0
  104. package/dist/expressions/const.d.ts.map +1 -0
  105. package/dist/expressions/const.js +15 -0
  106. package/dist/expressions/const.js.map +1 -0
  107. package/dist/expressions/eval.d.ts +77 -0
  108. package/dist/expressions/eval.d.ts.map +1 -0
  109. package/dist/expressions/eval.js +459 -0
  110. package/dist/expressions/eval.js.map +1 -0
  111. package/dist/expressions/expressions.d.ts +7 -0
  112. package/dist/expressions/expressions.d.ts.map +1 -0
  113. package/dist/expressions/expressions.js +3191 -0
  114. package/dist/expressions/expressions.js.map +1 -0
  115. package/dist/expressions/funcs/array.d.ts +2 -0
  116. package/dist/expressions/funcs/array.d.ts.map +1 -0
  117. package/dist/expressions/funcs/array.js +381 -0
  118. package/dist/expressions/funcs/array.js.map +1 -0
  119. package/dist/expressions/funcs/colors.d.ts +2 -0
  120. package/dist/expressions/funcs/colors.d.ts.map +1 -0
  121. package/dist/expressions/funcs/colors.js +75 -0
  122. package/dist/expressions/funcs/colors.js.map +1 -0
  123. package/dist/expressions/funcs/customFuncs.d.ts +8 -0
  124. package/dist/expressions/funcs/customFuncs.d.ts.map +1 -0
  125. package/dist/expressions/funcs/customFuncs.js +114 -0
  126. package/dist/expressions/funcs/customFuncs.js.map +1 -0
  127. package/dist/expressions/funcs/datetime.d.ts +2 -0
  128. package/dist/expressions/funcs/datetime.d.ts.map +1 -0
  129. package/dist/expressions/funcs/datetime.js +182 -0
  130. package/dist/expressions/funcs/datetime.js.map +1 -0
  131. package/dist/expressions/funcs/dict.d.ts +2 -0
  132. package/dist/expressions/funcs/dict.d.ts.map +1 -0
  133. package/dist/expressions/funcs/dict.js +170 -0
  134. package/dist/expressions/funcs/dict.js.map +1 -0
  135. package/dist/expressions/funcs/funcs.d.ts +80 -0
  136. package/dist/expressions/funcs/funcs.d.ts.map +1 -0
  137. package/dist/expressions/funcs/funcs.js +146 -0
  138. package/dist/expressions/funcs/funcs.js.map +1 -0
  139. package/dist/expressions/funcs/index.d.ts +2 -0
  140. package/dist/expressions/funcs/index.d.ts.map +1 -0
  141. package/dist/expressions/funcs/index.js +23 -0
  142. package/dist/expressions/funcs/index.js.map +1 -0
  143. package/dist/expressions/funcs/interval.d.ts +2 -0
  144. package/dist/expressions/funcs/interval.d.ts.map +1 -0
  145. package/dist/expressions/funcs/interval.js +61 -0
  146. package/dist/expressions/funcs/interval.js.map +1 -0
  147. package/dist/expressions/funcs/math.d.ts +2 -0
  148. package/dist/expressions/funcs/math.d.ts.map +1 -0
  149. package/dist/expressions/funcs/math.js +324 -0
  150. package/dist/expressions/funcs/math.js.map +1 -0
  151. package/dist/expressions/funcs/std.d.ts +2 -0
  152. package/dist/expressions/funcs/std.d.ts.map +1 -0
  153. package/dist/expressions/funcs/std.js +293 -0
  154. package/dist/expressions/funcs/std.js.map +1 -0
  155. package/dist/expressions/funcs/stored.d.ts +4 -0
  156. package/dist/expressions/funcs/stored.d.ts.map +1 -0
  157. package/dist/expressions/funcs/stored.js +62 -0
  158. package/dist/expressions/funcs/stored.js.map +1 -0
  159. package/dist/expressions/funcs/strings.d.ts +2 -0
  160. package/dist/expressions/funcs/strings.d.ts.map +1 -0
  161. package/dist/expressions/funcs/strings.js +158 -0
  162. package/dist/expressions/funcs/strings.js.map +1 -0
  163. package/dist/expressions/funcs/trigonometry.d.ts +2 -0
  164. package/dist/expressions/funcs/trigonometry.d.ts.map +1 -0
  165. package/dist/expressions/funcs/trigonometry.js +92 -0
  166. package/dist/expressions/funcs/trigonometry.js.map +1 -0
  167. package/dist/expressions/json.d.ts +18 -0
  168. package/dist/expressions/json.d.ts.map +1 -0
  169. package/dist/expressions/json.js +271 -0
  170. package/dist/expressions/json.js.map +1 -0
  171. package/dist/expressions/parserCache.d.ts +4 -0
  172. package/dist/expressions/parserCache.d.ts.map +1 -0
  173. package/dist/expressions/parserCache.js +23 -0
  174. package/dist/expressions/parserCache.js.map +1 -0
  175. package/dist/expressions/simpleUnescapeString.d.ts +2 -0
  176. package/dist/expressions/simpleUnescapeString.d.ts.map +1 -0
  177. package/dist/expressions/simpleUnescapeString.js +61 -0
  178. package/dist/expressions/simpleUnescapeString.js.map +1 -0
  179. package/dist/expressions/utils.d.ts +29 -0
  180. package/dist/expressions/utils.d.ts.map +1 -0
  181. package/dist/expressions/utils.js +236 -0
  182. package/dist/expressions/utils.js.map +1 -0
  183. package/dist/expressions/variable.d.ts +82 -0
  184. package/dist/expressions/variable.d.ts.map +1 -0
  185. package/dist/expressions/variable.js +337 -0
  186. package/dist/expressions/variable.js.map +1 -0
  187. package/dist/expressions/walk.d.ts +7 -0
  188. package/dist/expressions/walk.d.ts.map +1 -0
  189. package/dist/expressions/walk.js +39 -0
  190. package/dist/expressions/walk.js.map +1 -0
  191. package/dist/hooks/index.d.ts +8 -0
  192. package/dist/hooks/index.d.ts.map +1 -0
  193. package/dist/hooks/index.js +11 -0
  194. package/dist/hooks/index.js.map +1 -0
  195. package/dist/hooks/useAction.d.ts +102 -0
  196. package/dist/hooks/useAction.d.ts.map +1 -0
  197. package/dist/hooks/useAction.js +116 -0
  198. package/dist/hooks/useAction.js.map +1 -0
  199. package/dist/hooks/useDerivedFromVars.d.ts +72 -0
  200. package/dist/hooks/useDerivedFromVars.d.ts.map +1 -0
  201. package/dist/hooks/useDerivedFromVars.js +100 -0
  202. package/dist/hooks/useDerivedFromVars.js.map +1 -0
  203. package/dist/hooks/useVariable.d.ts +86 -0
  204. package/dist/hooks/useVariable.d.ts.map +1 -0
  205. package/dist/hooks/useVariable.js +130 -0
  206. package/dist/hooks/useVariable.js.map +1 -0
  207. package/dist/index.d.ts +30 -0
  208. package/dist/index.d.ts.map +1 -0
  209. package/dist/index.js +28 -0
  210. package/dist/index.js.map +1 -0
  211. package/dist/stores/createObservable.d.ts +38 -0
  212. package/dist/stores/createObservable.d.ts.map +1 -0
  213. package/dist/stores/createObservable.js +49 -0
  214. package/dist/stores/createObservable.js.map +1 -0
  215. package/dist/utils/applyTemplate.d.ts +8 -0
  216. package/dist/utils/applyTemplate.d.ts.map +1 -0
  217. package/dist/utils/applyTemplate.js +94 -0
  218. package/dist/utils/applyTemplate.js.map +1 -0
  219. package/dist/utils/correctColor.d.ts +18 -0
  220. package/dist/utils/correctColor.d.ts.map +1 -0
  221. package/dist/utils/correctColor.js +79 -0
  222. package/dist/utils/correctColor.js.map +1 -0
  223. package/dist/utils/escapeRegExp.d.ts +2 -0
  224. package/dist/utils/escapeRegExp.d.ts.map +1 -0
  225. package/dist/utils/escapeRegExp.js +4 -0
  226. package/dist/utils/escapeRegExp.js.map +1 -0
  227. package/dist/utils/formatDate.d.ts +6 -0
  228. package/dist/utils/formatDate.d.ts.map +1 -0
  229. package/dist/utils/formatDate.js +325 -0
  230. package/dist/utils/formatDate.js.map +1 -0
  231. package/dist/utils/padLeft.d.ts +2 -0
  232. package/dist/utils/padLeft.d.ts.map +1 -0
  233. package/dist/utils/padLeft.js +7 -0
  234. package/dist/utils/padLeft.js.map +1 -0
  235. package/dist/utils/uniq.d.ts +2 -0
  236. package/dist/utils/uniq.d.ts.map +1 -0
  237. package/dist/utils/uniq.js +4 -0
  238. package/dist/utils/uniq.js.map +1 -0
  239. package/dist/utils/wrapError.d.ts +10 -0
  240. package/dist/utils/wrapError.d.ts.map +1 -0
  241. package/dist/utils/wrapError.js +9 -0
  242. package/dist/utils/wrapError.js.map +1 -0
  243. package/package.json +58 -0
  244. package/src/DivKit.tsx +542 -0
  245. package/src/actions/array.ts +170 -0
  246. package/src/actions/copyToClipboard.ts +82 -0
  247. package/src/actions/dict.ts +71 -0
  248. package/src/actions/index.ts +11 -0
  249. package/src/actions/updateStructure.ts +134 -0
  250. package/src/components/DivComponent.tsx +75 -0
  251. package/src/components/README.md +230 -0
  252. package/src/components/container/DivContainer.tsx +222 -0
  253. package/src/components/container/index.ts +2 -0
  254. package/src/components/image/DivImage.tsx +172 -0
  255. package/src/components/image/index.ts +2 -0
  256. package/src/components/index.ts +20 -0
  257. package/src/components/state/DivState.tsx +146 -0
  258. package/src/components/state/index.ts +2 -0
  259. package/src/components/text/DivText.tsx +186 -0
  260. package/src/components/text/index.ts +2 -0
  261. package/src/components/utilities/Outer.tsx +239 -0
  262. package/src/components/utilities/README.md +175 -0
  263. package/src/components/utilities/Unknown.tsx +60 -0
  264. package/src/components/utilities/index.ts +4 -0
  265. package/src/context/ActionContext.tsx +37 -0
  266. package/src/context/DivKitContext.tsx +54 -0
  267. package/src/context/EnabledContext.tsx +50 -0
  268. package/src/context/StateContext.tsx +75 -0
  269. package/src/context/index.ts +33 -0
  270. package/src/expressions/ast.d.ts +101 -0
  271. package/src/expressions/bigint.ts +38 -0
  272. package/src/expressions/const.ts +16 -0
  273. package/src/expressions/eval.ts +669 -0
  274. package/src/expressions/expressions.peggy +235 -0
  275. package/src/expressions/expressions.ts +2854 -0
  276. package/src/expressions/funcs/array.ts +412 -0
  277. package/src/expressions/funcs/colors.ts +100 -0
  278. package/src/expressions/funcs/customFuncs.ts +139 -0
  279. package/src/expressions/funcs/datetime.ts +232 -0
  280. package/src/expressions/funcs/dict.ts +207 -0
  281. package/src/expressions/funcs/funcs.ts +323 -0
  282. package/src/expressions/funcs/index.ts +23 -0
  283. package/src/expressions/funcs/interval.ts +76 -0
  284. package/src/expressions/funcs/math.ts +395 -0
  285. package/src/expressions/funcs/std.ts +392 -0
  286. package/src/expressions/funcs/stored.ts +62 -0
  287. package/src/expressions/funcs/strings.ts +200 -0
  288. package/src/expressions/funcs/trigonometry.ts +108 -0
  289. package/src/expressions/json.ts +367 -0
  290. package/src/expressions/parserCache.ts +32 -0
  291. package/src/expressions/simpleUnescapeString.ts +57 -0
  292. package/src/expressions/utils.ts +271 -0
  293. package/src/expressions/variable.ts +429 -0
  294. package/src/expressions/walk.ts +43 -0
  295. package/src/hooks/README.md +265 -0
  296. package/src/hooks/index.ts +28 -0
  297. package/src/hooks/useAction.ts +152 -0
  298. package/src/hooks/useDerivedFromVars.ts +187 -0
  299. package/src/hooks/useVariable.ts +157 -0
  300. package/src/index.ts +97 -0
  301. package/src/stores/createObservable.ts +64 -0
  302. package/src/types/alignment.d.ts +13 -0
  303. package/src/types/background.d.ts +71 -0
  304. package/src/types/base.d.ts +224 -0
  305. package/src/types/border.d.ts +46 -0
  306. package/src/types/componentContext.d.ts +98 -0
  307. package/src/types/container.d.ts +40 -0
  308. package/src/types/edgeInserts.d.ts +9 -0
  309. package/src/types/general.d.ts +3 -0
  310. package/src/types/image.d.ts +33 -0
  311. package/src/types/imageScale.d.ts +1 -0
  312. package/src/types/layoutParams.d.ts +27 -0
  313. package/src/types/sizes.d.ts +37 -0
  314. package/src/types/state.d.ts +19 -0
  315. package/src/types/text.d.ts +126 -0
  316. package/src/utils/applyTemplate.ts +145 -0
  317. package/src/utils/correctColor.ts +102 -0
  318. package/src/utils/escapeRegExp.ts +3 -0
  319. package/src/utils/formatDate.ts +385 -0
  320. package/src/utils/padLeft.ts +6 -0
  321. package/src/utils/uniq.ts +3 -0
  322. package/src/utils/wrapError.ts +21 -0
@@ -0,0 +1,323 @@
1
+ import { INTEGER, NUMBER } from '../const';
2
+ import type { EvalTypes, EvalValue } from '../eval';
3
+ import type { EvalContext } from '../eval';
4
+ import { integerToNumber } from '../utils';
5
+
6
+ export type FuncArg = EvalTypes | {
7
+ type: EvalTypes;
8
+ isVararg?: boolean;
9
+ }
10
+
11
+ export interface Func {
12
+ name?: string;
13
+ args: FuncArg[];
14
+ cb(ctx: EvalContext, ...args: EvalValue[]): EvalValue;
15
+ }
16
+
17
+ export const funcs: Map<string, Func[]> = new Map();
18
+ export const funcByArgs: Map<string, Func> = new Map();
19
+ export const methods: Map<string, Func[]> = new Map();
20
+ export const methodByArgs: Map<string, Func> = new Map();
21
+
22
+ export type FuncMatchError = {
23
+ type: 'mismatch';
24
+ expected: EvalTypes;
25
+ found: EvalTypes;
26
+ def: Func;
27
+ hasOverloads: boolean;
28
+ } | {
29
+ type: 'few';
30
+ expected: number;
31
+ found: number;
32
+ def: Func;
33
+ hasOverloads: boolean;
34
+ } | {
35
+ type: 'many';
36
+ expected: number;
37
+ found: number;
38
+ def: Func;
39
+ hasOverloads: boolean;
40
+ } | {
41
+ type: 'missing';
42
+ };
43
+
44
+ export interface FuncMatchFound {
45
+ func: Func;
46
+ conversions: number;
47
+ }
48
+
49
+ export type FuncMatch = FuncMatchFound | FuncMatchError;
50
+
51
+ // no args
52
+ export function registerFunc(name: string, args: [], cb: (ctx?: EvalContext) => EvalValue): void;
53
+ // one specific arg
54
+ export function registerFunc<
55
+ A0 extends EvalTypes
56
+ >(
57
+ name: string,
58
+ args: [A0],
59
+ cb: (
60
+ ctx: EvalContext,
61
+ arg0: Extract<EvalValue, { type: A0 }>
62
+ ) => EvalValue
63
+ ): void;
64
+ // two specific args
65
+ export function registerFunc<
66
+ A0 extends EvalTypes,
67
+ A1 extends EvalTypes
68
+ >(
69
+ name: string,
70
+ args: [A0, A1],
71
+ cb: (
72
+ ctx: EvalContext,
73
+ arg0: Extract<EvalValue, { type: A0 }>,
74
+ arg1: Extract<EvalValue, { type: A1 }>
75
+ ) => EvalValue
76
+ ): void;
77
+ // three specific args
78
+ export function registerFunc<
79
+ A0 extends EvalTypes,
80
+ A1 extends EvalTypes,
81
+ A2 extends EvalTypes
82
+ >(
83
+ name: string,
84
+ args: [A0, A1, A2],
85
+ cb: (
86
+ ctx: EvalContext,
87
+ arg0: Extract<EvalValue, { type: A0 }>,
88
+ arg1: Extract<EvalValue, { type: A1 }>,
89
+ arg2: Extract<EvalValue, { type: A2 }>
90
+ ) => EvalValue
91
+ ): void;
92
+ // any args
93
+ export function registerFunc(
94
+ name: string,
95
+ args: FuncArg[],
96
+ cb: (ctx: EvalContext, ...args: any[]) => EvalValue
97
+ ): void;
98
+
99
+ export function registerFunc(
100
+ name: string,
101
+ args: FuncArg[],
102
+ cb: (ctx: EvalContext, ...args: EvalValue[]) => EvalValue
103
+ ): void {
104
+ const desc: Func = {
105
+ args,
106
+ cb
107
+ };
108
+
109
+ const arr = funcs.get(name) || [];
110
+
111
+ if (!funcs.has(name)) {
112
+ funcs.set(name, arr);
113
+ }
114
+ arr.push(desc);
115
+
116
+ const funcKey = name + ':' + args.map(it => {
117
+ if (typeof it === 'object') {
118
+ return it.type;
119
+ }
120
+ return it;
121
+ }).join('#');
122
+
123
+ funcByArgs.set(funcKey, desc);
124
+ }
125
+
126
+ // no args
127
+ export function registerMethod(name: string, args: [], cb: (ctx?: EvalContext) => EvalValue): void;
128
+ // one specific arg
129
+ export function registerMethod<
130
+ A0 extends EvalTypes
131
+ >(
132
+ name: string,
133
+ args: [A0],
134
+ cb: (
135
+ ctx: EvalContext,
136
+ arg0: Extract<EvalValue, { type: A0 }>
137
+ ) => EvalValue
138
+ ): void;
139
+ // two specific args
140
+ export function registerMethod<
141
+ A0 extends EvalTypes,
142
+ A1 extends EvalTypes
143
+ >(
144
+ name: string,
145
+ args: [A0, A1],
146
+ cb: (
147
+ ctx: EvalContext,
148
+ arg0: Extract<EvalValue, { type: A0 }>,
149
+ arg1: Extract<EvalValue, { type: A1 }>
150
+ ) => EvalValue
151
+ ): void;
152
+ // three specific args
153
+ export function registerMethod<
154
+ A0 extends EvalTypes,
155
+ A1 extends EvalTypes,
156
+ A2 extends EvalTypes
157
+ >(
158
+ name: string,
159
+ args: [A0, A1, A2],
160
+ cb: (
161
+ ctx: EvalContext,
162
+ arg0: Extract<EvalValue, { type: A0 }>,
163
+ arg1: Extract<EvalValue, { type: A1 }>,
164
+ arg2: Extract<EvalValue, { type: A2 }>
165
+ ) => EvalValue
166
+ ): void;
167
+ // any args
168
+ export function registerMethod(
169
+ name: string,
170
+ args: FuncArg[],
171
+ cb: (ctx: EvalContext, ...args: any[]) => EvalValue
172
+ ): void;
173
+
174
+ export function registerMethod(
175
+ name: string,
176
+ args: FuncArg[],
177
+ cb: (ctx: EvalContext, ...args: EvalValue[]) => EvalValue
178
+ ): void {
179
+ const desc: Func = {
180
+ args,
181
+ cb
182
+ };
183
+
184
+ const arr = methods.get(name) || [];
185
+
186
+ if (!methods.has(name)) {
187
+ methods.set(name, arr);
188
+ }
189
+ arr.push(desc);
190
+
191
+ const funcKey = name + ':' + args.map(it => {
192
+ if (typeof it === 'object') {
193
+ return it.type;
194
+ }
195
+ return it;
196
+ }).join('#');
197
+
198
+ methodByArgs.set(funcKey, desc);
199
+ }
200
+
201
+ function matchFuncArgs(func: Func, args: EvalValue[], hasOverloads: boolean): {
202
+ type: 'match';
203
+ conversions: number;
204
+ } | FuncMatchError {
205
+ const minArgs = func.args.length;
206
+ let maxArgs = func.args.length;
207
+ let conversions = 0;
208
+ const lastArg = func.args[func.args.length - 1];
209
+
210
+ if (typeof lastArg === 'object' && lastArg.isVararg) {
211
+ maxArgs = Infinity;
212
+ }
213
+
214
+ if (args.length < minArgs) {
215
+ return {
216
+ type: 'few',
217
+ expected: minArgs,
218
+ found: args.length,
219
+ def: func,
220
+ hasOverloads
221
+ };
222
+ } else if (args.length > maxArgs) {
223
+ return {
224
+ type: 'many',
225
+ expected: maxArgs,
226
+ found: args.length,
227
+ def: func,
228
+ hasOverloads
229
+ };
230
+ }
231
+
232
+ for (let i = 0; i < args.length; ++i) {
233
+ let funcArg = i >= func.args.length ? func.args[func.args.length - 1] : func.args[i];
234
+ if (typeof funcArg !== 'object') {
235
+ funcArg = {
236
+ type: funcArg
237
+ };
238
+ }
239
+
240
+ if (funcArg.type === NUMBER && args[i].type === INTEGER) {
241
+ ++conversions;
242
+ continue;
243
+ }
244
+
245
+ if (funcArg.type !== args[i].type) {
246
+ return {
247
+ type: 'mismatch',
248
+ expected: funcArg.type,
249
+ found: args[i].type,
250
+ def: func,
251
+ hasOverloads
252
+ };
253
+ }
254
+ }
255
+
256
+ return {
257
+ type: 'match',
258
+ conversions
259
+ };
260
+ }
261
+
262
+ export function findBestMatchedFuncList(list: Func[] | undefined, args: EvalValue[]): FuncMatch {
263
+ if (!list) {
264
+ return {
265
+ type: 'missing'
266
+ };
267
+ }
268
+
269
+ let firstError: FuncMatchError | null = null;
270
+ let bestFunc: {
271
+ func: Func;
272
+ conversions: number;
273
+ } | null = null;
274
+ for (let i = 0; i < list.length; ++i) {
275
+ const match = matchFuncArgs(list[i], args, list.length > 1);
276
+ if (match.type === 'match') {
277
+ if (!bestFunc || bestFunc.conversions > match.conversions) {
278
+ bestFunc = {
279
+ func: list[i],
280
+ conversions: match.conversions
281
+ };
282
+ }
283
+ continue;
284
+ }
285
+ if (!firstError) {
286
+ firstError = match;
287
+ }
288
+ }
289
+
290
+ if (!bestFunc) {
291
+ if (firstError) {
292
+ return firstError;
293
+ }
294
+ throw new Error('Missing function');
295
+ }
296
+
297
+ return bestFunc;
298
+ }
299
+
300
+ export function findBestMatchedFunc(map: Map<string, Func[]>, funcName: string, args: EvalValue[]): FuncMatch {
301
+ return findBestMatchedFuncList(map.get(funcName), args);
302
+ }
303
+
304
+ export function convertArgs(func: Func, args: EvalValue[]): EvalValue[] {
305
+ return args.map((arg, i) => {
306
+ let funcArg = i >= func.args.length ? func.args[func.args.length - 1] : func.args[i];
307
+ if (typeof funcArg !== 'object') {
308
+ funcArg = {
309
+ type: funcArg
310
+ };
311
+ }
312
+
313
+ if (funcArg.type === NUMBER && arg.type === INTEGER) {
314
+ return integerToNumber(arg);
315
+ }
316
+
317
+ return arg;
318
+ });
319
+ }
320
+
321
+ export function funcToKey(funcName: string, func: Func): string {
322
+ return funcName + ':' + func.args.map(arg => typeof arg === 'string' ? arg : arg.type).join('#');
323
+ }
@@ -0,0 +1,23 @@
1
+ import { registerStd } from './std';
2
+ import { registerDatetime } from './datetime';
3
+ import { registerStrings } from './strings';
4
+ import { registerMath } from './math';
5
+ import { registerColors } from './colors';
6
+ import { registerInterval } from './interval';
7
+ import { registerDict } from './dict';
8
+ import { registerArray } from './array';
9
+ import { registerStored } from './stored';
10
+ import { registerTrigonometry } from './trigonometry';
11
+
12
+ export function register(): void {
13
+ registerStd();
14
+ registerDatetime();
15
+ registerInterval();
16
+ registerStrings();
17
+ registerMath();
18
+ registerColors();
19
+ registerDict();
20
+ registerArray();
21
+ registerStored();
22
+ registerTrigonometry();
23
+ }
@@ -0,0 +1,76 @@
1
+ import type { EvalContext, EvalValue, IntegerValue } from '../eval';
2
+ import { registerFunc } from './funcs';
3
+ import { INTEGER } from '../const';
4
+ import { toBigInt } from '../bigint';
5
+ import { checkIntegerOverflow } from '../utils';
6
+
7
+ function getDuration(ctx: EvalContext, milliseconds: IntegerValue, delimiter: number, whole?: number): EvalValue {
8
+ if (milliseconds.value < 0) {
9
+ throw new Error('Expecting non-negative number of milliseconds.');
10
+ }
11
+
12
+ let val = toBigInt(milliseconds.value) / toBigInt(delimiter);
13
+
14
+ checkIntegerOverflow(ctx, val);
15
+
16
+ if (whole) {
17
+ val = toBigInt(val) % toBigInt(whole);
18
+ }
19
+
20
+ return {
21
+ type: INTEGER,
22
+ value: val
23
+ };
24
+ }
25
+
26
+ const MS_IN_SECOND = 1000;
27
+ const SECONDS_IN_MINUTE = 60;
28
+ const MS_IN_MINUTE = 1000 * 60;
29
+ const MINUTES_IN_HOUR = 60;
30
+ const MS_IN_HOUR = 1000 * 60 * 60;
31
+ const HOURS_IN_DAY = 24;
32
+ const MS_IN_DAY = 1000 * 60 * 60 * 24;
33
+ const MS_IN_WEEK = 1000 * 60 * 60 * 24 * 7;
34
+
35
+ function getIntervalSeconds(ctx: EvalContext, milliseconds: IntegerValue): EvalValue {
36
+ return getDuration(ctx, milliseconds, MS_IN_SECOND, SECONDS_IN_MINUTE);
37
+ }
38
+
39
+ function getIntervalTotalSeconds(ctx: EvalContext, milliseconds: IntegerValue): EvalValue {
40
+ return getDuration(ctx, milliseconds, MS_IN_SECOND);
41
+ }
42
+
43
+ function getIntervalMinutes(ctx: EvalContext, milliseconds: IntegerValue): EvalValue {
44
+ return getDuration(ctx, milliseconds, MS_IN_MINUTE, MINUTES_IN_HOUR);
45
+ }
46
+
47
+ function getIntervalTotalMinutes(ctx: EvalContext, milliseconds: IntegerValue): EvalValue {
48
+ return getDuration(ctx, milliseconds, MS_IN_MINUTE);
49
+ }
50
+
51
+ function getIntervalHours(ctx: EvalContext, milliseconds: IntegerValue): EvalValue {
52
+ return getDuration(ctx, milliseconds, MS_IN_HOUR, HOURS_IN_DAY);
53
+ }
54
+
55
+ function getIntervalTotalHours(ctx: EvalContext, milliseconds: IntegerValue): EvalValue {
56
+ return getDuration(ctx, milliseconds, MS_IN_HOUR);
57
+ }
58
+
59
+ function getIntervalTotalDays(ctx: EvalContext, milliseconds: IntegerValue): EvalValue {
60
+ return getDuration(ctx, milliseconds, MS_IN_DAY);
61
+ }
62
+
63
+ function getIntervalTotalWeeks(ctx: EvalContext, milliseconds: IntegerValue): EvalValue {
64
+ return getDuration(ctx, milliseconds, MS_IN_WEEK);
65
+ }
66
+
67
+ export function registerInterval(): void {
68
+ registerFunc('getIntervalSeconds', [INTEGER], getIntervalSeconds);
69
+ registerFunc('getIntervalTotalSeconds', [INTEGER], getIntervalTotalSeconds);
70
+ registerFunc('getIntervalMinutes', [INTEGER], getIntervalMinutes);
71
+ registerFunc('getIntervalTotalMinutes', [INTEGER], getIntervalTotalMinutes);
72
+ registerFunc('getIntervalHours', [INTEGER], getIntervalHours);
73
+ registerFunc('getIntervalTotalHours', [INTEGER], getIntervalTotalHours);
74
+ registerFunc('getIntervalTotalDays', [INTEGER], getIntervalTotalDays);
75
+ registerFunc('getIntervalTotalWeeks', [INTEGER], getIntervalTotalWeeks);
76
+ }