@joist/templating 4.5.0 → 4.7.0

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/package.json +1 -1
  2. package/src/lib/bind.ts +13 -4
  3. package/src/lib/elements/async.element.ts +4 -4
  4. package/src/lib/elements/bind.element.test.ts +2 -2
  5. package/src/lib/elements/bind.element.ts +4 -2
  6. package/src/lib/elements/for.element.test.ts +10 -10
  7. package/src/lib/elements/for.element.ts +5 -3
  8. package/src/lib/elements/if.element.ts +4 -2
  9. package/src/lib/events.ts +2 -2
  10. package/src/lib/expression.ts +4 -3
  11. package/target/lib/bind.d.ts +0 -5
  12. package/target/lib/bind.js +0 -45
  13. package/target/lib/bind.js.map +0 -1
  14. package/target/lib/bind.test.d.ts +0 -1
  15. package/target/lib/bind.test.js +0 -76
  16. package/target/lib/bind.test.js.map +0 -1
  17. package/target/lib/define.d.ts +0 -16
  18. package/target/lib/define.js +0 -14
  19. package/target/lib/define.js.map +0 -1
  20. package/target/lib/elements/async.element.d.ts +0 -13
  21. package/target/lib/elements/async.element.js +0 -133
  22. package/target/lib/elements/async.element.js.map +0 -1
  23. package/target/lib/elements/async.element.test.d.ts +0 -1
  24. package/target/lib/elements/async.element.test.js +0 -180
  25. package/target/lib/elements/async.element.test.js.map +0 -1
  26. package/target/lib/elements/bind.element.d.ts +0 -13
  27. package/target/lib/elements/bind.element.js +0 -144
  28. package/target/lib/elements/bind.element.js.map +0 -1
  29. package/target/lib/elements/bind.element.test.d.ts +0 -1
  30. package/target/lib/elements/bind.element.test.js +0 -150
  31. package/target/lib/elements/bind.element.test.js.map +0 -1
  32. package/target/lib/elements/for.element.d.ts +0 -15
  33. package/target/lib/elements/for.element.js +0 -215
  34. package/target/lib/elements/for.element.js.map +0 -1
  35. package/target/lib/elements/for.element.test.d.ts +0 -1
  36. package/target/lib/elements/for.element.test.js +0 -188
  37. package/target/lib/elements/for.element.test.js.map +0 -1
  38. package/target/lib/elements/if.element.d.ts +0 -9
  39. package/target/lib/elements/if.element.js +0 -108
  40. package/target/lib/elements/if.element.js.map +0 -1
  41. package/target/lib/elements/if.element.test.d.ts +0 -1
  42. package/target/lib/elements/if.element.test.js +0 -306
  43. package/target/lib/elements/if.element.test.js.map +0 -1
  44. package/target/lib/elements/scope.element.d.ts +0 -3
  45. package/target/lib/elements/scope.element.js +0 -37
  46. package/target/lib/elements/scope.element.js.map +0 -1
  47. package/target/lib/elements/scope.element.test.d.ts +0 -1
  48. package/target/lib/elements/scope.element.test.js +0 -24
  49. package/target/lib/elements/scope.element.test.js.map +0 -1
  50. package/target/lib/elements/value.element.d.ts +0 -5
  51. package/target/lib/elements/value.element.js +0 -62
  52. package/target/lib/elements/value.element.js.map +0 -1
  53. package/target/lib/elements/value.element.test.d.ts +0 -1
  54. package/target/lib/elements/value.element.test.js +0 -65
  55. package/target/lib/elements/value.element.test.js.map +0 -1
  56. package/target/lib/events.d.ts +0 -16
  57. package/target/lib/events.js +0 -10
  58. package/target/lib/events.js.map +0 -1
  59. package/target/lib/expression.d.ts +0 -13
  60. package/target/lib/expression.js +0 -87
  61. package/target/lib/expression.js.map +0 -1
  62. package/target/lib/expression.test.d.ts +0 -1
  63. package/target/lib/expression.test.js +0 -171
  64. package/target/lib/expression.test.js.map +0 -1
  65. package/target/lib.d.ts +0 -2
  66. package/target/lib.js +0 -3
  67. package/target/lib.js.map +0 -1
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@joist/templating",
3
- "version": "4.5.0",
3
+ "version": "4.7.0",
4
4
  "type": "module",
