vsn 0.1.17 → 0.1.20

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 (123) hide show
  1. package/demo/demo.html +9 -2
  2. package/demo/vision.js +1 -1
  3. package/dist/AST.d.ts +2 -1
  4. package/dist/AST.js +2107 -0
  5. package/dist/AST.js.map +1 -0
  6. package/dist/Attribute.js +187 -0
  7. package/dist/Attribute.js.map +1 -0
  8. package/dist/Bencmark.js +179 -0
  9. package/dist/Bencmark.js.map +1 -0
  10. package/dist/Configuration.js +64 -0
  11. package/dist/Configuration.js.map +1 -0
  12. package/dist/Controller.js +39 -0
  13. package/dist/Controller.js.map +1 -0
  14. package/dist/DOM/DOMObject.d.ts +1 -0
  15. package/dist/DOM/DOMObject.js +47 -0
  16. package/dist/DOM/DOMObject.js.map +1 -0
  17. package/dist/DOM/WrappedDocument.js +34 -0
  18. package/dist/DOM/WrappedDocument.js.map +1 -0
  19. package/dist/DOM/WrappedWindow.js +45 -0
  20. package/dist/DOM/WrappedWindow.js.map +1 -0
  21. package/dist/DOM.js +547 -0
  22. package/dist/DOM.js.map +1 -0
  23. package/dist/Formats.js +44 -0
  24. package/dist/Formats.js.map +1 -0
  25. package/dist/Query.js +66 -0
  26. package/dist/Query.js.map +1 -0
  27. package/dist/Registry.js +138 -0
  28. package/dist/Registry.js.map +1 -0
  29. package/dist/Scope.d.ts +2 -1
  30. package/dist/Scope.js +512 -0
  31. package/dist/Scope.js.map +1 -0
  32. package/dist/Tag/List.js +85 -0
  33. package/dist/Tag/List.js.map +1 -0
  34. package/dist/Tag.d.ts +3 -0
  35. package/dist/Tag.js +764 -0
  36. package/dist/Tag.js.map +1 -0
  37. package/dist/Types.js +48 -0
  38. package/dist/Types.js.map +1 -0
  39. package/dist/Vision.d.ts +1 -1
  40. package/dist/Vision.js +162 -0
  41. package/dist/Vision.js.map +1 -0
  42. package/dist/attributes/AddClassIf.js +93 -0
  43. package/dist/attributes/AddClassIf.js.map +1 -0
  44. package/dist/attributes/Bind.js +272 -0
  45. package/dist/attributes/Bind.js.map +1 -0
  46. package/dist/attributes/ClassConstructor.js +104 -0
  47. package/dist/attributes/ClassConstructor.js.map +1 -0
  48. package/dist/attributes/ClickRemoveClass.js +102 -0
  49. package/dist/attributes/ClickRemoveClass.js.map +1 -0
  50. package/dist/attributes/ClickToggleClass.js +102 -0
  51. package/dist/attributes/ClickToggleClass.js.map +1 -0
  52. package/dist/attributes/ControllerAttribute.js +28 -0
  53. package/dist/attributes/ControllerAttribute.js.map +1 -0
  54. package/dist/attributes/DisableIf.js +94 -0
  55. package/dist/attributes/DisableIf.js.map +1 -0
  56. package/dist/attributes/Exec.js +102 -0
  57. package/dist/attributes/Exec.js.map +1 -0
  58. package/dist/attributes/Format.js +96 -0
  59. package/dist/attributes/Format.js.map +1 -0
  60. package/dist/attributes/If.js +147 -0
  61. package/dist/attributes/If.js.map +1 -0
  62. package/dist/attributes/JSONAttribute.js +115 -0
  63. package/dist/attributes/JSONAttribute.js.map +1 -0
  64. package/dist/attributes/KeyAbstract.js +110 -0
  65. package/dist/attributes/KeyAbstract.js.map +1 -0
  66. package/dist/attributes/KeyDown.js +82 -0
  67. package/dist/attributes/KeyDown.js.map +1 -0
  68. package/dist/attributes/KeyUp.js +82 -0
  69. package/dist/attributes/KeyUp.js.map +1 -0
  70. package/dist/attributes/List.js +273 -0
  71. package/dist/attributes/List.js.map +1 -0
  72. package/dist/attributes/ListItem.js +135 -0
  73. package/dist/attributes/ListItem.js.map +1 -0
  74. package/dist/attributes/ListItemModel.js +39 -0
  75. package/dist/attributes/ListItemModel.js.map +1 -0
  76. package/dist/attributes/ModelAttribute.js +29 -0
  77. package/dist/attributes/ModelAttribute.js.map +1 -0
  78. package/dist/attributes/Name.js +88 -0
  79. package/dist/attributes/Name.js.map +1 -0
  80. package/dist/attributes/On.js +123 -0
  81. package/dist/attributes/On.js.map +1 -0
  82. package/dist/attributes/Radio.js +127 -0
  83. package/dist/attributes/Radio.js.map +1 -0
  84. package/dist/attributes/Referenced.js +38 -0
  85. package/dist/attributes/Referenced.js.map +1 -0
  86. package/dist/attributes/RootAttribute.js +85 -0
  87. package/dist/attributes/RootAttribute.js.map +1 -0
  88. package/dist/attributes/ScopeAttribute.js +40 -0
  89. package/dist/attributes/ScopeAttribute.js.map +1 -0
  90. package/dist/attributes/ScopeChange.js +124 -0
  91. package/dist/attributes/ScopeChange.js.map +1 -0
  92. package/dist/attributes/SetAttribute.js +130 -0
  93. package/dist/attributes/SetAttribute.js.map +1 -0
  94. package/dist/attributes/StandardAttribute.js +168 -0
  95. package/dist/attributes/StandardAttribute.js.map +1 -0
  96. package/dist/attributes/StyleAttribute.d.ts +11 -0
  97. package/dist/attributes/StyleAttribute.js +167 -0
  98. package/dist/attributes/StyleAttribute.js.map +1 -0
  99. package/dist/attributes/Template.js +39 -0
  100. package/dist/attributes/Template.js.map +1 -0
  101. package/dist/attributes/TypeAttribute.js +101 -0
  102. package/dist/attributes/TypeAttribute.js.map +1 -0
  103. package/dist/attributes/_imports.d.ts +1 -0
  104. package/dist/attributes/_imports.js +60 -0
  105. package/dist/attributes/_imports.js.map +1 -0
  106. package/dist/helpers/DOMHelper.js +81 -0
  107. package/dist/helpers/DOMHelper.js.map +1 -0
  108. package/dist/helpers/ElementHelper.js +25 -0
  109. package/dist/helpers/ElementHelper.js.map +1 -0
  110. package/dist/helpers/VisionHelper.js +71 -0
  111. package/dist/helpers/VisionHelper.js.map +1 -0
  112. package/dist/helpers/decorators.js +38 -0
  113. package/dist/helpers/decorators.js.map +1 -0
  114. package/package.json +1 -1
  115. package/src/AST.ts +70 -7
  116. package/src/DOM/DOMObject.ts +4 -0
  117. package/src/Scope.ts +11 -8
  118. package/src/Tag.ts +33 -0
  119. package/src/Vision.ts +1 -1
  120. package/src/attributes/StyleAttribute.ts +68 -0
  121. package/src/attributes/_imports.ts +1 -0
  122. package/test/attributes/Styles.spec.ts +32 -0
  123. package/dist/vision.min.js +0 -1
