@openelement/element 0.41.0-alpha.1
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/LICENSE +21 -0
- package/README.md +60 -0
- package/package.json +30 -0
- package/src/define-element.d.ts +9 -0
- package/src/define-element.js +43 -0
- package/src/error-boundary.d.ts +54 -0
- package/src/error-boundary.js +125 -0
- package/src/index.d.ts +33 -0
- package/src/index.js +29 -0
- package/src/open-element-hydration.js +120 -0
- package/src/open-element-render.js +91 -0
- package/src/open-element.d.ts +176 -0
- package/src/open-element.js +419 -0
- package/src/types.d.ts +8 -0
- package/src/types.js +4 -0
|
@@ -0,0 +1,419 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @openelement/element - OpenElement base class.
|
|
3
|
+
*
|
|
4
|
+
* Zero-dependency Custom Element base class providing:
|
|
5
|
+
* - Declarative Shadow DOM (DSD) detection at upgrade time
|
|
6
|
+
* - Client-Side Rendering (CSR) fallback when no DSD content exists
|
|
7
|
+
* - StyleSheet (SSR-safe CSSStyleSheet) via adoptedStyleSheets
|
|
8
|
+
* - Declarative event binding via html template @click / @keydown etc.
|
|
9
|
+
* - Signal-driven fine-grained DOM patching via data-signal markers
|
|
10
|
+
* - AbortController cleanup on disconnect
|
|
11
|
+
* - formAssociated + delegatesFocus support
|
|
12
|
+
*
|
|
13
|
+
* OpenElement extends HTMLElement directly - ZERO Lit dependency.
|
|
14
|
+
* Components return `render(): VNode | null`.
|
|
15
|
+
*
|
|
16
|
+
* Lifecycle:
|
|
17
|
+
* SSR: instantiate -> set props -> render() -> wrap in DSD template
|
|
18
|
+
* Client (DSD): browser attaches shadow root from DSD -> upgrade -> bind template events
|
|
19
|
+
* Client (CSR): connectedCallback -> createRenderRoot -> render into shadowRoot
|
|
20
|
+
*
|
|
21
|
+
* Usage (static DSD component):
|
|
22
|
+
* ```ts
|
|
23
|
+
* class MyCard extends OpenElement {
|
|
24
|
+
* static styles = myStyleSheet;
|
|
25
|
+
* render(): VNode {
|
|
26
|
+
* return <div class="card"><slot /></div>;
|
|
27
|
+
* }
|
|
28
|
+
* }
|
|
29
|
+
* customElements.define('my-card', MyCard);
|
|
30
|
+
* ```
|
|
31
|
+
*
|
|
32
|
+
* Usage (reactive DSD component):
|
|
33
|
+
* ```ts
|
|
34
|
+
* class MyToggle extends OpenElement {
|
|
35
|
+
* #active = signal(false);
|
|
36
|
+
* render() {
|
|
37
|
+
* return (
|
|
38
|
+
* <button onClick={() => this.#active.value = !this.#active.value}>
|
|
39
|
+
* {this.#active.value ? 'ON' : 'OFF'}
|
|
40
|
+
* </button>
|
|
41
|
+
* );
|
|
42
|
+
* }
|
|
43
|
+
* }
|
|
44
|
+
* ```
|
|
45
|
+
*
|
|
46
|
+
* @module @openelement/element/open-element
|
|
47
|
+
*/ import { formatError } from '@openelement/core/errors';
|
|
48
|
+
import { disposeStaticProps, handleStaticPropAttributeChange, initializeStaticProps, syncStaticPropsFromAttributes } from '@openelement/core/prop';
|
|
49
|
+
import { signal } from '@openelement/signal';
|
|
50
|
+
import { createLogger } from '@openelement/core/logger';
|
|
51
|
+
import { disposeRenderBindings, renderErrorFallback, renderIntoLightDom, renderIntoShadowRoot } from './open-element-render.js';
|
|
52
|
+
import { hydrateExistingDom, hydrateSignals } from './open-element-hydration.js';
|
|
53
|
+
/**
|
|
54
|
+
* SSR-safe base class for OpenElement.
|
|
55
|
+
*
|
|
56
|
+
* In browser: extends HTMLElement directly.
|
|
57
|
+
* In SSR: assigns a minimal stub to globalThis.HTMLElement so the entire
|
|
58
|
+
* dependency graph shares the same base class.
|
|
59
|
+
*/ const _Base = typeof HTMLElement !== 'undefined' ? HTMLElement : class {
|
|
60
|
+
hasAttribute(_name) {
|
|
61
|
+
return false;
|
|
62
|
+
}
|
|
63
|
+
getAttribute(_name) {
|
|
64
|
+
return null;
|
|
65
|
+
}
|
|
66
|
+
setAttribute(_name, _value) {}
|
|
67
|
+
removeAttribute(_name) {}
|
|
68
|
+
get tagName() {
|
|
69
|
+
return '';
|
|
70
|
+
}
|
|
71
|
+
get isConnected() {
|
|
72
|
+
return false;
|
|
73
|
+
}
|
|
74
|
+
};
|
|
75
|
+
// In SSR, assign globalThis.HTMLElement so other code can reference it
|
|
76
|
+
if (typeof HTMLElement === 'undefined') {
|
|
77
|
+
globalThis.HTMLElement = _Base;
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Zero-dependency Custom Element base class for DSD rendering.
|
|
81
|
+
*
|
|
82
|
+
* Provides DSD detection, CSR fallback, event hydration, and style management
|
|
83
|
+
* without any framework dependency (no Lit, no reactive-element).
|
|
84
|
+
*
|
|
85
|
+
* Subclasses MUST override `render(): VNode | null`.
|
|
86
|
+
*/ export class OpenElement extends _Base {
|
|
87
|
+
/** Component stylesheets (SSR-safe - StyleSheet delegates to native CSSStyleSheet in browser). */ static styles;
|
|
88
|
+
/** Rendering mode. Defaults to shadow/DSD; light DOM is explicit opt-in. */ static renderMode;
|
|
89
|
+
/** v0.25.0: Page head metadata. SSG reads this to inject <title> and <meta> tags. */ static head;
|
|
90
|
+
/** @internal — use openPipeline({ island: { upgradeStrategy } }) instead */ static client;
|
|
91
|
+
/**
|
|
92
|
+
* Attributes that trigger attributeChangedCallback.
|
|
93
|
+
* Subclasses override this to declare reactive attributes.
|
|
94
|
+
*/ static observedAttributes;
|
|
95
|
+
/**
|
|
96
|
+
* Whether to delegate focus within the shadow root.
|
|
97
|
+
* When true, attachShadow is called with `delegatesFocus: true`.
|
|
98
|
+
*/ static delegatesFocus;
|
|
99
|
+
/**
|
|
100
|
+
* Whether this element participates in form submission.
|
|
101
|
+
* When true, ElementInternals are attached in connectedCallback.
|
|
102
|
+
*/ static formAssociated;
|
|
103
|
+
/**
|
|
104
|
+
* Effect dispose tracking (ADR-0065).
|
|
105
|
+
* Replaces effectScope() — effects are created at top level
|
|
106
|
+
* so they fire on signal changes. Disposed as a batch in
|
|
107
|
+
* disconnectedCallback.
|
|
108
|
+
*/ #effectDisposers = new Set();
|
|
109
|
+
/** v0.28 (ADR-0067): Event listener cleanup tracking for _hydrateSignals(). */ #eventCleanups = [];
|
|
110
|
+
/** v0.28.1: Cached VNode from render() — avoids double-render mismatch between SSR and hydration. */ #vnodeCache = undefined;
|
|
111
|
+
#vnodeCacheValid = false;
|
|
112
|
+
/**
|
|
113
|
+
* Signal registry for attribute-based hydration (ADR-0065).
|
|
114
|
+
* Maps signal names → signal objects. Built by registerSignal()
|
|
115
|
+
* in component constructors, consumed during hydration.
|
|
116
|
+
*
|
|
117
|
+
* Exposed internally for render helper modules.
|
|
118
|
+
*/ signalRegistry = new Map();
|
|
119
|
+
/**
|
|
120
|
+
* Register a signal for hydration by name.
|
|
121
|
+
* Call in constructor: this.registerSignal('count', this.#count);
|
|
122
|
+
*/ registerSignal(name, sig) {
|
|
123
|
+
this.signalRegistry.set(name, sig);
|
|
124
|
+
}
|
|
125
|
+
/** Reactive route parameters Signal. Updates automatically on SPA navigation. */ #params = signal({});
|
|
126
|
+
/** Reactive route parameters. Updates automatically on SPA navigation. */ get params() {
|
|
127
|
+
return this.#params.value;
|
|
128
|
+
}
|
|
129
|
+
set params(value) {
|
|
130
|
+
this.#params.value = {
|
|
131
|
+
...value
|
|
132
|
+
};
|
|
133
|
+
}
|
|
134
|
+
/** ElementInternals for form-associated custom elements */ _internals;
|
|
135
|
+
/**
|
|
136
|
+
* Create or reuse the shadow root.
|
|
137
|
+
*
|
|
138
|
+
* DSD detection: if `this.shadowRoot` already exists and has nodes,
|
|
139
|
+
* the browser pre-populated it from a <template shadowrootmode> tag.
|
|
140
|
+
* In that case we mark `_dsdHydrated = true` and return the existing root.
|
|
141
|
+
*
|
|
142
|
+
* CSR fallback: if no shadow root exists, we call `attachShadow()`. If an
|
|
143
|
+
* empty shadow root already exists, we reuse it and let connectedCallback()
|
|
144
|
+
* populate it from render().
|
|
145
|
+
*
|
|
146
|
+
* @returns The existing or newly created ShadowRoot.
|
|
147
|
+
*/ createRenderRoot() {
|
|
148
|
+
const ctor = this.constructor;
|
|
149
|
+
if (ctor.renderMode === 'light') {
|
|
150
|
+
return this;
|
|
151
|
+
}
|
|
152
|
+
// DSD pre-populated shadow root detection
|
|
153
|
+
if (this.shadowRoot) {
|
|
154
|
+
this._applyStyles(ctor, this.shadowRoot);
|
|
155
|
+
return this.shadowRoot;
|
|
156
|
+
}
|
|
157
|
+
// CSR: create a new shadow root
|
|
158
|
+
const delegatesFocus = ctor.delegatesFocus ?? false;
|
|
159
|
+
const root = this.attachShadow({
|
|
160
|
+
mode: 'open',
|
|
161
|
+
delegatesFocus
|
|
162
|
+
});
|
|
163
|
+
// Apply static styles via adoptedStyleSheets
|
|
164
|
+
this._applyStyles(ctor, root);
|
|
165
|
+
return root;
|
|
166
|
+
}
|
|
167
|
+
/**
|
|
168
|
+
* Apply static styles to the shadow root via adoptedStyleSheets.
|
|
169
|
+
* Shared between CSR (createRenderRoot) and DSD (connectedCallback) paths.
|
|
170
|
+
*/ _applyStyles(ctor, root) {
|
|
171
|
+
const target = root ?? this.shadowRoot;
|
|
172
|
+
if (!target || !ctor.styles) return;
|
|
173
|
+
const sheets = Array.isArray(ctor.styles) ? ctor.styles : [
|
|
174
|
+
ctor.styles
|
|
175
|
+
];
|
|
176
|
+
if (sheets.length > 0) {
|
|
177
|
+
// StyleSheet delegates to native CSSStyleSheet in browser
|
|
178
|
+
// type-escape: adoptedStyleSheets may not be in the configured DOM lib
|
|
179
|
+
target.adoptedStyleSheets = sheets;
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
/**
|
|
183
|
+
* Lifecycle: called when the element is connected to the DOM.
|
|
184
|
+
*
|
|
185
|
+
* DSD path (_dsdHydrated = true):
|
|
186
|
+
* - Calls _hydrateEvents() to bind declarative events on existing DOM.
|
|
187
|
+
*
|
|
188
|
+
* CSR path (_dsdHydrated = false):
|
|
189
|
+
* - Calls createRenderRoot() if no shadow root exists.
|
|
190
|
+
* - Renders this.render() through the VNode DOM renderer.
|
|
191
|
+
*
|
|
192
|
+
* If formAssociated is true, ElementInternals are attached.
|
|
193
|
+
*/ connectedCallback() {
|
|
194
|
+
const ctor = this.constructor;
|
|
195
|
+
// v0.24.1 (ADR-0057): Initialize static props signals and accessors
|
|
196
|
+
initializeStaticProps(this);
|
|
197
|
+
syncStaticPropsFromAttributes(this);
|
|
198
|
+
const isLightDom = ctor.renderMode === 'light';
|
|
199
|
+
// Ensure render target exists and detect DSD pre-population
|
|
200
|
+
if (!this.shadowRoot && !isLightDom) {
|
|
201
|
+
this.createRenderRoot();
|
|
202
|
+
} else if (this.shadowRoot) {
|
|
203
|
+
// DSD path: shadow root already populated.
|
|
204
|
+
this.style.display = 'block';
|
|
205
|
+
this._applyStyles(ctor);
|
|
206
|
+
}
|
|
207
|
+
// Sync data-theme from document root
|
|
208
|
+
const docTheme = document.documentElement?.dataset?.theme;
|
|
209
|
+
if (docTheme && !this.hasAttribute('data-theme')) {
|
|
210
|
+
this.setAttribute('data-theme', docTheme);
|
|
211
|
+
}
|
|
212
|
+
// TG-01: Read route params from attribute if present.
|
|
213
|
+
// (SSR/SSG injects params as JS property via injectProps — setter handles it)
|
|
214
|
+
const attrParams = this.getAttribute('params');
|
|
215
|
+
if (attrParams) {
|
|
216
|
+
try {
|
|
217
|
+
this.#params.value = JSON.parse(attrParams);
|
|
218
|
+
} catch {}
|
|
219
|
+
}
|
|
220
|
+
// v0.25.0 (SOP-012): Unified render path — DSD and CSR both go through
|
|
221
|
+
// _renderOrHydrate(). The _dsdHydrated flag and _bindCurrentRenderTemplate()
|
|
222
|
+
// are removed. DSD pre-populated DOM is preserved; only events and signal
|
|
223
|
+
// subscriptions are added.
|
|
224
|
+
this._renderOrHydrate();
|
|
225
|
+
// v0.40.0: Client-side activation hook for framework hydration
|
|
226
|
+
this.clientActivate();
|
|
227
|
+
// Attach ElementInternals for form-associated custom elements
|
|
228
|
+
if (ctor.formAssociated && typeof this.attachInternals === 'function') {
|
|
229
|
+
this._internals = this.attachInternals();
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
/**
|
|
233
|
+
* v0.25.0 (SOP-012): Unified render path.
|
|
234
|
+
*/ _renderOrHydrate() {
|
|
235
|
+
try {
|
|
236
|
+
const ctor = this.constructor;
|
|
237
|
+
if (ctor.renderMode === 'light') {
|
|
238
|
+
this._renderIntoLightDom();
|
|
239
|
+
this.onCsrRendered();
|
|
240
|
+
return;
|
|
241
|
+
}
|
|
242
|
+
const isDsd = this.shadowRoot && this.shadowRoot.childNodes.length > 0;
|
|
243
|
+
if (isDsd) {
|
|
244
|
+
// DSD: DOM already correct — bind events via VNode walk
|
|
245
|
+
this._hydrateExistingDom();
|
|
246
|
+
this.onDsdHydrated();
|
|
247
|
+
} else if (this.shadowRoot) {
|
|
248
|
+
// CSR: full render from VNode
|
|
249
|
+
this._renderIntoShadowRoot();
|
|
250
|
+
this.onCsrRendered();
|
|
251
|
+
}
|
|
252
|
+
} catch (err) {
|
|
253
|
+
this._renderErrorFallback(err);
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
/**
|
|
257
|
+
* v0.28 (ADR-0067): Signal-native hydration.
|
|
258
|
+
*
|
|
259
|
+
* Replaces _walkAndBind() — reads data-signal markers
|
|
260
|
+
* from DSD shadow root and creates direct signal→DOM effect bindings.
|
|
261
|
+
* No position matching, no childNodes filtering, no VNode traversal.
|
|
262
|
+
*
|
|
263
|
+
* Effects are tracked in #effectDisposers for batch cleanup.
|
|
264
|
+
* VNode event marker listeners are tracked in #eventCleanups.
|
|
265
|
+
*
|
|
266
|
+
* Implementation lives in open-element-hydration.ts.
|
|
267
|
+
*/ _hydrateSignals() {
|
|
268
|
+
if (!this.shadowRoot) return;
|
|
269
|
+
hydrateSignals(this, this.shadowRoot, this.signalRegistry, this.#effectDisposers, this.#eventCleanups, this.#cacheAccess());
|
|
270
|
+
}
|
|
271
|
+
/**
|
|
272
|
+
* Hydrate DSD DOM with signal and event bindings.
|
|
273
|
+
*
|
|
274
|
+
* v0.28 (ADR-0067): Delegates to _hydrateSignals().
|
|
275
|
+
* _walkAndBind position matching is DELETED.
|
|
276
|
+
*
|
|
277
|
+
* Implementation lives in open-element-hydration.ts.
|
|
278
|
+
*/ _hydrateExistingDom() {
|
|
279
|
+
this.#eventCleanups = hydrateExistingDom(this, this.signalRegistry, this.#effectDisposers, this.#eventCleanups, this.#cacheAccess());
|
|
280
|
+
}
|
|
281
|
+
/**
|
|
282
|
+
* v0.23.0: Hook called after DSD hydration completes.
|
|
283
|
+
*
|
|
284
|
+
* Subclasses override this instead of relying on fragile
|
|
285
|
+
* `super.connectedCallback()` call order. At this point the
|
|
286
|
+
* shadow DOM is populated from DSD and declarative events
|
|
287
|
+
* (@click, @keydown) are bound.
|
|
288
|
+
*
|
|
289
|
+
* No-op by default.
|
|
290
|
+
*/ onDsdHydrated() {}
|
|
291
|
+
/**
|
|
292
|
+
* v0.23.0: Hook called after CSR first render completes.
|
|
293
|
+
*
|
|
294
|
+
* Subclasses override this for post-render initialization
|
|
295
|
+
* that depends on the shadow DOM being populated. At this
|
|
296
|
+
* point render() has been called and declarative events
|
|
297
|
+
* are bound.
|
|
298
|
+
*
|
|
299
|
+
* No-op by default.
|
|
300
|
+
*/ onCsrRendered() {}
|
|
301
|
+
/**
|
|
302
|
+
* v0.40.0: Client-side activation hook.
|
|
303
|
+
*
|
|
304
|
+
* Called once after the element is connected, the shadow root
|
|
305
|
+
* is ready, and any DSD hydration or CSR rendering has completed.
|
|
306
|
+
* This is the right place for framework hydration (Preact, React,
|
|
307
|
+
* Vue, Lit) to take over the shadow DOM.
|
|
308
|
+
*
|
|
309
|
+
* Default implementation is a no-op. Subclasses override this to
|
|
310
|
+
* hydrate or render framework components into the shadow root.
|
|
311
|
+
*/ clientActivate() {
|
|
312
|
+
// default no-op
|
|
313
|
+
}
|
|
314
|
+
/**
|
|
315
|
+
* Hook called when the unified client render/hydrate path throws.
|
|
316
|
+
* Subclasses may return a VNode fallback.
|
|
317
|
+
*/ onRenderError(error) {
|
|
318
|
+
createLogger('dsd').error(`<${this.tagName.toLowerCase()}> render/hydrate failed: ${formatError(error)}`);
|
|
319
|
+
return null;
|
|
320
|
+
}
|
|
321
|
+
_renderErrorFallback(error) {
|
|
322
|
+
this.#eventCleanups = renderErrorFallback(this, error, this.#effectDisposers, this.#eventCleanups, (err)=>this.onRenderError(err));
|
|
323
|
+
}
|
|
324
|
+
/**
|
|
325
|
+
* Lifecycle: called when the element is disconnected from the DOM.
|
|
326
|
+
* Aborts all hydration event listeners for cleanup.
|
|
327
|
+
*/ disconnectedCallback() {
|
|
328
|
+
this.#eventCleanups = disposeRenderBindings(this.#effectDisposers, this.#eventCleanups);
|
|
329
|
+
disposeStaticProps(this);
|
|
330
|
+
}
|
|
331
|
+
// v0.28 (ADR-0067): Effect + event lifecycle managed by Set/Array.
|
|
332
|
+
// _walkAndBind DELETED — replaced by _hydrateSignals().
|
|
333
|
+
/**
|
|
334
|
+
* Lifecycle: called when an observed attribute changes.
|
|
335
|
+
*
|
|
336
|
+
* Base implementation is a no-op. Subclasses override this to react
|
|
337
|
+
* to attribute changes, typically by calling `this.render()` to update
|
|
338
|
+
* the shadow DOM.
|
|
339
|
+
*
|
|
340
|
+
* @param name - Attribute name (lowercase).
|
|
341
|
+
* @param oldValue - Previous value, or null if the attribute was not set.
|
|
342
|
+
* @param newValue - New value, or null if the attribute was removed.
|
|
343
|
+
*/ attributeChangedCallback(_name, _oldValue, _newValue) {
|
|
344
|
+
// v0.24.1 (ADR-0057): Route to static props handler
|
|
345
|
+
handleStaticPropAttributeChange(this, _name, _oldValue, _newValue);
|
|
346
|
+
// Subclass override point - base implementation is intentionally empty.
|
|
347
|
+
}
|
|
348
|
+
/**
|
|
349
|
+
* Re-render the shadow DOM from `render()` and re-bind declarative events.
|
|
350
|
+
*
|
|
351
|
+
* OpenElement intentionally does not include a reactive scheduler. Components
|
|
352
|
+
* with local state can call this method after state changes instead of
|
|
353
|
+
* duplicating renderToDom() and event hydration.
|
|
354
|
+
*/ update() {
|
|
355
|
+
const ctor = this.constructor;
|
|
356
|
+
if (ctor.renderMode === 'light') {
|
|
357
|
+
this._renderIntoLightDom();
|
|
358
|
+
return;
|
|
359
|
+
}
|
|
360
|
+
this._renderIntoShadowRoot();
|
|
361
|
+
}
|
|
362
|
+
/**
|
|
363
|
+
* ReactiveController-compatible update hook.
|
|
364
|
+
*
|
|
365
|
+
* Async state controllers call this method when state changes. Keeping this
|
|
366
|
+
* tiny alias lets OpenElement host controllers without inheriting Lit or a
|
|
367
|
+
* scheduler.
|
|
368
|
+
*/ requestUpdate() {
|
|
369
|
+
this.update();
|
|
370
|
+
}
|
|
371
|
+
_renderIntoLightDom() {
|
|
372
|
+
this.#eventCleanups = renderIntoLightDom(this, this.#effectDisposers, this.#eventCleanups, this.#cacheAccess());
|
|
373
|
+
}
|
|
374
|
+
_renderIntoShadowRoot() {
|
|
375
|
+
this.#eventCleanups = renderIntoShadowRoot(this, this.#effectDisposers, this.#eventCleanups, this.#cacheAccess());
|
|
376
|
+
}
|
|
377
|
+
/**
|
|
378
|
+
* Accessor for the private VNode cache used by extracted render/hydration
|
|
379
|
+
* helpers. Keeps #vnodeCache / #vnodeCacheValid encapsulated while allowing
|
|
380
|
+
* the logic to live in separate modules.
|
|
381
|
+
*/ #cacheAccess() {
|
|
382
|
+
return {
|
|
383
|
+
get: ()=>({
|
|
384
|
+
vnode: this.#vnodeCache,
|
|
385
|
+
valid: this.#vnodeCacheValid
|
|
386
|
+
}),
|
|
387
|
+
set: (vnode)=>{
|
|
388
|
+
this.#vnodeCache = vnode;
|
|
389
|
+
this.#vnodeCacheValid = true;
|
|
390
|
+
}
|
|
391
|
+
};
|
|
392
|
+
}
|
|
393
|
+
/**
|
|
394
|
+
* Read locale from JS property (set by SSR injectProps) first,
|
|
395
|
+
* then HTML attribute, then fallback to provided default.
|
|
396
|
+
*
|
|
397
|
+
* SSR injectProps() sets camelCase JS properties (e.g. this.locale = 'en')
|
|
398
|
+
* but getAttribute() only reads HTML attributes, which remain null.
|
|
399
|
+
* This method resolves the mismatch by checking JS property first.
|
|
400
|
+
*
|
|
401
|
+
* @param fallback - Default value when neither source has a value. Defaults to 'en'.
|
|
402
|
+
*/ _getLocale(fallback = 'en') {
|
|
403
|
+
const prop = this.locale;
|
|
404
|
+
if (typeof prop === 'string' && prop) return prop;
|
|
405
|
+
return this.getAttribute('locale') || fallback;
|
|
406
|
+
}
|
|
407
|
+
/**
|
|
408
|
+
* Return Shadow DOM content as a VNode.
|
|
409
|
+
*
|
|
410
|
+
* Subclasses MUST override this method. During SSR, rendered content is
|
|
411
|
+
* wrapped in a <template shadowrootmode="open"> tag. During CSR, VNode values
|
|
412
|
+
* are rendered via renderToDom() with event binding and signal tracking.
|
|
413
|
+
*
|
|
414
|
+
* @returns VNode for the shadow DOM content, or null for empty content.
|
|
415
|
+
*/ render() {
|
|
416
|
+
return null;
|
|
417
|
+
}
|
|
418
|
+
}
|
|
419
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImZpbGU6Ly8vaG9tZS9ydW5uZXIvd29yay9vcGVuZWxlbWVudC9vcGVuZWxlbWVudC9wYWNrYWdlcy9lbGVtZW50L3NyYy9vcGVuLWVsZW1lbnQudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAb3BlbmVsZW1lbnQvZWxlbWVudCAtIE9wZW5FbGVtZW50IGJhc2UgY2xhc3MuXG4gKlxuICogWmVyby1kZXBlbmRlbmN5IEN1c3RvbSBFbGVtZW50IGJhc2UgY2xhc3MgcHJvdmlkaW5nOlxuICogICAtIERlY2xhcmF0aXZlIFNoYWRvdyBET00gKERTRCkgZGV0ZWN0aW9uIGF0IHVwZ3JhZGUgdGltZVxuICogICAtIENsaWVudC1TaWRlIFJlbmRlcmluZyAoQ1NSKSBmYWxsYmFjayB3aGVuIG5vIERTRCBjb250ZW50IGV4aXN0c1xuICogICAtIFN0eWxlU2hlZXQgKFNTUi1zYWZlIENTU1N0eWxlU2hlZXQpIHZpYSBhZG9wdGVkU3R5bGVTaGVldHNcbiAqICAgLSBEZWNsYXJhdGl2ZSBldmVudCBiaW5kaW5nIHZpYSBodG1sIHRlbXBsYXRlIEBjbGljayAvIEBrZXlkb3duIGV0Yy5cbiAqICAgLSBTaWduYWwtZHJpdmVuIGZpbmUtZ3JhaW5lZCBET00gcGF0Y2hpbmcgdmlhIGRhdGEtc2lnbmFsIG1hcmtlcnNcbiAqICAgLSBBYm9ydENvbnRyb2xsZXIgY2xlYW51cCBvbiBkaXNjb25uZWN0XG4gKiAgIC0gZm9ybUFzc29jaWF0ZWQgKyBkZWxlZ2F0ZXNGb2N1cyBzdXBwb3J0XG4gKlxuICogT3BlbkVsZW1lbnQgZXh0ZW5kcyBIVE1MRWxlbWVudCBkaXJlY3RseSAtIFpFUk8gTGl0IGRlcGVuZGVuY3kuXG4gKiBDb21wb25lbnRzIHJldHVybiBgcmVuZGVyKCk6IFZOb2RlIHwgbnVsbGAuXG4gKlxuICogTGlmZWN5Y2xlOlxuICogICBTU1I6IGluc3RhbnRpYXRlIC0+IHNldCBwcm9wcyAtPiByZW5kZXIoKSAtPiB3cmFwIGluIERTRCB0ZW1wbGF0ZVxuICogICBDbGllbnQgKERTRCk6IGJyb3dzZXIgYXR0YWNoZXMgc2hhZG93IHJvb3QgZnJvbSBEU0QgLT4gdXBncmFkZSAtPiBiaW5kIHRlbXBsYXRlIGV2ZW50c1xuICogICBDbGllbnQgKENTUik6IGNvbm5lY3RlZENhbGxiYWNrIC0+IGNyZWF0ZVJlbmRlclJvb3QgLT4gcmVuZGVyIGludG8gc2hhZG93Um9vdFxuICpcbiAqIFVzYWdlIChzdGF0aWMgRFNEIGNvbXBvbmVudCk6XG4gKiBgYGB0c1xuICogY2xhc3MgTXlDYXJkIGV4dGVuZHMgT3BlbkVsZW1lbnQge1xuICogICBzdGF0aWMgc3R5bGVzID0gbXlTdHlsZVNoZWV0O1xuICogICByZW5kZXIoKTogVk5vZGUge1xuICogICAgIHJldHVybiA8ZGl2IGNsYXNzPVwiY2FyZFwiPjxzbG90IC8+PC9kaXY+O1xuICogICB9XG4gKiB9XG4gKiBjdXN0b21FbGVtZW50cy5kZWZpbmUoJ215LWNhcmQnLCBNeUNhcmQpO1xuICogYGBgXG4gKlxuICogVXNhZ2UgKHJlYWN0aXZlIERTRCBjb21wb25lbnQpOlxuICogYGBgdHNcbiAqIGNsYXNzIE15VG9nZ2xlIGV4dGVuZHMgT3BlbkVsZW1lbnQge1xuICogICAjYWN0aXZlID0gc2lnbmFsKGZhbHNlKTtcbiAqICAgcmVuZGVyKCkge1xuICogICAgIHJldHVybiAoXG4gKiAgICAgICA8YnV0dG9uIG9uQ2xpY2s9eygpID0+IHRoaXMuI2FjdGl2ZS52YWx1ZSA9ICF0aGlzLiNhY3RpdmUudmFsdWV9PlxuICogICAgICAgICB7dGhpcy4jYWN0aXZlLnZhbHVlID8gJ09OJyA6ICdPRkYnfVxuICogICAgICAgPC9idXR0b24+XG4gKiAgICAgKTtcbiAqICAgfVxuICogfVxuICogYGBgXG4gKlxuICogQG1vZHVsZSBAb3BlbmVsZW1lbnQvZWxlbWVudC9vcGVuLWVsZW1lbnRcbiAqL1xuXG5pbXBvcnQgeyBmb3JtYXRFcnJvciB9IGZyb20gJ0BvcGVuZWxlbWVudC9jb3JlL2Vycm9ycyc7XG5pbXBvcnQgdHlwZSB7IFN0eWxlU2hlZXRMaWtlIH0gZnJvbSAnQG9wZW5lbGVtZW50L3Byb3RvY29sL3N0eWxlLXNoZWV0JztcbmltcG9ydCB7XG4gIGRpc3Bvc2VTdGF0aWNQcm9wcyxcbiAgaGFuZGxlU3RhdGljUHJvcEF0dHJpYnV0ZUNoYW5nZSxcbiAgaW5pdGlhbGl6ZVN0YXRpY1Byb3BzLFxuICBzeW5jU3RhdGljUHJvcHNGcm9tQXR0cmlidXRlcyxcbn0gZnJvbSAnQG9wZW5lbGVtZW50L2NvcmUvcHJvcCc7XG5pbXBvcnQgdHlwZSB7IFZOb2RlIH0gZnJvbSAnQG9wZW5lbGVtZW50L3Byb3RvY29sL3Zub2RlJztcbmltcG9ydCB0eXBlIHsgU2lnbmFsIH0gZnJvbSAnQG9wZW5lbGVtZW50L3Byb3RvY29sL3NpZ25hbCc7XG5pbXBvcnQgeyBzaWduYWwgfSBmcm9tICdAb3BlbmVsZW1lbnQvc2lnbmFsJztcbmltcG9ydCB7IGNyZWF0ZUxvZ2dlciB9IGZyb20gJ0BvcGVuZWxlbWVudC9jb3JlL2xvZ2dlcic7XG5pbXBvcnQge1xuICBkaXNwb3NlUmVuZGVyQmluZGluZ3MsXG4gIHJlbmRlckVycm9yRmFsbGJhY2ssXG4gIHJlbmRlckludG9MaWdodERvbSxcbiAgcmVuZGVySW50b1NoYWRvd1Jvb3QsXG4gIHR5cGUgVk5vZGVDYWNoZUFjY2Vzcyxcbn0gZnJvbSAnLi9vcGVuLWVsZW1lbnQtcmVuZGVyLmpzJztcbmltcG9ydCB7IGh5ZHJhdGVFeGlzdGluZ0RvbSwgaHlkcmF0ZVNpZ25hbHMgfSBmcm9tICcuL29wZW4tZWxlbWVudC1oeWRyYXRpb24uanMnO1xuXG4vKipcbiAqIFNTUi1zYWZlIGJhc2UgY2xhc3MgZm9yIE9wZW5FbGVtZW50LlxuICpcbiAqIEluIGJyb3dzZXI6IGV4dGVuZHMgSFRNTEVsZW1lbnQgZGlyZWN0bHkuXG4gKiBJbiBTU1I6IGFzc2lnbnMgYSBtaW5pbWFsIHN0dWIgdG8gZ2xvYmFsVGhpcy5IVE1MRWxlbWVudCBzbyB0aGUgZW50aXJlXG4gKiBkZXBlbmRlbmN5IGdyYXBoIHNoYXJlcyB0aGUgc2FtZSBiYXNlIGNsYXNzLlxuICovXG5jb25zdCBfQmFzZSA9IHR5cGVvZiBIVE1MRWxlbWVudCAhPT0gJ3VuZGVmaW5lZCcgPyBIVE1MRWxlbWVudCA6IChjbGFzcyB7XG4gIGhhc0F0dHJpYnV0ZShfbmFtZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGdldEF0dHJpYnV0ZShfbmFtZTogc3RyaW5nKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgc2V0QXR0cmlidXRlKF9uYW1lOiBzdHJpbmcsIF92YWx1ZTogc3RyaW5nKTogdm9pZCB7fVxuICByZW1vdmVBdHRyaWJ1dGUoX25hbWU6IHN0cmluZyk6IHZvaWQge31cbiAgZ2V0IHRhZ05hbWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gJyc7XG4gIH1cbiAgZ2V0IGlzQ29ubmVjdGVkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufSBhcyB1bmtub3duIGFzIHR5cGVvZiBIVE1MRWxlbWVudCk7XG5cbi8vIEluIFNTUiwgYXNzaWduIGdsb2JhbFRoaXMuSFRNTEVsZW1lbnQgc28gb3RoZXIgY29kZSBjYW4gcmVmZXJlbmNlIGl0XG5pZiAodHlwZW9mIEhUTUxFbGVtZW50ID09PSAndW5kZWZpbmVkJykge1xuICAoZ2xvYmFsVGhpcyBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPikuSFRNTEVsZW1lbnQgPSBfQmFzZTtcbn1cblxuLyoqXG4gKiBaZXJvLWRlcGVuZGVuY3kgQ3VzdG9tIEVsZW1lbnQgYmFzZSBjbGFzcyBmb3IgRFNEIHJlbmRlcmluZy5cbiAqXG4gKiBQcm92aWRlcyBEU0QgZGV0ZWN0aW9uLCBDU1IgZmFsbGJhY2ssIGV2ZW50IGh5ZHJhdGlvbiwgYW5kIHN0eWxlIG1hbmFnZW1lbnRcbiAqIHdpdGhvdXQgYW55IGZyYW1ld29yayBkZXBlbmRlbmN5IChubyBMaXQsIG5vIHJlYWN0aXZlLWVsZW1lbnQpLlxuICpcbiAqIFN1YmNsYXNzZXMgTVVTVCBvdmVycmlkZSBgcmVuZGVyKCk6IFZOb2RlIHwgbnVsbGAuXG4gKi9cbmV4cG9ydCBjbGFzcyBPcGVuRWxlbWVudCBleHRlbmRzIF9CYXNlIHtcbiAgLyoqIENvbXBvbmVudCBzdHlsZXNoZWV0cyAoU1NSLXNhZmUgLSBTdHlsZVNoZWV0IGRlbGVnYXRlcyB0byBuYXRpdmUgQ1NTU3R5bGVTaGVldCBpbiBicm93c2VyKS4gKi9cbiAgc3RhdGljIHN0eWxlcz86IFN0eWxlU2hlZXRMaWtlIHwgU3R5bGVTaGVldExpa2VbXTtcblxuICAvKiogUmVuZGVyaW5nIG1vZGUuIERlZmF1bHRzIHRvIHNoYWRvdy9EU0Q7IGxpZ2h0IERPTSBpcyBleHBsaWNpdCBvcHQtaW4uICovXG4gIHN0YXRpYyByZW5kZXJNb2RlPzogJ3NoYWRvdycgfCAnbGlnaHQnO1xuXG4gIC8qKiB2MC4yNS4wOiBQYWdlIGhlYWQgbWV0YWRhdGEuIFNTRyByZWFkcyB0aGlzIHRvIGluamVjdCA8dGl0bGU+IGFuZCA8bWV0YT4gdGFncy4gKi9cbiAgc3RhdGljIGhlYWQ/OiB7IHRpdGxlPzogc3RyaW5nOyBkZXNjcmlwdGlvbj86IHN0cmluZzsgb2dJbWFnZT86IHN0cmluZyB9O1xuXG4gIC8qKiBAaW50ZXJuYWwg4oCUIHVzZSBvcGVuUGlwZWxpbmUoeyBpc2xhbmQ6IHsgdXBncmFkZVN0cmF0ZWd5IH0gfSkgaW5zdGVhZCAqL1xuICBzdGF0aWMgY2xpZW50PzogeyBzdHJhdGVneT86ICdsb2FkJyB8ICdpZGxlJyB8ICd2aXNpYmxlJyB8ICdvbmx5JyB9O1xuXG4gIC8qKlxuICAgKiBBdHRyaWJ1dGVzIHRoYXQgdHJpZ2dlciBhdHRyaWJ1dGVDaGFuZ2VkQ2FsbGJhY2suXG4gICAqIFN1YmNsYXNzZXMgb3ZlcnJpZGUgdGhpcyB0byBkZWNsYXJlIHJlYWN0aXZlIGF0dHJpYnV0ZXMuXG4gICAqL1xuICBzdGF0aWMgb2JzZXJ2ZWRBdHRyaWJ1dGVzPzogc3RyaW5nW107XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gZGVsZWdhdGUgZm9jdXMgd2l0aGluIHRoZSBzaGFkb3cgcm9vdC5cbiAgICogV2hlbiB0cnVlLCBhdHRhY2hTaGFkb3cgaXMgY2FsbGVkIHdpdGggYGRlbGVnYXRlc0ZvY3VzOiB0cnVlYC5cbiAgICovXG4gIHN0YXRpYyBkZWxlZ2F0ZXNGb2N1cz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhpcyBlbGVtZW50IHBhcnRpY2lwYXRlcyBpbiBmb3JtIHN1Ym1pc3Npb24uXG4gICAqIFdoZW4gdHJ1ZSwgRWxlbWVudEludGVybmFscyBhcmUgYXR0YWNoZWQgaW4gY29ubmVjdGVkQ2FsbGJhY2suXG4gICAqL1xuICBzdGF0aWMgZm9ybUFzc29jaWF0ZWQ/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBFZmZlY3QgZGlzcG9zZSB0cmFja2luZyAoQURSLTAwNjUpLlxuICAgKiBSZXBsYWNlcyBlZmZlY3RTY29wZSgpIOKAlCBlZmZlY3RzIGFyZSBjcmVhdGVkIGF0IHRvcCBsZXZlbFxuICAgKiBzbyB0aGV5IGZpcmUgb24gc2lnbmFsIGNoYW5nZXMuIERpc3Bvc2VkIGFzIGEgYmF0Y2ggaW5cbiAgICogZGlzY29ubmVjdGVkQ2FsbGJhY2suXG4gICAqL1xuICAjZWZmZWN0RGlzcG9zZXJzOiBTZXQ8KCkgPT4gdm9pZD4gPSBuZXcgU2V0KCk7XG5cbiAgLyoqIHYwLjI4IChBRFItMDA2Nyk6IEV2ZW50IGxpc3RlbmVyIGNsZWFudXAgdHJhY2tpbmcgZm9yIF9oeWRyYXRlU2lnbmFscygpLiAqL1xuICAjZXZlbnRDbGVhbnVwczogQXJyYXk8KCkgPT4gdm9pZD4gPSBbXTtcblxuICAvKiogdjAuMjguMTogQ2FjaGVkIFZOb2RlIGZyb20gcmVuZGVyKCkg4oCUIGF2b2lkcyBkb3VibGUtcmVuZGVyIG1pc21hdGNoIGJldHdlZW4gU1NSIGFuZCBoeWRyYXRpb24uICovXG4gICN2bm9kZUNhY2hlOiB1bmtub3duID0gdW5kZWZpbmVkO1xuICAjdm5vZGVDYWNoZVZhbGlkID0gZmFsc2U7XG5cbiAgLyoqXG4gICAqIFNpZ25hbCByZWdpc3RyeSBmb3IgYXR0cmlidXRlLWJhc2VkIGh5ZHJhdGlvbiAoQURSLTAwNjUpLlxuICAgKiBNYXBzIHNpZ25hbCBuYW1lcyDihpIgc2lnbmFsIG9iamVjdHMuIEJ1aWx0IGJ5IHJlZ2lzdGVyU2lnbmFsKClcbiAgICogaW4gY29tcG9uZW50IGNvbnN0cnVjdG9ycywgY29uc3VtZWQgZHVyaW5nIGh5ZHJhdGlvbi5cbiAgICpcbiAgICogRXhwb3NlZCBpbnRlcm5hbGx5IGZvciByZW5kZXIgaGVscGVyIG1vZHVsZXMuXG4gICAqL1xuICBzaWduYWxSZWdpc3RyeTogTWFwPHN0cmluZywgU2lnbmFsPHVua25vd24+PiA9IG5ldyBNYXAoKTtcblxuICAvKipcbiAgICogUmVnaXN0ZXIgYSBzaWduYWwgZm9yIGh5ZHJhdGlvbiBieSBuYW1lLlxuICAgKiBDYWxsIGluIGNvbnN0cnVjdG9yOiB0aGlzLnJlZ2lzdGVyU2lnbmFsKCdjb3VudCcsIHRoaXMuI2NvdW50KTtcbiAgICovXG4gIHByb3RlY3RlZCByZWdpc3RlclNpZ25hbChuYW1lOiBzdHJpbmcsIHNpZzogU2lnbmFsPHVua25vd24+KTogdm9pZCB7XG4gICAgdGhpcy5zaWduYWxSZWdpc3RyeS5zZXQobmFtZSwgc2lnKTtcbiAgfVxuXG4gIC8qKiBSZWFjdGl2ZSByb3V0ZSBwYXJhbWV0ZXJzIFNpZ25hbC4gVXBkYXRlcyBhdXRvbWF0aWNhbGx5IG9uIFNQQSBuYXZpZ2F0aW9uLiAqL1xuICAjcGFyYW1zID0gc2lnbmFsPFJlY29yZDxzdHJpbmcsIHN0cmluZz4+KHt9KTtcblxuICAvKiogUmVhY3RpdmUgcm91dGUgcGFyYW1ldGVycy4gVXBkYXRlcyBhdXRvbWF0aWNhbGx5IG9uIFNQQSBuYXZpZ2F0aW9uLiAqL1xuICBnZXQgcGFyYW1zKCk6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4ge1xuICAgIHJldHVybiB0aGlzLiNwYXJhbXMudmFsdWU7XG4gIH1cblxuICBzZXQgcGFyYW1zKHZhbHVlOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+KSB7XG4gICAgdGhpcy4jcGFyYW1zLnZhbHVlID0geyAuLi52YWx1ZSB9O1xuICB9XG5cbiAgLyoqIEVsZW1lbnRJbnRlcm5hbHMgZm9yIGZvcm0tYXNzb2NpYXRlZCBjdXN0b20gZWxlbWVudHMgKi9cbiAgcHJvdGVjdGVkIF9pbnRlcm5hbHM/OiBFbGVtZW50SW50ZXJuYWxzO1xuXG4gIC8qKlxuICAgKiBDcmVhdGUgb3IgcmV1c2UgdGhlIHNoYWRvdyByb290LlxuICAgKlxuICAgKiBEU0QgZGV0ZWN0aW9uOiBpZiBgdGhpcy5zaGFkb3dSb290YCBhbHJlYWR5IGV4aXN0cyBhbmQgaGFzIG5vZGVzLFxuICAgKiB0aGUgYnJvd3NlciBwcmUtcG9wdWxhdGVkIGl0IGZyb20gYSA8dGVtcGxhdGUgc2hhZG93cm9vdG1vZGU+IHRhZy5cbiAgICogSW4gdGhhdCBjYXNlIHdlIG1hcmsgYF9kc2RIeWRyYXRlZCA9IHRydWVgIGFuZCByZXR1cm4gdGhlIGV4aXN0aW5nIHJvb3QuXG4gICAqXG4gICAqIENTUiBmYWxsYmFjazogaWYgbm8gc2hhZG93IHJvb3QgZXhpc3RzLCB3ZSBjYWxsIGBhdHRhY2hTaGFkb3coKWAuIElmIGFuXG4gICAqIGVtcHR5IHNoYWRvdyByb290IGFscmVhZHkgZXhpc3RzLCB3ZSByZXVzZSBpdCBhbmQgbGV0IGNvbm5lY3RlZENhbGxiYWNrKClcbiAgICogcG9wdWxhdGUgaXQgZnJvbSByZW5kZXIoKS5cbiAgICpcbiAgICogQHJldHVybnMgVGhlIGV4aXN0aW5nIG9yIG5ld2x5IGNyZWF0ZWQgU2hhZG93Um9vdC5cbiAgICovXG4gIGNyZWF0ZVJlbmRlclJvb3QoKTogU2hhZG93Um9vdCB8IHRoaXMge1xuICAgIGNvbnN0IGN0b3IgPSB0aGlzLmNvbnN0cnVjdG9yIGFzIHR5cGVvZiBPcGVuRWxlbWVudDtcbiAgICBpZiAoY3Rvci5yZW5kZXJNb2RlID09PSAnbGlnaHQnKSB7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvLyBEU0QgcHJlLXBvcHVsYXRlZCBzaGFkb3cgcm9vdCBkZXRlY3Rpb25cbiAgICBpZiAodGhpcy5zaGFkb3dSb290KSB7XG4gICAgICB0aGlzLl9hcHBseVN0eWxlcyhjdG9yLCB0aGlzLnNoYWRvd1Jvb3QpO1xuICAgICAgcmV0dXJuIHRoaXMuc2hhZG93Um9vdDtcbiAgICB9XG5cbiAgICAvLyBDU1I6IGNyZWF0ZSBhIG5ldyBzaGFkb3cgcm9vdFxuICAgIGNvbnN0IGRlbGVnYXRlc0ZvY3VzID0gY3Rvci5kZWxlZ2F0ZXNGb2N1cyA/PyBmYWxzZTtcbiAgICBjb25zdCByb290ID0gdGhpcy5hdHRhY2hTaGFkb3coeyBtb2RlOiAnb3BlbicsIGRlbGVnYXRlc0ZvY3VzIH0pO1xuXG4gICAgLy8gQXBwbHkgc3RhdGljIHN0eWxlcyB2aWEgYWRvcHRlZFN0eWxlU2hlZXRzXG4gICAgdGhpcy5fYXBwbHlTdHlsZXMoY3Rvciwgcm9vdCk7XG5cbiAgICByZXR1cm4gcm9vdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBBcHBseSBzdGF0aWMgc3R5bGVzIHRvIHRoZSBzaGFkb3cgcm9vdCB2aWEgYWRvcHRlZFN0eWxlU2hlZXRzLlxuICAgKiBTaGFyZWQgYmV0d2VlbiBDU1IgKGNyZWF0ZVJlbmRlclJvb3QpIGFuZCBEU0QgKGNvbm5lY3RlZENhbGxiYWNrKSBwYXRocy5cbiAgICovXG4gIHByaXZhdGUgX2FwcGx5U3R5bGVzKGN0b3I6IHR5cGVvZiBPcGVuRWxlbWVudCwgcm9vdD86IFNoYWRvd1Jvb3QpOiB2b2lkIHtcbiAgICBjb25zdCB0YXJnZXQgPSByb290ID8/IHRoaXMuc2hhZG93Um9vdDtcbiAgICBpZiAoIXRhcmdldCB8fCAhY3Rvci5zdHlsZXMpIHJldHVybjtcbiAgICBjb25zdCBzaGVldHMgPSBBcnJheS5pc0FycmF5KGN0b3Iuc3R5bGVzKSA/IGN0b3Iuc3R5bGVzIDogW2N0b3Iuc3R5bGVzXTtcbiAgICBpZiAoc2hlZXRzLmxlbmd0aCA+IDApIHtcbiAgICAgIC8vIFN0eWxlU2hlZXQgZGVsZWdhdGVzIHRvIG5hdGl2ZSBDU1NTdHlsZVNoZWV0IGluIGJyb3dzZXJcbiAgICAgIC8vIHR5cGUtZXNjYXBlOiBhZG9wdGVkU3R5bGVTaGVldHMgbWF5IG5vdCBiZSBpbiB0aGUgY29uZmlndXJlZCBET00gbGliXG4gICAgICAodGFyZ2V0IGFzIHVua25vd24gYXMgeyBhZG9wdGVkU3R5bGVTaGVldHM6IHR5cGVvZiBzaGVldHMgfSkuYWRvcHRlZFN0eWxlU2hlZXRzID0gc2hlZXRzO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBMaWZlY3ljbGU6IGNhbGxlZCB3aGVuIHRoZSBlbGVtZW50IGlzIGNvbm5lY3RlZCB0byB0aGUgRE9NLlxuICAgKlxuICAgKiBEU0QgcGF0aCAoX2RzZEh5ZHJhdGVkID0gdHJ1ZSk6XG4gICAqICAgLSBDYWxscyBfaHlkcmF0ZUV2ZW50cygpIHRvIGJpbmQgZGVjbGFyYXRpdmUgZXZlbnRzIG9uIGV4aXN0aW5nIERPTS5cbiAgICpcbiAgICogQ1NSIHBhdGggKF9kc2RIeWRyYXRlZCA9IGZhbHNlKTpcbiAgICogICAtIENhbGxzIGNyZWF0ZVJlbmRlclJvb3QoKSBpZiBubyBzaGFkb3cgcm9vdCBleGlzdHMuXG4gICAqICAgLSBSZW5kZXJzIHRoaXMucmVuZGVyKCkgdGhyb3VnaCB0aGUgVk5vZGUgRE9NIHJlbmRlcmVyLlxuICAgKlxuICAgKiBJZiBmb3JtQXNzb2NpYXRlZCBpcyB0cnVlLCBFbGVtZW50SW50ZXJuYWxzIGFyZSBhdHRhY2hlZC5cbiAgICovXG4gIGNvbm5lY3RlZENhbGxiYWNrKCk6IHZvaWQge1xuICAgIGNvbnN0IGN0b3IgPSB0aGlzLmNvbnN0cnVjdG9yIGFzIHR5cGVvZiBPcGVuRWxlbWVudDtcblxuICAgIC8vIHYwLjI0LjEgKEFEUi0wMDU3KTogSW5pdGlhbGl6ZSBzdGF0aWMgcHJvcHMgc2lnbmFscyBhbmQgYWNjZXNzb3JzXG4gICAgaW5pdGlhbGl6ZVN0YXRpY1Byb3BzKHRoaXMpO1xuICAgIHN5bmNTdGF0aWNQcm9wc0Zyb21BdHRyaWJ1dGVzKHRoaXMpO1xuXG4gICAgY29uc3QgaXNMaWdodERvbSA9IGN0b3IucmVuZGVyTW9kZSA9PT0gJ2xpZ2h0JztcblxuICAgIC8vIEVuc3VyZSByZW5kZXIgdGFyZ2V0IGV4aXN0cyBhbmQgZGV0ZWN0IERTRCBwcmUtcG9wdWxhdGlvblxuICAgIGlmICghdGhpcy5zaGFkb3dSb290ICYmICFpc0xpZ2h0RG9tKSB7XG4gICAgICB0aGlzLmNyZWF0ZVJlbmRlclJvb3QoKTtcbiAgICB9IGVsc2UgaWYgKHRoaXMuc2hhZG93Um9vdCkge1xuICAgICAgLy8gRFNEIHBhdGg6IHNoYWRvdyByb290IGFscmVhZHkgcG9wdWxhdGVkLlxuICAgICAgdGhpcy5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJztcbiAgICAgIHRoaXMuX2FwcGx5U3R5bGVzKGN0b3IpO1xuICAgIH1cblxuICAgIC8vIFN5bmMgZGF0YS10aGVtZSBmcm9tIGRvY3VtZW50IHJvb3RcbiAgICBjb25zdCBkb2NUaGVtZSA9IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudD8uZGF0YXNldD8udGhlbWU7XG4gICAgaWYgKGRvY1RoZW1lICYmICF0aGlzLmhhc0F0dHJpYnV0ZSgnZGF0YS10aGVtZScpKSB7XG4gICAgICB0aGlzLnNldEF0dHJpYnV0ZSgnZGF0YS10aGVtZScsIGRvY1RoZW1lKTtcbiAgICB9XG5cbiAgICAvLyBURy0wMTogUmVhZCByb3V0ZSBwYXJhbXMgZnJvbSBhdHRyaWJ1dGUgaWYgcHJlc2VudC5cbiAgICAvLyAoU1NSL1NTRyBpbmplY3RzIHBhcmFtcyBhcyBKUyBwcm9wZXJ0eSB2aWEgaW5qZWN0UHJvcHMg4oCUIHNldHRlciBoYW5kbGVzIGl0KVxuICAgIGNvbnN0IGF0dHJQYXJhbXMgPSB0aGlzLmdldEF0dHJpYnV0ZSgncGFyYW1zJyk7XG4gICAgaWYgKGF0dHJQYXJhbXMpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHRoaXMuI3BhcmFtcy52YWx1ZSA9IEpTT04ucGFyc2UoYXR0clBhcmFtcyk7XG4gICAgICB9IGNhdGNoIHsgLyogaWdub3JlIG1hbGZvcm1lZCBKU09OICovIH1cbiAgICB9XG5cbiAgICAvLyB2MC4yNS4wIChTT1AtMDEyKTogVW5pZmllZCByZW5kZXIgcGF0aCDigJQgRFNEIGFuZCBDU1IgYm90aCBnbyB0aHJvdWdoXG4gICAgLy8gX3JlbmRlck9ySHlkcmF0ZSgpLiBUaGUgX2RzZEh5ZHJhdGVkIGZsYWcgYW5kIF9iaW5kQ3VycmVudFJlbmRlclRlbXBsYXRlKClcbiAgICAvLyBhcmUgcmVtb3ZlZC4gRFNEIHByZS1wb3B1bGF0ZWQgRE9NIGlzIHByZXNlcnZlZDsgb25seSBldmVudHMgYW5kIHNpZ25hbFxuICAgIC8vIHN1YnNjcmlwdGlvbnMgYXJlIGFkZGVkLlxuICAgIHRoaXMuX3JlbmRlck9ySHlkcmF0ZSgpO1xuXG4gICAgLy8gdjAuNDAuMDogQ2xpZW50LXNpZGUgYWN0aXZhdGlvbiBob29rIGZvciBmcmFtZXdvcmsgaHlkcmF0aW9uXG4gICAgdGhpcy5jbGllbnRBY3RpdmF0ZSgpO1xuXG4gICAgLy8gQXR0YWNoIEVsZW1lbnRJbnRlcm5hbHMgZm9yIGZvcm0tYXNzb2NpYXRlZCBjdXN0b20gZWxlbWVudHNcbiAgICBpZiAoY3Rvci5mb3JtQXNzb2NpYXRlZCAmJiB0eXBlb2YgdGhpcy5hdHRhY2hJbnRlcm5hbHMgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHRoaXMuX2ludGVybmFscyA9IHRoaXMuYXR0YWNoSW50ZXJuYWxzKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIHYwLjI1LjAgKFNPUC0wMTIpOiBVbmlmaWVkIHJlbmRlciBwYXRoLlxuICAgKi9cbiAgcHJpdmF0ZSBfcmVuZGVyT3JIeWRyYXRlKCk6IHZvaWQge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBjdG9yID0gdGhpcy5jb25zdHJ1Y3RvciBhcyB0eXBlb2YgT3BlbkVsZW1lbnQ7XG4gICAgICBpZiAoY3Rvci5yZW5kZXJNb2RlID09PSAnbGlnaHQnKSB7XG4gICAgICAgIHRoaXMuX3JlbmRlckludG9MaWdodERvbSgpO1xuICAgICAgICB0aGlzLm9uQ3NyUmVuZGVyZWQoKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBpc0RzZCA9IHRoaXMuc2hhZG93Um9vdCAmJiB0aGlzLnNoYWRvd1Jvb3QuY2hpbGROb2Rlcy5sZW5ndGggPiAwO1xuICAgICAgaWYgKGlzRHNkKSB7XG4gICAgICAgIC8vIERTRDogRE9NIGFscmVhZHkgY29ycmVjdCDigJQgYmluZCBldmVudHMgdmlhIFZOb2RlIHdhbGtcbiAgICAgICAgdGhpcy5faHlkcmF0ZUV4aXN0aW5nRG9tKCk7XG4gICAgICAgIHRoaXMub25Ec2RIeWRyYXRlZCgpO1xuICAgICAgfSBlbHNlIGlmICh0aGlzLnNoYWRvd1Jvb3QpIHtcbiAgICAgICAgLy8gQ1NSOiBmdWxsIHJlbmRlciBmcm9tIFZOb2RlXG4gICAgICAgIHRoaXMuX3JlbmRlckludG9TaGFkb3dSb290KCk7XG4gICAgICAgIHRoaXMub25Dc3JSZW5kZXJlZCgpO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgdGhpcy5fcmVuZGVyRXJyb3JGYWxsYmFjayhlcnIpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiB2MC4yOCAoQURSLTAwNjcpOiBTaWduYWwtbmF0aXZlIGh5ZHJhdGlvbi5cbiAgICpcbiAgICogUmVwbGFjZXMgX3dhbGtBbmRCaW5kKCkg4oCUIHJlYWRzIGRhdGEtc2lnbmFsIG1hcmtlcnNcbiAgICogZnJvbSBEU0Qgc2hhZG93IHJvb3QgYW5kIGNyZWF0ZXMgZGlyZWN0IHNpZ25hbOKGkkRPTSBlZmZlY3QgYmluZGluZ3MuXG4gICAqIE5vIHBvc2l0aW9uIG1hdGNoaW5nLCBubyBjaGlsZE5vZGVzIGZpbHRlcmluZywgbm8gVk5vZGUgdHJhdmVyc2FsLlxuICAgKlxuICAgKiBFZmZlY3RzIGFyZSB0cmFja2VkIGluICNlZmZlY3REaXNwb3NlcnMgZm9yIGJhdGNoIGNsZWFudXAuXG4gICAqIFZOb2RlIGV2ZW50IG1hcmtlciBsaXN0ZW5lcnMgYXJlIHRyYWNrZWQgaW4gI2V2ZW50Q2xlYW51cHMuXG4gICAqXG4gICAqIEltcGxlbWVudGF0aW9uIGxpdmVzIGluIG9wZW4tZWxlbWVudC1oeWRyYXRpb24udHMuXG4gICAqL1xuICBwcml2YXRlIF9oeWRyYXRlU2lnbmFscygpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuc2hhZG93Um9vdCkgcmV0dXJuO1xuICAgIGh5ZHJhdGVTaWduYWxzKFxuICAgICAgdGhpcyxcbiAgICAgIHRoaXMuc2hhZG93Um9vdCxcbiAgICAgIHRoaXMuc2lnbmFsUmVnaXN0cnksXG4gICAgICB0aGlzLiNlZmZlY3REaXNwb3NlcnMsXG4gICAgICB0aGlzLiNldmVudENsZWFudXBzLFxuICAgICAgdGhpcy4jY2FjaGVBY2Nlc3MoKSxcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEh5ZHJhdGUgRFNEIERPTSB3aXRoIHNpZ25hbCBhbmQgZXZlbnQgYmluZGluZ3MuXG4gICAqXG4gICAqIHYwLjI4IChBRFItMDA2Nyk6IERlbGVnYXRlcyB0byBfaHlkcmF0ZVNpZ25hbHMoKS5cbiAgICogX3dhbGtBbmRCaW5kIHBvc2l0aW9uIG1hdGNoaW5nIGlzIERFTEVURUQuXG4gICAqXG4gICAqIEltcGxlbWVudGF0aW9uIGxpdmVzIGluIG9wZW4tZWxlbWVudC1oeWRyYXRpb24udHMuXG4gICAqL1xuICBwcml2YXRlIF9oeWRyYXRlRXhpc3RpbmdEb20oKTogdm9pZCB7XG4gICAgdGhpcy4jZXZlbnRDbGVhbnVwcyA9IGh5ZHJhdGVFeGlzdGluZ0RvbShcbiAgICAgIHRoaXMsXG4gICAgICB0aGlzLnNpZ25hbFJlZ2lzdHJ5LFxuICAgICAgdGhpcy4jZWZmZWN0RGlzcG9zZXJzLFxuICAgICAgdGhpcy4jZXZlbnRDbGVhbnVwcyxcbiAgICAgIHRoaXMuI2NhY2hlQWNjZXNzKCksXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiB2MC4yMy4wOiBIb29rIGNhbGxlZCBhZnRlciBEU0QgaHlkcmF0aW9uIGNvbXBsZXRlcy5cbiAgICpcbiAgICogU3ViY2xhc3NlcyBvdmVycmlkZSB0aGlzIGluc3RlYWQgb2YgcmVseWluZyBvbiBmcmFnaWxlXG4gICAqIGBzdXBlci5jb25uZWN0ZWRDYWxsYmFjaygpYCBjYWxsIG9yZGVyLiBBdCB0aGlzIHBvaW50IHRoZVxuICAgKiBzaGFkb3cgRE9NIGlzIHBvcHVsYXRlZCBmcm9tIERTRCBhbmQgZGVjbGFyYXRpdmUgZXZlbnRzXG4gICAqIChAY2xpY2ssIEBrZXlkb3duKSBhcmUgYm91bmQuXG4gICAqXG4gICAqIE5vLW9wIGJ5IGRlZmF1bHQuXG4gICAqL1xuICBwcm90ZWN0ZWQgb25Ec2RIeWRyYXRlZCgpOiB2b2lkIHt9XG5cbiAgLyoqXG4gICAqIHYwLjIzLjA6IEhvb2sgY2FsbGVkIGFmdGVyIENTUiBmaXJzdCByZW5kZXIgY29tcGxldGVzLlxuICAgKlxuICAgKiBTdWJjbGFzc2VzIG92ZXJyaWRlIHRoaXMgZm9yIHBvc3QtcmVuZGVyIGluaXRpYWxpemF0aW9uXG4gICAqIHRoYXQgZGVwZW5kcyBvbiB0aGUgc2hhZG93IERPTSBiZWluZyBwb3B1bGF0ZWQuIEF0IHRoaXNcbiAgICogcG9pbnQgcmVuZGVyKCkgaGFzIGJlZW4gY2FsbGVkIGFuZCBkZWNsYXJhdGl2ZSBldmVudHNcbiAgICogYXJlIGJvdW5kLlxuICAgKlxuICAgKiBOby1vcCBieSBkZWZhdWx0LlxuICAgKi9cbiAgcHJvdGVjdGVkIG9uQ3NyUmVuZGVyZWQoKTogdm9pZCB7fVxuXG4gIC8qKlxuICAgKiB2MC40MC4wOiBDbGllbnQtc2lkZSBhY3RpdmF0aW9uIGhvb2suXG4gICAqXG4gICAqIENhbGxlZCBvbmNlIGFmdGVyIHRoZSBlbGVtZW50IGlzIGNvbm5lY3RlZCwgdGhlIHNoYWRvdyByb290XG4gICAqIGlzIHJlYWR5LCBhbmQgYW55IERTRCBoeWRyYXRpb24gb3IgQ1NSIHJlbmRlcmluZyBoYXMgY29tcGxldGVkLlxuICAgKiBUaGlzIGlzIHRoZSByaWdodCBwbGFjZSBmb3IgZnJhbWV3b3JrIGh5ZHJhdGlvbiAoUHJlYWN0LCBSZWFjdCxcbiAgICogVnVlLCBMaXQpIHRvIHRha2Ugb3ZlciB0aGUgc2hhZG93IERPTS5cbiAgICpcbiAgICogRGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBpcyBhIG5vLW9wLiBTdWJjbGFzc2VzIG92ZXJyaWRlIHRoaXMgdG9cbiAgICogaHlkcmF0ZSBvciByZW5kZXIgZnJhbWV3b3JrIGNvbXBvbmVudHMgaW50byB0aGUgc2hhZG93IHJvb3QuXG4gICAqL1xuICBwcm90ZWN0ZWQgY2xpZW50QWN0aXZhdGUoKTogdm9pZCB7XG4gICAgLy8gZGVmYXVsdCBuby1vcFxuICB9XG5cbiAgLyoqXG4gICAqIEhvb2sgY2FsbGVkIHdoZW4gdGhlIHVuaWZpZWQgY2xpZW50IHJlbmRlci9oeWRyYXRlIHBhdGggdGhyb3dzLlxuICAgKiBTdWJjbGFzc2VzIG1heSByZXR1cm4gYSBWTm9kZSBmYWxsYmFjay5cbiAgICovXG4gIHByb3RlY3RlZCBvblJlbmRlckVycm9yKGVycm9yOiB1bmtub3duKTogVk5vZGUgfCBudWxsIHtcbiAgICBjcmVhdGVMb2dnZXIoJ2RzZCcpLmVycm9yKFxuICAgICAgYDwke3RoaXMudGFnTmFtZS50b0xvd2VyQ2FzZSgpfT4gcmVuZGVyL2h5ZHJhdGUgZmFpbGVkOiAke2Zvcm1hdEVycm9yKGVycm9yKX1gLFxuICAgICk7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBwcml2YXRlIF9yZW5kZXJFcnJvckZhbGxiYWNrKGVycm9yOiB1bmtub3duKTogdm9pZCB7XG4gICAgdGhpcy4jZXZlbnRDbGVhbnVwcyA9IHJlbmRlckVycm9yRmFsbGJhY2soXG4gICAgICB0aGlzLFxuICAgICAgZXJyb3IsXG4gICAgICB0aGlzLiNlZmZlY3REaXNwb3NlcnMsXG4gICAgICB0aGlzLiNldmVudENsZWFudXBzLFxuICAgICAgKGVycikgPT4gdGhpcy5vblJlbmRlckVycm9yKGVyciksXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBMaWZlY3ljbGU6IGNhbGxlZCB3aGVuIHRoZSBlbGVtZW50IGlzIGRpc2Nvbm5lY3RlZCBmcm9tIHRoZSBET00uXG4gICAqIEFib3J0cyBhbGwgaHlkcmF0aW9uIGV2ZW50IGxpc3RlbmVycyBmb3IgY2xlYW51cC5cbiAgICovXG4gIGRpc2Nvbm5lY3RlZENhbGxiYWNrKCk6IHZvaWQge1xuICAgIHRoaXMuI2V2ZW50Q2xlYW51cHMgPSBkaXNwb3NlUmVuZGVyQmluZGluZ3ModGhpcy4jZWZmZWN0RGlzcG9zZXJzLCB0aGlzLiNldmVudENsZWFudXBzKTtcbiAgICBkaXNwb3NlU3RhdGljUHJvcHModGhpcyk7XG4gIH1cblxuICAvLyB2MC4yOCAoQURSLTAwNjcpOiBFZmZlY3QgKyBldmVudCBsaWZlY3ljbGUgbWFuYWdlZCBieSBTZXQvQXJyYXkuXG4gIC8vIF93YWxrQW5kQmluZCBERUxFVEVEIOKAlCByZXBsYWNlZCBieSBfaHlkcmF0ZVNpZ25hbHMoKS5cblxuICAvKipcbiAgICogTGlmZWN5Y2xlOiBjYWxsZWQgd2hlbiBhbiBvYnNlcnZlZCBhdHRyaWJ1dGUgY2hhbmdlcy5cbiAgICpcbiAgICogQmFzZSBpbXBsZW1lbnRhdGlvbiBpcyBhIG5vLW9wLiBTdWJjbGFzc2VzIG92ZXJyaWRlIHRoaXMgdG8gcmVhY3RcbiAgICogdG8gYXR0cmlidXRlIGNoYW5nZXMsIHR5cGljYWxseSBieSBjYWxsaW5nIGB0aGlzLnJlbmRlcigpYCB0byB1cGRhdGVcbiAgICogdGhlIHNoYWRvdyBET00uXG4gICAqXG4gICAqIEBwYXJhbSBuYW1lIC0gQXR0cmlidXRlIG5hbWUgKGxvd2VyY2FzZSkuXG4gICAqIEBwYXJhbSBvbGRWYWx1ZSAtIFByZXZpb3VzIHZhbHVlLCBvciBudWxsIGlmIHRoZSBhdHRyaWJ1dGUgd2FzIG5vdCBzZXQuXG4gICAqIEBwYXJhbSBuZXdWYWx1ZSAtIE5ldyB2YWx1ZSwgb3IgbnVsbCBpZiB0aGUgYXR0cmlidXRlIHdhcyByZW1vdmVkLlxuICAgKi9cbiAgYXR0cmlidXRlQ2hhbmdlZENhbGxiYWNrKFxuICAgIF9uYW1lOiBzdHJpbmcsXG4gICAgX29sZFZhbHVlOiBzdHJpbmcgfCBudWxsLFxuICAgIF9uZXdWYWx1ZTogc3RyaW5nIHwgbnVsbCxcbiAgKTogdm9pZCB7XG4gICAgLy8gdjAuMjQuMSAoQURSLTAwNTcpOiBSb3V0ZSB0byBzdGF0aWMgcHJvcHMgaGFuZGxlclxuICAgIGhhbmRsZVN0YXRpY1Byb3BBdHRyaWJ1dGVDaGFuZ2UoXG4gICAgICB0aGlzLFxuICAgICAgX25hbWUsXG4gICAgICBfb2xkVmFsdWUsXG4gICAgICBfbmV3VmFsdWUsXG4gICAgKTtcbiAgICAvLyBTdWJjbGFzcyBvdmVycmlkZSBwb2ludCAtIGJhc2UgaW1wbGVtZW50YXRpb24gaXMgaW50ZW50aW9uYWxseSBlbXB0eS5cbiAgfVxuXG4gIC8qKlxuICAgKiBSZS1yZW5kZXIgdGhlIHNoYWRvdyBET00gZnJvbSBgcmVuZGVyKClgIGFuZCByZS1iaW5kIGRlY2xhcmF0aXZlIGV2ZW50cy5cbiAgICpcbiAgICogT3BlbkVsZW1lbnQgaW50ZW50aW9uYWxseSBkb2VzIG5vdCBpbmNsdWRlIGEgcmVhY3RpdmUgc2NoZWR1bGVyLiBDb21wb25lbnRzXG4gICAqIHdpdGggbG9jYWwgc3RhdGUgY2FuIGNhbGwgdGhpcyBtZXRob2QgYWZ0ZXIgc3RhdGUgY2hhbmdlcyBpbnN0ZWFkIG9mXG4gICAqIGR1cGxpY2F0aW5nIHJlbmRlclRvRG9tKCkgYW5kIGV2ZW50IGh5ZHJhdGlvbi5cbiAgICovXG4gIHVwZGF0ZSgpOiB2b2lkIHtcbiAgICBjb25zdCBjdG9yID0gdGhpcy5jb25zdHJ1Y3RvciBhcyB0eXBlb2YgT3BlbkVsZW1lbnQ7XG4gICAgaWYgKGN0b3IucmVuZGVyTW9kZSA9PT0gJ2xpZ2h0Jykge1xuICAgICAgdGhpcy5fcmVuZGVySW50b0xpZ2h0RG9tKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuX3JlbmRlckludG9TaGFkb3dSb290KCk7XG4gIH1cblxuICAvKipcbiAgICogUmVhY3RpdmVDb250cm9sbGVyLWNvbXBhdGlibGUgdXBkYXRlIGhvb2suXG4gICAqXG4gICAqIEFzeW5jIHN0YXRlIGNvbnRyb2xsZXJzIGNhbGwgdGhpcyBtZXRob2Qgd2hlbiBzdGF0ZSBjaGFuZ2VzLiBLZWVwaW5nIHRoaXNcbiAgICogdGlueSBhbGlhcyBsZXRzIE9wZW5FbGVtZW50IGhvc3QgY29udHJvbGxlcnMgd2l0aG91dCBpbmhlcml0aW5nIExpdCBvciBhXG4gICAqIHNjaGVkdWxlci5cbiAgICovXG4gIHJlcXVlc3RVcGRhdGUoKTogdm9pZCB7XG4gICAgdGhpcy51cGRhdGUoKTtcbiAgfVxuXG4gIHByaXZhdGUgX3JlbmRlckludG9MaWdodERvbSgpOiB2b2lkIHtcbiAgICB0aGlzLiNldmVudENsZWFudXBzID0gcmVuZGVySW50b0xpZ2h0RG9tKFxuICAgICAgdGhpcyxcbiAgICAgIHRoaXMuI2VmZmVjdERpc3Bvc2VycyxcbiAgICAgIHRoaXMuI2V2ZW50Q2xlYW51cHMsXG4gICAgICB0aGlzLiNjYWNoZUFjY2VzcygpLFxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIF9yZW5kZXJJbnRvU2hhZG93Um9vdCgpOiB2b2lkIHtcbiAgICB0aGlzLiNldmVudENsZWFudXBzID0gcmVuZGVySW50b1NoYWRvd1Jvb3QoXG4gICAgICB0aGlzLFxuICAgICAgdGhpcy4jZWZmZWN0RGlzcG9zZXJzLFxuICAgICAgdGhpcy4jZXZlbnRDbGVhbnVwcyxcbiAgICAgIHRoaXMuI2NhY2hlQWNjZXNzKCksXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBY2Nlc3NvciBmb3IgdGhlIHByaXZhdGUgVk5vZGUgY2FjaGUgdXNlZCBieSBleHRyYWN0ZWQgcmVuZGVyL2h5ZHJhdGlvblxuICAgKiBoZWxwZXJzLiBLZWVwcyAjdm5vZGVDYWNoZSAvICN2bm9kZUNhY2hlVmFsaWQgZW5jYXBzdWxhdGVkIHdoaWxlIGFsbG93aW5nXG4gICAqIHRoZSBsb2dpYyB0byBsaXZlIGluIHNlcGFyYXRlIG1vZHVsZXMuXG4gICAqL1xuICAjY2FjaGVBY2Nlc3MoKTogVk5vZGVDYWNoZUFjY2VzcyB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGdldDogKCkgPT4gKHsgdm5vZGU6IHRoaXMuI3Zub2RlQ2FjaGUsIHZhbGlkOiB0aGlzLiN2bm9kZUNhY2hlVmFsaWQgfSksXG4gICAgICBzZXQ6ICh2bm9kZTogdW5rbm93bikgPT4ge1xuICAgICAgICB0aGlzLiN2bm9kZUNhY2hlID0gdm5vZGU7XG4gICAgICAgIHRoaXMuI3Zub2RlQ2FjaGVWYWxpZCA9IHRydWU7XG4gICAgICB9LFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogUmVhZCBsb2NhbGUgZnJvbSBKUyBwcm9wZXJ0eSAoc2V0IGJ5IFNTUiBpbmplY3RQcm9wcykgZmlyc3QsXG4gICAqIHRoZW4gSFRNTCBhdHRyaWJ1dGUsIHRoZW4gZmFsbGJhY2sgdG8gcHJvdmlkZWQgZGVmYXVsdC5cbiAgICpcbiAgICogU1NSIGluamVjdFByb3BzKCkgc2V0cyBjYW1lbENhc2UgSlMgcHJvcGVydGllcyAoZS5nLiB0aGlzLmxvY2FsZSA9ICdlbicpXG4gICAqIGJ1dCBnZXRBdHRyaWJ1dGUoKSBvbmx5IHJlYWRzIEhUTUwgYXR0cmlidXRlcywgd2hpY2ggcmVtYWluIG51bGwuXG4gICAqIFRoaXMgbWV0aG9kIHJlc29sdmVzIHRoZSBtaXNtYXRjaCBieSBjaGVja2luZyBKUyBwcm9wZXJ0eSBmaXJzdC5cbiAgICpcbiAgICogQHBhcmFtIGZhbGxiYWNrIC0gRGVmYXVsdCB2YWx1ZSB3aGVuIG5laXRoZXIgc291cmNlIGhhcyBhIHZhbHVlLiBEZWZhdWx0cyB0byAnZW4nLlxuICAgKi9cbiAgcHJvdGVjdGVkIF9nZXRMb2NhbGUoZmFsbGJhY2sgPSAnZW4nKTogc3RyaW5nIHtcbiAgICBjb25zdCBwcm9wID0gKHRoaXMgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pLmxvY2FsZTtcbiAgICBpZiAodHlwZW9mIHByb3AgPT09ICdzdHJpbmcnICYmIHByb3ApIHJldHVybiBwcm9wO1xuICAgIHJldHVybiB0aGlzLmdldEF0dHJpYnV0ZSgnbG9jYWxlJykgfHwgZmFsbGJhY2s7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJuIFNoYWRvdyBET00gY29udGVudCBhcyBhIFZOb2RlLlxuICAgKlxuICAgKiBTdWJjbGFzc2VzIE1VU1Qgb3ZlcnJpZGUgdGhpcyBtZXRob2QuIER1cmluZyBTU1IsIHJlbmRlcmVkIGNvbnRlbnQgaXNcbiAgICogd3JhcHBlZCBpbiBhIDx0ZW1wbGF0ZSBzaGFkb3dyb290bW9kZT1cIm9wZW5cIj4gdGFnLiBEdXJpbmcgQ1NSLCBWTm9kZSB2YWx1ZXNcbiAgICogYXJlIHJlbmRlcmVkIHZpYSByZW5kZXJUb0RvbSgpIHdpdGggZXZlbnQgYmluZGluZyBhbmQgc2lnbmFsIHRyYWNraW5nLlxuICAgKlxuICAgKiBAcmV0dXJucyBWTm9kZSBmb3IgdGhlIHNoYWRvdyBET00gY29udGVudCwgb3IgbnVsbCBmb3IgZW1wdHkgY29udGVudC5cbiAgICovXG4gIHJlbmRlcigpOiBWTm9kZSB8IG51bGwge1xuICAgIHJldHVybiBudWxsO1xuICB9XG59XG5cbi8qKiBPcGVuRWxlbWVudCBjb25zdHJ1Y3RvciB3aXRoIGZyYW1ld29yay1jb252ZW50aW9uIHN0YXRpYyBwcm9wZXJ0aWVzLiAqL1xuZXhwb3J0IGludGVyZmFjZSBPcGVuRWxlbWVudENvbXBvbmVudENvbnN0cnVjdG9yIGV4dGVuZHMgQ3VzdG9tRWxlbWVudENvbnN0cnVjdG9yIHtcbiAgc3R5bGVzPzpcbiAgICB8IFN0eWxlU2hlZXRMaWtlXG4gICAgfCBTdHlsZVNoZWV0TGlrZVtdO1xuICB0YWdOYW1lPzogc3RyaW5nO1xuICByZW5kZXJNb2RlPzogJ3NoYWRvdycgfCAnbGlnaHQnO1xuICBvYnNlcnZlZEF0dHJpYnV0ZXM/OiBzdHJpbmdbXTtcbn1cbiJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztDQThDQyxHQUVE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
|
package/src/types.d.ts
ADDED
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @openelement/element — Public types.
|
|
3
|
+
*/ import type { VNode } from '@openelement/protocol/vnode';
|
|
4
|
+
import type { StyleSheetLike } from '@openelement/protocol/style-sheet';
|
|
5
|
+
export interface ElementDefinition<Props extends Record<string, unknown> = Record<string, unknown>> {
|
|
6
|
+
styles?: StyleSheetLike | StyleSheetLike[];
|
|
7
|
+
render: (props: Props) => VNode | null;
|
|
8
|
+
}
|
package/src/types.js
ADDED
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @openelement/element — Public types.
|
|
3
|
+
*/
|
|
4
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImZpbGU6Ly8vaG9tZS9ydW5uZXIvd29yay9vcGVuZWxlbWVudC9vcGVuZWxlbWVudC9wYWNrYWdlcy9lbGVtZW50L3NyYy90eXBlcy50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBvcGVuZWxlbWVudC9lbGVtZW50IOKAlCBQdWJsaWMgdHlwZXMuXG4gKi9cblxuaW1wb3J0IHR5cGUgeyBWTm9kZSB9IGZyb20gJ0BvcGVuZWxlbWVudC9wcm90b2NvbC92bm9kZSc7XG5pbXBvcnQgdHlwZSB7IFN0eWxlU2hlZXRMaWtlIH0gZnJvbSAnQG9wZW5lbGVtZW50L3Byb3RvY29sL3N0eWxlLXNoZWV0JztcblxuZXhwb3J0IGludGVyZmFjZSBFbGVtZW50RGVmaW5pdGlvbjxcbiAgUHJvcHMgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuPiB7XG4gIHN0eWxlcz86IFN0eWxlU2hlZXRMaWtlIHwgU3R5bGVTaGVldExpa2VbXTtcbiAgcmVuZGVyOiAocHJvcHM6IFByb3BzKSA9PiBWTm9kZSB8IG51bGw7XG59XG4iXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7O0NBRUMsR0FFRCJ9
|