@joist/templating 4.2.4-next.9 → 4.2.4

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 (56) hide show
  1. package/LICENSE +2 -2
  2. package/package.json +1 -1
  3. package/src/lib/define.ts +26 -6
  4. package/src/lib/elements/async.element.test.ts +37 -1
  5. package/src/lib/elements/async.element.ts +12 -8
  6. package/src/lib/elements/bind.element.test.ts +60 -5
  7. package/src/lib/elements/bind.element.ts +30 -19
  8. package/src/lib/elements/for.element.test.ts +54 -9
  9. package/src/lib/elements/for.element.ts +91 -41
  10. package/src/lib/elements/if.element.test.ts +314 -260
  11. package/src/lib/elements/if.element.ts +40 -17
  12. package/src/lib/elements/scope.element.test.ts +1 -2
  13. package/src/lib/elements/scope.element.ts +0 -7
  14. package/src/lib/elements/value.element.test.ts +33 -1
  15. package/src/lib/elements/value.element.ts +13 -8
  16. package/src/lib/events.ts +1 -1
  17. package/target/lib/define.d.ts +16 -6
  18. package/target/lib/define.js +13 -6
  19. package/target/lib/define.js.map +1 -1
  20. package/target/lib/elements/async.element.d.ts +2 -6
  21. package/target/lib/elements/async.element.js +15 -3
  22. package/target/lib/elements/async.element.js.map +1 -1
  23. package/target/lib/elements/async.element.test.d.ts +1 -1
  24. package/target/lib/elements/async.element.test.js +30 -1
  25. package/target/lib/elements/async.element.test.js.map +1 -1
  26. package/target/lib/elements/bind.element.d.ts +2 -6
  27. package/target/lib/elements/bind.element.js +34 -16
  28. package/target/lib/elements/bind.element.js.map +1 -1
  29. package/target/lib/elements/bind.element.test.d.ts +1 -1
  30. package/target/lib/elements/bind.element.test.js +50 -5
  31. package/target/lib/elements/bind.element.test.js.map +1 -1
  32. package/target/lib/elements/for.element.d.ts +3 -12
  33. package/target/lib/elements/for.element.js +84 -57
  34. package/target/lib/elements/for.element.js.map +1 -1
  35. package/target/lib/elements/for.element.test.d.ts +1 -2
  36. package/target/lib/elements/for.element.test.js +41 -5
  37. package/target/lib/elements/for.element.test.js.map +1 -1
  38. package/target/lib/elements/if.element.d.ts +3 -6
  39. package/target/lib/elements/if.element.js +42 -10
  40. package/target/lib/elements/if.element.js.map +1 -1
  41. package/target/lib/elements/if.element.test.d.ts +1 -1
  42. package/target/lib/elements/if.element.test.js +273 -1
  43. package/target/lib/elements/if.element.test.js.map +1 -1
  44. package/target/lib/elements/scope.element.d.ts +0 -5
  45. package/target/lib/elements/scope.element.js +0 -1
  46. package/target/lib/elements/scope.element.js.map +1 -1
  47. package/target/lib/elements/scope.element.test.d.ts +1 -2
  48. package/target/lib/elements/scope.element.test.js +1 -2
  49. package/target/lib/elements/scope.element.test.js.map +1 -1
  50. package/target/lib/elements/value.element.d.ts +2 -6
  51. package/target/lib/elements/value.element.js +15 -3
  52. package/target/lib/elements/value.element.js.map +1 -1
  53. package/target/lib/elements/value.element.test.d.ts +1 -1
  54. package/target/lib/elements/value.element.test.js +26 -1
  55. package/target/lib/elements/value.element.test.js.map +1 -1
  56. package/target/lib/events.d.ts +1 -1
@@ -1,269 +1,269 @@
1
- import "./if.element.js";
1
+ import "../define.js";
2
2
 
3
3
  import { fixtureSync, html } from "@open-wc/testing";
4
4
  import { assert } from "chai";
5
5
 