@@ -23,5 +23,6 @@ export { ScopeAttribute } from "./ScopeAttribute";
23
23
  export { ScopeChange } from "./ScopeChange";
24
24
  export { SetAttribute } from "./SetAttribute";
25
25
  export { StandardAttribute } from "./StandardAttribute";
26
+ export { StyleAttribute } from "./StyleAttribute";
26
27
  export { Template } from "./Template";
27
28
  export { TypeAttribute } from "./TypeAttribute";
@@ -0,0 +1,60 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.TypeAttribute = exports.Template = exports.StyleAttribute = exports.StandardAttribute = exports.SetAttribute = exports.ScopeChange = exports.ScopeAttribute = exports.RootAttribute = exports.Referenced = exports.Radio = exports.On = exports.Name = exports.ModelAttribute = exports.ListItemModel = exports.ListItem = exports.List = exports.KeyUp = exports.KeyDown = exports.JSONAttribute = exports.If = exports.Format = exports.Exec = exports.DisableIf = exports.ControllerAttribute = exports.ClickToggleClass = exports.ClickRemoveClass = exports.Bind = exports.AddClassIf = void 0;
4
+ var AddClassIf_1 = require("./AddClassIf");
5
+ Object.defineProperty(exports, "AddClassIf", { enumerable: true, get: function () { return AddClassIf_1.AddClassIf; } });
6
+ var Bind_1 = require("./Bind");
7
+ Object.defineProperty(exports, "Bind", { enumerable: true, get: function () { return Bind_1.Bind; } });
8
+ var ClickRemoveClass_1 = require("./ClickRemoveClass");
9
+ Object.defineProperty(exports, "ClickRemoveClass", { enumerable: true, get: function () { return ClickRemoveClass_1.ClickRemoveClass; } });
10
+ var ClickToggleClass_1 = require("./ClickToggleClass");
11
+ Object.defineProperty(exports, "ClickToggleClass", { enumerable: true, get: function () { return ClickToggleClass_1.ClickToggleClass; } });
12
+ var ControllerAttribute_1 = require("./ControllerAttribute");
13
+ Object.defineProperty(exports, "ControllerAttribute", { enumerable: true, get: function () { return ControllerAttribute_1.ControllerAttribute; } });
14
+ var DisableIf_1 = require("./DisableIf");
15
+ Object.defineProperty(exports, "DisableIf", { enumerable: true, get: function () { return DisableIf_1.DisableIf; } });
16
+ var Exec_1 = require("./Exec");
17
+ Object.defineProperty(exports, "Exec", { enumerable: true, get: function () { return Exec_1.Exec; } });
18
+ var Format_1 = require("./Format");
19
+ Object.defineProperty(exports, "Format", { enumerable: true, get: function () { return Format_1.Format; } });
20
+ var If_1 = require("./If");
21
+ Object.defineProperty(exports, "If", { enumerable: true, get: function () { return If_1.If; } });
22
+ var JSONAttribute_1 = require("./JSONAttribute");
23
+ Object.defineProperty(exports, "JSONAttribute", { enumerable: true, get: function () { return JSONAttribute_1.JSONAttribute; } });
24
+ var KeyDown_1 = require("./KeyDown");
25
+ Object.defineProperty(exports, "KeyDown", { enumerable: true, get: function () { return KeyDown_1.KeyDown; } });
26
+ var KeyUp_1 = require("./KeyUp");
27
+ Object.defineProperty(exports, "KeyUp", { enumerable: true, get: function () { return KeyUp_1.KeyUp; } });
28
+ var List_1 = require("./List");
29
+ Object.defineProperty(exports, "List", { enumerable: true, get: function () { return List_1.List; } });
30
+ var ListItem_1 = require("./ListItem");
31
+ Object.defineProperty(exports, "ListItem", { enumerable: true, get: function () { return ListItem_1.ListItem; } });
32
+ var ListItemModel_1 = require("./ListItemModel");
33
+ Object.defineProperty(exports, "ListItemModel", { enumerable: true, get: function () { return ListItemModel_1.ListItemModel; } });
34
+ var ModelAttribute_1 = require("./ModelAttribute");
35
+ Object.defineProperty(exports, "ModelAttribute", { enumerable: true, get: function () { return ModelAttribute_1.ModelAttribute; } });
36
+ var Name_1 = require("./Name");
37
+ Object.defineProperty(exports, "Name", { enumerable: true, get: function () { return Name_1.Name; } });
38
+ var On_1 = require("./On");
39
+ Object.defineProperty(exports, "On", { enumerable: true, get: function () { return On_1.On; } });
40
+ var Radio_1 = require("./Radio");
41
+ Object.defineProperty(exports, "Radio", { enumerable: true, get: function () { return Radio_1.Radio; } });
42
+ var Referenced_1 = require("./Referenced");
43
+ Object.defineProperty(exports, "Referenced", { enumerable: true, get: function () { return Referenced_1.Referenced; } });
44
+ var RootAttribute_1 = require("./RootAttribute");
45
+ Object.defineProperty(exports, "RootAttribute", { enumerable: true, get: function () { return RootAttribute_1.RootAttribute; } });
46
+ var ScopeAttribute_1 = require("./ScopeAttribute");
47
+ Object.defineProperty(exports, "ScopeAttribute", { enumerable: true, get: function () { return ScopeAttribute_1.ScopeAttribute; } });
48
+ var ScopeChange_1 = require("./ScopeChange");
49
+ Object.defineProperty(exports, "ScopeChange", { enumerable: true, get: function () { return ScopeChange_1.ScopeChange; } });
50
+ var SetAttribute_1 = require("./SetAttribute");
51
+ Object.defineProperty(exports, "SetAttribute", { enumerable: true, get: function () { return SetAttribute_1.SetAttribute; } });
52
+ var StandardAttribute_1 = require("./StandardAttribute");
53
+ Object.defineProperty(exports, "StandardAttribute", { enumerable: true, get: function () { return StandardAttribute_1.StandardAttribute; } });
54
+ var StyleAttribute_1 = require("./StyleAttribute");
55
+ Object.defineProperty(exports, "StyleAttribute", { enumerable: true, get: function () { return StyleAttribute_1.StyleAttribute; } });
56
+ var Template_1 = require("./Template");
57
+ Object.defineProperty(exports, "Template", { enumerable: true, get: function () { return Template_1.Template; } });
58
+ var TypeAttribute_1 = require("./TypeAttribute");
59
+ Object.defineProperty(exports, "TypeAttribute", { enumerable: true, get: function () { return TypeAttribute_1.TypeAttribute; } });
60
+ //# sourceMappingURL=_imports.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"_imports.js","sourceRoot":"","sources":["../../src/attributes/_imports.ts"],"names":[],"mappings":";;;AAAA,2CAAwC;AAAhC,wGAAA,UAAU,OAAA;AAClB,+BAA4B;AAApB,4FAAA,IAAI,OAAA;AACZ,uDAAoD;AAA5C,oHAAA,gBAAgB,OAAA;AACxB,uDAAoD;AAA5C,oHAAA,gBAAgB,OAAA;AACxB,6DAA0D;AAAlD,0HAAA,mBAAmB,OAAA;AAC3B,yCAAsC;AAA9B,sGAAA,SAAS,OAAA;AACjB,+BAA4B;AAApB,4FAAA,IAAI,OAAA;AACZ,mCAAgC;AAAxB,gGAAA,MAAM,OAAA;AACd,2BAAwB;AAAhB,wFAAA,EAAE,OAAA;AACV,iDAA8C;AAAtC,8GAAA,aAAa,OAAA;AACrB,qCAAkC;AAA1B,kGAAA,OAAO,OAAA;AACf,iCAA8B;AAAtB,8FAAA,KAAK,OAAA;AACb,+BAA4B;AAApB,4FAAA,IAAI,OAAA;AACZ,uCAAoC;AAA5B,oGAAA,QAAQ,OAAA;AAChB,iDAA8C;AAAtC,8GAAA,aAAa,OAAA;AACrB,mDAAgD;AAAxC,gHAAA,cAAc,OAAA;AACtB,+BAA4B;AAApB,4FAAA,IAAI,OAAA;AACZ,2BAAwB;AAAhB,wFAAA,EAAE,OAAA;AACV,iCAA8B;AAAtB,8FAAA,KAAK,OAAA;AACb,2CAAwC;AAAhC,wGAAA,UAAU,OAAA;AAClB,iDAA8C;AAAtC,8GAAA,aAAa,OAAA;AACrB,mDAAgD;AAAxC,gHAAA,cAAc,OAAA;AACtB,6CAA0C;AAAlC,0GAAA,WAAW,OAAA;AACnB,+CAA4C;AAApC,4GAAA,YAAY,OAAA;AACpB,yDAAsD;AAA9C,sHAAA,iBAAiB,OAAA;AACzB,mDAAgD;AAAxC,gHAAA,cAAc,OAAA;AACtB,uCAAoC;AAA5B,oGAAA,QAAQ,OAAA;AAChB,iDAA8C;AAAtC,8GAAA,aAAa,OAAA"}
@@ -0,0 +1,81 @@
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.DOMHelper = void 0;
40
+ var DOMHelper = /** @class */ (function () {
41
+ function DOMHelper() {
42
+ }
43
+ DOMHelper.walk = function (e, fnc, callOnBaseElement) {
44
+ if (callOnBaseElement === void 0) { callOnBaseElement = true; }
45
+ return __awaiter(this, void 0, void 0, function () {
46
+ var len, i;
47
+ return __generator(this, function (_a) {
48
+ switch (_a.label) {
49
+ case 0:
50
+ if (!callOnBaseElement) return [3 /*break*/, 2];
51
+ return [4 /*yield*/, fnc(e)];
52
+ case 1:
53
+ _a.sent();
54
+ _a.label = 2;
55
+ case 2:
56
+ len = e.childNodes.length;
57
+ if (len <= 0)
58
+ return [2 /*return*/];
59
+ i = 0;
60
+ _a.label = 3;
61
+ case 3:
62
+ if (!(i < len)) return [3 /*break*/, 6];
63
+ if (!e.childNodes[i]) {
64
+ return [3 /*break*/, 5];
65
+ }
66
+ return [4 /*yield*/, DOMHelper.walk(e.childNodes[i], fnc, true)];
67
+ case 4:
68
+ _a.sent();
69
+ _a.label = 5;
70
+ case 5:
71
+ i++;
72
+ return [3 /*break*/, 3];
73
+ case 6: return [2 /*return*/];
74
+ }
75
+ });
76
+ });
77
+ };
78
+ return DOMHelper;
79
+ }());
80
+ exports.DOMHelper = DOMHelper;
81
+ //# sourceMappingURL=DOMHelper.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DOMHelper.js","sourceRoot":"","sources":["../../src/helpers/DOMHelper.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AACA;IAAA;IAeA,CAAC;IAduB,cAAI,GAAxB,UAAyB,CAAc,EAAE,GAA6B,EAAE,iBAAiC;QAAjC,kCAAA,EAAA,wBAAiC;;;;;;6BACjG,iBAAiB,EAAjB,wBAAiB;wBACjB,qBAAM,GAAG,CAAC,CAAC,CAAC,EAAA;;wBAAZ,SAAY,CAAC;;;wBAEX,GAAG,GAAW,CAAC,CAAC,UAAU,CAAC,MAAM,CAAC;wBACxC,IAAI,GAAG,IAAI,CAAC;4BAAE,sBAAO;wBACZ,CAAC,GAAG,CAAC;;;6BAAE,CAAA,CAAC,GAAG,GAAG,CAAA;wBACnB,IAAG,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,EAAC;4BAChB,wBAAS;yBACZ;wBAED,qBAAM,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAgB,EAAE,GAAG,EAAE,IAAI,CAAC,EAAA;;wBAA/D,SAA+D,CAAC;;;wBAL3C,CAAC,EAAE,CAAA;;;;;;KAO/B;IACL,gBAAC;AAAD,CAAC,AAfD,IAeC;AAfY,8BAAS"}
@@ -0,0 +1,25 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ElementHelper = void 0;
4
+ var ElementHelper = /** @class */ (function () {
5
+ function ElementHelper() {
6
+ }
7
+ ElementHelper.hasVisionAttribute = function (element, testAttr) {
8
+ if (testAttr === void 0) { testAttr = 'vsn-'; }
9
+ if (!element.attributes || element.attributes.length <= 0)
10
+ return false;
11
+ for (var i = 0; i < element.attributes.length; i++) {
12
+ var attr = element.attributes[i];
13
+ if (attr.name.startsWith(testAttr)) {
14
+ return true;
15
+ }
16
+ }
17
+ return false;
18
+ };
19
+ ElementHelper.normalizeElementID = function (id) {
20
+ return id ? id.replace(/-([a-zA-Z0-9])/g, function (g) { return g[1].toUpperCase(); }) : null;
21
+ };
22
+ return ElementHelper;
23
+ }());
24
+ exports.ElementHelper = ElementHelper;
25
+ //# sourceMappingURL=ElementHelper.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ElementHelper.js","sourceRoot":"","sources":["../../src/helpers/ElementHelper.ts"],"names":[],"mappings":";;;AACA;IAAA;IAiBA,CAAC;IAhBiB,gCAAkB,GAAhC,UAAiC,OAA8B,EAAE,QAAyB;QAAzB,yBAAA,EAAA,iBAAyB;QACtF,IAAI,CAAC,OAAO,CAAC,UAAU,IAAI,OAAO,CAAC,UAAU,CAAC,MAAM,IAAI,CAAC;YAAE,OAAO,KAAK,CAAC;QACxE,KAAK,IAAI,CAAC,GAAW,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,UAAU,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;YACxD,IAAM,IAAI,GAAS,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;YACzC,IAAI,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,EAClC;gBACI,OAAO,IAAI,CAAC;aACf;SACJ;QAED,OAAO,KAAK,CAAC;IACjB,CAAC;IAEa,gCAAkB,GAAhC,UAAiC,EAAU;QACvC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,iBAAiB,EAAE,UAAU,CAAC,IAAI,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IAClG,CAAC;IACL,oBAAC;AAAD,CAAC,AAjBD,IAiBC;AAjBY,sCAAa"}
@@ -0,0 +1,71 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.VisionHelper = void 0;
4
+ var VisionHelper = /** @class */ (function () {
5
+ function VisionHelper() {
6
+ }
7
+ VisionHelper.isConstructor = function (obj) {
8
+ return obj &&
9
+ obj.hasOwnProperty("prototype") &&
10
+ !!obj.prototype &&
11
+ !!obj.prototype.constructor &&
12
+ !!obj.prototype.constructor.name;
13
+ };
14
+ Object.defineProperty(VisionHelper, "document", {
15
+ get: function () {
16
+ return typeof document === 'object' ? document : null;
17
+ },
18
+ enumerable: false,
19
+ configurable: true
20
+ });
21
+ Object.defineProperty(VisionHelper, "window", {
22
+ get: function () {
23
+ return typeof window === 'object' ? window : null;
24
+ },
25
+ enumerable: false,
26
+ configurable: true
27
+ });
28
+ VisionHelper.isMobile = function () {
29
+ var check = false;
30
+ if (navigator && VisionHelper.window) {
31
+ (function (a) {
32
+ if (/(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows ce|xda|xiino/i.test(a) || /1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi|ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do(c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\-|_)|g1 u|g560|gene|gf\-5|g\-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd\-(m|p|t)|hei\-|hi(pt|ta)|hp( i|ip)|hs\-c|ht(c(\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)|i230|iac( |\-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc\-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|\-[a-w])|libw|lynx|m1\-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\-2|po(ck|rt|se)|prox|psio|pt\-g|qa\-a|qc(07|12|21|32|60|\-[2-7]|i\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\-|oo|p\-)|sdk\/|se(c(\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\-|v\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\-|tdg\-|tel(i|m)|tim\-|t\-mo|to(pl|sh)|ts(70|m\-|m3|m5)|tx\-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\-|your|zeto|zte\-/i.test(a.substr(0, 4)))
33
+ check = true;
34
+ })(navigator.userAgent || navigator.vendor || window['opera']);
35
+ }
36
+ return check;
37
+ };
38
+ Object.defineProperty(VisionHelper, "inDevelopment", {
39
+ get: function () {
40
+ return IN_DEVELOPMENT;
41
+ },
42
+ enumerable: false,
43
+ configurable: true
44
+ });
45
+ Object.defineProperty(VisionHelper, "doBenchmark", {
46
+ get: function () {
47
+ return DO_BENCHMARK;
48
+ },
49
+ enumerable: false,
50
+ configurable: true
51
+ });
52
+ Object.defineProperty(VisionHelper, "inLegacy", {
53
+ get: function () {
54
+ return process.env.BUILD_TARGET === 'es5';
55
+ },
56
+ enumerable: false,
57
+ configurable: true
58
+ });
59
+ VisionHelper.nice = function (callback, timeout) {
60
+ if (timeout === void 0) { timeout = 100; }
61
+ if (VisionHelper.window && window['requestIdleCallback']) {
62
+ window['requestIdleCallback'](callback);
63
+ }
64
+ else {
65
+ setTimeout(callback, timeout);
66
+ }
67
+ };
68
+ return VisionHelper;
69
+ }());
70
+ exports.VisionHelper = VisionHelper;
71
+ //# sourceMappingURL=VisionHelper.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"VisionHelper.js","sourceRoot":"","sources":["../../src/helpers/VisionHelper.ts"],"names":[],"mappings":";;;AAGA;IAAA;IA8CA,CAAC;IA7CiB,0BAAa,GAA3B,UAA4B,GAAQ;QAChC,OAAO,GAAG;YACN,GAAG,CAAC,cAAc,CAAC,WAAW,CAAC;YAC/B,CAAC,CAAC,GAAG,CAAC,SAAS;YACf,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,WAAW;YAC3B,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,WAAW,CAAC,IAAI,CAAC;IACzC,CAAC;IAED,sBAAkB,wBAAQ;aAA1B;YACI,OAAO,OAAO,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC;QAC1D,CAAC;;;OAAA;IAED,sBAAkB,sBAAM;aAAxB;YACI,OAAO,OAAO,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC;QACtD,CAAC;;;OAAA;IAEa,qBAAQ,GAAtB;QACI,IAAI,KAAK,GAAG,KAAK,CAAC;QAClB,IAAI,SAAS,IAAI,YAAY,CAAC,MAAM,EAAE;YAClC,CAAC,UAAU,CAAC;gBACR,IAAI,0TAA0T,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,ykDAAykD,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;oBAAE,KAAK,GAAG,IAAI,CAAC;YAC37D,CAAC,CAAC,CAAC,SAAS,CAAC,SAAS,IAAI,SAAS,CAAC,MAAM,IAAI,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC;SAClE;QACD,OAAO,KAAK,CAAC;IACjB,CAAC;IAED,sBAAkB,6BAAa;aAA/B;YACI,OAAO,cAAc,CAAC;QAC1B,CAAC;;;OAAA;IAED,sBAAkB,2BAAW;aAA7B;YACI,OAAO,YAAY,CAAC;QACxB,CAAC;;;OAAA;IAED,sBAAkB,wBAAQ;aAA1B;YACI,OAAO,OAAO,CAAC,GAAG,CAAC,YAAY,KAAK,KAAK,CAAC;QAC9C,CAAC;;;OAAA;IAEa,iBAAI,GAAlB,UAAmB,QAAQ,EAAE,OAAqB;QAArB,wBAAA,EAAA,aAAqB;QAC9C,IAAI,YAAY,CAAC,MAAM,IAAI,MAAM,CAAC,qBAAqB,CAAC,EAAE;YACtD,MAAM,CAAC,qBAAqB,CAAC,CAAC,QAAQ,CAAC,CAAC;SAC3C;aAAM;YACH,UAAU,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;SACjC;IACL,CAAC;IACL,mBAAC;AAAD,CAAC,AA9CD,IA8CC;AA9CY,oCAAY"}
@@ -0,0 +1,38 @@
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
+ Object.defineProperty(exports, "__esModule", { value: true });
18
+ exports.extendsarray = void 0;
19
+ function extendsarray(target) {
20
+ return /** @class */ (function (_super) {
21
+ __extends(class_1, _super);
22
+ function class_1() {
23
+ var args = [];
24
+ for (var _i = 0; _i < arguments.length; _i++) {
25
+ args[_i] = arguments[_i];
26
+ }
27
+ var _this = _super.apply(this, args) || this;
28
+ for (var c in target.prototype) {
29
+ _this[c] = target.prototype[c];
30
+ }
31
+ return _this;
32
+ }
33
+ return class_1;
34
+ }(target));
35
+ ;
36
+ }
37
+ exports.extendsarray = extendsarray;
38
+ //# sourceMappingURL=decorators.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"decorators.js","sourceRoot":"","sources":["../../src/helpers/decorators.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;AACA,SAAgB,YAAY,CAAyC,MAAS;IAC1E;QAAqB,2BAAM;QACvB;YAAY,cAAO;iBAAP,UAAO,EAAP,qBAAO,EAAP,IAAO;gBAAP,yBAAO;;YAAnB,+BACa,IAAI,UAIhB;YAHG,KAAK,IAAM,CAAC,IAAI,MAAM,CAAC,SAAS,EAAE;gBAC9B,KAAI,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;aACjC;;QACL,CAAC;QACL,cAAC;IAAD,CAAC,AAPM,CAAc,MAAM,GAOzB;IAAA,CAAC;AACP,CAAC;AATD,oCASC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "vsn",
3
- "version": "0.1.17",
3
+ "version": "0.1.20",
4
4
  "description": "SEO Friendly Javascript/Typescript Framework",
5
5
  "keywords": [
6
6
  "framework",
package/src/AST.ts CHANGED
@@ -77,6 +77,7 @@ export enum TokenType {
77
77
  EXCLAMATION_POINT,
78
78
  ELEMENT_REFERENCE,
79
79
  ELEMENT_ATTRIBUTE,
80
+ ELEMENT_STYLE,
80
81
  ELEMENT_QUERY
81
82
  }
82
83
 
@@ -127,24 +128,28 @@ const TOKEN_PATTERNS: TokenPattern[] = [
127
128
  },
128
129
  {
129
130
  type: TokenType.FOR,
130
- pattern: /^for\s/
131
+ pattern: /^for\s?(?=\()/
131
132
  },
132
133
  {
133
134
  type: TokenType.IF,
134
- pattern: /^if\s/
135
+ pattern: /^if\s?(?=\()/
135
136
  },
136
137
  {
137
138
  type: TokenType.ELSE_IF,
138
- pattern: /^else if\s/
139
+ pattern: /^else if\s?(?=\()/
139
140
  },
140
141
  {
141
142
  type: TokenType.ELSE,
142
- pattern: /^else\s/
143
+ pattern: /^else\s?(?=\{)/
143
144
  },
144
145
  {
145
146
  type: TokenType.ELEMENT_ATTRIBUTE,
146
147
  pattern: /^\.?@[_a-zA-Z0-9]*/
147
148
  },
149
+ {
150
+ type: TokenType.ELEMENT_STYLE,
151
+ pattern: /^\.?\$[a-zA-Z0-9]*/
152
+ },
148
153
  {
149
154
  type: TokenType.ELEMENT_REFERENCE,
150
155
  pattern: /^#[-_a-zA-Z0-9]*/
@@ -155,7 +160,7 @@ const TOKEN_PATTERNS: TokenPattern[] = [
155
160
  },
156
161
  {
157
162
  type: TokenType.NAME,
158
- pattern: /^[$_a-zA-Z][_a-zA-Z0-9]*/
163
+ pattern: /^[_a-zA-Z][_a-zA-Z0-9]*/
159
164
  },
160
165
  {
161
166
  type: TokenType.NUMBER_LITERAL,
@@ -872,7 +877,7 @@ class ArithmeticAssignmentNode extends Node implements TreeNode {
872
877
  } else {
873
878
  scopes.push(inner);
874
879
  }
875
- } else if (this.left instanceof ElementAttributeNode && this.left.elementRef) {
880
+ } else if ((this.left instanceof ElementAttributeNode || this.left instanceof ElementStyleNode) && this.left.elementRef) {
876
881
  scopes = await this.left.elementRef.evaluate(scope, dom, tag);
877
882
  } else
878
883
  scopes.push(scope);
@@ -1014,7 +1019,7 @@ class ArithmeticAssignmentNode extends Node implements TreeNode {
1014
1019
  }
1015
1020
 
1016
1021
  public static parse(lastNode: any, token, tokens: Token[]): ArithmeticAssignmentNode {
1017
- if (!(lastNode instanceof RootScopeMemberNode) && !(lastNode instanceof ScopeMemberNode) && !(lastNode instanceof ElementAttributeNode)) {
1022
+ if (!(lastNode instanceof RootScopeMemberNode) && !(lastNode instanceof ScopeMemberNode) && !(lastNode instanceof ElementAttributeNode) && !(lastNode instanceof ElementStyleNode)) {
1018
1023
  throw SyntaxError(`Invalid assignment syntax near ${Tree.toCode(tokens.splice(0, 10))}`);
1019
1024
  }
1020
1025
  tokens.splice(0, 1); // consume =
@@ -1242,6 +1247,61 @@ class ElementAttributeNode extends Node implements TreeNode {
1242
1247
  }
1243
1248
  }
1244
1249
 
1250
+ class ElementStyleNode extends Node implements TreeNode {
1251
+ protected requiresPrep: boolean = true;
1252
+
1253
+ constructor(
1254
+ public readonly elementRef: ElementQueryNode | null,
1255
+ public readonly attr: string
1256
+ ) {
1257
+ super();
1258
+ }
1259
+
1260
+ public get name(): LiteralNode<string> {
1261
+ return new LiteralNode<string>(`$${this.attributeName}`);
1262
+ }
1263
+
1264
+ protected _getChildNodes(): Node[] {
1265
+ let nodes = [];
1266
+ if (this.elementRef)
1267
+ nodes.push(this.elementRef)
1268
+ return nodes;
1269
+ }
1270
+
1271
+ get attributeName(): string {
1272
+ if (this.attr.startsWith('.'))
1273
+ return this.attr.substring(2);
1274
+ return this.attr.substring(1);
1275
+ }
1276
+
1277
+ async evaluate(scope: Scope, dom: DOM, tag: Tag = null) {
1278
+ let tags: TagList;
1279
+ if (this.elementRef) {
1280
+ tags = await this.elementRef.evaluate(scope, dom, tag);
1281
+ } else if (tag) {
1282
+ tags = new TagList(tag)
1283
+ } else {
1284
+ return;
1285
+ }
1286
+
1287
+ if (tags.length === 1)
1288
+ return tags[0].scope.get(`$${this.attributeName}`);
1289
+
1290
+ return tags.map((tag) => tag.scope.get(`$${this.attributeName}`));
1291
+ }
1292
+
1293
+ async prepare(scope: Scope, dom: DOM, tag: Tag = null) {
1294
+ if (this.elementRef) {
1295
+ await this.elementRef.prepare(scope, dom, tag);
1296
+ const tags: TagList = await this.elementRef.evaluate(scope, dom, tag);
1297
+ for (const t of tags)
1298
+ await t.watchStyle(this.attributeName);
1299
+ } else if(tag) {
1300
+ await tag.watchStyle(this.attributeName);
1301
+ }
1302
+ }
1303
+ }
1304
+
1245
1305
  export interface IBlockInfo {
1246
1306
  type: BlockType,
1247
1307
  open: TokenType,
@@ -1387,6 +1447,9 @@ export class Tree {
1387
1447
  } else if (tokens[0].type === TokenType.ELEMENT_ATTRIBUTE) {
1388
1448
  node = new ElementAttributeNode(node as any, tokens[0].value);
1389
1449
  tokens.splice(0, 1);
1450
+ } else if (tokens[0].type === TokenType.ELEMENT_STYLE) {
1451
+ node = new ElementStyleNode(node as any, tokens[0].value);
1452
+ tokens.splice(0, 1);
1390
1453
  } else if (node !== null && token.type === TokenType.PERIOD && tokens[1].type === TokenType.NAME) {
1391
1454
  node = new ScopeMemberNode(
1392
1455
  node,
@@ -27,4 +27,8 @@ export abstract class DOMObject extends EventDispatcher {
27
27
  public watchAttribute(attr: string) {
28
28
 
29
29
  }
30
+
31
+ public watchStyle(style: string) {
32
+
33
+ }
30
34
  }
package/src/Scope.ts CHANGED
@@ -207,13 +207,12 @@ export class WrappedArray<T> extends Array<T> {
207
207
  }
208
208
  }
209
209
 
210
-
211
210
  export class Scope extends EventDispatcher {
212
211
  public wrapped: any;
213
212
  protected data: DataModel;
214
213
  protected types: {[key: string]: string;} = {};
215
214
  protected children: Scope[];
216
- protected keys: string[];
215
+ protected _keys: string[];
217
216
  protected _parentScope: Scope;
218
217
 
219
218
  constructor(
@@ -224,7 +223,7 @@ export class Scope extends EventDispatcher {
224
223
  this.parentScope = parent;
225
224
  this.children = [];
226
225
  this.data = new DataModel({});
227
- this.keys = [];
226
+ this._keys = [];
228
227
  }
229
228
 
230
229
  public get parentScope(): Scope {
@@ -277,7 +276,7 @@ export class Scope extends EventDispatcher {
277
276
  if (searchParents && this.parentScope)
278
277
  return this.parentScope.get(key, searchParents);
279
278
 
280
- return '';
279
+ return this._keys.indexOf(key) > -1 ? '' : undefined;
281
280
  }
282
281
 
283
282
  return value;
@@ -312,12 +311,16 @@ export class Scope extends EventDispatcher {
312
311
  this.trigger('change', key, event);
313
312
  }
314
313
 
315
- if (this.keys.indexOf(key) === -1)
316
- this.keys.push(key);
314
+ if (this._keys.indexOf(key) === -1)
315
+ this._keys.push(key);
316
+ }
317
+
318
+ get keys(): string[] {
319
+ return [...this._keys];
317
320
  }
318
321
 
319
322
  has(key: string): boolean {
320
- return this.keys.indexOf(key) > -1;
323
+ return this._keys.indexOf(key) > -1;
321
324
  }
322
325
 
323
326
  setType(key: string, type: string) {
@@ -337,7 +340,7 @@ export class Scope extends EventDispatcher {
337
340
  }
338
341
 
339
342
  clear() {
340
- for (const key of this.keys) {
343
+ for (const key of this._keys) {
341
344
  if (['function', 'object'].indexOf(typeof this.get(key)) > -1) continue;
342
345
  this.set(key, null);
343
346
  }
package/src/Tag.ts CHANGED
@@ -8,6 +8,8 @@ import {On} from "./attributes/On";
8
8
  import {Registry} from "./Registry";
9
9
  import {benchmarkEnd, benchmarkStart} from "./Bencmark";
10
10
  import {DOMObject} from "./DOM/DOMObject";
11
+ import { Tree } from "./AST";
12
+ import {StyleAttribute} from "./attributes/StyleAttribute";
11
13
 
12
14
  export enum TagState {
13
15
  Instantiated,
@@ -104,6 +106,12 @@ export class Tag extends DOMObject {
104
106
  }
105
107
  }
106
108
 
109
+ public async eval(code: string) {
110
+ const tree = new Tree(code);
111
+ await tree.prepare(this.scope, this.dom, this);
112
+ return await tree.evaluate(this.scope, this.dom, this);
113
+ }
114
+
107
115
  public async evaluate() {
108
116
  for (const attr of this.nonDeferredAttributes) {
109
117
  await attr.evaluate();
@@ -480,6 +488,31 @@ export class Tag extends DOMObject {
480
488
  return standardAttribute;
481
489
  }
482
490
 
491
+ async watchStyle(styleName: string) {
492
+ for (const attribute of this.attributes) {
493
+ if (attribute instanceof StyleAttribute) {
494
+ return attribute;
495
+ }
496
+ }
497
+
498
+ // Standard attribute requires a unique scope
499
+ // @todo: Does this cause any issues with attribute bindings on the parent scope prior to having its own scope? hmm...
500
+ if (!this.uniqueScope) {
501
+ this._uniqueScope = true;
502
+ this._scope = new Scope();
503
+
504
+ if (this.parentTag) {
505
+ this.scope.parentScope = this.parentTag.scope;
506
+ }
507
+ }
508
+
509
+ const styleAttribute = new StyleAttribute(this, 'style');
510
+ this.attributes.push(styleAttribute);
511
+ await this.setupAttribute(styleAttribute);
512
+
513
+ return styleAttribute;
514
+ }
515
+
483
516
  private async setupAttribute(attribute: Attribute) {
484
517
  await attribute.compile();
485
518
  await attribute.setup();
package/src/Vision.ts CHANGED
@@ -72,5 +72,5 @@ export * from './Registry';
72
72
  export * from './Attribute';
73
73
  export * from './AST';
74
74
  export {DOM} from './DOM';
75
- export {WrappedArray, Scope} from './Scope';
75
+ export {WrappedArray, Scope, ScopeReference} from './Scope';
76
76
  export const vision: Vision = Vision.instance;
@@ -0,0 +1,68 @@
1
+ import {Registry} from "../Registry";
2
+ import {Attribute} from "../Attribute";
3
+ import {Scope, ScopeReference} from "../Scope";
4
+
5
+
6
+ @Registry.attribute('vsn-styles')
7
+ export class StyleAttribute extends Attribute {
8
+ private scopeRef: ScopeReference;
9
+ private styleScope: Scope;
10
+
11
+ public async setup() {
12
+ const key = this.getAttributeValue() || null;
13
+ if (key) {
14
+ this.scopeRef = this.tag.scope.getReference(key, true);
15
+ const parentScope = await this.scopeRef.getScope();
16
+ const styleKey = await this.scopeRef.getKey();
17
+ this.styleScope = parentScope.get(styleKey);
18
+ if (!this.styleScope) {
19
+ this.styleScope = new Scope(parentScope);
20
+ parentScope.set(styleKey, this.styleScope);
21
+ }
22
+ } else {
23
+ this.styleScope = this.tag.scope;
24
+ }
25
+
26
+ await super.setup();
27
+ }
28
+
29
+ public async connect() {
30
+ this.styleScope.bind(`change`, this.handleEvent.bind(this));
31
+ await super.connect();
32
+ }
33
+
34
+ public async extract() {
35
+ this.updateFrom();
36
+ await super.extract();
37
+ }
38
+
39
+ updateFrom() {
40
+ const toSkip = [
41
+ 'cssText',
42
+ 'length'
43
+ ]
44
+ for (const k in this.tag.style) {
45
+ if (toSkip.indexOf(k) > -1 || isFinite(k as any))
46
+ continue;
47
+ const value = this.tag.style[k];
48
+ const key = `$${k}`;
49
+ if (value && value !== this.styleScope.get(key))
50
+ this.styleScope.set(key, value);
51
+ }
52
+ }
53
+
54
+ public mutate(mutation: MutationRecord) {
55
+ super.mutate(mutation);
56
+ this.updateFrom();
57
+ }
58
+
59
+ public async handleEvent(k, v) {
60
+ if (k.startsWith('$')) {
61
+ const key = k.substr(1);
62
+
63
+ if (v.value !== v.previousValue) {
64
+ this.tag.element.style[key] = v.value;
65
+ }
66
+ }
67
+ }
68
+ }