@angular/animations 14.0.0-next.2 → 14.0.0-next.3

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 (38) hide show
  1. package/animations.d.ts +10 -2
  2. package/browser/browser.d.ts +19 -7
  3. package/browser/testing/testing.d.ts +2 -1
  4. package/esm2020/browser/src/dsl/animation.mjs +4 -5
  5. package/esm2020/browser/src/dsl/animation_ast_builder.mjs +13 -14
  6. package/esm2020/browser/src/dsl/animation_timeline_builder.mjs +3 -2
  7. package/esm2020/browser/src/dsl/animation_transition_expr.mjs +4 -3
  8. package/esm2020/browser/src/dsl/animation_transition_factory.mjs +1 -1
  9. package/esm2020/browser/src/dsl/animation_transition_instruction.mjs +1 -1
  10. package/esm2020/browser/src/dsl/animation_trigger.mjs +1 -1
  11. package/esm2020/browser/src/dsl/style_normalization/animation_style_normalizer.mjs +1 -1
  12. package/esm2020/browser/src/dsl/style_normalization/web_animations_style_normalizer.mjs +3 -2
  13. package/esm2020/browser/src/error_helpers.mjs +135 -0
  14. package/esm2020/browser/src/errors.mjs +9 -0
  15. package/esm2020/browser/src/private_export.mjs +2 -2
  16. package/esm2020/browser/src/render/animation_driver.mjs +8 -5
  17. package/esm2020/browser/src/render/animation_engine_next.mjs +3 -2
  18. package/esm2020/browser/src/render/shared.mjs +16 -5
  19. package/esm2020/browser/src/render/timeline_animation_engine.mjs +6 -5
  20. package/esm2020/browser/src/render/transition_animation_engine.mjs +45 -18
  21. package/esm2020/browser/src/render/web_animations/web_animations_driver.mjs +5 -2
  22. package/esm2020/browser/src/util.mjs +9 -8
  23. package/esm2020/browser/testing/src/mock_animation_driver.mjs +5 -2
  24. package/esm2020/src/animation_metadata.mjs +10 -2
  25. package/esm2020/src/version.mjs +1 -1
  26. package/fesm2015/animations.mjs +10 -2
  27. package/fesm2015/animations.mjs.map +1 -1
  28. package/fesm2015/browser/testing.mjs +5 -2
  29. package/fesm2015/browser/testing.mjs.map +1 -1
  30. package/fesm2015/browser.mjs +232 -60
  31. package/fesm2015/browser.mjs.map +1 -1
  32. package/fesm2020/animations.mjs +10 -2
  33. package/fesm2020/animations.mjs.map +1 -1
  34. package/fesm2020/browser/testing.mjs +5 -2
  35. package/fesm2020/browser/testing.mjs.map +1 -1
  36. package/fesm2020/browser.mjs +232 -60
  37. package/fesm2020/browser.mjs.map +1 -1
  38. package/package.json +2 -2
@@ -1,12 +1,146 @@
1
1
  /**
2
- * @license Angular v14.0.0-next.2
2
+ * @license Angular v14.0.0-next.3
3
3
  * (c) 2010-2022 Google LLC. https://angular.io/
4
4
  * License: MIT
5
5
  */
6
6
 
7
7
  import { ɵAnimationGroupPlayer, NoopAnimationPlayer, AUTO_STYLE, ɵPRE_STYLE, sequence, style } from '@angular/animations';
8
8
  import * as i0 from '@angular/core';