6
6
  import type { JoistValueEvent } from "../events.js";
7
7
 
8
- // it("should render content when the bind value is truthy", () => {
9
- // const element = fixtureSync(html`
10
- // <div
11
- // @joist::value=${(e: JoistValueEvent) => {
12
- // e.update({ oldValue: null, newValue: true });
13
- // }}
14
- // >
15
- // <j-if bind="test">
16
- // <template>Visible Content</template>
17
- // </j-if>
18
- // </div>
19
- // `);
20
-
21
- // assert.equal(element.textContent?.trim(), "Visible Content");
22
- // });
23
-
24
- // it("should not render content when the bind value is falsy", () => {
25
- // const element = fixtureSync(html`
26
- // <div
27
- // @joist::value=${(e: JoistValueEvent) => {
28
- // e.update({ oldValue: null, newValue: true });
29
- // e.update({ oldValue: null, newValue: false });
30
- // }}
31
- // >
32
- // <j-if bind="test">
33
- // <template>Visible Content</template>
34
- // </j-if>
35
- // </div>
36
- // `);
37
-
38
- // assert.equal(element.textContent?.trim(), "");
39
- // });
40
-
41
- // it("should handle negated tokens correctly", () => {
42
- // const element = fixtureSync(html`
43
- // <div
44
- // @joist::value=${(e: JoistValueEvent) => {
45
- // e.update({ oldValue: null, newValue: false });
46
- // }}
47
- // >
48
- // <j-if bind="!test">
49
- // <template>Visible Content</template>
50
- // </j-if>
51
- // </div>
52
- // `);
53
-
54
- // assert.equal(element.textContent?.trim(), "Visible Content");
55
- // });
56
-
57
- // it("should render else template when condition is falsy", () => {
58
- // const element = fixtureSync(html`
59
- // <div
60
- // @joist::value=${(e: JoistValueEvent) => {
61
- // e.update({ oldValue: null, newValue: false });
62
- // }}
63
- // >
64
- // <j-if bind="test">
65
- // <template>If Content</template>
66
- // <template else>Else Content</template>
67
- // </j-if>
68
- // </div>
69
- // `);
70
-
71
- // assert.equal(element.textContent?.trim(), "Else Content");
72
- // });
73
-
74
- // it("should switch between if and else templates", () => {
75
- // const element = fixtureSync(html`
76
- // <div
77
- // @joist::value=${(e: JoistValueEvent) => {
78
- // e.update({ oldValue: null, newValue: false });
79
- // e.update({ oldValue: false, newValue: true });
80
- // }}
81
- // >
82
- // <j-if bind="test">
83
- // <template>If Content</template>
84
- // <template else>Else Content</template>
85
- // </j-if>
86
- // </div>
87
- // `);
88
-
89
- // assert.equal(element.textContent?.trim(), "If Content");
90
- // });
91
-
92
- // it("should handle equality comparison", () => {
93
- // const element = fixtureSync(html`
94
- // <div
95
- // @joist::value=${(e: JoistValueEvent) => {
96
- // e.update({ oldValue: null, newValue: { status: "active" } });
97
- // }}
98
- // >
99
- // <j-if bind="example.status == active">
100
- // <template>Status is Active</template>
101
- // </j-if>
102
- // </div>
103
- // `);
104
-
105
- // assert.equal(element.textContent?.trim(), "Status is Active");
106
- // });
107
-
108
- // it("should handle greater than comparison", () => {
109
- // const element = fixtureSync(html`
110
- // <div
111
- // @joist::value=${(e: JoistValueEvent) => {
112
- // e.update({ oldValue: null, newValue: { count: 10 } });
113
- // }}
114
- // >
115
- // <j-if bind="example.count > 5">
116
- // <template>Count is Greater Than 5</template>
117
- // </j-if>
118
- // </div>
119
- // `);
120
-
121
- // assert.equal(element.textContent?.trim(), "Count is Greater Than 5");
122
- // });
123
-
124
- // it("should handle less than comparison", () => {
125
- // const element = fixtureSync(html`
126
- // <div
127
- // @joist::value=${(e: JoistValueEvent) => {
128
- // e.update({ oldValue: null, newValue: { score: 75 } });
129
- // }}
130
- // >
131
- // <j-if bind="example.score < 100">
132
- // <template>Score is Less Than 100</template>
133
- // </j-if>
134
- // </div>
135
- // `);
136
-
137
- // assert.equal(element.textContent?.trim(), "Score is Less Than 100");
138
- // });
139
-
140
- // it("should handle nested path comparisons", () => {
141
- // const element = fixtureSync(html`
142
- // <div
143
- // @joist::value=${(e: JoistValueEvent) => {
144
- // e.update({ oldValue: null, newValue: { user: { score: 150 } } });
145
- // }}
146
- // >
147
- // <j-if bind="example.user.score > 100">
148
- // <template>User Score is Above 100</template>
149
- // </j-if>
150
- // </div>
151
- // `);
152
-
153
- // assert.equal(element.textContent?.trim(), "User Score is Above 100");
154
- // });
155
-
156
- // it("should handle negated comparisons", () => {
157
- // const element = fixtureSync(html`
158
- // <div
159
- // @joist::value=${(e: JoistValueEvent) => {
160
- // e.update({ oldValue: null, newValue: { status: "inactive" } });
161
- // }}
162
- // >
163
- // <j-if bind="!example.status == active">
164
- // <template>Status is Not Active</template>
165
- // </j-if>
166
- // </div>
167
- // `);
168
-
169
- // assert.equal(element.textContent?.trim(), "Status is Not Active");
170
- // });
171
-
172
- // it("should handle string number comparisons", () => {
173
- // const element = fixtureSync(html`
174
- // <div
175
- // @joist::value=${(e: JoistValueEvent) => {
176
- // e.update({ oldValue: null, newValue: { count: "10" } });
177
- // }}
178
- // >
179
- // <j-if bind="example.count > 5">
180
- // <template>String Count is Greater Than 5</template>
181
- // </j-if>
182
- // </div>
183
- // `);
184
-
185
- // assert.equal(element.textContent?.trim(), "String Count is Greater Than 5");
186
- // });
187
-
188
- // it("should handle undefined values in comparisons", () => {
189
- // const element = fixtureSync(html`
190
- // <div
191
- // @joist::value=${(e: JoistValueEvent) => {
192
- // e.update({ oldValue: null, newValue: { count: undefined } });
193
- // }}
194
- // >
195
- // <j-if bind="example.count > 5">
196
- // <template>Count is Greater Than 5</template>
197
- // </j-if>
198
- // </div>
199
- // `);
200
-
201
- // assert.equal(element.textContent?.trim(), "");
202
- // });
203
-
204
- // it("should handle not equal comparison", () => {
205
- // const element = fixtureSync(html`
206
- // <div
207
- // @joist::value=${(e: JoistValueEvent) => {
208
- // e.update({ oldValue: null, newValue: { status: "inactive" } });
209
- // }}
210
- // >
211
- // <j-if bind="example.status != active">
212
- // <template>Status is Not Active</template>
213
- // </j-if>
214
- // </div>
215
- // `);
216
-
217
- // assert.equal(element.textContent?.trim(), "Status is Not Active");
218
- // });
219
-
220
- // it("should handle not equal comparison with matching value", () => {
221
- // const element = fixtureSync(html`
222
- // <div
223
- // @joist::value=${(e: JoistValueEvent) => {
224
- // e.update({ oldValue: null, newValue: { status: "active" } });
225
- // }}
226
- // >
227
- // <j-if bind="example.status != active">
228
- // <template>Status is Not Active</template>
229
- // </j-if>
230
- // </div>
231
- // `);
232
-
233
- // assert.equal(element.textContent?.trim(), "");
234
- // });
235
-
236
- // it("should handle not equal comparison with string numbers", () => {
237
- // const element = fixtureSync(html`
238
- // <div
239
- // @joist::value=${(e: JoistValueEvent) => {
240
- // e.update({ oldValue: null, newValue: { count: "10" } });
241
- // }}
242
- // >
243
- // <j-if bind="example.count != 5">
244
- // <template>Count is Not 5</template>
245
- // </j-if>
246
- // </div>
247
- // `);
248
-
249
- // assert.equal(element.textContent?.trim(), "Count is Not 5");
250
- // });
251
-
252
- // it("should handle not equal comparison with undefined", () => {
253
- // const element = fixtureSync(html`
254
- // <div
255
- // @joist::value=${(e: JoistValueEvent) => {
256
- // e.update({ oldValue: null, newValue: { status: undefined } });
257
- // }}
258
- // >
259
- // <j-if bind="example.status != active">
260
- // <template>Status is Not Active</template>
261
- // </j-if>
262
- // </div>
263
- // `);
264
-
265
- // assert.equal(element.textContent?.trim(), "Status is Not Active");
266
- // });
8
+ it("should render content when the bind value is truthy", () => {
9
+ const element = fixtureSync(html`
10
+ <div
11
+ @joist::value=${(e: JoistValueEvent) => {
12
+ e.update({ oldValue: null, newValue: true });
13
+ }}
14
+ >
15
+ <j-if bind="test">
16
+ <template>Visible Content</template>
17
+ </j-if>
18
+ </div>
19
+ `);
20
+
21
+ assert.equal(element.textContent?.trim(), "Visible Content");
22
+ });
23
+
24
+ it("should not render content when the bind value is falsy", () => {
25
+ const element = fixtureSync(html`
26
+ <div
27
+ @joist::value=${(e: JoistValueEvent) => {
28
+ e.update({ oldValue: null, newValue: true });
29
+ e.update({ oldValue: null, newValue: false });
30
+ }}
31
+ >
32
+ <j-if bind="test">
33
+ <template>Visible Content</template>
34
+ </j-if>
35
+ </div>
36
+ `);
37
+
38
+ assert.equal(element.textContent?.trim(), "");
39
+ });
40
+
41
+ it("should handle negated tokens correctly", () => {
42
+ const element = fixtureSync(html`
43
+ <div
44
+ @joist::value=${(e: JoistValueEvent) => {
45
+ e.update({ oldValue: null, newValue: false });
46
+ }}
47
+ >
48
+ <j-if bind="!test">
49
+ <template>Visible Content</template>
50
+ </j-if>
51
+ </div>
52
+ `);
53
+
54
+ assert.equal(element.textContent?.trim(), "Visible Content");
55
+ });
56
+
57
+ it("should render else template when condition is falsy", () => {
58
+ const element = fixtureSync(html`
59
+ <div
60
+ @joist::value=${(e: JoistValueEvent) => {
61
+ e.update({ oldValue: null, newValue: false });
62
+ }}
63
+ >
64
+ <j-if bind="test">
65
+ <template>If Content</template>
66
+ <template else>Else Content</template>
67
+ </j-if>
68
+ </div>
69
+ `);
70
+
71
+ assert.equal(element.textContent?.trim(), "Else Content");
72
+ });
73
+
74
+ it("should switch between if and else templates", () => {
75
+ const element = fixtureSync(html`
76
+ <div
77
+ @joist::value=${(e: JoistValueEvent) => {
78
+ e.update({ oldValue: null, newValue: false });
79
+ e.update({ oldValue: false, newValue: true });
80
+ }}
81
+ >
82
+ <j-if bind="test">
83
+ <template>If Content</template>
84
+ <template else>Else Content</template>
85
+ </j-if>
86
+ </div>
87
+ `);
88
+
89
+ assert.equal(element.textContent?.trim(), "If Content");
90
+ });
91
+
92
+ it("should handle equality comparison", () => {
93
+ const element = fixtureSync(html`
94
+ <div
95
+ @joist::value=${(e: JoistValueEvent) => {
96
+ e.update({ oldValue: null, newValue: { status: "active" } });
97
+ }}
98
+ >
99
+ <j-if bind="example.status == active">
100
+ <template>Status is Active</template>
101
+ </j-if>
102
+ </div>
103
+ `);
104
+
105
+ assert.equal(element.textContent?.trim(), "Status is Active");
106
+ });
107
+
108
+ it("should handle greater than comparison", () => {
109
+ const element = fixtureSync(html`
110
+ <div
111
+ @joist::value=${(e: JoistValueEvent) => {
112
+ e.update({ oldValue: null, newValue: { count: 10 } });
113
+ }}
114
+ >
115
+ <j-if bind="example.count > 5">
116
+ <template>Count is Greater Than 5</template>
117
+ </j-if>
118
+ </div>
119
+ `);
120
+
121
+ assert.equal(element.textContent?.trim(), "Count is Greater Than 5");
122
+ });
123
+
124
+ it("should handle less than comparison", () => {
125
+ const element = fixtureSync(html`
126
+ <div
127
+ @joist::value=${(e: JoistValueEvent) => {
128
+ e.update({ oldValue: null, newValue: { score: 75 } });
129
+ }}
130
+ >
131
+ <j-if bind="example.score < 100">
132
+ <template>Score is Less Than 100</template>
133
+ </j-if>
134
+ </div>
135
+ `);
136
+
137
+ assert.equal(element.textContent?.trim(), "Score is Less Than 100");
138
+ });
139
+
140
+ it("should handle nested path comparisons", () => {
141
+ const element = fixtureSync(html`
142
+ <div
143
+ @joist::value=${(e: JoistValueEvent) => {
144
+ e.update({ oldValue: null, newValue: { user: { score: 150 } } });
145
+ }}
146
+ >
147
+ <j-if bind="example.user.score > 100">
148
+ <template>User Score is Above 100</template>
149
+ </j-if>
150
+ </div>
151
+ `);
152
+
153
+ assert.equal(element.textContent?.trim(), "User Score is Above 100");
154
+ });
155
+
156
+ it("should handle negated comparisons", () => {
157
+ const element = fixtureSync(html`
158
+ <div
159
+ @joist::value=${(e: JoistValueEvent) => {
160
+ e.update({ oldValue: null, newValue: { status: "inactive" } });
161
+ }}
162
+ >
163
+ <j-if bind="!example.status == active">
164
+ <template>Status is Not Active</template>
165
+ </j-if>
166
+ </div>
167
+ `);
168
+
169
+ assert.equal(element.textContent?.trim(), "Status is Not Active");
170
+ });
171
+
172
+ it("should handle string number comparisons", () => {
173
+ const element = fixtureSync(html`
174
+ <div
175
+ @joist::value=${(e: JoistValueEvent) => {
176
+ e.update({ oldValue: null, newValue: { count: "10" } });
177
+ }}
178
+ >
179
+ <j-if bind="example.count > 5">
180
+ <template>String Count is Greater Than 5</template>
181
+ </j-if>
182
+ </div>
183
+ `);
184
+
185
+ assert.equal(element.textContent?.trim(), "String Count is Greater Than 5");
186
+ });
187
+
188
+ it("should handle undefined values in comparisons", () => {
189
+ const element = fixtureSync(html`
190
+ <div
191
+ @joist::value=${(e: JoistValueEvent) => {
192
+ e.update({ oldValue: null, newValue: { count: undefined } });
193
+ }}
194
+ >
195
+ <j-if bind="example.count > 5">
196
+ <template>Count is Greater Than 5</template>
197
+ </j-if>
198
+ </div>
199
+ `);
200
+
201
+ assert.equal(element.textContent?.trim(), "");
202
+ });
203
+
204
+ it("should handle not equal comparison", () => {
205
+ const element = fixtureSync(html`
206
+ <div
207
+ @joist::value=${(e: JoistValueEvent) => {
208
+ e.update({ oldValue: null, newValue: { status: "inactive" } });
209
+ }}
210
+ >
211
+ <j-if bind="example.status != active">
212
+ <template>Status is Not Active</template>
213
+ </j-if>
214
+ </div>
215
+ `);
216
+
217
+ assert.equal(element.textContent?.trim(), "Status is Not Active");
218
+ });
219
+
220
+ it("should handle not equal comparison with matching value", () => {
221
+ const element = fixtureSync(html`
222
+ <div
223
+ @joist::value=${(e: JoistValueEvent) => {
224
+ e.update({ oldValue: null, newValue: { status: "active" } });
225
+ }}
226
+ >
227
+ <j-if bind="example.status != active">
228
+ <template>Status is Not Active</template>
229
+ </j-if>
230
+ </div>
231
+ `);
232
+
233
+ assert.equal(element.textContent?.trim(), "");
234
+ });
235
+
236
+ it("should handle not equal comparison with string numbers", () => {
237
+ const element = fixtureSync(html`
238
+ <div
239
+ @joist::value=${(e: JoistValueEvent) => {
240
+ e.update({ oldValue: null, newValue: { count: "10" } });
241
+ }}
242
+ >
243
+ <j-if bind="example.count != 5">
244
+ <template>Count is Not 5</template>
245
+ </j-if>
246
+ </div>
247
+ `);
248
+
249
+ assert.equal(element.textContent?.trim(), "Count is Not 5");
250
+ });
251
+
252
+ it("should handle not equal comparison with undefined", () => {
253
+ const element = fixtureSync(html`
254
+ <div
255
+ @joist::value=${(e: JoistValueEvent) => {
256
+ e.update({ oldValue: null, newValue: { status: undefined } });
257
+ }}
258
+ >
259
+ <j-if bind="example.status != active">
260
+ <template>Status is Not Active</template>
261
+ </j-if>
262
+ </div>
263
+ `);
264
+
265
+ assert.equal(element.textContent?.trim(), "Status is Not Active");
266
+ });
267
267
 
