angular-three 1.9.16 → 1.10.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/esm2022/lib/canvas.mjs +243 -0
- package/esm2022/lib/directives/args.mjs +36 -0
- package/esm2022/lib/directives/common.mjs +32 -0
- package/esm2022/lib/directives/parent.mjs +36 -0
- package/esm2022/lib/directives/repeat.mjs +18 -0
- package/esm2022/lib/loader.mjs +55 -0
- package/esm2022/lib/pipes/push.mjs +50 -0
- package/esm2022/lib/portal.mjs +240 -0
- package/esm2022/lib/renderer/renderer.mjs +361 -0
- package/esm2022/lib/routed-scene.mjs +29 -0
- package/esm2022/lib/stores/rx-store.mjs +108 -0
- package/esm2022/lib/stores/store.mjs +404 -0
- package/esm2022/lib/types.mjs +2 -0
- package/esm2022/lib/utils/apply-props.mjs +107 -0
- package/esm2022/lib/utils/is.mjs +51 -0
- package/{fesm2020 → fesm2022}/angular-three.mjs +78 -61
- package/fesm2022/angular-three.mjs.map +1 -0
- package/lib/canvas.d.ts +1 -1
- package/lib/directives/args.d.ts +1 -1
- package/lib/directives/parent.d.ts +1 -1
- package/lib/directives/repeat.d.ts +1 -1
- package/lib/loader.d.ts +3 -11
- package/lib/portal.d.ts +2 -2
- package/lib/types.d.ts +91 -120
- package/lib/utils/is.d.ts +6 -1
- package/metadata.json +1 -0
- package/package.json +13 -17
- package/plugin/package.json +1 -4
- package/plugin/src/generators/init/compat.js +1 -1
- package/plugin/src/generators/init/compat.js.map +1 -1
- package/plugin/src/generators/init/init.d.ts +3 -3
- package/plugin/src/generators/init/init.js +23 -3
- package/plugin/src/generators/init/init.js.map +1 -1
- package/web-types.json +1 -0
- package/esm2020/lib/canvas.mjs +0 -242
- package/esm2020/lib/directives/args.mjs +0 -35
- package/esm2020/lib/directives/common.mjs +0 -31
- package/esm2020/lib/directives/parent.mjs +0 -35
- package/esm2020/lib/directives/repeat.mjs +0 -17
- package/esm2020/lib/loader.mjs +0 -56
- package/esm2020/lib/pipes/push.mjs +0 -49
- package/esm2020/lib/portal.mjs +0 -237
- package/esm2020/lib/renderer/renderer.mjs +0 -360
- package/esm2020/lib/routed-scene.mjs +0 -28
- package/esm2020/lib/stores/rx-store.mjs +0 -107
- package/esm2020/lib/stores/store.mjs +0 -402
- package/esm2020/lib/types.mjs +0 -2
- package/esm2020/lib/utils/apply-props.mjs +0 -91
- package/esm2020/lib/utils/is.mjs +0 -50
- package/fesm2015/angular-three.mjs +0 -3051
- package/fesm2015/angular-three.mjs.map +0 -1
- package/fesm2020/angular-three.mjs.map +0 -1
- /package/{esm2020 → esm2022}/angular-three.mjs +0 -0
- /package/{esm2020 → esm2022}/index.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/di/before-render.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/di/catalogue.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/di/destroy.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/di/ref.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/di/run-in-context.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/events.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/loop.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/renderer/di.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/renderer/enums.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/renderer/provider.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/renderer/store.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/renderer/utils.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/utils/attach.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/utils/instance.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/utils/make.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/utils/safe-detect-changes.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/utils/update.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/web/events.mjs +0 -0
|
@@ -0,0 +1,361 @@
|
|
|
1
|
+
import { DOCUMENT } from '@angular/common';
|
|
2
|
+
import { ChangeDetectorRef, getDebugNode, inject, Injectable, RendererFactory2, } from '@angular/core';
|
|
3
|
+
import { take } from 'rxjs';
|
|
4
|
+
import { NGT_CATALOGUE } from '../di/catalogue';
|
|
5
|
+
import { NgtStore } from '../stores/store';
|
|
6
|
+
import { getLocalState, prepare } from '../utils/instance';
|
|
7
|
+
import { is } from '../utils/is';
|
|
8
|
+
import { safeDetectChanges } from '../utils/safe-detect-changes';
|
|
9
|
+
import { NGT_COMPOUND_PREFIXES } from './di';
|
|
10
|
+
import { NgtRendererStore } from './store';
|
|
11
|
+
import { attachThreeChild, kebabToPascal, processThreeEvent, removeThreeChild, SPECIAL_DOM_TAG } from './utils';
|
|
12
|
+
import * as i0 from "@angular/core";
|
|
13
|
+
class NgtRendererFactory {
|
|
14
|
+
constructor() {
|
|
15
|
+
this.delegateRendererFactory = inject(RendererFactory2, { skipSelf: true });
|
|
16
|
+
this.catalogue = inject(NGT_CATALOGUE);
|
|
17
|
+
this.rendererMap = new Map();
|
|
18
|
+
this.routedSet = new Set();
|
|
19
|
+
// all Renderer instances share the same Store
|
|
20
|
+
this.rendererStore = new NgtRendererStore({
|
|
21
|
+
store: inject(NgtStore),
|
|
22
|
+
cdr: inject(ChangeDetectorRef),
|
|
23
|
+
portals: [],
|
|
24
|
+
compoundPrefixes: inject(NGT_COMPOUND_PREFIXES),
|
|
25
|
+
document: inject(DOCUMENT),
|
|
26
|
+
});
|
|
27
|
+
}
|
|
28
|
+
createRenderer(hostElement, type) {
|
|
29
|
+
const delegateRenderer = this.delegateRendererFactory.createRenderer(hostElement, type);
|
|
30
|
+
if (!type)
|
|
31
|
+
return delegateRenderer;
|
|
32
|
+
if (type['type']['isRoutedScene']) {
|
|
33
|
+
this.routedSet.add(type.id);
|
|
34
|
+
}
|
|
35
|
+
let renderer = this.rendererMap.get(type.id);
|
|
36
|
+
if (!renderer) {
|
|
37
|
+
renderer = new NgtRenderer(delegateRenderer, this.rendererStore, this.catalogue,
|
|
38
|
+
// setting root scene if there's no routed scene OR this component is the routed Scene
|
|
39
|
+
!hostElement && (this.routedSet.size === 0 || this.routedSet.has(type.id)));
|
|
40
|
+
this.rendererMap.set(type.id, renderer);
|
|
41
|
+
}
|
|
42
|
+
return renderer;
|
|
43
|
+
}
|
|
44
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.0.0", ngImport: i0, type: NgtRendererFactory, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
45
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.0.0", ngImport: i0, type: NgtRendererFactory }); }
|
|
46
|
+
}
|
|
47
|
+
export { NgtRendererFactory };
|
|
48
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.0.0", ngImport: i0, type: NgtRendererFactory, decorators: [{
|
|
49
|
+
type: Injectable
|
|
50
|
+
}] });
|
|
51
|
+
/**
|
|
52
|
+
* Anything abbreviated with rS/RS stands for RendererState
|
|
53
|
+
*/
|
|
54
|
+
export class NgtRenderer {
|
|
55
|
+
constructor(delegate, store, catalogue, root = true) {
|
|
56
|
+
this.delegate = delegate;
|
|
57
|
+
this.store = store;
|
|
58
|
+
this.catalogue = catalogue;
|
|
59
|
+
this.root = root;
|
|
60
|
+
this.createText = this.delegate.createText.bind(this.delegate);
|
|
61
|
+
this.destroy = this.delegate.destroy.bind(this.delegate);
|
|
62
|
+
this.destroyNode = null;
|
|
63
|
+
this.selectRootElement = this.delegate.selectRootElement.bind(this.delegate);
|
|
64
|
+
this.nextSibling = this.delegate.nextSibling.bind(this.delegate);
|
|
65
|
+
this.removeAttribute = this.delegate.removeAttribute.bind(this.delegate);
|
|
66
|
+
this.addClass = this.delegate.addClass.bind(this.delegate);
|
|
67
|
+
this.removeClass = this.delegate.removeClass.bind(this.delegate);
|
|
68
|
+
this.setStyle = this.delegate.setStyle.bind(this.delegate);
|
|
69
|
+
this.removeStyle = this.delegate.removeStyle.bind(this.delegate);
|
|
70
|
+
this.setValue = this.delegate.setValue.bind(this.delegate);
|
|
71
|
+
}
|
|
72
|
+
createElement(name, namespace) {
|
|
73
|
+
const element = this.delegate.createElement(name, namespace);
|
|
74
|
+
// on first pass, we return the Root Scene as the root node
|
|
75
|
+
if (this.root) {
|
|
76
|
+
this.root = false;
|
|
77
|
+
const node = this.store.createNode('three', this.store.rootScene);
|
|
78
|
+
node.__ngt_renderer__[14 /* NgtRendererClassId.injectorFactory */] = () => getDebugNode(element).injector;
|
|
79
|
+
return node;
|
|
80
|
+
}
|
|
81
|
+
// handle compound
|
|
82
|
+
if (this.store.isCompound(name)) {
|
|
83
|
+
return this.store.createNode('compound', element);
|
|
84
|
+
}
|
|
85
|
+
// handle portal
|
|
86
|
+
if (name === SPECIAL_DOM_TAG.NGT_PORTAL) {
|
|
87
|
+
return this.store.createNode('portal', element);
|
|
88
|
+
}
|
|
89
|
+
// handle raw value
|
|
90
|
+
if (name === SPECIAL_DOM_TAG.NGT_VALUE) {
|
|
91
|
+
return this.store.createNode('three', Object.assign({ __ngt_renderer__: { rawValue: undefined } }, { __ngt__: { isRaw: true } }));
|
|
92
|
+
}
|
|
93
|
+
const { injectedArgs, injectedParent, store } = this.store.getCreationState();
|
|
94
|
+
let parent = injectedParent;
|
|
95
|
+
if (typeof injectedParent === 'string') {
|
|
96
|
+
parent = store
|
|
97
|
+
.get('scene')
|
|
98
|
+
.getObjectByName(injectedParent);
|
|
99
|
+
}
|
|
100
|
+
// handle primitive
|
|
101
|
+
if (name === SPECIAL_DOM_TAG.NGT_PRIMITIVE) {
|
|
102
|
+
if (!injectedArgs[0])
|
|
103
|
+
throw new Error(`[NGT] ngt-primitive without args is invalid`);
|
|
104
|
+
const object = injectedArgs[0];
|
|
105
|
+
let localState = getLocalState(object);
|
|
106
|
+
if (!Object.keys(localState).length) {
|
|
107
|
+
prepare(object, { store, args: injectedArgs, primitive: true });
|
|
108
|
+
localState = getLocalState(object);
|
|
109
|
+
}
|
|
110
|
+
if (!localState.store)
|
|
111
|
+
localState.store = store;
|
|
112
|
+
const node = this.store.createNode('three', object);
|
|
113
|
+
if (parent) {
|
|
114
|
+
node.__ngt_renderer__[2 /* NgtRendererClassId.injectedParent */] = parent;
|
|
115
|
+
}
|
|
116
|
+
return node;
|
|
117
|
+
}
|
|
118
|
+
const threeTag = name.startsWith('ngt') ? name.slice(4) : name;
|
|
119
|
+
const threeName = kebabToPascal(threeTag);
|
|
120
|
+
const threeTarget = this.catalogue[threeName];
|
|
121
|
+
// we have the THREE constructor here, handle it
|
|
122
|
+
if (threeTarget) {
|
|
123
|
+
const instance = prepare(new threeTarget(...injectedArgs), { store, args: injectedArgs });
|
|
124
|
+
const node = this.store.createNode('three', instance);
|
|
125
|
+
const localState = getLocalState(instance);
|
|
126
|
+
// auto-attach for geometry and material
|
|
127
|
+
if (is.geometry(instance)) {
|
|
128
|
+
localState.attach = ['geometry'];
|
|
129
|
+
}
|
|
130
|
+
else if (is.material(instance)) {
|
|
131
|
+
localState.attach = ['material'];
|
|
132
|
+
}
|
|
133
|
+
if (parent) {
|
|
134
|
+
node.__ngt_renderer__[2 /* NgtRendererClassId.injectedParent */] = parent;
|
|
135
|
+
}
|
|
136
|
+
return node;
|
|
137
|
+
}
|
|
138
|
+
return this.store.createNode('dom', element);
|
|
139
|
+
}
|
|
140
|
+
createComment(value) {
|
|
141
|
+
return this.store.createNode('comment', this.delegate.createComment(value));
|
|
142
|
+
}
|
|
143
|
+
appendChild(parent, newChild) {
|
|
144
|
+
// TODO: just ignore text node for now
|
|
145
|
+
if (newChild instanceof Text)
|
|
146
|
+
return;
|
|
147
|
+
const cRS = newChild.__ngt_renderer__;
|
|
148
|
+
const pRS = parent.__ngt_renderer__;
|
|
149
|
+
if (cRS[0 /* NgtRendererClassId.type */] === 'comment') {
|
|
150
|
+
this.store.setParent(newChild, parent);
|
|
151
|
+
return;
|
|
152
|
+
}
|
|
153
|
+
if (cRS[2 /* NgtRendererClassId.injectedParent */]) {
|
|
154
|
+
if (is.ref(cRS[2 /* NgtRendererClassId.injectedParent */])) {
|
|
155
|
+
cRS[2 /* NgtRendererClassId.injectedParent */].$.pipe(take(1)).subscribe((val) => {
|
|
156
|
+
if (val !== parent) {
|
|
157
|
+
this.appendChild(val, newChild);
|
|
158
|
+
}
|
|
159
|
+
});
|
|
160
|
+
return;
|
|
161
|
+
}
|
|
162
|
+
else if (parent !== cRS[2 /* NgtRendererClassId.injectedParent */]) {
|
|
163
|
+
this.appendChild(cRS[2 /* NgtRendererClassId.injectedParent */], newChild);
|
|
164
|
+
return;
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
this.store.setParent(newChild, parent);
|
|
168
|
+
this.store.addChild(parent, newChild);
|
|
169
|
+
// if new child is a portal
|
|
170
|
+
if (cRS[0 /* NgtRendererClassId.type */] === 'portal') {
|
|
171
|
+
this.store.processPortalContainer(newChild);
|
|
172
|
+
if (cRS[13 /* NgtRendererClassId.portalContainer */]) {
|
|
173
|
+
this.appendChild(parent, cRS[13 /* NgtRendererClassId.portalContainer */]);
|
|
174
|
+
}
|
|
175
|
+
return;
|
|
176
|
+
}
|
|
177
|
+
// if parent is a portal
|
|
178
|
+
if (pRS[0 /* NgtRendererClassId.type */] === 'portal') {
|
|
179
|
+
this.store.processPortalContainer(parent);
|
|
180
|
+
if (pRS[13 /* NgtRendererClassId.portalContainer */]) {
|
|
181
|
+
this.appendChild(pRS[13 /* NgtRendererClassId.portalContainer */], newChild);
|
|
182
|
+
}
|
|
183
|
+
return;
|
|
184
|
+
}
|
|
185
|
+
// if both are three instances, straightforward case
|
|
186
|
+
if (pRS[0 /* NgtRendererClassId.type */] === 'three' && cRS[0 /* NgtRendererClassId.type */] === 'three') {
|
|
187
|
+
// if child already attached to a parent, skip
|
|
188
|
+
if (getLocalState(newChild).parent)
|
|
189
|
+
return;
|
|
190
|
+
// attach THREE child
|
|
191
|
+
attachThreeChild(parent, newChild);
|
|
192
|
+
// here, we handle the special case of if the parent has a compoundParent, which means this child is part of a compound parent template
|
|
193
|
+
if (!cRS[5 /* NgtRendererClassId.compound */])
|
|
194
|
+
return;
|
|
195
|
+
const closestGrandparentWithCompound = this.store.getClosestParentWithCompound(parent);
|
|
196
|
+
if (!closestGrandparentWithCompound)
|
|
197
|
+
return;
|
|
198
|
+
this.appendChild(closestGrandparentWithCompound, newChild);
|
|
199
|
+
return;
|
|
200
|
+
}
|
|
201
|
+
// if only the parent is the THREE instance
|
|
202
|
+
if (pRS[0 /* NgtRendererClassId.type */] === 'three') {
|
|
203
|
+
for (const renderChild of cRS[3 /* NgtRendererClassId.children */]) {
|
|
204
|
+
this.appendChild(parent, renderChild);
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
// if parent is a compound
|
|
208
|
+
if (pRS[0 /* NgtRendererClassId.type */] === 'compound') {
|
|
209
|
+
// if compound doesn't have a THREE instance set yet
|
|
210
|
+
if (!pRS[7 /* NgtRendererClassId.compounded */] && cRS[0 /* NgtRendererClassId.type */] === 'three') {
|
|
211
|
+
// if child is indeed an ngtCompound
|
|
212
|
+
if (cRS[5 /* NgtRendererClassId.compound */])
|
|
213
|
+
this.store.setCompound(parent, newChild);
|
|
214
|
+
// if not, we track the parent (that is supposedly the compound component) on this three instance
|
|
215
|
+
else if (!cRS[6 /* NgtRendererClassId.compoundParent */])
|
|
216
|
+
cRS[6 /* NgtRendererClassId.compoundParent */] = parent;
|
|
217
|
+
}
|
|
218
|
+
// reset the compound if it's changed
|
|
219
|
+
if (pRS[7 /* NgtRendererClassId.compounded */] &&
|
|
220
|
+
cRS[0 /* NgtRendererClassId.type */] === 'three' &&
|
|
221
|
+
cRS[5 /* NgtRendererClassId.compound */] &&
|
|
222
|
+
pRS[7 /* NgtRendererClassId.compounded */] !== newChild) {
|
|
223
|
+
this.store.setCompound(parent, newChild);
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
const shouldFindGrandparentInstance =
|
|
227
|
+
// if child is three but haven't been attached to a parent yet
|
|
228
|
+
(cRS[0 /* NgtRendererClassId.type */] === 'three' && !getLocalState(newChild).parent) ||
|
|
229
|
+
// or both parent and child are DOM elements
|
|
230
|
+
// or they are compound AND haven't had a THREE instance yet
|
|
231
|
+
((pRS[0 /* NgtRendererClassId.type */] === 'dom' ||
|
|
232
|
+
(pRS[0 /* NgtRendererClassId.type */] === 'compound' && !pRS[7 /* NgtRendererClassId.compounded */])) &&
|
|
233
|
+
(cRS[0 /* NgtRendererClassId.type */] === 'dom' ||
|
|
234
|
+
(cRS[0 /* NgtRendererClassId.type */] === 'compound' && !cRS[7 /* NgtRendererClassId.compounded */])));
|
|
235
|
+
if (shouldFindGrandparentInstance) {
|
|
236
|
+
// we'll try to get the grandparent instance here so that we can run appendChild with both instances
|
|
237
|
+
const closestGrandparentInstance = this.store.getClosestParentWithInstance(parent);
|
|
238
|
+
if (closestGrandparentInstance)
|
|
239
|
+
this.appendChild(closestGrandparentInstance, newChild);
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
insertBefore(parent, newChild
|
|
243
|
+
// TODO we might need these?
|
|
244
|
+
// refChild: NgtRendererNode
|
|
245
|
+
// isMove?: boolean | undefined
|
|
246
|
+
) {
|
|
247
|
+
if (parent == null || !parent.__ngt_renderer__ || parent === newChild)
|
|
248
|
+
return;
|
|
249
|
+
this.appendChild(parent, newChild);
|
|
250
|
+
}
|
|
251
|
+
removeChild(parent, oldChild, isHostElement) {
|
|
252
|
+
const pRS = parent.__ngt_renderer__;
|
|
253
|
+
const cRS = oldChild.__ngt_renderer__;
|
|
254
|
+
if (pRS[0 /* NgtRendererClassId.type */] === 'three' && cRS[0 /* NgtRendererClassId.type */] === 'three') {
|
|
255
|
+
removeThreeChild(parent, oldChild, true);
|
|
256
|
+
this.store.destroy(oldChild, parent);
|
|
257
|
+
return;
|
|
258
|
+
}
|
|
259
|
+
if (pRS[0 /* NgtRendererClassId.type */] === 'compound' && pRS[1 /* NgtRendererClassId.parent */]) {
|
|
260
|
+
this.removeChild(pRS[1 /* NgtRendererClassId.parent */], oldChild, isHostElement);
|
|
261
|
+
return;
|
|
262
|
+
}
|
|
263
|
+
if (pRS[0 /* NgtRendererClassId.type */] === 'three') {
|
|
264
|
+
this.store.destroy(oldChild, parent);
|
|
265
|
+
return;
|
|
266
|
+
}
|
|
267
|
+
const closestGrandparentInstance = this.store.getClosestParentWithInstance(parent);
|
|
268
|
+
if (closestGrandparentInstance)
|
|
269
|
+
this.removeChild(closestGrandparentInstance, oldChild, isHostElement);
|
|
270
|
+
this.store.destroy(oldChild, closestGrandparentInstance);
|
|
271
|
+
}
|
|
272
|
+
parentNode(node) {
|
|
273
|
+
const rS = node.__ngt_renderer__;
|
|
274
|
+
if (rS?.[1 /* NgtRendererClassId.parent */])
|
|
275
|
+
return rS[1 /* NgtRendererClassId.parent */];
|
|
276
|
+
return this.delegate.parentNode(node);
|
|
277
|
+
}
|
|
278
|
+
setAttribute(el, name, value, namespace) {
|
|
279
|
+
const rS = el.__ngt_renderer__;
|
|
280
|
+
if (rS[0 /* NgtRendererClassId.type */] === 'compound') {
|
|
281
|
+
// we don't have the compound instance yet
|
|
282
|
+
rS[9 /* NgtRendererClassId.attributes */][name] = value;
|
|
283
|
+
if (!rS[7 /* NgtRendererClassId.compounded */]) {
|
|
284
|
+
this.store.queueOperation(el, ['op', () => this.setAttribute(el, name, value, namespace)]);
|
|
285
|
+
return;
|
|
286
|
+
}
|
|
287
|
+
this.setAttribute(rS[7 /* NgtRendererClassId.compounded */], name, value, namespace);
|
|
288
|
+
return;
|
|
289
|
+
}
|
|
290
|
+
if (rS[0 /* NgtRendererClassId.type */] === 'three')
|
|
291
|
+
this.store.applyAttribute(el, name, value);
|
|
292
|
+
}
|
|
293
|
+
setProperty(el, name, value) {
|
|
294
|
+
const rS = el.__ngt_renderer__;
|
|
295
|
+
if (rS[0 /* NgtRendererClassId.type */] === 'compound') {
|
|
296
|
+
// we don't have the compound instance yet
|
|
297
|
+
rS[10 /* NgtRendererClassId.properties */][name] = value;
|
|
298
|
+
if (!rS[7 /* NgtRendererClassId.compounded */]) {
|
|
299
|
+
this.store.queueOperation(el, ['op', () => this.setProperty(el, name, value)]);
|
|
300
|
+
return;
|
|
301
|
+
}
|
|
302
|
+
if (rS[7 /* NgtRendererClassId.compounded */].__ngt_renderer__[5 /* NgtRendererClassId.compound */]) {
|
|
303
|
+
Object.assign(rS[7 /* NgtRendererClassId.compounded */].__ngt_renderer__[5 /* NgtRendererClassId.compound */], {
|
|
304
|
+
props: Object.assign(rS[7 /* NgtRendererClassId.compounded */].__ngt_renderer__[5 /* NgtRendererClassId.compound */], { [name]: value }),
|
|
305
|
+
});
|
|
306
|
+
}
|
|
307
|
+
this.setProperty(rS[7 /* NgtRendererClassId.compounded */], name, value);
|
|
308
|
+
return;
|
|
309
|
+
}
|
|
310
|
+
if (rS[0 /* NgtRendererClassId.type */] === 'three')
|
|
311
|
+
this.store.applyProperty(el, name, value);
|
|
312
|
+
}
|
|
313
|
+
listen(target, eventName, callback) {
|
|
314
|
+
const rS = target.__ngt_renderer__;
|
|
315
|
+
const targetCdr = rS?.[14 /* NgtRendererClassId.injectorFactory */]?.().get(ChangeDetectorRef, null);
|
|
316
|
+
if (rS[0 /* NgtRendererClassId.type */] === 'three' ||
|
|
317
|
+
(rS[0 /* NgtRendererClassId.type */] === 'compound' && rS[7 /* NgtRendererClassId.compounded */])) {
|
|
318
|
+
const instance = rS[7 /* NgtRendererClassId.compounded */] || target;
|
|
319
|
+
const priority = getLocalState(target).priority;
|
|
320
|
+
return processThreeEvent(instance, priority || 0, eventName, callback, this.store.rootCdr, targetCdr);
|
|
321
|
+
}
|
|
322
|
+
if (rS[0 /* NgtRendererClassId.type */] === 'compound' && !rS[7 /* NgtRendererClassId.compounded */]) {
|
|
323
|
+
this.store.queueOperation(target, [
|
|
324
|
+
'op',
|
|
325
|
+
() => this.store.queueOperation(target, ['cleanUp', this.listen(target, eventName, callback)]),
|
|
326
|
+
]);
|
|
327
|
+
}
|
|
328
|
+
// setup a new callback with CDR so that it will trigger change detection properly
|
|
329
|
+
const callbackWithCdr = (event) => {
|
|
330
|
+
const value = callback(event);
|
|
331
|
+
safeDetectChanges(targetCdr);
|
|
332
|
+
safeDetectChanges(this.store.rootCdr);
|
|
333
|
+
return value;
|
|
334
|
+
};
|
|
335
|
+
// if the target doesn't have __ngt_renderer__, we delegate
|
|
336
|
+
if (!rS) {
|
|
337
|
+
return this.delegate.listen(target, eventName, callbackWithCdr);
|
|
338
|
+
}
|
|
339
|
+
// if target is DOM node, then we pass that to delegate Renderer
|
|
340
|
+
if (this.store.isDOM(target)) {
|
|
341
|
+
return this.delegate.listen(target, eventName, callbackWithCdr);
|
|
342
|
+
}
|
|
343
|
+
// @ts-expect-error - we know that target is not DOM node
|
|
344
|
+
if (target === this.store.rootScene) {
|
|
345
|
+
let [domTarget, event] = eventName.split(':');
|
|
346
|
+
if (event == null) {
|
|
347
|
+
event = domTarget;
|
|
348
|
+
domTarget = '';
|
|
349
|
+
}
|
|
350
|
+
const eventTarget = domTarget === 'window'
|
|
351
|
+
? target['ownerDocument']['defaultView']
|
|
352
|
+
: target['ownerDocument'];
|
|
353
|
+
return this.delegate.listen(eventTarget, event, callbackWithCdr);
|
|
354
|
+
}
|
|
355
|
+
return () => { };
|
|
356
|
+
}
|
|
357
|
+
get data() {
|
|
358
|
+
return this.delegate.data;
|
|
359
|
+
}
|
|
360
|
+
}
|
|
361
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVuZGVyZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9saWJzL2FuZ3VsYXItdGhyZWUvc3JjL2xpYi9yZW5kZXJlci9yZW5kZXJlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDM0MsT0FBTyxFQUNILGlCQUFpQixFQUNqQixZQUFZLEVBQ1osTUFBTSxFQUNOLFVBQVUsRUFFVixnQkFBZ0IsR0FFbkIsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUM1QixPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDaEQsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBRTNDLE9BQU8sRUFBRSxhQUFhLEVBQUUsT0FBTyxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDM0QsT0FBTyxFQUFFLEVBQUUsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUNqQyxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUNqRSxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFFN0MsT0FBTyxFQUFxQyxnQkFBZ0IsRUFBRSxNQUFNLFNBQVMsQ0FBQztBQUM5RSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsYUFBYSxFQUFFLGlCQUFpQixFQUFFLGdCQUFnQixFQUFFLGVBQWUsRUFBRSxNQUFNLFNBQVMsQ0FBQzs7QUFFaEgsTUFDYSxrQkFBa0I7SUFEL0I7UUFFcUIsNEJBQXVCLEdBQUcsTUFBTSxDQUFDLGdCQUFnQixFQUFFLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7UUFDdkUsY0FBUyxHQUFHLE1BQU0sQ0FBQyxhQUFhLENBQUMsQ0FBQztRQUVsQyxnQkFBVyxHQUFHLElBQUksR0FBRyxFQUFxQixDQUFD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SyxJQUFJLENBQUMsS0FBSyxDQUFDLFNBQVMsRUFBRTtZQUNqQyxJQUFJLENBQUMsU0FBUyxFQUFFLEtBQUssQ0FBQyxHQUFHLFNBQVMsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDOUMsSUFBSSxLQUFLLElBQUksSUFBSSxFQUFFO2dCQUNmLEtBQUssR0FBRyxTQUFTLENBQUM7Z0JBQ2xCLFNBQVMsR0FBRyxFQUFFLENBQUM7YUFDbEI7WUFDRCxNQUFNLFdBQVcsR0FDYixTQUFTLEtBQUssUUFBUTtnQkFDbEIsQ0FBQyxDQUFFLE1BQXVCLENBQUMsZUFBZSxDQUFDLENBQUMsYUFBYSxDQUFDO2dCQUMxRCxDQUFDLENBQUUsTUFBdUIsQ0FBQyxlQUFlLENBQUMsQ0FBQztZQUNwRCxPQUFPLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLFdBQVcsRUFBRSxLQUFLLEVBQUUsZUFBZSxDQUFDLENBQUM7U0FDcEU7UUFFRCxPQUFPLEdBQUcsRUFBRSxHQUFFLENBQUMsQ0FBQztJQUNwQixDQUFDO0lBYUQsSUFBSSxJQUFJO1FBQ0osT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQztJQUM5QixDQUFDO0NBQ0oiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBET0NVTUVOVCB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQge1xuICAgIENoYW5nZURldGVjdG9yUmVmLFxuICAgIGdldERlYnVnTm9kZSxcbiAgICBpbmplY3QsXG4gICAgSW5qZWN0YWJsZSxcbiAgICBSZW5kZXJlcjIsXG4gICAgUmVuZGVyZXJGYWN0b3J5MixcbiAgICBSZW5kZXJlclR5cGUyLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IHRha2UgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IE5HVF9DQVRBTE9HVUUgfSBmcm9tICcuLi9kaS9jYXRhbG9ndWUnO1xuaW1wb3J0IHsgTmd0U3RvcmUgfSBmcm9tICcuLi9zdG9yZXMvc3RvcmUnO1xuaW1wb3J0IHsgTmd0QW55UmVjb3JkIH0gZnJvbSAnLi4vdHlwZXMnO1xuaW1wb3J0IHsgZ2V0TG9jYWxTdGF0ZSwgcHJlcGFyZSB9IGZyb20gJy4uL3V0aWxzL2luc3RhbmNlJztcbmltcG9ydCB7IGlzIH0gZnJvbSAnLi4vdXRpbHMvaXMnO1xuaW1wb3J0IHsgc2FmZURldGVjdENoYW5nZXMgfSBmcm9tICcuLi91dGlscy9zYWZlLWRldGVjdC1jaGFuZ2VzJztcbmltcG9ydCB7IE5HVF9DT01QT1VORF9QUkVGSVhFUyB9IGZyb20gJy4vZGknO1xuaW1wb3J0IHsgTmd0UmVuZGVyZXJDbGFzc0lkIH0gZnJvbSAnLi9lbnVtcyc7XG5pbXBvcnQgeyBOZ3RSZW5kZXJlck5vZGUsIE5ndFJlbmRlcmVyU3RhdGUsIE5ndFJlbmRlcmVyU3RvcmUgfSBmcm9tICcuL3N0b3JlJztcbmltcG9ydCB7IGF0dGFjaFRocmVlQ2hpbGQsIGtlYmFiVG9QYXNjYWwsIHByb2Nlc3NUaHJlZUV2ZW50LCByZW1vdmVUaHJlZUNoaWxkLCBTUEVDSUFMX0RPTV9UQUcgfSBmcm9tICcuL3V0aWxzJztcblxuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIE5ndFJlbmRlcmVyRmFjdG9yeSBpbXBsZW1lbnRzIFJlbmRlcmVyRmFjdG9yeTIge1xuICAgIHByaXZhdGUgcmVhZG9ubHkgZGVsZWdhdGVSZW5kZXJlckZhY3RvcnkgPSBpbmplY3QoUmVuZGVyZXJGYWN0b3J5MiwgeyBza2lwU2VsZjogdHJ1ZSB9KTtcbiAgICBwcml2YXRlIHJlYWRvbmx5IGNhdGFsb2d1ZSA9IGluamVjdChOR1RfQ0FUQUxPR1VFKTtcblxuICAgIHByaXZhdGUgcmVhZG9ubHkgcmVuZGVyZXJNYXAgPSBuZXcgTWFwPHN0cmluZywgUmVuZGVyZXIyPigpO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgcm91dGVkU2V0ID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gICAgLy8gYWxsIFJlbmRlcmVyIGluc3RhbmNlcyBzaGFyZSB0aGUgc2FtZSBTdG9yZVxuICAgIHByaXZhdGUgcmVhZG9ubHkgcmVuZGVyZXJTdG9yZSA9IG5ldyBOZ3RSZW5kZXJlclN0b3JlKHtcbiAgICAgICAgc3RvcmU6IGluamVjdChOZ3RTdG9yZSksXG4gICAgICAgIGNkcjogaW5qZWN0KENoYW5nZURldGVjdG9yUmVmKSxcbiAgICAgICAgcG9ydGFsczogW10sXG4gICAgICAgIGNvbXBvdW5kUHJlZml4ZXM6IGluamVjdChOR1RfQ09NUE9VTkRfUFJFRklYRVMpLFxuICAgICAgICBkb2N1bWVudDogaW5qZWN0KERPQ1VNRU5UKSxcbiAgICB9KTtcblxuICAgIGNyZWF0ZVJlbmRlcmVyKGhvc3RFbGVtZW50OiBhbnksIHR5cGU6IFJlbmRlcmVyVHlwZTIgfCBudWxsKTogUmVuZGVyZXIyIHtcbiAgICAgICAgY29uc3QgZGVsZWdhdGVSZW5kZXJlciA9IHRoaXMuZGVsZWdhdGVSZW5kZXJlckZhY3RvcnkuY3JlYXRlUmVuZGVyZXIoaG9zdEVsZW1lbnQsIHR5cGUpO1xuICAgICAgICBpZiAoIXR5cGUpIHJldHVybiBkZWxlZ2F0ZVJlbmRlcmVyO1xuICAgICAgICBpZiAoKHR5cGUgYXMgTmd0QW55UmVjb3JkKVsndHlwZSddWydpc1JvdXRlZFNjZW5lJ10pIHtcbiAgICAgICAgICAgIHRoaXMucm91dGVkU2V0LmFkZCh0eXBlLmlkKTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgcmVuZGVyZXIgPSB0aGlzLnJlbmRlcmVyTWFwLmdldCh0eXBlLmlkKTtcbiAgICAgICAgaWYgKCFyZW5kZXJlcikge1xuICAgICAgICAgICAgcmVuZGVyZXIgPSBuZXcgTmd0UmVuZGVyZXIoXG4gICAgICAgICAgICAgICAgZGVsZWdhdGVSZW5kZXJlcixcbiAgICAgICAgICAgICAgICB0aGlzLnJlbmRlcmVyU3RvcmUsXG4gICAgICAgICAgICAgICAgdGhpcy5jYXRhbG9ndWUsXG4gICAgICAgICAgICAgICAgLy8gc2V0dGluZyByb290IHNjZW5lIGlmIHRoZXJlJ3Mgbm8gcm91dGVkIHNjZW5lIE9SIHRoaXMgY29tcG9uZW50IGlzIHRoZSByb3V0ZWQgU2NlbmVcbiAgICAgICAgICAgICAgICAhaG9zdEVsZW1lbnQgJiYgKHRoaXMucm91dGVkU2V0LnNpemUgPT09IDAgfHwgdGhpcy5yb3V0ZWRTZXQuaGFzKHR5cGUuaWQpKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHRoaXMucmVuZGVyZXJNYXAuc2V0KHR5cGUuaWQsIHJlbmRlcmVyKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVuZGVyZXI7XG4gICAgfVxufVxuXG4vKipcbiAqIEFueXRoaW5nIGFiYnJldmlhdGVkIHdpdGggclMvUlMgc3RhbmRzIGZvciBSZW5kZXJlclN0YXRlXG4gKi9cbmV4cG9ydCBjbGFzcyBOZ3RSZW5kZXJlciBpbXBsZW1lbnRzIFJlbmRlcmVyMiB7XG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHByaXZhdGUgcmVhZG9ubHkgZGVsZWdhdGU6IFJlbmRlcmVyMixcbiAgICAgICAgcHJpdmF0ZSByZWFkb25seSBzdG9yZTogTmd0UmVuZGVyZXJTdG9yZSxcbiAgICAgICAgcHJpdmF0ZSByZWFkb25seSBjYXRhbG9ndWU6IFJlY29yZDxzdHJpbmcsIG5ldyAoLi4uYXJnczogYW55W10pID0+IGFueT4sXG4gICAgICAgIHByaXZhdGUgcm9vdCA9IHRydWVcbiAgICApIHt9XG5cbiAgICBjcmVhdGVFbGVtZW50KG5hbWU6IHN0cmluZywgbmFtZXNwYWNlPzogc3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZCkge1xuICAgICAgICBjb25zdCBlbGVtZW50ID0gdGhpcy5kZWxlZ2F0ZS5jcmVhdGVFbGVtZW50KG5hbWUsIG5hbWVzcGFjZSk7XG5cbiAgICAgICAgLy8gb24gZmlyc3QgcGFzcywgd2UgcmV0dXJuIHRoZSBSb290IFNjZW5lIGFzIHRoZSByb290IG5vZGVcbiAgICAgICAgaWYgKHRoaXMucm9vdCkge1xuICAgICAgICAgICAgdGhpcy5yb290ID0gZmFsc2U7XG4gICAgICAgICAgICBjb25zdCBub2RlID0gdGhpcy5zdG9yZS5jcmVhdGVOb2RlKCd0aHJlZScsIHRoaXMuc3RvcmUucm9vdFNjZW5lKTtcbiAgICAgICAgICAgIG5vZGUuX19uZ3RfcmVuZGVyZXJfX1tOZ3RSZW5kZXJlckNsYXNzSWQuaW5qZWN0b3JGYWN0b3J5XSA9ICgpID0+IGdldERlYnVnTm9kZShlbGVtZW50KSEuaW5qZWN0b3I7XG4gICAgICAgICAgICByZXR1cm4gbm9kZTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGhhbmRsZSBjb21wb3VuZFxuICAgICAgICBpZiAodGhpcy5zdG9yZS5pc0NvbXBvdW5kKG5hbWUpKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5zdG9yZS5jcmVhdGVOb2RlKCdjb21wb3VuZCcsIGVsZW1lbnQpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gaGFuZGxlIHBvcnRhbFxuICAgICAgICBpZiAobmFtZSA9PT0gU1BFQ0lBTF9ET01fVEFHLk5HVF9QT1JUQUwpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnN0b3JlLmNyZWF0ZU5vZGUoJ3BvcnRhbCcsIGVsZW1lbnQpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gaGFuZGxlIHJhdyB2YWx1ZVxuICAgICAgICBpZiAobmFtZSA9PT0gU1BFQ0lBTF9ET01fVEFHLk5HVF9WQUxVRSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuc3RvcmUuY3JlYXRlTm9kZShcbiAgICAgICAgICAgICAgICAndGhyZWUnLFxuICAgICAgICAgICAgICAgIE9iamVjdC5hc3NpZ24oeyBfX25ndF9yZW5kZXJlcl9fOiB7IHJhd1ZhbHVlOiB1bmRlZmluZWQgfSB9LCB7IF9fbmd0X186IHsgaXNSYXc6IHRydWUgfSB9KVxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHsgaW5qZWN0ZWRBcmdzLCBpbmplY3RlZFBhcmVudCwgc3RvcmUgfSA9IHRoaXMuc3RvcmUuZ2V0Q3JlYXRpb25TdGF0ZSgpO1xuXG4gICAgICAgIGxldCBwYXJlbnQgPSBpbmplY3RlZFBhcmVudCBhcyBOZ3RSZW5kZXJlclN0YXRlW05ndFJlbmRlcmVyQ2xhc3NJZC5pbmplY3RlZFBhcmVudF07XG4gICAgICAgIGlmICh0eXBlb2YgaW5qZWN0ZWRQYXJlbnQgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICBwYXJlbnQgPSBzdG9yZVxuICAgICAgICAgICAgICAgIC5nZXQoJ3NjZW5lJylcbiAgICAgICAgICAgICAgICAuZ2V0T2JqZWN0QnlOYW1lKGluamVjdGVkUGFyZW50KSBhcyB1bmtub3duIGFzIE5ndFJlbmRlcmVyU3RhdGVbTmd0UmVuZGVyZXJDbGFzc0lkLmluamVjdGVkUGFyZW50XTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGhhbmRsZSBwcmltaXRpdmVcbiAgICAgICAgaWYgKG5hbWUgPT09IFNQRUNJQUxfRE9NX1RBRy5OR1RfUFJJTUlUSVZFKSB7XG4gICAgICAgICAgICBpZiAoIWluamVjdGVkQXJnc1swXSkgdGhyb3cgbmV3IEVycm9yKGBbTkdUXSBuZ3QtcHJpbWl0aXZlIHdpdGhvdXQgYXJncyBpcyBpbnZhbGlkYCk7XG4gICAgICAgICAgICBjb25zdCBvYmplY3QgPSBpbmplY3RlZEFyZ3NbMF07XG4gICAgICAgICAgICBsZXQgbG9jYWxTdGF0ZSA9IGdldExvY2FsU3RhdGUob2JqZWN0KTtcbiAgICAgICAgICAgIGlmICghT2JqZWN0LmtleXMobG9jYWxTdGF0ZSkubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgcHJlcGFyZShvYmplY3QsIHsgc3RvcmUsIGFyZ3M6IGluamVjdGVkQXJncywgcHJpbWl0aXZlOiB0cnVlIH0pO1xuICAgICAgICAgICAgICAgIGxvY2FsU3RhdGUgPSBnZXRMb2NhbFN0YXRlKG9iamVjdCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIWxvY2FsU3RhdGUuc3RvcmUpIGxvY2FsU3RhdGUuc3RvcmUgPSBzdG9yZTtcbiAgICAgICAgICAgIGNvbnN0IG5vZGUgPSB0aGlzLnN0b3JlLmNyZWF0ZU5vZGUoJ3RocmVlJywgb2JqZWN0KTtcbiAgICAgICAgICAgIGlmIChwYXJlbnQpIHtcbiAgICAgICAgICAgICAgICBub2RlLl9fbmd0X3JlbmRlcmVyX19bTmd0UmVuZGVyZXJDbGFzc0lkLmluamVjdGVkUGFyZW50XSA9IHBhcmVudDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBub2RlO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgdGhyZWVUYWcgPSBuYW1lLnN0YXJ0c1dpdGgoJ25ndCcpID8gbmFtZS5zbGljZSg0KSA6IG5hbWU7XG4gICAgICAgIGNvbnN0IHRocmVlTmFtZSA9IGtlYmFiVG9QYXNjYWwodGhyZWVUYWcpO1xuICAgICAgICBjb25zdCB0aHJlZVRhcmdldCA9IHRoaXMuY2F0YWxvZ3VlW3RocmVlTmFtZV07XG4gICAgICAgIC8vIHdlIGhhdmUgdGhlIFRIUkVFIGNvbnN0cnVjdG9yIGhlcmUsIGhhbmRsZSBpdFxuICAgICAgICBpZiAodGhyZWVUYXJnZXQpIHtcbiAgICAgICAgICAgIGNvbnN0IGluc3RhbmNlID0gcHJlcGFyZShuZXcgdGhyZWVUYXJnZXQoLi4uaW5qZWN0ZWRBcmdzKSwgeyBzdG9yZSwgYXJnczogaW5qZWN0ZWRBcmdzIH0pO1xuICAgICAgICAgICAgY29uc3Qgbm9kZSA9IHRoaXMuc3RvcmUuY3JlYXRlTm9kZSgndGhyZWUnLCBpbnN0YW5jZSk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFN0YXRlID0gZ2V0TG9jYWxTdGF0ZShpbnN0YW5jZSk7XG5cbiAgICAgICAgICAgIC8vIGF1dG8tYXR0YWNoIGZvciBnZW9tZXRyeSBhbmQgbWF0ZXJpYWxcbiAgICAgICAgICAgIGlmIChpcy5nZW9tZXRyeShpbnN0YW5jZSkpIHtcbiAgICAgICAgICAgICAgICBsb2NhbFN0YXRlLmF0dGFjaCA9IFsnZ2VvbWV0cnknXTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaXMubWF0ZXJpYWwoaW5zdGFuY2UpKSB7XG4gICAgICAgICAgICAgICAgbG9jYWxTdGF0ZS5hdHRhY2ggPSBbJ21hdGVyaWFsJ107XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChwYXJlbnQpIHtcbiAgICAgICAgICAgICAgICBub2RlLl9fbmd0X3JlbmRlcmVyX19bTmd0UmVuZGVyZXJDbGFzc0lkLmluamVjdGVkUGFyZW50XSA9IHBhcmVudDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIG5vZGU7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcy5zdG9yZS5jcmVhdGVOb2RlKCdkb20nLCBlbGVtZW50KTtcbiAgICB9XG5cbiAgICBjcmVhdGVDb21tZW50KHZhbHVlOiBzdHJpbmcpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc3RvcmUuY3JlYXRlTm9kZSgnY29tbWVudCcsIHRoaXMuZGVsZWdhdGUuY3JlYXRlQ29tbWVudCh2YWx1ZSkpO1xuICAgIH1cblxuICAgIGFwcGVuZENoaWxkKHBhcmVudDogTmd0UmVuZGVyZXJOb2RlLCBuZXdDaGlsZDogTmd0UmVuZGVyZXJOb2RlKTogdm9pZCB7XG4gICAgICAgIC8vIFRPRE86IGp1c3QgaWdub3JlIHRleHQgbm9kZSBmb3Igbm93XG4gICAgICAgIGlmIChuZXdDaGlsZCBpbnN0YW5jZW9mIFRleHQpIHJldHVybjtcbiAgICAgICAgY29uc3QgY1JTID0gbmV3Q2hpbGQuX19uZ3RfcmVuZGVyZXJfXztcbiAgICAgICAgY29uc3QgcFJTID0gcGFyZW50Ll9fbmd0X3JlbmRlcmVyX187XG5cbiAgICAgICAgaWYgKGNSU1tOZ3RSZW5kZXJlckNsYXNzSWQudHlwZV0gPT09ICdjb21tZW50Jykge1xuICAgICAgICAgICAgdGhpcy5zdG9yZS5zZXRQYXJlbnQobmV3Q2hpbGQsIHBhcmVudCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY1JTW05ndFJlbmRlcmVyQ2xhc3NJZC5pbmplY3RlZFBhcmVudF0pIHtcbiAgICAgICAgICAgIGlmIChpcy5yZWYoY1JTW05ndFJlbmRlcmVyQ2xhc3NJZC5pbmplY3RlZFBhcmVudF0pKSB7XG4gICAgICAgICAgICAgICAgY1JTW05ndFJlbmRlcmVyQ2xhc3NJZC5pbmplY3RlZFBhcmVudF0uJC5waXBlKHRha2UoMSkpLnN1YnNjcmliZSgodmFsKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh2YWwgIT09IHBhcmVudCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5hcHBlbmRDaGlsZCh2YWwsIG5ld0NoaWxkKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAocGFyZW50ICE9PSBjUlNbTmd0UmVuZGVyZXJDbGFzc0lkLmluamVjdGVkUGFyZW50XSkge1xuICAgICAgICAgICAgICAgIHRoaXMuYXBwZW5kQ2hpbGQoY1JTW05ndFJlbmRlcmVyQ2xhc3NJZC5pbmplY3RlZFBhcmVudF0sIG5ld0NoaWxkKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnN0b3JlLnNldFBhcmVudChuZXdDaGlsZCwgcGFyZW50KTtcbiAgICAgICAgdGhpcy5zdG9yZS5hZGRDaGlsZChwYXJlbnQsIG5ld0NoaWxkKTtcblxuICAgICAgICAvLyBpZiBuZXcgY2hpbGQgaXMgYSBwb3J0YWxcbiAgICAgICAgaWYgKGNSU1tOZ3RSZW5kZXJlckNsYXNzSWQudHlwZV0gPT09ICdwb3J0YWwnKSB7XG4gICAgICAgICAgICB0aGlzLnN0b3JlLnByb2Nlc3NQb3J0YWxDb250YWluZXIobmV3Q2hpbGQpO1xuICAgICAgICAgICAgaWYgKGNSU1tOZ3RSZW5kZXJlckNsYXNzSWQucG9ydGFsQ29udGFpbmVyXSkge1xuICAgICAgICAgICAgICAgIHRoaXMuYXBwZW5kQ2hpbGQocGFyZW50LCBjUlNbTmd0UmVuZGVyZXJDbGFzc0lkLnBvcnRhbENvbnRhaW5lcl0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gaWYgcGFyZW50IGlzIGEgcG9ydGFsXG4gICAgICAgIGlmIChwUlNbTmd0UmVuZGVyZXJDbGFzc0lkLnR5cGVdID09PSAncG9ydGFsJykge1xuICAgICAgICAgICAgdGhpcy5zdG9yZS5wcm9jZXNzUG9ydGFsQ29udGFpbmVyKHBhcmVudCk7XG4gICAgICAgICAgICBpZiAocFJTW05ndFJlbmRlcmVyQ2xhc3NJZC5wb3J0YWxDb250YWluZXJdKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5hcHBlbmRDaGlsZChwUlNbTmd0UmVuZGVyZXJDbGFzc0lkLnBvcnRhbENvbnRhaW5lcl0sIG5ld0NoaWxkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGlmIGJvdGggYXJlIHRocmVlIGluc3RhbmNlcywgc3RyYWlnaHRmb3J3YXJkIGNhc2VcbiAgICAgICAgaWYgKHBSU1tOZ3RSZW5kZXJlckNsYXNzSWQudHlwZV0gPT09ICd0aHJlZScgJiYgY1JTW05ndFJlbmRlcmVyQ2xhc3NJZC50eXBlXSA9PT0gJ3RocmVlJykge1xuICAgICAgICAgICAgLy8gaWYgY2hpbGQgYWxyZWFkeSBhdHRhY2hlZCB0byBhIHBhcmVudCwgc2tpcFxuICAgICAgICAgICAgaWYgKGdldExvY2FsU3RhdGUobmV3Q2hpbGQpLnBhcmVudCkgcmV0dXJuO1xuICAgICAgICAgICAgLy8gYXR0YWNoIFRIUkVFIGNoaWxkXG4gICAgICAgICAgICBhdHRhY2hUaHJlZUNoaWxkKHBhcmVudCwgbmV3Q2hpbGQpO1xuICAgICAgICAgICAgLy8gaGVyZSwgd2UgaGFuZGxlIHRoZSBzcGVjaWFsIGNhc2Ugb2YgaWYgdGhlIHBhcmVudCBoYXMgYSBjb21wb3VuZFBhcmVudCwgd2hpY2ggbWVhbnMgdGhpcyBjaGlsZCBpcyBwYXJ0IG9mIGEgY29tcG91bmQgcGFyZW50IHRlbXBsYXRlXG4gICAgICAgICAgICBpZiAoIWNSU1tOZ3RSZW5kZXJlckNsYXNzSWQuY29tcG91bmRdKSByZXR1cm47XG4gICAgICAgICAgICBjb25zdCBjbG9zZXN0R3JhbmRwYXJlbnRXaXRoQ29tcG91bmQgPSB0aGlzLnN0b3JlLmdldENsb3Nlc3RQYXJlbnRXaXRoQ29tcG91bmQocGFyZW50KTtcbiAgICAgICAgICAgIGlmICghY2xvc2VzdEdyYW5kcGFyZW50V2l0aENvbXBvdW5kKSByZXR1cm47XG4gICAgICAgICAgICB0aGlzLmFwcGVuZENoaWxkKGNsb3Nlc3RHcmFuZHBhcmVudFdpdGhDb21wb3VuZCwgbmV3Q2hpbGQpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gaWYgb25seSB0aGUgcGFyZW50IGlzIHRoZSBUSFJFRSBpbnN0YW5jZVxuICAgICAgICBpZiAocFJTW05ndFJlbmRlcmVyQ2xhc3NJZC50eXBlXSA9PT0gJ3RocmVlJykge1xuICAgICAgICAgICAgZm9yIChjb25zdCByZW5kZXJDaGlsZCBvZiBjUlNbTmd0UmVuZGVyZXJDbGFzc0lkLmNoaWxkcmVuXSkge1xuICAgICAgICAgICAgICAgIHRoaXMuYXBwZW5kQ2hpbGQocGFyZW50LCByZW5kZXJDaGlsZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBpZiBwYXJlbnQgaXMgYSBjb21wb3VuZFxuICAgICAgICBpZiAocFJTW05ndFJlbmRlcmVyQ2xhc3NJZC50eXBlXSA9PT0gJ2NvbXBvdW5kJykge1xuICAgICAgICAgICAgLy8gaWYgY29tcG91bmQgZG9lc24ndCBoYXZlIGEgVEhSRUUgaW5zdGFuY2Ugc2V0IHlldFxuICAgICAgICAgICAgaWYgKCFwUlNbTmd0UmVuZGVyZXJDbGFzc0lkLmNvbXBvdW5kZWRdICYmIGNSU1tOZ3RSZW5kZXJlckNsYXNzSWQudHlwZV0gPT09ICd0aHJlZScpIHtcbiAgICAgICAgICAgICAgICAvLyBpZiBjaGlsZCBpcyBpbmRlZWQgYW4gbmd0Q29tcG91bmRcbiAgICAgICAgICAgICAgICBpZiAoY1JTW05ndFJlbmRlcmVyQ2xhc3NJZC5jb21wb3VuZF0pIHRoaXMuc3RvcmUuc2V0Q29tcG91bmQocGFyZW50LCBuZXdDaGlsZCk7XG4gICAgICAgICAgICAgICAgLy8gaWYgbm90LCB3ZSB0cmFjayB0aGUgcGFyZW50ICh0aGF0IGlzIHN1cHBvc2VkbHkgdGhlIGNvbXBvdW5kIGNvbXBvbmVudCkgb24gdGhpcyB0aHJlZSBpbnN0YW5jZVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKCFjUlNbTmd0UmVuZGVyZXJDbGFzc0lkLmNvbXBvdW5kUGFyZW50XSkgY1JTW05ndFJlbmRlcmVyQ2xhc3NJZC5jb21wb3VuZFBhcmVudF0gPSBwYXJlbnQ7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIHJlc2V0IHRoZSBjb21wb3VuZCBpZiBpdCdzIGNoYW5nZWRcbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICBwUlNbTmd0UmVuZGVyZXJDbGFzc0lkLmNvbXBvdW5kZWRdICYmXG4gICAgICAgICAgICAgICAgY1JTW05ndFJlbmRlcmVyQ2xhc3NJZC50eXBlXSA9PT0gJ3RocmVlJyAmJlxuICAgICAgICAgICAgICAgIGNSU1tOZ3RSZW5kZXJlckNsYXNzSWQuY29tcG91bmRdICYmXG4gICAgICAgICAgICAgICAgcFJTW05ndFJlbmRlcmVyQ2xhc3NJZC5jb21wb3VuZGVkXSAhPT0gbmV3Q2hpbGRcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIHRoaXMuc3RvcmUuc2V0Q29tcG91bmQocGFyZW50LCBuZXdDaGlsZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBzaG91bGRGaW5kR3JhbmRwYXJlbnRJbnN0YW5jZSA9XG4gICAgICAgICAgICAvLyBpZiBjaGlsZCBpcyB0aHJlZSBidXQgaGF2ZW4ndCBiZWVuIGF0dGFjaGVkIHRvIGEgcGFyZW50IHlldFxuICAgICAgICAgICAgKGNSU1tOZ3RSZW5kZXJlckNsYXNzSWQudHlwZV0gPT09ICd0aHJlZScgJiYgIWdldExvY2FsU3RhdGUobmV3Q2hpbGQpLnBhcmVudCkgfHxcbiAgICAgICAgICAgIC8vIG9yIGJvdGggcGFyZW50IGFuZCBjaGlsZCBhcmUgRE9NIGVsZW1lbnRzXG4gICAgICAgICAgICAvLyBvciB0aGV5IGFyZSBjb21wb3VuZCBBTkQgaGF2ZW4ndCBoYWQgYSBUSFJFRSBpbnN0YW5jZSB5ZXRcbiAgICAgICAgICAgICgocFJTW05ndFJlbmRlcmVyQ2xhc3NJZC50eXBlXSA9PT0gJ2RvbScgfHxcbiAgICAgICAgICAgICAgICAocFJTW05ndFJlbmRlcmVyQ2xhc3NJZC50eXBlXSA9PT0gJ2NvbXBvdW5kJyAmJiAhcFJTW05ndFJlbmRlcmVyQ2xhc3NJZC5jb21wb3VuZGVkXSkpICYmXG4gICAgICAgICAgICAgICAgKGNSU1tOZ3RSZW5kZXJlckNsYXNzSWQudHlwZV0gPT09ICdkb20nIHx8XG4gICAgICAgICAgICAgICAgICAgIChjUlNbTmd0UmVuZGVyZXJDbGFzc0lkLnR5cGVdID09PSAnY29tcG91bmQnICYmICFjUlNbTmd0UmVuZGVyZXJDbGFzc0lkLmNvbXBvdW5kZWRdKSkpO1xuXG4gICAgICAgIGlmIChzaG91bGRGaW5kR3JhbmRwYXJlbnRJbnN0YW5jZSkge1xuICAgICAgICAgICAgLy8gd2UnbGwgdHJ5IHRvIGdldCB0aGUgZ3JhbmRwYXJlbnQgaW5zdGFuY2UgaGVyZSBzbyB0aGF0IHdlIGNhbiBydW4gYXBwZW5kQ2hpbGQgd2l0aCBib3RoIGluc3RhbmNlc1xuICAgICAgICAgICAgY29uc3QgY2xvc2VzdEdyYW5kcGFyZW50SW5zdGFuY2UgPSB0aGlzLnN0b3JlLmdldENsb3Nlc3RQYXJlbnRXaXRoSW5zdGFuY2UocGFyZW50KTtcbiAgICAgICAgICAgIGlmIChjbG9zZXN0R3JhbmRwYXJlbnRJbnN0YW5jZSkgdGhpcy5hcHBlbmRDaGlsZChjbG9zZXN0R3JhbmRwYXJlbnRJbnN0YW5jZSwgbmV3Q2hpbGQpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgaW5zZXJ0QmVmb3JlKFxuICAgICAgICBwYXJlbnQ6IE5ndFJlbmRlcmVyTm9kZSxcbiAgICAgICAgbmV3Q2hpbGQ6IE5ndFJlbmRlcmVyTm9kZVxuICAgICAgICAvLyBUT0RPICB3ZSBtaWdodCBuZWVkIHRoZXNlP1xuICAgICAgICAvLyByZWZDaGlsZDogTmd0UmVuZGVyZXJOb2RlXG4gICAgICAgIC8vIGlzTW92ZT86IGJvb2xlYW4gfCB1bmRlZmluZWRcbiAgICApOiB2b2lkIHtcbiAgICAgICAgaWYgKHBhcmVudCA9PSBudWxsIHx8ICFwYXJlbnQuX19uZ3RfcmVuZGVyZXJfXyB8fCBwYXJlbnQgPT09IG5ld0NoaWxkKSByZXR1cm47XG4gICAgICAgIHRoaXMuYXBwZW5kQ2hpbGQocGFyZW50LCBuZXdDaGlsZCk7XG4gICAgfVxuXG4gICAgcmVtb3ZlQ2hpbGQocGFyZW50OiBOZ3RSZW5kZXJlck5vZGUsIG9sZENoaWxkOiBOZ3RSZW5kZXJlck5vZGUsIGlzSG9zdEVsZW1lbnQ/OiBib29sZWFuIHwgdW5kZWZpbmVkKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHBSUyA9IHBhcmVudC5fX25ndF9yZW5kZXJlcl9fO1xuICAgICAgICBjb25zdCBjUlMgPSBvbGRDaGlsZC5fX25ndF9yZW5kZXJlcl9fO1xuICAgICAgICBpZiAocFJTW05ndFJlbmRlcmVyQ2xhc3NJZC50eXBlXSA9PT0gJ3RocmVlJyAmJiBjUlNbTmd0UmVuZGVyZXJDbGFzc0lkLnR5cGVdID09PSAndGhyZWUnKSB7XG4gICAgICAgICAgICByZW1vdmVUaHJlZUNoaWxkKHBhcmVudCwgb2xkQ2hpbGQsIHRydWUpO1xuICAgICAgICAgICAgdGhpcy5zdG9yZS5kZXN0cm95KG9sZENoaWxkLCBwYXJlbnQpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHBSU1tOZ3RSZW5kZXJlckNsYXNzSWQudHlwZV0gPT09ICdjb21wb3VuZCcgJiYgcFJTW05ndFJlbmRlcmVyQ2xhc3NJZC5wYXJlbnRdKSB7XG4gICAgICAgICAgICB0aGlzLnJlbW92ZUNoaWxkKHBSU1tOZ3RSZW5kZXJlckNsYXNzSWQucGFyZW50XSwgb2xkQ2hpbGQsIGlzSG9zdEVsZW1lbnQpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHBSU1tOZ3RSZW5kZXJlckNsYXNzSWQudHlwZV0gPT09ICd0aHJlZScpIHtcbiAgICAgICAgICAgIHRoaXMuc3RvcmUuZGVzdHJveShvbGRDaGlsZCwgcGFyZW50KTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGNsb3Nlc3RHcmFuZHBhcmVudEluc3RhbmNlID0gdGhpcy5zdG9yZS5nZXRDbG9zZXN0UGFyZW50V2l0aEluc3RhbmNlKHBhcmVudCk7XG4gICAgICAgIGlmIChjbG9zZXN0R3JhbmRwYXJlbnRJbnN0YW5jZSkgdGhpcy5yZW1vdmVDaGlsZChjbG9zZXN0R3JhbmRwYXJlbnRJbnN0YW5jZSwgb2xkQ2hpbGQsIGlzSG9zdEVsZW1lbnQpO1xuICAgICAgICB0aGlzLnN0b3JlLmRlc3Ryb3kob2xkQ2hpbGQsIGNsb3Nlc3RHcmFuZHBhcmVudEluc3RhbmNlIGFzIE5ndFJlbmRlcmVyTm9kZSk7XG4gICAgfVxuXG4gICAgcGFyZW50Tm9kZShub2RlOiBOZ3RSZW5kZXJlck5vZGUpIHtcbiAgICAgICAgY29uc3QgclMgPSBub2RlLl9fbmd0X3JlbmRlcmVyX187XG4gICAgICAgIGlmIChyUz8uW05ndFJlbmRlcmVyQ2xhc3NJZC5wYXJlbnRdKSByZXR1cm4gclNbTmd0UmVuZGVyZXJDbGFzc0lkLnBhcmVudF07XG4gICAgICAgIHJldHVybiB0aGlzLmRlbGVnYXRlLnBhcmVudE5vZGUobm9kZSk7XG4gICAgfVxuXG4gICAgc2V0QXR0cmlidXRlKGVsOiBOZ3RSZW5kZXJlck5vZGUsIG5hbWU6IHN0cmluZywgdmFsdWU6IHN0cmluZywgbmFtZXNwYWNlPzogc3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZCk6IHZvaWQge1xuICAgICAgICBjb25zdCByUyA9IGVsLl9fbmd0X3JlbmRlcmVyX187XG4gICAgICAgIGlmIChyU1tOZ3RSZW5kZXJlckNsYXNzSWQudHlwZV0gPT09ICdjb21wb3VuZCcpIHtcbiAgICAgICAgICAgIC8vIHdlIGRvbid0IGhhdmUgdGhlIGNvbXBvdW5kIGluc3RhbmNlIHlldFxuICAgICAgICAgICAgclNbTmd0UmVuZGVyZXJDbGFzc0lkLmF0dHJpYnV0ZXNdW25hbWVdID0gdmFsdWU7XG4gICAgICAgICAgICBpZiAoIXJTW05ndFJlbmRlcmVyQ2xhc3NJZC5jb21wb3VuZGVkXSkge1xuICAgICAgICAgICAgICAgIHRoaXMuc3RvcmUucXVldWVPcGVyYXRpb24oZWwsIFsnb3AnLCAoKSA9PiB0aGlzLnNldEF0dHJpYnV0ZShlbCwgbmFtZSwgdmFsdWUsIG5hbWVzcGFjZSldKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMuc2V0QXR0cmlidXRlKHJTW05ndFJlbmRlcmVyQ2xhc3NJZC5jb21wb3VuZGVkXSwgbmFtZSwgdmFsdWUsIG5hbWVzcGFjZSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoclNbTmd0UmVuZGVyZXJDbGFzc0lkLnR5cGVdID09PSAndGhyZWUnKSB0aGlzLnN0b3JlLmFwcGx5QXR0cmlidXRlKGVsLCBuYW1lLCB2YWx1ZSk7XG4gICAgfVxuXG4gICAgc2V0UHJvcGVydHkoZWw6IE5ndFJlbmRlcmVyTm9kZSwgbmFtZTogc3RyaW5nLCB2YWx1ZTogYW55KTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHJTID0gZWwuX19uZ3RfcmVuZGVyZXJfXztcbiAgICAgICAgaWYgKHJTW05ndFJlbmRlcmVyQ2xhc3NJZC50eXBlXSA9PT0gJ2NvbXBvdW5kJykge1xuICAgICAgICAgICAgLy8gd2UgZG9uJ3QgaGF2ZSB0aGUgY29tcG91bmQgaW5zdGFuY2UgeWV0XG4gICAgICAgICAgICByU1tOZ3RSZW5kZXJlckNsYXNzSWQucHJvcGVydGllc11bbmFtZV0gPSB2YWx1ZTtcbiAgICAgICAgICAgIGlmICghclNbTmd0UmVuZGVyZXJDbGFzc0lkLmNvbXBvdW5kZWRdKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zdG9yZS5xdWV1ZU9wZXJhdGlvbihlbCwgWydvcCcsICgpID0+IHRoaXMuc2V0UHJvcGVydHkoZWwsIG5hbWUsIHZhbHVlKV0pO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHJTW05ndFJlbmRlcmVyQ2xhc3NJZC5jb21wb3VuZGVkXS5fX25ndF9yZW5kZXJlcl9fW05ndFJlbmRlcmVyQ2xhc3NJZC5jb21wb3VuZF0pIHtcbiAgICAgICAgICAgICAgICBPYmplY3QuYXNzaWduKHJTW05ndFJlbmRlcmVyQ2xhc3NJZC5jb21wb3VuZGVkXS5fX25ndF9yZW5kZXJlcl9fW05ndFJlbmRlcmVyQ2xhc3NJZC5jb21wb3VuZF0sIHtcbiAgICAgICAgICAgICAgICAgICAgcHJvcHM6IE9iamVjdC5hc3NpZ24oXG4gICAgICAgICAgICAgICAgICAgICAgICByU1tOZ3RSZW5kZXJlckNsYXNzSWQuY29tcG91bmRlZF0uX19uZ3RfcmVuZGVyZXJfX1tOZ3RSZW5kZXJlckNsYXNzSWQuY29tcG91bmRdLFxuICAgICAgICAgICAgICAgICAgICAgICAgeyBbbmFtZV06IHZhbHVlIH1cbiAgICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuc2V0UHJvcGVydHkoclNbTmd0UmVuZGVyZXJDbGFzc0lkLmNvbXBvdW5kZWRdLCBuYW1lLCB2YWx1ZSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoclNbTmd0UmVuZGVyZXJDbGFzc0lkLnR5cGVdID09PSAndGhyZWUnKSB0aGlzLnN0b3JlLmFwcGx5UHJvcGVydHkoZWwsIG5hbWUsIHZhbHVlKTtcbiAgICB9XG5cbiAgICBsaXN0ZW4odGFyZ2V0OiBOZ3RSZW5kZXJlck5vZGUsIGV2ZW50TmFtZTogc3RyaW5nLCBjYWxsYmFjazogKGV2ZW50OiBhbnkpID0+IGJvb2xlYW4gfCB2b2lkKTogKCkgPT4gdm9pZCB7XG4gICAgICAgIGNvbnN0IHJTID0gdGFyZ2V0Ll9fbmd0X3JlbmRlcmVyX187XG4gICAgICAgIGNvbnN0IHRhcmdldENkciA9IHJTPy5bTmd0UmVuZGVyZXJDbGFzc0lkLmluamVjdG9yRmFjdG9yeV0/LigpLmdldChDaGFuZ2VEZXRlY3RvclJlZiwgbnVsbCk7XG5cbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgclNbTmd0UmVuZGVyZXJDbGFzc0lkLnR5cGVdID09PSAndGhyZWUnIHx8XG4gICAgICAgICAgICAoclNbTmd0UmVuZGVyZXJDbGFzc0lkLnR5cGVdID09PSAnY29tcG91bmQnICYmIHJTW05ndFJlbmRlcmVyQ2xhc3NJZC5jb21wb3VuZGVkXSlcbiAgICAgICAgKSB7XG4gICAgICAgICAgICBjb25zdCBpbnN0YW5jZSA9IHJTW05ndFJlbmRlcmVyQ2xhc3NJZC5jb21wb3VuZGVkXSB8fCB0YXJnZXQ7XG4gICAgICAgICAgICBjb25zdCBwcmlvcml0eSA9IGdldExvY2FsU3RhdGUodGFyZ2V0KS5wcmlvcml0eTtcbiAgICAgICAgICAgIHJldHVybiBwcm9jZXNzVGhyZWVFdmVudChpbnN0YW5jZSwgcHJpb3JpdHkgfHwgMCwgZXZlbnROYW1lLCBjYWxsYmFjaywgdGhpcy5zdG9yZS5yb290Q2RyLCB0YXJnZXRDZHIhKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChyU1tOZ3RSZW5kZXJlckNsYXNzSWQudHlwZV0gPT09ICdjb21wb3VuZCcgJiYgIXJTW05ndFJlbmRlcmVyQ2xhc3NJZC5jb21wb3VuZGVkXSkge1xuICAgICAgICAgICAgdGhpcy5zdG9yZS5xdWV1ZU9wZXJhdGlvbih0YXJnZXQsIFtcbiAgICAgICAgICAgICAgICAnb3AnLFxuICAgICAgICAgICAgICAgICgpID0+IHRoaXMuc3RvcmUucXVldWVPcGVyYXRpb24odGFyZ2V0LCBbJ2NsZWFuVXAnLCB0aGlzLmxpc3Rlbih0YXJnZXQsIGV2ZW50TmFtZSwgY2FsbGJhY2spXSksXG4gICAgICAgICAgICBdKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHNldHVwIGEgbmV3IGNhbGxiYWNrIHdpdGggQ0RSIHNvIHRoYXQgaXQgd2lsbCB0cmlnZ2VyIGNoYW5nZSBkZXRlY3Rpb24gcHJvcGVybHlcbiAgICAgICAgY29uc3QgY2FsbGJhY2tXaXRoQ2RyID0gKGV2ZW50OiBhbnkpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gY2FsbGJhY2soZXZlbnQpO1xuICAgICAgICAgICAgc2FmZURldGVjdENoYW5nZXModGFyZ2V0Q2RyKTtcbiAgICAgICAgICAgIHNhZmVEZXRlY3RDaGFuZ2VzKHRoaXMuc3RvcmUucm9vdENkcik7XG4gICAgICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICAgIH07XG5cbiAgICAgICAgLy8gaWYgdGhlIHRhcmdldCBkb2Vzbid0IGhhdmUgX19uZ3RfcmVuZGVyZXJfXywgd2UgZGVsZWdhdGVcbiAgICAgICAgaWYgKCFyUykge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZGVsZWdhdGUubGlzdGVuKHRhcmdldCwgZXZlbnROYW1lLCBjYWxsYmFja1dpdGhDZHIpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gaWYgdGFyZ2V0IGlzIERPTSBub2RlLCB0aGVuIHdlIHBhc3MgdGhhdCB0byBkZWxlZ2F0ZSBSZW5kZXJlclxuICAgICAgICBpZiAodGhpcy5zdG9yZS5pc0RPTSh0YXJnZXQpKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5kZWxlZ2F0ZS5saXN0ZW4odGFyZ2V0LCBldmVudE5hbWUsIGNhbGxiYWNrV2l0aENkcik7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIC0gd2Uga25vdyB0aGF0IHRhcmdldCBpcyBub3QgRE9NIG5vZGVcbiAgICAgICAgaWYgKHRhcmdldCA9PT0gdGhpcy5zdG9yZS5yb290U2NlbmUpIHtcbiAgICAgICAgICAgIGxldCBbZG9tVGFyZ2V0LCBldmVudF0gPSBldmVudE5hbWUuc3BsaXQoJzonKTtcbiAgICAgICAgICAgIGlmIChldmVudCA9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgZXZlbnQgPSBkb21UYXJnZXQ7XG4gICAgICAgICAgICAgICAgZG9tVGFyZ2V0ID0gJyc7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBldmVudFRhcmdldCA9XG4gICAgICAgICAgICAgICAgZG9tVGFyZ2V0ID09PSAnd2luZG93J1xuICAgICAgICAgICAgICAgICAgICA/ICh0YXJnZXQgYXMgTmd0QW55UmVjb3JkKVsnb3duZXJEb2N1bWVudCddWydkZWZhdWx0VmlldyddXG4gICAgICAgICAgICAgICAgICAgIDogKHRhcmdldCBhcyBOZ3RBbnlSZWNvcmQpWydvd25lckRvY3VtZW50J107XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5kZWxlZ2F0ZS5saXN0ZW4oZXZlbnRUYXJnZXQsIGV2ZW50LCBjYWxsYmFja1dpdGhDZHIpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuICgpID0+IHt9O1xuICAgIH1cblxuICAgIGNyZWF0ZVRleHQgPSB0aGlzLmRlbGVnYXRlLmNyZWF0ZVRleHQuYmluZCh0aGlzLmRlbGVnYXRlKTtcbiAgICBkZXN0cm95ID0gdGhpcy5kZWxlZ2F0ZS5kZXN0cm95LmJpbmQodGhpcy5kZWxlZ2F0ZSk7XG4gICAgZGVzdHJveU5vZGU6ICgobm9kZTogYW55KSA9PiB2b2lkKSB8IG51bGwgPSBudWxsO1xuICAgIHNlbGVjdFJvb3RFbGVtZW50ID0gdGhpcy5kZWxlZ2F0ZS5zZWxlY3RSb290RWxlbWVudC5iaW5kKHRoaXMuZGVsZWdhdGUpO1xuICAgIG5leHRTaWJsaW5nID0gdGhpcy5kZWxlZ2F0ZS5uZXh0U2libGluZy5iaW5kKHRoaXMuZGVsZWdhdGUpO1xuICAgIHJlbW92ZUF0dHJpYnV0ZSA9IHRoaXMuZGVsZWdhdGUucmVtb3ZlQXR0cmlidXRlLmJpbmQodGhpcy5kZWxlZ2F0ZSk7XG4gICAgYWRkQ2xhc3MgPSB0aGlzLmRlbGVnYXRlLmFkZENsYXNzLmJpbmQodGhpcy5kZWxlZ2F0ZSk7XG4gICAgcmVtb3ZlQ2xhc3MgPSB0aGlzLmRlbGVnYXRlLnJlbW92ZUNsYXNzLmJpbmQodGhpcy5kZWxlZ2F0ZSk7XG4gICAgc2V0U3R5bGUgPSB0aGlzLmRlbGVnYXRlLnNldFN0eWxlLmJpbmQodGhpcy5kZWxlZ2F0ZSk7XG4gICAgcmVtb3ZlU3R5bGUgPSB0aGlzLmRlbGVnYXRlLnJlbW92ZVN0eWxlLmJpbmQodGhpcy5kZWxlZ2F0ZSk7XG4gICAgc2V0VmFsdWUgPSB0aGlzLmRlbGVnYXRlLnNldFZhbHVlLmJpbmQodGhpcy5kZWxlZ2F0ZSk7XG4gICAgZ2V0IGRhdGEoKTogeyBba2V5OiBzdHJpbmddOiBhbnkgfSB7XG4gICAgICAgIHJldHVybiB0aGlzLmRlbGVnYXRlLmRhdGE7XG4gICAgfVxufVxuIl19
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { Component } from '@angular/core';
|
|
2
|
+
import { ActivationEnd, Router, RouterOutlet } from '@angular/router';
|
|
3
|
+
import { filter, takeUntil } from 'rxjs';
|
|
4
|
+
import { injectNgtDestroy } from './di/destroy';
|
|
5
|
+
import { safeDetectChanges } from './utils/safe-detect-changes';
|
|
6
|
+
import * as i0 from "@angular/core";
|
|
7
|
+
import * as i1 from "@angular/router";
|
|
8
|
+
class NgtRoutedScene {
|
|
9
|
+
static { this.isRoutedScene = true; }
|
|
10
|
+
constructor(router) {
|
|
11
|
+
const { destroy$, cdr } = injectNgtDestroy();
|
|
12
|
+
router.events
|
|
13
|
+
.pipe(filter((event) => event instanceof ActivationEnd), takeUntil(destroy$))
|
|
14
|
+
.subscribe(() => safeDetectChanges(cdr));
|
|
15
|
+
}
|
|
16
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.0.0", ngImport: i0, type: NgtRoutedScene, deps: [{ token: i1.Router }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
17
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.0.0", type: NgtRoutedScene, isStandalone: true, selector: "ngt-routed-scene", ngImport: i0, template: `<router-outlet />`, isInline: true, dependencies: [{ kind: "directive", type: RouterOutlet, selector: "router-outlet", inputs: ["name"], outputs: ["activate", "deactivate", "attach", "detach"], exportAs: ["outlet"] }] }); }
|
|
18
|
+
}
|
|
19
|
+
export { NgtRoutedScene };
|
|
20
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.0.0", ngImport: i0, type: NgtRoutedScene, decorators: [{
|
|
21
|
+
type: Component,
|
|
22
|
+
args: [{
|
|
23
|
+
standalone: true,
|
|
24
|
+
selector: 'ngt-routed-scene',
|
|
25
|
+
template: `<router-outlet />`,
|
|
26
|
+
imports: [RouterOutlet],
|
|
27
|
+
}]
|
|
28
|
+
}], ctorParameters: function () { return [{ type: i1.Router }]; } });
|
|
29
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGVkLXNjZW5lLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vbGlicy9hbmd1bGFyLXRocmVlL3NyYy9saWIvcm91dGVkLXNjZW5lLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDMUMsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDdEUsT0FBTyxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDekMsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sY0FBYyxDQUFDO0FBQ2hELE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLDZCQUE2QixDQUFDOzs7QUFFaEUsTUFNYSxjQUFjO2FBQ2hCLGtCQUFhLEdBQUcsSUFBSSxBQUFQLENBQVE7SUFFNUIsWUFBWSxNQUFjO1FBQ3RCLE1BQU0sRUFBRSxRQUFRLEVBQUUsR0FBRyxFQUFFLEdBQUcsZ0JBQWdCLEVBQUUsQ0FBQztRQUM3QyxNQUFNLENBQUMsTUFBTTthQUNSLElBQUksQ0FDRCxNQUFNLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLEtBQUssWUFBWSxhQUFhLENBQUMsRUFDakQsU0FBUyxDQUFDLFFBQVEsQ0FBQyxDQUN0QjthQUNBLFNBQVMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQ2pELENBQUM7OEdBWFEsY0FBYztrR0FBZCxjQUFjLDRFQUhiLG1CQUFtQiw0REFDbkIsWUFBWTs7U0FFYixjQUFjOzJGQUFkLGNBQWM7a0JBTjFCLFNBQVM7bUJBQUM7b0JBQ1AsVUFBVSxFQUFFLElBQUk7b0JBQ2hCLFFBQVEsRUFBRSxrQkFBa0I7b0JBQzVCLFFBQVEsRUFBRSxtQkFBbUI7b0JBQzdCLE9BQU8sRUFBRSxDQUFDLFlBQVksQ0FBQztpQkFDMUIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEFjdGl2YXRpb25FbmQsIFJvdXRlciwgUm91dGVyT3V0bGV0IH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcbmltcG9ydCB7IGZpbHRlciwgdGFrZVVudGlsIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBpbmplY3ROZ3REZXN0cm95IH0gZnJvbSAnLi9kaS9kZXN0cm95JztcbmltcG9ydCB7IHNhZmVEZXRlY3RDaGFuZ2VzIH0gZnJvbSAnLi91dGlscy9zYWZlLWRldGVjdC1jaGFuZ2VzJztcblxuQENvbXBvbmVudCh7XG4gICAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgICBzZWxlY3RvcjogJ25ndC1yb3V0ZWQtc2NlbmUnLFxuICAgIHRlbXBsYXRlOiBgPHJvdXRlci1vdXRsZXQgLz5gLFxuICAgIGltcG9ydHM6IFtSb3V0ZXJPdXRsZXRdLFxufSlcbmV4cG9ydCBjbGFzcyBOZ3RSb3V0ZWRTY2VuZSB7XG4gICAgc3RhdGljIGlzUm91dGVkU2NlbmUgPSB0cnVlO1xuXG4gICAgY29uc3RydWN0b3Iocm91dGVyOiBSb3V0ZXIpIHtcbiAgICAgICAgY29uc3QgeyBkZXN0cm95JCwgY2RyIH0gPSBpbmplY3ROZ3REZXN0cm95KCk7XG4gICAgICAgIHJvdXRlci5ldmVudHNcbiAgICAgICAgICAgIC5waXBlKFxuICAgICAgICAgICAgICAgIGZpbHRlcigoZXZlbnQpID0+IGV2ZW50IGluc3RhbmNlb2YgQWN0aXZhdGlvbkVuZCksXG4gICAgICAgICAgICAgICAgdGFrZVVudGlsKGRlc3Ryb3kkKVxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgLnN1YnNjcmliZSgoKSA9PiBzYWZlRGV0ZWN0Q2hhbmdlcyhjZHIpKTtcbiAgICB9XG59XG4iXX0=
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
import { Injectable } from '@angular/core';
|
|
2
|
+
import { RxState } from '@rx-angular/state';
|
|
3
|
+
import { combineLatest, startWith, tap } from 'rxjs';
|
|
4
|
+
import { is } from '../utils/is';
|
|
5
|
+
import { safeDetectChanges } from '../utils/safe-detect-changes';
|
|
6
|
+
import * as i0 from "@angular/core";
|
|
7
|
+
export const startWithUndefined = () => startWith(undefined);
|
|
8
|
+
/**
|
|
9
|
+
* An extended `tap` operator that accepts an `effectFn` which:
|
|
10
|
+
* - runs on every `next` notification from `source$`
|
|
11
|
+
* - can optionally return a `cleanUp` function that
|
|
12
|
+
* invokes from the 2nd `next` notification onward and on `unsubscribe` (destroyed)
|
|
13
|
+
*
|
|
14
|
+
* @example
|
|
15
|
+
* ```typescript
|
|
16
|
+
* source$.pipe(
|
|
17
|
+
* tapEffect((sourceValue) = {
|
|
18
|
+
* const cb = () => {
|
|
19
|
+
* doStuff(sourceValue);
|
|
20
|
+
* };
|
|
21
|
+
* addListener('event', cb);
|
|
22
|
+
*
|
|
23
|
+
* return () => {
|
|
24
|
+
* removeListener('event', cb);
|
|
25
|
+
* }
|
|
26
|
+
* })
|
|
27
|
+
* )
|
|
28
|
+
* ```
|
|
29
|
+
*/
|
|
30
|
+
export function tapEffect(effectFn) {
|
|
31
|
+
let cleanupFn = () => { };
|
|
32
|
+
let firstRun = false;
|
|
33
|
+
let prev = undefined;
|
|
34
|
+
const teardown = (error) => () => {
|
|
35
|
+
if (cleanupFn)
|
|
36
|
+
cleanupFn({ prev, complete: true, error });
|
|
37
|
+
};
|
|
38
|
+
return tap({
|
|
39
|
+
next: (value) => {
|
|
40
|
+
if (cleanupFn && firstRun)
|
|
41
|
+
cleanupFn({ prev, complete: false, error: false });
|
|
42
|
+
const cleanUpOrVoid = effectFn(value);
|
|
43
|
+
if (cleanUpOrVoid)
|
|
44
|
+
cleanupFn = cleanUpOrVoid;
|
|
45
|
+
prev = value;
|
|
46
|
+
if (!firstRun)
|
|
47
|
+
firstRun = true;
|
|
48
|
+
},
|
|
49
|
+
complete: teardown(false),
|
|
50
|
+
unsubscribe: teardown(false),
|
|
51
|
+
error: teardown(true),
|
|
52
|
+
});
|
|
53
|
+
}
|
|
54
|
+
class NgtRxStore extends RxState {
|
|
55
|
+
constructor() {
|
|
56
|
+
super();
|
|
57
|
+
// set a dummy property so that initial this.get() won't return undefined
|
|
58
|
+
this.set({ __ngt_dummy__: '__ngt_dummy__' });
|
|
59
|
+
// override set so our consumers don't have to handle undefined for state that already have default values
|
|
60
|
+
const originalSet = this.set.bind(this);
|
|
61
|
+
Object.defineProperty(this, 'set', {
|
|
62
|
+
get: () => {
|
|
63
|
+
return (...args) => {
|
|
64
|
+
const firstArg = args[0];
|
|
65
|
+
if (is.obj(firstArg)) {
|
|
66
|
+
const modArgs = Object.entries(firstArg).reduce((modded, [key, value]) => {
|
|
67
|
+
modded[key] = value === undefined ? this.get(key) : value;
|
|
68
|
+
return modded;
|
|
69
|
+
}, {});
|
|
70
|
+
return originalSet(modArgs);
|
|
71
|
+
}
|
|
72
|
+
return originalSet(...args);
|
|
73
|
+
};
|
|
74
|
+
},
|
|
75
|
+
});
|
|
76
|
+
// override get to return {} if get() returns undefined
|
|
77
|
+
const originalGet = this.get.bind(this);
|
|
78
|
+
Object.defineProperty(this, 'get', {
|
|
79
|
+
get: () => (...args) => {
|
|
80
|
+
if (args.length === 0)
|
|
81
|
+
return originalGet() ?? {};
|
|
82
|
+
return originalGet(...args);
|
|
83
|
+
},
|
|
84
|
+
});
|
|
85
|
+
// call initialize that might be setup by derived Stores
|
|
86
|
+
this.initialize();
|
|
87
|
+
}
|
|
88
|
+
initialize() {
|
|
89
|
+
return;
|
|
90
|
+
}
|
|
91
|
+
effect(obs, sideEffectFn) {
|
|
92
|
+
return this.hold(obs.pipe(tapEffect(sideEffectFn)));
|
|
93
|
+
}
|
|
94
|
+
triggerChangeDetection(cdr, keys = []) {
|
|
95
|
+
let $ = this.$;
|
|
96
|
+
if (keys.length) {
|
|
97
|
+
$ = combineLatest(keys.map((key) => this.select(key).pipe(startWith(this.get(key) ?? undefined))));
|
|
98
|
+
}
|
|
99
|
+
this.hold($, () => void requestAnimationFrame(() => void safeDetectChanges(cdr)));
|
|
100
|
+
}
|
|
101
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.0.0", ngImport: i0, type: NgtRxStore, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
102
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.0.0", ngImport: i0, type: NgtRxStore }); }
|
|
103
|
+
}
|
|
104
|
+
export { NgtRxStore };
|
|
105
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.0.0", ngImport: i0, type: NgtRxStore, decorators: [{
|
|
106
|
+
type: Injectable
|
|
107
|
+
}], ctorParameters: function () { return []; } });
|
|
108
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicngtc3RvcmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9saWJzL2FuZ3VsYXItdGhyZWUvc3JjL2xpYi9zdG9yZXMvcngtc3RvcmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFxQixVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDOUQsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQzVDLE9BQU8sRUFBRSxhQUFhLEVBQXdDLFNBQVMsRUFBRSxHQUFHLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFFM0YsT0FBTyxFQUFFLEVBQUUsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUNqQyxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQzs7QUFFakUsTUFBTSxDQUFDLE1BQU0sa0JBQWtCLEdBQUcsR0FBbUMsRUFBRSxDQUFDLFNBQVMsQ0FBSSxTQUFlLENBQUMsQ0FBQztBQU10Rzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBcUJHO0FBQ0gsTUFBTSxVQUFVLFNBQVMsQ0FBUyxRQUEwQjtJQUN4RCxJQUFJLFNBQVMsR0FBNkYsR0FBRyxFQUFFLEdBQUUsQ0FBQyxDQUFDO0lBQ25ILElBQUksUUFBUSxHQUFHLEtBQUssQ0FBQztJQUNyQixJQUFJLElBQUksR0FBdUIsU0FBUyxDQUFDO0lBRXpDLE1BQU0sUUFBUSxHQUFHLENBQUMsS0FBYyxFQUFFLEVBQUUsQ0FBQyxHQUFHLEVBQUU7UUFDdEMsSUFBSSxTQUFTO1lBQUUsU0FBUyxDQUFDLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQztJQUM5RCxDQUFDLENBQUM7SUFFRixPQUFPLEdBQUcsQ0FBUztRQUNmLElBQUksRUFBRSxDQUFDLEtBQWEsRUFBRSxFQUFFO1lBQ3BCLElBQUksU0FBUyxJQUFJLFFBQVE7Z0JBQUUsU0FBUyxDQUFDLEVBQUUsSUFBSSxFQUFF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aEMsSUFBSSxJQUFJLENBQUMsTUFBTSxFQUFFO1lBQ2IsQ0FBQyxHQUFHLGFBQWEsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsSUFBSSxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUN0RztRQUVELElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLEtBQUsscUJBQXFCLENBQUMsR0FBRyxFQUFFLENBQUMsS0FBSyxpQkFBaUIsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDdEYsQ0FBQzs4R0F6RFEsVUFBVTtrSEFBVixVQUFVOztTQUFWLFVBQVU7MkZBQVYsVUFBVTtrQkFEdEIsVUFBVSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENoYW5nZURldGVjdG9yUmVmLCBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBSeFN0YXRlIH0gZnJvbSAnQHJ4LWFuZ3VsYXIvc3RhdGUnO1xuaW1wb3J0IHsgY29tYmluZUxhdGVzdCwgTW9ub1R5cGVPcGVyYXRvckZ1bmN0aW9uLCBPYnNlcnZhYmxlLCBzdGFydFdpdGgsIHRhcCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHR5cGUgeyBOZ3RBbnlSZWNvcmQgfSBmcm9tICcuLi90eXBlcyc7XG5pbXBvcnQgeyBpcyB9IGZyb20gJy4uL3V0aWxzL2lzJztcbmltcG9ydCB7IHNhZmVEZXRlY3RDaGFuZ2VzIH0gZnJvbSAnLi4vdXRpbHMvc2FmZS1kZXRlY3QtY2hhbmdlcyc7XG5cbmV4cG9ydCBjb25zdCBzdGFydFdpdGhVbmRlZmluZWQgPSA8VD4oKTogTW9ub1R5cGVPcGVyYXRvckZ1bmN0aW9uPFQ+ID0+IHN0YXJ0V2l0aDxUPih1bmRlZmluZWQhIGFzIFQpO1xuXG50eXBlIEVmZmVjdEZuPFRWYWx1ZT4gPSAoXG4gICAgdmFsdWU6IFRWYWx1ZVxuKSA9PiB2b2lkIHwgdW5kZWZpbmVkIHwgKChjbGVhblVwUGFyYW1zOiB7IHByZXY6IFRWYWx1ZSB8IHVuZGVmaW5lZDsgY29tcGxldGU6IGJvb2xlYW47IGVycm9yOiBib29sZWFuIH0pID0+IHZvaWQpO1xuXG4vKipcbiAqIEFuIGV4dGVuZGVkIGB0YXBgIG9wZXJhdG9yIHRoYXQgYWNjZXB0cyBhbiBgZWZmZWN0Rm5gIHdoaWNoOlxuICogLSBydW5zIG9uIGV2ZXJ5IGBuZXh0YCBub3RpZmljYXRpb24gZnJvbSBgc291cmNlJGBcbiAqIC0gY2FuIG9wdGlvbmFsbHkgcmV0dXJuIGEgYGNsZWFuVXBgIGZ1bmN0aW9uIHRoYXRcbiAqIGludm9rZXMgZnJvbSB0aGUgMm5kIGBuZXh0YCBub3RpZmljYXRpb24gb253YXJkIGFuZCBvbiBgdW5zdWJzY3JpYmVgIChkZXN0cm95ZWQpXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIHNvdXJjZSQucGlwZShcbiAqICB0YXBFZmZlY3QoKHNvdXJjZVZhbHVlKSA9IHtcbiAqICAgIGNvbnN0IGNiID0gKCkgPT4ge1xuICogICAgICBkb1N0dWZmKHNvdXJjZVZhbHVlKTtcbiAqICAgIH07XG4gKiAgICBhZGRMaXN0ZW5lcignZXZlbnQnLCBjYik7XG4gKlxuICogICAgcmV0dXJuICgpID0+IHtcbiAqICAgICAgcmVtb3ZlTGlzdGVuZXIoJ2V2ZW50JywgY2IpO1xuICogICAgfVxuICogIH0pXG4gKiApXG4gKiBgYGBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRhcEVmZmVjdDxUVmFsdWU+KGVmZmVjdEZuOiBFZmZlY3RGbjxUVmFsdWU+KTogTW9ub1R5cGVPcGVyYXRvckZ1bmN0aW9uPFRWYWx1ZT4ge1xuICAgIGxldCBjbGVhbnVwRm46IChjbGVhblVwUGFyYW1zOiB7IHByZXY6IFRWYWx1ZSB8IHVuZGVmaW5lZDsgY29tcGxldGU6IGJvb2xlYW47IGVycm9yOiBib29sZWFuIH0pID0+IHZvaWQgPSAoKSA9PiB7fTtcbiAgICBsZXQgZmlyc3RSdW4gPSBmYWxzZTtcbiAgICBsZXQgcHJldjogVFZhbHVlIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xuXG4gICAgY29uc3QgdGVhcmRvd24gPSAoZXJyb3I6IGJvb2xlYW4pID0+ICgpID0+IHtcbiAgICAgICAgaWYgKGNsZWFudXBGbikgY2xlYW51cEZuKHsgcHJldiwgY29tcGxldGU6IHRydWUsIGVycm9yIH0pO1xuICAgIH07XG5cbiAgICByZXR1cm4gdGFwPFRWYWx1ZT4oe1xuICAgICAgICBuZXh0OiAodmFsdWU6IFRWYWx1ZSkgPT4ge1xuICAgICAgICAgICAgaWYgKGNsZWFudXBGbiAmJiBmaXJzdFJ1bikgY2xlYW51cEZuKHsgcHJldiwgY29tcGxldGU6IGZhbHNlLCBlcnJvcjogZmFsc2UgfSk7XG5cbiAgICAgICAgICAgIGNvbnN0IGNsZWFuVXBPclZvaWQgPSBlZmZlY3RGbih2YWx1ZSk7XG4gICAgICAgICAgICBpZiAoY2xlYW5VcE9yVm9pZCkgY2xlYW51cEZuID0gY2xlYW5VcE9yVm9pZDtcblxuICAgICAgICAgICAgcHJldiA9IHZhbHVlO1xuXG4gICAgICAgICAgICBpZiAoIWZpcnN0UnVuKSBmaXJzdFJ1biA9IHRydWU7XG4gICAgICAgIH0sXG4gICAgICAgIGNvbXBsZXRlOiB0ZWFyZG93bihmYWxzZSksXG4gICAgICAgIHVuc3Vic2NyaWJlOiB0ZWFyZG93bihmYWxzZSksXG4gICAgICAgIGVycm9yOiB0ZWFyZG93bih0cnVlKSxcbiAgICB9KTtcbn1cblxuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIE5ndFJ4U3RvcmU8XG4gICAgVFN0YXRlIGV4dGVuZHMgb2JqZWN0ID0gYW55LFxuICAgIFRSeFN0YXRlIGV4dGVuZHMgb2JqZWN0ID0gVFN0YXRlICYgUmVjb3JkPHN0cmluZywgYW55PlxuPiBleHRlbmRzIFJ4U3RhdGU8VFJ4U3RhdGU+IHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgLy8gc2V0IGEgZHVtbXkgcHJvcGVydHkgc28gdGhhdCBpbml0aWFsIHRoaXMuZ2V0KCkgd29uJ3QgcmV0dXJuIHVuZGVmaW5lZFxuICAgICAgICB0aGlzLnNldCh7IF9fbmd0X2R1bW15X186ICdfX25ndF9kdW1teV9fJyB9IGFzIFRSeFN0YXRlKTtcbiAgICAgICAgLy8gb3ZlcnJpZGUgc2V0IHNvIG91ciBjb25zdW1lcnMgZG9uJ3QgaGF2ZSB0byBoYW5kbGUgdW5kZWZpbmVkIGZvciBzdGF0ZSB0aGF0IGFscmVhZHkgaGF2ZSBkZWZhdWx0IHZhbHVlc1xuICAgICAgICBjb25zdCBvcmlnaW5hbFNldCA9IHRoaXMuc2V0LmJpbmQodGhpcyk7XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAnc2V0Jywge1xuICAgICAgICAgICAgZ2V0OiAoKSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICguLi5hcmdzOiBQYXJhbWV0ZXJzPFJ4U3RhdGU8VFJ4U3RhdGU+WydzZXQnXT4pID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZmlyc3RBcmcgPSBhcmdzWzBdO1xuICAgICAgICAgICAgICAgICAgICBpZiAoaXMub2JqKGZpcnN0QXJnKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbW9kQXJncyA9IE9iamVjdC5lbnRyaWVzKGZpcnN0QXJnKS5yZWR1Y2UoKG1vZGRlZCwgW2tleSwgdmFsdWVdKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kZGVkW2tleV0gPSB2YWx1ZSA9PT0gdW5kZWZpbmVkID8gdGhpcy5nZXQoa2V5IGFzIGtleW9mIFRSeFN0YXRlKSA6IHZhbHVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBtb2RkZWQ7XG4gICAgICAgICAgICAgICAgICAgICAgICB9LCB7fSBhcyBOZ3RBbnlSZWNvcmQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG9yaWdpbmFsU2V0KG1vZEFyZ3MgYXMgUGFydGlhbDxUUnhTdGF0ZT4pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBvcmlnaW5hbFNldCguLi5hcmdzKTtcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfSxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gb3ZlcnJpZGUgZ2V0IHRvIHJldHVybiB7fSBpZiBnZXQoKSByZXR1cm5zIHVuZGVmaW5lZFxuICAgICAgICBjb25zdCBvcmlnaW5hbEdldCA9IHRoaXMuZ2V0LmJpbmQodGhpcyk7XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAnZ2V0Jywge1xuICAgICAgICAgICAgZ2V0OlxuICAgICAgICAgICAgICAgICgpID0+XG4gICAgICAgICAgICAgICAgKC4uLmFyZ3M6IFBhcmFtZXRlcnM8UnhTdGF0ZTxUUnhTdGF0ZT5bJ2dldCddPikgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAoKGFyZ3MgYXMgYW55W10pLmxlbmd0aCA9PT0gMCkgcmV0dXJuIG9yaWdpbmFsR2V0KCkgPz8ge307XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBvcmlnaW5hbEdldCguLi5hcmdzKTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICB9KTtcblxuICAgICAgICAvLyBjYWxsIGluaXRpYWxpemUgdGhhdCBtaWdodCBiZSBzZXR1cCBieSBkZXJpdmVkIFN0b3Jlc1xuICAgICAgICB0aGlzLmluaXRpYWxpemUoKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgaW5pdGlhbGl6ZSgpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGVmZmVjdDxTPihvYnM6IE9ic2VydmFibGU8Uz4sIHNpZGVFZmZlY3RGbjogRWZmZWN0Rm48Uz4pOiB2b2lkIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaG9sZChvYnMucGlwZSh0YXBFZmZlY3Qoc2lkZUVmZmVjdEZuKSkpO1xuICAgIH1cblxuICAgIHRyaWdnZXJDaGFuZ2VEZXRlY3Rpb24oY2RyOiBDaGFuZ2VEZXRlY3RvclJlZiwga2V5czogQXJyYXk8a2V5b2YgVFJ4U3RhdGU+ID0gW10pIHtcbiAgICAgICAgbGV0ICQ6IE9ic2VydmFibGU8YW55PiA9IHRoaXMuJDtcblxuICAgICAgICBpZiAoa2V5cy5sZW5ndGgpIHtcbiAgICAgICAgICAgICQgPSBjb21iaW5lTGF0ZXN0KGtleXMubWFwKChrZXkpID0+IHRoaXMuc2VsZWN0KGtleSkucGlwZShzdGFydFdpdGgodGhpcy5nZXQoa2V5KSA/PyB1bmRlZmluZWQpKSkpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5ob2xkKCQsICgpID0+IHZvaWQgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHZvaWQgc2FmZURldGVjdENoYW5nZXMoY2RyKSkpO1xuICAgIH1cbn1cbiJdfQ==
|