9
- import { Injectable } from '@angular/core';
9
+ import { ɵRuntimeError, Injectable } from '@angular/core';
10
+
11
+ /**
12
+ * @license
13
+ * Copyright Google LLC All Rights Reserved.
14
+ *
15
+ * Use of this source code is governed by an MIT-style license that can be
16
+ * found in the LICENSE file at https://angular.io/license
17
+ */
18
+ const NG_DEV_MODE = typeof ngDevMode === 'undefined' || !!ngDevMode;
19
+ const LINE_START = '\n - ';
20
+ function invalidTimingValue(exp) {
21
+ return new ɵRuntimeError(3000 /* INVALID_TIMING_VALUE */, NG_DEV_MODE && `The provided timing value "${exp}" is invalid.`);
22
+ }
23
+ function negativeStepValue() {
24
+ return new ɵRuntimeError(3100 /* NEGATIVE_STEP_VALUE */, NG_DEV_MODE && 'Duration values below 0 are not allowed for this animation step.');
25
+ }
26
+ function negativeDelayValue() {
27
+ return new ɵRuntimeError(3101 /* NEGATIVE_DELAY_VALUE */, NG_DEV_MODE && 'Delay values below 0 are not allowed for this animation step.');
28
+ }
29
+ function invalidStyleParams(varName) {
30
+ return new ɵRuntimeError(3001 /* INVALID_STYLE_PARAMS */, NG_DEV_MODE &&
31
+ `Unable to resolve the local animation param ${varName} in the given list of values`);
32
+ }
33
+ function invalidParamValue(varName) {
34
+ return new ɵRuntimeError(3003 /* INVALID_PARAM_VALUE */, NG_DEV_MODE && `Please provide a value for the animation param ${varName}`);
35
+ }
36
+ function invalidNodeType(nodeType) {
37
+ return new ɵRuntimeError(3004 /* INVALID_NODE_TYPE */, NG_DEV_MODE && `Unable to resolve animation metadata node #${nodeType}`);
38
+ }
39
+ function invalidCssUnitValue(userProvidedProperty, value) {
40
+ return new ɵRuntimeError(3005 /* INVALID_CSS_UNIT_VALUE */, NG_DEV_MODE && `Please provide a CSS unit value for ${userProvidedProperty}:${value}`);
41
+ }
42
+ function invalidTrigger() {
43
+ return new ɵRuntimeError(3006 /* INVALID_TRIGGER */, NG_DEV_MODE &&
44
+ 'animation triggers cannot be prefixed with an `@` sign (e.g. trigger(\'@foo\', [...]))');
45
+ }
46
+ function invalidDefinition() {
47
+ return new ɵRuntimeError(3007 /* INVALID_DEFINITION */, NG_DEV_MODE && 'only state() and transition() definitions can sit inside of a trigger()');
48
+ }
49
+ function invalidState(metadataName, missingSubs) {
50
+ return new ɵRuntimeError(3008 /* INVALID_STATE */, NG_DEV_MODE &&
51
+ `state("${metadataName}", ...) must define default values for all the following style substitutions: ${missingSubs.join(', ')}`);
52
+ }
53
+ function invalidStyleValue(value) {
54
+ return new ɵRuntimeError(3002 /* INVALID_STYLE_VALUE */, NG_DEV_MODE && `The provided style string value ${value} is not allowed.`);
55
+ }
56
+ function invalidProperty(prop) {
57
+ return new ɵRuntimeError(3009 /* INVALID_PROPERTY */, NG_DEV_MODE &&
58
+ `The provided animation property "${prop}" is not a supported CSS property for animations`);
59
+ }
60
+ function invalidParallelAnimation(prop, firstStart, firstEnd, secondStart, secondEnd) {
61
+ return new ɵRuntimeError(3010 /* INVALID_PARALLEL_ANIMATION */, NG_DEV_MODE &&
62
+ `The CSS property "${prop}" that exists between the times of "${firstStart}ms" and "${firstEnd}ms" is also being animated in a parallel animation between the times of "${secondStart}ms" and "${secondEnd}ms"`);
63
+ }
64
+ function invalidKeyframes() {
65
+ return new ɵRuntimeError(3011 /* INVALID_KEYFRAMES */, NG_DEV_MODE && `keyframes() must be placed inside of a call to animate()`);
66
+ }
67
+ function invalidOffset() {
68
+ return new ɵRuntimeError(3012 /* INVALID_OFFSET */, NG_DEV_MODE && `Please ensure that all keyframe offsets are between 0 and 1`);
69
+ }
70
+ function keyframeOffsetsOutOfOrder() {
71
+ return new ɵRuntimeError(3200 /* KEYFRAME_OFFSETS_OUT_OF_ORDER */, NG_DEV_MODE && `Please ensure that all keyframe offsets are in order`);
72
+ }
73
+ function keyframesMissingOffsets() {
74
+ return new ɵRuntimeError(3202 /* KEYFRAMES_MISSING_OFFSETS */, NG_DEV_MODE && `Not all style() steps within the declared keyframes() contain offsets`);
75
+ }
76
+ function invalidStagger() {
77
+ return new ɵRuntimeError(3013 /* INVALID_STAGGER */, NG_DEV_MODE && `stagger() can only be used inside of query()`);
78
+ }
79
+ function invalidQuery(selector) {
80
+ return new ɵRuntimeError(3014 /* INVALID_QUERY */, NG_DEV_MODE &&
81
+ `\`query("${selector}")\` returned zero elements. (Use \`query("${selector}", { optional: true })\` if you wish to allow this.)`);
82
+ }
83
+ function invalidExpression(expr) {
84
+ return new ɵRuntimeError(3015 /* INVALID_EXPRESSION */, NG_DEV_MODE && `The provided transition expression "${expr}" is not supported`);
85
+ }
86
+ function invalidTransitionAlias(alias) {
87
+ return new ɵRuntimeError(3016 /* INVALID_TRANSITION_ALIAS */, NG_DEV_MODE && `The transition alias value "${alias}" is not supported`);
88
+ }
89
+ function validationFailed(errors) {
90
+ return new ɵRuntimeError(3500 /* VALIDATION_FAILED */, NG_DEV_MODE && `animation validation failed:\n${errors.map(err => err.message).join('\n')}`);
91
+ }
92
+ function buildingFailed(errors) {
93
+ return new ɵRuntimeError(3501 /* BUILDING_FAILED */, NG_DEV_MODE && `animation building failed:\n${errors.map(err => err.message).join('\n')}`);
94
+ }
95
+ function triggerBuildFailed(name, errors) {
96
+ return new ɵRuntimeError(3404 /* TRIGGER_BUILD_FAILED */, NG_DEV_MODE &&
97
+ `The animation trigger "${name}" has failed to build due to the following errors:\n - ${errors.map(err => err.message).join('\n - ')}`);
98
+ }
99
+ function animationFailed(errors) {
100
+ return new ɵRuntimeError(3502 /* ANIMATION_FAILED */, NG_DEV_MODE &&
101
+ `Unable to animate due to the following errors:${LINE_START}${errors.map(err => err.message).join(LINE_START)}`);
102
+ }
103
+ function registerFailed(errors) {
104
+ return new ɵRuntimeError(3503 /* REGISTRATION_FAILED */, NG_DEV_MODE &&
105
+ `Unable to build the animation due to the following errors: ${errors.map(err => err.message).join('\n')}`);
106
+ }
107
+ function missingOrDestroyedAnimation() {
108
+ return new ɵRuntimeError(3300 /* MISSING_OR_DESTROYED_ANIMATION */, NG_DEV_MODE && 'The requested animation doesn\'t exist or has already been destroyed');
109
+ }
110
+ function createAnimationFailed(errors) {
111
+ return new ɵRuntimeError(3504 /* CREATE_ANIMATION_FAILED */, NG_DEV_MODE &&
112
+ `Unable to create the animation due to the following errors:${errors.map(err => err.message).join('\n')}`);
113
+ }
114
+ function missingPlayer(id) {
115
+ return new ɵRuntimeError(3301 /* MISSING_PLAYER */, NG_DEV_MODE && `Unable to find the timeline player referenced by ${id}`);
116
+ }
117
+ function missingTrigger(phase, name) {
118
+ return new ɵRuntimeError(3302 /* MISSING_TRIGGER */, NG_DEV_MODE &&
119
+ `Unable to listen on the animation trigger event "${phase}" because the animation trigger "${name}" doesn\'t exist!`);
120
+ }
121
+ function missingEvent(name) {
122
+ return new ɵRuntimeError(3303 /* MISSING_EVENT */, NG_DEV_MODE &&
123
+ `Unable to listen on the animation trigger "${name}" because the provided event is undefined!`);
124
+ }
125
+ function unsupportedTriggerEvent(phase, name) {
126
+ return new ɵRuntimeError(3400 /* UNSUPPORTED_TRIGGER_EVENT */, NG_DEV_MODE &&
127
+ `The provided animation trigger event "${phase}" for the animation trigger "${name}" is not supported!`);
128
+ }
129
+ function unregisteredTrigger(name) {
130
+ return new ɵRuntimeError(3401 /* UNREGISTERED_TRIGGER */, NG_DEV_MODE && `The provided animation trigger "${name}" has not been registered!`);
131
+ }
132
+ function triggerTransitionsFailed(errors) {
133
+ return new ɵRuntimeError(3402 /* TRIGGER_TRANSITIONS_FAILED */, NG_DEV_MODE &&
134
+ `Unable to process animations due to the following failed trigger transitions\n ${errors.map(err => err.message).join('\n')}`);
135
+ }
136
+ function triggerParsingFailed(name, errors) {
137
+ return new ɵRuntimeError(3403 /* TRIGGER_PARSING_FAILED */, NG_DEV_MODE &&
138
+ `Animation parsing for the ${name} trigger have failed:${LINE_START}${errors.map(err => err.message).join(LINE_START)}`);
139
+ }
140
+ function transitionFailed(name, errors) {
141
+ return new ɵRuntimeError(3505 /* TRANSITION_FAILED */, NG_DEV_MODE &&
142
+ `@${name} has failed due to:\n ${errors.map(err => err.message).join('\n- ')}`);
143
+ }
10
144
 
