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/vsn.js ADDED
@@ -0,0 +1,181 @@
1
+ "use strict";
2
+ var __extends = (this && this.__extends) || (function () {
3
+ var extendStatics = function (d, b) {
4
+ extendStatics = Object.setPrototypeOf ||
5
+ ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
6
+ function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };
7
+ return extendStatics(d, b);
8
+ };
9
+ return function (d, b) {
10
+ if (typeof b !== "function" && b !== null)
11
+ throw new TypeError("Class extends value " + String(b) + " is not a constructor or null");
12
+ extendStatics(d, b);
13
+ function __() { this.constructor = d; }
14
+ d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
15
+ };
16
+ })();
17
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
18
+ if (k2 === undefined) k2 = k;
19
+ Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
20
+ }) : (function(o, m, k, k2) {
21
+ if (k2 === undefined) k2 = k;
22
+ o[k2] = m[k];
23
+ }));
24
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
25
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
26
+ };
27
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
28
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
29
+ return new (P || (P = Promise))(function (resolve, reject) {
30
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
31
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
32
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
33
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
34
+ });
35
+ };
36
+ var __generator = (this && this.__generator) || function (thisArg, body) {
37
+ var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
38
+ return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
39
+ function verb(n) { return function (v) { return step([n, v]); }; }
40
+ function step(op) {
41
+ if (f) throw new TypeError("Generator is already executing.");
42
+ while (_) try {
43
+ 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;
44
+ if (y = 0, t) op = [op[0] & 2, t.value];
45
+ switch (op[0]) {
46
+ case 0: case 1: t = op; break;
47
+ case 4: _.label++; return { value: op[1], done: false };
48
+ case 5: _.label++; y = op[1]; op = [0]; continue;
49
+ case 7: op = _.ops.pop(); _.trys.pop(); continue;
50
+ default:
51
+ if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
52
+ if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
53
+ if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
54
+ if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
55
+ if (t[2]) _.ops.pop();
56
+ _.trys.pop(); continue;
57
+ }
58
+ op = body.call(thisArg, _);
59
+ } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
60
+ if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
61
+ }
62
+ };
63
+ Object.defineProperty(exports, "__esModule", { value: true });
64
+ exports.vision = exports.Tag = exports.SimplePromise = exports.MessageList = exports.EventDispatcher = exports.Model = exports.Field = exports.property = exports.Property = exports.Controller = exports.WrappedArray = exports.ScopeReference = exports.Scope = exports.DOM = exports.Vision = void 0;
65
+ var DOM_1 = require("./DOM");
66
+ var WrappedArray_1 = require("./Scope/WrappedArray");
67
+ var Registry_1 = require("./Registry");
68
+ require("./Types");
69
+ require("./Formats");
70
+ var Configuration_1 = require("./Configuration");
71
+ var VisionHelper_1 = require("./helpers/VisionHelper");
72
+ var AST_1 = require("./AST");
73
+ var Query_1 = require("./Query");
74
+ var EventDispatcher_1 = require("./EventDispatcher");
75
+ var DynamicScopeData_1 = require("./Scope/DynamicScopeData");
76
+ var Vision = /** @class */ (function (_super) {
77
+ __extends(Vision, _super);
78
+ function Vision() {
79
+ var _this = _super.call(this) || this;
80
+ _this.registry = Registry_1.Registry.instance;
81
+ _this.config = Configuration_1.Configuration.instance;
82
+ if (VisionHelper_1.VisionHelper.document) {
83
+ document.addEventListener("DOMContentLoaded", _this.setup.bind(_this));
84
+ }
85
+ else {
86
+ console.warn('No dom, running in CLI mode.');
87
+ }
88
+ _this.registry.classes.register('Object', Object);
89
+ _this.registry.classes.register('WrappedArray', WrappedArray_1.WrappedArray);
90
+ _this.registry.classes.register('Data', DynamicScopeData_1.DynamicScopeData);
91
+ if (VisionHelper_1.VisionHelper.window) {
92
+ window['Vision'] = Vision;
93
+ window['Registry'] = Registry_1.Registry;
94
+ window['vision'] = window['vsn'] = _this;
95
+ window['Tree'] = AST_1.Tree;
96
+ window['$'] = Query_1.Query;
97
+ VisionHelper_1.VisionHelper.window.dispatchEvent(new Event('vsn'));
98
+ }
99
+ return _this;
100
+ }
101
+ Object.defineProperty(Vision.prototype, "dom", {
102
+ get: function () {
103
+ return this._dom;
104
+ },
105
+ enumerable: false,
106
+ configurable: true
107
+ });
108
+ Vision.prototype.eval = function (code) {
109
+ return __awaiter(this, void 0, void 0, function () {
110
+ return __generator(this, function (_a) {
111
+ switch (_a.label) {
112
+ case 0: return [4 /*yield*/, this._dom.eval(code)];
113
+ case 1: return [2 /*return*/, _a.sent()];
114
+ }
115
+ });
116
+ });
117
+ };
118
+ Vision.prototype.setup = function () {
119
+ return __awaiter(this, void 0, void 0, function () {
120
+ var body, startTime, now, setupTime;
121
+ return __generator(this, function (_a) {
122
+ switch (_a.label) {
123
+ case 0:
124
+ body = document.body;
125
+ body.setAttribute('vsn-root', '');
126
+ this._dom = DOM_1.DOM.instance;
127
+ startTime = new Date().getTime();
128
+ return [4 /*yield*/, this._dom.buildFrom(document, true)];
129
+ case 1:
130
+ _a.sent();
131
+ now = (new Date()).getTime();
132
+ setupTime = now - startTime;
133
+ console.warn("Took " + setupTime + "ms to start up VisionJS. https://www.vsnjs.com/");
134
+ return [2 /*return*/];
135
+ }
136
+ });
137
+ });
138
+ };
139
+ Object.defineProperty(Vision, "instance", {
140
+ get: function () {
141
+ if (!Vision._instance)
142
+ Vision._instance = new Vision();
143
+ return Vision._instance;
144
+ },
145
+ enumerable: false,
146
+ configurable: true
147
+ });
148
+ return Vision;
149
+ }(EventDispatcher_1.EventDispatcher));
150
+ exports.Vision = Vision;
151
+ __exportStar(require("./attributes/_imports"), exports);
152
+ __exportStar(require("./Registry"), exports);
153
+ __exportStar(require("./Attribute"), exports);
154
+ __exportStar(require("./AST"), exports);
155
+ var DOM_2 = require("./DOM");
156
+ Object.defineProperty(exports, "DOM", { enumerable: true, get: function () { return DOM_2.DOM; } });
157
+ var Scope_1 = require("./Scope");
158
+ Object.defineProperty(exports, "Scope", { enumerable: true, get: function () { return Scope_1.Scope; } });
159
+ var ScopeReference_1 = require("./Scope/ScopeReference");
160
+ Object.defineProperty(exports, "ScopeReference", { enumerable: true, get: function () { return ScopeReference_1.ScopeReference; } });
161
+ var WrappedArray_2 = require("./Scope/WrappedArray");
162
+ Object.defineProperty(exports, "WrappedArray", { enumerable: true, get: function () { return WrappedArray_2.WrappedArray; } });
163
+ var Controller_1 = require("./Controller");
164
+ Object.defineProperty(exports, "Controller", { enumerable: true, get: function () { return Controller_1.Controller; } });
165
+ var Property_1 = require("./Scope/properties/Property");
166
+ Object.defineProperty(exports, "Property", { enumerable: true, get: function () { return Property_1.Property; } });
167
+ Object.defineProperty(exports, "property", { enumerable: true, get: function () { return Property_1.property; } });
168
+ var Field_1 = require("./Model/Field");
169
+ Object.defineProperty(exports, "Field", { enumerable: true, get: function () { return Field_1.Field; } });
170
+ var Model_1 = require("./Model");
171
+ Object.defineProperty(exports, "Model", { enumerable: true, get: function () { return Model_1.Model; } });
172
+ var EventDispatcher_2 = require("./EventDispatcher");
173
+ Object.defineProperty(exports, "EventDispatcher", { enumerable: true, get: function () { return EventDispatcher_2.EventDispatcher; } });
174
+ var MessageList_1 = require("./MessageList");
175
+ Object.defineProperty(exports, "MessageList", { enumerable: true, get: function () { return MessageList_1.MessageList; } });
176
+ var SimplePromise_1 = require("./SimplePromise");
177
+ Object.defineProperty(exports, "SimplePromise", { enumerable: true, get: function () { return SimplePromise_1.SimplePromise; } });
178
+ var Tag_1 = require("./Tag");
179
+ Object.defineProperty(exports, "Tag", { enumerable: true, get: function () { return Tag_1.Tag; } });
180
+ exports.vision = Vision.instance;
181
+ //# sourceMappingURL=vsn.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vsn.js","sourceRoot":"","sources":["../src/vsn.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,6BAA0B;AAC1B,qDAAkD;AAClD,uCAAoC;AACpC,mBAAiB;AACjB,qBAAmB;AACnB,iDAA8C;AAC9C,uDAAoD;AACpD,6BAA2B;AAC3B,iCAA8B;AAC9B,qDAAkD;AAClD,6DAA0D;AAI1D;IAA4B,0BAAe;IAMvC;QAAA,YACI,iBAAO,SAqBV;QAzBe,cAAQ,GAAG,mBAAQ,CAAC,QAAQ,CAAC;QAC7B,YAAM,GAAkB,6BAAa,CAAC,QAAQ,CAAC;QAI3D,IAAI,2BAAY,CAAC,QAAQ,EAAE;YACvB,QAAQ,CAAC,gBAAgB,CACrB,kBAAkB,EAClB,KAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAI,CAAC,CACxB,CAAC;SACL;aAAM;YACH,OAAO,CAAC,IAAI,CAAC,8BAA8B,CAAC,CAAC;SAChD;QACD,KAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;QACjD,KAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,QAAQ,CAAC,cAAc,EAAE,2BAAY,CAAC,CAAC;QAC7D,KAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,QAAQ,CAAC,MAAM,EAAE,mCAAgB,CAAC,CAAC;QAEzD,IAAI,2BAAY,CAAC,MAAM,EAAE;YACrB,MAAM,CAAC,QAAQ,CAAC,GAAG,MAAM,CAAC;YAC1B,MAAM,CAAC,UAAU,CAAC,GAAG,mBAAQ,CAAC;YAC9B,MAAM,CAAC,QAAQ,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,GAAG,KAAI,CAAC;YACxC,MAAM,CAAC,MAAM,CAAC,GAAG,UAAI,CAAC;YACtB,MAAM,CAAC,GAAG,CAAC,GAAG,aAAK,CAAC;YACpB,2BAAY,CAAC,MAAM,CAAC,aAAa,CAAC,IAAI,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC;SACvD;;IACL,CAAC;IAED,sBAAW,uBAAG;aAAd;YACI,OAAO,IAAI,CAAC,IAAI,CAAC;QACrB,CAAC;;;OAAA;IAEY,qBAAI,GAAjB,UAAkB,IAAY;;;;4BACnB,qBAAM,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,EAAA;4BAAjC,sBAAO,SAA0B,EAAC;;;;KACrC;IAEY,sBAAK,GAAlB;;;;;;wBACU,IAAI,GAAgB,QAAQ,CAAC,IAAI,CAAC;wBACxC,IAAI,CAAC,YAAY,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;wBAClC,IAAI,CAAC,IAAI,GAAG,SAAG,CAAC,QAAQ,CAAC;wBACnB,SAAS,GAAW,IAAI,IAAI,EAAE,CAAC,OAAO,EAAE,CAAC;wBAC/C,qBAAM,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,CAAC,EAAA;;wBAAzC,SAAyC,CAAC;wBACpC,GAAG,GAAG,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC;wBAC7B,SAAS,GAAG,GAAG,GAAG,SAAS,CAAC;wBAClC,OAAO,CAAC,IAAI,CAAC,UAAQ,SAAS,oDAAiD,CAAC,CAAC;;;;;KACpF;IAED,sBAAkB,kBAAQ;aAA1B;YACI,IAAI,CAAC,MAAM,CAAC,SAAS;gBACjB,MAAM,CAAC,SAAS,GAAG,IAAI,MAAM,EAAE,CAAC;YAEpC,OAAO,MAAM,CAAC,SAAS,CAAC;QAC5B,CAAC;;;OAAA;IACL,aAAC;AAAD,CAAC,AAvDD,CAA4B,iCAAe,GAuD1C;AAvDY,wBAAM;AAyDnB,wDAAsC;AACtC,6CAA2B;AAC3B,8CAA4B;AAC5B,wCAAsB;AACtB,6BAA0B;AAAlB,0FAAA,GAAG,OAAA;AACX,iCAA8B;AAAtB,8FAAA,KAAK,OAAA;AACb,yDAAsD;AAA9C,gHAAA,cAAc,OAAA;AACtB,qDAAkD;AAA1C,4GAAA,YAAY,OAAA;AACpB,2CAAwC;AAAhC,wGAAA,UAAU,OAAA;AAClB,wDAA+D;AAAvD,oGAAA,QAAQ,OAAA;AAAE,oGAAA,QAAQ,OAAA;AAC1B,uCAAoC;AAA5B,8FAAA,KAAK,OAAA;AACb,iCAA8B;AAAtB,8FAAA,KAAK,OAAA;AACb,qDAAkD;AAA1C,kHAAA,eAAe,OAAA;AACvB,6CAA0C;AAAlC,0GAAA,WAAW,OAAA;AACnB,iDAA8C;AAAtC,8GAAA,aAAa,OAAA;AACrB,6BAA0B;AAAlB,0FAAA,GAAG,OAAA;AACE,QAAA,MAAM,GAAW,MAAM,CAAC,QAAQ,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "vsn",
3
- "version": "0.1.26",
3
+ "version": "0.1.29",
4
4
  "description": "SEO Friendly Javascript/Typescript Framework",
