@magicx-eng/ai-autocomplete-angular 0.1.0
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/README.md +582 -0
- package/esm2020/lib/ai-autocomplete/ai-autocomplete.component.mjs +365 -0
- package/esm2020/lib/ai-autocomplete/index.mjs +2 -0
- package/esm2020/lib/ai-autocomplete-dropdown/ai-autocomplete-dropdown.component.mjs +81 -0
- package/esm2020/lib/ai-autocomplete-dropdown/index.mjs +2 -0
- package/esm2020/lib/ai-autocomplete.module.mjs +26 -0
- package/esm2020/lib/controller/ai-autocomplete.controller.mjs +226 -0
- package/esm2020/lib/controller/index.mjs +2 -0
- package/esm2020/lib/controller/observables.mjs +24 -0
- package/esm2020/lib/input/ai-autocomplete-input.directive.mjs +180 -0
- package/esm2020/lib/input/index.mjs +2 -0
- package/esm2020/lib/internal/editor-host/editor-host.directive.mjs +253 -0
- package/esm2020/lib/internal/pill-list/pill-list.component.mjs +65 -0
- package/esm2020/lib/internal/suggestion-grid/suggestion-grid.component.mjs +97 -0
- package/esm2020/lib/internal/suggestion-item/suggestion-item.component.mjs +76 -0
- package/esm2020/lib/shared/types.mjs +2 -0
- package/esm2020/magicx-eng-ai-autocomplete-angular.mjs +5 -0
- package/esm2020/public-api.mjs +18 -0
- package/fesm2015/magicx-eng-ai-autocomplete-angular.mjs +1386 -0
- package/fesm2015/magicx-eng-ai-autocomplete-angular.mjs.map +1 -0
- package/fesm2020/magicx-eng-ai-autocomplete-angular.mjs +1370 -0
- package/fesm2020/magicx-eng-ai-autocomplete-angular.mjs.map +1 -0
- package/index.d.ts +6 -0
- package/lib/ai-autocomplete/ai-autocomplete.component.d.ts +113 -0
- package/lib/ai-autocomplete/ai-autocomplete.component.d.ts.map +1 -0
- package/lib/ai-autocomplete/index.d.ts +2 -0
- package/lib/ai-autocomplete/index.d.ts.map +1 -0
- package/lib/ai-autocomplete-dropdown/ai-autocomplete-dropdown.component.d.ts +51 -0
- package/lib/ai-autocomplete-dropdown/ai-autocomplete-dropdown.component.d.ts.map +1 -0
- package/lib/ai-autocomplete-dropdown/index.d.ts +2 -0
- package/lib/ai-autocomplete-dropdown/index.d.ts.map +1 -0
- package/lib/ai-autocomplete.module.d.ts +18 -0
- package/lib/ai-autocomplete.module.d.ts.map +1 -0
- package/lib/controller/ai-autocomplete.controller.d.ts +131 -0
- package/lib/controller/ai-autocomplete.controller.d.ts.map +1 -0
- package/lib/controller/index.d.ts +2 -0
- package/lib/controller/index.d.ts.map +1 -0
- package/lib/controller/observables.d.ts +22 -0
- package/lib/controller/observables.d.ts.map +1 -0
- package/lib/input/ai-autocomplete-input.directive.d.ts +60 -0
- package/lib/input/ai-autocomplete-input.directive.d.ts.map +1 -0
- package/lib/input/index.d.ts +2 -0
- package/lib/input/index.d.ts.map +1 -0
- package/lib/internal/editor-host/editor-host.directive.d.ts +46 -0
- package/lib/internal/editor-host/editor-host.directive.d.ts.map +1 -0
- package/lib/internal/pill-list/pill-list.component.d.ts +35 -0
- package/lib/internal/pill-list/pill-list.component.d.ts.map +1 -0
- package/lib/internal/suggestion-grid/suggestion-grid.component.d.ts +37 -0
- package/lib/internal/suggestion-grid/suggestion-grid.component.d.ts.map +1 -0
- package/lib/internal/suggestion-item/suggestion-item.component.d.ts +33 -0
- package/lib/internal/suggestion-item/suggestion-item.component.d.ts.map +1 -0
- package/lib/shared/types.d.ts +125 -0
- package/lib/shared/types.d.ts.map +1 -0
- package/magicx-eng-ai-autocomplete-angular.d.ts.map +1 -0
- package/package.json +46 -0
- package/public-api.d.ts +15 -0
- package/public-api.d.ts.map +1 -0
|
@@ -0,0 +1,226 @@
|
|
|
1
|
+
import { AIAutocomplete as CoreAIAutocomplete, } from "@magicx-eng/ai-autocomplete-vanilla";
|
|
2
|
+
import { BehaviorSubject, map, shareReplay } from "rxjs";
|
|
3
|
+
import { deriveField } from "./observables";
|
|
4
|
+
/**
|
|
5
|
+
* Tier 2 logic surface for `@magicx-eng/ai-autocomplete-angular` — the Angular
|
|
6
|
+
* equivalent of React's `useAIAutocomplete()` hook. Wraps a headless
|
|
7
|
+
* `@magicx-eng/ai-autocomplete-vanilla` core and exposes its state as RxJS
|
|
8
|
+
* observables plus thin action methods.
|
|
9
|
+
*
|
|
10
|
+
* Per TDB §3.3, the controller is consumer-managed — the consumer creates it
|
|
11
|
+
* with `new`, holds the reference, and **must call `destroy()`** in their
|
|
12
|
+
* own `ngOnDestroy`. The Tier 1 `<ai-autocomplete>` component does this
|
|
13
|
+
* automatically; Tier 2 consumers do not get auto-cleanup.
|
|
14
|
+
*
|
|
15
|
+
* @public
|
|
16
|
+
*/
|
|
17
|
+
export class AIAutocompleteController {
|
|
18
|
+
/**
|
|
19
|
+
* Throws if invoked outside a browser environment. For SSR / Angular
|
|
20
|
+
* Universal, gate construction with `isPlatformBrowser` — see TDB §16.3.
|
|
21
|
+
*/
|
|
22
|
+
constructor(opts = {}) {
|
|
23
|
+
this.isDestroyed = false;
|
|
24
|
+
if (typeof document === "undefined") {
|
|
25
|
+
throw new Error("AIAutocompleteController requires a browser environment. " +
|
|
26
|
+
"For SSR / Angular Universal, gate construction with isPlatformBrowser.");
|
|
27
|
+
}
|
|
28
|
+
// Headless mode never renders to the host, so a throwaway div is fine —
|
|
29
|
+
// it's required by the core's signature for symmetry with full mode.
|
|
30
|
+
const host = document.createElement("div");
|
|
31
|
+
this.core = new CoreAIAutocomplete(host, {
|
|
32
|
+
...opts,
|
|
33
|
+
renderMode: "headless",
|
|
34
|
+
source: opts.source ?? "headless-sdk",
|
|
35
|
+
// Headless mode never renders the dropdown DOM, but the keyboard
|
|
36
|
+
// controller still reads `optionsPosition` to decide which vertical
|
|
37
|
+
// arrow opens the dropdown from the input.
|
|
38
|
+
optionsPosition: opts.optionsPosition ?? "below",
|
|
39
|
+
});
|
|
40
|
+
this.rawState$ = new BehaviorSubject(this.core.getState());
|
|
41
|
+
this.unsubscribeCore = this.core.subscribe((state) => {
|
|
42
|
+
if (!this.isDestroyed)
|
|
43
|
+
this.rawState$.next(state);
|
|
44
|
+
});
|
|
45
|
+
// === Per-field observables ===
|
|
46
|
+
this.text$ = deriveField(this.rawState$, (s) => s.text);
|
|
47
|
+
this.completedParams$ = deriveField(this.rawState$, (s) => s.completedParams);
|
|
48
|
+
this.suggestionPills$ = deriveField(this.rawState$, (s) => s.actionableSuggestions);
|
|
49
|
+
this.segments$ = deriveField(this.rawState$, (s) => s.segments);
|
|
50
|
+
this.newParamId$ = deriveField(this.rawState$, (s) => s.newParamId);
|
|
51
|
+
this.suggestions$ = deriveField(this.rawState$, (s) => s.suggestions);
|
|
52
|
+
this.activeIndex$ = deriveField(this.rawState$, (s) => s.activeDropdownIndex);
|
|
53
|
+
this.isLoading$ = deriveField(this.rawState$, computeUiLoading);
|
|
54
|
+
this.isReady$ = deriveField(this.rawState$, (s) => s.isReady);
|
|
55
|
+
this.isFocused$ = deriveField(this.rawState$, (s) => s.isFocused);
|
|
56
|
+
this.isDropdownOpen$ = deriveField(this.rawState$, (s) => s.isDropdownOpen);
|
|
57
|
+
this.placeholderText$ = deriveField(this.rawState$, (s) => s.placeholderText);
|
|
58
|
+
this.error$ = deriveField(this.rawState$, (s) => s.error);
|
|
59
|
+
this.editingParam$ = deriveField(this.rawState$, (s) => s.editingParam);
|
|
60
|
+
this.editingAnchor$ = deriveField(this.rawState$, (s) => s.editingAnchor);
|
|
61
|
+
this.caretOffset$ = deriveField(this.rawState$, (s) => s.caretOffset);
|
|
62
|
+
// === Composite observables ===
|
|
63
|
+
// Project directly off `rawState$` with a single map() so each store
|
|
64
|
+
// tick produces exactly ONE coherent state$ emission. Using
|
|
65
|
+
// `combineLatest` over the per-field observables here would fire one
|
|
66
|
+
// emission per inner-source tick (up to N per store update), and the
|
|
67
|
+
// editor-host directive's post-promote refocus would run against an
|
|
68
|
+
// intermediate state where `newParamId` was set but `segments` /
|
|
69
|
+
// `caretOffset` still held their old values — leaving the caret stuck
|
|
70
|
+
// at the pre-click position.
|
|
71
|
+
this.state$ = this.rawState$.pipe(map(computeState), shareReplay({ bufferSize: 1, refCount: true }));
|
|
72
|
+
this.dropdown$ = deriveField(this.rawState$, computeDropdown);
|
|
73
|
+
}
|
|
74
|
+
// === Read-only accessors ===
|
|
75
|
+
/** Stable ARIA listbox ID for the dropdown. Pass to `<textarea aria-controls="...">`. */
|
|
76
|
+
get listboxId() {
|
|
77
|
+
return this.core.listboxId;
|
|
78
|
+
}
|
|
79
|
+
/** Whether `destroy()` has been called. After destruction all action methods no-op. */
|
|
80
|
+
get destroyed() {
|
|
81
|
+
return this.isDestroyed;
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Synchronous snapshot of the controller's current public state. Mirrors
|
|
85
|
+
* the latest emission of `state$`. Useful in callbacks where you can't
|
|
86
|
+
* `subscribe` (e.g. inside an event handler).
|
|
87
|
+
*/
|
|
88
|
+
getState() {
|
|
89
|
+
return computeState(this.rawState$.value);
|
|
90
|
+
}
|
|
91
|
+
// === Action methods (pass-through to the core) ===
|
|
92
|
+
/** Clear all state, rotate `session_id`, and re-fetch. Call after submit. */
|
|
93
|
+
reset() {
|
|
94
|
+
this.core.reset();
|
|
95
|
+
}
|
|
96
|
+
/** Pick a dropdown option (or replace the re-edited param if in re-edit mode). */
|
|
97
|
+
selectOption(option) {
|
|
98
|
+
this.core.selectOption(option);
|
|
99
|
+
}
|
|
100
|
+
/** Promote the pill at `index` to active (front of the list). */
|
|
101
|
+
setActivePill(index) {
|
|
102
|
+
this.core.setActivePill(index);
|
|
103
|
+
}
|
|
104
|
+
/** Drop the last completed param's "completed" status. Text stays as plain text. */
|
|
105
|
+
removeLastParam() {
|
|
106
|
+
this.core.removeLastParam();
|
|
107
|
+
}
|
|
108
|
+
/** Clear the shimmer animation state for the most-recently-added param. */
|
|
109
|
+
clearNewParamId() {
|
|
110
|
+
this.core.clearNewParamId();
|
|
111
|
+
}
|
|
112
|
+
/** Controlled-mode setter for editor text. */
|
|
113
|
+
setValue(text) {
|
|
114
|
+
this.core.setValue(text);
|
|
115
|
+
}
|
|
116
|
+
/** Controlled-mode setter for completed params. */
|
|
117
|
+
setCompletedParams(params) {
|
|
118
|
+
this.core.setCompletedParams(params);
|
|
119
|
+
}
|
|
120
|
+
/** Forward plain-text input from the consumer's `<textarea>` to the core. */
|
|
121
|
+
handleTextChange(value) {
|
|
122
|
+
this.core.handleTextChange(value);
|
|
123
|
+
}
|
|
124
|
+
/** Forward keyboard events from the consumer's `<textarea>` to the core. */
|
|
125
|
+
handleKeyDown(event) {
|
|
126
|
+
this.core.handleKeyDown(event);
|
|
127
|
+
}
|
|
128
|
+
/** Notify the core of focus state. */
|
|
129
|
+
setFocused(focused) {
|
|
130
|
+
this.core.setFocused(focused);
|
|
131
|
+
}
|
|
132
|
+
/** Enter re-edit mode for the bold param with the given id. */
|
|
133
|
+
startEditingParam(paramId) {
|
|
134
|
+
this.core.startEditingParam(paramId);
|
|
135
|
+
}
|
|
136
|
+
/** Exit re-edit mode without changing the bold param. */
|
|
137
|
+
exitEditMode() {
|
|
138
|
+
this.core.exitEditMode();
|
|
139
|
+
}
|
|
140
|
+
/** Forward post-input caret position (extends the edit tail). */
|
|
141
|
+
handleCaretAfterInput(offset) {
|
|
142
|
+
this.core.handleCaretAfterInput(offset);
|
|
143
|
+
}
|
|
144
|
+
/** Forward selection-only caret moves (may exit re-edit). */
|
|
145
|
+
handleCaretMove(offset) {
|
|
146
|
+
this.core.handleCaretMove(offset);
|
|
147
|
+
}
|
|
148
|
+
/** Replace the bold param being re-edited. Returns true when applied. */
|
|
149
|
+
replaceEditingRange(replacement) {
|
|
150
|
+
return this.core.replaceEditingRange(replacement);
|
|
151
|
+
}
|
|
152
|
+
/** Set the highlighted option index (typically driven by hover). */
|
|
153
|
+
setActiveDropdownIndex(index) {
|
|
154
|
+
this.core.setActiveDropdownIndex(index);
|
|
155
|
+
}
|
|
156
|
+
// === Lifecycle ===
|
|
157
|
+
/**
|
|
158
|
+
* Apply runtime changes to a subset of options. Event callbacks
|
|
159
|
+
* (`onSubmit`, `onError`, etc.) cannot be swapped this way — they are
|
|
160
|
+
* registered once at construction (matches the React hook's design). For
|
|
161
|
+
* dynamic event reactivity, subscribe to the corresponding observable
|
|
162
|
+
* (e.g. `text$` instead of `onChange`).
|
|
163
|
+
*/
|
|
164
|
+
update(opts) {
|
|
165
|
+
this.core.update(opts);
|
|
166
|
+
}
|
|
167
|
+
/**
|
|
168
|
+
* Release all resources — unsubscribes from the core, destroys the core,
|
|
169
|
+
* and completes the internal state subject. Safe to call multiple times.
|
|
170
|
+
* After destruction, action methods no-op silently.
|
|
171
|
+
*/
|
|
172
|
+
destroy() {
|
|
173
|
+
if (this.isDestroyed)
|
|
174
|
+
return;
|
|
175
|
+
this.isDestroyed = true;
|
|
176
|
+
this.unsubscribeCore();
|
|
177
|
+
this.core.destroy();
|
|
178
|
+
this.rawState$.complete();
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
// ===== Pure helpers — not part of the public surface =====
|
|
182
|
+
function computeUiLoading(s) {
|
|
183
|
+
return s.isLoading && !s.editingParam && !s.inSelectionAnimation;
|
|
184
|
+
}
|
|
185
|
+
function computeState(s) {
|
|
186
|
+
return {
|
|
187
|
+
text: s.text,
|
|
188
|
+
completedParams: s.completedParams,
|
|
189
|
+
suggestionPills: s.actionableSuggestions,
|
|
190
|
+
segments: s.segments,
|
|
191
|
+
newParamId: s.newParamId,
|
|
192
|
+
suggestions: s.suggestions,
|
|
193
|
+
activeIndex: s.activeDropdownIndex,
|
|
194
|
+
isLoading: computeUiLoading(s),
|
|
195
|
+
isReady: s.isReady,
|
|
196
|
+
isFocused: s.isFocused,
|
|
197
|
+
isDropdownOpen: s.isDropdownOpen,
|
|
198
|
+
placeholderText: s.placeholderText,
|
|
199
|
+
error: s.error,
|
|
200
|
+
editingParam: s.editingParam,
|
|
201
|
+
editingAnchor: s.editingAnchor,
|
|
202
|
+
caretOffset: s.caretOffset,
|
|
203
|
+
};
|
|
204
|
+
}
|
|
205
|
+
function computeDropdown(s) {
|
|
206
|
+
const editingParam = s.editingParam;
|
|
207
|
+
const activeSuggestion = s.actionableSuggestions[0];
|
|
208
|
+
const dropdownPill = editingParam
|
|
209
|
+
? {
|
|
210
|
+
type: editingParam.suggestionType,
|
|
211
|
+
text: editingParam.suggestionPlaceholder,
|
|
212
|
+
required: true,
|
|
213
|
+
options: editingParam.options,
|
|
214
|
+
}
|
|
215
|
+
: null;
|
|
216
|
+
const dropdownActivePill = dropdownPill ?? activeSuggestion;
|
|
217
|
+
const dropdownPills = dropdownPill ? [dropdownPill] : s.actionableSuggestions;
|
|
218
|
+
return {
|
|
219
|
+
suggestions: dropdownActivePill ? [{ ...dropdownActivePill, options: s.filteredOptions }] : [],
|
|
220
|
+
activeIndex: s.activeDropdownIndex,
|
|
221
|
+
isOpen: s.isDropdownOpen,
|
|
222
|
+
pills: dropdownPills,
|
|
223
|
+
isLoading: computeUiLoading(s),
|
|
224
|
+
};
|
|
225
|
+
}
|
|
226
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWktYXV0b2NvbXBsZXRlLmNvbnRyb2xsZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL2NvbnRyb2xsZXIvYWktYXV0b2NvbXBsZXRlLmNvbnRyb2xsZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUVMLGNBQWMsSUFBSSxrQkFBa0IsR0FLckMsTUFBTSxxQ0FBcUMsQ0FBQztBQUM3QyxPQUFPLEVBQUUsZUFBZSxFQUFFLEdBQUcsRUFBbUIsV0FBVyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBTzFFLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFNUM7Ozs7Ozs7Ozs7OztHQVlHO0FBQ0gsTUFBTSxPQUFPLHdCQUF3QjtJQThEbkM7OztPQUdHO0lBQ0gsWUFBWSxPQUF3QyxFQUFFO1FBOUQ5QyxnQkFBVyxHQUFHLEtBQUssQ0FBQztRQStEMUIsSUFBSSxPQUFPLFFBQVEsS0FBSyxXQUFXLEVBQUU7WUFDbkMsTUFBTSxJQUFJLEtBQUssQ0FDYiwyREFBMkQ7Z0JBQ3pELHdFQUF3RSxDQUMzRSxDQUFDO1NBQ0g7UUFFRCx3RUFBd0U7UUFDeEUscUVBQXFFO1FBQ3JFLE1BQU0sSUFBSSxHQUFHLFFBQVEsQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLENBQUM7UUFFM0MsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLGtCQUFrQixDQUFDLElBQUksRUFBRTtZQUN2QyxHQUFHLElBQUk7WUFDUCxVQUFVLEVBQUUsVUFBVTtZQUN0QixNQUFNLEVBQUUsSUFBSSxDQUFDLE1BQU0sSUFBSSxjQUFjO1lBQ3JDLGlFQUFpRTtZQUNqRSxvRUFBb0U7WUFDcEUsMkNBQTJDO1lBQzNDLGVBQWUsRUFBRSxJQUFJLENBQUMsZUFBZSxJQUFJLE9BQU87U0FDakQsQ0FBQyxDQUFDO1FBRUgsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLGVBQWUsQ0FBWSxJQUFJLENBQUMsSUFBSSxDQUFDLFFB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QyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLHFCQUFxQixDQUFDO0lBQzlFLE9BQU87UUFDTCxXQUFXLEVBQUUsa0JBQWtCLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLGtCQUFrQixFQUFFLE9BQU8sRUFBRSxDQUFDLENBQUMsZUFBZSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRTtRQUM5RixXQUFXLEVBQUUsQ0FBQyxDQUFDLG1CQUFtQjtRQUNsQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLGNBQWM7UUFDeEIsS0FBSyxFQUFFLGFBQWE7UUFDcEIsU0FBUyxFQUFFLGdCQUFnQixDQUFDLENBQUMsQ0FBQztLQUMvQixDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIHR5cGUgQ29tcGxldGVkUGFyYW1TdGF0ZSxcbiAgQUlBdXRvY29tcGxldGUgYXMgQ29yZUFJQXV0b2NvbXBsZXRlLFxuICB0eXBlIENvcmVTdGF0ZSxcbiAgdHlwZSBTZWdtZW50LFxuICB0eXBlIFN1Z2dlc3Rpb24sXG4gIHR5cGUgU3VnZ2VzdGlvbk9wdGlvbixcbn0gZnJvbSBcIkBtYWdpY3gtZW5nL2FpLWF1dG9jb21wbGV0ZS12YW5pbGxhXCI7XG5pbXBvcnQgeyBCZWhhdmlvclN1YmplY3QsIG1hcCwgdHlwZSBPYnNlcnZhYmxlLCBzaGFyZVJlcGxheSB9IGZyb20gXCJyeGpzXCI7XG5pbXBvcnQgdHlwZSB7XG4gIEFJQXV0b2NvbXBsZXRlQ29udHJvbGxlck9wdGlvbnMsXG4gIEFJQXV0b2NvbXBsZXRlQ29udHJvbGxlclN0YXRlLFxuICBBSUF1dG9jb21wbGV0ZUNvbnRyb2xsZXJVcGRhdGUsXG4gIEFJQXV0b2NvbXBsZXRlRHJvcGRvd25TdGF0ZSxcbn0gZnJvbSBcIi4uL3NoYXJlZC90eXBlc1wiO1xuaW1wb3J0IHsgZGVyaXZlRmllbGQgfSBmcm9tIFwiLi9vYnNlcnZhYmxlc1wiO1xuXG4vKipcbiAqIFRpZXIgMiBsb2dpYyBzdXJmYWNlIGZvciBgQG1hZ2ljeC1lbmcvYWktYXV0b2NvbXBsZXRlLWFuZ3VsYXJgIOKAlCB0aGUgQW5ndWxhclxuICogZXF1aXZhbGVudCBvZiBSZWFjdCdzIGB1c2VBSUF1dG9jb21wbGV0ZSgpYCBob29rLiBXcmFwcyBhIGhlYWRsZXNzXG4gKiBgQG1hZ2ljeC1lbmcvYWktYXV0b2NvbXBsZXRlLXZhbmlsbGFgIGNvcmUgYW5kIGV4cG9zZXMgaXRzIHN0YXRlIGFzIFJ4SlNcbiAqIG9ic2VydmFibGVzIHBsdXMgdGhpbiBhY3Rpb24gbWV0aG9kcy5cbiAqXG4gKiBQZXIgVERCIMKnMy4zLCB0aGUgY29udHJvbGxlciBpcyBjb25zdW1lci1tYW5hZ2VkIOKAlCB0aGUgY29uc3VtZXIgY3JlYXRlcyBpdFxuICogd2l0aCBgbmV3YCwgaG9sZHMgdGhlIHJlZmVyZW5jZSwgYW5kICoqbXVzdCBjYWxsIGBkZXN0cm95KClgKiogaW4gdGhlaXJcbiAqIG93biBgbmdPbkRlc3Ryb3lgLiBUaGUgVGllciAxIGA8YWktYXV0b2NvbXBsZXRlPmAgY29tcG9uZW50IGRvZXMgdGhpc1xuICogYXV0b21hdGljYWxseTsgVGllciAyIGNvbnN1bWVycyBkbyBub3QgZ2V0IGF1dG8tY2xlYW51cC5cbiAqXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBjbGFzcyBBSUF1dG9jb21wbGV0ZUNvbnRyb2xsZXIge1xuICBwcml2YXRlIHJlYWRvbmx5IGNvcmU6IENvcmVBSUF1dG9jb21wbGV0ZTtcbiAgcHJpdmF0ZSByZWFkb25seSByYXdTdGF0ZSQ6IEJlaGF2aW9yU3ViamVjdDxDb3JlU3RhdGU+O1xuICBwcml2YXRlIHJlYWRvbmx5IHVuc3Vic2NyaWJlQ29yZTogKCkgPT4gdm9pZDtcbiAgcHJpdmF0ZSBpc0Rlc3Ryb3llZCA9IGZhbHNlO1xuXG4gIC8vID09PSBQZXItZmllbGQgb2JzZXJ2YWJsZXMgPT09XG4gIC8vIEVhY2ggb25lIHJ1bnMgdGhyb3VnaCBkZXJpdmVGaWVsZCwgd2hpY2ggYmFrZXMgaW4gZGlzdGluY3RVbnRpbENoYW5nZWRcbiAgLy8gYW5kIHNoYXJlUmVwbGF5KHsgYnVmZmVyU2l6ZTogMSwgcmVmQ291bnQ6IHRydWUgfSkgcGVyIMKnMTkuNC5cblxuICAvKiogUGxhaW4tdGV4dCBjb250ZW50IG9mIHRoZSBlZGl0b3IuICovXG4gIHJlYWRvbmx5IHRleHQkOiBPYnNlcnZhYmxlPHN0cmluZz47XG4gIC8qKiBDb21wbGV0ZWQgKGJvbGQpIHBhcmFtcyBjdXJyZW50bHkgaW4gdGhlIGVkaXRvci4gKi9cbiAgcmVhZG9ubHkgY29tcGxldGVkUGFyYW1zJDogT2JzZXJ2YWJsZTxDb21wbGV0ZWRQYXJhbVN0YXRlW10+O1xuICAvKiogQWN0aW9uYWJsZSBzdWdnZXN0aW9uIHBpbGxzIChmaXJzdCBvbmUgaXMgdGhlIGFjdGl2ZSBwaWxsKS4gKi9cbiAgcmVhZG9ubHkgc3VnZ2VzdGlvblBpbGxzJDogT2JzZXJ2YWJsZTxTdWdnZXN0aW9uW10+O1xuICAvKiogVGV4dCArIGNvbXBsZXRlZC1wYXJhbSBzZWdtZW50cyBmb3IgcmVuZGVyaW5nIHRoZSBlZGl0b3IgYm9keS4gKi9cbiAgcmVhZG9ubHkgc2VnbWVudHMkOiBPYnNlcnZhYmxlPFNlZ21lbnRbXT47XG4gIC8qKiBJRCBvZiB0aGUgbW9zdC1yZWNlbnRseS1wcm9tb3RlZCBwYXJhbSAoZHJpdmVzIHNoaW1tZXIgYW5pbWF0aW9uKS4gKi9cbiAgcmVhZG9ubHkgbmV3UGFyYW1JZCQ6IE9ic2VydmFibGU8c3RyaW5nIHwgbnVsbD47XG4gIC8qKiBBbGwgc3VnZ2VzdGlvbnMgZnJvbSB0aGUgc2VydmVyIChpbmNsdWRpbmcgbm9uLWFjdGlvbmFibGUgb25lcykuICovXG4gIHJlYWRvbmx5IHN1Z2dlc3Rpb25zJDogT2JzZXJ2YWJsZTxTdWdnZXN0aW9uW10+O1xuICAvKiogQ3VycmVudGx5IGhpZ2hsaWdodGVkIGRyb3Bkb3duIG9wdGlvbiBpbmRleC4gLTEgPSBub25lLiAqL1xuICByZWFkb25seSBhY3RpdmVJbmRleCQ6IE9ic2VydmFibGU8bnVtYmVyPjtcbiAgLyoqXG4gICAqIFVJLXZpc2libGUgbG9hZGluZyBmbGFnIOKAlCBzdXBwcmVzc2VkIGR1cmluZyB0aGUgcG9zdC1zZWxlY3Qgc3RyZWFrXG4gICAqIGFuaW1hdGlvbiBhbmQgZHVyaW5nIHJlLWVkaXQgKGNhY2hlZCBvcHRpb25zIHN0YXkgdmlzaWJsZSB0aGVyZSkuIFVzZVxuICAgKiB0aGlzIGluc3RlYWQgb2YgdGhlIHJhdyBjb3JlIHN0YXRlIGZvciBhbnkgbG9hZGluZy1za2VsZXRvbiBiaW5kaW5nLlxuICAgKi9cbiAgcmVhZG9ubHkgaXNMb2FkaW5nJDogT2JzZXJ2YWJsZTxib29sZWFuPjtcbiAgLyoqIFNlcnZlci1yZXBvcnRlZCBcInF1ZXJ5IGlzIGNvbXBsZXRlXCIgZmxhZy4gKi9cbiAgcmVhZG9ubHkgaXNSZWFkeSQ6IE9ic2VydmFibGU8Ym9vbGVhbj47XG4gIC8qKiBXaGV0aGVyIHRoZSBlZGl0b3IgY3VycmVudGx5IGhhcyBmb2N1cy4gKi9cbiAgcmVhZG9ubHkgaXNGb2N1c2VkJDogT2JzZXJ2YWJsZTxib29sZWFuPjtcbiAgLyoqIFdoZXRoZXIgdGhlIGRyb3Bkb3duIHNob3VsZCBjdXJyZW50bHkgYmUgdmlzaWJsZS4gKi9cbiAgcmVhZG9ubHkgaXNEcm9wZG93bk9wZW4kOiBPYnNlcnZhYmxlPGJvb2xlYW4+O1xuICAvKiogU2VydmVyLXN1Z2dlc3RlZCBwbGFjZWhvbGRlciB0ZXh0IGZvciB0aGUgZWRpdG9yLiAqL1xuICByZWFkb25seSBwbGFjZWhvbGRlclRleHQkOiBPYnNlcnZhYmxlPHN0cmluZz47XG4gIC8qKiBMYXN0IGZldGNoIGVycm9yLCBvciBudWxsLiAqL1xuICByZWFkb25seSBlcnJvciQ6IE9ic2VydmFibGU8RXJyb3IgfCBudWxsPjtcbiAgLyoqIFBhcmFtIGN1cnJlbnRseSBiZWluZyByZS1lZGl0ZWQsIG9yIG51bGwuICovXG4gIHJlYWRvbmx5IGVkaXRpbmdQYXJhbSQ6IE9ic2VydmFibGU8Q29tcGxldGVkUGFyYW1TdGF0ZSB8IG51bGw+O1xuICAvKiogUGxhaW4tdGV4dCBvZmZzZXQgd2hlcmUgdGhlIGVkaXQgcmVnaW9uIHN0YXJ0cywgb3IgbnVsbC4gKi9cbiAgcmVhZG9ubHkgZWRpdGluZ0FuY2hvciQ6IE9ic2VydmFibGU8bnVtYmVyIHwgbnVsbD47XG4gIC8qKiBMaXZlIGNhcmV0IG9mZnNldCB3aXRoaW4gdGhlIGVkaXRvci4gKi9cbiAgcmVhZG9ubHkgY2FyZXRPZmZzZXQkOiBPYnNlcnZhYmxlPG51bWJlciB8IG51bGw+O1xuXG4gIC8vID09PSBDb21wb3NpdGUgb2JzZXJ2YWJsZXMgPT09XG5cbiAgLyoqXG4gICAqIFNuYXBzaG90IG9mIGV2ZXJ5IHB1YmxpYyBmaWVsZCBpbiBvbmUgb2JqZWN0LiBDb252ZW5pZW50IGZvclxuICAgKiBgKm5nSWY9XCJjdHJsLnN0YXRlJCB8IGFzeW5jIGFzIHN0YXRlXCJgIHRlbXBsYXRpbmcg4oCUIGFsaWFzZXMgYWxsIGZpZWxkc1xuICAgKiB1bmRlciBhIHNpbmdsZSBzdWJzY3JpcHRpb24gaW5zdGVhZCBvZiBtdWx0aXBsZSBgfCBhc3luY2AgcGlwZXMuXG4gICAqL1xuICByZWFkb25seSBzdGF0ZSQ6IE9ic2VydmFibGU8QUlBdXRvY29tcGxldGVDb250cm9sbGVyU3RhdGU+O1xuXG4gIC8qKlxuICAgKiBDb21wb3NpdGUgc3RhdGUgZm9yIHRoZSBkcm9wZG93biB2aWV3LiBUaWVyIDIgY29uc3VtZXJzIHNwcmVhZCB0aGlzIGludG9cbiAgICogYDxhaS1hdXRvY29tcGxldGUtZHJvcGRvd24+YDsgVGllciAxIHVzZXMgdGhlIHNhbWUgc2hhcGUgaW50ZXJuYWxseS5cbiAgICovXG4gIHJlYWRvbmx5IGRyb3Bkb3duJDogT2JzZXJ2YWJsZTxBSUF1dG9jb21wbGV0ZURyb3Bkb3duU3RhdGU+O1xuXG4gIC8qKlxuICAgKiBUaHJvd3MgaWYgaW52b2tlZCBvdXRzaWRlIGEgYnJvd3NlciBlbnZpcm9ubWVudC4gRm9yIFNTUiAvIEFuZ3VsYXJcbiAgICogVW5pdmVyc2FsLCBnYXRlIGNvbnN0cnVjdGlvbiB3aXRoIGBpc1BsYXRmb3JtQnJvd3NlcmAg4oCUIHNlZSBUREIgwqcxNi4zLlxuICAgKi9cbiAgY29uc3RydWN0b3Iob3B0czogQUlBdXRvY29tcGxldGVDb250cm9sbGVyT3B0aW9ucyA9IHt9KSB7XG4gICAgaWYgKHR5cGVvZiBkb2N1bWVudCA9PT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBcIkFJQXV0b2NvbXBsZXRlQ29udHJvbGxlciByZXF1aXJlcyBhIGJyb3dzZXIgZW52aXJvbm1lbnQuIFwiICtcbiAgICAgICAgICBcIkZvciBTU1IgLyBBbmd1bGFyIFVuaXZlcnNhbCwgZ2F0ZSBjb25zdHJ1Y3Rpb24gd2l0aCBpc1BsYXRmb3JtQnJvd3Nlci5cIixcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gSGVhZGxlc3MgbW9kZSBuZXZlciByZW5kZXJzIHRvIHRoZSBob3N0LCBzbyBhIHRocm93YXdheSBkaXYgaXMgZmluZSDigJRcbiAgICAvLyBpdCdzIHJlcXVpcmVkIGJ5IHRoZSBjb3JlJ3Mgc2lnbmF0dXJlIGZvciBzeW1tZXRyeSB3aXRoIGZ1bGwgbW9kZS5cbiAgICBjb25zdCBob3N0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcblxuICAgIHRoaXMuY29yZSA9IG5ldyBDb3JlQUlBdXRvY29tcGxldGUoaG9zdCwge1xuICAgICAgLi4ub3B0cyxcbiAgICAgIHJlbmRlck1vZGU6IFwiaGVhZGxlc3NcIixcbiAgICAgIHNvdXJjZTogb3B0cy5zb3VyY2UgPz8gXCJoZWFkbGVzcy1zZGtcIixcbiAgICAgIC8vIEhlYWRsZXNzIG1vZGUgbmV2ZXIgcmVuZGVycyB0aGUgZHJvcGRvd24gRE9NLCBidXQgdGhlIGtleWJvYXJkXG4gICAgICAvLyBjb250cm9sbGVyIHN0aWxsIHJlYWRzIGBvcHRpb25zUG9zaXRpb25gIHRvIGRlY2lkZSB3aGljaCB2ZXJ0aWNhbFxuICAgICAgLy8gYXJyb3cgb3BlbnMgdGhlIGRyb3Bkb3duIGZyb20gdGhlIGlucHV0LlxuICAgICAgb3B0aW9uc1Bvc2l0aW9uOiBvcHRzLm9wdGlvbnNQb3NpdGlvbiA/PyBcImJlbG93XCIsXG4gICAgfSk7XG5cbiAgICB0aGlzLnJhd1N0YXRlJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Q29yZVN0YXRlPih0aGlzLmNvcmUuZ2V0U3RhdGUoKSk7XG4gICAgdGhpcy51bnN1YnNjcmliZUNvcmUgPSB0aGlzLmNvcmUuc3Vic2NyaWJlKChzdGF0ZSkgPT4ge1xuICAgICAgaWYgKCF0aGlzLmlzRGVzdHJveWVkKSB0aGlzLnJhd1N0YXRlJC5uZXh0KHN0YXRlKTtcbiAgICB9KTtcblxuICAgIC8vID09PSBQZXItZmllbGQgb2JzZXJ2YWJsZXMgPT09XG4gICAgdGhpcy50ZXh0JCA9IGRlcml2ZUZpZWxkKHRoaXMucmF3U3RhdGUkLCAocykgPT4gcy50ZXh0KTtcbiAgICB0aGlzLmNvbXBsZXRlZFBhcmFtcyQgPSBkZXJpdmVGaWVsZCh0aGlzLnJhd1N0YXRlJCwgKHMpID0+IHMuY29tcGxldGVkUGFyYW1zKTtcbiAgICB0aGlzLnN1Z2dlc3Rpb25QaWxscyQgPSBkZXJpdmVGaWVsZCh0aGlzLnJhd1N0YXRlJCwgKHMpID0+IHMuYWN0aW9uYWJsZVN1Z2dlc3Rpb25zKTtcbiAgICB0aGlzLnNlZ21lbnRzJCA9IGRlcml2ZUZpZWxkKHRoaXMucmF3U3RhdGUkLCAocykgPT4gcy5zZWdtZW50cyk7XG4gICAgdGhpcy5uZXdQYXJhbUlkJCA9IGRlcml2ZUZpZWxkKHRoaXMucmF3U3RhdGUkLCAocykgPT4gcy5uZXdQYXJhbUlkKTtcbiAgICB0aGlzLnN1Z2dlc3Rpb25zJCA9IGRlcml2ZUZpZWxkKHRoaXMucmF3U3RhdGUkLCAocykgPT4gcy5zdWdnZXN0aW9ucyk7XG4gICAgdGhpcy5hY3RpdmVJbmRleCQgPSBkZXJpdmVGaWVsZCh0aGlzLnJhd1N0YXRlJCwgKHMpID0+IHMuYWN0aXZlRHJvcGRvd25JbmRleCk7XG4gICAgdGhpcy5pc0xvYWRpbmckID0gZGVyaXZlRmllbGQodGhpcy5yYXdTdGF0ZSQsIGNvbXB1dGVVaUxvYWRpbmcpO1xuICAgIHRoaXMuaXNSZWFkeSQgPSBkZXJpdmVGaWVsZCh0aGlzLnJhd1N0YXRlJCwgKHMpID0+IHMuaXNSZWFkeSk7XG4gICAgdGhpcy5pc0ZvY3VzZWQkID0gZGVyaXZlRmllbGQodGhpcy5yYXdTdGF0ZSQsIChzKSA9PiBzLmlzRm9jdXNlZCk7XG4gICAgdGhpcy5pc0Ryb3Bkb3duT3BlbiQgPSBkZXJpdmVGaWVsZCh0aGlzLnJhd1N0YXRlJCwgKHMpID0+IHMuaXNEcm9wZG93bk9wZW4pO1xuICAgIHRoaXMucGxhY2Vob2xkZXJUZXh0JCA9IGRlcml2ZUZpZWxkKHRoaXMucmF3U3RhdGUkLCAocykgPT4gcy5wbGFjZWhvbGRlclRleHQpO1xuICAgIHRoaXMuZXJyb3IkID0gZGVyaXZlRmllbGQodGhpcy5yYXdTdGF0ZSQsIChzKSA9PiBzLmVycm9yKTtcbiAgICB0aGlzLmVkaXRpbmdQYXJhbSQgPSBkZXJpdmVGaWVsZCh0aGlzLnJhd1N0YXRlJCwgKHMpID0+IHMuZWRpdGluZ1BhcmFtKTtcbiAgICB0aGlzLmVkaXRpbmdBbmNob3IkID0gZGVyaXZlRmllbGQodGhpcy5yYXdTdGF0ZSQsIChzKSA9PiBzLmVkaXRpbmdBbmNob3IpO1xuICAgIHRoaXMuY2FyZXRPZmZzZXQkID0gZGVyaXZlRmllbGQodGhpcy5yYXdTdGF0ZSQsIChzKSA9PiBzLmNhcmV0T2Zmc2V0KTtcblxuICAgIC8vID09PSBDb21wb3NpdGUgb2JzZXJ2YWJsZXMgPT09XG4gICAgLy8gUHJvamVjdCBkaXJlY3RseSBvZmYgYHJhd1N0YXRlJGAgd2l0aCBhIHNpbmdsZSBtYXAoKSBzbyBlYWNoIHN0b3JlXG4gICAgLy8gdGljayBwcm9kdWNlcyBleGFjdGx5IE9ORSBjb2hlcmVudCBzdGF0ZSQgZW1pc3Npb24uIFVzaW5nXG4gICAgLy8gYGNvbWJpbmVMYXRlc3RgIG92ZXIgdGhlIHBlci1maWVsZCBvYnNlcnZhYmxlcyBoZXJlIHdvdWxkIGZpcmUgb25lXG4gICAgLy8gZW1pc3Npb24gcGVyIGlubmVyLXNvdXJjZSB0aWNrICh1cCB0byBOIHBlciBzdG9yZSB1cGRhdGUpLCBhbmQgdGhlXG4gICAgLy8gZWRpdG9yLWhvc3QgZGlyZWN0aXZlJ3MgcG9zdC1wcm9tb3RlIHJlZm9jdXMgd291bGQgcnVuIGFnYWluc3QgYW5cbiAgICAvLyBpbnRlcm1lZGlhdGUgc3RhdGUgd2hlcmUgYG5ld1BhcmFtSWRgIHdhcyBzZXQgYnV0IGBzZWdtZW50c2AgL1xuICAgIC8vIGBjYXJldE9mZnNldGAgc3RpbGwgaGVsZCB0aGVpciBvbGQgdmFsdWVzIOKAlCBsZWF2aW5nIHRoZSBjYXJldCBzdHVja1xuICAgIC8vIGF0IHRoZSBwcmUtY2xpY2sgcG9zaXRpb24uXG4gICAgdGhpcy5zdGF0ZSQgPSB0aGlzLnJhd1N0YXRlJC5waXBlKFxuICAgICAgbWFwKGNvbXB1dGVTdGF0ZSksXG4gICAgICBzaGFyZVJlcGxheSh7IGJ1ZmZlclNpemU6IDEsIHJlZkNvdW50OiB0cnVlIH0pLFxuICAgICk7XG5cbiAgICB0aGlzLmRyb3Bkb3duJCA9IGRlcml2ZUZpZWxkKHRoaXMucmF3U3RhdGUkLCBjb21wdXRlRHJvcGRvd24pO1xuICB9XG5cbiAgLy8gPT09IFJlYWQtb25seSBhY2Nlc3NvcnMgPT09XG5cbiAgLyoqIFN0YWJsZSBBUklBIGxpc3Rib3ggSUQgZm9yIHRoZSBkcm9wZG93bi4gUGFzcyB0byBgPHRleHRhcmVhIGFyaWEtY29udHJvbHM9XCIuLi5cIj5gLiAqL1xuICBnZXQgbGlzdGJveElkKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuY29yZS5saXN0Ym94SWQ7XG4gIH1cblxuICAvKiogV2hldGhlciBgZGVzdHJveSgpYCBoYXMgYmVlbiBjYWxsZWQuIEFmdGVyIGRlc3RydWN0aW9uIGFsbCBhY3Rpb24gbWV0aG9kcyBuby1vcC4gKi9cbiAgZ2V0IGRlc3Ryb3llZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5pc0Rlc3Ryb3llZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBTeW5jaHJvbm91cyBzbmFwc2hvdCBvZiB0aGUgY29udHJvbGxlcidzIGN1cnJlbnQgcHVibGljIHN0YXRlLiBNaXJyb3JzXG4gICAqIHRoZSBsYXRlc3QgZW1pc3Npb24gb2YgYHN0YXRlJGAuIFVzZWZ1bCBpbiBjYWxsYmFja3Mgd2hlcmUgeW91IGNhbid0XG4gICAqIGBzdWJzY3JpYmVgIChlLmcuIGluc2lkZSBhbiBldmVudCBoYW5kbGVyKS5cbiAgICovXG4gIGdldFN0YXRlKCk6IEFJQXV0b2NvbXBsZXRlQ29udHJvbGxlclN0YXRlIHtcbiAgICByZXR1cm4gY29tcHV0ZVN0YXRlKHRoaXMucmF3U3RhdGUkLnZhbHVlKTtcbiAgfVxuXG4gIC8vID09PSBBY3Rpb24gbWV0aG9kcyAocGFzcy10aHJvdWdoIHRvIHRoZSBjb3JlKSA9PT1cblxuICAvKiogQ2xlYXIgYWxsIHN0YXRlLCByb3RhdGUgYHNlc3Npb25faWRgLCBhbmQgcmUtZmV0Y2guIENhbGwgYWZ0ZXIgc3VibWl0LiAqL1xuICByZXNldCgpOiB2b2lkIHtcbiAgICB0aGlzLmNvcmUucmVzZXQoKTtcbiAgfVxuXG4gIC8qKiBQaWNrIGEgZHJvcGRvd24gb3B0aW9uIChvciByZXBsYWNlIHRoZSByZS1lZGl0ZWQgcGFyYW0gaWYgaW4gcmUtZWRpdCBtb2RlKS4gKi9cbiAgc2VsZWN0T3B0aW9uKG9wdGlvbjogU3VnZ2VzdGlvbk9wdGlvbik6IHZvaWQge1xuICAgIHRoaXMuY29yZS5zZWxlY3RPcHRpb24ob3B0aW9uKTtcbiAgfVxuXG4gIC8qKiBQcm9tb3RlIHRoZSBwaWxsIGF0IGBpbmRleGAgdG8gYWN0aXZlIChmcm9udCBvZiB0aGUgbGlzdCkuICovXG4gIHNldEFjdGl2ZVBpbGwoaW5kZXg6IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMuY29yZS5zZXRBY3RpdmVQaWxsKGluZGV4KTtcbiAgfVxuXG4gIC8qKiBEcm9wIHRoZSBsYXN0IGNvbXBsZXRlZCBwYXJhbSdzIFwiY29tcGxldGVkXCIgc3RhdHVzLiBUZXh0IHN0YXlzIGFzIHBsYWluIHRleHQuICovXG4gIHJlbW92ZUxhc3RQYXJhbSgpOiB2b2lkIHtcbiAgICB0aGlzLmNvcmUucmVtb3ZlTGFzdFBhcmFtKCk7XG4gIH1cblxuICAvKiogQ2xlYXIgdGhlIHNoaW1tZXIgYW5pbWF0aW9uIHN0YXRlIGZvciB0aGUgbW9zdC1yZWNlbnRseS1hZGRlZCBwYXJhbS4gKi9cbiAgY2xlYXJOZXdQYXJhbUlkKCk6IHZvaWQge1xuICAgIHRoaXMuY29yZS5jbGVhck5ld1BhcmFtSWQoKTtcbiAgfVxuXG4gIC8qKiBDb250cm9sbGVkLW1vZGUgc2V0dGVyIGZvciBlZGl0b3IgdGV4dC4gKi9cbiAgc2V0VmFsdWUodGV4dDogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5jb3JlLnNldFZhbHVlKHRleHQpO1xuICB9XG5cbiAgLyoqIENvbnRyb2xsZWQtbW9kZSBzZXR0ZXIgZm9yIGNvbXBsZXRlZCBwYXJhbXMuICovXG4gIHNldENvbXBsZXRlZFBhcmFtcyhwYXJhbXM6IENvbXBsZXRlZFBhcmFtU3RhdGVbXSk6IHZvaWQge1xuICAgIHRoaXMuY29yZS5zZXRDb21wbGV0ZWRQYXJhbXMocGFyYW1zKTtcbiAgfVxuXG4gIC8qKiBGb3J3YXJkIHBsYWluLXRleHQgaW5wdXQgZnJvbSB0aGUgY29uc3VtZXIncyBgPHRleHRhcmVhPmAgdG8gdGhlIGNvcmUuICovXG4gIGhhbmRsZVRleHRDaGFuZ2UodmFsdWU6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMuY29yZS5oYW5kbGVUZXh0Q2hhbmdlKHZhbHVlKTtcbiAgfVxuXG4gIC8qKiBGb3J3YXJkIGtleWJvYXJkIGV2ZW50cyBmcm9tIHRoZSBjb25zdW1lcidzIGA8dGV4dGFyZWE+YCB0byB0aGUgY29yZS4gKi9cbiAgaGFuZGxlS2V5RG93bihldmVudDogS2V5Ym9hcmRFdmVudCk6IHZvaWQge1xuICAgIHRoaXMuY29yZS5oYW5kbGVLZXlEb3duKGV2ZW50KTtcbiAgfVxuXG4gIC8qKiBOb3RpZnkgdGhlIGNvcmUgb2YgZm9jdXMgc3RhdGUuICovXG4gIHNldEZvY3VzZWQoZm9jdXNlZDogYm9vbGVhbik6IHZvaWQge1xuICAgIHRoaXMuY29yZS5zZXRGb2N1c2VkKGZvY3VzZWQpO1xuICB9XG5cbiAgLyoqIEVudGVyIHJlLWVkaXQgbW9kZSBmb3IgdGhlIGJvbGQgcGFyYW0gd2l0aCB0aGUgZ2l2ZW4gaWQuICovXG4gIHN0YXJ0RWRpdGluZ1BhcmFtKHBhcmFtSWQ6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMuY29yZS5zdGFydEVkaXRpbmdQYXJhbShwYXJhbUlkKTtcbiAgfVxuXG4gIC8qKiBFeGl0IHJlLWVkaXQgbW9kZSB3aXRob3V0IGNoYW5naW5nIHRoZSBib2xkIHBhcmFtLiAqL1xuICBleGl0RWRpdE1vZGUoKTogdm9pZCB7XG4gICAgdGhpcy5jb3JlLmV4aXRFZGl0TW9kZSgpO1xuICB9XG5cbiAgLyoqIEZvcndhcmQgcG9zdC1pbnB1dCBjYXJldCBwb3NpdGlvbiAoZXh0ZW5kcyB0aGUgZWRpdCB0YWlsKS4gKi9cbiAgaGFuZGxlQ2FyZXRBZnRlcklucHV0KG9mZnNldDogbnVtYmVyIHwgbnVsbCk6IHZvaWQge1xuICAgIHRoaXMuY29yZS5oYW5kbGVDYXJldEFmdGVySW5wdXQob2Zmc2V0KTtcbiAgfVxuXG4gIC8qKiBGb3J3YXJkIHNlbGVjdGlvbi1vbmx5IGNhcmV0IG1vdmVzIChtYXkgZXhpdCByZS1lZGl0KS4gKi9cbiAgaGFuZGxlQ2FyZXRNb3ZlKG9mZnNldDogbnVtYmVyIHwgbnVsbCk6IHZvaWQge1xuICAgIHRoaXMuY29yZS5oYW5kbGVDYXJldE1vdmUob2Zmc2V0KTtcbiAgfVxuXG4gIC8qKiBSZXBsYWNlIHRoZSBib2xkIHBhcmFtIGJlaW5nIHJlLWVkaXRlZC4gUmV0dXJucyB0cnVlIHdoZW4gYXBwbGllZC4gKi9cbiAgcmVwbGFjZUVkaXRpbmdSYW5nZShyZXBsYWNlbWVudDogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuY29yZS5yZXBsYWNlRWRpdGluZ1JhbmdlKHJlcGxhY2VtZW50KTtcbiAgfVxuXG4gIC8qKiBTZXQgdGhlIGhpZ2hsaWdodGVkIG9wdGlvbiBpbmRleCAodHlwaWNhbGx5IGRyaXZlbiBieSBob3ZlcikuICovXG4gIHNldEFjdGl2ZURyb3Bkb3duSW5kZXgoaW5kZXg6IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMuY29yZS5zZXRBY3RpdmVEcm9wZG93bkluZGV4KGluZGV4KTtcbiAgfVxuXG4gIC8vID09PSBMaWZlY3ljbGUgPT09XG5cbiAgLyoqXG4gICAqIEFwcGx5IHJ1bnRpbWUgY2hhbmdlcyB0byBhIHN1YnNldCBvZiBvcHRpb25zLiBFdmVudCBjYWxsYmFja3NcbiAgICogKGBvblN1Ym1pdGAsIGBvbkVycm9yYCwgZXRjLikgY2Fubm90IGJlIHN3YXBwZWQgdGhpcyB3YXkg4oCUIHRoZXkgYXJlXG4gICAqIHJlZ2lzdGVyZWQgb25jZSBhdCBjb25zdHJ1Y3Rpb24gKG1hdGNoZXMgdGhlIFJlYWN0IGhvb2sncyBkZXNpZ24pLiBGb3JcbiAgICogZHluYW1pYyBldmVudCByZWFjdGl2aXR5LCBzdWJzY3JpYmUgdG8gdGhlIGNvcnJlc3BvbmRpbmcgb2JzZXJ2YWJsZVxuICAgKiAoZS5nLiBgdGV4dCRgIGluc3RlYWQgb2YgYG9uQ2hhbmdlYCkuXG4gICAqL1xuICB1cGRhdGUob3B0czogQUlBdXRvY29tcGxldGVDb250cm9sbGVyVXBkYXRlKTogdm9pZCB7XG4gICAgdGhpcy5jb3JlLnVwZGF0ZShvcHRzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWxlYXNlIGFsbCByZXNvdXJjZXMg4oCUIHVuc3Vic2NyaWJlcyBmcm9tIHRoZSBjb3JlLCBkZXN0cm95cyB0aGUgY29yZSxcbiAgICogYW5kIGNvbXBsZXRlcyB0aGUgaW50ZXJuYWwgc3RhdGUgc3ViamVjdC4gU2FmZSB0byBjYWxsIG11bHRpcGxlIHRpbWVzLlxuICAgKiBBZnRlciBkZXN0cnVjdGlvbiwgYWN0aW9uIG1ldGhvZHMgbm8tb3Agc2lsZW50bHkuXG4gICAqL1xuICBkZXN0cm95KCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmlzRGVzdHJveWVkKSByZXR1cm47XG4gICAgdGhpcy5pc0Rlc3Ryb3llZCA9IHRydWU7XG4gICAgdGhpcy51bnN1YnNjcmliZUNvcmUoKTtcbiAgICB0aGlzLmNvcmUuZGVzdHJveSgpO1xuICAgIHRoaXMucmF3U3RhdGUkLmNvbXBsZXRlKCk7XG4gIH1cbn1cblxuLy8gPT09PT0gUHVyZSBoZWxwZXJzIOKAlCBub3QgcGFydCBvZiB0aGUgcHVibGljIHN1cmZhY2UgPT09PT1cblxuZnVuY3Rpb24gY29tcHV0ZVVpTG9hZGluZyhzOiBDb3JlU3RhdGUpOiBib29sZWFuIHtcbiAgcmV0dXJuIHMuaXNMb2FkaW5nICYmICFzLmVkaXRpbmdQYXJhbSAmJiAhcy5pblNlbGVjdGlvbkFuaW1hdGlvbjtcbn1cblxuZnVuY3Rpb24gY29tcHV0ZVN0YXRlKHM6IENvcmVTdGF0ZSk6IEFJQXV0b2NvbXBsZXRlQ29udHJvbGxlclN0YXRlIHtcbiAgcmV0dXJuIHtcbiAgICB0ZXh0OiBzLnRleHQsXG4gICAgY29tcGxldGVkUGFyYW1zOiBzLmNvbXBsZXRlZFBhcmFtcyxcbiAgICBzdWdnZXN0aW9uUGlsbHM6IHMuYWN0aW9uYWJsZVN1Z2dlc3Rpb25zLFxuICAgIHNlZ21lbnRzOiBzLnNlZ21lbnRzLFxuICAgIG5ld1BhcmFtSWQ6IHMubmV3UGFyYW1JZCxcbiAgICBzdWdnZXN0aW9uczogcy5zdWdnZXN0aW9ucyxcbiAgICBhY3RpdmVJbmRleDogcy5hY3RpdmVEcm9wZG93bkluZGV4LFxuICAgIGlzTG9hZGluZzogY29tcHV0ZVVpTG9hZGluZyhzKSxcbiAgICBpc1JlYWR5OiBzLmlzUmVhZHksXG4gICAgaXNGb2N1c2VkOiBzLmlzRm9jdXNlZCxcbiAgICBpc0Ryb3Bkb3duT3Blbjogcy5pc0Ryb3Bkb3duT3BlbixcbiAgICBwbGFjZWhvbGRlclRleHQ6IHMucGxhY2Vob2xkZXJUZXh0LFxuICAgIGVycm9yOiBzLmVycm9yLFxuICAgIGVkaXRpbmdQYXJhbTogcy5lZGl0aW5nUGFyYW0sXG4gICAgZWRpdGluZ0FuY2hvcjogcy5lZGl0aW5nQW5jaG9yLFxuICAgIGNhcmV0T2Zmc2V0OiBzLmNhcmV0T2Zmc2V0LFxuICB9O1xufVxuXG5mdW5jdGlvbiBjb21wdXRlRHJvcGRvd24oczogQ29yZVN0YXRlKTogQUlBdXRvY29tcGxldGVEcm9wZG93blN0YXRlIHtcbiAgY29uc3QgZWRpdGluZ1BhcmFtID0gcy5lZGl0aW5nUGFyYW07XG4gIGNvbnN0IGFjdGl2ZVN1Z2dlc3Rpb24gPSBzLmFjdGlvbmFibGVTdWdnZXN0aW9uc1swXTtcbiAgY29uc3QgZHJvcGRvd25QaWxsOiBTdWdnZXN0aW9uIHwgbnVsbCA9IGVkaXRpbmdQYXJhbVxuICAgID8ge1xuICAgICAgICB0eXBlOiBlZGl0aW5nUGFyYW0uc3VnZ2VzdGlvblR5cGUsXG4gICAgICAgIHRleHQ6IGVkaXRpbmdQYXJhbS5zdWdnZXN0aW9uUGxhY2Vob2xkZXIsXG4gICAgICAgIHJlcXVpcmVkOiB0cnVlLFxuICAgICAgICBvcHRpb25zOiBlZGl0aW5nUGFyYW0ub3B0aW9ucyxcbiAgICAgIH1cbiAgICA6IG51bGw7XG4gIGNvbnN0IGRyb3Bkb3duQWN0aXZlUGlsbCA9IGRyb3Bkb3duUGlsbCA/PyBhY3RpdmVTdWdnZXN0aW9uO1xuICBjb25zdCBkcm9wZG93blBpbGxzID0gZHJvcGRvd25QaWxsID8gW2Ryb3Bkb3duUGlsbF0gOiBzLmFjdGlvbmFibGVTdWdnZXN0aW9ucztcbiAgcmV0dXJuIHtcbiAgICBzdWdnZXN0aW9uczogZHJvcGRvd25BY3RpdmVQaWxsID8gW3sgLi4uZHJvcGRvd25BY3RpdmVQaWxsLCBvcHRpb25zOiBzLmZpbHRlcmVkT3B0aW9ucyB9XSA6IFtdLFxuICAgIGFjdGl2ZUluZGV4OiBzLmFjdGl2ZURyb3Bkb3duSW5kZXgsXG4gICAgaXNPcGVuOiBzLmlzRHJvcGRvd25PcGVuLFxuICAgIHBpbGxzOiBkcm9wZG93blBpbGxzLFxuICAgIGlzTG9hZGluZzogY29tcHV0ZVVpTG9hZGluZyhzKSxcbiAgfTtcbn1cbiJdfQ==
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
export { AIAutocompleteController } from "./ai-autocomplete.controller";
|
|
2
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL2NvbnRyb2xsZXIvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLHdCQUF3QixFQUFFLE1BQU0sOEJBQThCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgeyBBSUF1dG9jb21wbGV0ZUNvbnRyb2xsZXIgfSBmcm9tIFwiLi9haS1hdXRvY29tcGxldGUuY29udHJvbGxlclwiO1xuIl19
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { distinctUntilChanged, map, shareReplay } from "rxjs";
|
|
2
|
+
/**
|
|
3
|
+
* Per-field observable derivation factory. Enforces the §19.4 invariant:
|
|
4
|
+
*
|
|
5
|
+
* - `distinctUntilChanged` — prevents re-emission storms when the upstream
|
|
6
|
+
* state object ticks but the field a consumer cares about hasn't changed.
|
|
7
|
+
* Without this, every keystroke would re-render every async-pipe binding
|
|
8
|
+
* in the consumer's template even when nothing changed for that binding.
|
|
9
|
+
* - `shareReplay({ bufferSize: 1, refCount: true })` — guarantees that
|
|
10
|
+
* multiple subscribers (multiple `async` pipes in a template, e.g.
|
|
11
|
+
* `*ngIf="isLoading$ | async"` and `[disabled]="isLoading$ | async"`)
|
|
12
|
+
* share a single upstream subscription. `refCount: true` is non-obvious
|
|
13
|
+
* but essential: without it, the inner subscription survives after the
|
|
14
|
+
* last subscriber unmounts, leaking the chain back to `state$`.
|
|
15
|
+
*
|
|
16
|
+
* Every public observable on {@link AIAutocompleteController} must go through
|
|
17
|
+
* this factory — no exceptions.
|
|
18
|
+
*
|
|
19
|
+
* @internal
|
|
20
|
+
*/
|
|
21
|
+
export function deriveField(source$, selector, equalityFn) {
|
|
22
|
+
return source$.pipe(map(selector), distinctUntilChanged(equalityFn), shareReplay({ bufferSize: 1, refCount: true }));
|
|
23
|
+
}
|
|
24
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib2JzZXJ2YWJsZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL2NvbnRyb2xsZXIvb2JzZXJ2YWJsZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLG9CQUFvQixFQUFFLEdBQUcsRUFBbUIsV0FBVyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBRS9FOzs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FrQkc7QUFDSCxNQUFNLFVBQVUsV0FBVyxDQUN6QixPQUFzQixFQUN0QixRQUF5QixFQUN6QixVQUFvQztJQUVwQyxPQUFPLE9BQU8sQ0FBQyxJQUFJLENBQ2pCLEdBQUcsQ0FBQyxRQUFRLENBQUMsRUFDYixvQkFBb0IsQ0FBQyxVQUFVLENBQUMsRUFDaEMsV0FBVyxDQUFDLEVBQUUsVUFBVSxFQUFFLENBQUMsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FDL0MsQ0FBQztBQUNKLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBkaXN0aW5jdFVudGlsQ2hhbmdlZCwgbWFwLCB0eXBlIE9ic2VydmFibGUsIHNoYXJlUmVwbGF5IH0gZnJvbSBcInJ4anNcIjtcblxuLyoqXG4gKiBQZXItZmllbGQgb2JzZXJ2YWJsZSBkZXJpdmF0aW9uIGZhY3RvcnkuIEVuZm9yY2VzIHRoZSDCpzE5LjQgaW52YXJpYW50OlxuICpcbiAqIC0gYGRpc3RpbmN0VW50aWxDaGFuZ2VkYCDigJQgcHJldmVudHMgcmUtZW1pc3Npb24gc3Rvcm1zIHdoZW4gdGhlIHVwc3RyZWFtXG4gKiAgIHN0YXRlIG9iamVjdCB0aWNrcyBidXQgdGhlIGZpZWxkIGEgY29uc3VtZXIgY2FyZXMgYWJvdXQgaGFzbid0IGNoYW5nZWQuXG4gKiAgIFdpdGhvdXQgdGhpcywgZXZlcnkga2V5c3Ryb2tlIHdvdWxkIHJlLXJlbmRlciBldmVyeSBhc3luYy1waXBlIGJpbmRpbmdcbiAqICAgaW4gdGhlIGNvbnN1bWVyJ3MgdGVtcGxhdGUgZXZlbiB3aGVuIG5vdGhpbmcgY2hhbmdlZCBmb3IgdGhhdCBiaW5kaW5nLlxuICogLSBgc2hhcmVSZXBsYXkoeyBidWZmZXJTaXplOiAxLCByZWZDb3VudDogdHJ1ZSB9KWAg4oCUIGd1YXJhbnRlZXMgdGhhdFxuICogICBtdWx0aXBsZSBzdWJzY3JpYmVycyAobXVsdGlwbGUgYGFzeW5jYCBwaXBlcyBpbiBhIHRlbXBsYXRlLCBlLmcuXG4gKiAgIGAqbmdJZj1cImlzTG9hZGluZyQgfCBhc3luY1wiYCBhbmQgYFtkaXNhYmxlZF09XCJpc0xvYWRpbmckIHwgYXN5bmNcImApXG4gKiAgIHNoYXJlIGEgc2luZ2xlIHVwc3RyZWFtIHN1YnNjcmlwdGlvbi4gYHJlZkNvdW50OiB0cnVlYCBpcyBub24tb2J2aW91c1xuICogICBidXQgZXNzZW50aWFsOiB3aXRob3V0IGl0LCB0aGUgaW5uZXIgc3Vic2NyaXB0aW9uIHN1cnZpdmVzIGFmdGVyIHRoZVxuICogICBsYXN0IHN1YnNjcmliZXIgdW5tb3VudHMsIGxlYWtpbmcgdGhlIGNoYWluIGJhY2sgdG8gYHN0YXRlJGAuXG4gKlxuICogRXZlcnkgcHVibGljIG9ic2VydmFibGUgb24ge0BsaW5rIEFJQXV0b2NvbXBsZXRlQ29udHJvbGxlcn0gbXVzdCBnbyB0aHJvdWdoXG4gKiB0aGlzIGZhY3Rvcnkg4oCUIG5vIGV4Y2VwdGlvbnMuXG4gKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkZXJpdmVGaWVsZDxULCBSPihcbiAgc291cmNlJDogT2JzZXJ2YWJsZTxUPixcbiAgc2VsZWN0b3I6ICh2YWx1ZTogVCkgPT4gUixcbiAgZXF1YWxpdHlGbj86IChhOiBSLCBiOiBSKSA9PiBib29sZWFuLFxuKTogT2JzZXJ2YWJsZTxSPiB7XG4gIHJldHVybiBzb3VyY2UkLnBpcGUoXG4gICAgbWFwKHNlbGVjdG9yKSxcbiAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZChlcXVhbGl0eUZuKSxcbiAgICBzaGFyZVJlcGxheSh7IGJ1ZmZlclNpemU6IDEsIHJlZkNvdW50OiB0cnVlIH0pLFxuICApO1xufVxuIl19
|
|
@@ -0,0 +1,180 @@
|
|
|
1
|
+
import { Directive, ElementRef, forwardRef, Input, inject, Renderer2, } from "@angular/core";
|
|
2
|
+
import { NG_VALUE_ACCESSOR } from "@angular/forms";
|
|
3
|
+
import { Subject, takeUntil } from "rxjs";
|
|
4
|
+
import * as i0 from "@angular/core";
|
|
5
|
+
/**
|
|
6
|
+
* Tier 2 input binder. Attach to a `<textarea>` or `<input>` and pass an
|
|
7
|
+
* {@link AIAutocompleteController}:
|
|
8
|
+
*
|
|
9
|
+
* ```html
|
|
10
|
+
* <textarea [aiaInput]="ac"></textarea>
|
|
11
|
+
* ```
|
|
12
|
+
*
|
|
13
|
+
* The directive wires the input's events (input/keydown/focus/blur) to the
|
|
14
|
+
* controller, mirrors controller state into ARIA attributes
|
|
15
|
+
* (`role="combobox"`, `aria-expanded`, `aria-activedescendant`,
|
|
16
|
+
* `aria-autocomplete`, `aria-controls`), and implements
|
|
17
|
+
* {@link ControlValueAccessor} so the host element participates in Reactive
|
|
18
|
+
* Forms out of the box:
|
|
19
|
+
*
|
|
20
|
+
* ```html
|
|
21
|
+
* <textarea [aiaInput]="ac" [formControl]="myControl"></textarea>
|
|
22
|
+
* ```
|
|
23
|
+
*
|
|
24
|
+
* Per the React hook's behavior, the first typed character is auto-capitalized
|
|
25
|
+
* — typing "h" becomes "H" before being forwarded to the controller. The
|
|
26
|
+
* cursor position is preserved across that rewrite.
|
|
27
|
+
*
|
|
28
|
+
* @public
|
|
29
|
+
*/
|
|
30
|
+
export class AIAutocompleteInputDirective {
|
|
31
|
+
constructor() {
|
|
32
|
+
this.el = inject(ElementRef);
|
|
33
|
+
this.renderer = inject(Renderer2);
|
|
34
|
+
this.destroy$ = new Subject();
|
|
35
|
+
this.onChangeFn = noop;
|
|
36
|
+
this.onTouchedFn = noop;
|
|
37
|
+
}
|
|
38
|
+
ngOnInit() {
|
|
39
|
+
if (!this.controller) {
|
|
40
|
+
throw new Error('[aiaInput] requires a controller — use `[aiaInput]="myController"`.');
|
|
41
|
+
}
|
|
42
|
+
const el = this.el.nativeElement;
|
|
43
|
+
this.renderer.setAttribute(el, "aria-controls", this.controller.listboxId);
|
|
44
|
+
// Sync editor text → DOM. Skips the write when values already match, so
|
|
45
|
+
// user keystrokes don't fight with our writeback. Preserves the caret
|
|
46
|
+
// position when we do write (and the element still has focus).
|
|
47
|
+
this.controller.text$.pipe(takeUntil(this.destroy$)).subscribe((text) => {
|
|
48
|
+
if (el.value === text)
|
|
49
|
+
return;
|
|
50
|
+
const wasFocused = typeof document !== "undefined" && document.activeElement === el;
|
|
51
|
+
const start = el.selectionStart;
|
|
52
|
+
const end = el.selectionEnd;
|
|
53
|
+
this.renderer.setProperty(el, "value", text);
|
|
54
|
+
if (wasFocused && start != null && end != null) {
|
|
55
|
+
const clampedStart = Math.min(start, text.length);
|
|
56
|
+
const clampedEnd = Math.min(end, text.length);
|
|
57
|
+
try {
|
|
58
|
+
el.setSelectionRange(clampedStart, clampedEnd);
|
|
59
|
+
}
|
|
60
|
+
catch {
|
|
61
|
+
// `setSelectionRange` throws on some input types (e.g. "number");
|
|
62
|
+
// safe to ignore — those inputs don't have a meaningful selection.
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
});
|
|
66
|
+
this.controller.isDropdownOpen$.pipe(takeUntil(this.destroy$)).subscribe((isOpen) => {
|
|
67
|
+
this.renderer.setAttribute(el, "aria-expanded", String(isOpen));
|
|
68
|
+
});
|
|
69
|
+
this.controller.activeIndex$.pipe(takeUntil(this.destroy$)).subscribe((idx) => {
|
|
70
|
+
if (idx >= 0) {
|
|
71
|
+
this.renderer.setAttribute(el, "aria-activedescendant", `${this.controller.listboxId}-option-${idx}`);
|
|
72
|
+
}
|
|
73
|
+
else {
|
|
74
|
+
this.renderer.removeAttribute(el, "aria-activedescendant");
|
|
75
|
+
}
|
|
76
|
+
});
|
|
77
|
+
}
|
|
78
|
+
ngOnDestroy() {
|
|
79
|
+
this.destroy$.next();
|
|
80
|
+
this.destroy$.complete();
|
|
81
|
+
}
|
|
82
|
+
// === Event handlers (wired via host metadata above) ===
|
|
83
|
+
/**
|
|
84
|
+
* Auto-capitalizes the first character on the user's first keystroke so the
|
|
85
|
+
* server receives "Create" instead of "create". Matches React's
|
|
86
|
+
* `handleChange` in `useAIAutocomplete`. Skipped during IME composition so
|
|
87
|
+
* we don't disrupt multi-keystroke input methods (Pinyin, Hangul, etc.).
|
|
88
|
+
*/
|
|
89
|
+
onInput(event) {
|
|
90
|
+
const target = event.target;
|
|
91
|
+
const raw = target.value;
|
|
92
|
+
const isComposing = event.isComposing === true;
|
|
93
|
+
const shouldCapitalize = raw.length > 0 && !isComposing && raw[0] !== raw[0].toUpperCase();
|
|
94
|
+
let next = raw;
|
|
95
|
+
if (shouldCapitalize) {
|
|
96
|
+
const start = target.selectionStart;
|
|
97
|
+
const end = target.selectionEnd;
|
|
98
|
+
next = raw[0].toUpperCase() + raw.slice(1);
|
|
99
|
+
this.renderer.setProperty(target, "value", next);
|
|
100
|
+
if (start != null && end != null) {
|
|
101
|
+
try {
|
|
102
|
+
target.setSelectionRange(start, end);
|
|
103
|
+
}
|
|
104
|
+
catch {
|
|
105
|
+
// See note in ngOnInit's text$ subscriber.
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
this.controller.handleTextChange(next);
|
|
110
|
+
this.onChangeFn(next);
|
|
111
|
+
}
|
|
112
|
+
onKeyDown(event) {
|
|
113
|
+
this.controller.handleKeyDown(event);
|
|
114
|
+
}
|
|
115
|
+
onFocus() {
|
|
116
|
+
this.controller.setFocused(true);
|
|
117
|
+
}
|
|
118
|
+
onBlur() {
|
|
119
|
+
this.controller.setFocused(false);
|
|
120
|
+
this.onTouchedFn();
|
|
121
|
+
}
|
|
122
|
+
// === ControlValueAccessor ===
|
|
123
|
+
writeValue(value) {
|
|
124
|
+
const next = value ?? "";
|
|
125
|
+
this.renderer.setProperty(this.el.nativeElement, "value", next);
|
|
126
|
+
// The controller may be undefined transiently if Angular calls
|
|
127
|
+
// writeValue() before ngOnInit (rare but possible during dynamic form
|
|
128
|
+
// construction). Guard so we don't throw in that window.
|
|
129
|
+
if (this.controller)
|
|
130
|
+
this.controller.setValue(next);
|
|
131
|
+
}
|
|
132
|
+
registerOnChange(fn) {
|
|
133
|
+
this.onChangeFn = fn;
|
|
134
|
+
}
|
|
135
|
+
registerOnTouched(fn) {
|
|
136
|
+
this.onTouchedFn = fn;
|
|
137
|
+
}
|
|
138
|
+
setDisabledState(disabled) {
|
|
139
|
+
this.renderer.setProperty(this.el.nativeElement, "disabled", disabled);
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
AIAutocompleteInputDirective.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: AIAutocompleteInputDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
|
|
143
|
+
AIAutocompleteInputDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "15.2.10", type: AIAutocompleteInputDirective, isStandalone: true, selector: "[aiaInput]", inputs: { controller: ["aiaInput", "controller"] }, host: { attributes: { "role": "combobox", "aria-autocomplete": "list" }, listeners: { "input": "onInput($event)", "keydown": "onKeyDown($event)", "focus": "onFocus()", "blur": "onBlur()" } }, providers: [
|
|
144
|
+
{
|
|
145
|
+
provide: NG_VALUE_ACCESSOR,
|
|
146
|
+
// eslint-disable-next-line @typescript-eslint/no-use-before-define
|
|
147
|
+
useExisting: forwardRef(() => AIAutocompleteInputDirective),
|
|
148
|
+
multi: true,
|
|
149
|
+
},
|
|
150
|
+
], ngImport: i0 });
|
|
151
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: AIAutocompleteInputDirective, decorators: [{
|
|
152
|
+
type: Directive,
|
|
153
|
+
args: [{
|
|
154
|
+
selector: "[aiaInput]",
|
|
155
|
+
standalone: true,
|
|
156
|
+
host: {
|
|
157
|
+
role: "combobox",
|
|
158
|
+
"aria-autocomplete": "list",
|
|
159
|
+
"(input)": "onInput($event)",
|
|
160
|
+
"(keydown)": "onKeyDown($event)",
|
|
161
|
+
"(focus)": "onFocus()",
|
|
162
|
+
"(blur)": "onBlur()",
|
|
163
|
+
},
|
|
164
|
+
providers: [
|
|
165
|
+
{
|
|
166
|
+
provide: NG_VALUE_ACCESSOR,
|
|
167
|
+
// eslint-disable-next-line @typescript-eslint/no-use-before-define
|
|
168
|
+
useExisting: forwardRef(() => AIAutocompleteInputDirective),
|
|
169
|
+
multi: true,
|
|
170
|
+
},
|
|
171
|
+
],
|
|
172
|
+
}]
|
|
173
|
+
}], propDecorators: { controller: [{
|
|
174
|
+
type: Input,
|
|
175
|
+
args: ["aiaInput"]
|
|
176
|
+
}] } });
|
|
177
|
+
function noop() {
|
|
178
|
+
// Default no-op callback for CVA — overwritten by Angular's form bridge.
|
|
179
|
+
}
|
|
180
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWktYXV0b2NvbXBsZXRlLWlucHV0LmRpcmVjdGl2ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9saWIvaW5wdXQvYWktYXV0b2NvbXBsZXRlLWlucHV0LmRpcmVjdGl2ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsU0FBUyxFQUNULFVBQVUsRUFDVixVQUFVLEVBQ1YsS0FBSyxFQUNMLE1BQU0sRUFHTixTQUFTLEdBQ1YsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUE2QixpQkFBaUIsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzlFLE9BQU8sRUFBRSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sTUFBTSxDQUFDOztBQUcxQzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBd0JHO0FBcUJILE1BQU0sT0FBTyw0QkFBNEI7SUFwQnpDO1FBMkJtQixPQUFFLEdBQUcsTUFBTSxDQUFxRCxVQUFVLENBQUMsQ0FBQztRQUM1RSxhQUFRLEdBQUcsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQzdCLGFBQVEsR0FBRyxJQUFJLE9BQU8sRUFBUSxDQUFDO1FBRXhDLGVBQVUsR0FBNEIsSUFBSSxDQUFDO1FBQzNDLGdCQUFXLEdBQWUsSUFBSSxDQUFDO0tBeUh4QztJQXZIQyxRQUFRO1FBQ04sSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUU7WUFDcEIsTUFBTSxJQUFJLEtBQUssQ0FBQyxxRUFBcUUsQ0FBQyxDQUFDO1NBQ3hGO1FBRUQsTUFBTSxFQUFFLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxhQUFhLENBQUM7UUFDakMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxZQUFZLENBQUMsRUFBRSxFQUFFLGVBQWUsRUFBRSxJQUFJLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBRTNFLHdFQUF3RTtRQUN4RSxzRUFBc0U7UUFDdEUsK0RBQStEO1FBQy9ELElBQUksQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUU7WUFDdEUsSUFBSSxFQUFFLENBQUMsS0FBSyxLQUFLLElBQUk7Z0JBQUUsT0FBTztZQUM5QixNQUFNLFVBQVUsR0FBRyxPQUFPLFFBQVEsS0FBSyxXQUFXLElBQUksUUFBUSxDQUFDLGFBQWEsS0FBSyxFQUFFLENBQUM7WUFDcEYsTUFBTSxLQUFLLEdBQUcsRUFBRSxDQUFDLGNBQWMsQ0FBQztZQUNoQyxNQUFNLEdBQUcsR0FBRyxFQUFFLENBQUMsWUFBWSxDQUFDO1lBQzVCLElBQUksQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLEVBQUUsRUFBRSxPQUFPLEVBQUUsSUFBSSxDQUFDLENBQUM7WUFDN0MsSUFBSSxVQUFVLElBQUksS0FBSyxJQUFJLElBQUksSUFBSSxHQUFHLElBQUksSUFBSSxFQUFFO2dCQUM5QyxNQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7Z0JBQ2xELE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztnQkFDOUMsSUFBSTtvQkFDRixFQUFFLENBQUMsaUJBQWlCLENBQUMsWUFBWSxFQUFFLFVBQVUsQ0FBQyxDQUFDO2lCQUNoRDtnQkFBQyxNQUFNO29CQUNOLGtFQUFrRTtvQkFDbEUsbUVBQW1FO2lCQUNwRTthQUNGO1FBQ0gsQ0FBQyxDQUFDLENBQUM7UUFFSCxJQUFJLENBQUMsVUFBVSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFO1lBQ2xGLElBQUksQ0FBQyxRQUFRLENBQUMsWUFBWSxDQUFDLEVBQUUsRUFBRSxlQUFlLEVBQUUsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7UUFDbEUsQ0FBQyxDQUFDLENBQUM7UUFFSCxJQUFJLENBQUMsVUFBVSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFO1lBQzVFLElBQUksR0FBRyxJQUFJLENBQUMsRUFBRTtnQkFDWixJQUFJLENBQUMsUUFBUSxDQUFDLFlBQVksQ0FDeEIsRUFBRSxFQUNGLHVCQUF1QixFQUN2QixHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsU0FBUyxXQUFXLEdBQUcsRUFBRSxDQUM3QyxDQUFDO2FBQ0g7aUJBQU07Z0JBQ0wsSUFBSSxDQUFDLFFBQVEsQ0FBQyxlQUFlLENBQUMsRUFBRSxFQUFFLHVCQUF1QixDQUFDLENBQUM7YUFDNUQ7UUFDSCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRCxXQUFXO1FBQ1QsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUNyQixJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsRUFBRSxDQUFDO0lBQzNCLENBQUM7SUFFRCx5REFBeUQ7SUFFekQ7Ozs7O09BS0c7SUFDSCxPQUFPLENBQUMsS0FBWTtRQUNsQixNQUFNLE1BQU0sR0FBRyxLQUFLLENBQUMsTUFBZ0QsQ0FBQztRQUN0RSxNQUFNLEdBQUcsR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDO1FBQ3pCLE1BQU0sV0FBVyxHQUFJLEtBQW9CLENBQUMsV0FBVyxLQUFLLElBQUksQ0FBQztRQUMvRCxNQUFNLGdCQUFnQixHQUFHLEdBQUcsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxJQUFJLENBQUMsV0FBVyxJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxFQUFFLENBQUM7UUFFM0YsSUFBSSxJQUFJLEdBQUcsR0FBRyxDQUFDO1FBQ2YsSUFBSSxnQkFBZ0IsRUFBRTtZQUNwQixNQUFNLEtBQUssR0FBRyxNQUFNLENBQUMsY0FBYyxDQUFDO1lBQ3BDLE1BQU0sR0FBRyxHQUFHLE1BQU0sQ0FBQyxZQUFZLENBQUM7WUFDaEMsSUFBSSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLEVBQUUsR0FBRyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQzNDLElBQUksQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLE1BQU0sRUFBRSxPQUFPLEVBQUUsSUFBSSxDQUFDLENBQUM7WUFDakQsSUFBSSxLQUFLLElBQUksSUFBSSxJQUFJLEdBQUcsSUFBSSxJQUFJLEVBQUU7Z0JBQ2hDLElBQUk7b0JBQ0YsTUFBTSxDQUFDLGlCQUFpQixDQUFDLEtBQUssRUFBRSxHQUFHLENBQUMsQ0FBQztpQkFDdEM7Z0JBQUMsTUFBTTtvQkFDTiwyQ0FBMkM7aUJBQzVDO2FBQ0Y7U0FDRjtRQUVELElBQUksQ0FBQyxVQUFVLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDdkMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUN4QixDQUFDO0lBRUQsU0FBUyxDQUFDLEtBQW9CO1FBQzVCLElBQUksQ0FBQyxVQUFVLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3ZDLENBQUM7SUFFRCxPQUFPO1FBQ0wsSUFBSSxDQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDbkMsQ0FBQztJQUVELE1BQU07UUFDSixJQUFJLENBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNsQyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7SUFDckIsQ0FBQztJQUVELCtCQUErQjtJQUUvQixVQUFVLENBQUMsS0FBb0I7UUFDN0IsTUFBTSxJQUFJLEdBQUcsS0FBSyxJQUFJLEVBQUUsQ0FBQztRQUN6QixJQUFJLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLGFBQWEsRUFBRSxPQUFPLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDaEUsK0RBQStEO1FBQy9ELHNFQUFzRTtRQUN0RSx5REFBeUQ7UUFDekQsSUFBSSxJQUFJLENBQUMsVUFBVTtZQUFFLElBQUksQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ3RELENBQUM7SUFFRCxnQkFBZ0IsQ0FBQyxFQUEyQjtRQUMxQyxJQUFJLENBQUMsVUFBVSxHQUFHLEVBQUUsQ0FBQztJQUN2QixDQUFDO0lBRUQsaUJBQWlCLENBQUMsRUFBYztRQUM5QixJQUFJLENBQUMsV0FBVyxHQUFHLEVBQUUsQ0FBQztJQUN4QixDQUFDO0lBRUQsZ0JBQWdCLENBQUMsUUFBaUI7UUFDaEMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxhQUFhLEVBQUUsVUFBVSxFQUFFLFFBQVEsQ0FBQyxDQUFDO0lBQ3pFLENBQUM7OzBIQXBJVSw0QkFBNEI7OEdBQTVCLDRCQUE0Qiw2U0FUNUI7UUFDVDtZQUNFLE9BQU8sRUFBRSxpQkFBaUI7WUFDMUIsbUVBQW1FO1lBQ25FLFdBQVcsRUFBRSxVQUFVLENBQUMsR0FBRyxFQUFFLENBQUMsNEJBQTRCLENBQUM7WUFDM0QsS0FBSyxFQUFFLElBQUk7U0FDWjtLQUNGOzRGQUVVLDRCQUE0QjtrQkFwQnhDLFNBQVM7bUJBQUM7b0JBQ1QsUUFBUSxFQUFFLFlBQVk7b0JBQ3RCLFVBQVUsRUFBRSxJQUFJO29CQUNoQixJQUFJLEVBQUU7d0JBQ0osSUFBSSxFQUFFLFVBQVU7d0JBQ2hCLG1CQUFtQixFQUFFLE1BQU07d0JBQzNCLFNBQVMsRUFBRSxpQkFBaUI7d0JBQzVCLFdBQVcsRUFBRSxtQkFBbUI7d0JBQ2hDLFNBQVMsRUFBRSxXQUFXO3dCQUN0QixRQUFRLEVBQUUsVUFBVTtxQkFDckI7b0JBQ0QsU0FBUyxFQUFFO3dCQUNUOzRCQUNFLE9BQU8sRUFBRSxpQkFBaUI7NEJBQzFCLG1FQUFtRTs0QkFDbkUsV0FBVyxFQUFFLFVBQVUsQ0FBQyxHQUFHLEVBQUUsNkJBQTZCLENBQUM7NEJBQzNELEtBQUssRUFBRSxJQUFJO3lCQUNaO3FCQUNGO2lCQUNGOzhCQU1vQixVQUFVO3NCQUE1QixLQUFLO3VCQUFDLFVBQVU7O0FBa0luQixTQUFTLElBQUk7SUFDWCx5RUFBeUU7QUFDM0UsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIERpcmVjdGl2ZSxcbiAgRWxlbWVudFJlZixcbiAgZm9yd2FyZFJlZixcbiAgSW5wdXQsXG4gIGluamVjdCxcbiAgdHlwZSBPbkRlc3Ryb3ksXG4gIHR5cGUgT25Jbml0LFxuICBSZW5kZXJlcjIsXG59IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XG5pbXBvcnQgeyB0eXBlIENvbnRyb2xWYWx1ZUFjY2Vzc29yLCBOR19WQUxVRV9BQ0NFU1NPUiB9IGZyb20gXCJAYW5ndWxhci9mb3Jtc1wiO1xuaW1wb3J0IHsgU3ViamVjdCwgdGFrZVVudGlsIH0gZnJvbSBcInJ4anNcIjtcbmltcG9ydCB0eXBlIHsgQUlBdXRvY29tcGxldGVDb250cm9sbGVyIH0gZnJvbSBcIi4uL2NvbnRyb2xsZXIvYWktYXV0b2NvbXBsZXRlLmNvbnRyb2xsZXJcIjtcblxuLyoqXG4gKiBUaWVyIDIgaW5wdXQgYmluZGVyLiBBdHRhY2ggdG8gYSBgPHRleHRhcmVhPmAgb3IgYDxpbnB1dD5gIGFuZCBwYXNzIGFuXG4gKiB7QGxpbmsgQUlBdXRvY29tcGxldGVDb250cm9sbGVyfTpcbiAqXG4gKiBgYGBodG1sXG4gKiA8dGV4dGFyZWEgW2FpYUlucHV0XT1cImFjXCI+PC90ZXh0YXJlYT5cbiAqIGBgYFxuICpcbiAqIFRoZSBkaXJlY3RpdmUgd2lyZXMgdGhlIGlucHV0J3MgZXZlbnRzIChpbnB1dC9rZXlkb3duL2ZvY3VzL2JsdXIpIHRvIHRoZVxuICogY29udHJvbGxlciwgbWlycm9ycyBjb250cm9sbGVyIHN0YXRlIGludG8gQVJJQSBhdHRyaWJ1dGVzXG4gKiAoYHJvbGU9XCJjb21ib2JveFwiYCwgYGFyaWEtZXhwYW5kZWRgLCBgYXJpYS1hY3RpdmVkZXNjZW5kYW50YCxcbiAqIGBhcmlhLWF1dG9jb21wbGV0ZWAsIGBhcmlhLWNvbnRyb2xzYCksIGFuZCBpbXBsZW1lbnRzXG4gKiB7QGxpbmsgQ29udHJvbFZhbHVlQWNjZXNzb3J9IHNvIHRoZSBob3N0IGVsZW1lbnQgcGFydGljaXBhdGVzIGluIFJlYWN0aXZlXG4gKiBGb3JtcyBvdXQgb2YgdGhlIGJveDpcbiAqXG4gKiBgYGBodG1sXG4gKiA8dGV4dGFyZWEgW2FpYUlucHV0XT1cImFjXCIgW2Zvcm1Db250cm9sXT1cIm15Q29udHJvbFwiPjwvdGV4dGFyZWE+XG4gKiBgYGBcbiAqXG4gKiBQZXIgdGhlIFJlYWN0IGhvb2sncyBiZWhhdmlvciwgdGhlIGZpcnN0IHR5cGVkIGNoYXJhY3RlciBpcyBhdXRvLWNhcGl0YWxpemVkXG4gKiDigJQgdHlwaW5nIFwiaFwiIGJlY29tZXMgXCJIXCIgYmVmb3JlIGJlaW5nIGZvcndhcmRlZCB0byB0aGUgY29udHJvbGxlci4gVGhlXG4gKiBjdXJzb3IgcG9zaXRpb24gaXMgcHJlc2VydmVkIGFjcm9zcyB0aGF0IHJld3JpdGUuXG4gKlxuICogQHB1YmxpY1xuICovXG5ARGlyZWN0aXZlKHtcbiAgc2VsZWN0b3I6IFwiW2FpYUlucHV0XVwiLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBob3N0OiB7XG4gICAgcm9sZTogXCJjb21ib2JveFwiLFxuICAgIFwiYXJpYS1hdXRvY29tcGxldGVcIjogXCJsaXN0XCIsXG4gICAgXCIoaW5wdXQpXCI6IFwib25JbnB1dCgkZXZlbnQpXCIsXG4gICAgXCIoa2V5ZG93bilcIjogXCJvbktleURvd24oJGV2ZW50KVwiLFxuICAgIFwiKGZvY3VzKVwiOiBcIm9uRm9jdXMoKVwiLFxuICAgIFwiKGJsdXIpXCI6IFwib25CbHVyKClcIixcbiAgfSxcbiAgcHJvdmlkZXJzOiBbXG4gICAge1xuICAgICAgcHJvdmlkZTogTkdfVkFMVUVfQUNDRVNTT1IsXG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVzZS1iZWZvcmUtZGVmaW5lXG4gICAgICB1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoKSA9PiBBSUF1dG9jb21wbGV0ZUlucHV0RGlyZWN0aXZlKSxcbiAgICAgIG11bHRpOiB0cnVlLFxuICAgIH0sXG4gIF0sXG59KVxuZXhwb3J0IGNsYXNzIEFJQXV0b2NvbXBsZXRlSW5wdXREaXJlY3RpdmUgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSwgQ29udHJvbFZhbHVlQWNjZXNzb3Ige1xuICAvKipcbiAgICogVGhlIHtAbGluayBBSUF1dG9jb21wbGV0ZUNvbnRyb2xsZXJ9IHRoYXQgb3ducyB0aGUgYXV0b2NvbXBsZXRlIHN0YXRlLlxuICAgKiBSZXF1aXJlZC4gVGhlIGRpcmVjdGl2ZSB0aHJvd3Mgb24gaW5pdCBpZiB0aGlzIGlzIG1pc3NpbmcuXG4gICAqL1xuICBASW5wdXQoXCJhaWFJbnB1dFwiKSBjb250cm9sbGVyITogQUlBdXRvY29tcGxldGVDb250cm9sbGVyO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgZWwgPSBpbmplY3Q8RWxlbWVudFJlZjxIVE1MSW5wdXRFbGVtZW50IHwgSFRNTFRleHRBcmVhRWxlbWVudD4+KEVsZW1lbnRSZWYpO1xuICBwcml2YXRlIHJlYWRvbmx5IHJlbmRlcmVyID0gaW5qZWN0KFJlbmRlcmVyMik7XG4gIHByaXZhdGUgcmVhZG9ubHkgZGVzdHJveSQgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xuXG4gIHByaXZhdGUgb25DaGFuZ2VGbjogKHZhbHVlOiBzdHJpbmcpID0+IHZvaWQgPSBub29wO1xuICBwcml2YXRlIG9uVG91Y2hlZEZuOiAoKSA9PiB2b2lkID0gbm9vcDtcblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuY29udHJvbGxlcikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdbYWlhSW5wdXRdIHJlcXVpcmVzIGEgY29udHJvbGxlciDigJQgdXNlIGBbYWlhSW5wdXRdPVwibXlDb250cm9sbGVyXCJgLicpO1xuICAgIH1cblxuICAgIGNvbnN0IGVsID0gdGhpcy5lbC5uYXRpdmVFbGVtZW50O1xuICAgIHRoaXMucmVuZGVyZXIuc2V0QXR0cmlidXRlKGVsLCBcImFyaWEtY29udHJvbHNcIiwgdGhpcy5jb250cm9sbGVyLmxpc3Rib3hJZCk7XG5cbiAgICAvLyBTeW5jIGVkaXRvciB0ZXh0IOKGkiBET00uIFNraXBzIHRoZSB3cml0ZSB3aGVuIHZhbHVlcyBhbHJlYWR5IG1hdGNoLCBzb1xuICAgIC8vIHVzZXIga2V5c3Ryb2tlcyBkb24ndCBmaWdodCB3aXRoIG91ciB3cml0ZWJhY2suIFByZXNlcnZlcyB0aGUgY2FyZXRcbiAgICAvLyBwb3NpdGlvbiB3aGVuIHdlIGRvIHdyaXRlIChhbmQgdGhlIGVsZW1lbnQgc3RpbGwgaGFzIGZvY3VzKS5cbiAgICB0aGlzLmNvbnRyb2xsZXIudGV4dCQucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpLnN1YnNjcmliZSgodGV4dCkgPT4ge1xuICAgICAgaWYgKGVsLnZhbHVlID09PSB0ZXh0KSByZXR1cm47XG4gICAgICBjb25zdCB3YXNGb2N1c2VkID0gdHlwZW9mIGRvY3VtZW50ICE9PSBcInVuZGVmaW5lZFwiICYmIGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQgPT09IGVsO1xuICAgICAgY29uc3Qgc3RhcnQgPSBlbC5zZWxlY3Rpb25TdGFydDtcbiAgICAgIGNvbnN0IGVuZCA9IGVsLnNlbGVjdGlvbkVuZDtcbiAgICAgIHRoaXMucmVuZGVyZXIuc2V0UHJvcGVydHkoZWwsIFwidmFsdWVcIiwgdGV4dCk7XG4gICAgICBpZiAod2FzRm9jdXNlZCAmJiBzdGFydCAhPSBudWxsICYmIGVuZCAhPSBudWxsKSB7XG4gICAgICAgIGNvbnN0IGNsYW1wZWRTdGFydCA9IE1hdGgubWluKHN0YXJ0LCB0ZXh0Lmxlbmd0aCk7XG4gICAgICAgIGNvbnN0IGNsYW1wZWRFbmQgPSBNYXRoLm1pbihlbmQsIHRleHQubGVuZ3RoKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBlbC5zZXRTZWxlY3Rpb25SYW5nZShjbGFtcGVkU3RhcnQsIGNsYW1wZWRFbmQpO1xuICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAvLyBgc2V0U2VsZWN0aW9uUmFuZ2VgIHRocm93cyBvbiBzb21lIGlucHV0IHR5cGVzIChlLmcuIFwibnVtYmVyXCIpO1xuICAgICAgICAgIC8vIHNhZmUgdG8gaWdub3JlIOKAlCB0aG9zZSBpbnB1dHMgZG9uJ3QgaGF2ZSBhIG1lYW5pbmdmdWwgc2VsZWN0aW9uLlxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICB0aGlzLmNvbnRyb2xsZXIuaXNEcm9wZG93bk9wZW4kLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKS5zdWJzY3JpYmUoKGlzT3BlbikgPT4ge1xuICAgICAgdGhpcy5yZW5kZXJlci5zZXRBdHRyaWJ1dGUoZWwsIFwiYXJpYS1leHBhbmRlZFwiLCBTdHJpbmcoaXNPcGVuKSk7XG4gICAgfSk7XG5cbiAgICB0aGlzLmNvbnRyb2xsZXIuYWN0aXZlSW5kZXgkLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKS5zdWJzY3JpYmUoKGlkeCkgPT4ge1xuICAgICAgaWYgKGlkeCA+PSAwKSB7XG4gICAgICAgIHRoaXMucmVuZGVyZXIuc2V0QXR0cmlidXRlKFxuICAgICAgICAgIGVsLFxuICAgICAgICAgIFwiYXJpYS1hY3RpdmVkZXNjZW5kYW50XCIsXG4gICAgICAgICAgYCR7dGhpcy5jb250cm9sbGVyLmxpc3Rib3hJZH0tb3B0aW9uLSR7aWR4fWAsXG4gICAgICAgICk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnJlbmRlcmVyLnJlbW92ZUF0dHJpYnV0ZShlbCwgXCJhcmlhLWFjdGl2ZWRlc2NlbmRhbnRcIik7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLmRlc3Ryb3kkLm5leHQoKTtcbiAgICB0aGlzLmRlc3Ryb3kkLmNvbXBsZXRlKCk7XG4gIH1cblxuICAvLyA9PT0gRXZlbnQgaGFuZGxlcnMgKHdpcmVkIHZpYSBob3N0IG1ldGFkYXRhIGFib3ZlKSA9PT1cblxuICAvKipcbiAgICogQXV0by1jYXBpdGFsaXplcyB0aGUgZmlyc3QgY2hhcmFjdGVyIG9uIHRoZSB1c2VyJ3MgZmlyc3Qga2V5c3Ryb2tlIHNvIHRoZVxuICAgKiBzZXJ2ZXIgcmVjZWl2ZXMgXCJDcmVhdGVcIiBpbnN0ZWFkIG9mIFwiY3JlYXRlXCIuIE1hdGNoZXMgUmVhY3Qnc1xuICAgKiBgaGFuZGxlQ2hhbmdlYCBpbiBgdXNlQUlBdXRvY29tcGxldGVgLiBTa2lwcGVkIGR1cmluZyBJTUUgY29tcG9zaXRpb24gc29cbiAgICogd2UgZG9uJ3QgZGlzcnVwdCBtdWx0aS1rZXlzdHJva2UgaW5wdXQgbWV0aG9kcyAoUGlueWluLCBIYW5ndWwsIGV0Yy4pLlxuICAgKi9cbiAgb25JbnB1dChldmVudDogRXZlbnQpOiB2b2lkIHtcbiAgICBjb25zdCB0YXJnZXQgPSBldmVudC50YXJnZXQgYXMgSFRNTElucHV0RWxlbWVudCB8IEhUTUxUZXh0QXJlYUVsZW1lbnQ7XG4gICAgY29uc3QgcmF3ID0gdGFyZ2V0LnZhbHVlO1xuICAgIGNvbnN0IGlzQ29tcG9zaW5nID0gKGV2ZW50IGFzIElucHV0RXZlbnQpLmlzQ29tcG9zaW5nID09PSB0cnVlO1xuICAgIGNvbnN0IHNob3VsZENhcGl0YWxpemUgPSByYXcubGVuZ3RoID4gMCAmJiAhaXNDb21wb3NpbmcgJiYgcmF3WzBdICE9PSByYXdbMF0udG9VcHBlckNhc2UoKTtcblxuICAgIGxldCBuZXh0ID0gcmF3O1xuICAgIGlmIChzaG91bGRDYXBpdGFsaXplKSB7XG4gICAgICBjb25zdCBzdGFydCA9IHRhcmdldC5zZWxlY3Rpb25TdGFydDtcbiAgICAgIGNvbnN0IGVuZCA9IHRhcmdldC5zZWxlY3Rpb25FbmQ7XG4gICAgICBuZXh0ID0gcmF3WzBdLnRvVXBwZXJDYXNlKCkgKyByYXcuc2xpY2UoMSk7XG4gICAgICB0aGlzLnJlbmRlcmVyLnNldFByb3BlcnR5KHRhcmdldCwgXCJ2YWx1ZVwiLCBuZXh0KTtcbiAgICAgIGlmIChzdGFydCAhPSBudWxsICYmIGVuZCAhPSBudWxsKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgdGFyZ2V0LnNldFNlbGVjdGlvblJhbmdlKHN0YXJ0LCBlbmQpO1xuICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAvLyBTZWUgbm90ZSBpbiBuZ09uSW5pdCdzIHRleHQkIHN1YnNjcmliZXIuXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLmNvbnRyb2xsZXIuaGFuZGxlVGV4dENoYW5nZShuZXh0KTtcbiAgICB0aGlzLm9uQ2hhbmdlRm4obmV4dCk7XG4gIH1cblxuICBvbktleURvd24oZXZlbnQ6IEtleWJvYXJkRXZlbnQpOiB2b2lkIHtcbiAgICB0aGlzLmNvbnRyb2xsZXIuaGFuZGxlS2V5RG93bihldmVudCk7XG4gIH1cblxuICBvbkZvY3VzKCk6IHZvaWQge1xuICAgIHRoaXMuY29udHJvbGxlci5zZXRGb2N1c2VkKHRydWUpO1xuICB9XG5cbiAgb25CbHVyKCk6IHZvaWQge1xuICAgIHRoaXMuY29udHJvbGxlci5zZXRGb2N1c2VkKGZhbHNlKTtcbiAgICB0aGlzLm9uVG91Y2hlZEZuKCk7XG4gIH1cblxuICAvLyA9PT0gQ29udHJvbFZhbHVlQWNjZXNzb3IgPT09XG5cbiAgd3JpdGVWYWx1ZSh2YWx1ZTogc3RyaW5nIHwgbnVsbCk6IHZvaWQge1xuICAgIGNvbnN0IG5leHQgPSB2YWx1ZSA/PyBcIlwiO1xuICAgIHRoaXMucmVuZGVyZXIuc2V0UHJvcGVydHkodGhpcy5lbC5uYXRpdmVFbGVtZW50LCBcInZhbHVlXCIsIG5leHQpO1xuICAgIC8vIFRoZSBjb250cm9sbGVyIG1heSBiZSB1bmRlZmluZWQgdHJhbnNpZW50bHkgaWYgQW5ndWxhciBjYWxsc1xuICAgIC8vIHdyaXRlVmFsdWUoKSBiZWZvcmUgbmdPbkluaXQgKHJhcmUgYnV0IHBvc3NpYmxlIGR1cmluZyBkeW5hbWljIGZvcm1cbiAgICAvLyBjb25zdHJ1Y3Rpb24pLiBHdWFyZCBzbyB3ZSBkb24ndCB0aHJvdyBpbiB0aGF0IHdpbmRvdy5cbiAgICBpZiAodGhpcy5jb250cm9sbGVyKSB0aGlzLmNvbnRyb2xsZXIuc2V0VmFsdWUobmV4dCk7XG4gIH1cblxuICByZWdpc3Rlck9uQ2hhbmdlKGZuOiAodmFsdWU6IHN0cmluZykgPT4gdm9pZCk6IHZvaWQge1xuICAgIHRoaXMub25DaGFuZ2VGbiA9IGZuO1xuICB9XG5cbiAgcmVnaXN0ZXJPblRvdWNoZWQoZm46ICgpID0+IHZvaWQpOiB2b2lkIHtcbiAgICB0aGlzLm9uVG91Y2hlZEZuID0gZm47XG4gIH1cblxuICBzZXREaXNhYmxlZFN0YXRlKGRpc2FibGVkOiBib29sZWFuKTogdm9pZCB7XG4gICAgdGhpcy5yZW5kZXJlci5zZXRQcm9wZXJ0eSh0aGlzLmVsLm5hdGl2ZUVsZW1lbnQsIFwiZGlzYWJsZWRcIiwgZGlzYWJsZWQpO1xuICB9XG59XG5cbmZ1bmN0aW9uIG5vb3AoKTogdm9pZCB7XG4gIC8vIERlZmF1bHQgbm8tb3AgY2FsbGJhY2sgZm9yIENWQSDigJQgb3ZlcndyaXR0ZW4gYnkgQW5ndWxhcidzIGZvcm0gYnJpZGdlLlxufVxuIl19
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
export { AIAutocompleteInputDirective } from "./ai-autocomplete-input.directive";
|
|
2
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL2lucHV0L2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSw0QkFBNEIsRUFBRSxNQUFNLG1DQUFtQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IHsgQUlBdXRvY29tcGxldGVJbnB1dERpcmVjdGl2ZSB9IGZyb20gXCIuL2FpLWF1dG9jb21wbGV0ZS1pbnB1dC5kaXJlY3RpdmVcIjtcbiJdfQ==
|