11
145
  /**
12
146
  * @license
@@ -72,8 +206,7 @@ function normalizeKeyframes$1(driver, normalizer, element, keyframes, preStyles
72
206
  previousOffset = offset;
73
207
  });
74
208
  if (errors.length) {
75
- const LINE_START = '\n - ';
76
- throw new Error(`Unable to animate due to the following errors:${LINE_START}${errors.join(LINE_START)}`);
209
+ throw animationFailed(errors);
77
210
  }
78
211
  return normalizedKeyframes;
79
212
  }
@@ -120,6 +253,14 @@ let _contains = (elm1, elm2) => false;
120
253
  let _query = (element, selector, multi) => {
121
254
  return [];
122
255
  };
256
+ let _documentElement = null;
257
+ function getParentElement(element) {
258
+ const parent = element.parentNode || element.host; // consider host to support shadow DOM
259
+ if (parent === _documentElement) {
260
+ return null;
261
+ }
262
+ return parent;
263
+ }
123
264
  // Define utility methods for browsers and platform-server(domino) where Element
124
265
  // and utility methods exist.
125
266
  const _isNode = isNode();
@@ -128,12 +269,15 @@ if (_isNode || typeof Element !== 'undefined') {
128
269
  _contains = (elm1, elm2) => elm1.contains(elm2);
129
270
  }
130
271
  else {
272
+ // Read the document element in an IIFE that's been marked pure to avoid a top-level property
273
+ // read that may prevent tree-shaking.
274
+ _documentElement = /* @__PURE__ */ (() => document.documentElement)();
131
275
  _contains = (elm1, elm2) => {
132
- while (elm2 && elm2 !== document.documentElement) {
276
+ while (elm2) {
133
277
  if (elm2 === elm1) {
134
278
  return true;
135
279
  }
136
- elm2 = elm2.parentNode || elm2.host; // consider host to support shadow DOM
280
+ elm2 = getParentElement(elm2);
137
281
  }
138
282
  return false;
139
283
  };
@@ -206,6 +350,9 @@ class NoopAnimationDriver {
206
350
  containsElement(elm1, elm2) {
207
351
  return containsElement(elm1, elm2);
208
352
  }
353
+ getParentElement(element) {
354
+ return getParentElement(element);
355
+ }
209
356
  query(element, selector, multi) {
210
357
  return invokeQuery(element, selector, multi);
211
358
  }
@@ -216,9 +363,9 @@ class NoopAnimationDriver {
216
363
  return new NoopAnimationPlayer(duration, delay);
217
364
  }
218
365
  }
219
- NoopAnimationDriver.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.0.0-next.2", ngImport: i0, type: NoopAnimationDriver, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
220
- NoopAnimationDriver.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "14.0.0-next.2", ngImport: i0, type: NoopAnimationDriver });
221
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.0-next.2", ngImport: i0, type: NoopAnimationDriver, decorators: [{
366
+ NoopAnimationDriver.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.0.0-next.3", ngImport: i0, type: NoopAnimationDriver, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
367
+ NoopAnimationDriver.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "14.0.0-next.3", ngImport: i0, type: NoopAnimationDriver });
368
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.0-next.3", ngImport: i0, type: NoopAnimationDriver, decorators: [{
222
369
  type: Injectable
