vsn 0.1.26 → 0.1.29

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 (303) hide show
  1. package/demo/vsn.js +1 -1
  2. package/dist/AST/ArithmeticAssignmentNode.d.ts +23 -0
  3. package/dist/AST/ArithmeticAssignmentNode.js +313 -0
  4. package/dist/AST/ArithmeticAssignmentNode.js.map +1 -0
  5. package/dist/AST/ArithmeticNode.d.ts +15 -0
  6. package/dist/AST/ArithmeticNode.js +114 -0
  7. package/dist/AST/ArithmeticNode.js.map +1 -0
  8. package/dist/AST/ArrayNode.d.ts +14 -0
  9. package/dist/AST/ArrayNode.js +114 -0
  10. package/dist/AST/ArrayNode.js.map +1 -0
  11. package/dist/AST/BlockNode.d.ts +11 -0
  12. package/dist/AST/BlockNode.js +98 -0
  13. package/dist/AST/BlockNode.js.map +1 -0
  14. package/dist/AST/BooleanLiteralNode.d.ts +5 -0
  15. package/dist/AST/BooleanLiteralNode.js +31 -0
  16. package/dist/AST/BooleanLiteralNode.js.map +1 -0
  17. package/dist/AST/ComparisonNode.d.ts +15 -0
  18. package/dist/AST/ComparisonNode.js +120 -0
  19. package/dist/AST/ComparisonNode.js.map +1 -0
  20. package/dist/AST/ConditionalNode.d.ts +13 -0
  21. package/dist/AST/ConditionalNode.js +95 -0
  22. package/dist/AST/ConditionalNode.js.map +1 -0
  23. package/dist/AST/ElementAttributeNode.d.ts +18 -0
  24. package/dist/AST/ElementAttributeNode.js +159 -0
  25. package/dist/AST/ElementAttributeNode.js.map +1 -0
  26. package/dist/AST/ElementQueryNode.d.ts +12 -0
  27. package/dist/AST/ElementQueryNode.js +111 -0
  28. package/dist/AST/ElementQueryNode.js.map +1 -0
  29. package/dist/AST/ElementStyleNode.d.ts +18 -0
  30. package/dist/AST/ElementStyleNode.js +159 -0
  31. package/dist/AST/ElementStyleNode.js.map +1 -0
  32. package/dist/AST/ForStatementNode.d.ts +17 -0
  33. package/dist/AST/ForStatementNode.js +121 -0
  34. package/dist/AST/ForStatementNode.js.map +1 -0
  35. package/dist/AST/FunctionArgumentNode.d.ts +11 -0
  36. package/dist/AST/FunctionArgumentNode.js +100 -0
  37. package/dist/AST/FunctionArgumentNode.js.map +1 -0
  38. package/dist/AST/FunctionCallNode.d.ts +13 -0
  39. package/dist/AST/FunctionCallNode.js +102 -0
  40. package/dist/AST/FunctionCallNode.js.map +1 -0
  41. package/dist/AST/IfStatementNode.d.ts +14 -0
  42. package/dist/AST/IfStatementNode.js +128 -0
  43. package/dist/AST/IfStatementNode.js.map +1 -0
  44. package/dist/AST/InNode.d.ts +15 -0
  45. package/dist/AST/InNode.js +107 -0
  46. package/dist/AST/InNode.js.map +1 -0
  47. package/dist/AST/IndexNode.d.ts +16 -0
  48. package/dist/AST/IndexNode.js +126 -0
  49. package/dist/AST/IndexNode.js.map +1 -0
  50. package/dist/AST/LiteralNode.d.ts +10 -0
  51. package/dist/AST/LiteralNode.js +74 -0
  52. package/dist/AST/LiteralNode.js.map +1 -0
  53. package/dist/AST/Node.d.ts +19 -0
  54. package/dist/AST/Node.js +117 -0
  55. package/dist/AST/Node.js.map +1 -0
  56. package/dist/AST/NotNode.d.ts +12 -0
  57. package/dist/AST/NotNode.js +103 -0
  58. package/dist/AST/NotNode.js.map +1 -0
  59. package/dist/AST/NumberLiteralNode.d.ts +5 -0
  60. package/dist/AST/NumberLiteralNode.js +36 -0
  61. package/dist/AST/NumberLiteralNode.js.map +1 -0
  62. package/dist/AST/ObjectNode.d.ts +14 -0
  63. package/dist/AST/ObjectNode.js +131 -0
  64. package/dist/AST/ObjectNode.js.map +1 -0
  65. package/dist/AST/RootScopeMemberNode.d.ts +11 -0
  66. package/dist/AST/RootScopeMemberNode.js +87 -0
  67. package/dist/AST/RootScopeMemberNode.js.map +1 -0
  68. package/dist/AST/ScopeMemberNode.d.ts +12 -0
  69. package/dist/AST/ScopeMemberNode.js +128 -0
  70. package/dist/AST/ScopeMemberNode.js.map +1 -0
  71. package/dist/AST/UnitLiteralNode.d.ts +15 -0
  72. package/dist/AST/UnitLiteralNode.js +72 -0
  73. package/dist/AST/UnitLiteralNode.js.map +1 -0
  74. package/dist/AST.d.ts +7 -60
  75. package/dist/AST.js +778 -0
  76. package/dist/AST.js.map +1 -0
  77. package/dist/Attribute.d.ts +1 -1
  78. package/dist/Attribute.js +187 -0
  79. package/dist/Attribute.js.map +1 -0
  80. package/dist/Bencmark.js +179 -0
  81. package/dist/Bencmark.js.map +1 -0
  82. package/dist/Configuration.d.ts +1 -1
  83. package/dist/Configuration.js +64 -0
  84. package/dist/Configuration.js.map +1 -0
  85. package/dist/Controller.d.ts +4 -2
  86. package/dist/Controller.js +62 -0
  87. package/dist/Controller.js.map +1 -0
  88. package/dist/DOM/DOMObject.d.ts +1 -1
  89. package/dist/DOM/DOMObject.js +47 -0
  90. package/dist/DOM/DOMObject.js.map +1 -0
  91. package/dist/DOM/WrappedDocument.js +34 -0
  92. package/dist/DOM/WrappedDocument.js.map +1 -0
  93. package/dist/DOM/WrappedWindow.js +45 -0
  94. package/dist/DOM/WrappedWindow.js.map +1 -0
  95. package/dist/DOM.d.ts +1 -1
  96. package/dist/DOM.js +547 -0
  97. package/dist/DOM.js.map +1 -0
  98. package/dist/EventDispatcher.d.ts +29 -0
  99. package/dist/EventDispatcher.js +132 -0
  100. package/dist/EventDispatcher.js.map +1 -0
  101. package/dist/Formats.js +44 -0
  102. package/dist/Formats.js.map +1 -0
  103. package/dist/MessageList.d.ts +15 -0
  104. package/dist/MessageList.js +96 -0
  105. package/dist/MessageList.js.map +1 -0
  106. package/dist/Model/Field.d.ts +8 -0
  107. package/dist/Model/Field.js +38 -0
  108. package/dist/Model/Field.js.map +1 -0
  109. package/dist/Model.d.ts +12 -0
  110. package/dist/Model.js +61 -0
  111. package/dist/Model.js.map +1 -0
  112. package/dist/Query.js +66 -0
  113. package/dist/Query.js.map +1 -0
  114. package/dist/Registry.d.ts +5 -2
  115. package/dist/Registry.js +139 -0
  116. package/dist/Registry.js.map +1 -0
  117. package/dist/Scope/DynamicScopeData.d.ts +6 -0
  118. package/dist/Scope/DynamicScopeData.js +54 -0
  119. package/dist/Scope/DynamicScopeData.js.map +1 -0
  120. package/dist/Scope/QueryReference.d.ts +10 -0
  121. package/dist/Scope/QueryReference.js +103 -0
  122. package/dist/Scope/QueryReference.js.map +1 -0
  123. package/dist/Scope/ScopeData.d.ts +4 -0
  124. package/dist/Scope/ScopeData.js +40 -0
  125. package/dist/Scope/ScopeData.js.map +1 -0
  126. package/dist/Scope/ScopeDataAbstract.d.ts +22 -0
  127. package/dist/Scope/ScopeDataAbstract.js +137 -0
  128. package/dist/Scope/ScopeDataAbstract.js.map +1 -0
  129. package/dist/Scope/ScopeReference.d.ts +10 -0
  130. package/dist/Scope/ScopeReference.js +73 -0
  131. package/dist/Scope/ScopeReference.js.map +1 -0
  132. package/dist/Scope/ScopedVariableType.d.ts +6 -0
  133. package/dist/Scope/ScopedVariableType.js +14 -0
  134. package/dist/Scope/ScopedVariableType.js.map +1 -0
  135. package/dist/Scope/WrappedArray.d.ts +16 -0
  136. package/dist/Scope/WrappedArray.js +121 -0
  137. package/dist/Scope/WrappedArray.js.map +1 -0
  138. package/dist/Scope/properties/Property.d.ts +18 -0
  139. package/dist/Scope/properties/Property.js +93 -0
  140. package/dist/Scope/properties/Property.js.map +1 -0
  141. package/dist/Scope.d.ts +4 -48
  142. package/dist/Scope.js +227 -0
  143. package/dist/Scope.js.map +1 -0
  144. package/dist/SimplePromise.d.ts +42 -0
  145. package/dist/SimplePromise.js +217 -0
  146. package/dist/SimplePromise.js.map +1 -0
  147. package/dist/Tag/List.js +85 -0
  148. package/dist/Tag/List.js.map +1 -0
  149. package/dist/Tag.js +770 -0
  150. package/dist/Tag.js.map +1 -0
  151. package/dist/Types.d.ts +1 -0
  152. package/dist/Types.js +54 -0
  153. package/dist/Types.js.map +1 -0
  154. package/dist/Validators.d.ts +7 -0
  155. package/dist/Validators.js +54 -0
  156. package/dist/Validators.js.map +1 -0
  157. package/dist/attributes/AddClassIf.js +93 -0
  158. package/dist/attributes/AddClassIf.js.map +1 -0
  159. package/dist/attributes/Bind.js +272 -0
  160. package/dist/attributes/Bind.js.map +1 -0
  161. package/dist/attributes/ClassConstructor.d.ts +1 -0
  162. package/dist/attributes/ClassConstructor.js +104 -0
  163. package/dist/attributes/ClassConstructor.js.map +1 -0
  164. package/dist/attributes/ClickRemoveClass.js +114 -0
  165. package/dist/attributes/ClickRemoveClass.js.map +1 -0
  166. package/dist/attributes/ClickToggleClass.js +114 -0
  167. package/dist/attributes/ClickToggleClass.js.map +1 -0
  168. package/dist/attributes/ControllerAttribute.js +28 -0
  169. package/dist/attributes/ControllerAttribute.js.map +1 -0
  170. package/dist/attributes/DisableIf.js +94 -0
  171. package/dist/attributes/DisableIf.js.map +1 -0
  172. package/dist/attributes/Exec.js +108 -0
  173. package/dist/attributes/Exec.js.map +1 -0
  174. package/dist/attributes/Format.js +99 -0
  175. package/dist/attributes/Format.js.map +1 -0
  176. package/dist/attributes/If.js +159 -0
  177. package/dist/attributes/If.js.map +1 -0
  178. package/dist/attributes/JSONAttribute.js +118 -0
  179. package/dist/attributes/JSONAttribute.js.map +1 -0
  180. package/dist/attributes/KeyAbstract.js +117 -0
  181. package/dist/attributes/KeyAbstract.js.map +1 -0
  182. package/dist/attributes/KeyDown.js +88 -0
  183. package/dist/attributes/KeyDown.js.map +1 -0
  184. package/dist/attributes/KeyUp.js +88 -0
  185. package/dist/attributes/KeyUp.js.map +1 -0
  186. package/dist/attributes/List.js +282 -0
  187. package/dist/attributes/List.js.map +1 -0
  188. package/dist/attributes/ListItem.js +138 -0
  189. package/dist/attributes/ListItem.js.map +1 -0
  190. package/dist/attributes/ListItemModel.js +39 -0
  191. package/dist/attributes/ListItemModel.js.map +1 -0
  192. package/dist/attributes/ModelAttribute.js +29 -0
  193. package/dist/attributes/ModelAttribute.js.map +1 -0
  194. package/dist/attributes/Name.js +88 -0
  195. package/dist/attributes/Name.js.map +1 -0
  196. package/dist/attributes/On.js +135 -0
  197. package/dist/attributes/On.js.map +1 -0
  198. package/dist/attributes/Radio.js +174 -0
  199. package/dist/attributes/Radio.js.map +1 -0
  200. package/dist/attributes/Referenced.js +38 -0
  201. package/dist/attributes/Referenced.js.map +1 -0
  202. package/dist/attributes/RootAttribute.js +91 -0
  203. package/dist/attributes/RootAttribute.js.map +1 -0
  204. package/dist/attributes/ScopeAttribute.js +40 -0
  205. package/dist/attributes/ScopeAttribute.js.map +1 -0
  206. package/dist/attributes/ScopeChange.js +130 -0
  207. package/dist/attributes/ScopeChange.js.map +1 -0
  208. package/dist/attributes/SetAttribute.js +133 -0
  209. package/dist/attributes/SetAttribute.js.map +1 -0
  210. package/dist/attributes/StandardAttribute.js +186 -0
  211. package/dist/attributes/StandardAttribute.js.map +1 -0
  212. package/dist/attributes/StyleAttribute.js +183 -0
  213. package/dist/attributes/StyleAttribute.js.map +1 -0
  214. package/dist/attributes/Template.js +39 -0
  215. package/dist/attributes/Template.js.map +1 -0
  216. package/dist/attributes/TypeAttribute.js +104 -0
  217. package/dist/attributes/TypeAttribute.js.map +1 -0
  218. package/dist/attributes/_imports.js +60 -0
  219. package/dist/attributes/_imports.js.map +1 -0
  220. package/dist/helpers/DOMHelper.js +81 -0
  221. package/dist/helpers/DOMHelper.js.map +1 -0
  222. package/dist/helpers/ElementHelper.js +25 -0
  223. package/dist/helpers/ElementHelper.js.map +1 -0
  224. package/dist/helpers/VisionHelper.js +71 -0
  225. package/dist/helpers/VisionHelper.js.map +1 -0
  226. package/dist/helpers/decorators.js +38 -0
  227. package/dist/helpers/decorators.js.map +1 -0
  228. package/dist/vsn.d.ts +11 -2
  229. package/dist/vsn.js +181 -0
  230. package/dist/vsn.js.map +1 -0
  231. package/package.json +2 -6
  232. package/src/AST/ArithmeticAssignmentNode.ts +236 -0
  233. package/src/AST/ArithmeticNode.ts +52 -0
  234. package/src/AST/ArrayNode.ts +39 -0
  235. package/src/AST/BlockNode.ts +25 -0
  236. package/src/AST/BooleanLiteralNode.ts +10 -0
  237. package/src/AST/ComparisonNode.ts +57 -0
  238. package/src/AST/ConditionalNode.ts +36 -0
  239. package/src/AST/ElementAttributeNode.ts +63 -0
  240. package/src/AST/ElementQueryNode.ts +25 -0
  241. package/src/AST/ElementStyleNode.ts +63 -0
  242. package/src/AST/ForStatementNode.ts +59 -0
  243. package/src/AST/FunctionArgumentNode.ts +27 -0
  244. package/src/AST/FunctionCallNode.ts +32 -0
  245. package/src/AST/IfStatementNode.ts +67 -0
  246. package/src/AST/InNode.ts +46 -0
  247. package/src/AST/IndexNode.ts +61 -0
  248. package/src/AST/LiteralNode.ts +17 -0
  249. package/src/AST/Node.ts +71 -0
  250. package/src/AST/NotNode.ts +41 -0
  251. package/src/AST/NumberLiteralNode.ts +14 -0
  252. package/src/AST/ObjectNode.ts +55 -0
  253. package/src/AST/RootScopeMemberNode.ts +25 -0
  254. package/src/AST/ScopeMemberNode.ts +53 -0
  255. package/src/AST/UnitLiteralNode.ts +51 -0
  256. package/src/AST.ts +34 -1094
  257. package/src/Attribute.ts +2 -2
  258. package/src/Configuration.ts +3 -3
  259. package/src/Controller.ts +10 -2
  260. package/src/DOM/DOMObject.ts +1 -1
  261. package/src/DOM.ts +3 -3
  262. package/src/EventDispatcher.ts +134 -0
  263. package/src/Formats.ts +2 -2
  264. package/src/MessageList.ts +85 -0
  265. package/src/Model/Field.ts +20 -0
  266. package/src/Model.ts +43 -0
  267. package/src/Registry.ts +13 -3
  268. package/src/Scope/DynamicScopeData.ts +29 -0
  269. package/src/Scope/QueryReference.ts +29 -0
  270. package/src/Scope/ScopeData.ts +21 -0
  271. package/src/Scope/ScopeDataAbstract.ts +126 -0
  272. package/src/Scope/ScopeReference.ts +30 -0
  273. package/src/Scope/ScopedVariableType.ts +7 -0
  274. package/src/Scope/WrappedArray.ts +88 -0
  275. package/src/Scope/properties/Property.ts +79 -0
  276. package/src/Scope.ts +31 -252
  277. package/src/SimplePromise.ts +219 -0
  278. package/src/Tag.ts +3 -3
  279. package/src/Types.ts +6 -1
  280. package/src/Validators.ts +45 -0
  281. package/src/attributes/Bind.ts +4 -4
  282. package/src/attributes/ClassConstructor.ts +2 -1
  283. package/src/attributes/JSONAttribute.ts +2 -1
  284. package/src/attributes/List.ts +4 -4
  285. package/src/attributes/Radio.ts +3 -2
  286. package/src/attributes/ScopeChange.ts +2 -2
  287. package/src/attributes/SetAttribute.ts +2 -1
  288. package/src/attributes/StandardAttribute.ts +1 -1
  289. package/src/attributes/StyleAttribute.ts +3 -2
  290. package/src/attributes/TypeAttribute.ts +1 -1
  291. package/src/vsn.ts +16 -5
  292. package/test/AST/ArithmeticAssignmentNode.spec.ts +47 -0
  293. package/test/AST.spec.ts +3 -2
  294. package/test/Controller.spec.ts +44 -0
  295. package/test/MessageList.spec.ts +101 -0
  296. package/test/Model/DataModel.spec.ts +0 -0
  297. package/test/Scope/DynamicScopeData.spec.ts +141 -0
  298. package/test/Scope.spec.ts +15 -3
  299. package/test/SimplePromise.spec.ts +271 -0
  300. package/test/Tag/TagList.spec.ts +1 -1
  301. package/test/attributes/Bind.spec.ts +5 -5
  302. package/test/attributes/ListItem.spec.ts +1 -1
  303. package/dist/vsn.min.js +0 -1
