vsn 0.1.98 → 0.1.101

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 (75) hide show
  1. package/demo/examples/component-slots.html +26 -0
  2. package/demo/vsn.js +2 -2
  3. package/dist/AST/ElementAttributeNode.js +5 -5
  4. package/dist/AST/ElementAttributeNode.js.map +1 -1
  5. package/dist/AST/ElementStyleNode.js +2 -2
  6. package/dist/AST/ElementStyleNode.js.map +1 -1
  7. package/dist/AST/ObjectNode.js +1 -1
  8. package/dist/AST/ObjectNode.js.map +1 -1
  9. package/dist/AST/ScopeMemberNode.js +2 -2
  10. package/dist/AST/ScopeMemberNode.js.map +1 -1
  11. package/dist/Component.d.ts +1 -0
  12. package/dist/Component.js +69 -24
  13. package/dist/Component.js.map +1 -1
  14. package/dist/DOM/DOMObject.d.ts +1 -0
  15. package/dist/DOM/DOMObject.js +7 -0
  16. package/dist/DOM/DOMObject.js.map +1 -1
  17. package/dist/DOM.d.ts +5 -4
  18. package/dist/DOM.js +114 -32
  19. package/dist/DOM.js.map +1 -1
  20. package/dist/Formats.js +4 -1
  21. package/dist/Formats.js.map +1 -1
  22. package/dist/Query.d.ts +1 -1
  23. package/dist/Query.js +2 -2
  24. package/dist/Query.js.map +1 -1
  25. package/dist/Scope.d.ts +1 -1
  26. package/dist/Scope.js +19 -1
  27. package/dist/Scope.js.map +1 -1
  28. package/dist/Tag/ShadowRootTag.d.ts +3 -0
  29. package/dist/Tag/ShadowRootTag.js +28 -0
  30. package/dist/Tag/ShadowRootTag.js.map +1 -0
  31. package/dist/Tag/SlotTag.d.ts +3 -0
  32. package/dist/Tag/SlotTag.js +28 -0
  33. package/dist/Tag/SlotTag.js.map +1 -0
  34. package/dist/Tag/SlottedTag.d.ts +7 -0
  35. package/dist/Tag/SlottedTag.js +87 -0
  36. package/dist/Tag/SlottedTag.js.map +1 -0
  37. package/dist/Tag/{List.d.ts → TagList.d.ts} +0 -0
  38. package/dist/Tag/{List.js → TagList.js} +1 -1
  39. package/dist/Tag/TagList.js.map +1 -0
  40. package/dist/Tag.d.ts +6 -2
  41. package/dist/Tag.js +36 -43
  42. package/dist/Tag.js.map +1 -1
  43. package/dist/attributes/List.js +20 -8
  44. package/dist/attributes/List.js.map +1 -1
  45. package/dist/attributes/ScopeAttribute.js +14 -12
  46. package/dist/attributes/ScopeAttribute.js.map +1 -1
  47. package/dist/version.d.ts +1 -1
  48. package/dist/version.js +1 -1
  49. package/dist/version.js.map +1 -1
  50. package/dist/vsn.js +8 -1
  51. package/dist/vsn.js.map +1 -1
  52. package/package.json +7 -2
  53. package/src/AST/ElementAttributeNode.ts +1 -1
  54. package/src/AST/ElementStyleNode.ts +1 -1
  55. package/src/AST/ObjectNode.ts +1 -1
  56. package/src/AST/ScopeMemberNode.ts +1 -1
  57. package/src/Component.ts +26 -9
  58. package/src/DOM/DOMObject.ts +4 -0
  59. package/src/DOM.ts +59 -7
  60. package/src/Formats.ts +4 -1
  61. package/src/Query.ts +1 -1
  62. package/src/Scope.ts +17 -1
  63. package/src/Tag/ShadowRootTag.ts +5 -0
  64. package/src/Tag/SlotTag.ts +5 -0
  65. package/src/Tag/SlottedTag.ts +19 -0
  66. package/src/Tag/{List.ts → TagList.ts} +0 -0
  67. package/src/Tag.ts +44 -45
  68. package/src/attributes/List.ts +24 -7
  69. package/src/attributes/ScopeAttribute.ts +12 -8
  70. package/src/version.ts +1 -1
  71. package/src/vsn.ts +7 -1
  72. package/test/AST/ClassNode.spec.ts +1 -1
  73. package/test/Tag/TagList.spec.ts +1 -1
  74. package/test/attributes/ListItem.spec.ts +2 -2
  75. package/dist/Tag/List.js.map +0 -1