223
370
  }] });
224
371
  /**
@@ -273,7 +420,7 @@ function parseTimeExpression(exp, errors, allowNegativeValues) {
273
420
  if (typeof exp === 'string') {
274
421
  const matches = exp.match(regex);
275
422
  if (matches === null) {
276
- errors.push(`The provided timing value "${exp}" is invalid.`);
423
+ errors.push(invalidTimingValue(exp));
277
424
  return { duration: 0, delay: 0, easing: '' };
278
425
  }
279
426
  duration = _convertTimeValueToMS(parseFloat(matches[1]), matches[2]);
@@ -293,15 +440,15 @@ function parseTimeExpression(exp, errors, allowNegativeValues) {
293
440
  let containsErrors = false;
294
441
  let startIndex = errors.length;
295
442
  if (duration < 0) {
296
- errors.push(`Duration values below 0 are not allowed for this animation step.`);
443
+ errors.push(negativeStepValue());
297
444
  containsErrors = true;
298
445
  }
299
446
  if (delay < 0) {
300
- errors.push(`Delay values below 0 are not allowed for this animation step.`);
447
+ errors.push(negativeDelayValue());
301
448
  containsErrors = true;
302
449
  }
303
450
  if (containsErrors) {
304
- errors.splice(startIndex, 0, `The provided timing value "${exp}" is invalid.`);
451
+ errors.splice(startIndex, 0, invalidTimingValue(exp));
305
452
  }
306
453
  }
307
454
  return { duration, delay, easing };
@@ -421,7 +568,7 @@ function validateStyleParams(value, options, errors) {
421
568
  if (matches.length) {
422
569
  matches.forEach(varName => {
423
570
  if (!params.hasOwnProperty(varName)) {
424
- errors.push(`Unable to resolve the local animation param ${varName} in the given list of values`);
571
+ errors.push(invalidStyleParams(varName));
425
572
  }
426
573
  });
427
574
  }
@@ -444,7 +591,7 @@ function interpolateParams(value, params, errors) {
444
591
  let localVal = params[varName];
445
592
  // this means that the value was never overridden by the data passed in by the user
446
593
  if (!params.hasOwnProperty(varName)) {
447
- errors.push(`Please provide a value for the animation param ${varName}`);
594
+ errors.push(invalidParamValue(varName));
448
595
  localVal = '';
449
596
  }
450
597
  return localVal.toString();
@@ -519,7 +666,7 @@ function visitDslNode(visitor, node, context) {
519
666
  case 12 /* Stagger */:
