@bodil/dom 0.1.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 (82) hide show
  1. package/LICENCE.md +288 -0
  2. package/dist/component.d.ts +147 -0
  3. package/dist/component.js +405 -0
  4. package/dist/component.js.map +1 -0
  5. package/dist/component.test.d.ts +1 -0
  6. package/dist/component.test.js +141 -0
  7. package/dist/component.test.js.map +1 -0
  8. package/dist/css.d.ts +14 -0
  9. package/dist/css.js +63 -0
  10. package/dist/css.js.map +1 -0
  11. package/dist/decorators/attribute.d.ts +26 -0
  12. package/dist/decorators/attribute.js +115 -0
  13. package/dist/decorators/attribute.js.map +1 -0
  14. package/dist/decorators/attribute.test.d.ts +1 -0
  15. package/dist/decorators/attribute.test.js +148 -0
  16. package/dist/decorators/attribute.test.js.map +1 -0
  17. package/dist/decorators/connect.d.ts +9 -0
  18. package/dist/decorators/connect.js +44 -0
  19. package/dist/decorators/connect.js.map +1 -0
  20. package/dist/decorators/connect.test.d.ts +1 -0
  21. package/dist/decorators/connect.test.js +196 -0
  22. package/dist/decorators/connect.test.js.map +1 -0
  23. package/dist/decorators/reactive.d.ts +7 -0
  24. package/dist/decorators/reactive.js +45 -0
  25. package/dist/decorators/reactive.js.map +1 -0
  26. package/dist/decorators/reactive.test.d.ts +1 -0
  27. package/dist/decorators/reactive.test.js +113 -0
  28. package/dist/decorators/reactive.test.js.map +1 -0
  29. package/dist/decorators/require.d.ts +3 -0
  30. package/dist/decorators/require.js +6 -0
  31. package/dist/decorators/require.js.map +1 -0
  32. package/dist/decorators/require.test.d.ts +1 -0
  33. package/dist/decorators/require.test.js +117 -0
  34. package/dist/decorators/require.test.js.map +1 -0
  35. package/dist/dom.d.ts +92 -0
  36. package/dist/dom.js +354 -0
  37. package/dist/dom.js.map +1 -0
  38. package/dist/emitter.d.ts +10 -0
  39. package/dist/emitter.js +17 -0
  40. package/dist/emitter.js.map +1 -0
  41. package/dist/event.d.ts +70 -0
  42. package/dist/event.js +14 -0
  43. package/dist/event.js.map +1 -0
  44. package/dist/event.test.d.ts +1 -0
  45. package/dist/event.test.js +20 -0
  46. package/dist/event.test.js.map +1 -0
  47. package/dist/geometry.d.ts +48 -0
  48. package/dist/geometry.js +117 -0
  49. package/dist/geometry.js.map +1 -0
  50. package/dist/index.d.ts +10 -0
  51. package/dist/index.js +11 -0
  52. package/dist/index.js.map +1 -0
  53. package/dist/scheduler.d.ts +2 -0
  54. package/dist/scheduler.js +54 -0
  55. package/dist/scheduler.js.map +1 -0
  56. package/dist/slot.d.ts +31 -0
  57. package/dist/slot.js +67 -0
  58. package/dist/slot.js.map +1 -0
  59. package/dist/test-global.d.ts +0 -0
  60. package/dist/test-global.js +5 -0
  61. package/dist/test-global.js.map +1 -0
  62. package/package.json +116 -0
  63. package/src/component.test.ts +90 -0
  64. package/src/component.ts +607 -0
  65. package/src/css.ts +69 -0
  66. package/src/decorators/attribute.test.ts +77 -0
  67. package/src/decorators/attribute.ts +197 -0
  68. package/src/decorators/connect.test.ts +119 -0
  69. package/src/decorators/connect.ts +85 -0
  70. package/src/decorators/reactive.test.ts +45 -0
  71. package/src/decorators/reactive.ts +80 -0
  72. package/src/decorators/require.test.ts +57 -0
  73. package/src/decorators/require.ts +11 -0
  74. package/src/dom.ts +456 -0
  75. package/src/emitter.ts +32 -0
  76. package/src/event.test.ts +22 -0
  77. package/src/event.ts +74 -0
  78. package/src/geometry.ts +147 -0
  79. package/src/index.ts +12 -0
  80. package/src/scheduler.ts +58 -0
  81. package/src/slot.ts +95 -0
  82. package/src/test-global.ts +5 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"css.js","sourceRoot":"","sources":["../src/css.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAC5C,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAIhD;;GAEG;AACH,MAAM,UAAU,mBAAmB,CAAC,OAAgB,EAAE,QAAgB;IAClE,OAAO,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,gBAAgB,CAAC,OAAO,CAAC,EAAE,gBAAgB,CAAC,QAAQ,CAAC,CAAC,CAAC;AACrF,CAAC;AAED,MAAM,cAAc,GAAG,6DAA6D,CAAC;AAErF,SAAS,aAAa,CAAC,KAAa;IAChC,MAAM,KAAK,GAAG,cAAc,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;IAChD,IAAI,KAAK,EAAE,MAAM,KAAK,SAAS,EAAE,CAAC;QAC9B,OAAO,IAAI,CAAC;IAChB,CAAC;IACD,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC;IAC1C,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC;IACxC,MAAM,MAAM,GAAG,MAAM,CAAC,UAAU,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IACtD,IAAI,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC;QACvB,OAAO,IAAI,CAAC;IAChB,CAAC;IACD,OAAO,IAAI,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;AACrD,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,SAAS,CAAC,KAAa;IACnC,OAAO,aAAa,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,EAAE;QACnD,QAAQ,IAAI,EAAE,CAAC;YACX,KAAK,IAAI;gBACL,OAAO,IAAI,CAAC,MAAM,CAAC,CAAC;YACxB,KAAK,IAAI;gBACL,OAAO,IAAI,CAAC,CAAC,MAAM,GAAG,EAAE,CAAC,GAAG,IAAI,CAAC,CAAC;YACtC,KAAK,IAAI;gBACL,OAAO,IAAI,CAAC,CAAC,MAAM,GAAG,EAAE,CAAC,GAAG,KAAK,CAAC,CAAC;YACvC,KAAK,GAAG;gBACJ,OAAO,IAAI,CAAC,CAAC,MAAM,GAAG,EAAE,CAAC,GAAG,MAAM,CAAC,CAAC;YACxC,KAAK,IAAI;gBACL,OAAO,IAAI,CAAC,MAAM,GAAG,EAAE,CAAC,CAAC;YAC7B,KAAK,IAAI;gBACL,OAAO,IAAI,CAAC,CAAC,MAAM,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;YACnC,KAAK,IAAI;gBACL,OAAO,IAAI,CAAC,CAAC,MAAM,GAAG,EAAE,CAAC,GAAG,EAAE,CAAC,CAAC;YACpC;gBACI,OAAO,IAAI,CAAC;QACpB,CAAC;IACL,CAAC,CAAC,CAAC;AACP,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,SAAS,CAAC,KAAa;IACnC,OAAO,aAAa,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,EAAE;QACnD,QAAQ,IAAI,EAAE,CAAC;YACX,KAAK,IAAI;gBACL,OAAO,IAAI,CAAC,MAAM,CAAC,CAAC;YACxB,KAAK,GAAG;gBACJ,OAAO,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;YAC/B;gBACI,OAAO,IAAI,CAAC;QACpB,CAAC;IACL,CAAC,CAAC,CAAC;AACP,CAAC"}
