diff --git a/changelog_unreleased/angular/17722.md b/changelog_unreleased/angular/17722.md
index ce0026c87..ad5a44e13 100644
--- a/changelog_unreleased/angular/17722.md
+++ b/changelog_unreleased/angular/17722.md
@@ -1,19 +1,21 @@
-#### Support Angular 20.1 (#17722 by @fisker)
+#### Support Angular 21 (#17722, #18294 by @fisker)
Angular 20.1 added support for new assignment operators.
+Angular 21 added support for regular expression.
```html
+ a ??= b">{{ /\d+/g}}
+ >{{ /\d+/g}}
-
+{{ /\d+/g }}
```
diff --git a/package.json b/package.json
index 637a4f2b8..01672aa5d 100644
--- a/package.json
+++ b/package.json
@@ -42,7 +42,7 @@
"bin"
],
"dependencies": {
- "@angular/compiler": "20.3.13",
+ "@angular/compiler": "21.0.0",
"@babel/code-frame": "8.0.0-beta.3",
"@babel/parser": "8.0.0-beta.3",
"@babel/types": "8.0.0-beta.3",
@@ -55,7 +55,7 @@
"@typescript-eslint/visitor-keys": "8.47.0",
"acorn": "8.15.0",
"acorn-jsx": "5.3.2",
- "angular-estree-parser": "13.1.3",
+ "angular-estree-parser": "14.1.0",
"angular-html-parser": "10.1.1",
"camelcase": "9.0.0",
"ci-info": "4.3.1",
diff --git a/scripts/build/build-javascript-module.js b/scripts/build/build-javascript-module.js
index 7483adb60..2a67e2803 100644
--- a/scripts/build/build-javascript-module.js
+++ b/scripts/build/build-javascript-module.js
@@ -193,7 +193,7 @@ function getEsbuildOptions({ packageConfig, file, cliOptions }) {
esbuildPluginEvaluate(),
esbuildPluginStripNodeProtocol(),
esbuildPluginReplaceModule({
- replacements: [...replaceModule, ...(buildOptions.replaceModule ?? [])],
+ replacements: [...(buildOptions.replaceModule ?? []), ...replaceModule],
}),
cliOptions.reports &&
esbuildPluginVisualizer({ formats: cliOptions.reports }),
diff --git a/scripts/build/transform/index.js b/scripts/build/transform/index.js
index d1d51885a..6a9df77d4 100644
--- a/scripts/build/transform/index.js
+++ b/scripts/build/transform/index.js
@@ -28,7 +28,7 @@ const packageTransforms = new Map([
["@glimmer/syntax", "angular-estree-parser", "espree"],
],
[transforms["object-has-own"], ["@babel/parser", "meriyah"]],
- [transforms["string-raw"], ["camelcase"]],
+ [transforms["string-raw"], ["camelcase", "@angular/compiler"]],
/* spell-checker: enable */
]);
diff --git a/tests/format/angular/regular-expression/__snapshots__/format.test.js.snap b/tests/format/angular/regular-expression/__snapshots__/format.test.js.snap
new file mode 100644
index 000000000..559924771
--- /dev/null
+++ b/tests/format/angular/regular-expression/__snapshots__/format.test.js.snap
@@ -0,0 +1,19 @@
+// Jest Snapshot v1, https://jestjs.io/docs/snapshot-testing
+
+exports[`regular-expression.html format 1`] = `
+====================================options=====================================
+parsers: ["angular"]
+printWidth: 80
+ | printWidth
+=====================================input======================================
+{{ /\\d/+}}
+
+{{ /\\B*/u}}
+
+=====================================output=====================================
+{{ /\\d/+}}
+
+{{ /\\B*/u }}
+
+================================================================================
+`;
diff --git a/tests/format/angular/regular-expression/format.test.js b/tests/format/angular/regular-expression/format.test.js
new file mode 100644
index 000000000..8cbc48b1a
--- /dev/null
+++ b/tests/format/angular/regular-expression/format.test.js
@@ -0,0 +1 @@
+runFormatTest(import.meta, ["angular"]);
diff --git a/tests/format/angular/regular-expression/regular-expression.html b/tests/format/angular/regular-expression/regular-expression.html
new file mode 100644
index 000000000..6766cad2e
--- /dev/null
+++ b/tests/format/angular/regular-expression/regular-expression.html
@@ -0,0 +1,3 @@
+{{ /\d/+}}
+
+{{ /\B*/u}}
diff --git a/yarn.lock b/yarn.lock
index 134159b9f..e556752a7 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -5,12 +5,12 @@ __metadata:
version: 8
cacheKey: 10
-"@angular/compiler@npm:20.3.13":
- version: 20.3.13
- resolution: "@angular/compiler@npm:20.3.13"
+"@angular/compiler@npm:21.0.0":
+ version: 21.0.0
+ resolution: "@angular/compiler@npm:21.0.0"
dependencies:
tslib: "npm:^2.3.0"
- checksum: 10/1ee405f45292386a94a4a8596ec3b268d40257d579bdb6556034523daad42814770bc685ca1cebecb3c86fb1d7d06973ddd29935068f46c21aaad1ffe317ddef
+ checksum: 10/2cee4c6ebdec660dda703de5363dfe1c18c343065f01a00534e7bf018dd86c67b1a3ff0d151069020ac6e34d421c8466dff79c0186a93ccd494aa8ceadded727
languageName: node
linkType: hard
@@ -2827,12 +2827,12 @@ __metadata:
languageName: node
linkType: hard
-"angular-estree-parser@npm:13.1.3":
- version: 13.1.3
- resolution: "angular-estree-parser@npm:13.1.3"
+"angular-estree-parser@npm:14.1.0":
+ version: 14.1.0
+ resolution: "angular-estree-parser@npm:14.1.0"
peerDependencies:
- "@angular/compiler": ^20.3.4
- checksum: 10/ada9814701dc17ef5c6186e1ea672aa9288bc67d28d00b6db86d5df4eaab5772572836f67e2b7d6a2e2be4b2051722dfc5de2295ef8f72361aada0c762d1bc8b
+ "@angular/compiler": ^21.0.0
+ checksum: 10/b9517dbdb9461d22ed0de5d3a19c82a520b7f45c2db4bc46990f5e5ad3fa948521e814edd88708bffeea9dca83225de4ff95c8b2e10cd7d432315b229024e39d
languageName: node
linkType: hard
@@ -7262,7 +7262,7 @@ __metadata:
version: 0.0.0-use.local
resolution: "prettier@workspace:."
dependencies:
- "@angular/compiler": "npm:20.3.13"
+ "@angular/compiler": "npm:21.0.0"
"@babel/code-frame": "npm:8.0.0-beta.3"
"@babel/generator": "npm:8.0.0-beta.3"
"@babel/parser": "npm:8.0.0-beta.3"
@@ -7283,7 +7283,7 @@ __metadata:
"@typescript-eslint/visitor-keys": "npm:8.47.0"
acorn: "npm:8.15.0"
acorn-jsx: "npm:5.3.2"
- angular-estree-parser: "npm:13.1.3"
+ angular-estree-parser: "npm:14.1.0"
angular-html-parser: "npm:10.1.1"
browserslist: "npm:4.28.0"
browserslist-to-esbuild: "npm:2.1.1"