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.
- package/demo/examples/component-slots.html +26 -0
- package/demo/vsn.js +2 -2
- package/dist/AST/ElementAttributeNode.js +5 -5
- package/dist/AST/ElementAttributeNode.js.map +1 -1
- package/dist/AST/ElementStyleNode.js +2 -2
- package/dist/AST/ElementStyleNode.js.map +1 -1
- package/dist/AST/ObjectNode.js +1 -1
- package/dist/AST/ObjectNode.js.map +1 -1
- package/dist/AST/ScopeMemberNode.js +2 -2
- package/dist/AST/ScopeMemberNode.js.map +1 -1
- package/dist/Component.d.ts +1 -0
- package/dist/Component.js +69 -24
- package/dist/Component.js.map +1 -1
- package/dist/DOM/DOMObject.d.ts +1 -0
- package/dist/DOM/DOMObject.js +7 -0
- package/dist/DOM/DOMObject.js.map +1 -1
- package/dist/DOM.d.ts +5 -4
- package/dist/DOM.js +114 -32
- package/dist/DOM.js.map +1 -1
- package/dist/Formats.js +4 -1
- package/dist/Formats.js.map +1 -1
- package/dist/Query.d.ts +1 -1
- package/dist/Query.js +2 -2
- package/dist/Query.js.map +1 -1
- package/dist/Scope.d.ts +1 -1
- package/dist/Scope.js +19 -1
- package/dist/Scope.js.map +1 -1
- package/dist/Tag/ShadowRootTag.d.ts +3 -0
- package/dist/Tag/ShadowRootTag.js +28 -0
- package/dist/Tag/ShadowRootTag.js.map +1 -0
- package/dist/Tag/SlotTag.d.ts +3 -0
- package/dist/Tag/SlotTag.js +28 -0
- package/dist/Tag/SlotTag.js.map +1 -0
- package/dist/Tag/SlottedTag.d.ts +7 -0
- package/dist/Tag/SlottedTag.js +87 -0
- package/dist/Tag/SlottedTag.js.map +1 -0
- package/dist/Tag/{List.d.ts → TagList.d.ts} +0 -0
- package/dist/Tag/{List.js → TagList.js} +1 -1
- package/dist/Tag/TagList.js.map +1 -0
- package/dist/Tag.d.ts +6 -2
- package/dist/Tag.js +36 -43
- package/dist/Tag.js.map +1 -1
- package/dist/attributes/List.js +20 -8
- package/dist/attributes/List.js.map +1 -1
- package/dist/attributes/ScopeAttribute.js +14 -12
- package/dist/attributes/ScopeAttribute.js.map +1 -1
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/dist/version.js.map +1 -1
- package/dist/vsn.js +8 -1
- package/dist/vsn.js.map +1 -1
- package/package.json +7 -2
- package/src/AST/ElementAttributeNode.ts +1 -1
- package/src/AST/ElementStyleNode.ts +1 -1
- package/src/AST/ObjectNode.ts +1 -1
- package/src/AST/ScopeMemberNode.ts +1 -1
- package/src/Component.ts +26 -9
- package/src/DOM/DOMObject.ts +4 -0
- package/src/DOM.ts +59 -7
- package/src/Formats.ts +4 -1
- package/src/Query.ts +1 -1
- package/src/Scope.ts +17 -1
- package/src/Tag/ShadowRootTag.ts +5 -0
- package/src/Tag/SlotTag.ts +5 -0
- package/src/Tag/SlottedTag.ts +19 -0
- package/src/Tag/{List.ts → TagList.ts} +0 -0
- package/src/Tag.ts +44 -45
- package/src/attributes/List.ts +24 -7
- package/src/attributes/ScopeAttribute.ts +12 -8
- package/src/version.ts +1 -1
- package/src/vsn.ts +7 -1
- package/test/AST/ClassNode.spec.ts +1 -1
- package/test/Tag/TagList.spec.ts +1 -1
- package/test/attributes/ListItem.spec.ts +2 -2
- 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
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
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
|
-
|
|
271
|
-
|
|
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
|
|
279
|
+
if (tag) {
|
|
280
|
+
tag.addChild(this);
|
|
283
281
|
|
|
284
|
-
|
|
285
|
-
|
|
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 (
|
|
456
|
-
|
|
457
|
-
continue;
|
|
458
|
-
}
|
|
459
|
-
}
|
|
454
|
+
if (tag.attributeMap[attr])
|
|
455
|
+
continue;
|
|
460
456
|
|
|
461
|
-
if (this.hasModifier(attr, '
|
|
462
|
-
|
|
463
|
-
|
|
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);
|
package/src/attributes/List.ts
CHANGED
|
@@ -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 || (!(
|
|
180
|
-
if (
|
|
181
|
-
|
|
182
|
-
|
|
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,
|
|
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
|
|
24
|
-
|
|
25
|
-
|
|
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
|
-
|
|
28
|
-
|
|
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.
|
|
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
|
-
|
|
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 {
|
package/test/Tag/TagList.spec.ts
CHANGED
|
@@ -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
|
});
|
package/dist/Tag/List.js.map
DELETED
|
@@ -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"}
|