5
5
  "keywords": [
6
6
  "framework",
@@ -17,11 +17,7 @@
17
17
  "sample": "rm -rf sample/dist/ && tsc -p sample/ && node sample/dist/sample/index.js"
18
18
  },
19
19
  "license": "MIT",
20
- "dependencies": {
21
- "simple-ts-event-dispatcher": "^0.1.6",
22
- "simple-ts-models": "^0.1.3",
23
- "simple-ts-promise": "^0.1.6"
24
- },
20
+ "dependencies": {},
25
21
  "devDependencies": {
26
22
  "@types/jasmine": "^3.6.10",
27
23
  "codecov": "^3.8.1",
@@ -0,0 +1,236 @@
1
+ import {Scope} from "../Scope";
2
+ import {DOM} from "../DOM";
3
+ import {Tag} from "../Tag";
4
+ import {DOMObject} from "../DOM/DOMObject";
5
+ import {Token, TokenType, Tree, TreeNode} from "../AST";
6
+ import {Node} from "./Node";
7
+ import {RootScopeMemberNode} from "./RootScopeMemberNode";
8
+ import {ScopeMemberNode} from "./ScopeMemberNode";
9
+ import {ElementQueryNode} from "./ElementQueryNode";
10
+ import {ElementAttributeNode} from "./ElementAttributeNode";
11
+ import {ElementStyleNode} from "./ElementStyleNode";
12
+ import {UnitLiteral} from "./UnitLiteralNode";
13
+ import {Controller} from "../vsn";
14
+
15
+ export class ArithmeticAssignmentNode extends Node implements TreeNode {
16
+ constructor(
17
+ public readonly left: RootScopeMemberNode | ScopeMemberNode,
18
+ public readonly right: TreeNode,
19
+ public readonly type: TokenType
20
+ ) {
21
+ super();
22
+ }
23
+
24
+ protected _getChildNodes(): Node[] {
25
+ return [
26
+ this.left as Node,
27
+ this.right as Node
28
+ ]
29
+ }
30
+
31
+ async evaluate(scope: Scope, dom: DOM, tag: Tag = null) {
32
+ let scopes = [];
33
+ const name: string = await this.left.name.evaluate(scope, dom, tag);
34
+
35
+ if (this.left instanceof ScopeMemberNode) {
36
+ const inner = await this.left.scope.evaluate(scope, dom, tag);
37
+ if (this.left.scope instanceof ElementQueryNode) {
38
+ scopes.push(...inner);
39
+ } else if (inner instanceof Scope) {
40
+ scopes.push(inner);
41
+ } else if (inner instanceof Controller) {
42
+ scopes.push(inner.scope);
43
+ } else {
44
+ scopes.push(scope)
45
+ }
46
+ } else if ((this.left instanceof ElementAttributeNode || this.left instanceof ElementStyleNode) && this.left.elementRef) {
47
+ scopes = await this.left.elementRef.evaluate(scope, dom, tag);
48
+ } else
49
+ scopes.push(scope);
50
+
51
+ const values = [];
52
+ for (let localScope of scopes) {
53
+ if (localScope instanceof DOMObject) {
54
+ await this.handleDOMObject(name, dom, localScope, tag);
55
+ } else {
56
+ if (localScope['$wrapped'] && localScope['$scope']) {
57
+ localScope = localScope['$scope'];
58
+ }
59
+
60
+ // We get the values from the passed scope, but set the value on the local scope
61
+ let left: number | Array<any> | string = await this.left.evaluate(scope, dom, tag);
62
+ let right: number | Array<any> | string = await this.right.evaluate(scope, dom, tag);
63
+
64
+ if (left instanceof Array) {
65
+ left = this.handleArray(name, left, right, localScope);
66
+ } else if ((left as any) instanceof UnitLiteral || right instanceof UnitLiteral) {
67
+ left = this.handleUnit(name, left, right, localScope);
68
+ } else if (Number.isFinite(left)) {
69
+ left = this.handleNumber(name, left, right, localScope);
70
+ } else {
71
+ left = this.handleString(name, left, right, localScope);
72
+ }
73
+
74
+ values.push(left);
75
+ }
76
+ }
77
+ return values.length > 1 ? values : values[0];
78
+ }
79
+
80
+ public handleNumber(key, left, right, scope) {
81
+ if (right !== null && !Number.isFinite(right))
82
+ right = parseFloat(`${right}`);
83
+
84
+ left = left as number;
85
+ right = right as number;
86
+
87
+ switch (this.type) {
88
+ case TokenType.ASSIGN:
89
+ left = right;
90
+ break;
91
+ case TokenType.ADD_ASSIGN:
92
+ left += right;
93
+ break;
94
+ case TokenType.SUBTRACT_ASSIGN:
95
+ left -= right;
96
+ break;
97
+ case TokenType.MULTIPLY_ASSIGN:
98
+ left *= right;
99
+ break;
100
+ case TokenType.DIVIDE_ASSIGN:
101
+ left /= right;
102
+ break;
103
+ }
104
+ scope.set(key, left);
105
+ return left;
106
+ }
107
+
108
+ public handleString(key, left, right, scope) {
109
+ switch (this.type) {
110
+ case TokenType.ASSIGN:
111
+ left = right;
112
+ break;
113
+ case TokenType.ADD_ASSIGN:
114
+ left = `${left}${right}`;
115
+ break;
116
+ case TokenType.SUBTRACT_ASSIGN:
117
+ left.replace(right, '');
118
+ break;
119
+ case TokenType.MULTIPLY_ASSIGN:
120
+ left *= right;
121
+ break;
122
+ case TokenType.DIVIDE_ASSIGN:
123
+ left /= right;
124
+ break;
125
+ }
126
+
127
+ scope.set(key, left);
128
+ return left;
129
+ }
130
+
131
+ public handleUnit(key, left, right, scope) {
132
+ if (!(left instanceof UnitLiteral)) {
133
+ left = new UnitLiteral(left);
134
+ }
135
+
136
+ if (!(right instanceof UnitLiteral)) {
137
+ right = new UnitLiteral(right);
138
+ }
139
+ const unit = left.unit || right.unit || 'px';
140
+
141
+ switch (this.type) {
142
+ case TokenType.ASSIGN:
143
+ left = right;
144
+ break;
145
+ case TokenType.ADD_ASSIGN:
146
+ left = new UnitLiteral(`${left.amount+right.amount}${unit}`);
147
+ break;
148
+ case TokenType.SUBTRACT_ASSIGN:
149
+ left = new UnitLiteral(`${left.amount-right.amount}${unit}`);
150
+ break;
151
+ case TokenType.MULTIPLY_ASSIGN:
152
+ left = new UnitLiteral(`${left.amount*right.amount}${unit}`);
153
+ break;
154
+ case TokenType.DIVIDE_ASSIGN:
155
+ left = new UnitLiteral(`${left.amount/right.amount}${unit}`);
156
+ break;
157
+ }
158
+
159
+ scope.set(key, left);
160
+ return left;
161
+ }
162
+
163
+ public async handleDOMObject(key: string, dom: DOM, domObject: DOMObject, tag: Tag) {
164
+ let left = domObject.scope.get(key);
165
+ let right: number | Array<any> | string = await this.right.evaluate(domObject.scope, dom, tag);
166
+ if (left instanceof Array)
167
+ return this.handleArray(key, left, right, domObject.scope);
168
+
169
+ return this.handleString(key, left, right, domObject.scope);
170
+ }
171
+
172
+ public handleArray(key, left, right, scope) {
173
+ if (!(right instanceof Array))
174
+ right = [right];
175
+ switch (this.type) {
176
+ case TokenType.ASSIGN:
177
+ left.splice(0, left.length);
178
+ left.push(...right);
179
+ break;
180
+ case TokenType.ADD_ASSIGN:
181
+ left.push(...right);
182
+ break;
183
+ case TokenType.SUBTRACT_ASSIGN:
184
+ for (let i = left.length - 1; i >= 0; i--) {
185
+ if (right.indexOf(left[i]) > -1) {
186
+ left.splice(i, 1);
187
+ i++;
188
+ }
189
+ }
190
+ break;
191
+ case TokenType.TILDE:
192
+ for (const toggle of right) {
193
+ const index = left.indexOf(toggle);
194
+ if (index > -1) {
195
+ left.splice(index, 1);
196
+ } else {
197
+ left.push(toggle);
198
+ }
199
+ }
200
+ break;
201
+ }
202
+
203
+ /*
204
+ We have to trigger a change manually here. Setting the variable on the scope with an array won't trigger
205
+ it since we are modifying values inside of the array instance.
206
+ */
207
+ scope.dispatch(`change:${key}`);
208
+
209
+ return left;
210
+ }
211
+
212
+ public static match(tokens: Token[]): boolean {
213
+ return [
214
+ TokenType.ASSIGN,
215
+ TokenType.ADD_ASSIGN,
216
+ TokenType.SUBTRACT_ASSIGN,
217
+ TokenType.MULTIPLY_ASSIGN,
218
+ TokenType.DIVIDE_ASSIGN,
219
+ TokenType.TILDE,
220
+ ].indexOf(tokens[0].type) > -1;
221
+ }
222
+
223
+ public static parse(lastNode: any, token, tokens: Token[]): ArithmeticAssignmentNode {
224
+ if (!(lastNode instanceof RootScopeMemberNode) && !(lastNode instanceof ScopeMemberNode) && !(lastNode instanceof ElementAttributeNode) && !(lastNode instanceof ElementStyleNode)) {
225
+ throw SyntaxError(`Invalid assignment syntax near ${Tree.toCode(tokens.splice(0, 10))}`);
226
+ }
227
+ tokens.splice(0, 1); // consume =
228
+ const assignmentTokens: Token[] = Tree.getNextStatementTokens(tokens, false, false, true);
229
+
230
+ return new ArithmeticAssignmentNode(
231
+ lastNode as RootScopeMemberNode,
232
+ Tree.processTokens(assignmentTokens),
233
+ token.type
234
+ );
235
+ }
236
+ }
@@ -0,0 +1,52 @@
1
+ import {Scope} from "../Scope";
2
+ import {DOM} from "../DOM";
3
+ import {Tag} from "../Tag";
4
+ import {Token, TokenType, Tree, TreeNode} from "../AST";
5
+ import {Node} from "./Node";
6
+
7
+ export class ArithmeticNode extends Node implements TreeNode {
8
+ constructor(
9
+ public readonly left: TreeNode,
10
+ public readonly right: TreeNode,
11
+ public readonly type: TokenType
12
+ ) {
13
+ super();
14
+ }
15
+
16
+ protected _getChildNodes(): Node[] {
17
+ return [
18
+ this.left as Node,
19
+ this.right as Node
20
+ ]
21
+ }
22
+
23
+ public async evaluate(scope: Scope, dom: DOM, tag: Tag = null) {
24
+ const left: any = await this.left.evaluate(scope, dom, tag);
25
+ const right: any = await this.right.evaluate(scope, dom, tag);
26
+
27
+ switch (this.type) {
28
+ case TokenType.ADD:
29
+ return left + right;
30
+ case TokenType.SUBTRACT:
31
+ return left - right;
32
+ case TokenType.MULTIPLY:
33
+ return left * right;
34
+ case TokenType.DIVIDE:
35
+ return left / right;
36
+ }
37
+ }
38
+
39
+ public static match(tokens: Token[]): boolean {
40
+ return [
41
+ TokenType.ADD,
42
+ TokenType.SUBTRACT,
43
+ TokenType.MULTIPLY,
44
+ TokenType.DIVIDE
45
+ ].indexOf(tokens[0].type) > -1
46
+ }
47
+
48
+ public static parse(lastNode, token, tokens: Token[]) {
49
+ tokens.splice(0, 1); // Remove arithmetic operator
50
+ return new ArithmeticNode(lastNode, Tree.processTokens(Tree.getNextStatementTokens(tokens)), token.type)
51
+ }
52
+ }
@@ -0,0 +1,39 @@
1
+ import {Scope} from "../Scope";
2
+ import {DOM} from "../DOM";
3
+ import {Tag} from "../Tag";
4
+ import {WrappedArray} from "../Scope/WrappedArray";
5
+ import {Token, TokenType, Tree, TreeNode} from "../AST";
6
+ import {Node} from "./Node";
7
+
8
+ export class ArrayNode extends Node implements TreeNode {
9
+ constructor(
10
+ public readonly values: Node[]
11
+ ) {
12
+ super();
13
+ }
14
+
15
+ protected _getChildNodes(): Node[] {
16
+ return new Array(...this.values);
17
+ }
18
+
19
+ async evaluate(scope: Scope, dom: DOM, tag: Tag = null) {
20
+ const arr: WrappedArray<any> = new WrappedArray();
21
+ for (const val of this.values) {
22
+ arr.push(await val.evaluate(scope, dom, tag));
23
+ }
24
+ return arr;
25
+ }
26
+
27
+ public static match(tokens: Token[]): boolean {
28
+ return tokens[0].type === TokenType.L_BRACKET;
29
+ }
30
+
31
+ public static parse(lastNode, token, tokens: Token[]): ArrayNode {
32
+ const valueTokens: Token[][] = Tree.getBlockTokens(tokens);
33
+ const values: Node[] = [];
34
+ for (const arg of valueTokens) {
35
+ values.push(Tree.processTokens(arg));
36
+ }
37
+ return new ArrayNode(values);
38
+ }
39
+ }
@@ -0,0 +1,25 @@
1
+ import {Scope} from "../Scope";
2
+ import {DOM} from "../DOM";
3
+ import {Tag} from "../Tag";
4
+ import {TreeNode} from "../AST";
5
+ import {Node} from "./Node";
6
+
7
+ export class BlockNode extends Node implements TreeNode {
8
+ constructor(
9
+ public readonly statements: Node[]
10
+ ) {
11
+ super();
12
+ }
13
+
14
+ protected _getChildNodes(): Node[] {
15
+ return [...(this.statements as Node[])];
16
+ }
17
+
18
+ public async evaluate(scope: Scope, dom: DOM, tag: Tag = null) {
19
+ let returnValue: any = null;
20
+ for (let i = 0; i < this.statements.length; i++) {
21
+ returnValue = await this.statements[i].evaluate(scope, dom, tag);
22
+ }
23
+ return returnValue;
24
+ }
25
+ }
@@ -0,0 +1,10 @@
1
+ import {LiteralNode} from "./LiteralNode";
2
+
3
+ export class BooleanLiteralNode extends LiteralNode<number> {
4
+ constructor(
5
+ public readonly value: any
6
+ ) {
7
+ super(value);
8
+ this.value = value === 'true';
9
+ }
10
+ }
@@ -0,0 +1,57 @@
1
+ import {Scope} from "../Scope";
2
+ import {DOM} from "../DOM";
3
+ import {Tag} from "../Tag";
4
+ import {Token, TokenType, Tree, TreeNode} from "../AST";
5
+ import {Node} from "./Node";
6
+
7
+ export class ComparisonNode extends Node implements TreeNode {
8
+ constructor(
9
+ public readonly left: Node,
10
+ public readonly right: Node,
11
+ public readonly type: TokenType
12
+ ) {
13
+ super();
14
+ }
15
+
16
+ protected _getChildNodes(): Node[] {
17
+ return [
18
+ this.left as Node,
19
+ this.right as Node
20
+ ];
21
+ }
22
+
23
+ public async evaluate(scope: Scope, dom: DOM, tag: Tag = null) {
24
+ const left: any = await this.left.evaluate(scope, dom, tag);
25
+ const right: any = await this.right.evaluate(scope, dom, tag);
26
+ switch (this.type) {
27
+ case TokenType.EQUALS:
28
+ return left === right;
29
+ case TokenType.NOT_EQUALS:
30
+ return left !== right;
31
+ case TokenType.GREATER_THAN:
32
+ return left > right;
33
+ case TokenType.LESS_THAN:
34
+ return left < right;
35
+ case TokenType.GREATER_THAN_EQUAL:
36
+ return left >= right;
37
+ case TokenType.LESS_THAN_EQUAL:
38
+ return left <= right;
39
+ }
40
+ }
41
+
42
+ public static match(tokens: Token[]): boolean {
43
+ return [
44
+ TokenType.EQUALS,
45
+ TokenType.NOT_EQUALS,
46
+ TokenType.GREATER_THAN,
47
+ TokenType.LESS_THAN,
48
+ TokenType.GREATER_THAN_EQUAL,
49
+ TokenType.LESS_THAN_EQUAL
50
+ ].indexOf(tokens[0].type) > -1
51
+ }
52
+
53
+ public static parse(lastNode, token, tokens: Token[]) {
54
+ tokens.splice(0, 1); // Remove comparison operator
55
+ return new ComparisonNode(lastNode, Tree.processTokens(Tree.getNextStatementTokens(tokens)), token.type)
56
+ }
57
+ }
@@ -0,0 +1,36 @@
1
+ import {Scope} from "../Scope";
2
+ import {DOM} from "../DOM";
3
+ import {Tag} from "../Tag";
4
+ import {WrappedArray} from "../Scope/WrappedArray";
5
+ import {TreeNode} from "../AST";
6
+ import {BlockNode} from "./BlockNode";
7
+ import {Node} from "./Node";
8
+
9
+ export class ConditionalNode extends Node implements TreeNode {
10
+ constructor(
11
+ public readonly condition: Node,
12
+ public readonly block: BlockNode
13
+ ) {
14
+ super();
15
+ }
16
+
17
+ protected _getChildNodes(): Node[] {
18
+ return [
19
+ this.condition as Node,
20
+ this.block as Node
21
+ ];
22
+ }
23
+
24
+ public async evaluate(scope: Scope, dom: DOM, tag: Tag = null) {
25
+ const condition = await this.condition.evaluate(scope, dom, tag);
26
+ let evaluation = false;
27
+
28
+ if (condition instanceof WrappedArray) {
29
+ evaluation = condition.length > 0;
30
+ } else {
31
+ evaluation = !!condition;
32
+ }
33
+
34
+ return evaluation;
35
+ }
36
+ }