@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.
@@ -1,35 +1,94 @@
1
- import { ElementOnHandlers } from '@rooted/events';
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
- /** {@inheritdoc ARIAMixin['ariaActiveDescendantElement']} */
9
- activeDescendant?: string | Element | null;
10
- /** {@inheritdoc ARIAMixin['ariaControlsElements']} */
11
- controls?: string | Element | null;
12
- /** {@inheritdoc ARIAMixin['ariaDescribedByElements']} */
13
- describedBy?: string | Element | null;
14
- /** {@inheritdoc ARIAMixin['ariaDetailsElements']} */
15
- details?: string | Element | null;
16
- /** {@inheritdoc ARIAMixin['ariaErrorMessageElements']} */
17
- errorMessage?: string | Element | null;
18
- /** {@inheritdoc ARIAMixin['ariaFlowToElements']} */
19
- flowTo?: string | Element | null;
20
- /** {@inheritdoc ARIAMixin['ariaLabelledByElements']} */
21
- labelledBy?: string | Element | null;
22
- /** {@inheritdoc ARIAMixin['ariaOwnsElements']} */
23
- owns?: string | Element | null;
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 truthy, otherwise `undefined`.
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', isActive),
61
- * cssClass('btn--disabled', isDisabled),
133
+ * cssClass(isActive, 'btn--active'),
134
+ * cssClass(isDisabled, 'btn--disabled'),
62
135
  * ],
63
136
  * })
