You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
Commit 4d75e1b
Browse filesBrowse the repository at this point in the historyBrowse files
The "file" format is configured as `"prerender": { "format": "file" }`,
the same option as in the pull request for the Angular CLI. The builder
takes `format` out of the prerender option, so it also works with
`"outputMode": "static"`. Routes are renamed from `<route>/index.html`
to `<route>.html` without special rules for individual routes.
BREAKING CHANGE: the top-level option `prerenderFormat` is replaced by
`prerender.format`. Run `ng add @angular-schule/prerender-format` again
or move the value into the `prerender` object.
Copy file name to clipboardExpand all lines: CLAUDE.md
+6-6Lines changed: 6 additions & 6 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -4,7 +4,7 @@ This file provides guidance when working with code in this repository.
4
4
5
5
## Overview
6
6
7
-
`@angular-schule/prerender-format` is an Angular CLI builder that wraps `@angular/build:application`. With `prerenderFormat: "file"`, prerendered routes are written as `foo.html` instead of `foo/index.html`, so static hosts serve `/foo` without a trailing slash redirect. It implements the idea from [angular/angular-cli#29173](https://github.com/angular/angular-cli/issues/29173); the pull request [angular/angular-cli#34180](https://github.com/angular/angular-cli/pull/34180) adds the same option to Angular itself. Structure and conventions follow [angular-cli-ghpages](https://github.com/angular-schule/angular-cli-ghpages).
7
+
`@angular-schule/prerender-format` is an Angular CLI builder that wraps `@angular/build:application`. With `"prerender": { "format": "file" }`, prerendered routes are written as `foo.html` instead of `foo/index.html`, so static hosts serve `/foo` without a trailing slash redirect. It implements the idea from [angular/angular-cli#29173](https://github.com/angular/angular-cli/issues/29173); the pull request [angular/angular-cli#34180](https://github.com/angular/angular-cli/pull/34180) adds the same option to Angular itself. Structure and conventions follow [angular-cli-ghpages](https://github.com/angular-schule/angular-cli-ghpages).
`application/schema.json` is generated: the schema of `@angular/build:application` from the installed version plus `prerenderFormat`. Regenerate it after updating `@angular/build` and commit the result. `npm test` fails if it is out of sync.
29
+
`application/schema.json` is generated: the schema of `@angular/build:application` from the installed version plus `format` in the `prerender` object. Regenerate it after updating `@angular/build` and commit the result. `npm test` fails if it is out of sync.
30
30
31
31
### Test
32
32
```bash
@@ -72,21 +72,21 @@ npm dist-tag add @angular-schule/prerender-format@X.X.X-rc.X next
72
72
73
73
## Principle: warn and fall back, never fail
74
74
75
-
The option must never make a build fail. Whenever the "file" format does not apply, log a warning and keep the behavior of `@angular/build:application` (`<route>/index.html`), for the whole build or for a single route. No `throw` and no `try/catch` for control flow: functions that can fail return a result (see `InstallResult`). The only exceptions are the `SchematicsException`s of `ng add` for invalid input, as the Angular schematics API expects.
75
+
The option must never make a build fail. Whenever the "file" format does not apply, log a warning and keep the behavior of `@angular/build:application` (`<route>/index.html`). No `throw` and no `try/catch` for control flow: functions that can fail return a result (see `InstallResult`). The only exceptions are the `SchematicsException`s of `ng add` for invalid input, as the Angular schematics API expects.
76
76
77
77
## Architecture
78
78
79
79
1.**Builder** (`src/application/`):
80
-
-`builder.ts` - Angular builder entry point, called by `ng build`. Strips `prerenderFormat`and delegates to `buildApplication`. Whenever the "file" format does not apply (a server is produced, the internals of `@angular/build` differ, nothing went through the wrapper), it logs a warning and the build behaves like `@angular/build:application`.
80
+
-`builder.ts` - Angular builder entry point, called by `ng build`. Takes `format` out of the `prerender` option (`toApplicationOptions()`) and delegates to `buildApplication`. With `outputMode`, `@angular/build` ignores `prerender` and warns about it, so a `prerender` object that only carries `format` is dropped there. Whenever the "file" format does not apply (a server is produced, the internals of `@angular/build` differ, nothing went through the wrapper), it logs a warning and the build behaves like `@angular/build:application`.
81
81
-`ships-server.ts` - The rule for "this build ships an SSR server", shared by builder and `ng add`.
82
82
-`file-format.ts` - Wraps the internal `prerenderPages()` of `@angular/build`. `execute-post-bundle.js` reads it from the module's exports object at call time, so replacing the export takes effect for regular and localized builds.
- Swaps the build target's builder and sets `prerenderFormat: "file"`
87
+
- Swaps the build target's builder and sets `prerender.format: "file"`, keeping other `prerender` settings
88
88
- Warns if the build target or one of its configurations produces an SSR server
89
89
90
90
### Internal API
91
91
92
-
`prerenderPages()` in `@angular/build/src/utils/server-rendering/prerender.js` is not public. If the module or the export is missing, `installFileFormat()` returns the reason and the builder warns instead of patching, and `file-format.spec.ts` checks the call site in `execute-post-bundle.js`. The package supports Angular 22 only. `.github/scripts/test-angular-app.sh` builds a fresh Angular app (lowest and latest 22.x in CI) and checks `ng add`, the server warning, the "file" output for two locales and the `/index` fallback.
92
+
`prerenderPages()` in `@angular/build/src/utils/server-rendering/prerender.js` is not public. If the module or the export is missing, `installFileFormat()` returns the reason and the builder warns instead of patching, and `file-format.spec.ts` checks the call site in `execute-post-bundle.js`. The package supports Angular 22 only. `.github/scripts/test-angular-app.sh` builds a fresh Angular app (lowest and latest 22.x in CI) and checks `ng add`, the server warning, and the "file" output for two locales.
Copy file name to clipboardExpand all lines: README.md
+19-17Lines changed: 19 additions & 17 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -41,7 +41,7 @@ The same route becomes `blog/my-article.html`, and hosts like Cloudflare Pages s
41
41
-**Old links keep working:** addresses with a trailing slash redirect to the address without it (measured on Cloudflare Pages, see [Hosts](#hosts)).
42
42
43
43
The idea comes from [angular/angular-cli#29173](https://github.com/angular/angular-cli/issues/29173), which asks for an option to write `<route>.html` instead of `<route>/index.html`.
44
-
The pull request [angular/angular-cli#34180](https://github.com/angular/angular-cli/pull/34180) adds such an option to Angular itself, with the same name and values as this builder: `prerenderFormat`,`'directory'` or `'file'`.
44
+
The pull request [angular/angular-cli#34180](https://github.com/angular/angular-cli/pull/34180) adds the same option to Angular itself: `prerender.format` with`'directory'` or `'file'`.
45
45
The builder is a stopgap: developed and tested for Angular 22, until Angular has a built-in option and this package is no longer needed.
46
46
If you want the option in Angular, please give the issue and the pull request a 👍.
47
47
@@ -62,15 +62,17 @@ ng build
62
62
63
63
## ⚙️ Installation <aname="installation"></a>
64
64
65
-
`ng add @angular-schule/prerender-format` installs the package and changes the builder of your build target in `angular.json` and sets `prerenderFormat`.
66
-
`prerenderFormat: "file"` only applies to static builds. If the build target (or one of its configurations) produces an SSR server, `ng add` still sets it up and shows a warning.
65
+
`ng add @angular-schule/prerender-format` installs the package, changes the builder of your build target in `angular.json` and sets `prerender.format`.
66
+
`"format": "file"` only applies to static builds. If the build target (or one of its configurations) produces an SSR server, `ng add` still sets it up and shows a warning.
@@ -95,11 +97,11 @@ The name and the values follow Astro's [`build.format`](#other-frameworks).
95
97
Parent and child routes live side by side: `blog.html` next to the folder `blog/`.
96
98
The start page of each locale (for example with base href `/en/`) stays `index.html`.
97
99
98
-
If `blog/my-article.html` is not safe for a route, that route keeps `blog/my-article/index.html` and the build shows a warning. This applies to a route whose last segment is `index` in any letter case (`/index`, `/blog/index`), to a file name the build uses itself (such as `index.csr.html`), and to a file name another route already uses.
100
+
`prerender.format` is also considered with `"outputMode": "static"`, where Angular ignores the other `prerender` settings.
99
101
100
102
## 🔭 Other frameworks <aname="other-frameworks"></a>
101
103
102
-
Static site generators have offered this choice for a long time. We decided to borrow the terminology from Astro: `build.format` with `'directory'` and `'file'` became `prerenderFormat` with the same values.
104
+
Static site generators have offered this choice for a long time. We decided to borrow the terminology from Astro: `build.format` with `'directory'` and `'file'` became `prerender.format` with the same values.
Astro's documentation recommends `build.format: 'file'` together with `trailingSlash: 'never'`, which is exactly the combination this builder enables for Angular.
114
116
115
117
## 🌍 Hosts <aname="hosts"></a>
116
118
117
-
Measured on **Cloudflare Pages** with `prerenderFormat: "file"`:
119
+
Measured on **Cloudflare Pages** with `"prerender": { "format": "file" }`:
118
120
119
121
| Request | Response |
120
122
|---|---|
@@ -130,7 +132,8 @@ Check your host before switching.
130
132
131
133
## 🔧 How it works <aname="how-it-works"></a>
132
134
133
-
The builder calls `buildApplication` from `@angular/build` and wraps its internal `prerenderPages()` function, which returns the prerendered pages as a record of output paths.
135
+
The builder takes `format` out of the `prerender` option and calls `buildApplication` from `@angular/build` with all other options.
136
+
It wraps the internal `prerenderPages()` function of `@angular/build`, which returns the prerendered pages as a record of output paths.
134
137
The wrapper renames `blog/my-article/index.html` to `blog/my-article.html` before anything is written, so the service worker manifest and all later build steps see the final file names.
135
138
136
139
`prerenderPages()` is internal API, so this package supports Angular 22 only.
@@ -139,7 +142,7 @@ The option never makes your build fail.
139
142
140
143
## 📁 Known limitations <aname="limitations"></a>
141
144
142
-
-**Static builds only, by design.**`prerenderFormat: "file"` solves a problem of static hosting and makes no sense in other setups. An `ssr` entry is fine as long as `"outputMode"` is `"static"`: Angular then uses it only during `ng build` to prerender the pages, and no server is deployed. If a server is deployed, the option is not considered and the build shows a warning: a server needs no `.html` files, it answers `/blog/my-article` directly without redirecting to `/blog/my-article/`, and the Angular SSR server looks up prerendered pages as `index.html`.
145
+
-**Static builds only, by design.**`"format": "file"` solves a problem of static hosting and makes no sense in other setups. An `ssr` entry is fine as long as `"outputMode"` is `"static"`: Angular then uses it only during `ng build` to prerender the pages, and no server is deployed. If a server is deployed, the option is not considered and the build shows a warning: a server needs no `.html` files, it answers `/blog/my-article` directly without redirecting to `/blog/my-article/`, and the Angular SSR server looks up prerendered pages as `index.html`.
143
146
144
147
✅ Works: static output, the `ssr` entry only renders at build time
145
148
@@ -148,7 +151,7 @@ The option never makes your build fail.
148
151
"outputMode": "static",
149
152
"server": "src/main.server.ts",
150
153
"ssr": { "entry": "src/server.ts" },
151
-
"prerenderFormat": "file"
154
+
"prerender": { "format": "file" }
152
155
}
153
156
```
154
157
@@ -157,8 +160,7 @@ The option never makes your build fail.
157
160
```json
158
161
"options": {
159
162
"server": "src/main.server.ts",
160
-
"prerender": true,
161
-
"prerenderFormat": "file"
163
+
"prerender": { "format": "file" }
162
164
}
163
165
```
164
166
@@ -169,7 +171,7 @@ The option never makes your build fail.
169
171
"outputMode": "server",
170
172
"server": "src/main.server.ts",
171
173
"ssr": { "entry": "src/server.ts" },
172
-
"prerenderFormat": "file"
174
+
"prerender": { "format": "file" }
173
175
}
174
176
```
175
177
@@ -179,7 +181,7 @@ The option never makes your build fail.
0 commit comments