520
667
  return visitor.visitStagger(node, context);
521
668
  default:
522
- throw new Error(`Unable to resolve animation metadata node #${node.type}`);
669
+ throw invalidNodeType(node.type);
523
670
  }
524
671
  }
525
672
  function computeStyle(element, prop) {
@@ -555,7 +702,7 @@ function parseInnerTransitionStr(eventStr, expressions, errors) {
555
702
  }
556
703
  const match = eventStr.match(/^(\*|[-\w]+)\s*(<?[=-]>)\s*(\*|[-\w]+)$/);
557
704
  if (match == null || match.length < 4) {
558
- errors.push(`The provided transition expression "${eventStr}" is not supported`);
705
+ errors.push(invalidExpression(eventStr));
559
706
  return expressions;
560
707
  }
561
708
  const fromState = match[1];
@@ -578,7 +725,7 @@ function parseAnimationAlias(alias, errors) {
578
725
  case ':decrement':
579
726
  return (fromState, toState) => parseFloat(toState) < parseFloat(fromState);
580
727
  default:
581
- errors.push(`The transition alias value "${alias}" is not supported`);
728
+ errors.push(invalidTransitionAlias(alias));
582
729
  return '* => *';
583
730
  }
584
731
  }
@@ -674,7 +821,7 @@ class AnimationAstBuilderVisitor {
674
821
  const states = [];
675
822
  const transitions = [];
676
823
  if (metadata.name.charAt(0) == '@') {
677
- context.errors.push('animation triggers cannot be prefixed with an `@` sign (e.g. trigger(\'@foo\', [...]))');
824
+ context.errors.push(invalidTrigger());
678
825
  }
679
826
  metadata.definitions.forEach(def => {
680
827
  this._resetContextStyleTimingState(context);
@@ -694,7 +841,7 @@ class AnimationAstBuilderVisitor {
694
841
  transitions.push(transition);
695
842
  }
696
843
  else {
697
- context.errors.push('only state() and transition() definitions can sit inside of a trigger()');
844
+ context.errors.push(invalidDefinition());
698
845
  }
699
846
  });
700
847
  return {
@@ -726,8 +873,7 @@ class AnimationAstBuilderVisitor {
726
873
  });
727
874
  if (missingSubs.size) {
728
875
  const missingSubsArr = iteratorToArray(missingSubs.values());
729
- context.errors.push(`state("${metadata
730
- .name}", ...) must define default values for all the following style substitutions: ${missingSubsArr.join(', ')}`);
876
+ context.errors.push(invalidState(metadata.name, missingSubsArr));
731
877
  }
732
878
  }
733
879
  return {
@@ -820,7 +966,7 @@ class AnimationAstBuilderVisitor {
820
966
  styles.push(styleTuple);
821
967
  }
822
968
  else {
823
- context.errors.push(`The provided style string value ${styleTuple} is not allowed.`);
969
+ context.errors.push(invalidStyleValue(styleTuple));
824
970
  }
825
971
  }
