angular-three 0.0.0-replace
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 +7 -0
- package/esm2022/angular-three.mjs +5 -0
- package/esm2022/index.mjs +20 -0
- package/esm2022/lib/canvas.mjs +187 -0
- package/esm2022/lib/directives/args.mjs +35 -0
- package/esm2022/lib/directives/common.mjs +42 -0
- package/esm2022/lib/directives/parent.mjs +35 -0
- package/esm2022/lib/dom/events.mjs +73 -0
- package/esm2022/lib/events.mjs +362 -0
- package/esm2022/lib/instance.mjs +70 -0
- package/esm2022/lib/loader.mjs +64 -0
- package/esm2022/lib/loop.mjs +153 -0
- package/esm2022/lib/portal.mjs +208 -0
- package/esm2022/lib/ref.mjs +46 -0
- package/esm2022/lib/renderer/catalogue.mjs +7 -0
- package/esm2022/lib/renderer/constants.mjs +21 -0
- package/esm2022/lib/renderer/index.mjs +432 -0
- package/esm2022/lib/renderer/store.mjs +423 -0
- package/esm2022/lib/renderer/utils.mjs +201 -0
- package/esm2022/lib/roots.mjs +261 -0
- package/esm2022/lib/routed-scene.mjs +33 -0
- package/esm2022/lib/store.mjs +181 -0
- package/esm2022/lib/three-types.mjs +2 -0
- package/esm2022/lib/types.mjs +2 -0
- package/esm2022/lib/utils/apply-props.mjs +123 -0
- package/esm2022/lib/utils/attach.mjs +32 -0
- package/esm2022/lib/utils/before-render.mjs +12 -0
- package/esm2022/lib/utils/create-api-token.mjs +13 -0
- package/esm2022/lib/utils/inputs.mjs +18 -0
- package/esm2022/lib/utils/is.mjs +52 -0
- package/esm2022/lib/utils/make.mjs +53 -0
- package/esm2022/lib/utils/signal-store.mjs +101 -0
- package/esm2022/lib/utils/update.mjs +34 -0
- package/fesm2022/angular-three.mjs +3167 -0
- package/fesm2022/angular-three.mjs.map +1 -0
- package/index.d.ts +22 -0
- package/lib/canvas.d.ts +1170 -0
- package/lib/directives/args.d.ts +11 -0
- package/lib/directives/common.d.ts +26 -0
- package/lib/directives/parent.d.ts +13 -0
- package/lib/dom/events.d.ts +5 -0
- package/lib/events.d.ts +83 -0
- package/lib/instance.d.ts +46 -0
- package/lib/loader.d.ts +32 -0
- package/lib/loop.d.ts +68 -0
- package/lib/portal.d.ts +58 -0
- package/lib/ref.d.ts +7 -0
- package/lib/renderer/catalogue.d.ts +13 -0
- package/lib/renderer/constants.d.ts +20 -0
- package/lib/renderer/index.d.ts +56 -0
- package/lib/renderer/store.d.ts +64 -0
- package/lib/renderer/utils.d.ts +31 -0
- package/lib/roots.d.ts +12 -0
- package/lib/routed-scene.d.ts +10 -0
- package/lib/store.d.ts +141 -0
- package/lib/three-types.d.ts +302 -0
- package/lib/types.d.ts +12 -0
- package/lib/utils/apply-props.d.ts +3 -0
- package/lib/utils/attach.d.ts +11 -0
- package/lib/utils/before-render.d.ts +6 -0
- package/lib/utils/create-api-token.d.ts +23 -0
- package/lib/utils/inputs.d.ts +5 -0
- package/lib/utils/is.d.ts +23 -0
- package/lib/utils/make.d.ts +19 -0
- package/lib/utils/signal-store.d.ts +30 -0
- package/lib/utils/update.d.ts +4 -0
- package/metadata.json +1 -0
- package/package.json +73 -0
- package/plugin/README.md +11 -0
- package/plugin/generators.json +17 -0
- package/plugin/src/generators/init/compat.d.ts +2 -0
- package/plugin/src/generators/init/compat.js +6 -0
- package/plugin/src/generators/init/compat.js.map +1 -0
- package/plugin/src/generators/init/files/experience/experience.component.html__tmpl__ +4 -0
- package/plugin/src/generators/init/files/experience/experience.component.ts__tmpl__ +18 -0
- package/plugin/src/generators/init/generator.d.ts +3 -0
- package/plugin/src/generators/init/generator.js +143 -0
- package/plugin/src/generators/init/generator.js.map +1 -0
- package/plugin/src/generators/init/schema.json +6 -0
- package/plugin/src/generators/utils.d.ts +2 -0
- package/plugin/src/generators/utils.js +34 -0
- package/plugin/src/generators/utils.js.map +1 -0
- package/plugin/src/generators/version.d.ts +14 -0
- package/plugin/src/generators/version.js +18 -0
- package/plugin/src/generators/version.js.map +1 -0
- package/plugin/src/index.d.ts +0 -0
- package/plugin/src/index.js +1 -0
- package/plugin/src/index.js.map +1 -0
- package/web-types.json +1 -0
|
@@ -0,0 +1,362 @@
|
|
|
1
|
+
import * as THREE from 'three';
|
|
2
|
+
import { getLocalState } from './instance';
|
|
3
|
+
import { makeId } from './utils/make';
|
|
4
|
+
/**
|
|
5
|
+
* Release pointer captures.
|
|
6
|
+
* This is called by releasePointerCapture in the API, and when an object is removed.
|
|
7
|
+
*/
|
|
8
|
+
function releaseInternalPointerCapture(capturedMap, obj, captures, pointerId) {
|
|
9
|
+
const captureData = captures.get(obj);
|
|
10
|
+
if (captureData) {
|
|
11
|
+
captures.delete(obj);
|
|
12
|
+
// If this was the last capturing object for this pointer
|
|
13
|
+
if (captures.size === 0) {
|
|
14
|
+
capturedMap.delete(pointerId);
|
|
15
|
+
captureData.target.releasePointerCapture(pointerId);
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
export function removeInteractivity(store, object) {
|
|
20
|
+
const { internal } = store.snapshot;
|
|
21
|
+
// Removes every trace of an object from the data store
|
|
22
|
+
internal.interaction = internal.interaction.filter((o) => o !== object);
|
|
23
|
+
internal.initialHits = internal.initialHits.filter((o) => o !== object);
|
|
24
|
+
internal.hovered.forEach((value, key) => {
|
|
25
|
+
if (value.eventObject === object || value.object === object) {
|
|
26
|
+
// Clear out intersects, they are outdated by now
|
|
27
|
+
internal.hovered.delete(key);
|
|
28
|
+
}
|
|
29
|
+
});
|
|
30
|
+
internal.capturedMap.forEach((captures, pointerId) => {
|
|
31
|
+
releaseInternalPointerCapture(internal.capturedMap, object, captures, pointerId);
|
|
32
|
+
});
|
|
33
|
+
}
|
|
34
|
+
export function createEvents(store) {
|
|
35
|
+
/** Calculates delta */
|
|
36
|
+
function calculateDistance(event) {
|
|
37
|
+
const internal = store.get('internal');
|
|
38
|
+
const dx = event.offsetX - internal.initialClick[0];
|
|
39
|
+
const dy = event.offsetY - internal.initialClick[1];
|
|
40
|
+
return Math.round(Math.sqrt(dx * dx + dy * dy));
|
|
41
|
+
}
|
|
42
|
+
/** Returns true if an instance has a valid pointer-event registered, this excludes scroll, clicks etc */
|
|
43
|
+
function filterPointerEvents(objects) {
|
|
44
|
+
return objects.filter((obj) => ['move', 'over', 'enter', 'out', 'leave'].some((name) => {
|
|
45
|
+
const eventName = `pointer${name}`;
|
|
46
|
+
return getLocalState(obj)?.handlers?.[eventName];
|
|
47
|
+
}));
|
|
48
|
+
}
|
|
49
|
+
function intersect(event, filter) {
|
|
50
|
+
const state = store.get();
|
|
51
|
+
const duplicates = new Set();
|
|
52
|
+
const intersections = [];
|
|
53
|
+
// Allow callers to eliminate event objects
|
|
54
|
+
const eventsObjects = filter ? filter(state.internal.interaction) : state.internal.interaction;
|
|
55
|
+
// Reset all raycaster cameras to undefined
|
|
56
|
+
for (let i = 0; i < eventsObjects.length; i++) {
|
|
57
|
+
const state = getLocalState(eventsObjects[i])?.store.snapshot;
|
|
58
|
+
if (state) {
|
|
59
|
+
state.raycaster.camera = undefined;
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
if (!state.previousRoot) {
|
|
63
|
+
// Make sure root-level pointer and ray are set up
|
|
64
|
+
state.events.compute?.(event, store, null);
|
|
65
|
+
}
|
|
66
|
+
function handleRaycast(obj) {
|
|
67
|
+
const objLocalState = getLocalState(obj);
|
|
68
|
+
const objStore = objLocalState?.store;
|
|
69
|
+
const objState = objStore?.snapshot;
|
|
70
|
+
// Skip event handling when noEvents is set, or when the raycasters camera is null
|
|
71
|
+
if (!objState || !objState.events.enabled || objState.raycaster.camera === null)
|
|
72
|
+
return [];
|
|
73
|
+
// When the camera is undefined we have to call the event layers update function
|
|
74
|
+
if (objState.raycaster.camera === undefined) {
|
|
75
|
+
objState.events.compute?.(event, objStore, objState.previousRoot);
|
|
76
|
+
// If the camera is still undefined we have to skip this layer entirely
|
|
77
|
+
if (objState.raycaster.camera === undefined)
|
|
78
|
+
objState.raycaster.camera = null;
|
|
79
|
+
}
|
|
80
|
+
// Intersect object by object
|
|
81
|
+
return objState.raycaster.camera ? objState.raycaster.intersectObject(obj, true) : [];
|
|
82
|
+
}
|
|
83
|
+
// Collect events
|
|
84
|
+
let hits = eventsObjects
|
|
85
|
+
// Intersect objects
|
|
86
|
+
.flatMap(handleRaycast)
|
|
87
|
+
// Sort by event priority and distance
|
|
88
|
+
.sort((a, b) => {
|
|
89
|
+
const aState = getLocalState(a.object)?.store?.snapshot;
|
|
90
|
+
const bState = getLocalState(b.object)?.store?.snapshot;
|
|
91
|
+
if (!aState || !bState)
|
|
92
|
+
return a.distance - b.distance;
|
|
93
|
+
return bState.events.priority - aState.events.priority || a.distance - b.distance;
|
|
94
|
+
})
|
|
95
|
+
// Filter out duplicates
|
|
96
|
+
.filter((item) => {
|
|
97
|
+
const id = makeId(item);
|
|
98
|
+
if (duplicates.has(id))
|
|
99
|
+
return false;
|
|
100
|
+
duplicates.add(id);
|
|
101
|
+
return true;
|
|
102
|
+
});
|
|
103
|
+
// https://github.com/mrdoob/three.js/issues/16031
|
|
104
|
+
// Allow custom userland intersect sort order, this likely only makes sense on the root filter
|
|
105
|
+
if (state.events.filter)
|
|
106
|
+
hits = state.events.filter(hits, store);
|
|
107
|
+
// Bubble up the events, find the event source (eventObject)
|
|
108
|
+
for (const hit of hits) {
|
|
109
|
+
let eventObject = hit.object;
|
|
110
|
+
// bubble event up
|
|
111
|
+
while (eventObject) {
|
|
112
|
+
if (getLocalState(eventObject)?.eventCount) {
|
|
113
|
+
intersections.push({ ...hit, eventObject });
|
|
114
|
+
}
|
|
115
|
+
eventObject = eventObject.parent;
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
// If the interaction is captured, make all capturing targets part of the intersect.
|
|
119
|
+
if ('pointerId' in event && state.internal.capturedMap.has(event.pointerId)) {
|
|
120
|
+
for (const captureData of state.internal.capturedMap.get(event.pointerId).values()) {
|
|
121
|
+
if (!duplicates.has(makeId(captureData.intersection)))
|
|
122
|
+
intersections.push(captureData.intersection);
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
return intersections;
|
|
126
|
+
}
|
|
127
|
+
/** Handles intersections by forwarding them to handlers */
|
|
128
|
+
function handleIntersects(intersections, event, delta, callback) {
|
|
129
|
+
const rootState = store.snapshot;
|
|
130
|
+
// If anything has been found, forward it to the event listeners
|
|
131
|
+
if (intersections.length) {
|
|
132
|
+
const localState = { stopped: false };
|
|
133
|
+
for (const hit of intersections) {
|
|
134
|
+
const { raycaster, pointer, camera, internal } = getLocalState(hit.object)?.store?.snapshot || rootState;
|
|
135
|
+
const unprojectedPoint = new THREE.Vector3(pointer.x, pointer.y, 0).unproject(camera);
|
|
136
|
+
const hasPointerCapture = (id) => internal.capturedMap.get(id)?.has(hit.eventObject) ?? false;
|
|
137
|
+
const setPointerCapture = (id) => {
|
|
138
|
+
const captureData = { intersection: hit, target: event.target };
|
|
139
|
+
if (internal.capturedMap.has(id)) {
|
|
140
|
+
// if the pointerId was previously captured, we add the hit to the
|
|
141
|
+
// event capturedMap.
|
|
142
|
+
internal.capturedMap.get(id).set(hit.eventObject, captureData);
|
|
143
|
+
}
|
|
144
|
+
else {
|
|
145
|
+
// if the pointerId was not previously captured, we create a map
|
|
146
|
+
// containing the hitObject, and the hit. hitObject is used for
|
|
147
|
+
// faster access.
|
|
148
|
+
internal.capturedMap.set(id, new Map([[hit.eventObject, captureData]]));
|
|
149
|
+
}
|
|
150
|
+
// Call the original event now
|
|
151
|
+
event.target.setPointerCapture(id);
|
|
152
|
+
};
|
|
153
|
+
const releasePointerCapture = (id) => {
|
|
154
|
+
const captures = internal.capturedMap.get(id);
|
|
155
|
+
if (captures) {
|
|
156
|
+
releaseInternalPointerCapture(internal.capturedMap, hit.eventObject, captures, id);
|
|
157
|
+
}
|
|
158
|
+
};
|
|
159
|
+
// Add native event props
|
|
160
|
+
const extractEventProps = {};
|
|
161
|
+
// This iterates over the event's properties including the inherited ones. Native PointerEvents have most of their props as getters which are inherited, but polyfilled PointerEvents have them all as their own properties (i.e. not inherited). We can't use Object.keys() or Object.entries() as they only return "own" properties; nor Object.getPrototypeOf(event) as that *doesn't* return "own" properties, only inherited ones.
|
|
162
|
+
for (const prop in event) {
|
|
163
|
+
const property = event[prop];
|
|
164
|
+
// Only copy over atomics, leave functions alone as these should be
|
|
165
|
+
// called as event.nativeEvent.fn()
|
|
166
|
+
if (typeof property !== 'function')
|
|
167
|
+
extractEventProps[prop] = property;
|
|
168
|
+
}
|
|
169
|
+
const raycastEvent = {
|
|
170
|
+
...hit,
|
|
171
|
+
...extractEventProps,
|
|
172
|
+
pointer,
|
|
173
|
+
intersections,
|
|
174
|
+
stopped: localState.stopped,
|
|
175
|
+
delta,
|
|
176
|
+
unprojectedPoint,
|
|
177
|
+
ray: raycaster.ray,
|
|
178
|
+
camera,
|
|
179
|
+
// Hijack stopPropagation, which just sets a flag
|
|
180
|
+
stopPropagation() {
|
|
181
|
+
// https://github.com/pmndrs/react-three-fiber/issues/596
|
|
182
|
+
// Events are not allowed to stop propagation if the pointer has been captured
|
|
183
|
+
const capturesForPointer = 'pointerId' in event && internal.capturedMap.get(event.pointerId);
|
|
184
|
+
// We only authorize stopPropagation...
|
|
185
|
+
if (
|
|
186
|
+
// ...if this pointer hasn't been captured
|
|
187
|
+
!capturesForPointer ||
|
|
188
|
+
// ... or if the hit object is capturing the pointer
|
|
189
|
+
capturesForPointer.has(hit.eventObject)) {
|
|
190
|
+
raycastEvent.stopped = localState.stopped = true;
|
|
191
|
+
// Propagation is stopped, remove all other hover records
|
|
192
|
+
// An event handler is only allowed to flush other handlers if it is hovered itself
|
|
193
|
+
if (internal.hovered.size &&
|
|
194
|
+
Array.from(internal.hovered.values()).find((i) => i.eventObject === hit.eventObject)) {
|
|
195
|
+
// Objects cannot flush out higher up objects that have already caught the event
|
|
196
|
+
const higher = intersections.slice(0, intersections.indexOf(hit));
|
|
197
|
+
cancelPointer([...higher, hit]);
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
},
|
|
201
|
+
// there should be a distinction between target and currentTarget
|
|
202
|
+
target: { hasPointerCapture, setPointerCapture, releasePointerCapture },
|
|
203
|
+
currentTarget: { hasPointerCapture, setPointerCapture, releasePointerCapture },
|
|
204
|
+
nativeEvent: event,
|
|
205
|
+
};
|
|
206
|
+
// Call subscribers
|
|
207
|
+
callback(raycastEvent);
|
|
208
|
+
// Event bubbling may be interrupted by stopPropagation
|
|
209
|
+
if (localState.stopped)
|
|
210
|
+
break;
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
return intersections;
|
|
214
|
+
}
|
|
215
|
+
function cancelPointer(intersections) {
|
|
216
|
+
const internal = store.get('internal');
|
|
217
|
+
for (const hoveredObj of internal.hovered.values()) {
|
|
218
|
+
// When no objects were hit or the the hovered object wasn't found underneath the cursor
|
|
219
|
+
// we call onPointerOut and delete the object from the hovered-elements map
|
|
220
|
+
if (!intersections.length ||
|
|
221
|
+
!intersections.find((hit) => hit.object === hoveredObj.object &&
|
|
222
|
+
hit.index === hoveredObj.index &&
|
|
223
|
+
hit.instanceId === hoveredObj.instanceId)) {
|
|
224
|
+
const eventObject = hoveredObj.eventObject;
|
|
225
|
+
const instance = getLocalState(eventObject);
|
|
226
|
+
const handlers = instance?.handlers;
|
|
227
|
+
internal.hovered.delete(makeId(hoveredObj));
|
|
228
|
+
if (instance?.eventCount) {
|
|
229
|
+
// Clear out intersects, they are outdated by now
|
|
230
|
+
const data = { ...hoveredObj, intersections };
|
|
231
|
+
handlers?.pointerout?.(data);
|
|
232
|
+
handlers?.pointerleave?.(data);
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
function pointerMissed(event, objects) {
|
|
238
|
+
for (let i = 0; i < objects.length; i++) {
|
|
239
|
+
const instance = getLocalState(objects[i]);
|
|
240
|
+
instance?.handlers.pointermissed?.(event);
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
function handlePointer(name) {
|
|
244
|
+
// Deal with cancelation
|
|
245
|
+
switch (name) {
|
|
246
|
+
case 'pointerleave':
|
|
247
|
+
case 'pointercancel':
|
|
248
|
+
return () => cancelPointer([]);
|
|
249
|
+
case 'lostpointercapture':
|
|
250
|
+
return (event) => {
|
|
251
|
+
const { internal } = store.snapshot;
|
|
252
|
+
if ('pointerId' in event && internal.capturedMap.has(event.pointerId)) {
|
|
253
|
+
// If the object event interface had lostpointercapture, we'd call it here on every
|
|
254
|
+
// object that's getting removed. We call it on the next frame because lostpointercapture
|
|
255
|
+
// fires before pointerup. Otherwise pointerUp would never be called if the event didn't
|
|
256
|
+
// happen in the object it originated from, leaving components in a in-between state.
|
|
257
|
+
requestAnimationFrame(() => {
|
|
258
|
+
// Only release if pointer-up didn't do it already
|
|
259
|
+
if (internal.capturedMap.has(event.pointerId)) {
|
|
260
|
+
internal.capturedMap.delete(event.pointerId);
|
|
261
|
+
cancelPointer([]);
|
|
262
|
+
}
|
|
263
|
+
});
|
|
264
|
+
}
|
|
265
|
+
};
|
|
266
|
+
}
|
|
267
|
+
// Any other pointer goes here ...
|
|
268
|
+
return function handleEvent(event) {
|
|
269
|
+
const pointerMissed$ = store['pointerMissed$'];
|
|
270
|
+
const internal = store.get('internal');
|
|
271
|
+
// prepareRay(event)
|
|
272
|
+
internal.lastEvent.nativeElement = event;
|
|
273
|
+
// Get fresh intersects
|
|
274
|
+
const isPointerMove = name === 'pointermove';
|
|
275
|
+
const isClickEvent = name === 'click' || name === 'contextmenu' || name === 'dblclick';
|
|
276
|
+
const filter = isPointerMove ? filterPointerEvents : undefined;
|
|
277
|
+
const hits = intersect(event, filter);
|
|
278
|
+
const delta = isClickEvent ? calculateDistance(event) : 0;
|
|
279
|
+
// Save initial coordinates on pointer-down
|
|
280
|
+
if (name === 'pointerdown') {
|
|
281
|
+
internal.initialClick = [event.offsetX, event.offsetY];
|
|
282
|
+
internal.initialHits = hits.map((hit) => hit.eventObject);
|
|
283
|
+
}
|
|
284
|
+
// If a click yields no results, pass it back to the user as a miss
|
|
285
|
+
// Missed events have to come first in order to establish user-land side-effect clean up
|
|
286
|
+
if (isClickEvent && !hits.length) {
|
|
287
|
+
if (delta <= 2) {
|
|
288
|
+
pointerMissed(event, internal.interaction);
|
|
289
|
+
pointerMissed$.next(event);
|
|
290
|
+
}
|
|
291
|
+
}
|
|
292
|
+
// Take care of unhover
|
|
293
|
+
if (isPointerMove)
|
|
294
|
+
cancelPointer(hits);
|
|
295
|
+
function onIntersect(data) {
|
|
296
|
+
const eventObject = data.eventObject;
|
|
297
|
+
const instance = getLocalState(eventObject);
|
|
298
|
+
const handlers = instance?.handlers;
|
|
299
|
+
// Check presence of handlers
|
|
300
|
+
if (!instance?.eventCount)
|
|
301
|
+
return;
|
|
302
|
+
/*
|
|
303
|
+
MAYBE TODO, DELETE IF NOT:
|
|
304
|
+
Check if the object is captured, captured events should not have intersects running in parallel
|
|
305
|
+
But wouldn't it be better to just replace capturedMap with a single entry?
|
|
306
|
+
Also, are we OK with straight up making picking up multiple objects impossible?
|
|
307
|
+
|
|
308
|
+
const pointerId = (data as ThreeEvent<PointerEvent>).pointerId
|
|
309
|
+
if (pointerId !== undefined) {
|
|
310
|
+
const capturedMeshSet = internal.capturedMap.get(pointerId)
|
|
311
|
+
if (capturedMeshSet) {
|
|
312
|
+
const captured = capturedMeshSet.get(eventObject)
|
|
313
|
+
if (captured && captured.localState.stopped) return
|
|
314
|
+
}
|
|
315
|
+
}*/
|
|
316
|
+
if (isPointerMove) {
|
|
317
|
+
// Move event ...
|
|
318
|
+
if (handlers?.pointerover || handlers?.pointerenter || handlers?.pointerout || handlers?.pointerleave) {
|
|
319
|
+
// When enter or out is present take care of hover-state
|
|
320
|
+
const id = makeId(data);
|
|
321
|
+
const hoveredItem = internal.hovered.get(id);
|
|
322
|
+
if (!hoveredItem) {
|
|
323
|
+
// If the object wasn't previously hovered, book it and call its handler
|
|
324
|
+
internal.hovered.set(id, data);
|
|
325
|
+
handlers.pointerover?.(data);
|
|
326
|
+
handlers.pointerenter?.(data);
|
|
327
|
+
}
|
|
328
|
+
else if (hoveredItem.stopped) {
|
|
329
|
+
// If the object was previously hovered and stopped, we shouldn't allow other items to proceed
|
|
330
|
+
data.stopPropagation();
|
|
331
|
+
}
|
|
332
|
+
}
|
|
333
|
+
// Call mouse move
|
|
334
|
+
handlers?.pointermove?.(data);
|
|
335
|
+
}
|
|
336
|
+
else {
|
|
337
|
+
// All other events ...
|
|
338
|
+
const handler = handlers?.[name];
|
|
339
|
+
if (handler) {
|
|
340
|
+
// Forward all events back to their respective handlers with the exception of click events,
|
|
341
|
+
// which must use the initial target
|
|
342
|
+
if (!isClickEvent || internal.initialHits.includes(eventObject)) {
|
|
343
|
+
// Missed events have to come first
|
|
344
|
+
pointerMissed(event, internal.interaction.filter((object) => !internal.initialHits.includes(object)));
|
|
345
|
+
// Now call the handler
|
|
346
|
+
handler(data);
|
|
347
|
+
}
|
|
348
|
+
}
|
|
349
|
+
else {
|
|
350
|
+
// Trigger onPointerMissed on all elements that have pointer over/out handlers, but not click and weren't hit
|
|
351
|
+
if (isClickEvent && internal.initialHits.includes(eventObject)) {
|
|
352
|
+
pointerMissed(event, internal.interaction.filter((object) => !internal.initialHits.includes(object)));
|
|
353
|
+
}
|
|
354
|
+
}
|
|
355
|
+
}
|
|
356
|
+
}
|
|
357
|
+
handleIntersects(hits, event, delta, onIntersect);
|
|
358
|
+
};
|
|
359
|
+
}
|
|
360
|
+
return { handlePointer };
|
|
361
|
+
}
|
|
362
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXZlbnRzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vbGlicy9jb3JlL3NyYy9saWIvZXZlbnRzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sS0FBSyxLQUFLLE1BQU0sT0FBTyxDQUFDO0FBQy9CLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFHM0MsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLGNBQWMsQ0FBQztBQTBGdEM7OztHQUdHO0FBQ0gsU0FBUyw2QkFBNkIsQ0FDckMsV0FBc0UsRUFDdEUsR0FBbUIsRUFDbkIsUUFBc0QsRUFDdEQsU0FBaUI7SUFFakIsTUFBTSxXQUFXLEdBQXdDLFFBQVEsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDM0UsSUFBSSxXQUFXLEVBQUUsQ0FBQztRQUNqQixRQUFRLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ3JCLHlEQUF5RDtRQUN6RCxJQUFJLFFBQVEsQ0FBQyxJQUFJLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDekIsV0FBVyxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQztZQUM5QixXQUFXLENBQUMsTUFBTSxDQUFDLHFCQUFxQixDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ3JELENBQUM7SUFDRixDQUFDO0FBQ0YsQ0FBQztBQUVELE1BQU0sVUFBVSxtQkFBbUIsQ0FBQyxLQUErQixFQUFFLE1BQXNCO0lBQzFGLE1BQU0sRUFBRSxRQUFRLEVBQUUsR0FBRyxLQUFLLENBQUMsUUFBUSxDQUFDO0lBQ3BDLHVEQUF1RDtJQUN2RCxRQUFRLENBQUMsV0FBVyxHQUFHLFFBQVEsQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEtBQUssTUFBTSxDQUFDLENBQUM7SUFDeEUsUUFBUSxDQUFDLFdBQVcsR0FBRyxRQUFRLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FB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RUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLFdBQVcsQ0FBQyxDQUFDO1FBQ25ELENBQUMsQ0FBQztJQUNILENBQUM7SUFFRCxPQUFPLEVBQUUsYUFBYSxFQUFFLENBQUM7QUFDMUIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHsgU3ViamVjdCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0ICogYXMgVEhSRUUgZnJvbSAndGhyZWUnO1xuaW1wb3J0IHsgZ2V0TG9jYWxTdGF0ZSB9IGZyb20gJy4vaW5zdGFuY2UnO1xuaW1wb3J0IHR5cGUgeyBOZ3RTdGF0ZSB9IGZyb20gJy4vc3RvcmUnO1xuaW1wb3J0IHR5cGUgeyBOZ3RBbnlSZWNvcmQsIE5ndFByb3BlcnRpZXMgfSBmcm9tICcuL3R5cGVzJztcbmltcG9ydCB7IG1ha2VJZCB9IGZyb20gJy4vdXRpbHMvbWFrZSc7XG5pbXBvcnQgdHlwZSB7IE5ndFNpZ25hbFN0b3JlIH0gZnJvbSAnLi91dGlscy9zaWduYWwtc3RvcmUnO1xuXG5leHBvcnQgaW50ZXJmYWNlIE5ndEludGVyc2VjdGlvbiBleHRlbmRzIFRIUkVFLkludGVyc2VjdGlvbiB7XG5cdC8qKiBUaGUgZXZlbnQgc291cmNlICh0aGUgb2JqZWN0IHdoaWNoIHJlZ2lzdGVyZWQgdGhlIGhhbmRsZXIpICovXG5cdGV2ZW50T2JqZWN0OiBUSFJFRS5PYmplY3QzRDtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBOZ3RJbnRlcnNlY3Rpb25FdmVudDxUU291cmNlRXZlbnQ+IGV4dGVuZHMgTmd0SW50ZXJzZWN0aW9uIHtcblx0LyoqIFRoZSBldmVudCBzb3VyY2UgKHRoZSBvYmplY3Qgd2hpY2ggcmVnaXN0ZXJlZCB0aGUgaGFuZGxlcikgKi9cblx0ZXZlbnRPYmplY3Q6IFRIUkVFLk9iamVjdDNEO1xuXHQvKiogQW4gYXJyYXkgb2YgaW50ZXJzZWN0aW9ucyAqL1xuXHRpbnRlcnNlY3Rpb25zOiBOZ3RJbnRlcnNlY3Rpb25bXTtcblx0LyoqIHZlYzMuc2V0KHBvaW50ZXIueCwgcG9pbnRlci55LCAwKS51bnByb2plY3QoY2FtZXJhKSAqL1xuXHR1bnByb2plY3RlZFBvaW50OiBUSFJFRS5WZWN0b3IzO1xuXHQvKiogTm9ybWFsaXplZCBldmVudCBjb29yZGluYXRlcyAqL1xuXHRwb2ludGVyOiBUSFJFRS5WZWN0b3IyO1xuXHQvKiogRGVsdGEgYmV0d2VlbiBmaXJzdCBjbGljayBhbmQgdGhpcyBldmVudCAqL1xuXHRkZWx0YTogbnVtYmVyO1xuXHQvKiogVGhlIHJheSB0aGF0IHBpZXJjZWQgaXQgKi9cblx0cmF5OiBUSFJFRS5SYXk7XG5cdC8qKiBUaGUgY2FtZXJhIHRoYXQgd2FzIHVzZWQgYnkgdGhlIHJheWNhc3RlciAqL1xuXHRjYW1lcmE6IE5ndENhbWVyYTtcblx0LyoqIHN0b3BQcm9wYWdhdGlvbiB3aWxsIHN0b3AgdW5kZXJseWluZyBoYW5kbGVycyBmcm9tIGZpcmluZyAqL1xuXHRzdG9wUHJvcGFnYXRpb246ICgpID0+IHZvaWQ7XG5cdC8qKiBUaGUgb3JpZ2luYWwgaG9zdCBldmVudCAqL1xuXHRuYXRpdmVFdmVudDogVFNvdXJjZUV2ZW50O1xuXHQvKiogSWYgdGhlIGV2ZW50IHdhcyBzdG9wcGVkIGJ5IGNhbGxpbmcgc3RvcFByb3BhZ2F0aW9uICovXG5cdHN0b3BwZWQ6IGJvb2xlYW47XG59XG5cbmV4cG9ydCB0eXBlIE5ndENhbWVyYSA9IFRIUkVFLk9ydGhvZ3JhcGhpY0NhbWVyYSB8IFRIUkVFLlBlcnNwZWN0aXZlQ2FtZXJhO1xuZXhwb3J0IHR5cGUgTmd0VGhyZWVFdmVudDxURXZlbnQ+ID0gTmd0SW50ZXJzZWN0aW9uRXZlbnQ8VEV2ZW50PiAmIE5ndFByb3BlcnRpZXM8VEV2ZW50PjtcbmV4cG9ydCB0eXBlIE5ndERvbUV2ZW50ID0gUG9pbnRlckV2ZW50IHwgTW91c2VFdmVudCB8IFdoZWVsRXZlbnQ7XG5cbmV4cG9ydCB0eXBlIE5ndEV2ZW50SGFuZGxlcnMgPSB7XG5cdGNsaWNrPzogKGV2ZW50OiBOZ3RUaHJlZUV2ZW50PE1vdXNlRXZlbnQ+KSA9PiB2b2lkO1xuXHRjb250ZXh0bWVudT86IChldmVudDogTmd0VGhyZWVFdmVudDxNb3VzZUV2ZW50PikgPT4gdm9pZDtcblx0ZGJsY2xpY2s/OiAoZXZlbnQ6IE5ndFRocmVlRXZlbnQ8TW91c2VFdmVudD4pID0+IHZvaWQ7XG5cdHBvaW50ZXJ1cD86IChldmVudDogTmd0VGhyZWVFdmVudDxQb2ludGVyRXZlbnQ+KSA9PiB2b2lkO1xuXHRwb2ludGVyZG93bj86IChldmVudDogTmd0VGhyZWVFdmVudDxQb2ludGVyRXZlbnQ+KSA9PiB2b2lkO1xuXHRwb2ludGVyb3Zlcj86IChldmVudDogTmd0VGhyZWVFdmVudDxQb2ludGVyRXZlbnQ+KSA9PiB2b2lkO1xuXHRwb2ludGVyb3V0PzogKGV2ZW50OiBOZ3RUaHJlZUV2ZW50PFBvaW50ZXJFdmVudD4pID0+IHZvaWQ7XG5cdHBvaW50ZXJlbnRlcj86IChldmVudDogTmd0VGhyZWVFdmVudDxQb2ludGVyRXZlbnQ+KSA9PiB2b2lkO1xuXHRwb2ludGVybGVhdmU/OiAoZXZlbnQ6IE5ndFRocmVlRXZlbnQ8UG9pbnRlckV2ZW50PikgPT4gdm9pZDtcblx0cG9pbnRlcm1vdmU/OiAoZXZlbnQ6IE5ndFRocmVlRXZlbnQ8UG9pbnRlckV2ZW50PikgPT4gdm9pZDtcblx0cG9pbnRlcm1pc3NlZD86IChldmVudDogTW91c2VFdmVudCkgPT4gdm9pZDtcblx0cG9pbnRlcmNhbmNlbD86IChldmVudDogTmd0VGhyZWVFdmVudDxQb2ludGVyRXZlbnQ+KSA9PiB2b2lkO1xuXHR3aGVlbD86IChldmVudDogTmd0VGhyZWVFdmVudDxXaGVlbEV2ZW50PikgPT4gdm9pZDtcbn07XG5cbmV4cG9ydCB0eXBlIE5ndEV2ZW50cyA9IHtcblx0W1RFdmVudCBpbiBrZXlvZiBOZ3RFdmVudEhhbmRsZXJzXS0/OiBFdmVudExpc3RlbmVyO1xufTtcblxuZXhwb3J0IHR5cGUgTmd0RmlsdGVyRnVuY3Rpb24gPSAoaXRlbXM6IFRIUkVFLkludGVyc2VjdGlvbltdLCBzdG9yZTogTmd0U2lnbmFsU3RvcmU8Tmd0U3RhdGU+KSA9PiBUSFJFRS5JbnRlcnNlY3Rpb25bXTtcbmV4cG9ydCB0eXBlIE5ndENvbXB1dGVGdW5jdGlvbiA9IChcblx0ZXZlbnQ6IE5ndERvbUV2ZW50LFxuXHRyb290OiBOZ3RTaWduYWxTdG9yZTxOZ3RTdGF0ZT4sXG5cdHByZXZpb3VzOiBOZ3RTaWduYWxTdG9yZTxOZ3RTdGF0ZT4gfCBudWxsLFxuKSA9PiB2b2lkO1xuXG5leHBvcnQgdHlwZSBOZ3RFdmVudE1hbmFnZXI8VFRhcmdldD4gPSB7XG5cdC8qKiBEZXRlcm1pbmVzIGlmIHRoZSBldmVudCBsYXllciBpcyBhY3RpdmUgKi9cblx0ZW5hYmxlZDogYm9vbGVhbjtcblx0LyoqIEV2ZW50IGxheWVyIHByaW9yaXR5LCBoaWdoZXIgcHJpb3JpdGl6ZWQgbGF5ZXJzIGNvbWUgZmlyc3QgYW5kIG1heSBzdG9wKC1wcm9wYWdhdGUpIGxvd2VyIGxheWVyICAqL1xuXHRwcmlvcml0eTogbnVtYmVyO1xuXHQvKiogVGhlIGNvbXB1dGUgZnVuY3Rpb24gbmVlZHMgdG8gc2V0IHVwIHRoZSByYXljYXN0ZXIgYW5kIGFuIHh5LSBwb2ludGVyICAqL1xuXHRjb21wdXRlPzogTmd0Q29tcHV0ZUZ1bmN0aW9uO1xuXHQvKiogVGhlIGZpbHRlciBjYW4gcmUtb3JkZXIgb3IgcmUtc3RydWN0dXJlIHRoZSBpbnRlcnNlY3Rpb25zICAqL1xuXHRmaWx0ZXI/OiBOZ3RGaWx0ZXJGdW5jdGlvbjtcblx0LyoqIFRoZSB0YXJnZXQgbm9kZSB0aGUgZXZlbnQgbGF5ZXIgaXMgdGllZCB0byAqL1xuXHRjb25uZWN0ZWQ/OiBUVGFyZ2V0O1xuXHQvKiogQWxsIHRoZSBwb2ludGVyIGV2ZW50IGhhbmRsZXJzIHRocm91Z2ggd2hpY2ggdGhlIGhvc3QgZm9yd2FyZHMgbmF0aXZlIGV2ZW50cyAqL1xuXHRoYW5kbGVycz86IE5ndEV2ZW50cztcblx0LyoqIEFsbG93cyByZS1jb25uZWN0aW5nIHRvIGFub3RoZXIgdGFyZ2V0ICovXG5cdGNvbm5lY3Q/OiAodGFyZ2V0OiBUVGFyZ2V0KSA9PiB2b2lkO1xuXHQvKiogUmVtb3ZlcyBhbGwgZXhpc3RpbmcgZXZlbnRzIGhhbmRsZXJzIGZyb20gdGhlIHRhcmdldCAqL1xuXHRkaXNjb25uZWN0PzogKCkgPT4gdm9pZDtcblx0LyoqIFRyaWdnZXJzIGEgb25Qb2ludGVyTW92ZSB3aXRoIHRoZSBsYXN0IGtub3duIGV2ZW50LiBUaGlzIGNhbiBiZSB1c2VmdWwgdG8gZW5hYmxlIHJheWNhc3Rpbmcgd2l0aG91dFxuXHQgKiAgZXhwbGljaXQgdXNlciBpbnRlcmFjdGlvbiwgZm9yIGluc3RhbmNlIHdoZW4gdGhlIGNhbWVyYSBtb3ZlcyBhIGhvdmVyYWJsZSBvYmplY3QgdW5kZXJuZWF0aCB0aGUgY3Vyc29yLlxuXHQgKi9cblx0dXBkYXRlPzogKCkgPT4gdm9pZDtcbn07XG5cbmV4cG9ydCBpbnRlcmZhY2UgTmd0UG9pbnRlckNhcHR1cmVUYXJnZXQge1xuXHRpbnRlcnNlY3Rpb246IE5ndEludGVyc2VjdGlvbjtcblx0dGFyZ2V0OiBFbGVtZW50O1xufVxuXG4vKipcbiAqIFJlbGVhc2UgcG9pbnRlciBjYXB0dXJlcy5cbiAqIFRoaXMgaXMgY2FsbGVkIGJ5IHJlbGVhc2VQb2ludGVyQ2FwdHVyZSBpbiB0aGUgQVBJLCBhbmQgd2hlbiBhbiBvYmplY3QgaXMgcmVtb3ZlZC5cbiAqL1xuZnVuY3Rpb24gcmVsZWFzZUludGVybmFsUG9pbnRlckNhcHR1cmUoXG5cdGNhcHR1cmVkTWFwOiBNYXA8bnVtYmVyLCBNYXA8VEhSRUUuT2JqZWN0M0QsIE5ndFBvaW50ZXJDYXB0dXJlVGFyZ2V0Pj4sXG5cdG9iajogVEhSRUUuT2JqZWN0M0QsXG5cdGNhcHR1cmVzOiBNYXA8VEhSRUUuT2JqZWN0M0QsIE5ndFBvaW50ZXJDYXB0dXJlVGFyZ2V0Pixcblx0cG9pbnRlcklkOiBudW1iZXIsXG4pOiB2b2lkIHtcblx0Y29uc3QgY2FwdHVyZURhdGE6IE5ndFBvaW50ZXJDYXB0dXJlVGFyZ2V0IHwgdW5kZWZpbmVkID0gY2FwdHVyZXMuZ2V0KG9iaik7XG5cdGlmIChjYXB0dXJlRGF0YSkge1xuXHRcdGNhcHR1cmVzLmRlbGV0ZShvYmopO1xuXHRcdC8vIElmIHRoaXMgd2FzIHRoZSBsYXN0IGNhcHR1cmluZyBvYmplY3QgZm9yIHRoaXMgcG9pbnRlclxuXHRcdGlmIChjYXB0dXJlcy5zaXplID09PSAwKSB7XG5cdFx0XHRjYXB0dXJlZE1hcC5kZWxldGUocG9pbnRlcklkKTtcblx0XHRcdGNhcHR1cmVEYXRhLnRhcmdldC5yZWxlYXNlUG9pbnRlckNhcHR1cmUocG9pbnRlcklkKTtcblx0XHR9XG5cdH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlbW92ZUludGVyYWN0aXZpdHkoc3RvcmU6IE5ndFNpZ25hbFN0b3JlPE5ndFN0YXRlPiwgb2JqZWN0OiBUSFJFRS5PYmplY3QzRCkge1xuXHRjb25zdCB7IGludGVybmFsIH0gPSBzdG9yZS5zbmFwc2hvdDtcblx0Ly8gUmVtb3ZlcyBldmVyeSB0cmFjZSBvZiBhbiBvYmplY3QgZnJvbSB0aGUgZGF0YSBzdG9yZVxuXHRpbnRlcm5hbC5pbnRlcmFjdGlvbiA9IGludGVybmFsLmludGVyYWN0aW9uLmZpbHRlcigobykgPT4gbyAhPT0gb2JqZWN0KTtcblx0aW50ZXJuYWwuaW5pdGlhbEhpdHMgPSBpbnRlcm5hbC5pbml0aWFsSGl0cy5maWx0ZXIoKG8pID0+IG8gIT09IG9iamVjdCk7XG5cdGludGVybmFsLmhvdmVyZWQuZm9yRWFjaCgodmFsdWUsIGtleSkgPT4ge1xuXHRcdGlmICh2YWx1ZS5ldmVudE9iamVjdCA9PT0gb2JqZWN0IHx8IHZhbHVlLm9iamVjdCA9PT0gb2JqZWN0KSB7XG5cdFx0XHQvLyBDbGVhciBvdXQgaW50ZXJzZWN0cywgdGhleSBhcmUgb3V0ZGF0ZWQgYnkgbm93XG5cdFx0XHRpbnRlcm5hbC5ob3ZlcmVkLmRlbGV0ZShrZXkpO1xuXHRcdH1cblx0fSk7XG5cdGludGVybmFsLmNhcHR1cmVkTWFwLmZvckVhY2goKGNhcHR1cmVzLCBwb2ludGVySWQpID0+IHtcblx0XHRyZWxlYXNlSW50ZXJuYWxQb2ludGVyQ2FwdHVyZShpbnRlcm5hbC5jYXB0dXJlZE1hcCwgb2JqZWN0LCBjYXB0dXJlcywgcG9pbnRlcklkKTtcblx0fSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVFdmVudHMoc3RvcmU6IE5ndFNpZ25hbFN0b3JlPE5ndFN0YXRlPikge1xuXHQvKiogQ2FsY3VsYXRlcyBkZWx0YSAqL1xuXHRmdW5jdGlvbiBjYWxjdWxhdGVEaXN0YW5jZShldmVudDogTmd0RG9tRXZlbnQpIHtcblx0XHRjb25zdCBpbnRlcm5hbCA9IHN0b3JlLmdldCgnaW50ZXJuYWwnKTtcblx0XHRjb25zdCBkeCA9IGV2ZW50Lm9mZnNldFggLSBpbnRlcm5hbC5pbml0aWFsQ2xpY2tbMF07XG5cdFx0Y29uc3QgZHkgPSBldmVudC5vZmZzZXRZIC0gaW50ZXJuYWwuaW5pdGlhbENsaWNrWzFdO1xuXHRcdHJldHVybiBNYXRoLnJvdW5kKE1hdGguc3FydChkeCAqIGR4ICsgZHkgKiBkeSkpO1xuXHR9XG5cblx0LyoqIFJldHVybnMgdHJ1ZSBpZiBhbiBpbnN0YW5jZSBoYXMgYSB2YWxpZCBwb2ludGVyLWV2ZW50IHJlZ2lzdGVyZWQsIHRoaXMgZXhjbHVkZXMgc2Nyb2xsLCBjbGlja3MgZXRjICovXG5cdGZ1bmN0aW9uIGZpbHRlclBvaW50ZXJFdmVudHMob2JqZWN0czogVEhSRUUuT2JqZWN0M0RbXSkge1xuXHRcdHJldHVybiBvYmplY3RzLmZpbHRlcigob2JqKSA9PlxuXHRcdFx0Wydtb3ZlJywgJ292ZXInLCAnZW50ZXInLCAnb3V0JywgJ2xlYXZlJ10uc29tZSgobmFtZSkgPT4ge1xuXHRcdFx0XHRjb25zdCBldmVudE5hbWUgPSBgcG9pbnRlciR7bmFtZX1gIGFzIGtleW9mIE5ndEV2ZW50SGFuZGxlcnM7XG5cdFx0XHRcdHJldHVybiBnZXRMb2NhbFN0YXRlKG9iaik/LmhhbmRsZXJzPy5bZXZlbnROYW1lXTtcblx0XHRcdH0pLFxuXHRcdCk7XG5cdH1cblxuXHRmdW5jdGlvbiBpbnRlcnNlY3QoZXZlbnQ6IE5ndERvbUV2ZW50LCBmaWx0ZXI/OiAob2JqZWN0czogVEhSRUUuT2JqZWN0M0RbXSkgPT4gVEhSRUUuT2JqZWN0M0RbXSkge1xuXHRcdGNvbnN0IHN0YXRlID0gc3RvcmUuZ2V0KCk7XG5cdFx0Y29uc3QgZHVwbGljYXRlcyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuXHRcdGNvbnN0IGludGVyc2VjdGlvbnM6IE5ndEludGVyc2VjdGlvbltdID0gW107XG5cdFx0Ly8gQWxsb3cgY2FsbGVycyB0byBlbGltaW5hdGUgZXZlbnQgb2JqZWN0c1xuXHRcdGNvbnN0IGV2ZW50c09iamVjdHMgPSBmaWx0ZXIgPyBmaWx0ZXIoc3RhdGUuaW50ZXJuYWwuaW50ZXJhY3Rpb24pIDogc3RhdGUuaW50ZXJuYWwuaW50ZXJhY3Rpb247XG5cdFx0Ly8gUmVzZXQgYWxsIHJheWNhc3RlciBjYW1lcmFzIHRvIHVuZGVmaW5lZFxuXHRcdGZvciAobGV0IGkgPSAwOyBpIDwgZXZlbnRzT2JqZWN0cy5sZW5ndGg7IGkrKykge1xuXHRcdFx0Y29uc3Qgc3RhdGUgPSBnZXRMb2NhbFN0YXRlKGV2ZW50c09iamVjdHNbaV0pPy5zdG9yZS5zbmFwc2hvdDtcblx0XHRcdGlmIChzdGF0ZSkge1xuXHRcdFx0XHRzdGF0ZS5yYXljYXN0ZXIuY2FtZXJhID0gdW5kZWZpbmVkITtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRpZiAoIXN0YXRlLnByZXZpb3VzUm9vdCkge1xuXHRcdFx0Ly8gTWFrZSBzdXJlIHJvb3QtbGV2ZWwgcG9pbnRlciBhbmQgcmF5IGFyZSBzZXQgdXBcblx0XHRcdHN0YXRlLmV2ZW50cy5jb21wdXRlPy4oZXZlbnQsIHN0b3JlLCBudWxsKTtcblx0XHR9XG5cblx0XHRmdW5jdGlvbiBoYW5kbGVSYXljYXN0KG9iajogVEhSRUUuT2JqZWN0M0QpIHtcblx0XHRcdGNvbnN0IG9iakxvY2FsU3RhdGUgPSBnZXRMb2NhbFN0YXRlKG9iaik7XG5cdFx0XHRjb25zdCBvYmpTdG9yZSA9IG9iakxvY2FsU3RhdGU/LnN0b3JlO1xuXHRcdFx0Y29uc3Qgb2JqU3RhdGUgPSBvYmpTdG9yZT8uc25hcHNob3Q7XG5cdFx0XHQvLyBTa2lwIGV2ZW50IGhhbmRsaW5nIHdoZW4gbm9FdmVudHMgaXMgc2V0LCBvciB3aGVuIHRoZSByYXljYXN0ZXJzIGNhbWVyYSBpcyBudWxsXG5cdFx0XHRpZiAoIW9ialN0YXRlIHx8ICFvYmpTdGF0ZS5ldmVudHMuZW5hYmxlZCB8fCBvYmpTdGF0ZS5yYXljYXN0ZXIuY2FtZXJhID09PSBudWxsKSByZXR1cm4gW107XG5cblx0XHRcdC8vIFdoZW4gdGhlIGNhbWVyYSBpcyB1bmRlZmluZWQgd2UgaGF2ZSB0byBjYWxsIHRoZSBldmVudCBsYXllcnMgdXBkYXRlIGZ1bmN0aW9uXG5cdFx0XHRpZiAob2JqU3RhdGUucmF5Y2FzdGVyLmNhbWVyYSA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdG9ialN0YXRlLmV2ZW50cy5jb21wdXRlPy4oZXZlbnQsIG9ialN0b3JlLCBvYmpTdGF0ZS5wcmV2aW91c1Jvb3QpO1xuXHRcdFx0XHQvLyBJZiB0aGUgY2FtZXJhIGlzIHN0aWxsIHVuZGVmaW5lZCB3ZSBoYXZlIHRvIHNraXAgdGhpcyBsYXllciBlbnRpcmVseVxuXHRcdFx0XHRpZiAob2JqU3RhdGUucmF5Y2FzdGVyLmNhbWVyYSA9PT0gdW5kZWZpbmVkKSBvYmpTdGF0ZS5yYXljYXN0ZXIuY2FtZXJhID0gbnVsbCE7XG5cdFx0XHR9XG5cblx0XHRcdC8vIEludGVyc2VjdCBvYmplY3QgYnkgb2JqZWN0XG5cdFx0XHRyZXR1cm4gb2JqU3RhdGUucmF5Y2FzdGVyLmNhbWVyYSA/IG9ialN0YXRlLnJheWNhc3Rlci5pbnRlcnNlY3RPYmplY3Qob2JqLCB0cnVlKSA6IFtdO1xuXHRcdH1cblxuXHRcdC8vIENvbGxlY3QgZXZlbnRzXG5cdFx0bGV0IGhpdHM6IFRIUkVFLkludGVyc2VjdGlvbjxUSFJFRS5PYmplY3QzRD5bXSA9IGV2ZW50c09iamVjdHNcblx0XHRcdC8vIEludGVyc2VjdCBvYmplY3RzXG5cdFx0XHQuZmxhdE1hcChoYW5kbGVSYXljYXN0KVxuXHRcdFx0Ly8gU29ydCBieSBldmVudCBwcmlvcml0eSBhbmQgZGlzdGFuY2Vcblx0XHRcdC5zb3J0KChhLCBiKSA9PiB7XG5cdFx0XHRcdGNvbnN0IGFTdGF0ZSA9IGdldExvY2FsU3RhdGUoYS5vYmplY3QpPy5zdG9yZT8uc25hcHNob3Q7XG5cdFx0XHRcdGNvbnN0IGJTdGF0ZSA9IGdldExvY2FsU3RhdGUoYi5vYmplY3QpPy5zdG9yZT8uc25hcHNob3Q7XG5cdFx0XHRcdGlmICghYVN0YXRlIHx8ICFiU3RhdGUpIHJldHVybiBhLmRpc3RhbmNlIC0gYi5kaXN0YW5jZTtcblx0XHRcdFx0cmV0dXJuIGJTdGF0ZS5ldmVudHMucHJpb3JpdHkgLSBhU3RhdGUuZXZlbnRzLnByaW9yaXR5IHx8IGEuZGlzdGFuY2UgLSBiLmRpc3RhbmNlO1xuXHRcdFx0fSlcblx0XHRcdC8vIEZpbHRlciBvdXQgZHVwbGljYXRlc1xuXHRcdFx0LmZpbHRlcigoaXRlbSkgPT4ge1xuXHRcdFx0XHRjb25zdCBpZCA9IG1ha2VJZChpdGVtIGFzIE5ndEludGVyc2VjdGlvbik7XG5cdFx0XHRcdGlmIChkdXBsaWNhdGVzLmhhcyhpZCkpIHJldHVybiBmYWxzZTtcblx0XHRcdFx0ZHVwbGljYXRlcy5hZGQoaWQpO1xuXHRcdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHRcdH0pO1xuXG5cdFx0Ly8gaHR0cHM6Ly9naXRodWIuY29tL21yZG9vYi90aHJlZS5qcy9pc3N1ZXMvMTYwMzFcblx0XHQvLyBBbGxvdyBjdXN0b20gdXNlcmxhbmQgaW50ZXJzZWN0IHNvcnQgb3JkZXIsIHRoaXMgbGlrZWx5IG9ubHkgbWFrZXMgc2Vuc2Ugb24gdGhlIHJvb3QgZmlsdGVyXG5cdFx0aWYgKHN0YXRlLmV2ZW50cy5maWx0ZXIpIGhpdHMgPSBzdGF0ZS5ldmVudHMuZmlsdGVyKGhpdHMsIHN0b3JlKTtcblxuXHRcdC8vIEJ1YmJsZSB1cCB0aGUgZXZlbnRzLCBmaW5kIHRoZSBldmVudCBzb3VyY2UgKGV2ZW50T2JqZWN0KVxuXHRcdGZvciAoY29uc3QgaGl0IG9mIGhpdHMpIHtcblx0XHRcdGxldCBldmVudE9iamVjdDogVEhSRUUuT2JqZWN0M0QgfCBudWxsID0gaGl0Lm9iamVjdDtcblx0XHRcdC8vIGJ1YmJsZSBldmVudCB1cFxuXHRcdFx0d2hpbGUgKGV2ZW50T2JqZWN0KSB7XG5cdFx0XHRcdGlmIChnZXRMb2NhbFN0YXRlKGV2ZW50T2JqZWN0KT8uZXZlbnRDb3VudCkge1xuXHRcdFx0XHRcdGludGVyc2VjdGlvbnMucHVzaCh7IC4uLmhpdCwgZXZlbnRPYmplY3QgfSk7XG5cdFx0XHRcdH1cblx0XHRcdFx0ZXZlbnRPYmplY3QgPSBldmVudE9iamVjdC5wYXJlbnQ7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Ly8gSWYgdGhlIGludGVyYWN0aW9uIGlzIGNhcHR1cmVkLCBtYWtlIGFsbCBjYXB0dXJpbmcgdGFyZ2V0cyBwYXJ0IG9mIHRoZSBpbnRlcnNlY3QuXG5cdFx0aWYgKCdwb2ludGVySWQnIGluIGV2ZW50ICYmIHN0YXRlLmludGVybmFsLmNhcHR1cmVkTWFwLmhhcyhldmVudC5wb2ludGVySWQpKSB7XG5cdFx0XHRmb3IgKGNvbnN0IGNhcHR1cmVEYXRhIG9mIHN0YXRlLmludGVybmFsLmNhcHR1cmVkTWFwLmdldChldmVudC5wb2ludGVySWQpIS52YWx1ZXMoKSkge1xuXHRcdFx0XHRpZiAoIWR1cGxpY2F0ZXMuaGFzKG1ha2VJZChjYXB0dXJlRGF0YS5pbnRlcnNlY3Rpb24pKSkgaW50ZXJzZWN0aW9ucy5wdXNoKGNhcHR1cmVEYXRhLmludGVyc2VjdGlvbik7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdHJldHVybiBpbnRlcnNlY3Rpb25zO1xuXHR9XG5cblx0LyoqICBIYW5kbGVzIGludGVyc2VjdGlvbnMgYnkgZm9yd2FyZGluZyB0aGVtIHRvIGhhbmRsZXJzICovXG5cdGZ1bmN0aW9uIGhhbmRsZUludGVyc2VjdHMoXG5cdFx0aW50ZXJzZWN0aW9uczogTmd0SW50ZXJzZWN0aW9uW10sXG5cdFx0ZXZlbnQ6IE5ndERvbUV2ZW50LFxuXHRcdGRlbHRhOiBudW1iZXIsXG5cdFx0Y2FsbGJhY2s6IChldmVudDogTmd0VGhyZWVFdmVudDxOZ3REb21FdmVudD4pID0+IHZvaWQsXG5cdCkge1xuXHRcdGNvbnN0IHJvb3RTdGF0ZSA9IHN0b3JlLnNuYXBzaG90O1xuXG5cdFx0Ly8gSWYgYW55dGhpbmcgaGFzIGJlZW4gZm91bmQsIGZvcndhcmQgaXQgdG8gdGhlIGV2ZW50IGxpc3RlbmVyc1xuXHRcdGlmIChpbnRlcnNlY3Rpb25zLmxlbmd0aCkge1xuXHRcdFx0Y29uc3QgbG9jYWxTdGF0ZSA9IHsgc3RvcHBlZDogZmFsc2UgfTtcblx0XHRcdGZvciAoY29uc3QgaGl0IG9mIGludGVyc2VjdGlvbnMpIHtcblx0XHRcdFx0Y29uc3QgeyByYXljYXN0ZXIsIHBvaW50ZXIsIGNhbWVyYSwgaW50ZXJuYWwgfSA9IGdldExvY2FsU3RhdGUoaGl0Lm9iamVjdCk/LnN0b3JlPy5zbmFwc2hvdCB8fCByb290U3RhdGU7XG5cdFx0XHRcdGNvbnN0IHVucHJvamVjdGVkUG9pbnQgPSBuZXcgVEhSRUUuVmVjdG9yMyhwb2ludGVyLngsIHBvaW50ZXIueSwgMCkudW5wcm9qZWN0KGNhbWVyYSk7XG5cdFx0XHRcdGNvbnN0IGhhc1BvaW50ZXJDYXB0dXJlID0gKGlkOiBudW1iZXIpID0+IGludGVybmFsLmNhcHR1cmVkTWFwLmdldChpZCk/LmhhcyhoaXQuZXZlbnRPYmplY3QpID8/IGZhbHNlO1xuXG5cdFx0XHRcdGNvbnN0IHNldFBvaW50ZXJDYXB0dXJlID0gKGlkOiBudW1iZXIpID0+IHtcblx0XHRcdFx0XHRjb25zdCBjYXB0dXJlRGF0YSA9IHsgaW50ZXJzZWN0aW9uOiBoaXQsIHRhcmdldDogZXZlbnQudGFyZ2V0IGFzIEVsZW1lbnQgfTtcblx0XHRcdFx0XHRpZiAoaW50ZXJuYWwuY2FwdHVyZWRNYXAuaGFzKGlkKSkge1xuXHRcdFx0XHRcdFx0Ly8gaWYgdGhlIHBvaW50ZXJJZCB3YXMgcHJldmlvdXNseSBjYXB0dXJlZCwgd2UgYWRkIHRoZSBoaXQgdG8gdGhlXG5cdFx0XHRcdFx0XHQvLyBldmVudCBjYXB0dXJlZE1hcC5cblx0XHRcdFx0XHRcdGludGVybmFsLmNhcHR1cmVkTWFwLmdldChpZCkhLnNldChoaXQuZXZlbnRPYmplY3QsIGNhcHR1cmVEYXRhKTtcblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0Ly8gaWYgdGhlIHBvaW50ZXJJZCB3YXMgbm90IHByZXZpb3VzbHkgY2FwdHVyZWQsIHdlIGNyZWF0ZSBhIG1hcFxuXHRcdFx0XHRcdFx0Ly8gY29udGFpbmluZyB0aGUgaGl0T2JqZWN0LCBhbmQgdGhlIGhpdC4gaGl0T2JqZWN0IGlzIHVzZWQgZm9yXG5cdFx0XHRcdFx0XHQvLyBmYXN0ZXIgYWNjZXNzLlxuXHRcdFx0XHRcdFx0aW50ZXJuYWwuY2FwdHVyZWRNYXAuc2V0KGlkLCBuZXcgTWFwKFtbaGl0LmV2ZW50T2JqZWN0LCBjYXB0dXJlRGF0YV1dKSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdC8vIENhbGwgdGhlIG9yaWdpbmFsIGV2ZW50IG5vd1xuXHRcdFx0XHRcdChldmVudC50YXJnZXQgYXMgRWxlbWVudCkuc2V0UG9pbnRlckNhcHR1cmUoaWQpO1xuXHRcdFx0XHR9O1xuXG5cdFx0XHRcdGNvbnN0IHJlbGVhc2VQb2ludGVyQ2FwdHVyZSA9IChpZDogbnVtYmVyKSA9PiB7XG5cdFx0XHRcdFx0Y29uc3QgY2FwdHVyZXMgPSBpbnRlcm5hbC5jYXB0dXJlZE1hcC5nZXQoaWQpO1xuXHRcdFx0XHRcdGlmIChjYXB0dXJlcykge1xuXHRcdFx0XHRcdFx0cmVsZWFzZUludGVybmFsUG9pbnRlckNhcHR1cmUoaW50ZXJuYWwuY2FwdHVyZWRNYXAsIGhpdC5ldmVudE9iamVjdCwgY2FwdHVyZXMsIGlkKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH07XG5cblx0XHRcdFx0Ly8gQWRkIG5hdGl2ZSBldmVudCBwcm9wc1xuXHRcdFx0XHRjb25zdCBleHRyYWN0RXZlbnRQcm9wczogYW55ID0ge307XG5cdFx0XHRcdC8vIFRoaXMgaXRlcmF0ZXMgb3ZlciB0aGUgZXZlbnQncyBwcm9wZXJ0aWVzIGluY2x1ZGluZyB0aGUgaW5oZXJpdGVkIG9uZXMuIE5hdGl2ZSBQb2ludGVyRXZlbnRzIGhhdmUgbW9zdCBvZiB0aGVpciBwcm9wcyBhcyBnZXR0ZXJzIHdoaWNoIGFyZSBpbmhlcml0ZWQsIGJ1dCBwb2x5ZmlsbGVkIFBvaW50ZXJFdmVudHMgaGF2ZSB0aGVtIGFsbCBhcyB0aGVpciBvd24gcHJvcGVydGllcyAoaS5lLiBub3QgaW5oZXJpdGVkKS4gV2UgY2FuJ3QgdXNlIE9iamVjdC5rZXlzKCkgb3IgT2JqZWN0LmVudHJpZXMoKSBhcyB0aGV5IG9ubHkgcmV0dXJuIFwib3duXCIgcHJvcGVydGllczsgbm9yIE9iamVjdC5nZXRQcm90b3R5cGVPZihldmVudCkgYXMgdGhhdCAqZG9lc24ndCogcmV0dXJuIFwib3duXCIgcHJvcGVydGllcywgb25seSBpbmhlcml0ZWQgb25lcy5cblx0XHRcdFx0Zm9yIChjb25zdCBwcm9wIGluIGV2ZW50KSB7XG5cdFx0XHRcdFx0Y29uc3QgcHJvcGVydHkgPSBldmVudFtwcm9wIGFzIGtleW9mIE5ndERvbUV2ZW50XTtcblx0XHRcdFx0XHQvLyBPbmx5IGNvcHkgb3ZlciBhdG9taWNzLCBsZWF2ZSBmdW5jdGlvbnMgYWxvbmUgYXMgdGhlc2Ugc2hvdWxkIGJlXG5cdFx0XHRcdFx0Ly8gY2FsbGVkIGFzIGV2ZW50Lm5hdGl2ZUV2ZW50LmZuKClcblx0XHRcdFx0XHRpZiAodHlwZW9mIHByb3BlcnR5ICE9PSAnZnVuY3Rpb24nKSBleHRyYWN0RXZlbnRQcm9wc1twcm9wXSA9IHByb3BlcnR5O1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0Y29uc3QgcmF5Y2FzdEV2ZW50OiBOZ3RUaHJlZUV2ZW50PE5ndERvbUV2ZW50PiA9IHtcblx0XHRcdFx0XHQuLi5oaXQsXG5cdFx0XHRcdFx0Li4uZXh0cmFjdEV2ZW50UHJvcHMsXG5cdFx0XHRcdFx0cG9pbnRlcixcblx0XHRcdFx0XHRpbnRlcnNlY3Rpb25zLFxuXHRcdFx0XHRcdHN0b3BwZWQ6IGxvY2FsU3RhdGUuc3RvcHBlZCxcblx0XHRcdFx0XHRkZWx0YSxcblx0XHRcdFx0XHR1bnByb2plY3RlZFBvaW50LFxuXHRcdFx0XHRcdHJheTogcmF5Y2FzdGVyLnJheSxcblx0XHRcdFx0XHRjYW1lcmEsXG5cdFx0XHRcdFx0Ly8gSGlqYWNrIHN0b3BQcm9wYWdhdGlvbiwgd2hpY2gganVzdCBzZXRzIGEgZmxhZ1xuXHRcdFx0XHRcdHN0b3BQcm9wYWdhdGlvbigpIHtcblx0XHRcdFx0XHRcdC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9wbW5kcnMvcmVhY3QtdGhyZWUtZmliZXIvaXNzdWVzLzU5NlxuXHRcdFx0XHRcdFx0Ly8gRXZlbnRzIGFyZSBub3QgYWxsb3dlZCB0byBzdG9wIHByb3BhZ2F0aW9uIGlmIHRoZSBwb2ludGVyIGhhcyBiZWVuIGNhcHR1cmVkXG5cdFx0XHRcdFx0XHRjb25zdCBjYXB0dXJlc0ZvclBvaW50ZXIgPSAncG9pbnRlcklkJyBpbiBldmVudCAmJiBpbnRlcm5hbC5jYXB0dXJlZE1hcC5nZXQoZXZlbnQucG9pbnRlcklkKTtcblxuXHRcdFx0XHRcdFx0Ly8gV2Ugb25seSBhdXRob3JpemUgc3RvcFByb3BhZ2F0aW9uLi4uXG5cdFx0XHRcdFx0XHRpZiAoXG5cdFx0XHRcdFx0XHRcdC8vIC4uLmlmIHRoaXMgcG9pbnRlciBoYXNuJ3QgYmVlbiBjYXB0dXJlZFxuXHRcdFx0XHRcdFx0XHQhY2FwdHVyZXNGb3JQb2ludGVyIHx8XG5cdFx0XHRcdFx0XHRcdC8vIC4uLiBvciBpZiB0aGUgaGl0IG9iamVjdCBpcyBjYXB0dXJpbmcgdGhlIHBvaW50ZXJcblx0XHRcdFx0XHRcdFx0Y2FwdHVyZXNGb3JQb2ludGVyLmhhcyhoaXQuZXZlbnRPYmplY3QpXG5cdFx0XHRcdFx0XHQpIHtcblx0XHRcdFx0XHRcdFx0cmF5Y2FzdEV2ZW50LnN0b3BwZWQgPSBsb2NhbFN0YXRlLnN0b3BwZWQgPSB0cnVlO1xuXHRcdFx0XHRcdFx0XHQvLyBQcm9wYWdhdGlvbiBpcyBzdG9wcGVkLCByZW1vdmUgYWxsIG90aGVyIGhvdmVyIHJlY29yZHNcblx0XHRcdFx0XHRcdFx0Ly8gQW4gZXZlbnQgaGFuZGxlciBpcyBvbmx5IGFsbG93ZWQgdG8gZmx1c2ggb3RoZXIgaGFuZGxlcnMgaWYgaXQgaXMgaG92ZXJlZCBpdHNlbGZcblx0XHRcdFx0XHRcdFx0aWYgKFxuXHRcdFx0XHRcdFx0XHRcdGludGVybmFsLmhvdmVyZWQuc2l6ZSAmJlxuXHRcdFx0XHRcdFx0XHRcdEFycmF5LmZyb20oaW50ZXJuYWwuaG92ZXJlZC52YWx1ZXMoKSkuZmluZCgoaSkgPT4gaS5ldmVudE9iamVjdCA9PT0gaGl0LmV2ZW50T2JqZWN0KVxuXHRcdFx0XHRcdFx0XHQpIHtcblx0XHRcdFx0XHRcdFx0XHQvLyBPYmplY3RzIGNhbm5vdCBmbHVzaCBvdXQgaGlnaGVyIHVwIG9iamVjdHMgdGhhdCBoYXZlIGFscmVhZHkgY2F1Z2h0IHRoZSBldmVudFxuXHRcdFx0XHRcdFx0XHRcdGNvbnN0IGhpZ2hlciA9IGludGVyc2VjdGlvbnMuc2xpY2UoMCwgaW50ZXJzZWN0aW9ucy5pbmRleE9mKGhpdCkpO1xuXHRcdFx0XHRcdFx0XHRcdGNhbmNlbFBvaW50ZXIoWy4uLmhpZ2hlciwgaGl0XSk7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdC8vIHRoZXJlIHNob3VsZCBiZSBhIGRpc3RpbmN0aW9uIGJldHdlZW4gdGFyZ2V0IGFuZCBjdXJyZW50VGFyZ2V0XG5cdFx0XHRcdFx0dGFyZ2V0OiB7IGhhc1BvaW50ZXJDYXB0dXJlLCBzZXRQb2ludGVyQ2FwdHVyZSwgcmVsZWFzZVBvaW50ZXJDYXB0dXJlIH0sXG5cdFx0XHRcdFx0Y3VycmVudFRhcmdldDogeyBoYXNQb2ludGVyQ2FwdHVyZSwgc2V0UG9pbnRlckNhcHR1cmUsIHJlbGVhc2VQb2ludGVyQ2FwdHVyZSB9LFxuXHRcdFx0XHRcdG5hdGl2ZUV2ZW50OiBldmVudCxcblx0XHRcdFx0fTtcblxuXHRcdFx0XHQvLyBDYWxsIHN1YnNjcmliZXJzXG5cdFx0XHRcdGNhbGxiYWNrKHJheWNhc3RFdmVudCk7XG5cdFx0XHRcdC8vIEV2ZW50IGJ1YmJsaW5nIG1heSBiZSBpbnRlcnJ1cHRlZCBieSBzdG9wUHJvcGFnYXRpb25cblx0XHRcdFx0aWYgKGxvY2FsU3RhdGUuc3RvcHBlZCkgYnJlYWs7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdHJldHVybiBpbnRlcnNlY3Rpb25zO1xuXHR9XG5cblx0ZnVuY3Rpb24gY2FuY2VsUG9pbnRlcihpbnRlcnNlY3Rpb25zOiBOZ3RJbnRlcnNlY3Rpb25bXSkge1xuXHRcdGNvbnN0IGludGVybmFsID0gc3RvcmUuZ2V0KCdpbnRlcm5hbCcpO1xuXHRcdGZvciAoY29uc3QgaG92ZXJlZE9iaiBvZiBpbnRlcm5hbC5ob3ZlcmVkLnZhbHVlcygpKSB7XG5cdFx0XHQvLyBXaGVuIG5vIG9iamVjdHMgd2VyZSBoaXQgb3IgdGhlIHRoZSBob3ZlcmVkIG9iamVjdCB3YXNuJ3QgZm91bmQgdW5kZXJuZWF0aCB0aGUgY3Vyc29yXG5cdFx0XHQvLyB3ZSBjYWxsIG9uUG9pbnRlck91dCBhbmQgZGVsZXRlIHRoZSBvYmplY3QgZnJvbSB0aGUgaG92ZXJlZC1lbGVtZW50cyBtYXBcblx0XHRcdGlmIChcblx0XHRcdFx0IWludGVyc2VjdGlvbnMubGVuZ3RoIHx8XG5cdFx0XHRcdCFpbnRlcnNlY3Rpb25zLmZpbmQoXG5cdFx0XHRcdFx0KGhpdCkgPT5cblx0XHRcdFx0XHRcdGhpdC5vYmplY3QgPT09IGhvdmVyZWRPYmoub2JqZWN0ICYmXG5cdFx0XHRcdFx0XHRoaXQuaW5kZXggPT09IGhvdmVyZWRPYmouaW5kZXggJiZcblx0XHRcdFx0XHRcdGhpdC5pbnN0YW5jZUlkID09PSBob3ZlcmVkT2JqLmluc3RhbmNlSWQsXG5cdFx0XHRcdClcblx0XHRcdCkge1xuXHRcdFx0XHRjb25zdCBldmVudE9iamVjdCA9IGhvdmVyZWRPYmouZXZlbnRPYmplY3Q7XG5cdFx0XHRcdGNvbnN0IGluc3RhbmNlID0gZ2V0TG9jYWxTdGF0ZShldmVudE9iamVjdCk7XG5cdFx0XHRcdGNvbnN0IGhhbmRsZXJzID0gaW5zdGFuY2U/LmhhbmRsZXJzO1xuXHRcdFx0XHRpbnRlcm5hbC5ob3ZlcmVkLmRlbGV0ZShtYWtlSWQoaG92ZXJlZE9iaikpO1xuXHRcdFx0XHRpZiAoaW5zdGFuY2U/LmV2ZW50Q291bnQpIHtcblx0XHRcdFx0XHQvLyBDbGVhciBvdXQgaW50ZXJzZWN0cywgdGhleSBhcmUgb3V0ZGF0ZWQgYnkgbm93XG5cdFx0XHRcdFx0Y29uc3QgZGF0YSA9IHsgLi4uaG92ZXJlZE9iaiwgaW50ZXJzZWN0aW9ucyB9O1xuXHRcdFx0XHRcdGhhbmRsZXJzPy5wb2ludGVyb3V0Py4oZGF0YSBhcyBOZ3RUaHJlZUV2ZW50PFBvaW50ZXJFdmVudD4pO1xuXHRcdFx0XHRcdGhhbmRsZXJzPy5wb2ludGVybGVhdmU/LihkYXRhIGFzIE5ndFRocmVlRXZlbnQ8UG9pbnRlckV2ZW50Pik7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHRmdW5jdGlvbiBwb2ludGVyTWlzc2VkKGV2ZW50OiBNb3VzZUV2ZW50LCBvYmplY3RzOiBUSFJFRS5PYmplY3QzRFtdKSB7XG5cdFx0Zm9yIChsZXQgaSA9IDA7IGkgPCBvYmplY3RzLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHRjb25zdCBpbnN0YW5jZSA9IGdldExvY2FsU3RhdGUob2JqZWN0c1tpXSk7XG5cdFx0XHRpbnN0YW5jZT8uaGFuZGxlcnMucG9pbnRlcm1pc3NlZD8uKGV2ZW50KTtcblx0XHR9XG5cdH1cblxuXHRmdW5jdGlvbiBoYW5kbGVQb2ludGVyKG5hbWU6IHN0cmluZykge1xuXHRcdC8vIERlYWwgd2l0aCBjYW5jZWxhdGlvblxuXHRcdHN3aXRjaCAobmFtZSkge1xuXHRcdFx0Y2FzZSAncG9pbnRlcmxlYXZlJzpcblx0XHRcdGNhc2UgJ3BvaW50ZXJjYW5jZWwnOlxuXHRcdFx0XHRyZXR1cm4gKCkgPT4gY2FuY2VsUG9pbnRlcihbXSk7XG5cdFx0XHRjYXNlICdsb3N0cG9pbnRlcmNhcHR1cmUnOlxuXHRcdFx0XHRyZXR1cm4gKGV2ZW50OiBOZ3REb21FdmVudCkgPT4ge1xuXHRcdFx0XHRcdGNvbnN0IHsgaW50ZXJuYWwgfSA9IHN0b3JlLnNuYXBzaG90O1xuXHRcdFx0XHRcdGlmICgncG9pbnRlcklkJyBpbiBldmVudCAmJiBpbnRlcm5hbC5jYXB0dXJlZE1hcC5oYXMoZXZlbnQucG9pbnRlcklkKSkge1xuXHRcdFx0XHRcdFx0Ly8gSWYgdGhlIG9iamVjdCBldmVudCBpbnRlcmZhY2UgaGFkIGxvc3Rwb2ludGVyY2FwdHVyZSwgd2UnZCBjYWxsIGl0IGhlcmUgb24gZXZlcnlcblx0XHRcdFx0XHRcdC8vIG9iamVjdCB0aGF0J3MgZ2V0dGluZyByZW1vdmVkLiBXZSBjYWxsIGl0IG9uIHRoZSBuZXh0IGZyYW1lIGJlY2F1c2UgbG9zdHBvaW50ZXJjYXB0dXJlXG5cdFx0XHRcdFx0XHQvLyBmaXJlcyBiZWZvcmUgcG9pbnRlcnVwLiBPdGhlcndpc2UgcG9pbnRlclVwIHdvdWxkIG5ldmVyIGJlIGNhbGxlZCBpZiB0aGUgZXZlbnQgZGlkbid0XG5cdFx0XHRcdFx0XHQvLyBoYXBwZW4gaW4gdGhlIG9iamVjdCBpdCBvcmlnaW5hdGVkIGZyb20sIGxlYXZpbmcgY29tcG9uZW50cyBpbiBhIGluLWJldHdlZW4gc3RhdGUuXG5cdFx0XHRcdFx0XHRyZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4ge1xuXHRcdFx0XHRcdFx0XHQvLyBPbmx5IHJlbGVhc2UgaWYgcG9pbnRlci11cCBkaWRuJ3QgZG8gaXQgYWxyZWFkeVxuXHRcdFx0XHRcdFx0XHRpZiAoaW50ZXJuYWwuY2FwdHVyZWRNYXAuaGFzKGV2ZW50LnBvaW50ZXJJZCkpIHtcblx0XHRcdFx0XHRcdFx0XHRpbnRlcm5hbC5jYXB0dXJlZE1hcC5kZWxldGUoZXZlbnQucG9pbnRlcklkKTtcblx0XHRcdFx0XHRcdFx0XHRjYW5jZWxQb2ludGVyKFtdKTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9O1xuXHRcdH1cblxuXHRcdC8vIEFueSBvdGhlciBwb2ludGVyIGdvZXMgaGVyZSAuLi5cblx0XHRyZXR1cm4gZnVuY3Rpb24gaGFuZGxlRXZlbnQoZXZlbnQ6IE5ndERvbUV2ZW50KSB7XG5cdFx0XHRjb25zdCBwb2ludGVyTWlzc2VkJDogU3ViamVjdDxNb3VzZUV2ZW50PiA9IChzdG9yZSBhcyBOZ3RBbnlSZWNvcmQpWydwb2ludGVyTWlzc2VkJCddO1xuXHRcdFx0Y29uc3QgaW50ZXJuYWwgPSBzdG9yZS5nZXQoJ2ludGVybmFsJyk7XG5cblx0XHRcdC8vIHByZXBhcmVSYXkoZXZlbnQpXG5cdFx0XHRpbnRlcm5hbC5sYXN0RXZlbnQubmF0aXZlRWxlbWVudCA9IGV2ZW50O1xuXG5cdFx0XHQvLyBHZXQgZnJlc2ggaW50ZXJzZWN0c1xuXHRcdFx0Y29uc3QgaXNQb2ludGVyTW92ZSA9IG5hbWUgPT09ICdwb2ludGVybW92ZSc7XG5cdFx0XHRjb25zdCBpc0NsaWNrRXZlbnQgPSBuYW1lID09PSAnY2xpY2snIHx8IG5hbWUgPT09ICdjb250ZXh0bWVudScgfHwgbmFtZSA9PT0gJ2RibGNsaWNrJztcblx0XHRcdGNvbnN0IGZpbHRlciA9IGlzUG9pbnRlck1vdmUgPyBmaWx0ZXJQb2ludGVyRXZlbnRzIDogdW5kZWZpbmVkO1xuXG5cdFx0XHRjb25zdCBoaXRzID0gaW50ZXJzZWN0KGV2ZW50LCBmaWx0ZXIpO1xuXHRcdFx0Y29uc3QgZGVsdGEgPSBpc0NsaWNrRXZlbnQgPyBjYWxjdWxhdGVEaXN0YW5jZShldmVudCkgOiAwO1xuXG5cdFx0XHQvLyBTYXZlIGluaXRpYWwgY29vcmRpbmF0ZXMgb24gcG9pbnRlci1kb3duXG5cdFx0XHRpZiAobmFtZSA9PT0gJ3BvaW50ZXJkb3duJykge1xuXHRcdFx0XHRpbnRlcm5hbC5pbml0aWFsQ2xpY2sgPSBbZXZlbnQub2Zmc2V0WCwgZXZlbnQub2Zmc2V0WV07XG5cdFx0XHRcdGludGVybmFsLmluaXRpYWxIaXRzID0gaGl0cy5tYXAoKGhpdCkgPT4gaGl0LmV2ZW50T2JqZWN0KTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gSWYgYSBjbGljayB5aWVsZHMgbm8gcmVzdWx0cywgcGFzcyBpdCBiYWNrIHRvIHRoZSB1c2VyIGFzIGEgbWlzc1xuXHRcdFx0Ly8gTWlzc2VkIGV2ZW50cyBoYXZlIHRvIGNvbWUgZmlyc3QgaW4gb3JkZXIgdG8gZXN0YWJsaXNoIHVzZXItbGFuZCBzaWRlLWVmZmVjdCBjbGVhbiB1cFxuXHRcdFx0aWYgKGlzQ2xpY2tFdmVudCAmJiAhaGl0cy5sZW5ndGgpIHtcblx0XHRcdFx0aWYgKGRlbHRhIDw9IDIpIHtcblx0XHRcdFx0XHRwb2ludGVyTWlzc2VkKGV2ZW50LCBpbnRlcm5hbC5pbnRlcmFjdGlvbik7XG5cdFx0XHRcdFx0cG9pbnRlck1pc3NlZCQubmV4dChldmVudCk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0Ly8gVGFrZSBjYXJlIG9mIHVuaG92ZXJcblx0XHRcdGlmIChpc1BvaW50ZXJNb3ZlKSBjYW5jZWxQb2ludGVyKGhpdHMpO1xuXG5cdFx0XHRmdW5jdGlvbiBvbkludGVyc2VjdChkYXRhOiBOZ3RUaHJlZUV2ZW50PE5ndERvbUV2ZW50Pikge1xuXHRcdFx0XHRjb25zdCBldmVudE9iamVjdCA9IGRhdGEuZXZlbnRPYmplY3Q7XG5cdFx0XHRcdGNvbnN0IGluc3RhbmNlID0gZ2V0TG9jYWxTdGF0ZShldmVudE9iamVjdCk7XG5cdFx0XHRcdGNvbnN0IGhhbmRsZXJzID0gaW5zdGFuY2U/LmhhbmRsZXJzO1xuXG5cdFx0XHRcdC8vIENoZWNrIHByZXNlbmNlIG9mIGhhbmRsZXJzXG5cdFx0XHRcdGlmICghaW5zdGFuY2U/LmV2ZW50Q291bnQpIHJldHVybjtcblxuXHRcdFx0XHQvKlxuICAgICAgICBNQVlCRSBUT0RPLCBERUxFVEUgSUYgTk9UOlxuICAgICAgICAgIENoZWNrIGlmIHRoZSBvYmplY3QgaXMgY2FwdHVyZWQsIGNhcHR1cmVkIGV2ZW50cyBzaG91bGQgbm90IGhhdmUgaW50ZXJzZWN0cyBydW5uaW5nIGluIHBhcmFsbGVsXG4gICAgICAgICAgQnV0IHdvdWxkbid0IGl0IGJlIGJldHRlciB0byBqdXN0IHJlcGxhY2UgY2FwdHVyZWRNYXAgd2l0aCBhIHNpbmdsZSBlbnRyeT9cbiAgICAgICAgICBBbHNvLCBhcmUgd2UgT0sgd2l0aCBzdHJhaWdodCB1cCBtYWtpbmcgcGlja2luZyB1cCBtdWx0aXBsZSBvYmplY3RzIGltcG9zc2libGU/XG5cbiAgICAgICAgY29uc3QgcG9pbnRlcklkID0gKGRhdGEgYXMgVGhyZWVFdmVudDxQb2ludGVyRXZlbnQ+KS5wb2ludGVySWRcbiAgICAgICAgaWYgKHBvaW50ZXJJZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgY29uc3QgY2FwdHVyZWRNZXNoU2V0ID0gaW50ZXJuYWwuY2FwdHVyZWRNYXAuZ2V0KHBvaW50ZXJJZClcbiAgICAgICAgICBpZiAoY2FwdHVyZWRNZXNoU2V0KSB7XG4gICAgICAgICAgICBjb25zdCBjYXB0dXJlZCA9IGNhcHR1cmVkTWVzaFNldC5nZXQoZXZlbnRPYmplY3QpXG4gICAgICAgICAgICBpZiAoY2FwdHVyZWQgJiYgY2FwdHVyZWQubG9jYWxTdGF0ZS5zdG9wcGVkKSByZXR1cm5cbiAgICAgICAgICB9XG4gICAgICAgIH0qL1xuXG5cdFx0XHRcdGlmIChpc1BvaW50ZXJNb3ZlKSB7XG5cdFx0XHRcdFx0Ly8gTW92ZSBldmVudCAuLi5cblx0XHRcdFx0XHRpZiAoaGFuZGxlcnM/LnBvaW50ZXJvdmVyIHx8IGhhbmRsZXJzPy5wb2ludGVyZW50ZXIgfHwgaGFuZGxlcnM/LnBvaW50ZXJvdXQgfHwgaGFuZGxlcnM/LnBvaW50ZXJsZWF2ZSkge1xuXHRcdFx0XHRcdFx0Ly8gV2hlbiBlbnRlciBvciBvdXQgaXMgcHJlc2VudCB0YWtlIGNhcmUgb2YgaG92ZXItc3RhdGVcblx0XHRcdFx0XHRcdGNvbnN0IGlkID0gbWFrZUlkKGRhdGEpO1xuXHRcdFx0XHRcdFx0Y29uc3QgaG92ZXJlZEl0ZW0gPSBpbnRlcm5hbC5ob3ZlcmVkLmdldChpZCk7XG5cdFx0XHRcdFx0XHRpZiAoIWhvdmVyZWRJdGVtKSB7XG5cdFx0XHRcdFx0XHRcdC8vIElmIHRoZSBvYmplY3Qgd2Fzbid0IHByZXZpb3VzbHkgaG92ZXJlZCwgYm9vayBpdCBhbmQgY2FsbCBpdHMgaGFuZGxlclxuXHRcdFx0XHRcdFx0XHRpbnRlcm5hbC5ob3ZlcmVkLnNldChpZCwgZGF0YSk7XG5cdFx0XHRcdFx0XHRcdGhhbmRsZXJzLnBvaW50ZXJvdmVyPy4oZGF0YSBhcyBOZ3RUaHJlZUV2ZW50PFBvaW50ZXJFdmVudD4pO1xuXHRcdFx0XHRcdFx0XHRoYW5kbGVycy5wb2ludGVyZW50ZXI/LihkYXRhIGFzIE5ndFRocmVlRXZlbnQ8UG9pbnRlckV2ZW50Pik7XG5cdFx0XHRcdFx0XHR9IGVsc2UgaWYgKGhvdmVyZWRJdGVtLnN0b3BwZWQpIHtcblx0XHRcdFx0XHRcdFx0Ly8gSWYgdGhlIG9iamVjdCB3YXMgcHJldmlvdXNseSBob3ZlcmVkIGFuZCBzdG9wcGVkLCB3ZSBzaG91bGRuJ3QgYWxsb3cgb3RoZXIgaXRlbXMgdG8gcHJvY2VlZFxuXHRcdFx0XHRcdFx0XHRkYXRhLnN0b3BQcm9wYWdhdGlvbigpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHQvLyBDYWxsIG1vdXNlIG1vdmVcblx0XHRcdFx0XHRoYW5kbGVycz8ucG9pbnRlcm1vdmU/LihkYXRhIGFzIE5ndFRocmVlRXZlbnQ8UG9pbnRlckV2ZW50Pik7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0Ly8gQWxsIG90aGVyIGV2ZW50cyAuLi5cblx0XHRcdFx0XHRjb25zdCBoYW5kbGVyID0gaGFuZGxlcnM/LltuYW1lIGFzIGtleW9mIE5ndEV2ZW50SGFuZGxlcnNdIGFzIChldmVudDogTmd0VGhyZWVFdmVudDxQb2ludGVyRXZlbnQ+KSA9PiB2b2lkO1xuXHRcdFx0XHRcdGlmIChoYW5kbGVyKSB7XG5cdFx0XHRcdFx0XHQvLyBGb3J3YXJkIGFsbCBldmVudHMgYmFjayB0byB0aGVpciByZXNwZWN0aXZlIGhhbmRsZXJzIHdpdGggdGhlIGV4Y2VwdGlvbiBvZiBjbGljayBldmVudHMsXG5cdFx0XHRcdFx0XHQvLyB3aGljaCBtdXN0IHVzZSB0aGUgaW5pdGlhbCB0YXJnZXRcblx0XHRcdFx0XHRcdGlmICghaXNDbGlja0V2ZW50IHx8IGludGVybmFsLmluaXRpYWxIaXRzLmluY2x1ZGVzKGV2ZW50T2JqZWN0KSkge1xuXHRcdFx0XHRcdFx0XHQvLyBNaXNzZWQgZXZlbnRzIGhhdmUgdG8gY29tZSBmaXJzdFxuXHRcdFx0XHRcdFx0XHRwb2ludGVyTWlzc2VkKFxuXHRcdFx0XHRcdFx0XHRcdGV2ZW50LFxuXHRcdFx0XHRcdFx0XHRcdGludGVybmFsLmludGVyYWN0aW9uLmZpbHRlcigob2JqZWN0KSA9PiAhaW50ZXJuYWwuaW5pdGlhbEhpdHMuaW5jbHVkZXMob2JqZWN0KSksXG5cdFx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHRcdC8vIE5vdyBjYWxsIHRoZSBoYW5kbGVyXG5cdFx0XHRcdFx0XHRcdGhhbmRsZXIoZGF0YSBhcyBOZ3RUaHJlZUV2ZW50PFBvaW50ZXJFdmVudD4pO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHQvLyBUcmlnZ2VyIG9uUG9pbnRlck1pc3NlZCBvbiBhbGwgZWxlbWVudHMgdGhhdCBoYXZlIHBvaW50ZXIgb3Zlci9vdXQgaGFuZGxlcnMsIGJ1dCBub3QgY2xpY2sgYW5kIHdlcmVuJ3QgaGl0XG5cdFx0XHRcdFx0XHRpZiAoaXNDbGlja0V2ZW50ICYmIGludGVybmFsLmluaXRpYWxIaXRzLmluY2x1ZGVzKGV2ZW50T2JqZWN0KSkge1xuXHRcdFx0XHRcdFx0XHRwb2ludGVyTWlzc2VkKFxuXHRcdFx0XHRcdFx0XHRcdGV2ZW50LFxuXHRcdFx0XHRcdFx0XHRcdGludGVybmFsLmludGVyYWN0aW9uLmZpbHRlcigob2JqZWN0KSA9PiAhaW50ZXJuYWwuaW5pdGlhbEhpdHMuaW5jbHVkZXMob2JqZWN0KSksXG5cdFx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdGhhbmRsZUludGVyc2VjdHMoaGl0cywgZXZlbnQsIGRlbHRhLCBvbkludGVyc2VjdCk7XG5cdFx0fTtcblx0fVxuXG5cdHJldHVybiB7IGhhbmRsZVBvaW50ZXIgfTtcbn1cbiJdfQ==
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import { signalStore } from './utils/signal-store';
|
|
2
|
+
import { checkUpdate } from './utils/update';
|
|
3
|
+
export function getLocalState(obj) {
|
|
4
|
+
if (!obj)
|
|
5
|
+
return undefined;
|
|
6
|
+
return obj['__ngt__'];
|
|
7
|
+
}
|
|
8
|
+
export function invalidateInstance(instance) {
|
|
9
|
+
const state = getLocalState(instance)?.store.snapshot;
|
|
10
|
+
if (state && state.internal.frames === 0)
|
|
11
|
+
state.invalidate();
|
|
12
|
+
checkUpdate(instance);
|
|
13
|
+
}
|
|
14
|
+
export function prepare(object, localState) {
|
|
15
|
+
const instance = object;
|
|
16
|
+
if (localState?.primitive || !instance.__ngt__) {
|
|
17
|
+
const { instanceStore = signalStore({
|
|
18
|
+
nativeProps: {},
|
|
19
|
+
parent: null,
|
|
20
|
+
objects: [],
|
|
21
|
+
nonObjects: [],
|
|
22
|
+
}), ...rest } = localState || {};
|
|
23
|
+
instance.__ngt__ = {
|
|
24
|
+
previousAttach: null,
|
|
25
|
+
store: null,
|
|
26
|
+
memoized: {},
|
|
27
|
+
eventCount: 0,
|
|
28
|
+
handlers: {},
|
|
29
|
+
instanceStore,
|
|
30
|
+
parent: instanceStore.select('parent'),
|
|
31
|
+
objects: instanceStore.select('objects'),
|
|
32
|
+
nonObjects: instanceStore.select('nonObjects'),
|
|
33
|
+
nativeProps: instanceStore.select('nativeProps'),
|
|
34
|
+
add(object, type) {
|
|
35
|
+
const current = instance.__ngt__.instanceStore.get(type);
|
|
36
|
+
const foundIndex = current.indexOf((node) => object === node);
|
|
37
|
+
if (foundIndex > -1) {
|
|
38
|
+
current.splice(foundIndex, 1, object);
|
|
39
|
+
instance.__ngt__.instanceStore.update({ [type]: current });
|
|
40
|
+
}
|
|
41
|
+
else {
|
|
42
|
+
instance.__ngt__.instanceStore.update((prev) => ({ [type]: [...prev[type], object] }));
|
|
43
|
+
}
|
|
44
|
+
notifyAncestors(instance.__ngt__.instanceStore.get('parent'));
|
|
45
|
+
},
|
|
46
|
+
remove(object, type) {
|
|
47
|
+
instance.__ngt__.instanceStore.update((prev) => ({ [type]: prev[type].filter((node) => node !== object) }));
|
|
48
|
+
notifyAncestors(instance.__ngt__.instanceStore.get('parent'));
|
|
49
|
+
},
|
|
50
|
+
setNativeProps(key, value) {
|
|
51
|
+
instance.__ngt__.instanceStore.update((prev) => ({ nativeProps: { ...prev.nativeProps, [key]: value } }));
|
|
52
|
+
},
|
|
53
|
+
setParent(parent) {
|
|
54
|
+
instance.__ngt__.instanceStore.update({ parent });
|
|
55
|
+
},
|
|
56
|
+
...rest,
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
return instance;
|
|
60
|
+
}
|
|
61
|
+
function notifyAncestors(instance) {
|
|
62
|
+
if (!instance)
|
|
63
|
+
return;
|
|
64
|
+
const localState = getLocalState(instance);
|
|
65
|
+
if (!localState)
|
|
66
|
+
return;
|
|
67
|
+
localState.instanceStore.update((prev) => ({ objects: prev.objects, nonObjects: prev.nonObjects }));
|
|
68
|
+
notifyAncestors(localState.instanceStore.get('parent'));
|
|
69
|
+
}
|
|
70
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5zdGFuY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9saWJzL2NvcmUvc3JjL2xpYi9pbnN0YW5jZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFLQSxPQUFPLEVBQUUsV0FBVyxFQUF1QixNQUFNLHNCQUFzQixDQUFDO0FBQ3hFLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQTJEN0MsTUFBTSxVQUFVLGFBQWEsQ0FBMkIsR0FBMEI7SUFDakYsSUFBSSxDQUFDLEdBQUc7UUFBRSxPQUFPLFNBQVMsQ0FBQztJQUMzQixPQUFRLEdBQW9CLENBQUMsU0FBUyxDQUFDLENBQUM7QUFDekMsQ0FBQztBQUVELE1BQU0sVUFBVSxrQkFBa0IsQ0FBMkIsUUFBbUI7SUFDL0UsTUFBTSxLQUFLLEdBQUcsYUFBYSxDQUFDLFFBQVEsQ0FBQyxFQUFFLEtBQUssQ0FBQyxRQUFRLENBQUM7SUFDdEQsSUFBSSxLQUFLLElBQUksS0FBSyxDQUFDLFFBQVEsQ0FBQyxNQUFNLEtBQUssQ0FBQztRQUFFLEtBQUssQ0FBQyxVQUFVLEVBQUUsQ0FBQztJQUM3RCxXQUFXLENBQUMsUUFBUSxDQUFDLENBQUM7QUFDdkIsQ0FBQztBQUVELE1BQU0sVUFBVSxPQUFPLENBQ3RCLE1BQWlCLEVBQ2pCLFVBQW1DO0lBRW5DLE1BQU0sUUFBUSxHQUFHLE1BQStDLENBQUM7SUFFakUsSUFBSSxVQUFVLEVBQUUsU0FBUyxJQUFJLENBQUMsUUFBUSxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQ2hELE1BQU0sRUFDTCxhQUFhLEdBQUcsV0FBVyxDQUF3QjtZQUNsRCxXQUFXLEVBQUUsRUFBRTtZQUNmLE1BQU0sRUFBRSxJQUFJO1lBQ1osT0FBTyxFQUFFLEVBQUU7WUFDWCxVQUFVLEVBQUUsRUFBRTtTQUNkLENBQUMsRUFDRixHQUFHLElBQUksRUFDUCxHQUFHLFVBQVUsSUFBSSxFQUFFLENBQUM7UUFFckIsUUFBUSxDQUFDLE9BQU8s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Q0FBQyxVQUFVO1FBQUUsT0FBTztJQUN4QixVQUFVLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLE9BQU8sRUFBRSxJQUFJLENBQUMsT0FBTyxFQUFFLFVBQVUsRUFBRSxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ3BHLGVBQWUsQ0FBQyxVQUFVLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDO0FBQ3pELENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IFNpZ25hbCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHR5cGUgeyBSZXBsYXlTdWJqZWN0IH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgdHlwZSB7IE5ndEV2ZW50SGFuZGxlcnMgfSBmcm9tICcuL2V2ZW50cyc7XG5pbXBvcnQgdHlwZSB7IE5ndFN0YXRlIH0gZnJvbSAnLi9zdG9yZSc7XG5pbXBvcnQgdHlwZSB7IE5ndEFueVJlY29yZCB9IGZyb20gJy4vdHlwZXMnO1xuaW1wb3J0IHsgc2lnbmFsU3RvcmUsIHR5cGUgTmd0U2lnbmFsU3RvcmUgfSBmcm9tICcuL3V0aWxzL3NpZ25hbC1zdG9yZSc7XG5pbXBvcnQgeyBjaGVja1VwZGF0ZSB9IGZyb20gJy4vdXRpbHMvdXBkYXRlJztcblxuZXhwb3J0IHR5cGUgTmd0QXR0YWNoRnVuY3Rpb248VENoaWxkID0gYW55LCBUUGFyZW50ID0gYW55PiA9IChcblx0cGFyZW50OiBUUGFyZW50LFxuXHRjaGlsZDogVENoaWxkLFxuXHRzdG9yZTogTmd0U2lnbmFsU3RvcmU8Tmd0U3RhdGU+LFxuKSA9PiB2b2lkIHwgKCgpID0+IHZvaWQpO1xuXG5leHBvcnQgdHlwZSBOZ3RBZnRlckF0dGFjaDxcblx0VENoaWxkIGV4dGVuZHMgTmd0SW5zdGFuY2VOb2RlID0gTmd0SW5zdGFuY2VOb2RlLFxuXHRUUGFyZW50IGV4dGVuZHMgTmd0SW5zdGFuY2VOb2RlID0gTmd0SW5zdGFuY2VOb2RlLFxuPiA9IHsgcGFyZW50OiBUUGFyZW50OyBub2RlOiBUQ2hpbGQgfTtcblxuZXhwb3J0IHR5cGUgTmd0TG9jYWxJbnN0YW5jZVN0YXRlID0ge1xuXHRvYmplY3RzOiBOZ3RJbnN0YW5jZU5vZGVbXTtcblx0bm9uT2JqZWN0czogTmd0SW5zdGFuY2VOb2RlW107XG5cdHBhcmVudDogTmd0SW5zdGFuY2VOb2RlIHwgbnVsbDtcblx0bmF0aXZlUHJvcHM6IE5ndEFueVJlY29yZDtcbn07XG5cbmV4cG9ydCB0eXBlIE5ndExvY2FsU3RhdGUgPSB7XG5cdC8qKiB0aGUgc3RvcmUgb2YgdGhlIGNhbnZhcyB0aGF0IHRoZSBpbnN0YW5jZSBpcyBiZWluZyByZW5kZXJlZCB0byAqL1xuXHRzdG9yZTogTmd0U2lnbmFsU3RvcmU8Tmd0U3RhdGU+O1xuXHQvLyBvYmplY3RzIHJlbGF0ZWQgdG8gdGhpcyBpbnN0YW5jZVxuXHRpbnN0YW5jZVN0b3JlOiBOZ3RTaWduYWxTdG9yZTxOZ3RMb2NhbEluc3RhbmNlU3RhdGU+O1xuXHQvLyBzaG9ydGN1dCB0byBzaWduYWxzXG5cdHBhcmVudDogU2lnbmFsPE5ndExvY2FsSW5zdGFuY2VTdGF0ZVsncGFyZW50J10+O1xuXHRvYmplY3RzOiBTaWduYWw8Tmd0TG9jYWxJbnN0YW5jZVN0YXRlWydvYmplY3RzJ10+O1xuXHRub25PYmplY3RzOiBTaWduYWw8Tmd0TG9jYWxJbnN0YW5jZVN0YXRlWydub25PYmplY3RzJ10+O1xuXHRuYXRpdmVQcm9wczogU2lnbmFsPE5ndExvY2FsSW5zdGFuY2VTdGF0ZVsnbmF0aXZlUHJvcHMnXT47XG5cdC8vIHNob3J0Y3V0IHRvIGFkZC9yZW1vdmUgb2JqZWN0IHRvIGxpc3Rcblx0YWRkOiAoaW5zdGFuY2U6IE5ndEluc3RhbmNlTm9kZSwgdHlwZTogJ29iamVjdHMnIHwgJ25vbk9iamVjdHMnKSA9PiB2b2lkO1xuXHRyZW1vdmU6IChpbnN0YW5jZTogTmd0SW5zdGFuY2VOb2RlLCB0eXBlOiAnb2JqZWN0cycgfCAnbm9uT2JqZWN0cycpID0+IHZvaWQ7XG5cdHNldE5hdGl2ZVByb3BzOiAoa2V5OiBzdHJpbmcsIHZhbHVlOiBhbnkpID0+IHZvaWQ7XG5cdHNldFBhcmVudDogKHBhcmVudDogTmd0SW5zdGFuY2VOb2RlIHwgbnVsbCkgPT4gdm9pZDtcblx0Ly8gaWYgdGhpcyBUSFJFRSBpbnN0YW5jZSBpcyBhIG5ndC1wcmltaXRpdmVcblx0cHJpbWl0aXZlPzogYm9vbGVhbjtcblx0Ly8gaWYgdGhpcyBUSFJFRSBvYmplY3QgaGFzIGFueSBldmVudHMgYm91bmQgdG8gaXRcblx0ZXZlbnRDb3VudDogbnVtYmVyO1xuXHQvLyBsaXN0IG9mIGhhbmRsZXJzIHRvIGhhbmRsZSB0aGUgZXZlbnRzXG5cdGhhbmRsZXJzOiBQYXJ0aWFsPE5ndEV2ZW50SGFuZGxlcnM+O1xuXHQvLyBwcmV2aW91cyBhcmdzXG5cdGFyZ3M/OiB1bmtub3duW107XG5cdC8vIGF0dGFjaCBpbmZvcm1hdGlvbiBzbyB0aGF0IHdlIGNhbiBkZXRhY2ggYXMgd2VsbCBhcyByZXNldFxuXHRhdHRhY2g/OiBzdHJpbmdbXSB8IE5ndEF0dGFjaEZ1bmN0aW9uO1xuXHQvLyBwcmV2aW91c2x5IGF0dGFjaCBpbmZvcm1hdGlvbiBzbyB3ZSBjYW4gcmVzZXQgYXMgd2VsbCBhcyBjbGVhbiB1cFxuXHRwcmV2aW91c0F0dGFjaD86IHVua25vd24gfCAoKCkgPT4gdm9pZCk7XG5cdC8vIGlzIHJhdyB2YWx1ZVxuXHRpc1Jhdz86IGJvb2xlYW47XG5cdC8vIHByaW9yaXR5IGZvciBiZWZvcmUgcmVuZGVyXG5cdHByaW9yaXR5PzogbnVtYmVyO1xuXHQvLyBlbWl0dGVyIGFmdGVyIHByb3BzIHVwZGF0ZVxuXHRhZnRlclVwZGF0ZT86IFJlcGxheVN1YmplY3Q8Tmd0SW5zdGFuY2VOb2RlPjtcblx0Ly8gZW1pdHRlciBhZnRlciBhdHRhY2hpbmcgdG8gcGFyZW50XG5cdGFmdGVyQXR0YWNoPzogUmVwbGF5U3ViamVjdDxOZ3RBZnRlckF0dGFjaD47XG59O1xuXG5leHBvcnQgdHlwZSBOZ3RJbnN0YW5jZU5vZGU8VE5vZGUgPSBhbnk+ID0geyBfX25ndF9fOiBOZ3RMb2NhbFN0YXRlIH0gJiBOZ3RBbnlSZWNvcmQgJiBUTm9kZTtcblxuZXhwb3J0IGZ1bmN0aW9uIGdldExvY2FsU3RhdGU8VEluc3RhbmNlIGV4dGVuZHMgb2JqZWN0PihvYmo6IFRJbnN0YW5jZSB8IHVuZGVmaW5lZCk6IE5ndExvY2FsU3RhdGUgfCB1bmRlZmluZWQge1xuXHRpZiAoIW9iaikgcmV0dXJuIHVuZGVmaW5lZDtcblx0cmV0dXJuIChvYmogYXMgTmd0QW55UmVjb3JkKVsnX19uZ3RfXyddO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaW52YWxpZGF0ZUluc3RhbmNlPFRJbnN0YW5jZSBleHRlbmRzIG9iamVjdD4oaW5zdGFuY2U6IFRJbnN0YW5jZSkge1xuXHRjb25zdCBzdGF0ZSA9IGdldExvY2FsU3RhdGUoaW5zdGFuY2UpPy5zdG9yZS5zbmFwc2hvdDtcblx0aWYgKHN0YXRlICYmIHN0YXRlLmludGVybmFsLmZyYW1lcyA9PT0gMCkgc3RhdGUuaW52YWxpZGF0ZSgpO1xuXHRjaGVja1VwZGF0ZShpbnN0YW5jZSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBwcmVwYXJlPFRJbnN0YW5jZSBleHRlbmRzIG9iamVjdCA9IE5ndEFueVJlY29yZD4oXG5cdG9iamVjdDogVEluc3RhbmNlLFxuXHRsb2NhbFN0YXRlPzogUGFydGlhbDxOZ3RMb2NhbFN0YXRlPixcbikge1xuXHRjb25zdCBpbnN0YW5jZSA9IG9iamVjdCBhcyB1bmtub3duIGFzIE5ndEluc3RhbmNlTm9kZTxUSW5zdGFuY2U+O1xuXG5cdGlmIChsb2NhbFN0YXRlPy5wcmltaXRpdmUgfHwgIWluc3RhbmNlLl9fbmd0X18pIHtcblx0XHRjb25zdCB7XG5cdFx0XHRpbnN0YW5jZVN0b3JlID0gc2lnbmFsU3RvcmU8Tmd0TG9jYWxJbnN0YW5jZVN0YXRlPih7XG5cdFx0XHRcdG5hdGl2ZVByb3BzOiB7fSxcblx0XHRcdFx0cGFyZW50OiBudWxsLFxuXHRcdFx0XHRvYmplY3RzOiBbXSxcblx0XHRcdFx0bm9uT2JqZWN0czogW10sXG5cdFx0XHR9KSxcblx0XHRcdC4uLnJlc3Rcblx0XHR9ID0gbG9jYWxTdGF0ZSB8fCB7fTtcblxuXHRcdGluc3RhbmNlLl9fbmd0X18gPSB7XG5cdFx0XHRwcmV2aW91c0F0dGFjaDogbnVsbCxcblx0XHRcdHN0b3JlOiBudWxsLFxuXHRcdFx0bWVtb2l6ZWQ6IHt9LFxuXHRcdFx0ZXZlbnRDb3VudDogMCxcblx0XHRcdGhhbmRsZXJzOiB7fSxcblx0XHRcdGluc3RhbmNlU3RvcmUsXG5cdFx0XHRwYXJlbnQ6IGluc3RhbmNlU3RvcmUuc2VsZWN0KCdwYXJlbnQnKSxcblx0XHRcdG9iamVjdHM6IGluc3RhbmNlU3RvcmUuc2VsZWN0KCdvYmplY3RzJyksXG5cdFx0XHRub25PYmplY3RzOiBpbnN0YW5jZVN0b3JlLnNlbGVjdCgnbm9uT2JqZWN0cycpLFxuXHRcdFx0bmF0aXZlUHJvcHM6IGluc3RhbmNlU3RvcmUuc2VsZWN0KCduYXRpdmVQcm9wcycpLFxuXHRcdFx0YWRkKG9iamVjdCwgdHlwZSkge1xuXHRcdFx0XHRjb25zdCBjdXJyZW50ID0gaW5zdGFuY2UuX19uZ3RfXy5pbnN0YW5jZVN0b3JlLmdldCh0eXBlKTtcblx0XHRcdFx0Y29uc3QgZm91bmRJbmRleCA9IGN1cnJlbnQuaW5kZXhPZigobm9kZTogTmd0SW5zdGFuY2VOb2RlKSA9PiBvYmplY3QgPT09IG5vZGUpO1xuXHRcdFx0XHRpZiAoZm91bmRJbmRleCA+IC0xKSB7XG5cdFx0XHRcdFx0Y3VycmVudC5zcGxpY2UoZm91bmRJbmRleCwgMSwgb2JqZWN0KTtcblx0XHRcdFx0XHRpbnN0YW5jZS5fX25ndF9fLmluc3RhbmNlU3RvcmUudXBkYXRlKHsgW3R5cGVdOiBjdXJyZW50IH0pO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdGluc3RhbmNlLl9fbmd0X18uaW5zdGFuY2VTdG9yZS51cGRhdGUoKHByZXYpID0+ICh7IFt0eXBlXTogWy4uLnByZXZbdHlwZV0sIG9iamVjdF0gfSkpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdG5vdGlmeUFuY2VzdG9ycyhpbnN0YW5jZS5fX25ndF9fLmluc3RhbmNlU3RvcmUuZ2V0KCdwYXJlbnQnKSk7XG5cdFx0XHR9LFxuXHRcdFx0cmVtb3ZlKG9iamVjdCwgdHlwZSkge1xuXHRcdFx0XHRpbnN0YW5jZS5fX25ndF9fLmluc3RhbmNlU3RvcmUudXBkYXRlKChwcmV2KSA9PiAoeyBbdHlwZV06IHByZXZbdHlwZV0uZmlsdGVyKChub2RlKSA9PiBub2RlICE9PSBvYmplY3QpIH0pKTtcblx0XHRcdFx0bm90aWZ5QW5jZXN0b3JzKGluc3RhbmNlLl9fbmd0X18uaW5zdGFuY2VTdG9yZS5nZXQoJ3BhcmVudCcpKTtcblx0XHRcdH0sXG5cdFx0XHRzZXROYXRpdmVQcm9wcyhrZXksIHZhbHVlKSB7XG5cdFx0XHRcdGluc3RhbmNlLl9fbmd0X18uaW5zdGFuY2VTdG9yZS51cGRhdGUoKHByZXYpID0+ICh7IG5hdGl2ZVByb3BzOiB7IC4uLnByZXYubmF0aXZlUHJvcHMsIFtrZXldOiB2YWx1ZSB9IH0pKTtcblx0XHRcdH0sXG5cdFx0XHRzZXRQYXJlbnQocGFyZW50KSB7XG5cdFx0XHRcdGluc3RhbmNlLl9fbmd0X18uaW5zdGFuY2VTdG9yZS51cGRhdGUoeyBwYXJlbnQgfSk7XG5cdFx0XHR9LFxuXHRcdFx0Li4ucmVzdCxcblx0XHR9IGFzIE5ndExvY2FsU3RhdGU7XG5cdH1cblxuXHRyZXR1cm4gaW5zdGFuY2U7XG59XG5cbmZ1bmN0aW9uIG5vdGlmeUFuY2VzdG9ycyhpbnN0YW5jZTogTmd0SW5zdGFuY2VOb2RlIHwgbnVsbCkge1xuXHRpZiAoIWluc3RhbmNlKSByZXR1cm47XG5cdGNvbnN0IGxvY2FsU3RhdGUgPSBnZXRMb2NhbFN0YXRlKGluc3RhbmNlKTtcblx0aWYgKCFsb2NhbFN0YXRlKSByZXR1cm47XG5cdGxvY2FsU3RhdGUuaW5zdGFuY2VTdG9yZS51cGRhdGUoKHByZXYpID0+ICh7IG9iamVjdHM6IHByZXYub2JqZWN0cywgbm9uT2JqZWN0czogcHJldi5ub25PYmplY3RzIH0pKTtcblx0bm90aWZ5QW5jZXN0b3JzKGxvY2FsU3RhdGUuaW5zdGFuY2VTdG9yZS5nZXQoJ3BhcmVudCcpKTtcbn1cbiJdfQ==
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import { Injector, effect, signal } from '@angular/core';
|
|
2
|
+
import { assertInjector } from 'ngxtension/assert-injector';
|
|
3
|
+
import { makeObjectGraph } from './utils/make';
|
|
4
|
+
const cached = new Map();
|
|
5
|
+
function normalizeInputs(input) {
|
|
6
|
+
if (Array.isArray(input))
|
|
7
|
+
return input;
|
|
8
|
+
if (typeof input === 'string')
|
|
9
|
+
return [input];
|
|
10
|
+
return Object.values(input);
|
|
11
|
+
}
|
|
12
|
+
function load(loaderConstructorFactory, inputs, { extensions, onProgress, } = {}) {
|
|
13
|
+
return () => {
|
|
14
|
+
const urls = normalizeInputs(inputs());
|
|
15
|
+
const loader = new (loaderConstructorFactory(urls))();
|
|
16
|
+
if (extensions)
|
|
17
|
+
extensions(loader);
|
|
18
|
+
// TODO: reevaluate this
|
|
19
|
+
return urls.map((url) => {
|
|
20
|
+
if (!cached.has(url)) {
|
|
21
|
+
cached.set(url, new Promise((resolve, reject) => {
|
|
22
|
+
loader.load(url, (data) => {
|
|
23
|
+
if ('scene' in data) {
|
|
24
|
+
Object.assign(data, makeObjectGraph(data['scene']));
|
|
25
|
+
}
|
|
26
|
+
resolve(data);
|
|
27
|
+
}, onProgress, (error) => reject(new Error(`[NGT] Could not load ${url}: ${error}`)));
|
|
28
|
+
}));
|
|
29
|
+
}
|
|
30
|
+
return cached.get(url);
|
|
31
|
+
});
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
function _injectNgtLoader(loaderConstructorFactory, inputs, { extensions, onProgress, injector, } = {}) {
|
|
35
|
+
return assertInjector(_injectNgtLoader, injector, () => {
|
|
36
|
+
const response = signal(null);
|
|
37
|
+
const effector = load(loaderConstructorFactory, inputs, { extensions, onProgress });
|
|
38
|
+
effect(() => {
|
|
39
|
+
const originalUrls = inputs();
|
|
40
|
+
Promise.all(effector()).then((results) => {
|
|
41
|
+
response.update(() => {
|
|
42
|
+
if (Array.isArray(originalUrls))
|
|
43
|
+
return results;
|
|
44
|
+
if (typeof originalUrls === 'string')
|
|
45
|
+
return results[0];
|
|
46
|
+
const keys = Object.keys(originalUrls);
|
|
47
|
+
return keys.reduce((result, key) => {
|
|
48
|
+
result[key] = results[keys.indexOf(key)];
|
|
49
|
+
return result;
|
|
50
|
+
}, {});
|
|
51
|
+
});
|
|
52
|
+
});
|
|
53
|
+
});
|
|
54
|
+
return response.asReadonly();
|
|
55
|
+
});
|
|
56
|
+
}
|
|
57
|
+
_injectNgtLoader.preload = (loaderConstructorFactory, inputs, extensions) => {
|
|
58
|
+
void Promise.all(load(loaderConstructorFactory, inputs, { extensions })());
|
|
59
|
+
};
|
|
60
|
+
_injectNgtLoader.destroy = () => {
|
|
61
|
+
cached.clear();
|
|
62
|
+
};
|
|
63
|
+
export const injectNgtLoader = _injectNgtLoader;
|
|
64
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9hZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vbGlicy9jb3JlL3NyYy9saWIvbG9hZGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBZSxNQUFNLGVBQWUsQ0FBQztBQUN0RSxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFHNUQsT0FBTyxFQUFFLGVBQWUsRUFBcUIsTUFBTSxjQUFjLENBQUM7QUE0QmxFLE1BQU0sTUFBTSxHQUFHLElBQUksR0FBRyxFQUFFLENBQUM7QUFFekIsU0FBUyxlQUFlLENBQUMsS0FBaUQ7SUFDekUsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQztRQUFFLE9BQU8sS0FBSyxDQUFDO0lBQ3ZDLElBQUksT0FBTyxLQUFLLEtBQUssUUFBUTtRQUFFLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUM5QyxPQUFPLE1BQU0sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7QUFDN0IsQ0FBQztBQUVELFNBQVMsSUFBSSxDQUtaLHdCQUFrRSxFQUNsRSxNQUFrQixFQUNsQixFQUNDLFVBQVUsRUFDVixVQUFVLE1BQ2dHLEVBQUU7SUFFN0csT0FBTyxHQUF3QixFQUFFO1FBQ2hDLE1BQU0sSUFBSSxHQUFHLGVBQWUsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDO1FBQ3ZDLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDdEQsSUFBSSxVQUFVO1lBQUUsVUFBVSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ25DLHdCQUF3QjtRQUN4QixPQUFPLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRTtZQUN2QixJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxD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QU0sQ0FBQyxNQUFNLGVBQWUsR0FBc0IsZ0JBQWdCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RvciwgZWZmZWN0LCBzaWduYWwsIHR5cGUgU2lnbmFsIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBhc3NlcnRJbmplY3RvciB9IGZyb20gJ25neHRlbnNpb24vYXNzZXJ0LWluamVjdG9yJztcbmltcG9ydCB0eXBlICogYXMgVEhSRUUgZnJvbSAndGhyZWUnO1xuaW1wb3J0IHR5cGUgeyBOZ3RBbnlSZWNvcmQgfSBmcm9tICcuL3R5cGVzJztcbmltcG9ydCB7IG1ha2VPYmplY3RHcmFwaCwgdHlwZSBOZ3RPYmplY3RNYXAgfSBmcm9tICcuL3V0aWxzL21ha2UnO1xuXG5leHBvcnQgdHlwZSBOZ3RHTFRGTGlrZSA9IHsgc2NlbmU6IFRIUkVFLk9iamVjdDNEIH07XG5cbmV4cG9ydCBpbnRlcmZhY2UgTmd0TG9hZGVyPFQ+IGV4dGVuZHMgVEhSRUUuTG9hZGVyIHtcblx0bG9hZChcblx0XHR1cmw6IHN0cmluZyxcblx0XHRvbkxvYWQ/OiAocmVzdWx0OiBUKSA9PiB2b2lkLFxuXHRcdG9uUHJvZ3Jlc3M/OiAoZXZlbnQ6IFByb2dyZXNzRXZlbnQpID0+IHZvaWQsXG5cdFx0b25FcnJvcj86IChldmVudDogdW5rbm93bikgPT4gdm9pZCxcblx0KTogdW5rbm93bjtcblx0bG9hZEFzeW5jKHVybDogc3RyaW5nLCBvblByb2dyZXNzPzogKGV2ZW50OiBQcm9ncmVzc0V2ZW50KSA9PiB2b2lkKTogUHJvbWlzZTxUPjtcbn1cblxuZXhwb3J0IHR5cGUgTmd0TG9hZGVyUHJvdG88VD4gPSBuZXcgKC4uLmFyZ3M6IGFueSkgPT4gTmd0TG9hZGVyPFQgZXh0ZW5kcyB1bmtub3duID8gYW55IDogVD47XG5leHBvcnQgdHlwZSBOZ3RMb2FkZXJSZXR1cm5UeXBlPFQsIEwgZXh0ZW5kcyBOZ3RMb2FkZXJQcm90bzxUPj4gPSBUIGV4dGVuZHMgdW5rbm93blxuXHQ/IEF3YWl0ZWQ8UmV0dXJuVHlwZTxJbnN0YW5jZVR5cGU8TD5bJ2xvYWRBc3luYyddPj5cblx0OiBUO1xuXG5leHBvcnQgdHlwZSBOZ3RMb2FkZXJFeHRlbnNpb25zPFQgZXh0ZW5kcyB7IHByb3RvdHlwZTogTmd0TG9hZGVyUHJvdG88YW55PiB9PiA9IChsb2FkZXI6IFRbJ3Byb3RvdHlwZSddKSA9PiB2b2lkO1xuZXhwb3J0IHR5cGUgTmd0Q29uZGl0aW9uYWxUeXBlPENoaWxkLCBQYXJlbnQsIFRydXRoeSwgRmFsc3k+ID0gQ2hpbGQgZXh0ZW5kcyBQYXJlbnQgPyBUcnV0aHkgOiBGYWxzeTtcbmV4cG9ydCB0eXBlIE5ndEJyYW5jaGluZ1JldHVybjxULCBQYXJlbnQsIENvZXJjZWQ+ID0gTmd0Q29uZGl0aW9uYWxUeXBlPFQsIFBhcmVudCwgQ29lcmNlZCwgVD47XG5cbmV4cG9ydCB0eXBlIE5ndExvYWRlclJlc3VsdHM8XG5cdFRJbnB1dCBleHRlbmRzIHN0cmluZyB8IHN0cmluZ1tdIHwgUmVjb3JkPHN0cmluZywgc3RyaW5nPixcblx0VFJldHVybixcbj4gPSBUSW5wdXQgZXh0ZW5kcyBzdHJpbmdbXSA/IFRSZXR1cm5bXSA6IFRJbnB1dCBleHRlbmRzIG9iamVjdCA/IHsgW2tleSBpbiBrZXlvZiBUSW5wdXRdOiBUUmV0dXJuIH0gOiBUUmV0dXJuO1xuXG5jb25zdCBjYWNoZWQgPSBuZXcgTWFwKCk7XG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZUlucHV0cyhpbnB1dDogc3RyaW5nIHwgc3RyaW5nW10gfCBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+KSB7XG5cdGlmIChBcnJheS5pc0FycmF5KGlucHV0KSkgcmV0dXJuIGlucHV0O1xuXHRpZiAodHlwZW9mIGlucHV0ID09PSAnc3RyaW5nJykgcmV0dXJuIFtpbnB1dF07XG5cdHJldHVybiBPYmplY3QudmFsdWVzKGlucHV0KTtcbn1cblxuZnVuY3Rpb24gbG9hZDxcblx0VERhdGEsXG5cdFRVcmwgZXh0ZW5kcyBzdHJpbmcgfCBzdHJpbmdbXSB8IFJlY29yZDxzdHJpbmcsIHN0cmluZz4sXG5cdFRMb2FkZXJDb25zdHJ1Y3RvciBleHRlbmRzIE5ndExvYWRlclByb3RvPFREYXRhPixcbj4oXG5cdGxvYWRlckNvbnN0cnVjdG9yRmFjdG9yeTogKGlucHV0czogc3RyaW5nW10pID0+IFRMb2FkZXJDb25zdHJ1Y3Rvcixcblx0aW5wdXRzOiAoKSA9PiBUVXJsLFxuXHR7XG5cdFx0ZXh0ZW5zaW9ucyxcblx0XHRvblByb2dyZXNzLFxuXHR9OiB7IGV4dGVuc2lvbnM/OiBOZ3RMb2FkZXJFeHRlbnNpb25zPFRMb2FkZXJDb25zdHJ1Y3Rvcj47IG9uUHJvZ3Jlc3M/OiAoZXZlbnQ6IFByb2dyZXNzRXZlbnQpID0+IHZvaWQgfSA9IHt9LFxuKSB7XG5cdHJldHVybiAoKTogQXJyYXk8UHJvbWlzZTxhbnk+PiA9PiB7XG5cdFx0Y29uc3QgdXJscyA9IG5vcm1hbGl6ZUlucHV0cyhpbnB1dHMoKSk7XG5cdFx0Y29uc3QgbG9hZGVyID0gbmV3IChsb2FkZXJDb25zdHJ1Y3RvckZhY3RvcnkodXJscykpKCk7XG5cdFx0aWYgKGV4dGVuc2lvbnMpIGV4dGVuc2lvbnMobG9hZGVyKTtcblx0XHQvLyBUT0RPOiByZWV2YWx1YXRlIHRoaXNcblx0XHRyZXR1cm4gdXJscy5tYXAoKHVybCkgPT4ge1xuXHRcdFx0aWYgKCFjYWNoZWQuaGFzKHVybCkpIHtcblx0XHRcdFx0Y2FjaGVkLnNldChcblx0XHRcdFx0XHR1cmwsXG5cdFx0XHRcdFx0bmV3IFByb21pc2U8VERhdGE+KChyZXNvbHZlLCByZWplY3QpID0+IHtcblx0XHRcdFx0XHRcdGxvYWRlci5sb2FkKFxuXHRcdFx0XHRcdFx0XHR1cmwsXG5cdFx0XHRcdFx0XHRcdChkYXRhKSA9PiB7XG5cdFx0XHRcdFx0XHRcdFx0aWYgKCdzY2VuZScgaW4gKGRhdGEgYXMgTmd0QW55UmVjb3JkKSkge1xuXHRcdFx0XHRcdFx0XHRcdFx0T2JqZWN0LmFzc2lnbihkYXRhIGFzIE5ndEFueVJlY29yZCwgbWFrZU9iamVjdEdyYXBoKChkYXRhIGFzIE5ndEFueVJlY29yZClbJ3NjZW5lJ10pKTtcblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0cmVzb2x2ZShkYXRhKTtcblx0XHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdFx0b25Qcm9ncmVzcyxcblx0XHRcdFx0XHRcdFx0KGVycm9yKSA9PiByZWplY3QobmV3IEVycm9yKGBbTkdUXSBDb3VsZCBub3QgbG9hZCAke3VybH06ICR7ZXJyb3J9YCkpLFxuXHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHR9KSxcblx0XHRcdFx0KTtcblx0XHRcdH1cblx0XHRcdHJldHVybiBjYWNoZWQuZ2V0KHVybCkhO1xuXHRcdH0pO1xuXHR9O1xufVxuXG5mdW5jdGlvbiBfaW5qZWN0Tmd0TG9hZGVyPFxuXHRURGF0YSxcblx0VFVybCBleHRlbmRzIHN0cmluZyB8IHN0cmluZ1tdIHwgUmVjb3JkPHN0cmluZywgc3RyaW5nPixcblx0VExvYWRlckNvbnN0cnVjdG9yIGV4dGVuZHMgTmd0TG9hZGVyUHJvdG88VERhdGE+LFxuXHRUUmV0dXJuID0gTmd0TG9hZGVyUmV0dXJuVHlwZTxURGF0YSwgVExvYWRlckNvbnN0cnVjdG9yPixcbj4oXG5cdGxvYWRlckNvbnN0cnVjdG9yRmFjdG9yeTogKGlucHV0czogc3RyaW5nW10pID0+IFRMb2FkZXJDb25zdHJ1Y3Rvcixcblx0aW5wdXRzOiAoKSA9PiBUVXJsLFxuXHR7XG5cdFx0ZXh0ZW5zaW9ucyxcblx0XHRvblByb2dyZXNzLFxuXHRcdGluamVjdG9yLFxuXHR9OiB7XG5cdFx0ZXh0ZW5zaW9ucz86IE5ndExvYWRlckV4dGVuc2lvbnM8VExvYWRlckNvbnN0cnVjdG9yPjtcblx0XHRvblByb2dyZXNzPzogKGV2ZW50OiBQcm9ncmVzc0V2ZW50KSA9PiB2b2lkO1xuXHRcdGluamVjdG9yPzogSW5qZWN0b3I7XG5cdH0gPSB7fSxcbik6IFNpZ25hbDxOZ3RMb2FkZXJSZXN1bHRzPFRVcmwsIE5ndEJyYW5jaGluZ1JldHVybjxUUmV0dXJuLCBOZ3RHTFRGTGlrZSwgTmd0R0xURkxpa2UgJiBOZ3RPYmplY3RNYXA+PiB8IG51bGw+IHtcblx0cmV0dXJuIGFzc2VydEluamVjdG9yKF9pbmplY3ROZ3RMb2FkZXIsIGluamVjdG9yLCAoKSA9PiB7XG5cdFx0Y29uc3QgcmVzcG9uc2UgPSBzaWduYWw8Tmd0TG9hZGVyUmVzdWx0czxcblx0XHRcdFRVcmwsXG5cdFx0XHROZ3RCcmFuY2hpbmdSZXR1cm48VFJldHVybiwgTmd0R0xURkxpa2UsIE5ndEdMVEZMaWtlICYgTmd0T2JqZWN0TWFwPlxuXHRcdD4gfCBudWxsPihudWxsKTtcblx0XHRjb25zdCBlZmZlY3RvciA9IGxvYWQobG9hZGVyQ29uc3RydWN0b3JGYWN0b3J5LCBpbnB1dHMsIHsgZXh0ZW5zaW9ucywgb25Qcm9ncmVzcyB9KTtcblxuXHRcdGVmZmVjdCgoKSA9PiB7XG5cdFx0XHRjb25zdCBvcmlnaW5hbFVybHMgPSBpbnB1dHMoKTtcblx0XHRcdFByb21pc2UuYWxsKGVmZmVjdG9yKCkpLnRoZW4oKHJlc3VsdHMpID0+IHtcblx0XHRcdFx0cmVzcG9uc2UudXBkYXRlKCgpID0+IHtcblx0XHRcdFx0XHRpZiAoQXJyYXkuaXNBcnJheShvcmlnaW5hbFVybHMpKSByZXR1cm4gcmVzdWx0cztcblx0XHRcdFx0XHRpZiAodHlwZW9mIG9yaWdpbmFsVXJscyA9PT0gJ3N0cmluZycpIHJldHVybiByZXN1bHRzWzBdO1xuXHRcdFx0XHRcdGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyhvcmlnaW5hbFVybHMpO1xuXHRcdFx0XHRcdHJldHVybiBrZXlzLnJlZHVjZShcblx0XHRcdFx0XHRcdChyZXN1bHQsIGtleSkgPT4ge1xuXHRcdFx0XHRcdFx0XHQocmVzdWx0IGFzIE5ndEFueVJlY29yZClba2V5XSA9IHJlc3VsdHNba2V5cy5pbmRleE9mKGtleSldO1xuXHRcdFx0XHRcdFx0XHRyZXR1cm4gcmVzdWx0O1xuXHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdHt9IGFzIHsgW2tleSBpbiBrZXlvZiBUVXJsXTogTmd0QnJhbmNoaW5nUmV0dXJuPFRSZXR1cm4sIE5ndEdMVEZMaWtlLCBOZ3RHTFRGTGlrZSAmIE5ndE9iamVjdE1hcD4gfSxcblx0XHRcdFx0XHQpO1xuXHRcdFx0XHR9KTtcblx0XHRcdH0pO1xuXHRcdH0pO1xuXG5cdFx0cmV0dXJuIHJlc3BvbnNlLmFzUmVhZG9ubHkoKTtcblx0fSk7XG59XG5cbl9pbmplY3ROZ3RMb2FkZXIucHJlbG9hZCA9IDxcblx0VERhdGEsXG5cdFRVcmwgZXh0ZW5kcyBzdHJpbmcgfCBzdHJpbmdbXSB8IFJlY29yZDxzdHJpbmcsIHN0cmluZz4sXG5cdFRMb2FkZXJDb25zdHJ1Y3RvciBleHRlbmRzIE5ndExvYWRlclByb3RvPFREYXRhPixcbj4oXG5cdGxvYWRlckNvbnN0cnVjdG9yRmFjdG9yeTogKGlucHV0czogc3RyaW5nW10pID0+IFRMb2FkZXJDb25zdHJ1Y3Rvcixcblx0aW5wdXRzOiAoKSA9PiBUVXJsLFxuXHRleHRlbnNpb25zPzogTmd0TG9hZGVyRXh0ZW5zaW9uczxUTG9hZGVyQ29uc3RydWN0b3I+LFxuKSA9PiB7XG5cdHZvaWQgUHJvbWlzZS5hbGwobG9hZChsb2FkZXJDb25zdHJ1Y3RvckZhY3RvcnksIGlucHV0cywgeyBleHRlbnNpb25zIH0pKCkpO1xufTtcblxuX2luamVjdE5ndExvYWRlci5kZXN0cm95ID0gKCkgPT4ge1xuXHRjYWNoZWQuY2xlYXIoKTtcbn07XG5cbmV4cG9ydCB0eXBlIE5ndEluamVjdGVkTG9hZGVyID0gdHlwZW9mIF9pbmplY3ROZ3RMb2FkZXI7XG5leHBvcnQgY29uc3QgaW5qZWN0Tmd0TG9hZGVyOiBOZ3RJbmplY3RlZExvYWRlciA9IF9pbmplY3ROZ3RMb2FkZXI7XG4iXX0=
|