@angular/core 17.1.0-next.4 → 17.1.0-rc.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.
Files changed (87) hide show
  1. package/esm2022/primitives/signals/index.mjs +2 -2
  2. package/esm2022/primitives/signals/src/signal.mjs +2 -10
  3. package/esm2022/src/application/application_ref.mjs +24 -12
  4. package/esm2022/src/application/create_application.mjs +2 -2
  5. package/esm2022/src/authoring/input.mjs +12 -5
  6. package/esm2022/src/authoring/input_signal.mjs +28 -1
  7. package/esm2022/src/authoring/input_signal_node.mjs +22 -0
  8. package/esm2022/src/authoring.mjs +1 -4
  9. package/esm2022/src/change_detection/flags.mjs +16 -0
  10. package/esm2022/src/change_detection/scheduling/ng_zone_scheduling.mjs +164 -0
  11. package/esm2022/src/change_detection/scheduling/zoneless_scheduling.mjs +13 -0
  12. package/esm2022/src/change_detection/scheduling/zoneless_scheduling_impl.mjs +56 -0
  13. package/esm2022/src/compiler/compiler_facade_interface.mjs +1 -1
  14. package/esm2022/src/core.mjs +3 -3
  15. package/esm2022/src/core_private_export.mjs +5 -2
  16. package/esm2022/src/core_render3_private_export.mjs +2 -2
  17. package/esm2022/src/defer/dom_triggers.mjs +1 -5
  18. package/esm2022/src/di/inject_switch.mjs +2 -3
  19. package/esm2022/src/di/r3_injector.mjs +8 -6
  20. package/esm2022/src/errors.mjs +1 -1
  21. package/esm2022/src/event_emitter.mjs +1 -2
  22. package/esm2022/src/hydration/utils.mjs +2 -2
  23. package/esm2022/src/hydration/views.mjs +2 -2
  24. package/esm2022/src/linker/view_container_ref.mjs +2 -2
  25. package/esm2022/src/metadata/directives.mjs +1 -1
  26. package/esm2022/src/pending_tasks.mjs +57 -0
  27. package/esm2022/src/platform/platform_ref.mjs +2 -2
  28. package/esm2022/src/render3/after_render_hooks.mjs +16 -34
  29. package/esm2022/src/render3/apply_value_input_field.mjs +16 -0
  30. package/esm2022/src/render3/collect_native_nodes.mjs +2 -3
  31. package/esm2022/src/render3/component_ref.mjs +24 -13
  32. package/esm2022/src/render3/debug/injector_profiler.mjs +1 -1
  33. package/esm2022/src/render3/definition.mjs +27 -68
  34. package/esm2022/src/render3/errors_di.mjs +4 -3
  35. package/esm2022/src/render3/features/host_directives_feature.mjs +2 -3
  36. package/esm2022/src/render3/features/inherit_definition_feature.mjs +31 -9
  37. package/esm2022/src/render3/features/input_transforms_feature.mjs +4 -5
  38. package/esm2022/src/render3/features/ng_onchanges_feature.mjs +4 -3
  39. package/esm2022/src/render3/instructions/advance.mjs +2 -2
  40. package/esm2022/src/render3/instructions/change_detection.mjs +1 -6
  41. package/esm2022/src/render3/instructions/control_flow.mjs +5 -3
  42. package/esm2022/src/render3/instructions/listener.mjs +1 -1
  43. package/esm2022/src/render3/instructions/mark_view_dirty.mjs +4 -3
  44. package/esm2022/src/render3/instructions/shared.mjs +63 -59
  45. package/esm2022/src/render3/instructions/write_to_directive_input.mjs +43 -0
  46. package/esm2022/src/render3/interfaces/container.mjs +1 -6
  47. package/esm2022/src/render3/interfaces/definition.mjs +8 -2
  48. package/esm2022/src/render3/interfaces/node.mjs +1 -1
  49. package/esm2022/src/render3/interfaces/view.mjs +1 -1
  50. package/esm2022/src/render3/jit/environment.mjs +3 -1
  51. package/esm2022/src/render3/node_manipulation.mjs +8 -8
  52. package/esm2022/src/render3/reactivity/effect.mjs +8 -6
  53. package/esm2022/src/render3/reactivity/signal.mjs +1 -1
  54. package/esm2022/src/render3/styling/style_binding_list.mjs +4 -4
  55. package/esm2022/src/render3/util/discovery_utils.mjs +37 -5
  56. package/esm2022/src/render3/util/global_utils.mjs +28 -28
  57. package/esm2022/src/render3/util/injector_discovery_utils.mjs +1 -1
  58. package/esm2022/src/render3/util/injector_utils.mjs +6 -5
  59. package/esm2022/src/render3/util/view_traversal_utils.mjs +3 -12
  60. package/esm2022/src/render3/util/view_utils.mjs +36 -19
  61. package/esm2022/src/render3/view_ref.mjs +2 -1
  62. package/esm2022/src/testability/testability.mjs +3 -15
  63. package/esm2022/src/util/empty.mjs +1 -1
  64. package/esm2022/src/version.mjs +6 -5
  65. package/esm2022/src/zone/ng_zone.mjs +1 -61
  66. package/esm2022/testing/src/component_fixture.mjs +62 -58
  67. package/esm2022/testing/src/logger.mjs +3 -3
  68. package/fesm2022/core.mjs +699 -542
  69. package/fesm2022/core.mjs.map +1 -1
  70. package/fesm2022/primitives/signals.mjs +2 -10
  71. package/fesm2022/primitives/signals.mjs.map +1 -1
  72. package/fesm2022/rxjs-interop.mjs +1 -1
  73. package/fesm2022/testing.mjs +62 -58
  74. package/fesm2022/testing.mjs.map +1 -1
  75. package/index.d.ts +677 -252
  76. package/package.json +1 -1
  77. package/primitives/signals/index.d.ts +3 -4
  78. package/rxjs-interop/index.d.ts +1 -1
  79. package/schematics/migrations/block-template-entities/bundle.js +497 -392
  80. package/schematics/migrations/block-template-entities/bundle.js.map +4 -4
  81. package/schematics/ng-generate/control-flow-migration/bundle.js +663 -459
  82. package/schematics/ng-generate/control-flow-migration/bundle.js.map +4 -4
  83. package/schematics/ng-generate/standalone-migration/bundle.js +816 -616
  84. package/schematics/ng-generate/standalone-migration/bundle.js.map +4 -4
  85. package/testing/index.d.ts +6 -2
  86. package/esm2022/src/change_detection/scheduling.mjs +0 -103
  87. package/esm2022/src/initial_render_pending_tasks.mjs +0 -49
package/fesm2022/core.mjs CHANGED
@@ -1,20 +1,118 @@
1
1
  /**
2
- * @license Angular v17.1.0-next.4
2
+ * @license Angular v17.1.0-rc.0
3
3
  * (c) 2010-2022 Google LLC. https://angular.io/
4
4
  * License: MIT
5
5
  */
6
6
 
7
- import { setActiveConsumer as setActiveConsumer$1, consumerDestroy as consumerDestroy$1, SIGNAL as SIGNAL$1, createComputed as createComputed$1, createSignal as createSignal$1, signalSetFn as signalSetFn$1, signalUpdateFn as signalUpdateFn$1, REACTIVE_NODE as REACTIVE_NODE$1, consumerBeforeComputation as consumerBeforeComputation$1, consumerAfterComputation as consumerAfterComputation$1, consumerPollProducersForChange as consumerPollProducersForChange$1, getActiveConsumer as getActiveConsumer$1, createWatch as createWatch$1, setThrowInvalidWriteToSignalError as setThrowInvalidWriteToSignalError$1 } from '@angular/core/primitives/signals';
8
- import { Subject, Subscription, Observable, merge as merge$1, BehaviorSubject, of } from 'rxjs';
9
- import { share, switchMap, distinctUntilChanged, first } from 'rxjs/operators';
7
+ import { SIGNAL_NODE as SIGNAL_NODE$1, signalSetFn as signalSetFn$1, producerAccessed as producerAccessed$1, SIGNAL as SIGNAL$1, setActiveConsumer as setActiveConsumer$1, consumerDestroy as consumerDestroy$1, createComputed as createComputed$1, createSignal as createSignal$1, signalUpdateFn as signalUpdateFn$1, REACTIVE_NODE as REACTIVE_NODE$1, consumerBeforeComputation as consumerBeforeComputation$1, consumerAfterComputation as consumerAfterComputation$1, consumerPollProducersForChange as consumerPollProducersForChange$1, getActiveConsumer as getActiveConsumer$1, createWatch as createWatch$1, setThrowInvalidWriteToSignalError as setThrowInvalidWriteToSignalError$1 } from '@angular/core/primitives/signals';
8
+ import { Subject, Subscription, BehaviorSubject } from 'rxjs';
9
+ import { map, first } from 'rxjs/operators';
10
10
 
