@joist/templating 4.2.3-next.10

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 (71) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +370 -0
  3. package/package.json +69 -0
  4. package/src/lib/bind.ts +40 -0
  5. package/src/lib/define.ts +5 -0
  6. package/src/lib/elements/async.element.test.ts +90 -0
  7. package/src/lib/elements/async.element.ts +119 -0
  8. package/src/lib/elements/for.element.test.ts +221 -0
  9. package/src/lib/elements/for.element.ts +176 -0
  10. package/src/lib/elements/if.element.test.ts +90 -0
  11. package/src/lib/elements/if.element.ts +85 -0
  12. package/src/lib/elements/props.element.test.ts +62 -0
  13. package/src/lib/elements/props.element.ts +76 -0
  14. package/src/lib/elements/scope.ts +39 -0
  15. package/src/lib/elements/value.element.test.ts +20 -0
  16. package/src/lib/elements/value.element.ts +39 -0
  17. package/src/lib/events.ts +21 -0
  18. package/src/lib/token.test.ts +74 -0
  19. package/src/lib/token.ts +34 -0
  20. package/src/lib.ts +2 -0
  21. package/target/lib/bind.d.ts +1 -0
  22. package/target/lib/bind.js +30 -0
  23. package/target/lib/bind.js.map +1 -0
  24. package/target/lib/define.d.ts +5 -0
  25. package/target/lib/define.js +6 -0
  26. package/target/lib/define.js.map +1 -0
  27. package/target/lib/elements/async.element.d.ts +17 -0
  28. package/target/lib/elements/async.element.js +112 -0
  29. package/target/lib/elements/async.element.js.map +1 -0
  30. package/target/lib/elements/async.element.test.d.ts +1 -0
  31. package/target/lib/elements/async.element.test.js +75 -0
  32. package/target/lib/elements/async.element.test.js.map +1 -0
  33. package/target/lib/elements/for.element.d.ts +24 -0
  34. package/target/lib/elements/for.element.js +182 -0
  35. package/target/lib/elements/for.element.js.map +1 -0
  36. package/target/lib/elements/for.element.test.d.ts +2 -0
  37. package/target/lib/elements/for.element.test.js +153 -0
  38. package/target/lib/elements/for.element.test.js.map +1 -0
  39. package/target/lib/elements/if.element.d.ts +12 -0
  40. package/target/lib/elements/if.element.js +81 -0
  41. package/target/lib/elements/if.element.js.map +1 -0
  42. package/target/lib/elements/if.element.test.d.ts +1 -0
  43. package/target/lib/elements/if.element.test.js +78 -0
  44. package/target/lib/elements/if.element.test.js.map +1 -0
  45. package/target/lib/elements/props.element.d.ts +11 -0
  46. package/target/lib/elements/props.element.js +90 -0
  47. package/target/lib/elements/props.element.js.map +1 -0
  48. package/target/lib/elements/props.element.test.d.ts +1 -0
  49. package/target/lib/elements/props.element.test.js +53 -0
  50. package/target/lib/elements/props.element.test.js.map +1 -0
  51. package/target/lib/elements/scope.d.ts +13 -0
  52. package/target/lib/elements/scope.js +56 -0
  53. package/target/lib/elements/scope.js.map +1 -0
  54. package/target/lib/elements/value.element.d.ts +9 -0
  55. package/target/lib/elements/value.element.js +54 -0
  56. package/target/lib/elements/value.element.js.map +1 -0
  57. package/target/lib/elements/value.element.test.d.ts +1 -0
  58. package/target/lib/elements/value.element.test.js +16 -0
  59. package/target/lib/elements/value.element.test.js.map +1 -0
  60. package/target/lib/events.d.ts +12 -0
  61. package/target/lib/events.js +10 -0
  62. package/target/lib/events.js.map +1 -0
  63. package/target/lib/token.d.ts +8 -0
  64. package/target/lib/token.js +27 -0
  65. package/target/lib/token.js.map +1 -0
  66. package/target/lib/token.test.d.ts +1 -0
  67. package/target/lib/token.test.js +56 -0
  68. package/target/lib/token.test.js.map +1 -0
  69. package/target/lib.d.ts +2 -0
  70. package/target/lib.js +3 -0
  71. package/target/lib.js.map +1 -0
