@wavemaker/angular-codegen 11.7.0-next.42251 → 11.7.0-rc.5525

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,7 +1,7 @@
1
1
  'use strict';
2
2
 
3
3
  /**
4
- * @license Angular v15.2.9
4
+ * @license Angular v16.2.12
5
5
  * (c) 2010-2022 Google LLC. https://angular.io/
6
6
  * License: MIT
7
7
  */
@@ -500,7 +500,7 @@ class _SerializerIgnoreIcuExpVisitor extends _SerializerVisitor {
500
500
  * DO NOT USE IT IN A SECURITY SENSITIVE CONTEXT.
501
501
  */
502
502
  function sha1(str) {
503
- textEncoder ?? (textEncoder = new TextEncoder());
503
+ textEncoder ??= new TextEncoder();
504
504
  const utf8 = [...textEncoder.encode(str)];
505
505
  const words32 = bytesToWords32(utf8, Endian.Big);
506
506
  const len = utf8.length * 8;
@@ -566,7 +566,7 @@ function fk(index, b, c, d) {
566
566
  * https://github.com/google/closure-compiler/blob/master/src/com/google/javascript/jscomp/GoogleJsMessageIdGenerator.java
567
567
  */
568
568
  function fingerprint(str) {
569
- textEncoder ?? (textEncoder = new TextEncoder());
569
+ textEncoder ??= new TextEncoder();
570
570
  const utf8 = textEncoder.encode(str);
571
571
  const view = new DataView(utf8.buffer, utf8.byteOffset, utf8.byteLength);
572
572
  let hi = hash32(view, utf8.length, 0);
@@ -955,6 +955,9 @@ class ReadVarExpr extends Expression {
955
955
  visitExpression(visitor, context) {
956
956
  return visitor.visitReadVarExpr(this, context);
957
957
  }
958
+ clone() {
959
+ return new ReadVarExpr(this.name, this.type, this.sourceSpan);
960
+ }
958
961
  set(value) {
959
962
  return new WriteVarExpr(this.name, value, null, this.sourceSpan);
960
963
  }
@@ -973,6 +976,9 @@ class TypeofExpr extends Expression {
973
976
  isConstant() {
974
977
  return this.expr.isConstant();
975
978
  }
979
+ clone() {
980
+ return new TypeofExpr(this.expr.clone());
981
+ }
976
982
  }
977
983
  class WrappedNodeExpr extends Expression {
978
984
  constructor(node, type, sourceSpan) {
@@ -988,6 +994,9 @@ class WrappedNodeExpr extends Expression {
988
994
  visitExpression(visitor, context) {
989
995
  return visitor.visitWrappedNodeExpr(this, context);
990
996
  }
997
+ clone() {
998
+ return new WrappedNodeExpr(this.node, this.type, this.sourceSpan);
999
+ }
991
1000
  }
992
1001
  class WriteVarExpr extends Expression {
993
1002
  constructor(name, value, type, sourceSpan) {
@@ -1004,6 +1013,9 @@ class WriteVarExpr extends Expression {
1004
1013
  visitExpression(visitor, context) {
1005
1014
  return visitor.visitWriteVarExpr(this, context);
1006
1015
  }
1016
+ clone() {
1017
+ return new WriteVarExpr(this.name, this.value.clone(), this.type, this.sourceSpan);
1018
+ }
1007
1019
  toDeclStmt(type, modifiers) {
1008
1020
  return new DeclareVarStmt(this.name, this.value, type, modifiers, this.sourceSpan);
1009
1021
  }
@@ -1028,6 +1040,9 @@ class WriteKeyExpr extends Expression {
1028
1040
  visitExpression(visitor, context) {
1029
1041
  return visitor.visitWriteKeyExpr(this, context);
1030
1042
  }
1043
+ clone() {
1044
+ return new WriteKeyExpr(this.receiver.clone(), this.index.clone(), this.value.clone(), this.type, this.sourceSpan);
1045
+ }
1031
1046
  }
1032
1047
  class WritePropExpr extends Expression {
1033
1048
  constructor(receiver, name, value, type, sourceSpan) {
@@ -1046,6 +1061,9 @@ class WritePropExpr extends Expression {
1046
1061
  visitExpression(visitor, context) {
1047
1062
  return visitor.visitWritePropExpr(this, context);
1048
1063
  }
1064
+ clone() {
1065
+ return new WritePropExpr(this.receiver.clone(), this.name, this.value.clone(), this.type, this.sourceSpan);
1066
+ }
1049
1067
  }
1050
1068
  class InvokeFunctionExpr extends Expression {
1051
1069
  constructor(fn, args, type, sourceSpan, pure = false) {
@@ -1054,6 +1072,10 @@ class InvokeFunctionExpr extends Expression {
1054
1072
  this.args = args;
1055
1073
  this.pure = pure;
1056
1074
  }
1075
+ // An alias for fn, which allows other logic to handle calls and property reads together.
1076
+ get receiver() {
1077
+ return this.fn;
1078
+ }
1057
1079
  isEquivalent(e) {
1058
1080
  return e instanceof InvokeFunctionExpr && this.fn.isEquivalent(e.fn) &&
1059
1081
  areAllEquivalent(this.args, e.args) && this.pure === e.pure;
@@ -1064,6 +1086,9 @@ class InvokeFunctionExpr extends Expression {
1064
1086
  visitExpression(visitor, context) {
1065
1087
  return visitor.visitInvokeFunctionExpr(this, context);
1066
1088
  }
1089
+ clone() {
1090
+ return new InvokeFunctionExpr(this.fn.clone(), this.args.map(arg => arg.clone()), this.type, this.sourceSpan, this.pure);
1091
+ }
1067
1092
  }
1068
1093
  class TaggedTemplateExpr extends Expression {
1069
1094
  constructor(tag, template, type, sourceSpan) {
@@ -1082,6 +1107,9 @@ class TaggedTemplateExpr extends Expression {
1082
1107
  visitExpression(visitor, context) {
1083
1108
  return visitor.visitTaggedTemplateExpr(this, context);
1084
1109
  }
1110
+ clone() {
1111
+ return new TaggedTemplateExpr(this.tag.clone(), this.template.clone(), this.type, this.sourceSpan);
1112
+ }
1085
1113
  }
1086
1114
  class InstantiateExpr extends Expression {
1087
1115
  constructor(classExpr, args, type, sourceSpan) {
@@ -1099,6 +1127,9 @@ class InstantiateExpr extends Expression {
1099
1127
  visitExpression(visitor, context) {
1100
1128
  return visitor.visitInstantiateExpr(this, context);
1101
1129
  }
1130
+ clone() {
1131
+ return new InstantiateExpr(this.classExpr.clone(), this.args.map(arg => arg.clone()), this.type, this.sourceSpan);
1132
+ }
1102
1133
  }
1103
1134
  class LiteralExpr extends Expression {
1104
1135
  constructor(value, type, sourceSpan) {
@@ -1114,12 +1145,18 @@ class LiteralExpr extends Expression {
1114
1145
  visitExpression(visitor, context) {
1115
1146
  return visitor.visitLiteralExpr(this, context);
1116
1147
  }
1148
+ clone() {
1149
+ return new LiteralExpr(this.value, this.type, this.sourceSpan);
1150
+ }
1117
1151
  }
1118
1152
  class TemplateLiteral {
1119
1153
  constructor(elements, expressions) {
1120
1154
  this.elements = elements;
1121
1155
  this.expressions = expressions;
1122
1156
  }
1157
+ clone() {
1158
+ return new TemplateLiteral(this.elements.map(el => el.clone()), this.expressions.map(expr => expr.clone()));
1159
+ }
1123
1160
  }
1124
1161
  class TemplateLiteralElement {
1125
1162
  constructor(text, sourceSpan, rawText) {
@@ -1134,6 +1171,9 @@ class TemplateLiteralElement {
1134
1171
  this.rawText =
1135
1172
  rawText ?? sourceSpan?.toString() ?? escapeForTemplateLiteral(escapeSlashes(text));
1136
1173
  }
1174
+ clone() {
1175
+ return new TemplateLiteralElement(this.text, this.sourceSpan, this.rawText);
1176
+ }
1137
1177
  }
1138
1178
  class LiteralPiece {
1139
1179
  constructor(text, sourceSpan) {
@@ -1178,6 +1218,9 @@ class LocalizedString extends Expression {
1178
1218
  visitExpression(visitor, context) {
1179
1219
  return visitor.visitLocalizedString(this, context);
1180
1220
  }
1221
+ clone() {
1222
+ return new LocalizedString(this.metaBlock, this.messageParts, this.placeHolderNames, this.expressions.map(expr => expr.clone()), this.sourceSpan);
1223
+ }
1181
1224
  /**
1182
1225
  * Serialize the given `meta` and `messagePart` into "cooked" and "raw" strings that can be used
1183
1226
  * in a `$localize` tagged string. The format of the metadata is the same as that parsed by
@@ -1279,6 +1322,9 @@ class ExternalExpr extends Expression {
1279
1322
  visitExpression(visitor, context) {
1280
1323
  return visitor.visitExternalExpr(this, context);
1281
1324
  }
1325
+ clone() {
1326
+ return new ExternalExpr(this.value, this.type, this.typeParams, this.sourceSpan);
1327
+ }
1282
1328
  }
1283
1329
  class ConditionalExpr extends Expression {
1284
1330
  constructor(condition, trueCase, falseCase = null, type, sourceSpan) {
@@ -1297,6 +1343,27 @@ class ConditionalExpr extends Expression {
1297
1343
  visitExpression(visitor, context) {
1298
1344
  return visitor.visitConditionalExpr(this, context);
1299
1345
  }
1346
+ clone() {
1347
+ return new ConditionalExpr(this.condition.clone(), this.trueCase.clone(), this.falseCase?.clone(), this.type, this.sourceSpan);
1348
+ }
1349
+ }
1350
+ class DynamicImportExpr extends Expression {
1351
+ constructor(url, sourceSpan) {
1352
+ super(null, sourceSpan);
1353
+ this.url = url;
1354
+ }
1355
+ isEquivalent(e) {
1356
+ return e instanceof DynamicImportExpr && this.url === e.url;
1357
+ }
1358
+ isConstant() {
1359
+ return false;
1360
+ }
1361
+ visitExpression(visitor, context) {
1362
+ return visitor.visitDynamicImportExpr(this, context);
1363
+ }
1364
+ clone() {
1365
+ return new DynamicImportExpr(this.url, this.sourceSpan);
1366
+ }
1300
1367
  }
1301
1368
  class NotExpr extends Expression {
1302
1369
  constructor(condition, sourceSpan) {
@@ -1312,6 +1379,9 @@ class NotExpr extends Expression {
1312
1379
  visitExpression(visitor, context) {
1313
1380
  return visitor.visitNotExpr(this, context);
1314
1381
  }
1382
+ clone() {
1383
+ return new NotExpr(this.condition.clone(), this.sourceSpan);
1384
+ }
1315
1385
  }
1316
1386
  class FnParam {
1317
1387
  constructor(name, type = null) {
@@ -1321,6 +1391,9 @@ class FnParam {
1321
1391
  isEquivalent(param) {
1322
1392
  return this.name === param.name;
1323
1393
  }
1394
+ clone() {
1395
+ return new FnParam(this.name, this.type);
1396
+ }
1324
1397
  }
1325
1398
  class FunctionExpr extends Expression {
1326
1399
  constructor(params, statements, type, sourceSpan, name) {
@@ -1342,6 +1415,10 @@ class FunctionExpr extends Expression {
1342
1415
  toDeclStmt(name, modifiers) {
1343
1416
  return new DeclareFunctionStmt(name, this.params, this.statements, this.type, modifiers, this.sourceSpan);
1344
1417
  }
1418
+ clone() {
1419
+ // TODO: Should we deep clone statements?
1420
+ return new FunctionExpr(this.params.map(p => p.clone()), this.statements, this.type, this.sourceSpan, this.name);
1421
+ }
1345
1422
  }
1346
1423
  class UnaryOperatorExpr extends Expression {
1347
1424
  constructor(operator, expr, type, sourceSpan, parens = true) {
@@ -1360,6 +1437,9 @@ class UnaryOperatorExpr extends Expression {
1360
1437
  visitExpression(visitor, context) {
1361
1438
  return visitor.visitUnaryOperatorExpr(this, context);
1362
1439
  }
1440
+ clone() {
1441
+ return new UnaryOperatorExpr(this.operator, this.expr.clone(), this.type, this.sourceSpan, this.parens);
1442
+ }
1363
1443
  }
1364
1444
  class BinaryOperatorExpr extends Expression {
1365
1445
  constructor(operator, lhs, rhs, type, sourceSpan, parens = true) {
@@ -1379,6 +1459,9 @@ class BinaryOperatorExpr extends Expression {
1379
1459
  visitExpression(visitor, context) {
1380
1460
  return visitor.visitBinaryOperatorExpr(this, context);
1381
1461
  }
1462
+ clone() {
1463
+ return new BinaryOperatorExpr(this.operator, this.lhs.clone(), this.rhs.clone(), this.type, this.sourceSpan, this.parens);
1464
+ }
1382
1465
  }
1383
1466
  class ReadPropExpr extends Expression {
1384
1467
  constructor(receiver, name, type, sourceSpan) {
@@ -1386,6 +1469,10 @@ class ReadPropExpr extends Expression {
1386
1469
  this.receiver = receiver;
1387
1470
  this.name = name;
1388
1471
  }
1472
+ // An alias for name, which allows other logic to handle property reads and keyed reads together.
1473
+ get index() {
1474
+ return this.name;
1475
+ }
1389
1476
  isEquivalent(e) {
1390
1477
  return e instanceof ReadPropExpr && this.receiver.isEquivalent(e.receiver) &&
1391
1478
  this.name === e.name;
@@ -1399,6 +1486,9 @@ class ReadPropExpr extends Expression {
1399
1486
  set(value) {
1400
1487
  return new WritePropExpr(this.receiver, this.name, value, null, this.sourceSpan);
1401
1488
  }
1489
+ clone() {
1490
+ return new ReadPropExpr(this.receiver.clone(), this.name, this.type, this.sourceSpan);
1491
+ }
1402
1492
  }
1403
1493
  class ReadKeyExpr extends Expression {
1404
1494
  constructor(receiver, index, type, sourceSpan) {
@@ -1419,6 +1509,9 @@ class ReadKeyExpr extends Expression {
1419
1509
  set(value) {
1420
1510
  return new WriteKeyExpr(this.receiver, this.index, value, null, this.sourceSpan);
1421
1511
  }
1512
+ clone() {
1513
+ return new ReadKeyExpr(this.receiver.clone(), this.index.clone(), this.type, this.sourceSpan);
1514
+ }
1422
1515
  }
1423
1516
  class LiteralArrayExpr extends Expression {
1424
1517
  constructor(entries, type, sourceSpan) {
@@ -1434,6 +1527,9 @@ class LiteralArrayExpr extends Expression {
1434
1527
  visitExpression(visitor, context) {
1435
1528
  return visitor.visitLiteralArrayExpr(this, context);
1436
1529
  }
1530
+ clone() {
1531
+ return new LiteralArrayExpr(this.entries.map(e => e.clone()), this.type, this.sourceSpan);
1532
+ }
1437
1533
  }
1438
1534
  class LiteralMapEntry {
1439
1535
  constructor(key, value, quoted) {
@@ -1444,6 +1540,9 @@ class LiteralMapEntry {
1444
1540
  isEquivalent(e) {
1445
1541
  return this.key === e.key && this.value.isEquivalent(e.value);
1446
1542
  }
1543
+ clone() {
1544
+ return new LiteralMapEntry(this.key, this.value.clone(), this.quoted);
1545
+ }
1447
1546
  }
1448
1547
  class LiteralMapExpr extends Expression {
1449
1548
  constructor(entries, type, sourceSpan) {
@@ -1463,6 +1562,10 @@ class LiteralMapExpr extends Expression {
1463
1562
  visitExpression(visitor, context) {
1464
1563
  return visitor.visitLiteralMapExpr(this, context);
1465
1564
  }
1565
+ clone() {
1566
+ const entriesClone = this.entries.map(entry => entry.clone());
1567
+ return new LiteralMapExpr(entriesClone, this.type, this.sourceSpan);
1568
+ }
1466
1569
  }
1467
1570
  const NULL_EXPR = new LiteralExpr(null, null, null);
1468
1571
  const TYPED_NULL_EXPR = new LiteralExpr(null, INFERRED_TYPE, null);
@@ -1691,6 +1794,7 @@ class FixupExpression extends Expression {
1691
1794
  constructor(resolved) {
1692
1795
  super(resolved.type);
1693
1796
  this.resolved = resolved;
1797
+ this.shared = false;
1694
1798
  this.original = resolved;
1695
1799
  }
1696
1800
  visitExpression(visitor, context) {
@@ -1709,6 +1813,9 @@ class FixupExpression extends Expression {
1709
1813
  isConstant() {
1710
1814
  return true;
1711
1815
  }
1816
+ clone() {
1817
+ throw new Error(`Not supported.`);
1818
+ }
1712
1819
  fixup(expression) {
1713
1820
  this.resolved = expression;
1714
1821
  this.shared = true;
@@ -1725,6 +1832,7 @@ class ConstantPool {
1725
1832
  this.statements = [];
1726
1833
  this.literals = new Map();
1727
1834
  this.literalFactories = new Map();
1835
+ this.sharedConstants = new Map();
1728
1836
  this.nextNameIndex = 0;
1729
1837
  }
1730
1838
  getConstLiteral(literal, forceShared) {
@@ -1734,7 +1842,7 @@ class ConstantPool {
1734
1842
  // reference to a constant.
1735
1843
  return literal;
1736
1844
  }
1737
- const key = this.keyOf(literal);
1845
+ const key = GenericKeyFn.INSTANCE.keyOf(literal);
1738
1846
  let fixup = this.literals.get(key);
1739
1847
  let newValue = false;
1740
1848
  if (!fixup) {
@@ -1779,11 +1887,20 @@ class ConstantPool {
1779
1887
  }
1780
1888
  return fixup;
1781
1889
  }
1890
+ getSharedConstant(def, expr) {
1891
+ const key = def.keyOf(expr);
1892
+ if (!this.sharedConstants.has(key)) {
1893
+ const id = this.freshName();
1894
+ this.sharedConstants.set(key, variable(id));
1895
+ this.statements.push(def.toSharedConstantDeclaration(id, expr));
1896
+ }
1897
+ return this.sharedConstants.get(key);
1898
+ }
1782
1899
  getLiteralFactory(literal) {
1783
1900
  // Create a pure function that builds an array of a mix of constant and variable expressions
1784
1901
  if (literal instanceof LiteralArrayExpr) {
1785
1902
  const argumentsForKey = literal.entries.map(e => e.isConstant() ? e : UNKNOWN_VALUE_KEY);
1786
- const key = this.keyOf(literalArr(argumentsForKey));
1903
+ const key = GenericKeyFn.INSTANCE.keyOf(literalArr(argumentsForKey));
1787
1904
  return this._getLiteralFactory(key, literal.entries, entries => literalArr(entries));
1788
1905
  }
1789
1906
  else {
@@ -1792,7 +1909,7 @@ class ConstantPool {
1792
1909
  value: e.value.isConstant() ? e.value : UNKNOWN_VALUE_KEY,
1793
1910
  quoted: e.quoted
1794
1911
  })));
1795
- const key = this.keyOf(expressionForKey);
1912
+ const key = GenericKeyFn.INSTANCE.keyOf(expressionForKey);
1796
1913
  return this._getLiteralFactory(key, literal.entries.map(e => e.value), entries => literalMap(entries.map((value, index) => ({
1797
1914
  key: literal.entries[index].key,
1798
1915
  value,
@@ -1829,65 +1946,48 @@ class ConstantPool {
1829
1946
  freshName() {
1830
1947
  return this.uniqueName(CONSTANT_PREFIX);
1831
1948
  }
1832
- keyOf(expression) {
1833
- return expression.visitExpression(new KeyVisitor(), KEY_CONTEXT);
1834
- }
1835
1949
  }
1836
- /**
1837
- * Visitor used to determine if 2 expressions are equivalent and can be shared in the
1838
- * `ConstantPool`.
1839
- *
1840
- * When the id (string) generated by the visitor is equal, expressions are considered equivalent.
1841
- */
1842
- class KeyVisitor {
1843
- constructor() {
1844
- this.visitWrappedNodeExpr = invalid$1;
1845
- this.visitWriteVarExpr = invalid$1;
1846
- this.visitWriteKeyExpr = invalid$1;
1847
- this.visitWritePropExpr = invalid$1;
1848
- this.visitInvokeFunctionExpr = invalid$1;
1849
- this.visitTaggedTemplateExpr = invalid$1;
1850
- this.visitInstantiateExpr = invalid$1;
1851
- this.visitConditionalExpr = invalid$1;
1852
- this.visitNotExpr = invalid$1;
1853
- this.visitAssertNotNullExpr = invalid$1;
1854
- this.visitCastExpr = invalid$1;
1855
- this.visitFunctionExpr = invalid$1;
1856
- this.visitUnaryOperatorExpr = invalid$1;
1857
- this.visitBinaryOperatorExpr = invalid$1;
1858
- this.visitReadPropExpr = invalid$1;
1859
- this.visitReadKeyExpr = invalid$1;
1860
- this.visitCommaExpr = invalid$1;
1861
- this.visitLocalizedString = invalid$1;
1862
- }
1863
- visitLiteralExpr(ast) {
1864
- return `${typeof ast.value === 'string' ? '"' + ast.value + '"' : ast.value}`;
1865
- }
1866
- visitLiteralArrayExpr(ast, context) {
1867
- return `[${ast.entries.map(entry => entry.visitExpression(this, context)).join(',')}]`;
1868
- }
1869
- visitLiteralMapExpr(ast, context) {
1870
- const mapKey = (entry) => {
1871
- const quote = entry.quoted ? '"' : '';
1872
- return `${quote}${entry.key}${quote}`;
1873
- };
1874
- const mapEntry = (entry) => `${mapKey(entry)}:${entry.value.visitExpression(this, context)}`;
1875
- return `{${ast.entries.map(mapEntry).join(',')}`;
1876
- }
1877
- visitExternalExpr(ast) {
1878
- return ast.value.moduleName ? `EX:${ast.value.moduleName}:${ast.value.name}` :
1879
- `EX:${ast.value.runtime.name}`;
1880
- }
1881
- visitReadVarExpr(node) {
1882
- return `VAR:${node.name}`;
1883
- }
1884
- visitTypeofExpr(node, context) {
1885
- return `TYPEOF:${node.expr.visitExpression(this, context)}`;
1950
+ class GenericKeyFn {
1951
+ static { this.INSTANCE = new GenericKeyFn(); }
1952
+ keyOf(expr) {
1953
+ if (expr instanceof LiteralExpr && typeof expr.value === 'string') {
1954
+ return `"${expr.value}"`;
1955
+ }
1956
+ else if (expr instanceof LiteralExpr) {
1957
+ return String(expr.value);
1958
+ }
1959
+ else if (expr instanceof LiteralArrayExpr) {
1960
+ const entries = [];
1961
+ for (const entry of expr.entries) {
1962
+ entries.push(this.keyOf(entry));
1963
+ }
1964
+ return `[${entries.join(',')}]`;
1965
+ }
1966
+ else if (expr instanceof LiteralMapExpr) {
1967
+ const entries = [];
1968
+ for (const entry of expr.entries) {
1969
+ let key = entry.key;
1970
+ if (entry.quoted) {
1971
+ key = `"${key}"`;
1972
+ }
1973
+ entries.push(key + ':' + this.keyOf(entry.value));
1974
+ }
1975
+ return `{${entries.join(',')}}`;
1976
+ }
1977
+ else if (expr instanceof ExternalExpr) {
1978
+ return `import("${expr.value.moduleName}", ${expr.value.name})`;
1979
+ }
1980
+ else if (expr instanceof ReadVarExpr) {
1981
+ return `read(${expr.name})`;
1982
+ }
1983
+ else if (expr instanceof TypeofExpr) {
1984
+ return `typeof(${this.keyOf(expr.expr)})`;
1985
+ }
1986
+ else {
1987
+ throw new Error(`${this.constructor.name} does not handle expressions of type ${expr.constructor.name}`);
1988
+ }
1886
1989
  }
1887
1990
  }
1888
- function invalid$1(arg) {
1889
- throw new Error(`Invalid state: Visitor ${this.constructor.name} doesn't handle ${arg.constructor.name}`);
1890
- }
1891
1991
  function isVariable(e) {
1892
1992
  return e instanceof ReadVarExpr;
1893
1993
  }
@@ -1898,209 +1998,211 @@ function isLongStringLiteral(expr) {
1898
1998
 
1899
1999
  const CORE = '@angular/core';
1900
2000
  class Identifiers {
2001
+ /* Methods */
2002
+ static { this.NEW_METHOD = 'factory'; }
2003
+ static { this.TRANSFORM_METHOD = 'transform'; }
2004
+ static { this.PATCH_DEPS = 'patchedDeps'; }
2005
+ static { this.core = { name: null, moduleName: CORE }; }
2006
+ /* Instructions */
2007
+ static { this.namespaceHTML = { name: 'ɵɵnamespaceHTML', moduleName: CORE }; }
2008
+ static { this.namespaceMathML = { name: 'ɵɵnamespaceMathML', moduleName: CORE }; }
2009
+ static { this.namespaceSVG = { name: 'ɵɵnamespaceSVG', moduleName: CORE }; }
2010
+ static { this.element = { name: 'ɵɵelement', moduleName: CORE }; }
2011
+ static { this.elementStart = { name: 'ɵɵelementStart', moduleName: CORE }; }
2012
+ static { this.elementEnd = { name: 'ɵɵelementEnd', moduleName: CORE }; }
2013
+ static { this.advance = { name: 'ɵɵadvance', moduleName: CORE }; }
2014
+ static { this.syntheticHostProperty = { name: 'ɵɵsyntheticHostProperty', moduleName: CORE }; }
2015
+ static { this.syntheticHostListener = { name: 'ɵɵsyntheticHostListener', moduleName: CORE }; }
2016
+ static { this.attribute = { name: 'ɵɵattribute', moduleName: CORE }; }
2017
+ static { this.attributeInterpolate1 = { name: 'ɵɵattributeInterpolate1', moduleName: CORE }; }
2018
+ static { this.attributeInterpolate2 = { name: 'ɵɵattributeInterpolate2', moduleName: CORE }; }
2019
+ static { this.attributeInterpolate3 = { name: 'ɵɵattributeInterpolate3', moduleName: CORE }; }
2020
+ static { this.attributeInterpolate4 = { name: 'ɵɵattributeInterpolate4', moduleName: CORE }; }
2021
+ static { this.attributeInterpolate5 = { name: 'ɵɵattributeInterpolate5', moduleName: CORE }; }
2022
+ static { this.attributeInterpolate6 = { name: 'ɵɵattributeInterpolate6', moduleName: CORE }; }
2023
+ static { this.attributeInterpolate7 = { name: 'ɵɵattributeInterpolate7', moduleName: CORE }; }
2024
+ static { this.attributeInterpolate8 = { name: 'ɵɵattributeInterpolate8', moduleName: CORE }; }
2025
+ static { this.attributeInterpolateV = { name: 'ɵɵattributeInterpolateV', moduleName: CORE }; }
2026
+ static { this.classProp = { name: 'ɵɵclassProp', moduleName: CORE }; }
2027
+ static { this.elementContainerStart = { name: 'ɵɵelementContainerStart', moduleName: CORE }; }
2028
+ static { this.elementContainerEnd = { name: 'ɵɵelementContainerEnd', moduleName: CORE }; }
2029
+ static { this.elementContainer = { name: 'ɵɵelementContainer', moduleName: CORE }; }
2030
+ static { this.styleMap = { name: 'ɵɵstyleMap', moduleName: CORE }; }
2031
+ static { this.styleMapInterpolate1 = { name: 'ɵɵstyleMapInterpolate1', moduleName: CORE }; }
2032
+ static { this.styleMapInterpolate2 = { name: 'ɵɵstyleMapInterpolate2', moduleName: CORE }; }
2033
+ static { this.styleMapInterpolate3 = { name: 'ɵɵstyleMapInterpolate3', moduleName: CORE }; }
2034
+ static { this.styleMapInterpolate4 = { name: 'ɵɵstyleMapInterpolate4', moduleName: CORE }; }
2035
+ static { this.styleMapInterpolate5 = { name: 'ɵɵstyleMapInterpolate5', moduleName: CORE }; }
2036
+ static { this.styleMapInterpolate6 = { name: 'ɵɵstyleMapInterpolate6', moduleName: CORE }; }
2037
+ static { this.styleMapInterpolate7 = { name: 'ɵɵstyleMapInterpolate7', moduleName: CORE }; }
2038
+ static { this.styleMapInterpolate8 = { name: 'ɵɵstyleMapInterpolate8', moduleName: CORE }; }
2039
+ static { this.styleMapInterpolateV = { name: 'ɵɵstyleMapInterpolateV', moduleName: CORE }; }
2040
+ static { this.classMap = { name: 'ɵɵclassMap', moduleName: CORE }; }
2041
+ static { this.classMapInterpolate1 = { name: 'ɵɵclassMapInterpolate1', moduleName: CORE }; }
2042
+ static { this.classMapInterpolate2 = { name: 'ɵɵclassMapInterpolate2', moduleName: CORE }; }
2043
+ static { this.classMapInterpolate3 = { name: 'ɵɵclassMapInterpolate3', moduleName: CORE }; }
2044
+ static { this.classMapInterpolate4 = { name: 'ɵɵclassMapInterpolate4', moduleName: CORE }; }
2045
+ static { this.classMapInterpolate5 = { name: 'ɵɵclassMapInterpolate5', moduleName: CORE }; }
2046
+ static { this.classMapInterpolate6 = { name: 'ɵɵclassMapInterpolate6', moduleName: CORE }; }
2047
+ static { this.classMapInterpolate7 = { name: 'ɵɵclassMapInterpolate7', moduleName: CORE }; }
2048
+ static { this.classMapInterpolate8 = { name: 'ɵɵclassMapInterpolate8', moduleName: CORE }; }
2049
+ static { this.classMapInterpolateV = { name: 'ɵɵclassMapInterpolateV', moduleName: CORE }; }
2050
+ static { this.styleProp = { name: 'ɵɵstyleProp', moduleName: CORE }; }
2051
+ static { this.stylePropInterpolate1 = { name: 'ɵɵstylePropInterpolate1', moduleName: CORE }; }
2052
+ static { this.stylePropInterpolate2 = { name: 'ɵɵstylePropInterpolate2', moduleName: CORE }; }
2053
+ static { this.stylePropInterpolate3 = { name: 'ɵɵstylePropInterpolate3', moduleName: CORE }; }
2054
+ static { this.stylePropInterpolate4 = { name: 'ɵɵstylePropInterpolate4', moduleName: CORE }; }
2055
+ static { this.stylePropInterpolate5 = { name: 'ɵɵstylePropInterpolate5', moduleName: CORE }; }
2056
+ static { this.stylePropInterpolate6 = { name: 'ɵɵstylePropInterpolate6', moduleName: CORE }; }
2057
+ static { this.stylePropInterpolate7 = { name: 'ɵɵstylePropInterpolate7', moduleName: CORE }; }
2058
+ static { this.stylePropInterpolate8 = { name: 'ɵɵstylePropInterpolate8', moduleName: CORE }; }
2059
+ static { this.stylePropInterpolateV = { name: 'ɵɵstylePropInterpolateV', moduleName: CORE }; }
2060
+ static { this.nextContext = { name: 'ɵɵnextContext', moduleName: CORE }; }
2061
+ static { this.resetView = { name: 'ɵɵresetView', moduleName: CORE }; }
2062
+ static { this.templateCreate = { name: 'ɵɵtemplate', moduleName: CORE }; }
2063
+ static { this.defer = { name: 'ɵɵdefer', moduleName: CORE }; }
2064
+ static { this.text = { name: 'ɵɵtext', moduleName: CORE }; }
2065
+ static { this.enableBindings = { name: 'ɵɵenableBindings', moduleName: CORE }; }
2066
+ static { this.disableBindings = { name: 'ɵɵdisableBindings', moduleName: CORE }; }
2067
+ static { this.getCurrentView = { name: 'ɵɵgetCurrentView', moduleName: CORE }; }
2068
+ static { this.textInterpolate = { name: 'ɵɵtextInterpolate', moduleName: CORE }; }
2069
+ static { this.textInterpolate1 = { name: 'ɵɵtextInterpolate1', moduleName: CORE }; }
2070
+ static { this.textInterpolate2 = { name: 'ɵɵtextInterpolate2', moduleName: CORE }; }
2071
+ static { this.textInterpolate3 = { name: 'ɵɵtextInterpolate3', moduleName: CORE }; }
2072
+ static { this.textInterpolate4 = { name: 'ɵɵtextInterpolate4', moduleName: CORE }; }
2073
+ static { this.textInterpolate5 = { name: 'ɵɵtextInterpolate5', moduleName: CORE }; }
2074
+ static { this.textInterpolate6 = { name: 'ɵɵtextInterpolate6', moduleName: CORE }; }
2075
+ static { this.textInterpolate7 = { name: 'ɵɵtextInterpolate7', moduleName: CORE }; }
2076
+ static { this.textInterpolate8 = { name: 'ɵɵtextInterpolate8', moduleName: CORE }; }
2077
+ static { this.textInterpolateV = { name: 'ɵɵtextInterpolateV', moduleName: CORE }; }
2078
+ static { this.restoreView = { name: 'ɵɵrestoreView', moduleName: CORE }; }
2079
+ static { this.pureFunction0 = { name: 'ɵɵpureFunction0', moduleName: CORE }; }
2080
+ static { this.pureFunction1 = { name: 'ɵɵpureFunction1', moduleName: CORE }; }
2081
+ static { this.pureFunction2 = { name: 'ɵɵpureFunction2', moduleName: CORE }; }
2082
+ static { this.pureFunction3 = { name: 'ɵɵpureFunction3', moduleName: CORE }; }
2083
+ static { this.pureFunction4 = { name: 'ɵɵpureFunction4', moduleName: CORE }; }
2084
+ static { this.pureFunction5 = { name: 'ɵɵpureFunction5', moduleName: CORE }; }
2085
+ static { this.pureFunction6 = { name: 'ɵɵpureFunction6', moduleName: CORE }; }
2086
+ static { this.pureFunction7 = { name: 'ɵɵpureFunction7', moduleName: CORE }; }
2087
+ static { this.pureFunction8 = { name: 'ɵɵpureFunction8', moduleName: CORE }; }
2088
+ static { this.pureFunctionV = { name: 'ɵɵpureFunctionV', moduleName: CORE }; }
2089
+ static { this.pipeBind1 = { name: 'ɵɵpipeBind1', moduleName: CORE }; }
2090
+ static { this.pipeBind2 = { name: 'ɵɵpipeBind2', moduleName: CORE }; }
2091
+ static { this.pipeBind3 = { name: 'ɵɵpipeBind3', moduleName: CORE }; }
2092
+ static { this.pipeBind4 = { name: 'ɵɵpipeBind4', moduleName: CORE }; }
2093
+ static { this.pipeBindV = { name: 'ɵɵpipeBindV', moduleName: CORE }; }
2094
+ static { this.hostProperty = { name: 'ɵɵhostProperty', moduleName: CORE }; }
2095
+ static { this.property = { name: 'ɵɵproperty', moduleName: CORE }; }
2096
+ static { this.propertyInterpolate = { name: 'ɵɵpropertyInterpolate', moduleName: CORE }; }
2097
+ static { this.propertyInterpolate1 = { name: 'ɵɵpropertyInterpolate1', moduleName: CORE }; }
2098
+ static { this.propertyInterpolate2 = { name: 'ɵɵpropertyInterpolate2', moduleName: CORE }; }
2099
+ static { this.propertyInterpolate3 = { name: 'ɵɵpropertyInterpolate3', moduleName: CORE }; }
2100
+ static { this.propertyInterpolate4 = { name: 'ɵɵpropertyInterpolate4', moduleName: CORE }; }
2101
+ static { this.propertyInterpolate5 = { name: 'ɵɵpropertyInterpolate5', moduleName: CORE }; }
2102
+ static { this.propertyInterpolate6 = { name: 'ɵɵpropertyInterpolate6', moduleName: CORE }; }
2103
+ static { this.propertyInterpolate7 = { name: 'ɵɵpropertyInterpolate7', moduleName: CORE }; }
2104
+ static { this.propertyInterpolate8 = { name: 'ɵɵpropertyInterpolate8', moduleName: CORE }; }
2105
+ static { this.propertyInterpolateV = { name: 'ɵɵpropertyInterpolateV', moduleName: CORE }; }
2106
+ static { this.i18n = { name: 'ɵɵi18n', moduleName: CORE }; }
2107
+ static { this.i18nAttributes = { name: 'ɵɵi18nAttributes', moduleName: CORE }; }
2108
+ static { this.i18nExp = { name: 'ɵɵi18nExp', moduleName: CORE }; }
2109
+ static { this.i18nStart = { name: 'ɵɵi18nStart', moduleName: CORE }; }
2110
+ static { this.i18nEnd = { name: 'ɵɵi18nEnd', moduleName: CORE }; }
2111
+ static { this.i18nApply = { name: 'ɵɵi18nApply', moduleName: CORE }; }
2112
+ static { this.i18nPostprocess = { name: 'ɵɵi18nPostprocess', moduleName: CORE }; }
2113
+ static { this.pipe = { name: 'ɵɵpipe', moduleName: CORE }; }
2114
+ static { this.projection = { name: 'ɵɵprojection', moduleName: CORE }; }
2115
+ static { this.projectionDef = { name: 'ɵɵprojectionDef', moduleName: CORE }; }
2116
+ static { this.reference = { name: 'ɵɵreference', moduleName: CORE }; }
2117
+ static { this.inject = { name: 'ɵɵinject', moduleName: CORE }; }
2118
+ static { this.injectAttribute = { name: 'ɵɵinjectAttribute', moduleName: CORE }; }
2119
+ static { this.directiveInject = { name: 'ɵɵdirectiveInject', moduleName: CORE }; }
2120
+ static { this.invalidFactory = { name: 'ɵɵinvalidFactory', moduleName: CORE }; }
2121
+ static { this.invalidFactoryDep = { name: 'ɵɵinvalidFactoryDep', moduleName: CORE }; }
2122
+ static { this.templateRefExtractor = { name: 'ɵɵtemplateRefExtractor', moduleName: CORE }; }
2123
+ static { this.forwardRef = { name: 'forwardRef', moduleName: CORE }; }
2124
+ static { this.resolveForwardRef = { name: 'resolveForwardRef', moduleName: CORE }; }
2125
+ static { this.ɵɵdefineInjectable = { name: 'ɵɵdefineInjectable', moduleName: CORE }; }
2126
+ static { this.declareInjectable = { name: 'ɵɵngDeclareInjectable', moduleName: CORE }; }
2127
+ static { this.InjectableDeclaration = { name: 'ɵɵInjectableDeclaration', moduleName: CORE }; }
2128
+ static { this.resolveWindow = { name: 'ɵɵresolveWindow', moduleName: CORE }; }
2129
+ static { this.resolveDocument = { name: 'ɵɵresolveDocument', moduleName: CORE }; }
2130
+ static { this.resolveBody = { name: 'ɵɵresolveBody', moduleName: CORE }; }
2131
+ static { this.defineComponent = { name: 'ɵɵdefineComponent', moduleName: CORE }; }
2132
+ static { this.declareComponent = { name: 'ɵɵngDeclareComponent', moduleName: CORE }; }
2133
+ static { this.setComponentScope = { name: 'ɵɵsetComponentScope', moduleName: CORE }; }
2134
+ static { this.ChangeDetectionStrategy = {
2135
+ name: 'ChangeDetectionStrategy',
2136
+ moduleName: CORE,
2137
+ }; }
2138
+ static { this.ViewEncapsulation = {
2139
+ name: 'ViewEncapsulation',
2140
+ moduleName: CORE,
2141
+ }; }
2142
+ static { this.ComponentDeclaration = {
2143
+ name: 'ɵɵComponentDeclaration',
2144
+ moduleName: CORE,
2145
+ }; }
2146
+ static { this.FactoryDeclaration = {
2147
+ name: 'ɵɵFactoryDeclaration',
2148
+ moduleName: CORE,
2149
+ }; }
2150
+ static { this.declareFactory = { name: 'ɵɵngDeclareFactory', moduleName: CORE }; }
2151
+ static { this.FactoryTarget = { name: 'ɵɵFactoryTarget', moduleName: CORE }; }
2152
+ static { this.defineDirective = { name: 'ɵɵdefineDirective', moduleName: CORE }; }
2153
+ static { this.declareDirective = { name: 'ɵɵngDeclareDirective', moduleName: CORE }; }
2154
+ static { this.DirectiveDeclaration = {
2155
+ name: 'ɵɵDirectiveDeclaration',
2156
+ moduleName: CORE,
2157
+ }; }
2158
+ static { this.InjectorDef = { name: 'ɵɵInjectorDef', moduleName: CORE }; }
2159
+ static { this.InjectorDeclaration = { name: 'ɵɵInjectorDeclaration', moduleName: CORE }; }
2160
+ static { this.defineInjector = { name: 'ɵɵdefineInjector', moduleName: CORE }; }
2161
+ static { this.declareInjector = { name: 'ɵɵngDeclareInjector', moduleName: CORE }; }
2162
+ static { this.NgModuleDeclaration = {
2163
+ name: 'ɵɵNgModuleDeclaration',
2164
+ moduleName: CORE,
2165
+ }; }
2166
+ static { this.ModuleWithProviders = {
2167
+ name: 'ModuleWithProviders',
2168
+ moduleName: CORE,
2169
+ }; }
2170
+ static { this.defineNgModule = { name: 'ɵɵdefineNgModule', moduleName: CORE }; }
2171
+ static { this.declareNgModule = { name: 'ɵɵngDeclareNgModule', moduleName: CORE }; }
2172
+ static { this.setNgModuleScope = { name: 'ɵɵsetNgModuleScope', moduleName: CORE }; }
2173
+ static { this.registerNgModuleType = { name: 'ɵɵregisterNgModuleType', moduleName: CORE }; }
2174
+ static { this.PipeDeclaration = { name: 'ɵɵPipeDeclaration', moduleName: CORE }; }
2175
+ static { this.definePipe = { name: 'ɵɵdefinePipe', moduleName: CORE }; }
2176
+ static { this.declarePipe = { name: 'ɵɵngDeclarePipe', moduleName: CORE }; }
2177
+ static { this.declareClassMetadata = { name: 'ɵɵngDeclareClassMetadata', moduleName: CORE }; }
2178
+ static { this.setClassMetadata = { name: 'ɵsetClassMetadata', moduleName: CORE }; }
2179
+ static { this.queryRefresh = { name: 'ɵɵqueryRefresh', moduleName: CORE }; }
2180
+ static { this.viewQuery = { name: 'ɵɵviewQuery', moduleName: CORE }; }
2181
+ static { this.loadQuery = { name: 'ɵɵloadQuery', moduleName: CORE }; }
2182
+ static { this.contentQuery = { name: 'ɵɵcontentQuery', moduleName: CORE }; }
2183
+ static { this.NgOnChangesFeature = { name: 'ɵɵNgOnChangesFeature', moduleName: CORE }; }
2184
+ static { this.InheritDefinitionFeature = { name: 'ɵɵInheritDefinitionFeature', moduleName: CORE }; }
2185
+ static { this.CopyDefinitionFeature = { name: 'ɵɵCopyDefinitionFeature', moduleName: CORE }; }
2186
+ static { this.StandaloneFeature = { name: 'ɵɵStandaloneFeature', moduleName: CORE }; }
2187
+ static { this.ProvidersFeature = { name: 'ɵɵProvidersFeature', moduleName: CORE }; }
2188
+ static { this.HostDirectivesFeature = { name: 'ɵɵHostDirectivesFeature', moduleName: CORE }; }
2189
+ static { this.InputTransformsFeatureFeature = { name: 'ɵɵInputTransformsFeature', moduleName: CORE }; }
2190
+ static { this.listener = { name: 'ɵɵlistener', moduleName: CORE }; }
2191
+ static { this.getInheritedFactory = {
2192
+ name: 'ɵɵgetInheritedFactory',
2193
+ moduleName: CORE,
2194
+ }; }
2195
+ // sanitization-related functions
2196
+ static { this.sanitizeHtml = { name: 'ɵɵsanitizeHtml', moduleName: CORE }; }
2197
+ static { this.sanitizeStyle = { name: 'ɵɵsanitizeStyle', moduleName: CORE }; }
2198
+ static { this.sanitizeResourceUrl = { name: 'ɵɵsanitizeResourceUrl', moduleName: CORE }; }
2199
+ static { this.sanitizeScript = { name: 'ɵɵsanitizeScript', moduleName: CORE }; }
2200
+ static { this.sanitizeUrl = { name: 'ɵɵsanitizeUrl', moduleName: CORE }; }
2201
+ static { this.sanitizeUrlOrResourceUrl = { name: 'ɵɵsanitizeUrlOrResourceUrl', moduleName: CORE }; }
2202
+ static { this.trustConstantHtml = { name: 'ɵɵtrustConstantHtml', moduleName: CORE }; }
2203
+ static { this.trustConstantResourceUrl = { name: 'ɵɵtrustConstantResourceUrl', moduleName: CORE }; }
2204
+ static { this.validateIframeAttribute = { name: 'ɵɵvalidateIframeAttribute', moduleName: CORE }; }
1901
2205
  }
1902
- /* Methods */
1903
- Identifiers.NEW_METHOD = 'factory';
1904
- Identifiers.TRANSFORM_METHOD = 'transform';
1905
- Identifiers.PATCH_DEPS = 'patchedDeps';
1906
- Identifiers.core = { name: null, moduleName: CORE };
1907
- /* Instructions */
1908
- Identifiers.namespaceHTML = { name: 'ɵɵnamespaceHTML', moduleName: CORE };
1909
- Identifiers.namespaceMathML = { name: 'ɵɵnamespaceMathML', moduleName: CORE };
1910
- Identifiers.namespaceSVG = { name: 'ɵɵnamespaceSVG', moduleName: CORE };
1911
- Identifiers.element = { name: 'ɵɵelement', moduleName: CORE };
1912
- Identifiers.elementStart = { name: 'ɵɵelementStart', moduleName: CORE };
1913
- Identifiers.elementEnd = { name: 'ɵɵelementEnd', moduleName: CORE };
1914
- Identifiers.advance = { name: 'ɵɵadvance', moduleName: CORE };
1915
- Identifiers.syntheticHostProperty = { name: 'ɵɵsyntheticHostProperty', moduleName: CORE };
1916
- Identifiers.syntheticHostListener = { name: 'ɵɵsyntheticHostListener', moduleName: CORE };
1917
- Identifiers.attribute = { name: 'ɵɵattribute', moduleName: CORE };
1918
- Identifiers.attributeInterpolate1 = { name: 'ɵɵattributeInterpolate1', moduleName: CORE };
1919
- Identifiers.attributeInterpolate2 = { name: 'ɵɵattributeInterpolate2', moduleName: CORE };
1920
- Identifiers.attributeInterpolate3 = { name: 'ɵɵattributeInterpolate3', moduleName: CORE };
1921
- Identifiers.attributeInterpolate4 = { name: 'ɵɵattributeInterpolate4', moduleName: CORE };
1922
- Identifiers.attributeInterpolate5 = { name: 'ɵɵattributeInterpolate5', moduleName: CORE };
1923
- Identifiers.attributeInterpolate6 = { name: 'ɵɵattributeInterpolate6', moduleName: CORE };
1924
- Identifiers.attributeInterpolate7 = { name: 'ɵɵattributeInterpolate7', moduleName: CORE };
1925
- Identifiers.attributeInterpolate8 = { name: 'ɵɵattributeInterpolate8', moduleName: CORE };
1926
- Identifiers.attributeInterpolateV = { name: 'ɵɵattributeInterpolateV', moduleName: CORE };
1927
- Identifiers.classProp = { name: 'ɵɵclassProp', moduleName: CORE };
1928
- Identifiers.elementContainerStart = { name: 'ɵɵelementContainerStart', moduleName: CORE };
1929
- Identifiers.elementContainerEnd = { name: 'ɵɵelementContainerEnd', moduleName: CORE };
1930
- Identifiers.elementContainer = { name: 'ɵɵelementContainer', moduleName: CORE };
1931
- Identifiers.styleMap = { name: 'ɵɵstyleMap', moduleName: CORE };
1932
- Identifiers.styleMapInterpolate1 = { name: 'ɵɵstyleMapInterpolate1', moduleName: CORE };
1933
- Identifiers.styleMapInterpolate2 = { name: 'ɵɵstyleMapInterpolate2', moduleName: CORE };
1934
- Identifiers.styleMapInterpolate3 = { name: 'ɵɵstyleMapInterpolate3', moduleName: CORE };
1935
- Identifiers.styleMapInterpolate4 = { name: 'ɵɵstyleMapInterpolate4', moduleName: CORE };
1936
- Identifiers.styleMapInterpolate5 = { name: 'ɵɵstyleMapInterpolate5', moduleName: CORE };
1937
- Identifiers.styleMapInterpolate6 = { name: 'ɵɵstyleMapInterpolate6', moduleName: CORE };
1938
- Identifiers.styleMapInterpolate7 = { name: 'ɵɵstyleMapInterpolate7', moduleName: CORE };
1939
- Identifiers.styleMapInterpolate8 = { name: 'ɵɵstyleMapInterpolate8', moduleName: CORE };
1940
- Identifiers.styleMapInterpolateV = { name: 'ɵɵstyleMapInterpolateV', moduleName: CORE };
1941
- Identifiers.classMap = { name: 'ɵɵclassMap', moduleName: CORE };
1942
- Identifiers.classMapInterpolate1 = { name: 'ɵɵclassMapInterpolate1', moduleName: CORE };
1943
- Identifiers.classMapInterpolate2 = { name: 'ɵɵclassMapInterpolate2', moduleName: CORE };
1944
- Identifiers.classMapInterpolate3 = { name: 'ɵɵclassMapInterpolate3', moduleName: CORE };
1945
- Identifiers.classMapInterpolate4 = { name: 'ɵɵclassMapInterpolate4', moduleName: CORE };
1946
- Identifiers.classMapInterpolate5 = { name: 'ɵɵclassMapInterpolate5', moduleName: CORE };
1947
- Identifiers.classMapInterpolate6 = { name: 'ɵɵclassMapInterpolate6', moduleName: CORE };
1948
- Identifiers.classMapInterpolate7 = { name: 'ɵɵclassMapInterpolate7', moduleName: CORE };
1949
- Identifiers.classMapInterpolate8 = { name: 'ɵɵclassMapInterpolate8', moduleName: CORE };
1950
- Identifiers.classMapInterpolateV = { name: 'ɵɵclassMapInterpolateV', moduleName: CORE };
1951
- Identifiers.styleProp = { name: 'ɵɵstyleProp', moduleName: CORE };
1952
- Identifiers.stylePropInterpolate1 = { name: 'ɵɵstylePropInterpolate1', moduleName: CORE };
1953
- Identifiers.stylePropInterpolate2 = { name: 'ɵɵstylePropInterpolate2', moduleName: CORE };
1954
- Identifiers.stylePropInterpolate3 = { name: 'ɵɵstylePropInterpolate3', moduleName: CORE };
1955
- Identifiers.stylePropInterpolate4 = { name: 'ɵɵstylePropInterpolate4', moduleName: CORE };
1956
- Identifiers.stylePropInterpolate5 = { name: 'ɵɵstylePropInterpolate5', moduleName: CORE };
1957
- Identifiers.stylePropInterpolate6 = { name: 'ɵɵstylePropInterpolate6', moduleName: CORE };
1958
- Identifiers.stylePropInterpolate7 = { name: 'ɵɵstylePropInterpolate7', moduleName: CORE };
1959
- Identifiers.stylePropInterpolate8 = { name: 'ɵɵstylePropInterpolate8', moduleName: CORE };
1960
- Identifiers.stylePropInterpolateV = { name: 'ɵɵstylePropInterpolateV', moduleName: CORE };
1961
- Identifiers.nextContext = { name: 'ɵɵnextContext', moduleName: CORE };
1962
- Identifiers.resetView = { name: 'ɵɵresetView', moduleName: CORE };
1963
- Identifiers.templateCreate = { name: 'ɵɵtemplate', moduleName: CORE };
1964
- Identifiers.text = { name: 'ɵɵtext', moduleName: CORE };
1965
- Identifiers.enableBindings = { name: 'ɵɵenableBindings', moduleName: CORE };
1966
- Identifiers.disableBindings = { name: 'ɵɵdisableBindings', moduleName: CORE };
1967
- Identifiers.getCurrentView = { name: 'ɵɵgetCurrentView', moduleName: CORE };
1968
- Identifiers.textInterpolate = { name: 'ɵɵtextInterpolate', moduleName: CORE };
1969
- Identifiers.textInterpolate1 = { name: 'ɵɵtextInterpolate1', moduleName: CORE };
1970
- Identifiers.textInterpolate2 = { name: 'ɵɵtextInterpolate2', moduleName: CORE };
1971
- Identifiers.textInterpolate3 = { name: 'ɵɵtextInterpolate3', moduleName: CORE };
1972
- Identifiers.textInterpolate4 = { name: 'ɵɵtextInterpolate4', moduleName: CORE };
1973
- Identifiers.textInterpolate5 = { name: 'ɵɵtextInterpolate5', moduleName: CORE };
1974
- Identifiers.textInterpolate6 = { name: 'ɵɵtextInterpolate6', moduleName: CORE };
1975
- Identifiers.textInterpolate7 = { name: 'ɵɵtextInterpolate7', moduleName: CORE };
1976
- Identifiers.textInterpolate8 = { name: 'ɵɵtextInterpolate8', moduleName: CORE };
1977
- Identifiers.textInterpolateV = { name: 'ɵɵtextInterpolateV', moduleName: CORE };
1978
- Identifiers.restoreView = { name: 'ɵɵrestoreView', moduleName: CORE };
1979
- Identifiers.pureFunction0 = { name: 'ɵɵpureFunction0', moduleName: CORE };
1980
- Identifiers.pureFunction1 = { name: 'ɵɵpureFunction1', moduleName: CORE };
1981
- Identifiers.pureFunction2 = { name: 'ɵɵpureFunction2', moduleName: CORE };
1982
- Identifiers.pureFunction3 = { name: 'ɵɵpureFunction3', moduleName: CORE };
1983
- Identifiers.pureFunction4 = { name: 'ɵɵpureFunction4', moduleName: CORE };
1984
- Identifiers.pureFunction5 = { name: 'ɵɵpureFunction5', moduleName: CORE };
1985
- Identifiers.pureFunction6 = { name: 'ɵɵpureFunction6', moduleName: CORE };
1986
- Identifiers.pureFunction7 = { name: 'ɵɵpureFunction7', moduleName: CORE };
1987
- Identifiers.pureFunction8 = { name: 'ɵɵpureFunction8', moduleName: CORE };
1988
- Identifiers.pureFunctionV = { name: 'ɵɵpureFunctionV', moduleName: CORE };
1989
- Identifiers.pipeBind1 = { name: 'ɵɵpipeBind1', moduleName: CORE };
1990
- Identifiers.pipeBind2 = { name: 'ɵɵpipeBind2', moduleName: CORE };
1991
- Identifiers.pipeBind3 = { name: 'ɵɵpipeBind3', moduleName: CORE };
1992
- Identifiers.pipeBind4 = { name: 'ɵɵpipeBind4', moduleName: CORE };
1993
- Identifiers.pipeBindV = { name: 'ɵɵpipeBindV', moduleName: CORE };
1994
- Identifiers.hostProperty = { name: 'ɵɵhostProperty', moduleName: CORE };
1995
- Identifiers.property = { name: 'ɵɵproperty', moduleName: CORE };
1996
- Identifiers.propertyInterpolate = { name: 'ɵɵpropertyInterpolate', moduleName: CORE };
1997
- Identifiers.propertyInterpolate1 = { name: 'ɵɵpropertyInterpolate1', moduleName: CORE };
1998
- Identifiers.propertyInterpolate2 = { name: 'ɵɵpropertyInterpolate2', moduleName: CORE };
1999
- Identifiers.propertyInterpolate3 = { name: 'ɵɵpropertyInterpolate3', moduleName: CORE };
2000
- Identifiers.propertyInterpolate4 = { name: 'ɵɵpropertyInterpolate4', moduleName: CORE };
2001
- Identifiers.propertyInterpolate5 = { name: 'ɵɵpropertyInterpolate5', moduleName: CORE };
2002
- Identifiers.propertyInterpolate6 = { name: 'ɵɵpropertyInterpolate6', moduleName: CORE };
2003
- Identifiers.propertyInterpolate7 = { name: 'ɵɵpropertyInterpolate7', moduleName: CORE };
2004
- Identifiers.propertyInterpolate8 = { name: 'ɵɵpropertyInterpolate8', moduleName: CORE };
2005
- Identifiers.propertyInterpolateV = { name: 'ɵɵpropertyInterpolateV', moduleName: CORE };
2006
- Identifiers.i18n = { name: 'ɵɵi18n', moduleName: CORE };
2007
- Identifiers.i18nAttributes = { name: 'ɵɵi18nAttributes', moduleName: CORE };
2008
- Identifiers.i18nExp = { name: 'ɵɵi18nExp', moduleName: CORE };
2009
- Identifiers.i18nStart = { name: 'ɵɵi18nStart', moduleName: CORE };
2010
- Identifiers.i18nEnd = { name: 'ɵɵi18nEnd', moduleName: CORE };
2011
- Identifiers.i18nApply = { name: 'ɵɵi18nApply', moduleName: CORE };
2012
- Identifiers.i18nPostprocess = { name: 'ɵɵi18nPostprocess', moduleName: CORE };
2013
- Identifiers.pipe = { name: 'ɵɵpipe', moduleName: CORE };
2014
- Identifiers.projection = { name: 'ɵɵprojection', moduleName: CORE };
2015
- Identifiers.projectionDef = { name: 'ɵɵprojectionDef', moduleName: CORE };
2016
- Identifiers.reference = { name: 'ɵɵreference', moduleName: CORE };
2017
- Identifiers.inject = { name: 'ɵɵinject', moduleName: CORE };
2018
- Identifiers.injectAttribute = { name: 'ɵɵinjectAttribute', moduleName: CORE };
2019
- Identifiers.directiveInject = { name: 'ɵɵdirectiveInject', moduleName: CORE };
2020
- Identifiers.invalidFactory = { name: 'ɵɵinvalidFactory', moduleName: CORE };
2021
- Identifiers.invalidFactoryDep = { name: 'ɵɵinvalidFactoryDep', moduleName: CORE };
2022
- Identifiers.templateRefExtractor = { name: 'ɵɵtemplateRefExtractor', moduleName: CORE };
2023
- Identifiers.forwardRef = { name: 'forwardRef', moduleName: CORE };
2024
- Identifiers.resolveForwardRef = { name: 'resolveForwardRef', moduleName: CORE };
2025
- Identifiers.ɵɵdefineInjectable = { name: 'ɵɵdefineInjectable', moduleName: CORE };
2026
- Identifiers.declareInjectable = { name: 'ɵɵngDeclareInjectable', moduleName: CORE };
2027
- Identifiers.InjectableDeclaration = { name: 'ɵɵInjectableDeclaration', moduleName: CORE };
2028
- Identifiers.resolveWindow = { name: 'ɵɵresolveWindow', moduleName: CORE };
2029
- Identifiers.resolveDocument = { name: 'ɵɵresolveDocument', moduleName: CORE };
2030
- Identifiers.resolveBody = { name: 'ɵɵresolveBody', moduleName: CORE };
2031
- Identifiers.defineComponent = { name: 'ɵɵdefineComponent', moduleName: CORE };
2032
- Identifiers.declareComponent = { name: 'ɵɵngDeclareComponent', moduleName: CORE };
2033
- Identifiers.setComponentScope = { name: 'ɵɵsetComponentScope', moduleName: CORE };
2034
- Identifiers.ChangeDetectionStrategy = {
2035
- name: 'ChangeDetectionStrategy',
2036
- moduleName: CORE,
2037
- };
2038
- Identifiers.ViewEncapsulation = {
2039
- name: 'ViewEncapsulation',
2040
- moduleName: CORE,
2041
- };
2042
- Identifiers.ComponentDeclaration = {
2043
- name: 'ɵɵComponentDeclaration',
2044
- moduleName: CORE,
2045
- };
2046
- Identifiers.FactoryDeclaration = {
2047
- name: 'ɵɵFactoryDeclaration',
2048
- moduleName: CORE,
2049
- };
2050
- Identifiers.declareFactory = { name: 'ɵɵngDeclareFactory', moduleName: CORE };
2051
- Identifiers.FactoryTarget = { name: 'ɵɵFactoryTarget', moduleName: CORE };
2052
- Identifiers.defineDirective = { name: 'ɵɵdefineDirective', moduleName: CORE };
2053
- Identifiers.declareDirective = { name: 'ɵɵngDeclareDirective', moduleName: CORE };
2054
- Identifiers.DirectiveDeclaration = {
2055
- name: 'ɵɵDirectiveDeclaration',
2056
- moduleName: CORE,
2057
- };
2058
- Identifiers.InjectorDef = { name: 'ɵɵInjectorDef', moduleName: CORE };
2059
- Identifiers.InjectorDeclaration = { name: 'ɵɵInjectorDeclaration', moduleName: CORE };
2060
- Identifiers.defineInjector = { name: 'ɵɵdefineInjector', moduleName: CORE };
2061
- Identifiers.declareInjector = { name: 'ɵɵngDeclareInjector', moduleName: CORE };
2062
- Identifiers.NgModuleDeclaration = {
2063
- name: 'ɵɵNgModuleDeclaration',
2064
- moduleName: CORE,
2065
- };
2066
- Identifiers.ModuleWithProviders = {
2067
- name: 'ModuleWithProviders',
2068
- moduleName: CORE,
2069
- };
2070
- Identifiers.defineNgModule = { name: 'ɵɵdefineNgModule', moduleName: CORE };
2071
- Identifiers.declareNgModule = { name: 'ɵɵngDeclareNgModule', moduleName: CORE };
2072
- Identifiers.setNgModuleScope = { name: 'ɵɵsetNgModuleScope', moduleName: CORE };
2073
- Identifiers.registerNgModuleType = { name: 'ɵɵregisterNgModuleType', moduleName: CORE };
2074
- Identifiers.PipeDeclaration = { name: 'ɵɵPipeDeclaration', moduleName: CORE };
2075
- Identifiers.definePipe = { name: 'ɵɵdefinePipe', moduleName: CORE };
2076
- Identifiers.declarePipe = { name: 'ɵɵngDeclarePipe', moduleName: CORE };
2077
- Identifiers.declareClassMetadata = { name: 'ɵɵngDeclareClassMetadata', moduleName: CORE };
2078
- Identifiers.setClassMetadata = { name: 'ɵsetClassMetadata', moduleName: CORE };
2079
- Identifiers.queryRefresh = { name: 'ɵɵqueryRefresh', moduleName: CORE };
2080
- Identifiers.viewQuery = { name: 'ɵɵviewQuery', moduleName: CORE };
2081
- Identifiers.loadQuery = { name: 'ɵɵloadQuery', moduleName: CORE };
2082
- Identifiers.contentQuery = { name: 'ɵɵcontentQuery', moduleName: CORE };
2083
- Identifiers.NgOnChangesFeature = { name: 'ɵɵNgOnChangesFeature', moduleName: CORE };
2084
- Identifiers.InheritDefinitionFeature = { name: 'ɵɵInheritDefinitionFeature', moduleName: CORE };
2085
- Identifiers.CopyDefinitionFeature = { name: 'ɵɵCopyDefinitionFeature', moduleName: CORE };
2086
- Identifiers.StandaloneFeature = { name: 'ɵɵStandaloneFeature', moduleName: CORE };
2087
- Identifiers.ProvidersFeature = { name: 'ɵɵProvidersFeature', moduleName: CORE };
2088
- Identifiers.HostDirectivesFeature = { name: 'ɵɵHostDirectivesFeature', moduleName: CORE };
2089
- Identifiers.listener = { name: 'ɵɵlistener', moduleName: CORE };
2090
- Identifiers.getInheritedFactory = {
2091
- name: 'ɵɵgetInheritedFactory',
2092
- moduleName: CORE,
2093
- };
2094
- // sanitization-related functions
2095
- Identifiers.sanitizeHtml = { name: 'ɵɵsanitizeHtml', moduleName: CORE };
2096
- Identifiers.sanitizeStyle = { name: 'ɵɵsanitizeStyle', moduleName: CORE };
2097
- Identifiers.sanitizeResourceUrl = { name: 'ɵɵsanitizeResourceUrl', moduleName: CORE };
2098
- Identifiers.sanitizeScript = { name: 'ɵɵsanitizeScript', moduleName: CORE };
2099
- Identifiers.sanitizeUrl = { name: 'ɵɵsanitizeUrl', moduleName: CORE };
2100
- Identifiers.sanitizeUrlOrResourceUrl = { name: 'ɵɵsanitizeUrlOrResourceUrl', moduleName: CORE };
2101
- Identifiers.trustConstantHtml = { name: 'ɵɵtrustConstantHtml', moduleName: CORE };
2102
- Identifiers.trustConstantResourceUrl = { name: 'ɵɵtrustConstantResourceUrl', moduleName: CORE };
2103
- Identifiers.validateIframeAttribute = { name: 'ɵɵvalidateIframeAttribute', moduleName: CORE };
2104
2206
 
2105
2207
  const DASH_CASE_REGEXP = /-+([a-z0-9])/g;
2106
2208
  function dashCaseToCamelCase(input) {
@@ -2186,13 +2288,7 @@ class Version {
2186
2288
  this.patch = splits.slice(2).join('.');
2187
2289
  }
2188
2290
  }
2189
- // Check `global` first, because in Node tests both `global` and `window` may be defined and our
2190
- // `_global` variable should point to the NodeJS `global` in that case. Note: Typeof/Instanceof
2191
- // checks are considered side-effects in Terser. We explicitly mark this as side-effect free:
2192
- // https://github.com/terser/terser/issues/250.
2193
- const _global = ( /* @__PURE__ */(() => (typeof global !== 'undefined' && global) || (typeof window !== 'undefined' && window) ||
2194
- (typeof self !== 'undefined' && typeof WorkerGlobalScope !== 'undefined' &&
2195
- self instanceof WorkerGlobalScope && self))());
2291
+ const _global = globalThis;
2196
2292
  /**
2197
2293
  * Partitions a given array into 2 arrays, based on a boolean value returned by the condition
2198
2294
  * function.
@@ -2667,6 +2763,9 @@ class AbstractEmitterVisitor {
2667
2763
  ctx.print(ast, `)`);
2668
2764
  return null;
2669
2765
  }
2766
+ visitDynamicImportExpr(ast, ctx) {
2767
+ ctx.print(ast, `import(${ast.url})`);
2768
+ }
2670
2769
  visitNotExpr(ast, ctx) {
2671
2770
  ctx.print(ast, '!');
2672
2771
  ast.condition.visitExpression(this, ctx);
@@ -2954,7 +3053,7 @@ function compileFactoryFunction(meta) {
2954
3053
  // delegated factory (which is used to create the current type) then this is only the type-to-
2955
3054
  // create parameter (t).
2956
3055
  const typeForCtor = !isDelegatedFactoryMetadata(meta) ?
2957
- new BinaryOperatorExpr(BinaryOperator.Or, t, meta.internalType) :
3056
+ new BinaryOperatorExpr(BinaryOperator.Or, t, meta.type.value) :
2958
3057
  t;
2959
3058
  let ctorExpr = null;
2960
3059
  if (meta.deps !== null) {
@@ -3001,7 +3100,7 @@ function compileFactoryFunction(meta) {
3001
3100
  }
3002
3101
  else if (baseFactoryVar !== null) {
3003
3102
  // This factory uses a base factory, so call `ɵɵgetInheritedFactory()` to compute it.
3004
- const getInheritedFactoryCall = importExpr(Identifiers.getInheritedFactory).callFn([meta.internalType]);
3103
+ const getInheritedFactoryCall = importExpr(Identifiers.getInheritedFactory).callFn([meta.type.value]);
3005
3104
  // Memoize the base factoryFn: `baseFactory || (baseFactory = ɵɵgetInheritedFactory(...))`
3006
3105
  const baseFactory = new BinaryOperatorExpr(BinaryOperator.Or, baseFactoryVar, baseFactoryVar.set(getInheritedFactoryCall));
3007
3106
  body.push(new ReturnStatement(baseFactory.callFn([typeForCtor])));
@@ -3237,6 +3336,96 @@ class Element$1 {
3237
3336
  return visitor.visitElement(this);
3238
3337
  }
3239
3338
  }
3339
+ class DeferredTrigger {
3340
+ constructor(sourceSpan) {
3341
+ this.sourceSpan = sourceSpan;
3342
+ }
3343
+ visit(visitor) {
3344
+ return visitor.visitDeferredTrigger(this);
3345
+ }
3346
+ }
3347
+ class BoundDeferredTrigger extends DeferredTrigger {
3348
+ constructor(value, sourceSpan) {
3349
+ super(sourceSpan);
3350
+ this.value = value;
3351
+ }
3352
+ }
3353
+ class IdleDeferredTrigger extends DeferredTrigger {
3354
+ }
3355
+ class ImmediateDeferredTrigger extends DeferredTrigger {
3356
+ }
3357
+ class HoverDeferredTrigger extends DeferredTrigger {
3358
+ }
3359
+ class TimerDeferredTrigger extends DeferredTrigger {
3360
+ constructor(delay, sourceSpan) {
3361
+ super(sourceSpan);
3362
+ this.delay = delay;
3363
+ }
3364
+ }
3365
+ class InteractionDeferredTrigger extends DeferredTrigger {
3366
+ constructor(reference, sourceSpan) {
3367
+ super(sourceSpan);
3368
+ this.reference = reference;
3369
+ }
3370
+ }
3371
+ class ViewportDeferredTrigger extends DeferredTrigger {
3372
+ constructor(reference, sourceSpan) {
3373
+ super(sourceSpan);
3374
+ this.reference = reference;
3375
+ }
3376
+ }
3377
+ class DeferredBlockPlaceholder {
3378
+ constructor(children, minimumTime, sourceSpan, startSourceSpan, endSourceSpan) {
3379
+ this.children = children;
3380
+ this.minimumTime = minimumTime;
3381
+ this.sourceSpan = sourceSpan;
3382
+ this.startSourceSpan = startSourceSpan;
3383
+ this.endSourceSpan = endSourceSpan;
3384
+ }
3385
+ visit(visitor) {
3386
+ return visitor.visitDeferredBlockPlaceholder(this);
3387
+ }
3388
+ }
3389
+ class DeferredBlockLoading {
3390
+ constructor(children, afterTime, minimumTime, sourceSpan, startSourceSpan, endSourceSpan) {
3391
+ this.children = children;
3392
+ this.afterTime = afterTime;
3393
+ this.minimumTime = minimumTime;
3394
+ this.sourceSpan = sourceSpan;
3395
+ this.startSourceSpan = startSourceSpan;
3396
+ this.endSourceSpan = endSourceSpan;
3397
+ }
3398
+ visit(visitor) {
3399
+ return visitor.visitDeferredBlockLoading(this);
3400
+ }
3401
+ }
3402
+ class DeferredBlockError {
3403
+ constructor(children, sourceSpan, startSourceSpan, endSourceSpan) {
3404
+ this.children = children;
3405
+ this.sourceSpan = sourceSpan;
3406
+ this.startSourceSpan = startSourceSpan;
3407
+ this.endSourceSpan = endSourceSpan;
3408
+ }
3409
+ visit(visitor) {
3410
+ return visitor.visitDeferredBlockError(this);
3411
+ }
3412
+ }
3413
+ class DeferredBlock {
3414
+ constructor(children, triggers, prefetchTriggers, placeholder, loading, error, sourceSpan, startSourceSpan, endSourceSpan) {
3415
+ this.children = children;
3416
+ this.triggers = triggers;
3417
+ this.prefetchTriggers = prefetchTriggers;
3418
+ this.placeholder = placeholder;
3419
+ this.loading = loading;
3420
+ this.error = error;
3421
+ this.sourceSpan = sourceSpan;
3422
+ this.startSourceSpan = startSourceSpan;
3423
+ this.endSourceSpan = endSourceSpan;
3424
+ }
3425
+ visit(visitor) {
3426
+ return visitor.visitDeferredBlock(this);
3427
+ }
3428
+ }
3240
3429
  class Template {
3241
3430
  constructor(
3242
3431
  // tagName is the name of the container element, if applicable.
@@ -3342,9 +3531,9 @@ class Message {
3342
3531
  this.meaning = meaning;
3343
3532
  this.description = description;
3344
3533
  this.customId = customId;
3345
- this.id = this.customId;
3346
3534
  /** The ids to use if there are no custom id and if `i18nLegacyMessageIdFormat` is not empty */
3347
3535
  this.legacyIds = [];
3536
+ this.id = this.customId;
3348
3537
  this.messageString = serializeMessage(this.nodes);
3349
3538
  if (nodes.length) {
3350
3539
  this.sources = [{
@@ -3380,11 +3569,12 @@ class Container {
3380
3569
  }
3381
3570
  }
3382
3571
  class Icu {
3383
- constructor(expression, type, cases, sourceSpan) {
3572
+ constructor(expression, type, cases, sourceSpan, expressionPlaceholder) {
3384
3573
  this.expression = expression;
3385
3574
  this.type = type;
3386
3575
  this.cases = cases;
3387
3576
  this.sourceSpan = sourceSpan;
3577
+ this.expressionPlaceholder = expressionPlaceholder;
3388
3578
  }
3389
3579
  visit(visitor, context) {
3390
3580
  return visitor.visitIcu(this, context);
@@ -3719,37 +3909,44 @@ function asLiteral(value) {
3719
3909
  }
3720
3910
  return literal(value, INFERRED_TYPE);
3721
3911
  }
3722
- function conditionallyCreateMapObjectLiteral(keys, keepDeclared) {
3723
- if (Object.getOwnPropertyNames(keys).length > 0) {
3724
- return mapToExpression(keys, keepDeclared);
3912
+ function conditionallyCreateDirectiveBindingLiteral(map, keepDeclared) {
3913
+ const keys = Object.getOwnPropertyNames(map);
3914
+ if (keys.length === 0) {
3915
+ return null;
3725
3916
  }
3726
- return null;
3727
- }
3728
- function mapToExpression(map, keepDeclared) {
3729
- return literalMap(Object.getOwnPropertyNames(map).map(key => {
3730
- // canonical syntax: `dirProp: publicProp`
3917
+ return literalMap(keys.map(key => {
3731
3918
  const value = map[key];
3732
3919
  let declaredName;
3733
3920
  let publicName;
3734
3921
  let minifiedName;
3735
- let needsDeclaredName;
3736
- if (Array.isArray(value)) {
3737
- [publicName, declaredName] = value;
3922
+ let expressionValue;
3923
+ if (typeof value === 'string') {
3924
+ // canonical syntax: `dirProp: publicProp`
3925
+ declaredName = key;
3738
3926
  minifiedName = key;
3739
- needsDeclaredName = publicName !== declaredName;
3927
+ publicName = value;
3928
+ expressionValue = asLiteral(publicName);
3740
3929
  }
3741
3930
  else {
3742
- minifiedName = declaredName = key;
3743
- publicName = value;
3744
- needsDeclaredName = false;
3931
+ minifiedName = key;
3932
+ declaredName = value.classPropertyName;
3933
+ publicName = value.bindingPropertyName;
3934
+ if (keepDeclared && (publicName !== declaredName || value.transformFunction != null)) {
3935
+ const expressionKeys = [asLiteral(publicName), asLiteral(declaredName)];
3936
+ if (value.transformFunction != null) {
3937
+ expressionKeys.push(value.transformFunction);
3938
+ }
3939
+ expressionValue = literalArr(expressionKeys);
3940
+ }
3941
+ else {
3942
+ expressionValue = asLiteral(publicName);
3943
+ }
3745
3944
  }
3746
3945
  return {
3747
3946
  key: minifiedName,
3748
3947
  // put quotes around keys that contain potentially unsafe characters
3749
3948
  quoted: UNSAFE_OBJECT_KEY_NAME_REGEXP.test(minifiedName),
3750
- value: (keepDeclared && needsDeclaredName) ?
3751
- literalArr([asLiteral(publicName), asLiteral(declaredName)]) :
3752
- asLiteral(publicName)
3949
+ value: expressionValue,
3753
3950
  };
3754
3951
  }));
3755
3952
  }
@@ -3863,7 +4060,6 @@ function compileInjectable(meta, resolveForwardRefs) {
3863
4060
  const factoryMeta = {
3864
4061
  name: meta.name,
3865
4062
  type: meta.type,
3866
- internalType: meta.internalType,
3867
4063
  typeArgumentCount: meta.typeArgumentCount,
3868
4064
  deps: [],
3869
4065
  target: FactoryTarget$1.Injectable,
@@ -3875,7 +4071,7 @@ function compileInjectable(meta, resolveForwardRefs) {
3875
4071
  //
3876
4072
  // A special case exists for useClass: Type where Type is the injectable type itself and no
3877
4073
  // deps are specified, in which case 'useClass' is effectively ignored.
3878
- const useClassOnSelf = meta.useClass.expression.isEquivalent(meta.internalType);
4074
+ const useClassOnSelf = meta.useClass.expression.isEquivalent(meta.type.value);
3879
4075
  let deps = undefined;
3880
4076
  if (meta.deps !== undefined) {
3881
4077
  deps = meta.deps;
@@ -3934,10 +4130,10 @@ function compileInjectable(meta, resolveForwardRefs) {
3934
4130
  else {
3935
4131
  result = {
3936
4132
  statements: [],
3937
- expression: delegateToFactory(meta.type.value, meta.internalType, resolveForwardRefs)
4133
+ expression: delegateToFactory(meta.type.value, meta.type.value, resolveForwardRefs)
3938
4134
  };
3939
4135
  }
3940
- const token = meta.internalType;
4136
+ const token = meta.type.value;
3941
4137
  const injectableProps = new DefinitionMap();
3942
4138
  injectableProps.set('token', token);
3943
4139
  injectableProps.set('factory', result.expression);
@@ -3956,28 +4152,28 @@ function compileInjectable(meta, resolveForwardRefs) {
3956
4152
  function createInjectableType(meta) {
3957
4153
  return new ExpressionType$1(importExpr(Identifiers.InjectableDeclaration, [typeWithParameters(meta.type.type, meta.typeArgumentCount)]));
3958
4154
  }
3959
- function delegateToFactory(type, internalType, unwrapForwardRefs) {
3960
- if (type.node === internalType.node) {
4155
+ function delegateToFactory(type, useType, unwrapForwardRefs) {
4156
+ if (type.node === useType.node) {
3961
4157
  // The types are the same, so we can simply delegate directly to the type's factory.
3962
4158
  // ```
3963
4159
  // factory: type.ɵfac
3964
4160
  // ```
3965
- return internalType.prop('ɵfac');
4161
+ return useType.prop('ɵfac');
3966
4162
  }
3967
4163
  if (!unwrapForwardRefs) {
3968
4164
  // The type is not wrapped in a `forwardRef()`, so we create a simple factory function that
3969
4165
  // accepts a sub-type as an argument.
3970
4166
  // ```
3971
- // factory: function(t) { return internalType.ɵfac(t); }
4167
+ // factory: function(t) { return useType.ɵfac(t); }
3972
4168
  // ```
3973
- return createFactoryFunction(internalType);
4169
+ return createFactoryFunction(useType);
3974
4170
  }
3975
- // The internalType is actually wrapped in a `forwardRef()` so we need to resolve that before
4171
+ // The useType is actually wrapped in a `forwardRef()` so we need to resolve that before
3976
4172
  // calling its factory.
3977
4173
  // ```
3978
4174
  // factory: function(t) { return core.resolveForwardRef(type).ɵfac(t); }
3979
4175
  // ```
3980
- const unwrappedType = importExpr(Identifiers.resolveForwardRef).callFn([internalType]);
4176
+ const unwrappedType = importExpr(Identifiers.resolveForwardRef).callFn([useType]);
3981
4177
  return createFactoryFunction(unwrappedType);
3982
4178
  }
3983
4179
  function createFactoryFunction(type) {
@@ -4385,45 +4581,6 @@ class AbstractJsEmitterVisitor extends AbstractEmitterVisitor {
4385
4581
  this.visitAllObjects(param => ctx.print(null, param.name), params, ctx, ',');
4386
4582
  }
4387
4583
  }
4388
-
4389
- /**
4390
- * @fileoverview
4391
- * A module to facilitate use of a Trusted Types policy within the JIT
4392
- * compiler. It lazily constructs the Trusted Types policy, providing helper
4393
- * utilities for promoting strings to Trusted Types. When Trusted Types are not
4394
- * available, strings are used as a fallback.
4395
- * @security All use of this module is security-sensitive and should go through
4396
- * security review.
4397
- */
4398
- /**
4399
- * The Trusted Types policy, or null if Trusted Types are not
4400
- * enabled/supported, or undefined if the policy has not been created yet.
4401
- */
4402
- let policy;
4403
- /**
4404
- * Returns the Trusted Types policy, or null if Trusted Types are not
4405
- * enabled/supported. The first call to this function will create the policy.
4406
- */
4407
- function getPolicy() {
4408
- if (policy === undefined) {
4409
- policy = null;
4410
- if (_global.trustedTypes) {
4411
- try {
4412
- policy =
4413
- _global.trustedTypes.createPolicy('angular#unsafe-jit', {
4414
- createScript: (s) => s,
4415
- });
4416
- }
4417
- catch {
4418
- // trustedTypes.createPolicy throws if called with a name that is
4419
- // already registered, even in report-only mode. Until the API changes,
4420
- // catch the error not to break the applications functionally. In such
4421
- // cases, the code will fall back to using strings.
4422
- }
4423
- }
4424
- }
4425
- return policy;
4426
- }
4427
4584
  /**
4428
4585
  * Unsafely promote a string to a TrustedScript, falling back to strings when
4429
4586
  * Trusted Types are not available.
@@ -4432,7 +4589,7 @@ function getPolicy() {
4432
4589
  * interpreted and executed as a script by a browser, e.g. when calling eval.
4433
4590
  */
4434
4591
  function trustedScriptFromString(script) {
4435
- return getPolicy()?.createScript(script) || script;
4592
+ return script;
4436
4593
  }
4437
4594
  /**
4438
4595
  * Unsafely call the Function constructor with the given string arguments.
@@ -4674,31 +4831,49 @@ var R3SelectorScopeMode;
4674
4831
  */
4675
4832
  R3SelectorScopeMode[R3SelectorScopeMode["Omit"] = 2] = "Omit";
4676
4833
  })(R3SelectorScopeMode || (R3SelectorScopeMode = {}));
4834
+ /**
4835
+ * The type of the NgModule meta data.
4836
+ * - Global: Used for full and partial compilation modes which mainly includes R3References.
4837
+ * - Local: Used for the local compilation mode which mainly includes the raw expressions as appears
4838
+ * in the NgModule decorator.
4839
+ */
4840
+ var R3NgModuleMetadataKind;
4841
+ (function (R3NgModuleMetadataKind) {
4842
+ R3NgModuleMetadataKind[R3NgModuleMetadataKind["Global"] = 0] = "Global";
4843
+ R3NgModuleMetadataKind[R3NgModuleMetadataKind["Local"] = 1] = "Local";
4844
+ })(R3NgModuleMetadataKind || (R3NgModuleMetadataKind = {}));
4677
4845
  /**
4678
4846
  * Construct an `R3NgModuleDef` for the given `R3NgModuleMetadata`.
4679
4847
  */
4680
4848
  function compileNgModule(meta) {
4681
- const { adjacentType, internalType, bootstrap, declarations, imports, exports, schemas, containsForwardDecls, selectorScopeMode, id } = meta;
4682
4849
  const statements = [];
4683
4850
  const definitionMap = new DefinitionMap();
4684
- definitionMap.set('type', internalType);
4685
- if (bootstrap.length > 0) {
4686
- definitionMap.set('bootstrap', refsToArray(bootstrap, containsForwardDecls));
4851
+ definitionMap.set('type', meta.type.value);
4852
+ // Assign bootstrap definition
4853
+ if (meta.kind === R3NgModuleMetadataKind.Global) {
4854
+ if (meta.bootstrap.length > 0) {
4855
+ definitionMap.set('bootstrap', refsToArray(meta.bootstrap, meta.containsForwardDecls));
4856
+ }
4857
+ }
4858
+ else {
4859
+ if (meta.bootstrapExpression) {
4860
+ definitionMap.set('bootstrap', meta.bootstrapExpression);
4861
+ }
4687
4862
  }
4688
- if (selectorScopeMode === R3SelectorScopeMode.Inline) {
4863
+ if (meta.selectorScopeMode === R3SelectorScopeMode.Inline) {
4689
4864
  // If requested to emit scope information inline, pass the `declarations`, `imports` and
4690
4865
  // `exports` to the `ɵɵdefineNgModule()` call directly.
4691
- if (declarations.length > 0) {
4692
- definitionMap.set('declarations', refsToArray(declarations, containsForwardDecls));
4866
+ if (meta.declarations.length > 0) {
4867
+ definitionMap.set('declarations', refsToArray(meta.declarations, meta.containsForwardDecls));
4693
4868
  }
4694
- if (imports.length > 0) {
4695
- definitionMap.set('imports', refsToArray(imports, containsForwardDecls));
4869
+ if (meta.imports.length > 0) {
4870
+ definitionMap.set('imports', refsToArray(meta.imports, meta.containsForwardDecls));
4696
4871
  }
4697
- if (exports.length > 0) {
4698
- definitionMap.set('exports', refsToArray(exports, containsForwardDecls));
4872
+ if (meta.exports.length > 0) {
4873
+ definitionMap.set('exports', refsToArray(meta.exports, meta.containsForwardDecls));
4699
4874
  }
4700
4875
  }
4701
- else if (selectorScopeMode === R3SelectorScopeMode.SideEffect) {
4876
+ else if (meta.selectorScopeMode === R3SelectorScopeMode.SideEffect) {
4702
4877
  // In this mode, scope information is not passed into `ɵɵdefineNgModule` as it
4703
4878
  // would prevent tree-shaking of the declarations, imports and exports references. Instead, it's
4704
4879
  // patched onto the NgModule definition with a `ɵɵsetNgModuleScope` call that's guarded by the
@@ -4709,14 +4884,14 @@ function compileNgModule(meta) {
4709
4884
  }
4710
4885
  }
4711
4886
  else ;
4712
- if (schemas !== null && schemas.length > 0) {
4713
- definitionMap.set('schemas', literalArr(schemas.map(ref => ref.value)));
4887
+ if (meta.schemas !== null && meta.schemas.length > 0) {
4888
+ definitionMap.set('schemas', literalArr(meta.schemas.map(ref => ref.value)));
4714
4889
  }
4715
- if (id !== null) {
4716
- definitionMap.set('id', id);
4890
+ if (meta.id !== null) {
4891
+ definitionMap.set('id', meta.id);
4717
4892
  // Generate a side-effectful call to register this NgModule by its id, as per the semantics of
4718
4893
  // NgModule ids.
4719
- statements.push(importExpr(Identifiers.registerNgModuleType).callFn([adjacentType, id]).toStmt());
4894
+ statements.push(importExpr(Identifiers.registerNgModuleType).callFn([meta.type.value, meta.id]).toStmt());
4720
4895
  }
4721
4896
  const expression = importExpr(Identifiers.defineNgModule).callFn([definitionMap.toLiteralMap()], undefined, true);
4722
4897
  const type = createNgModuleType(meta);
@@ -4749,7 +4924,11 @@ function compileNgModuleDeclarationExpression(meta) {
4749
4924
  }
4750
4925
  return importExpr(Identifiers.defineNgModule).callFn([definitionMap.toLiteralMap()]);
4751
4926
  }
4752
- function createNgModuleType({ type: moduleType, declarations, exports, imports, includeImportTypes, publicDeclarationTypes }) {
4927
+ function createNgModuleType(meta) {
4928
+ if (meta.kind === R3NgModuleMetadataKind.Local) {
4929
+ return new ExpressionType$1(meta.type.value);
4930
+ }
4931
+ const { type: moduleType, declarations, exports, imports, includeImportTypes, publicDeclarationTypes } = meta;
4753
4932
  return new ExpressionType$1(importExpr(Identifiers.NgModuleDeclaration, [
4754
4933
  new ExpressionType$1(moduleType.type),
4755
4934
  publicDeclarationTypes === null ? tupleTypeOf(declarations) :
@@ -4765,16 +4944,36 @@ function createNgModuleType({ type: moduleType, declarations, exports, imports,
4765
4944
  * symbols to become tree-shakeable.
4766
4945
  */
4767
4946
  function generateSetNgModuleScopeCall(meta) {
4768
- const { adjacentType: moduleType, declarations, imports, exports, containsForwardDecls } = meta;
4769
4947
  const scopeMap = new DefinitionMap();
4770
- if (declarations.length > 0) {
4771
- scopeMap.set('declarations', refsToArray(declarations, containsForwardDecls));
4948
+ if (meta.kind === R3NgModuleMetadataKind.Global) {
4949
+ if (meta.declarations.length > 0) {
4950
+ scopeMap.set('declarations', refsToArray(meta.declarations, meta.containsForwardDecls));
4951
+ }
4952
+ }
4953
+ else {
4954
+ if (meta.declarationsExpression) {
4955
+ scopeMap.set('declarations', meta.declarationsExpression);
4956
+ }
4957
+ }
4958
+ if (meta.kind === R3NgModuleMetadataKind.Global) {
4959
+ if (meta.imports.length > 0) {
4960
+ scopeMap.set('imports', refsToArray(meta.imports, meta.containsForwardDecls));
4961
+ }
4772
4962
  }
4773
- if (imports.length > 0) {
4774
- scopeMap.set('imports', refsToArray(imports, containsForwardDecls));
4963
+ else {
4964
+ if (meta.importsExpression) {
4965
+ scopeMap.set('imports', meta.importsExpression);
4966
+ }
4967
+ }
4968
+ if (meta.kind === R3NgModuleMetadataKind.Global) {
4969
+ if (meta.exports.length > 0) {
4970
+ scopeMap.set('exports', refsToArray(meta.exports, meta.containsForwardDecls));
4971
+ }
4775
4972
  }
4776
- if (exports.length > 0) {
4777
- scopeMap.set('exports', refsToArray(exports, containsForwardDecls));
4973
+ else {
4974
+ if (meta.exportsExpression) {
4975
+ scopeMap.set('exports', meta.exportsExpression);
4976
+ }
4778
4977
  }
4779
4978
  if (Object.keys(scopeMap.values).length === 0) {
4780
4979
  return null;
@@ -4782,7 +4981,7 @@ function generateSetNgModuleScopeCall(meta) {
4782
4981
  // setNgModuleScope(...)
4783
4982
  const fnCall = new InvokeFunctionExpr(
4784
4983
  /* fn */ importExpr(Identifiers.setNgModuleScope),
4785
- /* args */ [moduleType, scopeMap.toLiteralMap()]);
4984
+ /* args */ [meta.type.value, scopeMap.toLiteralMap()]);
4786
4985
  // (ngJitMode guard) && setNgModuleScope(...)
4787
4986
  const guardedCall = jitOnlyGuardedExpression(fnCall);
4788
4987
  // function() { (ngJitMode guard) && setNgModuleScope(...); }
@@ -4870,7 +5069,7 @@ class ASTWithName extends AST {
4870
5069
  this.nameSpan = nameSpan;
4871
5070
  }
4872
5071
  }
4873
- class EmptyExpr extends AST {
5072
+ class EmptyExpr$1 extends AST {
4874
5073
  visit(visitor, context = null) {
4875
5074
  // do nothing
4876
5075
  }
@@ -5017,7 +5216,7 @@ class LiteralMap extends AST {
5017
5216
  return visitor.visitLiteralMap(this, context);
5018
5217
  }
5019
5218
  }
5020
- class Interpolation extends AST {
5219
+ class Interpolation$1 extends AST {
5021
5220
  constructor(span, sourceSpan, strings, expressions) {
5022
5221
  super(span, sourceSpan);
5023
5222
  this.strings = strings;
@@ -5264,7 +5463,7 @@ class AstTransformer {
5264
5463
  return ast;
5265
5464
  }
5266
5465
  visitInterpolation(ast, context) {
5267
- return new Interpolation(ast.span, ast.sourceSpan, ast.strings, this.visitAll(ast.expressions));
5466
+ return new Interpolation$1(ast.span, ast.sourceSpan, ast.strings, this.visitAll(ast.expressions));
5268
5467
  }
5269
5468
  visitLiteralPrimitive(ast, context) {
5270
5469
  return new LiteralPrimitive(ast.span, ast.sourceSpan, ast.value);
@@ -5347,7 +5546,7 @@ class AstMemoryEfficientTransformer {
5347
5546
  visitInterpolation(ast, context) {
5348
5547
  const expressions = this.visitAll(ast.expressions);
5349
5548
  if (expressions !== ast.expressions)
5350
- return new Interpolation(ast.span, ast.sourceSpan, ast.strings, expressions);
5549
+ return new Interpolation$1(ast.span, ast.sourceSpan, ast.strings, expressions);
5351
5550
  return ast;
5352
5551
  }
5353
5552
  visitLiteralPrimitive(ast, context) {
@@ -5560,8 +5759,8 @@ class BoundElementProperty {
5560
5759
  }
5561
5760
 
5562
5761
  class EventHandlerVars {
5762
+ static { this.event = variable('$event'); }
5563
5763
  }
5564
- EventHandlerVars.event = variable('$event');
5565
5764
  /**
5566
5765
  * Converts the given expression AST into an executable output AST, assuming the expression is
5567
5766
  * used in an action binding (e.g. an event handler).
@@ -6285,6 +6484,7 @@ class InterpolationExpression extends Expression {
6285
6484
  this.isConstant = unsupported;
6286
6485
  this.isEquivalent = unsupported;
6287
6486
  this.visitExpression = unsupported;
6487
+ this.clone = unsupported;
6288
6488
  }
6289
6489
  }
6290
6490
  class DefaultLocalResolver {
@@ -6302,7 +6502,7 @@ class DefaultLocalResolver {
6302
6502
  }
6303
6503
  class BuiltinFunctionCall extends Call {
6304
6504
  constructor(span, sourceSpan, args, converter) {
6305
- super(span, sourceSpan, new EmptyExpr(span, sourceSpan), args, null);
6505
+ super(span, sourceSpan, new EmptyExpr$1(span, sourceSpan), args, null);
6306
6506
  this.converter = converter;
6307
6507
  }
6308
6508
  }
@@ -6539,11 +6739,28 @@ class ShadowCss {
6539
6739
  * The hostSelector is the attribute added to the host itself.
6540
6740
  */
6541
6741
  shimCssText(cssText, selector, hostSelector = '') {
6542
- const commentsWithHash = extractCommentsWithHash(cssText);
6543
- cssText = stripComments(cssText);
6742
+ // **NOTE**: Do not strip comments as this will cause component sourcemaps to break
6743
+ // due to shift in lines.
6744
+ // Collect comments and replace them with a placeholder, this is done to avoid complicating
6745
+ // the rule parsing RegExp and keep it safer.
6746
+ const comments = [];
6747
+ cssText = cssText.replace(_commentRe, (m) => {
6748
+ if (m.match(_commentWithHashRe)) {
6749
+ comments.push(m);
6750
+ }
6751
+ else {
6752
+ // Replace non hash comments with empty lines.
6753
+ // This is done so that we do not leak any senstive data in comments.
6754
+ const newLinesMatches = m.match(_newLinesRe);
6755
+ comments.push((newLinesMatches?.join('') ?? '') + '\n');
6756
+ }
6757
+ return COMMENT_PLACEHOLDER;
6758
+ });
6544
6759
  cssText = this._insertDirectives(cssText);
6545
6760
  const scopedCssText = this._scopeCssText(cssText, selector, hostSelector);
6546
- return [scopedCssText, ...commentsWithHash].join('\n');
6761
+ // Add back comments at the original position.
6762
+ let commentIdx = 0;
6763
+ return scopedCssText.replace(_commentWithHashPlaceHolderRe, () => comments[commentIdx++]);
6547
6764
  }
6548
6765
  _insertDirectives(cssText) {
6549
6766
  cssText = this._insertPolyfillDirectivesInCssText(cssText);
@@ -6784,7 +7001,7 @@ class ShadowCss {
6784
7001
  return cssText.replace(_cssColonHostRe, (_, hostSelectors, otherSelectors) => {
6785
7002
  if (hostSelectors) {
6786
7003
  const convertedSelectors = [];
6787
- const hostSelectorArray = hostSelectors.split(',').map(p => p.trim());
7004
+ const hostSelectorArray = hostSelectors.split(',').map((p) => p.trim());
6788
7005
  for (const hostSelector of hostSelectorArray) {
6789
7006
  if (!hostSelector)
6790
7007
  break;
@@ -6814,7 +7031,7 @@ class ShadowCss {
6814
7031
  * .foo<scopeName> .bar { ... }
6815
7032
  */
6816
7033
  _convertColonHostContext(cssText) {
6817
- return cssText.replace(_cssColonHostContextReGlobal, selectorText => {
7034
+ return cssText.replace(_cssColonHostContextReGlobal, (selectorText) => {
6818
7035
  // We have captured a selector that contains a `:host-context` rule.
6819
7036
  // For backward compatibility `:host-context` may contain a comma separated list of selectors.
6820
7037
  // Each context selector group will contain a list of host-context selectors that must match
@@ -6826,10 +7043,10 @@ class ShadowCss {
6826
7043
  // Execute `_cssColonHostContextRe` over and over until we have extracted all the
6827
7044
  // `:host-context` selectors from this selector.
6828
7045
  let match;
6829
- while (match = _cssColonHostContextRe.exec(selectorText)) {
7046
+ while ((match = _cssColonHostContextRe.exec(selectorText))) {
6830
7047
  // `match` = [':host-context(<selectors>)<rest>', <selectors>, <rest>]
6831
7048
  // The `<selectors>` could actually be a comma separated list: `:host-context(.one, .two)`.
6832
- const newContextSelectors = (match[1] ?? '').trim().split(',').map(m => m.trim()).filter(m => m !== '');
7049
+ const newContextSelectors = (match[1] ?? '').trim().split(',').map((m) => m.trim()).filter((m) => m !== '');
6833
7050
  // We must duplicate the current selector group for each of these new selectors.
6834
7051
  // For example if the current groups are:
6835
7052
  // ```
@@ -6852,7 +7069,7 @@ class ShadowCss {
6852
7069
  repeatGroups(contextSelectorGroups, newContextSelectors.length);
6853
7070
  for (let i = 0; i < newContextSelectors.length; i++) {
6854
7071
  for (let j = 0; j < contextSelectorGroupsLength; j++) {
6855
- contextSelectorGroups[j + (i * contextSelectorGroupsLength)].push(newContextSelectors[i]);
7072
+ contextSelectorGroups[j + i * contextSelectorGroupsLength].push(newContextSelectors[i]);
6856
7073
  }
6857
7074
  }
6858
7075
  // Update the `selectorText` and see repeat to see if there are more `:host-context`s.
@@ -6862,7 +7079,7 @@ class ShadowCss {
6862
7079
  // selectors that `:host-context` can match. See `combineHostContextSelectors()` for more
6863
7080
  // info about how this is done.
6864
7081
  return contextSelectorGroups
6865
- .map(contextSelectors => combineHostContextSelectors(contextSelectors, selectorText))
7082
+ .map((contextSelectors) => combineHostContextSelectors(contextSelectors, selectorText))
6866
7083
  .join(', ');
6867
7084
  });
6868
7085
  }
@@ -6883,7 +7100,7 @@ class ShadowCss {
6883
7100
  }
6884
7101
  else if (rule.selector.startsWith('@media') || rule.selector.startsWith('@supports') ||
6885
7102
  rule.selector.startsWith('@document') || rule.selector.startsWith('@layer') ||
6886
- rule.selector.startsWith('@container')) {
7103
+ rule.selector.startsWith('@container') || rule.selector.startsWith('@scope')) {
6887
7104
  content = this._scopeSelectors(rule.content, scopeSelector, hostSelector);
6888
7105
  }
6889
7106
  else if (rule.selector.startsWith('@font-face') || rule.selector.startsWith('@page')) {
@@ -6914,7 +7131,7 @@ class ShadowCss {
6914
7131
  * ```
6915
7132
  */
6916
7133
  _stripScopingSelectors(cssText) {
6917
- return processRules(cssText, rule => {
7134
+ return processRules(cssText, (rule) => {
6918
7135
  const selector = rule.selector.replace(_shadowDeepSelectors, ' ')
6919
7136
  .replace(_polyfillHostNoCombinatorRe, ' ');
6920
7137
  return new CssRule(selector, rule.content);
@@ -6922,7 +7139,7 @@ class ShadowCss {
6922
7139
  }
6923
7140
  _scopeSelector(selector, scopeSelector, hostSelector) {
6924
7141
  return selector.split(',')
6925
- .map(part => part.trim().split(_shadowDeepSelectors))
7142
+ .map((part) => part.trim().split(_shadowDeepSelectors))
6926
7143
  .map((deepParts) => {
6927
7144
  const [shallowPart, ...otherParts] = deepParts;
6928
7145
  const applyScope = (shallowPart) => {
@@ -7105,17 +7322,14 @@ const _selectorReSuffix = '([>\\s~+[.,{:][\\s\\S]*)?$';
7105
7322
  const _polyfillHostRe = /-shadowcsshost/gim;
7106
7323
  const _colonHostRe = /:host/gim;
7107
7324
  const _colonHostContextRe = /:host-context/gim;
7325
+ const _newLinesRe = /\r?\n/g;
7108
7326
  const _commentRe = /\/\*[\s\S]*?\*\//g;
7327
+ const _commentWithHashRe = /\/\*\s*#\s*source(Mapping)?URL=/g;
7328
+ const COMMENT_PLACEHOLDER = '%COMMENT%';
7329
+ const _commentWithHashPlaceHolderRe = new RegExp(COMMENT_PLACEHOLDER, 'g');
7109
7330
  const _placeholderRe = /__ph-(\d+)__/g;
7110
- function stripComments(input) {
7111
- return input.replace(_commentRe, '');
7112
- }
7113
- const _commentWithHashRe = /\/\*\s*#\s*source(Mapping)?URL=[\s\S]+?\*\//g;
7114
- function extractCommentsWithHash(input) {
7115
- return input.match(_commentWithHashRe) || [];
7116
- }
7117
7331
  const BLOCK_PLACEHOLDER = '%BLOCK%';
7118
- const _ruleRe = /(\s*)([^;\{\}]+?)(\s*)((?:{%BLOCK%}?\s*;?)|(?:\s*;))/g;
7332
+ const _ruleRe = new RegExp(`(\\s*(?:${COMMENT_PLACEHOLDER}\\s*)*)([^;\\{\\}]+?)(\\s*)((?:{%BLOCK%}?\\s*;?)|(?:\\s*;))`, 'g');
7119
7333
  const CONTENT_PAIRS = new Map([['{', '}']]);
7120
7334
  const COMMA_IN_PLACEHOLDER = '%COMMA_IN_PLACEHOLDER%';
7121
7335
  const SEMI_IN_PLACEHOLDER = '%SEMI_IN_PLACEHOLDER%';
@@ -7324,7 +7538,6 @@ function unescapeQuotes(str, isQuoted) {
7324
7538
  *
7325
7539
  * And so on...
7326
7540
  *
7327
- * @param hostMarker the string that selects the host element.
7328
7541
  * @param contextSelectors an array of context selectors that will be combined.
7329
7542
  * @param otherSelectors the rest of the selectors that are not context selectors.
7330
7543
  */
@@ -7378,24 +7591,754 @@ function repeatGroups(groups, multiples) {
7378
7591
  }
7379
7592
  }
7380
7593
 
7594
+ var TagContentType;
7595
+ (function (TagContentType) {
7596
+ TagContentType[TagContentType["RAW_TEXT"] = 0] = "RAW_TEXT";
7597
+ TagContentType[TagContentType["ESCAPABLE_RAW_TEXT"] = 1] = "ESCAPABLE_RAW_TEXT";
7598
+ TagContentType[TagContentType["PARSABLE_DATA"] = 2] = "PARSABLE_DATA";
7599
+ })(TagContentType || (TagContentType = {}));
7600
+ function splitNsName(elementName) {
7601
+ if (elementName[0] != ':') {
7602
+ return [null, elementName];
7603
+ }
7604
+ const colonIndex = elementName.indexOf(':', 1);
7605
+ if (colonIndex === -1) {
7606
+ throw new Error(`Unsupported format "${elementName}" expecting ":namespace:name"`);
7607
+ }
7608
+ return [elementName.slice(1, colonIndex), elementName.slice(colonIndex + 1)];
7609
+ }
7610
+ // `<ng-container>` tags work the same regardless the namespace
7611
+ function isNgContainer(tagName) {
7612
+ return splitNsName(tagName)[1] === 'ng-container';
7613
+ }
7614
+ // `<ng-content>` tags work the same regardless the namespace
7615
+ function isNgContent(tagName) {
7616
+ return splitNsName(tagName)[1] === 'ng-content';
7617
+ }
7618
+ // `<ng-template>` tags work the same regardless the namespace
7619
+ function isNgTemplate(tagName) {
7620
+ return splitNsName(tagName)[1] === 'ng-template';
7621
+ }
7622
+ function getNsPrefix(fullName) {
7623
+ return fullName === null ? null : splitNsName(fullName)[0];
7624
+ }
7625
+ function mergeNsAndName(prefix, localName) {
7626
+ return prefix ? `:${prefix}:${localName}` : localName;
7627
+ }
7628
+
7381
7629
  /**
7382
- * Parses string representation of a style and converts it into object literal.
7383
- *
7384
- * @param value string representation of style as used in the `style` attribute in HTML.
7385
- * Example: `color: red; height: auto`.
7386
- * @returns An array of style property name and value pairs, e.g. `['color', 'red', 'height',
7387
- * 'auto']`
7630
+ * Enumeration of the types of attributes which can be applied to an element.
7388
7631
  */
7389
- function parse(value) {
7390
- // we use a string array here instead of a string map
7391
- // because a string-map is not guaranteed to retain the
7392
- // order of the entries whereas a string array can be
7393
- // constructed in a [key, value, key, value] format.
7394
- const styles = [];
7395
- let i = 0;
7396
- let parenDepth = 0;
7397
- let quote = 0 /* Char.QuoteNone */;
7398
- let valueStart = 0;
7632
+ var BindingKind;
7633
+ (function (BindingKind) {
7634
+ /**
7635
+ * Static attributes.
7636
+ */
7637
+ BindingKind[BindingKind["Attribute"] = 0] = "Attribute";
7638
+ /**
7639
+ * Class bindings.
7640
+ */
7641
+ BindingKind[BindingKind["ClassName"] = 1] = "ClassName";
7642
+ /**
7643
+ * Style bindings.
7644
+ */
7645
+ BindingKind[BindingKind["StyleProperty"] = 2] = "StyleProperty";
7646
+ /**
7647
+ * Dynamic property bindings.
7648
+ */
7649
+ BindingKind[BindingKind["Property"] = 3] = "Property";
7650
+ /**
7651
+ * Property or attribute bindings on a template.
7652
+ */
7653
+ BindingKind[BindingKind["Template"] = 4] = "Template";
7654
+ /**
7655
+ * Internationalized attributes.
7656
+ */
7657
+ BindingKind[BindingKind["I18n"] = 5] = "I18n";
7658
+ /**
7659
+ * TODO: Consider how Animations are handled, and if they should be a distinct BindingKind.
7660
+ */
7661
+ BindingKind[BindingKind["Animation"] = 6] = "Animation";
7662
+ })(BindingKind || (BindingKind = {}));
7663
+
7664
+ /**
7665
+ * Distinguishes different kinds of IR operations.
7666
+ *
7667
+ * Includes both creation and update operations.
7668
+ */
7669
+ var OpKind;
7670
+ (function (OpKind) {
7671
+ /**
7672
+ * A special operation type which is used to represent the beginning and end nodes of a linked
7673
+ * list of operations.
7674
+ */
7675
+ OpKind[OpKind["ListEnd"] = 0] = "ListEnd";
7676
+ /**
7677
+ * An operation which wraps an output AST statement.
7678
+ */
7679
+ OpKind[OpKind["Statement"] = 1] = "Statement";
7680
+ /**
7681
+ * An operation which declares and initializes a `SemanticVariable`.
7682
+ */
7683
+ OpKind[OpKind["Variable"] = 2] = "Variable";
7684
+ /**
7685
+ * An operation to begin rendering of an element.
7686
+ */
7687
+ OpKind[OpKind["ElementStart"] = 3] = "ElementStart";
7688
+ /**
7689
+ * An operation to render an element with no children.
7690
+ */
7691
+ OpKind[OpKind["Element"] = 4] = "Element";
7692
+ /**
7693
+ * An operation which declares an embedded view.
7694
+ */
7695
+ OpKind[OpKind["Template"] = 5] = "Template";
7696
+ /**
7697
+ * An operation to end rendering of an element previously started with `ElementStart`.
7698
+ */
7699
+ OpKind[OpKind["ElementEnd"] = 6] = "ElementEnd";
7700
+ /**
7701
+ * An operation to begin an `ng-container`.
7702
+ */
7703
+ OpKind[OpKind["ContainerStart"] = 7] = "ContainerStart";
7704
+ /**
7705
+ * An operation for an `ng-container` with no children.
7706
+ */
7707
+ OpKind[OpKind["Container"] = 8] = "Container";
7708
+ /**
7709
+ * An operation to end an `ng-container`.
7710
+ */
7711
+ OpKind[OpKind["ContainerEnd"] = 9] = "ContainerEnd";
7712
+ /**
7713
+ * An operation disable binding for subsequent elements, which are descendants of a non-bindable
7714
+ * node.
7715
+ */
7716
+ OpKind[OpKind["DisableBindings"] = 10] = "DisableBindings";
7717
+ /**
7718
+ * An operation to re-enable binding, after it was previously disabled.
7719
+ */
7720
+ OpKind[OpKind["EnableBindings"] = 11] = "EnableBindings";
7721
+ /**
7722
+ * An operation to render a text node.
7723
+ */
7724
+ OpKind[OpKind["Text"] = 12] = "Text";
7725
+ /**
7726
+ * An operation declaring an event listener for an element.
7727
+ */
7728
+ OpKind[OpKind["Listener"] = 13] = "Listener";
7729
+ /**
7730
+ * An operation to interpolate text into a text node.
7731
+ */
7732
+ OpKind[OpKind["InterpolateText"] = 14] = "InterpolateText";
7733
+ /**
7734
+ * An intermediate binding op, that has not yet been processed into an individual property,
7735
+ * attribute, style, etc.
7736
+ */
7737
+ OpKind[OpKind["Binding"] = 15] = "Binding";
7738
+ /**
7739
+ * An operation to bind an expression to a property of an element.
7740
+ */
7741
+ OpKind[OpKind["Property"] = 16] = "Property";
7742
+ /**
7743
+ * An operation to bind an expression to a style property of an element.
7744
+ */
7745
+ OpKind[OpKind["StyleProp"] = 17] = "StyleProp";
7746
+ /**
7747
+ * An operation to bind an expression to a class property of an element.
7748
+ */
7749
+ OpKind[OpKind["ClassProp"] = 18] = "ClassProp";
7750
+ /**
7751
+ * An operation to bind an expression to the styles of an element.
7752
+ */
7753
+ OpKind[OpKind["StyleMap"] = 19] = "StyleMap";
7754
+ /**
7755
+ * An operation to bind an expression to the classes of an element.
7756
+ */
7757
+ OpKind[OpKind["ClassMap"] = 20] = "ClassMap";
7758
+ /**
7759
+ * An operation to advance the runtime's implicit slot context during the update phase of a view.
7760
+ */
7761
+ OpKind[OpKind["Advance"] = 21] = "Advance";
7762
+ /**
7763
+ * An operation to instantiate a pipe.
7764
+ */
7765
+ OpKind[OpKind["Pipe"] = 22] = "Pipe";
7766
+ /**
7767
+ * An operation to associate an attribute with an element.
7768
+ */
7769
+ OpKind[OpKind["Attribute"] = 23] = "Attribute";
7770
+ /**
7771
+ * A host binding property.
7772
+ */
7773
+ OpKind[OpKind["HostProperty"] = 24] = "HostProperty";
7774
+ /**
7775
+ * A namespace change, which causes the subsequent elements to be processed as either HTML or SVG.
7776
+ */
7777
+ OpKind[OpKind["Namespace"] = 25] = "Namespace";
7778
+ // TODO: Add Host Listeners, and possibly other host ops also.
7779
+ })(OpKind || (OpKind = {}));
7780
+ /**
7781
+ * Distinguishes different kinds of IR expressions.
7782
+ */
7783
+ var ExpressionKind;
7784
+ (function (ExpressionKind) {
7785
+ /**
7786
+ * Read of a variable in a lexical scope.
7787
+ */
7788
+ ExpressionKind[ExpressionKind["LexicalRead"] = 0] = "LexicalRead";
7789
+ /**
7790
+ * A reference to the current view context.
7791
+ */
7792
+ ExpressionKind[ExpressionKind["Context"] = 1] = "Context";
7793
+ /**
7794
+ * Read of a variable declared in a `VariableOp`.
7795
+ */
7796
+ ExpressionKind[ExpressionKind["ReadVariable"] = 2] = "ReadVariable";
7797
+ /**
7798
+ * Runtime operation to navigate to the next view context in the view hierarchy.
7799
+ */
7800
+ ExpressionKind[ExpressionKind["NextContext"] = 3] = "NextContext";
7801
+ /**
7802
+ * Runtime operation to retrieve the value of a local reference.
7803
+ */
7804
+ ExpressionKind[ExpressionKind["Reference"] = 4] = "Reference";
7805
+ /**
7806
+ * Runtime operation to snapshot the current view context.
7807
+ */
7808
+ ExpressionKind[ExpressionKind["GetCurrentView"] = 5] = "GetCurrentView";
7809
+ /**
7810
+ * Runtime operation to restore a snapshotted view.
7811
+ */
7812
+ ExpressionKind[ExpressionKind["RestoreView"] = 6] = "RestoreView";
7813
+ /**
7814
+ * Runtime operation to reset the current view context after `RestoreView`.
7815
+ */
7816
+ ExpressionKind[ExpressionKind["ResetView"] = 7] = "ResetView";
7817
+ /**
7818
+ * Defines and calls a function with change-detected arguments.
7819
+ */
7820
+ ExpressionKind[ExpressionKind["PureFunctionExpr"] = 8] = "PureFunctionExpr";
7821
+ /**
7822
+ * Indicates a positional parameter to a pure function definition.
7823
+ */
7824
+ ExpressionKind[ExpressionKind["PureFunctionParameterExpr"] = 9] = "PureFunctionParameterExpr";
7825
+ /**
7826
+ * Binding to a pipe transformation.
7827
+ */
7828
+ ExpressionKind[ExpressionKind["PipeBinding"] = 10] = "PipeBinding";
7829
+ /**
7830
+ * Binding to a pipe transformation with a variable number of arguments.
7831
+ */
7832
+ ExpressionKind[ExpressionKind["PipeBindingVariadic"] = 11] = "PipeBindingVariadic";
7833
+ /*
7834
+ * A safe property read requiring expansion into a null check.
7835
+ */
7836
+ ExpressionKind[ExpressionKind["SafePropertyRead"] = 12] = "SafePropertyRead";
7837
+ /**
7838
+ * A safe keyed read requiring expansion into a null check.
7839
+ */
7840
+ ExpressionKind[ExpressionKind["SafeKeyedRead"] = 13] = "SafeKeyedRead";
7841
+ /**
7842
+ * A safe function call requiring expansion into a null check.
7843
+ */
7844
+ ExpressionKind[ExpressionKind["SafeInvokeFunction"] = 14] = "SafeInvokeFunction";
7845
+ /**
7846
+ * An intermediate expression that will be expanded from a safe read into an explicit ternary.
7847
+ */
7848
+ ExpressionKind[ExpressionKind["SafeTernaryExpr"] = 15] = "SafeTernaryExpr";
7849
+ /**
7850
+ * An empty expression that will be stipped before generating the final output.
7851
+ */
7852
+ ExpressionKind[ExpressionKind["EmptyExpr"] = 16] = "EmptyExpr";
7853
+ /*
7854
+ * An assignment to a temporary variable.
7855
+ */
7856
+ ExpressionKind[ExpressionKind["AssignTemporaryExpr"] = 17] = "AssignTemporaryExpr";
7857
+ /**
7858
+ * A reference to a temporary variable.
7859
+ */
7860
+ ExpressionKind[ExpressionKind["ReadTemporaryExpr"] = 18] = "ReadTemporaryExpr";
7861
+ /**
7862
+ * An expression representing a sanitizer function.
7863
+ */
7864
+ ExpressionKind[ExpressionKind["SanitizerExpr"] = 19] = "SanitizerExpr";
7865
+ })(ExpressionKind || (ExpressionKind = {}));
7866
+ /**
7867
+ * Distinguishes between different kinds of `SemanticVariable`s.
7868
+ */
7869
+ var SemanticVariableKind;
7870
+ (function (SemanticVariableKind) {
7871
+ /**
7872
+ * Represents the context of a particular view.
7873
+ */
7874
+ SemanticVariableKind[SemanticVariableKind["Context"] = 0] = "Context";
7875
+ /**
7876
+ * Represents an identifier declared in the lexical scope of a view.
7877
+ */
7878
+ SemanticVariableKind[SemanticVariableKind["Identifier"] = 1] = "Identifier";
7879
+ /**
7880
+ * Represents a saved state that can be used to restore a view in a listener handler function.
7881
+ */
7882
+ SemanticVariableKind[SemanticVariableKind["SavedView"] = 2] = "SavedView";
7883
+ })(SemanticVariableKind || (SemanticVariableKind = {}));
7884
+ /**
7885
+ * Whether to compile in compatibilty mode. In compatibility mode, the template pipeline will
7886
+ * attempt to match the output of `TemplateDefinitionBuilder` as exactly as possible, at the cost of
7887
+ * producing quirky or larger code in some cases.
7888
+ */
7889
+ var CompatibilityMode;
7890
+ (function (CompatibilityMode) {
7891
+ CompatibilityMode[CompatibilityMode["Normal"] = 0] = "Normal";
7892
+ CompatibilityMode[CompatibilityMode["TemplateDefinitionBuilder"] = 1] = "TemplateDefinitionBuilder";
7893
+ })(CompatibilityMode || (CompatibilityMode = {}));
7894
+ /**
7895
+ * Represents functions used to sanitize different pieces of a template.
7896
+ */
7897
+ var SanitizerFn;
7898
+ (function (SanitizerFn) {
7899
+ SanitizerFn[SanitizerFn["Html"] = 0] = "Html";
7900
+ SanitizerFn[SanitizerFn["Script"] = 1] = "Script";
7901
+ SanitizerFn[SanitizerFn["Style"] = 2] = "Style";
7902
+ SanitizerFn[SanitizerFn["Url"] = 3] = "Url";
7903
+ SanitizerFn[SanitizerFn["ResourceUrl"] = 4] = "ResourceUrl";
7904
+ SanitizerFn[SanitizerFn["IframeAttribute"] = 5] = "IframeAttribute";
7905
+ })(SanitizerFn || (SanitizerFn = {}));
7906
+ /**
7907
+ * Marker symbol for `UsesSlotIndex` trait.
7908
+ */
7909
+ const UsesSlotIndex = Symbol('UsesSlotIndex');
7910
+ /**
7911
+ * Marker symbol for `ConsumesVars` trait.
7912
+ */
7913
+ const ConsumesVarsTrait = Symbol('ConsumesVars');
7914
+ /**
7915
+ * Marker symbol for `UsesVarOffset` trait.
7916
+ */
7917
+ const UsesVarOffset = Symbol('UsesVarOffset');
7918
+ class Interpolation {
7919
+ constructor(strings, expressions) {
7920
+ this.strings = strings;
7921
+ this.expressions = expressions;
7922
+ }
7923
+ }
7924
+
7925
+ var _d, _e, _f;
7926
+ /**
7927
+ * Base type used for all logical IR expressions.
7928
+ */
7929
+ class ExpressionBase extends Expression {
7930
+ constructor(sourceSpan = null) {
7931
+ super(null, sourceSpan);
7932
+ }
7933
+ }
7934
+ class PipeBindingExpr extends ExpressionBase {
7935
+ static { _d = UsesSlotIndex, _e = ConsumesVarsTrait, _f = UsesVarOffset; }
7936
+ constructor(target, name, args) {
7937
+ super();
7938
+ this.target = target;
7939
+ this.name = name;
7940
+ this.args = args;
7941
+ this.kind = ExpressionKind.PipeBinding;
7942
+ this[_d] = true;
7943
+ this[_e] = true;
7944
+ this[_f] = true;
7945
+ this.slot = null;
7946
+ this.varOffset = null;
7947
+ }
7948
+ visitExpression(visitor, context) {
7949
+ for (const arg of this.args) {
7950
+ arg.visitExpression(visitor, context);
7951
+ }
7952
+ }
7953
+ isEquivalent() {
7954
+ return false;
7955
+ }
7956
+ isConstant() {
7957
+ return false;
7958
+ }
7959
+ transformInternalExpressions(transform, flags) {
7960
+ for (let idx = 0; idx < this.args.length; idx++) {
7961
+ this.args[idx] = transformExpressionsInExpression(this.args[idx], transform, flags);
7962
+ }
7963
+ }
7964
+ clone() {
7965
+ const r = new PipeBindingExpr(this.target, this.name, this.args.map(a => a.clone()));
7966
+ r.slot = this.slot;
7967
+ r.varOffset = this.varOffset;
7968
+ return r;
7969
+ }
7970
+ }
7971
+ class SafeInvokeFunctionExpr extends ExpressionBase {
7972
+ constructor(receiver, args) {
7973
+ super();
7974
+ this.receiver = receiver;
7975
+ this.args = args;
7976
+ this.kind = ExpressionKind.SafeInvokeFunction;
7977
+ }
7978
+ visitExpression(visitor, context) {
7979
+ this.receiver.visitExpression(visitor, context);
7980
+ for (const a of this.args) {
7981
+ a.visitExpression(visitor, context);
7982
+ }
7983
+ }
7984
+ isEquivalent() {
7985
+ return false;
7986
+ }
7987
+ isConstant() {
7988
+ return false;
7989
+ }
7990
+ transformInternalExpressions(transform, flags) {
7991
+ this.receiver = transformExpressionsInExpression(this.receiver, transform, flags);
7992
+ for (let i = 0; i < this.args.length; i++) {
7993
+ this.args[i] = transformExpressionsInExpression(this.args[i], transform, flags);
7994
+ }
7995
+ }
7996
+ clone() {
7997
+ return new SafeInvokeFunctionExpr(this.receiver.clone(), this.args.map(a => a.clone()));
7998
+ }
7999
+ }
8000
+ var VisitorContextFlag;
8001
+ (function (VisitorContextFlag) {
8002
+ VisitorContextFlag[VisitorContextFlag["None"] = 0] = "None";
8003
+ VisitorContextFlag[VisitorContextFlag["InChildOperation"] = 1] = "InChildOperation";
8004
+ })(VisitorContextFlag || (VisitorContextFlag = {}));
8005
+ /**
8006
+ * Transform all `Expression`s in the AST of `expr` with the `transform` function.
8007
+ *
8008
+ * All such operations will be replaced with the result of applying `transform`, which may be an
8009
+ * identity transformation.
8010
+ */
8011
+ function transformExpressionsInExpression(expr, transform, flags) {
8012
+ if (expr instanceof ExpressionBase) {
8013
+ expr.transformInternalExpressions(transform, flags);
8014
+ }
8015
+ else if (expr instanceof BinaryOperatorExpr) {
8016
+ expr.lhs = transformExpressionsInExpression(expr.lhs, transform, flags);
8017
+ expr.rhs = transformExpressionsInExpression(expr.rhs, transform, flags);
8018
+ }
8019
+ else if (expr instanceof ReadPropExpr) {
8020
+ expr.receiver = transformExpressionsInExpression(expr.receiver, transform, flags);
8021
+ }
8022
+ else if (expr instanceof ReadKeyExpr) {
8023
+ expr.receiver = transformExpressionsInExpression(expr.receiver, transform, flags);
8024
+ expr.index = transformExpressionsInExpression(expr.index, transform, flags);
8025
+ }
8026
+ else if (expr instanceof WritePropExpr) {
8027
+ expr.receiver = transformExpressionsInExpression(expr.receiver, transform, flags);
8028
+ expr.value = transformExpressionsInExpression(expr.value, transform, flags);
8029
+ }
8030
+ else if (expr instanceof WriteKeyExpr) {
8031
+ expr.receiver = transformExpressionsInExpression(expr.receiver, transform, flags);
8032
+ expr.index = transformExpressionsInExpression(expr.index, transform, flags);
8033
+ expr.value = transformExpressionsInExpression(expr.value, transform, flags);
8034
+ }
8035
+ else if (expr instanceof InvokeFunctionExpr) {
8036
+ expr.fn = transformExpressionsInExpression(expr.fn, transform, flags);
8037
+ for (let i = 0; i < expr.args.length; i++) {
8038
+ expr.args[i] = transformExpressionsInExpression(expr.args[i], transform, flags);
8039
+ }
8040
+ }
8041
+ else if (expr instanceof LiteralArrayExpr) {
8042
+ for (let i = 0; i < expr.entries.length; i++) {
8043
+ expr.entries[i] = transformExpressionsInExpression(expr.entries[i], transform, flags);
8044
+ }
8045
+ }
8046
+ else if (expr instanceof LiteralMapExpr) {
8047
+ for (let i = 0; i < expr.entries.length; i++) {
8048
+ expr.entries[i].value =
8049
+ transformExpressionsInExpression(expr.entries[i].value, transform, flags);
8050
+ }
8051
+ }
8052
+ else if (expr instanceof ConditionalExpr) {
8053
+ expr.condition = transformExpressionsInExpression(expr.condition, transform, flags);
8054
+ expr.trueCase = transformExpressionsInExpression(expr.trueCase, transform, flags);
8055
+ if (expr.falseCase !== null) {
8056
+ expr.falseCase = transformExpressionsInExpression(expr.falseCase, transform, flags);
8057
+ }
8058
+ }
8059
+ else if (expr instanceof ReadVarExpr || expr instanceof ExternalExpr ||
8060
+ expr instanceof LiteralExpr) ;
8061
+ else {
8062
+ throw new Error(`Unhandled expression kind: ${expr.constructor.name}`);
8063
+ }
8064
+ return transform(expr, flags);
8065
+ }
8066
+
8067
+ /**
8068
+ * A linked list of `Op` nodes of a given subtype.
8069
+ *
8070
+ * @param OpT specific subtype of `Op` nodes which this list contains.
8071
+ */
8072
+ class OpList {
8073
+ static { this.nextListId = 0; }
8074
+ constructor() {
8075
+ /**
8076
+ * Debug ID of this `OpList` instance.
8077
+ */
8078
+ this.debugListId = OpList.nextListId++;
8079
+ // OpList uses static head/tail nodes of a special `ListEnd` type.
8080
+ // This avoids the need for special casing of the first and last list
8081
+ // elements in all list operations.
8082
+ this.head = {
8083
+ kind: OpKind.ListEnd,
8084
+ next: null,
8085
+ prev: null,
8086
+ debugListId: this.debugListId,
8087
+ };
8088
+ this.tail = {
8089
+ kind: OpKind.ListEnd,
8090
+ next: null,
8091
+ prev: null,
8092
+ debugListId: this.debugListId,
8093
+ };
8094
+ // Link `head` and `tail` together at the start (list is empty).
8095
+ this.head.next = this.tail;
8096
+ this.tail.prev = this.head;
8097
+ }
8098
+ /**
8099
+ * Push a new operation to the tail of the list.
8100
+ */
8101
+ push(op) {
8102
+ OpList.assertIsNotEnd(op);
8103
+ OpList.assertIsUnowned(op);
8104
+ op.debugListId = this.debugListId;
8105
+ // The old "previous" node (which might be the head, if the list is empty).
8106
+ const oldLast = this.tail.prev;
8107
+ // Insert `op` following the old last node.
8108
+ op.prev = oldLast;
8109
+ oldLast.next = op;
8110
+ // Connect `op` with the list tail.
8111
+ op.next = this.tail;
8112
+ this.tail.prev = op;
8113
+ }
8114
+ /**
8115
+ * Prepend one or more nodes to the start of the list.
8116
+ */
8117
+ prepend(ops) {
8118
+ if (ops.length === 0) {
8119
+ return;
8120
+ }
8121
+ for (const op of ops) {
8122
+ OpList.assertIsNotEnd(op);
8123
+ OpList.assertIsUnowned(op);
8124
+ op.debugListId = this.debugListId;
8125
+ }
8126
+ const first = this.head.next;
8127
+ let prev = this.head;
8128
+ for (const op of ops) {
8129
+ prev.next = op;
8130
+ op.prev = prev;
8131
+ prev = op;
8132
+ }
8133
+ prev.next = first;
8134
+ first.prev = prev;
8135
+ }
8136
+ /**
8137
+ * `OpList` is iterable via the iteration protocol.
8138
+ *
8139
+ * It's safe to mutate the part of the list that has already been returned by the iterator, up to
8140
+ * and including the last operation returned. Mutations beyond that point _may_ be safe, but may
8141
+ * also corrupt the iteration position and should be avoided.
8142
+ */
8143
+ *[Symbol.iterator]() {
8144
+ let current = this.head.next;
8145
+ while (current !== this.tail) {
8146
+ // Guards against corruption of the iterator state by mutations to the tail of the list during
8147
+ // iteration.
8148
+ OpList.assertIsOwned(current, this.debugListId);
8149
+ const next = current.next;
8150
+ yield current;
8151
+ current = next;
8152
+ }
8153
+ }
8154
+ *reversed() {
8155
+ let current = this.tail.prev;
8156
+ while (current !== this.head) {
8157
+ OpList.assertIsOwned(current, this.debugListId);
8158
+ const prev = current.prev;
8159
+ yield current;
8160
+ current = prev;
8161
+ }
8162
+ }
8163
+ /**
8164
+ * Replace `oldOp` with `newOp` in the list.
8165
+ */
8166
+ static replace(oldOp, newOp) {
8167
+ OpList.assertIsNotEnd(oldOp);
8168
+ OpList.assertIsNotEnd(newOp);
8169
+ OpList.assertIsOwned(oldOp);
8170
+ OpList.assertIsUnowned(newOp);
8171
+ newOp.debugListId = oldOp.debugListId;
8172
+ if (oldOp.prev !== null) {
8173
+ oldOp.prev.next = newOp;
8174
+ newOp.prev = oldOp.prev;
8175
+ }
8176
+ if (oldOp.next !== null) {
8177
+ oldOp.next.prev = newOp;
8178
+ newOp.next = oldOp.next;
8179
+ }
8180
+ oldOp.debugListId = null;
8181
+ oldOp.prev = null;
8182
+ oldOp.next = null;
8183
+ }
8184
+ /**
8185
+ * Replace `oldOp` with some number of new operations in the list (which may include `oldOp`).
8186
+ */
8187
+ static replaceWithMany(oldOp, newOps) {
8188
+ if (newOps.length === 0) {
8189
+ // Replacing with an empty list -> pure removal.
8190
+ OpList.remove(oldOp);
8191
+ return;
8192
+ }
8193
+ OpList.assertIsNotEnd(oldOp);
8194
+ OpList.assertIsOwned(oldOp);
8195
+ const listId = oldOp.debugListId;
8196
+ oldOp.debugListId = null;
8197
+ for (const newOp of newOps) {
8198
+ OpList.assertIsNotEnd(newOp);
8199
+ // `newOp` might be `oldOp`, but at this point it's been marked as unowned.
8200
+ OpList.assertIsUnowned(newOp);
8201
+ }
8202
+ // It should be safe to reuse `oldOp` in the `newOps` list - maybe you want to sandwich an
8203
+ // operation between two new ops.
8204
+ const { prev: oldPrev, next: oldNext } = oldOp;
8205
+ oldOp.prev = null;
8206
+ oldOp.next = null;
8207
+ let prev = oldPrev;
8208
+ for (const newOp of newOps) {
8209
+ this.assertIsUnowned(newOp);
8210
+ newOp.debugListId = listId;
8211
+ prev.next = newOp;
8212
+ newOp.prev = prev;
8213
+ // This _should_ be the case, but set it just in case.
8214
+ newOp.next = null;
8215
+ prev = newOp;
8216
+ }
8217
+ // At the end of iteration, `prev` holds the last node in the list.
8218
+ const first = newOps[0];
8219
+ const last = prev;
8220
+ // Replace `oldOp` with the chain `first` -> `last`.
8221
+ if (oldPrev !== null) {
8222
+ oldPrev.next = first;
8223
+ first.prev = oldOp.prev;
8224
+ }
8225
+ if (oldNext !== null) {
8226
+ oldNext.prev = last;
8227
+ last.next = oldNext;
8228
+ }
8229
+ }
8230
+ /**
8231
+ * Remove the given node from the list which contains it.
8232
+ */
8233
+ static remove(op) {
8234
+ OpList.assertIsNotEnd(op);
8235
+ OpList.assertIsOwned(op);
8236
+ op.prev.next = op.next;
8237
+ op.next.prev = op.prev;
8238
+ // Break any link between the node and this list to safeguard against its usage in future
8239
+ // operations.
8240
+ op.debugListId = null;
8241
+ op.prev = null;
8242
+ op.next = null;
8243
+ }
8244
+ /**
8245
+ * Insert `op` before `target`.
8246
+ */
8247
+ static insertBefore(op, target) {
8248
+ OpList.assertIsOwned(target);
8249
+ if (target.prev === null) {
8250
+ throw new Error(`AssertionError: illegal operation on list start`);
8251
+ }
8252
+ OpList.assertIsNotEnd(op);
8253
+ OpList.assertIsUnowned(op);
8254
+ op.debugListId = target.debugListId;
8255
+ // Just in case.
8256
+ op.prev = null;
8257
+ target.prev.next = op;
8258
+ op.prev = target.prev;
8259
+ op.next = target;
8260
+ target.prev = op;
8261
+ }
8262
+ /**
8263
+ * Insert `op` after `target`.
8264
+ */
8265
+ static insertAfter(op, target) {
8266
+ OpList.assertIsOwned(target);
8267
+ if (target.next === null) {
8268
+ throw new Error(`AssertionError: illegal operation on list end`);
8269
+ }
8270
+ OpList.assertIsNotEnd(op);
8271
+ OpList.assertIsUnowned(op);
8272
+ op.debugListId = target.debugListId;
8273
+ target.next.prev = op;
8274
+ op.next = target.next;
8275
+ op.prev = target;
8276
+ target.next = op;
8277
+ }
8278
+ /**
8279
+ * Asserts that `op` does not currently belong to a list.
8280
+ */
8281
+ static assertIsUnowned(op) {
8282
+ if (op.debugListId !== null) {
8283
+ throw new Error(`AssertionError: illegal operation on owned node: ${OpKind[op.kind]}`);
8284
+ }
8285
+ }
8286
+ /**
8287
+ * Asserts that `op` currently belongs to a list. If `byList` is passed, `op` is asserted to
8288
+ * specifically belong to that list.
8289
+ */
8290
+ static assertIsOwned(op, byList) {
8291
+ if (op.debugListId === null) {
8292
+ throw new Error(`AssertionError: illegal operation on unowned node: ${OpKind[op.kind]}`);
8293
+ }
8294
+ else if (byList !== undefined && op.debugListId !== byList) {
8295
+ throw new Error(`AssertionError: node belongs to the wrong list (expected ${byList}, actual ${op.debugListId})`);
8296
+ }
8297
+ }
8298
+ /**
8299
+ * Asserts that `op` is not a special `ListEnd` node.
8300
+ */
8301
+ static assertIsNotEnd(op) {
8302
+ if (op.kind === OpKind.ListEnd) {
8303
+ throw new Error(`AssertionError: illegal operation on list head or tail`);
8304
+ }
8305
+ }
8306
+ }
8307
+
8308
+ /**
8309
+ * The set of OpKinds that represent the creation of an element or container
8310
+ */
8311
+ new Set([
8312
+ OpKind.Element, OpKind.ElementStart, OpKind.Container, OpKind.ContainerStart, OpKind.Template
8313
+ ]);
8314
+ /**
8315
+ * Whether the active namespace is HTML, MathML, or SVG mode.
8316
+ */
8317
+ var Namespace;
8318
+ (function (Namespace) {
8319
+ Namespace[Namespace["HTML"] = 0] = "HTML";
8320
+ Namespace[Namespace["SVG"] = 1] = "SVG";
8321
+ Namespace[Namespace["Math"] = 2] = "Math";
8322
+ })(Namespace || (Namespace = {}));
8323
+
8324
+ /**
8325
+ * Parses string representation of a style and converts it into object literal.
8326
+ *
8327
+ * @param value string representation of style as used in the `style` attribute in HTML.
8328
+ * Example: `color: red; height: auto`.
8329
+ * @returns An array of style property name and value pairs, e.g. `['color', 'red', 'height',
8330
+ * 'auto']`
8331
+ */
8332
+ function parse(value) {
8333
+ // we use a string array here instead of a string map
8334
+ // because a string-map is not guaranteed to retain the
8335
+ // order of the entries whereas a string array can be
8336
+ // constructed in a [key, value, key, value] format.
8337
+ const styles = [];
8338
+ let i = 0;
8339
+ let parenDepth = 0;
8340
+ let quote = 0 /* Char.QuoteNone */;
8341
+ let valueStart = 0;
7399
8342
  let propStart = 0;
7400
8343
  let currentProp = null;
7401
8344
  while (i < value.length) {
@@ -7428,7 +8371,7 @@ function parse(value) {
7428
8371
  break;
7429
8372
  case 58 /* Char.Colon */:
7430
8373
  if (!currentProp && parenDepth === 0 && quote === 0 /* Char.QuoteNone */) {
7431
- currentProp = hyphenate(value.substring(propStart, i - 1).trim());
8374
+ currentProp = hyphenate$1(value.substring(propStart, i - 1).trim());
7432
8375
  valueStart = i;
7433
8376
  }
7434
8377
  break;
@@ -7449,7 +8392,7 @@ function parse(value) {
7449
8392
  }
7450
8393
  return styles;
7451
8394
  }
7452
- function hyphenate(value) {
8395
+ function hyphenate$1(value) {
7453
8396
  return value
7454
8397
  .replace(/[a-z][A-Z]/g, v => {
7455
8398
  return v.charAt(0) + '-' + v.charAt(1);
@@ -7457,6 +8400,140 @@ function hyphenate(value) {
7457
8400
  .toLowerCase();
7458
8401
  }
7459
8402
 
8403
+ new Map([
8404
+ [OpKind.ElementEnd, [OpKind.ElementStart, OpKind.Element]],
8405
+ [OpKind.ContainerEnd, [OpKind.ContainerStart, OpKind.Container]],
8406
+ ]);
8407
+ // A lookup set of all the expression kinds that require a temporary variable to be generated.
8408
+ [
8409
+ InvokeFunctionExpr, LiteralArrayExpr, LiteralMapExpr, SafeInvokeFunctionExpr,
8410
+ PipeBindingExpr
8411
+ ].map(e => e.constructor.name);
8412
+
8413
+ new Map([
8414
+ ['&&', BinaryOperator.And],
8415
+ ['>', BinaryOperator.Bigger],
8416
+ ['>=', BinaryOperator.BiggerEquals],
8417
+ ['&', BinaryOperator.BitwiseAnd],
8418
+ ['/', BinaryOperator.Divide],
8419
+ ['==', BinaryOperator.Equals],
8420
+ ['===', BinaryOperator.Identical],
8421
+ ['<', BinaryOperator.Lower],
8422
+ ['<=', BinaryOperator.LowerEquals],
8423
+ ['-', BinaryOperator.Minus],
8424
+ ['%', BinaryOperator.Modulo],
8425
+ ['*', BinaryOperator.Multiply],
8426
+ ['!=', BinaryOperator.NotEquals],
8427
+ ['!==', BinaryOperator.NotIdentical],
8428
+ ['??', BinaryOperator.NullishCoalesce],
8429
+ ['||', BinaryOperator.Or],
8430
+ ['+', BinaryOperator.Plus],
8431
+ ]);
8432
+ new Map([['svg', Namespace.SVG], ['math', Namespace.Math]]);
8433
+
8434
+ function kindTest(kind) {
8435
+ return (op) => op.kind === kind;
8436
+ }
8437
+ /**
8438
+ * Defines the groups based on `OpKind` that ops will be divided into. Ops will be collected into
8439
+ * groups, then optionally transformed, before recombining the groups in the order defined here.
8440
+ */
8441
+ [
8442
+ { test: kindTest(OpKind.StyleMap), transform: keepLast },
8443
+ { test: kindTest(OpKind.ClassMap), transform: keepLast },
8444
+ { test: kindTest(OpKind.StyleProp) },
8445
+ { test: kindTest(OpKind.ClassProp) },
8446
+ {
8447
+ test: (op) => (op.kind === OpKind.Property || op.kind === OpKind.HostProperty) &&
8448
+ op.expression instanceof Interpolation
8449
+ },
8450
+ {
8451
+ test: (op) => (op.kind === OpKind.Property || op.kind === OpKind.HostProperty) &&
8452
+ !(op.expression instanceof Interpolation)
8453
+ },
8454
+ { test: kindTest(OpKind.Attribute) },
8455
+ ];
8456
+ /**
8457
+ * The set of all op kinds we handle in the reordering phase.
8458
+ */
8459
+ new Set([
8460
+ OpKind.StyleMap,
8461
+ OpKind.ClassMap,
8462
+ OpKind.StyleProp,
8463
+ OpKind.ClassProp,
8464
+ OpKind.Property,
8465
+ OpKind.HostProperty,
8466
+ OpKind.Attribute,
8467
+ ]);
8468
+ /**
8469
+ * Keeps only the last op in a list of ops.
8470
+ */
8471
+ function keepLast(ops) {
8472
+ return ops.slice(ops.length - 1);
8473
+ }
8474
+
8475
+ /**
8476
+ * Map of sanitizers to their identifier.
8477
+ */
8478
+ new Map([
8479
+ [SanitizerFn.Html, Identifiers.sanitizeHtml],
8480
+ [SanitizerFn.IframeAttribute, Identifiers.validateIframeAttribute],
8481
+ [SanitizerFn.ResourceUrl, Identifiers.sanitizeResourceUrl],
8482
+ [SanitizerFn.Script, Identifiers.sanitizeScript],
8483
+ [SanitizerFn.Style, Identifiers.sanitizeStyle], [SanitizerFn.Url, Identifiers.sanitizeUrl]
8484
+ ]);
8485
+
8486
+ /**
8487
+ * Mapping of security contexts to sanitizer function for that context.
8488
+ */
8489
+ new Map([
8490
+ [SecurityContext.HTML, SanitizerFn.Html], [SecurityContext.SCRIPT, SanitizerFn.Script],
8491
+ [SecurityContext.STYLE, SanitizerFn.Style], [SecurityContext.URL, SanitizerFn.Url],
8492
+ [SecurityContext.RESOURCE_URL, SanitizerFn.ResourceUrl]
8493
+ ]);
8494
+ /**
8495
+ * A [fence](https://en.wikipedia.org/wiki/Memory_barrier) flag for an expression which indicates
8496
+ * how that expression can be optimized in relation to other expressions or instructions.
8497
+ *
8498
+ * `Fence`s are a bitfield, so multiple flags may be set on a single expression.
8499
+ */
8500
+ var Fence;
8501
+ (function (Fence) {
8502
+ /**
8503
+ * Empty flag (no fence exists).
8504
+ */
8505
+ Fence[Fence["None"] = 0] = "None";
8506
+ /**
8507
+ * A context read fence, meaning that the expression in question reads from the "current view"
8508
+ * context of the runtime.
8509
+ */
8510
+ Fence[Fence["ViewContextRead"] = 1] = "ViewContextRead";
8511
+ /**
8512
+ * A context write fence, meaning that the expression in question writes to the "current view"
8513
+ * context of the runtime.
8514
+ *
8515
+ * Note that all `ContextWrite` fences are implicitly `ContextRead` fences as operations which
8516
+ * change the view context do so based on the current one.
8517
+ */
8518
+ Fence[Fence["ViewContextWrite"] = 3] = "ViewContextWrite";
8519
+ /**
8520
+ * Indicates that a call is required for its side-effects, even if nothing reads its result.
8521
+ *
8522
+ * This is also true of `ViewContextWrite` operations **if** they are followed by a
8523
+ * `ViewContextRead`.
8524
+ */
8525
+ Fence[Fence["SideEffectful"] = 4] = "SideEffectful";
8526
+ })(Fence || (Fence = {}));
8527
+
8528
+ CompatibilityMode.TemplateDefinitionBuilder;
8529
+ new Map([
8530
+ [0 /* e.BindingType.Property */, BindingKind.Property],
8531
+ [1 /* e.BindingType.Attribute */, BindingKind.Attribute],
8532
+ [2 /* e.BindingType.Class */, BindingKind.ClassName],
8533
+ [3 /* e.BindingType.Style */, BindingKind.StyleProperty],
8534
+ [4 /* e.BindingType.Animation */, BindingKind.Animation],
8535
+ ]);
8536
+
7460
8537
  const IMPORTANT_FLAG = '!important';
7461
8538
  /**
7462
8539
  * Minimum amount of binding slots required in the runtime for style/class bindings.
@@ -7626,7 +8703,7 @@ class StylingBuilder {
7626
8703
  // CSS custom properties are case-sensitive so we shouldn't normalize them.
7627
8704
  // See: https://www.w3.org/TR/css-variables-1/#defining-variables
7628
8705
  if (!isCssCustomProperty(name)) {
7629
- name = hyphenate(name);
8706
+ name = hyphenate$1(name);
7630
8707
  }
7631
8708
  const { property, hasOverrideFlag, suffix: bindingSuffix } = parseProperty(name);
7632
8709
  suffix = typeof suffix === 'string' && suffix.length !== 0 ? suffix : bindingSuffix;
@@ -7756,7 +8833,7 @@ class StylingBuilder {
7756
8833
  // pipes can be picked up in time before the template is built
7757
8834
  const mapValue = stylingInput.value.visit(valueConverter);
7758
8835
  let reference;
7759
- if (mapValue instanceof Interpolation) {
8836
+ if (mapValue instanceof Interpolation$1) {
7760
8837
  totalBindingSlotsRequired += mapValue.expressions.length;
7761
8838
  reference = isClassBased ? getClassMapInterpolationExpression(mapValue) :
7762
8839
  getStyleMapInterpolationExpression(mapValue);
@@ -7791,7 +8868,7 @@ class StylingBuilder {
7791
8868
  // We need to store the intermediate value so that we don't allocate
7792
8869
  // the strings on each CD.
7793
8870
  let totalBindingSlotsRequired = MIN_STYLING_BINDING_SLOTS_REQUIRED;
7794
- if (value instanceof Interpolation) {
8871
+ if (value instanceof Interpolation$1) {
7795
8872
  totalBindingSlotsRequired += value.expressions.length;
7796
8873
  if (getInterpolationExpressionFn) {
7797
8874
  referenceForCall = getInterpolationExpressionFn(value);
@@ -7983,7 +9060,7 @@ function isEmptyExpression(ast) {
7983
9060
  if (ast instanceof ASTWithSource) {
7984
9061
  ast = ast.ast;
7985
9062
  }
7986
- return ast instanceof EmptyExpr;
9063
+ return ast instanceof EmptyExpr$1;
7987
9064
  }
7988
9065
 
7989
9066
  var TokenType;
@@ -8419,6 +9496,7 @@ class Parser$1 {
8419
9496
  ast.visit(checker);
8420
9497
  return checker.errors;
8421
9498
  }
9499
+ // Host bindings parsed here
8422
9500
  parseSimpleBinding(input, location, absoluteOffset, interpolationConfig = DEFAULT_INTERPOLATION_CONFIG) {
8423
9501
  const ast = this._parseBindingAst(input, location, absoluteOffset, interpolationConfig);
8424
9502
  const errors = this.checkSimpleExpression(ast);
@@ -8501,7 +9579,7 @@ class Parser$1 {
8501
9579
  }
8502
9580
  createInterpolationAst(strings, expressions, input, location, absoluteOffset) {
8503
9581
  const span = new ParseSpan(0, input.length);
8504
- const interpolation = new Interpolation(span, span.toAbsolute(absoluteOffset), strings, expressions);
9582
+ const interpolation = new Interpolation$1(span, span.toAbsolute(absoluteOffset), strings, expressions);
8505
9583
  return new ASTWithSource(interpolation, input, location, absoluteOffset, this.errors);
8506
9584
  }
8507
9585
  /**
@@ -8872,7 +9950,7 @@ class _ParseAST {
8872
9950
  // We have no expressions so create an empty expression that spans the entire input length
8873
9951
  const artificialStart = this.offset;
8874
9952
  const artificialEnd = this.offset + this.input.length;
8875
- return new EmptyExpr(this.span(artificialStart, artificialEnd), this.sourceSpan(artificialStart, artificialEnd));
9953
+ return new EmptyExpr$1(this.span(artificialStart, artificialEnd), this.sourceSpan(artificialStart, artificialEnd));
8876
9954
  }
8877
9955
  if (exprs.length == 1)
8878
9956
  return exprs[0];
@@ -8933,7 +10011,7 @@ class _ParseAST {
8933
10011
  const end = this.inputIndex;
8934
10012
  const expression = this.input.substring(start, end);
8935
10013
  this.error(`Conditional expression ${expression} requires all 3 expressions`);
8936
- no = new EmptyExpr(this.span(start), this.sourceSpan(start));
10014
+ no = new EmptyExpr$1(this.span(start), this.sourceSpan(start));
8937
10015
  }
8938
10016
  else {
8939
10017
  no = this.parsePipe();
@@ -9158,15 +10236,15 @@ class _ParseAST {
9158
10236
  }
9159
10237
  else if (this.next.isPrivateIdentifier()) {
9160
10238
  this._reportErrorForPrivateIdentifier(this.next, null);
9161
- return new EmptyExpr(this.span(start), this.sourceSpan(start));
10239
+ return new EmptyExpr$1(this.span(start), this.sourceSpan(start));
9162
10240
  }
9163
10241
  else if (this.index >= this.tokens.length) {
9164
10242
  this.error(`Unexpected end of expression: ${this.input}`);
9165
- return new EmptyExpr(this.span(start), this.sourceSpan(start));
10243
+ return new EmptyExpr$1(this.span(start), this.sourceSpan(start));
9166
10244
  }
9167
10245
  else {
9168
10246
  this.error(`Unexpected token ${this.next}`);
9169
- return new EmptyExpr(this.span(start), this.sourceSpan(start));
10247
+ return new EmptyExpr$1(this.span(start), this.sourceSpan(start));
9170
10248
  }
9171
10249
  }
9172
10250
  parseExpressionList(terminator) {
@@ -9227,7 +10305,7 @@ class _ParseAST {
9227
10305
  if (isSafe) {
9228
10306
  if (this.consumeOptionalAssignment()) {
9229
10307
  this.error('The \'?.\' operator cannot be used in the assignment');
9230
- receiver = new EmptyExpr(this.span(start), this.sourceSpan(start));
10308
+ receiver = new EmptyExpr$1(this.span(start), this.sourceSpan(start));
9231
10309
  }
9232
10310
  else {
9233
10311
  receiver = new SafePropertyRead(this.span(start), this.sourceSpan(start), nameSpan, readReceiver, id);
@@ -9237,7 +10315,7 @@ class _ParseAST {
9237
10315
  if (this.consumeOptionalAssignment()) {
9238
10316
  if (!(this.parseFlags & 1 /* ParseFlags.Action */)) {
9239
10317
  this.error('Bindings cannot contain assignments');
9240
- return new EmptyExpr(this.span(start), this.sourceSpan(start));
10318
+ return new EmptyExpr$1(this.span(start), this.sourceSpan(start));
9241
10319
  }
9242
10320
  const value = this.parseConditional();
9243
10321
  receiver = new PropertyWrite(this.span(start), this.sourceSpan(start), nameSpan, readReceiver, id, value);
@@ -9367,7 +10445,7 @@ class _ParseAST {
9367
10445
  return this.withContext(ParseContextFlags.Writable, () => {
9368
10446
  this.rbracketsExpected++;
9369
10447
  const key = this.parsePipe();
9370
- if (key instanceof EmptyExpr) {
10448
+ if (key instanceof EmptyExpr$1) {
9371
10449
  this.error(`Key access cannot be empty`);
9372
10450
  }
9373
10451
  this.rbracketsExpected--;
@@ -9385,7 +10463,7 @@ class _ParseAST {
9385
10463
  return isSafe ? new SafeKeyedRead(this.span(start), this.sourceSpan(start), receiver, key) :
9386
10464
  new KeyedRead(this.span(start), this.sourceSpan(start), receiver, key);
9387
10465
  }
9388
- return new EmptyExpr(this.span(start), this.sourceSpan(start));
10466
+ return new EmptyExpr$1(this.span(start), this.sourceSpan(start));
9389
10467
  });
9390
10468
  }
9391
10469
  /**
@@ -9680,6 +10758,39 @@ class Comment {
9680
10758
  return visitor.visitComment(this, context);
9681
10759
  }
9682
10760
  }
10761
+ class BlockGroup {
10762
+ constructor(blocks, sourceSpan, startSourceSpan, endSourceSpan = null) {
10763
+ this.blocks = blocks;
10764
+ this.sourceSpan = sourceSpan;
10765
+ this.startSourceSpan = startSourceSpan;
10766
+ this.endSourceSpan = endSourceSpan;
10767
+ }
10768
+ visit(visitor, context) {
10769
+ return visitor.visitBlockGroup(this, context);
10770
+ }
10771
+ }
10772
+ class Block {
10773
+ constructor(name, parameters, children, sourceSpan, startSourceSpan, endSourceSpan = null) {
10774
+ this.name = name;
10775
+ this.parameters = parameters;
10776
+ this.children = children;
10777
+ this.sourceSpan = sourceSpan;
10778
+ this.startSourceSpan = startSourceSpan;
10779
+ this.endSourceSpan = endSourceSpan;
10780
+ }
10781
+ visit(visitor, context) {
10782
+ return visitor.visitBlock(this, context);
10783
+ }
10784
+ }
10785
+ class BlockParameter {
10786
+ constructor(expression, sourceSpan) {
10787
+ this.expression = expression;
10788
+ this.sourceSpan = sourceSpan;
10789
+ }
10790
+ visit(visitor, context) {
10791
+ return visitor.visitBlockParameter(this, context);
10792
+ }
10793
+ }
9683
10794
  function visitAll(visitor, nodes, context = null) {
9684
10795
  const result = [];
9685
10796
  const visit = visitor.visit ?
@@ -9694,41 +10805,6 @@ function visitAll(visitor, nodes, context = null) {
9694
10805
  return result;
9695
10806
  }
9696
10807
 
9697
- var TagContentType;
9698
- (function (TagContentType) {
9699
- TagContentType[TagContentType["RAW_TEXT"] = 0] = "RAW_TEXT";
9700
- TagContentType[TagContentType["ESCAPABLE_RAW_TEXT"] = 1] = "ESCAPABLE_RAW_TEXT";
9701
- TagContentType[TagContentType["PARSABLE_DATA"] = 2] = "PARSABLE_DATA";
9702
- })(TagContentType || (TagContentType = {}));
9703
- function splitNsName(elementName) {
9704
- if (elementName[0] != ':') {
9705
- return [null, elementName];
9706
- }
9707
- const colonIndex = elementName.indexOf(':', 1);
9708
- if (colonIndex === -1) {
9709
- throw new Error(`Unsupported format "${elementName}" expecting ":namespace:name"`);
9710
- }
9711
- return [elementName.slice(1, colonIndex), elementName.slice(colonIndex + 1)];
9712
- }
9713
- // `<ng-container>` tags work the same regardless the namespace
9714
- function isNgContainer(tagName) {
9715
- return splitNsName(tagName)[1] === 'ng-container';
9716
- }
9717
- // `<ng-content>` tags work the same regardless the namespace
9718
- function isNgContent(tagName) {
9719
- return splitNsName(tagName)[1] === 'ng-content';
9720
- }
9721
- // `<ng-template>` tags work the same regardless the namespace
9722
- function isNgTemplate(tagName) {
9723
- return splitNsName(tagName)[1] === 'ng-template';
9724
- }
9725
- function getNsPrefix(fullName) {
9726
- return fullName === null ? null : splitNsName(fullName)[0];
9727
- }
9728
- function mergeNsAndName(prefix, localName) {
9729
- return prefix ? `:${prefix}:${localName}` : localName;
9730
- }
9731
-
9732
10808
  class ElementSchemaRegistry {
9733
10809
  }
9734
10810
 
@@ -12400,8 +13476,9 @@ const NAMED_ENTITIES = {
12400
13476
  'zwj': '\u200D',
12401
13477
  'zwnj': '\u200C'
12402
13478
  };
12403
- // The &ngsp; pseudo-entity is denoting a space. see:
12404
- // https://github.com/dart-lang/angular/blob/0bb611387d29d65b5af7f9d2515ab571fd3fbee4/_tests/test/compiler/preserve_whitespace_test.dart
13479
+ // The &ngsp; pseudo-entity is denoting a space.
13480
+ // 0xE500 is a PUA (Private Use Areas) unicode character
13481
+ // This is inspired by the Angular Dart implementation.
12405
13482
  const NGSP_UNICODE = '\uE500';
12406
13483
  NAMED_ENTITIES['ngsp'] = NGSP_UNICODE;
12407
13484
 
@@ -12468,8 +13545,8 @@ class _Tokenizer {
12468
13545
  this._cursor = options.escapedString ? new EscapedCharacterCursor(_file, range) :
12469
13546
  new PlainCharacterCursor(_file, range);
12470
13547
  this._preserveLineEndings = options.preserveLineEndings || false;
12471
- this._escapedString = options.escapedString || false;
12472
13548
  this._i18nNormalizeLineEndingsInICUs = options.i18nNormalizeLineEndingsInICUs || false;
13549
+ this._tokenizeBlocks = options.tokenizeBlocks || false;
12473
13550
  try {
12474
13551
  this._cursor.init();
12475
13552
  }
@@ -12510,18 +13587,96 @@ class _Tokenizer {
12510
13587
  this._consumeTagOpen(start);
12511
13588
  }
12512
13589
  }
13590
+ else if (this._tokenizeBlocks && this._attemptStr('{#')) {
13591
+ this._consumeBlockGroupOpen(start);
13592
+ }
13593
+ else if (this._tokenizeBlocks && this._attemptStr('{/')) {
13594
+ this._consumeBlockGroupClose(start);
13595
+ }
13596
+ else if (this._tokenizeBlocks && this._attemptStr('{:')) {
13597
+ this._consumeBlock(start);
13598
+ }
12513
13599
  else if (!(this._tokenizeIcu && this._tokenizeExpansionForm())) {
12514
13600
  // In (possibly interpolated) text the end of the text is given by `isTextEnd()`, while
12515
13601
  // the premature end of an interpolation is given by the start of a new HTML element.
12516
13602
  this._consumeWithInterpolation(5 /* TokenType.TEXT */, 8 /* TokenType.INTERPOLATION */, () => this._isTextEnd(), () => this._isTagStart());
12517
13603
  }
12518
13604
  }
12519
- catch (e) {
12520
- this.handleError(e);
12521
- }
13605
+ catch (e) {
13606
+ this.handleError(e);
13607
+ }
13608
+ }
13609
+ this._beginToken(24 /* TokenType.EOF */);
13610
+ this._endToken([]);
13611
+ }
13612
+ _consumeBlockGroupOpen(start) {
13613
+ this._beginToken(25 /* TokenType.BLOCK_GROUP_OPEN_START */, start);
13614
+ const nameCursor = this._cursor.clone();
13615
+ this._attemptCharCodeUntilFn(code => !isBlockNameChar(code));
13616
+ this._endToken([this._cursor.getChars(nameCursor)]);
13617
+ this._consumeBlockParameters();
13618
+ this._beginToken(26 /* TokenType.BLOCK_GROUP_OPEN_END */);
13619
+ this._requireCharCode($RBRACE);
13620
+ this._endToken([]);
13621
+ }
13622
+ _consumeBlockGroupClose(start) {
13623
+ this._beginToken(27 /* TokenType.BLOCK_GROUP_CLOSE */, start);
13624
+ const nameCursor = this._cursor.clone();
13625
+ this._attemptCharCodeUntilFn(code => !isBlockNameChar(code));
13626
+ const name = this._cursor.getChars(nameCursor);
13627
+ this._requireCharCode($RBRACE);
13628
+ this._endToken([name]);
13629
+ }
13630
+ _consumeBlock(start) {
13631
+ this._beginToken(29 /* TokenType.BLOCK_OPEN_START */, start);
13632
+ const nameCursor = this._cursor.clone();
13633
+ this._attemptCharCodeUntilFn(code => !isBlockNameChar(code));
13634
+ this._endToken([this._cursor.getChars(nameCursor)]);
13635
+ this._consumeBlockParameters();
13636
+ this._beginToken(30 /* TokenType.BLOCK_OPEN_END */);
13637
+ this._requireCharCode($RBRACE);
13638
+ this._endToken([]);
13639
+ }
13640
+ _consumeBlockParameters() {
13641
+ // Trim the whitespace until the first parameter.
13642
+ this._attemptCharCodeUntilFn(isBlockParameterChar);
13643
+ while (this._cursor.peek() !== $RBRACE && this._cursor.peek() !== $EOF) {
13644
+ this._beginToken(28 /* TokenType.BLOCK_PARAMETER */);
13645
+ const start = this._cursor.clone();
13646
+ let inQuote = null;
13647
+ let openBraces = 0;
13648
+ // Consume the parameter until the next semicolon or brace.
13649
+ // Note that we skip over semicolons/braces inside of strings.
13650
+ while ((this._cursor.peek() !== $SEMICOLON && this._cursor.peek() !== $EOF) ||
13651
+ inQuote !== null) {
13652
+ const char = this._cursor.peek();
13653
+ // Skip to the next character if it was escaped.
13654
+ if (char === $BACKSLASH) {
13655
+ this._cursor.advance();
13656
+ }
13657
+ else if (char === inQuote) {
13658
+ inQuote = null;
13659
+ }
13660
+ else if (inQuote === null && isQuote(char)) {
13661
+ inQuote = char;
13662
+ }
13663
+ else if (char === $LBRACE && inQuote === null) {
13664
+ openBraces++;
13665
+ }
13666
+ else if (char === $RBRACE && inQuote === null) {
13667
+ if (openBraces === 0) {
13668
+ break;
13669
+ }
13670
+ else if (openBraces > 0) {
13671
+ openBraces--;
13672
+ }
13673
+ }
13674
+ this._cursor.advance();
13675
+ }
13676
+ this._endToken([this._cursor.getChars(start)]);
13677
+ // Skip to the next parameter.
13678
+ this._attemptCharCodeUntilFn(isBlockParameterChar);
12522
13679
  }
12523
- this._beginToken(24 /* TokenType.EOF */);
12524
- this._endToken([]);
12525
13680
  }
12526
13681
  /**
12527
13682
  * @returns whether an ICU token has been created
@@ -13044,7 +14199,7 @@ class _Tokenizer {
13044
14199
  return this._processCarriageReturns(end.getChars(start));
13045
14200
  }
13046
14201
  _isTextEnd() {
13047
- if (this._isTagStart() || this._cursor.peek() === $EOF) {
14202
+ if (this._isTagStart() || this._isBlockStart() || this._cursor.peek() === $EOF) {
13048
14203
  return true;
13049
14204
  }
13050
14205
  if (this._tokenizeIcu && !this._inInterpolation) {
@@ -13077,6 +14232,23 @@ class _Tokenizer {
13077
14232
  }
13078
14233
  return false;
13079
14234
  }
14235
+ _isBlockStart() {
14236
+ if (this._tokenizeBlocks && this._cursor.peek() === $LBRACE) {
14237
+ const tmp = this._cursor.clone();
14238
+ // Check that the cursor is on a `{#`, `{/` or `{:`.
14239
+ tmp.advance();
14240
+ const next = tmp.peek();
14241
+ if (next !== $BANG && next !== $SLASH && next !== $COLON) {
14242
+ return false;
14243
+ }
14244
+ // If it is, also verify that the next character is a valid block identifier.
14245
+ tmp.advance();
14246
+ if (isBlockNameChar(tmp.peek())) {
14247
+ return true;
14248
+ }
14249
+ }
14250
+ return false;
14251
+ }
13080
14252
  _readUntil(char) {
13081
14253
  const start = this._cursor.clone();
13082
14254
  this._attemptUntilChar(char);
@@ -13132,6 +14304,12 @@ function compareCharCodeCaseInsensitive(code1, code2) {
13132
14304
  function toUpperCaseCharCode(code) {
13133
14305
  return code >= $a && code <= $z ? code - $a + $A : code;
13134
14306
  }
14307
+ function isBlockNameChar(code) {
14308
+ return isAsciiLetter(code) || isDigit(code) || code === $_;
14309
+ }
14310
+ function isBlockParameterChar(code) {
14311
+ return code !== $SEMICOLON && isNotWhitespace(code);
14312
+ }
13135
14313
  function mergeTextTokens(srcTokens) {
13136
14314
  const dstTokens = [];
13137
14315
  let lastDstToken = undefined;
@@ -13419,7 +14597,7 @@ class _TreeBuilder {
13419
14597
  this.tokens = tokens;
13420
14598
  this.getTagDefinition = getTagDefinition;
13421
14599
  this._index = -1;
13422
- this._elementStack = [];
14600
+ this._containerStack = [];
13423
14601
  this.rootNodes = [];
13424
14602
  this.errors = [];
13425
14603
  this._advance();
@@ -13449,6 +14627,18 @@ class _TreeBuilder {
13449
14627
  else if (this._peek.type === 19 /* TokenType.EXPANSION_FORM_START */) {
13450
14628
  this._consumeExpansion(this._advance());
13451
14629
  }
14630
+ else if (this._peek.type === 25 /* TokenType.BLOCK_GROUP_OPEN_START */) {
14631
+ this._closeVoidElement();
14632
+ this._consumeBlockGroupOpen(this._advance());
14633
+ }
14634
+ else if (this._peek.type === 29 /* TokenType.BLOCK_OPEN_START */) {
14635
+ this._closeVoidElement();
14636
+ this._consumeBlock(this._advance(), 30 /* TokenType.BLOCK_OPEN_END */);
14637
+ }
14638
+ else if (this._peek.type === 27 /* TokenType.BLOCK_GROUP_CLOSE */) {
14639
+ this._closeVoidElement();
14640
+ this._consumeBlockGroupClose(this._advance());
14641
+ }
13452
14642
  else {
13453
14643
  // Skip all other tokens...
13454
14644
  this._advance();
@@ -13476,9 +14666,12 @@ class _TreeBuilder {
13476
14666
  }
13477
14667
  _consumeComment(token) {
13478
14668
  const text = this._advanceIf(7 /* TokenType.RAW_TEXT */);
13479
- this._advanceIf(11 /* TokenType.COMMENT_END */);
14669
+ const endToken = this._advanceIf(11 /* TokenType.COMMENT_END */);
13480
14670
  const value = text != null ? text.parts[0].trim() : null;
13481
- this._addToParent(new Comment(value, token.sourceSpan));
14671
+ const sourceSpan = endToken == null ?
14672
+ token.sourceSpan :
14673
+ new ParseSourceSpan(token.sourceSpan.start, endToken.sourceSpan.end, token.sourceSpan.fullStart);
14674
+ this._addToParent(new Comment(value, sourceSpan));
13482
14675
  }
13483
14676
  _consumeExpansion(token) {
13484
14677
  const switchValue = this._advance();
@@ -13565,7 +14758,12 @@ class _TreeBuilder {
13565
14758
  const startSpan = token.sourceSpan;
13566
14759
  let text = token.parts[0];
13567
14760
  if (text.length > 0 && text[0] === '\n') {
13568
- const parent = this._getParentElement();
14761
+ const parent = this._getContainer();
14762
+ // This is unlikely to happen, but we have an assertion just in case.
14763
+ if (parent instanceof BlockGroup) {
14764
+ this.errors.push(TreeError.create(null, startSpan, 'Text cannot be placed directly inside of a block group.'));
14765
+ return null;
14766
+ }
13569
14767
  if (parent != null && parent.children.length === 0 &&
13570
14768
  this.getTagDefinition(parent.name).ignoreFirstLf) {
13571
14769
  text = text.substring(1);
@@ -13596,9 +14794,9 @@ class _TreeBuilder {
13596
14794
  }
13597
14795
  }
13598
14796
  _closeVoidElement() {
13599
- const el = this._getParentElement();
13600
- if (el && this.getTagDefinition(el.name).isVoid) {
13601
- this._elementStack.pop();
14797
+ const el = this._getContainer();
14798
+ if (el instanceof Element && this.getTagDefinition(el.name).isVoid) {
14799
+ this._containerStack.pop();
13602
14800
  }
13603
14801
  }
13604
14802
  _consumeStartTag(startTagToken) {
@@ -13607,7 +14805,7 @@ class _TreeBuilder {
13607
14805
  while (this._peek.type === 14 /* TokenType.ATTR_NAME */) {
13608
14806
  attrs.push(this._consumeAttr(this._advance()));
13609
14807
  }
13610
- const fullName = this._getElementFullName(prefix, name, this._getParentElement());
14808
+ const fullName = this._getElementFullName(prefix, name, this._getClosestParentElement());
13611
14809
  let selfClosing = false;
13612
14810
  // Note: There could have been a tokenizer error
13613
14811
  // so that we don't get a token for the end tag...
@@ -13628,33 +14826,34 @@ class _TreeBuilder {
13628
14826
  // Create a separate `startSpan` because `span` will be modified when there is an `end` span.
13629
14827
  const startSpan = new ParseSourceSpan(startTagToken.sourceSpan.start, end, startTagToken.sourceSpan.fullStart);
13630
14828
  const el = new Element(fullName, attrs, [], span, startSpan, undefined);
13631
- this._pushElement(el);
14829
+ const parentEl = this._getContainer();
14830
+ this._pushContainer(el, parentEl instanceof Element &&
14831
+ this.getTagDefinition(parentEl.name).isClosedByChild(el.name));
13632
14832
  if (selfClosing) {
13633
14833
  // Elements that are self-closed have their `endSourceSpan` set to the full span, as the
13634
14834
  // element start tag also represents the end tag.
13635
- this._popElement(fullName, span);
14835
+ this._popContainer(fullName, Element, span);
13636
14836
  }
13637
14837
  else if (startTagToken.type === 4 /* TokenType.INCOMPLETE_TAG_OPEN */) {
13638
14838
  // We already know the opening tag is not complete, so it is unlikely it has a corresponding
13639
14839
  // close tag. Let's optimistically parse it as a full element and emit an error.
13640
- this._popElement(fullName, null);
14840
+ this._popContainer(fullName, Element, null);
13641
14841
  this.errors.push(TreeError.create(fullName, span, `Opening tag "${fullName}" not terminated.`));
13642
14842
  }
13643
14843
  }
13644
- _pushElement(el) {
13645
- const parentEl = this._getParentElement();
13646
- if (parentEl && this.getTagDefinition(parentEl.name).isClosedByChild(el.name)) {
13647
- this._elementStack.pop();
14844
+ _pushContainer(node, isClosedByChild) {
14845
+ if (isClosedByChild) {
14846
+ this._containerStack.pop();
13648
14847
  }
13649
- this._addToParent(el);
13650
- this._elementStack.push(el);
14848
+ this._addToParent(node);
14849
+ this._containerStack.push(node);
13651
14850
  }
13652
14851
  _consumeEndTag(endTagToken) {
13653
- const fullName = this._getElementFullName(endTagToken.parts[0], endTagToken.parts[1], this._getParentElement());
14852
+ const fullName = this._getElementFullName(endTagToken.parts[0], endTagToken.parts[1], this._getClosestParentElement());
13654
14853
  if (this.getTagDefinition(fullName).isVoid) {
13655
14854
  this.errors.push(TreeError.create(fullName, endTagToken.sourceSpan, `Void elements do not have end tags "${endTagToken.parts[1]}"`));
13656
14855
  }
13657
- else if (!this._popElement(fullName, endTagToken.sourceSpan)) {
14856
+ else if (!this._popContainer(fullName, Element, endTagToken.sourceSpan)) {
13658
14857
  const errMsg = `Unexpected closing tag "${fullName}". It may happen when the tag has already been closed by another tag. For more info see https://www.w3.org/TR/html5/syntax.html#closing-elements-that-have-implied-end-tags`;
13659
14858
  this.errors.push(TreeError.create(fullName, endTagToken.sourceSpan, errMsg));
13660
14859
  }
@@ -13665,20 +14864,23 @@ class _TreeBuilder {
13665
14864
  * not have a closing tag (for example, this happens when an incomplete
13666
14865
  * opening tag is recovered).
13667
14866
  */
13668
- _popElement(fullName, endSourceSpan) {
14867
+ _popContainer(fullName, expectedType, endSourceSpan) {
13669
14868
  let unexpectedCloseTagDetected = false;
13670
- for (let stackIndex = this._elementStack.length - 1; stackIndex >= 0; stackIndex--) {
13671
- const el = this._elementStack[stackIndex];
13672
- if (el.name === fullName) {
14869
+ for (let stackIndex = this._containerStack.length - 1; stackIndex >= 0; stackIndex--) {
14870
+ const node = this._containerStack[stackIndex];
14871
+ const name = node instanceof BlockGroup ? node.blocks[0]?.name : node.name;
14872
+ if (name === fullName && node instanceof expectedType) {
13673
14873
  // Record the parse span with the element that is being closed. Any elements that are
13674
14874
  // removed from the element stack at this point are closed implicitly, so they won't get
13675
14875
  // an end source span (as there is no explicit closing element).
13676
- el.endSourceSpan = endSourceSpan;
13677
- el.sourceSpan.end = endSourceSpan !== null ? endSourceSpan.end : el.sourceSpan.end;
13678
- this._elementStack.splice(stackIndex, this._elementStack.length - stackIndex);
14876
+ node.endSourceSpan = endSourceSpan;
14877
+ node.sourceSpan.end = endSourceSpan !== null ? endSourceSpan.end : node.sourceSpan.end;
14878
+ this._containerStack.splice(stackIndex, this._containerStack.length - stackIndex);
13679
14879
  return !unexpectedCloseTagDetected;
13680
14880
  }
13681
- if (!this.getTagDefinition(el.name).closedByParent) {
14881
+ // Blocks are self-closing while block groups and (most times) elements are not.
14882
+ if (node instanceof BlockGroup ||
14883
+ node instanceof Element && !this.getTagDefinition(node.name).closedByParent) {
13682
14884
  // Note that we encountered an unexpected close tag but continue processing the element
13683
14885
  // stack so we can assign an `endSourceSpan` if there is a corresponding start tag for this
13684
14886
  // end tag in the stack.
@@ -13737,16 +14939,92 @@ class _TreeBuilder {
13737
14939
  new ParseSourceSpan(valueStartSpan.start, valueEnd, valueStartSpan.fullStart);
13738
14940
  return new Attribute(fullName, value, new ParseSourceSpan(attrName.sourceSpan.start, attrEnd, attrName.sourceSpan.fullStart), attrName.sourceSpan, valueSpan, valueTokens.length > 0 ? valueTokens : undefined, undefined);
13739
14941
  }
13740
- _getParentElement() {
13741
- return this._elementStack.length > 0 ? this._elementStack[this._elementStack.length - 1] : null;
14942
+ _consumeBlockGroupOpen(token) {
14943
+ const end = this._peek.sourceSpan.fullStart;
14944
+ const span = new ParseSourceSpan(token.sourceSpan.start, end, token.sourceSpan.fullStart);
14945
+ // Create a separate `startSpan` because `span` will be modified when there is an `end` span.
14946
+ const startSpan = new ParseSourceSpan(token.sourceSpan.start, end, token.sourceSpan.fullStart);
14947
+ const blockGroup = new BlockGroup([], span, startSpan, null);
14948
+ this._pushContainer(blockGroup, false);
14949
+ const implicitBlock = this._consumeBlock(token, 26 /* TokenType.BLOCK_GROUP_OPEN_END */);
14950
+ // Block parameters are consumed as a part of the implicit block so we need to expand the
14951
+ // start source span once the block is parsed to include the full opening tag.
14952
+ startSpan.end = implicitBlock.startSourceSpan.end;
14953
+ }
14954
+ _consumeBlock(token, closeToken) {
14955
+ // The start of a block implicitly closes the previous block.
14956
+ this._conditionallyClosePreviousBlock();
14957
+ const parameters = [];
14958
+ while (this._peek.type === 28 /* TokenType.BLOCK_PARAMETER */) {
14959
+ const paramToken = this._advance();
14960
+ parameters.push(new BlockParameter(paramToken.parts[0], paramToken.sourceSpan));
14961
+ }
14962
+ if (this._peek.type === closeToken) {
14963
+ this._advance();
14964
+ }
14965
+ const end = this._peek.sourceSpan.fullStart;
14966
+ const span = new ParseSourceSpan(token.sourceSpan.start, end, token.sourceSpan.fullStart);
14967
+ // Create a separate `startSpan` because `span` will be modified when there is an `end` span.
14968
+ const startSpan = new ParseSourceSpan(token.sourceSpan.start, end, token.sourceSpan.fullStart);
14969
+ const block = new Block(token.parts[0], parameters, [], span, startSpan);
14970
+ const parent = this._getContainer();
14971
+ if (!(parent instanceof BlockGroup)) {
14972
+ this.errors.push(TreeError.create(block.name, block.sourceSpan, 'Blocks can only be placed inside of block groups.'));
14973
+ }
14974
+ else {
14975
+ parent.blocks.push(block);
14976
+ this._containerStack.push(block);
14977
+ }
14978
+ return block;
14979
+ }
14980
+ _consumeBlockGroupClose(token) {
14981
+ const name = token.parts[0];
14982
+ const previousContainer = this._getContainer();
14983
+ // Blocks are implcitly closed by the block group.
14984
+ this._conditionallyClosePreviousBlock();
14985
+ if (!this._popContainer(name, BlockGroup, token.sourceSpan)) {
14986
+ const context = previousContainer instanceof Element ?
14987
+ `There is an unclosed "${previousContainer.name}" HTML tag named that may have to be closed first.` :
14988
+ `The block may have been closed earlier.`;
14989
+ this.errors.push(TreeError.create(name, token.sourceSpan, `Unexpected closing block "${name}". ${context}`));
14990
+ }
14991
+ }
14992
+ _conditionallyClosePreviousBlock() {
14993
+ const container = this._getContainer();
14994
+ if (container instanceof Block) {
14995
+ // Blocks don't have an explicit closing tag, they're closed either by the next block or
14996
+ // the end of the block group. Infer the end span from the last child node.
14997
+ const lastChild = container.children.length ? container.children[container.children.length - 1] : null;
14998
+ const endSpan = lastChild === null ?
14999
+ null :
15000
+ new ParseSourceSpan(lastChild.sourceSpan.end, lastChild.sourceSpan.end);
15001
+ this._popContainer(container.name, Block, endSpan);
15002
+ }
15003
+ }
15004
+ _getContainer() {
15005
+ return this._containerStack.length > 0 ? this._containerStack[this._containerStack.length - 1] :
15006
+ null;
15007
+ }
15008
+ _getClosestParentElement() {
15009
+ for (let i = this._containerStack.length - 1; i > -1; i--) {
15010
+ if (this._containerStack[i] instanceof Element) {
15011
+ return this._containerStack[i];
15012
+ }
15013
+ }
15014
+ return null;
13742
15015
  }
13743
15016
  _addToParent(node) {
13744
- const parent = this._getParentElement();
13745
- if (parent != null) {
13746
- parent.children.push(node);
15017
+ const parent = this._getContainer();
15018
+ if (parent === null) {
15019
+ this.rootNodes.push(node);
15020
+ }
15021
+ else if (parent instanceof BlockGroup) {
15022
+ // Due to how parsing is set up, we're unlikely to hit this code path, but we
15023
+ // have the assertion here just in case and to satisfy the type checker.
15024
+ this.errors.push(TreeError.create(null, node.sourceSpan, 'Block groups can only contain blocks.'));
13747
15025
  }
13748
15026
  else {
13749
- this.rootNodes.push(node);
15027
+ parent.children.push(node);
13750
15028
  }
13751
15029
  }
13752
15030
  _getElementFullName(prefix, localName, parentElement) {
@@ -13804,10 +15082,9 @@ function hasPreserveWhitespacesAttr(attrs) {
13804
15082
  return attrs.some((attr) => attr.name === PRESERVE_WS_ATTR_NAME);
13805
15083
  }
13806
15084
  /**
13807
- * Angular Dart introduced &ngsp; as a placeholder for non-removable space, see:
13808
- * https://github.com/dart-lang/angular/blob/0bb611387d29d65b5af7f9d2515ab571fd3fbee4/_tests/test/compiler/preserve_whitespace_test.dart#L25-L32
13809
- * In Angular Dart &ngsp; is converted to the 0xE500 PUA (Private Use Areas) unicode character
13810
- * and later on replaced by a space. We are re-implementing the same idea here.
15085
+ * &ngsp; is a placeholder for non-removable space
15086
+ * &ngsp; is converted to the 0xE500 PUA (Private Use Areas) unicode character
15087
+ * and later on replaced by a space.
13811
15088
  */
13812
15089
  function replaceNgsp(value) {
13813
15090
  // lexer is replacing the &ngsp; pseudo-entity with NGSP_UNICODE
@@ -13861,6 +15138,15 @@ class WhitespaceVisitor {
13861
15138
  visitExpansionCase(expansionCase, context) {
13862
15139
  return expansionCase;
13863
15140
  }
15141
+ visitBlockGroup(group, context) {
15142
+ return new BlockGroup(visitAllWithSiblings(this, group.blocks), group.sourceSpan, group.startSourceSpan, group.endSourceSpan);
15143
+ }
15144
+ visitBlock(block, context) {
15145
+ return new Block(block.name, block.parameters, visitAllWithSiblings(this, block.children), block.sourceSpan, block.startSourceSpan);
15146
+ }
15147
+ visitBlockParameter(parameter, context) {
15148
+ return parameter;
15149
+ }
13864
15150
  }
13865
15151
  function createWhitespaceProcessedTextToken({ type, parts, sourceSpan }) {
13866
15152
  return { type, parts: [processWhitespace(parts[0])], sourceSpan };
@@ -14118,7 +15404,7 @@ class BindingParser {
14118
15404
  this._parseAnimation(name, expression, sourceSpan, absoluteOffset, keySpan, valueSpan, targetMatchableAttrs, targetProps);
14119
15405
  }
14120
15406
  else {
14121
- this._parsePropertyAst(name, this._parseBinding(expression, isHost, valueSpan || sourceSpan, absoluteOffset), sourceSpan, keySpan, valueSpan, targetMatchableAttrs, targetProps);
15407
+ this._parsePropertyAst(name, this.parseBinding(expression, isHost, valueSpan || sourceSpan, absoluteOffset), sourceSpan, keySpan, valueSpan, targetMatchableAttrs, targetProps);
14122
15408
  }
14123
15409
  }
14124
15410
  parsePropertyInterpolation(name, value, sourceSpan, valueSpan, targetMatchableAttrs, targetProps, keySpan, interpolatedTokens) {
@@ -14140,11 +15426,11 @@ class BindingParser {
14140
15426
  // This will occur when a @trigger is not paired with an expression.
14141
15427
  // For animations it is valid to not have an expression since */void
14142
15428
  // states will be applied by angular when the element is attached/detached
14143
- const ast = this._parseBinding(expression || 'undefined', false, valueSpan || sourceSpan, absoluteOffset);
15429
+ const ast = this.parseBinding(expression || 'undefined', false, valueSpan || sourceSpan, absoluteOffset);
14144
15430
  targetMatchableAttrs.push([name, ast.source]);
14145
15431
  targetProps.push(new ParsedProperty(name, ast, ParsedPropertyType.ANIMATION, sourceSpan, keySpan, valueSpan));
14146
15432
  }
14147
- _parseBinding(value, isHostBinding, sourceSpan, absoluteOffset) {
15433
+ parseBinding(value, isHostBinding, sourceSpan, absoluteOffset) {
14148
15434
  const sourceInfo = (sourceSpan && sourceSpan.start || '(unknown)').toString();
14149
15435
  try {
14150
15436
  const ast = isHostBinding ?
@@ -14263,7 +15549,7 @@ class BindingParser {
14263
15549
  if (ast) {
14264
15550
  this._reportExpressionParserErrors(ast.errors, sourceSpan);
14265
15551
  }
14266
- if (!ast || ast.ast instanceof EmptyExpr) {
15552
+ if (!ast || ast.ast instanceof EmptyExpr$1) {
14267
15553
  this._reportError(`Empty expressions are not allowed`, sourceSpan);
14268
15554
  return this._exprParser.wrapLiteralPrimitive('ERROR', sourceInfo, absoluteOffset);
14269
15555
  }
@@ -14409,6 +15695,415 @@ function normalizeNgContentSelect(selectAttr) {
14409
15695
  return selectAttr;
14410
15696
  }
14411
15697
 
15698
+ /** Pattern for a timing value in a trigger. */
15699
+ const TIME_PATTERN = /^\d+(ms|s)?$/;
15700
+ /** Pattern for a separator between keywords in a trigger expression. */
15701
+ const SEPARATOR_PATTERN = /^\s$/;
15702
+ /** Pairs of characters that form syntax that is comma-delimited. */
15703
+ const COMMA_DELIMITED_SYNTAX = new Map([
15704
+ [$LBRACE, $RBRACE],
15705
+ [$LBRACKET, $RBRACKET],
15706
+ [$LPAREN, $RPAREN], // Function calls
15707
+ ]);
15708
+ /** Possible types of `on` triggers. */
15709
+ var OnTriggerType;
15710
+ (function (OnTriggerType) {
15711
+ OnTriggerType["IDLE"] = "idle";
15712
+ OnTriggerType["TIMER"] = "timer";
15713
+ OnTriggerType["INTERACTION"] = "interaction";
15714
+ OnTriggerType["IMMEDIATE"] = "immediate";
15715
+ OnTriggerType["HOVER"] = "hover";
15716
+ OnTriggerType["VIEWPORT"] = "viewport";
15717
+ })(OnTriggerType || (OnTriggerType = {}));
15718
+ /** Parses a `when` deferred trigger. */
15719
+ function parseWhenTrigger({ expression, sourceSpan }, bindingParser, errors) {
15720
+ const whenIndex = expression.indexOf('when');
15721
+ // This is here just to be safe, we shouldn't enter this function
15722
+ // in the first place if a block doesn't have the "when" keyword.
15723
+ if (whenIndex === -1) {
15724
+ errors.push(new ParseError(sourceSpan, `Could not find "when" keyword in expression`));
15725
+ return null;
15726
+ }
15727
+ const start = getTriggerParametersStart(expression, whenIndex + 1);
15728
+ const parsed = bindingParser.parseBinding(expression.slice(start), false, sourceSpan, sourceSpan.start.offset + start);
15729
+ return new BoundDeferredTrigger(parsed, sourceSpan);
15730
+ }
15731
+ /** Parses an `on` trigger */
15732
+ function parseOnTrigger({ expression, sourceSpan }, errors) {
15733
+ const onIndex = expression.indexOf('on');
15734
+ // This is here just to be safe, we shouldn't enter this function
15735
+ // in the first place if a block doesn't have the "on" keyword.
15736
+ if (onIndex === -1) {
15737
+ errors.push(new ParseError(sourceSpan, `Could not find "on" keyword in expression`));
15738
+ return [];
15739
+ }
15740
+ const start = getTriggerParametersStart(expression, onIndex + 1);
15741
+ return new OnTriggerParser(expression, start, sourceSpan, errors).parse();
15742
+ }
15743
+ class OnTriggerParser {
15744
+ constructor(expression, start, span, errors) {
15745
+ this.expression = expression;
15746
+ this.start = start;
15747
+ this.span = span;
15748
+ this.errors = errors;
15749
+ this.index = 0;
15750
+ this.triggers = [];
15751
+ this.tokens = new Lexer().tokenize(expression.slice(start));
15752
+ }
15753
+ parse() {
15754
+ while (this.tokens.length > 0 && this.index < this.tokens.length) {
15755
+ const token = this.token();
15756
+ if (!token.isIdentifier()) {
15757
+ this.unexpectedToken(token);
15758
+ break;
15759
+ }
15760
+ // An identifier immediately followed by a comma or the end of
15761
+ // the expression cannot have parameters so we can exit early.
15762
+ if (this.isFollowedByOrLast($COMMA)) {
15763
+ this.consumeTrigger(token, []);
15764
+ this.advance();
15765
+ }
15766
+ else if (this.isFollowedByOrLast($LPAREN)) {
15767
+ this.advance(); // Advance to the opening paren.
15768
+ const prevErrors = this.errors.length;
15769
+ const parameters = this.consumeParameters();
15770
+ if (this.errors.length !== prevErrors) {
15771
+ break;
15772
+ }
15773
+ this.consumeTrigger(token, parameters);
15774
+ this.advance(); // Advance past the closing paren.
15775
+ }
15776
+ else if (this.index < this.tokens.length - 1) {
15777
+ this.unexpectedToken(this.tokens[this.index + 1]);
15778
+ }
15779
+ this.advance();
15780
+ }
15781
+ return this.triggers;
15782
+ }
15783
+ advance() {
15784
+ this.index++;
15785
+ }
15786
+ isFollowedByOrLast(char) {
15787
+ if (this.index === this.tokens.length - 1) {
15788
+ return true;
15789
+ }
15790
+ return this.tokens[this.index + 1].isCharacter(char);
15791
+ }
15792
+ token() {
15793
+ return this.tokens[Math.min(this.index, this.tokens.length - 1)];
15794
+ }
15795
+ consumeTrigger(identifier, parameters) {
15796
+ const startSpan = this.span.start.moveBy(this.start + identifier.index - this.tokens[0].index);
15797
+ const endSpan = startSpan.moveBy(this.token().end - identifier.index);
15798
+ const sourceSpan = new ParseSourceSpan(startSpan, endSpan);
15799
+ try {
15800
+ switch (identifier.toString()) {
15801
+ case OnTriggerType.IDLE:
15802
+ this.triggers.push(createIdleTrigger(parameters, sourceSpan));
15803
+ break;
15804
+ case OnTriggerType.TIMER:
15805
+ this.triggers.push(createTimerTrigger(parameters, sourceSpan));
15806
+ break;
15807
+ case OnTriggerType.INTERACTION:
15808
+ this.triggers.push(createInteractionTrigger(parameters, sourceSpan));
15809
+ break;
15810
+ case OnTriggerType.IMMEDIATE:
15811
+ this.triggers.push(createImmediateTrigger(parameters, sourceSpan));
15812
+ break;
15813
+ case OnTriggerType.HOVER:
15814
+ this.triggers.push(createHoverTrigger(parameters, sourceSpan));
15815
+ break;
15816
+ case OnTriggerType.VIEWPORT:
15817
+ this.triggers.push(createViewportTrigger(parameters, sourceSpan));
15818
+ break;
15819
+ default:
15820
+ throw new Error(`Unrecognized trigger type "${identifier}"`);
15821
+ }
15822
+ }
15823
+ catch (e) {
15824
+ this.error(identifier, e.message);
15825
+ }
15826
+ }
15827
+ consumeParameters() {
15828
+ const parameters = [];
15829
+ if (!this.token().isCharacter($LPAREN)) {
15830
+ this.unexpectedToken(this.token());
15831
+ return parameters;
15832
+ }
15833
+ this.advance();
15834
+ const commaDelimStack = [];
15835
+ let current = '';
15836
+ while (this.index < this.tokens.length) {
15837
+ const token = this.token();
15838
+ // Stop parsing if we've hit the end character and we're outside of a comma-delimited syntax.
15839
+ // Note that we don't need to account for strings here since the lexer already parsed them
15840
+ // into string tokens.
15841
+ if (token.isCharacter($RPAREN) && commaDelimStack.length === 0) {
15842
+ if (current.length) {
15843
+ parameters.push(current);
15844
+ }
15845
+ break;
15846
+ }
15847
+ // In the `on` microsyntax "top-level" commas (e.g. ones outside of an parameters) separate
15848
+ // the different triggers (e.g. `on idle,timer(500)`). This is problematic, because the
15849
+ // function-like syntax also implies that multiple parameters can be passed into the
15850
+ // individual trigger (e.g. `on foo(a, b)`). To avoid tripping up the parser with commas that
15851
+ // are part of other sorts of syntax (object literals, arrays), we treat anything inside
15852
+ // a comma-delimited syntax block as plain text.
15853
+ if (token.type === TokenType.Character && COMMA_DELIMITED_SYNTAX.has(token.numValue)) {
15854
+ commaDelimStack.push(COMMA_DELIMITED_SYNTAX.get(token.numValue));
15855
+ }
15856
+ if (commaDelimStack.length > 0 &&
15857
+ token.isCharacter(commaDelimStack[commaDelimStack.length - 1])) {
15858
+ commaDelimStack.pop();
15859
+ }
15860
+ // If we hit a comma outside of a comma-delimited syntax, it means
15861
+ // that we're at the top level and we're starting a new parameter.
15862
+ if (commaDelimStack.length === 0 && token.isCharacter($COMMA) && current.length > 0) {
15863
+ parameters.push(current);
15864
+ current = '';
15865
+ this.advance();
15866
+ continue;
15867
+ }
15868
+ // Otherwise treat the token as a plain text character in the current parameter.
15869
+ current += this.tokenText();
15870
+ this.advance();
15871
+ }
15872
+ if (!this.token().isCharacter($RPAREN) || commaDelimStack.length > 0) {
15873
+ this.error(this.token(), 'Unexpected end of expression');
15874
+ }
15875
+ if (this.index < this.tokens.length - 1 &&
15876
+ !this.tokens[this.index + 1].isCharacter($COMMA)) {
15877
+ this.unexpectedToken(this.tokens[this.index + 1]);
15878
+ }
15879
+ return parameters;
15880
+ }
15881
+ tokenText() {
15882
+ // Tokens have a toString already which we could use, but for string tokens it omits the quotes.
15883
+ // Eventually we could expose this information on the token directly.
15884
+ return this.expression.slice(this.start + this.token().index, this.start + this.token().end);
15885
+ }
15886
+ error(token, message) {
15887
+ const newStart = this.span.start.moveBy(this.start + token.index);
15888
+ const newEnd = newStart.moveBy(token.end - token.index);
15889
+ this.errors.push(new ParseError(new ParseSourceSpan(newStart, newEnd), message));
15890
+ }
15891
+ unexpectedToken(token) {
15892
+ this.error(token, `Unexpected token "${token}"`);
15893
+ }
15894
+ }
15895
+ function createIdleTrigger(parameters, sourceSpan) {
15896
+ if (parameters.length > 0) {
15897
+ throw new Error(`"${OnTriggerType.IDLE}" trigger cannot have parameters`);
15898
+ }
15899
+ return new IdleDeferredTrigger(sourceSpan);
15900
+ }
15901
+ function createTimerTrigger(parameters, sourceSpan) {
15902
+ if (parameters.length !== 1) {
15903
+ throw new Error(`"${OnTriggerType.TIMER}" trigger must have exactly one parameter`);
15904
+ }
15905
+ const delay = parseDeferredTime(parameters[0]);
15906
+ if (delay === null) {
15907
+ throw new Error(`Could not parse time value of trigger "${OnTriggerType.TIMER}"`);
15908
+ }
15909
+ return new TimerDeferredTrigger(delay, sourceSpan);
15910
+ }
15911
+ function createInteractionTrigger(parameters, sourceSpan) {
15912
+ if (parameters.length > 1) {
15913
+ throw new Error(`"${OnTriggerType.INTERACTION}" trigger can only have zero or one parameters`);
15914
+ }
15915
+ return new InteractionDeferredTrigger(parameters[0] ?? null, sourceSpan);
15916
+ }
15917
+ function createImmediateTrigger(parameters, sourceSpan) {
15918
+ if (parameters.length > 0) {
15919
+ throw new Error(`"${OnTriggerType.IMMEDIATE}" trigger cannot have parameters`);
15920
+ }
15921
+ return new ImmediateDeferredTrigger(sourceSpan);
15922
+ }
15923
+ function createHoverTrigger(parameters, sourceSpan) {
15924
+ if (parameters.length > 0) {
15925
+ throw new Error(`"${OnTriggerType.HOVER}" trigger cannot have parameters`);
15926
+ }
15927
+ return new HoverDeferredTrigger(sourceSpan);
15928
+ }
15929
+ function createViewportTrigger(parameters, sourceSpan) {
15930
+ // TODO: the RFC has some more potential parameters for `viewport`.
15931
+ if (parameters.length > 1) {
15932
+ throw new Error(`"${OnTriggerType.VIEWPORT}" trigger can only have zero or one parameters`);
15933
+ }
15934
+ return new ViewportDeferredTrigger(parameters[0] ?? null, sourceSpan);
15935
+ }
15936
+ /** Gets the index within an expression at which the trigger parameters start. */
15937
+ function getTriggerParametersStart(value, startPosition = 0) {
15938
+ let hasFoundSeparator = false;
15939
+ for (let i = startPosition; i < value.length; i++) {
15940
+ if (SEPARATOR_PATTERN.test(value[i])) {
15941
+ hasFoundSeparator = true;
15942
+ }
15943
+ else if (hasFoundSeparator) {
15944
+ return i;
15945
+ }
15946
+ }
15947
+ return -1;
15948
+ }
15949
+ /**
15950
+ * Parses a time expression from a deferred trigger to
15951
+ * milliseconds. Returns null if it cannot be parsed.
15952
+ */
15953
+ function parseDeferredTime(value) {
15954
+ const match = value.match(TIME_PATTERN);
15955
+ if (!match) {
15956
+ return null;
15957
+ }
15958
+ const [time, units] = match;
15959
+ return parseInt(time) * (units === 's' ? 1000 : 1);
15960
+ }
15961
+
15962
+ /** Pattern to identify a `prefetch when` trigger. */
15963
+ const PREFETCH_WHEN_PATTERN = /^prefetch\s+when\s/;
15964
+ /** Pattern to identify a `prefetch on` trigger. */
15965
+ const PREFETCH_ON_PATTERN = /^prefetch\s+on\s/;
15966
+ /** Pattern to identify a `minimum` parameter in a block. */
15967
+ const MINIMUM_PARAMETER_PATTERN = /^minimum\s/;
15968
+ /** Pattern to identify a `after` parameter in a block. */
15969
+ const AFTER_PARAMETER_PATTERN = /^after\s/;
15970
+ /** Pattern to identify a `when` parameter in a block. */
15971
+ const WHEN_PARAMETER_PATTERN = /^when\s/;
15972
+ /** Pattern to identify a `on` parameter in a block. */
15973
+ const ON_PARAMETER_PATTERN = /^on\s/;
15974
+ /** Possible types of secondary deferred blocks. */
15975
+ var SecondaryDeferredBlockType;
15976
+ (function (SecondaryDeferredBlockType) {
15977
+ SecondaryDeferredBlockType["PLACEHOLDER"] = "placeholder";
15978
+ SecondaryDeferredBlockType["LOADING"] = "loading";
15979
+ SecondaryDeferredBlockType["ERROR"] = "error";
15980
+ })(SecondaryDeferredBlockType || (SecondaryDeferredBlockType = {}));
15981
+ /** Creates a deferred block from an HTML AST node. */
15982
+ function createDeferredBlock(ast, visitor, bindingParser) {
15983
+ const errors = [];
15984
+ const [primaryBlock, ...secondaryBlocks] = ast.blocks;
15985
+ const { triggers, prefetchTriggers } = parsePrimaryTriggers(primaryBlock.parameters, bindingParser, errors);
15986
+ const { placeholder, loading, error } = parseSecondaryBlocks(secondaryBlocks, errors, visitor);
15987
+ return {
15988
+ node: new DeferredBlock(visitAll(visitor, primaryBlock.children), triggers, prefetchTriggers, placeholder, loading, error, ast.sourceSpan, ast.startSourceSpan, ast.endSourceSpan),
15989
+ errors,
15990
+ };
15991
+ }
15992
+ function parseSecondaryBlocks(blocks, errors, visitor) {
15993
+ let placeholder = null;
15994
+ let loading = null;
15995
+ let error = null;
15996
+ for (const block of blocks) {
15997
+ try {
15998
+ switch (block.name) {
15999
+ case SecondaryDeferredBlockType.PLACEHOLDER:
16000
+ if (placeholder !== null) {
16001
+ errors.push(new ParseError(block.startSourceSpan, `"defer" block can only have one "${SecondaryDeferredBlockType.PLACEHOLDER}" block`));
16002
+ }
16003
+ else {
16004
+ placeholder = parsePlaceholderBlock(block, visitor);
16005
+ }
16006
+ break;
16007
+ case SecondaryDeferredBlockType.LOADING:
16008
+ if (loading !== null) {
16009
+ errors.push(new ParseError(block.startSourceSpan, `"defer" block can only have one "${SecondaryDeferredBlockType.LOADING}" block`));
16010
+ }
16011
+ else {
16012
+ loading = parseLoadingBlock(block, visitor);
16013
+ }
16014
+ break;
16015
+ case SecondaryDeferredBlockType.ERROR:
16016
+ if (error !== null) {
16017
+ errors.push(new ParseError(block.startSourceSpan, `"defer" block can only have one "${SecondaryDeferredBlockType.ERROR}" block`));
16018
+ }
16019
+ else {
16020
+ error = parseErrorBlock(block, visitor);
16021
+ }
16022
+ break;
16023
+ default:
16024
+ errors.push(new ParseError(block.startSourceSpan, `Unrecognized block "${block.name}"`));
16025
+ break;
16026
+ }
16027
+ }
16028
+ catch (e) {
16029
+ errors.push(new ParseError(block.startSourceSpan, e.message));
16030
+ }
16031
+ }
16032
+ return { placeholder, loading, error };
16033
+ }
16034
+ function parsePlaceholderBlock(ast, visitor) {
16035
+ let minimumTime = null;
16036
+ for (const param of ast.parameters) {
16037
+ if (MINIMUM_PARAMETER_PATTERN.test(param.expression)) {
16038
+ const parsedTime = parseDeferredTime(param.expression.slice(getTriggerParametersStart(param.expression)));
16039
+ if (parsedTime === null) {
16040
+ throw new Error(`Could not parse time value of parameter "minimum"`);
16041
+ }
16042
+ minimumTime = parsedTime;
16043
+ }
16044
+ else {
16045
+ throw new Error(`Unrecognized parameter in "${SecondaryDeferredBlockType.PLACEHOLDER}" block: "${param.expression}"`);
16046
+ }
16047
+ }
16048
+ return new DeferredBlockPlaceholder(visitAll(visitor, ast.children), minimumTime, ast.sourceSpan, ast.startSourceSpan, ast.endSourceSpan);
16049
+ }
16050
+ function parseLoadingBlock(ast, visitor) {
16051
+ let afterTime = null;
16052
+ let minimumTime = null;
16053
+ for (const param of ast.parameters) {
16054
+ if (AFTER_PARAMETER_PATTERN.test(param.expression)) {
16055
+ const parsedTime = parseDeferredTime(param.expression.slice(getTriggerParametersStart(param.expression)));
16056
+ if (parsedTime === null) {
16057
+ throw new Error(`Could not parse time value of parameter "after"`);
16058
+ }
16059
+ afterTime = parsedTime;
16060
+ }
16061
+ else if (MINIMUM_PARAMETER_PATTERN.test(param.expression)) {
16062
+ const parsedTime = parseDeferredTime(param.expression.slice(getTriggerParametersStart(param.expression)));
16063
+ if (parsedTime === null) {
16064
+ throw new Error(`Could not parse time value of parameter "minimum"`);
16065
+ }
16066
+ minimumTime = parsedTime;
16067
+ }
16068
+ else {
16069
+ throw new Error(`Unrecognized parameter in "${SecondaryDeferredBlockType.LOADING}" block: "${param.expression}"`);
16070
+ }
16071
+ }
16072
+ return new DeferredBlockLoading(visitAll(visitor, ast.children), afterTime, minimumTime, ast.sourceSpan, ast.startSourceSpan, ast.endSourceSpan);
16073
+ }
16074
+ function parseErrorBlock(ast, visitor) {
16075
+ if (ast.parameters.length > 0) {
16076
+ throw new Error(`"${SecondaryDeferredBlockType.ERROR}" block cannot have parameters`);
16077
+ }
16078
+ return new DeferredBlockError(visitAll(visitor, ast.children), ast.sourceSpan, ast.startSourceSpan, ast.endSourceSpan);
16079
+ }
16080
+ function parsePrimaryTriggers(params, bindingParser, errors) {
16081
+ const triggers = [];
16082
+ const prefetchTriggers = [];
16083
+ for (const param of params) {
16084
+ // The lexer ignores the leading spaces so we can assume
16085
+ // that the expression starts with a keyword.
16086
+ if (WHEN_PARAMETER_PATTERN.test(param.expression)) {
16087
+ const result = parseWhenTrigger(param, bindingParser, errors);
16088
+ result !== null && triggers.push(result);
16089
+ }
16090
+ else if (ON_PARAMETER_PATTERN.test(param.expression)) {
16091
+ triggers.push(...parseOnTrigger(param, errors));
16092
+ }
16093
+ else if (PREFETCH_WHEN_PATTERN.test(param.expression)) {
16094
+ const result = parseWhenTrigger(param, bindingParser, errors);
16095
+ result !== null && prefetchTriggers.push(result);
16096
+ }
16097
+ else if (PREFETCH_ON_PATTERN.test(param.expression)) {
16098
+ prefetchTriggers.push(...parseOnTrigger(param, errors));
16099
+ }
16100
+ else {
16101
+ errors.push(new ParseError(param.sourceSpan, 'Unrecognized trigger'));
16102
+ }
16103
+ }
16104
+ return { triggers, prefetchTriggers };
16105
+ }
16106
+
14412
16107
  const BIND_NAME_REGEXP = /^(?:(bind-)|(let-)|(ref-|#)|(on-)|(bindon-)|(@))(.*)$/;
14413
16108
  // Group 1 = "bind-"
14414
16109
  const KW_BIND_IDX = 1;
@@ -14532,7 +16227,16 @@ class HtmlAstToIvyAst {
14532
16227
  attributes.push(this.visitAttribute(attribute));
14533
16228
  }
14534
16229
  }
14535
- const children = visitAll(preparsedElement.nonBindable ? NON_BINDABLE_VISITOR : this, element.children);
16230
+ let children;
16231
+ if (preparsedElement.nonBindable) {
16232
+ // The `NonBindableVisitor` may need to return an array of nodes for block groups so we need
16233
+ // to flatten the array here. Avoid doing this for the `HtmlAstToIvyAst` since `flat` creates
16234
+ // a new array.
16235
+ children = visitAll(NON_BINDABLE_VISITOR, element.children).flat(Infinity);
16236
+ }
16237
+ else {
16238
+ children = visitAll(this, element.children);
16239
+ }
14536
16240
  let parsedElement;
14537
16241
  if (preparsedElement.type === PreparsedElementType.NG_CONTENT) {
14538
16242
  // `<ng-content>`
@@ -14630,6 +16334,23 @@ class HtmlAstToIvyAst {
14630
16334
  }
14631
16335
  return null;
14632
16336
  }
16337
+ visitBlockGroup(group, context) {
16338
+ const primaryBlock = group.blocks[0];
16339
+ // The HTML parser ensures that we don't hit this case, but we have an assertion just in case.
16340
+ if (!primaryBlock) {
16341
+ this.reportError('Block group must have at least one block.', group.sourceSpan);
16342
+ return null;
16343
+ }
16344
+ if (primaryBlock.name === 'defer' && this.options.enabledBlockTypes.has(primaryBlock.name)) {
16345
+ const { node, errors } = createDeferredBlock(group, this, this.bindingParser);
16346
+ this.errors.push(...errors);
16347
+ return node;
16348
+ }
16349
+ this.reportError(`Unrecognized block "${primaryBlock.name}".`, primaryBlock.sourceSpan);
16350
+ return null;
16351
+ }
16352
+ visitBlock(block, context) { }
16353
+ visitBlockParameter(parameter, context) { }
14633
16354
  // convert view engine `ParsedProperty` to a format suitable for IVY
14634
16355
  extractAttributes(elementName, properties, i18nPropsMeta) {
14635
16356
  const bound = [];
@@ -14807,6 +16528,25 @@ class NonBindableVisitor {
14807
16528
  visitExpansionCase(expansionCase) {
14808
16529
  return null;
14809
16530
  }
16531
+ visitBlockGroup(group, context) {
16532
+ const nodes = visitAll(this, group.blocks);
16533
+ // We only need to do the end tag since the start will be added as a part of the primary block.
16534
+ if (group.endSourceSpan !== null) {
16535
+ nodes.push(new Text$3(group.endSourceSpan.toString(), group.endSourceSpan));
16536
+ }
16537
+ return nodes;
16538
+ }
16539
+ visitBlock(block, context) {
16540
+ return [
16541
+ // In an ngNonBindable context we treat the opening/closing tags of block as plain text.
16542
+ // This is the as if the `tokenizeBlocks` option was disabled.
16543
+ new Text$3(block.startSourceSpan.toString(), block.startSourceSpan),
16544
+ ...visitAll(this, block.children)
16545
+ ];
16546
+ }
16547
+ visitBlockParameter(parameter, context) {
16548
+ return null;
16549
+ }
14810
16550
  }
14811
16551
  const NON_BINDABLE_VISITOR = new NonBindableVisitor();
14812
16552
  function normalizeAttributeName(attrName) {
@@ -15254,6 +16994,17 @@ class _I18nVisitor {
15254
16994
  visitExpansionCase(_icuCase, _context) {
15255
16995
  throw new Error('Unreachable code');
15256
16996
  }
16997
+ visitBlockGroup(group, context) {
16998
+ const children = visitAll(this, group.blocks, context);
16999
+ const node = new Container(children, group.sourceSpan);
17000
+ return context.visitNodeFn(group, node);
17001
+ }
17002
+ visitBlock(block, context) {
17003
+ const children = visitAll(this, block.children, context);
17004
+ const node = new Container(children, block.sourceSpan);
17005
+ return context.visitNodeFn(block, node);
17006
+ }
17007
+ visitBlockParameter(_parameter, _context) { }
15257
17008
  /**
15258
17009
  * Convert, text and interpolated tokens up into text and placeholder pieces.
15259
17010
  *
@@ -15397,12 +17148,11 @@ class I18nMetaVisitor {
15397
17148
  // whether visited nodes contain i18n information
15398
17149
  this.hasI18nMeta = false;
15399
17150
  this._errors = [];
15400
- // i18n message generation factory
15401
- this._createI18nMessage = createI18nMessageFactory(this.interpolationConfig);
15402
17151
  }
15403
17152
  _generateI18nMessage(nodes, meta = '', visitNodeFn) {
15404
17153
  const { meaning, description, customId } = this._parseMetadata(meta);
15405
- const message = this._createI18nMessage(nodes, meaning, description, customId, visitNodeFn);
17154
+ const createI18nMessage = createI18nMessageFactory(this.interpolationConfig);
17155
+ const message = createI18nMessage(nodes, meaning, description, customId, visitNodeFn);
15406
17156
  this._setMessageId(message, meta);
15407
17157
  this._setLegacyIds(message, meta);
15408
17158
  return message;
@@ -15501,6 +17251,17 @@ class I18nMetaVisitor {
15501
17251
  visitExpansionCase(expansionCase) {
15502
17252
  return expansionCase;
15503
17253
  }
17254
+ visitBlockGroup(group, context) {
17255
+ visitAll(this, group.blocks, context);
17256
+ return group;
17257
+ }
17258
+ visitBlock(block, context) {
17259
+ visitAll(this, block.children, context);
17260
+ return block;
17261
+ }
17262
+ visitBlockParameter(parameter, context) {
17263
+ return parameter;
17264
+ }
15504
17265
  /**
15505
17266
  * Parse the general form `meta` passed into extract the explicit metadata needed to create a
15506
17267
  * `Message`.
@@ -15882,7 +17643,7 @@ function createComponentDefConsts() {
15882
17643
  };
15883
17644
  }
15884
17645
  class TemplateDefinitionBuilder {
15885
- constructor(constantPool, parentBindingScope, level = 0, contextName, i18nContext, templateIndex, templateName, _namespace, relativeContextFilePath, i18nUseExternalIds, _constants = createComponentDefConsts()) {
17646
+ constructor(constantPool, parentBindingScope, level = 0, contextName, i18nContext, templateIndex, templateName, _namespace, relativeContextFilePath, i18nUseExternalIds, deferBlocks, _constants = createComponentDefConsts()) {
15886
17647
  this.constantPool = constantPool;
15887
17648
  this.level = level;
15888
17649
  this.contextName = contextName;
@@ -15891,6 +17652,7 @@ class TemplateDefinitionBuilder {
15891
17652
  this.templateName = templateName;
15892
17653
  this._namespace = _namespace;
15893
17654
  this.i18nUseExternalIds = i18nUseExternalIds;
17655
+ this.deferBlocks = deferBlocks;
15894
17656
  this._constants = _constants;
15895
17657
  this._dataIndex = 0;
15896
17658
  this._bindingContext = 0;
@@ -16093,7 +17855,7 @@ class TemplateDefinitionBuilder {
16093
17855
  else {
16094
17856
  const value = prop.value.visit(this._valueConverter);
16095
17857
  this.allocateBindingSlots(value);
16096
- if (value instanceof Interpolation) {
17858
+ if (value instanceof Interpolation$1) {
16097
17859
  const { strings, expressions } = value;
16098
17860
  const { id, bindings } = this.i18n;
16099
17861
  const label = assembleI18nBoundString(strings, bindings.size, id);
@@ -16213,7 +17975,7 @@ class TemplateDefinitionBuilder {
16213
17975
  const message = attr.i18n;
16214
17976
  const converted = attr.value.visit(this._valueConverter);
16215
17977
  this.allocateBindingSlots(converted);
16216
- if (converted instanceof Interpolation) {
17978
+ if (converted instanceof Interpolation$1) {
16217
17979
  const placeholders = assembleBoundTextPlaceholders(message);
16218
17980
  const params = placeholdersToParams(placeholders);
16219
17981
  i18nAttrArgs.push(literal(attr.name), this.i18nTranslate(message, params));
@@ -16433,7 +18195,7 @@ class TemplateDefinitionBuilder {
16433
18195
  }
16434
18196
  this.allocateBindingSlots(value);
16435
18197
  if (inputType === 0 /* BindingType.Property */) {
16436
- if (value instanceof Interpolation) {
18198
+ if (value instanceof Interpolation$1) {
16437
18199
  // prop="{{value}}" and friends
16438
18200
  this.interpolatedUpdateInstruction(getPropertyInterpolationExpression(value), elementIndex, attrName, input, value, params);
16439
18201
  }
@@ -16447,12 +18209,12 @@ class TemplateDefinitionBuilder {
16447
18209
  }
16448
18210
  }
16449
18211
  else if (inputType === 1 /* BindingType.Attribute */) {
16450
- if (value instanceof Interpolation && getInterpolationArgsLength(value) > 1) {
18212
+ if (value instanceof Interpolation$1 && getInterpolationArgsLength(value) > 1) {
16451
18213
  // attr.name="text{{value}}" and friends
16452
18214
  this.interpolatedUpdateInstruction(getAttributeInterpolationExpression(value), elementIndex, attrName, input, value, params);
16453
18215
  }
16454
18216
  else {
16455
- const boundValue = value instanceof Interpolation ? value.expressions[0] : value;
18217
+ const boundValue = value instanceof Interpolation$1 ? value.expressions[0] : value;
16456
18218
  // [attr.name]="value" or attr.name="{{value}}"
16457
18219
  // Collect the attribute bindings so that they can be chained at the end.
16458
18220
  attributeBindings.push({
@@ -16522,7 +18284,7 @@ class TemplateDefinitionBuilder {
16522
18284
  parameters.push(importExpr(Identifiers.templateRefExtractor));
16523
18285
  }
16524
18286
  // Create the template function
16525
- const templateVisitor = new TemplateDefinitionBuilder(this.constantPool, this._bindingScope, this.level + 1, contextName, this.i18n, templateIndex, templateName, this._namespace, this.fileBasedI18nSuffix, this.i18nUseExternalIds, this._constants);
18287
+ const templateVisitor = new TemplateDefinitionBuilder(this.constantPool, this._bindingScope, this.level + 1, contextName, this.i18n, templateIndex, templateName, this._namespace, this.fileBasedI18nSuffix, this.i18nUseExternalIds, this.deferBlocks, this._constants);
16526
18288
  // Nested templates must not be visited until after their parent templates have completed
16527
18289
  // processing, so they are queued here until after the initial pass. Otherwise, we wouldn't
16528
18290
  // be able to support bindings in nested templates to local refs that occur after the
@@ -16565,7 +18327,7 @@ class TemplateDefinitionBuilder {
16565
18327
  if (this.i18n) {
16566
18328
  const value = text.value.visit(this._valueConverter);
16567
18329
  this.allocateBindingSlots(value);
16568
- if (value instanceof Interpolation) {
18330
+ if (value instanceof Interpolation$1) {
16569
18331
  this.i18n.appendBoundText(text.i18n);
16570
18332
  this.i18nAppendBindings(value.expressions);
16571
18333
  }
@@ -16575,7 +18337,7 @@ class TemplateDefinitionBuilder {
16575
18337
  this.creationInstruction(text.sourceSpan, Identifiers.text, [literal(nodeIndex)]);
16576
18338
  const value = text.value.visit(this._valueConverter);
16577
18339
  this.allocateBindingSlots(value);
16578
- if (value instanceof Interpolation) {
18340
+ if (value instanceof Interpolation$1) {
16579
18341
  this.updateInstructionWithAdvance(nodeIndex, text.sourceSpan, getTextInterpolationExpression(value), () => this.getUpdateInstructionArguments(value));
16580
18342
  }
16581
18343
  else {
@@ -16632,6 +18394,47 @@ class TemplateDefinitionBuilder {
16632
18394
  }
16633
18395
  return null;
16634
18396
  }
18397
+ visitDeferredBlock(deferred) {
18398
+ const templateIndex = this.allocateDataSlot();
18399
+ const deferredDeps = this.deferBlocks.get(deferred);
18400
+ const contextName = `${this.contextName}_Defer_${templateIndex}`;
18401
+ const depsFnName = `${contextName}_DepsFn`;
18402
+ const parameters = [
18403
+ literal(templateIndex),
18404
+ deferredDeps ? variable(depsFnName) : TYPED_NULL_EXPR,
18405
+ ];
18406
+ if (deferredDeps) {
18407
+ // This defer block has deps for which we need to generate dynamic imports.
18408
+ const dependencyExp = [];
18409
+ for (const deferredDep of deferredDeps) {
18410
+ if (deferredDep.isDeferrable) {
18411
+ // Callback function, e.g. `function(m) { return m.MyCmp; }`.
18412
+ const innerFn = fn([new FnParam('m', DYNAMIC_TYPE)], [new ReturnStatement(variable('m').prop(deferredDep.symbolName))]);
18413
+ const fileName = deferredDep.importPath;
18414
+ // Dynamic import, e.g. `import('./a').then(...)`.
18415
+ const importExpr = (new DynamicImportExpr(fileName)).prop('then').callFn([innerFn]);
18416
+ dependencyExp.push(importExpr);
18417
+ }
18418
+ else {
18419
+ // Non-deferrable symbol, just use a reference to the type.
18420
+ dependencyExp.push(deferredDep.type);
18421
+ }
18422
+ }
18423
+ const depsFnBody = [];
18424
+ depsFnBody.push(new ReturnStatement(literalArr(dependencyExp)));
18425
+ const depsFnExpr = fn([] /* args */, depsFnBody, INFERRED_TYPE, null, depsFnName);
18426
+ this.constantPool.statements.push(depsFnExpr.toDeclStmt(depsFnName));
18427
+ }
18428
+ // e.g. `defer(1, MyComp_Defer_1_DepsFn, ...)`
18429
+ this.creationInstruction(deferred.sourceSpan, Identifiers.defer, () => {
18430
+ return trimTrailingNulls(parameters);
18431
+ });
18432
+ }
18433
+ // TODO: implement nested deferred block instructions.
18434
+ visitDeferredTrigger(trigger) { }
18435
+ visitDeferredBlockPlaceholder(block) { }
18436
+ visitDeferredBlockError(block) { }
18437
+ visitDeferredBlockLoading(block) { }
16635
18438
  allocateDataSlot() {
16636
18439
  return this._dataIndex++;
16637
18440
  }
@@ -16663,7 +18466,7 @@ class TemplateDefinitionBuilder {
16663
18466
  continue;
16664
18467
  }
16665
18468
  this.allocateBindingSlots(value);
16666
- if (value instanceof Interpolation) {
18469
+ if (value instanceof Interpolation$1) {
16667
18470
  // Params typically contain attribute namespace and value sanitizer, which is applicable
16668
18471
  // for regular HTML elements, but not applicable for <ng-template> (since props act as
16669
18472
  // inputs to directives), so keep params array empty.
@@ -16695,7 +18498,7 @@ class TemplateDefinitionBuilder {
16695
18498
  if (instruction) {
16696
18499
  for (const call of instruction.calls) {
16697
18500
  allocateBindingSlots += call.allocateBindingSlots;
16698
- this.updateInstructionWithAdvance(elementIndex, call.sourceSpan, instruction.reference, () => call.params(value => (call.supportsInterpolation && value instanceof Interpolation) ?
18501
+ this.updateInstructionWithAdvance(elementIndex, call.sourceSpan, instruction.reference, () => call.params(value => (call.supportsInterpolation && value instanceof Interpolation$1) ?
16699
18502
  this.getUpdateInstructionArguments(value) :
16700
18503
  this.convertPropertyBinding(value)));
16701
18504
  }
@@ -16728,7 +18531,7 @@ class TemplateDefinitionBuilder {
16728
18531
  return originalSlots;
16729
18532
  }
16730
18533
  allocateBindingSlots(value) {
16731
- this._bindingSlots += value instanceof Interpolation ? value.expressions.length : 1;
18534
+ this._bindingSlots += value instanceof Interpolation$1 ? value.expressions.length : 1;
16732
18535
  }
16733
18536
  /**
16734
18537
  * Gets an expression that refers to the implicit receiver. The implicit
@@ -17350,7 +19153,12 @@ function parseTemplate(template, templateUrl, options = {}) {
17350
19153
  const { interpolationConfig, preserveWhitespaces, enableI18nLegacyMessageIdFormat } = options;
17351
19154
  const bindingParser = makeBindingParser(interpolationConfig);
17352
19155
  const htmlParser = new HtmlParser();
17353
- const parseResult = htmlParser.parse(template, templateUrl, { leadingTriviaChars: LEADING_TRIVIA_CHARS, ...options, tokenizeExpansionForms: true });
19156
+ const parseResult = htmlParser.parse(template, templateUrl, {
19157
+ leadingTriviaChars: LEADING_TRIVIA_CHARS,
19158
+ ...options,
19159
+ tokenizeExpansionForms: true,
19160
+ tokenizeBlocks: options.enabledBlockTypes != null && options.enabledBlockTypes.size > 0,
19161
+ });
17354
19162
  if (!options.alwaysAttemptHtmlToR3AstConversion && parseResult.errors &&
17355
19163
  parseResult.errors.length > 0) {
17356
19164
  const parsedTemplate = {
@@ -17401,7 +19209,10 @@ function parseTemplate(template, templateUrl, options = {}) {
17401
19209
  rootNodes = visitAll(new I18nMetaVisitor(interpolationConfig, /* keepI18nAttrs */ false), rootNodes);
17402
19210
  }
17403
19211
  }
17404
- const { nodes, errors, styleUrls, styles, ngContentSelectors, commentNodes } = htmlAstToRender3Ast(rootNodes, bindingParser, { collectCommentNodes: !!options.collectCommentNodes });
19212
+ const { nodes, errors, styleUrls, styles, ngContentSelectors, commentNodes } = htmlAstToRender3Ast(rootNodes, bindingParser, {
19213
+ collectCommentNodes: !!options.collectCommentNodes,
19214
+ enabledBlockTypes: options.enabledBlockTypes || new Set(),
19215
+ });
17405
19216
  errors.push(...parseResult.errors, ...i18nMetaResult.errors);
17406
19217
  const parsedTemplate = {
17407
19218
  interpolationConfig,
@@ -17548,7 +19359,7 @@ function baseDirectiveFields(meta, constantPool, bindingParser) {
17548
19359
  const definitionMap = new DefinitionMap();
17549
19360
  const selectors = parseSelectorToR3Selector(meta.selector);
17550
19361
  // e.g. `type: MyDirective`
17551
- definitionMap.set('type', meta.internalType);
19362
+ definitionMap.set('type', meta.type.value);
17552
19363
  // e.g. `selectors: [['', 'someDir', '']]`
17553
19364
  if (selectors.length > 0) {
17554
19365
  definitionMap.set('selectors', asLiteral(selectors));
@@ -17563,15 +19374,18 @@ function baseDirectiveFields(meta, constantPool, bindingParser) {
17563
19374
  // e.g. `hostBindings: (rf, ctx) => { ... }
17564
19375
  definitionMap.set('hostBindings', createHostBindingsFunction(meta.host, meta.typeSourceSpan, bindingParser, constantPool, meta.selector || '', meta.name, definitionMap));
17565
19376
  // e.g 'inputs: {a: 'a'}`
17566
- definitionMap.set('inputs', conditionallyCreateMapObjectLiteral(meta.inputs, true));
19377
+ definitionMap.set('inputs', conditionallyCreateDirectiveBindingLiteral(meta.inputs, true));
17567
19378
  // e.g 'outputs: {a: 'a'}`
17568
- definitionMap.set('outputs', conditionallyCreateMapObjectLiteral(meta.outputs));
19379
+ definitionMap.set('outputs', conditionallyCreateDirectiveBindingLiteral(meta.outputs));
17569
19380
  if (meta.exportAs !== null) {
17570
19381
  definitionMap.set('exportAs', literalArr(meta.exportAs.map(e => literal(e))));
17571
19382
  }
17572
19383
  if (meta.isStandalone) {
17573
19384
  definitionMap.set('standalone', literal(true));
17574
19385
  }
19386
+ if (meta.isSignal) {
19387
+ definitionMap.set('signals', literal(true));
19388
+ }
17575
19389
  return definitionMap;
17576
19390
  }
17577
19391
  /**
@@ -17582,6 +19396,7 @@ function addFeatures(definitionMap, meta) {
17582
19396
  const features = [];
17583
19397
  const providers = meta.providers;
17584
19398
  const viewProviders = meta.viewProviders;
19399
+ const inputKeys = Object.keys(meta.inputs);
17585
19400
  if (providers || viewProviders) {
17586
19401
  const args = [providers || new LiteralArrayExpr([])];
17587
19402
  if (viewProviders) {
@@ -17589,6 +19404,12 @@ function addFeatures(definitionMap, meta) {
17589
19404
  }
17590
19405
  features.push(importExpr(Identifiers.ProvidersFeature).callFn(args));
17591
19406
  }
19407
+ for (const key of inputKeys) {
19408
+ if (meta.inputs[key].transformFunction !== null) {
19409
+ features.push(importExpr(Identifiers.InputTransformsFeatureFeature));
19410
+ break;
19411
+ }
19412
+ }
17592
19413
  if (meta.usesInheritance) {
17593
19414
  features.push(importExpr(Identifiers.InheritDefinitionFeature));
17594
19415
  }
@@ -17640,34 +19461,43 @@ function compileComponentFromMetadata(meta, constantPool, bindingParser) {
17640
19461
  const templateTypeName = meta.name;
17641
19462
  const templateName = templateTypeName ? `${templateTypeName}_Template` : null;
17642
19463
  const changeDetection = meta.changeDetection;
17643
- const template = meta.template;
17644
- const templateBuilder = new TemplateDefinitionBuilder(constantPool, BindingScope.createRootScope(), 0, templateTypeName, null, null, templateName, Identifiers.namespaceHTML, meta.relativeContextFilePath, meta.i18nUseExternalIds);
17645
- const templateFunctionExpression = templateBuilder.buildTemplateFunction(template.nodes, []);
17646
- // We need to provide this so that dynamically generated components know what
17647
- // projected content blocks to pass through to the component when it is instantiated.
17648
- const ngContentSelectors = templateBuilder.getNgContentSelectors();
17649
- if (ngContentSelectors) {
17650
- definitionMap.set('ngContentSelectors', ngContentSelectors);
17651
- }
17652
- // e.g. `decls: 2`
17653
- definitionMap.set('decls', literal(templateBuilder.getConstCount()));
17654
- // e.g. `vars: 2`
17655
- definitionMap.set('vars', literal(templateBuilder.getVarCount()));
17656
- // Generate `consts` section of ComponentDef:
17657
- // - either as an array:
17658
- // `consts: [['one', 'two'], ['three', 'four']]`
17659
- // - or as a factory function in case additional statements are present (to support i18n):
17660
- // `consts: function() { var i18n_0; if (ngI18nClosureMode) {...} else {...} return [i18n_0]; }`
17661
- const { constExpressions, prepareStatements } = templateBuilder.getConsts();
17662
- if (constExpressions.length > 0) {
17663
- let constsExpr = literalArr(constExpressions);
17664
- // Prepare statements are present - turn `consts` into a function.
17665
- if (prepareStatements.length > 0) {
17666
- constsExpr = fn([], [...prepareStatements, new ReturnStatement(constsExpr)]);
17667
- }
17668
- definitionMap.set('consts', constsExpr);
17669
- }
17670
- definitionMap.set('template', templateFunctionExpression);
19464
+ // Template compilation is currently conditional as we're in the process of rewriting it.
19465
+ {
19466
+ // This is the main path currently used in compilation, which compiles the template with the
19467
+ // legacy `TemplateDefinitionBuilder`.
19468
+ const template = meta.template;
19469
+ const templateBuilder = new TemplateDefinitionBuilder(constantPool, BindingScope.createRootScope(), 0, templateTypeName, null, null, templateName, Identifiers.namespaceHTML, meta.relativeContextFilePath, meta.i18nUseExternalIds, meta.deferBlocks);
19470
+ const templateFunctionExpression = templateBuilder.buildTemplateFunction(template.nodes, []);
19471
+ // We need to provide this so that dynamically generated components know what
19472
+ // projected content blocks to pass through to the component when it is
19473
+ // instantiated.
19474
+ const ngContentSelectors = templateBuilder.getNgContentSelectors();
19475
+ if (ngContentSelectors) {
19476
+ definitionMap.set('ngContentSelectors', ngContentSelectors);
19477
+ }
19478
+ // e.g. `decls: 2`
19479
+ // definitionMap.set('decls', o.literal(tpl.root.decls!));
19480
+ definitionMap.set('decls', literal(templateBuilder.getConstCount()));
19481
+ // e.g. `vars: 2`
19482
+ // definitionMap.set('vars', o.literal(tpl.root.vars!));
19483
+ definitionMap.set('vars', literal(templateBuilder.getVarCount()));
19484
+ // Generate `consts` section of ComponentDef:
19485
+ // - either as an array:
19486
+ // `consts: [['one', 'two'], ['three', 'four']]`
19487
+ // - or as a factory function in case additional statements are present (to support i18n):
19488
+ // `consts: function() { var i18n_0; if (ngI18nClosureMode) {...} else {...} return [i18n_0];
19489
+ // }`
19490
+ const { constExpressions, prepareStatements } = templateBuilder.getConsts();
19491
+ if (constExpressions.length > 0) {
19492
+ let constsExpr = literalArr(constExpressions);
19493
+ // Prepare statements are present - turn `consts` into a function.
19494
+ if (prepareStatements.length > 0) {
19495
+ constsExpr = fn([], [...prepareStatements, new ReturnStatement(constsExpr)]);
19496
+ }
19497
+ definitionMap.set('consts', constsExpr);
19498
+ }
19499
+ definitionMap.set('template', templateFunctionExpression);
19500
+ }
17671
19501
  if (meta.declarations.length > 0) {
17672
19502
  definitionMap.set('dependencies', compileDeclarationList(literalArr(meta.declarations.map(decl => decl.type)), meta.declarationListEmitMode));
17673
19503
  }
@@ -17718,6 +19548,12 @@ function createComponentType(meta) {
17718
19548
  typeParams.push(stringArrayAsType(meta.template.ngContentSelectors));
17719
19549
  typeParams.push(expressionType(literal(meta.isStandalone)));
17720
19550
  typeParams.push(createHostDirectivesType(meta));
19551
+ // TODO(signals): Always include this metadata starting with v17. Right
19552
+ // now Angular v16.0.x does not support this field and library distributions
19553
+ // would then be incompatible with v16.0.x framework users.
19554
+ if (meta.isSignal) {
19555
+ typeParams.push(expressionType(literal(meta.isSignal)));
19556
+ }
17721
19557
  return expressionType(importExpr(Identifiers.ComponentDeclaration, typeParams));
17722
19558
  }
17723
19559
  /**
@@ -17816,11 +19652,24 @@ function createBaseDirectiveTypeParams(meta) {
17816
19652
  typeWithParameters(meta.type.type, meta.typeArgumentCount),
17817
19653
  selectorForType !== null ? stringAsType(selectorForType) : NONE_TYPE,
17818
19654
  meta.exportAs !== null ? stringArrayAsType(meta.exportAs) : NONE_TYPE,
17819
- expressionType(stringMapAsLiteralExpression(meta.inputs)),
19655
+ expressionType(getInputsTypeExpression(meta)),
17820
19656
  expressionType(stringMapAsLiteralExpression(meta.outputs)),
17821
19657
  stringArrayAsType(meta.queries.map(q => q.propertyName)),
17822
19658
  ];
17823
19659
  }
19660
+ function getInputsTypeExpression(meta) {
19661
+ return literalMap(Object.keys(meta.inputs).map(key => {
19662
+ const value = meta.inputs[key];
19663
+ return {
19664
+ key,
19665
+ value: literalMap([
19666
+ { key: 'alias', value: literal(value.bindingPropertyName), quoted: true },
19667
+ { key: 'required', value: literal(value.required), quoted: true }
19668
+ ]),
19669
+ quoted: true
19670
+ };
19671
+ }));
19672
+ }
17824
19673
  /**
17825
19674
  * Creates the type specification from the directive meta. This type is inserted into .d.ts files
17826
19675
  * to be consumed by upstream compilations.
@@ -17832,6 +19681,12 @@ function createDirectiveType(meta) {
17832
19681
  typeParams.push(NONE_TYPE);
17833
19682
  typeParams.push(expressionType(literal(meta.isStandalone)));
17834
19683
  typeParams.push(createHostDirectivesType(meta));
19684
+ // TODO(signals): Always include this metadata starting with v17. Right
19685
+ // now Angular v16.0.x does not support this field and library distributions
19686
+ // would then be incompatible with v16.0.x framework users.
19687
+ if (meta.isSignal) {
19688
+ typeParams.push(expressionType(literal(meta.isSignal)));
19689
+ }
17835
19690
  return expressionType(importExpr(Identifiers.DirectiveDeclaration, typeParams));
17836
19691
  }
17837
19692
  // Define and update any view queries
@@ -17860,6 +19715,9 @@ function createViewQueriesFunction(viewQueries, constantPool, name) {
17860
19715
  }
17861
19716
  // Return a host binding function or null if one is not necessary.
17862
19717
  function createHostBindingsFunction(hostBindingsMetadata, typeSourceSpan, bindingParser, constantPool, selector, name, definitionMap) {
19718
+ const bindings = bindingParser.createBoundHostProperties(hostBindingsMetadata.properties, typeSourceSpan);
19719
+ // Calculate host event bindings
19720
+ const eventBindings = bindingParser.createDirectiveHostEventAsts(hostBindingsMetadata.listeners, typeSourceSpan);
17863
19721
  const bindingContext = variable(CONTEXT_NAME);
17864
19722
  const styleBuilder = new StylingBuilder(bindingContext);
17865
19723
  const { styleAttr, classAttr } = hostBindingsMetadata.specialAttributes;
@@ -17873,13 +19731,10 @@ function createHostBindingsFunction(hostBindingsMetadata, typeSourceSpan, bindin
17873
19731
  const updateInstructions = [];
17874
19732
  const updateVariables = [];
17875
19733
  const hostBindingSourceSpan = typeSourceSpan;
17876
- // Calculate host event bindings
17877
- const eventBindings = bindingParser.createDirectiveHostEventAsts(hostBindingsMetadata.listeners, hostBindingSourceSpan);
17878
19734
  if (eventBindings && eventBindings.length) {
17879
19735
  createInstructions.push(...createHostListeners(eventBindings, name));
17880
19736
  }
17881
19737
  // Calculate the host property bindings
17882
- const bindings = bindingParser.createBoundHostProperties(hostBindingsMetadata.properties, hostBindingSourceSpan);
17883
19738
  const allOtherBindings = [];
17884
19739
  // We need to calculate the total amount of binding slots required by
17885
19740
  // all the instructions together before any value conversions happen.
@@ -18222,6 +20077,7 @@ function createHostDirectivesMappingArray(mapping) {
18222
20077
  class ResourceLoader {
18223
20078
  }
18224
20079
 
20080
+ let enabledBlockTypes;
18225
20081
  class CompilerFacadeImpl {
18226
20082
  constructor(jitEvaluator = new JitEvaluator()) {
18227
20083
  this.jitEvaluator = jitEvaluator;
@@ -18233,7 +20089,6 @@ class CompilerFacadeImpl {
18233
20089
  const metadata = {
18234
20090
  name: facade.name,
18235
20091
  type: wrapReference(facade.type),
18236
- internalType: new WrappedNodeExpr(facade.type),
18237
20092
  typeArgumentCount: 0,
18238
20093
  deps: null,
18239
20094
  pipeName: facade.pipeName,
@@ -18252,7 +20107,6 @@ class CompilerFacadeImpl {
18252
20107
  const { expression, statements } = compileInjectable({
18253
20108
  name: facade.name,
18254
20109
  type: wrapReference(facade.type),
18255
- internalType: new WrappedNodeExpr(facade.type),
18256
20110
  typeArgumentCount: facade.typeArgumentCount,
18257
20111
  providedIn: computeProvidedIn(facade.providedIn),
18258
20112
  useClass: convertToProviderExpression(facade, 'useClass'),
@@ -18268,7 +20122,6 @@ class CompilerFacadeImpl {
18268
20122
  const { expression, statements } = compileInjectable({
18269
20123
  name: facade.type.name,
18270
20124
  type: wrapReference(facade.type),
18271
- internalType: new WrappedNodeExpr(facade.type),
18272
20125
  typeArgumentCount: 0,
18273
20126
  providedIn: computeProvidedIn(facade.providedIn),
18274
20127
  useClass: convertToProviderExpression(facade, 'useClass'),
@@ -18284,7 +20137,6 @@ class CompilerFacadeImpl {
18284
20137
  const meta = {
18285
20138
  name: facade.name,
18286
20139
  type: wrapReference(facade.type),
18287
- internalType: new WrappedNodeExpr(facade.type),
18288
20140
  providers: facade.providers && facade.providers.length > 0 ?
18289
20141
  new WrappedNodeExpr(facade.providers) :
18290
20142
  null,
@@ -18300,9 +20152,8 @@ class CompilerFacadeImpl {
18300
20152
  }
18301
20153
  compileNgModule(angularCoreEnv, sourceMapUrl, facade) {
18302
20154
  const meta = {
20155
+ kind: R3NgModuleMetadataKind.Global,
18303
20156
  type: wrapReference(facade.type),
18304
- internalType: new WrappedNodeExpr(facade.type),
18305
- adjacentType: new WrappedNodeExpr(facade.type),
18306
20157
  bootstrap: facade.bootstrap.map(wrapReference),
18307
20158
  declarations: facade.declarations.map(wrapReference),
18308
20159
  publicDeclarationTypes: null,
@@ -18347,6 +20198,10 @@ class CompilerFacadeImpl {
18347
20198
  template,
18348
20199
  declarations: facade.declarations.map(convertDeclarationFacadeToMetadata),
18349
20200
  declarationListEmitMode: 0 /* DeclarationListEmitMode.Direct */,
20201
+ // TODO: leaving empty in JIT mode for now,
20202
+ // to be implemented as one of the next steps.
20203
+ deferBlocks: new Map(),
20204
+ deferrableDeclToImportDecl: new Map(),
18350
20205
  styles: [...facade.styles, ...template.styles],
18351
20206
  encapsulation: facade.encapsulation,
18352
20207
  interpolation,
@@ -18375,7 +20230,6 @@ class CompilerFacadeImpl {
18375
20230
  const factoryRes = compileFactoryFunction({
18376
20231
  name: meta.name,
18377
20232
  type: wrapReference(meta.type),
18378
- internalType: new WrappedNodeExpr(meta.type),
18379
20233
  typeArgumentCount: meta.typeArgumentCount,
18380
20234
  deps: convertR3DependencyMetadataArray(meta.deps),
18381
20235
  target: meta.target,
@@ -18386,7 +20240,6 @@ class CompilerFacadeImpl {
18386
20240
  const factoryRes = compileFactoryFunction({
18387
20241
  name: meta.type.name,
18388
20242
  type: wrapReference(meta.type),
18389
- internalType: new WrappedNodeExpr(meta.type),
18390
20243
  typeArgumentCount: 0,
18391
20244
  deps: Array.isArray(meta.deps) ? meta.deps.map(convertR3DeclareDependencyMetadata) :
18392
20245
  meta.deps,
@@ -18446,8 +20299,8 @@ function convertQueryPredicate(predicate) {
18446
20299
  createMayBeForwardRefExpression(new WrappedNodeExpr(predicate), 1 /* ForwardRefHandling.Wrapped */);
18447
20300
  }
18448
20301
  function convertDirectiveFacadeToMetadata(facade) {
18449
- const inputsFromMetadata = parseInputOutputs(facade.inputs || []);
18450
- const outputsFromMetadata = parseInputOutputs(facade.outputs || []);
20302
+ const inputsFromMetadata = parseInputsArray(facade.inputs || []);
20303
+ const outputsFromMetadata = parseMappingStringArray(facade.outputs || []);
18451
20304
  const propMetadata = facade.propMetadata;
18452
20305
  const inputsFromType = {};
18453
20306
  const outputsFromType = {};
@@ -18455,11 +20308,15 @@ function convertDirectiveFacadeToMetadata(facade) {
18455
20308
  if (propMetadata.hasOwnProperty(field)) {
18456
20309
  propMetadata[field].forEach(ann => {
18457
20310
  if (isInput(ann)) {
18458
- inputsFromType[field] =
18459
- ann.bindingPropertyName ? [ann.bindingPropertyName, field] : field;
20311
+ inputsFromType[field] = {
20312
+ bindingPropertyName: ann.alias || field,
20313
+ classPropertyName: field,
20314
+ required: ann.required || false,
20315
+ transformFunction: ann.transform != null ? new WrappedNodeExpr(ann.transform) : null,
20316
+ };
18460
20317
  }
18461
20318
  else if (isOutput(ann)) {
18462
- outputsFromType[field] = ann.bindingPropertyName || field;
20319
+ outputsFromType[field] = ann.alias || field;
18463
20320
  }
18464
20321
  });
18465
20322
  }
@@ -18469,7 +20326,6 @@ function convertDirectiveFacadeToMetadata(facade) {
18469
20326
  typeArgumentCount: 0,
18470
20327
  typeSourceSpan: facade.typeSourceSpan,
18471
20328
  type: wrapReference(facade.type),
18472
- internalType: new WrappedNodeExpr(facade.type),
18473
20329
  deps: null,
18474
20330
  host: extractHostBindings(facade.propMetadata, facade.typeSourceSpan, facade.host),
18475
20331
  inputs: { ...inputsFromMetadata, ...inputsFromType },
@@ -18486,9 +20342,8 @@ function convertDeclareDirectiveFacadeToMetadata(declaration, typeSourceSpan) {
18486
20342
  name: declaration.type.name,
18487
20343
  type: wrapReference(declaration.type),
18488
20344
  typeSourceSpan,
18489
- internalType: new WrappedNodeExpr(declaration.type),
18490
20345
  selector: declaration.selector ?? null,
18491
- inputs: declaration.inputs ?? {},
20346
+ inputs: declaration.inputs ? inputsMappingToInputMetadata(declaration.inputs) : {},
18492
20347
  outputs: declaration.outputs ?? {},
18493
20348
  host: convertHostDeclarationToMetadata(declaration.host),
18494
20349
  queries: (declaration.queries ?? []).map(convertQueryDeclarationToMetadata),
@@ -18502,6 +20357,7 @@ function convertDeclareDirectiveFacadeToMetadata(declaration, typeSourceSpan) {
18502
20357
  typeArgumentCount: 0,
18503
20358
  fullInheritance: false,
18504
20359
  isStandalone: declaration.isStandalone ?? false,
20360
+ isSignal: declaration.isSignal ?? false,
18505
20361
  hostDirectives: convertHostDirectivesToMetadata(declaration),
18506
20362
  };
18507
20363
  }
@@ -18529,8 +20385,8 @@ function convertHostDirectivesToMetadata(metadata) {
18529
20385
  {
18530
20386
  directive: wrapReference(hostDirective.directive),
18531
20387
  isForwardReference: false,
18532
- inputs: hostDirective.inputs ? parseInputOutputs(hostDirective.inputs) : null,
18533
- outputs: hostDirective.outputs ? parseInputOutputs(hostDirective.outputs) : null,
20388
+ inputs: hostDirective.inputs ? parseMappingStringArray(hostDirective.inputs) : null,
20389
+ outputs: hostDirective.outputs ? parseMappingStringArray(hostDirective.outputs) : null,
18534
20390
  };
18535
20391
  });
18536
20392
  }
@@ -18576,6 +20432,10 @@ function convertDeclareComponentFacadeToMetadata(decl, typeSourceSpan, sourceMap
18576
20432
  viewProviders: decl.viewProviders !== undefined ? new WrappedNodeExpr(decl.viewProviders) :
18577
20433
  null,
18578
20434
  animations: decl.animations !== undefined ? new WrappedNodeExpr(decl.animations) : null,
20435
+ // TODO: leaving empty in JIT mode for now,
20436
+ // to be implemented as one of the next steps.
20437
+ deferBlocks: new Map(),
20438
+ deferrableDeclToImportDecl: new Map(),
18579
20439
  changeDetection: decl.changeDetection ?? ChangeDetectionStrategy.Default,
18580
20440
  encapsulation: decl.encapsulation ?? ViewEncapsulation.Emulated,
18581
20441
  interpolation,
@@ -18623,7 +20483,7 @@ function convertPipeDeclarationToMetadata(pipe) {
18623
20483
  function parseJitTemplate(template, typeName, sourceMapUrl, preserveWhitespaces, interpolation) {
18624
20484
  const interpolationConfig = interpolation ? InterpolationConfig.fromArray(interpolation) : DEFAULT_INTERPOLATION_CONFIG;
18625
20485
  // Parse the template and check for errors.
18626
- const parsed = parseTemplate(template, sourceMapUrl, { preserveWhitespaces, interpolationConfig });
20486
+ const parsed = parseTemplate(template, sourceMapUrl, { preserveWhitespaces, interpolationConfig, enabledBlockTypes });
18627
20487
  if (parsed.errors !== null) {
18628
20488
  const errors = parsed.errors.map(err => err.toString()).join(', ');
18629
20489
  throw new Error(`Errors during JIT compilation of template for ${typeName}: ${errors}`);
@@ -18722,18 +20582,67 @@ function isInput(value) {
18722
20582
  function isOutput(value) {
18723
20583
  return value.ngMetadataName === 'Output';
18724
20584
  }
18725
- function parseInputOutputs(values) {
20585
+ function inputsMappingToInputMetadata(inputs) {
20586
+ return Object.keys(inputs).reduce((result, key) => {
20587
+ const value = inputs[key];
20588
+ if (typeof value === 'string') {
20589
+ result[key] = {
20590
+ bindingPropertyName: value,
20591
+ classPropertyName: value,
20592
+ transformFunction: null,
20593
+ required: false,
20594
+ };
20595
+ }
20596
+ else {
20597
+ result[key] = {
20598
+ bindingPropertyName: value[0],
20599
+ classPropertyName: value[1],
20600
+ transformFunction: value[2] ? new WrappedNodeExpr(value[2]) : null,
20601
+ required: false,
20602
+ };
20603
+ }
20604
+ return result;
20605
+ }, {});
20606
+ }
20607
+ function parseInputsArray(values) {
20608
+ return values.reduce((results, value) => {
20609
+ if (typeof value === 'string') {
20610
+ const [bindingPropertyName, classPropertyName] = parseMappingString(value);
20611
+ results[classPropertyName] = {
20612
+ bindingPropertyName,
20613
+ classPropertyName,
20614
+ required: false,
20615
+ transformFunction: null,
20616
+ };
20617
+ }
20618
+ else {
20619
+ results[value.name] = {
20620
+ bindingPropertyName: value.alias || value.name,
20621
+ classPropertyName: value.name,
20622
+ required: value.required || false,
20623
+ transformFunction: value.transform != null ? new WrappedNodeExpr(value.transform) : null,
20624
+ };
20625
+ }
20626
+ return results;
20627
+ }, {});
20628
+ }
20629
+ function parseMappingStringArray(values) {
18726
20630
  return values.reduce((results, value) => {
18727
- const [field, property] = value.split(':', 2).map(str => str.trim());
18728
- results[field] = property || field;
20631
+ const [alias, fieldName] = parseMappingString(value);
20632
+ results[fieldName] = alias;
18729
20633
  return results;
18730
20634
  }, {});
18731
20635
  }
20636
+ function parseMappingString(value) {
20637
+ // Either the value is 'field' or 'field: property'. In the first case, `property` will
20638
+ // be undefined, in which case the field name should also be used as the property name.
20639
+ const [fieldName, bindingPropertyName] = value.split(':', 2).map(str => str.trim());
20640
+ return [bindingPropertyName ?? fieldName, fieldName];
20641
+ }
18732
20642
  function convertDeclarePipeFacadeToMetadata(declaration) {
18733
20643
  return {
18734
20644
  name: declaration.type.name,
18735
20645
  type: wrapReference(declaration.type),
18736
- internalType: new WrappedNodeExpr(declaration.type),
18737
20646
  typeArgumentCount: 0,
18738
20647
  pipeName: declaration.name,
18739
20648
  deps: null,
@@ -18745,7 +20654,6 @@ function convertDeclareInjectorFacadeToMetadata(declaration) {
18745
20654
  return {
18746
20655
  name: declaration.type.name,
18747
20656
  type: wrapReference(declaration.type),
18748
- internalType: new WrappedNodeExpr(declaration.type),
18749
20657
  providers: declaration.providers !== undefined && declaration.providers.length > 0 ?
18750
20658
  new WrappedNodeExpr(declaration.providers) :
18751
20659
  null,
@@ -18764,7 +20672,7 @@ function publishFacade(global) {
18764
20672
  * @description
18765
20673
  * Entry point for all public APIs of the compiler package.
18766
20674
  */
18767
- new Version('15.2.9');
20675
+ new Version('16.2.12');
18768
20676
  var _VisitorMode;
18769
20677
  (function (_VisitorMode) {
18770
20678
  _VisitorMode[_VisitorMode["Extract"] = 0] = "Extract";
@@ -18994,6 +20902,14 @@ class ASTCompiler {
18994
20902
  }
18995
20903
  return this.handleBinaryDefault();
18996
20904
  }
20905
+ processUnary() {
20906
+ const ast = this.cAst;
20907
+ const stmts = this.cStmts;
20908
+ const e = this.build(ast.expr, stmts);
20909
+ const v = this.createVar();
20910
+ stmts.push(`${v}=${ast.operator}${e}`);
20911
+ return v;
20912
+ }
18997
20913
  processConditional() {
18998
20914
  const ast = this.cAst;
18999
20915
  const stmts = this.cStmts;
@@ -19085,6 +21001,9 @@ class ASTCompiler {
19085
21001
  else if (ast instanceof PrefixNot) {
19086
21002
  return this.processPrefixNot();
19087
21003
  }
21004
+ else if (ast instanceof Unary) {
21005
+ return this.processUnary();
21006
+ }
19088
21007
  else if (ast instanceof Binary) {
19089
21008
  return this.processBinary();
19090
21009
  }