@joist/element 2.0.1-next.1637807849.0 → 3.0.0-2

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 (44) hide show
  1. package/README.md +22 -106
  2. package/package.json +33 -18
  3. package/target/lib/attr.d.ts +1 -0
  4. package/target/lib/attr.js +76 -0
  5. package/target/lib/attr.js.map +1 -0
  6. package/target/lib/attr.test.d.ts +1 -0
  7. package/target/lib/attr.test.js +122 -0
  8. package/target/lib/attr.test.js.map +1 -0
  9. package/target/lib/listen.d.ts +1 -0
  10. package/target/lib/listen.js +13 -0
  11. package/target/lib/listen.js.map +1 -0
  12. package/target/lib/result.d.ts +6 -0
  13. package/target/lib/result.js +9 -0
  14. package/target/lib/result.js.map +1 -0
  15. package/target/lib/shadow.d.ts +2 -0
  16. package/target/lib/shadow.js +16 -0
  17. package/target/lib/shadow.js.map +1 -0
  18. package/target/lib/shadow.test.d.ts +1 -0
  19. package/target/lib/shadow.test.js +54 -0
  20. package/target/lib/shadow.test.js.map +1 -0
  21. package/target/lib/tag-name.d.ts +1 -0
  22. package/target/lib/tag-name.js +11 -0
  23. package/target/lib/tag-name.js.map +1 -0
  24. package/target/lib/tag-name.test.d.ts +0 -0
  25. package/target/lib/tag-name.test.js +2 -0
  26. package/target/lib/tag-name.test.js.map +1 -0
  27. package/target/lib/tags.d.ts +9 -0
  28. package/target/lib/tags.js +22 -0
  29. package/target/lib/tags.js.map +1 -0
  30. package/target/lib.d.ts +6 -0
  31. package/target/lib.js +7 -0
  32. package/target/lib.js.map +1 -0
  33. package/target/tsconfig.tsbuildinfo +1 -0
  34. package/observable/package.json +0 -4
  35. package/styled/package.json +0 -4
  36. package/target/build/lib/observable.d.ts +0 -324
  37. package/target/build/lib/observable.js +0 -73
  38. package/target/build/lib/observable.js.map +0 -1
  39. package/target/build/lib/styled.d.ts +0 -310
  40. package/target/build/lib/styled.js +0 -45
  41. package/target/build/lib/styled.js.map +0 -1
  42. package/target/build/lib.d.ts +0 -2
  43. package/target/build/lib.js +0 -3
  44. package/target/build/lib.js.map +0 -1
package/README.md CHANGED
@@ -1,120 +1,36 @@
1
- # Di
1
+ # Element
2
2
 
3
- Dependency Injection in ~800 bytes. Can be used with and without decorators.
3
+ Create a shadow root and apply styles and html as defined
4
4
 
5
5
  #### Installation:
6
6
 
7
7
  ```BASH
8
- npm i @joist/di
8
+ npm i @joist/element
9
9
  ```
10
10
 
11
11
  #### Example:
12
12
 
13
13
  ```TS
14
- import { Injector } from '@joist/di';
15
-
16
- class FooService {
17
- sayHello() {
18
- return 'Hello From FooService';
19
- }
20
- }
21
-
22
- class BarService {
23
- static deps = [FooService];
24
-
25
- constructor(private foo: FooService) {}
26
-
27
- sayHello() {
28
- return 'Hello From BarService and ' + this.foo.sayHello();
29
- }
30
- }
31
-
32
- const app = new Injector();
33
-
34
- app.get(BarService).sayHello(); // Hello from BarService and Hello from FooService
35
- ```
36
-
37
- ```TS
38
- import { Injector } from '@joist/di';
39
- import { inject } from '@joist/di/decorators';
40
-
41
- class FooService {
42
- sayHello() {
43
- return 'Hello From FooService';
44
- }
45
- }
46
-
47
- class BarService {
48
- constructor(@inject(FooService) private foo: FooService) {}
49
-
50
- sayHello() {
51
- return 'Hello From BarService and ' + this.foo.sayHello();
52
- }
53
- }
54
-
55
- const app = new Injector();
56
-
57
- app.get(BarService).sayHello(); // Hello from BarService and Hello from FooService
58
- ```
59
-
60
- #### Override A Service:
61
-
62
- ```TS
63
- import { Injector } from '@joist/di';
64
- import { inject } from '@joist/di/decorators';
65
-
66
- class FooService {
67
- sayHello() {
68
- return 'Hello From FooService';
69
- }
70
- }
71
-
72
- class BarService {
73
- constructor(@inject(FooService) private foo: FooService) {}
74
-
75
- sayHello() {
76
- return 'Hello From BarService and ' + this.foo.sayHello();
77
- }
78
- }
79
-
80
- // Override FooService with an alternate implementation
81
- const app = new Injector({
82
- providers: [
83
- {
84
- provide: FooService,
85
- use: class extends FooService {
86
- sayHello() {
87
- return 'IT HAS BEEN OVERRIDEN'
88
- }
89
- }
14
+ import { styles, template, css, html, define, listen, attr } from '@joist/element';
15
+
16
+ export class MyElement extends HTMLElement {
17
+ @define static tagName = 'my-element';
18
+
19
+ @styles styles = css`
20
+ :host {
21
+ display: block;
22
+ color: red;
90
23
  }