64
137
  * ```
65
138
  */
66
- declare function cssClass(className: string): CssClass;
67
- declare function cssClass(className: string, visible: boolean | null | undefined): CssClass;
68
- declare function cssClass(className: CssClass): CssClass;
69
- declare function cssClass(className: CssClass, visible: boolean | null | undefined): CssClass;
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
- [P in keyof T]-?: IfEquals<{
74
- [Q in P]: T[P];
75
- }, {
76
- -readonly [Q in P]: T[P];
77
- }, never, P>;
78
- }[keyof T];
79
- type FunctionKeys<T> = {
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
- children?: Array<Node | string> | Node | string;
88
- classes?: CssClasses;
89
- aria?: Aria;
90
- on?: ElementOnHandlers<TElement>;
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
- type ElementCreator = (key: string) => HTMLElement;
94
- type ElementFactory = ReturnType<typeof createElementFactory>;
95
- declare function createElementFactory(constructElement: ElementCreator, signal: AbortSignal): <KElement extends keyof HTMLElementTagNameMap>(tag: KElement, properties?: NoInfer<HtmlElementProperties<KElement>>) => HTMLElementTagNameMap[KElement];
96
-
97
- export { type Aria, type CssClass, type CssClasses, type ElementCreator, type ElementFactory, createElementFactory, cssClass };
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
- // src/classes.mts
2
- function cssClass(className, visible = true) {
3
- if (visible !== true) return;
4
- return className;
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
- // src/aria.mts
8
- var ariaIdReferenceAttributes = {
9
- activeDescendant: "aria-activedescendant",
10
- controls: "aria-controls",
11
- describedBy: "aria-describedby",
12
- details: "aria-details",
13
- errorMessage: "aria-errormessage",
14
- flowTo: "aria-flowto",
15
- labelledBy: "aria-labelledby",
16
- owns: "aria-owns"
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
- var ariaIdReferenceElementProperties = {
19
- activeDescendant: "ariaActiveDescendantElement",
20
- controls: "ariaControlsElements",
21
- describedBy: "ariaDescribedByElements",
22
- details: "ariaDetailsElements",
23
- errorMessage: "ariaErrorMessageElements",
24
- flowTo: "ariaFlowToElements",
25
- labelledBy: "ariaLabelledByElements",
26
- owns: "ariaOwnsElements"
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
- element[key] = value;
45
+ element[key] = value;
30
46
  }
31
47
  function buildAriaProperties(aria, element) {
32
- if (!aria) return;
33
- for (const [key, value] of Object.entries(aria)) {
34
- if (!(key in ariaIdReferenceAttributes)) {
35
- const domKey = `aria${key[0].toUpperCase()}${key.slice(1)}`;
36
- setProperty(element, domKey, value);
37
- continue;
38
- }
39
- if (value === null || value === void 0) {
40
- element.removeAttribute(ariaIdReferenceAttributes[key]);
41
- continue;
42
- }
43
- if (value instanceof Element) {
44
- const idlKey = ariaIdReferenceElementProperties[key];
45
- setProperty(element, idlKey, idlKey.endsWith("Elements") ? [value] : value);
46
- continue;
47
- }
48
- element.setAttribute(ariaIdReferenceAttributes[key], value);
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
- // src/element-factory.mts
66
+ //#endregion
67
+ //#region src/element-factory.mts
53
68
  function buildOnHandlers(on, element, signal) {
54
- if (!on) return;
55
- for (const [key, handler] of Object.entries(on)) {
56
- if (!handler) continue;
57
- element.addEventListener(
58
- key,
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
- if (classes === null || classes === void 0) return {};
66
- if (Array.isArray(classes)) return { className: classes.filter(Boolean).join(" ") };
67
- return { className: String(classes) };
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
- function createElement(tag, properties) {
71
- const { aria, children, classes, on, ...assignableProperties } = properties ?? {};
72
- const definedProperties = Object.fromEntries(
73
- Object.entries(assignableProperties).filter(([, v]) => v !== void 0 && v !== null)
74
- );
75
- const newElement = Object.assign(
76
- constructElement(tag),
77
- definedProperties,
78
- buildClassList(classes)
79
- );
80
- buildAriaProperties(aria, newElement);
81
- buildOnHandlers(on, newElement, signal);
82
- if (Array.isArray(children)) {
83
- for (const child of children) {
84
- newElement.append(child);
85
- }
86
- } else if (children) {
87
- newElement.append(children);
88
- }
89
- return newElement;
90
- }
91
- return createElement.bind(void 0);
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 '@rooted/events';
1
+ export * from "@rooted/events";
package/dist/events.mjs CHANGED
@@ -1,3 +1 @@
1
- export * from '@rooted/events';
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
- "name": "@rooted/elements",
3
- "version": "1.0.0-alpha.0",
4
- "description": "rooted html element utilities",
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": "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
- "access": "public",
23
- "provenance": true
24
- },
25
- "files": [
26
- "dist",
27
- "readme.md"
28
- ],
29
- "engines": {
30
- "node": ">=22.0.0",
31
- "pnpm": ">=10.0.0"
32
- },
33
- "exports": {
34
- ".": {
35
- "import": "./dist/elements.mjs",
36
- "types": "./dist/elements.d.mjs"
37
- },
38
- "./events": {
39
- "import": "./dist/events.mjs",
40
- "types": "./dist/events.d.mjs"
41
- }
42
- },
43
- "peerDependencies": {
44
- "@rooted/events": "^1.0.0-alpha.0"
45
- },
46
- "devDependencies": {
47
- "tsx": "^4.19.0",
48
- "@rooted/development": "0.1.0",
49
- "@rooted/events": "^1.0.0-alpha.0"
50
- },
51
- "scripts": {
52
- "build": "pnpm build:ci",
53
- "build:dev": "pnpm build:ci && rooted-development extract-api",
54
- "build:ci": "tsup",
55
- "watch": "tsup --watch --no-clean & rooted-development extract-api",
56
- "clean": "rm -rf dist",
57
- "extract-api": "rooted-development extract-api"
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
- Html element utilities for the [@rooted/*](https://github.com/Marvin-Brouwer/rooted?tab=readme-ov-file#rooted) framework.
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
- This library creates `HTMLElement`s and can also be used stand-alone.
5
+ > [!IMPORTANT]
6
+ > This package is still in alpha.
6
7
 
7
- > [!IMPORTANT] This package is still in `ALPHA`
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.