element-vir 12.0.0 → 12.0.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/declarative-element/declarative-element.d.ts +1 -1
- package/dist/declarative-element/define-element-no-inputs.js +2 -13
- package/dist/declarative-element/directives/assign.directive.d.ts +1 -1
- package/dist/declarative-element/properties/assign-inputs.js +8 -0
- package/dist/declarative-element/properties/async-state.d.ts +9 -7
- package/dist/declarative-element/properties/async-state.js +46 -42
- package/dist/declarative-element/properties/element-updater-proxy.js +31 -14
- package/dist/declarative-element/render-callback.js +1 -7
- package/package.json +16 -13
|
@@ -28,7 +28,7 @@ export declare abstract class DeclarativeElement<TagNameGeneric extends CustomEl
|
|
|
28
28
|
abstract readonly instanceState: MaybeAsyncStateToSync<StateInitMaybeAsyncGeneric>;
|
|
29
29
|
abstract readonly asyncStateHandlerMap: AsyncStateHandlerMap<StateInitMaybeAsyncGeneric>;
|
|
30
30
|
abstract readonly instanceInputs: InputsGeneric;
|
|
31
|
-
abstract assignInputs(inputs: InputsGeneric): void;
|
|
31
|
+
abstract assignInputs(inputs: {} extends Required<InputsGeneric> ? never : InputsGeneric): void;
|
|
32
32
|
abstract haveInputsBeenSet: boolean;
|
|
33
33
|
abstract markInputsAsHavingBeenSet(): void;
|
|
34
34
|
abstract readonly definition: DeclarativeElementDefinition<TagNameGeneric, InputsGeneric, StateInitMaybeAsyncGeneric, EventsInitGeneric, HostClassKeys, CssVarKeys, RenderOutputGeneric>;
|
|
@@ -11,7 +11,6 @@ import { IgnoreInputsNotBeenSetBeforeRenderWarningSymbol, defaultDeclarativeElem
|
|
|
11
11
|
import { assign } from './directives/assign.directive';
|
|
12
12
|
import { hasDeclarativeElementParent } from './has-declarative-element-parent';
|
|
13
13
|
import { assignInputs, markInputsAsHavingBeenSet } from './properties/assign-inputs';
|
|
14
|
-
import { toAsyncStateHandlerMap } from './properties/async-state';
|
|
15
14
|
import { createCssVarNamesMap, createCssVarValuesMap } from './properties/css-vars';
|
|
16
15
|
import { createEventDescriptorMap } from './properties/element-events';
|
|
17
16
|
import { createElementUpdaterProxy } from './properties/element-updater-proxy';
|
|
@@ -109,24 +108,14 @@ export function defineElementNoInputs(initInput) {
|
|
|
109
108
|
this.haveInputsBeenSet = false;
|
|
110
109
|
// this is set below in Object.defineProperties
|
|
111
110
|
this.definition = {};
|
|
112
|
-
this.asyncStateHandlerMap =
|
|
111
|
+
this.asyncStateHandlerMap = {};
|
|
113
112
|
this.instanceInputs = createElementUpdaterProxy(this, false);
|
|
114
113
|
this.instanceState = createElementUpdaterProxy(this, true);
|
|
115
114
|
const stateInit = initInput.stateInit ||
|
|
116
115
|
{};
|
|
117
116
|
getObjectTypedKeys(stateInit).forEach((stateKey) => {
|
|
118
117
|
property()(this, stateKey);
|
|
119
|
-
|
|
120
|
-
if (asyncStateClassInstance) {
|
|
121
|
-
this.instanceState[stateKey] = asyncStateClassInstance.getValue();
|
|
122
|
-
asyncStateClassInstance.addSettleListener(() => {
|
|
123
|
-
this[stateKey] =
|
|
124
|
-
asyncStateClassInstance.getValue();
|
|
125
|
-
});
|
|
126
|
-
}
|
|
127
|
-
else {
|
|
128
|
-
this.instanceState[stateKey] = stateInit[stateKey];
|
|
129
|
-
}
|
|
118
|
+
this.instanceState[stateKey] = stateInit[stateKey];
|
|
130
119
|
});
|
|
131
120
|
this.definition = anonymousClass;
|
|
132
121
|
}
|
|
@@ -4,6 +4,6 @@ export type ElementDefinitionWithInputsType<InputsType extends PropertyInitMapBa
|
|
|
4
4
|
inputsType: InputsType;
|
|
5
5
|
};
|
|
6
6
|
/** Assign an object matching an element's inputs to its inputs. */
|
|
7
|
-
export declare function assign<DeclarativeElementGeneric extends ElementDefinitionWithInputsType>(declarativeElement: DeclarativeElementGeneric, inputsObject: DeclarativeElementGeneric['inputsType']): DirectiveResult;
|
|
7
|
+
export declare function assign<DeclarativeElementGeneric extends ElementDefinitionWithInputsType>(declarativeElement: DeclarativeElementGeneric, inputsObject: {} extends Required<DeclarativeElementGeneric['inputsType']> ? never : DeclarativeElementGeneric['inputsType']): DirectiveResult;
|
|
8
8
|
export declare function assign<DeclarativeElementGeneric extends ElementDefinitionWithInputsType>(inputsObject: Record<string, any>): DirectiveResult;
|
|
9
9
|
export declare function assignInputsObject<DeclarativeElementDefinitionGeneric extends ElementDefinitionWithInputsType>(expectedElementConstructor: DeclarativeElementDefinitionGeneric | undefined, element: Element, assignmentObject: DeclarativeElementDefinitionGeneric['inputsType']): void;
|
|
@@ -1,7 +1,15 @@
|
|
|
1
1
|
import { getObjectTypedKeys } from '@augment-vir/common';
|
|
2
2
|
import { property } from 'lit/decorators.js';
|
|
3
3
|
export function assignInputs(element, inputs) {
|
|
4
|
+
const instanceState = element.instanceState;
|
|
4
5
|
getObjectTypedKeys(inputs).forEach((key) => {
|
|
6
|
+
if (instanceState && key in instanceState) {
|
|
7
|
+
throw new Error(`Cannot set input '${key}' on '${element.tagName}'. '${element.tagName}' already has a state property with the same name.`);
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* No need to check if it's already a property or not, as the property function already
|
|
11
|
+
* makes that check.
|
|
12
|
+
*/
|
|
5
13
|
property()(element, key);
|
|
6
14
|
if ('instanceInputs' in element) {
|
|
7
15
|
element.instanceInputs[key] = inputs[key];
|
|
@@ -2,6 +2,7 @@ import { JsonCompatibleValue, UnPromise } from '@augment-vir/common';
|
|
|
2
2
|
import { PickAndBlockOthers } from '../../augments/type';
|
|
3
3
|
import { PropertyInitMapBase } from './element-properties';
|
|
4
4
|
export type AsyncState<ValueGeneric> = Error | UnPromise<ValueGeneric> | Promise<UnPromise<ValueGeneric>>;
|
|
5
|
+
declare const notSetSymbol: unique symbol;
|
|
5
6
|
export declare function isRenderReady<T>(asyncStateInput: AsyncState<T>): asyncStateInput is UnPromise<T>;
|
|
6
7
|
type AllSetValueProperties<ValueGeneric> = {
|
|
7
8
|
/** Set a new value directly without using any promises. */
|
|
@@ -28,20 +29,21 @@ export type AsyncStateInputs<PropertyMapInit extends PropertyInitMapBase> = {
|
|
|
28
29
|
[Prop in keyof PropertyMapInit]: PropertyMapInit[Prop] extends AsyncStateHandler<infer ValueGeneric> | AsyncStateInit<infer ValueGeneric> ? AsyncStateSetValue<ValueGeneric> : PropertyMapInit[Prop];
|
|
29
30
|
};
|
|
30
31
|
export type AsyncStateHandlerMap<OriginalObjectGeneric extends PropertyInitMapBase> = Partial<Record<keyof OriginalObjectGeneric, AsyncStateHandler<any>>>;
|
|
31
|
-
export
|
|
32
|
+
export type AsyncStateHandlerListener<ValueGeneric> = (handler: AsyncStateHandler<ValueGeneric>) => void;
|
|
32
33
|
export declare class AsyncStateHandler<ValueGeneric> {
|
|
33
34
|
#private;
|
|
34
35
|
readonly asyncMarkerSymbol: symbol;
|
|
35
|
-
constructor(initialValue: Promise<UnPromise<ValueGeneric>> | UnPromise<ValueGeneric> |
|
|
36
|
+
constructor(initialValue: Promise<UnPromise<ValueGeneric>> | UnPromise<ValueGeneric> | typeof notSetSymbol | AsyncStateInit<ValueGeneric>, listener: AsyncStateHandlerListener<ValueGeneric>);
|
|
37
|
+
resetValue(rawValue: Promise<UnPromise<ValueGeneric>> | UnPromise<ValueGeneric> | typeof notSetSymbol | AsyncStateInit<ValueGeneric>): void;
|
|
36
38
|
setValue(setInputs: AsyncStateSetValue<ValueGeneric>): void;
|
|
37
39
|
getValue(): AsyncState<ValueGeneric>;
|
|
38
|
-
addSettleListener(callback:
|
|
39
|
-
removeSettleListener(callback:
|
|
40
|
+
addSettleListener(callback: AsyncStateHandlerListener<ValueGeneric>): void;
|
|
41
|
+
removeSettleListener(callback: AsyncStateHandlerListener<ValueGeneric>): void;
|
|
40
42
|
}
|
|
41
43
|
export declare class AsyncStateInit<ValueGeneric> {
|
|
42
|
-
readonly initialValue
|
|
43
|
-
constructor(initialValue
|
|
44
|
+
readonly initialValue: Promise<UnPromise<ValueGeneric>> | UnPromise<ValueGeneric> | typeof notSetSymbol;
|
|
45
|
+
constructor(initialValue: Promise<UnPromise<ValueGeneric>> | UnPromise<ValueGeneric> | typeof notSetSymbol);
|
|
44
46
|
readonly asyncMarkerSymbol: symbol;
|
|
45
47
|
}
|
|
46
|
-
export declare function asyncState<ValueGeneric>(
|
|
48
|
+
export declare function asyncState<ValueGeneric>(...args: [Promise<UnPromise<ValueGeneric>> | UnPromise<ValueGeneric>] | []): AsyncStateInit<ValueGeneric>;
|
|
47
49
|
export {};
|
|
@@ -9,9 +9,10 @@ var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (
|
|
|
9
9
|
if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it");
|
|
10
10
|
return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;
|
|
11
11
|
};
|
|
12
|
-
var _AsyncStateHandler_instances, _AsyncStateHandler_lastTrigger, _AsyncStateHandler_resolutionValue, _AsyncStateHandler_rejectionError, _AsyncStateHandler_listeners, _AsyncStateHandler_lastSetPromise, _AsyncStateHandler_waitingForValuePromise, _AsyncStateHandler_fireListeners, _AsyncStateHandler_setPromise, _AsyncStateHandler_resolveValue;
|
|
13
|
-
import { areJsonEqual, createDeferredPromiseWrapper, ensureError,
|
|
12
|
+
var _AsyncStateHandler_instances, _AsyncStateHandler_lastTrigger, _AsyncStateHandler_resolutionValue, _AsyncStateHandler_rejectionError, _AsyncStateHandler_listeners, _AsyncStateHandler_lastSetPromise, _AsyncStateHandler_waitingForValuePromise, _AsyncStateHandler_fireListeners, _AsyncStateHandler_setPromise, _AsyncStateHandler_resolveValue, _AsyncStateHandler_resetWaitingForValuePromise;
|
|
13
|
+
import { areJsonEqual, createDeferredPromiseWrapper, ensureError, isLengthAtLeast, isPromiseLike, } from '@augment-vir/common';
|
|
14
14
|
const asyncMarkerSymbol = Symbol('element-vir-async-state-marker');
|
|
15
|
+
const notSetSymbol = Symbol('not set');
|
|
15
16
|
export function isRenderReady(asyncStateInput) {
|
|
16
17
|
if (asyncStateInput instanceof Error) {
|
|
17
18
|
return false;
|
|
@@ -23,35 +24,30 @@ export function isRenderReady(asyncStateInput) {
|
|
|
23
24
|
return true;
|
|
24
25
|
}
|
|
25
26
|
}
|
|
26
|
-
export function toAsyncStateHandlerMap(propertyInitMap) {
|
|
27
|
-
if (!propertyInitMap) {
|
|
28
|
-
return {};
|
|
29
|
-
}
|
|
30
|
-
const asyncStateInit = filterObject(propertyInitMap, (key, value) => {
|
|
31
|
-
return value instanceof AsyncStateInit;
|
|
32
|
-
});
|
|
33
|
-
const asyncStateHandlers = mapObjectValues(asyncStateInit, (key, value) => {
|
|
34
|
-
return new AsyncStateHandler(value.initialValue);
|
|
35
|
-
});
|
|
36
|
-
return asyncStateHandlers;
|
|
37
|
-
}
|
|
38
|
-
const notSetSymbol = Symbol('not set');
|
|
39
27
|
export class AsyncStateHandler {
|
|
40
|
-
constructor(initialValue) {
|
|
28
|
+
constructor(initialValue, listener) {
|
|
41
29
|
_AsyncStateHandler_instances.add(this);
|
|
42
30
|
_AsyncStateHandler_lastTrigger.set(this, notSetSymbol);
|
|
43
|
-
_AsyncStateHandler_resolutionValue.set(this,
|
|
44
|
-
_AsyncStateHandler_rejectionError.set(this,
|
|
31
|
+
_AsyncStateHandler_resolutionValue.set(this, notSetSymbol);
|
|
32
|
+
_AsyncStateHandler_rejectionError.set(this, notSetSymbol);
|
|
45
33
|
_AsyncStateHandler_listeners.set(this, []);
|
|
46
34
|
_AsyncStateHandler_lastSetPromise.set(this, void 0);
|
|
47
35
|
_AsyncStateHandler_waitingForValuePromise.set(this, createDeferredPromiseWrapper());
|
|
48
36
|
this.asyncMarkerSymbol = asyncMarkerSymbol;
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
37
|
+
this.addSettleListener(listener);
|
|
38
|
+
this.resetValue(initialValue);
|
|
39
|
+
}
|
|
40
|
+
resetValue(rawValue) {
|
|
41
|
+
if (rawValue instanceof AsyncStateInit) {
|
|
42
|
+
rawValue = rawValue.initialValue;
|
|
43
|
+
}
|
|
44
|
+
__classPrivateFieldGet(this, _AsyncStateHandler_instances, "m", _AsyncStateHandler_resetWaitingForValuePromise).call(this);
|
|
45
|
+
if (rawValue !== notSetSymbol) {
|
|
46
|
+
if (rawValue instanceof Promise) {
|
|
47
|
+
this.setValue({ newPromise: rawValue });
|
|
52
48
|
}
|
|
53
49
|
else {
|
|
54
|
-
this.setValue({ resolvedValue:
|
|
50
|
+
this.setValue({ resolvedValue: rawValue });
|
|
55
51
|
}
|
|
56
52
|
}
|
|
57
53
|
}
|
|
@@ -73,26 +69,31 @@ export class AsyncStateHandler {
|
|
|
73
69
|
else if ('resolvedValue' in setInputs) {
|
|
74
70
|
__classPrivateFieldGet(this, _AsyncStateHandler_instances, "m", _AsyncStateHandler_resolveValue).call(this, setInputs.resolvedValue);
|
|
75
71
|
}
|
|
76
|
-
else {
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
__classPrivateFieldGet(this, _AsyncStateHandler_waitingForValuePromise, "f").reject('Canceled by force update');
|
|
82
|
-
}
|
|
83
|
-
__classPrivateFieldSet(this, _AsyncStateHandler_waitingForValuePromise, createDeferredPromiseWrapper(), "f");
|
|
84
|
-
// force a re-render
|
|
85
|
-
__classPrivateFieldGet(this, _AsyncStateHandler_instances, "m", _AsyncStateHandler_fireListeners).call(this);
|
|
72
|
+
else if ('forceUpdate' in setInputs) {
|
|
73
|
+
__classPrivateFieldSet(this, _AsyncStateHandler_lastTrigger, notSetSymbol, "f");
|
|
74
|
+
__classPrivateFieldSet(this, _AsyncStateHandler_resolutionValue, notSetSymbol, "f");
|
|
75
|
+
if (!__classPrivateFieldGet(this, _AsyncStateHandler_waitingForValuePromise, "f").isSettled()) {
|
|
76
|
+
__classPrivateFieldGet(this, _AsyncStateHandler_waitingForValuePromise, "f").reject('Canceled by force update');
|
|
86
77
|
}
|
|
78
|
+
__classPrivateFieldGet(this, _AsyncStateHandler_instances, "m", _AsyncStateHandler_resetWaitingForValuePromise).call(this);
|
|
79
|
+
// force a re-render
|
|
80
|
+
__classPrivateFieldGet(this, _AsyncStateHandler_instances, "m", _AsyncStateHandler_fireListeners).call(this);
|
|
81
|
+
}
|
|
82
|
+
else {
|
|
83
|
+
this.resetValue(setInputs);
|
|
87
84
|
}
|
|
88
85
|
}
|
|
89
86
|
getValue() {
|
|
90
87
|
if (__classPrivateFieldGet(this, _AsyncStateHandler_waitingForValuePromise, "f").isSettled()) {
|
|
91
|
-
if (__classPrivateFieldGet(this, _AsyncStateHandler_rejectionError, "f")) {
|
|
88
|
+
if (__classPrivateFieldGet(this, _AsyncStateHandler_rejectionError, "f") !== notSetSymbol) {
|
|
92
89
|
return __classPrivateFieldGet(this, _AsyncStateHandler_rejectionError, "f");
|
|
93
90
|
}
|
|
94
|
-
else
|
|
91
|
+
else if (__classPrivateFieldGet(this, _AsyncStateHandler_resolutionValue, "f") === notSetSymbol) {
|
|
92
|
+
throw new Error('Promise says it has settled but resolution value was not set!');
|
|
93
|
+
}
|
|
94
|
+
else {
|
|
95
95
|
return __classPrivateFieldGet(this, _AsyncStateHandler_resolutionValue, "f");
|
|
96
|
+
}
|
|
96
97
|
}
|
|
97
98
|
else {
|
|
98
99
|
return __classPrivateFieldGet(this, _AsyncStateHandler_waitingForValuePromise, "f").promise;
|
|
@@ -107,18 +108,18 @@ export class AsyncStateHandler {
|
|
|
107
108
|
}
|
|
108
109
|
_AsyncStateHandler_lastTrigger = new WeakMap(), _AsyncStateHandler_resolutionValue = new WeakMap(), _AsyncStateHandler_rejectionError = new WeakMap(), _AsyncStateHandler_listeners = new WeakMap(), _AsyncStateHandler_lastSetPromise = new WeakMap(), _AsyncStateHandler_waitingForValuePromise = new WeakMap(), _AsyncStateHandler_instances = new WeakSet(), _AsyncStateHandler_fireListeners = function _AsyncStateHandler_fireListeners() {
|
|
109
110
|
__classPrivateFieldGet(this, _AsyncStateHandler_listeners, "f").forEach((listener) => {
|
|
110
|
-
listener();
|
|
111
|
+
listener(this);
|
|
111
112
|
});
|
|
112
113
|
}, _AsyncStateHandler_setPromise = function _AsyncStateHandler_setPromise(newPromise) {
|
|
113
114
|
if (newPromise === __classPrivateFieldGet(this, _AsyncStateHandler_lastSetPromise, "f")) {
|
|
114
115
|
// abort setting the promise if we already have set this promise
|
|
115
116
|
return;
|
|
116
117
|
}
|
|
117
|
-
__classPrivateFieldSet(this, _AsyncStateHandler_resolutionValue,
|
|
118
|
-
__classPrivateFieldSet(this, _AsyncStateHandler_rejectionError,
|
|
118
|
+
__classPrivateFieldSet(this, _AsyncStateHandler_resolutionValue, notSetSymbol, "f");
|
|
119
|
+
__classPrivateFieldSet(this, _AsyncStateHandler_rejectionError, notSetSymbol, "f");
|
|
119
120
|
__classPrivateFieldSet(this, _AsyncStateHandler_lastSetPromise, newPromise, "f");
|
|
120
121
|
if (__classPrivateFieldGet(this, _AsyncStateHandler_waitingForValuePromise, "f").isSettled()) {
|
|
121
|
-
|
|
122
|
+
__classPrivateFieldGet(this, _AsyncStateHandler_instances, "m", _AsyncStateHandler_resetWaitingForValuePromise).call(this);
|
|
122
123
|
}
|
|
123
124
|
newPromise
|
|
124
125
|
.then((value) => {
|
|
@@ -143,14 +144,16 @@ _AsyncStateHandler_lastTrigger = new WeakMap(), _AsyncStateHandler_resolutionVal
|
|
|
143
144
|
});
|
|
144
145
|
}, _AsyncStateHandler_resolveValue = function _AsyncStateHandler_resolveValue(value) {
|
|
145
146
|
if (value !== __classPrivateFieldGet(this, _AsyncStateHandler_resolutionValue, "f")) {
|
|
146
|
-
__classPrivateFieldSet(this, _AsyncStateHandler_rejectionError,
|
|
147
|
+
__classPrivateFieldSet(this, _AsyncStateHandler_rejectionError, notSetSymbol, "f");
|
|
147
148
|
__classPrivateFieldSet(this, _AsyncStateHandler_resolutionValue, value, "f");
|
|
148
149
|
if (__classPrivateFieldGet(this, _AsyncStateHandler_waitingForValuePromise, "f").isSettled()) {
|
|
149
|
-
|
|
150
|
+
__classPrivateFieldGet(this, _AsyncStateHandler_instances, "m", _AsyncStateHandler_resetWaitingForValuePromise).call(this);
|
|
150
151
|
}
|
|
151
152
|
__classPrivateFieldGet(this, _AsyncStateHandler_waitingForValuePromise, "f").resolve(value);
|
|
152
153
|
__classPrivateFieldGet(this, _AsyncStateHandler_instances, "m", _AsyncStateHandler_fireListeners).call(this);
|
|
153
154
|
}
|
|
155
|
+
}, _AsyncStateHandler_resetWaitingForValuePromise = function _AsyncStateHandler_resetWaitingForValuePromise() {
|
|
156
|
+
__classPrivateFieldSet(this, _AsyncStateHandler_waitingForValuePromise, createDeferredPromiseWrapper(), "f");
|
|
154
157
|
};
|
|
155
158
|
export class AsyncStateInit {
|
|
156
159
|
constructor(initialValue) {
|
|
@@ -158,6 +161,7 @@ export class AsyncStateInit {
|
|
|
158
161
|
this.asyncMarkerSymbol = asyncMarkerSymbol;
|
|
159
162
|
}
|
|
160
163
|
}
|
|
161
|
-
export function asyncState(
|
|
162
|
-
|
|
164
|
+
export function asyncState(...args) {
|
|
165
|
+
const initValue = isLengthAtLeast(args, 1) ? args[0] : notSetSymbol;
|
|
166
|
+
return new AsyncStateInit(initValue);
|
|
163
167
|
}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { AsyncStateHandler, AsyncStateInit } from './async-state';
|
|
1
2
|
function assertValidPropertyName(propKey, element, elementTagName) {
|
|
2
3
|
if (typeof propKey !== 'string' && typeof propKey !== 'number' && typeof propKey !== 'symbol') {
|
|
3
4
|
throw new Error(`Property name must be a string, got type '${typeof propKey}' from: '${String(propKey)}' for '${elementTagName.toLowerCase()}'`);
|
|
@@ -13,36 +14,52 @@ export function createElementUpdaterProxy(element, verifyExists) {
|
|
|
13
14
|
* back in here.
|
|
14
15
|
*/
|
|
15
16
|
const elementAsProps = element;
|
|
16
|
-
function valueGetter(target,
|
|
17
|
+
function valueGetter(target, propertyKey) {
|
|
17
18
|
if (verifyExists) {
|
|
18
|
-
assertValidPropertyName(
|
|
19
|
+
assertValidPropertyName(propertyKey, element, element.tagName);
|
|
19
20
|
}
|
|
20
|
-
const asyncState = element.asyncStateHandlerMap[
|
|
21
|
+
const asyncState = element.asyncStateHandlerMap[propertyKey];
|
|
21
22
|
if (asyncState) {
|
|
22
23
|
return asyncState.getValue();
|
|
23
24
|
}
|
|
24
25
|
else {
|
|
25
|
-
return elementAsProps[
|
|
26
|
+
return elementAsProps[propertyKey];
|
|
26
27
|
}
|
|
27
28
|
}
|
|
28
29
|
const propsProxy = new Proxy({}, {
|
|
29
30
|
get: valueGetter,
|
|
30
|
-
set: (target,
|
|
31
|
+
set: (target, propertyKey, newValue) => {
|
|
31
32
|
if (verifyExists) {
|
|
32
|
-
assertValidPropertyName(
|
|
33
|
+
assertValidPropertyName(propertyKey, element, element.tagName);
|
|
33
34
|
}
|
|
34
35
|
/**
|
|
35
|
-
*
|
|
36
|
-
*
|
|
37
|
-
*
|
|
36
|
+
* We need to at least set the property on target so we can detect it in "ownKeys" and
|
|
37
|
+
* "getOwnPropertyDescriptor". We don't need duplicates of the values stored in target
|
|
38
|
+
* but doing so makes console logging more effective it actually works).
|
|
38
39
|
*/
|
|
39
|
-
target[
|
|
40
|
-
const
|
|
41
|
-
if
|
|
42
|
-
|
|
40
|
+
target[propertyKey] = newValue;
|
|
41
|
+
const existingAsyncStateHandler = element.asyncStateHandlerMap[propertyKey];
|
|
42
|
+
// if we're creating a new async prop
|
|
43
|
+
if (newValue instanceof AsyncStateInit) {
|
|
44
|
+
if (existingAsyncStateHandler) {
|
|
45
|
+
existingAsyncStateHandler.resetValue(newValue);
|
|
46
|
+
}
|
|
47
|
+
else {
|
|
48
|
+
const newHandler = new AsyncStateHandler(newValue, (handler) => {
|
|
49
|
+
// set the prop directly on the element so that lit catches updates
|
|
50
|
+
element[propertyKey] =
|
|
51
|
+
handler.getValue();
|
|
52
|
+
});
|
|
53
|
+
element.asyncStateHandlerMap[propertyKey] = newHandler;
|
|
54
|
+
}
|
|
43
55
|
}
|
|
44
56
|
else {
|
|
45
|
-
|
|
57
|
+
if (existingAsyncStateHandler) {
|
|
58
|
+
existingAsyncStateHandler.setValue(newValue);
|
|
59
|
+
}
|
|
60
|
+
else {
|
|
61
|
+
elementAsProps[propertyKey] = newValue;
|
|
62
|
+
}
|
|
46
63
|
}
|
|
47
64
|
return true;
|
|
48
65
|
},
|
|
@@ -3,13 +3,7 @@ export function createRenderParams(element, eventsMap) {
|
|
|
3
3
|
function updateState(newStatePartial) {
|
|
4
4
|
getObjectTypedKeys(newStatePartial).forEach((stateKey) => {
|
|
5
5
|
const newValue = newStatePartial[stateKey];
|
|
6
|
-
|
|
7
|
-
if (asyncState) {
|
|
8
|
-
asyncState.setValue(newValue);
|
|
9
|
-
}
|
|
10
|
-
else {
|
|
11
|
-
element.instanceState[stateKey] = newValue;
|
|
12
|
-
}
|
|
6
|
+
element.instanceState[stateKey] = newValue;
|
|
13
7
|
});
|
|
14
8
|
}
|
|
15
9
|
const renderParams = {
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "element-vir",
|
|
3
|
-
"version": "12.0.
|
|
3
|
+
"version": "12.0.2",
|
|
4
4
|
"keywords": [
|
|
5
5
|
"custom",
|
|
6
6
|
"web",
|
|
@@ -39,28 +39,30 @@
|
|
|
39
39
|
"test:types": "tsc --noEmit"
|
|
40
40
|
},
|
|
41
41
|
"dependencies": {
|
|
42
|
-
"@augment-vir/browser": "^13.
|
|
43
|
-
"@augment-vir/common": "^13.
|
|
42
|
+
"@augment-vir/browser": "^13.3.0",
|
|
43
|
+
"@augment-vir/common": "^13.3.0",
|
|
44
44
|
"lit": "2.7.2"
|
|
45
45
|
},
|
|
46
46
|
"devDependencies": {
|
|
47
|
-
"@augment-vir/browser-testing": "^13.
|
|
48
|
-
"@augment-vir/node-js": "^13.
|
|
47
|
+
"@augment-vir/browser-testing": "^13.3.0",
|
|
48
|
+
"@augment-vir/node-js": "^13.3.0",
|
|
49
49
|
"@istanbuljs/nyc-config-typescript": "^1.0.2",
|
|
50
50
|
"@open-wc/testing": "^3.1.8",
|
|
51
51
|
"@types/mocha": "^10.0.1",
|
|
52
|
-
"@web/dev-server-esbuild": "^0.
|
|
53
|
-
"@web/test-runner": "^0.
|
|
54
|
-
"@web/test-runner-commands": "^0.
|
|
55
|
-
"@web/test-runner-playwright": "^0.
|
|
56
|
-
"@web/test-runner-visual-regression": "^0.
|
|
52
|
+
"@web/dev-server-esbuild": "^0.4.1",
|
|
53
|
+
"@web/test-runner": "^0.16.1",
|
|
54
|
+
"@web/test-runner-commands": "^0.7.0",
|
|
55
|
+
"@web/test-runner-playwright": "^0.10.0",
|
|
56
|
+
"@web/test-runner-visual-regression": "^0.8.0",
|
|
57
57
|
"ansi-colors": "^4.1.3",
|
|
58
58
|
"cspell": "^6.31.1",
|
|
59
|
+
"esbuild": "^0.17.18",
|
|
59
60
|
"istanbul-smart-text-reporter": "^1.1.1",
|
|
60
61
|
"markdown-code-example-inserter": "^0.3.0",
|
|
61
62
|
"mocha-spec-reporter-with-file-names": "^0.0.3",
|
|
63
|
+
"npm-check-updates": "^16.10.9",
|
|
62
64
|
"nyc": "^15.1.0",
|
|
63
|
-
"prettier": "^2.8.
|
|
65
|
+
"prettier": "^2.8.8",
|
|
64
66
|
"prettier-plugin-interpolated-html-tags": "^0.0.3",
|
|
65
67
|
"prettier-plugin-jsdoc": "^0.4.2",
|
|
66
68
|
"prettier-plugin-multiline-arrays": "^1.1.3",
|
|
@@ -71,7 +73,8 @@
|
|
|
71
73
|
"ts-node": "^10.9.1",
|
|
72
74
|
"type-fest": "^3.8.0",
|
|
73
75
|
"typescript": "^5.0.4",
|
|
74
|
-
"virmator": "^6.4.
|
|
75
|
-
"vite": "^4.
|
|
76
|
+
"virmator": "^6.4.3",
|
|
77
|
+
"vite": "^4.3.1",
|
|
78
|
+
"vite-tsconfig-paths": "^4.2.0"
|
|
76
79
|
}
|
|
77
80
|
}
|