91
- ]
92
- });
93
-
94
- app.get(BarService).sayHello(); // Hello from BarService and IT HAS BEEN OVERRIDEN
95
- ```
96
-
97
- #### Root Service
98
-
99
- If you have nested injectors and you still want singleton instances mark your service as shown or decorate with `@service()`
100
-
101
- ```TS
102
- class FooService {
103
- static providedInRoot = true;
104
-
105
- sayHello() {
106
- return 'Hello From FooService';
107
- }
108
- }
109
- ```
110
-
111
- ```TS
112
- import { service } from '@joist/di/decorators';
113
-
114
- @service()
115
- class FooService {
116
- sayHello() {
117
- return 'Hello From FooService';
24
+ `;
25
+
26
+ @template template = html`
27
+ <slot></slot>
28
+ `;
29
+
30
+ @attr accessor value = 0;
31
+
32
+ @listen('click') onClick() {
33
+ console.log('clicked!')
118
34
  }
119
35
  }
120
36
  ```
package/package.json CHANGED
@@ -1,34 +1,30 @@
1
1
  {
2
2
  "name": "@joist/element",
3
- "version": "2.0.1-next.1637807849.0+b8e14a4",
4
- "main": "./target/build/lib.js",
5
- "module": "./target/build/lib.js",
3
+ "version": "3.0.0-2",
4
+ "main": "./target/lib.js",
5
+ "module": "./target/lib.js",
6
6
  "exports": {
7
7
  ".": {
8
- "import": "./target/build/lib.js"
8
+ "import": "./target/lib.js"
9
9
  },
10
- "./observable": {
11
- "import": "./target/build/lib/observable.js"
12
- },
13
- "./styled": {
14
- "import": "./target/build/lib/styled.js"
10
+ "./*": {
11
+ "import": "./target/lib/*.js"
15
12
  }
16
13
  },
17
14
  "files": [
18
- "target/build",
19
- "observable/package.json",
20
- "styled/package.json"
15
+ "target"
21
16
  ],
22
17
  "sideEffects": false,
23
- "description": "Dependency Injection in ~800 bytes",
18
+ "description": "Intelligently apply styles to WebComponents",
24
19
  "repository": {
25
20
  "type": "git",
26
21
  "url": "git+https://github.com/deebloo/joist.git"
27
22
  },
28
23
  "keywords": [
29
24
  "TypeScript",
30
- "DI",
31
- "Dependency Injection"
25
+ "WebComponents",
26
+ "CSS",
27
+ "ShadowDOM"
32
28
  ],
33
29
  "author": "deebloo",
34
30
  "license": "MIT",
@@ -39,8 +35,27 @@
39
35
  "access": "public"
40
36
  },
41
37
  "scripts": {
42
- "test": "tsc -p tsconfig.test.json && wtr --config ../../wtr.config.mjs --port 8000",
43
- "build": "tsc -p tsconfig.build.json"
38
+ "test": "wireit",
39
+ "build": "wireit"
40
+ },
41
+ "wireit": {
42
+ "build": {
43
+ "command": "tsc --build --pretty",
44
+ "clean": "if-file-deleted",
45
+ "files": [
46
+ "src/**",
47
+ "tsconfig.json"
48
+ ],
49
+ "output": [
50
+ "target/**"
51
+ ]
52
+ },
53
+ "test": {
54
+ "command": "wtr --config ../../wtr.config.mjs --port 8001",
55
+ "dependencies": [
56
+ "build"
57
+ ]
58
+ }
44
59
  },
45
- "gitHead": "b8e14a42021f05d089c7dfe17fc426e10b1a50f0"
60
+ "gitHead": "e6e36105708633b45a0585b066a89f07a7ac78cb"
46
61
  }
@@ -0,0 +1 @@
1
+ export declare function attr<This extends HTMLElement>({ get, set }: ClassAccessorDecoratorTarget<This, unknown>, ctx: ClassAccessorDecoratorContext<This>): ClassAccessorDecoratorResult<This, any>;
@@ -0,0 +1,76 @@
1
+ export function attr({ get, set }, ctx) {
2
+ return {
3
+ init(value) {
4
+ if (typeof ctx.name === 'string') {
5
+ if (this.hasAttribute(ctx.name)) {
6
+ const attr = this.getAttribute(ctx.name);
7
+ // treat as boolean
8
+ if (attr === '') {
9
+ return true;
10
+ }
11
+ // treat as number
12
+ if (typeof value === 'number') {
13
+ return Number(attr);
14
+ }
15
+ // treat as string
16
+ return attr;
17
+ }
18
+ // should set attributes AFTER init to allow setup to complete
19
+ // If we do not do this the attributeChangedCallback could fire before init.
20
+ // If the user attempts to read or write to this property it will fail
21
+ // this also normalizes when the attributeChangedCallback is called in different rendering scenarios
22
+ Promise.resolve().then(() => {
23
+ const cached = get.call(this);
24
+ if (cached === true) {
25
+ // set boolean attribute
26
+ this.setAttribute(ctx.name.toString(), '');
27
+ }
28
+ else {
29
+ // set key/value attribute
30
+ const attrValue = String(cached);
31
+ if (attrValue !== this.getAttribute(ctx.name.toString())) {
32
+ this.setAttribute(ctx.name.toString(), String(cached));
33
+ }
34
+ }
35
+ });
36
+ }
37
+ return value;
38
+ },
39
+ set(value) {
40
+ if (typeof ctx.name === 'string') {
41
+ if (typeof value === 'boolean') {
42
+ if (value) {
43
+ this.setAttribute(ctx.name, '');
44
+ }
45
+ else {
46
+ this.removeAttribute(ctx.name);
47
+ }
48
+ }
49
+ else {
50
+ this.setAttribute(ctx.name, String(value));
51
+ }
52
+ }
53
+ return set.call(this, value);
54
+ },
55
+ get() {
56
+ const ogValue = get.call(this);
57
+ if (typeof ctx.name === 'string') {
58
+ const attr = this.getAttribute(ctx.name);
59
+ // treat as attribute
60
+ if (attr === '') {
61
+ return true;
62
+ }
63
+ // treat as number
64
+ if (typeof ogValue === 'number') {
65
+ return Number(attr);
66
+ }
67
+ // treat as string
68
+ return attr;
69
+ }
70
+ else {
71
+ return ogValue;
72
+ }
73
+ },
74
+ };
75
+ }
76
+ //# sourceMappingURL=attr.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"attr.js","sourceRoot":"","sources":["../../src/lib/attr.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,IAAI,CAClB,EAAE,GAAG,EAAE,GAAG,EAA+C,EACzD,GAAwC;IAExC,OAAO;QACL,IAAI,CAAC,KAAc;YACjB,IAAI,OAAO,GAAG,CAAC,IAAI,KAAK,QAAQ,EAAE;gBAChC,IAAI,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE;oBAC/B,MAAM,IAAI,GAAG,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;oBAEzC,mBAAmB;oBACnB,IAAI,IAAI,KAAK,EAAE,EAAE;wBACf,OAAO,IAAI,CAAC;qBACb;oBAED,kBAAkB;oBAClB,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE;wBAC7B,OAAO,MAAM,CAAC,IAAI,CAAC,CAAC;qBACrB;oBAED,kBAAkB;oBAClB,OAAO,IAAI,CAAC;iBACb;gBAED,8DAA8D;gBAC9D,4EAA4E;gBAC5E,sEAAsE;gBACtE,oGAAoG;gBACpG,OAAO,CAAC,OAAO,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE;oBAC1B,MAAM,MAAM,GAAG,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;oBAE9B,IAAI,MAAM,KAAK,IAAI,EAAE;wBACnB,wBAAwB;wBACxB,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,EAAE,EAAE,EAAE,CAAC,CAAC;qBAC5C;yBAAM;wBACL,0BAA0B;wBAC1B,MAAM,SAAS,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC;wBAEjC,IAAI,SAAS,KAAK,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,EAAE;4BACxD,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,EAAE,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC;yBACxD;qBACF;gBACH,CAAC,CAAC,CAAC;aACJ;YAED,OAAO,KAAK,CAAC;QACf,CAAC;QACD,GAAG,CAAC,KAAc;YAChB,IAAI,OAAO,GAAG,CAAC,IAAI,KAAK,QAAQ,EAAE;gBAChC,IAAI,OAAO,KAAK,KAAK,SAAS,EAAE;oBAC9B,IAAI,KAAK,EAAE;wBACT,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;qBACjC;yBAAM;wBACL,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;qBAChC;iBACF;qBAAM;oBACL,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;iBAC5C;aACF;YAED,OAAO,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;QAC/B,CAAC;QACD,GAAG;YACD,MAAM,OAAO,GAAG,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAE/B,IAAI,OAAO,GAAG,CAAC,IAAI,KAAK,QAAQ,EAAE;gBAChC,MAAM,IAAI,GAAG,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;gBAEzC,qBAAqB;gBACrB,IAAI,IAAI,KAAK,EAAE,EAAE;oBACf,OAAO,IAAI,CAAC;iBACb;gBAED,kBAAkB;gBAClB,IAAI,OAAO,OAAO,KAAK,QAAQ,EAAE;oBAC/B,OAAO,MAAM,CAAC,IAAI,CAAC,CAAC;iBACrB;gBAED,kBAAkB;gBAClB,OAAO,IAAI,CAAC;aACb;iBAAM;gBACL,OAAO,OAAO,CAAC;aAChB;QACH,CAAC;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,122 @@
1
+ import { __esDecorate, __runInitializers } from "tslib";
2
+ import { expect, fixture, html } from '@open-wc/testing';
3
+ import { attr } from './attr.js';
4
+ describe('observable: attr()', () => {
5
+ it('should write default value to attribute', async () => {
6
+ let MyElement = (() => {
7
+ let _instanceExtraInitializers = [];
8
+ let _hello_decorators;
9
+ let _hello_initializers = [];
10
+ return class MyElement extends HTMLElement {
11
+ static {
12
+ _hello_decorators = [attr];
13
+ __esDecorate(this, null, _hello_decorators, { kind: "accessor", name: "hello", static: false, private: false, access: { has: obj => "hello" in obj, get: obj => obj.hello, set: (obj, value) => { obj.hello = value; } } }, _hello_initializers, _instanceExtraInitializers);
14
+ }
15
+ #hello_accessor_storage = (__runInitializers(this, _instanceExtraInitializers), __runInitializers(this, _hello_initializers, 'world'));
16
+ get hello() { return this.#hello_accessor_storage; }
17
+ set hello(value) { this.#hello_accessor_storage = value; }
18
+ };
19
+ })();
20
+ customElements.define('attr-test-1', MyElement);
21
+ const el = await fixture(html `<attr-test-1></attr-test-1>`);
22
+ expect(el.getAttribute('hello')).to.equal('world');
23
+ });
24
+ it('should read default value from attribute', async () => {
25
+ let MyElement = (() => {
26
+ let _instanceExtraInitializers_1 = [];
27
+ let _hello_decorators;
28
+ let _hello_initializers = [];
29
+ return class MyElement extends HTMLElement {
30
+ static {
31
+ _hello_decorators = [attr];
32
+ __esDecorate(this, null, _hello_decorators, { kind: "accessor", name: "hello", static: false, private: false, access: { has: obj => "hello" in obj, get: obj => obj.hello, set: (obj, value) => { obj.hello = value; } } }, _hello_initializers, _instanceExtraInitializers_1);
33
+ }
34
+ #hello_accessor_storage = (__runInitializers(this, _instanceExtraInitializers_1), __runInitializers(this, _hello_initializers, 'world'));
35
+ get hello() { return this.#hello_accessor_storage; }
36
+ set hello(value) { this.#hello_accessor_storage = value; }
37
+ };
38
+ })();
39
+ customElements.define('attr-test-2', MyElement);
40
+ const el = await fixture(html `<attr-test-2 hello="foo"></attr-test-2>`);
41
+ expect(el.hello).to.equal('foo');
42
+ });
43
+ it('should write boolean attr values', async () => {
44
+ let MyElement = (() => {
45
+ let _instanceExtraInitializers_2 = [];
46
+ let _hello_decorators;
47
+ let _hello_initializers = [];
48
+ return class MyElement extends HTMLElement {
49
+ static {
50
+ _hello_decorators = [attr];
51
+ __esDecorate(this, null, _hello_decorators, { kind: "accessor", name: "hello", static: false, private: false, access: { has: obj => "hello" in obj, get: obj => obj.hello, set: (obj, value) => { obj.hello = value; } } }, _hello_initializers, _instanceExtraInitializers_2);
52
+ }
53
+ #hello_accessor_storage = (__runInitializers(this, _instanceExtraInitializers_2), __runInitializers(this, _hello_initializers, true));
54
+ get hello() { return this.#hello_accessor_storage; }
55
+ set hello(value) { this.#hello_accessor_storage = value; }
56
+ };
57
+ })();
58
+ customElements.define('attr-test-3', MyElement);
59
+ const el = await fixture(html `<attr-test-3></attr-test-3>`);
60
+ expect(el.getAttribute('hello')).to.equal('');
61
+ el.hello = false;
62
+ expect(el.getAttribute('hello')).to.equal(null);
63
+ });
64
+ it('should parse to boolean values', async () => {
65
+ let MyElement = (() => {
66
+ let _instanceExtraInitializers_3 = [];
67
+ let _hello_decorators;
68
+ let _hello_initializers = [];
69
+ return class MyElement extends HTMLElement {
70
+ static {
71
+ _hello_decorators = [attr];
72
+ __esDecorate(this, null, _hello_decorators, { kind: "accessor", name: "hello", static: false, private: false, access: { has: obj => "hello" in obj, get: obj => obj.hello, set: (obj, value) => { obj.hello = value; } } }, _hello_initializers, _instanceExtraInitializers_3);
73
+ }
74
+ #hello_accessor_storage = (__runInitializers(this, _instanceExtraInitializers_3), __runInitializers(this, _hello_initializers, false));
75
+ get hello() { return this.#hello_accessor_storage; }
76
+ set hello(value) { this.#hello_accessor_storage = value; }
77
+ };
78
+ })();
79
+ customElements.define('attr-test-4', MyElement);
80
+ const el = await fixture(html `<attr-test-4 hello></attr-test-4>`);
81
+ expect(el.hello).to.equal(true);
82
+ });
83
+ it('should read attributes as number if prop is of type number', async () => {
84
+ let MyElement = (() => {
85
+ let _instanceExtraInitializers_4 = [];
86
+ let _value_decorators;
87
+ let _value_initializers = [];
88
+ return class MyElement extends HTMLElement {
89
+ static {
90
+ _value_decorators = [attr];
91
+ __esDecorate(this, null, _value_decorators, { kind: "accessor", name: "value", static: false, private: false, access: { has: obj => "value" in obj, get: obj => obj.value, set: (obj, value) => { obj.value = value; } } }, _value_initializers, _instanceExtraInitializers_4);
92
+ }
93
+ #value_accessor_storage = (__runInitializers(this, _instanceExtraInitializers_4), __runInitializers(this, _value_initializers, 0));
94
+ get value() { return this.#value_accessor_storage; }
95
+ set value(value) { this.#value_accessor_storage = value; }
96
+ };
97
+ })();
98
+ customElements.define('attr-test-5', MyElement);
99
+ const el = await fixture(html `<attr-test-5 value="100"></attr-test-5>`);
100
+ expect(el.value).to.equal(100);
101
+ });
102
+ it('should NOT read attributes as number if prop is of type string', async () => {
103
+ let MyElement = (() => {
104
+ let _instanceExtraInitializers_5 = [];
105
+ let _value_decorators;
106
+ let _value_initializers = [];
107
+ return class MyElement extends HTMLElement {
108
+ static {
109
+ _value_decorators = [attr];
110
+ __esDecorate(this, null, _value_decorators, { kind: "accessor", name: "value", static: false, private: false, access: { has: obj => "value" in obj, get: obj => obj.value, set: (obj, value) => { obj.value = value; } } }, _value_initializers, _instanceExtraInitializers_5);
111
+ }
112
+ #value_accessor_storage = (__runInitializers(this, _instanceExtraInitializers_5), __runInitializers(this, _value_initializers, '0'));
113
+ get value() { return this.#value_accessor_storage; }
114
+ set value(value) { this.#value_accessor_storage = value; }
115
+ };
116
+ })();
117
+ customElements.define('attr-test-6', MyElement);
118
+ const el = await fixture(html `<attr-test-6 value="100"></attr-test-6>`);
119
+ expect(el.value).to.equal('100');
120
+ });
121
+ });
122
+ //# sourceMappingURL=attr.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"attr.test.js","sourceRoot":"","sources":["../../src/lib/attr.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export declare function listen<This extends HTMLElement>(event: string): (value: (e: Event) => void, ctx: ClassMethodDecoratorContext<This>) => void;
@@ -0,0 +1,13 @@
1
+ export function listen(event) {
2
+ return (value, ctx) => {
3
+ ctx.addInitializer(function () {
4
+ // method initializers are run before fields and accessors.
5
+ // we want to wait till after all have run so we can check if there is a shadowRoot or not.
6
+ Promise.resolve().then(() => {
7
+ const root = this.shadowRoot || this;
8
+ root.addEventListener(event, value.bind(this));
9
+ });
10
+ });
11
+ };
12
+ }
13
+ //# sourceMappingURL=listen.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"listen.js","sourceRoot":"","sources":["../../src/lib/listen.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,MAAM,CAA2B,KAAa;IAC5D,OAAO,CAAC,KAAyB,EAAE,GAAsC,EAAE,EAAE;QAC3E,GAAG,CAAC,cAAc,CAAC;YACjB,2DAA2D;YAC3D,2FAA2F;YAC3F,OAAO,CAAC,OAAO,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE;gBAC1B,MAAM,IAAI,GAAG,IAAI,CAAC,UAAU,IAAI,IAAI,CAAC;gBAErC,IAAI,CAAC,gBAAgB,CAAC,KAAK,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;YACjD,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC,CAAC;AACJ,CAAC"}
@@ -0,0 +1,6 @@
1
+ export declare abstract class TemplateResult {
2
+ strings: TemplateStringsArray;
3
+ values: any[];
4
+ constructor(raw: TemplateStringsArray, ...values: any[]);
5
+ abstract apply(root: ShadowRoot): void;
6
+ }
@@ -0,0 +1,9 @@
1
+ export class TemplateResult {
2
+ strings;
3
+ values;
4
+ constructor(raw, ...values) {
5
+ this.strings = raw;
6
+ this.values = values;
7
+ }
8
+ }
9
+ //# sourceMappingURL=result.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"result.js","sourceRoot":"","sources":["../../src/lib/result.ts"],"names":[],"mappings":"AAAA,MAAM,OAAgB,cAAc;IAClC,OAAO,CAAuB;IAC9B,MAAM,CAAQ;IAEd,YAAY,GAAyB,EAAE,GAAG,MAAa;QACrD,IAAI,CAAC,OAAO,GAAG,GAAG,CAAC;QACnB,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;IACvB,CAAC;CAGF"}
@@ -0,0 +1,2 @@
1
+ import { TemplateResult } from './result.js';
2
+ export declare function shadow<This extends HTMLElement, T extends TemplateResult>(_: undefined, ctx: ClassFieldDecoratorContext<This, T>): (result: T) => T;
@@ -0,0 +1,16 @@
1
+ export function shadow(_, ctx) {
2
+ const shadow = applyShadow(ctx);
3
+ return (result) => {
4
+ const root = shadow();
5
+ result.apply(root);
6
+ return result;
7
+ };
8
+ }
9
+ function applyShadow(ctx) {
10
+ let shadow;
11
+ ctx.addInitializer(function () {
12
+ shadow = this.shadowRoot || this.attachShadow({ mode: 'open' });
13
+ });
14
+ return () => shadow;
15
+ }
16
+ //# sourceMappingURL=shadow.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shadow.js","sourceRoot":"","sources":["../../src/lib/shadow.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,MAAM,CACpB,CAAY,EACZ,GAAwC;IAExC,MAAM,MAAM,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC;IAEhC,OAAO,CAAC,MAAS,EAAE,EAAE;QACnB,MAAM,IAAI,GAAG,MAAM,EAAE,CAAC;QAEtB,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAEnB,OAAO,MAAM,CAAC;IAChB,CAAC,CAAC;AACJ,CAAC;AAED,SAAS,WAAW,CAClB,GAAyE;IAEzE,IAAI,MAAkB,CAAC;IAEvB,GAAG,CAAC,cAAc,CAAC;QACjB,MAAM,GAAG,IAAI,CAAC,UAAU,IAAI,IAAI,CAAC,YAAY,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;IAClE,CAAC,CAAC,CAAC;IAEH,OAAO,GAAG,EAAE,CAAC,MAAM,CAAC;AACtB,CAAC"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,54 @@
1
+ import { __esDecorate, __runInitializers } from "tslib";
2
+ import { expect } from '@open-wc/testing';
3
+ import { css, html } from './tags.js';
4
+ import { shadow } from './shadow.js';
5
+ describe('template', () => {
6
+ it('should apply a stylesheet', () => {
7
+ let MyElement = (() => {
8
+ let _instanceExtraInitializers = [];
9
+ let _styles_decorators;
10
+ let _styles_initializers = [];
11
+ return class MyElement extends HTMLElement {
12
+ static {
13
+ _styles_decorators = [shadow];
14
+ __esDecorate(null, null, _styles_decorators, { kind: "field", name: "styles", static: false, private: false, access: { has: obj => "styles" in obj, get: obj => obj.styles, set: (obj, value) => { obj.styles = value; } } }, _styles_initializers, _instanceExtraInitializers);
15
+ }
16
+ styles = (__runInitializers(this, _instanceExtraInitializers), __runInitializers(this, _styles_initializers, css `
17
+ :host {
18
+ display: flex;
19
+ }
20
+ `));
21
+ };
22
+ })();
23
+ customElements.define('template-1', MyElement);
24
+ const el = new MyElement();
25
+ expect(el.shadowRoot.adoptedStyleSheets.length).to.eq(1);
26
+ });
27
+ it('should apply html', () => {
28
+ let MyElement = (() => {
29
+ let _instanceExtraInitializers_1 = [];
30
+ let _styles_decorators;
31
+ let _styles_initializers = [];
32
+ let _template_decorators;
33
+ let _template_initializers = [];
34
+ return class MyElement extends HTMLElement {
35
+ static {
36
+ _styles_decorators = [shadow];
37
+ _template_decorators = [shadow];
38
+ __esDecorate(null, null, _styles_decorators, { kind: "field", name: "styles", static: false, private: false, access: { has: obj => "styles" in obj, get: obj => obj.styles, set: (obj, value) => { obj.styles = value; } } }, _styles_initializers, _instanceExtraInitializers_1);
39
+ __esDecorate(null, null, _template_decorators, { kind: "field", name: "template", static: false, private: false, access: { has: obj => "template" in obj, get: obj => obj.template, set: (obj, value) => { obj.template = value; } } }, _template_initializers, _instanceExtraInitializers_1);
40
+ }
41
+ styles = (__runInitializers(this, _instanceExtraInitializers_1), __runInitializers(this, _styles_initializers, css `
42
+ :host {
43
+ display: flex;
44
+ }
45
+ `));
46
+ template = __runInitializers(this, _template_initializers, html `<slot></slot>`);
47
+ };
48
+ })();
49
+ customElements.define('template-2', MyElement);
50
+ const el = new MyElement();
51
+ expect(el.shadowRoot?.innerHTML).to.eq('<slot></slot>');
52
+ });
53
+ });
54
+ //# sourceMappingURL=shadow.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shadow.test.js","sourceRoot":"","sources":["../../src/lib/shadow.test.ts"],"names":[],"mappings":";AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAE1C,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACtC,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAErC,QAAQ,CAAC,UAAU,EAAE,GAAG,EAAE;IACxB,EAAE,CAAC,2BAA2B,EAAE,GAAG,EAAE;YAC7B,SAAS;;;;yBAAT,SAAU,SAAQ,WAAW;;0CAChC,MAAM;oBAAC,oKAAA,MAAM,6BAAN,MAAM,mEAIZ;;gBAJM,MAAM,uGAAG,GAAG,CAAA;;;;OAInB,GAAC;;;QAGJ,cAAc,CAAC,MAAM,CAAC,YAAY,EAAE,SAAS,CAAC,CAAC;QAE/C,MAAM,EAAE,GAAG,IAAI,SAAS,EAAE,CAAC;QAE3B,MAAM,CAAC,EAAE,CAAC,UAAW,CAAC,kBAAkB,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IAC5D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mBAAmB,EAAE,GAAG,EAAE;YACrB,SAAS;;;;;;yBAAT,SAAU,SAAQ,WAAW;;0CAChC,MAAM;4CAMN,MAAM;oBANC,oKAAA,MAAM,6BAAN,MAAM,qEAIZ;oBAEM,0KAAA,QAAQ,6BAAR,QAAQ,uEAAuB;;gBAN/B,MAAM,yGAAG,GAAG,CAAA;;;;OAInB,GAAC;gBAEM,QAAQ,mDAAG,IAAI,CAAA,eAAe,EAAC;;;QAGzC,cAAc,CAAC,MAAM,CAAC,YAAY,EAAE,SAAS,CAAC,CAAC;QAE/C,MAAM,EAAE,GAAG,IAAI,SAAS,EAAE,CAAC;QAE3B,MAAM,CAAC,EAAE,CAAC,UAAU,EAAE,SAAS,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,eAAe,CAAC,CAAC;IAC1D,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1 @@
1
+ export declare function tagName(_val: unknown, _ctx: ClassFieldDecoratorContext): (this: CustomElementConstructor, val: string) => string;
@@ -0,0 +1,11 @@
1
+ export function tagName(_val, _ctx) {
2
+ return function (val) {
3
+ Promise.resolve().then(() => {
4
+ if (!customElements.get(val)) {
5
+ customElements.define(val, this);
6
+ }
7
+ });
8
+ return val;
9
+ };
10
+ }
11
+ //# sourceMappingURL=tag-name.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tag-name.js","sourceRoot":"","sources":["../../src/lib/tag-name.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,OAAO,CAAC,IAAa,EAAE,IAAgC;IACrE,OAAO,UAA0C,GAAW;QAC1D,OAAO,CAAC,OAAO,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE;YAC1B,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE;gBAC5B,cAAc,CAAC,MAAM,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;aAClC;QACH,CAAC,CAAC,CAAC;QAEH,OAAO,GAAG,CAAC;IACb,CAAC,CAAC;AACJ,CAAC"}
File without changes
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ //# sourceMappingURL=tag-name.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tag-name.test.js","sourceRoot":"","sources":["../../src/lib/tag-name.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,9 @@
1
+ import { TemplateResult } from './result.js';
2
+ export declare class HTMLResult extends TemplateResult {
3
+ apply(root: ShadowRoot): void;
4
+ }
5
+ export declare function html(strings: TemplateStringsArray): HTMLResult;
6
+ export declare class CSSResult extends TemplateResult {
7
+ apply(root: ShadowRoot): void;
8
+ }
9
+ export declare function css(strings: TemplateStringsArray): CSSResult;
@@ -0,0 +1,22 @@
1
+ import { TemplateResult } from './result.js';
2
+ export class HTMLResult extends TemplateResult {
3
+ apply(root) {
4
+ const el = document.createElement('template');
5
+ el.innerHTML = this.strings.join(',');
6
+ root.append(el.content.cloneNode(true));
7
+ }
8
+ }
9
+ export function html(strings) {
10
+ return new HTMLResult(strings);
11
+ }
12
+ export class CSSResult extends TemplateResult {
13
+ apply(root) {
14
+ const sheet = new CSSStyleSheet();
15
+ sheet.replaceSync(this.strings.join(''));
16
+ root.adoptedStyleSheets = [...root.adoptedStyleSheets, sheet];
17
+ }
18
+ }
19
+ export function css(strings) {
20
+ return new CSSResult(strings);
21
+ }
22
+ //# sourceMappingURL=tags.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tags.js","sourceRoot":"","sources":["../../src/lib/tags.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAE7C,MAAM,OAAO,UAAW,SAAQ,cAAc;IAC5C,KAAK,CAAC,IAAgB;QACpB,MAAM,EAAE,GAAG,QAAQ,CAAC,aAAa,CAAC,UAAU,CAAC,CAAC;QAC9C,EAAE,CAAC,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAEtC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,OAAO,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC;IAC1C,CAAC;CACF;AAED,MAAM,UAAU,IAAI,CAAC,OAA6B;IAChD,OAAO,IAAI,UAAU,CAAC,OAAO,CAAC,CAAC;AACjC,CAAC;AAED,MAAM,OAAO,SAAU,SAAQ,cAAc;IAC3C,KAAK,CAAC,IAAgB;QACpB,MAAM,KAAK,GAAG,IAAI,aAAa,EAAE,CAAC;QAClC,KAAK,CAAC,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;QAEzC,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"}
@@ -0,0 +1,6 @@
1
+ export { TemplateResult } from './lib/result.js';
2
+ export { css, html } from './lib/tags.js';
3
+ export { shadow } from './lib/shadow.js';
4
+ export { attr } from './lib/attr.js';
5
+ export { listen } from './lib/listen.js';
6
+ export { tagName } from './lib/tag-name.js';