@bodil/dom 0.1.0 → 0.1.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/component.d.ts +2 -2
- package/dist/component.js +22 -32
- package/dist/component.js.map +1 -1
- package/dist/decorators/attribute.d.ts +34 -12
- package/dist/decorators/attribute.js +67 -44
- package/dist/decorators/attribute.js.map +1 -1
- package/dist/decorators/attribute.test.js +117 -0
- package/dist/decorators/attribute.test.js.map +1 -1
- package/dist/decorators/reactive.d.ts +2 -1
- package/dist/decorators/reactive.js.map +1 -1
- package/dist/decorators/types.d.ts +7 -0
- package/dist/decorators/types.js +2 -0
- package/dist/decorators/types.js.map +1 -0
- package/package.json +1 -1
- package/src/component.ts +29 -49
- package/src/decorators/attribute.test.ts +76 -0
- package/src/decorators/attribute.ts +198 -84
- package/src/decorators/reactive.ts +4 -3
- package/src/decorators/types.ts +20 -0
package/dist/component.d.ts
CHANGED
|
@@ -6,7 +6,7 @@ import { type AttributeConfig } from "./decorators/attribute";
|
|
|
6
6
|
import { EmitterElement } from "./emitter";
|
|
7
7
|
import { type QuerySlotOptions } from "./slot";
|
|
8
8
|
export type { ReactiveController, ReactiveControllerHost } from "lit";
|
|
9
|
-
export { attribute, type AttributeOptions } from "./decorators/attribute";
|
|
9
|
+
export { attribute, attributeGetter, attributeSetter, type AttributeOptions, type AttributeGetterSetterOptions, } from "./decorators/attribute";
|
|
10
10
|
export { connect, connectEffect, type ConnectFunction, type ConnectFunctionReturnValue, } from "./decorators/connect";
|
|
11
11
|
export { reactive } from "./decorators/reactive";
|
|
12
12
|
export { require } from "./decorators/require";
|
|
@@ -53,8 +53,8 @@ export declare abstract class Component extends EmitterElement implements Reacti
|
|
|
53
53
|
constructor();
|
|
54
54
|
protected connectedCallback(): void;
|
|
55
55
|
protected disconnectedCallback(): void;
|
|
56
|
+
setAttributeQuietly(name: string, value: string | null): void;
|
|
56
57
|
protected attributeChangedCallback(name: string, old: string | null, valueString: string | null): void;
|
|
57
|
-
private syncAttribute;
|
|
58
58
|
$signal<K extends keyof this & string, V extends this[K]>(prop: K): Signal<V>;
|
|
59
59
|
addController(controller: ReactiveController): void;
|
|
60
60
|
removeController(controller: ReactiveController): void;
|
package/dist/component.js
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
var _a;
|
|
2
|
-
import {
|
|
2
|
+
import { isIterable, isNullish } from "@bodil/core/assert";
|
|
3
3
|
import { DisposableContext, toDisposable } from "@bodil/core/disposable";
|
|
4
4
|
import { Signal } from "@bodil/signal";
|
|
5
5
|
import { adoptStyles, getCompatibleStyle, nothing, render, unsafeCSS, } from "lit";
|
|
6
|
-
import { attributeConfig,
|
|
6
|
+
import { attributeConfig, fromAttribute } from "./decorators/attribute";
|
|
7
7
|
import { connectedJobs } from "./decorators/connect";
|
|
8
8
|
import { reactiveFields, signalForObject } from "./decorators/reactive";
|
|
9
9
|
import { requiredProperties } from "./decorators/require";
|
|
@@ -12,7 +12,7 @@ import { EmitterElement } from "./emitter";
|
|
|
12
12
|
import { eventListener } from "./event";
|
|
13
13
|
import { scheduler } from "./scheduler";
|
|
14
14
|
import { findSlot, getOrSetQuery, getOrSetSignal, SlotChangeController, } from "./slot";
|
|
15
|
-
export { attribute } from "./decorators/attribute";
|
|
15
|
+
export { attribute, attributeGetter, attributeSetter, } from "./decorators/attribute";
|
|
16
16
|
export { connect, connectEffect, } from "./decorators/connect";
|
|
17
17
|
export { reactive } from "./decorators/reactive";
|
|
18
18
|
export { require } from "./decorators/require";
|
|
@@ -46,6 +46,7 @@ export class Component extends EmitterElement {
|
|
|
46
46
|
#firstUpdate;
|
|
47
47
|
#initialised;
|
|
48
48
|
#viewTransitionRequested;
|
|
49
|
+
#ignoreAttributeUpdates;
|
|
49
50
|
get isUpdatePending() {
|
|
50
51
|
return this.#isUpdatePending;
|
|
51
52
|
}
|
|
@@ -114,8 +115,10 @@ export class Component extends EmitterElement {
|
|
|
114
115
|
this.#viewTransitionRequested = false;
|
|
115
116
|
this.renderRoot = this.createRenderRoot();
|
|
116
117
|
this.#abortController = new AbortController();
|
|
118
|
+
this.#ignoreAttributeUpdates = 1;
|
|
117
119
|
// set up reactive fields, because decorators can't do this themselves
|
|
118
|
-
|
|
120
|
+
const fields = this.constructor[Symbol.metadata]?.[reactiveFields] ?? [];
|
|
121
|
+
for (const field of fields) {
|
|
119
122
|
const sig = signalForObject(this, field, () => Signal(undefined, { equals: Object.is }));
|
|
120
123
|
Object.defineProperty(this, field, {
|
|
121
124
|
get() {
|
|
@@ -132,17 +135,13 @@ export class Component extends EmitterElement {
|
|
|
132
135
|
for (const init of this.constructor.initialisers) {
|
|
133
136
|
init.call(this);
|
|
134
137
|
}
|
|
138
|
+
this.#ignoreAttributeUpdates--;
|
|
135
139
|
this.#initialised = false;
|
|
136
140
|
}
|
|
137
141
|
connectedCallback() {
|
|
138
142
|
this.#connectedContext.dispose();
|
|
139
143
|
this.#controllers.forEach((c) => c.hostConnected?.());
|
|
140
144
|
this.#rootPart?.setConnected(true);
|
|
141
|
-
for (const [key, config] of this.constructor.attributeConfig.entries()) {
|
|
142
|
-
if (config.reflect) {
|
|
143
|
-
this.syncAttribute(key, config);
|
|
144
|
-
}
|
|
145
|
-
}
|
|
146
145
|
for (const job of connectedJobs(this)) {
|
|
147
146
|
const result = job.call(this);
|
|
148
147
|
const items = isNullish(result)
|
|
@@ -176,33 +175,24 @@ export class Component extends EmitterElement {
|
|
|
176
175
|
this.#controllers.forEach((c) => c.hostDisconnected?.());
|
|
177
176
|
this.#connectedContext.dispose();
|
|
178
177
|
}
|
|
178
|
+
setAttributeQuietly(name, value) {
|
|
179
|
+
this.#ignoreAttributeUpdates++;
|
|
180
|
+
if (value === null) {
|
|
181
|
+
this.removeAttribute(name);
|
|
182
|
+
}
|
|
183
|
+
else {
|
|
184
|
+
this.setAttribute(name, value);
|
|
185
|
+
}
|
|
186
|
+
this.#ignoreAttributeUpdates--;
|
|
187
|
+
}
|
|
179
188
|
attributeChangedCallback(name, old, valueString) {
|
|
180
|
-
if (old === valueString) {
|
|
189
|
+
if (this.#ignoreAttributeUpdates > 0 || old === valueString) {
|
|
181
190
|
return;
|
|
182
191
|
}
|
|
183
192
|
const attrConfig = this.constructor.attributeConfig.get(name);
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
}
|
|
188
|
-
syncAttribute(name, config) {
|
|
189
|
-
if (this.isConnected) {
|
|
190
|
-
config ??= this.constructor.attributeConfig.get(name);
|
|
191
|
-
assert(config !== undefined);
|
|
192
|
-
if (config.reflect) {
|
|
193
|
-
const realValue = this[config.property];
|
|
194
|
-
config.type ??= detectAttributeType(realValue);
|
|
195
|
-
const value = toAttribute(realValue, present(config.type));
|
|
196
|
-
const oldValue = this.getAttribute(name);
|
|
197
|
-
if (value !== oldValue) {
|
|
198
|
-
if (value === null) {
|
|
199
|
-
this.removeAttribute(name);
|
|
200
|
-
}
|
|
201
|
-
else {
|
|
202
|
-
this.setAttribute(name, value);
|
|
203
|
-
}
|
|
204
|
-
}
|
|
205
|
-
}
|
|
193
|
+
if (attrConfig !== undefined) {
|
|
194
|
+
const value = fromAttribute(valueString, attrConfig.type);
|
|
195
|
+
this[attrConfig.property] = value;
|
|
206
196
|
}
|
|
207
197
|
}
|
|
208
198
|
$signal(prop) {
|
package/dist/component.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"component.js","sourceRoot":"","sources":["../src/component.ts"],"names":[],"mappings":";AAAA,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAC5E,OAAO,EAAE,iBAAiB,EAAE,YAAY,EAAsB,MAAM,wBAAwB,CAAC;AAC7F,OAAO,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AACvC,OAAO,EACH,WAAW,EACX,kBAAkB,EAClB,OAAO,EACP,MAAM,EACN,SAAS,GAOZ,MAAM,KAAK,CAAC;AAGb,OAAO,EACH,eAAe,EACf,mBAAmB,EACnB,aAAa,EACb,WAAW,GAEd,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxE,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AACtC,OAAO,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAC3C,OAAO,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AACxC,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EACH,QAAQ,EACR,aAAa,EACb,cAAc,EACd,oBAAoB,GAEvB,MAAM,QAAQ,CAAC;AAGhB,OAAO,EAAE,SAAS,EAAyB,MAAM,wBAAwB,CAAC;AAC1E,OAAO,EACH,OAAO,EACP,aAAa,GAGhB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AACjD,OAAO,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAC;AAI9C,MAAc,CAAC,QAAQ,KAAK,MAAM,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC;AAM3D,SAAS,UAAU,CAAI,EAAY,EAAE,EAAY;IAC7C,OAAO,EAAE,CAAC,MAAM,KAAK,EAAE,CAAC,MAAM,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;AACtF,CAAC;AAED,MAAM,SAAS,GAAG,MAAM,CAAC,WAAW,CAAC,CAAC;AAgBtC,SAAS,mBAAmB,CAAC,IAAkB;IAC3C,OAAO,kBAAkB,CAAC,OAAO,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;AACjF,CAAC;AAED,MAAM,OAAgB,SAClB,SAAQ,cAAc;aAGf,SAAI,GAAS,EAAE,AAAX,CAAY;aAEhB,sBAAiB,GAAmB,EAAE,IAAI,EAAE,MAAM,EAAE,AAAnC,CAAoC;aACrD,iBAAY,GAAG,IAAI,GAAG,EAAc,AAAxB,CAAyB;IAE5C,cAAc;aACG,oBAAe,GAAG,IAAI,GAAG,EAA2B,AAArC,CAAsC;IACtE,cAAc;aACG,kBAAa,GAA6B,EAAE,AAA/B,CAAgC;IAC9D,cAAc;aACG,uBAAkB,GAAG,IAAI,GAAG,EAAmB,AAA7B,CAA8B;aAClD,QAAW,GAAG,IAAI,AAAP,CAAQ;IAKzB,YAAY,CAAiC;IAC7C,iBAAiB,CAA2B;IACrD,gBAAgB,CAAS;IACzB,aAAa,CAAyB;IAC7B,oBAAoB,CAAyD;IACtF,aAAa,CAAoC;IACxC,WAAW,CAAiC;IACrD,SAAS,CAAY;IACrB,YAAY,CAAS;IACrB,YAAY,CAAS;IACrB,wBAAwB,CAAS;IAIjC,IAAI,eAAe;QACf,OAAO,IAAI,CAAC,gBAAgB,CAAC;IACjC,CAAC;IACD,IAAI,cAAc;QACd,OAAO,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC;IACtC,CAAC;IACD,IAAI,aAAa;QACb,OAAO,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC;IACpC,CAAC;IAED,gBAAgB,CAAyB;IACzC,IAAI,WAAW;QACX,OAAO,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC;IACxC,CAAC;IAED,MAAM,CAAC,cAAc,CAAC,IAAgB;QAClC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,cAAc,CAAC,EAAE,CAAC;YACvC,IAAI,CAAC,YAAY,GAAG,IAAI,GAAG,EAAE,CAAC;QAClC,CAAC;QACD,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAChC,CAAC;IAED,MAAM,KAAK,kBAAkB;QACzB,IAAI,CAAC,QAAQ,EAAE,CAAC;QAChB,OAAO,IAAI,CAAC,eAAe,CAAC,IAAI,EAAE,CAAC,OAAO,EAAE,CAAC;IACjD,CAAC;IAEO,MAAM,CAAC,QAAQ;QACnB,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,SAAS,CAAC,EAAE,CAAC;YAClC,IAAI,CAAC,SAAS,CAAC,GAAG,IAAI,CAAC;YACvB,MAAM,MAAM,GAAG,MAAM,CAAC,cAAc,CAAC,IAAI,CAAqB,CAAC;YAC/D,MAAM,CAAC,QAAQ,EAAE,CAAC;YAElB,IAAI,CAAC,eAAe,GAAG,IAAI,GAAG,CAAC;gBAC3B,GAAG,MAAM,CAAC,eAAe;gBACzB,GAAG,CAAE,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC,eAAe,CAAkC;oBAC1E,EAAE,CAAC;aACV,CAAC,CAAC;YACH,IAAI,CAAC,kBAAkB,GAAG,IAAI,GAAG,CAAC;gBAC9B,GAAG,MAAM,CAAC,kBAAkB;gBAC5B,GAAG,CAAE,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC,kBAAkB,CAA0B,IAAI,EAAE,CAAC;aACnF,CAAC,CAAC;YACH,IAAI,CAAC,YAAY,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,MAAM,CAAC,YAAY,EAAE,GAAG,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC;YAC5E,IAAI,CAAC,aAAa,GAAG,CAAC,GAAG,MAAM,CAAC,aAAa,CAAC,CAAC;YAC/C,IAAI,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,QAAQ,CAAC,EAAE,CAAC;gBAChC,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;oBAC7B,MAAM,MAAM,GAAG,IAAI,GAAG,CACjB,IAAI,CAAC,MAAyB;yBAC1B,IAAI,CAAC,QAAQ,CAAC;yBACd,OAAO,EAAyB,CACxC,CAAC;oBACF,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;wBACzB,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,mBAAmB,CAAC,KAAK,CAAC,CAAC,CAAC;oBAC3D,CAAC;gBACL,CAAC;qBAAM,IAAI,IAAI,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;oBACnC,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC;gBAC9D,CAAC;YACL,CAAC;QACL,CAAC;IACL,CAAC;IAED;QACI,KAAK,EAAE,CAAC;QA/EZ,kBAAa,GAAkB,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;QAGrC,iBAAY,GAAG,IAAI,GAAG,EAAsB,CAAC;QAC7C,sBAAiB,GAAG,IAAI,iBAAiB,EAAE,CAAC;QACrD,qBAAgB,GAAG,KAAK,CAAC;QAEhB,yBAAoB,GAAG,IAAI,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC,CAAC;QACtF,kBAAa,GAAG,OAAO,CAAC,aAAa,EAAW,CAAC;QACxC,gBAAW,GAAG,OAAO,CAAC,aAAa,EAAQ,CAAC;QAErD,iBAAY,GAAG,KAAK,CAAC;QACrB,iBAAY,GAAG,KAAK,CAAC;QACrB,6BAAwB,GAAG,KAAK,CAAC;QAExB,eAAU,GAA6B,IAAI,CAAC,gBAAgB,EAAE,CAAC;QAYxE,qBAAgB,GAAG,IAAI,eAAe,EAAE,CAAC;QAsDrC,sEAAsE;QACtE,KAAK,MAAM,KAAK,IAAK,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC,cAAc,CAErE,IAAI,EAAE,EAAE,CAAC;YACP,MAAM,GAAG,GAAG,eAAe,CAAC,IAAI,EAAE,KAAK,EAAE,GAAG,EAAE,CAC1C,MAAM,CAAC,SAAS,EAAE,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,EAAE,CAAC,CAClB,CAAC;YAC3B,MAAM,CAAC,cAAc,CAAC,IAAI,EAAE,KAAK,EAAE;gBAC/B,GAAG;oBACC,OAAO,GAAG,CAAC,GAAG,EAAE,CAAC;gBACrB,CAAC;gBACD,GAAG,CAAC,KAAK;oBACL,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;gBACnB,CAAC;gBACD,UAAU,EAAE,IAAI;gBAChB,YAAY,EAAE,IAAI;aACrB,CAAC,CAAC;QACP,CAAC;QAED,mBAAmB;QACnB,KAAK,MAAM,IAAI,IAAK,IAAI,CAAC,WAAgC,CAAC,YAAY,EAAE,CAAC;YACrE,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACpB,CAAC;QAED,IAAI,CAAC,YAAY,GAAG,KAAK,CAAC;IAC9B,CAAC;IAES,iBAAiB;QACvB,IAAI,CAAC,iBAAiB,CAAC,OAAO,EAAE,CAAC;QACjC,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,aAAa,EAAE,EAAE,CAAC,CAAC;QACtD,IAAI,CAAC,SAAS,EAAE,YAAY,CAAC,IAAI,CAAC,CAAC;QAEnC,KAAK,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,IACpB,IAAI,CAAC,WACR,CAAC,eAAe,CAAC,OAAO,EAAE,EAAE,CAAC;YAC1B,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;gBACjB,IAAI,CAAC,aAAa,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;YACpC,CAAC;QACL,CAAC;QAED,KAAK,MAAM,GAAG,IAAI,aAAa,CAAC,IAAI,CAAC,EAAE,CAAC;YACpC,MAAM,MAAM,GAAG,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAC9B,MAAM,KAAK,GAAG,SAAS,CAAC,MAAM,CAAC;gBAC3B,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAgB,EAAE,CAAC;gBAClC,CAAC,CAAC,UAAU,CAAC,MAAM,CAAC;oBAClB,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC;oBACvB,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC;YAChC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,SAAS,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;QACpF,CAAC;QAED,IAAI,CAAC,iBAAiB,CAClB,MAAM,CAAC,MAAM,CAAC,GAAG,EAAE;YACf,IAAI,IAAI,CAAC,qBAAqB,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC;gBACrC,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC;oBACrB,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC;oBACzB,IAAI,CAAC,gBAAgB,EAAE,CAAC;gBAC5B,CAAC;gBACD,IAAI,CAAC,WAAW,EAAE,CAAC;gBACnB,IAAI,CAAC,aAAa,EAAE,CAAC;YACzB,CAAC;QACL,CAAC,CAAC,CACL,CAAC;QAEF,IAAI,CAAC,aAAa,EAAE,CAAC;IACzB,CAAC;IAES,oBAAoB;QAC1B,IAAI,IAAI,CAAC,aAAa,KAAK,SAAS,EAAE,CAAC;YACnC,IAAI,CAAC,oBAAoB,CAAC,OAAO,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;YACtD,IAAI,CAAC,aAAa,GAAG,SAAS,CAAC;QACnC,CAAC;QACD,IAAI,CAAC,gBAAgB,GAAG,KAAK,CAAC;QAC9B,IAAI,CAAC,gBAAgB,CAAC,KAAK,CACvB,IAAI,YAAY,CAAC,GAAG,IAAI,CAAC,OAAO,uBAAuB,EAAE,YAAY,CAAC,CACzE,CAAC;QACF,IAAI,CAAC,gBAAgB,GAAG,IAAI,eAAe,EAAE,CAAC;QAC9C,IAAI,CAAC,SAAS,EAAE,YAAY,CAAC,KAAK,CAAC,CAAC;QACpC,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,gBAAgB,EAAE,EAAE,CAAC,CAAC;QACzD,IAAI,CAAC,iBAAiB,CAAC,OAAO,EAAE,CAAC;IACrC,CAAC;IAES,wBAAwB,CAC9B,IAAY,EACZ,GAAkB,EAClB,WAA0B;QAE1B,IAAI,GAAG,KAAK,WAAW,EAAE,CAAC;YACtB,OAAO;QACX,CAAC;QACD,MAAM,UAAU,GAAI,IAAI,CAAC,WAAgC,CAAC,eAAe,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACpF,MAAM,CAAC,UAAU,KAAK,SAAS,CAAC,CAAC;QACjC,MAAM,KAAK,GAAG,aAAa,CACvB,WAAW,EACX,OAAO,CACH,UAAU,CAAC,IAAI,EACf,4BAA4B,IAAI,CAAC,WAAW,CAAC,IAAI,IAAI,IAAI,2DAA2D,CACvH,CACJ,CAAC;QACF,IAAI,CAAC,UAAU,CAAC,QAAsB,CAAC,GAAG,KAAY,CAAC;IAC3D,CAAC;IAEO,aAAa,CAAC,IAAY,EAAE,MAAwB;QACxD,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;YACnB,MAAM,KAAM,IAAI,CAAC,WAAgC,CAAC,eAAe,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YAC5E,MAAM,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC;YAC7B,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;gBACjB,MAAM,SAAS,GAAG,IAAI,CAAC,MAAM,CAAC,QAAsB,CAAC,CAAC;gBACtD,MAAM,CAAC,IAAI,KAAK,mBAAmB,CAAC,SAAS,CAAC,CAAC;gBAC/C,MAAM,KAAK,GAAG,WAAW,CAAC,SAAS,EAAE,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;gBAC3D,MAAM,QAAQ,GAAG,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;gBACzC,IAAI,KAAK,KAAK,QAAQ,EAAE,CAAC;oBACrB,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;wBACjB,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;oBAC/B,CAAC;yBAAM,CAAC;wBACJ,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;oBACnC,CAAC;gBACL,CAAC;YACL,CAAC;QACL,CAAC;IACL,CAAC;IAED,OAAO,CAAmD,IAAO;QAC7D,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC;QAC1B,OAAO,eAAe,CAAC,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE;YACpC,MAAM,IAAI,SAAS,CAAC,mCAAmC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACnF,CAAC,CAAc,CAAC;IACpB,CAAC;IAED,aAAa,CAAC,UAA8B;QACxC,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;QAClC,IAAI,IAAI,CAAC,UAAU,KAAK,SAAS,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;YACpD,UAAU,CAAC,aAAa,EAAE,EAAE,CAAC;QACjC,CAAC;IACL,CAAC;IAED,gBAAgB,CAAC,UAA8B;QAC3C,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;IACzC,CAAC;IAES,gBAAgB;QACtB,MAAM,UAAU,GACZ,IAAI,CAAC,UAAU;YACf,IAAI,CAAC,YAAY,CAAE,IAAI,CAAC,WAAgC,CAAC,iBAAiB,CAAC,CAAC;QAChF,WAAW,CAAC,UAAU,EAAE,CAAC,GAAI,IAAI,CAAC,WAAgC,CAAC,aAAa,CAAC,CAAC,CAAC;QACnF,IAAI,CAAC,aAAa,CAAC,YAAY,KAAK,UAAU,CAAC,UAAU,CAAC;QAC1D,OAAO,UAAU,CAAC;IACtB,CAAC;IAED,aAAa,CAAC,IAAmB;QAC7B,IAAI,IAAI,EAAE,cAAc,KAAK,IAAI,EAAE,CAAC;YAChC,IAAI,CAAC,wBAAwB,GAAG,IAAI,CAAC;QACzC,CAAC;QACD,IAAI,CAAC,IAAI,CAAC,eAAe,IAAI,IAAI,CAAC,WAAW,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;YACjE,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC;YAC7B,IAAI,CAAC,aAAa,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC;YAC7C,SAAS,CAAC,IAAI,CAAC,CAAC;QACpB,CAAC;IACL,CAAC;IAED,sBAAsB,CAA4B;IAClD,qBAAqB;QACjB,IAAI,IAAI,CAAC,sBAAsB,KAAK,SAAS,EAAE,CAAC;YAC5C,MAAM,kBAAkB,GAAI,IAAI,CAAC,WAAgC,CAAC,kBAAkB,CAAC;YACrF,IAAI,CAAC,sBAAsB,GAAG,MAAM,CAAC,QAAQ,CACzC,GAAG,EAAE;gBACD,OAAO,kBAAkB,CAAC,IAAI,KAAK,CAAC;oBAChC,CAAC,CAAC,IAAI;oBACN,CAAC,CAAC,kBAAkB;yBACb,IAAI,EAAE;yBACN,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE,CAAE,IAAY,CAAC,GAAG,CAAC,KAAK,SAAS,CAAC,CAAC;YAChE,CAAC;YACD,oEAAoE;YACpE,oDAAoD;YACpD,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,KAAK,EAAE,CAC1B,CAAC;QACN,CAAC;QACD,OAAO,IAAI,CAAC,sBAAsB,CAAC;IACvC,CAAC;IAES,KAAK,CAAC,aAAa;QACzB,IAAI,cAAc,GAAG,KAAK,CAAC;QAC3B,MAAM,SAAS,GAAG,GAAG,EAAE;YACnB,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;YACnD,IAAI,CAAC,MAAM,EAAE,CAAC;YACd,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;YACpD,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC;gBACrB,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC;gBACzB,IAAI,CAAC,YAAY,EAAE,CAAC;gBACpB,cAAc,GAAG,IAAI,CAAC;YAC1B,CAAC;YACD,IAAI,CAAC,OAAO,EAAE,CAAC;QACnB,CAAC,CAAC;QAEF,IAAI,CAAC,IAAI,CAAC,WAAW,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,CAAC;YAC7C,OAAO;QACX,CAAC;QACD,IAAI,CAAC;YACD,IACI,IAAI,CAAC,wBAAwB;gBAC7B,OAAO,QAAQ,CAAC,mBAAmB,KAAK,UAAU,EACpD,CAAC;gBACC,IAAI,CAAC,wBAAwB,GAAG,KAAK,CAAC;gBACtC,MAAM,QAAQ,CAAC,mBAAmB,CAAC,SAAS,CAAC,CAAC,QAAQ,CAAC;YAC3D,CAAC;iBAAM,CAAC;gBACJ,SAAS,EAAE,CAAC;YAChB,CAAC;YACD,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;YACjC,IAAI,CAAC,gBAAgB,GAAG,KAAK,CAAC;YAC9B,IAAI,cAAc,EAAE,CAAC;gBACjB,MAAM,IAAI,CAAC,SAAS,EAAE,CAAC;gBACvB,IAAI,CAAC,UAAU,EAAE,CAAC;gBAClB,IAAI,CAAC,WAAW,CAAC,OAAO,EAAE,CAAC;YAC/B,CAAC;QACL,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACT,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;YAC7B,IAAI,CAAC,gBAAgB,GAAG,KAAK,CAAC;YAC9B,IAAI,cAAc,EAAE,CAAC;gBACjB,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;YAC/B,CAAC;QACL,CAAC;IACL,CAAC;IAES,MAAM;QACZ,IAAI,IAAI,CAAC,aAAa,KAAK,SAAS,EAAE,CAAC;YACnC,IAAI,CAAC,oBAAoB,CAAC,OAAO,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;QAC1D,CAAC;QACD,IAAI,CAAC,aAAa,GAAG,MAAM,CAAC,QAAQ,CAAC,GAAG,EAAE;YACtC,IAAI,CAAC,aAAa,CAAC,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC;YAClD,IAAI,CAAC,SAAS,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,aAAa,CAAC,CAAC;QAChF,CAAC,CAAC,CAAC;QACH,IAAI,CAAC,oBAAoB,CAAC,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;QACpD,IAAI,CAAC,aAAa,CAAC,GAAG,EAAE,CAAC;IAC7B,CAAC;IAES,mBAAmB,CACzB,OAA6B,IAAI,CAAC,UAAU;QAE5C,IAAI,GAAG,GAAmB,aAAa,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,CAAC;QACxD,MAAM,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC,CAAC;QACrB,KAAK,MAAM,EAAE,IAAI,GAAG,EAAE,CAAC;YACnB,GAAG,GAAG,CAAC,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,mBAAmB,CAAC,EAAE,CAAC,CAAC,CAAC;QACpD,CAAC;QACD,OAAO,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,YAAY,SAAS,CAAC,CAAC;IACtE,CAAC;IAES,KAAK,CAAC,SAAS;QACrB,iCAAiC;QACjC,MAAM,QAAQ,GAAG,IAAI,CAAC,mBAAmB,EAAE,CAAC;QAC5C,sCAAsC;QACtC,MAAM,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;IACzF,CAAC;IAES,OAAO;QACb,sCAAsC;IAC1C,CAAC;IAES,YAAY;QAClB,yDAAyD;QACzD,6BAA6B;IACjC,CAAC;IAES,UAAU;QAChB,kEAAkE;IACtE,CAAC;IAES,WAAW;QACjB,iEAAiE;QACjE,oCAAoC;IACxC,CAAC;IAES,gBAAgB;QACtB,gEAAgE;QAChE,qDAAqD;IACzD,CAAC;IAES,MAAM;QACZ,OAAO,OAAO,CAAC;IACnB,CAAC;IAED,OA1WgB,SAAS,EA0WxB,MAAM,CAAC,OAAO,EAAC;QACZ,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,mBAAmB,EAAE,EAAE,CAAC;YAC7C,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC;QAC5B,CAAC;QACD,IAAI,CAAC,oBAAoB,EAAE,CAAC;QAC3B,IAAI,CAAC,SAAiB,EAAE,OAAO,EAAE,EAAE,CAAC;QACrC,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;QAC3B,IAAI,CAAC,MAAM,EAAE,CAAC;IAClB,CAAC;IASD,iBAAiB,CACb,aAA+C;QAE/C,IAAI,SAAS,CAAC,aAAa,CAAC,EAAE,CAAC;YAC3B,OAAO,aAAa,CAAC;QACzB,CAAC;QACD,MAAM,UAAU,GAAG,YAAY,CAAC,aAAa,CAAC,CAAC;QAC/C,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;QACvC,OAAO,UAAU,CAAC;IACtB,CAAC;IAED,EAAE,CACE,IAAO,EACP,QAAiD,EACjD,OAA2C;QAE3C,OAAO,aAAa,CAAC,IAAiB,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC;IACrE,CAAC;IAED;;;;OAIG;IACH,iBAAiB;QACb,OAAO,IAAI,CAAC,UAAU,EAAE,aAAa,IAAI,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;IAC1E,CAAC;IAYD,KAAK,CAAC,QAAgB;QAClB,OAAO,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;IACnD,CAAC;IAgBD,QAAQ,CAAC,QAAgB;QACrB,OAAO,IAAI,CAAC,UAAU,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAC;IACtD,CAAC;IAsCD,SAAS,CACL,OAA0B;QAM1B,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,UAAU,EAAE,KAAK,EAAE,QAAQ,EAAE,GAAG,OAAO,IAAI,EAAE,CAAC;QACtE,MAAM,KAAK,GAAG,aAAa,CAAC,IAAI,EAAE,OAAO,IAAI,EAAE,EAAE,GAAG,EAAE,CAAC,CAAC,MAA8B,EAAE,EAAE;YACtF,MAAM,QAAQ,GAAG,SAAS,CAAC,MAAM,CAAC;gBAC9B,CAAC,CAAC,EAAE;gBACJ,CAAC,CAAC,KAAK,KAAK,IAAI;oBACd,CAAC,CAAC,MAAM,CAAC,aAAa,CAAC,OAAO,CAAC;oBAC/B,CAAC,CAAC,MAAM,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAC;YACzC,MAAM,gBAAgB,GAClB,QAAQ,KAAK,SAAS,IAAI,KAAK,KAAK,IAAI;gBACpC,CAAC,CAAE,QAA2B,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;gBACvE,CAAC,CAAC,QAAQ,CAAC;YACnB,OAAO,UAAU,KAAK,SAAS;gBAC3B,CAAC,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,YAAY,UAAU,CAAC;gBAC3D,CAAC,CAAC,gBAAgB,CAAC;QAC3B,CAAC,CAAC,CAAC;QACH,MAAM,MAAM,GAAG,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;QACpC,IAAI,QAAQ,KAAK,IAAI,EAAE,CAAC;YACpB,OAAO,KAAK,CAAC,MAAM,CAAC,CAAC;QACzB,CAAC;QACD,MAAM,GAAG,GAAG,cAAc,CAAC,IAAI,EAAE,KAAK,EAAE,GAAG,EAAE;YACzC,MAAM,GAAG,GAAG,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC,CAAC;YAC1D,IAAI,CAAC,aAAa,CAAC,IAAI,oBAAoB,CAAC,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC,CAAC;YACrE,OAAO,GAAG,CAAC,QAAQ,EAAE,CAAC;QAC1B,CAAC,CAAC,CAAC;QACH,OAAO,GAAG,CAAC;IACf,CAAC"}
|
|
1
|
+
{"version":3,"file":"component.js","sourceRoot":"","sources":["../src/component.ts"],"names":[],"mappings":";AAAA,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAC3D,OAAO,EAAE,iBAAiB,EAAE,YAAY,EAAsB,MAAM,wBAAwB,CAAC;AAC7F,OAAO,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AACvC,OAAO,EACH,WAAW,EACX,kBAAkB,EAClB,OAAO,EACP,MAAM,EACN,SAAS,GAOZ,MAAM,KAAK,CAAC;AAGb,OAAO,EAAE,eAAe,EAAE,aAAa,EAAwB,MAAM,wBAAwB,CAAC;AAC9F,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxE,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AACtC,OAAO,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAC3C,OAAO,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AACxC,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EACH,QAAQ,EACR,aAAa,EACb,cAAc,EACd,oBAAoB,GAEvB,MAAM,QAAQ,CAAC;AAGhB,OAAO,EACH,SAAS,EACT,eAAe,EACf,eAAe,GAGlB,MAAM,wBAAwB,CAAC;AAChC,OAAO,EACH,OAAO,EACP,aAAa,GAGhB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AACjD,OAAO,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAC;AAI9C,MAAc,CAAC,QAAQ,KAAK,MAAM,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC;AAM3D,SAAS,UAAU,CAAI,EAAY,EAAE,EAAY;IAC7C,OAAO,EAAE,CAAC,MAAM,KAAK,EAAE,CAAC,MAAM,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;AACtF,CAAC;AAED,MAAM,SAAS,GAAG,MAAM,CAAC,WAAW,CAAC,CAAC;AAgBtC,SAAS,mBAAmB,CAAC,IAAkB;IAC3C,OAAO,kBAAkB,CAAC,OAAO,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;AACjF,CAAC;AAED,MAAM,OAAgB,SAClB,SAAQ,cAAc;aAGf,SAAI,GAAS,EAAE,AAAX,CAAY;aAEhB,sBAAiB,GAAmB,EAAE,IAAI,EAAE,MAAM,EAAE,AAAnC,CAAoC;aACrD,iBAAY,GAAG,IAAI,GAAG,EAAc,AAAxB,CAAyB;IAE5C,cAAc;aACG,oBAAe,GAAG,IAAI,GAAG,EAA2B,AAArC,CAAsC;IACtE,cAAc;aACG,kBAAa,GAA6B,EAAE,AAA/B,CAAgC;IAC9D,cAAc;aACG,uBAAkB,GAAG,IAAI,GAAG,EAAmB,AAA7B,CAA8B;aAClD,QAAW,GAAG,IAAI,AAAP,CAAQ;IAKzB,YAAY,CAAiC;IAC7C,iBAAiB,CAA2B;IACrD,gBAAgB,CAAS;IACzB,aAAa,CAAyB;IAC7B,oBAAoB,CAAyD;IACtF,aAAa,CAAoC;IACxC,WAAW,CAAiC;IACrD,SAAS,CAAY;IACrB,YAAY,CAAS;IACrB,YAAY,CAAS;IACrB,wBAAwB,CAAS;IACjC,uBAAuB,CAAS;IAIhC,IAAI,eAAe;QACf,OAAO,IAAI,CAAC,gBAAgB,CAAC;IACjC,CAAC;IACD,IAAI,cAAc;QACd,OAAO,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC;IACtC,CAAC;IACD,IAAI,aAAa;QACb,OAAO,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC;IACpC,CAAC;IAED,gBAAgB,CAAyB;IACzC,IAAI,WAAW;QACX,OAAO,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC;IACxC,CAAC;IAED,MAAM,CAAC,cAAc,CAAC,IAAgB;QAClC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,cAAc,CAAC,EAAE,CAAC;YACvC,IAAI,CAAC,YAAY,GAAG,IAAI,GAAG,EAAE,CAAC;QAClC,CAAC;QACD,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAChC,CAAC;IAED,MAAM,KAAK,kBAAkB;QACzB,IAAI,CAAC,QAAQ,EAAE,CAAC;QAChB,OAAO,IAAI,CAAC,eAAe,CAAC,IAAI,EAAE,CAAC,OAAO,EAAE,CAAC;IACjD,CAAC;IAEO,MAAM,CAAC,QAAQ;QACnB,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,SAAS,CAAC,EAAE,CAAC;YAClC,IAAI,CAAC,SAAS,CAAC,GAAG,IAAI,CAAC;YACvB,MAAM,MAAM,GAAG,MAAM,CAAC,cAAc,CAAC,IAAI,CAAqB,CAAC;YAC/D,MAAM,CAAC,QAAQ,EAAE,CAAC;YAElB,IAAI,CAAC,eAAe,GAAG,IAAI,GAAG,CAAC;gBAC3B,GAAG,MAAM,CAAC,eAAe;gBACzB,GAAG,CAAE,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC,eAAe,CAAkC;oBAC1E,EAAE,CAAC;aACV,CAAC,CAAC;YACH,IAAI,CAAC,kBAAkB,GAAG,IAAI,GAAG,CAAC;gBAC9B,GAAG,MAAM,CAAC,kBAAkB;gBAC5B,GAAG,CAAE,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC,kBAAkB,CAA0B,IAAI,EAAE,CAAC;aACnF,CAAC,CAAC;YACH,IAAI,CAAC,YAAY,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,MAAM,CAAC,YAAY,EAAE,GAAG,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC;YAC5E,IAAI,CAAC,aAAa,GAAG,CAAC,GAAG,MAAM,CAAC,aAAa,CAAC,CAAC;YAC/C,IAAI,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,QAAQ,CAAC,EAAE,CAAC;gBAChC,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;oBAC7B,MAAM,MAAM,GAAG,IAAI,GAAG,CACjB,IAAI,CAAC,MAAyB;yBAC1B,IAAI,CAAC,QAAQ,CAAC;yBACd,OAAO,EAAyB,CACxC,CAAC;oBACF,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;wBACzB,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,mBAAmB,CAAC,KAAK,CAAC,CAAC,CAAC;oBAC3D,CAAC;gBACL,CAAC;qBAAM,IAAI,IAAI,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;oBACnC,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC;gBAC9D,CAAC;YACL,CAAC;QACL,CAAC;IACL,CAAC;IAED;QACI,KAAK,EAAE,CAAC;QAhFZ,kBAAa,GAAkB,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;QAGrC,iBAAY,GAAG,IAAI,GAAG,EAAsB,CAAC;QAC7C,sBAAiB,GAAG,IAAI,iBAAiB,EAAE,CAAC;QACrD,qBAAgB,GAAG,KAAK,CAAC;QAEhB,yBAAoB,GAAG,IAAI,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC,CAAC;QACtF,kBAAa,GAAG,OAAO,CAAC,aAAa,EAAW,CAAC;QACxC,gBAAW,GAAG,OAAO,CAAC,aAAa,EAAQ,CAAC;QAErD,iBAAY,GAAG,KAAK,CAAC;QACrB,iBAAY,GAAG,KAAK,CAAC;QACrB,6BAAwB,GAAG,KAAK,CAAC;QAGxB,eAAU,GAA6B,IAAI,CAAC,gBAAgB,EAAE,CAAC;QAYxE,qBAAgB,GAAG,IAAI,eAAe,EAAE,CAAC;QAsDrC,IAAI,CAAC,uBAAuB,GAAG,CAAC,CAAC;QAEjC,sEAAsE;QACtE,MAAM,MAAM,GAAG,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC,cAAc,CAAC,IAAI,EAAE,CAAC;QACzE,KAAK,MAAM,KAAK,IAAI,MAAmC,EAAE,CAAC;YACtD,MAAM,GAAG,GAAG,eAAe,CAAC,IAAI,EAAE,KAAK,EAAE,GAAG,EAAE,CAC1C,MAAM,CAAC,SAAS,EAAE,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,EAAE,CAAC,CAClB,CAAC;YAC3B,MAAM,CAAC,cAAc,CAAC,IAAI,EAAE,KAAK,EAAE;gBAC/B,GAAG;oBACC,OAAO,GAAG,CAAC,GAAG,EAAE,CAAC;gBACrB,CAAC;gBACD,GAAG,CAAC,KAAK;oBACL,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;gBACnB,CAAC;gBACD,UAAU,EAAE,IAAI;gBAChB,YAAY,EAAE,IAAI;aACrB,CAAC,CAAC;QACP,CAAC;QAED,mBAAmB;QACnB,KAAK,MAAM,IAAI,IAAK,IAAI,CAAC,WAAgC,CAAC,YAAY,EAAE,CAAC;YACrE,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACpB,CAAC;QAED,IAAI,CAAC,uBAAuB,EAAE,CAAC;QAC/B,IAAI,CAAC,YAAY,GAAG,KAAK,CAAC;IAC9B,CAAC;IAES,iBAAiB;QACvB,IAAI,CAAC,iBAAiB,CAAC,OAAO,EAAE,CAAC;QACjC,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,aAAa,EAAE,EAAE,CAAC,CAAC;QACtD,IAAI,CAAC,SAAS,EAAE,YAAY,CAAC,IAAI,CAAC,CAAC;QAEnC,KAAK,MAAM,GAAG,IAAI,aAAa,CAAC,IAAI,CAAC,EAAE,CAAC;YACpC,MAAM,MAAM,GAAG,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAC9B,MAAM,KAAK,GAAG,SAAS,CAAC,MAAM,CAAC;gBAC3B,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAgB,EAAE,CAAC;gBAClC,CAAC,CAAC,UAAU,CAAC,MAAM,CAAC;oBAClB,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC;oBACvB,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC;YAChC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,SAAS,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;QACpF,CAAC;QAED,IAAI,CAAC,iBAAiB,CAClB,MAAM,CAAC,MAAM,CAAC,GAAG,EAAE;YACf,IAAI,IAAI,CAAC,qBAAqB,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC;gBACrC,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC;oBACrB,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC;oBACzB,IAAI,CAAC,gBAAgB,EAAE,CAAC;gBAC5B,CAAC;gBACD,IAAI,CAAC,WAAW,EAAE,CAAC;gBACnB,IAAI,CAAC,aAAa,EAAE,CAAC;YACzB,CAAC;QACL,CAAC,CAAC,CACL,CAAC;QAEF,IAAI,CAAC,aAAa,EAAE,CAAC;IACzB,CAAC;IAES,oBAAoB;QAC1B,IAAI,IAAI,CAAC,aAAa,KAAK,SAAS,EAAE,CAAC;YACnC,IAAI,CAAC,oBAAoB,CAAC,OAAO,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;YACtD,IAAI,CAAC,aAAa,GAAG,SAAS,CAAC;QACnC,CAAC;QACD,IAAI,CAAC,gBAAgB,GAAG,KAAK,CAAC;QAC9B,IAAI,CAAC,gBAAgB,CAAC,KAAK,CACvB,IAAI,YAAY,CAAC,GAAG,IAAI,CAAC,OAAO,uBAAuB,EAAE,YAAY,CAAC,CACzE,CAAC;QACF,IAAI,CAAC,gBAAgB,GAAG,IAAI,eAAe,EAAE,CAAC;QAC9C,IAAI,CAAC,SAAS,EAAE,YAAY,CAAC,KAAK,CAAC,CAAC;QACpC,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,gBAAgB,EAAE,EAAE,CAAC,CAAC;QACzD,IAAI,CAAC,iBAAiB,CAAC,OAAO,EAAE,CAAC;IACrC,CAAC;IAED,mBAAmB,CAAC,IAAY,EAAE,KAAoB;QAClD,IAAI,CAAC,uBAAuB,EAAE,CAAC;QAC/B,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;YACjB,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;QAC/B,CAAC;aAAM,CAAC;YACJ,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;QACnC,CAAC;QACD,IAAI,CAAC,uBAAuB,EAAE,CAAC;IACnC,CAAC;IAES,wBAAwB,CAC9B,IAAY,EACZ,GAAkB,EAClB,WAA0B;QAE1B,IAAI,IAAI,CAAC,uBAAuB,GAAG,CAAC,IAAI,GAAG,KAAK,WAAW,EAAE,CAAC;YAC1D,OAAO;QACX,CAAC;QACD,MAAM,UAAU,GAAI,IAAI,CAAC,WAAgC,CAAC,eAAe,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACpF,IAAI,UAAU,KAAK,SAAS,EAAE,CAAC;YAC3B,MAAM,KAAK,GAAG,aAAa,CAAC,WAAW,EAAE,UAAU,CAAC,IAAI,CAAC,CAAC;YAC1D,IAAI,CAAC,UAAU,CAAC,QAAsB,CAAC,GAAG,KAAY,CAAC;QAC3D,CAAC;IACL,CAAC;IAED,OAAO,CAAmD,IAAO;QAC7D,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC;QAC1B,OAAO,eAAe,CAAC,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE;YACpC,MAAM,IAAI,SAAS,CAAC,mCAAmC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACnF,CAAC,CAAc,CAAC;IACpB,CAAC;IAED,aAAa,CAAC,UAA8B;QACxC,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;QAClC,IAAI,IAAI,CAAC,UAAU,KAAK,SAAS,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;YACpD,UAAU,CAAC,aAAa,EAAE,EAAE,CAAC;QACjC,CAAC;IACL,CAAC;IAED,gBAAgB,CAAC,UAA8B;QAC3C,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;IACzC,CAAC;IAES,gBAAgB;QACtB,MAAM,UAAU,GACZ,IAAI,CAAC,UAAU;YACf,IAAI,CAAC,YAAY,CAAE,IAAI,CAAC,WAAgC,CAAC,iBAAiB,CAAC,CAAC;QAChF,WAAW,CAAC,UAAU,EAAE,CAAC,GAAI,IAAI,CAAC,WAAgC,CAAC,aAAa,CAAC,CAAC,CAAC;QACnF,IAAI,CAAC,aAAa,CAAC,YAAY,KAAK,UAAU,CAAC,UAAU,CAAC;QAC1D,OAAO,UAAU,CAAC;IACtB,CAAC;IAED,aAAa,CAAC,IAAmB;QAC7B,IAAI,IAAI,EAAE,cAAc,KAAK,IAAI,EAAE,CAAC;YAChC,IAAI,CAAC,wBAAwB,GAAG,IAAI,CAAC;QACzC,CAAC;QACD,IAAI,CAAC,IAAI,CAAC,eAAe,IAAI,IAAI,CAAC,WAAW,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;YACjE,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC;YAC7B,IAAI,CAAC,aAAa,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC;YAC7C,SAAS,CAAC,IAAI,CAAC,CAAC;QACpB,CAAC;IACL,CAAC;IAED,sBAAsB,CAA4B;IAClD,qBAAqB;QACjB,IAAI,IAAI,CAAC,sBAAsB,KAAK,SAAS,EAAE,CAAC;YAC5C,MAAM,kBAAkB,GAAI,IAAI,CAAC,WAAgC,CAAC,kBAAkB,CAAC;YACrF,IAAI,CAAC,sBAAsB,GAAG,MAAM,CAAC,QAAQ,CACzC,GAAG,EAAE;gBACD,OAAO,kBAAkB,CAAC,IAAI,KAAK,CAAC;oBAChC,CAAC,CAAC,IAAI;oBACN,CAAC,CAAC,kBAAkB;yBACb,IAAI,EAAE;yBACN,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE,CAAE,IAAY,CAAC,GAAG,CAAC,KAAK,SAAS,CAAC,CAAC;YAChE,CAAC;YACD,oEAAoE;YACpE,oDAAoD;YACpD,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,KAAK,EAAE,CAC1B,CAAC;QACN,CAAC;QACD,OAAO,IAAI,CAAC,sBAAsB,CAAC;IACvC,CAAC;IAES,KAAK,CAAC,aAAa;QACzB,IAAI,cAAc,GAAG,KAAK,CAAC;QAC3B,MAAM,SAAS,GAAG,GAAG,EAAE;YACnB,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;YACnD,IAAI,CAAC,MAAM,EAAE,CAAC;YACd,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;YACpD,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC;gBACrB,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC;gBACzB,IAAI,CAAC,YAAY,EAAE,CAAC;gBACpB,cAAc,GAAG,IAAI,CAAC;YAC1B,CAAC;YACD,IAAI,CAAC,OAAO,EAAE,CAAC;QACnB,CAAC,CAAC;QAEF,IAAI,CAAC,IAAI,CAAC,WAAW,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,CAAC;YAC7C,OAAO;QACX,CAAC;QACD,IAAI,CAAC;YACD,IACI,IAAI,CAAC,wBAAwB;gBAC7B,OAAO,QAAQ,CAAC,mBAAmB,KAAK,UAAU,EACpD,CAAC;gBACC,IAAI,CAAC,wBAAwB,GAAG,KAAK,CAAC;gBACtC,MAAM,QAAQ,CAAC,mBAAmB,CAAC,SAAS,CAAC,CAAC,QAAQ,CAAC;YAC3D,CAAC;iBAAM,CAAC;gBACJ,SAAS,EAAE,CAAC;YAChB,CAAC;YACD,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;YACjC,IAAI,CAAC,gBAAgB,GAAG,KAAK,CAAC;YAC9B,IAAI,cAAc,EAAE,CAAC;gBACjB,MAAM,IAAI,CAAC,SAAS,EAAE,CAAC;gBACvB,IAAI,CAAC,UAAU,EAAE,CAAC;gBAClB,IAAI,CAAC,WAAW,CAAC,OAAO,EAAE,CAAC;YAC/B,CAAC;QACL,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACT,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;YAC7B,IAAI,CAAC,gBAAgB,GAAG,KAAK,CAAC;YAC9B,IAAI,cAAc,EAAE,CAAC;gBACjB,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;YAC/B,CAAC;QACL,CAAC;IACL,CAAC;IAES,MAAM;QACZ,IAAI,IAAI,CAAC,aAAa,KAAK,SAAS,EAAE,CAAC;YACnC,IAAI,CAAC,oBAAoB,CAAC,OAAO,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;QAC1D,CAAC;QACD,IAAI,CAAC,aAAa,GAAG,MAAM,CAAC,QAAQ,CAAC,GAAG,EAAE;YACtC,IAAI,CAAC,aAAa,CAAC,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC;YAClD,IAAI,CAAC,SAAS,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,aAAa,CAAC,CAAC;QAChF,CAAC,CAAC,CAAC;QACH,IAAI,CAAC,oBAAoB,CAAC,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;QACpD,IAAI,CAAC,aAAa,CAAC,GAAG,EAAE,CAAC;IAC7B,CAAC;IAES,mBAAmB,CACzB,OAA6B,IAAI,CAAC,UAAU;QAE5C,IAAI,GAAG,GAAmB,aAAa,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,CAAC;QACxD,MAAM,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC,CAAC;QACrB,KAAK,MAAM,EAAE,IAAI,GAAG,EAAE,CAAC;YACnB,GAAG,GAAG,CAAC,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,mBAAmB,CAAC,EAAE,CAAC,CAAC,CAAC;QACpD,CAAC;QACD,OAAO,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,YAAY,SAAS,CAAC,CAAC;IACtE,CAAC;IAES,KAAK,CAAC,SAAS;QACrB,iCAAiC;QACjC,MAAM,QAAQ,GAAG,IAAI,CAAC,mBAAmB,EAAE,CAAC;QAC5C,sCAAsC;QACtC,MAAM,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;IACzF,CAAC;IAES,OAAO;QACb,sCAAsC;IAC1C,CAAC;IAES,YAAY;QAClB,yDAAyD;QACzD,6BAA6B;IACjC,CAAC;IAES,UAAU;QAChB,kEAAkE;IACtE,CAAC;IAES,WAAW;QACjB,iEAAiE;QACjE,oCAAoC;IACxC,CAAC;IAES,gBAAgB;QACtB,gEAAgE;QAChE,qDAAqD;IACzD,CAAC;IAES,MAAM;QACZ,OAAO,OAAO,CAAC;IACnB,CAAC;IAED,OAtVgB,SAAS,EAsVxB,MAAM,CAAC,OAAO,EAAC;QACZ,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,mBAAmB,EAAE,EAAE,CAAC;YAC7C,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC;QAC5B,CAAC;QACD,IAAI,CAAC,oBAAoB,EAAE,CAAC;QAC3B,IAAI,CAAC,SAAiB,EAAE,OAAO,EAAE,EAAE,CAAC;QACrC,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;QAC3B,IAAI,CAAC,MAAM,EAAE,CAAC;IAClB,CAAC;IASD,iBAAiB,CACb,aAA+C;QAE/C,IAAI,SAAS,CAAC,aAAa,CAAC,EAAE,CAAC;YAC3B,OAAO,aAAa,CAAC;QACzB,CAAC;QACD,MAAM,UAAU,GAAG,YAAY,CAAC,aAAa,CAAC,CAAC;QAC/C,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;QACvC,OAAO,UAAU,CAAC;IACtB,CAAC;IAED,EAAE,CACE,IAAO,EACP,QAAiD,EACjD,OAA2C;QAE3C,OAAO,aAAa,CAAC,IAAiB,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC;IACrE,CAAC;IAED;;;;OAIG;IACH,iBAAiB;QACb,OAAO,IAAI,CAAC,UAAU,EAAE,aAAa,IAAI,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;IAC1E,CAAC;IAYD,KAAK,CAAC,QAAgB;QAClB,OAAO,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;IACnD,CAAC;IAgBD,QAAQ,CAAC,QAAgB;QACrB,OAAO,IAAI,CAAC,UAAU,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAC;IACtD,CAAC;IAsCD,SAAS,CACL,OAA0B;QAM1B,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,UAAU,EAAE,KAAK,EAAE,QAAQ,EAAE,GAAG,OAAO,IAAI,EAAE,CAAC;QACtE,MAAM,KAAK,GAAG,aAAa,CAAC,IAAI,EAAE,OAAO,IAAI,EAAE,EAAE,GAAG,EAAE,CAAC,CAAC,MAA8B,EAAE,EAAE;YACtF,MAAM,QAAQ,GAAG,SAAS,CAAC,MAAM,CAAC;gBAC9B,CAAC,CAAC,EAAE;gBACJ,CAAC,CAAC,KAAK,KAAK,IAAI;oBACd,CAAC,CAAC,MAAM,CAAC,aAAa,CAAC,OAAO,CAAC;oBAC/B,CAAC,CAAC,MAAM,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAC;YACzC,MAAM,gBAAgB,GAClB,QAAQ,KAAK,SAAS,IAAI,KAAK,KAAK,IAAI;gBACpC,CAAC,CAAE,QAA2B,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;gBACvE,CAAC,CAAC,QAAQ,CAAC;YACnB,OAAO,UAAU,KAAK,SAAS;gBAC3B,CAAC,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,YAAY,UAAU,CAAC;gBAC3D,CAAC,CAAC,gBAAgB,CAAC;QAC3B,CAAC,CAAC,CAAC;QACH,MAAM,MAAM,GAAG,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;QACpC,IAAI,QAAQ,KAAK,IAAI,EAAE,CAAC;YACpB,OAAO,KAAK,CAAC,MAAM,CAAC,CAAC;QACzB,CAAC;QACD,MAAM,GAAG,GAAG,cAAc,CAAC,IAAI,EAAE,KAAK,EAAE,GAAG,EAAE;YACzC,MAAM,GAAG,GAAG,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC,CAAC;YAC1D,IAAI,CAAC,aAAa,CAAC,IAAI,oBAAoB,CAAC,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC,CAAC;YACrE,OAAO,GAAG,CAAC,QAAQ,EAAE,CAAC;QAC1B,CAAC,CAAC,CAAC;QACH,OAAO,GAAG,CAAC;IACf,CAAC"}
|
|
@@ -1,26 +1,48 @@
|
|
|
1
1
|
import type { Component } from "../component";
|
|
2
|
+
import type { ClassAccessorDecoratorFunction, ClassGetterDecoratorFunction, ClassGetterDecoratorResult, ClassGetterDecoratorTarget, ClassSetterDecoratorFunction, ClassSetterDecoratorResult, ClassSetterDecoratorTarget } from "./types";
|
|
2
3
|
export declare const attributeConfig: unique symbol;
|
|
3
4
|
export type AttributeType = typeof String | typeof Number | typeof Boolean;
|
|
4
|
-
export type
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
5
|
+
export type AttributeGetterSetterOptions = {
|
|
6
|
+
type?: AttributeType;
|
|
7
|
+
name?: string;
|
|
8
|
+
};
|
|
9
|
+
export type AttributeOptions = AttributeGetterSetterOptions & {
|
|
10
|
+
reflect?: boolean;
|
|
11
|
+
reactive?: boolean;
|
|
8
12
|
};
|
|
9
13
|
export type AttributeConfig = {
|
|
10
|
-
type: AttributeType
|
|
14
|
+
type: AttributeType;
|
|
11
15
|
property: string;
|
|
12
|
-
|
|
16
|
+
name: string;
|
|
17
|
+
reflect: boolean;
|
|
18
|
+
reactive: boolean;
|
|
19
|
+
};
|
|
13
20
|
export declare function toAttribute(value: unknown, type: AttributeType): string | null;
|
|
14
21
|
export declare function fromAttribute(value: string | null, type: typeof Number): number | undefined;
|
|
15
22
|
export declare function fromAttribute(value: string | null, type: typeof Boolean): boolean;
|
|
16
23
|
export declare function fromAttribute(value: string | null, type: typeof String): string | undefined;
|
|
17
24
|
export declare function fromAttribute(value: string | null, type: AttributeType): string | number | boolean | undefined;
|
|
18
|
-
export declare function
|
|
19
|
-
|
|
25
|
+
export declare function attributeGetter<C extends Component, T extends number | undefined>(options: AttributeOptions & {
|
|
26
|
+
type: typeof Number;
|
|
27
|
+
}): ClassGetterDecoratorFunction<C, T>;
|
|
28
|
+
export declare function attributeGetter<C extends Component, T extends boolean | undefined>(options: AttributeOptions & {
|
|
29
|
+
type: typeof Boolean;
|
|
30
|
+
}): ClassGetterDecoratorFunction<C, T>;
|
|
31
|
+
export declare function attributeGetter<C extends Component, T extends string | undefined>(options: AttributeOptions): ClassGetterDecoratorFunction<C, T>;
|
|
32
|
+
export declare function attributeGetter<C extends Component, T extends string | undefined>(value: ClassGetterDecoratorTarget<C, T>, context: ClassGetterDecoratorContext<C, T>): ClassGetterDecoratorResult<C, T>;
|
|
33
|
+
export declare function attributeSetter<C extends Component, T extends number | undefined>(options: AttributeOptions & {
|
|
34
|
+
type: typeof Number;
|
|
35
|
+
}): ClassSetterDecoratorFunction<C, T>;
|
|
36
|
+
export declare function attributeSetter<C extends Component, T extends boolean | undefined>(options: AttributeOptions & {
|
|
37
|
+
type: typeof Boolean;
|
|
38
|
+
}): ClassSetterDecoratorFunction<C, T>;
|
|
39
|
+
export declare function attributeSetter<C extends Component, T extends string | undefined>(options: AttributeOptions): ClassSetterDecoratorFunction<C, T>;
|
|
40
|
+
export declare function attributeSetter<C extends Component, T extends string | undefined>(value: ClassSetterDecoratorTarget<C, T>, context: ClassSetterDecoratorContext<C, T>): ClassSetterDecoratorResult<C, T>;
|
|
41
|
+
export declare function attribute<C extends Component, T extends number | undefined>(options: AttributeOptions & {
|
|
20
42
|
type: typeof Number;
|
|
21
|
-
}):
|
|
22
|
-
export declare function attribute<C extends Component, T extends boolean | undefined>(options:
|
|
43
|
+
}): ClassAccessorDecoratorFunction<C, T>;
|
|
44
|
+
export declare function attribute<C extends Component, T extends boolean | undefined>(options: AttributeOptions & {
|
|
23
45
|
type: typeof Boolean;
|
|
24
|
-
}):
|
|
25
|
-
export declare function attribute<C extends Component, T extends string | undefined>(options:
|
|
46
|
+
}): ClassAccessorDecoratorFunction<C, T>;
|
|
47
|
+
export declare function attribute<C extends Component, T extends string | undefined>(options: AttributeOptions): ClassAccessorDecoratorFunction<C, T>;
|
|
26
48
|
export declare function attribute<C extends Component, T extends string | undefined>(value: ClassAccessorDecoratorTarget<C, T>, context: ClassAccessorDecoratorContext<C, T>): ClassAccessorDecoratorResult<C, T>;
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
/* eslint-disable @typescript-eslint/unified-signatures */
|
|
2
|
-
import { isNullish, unreachable } from "@bodil/core/assert";
|
|
2
|
+
import { isDeepEqual, isNullish, present, unreachable } from "@bodil/core/assert";
|
|
3
|
+
import { None, Some } from "@bodil/opt";
|
|
3
4
|
import { Signal } from "@bodil/signal";
|
|
4
5
|
import { signalForObject } from "./reactive";
|
|
5
6
|
export const attributeConfig = Symbol("attributeConfig");
|
|
@@ -35,23 +36,20 @@ export function fromAttribute(value, type) {
|
|
|
35
36
|
unreachable();
|
|
36
37
|
}
|
|
37
38
|
}
|
|
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
39
|
function toKebabCase(s) {
|
|
51
40
|
return s.replace(/((?<=[a-z\d])[A-Z]|(?<=[A-Z\d])[A-Z](?=[a-z]))/g, "-$1").toLowerCase();
|
|
52
41
|
}
|
|
42
|
+
export function attributeGetter(valueOrOptions, context) {
|
|
43
|
+
//@ts-ignore
|
|
44
|
+
return attribute(valueOrOptions, context);
|
|
45
|
+
}
|
|
46
|
+
export function attributeSetter(valueOrOptions, context) {
|
|
47
|
+
//@ts-ignore
|
|
48
|
+
return attribute(valueOrOptions, context);
|
|
49
|
+
}
|
|
53
50
|
export function attribute(valueOrOptions, context) {
|
|
54
51
|
if (context !== undefined) {
|
|
52
|
+
//@ts-ignore
|
|
55
53
|
return attribute({})(valueOrOptions, context);
|
|
56
54
|
}
|
|
57
55
|
return (value, context) => {
|
|
@@ -62,8 +60,9 @@ export function attribute(valueOrOptions, context) {
|
|
|
62
60
|
...{
|
|
63
61
|
type: String,
|
|
64
62
|
property: context.name,
|
|
65
|
-
reactive:
|
|
66
|
-
reflect:
|
|
63
|
+
reactive: context.kind === "accessor",
|
|
64
|
+
reflect: context.kind === "accessor",
|
|
65
|
+
name: toKebabCase(context.name),
|
|
67
66
|
},
|
|
68
67
|
...(valueOrOptions ?? {}),
|
|
69
68
|
};
|
|
@@ -71,45 +70,69 @@ export function attribute(valueOrOptions, context) {
|
|
|
71
70
|
if (attrs === undefined) {
|
|
72
71
|
context.metadata[attributeConfig] = attrs = new Map();
|
|
73
72
|
}
|
|
74
|
-
|
|
75
|
-
|
|
73
|
+
if (context.kind === "getter" || context.kind === "setter") {
|
|
74
|
+
const oldOpts = attrs.get(options.name);
|
|
75
|
+
if (oldOpts !== undefined && !isDeepEqual(oldOpts, options)) {
|
|
76
|
+
throw new TypeError(`Attribute options for ${JSON.stringify(context.name)} must be identical for getters and setters`);
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
attrs.set(options.name, options);
|
|
80
|
+
if (context.kind === "accessor") {
|
|
81
|
+
return accessor(options, context, value);
|
|
82
|
+
}
|
|
83
|
+
// ensure getters/setters aren't configured with reactive or reflect
|
|
76
84
|
if (options.reactive) {
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
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
|
-
};
|
|
85
|
+
throw new TypeError(`Getter/setter attributes cannot be declared with reactive: true (on ${JSON.stringify(context.name)})`);
|
|
86
|
+
}
|
|
87
|
+
if (options.reflect) {
|
|
88
|
+
throw new TypeError(`Getter/setter attributes cannot be declared with reflect: true (on ${JSON.stringify(context.name)})`);
|
|
96
89
|
}
|
|
90
|
+
};
|
|
91
|
+
}
|
|
92
|
+
function syncAttribute(target, options, value, force = false) {
|
|
93
|
+
const key = present(options.name);
|
|
94
|
+
const attributeValue = toAttribute(value, present(options.type));
|
|
95
|
+
if (force || attributeValue !== target.getAttribute(key)) {
|
|
96
|
+
target.setAttributeQuietly(key, attributeValue);
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
function accessor(options, context, value) {
|
|
100
|
+
let initValue = None;
|
|
101
|
+
const init = function init(value) {
|
|
102
|
+
initValue = Some(value);
|
|
103
|
+
if (options.reflect) {
|
|
104
|
+
syncAttribute(this, options, value, true);
|
|
105
|
+
}
|
|
106
|
+
return value;
|
|
107
|
+
};
|
|
108
|
+
if (options.reactive) {
|
|
109
|
+
const getSig = (obj) => signalForObject(obj, context.name, () => Signal(initValue.unwrapExact(), {
|
|
110
|
+
equals: Object.is,
|
|
111
|
+
}));
|
|
97
112
|
return {
|
|
98
113
|
get() {
|
|
99
|
-
return
|
|
114
|
+
return getSig(this).get();
|
|
100
115
|
},
|
|
101
116
|
set(newValue) {
|
|
102
|
-
|
|
103
|
-
value.set.call(this, newValue);
|
|
117
|
+
getSig(this).set(newValue);
|
|
104
118
|
if (options.reflect) {
|
|
105
|
-
|
|
119
|
+
syncAttribute(this, options, newValue);
|
|
106
120
|
}
|
|
107
121
|
},
|
|
108
|
-
init
|
|
109
|
-
options.type ??= detectAttributeType(newValue);
|
|
110
|
-
return newValue;
|
|
111
|
-
},
|
|
122
|
+
init,
|
|
112
123
|
};
|
|
124
|
+
}
|
|
125
|
+
return {
|
|
126
|
+
get() {
|
|
127
|
+
return value.get.call(this);
|
|
128
|
+
},
|
|
129
|
+
set(newValue) {
|
|
130
|
+
value.set.call(this, newValue);
|
|
131
|
+
if (options.reflect) {
|
|
132
|
+
syncAttribute(this, options, newValue);
|
|
133
|
+
}
|
|
134
|
+
},
|
|
135
|
+
init,
|
|
113
136
|
};
|
|
114
137
|
}
|
|
115
138
|
//# sourceMappingURL=attribute.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"attribute.js","sourceRoot":"","sources":["../../src/decorators/attribute.ts"],"names":[],"mappings":"AAAA,0DAA0D;AAE1D,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"attribute.js","sourceRoot":"","sources":["../../src/decorators/attribute.ts"],"names":[],"mappings":"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"}
|
|
@@ -36,6 +36,7 @@ import { customElement } from "lit/decorators.js";
|
|
|
36
36
|
import { expect, test } from "vitest";
|
|
37
37
|
import { attribute, Component } from "../component";
|
|
38
38
|
import { Signal } from "@bodil/signal";
|
|
39
|
+
import { attributeGetter, attributeSetter } from "./attribute";
|
|
39
40
|
test("@attribute", async () => {
|
|
40
41
|
let AttributeTestClass = (() => {
|
|
41
42
|
let _classDecorators = [customElement("attribute-test-class")];
|
|
@@ -145,4 +146,120 @@ test("@attribute", async () => {
|
|
|
145
146
|
expect(t.hide).toBe("yes");
|
|
146
147
|
expect(t.getAttribute("hide")).toBe("yes");
|
|
147
148
|
});
|
|
149
|
+
test("@attribute getter/setter", async () => {
|
|
150
|
+
let AttributeGetterTestClass = (() => {
|
|
151
|
+
let _classDecorators = [customElement("attribute-getter-test-class")];
|
|
152
|
+
let _classDescriptor;
|
|
153
|
+
let _classExtraInitializers = [];
|
|
154
|
+
let _classThis;
|
|
155
|
+
let _classSuper = Component;
|
|
156
|
+
let _instanceExtraInitializers = [];
|
|
157
|
+
let _get_value_decorators;
|
|
158
|
+
let _set_value_decorators;
|
|
159
|
+
let _get_synced_decorators;
|
|
160
|
+
let _set_synced_decorators;
|
|
161
|
+
var AttributeGetterTestClass = class extends _classSuper {
|
|
162
|
+
static { _classThis = this; }
|
|
163
|
+
static {
|
|
164
|
+
const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(_classSuper[Symbol.metadata] ?? null) : void 0;
|
|
165
|
+
_get_value_decorators = [attributeGetter];
|
|
166
|
+
_set_value_decorators = [attributeSetter];
|
|
167
|
+
_get_synced_decorators = [attributeGetter({ reflect: false })];
|
|
168
|
+
_set_synced_decorators = [attributeSetter({ reflect: false })];
|
|
169
|
+
__esDecorate(this, null, _get_value_decorators, { kind: "getter", name: "value", static: false, private: false, access: { has: obj => "value" in obj, get: obj => obj.value }, metadata: _metadata }, null, _instanceExtraInitializers);
|
|
170
|
+
__esDecorate(this, null, _set_value_decorators, { kind: "setter", name: "value", static: false, private: false, access: { has: obj => "value" in obj, set: (obj, value) => { obj.value = value; } }, metadata: _metadata }, null, _instanceExtraInitializers);
|
|
171
|
+
__esDecorate(this, null, _get_synced_decorators, { kind: "getter", name: "synced", static: false, private: false, access: { has: obj => "synced" in obj, get: obj => obj.synced }, metadata: _metadata }, null, _instanceExtraInitializers);
|
|
172
|
+
__esDecorate(this, null, _set_synced_decorators, { kind: "setter", name: "synced", static: false, private: false, access: { has: obj => "synced" in obj, set: (obj, value) => { obj.synced = value; } }, metadata: _metadata }, null, _instanceExtraInitializers);
|
|
173
|
+
__esDecorate(null, _classDescriptor = { value: _classThis }, _classDecorators, { kind: "class", name: _classThis.name, metadata: _metadata }, null, _classExtraInitializers);
|
|
174
|
+
AttributeGetterTestClass = _classThis = _classDescriptor.value;
|
|
175
|
+
if (_metadata) Object.defineProperty(_classThis, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
|
|
176
|
+
__runInitializers(_classThis, _classExtraInitializers);
|
|
177
|
+
}
|
|
178
|
+
#value = (__runInitializers(this, _instanceExtraInitializers), "Mike");
|
|
179
|
+
get value() {
|
|
180
|
+
return this.#value;
|
|
181
|
+
}
|
|
182
|
+
set value(value) {
|
|
183
|
+
this.#value = value;
|
|
184
|
+
}
|
|
185
|
+
#synced = "Mike";
|
|
186
|
+
get synced() {
|
|
187
|
+
return this.#synced;
|
|
188
|
+
}
|
|
189
|
+
set synced(value) {
|
|
190
|
+
this.#synced = value;
|
|
191
|
+
this.setAttributeQuietly("synced", value);
|
|
192
|
+
}
|
|
193
|
+
};
|
|
194
|
+
return AttributeGetterTestClass = _classThis;
|
|
195
|
+
})();
|
|
196
|
+
const t = document.createElement("attribute-getter-test-class");
|
|
197
|
+
document.body.append(t);
|
|
198
|
+
await t.updateComplete;
|
|
199
|
+
expect(t.value).toBe("Mike");
|
|
200
|
+
expect(t.getAttribute("value")).toBeNull();
|
|
201
|
+
t.setAttribute("value", "Joe");
|
|
202
|
+
expect(t.value).toBe("Joe");
|
|
203
|
+
expect(t.getAttribute("value")).toBe("Joe");
|
|
204
|
+
t.value = "Robert";
|
|
205
|
+
expect(t.value).toBe("Robert");
|
|
206
|
+
expect(t.getAttribute("value")).toBe("Joe");
|
|
207
|
+
expect(t.synced).toBe("Mike");
|
|
208
|
+
expect(t.getAttribute("synced")).toBeNull();
|
|
209
|
+
t.setAttribute("synced", "Joe");
|
|
210
|
+
expect(t.synced).toBe("Joe");
|
|
211
|
+
expect(t.getAttribute("synced")).toBe("Joe");
|
|
212
|
+
t.synced = "Robert";
|
|
213
|
+
expect(t.synced).toBe("Robert");
|
|
214
|
+
expect(t.getAttribute("synced")).toBe("Robert");
|
|
215
|
+
});
|
|
216
|
+
test("@attribute init ordering", async () => {
|
|
217
|
+
let AttributeInitTestClass = (() => {
|
|
218
|
+
let _classDecorators = [customElement("attribute-init-test-class")];
|
|
219
|
+
let _classDescriptor;
|
|
220
|
+
let _classExtraInitializers = [];
|
|
221
|
+
let _classThis;
|
|
222
|
+
let _classSuper = Component;
|
|
223
|
+
let _instanceExtraInitializers = [];
|
|
224
|
+
let _movieStar_decorators;
|
|
225
|
+
let _movieStar_initializers = [];
|
|
226
|
+
let _movieStar_extraInitializers = [];
|
|
227
|
+
let _get_wibble_decorators;
|
|
228
|
+
let _set_wibble_decorators;
|
|
229
|
+
var AttributeInitTestClass = class extends _classSuper {
|
|
230
|
+
static { _classThis = this; }
|
|
231
|
+
static {
|
|
232
|
+
const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(_classSuper[Symbol.metadata] ?? null) : void 0;
|
|
233
|
+
_movieStar_decorators = [attribute];
|
|
234
|
+
_get_wibble_decorators = [attributeGetter];
|
|
235
|
+
_set_wibble_decorators = [attributeSetter];
|
|
236
|
+
__esDecorate(this, null, _movieStar_decorators, { kind: "accessor", name: "movieStar", static: false, private: false, access: { has: obj => "movieStar" in obj, get: obj => obj.movieStar, set: (obj, value) => { obj.movieStar = value; } }, metadata: _metadata }, _movieStar_initializers, _movieStar_extraInitializers);
|
|
237
|
+
__esDecorate(this, null, _get_wibble_decorators, { kind: "getter", name: "wibble", static: false, private: false, access: { has: obj => "wibble" in obj, get: obj => obj.wibble }, metadata: _metadata }, null, _instanceExtraInitializers);
|
|
238
|
+
__esDecorate(this, null, _set_wibble_decorators, { kind: "setter", name: "wibble", static: false, private: false, access: { has: obj => "wibble" in obj, set: (obj, value) => { obj.wibble = value; } }, metadata: _metadata }, null, _instanceExtraInitializers);
|
|
239
|
+
__esDecorate(null, _classDescriptor = { value: _classThis }, _classDecorators, { kind: "class", name: _classThis.name, metadata: _metadata }, null, _classExtraInitializers);
|
|
240
|
+
AttributeInitTestClass = _classThis = _classDescriptor.value;
|
|
241
|
+
if (_metadata) Object.defineProperty(_classThis, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
|
|
242
|
+
__runInitializers(_classThis, _classExtraInitializers);
|
|
243
|
+
}
|
|
244
|
+
accessor movieStar = (__runInitializers(this, _instanceExtraInitializers), __runInitializers(this, _movieStar_initializers, "Joe"));
|
|
245
|
+
#wibble = (__runInitializers(this, _movieStar_extraInitializers), "Joe");
|
|
246
|
+
get wibble() {
|
|
247
|
+
return this.#wibble;
|
|
248
|
+
}
|
|
249
|
+
set wibble(value) {
|
|
250
|
+
this.#wibble = value;
|
|
251
|
+
}
|
|
252
|
+
};
|
|
253
|
+
return AttributeInitTestClass = _classThis;
|
|
254
|
+
})();
|
|
255
|
+
const t = document.createElement("attribute-init-test-class");
|
|
256
|
+
t.setAttribute("movie-star", "Mike");
|
|
257
|
+
t.setAttribute("wibble", "Robert");
|
|
258
|
+
document.body.append(t);
|
|
259
|
+
await t.updateComplete;
|
|
260
|
+
expect(t.movieStar).toBe("Mike");
|
|
261
|
+
expect(t.getAttribute("movie-star")).toBe("Mike");
|
|
262
|
+
expect(t.wibble).toBe("Robert");
|
|
263
|
+
expect(t.getAttribute("wibble")).toBe("Robert");
|
|
264
|
+
});
|
|
148
265
|
//# sourceMappingURL=attribute.test.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"attribute.test.js","sourceRoot":"","sources":["../../src/decorators/attribute.test.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAClD,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AAEtC,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AACpD,OAAO,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"attribute.test.js","sourceRoot":"","sources":["../../src/decorators/attribute.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
import { Signal } from "@bodil/signal";
|
|
2
2
|
import type { Component } from "../component";
|
|
3
|
+
import type { ClassGetterDecoratorResult, ClassGetterDecoratorTarget } from "./types";
|
|
3
4
|
export declare const reactiveFields: unique symbol;
|
|
4
5
|
export declare function signalForObject(obj: object, key: string | symbol, createSignal: () => Signal<unknown>): Signal<unknown>;
|
|
5
6
|
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:
|
|
7
|
+
export declare function reactive<C extends object, T>(value: ClassGetterDecoratorTarget<C, T>, context: ClassGetterDecoratorContext<C, T>): ClassGetterDecoratorResult<C, T>;
|
|
7
8
|
export declare function reactive<C extends Component, T>(value: undefined, context: ClassFieldDecoratorContext<C, T>): undefined;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"reactive.js","sourceRoot":"","sources":["../../src/decorators/reactive.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"reactive.js","sourceRoot":"","sources":["../../src/decorators/reactive.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AAKvC,MAAM,CAAC,MAAM,cAAc,GAAG,MAAM,CAAC,gBAAgB,CAAC,CAAC;AAEvD,MAAM,WAAW,GAAG,IAAI,OAAO,EAAgD,CAAC;AAEhF,MAAM,UAAU,eAAe,CAC3B,GAAW,EACX,GAAoB,EACpB,YAAmC;IAEnC,IAAI,IAAI,GAAG,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAChC,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;QACrB,IAAI,GAAG,EAAE,CAAC;QACV,WAAW,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;IAC/B,CAAC;IACD,IAAI,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,GAAG,CAAC,EAAE,CAAC;QAC3B,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC;IACrB,CAAC;IACD,MAAM,GAAG,GAAG,YAAY,EAAE,CAAC;IAC3B,IAAI,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC;IAChB,OAAO,GAAG,CAAC;AACf,CAAC;AAcD,MAAM,UAAU,QAAQ,CACpB,KAAiE,EACjE,OAGsC;IAEtC,QAAQ,OAAO,CAAC,IAAI,EAAE,CAAC;QACnB,KAAK,UAAU,CAAC,CAAC,CAAC;YACd,MAAM,MAAM,GAAG,CAAC,GAAW,EAAE,EAAE,CAC3B,eAAe,CAAC,GAAG,EAAE,OAAO,CAAC,IAAI,EAAE,GAAG,EAAE,CACpC,MAAM,CAAE,KAAkD,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE;gBACtE,MAAM,EAAE,MAAM,CAAC,EAAE;aACpB,CAAC,CACc,CAAC;YACzB,OAAO;gBACH,GAAG;oBACC,OAAO,MAAM,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,CAAC;gBAC9B,CAAC;gBACD,GAAG,CAAC,KAAQ;oBACR,MAAM,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;gBAC5B,CAAC;aACJ,CAAC;QACN,CAAC;QAED,KAAK,QAAQ,CAAC,CAAC,CAAC;YACZ,MAAM,MAAM,GAAG,CAAC,GAAW,EAAE,EAAE,CAC3B,eAAe,CAAC,GAAG,EAAE,OAAO,CAAC,IAAI,EAAE,GAAG,EAAE,CACpC,MAAM,CAAC,QAAQ,CAAC,GAAG,EAAE,CAAE,KAAiB,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,EAAE,CAAC,CAC7E,CAAC;YACN,OAAO,SAAS,GAAG;gBACf,OAAO,MAAM,CAAC,IAAI,CAAC,CAAC,GAAG,EAAO,CAAC;YACnC,CAAC,CAAC;QACN,CAAC;QAED,KAAK,OAAO,CAAC,CAAC,CAAC;YACX,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAC,KAAK,IAAI,GAAG,EAAmB,CAAC;YAC/D,OAAO,CAAC,QAAQ,CAAC,cAAc,CAA0B,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;YAC7E,OAAO,SAAS,CAAC;QACrB,CAAC;IACL,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export type ClassGetterDecoratorTarget<_C, T> = () => T;
|
|
2
|
+
export type ClassGetterDecoratorResult<_C, T> = (() => T) | void;
|
|
3
|
+
export type ClassSetterDecoratorTarget<_C, T> = (value: T) => void;
|
|
4
|
+
export type ClassSetterDecoratorResult<_C, T> = ((value: T) => void) | void;
|
|
5
|
+
export type ClassAccessorDecoratorFunction<C, T> = (value: ClassAccessorDecoratorTarget<C, T>, context: ClassAccessorDecoratorContext<C, T>) => ClassAccessorDecoratorResult<C, T>;
|
|
6
|
+
export type ClassGetterDecoratorFunction<C, T> = (value: ClassGetterDecoratorTarget<C, T>, context: ClassGetterDecoratorContext<C, T>) => ClassGetterDecoratorResult<C, T>;
|
|
7
|
+
export type ClassSetterDecoratorFunction<C, T> = (value: ClassSetterDecoratorTarget<C, T>, context: ClassSetterDecoratorContext<C, T>) => ClassSetterDecoratorResult<C, T>;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/decorators/types.ts"],"names":[],"mappings":""}
|
package/package.json
CHANGED
package/src/component.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { isIterable, isNullish } from "@bodil/core/assert";
|
|
2
2
|
import { DisposableContext, toDisposable, type Disposifiable } from "@bodil/core/disposable";
|
|
3
3
|
import { Signal } from "@bodil/signal";
|
|
4
4
|
import {
|
|
@@ -16,13 +16,7 @@ import {
|
|
|
16
16
|
} from "lit";
|
|
17
17
|
import type { Constructor } from "type-fest";
|
|
18
18
|
|
|
19
|
-
import {
|
|
20
|
-
attributeConfig,
|
|
21
|
-
detectAttributeType,
|
|
22
|
-
fromAttribute,
|
|
23
|
-
toAttribute,
|
|
24
|
-
type AttributeConfig,
|
|
25
|
-
} from "./decorators/attribute";
|
|
19
|
+
import { attributeConfig, fromAttribute, type AttributeConfig } from "./decorators/attribute";
|
|
26
20
|
import { connectedJobs } from "./decorators/connect";
|
|
27
21
|
import { reactiveFields, signalForObject } from "./decorators/reactive";
|
|
28
22
|
import { requiredProperties } from "./decorators/require";
|
|
@@ -39,7 +33,13 @@ import {
|
|
|
39
33
|
} from "./slot";
|
|
40
34
|
|
|
41
35
|
export type { ReactiveController, ReactiveControllerHost } from "lit";
|
|
42
|
-
export {
|
|
36
|
+
export {
|
|
37
|
+
attribute,
|
|
38
|
+
attributeGetter,
|
|
39
|
+
attributeSetter,
|
|
40
|
+
type AttributeOptions,
|
|
41
|
+
type AttributeGetterSetterOptions,
|
|
42
|
+
} from "./decorators/attribute";
|
|
43
43
|
export {
|
|
44
44
|
connect,
|
|
45
45
|
connectEffect,
|
|
@@ -112,6 +112,7 @@ export abstract class Component
|
|
|
112
112
|
#firstUpdate = false;
|
|
113
113
|
#initialised = false;
|
|
114
114
|
#viewTransitionRequested = false;
|
|
115
|
+
#ignoreAttributeUpdates: number;
|
|
115
116
|
|
|
116
117
|
readonly renderRoot: ShadowRoot | HTMLElement = this.createRenderRoot();
|
|
117
118
|
|
|
@@ -179,10 +180,11 @@ export abstract class Component
|
|
|
179
180
|
constructor() {
|
|
180
181
|
super();
|
|
181
182
|
|
|
183
|
+
this.#ignoreAttributeUpdates = 1;
|
|
184
|
+
|
|
182
185
|
// set up reactive fields, because decorators can't do this themselves
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
>) ?? []) {
|
|
186
|
+
const fields = this.constructor[Symbol.metadata]?.[reactiveFields] ?? [];
|
|
187
|
+
for (const field of fields as Iterable<string | symbol>) {
|
|
186
188
|
const sig = signalForObject(this, field, () =>
|
|
187
189
|
Signal(undefined, { equals: Object.is }),
|
|
188
190
|
) as Signal.State<unknown>;
|
|
@@ -203,6 +205,7 @@ export abstract class Component
|
|
|
203
205
|
init.call(this);
|
|
204
206
|
}
|
|
205
207
|
|
|
208
|
+
this.#ignoreAttributeUpdates--;
|
|
206
209
|
this.#initialised = false;
|
|
207
210
|
}
|
|
208
211
|
|
|
@@ -211,14 +214,6 @@ export abstract class Component
|
|
|
211
214
|
this.#controllers.forEach((c) => c.hostConnected?.());
|
|
212
215
|
this.#rootPart?.setConnected(true);
|
|
213
216
|
|
|
214
|
-
for (const [key, config] of (
|
|
215
|
-
this.constructor as typeof Component
|
|
216
|
-
).attributeConfig.entries()) {
|
|
217
|
-
if (config.reflect) {
|
|
218
|
-
this.syncAttribute(key, config);
|
|
219
|
-
}
|
|
220
|
-
}
|
|
221
|
-
|
|
222
217
|
for (const job of connectedJobs(this)) {
|
|
223
218
|
const result = job.call(this);
|
|
224
219
|
const items = isNullish(result)
|
|
@@ -260,43 +255,28 @@ export abstract class Component
|
|
|
260
255
|
this.#connectedContext.dispose();
|
|
261
256
|
}
|
|
262
257
|
|
|
258
|
+
setAttributeQuietly(name: string, value: string | null) {
|
|
259
|
+
this.#ignoreAttributeUpdates++;
|
|
260
|
+
if (value === null) {
|
|
261
|
+
this.removeAttribute(name);
|
|
262
|
+
} else {
|
|
263
|
+
this.setAttribute(name, value);
|
|
264
|
+
}
|
|
265
|
+
this.#ignoreAttributeUpdates--;
|
|
266
|
+
}
|
|
267
|
+
|
|
263
268
|
protected attributeChangedCallback(
|
|
264
269
|
name: string,
|
|
265
270
|
old: string | null,
|
|
266
271
|
valueString: string | null,
|
|
267
272
|
) {
|
|
268
|
-
if (old === valueString) {
|
|
273
|
+
if (this.#ignoreAttributeUpdates > 0 || old === valueString) {
|
|
269
274
|
return;
|
|
270
275
|
}
|
|
271
276
|
const attrConfig = (this.constructor as typeof Component).attributeConfig.get(name);
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
present(
|
|
276
|
-
attrConfig.type,
|
|
277
|
-
`@attribute decorator for ${this.constructor.name}.${name} needs a type declaration, eg. @attribute({type: String})`,
|
|
278
|
-
),
|
|
279
|
-
);
|
|
280
|
-
this[attrConfig.property as keyof this] = value as any;
|
|
281
|
-
}
|
|
282
|
-
|
|
283
|
-
private syncAttribute(name: string, config?: AttributeConfig) {
|
|
284
|
-
if (this.isConnected) {
|
|
285
|
-
config ??= (this.constructor as typeof Component).attributeConfig.get(name);
|
|
286
|
-
assert(config !== undefined);
|
|
287
|
-
if (config.reflect) {
|
|
288
|
-
const realValue = this[config.property as keyof this];
|
|
289
|
-
config.type ??= detectAttributeType(realValue);
|
|
290
|
-
const value = toAttribute(realValue, present(config.type));
|
|
291
|
-
const oldValue = this.getAttribute(name);
|
|
292
|
-
if (value !== oldValue) {
|
|
293
|
-
if (value === null) {
|
|
294
|
-
this.removeAttribute(name);
|
|
295
|
-
} else {
|
|
296
|
-
this.setAttribute(name, value);
|
|
297
|
-
}
|
|
298
|
-
}
|
|
299
|
-
}
|
|
277
|
+
if (attrConfig !== undefined) {
|
|
278
|
+
const value = fromAttribute(valueString, attrConfig.type);
|
|
279
|
+
this[attrConfig.property as keyof this] = value as any;
|
|
300
280
|
}
|
|
301
281
|
}
|
|
302
282
|
|
|
@@ -3,6 +3,7 @@ import { expect, test } from "vitest";
|
|
|
3
3
|
|
|
4
4
|
import { attribute, Component } from "../component";
|
|
5
5
|
import { Signal } from "@bodil/signal";
|
|
6
|
+
import { attributeGetter, attributeSetter } from "./attribute";
|
|
6
7
|
|
|
7
8
|
test("@attribute", async () => {
|
|
8
9
|
@customElement("attribute-test-class")
|
|
@@ -75,3 +76,78 @@ test("@attribute", async () => {
|
|
|
75
76
|
expect(t.hide).toBe("yes");
|
|
76
77
|
expect(t.getAttribute("hide")).toBe("yes");
|
|
77
78
|
});
|
|
79
|
+
|
|
80
|
+
test("@attribute getter/setter", async () => {
|
|
81
|
+
@customElement("attribute-getter-test-class")
|
|
82
|
+
class AttributeGetterTestClass extends Component {
|
|
83
|
+
#value = "Mike";
|
|
84
|
+
@attributeGetter get value(): string {
|
|
85
|
+
return this.#value;
|
|
86
|
+
}
|
|
87
|
+
@attributeSetter set value(value: string) {
|
|
88
|
+
this.#value = value;
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
#synced = "Mike";
|
|
92
|
+
@attributeGetter({ reflect: false }) get synced(): string {
|
|
93
|
+
return this.#synced;
|
|
94
|
+
}
|
|
95
|
+
@attributeSetter({ reflect: false }) set synced(value: string) {
|
|
96
|
+
this.#synced = value;
|
|
97
|
+
this.setAttributeQuietly("synced", value);
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
const t = document.createElement("attribute-getter-test-class") as AttributeGetterTestClass;
|
|
102
|
+
document.body.append(t);
|
|
103
|
+
await t.updateComplete;
|
|
104
|
+
|
|
105
|
+
expect(t.value).toBe("Mike");
|
|
106
|
+
expect(t.getAttribute("value")).toBeNull();
|
|
107
|
+
|
|
108
|
+
t.setAttribute("value", "Joe");
|
|
109
|
+
expect(t.value).toBe("Joe");
|
|
110
|
+
expect(t.getAttribute("value")).toBe("Joe");
|
|
111
|
+
|
|
112
|
+
t.value = "Robert";
|
|
113
|
+
expect(t.value).toBe("Robert");
|
|
114
|
+
expect(t.getAttribute("value")).toBe("Joe");
|
|
115
|
+
|
|
116
|
+
expect(t.synced).toBe("Mike");
|
|
117
|
+
expect(t.getAttribute("synced")).toBeNull();
|
|
118
|
+
|
|
119
|
+
t.setAttribute("synced", "Joe");
|
|
120
|
+
expect(t.synced).toBe("Joe");
|
|
121
|
+
expect(t.getAttribute("synced")).toBe("Joe");
|
|
122
|
+
|
|
123
|
+
t.synced = "Robert";
|
|
124
|
+
expect(t.synced).toBe("Robert");
|
|
125
|
+
expect(t.getAttribute("synced")).toBe("Robert");
|
|
126
|
+
});
|
|
127
|
+
|
|
128
|
+
test("@attribute init ordering", async () => {
|
|
129
|
+
@customElement("attribute-init-test-class")
|
|
130
|
+
class AttributeInitTestClass extends Component {
|
|
131
|
+
@attribute accessor movieStar = "Joe";
|
|
132
|
+
|
|
133
|
+
#wibble = "Joe";
|
|
134
|
+
@attributeGetter get wibble(): string {
|
|
135
|
+
return this.#wibble;
|
|
136
|
+
}
|
|
137
|
+
@attributeSetter set wibble(value: string) {
|
|
138
|
+
this.#wibble = value;
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
const t = document.createElement("attribute-init-test-class") as AttributeInitTestClass;
|
|
143
|
+
t.setAttribute("movie-star", "Mike");
|
|
144
|
+
t.setAttribute("wibble", "Robert");
|
|
145
|
+
document.body.append(t);
|
|
146
|
+
await t.updateComplete;
|
|
147
|
+
|
|
148
|
+
expect(t.movieStar).toBe("Mike");
|
|
149
|
+
expect(t.getAttribute("movie-star")).toBe("Mike");
|
|
150
|
+
|
|
151
|
+
expect(t.wibble).toBe("Robert");
|
|
152
|
+
expect(t.getAttribute("wibble")).toBe("Robert");
|
|
153
|
+
});
|
|
@@ -1,25 +1,42 @@
|
|
|
1
1
|
/* eslint-disable @typescript-eslint/unified-signatures */
|
|
2
2
|
|
|
3
|
-
import { isNullish, unreachable } from "@bodil/core/assert";
|
|
3
|
+
import { isDeepEqual, isNullish, present, unreachable } from "@bodil/core/assert";
|
|
4
|
+
import { None, Some, type Option } from "@bodil/opt";
|
|
4
5
|
import { Signal } from "@bodil/signal";
|
|
5
6
|
|
|
6
7
|
import type { Component } from "../component";
|
|
7
8
|
import { signalForObject } from "./reactive";
|
|
9
|
+
import type {
|
|
10
|
+
ClassAccessorDecoratorFunction,
|
|
11
|
+
ClassGetterDecoratorFunction,
|
|
12
|
+
ClassGetterDecoratorResult,
|
|
13
|
+
ClassGetterDecoratorTarget,
|
|
14
|
+
ClassSetterDecoratorFunction,
|
|
15
|
+
ClassSetterDecoratorResult,
|
|
16
|
+
ClassSetterDecoratorTarget,
|
|
17
|
+
} from "./types";
|
|
8
18
|
|
|
9
19
|
export const attributeConfig = Symbol("attributeConfig");
|
|
10
20
|
|
|
11
21
|
export type AttributeType = typeof String | typeof Number | typeof Boolean;
|
|
12
22
|
|
|
13
|
-
export type
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
23
|
+
export type AttributeGetterSetterOptions = {
|
|
24
|
+
type?: AttributeType;
|
|
25
|
+
name?: string;
|
|
26
|
+
};
|
|
27
|
+
|
|
28
|
+
export type AttributeOptions = AttributeGetterSetterOptions & {
|
|
29
|
+
reflect?: boolean;
|
|
30
|
+
reactive?: boolean;
|
|
17
31
|
};
|
|
18
32
|
|
|
19
33
|
export type AttributeConfig = {
|
|
20
|
-
type: AttributeType
|
|
34
|
+
type: AttributeType;
|
|
21
35
|
property: string;
|
|
22
|
-
|
|
36
|
+
name: string;
|
|
37
|
+
reflect: boolean;
|
|
38
|
+
reactive: boolean;
|
|
39
|
+
};
|
|
23
40
|
|
|
24
41
|
export function toAttribute(value: unknown, type: AttributeType): string | null {
|
|
25
42
|
if (isNullish(value)) {
|
|
@@ -67,46 +84,102 @@ export function fromAttribute(
|
|
|
67
84
|
}
|
|
68
85
|
}
|
|
69
86
|
|
|
70
|
-
export function detectAttributeType(value: unknown): AttributeType | undefined {
|
|
71
|
-
switch (typeof value) {
|
|
72
|
-
case "string":
|
|
73
|
-
return String;
|
|
74
|
-
case "number":
|
|
75
|
-
return Number;
|
|
76
|
-
case "boolean":
|
|
77
|
-
return Boolean;
|
|
78
|
-
default:
|
|
79
|
-
return undefined;
|
|
80
|
-
}
|
|
81
|
-
}
|
|
82
|
-
|
|
83
87
|
function toKebabCase(s: string): string {
|
|
84
88
|
return s.replace(/((?<=[a-z\d])[A-Z]|(?<=[A-Z\d])[A-Z](?=[a-z]))/g, "-$1").toLowerCase();
|
|
85
89
|
}
|
|
86
90
|
|
|
91
|
+
type AttributeDecoratorTarget<C, T> =
|
|
92
|
+
| ClassAccessorDecoratorTarget<C, T>
|
|
93
|
+
| ClassGetterDecoratorTarget<C, T>
|
|
94
|
+
| ClassSetterDecoratorTarget<C, T>;
|
|
95
|
+
|
|
96
|
+
type AttributeDecoratorResult<C, T> =
|
|
97
|
+
| ClassAccessorDecoratorResult<C, T>
|
|
98
|
+
| ClassGetterDecoratorResult<C, T>
|
|
99
|
+
| ClassSetterDecoratorResult<C, T>;
|
|
100
|
+
|
|
101
|
+
type AttributeDecoratorContext<C, T> =
|
|
102
|
+
| ClassAccessorDecoratorContext<C, T>
|
|
103
|
+
| ClassGetterDecoratorContext<C, T>
|
|
104
|
+
| ClassSetterDecoratorContext<C, T>;
|
|
105
|
+
|
|
106
|
+
type AttributeDecoratorFunction<C, T> =
|
|
107
|
+
| ClassAccessorDecoratorFunction<C, T>
|
|
108
|
+
| ClassGetterDecoratorFunction<C, T>
|
|
109
|
+
| ClassSetterDecoratorFunction<C, T>;
|
|
110
|
+
|
|
111
|
+
// Getter with number type
|
|
112
|
+
export function attributeGetter<C extends Component, T extends number | undefined>(
|
|
113
|
+
options: AttributeOptions & { type: typeof Number },
|
|
114
|
+
): ClassGetterDecoratorFunction<C, T>;
|
|
115
|
+
|
|
116
|
+
// Getter with boolean type
|
|
117
|
+
export function attributeGetter<C extends Component, T extends boolean | undefined>(
|
|
118
|
+
options: AttributeOptions & { type: typeof Boolean },
|
|
119
|
+
): ClassGetterDecoratorFunction<C, T>;
|
|
120
|
+
|
|
121
|
+
// Getter with string type
|
|
122
|
+
export function attributeGetter<C extends Component, T extends string | undefined>(
|
|
123
|
+
options: AttributeOptions,
|
|
124
|
+
): ClassGetterDecoratorFunction<C, T>;
|
|
125
|
+
|
|
126
|
+
// Getter with no options
|
|
127
|
+
export function attributeGetter<C extends Component, T extends string | undefined>(
|
|
128
|
+
value: ClassGetterDecoratorTarget<C, T>,
|
|
129
|
+
context: ClassGetterDecoratorContext<C, T>,
|
|
130
|
+
): ClassGetterDecoratorResult<C, T>;
|
|
131
|
+
|
|
132
|
+
export function attributeGetter<C extends Component, T>(
|
|
133
|
+
valueOrOptions?: ClassGetterDecoratorTarget<C, T> | Partial<AttributeGetterSetterOptions>,
|
|
134
|
+
context?: ClassGetterDecoratorContext<C, T>,
|
|
135
|
+
): ClassGetterDecoratorResult<C, T> | ClassGetterDecoratorFunction<C, T> {
|
|
136
|
+
//@ts-ignore
|
|
137
|
+
return attribute(valueOrOptions, context);
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
// Setter with number type
|
|
141
|
+
export function attributeSetter<C extends Component, T extends number | undefined>(
|
|
142
|
+
options: AttributeOptions & { type: typeof Number },
|
|
143
|
+
): ClassSetterDecoratorFunction<C, T>;
|
|
144
|
+
|
|
145
|
+
// Setter with boolean type
|
|
146
|
+
export function attributeSetter<C extends Component, T extends boolean | undefined>(
|
|
147
|
+
options: AttributeOptions & { type: typeof Boolean },
|
|
148
|
+
): ClassSetterDecoratorFunction<C, T>;
|
|
149
|
+
|
|
150
|
+
// Setter with string type
|
|
151
|
+
export function attributeSetter<C extends Component, T extends string | undefined>(
|
|
152
|
+
options: AttributeOptions,
|
|
153
|
+
): ClassSetterDecoratorFunction<C, T>;
|
|
154
|
+
|
|
155
|
+
// Setter with no options
|
|
156
|
+
export function attributeSetter<C extends Component, T extends string | undefined>(
|
|
157
|
+
value: ClassSetterDecoratorTarget<C, T>,
|
|
158
|
+
context: ClassSetterDecoratorContext<C, T>,
|
|
159
|
+
): ClassSetterDecoratorResult<C, T>;
|
|
160
|
+
|
|
161
|
+
export function attributeSetter<C extends Component, T>(
|
|
162
|
+
valueOrOptions?: ClassSetterDecoratorTarget<C, T> | Partial<AttributeGetterSetterOptions>,
|
|
163
|
+
context?: ClassSetterDecoratorContext<C, T>,
|
|
164
|
+
): ClassSetterDecoratorResult<C, T> | ClassSetterDecoratorFunction<C, T> {
|
|
165
|
+
//@ts-ignore
|
|
166
|
+
return attribute(valueOrOptions, context);
|
|
167
|
+
}
|
|
168
|
+
|
|
87
169
|
// Accessor with number type
|
|
88
170
|
export function attribute<C extends Component, T extends number | undefined>(
|
|
89
|
-
options:
|
|
90
|
-
):
|
|
91
|
-
value: ClassAccessorDecoratorTarget<C, T>,
|
|
92
|
-
context: ClassAccessorDecoratorContext<C, T>,
|
|
93
|
-
) => ClassAccessorDecoratorResult<C, T>;
|
|
171
|
+
options: AttributeOptions & { type: typeof Number },
|
|
172
|
+
): ClassAccessorDecoratorFunction<C, T>;
|
|
94
173
|
|
|
95
174
|
// Accessor with boolean type
|
|
96
175
|
export function attribute<C extends Component, T extends boolean | undefined>(
|
|
97
|
-
options:
|
|
98
|
-
):
|
|
99
|
-
value: ClassAccessorDecoratorTarget<C, T>,
|
|
100
|
-
context: ClassAccessorDecoratorContext<C, T>,
|
|
101
|
-
) => ClassAccessorDecoratorResult<C, T>;
|
|
176
|
+
options: AttributeOptions & { type: typeof Boolean },
|
|
177
|
+
): ClassAccessorDecoratorFunction<C, T>;
|
|
102
178
|
|
|
103
179
|
// Accessor with string type
|
|
104
180
|
export function attribute<C extends Component, T extends string | undefined>(
|
|
105
|
-
options:
|
|
106
|
-
):
|
|
107
|
-
value: ClassAccessorDecoratorTarget<C, T>,
|
|
108
|
-
context: ClassAccessorDecoratorContext<C, T>,
|
|
109
|
-
) => ClassAccessorDecoratorResult<C, T>;
|
|
181
|
+
options: AttributeOptions,
|
|
182
|
+
): ClassAccessorDecoratorFunction<C, T>;
|
|
110
183
|
|
|
111
184
|
// Accessor with no options
|
|
112
185
|
export function attribute<C extends Component, T extends string | undefined>(
|
|
@@ -115,22 +188,18 @@ export function attribute<C extends Component, T extends string | undefined>(
|
|
|
115
188
|
): ClassAccessorDecoratorResult<C, T>;
|
|
116
189
|
|
|
117
190
|
export function attribute<C extends Component, T extends string | number | boolean | undefined>(
|
|
118
|
-
valueOrOptions?:
|
|
119
|
-
context?:
|
|
120
|
-
):
|
|
121
|
-
| ClassAccessorDecoratorResult<C, T>
|
|
122
|
-
| ((
|
|
123
|
-
value: ClassAccessorDecoratorTarget<C, T>,
|
|
124
|
-
context: ClassAccessorDecoratorContext<C, T>,
|
|
125
|
-
) => ClassAccessorDecoratorResult<C, T>) {
|
|
191
|
+
valueOrOptions?: AttributeDecoratorTarget<C, T> | AttributeOptions,
|
|
192
|
+
context?: AttributeDecoratorContext<C, T>,
|
|
193
|
+
): AttributeDecoratorResult<C, T> | AttributeDecoratorFunction<C, T> {
|
|
126
194
|
if (context !== undefined) {
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
T
|
|
130
|
-
>;
|
|
195
|
+
//@ts-ignore
|
|
196
|
+
return attribute({})(valueOrOptions, context);
|
|
131
197
|
}
|
|
132
198
|
|
|
133
|
-
return (
|
|
199
|
+
return (
|
|
200
|
+
value: AttributeDecoratorTarget<C, T>,
|
|
201
|
+
context: AttributeDecoratorContext<C, T>,
|
|
202
|
+
): any => {
|
|
134
203
|
if (typeof context.name !== "string") {
|
|
135
204
|
throw new TypeError(
|
|
136
205
|
`Can't declare a ${typeof context.name} as an attribute (${JSON.stringify(context.name)})`,
|
|
@@ -141,57 +210,102 @@ export function attribute<C extends Component, T extends string | number | boole
|
|
|
141
210
|
...{
|
|
142
211
|
type: String,
|
|
143
212
|
property: context.name,
|
|
144
|
-
reactive:
|
|
145
|
-
reflect:
|
|
213
|
+
reactive: context.kind === "accessor",
|
|
214
|
+
reflect: context.kind === "accessor",
|
|
215
|
+
name: toKebabCase(context.name),
|
|
146
216
|
},
|
|
147
|
-
...((valueOrOptions as
|
|
217
|
+
...((valueOrOptions as AttributeOptions) ?? {}),
|
|
148
218
|
};
|
|
149
219
|
let attrs = context.metadata[attributeConfig] as Map<string, AttributeConfig>;
|
|
150
220
|
if (attrs === undefined) {
|
|
151
221
|
context.metadata[attributeConfig] = attrs = new Map();
|
|
152
222
|
}
|
|
153
|
-
|
|
154
|
-
|
|
223
|
+
if (context.kind === "getter" || context.kind === "setter") {
|
|
224
|
+
const oldOpts = attrs.get(options.name);
|
|
225
|
+
if (oldOpts !== undefined && !isDeepEqual(oldOpts, options)) {
|
|
226
|
+
throw new TypeError(
|
|
227
|
+
`Attribute options for ${JSON.stringify(context.name)} must be identical for getters and setters`,
|
|
228
|
+
);
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
attrs.set(options.name, options);
|
|
155
232
|
|
|
233
|
+
if (context.kind === "accessor") {
|
|
234
|
+
return accessor(options, context, value as ClassAccessorDecoratorTarget<C, T>);
|
|
235
|
+
}
|
|
236
|
+
|
|
237
|
+
// ensure getters/setters aren't configured with reactive or reflect
|
|
156
238
|
if (options.reactive) {
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
},
|
|
167
|
-
set(newValue: T) {
|
|
168
|
-
options.type ??= detectAttributeType(newValue);
|
|
169
|
-
getSig(this).set(newValue);
|
|
170
|
-
if (options.reflect) {
|
|
171
|
-
(this as any).syncAttribute(key);
|
|
172
|
-
}
|
|
173
|
-
},
|
|
174
|
-
init(newValue: T): T {
|
|
175
|
-
options.type ??= detectAttributeType(newValue);
|
|
176
|
-
return newValue;
|
|
177
|
-
},
|
|
178
|
-
} as ClassAccessorDecoratorResult<C, T>;
|
|
239
|
+
throw new TypeError(
|
|
240
|
+
`Getter/setter attributes cannot be declared with reactive: true (on ${JSON.stringify(context.name)})`,
|
|
241
|
+
);
|
|
242
|
+
}
|
|
243
|
+
|
|
244
|
+
if (options.reflect) {
|
|
245
|
+
throw new TypeError(
|
|
246
|
+
`Getter/setter attributes cannot be declared with reflect: true (on ${JSON.stringify(context.name)})`,
|
|
247
|
+
);
|
|
179
248
|
}
|
|
249
|
+
};
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
function syncAttribute<C extends Component, T>(
|
|
253
|
+
target: C,
|
|
254
|
+
options: AttributeConfig,
|
|
255
|
+
value: T,
|
|
256
|
+
force: boolean = false,
|
|
257
|
+
) {
|
|
258
|
+
const key = present(options.name);
|
|
259
|
+
const attributeValue = toAttribute(value, present(options.type));
|
|
260
|
+
if (force || attributeValue !== target.getAttribute(key)) {
|
|
261
|
+
target.setAttributeQuietly(key, attributeValue);
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
|
|
265
|
+
function accessor<C extends Component, T>(
|
|
266
|
+
options: AttributeConfig,
|
|
267
|
+
context: ClassAccessorDecoratorContext<C, T>,
|
|
268
|
+
value: ClassAccessorDecoratorTarget<C, T>,
|
|
269
|
+
): ClassAccessorDecoratorResult<C, T> {
|
|
270
|
+
let initValue: Option<T> = None;
|
|
271
|
+
const init = function init(this: C, value: T): T {
|
|
272
|
+
initValue = Some(value);
|
|
273
|
+
if (options.reflect) {
|
|
274
|
+
syncAttribute(this, options, value, true);
|
|
275
|
+
}
|
|
276
|
+
return value;
|
|
277
|
+
};
|
|
278
|
+
|
|
279
|
+
if (options.reactive) {
|
|
280
|
+
const getSig = (obj: object) =>
|
|
281
|
+
signalForObject(obj, context.name, () =>
|
|
282
|
+
Signal(initValue.unwrapExact(), {
|
|
283
|
+
equals: Object.is,
|
|
284
|
+
}),
|
|
285
|
+
) as Signal.State<T>;
|
|
180
286
|
return {
|
|
181
287
|
get(): T {
|
|
182
|
-
return
|
|
288
|
+
return getSig(this).get();
|
|
183
289
|
},
|
|
184
290
|
set(newValue: T) {
|
|
185
|
-
|
|
186
|
-
value.set.call(this, newValue);
|
|
291
|
+
getSig(this).set(newValue);
|
|
187
292
|
if (options.reflect) {
|
|
188
|
-
(this
|
|
293
|
+
syncAttribute(this, options, newValue);
|
|
189
294
|
}
|
|
190
295
|
},
|
|
191
|
-
init
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
296
|
+
init,
|
|
297
|
+
};
|
|
298
|
+
}
|
|
299
|
+
return {
|
|
300
|
+
get(): T {
|
|
301
|
+
return value.get.call(this);
|
|
302
|
+
},
|
|
303
|
+
set(newValue: T) {
|
|
304
|
+
value.set.call(this, newValue);
|
|
305
|
+
if (options.reflect) {
|
|
306
|
+
syncAttribute(this, options, newValue);
|
|
307
|
+
}
|
|
308
|
+
},
|
|
309
|
+
init,
|
|
196
310
|
};
|
|
197
311
|
}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { Signal } from "@bodil/signal";
|
|
2
2
|
|
|
3
3
|
import type { Component } from "../component";
|
|
4
|
+
import type { ClassGetterDecoratorResult, ClassGetterDecoratorTarget } from "./types";
|
|
4
5
|
|
|
5
6
|
export const reactiveFields = Symbol("reactiveFields");
|
|
6
7
|
|
|
@@ -29,9 +30,9 @@ export function reactive<C extends object, T>(
|
|
|
29
30
|
context: ClassAccessorDecoratorContext<C, T>,
|
|
30
31
|
): ClassAccessorDecoratorResult<C, T>;
|
|
31
32
|
export function reactive<C extends object, T>(
|
|
32
|
-
value:
|
|
33
|
+
value: ClassGetterDecoratorTarget<C, T>,
|
|
33
34
|
context: ClassGetterDecoratorContext<C, T>,
|
|
34
|
-
):
|
|
35
|
+
): ClassGetterDecoratorResult<C, T>;
|
|
35
36
|
export function reactive<C extends Component, T>(
|
|
36
37
|
value: undefined,
|
|
37
38
|
context: ClassFieldDecoratorContext<C, T>,
|
|
@@ -42,7 +43,7 @@ export function reactive<C extends object, T>(
|
|
|
42
43
|
| ClassAccessorDecoratorContext<C, T>
|
|
43
44
|
| ClassGetterDecoratorContext<C, T>
|
|
44
45
|
| ClassFieldDecoratorContext<C, T>,
|
|
45
|
-
): ClassAccessorDecoratorResult<C, T> |
|
|
46
|
+
): ClassAccessorDecoratorResult<C, T> | ClassGetterDecoratorResult<C, T> | undefined {
|
|
46
47
|
switch (context.kind) {
|
|
47
48
|
case "accessor": {
|
|
48
49
|
const getSig = (obj: object) =>
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
export type ClassGetterDecoratorTarget<_C, T> = () => T;
|
|
2
|
+
export type ClassGetterDecoratorResult<_C, T> = (() => T) | void;
|
|
3
|
+
|
|
4
|
+
export type ClassSetterDecoratorTarget<_C, T> = (value: T) => void;
|
|
5
|
+
export type ClassSetterDecoratorResult<_C, T> = ((value: T) => void) | void;
|
|
6
|
+
|
|
7
|
+
export type ClassAccessorDecoratorFunction<C, T> = (
|
|
8
|
+
value: ClassAccessorDecoratorTarget<C, T>,
|
|
9
|
+
context: ClassAccessorDecoratorContext<C, T>,
|
|
10
|
+
) => ClassAccessorDecoratorResult<C, T>;
|
|
11
|
+
|
|
12
|
+
export type ClassGetterDecoratorFunction<C, T> = (
|
|
13
|
+
value: ClassGetterDecoratorTarget<C, T>,
|
|
14
|
+
context: ClassGetterDecoratorContext<C, T>,
|
|
15
|
+
) => ClassGetterDecoratorResult<C, T>;
|
|
16
|
+
|
|
17
|
+
export type ClassSetterDecoratorFunction<C, T> = (
|
|
18
|
+
value: ClassSetterDecoratorTarget<C, T>,
|
|
19
|
+
context: ClassSetterDecoratorContext<C, T>,
|
|
20
|
+
) => ClassSetterDecoratorResult<C, T>;
|