@joist/element 4.0.0-next.3 → 4.0.0-next.30

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 (67) hide show
  1. package/README.md +102 -15
  2. package/package.json +7 -9
  3. package/src/lib/attr.test.ts +138 -97
  4. package/src/lib/attr.ts +16 -32
  5. package/src/lib/element.test.ts +101 -70
  6. package/src/lib/element.ts +89 -40
  7. package/src/lib/lifecycle.test.ts +31 -0
  8. package/src/lib/lifecycle.ts +9 -0
  9. package/src/lib/listen.test.ts +88 -0
  10. package/src/lib/listen.ts +26 -9
  11. package/src/lib/metadata.ts +18 -7
  12. package/src/lib/query.test.ts +28 -0
  13. package/src/lib/query.ts +31 -0
  14. package/src/lib/result.ts +1 -21
  15. package/src/lib/tags.ts +27 -12
  16. package/src/lib/template.test.ts +123 -0
  17. package/src/lib/template.ts +118 -0
  18. package/src/lib.ts +2 -1
  19. package/target/lib/attr.d.ts +2 -1
  20. package/target/lib/attr.js +15 -24
  21. package/target/lib/attr.js.map +1 -1
  22. package/target/lib/attr.test.js +333 -252
  23. package/target/lib/attr.test.js.map +1 -1
  24. package/target/lib/element.d.ts +24 -11
  25. package/target/lib/element.js +66 -28
  26. package/target/lib/element.js.map +1 -1
  27. package/target/lib/element.test.js +158 -176
  28. package/target/lib/element.test.js.map +1 -1
  29. package/target/lib/lifecycle.d.ts +1 -0
  30. package/target/lib/lifecycle.js +8 -0
  31. package/target/lib/lifecycle.js.map +1 -0
  32. package/target/lib/lifecycle.test.js +48 -0
  33. package/target/lib/lifecycle.test.js.map +1 -0
  34. package/target/lib/listen.d.ts +2 -2
  35. package/target/lib/listen.js +18 -3
  36. package/target/lib/listen.js.map +1 -1
  37. package/target/lib/listen.test.d.ts +1 -0
  38. package/target/lib/listen.test.js +159 -0
  39. package/target/lib/listen.test.js.map +1 -0
  40. package/target/lib/metadata.d.ts +17 -10
  41. package/target/lib/metadata.js +5 -2
  42. package/target/lib/metadata.js.map +1 -1
  43. package/target/lib/query.d.ts +9 -0
  44. package/target/lib/query.js +19 -0
  45. package/target/lib/query.js.map +1 -0
  46. package/target/lib/query.test.d.ts +1 -0
  47. package/target/lib/query.test.js +41 -0
  48. package/target/lib/query.test.js.map +1 -0
  49. package/target/lib/result.d.ts +1 -10
  50. package/target/lib/result.js +1 -22
  51. package/target/lib/result.js.map +1 -1
  52. package/target/lib/tags.d.ts +10 -8
  53. package/target/lib/tags.js +18 -24
  54. package/target/lib/tags.js.map +1 -1
  55. package/target/lib/template.d.ts +11 -0
  56. package/target/lib/template.js +87 -0
  57. package/target/lib/template.js.map +1 -0
  58. package/target/lib/template.test.d.ts +1 -0
  59. package/target/lib/template.test.js +91 -0
  60. package/target/lib/template.test.js.map +1 -0
  61. package/target/lib.d.ts +2 -1
  62. package/target/lib.js +2 -1
  63. package/target/lib.js.map +1 -1
  64. package/src/lib/tags.test.ts +0 -28
  65. package/target/lib/tags.test.js +0 -23
  66. package/target/lib/tags.test.js.map +0 -1
  67. /package/target/lib/{tags.test.d.ts → lifecycle.test.d.ts} +0 -0