@@ -0,0 +1,24 @@
1
+ declare global {
2
+ interface HTMLElementTagNameMap {
3
+ "j-for": JositForElement;
4
+ "j-for-scope": JForScope;
5
+ }
6
+ }
7
+ export interface EachCtx<T> {
8
+ value: T | null;
9
+ index: number | null;
10
+ position: number | null;
11
+ }
12
+ export declare class JForScope<T = unknown> extends HTMLElement {
13
+ accessor each: EachCtx<T>;
14
+ accessor key: string;
15
+ }
16
+ export declare class JositForElement extends HTMLElement {
17
+ #private;
18
+ accessor bind: string;
19
+ accessor key: string;
20
+ connectedCallback(): void;
21
+ createFromEmpty(): void;
22
+ updateItems(): void;
23
+ disconnectedCallback(): void;
24
+ }
@@ -0,0 +1,182 @@
1
+ import { __esDecorate, __runInitializers } from "tslib";
2
+ import { attr, element, query, css, html } from "@joist/element";
3
+ import { bind } from "../bind.js";
4
+ import { JoistValueEvent } from "../events.js";
5
+ import { JToken } from "../token.js";
6
+ let JForScope = (() => {
7
+ let _classDecorators = [element({
8
+ tagName: "j-for-scope",
9
+ shadowDom: [css `:host{display: contents;}`, html `<slot></slot>`],
10
+ })];
11
+ let _classDescriptor;
12
+ let _classExtraInitializers = [];
13
+ let _classThis;
14
+ let _classSuper = HTMLElement;
15
+ let _each_decorators;
16
+ let _each_initializers = [];
17
+ let _each_extraInitializers = [];
18
+ let _key_decorators;
19
+ let _key_initializers = [];
20
+ let _key_extraInitializers = [];
21
+ var JForScope = class extends _classSuper {
22
+ static { _classThis = this; }
23
+ static {
24
+ const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(_classSuper[Symbol.metadata] ?? null) : void 0;
25
+ _each_decorators = [bind()];
26
+ _key_decorators = [attr()];
27
+ __esDecorate(this, null, _each_decorators, { kind: "accessor", name: "each", static: false, private: false, access: { has: obj => "each" in obj, get: obj => obj.each, set: (obj, value) => { obj.each = value; } }, metadata: _metadata }, _each_initializers, _each_extraInitializers);
28
+ __esDecorate(this, null, _key_decorators, { kind: "accessor", name: "key", static: false, private: false, access: { has: obj => "key" in obj, get: obj => obj.key, set: (obj, value) => { obj.key = value; } }, metadata: _metadata }, _key_initializers, _key_extraInitializers);
29
+ __esDecorate(null, _classDescriptor = { value: _classThis }, _classDecorators, { kind: "class", name: _classThis.name, metadata: _metadata }, null, _classExtraInitializers);
30
+ JForScope = _classThis = _classDescriptor.value;
31
+ if (_metadata) Object.defineProperty(_classThis, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
32
+ __runInitializers(_classThis, _classExtraInitializers);
33
+ }
34
+ #each_accessor_storage = __runInitializers(this, _each_initializers, {
35
+ value: null,
36
+ index: null,
37
+ position: null,
38
+ });
39
+ get each() { return this.#each_accessor_storage; }
40
+ set each(value) { this.#each_accessor_storage = value; }
41
+ #key_accessor_storage = (__runInitializers(this, _each_extraInitializers), __runInitializers(this, _key_initializers, ""));
42
+ get key() { return this.#key_accessor_storage; }
43
+ set key(value) { this.#key_accessor_storage = value; }
44
+ constructor() {
45
+ super(...arguments);
46
+ __runInitializers(this, _key_extraInitializers);
47
+ }
48
+ };
49
+ return JForScope = _classThis;
50
+ })();
51
+ export { JForScope };
52
+ let JositForElement = (() => {
53
+ let _classDecorators = [element({
54
+ tagName: "j-for",
55
+ shadowDom: [css `:host{display:contents;}`, html `<slot></slot>`],
56
+ })];
57
+ let _classDescriptor;
58
+ let _classExtraInitializers = [];
59
+ let _classThis;
60
+ let _classSuper = HTMLElement;
61
+ let _bind_decorators;
62
+ let _bind_initializers = [];
63
+ let _bind_extraInitializers = [];
64
+ let _key_decorators;
65
+ let _key_initializers = [];
66
+ let _key_extraInitializers = [];
67
+ var JositForElement = class extends _classSuper {
68
+ static { _classThis = this; }
69
+ static {
70
+ const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(_classSuper[Symbol.metadata] ?? null) : void 0;
71
+ _bind_decorators = [attr()];
72
+ _key_decorators = [attr()];
73
+ __esDecorate(this, null, _bind_decorators, { kind: "accessor", name: "bind", static: false, private: false, access: { has: obj => "bind" in obj, get: obj => obj.bind, set: (obj, value) => { obj.bind = value; } }, metadata: _metadata }, _bind_initializers, _bind_extraInitializers);
74
+ __esDecorate(this, null, _key_decorators, { kind: "accessor", name: "key", static: false, private: false, access: { has: obj => "key" in obj, get: obj => obj.key, set: (obj, value) => { obj.key = value; } }, metadata: _metadata }, _key_initializers, _key_extraInitializers);
75
+ __esDecorate(null, _classDescriptor = { value: _classThis }, _classDecorators, { kind: "class", name: _classThis.name, metadata: _metadata }, null, _classExtraInitializers);
76
+ JositForElement = _classThis = _classDescriptor.value;
77
+ if (_metadata) Object.defineProperty(_classThis, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
78
+ __runInitializers(_classThis, _classExtraInitializers);
79
+ }
80
+ #bind_accessor_storage = __runInitializers(this, _bind_initializers, "");
81
+ get bind() { return this.#bind_accessor_storage; }
82
+ set bind(value) { this.#bind_accessor_storage = value; }
83
+ #key_accessor_storage = (__runInitializers(this, _bind_extraInitializers), __runInitializers(this, _key_initializers, ""));
84
+ get key() { return this.#key_accessor_storage; }
85
+ set key(value) { this.#key_accessor_storage = value; }
86
+ #template = (__runInitializers(this, _key_extraInitializers), query("template", this));
87
+ #items = [];
88
+ #scopes = new Map();
89
+ connectedCallback() {
90
+ const template = this.#template();
91
+ if (this.firstElementChild !== template) {
92
+ throw new Error("The first Node in j-for needs to be a template");
93
+ }
94
+ let currentScope = template.nextElementSibling;
95
+ while (currentScope instanceof JForScope) {
96
+ this.#scopes.set(currentScope.key, currentScope);
97
+ currentScope = currentScope.nextElementSibling;
98
+ }
99
+ const token = new JToken(this.bind);
100
+ this.dispatchEvent(new JoistValueEvent(token, ({ newValue, oldValue }) => {
101
+ if (newValue !== oldValue) {
102
+ if (isIterable(newValue)) {
103
+ this.#items = newValue;
104
+ }
105
+ else {
106
+ this.#items = [];
107
+ }
108
+ if (template.nextSibling === null) {
109
+ this.createFromEmpty();
110
+ }
111
+ else {
112
+ this.updateItems();
113
+ }
114
+ }
115
+ }));
116
+ }
117
+ createFromEmpty() {
118
+ const template = this.#template();
119
+ const templateContent = template.content;
120
+ const keyProperty = this.key;
121
+ const fragment = document.createDocumentFragment();
122
+ let index = 0;
123
+ for (const value of this.#items) {
124
+ const key = keyProperty && hasProperty(value, keyProperty) ? value[keyProperty] : index;
125
+ const scope = new JForScope();
126
+ scope.append(document.importNode(templateContent, true));
127
+ scope.key = String(key);
128
+ scope.each = { position: index + 1, index, value };
129
+ fragment.appendChild(scope);
130
+ this.#scopes.set(key, scope);
131
+ index++;
132
+ }
133
+ this.append(fragment);
134
+ }
135
+ updateItems() {
136
+ const template = this.#template();
137
+ const leftoverScopes = new Map(this.#scopes);
138
+ const keyProperty = this.key;
139
+ let index = 0;
140
+ for (const value of this.#items) {
141
+ const key = keyProperty && hasProperty(value, keyProperty) ? value[keyProperty] : index;
142
+ let scope = leftoverScopes.get(key);
143
+ if (!scope) {
144
+ scope = new JForScope();
145
+ scope.append(document.importNode(template.content, true));
146
+ this.#scopes.set(key, scope);
147
+ }
148
+ else {
149
+ leftoverScopes.delete(key);
150
+ }
151
+ if (scope.key !== key || scope.each.value !== value) {
152
+ scope.key = String(key);
153
+ scope.each = { position: index + 1, index, value };
154
+ }
155
+ const child = this.children[index + 1];
156
+ if (child !== scope) {
157
+ this.insertBefore(scope, child);
158
+ }
159
+ index++;
160
+ }
161
+ for (const scope of leftoverScopes.values()) {
162
+ scope.remove();
163
+ }
164
+ }
165
+ disconnectedCallback() {
166
+ for (const scope of this.#scopes.values()) {
167
+ scope.remove();
168
+ }
169
+ this.#scopes.clear();
170
+ this.#items = [];
171
+ }
172
+ };
173
+ return JositForElement = _classThis;
174
+ })();
175
+ export { JositForElement };
176
+ function isIterable(obj) {
177
+ return obj != null && typeof obj[Symbol.iterator] === "function";
178
+ }
179
+ function hasProperty(item, key) {
180
+ return Object.prototype.hasOwnProperty.call(item, key);
181
+ }
182
+ //# sourceMappingURL=for.element.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"for.element.js","sourceRoot":"","sources":["../../../src/lib/elements/for.element.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import "./for.element.js";
2
+ import "./value.element.js";
@@ -0,0 +1,153 @@
1
+ import "./for.element.js";
2
+ import "./value.element.js";
3
+ import { fixtureSync, html } from "@open-wc/testing";
4
+ import { assert } from "chai";
5
+ it("should iterate over an iterable", () => {
6
+ const element = fixtureSync(html `
7
+ <div
8
+ @joist::value=${(e) => {
9
+ e.update({
10
+ oldValue: null,
11
+ newValue: new Set([
12
+ { id: "123", label: "Hello" },
13
+ { id: "456", label: "World" },
14
+ ]),
15
+ });
16
+ }}
17
+ >
18
+ <ul>
19
+ <j-for bind="items" key="id">
20
+ <template>
21
+ <li>
22
+ <j-value bind="each.value.label"></j-value>
23
+ </li>
24
+ </template>
25
+ </j-for>
26
+ </ul>
27
+ </div>
28
+ `);
29
+ const listItems = element.querySelectorAll("li");
30
+ assert.equal(listItems.length, 2);
31
+ assert.equal(listItems[0].textContent?.trim(), "Hello");
32
+ assert.equal(listItems[1].textContent?.trim(), "World");
33
+ });
34
+ it("should handle empty arrays", () => {
35
+ const element = fixtureSync(html `
36
+ <div
37
+ @joist::value=${(e) => {
38
+ e.update({
39
+ oldValue: null,
40
+ newValue: [],
41
+ });
42
+ }}
43
+ >
44
+ <j-for bind="items">
45
+ <template>
46
+ <div>Item</div>
47
+ </template>
48
+ </j-for>
49
+ </div>
50
+ `);
51
+ assert.equal(element.querySelectorAll("div").length, 0);
52
+ });
53
+ it("should update when items are added or removed", () => {
54
+ const element = fixtureSync(html `
55
+ <div
56
+ @joist::value=${(e) => {
57
+ e.update({
58
+ oldValue: null,
59
+ newValue: [
60
+ { id: "1", text: "First" },
61
+ { id: "2", text: "Second" },
62
+ ],
63
+ });
64
+ e.update({
65
+ oldValue: null,
66
+ newValue: [
67
+ { id: "1", text: "First" },
68
+ { id: "2", text: "Second" },
69
+ { id: "3", text: "Third" },
70
+ ],
71
+ });
72
+ e.update({
73
+ oldValue: null,
74
+ newValue: [
75
+ { id: "1", text: "First" },
76
+ { id: "3", text: "Third" },
77
+ ],
78
+ });
79
+ }}
80
+ >
81
+ <j-for bind="items" key="id">
82
+ <template>
83
+ <j-value bind="each.value.text"></j-value>
84
+ </template>
85
+ </j-for>
86
+ </div>
87
+ `);
88
+ const items = element.querySelectorAll("j-value");
89
+ assert.equal(items.length, 2);
90
+ assert.equal(items[0].textContent?.trim(), "First");
91
+ assert.equal(items[1].textContent?.trim(), "Third");
92
+ });
93
+ it("should provide index and position information", () => {
94
+ const element = fixtureSync(html `
95
+ <div
96
+ @joist::value=${(e) => {
97
+ e.update({
98
+ oldValue: null,
99
+ newValue: ["A", "B", "C"],
100
+ });
101
+ }}
102
+ >
103
+ <j-for bind="items">
104
+ <template>
105
+ <j-value bind="each.value"></j-value>
106
+ (index: <j-value bind="each.index"></j-value>,
107
+ position: <j-value bind="each.position"></j-value>)
108
+ </template>
109
+ </j-for>
110
+ </div>
111
+ `);
112
+ const items = element.querySelectorAll("j-for-scope");
113
+ assert.equal(items.length, 3);
114
+ assert.equal(items[0].textContent?.trim().replaceAll("\n", "").replaceAll(" ", ""), "A(index:0,position:1)");
115
+ assert.equal(items[1].textContent?.trim().replaceAll("\n", "").replaceAll(" ", ""), "B(index:1,position:2)");
116
+ assert.equal(items[2].textContent?.trim().replaceAll("\n", "").replaceAll(" ", ""), "C(index:2,position:3)");
117
+ });
118
+ it("should maintain DOM order when items are reordered", () => {
119
+ const element = fixtureSync(html `
120
+ <div
121
+ @joist::value=${(e) => {
122
+ e.update({
123
+ oldValue: null,
124
+ newValue: [
125
+ { id: "1", text: "First" },
126
+ { id: "2", text: "Second" },
127
+ { id: "3", text: "Third" },
128
+ ],
129
+ });
130
+ e.update({
131
+ oldValue: null,
132
+ newValue: [
133
+ { id: "3", text: "Third" },
134
+ { id: "1", text: "First" },
135
+ { id: "2", text: "Second" },
136
+ ],
137
+ });
138
+ }}
139
+ >
140
+ <j-for bind="items" key="id">
141
+ <template>
142
+ <j-value bind="each.value.text"></j-value>
143
+ </template>
144
+ </j-for>
145
+ </div>
146
+ `);
147
+ const items = element.querySelectorAll("j-value");
148
+ assert.equal(items.length, 3);
149
+ assert.equal(items[0].textContent?.trim(), "Third");
150
+ assert.equal(items[1].textContent?.trim(), "First");
151
+ assert.equal(items[2].textContent?.trim(), "Second");
152
+ });
153
+ //# sourceMappingURL=for.element.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"for.element.test.js","sourceRoot":"","sources":["../../../src/lib/elements/for.element.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ declare global {
2
+ interface HTMLElementTagNameMap {
3
+ "j-if": JoistIfElement;
4
+ }
5
+ }
6
+ export declare class JoistIfElement extends HTMLElement {
7
+ #private;
8
+ accessor bind: string;
9
+ connectedCallback(): void;
10
+ apply(value: unknown, isNegative: boolean): void;
11
+ disconnectedCallback(): void;
12
+ }
@@ -0,0 +1,81 @@
1
+ import { __esDecorate, __runInitializers } from "tslib";
2
+ import { attr, element, queryAll, css, html } from "@joist/element";
3
+ import { JoistValueEvent } from "../events.js";
4
+ import { JToken } from "../token.js";
5
+ let JoistIfElement = (() => {
6
+ let _classDecorators = [element({
7
+ tagName: "j-if",
8
+ shadowDom: [css `:host{display: contents;}`, html `<slot></slot>`],
9
+ })];
10
+ let _classDescriptor;
11
+ let _classExtraInitializers = [];
12
+ let _classThis;
13
+ let _classSuper = HTMLElement;
14
+ let _bind_decorators;
15
+ let _bind_initializers = [];
16
+ let _bind_extraInitializers = [];
17
+ var JoistIfElement = 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
+ _bind_decorators = [attr()];
22
+ __esDecorate(this, null, _bind_decorators, { kind: "accessor", name: "bind", static: false, private: false, access: { has: obj => "bind" in obj, get: obj => obj.bind, set: (obj, value) => { obj.bind = value; } }, metadata: _metadata }, _bind_initializers, _bind_extraInitializers);
23
+ __esDecorate(null, _classDescriptor = { value: _classThis }, _classDecorators, { kind: "class", name: _classThis.name, metadata: _metadata }, null, _classExtraInitializers);
24
+ JoistIfElement = _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
+ #bind_accessor_storage = __runInitializers(this, _bind_initializers, "");
29
+ get bind() { return this.#bind_accessor_storage; }
30
+ set bind(value) { this.#bind_accessor_storage = value; }
31
+ #templates = (__runInitializers(this, _bind_extraInitializers), queryAll("template", this));
32
+ connectedCallback() {
33
+ const templates = Array.from(this.#templates());
34
+ if (templates.length === 0) {
35
+ throw new Error("j-if requires at least one template element");
36
+ }
37
+ if (templates.length > 2) {
38
+ throw new Error("j-if can only have two template elements (if and else)");
39
+ }
40
+ if (templates.length === 2 && !templates.some((t) => t.hasAttribute("else"))) {
41
+ throw new Error("When using two templates, one must have the else attribute");
42
+ }
43
+ if (templates.length === 2 && templates[0].hasAttribute("else")) {
44
+ [templates[0], templates[1]] = [templates[1], templates[0]];
45
+ }
46
+ this.#clean();
47
+ const token = new JToken(this.bind);
48
+ this.dispatchEvent(new JoistValueEvent(token, ({ newValue, oldValue }) => {
49
+ if (newValue !== oldValue) {
50
+ if (typeof newValue === "object" && newValue !== null) {
51
+ this.apply(token.readTokenValueFrom(newValue), token.isNegated);
52
+ }
53
+ else {
54
+ this.apply(newValue, token.isNegated);
55
+ }
56
+ }
57
+ }));
58
+ }
59
+ apply(value, isNegative) {
60
+ this.#clean();
61
+ const templates = this.#templates();
62
+ const shouldShowIf = isNegative ? !value : value;
63
+ const templateToUse = shouldShowIf ? templates[0] : templates[1];
64
+ if (templateToUse) {
65
+ const content = document.importNode(templateToUse.content, true);
66
+ this.appendChild(content);
67
+ }
68
+ }
69
+ #clean() {
70
+ while (!(this.lastChild instanceof HTMLTemplateElement)) {
71
+ this.lastChild?.remove();
72
+ }
73
+ }
74
+ disconnectedCallback() {
75
+ this.#clean();
76
+ }
77
+ };
78
+ return JoistIfElement = _classThis;
79
+ })();
80
+ export { JoistIfElement };
81
+ //# sourceMappingURL=if.element.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"if.element.js","sourceRoot":"","sources":["../../../src/lib/elements/if.element.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ import "./if.element.js";
@@ -0,0 +1,78 @@
1
+ import "./if.element.js";
2
+ import { fixtureSync, html } from "@open-wc/testing";
3
+ import { assert } from "chai";
4
+ it("should render content when the bind value is truthy", () => {
5
+ const element = fixtureSync(html `
6
+ <div
7
+ @joist::value=${(e) => {
8
+ e.update({ oldValue: null, newValue: true });
9
+ }}
10
+ >
11
+ <j-if bind="test">
12
+ <template>Visible Content</template>
13
+ </j-if>
14
+ </div>
15
+ `);
16
+ assert.equal(element.textContent?.trim(), "Visible Content");
17
+ });
18
+ it("should not render content when the bind value is falsy", () => {
19
+ const element = fixtureSync(html `
20
+ <div
21
+ @joist::value=${(e) => {
22
+ e.update({ oldValue: null, newValue: true });
23
+ e.update({ oldValue: null, newValue: false });
24
+ }}
25
+ >
26
+ <j-if bind="test">
27
+ <template>Visible Content</template>
28
+ </j-if>
29
+ </div>
30
+ `);
31
+ assert.equal(element.textContent?.trim(), "");
32
+ });
33
+ it("should handle negated tokens correctly", () => {
34
+ const element = fixtureSync(html `
35
+ <div
36
+ @joist::value=${(e) => {
37
+ e.update({ oldValue: null, newValue: false });
38
+ }}
39
+ >
40
+ <j-if bind="!test">
41
+ <template>Visible Content</template>
42
+ </j-if>
43
+ </div>
44
+ `);
45
+ assert.equal(element.textContent?.trim(), "Visible Content");
46
+ });
47
+ it("should render else template when condition is falsy", () => {
48
+ const element = fixtureSync(html `
49
+ <div
50
+ @joist::value=${(e) => {
51
+ e.update({ oldValue: null, newValue: false });
52
+ }}
53
+ >
54
+ <j-if bind="test">
55
+ <template>If Content</template>
56
+ <template else>Else Content</template>
57
+ </j-if>
58
+ </div>
59
+ `);
60
+ assert.equal(element.textContent?.trim(), "Else Content");
61
+ });
62
+ it("should switch between if and else templates", () => {
63
+ const element = fixtureSync(html `
64
+ <div
65
+ @joist::value=${(e) => {
66
+ e.update({ oldValue: null, newValue: false });
67
+ e.update({ oldValue: false, newValue: true });
68
+ }}
69
+ >
70
+ <j-if bind="test">
71
+ <template>If Content</template>
72
+ <template else>Else Content</template>
73
+ </j-if>
74
+ </div>
75
+ `);
76
+ assert.equal(element.textContent?.trim(), "If Content");
77
+ });
78
+ //# sourceMappingURL=if.element.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"if.element.test.js","sourceRoot":"","sources":["../../../src/lib/elements/if.element.test.ts"],"names":[],"mappings":"AAAA,OAAO,iBAAiB,CAAC;AAEzB,OAAO,EAAE,WAAW,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,EAAE,MAAM,EAAE,MAAM,MAAM,CAAC;AAI9B,EAAE,CAAC,qDAAqD,EAAE,GAAG,EAAE;IAC7D,MAAM,OAAO,GAAG,WAAW,CAAC,IAAI,CAAA;;sBAEZ,CAAC,CAAkB,EAAE,EAAE;QACrC,CAAC,CAAC,MAAM,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;IAC/C,CAAC;;;;;;GAMJ,CAAC,CAAC;IAEH,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,WAAW,EAAE,IAAI,EAAE,EAAE,iBAAiB,CAAC,CAAC;AAC/D,CAAC,CAAC,CAAC;AAEH,EAAE,CAAC,wDAAwD,EAAE,GAAG,EAAE;IAChE,MAAM,OAAO,GAAG,WAAW,CAAC,IAAI,CAAA;;sBAEZ,CAAC,CAAkB,EAAE,EAAE;QACrC,CAAC,CAAC,MAAM,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;QAC7C,CAAC,CAAC,MAAM,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,CAAC;IAChD,CAAC;;;;;;GAMJ,CAAC,CAAC;IAEH,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,WAAW,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC;AAChD,CAAC,CAAC,CAAC;AAEH,EAAE,CAAC,wCAAwC,EAAE,GAAG,EAAE;IAChD,MAAM,OAAO,GAAG,WAAW,CAAC,IAAI,CAAA;;sBAEZ,CAAC,CAAkB,EAAE,EAAE;QACrC,CAAC,CAAC,MAAM,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,CAAC;IAChD,CAAC;;;;;;GAMJ,CAAC,CAAC;IAEH,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,WAAW,EAAE,IAAI,EAAE,EAAE,iBAAiB,CAAC,CAAC;AAC/D,CAAC,CAAC,CAAC;AAEH,EAAE,CAAC,qDAAqD,EAAE,GAAG,EAAE;IAC7D,MAAM,OAAO,GAAG,WAAW,CAAC,IAAI,CAAA;;sBAEZ,CAAC,CAAkB,EAAE,EAAE;QACrC,CAAC,CAAC,MAAM,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,CAAC;IAChD,CAAC;;;;;;;GAOJ,CAAC,CAAC;IAEH,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,WAAW,EAAE,IAAI,EAAE,EAAE,cAAc,CAAC,CAAC;AAC5D,CAAC,CAAC,CAAC;AAEH,EAAE,CAAC,6CAA6C,EAAE,GAAG,EAAE;IACrD,MAAM,OAAO,GAAG,WAAW,CAAC,IAAI,CAAA;;sBAEZ,CAAC,CAAkB,EAAE,EAAE;QACrC,CAAC,CAAC,MAAM,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,CAAC;QAC9C,CAAC,CAAC,MAAM,CAAC,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;IAChD,CAAC;;;;;;;GAOJ,CAAC,CAAC;IAEH,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,WAAW,EAAE,IAAI,EAAE,EAAE,YAAY,CAAC,CAAC;AAC1D,CAAC,CAAC,CAAC"}
@@ -0,0 +1,11 @@
1
+ import { JToken } from "../token.js";
2
+ export declare class JAttrToken extends JToken {
3
+ mapTo: string;
4
+ mapsToProp: boolean;
5
+ constructor(attr: Attr);
6
+ }
7
+ export declare class JoistIfElement extends HTMLElement {
8
+ #private;
9
+ accessor target: string;
10
+ connectedCallback(): void;
11
+ }