11
- function inputFunction(_initialValue, _opts) {
12
- throw new Error('TODO');
11
+ /**
12
+ * Base URL for the error details page.
13
+ *
14
+ * Keep this constant in sync across:
15
+ * - packages/compiler-cli/src/ngtsc/diagnostics/src/error_details_base_url.ts
16
+ * - packages/core/src/error_details_base_url.ts
17
+ */
18
+ const ERROR_DETAILS_PAGE_BASE_URL = 'https://angular.io/errors';
19
+ /**
20
+ * URL for the XSS security documentation.
21
+ */
22
+ const XSS_SECURITY_URL = 'https://g.co/ng/security#xss';
23
+
24
+ /**
25
+ * Class that represents a runtime error.
26
+ * Formats and outputs the error message in a consistent way.
27
+ *
28
+ * Example:
29
+ * ```
30
+ * throw new RuntimeError(
31
+ * RuntimeErrorCode.INJECTOR_ALREADY_DESTROYED,
32
+ * ngDevMode && 'Injector has already been destroyed.');
33
+ * ```
34
+ *
35
+ * Note: the `message` argument contains a descriptive error message as a string in development
36
+ * mode (when the `ngDevMode` is defined). In production mode (after tree-shaking pass), the
37
+ * `message` argument becomes `false`, thus we account for it in the typings and the runtime
38
+ * logic.
39
+ */
40
+ class RuntimeError extends Error {
41
+ constructor(code, message) {
42
+ super(formatRuntimeError(code, message));
43
+ this.code = code;
44
+ }
45
+ }
46
+ /**
47
+ * Called to format a runtime error.
48
+ * See additional info on the `message` argument type in the `RuntimeError` class description.
49
+ */
50
+ function formatRuntimeError(code, message) {
51
+ // Error code might be a negative number, which is a special marker that instructs the logic to
52
+ // generate a link to the error details page on angular.io.
53
+ // We also prepend `0` to non-compile-time errors.
54
+ const fullCode = `NG0${Math.abs(code)}`;
55
+ let errorMessage = `${fullCode}${message ? ': ' + message : ''}`;
56
+ if (ngDevMode && code < 0) {
57
+ const addPeriodSeparator = !errorMessage.match(/[.,;!?\n]$/);
58
+ const separator = addPeriodSeparator ? '.' : '';
59
+ errorMessage =
60
+ `${errorMessage}${separator} Find more at ${ERROR_DETAILS_PAGE_BASE_URL}/${fullCode}`;
61
+ }
62
+ return errorMessage;
63
+ }
64
+
65
+ const REQUIRED_UNSET_VALUE = /* @__PURE__ */ Symbol('InputSignalNode#UNSET');
66
+ // Note: Using an IIFE here to ensure that the spread assignment is not considered
67
+ // a side-effect, ending up preserving `COMPUTED_NODE` and `REACTIVE_NODE`.
68
+ // TODO: remove when https://github.com/evanw/esbuild/issues/3392 is resolved.
69
+ const INPUT_SIGNAL_NODE = /* @__PURE__ */ (() => {
70
+ return {
71
+ ...SIGNAL_NODE$1,
72
+ transformFn: undefined,
73
+ applyValueToInputSignal(node, value) {
74
+ signalSetFn$1(node, value);
75
+ }
76
+ };
77
+ })();
78
+
79
+ const ɵINPUT_SIGNAL_BRAND_READ_TYPE = /* @__PURE__ */ Symbol();
80
+ const ɵINPUT_SIGNAL_BRAND_WRITE_TYPE = /* @__PURE__ */ Symbol();
81
+ /**
82
+ * Creates an input signal.
83
+ *
84
+ * @param initialValue The initial value.
85
+ * Can be set to {@link REQUIRED_UNSET_VALUE} for required inputs.
86
+ * @param options Additional options for the input. e.g. a transform, or an alias.
87
+ */
88
+ function createInputSignal(initialValue, options) {
89
+ const node = Object.create(INPUT_SIGNAL_NODE);
90
+ node.value = initialValue;
91
+ // Perf note: Always set `transformFn` here to ensure that `node` always
92
+ // has the same v8 class shape, allowing monomorphic reads on input signals.
93
+ node.transformFn = options?.transform;
94
+ function inputValueFn() {
95
+ // Record that someone looked at this signal.
96
+ producerAccessed$1(node);
97
+ if (node.value === REQUIRED_UNSET_VALUE) {
98
+ throw new RuntimeError(-950 /* RuntimeErrorCode.REQUIRED_INPUT_NO_VALUE */, ngDevMode && 'Input is required but no value is available yet.');
99
+ }
100
+ return node.value;
101
+ }
102
+ inputValueFn[SIGNAL$1] = node;
103
+ return inputValueFn;
104
+ }
105
+
106
+ function inputFunction(initialValue, opts) {
107
+ return createInputSignal(initialValue, opts);
13
108
  }
14
- function inputRequiredFunction(_opts) {
15
- throw new Error('TODO');
109
+ function inputRequiredFunction(opts) {
110
+ return createInputSignal(REQUIRED_UNSET_VALUE, opts);
16
111
  }
17
112
  /**
113
+ * The `input` function allows declaration of inputs in directives and
114
+ * components.
115
+ *
18
116
  * Initializes an input with an initial value. If no explicit value
19
117
  * is specified, Angular will use `undefined`.
20
118
  *
@@ -33,6 +131,8 @@ function inputRequiredFunction(_opts) {
33
131
  * age = input(0); // number
34
132
  * }
35
133
  * ```
134
+ *
135
+ * @developerPreview
36
136
  */
37
137
  const input = (() => {
38
138
  // Note: This may be considered a side-effect, but nothing will depend on
@@ -42,11 +142,6 @@ const input = (() => {
42
142
  return inputFunction;
43
143
  })();
44
144
 
45
- const ɵINPUT_SIGNAL_BRAND_READ_TYPE = /* @__PURE__ */ Symbol();
46
- const ɵINPUT_SIGNAL_BRAND_WRITE_TYPE = /* @__PURE__ */ Symbol();
47
-
48
- // Note: `input` is exported in `core.ts` due to:
49
-
50
145
  function getClosureSafeProperty(objWithPropertyToExtract) {
51
146
  for (let key in objWithPropertyToExtract) {
52
147
  if (objWithPropertyToExtract[key] === getClosureSafeProperty) {
@@ -194,60 +289,6 @@ function isEnvironmentProviders(value) {
194
289
  return value && !!value.ɵproviders;
195
290
  }
196
291
 
197
- /**
198
- * Base URL for the error details page.
199
- *
200
- * Keep this constant in sync across:
201
- * - packages/compiler-cli/src/ngtsc/diagnostics/src/error_details_base_url.ts
202
- * - packages/core/src/error_details_base_url.ts
203
- */
204
- const ERROR_DETAILS_PAGE_BASE_URL = 'https://angular.io/errors';
205
- /**
206
- * URL for the XSS security documentation.
207
- */
208
- const XSS_SECURITY_URL = 'https://g.co/ng/security#xss';
209
-
210
- /**
211
- * Class that represents a runtime error.
212
- * Formats and outputs the error message in a consistent way.
213
- *
214
- * Example:
215
- * ```
216
- * throw new RuntimeError(
217
- * RuntimeErrorCode.INJECTOR_ALREADY_DESTROYED,
218
- * ngDevMode && 'Injector has already been destroyed.');
219
- * ```
220
- *
221
- * Note: the `message` argument contains a descriptive error message as a string in development
222
- * mode (when the `ngDevMode` is defined). In production mode (after tree-shaking pass), the
223
- * `message` argument becomes `false`, thus we account for it in the typings and the runtime
224
- * logic.
225
- */
226
- class RuntimeError extends Error {
227
- constructor(code, message) {
228
- super(formatRuntimeError(code, message));
229
- this.code = code;
230
- }
231
- }
232
- /**
233
- * Called to format a runtime error.
234
- * See additional info on the `message` argument type in the `RuntimeError` class description.
235
- */
236
- function formatRuntimeError(code, message) {
237
- // Error code might be a negative number, which is a special marker that instructs the logic to
238
- // generate a link to the error details page on angular.io.
239
- // We also prepend `0` to non-compile-time errors.
240
- const fullCode = `NG0${Math.abs(code)}`;
241
- let errorMessage = `${fullCode}${message ? ': ' + message : ''}`;
242
- if (ngDevMode && code < 0) {
243
- const addPeriodSeparator = !errorMessage.match(/[.,;!?\n]$/);
244
- const separator = addPeriodSeparator ? '.' : '';
245
- errorMessage =
246
- `${errorMessage}${separator} Find more at ${ERROR_DETAILS_PAGE_BASE_URL}/${fullCode}`;
247
- }
248
- return errorMessage;
249
- }
250
-
251
292
  const NG_COMP_DEF = getClosureSafeProperty({ ɵcmp: getClosureSafeProperty });
252
293
  const NG_DIR_DEF = getClosureSafeProperty({ ɵdir: getClosureSafeProperty });
253
294
  const NG_PIPE_DEF = getClosureSafeProperty({ ɵpipe: getClosureSafeProperty });
@@ -352,8 +393,9 @@ function throwInvalidProviderError(ngModuleType, providers, provider) {
352
393
  }
353
394
  /** Throws an error when a token is not found in DI. */
354
395
  function throwProviderNotFoundError(token, injectorName) {
355
- const injectorDetails = injectorName ? ` in ${injectorName}` : '';
356
- throw new RuntimeError(-201 /* RuntimeErrorCode.PROVIDER_NOT_FOUND */, ngDevMode && `No provider for ${stringifyForError(token)} found${injectorDetails}`);
396
+ const errorMessage = ngDevMode &&
397
+ `No provider for ${stringifyForError(token)} found${injectorName ? ` in ${injectorName}` : ''}`;
398
+ throw new RuntimeError(-201 /* RuntimeErrorCode.PROVIDER_NOT_FOUND */, errorMessage);
357
399
  }
358
400
 
359
401
  // The functions in this file verify that the assumptions we are making
@@ -624,7 +666,7 @@ function injectRootLimpMode(token, notFoundValue, flags) {
624
666
  return null;
625
667
  if (notFoundValue !== undefined)
626
668
  return notFoundValue;
627
- throwProviderNotFoundError(stringify(token), 'Injector');
669
+ throwProviderNotFoundError(token, 'Injector');
628
670
  }
629
671
  /**
630
672
  * Assert that `_injectImplementation` is not `fn`.
@@ -1234,6 +1276,14 @@ if ((typeof ngDevMode === 'undefined' || ngDevMode) && initNgDevMode()) {
1234
1276
  Object.freeze(EMPTY_ARRAY);
1235
1277
  }
1236
1278
 
1279
+ /** Flags describing an input for a directive. */
1280
+ var InputFlags;
1281
+ (function (InputFlags) {
1282
+ InputFlags[InputFlags["None"] = 0] = "None";
1283
+ InputFlags[InputFlags["SignalBased"] = 1] = "SignalBased";
1284
+ InputFlags[InputFlags["HasDecoratorInputTransform"] = 2] = "HasDecoratorInputTransform";
1285
+ })(InputFlags || (InputFlags = {}));
1286
+
1237
1287
  /**
1238
1288
  * Returns an index of `classToSearch` in `className` taking token boundaries into account.
1239
1289
  *
@@ -1955,76 +2005,34 @@ function ɵɵdefineNgModule(def) {
1955
2005
  return res;
1956
2006
  });
1957
2007
  }
1958
- /**
1959
- * Inverts an inputs or outputs lookup such that the keys, which were the
1960
- * minified keys, are part of the values, and the values are parsed so that
1961
- * the publicName of the property is the new key
1962
- *
1963
- * e.g. for
1964
- *
1965
- * ```
1966
- * class Comp {
1967
- * @Input()
1968
- * propName1: string;
1969
- *
1970
- * @Input('publicName2')
1971
- * declaredPropName2: number;
1972
- * }
1973
- * ```
1974
- *
1975
- * will be serialized as
1976
- *
1977
- * ```
1978
- * {
1979
- * propName1: 'propName1',
1980
- * declaredPropName2: ['publicName2', 'declaredPropName2'],
1981
- * }
1982
- * ```
1983
- *
1984
- * which is than translated by the minifier as:
1985
- *
1986
- * ```
1987
- * {
1988
- * minifiedPropName1: 'propName1',
1989
- * minifiedPropName2: ['publicName2', 'declaredPropName2'],
1990
- * }
1991
- * ```
1992
- *
1993
- * becomes: (public name => minifiedName)
1994
- *
1995
- * ```
1996
- * {
1997
- * 'propName1': 'minifiedPropName1',
1998
- * 'publicName2': 'minifiedPropName2',
1999
- * }
2000
- * ```
2001
- *
2002
- * Optionally the function can take `secondary` which will result in: (public name => declared name)
2003
- *
2004
- * ```
2005
- * {
2006
- * 'propName1': 'propName1',
2007
- * 'publicName2': 'declaredPropName2',
2008
- * }
2009
- * ```
2010
- *
2011
-
2012
- */
2013
- function invertObject(obj, secondary) {
2008
+ function parseAndConvertBindingsForDefinition(obj, declaredInputs) {
2014
2009
  if (obj == null)
2015
2010
  return EMPTY_OBJ;
2016
2011
  const newLookup = {};
2017
2012
  for (const minifiedKey in obj) {
2018
2013
  if (obj.hasOwnProperty(minifiedKey)) {
2019
- let publicName = obj[minifiedKey];
2020
- let declaredName = publicName;
2021
- if (Array.isArray(publicName)) {
2022
- declaredName = publicName[1];
2023
- publicName = publicName[0];
2014
+ const value = obj[minifiedKey];
2015
+ let publicName;
2016
+ let declaredName;
2017
+ let inputFlags = InputFlags.None;
2018
+ if (Array.isArray(value)) {
2019
+ inputFlags = value[0];
2020
+ publicName = value[1];
2021
+ declaredName = value[2] ?? publicName; // declared name might not be set to save bytes.
2024
2022
  }
2025
- newLookup[publicName] = minifiedKey;
2026
- if (secondary) {
2027
- (secondary[publicName] = declaredName);
2023
+ else {
2024
+ publicName = value;
2025
+ declaredName = value;
2026
+ }
2027
+ // For inputs, capture the declared name, or if some flags are set.
2028
+ if (declaredInputs) {
2029
+ // Perf note: An array is only allocated for the input if there are flags.
2030
+ newLookup[publicName] =
2031
+ inputFlags !== InputFlags.None ? [minifiedKey, inputFlags] : minifiedKey;
2032
+ declaredInputs[publicName] = declaredName;
2033
+ }
2034
+ else {
2035
+ newLookup[publicName] = minifiedKey;
2028
2036
  }
2029
2037
  }
2030
2038
  }
@@ -2122,7 +2130,7 @@ function getNgDirectiveDef(directiveDefinition) {
2122
2130
  hostVars: directiveDefinition.hostVars || 0,
2123
2131
  hostAttrs: directiveDefinition.hostAttrs || null,
2124
2132
  contentQueries: directiveDefinition.contentQueries || null,
2125
- declaredInputs,
2133
+ declaredInputs: declaredInputs,
2126
2134
  inputTransforms: null,
2127
2135
  inputConfig: directiveDefinition.inputs || EMPTY_OBJ,
2128
2136
  exportAs: directiveDefinition.exportAs || null,
@@ -2134,8 +2142,8 @@ function getNgDirectiveDef(directiveDefinition) {
2134
2142
  setInput: null,
2135
2143
  findHostDirectiveDefs: null,
2136
2144
  hostDirectives: null,
2137
- inputs: invertObject(directiveDefinition.inputs, declaredInputs),
2138
- outputs: invertObject(directiveDefinition.outputs),
2145
+ inputs: parseAndConvertBindingsForDefinition(directiveDefinition.inputs, declaredInputs),
2146
+ outputs: parseAndConvertBindingsForDefinition(directiveDefinition.outputs),
2139
2147
  debugInfo: null,
2140
2148
  };
2141
2149
  }
@@ -2286,11 +2294,6 @@ var LContainerFlags;
2286
2294
  * This flag, once set, is never unset for the `LContainer`.
2287
2295
  */
2288
2296
  LContainerFlags[LContainerFlags["HasTransplantedViews"] = 2] = "HasTransplantedViews";
2289
- /**
2290
- * Indicates that this LContainer has a view underneath it that needs to be refreshed during
2291
- * change detection.
2292
- */
2293
- LContainerFlags[LContainerFlags["HasChildViewsToRefresh"] = 4] = "HasChildViewsToRefresh";
2294
2297
  })(LContainerFlags || (LContainerFlags = {}));
2295
2298
 
2296
2299
  /**
@@ -2488,6 +2491,15 @@ class SimpleChange {
2488
2491
  }
2489
2492
  }
2490
2493
 
2494
+ function applyValueToInputField(instance, inputSignalNode, privateName, value) {
2495
+ if (inputSignalNode !== null) {
2496
+ inputSignalNode.applyValueToInputSignal(inputSignalNode, value);
2497
+ }
2498
+ else {
2499
+ instance[privateName] = value;
2500
+ }
2501
+ }
2502
+
2491
2503
  /**
2492
2504
  * The NgOnChangesFeature decorates a component with support for the ngOnChanges
2493
2505
  * lifecycle hook, so it should be included in any component that implements
@@ -2553,7 +2565,7 @@ function rememberChangeHistoryAndInvokeOnChangesHook() {
2553
2565
  this.ngOnChanges(current);
2554
2566
  }
2555
2567
  }
2556
- function ngOnChangesSetInput(instance, value, publicName, privateName) {
2568
+ function ngOnChangesSetInput(instance, inputSignalNode, value, publicName, privateName) {
2557
2569
  const declaredName = this.declaredInputs[publicName];
2558
2570
  ngDevMode && assertString(declaredName, 'Name of input in ngOnChanges has to be a string');
2559
2571
  const simpleChangesStore = getSimpleChangesStore(instance) ||
@@ -2562,7 +2574,7 @@ function ngOnChangesSetInput(instance, value, publicName, privateName) {
2562
2574
  const previous = simpleChangesStore.previous;
2563
2575
  const previousChange = previous[declaredName];
2564
2576
  current[declaredName] = new SimpleChange(previousChange && previousChange.currentValue, value, previous === EMPTY_OBJ);
2565
- instance[privateName] = value;
2577
+ applyValueToInputField(instance, inputSignalNode, privateName, value);
2566
2578
  }
2567
2579
  const SIMPLE_CHANGES_STORE = '__ngSimpleChanges__';
2568
2580
  function getSimpleChangesStore(instance) {
@@ -2604,6 +2616,15 @@ const profiler = function (event, instance, hookOrListener) {
2604
2616
  const SVG_NAMESPACE = 'svg';
2605
2617
  const MATH_ML_NAMESPACE = 'math';
2606
2618
 
2619
+ // TODO(atscott): flip default internally ASAP and externally for v18 (#52928)
2620
+ let _ensureDirtyViewsAreAlwaysReachable = false;
2621
+ function getEnsureDirtyViewsAreAlwaysReachable() {
2622
+ return _ensureDirtyViewsAreAlwaysReachable;
2623
+ }
2624
+ function setEnsureDirtyViewsAreAlwaysReachable(v) {
2625
+ _ensureDirtyViewsAreAlwaysReachable = v;
2626
+ }
2627
+
2607
2628
  /**
2608
2629
  * For efficiency reasons we often put several different data types (`RNode`, `LView`, `LContainer`)
2609
2630
  * in same location in `LView`. This is because we don't want to pre-allocate space for it
@@ -2770,10 +2791,21 @@ function requiresRefreshOrTraversal(lView) {
2770
2791
  * parents above.
2771
2792
  */
2772
2793
  function updateAncestorTraversalFlagsOnAttach(lView) {
2773
- if (!requiresRefreshOrTraversal(lView)) {
2774
- return;
2794
+ // TODO(atscott): Simplify if...else cases once getEnsureDirtyViewsAreAlwaysReachable is always
2795
+ // `true`. When we attach a view that's marked `Dirty`, we should ensure that it is reached during
2796
+ // the next CD traversal so we add the `RefreshView` flag and mark ancestors accordingly.
2797
+ if (requiresRefreshOrTraversal(lView)) {
2798
+ markAncestorsForTraversal(lView);
2799
+ }
2800
+ else if (lView[FLAGS] & 64 /* LViewFlags.Dirty */) {
2801
+ if (getEnsureDirtyViewsAreAlwaysReachable()) {
2802
+ lView[FLAGS] |= 1024 /* LViewFlags.RefreshView */;
2803
+ markAncestorsForTraversal(lView);
2804
+ }
2805
+ else {
2806
+ lView[ENVIRONMENT].changeDetectionScheduler?.notify();
2807
+ }
2775
2808
  }
2776
- markAncestorsForTraversal(lView);
2777
2809
  }
2778
2810
  /**
2779
2811
  * Ensures views above the given `lView` are traversed during change detection even when they are
@@ -2783,24 +2815,19 @@ function updateAncestorTraversalFlagsOnAttach(lView) {
2783
2815
  * flag is already `true` or the `lView` is detached.
2784
2816
  */
2785
2817
  function markAncestorsForTraversal(lView) {
2786
- let parent = lView[PARENT];
2818
+ lView[ENVIRONMENT].changeDetectionScheduler?.notify();
2819
+ let parent = getLViewParent(lView);
2787
2820
  while (parent !== null) {
2788
2821
  // We stop adding markers to the ancestors once we reach one that already has the marker. This
2789
2822
  // is to avoid needlessly traversing all the way to the root when the marker already exists.
2790
- if ((isLContainer(parent) && (parent[FLAGS] & LContainerFlags.HasChildViewsToRefresh) ||
2791
- (isLView(parent) && parent[FLAGS] & 8192 /* LViewFlags.HasChildViewsToRefresh */))) {
2823
+ if (parent[FLAGS] & 8192 /* LViewFlags.HasChildViewsToRefresh */) {
2792
2824
  break;
2793
2825
  }
2794
- if (isLContainer(parent)) {
2795
- parent[FLAGS] |= LContainerFlags.HasChildViewsToRefresh;
2796
- }
2797
- else {
2798
- parent[FLAGS] |= 8192 /* LViewFlags.HasChildViewsToRefresh */;
2799
- if (!viewAttachedToChangeDetector(parent)) {
2800
- break;
2801
- }
2826
+ parent[FLAGS] |= 8192 /* LViewFlags.HasChildViewsToRefresh */;
2827
+ if (!viewAttachedToChangeDetector(parent)) {
2828
+ break;
2802
2829
  }
2803
- parent = parent[PARENT];
2830
+ parent = getLViewParent(parent);
2804
2831
  }
2805
2832
  }
2806
2833
  /**
@@ -2826,6 +2853,16 @@ function removeLViewOnDestroy(lView, onDestroyCallback) {
2826
2853
  lView[ON_DESTROY_HOOKS].splice(destroyCBIdx, 1);
2827
2854
  }
2828
2855
  }
2856
+ /**
2857
+ * Gets the parent LView of the passed LView, if the PARENT is an LContainer, will get the parent of
2858
+ * that LContainer, which is an LView
2859
+ * @param lView the lView whose parent to get
2860
+ */
2861
+ function getLViewParent(lView) {
2862
+ ngDevMode && assertLView(lView);
2863
+ const parent = lView[PARENT];
2864
+ return isLContainer(parent) ? parent[PARENT] : parent;
2865
+ }
2829
2866
 
2830
2867
  const instructionState = {
2831
2868
  lFrame: createLFrame(null),
@@ -3818,11 +3855,12 @@ function hasParentInjector(parentLocation) {
3818
3855
  return parentLocation !== NO_PARENT_INJECTOR;
3819
3856
  }
3820
3857
  function getParentInjectorIndex(parentLocation) {
3821
- ngDevMode && assertNumber(parentLocation, 'Number expected');
3822
- ngDevMode && assertNotEqual(parentLocation, -1, 'Not a valid state.');
3823
- const parentInjectorIndex = parentLocation & 32767 /* RelativeInjectorLocationFlags.InjectorIndexMask */;
3824
- ngDevMode &&
3858
+ if (ngDevMode) {
3859
+ assertNumber(parentLocation, 'Number expected');
3860
+ assertNotEqual(parentLocation, -1, 'Not a valid state.');
3861
+ const parentInjectorIndex = parentLocation & 32767 /* RelativeInjectorLocationFlags.InjectorIndexMask */;
3825
3862
  assertGreaterThan(parentInjectorIndex, HEADER_OFFSET, 'Parent injector must be pointing past HEADER_OFFSET.');
3863
+ }
3826
3864
  return parentLocation & 32767 /* RelativeInjectorLocationFlags.InjectorIndexMask */;
3827
3865
  }
3828
3866
  function getParentInjectorViewOffset(parentLocation) {
@@ -6189,9 +6227,11 @@ class R3Injector extends EnvironmentInjector {
6189
6227
  multiRecord.multi.push(provider);
6190
6228
  }
6191
6229
  else {
6192
- const existing = this.records.get(token);
6193
- if (ngDevMode && existing && existing.multi !== undefined) {
6194
- throwMixedMultiProviderError();
6230
+ if (ngDevMode) {
6231
+ const existing = this.records.get(token);
6232
+ if (existing && existing.multi !== undefined) {
6233
+ throwMixedMultiProviderError();
6234
+ }
6195
6235
  }
6196
6236
  }
6197
6237
  this.records.set(token, record);
@@ -6259,8 +6299,8 @@ function getUndecoratedInjectableFactory(token) {
6259
6299
  // If the token has parameters then it has dependencies that we cannot resolve implicitly.
6260
6300
  const paramLength = token.length;
6261
6301
  if (paramLength > 0) {
6262
- const args = newArray(paramLength, '?');
6263
- throw new RuntimeError(204 /* RuntimeErrorCode.INVALID_INJECTION_TOKEN */, ngDevMode && `Can't resolve all parameters for ${stringify(token)}: (${args.join(', ')}).`);
6302
+ throw new RuntimeError(204 /* RuntimeErrorCode.INVALID_INJECTION_TOKEN */, ngDevMode &&
6303
+ `Can't resolve all parameters for ${stringify(token)}: (${newArray(paramLength, '?').join(', ')}).`);
6264
6304
  }
6265
6305
  // The constructor function appears to have no parameters.
6266
6306
  // This might be because it inherits from a super-class. In which case, use an injectable
@@ -7954,63 +7994,6 @@ function ensureIcuContainerVisitorLoaded(loader) {
7954
7994
  }
7955
7995
  }
7956
7996
 
7957
- /**
7958
- * Gets the parent LView of the passed LView, if the PARENT is an LContainer, will get the parent of
7959
- * that LContainer, which is an LView
7960
- * @param lView the lView whose parent to get
7961
- */
7962
- function getLViewParent(lView) {
7963
- ngDevMode && assertLView(lView);
7964
- const parent = lView[PARENT];
7965
- return isLContainer(parent) ? parent[PARENT] : parent;
7966
- }
7967
- /**
7968
- * Retrieve the root view from any component or `LView` by walking the parent `LView` until
7969
- * reaching the root `LView`.
7970
- *
7971
- * @param componentOrLView any component or `LView`
7972
- */
7973
- function getRootView(componentOrLView) {
7974
- ngDevMode && assertDefined(componentOrLView, 'component');
7975
- let lView = isLView(componentOrLView) ? componentOrLView : readPatchedLView(componentOrLView);
7976
- while (lView && !(lView[FLAGS] & 512 /* LViewFlags.IsRoot */)) {
7977
- lView = getLViewParent(lView);
7978
- }
7979
- ngDevMode && assertLView(lView);
7980
- return lView;
7981
- }
7982
- /**
7983
- * Returns the context information associated with the application where the target is situated. It
7984
- * does this by walking the parent views until it gets to the root view, then getting the context
7985
- * off of that.
7986
- *
7987
- * @param viewOrComponent the `LView` or component to get the root context for.
7988
- */
7989
- function getRootContext(viewOrComponent) {
7990
- const rootView = getRootView(viewOrComponent);
7991
- ngDevMode &&
7992
- assertDefined(rootView[CONTEXT], 'Root view has no context. Perhaps it is disconnected?');
7993
- return rootView[CONTEXT];
7994
- }
7995
- /**
7996
- * Gets the first `LContainer` in the LView or `null` if none exists.
7997
- */
7998
- function getFirstLContainer(lView) {
7999
- return getNearestLContainer(lView[CHILD_HEAD]);
8000
- }
8001
- /**
8002
- * Gets the next `LContainer` that is a sibling of the given container.
8003
- */
8004
- function getNextLContainer(container) {
8005
- return getNearestLContainer(container[NEXT]);
8006
- }
8007
- function getNearestLContainer(viewOrContainer) {
8008
- while (viewOrContainer !== null && !isLContainer(viewOrContainer)) {
8009
- viewOrContainer = viewOrContainer[NEXT];
8010
- }
8011
- return viewOrContainer;
8012
- }
8013
-
8014
7997
  /**
8015
7998
  * NOTE: for performance reasons, the possible actions are inlined within the function instead of
8016
7999
  * being passed as an argument.
@@ -8093,8 +8076,7 @@ function createElementNode(renderer, name, namespace) {
8093
8076
  * @param lView The view from which elements should be added or removed
8094
8077
  */
8095
8078
  function removeViewFromDOM(tView, lView) {
8096
- const renderer = lView[RENDERER];
8097
- applyView(tView, lView, renderer, 2 /* WalkTNodeTreeAction.Detach */, null, null);
8079
+ detachViewFromDOM(tView, lView);
8098
8080
  lView[HOST] = null;
8099
8081
  lView[T_HOST] = null;
8100
8082
  }
@@ -8124,6 +8106,9 @@ function addViewToDOM(tView, parentTNode, renderer, lView, parentNativeNode, bef
8124
8106
  * @param lView the `LView` to be detached.
8125
8107
  */
8126
8108
  function detachViewFromDOM(tView, lView) {
8109
+ // The scheduler must be notified because the animation engine is what actually does the DOM
8110
+ // removal and only runs at the end of change detection.
8111
+ lView[ENVIRONMENT].changeDetectionScheduler?.notify();
8127
8112
  applyView(tView, lView, lView[RENDERER], 2 /* WalkTNodeTreeAction.Detach */, null, null);
8128
8113
  }
8129
8114
  /**
@@ -8255,8 +8240,7 @@ function detachMovedView(declarationContainer, lView) {
8255
8240
  assertDefined(declarationContainer[MOVED_VIEWS], 'A projected view should belong to a non-empty projected views collection');
8256
8241
  const movedViews = declarationContainer[MOVED_VIEWS];
8257
8242
  const declarationViewIndex = movedViews.indexOf(lView);
8258
- const insertionLContainer = lView[PARENT];
8259
- ngDevMode && assertLContainer(insertionLContainer);
8243
+ ngDevMode && assertLContainer(lView[PARENT]);
8260
8244
  movedViews.splice(declarationViewIndex, 1);
8261
8245
  }
8262
8246
  /**
@@ -9880,6 +9864,12 @@ function getSanitizer() {
9880
9864
  return lView && lView[ENVIRONMENT].sanitizer;
9881
9865
  }
9882
9866
 
9867
+ /**
9868
+ * Injectable that is notified when an `LView` is made aware of changes to application state.
9869
+ */
9870
+ class ChangeDetectionScheduler {
9871
+ }
9872
+
9883
9873
  /**
9884
9874
  * Create a `StateKey<T>` that can be used to store value of type T with `TransferState`.
9885
9875
  *
@@ -10060,7 +10050,7 @@ const SSR_CONTENT_INTEGRITY_MARKER = 'nghm';
10060
10050
  * @param injector Injector that this component has access to.
10061
10051
  * @param isRootView Specifies whether we trying to read hydration info for the root view.
10062
10052
  */
10063
- let _retrieveHydrationInfoImpl = (rNode, injector, isRootView) => null;
10053
+ let _retrieveHydrationInfoImpl = () => null;
10064
10054
  function retrieveHydrationInfoImpl(rNode, injector, isRootView = false) {
10065
10055
  let nghAttrValue = rNode.getAttribute(NGH_ATTR_NAME);
10066
10056
  if (nghAttrValue == null)
@@ -10450,24 +10440,6 @@ class Sanitizer {
10450
10440
  }); }
10451
10441
  }
10452
10442
 
10453
- /**
10454
- * @description Represents the version of Angular
10455
- *
10456
- * @publicApi
10457
- */
10458
- class Version {
10459
- constructor(full) {
10460
- this.full = full;
10461
- this.major = full.split('.')[0];
10462
- this.minor = full.split('.')[1];
10463
- this.patch = full.split('.').slice(2).join('.');
10464
- }
10465
- }
10466
- /**
10467
- * @publicApi
10468
- */
10469
- const VERSION = new Version('17.1.0-next.4');
10470
-
10471
10443
  // This default value is when checking the hierarchy for a token.
10472
10444
  //
10473
10445
  // It means both:
@@ -11742,6 +11714,53 @@ const REACTIVE_LVIEW_CONSUMER_NODE = {
11742
11714
  },
11743
11715
  };
11744
11716
 
11717
+ /**
11718
+ * Retrieve the root view from any component or `LView` by walking the parent `LView` until
11719
+ * reaching the root `LView`.
11720
+ *
11721
+ * @param componentOrLView any component or `LView`
11722
+ */
11723
+ function getRootView(componentOrLView) {
11724
+ ngDevMode && assertDefined(componentOrLView, 'component');
11725
+ let lView = isLView(componentOrLView) ? componentOrLView : readPatchedLView(componentOrLView);
11726
+ while (lView && !(lView[FLAGS] & 512 /* LViewFlags.IsRoot */)) {
11727
+ lView = getLViewParent(lView);
11728
+ }
11729
+ ngDevMode && assertLView(lView);
11730
+ return lView;
11731
+ }
11732
+ /**
11733
+ * Returns the context information associated with the application where the target is situated. It
11734
+ * does this by walking the parent views until it gets to the root view, then getting the context
11735
+ * off of that.
11736
+ *
11737
+ * @param viewOrComponent the `LView` or component to get the root context for.
11738
+ */
11739
+ function getRootContext(viewOrComponent) {
11740
+ const rootView = getRootView(viewOrComponent);
11741
+ ngDevMode &&
11742
+ assertDefined(rootView[CONTEXT], 'Root view has no context. Perhaps it is disconnected?');
11743
+ return rootView[CONTEXT];
11744
+ }
11745
+ /**
11746
+ * Gets the first `LContainer` in the LView or `null` if none exists.
11747
+ */
11748
+ function getFirstLContainer(lView) {
11749
+ return getNearestLContainer(lView[CHILD_HEAD]);
11750
+ }
11751
+ /**
11752
+ * Gets the next `LContainer` that is a sibling of the given container.
11753
+ */
11754
+ function getNextLContainer(container) {
11755
+ return getNearestLContainer(container[NEXT]);
11756
+ }
11757
+ function getNearestLContainer(viewOrContainer) {
11758
+ while (viewOrContainer !== null && !isLContainer(viewOrContainer)) {
11759
+ viewOrContainer = viewOrContainer[NEXT];
11760
+ }
11761
+ return viewOrContainer;
11762
+ }
11763
+
11745
11764
  const ERROR_ORIGINAL_ERROR = 'ngOriginalError';
11746
11765
  function wrappedError(message, originalError) {
11747
11766
  const msg = `${message} caused by: ${originalError instanceof Error ? originalError.message : originalError}`;
@@ -11983,7 +12002,7 @@ const NO_CHANGE = (typeof ngDevMode === 'undefined' || ngDevMode) ? { __brand__:
11983
12002
  *
11984
12003
  * @codeGenApi
11985
12004
  */
11986
- function ɵɵadvance(delta) {
12005
+ function ɵɵadvance(delta = 1) {
11987
12006
  ngDevMode && assertGreaterThan(delta, 0, 'Can only advance forward');
11988
12007
  selectIndexInternal(getTView(), getLView(), getSelectedIndex() + delta, !!ngDevMode && isInCheckNoChangesMode());
11989
12008
  }
@@ -12044,6 +12063,39 @@ function ɵɵinvalidFactory() {
12044
12063
  throw new Error(msg);
12045
12064
  }
12046
12065
 
12066
+ function writeToDirectiveInput(def, instance, publicName, privateName, flags, value) {
12067
+ const prevConsumer = setActiveConsumer$1(null);
12068
+ try {
12069
+ // If we know we are dealing with a signal input, we cache its reference
12070
+ // in a tree-shakable way. The input signal node can then be used for
12071
+ // value transform execution or actual value updates without introducing
12072
+ // additional megamorphic accesses for accessing the instance field.
12073
+ let inputSignalNode = null;
12074
+ if ((flags & InputFlags.SignalBased) !== 0) {
12075
+ const field = instance[privateName];
12076
+ inputSignalNode = field[SIGNAL$1];
12077
+ }
12078
+ // If there is a signal node and a transform, run it before potentially
12079
+ // delegating to features like `NgOnChanges`.
12080
+ if (inputSignalNode !== null && inputSignalNode.transformFn !== undefined) {
12081
+ value = inputSignalNode.transformFn(value);
12082
+ }
12083
+ // If there is a decorator input transform, run it.
12084
+ if ((flags & InputFlags.HasDecoratorInputTransform) !== 0) {
12085
+ value = def.inputTransforms[privateName].call(instance, value);
12086
+ }
12087
+ if (def.setInput !== null) {
12088
+ def.setInput(instance, inputSignalNode, value, publicName, privateName);
12089
+ }
12090
+ else {
12091
+ applyValueToInputField(instance, inputSignalNode, privateName, value);
12092
+ }
12093
+ }
12094
+ finally {
12095
+ setActiveConsumer$1(prevConsumer);
12096
+ }
12097
+ }
12098
+
12047
12099
  /**
12048
12100
  * Invoke `HostBindingsFunction`s for view.
12049
12101
  *
@@ -12082,7 +12134,8 @@ function processHostBindingOpCodes(tView, lView) {
12082
12134
  function createLView(parentLView, tView, context, flags, host, tHostNode, environment, renderer, injector, embeddedViewInjector, hydrationInfo) {
12083
12135
  const lView = tView.blueprint.slice();
12084
12136
  lView[HOST] = host;
12085
- lView[FLAGS] = flags | 4 /* LViewFlags.CreationMode */ | 128 /* LViewFlags.Attached */ | 8 /* LViewFlags.FirstLViewPass */;
12137
+ lView[FLAGS] = flags | 4 /* LViewFlags.CreationMode */ | 128 /* LViewFlags.Attached */ | 8 /* LViewFlags.FirstLViewPass */ |
12138
+ 64 /* LViewFlags.Dirty */;
12086
12139
  if (embeddedViewInjector !== null ||
12087
12140
  (parentLView && (parentLView[FLAGS] & 2048 /* LViewFlags.HasEmbeddedViewInjector */))) {
12088
12141
  lView[FLAGS] |= 2048 /* LViewFlags.HasEmbeddedViewInjector */;
@@ -12392,7 +12445,7 @@ function applyRootElementTransform(rootElement) {
12392
12445
  *
12393
12446
  * @param rootElement the app root HTML Element
12394
12447
  */
12395
- let _applyRootElementTransformImpl = (rootElement) => null;
12448
+ let _applyRootElementTransformImpl = () => null;
12396
12449
  /**
12397
12450
  * Processes text node markers before hydration begins. This replaces any special comment
12398
12451
  * nodes that were added prior to serialization are swapped out to restore proper text
@@ -12499,42 +12552,61 @@ function createTNode(tView, tParent, type, index, value, attrs) {
12499
12552
  }
12500
12553
  return tNode;
12501
12554
  }
12502
- /**
12503
- * Generates the `PropertyAliases` data structure from the provided input/output mapping.
12504
- * @param aliasMap Input/output mapping from the directive definition.
12505
- * @param directiveIndex Index of the directive.
12506
- * @param propertyAliases Object in which to store the results.
12507
- * @param hostDirectiveAliasMap Object used to alias or filter out properties for host directives.
12508
- * If the mapping is provided, it'll act as an allowlist, as well as a mapping of what public
12509
- * name inputs/outputs should be exposed under.
12510
- */
12511
- function generatePropertyAliases(aliasMap, directiveIndex, propertyAliases, hostDirectiveAliasMap) {
12555
+ function captureNodeBindings(mode, aliasMap, directiveIndex, bindingsResult, hostDirectiveAliasMap) {
12512
12556
  for (let publicName in aliasMap) {
12513
- if (aliasMap.hasOwnProperty(publicName)) {
12514
- propertyAliases = propertyAliases === null ? {} : propertyAliases;
12515
- const internalName = aliasMap[publicName];
12516
- // If there are no host directive mappings, we want to remap using the alias map from the
12517
- // definition itself. If there is an alias map, it has two functions:
12518
- // 1. It serves as an allowlist of bindings that are exposed by the host directives. Only the
12519
- // ones inside the host directive map will be exposed on the host.
12520
- // 2. The public name of the property is aliased using the host directive alias map, rather
12521
- // than the alias map from the definition.
12522
- if (hostDirectiveAliasMap === null) {
12523
- addPropertyAlias(propertyAliases, directiveIndex, publicName, internalName);
12524
- }
12525
- else if (hostDirectiveAliasMap.hasOwnProperty(publicName)) {
12526
- addPropertyAlias(propertyAliases, directiveIndex, hostDirectiveAliasMap[publicName], internalName);
12557
+ if (!aliasMap.hasOwnProperty(publicName)) {
12558
+ continue;
12559
+ }
12560
+ const value = aliasMap[publicName];
12561
+ if (value === undefined) {
12562
+ continue;
12563
+ }
12564
+ bindingsResult ??= {};
12565
+ let internalName;
12566
+ let inputFlags = InputFlags.None;
12567
+ // For inputs, the value might be an array capturing additional
12568
+ // input flags.
12569
+ if (Array.isArray(value)) {
12570
+ internalName = value[0];
12571
+ inputFlags = value[1];
12572
+ }
12573
+ else {
12574
+ internalName = value;
12575
+ }
12576
+ // If there are no host directive mappings, we want to remap using the alias map from the
12577
+ // definition itself. If there is an alias map, it has two functions:
12578
+ // 1. It serves as an allowlist of bindings that are exposed by the host directives. Only the
12579
+ // ones inside the host directive map will be exposed on the host.
12580
+ // 2. The public name of the property is aliased using the host directive alias map, rather
12581
+ // than the alias map from the definition.
12582
+ let finalPublicName = publicName;
12583
+ if (hostDirectiveAliasMap !== null) {
12584
+ // If there is no mapping, it's not part of the allowlist and this input/output
12585
+ // is not captured and should be ignored.
12586
+ if (!hostDirectiveAliasMap.hasOwnProperty(publicName)) {
12587
+ continue;
12527
12588
  }
12589
+ finalPublicName = hostDirectiveAliasMap[publicName];
12590
+ }
12591
+ if (mode === 0 /* CaptureNodeBindingMode.Inputs */) {
12592
+ addPropertyBinding(bindingsResult, directiveIndex, finalPublicName, internalName, inputFlags);
12593
+ }
12594
+ else {
12595
+ addPropertyBinding(bindingsResult, directiveIndex, finalPublicName, internalName);
12528
12596
  }
12529
12597
  }
12530
- return propertyAliases;
12598
+ return bindingsResult;
12531
12599
  }
12532
- function addPropertyAlias(propertyAliases, directiveIndex, publicName, internalName) {
12533
- if (propertyAliases.hasOwnProperty(publicName)) {
12534
- propertyAliases[publicName].push(directiveIndex, internalName);
12600
+ function addPropertyBinding(bindings, directiveIndex, publicName, internalName, inputFlags) {
12601
+ let values;
12602
+ if (bindings.hasOwnProperty(publicName)) {
12603
+ (values = bindings[publicName]).push(directiveIndex, internalName);
12535
12604
  }
12536
12605
  else {
12537
- propertyAliases[publicName] = [directiveIndex, internalName];
12606
+ values = bindings[publicName] = [directiveIndex, internalName];
12607
+ }
12608
+ if (inputFlags !== undefined) {
12609
+ values.push(inputFlags);
12538
12610
  }
12539
12611
  }
12540
12612
  /**
@@ -12555,10 +12627,8 @@ function initializeInputAndOutputAliases(tView, tNode, hostDirectiveDefinitionMa
12555
12627
  const aliasData = hostDirectiveDefinitionMap ? hostDirectiveDefinitionMap.get(directiveDef) : null;
12556
12628
  const aliasedInputs = aliasData ? aliasData.inputs : null;
12557
12629
  const aliasedOutputs = aliasData ? aliasData.outputs : null;
12558
- inputsStore =
12559
- generatePropertyAliases(directiveDef.inputs, directiveIndex, inputsStore, aliasedInputs);
12560
- outputsStore =
12561
- generatePropertyAliases(directiveDef.outputs, directiveIndex, outputsStore, aliasedOutputs);
12630
+ inputsStore = captureNodeBindings(0 /* CaptureNodeBindingMode.Inputs */, directiveDef.inputs, directiveIndex, inputsStore, aliasedInputs);
12631
+ outputsStore = captureNodeBindings(1 /* CaptureNodeBindingMode.Outputs */, directiveDef.outputs, directiveIndex, outputsStore, aliasedOutputs);
12562
12632
  // Do not use unbound attributes as inputs to structural directives, since structural
12563
12633
  // directive inputs can only be set using microsyntax (e.g. `<div *dir="exp">`).
12564
12634
  // TODO(FW-1930): microsyntax expressions may also contain unbound/static attributes, which
@@ -12675,7 +12745,7 @@ function setNgReflectProperties(lView, element, type, dataValue, value) {
12675
12745
  * e.g. [0, 'change', 'change-minified']
12676
12746
  * we want to set the reflected property with the privateName: dataValue[i+1]
12677
12747
  */
12678
- for (let i = 0; i < dataValue.length; i += 2) {
12748
+ for (let i = 0; i < dataValue.length; i += 3) {
12679
12749
  setNgReflectProperty(lView, element, type, dataValue[i + 1], value);
12680
12750
  }
12681
12751
  }
@@ -13067,8 +13137,9 @@ function setInputsFromAttrs(lView, directiveIndex, instance, def, tNode, initial
13067
13137
  for (let i = 0; i < initialInputs.length;) {
13068
13138
  const publicName = initialInputs[i++];
13069
13139
  const privateName = initialInputs[i++];
13140
+ const flags = initialInputs[i++];
13070
13141
  const value = initialInputs[i++];
13071
- writeToDirectiveInput(def, instance, publicName, privateName, value);
13142
+ writeToDirectiveInput(def, instance, publicName, privateName, flags, value);
13072
13143
  if (ngDevMode) {
13073
13144
  const nativeElement = getNativeByTNode(tNode, lView);
13074
13145
  setNgReflectProperty(lView, nativeElement, tNode.type, privateName, value);
@@ -13076,24 +13147,6 @@ function setInputsFromAttrs(lView, directiveIndex, instance, def, tNode, initial
13076
13147
  }
13077
13148
  }
13078
13149
  }
13079
- function writeToDirectiveInput(def, instance, publicName, privateName, value) {
13080
- const prevConsumer = setActiveConsumer$1(null);
13081
- try {
13082
- const inputTransforms = def.inputTransforms;
13083
- if (inputTransforms !== null && inputTransforms.hasOwnProperty(privateName)) {
13084
- value = inputTransforms[privateName].call(instance, value);
13085
- }
13086
- if (def.setInput !== null) {
13087
- def.setInput(instance, value, publicName, privateName);
13088
- }
13089
- else {
13090
- instance[privateName] = value;
13091
- }
13092
- }
13093
- finally {
13094
- setActiveConsumer$1(prevConsumer);
13095
- }
13096
- }
13097
13150
  /**
13098
13151
  * Generates initialInputData for a node and stores it in the template's static storage
13099
13152
  * so subsequent template invocations don't have to recalculate it.
@@ -13134,9 +13187,9 @@ function generateInitialInputs(inputs, directiveIndex, attrs) {
13134
13187
  // through the directive def, but we want to do it using the inputs store so that it can
13135
13188
  // account for host directive aliases.
13136
13189
  const inputConfig = inputs[attrName];
13137
- for (let j = 0; j < inputConfig.length; j += 2) {
13190
+ for (let j = 0; j < inputConfig.length; j += 3) {
13138
13191
  if (inputConfig[j] === directiveIndex) {
13139
- inputsToStore.push(attrName, inputConfig[j + 1], attrs[i + 1]);
13192
+ inputsToStore.push(attrName, inputConfig[j + 1], inputConfig[j + 2], attrs[i + 1]);
13140
13193
  // A directive can't have multiple inputs with the same name so we can break here.
13141
13194
  break;
13142
13195
  }
@@ -13323,10 +13376,11 @@ function setInputsForProperty(tView, lView, inputs, publicName, value) {
13323
13376
  for (let i = 0; i < inputs.length;) {
13324
13377
  const index = inputs[i++];
13325
13378
  const privateName = inputs[i++];
13379
+ const flags = inputs[i++];
13326
13380
  const instance = lView[index];
13327
13381
  ngDevMode && assertIndexInRange(lView, index);
13328
13382
  const def = tView.data[index];
13329
- writeToDirectiveInput(def, instance, publicName, privateName, value);
13383
+ writeToDirectiveInput(def, instance, publicName, privateName, flags, value);
13330
13384
  }
13331
13385
  }
13332
13386
  /**
@@ -13348,14 +13402,12 @@ const MAXIMUM_REFRESH_RERUNS = 100;
13348
13402
  function detectChangesInternal(lView, notifyErrorHandler = true) {
13349
13403
  const environment = lView[ENVIRONMENT];
13350
13404
  const rendererFactory = environment.rendererFactory;
13351
- const afterRenderEventManager = environment.afterRenderEventManager;
13352
13405
  // Check no changes mode is a dev only mode used to verify that bindings have not changed
13353
13406
  // since they were assigned. We do not want to invoke renderer factory functions in that mode
13354
13407
  // to avoid any possible side-effects.
13355
13408
  const checkNoChangesMode = !!ngDevMode && isInCheckNoChangesMode();
13356
13409
  if (!checkNoChangesMode) {
13357
13410
  rendererFactory.begin?.();
13358
- afterRenderEventManager?.begin();
13359
13411
  }
13360
13412
  try {
13361
13413
  detectChangesInViewWhileDirty(lView);
@@ -13372,8 +13424,6 @@ function detectChangesInternal(lView, notifyErrorHandler = true) {
13372
13424
  // One final flush of the effects queue to catch any effects created in `ngAfterViewInit` or
13373
13425
  // other post-order hooks.
13374
13426
  environment.inlineEffectRunner?.flush();
13375
- // Invoke all callbacks registered via `after*Render`, if needed.
13376
- afterRenderEventManager?.end();
13377
13427
  }
13378
13428
  }
13379
13429
  }
@@ -13579,7 +13629,6 @@ function viewShouldHaveReactiveConsumer(tView) {
13579
13629
  */
13580
13630
  function detectChangesInEmbeddedViews(lView, mode) {
13581
13631
  for (let lContainer = getFirstLContainer(lView); lContainer !== null; lContainer = getNextLContainer(lContainer)) {
13582
- lContainer[FLAGS] &= ~LContainerFlags.HasChildViewsToRefresh;
13583
13632
  for (let i = CONTAINER_HEADER_OFFSET; i < lContainer.length; i++) {
13584
13633
  const embeddedLView = lContainer[i];
13585
13634
  detectChangesInViewIfAttached(embeddedLView, mode);
@@ -13691,6 +13740,7 @@ function detectChangesInChildComponents(hostLView, components, mode) {
13691
13740
  * @returns the root LView
13692
13741
  */
13693
13742
  function markViewDirty(lView) {
13743
+ lView[ENVIRONMENT].changeDetectionScheduler?.notify();
13694
13744
  while (lView) {
13695
13745
  lView[FLAGS] |= 64 /* LViewFlags.Dirty */;
13696
13746
  const parent = getLViewParent(lView);
@@ -13984,6 +14034,7 @@ class ViewRef$1 {
13984
14034
  throw new RuntimeError(902 /* RuntimeErrorCode.VIEW_ALREADY_ATTACHED */, ngDevMode && 'This view is already attached to a ViewContainer!');
13985
14035
  }
13986
14036
  this._appRef = appRef;
14037
+ updateAncestorTraversalFlagsOnAttach(this._lView);
13987
14038
  }
13988
14039
  }
13989
14040
 
@@ -14243,11 +14294,11 @@ class ZoneAwareMicrotaskScheduler {
14243
14294
  * available/requested.
14244
14295
  */
14245
14296
  class EffectHandle {
14246
- constructor(scheduler, effectFn, creationZone, destroyRef, errorHandler, allowSignalWrites) {
14297
+ constructor(scheduler, effectFn, creationZone, destroyRef, injector, allowSignalWrites) {
14247
14298
  this.scheduler = scheduler;
14248
14299
  this.effectFn = effectFn;
14249
14300
  this.creationZone = creationZone;
14250
- this.errorHandler = errorHandler;
14301
+ this.injector = injector;
14251
14302
  this.watcher = createWatch$1((onCleanup) => this.runEffect(onCleanup), () => this.schedule(), allowSignalWrites);
14252
14303
  this.unregisterOnDestroy = destroyRef?.onDestroy(() => this.destroy());
14253
14304
  }
@@ -14256,7 +14307,10 @@ class EffectHandle {
14256
14307
  this.effectFn(onCleanup);
14257
14308
  }
14258
14309
  catch (err) {
14259
- this.errorHandler?.handleError(err);
14310
+ // Inject the `ErrorHandler` here in order to avoid circular DI error
14311
+ // if the effect is used inside of a custom `ErrorHandler`.
14312
+ const errorHandler = this.injector.get(ErrorHandler, null, { optional: true });
14313
+ errorHandler?.handleError(err);
14260
14314
  }
14261
14315
  }
14262
14316
  run() {
@@ -14283,9 +14337,8 @@ function effect(effectFn, options) {
14283
14337
  'effect inside the component constructor.');
14284
14338
  !options?.injector && assertInInjectionContext(effect);
14285
14339
  const injector = options?.injector ?? inject(Injector);
14286
- const errorHandler = injector.get(ErrorHandler, null, { optional: true });
14287
14340
  const destroyRef = options?.manualCleanup !== true ? injector.get(DestroyRef) : null;
14288
- const handle = new EffectHandle(injector.get(APP_EFFECT_SCHEDULER), effectFn, (typeof Zone === 'undefined') ? null : Zone.current, destroyRef, errorHandler, options?.allowSignalWrites ?? false);
14341
+ const handle = new EffectHandle(injector.get(APP_EFFECT_SCHEDULER), effectFn, (typeof Zone === 'undefined') ? null : Zone.current, destroyRef, injector, options?.allowSignalWrites ?? false);
14289
14342
  // Effects need to be marked dirty manually to trigger their initial run. The timing of this
14290
14343
  // marking matters, because the effects may read signals that track component inputs, which are
14291
14344
  // only available after those components have had their first update pass.
@@ -14328,7 +14381,6 @@ function performanceMarkFeature(feature) {
14328
14381
  performance?.mark?.('mark_feature_usage', { detail: { feature } });
14329
14382
  }
14330
14383
 
14331
- /// <reference types="rxjs" />
14332
14384
  class EventEmitter_ extends Subject {
14333
14385
  constructor(isAsync = false) {
14334
14386
  super();
@@ -14827,63 +14879,6 @@ class NoopNgZone {
14827
14879
  return fn.apply(applyThis, applyArgs);
14828
14880
  }
14829
14881
  }
14830
- /**
14831
- * Token used to drive ApplicationRef.isStable
14832
- *
14833
- * TODO: This should be moved entirely to NgZone (as a breaking change) so it can be tree-shakeable
14834
- * for `NoopNgZone` which is always just an `Observable` of `true`. Additionally, we should consider
14835
- * whether the property on `NgZone` should be `Observable` or `Signal`.
14836
- */
14837
- const ZONE_IS_STABLE_OBSERVABLE = new InjectionToken(ngDevMode ? 'isStable Observable' : '', {
14838
- providedIn: 'root',
14839
- // TODO(atscott): Replace this with a suitable default like `new
14840
- // BehaviorSubject(true).asObservable`. Again, long term this won't exist on ApplicationRef at
14841
- // all but until we can remove it, we need a default value zoneless.
14842
- factory: isStableFactory,
14843
- });
14844
- function isStableFactory() {
14845
- const zone = inject(NgZone);
14846
- let _stable = true;
14847
- const isCurrentlyStable = new Observable((observer) => {
14848
- _stable = zone.isStable && !zone.hasPendingMacrotasks && !zone.hasPendingMicrotasks;
14849
- zone.runOutsideAngular(() => {
14850
- observer.next(_stable);
14851
- observer.complete();
14852
- });
14853
- });
14854
- const isStable = new Observable((observer) => {
14855
- // Create the subscription to onStable outside the Angular Zone so that
14856
- // the callback is run outside the Angular Zone.
14857
- let stableSub;
14858
- zone.runOutsideAngular(() => {
14859
- stableSub = zone.onStable.subscribe(() => {
14860
- NgZone.assertNotInAngularZone();
14861
- // Check whether there are no pending macro/micro tasks in the next tick
14862
- // to allow for NgZone to update the state.
14863
- queueMicrotask(() => {
14864
- if (!_stable && !zone.hasPendingMacrotasks && !zone.hasPendingMicrotasks) {
14865
- _stable = true;
14866
- observer.next(true);
14867
- }
14868
- });
14869
- });
14870
- });
14871
- const unstableSub = zone.onUnstable.subscribe(() => {
14872
- NgZone.assertInAngularZone();
14873
- if (_stable) {
14874
- _stable = false;
14875
- zone.runOutsideAngular(() => {
14876
- observer.next(false);
14877
- });
14878
- }
14879
- });
14880
- return () => {
14881
- stableSub.unsubscribe();
14882
- unstableSub.unsubscribe();
14883
- };
14884
- });
14885
- return merge$1(isCurrentlyStable, isStable.pipe(share()));
14886
- }
14887
14882
  function shouldBeIgnoredByZone(applyArgs) {
14888
14883
  if (!Array.isArray(applyArgs)) {
14889
14884
  return false;
@@ -14906,8 +14901,6 @@ function getNgZone(ngZoneToUse = 'zone.js', options) {
14906
14901
  return ngZoneToUse;
14907
14902
  }
14908
14903
 
14909
- // Public API for Zone
14910
-
14911
14904
  /**
14912
14905
  * The phase to run an `afterRender` or `afterNextRender` callback in.
14913
14906
  *
@@ -15176,13 +15169,6 @@ class AfterRenderCallbackHandlerImpl {
15176
15169
  };
15177
15170
  this.deferredCallbacks = new Set();
15178
15171
  }
15179
- validateBegin() {
15180
- if (this.executingCallbacks) {
15181
- throw new RuntimeError(102 /* RuntimeErrorCode.RECURSIVE_APPLICATION_RENDER */, ngDevMode &&
15182
- 'A new render operation began before the previous operation ended. ' +
15183
- 'Did you trigger change detection from afterRender or afterNextRender?');
15184
- }
15185
- }
15186
15172
  register(callback) {
15187
15173
  // If we're currently running callbacks, new callbacks should be deferred
15188
15174
  // until the next render operation.
@@ -15194,9 +15180,11 @@ class AfterRenderCallbackHandlerImpl {
15194
15180
  this.deferredCallbacks.delete(callback);
15195
15181
  }
15196
15182
  execute() {
15183
+ let callbacksExecuted = false;
15197
15184
  this.executingCallbacks = true;
15198
15185
  for (const bucket of Object.values(this.buckets)) {
15199
15186
  for (const callback of bucket) {
15187
+ callbacksExecuted = true;
15200
15188
  callback.invoke();
15201
15189
  }
15202
15190
  }
@@ -15205,6 +15193,7 @@ class AfterRenderCallbackHandlerImpl {
15205
15193
  this.buckets[callback.phase].add(callback);
15206
15194
  }
15207
15195
  this.deferredCallbacks.clear();
15196
+ return callbacksExecuted;
15208
15197
  }
15209
15198
  destroy() {
15210
15199
  for (const bucket of Object.values(this.buckets)) {
@@ -15219,37 +15208,25 @@ class AfterRenderCallbackHandlerImpl {
15219
15208
  */
15220
15209
  class AfterRenderEventManager {
15221
15210
  constructor() {
15222
- this.renderDepth = 0;
15223
15211
  /* @internal */
15224
15212
  this.handler = null;
15225
15213
  /* @internal */
15226
15214
  this.internalCallbacks = [];
15227
15215
  }
15228
15216
  /**
15229
- * Mark the beginning of a render operation (i.e. CD cycle).
15230
- * Throws if called while executing callbacks.
15217
+ * Executes callbacks. Returns `true` if any callbacks executed.
15231
15218
  */
15232
- begin() {
15233
- this.handler?.validateBegin();
15234
- this.renderDepth++;
15235
- }
15236
- /**
15237
- * Mark the end of a render operation. Callbacks will be
15238
- * executed if there are no more pending operations.
15239
- */
15240
- end() {
15241
- ngDevMode && assertGreaterThan(this.renderDepth, 0, 'renderDepth must be greater than 0');
15242
- this.renderDepth--;
15243
- if (this.renderDepth === 0) {
15244
- // Note: internal callbacks power `internalAfterNextRender`. Since internal callbacks
15245
- // are fairly trivial, they are kept separate so that `AfterRenderCallbackHandlerImpl`
15246
- // can still be tree-shaken unless used by the application.
15247
- for (const callback of this.internalCallbacks) {
15248
- callback();
15249
- }
15250
- this.internalCallbacks.length = 0;
15251
- this.handler?.execute();
15219
+ execute() {
15220
+ // Note: internal callbacks power `internalAfterNextRender`. Since internal callbacks
15221
+ // are fairly trivial, they are kept separate so that `AfterRenderCallbackHandlerImpl`
15222
+ // can still be tree-shaken unless used by the application.
15223
+ const callbacks = [...this.internalCallbacks];
15224
+ this.internalCallbacks.length = 0;
15225
+ for (const callback of callbacks) {
15226
+ callback();
15252
15227
  }
15228
+ const handlerCallbacksExecuted = this.handler?.execute();
15229
+ return !!handlerCallbacksExecuted || callbacks.length > 0;
15253
15230
  }
15254
15231
  ngOnDestroy() {
15255
15232
  this.handler?.destroy();
@@ -15429,11 +15406,18 @@ class ComponentFactoryResolver extends ComponentFactoryResolver$1 {
15429
15406
  }
15430
15407
  function toRefArray(map) {
15431
15408
  const array = [];
15432
- for (let nonMinified in map) {
15433
- if (map.hasOwnProperty(nonMinified)) {
15434
- const minified = map[nonMinified];
15435
- array.push({ propName: minified, templateName: nonMinified });
15409
+ for (const publicName in map) {
15410
+ if (!map.hasOwnProperty(publicName)) {
15411
+ continue;
15436
15412
  }
15413
+ const value = map[publicName];
15414
+ if (value === undefined) {
15415
+ continue;
15416
+ }
15417
+ array.push({
15418
+ propName: Array.isArray(value) ? value[0] : value,
15419
+ templateName: publicName,
15420
+ });
15437
15421
  }
15438
15422
  return array;
15439
15423
  }
@@ -15525,12 +15509,14 @@ class ComponentFactory extends ComponentFactory$1 {
15525
15509
  }
15526
15510
  const sanitizer = rootViewInjector.get(Sanitizer, null);
15527
15511
  const afterRenderEventManager = rootViewInjector.get(AfterRenderEventManager, null);
15512
+ const changeDetectionScheduler = rootViewInjector.get(ChangeDetectionScheduler, null);
15528
15513
  const environment = {
15529
15514
  rendererFactory,
15530
15515
  sanitizer,
15531
15516
  // We don't use inline effects (yet).
15532
15517
  inlineEffectRunner: null,
15533
15518
  afterRenderEventManager,
15519
+ changeDetectionScheduler,
15534
15520
  };
15535
15521
  const hostRenderer = rendererFactory.createRenderer(null, this.componentDef);
15536
15522
  // Determine a tag name used for creating host elements when this component is created
@@ -15539,12 +15525,13 @@ class ComponentFactory extends ComponentFactory$1 {
15539
15525
  const hostRNode = rootSelectorOrNode ?
15540
15526
  locateHostElement(hostRenderer, rootSelectorOrNode, this.componentDef.encapsulation, rootViewInjector) :
15541
15527
  createElementNode(hostRenderer, elementName, getNamespace(elementName));
15542
- // Signal components use the granular "RefreshView" for change detection
15543
- const signalFlags = (4096 /* LViewFlags.SignalView */ | 512 /* LViewFlags.IsRoot */);
15544
- // Non-signal components use the traditional "CheckAlways or OnPush/Dirty" change detection
15545
- const nonSignalFlags = this.componentDef.onPush ? 64 /* LViewFlags.Dirty */ | 512 /* LViewFlags.IsRoot */ :
15546
- 16 /* LViewFlags.CheckAlways */ | 512 /* LViewFlags.IsRoot */;
15547
- const rootFlags = this.componentDef.signals ? signalFlags : nonSignalFlags;
15528
+ let rootFlags = 512 /* LViewFlags.IsRoot */;
15529
+ if (this.componentDef.signals) {
15530
+ rootFlags |= 4096 /* LViewFlags.SignalView */;
15531
+ }
15532
+ else if (!this.componentDef.onPush) {
15533
+ rootFlags |= 16 /* LViewFlags.CheckAlways */;
15534
+ }
15548
15535
  let hydrationInfo = null;
15549
15536
  if (hostRNode !== null) {
15550
15537
  hydrationInfo = retrieveHydrationInfo(hostRNode, rootViewInjector, true /* isRootView */);
@@ -15751,7 +15738,8 @@ function createRootComponent(componentView, rootComponentDef, rootDirectives, ho
15751
15738
  /** Sets the static attributes on a root component. */
15752
15739
  function setRootNodeAttributes(hostRenderer, componentDef, hostRNode, rootSelectorOrNode) {
15753
15740
  if (rootSelectorOrNode) {
15754
- setUpAttributes(hostRenderer, hostRNode, ['ng-version', VERSION.full]);
15741
+ // The placeholder will be replaced with the actual version at build time.
15742
+ setUpAttributes(hostRenderer, hostRNode, ['ng-version', '17.1.0-rc.0']);
15755
15743
  }
15756
15744
  else {
15757
15745
  // If host element is created as a part of this function call (i.e. `rootSelectorOrNode`
@@ -15844,15 +15832,8 @@ function ɵɵInheritDefinitionFeature(definition) {
15844
15832
  superViewQuery && inheritViewQuery(definition, superViewQuery);
15845
15833
  superContentQueries && inheritContentQueries(definition, superContentQueries);
15846
15834
  // Merge inputs and outputs
15847
- fillProperties(definition.inputs, superDef.inputs);
15848
- fillProperties(definition.declaredInputs, superDef.declaredInputs);
15835
+ mergeInputsWithTransforms(definition, superDef);
15849
15836
  fillProperties(definition.outputs, superDef.outputs);
15850
- if (superDef.inputTransforms !== null) {
15851
- if (writeableDef.inputTransforms === null) {
15852
- writeableDef.inputTransforms = {};
15853
- }
15854
- fillProperties(writeableDef.inputTransforms, superDef.inputTransforms);
15855
- }
15856
15837
  // Merge animations metadata.
15857
15838
  // If `superDef` is a Component, the `data` field is present (defaults to an empty object).
15858
15839
  if (isComponentDef(superDef) && superDef.data.animation) {
@@ -15887,6 +15868,35 @@ function ɵɵInheritDefinitionFeature(definition) {
15887
15868
  }
15888
15869
  mergeHostAttrsAcrossInheritance(inheritanceChain);
15889
15870
  }
15871
+ function mergeInputsWithTransforms(target, source) {
15872
+ for (const key in source.inputs) {
15873
+ if (!source.inputs.hasOwnProperty(key)) {
15874
+ continue;
15875
+ }
15876
+ if (target.inputs.hasOwnProperty(key)) {
15877
+ continue;
15878
+ }
15879
+ const value = source.inputs[key];
15880
+ if (value === undefined) {
15881
+ continue;
15882
+ }
15883
+ target.inputs[key] = value;
15884
+ target.declaredInputs[key] = source.declaredInputs[key];
15885
+ // If the input is inherited, and we have a transform for it, we also inherit it.
15886
+ // Note that transforms should not be inherited if the input has its own metadata
15887
+ // in the `source` directive itself already (i.e. the input is re-declared/overridden).
15888
+ if (source.inputTransforms !== null) {
15889
+ // Note: transforms are stored with their minified names.
15890
+ // Perf: only access the minified name when there are source transforms.
15891
+ const minifiedName = Array.isArray(value) ? value[0] : value;
15892
+ if (!source.inputTransforms.hasOwnProperty(minifiedName)) {
15893
+ continue;
15894
+ }
15895
+ target.inputTransforms ??= {};
15896
+ target.inputTransforms[minifiedName] = source.inputTransforms[minifiedName];
15897
+ }
15898
+ }
15899
+ }
15890
15900
  /**
15891
15901
  * Merge the `hostAttrs` and `hostVars` from the inherited parent to the base class.
15892
15902
  *
@@ -16172,8 +16182,7 @@ function validateMappings(bindingType, def, hostDirectiveBindings) {
16172
16182
  throw new RuntimeError(311 /* RuntimeErrorCode.HOST_DIRECTIVE_UNDEFINED_BINDING */, `Directive ${className} does not have an ${bindingType} with a public name of ${publicName}.`);
16173
16183
  }
16174
16184
  const remappedPublicName = hostDirectiveBindings[publicName];
16175
- if (bindings.hasOwnProperty(remappedPublicName) && remappedPublicName !== publicName &&
16176
- bindings[remappedPublicName] !== publicName) {
16185
+ if (bindings.hasOwnProperty(remappedPublicName) && remappedPublicName !== publicName) {
16177
16186
  throw new RuntimeError(312 /* RuntimeErrorCode.HOST_DIRECTIVE_CONFLICTING_ALIAS */, `Cannot alias ${bindingType} ${publicName} of host directive ${className} to ${remappedPublicName}, because it already has a different ${bindingType} with the same public name.`);
16178
16187
  }
16179
16188
  }
@@ -16196,13 +16205,12 @@ function ɵɵInputTransformsFeature(definition) {
16196
16205
  // Note: the private names are used for the keys, rather than the public ones, because public
16197
16206
  // names can be re-aliased in host directives which would invalidate the lookup.
16198
16207
  const value = inputs[minifiedKey];
16199
- if (Array.isArray(value) && value[2]) {
16200
- inputTransforms[minifiedKey] = value[2];
16208
+ if (Array.isArray(value) && value[3]) {
16209
+ inputTransforms[minifiedKey] = value[3];
16201
16210
  }
16202
16211
  }
16203
16212
  }
16204
- definition.inputTransforms =
16205
- inputTransforms;
16213
+ definition.inputTransforms = inputTransforms;
16206
16214
  }
16207
16215
 
16208
16216
  // TODO(misko): consider inlining
@@ -17103,8 +17111,8 @@ function insertTStylingBinding(tData, tNode, tStylingKeyWithStatic, index, isHos
17103
17111
  if (isKeyDuplicateOfStatic) {
17104
17112
  tData[index + 1] = setTStylingRangePrevDuplicate(tData[index + 1]);
17105
17113
  }
17106
- markDuplicates(tData, tStylingKey, index, true, isClassBinding);
17107
- markDuplicates(tData, tStylingKey, index, false, isClassBinding);
17114
+ markDuplicates(tData, tStylingKey, index, true);
17115
+ markDuplicates(tData, tStylingKey, index, false);
17108
17116
  markDuplicateOfResidualStyling(tNode, tStylingKey, tData, index, isClassBinding);
17109
17117
  tBindings = toTStylingRange(tmplHead, tmplTail);
17110
17118
  if (isClassBinding) {
@@ -17188,7 +17196,7 @@ function markDuplicateOfResidualStyling(tNode, tStylingKey, tData, index, isClas
17188
17196
  * - `true` for previous (lower priority);
17189
17197
  * - `false` for next (higher priority).
17190
17198
  */
17191
- function markDuplicates(tData, tStylingKey, index, isPrevDir, isClassBinding) {
17199
+ function markDuplicates(tData, tStylingKey, index, isPrevDir) {
17192
17200
  const tStylingAtIndex = tData[index + 1];
17193
17201
  const isMap = tStylingKey === null;
17194
17202
  let cursor = isPrevDir ? getTStylingRangePrev(tStylingAtIndex) : getTStylingRangeNext(tStylingAtIndex);
@@ -19490,7 +19498,7 @@ function locateDehydratedViewsInContainer(currentRNode, serializedViews) {
19490
19498
  * stored on a given lContainer.
19491
19499
  * Returns `null` by default, when hydration is not enabled.
19492
19500
  */
19493
- let _findMatchingDehydratedViewImpl = (lContainer, template) => null;
19501
+ let _findMatchingDehydratedViewImpl = () => null;
19494
19502
  /**
19495
19503
  * Retrieves the next dehydrated view from the LContainer and verifies that
19496
19504
  * it matches a given template id (from the TView that was used to create this
@@ -20230,7 +20238,7 @@ function insertAnchorNode(hostLView, hostTNode) {
20230
20238
  return commentNode;
20231
20239
  }
20232
20240
  let _locateOrCreateAnchorNode = createAnchorNode;
20233
- let _populateDehydratedViewsInLContainer = (lContainer, tNode, hostLView) => false; // noop by default
20241
+ let _populateDehydratedViewsInLContainer = () => false; // noop by default
20234
20242
  /**
20235
20243
  * Looks up dehydrated views that belong to a given LContainer and populates
20236
20244
  * this information into the `LContainer[DEHYDRATED_VIEWS]` slot. When running
@@ -20545,10 +20553,12 @@ class RepeaterMetadata {
20545
20553
  * @param emptyTemplateFn Reference to the template function of the empty block.
20546
20554
  * @param emptyDecls The number of nodes, local refs, and pipes for the empty block.
20547
20555
  * @param emptyVars The number of bindings for the empty block.
20556
+ * @param emptyTagName The name of the empty block container element, if applicable
20557
+ * @param emptyAttrsIndex Index of the empty block template attributes in the `consts` array.
20548
20558
  *
20549
20559
  * @codeGenApi
20550
20560
  */
20551
- function ɵɵrepeaterCreate(index, templateFn, decls, vars, tagName, attrsIndex, trackByFn, trackByUsesComponentInstance, emptyTemplateFn, emptyDecls, emptyVars) {
20561
+ function ɵɵrepeaterCreate(index, templateFn, decls, vars, tagName, attrsIndex, trackByFn, trackByUsesComponentInstance, emptyTemplateFn, emptyDecls, emptyVars, emptyTagName, emptyAttrsIndex) {
20552
20562
  performanceMarkFeature('NgControlFlow');
20553
20563
  const hasEmptyBlock = emptyTemplateFn !== undefined;
20554
20564
  const hostLView = getLView();
@@ -20565,7 +20575,7 @@ function ɵɵrepeaterCreate(index, templateFn, decls, vars, tagName, attrsIndex,
20565
20575
  assertDefined(emptyDecls, 'Missing number of declarations for the empty repeater block.');
20566
20576
  ngDevMode &&
20567
20577
  assertDefined(emptyVars, 'Missing number of bindings for the empty repeater block.');
20568
- ɵɵtemplate(index + 2, emptyTemplateFn, emptyDecls, emptyVars);
20578
+ ɵɵtemplate(index + 2, emptyTemplateFn, emptyDecls, emptyVars, emptyTagName, emptyAttrsIndex);
20569
20579
  }
20570
20580
  }
20571
20581
  class LiveCollectionLContainerImpl extends LiveCollection {
@@ -20806,6 +20816,8 @@ function invokeAllTriggerCleanupFns(lDetails) {
20806
20816
  invokeTriggerCleanupFns(0 /* TriggerType.Regular */, lDetails);
20807
20817
  }
20808
20818
 
20819
+ // Public API for Zone
20820
+
20809
20821
  /**
20810
20822
  * Calculates a data slot index for defer block info (either static or
20811
20823
  * instance-specific), given an index of a defer instruction.
@@ -20975,8 +20987,6 @@ function onInteraction(trigger, callback) {
20975
20987
  // are referencing it.
20976
20988
  entry = new DeferEventEntry();
20977
20989
  interactionTriggers.set(trigger, entry);
20978
- // Ensure that the handler runs in the NgZone
20979
- ngDevMode && NgZone.assertInAngularZone();
20980
20990
  for (const name of interactionEventNames) {
20981
20991
  trigger.addEventListener(name, entry.listener, eventListenerOptions);
20982
20992
  }
@@ -21004,8 +21014,6 @@ function onHover(trigger, callback) {
21004
21014
  if (!entry) {
21005
21015
  entry = new DeferEventEntry();
21006
21016
  hoverTriggers.set(trigger, entry);
21007
- // Ensure that the handler runs in the NgZone
21008
- ngDevMode && NgZone.assertInAngularZone();
21009
21017
  for (const name of hoverEventNames) {
21010
21018
  trigger.addEventListener(name, entry.listener, eventListenerOptions);
21011
21019
  }
@@ -27134,8 +27142,9 @@ function getDirectiveMetadata$1(directiveOrComponentInstance) {
27134
27142
  // To ensure we don't get the metadata of the directive, we want to call `getComponentDef` first.
27135
27143
  const componentDef = getComponentDef(constructor);
27136
27144
  if (componentDef) {
27145
+ const inputs = extractInputDebugMetadata(componentDef.inputs);
27137
27146
  return {
27138
- inputs: componentDef.inputs,
27147
+ inputs,
27139
27148
  outputs: componentDef.outputs,
27140
27149
  encapsulation: componentDef.encapsulation,
27141
27150
  changeDetection: componentDef.onPush ? ChangeDetectionStrategy.OnPush :
@@ -27144,7 +27153,8 @@ function getDirectiveMetadata$1(directiveOrComponentInstance) {
27144
27153
  }
27145
27154
  const directiveDef = getDirectiveDef(constructor);
27146
27155
  if (directiveDef) {
27147
- return { inputs: directiveDef.inputs, outputs: directiveDef.outputs };
27156
+ const inputs = extractInputDebugMetadata(directiveDef.inputs);
27157
+ return { inputs, outputs: directiveDef.outputs };
27148
27158
  }
27149
27159
  return null;
27150
27160
  }
@@ -27298,6 +27308,36 @@ function assertDomElement(value) {
27298
27308
  throw new Error('Expecting instance of DOM Element');
27299
27309
  }
27300
27310
  }
27311
+ /**
27312
+ * A directive definition holds additional metadata using bitwise flags to indicate
27313
+ * for example whether it is signal based.
27314
+ *
27315
+ * This information needs to be separate from the `publicName -> minifiedName`
27316
+ * mappings for backwards compatibility.
27317
+ */
27318
+ function extractInputDebugMetadata(inputs) {
27319
+ const res = {};
27320
+ for (const key in inputs) {
27321
+ if (!inputs.hasOwnProperty(key)) {
27322
+ continue;
27323
+ }
27324
+ const value = inputs[key];
27325
+ if (value === undefined) {
27326
+ continue;
27327
+ }
27328
+ let minifiedName;
27329
+ if (Array.isArray(value)) {
27330
+ minifiedName = value[0];
27331
+ // flags are not used for now.
27332
+ // TODO: Consider exposing flag information in discovery.
27333
+ }
27334
+ else {
27335
+ minifiedName = value;
27336
+ }
27337
+ res[key] = minifiedName;
27338
+ }
27339
+ return res;
27340
+ }
27301
27341
 
27302
27342
  /**
27303
27343
  * The name of a field that Angular monkey-patches onto a component
@@ -28842,6 +28882,7 @@ const angularCoreEnv = (() => ({
28842
28882
  'ɵɵvalidateIframeAttribute': ɵɵvalidateIframeAttribute,
28843
28883
  'forwardRef': forwardRef,
28844
28884
  'resolveForwardRef': resolveForwardRef,
28885
+ 'ɵɵInputFlags': InputFlags,
28845
28886
  }))();
28846
28887
 
28847
28888
  let jitOptions = null;
@@ -30008,6 +30049,25 @@ const NgModule = makeDecorator('NgModule', (ngModule) => ngModule, undefined, un
30008
30049
  * to be used by the decorator versions of these annotations.
30009
30050
  */
30010
30051
 
30052
+ /**
30053
+ * @description Represents the version of Angular
30054
+ *
30055
+ * @publicApi
30056
+ */
30057
+ class Version {
30058
+ constructor(full) {
30059
+ this.full = full;
30060
+ const parts = full.split('.');
30061
+ this.major = parts[0];
30062
+ this.minor = parts[1];
30063
+ this.patch = parts.slice(2).join('.');
30064
+ }
30065
+ }
30066
+ /**
30067
+ * @publicApi
30068
+ */
30069
+ const VERSION = new Version('17.1.0-rc.0');
30070
+
30011
30071
  /*
30012
30072
  * This file exists to support compilation of @angular/core in Ivy mode.
30013
30073
  *
@@ -30046,45 +30106,6 @@ class Console {
30046
30106
  args: [{ providedIn: 'platform' }]
30047
30107
  }], null, null); })();
30048
30108
 
30049
- /**
30050
- * *Internal* service that keeps track of pending tasks happening in the system
30051
- * during the initial rendering. No tasks are tracked after an initial
30052
- * rendering.
30053
- *
30054
- * This information is needed to make sure that the serialization on the server
30055
- * is delayed until all tasks in the queue (such as an initial navigation or a
30056
- * pending HTTP request) are completed.
30057
- */
30058
- class InitialRenderPendingTasks {
30059
- constructor() {
30060
- this.taskId = 0;
30061
- this.pendingTasks = new Set();
30062
- this.hasPendingTasks = new BehaviorSubject(false);
30063
- }
30064
- add() {
30065
- this.hasPendingTasks.next(true);
30066
- const taskId = this.taskId++;
30067
- this.pendingTasks.add(taskId);
30068
- return taskId;
30069
- }
30070
- remove(taskId) {
30071
- this.pendingTasks.delete(taskId);
30072
- if (this.pendingTasks.size === 0) {
30073
- this.hasPendingTasks.next(false);
30074
- }
30075
- }
30076
- ngOnDestroy() {
30077
- this.pendingTasks.clear();
30078
- this.hasPendingTasks.next(false);
30079
- }
30080
- static { this.ɵfac = function InitialRenderPendingTasks_Factory(t) { return new (t || InitialRenderPendingTasks)(); }; }
30081
- static { this.ɵprov = /*@__PURE__*/ ɵɵdefineInjectable({ token: InitialRenderPendingTasks, factory: InitialRenderPendingTasks.ɵfac, providedIn: 'root' }); }
30082
- }
30083
- (() => { (typeof ngDevMode === "undefined" || ngDevMode) && setClassMetadata(InitialRenderPendingTasks, [{
30084
- type: Injectable,
30085
- args: [{ providedIn: 'root' }]
30086
- }], null, null); })();
30087
-
30088
30109
  /**
30089
30110
  * Combination of NgModuleFactory and ComponentFactories.
30090
30111
  *
@@ -30191,6 +30212,53 @@ const COMPILER_OPTIONS = new InjectionToken('compilerOptions');
30191
30212
  class CompilerFactory {
30192
30213
  }
30193
30214
 
30215
+ /**
30216
+ * *Internal* service that keeps track of pending tasks happening in the system.
30217
+ *
30218
+ * This information is needed to make sure that the serialization on the server
30219
+ * is delayed until all tasks in the queue (such as an initial navigation or a
30220
+ * pending HTTP request) are completed.
30221
+ *
30222
+ * Pending tasks continue to contribute to the stableness of `ApplicationRef`
30223
+ * throughout the lifetime of the application.
30224
+ */
30225
+ class PendingTasks {
30226
+ constructor() {
30227
+ this.taskId = 0;
30228
+ this.pendingTasks = new Set();
30229
+ this.hasPendingTasks = new BehaviorSubject(false);
30230
+ }
30231
+ get _hasPendingTasks() {
30232
+ return this.hasPendingTasks.value;
30233
+ }
30234
+ add() {
30235
+ if (!this._hasPendingTasks) {
30236
+ this.hasPendingTasks.next(true);
30237
+ }
30238
+ const taskId = this.taskId++;
30239
+ this.pendingTasks.add(taskId);
30240
+ return taskId;
30241
+ }
30242
+ remove(taskId) {
30243
+ this.pendingTasks.delete(taskId);
30244
+ if (this.pendingTasks.size === 0 && this._hasPendingTasks) {
30245
+ this.hasPendingTasks.next(false);
30246
+ }
30247
+ }
30248
+ ngOnDestroy() {
30249
+ this.pendingTasks.clear();
30250
+ if (this._hasPendingTasks) {
30251
+ this.hasPendingTasks.next(false);
30252
+ }
30253
+ }
30254
+ static { this.ɵfac = function PendingTasks_Factory(t) { return new (t || PendingTasks)(); }; }
30255
+ static { this.ɵprov = /*@__PURE__*/ ɵɵdefineInjectable({ token: PendingTasks, factory: PendingTasks.ɵfac, providedIn: 'root' }); }
30256
+ }
30257
+ (() => { (typeof ngDevMode === "undefined" || ngDevMode) && setClassMetadata(PendingTasks, [{
30258
+ type: Injectable,
30259
+ args: [{ providedIn: 'root' }]
30260
+ }], null, null); })();
30261
+
30194
30262
  /**
30195
30263
  * These are the data structures that our framework injector profiler will fill with data in order
30196
30264
  * to support DI debugging APIs.
@@ -30996,6 +31064,28 @@ function getModuleInjectorOfNodeInjector(injector) {
30996
31064
  * tools are patched (window.ng).
30997
31065
  * */
30998
31066
  const GLOBAL_PUBLISH_EXPANDO_KEY = 'ng';
31067
+ const globalUtilsFunctions = {
31068
+ /**
31069
+ * Warning: functions that start with `ɵ` are considered *INTERNAL* and should not be relied upon
31070
+ * in application's code. The contract of those functions might be changed in any release and/or a
31071
+ * function can be removed completely.
31072
+ */
31073
+ 'ɵgetDependenciesFromInjectable': getDependenciesFromInjectable,
31074
+ 'ɵgetInjectorProviders': getInjectorProviders,
31075
+ 'ɵgetInjectorResolutionPath': getInjectorResolutionPath,
31076
+ 'ɵgetInjectorMetadata': getInjectorMetadata,
31077
+ 'ɵsetProfiler': setProfiler,
31078
+ 'getDirectiveMetadata': getDirectiveMetadata$1,
31079
+ 'getComponent': getComponent,
31080
+ 'getContext': getContext,
31081
+ 'getListeners': getListeners,
31082
+ 'getOwningComponent': getOwningComponent,
31083
+ 'getHostElement': getHostElement,
31084
+ 'getInjector': getInjector,
31085
+ 'getRootComponents': getRootComponents,
31086
+ 'getDirectives': getDirectives,
31087
+ 'applyChanges': applyChanges,
31088
+ };
30999
31089
  let _published = false;
31000
31090
  /**
31001
31091
  * Publishes a collection of default debug tools onto`window.ng`.
@@ -31007,26 +31097,9 @@ function publishDefaultGlobalUtils$1() {
31007
31097
  if (!_published) {
31008
31098
  _published = true;
31009
31099
  setupFrameworkInjectorProfiler();
31010
- publishGlobalUtil('ɵgetDependenciesFromInjectable', getDependenciesFromInjectable);
31011
- publishGlobalUtil('ɵgetInjectorProviders', getInjectorProviders);
31012
- publishGlobalUtil('ɵgetInjectorResolutionPath', getInjectorResolutionPath);
31013
- publishGlobalUtil('ɵgetInjectorMetadata', getInjectorMetadata);
31014
- /**
31015
- * Warning: this function is *INTERNAL* and should not be relied upon in application's code.
31016
- * The contract of the function might be changed in any release and/or the function can be
31017
- * removed completely.
31018
- */
31019
- publishGlobalUtil('ɵsetProfiler', setProfiler);
31020
- publishGlobalUtil('getDirectiveMetadata', getDirectiveMetadata$1);
31021
- publishGlobalUtil('getComponent', getComponent);
31022
- publishGlobalUtil('getContext', getContext);
31023
- publishGlobalUtil('getListeners', getListeners);
31024
- publishGlobalUtil('getOwningComponent', getOwningComponent);
31025
- publishGlobalUtil('getHostElement', getHostElement);
31026
- publishGlobalUtil('getInjector', getInjector);
31027
- publishGlobalUtil('getRootComponents', getRootComponents);
31028
- publishGlobalUtil('getDirectives', getDirectives);
31029
- publishGlobalUtil('applyChanges', applyChanges);
31100
+ for (const [methodName, method] of Object.entries(globalUtilsFunctions)) {
31101
+ publishGlobalUtil(methodName, method);
31102
+ }
31030
31103
  }
31031
31104
  }
31032
31105
  /**
@@ -31041,13 +31114,8 @@ function publishGlobalUtil(name, fn) {
31041
31114
  // for typings for AngularJS (via `goog.provide('ng....')`).
31042
31115
  const w = _global;
31043
31116
  ngDevMode && assertDefined(fn, 'function not defined');
31044
- if (w) {
31045
- let container = w[GLOBAL_PUBLISH_EXPANDO_KEY];
31046
- if (!container) {
31047
- container = w[GLOBAL_PUBLISH_EXPANDO_KEY] = {};
31048
- }
31049
- container[name] = fn;
31050
- }
31117
+ w[GLOBAL_PUBLISH_EXPANDO_KEY] ??= {};
31118
+ w[GLOBAL_PUBLISH_EXPANDO_KEY][name] = fn;
31051
31119
  }
31052
31120
  }
31053
31121
 
@@ -31091,13 +31159,6 @@ class Testability {
31091
31159
  this.registry = registry;
31092
31160
  this._pendingCount = 0;
31093
31161
  this._isZoneStable = true;
31094
- /**
31095
- * Whether any work was done since the last 'whenStable' callback. This is
31096
- * useful to detect if this could have potentially destabilized another
31097
- * component while it is stabilizing.
31098
- * @internal
31099
- */
31100
- this._didWork = false;
31101
31162
  this._callbacks = [];
31102
31163
  this.taskTrackingZone = null;
31103
31164
  // If there was no Testability logic registered in the global scope
@@ -31115,7 +31176,6 @@ class Testability {
31115
31176
  _watchAngularEvents() {
31116
31177
  this._ngZone.onUnstable.subscribe({
31117
31178
  next: () => {
31118
- this._didWork = true;
31119
31179
  this._isZoneStable = false;
31120
31180
  }
31121
31181
  });
@@ -31137,7 +31197,6 @@ class Testability {
31137
31197
  */
31138
31198
  increasePendingRequestCount() {
31139
31199
  this._pendingCount += 1;
31140
- this._didWork = true;
31141
31200
  return this._pendingCount;
31142
31201
  }
31143
31202
  /**
@@ -31165,9 +31224,8 @@ class Testability {
31165
31224
  while (this._callbacks.length !== 0) {
31166
31225
  let cb = this._callbacks.pop();
31167
31226
  clearTimeout(cb.timeoutId);
31168
- cb.doneCb(this._didWork);
31227
+ cb.doneCb();
31169
31228
  }
31170
- this._didWork = false;
31171
31229
  });
31172
31230
  }
31173
31231
  else {
@@ -31180,7 +31238,6 @@ class Testability {
31180
31238
  }
31181
31239
  return true;
31182
31240
  });
31183
- this._didWork = true;
31184
31241
  }
31185
31242
  }
31186
31243
  getPendingTasks() {
@@ -31203,7 +31260,7 @@ class Testability {
31203
31260
  if (timeout && timeout > 0) {
31204
31261
  timeoutId = setTimeout(() => {
31205
31262
  this._callbacks = this._callbacks.filter((cb) => cb.timeoutId !== timeoutId);
31206
- cb(this._didWork, this.getPendingTasks());
31263
+ cb();
31207
31264
  }, timeout);
31208
31265
  }
31209
31266
  this._callbacks.push({ doneCb: cb, timeoutId: timeoutId, updateCb: updateCb });
@@ -31225,7 +31282,6 @@ class Testability {
31225
31282
  throw new Error('Task tracking zone is required when passing an update callback to ' +
31226
31283
  'whenStable(). Is "zone.js/plugins/task-tracking" loaded?');
31227
31284
  }
31228
- // These arguments are 'Function' above to keep the public API simple.
31229
31285
  this.addCallback(doneCb, timeout, updateCb);
31230
31286
  this._runCallbacksIfReady();
31231
31287
  }
@@ -31734,7 +31790,7 @@ class ApplicationRef {
31734
31790
  /** @internal */
31735
31791
  this._views = [];
31736
31792
  this.internalErrorHandler = inject(INTERNAL_APPLICATION_ERROR_HANDLER);
31737
- this.zoneIsStable = inject(ZONE_IS_STABLE_OBSERVABLE);
31793
+ this.afterRenderEffectManager = inject(AfterRenderEventManager);
31738
31794
  /**
31739
31795
  * Get a list of component types registered to this application.
31740
31796
  * This list is populated even before the component is created.
@@ -31747,8 +31803,7 @@ class ApplicationRef {
31747
31803
  /**
31748
31804
  * Returns an Observable that indicates when the application is stable or unstable.
31749
31805
  */
31750
- this.isStable = inject(InitialRenderPendingTasks)
31751
- .hasPendingTasks.pipe(switchMap(hasPendingTasks => hasPendingTasks ? of(false) : this.zoneIsStable), distinctUntilChanged());
31806
+ this.isStable = inject(PendingTasks).hasPendingTasks.pipe(map(pending => !pending));
31752
31807
  this._injector = inject(EnvironmentInjector);
31753
31808
  }
31754
31809
  /**
@@ -31806,10 +31861,12 @@ class ApplicationRef {
31806
31861
  const initStatus = this._injector.get(ApplicationInitStatus);
31807
31862
  if (!initStatus.done) {
31808
31863
  const standalone = !isComponentFactory && isStandalone(componentOrFactory);
31809
- const errorMessage = 'Cannot bootstrap as there are still asynchronous initializers running.' +
31810
- (standalone ? '' :
31811
- ' Bootstrap components in the `ngDoBootstrap` method of the root module.');
31812
- throw new RuntimeError(405 /* RuntimeErrorCode.ASYNC_INITIALIZERS_STILL_RUNNING */, (typeof ngDevMode === 'undefined' || ngDevMode) && errorMessage);
31864
+ const errorMessage = (typeof ngDevMode === 'undefined' || ngDevMode) &&
31865
+ 'Cannot bootstrap as there are still asynchronous initializers running.' +
31866
+ (standalone ?
31867
+ '' :
31868
+ ' Bootstrap components in the `ngDoBootstrap` method of the root module.');
31869
+ throw new RuntimeError(405 /* RuntimeErrorCode.ASYNC_INITIALIZERS_STILL_RUNNING */, errorMessage);
31813
31870
  }
31814
31871
  let componentFactory;
31815
31872
  if (isComponentFactory) {
@@ -31870,6 +31927,18 @@ class ApplicationRef {
31870
31927
  this.internalErrorHandler(e);
31871
31928
  }
31872
31929
  finally {
31930
+ // Catch any `ExpressionChanged...` errors and report them to error handler like above
31931
+ try {
31932
+ const callbacksExecuted = this.afterRenderEffectManager.execute();
31933
+ if ((typeof ngDevMode === 'undefined' || ngDevMode) && callbacksExecuted) {
31934
+ for (let view of this._views) {
31935
+ view.checkNoChanges();
31936
+ }
31937
+ }
31938
+ }
31939
+ catch (e) {
31940
+ this.internalErrorHandler(e);
31941
+ }
31873
31942
  this._runningTick = false;
31874
31943
  }
31875
31944
  }
@@ -32052,8 +32121,17 @@ function internalProvideZoneChangeDetection(ngZoneFactory) {
32052
32121
  return () => ngZoneChangeDetectionScheduler.initialize();
32053
32122
  },
32054
32123
  },
32124
+ {
32125
+ provide: ENVIRONMENT_INITIALIZER,
32126
+ multi: true,
32127
+ useFactory: () => {
32128
+ const service = inject(ZoneStablePendingTask);
32129
+ return () => {
32130
+ service.initialize();
32131
+ };
32132
+ }
32133
+ },
32055
32134
  { provide: INTERNAL_APPLICATION_ERROR_HANDLER, useFactory: ngZoneApplicationErrorHandlerFactory },
32056
- { provide: ZONE_IS_STABLE_OBSERVABLE, useFactory: isStableFactory },
32057
32135
  ];
32058
32136
  }
32059
32137
  function ngZoneApplicationErrorHandlerFactory() {
@@ -32099,6 +32177,50 @@ function getNgZoneOptions(options) {
32099
32177
  shouldCoalesceRunChangeDetection: options?.runCoalescing ?? false,
32100
32178
  };
32101
32179
  }
32180
+ class ZoneStablePendingTask {
32181
+ constructor() {
32182
+ this.subscription = new Subscription();
32183
+ this.initialized = false;
32184
+ this.zone = inject(NgZone);
32185
+ this.pendingTasks = inject(PendingTasks);
32186
+ }
32187
+ initialize() {
32188
+ if (this.initialized) {
32189
+ return;
32190
+ }
32191
+ this.initialized = true;
32192
+ let task = null;
32193
+ if (!this.zone.isStable && !this.zone.hasPendingMacrotasks && !this.zone.hasPendingMicrotasks) {
32194
+ task = this.pendingTasks.add();
32195
+ }
32196
+ this.zone.runOutsideAngular(() => {
32197
+ this.subscription.add(this.zone.onStable.subscribe(() => {
32198
+ NgZone.assertNotInAngularZone();
32199
+ // Check whether there are no pending macro/micro tasks in the next tick
32200
+ // to allow for NgZone to update the state.
32201
+ queueMicrotask(() => {
32202
+ if (task !== null && !this.zone.hasPendingMacrotasks && !this.zone.hasPendingMicrotasks) {
32203
+ this.pendingTasks.remove(task);
32204
+ task = null;
32205
+ }
32206
+ });
32207
+ }));
32208
+ });
32209
+ this.subscription.add(this.zone.onUnstable.subscribe(() => {
32210
+ NgZone.assertInAngularZone();
32211
+ task ??= this.pendingTasks.add();
32212
+ }));
32213
+ }
32214
+ ngOnDestroy() {
32215
+ this.subscription.unsubscribe();
32216
+ }
32217
+ static { this.ɵfac = function ZoneStablePendingTask_Factory(t) { return new (t || ZoneStablePendingTask)(); }; }
32218
+ static { this.ɵprov = /*@__PURE__*/ ɵɵdefineInjectable({ token: ZoneStablePendingTask, factory: ZoneStablePendingTask.ɵfac, providedIn: 'root' }); }
32219
+ }
32220
+ (() => { (typeof ngDevMode === "undefined" || ngDevMode) && setClassMetadata(ZoneStablePendingTask, [{
32221
+ type: Injectable,
32222
+ args: [{ providedIn: 'root' }]
32223
+ }], null, null); })();
32102
32224
 
32103
32225
  /**
32104
32226
  * Work out the locale from the potential global properties.
@@ -33720,14 +33842,6 @@ function signalUpdateFn(node, updater) {
33720
33842
  }
33721
33843
  signalSetFn(node, updater(node.value));
33722
33844
  }
33723
- function signalMutateFn(node, mutator) {
33724
- if (!producerUpdatesAllowed()) {
33725
- throwInvalidWriteToSignalError();
33726
- }
33727
- // Mutate bypasses equality checks as it's by definition changing the value.
33728
- mutator(node.value);
33729
- signalValueChanged(node);
33730
- }
33731
33845
  // Note: Using an IIFE here to ensure that the spread assignment is not considered
33732
33846
  // a side-effect, ending up preserving `COMPUTED_NODE` and `REACTIVE_NODE`.
33733
33847
  // TODO: remove when https://github.com/evanw/esbuild/issues/3392 is resolved.
@@ -34061,6 +34175,49 @@ function internalCreateApplication(config) {
34061
34175
  }
34062
34176
  }
34063
34177
 
34178
+ class ChangeDetectionSchedulerImpl {
34179
+ constructor() {
34180
+ this.appRef = inject(ApplicationRef);
34181
+ this.taskService = inject(PendingTasks);
34182
+ this.pendingRenderTaskId = null;
34183
+ }
34184
+ notify() {
34185
+ if (this.pendingRenderTaskId !== null)
34186
+ return;
34187
+ this.pendingRenderTaskId = this.taskService.add();
34188
+ setTimeout(() => {
34189
+ try {
34190
+ if (!this.appRef.destroyed) {
34191
+ this.appRef.tick();
34192
+ }
34193
+ }
34194
+ finally {
34195
+ // If this is the last task, the service will synchronously emit a stable notification. If
34196
+ // there is a subscriber that then acts in a way that tries to notify the scheduler again,
34197
+ // we need to be able to respond to schedule a new change detection. Therefore, we should
34198
+ // clear the task ID before removing it from the pending tasks (or the tasks service should
34199
+ // not synchronously emit stable, similar to how Zone stableness only happens if it's still
34200
+ // stable after a microtask).
34201
+ const taskId = this.pendingRenderTaskId;
34202
+ this.pendingRenderTaskId = null;
34203
+ this.taskService.remove(taskId);
34204
+ }
34205
+ });
34206
+ }
34207
+ static { this.ɵfac = function ChangeDetectionSchedulerImpl_Factory(t) { return new (t || ChangeDetectionSchedulerImpl)(); }; }
34208
+ static { this.ɵprov = /*@__PURE__*/ ɵɵdefineInjectable({ token: ChangeDetectionSchedulerImpl, factory: ChangeDetectionSchedulerImpl.ɵfac, providedIn: 'root' }); }
34209
+ }
34210
+ (() => { (typeof ngDevMode === "undefined" || ngDevMode) && setClassMetadata(ChangeDetectionSchedulerImpl, [{
34211
+ type: Injectable,
34212
+ args: [{ providedIn: 'root' }]
34213
+ }], null, null); })();
34214
+ function provideZonelessChangeDetection() {
34215
+ return makeEnvironmentProviders([
34216
+ { provide: ChangeDetectionScheduler, useExisting: ChangeDetectionSchedulerImpl },
34217
+ { provide: NgZone, useClass: NoopNgZone },
34218
+ ]);
34219
+ }
34220
+
34064
34221
  /**
34065
34222
  * Retrieves all defer blocks in a given LView.
34066
34223
  *
@@ -35113,5 +35270,5 @@ if (typeof ngDevMode !== 'undefined' && ngDevMode) {
35113
35270
  * Generated bundle index. Do not edit.
35114
35271
  */
35115
35272
 
35116
- 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, HostBinding, HostListener, 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, PACKAGE_ROOT_URL, PLATFORM_ID, PLATFORM_INITIALIZER, Pipe, PlatformRef, Query, QueryList, Renderer2, RendererFactory2, RendererStyleFlags2, Sanitizer, SecurityContext, Self, SimpleChange, SkipSelf, TRANSLATIONS, TRANSLATIONS_FORMAT, TemplateRef, Testability, TestabilityRegistry, TransferState, Type, VERSION, Version, ViewChild, ViewChildren, ViewContainerRef, ViewEncapsulation$1 as ViewEncapsulation, ViewRef, afterNextRender, afterRender, asNativeElements, assertInInjectionContext, assertNotInReactiveContext, assertPlatform, booleanAttribute, computed, createComponent, createEnvironmentInjector, createNgModule, createNgModuleRef, createPlatform, createPlatformFactory, defineInjectable, destroyPlatform, effect, enableProdMode, forwardRef, getDebugNode, getModuleFactory, getNgModuleById, getPlatform, importProvidersFrom, inject, isDevMode, isSignal, isStandalone, makeEnvironmentProviders, makeStateKey, mergeApplicationConfig, numberAttribute, platformCore, provideZoneChangeDetection, reflectComponentType, resolveForwardRef, runInInjectionContext, setTestabilityGetter, signal, untracked, ALLOW_MULTIPLE_PLATFORMS as ɵALLOW_MULTIPLE_PLATFORMS, AfterRenderEventManager as ɵAfterRenderEventManager, CONTAINER_HEADER_OFFSET as ɵCONTAINER_HEADER_OFFSET, 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, 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, IS_HYDRATION_DOM_REUSE_ENABLED as ɵIS_HYDRATION_DOM_REUSE_ENABLED, InitialRenderPendingTasks as ɵInitialRenderPendingTasks, LContext as ɵLContext, LifecycleHooksFeature as ɵLifecycleHooksFeature, LocaleDataIndex as ɵLocaleDataIndex, 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, 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, USE_RUNTIME_DEPS_TRACKER_FOR_JIT as ɵUSE_RUNTIME_DEPS_TRACKER_FOR_JIT, ViewRef$1 as ɵViewRef, XSS_SECURITY_URL as ɵXSS_SECURITY_URL, ZoneAwareQueueingScheduler as ɵZoneAwareQueueingScheduler, _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, devModeEqual as ɵdevModeEqual, findLocaleData as ɵfindLocaleData, flushModuleScopingQueueAsMuchAsPossible as ɵflushModuleScopingQueueAsMuchAsPossible, formatRuntimeError as ɵformatRuntimeError, generateStandaloneInDeclarationsError as ɵgenerateStandaloneInDeclarationsError, getAsyncClassMetadataFn as ɵgetAsyncClassMetadataFn, getDebugNode as ɵgetDebugNode, getDeferBlocks as ɵgetDeferBlocks, getDirectives as ɵgetDirectives, getHostElement as ɵgetHostElement, getInjectableDef as ɵgetInjectableDef, getLContext as ɵgetLContext, getLocaleCurrencyCode as ɵgetLocaleCurrencyCode, getLocalePluralCase as ɵgetLocalePluralCase, getSanitizationBypassType as ɵgetSanitizationBypassType, ɵgetUnknownElementStrictMode, ɵgetUnknownPropertyStrictMode, _global as ɵglobal, injectChangeDetectorRef as ɵinjectChangeDetectorRef, input as ɵinput, inputFunction as ɵinputFunctionForApiGuard, inputRequiredFunction as ɵinputFunctionRequiredForApiGuard, internalAfterNextRender as ɵinternalAfterNextRender, internalCreateApplication as ɵinternalCreateApplication, isBoundToModule as ɵisBoundToModule, isComponentDefPendingResolution as ɵisComponentDefPendingResolution, isEnvironmentProviders as ɵisEnvironmentProviders, isInjectable as ɵisInjectable, isNgModule as ɵisNgModule, isPromise as ɵisPromise, isSubscribable as ɵisSubscribable, noSideEffects as ɵnoSideEffects, patchComponentDefWithScope as ɵpatchComponentDefWithScope, performanceMarkFeature as ɵperformanceMarkFeature, publishDefaultGlobalUtils$1 as ɵpublishDefaultGlobalUtils, publishGlobalUtil as ɵpublishGlobalUtil, 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, store as ɵstore, stringify as ɵstringify, transitiveScopesFor as ɵtransitiveScopesFor, triggerResourceLoading as ɵtriggerResourceLoading, truncateMiddle as ɵtruncateMiddle, unregisterAllLocaleData as ɵunregisterLocaleData, unwrapSafeValue as ɵunwrapSafeValue, whenStable as ɵwhenStable, withDomHydration as ɵwithDomHydration, ɵɵCopyDefinitionFeature, FactoryTarget as ɵɵFactoryTarget, ɵɵHostDirectivesFeature, ɵɵInheritDefinitionFeature, ɵɵInputTransformsFeature, ɵɵNgOnChangesFeature, ɵɵProvidersFeature, ɵɵStandaloneFeature, ɵɵadvance, ɵɵattribute, ɵɵattributeInterpolate1, ɵɵattributeInterpolate2, ɵɵattributeInterpolate3, ɵɵattributeInterpolate4, ɵɵattributeInterpolate5, ɵɵattributeInterpolate6, ɵɵattributeInterpolate7, ɵɵattributeInterpolate8, ɵɵattributeInterpolateV, ɵɵclassMap, ɵɵclassMapInterpolate1, ɵɵclassMapInterpolate2, ɵɵclassMapInterpolate3, ɵɵclassMapInterpolate4, ɵɵclassMapInterpolate5, ɵɵclassMapInterpolate6, ɵɵclassMapInterpolate7, ɵɵclassMapInterpolate8, ɵɵclassMapInterpolateV, ɵɵclassProp, ɵɵcomponentInstance, ɵɵconditional, ɵɵcontentQuery, ɵɵdefer, ɵɵdeferEnableTimerScheduling, ɵɵ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, ɵɵ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, ɵɵqueryRefresh, ɵɵreference, registerNgModuleType as ɵɵregisterNgModuleType, ɵɵrepeater, ɵɵrepeaterCreate, ɵɵrepeaterTrackByIdentity, ɵɵrepeaterTrackByIndex, ɵɵresetView, ɵɵresolveBody, ɵɵresolveDocument, ɵɵresolveWindow, ɵɵrestoreView, ɵɵsanitizeHtml, ɵɵsanitizeResourceUrl, ɵɵsanitizeScript, ɵɵsanitizeStyle, ɵɵsanitizeUrl, ɵɵsanitizeUrlOrResourceUrl, ɵɵsetComponentScope, ɵɵsetNgModuleScope, ɵɵ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, ɵɵvalidateIframeAttribute, ɵɵviewQuery };
35273
+ 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, HostBinding, HostListener, 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, PACKAGE_ROOT_URL, PLATFORM_ID, PLATFORM_INITIALIZER, Pipe, PlatformRef, Query, QueryList, Renderer2, RendererFactory2, RendererStyleFlags2, Sanitizer, SecurityContext, Self, SimpleChange, SkipSelf, TRANSLATIONS, TRANSLATIONS_FORMAT, TemplateRef, Testability, TestabilityRegistry, TransferState, Type, VERSION, Version, ViewChild, ViewChildren, ViewContainerRef, ViewEncapsulation$1 as ViewEncapsulation, ViewRef, afterNextRender, afterRender, asNativeElements, assertInInjectionContext, assertNotInReactiveContext, assertPlatform, booleanAttribute, computed, createComponent, createEnvironmentInjector, createNgModule, createNgModuleRef, createPlatform, createPlatformFactory, defineInjectable, destroyPlatform, effect, enableProdMode, forwardRef, getDebugNode, getModuleFactory, getNgModuleById, getPlatform, importProvidersFrom, inject, input, isDevMode, isSignal, isStandalone, makeEnvironmentProviders, makeStateKey, mergeApplicationConfig, numberAttribute, platformCore, provideZoneChangeDetection, reflectComponentType, resolveForwardRef, runInInjectionContext, setTestabilityGetter, signal, untracked, ALLOW_MULTIPLE_PLATFORMS as ɵALLOW_MULTIPLE_PLATFORMS, AfterRenderEventManager as ɵAfterRenderEventManager, CONTAINER_HEADER_OFFSET as ɵCONTAINER_HEADER_OFFSET, ChangeDetectionScheduler as ɵChangeDetectionScheduler, 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, 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, IS_HYDRATION_DOM_REUSE_ENABLED as ɵIS_HYDRATION_DOM_REUSE_ENABLED, LContext as ɵLContext, LifecycleHooksFeature as ɵLifecycleHooksFeature, LocaleDataIndex as ɵLocaleDataIndex, 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, PendingTasks as ɵPendingTasks, 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, USE_RUNTIME_DEPS_TRACKER_FOR_JIT as ɵUSE_RUNTIME_DEPS_TRACKER_FOR_JIT, ViewRef$1 as ɵViewRef, XSS_SECURITY_URL as ɵXSS_SECURITY_URL, ZoneAwareQueueingScheduler as ɵZoneAwareQueueingScheduler, _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, devModeEqual as ɵdevModeEqual, findLocaleData as ɵfindLocaleData, flushModuleScopingQueueAsMuchAsPossible as ɵflushModuleScopingQueueAsMuchAsPossible, formatRuntimeError as ɵformatRuntimeError, generateStandaloneInDeclarationsError as ɵgenerateStandaloneInDeclarationsError, getAsyncClassMetadataFn as ɵgetAsyncClassMetadataFn, getDebugNode as ɵgetDebugNode, getDeferBlocks as ɵgetDeferBlocks, getDirectives as ɵgetDirectives, getEnsureDirtyViewsAreAlwaysReachable as ɵgetEnsureDirtyViewsAreAlwaysReachable, getHostElement as ɵgetHostElement, getInjectableDef as ɵgetInjectableDef, getLContext as ɵgetLContext, getLocaleCurrencyCode as ɵgetLocaleCurrencyCode, getLocalePluralCase as ɵgetLocalePluralCase, getSanitizationBypassType as ɵgetSanitizationBypassType, ɵgetUnknownElementStrictMode, ɵgetUnknownPropertyStrictMode, _global as ɵglobal, injectChangeDetectorRef as ɵinjectChangeDetectorRef, internalAfterNextRender as ɵinternalAfterNextRender, internalCreateApplication as ɵinternalCreateApplication, isBoundToModule as ɵisBoundToModule, isComponentDefPendingResolution as ɵisComponentDefPendingResolution, isEnvironmentProviders as ɵisEnvironmentProviders, isInjectable as ɵisInjectable, isNgModule as ɵisNgModule, isPromise as ɵisPromise, isSubscribable as ɵisSubscribable, noSideEffects as ɵnoSideEffects, patchComponentDefWithScope as ɵpatchComponentDefWithScope, performanceMarkFeature as ɵperformanceMarkFeature, provideZonelessChangeDetection as ɵprovideZonelessChangeDetection, 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, setEnsureDirtyViewsAreAlwaysReachable as ɵsetEnsureDirtyViewsAreAlwaysReachable, setInjectorProfilerContext as ɵsetInjectorProfilerContext, setLocaleId as ɵsetLocaleId, ɵsetUnknownElementStrictMode, ɵsetUnknownPropertyStrictMode, store as ɵstore, stringify as ɵstringify, transitiveScopesFor as ɵtransitiveScopesFor, triggerResourceLoading as ɵtriggerResourceLoading, truncateMiddle as ɵtruncateMiddle, unregisterAllLocaleData as ɵunregisterLocaleData, unwrapSafeValue as ɵunwrapSafeValue, whenStable as ɵwhenStable, withDomHydration as ɵwithDomHydration, ɵɵCopyDefinitionFeature, FactoryTarget as ɵɵFactoryTarget, ɵɵHostDirectivesFeature, ɵɵInheritDefinitionFeature, InputFlags as ɵɵInputFlags, ɵɵInputTransformsFeature, ɵɵNgOnChangesFeature, ɵɵProvidersFeature, ɵɵStandaloneFeature, ɵɵadvance, ɵɵattribute, ɵɵattributeInterpolate1, ɵɵattributeInterpolate2, ɵɵattributeInterpolate3, ɵɵattributeInterpolate4, ɵɵattributeInterpolate5, ɵɵattributeInterpolate6, ɵɵattributeInterpolate7, ɵɵattributeInterpolate8, ɵɵattributeInterpolateV, ɵɵclassMap, ɵɵclassMapInterpolate1, ɵɵclassMapInterpolate2, ɵɵclassMapInterpolate3, ɵɵclassMapInterpolate4, ɵɵclassMapInterpolate5, ɵɵclassMapInterpolate6, ɵɵclassMapInterpolate7, ɵɵclassMapInterpolate8, ɵɵclassMapInterpolateV, ɵɵclassProp, ɵɵcomponentInstance, ɵɵconditional, ɵɵcontentQuery, ɵɵdefer, ɵɵdeferEnableTimerScheduling, ɵɵ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, ɵɵ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, ɵɵqueryRefresh, ɵɵreference, registerNgModuleType as ɵɵregisterNgModuleType, ɵɵrepeater, ɵɵrepeaterCreate, ɵɵrepeaterTrackByIdentity, ɵɵrepeaterTrackByIndex, ɵɵresetView, ɵɵresolveBody, ɵɵresolveDocument, ɵɵresolveWindow, ɵɵrestoreView, ɵɵsanitizeHtml, ɵɵsanitizeResourceUrl, ɵɵsanitizeScript, ɵɵsanitizeStyle, ɵɵsanitizeUrl, ɵɵsanitizeUrlOrResourceUrl, ɵɵsetComponentScope, ɵɵsetNgModuleScope, ɵɵ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, ɵɵvalidateIframeAttribute, ɵɵviewQuery };
35117
35274
  //# sourceMappingURL=core.mjs.map