5
5
  "main": "./target/lib.js",
6
6
  "module": "./target/lib.js",
package/src/lib/bind.ts CHANGED
@@ -1,4 +1,5 @@
1
- import { instanceMetadataStore, observe, ObserveOpts } from "@joist/observable";
1
+ import { instanceMetadataStore, observe } from "@joist/observable";
2
+ import type { ObserveOpts } from "@joist/observable";
2
3
 
3
4
  export interface BindOpts<This, Value> extends ObserveOpts<This, Value> {
4
5
  /**
@@ -15,7 +16,7 @@ export function bind<This extends HTMLElement, Value>(opts: BindOpts<This, Value
15
16
  ): ClassAccessorDecoratorResult<This, Value> {
16
17
  const internalObserve = observe(opts)(base, ctx);
17
18
 
18
- return {
19
+ const accessorResult: ClassAccessorDecoratorResult<This, Value> = {
19
20
  init(value) {
20
21
  this.addEventListener("joist::value", (e) => {
21
22
  if (e.expression.bindTo === ctx.name) {
@@ -57,8 +58,16 @@ export function bind<This extends HTMLElement, Value>(opts: BindOpts<This, Value
57
58
 
58
59
  return value;
59
60
  },
60
- get: internalObserve.get,
61
- set: internalObserve.set,
62
61
  };
62
+
63
+ if (internalObserve.get) {
64
+ accessorResult.get = internalObserve.get;
65
+ }
66
+
67
+ if (internalObserve.set) {
68
+ accessorResult.set = internalObserve.set;
69
+ }
70
+
71
+ return accessorResult;
63
72
  };
64
73
  }
@@ -29,9 +29,9 @@ export class JoistAsyncElement extends HTMLElement {
29
29
  #templates = queryAll<HTMLTemplateElement>("template", this);
30
30
  #currentNodes: Node[] = [];
31
31
  #cachedTemplates: {
32
- loading?: HTMLTemplateElement;
33
- error?: HTMLTemplateElement;
34
- success?: HTMLTemplateElement;
32
+ loading: HTMLTemplateElement | undefined;
33
+ error: HTMLTemplateElement | undefined;
34
+ success: HTMLTemplateElement | undefined;
35
35
  } = {
36
36
  loading: undefined,
37
37
  error: undefined,
@@ -95,7 +95,7 @@ export class JoistAsyncElement extends HTMLElement {
95
95
  #handleState(state: AsyncState): void {
96
96
  this.#clean();
97
97
 
98
- let template: HTMLTemplateElement | undefined = undefined;
98
+ let template: HTMLTemplateElement | undefined;
99
99
 
100
100
  this.state = state;
101
101
 
@@ -57,8 +57,8 @@ it("should pass props to specified child", () => {
57
57
 
58
58
  const anchor = element.querySelectorAll("a");
59
59
 
60
- assert.equal(anchor[0].getAttribute("href"), null);
61
- assert.equal(anchor[1].getAttribute("href"), "#foo");
60
+ assert.equal(anchor[0]!.getAttribute("href"), null);
61
+ assert.equal(anchor[1]!.getAttribute("href"), "#foo");
62
62
  });
63
63
 
64
64
  it("should be case sensitive", () => {
@@ -8,10 +8,12 @@ export class JAttrToken extends JExpression {
8
8
 
9
9
  constructor(binding: string) {
10
10
  const [mapTo, bindTo] = binding.split(":");
11
+ const source = bindTo ?? mapTo ?? "";
12
+ const target = mapTo ?? bindTo ?? "";
11
13
 
12
- super(bindTo ?? mapTo);
14
+ super(source);
13
15
 
14
- this.mapTo = mapTo;
16
+ this.mapTo = target;
15
17
  }
16
18
  }
17
19
 
@@ -33,8 +33,8 @@ it("should iterate over an iterable", () => {
33
33
  const listItems = element.querySelectorAll("li");
34
34
 
35
35
  assert.equal(listItems.length, 2);
36
- assert.equal(listItems[0].textContent?.trim(), "Hello");
37
- assert.equal(listItems[1].textContent?.trim(), "World");
36
+ assert.equal(listItems[0]!.textContent?.trim(), "Hello");
37
+ assert.equal(listItems[1]!.textContent?.trim(), "World");
38
38
  });
39
39
 
40
40
  it("should handle empty arrays", () => {
@@ -101,8 +101,8 @@ it("should update when items are added or removed", () => {
101
101
 
102
102
  const items = element.querySelectorAll("j-val");
103
103
  assert.equal(items.length, 2);
104
- assert.equal(items[0].textContent?.trim(), "First");
105
- assert.equal(items[1].textContent?.trim(), "Third");
104
+ assert.equal(items[0]!.textContent?.trim(), "First");
105
+ assert.equal(items[1]!.textContent?.trim(), "Third");
106
106
  });
107
107
 
108
108
  it("should provide index and position information", () => {
@@ -130,15 +130,15 @@ it("should provide index and position information", () => {
130
130
  const items = element.querySelectorAll(".item");
131
131
  assert.equal(items.length, 3);
132
132
  assert.equal(
133
- items[0].textContent?.trim().replaceAll("\n", "").replaceAll(" ", ""),
133
+ items[0]!.textContent?.trim().replaceAll("\n", "").replaceAll(" ", ""),
134
134
  "A(index:0,position:1)",
135
135
  );
136
136
  assert.equal(
137
- items[1].textContent?.trim().replaceAll("\n", "").replaceAll(" ", ""),
137
+ items[1]!.textContent?.trim().replaceAll("\n", "").replaceAll(" ", ""),
138
138
  "B(index:1,position:2)",
139
139
  );
140
140
  assert.equal(
141
- items[2].textContent?.trim().replaceAll("\n", "").replaceAll(" ", ""),
141
+ items[2]!.textContent?.trim().replaceAll("\n", "").replaceAll(" ", ""),
142
142
  "C(index:2,position:3)",
143
143
  );
144
144
  });
@@ -218,9 +218,9 @@ it("should maintain DOM order when items are reordered", () => {
218
218
 
219
219
  const items = element.querySelectorAll("j-val");
220
220
  assert.equal(items.length, 3);
221
- assert.equal(items[0].textContent?.trim(), "Third");
222
- assert.equal(items[1].textContent?.trim(), "First");
223
- assert.equal(items[2].textContent?.trim(), "Second");
221
+ assert.equal(items[0]!.textContent?.trim(), "Third");
222
+ assert.equal(items[1]!.textContent?.trim(), "First");
223
+ assert.equal(items[2]!.textContent?.trim(), "Second");
224
224
  });
225
225
 
226
226
  it("should wait for depends-on before dispatching events", async () => {
@@ -1,7 +1,9 @@
1
1
  import { attr, element, query, css, html } from "@joist/element";
2
- import { Change, Changes, effect, observe } from "@joist/observable";
2
+ import { effect, observe } from "@joist/observable";
3
+ import type { Change, Changes } from "@joist/observable";
3
4
 
4
- import { BindChange, JoistValueEvent } from "../events.js";
5
+ import { JoistValueEvent } from "../events.js";
6
+ import type { BindChange } from "../events.js";
5
7
  import { JExpression } from "../expression.js";
6
8
 
7
9
  export interface EachCtx<T> {
@@ -186,7 +188,7 @@ export class JoistForElement extends HTMLElement {
186
188
  scope.each = { position: index + 1, index, value };
187
189
  }
188
190
 
189
- const child = this.children[index + 1];
191
+ const child = this.children[index + 1] ?? null;
190
192
 
191
193
  if (child !== scope.host) {
192
194
  this.insertBefore(scope.host, child);
@@ -38,9 +38,11 @@ export class JoistIfElement extends HTMLElement {
38
38
  throw new Error("When using two templates, one must have the else attribute");
39
39
  }
40
40
 
41
- if (templates.length === 2 && templates[0].hasAttribute("else")) {
41
+ if (templates.length === 2 && templates[0]!.hasAttribute("else")) {
42
42
  // Swap templates to ensure if template is first
43
- [templates[0], templates[1]] = [templates[1], templates[0]];
43
+ const first = templates[0]!;
44
+ templates[0] = templates[1]!;
45
+ templates[1] = first;
44
46
  }
45
47
 
46
48
  const token = new JExpression(this.bind);
package/src/lib/events.ts CHANGED
@@ -9,8 +9,8 @@ declare global {
9
9
  }
10
10
 
11
11
  export interface BindChange<T> extends Change<T> {
12
- alwaysUpdate?: boolean;
13
- firstChange?: boolean;
12
+ alwaysUpdate?: boolean | undefined;
13
+ firstChange?: boolean | undefined;
14
14
  }
15
15
 
16
16
  export class JoistValueEvent extends Event {
@@ -2,8 +2,8 @@ type ComparisonOperator = "==" | "!=" | ">" | "<";
2
2
 
3
3
  interface TokenParts {
4
4
  path: string[];
5
- value?: string;
6
- operator?: ComparisonOperator;
5
+ value?: string | undefined;
6
+ operator?: ComparisonOperator | undefined;
7
7
  }
8
8
 
9
9
  /**
@@ -113,8 +113,9 @@ export class JExpression {
113
113
  for (const operator of operators) {
114
114
  if (this.rawToken.includes(operator)) {
115
115
  const [tokenPart, value] = this.rawToken.split(operator).map((part) => part.trim());
116
+
116
117
  return {
117
- path: tokenPart.split("."),
118
+ path: tokenPart?.split(".") ?? [],
118
119
  value,
119
120
  operator,
120
121
  };
@@ -1,5 +0,0 @@
1
- import { ObserveOpts } from "@joist/observable";
2
- export interface BindOpts<This, Value> extends ObserveOpts<This, Value> {
3
- alwaysUpdate?: boolean;
4
- }
5
- export declare function bind<This extends HTMLElement, Value>(opts?: BindOpts<This, Value>): (base: ClassAccessorDecoratorTarget<This, Value>, ctx: ClassAccessorDecoratorContext<This, Value>) => ClassAccessorDecoratorResult<This, Value>;
@@ -1,45 +0,0 @@
1
- import { instanceMetadataStore, observe } from "@joist/observable";
2
- export function bind(opts = {}) {
3
- return function bindDecorator(base, ctx) {
4
- const internalObserve = observe(opts)(base, ctx);
5
- return {
6
- init(value) {
7
- this.addEventListener("joist::value", (e) => {
8
- if (e.expression.bindTo === ctx.name) {
9
- const instanceMeta = instanceMetadataStore.read(this);
10
- e.stopPropagation();
11
- e.update({
12
- oldValue: null,
13
- newValue: ctx.access.get(this),
14
- alwaysUpdate: opts.alwaysUpdate,
15
- firstChange: true,
16
- });
17
- const name = ctx.name;
18
- instanceMeta.bindings.add((changes) => {
19
- const change = changes.get(name);
20
- if (change) {
21
- e.update({ ...change, alwaysUpdate: opts.alwaysUpdate, firstChange: false });
22
- }
23
- else if (opts.alwaysUpdate) {
24
- const value = ctx.access.get(this);
25
- e.update({
26
- oldValue: value,
27
- newValue: value,
28
- alwaysUpdate: opts.alwaysUpdate,
29
- firstChange: false,
30
- });
31
- }
32
- });
33
- }
34
- });
35
- if (internalObserve.init) {
36
- return internalObserve.init.call(this, value);
37
- }
38
- return value;
39
- },
40
- get: internalObserve.get,
41
- set: internalObserve.set,
42
- };
43
- };
44
- }
45
- //# sourceMappingURL=bind.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"bind.js","sourceRoot":"","sources":["../../src/lib/bind.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,OAAO,EAAe,MAAM,mBAAmB,CAAC;AAUhF,MAAM,UAAU,IAAI,CAAkC,OAA8B,EAAE;IACpF,OAAO,SAAS,aAAa,CAC3B,IAA+C,EAC/C,GAA+C;QAE/C,MAAM,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;QAEjD,OAAO;YACL,IAAI,CAAC,KAAK;gBACR,IAAI,CAAC,gBAAgB,CAAC,cAAc,EAAE,CAAC,CAAC,EAAE,EAAE;oBAC1C,IAAI,CAAC,CAAC,UAAU,CAAC,MAAM,KAAK,GAAG,CAAC,IAAI,EAAE,CAAC;wBACrC,MAAM,YAAY,GAAG,qBAAqB,CAAC,IAAI,CAAO,IAAI,CAAC,CAAC;wBAE5D,CAAC,CAAC,eAAe,EAAE,CAAC;wBAEpB,CAAC,CAAC,MAAM,CAAC;4BACP,QAAQ,EAAE,IAAI;4BACd,QAAQ,EAAE,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC;4BAC9B,YAAY,EAAE,IAAI,CAAC,YAAY;4BAC/B,WAAW,EAAE,IAAI;yBAClB,CAAC,CAAC;wBAEH,MAAM,IAAI,GAAG,GAAG,CAAC,IAAkB,CAAC;wBAEpC,YAAY,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE;4BACpC,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;4BAEjC,IAAI,MAAM,EAAE,CAAC;gCACX,CAAC,CAAC,MAAM,CAAC,EAAE,GAAG,MAAM,EAAE,YAAY,EAAE,IAAI,CAAC,YAAY,EAAE,WAAW,EAAE,KAAK,EAAE,CAAC,CAAC;4BAC/E,CAAC;iCAAM,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;gCAC7B,MAAM,KAAK,GAAG,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;gCAEnC,CAAC,CAAC,MAAM,CAAC;oCACP,QAAQ,EAAE,KAAK;oCACf,QAAQ,EAAE,KAAK;oCACf,YAAY,EAAE,IAAI,CAAC,YAAY;oCAC/B,WAAW,EAAE,KAAK;iCACnB,CAAC,CAAC;4BACL,CAAC;wBACH,CAAC,CAAC,CAAC;oBACL,CAAC;gBACH,CAAC,CAAC,CAAC;gBAEH,IAAI,eAAe,CAAC,IAAI,EAAE,CAAC;oBACzB,OAAO,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,CAAU,CAAC;gBACzD,CAAC;gBAED,OAAO,KAAK,CAAC;YACf,CAAC;YACD,GAAG,EAAE,eAAe,CAAC,GAAG;YACxB,GAAG,EAAE,eAAe,CAAC,GAAG;SACzB,CAAC;IACJ,CAAC,CAAC;AACJ,CAAC"}
@@ -1 +0,0 @@
1
- export {};
@@ -1,76 +0,0 @@
1
- import { __esDecorate, __runInitializers } from "tslib";
2
- import { assert } from "chai";
3
- import { bind } from "./bind.js";
4
- import { JoistValueEvent } from "./events.js";
5
- import { JExpression } from "./expression.js";
6
- describe("bind decorator", () => {
7
- let TestElement = (() => {
8
- let _classSuper = HTMLElement;
9
- let _value_decorators;
10
- let _value_initializers = [];
11
- let _value_extraInitializers = [];
12
- let _alwaysUpdateValue_decorators;
13
- let _alwaysUpdateValue_initializers = [];
14
- let _alwaysUpdateValue_extraInitializers = [];
15
- return class TestElement extends _classSuper {
16
- static {
17
- const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(_classSuper[Symbol.metadata] ?? null) : void 0;
18
- _value_decorators = [bind()];
19
- _alwaysUpdateValue_decorators = [bind({ alwaysUpdate: true })];
20
- __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; } }, metadata: _metadata }, _value_initializers, _value_extraInitializers);
21
- __esDecorate(this, null, _alwaysUpdateValue_decorators, { kind: "accessor", name: "alwaysUpdateValue", static: false, private: false, access: { has: obj => "alwaysUpdateValue" in obj, get: obj => obj.alwaysUpdateValue, set: (obj, value) => { obj.alwaysUpdateValue = value; } }, metadata: _metadata }, _alwaysUpdateValue_initializers, _alwaysUpdateValue_extraInitializers);
22
- if (_metadata) Object.defineProperty(this, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
23
- }
24
- #value_accessor_storage = __runInitializers(this, _value_initializers, "initial");
25
- get value() { return this.#value_accessor_storage; }
26
- set value(value) { this.#value_accessor_storage = value; }
27
- #alwaysUpdateValue_accessor_storage = (__runInitializers(this, _value_extraInitializers), __runInitializers(this, _alwaysUpdateValue_initializers, "initial"));
28
- get alwaysUpdateValue() { return this.#alwaysUpdateValue_accessor_storage; }
29
- set alwaysUpdateValue(value) { this.#alwaysUpdateValue_accessor_storage = value; }
30
- constructor() {
31
- super(...arguments);
32
- __runInitializers(this, _alwaysUpdateValue_extraInitializers);
33
- }
34
- };
35
- })();
36
- customElements.define("test-element", TestElement);
37
- it("should initialize with default value", () => {
38
- const element = new TestElement();
39
- assert.equal(element.value, "initial");
40
- });
41
- it("should update value and trigger binding", async () => {
42
- const element = new TestElement();
43
- let oldValue = null;
44
- let newValue = null;
45
- element.dispatchEvent(new JoistValueEvent(new JExpression("value"), (update) => {
46
- oldValue = update.oldValue;
47
- newValue = update.newValue;
48
- }));
49
- assert.equal(oldValue, null);
50
- assert.equal(newValue, "initial");
51
- element.value = "updated";
52
- await Promise.resolve();
53
- assert.equal(oldValue, "initial");
54
- assert.equal(newValue, "updated");
55
- });
56
- it("should trigger binding on every change with alwaysUpdate option", async () => {
57
- const element = new TestElement();
58
- let bindingCount = 0;
59
- let oldValue;
60
- let newValue;
61
- element.dispatchEvent(new JoistValueEvent(new JExpression("alwaysUpdateValue"), (update) => {
62
- bindingCount++;
63
- oldValue = update.oldValue;
64
- newValue = update.newValue;
65
- }));
66
- assert.equal(bindingCount, 1);
67
- assert.equal(oldValue, null);
68
- assert.equal(newValue, "initial");
69
- element.value = "something else";
70
- await Promise.resolve();
71
- assert.equal(bindingCount, 2);
72
- assert.equal(oldValue, "initial");
73
- assert.equal(newValue, "initial");
74
- });
75
- });
76
- //# sourceMappingURL=bind.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"bind.test.js","sourceRoot":"","sources":["../../src/lib/bind.test.ts"],"names":[],"mappings":"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"}
@@ -1,16 +0,0 @@
1
- import { JoistAsyncElement } from "./elements/async.element.js";
2
- import { JoistForElement } from "./elements/for.element.js";
3
- import { JoistIfElement } from "./elements/if.element.js";
4
- import { JoistBindElement } from "./elements/bind.element.js";
5
- import { JoistValueElement } from "./elements/value.element.js";
6
- import { JoistScopeElement } from "./elements/scope.element.js";
7
- declare global {
8
- interface HTMLElementTagNameMap {
9
- "j-async": JoistAsyncElement;
10
- "j-for": JoistForElement;
11
- "j-if": JoistIfElement;
12
- "j-bind": JoistBindElement;
13
- "j-val": JoistValueElement;
14
- "j-scope": JoistScopeElement;
15
- }
16
- }
@@ -1,14 +0,0 @@
1
- import { define } from "@joist/element/define.js";
2
- import { JoistAsyncElement } from "./elements/async.element.js";
3
- import { JoistForElement } from "./elements/for.element.js";
4
- import { JoistIfElement } from "./elements/if.element.js";
5
- import { JoistBindElement } from "./elements/bind.element.js";
6
- import { JoistValueElement } from "./elements/value.element.js";
7
- import { JoistScopeElement } from "./elements/scope.element.js";
8
- define({ tagName: "j-async" }, JoistAsyncElement);
9
- define({ tagName: "j-for" }, JoistForElement);
10
- define({ tagName: "j-if" }, JoistIfElement);
11
- define({ tagName: "j-bind" }, JoistBindElement);
12
- define({ tagName: "j-val" }, JoistValueElement);
13
- define({ tagName: "j-scope" }, JoistScopeElement);
14
- //# sourceMappingURL=define.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"define.js","sourceRoot":"","sources":["../../src/lib/define.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,0BAA0B,CAAC;AAElD,OAAO,EAAE,iBAAiB,EAAE,MAAM,6BAA6B,CAAC;AAChE,OAAO,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC;AAC5D,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAC1D,OAAO,EAAE,gBAAgB,EAAE,MAAM,4BAA4B,CAAC;AAC9D,OAAO,EAAE,iBAAiB,EAAE,MAAM,6BAA6B,CAAC;AAChE,OAAO,EAAE,iBAAiB,EAAE,MAAM,6BAA6B,CAAC;AAahE,MAAM,CAAC,EAAE,OAAO,EAAE,SAAS,EAAE,EAAE,iBAAiB,CAAC,CAAC;AAClD,MAAM,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,EAAE,eAAe,CAAC,CAAC;AAC9C,MAAM,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,EAAE,cAAc,CAAC,CAAC;AAC5C,MAAM,CAAC,EAAE,OAAO,EAAE,QAAQ,EAAE,EAAE,gBAAgB,CAAC,CAAC;AAChD,MAAM,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,EAAE,iBAAiB,CAAC,CAAC;AAChD,MAAM,CAAC,EAAE,OAAO,EAAE,SAAS,EAAE,EAAE,iBAAiB,CAAC,CAAC"}
@@ -1,13 +0,0 @@
1
- export type AsyncState<T = unknown, E = unknown> = {
2
- status: "loading" | "error" | "success";
3
- data?: T;
4
- error?: E;
5
- };
6
- export declare class JoistAsyncElement extends HTMLElement {
7
- #private;
8
- accessor bind: string;
9
- accessor dependsOn: string;
10
- accessor state: AsyncState | null;
11
- connectedCallback(): Promise<void>;
12
- disconnectedCallback(): void;
13
- }
@@ -1,133 +0,0 @@
1
- import { __esDecorate, __runInitializers } from "tslib";
2
- import { attr, element, queryAll, css, html } from "@joist/element";
3
- import { bind } from "../bind.js";
4
- import { JoistValueEvent } from "../events.js";
5
- import { JExpression } from "../expression.js";
6
- let JoistAsyncElement = (() => {
7
- let _classDecorators = [element({
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
- let _dependsOn_decorators;
18
- let _dependsOn_initializers = [];
19
- let _dependsOn_extraInitializers = [];
20
- let _state_decorators;
21
- let _state_initializers = [];
22
- let _state_extraInitializers = [];
23
- var JoistAsyncElement = 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
- _bind_decorators = [attr()];
28
- _dependsOn_decorators = [attr({
29
- name: "depends-on",
30
- })];
31
- _state_decorators = [bind()];
32
- __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);
33
- __esDecorate(this, null, _dependsOn_decorators, { kind: "accessor", name: "dependsOn", static: false, private: false, access: { has: obj => "dependsOn" in obj, get: obj => obj.dependsOn, set: (obj, value) => { obj.dependsOn = value; } }, metadata: _metadata }, _dependsOn_initializers, _dependsOn_extraInitializers);
34
- __esDecorate(this, null, _state_decorators, { kind: "accessor", name: "state", static: false, private: false, access: { has: obj => "state" in obj, get: obj => obj.state, set: (obj, value) => { obj.state = value; } }, metadata: _metadata }, _state_initializers, _state_extraInitializers);
35
- __esDecorate(null, _classDescriptor = { value: _classThis }, _classDecorators, { kind: "class", name: _classThis.name, metadata: _metadata }, null, _classExtraInitializers);
36
- JoistAsyncElement = _classThis = _classDescriptor.value;
37
- if (_metadata) Object.defineProperty(_classThis, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
38
- __runInitializers(_classThis, _classExtraInitializers);
39
- }
40
- #bind_accessor_storage = __runInitializers(this, _bind_initializers, "");
41
- get bind() { return this.#bind_accessor_storage; }
42
- set bind(value) { this.#bind_accessor_storage = value; }
43
- #dependsOn_accessor_storage = (__runInitializers(this, _bind_extraInitializers), __runInitializers(this, _dependsOn_initializers, ""));
44
- get dependsOn() { return this.#dependsOn_accessor_storage; }
45
- set dependsOn(value) { this.#dependsOn_accessor_storage = value; }
46
- #state_accessor_storage = (__runInitializers(this, _dependsOn_extraInitializers), __runInitializers(this, _state_initializers, null));
47
- get state() { return this.#state_accessor_storage; }
48
- set state(value) { this.#state_accessor_storage = value; }
49
- #templates = (__runInitializers(this, _state_extraInitializers), queryAll("template", this));
50
- #currentNodes = [];
51
- #cachedTemplates = {
52
- loading: undefined,
53
- error: undefined,
54
- success: undefined,
55
- };
56
- async connectedCallback() {
57
- this.#clean();
58
- const templates = Array.from(this.#templates());
59
- this.#cachedTemplates = {
60
- loading: templates.find((t) => t.hasAttribute("loading")),
61
- error: templates.find((t) => t.hasAttribute("error")),
62
- success: templates.find((t) => t.hasAttribute("success")),
63
- };
64
- if (this.dependsOn) {
65
- await Promise.all(this.dependsOn.split(",").map((tag) => window.customElements.whenDefined(tag)));
66
- }
67
- const token = new JExpression(this.bind);
68
- this.dispatchEvent(new JoistValueEvent(token, ({ newValue, oldValue }) => {
69
- if (newValue !== oldValue) {
70
- if (newValue instanceof Promise) {
71
- this.#handlePromise(newValue);
72
- }
73
- else if (this.#isAsyncState(newValue)) {
74
- this.#handleState(newValue);
75
- }
76
- else {
77
- console.warn("j-async bind value must be a Promise or AsyncState");
78
- }
79
- }
80
- }));
81
- }
82
- #isAsyncState(value) {
83
- return (typeof value === "object" &&
84
- value !== null &&
85
- "status" in value &&
86
- (value.status === "loading" || value.status === "error" || value.status === "success"));
87
- }
88
- async #handlePromise(promise) {
89
- try {
90
- this.#handleState({ status: "loading" });
91
- const data = await promise;
92
- this.#handleState({ status: "success", data });
93
- }
94
- catch (error) {
95
- this.#handleState({ status: "error", error });
96
- }
97
- }
98
- #handleState(state) {
99
- this.#clean();
100
- let template = undefined;
101
- this.state = state;
102
- switch (state.status) {
103
- case "loading":
104
- template = this.#cachedTemplates.loading;
105
- break;
106
- case "error":
107
- template = this.#cachedTemplates.error;
108
- break;
109
- case "success":
110
- template = this.#cachedTemplates.success;
111
- break;
112
- }
113
- if (template) {
114
- const content = document.importNode(template.content, true);
115
- const nodes = Array.from(content.childNodes);
116
- this.appendChild(content);
117
- this.#currentNodes = nodes;
118
- }
119
- }
120
- #clean() {
121
- for (const node of this.#currentNodes) {
122
- node.parentNode?.removeChild(node);
123
- }
124
- this.#currentNodes = [];
125
- }
126
- disconnectedCallback() {
127
- this.#clean();
128
- }
129
- };
130
- return JoistAsyncElement = _classThis;
131
- })();
132
- export { JoistAsyncElement };
133
- //# sourceMappingURL=async.element.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"async.element.js","sourceRoot":"","sources":["../../../src/lib/elements/async.element.ts"],"names":[],"mappings":"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"}
@@ -1 +0,0 @@
1
- import "../define.js";