@@ -0,0 +1,26 @@
1
+ import type { Component } from "../component";
2
+ export declare const attributeConfig: unique symbol;
3
+ export type AttributeType = typeof String | typeof Number | typeof Boolean;
4
+ export type AttributeOptions = {
5
+ name: string | undefined;
6
+ reflect: boolean;
7
+ reactive: boolean;
8
+ };
9
+ export type AttributeConfig = {
10
+ type: AttributeType | undefined;
11
+ property: string;
12
+ } & AttributeOptions;
13
+ export declare function toAttribute(value: unknown, type: AttributeType): string | null;
14
+ export declare function fromAttribute(value: string | null, type: typeof Number): number | undefined;
15
+ export declare function fromAttribute(value: string | null, type: typeof Boolean): boolean;
16
+ export declare function fromAttribute(value: string | null, type: typeof String): string | undefined;
17
+ export declare function fromAttribute(value: string | null, type: AttributeType): string | number | boolean | undefined;
18
+ export declare function detectAttributeType(value: unknown): AttributeType | undefined;
19
+ export declare function attribute<C extends Component, T extends number | undefined>(options: Partial<AttributeOptions> & {
20
+ type: typeof Number;
21
+ }): (value: ClassAccessorDecoratorTarget<C, T>, context: ClassAccessorDecoratorContext<C, T>) => ClassAccessorDecoratorResult<C, T>;
22
+ export declare function attribute<C extends Component, T extends boolean | undefined>(options: Partial<AttributeOptions> & {
23
+ type: typeof Boolean;
24
+ }): (value: ClassAccessorDecoratorTarget<C, T>, context: ClassAccessorDecoratorContext<C, T>) => ClassAccessorDecoratorResult<C, T>;
25
+ export declare function attribute<C extends Component, T extends string | undefined>(options: Partial<AttributeOptions>): (value: ClassAccessorDecoratorTarget<C, T>, context: ClassAccessorDecoratorContext<C, T>) => ClassAccessorDecoratorResult<C, T>;
26
+ export declare function attribute<C extends Component, T extends string | undefined>(value: ClassAccessorDecoratorTarget<C, T>, context: ClassAccessorDecoratorContext<C, T>): ClassAccessorDecoratorResult<C, T>;
@@ -0,0 +1,115 @@
1
+ /* eslint-disable @typescript-eslint/unified-signatures */
2
+ import { isNullish, unreachable } from "@bodil/core/assert";
3
+ import { Signal } from "@bodil/signal";
4
+ import { signalForObject } from "./reactive";
5
+ export const attributeConfig = Symbol("attributeConfig");
6
+ export function toAttribute(value, type) {
7
+ if (isNullish(value)) {
8
+ return null;
9
+ }
10
+ switch (type) {
11
+ case Number:
12
+ return `${value}`;
13
+ case Boolean:
14
+ return value ? "" : null;
15
+ case String:
16
+ return value;
17
+ default:
18
+ unreachable();
19
+ }
20
+ }
21
+ export function fromAttribute(value, type) {
22
+ switch (type) {
23
+ case Number: {
24
+ const num = value === null ? undefined : Number(value);
25
+ if (num !== undefined && Number.isNaN(num)) {
26
+ throw new TypeError(`numeric attribute value ${JSON.stringify(value)} parsed as NaN`);
27
+ }
28
+ return num;
29
+ }
30
+ case Boolean:
31
+ return value !== null;
32
+ case String:
33
+ return value ?? undefined;
34
+ default:
35
+ unreachable();
36
+ }
37
+ }
38
+ export function detectAttributeType(value) {
39
+ switch (typeof value) {
40
+ case "string":
41
+ return String;
42
+ case "number":
43
+ return Number;
44
+ case "boolean":
45
+ return Boolean;
46
+ default:
47
+ return undefined;
48
+ }
49
+ }
50
+ function toKebabCase(s) {
51
+ return s.replace(/((?<=[a-z\d])[A-Z]|(?<=[A-Z\d])[A-Z](?=[a-z]))/g, "-$1").toLowerCase();
52
+ }
53
+ export function attribute(valueOrOptions, context) {
54
+ if (context !== undefined) {
55
+ return attribute({})(valueOrOptions, context);
56
+ }
57
+ return (value, context) => {
58
+ if (typeof context.name !== "string") {
59
+ throw new TypeError(`Can't declare a ${typeof context.name} as an attribute (${JSON.stringify(context.name)})`);
60
+ }
61
+ const options = {
62
+ ...{
63
+ type: String,
64
+ property: context.name,
65
+ reactive: true,
66
+ reflect: true,
67
+ },
68
+ ...(valueOrOptions ?? {}),
69
+ };
70
+ let attrs = context.metadata[attributeConfig];
71
+ if (attrs === undefined) {
72
+ context.metadata[attributeConfig] = attrs = new Map();
73
+ }
74
+ const key = options.name ?? toKebabCase(context.name);
75
+ attrs.set(key, options);
76
+ if (options.reactive) {
77
+ const getSig = (obj) => signalForObject(obj, context.name, () => Signal(value.get.call(obj), {
78
+ equals: Object.is,
79
+ }));
80
+ return {
81
+ get() {
82
+ return getSig(this).get();
83
+ },
84
+ set(newValue) {
85
+ options.type ??= detectAttributeType(newValue);
86
+ getSig(this).set(newValue);
87
+ if (options.reflect) {
88
+ this.syncAttribute(key);
89
+ }
90
+ },
91
+ init(newValue) {
92
+ options.type ??= detectAttributeType(newValue);
93
+ return newValue;
94
+ },
95
+ };
96
+ }
97
+ return {
98
+ get() {
99
+ return value.get.call(this);
100
+ },
101
+ set(newValue) {
102
+ options.type ??= detectAttributeType(newValue);
103
+ value.set.call(this, newValue);
104
+ if (options.reflect) {
105
+ this.syncAttribute(key);
106
+ }
107
+ },
108
+ init(newValue) {
109
+ options.type ??= detectAttributeType(newValue);
110
+ return newValue;
111
+ },
112
+ };
113
+ };
114
+ }
115
+ //# sourceMappingURL=attribute.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"attribute.js","sourceRoot":"","sources":["../../src/decorators/attribute.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,148 @@
1
+ var __esDecorate = (this && this.__esDecorate) || function (ctor, descriptorIn, decorators, contextIn, initializers, extraInitializers) {
2
+ function accept(f) { if (f !== void 0 && typeof f !== "function") throw new TypeError("Function expected"); return f; }
3
+ var kind = contextIn.kind, key = kind === "getter" ? "get" : kind === "setter" ? "set" : "value";
4
+ var target = !descriptorIn && ctor ? contextIn["static"] ? ctor : ctor.prototype : null;
5
+ var descriptor = descriptorIn || (target ? Object.getOwnPropertyDescriptor(target, contextIn.name) : {});
6
+ var _, done = false;
7
+ for (var i = decorators.length - 1; i >= 0; i--) {
8
+ var context = {};
9
+ for (var p in contextIn) context[p] = p === "access" ? {} : contextIn[p];
10
+ for (var p in contextIn.access) context.access[p] = contextIn.access[p];
11
+ context.addInitializer = function (f) { if (done) throw new TypeError("Cannot add initializers after decoration has completed"); extraInitializers.push(accept(f || null)); };
12
+ var result = (0, decorators[i])(kind === "accessor" ? { get: descriptor.get, set: descriptor.set } : descriptor[key], context);
13
+ if (kind === "accessor") {
14
+ if (result === void 0) continue;
15
+ if (result === null || typeof result !== "object") throw new TypeError("Object expected");
16
+ if (_ = accept(result.get)) descriptor.get = _;
17
+ if (_ = accept(result.set)) descriptor.set = _;
18
+ if (_ = accept(result.init)) initializers.unshift(_);
19
+ }
20
+ else if (_ = accept(result)) {
21
+ if (kind === "field") initializers.unshift(_);
22
+ else descriptor[key] = _;
23
+ }
24
+ }
25
+ if (target) Object.defineProperty(target, contextIn.name, descriptor);
26
+ done = true;
27
+ };
28
+ var __runInitializers = (this && this.__runInitializers) || function (thisArg, initializers, value) {
29
+ var useValue = arguments.length > 2;
30
+ for (var i = 0; i < initializers.length; i++) {
31
+ value = useValue ? initializers[i].call(thisArg, value) : initializers[i].call(thisArg);
32
+ }
33
+ return useValue ? value : void 0;
34
+ };
35
+ import { customElement } from "lit/decorators.js";
36
+ import { expect, test } from "vitest";
37
+ import { attribute, Component } from "../component";
38
+ import { Signal } from "@bodil/signal";
39
+ test("@attribute", async () => {
40
+ let AttributeTestClass = (() => {
41
+ let _classDecorators = [customElement("attribute-test-class")];
42
+ let _classDescriptor;
43
+ let _classExtraInitializers = [];
44
+ let _classThis;
45
+ let _classSuper = Component;
46
+ let _wibble_decorators;
47
+ let _wibble_initializers = [];
48
+ let _wibble_extraInitializers = [];
49
+ let _wobble_decorators;
50
+ let _wobble_initializers = [];
51
+ let _wobble_extraInitializers = [];
52
+ let _noMeansNo_decorators;
53
+ let _noMeansNo_initializers = [];
54
+ let _noMeansNo_extraInitializers = [];
55
+ let _welp_decorators;
56
+ let _welp_initializers = [];
57
+ let _welp_extraInitializers = [];
58
+ let _hide_decorators;
59
+ let _hide_initializers = [];
60
+ let _hide_extraInitializers = [];
61
+ var AttributeTestClass = class extends _classSuper {
62
+ static { _classThis = this; }
63
+ static {
64
+ const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(_classSuper[Symbol.metadata] ?? null) : void 0;
65
+ _wibble_decorators = [attribute];
66
+ _wobble_decorators = [attribute({ type: Number })];
67
+ _noMeansNo_decorators = [attribute({ type: Boolean })];
68
+ _welp_decorators = [attribute({ name: "wolp", reactive: false })];
69
+ _hide_decorators = [attribute({ reflect: false })];
70
+ __esDecorate(this, null, _wibble_decorators, { kind: "accessor", name: "wibble", static: false, private: false, access: { has: obj => "wibble" in obj, get: obj => obj.wibble, set: (obj, value) => { obj.wibble = value; } }, metadata: _metadata }, _wibble_initializers, _wibble_extraInitializers);
71
+ __esDecorate(this, null, _wobble_decorators, { kind: "accessor", name: "wobble", static: false, private: false, access: { has: obj => "wobble" in obj, get: obj => obj.wobble, set: (obj, value) => { obj.wobble = value; } }, metadata: _metadata }, _wobble_initializers, _wobble_extraInitializers);
72
+ __esDecorate(this, null, _noMeansNo_decorators, { kind: "accessor", name: "noMeansNo", static: false, private: false, access: { has: obj => "noMeansNo" in obj, get: obj => obj.noMeansNo, set: (obj, value) => { obj.noMeansNo = value; } }, metadata: _metadata }, _noMeansNo_initializers, _noMeansNo_extraInitializers);
73
+ __esDecorate(this, null, _welp_decorators, { kind: "accessor", name: "welp", static: false, private: false, access: { has: obj => "welp" in obj, get: obj => obj.welp, set: (obj, value) => { obj.welp = value; } }, metadata: _metadata }, _welp_initializers, _welp_extraInitializers);
74
+ __esDecorate(this, null, _hide_decorators, { kind: "accessor", name: "hide", static: false, private: false, access: { has: obj => "hide" in obj, get: obj => obj.hide, set: (obj, value) => { obj.hide = value; } }, metadata: _metadata }, _hide_initializers, _hide_extraInitializers);
75
+ __esDecorate(null, _classDescriptor = { value: _classThis }, _classDecorators, { kind: "class", name: _classThis.name, metadata: _metadata }, null, _classExtraInitializers);
76
+ AttributeTestClass = _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
+ accessor wibble = __runInitializers(this, _wibble_initializers, "Joe");
81
+ accessor wobble = (__runInitializers(this, _wibble_extraInitializers), __runInitializers(this, _wobble_initializers, 1));
82
+ accessor noMeansNo = (__runInitializers(this, _wobble_extraInitializers), __runInitializers(this, _noMeansNo_initializers, false));
83
+ accessor welp = (__runInitializers(this, _noMeansNo_extraInitializers), __runInitializers(this, _welp_initializers, "Joe"));
84
+ accessor hide = (__runInitializers(this, _welp_extraInitializers), __runInitializers(this, _hide_initializers, "no"));
85
+ constructor() {
86
+ super(...arguments);
87
+ __runInitializers(this, _hide_extraInitializers);
88
+ }
89
+ };
90
+ return AttributeTestClass = _classThis;
91
+ })();
92
+ const t = document.createElement("attribute-test-class");
93
+ document.body.append(t);
94
+ await t.updateComplete;
95
+ const wibble = Signal.computed(() => t.wibble);
96
+ expect(t.wibble).toBe("Joe");
97
+ expect(t.getAttribute("wibble")).toBe("Joe");
98
+ expect(wibble.get()).toBe("Joe");
99
+ t.wibble = "Mike";
100
+ expect(t.wibble).toBe("Mike");
101
+ expect(t.getAttribute("wibble")).toBe("Mike");
102
+ expect(wibble.get()).toBe("Mike");
103
+ t.removeAttribute("wibble");
104
+ expect(t.wibble).toBeUndefined();
105
+ expect(t.getAttribute("wibble")).toBeNull();
106
+ expect(wibble.get()).toBe(undefined);
107
+ t.setAttribute("wibble", "Robert");
108
+ expect(t.wibble).toBe("Robert");
109
+ expect(t.getAttribute("wibble")).toBe("Robert");
110
+ expect(wibble.get()).toBe("Robert");
111
+ t.wibble = undefined;
112
+ expect(t.wibble).toBeUndefined();
113
+ expect(t.getAttribute("wibble")).toBeNull();
114
+ expect(wibble.get()).toBe(undefined);
115
+ expect(t.wobble).toBe(1);
116
+ expect(t.getAttribute("wobble")).toBe("1");
117
+ t.wobble = 2;
118
+ expect(t.wobble).toBe(2);
119
+ expect(t.getAttribute("wobble")).toBe("2");
120
+ t.setAttribute("wobble", "3");
121
+ expect(t.wobble).toBe(3);
122
+ expect(t.getAttribute("wobble")).toBe("3");
123
+ expect(t.noMeansNo).toBe(false);
124
+ expect(t.getAttribute("no-means-no")).toBeNull();
125
+ t.noMeansNo = true;
126
+ expect(t.noMeansNo).toBe(true);
127
+ expect(t.getAttribute("no-means-no")).toBe("");
128
+ t.removeAttribute("no-means-no");
129
+ expect(t.noMeansNo).toBe(false);
130
+ expect(t.getAttribute("no-means-no")).toBeNull();
131
+ t.setAttribute("no-means-no", "come and see the violence inherent in the system!");
132
+ expect(t.noMeansNo).toBe(true);
133
+ expect(t.getAttribute("no-means-no")).toBe("");
134
+ const welp = Signal.computed(() => t.welp);
135
+ expect(t.welp).toBe("Joe");
136
+ expect(t.getAttribute("wolp")).toBe("Joe");
137
+ expect(welp.get()).toBe("Joe");
138
+ t.welp = "Robert";
139
+ expect(t.welp).toBe("Robert");
140
+ expect(t.getAttribute("wolp")).toBe("Robert");
141
+ expect(welp.get()).toBe("Joe");
142
+ expect(t.hide).toBe("no");
143
+ expect(t.getAttribute("hide")).toBeNull();
144
+ t.setAttribute("hide", "yes");
145
+ expect(t.hide).toBe("yes");
146
+ expect(t.getAttribute("hide")).toBe("yes");
147
+ });
148
+ //# sourceMappingURL=attribute.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"attribute.test.js","sourceRoot":"","sources":["../../src/decorators/attribute.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ import type { Disposifiable } from "@bodil/core/disposable";
2
+ import type { Component } from "../component";
3
+ export type ConnectFunctionReturnValue = Disposifiable | Iterable<Disposifiable | undefined> | undefined | void;
4
+ export type ConnectFunction = () => ConnectFunctionReturnValue;
5
+ export declare function connectedJobs(obj: Component): Iterable<ConnectFunction>;
6
+ export declare function connect<C extends Component>(value: ConnectFunction, context: ClassMethodDecoratorContext<C, ConnectFunction>): undefined;
7
+ export declare function connect<C extends Component>(value: undefined, context: ClassFieldDecoratorContext<C, ConnectFunction>): (value: ConnectFunction) => ConnectFunction;
8
+ export declare function connectEffect<C extends Component>(value: ConnectFunction, context: ClassMethodDecoratorContext<C, ConnectFunction>): undefined;
9
+ export declare function connectEffect<C extends Component>(value: undefined, context: ClassFieldDecoratorContext<C, ConnectFunction>): (value: ConnectFunction) => ConnectFunction;
@@ -0,0 +1,44 @@
1
+ import { Signal } from "@bodil/signal";
2
+ const connectedCache = new WeakMap();
3
+ function addConnectedJob(obj, job) {
4
+ let jobs = connectedCache.get(obj);
5
+ if (jobs === undefined) {
6
+ jobs = new Set();
7
+ connectedCache.set(obj, jobs);
8
+ }
9
+ jobs.add(job);
10
+ }
11
+ export function connectedJobs(obj) {
12
+ return connectedCache.get(obj) ?? [];
13
+ }
14
+ export function connect(value, context) {
15
+ switch (context.kind) {
16
+ case "method":
17
+ context.addInitializer(function () {
18
+ addConnectedJob(this, value.bind(this));
19
+ });
20
+ return;
21
+ case "field":
22
+ return function (value) {
23
+ addConnectedJob(this, value.bind(this));
24
+ };
25
+ }
26
+ }
27
+ export function connectEffect(value, context) {
28
+ switch (context.kind) {
29
+ case "method":
30
+ context.addInitializer(function () {
31
+ addConnectedJob(this, function () {
32
+ return Signal.effect(value.bind(this));
33
+ });
34
+ });
35
+ return;
36
+ case "field":
37
+ return function (value) {
38
+ addConnectedJob(this, function () {
39
+ return Signal.effect(value.bind(this));
40
+ });
41
+ };
42
+ }
43
+ }
44
+ //# sourceMappingURL=connect.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"connect.js","sourceRoot":"","sources":["../../src/decorators/connect.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AAYvC,MAAM,cAAc,GAAG,IAAI,OAAO,EAAmC,CAAC;AAEtE,SAAS,eAAe,CAAC,GAAc,EAAE,GAAoB;IACzD,IAAI,IAAI,GAAG,cAAc,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IACnC,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;QACrB,IAAI,GAAG,IAAI,GAAG,EAAE,CAAC;QACjB,cAAc,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;IAClC,CAAC;IACD,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;AAClB,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,GAAc;IACxC,OAAO,cAAc,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC;AACzC,CAAC;AAUD,MAAM,UAAU,OAAO,CACnB,KAAkC,EAClC,OAEoD;IAEpD,QAAQ,OAAO,CAAC,IAAI,EAAE,CAAC;QACnB,KAAK,QAAQ;YACT,OAAO,CAAC,cAAc,CAAC;gBACnB,eAAe,CAAC,IAAI,EAAE,KAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;YAC7C,CAAC,CAAC,CAAC;YACH,OAAO;QACX,KAAK,OAAO;YACR,OAAO,UAAmB,KAAsB;gBAC5C,eAAe,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;YAC5C,CAAC,CAAC;IACV,CAAC;AACL,CAAC;AAUD,MAAM,UAAU,aAAa,CACzB,KAAkC,EAClC,OAEoD;IAEpD,QAAQ,OAAO,CAAC,IAAI,EAAE,CAAC;QACnB,KAAK,QAAQ;YACT,OAAO,CAAC,cAAc,CAAC;gBACnB,eAAe,CAAC,IAAI,EAAE;oBAClB,OAAO,MAAM,CAAC,MAAM,CAAC,KAAM,CAAC,IAAI,CAAC,IAAI,CAAQ,CAAC,CAAC;gBACnD,CAAC,CAAC,CAAC;YACP,CAAC,CAAC,CAAC;YACH,OAAO;QACX,KAAK,OAAO;YACR,OAAO,UAAmB,KAAsB;gBAC5C,eAAe,CAAC,IAAI,EAAE;oBAClB,OAAO,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAQ,CAAC,CAAC;gBAClD,CAAC,CAAC,CAAC;YACP,CAAC,CAAC;IACV,CAAC;AACL,CAAC"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,196 @@
1
+ var __runInitializers = (this && this.__runInitializers) || function (thisArg, initializers, value) {
2
+ var useValue = arguments.length > 2;
3
+ for (var i = 0; i < initializers.length; i++) {
4
+ value = useValue ? initializers[i].call(thisArg, value) : initializers[i].call(thisArg);
5
+ }
6
+ return useValue ? value : void 0;
7
+ };
8
+ var __esDecorate = (this && this.__esDecorate) || function (ctor, descriptorIn, decorators, contextIn, initializers, extraInitializers) {
9
+ function accept(f) { if (f !== void 0 && typeof f !== "function") throw new TypeError("Function expected"); return f; }
10
+ var kind = contextIn.kind, key = kind === "getter" ? "get" : kind === "setter" ? "set" : "value";
11
+ var target = !descriptorIn && ctor ? contextIn["static"] ? ctor : ctor.prototype : null;
12
+ var descriptor = descriptorIn || (target ? Object.getOwnPropertyDescriptor(target, contextIn.name) : {});
13
+ var _, done = false;
14
+ for (var i = decorators.length - 1; i >= 0; i--) {
15
+ var context = {};
16
+ for (var p in contextIn) context[p] = p === "access" ? {} : contextIn[p];
17
+ for (var p in contextIn.access) context.access[p] = contextIn.access[p];
18
+ context.addInitializer = function (f) { if (done) throw new TypeError("Cannot add initializers after decoration has completed"); extraInitializers.push(accept(f || null)); };
19
+ var result = (0, decorators[i])(kind === "accessor" ? { get: descriptor.get, set: descriptor.set } : descriptor[key], context);
20
+ if (kind === "accessor") {
21
+ if (result === void 0) continue;
22
+ if (result === null || typeof result !== "object") throw new TypeError("Object expected");
23
+ if (_ = accept(result.get)) descriptor.get = _;
24
+ if (_ = accept(result.set)) descriptor.set = _;
25
+ if (_ = accept(result.init)) initializers.unshift(_);
26
+ }
27
+ else if (_ = accept(result)) {
28
+ if (kind === "field") initializers.unshift(_);
29
+ else descriptor[key] = _;
30
+ }
31
+ }
32
+ if (target) Object.defineProperty(target, contextIn.name, descriptor);
33
+ done = true;
34
+ };
35
+ import { sleep } from "@bodil/core/async";
36
+ import { Signal } from "@bodil/signal";
37
+ import { customElement } from "lit/decorators.js";
38
+ import { expect, test } from "vitest";
39
+ import { Component, connect, connectEffect } from "../component";
40
+ test("@connect", () => {
41
+ let methodConnected = 0, methodDisconnected = 0;
42
+ let fieldConnected = 0, fieldDisconnected = 0;
43
+ let ConnectedTestClass = (() => {
44
+ let _classDecorators = [customElement("connected-test-class")];
45
+ let _classDescriptor;
46
+ let _classExtraInitializers = [];
47
+ let _classThis;
48
+ let _classSuper = Component;
49
+ let _instanceExtraInitializers = [];
50
+ let _onConnected_decorators;
51
+ let _field_decorators;
52
+ let _field_initializers = [];
53
+ let _field_extraInitializers = [];
54
+ var ConnectedTestClass = class extends _classSuper {
55
+ static { _classThis = this; }
56
+ static {
57
+ const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(_classSuper[Symbol.metadata] ?? null) : void 0;
58
+ _onConnected_decorators = [connect];
59
+ _field_decorators = [connect];
60
+ __esDecorate(this, null, _onConnected_decorators, { kind: "method", name: "onConnected", static: false, private: false, access: { has: obj => "onConnected" in obj, get: obj => obj.onConnected }, metadata: _metadata }, null, _instanceExtraInitializers);
61
+ __esDecorate(null, null, _field_decorators, { kind: "field", name: "field", static: false, private: false, access: { has: obj => "field" in obj, get: obj => obj.field, set: (obj, value) => { obj.field = value; } }, metadata: _metadata }, _field_initializers, _field_extraInitializers);
62
+ __esDecorate(null, _classDescriptor = { value: _classThis }, _classDecorators, { kind: "class", name: _classThis.name, metadata: _metadata }, null, _classExtraInitializers);
63
+ ConnectedTestClass = _classThis = _classDescriptor.value;
64
+ if (_metadata) Object.defineProperty(_classThis, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
65
+ __runInitializers(_classThis, _classExtraInitializers);
66
+ }
67
+ onConnected() {
68
+ methodConnected++;
69
+ return () => {
70
+ methodDisconnected++;
71
+ };
72
+ }
73
+ constructor() {
74
+ super(...arguments);
75
+ this.field = (__runInitializers(this, _instanceExtraInitializers), __runInitializers(this, _field_initializers, () => {
76
+ fieldConnected++;
77
+ return () => {
78
+ fieldDisconnected++;
79
+ };
80
+ }));
81
+ __runInitializers(this, _field_extraInitializers);
82
+ }
83
+ };
84
+ return ConnectedTestClass = _classThis;
85
+ })();
86
+ const c = document.createElement("connected-test-class");
87
+ expect(methodConnected).toBe(0);
88
+ expect(methodDisconnected).toBe(0);
89
+ expect(fieldConnected).toEqual(methodConnected);
90
+ expect(fieldDisconnected).toEqual(methodDisconnected);
91
+ document.body.append(c);
92
+ expect(methodConnected).toBe(1);
93
+ expect(methodDisconnected).toBe(0);
94
+ expect(fieldConnected).toEqual(methodConnected);
95
+ expect(fieldDisconnected).toEqual(methodDisconnected);
96
+ c.remove();
97
+ expect(methodConnected).toBe(1);
98
+ expect(methodDisconnected).toBe(1);
99
+ expect(fieldConnected).toEqual(methodConnected);
100
+ expect(fieldDisconnected).toEqual(methodDisconnected);
101
+ document.body.append(c);
102
+ expect(methodConnected).toBe(2);
103
+ expect(methodDisconnected).toBe(1);
104
+ expect(fieldConnected).toEqual(methodConnected);
105
+ expect(fieldDisconnected).toEqual(methodDisconnected);
106
+ c.remove();
107
+ expect(methodConnected).toBe(2);
108
+ expect(methodDisconnected).toBe(2);
109
+ expect(fieldConnected).toEqual(methodConnected);
110
+ expect(fieldDisconnected).toEqual(methodDisconnected);
111
+ });
112
+ test("@connectEffect", async () => {
113
+ let methodRun = 0, methodDisposed = 0;
114
+ let fieldRun = 0, fieldDisposed = 0;
115
+ const signal = Signal(1);
116
+ let ConnectEffectTestClass = (() => {
117
+ let _classDecorators = [customElement("connect-effect-test-class")];
118
+ let _classDescriptor;
119
+ let _classExtraInitializers = [];
120
+ let _classThis;
121
+ let _classSuper = Component;
122
+ let _instanceExtraInitializers = [];
123
+ let _onConnected_decorators;
124
+ let _field_decorators;
125
+ let _field_initializers = [];
126
+ let _field_extraInitializers = [];
127
+ var ConnectEffectTestClass = class extends _classSuper {
128
+ static { _classThis = this; }
129
+ static {
130
+ const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(_classSuper[Symbol.metadata] ?? null) : void 0;
131
+ _onConnected_decorators = [connectEffect];
132
+ _field_decorators = [connectEffect];
133
+ __esDecorate(this, null, _onConnected_decorators, { kind: "method", name: "onConnected", static: false, private: false, access: { has: obj => "onConnected" in obj, get: obj => obj.onConnected }, metadata: _metadata }, null, _instanceExtraInitializers);
134
+ __esDecorate(null, null, _field_decorators, { kind: "field", name: "field", static: false, private: false, access: { has: obj => "field" in obj, get: obj => obj.field, set: (obj, value) => { obj.field = value; } }, metadata: _metadata }, _field_initializers, _field_extraInitializers);
135
+ __esDecorate(null, _classDescriptor = { value: _classThis }, _classDecorators, { kind: "class", name: _classThis.name, metadata: _metadata }, null, _classExtraInitializers);
136
+ ConnectEffectTestClass = _classThis = _classDescriptor.value;
137
+ if (_metadata) Object.defineProperty(_classThis, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
138
+ __runInitializers(_classThis, _classExtraInitializers);
139
+ }
140
+ onConnected() {
141
+ methodRun += signal.get();
142
+ return () => {
143
+ methodDisposed++;
144
+ };
145
+ }
146
+ constructor() {
147
+ super(...arguments);
148
+ this.field = (__runInitializers(this, _instanceExtraInitializers), __runInitializers(this, _field_initializers, () => {
149
+ fieldRun += signal.get();
150
+ return () => {
151
+ fieldDisposed++;
152
+ };
153
+ }));
154
+ __runInitializers(this, _field_extraInitializers);
155
+ }
156
+ };
157
+ return ConnectEffectTestClass = _classThis;
158
+ })();
159
+ const c = document.createElement("connect-effect-test-class");
160
+ expect(methodRun).toBe(0);
161
+ expect(methodDisposed).toBe(0);
162
+ expect(fieldRun).toEqual(methodRun);
163
+ expect(fieldDisposed).toEqual(methodDisposed);
164
+ document.body.append(c);
165
+ await c.updateComplete;
166
+ expect(methodRun).toBe(1);
167
+ expect(methodDisposed).toBe(0);
168
+ expect(fieldRun).toEqual(methodRun);
169
+ expect(fieldDisposed).toEqual(methodDisposed);
170
+ c.remove();
171
+ expect(methodRun).toBe(1);
172
+ expect(methodDisposed).toBe(1);
173
+ expect(fieldRun).toEqual(methodRun);
174
+ expect(fieldDisposed).toEqual(methodDisposed);
175
+ document.body.append(c);
176
+ expect(methodRun).toBe(2);
177
+ expect(methodDisposed).toBe(1);
178
+ expect(fieldRun).toEqual(methodRun);
179
+ expect(fieldDisposed).toEqual(methodDisposed);
180
+ signal.set(2);
181
+ // wait for the effect to run
182
+ await sleep(1);
183
+ // run should be bumped by 2, the new value of the signal, and
184
+ // disposed should be bumped by 1 because the previous effect is
185
+ // disposed.
186
+ expect(methodRun).toBe(4);
187
+ expect(methodDisposed).toBe(2);
188
+ expect(fieldRun).toEqual(methodRun);
189
+ expect(fieldDisposed).toEqual(methodDisposed);
190
+ c.remove();
191
+ expect(methodRun).toBe(4);
192
+ expect(methodDisposed).toBe(3);
193
+ expect(fieldRun).toEqual(methodRun);
194
+ expect(fieldDisposed).toEqual(methodDisposed);
195
+ });
196
+ //# sourceMappingURL=connect.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"connect.test.js","sourceRoot":"","sources":["../../src/decorators/connect.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ import { Signal } from "@bodil/signal";
2
+ import type { Component } from "../component";
3
+ export declare const reactiveFields: unique symbol;
4
+ export declare function signalForObject(obj: object, key: string | symbol, createSignal: () => Signal<unknown>): Signal<unknown>;
5
+ export declare function reactive<C extends object, T>(value: ClassAccessorDecoratorTarget<C, T>, context: ClassAccessorDecoratorContext<C, T>): ClassAccessorDecoratorResult<C, T>;
6
+ export declare function reactive<C extends object, T>(value: () => T, context: ClassGetterDecoratorContext<C, T>): () => T;
7
+ export declare function reactive<C extends Component, T>(value: undefined, context: ClassFieldDecoratorContext<C, T>): undefined;
@@ -0,0 +1,45 @@
1
+ import { Signal } from "@bodil/signal";
2
+ export const reactiveFields = Symbol("reactiveFields");
3
+ const signalCache = new WeakMap();
4
+ export function signalForObject(obj, key, createSignal) {
5
+ let sigs = signalCache.get(obj);
6
+ if (sigs === undefined) {
7
+ sigs = {};
8
+ signalCache.set(obj, sigs);
9
+ }
10
+ if (Object.hasOwn(sigs, key)) {
11
+ return sigs[key];
12
+ }
13
+ const sig = createSignal();
14
+ sigs[key] = sig;
15
+ return sig;
16
+ }
17
+ export function reactive(value, context) {
18
+ switch (context.kind) {
19
+ case "accessor": {
20
+ const getSig = (obj) => signalForObject(obj, context.name, () => Signal(value.get.call(obj), {
21
+ equals: Object.is,
22
+ }));
23
+ return {
24
+ get() {
25
+ return getSig(this).get();
26
+ },
27
+ set(value) {
28
+ getSig(this).set(value);
29
+ },
30
+ };
31
+ }
32
+ case "getter": {
33
+ const getSig = (obj) => signalForObject(obj, context.name, () => Signal.computed(() => value.call(obj), { equals: Object.is }));
34
+ return function get() {
35
+ return getSig(this).get();
36
+ };
37
+ }
38
+ case "field": {
39
+ context.metadata[reactiveFields] ??= new Set();
40
+ context.metadata[reactiveFields].add(context.name);
41
+ return undefined;
42
+ }
43
+ }
44
+ }
45
+ //# sourceMappingURL=reactive.js.map