@rooted/elements 1.0.0-alpha.0 → 1.0.0-alpha.10
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/elements.d.mts +204 -58
- package/dist/elements.mjs +121 -82
- package/dist/events.d.mts +1 -1
- package/dist/events.mjs +1 -3
- package/package.json +59 -58
- package/readme.md +35 -3
- package/LICENSE +0 -21
package/dist/elements.d.mts
CHANGED
|
@@ -1,35 +1,94 @@
|
|
|
1
|
-
import { ElementOnHandlers } from
|
|
2
|
-
|
|
1
|
+
import { ElementOnHandlers } from "@rooted/events";
|
|
2
|
+
//#region src/aria.d.mts
|
|
3
3
|
type StripAria<S extends string> = S extends `aria${infer Rest}` ? Uncapitalize<Rest> : S;
|
|
4
|
-
type AriaStringProperties = {
|
|
5
|
-
[P in keyof ARIAMixin as ARIAMixin[P] extends string | null ? StripAria<string & P> : never]?: string | null;
|
|
6
|
-
};
|
|
4
|
+
type AriaStringProperties = { [P in keyof ARIAMixin as ARIAMixin[P] extends string | null ? StripAria<string & P> : never]?: string | null; };
|
|
7
5
|
type AriaIdReferenceProperties = {
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
6
|
+
/** {@inheritdoc ARIAMixin['ariaActiveDescendantElement']} */
|
|
7
|
+
activeDescendant?: string | Element | null;
|
|
8
|
+
/** {@inheritdoc ARIAMixin['ariaControlsElements']} */
|
|
9
|
+
controls?: string | Element | null;
|
|
10
|
+
/** {@inheritdoc ARIAMixin['ariaDescribedByElements']} */
|
|
11
|
+
describedBy?: string | Element | null;
|
|
12
|
+
/** {@inheritdoc ARIAMixin['ariaDetailsElements']} */
|
|
13
|
+
details?: string | Element | null;
|
|
14
|
+
/** {@inheritdoc ARIAMixin['ariaErrorMessageElements']} */
|
|
15
|
+
errorMessage?: string | Element | null;
|
|
16
|
+
/** {@inheritdoc ARIAMixin['ariaFlowToElements']} */
|
|
17
|
+
flowTo?: string | Element | null;
|
|
18
|
+
/** {@inheritdoc ARIAMixin['ariaLabelledByElements']} */
|
|
19
|
+
labelledBy?: string | Element | null;
|
|
20
|
+
/** {@inheritdoc ARIAMixin['ariaOwnsElements']} */
|
|
21
|
+
owns?: string | Element | null;
|
|
24
22
|
};
|
|
23
|
+
/**
|
|
24
|
+
* Shape of the `aria` prop on `element(...)`. Accepts every ARIA attribute
|
|
25
|
+
* defined on `ARIAMixin`, with the `aria` prefix stripped (so `aria-label`
|
|
26
|
+
* becomes `label`, `aria-describedby` becomes `describedBy`).
|
|
27
|
+
*
|
|
28
|
+
* For ID-reference attributes (`aria-labelledby`, `aria-controls`, etc.) the
|
|
29
|
+
* value can be a string ID or an `Element` reference. Element references are
|
|
30
|
+
* set via the IDL reflection property when supported, falling back to the
|
|
31
|
+
* attribute value otherwise.
|
|
32
|
+
*
|
|
33
|
+
* @example
|
|
34
|
+
* ```ts
|
|
35
|
+
* element('button', {
|
|
36
|
+
* aria: {
|
|
37
|
+
* label: 'Save',
|
|
38
|
+
* describedBy: helpTextElement,
|
|
39
|
+
* pressed: 'false',
|
|
40
|
+
* },
|
|
41
|
+
* })
|
|
42
|
+
* ```
|
|
43
|
+
*/
|
|
25
44
|
type Aria = AriaStringProperties & AriaIdReferenceProperties;
|
|
26
|
-
|
|
45
|
+
//#endregion
|
|
46
|
+
//#region src/children.d.mts
|
|
47
|
+
/**
|
|
48
|
+
* A single child of an element: a `Node` or a string of text. `undefined` and
|
|
49
|
+
* `null` are allowed too, and get skipped when the children are appended, so
|
|
50
|
+
* conditional children don't need a guard.
|
|
51
|
+
*/
|
|
52
|
+
export type ElementChild = Node | string | undefined | null;
|
|
53
|
+
/**
|
|
54
|
+
* One or more children accepted by the `children` prop of every element
|
|
55
|
+
* created via `element()`, `create()` or `append()`.
|
|
56
|
+
*
|
|
57
|
+
* - A single `Node` or string is appended as-is.
|
|
58
|
+
* - An array is appended in order, skipping `undefined` and `null` entries.
|
|
59
|
+
*
|
|
60
|
+
* Because those entries are skipped, conditional children can be written
|
|
61
|
+
* inline with `optional()`. A plain ternary ending in `undefined` works too,
|
|
62
|
+
* it just reads worse.
|
|
63
|
+
*
|
|
64
|
+
* @example
|
|
65
|
+
* ```ts
|
|
66
|
+
* import { optional } from '@rooted/components'
|
|
67
|
+
*
|
|
68
|
+
* element('label', {
|
|
69
|
+
* children: [
|
|
70
|
+
* element('span', {
|
|
71
|
+
* textContent: 'Name',
|
|
72
|
+
* }),
|
|
73
|
+
* optional(required,
|
|
74
|
+
* element('abbr', {
|
|
75
|
+
* title: 'required',
|
|
76
|
+
* textContent: '*',
|
|
77
|
+
* })
|
|
78
|
+
* ),
|
|
79
|
+
* ],
|
|
80
|
+
* })
|
|
81
|
+
* ```
|
|
82
|
+
*/
|
|
83
|
+
export type ElementChildren = Array<ElementChild> | ElementChild;
|
|
84
|
+
//#endregion
|
|
85
|
+
//#region src/classes.d.mts
|
|
27
86
|
/**
|
|
28
87
|
* A single CSS class value. Falsy variants (`undefined` and `null`) are
|
|
29
88
|
* automatically filtered out when building a class list, so conditional
|
|
30
89
|
* classes can be expressed without explicit guards.
|
|
31
90
|
*/
|
|
32
|
-
type CssClass = string | undefined | null;
|
|
91
|
+
export type CssClass = string | undefined | null;
|
|
33
92
|
/**
|
|
34
93
|
* One or more CSS class values accepted by the `classes` prop of every HTML
|
|
35
94
|
* element created via `create()` or `append()`.
|
|
@@ -40,58 +99,145 @@ type CssClass = string | undefined | null;
|
|
|
40
99
|
*
|
|
41
100
|
* @see {@link cssClass} for composing conditional class names.
|
|
42
101
|
*/
|
|
43
|
-
type CssClasses = Array<CssClass> | CssClass;
|
|
102
|
+
export type CssClasses = Array<CssClass> | CssClass;
|
|
103
|
+
/**
|
|
104
|
+
* Class names mapped to whether they apply. Only `true` includes the class,
|
|
105
|
+
* anything else leaves it out.
|
|
106
|
+
*
|
|
107
|
+
* Keys have to be strings, so this doesn't work with a `CssModule` value that
|
|
108
|
+
* TypeScript thinks might be `undefined`. Use the list form of
|
|
109
|
+
* {@link cssClasses} for those.
|
|
110
|
+
*
|
|
111
|
+
* @see {@link cssClasses} for the function that reads this.
|
|
112
|
+
*/
|
|
113
|
+
export type CssClassDictionary = Record<string, boolean | null | undefined>;
|
|
44
114
|
/**
|
|
45
|
-
* Returns `className` when `visible` is
|
|
115
|
+
* Returns `className` when `visible` is `true`, otherwise `undefined`.
|
|
46
116
|
*
|
|
47
117
|
* Designed to compose cleanly with {@link CssClasses}: falsy values are
|
|
48
118
|
* filtered out automatically, so static and conditional classes can be mixed
|
|
49
|
-
* in a single array without branching.
|
|
119
|
+
* in a single array without branching. Called with just a class name it
|
|
120
|
+
* returns that name, which is handy when the rest of the array is conditional.
|
|
121
|
+
*
|
|
122
|
+
* The condition comes first, same as `optional()`.
|
|
50
123
|
*
|
|
124
|
+
* @param visible - When `true` the class is returned, any other value produces
|
|
125
|
+
* `undefined`.
|
|
51
126
|
* @param className - The CSS class to apply.
|
|
52
|
-
* @param visible - When `true` (the default) the class is returned; any other
|
|
53
|
-
* value produces `undefined`.
|
|
54
127
|
*
|
|
55
128
|
* @example
|
|
56
129
|
* ```ts
|
|
57
130
|
* append('button', {
|
|
58
131
|
* classes: [
|
|
59
132
|
* 'btn',
|
|
60
|
-
* cssClass('btn--active'
|
|
61
|
-
* cssClass('btn--disabled'
|
|
133
|
+
* cssClass(isActive, 'btn--active'),
|
|
134
|
+
* cssClass(isDisabled, 'btn--disabled'),
|
|
62
135
|
* ],
|
|
63
136
|
* })
|
|
64
137
|
* ```
|
|
65
138
|
*/
|
|
66
|
-
declare function cssClass(className:
|
|
67
|
-
declare function cssClass(
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
139
|
+
export declare function cssClass(className: CssClass): CssClass;
|
|
140
|
+
export declare function cssClass(visible: boolean | null | undefined, className: CssClass): CssClass;
|
|
141
|
+
/**
|
|
142
|
+
* Joins several class names into one {@link CssClass}, dropping the falsy
|
|
143
|
+
* ones. Returns `undefined` when nothing is left, so the result disappears
|
|
144
|
+
* from a `classes` array instead of adding an empty string.
|
|
145
|
+
*
|
|
146
|
+
* Three ways to call it:
|
|
147
|
+
*
|
|
148
|
+
* - `cssClasses('a', 'b')` joins what you pass.
|
|
149
|
+
* - `cssClasses(visible, 'a', 'b')` joins them only when `visible` is `true`.
|
|
150
|
+
* - `cssClasses({ a: true, b: false })` keeps the keys mapped to `true`.
|
|
151
|
+
*
|
|
152
|
+
* Watch out for one overlap: a leading `undefined` or `null` is read as the
|
|
153
|
+
* condition, so `cssClasses(undefined, 'a')` is `undefined` and not `'a'`.
|
|
154
|
+
* A class name that might be `undefined`, like anything off a `CssModule`,
|
|
155
|
+
* belongs after the condition rather than first.
|
|
156
|
+
*
|
|
157
|
+
* @example
|
|
158
|
+
* ```ts
|
|
159
|
+
* append('button', {
|
|
160
|
+
* classes: [
|
|
161
|
+
* cssClasses(styles.button, styles.rounded),
|
|
162
|
+
* cssClasses(isActive, styles.active, styles.raised),
|
|
163
|
+
* cssClasses({
|
|
164
|
+
* 'btn--disabled': isDisabled,
|
|
165
|
+
* }),
|
|
166
|
+
* ],
|
|
167
|
+
* })
|
|
168
|
+
* ```
|
|
169
|
+
*/
|
|
170
|
+
export declare function cssClasses(visible: boolean | null | undefined, ...classNames: Array<CssClass>): CssClass;
|
|
171
|
+
export declare function cssClasses(...classNames: Array<CssClass>): CssClass;
|
|
172
|
+
export declare function cssClasses(classNames: CssClassDictionary): CssClass;
|
|
173
|
+
//#endregion
|
|
174
|
+
//#region src/element-type-utilities.d.mts
|
|
71
175
|
type IfEquals<X, Y, A = X, B = never> = (<T>() => T extends X ? 1 : 2) extends (<T>() => T extends Y ? 1 : 2) ? A : B;
|
|
72
|
-
type NonWritableKeys<T> = {
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
type
|
|
80
|
-
[P in keyof T]: NonNullable<T[P]> extends (...arguments_: never[]) => unknown ? P : never;
|
|
81
|
-
}[keyof T];
|
|
82
|
-
type OnHandlerKeys<T> = {
|
|
83
|
-
[P in keyof T]: P extends `on${string}` ? P : never;
|
|
84
|
-
}[keyof T];
|
|
85
|
-
type SanitizedHtmlProperties<TElement extends HTMLElement> = Omit<TElement, NonWritableKeys<TElement> | FunctionKeys<TElement> | Exclude<keyof ARIAMixin, 'role'> | OnHandlerKeys<TElement> | 'children' | 'className' | 'classList'>;
|
|
176
|
+
type NonWritableKeys<T> = { [P in keyof T]-?: IfEquals<{ [Q in P]: T[P]; }, { -readonly [Q in P]: T[P]; }, never, P>; }[keyof T];
|
|
177
|
+
type FunctionKeys<T> = { [P in keyof T]: NonNullable<T[P]> extends ((...arguments_: never[]) => unknown) ? P : never; }[keyof T];
|
|
178
|
+
type OnHandlerKeys<T> = { [P in keyof T]: P extends `on${string}` ? P : never; }[keyof T];
|
|
179
|
+
/** A subset of CSSStyleDeclaration containing only the individual CSS style properties. */
|
|
180
|
+
type InlineStyle = { [K in keyof CSSStyleDeclaration as CSSStyleDeclaration[K] extends string ? K extends 'cssText' ? never : K : never]?: string; };
|
|
181
|
+
//#endregion
|
|
182
|
+
//#region src/html-element-properties.d.mts
|
|
183
|
+
type SanitizedHtmlProperties<TElement extends HTMLElement> = Omit<TElement, NonWritableKeys<TElement> | FunctionKeys<TElement> | Exclude<keyof ARIAMixin, 'role'> | OnHandlerKeys<TElement> | 'children' | 'className' | 'classList' | 'style'>;
|
|
86
184
|
type HtmlElementPropertiesMapped<TElement extends HTMLElement> = Partial<SanitizedHtmlProperties<TElement>> & {
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
185
|
+
[key: string]: unknown;
|
|
186
|
+
children?: ElementChildren;
|
|
187
|
+
classes?: CssClasses;
|
|
188
|
+
style?: InlineStyle;
|
|
189
|
+
aria?: Aria;
|
|
190
|
+
on?: ElementOnHandlers<TElement>;
|
|
91
191
|
};
|
|
192
|
+
/**
|
|
193
|
+
* Typed properties for the HTML element with tag `KElement`. Returned as the
|
|
194
|
+
* second argument to `element(tag, props)` for HTML tags.
|
|
195
|
+
*
|
|
196
|
+
* Includes the writable DOM properties of the element, plus rooted's own
|
|
197
|
+
* `classes`, `style`, `aria`, `on`, and `children` shorthands. Unknown keys
|
|
198
|
+
* (`data-*`, custom attributes) fall through as strings.
|
|
199
|
+
*/
|
|
92
200
|
type HtmlElementProperties<KElement extends keyof HTMLElementTagNameMap> = HtmlElementPropertiesMapped<HTMLElementTagNameMap[KElement]>;
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
201
|
+
//#endregion
|
|
202
|
+
//#region src/svg-element-properties.d.mts
|
|
203
|
+
/**
|
|
204
|
+
* Tag names accepted by `element(...)` for SVG. Use `'svg'` for the root
|
|
205
|
+
* element and `'svg:<name>'` for the rest. The prefix avoids collisions with
|
|
206
|
+
* same-named HTML tags (`a`, `title`, etc.).
|
|
207
|
+
*/
|
|
208
|
+
type SvgTagName = 'svg' | `svg:${Exclude<keyof SVGElementTagNameMap, 'svg'>}`;
|
|
209
|
+
/** Maps a {@link SvgTagName} back to the concrete SVG element class. */
|
|
210
|
+
type SvgTagElement<T extends SvgTagName> = T extends 'svg' ? SVGSVGElement : T extends `svg:${infer K extends keyof SVGElementTagNameMap}` ? SVGElementTagNameMap[K] : never;
|
|
211
|
+
type SanitizedSvgProperties<TElement extends SVGElement> = Omit<TElement, NonWritableKeys<TElement> | FunctionKeys<TElement> | Exclude<keyof ARIAMixin, 'role'> | OnHandlerKeys<TElement> | 'children' | 'className' | 'classList' | 'style'>;
|
|
212
|
+
type SvgElementPropertiesMapped<TElement extends SVGElement> = Partial<SanitizedSvgProperties<TElement>> & {
|
|
213
|
+
[key: string]: unknown;
|
|
214
|
+
classes?: CssClasses;
|
|
215
|
+
style?: InlineStyle;
|
|
216
|
+
children?: ElementChildren;
|
|
217
|
+
aria?: Aria;
|
|
218
|
+
on?: ElementOnHandlers<TElement>;
|
|
219
|
+
};
|
|
220
|
+
/**
|
|
221
|
+
* Typed properties for the SVG element with tag `K`. Returned as the second
|
|
222
|
+
* argument to `element(tag, props)` for SVG tags. Unknown keys fall through
|
|
223
|
+
* to `setAttribute`, so SVG-specific attributes (`viewBox`, `d`, `href`)
|
|
224
|
+
* work without special-casing.
|
|
225
|
+
*/
|
|
226
|
+
type SvgElementProperties<K extends SvgTagName> = SvgElementPropertiesMapped<SvgTagElement<K> & SVGElement>;
|
|
227
|
+
//#endregion
|
|
228
|
+
//#region src/element-factory.d.mts
|
|
229
|
+
export type ElementCreator = (key: string, ns?: string) => Element;
|
|
230
|
+
/**
|
|
231
|
+
* The overloaded function type returned by {@link createElementFactory}.
|
|
232
|
+
* Accepts HTML or SVG tag names and returns the matching element type.
|
|
233
|
+
*/
|
|
234
|
+
export interface ElementCreatorFunction {
|
|
235
|
+
(tag: 'svg', properties?: SvgElementProperties<'svg'>): SVGSVGElement;
|
|
236
|
+
<K extends Exclude<SvgTagName, 'svg'>>(tag: K, properties?: SvgElementProperties<K>): SvgTagElement<K>;
|
|
237
|
+
<K extends keyof HTMLElementTagNameMap>(tag: K, properties?: NoInfer<HtmlElementProperties<K>>): HTMLElementTagNameMap[K];
|
|
238
|
+
}
|
|
239
|
+
export type ElementFactory = ElementCreatorFunction;
|
|
240
|
+
export declare function createElementFactory(constructElement: ElementCreator, signal: AbortSignal): ElementCreatorFunction;
|
|
241
|
+
//#endregion
|
|
242
|
+
export type { Aria, HtmlElementProperties, SvgElementProperties, SvgTagElement, SvgTagName };
|
|
243
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWxlbWVudHMuZC5tdHMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vc3JjL2FyaWEubXRzIiwiLi4vc3JjL2NoaWxkcmVuLm10cyIsIi4uL3NyYy9jbGFzc2VzLm10cyIsIi4uL3NyYy9lbGVtZW50LXR5cGUtdXRpbGl0aWVzLm10cyIsIi4uL3NyYy9odG1sLWVsZW1lbnQtcHJvcGVydGllcy5tdHMiLCIuLi9zcmMvc3ZnLWVsZW1lbnQtcHJvcGVydGllcy5tdHMiLCIuLi9zcmMvZWxlbWVudC1mYWN0b3J5Lm10cyJdLCJtYXBwaW5ncyI6Ijs7S0FBSyxVQUFVLG9CQUFvQix1QkFBdUIsU0FBUyxhQUFhLFFBQVE7S0FFbkYsMEJBQ0gsV0FBVyxhQUFhLFVBQVUsMkJBQTJCLG1CQUFtQjtLQUk3RTs7RUFFSiw0QkFBNEI7O0VBRTVCLG9CQUFvQjs7RUFFcEIsdUJBQXVCOztFQUV2QixtQkFBbUI7O0VBRW5CLHdCQUF3Qjs7RUFFeEIsa0JBQWtCOztFQUVsQixzQkFBc0I7O0VBRXRCLGdCQUFnQjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7S0F3QkwsT0FBTyx1QkFBdUI7Ozs7Ozs7O1lDMUM5QixlQUFlOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O1lBZ0NmLGtCQUFrQixNQUFNLGdCQUFnQjs7Ozs7Ozs7WUNoQ3hDOzs7Ozs7Ozs7OztZQVlBLGFBQWEsTUFBTSxZQUFZOzs7Ozs7Ozs7OztZQVkvQixxQkFBcUI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O3dCQTJCakIsU0FBUyxXQUFXLFdBQVc7d0JBQy9CLFNBQVMscUNBQXFDLFdBQVcsV0FBVzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O3dCQXNDcEUsV0FBVyx3Q0FBd0MsWUFBWSxNQUFNLFlBQVk7d0JBQ2pGLGNBQWMsWUFBWSxNQUFNLFlBQVk7d0JBQzVDLFdBQVcsWUFBWSxxQkFBcUI7OztLQ2pHaEQsU0FBUyxHQUFHLEdBQUcsSUFBSSxHQUFHLGVBQWUsUUFBUSxVQUFVLHFCQUFxQixRQUFRLFVBQVUsYUFBYSxJQUFJO0tBQy9HLGdCQUFnQixRQUMxQixXQUFXLE1BQU0sWUFBWSxLQUFLLElBQUksRUFBRSxvQkFBbUIsS0FBSyxJQUFJLEVBQUUsY0FBYSxZQUM3RTtLQUNJLGFBQWEsUUFDdkIsV0FBVyxJQUFJLFlBQVksRUFBRSxpQkFBZ0IsbUNBQWtDLG1CQUN6RTtLQUNJLGNBQWMsUUFBUSxXQUFXLElBQUksMEJBQTBCLG1CQUFrQjs7S0FHakYsaUJBQWlCLFdBQVcsdUJBQXVCLG9CQUFvQixvQkFBb0IsOEJBQThCOzs7S0NIaEksd0JBQXdCLGlCQUFpQixlQUFlLEtBQzVELFVBQ0UsZ0JBQWdCLFlBQ2hCLGFBQWEsWUFDYixjQUFjLHFCQUNkLGNBQWM7S0FJWiw0QkFBNEIsaUJBQWlCLGVBQy9DLFFBQVEsd0JBQXdCO0dBR2hDO0VBQ0QsV0FBVztFQUNYLFVBQVU7RUFDVixRQUFRO0VBQ1IsT0FBTztFQUNQLEtBQUssa0JBQWtCOzs7Ozs7Ozs7O0tBV2Isc0JBQXNCLHVCQUF1Qix5QkFDdEQsNEJBQTRCLHNCQUFzQjs7Ozs7Ozs7S0N6QnpDLDRCQUE0QixjQUFjOztLQUcxQyxjQUFjLFVBQVUsY0FDakMsa0JBQWtCLGdCQUNsQix1QkFBdUIsZ0JBQWdCLHlCQUF5QixxQkFBcUI7S0FHbkYsdUJBQXVCLGlCQUFpQixjQUFjLEtBQzFELFVBQ0UsZ0JBQWdCLFlBQ2hCLGFBQWEsWUFDYixjQUFjLHFCQUNkLGNBQWM7S0FJWiwyQkFBMkIsaUJBQWlCLGNBQzlDLFFBQVEsdUJBQXVCO0dBRy9CO0VBQ0QsVUFBVTtFQUNWLFFBQVE7RUFDUixXQUFXO0VBQ1gsT0FBTztFQUNQLEtBQUssa0JBQWtCOzs7Ozs7OztLQVNiLHFCQUFxQixVQUFVLGNBQ3hDLDJCQUEyQixjQUFjLEtBQUs7OztZQ1ByQyxrQkFBa0IsYUFBYSxnQkFBZ0I7Ozs7O2lCQU0xQztHQUNmLFlBQVksYUFBYSw4QkFBOEI7R0FDdkQsVUFBVSxRQUFRLG9CQUFvQixLQUFLLEdBQUcsYUFBYSxxQkFBcUIsS0FBSyxjQUFjO0dBQ25HLGdCQUFnQix1QkFBdUIsS0FBSyxHQUFHLGFBQWEsUUFBUSxzQkFBc0IsTUFBTSxzQkFBc0I7O1lBRzVHLGlCQUFpQjt3QkFDYixxQkFBcUIsa0JBQWtCLGdCQUFnQixRQUFRLGNBQWMifQ==
|
package/dist/elements.mjs
CHANGED
|
@@ -1,96 +1,135 @@
|
|
|
1
|
-
|
|
2
|
-
function cssClass(
|
|
3
|
-
|
|
4
|
-
|
|
1
|
+
//#region src/classes.mts
|
|
2
|
+
function cssClass(...arguments_) {
|
|
3
|
+
if (arguments_.length === 1) return arguments_[0];
|
|
4
|
+
const [visible, className] = arguments_;
|
|
5
|
+
if (visible !== true) return;
|
|
6
|
+
return className;
|
|
5
7
|
}
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
8
|
+
function cssClasses(...arguments_) {
|
|
9
|
+
const [first, ...rest] = arguments_;
|
|
10
|
+
if (typeof first === "string") return joinClassNames([first, ...rest]);
|
|
11
|
+
if (first === void 0 || first === null || typeof first === "boolean") {
|
|
12
|
+
if (first !== true) return;
|
|
13
|
+
return joinClassNames(rest);
|
|
14
|
+
}
|
|
15
|
+
return joinClassNames(Object.entries(first).filter(([, visible]) => visible === true).map(([className]) => className));
|
|
16
|
+
}
|
|
17
|
+
function joinClassNames(classNames) {
|
|
18
|
+
const className = classNames.filter(Boolean).join(" ");
|
|
19
|
+
if (!className) return;
|
|
20
|
+
return className;
|
|
21
|
+
}
|
|
22
|
+
//#endregion
|
|
23
|
+
//#region src/aria.mts
|
|
24
|
+
const ariaIdReferenceAttributes = {
|
|
25
|
+
activeDescendant: "aria-activedescendant",
|
|
26
|
+
controls: "aria-controls",
|
|
27
|
+
describedBy: "aria-describedby",
|
|
28
|
+
details: "aria-details",
|
|
29
|
+
errorMessage: "aria-errormessage",
|
|
30
|
+
flowTo: "aria-flowto",
|
|
31
|
+
labelledBy: "aria-labelledby",
|
|
32
|
+
owns: "aria-owns"
|
|
17
33
|
};
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
34
|
+
const ariaIdReferenceElementProperties = {
|
|
35
|
+
activeDescendant: "ariaActiveDescendantElement",
|
|
36
|
+
controls: "ariaControlsElements",
|
|
37
|
+
describedBy: "ariaDescribedByElements",
|
|
38
|
+
details: "ariaDetailsElements",
|
|
39
|
+
errorMessage: "ariaErrorMessageElements",
|
|
40
|
+
flowTo: "ariaFlowToElements",
|
|
41
|
+
labelledBy: "ariaLabelledByElements",
|
|
42
|
+
owns: "ariaOwnsElements"
|
|
27
43
|
};
|
|
28
44
|
function setProperty(element, key, value) {
|
|
29
|
-
|
|
45
|
+
element[key] = value;
|
|
30
46
|
}
|
|
31
47
|
function buildAriaProperties(aria, element) {
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
}
|
|
48
|
+
if (!aria) return;
|
|
49
|
+
for (const [key, value] of Object.entries(aria)) {
|
|
50
|
+
if (!(key in ariaIdReferenceAttributes)) {
|
|
51
|
+
setProperty(element, `aria${key[0].toUpperCase()}${key.slice(1)}`, value);
|
|
52
|
+
continue;
|
|
53
|
+
}
|
|
54
|
+
if (value === null || value === void 0) {
|
|
55
|
+
element.removeAttribute(ariaIdReferenceAttributes[key]);
|
|
56
|
+
continue;
|
|
57
|
+
}
|
|
58
|
+
if (value instanceof Element) {
|
|
59
|
+
const idlKey = ariaIdReferenceElementProperties[key];
|
|
60
|
+
setProperty(element, idlKey, idlKey.endsWith("Elements") ? [value] : value);
|
|
61
|
+
continue;
|
|
62
|
+
}
|
|
63
|
+
element.setAttribute(ariaIdReferenceAttributes[key], value);
|
|
64
|
+
}
|
|
50
65
|
}
|
|
51
|
-
|
|
52
|
-
|
|
66
|
+
//#endregion
|
|
67
|
+
//#region src/element-factory.mts
|
|
53
68
|
function buildOnHandlers(on, element, signal) {
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
(event) => void handler(event),
|
|
60
|
-
signal ? { signal } : void 0
|
|
61
|
-
);
|
|
62
|
-
}
|
|
69
|
+
if (!on) return;
|
|
70
|
+
for (const [key, handler] of Object.entries(on)) {
|
|
71
|
+
if (!handler) continue;
|
|
72
|
+
element.addEventListener(key, (event) => void handler(event), signal ? { signal } : void 0);
|
|
73
|
+
}
|
|
63
74
|
}
|
|
64
75
|
function buildClassList(classes) {
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
76
|
+
if (classes === null || classes === void 0) return {};
|
|
77
|
+
if (Array.isArray(classes)) return { className: classes.filter(Boolean).join(" ") };
|
|
78
|
+
return { className: String(classes) };
|
|
79
|
+
}
|
|
80
|
+
function isWritableDomProperty(element, key) {
|
|
81
|
+
let prototype = element;
|
|
82
|
+
while (prototype) {
|
|
83
|
+
const desc = Object.getOwnPropertyDescriptor(prototype, key);
|
|
84
|
+
if (desc) return !!(desc.writable || desc.set);
|
|
85
|
+
prototype = Object.getPrototypeOf(prototype);
|
|
86
|
+
}
|
|
87
|
+
return false;
|
|
68
88
|
}
|
|
69
89
|
function createElementFactory(constructElement, signal) {
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
90
|
+
function createElement(tag, properties) {
|
|
91
|
+
if (tag === "svg" || tag.startsWith("svg:")) {
|
|
92
|
+
const actualTag = tag === "svg" ? "svg" : tag.slice(4);
|
|
93
|
+
const { classes, children, aria, on, style, ...attributes } = properties ?? {};
|
|
94
|
+
const newElement = constructElement(actualTag, "http://www.w3.org/2000/svg");
|
|
95
|
+
for (const [key, value] of Object.entries(attributes)) {
|
|
96
|
+
if (value === void 0 || value === null) continue;
|
|
97
|
+
if (isWritableDomProperty(newElement, key)) newElement[key] = value;
|
|
98
|
+
else if (typeof value === "string" || typeof value === "number" || typeof value === "boolean") newElement.setAttribute(key, String(value));
|
|
99
|
+
}
|
|
100
|
+
const { className } = buildClassList(classes);
|
|
101
|
+
if (className) newElement.setAttribute("class", className);
|
|
102
|
+
if (style) Object.assign(newElement.style, style);
|
|
103
|
+
buildAriaProperties(aria, newElement);
|
|
104
|
+
buildOnHandlers(on, newElement, signal);
|
|
105
|
+
appendChildren(newElement, children);
|
|
106
|
+
return newElement;
|
|
107
|
+
}
|
|
108
|
+
const { aria, children, classes, on, style, ...assignableProperties } = properties ?? {};
|
|
109
|
+
const newElement = constructElement(tag);
|
|
110
|
+
const { className } = buildClassList(classes);
|
|
111
|
+
if (className) newElement.className = className;
|
|
112
|
+
for (const [key, value] of Object.entries(assignableProperties)) {
|
|
113
|
+
if (value === void 0 || value === null) continue;
|
|
114
|
+
if (isWritableDomProperty(newElement, key)) newElement[key] = value;
|
|
115
|
+
else if (typeof value === "string" || typeof value === "number" || typeof value === "boolean") newElement.setAttribute(key, String(value));
|
|
116
|
+
}
|
|
117
|
+
if (style) Object.assign(newElement.style, style);
|
|
118
|
+
buildAriaProperties(aria, newElement);
|
|
119
|
+
buildOnHandlers(on, newElement, signal);
|
|
120
|
+
appendChildren(newElement, children);
|
|
121
|
+
return newElement;
|
|
122
|
+
}
|
|
123
|
+
return createElement;
|
|
124
|
+
}
|
|
125
|
+
function appendChildren(element, children) {
|
|
126
|
+
if (Array.isArray(children)) for (const child of children) {
|
|
127
|
+
if (child === void 0 || child === null) continue;
|
|
128
|
+
element.append(child);
|
|
129
|
+
}
|
|
130
|
+
else if (children) element.append(children);
|
|
92
131
|
}
|
|
132
|
+
//#endregion
|
|
133
|
+
export { createElementFactory, cssClass, cssClasses };
|
|
93
134
|
|
|
94
|
-
export { createElementFactory, cssClass };
|
|
95
|
-
//# sourceMappingURL=elements.mjs.map
|
|
96
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9jbGFzc2VzLm10cyIsIi4uL3NyYy9hcmlhLm10cyIsIi4uL3NyYy9lbGVtZW50LWZhY3RvcnkubXRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUE2Q08sU0FBUyxRQUFBLENBQVMsU0FBQSxFQUFxQixPQUFBLEdBQXNDLElBQUEsRUFBZ0I7QUFDbkcsRUFBQSxJQUFJLFlBQVksSUFBQSxFQUFNO0FBQ3RCLEVBQUEsT0FBTyxTQUFBO0FBQ1I7OztBQ3BCQSxJQUFNLHlCQUFBLEdBQTZFO0FBQUEsRUFDbEYsZ0JBQUEsRUFBa0IsdUJBQUE7QUFBQSxFQUNsQixRQUFBLEVBQVUsZUFBQTtBQUFBLEVBQ1YsV0FBQSxFQUFhLGtCQUFBO0FBQUEsRUFDYixPQUFBLEVBQVMsY0FBQTtBQUFBLEVBQ1QsWUFBQSxFQUFjLG1CQUFBO0FBQUEsRUFDZCxNQUFBLEVBQVEsYUFBQTtBQUFBLEVBQ1IsVUFBQSxFQUFZLGlCQUFBO0FBQUEsRUFDWixJQUFBLEVBQU07QUFDUCxDQUFBO0FBR0EsSUFBTSxnQ0FBQSxHQUFvRjtBQUFBLEVBQ3pGLGdCQUFBLEVBQWtCLDZCQUFBO0FBQUEsRUFDbEIsUUFBQSxFQUFVLHNCQUFBO0FBQUEsRUFDVixXQUFBLEVBQWEseUJBQUE7QUFBQSxFQUNiLE9BQUEsRUFBUyxxQkFBQTtBQUFBLEVBQ1QsWUFBQSxFQUFjLDBCQUFBO0FBQUEsRUFDZCxNQUFBLEVBQVEsb0JBQUE7QUFBQSxFQUNSLFVBQUEsRUFBWSx3QkFBQTtBQUFBLEVBQ1osSUFBQSxFQUFNO0FBQ1AsQ0FBQTtBQUVBLFNBQVMsV0FBQSxDQUFZLE9BQUEsRUFBa0IsR0FBQSxFQUFhLEtBQUEsRUFBc0I7QUFDekUsRUFBQyxPQUFBLENBQStDLEdBQUcsQ0FBQSxHQUFJLEtBQUE7QUFDeEQ7QUFFTyxTQUFTLG1CQUFBLENBQW9CLE1BQXdCLE9BQUEsRUFBd0I7QUFDbkYsRUFBQSxJQUFJLENBQUMsSUFBQSxFQUFNO0FBQ1gsRUFBQSxLQUFBLE1BQVcsQ0FBQyxH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QUFBLENBQW9CLE1BQU0sVUFBVSxDQUFBO0FBQ3BDLElBQUEsZUFBQSxDQUFnQixFQUFBLEVBQUksWUFBWSxNQUFNLENBQUE7QUFFdEMsSUFBQSxJQUFJLEtBQUEsQ0FBTSxPQUFBLENBQVEsUUFBUSxDQUFBLEVBQUc7QUFDNUIsTUFBQSxLQUFBLE1BQVcsU0FBUyxRQUFBLEVBQVU7QUFDN0IsUUFBQSxVQUFBLENBQVcsT0FBTyxLQUFLLENBQUE7QUFBQSxNQUN4QjtBQUFBLElBQ0QsV0FDUyxRQUFBLEVBQVU7QUFDbEIsTUFBQSxVQUFBLENBQVcsT0FBTyxRQUFRLENBQUE7QUFBQSxJQUMzQjtBQUVBLElBQUEsT0FBTyxVQUFBO0FBQUEsRUFDUjtBQUVBLEVBQUEsT0FBTyxhQUFBLENBQWMsS0FBSyxNQUFVLENBQUE7QUFDckMiLCJmaWxlIjoiZWxlbWVudHMubWpzIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBBIHNpbmdsZSBDU1MgY2xhc3MgdmFsdWUuIEZhbHN5IHZhcmlhbnRzIChgdW5kZWZpbmVkYCBhbmQgYG51bGxgKSBhcmVcbiAqIGF1dG9tYXRpY2FsbHkgZmlsdGVyZWQgb3V0IHdoZW4gYnVpbGRpbmcgYSBjbGFzcyBsaXN0LCBzbyBjb25kaXRpb25hbFxuICogY2xhc3NlcyBjYW4gYmUgZXhwcmVzc2VkIHdpdGhvdXQgZXhwbGljaXQgZ3VhcmRzLlxuICovXG5leHBvcnQgdHlwZSBDc3NDbGFzcyA9IHN0cmluZyB8IHVuZGVmaW5lZCB8IG51bGxcblxuLyoqXG4gKiBPbmUgb3IgbW9yZSBDU1MgY2xhc3MgdmFsdWVzIGFjY2VwdGVkIGJ5IHRoZSBgY2xhc3Nlc2AgcHJvcCBvZiBldmVyeSBIVE1MXG4gKiBlbGVtZW50IGNyZWF0ZWQgdmlhIGBjcmVhdGUoKWAgb3IgYGFwcGVuZCgpYC5cbiAqXG4gKiAtIEEgc2luZ2xlIHN0cmluZyBpcyB1c2VkIGFzLWlzLlxuICogLSBBbiBhcnJheSBvZiB7QGxpbmsgQ3NzQ2xhc3N9IHZhbHVlcyBpcyBqb2luZWQgd2l0aCBzcGFjZXMgYWZ0ZXIgZmFsc3lcbiAqICAgZW50cmllcyBhcmUgcmVtb3ZlZC5cbiAqXG4gKiBAc2VlIHtAbGluayBjc3NDbGFzc30gZm9yIGNvbXBvc2luZyBjb25kaXRpb25hbCBjbGFzcyBuYW1lcy5cbiAqL1xuZXhwb3J0IHR5cGUgQ3NzQ2xhc3NlcyA9IEFycmF5PENzc0NsYXNzPiB8IENzc0NsYXNzXG5cbi8qKlxuICogUmV0dXJucyBgY2xhc3NOYW1lYCB3aGVuIGB2aXNpYmxlYCBpcyB0cnV0aHksIG90aGVyd2lzZSBgdW5kZWZpbmVkYC5cbiAqXG4gKiBEZXNpZ25lZCB0byBjb21wb3NlIGNsZWFubHkgd2l0aCB7QGxpbmsgQ3NzQ2xhc3Nlc306IGZhbHN5IHZhbHVlcyBhcmVcbiAqIGZpbHRlcmVkIG91dCBhdXRvbWF0aWNhbGx5LCBzbyBzdGF0aWMgYW5kIGNvbmRpdGlvbmFsIGNsYXNzZXMgY2FuIGJlIG1peGVkXG4gKiBpbiBhIHNpbmdsZSBhcnJheSB3aXRob3V0IGJyYW5jaGluZy5cbiAqXG4gKiBAcGFyYW0gY2xhc3NOYW1lIC0gVGhlIENTUyBjbGFzcyB0byBhcHBseS5cbiAqIEBwYXJhbSB2aXNpYmxlIC0gV2hlbiBgdHJ1ZWAgKHRoZSBkZWZhdWx0KSB0aGUgY2xhc3MgaXMgcmV0dXJuZWQ7IGFueSBvdGhlclxuICogICB2YWx1ZSBwcm9kdWNlcyBgdW5kZWZpbmVkYC5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHNcbiAqIGFwcGVuZCgnYnV0dG9uJywge1xuICogICBjbGFzc2VzOiBbXG4gKiAgICAgJ2J0bicsXG4gKiAgICAgY3NzQ2xhc3MoJ2J0bi0tYWN0aXZlJywgaXNBY3RpdmUpLFxuICogICAgIGNzc0NsYXNzKCdidG4tLWRpc2FibGVkJywgaXNEaXNhYmxlZCksXG4gKiAgIF0sXG4gKiB9KVxuICogYGBgXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjc3NDbGFzcyhjbGFzc05hbWU6IHN0cmluZyk6IENzc0NsYXNzXG5leHBvcnQgZnVuY3Rpb24gY3NzQ2xhc3MoY2xhc3NOYW1lOiBzdHJpbmcsIHZpc2libGU6IGJvb2xlYW4gfCBudWxsIHwgdW5kZWZpbmVkKTogQ3NzQ2xhc3NcbmV4cG9ydCBmdW5jdGlvbiBjc3NDbGFzcyhjbGFzc05hbWU6IENzc0NsYXNzKTogQ3NzQ2xhc3NcbmV4cG9ydCBmdW5jdGlvbiBjc3NDbGFzcyhjbGFzc05hbWU6IENzc0NsYXNzLCB2aXNpYmxlOiBib29sZWFuIHwgbnVsbCB8IHVuZGVmaW5lZCk6IENzc0NsYXNzXG5leHBvcnQgZnVuY3Rpb24gY3NzQ2xhc3MoY2xhc3NOYW1lOiBDc3NDbGFzcywgdmlzaWJsZTogYm9vbGVhbiB8IG51bGwgfCB1bmRlZmluZWQgPSB0cnVlKTogQ3NzQ2xhc3Mge1xuXHRpZiAodmlzaWJsZSAhPT0gdHJ1ZSkgcmV0dXJuXG5cdHJldHVybiBjbGFzc05hbWVcbn1cbiIsInR5cGUgU3RyaXBBcmlhPFMgZXh0ZW5kcyBzdHJpbmc+ID0gUyBleHRlbmRzIGBhcmlhJHtpbmZlciBSZXN0fWAgPyBVbmNhcGl0YWxpemU8UmVzdD4gOiBTXG5cbnR5cGUgQXJpYVN0cmluZ1Byb3BlcnRpZXMgPSB7XG5cdFtQIGluIGtleW9mIEFSSUFNaXhpbiBhcyBBUklBTWl4aW5bUF0gZXh0ZW5kcyBzdHJpbmcgfCBudWxsID8gU3RyaXBBcmlhPHN0cmluZyAmIFA+IDogbmV2ZXJdPzogc3RyaW5nIHwgbnVsbFxufVxuXG4vLyBQcm9wZXJ0aWVzIHRoYXQgb25seSBleGlzdCBhcyBFbGVtZW50W10gaW4gQVJJQU1peGluIOKAlCBhY2NlcHRzIGEgc3RyaW5nIElEIG9yIGFuIEVsZW1lbnQgZGlyZWN0bHlcbnR5cGUgQXJpYUlkUmVmZXJlbmNlUHJvcGVydGllcyA9IHtcblx0LyoqIHtAaW5oZXJpdGRvYyBBUklBTWl4aW5bJ2FyaWFBY3RpdmVEZXNjZW5kYW50RWxlbWVudCddfSAqL1xuXHRhY3RpdmVEZXNjZW5kYW50Pzogc3RyaW5nIHwgRWxlbWVudCB8IG51bGxcblx0LyoqIHtAaW5oZXJpdGRvYyBBUklBTWl4aW5bJ2FyaWFDb250cm9sc0VsZW1lbnRzJ119ICovXG5cdGNvbnRyb2xzPzogc3RyaW5nIHwgRWxlbWVudCB8IG51bGxcblx0LyoqIHtAaW5oZXJpdGRvYyBBUklBTWl4aW5bJ2FyaWFEZXNjcmliZWRCeUVsZW1lbnRzJ119ICovXG5cdGRlc2NyaWJlZEJ5Pzogc3RyaW5nIHwgRWxlbWVudCB8IG51bGxcblx0LyoqIHtAaW5oZXJpdGRvYyBBUklBTWl4aW5bJ2FyaWFEZXRhaWxzRWxlbWVudHMnXX0gKi9cblx0ZGV0YWlscz86IHN0cmluZyB8IEVsZW1lbnQgfCBudWxsXG5cdC8qKiB7QGluaGVyaXRkb2MgQVJJQU1peGluWydhcmlhRXJyb3JNZXNzYWdlRWxlbWVudHMnXX0gKi9cblx0ZXJyb3JNZXNzYWdlPzogc3RyaW5nIHwgRWxlbWVudCB8IG51bGxcblx0LyoqIHtAaW5oZXJpdGRvYyBBUklBTWl4aW5bJ2FyaWFGbG93VG9FbGVtZW50cyddfSAqL1xuXHRmbG93VG8/OiBzdHJpbmcgfCBFbGVtZW50IHwgbnVsbFxuXHQvKioge0Bpbmhlcml0ZG9jIEFSSUFNaXhpblsnYXJpYUxhYmVsbGVkQnlFbGVtZW50cyddfSAqL1xuXHRsYWJlbGxlZEJ5Pzogc3RyaW5nIHwgRWxlbWVudCB8IG51bGxcblx0LyoqIHtAaW5oZXJpdGRvYyBBUklBTWl4aW5bJ2FyaWFPd25zRWxlbWVudHMnXX0gKi9cblx0b3ducz86IHN0cmluZyB8IEVsZW1lbnQgfCBudWxsXG59XG5cbmV4cG9ydCB0eXBlIEFyaWEgPSBBcmlhU3RyaW5nUHJvcGVydGllcyAmIEFyaWFJZFJlZmVyZW5jZVByb3BlcnRpZXNcblxuY29uc3QgYXJpYUlkUmVmZXJlbmNlQXR0cmlidXRlczogUmVjb3JkPGtleW9mIEFyaWFJZFJlZmVyZW5jZVByb3BlcnRpZXMsIHN0cmluZz4gPSB7XG5cdGFjdGl2ZURlc2NlbmRhbnQ6ICdhcmlhLWFjdGl2ZWRlc2NlbmRhbnQnLFxuXHRjb250cm9sczogJ2FyaWEtY29udHJvbHMnLFxuXHRkZXNjcmliZWRCeTogJ2FyaWEtZGVzY3JpYmVkYnknLFxuXHRkZXRhaWxzOiAnYXJpYS1kZXRhaWxzJyxcblx0ZXJyb3JNZXNzYWdlOiAnYXJpYS1lcnJvcm1lc3NhZ2UnLFxuXHRmbG93VG86ICdhcmlhLWZsb3d0bycsXG5cdGxhYmVsbGVkQnk6ICdhcmlhLWxhYmVsbGVkYnknLFxuXHRvd25zOiAnYXJpYS1vd25zJyxcbn1cblxuLy8gYXJpYUFjdGl2ZURlc2NlbmRhbnRFbGVtZW50IGlzIHNpbmd1bGFyOyB0aGUgcmVzdCB0YWtlIEVsZW1lbnRbXVxuY29uc3QgYXJpYUlkUmVmZXJlbmNlRWxlbWVudFByb3BlcnRpZXM6IFJlY29yZDxrZXlvZiBBcmlhSWRSZWZlcmVuY2VQcm9wZXJ0aWVzLCBzdHJpbmc+ID0ge1xuXHRhY3RpdmVEZXNjZW5kYW50OiAnYXJpYUFjdGl2ZURlc2NlbmRhbnRFbGVtZW50Jyxcblx0Y29udHJvbHM6ICdhcmlhQ29udHJvbHNFbGVtZW50cycsXG5cdGRlc2NyaWJlZEJ5OiAnYXJpYURlc2NyaWJlZEJ5RWxlbWVudHMnLFxuXHRkZXRhaWxzOiAnYXJpYURldGFpbHNFbGVtZW50cycsXG5cdGVycm9yTWVzc2FnZTogJ2FyaWFFcnJvck1lc3NhZ2VFbGVtZW50cycsXG5cdGZsb3dUbzogJ2FyaWFGbG93VG9FbGVtZW50cycsXG5cdGxhYmVsbGVkQnk6ICdhcmlhTGFiZWxsZWRCeUVsZW1lbnRzJyxcblx0b3duczogJ2FyaWFPd25zRWxlbWVudHMnLFxufVxuXG5mdW5jdGlvbiBzZXRQcm9wZXJ0eShlbGVtZW50OiBFbGVtZW50LCBrZXk6IHN0cmluZywgdmFsdWU6IHVua25vd24pOiB2b2lkIHtcblx0KGVsZW1lbnQgYXMgdW5rbm93biBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPilba2V5XSA9IHZhbHVlXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBidWlsZEFyaWFQcm9wZXJ0aWVzKGFyaWE6IEFyaWEgfCB1bmRlZmluZWQsIGVsZW1lbnQ6IEVsZW1lbnQpOiB2b2lkIHtcblx0aWYgKCFhcmlhKSByZXR1cm5cblx0Zm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoYXJpYSkpIHtcblx0XHRpZiAoIShrZXkgaW4gYXJpYUlkUmVmZXJlbmNlQXR0cmlidXRlcykpIHtcblx0XHRcdGNvbnN0IGRvbUtleSA9IGBhcmlhJHtrZXlbMF0udG9VcHBlckNhc2UoKX0ke2tleS5zbGljZSgxKX1gXG5cdFx0XHRzZXRQcm9wZXJ0eShlbGVtZW50LCBkb21LZXksIHZhbHVlKVxuXHRcdFx0Y29udGludWVcblx0XHR9XG5cdFx0aWYgKHZhbHVlID09PSBudWxsIHx8IHZhbHVlID09PSB1bmRlZmluZWQpIHtcblx0XHRcdGVsZW1lbnQucmVtb3ZlQXR0cmlidXRlKGFyaWFJZFJlZmVyZW5jZUF0dHJpYnV0ZXNba2V5IGFzIGtleW9mIEFyaWFJZFJlZmVyZW5jZVByb3BlcnRpZXNdKVxuXHRcdFx0Y29udGludWVcblx0XHR9XG5cdFx0aWYgKHZhbHVlIGluc3RhbmNlb2YgRWxlbWVudCkge1xuXHRcdFx0Y29uc3QgaWRsS2V5ID0gYXJpYUlkUmVmZXJlbmNlRWxlbWVudFByb3BlcnRpZXNba2V5IGFzIGtleW9mIEFyaWFJZFJlZmVyZW5jZVByb3BlcnRpZXNdXG5cdFx0XHRzZXRQcm9wZXJ0eShlbGVtZW50LCBpZGxLZXksIGlkbEtleS5lbmRzV2l0aCgnRWxlbWVudHMnKSA/IFt2YWx1ZV0gOiB2YWx1ZSlcblx0XHRcdGNvbnRpbnVlXG5cdFx0fVxuXHRcdGVsZW1lbnQuc2V0QXR0cmlidXRlKGFyaWFJZFJlZmVyZW5jZUF0dHJpYnV0ZXNba2V5IGFzIGtleW9mIEFyaWFJZFJlZmVyZW5jZVByb3BlcnRpZXNdLCB2YWx1ZSlcblx0fVxufVxuIiwiaW1wb3J0IHsgRWxlbWVudE9uSGFuZGxlcnMgfSBmcm9tICdAcm9vdGVkL2V2ZW50cydcblxuaW1wb3J0IHsgdHlwZSBBcmlhLCBidWlsZEFyaWFQcm9wZXJ0aWVzIH0gZnJvbSAnLi9hcmlhLm10cydcbmltcG9ydCB7IENzc0NsYXNzZXMgfSBmcm9tICcuL2NsYXNzZXMubXRzJ1xuXG50eXBlIElmRXF1YWxzPFgsIFksIEEgPSBYLCBCID0gbmV2ZXI+ID0gKDxUPigpID0+IFQgZXh0ZW5kcyBYID8gMSA6IDIpIGV4dGVuZHMgKDxUPigpID0+IFQgZXh0ZW5kcyBZID8gMSA6IDIpID8gQSA6IEJcbnR5cGUgTm9uV3JpdGFibGVLZXlzPFQ+ID0ge1xuXHRbUCBpbiBrZXlvZiBUXS0/OiBJZkVxdWFsczx7IFtRIGluIFBdOiBUW1BdIH0sIHsgLXJlYWRvbmx5IFtRIGluIFBdOiBUW1BdIH0sIG5ldmVyLCBQPlxufVtrZXlvZiBUXVxudHlwZSBGdW5jdGlvbktleXM8VD4gPSB7XG5cdFtQIGluIGtleW9mIFRdOiBOb25OdWxsYWJsZTxUW1BdPiBleHRlbmRzICguLi5hcmd1bWVudHNfOiBuZXZlcltdKSA9PiB1bmtub3duID8gUCA6IG5ldmVyXG59W2tleW9mIFRdXG50eXBlIE9uSGFuZGxlcktleXM8VD4gPSB7IFtQIGluIGtleW9mIFRdOiBQIGV4dGVuZHMgYG9uJHtzdHJpbmd9YCA/IFAgOiBuZXZlciB9W2tleW9mIFRdXG5cbnR5cGUgU2FuaXRpemVkSHRtbFByb3BlcnRpZXM8VEVsZW1lbnQgZXh0ZW5kcyBIVE1MRWxlbWVudD4gPSBPbWl0PFxuXHRURWxlbWVudCxcblx0fCBOb25Xcml0YWJsZUtleXM8VEVsZW1lbnQ+XG5cdHwgRnVuY3Rpb25LZXlzPFRFbGVtZW50PlxuXHR8IEV4Y2x1ZGU8a2V5b2YgQVJJQU1peGluLCAncm9sZSc+XG5cdHwgT25IYW5kbGVyS2V5czxURWxlbWVudD5cblx0fCAnY2hpbGRyZW4nIHwgJ2NsYXNzTmFtZScgfCAnY2xhc3NMaXN0J1xuPlxudHlwZSBIdG1sRWxlbWVudFByb3BlcnRpZXNNYXBwZWQ8VEVsZW1lbnQgZXh0ZW5kcyBIVE1MRWxlbWVudD5cblx0PSBQYXJ0aWFsPFNhbml0aXplZEh0bWxQcm9wZXJ0aWVzPFRFbGVtZW50Pj5cblx0JiB7XG5cdFx0Y2hpbGRyZW4/OiBBcnJheTxOb2RlIHwgc3RyaW5nPiB8IE5vZGUgfCBzdHJpbmdcblx0XHRjbGFzc2VzPzogQ3NzQ2xhc3Nlc1xuXHRcdGFyaWE/OiBBcmlhXG5cdFx0b24/OiBFbGVtZW50T25IYW5kbGVyczxURWxlbWVudD5cblx0fVxuXG50eXBlIEh0bWxFbGVtZW50UHJvcGVydGllczxLRWxlbWVudCBleHRlbmRzIGtleW9mIEhUTUxFbGVtZW50VGFnTmFtZU1hcD5cblx0PSBIdG1sRWxlbWVudFByb3BlcnRpZXNNYXBwZWQ8SFRNTEVsZW1lbnRUYWdOYW1lTWFwW0tFbGVtZW50XT5cblxuZnVuY3Rpb24gYnVpbGRPbkhhbmRsZXJzPFRFbGVtZW50IGV4dGVuZHMgSFRNTEVsZW1lbnQ+KFxuXHRvbjogRWxlbWVudE9uSGFuZGxlcnM8VEVsZW1lbnQ+IHwgdW5kZWZpbmVkLFxuXHRlbGVtZW50OiBURWxlbWVudCxcblx0c2lnbmFsOiBBYm9ydFNpZ25hbCxcbik6IHZvaWQge1xuXHRpZiAoIW9uKSByZXR1cm5cblx0Zm9yIChjb25zdCBba2V5LCBoYW5kbGVyXSBvZiBPYmplY3QuZW50cmllcyhvbikpIHtcblx0XHRpZiAoIWhhbmRsZXIpIGNvbnRpbnVlXG5cdFx0ZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKFxuXHRcdFx0a2V5LFxuXG5cdFx0XHRldmVudCA9PiB2b2lkIChoYW5kbGVyIGFzIChldmVudD86IEV2ZW50KSA9PiB2b2lkIHwgUHJvbWlzZTx2b2lkPikoZXZlbnQpLFxuXHRcdFx0c2lnbmFsID8geyBzaWduYWwgfSA6IHVuZGVmaW5lZCxcblx0XHQpXG5cdH1cbn1cblxuZnVuY3Rpb24gYnVpbGRDbGFzc0xpc3QoY2xhc3NlczogQ3NzQ2xhc3NlcyB8IHVuZGVmaW5lZCkge1xuXHRpZiAoY2xhc3NlcyA9PT0gbnVsbCB8fCBjbGFzc2VzID09PSB1bmRlZmluZWQpIHJldHVybiB7fVxuXHRpZiAoQXJyYXkuaXNBcnJheShjbGFzc2VzKSkgcmV0dXJuIHsgY2xhc3NOYW1lOiBjbGFzc2VzLmZpbHRlcihCb29sZWFuKS5qb2luKCcgJykgfVxuXG5cdHJldHVybiB7IGNsYXNzTmFtZTogU3RyaW5nKGNsYXNzZXMpIH1cbn1cblxuZXhwb3J0IHR5cGUgRWxlbWVudENyZWF0b3IgPSAoa2V5OiBzdHJpbmcpID0+IEhUTUxFbGVtZW50XG5leHBvcnQgdHlwZSBFbGVtZW50RmFjdG9yeSA9IFJldHVyblR5cGU8dHlwZW9mIGNyZWF0ZUVsZW1lbnRGYWN0b3J5PlxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUVsZW1lbnRGYWN0b3J5KGNvbnN0cnVjdEVsZW1lbnQ6IEVsZW1lbnRDcmVhdG9yLCBzaWduYWw6IEFib3J0U2lnbmFsKSB7XG5cdC8qKlxuXHQgKiBDcmVhdGVzIGEgbmV3IEhUTUwgZWxlbWVudC4gVGhlIGVsZW1lbnQgaXMgKipub3QqKiBhcHBlbmRlZCB0byB0aGVcblx0ICogZG9jdW1lbnQgYXV0b21hdGljYWxseS5cblx0ICpcblx0ICogKipgY2xhc3Nlc2AqKiDigJQgYWNjZXB0cyBhIHNpbmdsZSBjbGFzcyBzdHJpbmcgb3IgYSB7QGxpbmsgQ3NzQ2xhc3Nlc30gYXJyYXk7XG5cdCAqIGZhbHN5IGVudHJpZXMgYXJlIGZpbHRlcmVkIG91dCBhdXRvbWF0aWNhbGx5LlxuXHQgKlxuXHQgKiAqKkRPTSBwcm9wZXJ0eSBuYW1lcyoqIOKAlCBvdGhlciBwcm9wZXJ0aWVzIGFyZSBzZXQgdmlhIGBPYmplY3QuYXNzaWduYCBhbmRcblx0ICogbXVzdCB1c2UgRE9NIHByb3BlcnR5IG5hbWVzLCBub3QgSFRNTCBhdHRyaWJ1dGUgbmFtZXM6XG5cdCAqIHwgSFRNTCBhdHRyaWJ1dGUgfCBET00gcHJvcGVydHkgfFxuXHQgKiB8LS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLXxcblx0ICogfCBgZm9yYCAgICAgICAgICB8IGBodG1sRm9yYCAgICB8XG5cdCAqIHwgYHJlYWRvbmx5YCAgICAgfCBgcmVhZE9ubHlgICAgfFxuXHQgKlxuXHQgKiAqKkNoaWxkcmVuKiog4oCUIHBhc3MgYSBzaW5nbGUgYE5vZGVgIG9yIGFuIGFycmF5IG9mIGBOb2RlYHMgdmlhIHRoZVxuXHQgKiBgY2hpbGRyZW5gIHByb3BlcnR5OyB0aGV5IGFyZSBhcHBlbmRlZCBpbiBvcmRlci5cblx0ICpcblx0ICogKipFdmVudCBsaXN0ZW5lcnMqKiDigJQgdXNlIHRoZSBgb25gIHByb3Agd2l0aCBhbiBvYmplY3Qgb2YgZXZlbnQgaGFuZGxlcnMuXG5cdCAqIExpc3RlbmVycyBhcmUgYXV0b21hdGljYWxseSByZW1vdmVkIHdoZW4gdGhlIGNvbXBvbmVudCB1bm1vdW50cy5cblx0ICpcblx0ICogKipBUklBKiog4oCUIHVzZSB0aGUgYGFyaWFgIHByb3AgZm9yIEFSSUEgYXR0cmlidXRlcy4gQWNjZXB0cyBzdHJpbmcgSURzIG9yXG5cdCAqIGBFbGVtZW50YCByZWZlcmVuY2VzIGZvciBJREwgcmVmbGVjdGlvbiBwcm9wZXJ0aWVzLlxuXHQgKlxuXHQgKiBAZXhhbXBsZVxuXHQgKiBgYGB0c1xuXHQgKiBjb25zdCBkaXYgPSBjcmVhdGUoJ2RpdicsIHtcblx0ICogICBjbGFzc2VzOiAnY2FyZCcsXG5cdCAqICAgYXJpYTogeyBsYWJlbDogJ0NhcmQnLCBsYWJlbGxlZEJ5OiBoZWFkaW5nRWwgfSxcblx0ICogICBjaGlsZHJlbjogW1xuXHQgKiAgICAgY3JlYXRlKCdoMicsIHsgdGV4dENvbnRlbnQ6ICdUaXRsZScgfSksXG5cdCAqICAgICBjcmVhdGUoJ3AnLCAgeyB0ZXh0Q29udGVudDogJ0JvZHknICB9KSxcblx0ICogICBdLFxuXHQgKiB9KVxuXHQgKiBgYGBcblx0ICovXG5cdGZ1bmN0aW9uIGNyZWF0ZUVsZW1lbnQ8S0VsZW1lbnQgZXh0ZW5kcyBrZXlvZiBIVE1MRWxlbWVudFRhZ05hbWVNYXA+KHRhZzogS0VsZW1lbnQsIHByb3BlcnRpZXM/OiBOb0luZmVyPEh0bWxFbGVtZW50UHJvcGVydGllczxLRWxlbWVudD4+KTogSFRNTEVsZW1lbnRUYWdOYW1lTWFwW0tFbGVtZW50XSB7XG5cdFx0Y29uc3QgeyBhcmlhLCBjaGlsZHJlbiwgY2xhc3Nlcywgb24sIC4uLmFzc2lnbmFibGVQcm9wZXJ0aWVzIH0gPSAocHJvcGVydGllcyA/PyB7fSlcblx0XHRjb25zdCBkZWZpbmVkUHJvcGVydGllcyA9IE9iamVjdC5mcm9tRW50cmllcyhPYmplY3Rcblx0XHRcdC5lbnRyaWVzKGFzc2lnbmFibGVQcm9wZXJ0aWVzKVxuXHRcdFx0LmZpbHRlcigoWywgdl0pID0+IHYgIT09IHVuZGVmaW5lZCAmJiB2ICE9PSBudWxsKSxcblx0XHQpXG5cdFx0Y29uc3QgbmV3RWxlbWVudCA9IE9iamVjdC5hc3NpZ24oXG5cdFx0XHRjb25zdHJ1Y3RFbGVtZW50KHRhZykgYXMgSFRNTEVsZW1lbnRUYWdOYW1lTWFwW0tFbGVtZW50XSxcblx0XHRcdGRlZmluZWRQcm9wZXJ0aWVzLFxuXHRcdFx0YnVpbGRDbGFzc0xpc3QoY2xhc3NlcyksXG5cdFx0KVxuXG5cdFx0YnVpbGRBcmlhUHJvcGVydGllcyhhcmlhLCBuZXdFbGVtZW50KVxuXHRcdGJ1aWxkT25IYW5kbGVycyhvbiwgbmV3RWxlbWVudCwgc2lnbmFsKVxuXG5cdFx0aWYgKEFycmF5LmlzQXJyYXkoY2hpbGRyZW4pKSB7XG5cdFx0XHRmb3IgKGNvbnN0IGNoaWxkIG9mIGNoaWxkcmVuKSB7XG5cdFx0XHRcdG5ld0VsZW1lbnQuYXBwZW5kKGNoaWxkKVxuXHRcdFx0fVxuXHRcdH1cblx0XHRlbHNlIGlmIChjaGlsZHJlbikge1xuXHRcdFx0bmV3RWxlbWVudC5hcHBlbmQoY2hpbGRyZW4pXG5cdFx0fVxuXG5cdFx0cmV0dXJuIG5ld0VsZW1lbnQgYXMgSFRNTEVsZW1lbnRUYWdOYW1lTWFwW0tFbGVtZW50XVxuXHR9XG5cblx0cmV0dXJuIGNyZWF0ZUVsZW1lbnQuYmluZCh1bmRlZmluZWQhKVxufVxuIl19
|
|
135
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWxlbWVudHMubWpzIiwibmFtZXMiOltdLCJzb3VyY2VzIjpbIi4uL3NyYy9jbGFzc2VzLm10cyIsIi4uL3NyYy9hcmlhLm10cyIsIi4uL3NyYy9lbGVtZW50LWZhY3RvcnkubXRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQSBzaW5nbGUgQ1NTIGNsYXNzIHZhbHVlLiBGYWxzeSB2YXJpYW50cyAoYHVuZGVmaW5lZGAgYW5kIGBudWxsYCkgYXJlXG4gKiBhdXRvbWF0aWNhbGx5IGZpbHRlcmVkIG91dCB3aGVuIGJ1aWxkaW5nIGEgY2xhc3MgbGlzdCwgc28gY29uZGl0aW9uYWxcbiAqIGNsYXNzZXMgY2FuIGJlIGV4cHJlc3NlZCB3aXRob3V0IGV4cGxpY2l0IGd1YXJkcy5cbiAqL1xuZXhwb3J0IHR5cGUgQ3NzQ2xhc3MgPSBzdHJpbmcgfCB1bmRlZmluZWQgfCBudWxsXG5cbi8qKlxuICogT25lIG9yIG1vcmUgQ1NTIGNsYXNzIHZhbHVlcyBhY2NlcHRlZCBieSB0aGUgYGNsYXNzZXNgIHByb3Agb2YgZXZlcnkgSFRNTFxuICogZWxlbWVudCBjcmVhdGVkIHZpYSBgY3JlYXRlKClgIG9yIGBhcHBlbmQoKWAuXG4gKlxuICogLSBBIHNpbmdsZSBzdHJpbmcgaXMgdXNlZCBhcy1pcy5cbiAqIC0gQW4gYXJyYXkgb2Yge0BsaW5rIENzc0NsYXNzfSB2YWx1ZXMgaXMgam9pbmVkIHdpdGggc3BhY2VzIGFmdGVyIGZhbHN5XG4gKiAgIGVudHJpZXMgYXJlIHJlbW92ZWQuXG4gKlxuICogQHNlZSB7QGxpbmsgY3NzQ2xhc3N9IGZvciBjb21wb3NpbmcgY29uZGl0aW9uYWwgY2xhc3MgbmFtZXMuXG4gKi9cbmV4cG9ydCB0eXBlIENzc0NsYXNzZXMgPSBBcnJheTxDc3NDbGFzcz4gfCBDc3NDbGFzc1xuXG4vKipcbiAqIENsYXNzIG5hbWVzIG1hcHBlZCB0byB3aGV0aGVyIHRoZXkgYXBwbHkuIE9ubHkgYHRydWVgIGluY2x1ZGVzIHRoZSBjbGFzcyxcbiAqIGFueXRoaW5nIGVsc2UgbGVhdmVzIGl0IG91dC5cbiAqXG4gKiBLZXlzIGhhdmUgdG8gYmUgc3RyaW5ncywgc28gdGhpcyBkb2Vzbid0IHdvcmsgd2l0aCBhIGBDc3NNb2R1bGVgIHZhbHVlIHRoYXRcbiAqIFR5cGVTY3JpcHQgdGhpbmtzIG1pZ2h0IGJlIGB1bmRlZmluZWRgLiBVc2UgdGhlIGxpc3QgZm9ybSBvZlxuICoge0BsaW5rIGNzc0NsYXNzZXN9IGZvciB0aG9zZS5cbiAqXG4gKiBAc2VlIHtAbGluayBjc3NDbGFzc2VzfSBmb3IgdGhlIGZ1bmN0aW9uIHRoYXQgcmVhZHMgdGhpcy5cbiAqL1xuZXhwb3J0IHR5cGUgQ3NzQ2xhc3NEaWN0aW9uYXJ5ID0gUmVjb3JkPHN0cmluZywgYm9vbGVhbiB8IG51bGwgfCB1bmRlZmluZWQ+XG5cbi8qKlxuICogUmV0dXJucyBgY2xhc3NOYW1lYCB3aGVuIGB2aXNpYmxlYCBpcyBgdHJ1ZWAsIG90aGVyd2lzZSBgdW5kZWZpbmVkYC5cbiAqXG4gKiBEZXNpZ25lZCB0byBjb21wb3NlIGNsZWFubHkgd2l0aCB7QGxpbmsgQ3NzQ2xhc3Nlc306IGZhbHN5IHZhbHVlcyBhcmVcbiAqIGZpbHRlcmVkIG91dCBhdXRvbWF0aWNhbGx5LCBzbyBzdGF0aWMgYW5kIGNvbmRpdGlvbmFsIGNsYXNzZXMgY2FuIGJlIG1peGVkXG4gKiBpbiBhIHNpbmdsZSBhcnJheSB3aXRob3V0IGJyYW5jaGluZy4gQ2FsbGVkIHdpdGgganVzdCBhIGNsYXNzIG5hbWUgaXRcbiAqIHJldHVybnMgdGhhdCBuYW1lLCB3aGljaCBpcyBoYW5keSB3aGVuIHRoZSByZXN0IG9mIHRoZSBhcnJheSBpcyBjb25kaXRpb25hbC5cbiAqXG4gKiBUaGUgY29uZGl0aW9uIGNvbWVzIGZpcnN0LCBzYW1lIGFzIGBvcHRpb25hbCgpYC5cbiAqXG4gKiBAcGFyYW0gdmlzaWJsZSAtIFdoZW4gYHRydWVgIHRoZSBjbGFzcyBpcyByZXR1cm5lZCwgYW55IG90aGVyIHZhbHVlIHByb2R1Y2VzXG4gKiAgIGB1bmRlZmluZWRgLlxuICogQHBhcmFtIGNsYXNzTmFtZSAtIFRoZSBDU1MgY2xhc3MgdG8gYXBwbHkuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHRzXG4gKiBhcHBlbmQoJ2J1dHRvbicsIHtcbiAqICAgY2xhc3NlczogW1xuICogICAgICdidG4nLFxuICogICAgIGNzc0NsYXNzKGlzQWN0aXZlLCAnYnRuLS1hY3RpdmUnKSxcbiAqICAgICBjc3NDbGFzcyhpc0Rpc2FibGVkLCAnYnRuLS1kaXNhYmxlZCcpLFxuICogICBdLFxuICogfSlcbiAqIGBgYFxuICovXG5leHBvcnQgZnVuY3Rpb24gY3NzQ2xhc3MoY2xhc3NOYW1lOiBDc3NDbGFzcyk6IENzc0NsYXNzXG5leHBvcnQgZnVuY3Rpb24gY3NzQ2xhc3ModmlzaWJsZTogYm9vbGVhbiB8IG51bGwgfCB1bmRlZmluZWQsIGNsYXNzTmFtZTogQ3NzQ2xhc3MpOiBDc3NDbGFzc1xuZXhwb3J0IGZ1bmN0aW9uIGNzc0NsYXNzKC4uLmFyZ3VtZW50c186IFtDc3NDbGFzc10gfCBbYm9vbGVhbiB8IG51bGwgfCB1bmRlZmluZWQsIENzc0NsYXNzXSk6IENzc0NsYXNzIHtcblx0aWYgKGFyZ3VtZW50c18ubGVuZ3RoID09PSAxKSByZXR1cm4gYXJndW1lbnRzX1swXVxuXG5cdGNvbnN0IFt2aXNpYmxlLCBjbGFzc05hbWVdID0gYXJndW1lbnRzX1xuXHRpZiAodmlzaWJsZSAhPT0gdHJ1ZSkgcmV0dXJuXG5cdHJldHVybiBjbGFzc05hbWVcbn1cblxuLyoqXG4gKiBKb2lucyBzZXZlcmFsIGNsYXNzIG5hbWVzIGludG8gb25lIHtAbGluayBDc3NDbGFzc30sIGRyb3BwaW5nIHRoZSBmYWxzeVxuICogb25lcy4gUmV0dXJucyBgdW5kZWZpbmVkYCB3aGVuIG5vdGhpbmcgaXMgbGVmdCwgc28gdGhlIHJlc3VsdCBkaXNhcHBlYXJzXG4gKiBmcm9tIGEgYGNsYXNzZXNgIGFycmF5IGluc3RlYWQgb2YgYWRkaW5nIGFuIGVtcHR5IHN0cmluZy5cbiAqXG4gKiBUaHJlZSB3YXlzIHRvIGNhbGwgaXQ6XG4gKlxuICogLSBgY3NzQ2xhc3NlcygnYScsICdiJylgIGpvaW5zIHdoYXQgeW91IHBhc3MuXG4gKiAtIGBjc3NDbGFzc2VzKHZpc2libGUsICdhJywgJ2InKWAgam9pbnMgdGhlbSBvbmx5IHdoZW4gYHZpc2libGVgIGlzIGB0cnVlYC5cbiAqIC0gYGNzc0NsYXNzZXMoeyBhOiB0cnVlLCBiOiBmYWxzZSB9KWAga2VlcHMgdGhlIGtleXMgbWFwcGVkIHRvIGB0cnVlYC5cbiAqXG4gKiBXYXRjaCBvdXQgZm9yIG9uZSBvdmVybGFwOiBhIGxlYWRpbmcgYHVuZGVmaW5lZGAgb3IgYG51bGxgIGlzIHJlYWQgYXMgdGhlXG4gKiBjb25kaXRpb24sIHNvIGBjc3NDbGFzc2VzKHVuZGVmaW5lZCwgJ2EnKWAgaXMgYHVuZGVmaW5lZGAgYW5kIG5vdCBgJ2EnYC5cbiAqIEEgY2xhc3MgbmFtZSB0aGF0IG1pZ2h0IGJlIGB1bmRlZmluZWRgLCBsaWtlIGFueXRoaW5nIG9mZiBhIGBDc3NNb2R1bGVgLFxuICogYmVsb25ncyBhZnRlciB0aGUgY29uZGl0aW9uIHJhdGhlciB0aGFuIGZpcnN0LlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0c1xuICogYXBwZW5kKCdidXR0b24nLCB7XG4gKiAgIGNsYXNzZXM6IFtcbiAqICAgICBjc3NDbGFzc2VzKHN0eWxlcy5idXR0b24sIHN0eWxlcy5yb3VuZGVkKSxcbiAqICAgICBjc3NDbGFzc2VzKGlzQWN0aXZlLCBzdHlsZXMuYWN0aXZlLCBzdHlsZXMucmFpc2VkKSxcbiAqICAgICBjc3NDbGFzc2VzKHtcbiAqICAgICAgICdidG4tLWRpc2FibGVkJzogaXNEaXNhYmxlZCxcbiAqICAgICB9KSxcbiAqICAgXSxcbiAqIH0pXG4gKiBgYGBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNzc0NsYXNzZXModmlzaWJsZTogYm9vbGVhbiB8IG51bGwgfCB1bmRlZmluZWQsIC4uLmNsYXNzTmFtZXM6IEFycmF5PENzc0NsYXNzPik6IENzc0NsYXNzXG5leHBvcnQgZnVuY3Rpb24gY3NzQ2xhc3NlcyguLi5jbGFzc05hbWVzOiBBcnJheTxDc3NDbGFzcz4pOiBDc3NDbGFzc1xuZXhwb3J0IGZ1bmN0aW9uIGNzc0NsYXNzZXMoY2xhc3NOYW1lczogQ3NzQ2xhc3NEaWN0aW9uYXJ5KTogQ3NzQ2xhc3NcbmV4cG9ydCBmdW5jdGlvbiBjc3NDbGFzc2VzKFxuXHQuLi5hcmd1bWVudHNfOiBbQ3NzQ2xhc3NEaWN0aW9uYXJ5XSB8IFtib29sZWFuIHwgbnVsbCB8IHVuZGVmaW5lZCwgLi4uQXJyYXk8Q3NzQ2xhc3M+XSB8IEFycmF5PENzc0NsYXNzPlxuKTogQ3NzQ2xhc3Mge1xuXHRjb25zdCBbZmlyc3QsIC4uLnJlc3RdID0gYXJndW1lbnRzX1xuXG5cdGlmICh0eXBlb2YgZmlyc3QgPT09ICdzdHJpbmcnKSByZXR1cm4gam9pbkNsYXNzTmFtZXMoW2ZpcnN0LCAuLi5yZXN0XSBhcyBBcnJheTxDc3NDbGFzcz4pXG5cblx0aWYgKGZpcnN0ID09PSB1bmRlZmluZWQgfHwgZmlyc3QgPT09IG51bGwgfHwgdHlwZW9mIGZpcnN0ID09PSAnYm9vbGVhbicpIHtcblx0XHRpZiAoZmlyc3QgIT09IHRydWUpIHJldHVyblxuXHRcdHJldHVybiBqb2luQ2xhc3NOYW1lcyhyZXN0IGFzIEFycmF5PENzc0NsYXNzPilcblx0fVxuXG5cdHJldHVybiBqb2luQ2xhc3NOYW1lcyhPYmplY3Rcblx0XHQuZW50cmllcyhmaXJzdClcblx0XHQuZmlsdGVyKChbLCB2aXNpYmxlXSkgPT4gdmlzaWJsZSA9PT0gdHJ1ZSlcblx0XHQubWFwKChbY2xhc3NOYW1lXSkgPT4gY2xhc3NOYW1lKSlcbn1cblxuZnVuY3Rpb24gam9pbkNsYXNzTmFtZXMoY2xhc3NOYW1lczogQXJyYXk8Q3NzQ2xhc3M+KTogQ3NzQ2xhc3Mge1xuXHRjb25zdCBjbGFzc05hbWUgPSBjbGFzc05hbWVzLmZpbHRlcihCb29sZWFuKS5qb2luKCcgJylcblx0aWYgKCFjbGFzc05hbWUpIHJldHVyblxuXHRyZXR1cm4gY2xhc3NOYW1lXG59XG4iLCJ0eXBlIFN0cmlwQXJpYTxTIGV4dGVuZHMgc3RyaW5nPiA9IFMgZXh0ZW5kcyBgYXJpYSR7aW5mZXIgUmVzdH1gID8gVW5jYXBpdGFsaXplPFJlc3Q+IDogU1xuXG50eXBlIEFyaWFTdHJpbmdQcm9wZXJ0aWVzID0ge1xuXHRbUCBpbiBrZXlvZiBBUklBTWl4aW4gYXMgQVJJQU1peGluW1BdIGV4dGVuZHMgc3RyaW5nIHwgbnVsbCA/IFN0cmlwQXJpYTxzdHJpbmcgJiBQPiA6IG5ldmVyXT86IHN0cmluZyB8IG51bGxcbn1cblxuLy8gUHJvcGVydGllcyB0aGF0IG9ubHkgZXhpc3QgYXMgRWxlbWVudFtdIGluIEFSSUFNaXhpbi4gQWNjZXB0cyBhIHN0cmluZyBJRCBvciBhbiBFbGVtZW50IGRpcmVjdGx5LlxudHlwZSBBcmlhSWRSZWZlcmVuY2VQcm9wZXJ0aWVzID0ge1xuXHQvKioge0Bpbmhlcml0ZG9jIEFSSUFNaXhpblsnYXJpYUFjdGl2ZURlc2NlbmRhbnRFbGVtZW50J119ICovXG5cdGFjdGl2ZURlc2NlbmRhbnQ/OiBzdHJpbmcgfCBFbGVtZW50IHwgbnVsbFxuXHQvKioge0Bpbmhlcml0ZG9jIEFSSUFNaXhpblsnYXJpYUNvbnRyb2xzRWxlbWVudHMnXX0gKi9cblx0Y29udHJvbHM/OiBzdHJpbmcgfCBFbGVtZW50IHwgbnVsbFxuXHQvKioge0Bpbmhlcml0ZG9jIEFSSUFNaXhpblsnYXJpYURlc2NyaWJlZEJ5RWxlbWVudHMnXX0gKi9cblx0ZGVzY3JpYmVkQnk/OiBzdHJpbmcgfCBFbGVtZW50IHwgbnVsbFxuXHQvKioge0Bpbmhlcml0ZG9jIEFSSUFNaXhpblsnYXJpYURldGFpbHNFbGVtZW50cyddfSAqL1xuXHRkZXRhaWxzPzogc3RyaW5nIHwgRWxlbWVudCB8IG51bGxcblx0LyoqIHtAaW5oZXJpdGRvYyBBUklBTWl4aW5bJ2FyaWFFcnJvck1lc3NhZ2VFbGVtZW50cyddfSAqL1xuXHRlcnJvck1lc3NhZ2U/OiBzdHJpbmcgfCBFbGVtZW50IHwgbnVsbFxuXHQvKioge0Bpbmhlcml0ZG9jIEFSSUFNaXhpblsnYXJpYUZsb3dUb0VsZW1lbnRzJ119ICovXG5cdGZsb3dUbz86IHN0cmluZyB8IEVsZW1lbnQgfCBudWxsXG5cdC8qKiB7QGluaGVyaXRkb2MgQVJJQU1peGluWydhcmlhTGFiZWxsZWRCeUVsZW1lbnRzJ119ICovXG5cdGxhYmVsbGVkQnk/OiBzdHJpbmcgfCBFbGVtZW50IHwgbnVsbFxuXHQvKioge0Bpbmhlcml0ZG9jIEFSSUFNaXhpblsnYXJpYU93bnNFbGVtZW50cyddfSAqL1xuXHRvd25zPzogc3RyaW5nIHwgRWxlbWVudCB8IG51bGxcbn1cblxuLyoqXG4gKiBTaGFwZSBvZiB0aGUgYGFyaWFgIHByb3Agb24gYGVsZW1lbnQoLi4uKWAuIEFjY2VwdHMgZXZlcnkgQVJJQSBhdHRyaWJ1dGVcbiAqIGRlZmluZWQgb24gYEFSSUFNaXhpbmAsIHdpdGggdGhlIGBhcmlhYCBwcmVmaXggc3RyaXBwZWQgKHNvIGBhcmlhLWxhYmVsYFxuICogYmVjb21lcyBgbGFiZWxgLCBgYXJpYS1kZXNjcmliZWRieWAgYmVjb21lcyBgZGVzY3JpYmVkQnlgKS5cbiAqXG4gKiBGb3IgSUQtcmVmZXJlbmNlIGF0dHJpYnV0ZXMgKGBhcmlhLWxhYmVsbGVkYnlgLCBgYXJpYS1jb250cm9sc2AsIGV0Yy4pIHRoZVxuICogdmFsdWUgY2FuIGJlIGEgc3RyaW5nIElEIG9yIGFuIGBFbGVtZW50YCByZWZlcmVuY2UuIEVsZW1lbnQgcmVmZXJlbmNlcyBhcmVcbiAqIHNldCB2aWEgdGhlIElETCByZWZsZWN0aW9uIHByb3BlcnR5IHdoZW4gc3VwcG9ydGVkLCBmYWxsaW5nIGJhY2sgdG8gdGhlXG4gKiBhdHRyaWJ1dGUgdmFsdWUgb3RoZXJ3aXNlLlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0c1xuICogZWxlbWVudCgnYnV0dG9uJywge1xuICogICBhcmlhOiB7XG4gKiAgICAgbGFiZWw6ICdTYXZlJyxcbiAqICAgICBkZXNjcmliZWRCeTogaGVscFRleHRFbGVtZW50LFxuICogICAgIHByZXNzZWQ6ICdmYWxzZScsXG4gKiAgIH0sXG4gKiB9KVxuICogYGBgXG4gKi9cbmV4cG9ydCB0eXBlIEFyaWEgPSBBcmlhU3RyaW5nUHJvcGVydGllcyAmIEFyaWFJZFJlZmVyZW5jZVByb3BlcnRpZXNcblxuY29uc3QgYXJpYUlkUmVmZXJlbmNlQXR0cmlidXRlczogUmVjb3JkPGtleW9mIEFyaWFJZFJlZmVyZW5jZVByb3BlcnRpZXMsIHN0cmluZz4gPSB7XG5cdGFjdGl2ZURlc2NlbmRhbnQ6ICdhcmlhLWFjdGl2ZWRlc2NlbmRhbnQnLFxuXHRjb250cm9sczogJ2FyaWEtY29udHJvbHMnLFxuXHRkZXNjcmliZWRCeTogJ2FyaWEtZGVzY3JpYmVkYnknLFxuXHRkZXRhaWxzOiAnYXJpYS1kZXRhaWxzJyxcblx0ZXJyb3JNZXNzYWdlOiAnYXJpYS1lcnJvcm1lc3NhZ2UnLFxuXHRmbG93VG86ICdhcmlhLWZsb3d0bycsXG5cdGxhYmVsbGVkQnk6ICdhcmlhLWxhYmVsbGVkYnknLFxuXHRvd25zOiAnYXJpYS1vd25zJyxcbn1cblxuLy8gYXJpYUFjdGl2ZURlc2NlbmRhbnRFbGVtZW50IGlzIHNpbmd1bGFyOyB0aGUgcmVzdCB0YWtlIEVsZW1lbnRbXVxuY29uc3QgYXJpYUlkUmVmZXJlbmNlRWxlbWVudFByb3BlcnRpZXM6IFJlY29yZDxrZXlvZiBBcmlhSWRSZWZlcmVuY2VQcm9wZXJ0aWVzLCBzdHJpbmc+ID0ge1xuXHRhY3RpdmVEZXNjZW5kYW50OiAnYXJpYUFjdGl2ZURlc2NlbmRhbnRFbGVtZW50Jyxcblx0Y29udHJvbHM6ICdhcmlhQ29udHJvbHNFbGVtZW50cycsXG5cdGRlc2NyaWJlZEJ5OiAnYXJpYURlc2NyaWJlZEJ5RWxlbWVudHMnLFxuXHRkZXRhaWxzOiAnYXJpYURldGFpbHNFbGVtZW50cycsXG5cdGVycm9yTWVzc2FnZTogJ2FyaWFFcnJvck1lc3NhZ2VFbGVtZW50cycsXG5cdGZsb3dUbzogJ2FyaWFGbG93VG9FbGVtZW50cycsXG5cdGxhYmVsbGVkQnk6ICdhcmlhTGFiZWxsZWRCeUVsZW1lbnRzJyxcblx0b3duczogJ2FyaWFPd25zRWxlbWVudHMnLFxufVxuXG5mdW5jdGlvbiBzZXRQcm9wZXJ0eShlbGVtZW50OiBFbGVtZW50LCBrZXk6IHN0cmluZywgdmFsdWU6IHVua25vd24pOiB2b2lkIHtcblx0KGVsZW1lbnQgYXMgdW5rbm93biBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPilba2V5XSA9IHZhbHVlXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBidWlsZEFyaWFQcm9wZXJ0aWVzKGFyaWE6IEFyaWEgfCB1bmRlZmluZWQsIGVsZW1lbnQ6IEVsZW1lbnQpOiB2b2lkIHtcblx0aWYgKCFhcmlhKSByZXR1cm5cblx0Zm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoYXJpYSkpIHtcblx0XHRpZiAoIShrZXkgaW4gYXJpYUlkUmVmZXJlbmNlQXR0cmlidXRlcykpIHtcblx0XHRcdGNvbnN0IGRvbUtleSA9IGBhcmlhJHtrZXlbMF0udG9VcHBlckNhc2UoKX0ke2tleS5zbGljZSgxKX1gXG5cdFx0XHRzZXRQcm9wZXJ0eShlbGVtZW50LCBkb21LZXksIHZhbHVlKVxuXHRcdFx0Y29udGludWVcblx0XHR9XG5cdFx0aWYgKHZhbHVlID09PSBudWxsIHx8IHZhbHVlID09PSB1bmRlZmluZWQpIHtcblx0XHRcdGVsZW1lbnQucmVtb3ZlQXR0cmlidXRlKGFyaWFJZFJlZmVyZW5jZUF0dHJpYnV0ZXNba2V5IGFzIGtleW9mIEFyaWFJZFJlZmVyZW5jZVByb3BlcnRpZXNdKVxuXHRcdFx0Y29udGludWVcblx0XHR9XG5cdFx0aWYgKHZhbHVlIGluc3RhbmNlb2YgRWxlbWVudCkge1xuXHRcdFx0Y29uc3QgaWRsS2V5ID0gYXJpYUlkUmVmZXJlbmNlRWxlbWVudFByb3BlcnRpZXNba2V5IGFzIGtleW9mIEFyaWFJZFJlZmVyZW5jZVByb3BlcnRpZXNdXG5cdFx0XHRzZXRQcm9wZXJ0eShlbGVtZW50LCBpZGxLZXksIGlkbEtleS5lbmRzV2l0aCgnRWxlbWVudHMnKSA/IFt2YWx1ZV0gOiB2YWx1ZSlcblx0XHRcdGNvbnRpbnVlXG5cdFx0fVxuXHRcdGVsZW1lbnQuc2V0QXR0cmlidXRlKGFyaWFJZFJlZmVyZW5jZUF0dHJpYnV0ZXNba2V5IGFzIGtleW9mIEFyaWFJZFJlZmVyZW5jZVByb3BlcnRpZXNdLCB2YWx1ZSlcblx0fVxufVxuIiwiaW1wb3J0IHsgRWxlbWVudE9uSGFuZGxlcnMgfSBmcm9tICdAcm9vdGVkL2V2ZW50cydcblxuaW1wb3J0IHsgdHlwZSBBcmlhLCBidWlsZEFyaWFQcm9wZXJ0aWVzIH0gZnJvbSAnLi9hcmlhLm10cydcbmltcG9ydCB7IEVsZW1lbnRDaGlsZHJlbiB9IGZyb20gJy4vY2hpbGRyZW4ubXRzJ1xuaW1wb3J0IHsgQ3NzQ2xhc3NlcyB9IGZyb20gJy4vY2xhc3Nlcy5tdHMnXG5pbXBvcnQgeyBIdG1sRWxlbWVudFByb3BlcnRpZXMgfSBmcm9tICcuL2h0bWwtZWxlbWVudC1wcm9wZXJ0aWVzLm10cydcbmltcG9ydCB7IFN2Z0VsZW1lbnRQcm9wZXJ0aWVzLCBTdmdUYWdFbGVtZW50LCBTdmdUYWdOYW1lIH0gZnJvbSAnLi9zdmctZWxlbWVudC1wcm9wZXJ0aWVzLm10cydcblxuZnVuY3Rpb24gYnVpbGRPbkhhbmRsZXJzPFRFbGVtZW50IGV4dGVuZHMgRWxlbWVudD4oXG5cdG9uOiBFbGVtZW50T25IYW5kbGVyczxURWxlbWVudD4gfCB1bmRlZmluZWQsXG5cdGVsZW1lbnQ6IFRFbGVtZW50LFxuXHRzaWduYWw6IEFib3J0U2lnbmFsLFxuKTogdm9pZCB7XG5cdGlmICghb24pIHJldHVyblxuXHRmb3IgKGNvbnN0IFtrZXksIGhhbmRsZXJdIG9mIE9iamVjdC5lbnRyaWVzKG9uKSkge1xuXHRcdGlmICghaGFuZGxlcikgY29udGludWVcblx0XHRlbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoXG5cdFx0XHRrZXksXG5cdFx0XHRldmVudCA9PiB2b2lkIChoYW5kbGVyIGFzIChldmVudD86IEV2ZW50KSA9PiB2b2lkIHwgUHJvbWlzZTx2b2lkPikoZXZlbnQpLFxuXHRcdFx0c2lnbmFsID8geyBzaWduYWwgfSA6IHVuZGVmaW5lZCxcblx0XHQpXG5cdH1cbn1cblxuZnVuY3Rpb24gYnVpbGRDbGFzc0xpc3QoY2xhc3NlczogQ3NzQ2xhc3NlcyB8IHVuZGVmaW5lZCkge1xuXHRpZiAoY2xhc3NlcyA9PT0gbnVsbCB8fCBjbGFzc2VzID09PSB1bmRlZmluZWQpIHJldHVybiB7fVxuXHRpZiAoQXJyYXkuaXNBcnJheShjbGFzc2VzKSkgcmV0dXJuIHsgY2xhc3NOYW1lOiBjbGFzc2VzLmZpbHRlcihCb29sZWFuKS5qb2luKCcgJykgfVxuXG5cdHJldHVybiB7IGNsYXNzTmFtZTogU3RyaW5nKGNsYXNzZXMpIH1cbn1cblxuZnVuY3Rpb24gaXNXcml0YWJsZURvbVByb3BlcnR5KGVsZW1lbnQ6IEVsZW1lbnQsIGtleTogc3RyaW5nKTogYm9vbGVhbiB7XG5cdGxldCBwcm90b3R5cGU6IG9iamVjdCB8IG51bGwgPSBlbGVtZW50XG5cdHdoaWxlIChwcm90b3R5cGUpIHtcblx0XHRjb25zdCBkZXNjID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihwcm90b3R5cGUsIGtleSlcblx0XHRpZiAoZGVzYykgcmV0dXJuICEhKGRlc2Mud3JpdGFibGUgfHwgZGVzYy5zZXQpXG5cdFx0cHJvdG90eXBlID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKHByb3RvdHlwZSkgYXMgb2JqZWN0IHwgbnVsbFxuXHR9XG5cdHJldHVybiBmYWxzZVxufVxuXG5leHBvcnQgdHlwZSBFbGVtZW50Q3JlYXRvciA9IChrZXk6IHN0cmluZywgbnM/OiBzdHJpbmcpID0+IEVsZW1lbnRcblxuLyoqXG4gKiBUaGUgb3ZlcmxvYWRlZCBmdW5jdGlvbiB0eXBlIHJldHVybmVkIGJ5IHtAbGluayBjcmVhdGVFbGVtZW50RmFjdG9yeX0uXG4gKiBBY2NlcHRzIEhUTUwgb3IgU1ZHIHRhZyBuYW1lcyBhbmQgcmV0dXJucyB0aGUgbWF0Y2hpbmcgZWxlbWVudCB0eXBlLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEVsZW1lbnRDcmVhdG9yRnVuY3Rpb24ge1xuXHQodGFnOiAnc3ZnJywgcHJvcGVydGllcz86IFN2Z0VsZW1lbnRQcm9wZXJ0aWVzPCdzdmcnPik6IFNWR1NWR0VsZW1lbnRcblx0PEsgZXh0ZW5kcyBFeGNsdWRlPFN2Z1RhZ05hbWUsICdzdmcnPj4odGFnOiBLLCBwcm9wZXJ0aWVzPzogU3ZnRWxlbWVudFByb3BlcnRpZXM8Sz4pOiBTdmdUYWdFbGVtZW50PEs+XG5cdDxLIGV4dGVuZHMga2V5b2YgSFRNTEVsZW1lbnRUYWdOYW1lTWFwPih0YWc6IEssIHByb3BlcnRpZXM/OiBOb0luZmVyPEh0bWxFbGVtZW50UHJvcGVydGllczxLPj4pOiBIVE1MRWxlbWVudFRhZ05hbWVNYXBbS11cbn1cblxuZXhwb3J0IHR5cGUgRWxlbWVudEZhY3RvcnkgPSBFbGVtZW50Q3JlYXRvckZ1bmN0aW9uXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlRWxlbWVudEZhY3RvcnkoY29uc3RydWN0RWxlbWVudDogRWxlbWVudENyZWF0b3IsIHNpZ25hbDogQWJvcnRTaWduYWwpOiBFbGVtZW50Q3JlYXRvckZ1bmN0aW9uIHtcblx0LyoqXG5cdCAqIENyZWF0ZXMgYW4gSFRNTCBvciBTVkcgZWxlbWVudC4gVGhlIGVsZW1lbnQgaXMgTk9UIGFwcGVuZGVkIHRvIHRoZVxuXHQgKiBkb2N1bWVudDsgcGFzcyBpdCB0byBgYXBwZW5kYCwgYHByZXBlbmRgLCBvciBzZXQgaXQgYXMgYGNoaWxkcmVuYCBvZlxuXHQgKiBhbm90aGVyIGVsZW1lbnQuXG5cdCAqXG5cdCAqIEhUTUwgdGFncyB1c2UgdGhlIHJlZ3VsYXIgYEhUTUxFbGVtZW50VGFnTmFtZU1hcGAga2V5cy4gU1ZHIHRhZ3MgdXNlXG5cdCAqIGAnc3ZnJ2AgZm9yIHRoZSByb290IGFuZCBgJ3N2Zzo8bmFtZT4nYCBmb3IgZXZlcnl0aGluZyBlbHNlICh0aGUgcHJlZml4XG5cdCAqIGtlZXBzIHRoZW0gZnJvbSBjb2xsaWRpbmcgd2l0aCBzYW1lLW5hbWVkIEhUTUwgdGFncykuXG5cdCAqXG5cdCAqIFByb3BlcnRpZXM6XG5cdCAqIC0gYGNsYXNzZXNgOiBhIGNsYXNzIHN0cmluZyBvciBhIHtAbGluayBDc3NDbGFzc2VzfSBhcnJheS4gRmFsc3lcblx0ICogICBlbnRyaWVzIGFyZSBmaWx0ZXJlZCBvdXQuXG5cdCAqIC0gYGFyaWFgOiBBUklBIGF0dHJpYnV0ZXMuIEFjY2VwdHMgc3RyaW5nIElEcyBvciBgRWxlbWVudGAgcmVmZXJlbmNlc1xuXHQgKiAgIGZvciBJREwgcmVmbGVjdGlvbiBwcm9wZXJ0aWVzIChlLmcuIGBhcmlhLWxhYmVsbGVkYnlgKS5cblx0ICogLSBgb25gOiBhbiBvYmplY3Qgb2YgZXZlbnQgaGFuZGxlcnMuIEVhY2ggbGlzdGVuZXIgaXMgcmVtb3ZlZCB3aGVuIHRoZVxuXHQgKiAgIGNvbXBvbmVudCB1bm1vdW50cy5cblx0ICogLSBgY2hpbGRyZW5gOiBhIHNpbmdsZSBgTm9kZWAgb3IgYW4gYXJyYXk7IGFwcGVuZGVkIGluIG9yZGVyLiBgdW5kZWZpbmVkYFxuXHQgKiAgIGFuZCBgbnVsbGAgZW50cmllcyBhcmUgc2tpcHBlZCwgc2FtZSBhcyBgY2xhc3Nlc2AuXG5cdCAqIC0gT3RoZXIgcHJvcHMgYXJlIHNldCBhcyBET00gcHJvcGVydGllcyAoc28gYGh0bWxGb3JgIG5vdCBgZm9yYCxcblx0ICogICBgcmVhZE9ubHlgIG5vdCBgcmVhZG9ubHlgKS4gT24gU1ZHLCBhbnl0aGluZyB0aGF0IGlzbid0IGEgd3JpdGFibGVcblx0ICogICBET00gcHJvcGVydHkgZmFsbHMgYmFjayB0byBgc2V0QXR0cmlidXRlYC5cblx0ICpcblx0ICogQGV4YW1wbGVcblx0ICogYGBgdHNcblx0ICogY29uc3QgZGl2ID0gZWxlbWVudCgnZGl2Jywge1xuXHQgKiAgIGNsYXNzZXM6ICdjYXJkJyxcblx0ICogICBhcmlhOiB7XG5cdCAqICAgICBsYWJlbDogJ0NhcmQnLFxuXHQgKiAgICAgbGFiZWxsZWRCeTogaGVhZGluZ0VsLFxuXHQgKiAgIH0sXG5cdCAqICAgY2hpbGRyZW46IFtcblx0ICogICAgIGVsZW1lbnQoJ2gyJywge1xuXHQgKiAgICAgICB0ZXh0Q29udGVudDogJ1RpdGxlJyxcblx0ICogICAgIH0pLFxuXHQgKiAgICAgZWxlbWVudCgncCcsIHtcblx0ICogICAgICAgdGV4dENvbnRlbnQ6ICdCb2R5Jyxcblx0ICogICAgIH0pLFxuXHQgKiAgIF0sXG5cdCAqIH0pXG5cdCAqXG5cdCAqIGNvbnN0IGljb24gPSBlbGVtZW50KCdzdmcnLCB7XG5cdCAqICAgdmlld0JveDogJzAgMCAyNCAyNCcsXG5cdCAqICAgYXJpYToge1xuXHQgKiAgICAgaGlkZGVuOiAndHJ1ZScsXG5cdCAqICAgfSxcblx0ICogICBjaGlsZHJlbjogZWxlbWVudCgnc3ZnOnVzZScsIHtcblx0ICogICAgIGhyZWY6IHNwcml0ZVVybCxcblx0ICogICB9KSxcblx0ICogfSlcblx0ICogYGBgXG5cdCAqL1xuXHRmdW5jdGlvbiBjcmVhdGVFbGVtZW50KHRhZzogJ3N2ZycsIHByb3BlcnRpZXM/OiBTdmdFbGVtZW50UHJvcGVydGllczwnc3ZnJz4pOiBTVkdTVkdFbGVtZW50XG5cdGZ1bmN0aW9uIGNyZWF0ZUVsZW1lbnQ8SyBleHRlbmRzIEV4Y2x1ZGU8U3ZnVGFnTmFtZSwgJ3N2Zyc+Pih0YWc6IEssIHByb3BlcnRpZXM/OiBTdmdFbGVtZW50UHJvcGVydGllczxLPik6IFN2Z1RhZ0VsZW1lbnQ8Sz5cblx0ZnVuY3Rpb24gY3JlYXRlRWxlbWVudDxLRWxlbWVudCBleHRlbmRzIGtleW9mIEhUTUxFbGVtZW50VGFnTmFtZU1hcD4odGFnOiBLRWxlbWVudCwgcHJvcGVydGllcz86IE5vSW5mZXI8SHRtbEVsZW1lbnRQcm9wZXJ0aWVzPEtFbGVtZW50Pj4pOiBIVE1MRWxlbWVudFRhZ05hbWVNYXBbS0VsZW1lbnRdXG5cdGZ1bmN0aW9uIGNyZWF0ZUVsZW1lbnQodGFnOiBzdHJpbmcsIHByb3BlcnRpZXM/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik6IEVsZW1lbnQge1xuXHRcdGlmICh0YWcgPT09ICdzdmcnIHx8IHRhZy5zdGFydHNXaXRoKCdzdmc6JykpIHtcblx0XHRcdGNvbnN0IGFjdHVhbFRhZyA9IHRhZyA9PT0gJ3N2ZycgPyAnc3ZnJyA6IHRhZy5zbGljZSg0KVxuXHRcdFx0Y29uc3QgeyBjbGFzc2VzLCBjaGlsZHJlbiwgYXJpYSwgb24sIHN0eWxlLCAuLi5hdHRyaWJ1dGVzIH0gPSBwcm9wZXJ0aWVzID8/IHt9XG5cdFx0XHRjb25zdCBuZXdFbGVtZW50ID0gY29uc3RydWN0RWxlbWVudChhY3R1YWxUYWcsICdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZycpIGFzIFNWR0VsZW1lbnRcblxuXHRcdFx0Zm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoYXR0cmlidXRlcykpIHtcblx0XHRcdFx0aWYgKHZhbHVlID09PSB1bmRlZmluZWQgfHwgdmFsdWUgPT09IG51bGwpIGNvbnRpbnVlXG5cdFx0XHRcdGlmIChpc1dyaXRhYmxlRG9tUHJvcGVydHkobmV3RWxlbWVudCwga2V5KSkge1xuXHRcdFx0XHRcdDsobmV3RWxlbWVudCBhcyB1bmtub3duIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KVtrZXldID0gdmFsdWVcblx0XHRcdFx0fVxuXHRcdFx0XHRlbHNlIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnIHx8IHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicgfHwgdHlwZW9mIHZhbHVlID09PSAnYm9vbGVhbicpIHtcblx0XHRcdFx0XHRuZXdFbGVtZW50LnNldEF0dHJpYnV0ZShrZXksIFN0cmluZyh2YWx1ZSkpXG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0Y29uc3QgeyBjbGFzc05hbWUgfSA9IGJ1aWxkQ2xhc3NMaXN0KGNsYXNzZXMgYXMgQ3NzQ2xhc3NlcyB8IHVuZGVmaW5lZClcblx0XHRcdGlmIChjbGFzc05hbWUpIG5ld0VsZW1lbnQuc2V0QXR0cmlidXRlKCdjbGFzcycsIGNsYXNzTmFtZSlcblxuXHRcdFx0aWYgKHN0eWxlKSBPYmplY3QuYXNzaWduKG5ld0VsZW1lbnQuc3R5bGUsIHN0eWxlKVxuXHRcdFx0YnVpbGRBcmlhUHJvcGVydGllcyhhcmlhIGFzIEFyaWEgfCB1bmRlZmluZWQsIG5ld0VsZW1lbnQpXG5cdFx0XHRidWlsZE9uSGFuZGxlcnMob24gYXMgRWxlbWVudE9uSGFuZGxlcnM8RWxlbWVudD4gfCB1bmRlZmluZWQsIG5ld0VsZW1lbnQsIHNpZ25hbClcblxuXHRcdFx0YXBwZW5kQ2hpbGRyZW4obmV3RWxlbWVudCwgY2hpbGRyZW4gYXMgRWxlbWVudENoaWxkcmVuKVxuXG5cdFx0XHRyZXR1cm4gbmV3RWxlbWVudFxuXHRcdH1cblxuXHRcdGNvbnN0IHsgYXJpYSwgY2hpbGRyZW4sIGNsYXNzZXMsIG9uLCBzdHlsZSwgLi4uYXNzaWduYWJsZVByb3BlcnRpZXMgfSA9IHByb3BlcnRpZXMgPz8ge31cblx0XHRjb25zdCBuZXdFbGVtZW50ID0gY29uc3RydWN0RWxlbWVudCh0YWcpIGFzIEhUTUxFbGVtZW50XG5cblx0XHRjb25zdCB7IGNsYXNzTmFtZSB9ID0gYnVpbGRDbGFzc0xpc3QoY2xhc3NlcyBhcyBDc3NDbGFzc2VzIHwgdW5kZWZpbmVkKVxuXHRcdGlmIChjbGFzc05hbWUpIG5ld0VsZW1lbnQuY2xhc3NOYW1lID0gY2xhc3NOYW1lXG5cblx0XHRmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhhc3NpZ25hYmxlUHJvcGVydGllcykpIHtcblx0XHRcdGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkIHx8IHZhbHVlID09PSBudWxsKSBjb250aW51ZVxuXHRcdFx0aWYgKGlzV3JpdGFibGVEb21Qcm9wZXJ0eShuZXdFbGVtZW50LCBrZXkpKSB7XG5cdFx0XHRcdDsobmV3RWxlbWVudCBhcyB1bmtub3duIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KVtrZXldID0gdmFsdWVcblx0XHRcdH1cblx0XHRcdGVsc2UgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgfHwgdHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJyB8fCB0eXBlb2YgdmFsdWUgPT09ICdib29sZWFuJykge1xuXHRcdFx0XHRuZXdFbGVtZW50LnNldEF0dHJpYnV0ZShrZXksIFN0cmluZyh2YWx1ZSkpXG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0aWYgKHN0eWxlKSBPYmplY3QuYXNzaWduKG5ld0VsZW1lbnQuc3R5bGUsIHN0eWxlKVxuXHRcdGJ1aWxkQXJpYVByb3BlcnRpZXMoYXJpYSBhcyBBcmlhIHwgdW5kZWZpbmVkLCBuZXdFbGVtZW50KVxuXHRcdGJ1aWxkT25IYW5kbGVycyhvbiBhcyBFbGVtZW50T25IYW5kbGVyczxIVE1MRWxlbWVudD4gfCB1bmRlZmluZWQsIG5ld0VsZW1lbnQsIHNpZ25hbClcblx0XHRhcHBlbmRDaGlsZHJlbihuZXdFbGVtZW50LCBjaGlsZHJlbiBhcyBFbGVtZW50Q2hpbGRyZW4pXG5cblx0XHRyZXR1cm4gbmV3RWxlbWVudFxuXHR9XG5cblx0cmV0dXJuIGNyZWF0ZUVsZW1lbnRcbn1cblxuZnVuY3Rpb24gYXBwZW5kQ2hpbGRyZW4oZWxlbWVudDogRWxlbWVudCwgY2hpbGRyZW46IEVsZW1lbnRDaGlsZHJlbik6IHZvaWQge1xuXHRpZiAoQXJyYXkuaXNBcnJheShjaGlsZHJlbikpIHtcblx0XHRmb3IgKGNvbnN0IGNoaWxkIG9mIGNoaWxkcmVuKSB7XG5cdFx0XHRpZiAoY2hpbGQgPT09IHVuZGVmaW5lZCB8fCBjaGlsZCA9PT0gbnVsbCkgY29udGludWVcblx0XHRcdGVsZW1lbnQuYXBwZW5kKGNoaWxkKVxuXHRcdH1cblx0fVxuXHRlbHNlIGlmIChjaGlsZHJlbikge1xuXHRcdGVsZW1lbnQuYXBwZW5kKGNoaWxkcmVuKVxuXHR9XG59XG4iXSwibWFwcGluZ3MiOiI7QUEwREEsU0FBZ0IsU0FBUyxHQUFHLFlBQTJFO0NBQ3RHLElBQUksV0FBVyxXQUFXLEdBQUcsT0FB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
|
package/dist/events.d.mts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
export * from
|
|
1
|
+
export * from "@rooted/events";
|
package/dist/events.mjs
CHANGED
|
@@ -1,3 +1 @@
|
|
|
1
|
-
export * from
|
|
2
|
-
//# sourceMappingURL=events.mjs.map
|
|
3
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsImZpbGUiOiJldmVudHMubWpzIiwic291cmNlc0NvbnRlbnQiOltdfQ==
|
|
1
|
+
export * from "@rooted/events";
|
package/package.json
CHANGED
|
@@ -1,59 +1,60 @@
|
|
|
1
1
|
{
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
}
|
|
2
|
+
"name": "@rooted/elements",
|
|
3
|
+
"version": "1.0.0-alpha.10",
|
|
4
|
+
"description": "Typed HTML and SVG element factory for the rooted framework",
|
|
5
|
+
"keywords": [
|
|
6
|
+
"web-components",
|
|
7
|
+
"custom-elements",
|
|
8
|
+
"framework-free",
|
|
9
|
+
"typescript",
|
|
10
|
+
"rooted"
|
|
11
|
+
],
|
|
12
|
+
"license": "MIT",
|
|
13
|
+
"repository": {
|
|
14
|
+
"type": "git",
|
|
15
|
+
"url": "git+https://github.com/Marvin-Brouwer/rooted.git",
|
|
16
|
+
"directory": "packages/elements"
|
|
17
|
+
},
|
|
18
|
+
"homepage": "https://github.com/Marvin-Brouwer/rooted#readme",
|
|
19
|
+
"bugs": "https://github.com/Marvin-Brouwer/rooted/issues",
|
|
20
|
+
"sideEffects": false,
|
|
21
|
+
"publishConfig": {
|
|
22
|
+
"registry": "https://registry.npmjs.org/",
|
|
23
|
+
"access": "public",
|
|
24
|
+
"provenance": true
|
|
25
|
+
},
|
|
26
|
+
"files": [
|
|
27
|
+
"dist",
|
|
28
|
+
"readme.md"
|
|
29
|
+
],
|
|
30
|
+
"engines": {
|
|
31
|
+
"node": ">=22.0.0",
|
|
32
|
+
"pnpm": ">=10.0.0"
|
|
33
|
+
},
|
|
34
|
+
"exports": {
|
|
35
|
+
".": {
|
|
36
|
+
"import": "./dist/elements.mjs",
|
|
37
|
+
"types": "./dist/elements.d.mjs"
|
|
38
|
+
},
|
|
39
|
+
"./events": {
|
|
40
|
+
"import": "./dist/events.mjs",
|
|
41
|
+
"types": "./dist/events.d.mjs"
|
|
42
|
+
}
|
|
43
|
+
},
|
|
44
|
+
"scripts": {
|
|
45
|
+
"build": "pnpm build:ci",
|
|
46
|
+
"build:dev": "pnpm build:ci && rooted-development extract-api",
|
|
47
|
+
"build:ci": "tsdown",
|
|
48
|
+
"watch": "tsdown --watch --no-clean",
|
|
49
|
+
"clean": "rm -rf dist",
|
|
50
|
+
"extract-api": "rooted-development extract-api"
|
|
51
|
+
},
|
|
52
|
+
"peerDependencies": {
|
|
53
|
+
"@rooted/events": "1.0.0-alpha.10"
|
|
54
|
+
},
|
|
55
|
+
"devDependencies": {
|
|
56
|
+
"@rooted/development": "workspace:*",
|
|
57
|
+
"@rooted/events": "1.0.0-alpha.10",
|
|
58
|
+
"tsx": "^4.23.13"
|
|
59
|
+
}
|
|
60
|
+
}
|
package/readme.md
CHANGED
|
@@ -1,7 +1,39 @@
|
|
|
1
1
|
# [`@rooted/elements`](https://www.npmjs.com/package/@rooted/elements)
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
Typed HTML and SVG element factory. Usable on its own, or as the DOM helper layer for the [`@rooted/*`](https://github.com/Marvin-Brouwer/rooted#rooted) framework.
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
> [!IMPORTANT]
|
|
6
|
+
> This package is still in alpha.
|
|
6
7
|
|
|
7
|
-
|
|
8
|
+
```sh
|
|
9
|
+
pnpm add @rooted/elements
|
|
10
|
+
```
|
|
11
|
+
|
|
12
|
+
The package ships a factory builder rather than a ready-made `element`. You hand it the function that creates nodes and an `AbortSignal`, and you get the typed `element(...)` back. Inside a rooted component that's already done for you, `element` is on the mount context.
|
|
13
|
+
|
|
14
|
+
```ts
|
|
15
|
+
import { createElementFactory, type ElementCreator } from '@rooted/elements'
|
|
16
|
+
|
|
17
|
+
const controller = new AbortController()
|
|
18
|
+
const createElement: ElementCreator = (tag, ns) => ns
|
|
19
|
+
? document.createElementNS(ns, tag)
|
|
20
|
+
: document.createElement(tag)
|
|
21
|
+
|
|
22
|
+
const element = createElementFactory(createElement, controller.signal)
|
|
23
|
+
|
|
24
|
+
const card = element('div', {
|
|
25
|
+
classes: 'card',
|
|
26
|
+
children: [
|
|
27
|
+
element('h2', {
|
|
28
|
+
textContent: 'Title',
|
|
29
|
+
}),
|
|
30
|
+
element('p', {
|
|
31
|
+
textContent: 'Body',
|
|
32
|
+
}),
|
|
33
|
+
],
|
|
34
|
+
})
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
The `ns` branch is what makes `element('svg', ...)` and the `svg:*` tags work, so don't drop it. Aborting the controller removes every listener registered through the `on` prop, which is how components clean up on unmount.
|
|
38
|
+
|
|
39
|
+
More in the [elements page](https://github.com/Marvin-Brouwer/rooted/blob/main/docs/advanced/elements.md).
|
package/LICENSE
DELETED
|
@@ -1,21 +0,0 @@
|
|
|
1
|
-
MIT License
|
|
2
|
-
|
|
3
|
-
Copyright (c) 2026 Marvin Brouwer
|
|
4
|
-
|
|
5
|
-
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
-
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
-
in the Software without restriction, including without limitation the rights
|
|
8
|
-
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
-
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
-
furnished to do so, subject to the following conditions:
|
|
11
|
-
|
|
12
|
-
The above copyright notice and this permission notice shall be included in all
|
|
13
|
-
copies or substantial portions of the Software.
|
|
14
|
-
|
|
15
|
-
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
-
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
-
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
-
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
-
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
-
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
-
SOFTWARE.
|