@angular/core 19.2.0-next.3 → 19.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/fesm2022/core.mjs +1410 -1233
- package/fesm2022/core.mjs.map +1 -1
- package/fesm2022/primitives/event-dispatch.mjs +1 -1
- package/fesm2022/primitives/signals.mjs +5 -5
- package/fesm2022/primitives/signals.mjs.map +1 -1
- package/fesm2022/rxjs-interop.mjs +1 -1
- package/fesm2022/testing.mjs +696 -5
- package/fesm2022/testing.mjs.map +1 -1
- package/index.d.ts +260 -51
- package/package.json +1 -1
- package/primitives/event-dispatch/index.d.ts +1 -1
- package/primitives/signals/index.d.ts +2 -2
- package/rxjs-interop/index.d.ts +1 -1
- package/schematics/bundles/apply_import_manager-a4e62ded.js +71 -0
- package/schematics/bundles/{checker-32db85a6.js → checker-2eecc677.js} +17 -16
- package/schematics/bundles/cleanup-unused-imports.js +17 -16
- package/schematics/bundles/{compiler_host-540e221c.js → compiler_host-f313eac9.js} +2 -2
- package/schematics/bundles/control-flow-migration.js +3 -3
- package/schematics/bundles/explicit-standalone-flag.js +5 -5
- package/schematics/bundles/{imports-abe29092.js → imports-31a38653.js} +1 -1
- package/schematics/bundles/{index-7ee8967e.js → index-3891dd55.js} +4 -4
- package/schematics/bundles/{index-d5020c9c.js → index-afc3f749.js} +9 -9
- package/schematics/bundles/inject-migration.js +10 -9
- package/schematics/bundles/{leading_space-d190b83b.js → leading_space-6e7a8ec6.js} +1 -1
- package/schematics/bundles/{migrate_ts_type_references-26986908.js → migrate_ts_type_references-1abf1f5f.js} +21 -21
- package/schematics/bundles/{nodes-a9f0b985.js → ng_decorators-6878e227.js} +2 -15
- package/schematics/bundles/nodes-ffdce442.js +27 -0
- package/schematics/bundles/output-migration.js +22 -21
- package/schematics/bundles/pending-tasks.js +5 -5
- package/schematics/bundles/{program-507de2f1.js → program-24da9092.js} +90 -45
- package/schematics/bundles/{apply_import_manager-f4d044b2.js → project_paths-64bc3947.js} +3 -57
- package/schematics/bundles/{project_tsconfig_paths-e9ccccbf.js → project_tsconfig_paths-6c9cde78.js} +1 -1
- package/schematics/bundles/property_name-42030525.js +31 -0
- package/schematics/bundles/provide-initializer.js +5 -5
- package/schematics/bundles/route-lazy-loading.js +9 -13
- package/schematics/bundles/self-closing-tags-migration.js +448 -0
- package/schematics/bundles/signal-input-migration.js +22 -21
- package/schematics/bundles/signal-queries-migration.js +28 -27
- package/schematics/bundles/signals.js +9 -8
- package/schematics/bundles/standalone-migration.js +14 -13
- package/schematics/collection.json +6 -0
- package/schematics/ng-generate/self-closing-tags-migration/schema.json +14 -0
- package/testing/index.d.ts +297 -1
package/fesm2022/core.mjs
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* @license Angular v19.2.0
|
|
2
|
+
* @license Angular v19.2.0
|
|
3
3
|
* (c) 2010-2024 Google LLC. https://angular.io/
|
|
4
4
|
* License: MIT
|
|
5
5
|
*/
|
|
6
6
|
|
|
7
|
-
import { SIGNAL_NODE as SIGNAL_NODE$1, signalSetFn as signalSetFn$1, producerAccessed as producerAccessed$1, SIGNAL as SIGNAL$1, getActiveConsumer as getActiveConsumer$1, setActiveConsumer as setActiveConsumer$1, createSignal as createSignal$1, signalUpdateFn as signalUpdateFn$1, consumerDestroy as consumerDestroy$1, REACTIVE_NODE as REACTIVE_NODE$1, consumerBeforeComputation as consumerBeforeComputation$1, consumerAfterComputation as consumerAfterComputation$1, consumerPollProducersForChange as consumerPollProducersForChange$1, createComputed as createComputed$1, setThrowInvalidWriteToSignalError as setThrowInvalidWriteToSignalError$1,
|
|
7
|
+
import { SIGNAL_NODE as SIGNAL_NODE$1, signalSetFn as signalSetFn$1, producerAccessed as producerAccessed$1, SIGNAL as SIGNAL$1, getActiveConsumer as getActiveConsumer$1, setActiveConsumer as setActiveConsumer$1, createSignal as createSignal$1, signalUpdateFn as signalUpdateFn$1, consumerDestroy as consumerDestroy$1, REACTIVE_NODE as REACTIVE_NODE$1, consumerBeforeComputation as consumerBeforeComputation$1, consumerAfterComputation as consumerAfterComputation$1, consumerPollProducersForChange as consumerPollProducersForChange$1, createComputed as createComputed$1, setThrowInvalidWriteToSignalError as setThrowInvalidWriteToSignalError$1, createWatch as createWatch$1, isInNotificationPhase as isInNotificationPhase$1, createLinkedSignal as createLinkedSignal$1, linkedSignalSetFn as linkedSignalSetFn$1, linkedSignalUpdateFn as linkedSignalUpdateFn$1 } from '@angular/core/primitives/signals';
|
|
8
8
|
export { SIGNAL as ɵSIGNAL } from '@angular/core/primitives/signals';
|
|
9
9
|
import { BehaviorSubject, Subject, Subscription } from 'rxjs';
|
|
10
10
|
import { Attribute as Attribute$1, clearAppScopedEarlyEventContract, EventContract, EventContractContainer, getAppScopedQueuedEventInfos, EventDispatcher, registerDispatcher, isEarlyEventType, isCaptureEventType, EventPhase } from '@angular/core/primitives/event-dispatch';
|
|
@@ -350,23 +350,21 @@ function stringify(token) {
|
|
|
350
350
|
return token;
|
|
351
351
|
}
|
|
352
352
|
if (Array.isArray(token)) {
|
|
353
|
-
return
|
|
353
|
+
return `[${token.map(stringify).join(', ')}]`;
|
|
354
354
|
}
|
|
355
355
|
if (token == null) {
|
|
356
356
|
return '' + token;
|
|
357
357
|
}
|
|
358
|
-
|
|
359
|
-
|
|
358
|
+
const name = token.overriddenName || token.name;
|
|
359
|
+
if (name) {
|
|
360
|
+
return `${name}`;
|
|
360
361
|
}
|
|
361
|
-
|
|
362
|
-
|
|
362
|
+
const result = token.toString();
|
|
363
|
+
if (result == null) {
|
|
364
|
+
return '' + result;
|
|
363
365
|
}
|
|
364
|
-
const
|
|
365
|
-
|
|
366
|
-
return '' + res;
|
|
367
|
-
}
|
|
368
|
-
const newLineIndex = res.indexOf('\n');
|
|
369
|
-
return newLineIndex === -1 ? res : res.substring(0, newLineIndex);
|
|
366
|
+
const newLineIndex = result.indexOf('\n');
|
|
367
|
+
return newLineIndex >= 0 ? result.slice(0, newLineIndex) : result;
|
|
370
368
|
}
|
|
371
369
|
/**
|
|
372
370
|
* Concatenates two strings with separator, allocating new strings only when necessary.
|
|
@@ -969,8 +967,9 @@ function stringifyTypeFromDebugInfo(debugInfo) {
|
|
|
969
967
|
|
|
970
968
|
/** Called when directives inject each other (creating a circular dependency) */
|
|
971
969
|
function throwCyclicDependencyError(token, path) {
|
|
972
|
-
|
|
973
|
-
|
|
970
|
+
throw new RuntimeError(-200 /* RuntimeErrorCode.CYCLIC_DI_DEPENDENCY */, ngDevMode
|
|
971
|
+
? `Circular dependency in DI detected for ${token}${path ? `. Dependency path: ${path.join(' > ')} > ${token}` : ''}`
|
|
972
|
+
: token);
|
|
974
973
|
}
|
|
975
974
|
function throwMixedMultiProviderError() {
|
|
976
975
|
throw new Error(`Cannot mix multi providers and regular providers`);
|
|
@@ -7108,23 +7107,6 @@ function unwrapElementRef(value) {
|
|
|
7108
7107
|
return value instanceof ElementRef ? value.nativeElement : value;
|
|
7109
7108
|
}
|
|
7110
7109
|
|
|
7111
|
-
const markedFeatures = new Set();
|
|
7112
|
-
// tslint:disable:ban
|
|
7113
|
-
/**
|
|
7114
|
-
* A guarded `performance.mark` for feature marking.
|
|
7115
|
-
*
|
|
7116
|
-
* This method exists because while all supported browser and node.js version supported by Angular
|
|
7117
|
-
* support performance.mark API. This is not the case for other environments such as JSDOM and
|
|
7118
|
-
* Cloudflare workers.
|
|
7119
|
-
*/
|
|
7120
|
-
function performanceMarkFeature(feature) {
|
|
7121
|
-
if (markedFeatures.has(feature)) {
|
|
7122
|
-
return;
|
|
7123
|
-
}
|
|
7124
|
-
markedFeatures.add(feature);
|
|
7125
|
-
performance?.mark?.('mark_feature_usage', { detail: { feature } });
|
|
7126
|
-
}
|
|
7127
|
-
|
|
7128
7110
|
/**
|
|
7129
7111
|
* Checks if the given `value` is a reactive `Signal`.
|
|
7130
7112
|
*/
|
|
@@ -7147,7 +7129,6 @@ function ɵunwrapWritableSignal(value) {
|
|
|
7147
7129
|
* Create a `Signal` that can be set or updated directly.
|
|
7148
7130
|
*/
|
|
7149
7131
|
function signal(initialValue, options) {
|
|
7150
|
-
performanceMarkFeature('NgSignals');
|
|
7151
7132
|
const signalFn = createSignal$1(initialValue);
|
|
7152
7133
|
const node = signalFn[SIGNAL$1];
|
|
7153
7134
|
if (options?.equal) {
|
|
@@ -8248,23 +8229,12 @@ function assertDomElement(value) {
|
|
|
8248
8229
|
function extractInputDebugMetadata(inputs) {
|
|
8249
8230
|
const res = {};
|
|
8250
8231
|
for (const key in inputs) {
|
|
8251
|
-
if (
|
|
8252
|
-
|
|
8253
|
-
|
|
8254
|
-
|
|
8255
|
-
|
|
8256
|
-
continue;
|
|
8257
|
-
}
|
|
8258
|
-
let minifiedName;
|
|
8259
|
-
if (Array.isArray(value)) {
|
|
8260
|
-
minifiedName = value[0];
|
|
8261
|
-
// flags are not used for now.
|
|
8262
|
-
// TODO: Consider exposing flag information in discovery.
|
|
8263
|
-
}
|
|
8264
|
-
else {
|
|
8265
|
-
minifiedName = value;
|
|
8232
|
+
if (inputs.hasOwnProperty(key)) {
|
|
8233
|
+
const value = inputs[key];
|
|
8234
|
+
if (value !== undefined) {
|
|
8235
|
+
res[key] = value[0];
|
|
8236
|
+
}
|
|
8266
8237
|
}
|
|
8267
|
-
res[key] = minifiedName;
|
|
8268
8238
|
}
|
|
8269
8239
|
return res;
|
|
8270
8240
|
}
|
|
@@ -8638,6 +8608,23 @@ var TracingAction;
|
|
|
8638
8608
|
*/
|
|
8639
8609
|
const TracingService = new InjectionToken(ngDevMode ? 'TracingService' : '');
|
|
8640
8610
|
|
|
8611
|
+
const markedFeatures = new Set();
|
|
8612
|
+
// tslint:disable:ban
|
|
8613
|
+
/**
|
|
8614
|
+
* A guarded `performance.mark` for feature marking.
|
|
8615
|
+
*
|
|
8616
|
+
* This method exists because while all supported browser and node.js version supported by Angular
|
|
8617
|
+
* support performance.mark API. This is not the case for other environments such as JSDOM and
|
|
8618
|
+
* Cloudflare workers.
|
|
8619
|
+
*/
|
|
8620
|
+
function performanceMarkFeature(feature) {
|
|
8621
|
+
if (markedFeatures.has(feature)) {
|
|
8622
|
+
return;
|
|
8623
|
+
}
|
|
8624
|
+
markedFeatures.add(feature);
|
|
8625
|
+
performance?.mark?.('mark_feature_usage', { detail: { feature } });
|
|
8626
|
+
}
|
|
8627
|
+
|
|
8641
8628
|
/**
|
|
8642
8629
|
* Asserts that the current stack frame is not within a reactive context. Useful
|
|
8643
8630
|
* to disallow certain code from running inside a reactive context (see {@link toSignal}).
|
|
@@ -12242,6 +12229,206 @@ function setupStaticAttributes(renderer, element, tNode) {
|
|
|
12242
12229
|
}
|
|
12243
12230
|
}
|
|
12244
12231
|
|
|
12232
|
+
/**
|
|
12233
|
+
* Creates a TView instance
|
|
12234
|
+
*
|
|
12235
|
+
* @param type Type of `TView`.
|
|
12236
|
+
* @param declTNode Declaration location of this `TView`.
|
|
12237
|
+
* @param templateFn Template function
|
|
12238
|
+
* @param decls The number of nodes, local refs, and pipes in this template
|
|
12239
|
+
* @param directives Registry of directives for this view
|
|
12240
|
+
* @param pipes Registry of pipes for this view
|
|
12241
|
+
* @param viewQuery View queries for this view
|
|
12242
|
+
* @param schemas Schemas for this view
|
|
12243
|
+
* @param consts Constants for this view
|
|
12244
|
+
*/
|
|
12245
|
+
function createTView(type, declTNode, templateFn, decls, vars, directives, pipes, viewQuery, schemas, constsOrFactory, ssrId) {
|
|
12246
|
+
ngDevMode && ngDevMode.tView++;
|
|
12247
|
+
const bindingStartIndex = HEADER_OFFSET + decls;
|
|
12248
|
+
// This length does not yet contain host bindings from child directives because at this point,
|
|
12249
|
+
// we don't know which directives are active on this template. As soon as a directive is matched
|
|
12250
|
+
// that has a host binding, we will update the blueprint with that def's hostVars count.
|
|
12251
|
+
const initialViewLength = bindingStartIndex + vars;
|
|
12252
|
+
const blueprint = createViewBlueprint(bindingStartIndex, initialViewLength);
|
|
12253
|
+
const consts = typeof constsOrFactory === 'function' ? constsOrFactory() : constsOrFactory;
|
|
12254
|
+
const tView = (blueprint[TVIEW] = {
|
|
12255
|
+
type: type,
|
|
12256
|
+
blueprint: blueprint,
|
|
12257
|
+
template: templateFn,
|
|
12258
|
+
queries: null,
|
|
12259
|
+
viewQuery: viewQuery,
|
|
12260
|
+
declTNode: declTNode,
|
|
12261
|
+
data: blueprint.slice().fill(null, bindingStartIndex),
|
|
12262
|
+
bindingStartIndex: bindingStartIndex,
|
|
12263
|
+
expandoStartIndex: initialViewLength,
|
|
12264
|
+
hostBindingOpCodes: null,
|
|
12265
|
+
firstCreatePass: true,
|
|
12266
|
+
firstUpdatePass: true,
|
|
12267
|
+
staticViewQueries: false,
|
|
12268
|
+
staticContentQueries: false,
|
|
12269
|
+
preOrderHooks: null,
|
|
12270
|
+
preOrderCheckHooks: null,
|
|
12271
|
+
contentHooks: null,
|
|
12272
|
+
contentCheckHooks: null,
|
|
12273
|
+
viewHooks: null,
|
|
12274
|
+
viewCheckHooks: null,
|
|
12275
|
+
destroyHooks: null,
|
|
12276
|
+
cleanup: null,
|
|
12277
|
+
contentQueries: null,
|
|
12278
|
+
components: null,
|
|
12279
|
+
directiveRegistry: typeof directives === 'function' ? directives() : directives,
|
|
12280
|
+
pipeRegistry: typeof pipes === 'function' ? pipes() : pipes,
|
|
12281
|
+
firstChild: null,
|
|
12282
|
+
schemas: schemas,
|
|
12283
|
+
consts: consts,
|
|
12284
|
+
incompleteFirstPass: false,
|
|
12285
|
+
ssrId,
|
|
12286
|
+
});
|
|
12287
|
+
if (ngDevMode) {
|
|
12288
|
+
// For performance reasons it is important that the tView retains the same shape during runtime.
|
|
12289
|
+
// (To make sure that all of the code is monomorphic.) For this reason we seal the object to
|
|
12290
|
+
// prevent class transitions.
|
|
12291
|
+
Object.seal(tView);
|
|
12292
|
+
}
|
|
12293
|
+
return tView;
|
|
12294
|
+
}
|
|
12295
|
+
function createViewBlueprint(bindingStartIndex, initialViewLength) {
|
|
12296
|
+
const blueprint = [];
|
|
12297
|
+
for (let i = 0; i < initialViewLength; i++) {
|
|
12298
|
+
blueprint.push(i < bindingStartIndex ? null : NO_CHANGE);
|
|
12299
|
+
}
|
|
12300
|
+
return blueprint;
|
|
12301
|
+
}
|
|
12302
|
+
/**
|
|
12303
|
+
* Gets TView from a template function or creates a new TView
|
|
12304
|
+
* if it doesn't already exist.
|
|
12305
|
+
*
|
|
12306
|
+
* @param def ComponentDef
|
|
12307
|
+
* @returns TView
|
|
12308
|
+
*/
|
|
12309
|
+
function getOrCreateComponentTView(def) {
|
|
12310
|
+
const tView = def.tView;
|
|
12311
|
+
// Create a TView if there isn't one, or recreate it if the first create pass didn't
|
|
12312
|
+
// complete successfully since we can't know for sure whether it's in a usable shape.
|
|
12313
|
+
if (tView === null || tView.incompleteFirstPass) {
|
|
12314
|
+
// Declaration node here is null since this function is called when we dynamically create a
|
|
12315
|
+
// component and hence there is no declaration.
|
|
12316
|
+
const declTNode = null;
|
|
12317
|
+
return (def.tView = createTView(1 /* TViewType.Component */, declTNode, def.template, def.decls, def.vars, def.directiveDefs, def.pipeDefs, def.viewQuery, def.schemas, def.consts, def.id));
|
|
12318
|
+
}
|
|
12319
|
+
return tView;
|
|
12320
|
+
}
|
|
12321
|
+
function createLView(parentLView, tView, context, flags, host, tHostNode, environment, renderer, injector, embeddedViewInjector, hydrationInfo) {
|
|
12322
|
+
const lView = tView.blueprint.slice();
|
|
12323
|
+
lView[HOST] = host;
|
|
12324
|
+
lView[FLAGS] =
|
|
12325
|
+
flags |
|
|
12326
|
+
4 /* LViewFlags.CreationMode */ |
|
|
12327
|
+
128 /* LViewFlags.Attached */ |
|
|
12328
|
+
8 /* LViewFlags.FirstLViewPass */ |
|
|
12329
|
+
64 /* LViewFlags.Dirty */ |
|
|
12330
|
+
1024 /* LViewFlags.RefreshView */;
|
|
12331
|
+
if (embeddedViewInjector !== null ||
|
|
12332
|
+
(parentLView && parentLView[FLAGS] & 2048 /* LViewFlags.HasEmbeddedViewInjector */)) {
|
|
12333
|
+
lView[FLAGS] |= 2048 /* LViewFlags.HasEmbeddedViewInjector */;
|
|
12334
|
+
}
|
|
12335
|
+
resetPreOrderHookFlags(lView);
|
|
12336
|
+
ngDevMode && tView.declTNode && parentLView && assertTNodeForLView(tView.declTNode, parentLView);
|
|
12337
|
+
lView[PARENT] = lView[DECLARATION_VIEW] = parentLView;
|
|
12338
|
+
lView[CONTEXT] = context;
|
|
12339
|
+
lView[ENVIRONMENT] = (environment || (parentLView && parentLView[ENVIRONMENT]));
|
|
12340
|
+
ngDevMode && assertDefined(lView[ENVIRONMENT], 'LViewEnvironment is required');
|
|
12341
|
+
lView[RENDERER] = (renderer || (parentLView && parentLView[RENDERER]));
|
|
12342
|
+
ngDevMode && assertDefined(lView[RENDERER], 'Renderer is required');
|
|
12343
|
+
lView[INJECTOR] = injector || (parentLView && parentLView[INJECTOR]) || null;
|
|
12344
|
+
lView[T_HOST] = tHostNode;
|
|
12345
|
+
lView[ID] = getUniqueLViewId();
|
|
12346
|
+
lView[HYDRATION] = hydrationInfo;
|
|
12347
|
+
lView[EMBEDDED_VIEW_INJECTOR] = embeddedViewInjector;
|
|
12348
|
+
ngDevMode &&
|
|
12349
|
+
assertEqual(tView.type == 2 /* TViewType.Embedded */ ? parentLView !== null : true, true, 'Embedded views must have parentLView');
|
|
12350
|
+
lView[DECLARATION_COMPONENT_VIEW] =
|
|
12351
|
+
tView.type == 2 /* TViewType.Embedded */ ? parentLView[DECLARATION_COMPONENT_VIEW] : lView;
|
|
12352
|
+
return lView;
|
|
12353
|
+
}
|
|
12354
|
+
function createComponentLView(lView, hostTNode, def) {
|
|
12355
|
+
const native = getNativeByTNode(hostTNode, lView);
|
|
12356
|
+
const tView = getOrCreateComponentTView(def);
|
|
12357
|
+
// Only component views should be added to the view tree directly. Embedded views are
|
|
12358
|
+
// accessed through their containers because they may be removed / re-added later.
|
|
12359
|
+
const rendererFactory = lView[ENVIRONMENT].rendererFactory;
|
|
12360
|
+
const componentView = addToEndOfViewTree(lView, createLView(lView, tView, null, getInitialLViewFlagsFromDef(def), native, hostTNode, null, rendererFactory.createRenderer(native, def), null, null, null));
|
|
12361
|
+
// Component view will always be created before any injected LContainers,
|
|
12362
|
+
// so this is a regular element, wrap it with the component view
|
|
12363
|
+
return (lView[hostTNode.index] = componentView);
|
|
12364
|
+
}
|
|
12365
|
+
/**
|
|
12366
|
+
* Gets the initial set of LView flags based on the component definition that the LView represents.
|
|
12367
|
+
* @param def Component definition from which to determine the flags.
|
|
12368
|
+
*/
|
|
12369
|
+
function getInitialLViewFlagsFromDef(def) {
|
|
12370
|
+
let flags = 16 /* LViewFlags.CheckAlways */;
|
|
12371
|
+
if (def.signals) {
|
|
12372
|
+
flags = 4096 /* LViewFlags.SignalView */;
|
|
12373
|
+
}
|
|
12374
|
+
else if (def.onPush) {
|
|
12375
|
+
flags = 64 /* LViewFlags.Dirty */;
|
|
12376
|
+
}
|
|
12377
|
+
return flags;
|
|
12378
|
+
}
|
|
12379
|
+
/**
|
|
12380
|
+
* When elements are created dynamically after a view blueprint is created (e.g. through
|
|
12381
|
+
* i18nApply()), we need to adjust the blueprint for future template passes.
|
|
12382
|
+
*
|
|
12383
|
+
* @param tView `TView` associated with `LView`
|
|
12384
|
+
* @param lView The `LView` containing the blueprint to adjust
|
|
12385
|
+
* @param numSlotsToAlloc The number of slots to alloc in the LView, should be >0
|
|
12386
|
+
* @param initialValue Initial value to store in blueprint
|
|
12387
|
+
*/
|
|
12388
|
+
function allocExpando(tView, lView, numSlotsToAlloc, initialValue) {
|
|
12389
|
+
if (numSlotsToAlloc === 0)
|
|
12390
|
+
return -1;
|
|
12391
|
+
if (ngDevMode) {
|
|
12392
|
+
assertFirstCreatePass(tView);
|
|
12393
|
+
assertSame(tView, lView[TVIEW], '`LView` must be associated with `TView`!');
|
|
12394
|
+
assertEqual(tView.data.length, lView.length, 'Expecting LView to be same size as TView');
|
|
12395
|
+
assertEqual(tView.data.length, tView.blueprint.length, 'Expecting Blueprint to be same size as TView');
|
|
12396
|
+
assertFirstUpdatePass(tView);
|
|
12397
|
+
}
|
|
12398
|
+
const allocIdx = lView.length;
|
|
12399
|
+
for (let i = 0; i < numSlotsToAlloc; i++) {
|
|
12400
|
+
lView.push(initialValue);
|
|
12401
|
+
tView.blueprint.push(initialValue);
|
|
12402
|
+
tView.data.push(null);
|
|
12403
|
+
}
|
|
12404
|
+
return allocIdx;
|
|
12405
|
+
}
|
|
12406
|
+
/**
|
|
12407
|
+
* Adds LView or LContainer to the end of the current view tree.
|
|
12408
|
+
*
|
|
12409
|
+
* This structure will be used to traverse through nested views to remove listeners
|
|
12410
|
+
* and call onDestroy callbacks.
|
|
12411
|
+
*
|
|
12412
|
+
* @param lView The view where LView or LContainer should be added
|
|
12413
|
+
* @param adjustedHostIndex Index of the view's host node in LView[], adjusted for header
|
|
12414
|
+
* @param lViewOrLContainer The LView or LContainer to add to the view tree
|
|
12415
|
+
* @returns The state passed in
|
|
12416
|
+
*/
|
|
12417
|
+
function addToEndOfViewTree(lView, lViewOrLContainer) {
|
|
12418
|
+
// TODO(benlesh/misko): This implementation is incorrect, because it always adds the LContainer
|
|
12419
|
+
// to the end of the queue, which means if the developer retrieves the LContainers from RNodes out
|
|
12420
|
+
// of order, the change detection will run out of order, as the act of retrieving the the
|
|
12421
|
+
// LContainer from the RNode is what adds it to the queue.
|
|
12422
|
+
if (lView[CHILD_HEAD]) {
|
|
12423
|
+
lView[CHILD_TAIL][NEXT] = lViewOrLContainer;
|
|
12424
|
+
}
|
|
12425
|
+
else {
|
|
12426
|
+
lView[CHILD_HEAD] = lViewOrLContainer;
|
|
12427
|
+
}
|
|
12428
|
+
lView[CHILD_TAIL] = lViewOrLContainer;
|
|
12429
|
+
return lViewOrLContainer;
|
|
12430
|
+
}
|
|
12431
|
+
|
|
12245
12432
|
/**
|
|
12246
12433
|
* Advances to an element for later binding instructions.
|
|
12247
12434
|
*
|
|
@@ -12303,9 +12490,21 @@ var InputFlags;
|
|
|
12303
12490
|
InputFlags[InputFlags["HasDecoratorInputTransform"] = 2] = "HasDecoratorInputTransform";
|
|
12304
12491
|
})(InputFlags || (InputFlags = {}));
|
|
12305
12492
|
|
|
12306
|
-
function writeToDirectiveInput(def, instance, publicName,
|
|
12493
|
+
function writeToDirectiveInput(def, instance, publicName, value) {
|
|
12307
12494
|
const prevConsumer = setActiveConsumer$1(null);
|
|
12308
12495
|
try {
|
|
12496
|
+
if (ngDevMode) {
|
|
12497
|
+
if (!def.inputs.hasOwnProperty(publicName)) {
|
|
12498
|
+
throw new Error(`ASSERTION ERROR: Directive ${def.type.name} does not have an input with a public name of "${publicName}"`);
|
|
12499
|
+
}
|
|
12500
|
+
// Usually we resolve the directive instance using `LView[someIndex]` before writing to an
|
|
12501
|
+
// input, however if the read happens to early, the `LView[someIndex]` might actually be a
|
|
12502
|
+
// `NodeInjectorFactory`. Check for this specific case here since it can break in subtle ways.
|
|
12503
|
+
if (isFactory(instance)) {
|
|
12504
|
+
throw new Error(`ASSERTION ERROR: Cannot write input to factory for type ${def.type.name}. Directive has not been created yet.`);
|
|
12505
|
+
}
|
|
12506
|
+
}
|
|
12507
|
+
const [privateName, flags, transform] = def.inputs[publicName];
|
|
12309
12508
|
// If we know we are dealing with a signal input, we cache its reference
|
|
12310
12509
|
// in a tree-shakable way. The input signal node can then be used for
|
|
12311
12510
|
// value transform execution or actual value updates without introducing
|
|
@@ -12320,9 +12519,9 @@ function writeToDirectiveInput(def, instance, publicName, privateName, flags, va
|
|
|
12320
12519
|
if (inputSignalNode !== null && inputSignalNode.transformFn !== undefined) {
|
|
12321
12520
|
value = inputSignalNode.transformFn(value);
|
|
12322
12521
|
}
|
|
12323
|
-
|
|
12324
|
-
|
|
12325
|
-
value =
|
|
12522
|
+
else if (transform !== null) {
|
|
12523
|
+
// If there is a decorator input transform, run it.
|
|
12524
|
+
value = transform.call(instance, value);
|
|
12326
12525
|
}
|
|
12327
12526
|
if (def.setInput !== null) {
|
|
12328
12527
|
def.setInput(instance, inputSignalNode, value, publicName, privateName);
|
|
@@ -12336,39 +12535,6 @@ function writeToDirectiveInput(def, instance, publicName, privateName, flags, va
|
|
|
12336
12535
|
}
|
|
12337
12536
|
}
|
|
12338
12537
|
|
|
12339
|
-
function createLView(parentLView, tView, context, flags, host, tHostNode, environment, renderer, injector, embeddedViewInjector, hydrationInfo) {
|
|
12340
|
-
const lView = tView.blueprint.slice();
|
|
12341
|
-
lView[HOST] = host;
|
|
12342
|
-
lView[FLAGS] =
|
|
12343
|
-
flags |
|
|
12344
|
-
4 /* LViewFlags.CreationMode */ |
|
|
12345
|
-
128 /* LViewFlags.Attached */ |
|
|
12346
|
-
8 /* LViewFlags.FirstLViewPass */ |
|
|
12347
|
-
64 /* LViewFlags.Dirty */ |
|
|
12348
|
-
1024 /* LViewFlags.RefreshView */;
|
|
12349
|
-
if (embeddedViewInjector !== null ||
|
|
12350
|
-
(parentLView && parentLView[FLAGS] & 2048 /* LViewFlags.HasEmbeddedViewInjector */)) {
|
|
12351
|
-
lView[FLAGS] |= 2048 /* LViewFlags.HasEmbeddedViewInjector */;
|
|
12352
|
-
}
|
|
12353
|
-
resetPreOrderHookFlags(lView);
|
|
12354
|
-
ngDevMode && tView.declTNode && parentLView && assertTNodeForLView(tView.declTNode, parentLView);
|
|
12355
|
-
lView[PARENT] = lView[DECLARATION_VIEW] = parentLView;
|
|
12356
|
-
lView[CONTEXT] = context;
|
|
12357
|
-
lView[ENVIRONMENT] = (environment || (parentLView && parentLView[ENVIRONMENT]));
|
|
12358
|
-
ngDevMode && assertDefined(lView[ENVIRONMENT], 'LViewEnvironment is required');
|
|
12359
|
-
lView[RENDERER] = (renderer || (parentLView && parentLView[RENDERER]));
|
|
12360
|
-
ngDevMode && assertDefined(lView[RENDERER], 'Renderer is required');
|
|
12361
|
-
lView[INJECTOR] = injector || (parentLView && parentLView[INJECTOR]) || null;
|
|
12362
|
-
lView[T_HOST] = tHostNode;
|
|
12363
|
-
lView[ID] = getUniqueLViewId();
|
|
12364
|
-
lView[HYDRATION] = hydrationInfo;
|
|
12365
|
-
lView[EMBEDDED_VIEW_INJECTOR] = embeddedViewInjector;
|
|
12366
|
-
ngDevMode &&
|
|
12367
|
-
assertEqual(tView.type == 2 /* TViewType.Embedded */ ? parentLView !== null : true, true, 'Embedded views must have parentLView');
|
|
12368
|
-
lView[DECLARATION_COMPONENT_VIEW] =
|
|
12369
|
-
tView.type == 2 /* TViewType.Embedded */ ? parentLView[DECLARATION_COMPONENT_VIEW] : lView;
|
|
12370
|
-
return lView;
|
|
12371
|
-
}
|
|
12372
12538
|
function executeTemplate(tView, lView, templateFn, rf, context) {
|
|
12373
12539
|
const prevSelectedIndex = getSelectedIndex();
|
|
12374
12540
|
const isUpdatePhase = rf & 2 /* RenderFlags.Update */;
|
|
@@ -12393,15 +12559,6 @@ function executeTemplate(tView, lView, templateFn, rf, context) {
|
|
|
12393
12559
|
profiler(postHookType, context);
|
|
12394
12560
|
}
|
|
12395
12561
|
}
|
|
12396
|
-
/**
|
|
12397
|
-
* Creates directive instances.
|
|
12398
|
-
*/
|
|
12399
|
-
function createDirectivesInstancesInInstruction(tView, lView, tNode) {
|
|
12400
|
-
if (!getBindingsEnabled())
|
|
12401
|
-
return;
|
|
12402
|
-
attachPatchData(getNativeByTNode(tNode, lView), lView);
|
|
12403
|
-
createDirectivesInstances(tView, lView, tNode);
|
|
12404
|
-
}
|
|
12405
12562
|
/**
|
|
12406
12563
|
* Creates directive instances.
|
|
12407
12564
|
*/
|
|
@@ -12428,95 +12585,6 @@ function saveResolvedLocalsInData(viewData, tNode, localRefExtractor = getNative
|
|
|
12428
12585
|
}
|
|
12429
12586
|
}
|
|
12430
12587
|
}
|
|
12431
|
-
/**
|
|
12432
|
-
* Gets TView from a template function or creates a new TView
|
|
12433
|
-
* if it doesn't already exist.
|
|
12434
|
-
*
|
|
12435
|
-
* @param def ComponentDef
|
|
12436
|
-
* @returns TView
|
|
12437
|
-
*/
|
|
12438
|
-
function getOrCreateComponentTView(def) {
|
|
12439
|
-
const tView = def.tView;
|
|
12440
|
-
// Create a TView if there isn't one, or recreate it if the first create pass didn't
|
|
12441
|
-
// complete successfully since we can't know for sure whether it's in a usable shape.
|
|
12442
|
-
if (tView === null || tView.incompleteFirstPass) {
|
|
12443
|
-
// Declaration node here is null since this function is called when we dynamically create a
|
|
12444
|
-
// component and hence there is no declaration.
|
|
12445
|
-
const declTNode = null;
|
|
12446
|
-
return (def.tView = createTView(1 /* TViewType.Component */, declTNode, def.template, def.decls, def.vars, def.directiveDefs, def.pipeDefs, def.viewQuery, def.schemas, def.consts, def.id));
|
|
12447
|
-
}
|
|
12448
|
-
return tView;
|
|
12449
|
-
}
|
|
12450
|
-
/**
|
|
12451
|
-
* Creates a TView instance
|
|
12452
|
-
*
|
|
12453
|
-
* @param type Type of `TView`.
|
|
12454
|
-
* @param declTNode Declaration location of this `TView`.
|
|
12455
|
-
* @param templateFn Template function
|
|
12456
|
-
* @param decls The number of nodes, local refs, and pipes in this template
|
|
12457
|
-
* @param directives Registry of directives for this view
|
|
12458
|
-
* @param pipes Registry of pipes for this view
|
|
12459
|
-
* @param viewQuery View queries for this view
|
|
12460
|
-
* @param schemas Schemas for this view
|
|
12461
|
-
* @param consts Constants for this view
|
|
12462
|
-
*/
|
|
12463
|
-
function createTView(type, declTNode, templateFn, decls, vars, directives, pipes, viewQuery, schemas, constsOrFactory, ssrId) {
|
|
12464
|
-
ngDevMode && ngDevMode.tView++;
|
|
12465
|
-
const bindingStartIndex = HEADER_OFFSET + decls;
|
|
12466
|
-
// This length does not yet contain host bindings from child directives because at this point,
|
|
12467
|
-
// we don't know which directives are active on this template. As soon as a directive is matched
|
|
12468
|
-
// that has a host binding, we will update the blueprint with that def's hostVars count.
|
|
12469
|
-
const initialViewLength = bindingStartIndex + vars;
|
|
12470
|
-
const blueprint = createViewBlueprint(bindingStartIndex, initialViewLength);
|
|
12471
|
-
const consts = typeof constsOrFactory === 'function' ? constsOrFactory() : constsOrFactory;
|
|
12472
|
-
const tView = (blueprint[TVIEW] = {
|
|
12473
|
-
type: type,
|
|
12474
|
-
blueprint: blueprint,
|
|
12475
|
-
template: templateFn,
|
|
12476
|
-
queries: null,
|
|
12477
|
-
viewQuery: viewQuery,
|
|
12478
|
-
declTNode: declTNode,
|
|
12479
|
-
data: blueprint.slice().fill(null, bindingStartIndex),
|
|
12480
|
-
bindingStartIndex: bindingStartIndex,
|
|
12481
|
-
expandoStartIndex: initialViewLength,
|
|
12482
|
-
hostBindingOpCodes: null,
|
|
12483
|
-
firstCreatePass: true,
|
|
12484
|
-
firstUpdatePass: true,
|
|
12485
|
-
staticViewQueries: false,
|
|
12486
|
-
staticContentQueries: false,
|
|
12487
|
-
preOrderHooks: null,
|
|
12488
|
-
preOrderCheckHooks: null,
|
|
12489
|
-
contentHooks: null,
|
|
12490
|
-
contentCheckHooks: null,
|
|
12491
|
-
viewHooks: null,
|
|
12492
|
-
viewCheckHooks: null,
|
|
12493
|
-
destroyHooks: null,
|
|
12494
|
-
cleanup: null,
|
|
12495
|
-
contentQueries: null,
|
|
12496
|
-
components: null,
|
|
12497
|
-
directiveRegistry: typeof directives === 'function' ? directives() : directives,
|
|
12498
|
-
pipeRegistry: typeof pipes === 'function' ? pipes() : pipes,
|
|
12499
|
-
firstChild: null,
|
|
12500
|
-
schemas: schemas,
|
|
12501
|
-
consts: consts,
|
|
12502
|
-
incompleteFirstPass: false,
|
|
12503
|
-
ssrId,
|
|
12504
|
-
});
|
|
12505
|
-
if (ngDevMode) {
|
|
12506
|
-
// For performance reasons it is important that the tView retains the same shape during runtime.
|
|
12507
|
-
// (To make sure that all of the code is monomorphic.) For this reason we seal the object to
|
|
12508
|
-
// prevent class transitions.
|
|
12509
|
-
Object.seal(tView);
|
|
12510
|
-
}
|
|
12511
|
-
return tView;
|
|
12512
|
-
}
|
|
12513
|
-
function createViewBlueprint(bindingStartIndex, initialViewLength) {
|
|
12514
|
-
const blueprint = [];
|
|
12515
|
-
for (let i = 0; i < initialViewLength; i++) {
|
|
12516
|
-
blueprint.push(i < bindingStartIndex ? null : NO_CHANGE);
|
|
12517
|
-
}
|
|
12518
|
-
return blueprint;
|
|
12519
|
-
}
|
|
12520
12588
|
/**
|
|
12521
12589
|
* Locates the host native element, used for bootstrapping existing nodes into rendering pipeline.
|
|
12522
12590
|
*
|
|
@@ -12608,18 +12676,16 @@ function mapPropName(name) {
|
|
|
12608
12676
|
}
|
|
12609
12677
|
function elementPropertyInternal(tView, tNode, lView, propName, value, renderer, sanitizer, nativeOnly) {
|
|
12610
12678
|
ngDevMode && assertNotSame(value, NO_CHANGE, 'Incoming value should never be NO_CHANGE.');
|
|
12611
|
-
|
|
12612
|
-
|
|
12613
|
-
|
|
12614
|
-
|
|
12615
|
-
|
|
12616
|
-
|
|
12617
|
-
markDirtyIfOnPush(lView, tNode.index);
|
|
12618
|
-
if (ngDevMode) {
|
|
12619
|
-
setNgReflectProperties(lView, element, tNode.type, dataValue, value);
|
|
12679
|
+
if (!nativeOnly) {
|
|
12680
|
+
const hasSetInput = setAllInputsForProperty(tNode, tView, lView, propName, value);
|
|
12681
|
+
if (hasSetInput) {
|
|
12682
|
+
isComponentHost(tNode) && markDirtyIfOnPush(lView, tNode.index);
|
|
12683
|
+
ngDevMode && setNgReflectProperties(lView, tView, tNode, propName, value);
|
|
12684
|
+
return; // Stop propcessing if we've matched at least one input.
|
|
12620
12685
|
}
|
|
12621
12686
|
}
|
|
12622
|
-
|
|
12687
|
+
if (tNode.type & 3 /* TNodeType.AnyRNode */) {
|
|
12688
|
+
const element = getNativeByTNode(tNode, lView);
|
|
12623
12689
|
propName = mapPropName(propName);
|
|
12624
12690
|
if (ngDevMode) {
|
|
12625
12691
|
validateAgainstEventProperties(propName);
|
|
@@ -12649,11 +12715,12 @@ function markDirtyIfOnPush(lView, viewIndex) {
|
|
|
12649
12715
|
childComponentLView[FLAGS] |= 64 /* LViewFlags.Dirty */;
|
|
12650
12716
|
}
|
|
12651
12717
|
}
|
|
12652
|
-
function setNgReflectProperty(lView,
|
|
12718
|
+
function setNgReflectProperty(lView, tNode, attrName, value) {
|
|
12719
|
+
const element = getNativeByTNode(tNode, lView);
|
|
12653
12720
|
const renderer = lView[RENDERER];
|
|
12654
12721
|
attrName = normalizeDebugBindingName(attrName);
|
|
12655
12722
|
const debugValue = normalizeDebugBindingValue(value);
|
|
12656
|
-
if (type & 3 /* TNodeType.AnyRNode */) {
|
|
12723
|
+
if (tNode.type & 3 /* TNodeType.AnyRNode */) {
|
|
12657
12724
|
if (value == null) {
|
|
12658
12725
|
renderer.removeAttribute(element, attrName);
|
|
12659
12726
|
}
|
|
@@ -12666,18 +12733,25 @@ function setNgReflectProperty(lView, element, type, attrName, value) {
|
|
|
12666
12733
|
renderer.setValue(element, textContent);
|
|
12667
12734
|
}
|
|
12668
12735
|
}
|
|
12669
|
-
function setNgReflectProperties(lView,
|
|
12670
|
-
if (type & (3 /* TNodeType.AnyRNode */ | 4 /* TNodeType.Container */)) {
|
|
12671
|
-
|
|
12672
|
-
|
|
12673
|
-
|
|
12674
|
-
|
|
12675
|
-
|
|
12676
|
-
|
|
12677
|
-
|
|
12678
|
-
|
|
12679
|
-
|
|
12680
|
-
setNgReflectProperty(lView,
|
|
12736
|
+
function setNgReflectProperties(lView, tView, tNode, publicName, value) {
|
|
12737
|
+
if (!(tNode.type & (3 /* TNodeType.AnyRNode */ | 4 /* TNodeType.Container */))) {
|
|
12738
|
+
return;
|
|
12739
|
+
}
|
|
12740
|
+
const inputConfig = tNode.inputs?.[publicName];
|
|
12741
|
+
const hostInputConfig = tNode.hostDirectiveInputs?.[publicName];
|
|
12742
|
+
if (hostInputConfig) {
|
|
12743
|
+
for (let i = 0; i < hostInputConfig.length; i += 2) {
|
|
12744
|
+
const index = hostInputConfig[i];
|
|
12745
|
+
const publicName = hostInputConfig[i + 1];
|
|
12746
|
+
const def = tView.data[index];
|
|
12747
|
+
setNgReflectProperty(lView, tNode, def.inputs[publicName][0], value);
|
|
12748
|
+
}
|
|
12749
|
+
}
|
|
12750
|
+
// Note: we set the private name of the input as the reflected property, not the public one.
|
|
12751
|
+
if (inputConfig) {
|
|
12752
|
+
for (const index of inputConfig) {
|
|
12753
|
+
const def = tView.data[index];
|
|
12754
|
+
setNgReflectProperty(lView, tNode, def.inputs[publicName][0], value);
|
|
12681
12755
|
}
|
|
12682
12756
|
}
|
|
12683
12757
|
}
|
|
@@ -12774,31 +12848,6 @@ function findDirectiveDefMatches(tView, tNode) {
|
|
|
12774
12848
|
}
|
|
12775
12849
|
return matches;
|
|
12776
12850
|
}
|
|
12777
|
-
/**
|
|
12778
|
-
* Gets the initial set of LView flags based on the component definition that the LView represents.
|
|
12779
|
-
* @param def Component definition from which to determine the flags.
|
|
12780
|
-
*/
|
|
12781
|
-
function getInitialLViewFlagsFromDef(def) {
|
|
12782
|
-
let flags = 16 /* LViewFlags.CheckAlways */;
|
|
12783
|
-
if (def.signals) {
|
|
12784
|
-
flags = 4096 /* LViewFlags.SignalView */;
|
|
12785
|
-
}
|
|
12786
|
-
else if (def.onPush) {
|
|
12787
|
-
flags = 64 /* LViewFlags.Dirty */;
|
|
12788
|
-
}
|
|
12789
|
-
return flags;
|
|
12790
|
-
}
|
|
12791
|
-
function createComponentLView(lView, hostTNode, def) {
|
|
12792
|
-
const native = getNativeByTNode(hostTNode, lView);
|
|
12793
|
-
const tView = getOrCreateComponentTView(def);
|
|
12794
|
-
// Only component views should be added to the view tree directly. Embedded views are
|
|
12795
|
-
// accessed through their containers because they may be removed / re-added later.
|
|
12796
|
-
const rendererFactory = lView[ENVIRONMENT].rendererFactory;
|
|
12797
|
-
const componentView = addToEndOfViewTree(lView, createLView(lView, tView, null, getInitialLViewFlagsFromDef(def), native, hostTNode, null, rendererFactory.createRenderer(native, def), null, null, null));
|
|
12798
|
-
// Component view will always be created before any injected LContainers,
|
|
12799
|
-
// so this is a regular element, wrap it with the component view
|
|
12800
|
-
return (lView[hostTNode.index] = componentView);
|
|
12801
|
-
}
|
|
12802
12851
|
function elementAttributeInternal(tNode, lView, name, value, sanitizer, namespace) {
|
|
12803
12852
|
if (ngDevMode) {
|
|
12804
12853
|
assertNotSame(value, NO_CHANGE, 'Incoming value should never be NO_CHANGE.');
|
|
@@ -12832,75 +12881,16 @@ function setElementAttribute(renderer, element, namespace, tagName, name, value,
|
|
|
12832
12881
|
function setInputsFromAttrs(lView, directiveIndex, instance, def, tNode, initialInputData) {
|
|
12833
12882
|
const initialInputs = initialInputData[directiveIndex];
|
|
12834
12883
|
if (initialInputs !== null) {
|
|
12835
|
-
for (let i = 0; i < initialInputs.length;) {
|
|
12836
|
-
const
|
|
12837
|
-
const
|
|
12838
|
-
|
|
12839
|
-
const value = initialInputs[i++];
|
|
12840
|
-
writeToDirectiveInput(def, instance, publicName, privateName, flags, value);
|
|
12884
|
+
for (let i = 0; i < initialInputs.length; i += 2) {
|
|
12885
|
+
const lookupName = initialInputs[i];
|
|
12886
|
+
const value = initialInputs[i + 1];
|
|
12887
|
+
writeToDirectiveInput(def, instance, lookupName, value);
|
|
12841
12888
|
if (ngDevMode) {
|
|
12842
|
-
|
|
12843
|
-
setNgReflectProperty(lView, nativeElement, tNode.type, privateName, value);
|
|
12889
|
+
setNgReflectProperty(lView, tNode, def.inputs[lookupName][0], value);
|
|
12844
12890
|
}
|
|
12845
12891
|
}
|
|
12846
12892
|
}
|
|
12847
12893
|
}
|
|
12848
|
-
//////////////////////////
|
|
12849
|
-
//// ViewContainer & View
|
|
12850
|
-
//////////////////////////
|
|
12851
|
-
/**
|
|
12852
|
-
* Creates a LContainer, either from a container instruction, or for a ViewContainerRef.
|
|
12853
|
-
*
|
|
12854
|
-
* @param hostNative The host element for the LContainer
|
|
12855
|
-
* @param hostTNode The host TNode for the LContainer
|
|
12856
|
-
* @param currentView The parent view of the LContainer
|
|
12857
|
-
* @param native The native comment element
|
|
12858
|
-
* @param isForViewContainerRef Optional a flag indicating the ViewContainerRef case
|
|
12859
|
-
* @returns LContainer
|
|
12860
|
-
*/
|
|
12861
|
-
function createLContainer(hostNative, currentView, native, tNode) {
|
|
12862
|
-
ngDevMode && assertLView(currentView);
|
|
12863
|
-
const lContainer = [
|
|
12864
|
-
hostNative, // host native
|
|
12865
|
-
true, // Boolean `true` in this position signifies that this is an `LContainer`
|
|
12866
|
-
0, // flags
|
|
12867
|
-
currentView, // parent
|
|
12868
|
-
null, // next
|
|
12869
|
-
tNode, // t_host
|
|
12870
|
-
null, // dehydrated views
|
|
12871
|
-
native, // native,
|
|
12872
|
-
null, // view refs
|
|
12873
|
-
null, // moved views
|
|
12874
|
-
];
|
|
12875
|
-
ngDevMode &&
|
|
12876
|
-
assertEqual(lContainer.length, CONTAINER_HEADER_OFFSET, 'Should allocate correct number of slots for LContainer header.');
|
|
12877
|
-
return lContainer;
|
|
12878
|
-
}
|
|
12879
|
-
/**
|
|
12880
|
-
* Adds LView or LContainer to the end of the current view tree.
|
|
12881
|
-
*
|
|
12882
|
-
* This structure will be used to traverse through nested views to remove listeners
|
|
12883
|
-
* and call onDestroy callbacks.
|
|
12884
|
-
*
|
|
12885
|
-
* @param lView The view where LView or LContainer should be added
|
|
12886
|
-
* @param adjustedHostIndex Index of the view's host node in LView[], adjusted for header
|
|
12887
|
-
* @param lViewOrLContainer The LView or LContainer to add to the view tree
|
|
12888
|
-
* @returns The state passed in
|
|
12889
|
-
*/
|
|
12890
|
-
function addToEndOfViewTree(lView, lViewOrLContainer) {
|
|
12891
|
-
// TODO(benlesh/misko): This implementation is incorrect, because it always adds the LContainer
|
|
12892
|
-
// to the end of the queue, which means if the developer retrieves the LContainers from RNodes out
|
|
12893
|
-
// of order, the change detection will run out of order, as the act of retrieving the the
|
|
12894
|
-
// LContainer from the RNode is what adds it to the queue.
|
|
12895
|
-
if (lView[CHILD_HEAD]) {
|
|
12896
|
-
lView[CHILD_TAIL][NEXT] = lViewOrLContainer;
|
|
12897
|
-
}
|
|
12898
|
-
else {
|
|
12899
|
-
lView[CHILD_HEAD] = lViewOrLContainer;
|
|
12900
|
-
}
|
|
12901
|
-
lView[CHILD_TAIL] = lViewOrLContainer;
|
|
12902
|
-
return lViewOrLContainer;
|
|
12903
|
-
}
|
|
12904
12894
|
///////////////////////////////
|
|
12905
12895
|
//// Bindings & interpolations
|
|
12906
12896
|
///////////////////////////////
|
|
@@ -12930,7 +12920,7 @@ function storePropertyBindingMetadata(tData, tNode, propertyName, bindingIndex,
|
|
|
12930
12920
|
// Since we don't have a concept of the "first update pass" we need to check for presence of the
|
|
12931
12921
|
// binding meta-data to decide if one should be stored (or if was stored already).
|
|
12932
12922
|
if (tData[bindingIndex] === null) {
|
|
12933
|
-
if (tNode.inputs
|
|
12923
|
+
if (!tNode.inputs?.[propertyName] && !tNode.hostDirectiveInputs?.[propertyName]) {
|
|
12934
12924
|
const propBindingIdxs = tNode.propertyBindings || (tNode.propertyBindings = []);
|
|
12935
12925
|
propBindingIdxs.push(bindingIndex);
|
|
12936
12926
|
let bindingMetadata = propertyName;
|
|
@@ -12965,24 +12955,88 @@ function handleError(lView, error) {
|
|
|
12965
12955
|
errorHandler && errorHandler.handleError(error);
|
|
12966
12956
|
}
|
|
12967
12957
|
/**
|
|
12968
|
-
* Set
|
|
12958
|
+
* Set all directive inputs with the specific public name on the node.
|
|
12969
12959
|
*
|
|
12970
|
-
* @param
|
|
12971
|
-
* @param
|
|
12972
|
-
* @param
|
|
12973
|
-
*
|
|
12960
|
+
* @param tNode TNode on which the input is being set.
|
|
12961
|
+
* @param tView Current TView
|
|
12962
|
+
* @param lView `LView` which contains the directives.
|
|
12963
|
+
* @param publicName Public name of the input being set.
|
|
12964
|
+
* @param value Value to set.
|
|
12965
|
+
*/
|
|
12966
|
+
function setAllInputsForProperty(tNode, tView, lView, publicName, value) {
|
|
12967
|
+
const inputs = tNode.inputs?.[publicName];
|
|
12968
|
+
const hostDirectiveInputs = tNode.hostDirectiveInputs?.[publicName];
|
|
12969
|
+
let hasMatch = false;
|
|
12970
|
+
if (hostDirectiveInputs) {
|
|
12971
|
+
for (let i = 0; i < hostDirectiveInputs.length; i += 2) {
|
|
12972
|
+
const index = hostDirectiveInputs[i];
|
|
12973
|
+
ngDevMode && assertIndexInRange(lView, index);
|
|
12974
|
+
const publicName = hostDirectiveInputs[i + 1];
|
|
12975
|
+
const def = tView.data[index];
|
|
12976
|
+
writeToDirectiveInput(def, lView[index], publicName, value);
|
|
12977
|
+
hasMatch = true;
|
|
12978
|
+
}
|
|
12979
|
+
}
|
|
12980
|
+
if (inputs) {
|
|
12981
|
+
for (const index of inputs) {
|
|
12982
|
+
ngDevMode && assertIndexInRange(lView, index);
|
|
12983
|
+
const instance = lView[index];
|
|
12984
|
+
const def = tView.data[index];
|
|
12985
|
+
writeToDirectiveInput(def, instance, publicName, value);
|
|
12986
|
+
hasMatch = true;
|
|
12987
|
+
}
|
|
12988
|
+
}
|
|
12989
|
+
return hasMatch;
|
|
12990
|
+
}
|
|
12991
|
+
/**
|
|
12992
|
+
* Sets an input value only on a specific directive and its host directives.
|
|
12993
|
+
* @param tNode TNode on which the input is being set.
|
|
12994
|
+
* @param tView Current TView
|
|
12995
|
+
* @param lView `LView` which contains the directives.
|
|
12996
|
+
* @param target Directive on which to set the input.
|
|
12997
|
+
* @param publicName Public name of the input being set.
|
|
12974
12998
|
* @param value Value to set.
|
|
12975
12999
|
*/
|
|
12976
|
-
function
|
|
12977
|
-
|
|
12978
|
-
|
|
12979
|
-
|
|
12980
|
-
|
|
12981
|
-
|
|
12982
|
-
|
|
12983
|
-
|
|
12984
|
-
|
|
13000
|
+
function setDirectiveInput(tNode, tView, lView, target, publicName, value) {
|
|
13001
|
+
let hostIndex = null;
|
|
13002
|
+
let hostDirectivesStart = null;
|
|
13003
|
+
let hostDirectivesEnd = null;
|
|
13004
|
+
let hasSet = false;
|
|
13005
|
+
if (ngDevMode && !tNode.directiveToIndex?.has(target.type)) {
|
|
13006
|
+
throw new Error(`Node does not have a directive with type ${target.type.name}`);
|
|
13007
|
+
}
|
|
13008
|
+
const data = tNode.directiveToIndex.get(target.type);
|
|
13009
|
+
if (typeof data === 'number') {
|
|
13010
|
+
hostIndex = data;
|
|
13011
|
+
}
|
|
13012
|
+
else {
|
|
13013
|
+
[hostIndex, hostDirectivesStart, hostDirectivesEnd] = data;
|
|
13014
|
+
}
|
|
13015
|
+
if (hostDirectivesStart !== null &&
|
|
13016
|
+
hostDirectivesEnd !== null &&
|
|
13017
|
+
tNode.hostDirectiveInputs?.hasOwnProperty(publicName)) {
|
|
13018
|
+
const hostDirectiveInputs = tNode.hostDirectiveInputs[publicName];
|
|
13019
|
+
for (let i = 0; i < hostDirectiveInputs.length; i += 2) {
|
|
13020
|
+
const index = hostDirectiveInputs[i];
|
|
13021
|
+
if (index >= hostDirectivesStart && index <= hostDirectivesEnd) {
|
|
13022
|
+
ngDevMode && assertIndexInRange(lView, index);
|
|
13023
|
+
const def = tView.data[index];
|
|
13024
|
+
const hostDirectivePublicName = hostDirectiveInputs[i + 1];
|
|
13025
|
+
writeToDirectiveInput(def, lView[index], hostDirectivePublicName, value);
|
|
13026
|
+
hasSet = true;
|
|
13027
|
+
}
|
|
13028
|
+
else if (index > hostDirectivesEnd) {
|
|
13029
|
+
// Directives here are in ascending order so we can stop looking once we're past the range.
|
|
13030
|
+
break;
|
|
13031
|
+
}
|
|
13032
|
+
}
|
|
13033
|
+
}
|
|
13034
|
+
if (hostIndex !== null) {
|
|
13035
|
+
ngDevMode && assertIndexInRange(lView, hostIndex);
|
|
13036
|
+
writeToDirectiveInput(target, lView[hostIndex], publicName, value);
|
|
13037
|
+
hasSet = true;
|
|
12985
13038
|
}
|
|
13039
|
+
return hasSet;
|
|
12986
13040
|
}
|
|
12987
13041
|
|
|
12988
13042
|
function renderComponent(hostLView, componentHostIdx) {
|
|
@@ -13103,24 +13157,41 @@ function renderChildComponents(hostLView, components) {
|
|
|
13103
13157
|
}
|
|
13104
13158
|
}
|
|
13105
13159
|
|
|
13160
|
+
function createAndRenderEmbeddedLView(declarationLView, templateTNode, context, options) {
|
|
13161
|
+
const prevConsumer = setActiveConsumer$1(null);
|
|
13162
|
+
try {
|
|
13163
|
+
const embeddedTView = templateTNode.tView;
|
|
13164
|
+
ngDevMode && assertDefined(embeddedTView, 'TView must be defined for a template node.');
|
|
13165
|
+
ngDevMode && assertTNodeForLView(templateTNode, declarationLView);
|
|
13166
|
+
// Embedded views follow the change detection strategy of the view they're declared in.
|
|
13167
|
+
const isSignalView = declarationLView[FLAGS] & 4096 /* LViewFlags.SignalView */;
|
|
13168
|
+
const viewFlags = isSignalView ? 4096 /* LViewFlags.SignalView */ : 16 /* LViewFlags.CheckAlways */;
|
|
13169
|
+
const embeddedLView = createLView(declarationLView, embeddedTView, context, viewFlags, null, templateTNode, null, null, options?.injector ?? null, options?.embeddedViewInjector ?? null, options?.dehydratedView ?? null);
|
|
13170
|
+
const declarationLContainer = declarationLView[templateTNode.index];
|
|
13171
|
+
ngDevMode && assertLContainer(declarationLContainer);
|
|
13172
|
+
embeddedLView[DECLARATION_LCONTAINER] = declarationLContainer;
|
|
13173
|
+
const declarationViewLQueries = declarationLView[QUERIES];
|
|
13174
|
+
if (declarationViewLQueries !== null) {
|
|
13175
|
+
embeddedLView[QUERIES] = declarationViewLQueries.createEmbeddedView(embeddedTView);
|
|
13176
|
+
}
|
|
13177
|
+
// execute creation mode of a view
|
|
13178
|
+
renderView(embeddedTView, embeddedLView, context);
|
|
13179
|
+
return embeddedLView;
|
|
13180
|
+
}
|
|
13181
|
+
finally {
|
|
13182
|
+
setActiveConsumer$1(prevConsumer);
|
|
13183
|
+
}
|
|
13184
|
+
}
|
|
13106
13185
|
/**
|
|
13107
|
-
*
|
|
13108
|
-
*
|
|
13186
|
+
* Returns whether an elements that belong to a view should be
|
|
13187
|
+
* inserted into the DOM. For client-only cases, DOM elements are
|
|
13188
|
+
* always inserted. For hydration cases, we check whether serialized
|
|
13189
|
+
* info is available for a view and the view is not in a "skip hydration"
|
|
13190
|
+
* block (in which case view contents was re-created, thus needing insertion).
|
|
13109
13191
|
*/
|
|
13110
|
-
|
|
13111
|
-
(
|
|
13112
|
-
|
|
13113
|
-
// `node_manipulation.ts` Currently doing the import cause resolution order to change and fails
|
|
13114
|
-
// the tests. The work around is to have hard coded value in `node_manipulation.ts` for now.
|
|
13115
|
-
/**
|
|
13116
|
-
* Marks a style as important.
|
|
13117
|
-
*/
|
|
13118
|
-
RendererStyleFlags2[RendererStyleFlags2["Important"] = 1] = "Important";
|
|
13119
|
-
/**
|
|
13120
|
-
* Marks a style as using dash case naming (this-is-dash-case).
|
|
13121
|
-
*/
|
|
13122
|
-
RendererStyleFlags2[RendererStyleFlags2["DashCase"] = 2] = "DashCase";
|
|
13123
|
-
})(RendererStyleFlags2 || (RendererStyleFlags2 = {}));
|
|
13192
|
+
function shouldAddViewToDom(tNode, dehydratedView) {
|
|
13193
|
+
return (!dehydratedView || dehydratedView.firstChild === null || hasInSkipHydrationBlockFlag(tNode));
|
|
13194
|
+
}
|
|
13124
13195
|
|
|
13125
13196
|
let _icuContainerIterate;
|
|
13126
13197
|
/**
|
|
@@ -13143,6 +13214,25 @@ function ensureIcuContainerVisitorLoaded(loader) {
|
|
|
13143
13214
|
}
|
|
13144
13215
|
}
|
|
13145
13216
|
|
|
13217
|
+
/**
|
|
13218
|
+
* Flags for renderer-specific style modifiers.
|
|
13219
|
+
* @publicApi
|
|
13220
|
+
*/
|
|
13221
|
+
var RendererStyleFlags2;
|
|
13222
|
+
(function (RendererStyleFlags2) {
|
|
13223
|
+
// TODO(misko): This needs to be refactored into a separate file so that it can be imported from
|
|
13224
|
+
// `node_manipulation.ts` Currently doing the import cause resolution order to change and fails
|
|
13225
|
+
// the tests. The work around is to have hard coded value in `node_manipulation.ts` for now.
|
|
13226
|
+
/**
|
|
13227
|
+
* Marks a style as important.
|
|
13228
|
+
*/
|
|
13229
|
+
RendererStyleFlags2[RendererStyleFlags2["Important"] = 1] = "Important";
|
|
13230
|
+
/**
|
|
13231
|
+
* Marks a style as using dash case naming (this-is-dash-case).
|
|
13232
|
+
*/
|
|
13233
|
+
RendererStyleFlags2[RendererStyleFlags2["DashCase"] = 2] = "DashCase";
|
|
13234
|
+
})(RendererStyleFlags2 || (RendererStyleFlags2 = {}));
|
|
13235
|
+
|
|
13146
13236
|
/**
|
|
13147
13237
|
* Checks whether a TNode is considered detached, i.e. not present in the
|
|
13148
13238
|
* translated i18n template. We should not attempt hydration for such nodes
|
|
@@ -13297,83 +13387,6 @@ function destroyViewTree(rootView) {
|
|
|
13297
13387
|
lViewOrLContainer = next;
|
|
13298
13388
|
}
|
|
13299
13389
|
}
|
|
13300
|
-
/**
|
|
13301
|
-
* Inserts a view into a container.
|
|
13302
|
-
*
|
|
13303
|
-
* This adds the view to the container's array of active views in the correct
|
|
13304
|
-
* position. It also adds the view's elements to the DOM if the container isn't a
|
|
13305
|
-
* root node of another view (in that case, the view's elements will be added when
|
|
13306
|
-
* the container's parent view is added later).
|
|
13307
|
-
*
|
|
13308
|
-
* @param tView The `TView' of the `LView` to insert
|
|
13309
|
-
* @param lView The view to insert
|
|
13310
|
-
* @param lContainer The container into which the view should be inserted
|
|
13311
|
-
* @param index Which index in the container to insert the child view into
|
|
13312
|
-
*/
|
|
13313
|
-
function insertView(tView, lView, lContainer, index) {
|
|
13314
|
-
ngDevMode && assertLView(lView);
|
|
13315
|
-
ngDevMode && assertLContainer(lContainer);
|
|
13316
|
-
const indexInContainer = CONTAINER_HEADER_OFFSET + index;
|
|
13317
|
-
const containerLength = lContainer.length;
|
|
13318
|
-
if (index > 0) {
|
|
13319
|
-
// This is a new view, we need to add it to the children.
|
|
13320
|
-
lContainer[indexInContainer - 1][NEXT] = lView;
|
|
13321
|
-
}
|
|
13322
|
-
if (index < containerLength - CONTAINER_HEADER_OFFSET) {
|
|
13323
|
-
lView[NEXT] = lContainer[indexInContainer];
|
|
13324
|
-
addToArray(lContainer, CONTAINER_HEADER_OFFSET + index, lView);
|
|
13325
|
-
}
|
|
13326
|
-
else {
|
|
13327
|
-
lContainer.push(lView);
|
|
13328
|
-
lView[NEXT] = null;
|
|
13329
|
-
}
|
|
13330
|
-
lView[PARENT] = lContainer;
|
|
13331
|
-
// track views where declaration and insertion points are different
|
|
13332
|
-
const declarationLContainer = lView[DECLARATION_LCONTAINER];
|
|
13333
|
-
if (declarationLContainer !== null && lContainer !== declarationLContainer) {
|
|
13334
|
-
trackMovedView(declarationLContainer, lView);
|
|
13335
|
-
}
|
|
13336
|
-
// notify query that a new view has been added
|
|
13337
|
-
const lQueries = lView[QUERIES];
|
|
13338
|
-
if (lQueries !== null) {
|
|
13339
|
-
lQueries.insertView(tView);
|
|
13340
|
-
}
|
|
13341
|
-
updateAncestorTraversalFlagsOnAttach(lView);
|
|
13342
|
-
// Sets the attached flag
|
|
13343
|
-
lView[FLAGS] |= 128 /* LViewFlags.Attached */;
|
|
13344
|
-
}
|
|
13345
|
-
/**
|
|
13346
|
-
* Track views created from the declaration container (TemplateRef) and inserted into a
|
|
13347
|
-
* different LContainer or attached directly to ApplicationRef.
|
|
13348
|
-
*/
|
|
13349
|
-
function trackMovedView(declarationContainer, lView) {
|
|
13350
|
-
ngDevMode && assertDefined(lView, 'LView required');
|
|
13351
|
-
ngDevMode && assertLContainer(declarationContainer);
|
|
13352
|
-
const movedViews = declarationContainer[MOVED_VIEWS];
|
|
13353
|
-
const parent = lView[PARENT];
|
|
13354
|
-
ngDevMode && assertDefined(parent, 'missing parent');
|
|
13355
|
-
if (isLView(parent)) {
|
|
13356
|
-
declarationContainer[FLAGS] |= 2 /* LContainerFlags.HasTransplantedViews */;
|
|
13357
|
-
}
|
|
13358
|
-
else {
|
|
13359
|
-
const insertedComponentLView = parent[PARENT][DECLARATION_COMPONENT_VIEW];
|
|
13360
|
-
ngDevMode && assertDefined(insertedComponentLView, 'Missing insertedComponentLView');
|
|
13361
|
-
const declaredComponentLView = lView[DECLARATION_COMPONENT_VIEW];
|
|
13362
|
-
ngDevMode && assertDefined(declaredComponentLView, 'Missing declaredComponentLView');
|
|
13363
|
-
if (declaredComponentLView !== insertedComponentLView) {
|
|
13364
|
-
// At this point the declaration-component is not same as insertion-component; this means that
|
|
13365
|
-
// this is a transplanted view. Mark the declared lView as having transplanted views so that
|
|
13366
|
-
// those views can participate in CD.
|
|
13367
|
-
declarationContainer[FLAGS] |= 2 /* LContainerFlags.HasTransplantedViews */;
|
|
13368
|
-
}
|
|
13369
|
-
}
|
|
13370
|
-
if (movedViews === null) {
|
|
13371
|
-
declarationContainer[MOVED_VIEWS] = [lView];
|
|
13372
|
-
}
|
|
13373
|
-
else {
|
|
13374
|
-
movedViews.push(lView);
|
|
13375
|
-
}
|
|
13376
|
-
}
|
|
13377
13390
|
function detachMovedView(declarationContainer, lView) {
|
|
13378
13391
|
ngDevMode && assertLContainer(declarationContainer);
|
|
13379
13392
|
ngDevMode &&
|
|
@@ -13382,43 +13395,6 @@ function detachMovedView(declarationContainer, lView) {
|
|
|
13382
13395
|
const declarationViewIndex = movedViews.indexOf(lView);
|
|
13383
13396
|
movedViews.splice(declarationViewIndex, 1);
|
|
13384
13397
|
}
|
|
13385
|
-
/**
|
|
13386
|
-
* Detaches a view from a container.
|
|
13387
|
-
*
|
|
13388
|
-
* This method removes the view from the container's array of active views. It also
|
|
13389
|
-
* removes the view's elements from the DOM.
|
|
13390
|
-
*
|
|
13391
|
-
* @param lContainer The container from which to detach a view
|
|
13392
|
-
* @param removeIndex The index of the view to detach
|
|
13393
|
-
* @returns Detached LView instance.
|
|
13394
|
-
*/
|
|
13395
|
-
function detachView(lContainer, removeIndex) {
|
|
13396
|
-
if (lContainer.length <= CONTAINER_HEADER_OFFSET)
|
|
13397
|
-
return;
|
|
13398
|
-
const indexInContainer = CONTAINER_HEADER_OFFSET + removeIndex;
|
|
13399
|
-
const viewToDetach = lContainer[indexInContainer];
|
|
13400
|
-
if (viewToDetach) {
|
|
13401
|
-
const declarationLContainer = viewToDetach[DECLARATION_LCONTAINER];
|
|
13402
|
-
if (declarationLContainer !== null && declarationLContainer !== lContainer) {
|
|
13403
|
-
detachMovedView(declarationLContainer, viewToDetach);
|
|
13404
|
-
}
|
|
13405
|
-
if (removeIndex > 0) {
|
|
13406
|
-
lContainer[indexInContainer - 1][NEXT] = viewToDetach[NEXT];
|
|
13407
|
-
}
|
|
13408
|
-
const removedLView = removeFromArray(lContainer, CONTAINER_HEADER_OFFSET + removeIndex);
|
|
13409
|
-
removeViewFromDOM(viewToDetach[TVIEW], viewToDetach);
|
|
13410
|
-
// notify query that a view has been removed
|
|
13411
|
-
const lQueries = removedLView[QUERIES];
|
|
13412
|
-
if (lQueries !== null) {
|
|
13413
|
-
lQueries.detachView(removedLView[TVIEW]);
|
|
13414
|
-
}
|
|
13415
|
-
viewToDetach[PARENT] = null;
|
|
13416
|
-
viewToDetach[NEXT] = null;
|
|
13417
|
-
// Unsets the attached flag
|
|
13418
|
-
viewToDetach[FLAGS] &= ~128 /* LViewFlags.Attached */;
|
|
13419
|
-
}
|
|
13420
|
-
return viewToDetach;
|
|
13421
|
-
}
|
|
13422
13398
|
/**
|
|
13423
13399
|
* A standalone function which destroys an LView,
|
|
13424
13400
|
* conducting clean up (e.g. removing listeners, calling onDestroys).
|
|
@@ -13985,80 +13961,6 @@ function applyStyling(renderer, isClassBased, rNode, prop, value) {
|
|
|
13985
13961
|
}
|
|
13986
13962
|
}
|
|
13987
13963
|
|
|
13988
|
-
function createAndRenderEmbeddedLView(declarationLView, templateTNode, context, options) {
|
|
13989
|
-
const prevConsumer = setActiveConsumer$1(null);
|
|
13990
|
-
try {
|
|
13991
|
-
const embeddedTView = templateTNode.tView;
|
|
13992
|
-
ngDevMode && assertDefined(embeddedTView, 'TView must be defined for a template node.');
|
|
13993
|
-
ngDevMode && assertTNodeForLView(templateTNode, declarationLView);
|
|
13994
|
-
// Embedded views follow the change detection strategy of the view they're declared in.
|
|
13995
|
-
const isSignalView = declarationLView[FLAGS] & 4096 /* LViewFlags.SignalView */;
|
|
13996
|
-
const viewFlags = isSignalView ? 4096 /* LViewFlags.SignalView */ : 16 /* LViewFlags.CheckAlways */;
|
|
13997
|
-
const embeddedLView = createLView(declarationLView, embeddedTView, context, viewFlags, null, templateTNode, null, null, options?.injector ?? null, options?.embeddedViewInjector ?? null, options?.dehydratedView ?? null);
|
|
13998
|
-
const declarationLContainer = declarationLView[templateTNode.index];
|
|
13999
|
-
ngDevMode && assertLContainer(declarationLContainer);
|
|
14000
|
-
embeddedLView[DECLARATION_LCONTAINER] = declarationLContainer;
|
|
14001
|
-
const declarationViewLQueries = declarationLView[QUERIES];
|
|
14002
|
-
if (declarationViewLQueries !== null) {
|
|
14003
|
-
embeddedLView[QUERIES] = declarationViewLQueries.createEmbeddedView(embeddedTView);
|
|
14004
|
-
}
|
|
14005
|
-
// execute creation mode of a view
|
|
14006
|
-
renderView(embeddedTView, embeddedLView, context);
|
|
14007
|
-
return embeddedLView;
|
|
14008
|
-
}
|
|
14009
|
-
finally {
|
|
14010
|
-
setActiveConsumer$1(prevConsumer);
|
|
14011
|
-
}
|
|
14012
|
-
}
|
|
14013
|
-
function getLViewFromLContainer(lContainer, index) {
|
|
14014
|
-
const adjustedIndex = CONTAINER_HEADER_OFFSET + index;
|
|
14015
|
-
// avoid reading past the array boundaries
|
|
14016
|
-
if (adjustedIndex < lContainer.length) {
|
|
14017
|
-
const lView = lContainer[adjustedIndex];
|
|
14018
|
-
ngDevMode && assertLView(lView);
|
|
14019
|
-
return lView;
|
|
14020
|
-
}
|
|
14021
|
-
return undefined;
|
|
14022
|
-
}
|
|
14023
|
-
/**
|
|
14024
|
-
* Returns whether an elements that belong to a view should be
|
|
14025
|
-
* inserted into the DOM. For client-only cases, DOM elements are
|
|
14026
|
-
* always inserted. For hydration cases, we check whether serialized
|
|
14027
|
-
* info is available for a view and the view is not in a "skip hydration"
|
|
14028
|
-
* block (in which case view contents was re-created, thus needing insertion).
|
|
14029
|
-
*/
|
|
14030
|
-
function shouldAddViewToDom(tNode, dehydratedView) {
|
|
14031
|
-
return (!dehydratedView || dehydratedView.firstChild === null || hasInSkipHydrationBlockFlag(tNode));
|
|
14032
|
-
}
|
|
14033
|
-
function addLViewToLContainer(lContainer, lView, index, addToDOM = true) {
|
|
14034
|
-
const tView = lView[TVIEW];
|
|
14035
|
-
// Insert into the view tree so the new view can be change-detected
|
|
14036
|
-
insertView(tView, lView, lContainer, index);
|
|
14037
|
-
// Insert elements that belong to this view into the DOM tree
|
|
14038
|
-
if (addToDOM) {
|
|
14039
|
-
const beforeNode = getBeforeNodeForView(index, lContainer);
|
|
14040
|
-
const renderer = lView[RENDERER];
|
|
14041
|
-
const parentRNode = renderer.parentNode(lContainer[NATIVE]);
|
|
14042
|
-
if (parentRNode !== null) {
|
|
14043
|
-
addViewToDOM(tView, lContainer[T_HOST], renderer, lView, parentRNode, beforeNode);
|
|
14044
|
-
}
|
|
14045
|
-
}
|
|
14046
|
-
// When in hydration mode, reset the pointer to the first child in
|
|
14047
|
-
// the dehydrated view. This indicates that the view was hydrated and
|
|
14048
|
-
// further attaching/detaching should work with this view as normal.
|
|
14049
|
-
const hydrationInfo = lView[HYDRATION];
|
|
14050
|
-
if (hydrationInfo !== null && hydrationInfo.firstChild !== null) {
|
|
14051
|
-
hydrationInfo.firstChild = null;
|
|
14052
|
-
}
|
|
14053
|
-
}
|
|
14054
|
-
function removeLViewFromLContainer(lContainer, index) {
|
|
14055
|
-
const lView = detachView(lContainer, index);
|
|
14056
|
-
if (lView !== undefined) {
|
|
14057
|
-
destroyLView(lView[TVIEW], lView);
|
|
14058
|
-
}
|
|
14059
|
-
return lView;
|
|
14060
|
-
}
|
|
14061
|
-
|
|
14062
13964
|
function collectNativeNodes(tView, lView, tNode, result, isProjection = false) {
|
|
14063
13965
|
while (tNode !== null) {
|
|
14064
13966
|
// Let declarations don't have corresponding DOM nodes so we skip over them.
|
|
@@ -14697,6 +14599,187 @@ function markViewDirty(lView, source) {
|
|
|
14697
14599
|
return null;
|
|
14698
14600
|
}
|
|
14699
14601
|
|
|
14602
|
+
/**
|
|
14603
|
+
* Creates a LContainer, either from a container instruction, or for a ViewContainerRef.
|
|
14604
|
+
*
|
|
14605
|
+
* @param hostNative The host element for the LContainer
|
|
14606
|
+
* @param hostTNode The host TNode for the LContainer
|
|
14607
|
+
* @param currentView The parent view of the LContainer
|
|
14608
|
+
* @param native The native comment element
|
|
14609
|
+
* @param isForViewContainerRef Optional a flag indicating the ViewContainerRef case
|
|
14610
|
+
* @returns LContainer
|
|
14611
|
+
*/
|
|
14612
|
+
function createLContainer(hostNative, currentView, native, tNode) {
|
|
14613
|
+
ngDevMode && assertLView(currentView);
|
|
14614
|
+
const lContainer = [
|
|
14615
|
+
hostNative, // host native
|
|
14616
|
+
true, // Boolean `true` in this position signifies that this is an `LContainer`
|
|
14617
|
+
0, // flags
|
|
14618
|
+
currentView, // parent
|
|
14619
|
+
null, // next
|
|
14620
|
+
tNode, // t_host
|
|
14621
|
+
null, // dehydrated views
|
|
14622
|
+
native, // native,
|
|
14623
|
+
null, // view refs
|
|
14624
|
+
null, // moved views
|
|
14625
|
+
];
|
|
14626
|
+
ngDevMode &&
|
|
14627
|
+
assertEqual(lContainer.length, CONTAINER_HEADER_OFFSET, 'Should allocate correct number of slots for LContainer header.');
|
|
14628
|
+
return lContainer;
|
|
14629
|
+
}
|
|
14630
|
+
function getLViewFromLContainer(lContainer, index) {
|
|
14631
|
+
const adjustedIndex = CONTAINER_HEADER_OFFSET + index;
|
|
14632
|
+
// avoid reading past the array boundaries
|
|
14633
|
+
if (adjustedIndex < lContainer.length) {
|
|
14634
|
+
const lView = lContainer[adjustedIndex];
|
|
14635
|
+
ngDevMode && assertLView(lView);
|
|
14636
|
+
return lView;
|
|
14637
|
+
}
|
|
14638
|
+
return undefined;
|
|
14639
|
+
}
|
|
14640
|
+
function addLViewToLContainer(lContainer, lView, index, addToDOM = true) {
|
|
14641
|
+
const tView = lView[TVIEW];
|
|
14642
|
+
// Insert into the view tree so the new view can be change-detected
|
|
14643
|
+
insertView(tView, lView, lContainer, index);
|
|
14644
|
+
// Insert elements that belong to this view into the DOM tree
|
|
14645
|
+
if (addToDOM) {
|
|
14646
|
+
const beforeNode = getBeforeNodeForView(index, lContainer);
|
|
14647
|
+
const renderer = lView[RENDERER];
|
|
14648
|
+
const parentRNode = renderer.parentNode(lContainer[NATIVE]);
|
|
14649
|
+
if (parentRNode !== null) {
|
|
14650
|
+
addViewToDOM(tView, lContainer[T_HOST], renderer, lView, parentRNode, beforeNode);
|
|
14651
|
+
}
|
|
14652
|
+
}
|
|
14653
|
+
// When in hydration mode, reset the pointer to the first child in
|
|
14654
|
+
// the dehydrated view. This indicates that the view was hydrated and
|
|
14655
|
+
// further attaching/detaching should work with this view as normal.
|
|
14656
|
+
const hydrationInfo = lView[HYDRATION];
|
|
14657
|
+
if (hydrationInfo !== null && hydrationInfo.firstChild !== null) {
|
|
14658
|
+
hydrationInfo.firstChild = null;
|
|
14659
|
+
}
|
|
14660
|
+
}
|
|
14661
|
+
function removeLViewFromLContainer(lContainer, index) {
|
|
14662
|
+
const lView = detachView(lContainer, index);
|
|
14663
|
+
if (lView !== undefined) {
|
|
14664
|
+
destroyLView(lView[TVIEW], lView);
|
|
14665
|
+
}
|
|
14666
|
+
return lView;
|
|
14667
|
+
}
|
|
14668
|
+
/**
|
|
14669
|
+
* Detaches a view from a container.
|
|
14670
|
+
*
|
|
14671
|
+
* This method removes the view from the container's array of active views. It also
|
|
14672
|
+
* removes the view's elements from the DOM.
|
|
14673
|
+
*
|
|
14674
|
+
* @param lContainer The container from which to detach a view
|
|
14675
|
+
* @param removeIndex The index of the view to detach
|
|
14676
|
+
* @returns Detached LView instance.
|
|
14677
|
+
*/
|
|
14678
|
+
function detachView(lContainer, removeIndex) {
|
|
14679
|
+
if (lContainer.length <= CONTAINER_HEADER_OFFSET)
|
|
14680
|
+
return;
|
|
14681
|
+
const indexInContainer = CONTAINER_HEADER_OFFSET + removeIndex;
|
|
14682
|
+
const viewToDetach = lContainer[indexInContainer];
|
|
14683
|
+
if (viewToDetach) {
|
|
14684
|
+
const declarationLContainer = viewToDetach[DECLARATION_LCONTAINER];
|
|
14685
|
+
if (declarationLContainer !== null && declarationLContainer !== lContainer) {
|
|
14686
|
+
detachMovedView(declarationLContainer, viewToDetach);
|
|
14687
|
+
}
|
|
14688
|
+
if (removeIndex > 0) {
|
|
14689
|
+
lContainer[indexInContainer - 1][NEXT] = viewToDetach[NEXT];
|
|
14690
|
+
}
|
|
14691
|
+
const removedLView = removeFromArray(lContainer, CONTAINER_HEADER_OFFSET + removeIndex);
|
|
14692
|
+
removeViewFromDOM(viewToDetach[TVIEW], viewToDetach);
|
|
14693
|
+
// notify query that a view has been removed
|
|
14694
|
+
const lQueries = removedLView[QUERIES];
|
|
14695
|
+
if (lQueries !== null) {
|
|
14696
|
+
lQueries.detachView(removedLView[TVIEW]);
|
|
14697
|
+
}
|
|
14698
|
+
viewToDetach[PARENT] = null;
|
|
14699
|
+
viewToDetach[NEXT] = null;
|
|
14700
|
+
// Unsets the attached flag
|
|
14701
|
+
viewToDetach[FLAGS] &= ~128 /* LViewFlags.Attached */;
|
|
14702
|
+
}
|
|
14703
|
+
return viewToDetach;
|
|
14704
|
+
}
|
|
14705
|
+
/**
|
|
14706
|
+
* Inserts a view into a container.
|
|
14707
|
+
*
|
|
14708
|
+
* This adds the view to the container's array of active views in the correct
|
|
14709
|
+
* position. It also adds the view's elements to the DOM if the container isn't a
|
|
14710
|
+
* root node of another view (in that case, the view's elements will be added when
|
|
14711
|
+
* the container's parent view is added later).
|
|
14712
|
+
*
|
|
14713
|
+
* @param tView The `TView' of the `LView` to insert
|
|
14714
|
+
* @param lView The view to insert
|
|
14715
|
+
* @param lContainer The container into which the view should be inserted
|
|
14716
|
+
* @param index Which index in the container to insert the child view into
|
|
14717
|
+
*/
|
|
14718
|
+
function insertView(tView, lView, lContainer, index) {
|
|
14719
|
+
ngDevMode && assertLView(lView);
|
|
14720
|
+
ngDevMode && assertLContainer(lContainer);
|
|
14721
|
+
const indexInContainer = CONTAINER_HEADER_OFFSET + index;
|
|
14722
|
+
const containerLength = lContainer.length;
|
|
14723
|
+
if (index > 0) {
|
|
14724
|
+
// This is a new view, we need to add it to the children.
|
|
14725
|
+
lContainer[indexInContainer - 1][NEXT] = lView;
|
|
14726
|
+
}
|
|
14727
|
+
if (index < containerLength - CONTAINER_HEADER_OFFSET) {
|
|
14728
|
+
lView[NEXT] = lContainer[indexInContainer];
|
|
14729
|
+
addToArray(lContainer, CONTAINER_HEADER_OFFSET + index, lView);
|
|
14730
|
+
}
|
|
14731
|
+
else {
|
|
14732
|
+
lContainer.push(lView);
|
|
14733
|
+
lView[NEXT] = null;
|
|
14734
|
+
}
|
|
14735
|
+
lView[PARENT] = lContainer;
|
|
14736
|
+
// track views where declaration and insertion points are different
|
|
14737
|
+
const declarationLContainer = lView[DECLARATION_LCONTAINER];
|
|
14738
|
+
if (declarationLContainer !== null && lContainer !== declarationLContainer) {
|
|
14739
|
+
trackMovedView(declarationLContainer, lView);
|
|
14740
|
+
}
|
|
14741
|
+
// notify query that a new view has been added
|
|
14742
|
+
const lQueries = lView[QUERIES];
|
|
14743
|
+
if (lQueries !== null) {
|
|
14744
|
+
lQueries.insertView(tView);
|
|
14745
|
+
}
|
|
14746
|
+
updateAncestorTraversalFlagsOnAttach(lView);
|
|
14747
|
+
// Sets the attached flag
|
|
14748
|
+
lView[FLAGS] |= 128 /* LViewFlags.Attached */;
|
|
14749
|
+
}
|
|
14750
|
+
/**
|
|
14751
|
+
* Track views created from the declaration container (TemplateRef) and inserted into a
|
|
14752
|
+
* different LContainer or attached directly to ApplicationRef.
|
|
14753
|
+
*/
|
|
14754
|
+
function trackMovedView(declarationContainer, lView) {
|
|
14755
|
+
ngDevMode && assertDefined(lView, 'LView required');
|
|
14756
|
+
ngDevMode && assertLContainer(declarationContainer);
|
|
14757
|
+
const movedViews = declarationContainer[MOVED_VIEWS];
|
|
14758
|
+
const parent = lView[PARENT];
|
|
14759
|
+
ngDevMode && assertDefined(parent, 'missing parent');
|
|
14760
|
+
if (isLView(parent)) {
|
|
14761
|
+
declarationContainer[FLAGS] |= 2 /* LContainerFlags.HasTransplantedViews */;
|
|
14762
|
+
}
|
|
14763
|
+
else {
|
|
14764
|
+
const insertedComponentLView = parent[PARENT][DECLARATION_COMPONENT_VIEW];
|
|
14765
|
+
ngDevMode && assertDefined(insertedComponentLView, 'Missing insertedComponentLView');
|
|
14766
|
+
const declaredComponentLView = lView[DECLARATION_COMPONENT_VIEW];
|
|
14767
|
+
ngDevMode && assertDefined(declaredComponentLView, 'Missing declaredComponentLView');
|
|
14768
|
+
if (declaredComponentLView !== insertedComponentLView) {
|
|
14769
|
+
// At this point the declaration-component is not same as insertion-component; this means that
|
|
14770
|
+
// this is a transplanted view. Mark the declared lView as having transplanted views so that
|
|
14771
|
+
// those views can participate in CD.
|
|
14772
|
+
declarationContainer[FLAGS] |= 2 /* LContainerFlags.HasTransplantedViews */;
|
|
14773
|
+
}
|
|
14774
|
+
}
|
|
14775
|
+
if (movedViews === null) {
|
|
14776
|
+
declarationContainer[MOVED_VIEWS] = [lView];
|
|
14777
|
+
}
|
|
14778
|
+
else {
|
|
14779
|
+
movedViews.push(lView);
|
|
14780
|
+
}
|
|
14781
|
+
}
|
|
14782
|
+
|
|
14700
14783
|
class ViewRef$1 {
|
|
14701
14784
|
_lView;
|
|
14702
14785
|
_cdRefInjectingView;
|
|
@@ -15606,9 +15689,12 @@ function createTNode(tView, tParent, type, index, value, attrs) {
|
|
|
15606
15689
|
attrs: attrs,
|
|
15607
15690
|
mergedAttrs: null,
|
|
15608
15691
|
localNames: null,
|
|
15609
|
-
initialInputs:
|
|
15692
|
+
initialInputs: null,
|
|
15610
15693
|
inputs: null,
|
|
15694
|
+
hostDirectiveInputs: null,
|
|
15611
15695
|
outputs: null,
|
|
15696
|
+
hostDirectiveOutputs: null,
|
|
15697
|
+
directiveToIndex: null,
|
|
15612
15698
|
tView: null,
|
|
15613
15699
|
next: null,
|
|
15614
15700
|
prev: null,
|
|
@@ -15916,7 +16002,7 @@ function createIcuIterator(tIcu, lView) {
|
|
|
15916
16002
|
* - the `b` char which indicates that the lookup should start from the `document.body`
|
|
15917
16003
|
* - the `h` char to start lookup from the component host node (`lView[HOST]`)
|
|
15918
16004
|
*/
|
|
15919
|
-
const REF_EXTRACTOR_REGEXP = new RegExp(`^(\\d+)*(${REFERENCE_NODE_BODY}|${REFERENCE_NODE_HOST})*(.*)`);
|
|
16005
|
+
const REF_EXTRACTOR_REGEXP = /* @__PURE__ */ new RegExp(`^(\\d+)*(${REFERENCE_NODE_BODY}|${REFERENCE_NODE_HOST})*(.*)`);
|
|
15920
16006
|
/**
|
|
15921
16007
|
* Helper function that takes a reference node location and a set of navigation steps
|
|
15922
16008
|
* (from the reference node) to a target node and outputs a string that represents
|
|
@@ -16796,6 +16882,18 @@ function removeDehydratedViews(lContainer) {
|
|
|
16796
16882
|
// once again in case a `ViewContainerRef` is created later).
|
|
16797
16883
|
lContainer[DEHYDRATED_VIEWS] = retainedViews;
|
|
16798
16884
|
}
|
|
16885
|
+
function removeDehydratedViewList(deferBlock) {
|
|
16886
|
+
const { lContainer } = deferBlock;
|
|
16887
|
+
const dehydratedViews = lContainer[DEHYDRATED_VIEWS];
|
|
16888
|
+
if (dehydratedViews === null)
|
|
16889
|
+
return;
|
|
16890
|
+
const parentLView = lContainer[PARENT];
|
|
16891
|
+
const renderer = parentLView[RENDERER];
|
|
16892
|
+
for (const view of dehydratedViews) {
|
|
16893
|
+
removeDehydratedView(view, renderer);
|
|
16894
|
+
ngDevMode && ngDevMode.dehydratedViewsRemoved++;
|
|
16895
|
+
}
|
|
16896
|
+
}
|
|
16799
16897
|
/**
|
|
16800
16898
|
* Helper function to remove all nodes from a dehydrated view.
|
|
16801
16899
|
*/
|
|
@@ -17431,46 +17529,26 @@ function ɵɵinvalidFactory() {
|
|
|
17431
17529
|
throw new Error(msg);
|
|
17432
17530
|
}
|
|
17433
17531
|
|
|
17434
|
-
/**
|
|
17435
|
-
* When elements are created dynamically after a view blueprint is created (e.g. through
|
|
17436
|
-
* i18nApply()), we need to adjust the blueprint for future template passes.
|
|
17437
|
-
*
|
|
17438
|
-
* @param tView `TView` associated with `LView`
|
|
17439
|
-
* @param lView The `LView` containing the blueprint to adjust
|
|
17440
|
-
* @param numSlotsToAlloc The number of slots to alloc in the LView, should be >0
|
|
17441
|
-
* @param initialValue Initial value to store in blueprint
|
|
17442
|
-
*/
|
|
17443
|
-
function allocExpando(tView, lView, numSlotsToAlloc, initialValue) {
|
|
17444
|
-
if (numSlotsToAlloc === 0)
|
|
17445
|
-
return -1;
|
|
17446
|
-
if (ngDevMode) {
|
|
17447
|
-
assertFirstCreatePass(tView);
|
|
17448
|
-
assertSame(tView, lView[TVIEW], '`LView` must be associated with `TView`!');
|
|
17449
|
-
assertEqual(tView.data.length, lView.length, 'Expecting LView to be same size as TView');
|
|
17450
|
-
assertEqual(tView.data.length, tView.blueprint.length, 'Expecting Blueprint to be same size as TView');
|
|
17451
|
-
assertFirstUpdatePass(tView);
|
|
17452
|
-
}
|
|
17453
|
-
const allocIdx = lView.length;
|
|
17454
|
-
for (let i = 0; i < numSlotsToAlloc; i++) {
|
|
17455
|
-
lView.push(initialValue);
|
|
17456
|
-
tView.blueprint.push(initialValue);
|
|
17457
|
-
tView.data.push(null);
|
|
17458
|
-
}
|
|
17459
|
-
return allocIdx;
|
|
17460
|
-
}
|
|
17461
|
-
|
|
17462
17532
|
/**
|
|
17463
17533
|
* Resolve the matched directives on a node.
|
|
17464
17534
|
*/
|
|
17465
17535
|
function resolveDirectives(tView, lView, tNode, localRefs, directiveMatcher) {
|
|
17466
|
-
// Please make sure to have explicit type for `exportsMap`. Inferred type triggers bug in
|
|
17467
|
-
// tsickle.
|
|
17536
|
+
// Please make sure to have explicit type for `exportsMap`. Inferred type triggers bug in tsickle.
|
|
17468
17537
|
ngDevMode && assertFirstCreatePass(tView);
|
|
17469
17538
|
const exportsMap = localRefs === null ? null : { '': -1 };
|
|
17470
17539
|
const matchedDirectiveDefs = directiveMatcher(tView, tNode);
|
|
17471
17540
|
if (matchedDirectiveDefs !== null) {
|
|
17472
|
-
|
|
17473
|
-
|
|
17541
|
+
let directiveDefs;
|
|
17542
|
+
let hostDirectiveDefs = null;
|
|
17543
|
+
let hostDirectiveRanges = null;
|
|
17544
|
+
const hostDirectiveResolution = resolveHostDirectives(matchedDirectiveDefs);
|
|
17545
|
+
if (hostDirectiveResolution === null) {
|
|
17546
|
+
directiveDefs = matchedDirectiveDefs;
|
|
17547
|
+
}
|
|
17548
|
+
else {
|
|
17549
|
+
[directiveDefs, hostDirectiveDefs, hostDirectiveRanges] = hostDirectiveResolution;
|
|
17550
|
+
}
|
|
17551
|
+
initializeDirectives(tView, lView, tNode, directiveDefs, exportsMap, hostDirectiveDefs, hostDirectiveRanges);
|
|
17474
17552
|
}
|
|
17475
17553
|
if (exportsMap !== null && localRefs !== null) {
|
|
17476
17554
|
cacheMatchingLocalNames(tNode, localRefs, exportsMap);
|
|
@@ -17489,40 +17567,63 @@ function cacheMatchingLocalNames(tNode, localRefs, exportsMap) {
|
|
|
17489
17567
|
localNames.push(localRefs[i], index);
|
|
17490
17568
|
}
|
|
17491
17569
|
}
|
|
17492
|
-
function resolveHostDirectives(
|
|
17493
|
-
|
|
17570
|
+
function resolveHostDirectives(matches) {
|
|
17571
|
+
let componentDef = null;
|
|
17572
|
+
let hasHostDirectives = false;
|
|
17573
|
+
for (let i = 0; i < matches.length; i++) {
|
|
17574
|
+
const def = matches[i];
|
|
17575
|
+
if (i === 0 && isComponentDef(def)) {
|
|
17576
|
+
componentDef = def;
|
|
17577
|
+
}
|
|
17578
|
+
if (def.findHostDirectiveDefs !== null) {
|
|
17579
|
+
hasHostDirectives = true;
|
|
17580
|
+
break;
|
|
17581
|
+
}
|
|
17582
|
+
}
|
|
17583
|
+
if (!hasHostDirectives) {
|
|
17584
|
+
return null;
|
|
17585
|
+
}
|
|
17586
|
+
let allDirectiveDefs = null;
|
|
17494
17587
|
let hostDirectiveDefs = null;
|
|
17588
|
+
let hostDirectiveRanges = null;
|
|
17589
|
+
// Components are inserted at the front of the matches array so that their lifecycle
|
|
17590
|
+
// hooks run before any directive lifecycle hooks. This appears to be for ViewEngine
|
|
17591
|
+
// compatibility. This logic doesn't make sense with host directives, because it
|
|
17592
|
+
// would allow the host directives to undo any overrides the host may have made.
|
|
17593
|
+
// To handle this case, the host directives of components are inserted at the beginning
|
|
17594
|
+
// of the array, followed by the component. As such, the insertion order is as follows:
|
|
17595
|
+
// 1. Host directives belonging to the selector-matched component.
|
|
17596
|
+
// 2. Selector-matched component.
|
|
17597
|
+
// 3. Host directives belonging to selector-matched directives.
|
|
17598
|
+
// 4. Selector-matched dir
|
|
17495
17599
|
for (const def of matches) {
|
|
17496
17600
|
if (def.findHostDirectiveDefs !== null) {
|
|
17497
|
-
|
|
17601
|
+
allDirectiveDefs ??= [];
|
|
17498
17602
|
hostDirectiveDefs ??= new Map();
|
|
17499
|
-
|
|
17500
|
-
|
|
17501
|
-
// compatibility. This logic doesn't make sense with host directives, because it
|
|
17502
|
-
// would allow the host directives to undo any overrides the host may have made.
|
|
17503
|
-
// To handle this case, the host directives of components are inserted at the beginning
|
|
17504
|
-
// of the array, followed by the component. As such, the insertion order is as follows:
|
|
17505
|
-
// 1. Host directives belonging to the selector-matched component.
|
|
17506
|
-
// 2. Selector-matched component.
|
|
17507
|
-
// 3. Host directives belonging to selector-matched directives.
|
|
17508
|
-
// 4. Selector-matched directives.
|
|
17509
|
-
def.findHostDirectiveDefs(def, allDirectiveDefs, hostDirectiveDefs);
|
|
17603
|
+
hostDirectiveRanges ??= new Map();
|
|
17604
|
+
resolveHostDirectivesForDef(def, allDirectiveDefs, hostDirectiveRanges, hostDirectiveDefs);
|
|
17510
17605
|
}
|
|
17511
|
-
|
|
17606
|
+
// Component definition needs to be pushed early to maintain the correct ordering.
|
|
17607
|
+
if (def === componentDef) {
|
|
17608
|
+
allDirectiveDefs ??= [];
|
|
17512
17609
|
allDirectiveDefs.push(def);
|
|
17513
|
-
markAsComponentHost(tView, tNode, allDirectiveDefs.length - 1);
|
|
17514
17610
|
}
|
|
17515
17611
|
}
|
|
17516
|
-
if (
|
|
17517
|
-
allDirectiveDefs.push(...matches.slice(1));
|
|
17518
|
-
|
|
17519
|
-
|
|
17520
|
-
allDirectiveDefs.push(...matches);
|
|
17612
|
+
if (allDirectiveDefs !== null) {
|
|
17613
|
+
allDirectiveDefs.push(...(componentDef === null ? matches : matches.slice(1)));
|
|
17614
|
+
ngDevMode && assertNoDuplicateDirectives(allDirectiveDefs);
|
|
17615
|
+
return [allDirectiveDefs, hostDirectiveDefs, hostDirectiveRanges];
|
|
17521
17616
|
}
|
|
17522
|
-
|
|
17523
|
-
|
|
17524
|
-
|
|
17525
|
-
|
|
17617
|
+
return null;
|
|
17618
|
+
}
|
|
17619
|
+
function resolveHostDirectivesForDef(def, allDirectiveDefs, hostDirectiveRanges, hostDirectiveDefs) {
|
|
17620
|
+
ngDevMode && assertDefined(def.findHostDirectiveDefs, 'Expected host directive resolve function');
|
|
17621
|
+
const start = allDirectiveDefs.length;
|
|
17622
|
+
// TODO(pk): probably could return matches instead of taking in an array to fill in?
|
|
17623
|
+
def.findHostDirectiveDefs(def, allDirectiveDefs, hostDirectiveDefs);
|
|
17624
|
+
// Note that these indexes are within the offset by `directiveStart`. We can't do the
|
|
17625
|
+
// offsetting here, because `directiveStart` hasn't been initialized on the TNode yet.
|
|
17626
|
+
hostDirectiveRanges.set(def, [start, allDirectiveDefs.length - 1]);
|
|
17526
17627
|
}
|
|
17527
17628
|
/**
|
|
17528
17629
|
* Marks a given TNode as a component's host. This consists of:
|
|
@@ -17536,37 +17637,62 @@ function markAsComponentHost(tView, hostTNode, componentOffset) {
|
|
|
17536
17637
|
(tView.components ??= []).push(hostTNode.index);
|
|
17537
17638
|
}
|
|
17538
17639
|
/** Initializes the data structures necessary for a list of directives to be instantiated. */
|
|
17539
|
-
function initializeDirectives(tView, lView, tNode, directives, exportsMap, hostDirectiveDefs) {
|
|
17640
|
+
function initializeDirectives(tView, lView, tNode, directives, exportsMap, hostDirectiveDefs, hostDirectiveRanges) {
|
|
17540
17641
|
ngDevMode && assertFirstCreatePass(tView);
|
|
17642
|
+
const directivesLength = directives.length;
|
|
17643
|
+
let hasSeenComponent = false;
|
|
17541
17644
|
// Publishes the directive types to DI so they can be injected. Needs to
|
|
17542
17645
|
// happen in a separate pass before the TNode flags have been initialized.
|
|
17543
|
-
for (let i = 0; i <
|
|
17544
|
-
|
|
17646
|
+
for (let i = 0; i < directivesLength; i++) {
|
|
17647
|
+
const def = directives[i];
|
|
17648
|
+
if (!hasSeenComponent && isComponentDef(def)) {
|
|
17649
|
+
hasSeenComponent = true;
|
|
17650
|
+
markAsComponentHost(tView, tNode, i);
|
|
17651
|
+
}
|
|
17652
|
+
diPublicInInjector(getOrCreateNodeInjectorForNode(tNode, lView), tView, def.type);
|
|
17545
17653
|
}
|
|
17546
|
-
initTNodeFlags(tNode, tView.data.length,
|
|
17654
|
+
initTNodeFlags(tNode, tView.data.length, directivesLength);
|
|
17547
17655
|
// When the same token is provided by several directives on the same node, some rules apply in
|
|
17548
17656
|
// the viewEngine:
|
|
17549
17657
|
// - viewProviders have priority over providers
|
|
17550
17658
|
// - the last directive in NgModule.declarations has priority over the previous one
|
|
17551
17659
|
// So to match these rules, the order in which providers are added in the arrays is very
|
|
17552
17660
|
// important.
|
|
17553
|
-
for (let i = 0; i <
|
|
17661
|
+
for (let i = 0; i < directivesLength; i++) {
|
|
17554
17662
|
const def = directives[i];
|
|
17555
17663
|
if (def.providersResolver)
|
|
17556
17664
|
def.providersResolver(def);
|
|
17557
17665
|
}
|
|
17558
17666
|
let preOrderHooksFound = false;
|
|
17559
17667
|
let preOrderCheckHooksFound = false;
|
|
17560
|
-
let directiveIdx = allocExpando(tView, lView,
|
|
17668
|
+
let directiveIdx = allocExpando(tView, lView, directivesLength, null);
|
|
17561
17669
|
ngDevMode &&
|
|
17562
17670
|
assertSame(directiveIdx, tNode.directiveStart, 'TNode.directiveStart should point to just allocated space');
|
|
17563
|
-
|
|
17671
|
+
// If there's at least one directive, we'll have to track it so initialize the map.
|
|
17672
|
+
if (directivesLength > 0) {
|
|
17673
|
+
tNode.directiveToIndex = new Map();
|
|
17674
|
+
}
|
|
17675
|
+
for (let i = 0; i < directivesLength; i++) {
|
|
17564
17676
|
const def = directives[i];
|
|
17565
17677
|
// Merge the attrs in the order of matches. This assumes that the first directive is the
|
|
17566
17678
|
// component itself, so that the component has the least priority.
|
|
17567
17679
|
tNode.mergedAttrs = mergeHostAttrs(tNode.mergedAttrs, def.hostAttrs);
|
|
17568
17680
|
configureViewWithDirective(tView, tNode, lView, directiveIdx, def);
|
|
17569
17681
|
saveNameToExportMap(directiveIdx, def, exportsMap);
|
|
17682
|
+
// If a directive has host directives, we need to track both its index and the range within
|
|
17683
|
+
// the host directives are declared. Host directives are not tracked, but should be resolved
|
|
17684
|
+
// by looking up the host and getting its indexes from there.
|
|
17685
|
+
if (hostDirectiveRanges !== null && hostDirectiveRanges.has(def)) {
|
|
17686
|
+
const [start, end] = hostDirectiveRanges.get(def);
|
|
17687
|
+
tNode.directiveToIndex.set(def.type, [
|
|
17688
|
+
directiveIdx,
|
|
17689
|
+
start + tNode.directiveStart,
|
|
17690
|
+
end + tNode.directiveStart,
|
|
17691
|
+
]);
|
|
17692
|
+
}
|
|
17693
|
+
else if (hostDirectiveDefs === null || !hostDirectiveDefs.has(def)) {
|
|
17694
|
+
tNode.directiveToIndex.set(def.type, directiveIdx);
|
|
17695
|
+
}
|
|
17570
17696
|
if (def.contentQueries !== null)
|
|
17571
17697
|
tNode.flags |= 4 /* TNodeFlags.hasContentQuery */;
|
|
17572
17698
|
if (def.hostBindings !== null || def.hostAttrs !== null || def.hostVars !== 0)
|
|
@@ -17594,102 +17720,84 @@ function initializeDirectives(tView, lView, tNode, directives, exportsMap, hostD
|
|
|
17594
17720
|
* Initializes data structures required to work with directive inputs and outputs.
|
|
17595
17721
|
* Initialization is done for all directives matched on a given TNode.
|
|
17596
17722
|
*/
|
|
17597
|
-
function initializeInputAndOutputAliases(tView, tNode,
|
|
17723
|
+
function initializeInputAndOutputAliases(tView, tNode, hostDirectiveDefs) {
|
|
17598
17724
|
ngDevMode && assertFirstCreatePass(tView);
|
|
17599
|
-
|
|
17600
|
-
|
|
17601
|
-
|
|
17602
|
-
|
|
17603
|
-
|
|
17604
|
-
|
|
17605
|
-
let outputsStore = null;
|
|
17606
|
-
for (let directiveIndex = start; directiveIndex < end; directiveIndex++) {
|
|
17607
|
-
const directiveDef = tViewData[directiveIndex];
|
|
17608
|
-
const aliasData = hostDirectiveDefinitionMap
|
|
17609
|
-
? hostDirectiveDefinitionMap.get(directiveDef)
|
|
17610
|
-
: null;
|
|
17611
|
-
const aliasedInputs = aliasData ? aliasData.inputs : null;
|
|
17612
|
-
const aliasedOutputs = aliasData ? aliasData.outputs : null;
|
|
17613
|
-
inputsStore = captureNodeBindings(0 /* CaptureNodeBindingMode.Inputs */, directiveDef.inputs, directiveIndex, inputsStore, aliasedInputs);
|
|
17614
|
-
outputsStore = captureNodeBindings(1 /* CaptureNodeBindingMode.Outputs */, directiveDef.outputs, directiveIndex, outputsStore, aliasedOutputs);
|
|
17615
|
-
// Do not use unbound attributes as inputs to structural directives, since structural
|
|
17616
|
-
// directive inputs can only be set using microsyntax (e.g. `<div *dir="exp">`).
|
|
17617
|
-
const initialInputs = inputsStore !== null && tNodeAttrs !== null && !isInlineTemplate(tNode)
|
|
17618
|
-
? generateInitialInputs(inputsStore, directiveIndex, tNodeAttrs)
|
|
17619
|
-
: null;
|
|
17620
|
-
inputsFromAttrs.push(initialInputs);
|
|
17621
|
-
}
|
|
17622
|
-
if (inputsStore !== null) {
|
|
17623
|
-
if (inputsStore.hasOwnProperty('class')) {
|
|
17624
|
-
tNode.flags |= 8 /* TNodeFlags.hasClassInput */;
|
|
17725
|
+
for (let index = tNode.directiveStart; index < tNode.directiveEnd; index++) {
|
|
17726
|
+
const directiveDef = tView.data[index];
|
|
17727
|
+
if (hostDirectiveDefs === null || !hostDirectiveDefs.has(directiveDef)) {
|
|
17728
|
+
setupSelectorMatchedInputsOrOutputs(0 /* BindingType.Inputs */, tNode, directiveDef, index);
|
|
17729
|
+
setupSelectorMatchedInputsOrOutputs(1 /* BindingType.Outputs */, tNode, directiveDef, index);
|
|
17730
|
+
setupInitialInputs(tNode, index, false);
|
|
17625
17731
|
}
|
|
17626
|
-
|
|
17627
|
-
|
|
17732
|
+
else {
|
|
17733
|
+
const hostDirectiveDef = hostDirectiveDefs.get(directiveDef);
|
|
17734
|
+
setupHostDirectiveInputsOrOutputs(0 /* BindingType.Inputs */, tNode, hostDirectiveDef, index);
|
|
17735
|
+
setupHostDirectiveInputsOrOutputs(1 /* BindingType.Outputs */, tNode, hostDirectiveDef, index);
|
|
17736
|
+
setupInitialInputs(tNode, index, true);
|
|
17628
17737
|
}
|
|
17629
17738
|
}
|
|
17630
|
-
tNode.initialInputs = inputsFromAttrs;
|
|
17631
|
-
tNode.inputs = inputsStore;
|
|
17632
|
-
tNode.outputs = outputsStore;
|
|
17633
17739
|
}
|
|
17634
|
-
|
|
17635
|
-
|
|
17636
|
-
|
|
17637
|
-
|
|
17638
|
-
|
|
17639
|
-
|
|
17640
|
-
|
|
17641
|
-
|
|
17642
|
-
|
|
17643
|
-
|
|
17644
|
-
|
|
17645
|
-
|
|
17646
|
-
|
|
17647
|
-
|
|
17648
|
-
|
|
17649
|
-
|
|
17650
|
-
inputFlags = value[1];
|
|
17651
|
-
}
|
|
17652
|
-
else {
|
|
17653
|
-
internalName = value;
|
|
17654
|
-
}
|
|
17655
|
-
// If there are no host directive mappings, we want to remap using the alias map from the
|
|
17656
|
-
// definition itself. If there is an alias map, it has two functions:
|
|
17657
|
-
// 1. It serves as an allowlist of bindings that are exposed by the host directives. Only the
|
|
17658
|
-
// ones inside the host directive map will be exposed on the host.
|
|
17659
|
-
// 2. The public name of the property is aliased using the host directive alias map, rather
|
|
17660
|
-
// than the alias map from the definition.
|
|
17661
|
-
let finalPublicName = publicName;
|
|
17662
|
-
if (hostDirectiveAliasMap !== null) {
|
|
17663
|
-
// If there is no mapping, it's not part of the allowlist and this input/output
|
|
17664
|
-
// is not captured and should be ignored.
|
|
17665
|
-
if (!hostDirectiveAliasMap.hasOwnProperty(publicName)) {
|
|
17666
|
-
continue;
|
|
17740
|
+
/**
|
|
17741
|
+
* Sets up the input/output bindings for a directive that was matched in the template through its
|
|
17742
|
+
* selector. This method is called repeatedly to build up all of the available inputs on a node.
|
|
17743
|
+
*
|
|
17744
|
+
* @param mode Whether inputs or outputs are being contructed.
|
|
17745
|
+
* @param tNode Node on which the bindings are being set up.
|
|
17746
|
+
* @param def Directive definition for which the bindings are being set up.
|
|
17747
|
+
* @param directiveIndex Index at which the directive instance will be stored in the LView.
|
|
17748
|
+
*/
|
|
17749
|
+
function setupSelectorMatchedInputsOrOutputs(mode, tNode, def, directiveIndex) {
|
|
17750
|
+
const aliasMap = mode === 0 /* BindingType.Inputs */ ? def.inputs : def.outputs;
|
|
17751
|
+
for (const publicName in aliasMap) {
|
|
17752
|
+
if (aliasMap.hasOwnProperty(publicName)) {
|
|
17753
|
+
let bindings;
|
|
17754
|
+
if (mode === 0 /* BindingType.Inputs */) {
|
|
17755
|
+
bindings = tNode.inputs ??= {};
|
|
17667
17756
|
}
|
|
17668
|
-
|
|
17669
|
-
|
|
17670
|
-
|
|
17671
|
-
|
|
17672
|
-
|
|
17673
|
-
|
|
17674
|
-
addPropertyBinding(bindingsResult, directiveIndex, finalPublicName, internalName);
|
|
17757
|
+
else {
|
|
17758
|
+
bindings = tNode.outputs ??= {};
|
|
17759
|
+
}
|
|
17760
|
+
bindings[publicName] ??= [];
|
|
17761
|
+
bindings[publicName].push(directiveIndex);
|
|
17762
|
+
setShadowStylingInputFlags(tNode, publicName);
|
|
17675
17763
|
}
|
|
17676
17764
|
}
|
|
17677
|
-
return bindingsResult;
|
|
17678
17765
|
}
|
|
17679
|
-
|
|
17680
|
-
|
|
17681
|
-
|
|
17682
|
-
|
|
17766
|
+
/**
|
|
17767
|
+
* Sets up input/output bindings that were defined through host directives on a specific node.
|
|
17768
|
+
* @param mode Whether inputs or outputs are being contructed.
|
|
17769
|
+
* @param tNode Node on which the bindings are being set up.
|
|
17770
|
+
* @param config Host directive definition that is being set up.
|
|
17771
|
+
* @param directiveIndex Index at which the directive instance will be stored in the LView.
|
|
17772
|
+
*/
|
|
17773
|
+
function setupHostDirectiveInputsOrOutputs(mode, tNode, config, directiveIndex) {
|
|
17774
|
+
const aliasMap = mode === 0 /* BindingType.Inputs */ ? config.inputs : config.outputs;
|
|
17775
|
+
for (const initialName in aliasMap) {
|
|
17776
|
+
if (aliasMap.hasOwnProperty(initialName)) {
|
|
17777
|
+
const publicName = aliasMap[initialName];
|
|
17778
|
+
let bindings;
|
|
17779
|
+
if (mode === 0 /* BindingType.Inputs */) {
|
|
17780
|
+
bindings = tNode.hostDirectiveInputs ??= {};
|
|
17781
|
+
}
|
|
17782
|
+
else {
|
|
17783
|
+
bindings = tNode.hostDirectiveOutputs ??= {};
|
|
17784
|
+
}
|
|
17785
|
+
bindings[publicName] ??= [];
|
|
17786
|
+
bindings[publicName].push(directiveIndex, initialName);
|
|
17787
|
+
setShadowStylingInputFlags(tNode, publicName);
|
|
17788
|
+
}
|
|
17683
17789
|
}
|
|
17684
|
-
|
|
17685
|
-
|
|
17790
|
+
}
|
|
17791
|
+
function setShadowStylingInputFlags(tNode, publicName) {
|
|
17792
|
+
if (publicName === 'class') {
|
|
17793
|
+
tNode.flags |= 8 /* TNodeFlags.hasClassInput */;
|
|
17686
17794
|
}
|
|
17687
|
-
if (
|
|
17688
|
-
|
|
17795
|
+
else if (publicName === 'style') {
|
|
17796
|
+
tNode.flags |= 16 /* TNodeFlags.hasStyleInput */;
|
|
17689
17797
|
}
|
|
17690
17798
|
}
|
|
17691
17799
|
/**
|
|
17692
|
-
*
|
|
17800
|
+
* Sets up the initialInputData for a node and stores it in the template's static storage
|
|
17693
17801
|
* so subsequent template invocations don't have to recalculate it.
|
|
17694
17802
|
*
|
|
17695
17803
|
* initialInputData is an array containing values that need to be set as input properties
|
|
@@ -17699,11 +17807,21 @@ function addPropertyBinding(bindings, directiveIndex, publicName, internalName,
|
|
|
17699
17807
|
*
|
|
17700
17808
|
* <my-component name="Bess"></my-component>
|
|
17701
17809
|
*
|
|
17702
|
-
* @param
|
|
17810
|
+
* @param tNode TNode on which to set up the initial inputs.
|
|
17703
17811
|
* @param directiveIndex Index of the directive that is currently being processed.
|
|
17704
|
-
* @param attrs Static attrs on this node.
|
|
17705
17812
|
*/
|
|
17706
|
-
function
|
|
17813
|
+
function setupInitialInputs(tNode, directiveIndex, isHostDirective) {
|
|
17814
|
+
const { attrs, inputs, hostDirectiveInputs } = tNode;
|
|
17815
|
+
if (attrs === null ||
|
|
17816
|
+
(!isHostDirective && inputs === null) ||
|
|
17817
|
+
(isHostDirective && hostDirectiveInputs === null) ||
|
|
17818
|
+
// Do not use unbound attributes as inputs to structural directives, since structural
|
|
17819
|
+
// directive inputs can only be set using microsyntax (e.g. `<div *dir="exp">`).
|
|
17820
|
+
isInlineTemplate(tNode)) {
|
|
17821
|
+
tNode.initialInputs ??= [];
|
|
17822
|
+
tNode.initialInputs.push(null);
|
|
17823
|
+
return;
|
|
17824
|
+
}
|
|
17707
17825
|
let inputsToStore = null;
|
|
17708
17826
|
let i = 0;
|
|
17709
17827
|
while (i < attrs.length) {
|
|
@@ -17718,27 +17836,38 @@ function generateInitialInputs(inputs, directiveIndex, attrs) {
|
|
|
17718
17836
|
i += 2;
|
|
17719
17837
|
continue;
|
|
17720
17838
|
}
|
|
17721
|
-
|
|
17722
|
-
|
|
17839
|
+
else if (typeof attrName === 'number') {
|
|
17840
|
+
// If we hit any other attribute markers, we're done anyway. None of those are valid inputs.
|
|
17723
17841
|
break;
|
|
17724
|
-
|
|
17725
|
-
|
|
17726
|
-
inputsToStore = [];
|
|
17842
|
+
}
|
|
17843
|
+
if (!isHostDirective && inputs.hasOwnProperty(attrName)) {
|
|
17727
17844
|
// Find the input's public name from the input store. Note that we can be found easier
|
|
17728
17845
|
// through the directive def, but we want to do it using the inputs store so that it can
|
|
17729
17846
|
// account for host directive aliases.
|
|
17730
17847
|
const inputConfig = inputs[attrName];
|
|
17731
|
-
for (
|
|
17732
|
-
if (
|
|
17733
|
-
inputsToStore
|
|
17848
|
+
for (const index of inputConfig) {
|
|
17849
|
+
if (index === directiveIndex) {
|
|
17850
|
+
inputsToStore ??= [];
|
|
17851
|
+
inputsToStore.push(attrName, attrs[i + 1]);
|
|
17734
17852
|
// A directive can't have multiple inputs with the same name so we can break here.
|
|
17735
17853
|
break;
|
|
17736
17854
|
}
|
|
17737
17855
|
}
|
|
17738
17856
|
}
|
|
17857
|
+
else if (isHostDirective && hostDirectiveInputs.hasOwnProperty(attrName)) {
|
|
17858
|
+
const config = hostDirectiveInputs[attrName];
|
|
17859
|
+
for (let j = 0; j < config.length; j += 2) {
|
|
17860
|
+
if (config[j] === directiveIndex) {
|
|
17861
|
+
inputsToStore ??= [];
|
|
17862
|
+
inputsToStore.push(config[j + 1], attrs[i + 1]);
|
|
17863
|
+
break;
|
|
17864
|
+
}
|
|
17865
|
+
}
|
|
17866
|
+
}
|
|
17739
17867
|
i += 2;
|
|
17740
17868
|
}
|
|
17741
|
-
|
|
17869
|
+
tNode.initialInputs ??= [];
|
|
17870
|
+
tNode.initialInputs.push(inputsToStore);
|
|
17742
17871
|
}
|
|
17743
17872
|
/**
|
|
17744
17873
|
* Setup directive for instantiation.
|
|
@@ -17899,34 +18028,22 @@ class ComponentFactoryResolver extends ComponentFactoryResolver$1 {
|
|
|
17899
18028
|
return new ComponentFactory(componentDef, this.ngModule);
|
|
17900
18029
|
}
|
|
17901
18030
|
}
|
|
17902
|
-
function
|
|
17903
|
-
|
|
17904
|
-
|
|
17905
|
-
|
|
17906
|
-
|
|
17907
|
-
|
|
17908
|
-
|
|
17909
|
-
|
|
17910
|
-
|
|
17911
|
-
|
|
17912
|
-
const isArray = Array.isArray(value);
|
|
17913
|
-
const propName = isArray ? value[0] : value;
|
|
17914
|
-
const flags = isArray ? value[1] : InputFlags.None;
|
|
17915
|
-
if (isInputMap) {
|
|
17916
|
-
array.push({
|
|
17917
|
-
propName: propName,
|
|
17918
|
-
templateName: publicName,
|
|
17919
|
-
isSignal: (flags & InputFlags.SignalBased) !== 0,
|
|
17920
|
-
});
|
|
17921
|
-
}
|
|
17922
|
-
else {
|
|
17923
|
-
array.push({
|
|
17924
|
-
propName: propName,
|
|
17925
|
-
templateName: publicName,
|
|
17926
|
-
});
|
|
18031
|
+
function toInputRefArray(map) {
|
|
18032
|
+
return Object.keys(map).map((name) => {
|
|
18033
|
+
const [propName, flags, transform] = map[name];
|
|
18034
|
+
const inputData = {
|
|
18035
|
+
propName: propName,
|
|
18036
|
+
templateName: name,
|
|
18037
|
+
isSignal: (flags & InputFlags.SignalBased) !== 0,
|
|
18038
|
+
};
|
|
18039
|
+
if (transform) {
|
|
18040
|
+
inputData.transform = transform;
|
|
17927
18041
|
}
|
|
17928
|
-
|
|
17929
|
-
|
|
18042
|
+
return inputData;
|
|
18043
|
+
});
|
|
18044
|
+
}
|
|
18045
|
+
function toOutputRefArray(map) {
|
|
18046
|
+
return Object.keys(map).map((name) => ({ propName: map[name], templateName: name }));
|
|
17930
18047
|
}
|
|
17931
18048
|
function verifyNotAnOrphanComponent(componentDef) {
|
|
17932
18049
|
// TODO(pk): create assert that verifies ngDevMode
|
|
@@ -17985,20 +18102,10 @@ class ComponentFactory extends ComponentFactory$1 {
|
|
|
17985
18102
|
ngContentSelectors;
|
|
17986
18103
|
isBoundToModule;
|
|
17987
18104
|
get inputs() {
|
|
17988
|
-
|
|
17989
|
-
const inputTransforms = componentDef.inputTransforms;
|
|
17990
|
-
const refArray = toRefArray(componentDef.inputs, true);
|
|
17991
|
-
if (inputTransforms !== null) {
|
|
17992
|
-
for (const input of refArray) {
|
|
17993
|
-
if (inputTransforms.hasOwnProperty(input.propName)) {
|
|
17994
|
-
input.transform = inputTransforms[input.propName];
|
|
17995
|
-
}
|
|
17996
|
-
}
|
|
17997
|
-
}
|
|
17998
|
-
return refArray;
|
|
18105
|
+
return toInputRefArray(this.componentDef.inputs);
|
|
17999
18106
|
}
|
|
18000
18107
|
get outputs() {
|
|
18001
|
-
return
|
|
18108
|
+
return toOutputRefArray(this.componentDef.outputs);
|
|
18002
18109
|
}
|
|
18003
18110
|
/**
|
|
18004
18111
|
* @param componentDef The component definition.
|
|
@@ -18020,7 +18127,7 @@ class ComponentFactory extends ComponentFactory$1 {
|
|
|
18020
18127
|
const cmpDef = this.componentDef;
|
|
18021
18128
|
ngDevMode && verifyNotAnOrphanComponent(cmpDef);
|
|
18022
18129
|
const tAttributes = rootSelectorOrNode
|
|
18023
|
-
? ['ng-version', '19.2.0
|
|
18130
|
+
? ['ng-version', '19.2.0']
|
|
18024
18131
|
: // Extract attributes and classes from the first selector only to match VE behavior.
|
|
18025
18132
|
extractAttrsAndClassesFromSelector(this.componentDef.selectors[0]);
|
|
18026
18133
|
// Create the root view. Uses empty TView and ContentTemplate.
|
|
@@ -18109,29 +18216,24 @@ class ComponentRef extends ComponentRef$1 {
|
|
|
18109
18216
|
this.componentType = componentType;
|
|
18110
18217
|
}
|
|
18111
18218
|
setInput(name, value) {
|
|
18112
|
-
const
|
|
18113
|
-
|
|
18114
|
-
if
|
|
18115
|
-
|
|
18116
|
-
|
|
18117
|
-
|
|
18118
|
-
|
|
18119
|
-
Object.is(this.previousInputValues.get(name), value)) {
|
|
18120
|
-
return;
|
|
18121
|
-
}
|
|
18122
|
-
const lView = this._rootLView;
|
|
18123
|
-
setInputsForProperty(lView[TVIEW], lView, dataValue, name, value);
|
|
18124
|
-
this.previousInputValues.set(name, value);
|
|
18125
|
-
const childComponentLView = getComponentLViewByIndex(this._tNode.index, lView);
|
|
18126
|
-
markViewDirty(childComponentLView, 1 /* NotificationSource.SetInput */);
|
|
18219
|
+
const tNode = this._tNode;
|
|
18220
|
+
this.previousInputValues ??= new Map();
|
|
18221
|
+
// Do not set the input if it is the same as the last value
|
|
18222
|
+
// This behavior matches `bindingUpdated` when binding inputs in templates.
|
|
18223
|
+
if (this.previousInputValues.has(name) &&
|
|
18224
|
+
Object.is(this.previousInputValues.get(name), value)) {
|
|
18225
|
+
return;
|
|
18127
18226
|
}
|
|
18128
|
-
|
|
18129
|
-
|
|
18130
|
-
|
|
18131
|
-
|
|
18132
|
-
|
|
18133
|
-
|
|
18134
|
-
|
|
18227
|
+
const lView = this._rootLView;
|
|
18228
|
+
const hasSetInput = setAllInputsForProperty(tNode, lView[TVIEW], lView, name, value);
|
|
18229
|
+
this.previousInputValues.set(name, value);
|
|
18230
|
+
const childComponentLView = getComponentLViewByIndex(tNode.index, lView);
|
|
18231
|
+
markViewDirty(childComponentLView, 1 /* NotificationSource.SetInput */);
|
|
18232
|
+
if (ngDevMode && !hasSetInput) {
|
|
18233
|
+
const cmpNameForError = stringifyForError(this.componentType);
|
|
18234
|
+
let message = `Can't set value of the '${name}' input on the '${cmpNameForError}' component. `;
|
|
18235
|
+
message += `Make sure that the '${name}' property is annotated with @Input() or a mapped @Input('${name}') exists.`;
|
|
18236
|
+
reportUnknownPropertyError(message);
|
|
18135
18237
|
}
|
|
18136
18238
|
}
|
|
18137
18239
|
get injector() {
|
|
@@ -19893,7 +19995,74 @@ function ɵɵdefineNgModule(def) {
|
|
|
19893
19995
|
return res;
|
|
19894
19996
|
});
|
|
19895
19997
|
}
|
|
19896
|
-
|
|
19998
|
+
/**
|
|
19999
|
+
* Converts binding objects from the `DirectiveDefinition` into more efficient
|
|
20000
|
+
* lookup dictionaries that are optimized for the framework runtime.
|
|
20001
|
+
*
|
|
20002
|
+
* This function converts inputs or output directive information into new objects
|
|
20003
|
+
* where the public name conveniently maps to the minified internal field name.
|
|
20004
|
+
*
|
|
20005
|
+
* For inputs, the input flags are additionally persisted into the new data structure,
|
|
20006
|
+
* so that those can be quickly retrieved when needed.
|
|
20007
|
+
*
|
|
20008
|
+
* e.g. for
|
|
20009
|
+
*
|
|
20010
|
+
* ```ts
|
|
20011
|
+
* class Comp {
|
|
20012
|
+
* @Input()
|
|
20013
|
+
* propName1: string;
|
|
20014
|
+
*
|
|
20015
|
+
* @Input('publicName2')
|
|
20016
|
+
* declaredPropName2: number;
|
|
20017
|
+
*
|
|
20018
|
+
* inputSignal = input(3);
|
|
20019
|
+
* }
|
|
20020
|
+
* ```
|
|
20021
|
+
*
|
|
20022
|
+
* will be serialized as
|
|
20023
|
+
*
|
|
20024
|
+
* ```ts
|
|
20025
|
+
* {
|
|
20026
|
+
* propName1: 'propName1',
|
|
20027
|
+
* declaredPropName2: ['publicName2', 'declaredPropName2'],
|
|
20028
|
+
* inputSignal: [InputFlags.SignalBased, 'inputSignal'],
|
|
20029
|
+
* }
|
|
20030
|
+
* ```
|
|
20031
|
+
*
|
|
20032
|
+
* which is than translated by the minifier as:
|
|
20033
|
+
*
|
|
20034
|
+
* ```ts
|
|
20035
|
+
* {
|
|
20036
|
+
* minifiedPropName1: 'propName1',
|
|
20037
|
+
* minifiedPropName2: ['publicName2', 'declaredPropName2'],
|
|
20038
|
+
* minifiedInputSignal: [InputFlags.SignalBased, 'inputSignal'],
|
|
20039
|
+
* }
|
|
20040
|
+
* ```
|
|
20041
|
+
*
|
|
20042
|
+
* becomes: (public name => minifiedName + isSignal if needed)
|
|
20043
|
+
*
|
|
20044
|
+
* ```ts
|
|
20045
|
+
* {
|
|
20046
|
+
* 'propName1': 'minifiedPropName1',
|
|
20047
|
+
* 'publicName2': 'minifiedPropName2',
|
|
20048
|
+
* 'inputSignal': ['minifiedInputSignal', InputFlags.SignalBased],
|
|
20049
|
+
* }
|
|
20050
|
+
* ```
|
|
20051
|
+
*
|
|
20052
|
+
* Optionally the function can take `declaredInputs` which will result
|
|
20053
|
+
* in: (public name => declared name)
|
|
20054
|
+
*
|
|
20055
|
+
* ```ts
|
|
20056
|
+
* {
|
|
20057
|
+
* 'propName1': 'propName1',
|
|
20058
|
+
* 'publicName2': 'declaredPropName2',
|
|
20059
|
+
* 'inputSignal': 'inputSignal',
|
|
20060
|
+
* }
|
|
20061
|
+
* ```
|
|
20062
|
+
*
|
|
20063
|
+
|
|
20064
|
+
*/
|
|
20065
|
+
function parseAndConvertInputsForDefinition(obj, declaredInputs) {
|
|
19897
20066
|
if (obj == null)
|
|
19898
20067
|
return EMPTY_OBJ;
|
|
19899
20068
|
const newLookup = {};
|
|
@@ -19902,26 +20071,33 @@ function parseAndConvertBindingsForDefinition(obj, declaredInputs) {
|
|
|
19902
20071
|
const value = obj[minifiedKey];
|
|
19903
20072
|
let publicName;
|
|
19904
20073
|
let declaredName;
|
|
19905
|
-
let inputFlags
|
|
20074
|
+
let inputFlags;
|
|
20075
|
+
let transform;
|
|
19906
20076
|
if (Array.isArray(value)) {
|
|
19907
20077
|
inputFlags = value[0];
|
|
19908
20078
|
publicName = value[1];
|
|
19909
20079
|
declaredName = value[2] ?? publicName; // declared name might not be set to save bytes.
|
|
20080
|
+
transform = value[3] || null;
|
|
19910
20081
|
}
|
|
19911
20082
|
else {
|
|
19912
20083
|
publicName = value;
|
|
19913
20084
|
declaredName = value;
|
|
20085
|
+
inputFlags = InputFlags.None;
|
|
20086
|
+
transform = null;
|
|
19914
20087
|
}
|
|
19915
|
-
|
|
19916
|
-
|
|
19917
|
-
|
|
19918
|
-
|
|
19919
|
-
|
|
19920
|
-
|
|
19921
|
-
|
|
19922
|
-
|
|
19923
|
-
|
|
19924
|
-
|
|
20088
|
+
newLookup[publicName] = [minifiedKey, inputFlags, transform];
|
|
20089
|
+
declaredInputs[publicName] = declaredName;
|
|
20090
|
+
}
|
|
20091
|
+
}
|
|
20092
|
+
return newLookup;
|
|
20093
|
+
}
|
|
20094
|
+
function parseAndConvertOutputsForDefinition(obj) {
|
|
20095
|
+
if (obj == null)
|
|
20096
|
+
return EMPTY_OBJ;
|
|
20097
|
+
const newLookup = {};
|
|
20098
|
+
for (const minifiedKey in obj) {
|
|
20099
|
+
if (obj.hasOwnProperty(minifiedKey)) {
|
|
20100
|
+
newLookup[obj[minifiedKey]] = minifiedKey;
|
|
19925
20101
|
}
|
|
19926
20102
|
}
|
|
19927
20103
|
return newLookup;
|
|
@@ -19986,7 +20162,6 @@ function getNgDirectiveDef(directiveDefinition) {
|
|
|
19986
20162
|
hostAttrs: directiveDefinition.hostAttrs || null,
|
|
19987
20163
|
contentQueries: directiveDefinition.contentQueries || null,
|
|
19988
20164
|
declaredInputs: declaredInputs,
|
|
19989
|
-
inputTransforms: null,
|
|
19990
20165
|
inputConfig: directiveDefinition.inputs || EMPTY_OBJ,
|
|
19991
20166
|
exportAs: directiveDefinition.exportAs || null,
|
|
19992
20167
|
standalone: directiveDefinition.standalone ?? true,
|
|
@@ -19997,8 +20172,8 @@ function getNgDirectiveDef(directiveDefinition) {
|
|
|
19997
20172
|
setInput: null,
|
|
19998
20173
|
findHostDirectiveDefs: null,
|
|
19999
20174
|
hostDirectives: null,
|
|
20000
|
-
inputs:
|
|
20001
|
-
outputs:
|
|
20175
|
+
inputs: parseAndConvertInputsForDefinition(directiveDefinition.inputs, declaredInputs),
|
|
20176
|
+
outputs: parseAndConvertOutputsForDefinition(directiveDefinition.outputs),
|
|
20002
20177
|
debugInfo: null,
|
|
20003
20178
|
};
|
|
20004
20179
|
}
|
|
@@ -20127,7 +20302,6 @@ function ɵɵInheritDefinitionFeature(definition) {
|
|
|
20127
20302
|
// would've justified object creation. Unwrap them if necessary.
|
|
20128
20303
|
const writeableDef = definition;
|
|
20129
20304
|
writeableDef.inputs = maybeUnwrapEmpty(definition.inputs);
|
|
20130
|
-
writeableDef.inputTransforms = maybeUnwrapEmpty(definition.inputTransforms);
|
|
20131
20305
|
writeableDef.declaredInputs = maybeUnwrapEmpty(definition.declaredInputs);
|
|
20132
20306
|
writeableDef.outputs = maybeUnwrapEmpty(definition.outputs);
|
|
20133
20307
|
// Merge hostBindings
|
|
@@ -20184,23 +20358,9 @@ function mergeInputsWithTransforms(target, source) {
|
|
|
20184
20358
|
continue;
|
|
20185
20359
|
}
|
|
20186
20360
|
const value = source.inputs[key];
|
|
20187
|
-
if (value
|
|
20188
|
-
|
|
20189
|
-
|
|
20190
|
-
target.inputs[key] = value;
|
|
20191
|
-
target.declaredInputs[key] = source.declaredInputs[key];
|
|
20192
|
-
// If the input is inherited, and we have a transform for it, we also inherit it.
|
|
20193
|
-
// Note that transforms should not be inherited if the input has its own metadata
|
|
20194
|
-
// in the `source` directive itself already (i.e. the input is re-declared/overridden).
|
|
20195
|
-
if (source.inputTransforms !== null) {
|
|
20196
|
-
// Note: transforms are stored with their minified names.
|
|
20197
|
-
// Perf: only access the minified name when there are source transforms.
|
|
20198
|
-
const minifiedName = Array.isArray(value) ? value[0] : value;
|
|
20199
|
-
if (!source.inputTransforms.hasOwnProperty(minifiedName)) {
|
|
20200
|
-
continue;
|
|
20201
|
-
}
|
|
20202
|
-
target.inputTransforms ??= {};
|
|
20203
|
-
target.inputTransforms[minifiedName] = source.inputTransforms[minifiedName];
|
|
20361
|
+
if (value !== undefined) {
|
|
20362
|
+
target.inputs[key] = value;
|
|
20363
|
+
target.declaredInputs[key] = source.declaredInputs[key];
|
|
20204
20364
|
}
|
|
20205
20365
|
}
|
|
20206
20366
|
}
|
|
@@ -20514,30 +20674,6 @@ function validateMappings(bindingType, def, hostDirectiveBindings) {
|
|
|
20514
20674
|
}
|
|
20515
20675
|
}
|
|
20516
20676
|
|
|
20517
|
-
/**
|
|
20518
|
-
* Decorates the directive definition with support for input transform functions.
|
|
20519
|
-
*
|
|
20520
|
-
* If the directive uses inheritance, the feature should be included before the
|
|
20521
|
-
* `InheritDefinitionFeature` to ensure that the `inputTransforms` field is populated.
|
|
20522
|
-
*
|
|
20523
|
-
* @codeGenApi
|
|
20524
|
-
*/
|
|
20525
|
-
function ɵɵInputTransformsFeature(definition) {
|
|
20526
|
-
const inputs = definition.inputConfig;
|
|
20527
|
-
const inputTransforms = {};
|
|
20528
|
-
for (const minifiedKey in inputs) {
|
|
20529
|
-
if (inputs.hasOwnProperty(minifiedKey)) {
|
|
20530
|
-
// Note: the private names are used for the keys, rather than the public ones, because public
|
|
20531
|
-
// names can be re-aliased in host directives which would invalidate the lookup.
|
|
20532
|
-
const value = inputs[minifiedKey];
|
|
20533
|
-
if (Array.isArray(value) && value[3]) {
|
|
20534
|
-
inputTransforms[minifiedKey] = value[3];
|
|
20535
|
-
}
|
|
20536
|
-
}
|
|
20537
|
-
}
|
|
20538
|
-
definition.inputTransforms = inputTransforms;
|
|
20539
|
-
}
|
|
20540
|
-
|
|
20541
20677
|
function isIterable(obj) {
|
|
20542
20678
|
return obj !== null && typeof obj === 'object' && obj[Symbol.iterator] !== undefined;
|
|
20543
20679
|
}
|
|
@@ -20719,7 +20855,7 @@ function declareTemplate(declarationLView, declarationTView, index, templateFn,
|
|
|
20719
20855
|
// In client-only mode, this function is a noop.
|
|
20720
20856
|
populateDehydratedViewsInLContainer(lContainer, tNode, declarationLView);
|
|
20721
20857
|
if (isDirectiveHost(tNode)) {
|
|
20722
|
-
|
|
20858
|
+
createDirectivesInstances(declarationTView, declarationLView, tNode);
|
|
20723
20859
|
}
|
|
20724
20860
|
if (localRefsIndex != null) {
|
|
20725
20861
|
saveResolvedLocalsInData(declarationLView, tNode, localRefExtractor);
|
|
@@ -21254,8 +21390,9 @@ function renderDeferBlockState(newState, tNode, lContainer, skipTimerScheduling
|
|
|
21254
21390
|
}
|
|
21255
21391
|
}
|
|
21256
21392
|
function findMatchingDehydratedViewForDeferBlock(lContainer, lDetails) {
|
|
21257
|
-
|
|
21258
|
-
|
|
21393
|
+
const dehydratedViewIx = lContainer[DEHYDRATED_VIEWS]?.findIndex((view) => view.data[DEFER_BLOCK_STATE$1] === lDetails[DEFER_BLOCK_STATE]) ?? -1;
|
|
21394
|
+
const dehydratedView = dehydratedViewIx > -1 ? lContainer[DEHYDRATED_VIEWS][dehydratedViewIx] : null;
|
|
21395
|
+
return { dehydratedView, dehydratedViewIx };
|
|
21259
21396
|
}
|
|
21260
21397
|
/**
|
|
21261
21398
|
* Applies changes to the DOM to reflect a given state.
|
|
@@ -21287,21 +21424,23 @@ function applyDeferBlockState(newState, lDetails, lContainer, tNode, hostLView)
|
|
|
21287
21424
|
injector = createDeferBlockInjector(hostLView[INJECTOR], tDetails, providers);
|
|
21288
21425
|
}
|
|
21289
21426
|
}
|
|
21290
|
-
const dehydratedView = findMatchingDehydratedViewForDeferBlock(lContainer, lDetails);
|
|
21291
|
-
// Erase dehydrated view info, so that it's not removed later
|
|
21292
|
-
// by post-hydration cleanup process.
|
|
21293
|
-
lContainer[DEHYDRATED_VIEWS] = null;
|
|
21427
|
+
const { dehydratedView, dehydratedViewIx } = findMatchingDehydratedViewForDeferBlock(lContainer, lDetails);
|
|
21294
21428
|
const embeddedLView = createAndRenderEmbeddedLView(hostLView, activeBlockTNode, null, {
|
|
21295
21429
|
injector,
|
|
21296
21430
|
dehydratedView,
|
|
21297
21431
|
});
|
|
21298
21432
|
addLViewToLContainer(lContainer, embeddedLView, viewIndex, shouldAddViewToDom(activeBlockTNode, dehydratedView));
|
|
21299
21433
|
markViewDirty(embeddedLView, 2 /* NotificationSource.DeferBlockStateUpdate */);
|
|
21300
|
-
|
|
21301
|
-
|
|
21302
|
-
|
|
21303
|
-
|
|
21304
|
-
|
|
21434
|
+
if (dehydratedViewIx > -1) {
|
|
21435
|
+
// Erase dehydrated view info in a given LContainer, so that the view is not
|
|
21436
|
+
// removed later by post-hydration cleanup process (which iterates over all
|
|
21437
|
+
// dehydrated views in component tree). This clears only the dehydrated view
|
|
21438
|
+
// that was found for this render, which in most cases will be the only view.
|
|
21439
|
+
// In the case that there was control flow that changed, there may be either
|
|
21440
|
+
// more than one or the views would not match up due to the server rendered
|
|
21441
|
+
// content being a different branch of the control flow.
|
|
21442
|
+
lContainer[DEHYDRATED_VIEWS]?.splice(dehydratedViewIx, 1);
|
|
21443
|
+
}
|
|
21305
21444
|
if ((newState === DeferBlockState.Complete || newState === DeferBlockState.Error) &&
|
|
21306
21445
|
Array.isArray(lDetails[ON_COMPLETE_FNS])) {
|
|
21307
21446
|
for (const callback of lDetails[ON_COMPLETE_FNS]) {
|
|
@@ -24150,16 +24289,36 @@ async function triggerHydrationFromBlockName(injector, blockName, replayQueuedEv
|
|
|
24150
24289
|
await parentBlockPromise;
|
|
24151
24290
|
}
|
|
24152
24291
|
// Actually do the triggering and hydration of the queue of blocks
|
|
24153
|
-
for (
|
|
24154
|
-
|
|
24155
|
-
|
|
24156
|
-
|
|
24157
|
-
|
|
24158
|
-
|
|
24159
|
-
|
|
24160
|
-
|
|
24161
|
-
|
|
24162
|
-
|
|
24292
|
+
for (let blockQueueIdx = 0; blockQueueIdx < hydrationQueue.length; blockQueueIdx++) {
|
|
24293
|
+
const dehydratedBlockId = hydrationQueue[blockQueueIdx];
|
|
24294
|
+
const dehydratedDeferBlock = dehydratedBlockRegistry.get(dehydratedBlockId);
|
|
24295
|
+
if (dehydratedDeferBlock != null) {
|
|
24296
|
+
// trigger the block resources and await next render for hydration. This should result
|
|
24297
|
+
// in the next block ɵɵdefer instruction being called and that block being added to the dehydrated registry.
|
|
24298
|
+
await triggerResourceLoadingForHydration(dehydratedDeferBlock);
|
|
24299
|
+
await nextRender(injector);
|
|
24300
|
+
// if the content has changed since server rendering, we need to check for the expected block
|
|
24301
|
+
// being in the registry or if errors occurred. In that case, we need to clean up the remaining expected
|
|
24302
|
+
// content that won't be rendered or fetched.
|
|
24303
|
+
if (deferBlockHasErrored(dehydratedDeferBlock)) {
|
|
24304
|
+
// Either the expected block has not yet had its ɵɵdefer instruction called or the block errored out when fetching
|
|
24305
|
+
// resources. In the former case, either we're hydrating too soon or the client and server differ. In both cases,
|
|
24306
|
+
// we need to clean up child content and promises.
|
|
24307
|
+
removeDehydratedViewList(dehydratedDeferBlock);
|
|
24308
|
+
cleanupRemainingHydrationQueue(hydrationQueue.slice(blockQueueIdx), dehydratedBlockRegistry);
|
|
24309
|
+
break;
|
|
24310
|
+
}
|
|
24311
|
+
// The defer block has not errored and we've finished fetching resources and rendering.
|
|
24312
|
+
// At this point it is safe to resolve the hydration promise.
|
|
24313
|
+
blocksBeingHydrated.get(dehydratedBlockId).resolve();
|
|
24314
|
+
}
|
|
24315
|
+
else {
|
|
24316
|
+
// The expected block has not yet had its ɵɵdefer instruction called. This is likely due to content changing between
|
|
24317
|
+
// client and server. We need to clean up the dehydrated DOM in the container since it no longer is valid.
|
|
24318
|
+
cleanupParentContainer(blockQueueIdx, hydrationQueue, dehydratedBlockRegistry);
|
|
24319
|
+
cleanupRemainingHydrationQueue(hydrationQueue.slice(blockQueueIdx), dehydratedBlockRegistry);
|
|
24320
|
+
break;
|
|
24321
|
+
}
|
|
24163
24322
|
}
|
|
24164
24323
|
// Await hydration completion for the requested block.
|
|
24165
24324
|
await blocksBeingHydrated.get(blockName)?.promise;
|
|
@@ -24172,6 +24331,33 @@ async function triggerHydrationFromBlockName(injector, blockName, replayQueuedEv
|
|
|
24172
24331
|
// Cleanup after hydration of all affected defer blocks.
|
|
24173
24332
|
cleanupHydratedDeferBlocks(dehydratedBlockRegistry.get(blockName), hydrationQueue, dehydratedBlockRegistry, injector.get(ApplicationRef));
|
|
24174
24333
|
}
|
|
24334
|
+
function deferBlockHasErrored(deferBlock) {
|
|
24335
|
+
return (getLDeferBlockDetails(deferBlock.lView, deferBlock.tNode)[DEFER_BLOCK_STATE] ===
|
|
24336
|
+
DeferBlockState.Error);
|
|
24337
|
+
}
|
|
24338
|
+
/**
|
|
24339
|
+
* Clean up the parent container of a block where content changed between server and client.
|
|
24340
|
+
* The parent of a block going through `triggerHydrationFromBlockName` will contain the
|
|
24341
|
+
* dehydrated content that needs to be cleaned up. So we have to do the clean up from that location
|
|
24342
|
+
* in the tree.
|
|
24343
|
+
*/
|
|
24344
|
+
function cleanupParentContainer(currentBlockIdx, hydrationQueue, dehydratedBlockRegistry) {
|
|
24345
|
+
// If a parent block exists, it's in the hydration queue in front of the current block.
|
|
24346
|
+
const parentDeferBlockIdx = currentBlockIdx - 1;
|
|
24347
|
+
const parentDeferBlock = parentDeferBlockIdx > -1
|
|
24348
|
+
? dehydratedBlockRegistry.get(hydrationQueue[parentDeferBlockIdx])
|
|
24349
|
+
: null;
|
|
24350
|
+
if (parentDeferBlock) {
|
|
24351
|
+
cleanupLContainer(parentDeferBlock.lContainer);
|
|
24352
|
+
}
|
|
24353
|
+
}
|
|
24354
|
+
function cleanupRemainingHydrationQueue(hydrationQueue, dehydratedBlockRegistry) {
|
|
24355
|
+
const blocksBeingHydrated = dehydratedBlockRegistry.hydrating;
|
|
24356
|
+
for (const dehydratedBlockId in hydrationQueue) {
|
|
24357
|
+
blocksBeingHydrated.get(dehydratedBlockId)?.reject();
|
|
24358
|
+
}
|
|
24359
|
+
dehydratedBlockRegistry.cleanup(hydrationQueue);
|
|
24360
|
+
}
|
|
24175
24361
|
/**
|
|
24176
24362
|
* Generates a new promise for every defer block in the hydrating queue
|
|
24177
24363
|
*/
|
|
@@ -24184,18 +24370,8 @@ function populateHydratingStateForQueue(registry, queue) {
|
|
|
24184
24370
|
function nextRender(injector) {
|
|
24185
24371
|
return new Promise((resolveFn) => afterNextRender(resolveFn, { injector }));
|
|
24186
24372
|
}
|
|
24187
|
-
async function triggerResourceLoadingForHydration(
|
|
24188
|
-
const
|
|
24189
|
-
// Since we trigger hydration for nested defer blocks in a sequence (parent -> child),
|
|
24190
|
-
// there is a chance that a defer block may not be present at hydration time. For example,
|
|
24191
|
-
// when a nested block was in an `@if` condition, which has changed.
|
|
24192
|
-
if (deferBlock === null) {
|
|
24193
|
-
// TODO(incremental-hydration): handle the cleanup for cases when
|
|
24194
|
-
// defer block is no longer present during hydration (e.g. `@if` condition
|
|
24195
|
-
// has changed during hydration/rendering).
|
|
24196
|
-
return;
|
|
24197
|
-
}
|
|
24198
|
-
const { tNode, lView } = deferBlock;
|
|
24373
|
+
async function triggerResourceLoadingForHydration(dehydratedBlock) {
|
|
24374
|
+
const { tNode, lView } = dehydratedBlock;
|
|
24199
24375
|
const lDetails = getLDeferBlockDetails(lView, tNode);
|
|
24200
24376
|
return new Promise((resolve) => {
|
|
24201
24377
|
onDeferBlockCompletion(lDetails, resolve);
|
|
@@ -26248,10 +26424,8 @@ function ɵɵproperty(propName, value, sanitizer) {
|
|
|
26248
26424
|
* directive input.
|
|
26249
26425
|
*/
|
|
26250
26426
|
function setDirectiveInputsWhichShadowsStyling(tView, tNode, lView, value, isClassBased) {
|
|
26251
|
-
const inputs = tNode.inputs;
|
|
26252
|
-
const property = isClassBased ? 'class' : 'style';
|
|
26253
26427
|
// We support both 'class' and `className` hence the fallback.
|
|
26254
|
-
|
|
26428
|
+
setAllInputsForProperty(tNode, tView, lView, isClassBased ? 'class' : 'style', value);
|
|
26255
26429
|
}
|
|
26256
26430
|
|
|
26257
26431
|
/**
|
|
@@ -28075,12 +28249,12 @@ function ɵɵelementStart(index, name, attrsIndex, localRefsIndex) {
|
|
|
28075
28249
|
// any immediate children of a component or template container must be pre-emptively
|
|
28076
28250
|
// monkey-patched with the component view data so that the element can be inspected
|
|
28077
28251
|
// later on using any element discovery utility methods (see `element_discovery.ts`)
|
|
28078
|
-
if (getElementDepthCount() === 0) {
|
|
28252
|
+
if (getElementDepthCount() === 0 || hasDirectives) {
|
|
28079
28253
|
attachPatchData(native, lView);
|
|
28080
28254
|
}
|
|
28081
28255
|
increaseElementDepthCount();
|
|
28082
28256
|
if (hasDirectives) {
|
|
28083
|
-
|
|
28257
|
+
createDirectivesInstances(tView, lView, tNode);
|
|
28084
28258
|
executeContentQueries(tView, tNode, lView);
|
|
28085
28259
|
}
|
|
28086
28260
|
if (localRefsIndex !== null) {
|
|
@@ -28252,7 +28426,7 @@ function ɵɵelementContainerStart(index, attrsIndex, localRefsIndex) {
|
|
|
28252
28426
|
}
|
|
28253
28427
|
attachPatchData(comment, lView);
|
|
28254
28428
|
if (isDirectiveHost(tNode)) {
|
|
28255
|
-
|
|
28429
|
+
createDirectivesInstances(tView, lView, tNode);
|
|
28256
28430
|
executeContentQueries(tView, tNode, lView);
|
|
28257
28431
|
}
|
|
28258
28432
|
if (localRefsIndex != null) {
|
|
@@ -30307,7 +30481,7 @@ function findExistingListener(tView, lView, eventName, tNodeIdx) {
|
|
|
30307
30481
|
function listenerInternal(tView, lView, renderer, tNode, eventName, listenerFn, eventTargetResolver) {
|
|
30308
30482
|
const isTNodeDirectiveHost = isDirectiveHost(tNode);
|
|
30309
30483
|
const firstCreatePass = tView.firstCreatePass;
|
|
30310
|
-
const tCleanup = firstCreatePass
|
|
30484
|
+
const tCleanup = firstCreatePass ? getOrCreateTViewCleanup(tView) : null;
|
|
30311
30485
|
const context = lView[CONTEXT];
|
|
30312
30486
|
// When the ɵɵlistener instruction was generated and is executed we know that there is either a
|
|
30313
30487
|
// native listener or a directive output on this element. As such we we know that we will have to
|
|
@@ -30372,29 +30546,37 @@ function listenerInternal(tView, lView, renderer, tNode, eventName, listenerFn,
|
|
|
30372
30546
|
// ancestors are marked dirty when an event occurs.
|
|
30373
30547
|
listenerFn = wrapListener(tNode, lView, context, listenerFn);
|
|
30374
30548
|
}
|
|
30375
|
-
|
|
30376
|
-
|
|
30377
|
-
|
|
30378
|
-
|
|
30379
|
-
|
|
30380
|
-
|
|
30381
|
-
|
|
30382
|
-
|
|
30383
|
-
|
|
30384
|
-
|
|
30385
|
-
|
|
30386
|
-
|
|
30387
|
-
|
|
30388
|
-
throw new Error(`@Output ${minifiedName} not initialized in '${directiveInstance.constructor.name}'.`);
|
|
30389
|
-
}
|
|
30390
|
-
const subscription = output.subscribe(listenerFn);
|
|
30391
|
-
const idx = lCleanup.length;
|
|
30392
|
-
lCleanup.push(listenerFn, subscription);
|
|
30393
|
-
tCleanup && tCleanup.push(eventName, tNode.index, idx, -(idx + 1));
|
|
30549
|
+
if (processOutputs) {
|
|
30550
|
+
const outputConfig = tNode.outputs?.[eventName];
|
|
30551
|
+
const hostDirectiveOutputConfig = tNode.hostDirectiveOutputs?.[eventName];
|
|
30552
|
+
if (hostDirectiveOutputConfig && hostDirectiveOutputConfig.length) {
|
|
30553
|
+
for (let i = 0; i < hostDirectiveOutputConfig.length; i += 2) {
|
|
30554
|
+
const index = hostDirectiveOutputConfig[i];
|
|
30555
|
+
const lookupName = hostDirectiveOutputConfig[i + 1];
|
|
30556
|
+
listenToOutput(tNode, tView, lView, index, lookupName, eventName, listenerFn, lCleanup, tCleanup);
|
|
30557
|
+
}
|
|
30558
|
+
}
|
|
30559
|
+
if (outputConfig && outputConfig.length) {
|
|
30560
|
+
for (const index of outputConfig) {
|
|
30561
|
+
listenToOutput(tNode, tView, lView, index, eventName, eventName, listenerFn, lCleanup, tCleanup);
|
|
30394
30562
|
}
|
|
30395
30563
|
}
|
|
30396
30564
|
}
|
|
30397
30565
|
}
|
|
30566
|
+
function listenToOutput(tNode, tView, lView, index, lookupName, eventName, listenerFn, lCleanup, tCleanup) {
|
|
30567
|
+
ngDevMode && assertIndexInRange(lView, index);
|
|
30568
|
+
const instance = lView[index];
|
|
30569
|
+
const def = tView.data[index];
|
|
30570
|
+
const propertyName = def.outputs[lookupName];
|
|
30571
|
+
const output = instance[propertyName];
|
|
30572
|
+
if (ngDevMode && !isOutputSubscribable(output)) {
|
|
30573
|
+
throw new Error(`@Output ${propertyName} not initialized in '${instance.constructor.name}'.`);
|
|
30574
|
+
}
|
|
30575
|
+
const subscription = output.subscribe(listenerFn);
|
|
30576
|
+
const idx = lCleanup.length;
|
|
30577
|
+
lCleanup.push(listenerFn, subscription);
|
|
30578
|
+
tCleanup && tCleanup.push(eventName, tNode.index, idx, -(idx + 1));
|
|
30579
|
+
}
|
|
30398
30580
|
function executeListenerWithErrorHandling(lView, context, listenerFn, e) {
|
|
30399
30581
|
const prevConsumer = setActiveConsumer$1(null);
|
|
30400
30582
|
try {
|
|
@@ -33558,11 +33740,12 @@ function executeWithInvalidateFallback(importMeta, id, callback) {
|
|
|
33558
33740
|
callback();
|
|
33559
33741
|
}
|
|
33560
33742
|
catch (e) {
|
|
33561
|
-
const
|
|
33743
|
+
const error = e;
|
|
33562
33744
|
// If we have all the necessary information and APIs to send off the invalidation
|
|
33563
33745
|
// request, send it before rethrowing so the dev server can decide what to do.
|
|
33564
|
-
if (id !== null &&
|
|
33565
|
-
|
|
33746
|
+
if (id !== null && error.message) {
|
|
33747
|
+
const toLog = error.message + (error.stack ? '\n' + error.stack : '');
|
|
33748
|
+
importMeta?.hot?.send?.('angular:invalidate', { id, message: toLog, error: true });
|
|
33566
33749
|
}
|
|
33567
33750
|
// Throw the error in case the page doesn't get refreshed.
|
|
33568
33751
|
throw e;
|
|
@@ -33654,7 +33837,6 @@ const angularCoreEnv = (() => ({
|
|
|
33654
33837
|
'ɵɵProvidersFeature': ɵɵProvidersFeature,
|
|
33655
33838
|
'ɵɵCopyDefinitionFeature': ɵɵCopyDefinitionFeature,
|
|
33656
33839
|
'ɵɵInheritDefinitionFeature': ɵɵInheritDefinitionFeature,
|
|
33657
|
-
'ɵɵInputTransformsFeature': ɵɵInputTransformsFeature,
|
|
33658
33840
|
'ɵɵExternalStylesFeature': ɵɵExternalStylesFeature,
|
|
33659
33841
|
'ɵɵnextContext': ɵɵnextContext,
|
|
33660
33842
|
'ɵɵnamespaceHTML': ɵɵnamespaceHTML,
|
|
@@ -34993,7 +35175,7 @@ class Version {
|
|
|
34993
35175
|
/**
|
|
34994
35176
|
* @publicApi
|
|
34995
35177
|
*/
|
|
34996
|
-
const VERSION = new Version('19.2.0
|
|
35178
|
+
const VERSION = new Version('19.2.0');
|
|
34997
35179
|
|
|
34998
35180
|
/**
|
|
34999
35181
|
* Combination of NgModuleFactory and ComponentFactories.
|
|
@@ -35827,10 +36009,9 @@ class ImagePerformanceWarning {
|
|
|
35827
36009
|
window = null;
|
|
35828
36010
|
observer = null;
|
|
35829
36011
|
options = inject(IMAGE_CONFIG);
|
|
35830
|
-
isBrowser = inject(PLATFORM_ID) === 'browser';
|
|
35831
36012
|
lcpImageUrl;
|
|
35832
36013
|
start() {
|
|
35833
|
-
if (
|
|
36014
|
+
if ((typeof ngServerMode !== 'undefined' && ngServerMode) ||
|
|
35834
36015
|
typeof PerformanceObserver === 'undefined' ||
|
|
35835
36016
|
(this.options?.disableImageSizeWarning && this.options?.disableImageLazyLoadWarning)) {
|
|
35836
36017
|
return;
|
|
@@ -35838,7 +36019,7 @@ class ImagePerformanceWarning {
|
|
|
35838
36019
|
this.observer = this.initPerformanceObserver();
|
|
35839
36020
|
const doc = getDocument();
|
|
35840
36021
|
const win = doc.defaultView;
|
|
35841
|
-
if (
|
|
36022
|
+
if (win) {
|
|
35842
36023
|
this.window = win;
|
|
35843
36024
|
// Wait to avoid race conditions where LCP image triggers
|
|
35844
36025
|
// load event before it's recorded by the performance observer
|
|
@@ -38840,8 +39021,8 @@ function defaultThrowError() {
|
|
|
38840
39021
|
throw new Error();
|
|
38841
39022
|
}
|
|
38842
39023
|
let throwInvalidWriteToSignalErrorFn = defaultThrowError;
|
|
38843
|
-
function throwInvalidWriteToSignalError() {
|
|
38844
|
-
throwInvalidWriteToSignalErrorFn();
|
|
39024
|
+
function throwInvalidWriteToSignalError(node) {
|
|
39025
|
+
throwInvalidWriteToSignalErrorFn(node);
|
|
38845
39026
|
}
|
|
38846
39027
|
function setThrowInvalidWriteToSignalError(fn) {
|
|
38847
39028
|
throwInvalidWriteToSignalErrorFn = fn;
|
|
@@ -38878,7 +39059,7 @@ function signalGetFn() {
|
|
|
38878
39059
|
}
|
|
38879
39060
|
function signalSetFn(node, newValue) {
|
|
38880
39061
|
if (!producerUpdatesAllowed()) {
|
|
38881
|
-
throwInvalidWriteToSignalError();
|
|
39062
|
+
throwInvalidWriteToSignalError(node);
|
|
38882
39063
|
}
|
|
38883
39064
|
if (!node.equal(node.value, newValue)) {
|
|
38884
39065
|
node.value = newValue;
|
|
@@ -38887,7 +39068,7 @@ function signalSetFn(node, newValue) {
|
|
|
38887
39068
|
}
|
|
38888
39069
|
function signalUpdateFn(node, updater) {
|
|
38889
39070
|
if (!producerUpdatesAllowed()) {
|
|
38890
|
-
throwInvalidWriteToSignalError();
|
|
39071
|
+
throwInvalidWriteToSignalError(node);
|
|
38891
39072
|
}
|
|
38892
39073
|
signalSetFn(node, updater(node.value));
|
|
38893
39074
|
}
|
|
@@ -40423,182 +40604,26 @@ function disableProfiling() {
|
|
|
40423
40604
|
enablePerfLogging = false;
|
|
40424
40605
|
}
|
|
40425
40606
|
|
|
40426
|
-
/*!
|
|
40427
|
-
* @license
|
|
40428
|
-
* Copyright Google LLC All Rights Reserved.
|
|
40429
|
-
*
|
|
40430
|
-
* Use of this source code is governed by an MIT-style license that can be
|
|
40431
|
-
* found in the LICENSE file at https://angular.dev/license
|
|
40432
|
-
*/
|
|
40433
40607
|
/**
|
|
40434
|
-
*
|
|
40435
|
-
*
|
|
40436
|
-
* consumer of the function is responsible for resolving the minified name to its original name.
|
|
40437
|
-
* @param node Node from which to start the search.
|
|
40608
|
+
* Execute an arbitrary function in a non-reactive (non-tracking) context. The executed function
|
|
40609
|
+
* can, optionally, return a value.
|
|
40438
40610
|
*/
|
|
40439
|
-
function
|
|
40440
|
-
|
|
40441
|
-
|
|
40442
|
-
|
|
40443
|
-
|
|
40444
|
-
|
|
40445
|
-
const current = lView[i];
|
|
40446
|
-
if ((!isLView(current) && !isLContainer(current)) || current[HOST] !== currentNode) {
|
|
40447
|
-
continue;
|
|
40448
|
-
}
|
|
40449
|
-
const tView = lView[TVIEW];
|
|
40450
|
-
const tNode = getTNode(tView, i);
|
|
40451
|
-
if (isComponentHost(tNode)) {
|
|
40452
|
-
const def = tView.data[tNode.directiveStart + tNode.componentOffset];
|
|
40453
|
-
const name = def.debugInfo?.className || def.type.name;
|
|
40454
|
-
// Note: the name may be an empty string if the class name is
|
|
40455
|
-
// dropped due to minification. In such cases keep going up the tree.
|
|
40456
|
-
if (name) {
|
|
40457
|
-
return name;
|
|
40458
|
-
}
|
|
40459
|
-
else {
|
|
40460
|
-
break;
|
|
40461
|
-
}
|
|
40462
|
-
}
|
|
40463
|
-
}
|
|
40464
|
-
}
|
|
40465
|
-
currentNode = currentNode.parentNode;
|
|
40611
|
+
function untracked(nonReactiveReadsFn) {
|
|
40612
|
+
const prevConsumer = setActiveConsumer$1(null);
|
|
40613
|
+
// We are not trying to catch any particular errors here, just making sure that the consumers
|
|
40614
|
+
// stack is restored in case of errors.
|
|
40615
|
+
try {
|
|
40616
|
+
return nonReactiveReadsFn();
|
|
40466
40617
|
}
|
|
40467
|
-
|
|
40468
|
-
|
|
40469
|
-
|
|
40470
|
-
/**
|
|
40471
|
-
* Compiles a partial directive declaration object into a full directive definition object.
|
|
40472
|
-
*
|
|
40473
|
-
* @codeGenApi
|
|
40474
|
-
*/
|
|
40475
|
-
function ɵɵngDeclareDirective(decl) {
|
|
40476
|
-
const compiler = getCompilerFacade({
|
|
40477
|
-
usage: 1 /* JitCompilerUsage.PartialDeclaration */,
|
|
40478
|
-
kind: 'directive',
|
|
40479
|
-
type: decl.type,
|
|
40480
|
-
});
|
|
40481
|
-
return compiler.compileDirectiveDeclaration(angularCoreEnv, `ng:///${decl.type.name}/ɵfac.js`, decl);
|
|
40482
|
-
}
|
|
40483
|
-
/**
|
|
40484
|
-
* Evaluates the class metadata declaration.
|
|
40485
|
-
*
|
|
40486
|
-
* @codeGenApi
|
|
40487
|
-
*/
|
|
40488
|
-
function ɵɵngDeclareClassMetadata(decl) {
|
|
40489
|
-
setClassMetadata(decl.type, decl.decorators, decl.ctorParameters ?? null, decl.propDecorators ?? null);
|
|
40490
|
-
}
|
|
40491
|
-
/**
|
|
40492
|
-
* Evaluates the class metadata of a component that contains deferred blocks.
|
|
40493
|
-
*
|
|
40494
|
-
* @codeGenApi
|
|
40495
|
-
*/
|
|
40496
|
-
function ɵɵngDeclareClassMetadataAsync(decl) {
|
|
40497
|
-
setClassMetadataAsync(decl.type, decl.resolveDeferredDeps, (...types) => {
|
|
40498
|
-
const meta = decl.resolveMetadata(...types);
|
|
40499
|
-
setClassMetadata(decl.type, meta.decorators, meta.ctorParameters, meta.propDecorators);
|
|
40500
|
-
});
|
|
40501
|
-
}
|
|
40502
|
-
/**
|
|
40503
|
-
* Compiles a partial component declaration object into a full component definition object.
|
|
40504
|
-
*
|
|
40505
|
-
* @codeGenApi
|
|
40506
|
-
*/
|
|
40507
|
-
function ɵɵngDeclareComponent(decl) {
|
|
40508
|
-
const compiler = getCompilerFacade({
|
|
40509
|
-
usage: 1 /* JitCompilerUsage.PartialDeclaration */,
|
|
40510
|
-
kind: 'component',
|
|
40511
|
-
type: decl.type,
|
|
40512
|
-
});
|
|
40513
|
-
return compiler.compileComponentDeclaration(angularCoreEnv, `ng:///${decl.type.name}/ɵcmp.js`, decl);
|
|
40514
|
-
}
|
|
40515
|
-
/**
|
|
40516
|
-
* Compiles a partial pipe declaration object into a full pipe definition object.
|
|
40517
|
-
*
|
|
40518
|
-
* @codeGenApi
|
|
40519
|
-
*/
|
|
40520
|
-
function ɵɵngDeclareFactory(decl) {
|
|
40521
|
-
const compiler = getCompilerFacade({
|
|
40522
|
-
usage: 1 /* JitCompilerUsage.PartialDeclaration */,
|
|
40523
|
-
kind: getFactoryKind(decl.target),
|
|
40524
|
-
type: decl.type,
|
|
40525
|
-
});
|
|
40526
|
-
return compiler.compileFactoryDeclaration(angularCoreEnv, `ng:///${decl.type.name}/ɵfac.js`, decl);
|
|
40527
|
-
}
|
|
40528
|
-
function getFactoryKind(target) {
|
|
40529
|
-
switch (target) {
|
|
40530
|
-
case FactoryTarget.Directive:
|
|
40531
|
-
return 'directive';
|
|
40532
|
-
case FactoryTarget.Component:
|
|
40533
|
-
return 'component';
|
|
40534
|
-
case FactoryTarget.Injectable:
|
|
40535
|
-
return 'injectable';
|
|
40536
|
-
case FactoryTarget.Pipe:
|
|
40537
|
-
return 'pipe';
|
|
40538
|
-
case FactoryTarget.NgModule:
|
|
40539
|
-
return 'NgModule';
|
|
40618
|
+
finally {
|
|
40619
|
+
setActiveConsumer$1(prevConsumer);
|
|
40540
40620
|
}
|
|
40541
40621
|
}
|
|
40542
|
-
/**
|
|
40543
|
-
* Compiles a partial injectable declaration object into a full injectable definition object.
|
|
40544
|
-
*
|
|
40545
|
-
* @codeGenApi
|
|
40546
|
-
*/
|
|
40547
|
-
function ɵɵngDeclareInjectable(decl) {
|
|
40548
|
-
const compiler = getCompilerFacade({
|
|
40549
|
-
usage: 1 /* JitCompilerUsage.PartialDeclaration */,
|
|
40550
|
-
kind: 'injectable',
|
|
40551
|
-
type: decl.type,
|
|
40552
|
-
});
|
|
40553
|
-
return compiler.compileInjectableDeclaration(angularCoreEnv, `ng:///${decl.type.name}/ɵprov.js`, decl);
|
|
40554
|
-
}
|
|
40555
|
-
/**
|
|
40556
|
-
* Compiles a partial injector declaration object into a full injector definition object.
|
|
40557
|
-
*
|
|
40558
|
-
* @codeGenApi
|
|
40559
|
-
*/
|
|
40560
|
-
function ɵɵngDeclareInjector(decl) {
|
|
40561
|
-
const compiler = getCompilerFacade({
|
|
40562
|
-
usage: 1 /* JitCompilerUsage.PartialDeclaration */,
|
|
40563
|
-
kind: 'NgModule',
|
|
40564
|
-
type: decl.type,
|
|
40565
|
-
});
|
|
40566
|
-
return compiler.compileInjectorDeclaration(angularCoreEnv, `ng:///${decl.type.name}/ɵinj.js`, decl);
|
|
40567
|
-
}
|
|
40568
|
-
/**
|
|
40569
|
-
* Compiles a partial NgModule declaration object into a full NgModule definition object.
|
|
40570
|
-
*
|
|
40571
|
-
* @codeGenApi
|
|
40572
|
-
*/
|
|
40573
|
-
function ɵɵngDeclareNgModule(decl) {
|
|
40574
|
-
const compiler = getCompilerFacade({
|
|
40575
|
-
usage: 1 /* JitCompilerUsage.PartialDeclaration */,
|
|
40576
|
-
kind: 'NgModule',
|
|
40577
|
-
type: decl.type,
|
|
40578
|
-
});
|
|
40579
|
-
return compiler.compileNgModuleDeclaration(angularCoreEnv, `ng:///${decl.type.name}/ɵmod.js`, decl);
|
|
40580
|
-
}
|
|
40581
|
-
/**
|
|
40582
|
-
* Compiles a partial pipe declaration object into a full pipe definition object.
|
|
40583
|
-
*
|
|
40584
|
-
* @codeGenApi
|
|
40585
|
-
*/
|
|
40586
|
-
function ɵɵngDeclarePipe(decl) {
|
|
40587
|
-
const compiler = getCompilerFacade({
|
|
40588
|
-
usage: 1 /* JitCompilerUsage.PartialDeclaration */,
|
|
40589
|
-
kind: 'pipe',
|
|
40590
|
-
type: decl.type,
|
|
40591
|
-
});
|
|
40592
|
-
return compiler.compilePipeDeclaration(angularCoreEnv, `ng:///${decl.type.name}/ɵpipe.js`, decl);
|
|
40593
|
-
}
|
|
40594
|
-
|
|
40595
|
-
// we reexport these symbols just so that they are retained during the dead code elimination
|
|
40596
40622
|
|
|
40597
40623
|
/**
|
|
40598
40624
|
* Create a computed `Signal` which derives a reactive value from an expression.
|
|
40599
40625
|
*/
|
|
40600
40626
|
function computed(computation, options) {
|
|
40601
|
-
performanceMarkFeature('NgSignals');
|
|
40602
40627
|
const getter = createComputed$1(computation);
|
|
40603
40628
|
if (options?.equal) {
|
|
40604
40629
|
getter[SIGNAL$1].equal = options.equal;
|
|
@@ -40610,46 +40635,6 @@ function computed(computation, options) {
|
|
|
40610
40635
|
return getter;
|
|
40611
40636
|
}
|
|
40612
40637
|
|
|
40613
|
-
const identityFn = (v) => v;
|
|
40614
|
-
function linkedSignal(optionsOrComputation, options) {
|
|
40615
|
-
performanceMarkFeature('NgSignals');
|
|
40616
|
-
if (typeof optionsOrComputation === 'function') {
|
|
40617
|
-
const getter = createLinkedSignal$1(optionsOrComputation, (identityFn), options?.equal);
|
|
40618
|
-
return upgradeLinkedSignalGetter(getter);
|
|
40619
|
-
}
|
|
40620
|
-
else {
|
|
40621
|
-
const getter = createLinkedSignal$1(optionsOrComputation.source, optionsOrComputation.computation, optionsOrComputation.equal);
|
|
40622
|
-
return upgradeLinkedSignalGetter(getter);
|
|
40623
|
-
}
|
|
40624
|
-
}
|
|
40625
|
-
function upgradeLinkedSignalGetter(getter) {
|
|
40626
|
-
if (ngDevMode) {
|
|
40627
|
-
getter.toString = () => `[LinkedSignal: ${getter()}]`;
|
|
40628
|
-
}
|
|
40629
|
-
const node = getter[SIGNAL$1];
|
|
40630
|
-
const upgradedGetter = getter;
|
|
40631
|
-
upgradedGetter.set = (newValue) => linkedSignalSetFn$1(node, newValue);
|
|
40632
|
-
upgradedGetter.update = (updateFn) => linkedSignalUpdateFn$1(node, updateFn);
|
|
40633
|
-
upgradedGetter.asReadonly = signalAsReadonlyFn.bind(getter);
|
|
40634
|
-
return upgradedGetter;
|
|
40635
|
-
}
|
|
40636
|
-
|
|
40637
|
-
/**
|
|
40638
|
-
* Execute an arbitrary function in a non-reactive (non-tracking) context. The executed function
|
|
40639
|
-
* can, optionally, return a value.
|
|
40640
|
-
*/
|
|
40641
|
-
function untracked(nonReactiveReadsFn) {
|
|
40642
|
-
const prevConsumer = setActiveConsumer$1(null);
|
|
40643
|
-
// We are not trying to catch any particular errors here, just making sure that the consumers
|
|
40644
|
-
// stack is restored in case of errors.
|
|
40645
|
-
try {
|
|
40646
|
-
return nonReactiveReadsFn();
|
|
40647
|
-
}
|
|
40648
|
-
finally {
|
|
40649
|
-
setActiveConsumer$1(prevConsumer);
|
|
40650
|
-
}
|
|
40651
|
-
}
|
|
40652
|
-
|
|
40653
40638
|
/**
|
|
40654
40639
|
* Controls whether effects use the legacy `microtaskEffect` by default.
|
|
40655
40640
|
*/
|
|
@@ -40736,7 +40721,6 @@ function effect$1() { }
|
|
|
40736
40721
|
* Create a global `Effect` for the given reactive function.
|
|
40737
40722
|
*/
|
|
40738
40723
|
function microtaskEffect(effectFn, options) {
|
|
40739
|
-
performanceMarkFeature('NgSignals');
|
|
40740
40724
|
ngDevMode &&
|
|
40741
40725
|
assertNotInReactiveContext(effect$1, 'Call `effect` outside of a reactive context. For example, schedule the ' +
|
|
40742
40726
|
'effect inside the component constructor.');
|
|
@@ -40809,7 +40793,6 @@ function effect(effectFn, options) {
|
|
|
40809
40793
|
}
|
|
40810
40794
|
return microtaskEffect(effectFn, options);
|
|
40811
40795
|
}
|
|
40812
|
-
performanceMarkFeature('NgSignals');
|
|
40813
40796
|
ngDevMode &&
|
|
40814
40797
|
assertNotInReactiveContext(effect, 'Call `effect` outside of a reactive context. For example, schedule the ' +
|
|
40815
40798
|
'effect inside the component constructor.');
|
|
@@ -40963,163 +40946,6 @@ function createRootEffect(fn, scheduler, notifier) {
|
|
|
40963
40946
|
return node;
|
|
40964
40947
|
}
|
|
40965
40948
|
|
|
40966
|
-
const NOT_SET = Symbol('NOT_SET');
|
|
40967
|
-
const EMPTY_CLEANUP_SET = new Set();
|
|
40968
|
-
const AFTER_RENDER_PHASE_EFFECT_NODE = /* @__PURE__ */ (() => ({
|
|
40969
|
-
...SIGNAL_NODE$1,
|
|
40970
|
-
consumerIsAlwaysLive: true,
|
|
40971
|
-
consumerAllowSignalWrites: true,
|
|
40972
|
-
value: NOT_SET,
|
|
40973
|
-
cleanup: null,
|
|
40974
|
-
/** Called when the effect becomes dirty */
|
|
40975
|
-
consumerMarkedDirty() {
|
|
40976
|
-
if (this.sequence.impl.executing) {
|
|
40977
|
-
// If hooks are in the middle of executing, then it matters whether this node has yet been
|
|
40978
|
-
// executed within its sequence. If not, then we don't want to notify the scheduler since
|
|
40979
|
-
// this node will be reached naturally.
|
|
40980
|
-
if (this.sequence.lastPhase === null || this.sequence.lastPhase < this.phase) {
|
|
40981
|
-
return;
|
|
40982
|
-
}
|
|
40983
|
-
// If during the execution of a later phase an earlier phase became dirty, then we should not
|
|
40984
|
-
// run any further phases until the earlier one reruns.
|
|
40985
|
-
this.sequence.erroredOrDestroyed = true;
|
|
40986
|
-
}
|
|
40987
|
-
// Either hooks are not running, or we're marking a node dirty that has already run within its
|
|
40988
|
-
// sequence.
|
|
40989
|
-
this.sequence.scheduler.notify(7 /* NotificationSource.RenderHook */);
|
|
40990
|
-
},
|
|
40991
|
-
phaseFn(previousValue) {
|
|
40992
|
-
this.sequence.lastPhase = this.phase;
|
|
40993
|
-
if (!this.dirty) {
|
|
40994
|
-
return this.signal;
|
|
40995
|
-
}
|
|
40996
|
-
this.dirty = false;
|
|
40997
|
-
if (this.value !== NOT_SET && !consumerPollProducersForChange$1(this)) {
|
|
40998
|
-
// None of our producers report a change since the last time they were read, so no
|
|
40999
|
-
// recomputation of our value is necessary.
|
|
41000
|
-
return this.signal;
|
|
41001
|
-
}
|
|
41002
|
-
// Run any needed cleanup functions.
|
|
41003
|
-
try {
|
|
41004
|
-
for (const cleanupFn of this.cleanup ?? EMPTY_CLEANUP_SET) {
|
|
41005
|
-
cleanupFn();
|
|
41006
|
-
}
|
|
41007
|
-
}
|
|
41008
|
-
finally {
|
|
41009
|
-
// Even if a cleanup function errors, ensure it's cleared.
|
|
41010
|
-
this.cleanup?.clear();
|
|
41011
|
-
}
|
|
41012
|
-
// Prepare to call the user's effect callback. If there was a previous phase, then it gave us
|
|
41013
|
-
// its value as a `Signal`, otherwise `previousValue` will be `undefined`.
|
|
41014
|
-
const args = [];
|
|
41015
|
-
if (previousValue !== undefined) {
|
|
41016
|
-
args.push(previousValue);
|
|
41017
|
-
}
|
|
41018
|
-
args.push(this.registerCleanupFn);
|
|
41019
|
-
// Call the user's callback in our reactive context.
|
|
41020
|
-
const prevConsumer = consumerBeforeComputation$1(this);
|
|
41021
|
-
let newValue;
|
|
41022
|
-
try {
|
|
41023
|
-
newValue = this.userFn.apply(null, args);
|
|
41024
|
-
}
|
|
41025
|
-
finally {
|
|
41026
|
-
consumerAfterComputation$1(this, prevConsumer);
|
|
41027
|
-
}
|
|
41028
|
-
if (this.value === NOT_SET || !this.equal(this.value, newValue)) {
|
|
41029
|
-
this.value = newValue;
|
|
41030
|
-
this.version++;
|
|
41031
|
-
}
|
|
41032
|
-
return this.signal;
|
|
41033
|
-
},
|
|
41034
|
-
}))();
|
|
41035
|
-
/**
|
|
41036
|
-
* An `AfterRenderSequence` that manages an `afterRenderEffect`'s phase effects.
|
|
41037
|
-
*/
|
|
41038
|
-
class AfterRenderEffectSequence extends AfterRenderSequence {
|
|
41039
|
-
scheduler;
|
|
41040
|
-
/**
|
|
41041
|
-
* While this sequence is executing, this tracks the last phase which was called by the
|
|
41042
|
-
* `afterRender` machinery.
|
|
41043
|
-
*
|
|
41044
|
-
* When a phase effect is marked dirty, this is used to determine whether it's already run or not.
|
|
41045
|
-
*/
|
|
41046
|
-
lastPhase = null;
|
|
41047
|
-
/**
|
|
41048
|
-
* The reactive nodes for each phase, if a phase effect is defined for that phase.
|
|
41049
|
-
*
|
|
41050
|
-
* These are initialized to `undefined` but set in the constructor.
|
|
41051
|
-
*/
|
|
41052
|
-
nodes = [undefined, undefined, undefined, undefined];
|
|
41053
|
-
constructor(impl, effectHooks, view, scheduler, destroyRef, snapshot = null) {
|
|
41054
|
-
// Note that we also initialize the underlying `AfterRenderSequence` hooks to `undefined` and
|
|
41055
|
-
// populate them as we create reactive nodes below.
|
|
41056
|
-
super(impl, [undefined, undefined, undefined, undefined], view, false, destroyRef, snapshot);
|
|
41057
|
-
this.scheduler = scheduler;
|
|
41058
|
-
// Setup a reactive node for each phase.
|
|
41059
|
-
for (const phase of AFTER_RENDER_PHASES) {
|
|
41060
|
-
const effectHook = effectHooks[phase];
|
|
41061
|
-
if (effectHook === undefined) {
|
|
41062
|
-
continue;
|
|
41063
|
-
}
|
|
41064
|
-
const node = Object.create(AFTER_RENDER_PHASE_EFFECT_NODE);
|
|
41065
|
-
node.sequence = this;
|
|
41066
|
-
node.phase = phase;
|
|
41067
|
-
node.userFn = effectHook;
|
|
41068
|
-
node.dirty = true;
|
|
41069
|
-
node.signal = (() => {
|
|
41070
|
-
producerAccessed$1(node);
|
|
41071
|
-
return node.value;
|
|
41072
|
-
});
|
|
41073
|
-
node.signal[SIGNAL$1] = node;
|
|
41074
|
-
node.registerCleanupFn = (fn) => (node.cleanup ??= new Set()).add(fn);
|
|
41075
|
-
this.nodes[phase] = node;
|
|
41076
|
-
// Install the upstream hook which runs the `phaseFn` for this phase.
|
|
41077
|
-
this.hooks[phase] = (value) => node.phaseFn(value);
|
|
41078
|
-
}
|
|
41079
|
-
}
|
|
41080
|
-
afterRun() {
|
|
41081
|
-
super.afterRun();
|
|
41082
|
-
// We're done running this sequence, so reset `lastPhase`.
|
|
41083
|
-
this.lastPhase = null;
|
|
41084
|
-
}
|
|
41085
|
-
destroy() {
|
|
41086
|
-
super.destroy();
|
|
41087
|
-
// Run the cleanup functions for each node.
|
|
41088
|
-
for (const node of this.nodes) {
|
|
41089
|
-
for (const fn of node?.cleanup ?? EMPTY_CLEANUP_SET) {
|
|
41090
|
-
fn();
|
|
41091
|
-
}
|
|
41092
|
-
}
|
|
41093
|
-
}
|
|
41094
|
-
}
|
|
41095
|
-
/**
|
|
41096
|
-
* @experimental
|
|
41097
|
-
*/
|
|
41098
|
-
function afterRenderEffect(callbackOrSpec, options) {
|
|
41099
|
-
ngDevMode &&
|
|
41100
|
-
assertNotInReactiveContext(afterRenderEffect, 'Call `afterRenderEffect` outside of a reactive context. For example, create the render ' +
|
|
41101
|
-
'effect inside the component constructor`.');
|
|
41102
|
-
!options?.injector && assertInInjectionContext(afterRenderEffect);
|
|
41103
|
-
if (typeof ngServerMode !== 'undefined' && ngServerMode) {
|
|
41104
|
-
return NOOP_AFTER_RENDER_REF;
|
|
41105
|
-
}
|
|
41106
|
-
const injector = options?.injector ?? inject(Injector);
|
|
41107
|
-
const scheduler = injector.get(ChangeDetectionScheduler);
|
|
41108
|
-
const manager = injector.get(AfterRenderManager);
|
|
41109
|
-
const tracing = injector.get(TracingService, null, { optional: true });
|
|
41110
|
-
manager.impl ??= injector.get(AfterRenderImpl);
|
|
41111
|
-
let spec = callbackOrSpec;
|
|
41112
|
-
if (typeof spec === 'function') {
|
|
41113
|
-
spec = { mixedReadWrite: callbackOrSpec };
|
|
41114
|
-
}
|
|
41115
|
-
const viewContext = injector.get(ViewContext, null, { optional: true });
|
|
41116
|
-
const sequence = new AfterRenderEffectSequence(manager.impl, [spec.earlyRead, spec.write, spec.mixedReadWrite, spec.read], viewContext?.view, scheduler, injector.get(DestroyRef), tracing?.snapshot(null));
|
|
41117
|
-
manager.impl.register(sequence);
|
|
41118
|
-
return sequence;
|
|
41119
|
-
}
|
|
41120
|
-
|
|
41121
|
-
// This file exists to allow the set of reactivity exports to be modified in g3, as these APIs are
|
|
41122
|
-
|
|
41123
40949
|
/**
|
|
41124
40950
|
* Status of a `Resource`.
|
|
41125
40951
|
*
|
|
@@ -41161,6 +40987,29 @@ var ResourceStatus;
|
|
|
41161
40987
|
ResourceStatus[ResourceStatus["Local"] = 5] = "Local";
|
|
41162
40988
|
})(ResourceStatus || (ResourceStatus = {}));
|
|
41163
40989
|
|
|
40990
|
+
const identityFn = (v) => v;
|
|
40991
|
+
function linkedSignal(optionsOrComputation, options) {
|
|
40992
|
+
if (typeof optionsOrComputation === 'function') {
|
|
40993
|
+
const getter = createLinkedSignal$1(optionsOrComputation, (identityFn), options?.equal);
|
|
40994
|
+
return upgradeLinkedSignalGetter(getter);
|
|
40995
|
+
}
|
|
40996
|
+
else {
|
|
40997
|
+
const getter = createLinkedSignal$1(optionsOrComputation.source, optionsOrComputation.computation, optionsOrComputation.equal);
|
|
40998
|
+
return upgradeLinkedSignalGetter(getter);
|
|
40999
|
+
}
|
|
41000
|
+
}
|
|
41001
|
+
function upgradeLinkedSignalGetter(getter) {
|
|
41002
|
+
if (ngDevMode) {
|
|
41003
|
+
getter.toString = () => `[LinkedSignal: ${getter()}]`;
|
|
41004
|
+
}
|
|
41005
|
+
const node = getter[SIGNAL$1];
|
|
41006
|
+
const upgradedGetter = getter;
|
|
41007
|
+
upgradedGetter.set = (newValue) => linkedSignalSetFn$1(node, newValue);
|
|
41008
|
+
upgradedGetter.update = (updateFn) => linkedSignalUpdateFn$1(node, updateFn);
|
|
41009
|
+
upgradedGetter.asReadonly = signalAsReadonlyFn.bind(getter);
|
|
41010
|
+
return upgradedGetter;
|
|
41011
|
+
}
|
|
41012
|
+
|
|
41164
41013
|
function resource(options) {
|
|
41165
41014
|
options?.injector || assertInInjectionContext(resource);
|
|
41166
41015
|
const request = (options.request ?? (() => null));
|
|
@@ -41429,6 +41278,334 @@ function isResolved(state) {
|
|
|
41429
41278
|
return state.error === undefined;
|
|
41430
41279
|
}
|
|
41431
41280
|
|
|
41281
|
+
/*!
|
|
41282
|
+
* @license
|
|
41283
|
+
* Copyright Google LLC All Rights Reserved.
|
|
41284
|
+
*
|
|
41285
|
+
* Use of this source code is governed by an MIT-style license that can be
|
|
41286
|
+
* found in the LICENSE file at https://angular.dev/license
|
|
41287
|
+
*/
|
|
41288
|
+
/**
|
|
41289
|
+
* Gets the class name of the closest component to a node.
|
|
41290
|
+
* Warning! this function will return minified names if the name of the component is minified. The
|
|
41291
|
+
* consumer of the function is responsible for resolving the minified name to its original name.
|
|
41292
|
+
* @param node Node from which to start the search.
|
|
41293
|
+
*/
|
|
41294
|
+
function getClosestComponentName(node) {
|
|
41295
|
+
let currentNode = node;
|
|
41296
|
+
while (currentNode) {
|
|
41297
|
+
const lView = readPatchedLView(currentNode);
|
|
41298
|
+
if (lView !== null) {
|
|
41299
|
+
for (let i = HEADER_OFFSET; i < lView.length; i++) {
|
|
41300
|
+
const current = lView[i];
|
|
41301
|
+
if ((!isLView(current) && !isLContainer(current)) || current[HOST] !== currentNode) {
|
|
41302
|
+
continue;
|
|
41303
|
+
}
|
|
41304
|
+
const tView = lView[TVIEW];
|
|
41305
|
+
const tNode = getTNode(tView, i);
|
|
41306
|
+
if (isComponentHost(tNode)) {
|
|
41307
|
+
const def = tView.data[tNode.directiveStart + tNode.componentOffset];
|
|
41308
|
+
const name = def.debugInfo?.className || def.type.name;
|
|
41309
|
+
// Note: the name may be an empty string if the class name is
|
|
41310
|
+
// dropped due to minification. In such cases keep going up the tree.
|
|
41311
|
+
if (name) {
|
|
41312
|
+
return name;
|
|
41313
|
+
}
|
|
41314
|
+
else {
|
|
41315
|
+
break;
|
|
41316
|
+
}
|
|
41317
|
+
}
|
|
41318
|
+
}
|
|
41319
|
+
}
|
|
41320
|
+
currentNode = currentNode.parentNode;
|
|
41321
|
+
}
|
|
41322
|
+
return null;
|
|
41323
|
+
}
|
|
41324
|
+
|
|
41325
|
+
/**
|
|
41326
|
+
* Compiles a partial directive declaration object into a full directive definition object.
|
|
41327
|
+
*
|
|
41328
|
+
* @codeGenApi
|
|
41329
|
+
*/
|
|
41330
|
+
function ɵɵngDeclareDirective(decl) {
|
|
41331
|
+
const compiler = getCompilerFacade({
|
|
41332
|
+
usage: 1 /* JitCompilerUsage.PartialDeclaration */,
|
|
41333
|
+
kind: 'directive',
|
|
41334
|
+
type: decl.type,
|
|
41335
|
+
});
|
|
41336
|
+
return compiler.compileDirectiveDeclaration(angularCoreEnv, `ng:///${decl.type.name}/ɵfac.js`, decl);
|
|
41337
|
+
}
|
|
41338
|
+
/**
|
|
41339
|
+
* Evaluates the class metadata declaration.
|
|
41340
|
+
*
|
|
41341
|
+
* @codeGenApi
|
|
41342
|
+
*/
|
|
41343
|
+
function ɵɵngDeclareClassMetadata(decl) {
|
|
41344
|
+
setClassMetadata(decl.type, decl.decorators, decl.ctorParameters ?? null, decl.propDecorators ?? null);
|
|
41345
|
+
}
|
|
41346
|
+
/**
|
|
41347
|
+
* Evaluates the class metadata of a component that contains deferred blocks.
|
|
41348
|
+
*
|
|
41349
|
+
* @codeGenApi
|
|
41350
|
+
*/
|
|
41351
|
+
function ɵɵngDeclareClassMetadataAsync(decl) {
|
|
41352
|
+
setClassMetadataAsync(decl.type, decl.resolveDeferredDeps, (...types) => {
|
|
41353
|
+
const meta = decl.resolveMetadata(...types);
|
|
41354
|
+
setClassMetadata(decl.type, meta.decorators, meta.ctorParameters, meta.propDecorators);
|
|
41355
|
+
});
|
|
41356
|
+
}
|
|
41357
|
+
/**
|
|
41358
|
+
* Compiles a partial component declaration object into a full component definition object.
|
|
41359
|
+
*
|
|
41360
|
+
* @codeGenApi
|
|
41361
|
+
*/
|
|
41362
|
+
function ɵɵngDeclareComponent(decl) {
|
|
41363
|
+
const compiler = getCompilerFacade({
|
|
41364
|
+
usage: 1 /* JitCompilerUsage.PartialDeclaration */,
|
|
41365
|
+
kind: 'component',
|
|
41366
|
+
type: decl.type,
|
|
41367
|
+
});
|
|
41368
|
+
return compiler.compileComponentDeclaration(angularCoreEnv, `ng:///${decl.type.name}/ɵcmp.js`, decl);
|
|
41369
|
+
}
|
|
41370
|
+
/**
|
|
41371
|
+
* Compiles a partial pipe declaration object into a full pipe definition object.
|
|
41372
|
+
*
|
|
41373
|
+
* @codeGenApi
|
|
41374
|
+
*/
|
|
41375
|
+
function ɵɵngDeclareFactory(decl) {
|
|
41376
|
+
const compiler = getCompilerFacade({
|
|
41377
|
+
usage: 1 /* JitCompilerUsage.PartialDeclaration */,
|
|
41378
|
+
kind: getFactoryKind(decl.target),
|
|
41379
|
+
type: decl.type,
|
|
41380
|
+
});
|
|
41381
|
+
return compiler.compileFactoryDeclaration(angularCoreEnv, `ng:///${decl.type.name}/ɵfac.js`, decl);
|
|
41382
|
+
}
|
|
41383
|
+
function getFactoryKind(target) {
|
|
41384
|
+
switch (target) {
|
|
41385
|
+
case FactoryTarget.Directive:
|
|
41386
|
+
return 'directive';
|
|
41387
|
+
case FactoryTarget.Component:
|
|
41388
|
+
return 'component';
|
|
41389
|
+
case FactoryTarget.Injectable:
|
|
41390
|
+
return 'injectable';
|
|
41391
|
+
case FactoryTarget.Pipe:
|
|
41392
|
+
return 'pipe';
|
|
41393
|
+
case FactoryTarget.NgModule:
|
|
41394
|
+
return 'NgModule';
|
|
41395
|
+
}
|
|
41396
|
+
}
|
|
41397
|
+
/**
|
|
41398
|
+
* Compiles a partial injectable declaration object into a full injectable definition object.
|
|
41399
|
+
*
|
|
41400
|
+
* @codeGenApi
|
|
41401
|
+
*/
|
|
41402
|
+
function ɵɵngDeclareInjectable(decl) {
|
|
41403
|
+
const compiler = getCompilerFacade({
|
|
41404
|
+
usage: 1 /* JitCompilerUsage.PartialDeclaration */,
|
|
41405
|
+
kind: 'injectable',
|
|
41406
|
+
type: decl.type,
|
|
41407
|
+
});
|
|
41408
|
+
return compiler.compileInjectableDeclaration(angularCoreEnv, `ng:///${decl.type.name}/ɵprov.js`, decl);
|
|
41409
|
+
}
|
|
41410
|
+
/**
|
|
41411
|
+
* Compiles a partial injector declaration object into a full injector definition object.
|
|
41412
|
+
*
|
|
41413
|
+
* @codeGenApi
|
|
41414
|
+
*/
|
|
41415
|
+
function ɵɵngDeclareInjector(decl) {
|
|
41416
|
+
const compiler = getCompilerFacade({
|
|
41417
|
+
usage: 1 /* JitCompilerUsage.PartialDeclaration */,
|
|
41418
|
+
kind: 'NgModule',
|
|
41419
|
+
type: decl.type,
|
|
41420
|
+
});
|
|
41421
|
+
return compiler.compileInjectorDeclaration(angularCoreEnv, `ng:///${decl.type.name}/ɵinj.js`, decl);
|
|
41422
|
+
}
|
|
41423
|
+
/**
|
|
41424
|
+
* Compiles a partial NgModule declaration object into a full NgModule definition object.
|
|
41425
|
+
*
|
|
41426
|
+
* @codeGenApi
|
|
41427
|
+
*/
|
|
41428
|
+
function ɵɵngDeclareNgModule(decl) {
|
|
41429
|
+
const compiler = getCompilerFacade({
|
|
41430
|
+
usage: 1 /* JitCompilerUsage.PartialDeclaration */,
|
|
41431
|
+
kind: 'NgModule',
|
|
41432
|
+
type: decl.type,
|
|
41433
|
+
});
|
|
41434
|
+
return compiler.compileNgModuleDeclaration(angularCoreEnv, `ng:///${decl.type.name}/ɵmod.js`, decl);
|
|
41435
|
+
}
|
|
41436
|
+
/**
|
|
41437
|
+
* Compiles a partial pipe declaration object into a full pipe definition object.
|
|
41438
|
+
*
|
|
41439
|
+
* @codeGenApi
|
|
41440
|
+
*/
|
|
41441
|
+
function ɵɵngDeclarePipe(decl) {
|
|
41442
|
+
const compiler = getCompilerFacade({
|
|
41443
|
+
usage: 1 /* JitCompilerUsage.PartialDeclaration */,
|
|
41444
|
+
kind: 'pipe',
|
|
41445
|
+
type: decl.type,
|
|
41446
|
+
});
|
|
41447
|
+
return compiler.compilePipeDeclaration(angularCoreEnv, `ng:///${decl.type.name}/ɵpipe.js`, decl);
|
|
41448
|
+
}
|
|
41449
|
+
|
|
41450
|
+
// we reexport these symbols just so that they are retained during the dead code elimination
|
|
41451
|
+
|
|
41452
|
+
const NOT_SET = Symbol('NOT_SET');
|
|
41453
|
+
const EMPTY_CLEANUP_SET = new Set();
|
|
41454
|
+
const AFTER_RENDER_PHASE_EFFECT_NODE = /* @__PURE__ */ (() => ({
|
|
41455
|
+
...SIGNAL_NODE$1,
|
|
41456
|
+
consumerIsAlwaysLive: true,
|
|
41457
|
+
consumerAllowSignalWrites: true,
|
|
41458
|
+
value: NOT_SET,
|
|
41459
|
+
cleanup: null,
|
|
41460
|
+
/** Called when the effect becomes dirty */
|
|
41461
|
+
consumerMarkedDirty() {
|
|
41462
|
+
if (this.sequence.impl.executing) {
|
|
41463
|
+
// If hooks are in the middle of executing, then it matters whether this node has yet been
|
|
41464
|
+
// executed within its sequence. If not, then we don't want to notify the scheduler since
|
|
41465
|
+
// this node will be reached naturally.
|
|
41466
|
+
if (this.sequence.lastPhase === null || this.sequence.lastPhase < this.phase) {
|
|
41467
|
+
return;
|
|
41468
|
+
}
|
|
41469
|
+
// If during the execution of a later phase an earlier phase became dirty, then we should not
|
|
41470
|
+
// run any further phases until the earlier one reruns.
|
|
41471
|
+
this.sequence.erroredOrDestroyed = true;
|
|
41472
|
+
}
|
|
41473
|
+
// Either hooks are not running, or we're marking a node dirty that has already run within its
|
|
41474
|
+
// sequence.
|
|
41475
|
+
this.sequence.scheduler.notify(7 /* NotificationSource.RenderHook */);
|
|
41476
|
+
},
|
|
41477
|
+
phaseFn(previousValue) {
|
|
41478
|
+
this.sequence.lastPhase = this.phase;
|
|
41479
|
+
if (!this.dirty) {
|
|
41480
|
+
return this.signal;
|
|
41481
|
+
}
|
|
41482
|
+
this.dirty = false;
|
|
41483
|
+
if (this.value !== NOT_SET && !consumerPollProducersForChange$1(this)) {
|
|
41484
|
+
// None of our producers report a change since the last time they were read, so no
|
|
41485
|
+
// recomputation of our value is necessary.
|
|
41486
|
+
return this.signal;
|
|
41487
|
+
}
|
|
41488
|
+
// Run any needed cleanup functions.
|
|
41489
|
+
try {
|
|
41490
|
+
for (const cleanupFn of this.cleanup ?? EMPTY_CLEANUP_SET) {
|
|
41491
|
+
cleanupFn();
|
|
41492
|
+
}
|
|
41493
|
+
}
|
|
41494
|
+
finally {
|
|
41495
|
+
// Even if a cleanup function errors, ensure it's cleared.
|
|
41496
|
+
this.cleanup?.clear();
|
|
41497
|
+
}
|
|
41498
|
+
// Prepare to call the user's effect callback. If there was a previous phase, then it gave us
|
|
41499
|
+
// its value as a `Signal`, otherwise `previousValue` will be `undefined`.
|
|
41500
|
+
const args = [];
|
|
41501
|
+
if (previousValue !== undefined) {
|
|
41502
|
+
args.push(previousValue);
|
|
41503
|
+
}
|
|
41504
|
+
args.push(this.registerCleanupFn);
|
|
41505
|
+
// Call the user's callback in our reactive context.
|
|
41506
|
+
const prevConsumer = consumerBeforeComputation$1(this);
|
|
41507
|
+
let newValue;
|
|
41508
|
+
try {
|
|
41509
|
+
newValue = this.userFn.apply(null, args);
|
|
41510
|
+
}
|
|
41511
|
+
finally {
|
|
41512
|
+
consumerAfterComputation$1(this, prevConsumer);
|
|
41513
|
+
}
|
|
41514
|
+
if (this.value === NOT_SET || !this.equal(this.value, newValue)) {
|
|
41515
|
+
this.value = newValue;
|
|
41516
|
+
this.version++;
|
|
41517
|
+
}
|
|
41518
|
+
return this.signal;
|
|
41519
|
+
},
|
|
41520
|
+
}))();
|
|
41521
|
+
/**
|
|
41522
|
+
* An `AfterRenderSequence` that manages an `afterRenderEffect`'s phase effects.
|
|
41523
|
+
*/
|
|
41524
|
+
class AfterRenderEffectSequence extends AfterRenderSequence {
|
|
41525
|
+
scheduler;
|
|
41526
|
+
/**
|
|
41527
|
+
* While this sequence is executing, this tracks the last phase which was called by the
|
|
41528
|
+
* `afterRender` machinery.
|
|
41529
|
+
*
|
|
41530
|
+
* When a phase effect is marked dirty, this is used to determine whether it's already run or not.
|
|
41531
|
+
*/
|
|
41532
|
+
lastPhase = null;
|
|
41533
|
+
/**
|
|
41534
|
+
* The reactive nodes for each phase, if a phase effect is defined for that phase.
|
|
41535
|
+
*
|
|
41536
|
+
* These are initialized to `undefined` but set in the constructor.
|
|
41537
|
+
*/
|
|
41538
|
+
nodes = [undefined, undefined, undefined, undefined];
|
|
41539
|
+
constructor(impl, effectHooks, view, scheduler, destroyRef, snapshot = null) {
|
|
41540
|
+
// Note that we also initialize the underlying `AfterRenderSequence` hooks to `undefined` and
|
|
41541
|
+
// populate them as we create reactive nodes below.
|
|
41542
|
+
super(impl, [undefined, undefined, undefined, undefined], view, false, destroyRef, snapshot);
|
|
41543
|
+
this.scheduler = scheduler;
|
|
41544
|
+
// Setup a reactive node for each phase.
|
|
41545
|
+
for (const phase of AFTER_RENDER_PHASES) {
|
|
41546
|
+
const effectHook = effectHooks[phase];
|
|
41547
|
+
if (effectHook === undefined) {
|
|
41548
|
+
continue;
|
|
41549
|
+
}
|
|
41550
|
+
const node = Object.create(AFTER_RENDER_PHASE_EFFECT_NODE);
|
|
41551
|
+
node.sequence = this;
|
|
41552
|
+
node.phase = phase;
|
|
41553
|
+
node.userFn = effectHook;
|
|
41554
|
+
node.dirty = true;
|
|
41555
|
+
node.signal = (() => {
|
|
41556
|
+
producerAccessed$1(node);
|
|
41557
|
+
return node.value;
|
|
41558
|
+
});
|
|
41559
|
+
node.signal[SIGNAL$1] = node;
|
|
41560
|
+
node.registerCleanupFn = (fn) => (node.cleanup ??= new Set()).add(fn);
|
|
41561
|
+
this.nodes[phase] = node;
|
|
41562
|
+
// Install the upstream hook which runs the `phaseFn` for this phase.
|
|
41563
|
+
this.hooks[phase] = (value) => node.phaseFn(value);
|
|
41564
|
+
}
|
|
41565
|
+
}
|
|
41566
|
+
afterRun() {
|
|
41567
|
+
super.afterRun();
|
|
41568
|
+
// We're done running this sequence, so reset `lastPhase`.
|
|
41569
|
+
this.lastPhase = null;
|
|
41570
|
+
}
|
|
41571
|
+
destroy() {
|
|
41572
|
+
super.destroy();
|
|
41573
|
+
// Run the cleanup functions for each node.
|
|
41574
|
+
for (const node of this.nodes) {
|
|
41575
|
+
for (const fn of node?.cleanup ?? EMPTY_CLEANUP_SET) {
|
|
41576
|
+
fn();
|
|
41577
|
+
}
|
|
41578
|
+
}
|
|
41579
|
+
}
|
|
41580
|
+
}
|
|
41581
|
+
/**
|
|
41582
|
+
* @experimental
|
|
41583
|
+
*/
|
|
41584
|
+
function afterRenderEffect(callbackOrSpec, options) {
|
|
41585
|
+
ngDevMode &&
|
|
41586
|
+
assertNotInReactiveContext(afterRenderEffect, 'Call `afterRenderEffect` outside of a reactive context. For example, create the render ' +
|
|
41587
|
+
'effect inside the component constructor`.');
|
|
41588
|
+
!options?.injector && assertInInjectionContext(afterRenderEffect);
|
|
41589
|
+
if (typeof ngServerMode !== 'undefined' && ngServerMode) {
|
|
41590
|
+
return NOOP_AFTER_RENDER_REF;
|
|
41591
|
+
}
|
|
41592
|
+
const injector = options?.injector ?? inject(Injector);
|
|
41593
|
+
const scheduler = injector.get(ChangeDetectionScheduler);
|
|
41594
|
+
const manager = injector.get(AfterRenderManager);
|
|
41595
|
+
const tracing = injector.get(TracingService, null, { optional: true });
|
|
41596
|
+
manager.impl ??= injector.get(AfterRenderImpl);
|
|
41597
|
+
let spec = callbackOrSpec;
|
|
41598
|
+
if (typeof spec === 'function') {
|
|
41599
|
+
spec = { mixedReadWrite: callbackOrSpec };
|
|
41600
|
+
}
|
|
41601
|
+
const viewContext = injector.get(ViewContext, null, { optional: true });
|
|
41602
|
+
const sequence = new AfterRenderEffectSequence(manager.impl, [spec.earlyRead, spec.write, spec.mixedReadWrite, spec.read], viewContext?.view, scheduler, injector.get(DestroyRef), tracing?.snapshot(null));
|
|
41603
|
+
manager.impl.register(sequence);
|
|
41604
|
+
return sequence;
|
|
41605
|
+
}
|
|
41606
|
+
|
|
41607
|
+
// This file exists to allow the set of reactivity exports to be modified in g3, as these APIs are
|
|
41608
|
+
|
|
41432
41609
|
/**
|
|
41433
41610
|
* Creates a `ComponentRef` instance based on provided component type and a set of options.
|
|
41434
41611
|
*
|
|
@@ -41675,5 +41852,5 @@ if (typeof ngDevMode !== 'undefined' && ngDevMode) {
|
|
|
41675
41852
|
* Generated bundle index. Do not edit.
|
|
41676
41853
|
*/
|
|
41677
41854
|
|
|
41678
|
-
export { ANIMATION_MODULE_TYPE, APP_BOOTSTRAP_LISTENER, APP_ID, APP_INITIALIZER, AfterRenderPhase, ApplicationInitStatus, ApplicationModule, ApplicationRef, Attribute, COMPILER_OPTIONS, CSP_NONCE, CUSTOM_ELEMENTS_SCHEMA, ChangeDetectionStrategy, ChangeDetectorRef, Compiler, CompilerFactory, Component, ComponentFactory$1 as ComponentFactory, ComponentFactoryResolver$1 as ComponentFactoryResolver, ComponentRef$1 as ComponentRef, ContentChild, ContentChildren, DEFAULT_CURRENCY_CODE, DebugElement, DebugEventListener, DebugNode, DefaultIterableDiffer, DestroyRef, Directive, ENVIRONMENT_INITIALIZER, ElementRef, EmbeddedViewRef, EnvironmentInjector, ErrorHandler, EventEmitter, HOST_TAG_NAME, Host, HostAttributeToken, HostBinding, HostListener, INJECTOR$1 as INJECTOR, Inject, InjectFlags, Injectable, InjectionToken, Injector, Input, IterableDiffers, KeyValueDiffers, LOCALE_ID, MissingTranslationStrategy, ModuleWithComponentFactories, NO_ERRORS_SCHEMA, NgModule, NgModuleFactory$1 as NgModuleFactory, NgModuleRef$1 as NgModuleRef, NgProbeToken, NgZone, Optional, Output, OutputEmitterRef, PACKAGE_ROOT_URL, PLATFORM_ID, PLATFORM_INITIALIZER, PendingTasks, Pipe, PlatformRef, Query, QueryList, REQUEST, REQUEST_CONTEXT, RESPONSE_INIT, Renderer2, RendererFactory2, RendererStyleFlags2, ResourceStatus, Sanitizer, SecurityContext, Self, SimpleChange, SkipSelf, TRANSLATIONS, TRANSLATIONS_FORMAT, TemplateRef, Testability, TestabilityRegistry, TransferState, Type, VERSION, Version, ViewChild, ViewChildren, ViewContainerRef, ViewEncapsulation, ViewRef, afterNextRender, afterRender, afterRenderEffect, asNativeElements, assertInInjectionContext, assertNotInReactiveContext, assertPlatform, booleanAttribute, computed, contentChild, contentChildren, createComponent, createEnvironmentInjector, createNgModule, createNgModuleRef, createPlatform, createPlatformFactory, defineInjectable, destroyPlatform, effect, enableProdMode, forwardRef, getDebugNode, getModuleFactory, getNgModuleById, getPlatform, importProvidersFrom, inject, input, isDevMode, isSignal, isStandalone, linkedSignal, makeEnvironmentProviders, makeStateKey, mergeApplicationConfig, model, numberAttribute, output, platformCore, provideAppInitializer, provideEnvironmentInitializer, provideExperimentalCheckNoChangesForDebug, provideExperimentalZonelessChangeDetection, providePlatformInitializer, provideZoneChangeDetection, reflectComponentType, resolveForwardRef, resource, runInInjectionContext, setTestabilityGetter, signal, untracked, viewChild, viewChildren, ALLOW_MULTIPLE_PLATFORMS as ɵALLOW_MULTIPLE_PLATFORMS, AfterRenderManager as ɵAfterRenderManager, CONTAINER_HEADER_OFFSET as ɵCONTAINER_HEADER_OFFSET, ChangeDetectionScheduler as ɵChangeDetectionScheduler, ChangeDetectionSchedulerImpl as ɵChangeDetectionSchedulerImpl, ComponentFactory$1 as ɵComponentFactory, Console as ɵConsole, DEFAULT_LOCALE_ID as ɵDEFAULT_LOCALE_ID, DEFER_BLOCK_CONFIG as ɵDEFER_BLOCK_CONFIG, DEFER_BLOCK_DEPENDENCY_INTERCEPTOR as ɵDEFER_BLOCK_DEPENDENCY_INTERCEPTOR, DeferBlockBehavior as ɵDeferBlockBehavior, DeferBlockState as ɵDeferBlockState, ENABLE_ROOT_COMPONENT_BOOTSTRAP as ɵENABLE_ROOT_COMPONENT_BOOTSTRAP, EffectScheduler as ɵEffectScheduler, IMAGE_CONFIG as ɵIMAGE_CONFIG, IMAGE_CONFIG_DEFAULTS as ɵIMAGE_CONFIG_DEFAULTS, INJECTOR_SCOPE as ɵINJECTOR_SCOPE, ɵINPUT_SIGNAL_BRAND_WRITE_TYPE, INTERNAL_APPLICATION_ERROR_HANDLER as ɵINTERNAL_APPLICATION_ERROR_HANDLER, IS_HYDRATION_DOM_REUSE_ENABLED as ɵIS_HYDRATION_DOM_REUSE_ENABLED, IS_INCREMENTAL_HYDRATION_ENABLED as ɵIS_INCREMENTAL_HYDRATION_ENABLED, JSACTION_EVENT_CONTRACT as ɵJSACTION_EVENT_CONTRACT, LContext as ɵLContext, LocaleDataIndex as ɵLocaleDataIndex, MicrotaskEffectScheduler as ɵMicrotaskEffectScheduler, NG_COMP_DEF as ɵNG_COMP_DEF, NG_DIR_DEF as ɵNG_DIR_DEF, NG_ELEMENT_ID as ɵNG_ELEMENT_ID, NG_INJ_DEF as ɵNG_INJ_DEF, NG_MOD_DEF as ɵNG_MOD_DEF, NG_PIPE_DEF as ɵNG_PIPE_DEF, NG_PROV_DEF as ɵNG_PROV_DEF, NOT_FOUND_CHECK_ONLY_ELEMENT_INJECTOR as ɵNOT_FOUND_CHECK_ONLY_ELEMENT_INJECTOR, NO_CHANGE as ɵNO_CHANGE, NgModuleFactory as ɵNgModuleFactory, NoopNgZone as ɵNoopNgZone, PERFORMANCE_MARK_PREFIX as ɵPERFORMANCE_MARK_PREFIX, PROVIDED_NG_ZONE as ɵPROVIDED_NG_ZONE, PendingTasksInternal as ɵPendingTasksInternal, ReflectionCapabilities as ɵReflectionCapabilities, ComponentFactory as ɵRender3ComponentFactory, ComponentRef as ɵRender3ComponentRef, NgModuleRef as ɵRender3NgModuleRef, RuntimeError as ɵRuntimeError, SSR_CONTENT_INTEGRITY_MARKER as ɵSSR_CONTENT_INTEGRITY_MARKER, TESTABILITY as ɵTESTABILITY, TESTABILITY_GETTER as ɵTESTABILITY_GETTER, TracingAction as ɵTracingAction, TracingService as ɵTracingService, USE_RUNTIME_DEPS_TRACKER_FOR_JIT as ɵUSE_RUNTIME_DEPS_TRACKER_FOR_JIT, ViewRef$1 as ɵViewRef, XSS_SECURITY_URL as ɵXSS_SECURITY_URL, ZONELESS_ENABLED as ɵZONELESS_ENABLED, _sanitizeHtml as ɵ_sanitizeHtml, _sanitizeUrl as ɵ_sanitizeUrl, allowSanitizationBypassAndThrow as ɵallowSanitizationBypassAndThrow, annotateForHydration as ɵannotateForHydration, bypassSanitizationTrustHtml as ɵbypassSanitizationTrustHtml, bypassSanitizationTrustResourceUrl as ɵbypassSanitizationTrustResourceUrl, bypassSanitizationTrustScript as ɵbypassSanitizationTrustScript, bypassSanitizationTrustStyle as ɵbypassSanitizationTrustStyle, bypassSanitizationTrustUrl as ɵbypassSanitizationTrustUrl, clearResolutionOfComponentResourcesQueue as ɵclearResolutionOfComponentResourcesQueue, compileComponent as ɵcompileComponent, compileDirective as ɵcompileDirective, compileNgModule as ɵcompileNgModule, compileNgModuleDefs as ɵcompileNgModuleDefs, compileNgModuleFactory as ɵcompileNgModuleFactory, compilePipe as ɵcompilePipe, convertToBitFlags as ɵconvertToBitFlags, createInjector as ɵcreateInjector, defaultIterableDiffers as ɵdefaultIterableDiffers, defaultKeyValueDiffers as ɵdefaultKeyValueDiffers, depsTracker as ɵdepsTracker, detectChangesInViewIfRequired as ɵdetectChangesInViewIfRequired, devModeEqual as ɵdevModeEqual, disableProfiling as ɵdisableProfiling, enableProfiling as ɵenableProfiling, findLocaleData as ɵfindLocaleData, flushModuleScopingQueueAsMuchAsPossible as ɵflushModuleScopingQueueAsMuchAsPossible, formatRuntimeError as ɵformatRuntimeError, generateStandaloneInDeclarationsError as ɵgenerateStandaloneInDeclarationsError, getAsyncClassMetadataFn as ɵgetAsyncClassMetadataFn, getClosestComponentName as ɵgetClosestComponentName, getDebugNode as ɵgetDebugNode, getDeferBlocks$1 as ɵgetDeferBlocks, getDirectives as ɵgetDirectives, getHostElement as ɵgetHostElement, getInjectableDef as ɵgetInjectableDef, getLContext as ɵgetLContext, getLocaleCurrencyCode as ɵgetLocaleCurrencyCode, getLocalePluralCase as ɵgetLocalePluralCase, getOutputDestroyRef as ɵgetOutputDestroyRef, getSanitizationBypassType as ɵgetSanitizationBypassType, ɵgetUnknownElementStrictMode, ɵgetUnknownPropertyStrictMode, _global as ɵglobal, injectChangeDetectorRef as ɵinjectChangeDetectorRef, internalCreateApplication as ɵinternalCreateApplication, internalProvideZoneChangeDetection as ɵinternalProvideZoneChangeDetection, isBoundToModule as ɵisBoundToModule, isComponentDefPendingResolution as ɵisComponentDefPendingResolution, isEnvironmentProviders as ɵisEnvironmentProviders, isInjectable as ɵisInjectable, isNgModule as ɵisNgModule, isPromise as ɵisPromise, isSubscribable as ɵisSubscribable, microtaskEffect as ɵmicrotaskEffect, noSideEffects as ɵnoSideEffects, patchComponentDefWithScope as ɵpatchComponentDefWithScope, performanceMarkFeature as ɵperformanceMarkFeature, publishExternalGlobalUtil as ɵpublishExternalGlobalUtil, readHydrationInfo as ɵreadHydrationInfo, registerLocaleData as ɵregisterLocaleData, renderDeferBlockState as ɵrenderDeferBlockState, resetCompiledComponents as ɵresetCompiledComponents, resetJitOptions as ɵresetJitOptions, resolveComponentResources as ɵresolveComponentResources, restoreComponentResolutionQueue as ɵrestoreComponentResolutionQueue, setAllowDuplicateNgModuleIdsForTest as ɵsetAllowDuplicateNgModuleIdsForTest, setAlternateWeakRefImpl as ɵsetAlternateWeakRefImpl, ɵsetClassDebugInfo, setClassMetadata as ɵsetClassMetadata, setClassMetadataAsync as ɵsetClassMetadataAsync, setCurrentInjector as ɵsetCurrentInjector, setDocument as ɵsetDocument, setInjectorProfilerContext as ɵsetInjectorProfilerContext, setLocaleId as ɵsetLocaleId, ɵsetUnknownElementStrictMode, ɵsetUnknownPropertyStrictMode, startMeasuring as ɵstartMeasuring, stopMeasuring as ɵstopMeasuring, store as ɵstore, stringify as ɵstringify, transitiveScopesFor as ɵtransitiveScopesFor, triggerResourceLoading as ɵtriggerResourceLoading, truncateMiddle as ɵtruncateMiddle, unregisterAllLocaleData as ɵunregisterLocaleData, unwrapSafeValue as ɵunwrapSafeValue, ɵunwrapWritableSignal, withDomHydration as ɵwithDomHydration, withEventReplay as ɵwithEventReplay, withI18nSupport as ɵwithI18nSupport, withIncrementalHydration as ɵwithIncrementalHydration, ɵɵCopyDefinitionFeature, ɵɵExternalStylesFeature, FactoryTarget as ɵɵFactoryTarget, ɵɵHostDirectivesFeature, ɵɵInheritDefinitionFeature, ɵɵInputTransformsFeature, ɵɵNgOnChangesFeature, ɵɵProvidersFeature, ɵɵadvance, ɵɵattachSourceLocations, ɵɵattribute, ɵɵattributeInterpolate1, ɵɵattributeInterpolate2, ɵɵattributeInterpolate3, ɵɵattributeInterpolate4, ɵɵattributeInterpolate5, ɵɵattributeInterpolate6, ɵɵattributeInterpolate7, ɵɵattributeInterpolate8, ɵɵattributeInterpolateV, ɵɵclassMap, ɵɵclassMapInterpolate1, ɵɵclassMapInterpolate2, ɵɵclassMapInterpolate3, ɵɵclassMapInterpolate4, ɵɵclassMapInterpolate5, ɵɵclassMapInterpolate6, ɵɵclassMapInterpolate7, ɵɵclassMapInterpolate8, ɵɵclassMapInterpolateV, ɵɵclassProp, ɵɵcomponentInstance, ɵɵconditional, ɵɵcontentQuery, ɵɵcontentQuerySignal, ɵɵdeclareLet, ɵɵdefer, ɵɵdeferEnableTimerScheduling, ɵɵdeferHydrateNever, ɵɵdeferHydrateOnHover, ɵɵdeferHydrateOnIdle, ɵɵdeferHydrateOnImmediate, ɵɵdeferHydrateOnInteraction, ɵɵdeferHydrateOnTimer, ɵɵdeferHydrateOnViewport, ɵɵdeferHydrateWhen, ɵɵdeferOnHover, ɵɵdeferOnIdle, ɵɵdeferOnImmediate, ɵɵdeferOnInteraction, ɵɵdeferOnTimer, ɵɵdeferOnViewport, ɵɵdeferPrefetchOnHover, ɵɵdeferPrefetchOnIdle, ɵɵdeferPrefetchOnImmediate, ɵɵdeferPrefetchOnInteraction, ɵɵdeferPrefetchOnTimer, ɵɵdeferPrefetchOnViewport, ɵɵdeferPrefetchWhen, ɵɵdeferWhen, ɵɵdefineComponent, ɵɵdefineDirective, ɵɵdefineInjectable, ɵɵdefineInjector, ɵɵdefineNgModule, ɵɵdefinePipe, ɵɵdirectiveInject, ɵɵdisableBindings, ɵɵelement, ɵɵelementContainer, ɵɵelementContainerEnd, ɵɵelementContainerStart, ɵɵelementEnd, ɵɵelementStart, ɵɵenableBindings, ɵɵgetComponentDepsFactory, ɵɵgetCurrentView, ɵɵgetInheritedFactory, ɵɵhostProperty, ɵɵi18n, ɵɵi18nApply, ɵɵi18nAttributes, ɵɵi18nEnd, ɵɵi18nExp, ɵɵi18nPostprocess, ɵɵi18nStart, ɵɵinject, ɵɵinjectAttribute, ɵɵinvalidFactory, ɵɵinvalidFactoryDep, ɵɵlistener, ɵɵloadQuery, ɵɵnamespaceHTML, ɵɵnamespaceMathML, ɵɵnamespaceSVG, ɵɵnextContext, ɵɵngDeclareClassMetadata, ɵɵngDeclareClassMetadataAsync, ɵɵngDeclareComponent, ɵɵngDeclareDirective, ɵɵngDeclareFactory, ɵɵngDeclareInjectable, ɵɵngDeclareInjector, ɵɵngDeclareNgModule, ɵɵngDeclarePipe, ɵɵpipe, ɵɵpipeBind1, ɵɵpipeBind2, ɵɵpipeBind3, ɵɵpipeBind4, ɵɵpipeBindV, ɵɵprojection, ɵɵprojectionDef, ɵɵproperty, ɵɵpropertyInterpolate, ɵɵpropertyInterpolate1, ɵɵpropertyInterpolate2, ɵɵpropertyInterpolate3, ɵɵpropertyInterpolate4, ɵɵpropertyInterpolate5, ɵɵpropertyInterpolate6, ɵɵpropertyInterpolate7, ɵɵpropertyInterpolate8, ɵɵpropertyInterpolateV, ɵɵpureFunction0, ɵɵpureFunction1, ɵɵpureFunction2, ɵɵpureFunction3, ɵɵpureFunction4, ɵɵpureFunction5, ɵɵpureFunction6, ɵɵpureFunction7, ɵɵpureFunction8, ɵɵpureFunctionV, ɵɵqueryAdvance, ɵɵqueryRefresh, ɵɵreadContextLet, ɵɵreference, registerNgModuleType as ɵɵregisterNgModuleType, ɵɵrepeater, ɵɵrepeaterCreate, ɵɵrepeaterTrackByIdentity, ɵɵrepeaterTrackByIndex, ɵɵreplaceMetadata, ɵɵresetView, ɵɵresolveBody, ɵɵresolveDocument, ɵɵresolveWindow, ɵɵrestoreView, ɵɵsanitizeHtml, ɵɵsanitizeResourceUrl, ɵɵsanitizeScript, ɵɵsanitizeStyle, ɵɵsanitizeUrl, ɵɵsanitizeUrlOrResourceUrl, ɵɵsetComponentScope, ɵɵsetNgModuleScope, ɵɵstoreLet, ɵɵstyleMap, ɵɵstyleMapInterpolate1, ɵɵstyleMapInterpolate2, ɵɵstyleMapInterpolate3, ɵɵstyleMapInterpolate4, ɵɵstyleMapInterpolate5, ɵɵstyleMapInterpolate6, ɵɵstyleMapInterpolate7, ɵɵstyleMapInterpolate8, ɵɵstyleMapInterpolateV, ɵɵstyleProp, ɵɵstylePropInterpolate1, ɵɵstylePropInterpolate2, ɵɵstylePropInterpolate3, ɵɵstylePropInterpolate4, ɵɵstylePropInterpolate5, ɵɵstylePropInterpolate6, ɵɵstylePropInterpolate7, ɵɵstylePropInterpolate8, ɵɵstylePropInterpolateV, ɵɵsyntheticHostListener, ɵɵsyntheticHostProperty, ɵɵtemplate, ɵɵtemplateRefExtractor, ɵɵtext, ɵɵtextInterpolate, ɵɵtextInterpolate1, ɵɵtextInterpolate2, ɵɵtextInterpolate3, ɵɵtextInterpolate4, ɵɵtextInterpolate5, ɵɵtextInterpolate6, ɵɵtextInterpolate7, ɵɵtextInterpolate8, ɵɵtextInterpolateV, ɵɵtrustConstantHtml, ɵɵtrustConstantResourceUrl, ɵɵtwoWayBindingSet, ɵɵtwoWayListener, ɵɵtwoWayProperty, ɵɵvalidateIframeAttribute, ɵɵviewQuery, ɵɵviewQuerySignal };
|
|
41855
|
+
export { ANIMATION_MODULE_TYPE, APP_BOOTSTRAP_LISTENER, APP_ID, APP_INITIALIZER, AfterRenderPhase, ApplicationInitStatus, ApplicationModule, ApplicationRef, Attribute, COMPILER_OPTIONS, CSP_NONCE, CUSTOM_ELEMENTS_SCHEMA, ChangeDetectionStrategy, ChangeDetectorRef, Compiler, CompilerFactory, Component, ComponentFactory$1 as ComponentFactory, ComponentFactoryResolver$1 as ComponentFactoryResolver, ComponentRef$1 as ComponentRef, ContentChild, ContentChildren, DEFAULT_CURRENCY_CODE, DebugElement, DebugEventListener, DebugNode, DefaultIterableDiffer, DestroyRef, Directive, ENVIRONMENT_INITIALIZER, ElementRef, EmbeddedViewRef, EnvironmentInjector, ErrorHandler, EventEmitter, HOST_TAG_NAME, Host, HostAttributeToken, HostBinding, HostListener, INJECTOR$1 as INJECTOR, Inject, InjectFlags, Injectable, InjectionToken, Injector, Input, IterableDiffers, KeyValueDiffers, LOCALE_ID, MissingTranslationStrategy, ModuleWithComponentFactories, NO_ERRORS_SCHEMA, NgModule, NgModuleFactory$1 as NgModuleFactory, NgModuleRef$1 as NgModuleRef, NgProbeToken, NgZone, Optional, Output, OutputEmitterRef, PACKAGE_ROOT_URL, PLATFORM_ID, PLATFORM_INITIALIZER, PendingTasks, Pipe, PlatformRef, Query, QueryList, REQUEST, REQUEST_CONTEXT, RESPONSE_INIT, Renderer2, RendererFactory2, RendererStyleFlags2, ResourceStatus, Sanitizer, SecurityContext, Self, SimpleChange, SkipSelf, TRANSLATIONS, TRANSLATIONS_FORMAT, TemplateRef, Testability, TestabilityRegistry, TransferState, Type, VERSION, Version, ViewChild, ViewChildren, ViewContainerRef, ViewEncapsulation, ViewRef, afterNextRender, afterRender, afterRenderEffect, asNativeElements, assertInInjectionContext, assertNotInReactiveContext, assertPlatform, booleanAttribute, computed, contentChild, contentChildren, createComponent, createEnvironmentInjector, createNgModule, createNgModuleRef, createPlatform, createPlatformFactory, defineInjectable, destroyPlatform, effect, enableProdMode, forwardRef, getDebugNode, getModuleFactory, getNgModuleById, getPlatform, importProvidersFrom, inject, input, isDevMode, isSignal, isStandalone, linkedSignal, makeEnvironmentProviders, makeStateKey, mergeApplicationConfig, model, numberAttribute, output, platformCore, provideAppInitializer, provideEnvironmentInitializer, provideExperimentalCheckNoChangesForDebug, provideExperimentalZonelessChangeDetection, providePlatformInitializer, provideZoneChangeDetection, reflectComponentType, resolveForwardRef, resource, runInInjectionContext, setTestabilityGetter, signal, untracked, viewChild, viewChildren, ALLOW_MULTIPLE_PLATFORMS as ɵALLOW_MULTIPLE_PLATFORMS, AfterRenderManager as ɵAfterRenderManager, CONTAINER_HEADER_OFFSET as ɵCONTAINER_HEADER_OFFSET, ChangeDetectionScheduler as ɵChangeDetectionScheduler, ChangeDetectionSchedulerImpl as ɵChangeDetectionSchedulerImpl, ComponentFactory$1 as ɵComponentFactory, Console as ɵConsole, DEFAULT_LOCALE_ID as ɵDEFAULT_LOCALE_ID, DEFER_BLOCK_CONFIG as ɵDEFER_BLOCK_CONFIG, DEFER_BLOCK_DEPENDENCY_INTERCEPTOR as ɵDEFER_BLOCK_DEPENDENCY_INTERCEPTOR, DeferBlockBehavior as ɵDeferBlockBehavior, DeferBlockState as ɵDeferBlockState, ENABLE_ROOT_COMPONENT_BOOTSTRAP as ɵENABLE_ROOT_COMPONENT_BOOTSTRAP, EffectScheduler as ɵEffectScheduler, IMAGE_CONFIG as ɵIMAGE_CONFIG, IMAGE_CONFIG_DEFAULTS as ɵIMAGE_CONFIG_DEFAULTS, INJECTOR_SCOPE as ɵINJECTOR_SCOPE, ɵINPUT_SIGNAL_BRAND_WRITE_TYPE, INTERNAL_APPLICATION_ERROR_HANDLER as ɵINTERNAL_APPLICATION_ERROR_HANDLER, IS_HYDRATION_DOM_REUSE_ENABLED as ɵIS_HYDRATION_DOM_REUSE_ENABLED, IS_INCREMENTAL_HYDRATION_ENABLED as ɵIS_INCREMENTAL_HYDRATION_ENABLED, JSACTION_EVENT_CONTRACT as ɵJSACTION_EVENT_CONTRACT, LContext as ɵLContext, LocaleDataIndex as ɵLocaleDataIndex, MicrotaskEffectScheduler as ɵMicrotaskEffectScheduler, NG_COMP_DEF as ɵNG_COMP_DEF, NG_DIR_DEF as ɵNG_DIR_DEF, NG_ELEMENT_ID as ɵNG_ELEMENT_ID, NG_INJ_DEF as ɵNG_INJ_DEF, NG_MOD_DEF as ɵNG_MOD_DEF, NG_PIPE_DEF as ɵNG_PIPE_DEF, NG_PROV_DEF as ɵNG_PROV_DEF, NOT_FOUND_CHECK_ONLY_ELEMENT_INJECTOR as ɵNOT_FOUND_CHECK_ONLY_ELEMENT_INJECTOR, NO_CHANGE as ɵNO_CHANGE, NgModuleFactory as ɵNgModuleFactory, NoopNgZone as ɵNoopNgZone, PERFORMANCE_MARK_PREFIX as ɵPERFORMANCE_MARK_PREFIX, PROVIDED_NG_ZONE as ɵPROVIDED_NG_ZONE, PendingTasksInternal as ɵPendingTasksInternal, ReflectionCapabilities as ɵReflectionCapabilities, ComponentFactory as ɵRender3ComponentFactory, ComponentRef as ɵRender3ComponentRef, NgModuleRef as ɵRender3NgModuleRef, ResourceImpl as ɵResourceImpl, RuntimeError as ɵRuntimeError, SSR_CONTENT_INTEGRITY_MARKER as ɵSSR_CONTENT_INTEGRITY_MARKER, TESTABILITY as ɵTESTABILITY, TESTABILITY_GETTER as ɵTESTABILITY_GETTER, TracingAction as ɵTracingAction, TracingService as ɵTracingService, USE_RUNTIME_DEPS_TRACKER_FOR_JIT as ɵUSE_RUNTIME_DEPS_TRACKER_FOR_JIT, ViewRef$1 as ɵViewRef, XSS_SECURITY_URL as ɵXSS_SECURITY_URL, ZONELESS_ENABLED as ɵZONELESS_ENABLED, _sanitizeHtml as ɵ_sanitizeHtml, _sanitizeUrl as ɵ_sanitizeUrl, allowSanitizationBypassAndThrow as ɵallowSanitizationBypassAndThrow, annotateForHydration as ɵannotateForHydration, bypassSanitizationTrustHtml as ɵbypassSanitizationTrustHtml, bypassSanitizationTrustResourceUrl as ɵbypassSanitizationTrustResourceUrl, bypassSanitizationTrustScript as ɵbypassSanitizationTrustScript, bypassSanitizationTrustStyle as ɵbypassSanitizationTrustStyle, bypassSanitizationTrustUrl as ɵbypassSanitizationTrustUrl, clearResolutionOfComponentResourcesQueue as ɵclearResolutionOfComponentResourcesQueue, compileComponent as ɵcompileComponent, compileDirective as ɵcompileDirective, compileNgModule as ɵcompileNgModule, compileNgModuleDefs as ɵcompileNgModuleDefs, compileNgModuleFactory as ɵcompileNgModuleFactory, compilePipe as ɵcompilePipe, convertToBitFlags as ɵconvertToBitFlags, createInjector as ɵcreateInjector, defaultIterableDiffers as ɵdefaultIterableDiffers, defaultKeyValueDiffers as ɵdefaultKeyValueDiffers, depsTracker as ɵdepsTracker, detectChangesInViewIfRequired as ɵdetectChangesInViewIfRequired, devModeEqual as ɵdevModeEqual, disableProfiling as ɵdisableProfiling, enableProfiling as ɵenableProfiling, findLocaleData as ɵfindLocaleData, flushModuleScopingQueueAsMuchAsPossible as ɵflushModuleScopingQueueAsMuchAsPossible, formatRuntimeError as ɵformatRuntimeError, generateStandaloneInDeclarationsError as ɵgenerateStandaloneInDeclarationsError, getAsyncClassMetadataFn as ɵgetAsyncClassMetadataFn, getClosestComponentName as ɵgetClosestComponentName, getDebugNode as ɵgetDebugNode, getDeferBlocks$1 as ɵgetDeferBlocks, getDirectives as ɵgetDirectives, getHostElement as ɵgetHostElement, getInjectableDef as ɵgetInjectableDef, getLContext as ɵgetLContext, getLocaleCurrencyCode as ɵgetLocaleCurrencyCode, getLocalePluralCase as ɵgetLocalePluralCase, getOutputDestroyRef as ɵgetOutputDestroyRef, getSanitizationBypassType as ɵgetSanitizationBypassType, ɵgetUnknownElementStrictMode, ɵgetUnknownPropertyStrictMode, _global as ɵglobal, injectChangeDetectorRef as ɵinjectChangeDetectorRef, internalCreateApplication as ɵinternalCreateApplication, internalProvideZoneChangeDetection as ɵinternalProvideZoneChangeDetection, isBoundToModule as ɵisBoundToModule, isComponentDefPendingResolution as ɵisComponentDefPendingResolution, isEnvironmentProviders as ɵisEnvironmentProviders, isInjectable as ɵisInjectable, isNgModule as ɵisNgModule, isPromise as ɵisPromise, isSubscribable as ɵisSubscribable, microtaskEffect as ɵmicrotaskEffect, noSideEffects as ɵnoSideEffects, patchComponentDefWithScope as ɵpatchComponentDefWithScope, performanceMarkFeature as ɵperformanceMarkFeature, publishExternalGlobalUtil as ɵpublishExternalGlobalUtil, readHydrationInfo as ɵreadHydrationInfo, registerLocaleData as ɵregisterLocaleData, renderDeferBlockState as ɵrenderDeferBlockState, resetCompiledComponents as ɵresetCompiledComponents, resetJitOptions as ɵresetJitOptions, resolveComponentResources as ɵresolveComponentResources, restoreComponentResolutionQueue as ɵrestoreComponentResolutionQueue, setAllowDuplicateNgModuleIdsForTest as ɵsetAllowDuplicateNgModuleIdsForTest, setAlternateWeakRefImpl as ɵsetAlternateWeakRefImpl, ɵsetClassDebugInfo, setClassMetadata as ɵsetClassMetadata, setClassMetadataAsync as ɵsetClassMetadataAsync, setCurrentInjector as ɵsetCurrentInjector, setDocument as ɵsetDocument, setInjectorProfilerContext as ɵsetInjectorProfilerContext, setLocaleId as ɵsetLocaleId, ɵsetUnknownElementStrictMode, ɵsetUnknownPropertyStrictMode, startMeasuring as ɵstartMeasuring, stopMeasuring as ɵstopMeasuring, store as ɵstore, stringify as ɵstringify, transitiveScopesFor as ɵtransitiveScopesFor, triggerResourceLoading as ɵtriggerResourceLoading, truncateMiddle as ɵtruncateMiddle, unregisterAllLocaleData as ɵunregisterLocaleData, unwrapSafeValue as ɵunwrapSafeValue, ɵunwrapWritableSignal, withDomHydration as ɵwithDomHydration, withEventReplay as ɵwithEventReplay, withI18nSupport as ɵwithI18nSupport, withIncrementalHydration as ɵwithIncrementalHydration, ɵɵCopyDefinitionFeature, ɵɵExternalStylesFeature, FactoryTarget as ɵɵFactoryTarget, ɵɵHostDirectivesFeature, ɵɵInheritDefinitionFeature, ɵɵNgOnChangesFeature, ɵɵProvidersFeature, ɵɵadvance, ɵɵattachSourceLocations, ɵɵattribute, ɵɵattributeInterpolate1, ɵɵattributeInterpolate2, ɵɵattributeInterpolate3, ɵɵattributeInterpolate4, ɵɵattributeInterpolate5, ɵɵattributeInterpolate6, ɵɵattributeInterpolate7, ɵɵattributeInterpolate8, ɵɵattributeInterpolateV, ɵɵclassMap, ɵɵclassMapInterpolate1, ɵɵclassMapInterpolate2, ɵɵclassMapInterpolate3, ɵɵclassMapInterpolate4, ɵɵclassMapInterpolate5, ɵɵclassMapInterpolate6, ɵɵclassMapInterpolate7, ɵɵclassMapInterpolate8, ɵɵclassMapInterpolateV, ɵɵclassProp, ɵɵcomponentInstance, ɵɵconditional, ɵɵcontentQuery, ɵɵcontentQuerySignal, ɵɵdeclareLet, ɵɵdefer, ɵɵdeferEnableTimerScheduling, ɵɵdeferHydrateNever, ɵɵdeferHydrateOnHover, ɵɵdeferHydrateOnIdle, ɵɵdeferHydrateOnImmediate, ɵɵdeferHydrateOnInteraction, ɵɵdeferHydrateOnTimer, ɵɵdeferHydrateOnViewport, ɵɵdeferHydrateWhen, ɵɵdeferOnHover, ɵɵdeferOnIdle, ɵɵdeferOnImmediate, ɵɵdeferOnInteraction, ɵɵdeferOnTimer, ɵɵdeferOnViewport, ɵɵdeferPrefetchOnHover, ɵɵdeferPrefetchOnIdle, ɵɵdeferPrefetchOnImmediate, ɵɵdeferPrefetchOnInteraction, ɵɵdeferPrefetchOnTimer, ɵɵdeferPrefetchOnViewport, ɵɵdeferPrefetchWhen, ɵɵdeferWhen, ɵɵdefineComponent, ɵɵdefineDirective, ɵɵdefineInjectable, ɵɵdefineInjector, ɵɵdefineNgModule, ɵɵdefinePipe, ɵɵdirectiveInject, ɵɵdisableBindings, ɵɵelement, ɵɵelementContainer, ɵɵelementContainerEnd, ɵɵelementContainerStart, ɵɵelementEnd, ɵɵelementStart, ɵɵenableBindings, ɵɵgetComponentDepsFactory, ɵɵgetCurrentView, ɵɵgetInheritedFactory, ɵɵhostProperty, ɵɵi18n, ɵɵi18nApply, ɵɵi18nAttributes, ɵɵi18nEnd, ɵɵi18nExp, ɵɵi18nPostprocess, ɵɵi18nStart, ɵɵinject, ɵɵinjectAttribute, ɵɵinvalidFactory, ɵɵinvalidFactoryDep, ɵɵlistener, ɵɵloadQuery, ɵɵnamespaceHTML, ɵɵnamespaceMathML, ɵɵnamespaceSVG, ɵɵnextContext, ɵɵngDeclareClassMetadata, ɵɵngDeclareClassMetadataAsync, ɵɵngDeclareComponent, ɵɵngDeclareDirective, ɵɵngDeclareFactory, ɵɵngDeclareInjectable, ɵɵngDeclareInjector, ɵɵngDeclareNgModule, ɵɵngDeclarePipe, ɵɵpipe, ɵɵpipeBind1, ɵɵpipeBind2, ɵɵpipeBind3, ɵɵpipeBind4, ɵɵpipeBindV, ɵɵprojection, ɵɵprojectionDef, ɵɵproperty, ɵɵpropertyInterpolate, ɵɵpropertyInterpolate1, ɵɵpropertyInterpolate2, ɵɵpropertyInterpolate3, ɵɵpropertyInterpolate4, ɵɵpropertyInterpolate5, ɵɵpropertyInterpolate6, ɵɵpropertyInterpolate7, ɵɵpropertyInterpolate8, ɵɵpropertyInterpolateV, ɵɵpureFunction0, ɵɵpureFunction1, ɵɵpureFunction2, ɵɵpureFunction3, ɵɵpureFunction4, ɵɵpureFunction5, ɵɵpureFunction6, ɵɵpureFunction7, ɵɵpureFunction8, ɵɵpureFunctionV, ɵɵqueryAdvance, ɵɵqueryRefresh, ɵɵreadContextLet, ɵɵreference, registerNgModuleType as ɵɵregisterNgModuleType, ɵɵrepeater, ɵɵrepeaterCreate, ɵɵrepeaterTrackByIdentity, ɵɵrepeaterTrackByIndex, ɵɵreplaceMetadata, ɵɵresetView, ɵɵresolveBody, ɵɵresolveDocument, ɵɵresolveWindow, ɵɵrestoreView, ɵɵsanitizeHtml, ɵɵsanitizeResourceUrl, ɵɵsanitizeScript, ɵɵsanitizeStyle, ɵɵsanitizeUrl, ɵɵsanitizeUrlOrResourceUrl, ɵɵsetComponentScope, ɵɵsetNgModuleScope, ɵɵstoreLet, ɵɵstyleMap, ɵɵstyleMapInterpolate1, ɵɵstyleMapInterpolate2, ɵɵstyleMapInterpolate3, ɵɵstyleMapInterpolate4, ɵɵstyleMapInterpolate5, ɵɵstyleMapInterpolate6, ɵɵstyleMapInterpolate7, ɵɵstyleMapInterpolate8, ɵɵstyleMapInterpolateV, ɵɵstyleProp, ɵɵstylePropInterpolate1, ɵɵstylePropInterpolate2, ɵɵstylePropInterpolate3, ɵɵstylePropInterpolate4, ɵɵstylePropInterpolate5, ɵɵstylePropInterpolate6, ɵɵstylePropInterpolate7, ɵɵstylePropInterpolate8, ɵɵstylePropInterpolateV, ɵɵsyntheticHostListener, ɵɵsyntheticHostProperty, ɵɵtemplate, ɵɵtemplateRefExtractor, ɵɵtext, ɵɵtextInterpolate, ɵɵtextInterpolate1, ɵɵtextInterpolate2, ɵɵtextInterpolate3, ɵɵtextInterpolate4, ɵɵtextInterpolate5, ɵɵtextInterpolate6, ɵɵtextInterpolate7, ɵɵtextInterpolate8, ɵɵtextInterpolateV, ɵɵtrustConstantHtml, ɵɵtrustConstantResourceUrl, ɵɵtwoWayBindingSet, ɵɵtwoWayListener, ɵɵtwoWayProperty, ɵɵvalidateIframeAttribute, ɵɵviewQuery, ɵɵviewQuerySignal };
|
|
41679
41856
|
//# sourceMappingURL=core.mjs.map
|