268
268
  it("should handle array length", () => {
269
269
  const element = fixtureSync(html`
@@ -298,3 +298,57 @@ it("should handle a first change even if the value is the same", () => {
298
298
 
299
299
  assert.equal(element.textContent?.trim(), "Array has no length");
300
300
  });
301
+
302
+ it("should render in target container", () => {
303
+ const element = fixtureSync(html`
304
+ <div
305
+ @joist::value=${(e: JoistValueEvent) => {
306
+ e.update({ oldValue: null, newValue: true });
307
+ }}
308
+ >
309
+ <j-if bind="test" target="#container">
310
+ <template>Visible Content</template>
311
+ </j-if>
312
+
313
+ <div id="container"></div>
314
+ </div>
315
+ `);
316
+
317
+ const container = element.querySelector("#container");
318
+
319
+ assert.equal(container?.textContent?.trim(), "Visible Content");
320
+ });
321
+
322
+ it("should wait for depends-on before dispatching events", async () => {
323
+ let eventDispatched = false;
324
+
325
+ customElements.define("dependency-1", class extends HTMLElement {});
326
+ customElements.define("dependency-2", class extends HTMLElement {});
327
+
328
+ fixtureSync(html`
329
+ <div
330
+ @joist::value=${(e: JoistValueEvent) => {
331
+ if (e.expression.bindTo === "test") {
332
+ eventDispatched = true;
333
+ e.update({ oldValue: null, newValue: true });
334
+ }
335
+ }}
336
+ >
337
+ <j-if bind="test" depends-on="dependency-1,dependency-2">
338
+ <template>Visible Content</template>
339
+ </j-if>
340
+ </div>
341
+ `);
342
+
343
+ // Initially, no event should be dispatched
344
+ assert.isFalse(eventDispatched);
345
+
346
+ // Wait for the custom elements to be defined
347
+ await Promise.all([
348
+ customElements.whenDefined("dependency-1"),
349
+ customElements.whenDefined("dependency-2"),
350
+ ]);
351
+
352
+ // Now the event should be dispatched
353
+ assert.isTrue(eventDispatched);
354
+ });