@@ -0,0 +1,159 @@
1
+ import { __esDecorate, __runInitializers } from "tslib";
2
+ import { assert } from 'chai';
3
+ import { element } from './element.js';
4
+ import { listen } from './listen.js';
5
+ describe('@listen()', () => {
6
+ it('should add listener to an outer HTMLElement', (done) => {
7
+ let MyElement = (() => {
8
+ let _classDecorators = [element({
9
+ tagName: 'listener-1'
10
+ })];
11
+ let _classDescriptor;
12
+ let _classExtraInitializers = [];
13
+ let _classThis;
14
+ let _classSuper = HTMLElement;
15
+ let _instanceExtraInitializers = [];
16
+ let _onClick_decorators;
17
+ var MyElement = class extends _classSuper {
18
+ static { _classThis = this; }
19
+ static {
20
+ const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(_classSuper[Symbol.metadata] ?? null) : void 0;
21
+ _onClick_decorators = [listen('click')];
22
+ __esDecorate(this, null, _onClick_decorators, { kind: "method", name: "onClick", static: false, private: false, access: { has: obj => "onClick" in obj, get: obj => obj.onClick }, metadata: _metadata }, null, _instanceExtraInitializers);
23
+ __esDecorate(null, _classDescriptor = { value: _classThis }, _classDecorators, { kind: "class", name: _classThis.name, metadata: _metadata }, null, _classExtraInitializers);
24
+ MyElement = _classThis = _classDescriptor.value;
25
+ if (_metadata) Object.defineProperty(_classThis, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
26
+ __runInitializers(_classThis, _classExtraInitializers);
27
+ }
28
+ onClick(e) {
29
+ assert.equal(e.type, 'click');
30
+ done();
31
+ }
32
+ constructor() {
33
+ super(...arguments);
34
+ __runInitializers(this, _instanceExtraInitializers);
35
+ }
36
+ };
37
+ return MyElement = _classThis;
38
+ })();
39
+ const el = new MyElement();
40
+ el.dispatchEvent(new Event('click'));
41
+ });
42
+ it('should add listener to the shadow root if available', (done) => {
43
+ let MyElement = (() => {
44
+ let _classDecorators = [element({
45
+ tagName: 'listener-2',
46
+ shadowDom: []
47
+ })];
48
+ let _classDescriptor;
49
+ let _classExtraInitializers = [];
50
+ let _classThis;
51
+ let _classSuper = HTMLElement;
52
+ let _instanceExtraInitializers = [];
53
+ let _onClick_decorators;
54
+ var MyElement = class extends _classSuper {
55
+ static { _classThis = this; }
56
+ static {
57
+ const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(_classSuper[Symbol.metadata] ?? null) : void 0;
58
+ _onClick_decorators = [listen('click')];
59
+ __esDecorate(this, null, _onClick_decorators, { kind: "method", name: "onClick", static: false, private: false, access: { has: obj => "onClick" in obj, get: obj => obj.onClick }, metadata: _metadata }, null, _instanceExtraInitializers);
60
+ __esDecorate(null, _classDescriptor = { value: _classThis }, _classDecorators, { kind: "class", name: _classThis.name, metadata: _metadata }, null, _classExtraInitializers);
61
+ MyElement = _classThis = _classDescriptor.value;
62
+ if (_metadata) Object.defineProperty(_classThis, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
63
+ __runInitializers(_classThis, _classExtraInitializers);
64
+ }
65
+ onClick(e) {
66
+ assert.equal(e.type, 'click');
67
+ done();
68
+ }
69
+ constructor() {
70
+ super(...arguments);
71
+ __runInitializers(this, _instanceExtraInitializers);
72
+ }
73
+ };
74
+ return MyElement = _classThis;
75
+ })();
76
+ const el = new MyElement();
77
+ el.shadowRoot.dispatchEvent(new Event('click'));
78
+ });
79
+ it('should restrict argument to an event or an event subtype', (done) => {
80
+ class CustomEvent extends Event {
81
+ test = 'Hello World';
82
+ constructor() {
83
+ super('customevent');
84
+ }
85
+ }
86
+ let MyElement = (() => {
87
+ let _classDecorators = [element({
88
+ tagName: 'listener-3'
89
+ })];
90
+ let _classDescriptor;
91
+ let _classExtraInitializers = [];
92
+ let _classThis;
93
+ let _classSuper = HTMLElement;
94
+ let _instanceExtraInitializers = [];
95
+ let _onClick_decorators;
96
+ var MyElement = class extends _classSuper {
97
+ static { _classThis = this; }
98
+ static {
99
+ const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(_classSuper[Symbol.metadata] ?? null) : void 0;
100
+ _onClick_decorators = [listen('customevent')];
101
+ __esDecorate(this, null, _onClick_decorators, { kind: "method", name: "onClick", static: false, private: false, access: { has: obj => "onClick" in obj, get: obj => obj.onClick }, metadata: _metadata }, null, _instanceExtraInitializers);
102
+ __esDecorate(null, _classDescriptor = { value: _classThis }, _classDecorators, { kind: "class", name: _classThis.name, metadata: _metadata }, null, _classExtraInitializers);
103
+ MyElement = _classThis = _classDescriptor.value;
104
+ if (_metadata) Object.defineProperty(_classThis, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
105
+ __runInitializers(_classThis, _classExtraInitializers);
106
+ }
107
+ onClick(e) {
108
+ assert.equal(e.type, 'customevent');
109
+ done();
110
+ }
111
+ constructor() {
112
+ super(...arguments);
113
+ __runInitializers(this, _instanceExtraInitializers);
114
+ }
115
+ };
116
+ return MyElement = _classThis;
117
+ })();
118
+ const el = new MyElement();
119
+ el.dispatchEvent(new CustomEvent());
120
+ });
121
+ it('should respect a provided selector function', (done) => {
122
+ let MyElement = (() => {
123
+ let _classDecorators = [element({
124
+ tagName: 'listener-4',
125
+ shadowDom: []
126
+ })];
127
+ let _classDescriptor;
128
+ let _classExtraInitializers = [];
129
+ let _classThis;
130
+ let _classSuper = HTMLElement;
131
+ let _instanceExtraInitializers = [];
132
+ let _onClick_decorators;
133
+ var MyElement = class extends _classSuper {
134
+ static { _classThis = this; }
135
+ static {
136
+ const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(_classSuper[Symbol.metadata] ?? null) : void 0;
137
+ _onClick_decorators = [listen('click', (host) => host)];
138
+ __esDecorate(this, null, _onClick_decorators, { kind: "method", name: "onClick", static: false, private: false, access: { has: obj => "onClick" in obj, get: obj => obj.onClick }, metadata: _metadata }, null, _instanceExtraInitializers);
139
+ __esDecorate(null, _classDescriptor = { value: _classThis }, _classDecorators, { kind: "class", name: _classThis.name, metadata: _metadata }, null, _classExtraInitializers);
140
+ MyElement = _classThis = _classDescriptor.value;
141
+ if (_metadata) Object.defineProperty(_classThis, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
142
+ __runInitializers(_classThis, _classExtraInitializers);
143
+ }
144
+ onClick(e) {
145
+ assert.equal(e.type, 'click');
146
+ done();
147
+ }
148
+ constructor() {
149
+ super(...arguments);
150
+ __runInitializers(this, _instanceExtraInitializers);
151
+ }
152
+ };
153
+ return MyElement = _classThis;
154
+ })();
155
+ const el = new MyElement();
156
+ el.dispatchEvent(new Event('click'));
157
+ });
158
+ });
159
+ //# sourceMappingURL=listen.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"listen.test.js","sourceRoot":"","sources":["../../src/lib/listen.test.ts"],"names":[],"mappings":"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"}
@@ -1,17 +1,24 @@
1
1
  export interface AttrDef {
2
2
  propName: string | symbol;
3
- attrName: string;
4
3
  observe: boolean;
4
+ reflect: boolean;
5
+ getPropValue: Function;
6
+ setPropValue: Function;
5
7
  }
6
- export type ListenerRootSelector = (el: HTMLElement) => HTMLElement | ShadowRoot;
7
- export declare class ElementMetadata {
8
- attrs: AttrDef[];
9
- listeners: Map<string, {
10
- cb: (e: Event) => void;
11
- root: ListenerRootSelector;
12
- }>;
8
+ export type ListenerSelector<T> = (el: T) => Element | ShadowRoot | null;
9
+ export interface Listener<T> {
10
+ event: string;
11
+ cb: (e: Event) => void;
12
+ selector: ListenerSelector<T>;
13
13
  }
14
- export declare class MetadataStore extends WeakMap<object, ElementMetadata> {
15
- read(value: object): ElementMetadata;
14
+ export declare class AttrMetadata extends Map<string, AttrDef> {
15
+ }
16
+ export declare class ElementMetadata<T> {
17
+ attrs: AttrMetadata;
18
+ listeners: Listener<T>[];
19
+ onReady: Set<Function>;
20
+ }
21
+ export declare class MetadataStore extends WeakMap<object, ElementMetadata<unknown>> {
22
+ read<T>(value: object): ElementMetadata<T>;
16
23
  }
17
24
  export declare const metadataStore: MetadataStore;
@@ -1,7 +1,10 @@
1
1
  Symbol.metadata ??= Symbol('Symbol.metadata');
2
+ export class AttrMetadata extends Map {
3
+ }
2
4
  export class ElementMetadata {
3
- attrs = [];
4
- listeners = new Map();
5
+ attrs = new AttrMetadata();
6
+ listeners = [];
7
+ onReady = new Set();
5
8
  }
6
9
  export class MetadataStore extends WeakMap {
7
10
  read(value) {
@@ -1 +1 @@
1
- {"version":3,"file":"metadata.js","sourceRoot":"","sources":["../../src/lib/metadata.ts"],"names":[],"mappings":"AAAC,MAAc,CAAC,QAAQ,KAAK,MAAM,CAAC,iBAAiB,CAAC,CAAC;AAUvD,MAAM,OAAO,eAAe;IAC1B,KAAK,GAAc,EAAE,CAAC;IACtB,SAAS,GAAG,IAAI,GAAG,EAAkE,CAAC;CACvF;AAED,MAAM,OAAO,aAAc,SAAQ,OAAgC;IACjE,IAAI,CAAC,KAAa;QAChB,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;YACrB,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,eAAe,EAAE,CAAC,CAAC;QACzC,CAAC;QAED,OAAO,IAAI,CAAC,GAAG,CAAC,KAAK,CAAE,CAAC;IAC1B,CAAC;CACF;AAED,MAAM,CAAC,MAAM,aAAa,GAAG,IAAI,aAAa,EAAE,CAAC"}
1
+ {"version":3,"file":"metadata.js","sourceRoot":"","sources":["../../src/lib/metadata.ts"],"names":[],"mappings":"AAAC,MAAc,CAAC,QAAQ,KAAK,MAAM,CAAC,iBAAiB,CAAC,CAAC;AAkBvD,MAAM,OAAO,YAAa,SAAQ,GAAoB;CAAG;AAEzD,MAAM,OAAO,eAAe;IAC1B,KAAK,GAAG,IAAI,YAAY,EAAE,CAAC;IAC3B,SAAS,GAAkB,EAAE,CAAC;IAC9B,OAAO,GAAG,IAAI,GAAG,EAAY,CAAC;CAC/B;AAED,MAAM,OAAO,aAAc,SAAQ,OAAyC;IAC1E,IAAI,CAAI,KAAa;QACnB,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;YACrB,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,eAAe,EAAE,CAAC,CAAC;QACzC,CAAC;QAED,OAAO,IAAI,CAAC,GAAG,CAAC,KAAK,CAAE,CAAC;IAC1B,CAAC;CACF;AAED,MAAM,CAAC,MAAM,aAAa,GAAG,IAAI,aAAa,EAAE,CAAC"}
@@ -0,0 +1,9 @@
1
+ type Tags = keyof HTMLElementTagNameMap;
2
+ type SVGTags = keyof SVGElementTagNameMap;
3
+ type MathTags = keyof MathMLElementTagNameMap;
4
+ type QueryResult<T> = (updates?: Partial<T>) => T;
5
+ export declare function query<K extends Tags>(selectors: K): QueryResult<HTMLElementTagNameMap[K]>;
6
+ export declare function query<K extends SVGTags>(selectors: K): QueryResult<SVGElementTagNameMap[K]>;
7
+ export declare function query<K extends MathTags>(selectors: K): QueryResult<MathMLElementTagNameMap[K]>;
8
+ export declare function query<E extends HTMLElement = HTMLElement>(selectors: string): QueryResult<E>;
9
+ export {};
@@ -0,0 +1,19 @@
1
+ export function query(query) {
2
+ let res = null;
3
+ return function () {
4
+ if (res) {
5
+ return res;
6
+ }
7
+ if (this.shadowRoot) {
8
+ res = this.shadowRoot.querySelector(query);
9
+ }
10
+ else {
11
+ res = this.querySelector(query);
12
+ }
13
+ if (!res) {
14
+ throw new Error('could not find element');
15
+ }
16
+ return res;
17
+ };
18
+ }
19
+ //# sourceMappingURL=query.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"query.js","sourceRoot":"","sources":["../../src/lib/query.ts"],"names":[],"mappings":"AAUA,MAAM,UAAU,KAAK,CAAiB,KAAQ;IAC5C,IAAI,GAAG,GAAoC,IAAI,CAAC;IAEhD,OAAO;QACL,IAAI,GAAG,EAAE,CAAC;YACR,OAAO,GAAG,CAAC;QACb,CAAC;QAED,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;YACpB,GAAG,GAAG,IAAI,CAAC,UAAU,CAAC,aAAa,CAAI,KAAK,CAAC,CAAC;QAChD,CAAC;aAAM,CAAC;YACN,GAAG,GAAG,IAAI,CAAC,aAAa,CAAI,KAAK,CAAC,CAAC;QACrC,CAAC;QAED,IAAI,CAAC,GAAG,EAAE,CAAC;YACT,MAAM,IAAI,KAAK,CAAC,wBAAwB,CAAC,CAAC;QAC5C,CAAC;QAED,OAAO,GAAG,CAAC;IACb,CAAC,CAAC;AACJ,CAAC"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,41 @@
1
+ import { __esDecorate, __runInitializers } from "tslib";
2
+ import { expect } from 'chai';
3
+ import { element } from './element.js';
4
+ import { query } from './query.js';
5
+ import { html } from './tags.js';
6
+ it('should work', () => {
7
+ let MyElement = (() => {
8
+ let _classDecorators = [element({
9
+ tagName: 'query-test-1',
10
+ shadowDom: [
11
+ html `
12
+ <form>
13
+ <input id="fname" name="fname" />
14
+ <input id="lname" name="lname" />
15
+ </form>
16
+ `
17
+ ]
18
+ })];
19
+ let _classDescriptor;
20
+ let _classExtraInitializers = [];
21
+ let _classThis;
22
+ let _classSuper = HTMLElement;
23
+ var MyElement = class extends _classSuper {
24
+ static { _classThis = this; }
25
+ static {
26
+ const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(_classSuper[Symbol.metadata] ?? null) : void 0;
27
+ __esDecorate(null, _classDescriptor = { value: _classThis }, _classDecorators, { kind: "class", name: _classThis.name, metadata: _metadata }, null, _classExtraInitializers);
28
+ MyElement = _classThis = _classDescriptor.value;
29
+ if (_metadata) Object.defineProperty(_classThis, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
30
+ __runInitializers(_classThis, _classExtraInitializers);
31
+ }
32
+ fname = query('#fname');
33
+ lname = query('#lname');
34
+ };
35
+ return MyElement = _classThis;
36
+ })();
37
+ const el = new MyElement();
38
+ expect(el.fname()).to.equal(el.shadowRoot?.querySelector('#fname'));
39
+ expect(el.lname()).to.equal(el.shadowRoot?.querySelector('#lname'));
40
+ });
41
+ //# sourceMappingURL=query.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"query.test.js","sourceRoot":"","sources":["../../src/lib/query.test.ts"],"names":[],"mappings":";AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,MAAM,CAAC;AAE9B,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACvC,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACnC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,EAAE,CAAC,aAAa,EAAE,GAAG,EAAE;QAYf,SAAS;gCAXd,OAAO,CAAC;gBACP,OAAO,EAAE,cAAc;gBACvB,SAAS,EAAE;oBACT,IAAI,CAAA;;;;;OAKH;iBACF;aACF,CAAC;;;;0BACsB,WAAW;6BAAnB,SAAQ,WAAW;;;;gBAAnC,6KAGC;;;gBAHK,uDAAS;;YACb,KAAK,GAAG,KAAK,CAAmB,QAAQ,CAAC,CAAC;YAC1C,KAAK,GAAG,KAAK,CAAmB,QAAQ,CAAC,CAAC;;;;IAG5C,MAAM,EAAE,GAAG,IAAI,SAAS,EAAE,CAAC;IAE3B,MAAM,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,UAAU,EAAE,aAAa,CAAC,QAAQ,CAAC,CAAC,CAAC;IACpE,MAAM,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,UAAU,EAAE,aAAa,CAAC,QAAQ,CAAC,CAAC,CAAC;AACtE,CAAC,CAAC,CAAC"}
@@ -1,12 +1,3 @@
1
1
  export interface ShadowResult {
2
- run(el: HTMLElement): void;
3
- }
4
- export declare abstract class JoistShadowResult implements ShadowResult {
5
- #private;
6
- strings: TemplateStringsArray;
7
- values: any[];
8
- get shadow(): ShadowRoot;
9
- constructor(raw: TemplateStringsArray, ...values: any[]);
10
- run(el: HTMLElement): void;
11
- abstract setup(root: ShadowRoot): void;
2
+ apply(el: Element): void;
12
3
  }
@@ -1,23 +1,2 @@
1
- export class JoistShadowResult {
2
- strings;
3
- values;
4
- #shadow = undefined;
5
- get shadow() {
6
- if (!this.#shadow) {
7
- throw new Error('ShadowResult has not been applied');
8
- }
9
- return this.#shadow;
10
- }
11
- constructor(raw, ...values) {
12
- this.strings = raw;
13
- this.values = values;
14
- }
15
- run(el) {
16
- if (!el.shadowRoot) {
17
- throw new Error('ShadowResult has not been applied');
18
- }
19
- this.#shadow = el.shadowRoot;
20
- this.setup(this.#shadow);
21
- }
22
- }
1
+ export {};
23
2
  //# sourceMappingURL=result.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"result.js","sourceRoot":"","sources":["../../src/lib/result.ts"],"names":[],"mappings":"AAIA,MAAM,OAAgB,iBAAiB;IACrC,OAAO,CAAC;IACR,MAAM,CAAC;IAEP,OAAO,GAA2B,SAAS,CAAC;IAE5C,IAAI,MAAM;QACR,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;YAClB,MAAM,IAAI,KAAK,CAAC,mCAAmC,CAAC,CAAC;QACvD,CAAC;QAED,OAAO,IAAI,CAAC,OAAO,CAAC;IACtB,CAAC;IAED,YAAY,GAAyB,EAAE,GAAG,MAAa;QACrD,IAAI,CAAC,OAAO,GAAG,GAAG,CAAC;QACnB,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;IACvB,CAAC;IAED,GAAG,CAAC,EAAe;QACjB,IAAI,CAAC,EAAE,CAAC,UAAU,EAAE,CAAC;YACnB,MAAM,IAAI,KAAK,CAAC,mCAAmC,CAAC,CAAC;QACvD,CAAC;QAED,IAAI,CAAC,OAAO,GAAG,EAAE,CAAC,UAAU,CAAC;QAE7B,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAC3B,CAAC;CAGF"}
1
+ {"version":3,"file":"result.js","sourceRoot":"","sources":["../../src/lib/result.ts"],"names":[],"mappings":""}
@@ -1,11 +1,13 @@
1
- import { JoistShadowResult } from './result.js';
2
- export declare const htmlTemplateCache: WeakMap<TemplateStringsArray, HTMLTemplateElement>;
3
- export declare class HTMLResult extends JoistShadowResult {
4
- setup(root: ShadowRoot): void;
1
+ import { ShadowResult } from './result.js';
2
+ export declare class HTMLResult<T extends HTMLElement> implements ShadowResult {
3
+ #private;
4
+ constructor(raw: TemplateStringsArray, ..._values: any[]);
5
+ apply(el: T): void;
5
6
  }
6
- export declare function html(strings: TemplateStringsArray, ...values: any[]): HTMLResult;
7
- export declare const styleSheetCache: WeakMap<TemplateStringsArray, CSSStyleSheet>;
8
- export declare class CSSResult extends JoistShadowResult {
9
- setup(root: ShadowRoot): void;
7
+ export declare function html<T extends HTMLElement>(strings: TemplateStringsArray, ...values: any[]): HTMLResult<T>;
8
+ export declare class CSSResult implements ShadowResult {
9
+ #private;
10
+ constructor(raw: TemplateStringsArray, ..._values: any[]);
11
+ apply(el: HTMLElement): void;
10
12
  }
11
13
  export declare function css(strings: TemplateStringsArray): CSSResult;
@@ -1,34 +1,28 @@
1
- import { JoistShadowResult } from './result.js';
2
- export const htmlTemplateCache = new WeakMap();
3
- export class HTMLResult extends JoistShadowResult {
4
- setup(root) {
5
- let template;
6
- if (htmlTemplateCache.has(this.strings)) {
7
- template = htmlTemplateCache.get(this.strings);
8
- }
9
- else {
10
- template = document.createElement('template');
11
- template.innerHTML = concat(this.strings);
12
- htmlTemplateCache.set(this.strings, template);
1
+ export class HTMLResult {
2
+ #template;
3
+ constructor(raw, ..._values) {
4
+ this.#template = document.createElement('template');
5
+ this.#template.innerHTML = concat(raw);
6
+ }
7
+ apply(el) {
8
+ if (el.shadowRoot) {
9
+ el.shadowRoot.append(this.#template.content.cloneNode(true));
13
10
  }
14
- root.append(template.content.cloneNode(true));
15
11
  }
16
12
  }
17
13
  export function html(strings, ...values) {
18
14
  return new HTMLResult(strings, ...values);
19
15
  }
20
- export const styleSheetCache = new WeakMap();
21
- export class CSSResult extends JoistShadowResult {
22
- setup(root) {
23
- let sheet;
24
- if (styleSheetCache.has(this.strings)) {
25
- sheet = styleSheetCache.get(this.strings);
26
- }
27
- else {
28
- sheet = new CSSStyleSheet();
29
- sheet.replaceSync(concat(this.strings));
16
+ export class CSSResult {
17
+ #sheet;
18
+ constructor(raw, ..._values) {
19
+ this.#sheet = new CSSStyleSheet();
20
+ this.#sheet.replaceSync(concat(raw));
21
+ }
22
+ apply(el) {
23
+ if (el.shadowRoot) {
24
+ el.shadowRoot.adoptedStyleSheets = [...el.shadowRoot.adoptedStyleSheets, this.#sheet];
30
25
  }
31
- root.adoptedStyleSheets = [...root.adoptedStyleSheets, sheet];
32
26
  }
33
27
  }
34
28
  export function css(strings) {
@@ -1 +1 @@
1
- {"version":3,"file":"tags.js","sourceRoot":"","sources":["../../src/lib/tags.ts"],"names":[],"mappings":"AAeA,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAEhD,MAAM,CAAC,MAAM,iBAAiB,GAAG,IAAI,OAAO,EAA6C,CAAC;AAE1F,MAAM,OAAO,UAAW,SAAQ,iBAAiB;IAC/C,KAAK,CAAC,IAAgB;QACpB,IAAI,QAA6B,CAAC;QAElC,IAAI,iBAAiB,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;YACxC,QAAQ,GAAG,iBAAiB,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAwB,CAAC;QACxE,CAAC;aAAM,CAAC;YACN,QAAQ,GAAG,QAAQ,CAAC,aAAa,CAAC,UAAU,CAAC,CAAC;YAE9C,QAAQ,CAAC,SAAS,GAAG,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YAC1C,iBAAiB,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;QAChD,CAAC;QAED,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC;IAChD,CAAC;CACF;AAED,MAAM,UAAU,IAAI,CAAC,OAA6B,EAAE,GAAG,MAAa;IAClE,OAAO,IAAI,UAAU,CAAC,OAAO,EAAE,GAAG,MAAM,CAAC,CAAC;AAC5C,CAAC;AAED,MAAM,CAAC,MAAM,eAAe,GAAG,IAAI,OAAO,EAAuC,CAAC;AAElF,MAAM,OAAO,SAAU,SAAQ,iBAAiB;IAC9C,KAAK,CAAC,IAAgB;QACpB,IAAI,KAAoB,CAAC;QAEzB,IAAI,eAAe,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;YACtC,KAAK,GAAG,eAAe,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAkB,CAAC;QAC7D,CAAC;aAAM,CAAC;YACN,KAAK,GAAG,IAAI,aAAa,EAAE,CAAC;YAE5B,KAAK,CAAC,WAAW,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC;QAC1C,CAAC;QAED,IAAI,CAAC,kBAAkB,GAAG,CAAC,GAAG,IAAI,CAAC,kBAAkB,EAAE,KAAK,CAAC,CAAC;IAChE,CAAC;CACF;AAED,MAAM,UAAU,GAAG,CAAC,OAA6B;IAC/C,OAAO,IAAI,SAAS,CAAC,OAAO,CAAC,CAAC;AAChC,CAAC;AAED,SAAS,MAAM,CAAC,OAA6B;IAC3C,IAAI,GAAG,GAAG,EAAE,CAAC;IAEb,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACxC,GAAG,IAAI,OAAO,CAAC,CAAC,CAAC,CAAC;IACpB,CAAC;IAED,OAAO,GAAG,CAAC;AACb,CAAC"}
1
+ {"version":3,"file":"tags.js","sourceRoot":"","sources":["../../src/lib/tags.ts"],"names":[],"mappings":"AAEA,MAAM,OAAO,UAAU;IACrB,SAAS,CAAC;IAEV,YAAY,GAAyB,EAAE,GAAG,OAAc;QACtD,IAAI,CAAC,SAAS,GAAG,QAAQ,CAAC,aAAa,CAAC,UAAU,CAAC,CAAC;QACpD,IAAI,CAAC,SAAS,CAAC,SAAS,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;IACzC,CAAC;IAED,KAAK,CAAC,EAAK;QACT,IAAI,EAAE,CAAC,UAAU,EAAE,CAAC;YAClB,EAAE,CAAC,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC;QAC/D,CAAC;IACH,CAAC;CACF;AAED,MAAM,UAAU,IAAI,CAClB,OAA6B,EAC7B,GAAG,MAAa;IAEhB,OAAO,IAAI,UAAU,CAAC,OAAO,EAAE,GAAG,MAAM,CAAC,CAAC;AAC5C,CAAC;AAED,MAAM,OAAO,SAAS;IACpB,MAAM,CAAC;IAEP,YAAY,GAAyB,EAAE,GAAG,OAAc;QACtD,IAAI,CAAC,MAAM,GAAG,IAAI,aAAa,EAAE,CAAC;QAClC,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;IACvC,CAAC;IAED,KAAK,CAAC,EAAe;QACnB,IAAI,EAAE,CAAC,UAAU,EAAE,CAAC;YAClB,EAAE,CAAC,UAAU,CAAC,kBAAkB,GAAG,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,kBAAkB,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;QACxF,CAAC;IACH,CAAC;CACF;AAED,MAAM,UAAU,GAAG,CAAC,OAA6B;IAC/C,OAAO,IAAI,SAAS,CAAC,OAAO,CAAC,CAAC;AAChC,CAAC;AAED,SAAS,MAAM,CAAC,OAA6B;IAC3C,IAAI,GAAG,GAAG,EAAE,CAAC;IAEb,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACxC,GAAG,IAAI,OAAO,CAAC,CAAC,CAAC,CAAC;IACpB,CAAC;IAED,OAAO,GAAG,CAAC;AACb,CAAC"}
@@ -0,0 +1,11 @@
1
+ type TemplateValueGetter = (key: string) => string;
2
+ export interface TemplateOpts {
3
+ value?: TemplateValueGetter;
4
+ tokenPrefix?: string;
5
+ }
6
+ export interface RenderOpts {
7
+ refresh?: boolean;
8
+ }
9
+ export declare function template({ tokenPrefix, value }?: TemplateOpts): <T extends HTMLElement>(this: T, opts?: RenderOpts) => void;
10
+ export declare function getTemplateValue(obj: object, key: string): any;
11
+ export {};
@@ -0,0 +1,87 @@
1
+ class Updates extends Set {
2
+ }
3
+ export function template({ tokenPrefix = '#:', value } = {}) {
4
+ let updates = null;
5
+ return function render(opts) {
6
+ if (!updates || opts?.refresh) {
7
+ updates = findUpdates(this, {
8
+ tokenPrefix,
9
+ value: value ?? ((key) => getTemplateValue(this, key))
10
+ });
11
+ }
12
+ else {
13
+ for (let update of updates) {
14
+ update();
15
+ }
16
+ }
17
+ };
18
+ }
19
+ function findUpdates(el, opts) {
20
+ const iterator = document.createTreeWalker(el.shadowRoot ?? el, NodeFilter.SHOW_ELEMENT);
21
+ const updates = new Updates();
22
+ while (iterator.nextNode()) {
23
+ const res = trackElement(iterator.currentNode, updates, opts);
24
+ if (res !== null) {
25
+ iterator.currentNode = res;
26
+ }
27
+ }
28
+ return updates;
29
+ }
30
+ function trackElement(node, updates, opts) {
31
+ const element = node;
32
+ const getter = opts.value;
33
+ const tokenPrefix = opts.tokenPrefix;
34
+ for (let attr of element.attributes) {
35
+ const nodeValue = attr.value.trim();
36
+ const realAttributeName = attr.name.replace(tokenPrefix, '');
37
+ let update = null;
38
+ if (attr.name.startsWith(`${tokenPrefix}bind`)) {
39
+ update = () => {
40
+ const value = getter(attr.value);
41
+ if (element.textContent !== value) {
42
+ element.textContent = getter(attr.value);
43
+ }
44
+ };
45
+ }
46
+ else if (attr.name.startsWith(tokenPrefix)) {
47
+ const isBooleanAttr = nodeValue.startsWith('!');
48
+ const isPositive = nodeValue.startsWith('!!');
49
+ const propertyKey = nodeValue.replaceAll('!', '');
50
+ if (isBooleanAttr) {
51
+ update = () => {
52
+ let value = isPositive ? !!getter(propertyKey) : !getter(propertyKey);
53
+ if (value) {
54
+ element.setAttribute(realAttributeName, '');
55
+ }
56
+ else {
57
+ element.removeAttribute(realAttributeName);
58
+ }
59
+ };
60
+ }
61
+ else {
62
+ const realAttribute = document.createAttribute(realAttributeName);
63
+ element.setAttributeNode(realAttribute);
64
+ update = () => {
65
+ const value = getter(nodeValue);
66
+ if (realAttribute.value !== value) {
67
+ realAttribute.value = value;
68
+ }
69
+ };
70
+ }
71
+ }
72
+ if (update) {
73
+ updates.add(update);
74
+ update();
75
+ }
76
+ }
77
+ return null;
78
+ }
79
+ export function getTemplateValue(obj, key) {
80
+ const parsed = key.split('.');
81
+ let pointer = obj;
82
+ for (let part of parsed) {
83
+ pointer = pointer[part];
84
+ }
85
+ return pointer;
86
+ }
87
+ //# sourceMappingURL=template.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"template.js","sourceRoot":"","sources":["../../src/lib/template.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,91 @@
1
+ import { assert } from 'chai';
2
+ import { template } from './template.js';
3
+ const TESTS = [
4
+ function bindableNodes(el, root) {
5
+ it(`should intialize bindable nodes ${root instanceof ShadowRoot ? '(ShadowDOM)' : '(LightDOM)'}`, () => {
6
+ el.title = 'Hello World';
7
+ el.ariaLabel = 'This is the label';
8
+ el.ariaDescription = 'This is the description';
9
+ root.innerHTML = `
10
+ <span #:bind="title"></span>
11
+
12
+ <ul>
13
+ <li #:bind="ariaLabel"></li>
14
+ <li #:bind="ariaDescription"></li>
15
+ </ul>
16
+ `;
17
+ const render = template().bind(el);
18
+ render();
19
+ assert.equal(root.innerHTML
20
+ .split('\n')
21
+ .map((res) => res.trim())
22
+ .join(''), '<span #:bind="title">Hello World</span><ul><li #:bind="ariaLabel">This is the label</li><li #:bind="ariaDescription">This is the description</li></ul>');
23
+ });
24
+ },
25
+ function attributeNodes(el, root) {
26
+ it(`should intialize template attributes ${root instanceof ShadowRoot ? '(ShadowDOM)' : '(LightDOM)'}`, () => {
27
+ el.ariaLabel = 'This is the label';
28
+ el.ariaDescription = 'This is the description';
29
+ root.innerHTML = `
30
+ <ul #:aria-label="ariaLabel" #:aria-description="ariaDescription"></ul>
31
+ `;
32
+ const render = template().bind(el);
33
+ render();
34
+ assert.equal(root.innerHTML
35
+ .split('\n')
36
+ .map((res) => res.trim())
37
+ .join(''), '<ul #:aria-label="ariaLabel" #:aria-description="ariaDescription" aria-label="This is the label" aria-description="This is the description"></ul>');
38
+ });
39
+ },
40
+ function customGetter(el, root) {
41
+ it(`should use custom getter for values ${root instanceof ShadowRoot ? '(ShadowDOM)' : '(LightDOM)'}`, () => {
42
+ const data = {
43
+ title: 'Hello World',
44
+ ariaLabel: 'This is the label',
45
+ ariaDescription: 'This is the description'
46
+ };
47
+ root.innerHTML = `
48
+ <span #:bind="title"></span>
49
+
50
+ <ul>
51
+ <li #:bind="ariaLabel"></li>
52
+ <li #:bind="ariaDescription"></li>
53
+ </ul>
54
+ `;
55
+ const render = template({ value: (key) => data[key] }).bind(el);
56
+ render();
57
+ assert.equal(root.innerHTML
58
+ .split('\n')
59
+ .map((res) => res.trim())
60
+ .join(''), '<span #:bind="title">Hello World</span><ul><li #:bind="ariaLabel">This is the label</li><li #:bind="ariaDescription">This is the description</li></ul>');
61
+ });
62
+ },
63
+ function customPrefix(el, root) {
64
+ it(`should use custom getter for values ${root instanceof ShadowRoot ? '(ShadowDOM)' : '(LightDOM)'}`, () => {
65
+ el.title = 'Hello World';
66
+ el.ariaLabel = 'This is the label';
67
+ el.ariaDescription = 'This is the description';
68
+ root.innerHTML = `
69
+ <span x-bind="title"></span>
70
+
71
+ <ul x-aria-label="ariaLabel">
72
+ <li x-bind="ariaLabel"></li>
73
+ <li x-bind="ariaDescription"></li>
74
+ </ul>
75
+ `;
76
+ const render = template({ tokenPrefix: 'x-' }).bind(el);
77
+ render();
78
+ assert.equal(root.innerHTML
79
+ .split('\n')
80
+ .map((res) => res.trim())
81
+ .join(''), '<span x-bind="title">Hello World</span><ul x-aria-label="ariaLabel" aria-label="This is the label"><li x-bind="ariaLabel">This is the label</li><li x-bind="ariaDescription">This is the description</li></ul>');
82
+ });
83
+ }
84
+ ];
85
+ for (let test of TESTS) {
86
+ const lightEl = document.createElement('div');
87
+ test(lightEl, lightEl);
88
+ const shadowEl = document.createElement('div');
89
+ test(shadowEl, shadowEl.attachShadow({ mode: 'open' }));
90
+ }
91
+ //# sourceMappingURL=template.test.js.map