diff --git a/changelog_unreleased/angular/20014.md b/changelog_unreleased/angular/20014.md new file mode 100644 index 000000000..3bfb0ef09 --- /dev/null +++ b/changelog_unreleased/angular/20014.md @@ -0,0 +1,22 @@ +#### Support `@boundary` error boundaries (#20014 by @Yahiro025) + + +```html + +@boundary { + +} +@error (let err) { +

{{err.message}}

+} + + +SyntaxError: Unexpected character "EOF" (Do you have an unescaped "{" in your template? Use "{{ '{' }}") to escape it.) (6:1) + + +@boundary { + +} @error (let err) { +

{{ err.message }}

+} +``` diff --git a/package.json b/package.json index 1c45eede9..03efb5178 100644 --- a/package.json +++ b/package.json @@ -58,7 +58,7 @@ "acorn": "8.17.0", "acorn-jsx": "5.3.2", "angular-estree-parser": "15.5.0", - "angular-html-parser": "10.11.0", + "angular-html-parser": "10.12.0", "camelcase": "9.0.0", "ci-info": "4.4.0", "cjk-regex": "3.4.0", diff --git a/scripts/build/transform/index.js b/scripts/build/transform/index.js index c44ec24c2..82afe7369 100644 --- a/scripts/build/transform/index.js +++ b/scripts/build/transform/index.js @@ -28,7 +28,10 @@ const packageTransforms = new Map([ transforms["method-at"], ["@glimmer/syntax", "angular-estree-parser", "espree"], ], - [transforms["object-has-own"], ["@babel/parser", "meriyah", "graphql"]], + [ + transforms["object-has-own"], + ["@babel/parser", "graphql", "meriyah", "angular-html-parser"], + ], [transforms["string-raw"], ["camelcase", "@angular/compiler", "js-yaml"]], [transforms["method-is-well-formed"], ["meriyah"]], /* spell-checker: enable */ diff --git a/src/language-html/print/angular-control-flow-block-settings.evaluate.js b/src/language-html/print/angular-control-flow-block-settings.evaluate.js index bc9b33c23..48243b99a 100644 --- a/src/language-html/print/angular-control-flow-block-settings.evaluate.js +++ b/src/language-html/print/angular-control-flow-block-settings.evaluate.js @@ -15,6 +15,8 @@ const ANGULAR_CONTROL_FLOW_BLOCK_SETTINGS = new Map( ["placeholder", ["placeholder", "error", "loading"]], ["error", ["placeholder", "error", "loading"]], ["loading", ["placeholder", "error", "loading"]], + + ["boundary", ["error"]], ] .filter(([, followingBlockNames]) => followingBlockNames.length > 0) .map(([name, followingBlockNames]) => [name, new Set(followingBlockNames)]), diff --git a/tests/format/angular/control-flow/__snapshots__/format.test.js.snap b/tests/format/angular/control-flow/__snapshots__/format.test.js.snap index 8cf72183e..f5f199f6e 100644 --- a/tests/format/angular/control-flow/__snapshots__/format.test.js.snap +++ b/tests/format/angular/control-flow/__snapshots__/format.test.js.snap @@ -52,6 +52,258 @@ parsers: ["angular"] ================================================================================ `; +exports[`boundary.html format 1`] = ` +====================================options===================================== +parsers: ["angular"] + printWidth: 80 (default) | +=====================================input====================================== +@boundary { + +} @error { +

Something went wrong!

+} + +@boundary { + +} @error { +

Error occurred: {{ $error.message }}

+} + +@boundary { + +} @error { +

Loading failed.

+ +} + +@boundary { + +} @error { + +} + +@boundary { + +} @error (let err; retry = $reset; when isNetworkError(err)) { + + +} @error { + +} + +@boundary { + +} @error (let err; reset = $reset; when isRenderError(err)) { +

Network issue. Check your connection.

+ +} @error { +

An unexpected error occurred: {{ $error.message }}

+} + +@boundary { + +} @error (let err = $error; let r = $reset) { +

Failed to load chart: {{err.message}}

+ +} + +@boundary { + Outer Main + @boundary { + Inner Main + } @error { + Inner Fallback + } +} @error { + Outer Fallback +} + +@defer { + @boundary { + + } @error { + Render error + } +} @error { + Load error +} + +=====================================output===================================== +@boundary { + +} @error { +

Something went wrong!

+} + +@boundary { + +} @error { +

Error occurred: {{ $error.message }}

+} + +@boundary { + +} @error { +

Loading failed.

+ +} + +@boundary { + +} @error { + +} + +@boundary { + +} @error (let err; retry = $reset; when isNetworkError(err)) { + + +} @error { + +} + +@boundary { + +} @error (let err; reset = $reset; when isRenderError(err)) { +

Network issue. Check your connection.

+ +} @error { +

An unexpected error occurred: {{ $error.message }}

+} + +@boundary { + +} @error (let err = $error; let r = $reset) { +

Failed to load chart: {{ err.message }}

+ +} + +@boundary { + Outer Main + @boundary { + Inner Main + } @error { + Inner Fallback + } +} @error { + Outer Fallback +} + +@defer { + @boundary { + + } @error { + Render error + } +} @error { + Load error +} + +================================================================================ +`; + +exports[`boundary-error-parameters.html format 1`] = ` +====================================options===================================== +parsers: ["angular"] + printWidth: 80 (default) | +=====================================input====================================== +@boundary { + +} @error (let err; retry + += $reset; when +isNetworkError(err)) { + + +} @error { + +} + +@boundary { + +} @error (let +err; reset += +$reset; when +isRenderError(err)) { +

Network issue. Check your connection.

+ +} @error { +

An unexpected error occurred: {{$error.message}}

+} + +@boundary { + +} @error (let err=$error; let r=$reset) { +

Failed to load chart: {{err.message}}

+ +} + +@boundary { + Main +} @error (let err; when err.message === '404') { + Not Found +} + +@boundary { + Main +} @error (err = $error, retry += +$reset) { + +} + +=====================================output===================================== +@boundary { + +} @error (let err; retry + += $reset; when +isNetworkError(err)) { + + +} @error { + +} + +@boundary { + +} @error (let +err; reset += +$reset; when +isRenderError(err)) { +

Network issue. Check your connection.

+ +} @error { +

An unexpected error occurred: {{ $error.message }}

+} + +@boundary { + +} @error (let err=$error; let r=$reset) { +

Failed to load chart: {{ err.message }}

+ +} + +@boundary { + Main +} @error (let err; when err.message === '404') { + Not Found +} + +@boundary { + Main +} @error (err = $error, retry += +$reset) { + +} + +================================================================================ +`; + exports[`chid.html format 1`] = ` ====================================options===================================== parsers: ["angular"] diff --git a/tests/format/angular/control-flow/boundary-error-parameters.html b/tests/format/angular/control-flow/boundary-error-parameters.html new file mode 100644 index 000000000..5bcec9af4 --- /dev/null +++ b/tests/format/angular/control-flow/boundary-error-parameters.html @@ -0,0 +1,45 @@ +@boundary { + +} @error (let err; retry + += $reset; when +isNetworkError(err)) { + + +} @error { + +} + +@boundary { + +} @error (let +err; reset += +$reset; when +isRenderError(err)) { +

Network issue. Check your connection.

+ +} @error { +

An unexpected error occurred: {{$error.message}}

+} + +@boundary { + +} @error (let err=$error; let r=$reset) { +

Failed to load chart: {{err.message}}

+ +} + +@boundary { + Main +} @error (let err; when err.message === '404') { + Not Found +} + +@boundary { + Main +} @error (err = $error, retry += +$reset) { + +} diff --git a/tests/format/angular/control-flow/boundary.html b/tests/format/angular/control-flow/boundary.html new file mode 100644 index 000000000..16d0ea579 --- /dev/null +++ b/tests/format/angular/control-flow/boundary.html @@ -0,0 +1,70 @@ +@boundary { + +} @error { +

Something went wrong!

+} + +@boundary { + +} @error { +

Error occurred: {{ $error.message }}

+} + +@boundary { + +} @error { +

Loading failed.

+ +} + +@boundary { + +} @error { + +} + +@boundary { + +} @error (let err; retry = $reset; when isNetworkError(err)) { + + +} @error { + +} + +@boundary { + +} @error (let err; reset = $reset; when isRenderError(err)) { +

Network issue. Check your connection.

+ +} @error { +

An unexpected error occurred: {{ $error.message }}

+} + +@boundary { + +} @error (let err = $error; let r = $reset) { +

Failed to load chart: {{err.message}}

+ +} + +@boundary { + Outer Main + @boundary { + Inner Main + } @error { + Inner Fallback + } +} @error { + Outer Fallback +} + +@defer { + @boundary { + + } @error { + Render error + } +} @error { + Load error +} diff --git a/tests/unit/__snapshots__/angular-blocks.js.snap b/tests/unit/__snapshots__/angular-blocks.js.snap index ad8ba0951..77cfca2d5 100644 --- a/tests/unit/__snapshots__/angular-blocks.js.snap +++ b/tests/unit/__snapshots__/angular-blocks.js.snap @@ -12,6 +12,7 @@ exports[`angular blocks 1`] = ` "@defer", "@placeholder", "@loading", + "@boundary", "@error", "@content", ] diff --git a/yarn.lock b/yarn.lock index e3411f68b..bf3ebe056 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3192,10 +3192,10 @@ __metadata: languageName: node linkType: hard -"angular-html-parser@npm:10.11.0": - version: 10.11.0 - resolution: "angular-html-parser@npm:10.11.0" - checksum: 10/b311b3e984eaba422d41ecff8ea1255c1e5d5cd86ffd88f8651b12323b33104a0099711e1f4104dfe4f4383ff926ac43df4f072bf616f5dbbc5e86ef76e33383 +"angular-html-parser@npm:10.12.0": + version: 10.12.0 + resolution: "angular-html-parser@npm:10.12.0" + checksum: 10/d71e0faa33c3ad91d07a71f4c5878eb047bb42f506fef3b66d15c5dd94a59eba12599de186adf4518ebe28a2f58b669394943281b91aebefed35987d8e29cbbe languageName: node linkType: hard @@ -8334,7 +8334,7 @@ __metadata: acorn: "npm:8.17.0" acorn-jsx: "npm:5.3.2" angular-estree-parser: "npm:15.5.0" - angular-html-parser: "npm:10.11.0" + angular-html-parser: "npm:10.12.0" base64-arraybuffer-es6: "npm:3.1.0" browserslist: "npm:4.28.6" browserslist-to-esbuild: "npm:2.1.1"