package/dist/AST.js ADDED
@@ -0,0 +1,778 @@
1
+ "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
11
+ var __generator = (this && this.__generator) || function (thisArg, body) {
12
+ var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
13
+ return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
14
+ function verb(n) { return function (v) { return step([n, v]); }; }
15
+ function step(op) {
16
+ if (f) throw new TypeError("Generator is already executing.");
17
+ while (_) try {
18
+ if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
19
+ if (y = 0, t) op = [op[0] & 2, t.value];
20
+ switch (op[0]) {
21
+ case 0: case 1: t = op; break;
22
+ case 4: _.label++; return { value: op[1], done: false };
23
+ case 5: _.label++; y = op[1]; op = [0]; continue;
24
+ case 7: op = _.ops.pop(); _.trys.pop(); continue;
25
+ default:
26
+ if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
27
+ if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
28
+ if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
29
+ if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
30
+ if (t[2]) _.ops.pop();
31
+ _.trys.pop(); continue;
32
+ }
33
+ op = body.call(thisArg, _);
34
+ } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
35
+ if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
36
+ }
37
+ };
38
+ Object.defineProperty(exports, "__esModule", { value: true });
39
+ exports.Tree = exports.AttributableNodes = exports.TokenType = exports.BlockType = void 0;
40
+ var RootScopeMemberNode_1 = require("./AST/RootScopeMemberNode");
41
+ var ScopeMemberNode_1 = require("./AST/ScopeMemberNode");
42
+ var ElementAttributeNode_1 = require("./AST/ElementAttributeNode");
43
+ var BlockNode_1 = require("./AST/BlockNode");
44
+ var LiteralNode_1 = require("./AST/LiteralNode");
45
+ var IfStatementNode_1 = require("./AST/IfStatementNode");
46
+ var ForStatementNode_1 = require("./AST/ForStatementNode");
47
+ var NumberLiteralNode_1 = require("./AST/NumberLiteralNode");
48
+ var ElementQueryNode_1 = require("./AST/ElementQueryNode");
49
+ var IndexNode_1 = require("./AST/IndexNode");
50
+ var ArrayNode_1 = require("./AST/ArrayNode");
51
+ var ObjectNode_1 = require("./AST/ObjectNode");
52
+ var ElementStyleNode_1 = require("./AST/ElementStyleNode");
53
+ var FunctionCallNode_1 = require("./AST/FunctionCallNode");
54
+ var FunctionArgumentNode_1 = require("./AST/FunctionArgumentNode");
55
+ var InNode_1 = require("./AST/InNode");
56
+ var ComparisonNode_1 = require("./AST/ComparisonNode");
57
+ var ArithmeticNode_1 = require("./AST/ArithmeticNode");
58
+ var ArithmeticAssignmentNode_1 = require("./AST/ArithmeticAssignmentNode");
59
+ var UnitLiteralNode_1 = require("./AST/UnitLiteralNode");
60
+ var BooleanLiteralNode_1 = require("./AST/BooleanLiteralNode");
61
+ var NotNode_1 = require("./AST/NotNode");
62
+ function lower(str) {
63
+ return str ? str.toLowerCase() : null;
64
+ }
65
+ var BlockType;
66
+ (function (BlockType) {
67
+ BlockType[BlockType["BRACE"] = 0] = "BRACE";
68
+ BlockType[BlockType["BRACKET"] = 1] = "BRACKET";
69
+ BlockType[BlockType["PAREN"] = 2] = "PAREN";
70
+ BlockType[BlockType["STATEMENT"] = 3] = "STATEMENT";
71
+ })(BlockType = exports.BlockType || (exports.BlockType = {}));
72
+ var TokenType;
73
+ (function (TokenType) {
74
+ TokenType[TokenType["WHITESPACE"] = 0] = "WHITESPACE";
75
+ TokenType[TokenType["TYPE_INT"] = 1] = "TYPE_INT";
76
+ TokenType[TokenType["TYPE_UINT"] = 2] = "TYPE_UINT";
77
+ TokenType[TokenType["TYPE_FLOAT"] = 3] = "TYPE_FLOAT";
78
+ TokenType[TokenType["TYPE_STRING"] = 4] = "TYPE_STRING";
79
+ TokenType[TokenType["RETURN"] = 5] = "RETURN";
80
+ TokenType[TokenType["NOT"] = 6] = "NOT";
81
+ TokenType[TokenType["OF"] = 7] = "OF";
82
+ TokenType[TokenType["IN"] = 8] = "IN";
83
+ TokenType[TokenType["FOR"] = 9] = "FOR";
84
+ TokenType[TokenType["IF"] = 10] = "IF";
85
+ TokenType[TokenType["ELSE_IF"] = 11] = "ELSE_IF";
86
+ TokenType[TokenType["ELSE"] = 12] = "ELSE";
87
+ TokenType[TokenType["NAME"] = 13] = "NAME";
88
+ TokenType[TokenType["L_BRACE"] = 14] = "L_BRACE";
89
+ TokenType[TokenType["R_BRACE"] = 15] = "R_BRACE";
90
+ TokenType[TokenType["L_BRACKET"] = 16] = "L_BRACKET";
91
+ TokenType[TokenType["R_BRACKET"] = 17] = "R_BRACKET";
92
+ TokenType[TokenType["L_PAREN"] = 18] = "L_PAREN";
93
+ TokenType[TokenType["R_PAREN"] = 19] = "R_PAREN";
94
+ TokenType[TokenType["TILDE"] = 20] = "TILDE";
95
+ TokenType[TokenType["PERIOD"] = 21] = "PERIOD";
96
+ TokenType[TokenType["COMMA"] = 22] = "COMMA";
97
+ TokenType[TokenType["COLON"] = 23] = "COLON";
98
+ TokenType[TokenType["SEMI_COLON"] = 24] = "SEMI_COLON";
99
+ TokenType[TokenType["STRING_LITERAL"] = 25] = "STRING_LITERAL";
100
+ TokenType[TokenType["NUMBER_LITERAL"] = 26] = "NUMBER_LITERAL";
101
+ TokenType[TokenType["BOOLEAN_LITERAL"] = 27] = "BOOLEAN_LITERAL";
102
+ TokenType[TokenType["NULL_LITERAL"] = 28] = "NULL_LITERAL";
103
+ TokenType[TokenType["STRICT_EQUALS"] = 29] = "STRICT_EQUALS";
104
+ TokenType[TokenType["STRICT_NOT_EQUALS"] = 30] = "STRICT_NOT_EQUALS";
105
+ TokenType[TokenType["EQUALS"] = 31] = "EQUALS";
106
+ TokenType[TokenType["NOT_EQUALS"] = 32] = "NOT_EQUALS";
107
+ TokenType[TokenType["GREATER_THAN_EQUAL"] = 33] = "GREATER_THAN_EQUAL";
108
+ TokenType[TokenType["LESS_THAN_EQUAL"] = 34] = "LESS_THAN_EQUAL";
109
+ TokenType[TokenType["GREATER_THAN"] = 35] = "GREATER_THAN";
110
+ TokenType[TokenType["LESS_THAN"] = 36] = "LESS_THAN";
111
+ TokenType[TokenType["ASSIGN"] = 37] = "ASSIGN";
112
+ TokenType[TokenType["AND"] = 38] = "AND";
113
+ TokenType[TokenType["OR"] = 39] = "OR";
114
+ TokenType[TokenType["ADD"] = 40] = "ADD";
115
+ TokenType[TokenType["SUBTRACT"] = 41] = "SUBTRACT";
116
+ TokenType[TokenType["MULTIPLY"] = 42] = "MULTIPLY";
117
+ TokenType[TokenType["DIVIDE"] = 43] = "DIVIDE";
118
+ TokenType[TokenType["ADD_ASSIGN"] = 44] = "ADD_ASSIGN";
119
+ TokenType[TokenType["SUBTRACT_ASSIGN"] = 45] = "SUBTRACT_ASSIGN";
120
+ TokenType[TokenType["MULTIPLY_ASSIGN"] = 46] = "MULTIPLY_ASSIGN";
121
+ TokenType[TokenType["DIVIDE_ASSIGN"] = 47] = "DIVIDE_ASSIGN";
122
+ TokenType[TokenType["EXCLAMATION_POINT"] = 48] = "EXCLAMATION_POINT";
123
+ TokenType[TokenType["ELEMENT_REFERENCE"] = 49] = "ELEMENT_REFERENCE";
124
+ TokenType[TokenType["ELEMENT_ATTRIBUTE"] = 50] = "ELEMENT_ATTRIBUTE";
125
+ TokenType[TokenType["ELEMENT_STYLE"] = 51] = "ELEMENT_STYLE";
126
+ TokenType[TokenType["ELEMENT_QUERY"] = 52] = "ELEMENT_QUERY";
127
+ TokenType[TokenType["UNIT"] = 53] = "UNIT";
128
+ })(TokenType = exports.TokenType || (exports.TokenType = {}));
129
+ var TOKEN_PATTERNS = [
130
+ {
131
+ type: TokenType.WHITESPACE,
132
+ pattern: /^[\s\n\r]+/
133
+ },
134
+ {
135
+ type: TokenType.TYPE_INT,
136
+ pattern: /^int+/
137
+ },
138
+ {
139
+ type: TokenType.TYPE_UINT,
140
+ pattern: /^uint+/
141
+ },
142
+ {
143
+ type: TokenType.TYPE_FLOAT,
144
+ pattern: /^float+/
145
+ },
146
+ {
147
+ type: TokenType.UNIT,
148
+ pattern: /^\d+\.?\d?(?:cm|mm|in|px|pt|pc|em|ex|ch|rem|vw|vh|vmin|vmax|%)/
149
+ },
150
+ {
151
+ type: TokenType.TYPE_STRING,
152
+ pattern: /^string+/
153
+ },
154
+ {
155
+ type: TokenType.BOOLEAN_LITERAL,
156
+ pattern: /^(true|false)/
157
+ },
158
+ {
159
+ type: TokenType.NULL_LITERAL,
160
+ pattern: /^null/
161
+ },
162
+ {
163
+ type: TokenType.RETURN,
164
+ pattern: /^return\s/
165
+ },
166
+ {
167
+ type: TokenType.NOT,
168
+ pattern: /^not\s/
169
+ },
170
+ {
171
+ type: TokenType.OF,
172
+ pattern: /^of\s/
173
+ },
174
+ {
175
+ type: TokenType.IN,
176
+ pattern: /^in\s/
177
+ },
178
+ {
179
+ type: TokenType.FOR,
180
+ pattern: /^for\s?(?=\()/
181
+ },
182
+ {
183
+ type: TokenType.IF,
184
+ pattern: /^if\s?(?=\()/
185
+ },
186
+ {
187
+ type: TokenType.ELSE_IF,
188
+ pattern: /^else if\s?(?=\()/
189
+ },
190
+ {
191
+ type: TokenType.ELSE,
192
+ pattern: /^else\s?(?=\{)/
193
+ },
194
+ {
195
+ type: TokenType.ELEMENT_ATTRIBUTE,
196
+ pattern: /^\.?@[-_a-zA-Z0-9]*/
197
+ },
198
+ {
199
+ type: TokenType.ELEMENT_STYLE,
200
+ pattern: /^\.?\$[-a-zA-Z0-9]*/
201
+ },
202
+ {
203
+ type: TokenType.ELEMENT_REFERENCE,
204
+ pattern: /^#[-_a-zA-Z0-9]*/
205
+ },
206
+ {
207
+ type: TokenType.ELEMENT_QUERY,
208
+ pattern: /^\?\(([#.\[\]:,=\-_a-zA-Z0-9*\s]*[\]_a-zA-Z0-9*])\)/
209
+ },
210
+ {
211
+ type: TokenType.NAME,
212
+ pattern: /^[_a-zA-Z][_a-zA-Z0-9]*/
213
+ },
214
+ {
215
+ type: TokenType.NUMBER_LITERAL,
216
+ pattern: /^-?\d+(?:\.\d+)?(?:e[+\-]?\d+)?/i
217
+ },
218
+ {
219
+ type: TokenType.L_BRACE,
220
+ pattern: /^{/
221
+ },
222
+ {
223
+ type: TokenType.R_BRACE,
224
+ pattern: /^}/
225
+ },
226
+ {
227
+ type: TokenType.L_BRACKET,
228
+ pattern: /^\[/
229
+ },
230
+ {
231
+ type: TokenType.R_BRACKET,
232
+ pattern: /^]/
233
+ },
234
+ {
235
+ type: TokenType.L_PAREN,
236
+ pattern: /^\(/
237
+ },
238
+ {
239
+ type: TokenType.R_PAREN,
240
+ pattern: /^\)/
241
+ },
242
+ {
243
+ type: TokenType.TILDE,
244
+ pattern: /^~/
245
+ },
246
+ {
247
+ type: TokenType.PERIOD,
248
+ pattern: /^\./
249
+ },
250
+ {
251
+ type: TokenType.COMMA,
252
+ pattern: /^,/
253
+ },
254
+ {
255
+ type: TokenType.EQUALS,
256
+ pattern: /^==/
257
+ },
258
+ {
259
+ type: TokenType.NOT_EQUALS,
260
+ pattern: /^!=/
261
+ },
262
+ {
263
+ type: TokenType.GREATER_THAN,
264
+ pattern: /^>/
265
+ },
266
+ {
267
+ type: TokenType.LESS_THAN,
268
+ pattern: /^</
269
+ },
270
+ {
271
+ type: TokenType.GREATER_THAN_EQUAL,
272
+ pattern: /^>=/
273
+ },
274
+ {
275
+ type: TokenType.LESS_THAN_EQUAL,
276
+ pattern: /^<=/
277
+ },
278
+ {
279
+ type: TokenType.COLON,
280
+ pattern: /^:/
281
+ },
282
+ {
283
+ type: TokenType.SEMI_COLON,
284
+ pattern: /^;/
285
+ },
286
+ {
287
+ type: TokenType.STRING_LITERAL,
288
+ pattern: /^"([^"]*)"/
289
+ },
290
+ {
291
+ type: TokenType.STRING_LITERAL,
292
+ pattern: /^'([^']*)'/ // Try to make this work: /^(?<!\\)(?:\\\\)*"([^(?<!\\)(?:\\\\)*"]*)(?<!\\)(?:\\\\)*"/
293
+ },
294
+ {
295
+ type: TokenType.AND,
296
+ pattern: /^&&/
297
+ },
298
+ {
299
+ type: TokenType.OR,
300
+ pattern: /^\|\|/
301
+ },
302
+ {
303
+ type: TokenType.ADD_ASSIGN,
304
+ pattern: /^\+=/
305
+ },
306
+ {
307
+ type: TokenType.SUBTRACT_ASSIGN,
308
+ pattern: /^-=/
309
+ },
310
+ {
311
+ type: TokenType.MULTIPLY_ASSIGN,
312
+ pattern: /^\*=/
313
+ },
314
+ {
315
+ type: TokenType.DIVIDE_ASSIGN,
316
+ pattern: /^\/=/
317
+ },
318
+ {
319
+ type: TokenType.ADD,
320
+ pattern: /^\+/
321
+ },
322
+ {
323
+ type: TokenType.SUBTRACT,
324
+ pattern: /^-/
325
+ },
326
+ {
327
+ type: TokenType.MULTIPLY,
328
+ pattern: /^\*/
329
+ },
330
+ {
331
+ type: TokenType.DIVIDE,
332
+ pattern: /^\//
333
+ },
334
+ {
335
+ type: TokenType.ASSIGN,
336
+ pattern: /^=/
337
+ },
338
+ {
339
+ type: TokenType.EXCLAMATION_POINT,
340
+ pattern: /^!/
341
+ }
342
+ ];
343
+ exports.AttributableNodes = [
344
+ RootScopeMemberNode_1.RootScopeMemberNode,
345
+ ScopeMemberNode_1.ScopeMemberNode,
346
+ ElementAttributeNode_1.ElementAttributeNode
347
+ ];
348
+ var Tree = /** @class */ (function () {
349
+ function Tree(code) {
350
+ this.code = code;
351
+ if (Tree.cache[code]) {
352
+ this.rootNode = Tree.cache[code];
353
+ }
354
+ else {
355
+ this.parse();
356
+ Tree.cache[code] = this.rootNode;
357
+ }
358
+ }
359
+ Tree.prototype.parse = function () {
360
+ var tokens = Tree.tokenize(this.code);
361
+ this.rootNode = Tree.processTokens(tokens);
362
+ };
363
+ Tree.prototype.evaluate = function (scope, dom, tag) {
364
+ if (tag === void 0) { tag = null; }
365
+ return __awaiter(this, void 0, void 0, function () {
366
+ return __generator(this, function (_a) {
367
+ switch (_a.label) {
368
+ case 0: return [4 /*yield*/, this.rootNode.evaluate(scope, dom, tag)];
369
+ case 1: return [2 /*return*/, _a.sent()];
370
+ }
371
+ });
372
+ });
373
+ };
374
+ Tree.prototype.prepare = function (scope, dom, tag) {
375
+ if (tag === void 0) { tag = null; }
376
+ return __awaiter(this, void 0, void 0, function () {
377
+ return __generator(this, function (_a) {
378
+ switch (_a.label) {
379
+ case 0:
380
+ if (!this.rootNode.isPreparationRequired())
381
+ return [2 /*return*/];
382
+ return [4 /*yield*/, this.rootNode.prepare(scope, dom, tag)];
383
+ case 1: return [2 /*return*/, _a.sent()];
384
+ }
385
+ });
386
+ });
387
+ };
388
+ Tree.prototype.bindToScopeChanges = function (scope, fnc, dom, tag) {
389
+ if (tag === void 0) { tag = null; }
390
+ return __awaiter(this, void 0, void 0, function () {
391
+ var _i, _a, node, _scope, name_1;
392
+ return __generator(this, function (_b) {
393
+ switch (_b.label) {
394
+ case 0:
395
+ _i = 0, _a = this.rootNode.findChildrenByTypes([RootScopeMemberNode_1.RootScopeMemberNode, ScopeMemberNode_1.ScopeMemberNode, ElementAttributeNode_1.ElementAttributeNode], 'ScopeMemberNodes');
396
+ _b.label = 1;
397
+ case 1:
398
+ if (!(_i < _a.length)) return [3 /*break*/, 8];
399
+ node = _a[_i];
400
+ _scope = scope;
401
+ if (!(node instanceof ScopeMemberNode_1.ScopeMemberNode)) return [3 /*break*/, 3];
402
+ return [4 /*yield*/, node.scope.evaluate(scope, dom)];
403
+ case 2:
404
+ _scope = _b.sent();
405
+ return [3 /*break*/, 5];
406
+ case 3:
407
+ if (!(node instanceof ElementAttributeNode_1.ElementAttributeNode && node.elementRef)) return [3 /*break*/, 5];
408
+ return [4 /*yield*/, node.elementRef.evaluate(scope, dom, tag)];
409
+ case 4:
410
+ _scope = (_b.sent())[0].scope;
411
+ _b.label = 5;
412
+ case 5: return [4 /*yield*/, node.name.evaluate(scope, dom, tag)];
413
+ case 6:
414
+ name_1 = _b.sent();
415
+ _scope.on("change:" + name_1, fnc);
416
+ _b.label = 7;
417
+ case 7:
418
+ _i++;
419
+ return [3 /*break*/, 1];
420
+ case 8: return [2 /*return*/];
421
+ }
422
+ });
423
+ });
424
+ };
425
+ Tree.tokenize = function (code) {
426
+ var tokens = [];
427
+ if (!code || code.length === 0)
428
+ return tokens;
429
+ var foundToken;
430
+ do {
431
+ foundToken = false;
432
+ for (var _i = 0, TOKEN_PATTERNS_1 = TOKEN_PATTERNS; _i < TOKEN_PATTERNS_1.length; _i++) {
433
+ var tp = TOKEN_PATTERNS_1[_i];
434
+ var match = tp.pattern.exec(code);
435
+ if (match) {
436
+ tokens.push({
437
+ type: tp.type,
438
+ value: match[match.length - 1]
439
+ });
440
+ code = code.substring(match[0].length);
441
+ foundToken = true;
442
+ break;
443
+ }
444
+ }
445
+ } while (code.length > 0 && foundToken);
446
+ return tokens;
447
+ };
448
+ Tree.stripWhiteSpace = function (tokens) {
449
+ for (var i = 0; i < tokens.length; i++) {
450
+ if (tokens[i].type === TokenType.WHITESPACE) {
451
+ tokens.splice(i, 1);
452
+ i--;
453
+ }
454
+ }
455
+ return tokens;
456
+ };
457
+ Tree.processTokens = function (tokens) {
458
+ var blockNodes = [];
459
+ var node = null;
460
+ var count = 0;
461
+ Tree.stripWhiteSpace(tokens);
462
+ while (tokens.length > 0) {
463
+ count++;
464
+ if (count > 1000)
465
+ break; // Limit to 1000 iterations while in development
466
+ if (tokens[0].type === TokenType.RETURN)
467
+ tokens.splice(0, 1);
468
+ var token = tokens[0];
469
+ if (token.type === TokenType.NAME) {
470
+ node = new RootScopeMemberNode_1.RootScopeMemberNode(new LiteralNode_1.LiteralNode(token.value));
471
+ tokens.splice(0, 1);
472
+ }
473
+ else if (token.type === TokenType.IF) {
474
+ node = IfStatementNode_1.IfStatementNode.parse(node, token, tokens);
475
+ blockNodes.push(node);
476
+ node = null;
477
+ }
478
+ else if (token.type === TokenType.FOR) {
479
+ node = ForStatementNode_1.ForStatementNode.parse(node, token, tokens);
480
+ blockNodes.push(node);
481
+ node = null;
482
+ }
483
+ else if (token.type === TokenType.STRING_LITERAL) {
484
+ node = new LiteralNode_1.LiteralNode(token.value);
485
+ tokens.splice(0, 1);
486
+ }
487
+ else if (token.type === TokenType.NUMBER_LITERAL) {
488
+ node = new NumberLiteralNode_1.NumberLiteralNode(token.value);
489
+ tokens.splice(0, 1);
490
+ }
491
+ else if (tokens[0].type === TokenType.ELEMENT_REFERENCE) {
492
+ node = new ElementQueryNode_1.ElementQueryNode(tokens[0].value);
493
+ tokens.splice(0, 1);
494
+ }
495
+ else if (tokens[0].type === TokenType.ELEMENT_QUERY) {
496
+ node = new ElementQueryNode_1.ElementQueryNode(tokens[0].value);
497
+ tokens.splice(0, 1);
498
+ }
499
+ else if (tokens[0].type === TokenType.L_BRACKET) {
500
+ if (node) {
501
+ node = IndexNode_1.IndexNode.parse(node, token, tokens);
502
+ }
503
+ else {
504
+ node = ArrayNode_1.ArrayNode.parse(node, token, tokens);
505
+ }
506
+ }
507
+ else if (tokens[0].type === TokenType.L_BRACE) {
508
+ node = ObjectNode_1.ObjectNode.parse(node, token, tokens);
509
+ }
510
+ else if (tokens[0].type === TokenType.ELEMENT_ATTRIBUTE) {
511
+ node = new ElementAttributeNode_1.ElementAttributeNode(node, tokens[0].value);
512
+ tokens.splice(0, 1);
513
+ }
514
+ else if (tokens[0].type === TokenType.ELEMENT_STYLE) {
515
+ node = new ElementStyleNode_1.ElementStyleNode(node, tokens[0].value);
516
+ tokens.splice(0, 1);
517
+ }
518
+ else if (node !== null && token.type === TokenType.PERIOD && tokens[1].type === TokenType.NAME) {
519
+ node = new ScopeMemberNode_1.ScopeMemberNode(node, new LiteralNode_1.LiteralNode(tokens[1].value));
520
+ tokens.splice(0, 2);
521
+ }
522
+ else if (tokens[0].type === TokenType.L_PAREN) {
523
+ var funcArgs = Tree.getBlockTokens(tokens);
524
+ var nodes = [];
525
+ for (var _i = 0, funcArgs_1 = funcArgs; _i < funcArgs_1.length; _i++) {
526
+ var arg = funcArgs_1[_i];
527
+ nodes.push(Tree.processTokens(arg));
528
+ }
529
+ if (node) {
530
+ node = new FunctionCallNode_1.FunctionCallNode(node, // Previous node should be a NAME
531
+ new FunctionArgumentNode_1.FunctionArgumentNode(nodes));
532
+ }
533
+ else {
534
+ node = new BlockNode_1.BlockNode(nodes);
535
+ }
536
+ }
537
+ else if (tokens[0].type === TokenType.SEMI_COLON) {
538
+ if (node) {
539
+ blockNodes.push(node);
540
+ }
541
+ node = null;
542
+ tokens.splice(0, 1);
543
+ }
544
+ else if (InNode_1.InNode.match(tokens)) {
545
+ node = InNode_1.InNode.parse(node, token, tokens);
546
+ }
547
+ else if (ComparisonNode_1.ComparisonNode.match(tokens)) {
548
+ node = ComparisonNode_1.ComparisonNode.parse(node, token, tokens);
549
+ }
550
+ else if (ArithmeticNode_1.ArithmeticNode.match(tokens)) {
551
+ node = ArithmeticNode_1.ArithmeticNode.parse(node, token, tokens);
552
+ }
553
+ else if (ArithmeticAssignmentNode_1.ArithmeticAssignmentNode.match(tokens)) {
554
+ node = ArithmeticAssignmentNode_1.ArithmeticAssignmentNode.parse(node, token, tokens);
555
+ }
556
+ else if (tokens[0].type === TokenType.WHITESPACE) {
557
+ tokens.splice(0, 1);
558
+ }
559
+ else if (tokens[0].type === TokenType.UNIT) {
560
+ node = new UnitLiteralNode_1.UnitLiteralNode(tokens[0].value);
561
+ tokens.splice(0, 1);
562
+ }
563
+ else if (tokens[0].type === TokenType.BOOLEAN_LITERAL) {
564
+ node = new BooleanLiteralNode_1.BooleanLiteralNode(tokens[0].value);
565
+ tokens.splice(0, 1);
566
+ }
567
+ else if (tokens[0].type === TokenType.NULL_LITERAL) {
568
+ node = new LiteralNode_1.LiteralNode(null);
569
+ tokens.splice(0, 1);
570
+ }
571
+ else if (tokens[0].type === TokenType.EXCLAMATION_POINT) {
572
+ node = NotNode_1.NotNode.parse(node, tokens[0], tokens);
573
+ }
574
+ else {
575
+ var code = Tree.toCode(tokens, 10);
576
+ throw Error("Syntax Error. Near " + code);
577
+ }
578
+ }
579
+ if (node) {
580
+ blockNodes.push(node);
581
+ }
582
+ return new BlockNode_1.BlockNode(blockNodes);
583
+ };
584
+ Tree.toCode = function (tokens, limit) {
585
+ var code = '';
586
+ limit = limit || tokens.length;
587
+ for (var i = 0; i < limit; i++) {
588
+ if (!tokens[i])
589
+ break;
590
+ code += tokens[i].value;
591
+ }
592
+ return code;
593
+ };
594
+ Tree.getBlockInfo = function (tokens) {
595
+ var blockType;
596
+ var opener = tokens[0];
597
+ if (opener.type === TokenType.L_PAREN)
598
+ blockType = BlockType.PAREN;
599
+ else if (opener.type === TokenType.L_BRACE)
600
+ blockType = BlockType.BRACE;
601
+ else if (opener.type === TokenType.L_BRACKET)
602
+ blockType = BlockType.BRACKET;
603
+ else
604
+ blockType = BlockType.STATEMENT;
605
+ var open;
606
+ var close;
607
+ var openCharacter;
608
+ var closeCharacter;
609
+ switch (blockType) {
610
+ case BlockType.PAREN:
611
+ open = TokenType.L_PAREN;
612
+ close = TokenType.R_PAREN;
613
+ openCharacter = '(';
614
+ closeCharacter = ')';
615
+ break;
616
+ case BlockType.BRACE:
617
+ open = TokenType.L_BRACE;
618
+ close = TokenType.R_BRACE;
619
+ openCharacter = '{';
620
+ closeCharacter = '}';
621
+ break;
622
+ case BlockType.BRACKET:
623
+ open = TokenType.L_BRACKET;
624
+ close = TokenType.R_BRACKET;
625
+ openCharacter = '[';
626
+ closeCharacter = ']';
627
+ break;
628
+ default:
629
+ open = null;
630
+ close = TokenType.SEMI_COLON;
631
+ openCharacter = null;
632
+ closeCharacter = ';';
633
+ break;
634
+ }
635
+ return {
636
+ type: blockType,
637
+ open: open,
638
+ close: close,
639
+ openCharacter: openCharacter,
640
+ closeCharacter: closeCharacter
641
+ };
642
+ };
643
+ Tree.getNextStatementTokens = function (tokens, consumeClosingToken, consumeOpeningToken, includeClosingToken) {
644
+ if (consumeClosingToken === void 0) { consumeClosingToken = true; }
645
+ if (consumeOpeningToken === void 0) { consumeOpeningToken = true; }
646
+ if (includeClosingToken === void 0) { includeClosingToken = false; }
647
+ var blockInfo = Tree.getBlockInfo(tokens);
648
+ // Consume opening block token
649
+ if (consumeOpeningToken && tokens[0].type === blockInfo.open) {
650
+ tokens.splice(0, 1);
651
+ }
652
+ return Tree.getTokensUntil(tokens, blockInfo.close, consumeClosingToken, includeClosingToken);
653
+ };
654
+ Tree.getBlockTokens = function (tokens, groupBy) {
655
+ if (groupBy === void 0) { groupBy = TokenType.COMMA; }
656
+ var blockInfo = Tree.getBlockInfo(tokens);
657
+ var openBlocks = 0;
658
+ var args = [];
659
+ var arg = [];
660
+ for (var i = 0; i < tokens.length; i++) {
661
+ var token = tokens[i];
662
+ if (token.type === blockInfo.open) {
663
+ openBlocks += 1;
664
+ if (openBlocks > 1)
665
+ arg.push(token);
666
+ }
667
+ else if (token.type === blockInfo.close) {
668
+ openBlocks -= 1;
669
+ if (openBlocks > 0)
670
+ arg.push(token);
671
+ }
672
+ else if (groupBy !== null && token.type === groupBy && openBlocks == 1) {
673
+ args.push(arg);
674
+ arg = [];
675
+ }
676
+ else if (token.type !== TokenType.WHITESPACE) {
677
+ arg.push(token);
678
+ }
679
+ // Consume token
680
+ tokens.splice(0, 1);
681
+ i--;
682
+ if (openBlocks === 0) {
683
+ if (arg.length > 0)
684
+ args.push(arg);
685
+ return args;
686
+ }
687
+ }
688
+ throw Error("Invalid Syntax, missing " + blockInfo.closeCharacter);
689
+ };
690
+ Tree.getTokensUntil = function (tokens, terminator, consumeTerminator, includeTerminator, validIfTerminatorNotFound, blockInfo) {
691
+ if (terminator === void 0) { terminator = TokenType.SEMI_COLON; }
692
+ if (consumeTerminator === void 0) { consumeTerminator = true; }
693
+ if (includeTerminator === void 0) { includeTerminator = false; }
694
+ if (validIfTerminatorNotFound === void 0) { validIfTerminatorNotFound = false; }
695
+ if (blockInfo === void 0) { blockInfo = null; }
696
+ var statementTokens = [];
697
+ blockInfo = blockInfo || Tree.getBlockInfo(tokens);
698
+ var openParens = 0;
699
+ var openBraces = 0;
700
+ var openBrackets = 0;
701
+ for (var i = 0; i < tokens.length; i++) {
702
+ var token = tokens[i];
703
+ if (!(token.type === blockInfo.open && i === 0)) { // Skip opener
704
+ if (token.type === TokenType.L_PAREN)
705
+ openParens += 1;
706
+ if (token.type === TokenType.L_BRACE)
707
+ openBraces += 1;
708
+ if (token.type === TokenType.L_BRACKET)
709
+ openBrackets += 1;
710
+ }
711
+ if ([
712
+ terminator,
713
+ TokenType.R_BRACKET,
714
+ TokenType.R_BRACE,
715
+ TokenType.R_PAREN
716
+ ].indexOf(token.type) > -1) {
717
+ if (openParens > 0 && token.type === TokenType.R_PAREN) {
718
+ openParens -= 1;
719
+ }
720
+ else if (openBraces > 0 && token.type === TokenType.R_BRACE) {
721
+ openBraces -= 1;
722
+ }
723
+ else if (openBrackets > 0 && token.type === TokenType.R_BRACKET) {
724
+ openBrackets -= 1;
725
+ }
726
+ else if (token.type === terminator && openParens === 0 && openBraces === 0 && openBrackets === 0) {
727
+ if (includeTerminator)
728
+ statementTokens.push(token);
729
+ if ((includeTerminator || consumeTerminator) && token.type !== TokenType.SEMI_COLON)
730
+ tokens.splice(0, 1); // Consume end of block
731
+ break;
732
+ }
733
+ else if (token.type === terminator && (openParens > 0 || openBraces > 0 || openBrackets > 0)) {
734
+ }
735
+ else {
736
+ if (validIfTerminatorNotFound)
737
+ break;
738
+ throw Error("Invalid syntax, expecting " + terminator + ".");
739
+ }
740
+ }
741
+ statementTokens.push(token);
742
+ tokens.splice(0, 1); // Consume part of statement
743
+ i--;
744
+ }
745
+ return statementTokens;
746
+ };
747
+ Tree.consumeTypes = function (tokens, types) {
748
+ var matching = [];
749
+ for (var _i = 0, tokens_1 = tokens; _i < tokens_1.length; _i++) {
750
+ var token = tokens_1[_i];
751
+ if (types.indexOf(token.type) > -1) {
752
+ matching.push(token);
753
+ }
754
+ else {
755
+ break;
756
+ }
757
+ }
758
+ tokens.splice(0, matching.length);
759
+ return matching;
760
+ };
761
+ Tree.apply = function (code, scope, dom, tag) {
762
+ return __awaiter(this, void 0, void 0, function () {
763
+ var t;
764
+ return __generator(this, function (_a) {
765
+ switch (_a.label) {
766
+ case 0:
767
+ t = new Tree(code);
768
+ return [4 /*yield*/, t.evaluate(scope, dom, tag)];
769
+ case 1: return [2 /*return*/, _a.sent()];
770
+ }
771
+ });
772
+ });
773
+ };
774
+ Tree.cache = {};
775
+ return Tree;
776
+ }());
777
+ exports.Tree = Tree;
778
+ //# sourceMappingURL=AST.js.map