package/src/Tag.ts CHANGED
@@ -28,6 +28,7 @@ export class Tag extends DOMObject {
28
28
  protected _state: TagState;
29
29
  protected _meta: { [key: string]: any; };
30
30
  protected attributes: Attribute[];
31
+ protected attributeMap: { [key: string]: Attribute; };
31
32
  protected _nonDeferredAttributes: Attribute[] = [];
32
33
  protected _parentTag: Tag;
33
34
  protected _children: Tag[] = [];
@@ -60,14 +61,10 @@ export class Tag extends DOMObject {
60
61
  this.rawAttributes = {};
61
62
  this.parsedAttributes = {};
62
63
  this.attributes = [];
64
+ this.attributeMap = {};
63
65
  this.onEventHandlers = {};
64
66
  this.analyzeElementAttributes();
65
67
  this._state = TagState.Instantiated;
66
- if (this.hasAttribute('slot')) {
67
- this.addEventHandler('slotted',[], (e) => {
68
- console.log('slot change', e, this.element.assignedSlot);
69
- })
70
- }
71
68
  }
72
69
 
73
70
  public get meta() {
@@ -76,11 +73,6 @@ export class Tag extends DOMObject {
76
73
  return this._meta;
77
74
  }
78
75
 
79
- public slotted(slot: HTMLSlotElement) {
80
- this.slot = slot;
81
- console.log('i am slotted', slot);
82
- }
83
-
84
76
  protected onAttributeStateChange(event) {
85
77
  if (event.previouseState === AttributeState.Deferred) // @todo: what is this?
86
78
  this._nonDeferredAttributes.length = 0;
@@ -242,33 +234,33 @@ export class Tag extends DOMObject {
242
234
  this._children.push(tag);
243
235
  }
244
236
 
237
+ public removeChild(tag: Tag) {
238
+ this._children.splice(this._children.indexOf(tag), 1);
239
+ }
240
+
245
241
  public get children(): Tag[] {
246
242
  return [...this._children];
247
243
  }
248
244
 
249
- public get parentTag(): Tag {
250
- if (!this._parentTag) {
251
- let parentElement: HTMLElement = this.element.parentElement as HTMLElement;
252
- let foundParent = false;
253
- while (parentElement) {
254
- if (parentElement[Tag.TaggedVariable]) {
255
- foundParent = true;
256
- this.parentTag = parentElement[Tag.TaggedVariable];
257
- break;
258
- }
259
-
260
- if (parentElement.parentElement) {
261
- parentElement = parentElement.parentElement as HTMLElement;
262
- } else if (parentElement.assignedSlot) {
263
- parentElement = parentElement.assignedSlot.parentElement as HTMLElement;
264
- } else {
265
- parentElement = null;
266
- }
267
-
245
+ public findParentTag() {
246
+ let parentElement: HTMLElement = DOM.getParentElement(this.element);
247
+ let foundParent = false;
248
+ while (parentElement) {
249
+ if (parentElement[Tag.TaggedVariable]) {
250
+ foundParent = true;
251
+ this.parentTag = parentElement[Tag.TaggedVariable];
252
+ break;
268
253
  }
254
+ parentElement = DOM.getParentElement(parentElement);
255
+ }
256
+
257
+ if (!foundParent && DOM.instance.root !== this)
258
+ return DOM.instance.root;
259
+ }
269
260
 
270
- if (!foundParent && DOM.instance.root !== this)
271
- return DOM.instance.root;
261
+ public get parentTag(): Tag {
262
+ if (!this._parentTag) {
263
+ this.findParentTag();
272
264
  }
273
265
 
274
266
  return this._parentTag;
@@ -278,11 +270,19 @@ export class Tag extends DOMObject {
278
270
  if (this.element === document.body)
279
271
  return;
280
272
 
273
+ if (this._parentTag && this._parentTag !== tag) {
274
+ this._parentTag.removeChild(this);
275
+ this.scope.parentScope = null;
276
+ }
277
+
281
278
  this._parentTag = tag;
282
- tag.addChild(this);
279
+ if (tag) {
280
+ tag.addChild(this);
283
281
 
284
- if (this.scope !== tag.scope)
285
- this.scope.parentScope = tag.scope;
282
+ if (this.scope !== tag.scope) {
283
+ this.scope.parentScope = tag.scope;
284
+ }
285
+ }
286
286
  }
287
287
 
288
288
  public get scope(): Scope {
@@ -439,7 +439,6 @@ export class Tag extends DOMObject {
439
439
  public async buildAttributes() {
440
440
  let requiresScope = false;
441
441
  let defer: boolean = false;
442
- this.attributes.length = 0;
443
442
  const isMobile: boolean = VisionHelper.isMobile();
444
443
  if (this.element.offsetParent === null ||
445
444
  this.hasAttribute('hidden') ||
@@ -452,17 +451,15 @@ export class Tag extends DOMObject {
452
451
  const slot: Tag = this.isSlot ? this : null;
453
452
  for (const tag of tags) {
454
453
  for (let attr in this.rawAttributes) {
455
- if (this.hasModifier(attr, 'mobile')) {
456
- if (!isMobile) {
457
- continue;
458
- }
459
- }
454
+ if (tag.attributeMap[attr])
455
+ continue;
460
456
 
461
- if (this.hasModifier(attr, 'desktop')) {
462
- if (isMobile) {
463
- continue;
464
- }
465
- }
457
+ if (this.hasModifier(attr, 'mobile') && !isMobile)
458
+ continue;
459
+
460
+
461
+ if (this.hasModifier(attr, 'desktop') && isMobile)
462
+ continue;
466
463
 
467
464
  const attrClass = await this.getAttributeClass(attr);
468
465
  if (attrClass) {
@@ -470,7 +467,9 @@ export class Tag extends DOMObject {
470
467
  requiresScope = true;
471
468
 
472
469
  const attrObj = attrClass.create(tag, attr, attrClass, slot);
470
+
473
471
  tag.attributes.push(attrObj);
472
+ tag.attributeMap[attr] = attrObj;
474
473
  if (defer && attrClass.canDefer) {
475
474
  await attrObj.defer();
476
475
  tag.deferredAttributes.push(attrObj);
@@ -5,6 +5,7 @@ import {ElementHelper} from "../helpers/ElementHelper";
5
5
  import {Registry} from "../Registry";
6
6
  import {DOM} from "../DOM";
7
7
  import {Scope} from "../Scope";
8
+ import {ScopeData} from "../Scope/ScopeData";
8
9
 
9
10
  @Registry.attribute('vsn-list')
10
11
  export class List extends Attribute {
@@ -146,6 +147,13 @@ export class List extends Attribute {
146
147
  }
147
148
  delete element[Tag.TaggedVariable];
148
149
 
150
+ // Collect raw data
151
+ let data;
152
+ if (obj instanceof ScopeData)
153
+ data = obj.getData();
154
+ else
155
+ data = Object.assign({}, obj);
156
+
149
157
  // Setup new tag
150
158
  const tag = await this.tag.dom.buildTag(element, true);
151
159
  await this.setupTagScope(tag, obj);
@@ -154,6 +162,13 @@ export class List extends Attribute {
154
162
  this.tag.element.appendChild(element);
155
163
  await this.tag.dom.setupTags([tag]);
156
164
  await this.tag.dom.buildFrom(this.tag.element);
165
+
166
+ // Make sure we're using the correct data (Template may have vsn-bind values that are not desired)
167
+ const itemScope = tag.scope.get(this.listItemName);
168
+ if (itemScope instanceof Scope && data) {
169
+ itemScope.data.setData(data);
170
+ }
171
+
157
172
  this.tags.push(tag);
158
173
  this.tag.dispatch('add', obj);
159
174
  }
@@ -163,26 +178,28 @@ export class List extends Attribute {
163
178
  return;
164
179
 
165
180
  tag.createScope(true);
181
+ const itemScope = new Scope(tag.scope);
166
182
 
167
- // Setup new scope & class, if defined
183
+ // Setup new scope & model class, if defined
168
184
  const modelName: string = this.listItemModel;
169
185
  let cls;
170
186
  if (modelName)
171
187
  cls = await Registry.instance.models.get(modelName);
172
188
 
173
189
  if (cls) {
174
- if (!obj || !(obj instanceof cls))
190
+ if (!obj || !(obj instanceof cls)) {
175
191
  obj = new cls(obj);
192
+ }
176
193
  }
177
194
 
178
195
  // Check if the class is set up already
179
- if (!cls || (!(tag.scope.data instanceof cls) && !(tag.scope.wrapped instanceof cls))) {
180
- if (tag.scope.wrapped)
181
- tag.scope.unwrap();
182
- tag.wrap(obj);
196
+ if (!cls || (!(itemScope.data instanceof cls) && !(itemScope.wrapped instanceof cls))) {
197
+ if (itemScope.wrapped)
198
+ itemScope.unwrap();
199
+ itemScope.wrap(obj, true, true);
183
200
  }
184
201
 
185
- tag.scope.set(this.listItemName, tag.scope);
202
+ tag.scope.set(this.listItemName, itemScope);
186
203
  tag.meta[List.MetaItemSetupFlag] = true;
187
204
  }
188
205
  }
@@ -20,17 +20,21 @@ export class ScopeAttribute extends Attribute {
20
20
 
21
21
  public async extract() {
22
22
  if (this.tree) {
23
- const value = await this.tree.evaluate(this.tag.scope, this.tag.dom, this.tag);
24
- if (!(value instanceof Scope)) {
25
- throw new Error(`vsn-scope value must be an object, got ${typeof value}`);
23
+ const binding = this.getAttributeBinding();
24
+
25
+ const scope = await this.tree.evaluate(this.tag.scope, this.tag.dom, this.tag);
26
+ if (!(scope instanceof Scope)) {
27
+ throw new Error(`vsn-scope value must be an object, got ${typeof scope}`);
26
28
  }
27
- for (const key of value.data.keys) {
28
- this.tag.scope.set(key, value.data[key]);
29
+
30
+ if (binding) {
31
+ this.tag.scope.set(binding, scope);
32
+ } else {
33
+ for (const key of scope.data.keys) {
34
+ this.tag.scope.set(key, scope.data[key]);
35
+ }
29
36
  }
30
37
  }
31
- const binding = this.getAttributeBinding();
32
- if (binding)
33
- this.tag.scope.parentScope.set(binding, this.tag.scope);
34
38
  await super.extract();
35
39
  }
36
40
  }
package/src/version.ts CHANGED
@@ -1,2 +1,2 @@
1
- export const VERSION = '0.1.98';
1
+ export const VERSION = '0.1.101';
2
2
 
package/src/vsn.ts CHANGED
@@ -47,7 +47,13 @@ export class Vision extends EventDispatcher {
47
47
  }
48
48
 
49
49
  protected defineComponent(name, cls) {
50
- customElements.define(name, cls);
50
+ if (this.dom.built) {
51
+ customElements.define(name, cls);
52
+ } else {
53
+ this.dom.once('built', () => {
54
+ customElements.define(name, cls);
55
+ });
56
+ }
51
57
  }
52
58
 
53
59
  public get dom(): DOM {
@@ -1,7 +1,7 @@
1
1
  import {DOM} from "../../src/DOM";
2
2
  import {ClassNode} from "../../src/AST/ClassNode";
3
3
  import {Registry} from "../../src/Registry";
4
- import {TagList} from "../../src/Tag/List";
4
+ import {TagList} from "../../src/Tag/TagList";
5
5
 
6
6
 
7
7
  describe('ClassNode', () => {
@@ -1,6 +1,6 @@
1
1
  import {DOM} from "../../src/DOM";
2
2
  import {Query} from "../../src/Query";
3
- import {TagList} from "../../src/Tag/List";
3
+ import {TagList} from "../../src/Tag/TagList";
4
4
  import {DOMObject} from "../../src/DOM/DOMObject";
5
5
 
6
6
  describe('TagList', () => {
@@ -72,7 +72,7 @@ describe('ListItem', () => {
72
72
  list.on('add', () => {
73
73
  const listItem = listAttr.tags[0];
74
74
 
75
- expect(listItem.scope.data instanceof ListItemSpecTestItem).toBeTrue();
75
+ expect(listItem.scope.get('item').data instanceof ListItemSpecTestItem).toBeTrue();
76
76
  expect(controller.items.length).toBe(1);
77
77
  expect(controller.items[0] instanceof ListItemSpecTestItem).toBeTrue();
78
78
 
@@ -95,7 +95,7 @@ describe('ListItem', () => {
95
95
  const dom = new DOM(document);
96
96
  dom.once('built', async () => {
97
97
  const listItem = await dom.getTagForElement(document.getElementById('test-item'));
98
- expect(listItem.scope.get('testing')).toBe(1);
98
+ expect(listItem.scope.get('item').get('testing')).toBe(1);
99
99
  done();
100
100
  });
101
101
  });
@@ -1 +0,0 @@
1
- {"version":3,"file":"List.js","sourceRoot":"","sources":["../../src/Tag/List.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;AAAA,wDAAqD;AAIrD;IAA6B,2BAAgB;IACzC;QAAY,eAAqB;aAArB,UAAqB,EAArB,qBAAqB,EAArB,IAAqB;YAArB,0BAAqB;;QAAjC,+BACa,KAAK,UAEjB;QADG,MAAM,CAAC,cAAc,CAAC,KAAI,EAAE,OAAO,CAAC,SAAS,CAAC,CAAC;;IACnD,CAAC;IAED,sBAAI,0BAAK;aAAT;YACI,OAAO,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAA;QACxB,CAAC;;;OAAA;IAED,sBAAI,6BAAQ;aAAZ;YACI,OAAO,IAAI,CAAC,GAAG,CAAC,UAAA,CAAC,IAAI,OAAA,CAAC,CAAC,OAAO,EAAT,CAAS,CAAC,CAAC;QACpC,CAAC;;;OAAA;IAED,sBAAI,0BAAK;aAAT;YACI,OAAO,IAAI,CAAC,CAAC,CAAC,CAAC;QACnB,CAAC;;;OAAA;IAED,sBAAI,yBAAI;aAAR;YACI,OAAO,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QACjC,CAAC;;;OAAA;IAED,qBAAG,GAAH,UAAI,KAAa;QACb,IAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,UAAA,CAAC,IAAI,OAAA,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,EAAhB,CAAgB,CAAC,CAAC;QACjD,OAAO,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IACjC,CAAC;IAED,6BAAW,GAAX,UAAY,SAAS;QACjB,IAAI,CAAC,OAAO,CAAC,UAAA,CAAC,IAAI,OAAA,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,MAAM,CAAC,SAAS,CAAC,EAArC,CAAqC,CAAC,CAAA;QACxD,OAAO,IAAI,CAAA;IACf,CAAC;IAED,0BAAQ,GAAR,UAAS,SAAS;QACd,IAAI,CAAC,OAAO,CAAC,UAAA,CAAC,IAAI,OAAA,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,GAAG,CAAC,SAAS,CAAC,EAAlC,CAAkC,CAAC,CAAA;QACrD,OAAO,IAAI,CAAA;IACf,CAAC;IAED,qBAAG,GAAH,UAAI,QAAQ,EAAE,KAAK;QACf,IAAM,SAAS,GAAG,QAAQ,CAAC,OAAO,CAAC,UAAU,EAAE,UAAA,CAAC;YAC5C,OAAO,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,WAAW,EAAE,CAAA;QAC3C,CAAC,CAAC,CAAA;QACF,IAAI,CAAC,OAAO,CAAC,UAAA,CAAC,IAAI,OAAA,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,SAAS,CAAC,GAAG,KAAK,CAAC,EAApC,CAAoC,CAAC,CAAA;QACvD,OAAO,IAAI,CAAA;IACf,CAAC;IACL,cAAC;AAAD,CAAC,AA5CD,CAA6B,KAAK,GA4CjC;AA5CY,0BAAO;AA8CpB,IAAI,2BAAY,CAAC,aAAa,IAAI,2BAAY,CAAC,MAAM;IACjD,MAAM,CAAC,SAAS,CAAC,GAAG,OAAO,CAAC"}