826
972
  else {
@@ -866,7 +1012,7 @@ class AnimationAstBuilderVisitor {
866
1012
  return;
867
1013
  tuple.forEach((value, prop) => {
868
1014
  if (!this._driver.validateStyleProperty(prop)) {
869
- context.errors.push(`The provided animation property "${prop}" is not a supported CSS property for animations`);
1015
+ context.errors.push(invalidProperty(prop));
870
1016
  return;
871
1017
  }
872
1018
  // This is guaranteed to have a defined Map at this querySelector location making it
@@ -877,8 +1023,7 @@ class AnimationAstBuilderVisitor {
877
1023
  if (collectedEntry) {
878
1024
  if (startTime != endTime && startTime >= collectedEntry.startTime &&
879
1025
  endTime <= collectedEntry.endTime) {
880
- context.errors.push(`The CSS property "${prop}" that exists between the times of "${collectedEntry.startTime}ms" and "${collectedEntry
881
- .endTime}ms" is also being animated in a parallel animation between the times of "${startTime}ms" and "${endTime}ms"`);
1026
+ context.errors.push(invalidParallelAnimation(prop, collectedEntry.startTime, collectedEntry.endTime, startTime, endTime));
882
1027
  updateCollectedStyle = false;
883
1028
  }
884
1029
  // we always choose the smaller start time value since we
@@ -898,7 +1043,7 @@ class AnimationAstBuilderVisitor {
898
1043
  visitKeyframes(metadata, context) {
899
1044
  const ast = { type: 5 /* Keyframes */, styles: [], options: null };
900
1045
  if (!context.currentAnimateTimings) {
901
- context.errors.push(`keyframes() must be placed inside of a call to animate()`);
1046
+ context.errors.push(invalidKeyframes());
902
1047
  return ast;
903
1048
  }
904
1049
  const MAX_KEYFRAME_OFFSET = 1;
@@ -922,15 +1067,15 @@ class AnimationAstBuilderVisitor {
922
1067
  return style;
923
1068
  });
924
1069
  if (keyframesOutOfRange) {
925
- context.errors.push(`Please ensure that all keyframe offsets are between 0 and 1`);
1070
+ context.errors.push(invalidOffset());
926
1071
  }
927
1072
  if (offsetsOutOfOrder) {
928
- context.errors.push(`Please ensure that all keyframe offsets are in order`);
1073
+ context.errors.push(keyframeOffsetsOutOfOrder());
929
1074
  }
930
1075
  const length = metadata.steps.length;
931
1076
  let generatedOffset = 0;
932
1077
  if (totalKeyframesWithOffsets > 0 && totalKeyframesWithOffsets < length) {
933
- context.errors.push(`Not all style() steps within the declared keyframes() contain offsets`);
1078
+ context.errors.push(keyframesMissingOffsets());
934
1079
  }
935
1080
  else if (totalKeyframesWithOffsets == 0) {
936
1081
  generatedOffset = MAX_KEYFRAME_OFFSET / (length - 1);
@@ -996,7 +1141,7 @@ class AnimationAstBuilderVisitor {
996
1141
  }
997
1142
  visitStagger(metadata, context) {
998
1143
  if (!context.currentQuery) {
999
- context.errors.push(`stagger() can only be used inside of query()`);
1144
+ context.errors.push(invalidStagger());
1000
1145
  }
1001
1146
  const timings = metadata.timings === 'full' ?
1002
1147
  { duration: 0, delay: 0, easing: 'full' } :
@@ -1614,7 +1759,7 @@ class AnimationTimelineContext {
1614
1759
  results.push(...elements);
1615
1760
  }
1616
1761
  if (!optional && results.length == 0) {
1617
- errors.push(`\`query("${originalSelector}")\` returned zero elements. (Use \`query("${originalSelector}", { optional: true })\` if you wish to allow this.)`);
1762
+ errors.push(invalidQuery(originalSelector));
1618
1763
  }
1619
1764
  return results;
1620
1765
  }
@@ -1894,8 +2039,7 @@ class Animation {
1894
2039
  const errors = [];
1895
2040
  const ast = buildAnimationAst(_driver, input, errors);
1896
2041
  if (errors.length) {
1897
- const errorMessage = `animation validation failed:\n${errors.join('\n')}`;
1898
- throw new Error(errorMessage);
2042
+ throw validationFailed(errors);
1899
2043
  }
1900
2044
  this._animationAst = ast;
1901
2045
  }
@@ -1908,8 +2052,7 @@ class Animation {
1908
2052
  subInstructions = subInstructions || new ElementInstructionMap();
1909
2053
  const result = buildAnimationTimelines(this._driver, element, this._animationAst, ENTER_CLASSNAME, LEAVE_CLASSNAME, start, dest, options, subInstructions, errors);
1910
2054
  if (errors.length) {
1911
- const errorMessage = `animation building failed:\n${errors.join('\n')}`;
1912
- throw new Error(errorMessage);
2055
+ throw buildingFailed(errors);
1913
2056
  }
1914
2057
  return result;
1915
2058
  }
@@ -1991,7 +2134,7 @@ class WebAnimationsStyleNormalizer extends AnimationStyleNormalizer {
1991
2134
  else {
1992
2135
  const valAndSuffixMatch = value.match(/^[+-]?[\d\.]+([a-z]*)$/);
1993
2136
  if (valAndSuffixMatch && valAndSuffixMatch[1].length == 0) {
1994
- errors.push(`Please provide a CSS unit value for ${userProvidedProperty}:${value}`);
2137
+ errors.push(invalidCssUnitValue(userProvidedProperty, value));
1995
2138
  }
1996
2139
  }
1997
2140
  }
@@ -2192,7 +2335,7 @@ class TimelineAnimationEngine {
2192
2335
  const errors = [];
2193
2336
  const ast = buildAnimationAst(this._driver, metadata, errors);
2194
2337
  if (errors.length) {
2195
- throw new Error(`Unable to build the animation due to the following errors: ${errors.join('\n')}`);
2338
+ throw registerFailed(errors);
2196
2339
  }
2197
2340
  else {
2198
2341
  this._animations.set(id, ast);
@@ -2216,11 +2359,11 @@ class TimelineAnimationEngine {
2216
2359
  });
2217
2360
  }
2218
2361
  else {
2219
- errors.push('The requested animation doesn\'t exist or has already been destroyed');
2362
+ errors.push(missingOrDestroyedAnimation());
2220
2363
  instructions = [];
2221
2364
  }
2222
2365
  if (errors.length) {
2223
- throw new Error(`Unable to create the animation due to the following errors: ${errors.join('\n')}`);
2366
+ throw createAnimationFailed(errors);
2224
2367
  }
2225
2368
  autoStylesMap.forEach((styles, element) => {
2226
2369
  styles.forEach((_, prop) => {
@@ -2249,7 +2392,7 @@ class TimelineAnimationEngine {
2249
2392
  _getPlayer(id) {
2250
2393
  const player = this._playersById.get(id);
2251
2394
  if (!player) {
2252
- throw new Error(`Unable to find the timeline player referenced by ${id}`);
2395
+ throw missingPlayer(id);
2253
2396
  }
2254
2397
  return player;
2255
2398
  }
@@ -2377,13 +2520,13 @@ class AnimationTransitionNamespace {
2377
2520
  }
2378
2521
  listen(element, name, phase, callback) {
2379
2522
  if (!this._triggers.has(name)) {
2380
- throw new Error(`Unable to listen on the animation trigger event "${phase}" because the animation trigger "${name}" doesn\'t exist!`);
2523
+ throw missingTrigger(phase, name);
2381
2524
  }
2382
2525
  if (phase == null || phase.length == 0) {
2383
- throw new Error(`Unable to listen on the animation trigger "${name}" because the provided event is undefined!`);
2526
+ throw missingEvent(name);
2384
2527
  }
2385
2528
  if (!isTriggerEventValid(phase)) {
2386
- throw new Error(`The provided animation trigger event "${phase}" for the animation trigger "${name}" is not supported!`);
2529
+ throw unsupportedTriggerEvent(phase, name);
2387
2530
  }
2388
2531
  const listeners = getOrSetDefaultValue(this._elementListeners, element, []);
2389
2532
  const data = { name, phase, callback };
@@ -2422,7 +2565,7 @@ class AnimationTransitionNamespace {
2422
2565
  _getTrigger(name) {
2423
2566
  const trigger = this._triggers.get(name);
2424
2567
  if (!trigger) {
2425
- throw new Error(`The provided animation trigger "${name}" has not been registered!`);
2568
+ throw unregisteredTrigger(name);
2426
2569
  }
2427
2570
  return trigger;
2428
2571
  }
@@ -2776,25 +2919,52 @@ class TransitionAnimationEngine {
2776
2919
  return this._namespaceLookup[namespaceId] = ns;
2777
2920
  }
2778
2921
  _balanceNamespaceList(ns, hostElement) {
2779
- const limit = this._namespaceList.length - 1;
2922
+ const namespaceList = this._namespaceList;
2923
+ const namespacesByHostElement = this.namespacesByHostElement;
2924
+ const limit = namespaceList.length - 1;
2780
2925
  if (limit >= 0) {
2781
2926
  let found = false;
2782
- for (let i = limit; i >= 0; i--) {
2783
- const nextNamespace = this._namespaceList[i];
2784
- if (this.driver.containsElement(nextNamespace.hostElement, hostElement)) {
2785
- this._namespaceList.splice(i + 1, 0, ns);
2786
- found = true;
2787
- break;
2927
+ if (this.driver.getParentElement !== undefined) {
2928
+ // Fast path for when the driver implements `getParentElement`, which allows us to find the
2929
+ // closest ancestor with an existing namespace that we can then insert `ns` after, without
2930
+ // having to inspect all existing namespaces.
2931
+ let ancestor = this.driver.getParentElement(hostElement);
2932
+ while (ancestor) {
2933
+ const ancestorNs = namespacesByHostElement.get(ancestor);
2934
+ if (ancestorNs) {
2935
+ // An animation namespace has been registered for this ancestor, so we insert `ns`
2936
+ // right after it to establish top-down ordering of animation namespaces.
2937
+ const index = namespaceList.indexOf(ancestorNs);
2938
+ namespaceList.splice(index + 1, 0, ns);
2939
+ found = true;
2940
+ break;
2941
+ }
2942
+ ancestor = this.driver.getParentElement(ancestor);
2943
+ }
2944
+ }
2945
+ else {
2946
+ // Slow path for backwards compatibility if the driver does not implement
2947
+ // `getParentElement`, to be removed once `getParentElement` is a required method.
2948
+ for (let i = limit; i >= 0; i--) {
2949
+ const nextNamespace = namespaceList[i];
2950
+ if (this.driver.containsElement(nextNamespace.hostElement, hostElement)) {
2951
+ namespaceList.splice(i + 1, 0, ns);
2952
+ found = true;
2953
+ break;
2954
+ }
2788
2955
  }
2789
2956
  }
2790
2957
  if (!found) {
2791
- this._namespaceList.splice(0, 0, ns);
2958
+ // No namespace exists that is an ancestor of `ns`, so `ns` is inserted at the front to
2959
+ // ensure that any existing descendants are ordered after `ns`, retaining the desired
2960
+ // top-down ordering.
2961
+ namespaceList.unshift(ns);
2792
2962
  }
2793
2963
  }
2794
2964
  else {
2795
- this._namespaceList.push(ns);
2965
+ namespaceList.push(ns);
2796
2966
  }
2797
- this.namespacesByHostElement.set(hostElement, ns);
2967
+ namespacesByHostElement.set(hostElement, ns);
2798
2968
  return ns;
2799
2969
  }
2800
2970
  register(namespaceId, hostElement) {
@@ -3058,7 +3228,7 @@ class TransitionAnimationEngine {
3058
3228
  }
3059
3229
  }
3060
3230
  reportError(errors) {
3061
- throw new Error(`Unable to process animations due to the following failed trigger transitions\n ${errors.join('\n')}`);
3231
+ throw triggerTransitionsFailed(errors);
3062
3232
  }
3063
3233
  _flushAnimations(cleanupFns, microtaskId) {
3064
3234
  const subTimelines = new ElementInstructionMap();
@@ -3220,8 +3390,7 @@ class TransitionAnimationEngine {
3220
3390
  if (erroneousTransitions.length) {
3221
3391
  const errors = [];
3222
3392
  erroneousTransitions.forEach(instruction => {
3223
- errors.push(`@${instruction.triggerName} has failed due to:\n`);
3224
- instruction.errors.forEach(error => errors.push(`- ${error}\n`));
3393
+ errors.push(transitionFailed(instruction.triggerName, instruction.errors));
3225
3394
  });
3226
3395
  allPlayers.forEach(player => player.destroy());
3227
3396
  this.reportError(errors);
@@ -3822,7 +3991,7 @@ class AnimationEngine {
3822
3991
  const errors = [];
3823
3992
  const ast = buildAnimationAst(this._driver, metadata, errors);
3824
3993
  if (errors.length) {
3825
- throw new Error(`The animation trigger "${name}" has failed to build due to the following errors:\n - ${errors.join('\n - ')}`);
3994
+ throw triggerBuildFailed(name, errors);
3826
3995
  }
3827
3996
  trigger = buildTrigger(name, ast, this._normalizer);
3828
3997
  this._triggerCache[cacheKey] = trigger;
@@ -4143,6 +4312,9 @@ class WebAnimationsDriver {
4143
4312
  containsElement(elm1, elm2) {
4144
4313
  return containsElement(elm1, elm2);
4145
4314
  }
4315
+ getParentElement(element) {
4316
+ return getParentElement(element);
4317
+ }
4146
4318
  query(element, selector, multi) {
4147
4319
  return invokeQuery(element, selector, multi);
4148
4320
  }
@@ -4207,5 +4379,5 @@ class WebAnimationsDriver {
4207
4379
  * Generated bundle index. Do not edit.
4208
4380
  */
4209
4381
 
4210
- export { AnimationDriver, Animation as ɵAnimation, AnimationEngine as ɵAnimationEngine, AnimationStyleNormalizer as ɵAnimationStyleNormalizer, NoopAnimationDriver as ɵNoopAnimationDriver, NoopAnimationStyleNormalizer as ɵNoopAnimationStyleNormalizer, WebAnimationsDriver as ɵWebAnimationsDriver, WebAnimationsPlayer as ɵWebAnimationsPlayer, WebAnimationsStyleNormalizer as ɵWebAnimationsStyleNormalizer, allowPreviousPlayerStylesMerge as ɵallowPreviousPlayerStylesMerge, containsElement as ɵcontainsElement, invokeQuery as ɵinvokeQuery, normalizeKeyframes as ɵnormalizeKeyframes, validateStyleProperty as ɵvalidateStyleProperty };
4382
+ export { AnimationDriver, Animation as ɵAnimation, AnimationEngine as ɵAnimationEngine, AnimationStyleNormalizer as ɵAnimationStyleNormalizer, NoopAnimationDriver as ɵNoopAnimationDriver, NoopAnimationStyleNormalizer as ɵNoopAnimationStyleNormalizer, WebAnimationsDriver as ɵWebAnimationsDriver, WebAnimationsPlayer as ɵWebAnimationsPlayer, WebAnimationsStyleNormalizer as ɵWebAnimationsStyleNormalizer, allowPreviousPlayerStylesMerge as ɵallowPreviousPlayerStylesMerge, containsElement as ɵcontainsElement, getParentElement as ɵgetParentElement, invokeQuery as ɵinvokeQuery, normalizeKeyframes as ɵnormalizeKeyframes, validateStyleProperty as ɵvalidateStyleProperty };
4211
4383
  //# sourceMappingURL=browser.mjs.map