angular-three 2.0.0-beta.241 → 2.0.0-beta.243
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/index.mjs +2 -2
- package/esm2022/lib/canvas.mjs +25 -31
- package/esm2022/lib/directives/args.mjs +52 -14
- package/esm2022/lib/instance.mjs +10 -9
- package/esm2022/lib/loop.mjs +2 -2
- package/esm2022/lib/portal.mjs +119 -111
- package/esm2022/lib/renderer/catalogue.mjs +2 -2
- package/esm2022/lib/renderer/constants.mjs +3 -5
- package/esm2022/lib/renderer/index.mjs +276 -194
- package/esm2022/lib/renderer/state.mjs +49 -0
- package/esm2022/lib/renderer/utils.mjs +40 -24
- package/esm2022/lib/roots.mjs +25 -25
- package/esm2022/lib/routed-scene.mjs +3 -3
- package/esm2022/lib/store.mjs +14 -12
- package/esm2022/lib/three-types.mjs +1 -1
- package/esm2022/lib/utils/apply-props.mjs +3 -3
- package/esm2022/lib/utils/before-render.mjs +4 -3
- package/esm2022/lib/utils/parameters.mjs +27 -26
- package/esm2022/lib/utils/resolve-ref.mjs +8 -0
- package/esm2022/lib/utils/signal-store.mjs +3 -14
- package/fesm2022/angular-three.mjs +722 -1091
- package/fesm2022/angular-three.mjs.map +1 -1
- package/index.d.ts +2 -2
- package/lib/canvas.d.ts +278 -1001
- package/lib/directives/args.d.ts +11 -4
- package/lib/instance.d.ts +8 -13
- package/lib/loop.d.ts +1 -1
- package/lib/portal.d.ts +41 -31
- package/lib/renderer/catalogue.d.ts +1 -1
- package/lib/renderer/constants.d.ts +2 -4
- package/lib/renderer/index.d.ts +15 -5
- package/lib/renderer/state.d.ts +23 -0
- package/lib/renderer/utils.d.ts +5 -22
- package/lib/roots.d.ts +5 -0
- package/lib/store.d.ts +12 -12
- package/lib/three-types.d.ts +8 -5
- package/lib/utils/parameters.d.ts +4 -9
- package/lib/utils/resolve-ref.d.ts +2 -0
- package/lib/utils/signal-store.d.ts +1 -5
- package/metadata.json +1 -1
- package/package.json +71 -72
- package/web-types.json +1 -1
- package/esm2022/lib/directives/common.mjs +0 -65
- package/esm2022/lib/directives/parent.mjs +0 -20
- package/esm2022/lib/ref.mjs +0 -50
- package/esm2022/lib/renderer/store.mjs +0 -439
- package/lib/directives/common.d.ts +0 -31
- package/lib/directives/parent.d.ts +0 -11
- package/lib/ref.d.ts +0 -7
- package/lib/renderer/store.d.ts +0 -65
|
@@ -1,439 +0,0 @@
|
|
|
1
|
-
import { InjectionToken, getDebugNode } from '@angular/core';
|
|
2
|
-
import { NgtArgs } from '../directives/args';
|
|
3
|
-
import { NgtParent } from '../directives/parent';
|
|
4
|
-
import { getLocalState } from '../instance';
|
|
5
|
-
import { NGT_STORE } from '../store';
|
|
6
|
-
import { applyProps } from '../utils/apply-props';
|
|
7
|
-
import { is } from '../utils/is';
|
|
8
|
-
import { SPECIAL_INTERNAL_ADD_COMMENT, SPECIAL_PROPERTIES } from './constants';
|
|
9
|
-
import { attachThreeChild, removeThreeChild } from './utils';
|
|
10
|
-
export const NGT_COMPOUND_PREFIXES = new InjectionToken('NgtCompoundPrefixes');
|
|
11
|
-
export class NgtRendererStore {
|
|
12
|
-
constructor(rootState) {
|
|
13
|
-
this.rootState = rootState;
|
|
14
|
-
this.argsCommentNodes = [];
|
|
15
|
-
this.parentCommentNodes = [];
|
|
16
|
-
this.portalCommentsNodes = [];
|
|
17
|
-
}
|
|
18
|
-
createNode(type, node) {
|
|
19
|
-
const state = [
|
|
20
|
-
type,
|
|
21
|
-
null,
|
|
22
|
-
null,
|
|
23
|
-
[],
|
|
24
|
-
false,
|
|
25
|
-
undefined,
|
|
26
|
-
undefined,
|
|
27
|
-
undefined,
|
|
28
|
-
undefined,
|
|
29
|
-
undefined,
|
|
30
|
-
undefined,
|
|
31
|
-
undefined,
|
|
32
|
-
undefined,
|
|
33
|
-
undefined,
|
|
34
|
-
undefined,
|
|
35
|
-
];
|
|
36
|
-
const rendererNode = Object.assign(node, { __ngt_renderer__: state });
|
|
37
|
-
// NOTE: assign ownerDocument to node so we can use HostListener in Component
|
|
38
|
-
if (!rendererNode['ownerDocument'])
|
|
39
|
-
rendererNode['ownerDocument'] = this.rootState.document;
|
|
40
|
-
// NOTE: assign injectorFactory on non-three type since
|
|
41
|
-
// rendererNode is an instance of DOM Node
|
|
42
|
-
if (state[0 /* NgtRendererClassId.type */] !== 'three') {
|
|
43
|
-
state[14 /* NgtRendererClassId.injectorFactory */] = () => getDebugNode(rendererNode)?.injector;
|
|
44
|
-
}
|
|
45
|
-
if (state[0 /* NgtRendererClassId.type */] === 'comment') {
|
|
46
|
-
// NOTE: we attach an arrow function to the Comment node
|
|
47
|
-
// In our directives, we can call this function to then start tracking the RendererNode
|
|
48
|
-
// this is done to limit the amount of Nodes we need to process for getCreationState
|
|
49
|
-
rendererNode[SPECIAL_INTERNAL_ADD_COMMENT] = (node) => {
|
|
50
|
-
if (node === 'args') {
|
|
51
|
-
this.argsCommentNodes.push(rendererNode);
|
|
52
|
-
}
|
|
53
|
-
else if (node === 'parent') {
|
|
54
|
-
this.parentCommentNodes.push(rendererNode);
|
|
55
|
-
}
|
|
56
|
-
else if (typeof node === 'object') {
|
|
57
|
-
this.portalCommentsNodes.push(node);
|
|
58
|
-
}
|
|
59
|
-
};
|
|
60
|
-
return rendererNode;
|
|
61
|
-
}
|
|
62
|
-
if (state[0 /* NgtRendererClassId.type */] === 'compound') {
|
|
63
|
-
state[8 /* NgtRendererClassId.queueOps */] = new Set();
|
|
64
|
-
state[9 /* NgtRendererClassId.attributes */] = state[10 /* NgtRendererClassId.properties */] = {};
|
|
65
|
-
return rendererNode;
|
|
66
|
-
}
|
|
67
|
-
return rendererNode;
|
|
68
|
-
}
|
|
69
|
-
isCompound(name) {
|
|
70
|
-
return this.rootState.compoundPrefixes.some((prefix) => name.startsWith(prefix));
|
|
71
|
-
}
|
|
72
|
-
isDOM(node) {
|
|
73
|
-
const rS = node['__ngt_renderer__'];
|
|
74
|
-
return (!rS ||
|
|
75
|
-
(rS[0 /* NgtRendererClassId.type */] !== 'compound' &&
|
|
76
|
-
(node instanceof Element || node instanceof Document || node instanceof Window)));
|
|
77
|
-
}
|
|
78
|
-
getClosestParentWithInstance(node) {
|
|
79
|
-
let parent = node.__ngt_renderer__[1 /* NgtRendererClassId.parent */];
|
|
80
|
-
if (parent &&
|
|
81
|
-
parent.__ngt_renderer__[0 /* NgtRendererClassId.type */] === 'compound' &&
|
|
82
|
-
parent.__ngt_renderer__[7 /* NgtRendererClassId.compounded */] &&
|
|
83
|
-
parent.__ngt_renderer__[7 /* NgtRendererClassId.compounded */].__ngt_renderer__[0 /* NgtRendererClassId.type */] === 'three') {
|
|
84
|
-
return parent.__ngt_renderer__[7 /* NgtRendererClassId.compounded */];
|
|
85
|
-
}
|
|
86
|
-
if (parent &&
|
|
87
|
-
parent.__ngt_renderer__[0 /* NgtRendererClassId.type */] === 'portal' &&
|
|
88
|
-
parent.__ngt_renderer__[13 /* NgtRendererClassId.portalContainer */]?.__ngt_renderer__[0 /* NgtRendererClassId.type */] === 'three') {
|
|
89
|
-
return parent.__ngt_renderer__[13 /* NgtRendererClassId.portalContainer */];
|
|
90
|
-
}
|
|
91
|
-
while (parent && parent.__ngt_renderer__[0 /* NgtRendererClassId.type */] !== 'three') {
|
|
92
|
-
parent = parent.__ngt_renderer__[13 /* NgtRendererClassId.portalContainer */]
|
|
93
|
-
? parent.__ngt_renderer__[13 /* NgtRendererClassId.portalContainer */]
|
|
94
|
-
: parent.__ngt_renderer__[1 /* NgtRendererClassId.parent */];
|
|
95
|
-
}
|
|
96
|
-
return parent;
|
|
97
|
-
}
|
|
98
|
-
getClosestParentWithCompound(node) {
|
|
99
|
-
if (node.__ngt_renderer__[6 /* NgtRendererClassId.compoundParent */]) {
|
|
100
|
-
return node.__ngt_renderer__[6 /* NgtRendererClassId.compoundParent */];
|
|
101
|
-
}
|
|
102
|
-
let parent = node.__ngt_renderer__[1 /* NgtRendererClassId.parent */];
|
|
103
|
-
if (parent &&
|
|
104
|
-
parent.__ngt_renderer__[0 /* NgtRendererClassId.type */] === 'compound' &&
|
|
105
|
-
!parent.__ngt_renderer__[7 /* NgtRendererClassId.compounded */]) {
|
|
106
|
-
return parent;
|
|
107
|
-
}
|
|
108
|
-
while (parent &&
|
|
109
|
-
(parent.__ngt_renderer__[0 /* NgtRendererClassId.type */] === 'three' ||
|
|
110
|
-
!parent.__ngt_renderer__[6 /* NgtRendererClassId.compoundParent */] ||
|
|
111
|
-
parent.__ngt_renderer__[0 /* NgtRendererClassId.type */] !== 'compound')) {
|
|
112
|
-
parent = parent.__ngt_renderer__[1 /* NgtRendererClassId.parent */];
|
|
113
|
-
}
|
|
114
|
-
if (!parent)
|
|
115
|
-
return null;
|
|
116
|
-
if (parent.__ngt_renderer__[0 /* NgtRendererClassId.type */] === 'three' &&
|
|
117
|
-
parent.__ngt_renderer__[6 /* NgtRendererClassId.compoundParent */]) {
|
|
118
|
-
return parent.__ngt_renderer__[6 /* NgtRendererClassId.compoundParent */];
|
|
119
|
-
}
|
|
120
|
-
if (!parent.__ngt_renderer__[7 /* NgtRendererClassId.compounded */]) {
|
|
121
|
-
return parent;
|
|
122
|
-
}
|
|
123
|
-
return null;
|
|
124
|
-
}
|
|
125
|
-
processPortalContainer(portal) {
|
|
126
|
-
const injector = portal.__ngt_renderer__[14 /* NgtRendererClassId.injectorFactory */]?.();
|
|
127
|
-
if (!injector)
|
|
128
|
-
return;
|
|
129
|
-
const portalStore = injector.get(NGT_STORE, null);
|
|
130
|
-
if (!portalStore)
|
|
131
|
-
return;
|
|
132
|
-
const portalContainer = portalStore.get('scene');
|
|
133
|
-
if (!portalContainer)
|
|
134
|
-
return;
|
|
135
|
-
portal.__ngt_renderer__[13 /* NgtRendererClassId.portalContainer */] = this.createNode('three', portalContainer);
|
|
136
|
-
}
|
|
137
|
-
getCreationState() {
|
|
138
|
-
return [
|
|
139
|
-
this.firstNonInjectedDirective('argsCommentNodes', NgtArgs)?.value || [],
|
|
140
|
-
this.firstNonInjectedDirective('parentCommentNodes', NgtParent)?.value || null,
|
|
141
|
-
this.tryGetPortalStore(),
|
|
142
|
-
];
|
|
143
|
-
}
|
|
144
|
-
setParent(node, parent) {
|
|
145
|
-
if (!node.__ngt_renderer__[1 /* NgtRendererClassId.parent */]) {
|
|
146
|
-
node.__ngt_renderer__[1 /* NgtRendererClassId.parent */] = parent;
|
|
147
|
-
}
|
|
148
|
-
}
|
|
149
|
-
addChild(node, child) {
|
|
150
|
-
if (!node.__ngt_renderer__[3 /* NgtRendererClassId.children */].includes(child)) {
|
|
151
|
-
node.__ngt_renderer__[3 /* NgtRendererClassId.children */].push(child);
|
|
152
|
-
}
|
|
153
|
-
}
|
|
154
|
-
removeChild(node, child) {
|
|
155
|
-
const index = node.__ngt_renderer__?.[3 /* NgtRendererClassId.children */].findIndex((c) => child === c);
|
|
156
|
-
if (index >= 0) {
|
|
157
|
-
node.__ngt_renderer__[3 /* NgtRendererClassId.children */].splice(index, 1);
|
|
158
|
-
}
|
|
159
|
-
}
|
|
160
|
-
setCompound(compound, instance) {
|
|
161
|
-
const instanceRS = instance.__ngt_renderer__;
|
|
162
|
-
if (instanceRS && instanceRS[1 /* NgtRendererClassId.parent */]) {
|
|
163
|
-
const parentRS = instanceRS[1 /* NgtRendererClassId.parent */].__ngt_renderer__;
|
|
164
|
-
// NOTE: if instance is already compounded by its parent. skip
|
|
165
|
-
if (parentRS[0 /* NgtRendererClassId.type */] === 'compound' && parentRS[7 /* NgtRendererClassId.compounded */] === instance) {
|
|
166
|
-
return;
|
|
167
|
-
}
|
|
168
|
-
}
|
|
169
|
-
const rS = compound.__ngt_renderer__;
|
|
170
|
-
rS[7 /* NgtRendererClassId.compounded */] = instance;
|
|
171
|
-
for (const key of Object.keys(rS[9 /* NgtRendererClassId.attributes */])) {
|
|
172
|
-
this.applyAttribute(instance, key, rS[9 /* NgtRendererClassId.attributes */][key]);
|
|
173
|
-
}
|
|
174
|
-
for (const key of Object.keys(rS[10 /* NgtRendererClassId.properties */])) {
|
|
175
|
-
this.applyProperty(instance, key, rS[10 /* NgtRendererClassId.properties */][key]);
|
|
176
|
-
}
|
|
177
|
-
this.executeOperation(compound);
|
|
178
|
-
}
|
|
179
|
-
queueOperation(node, op) {
|
|
180
|
-
node.__ngt_renderer__[8 /* NgtRendererClassId.queueOps */].add(op);
|
|
181
|
-
}
|
|
182
|
-
executeOperation(node, type = 'op') {
|
|
183
|
-
const rS = node.__ngt_renderer__;
|
|
184
|
-
// TODO: maybe an array with pop() would work better
|
|
185
|
-
if (rS[8 /* NgtRendererClassId.queueOps */]?.size) {
|
|
186
|
-
rS[8 /* NgtRendererClassId.queueOps */].forEach((op) => {
|
|
187
|
-
if (op[0 /* NgtQueueOpClassId.type */] === type) {
|
|
188
|
-
op[1 /* NgtQueueOpClassId.op */]();
|
|
189
|
-
rS[8 /* NgtRendererClassId.queueOps */].delete(op);
|
|
190
|
-
}
|
|
191
|
-
});
|
|
192
|
-
}
|
|
193
|
-
}
|
|
194
|
-
applyAttribute(node, name, value) {
|
|
195
|
-
const rS = node.__ngt_renderer__;
|
|
196
|
-
if (rS[4 /* NgtRendererClassId.destroyed */])
|
|
197
|
-
return;
|
|
198
|
-
if (name === SPECIAL_PROPERTIES.RENDER_PRIORITY) {
|
|
199
|
-
// NOTE: priority needs to be set as an attribute string so that they can be set as early as possible
|
|
200
|
-
// we convert that string to a number. if it's invalid, default 0
|
|
201
|
-
let priority = Number(value);
|
|
202
|
-
if (isNaN(priority)) {
|
|
203
|
-
priority = 0;
|
|
204
|
-
console.warn(`[NGT] "priority" is an invalid number, default to 0`);
|
|
205
|
-
}
|
|
206
|
-
const localState = getLocalState(node);
|
|
207
|
-
if (localState) {
|
|
208
|
-
localState.priority = priority;
|
|
209
|
-
}
|
|
210
|
-
}
|
|
211
|
-
if (name === SPECIAL_PROPERTIES.COMPOUND) {
|
|
212
|
-
// NOTE: we set the compound property on instance node now so we know that this instance is being compounded
|
|
213
|
-
rS[5 /* NgtRendererClassId.compound */] = [value === '' || value === 'first', {}];
|
|
214
|
-
return;
|
|
215
|
-
}
|
|
216
|
-
if (name === SPECIAL_PROPERTIES.ATTACH) {
|
|
217
|
-
// NOTE: handle attach as tring
|
|
218
|
-
const paths = value.split('.');
|
|
219
|
-
if (paths.length) {
|
|
220
|
-
const localState = getLocalState(node);
|
|
221
|
-
if (localState) {
|
|
222
|
-
localState.attach = paths;
|
|
223
|
-
}
|
|
224
|
-
}
|
|
225
|
-
return;
|
|
226
|
-
}
|
|
227
|
-
if (name === SPECIAL_PROPERTIES.RAW_VALUE) {
|
|
228
|
-
// NOTE: coercion
|
|
229
|
-
let maybeCoerced = value;
|
|
230
|
-
if (maybeCoerced === '' || maybeCoerced === 'true' || maybeCoerced === 'false') {
|
|
231
|
-
maybeCoerced = maybeCoerced === 'true' || maybeCoerced === '';
|
|
232
|
-
}
|
|
233
|
-
else if (!isNaN(Number(maybeCoerced))) {
|
|
234
|
-
maybeCoerced = Number(maybeCoerced);
|
|
235
|
-
}
|
|
236
|
-
rS[11 /* NgtRendererClassId.rawValue */] = maybeCoerced;
|
|
237
|
-
return;
|
|
238
|
-
}
|
|
239
|
-
applyProps(node, { [name]: value });
|
|
240
|
-
this.updateNativeProps(node, name, value);
|
|
241
|
-
}
|
|
242
|
-
applyProperty(node, name, value) {
|
|
243
|
-
const rS = node.__ngt_renderer__;
|
|
244
|
-
if (rS[4 /* NgtRendererClassId.destroyed */])
|
|
245
|
-
return;
|
|
246
|
-
// [ref]
|
|
247
|
-
if (name === SPECIAL_PROPERTIES.REF && is.ref(value)) {
|
|
248
|
-
rS[12 /* NgtRendererClassId.ref */] = value;
|
|
249
|
-
value.nativeElement = node;
|
|
250
|
-
return;
|
|
251
|
-
}
|
|
252
|
-
const localState = getLocalState(node);
|
|
253
|
-
const parent = localState?.instanceStore.get('parent') || rS[1 /* NgtRendererClassId.parent */];
|
|
254
|
-
// [rawValue]
|
|
255
|
-
if (localState?.isRaw && name === SPECIAL_PROPERTIES.RAW_VALUE) {
|
|
256
|
-
rS[11 /* NgtRendererClassId.rawValue */] = value;
|
|
257
|
-
if (parent)
|
|
258
|
-
attachThreeChild(parent, node);
|
|
259
|
-
return;
|
|
260
|
-
}
|
|
261
|
-
// [attach]
|
|
262
|
-
if (name === SPECIAL_PROPERTIES.ATTACH) {
|
|
263
|
-
if (localState)
|
|
264
|
-
localState.attach = Array.isArray(value) ? value.map((v) => v.toString()) : value;
|
|
265
|
-
if (parent)
|
|
266
|
-
attachThreeChild(parent, node);
|
|
267
|
-
return;
|
|
268
|
-
}
|
|
269
|
-
const compound = rS[5 /* NgtRendererClassId.compound */];
|
|
270
|
-
if (compound?.[1 /* NgtCompoundClassId.props */] &&
|
|
271
|
-
name in compound[1 /* NgtCompoundClassId.props */] &&
|
|
272
|
-
!compound[0 /* NgtCompoundClassId.applyFirst */]) {
|
|
273
|
-
value = compound[1 /* NgtCompoundClassId.props */][name];
|
|
274
|
-
}
|
|
275
|
-
applyProps(node, { [name]: value });
|
|
276
|
-
this.updateNativeProps(node, name, value);
|
|
277
|
-
}
|
|
278
|
-
applyParameters(node, parameters) {
|
|
279
|
-
const rS = node.__ngt_renderer__;
|
|
280
|
-
if (rS[4 /* NgtRendererClassId.destroyed */])
|
|
281
|
-
return;
|
|
282
|
-
applyProps(node, parameters);
|
|
283
|
-
this.updateNativeProps(node, 'parameters', parameters);
|
|
284
|
-
}
|
|
285
|
-
get rootScene() {
|
|
286
|
-
return this.rootState.store.get('scene');
|
|
287
|
-
}
|
|
288
|
-
destroy(node, parent) {
|
|
289
|
-
const rS = node.__ngt_renderer__;
|
|
290
|
-
if (!rS || rS[4 /* NgtRendererClassId.destroyed */])
|
|
291
|
-
return;
|
|
292
|
-
if (rS[0 /* NgtRendererClassId.type */] === 'three') {
|
|
293
|
-
rS[5 /* NgtRendererClassId.compound */] = undefined;
|
|
294
|
-
rS[6 /* NgtRendererClassId.compoundParent */] = undefined;
|
|
295
|
-
const localState = getLocalState(node);
|
|
296
|
-
if (localState?.instanceStore) {
|
|
297
|
-
localState.instanceStore.get('objects').forEach((obj) => this.destroy(obj, parent));
|
|
298
|
-
localState.instanceStore.get('nonObjects').forEach((obj) => this.destroy(obj, parent));
|
|
299
|
-
}
|
|
300
|
-
if (localState?.afterUpdate)
|
|
301
|
-
localState.afterUpdate.complete();
|
|
302
|
-
if (localState?.afterAttach)
|
|
303
|
-
localState.afterAttach.complete();
|
|
304
|
-
delete localState['objects'];
|
|
305
|
-
delete localState['nonObjects'];
|
|
306
|
-
delete localState['parent'];
|
|
307
|
-
delete localState['nativeProps'];
|
|
308
|
-
delete localState['add'];
|
|
309
|
-
delete localState['remove'];
|
|
310
|
-
delete localState['afterUpdate'];
|
|
311
|
-
delete localState['afterAttach'];
|
|
312
|
-
delete localState['store'];
|
|
313
|
-
delete localState['handlers'];
|
|
314
|
-
if (!localState?.primitive) {
|
|
315
|
-
delete node['__ngt__'];
|
|
316
|
-
}
|
|
317
|
-
}
|
|
318
|
-
if (rS[0 /* NgtRendererClassId.type */] === 'comment') {
|
|
319
|
-
rS[14 /* NgtRendererClassId.injectorFactory */] = null;
|
|
320
|
-
delete node[SPECIAL_INTERNAL_ADD_COMMENT];
|
|
321
|
-
if (!this.removeCommentNode(node, this.argsCommentNodes)) {
|
|
322
|
-
this.removeCommentNode(node, this.parentCommentNodes);
|
|
323
|
-
}
|
|
324
|
-
}
|
|
325
|
-
if (rS[0 /* NgtRendererClassId.type */] === 'portal') {
|
|
326
|
-
rS[14 /* NgtRendererClassId.injectorFactory */] = null;
|
|
327
|
-
this.removeCommentNode(node, this.portalCommentsNodes);
|
|
328
|
-
}
|
|
329
|
-
if (rS[0 /* NgtRendererClassId.type */] === 'compound') {
|
|
330
|
-
rS[7 /* NgtRendererClassId.compounded */] = undefined;
|
|
331
|
-
rS[9 /* NgtRendererClassId.attributes */] = null;
|
|
332
|
-
rS[10 /* NgtRendererClassId.properties */] = null;
|
|
333
|
-
this.executeOperation(node, 'cleanUp');
|
|
334
|
-
rS[8 /* NgtRendererClassId.queueOps */].clear();
|
|
335
|
-
rS[8 /* NgtRendererClassId.queueOps */] = null;
|
|
336
|
-
}
|
|
337
|
-
if (rS[12 /* NgtRendererClassId.ref */]) {
|
|
338
|
-
// nullify ref
|
|
339
|
-
// but we do it later so that it doesn't hinder render
|
|
340
|
-
// TODO: will this cause memory leak?
|
|
341
|
-
requestAnimationFrame(() => {
|
|
342
|
-
rS[12 /* NgtRendererClassId.ref */].nativeElement = null;
|
|
343
|
-
rS[12 /* NgtRendererClassId.ref */] = undefined;
|
|
344
|
-
});
|
|
345
|
-
}
|
|
346
|
-
// nullify parent
|
|
347
|
-
rS[1 /* NgtRendererClassId.parent */] = null;
|
|
348
|
-
for (const renderChild of rS[3 /* NgtRendererClassId.children */] || []) {
|
|
349
|
-
if (renderChild.__ngt_renderer__?.[0 /* NgtRendererClassId.type */] === 'three' && parent) {
|
|
350
|
-
if (parent.__ngt_renderer__?.[0 /* NgtRendererClassId.type */] === 'three') {
|
|
351
|
-
removeThreeChild(parent, renderChild, true);
|
|
352
|
-
continue;
|
|
353
|
-
}
|
|
354
|
-
const closestInstance = this.getClosestParentWithInstance(parent);
|
|
355
|
-
if (closestInstance) {
|
|
356
|
-
removeThreeChild(closestInstance, renderChild, true);
|
|
357
|
-
}
|
|
358
|
-
}
|
|
359
|
-
this.destroy(renderChild, parent);
|
|
360
|
-
}
|
|
361
|
-
rS[3 /* NgtRendererClassId.children */] = [];
|
|
362
|
-
rS[4 /* NgtRendererClassId.destroyed */] = true;
|
|
363
|
-
if (parent) {
|
|
364
|
-
this.removeChild(parent, node);
|
|
365
|
-
}
|
|
366
|
-
}
|
|
367
|
-
removeCommentNode(node, nodes) {
|
|
368
|
-
const index = nodes.findIndex((comment) => comment === node);
|
|
369
|
-
if (index > -1) {
|
|
370
|
-
nodes.splice(index, 1);
|
|
371
|
-
return true;
|
|
372
|
-
}
|
|
373
|
-
return false;
|
|
374
|
-
}
|
|
375
|
-
updateNativeProps(node, key, value) {
|
|
376
|
-
const localState = getLocalState(node);
|
|
377
|
-
localState?.setNativeProps(key, value);
|
|
378
|
-
}
|
|
379
|
-
firstNonInjectedDirective(listProperty, dir) {
|
|
380
|
-
let directive;
|
|
381
|
-
const destroyed = [];
|
|
382
|
-
let i = this[listProperty].length - 1;
|
|
383
|
-
while (i >= 0) {
|
|
384
|
-
const comment = this[listProperty][i];
|
|
385
|
-
if (comment.__ngt_renderer__[4 /* NgtRendererClassId.destroyed */]) {
|
|
386
|
-
destroyed.push(i);
|
|
387
|
-
i--;
|
|
388
|
-
continue;
|
|
389
|
-
}
|
|
390
|
-
const injector = comment.__ngt_renderer__[14 /* NgtRendererClassId.injectorFactory */]();
|
|
391
|
-
if (!injector) {
|
|
392
|
-
i--;
|
|
393
|
-
continue;
|
|
394
|
-
}
|
|
395
|
-
const instance = injector.get(dir, null);
|
|
396
|
-
if (instance && instance.validate()) {
|
|
397
|
-
directive = instance;
|
|
398
|
-
break;
|
|
399
|
-
}
|
|
400
|
-
i--;
|
|
401
|
-
}
|
|
402
|
-
destroyed.forEach((index) => {
|
|
403
|
-
this[listProperty].splice(index, 1);
|
|
404
|
-
});
|
|
405
|
-
return directive;
|
|
406
|
-
}
|
|
407
|
-
tryGetPortalStore() {
|
|
408
|
-
let store;
|
|
409
|
-
const destroyed = [];
|
|
410
|
-
// we only care about the portal states because NgtStore only differs per Portal
|
|
411
|
-
let i = this.portalCommentsNodes.length - 1;
|
|
412
|
-
while (i >= 0) {
|
|
413
|
-
// loop through the portal state backwards to find the closest NgtStore
|
|
414
|
-
const portal = this.portalCommentsNodes[i];
|
|
415
|
-
if (portal.__ngt_renderer__[4 /* NgtRendererClassId.destroyed */]) {
|
|
416
|
-
destroyed.push(i);
|
|
417
|
-
i--;
|
|
418
|
-
continue;
|
|
419
|
-
}
|
|
420
|
-
const injector = portal.__ngt_renderer__[14 /* NgtRendererClassId.injectorFactory */]();
|
|
421
|
-
if (!injector) {
|
|
422
|
-
i--;
|
|
423
|
-
continue;
|
|
424
|
-
}
|
|
425
|
-
const instance = injector.get(NGT_STORE, null);
|
|
426
|
-
// only the instance with previousRoot should pass
|
|
427
|
-
if (instance && instance.get('previousRoot')) {
|
|
428
|
-
store = instance;
|
|
429
|
-
break;
|
|
430
|
-
}
|
|
431
|
-
i--;
|
|
432
|
-
}
|
|
433
|
-
destroyed.forEach((index) => {
|
|
434
|
-
this.portalCommentsNodes.splice(index, 1);
|
|
435
|
-
});
|
|
436
|
-
return store || this.rootState.store;
|
|
437
|
-
}
|
|
438
|
-
}
|
|
439
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RvcmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9saWJzL2NvcmUvc3JjL2xpYi9yZW5kZXJlci9zdG9yZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsY0FBYyxFQUFrQixZQUFZLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDN0UsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBRTdDLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUNqRCxPQUFPLEVBQW1CLGFBQWEsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUU3RCxPQUFPLEVBQUUsU0FBUyxFQUFZLE1BQU0sVUFBVSxDQUFDO0FBRS9DLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUNsRCxPQUFPLEVBQUUsRUFBRSxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBRWpDLE9BQU8sRUFBRSw0QkFBNEIsRUFBRSxrQkFBa0IsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUMvRSxPQUFPLEVBQTZELGdCQUFnQixFQUFFLGdCQUFnQixFQUFFLE1BQU0sU0FBUyxDQUFDO0FBRXhILE1BQU0sQ0FBQyxNQUFNLHFCQUFxQixHQUFHLElBQUksY0FBYyxDQUFXLHFCQUFxQixDQUFDLENBQUM7QUFnQ3pGLE1BQU0sT0FBTyxnQkFBZ0I7SUFLNUIsWUFBb0IsU0FBK0I7UUFBL0IsY0FBUyxHQUFULFNBQVMsQ0FBc0I7UUFKM0MscUJBQWdCLEdBQTJCLEVBQUUsQ0FBQztRQUM5Qyx1QkFBa0IsR0FBMkIsRUFBRSxDQUFDO1FBQ2hELHdCQUFtQixHQUEyQixFQUFFLENBQUM7SUFFSCxDQUFDO0lBRXZELFVBQVUsQ0FBQyxJQUErQyxFQUFFLElBQWtCO1FBQzdFLE1BQU0sS0FBSyxHQUFHO1lBQ2IsSUFBSTtZQUNKLElBQUk7WUFDSixJQUFJO1lBQ0osRUFBRTtZQUNGLEtBQUs7WUFDTCxTQUFVO1lB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dEMsQ0FBQztDQUNEIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0aW9uVG9rZW4sIEluamVjdG9yLCBUeXBlLCBnZXREZWJ1Z05vZGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IE5ndEFyZ3MgfSBmcm9tICcuLi9kaXJlY3RpdmVzL2FyZ3MnO1xuaW1wb3J0IHsgTmd0Q29tbW9uRGlyZWN0aXZlIH0gZnJvbSAnLi4vZGlyZWN0aXZlcy9jb21tb24nO1xuaW1wb3J0IHsgTmd0UGFyZW50IH0gZnJvbSAnLi4vZGlyZWN0aXZlcy9wYXJlbnQnO1xuaW1wb3J0IHsgTmd0SW5zdGFuY2VOb2RlLCBnZXRMb2NhbFN0YXRlIH0gZnJvbSAnLi4vaW5zdGFuY2UnO1xuaW1wb3J0IHsgTmd0UmVmIH0gZnJvbSAnLi4vcmVmJztcbmltcG9ydCB7IE5HVF9TVE9SRSwgTmd0U3RhdGUgfSBmcm9tICcuLi9zdG9yZSc7XG5pbXBvcnQgeyBOZ3RBbnlSZWNvcmQgfSBmcm9tICcuLi90eXBlcyc7XG5pbXBvcnQgeyBhcHBseVByb3BzIH0gZnJvbSAnLi4vdXRpbHMvYXBwbHktcHJvcHMnO1xuaW1wb3J0IHsgaXMgfSBmcm9tICcuLi91dGlscy9pcyc7XG5pbXBvcnQgeyBOZ3RTaWduYWxTdG9yZSB9IGZyb20gJy4uL3V0aWxzL3NpZ25hbC1zdG9yZSc7XG5pbXBvcnQgeyBTUEVDSUFMX0lOVEVSTkFMX0FERF9DT01NRU5ULCBTUEVDSUFMX1BST1BFUlRJRVMgfSBmcm9tICcuL2NvbnN0YW50cyc7XG5pbXBvcnQgeyBOZ3RDb21wb3VuZENsYXNzSWQsIE5ndFF1ZXVlT3BDbGFzc0lkLCBOZ3RSZW5kZXJlckNsYXNzSWQsIGF0dGFjaFRocmVlQ2hpbGQsIHJlbW92ZVRocmVlQ2hpbGQgfSBmcm9tICcuL3V0aWxzJztcblxuZXhwb3J0IGNvbnN0IE5HVF9DT01QT1VORF9QUkVGSVhFUyA9IG5ldyBJbmplY3Rpb25Ub2tlbjxzdHJpbmdbXT4oJ05ndENvbXBvdW5kUHJlZml4ZXMnKTtcblxudHlwZSBOZ3RRdWV1ZU9wID0gW3R5cGU6ICdvcCcgfCAnY2xlYW5VcCcsIG9wOiAoKSA9PiB2b2lkLCBkb25lPzogdHJ1ZV07XG5cbmV4cG9ydCB0eXBlIE5ndFJlbmRlcmVyU3RhdGUgPSBbXG5cdHR5cGU6ICd0aHJlZScgfCAnY29tcG91bmQnIHwgJ3BvcnRhbCcgfCAnY29tbWVudCcgfCAnZG9tJyxcblx0cGFyZW50OiBOZ3RSZW5kZXJlck5vZGUgfCBudWxsLFxuXHRpbmplY3RlZFBhcmVudDogTmd0UmVmPE5ndFJlbmRlcmVyTm9kZT4gfCBudWxsLFxuXHRjaGlsZHJlbjogTmd0UmVuZGVyZXJOb2RlW10sXG5cdGRlc3Ryb3llZDogYm9vbGVhbixcblx0Y29tcG91bmQ6IFthcHBseUZpcnN0OiBib29sZWFuLCBwcm9wczogTmd0QW55UmVjb3JkXSxcblx0Y29tcG91bmRQYXJlbnQ6IE5ndFJlbmRlcmVyTm9kZSxcblx0Y29tcG91bmRlZDogTmd0UmVuZGVyZXJOb2RlLFxuXHRxdWV1ZU9wczogU2V0PE5ndFF1ZXVlT3A+LFxuXHRhdHRyaWJ1dGVzOiBOZ3RBbnlSZWNvcmQsXG5cdHByb3BlcnRpZXM6IE5ndEFueVJlY29yZCxcblx0cmF3VmFsdWU6IGFueSxcblx0cmVmOiBhbnksXG5cdHBvcnRhbENvbnRhaW5lcjogTmd0UmVuZGVyZXJOb2RlLFxuXHRpbmplY3RvckZhY3Rvcnk6ICgpID0+IEluamVjdG9yIHwgdW5kZWZpbmVkLFxuXTtcblxuZXhwb3J0IHR5cGUgTmd0UmVuZGVyZXJOb2RlID0ge1xuXHRfX25ndF9yZW5kZXJlcl9fOiBOZ3RSZW5kZXJlclN0YXRlO1xufTtcblxudHlwZSBOZ3RSZW5kZXJlclJvb3RTdGF0ZSA9IHtcblx0c3RvcmU6IE5ndFNpZ25hbFN0b3JlPE5ndFN0YXRlPjtcblx0Y29tcG91bmRQcmVmaXhlczogc3RyaW5nW107XG5cdGRvY3VtZW50OiBEb2N1bWVudDtcbn07XG5cbmV4cG9ydCBjbGFzcyBOZ3RSZW5kZXJlclN0b3JlIHtcblx0cHJpdmF0ZSBhcmdzQ29tbWVudE5vZGVzOiBBcnJheTxOZ3RSZW5kZXJlck5vZGU+ID0gW107XG5cdHByaXZhdGUgcGFyZW50Q29tbWVudE5vZGVzOiBBcnJheTxOZ3RSZW5kZXJlck5vZGU+ID0gW107XG5cdHByaXZhdGUgcG9ydGFsQ29tbWVudHNOb2RlczogQXJyYXk8Tmd0UmVuZGVyZXJOb2RlPiA9IFtdO1xuXG5cdGNvbnN0cnVjdG9yKHByaXZhdGUgcm9vdFN0YXRlOiBOZ3RSZW5kZXJlclJvb3RTdGF0ZSkge31cblxuXHRjcmVhdGVOb2RlKHR5cGU6IE5ndFJlbmRlcmVyU3RhdGVbTmd0UmVuZGVyZXJDbGFzc0lkLnR5cGVdLCBub2RlOiBOZ3RBbnlSZWNvcmQpIHtcblx0XHRjb25zdCBzdGF0ZSA9IFtcblx0XHRcdHR5cGUsXG5cdFx0XHRudWxsLFxuXHRcdFx0bnVsbCxcblx0XHRcdFtdLFxuXHRcdFx0ZmFsc2UsXG5cdFx0XHR1bmRlZmluZWQhLFxuXHRcdFx0dW5kZWZpbmVkISxcblx0XHRcdHVuZGVmaW5lZCEsXG5cdFx0XHR1bmRlZmluZWQhLFxuXHRcdFx0dW5kZWZpbmVkISxcblx0XHRcdHVuZGVmaW5lZCEsXG5cdFx0XHR1bmRlZmluZWQhLFxuXHRcdFx0dW5kZWZpbmVkISxcblx0XHRcdHVuZGVmaW5lZCEsXG5cdFx0XHR1bmRlZmluZWQhLFxuXHRcdF0gYXMgTmd0UmVuZGVyZXJTdGF0ZTtcblxuXHRcdGNvbnN0IHJlbmRlcmVyTm9kZSA9IE9iamVjdC5hc3NpZ24obm9kZSwgeyBfX25ndF9yZW5kZXJlcl9fOiBzdGF0ZSB9KTtcblxuXHRcdC8vIE5PVEU6IGFzc2lnbiBvd25lckRvY3VtZW50IHRvIG5vZGUgc28gd2UgY2FuIHVzZSBIb3N0TGlzdGVuZXIgaW4gQ29tcG9uZW50XG5cdFx0aWYgKCFyZW5kZXJlck5vZGVbJ293bmVyRG9jdW1lbnQnXSkgcmVuZGVyZXJOb2RlWydvd25lckRvY3VtZW50J10gPSB0aGlzLnJvb3RTdGF0ZS5kb2N1bWVudDtcblxuXHRcdC8vIE5PVEU6IGFzc2lnbiBpbmplY3RvckZhY3Rvcnkgb24gbm9uLXRocmVlIHR5cGUgc2luY2Vcblx0XHQvLyByZW5kZXJlck5vZGUgaXMgYW4gaW5zdGFuY2Ugb2YgRE9NIE5vZGVcblx0XHRpZiAoc3RhdGVbTmd0UmVuZGVyZXJDbGFzc0lkLnR5cGVdICE9PSAndGhyZWUnKSB7XG5cdFx0XHRzdGF0ZVtOZ3RSZW5kZXJlckNsYXNzSWQuaW5qZWN0b3JGYWN0b3J5XSA9ICgpID0+IGdldERlYnVnTm9kZShyZW5kZXJlck5vZGUpPy5pbmplY3Rvcjtcblx0XHR9XG5cblx0XHRpZiAoc3RhdGVbTmd0UmVuZGVyZXJDbGFzc0lkLnR5cGVdID09PSAnY29tbWVudCcpIHtcblx0XHRcdC8vIE5PVEU6IHdlIGF0dGFjaCBhbiBhcnJvdyBmdW5jdGlvbiB0byB0aGUgQ29tbWVudCBub2RlXG5cdFx0XHQvLyBJbiBvdXIgZGlyZWN0aXZlcywgd2UgY2FuIGNhbGwgdGhpcyBmdW5jdGlvbiB0byB0aGVuIHN0YXJ0IHRyYWNraW5nIHRoZSBSZW5kZXJlck5vZGVcblx0XHRcdC8vIHRoaXMgaXMgZG9uZSB0byBsaW1pdCB0aGUgYW1vdW50IG9mIE5vZGVzIHdlIG5lZWQgdG8gcHJvY2VzcyBmb3IgZ2V0Q3JlYXRpb25TdGF0ZVxuXHRcdFx0cmVuZGVyZXJOb2RlW1NQRUNJQUxfSU5URVJOQUxfQUREX0NPTU1FTlRdID0gKG5vZGU6IE5ndFJlbmRlcmVyTm9kZSB8ICdhcmdzJyB8ICdwYXJlbnQnKSA9PiB7XG5cdFx0XHRcdGlmIChub2RlID09PSAnYXJncycpIHtcblx0XHRcdFx0XHR0aGlzLmFyZ3NDb21tZW50Tm9kZXMucHVzaChyZW5kZXJlck5vZGUpO1xuXHRcdFx0XHR9IGVsc2UgaWYgKG5vZGUgPT09ICdwYXJlbnQnKSB7XG5cdFx0XHRcdFx0dGhpcy5wYXJlbnRDb21tZW50Tm9kZXMucHVzaChyZW5kZXJlck5vZGUpO1xuXHRcdFx0XHR9IGVsc2UgaWYgKHR5cGVvZiBub2RlID09PSAnb2JqZWN0Jykge1xuXHRcdFx0XHRcdHRoaXMucG9ydGFsQ29tbWVudHNOb2Rlcy5wdXNoKG5vZGUpO1xuXHRcdFx0XHR9XG5cdFx0XHR9O1xuXHRcdFx0cmV0dXJuIHJlbmRlcmVyTm9kZTtcblx0XHR9XG5cblx0XHRpZiAoc3RhdGVbTmd0UmVuZGVyZXJDbGFzc0lkLnR5cGVdID09PSAnY29tcG91bmQnKSB7XG5cdFx0XHRzdGF0ZVtOZ3RSZW5kZXJlckNsYXNzSWQucXVldWVPcHNdID0gbmV3IFNldCgpO1xuXHRcdFx0c3RhdGVbTmd0UmVuZGVyZXJDbGFzc0lkLmF0dHJpYnV0ZXNdID0gc3RhdGVbTmd0UmVuZGVyZXJDbGFzc0lkLnByb3BlcnRpZXNdID0ge307XG5cdFx0XHRyZXR1cm4gcmVuZGVyZXJOb2RlO1xuXHRcdH1cblxuXHRcdHJldHVybiByZW5kZXJlck5vZGU7XG5cdH1cblxuXHRpc0NvbXBvdW5kKG5hbWU6IHN0cmluZykge1xuXHRcdHJldHVybiB0aGlzLnJvb3RTdGF0ZS5jb21wb3VuZFByZWZpeGVzLnNvbWUoKHByZWZpeCkgPT4gbmFtZS5zdGFydHNXaXRoKHByZWZpeCkpO1xuXHR9XG5cblx0aXNET00obm9kZTogTmd0QW55UmVjb3JkKSB7XG5cdFx0Y29uc3QgclMgPSBub2RlWydfX25ndF9yZW5kZXJlcl9fJ107XG5cdFx0cmV0dXJuIChcblx0XHRcdCFyUyB8fFxuXHRcdFx0KHJTW05ndFJlbmRlcmVyQ2xhc3NJZC50eXBlXSAhPT0gJ2NvbXBvdW5kJyAmJlxuXHRcdFx0XHQobm9kZSBpbnN0YW5jZW9mIEVsZW1lbnQgfHwgbm9kZSBpbnN0YW5jZW9mIERvY3VtZW50IHx8IG5vZGUgaW5zdGFuY2VvZiBXaW5kb3cpKVxuXHRcdCk7XG5cdH1cblxuXHRnZXRDbG9zZXN0UGFyZW50V2l0aEluc3RhbmNlKG5vZGU6IE5ndFJlbmRlcmVyTm9kZSk6IE5ndFJlbmRlcmVyTm9kZSB8IG51bGwge1xuXHRcdGxldCBwYXJlbnQgPSBub2RlLl9fbmd0X3JlbmRlcmVyX19bTmd0UmVuZGVyZXJDbGFzc0lkLnBhcmVudF07XG5cblx0XHRpZiAoXG5cdFx0XHRwYXJlbnQgJiZcblx0XHRcdHBhcmVudC5fX25ndF9yZW5kZXJlcl9fW05ndFJlbmRlcmVyQ2xhc3NJZC50eXBlXSA9PT0gJ2NvbXBvdW5kJyAmJlxuXHRcdFx0cGFyZW50Ll9fbmd0X3JlbmRlcmVyX19bTmd0UmVuZGVyZXJDbGFzc0lkLmNvbXBvdW5kZWRdICYmXG5cdFx0XHRwYXJlbnQuX19uZ3RfcmVuZGVyZXJfX1tOZ3RSZW5kZXJlckNsYXNzSWQuY29tcG91bmRlZF0uX19uZ3RfcmVuZGVyZXJfX1tOZ3RSZW5kZXJlckNsYXNzSWQudHlwZV0gPT09ICd0aHJlZSdcblx0XHQpIHtcblx0XHRcdHJldHVybiBwYXJlbnQuX19uZ3RfcmVuZGVyZXJfX1tOZ3RSZW5kZXJlckNsYXNzSWQuY29tcG91bmRlZF07XG5cdFx0fVxuXG5cdFx0aWYgKFxuXHRcdFx0cGFyZW50ICYmXG5cdFx0XHRwYXJlbnQuX19uZ3RfcmVuZGVyZXJfX1tOZ3RSZW5kZXJlckNsYXNzSWQudHlwZV0gPT09ICdwb3J0YWwnICYmXG5cdFx0XHRwYXJlbnQuX19uZ3RfcmVuZGVyZXJfX1tOZ3RSZW5kZXJlckNsYXNzSWQucG9ydGFsQ29udGFpbmVyXT8uX19uZ3RfcmVuZGVyZXJfX1tOZ3RSZW5kZXJlckNsYXNzSWQudHlwZV0gPT09ICd0aHJlZSdcblx0XHQpIHtcblx0XHRcdHJldHVybiBwYXJlbnQuX19uZ3RfcmVuZGVyZXJfX1tOZ3RSZW5kZXJlckNsYXNzSWQucG9ydGFsQ29udGFpbmVyXTtcblx0XHR9XG5cblx0XHR3aGlsZSAocGFyZW50ICYmIHBhcmVudC5fX25ndF9yZW5kZXJlcl9fW05ndFJlbmRlcmVyQ2xhc3NJZC50eXBlXSAhPT0gJ3RocmVlJykge1xuXHRcdFx0cGFyZW50ID0gcGFyZW50Ll9fbmd0X3JlbmRlcmVyX19bTmd0UmVuZGVyZXJDbGFzc0lkLnBvcnRhbENvbnRhaW5lcl1cblx0XHRcdFx0PyBwYXJlbnQuX19uZ3RfcmVuZGVyZXJfX1tOZ3RSZW5kZXJlckNsYXNzSWQucG9ydGFsQ29udGFpbmVyXVxuXHRcdFx0XHQ6IHBhcmVudC5fX25ndF9yZW5kZXJlcl9fW05ndFJlbmRlcmVyQ2xhc3NJZC5wYXJlbnRdO1xuXHRcdH1cblxuXHRcdHJldHVybiBwYXJlbnQ7XG5cdH1cblxuXHRnZXRDbG9zZXN0UGFyZW50V2l0aENvbXBvdW5kKG5vZGU6IE5ndFJlbmRlcmVyTm9kZSkge1xuXHRcdGlmIChub2RlLl9fbmd0X3JlbmRlcmVyX19bTmd0UmVuZGVyZXJDbGFzc0lkLmNvbXBvdW5kUGFyZW50XSkge1xuXHRcdFx0cmV0dXJuIG5vZGUuX19uZ3RfcmVuZGVyZXJfX1tOZ3RSZW5kZXJlckNsYXNzSWQuY29tcG91bmRQYXJlbnRdO1xuXHRcdH1cblxuXHRcdGxldCBwYXJlbnQgPSBub2RlLl9fbmd0X3JlbmRlcmVyX19bTmd0UmVuZGVyZXJDbGFzc0lkLnBhcmVudF07XG5cdFx0aWYgKFxuXHRcdFx0cGFyZW50ICYmXG5cdFx0XHRwYXJlbnQuX19uZ3RfcmVuZGVyZXJfX1tOZ3RSZW5kZXJlckNsYXNzSWQudHlwZV0gPT09ICdjb21wb3VuZCcgJiZcblx0XHRcdCFwYXJlbnQuX19uZ3RfcmVuZGVyZXJfX1tOZ3RSZW5kZXJlckNsYXNzSWQuY29tcG91bmRlZF1cblx0XHQpIHtcblx0XHRcdHJldHVybiBwYXJlbnQ7XG5cdFx0fVxuXG5cdFx0d2hpbGUgKFxuXHRcdFx0cGFyZW50ICYmXG5cdFx0XHQocGFyZW50Ll9fbmd0X3JlbmRlcmVyX19bTmd0UmVuZGVyZXJDbGFzc0lkLnR5cGVdID09PSAndGhyZWUnIHx8XG5cdFx0XHRcdCFwYXJlbnQuX19uZ3RfcmVuZGVyZXJfX1tOZ3RSZW5kZXJlckNsYXNzSWQuY29tcG91bmRQYXJlbnRdIHx8XG5cdFx0XHRcdHBhcmVudC5fX25ndF9yZW5kZXJlcl9fW05ndFJlbmRlcmVyQ2xhc3NJZC50eXBlXSAhPT0gJ2NvbXBvdW5kJylcblx0XHQpIHtcblx0XHRcdHBhcmVudCA9IHBhcmVudC5fX25ndF9yZW5kZXJlcl9fW05ndFJlbmRlcmVyQ2xhc3NJZC5wYXJlbnRdO1xuXHRcdH1cblxuXHRcdGlmICghcGFyZW50KSByZXR1cm4gbnVsbDtcblxuXHRcdGlmIChcblx0XHRcdHBhcmVudC5fX25ndF9yZW5kZXJlcl9fW05ndFJlbmRlcmVyQ2xhc3NJZC50eXBlXSA9PT0gJ3RocmVlJyAmJlxuXHRcdFx0cGFyZW50Ll9fbmd0X3JlbmRlcmVyX19bTmd0UmVuZGVyZXJDbGFzc0lkLmNvbXBvdW5kUGFyZW50XVxuXHRcdCkge1xuXHRcdFx0cmV0dXJuIHBhcmVudC5fX25ndF9yZW5kZXJlcl9fW05ndFJlbmRlcmVyQ2xhc3NJZC5jb21wb3VuZFBhcmVudF07XG5cdFx0fVxuXG5cdFx0aWYgKCFwYXJlbnQuX19uZ3RfcmVuZGVyZXJfX1tOZ3RSZW5kZXJlckNsYXNzSWQuY29tcG91bmRlZF0pIHtcblx0XHRcdHJldHVybiBwYXJlbnQ7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIG51bGw7XG5cdH1cblxuXHRwcm9jZXNzUG9ydGFsQ29udGFpbmVyKHBvcnRhbDogTmd0UmVuZGVyZXJOb2RlKSB7XG5cdFx0Y29uc3QgaW5qZWN0b3IgPSBwb3J0YWwuX19uZ3RfcmVuZGVyZXJfX1tOZ3RSZW5kZXJlckNsYXNzSWQuaW5qZWN0b3JGYWN0b3J5XT8uKCk7XG5cdFx0aWYgKCFpbmplY3RvcikgcmV0dXJuO1xuXG5cdFx0Y29uc3QgcG9ydGFsU3RvcmUgPSBpbmplY3Rvci5nZXQoTkdUX1NUT1JFLCBudWxsKTtcblx0XHRpZiAoIXBvcnRhbFN0b3JlKSByZXR1cm47XG5cblx0XHRjb25zdCBwb3J0YWxDb250YWluZXIgPSBwb3J0YWxTdG9yZS5nZXQoJ3NjZW5lJyk7XG5cdFx0aWYgKCFwb3J0YWxDb250YWluZXIpIHJldHVybjtcblxuXHRcdHBvcnRhbC5fX25ndF9yZW5kZXJlcl9fW05ndFJlbmRlcmVyQ2xhc3NJZC5wb3J0YWxDb250YWluZXJdID0gdGhpcy5jcmVhdGVOb2RlKCd0aHJlZScsIHBvcnRhbENvbnRhaW5lcik7XG5cdH1cblxuXHRnZXRDcmVhdGlvblN0YXRlKCkge1xuXHRcdHJldHVybiBbXG5cdFx0XHR0aGlzLmZpcnN0Tm9uSW5qZWN0ZWREaXJlY3RpdmUoJ2FyZ3NDb21tZW50Tm9kZXMnLCBOZ3RBcmdzKT8udmFsdWUgfHwgW10sXG5cdFx0XHR0aGlzLmZpcnN0Tm9uSW5qZWN0ZWREaXJlY3RpdmUoJ3BhcmVudENvbW1lbnROb2RlcycsIE5ndFBhcmVudCk/LnZhbHVlIHx8IG51bGwsXG5cdFx0XHR0aGlzLnRyeUdldFBvcnRhbFN0b3JlKCksXG5cdFx0XSBhcyBjb25zdDtcblx0fVxuXG5cdHNldFBhcmVudChub2RlOiBOZ3RSZW5kZXJlck5vZGUsIHBhcmVudDogTmd0UmVuZGVyZXJOb2RlKSB7XG5cdFx0aWYgKCFub2RlLl9fbmd0X3JlbmRlcmVyX19bTmd0UmVuZGVyZXJDbGFzc0lkLnBhcmVudF0pIHtcblx0XHRcdG5vZGUuX19uZ3RfcmVuZGVyZXJfX1tOZ3RSZW5kZXJlckNsYXNzSWQucGFyZW50XSA9IHBhcmVudDtcblx0XHR9XG5cdH1cblxuXHRhZGRDaGlsZChub2RlOiBOZ3RSZW5kZXJlck5vZGUsIGNoaWxkOiBOZ3RSZW5kZXJlck5vZGUpIHtcblx0XHRpZiAoIW5vZGUuX19uZ3RfcmVuZGVyZXJfX1tOZ3RSZW5kZXJlckNsYXNzSWQuY2hpbGRyZW5dLmluY2x1ZGVzKGNoaWxkKSkge1xuXHRcdFx0bm9kZS5fX25ndF9yZW5kZXJlcl9fW05ndFJlbmRlcmVyQ2xhc3NJZC5jaGlsZHJlbl0ucHVzaChjaGlsZCk7XG5cdFx0fVxuXHR9XG5cblx0cmVtb3ZlQ2hpbGQobm9kZTogTmd0UmVuZGVyZXJOb2RlLCBjaGlsZDogTmd0UmVuZGVyZXJOb2RlKSB7XG5cdFx0Y29uc3QgaW5kZXggPSBub2RlLl9fbmd0X3JlbmRlcmVyX18/LltOZ3RSZW5kZXJlckNsYXNzSWQuY2hpbGRyZW5dLmZpbmRJbmRleCgoYykgPT4gY2hpbGQgPT09IGMpO1xuXHRcdGlmIChpbmRleCA+PSAwKSB7XG5cdFx0XHRub2RlLl9fbmd0X3JlbmRlcmVyX19bTmd0UmVuZGVyZXJDbGFzc0lkLmNoaWxkcmVuXS5zcGxpY2UoaW5kZXgsIDEpO1xuXHRcdH1cblx0fVxuXG5cdHNldENvbXBvdW5kKGNvbXBvdW5kOiBOZ3RSZW5kZXJlck5vZGUsIGluc3RhbmNlOiBOZ3RSZW5kZXJlck5vZGUpIHtcblx0XHRjb25zdCBpbnN0YW5jZVJTID0gaW5zdGFuY2UuX19uZ3RfcmVuZGVyZXJfXztcblxuXHRcdGlmIChpbnN0YW5jZVJTICYmIGluc3RhbmNlUlNbTmd0UmVuZGVyZXJDbGFzc0lkLnBhcmVudF0pIHtcblx0XHRcdGNvbnN0IHBhcmVudFJTID0gaW5zdGFuY2VSU1tOZ3RSZW5kZXJlckNsYXNzSWQucGFyZW50XS5fX25ndF9yZW5kZXJlcl9fO1xuXHRcdFx0Ly8gTk9URTogaWYgaW5zdGFuY2UgaXMgYWxyZWFkeSBjb21wb3VuZGVkIGJ5IGl0cyBwYXJlbnQuIHNraXBcblx0XHRcdGlmIChwYXJlbnRSU1tOZ3RSZW5kZXJlckNsYXNzSWQudHlwZV0gPT09ICdjb21wb3VuZCcgJiYgcGFyZW50UlNbTmd0UmVuZGVyZXJDbGFzc0lkLmNvbXBvdW5kZWRdID09PSBpbnN0YW5jZSkge1xuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Y29uc3QgclMgPSBjb21wb3VuZC5fX25ndF9yZW5kZXJlcl9fO1xuXHRcdHJTW05ndFJlbmRlcmVyQ2xhc3NJZC5jb21wb3VuZGVkXSA9IGluc3RhbmNlO1xuXG5cdFx0Zm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXMoclNbTmd0UmVuZGVyZXJDbGFzc0lkLmF0dHJpYnV0ZXNdKSkge1xuXHRcdFx0dGhpcy5hcHBseUF0dHJpYnV0ZShpbnN0YW5jZSwga2V5LCByU1tOZ3RSZW5kZXJlckNsYXNzSWQuYXR0cmlidXRlc11ba2V5XSk7XG5cdFx0fVxuXG5cdFx0Zm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXMoclNbTmd0UmVuZGVyZXJDbGFzc0lkLnByb3BlcnRpZXNdKSkge1xuXHRcdFx0dGhpcy5hcHBseVByb3BlcnR5KGluc3RhbmNlLCBrZXksIHJTW05ndFJlbmRlcmVyQ2xhc3NJZC5wcm9wZXJ0aWVzXVtrZXldKTtcblx0XHR9XG5cblx0XHR0aGlzLmV4ZWN1dGVPcGVyYXRpb24oY29tcG91bmQpO1xuXHR9XG5cblx0cXVldWVPcGVyYXRpb24obm9kZTogTmd0UmVuZGVyZXJOb2RlLCBvcDogTmd0UXVldWVPcCkge1xuXHRcdG5vZGUuX19uZ3RfcmVuZGVyZXJfX1tOZ3RSZW5kZXJlckNsYXNzSWQucXVldWVPcHNdLmFkZChvcCk7XG5cdH1cblxuXHRwcml2YXRlIGV4ZWN1dGVPcGVyYXRpb24obm9kZTogTmd0UmVuZGVyZXJOb2RlLCB0eXBlOiBOZ3RRdWV1ZU9wW05ndFF1ZXVlT3BDbGFzc0lkLnR5cGVdID0gJ29wJykge1xuXHRcdGNvbnN0IHJTID0gbm9kZS5fX25ndF9yZW5kZXJlcl9fO1xuXHRcdC8vIFRPRE86IG1heWJlIGFuIGFycmF5IHdpdGggcG9wKCkgd291bGQgd29yayBiZXR0ZXJcblx0XHRpZiAoclNbTmd0UmVuZGVyZXJDbGFzc0lkLnF1ZXVlT3BzXT8uc2l6ZSkge1xuXHRcdFx0clNbTmd0UmVuZGVyZXJDbGFzc0lkLnF1ZXVlT3BzXS5mb3JFYWNoKChvcCkgPT4ge1xuXHRcdFx0XHRpZiAob3BbTmd0UXVldWVPcENsYXNzSWQudHlwZV0gPT09IHR5cGUpIHtcblx0XHRcdFx0XHRvcFtOZ3RRdWV1ZU9wQ2xhc3NJZC5vcF0oKTtcblx0XHRcdFx0XHRyU1tOZ3RSZW5kZXJlckNsYXNzSWQucXVldWVPcHNdLmRlbGV0ZShvcCk7XG5cdFx0XHRcdH1cblx0XHRcdH0pO1xuXHRcdH1cblx0fVxuXG5cdGFwcGx5QXR0cmlidXRlKG5vZGU6IE5ndFJlbmRlcmVyTm9kZSwgbmFtZTogc3RyaW5nLCB2YWx1ZTogc3RyaW5nKSB7XG5cdFx0Y29uc3QgclMgPSBub2RlLl9fbmd0X3JlbmRlcmVyX187XG5cdFx0aWYgKHJTW05ndFJlbmRlcmVyQ2xhc3NJZC5kZXN0cm95ZWRdKSByZXR1cm47XG5cdFx0aWYgKG5hbWUgPT09IFNQRUNJQUxfUFJPUEVSVElFUy5SRU5ERVJfUFJJT1JJVFkpIHtcblx0XHRcdC8vIE5PVEU6IHByaW9yaXR5IG5lZWRzIHRvIGJlIHNldCBhcyBhbiBhdHRyaWJ1dGUgc3RyaW5nIHNvIHRoYXQgdGhleSBjYW4gYmUgc2V0IGFzIGVhcmx5IGFzIHBvc3NpYmxlXG5cdFx0XHQvLyB3ZSBjb252ZXJ0IHRoYXQgc3RyaW5nIHRvIGEgbnVtYmVyLiBpZiBpdCdzIGludmFsaWQsIGRlZmF1bHQgMFxuXHRcdFx0bGV0IHByaW9yaXR5ID0gTnVtYmVyKHZhbHVlKTtcblx0XHRcdGlmIChpc05hTihwcmlvcml0eSkpIHtcblx0XHRcdFx0cHJpb3JpdHkgPSAwO1xuXHRcdFx0XHRjb25zb2xlLndhcm4oYFtOR1RdIFwicHJpb3JpdHlcIiBpcyBhbiBpbnZhbGlkIG51bWJlciwgZGVmYXVsdCB0byAwYCk7XG5cdFx0XHR9XG5cdFx0XHRjb25zdCBsb2NhbFN0YXRlID0gZ2V0TG9jYWxTdGF0ZShub2RlKTtcblx0XHRcdGlmIChsb2NhbFN0YXRlKSB7XG5cdFx0XHRcdGxvY2FsU3RhdGUucHJpb3JpdHkgPSBwcmlvcml0eTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRpZiAobmFtZSA9PT0gU1BFQ0lBTF9QUk9QRVJUSUVTLkNPTVBPVU5EKSB7XG5cdFx0XHQvLyBOT1RFOiB3ZSBzZXQgdGhlIGNvbXBvdW5kIHByb3BlcnR5IG9uIGluc3RhbmNlIG5vZGUgbm93IHNvIHdlIGtub3cgdGhhdCB0aGlzIGluc3RhbmNlIGlzIGJlaW5nIGNvbXBvdW5kZWRcblx0XHRcdHJTW05ndFJlbmRlcmVyQ2xhc3NJZC5jb21wb3VuZF0gPSBbdmFsdWUgPT09ICcnIHx8IHZhbHVlID09PSAnZmlyc3QnLCB7fV07XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0aWYgKG5hbWUgPT09IFNQRUNJQUxfUFJPUEVSVElFUy5BVFRBQ0gpIHtcblx0XHRcdC8vIE5PVEU6IGhhbmRsZSBhdHRhY2ggYXMgdHJpbmdcblx0XHRcdGNvbnN0IHBhdGhzID0gdmFsdWUuc3BsaXQoJy4nKTtcblx0XHRcdGlmIChwYXRocy5sZW5ndGgpIHtcblx0XHRcdFx0Y29uc3QgbG9jYWxTdGF0ZSA9IGdldExvY2FsU3RhdGUobm9kZSk7XG5cdFx0XHRcdGlmIChsb2NhbFN0YXRlKSB7XG5cdFx0XHRcdFx0bG9jYWxTdGF0ZS5hdHRhY2ggPSBwYXRocztcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdGlmIChuYW1lID09PSBTUEVDSUFMX1BST1BFUlRJRVMuUkFXX1ZBTFVFKSB7XG5cdFx0XHQvLyBOT1RFOiBjb2VyY2lvblxuXHRcdFx0bGV0IG1heWJlQ29lcmNlZDogc3RyaW5nIHwgbnVtYmVyIHwgYm9vbGVhbiA9IHZhbHVlO1xuXHRcdFx0aWYgKG1heWJlQ29lcmNlZCA9PT0gJycgfHwgbWF5YmVDb2VyY2VkID09PSAndHJ1ZScgfHwgbWF5YmVDb2VyY2VkID09PSAnZmFsc2UnKSB7XG5cdFx0XHRcdG1heWJlQ29lcmNlZCA9IG1heWJlQ29lcmNlZCA9PT0gJ3RydWUnIHx8IG1heWJlQ29lcmNlZCA9PT0gJyc7XG5cdFx0XHR9IGVsc2UgaWYgKCFpc05hTihOdW1iZXIobWF5YmVDb2VyY2VkKSkpIHtcblx0XHRcdFx0bWF5YmVDb2VyY2VkID0gTnVtYmVyKG1heWJlQ29lcmNlZCk7XG5cdFx0XHR9XG5cdFx0XHRyU1tOZ3RSZW5kZXJlckNsYXNzSWQucmF3VmFsdWVdID0gbWF5YmVDb2VyY2VkO1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdGFwcGx5UHJvcHMobm9kZSwgeyBbbmFtZV06IHZhbHVlIH0pO1xuXHRcdHRoaXMudXBkYXRlTmF0aXZlUHJvcHMobm9kZSwgbmFtZSwgdmFsdWUpO1xuXHR9XG5cblx0YXBwbHlQcm9wZXJ0eShub2RlOiBOZ3RSZW5kZXJlck5vZGUsIG5hbWU6IHN0cmluZywgdmFsdWU6IGFueSkge1xuXHRcdGNvbnN0IHJTID0gbm9kZS5fX25ndF9yZW5kZXJlcl9fO1xuXHRcdGlmIChyU1tOZ3RSZW5kZXJlckNsYXNzSWQuZGVzdHJveWVkXSkgcmV0dXJuO1xuXG5cdFx0Ly8gW3JlZl1cblx0XHRpZiAobmFtZSA9PT0gU1BFQ0lBTF9QUk9QRVJUSUVTLlJFRiAmJiBpcy5yZWYodmFsdWUpKSB7XG5cdFx0XHRyU1tOZ3RSZW5kZXJlckNsYXNzSWQucmVmXSA9IHZhbHVlO1xuXHRcdFx0dmFsdWUubmF0aXZlRWxlbWVudCA9IG5vZGU7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0Y29uc3QgbG9jYWxTdGF0ZSA9IGdldExvY2FsU3RhdGUobm9kZSk7XG5cdFx0Y29uc3QgcGFyZW50ID0gbG9jYWxTdGF0ZT8uaW5zdGFuY2VTdG9yZS5nZXQoJ3BhcmVudCcpIHx8IHJTW05ndFJlbmRlcmVyQ2xhc3NJZC5wYXJlbnRdO1xuXG5cdFx0Ly8gW3Jhd1ZhbHVlXVxuXHRcdGlmIChsb2NhbFN0YXRlPy5pc1JhdyAmJiBuYW1lID09PSBTUEVDSUFMX1BST1BFUlRJRVMuUkFXX1ZBTFVFKSB7XG5cdFx0XHRyU1tOZ3RSZW5kZXJlckNsYXNzSWQucmF3VmFsdWVdID0gdmFsdWU7XG5cdFx0XHRpZiAocGFyZW50KSBhdHRhY2hUaHJlZUNoaWxkKHBhcmVudCwgbm9kZSk7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0Ly8gW2F0dGFjaF1cblx0XHRpZiAobmFtZSA9PT0gU1BFQ0lBTF9QUk9QRVJUSUVTLkFUVEFDSCkge1xuXHRcdFx0aWYgKGxvY2FsU3RhdGUpIGxvY2FsU3RhdGUuYXR0YWNoID0gQXJyYXkuaXNBcnJheSh2YWx1ZSkgPyB2YWx1ZS5tYXAoKHYpID0+IHYudG9TdHJpbmcoKSkgOiB2YWx1ZTtcblx0XHRcdGlmIChwYXJlbnQpIGF0dGFjaFRocmVlQ2hpbGQocGFyZW50LCBub2RlKTtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHRjb25zdCBjb21wb3VuZCA9IHJTW05ndFJlbmRlcmVyQ2xhc3NJZC5jb21wb3VuZF07XG5cdFx0aWYgKFxuXHRcdFx0Y29tcG91bmQ/LltOZ3RDb21wb3VuZENsYXNzSWQucHJvcHNdICYmXG5cdFx0XHRuYW1lIGluIGNvbXBvdW5kW05ndENvbXBvdW5kQ2xhc3NJZC5wcm9wc10gJiZcblx0XHRcdCFjb21wb3VuZFtOZ3RDb21wb3VuZENsYXNzSWQuYXBwbHlGaXJzdF1cblx0XHQpIHtcblx0XHRcdHZhbHVlID0gY29tcG91bmRbTmd0Q29tcG91bmRDbGFzc0lkLnByb3BzXVtuYW1lXTtcblx0XHR9XG5cblx0XHRhcHBseVByb3BzKG5vZGUsIHsgW25hbWVdOiB2YWx1ZSB9KTtcblx0XHR0aGlzLnVwZGF0ZU5hdGl2ZVByb3BzKG5vZGUsIG5hbWUsIHZhbHVlKTtcblx0fVxuXG5cdGFwcGx5UGFyYW1ldGVycyhub2RlOiBOZ3RSZW5kZXJlck5vZGUsIHBhcmFtZXRlcnM6IE5ndEFueVJlY29yZCkge1xuXHRcdGNvbnN0IHJTID0gbm9kZS5fX25ndF9yZW5kZXJlcl9fO1xuXHRcdGlmIChyU1tOZ3RSZW5kZXJlckNsYXNzSWQuZGVzdHJveWVkXSkgcmV0dXJuO1xuXG5cdFx0YXBwbHlQcm9wcyhub2RlLCBwYXJhbWV0ZXJzKTtcblx0XHR0aGlzLnVwZGF0ZU5hdGl2ZVByb3BzKG5vZGUsICdwYXJhbWV0ZXJzJywgcGFyYW1ldGVycyk7XG5cdH1cblxuXHRnZXQgcm9vdFNjZW5lKCkge1xuXHRcdHJldHVybiB0aGlzLnJvb3RTdGF0ZS5zdG9yZS5nZXQoJ3NjZW5lJyk7XG5cdH1cblxuXHRkZXN0cm95KG5vZGU6IE5ndFJlbmRlcmVyTm9kZSwgcGFyZW50PzogTmd0UmVuZGVyZXJOb2RlKSB7XG5cdFx0Y29uc3QgclMgPSBub2RlLl9fbmd0X3JlbmRlcmVyX187XG5cdFx0aWYgKCFyUyB8fCByU1tOZ3RSZW5kZXJlckNsYXNzSWQuZGVzdHJveWVkXSkgcmV0dXJuO1xuXHRcdGlmIChyU1tOZ3RSZW5kZXJlckNsYXNzSWQudHlwZV0gPT09ICd0aHJlZScpIHtcblx0XHRcdHJTW05ndFJlbmRlcmVyQ2xhc3NJZC5jb21wb3VuZF0gPSB1bmRlZmluZWQhO1xuXHRcdFx0clNbTmd0UmVuZGVyZXJDbGFzc0lkLmNvbXBvdW5kUGFyZW50XSA9IHVuZGVmaW5lZCE7XG5cblx0XHRcdGNvbnN0IGxvY2FsU3RhdGUgPSBnZXRMb2NhbFN0YXRlKG5vZGUpO1xuXHRcdFx0aWYgKGxvY2FsU3RhdGU/Lmluc3RhbmNlU3RvcmUpIHtcblx0XHRcdFx0bG9jYWxTdGF0ZS5pbnN0YW5jZVN0b3JlLmdldCgnb2JqZWN0cycpLmZvckVhY2goKG9iaikgPT4gdGhpcy5kZXN0cm95KG9iaiwgcGFyZW50KSk7XG5cdFx0XHRcdGxvY2FsU3RhdGUuaW5zdGFuY2VTdG9yZS5nZXQoJ25vbk9iamVjdHMnKS5mb3JFYWNoKChvYmopID0+IHRoaXMuZGVzdHJveShvYmosIHBhcmVudCkpO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAobG9jYWxTdGF0ZT8uYWZ0ZXJVcGRhdGUpIGxvY2FsU3RhdGUuYWZ0ZXJVcGRhdGUuY29tcGxldGUoKTtcblx0XHRcdGlmIChsb2NhbFN0YXRlPy5hZnRlckF0dGFjaCkgbG9jYWxTdGF0ZS5hZnRlckF0dGFjaC5jb21wbGV0ZSgpO1xuXG5cdFx0XHRkZWxldGUgKGxvY2FsU3RhdGUgYXMgTmd0QW55UmVjb3JkKVsnb2JqZWN0cyddO1xuXHRcdFx0ZGVsZXRlIChsb2NhbFN0YXRlIGFzIE5ndEFueVJlY29yZClbJ25vbk9iamVjdHMnXTtcblx0XHRcdGRlbGV0ZSAobG9jYWxTdGF0ZSBhcyBOZ3RBbnlSZWNvcmQpWydwYXJlbnQnXTtcblx0XHRcdGRlbGV0ZSAobG9jYWxTdGF0ZSBhcyBOZ3RBbnlSZWNvcmQpWyduYXRpdmVQcm9wcyddO1xuXHRcdFx0ZGVsZXRlIChsb2NhbFN0YXRlIGFzIE5ndEFueVJlY29yZClbJ2FkZCddO1xuXHRcdFx0ZGVsZXRlIChsb2NhbFN0YXRlIGFzIE5ndEFueVJlY29yZClbJ3JlbW92ZSddO1xuXHRcdFx0ZGVsZXRlIChsb2NhbFN0YXRlIGFzIE5ndEFueVJlY29yZClbJ2FmdGVyVXBkYXRlJ107XG5cdFx0XHRkZWxldGUgKGxvY2FsU3RhdGUgYXMgTmd0QW55UmVjb3JkKVsnYWZ0ZXJBdHRhY2gnXTtcblx0XHRcdGRlbGV0ZSAobG9jYWxTdGF0ZSBhcyBOZ3RBbnlSZWNvcmQpWydzdG9yZSddO1xuXHRcdFx0ZGVsZXRlIChsb2NhbFN0YXRlIGFzIE5ndEFueVJlY29yZClbJ2hhbmRsZXJzJ107XG5cblx0XHRcdGlmICghbG9jYWxTdGF0ZT8ucHJpbWl0aXZlKSB7XG5cdFx0XHRcdGRlbGV0ZSAobm9kZSBhcyBOZ3RBbnlSZWNvcmQpWydfX25ndF9fJ107XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0aWYgKHJTW05ndFJlbmRlcmVyQ2xhc3NJZC50eXBlXSA9PT0gJ2NvbW1lbnQnKSB7XG5cdFx0XHRyU1tOZ3RSZW5kZXJlckNsYXNzSWQuaW5qZWN0b3JGYWN0b3J5XSA9IG51bGwhO1xuXHRcdFx0ZGVsZXRlIChub2RlIGFzIE5ndEFueVJlY29yZClbU1BFQ0lBTF9JTlRFUk5BTF9BRERfQ09NTUVOVF07XG5cdFx0XHRpZiAoIXRoaXMucmVtb3ZlQ29tbWVudE5vZGUobm9kZSwgdGhpcy5hcmdzQ29tbWVudE5vZGVzKSkge1xuXHRcdFx0XHR0aGlzLnJlbW92ZUNvbW1lbnROb2RlKG5vZGUsIHRoaXMucGFyZW50Q29tbWVudE5vZGVzKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRpZiAoclNbTmd0UmVuZGVyZXJDbGFzc0lkLnR5cGVdID09PSAncG9ydGFsJykge1xuXHRcdFx0clNbTmd0UmVuZGVyZXJDbGFzc0lkLmluamVjdG9yRmFjdG9yeV0gPSBudWxsITtcblx0XHRcdHRoaXMucmVtb3ZlQ29tbWVudE5vZGUobm9kZSwgdGhpcy5wb3J0YWxDb21tZW50c05vZGVzKTtcblx0XHR9XG5cblx0XHRpZiAoclNbTmd0UmVuZGVyZXJDbGFzc0lkLnR5cGVdID09PSAnY29tcG91bmQnKSB7XG5cdFx0XHRyU1tOZ3RSZW5kZXJlckNsYXNzSWQuY29tcG91bmRlZF0gPSB1bmRlZmluZWQhO1xuXHRcdFx0clNbTmd0UmVuZGVyZXJDbGFzc0lkLmF0dHJpYnV0ZXNdID0gbnVsbCE7XG5cdFx0XHRyU1tOZ3RSZW5kZXJlckNsYXNzSWQucHJvcGVydGllc10gPSBudWxsITtcblx0XHRcdHRoaXMuZXhlY3V0ZU9wZXJhdGlvbihub2RlLCAnY2xlYW5VcCcpO1xuXHRcdFx0clNbTmd0UmVuZGVyZXJDbGFzc0lkLnF1ZXVlT3BzXS5jbGVhcigpO1xuXHRcdFx0clNbTmd0UmVuZGVyZXJDbGFzc0lkLnF1ZXVlT3BzXSA9IG51bGwhO1xuXHRcdH1cblxuXHRcdGlmIChyU1tOZ3RSZW5kZXJlckNsYXNzSWQucmVmXSkge1xuXHRcdFx0Ly8gbnVsbGlmeSByZWZcblx0XHRcdC8vIGJ1dCB3ZSBkbyBpdCBsYXRlciBzbyB0aGF0IGl0IGRvZXNuJ3QgaGluZGVyIHJlbmRlclxuXHRcdFx0Ly8gVE9ETzogd2lsbCB0aGlzIGNhdXNlIG1lbW9yeSBsZWFrP1xuXHRcdFx0cmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcblx0XHRcdFx0clNbTmd0UmVuZGVyZXJDbGFzc0lkLnJlZl0ubmF0aXZlRWxlbWVudCA9IG51bGw7XG5cdFx0XHRcdHJTW05ndFJlbmRlcmVyQ2xhc3NJZC5yZWZdID0gdW5kZWZpbmVkITtcblx0XHRcdH0pO1xuXHRcdH1cblxuXHRcdC8vIG51bGxpZnkgcGFyZW50XG5cdFx0clNbTmd0UmVuZGVyZXJDbGFzc0lkLnBhcmVudF0gPSBudWxsO1xuXHRcdGZvciAoY29uc3QgcmVuZGVyQ2hpbGQgb2YgclNbTmd0UmVuZGVyZXJDbGFzc0lkLmNoaWxkcmVuXSB8fCBbXSkge1xuXHRcdFx0aWYgKHJlbmRlckNoaWxkLl9fbmd0X3JlbmRlcmVyX18/LltOZ3RSZW5kZXJlckNsYXNzSWQudHlwZV0gPT09ICd0aHJlZScgJiYgcGFyZW50KSB7XG5cdFx0XHRcdGlmIChwYXJlbnQuX19uZ3RfcmVuZGVyZXJfXz8uW05ndFJlbmRlcmVyQ2xhc3NJZC50eXBlXSA9PT0gJ3RocmVlJykge1xuXHRcdFx0XHRcdHJlbW92ZVRocmVlQ2hpbGQocGFyZW50LCByZW5kZXJDaGlsZCwgdHJ1ZSk7XG5cdFx0XHRcdFx0Y29udGludWU7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRjb25zdCBjbG9zZXN0SW5zdGFuY2UgPSB0aGlzLmdldENsb3Nlc3RQYXJlbnRXaXRoSW5zdGFuY2UocGFyZW50KTtcblx0XHRcdFx0aWYgKGNsb3Nlc3RJbnN0YW5jZSkge1xuXHRcdFx0XHRcdHJlbW92ZVRocmVlQ2hpbGQoY2xvc2VzdEluc3RhbmNlLCByZW5kZXJDaGlsZCwgdHJ1ZSk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdHRoaXMuZGVzdHJveShyZW5kZXJDaGlsZCwgcGFyZW50KTtcblx0XHR9XG5cblx0XHRyU1tOZ3RSZW5kZXJlckNsYXNzSWQuY2hpbGRyZW5dID0gW107XG5cdFx0clNbTmd0UmVuZGVyZXJDbGFzc0lkLmRlc3Ryb3llZF0gPSB0cnVlO1xuXHRcdGlmIChwYXJlbnQpIHtcblx0XHRcdHRoaXMucmVtb3ZlQ2hpbGQocGFyZW50LCBub2RlKTtcblx0XHR9XG5cdH1cblxuXHRwcml2YXRlIHJlbW92ZUNvbW1lbnROb2RlKG5vZGU6IE5ndFJlbmRlcmVyTm9kZSwgbm9kZXM6IE5ndFJlbmRlcmVyTm9kZVtdKSB7XG5cdFx0Y29uc3QgaW5kZXggPSBub2Rlcy5maW5kSW5kZXgoKGNvbW1lbnQpID0+IGNvbW1lbnQgPT09IG5vZGUpO1xuXHRcdGlmIChpbmRleCA+IC0xKSB7XG5cdFx0XHRub2Rlcy5zcGxpY2UoaW5kZXgsIDEpO1xuXHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0fVxuXHRcdHJldHVybiBmYWxzZTtcblx0fVxuXG5cdHByaXZhdGUgdXBkYXRlTmF0aXZlUHJvcHMobm9kZTogTmd0SW5zdGFuY2VOb2RlLCBrZXk6IHN0cmluZywgdmFsdWU6IGFueSkge1xuXHRcdGNvbnN0IGxvY2FsU3RhdGUgPSBnZXRMb2NhbFN0YXRlKG5vZGUpO1xuXHRcdGxvY2FsU3RhdGU/LnNldE5hdGl2ZVByb3BzKGtleSwgdmFsdWUpO1xuXHR9XG5cblx0cHJpdmF0ZSBmaXJzdE5vbkluamVjdGVkRGlyZWN0aXZlPFQgZXh0ZW5kcyBOZ3RDb21tb25EaXJlY3RpdmU8YW55Pj4oXG5cdFx0bGlzdFByb3BlcnR5OiAnYXJnc0NvbW1lbnROb2RlcycgfCAncGFyZW50Q29tbWVudE5vZGVzJyxcblx0XHRkaXI6IFR5cGU8VD4sXG5cdCkge1xuXHRcdGxldCBkaXJlY3RpdmU6IFQgfCB1bmRlZmluZWQ7XG5cblx0XHRjb25zdCBkZXN0cm95ZWQgPSBbXTtcblxuXHRcdGxldCBpID0gdGhpc1tsaXN0UHJvcGVydHldLmxlbmd0aCAtIDE7XG5cdFx0d2hpbGUgKGkgPj0gMCkge1xuXHRcdFx0Y29uc3QgY29tbWVudCA9IHRoaXNbbGlzdFByb3BlcnR5XVtpXTtcblx0XHRcdGlmIChjb21tZW50Ll9fbmd0X3JlbmRlcmVyX19bTmd0UmVuZGVyZXJDbGFzc0lkLmRlc3Ryb3llZF0pIHtcblx0XHRcdFx0ZGVzdHJveWVkLnB1c2goaSk7XG5cdFx0XHRcdGktLTtcblx0XHRcdFx0Y29udGludWU7XG5cdFx0XHR9XG5cdFx0XHRjb25zdCBpbmplY3RvciA9IGNvbW1lbnQuX19uZ3RfcmVuZGVyZXJfX1tOZ3RSZW5kZXJlckNsYXNzSWQuaW5qZWN0b3JGYWN0b3J5XSgpO1xuXHRcdFx0aWYgKCFpbmplY3Rvcikge1xuXHRcdFx0XHRpLS07XG5cdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0fVxuXHRcdFx0Y29uc3QgaW5zdGFuY2UgPSBpbmplY3Rvci5nZXQoZGlyLCBudWxsKTtcblx0XHRcdGlmIChpbnN0YW5jZSAmJiBpbnN0YW5jZS52YWxpZGF0ZSgpKSB7XG5cdFx0XHRcdGRpcmVjdGl2ZSA9IGluc3RhbmNlO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdH1cblxuXHRcdFx0aS0tO1xuXHRcdH1cblxuXHRcdGRlc3Ryb3llZC5mb3JFYWNoKChpbmRleCkgPT4ge1xuXHRcdFx0dGhpc1tsaXN0UHJvcGVydHldLnNwbGljZShpbmRleCwgMSk7XG5cdFx0fSk7XG5cblx0XHRyZXR1cm4gZGlyZWN0aXZlO1xuXHR9XG5cblx0cHJpdmF0ZSB0cnlHZXRQb3J0YWxTdG9yZSgpIHtcblx0XHRsZXQgc3RvcmU6IE5ndFNpZ25hbFN0b3JlPE5ndFN0YXRlPiB8IHVuZGVmaW5lZDtcblx0XHRjb25zdCBkZXN0cm95ZWQgPSBbXTtcblx0XHQvLyB3ZSBvbmx5IGNhcmUgYWJvdXQgdGhlIHBvcnRhbCBzdGF0ZXMgYmVjYXVzZSBOZ3RTdG9yZSBvbmx5IGRpZmZlcnMgcGVyIFBvcnRhbFxuXHRcdGxldCBpID0gdGhpcy5wb3J0YWxDb21tZW50c05vZGVzLmxlbmd0aCAtIDE7XG5cdFx0d2hpbGUgKGkgPj0gMCkge1xuXHRcdFx0Ly8gbG9vcCB0aHJvdWdoIHRoZSBwb3J0YWwgc3RhdGUgYmFja3dhcmRzIHRvIGZpbmQgdGhlIGNsb3Nlc3QgTmd0U3RvcmVcblx0XHRcdGNvbnN0IHBvcnRhbCA9IHRoaXMucG9ydGFsQ29tbWVudHNOb2Rlc1tpXTtcblx0XHRcdGlmIChwb3J0YWwuX19uZ3RfcmVuZGVyZXJfX1tOZ3RSZW5kZXJlckNsYXNzSWQuZGVzdHJveWVkXSkge1xuXHRcdFx0XHRkZXN0cm95ZWQucHVzaChpKTtcblx0XHRcdFx0aS0tO1xuXHRcdFx0XHRjb250aW51ZTtcblx0XHRcdH1cblxuXHRcdFx0Y29uc3QgaW5qZWN0b3IgPSBwb3J0YWwuX19uZ3RfcmVuZGVyZXJfX1tOZ3RSZW5kZXJlckNsYXNzSWQuaW5qZWN0b3JGYWN0b3J5XSgpO1xuXHRcdFx0aWYgKCFpbmplY3Rvcikge1xuXHRcdFx0XHRpLS07XG5cdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0fVxuXHRcdFx0Y29uc3QgaW5zdGFuY2UgPSBpbmplY3Rvci5nZXQoTkdUX1NUT1JFLCBudWxsKTtcblx0XHRcdC8vIG9ubHkgdGhlIGluc3RhbmNlIHdpdGggcHJldmlvdXNSb290IHNob3VsZCBwYXNzXG5cdFx0XHRpZiAoaW5zdGFuY2UgJiYgaW5zdGFuY2UuZ2V0KCdwcmV2aW91c1Jvb3QnKSkge1xuXHRcdFx0XHRzdG9yZSA9IGluc3RhbmNlO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdH1cblx0XHRcdGktLTtcblx0XHR9XG5cblx0XHRkZXN0cm95ZWQuZm9yRWFjaCgoaW5kZXgpID0+IHtcblx0XHRcdHRoaXMucG9ydGFsQ29tbWVudHNOb2Rlcy5zcGxpY2UoaW5kZXgsIDEpO1xuXHRcdH0pO1xuXG5cdFx0cmV0dXJuIHN0b3JlIHx8IHRoaXMucm9vdFN0YXRlLnN0b3JlO1xuXHR9XG59XG4iXX0=
|
|
@@ -1,31 +0,0 @@
|
|
|
1
|
-
import * as i0 from "@angular/core";
|
|
2
|
-
export declare const injectNodeType: {
|
|
3
|
-
(): "" | "parent" | "args";
|
|
4
|
-
(injectOptions: import("@angular/core").InjectOptions & {
|
|
5
|
-
optional?: false | undefined;
|
|
6
|
-
} & {
|
|
7
|
-
injector?: import("@angular/core").Injector | undefined;
|
|
8
|
-
}): "" | "parent" | "args";
|
|
9
|
-
(injectOptions: import("@angular/core").InjectOptions & {
|
|
10
|
-
injector?: import("@angular/core").Injector | undefined;
|
|
11
|
-
}): "" | "parent" | "args" | null;
|
|
12
|
-
}, provideNodeType: (() => import("@angular/core").Provider) & (((value: "" | (() => "")) => import("@angular/core").Provider) | ((value: "parent" | (() => "parent")) => import("@angular/core").Provider) | ((value: "args" | (() => "args")) => import("@angular/core").Provider));
|
|
13
|
-
export declare abstract class NgtCommonDirective<TValue> {
|
|
14
|
-
private vcr;
|
|
15
|
-
private zone;
|
|
16
|
-
private template;
|
|
17
|
-
private nodeType;
|
|
18
|
-
private autoEffect;
|
|
19
|
-
protected injected: boolean;
|
|
20
|
-
protected injectedValue: TValue | null;
|
|
21
|
-
protected shouldCreateView: boolean;
|
|
22
|
-
private view?;
|
|
23
|
-
constructor();
|
|
24
|
-
protected abstract inputValue(): TValue | null;
|
|
25
|
-
abstract validate(): boolean;
|
|
26
|
-
protected shouldSkipCreateView(value: TValue | null): boolean;
|
|
27
|
-
get value(): TValue | null;
|
|
28
|
-
protected createView(): void;
|
|
29
|
-
static ɵfac: i0.ɵɵFactoryDeclaration<NgtCommonDirective<any>, never>;
|
|
30
|
-
static ɵdir: i0.ɵɵDirectiveDeclaration<NgtCommonDirective<any>, never, never, {}, {}, never, never, false, never>;
|
|
31
|
-
}
|
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
import { Object3D } from 'three';
|
|
2
|
-
import { NgtRef } from '../ref';
|
|
3
|
-
import { NgtCommonDirective } from './common';
|
|
4
|
-
import * as i0 from "@angular/core";
|
|
5
|
-
export declare class NgtParent extends NgtCommonDirective<string | NgtRef<Object3D>> {
|
|
6
|
-
parent: import("@angular/core").InputSignal<string | NgtRef<Object3D<import("three").Object3DEventMap>>>;
|
|
7
|
-
protected inputValue: import("@angular/core").InputSignal<string | NgtRef<Object3D<import("three").Object3DEventMap>>>;
|
|
8
|
-
validate(): boolean;
|
|
9
|
-
static ɵfac: i0.ɵɵFactoryDeclaration<NgtParent, never>;
|
|
10
|
-
static ɵdir: i0.ɵɵDirectiveDeclaration<NgtParent, "ng-template[parent]", never, { "parent": { "alias": "parent"; "required": true; "isSignal": true; }; }, {}, never, never, true, never>;
|
|
11
|
-
}
|
package/lib/ref.d.ts
DELETED
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
import { ElementRef, Injector, Signal } from '@angular/core';
|
|
2
|
-
import { NgtInstanceNode } from './instance';
|
|
3
|
-
export type NgtInjectedRef<TElement> = ElementRef<TElement> & {
|
|
4
|
-
children: (type?: 'objects' | 'nonObjects' | 'both') => Signal<NgtInstanceNode[]>;
|
|
5
|
-
};
|
|
6
|
-
export type NgtRef<TElement> = TElement | NgtInjectedRef<TElement>;
|
|
7
|
-
export declare function injectNgtRef<TElement>(initial?: ElementRef<TElement> | TElement, injector?: Injector): NgtInjectedRef<TElement>;
|
package/lib/renderer/store.d.ts
DELETED
|
@@ -1,65 +0,0 @@
|
|
|
1
|
-
import { InjectionToken, Injector } from '@angular/core';
|
|
2
|
-
import { NgtRef } from '../ref';
|
|
3
|
-
import { NgtState } from '../store';
|
|
4
|
-
import { NgtAnyRecord } from '../types';
|
|
5
|
-
import { NgtSignalStore } from '../utils/signal-store';
|
|
6
|
-
import { NgtRendererClassId } from './utils';
|
|
7
|
-
export declare const NGT_COMPOUND_PREFIXES: InjectionToken<string[]>;
|
|
8
|
-
type NgtQueueOp = [type: 'op' | 'cleanUp', op: () => void, done?: true];
|
|
9
|
-
export type NgtRendererState = [
|
|
10
|
-
type: 'three' | 'compound' | 'portal' | 'comment' | 'dom',
|
|
11
|
-
parent: NgtRendererNode | null,
|
|
12
|
-
injectedParent: NgtRef<NgtRendererNode> | null,
|
|
13
|
-
children: NgtRendererNode[],
|
|
14
|
-
destroyed: boolean,
|
|
15
|
-
compound: [applyFirst: boolean, props: NgtAnyRecord],
|
|
16
|
-
compoundParent: NgtRendererNode,
|
|
17
|
-
compounded: NgtRendererNode,
|
|
18
|
-
queueOps: Set<NgtQueueOp>,
|
|
19
|
-
attributes: NgtAnyRecord,
|
|
20
|
-
properties: NgtAnyRecord,
|
|
21
|
-
rawValue: any,
|
|
22
|
-
ref: any,
|
|
23
|
-
portalContainer: NgtRendererNode,
|
|
24
|
-
injectorFactory: () => Injector | undefined
|
|
25
|
-
];
|
|
26
|
-
export type NgtRendererNode = {
|
|
27
|
-
__ngt_renderer__: NgtRendererState;
|
|
28
|
-
};
|
|
29
|
-
type NgtRendererRootState = {
|
|
30
|
-
store: NgtSignalStore<NgtState>;
|
|
31
|
-
compoundPrefixes: string[];
|
|
32
|
-
document: Document;
|
|
33
|
-
};
|
|
34
|
-
export declare class NgtRendererStore {
|
|
35
|
-
private rootState;
|
|
36
|
-
private argsCommentNodes;
|
|
37
|
-
private parentCommentNodes;
|
|
38
|
-
private portalCommentsNodes;
|
|
39
|
-
constructor(rootState: NgtRendererRootState);
|
|
40
|
-
createNode(type: NgtRendererState[NgtRendererClassId.type], node: NgtAnyRecord): NgtAnyRecord & {
|
|
41
|
-
__ngt_renderer__: NgtRendererState;
|
|
42
|
-
};
|
|
43
|
-
isCompound(name: string): boolean;
|
|
44
|
-
isDOM(node: NgtAnyRecord): boolean;
|
|
45
|
-
getClosestParentWithInstance(node: NgtRendererNode): NgtRendererNode | null;
|
|
46
|
-
getClosestParentWithCompound(node: NgtRendererNode): NgtRendererNode | null;
|
|
47
|
-
processPortalContainer(portal: NgtRendererNode): void;
|
|
48
|
-
getCreationState(): readonly [any[], string | NgtRef<import("three").Object3D<import("three").Object3DEventMap>> | null, NgtSignalStore<NgtState>];
|
|
49
|
-
setParent(node: NgtRendererNode, parent: NgtRendererNode): void;
|
|
50
|
-
addChild(node: NgtRendererNode, child: NgtRendererNode): void;
|
|
51
|
-
removeChild(node: NgtRendererNode, child: NgtRendererNode): void;
|
|
52
|
-
setCompound(compound: NgtRendererNode, instance: NgtRendererNode): void;
|
|
53
|
-
queueOperation(node: NgtRendererNode, op: NgtQueueOp): void;
|
|
54
|
-
private executeOperation;
|
|
55
|
-
applyAttribute(node: NgtRendererNode, name: string, value: string): void;
|
|
56
|
-
applyProperty(node: NgtRendererNode, name: string, value: any): void;
|
|
57
|
-
applyParameters(node: NgtRendererNode, parameters: NgtAnyRecord): void;
|
|
58
|
-
get rootScene(): import("three").Scene;
|
|
59
|
-
destroy(node: NgtRendererNode, parent?: NgtRendererNode): void;
|
|
60
|
-
private removeCommentNode;
|
|
61
|
-
private updateNativeProps;
|
|
62
|
-
private firstNonInjectedDirective;
|
|
63
|
-
private tryGetPortalStore;
|
|
64
|
-
}
|
|
65
|
-
export {};
|