Skip to content

Commit 8f3d185

Browse files
author
Angular Builds
committed
3deb0d4 fix(@angular-devkit/build-angular): return 404 for assets that are not found
1 parent 92bc9c4 commit 8f3d185

File tree

4 files changed

+31
-9
lines changed

4 files changed

+31
-9
lines changed

package.json

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,15 @@
11
{
22
"name": "@angular-devkit/build-angular",
3-
"version": "17.1.1+sha-e880531",
3+
"version": "17.1.1+sha-3deb0d4",
44
"description": "Angular Webpack Build Facade",
55
"main": "src/index.js",
66
"typings": "src/index.d.ts",
77
"builders": "builders.json",
88
"dependencies": {
99
"@ampproject/remapping": "2.2.1",
10-
"@angular-devkit/architect": "github:angular/angular-devkit-architect-builds#e880531",
11-
"@angular-devkit/build-webpack": "github:angular/angular-devkit-build-webpack-builds#e880531",
12-
"@angular-devkit/core": "github:angular/angular-devkit-core-builds#e880531",
10+
"@angular-devkit/architect": "github:angular/angular-devkit-architect-builds#3deb0d4",
11+
"@angular-devkit/build-webpack": "github:angular/angular-devkit-build-webpack-builds#3deb0d4",
12+
"@angular-devkit/core": "github:angular/angular-devkit-core-builds#3deb0d4",
1313
"@babel/core": "7.23.7",
1414
"@babel/generator": "7.23.6",
1515
"@babel/helper-annotate-as-pure": "7.22.5",
@@ -20,7 +20,7 @@
2020
"@babel/preset-env": "7.23.7",
2121
"@babel/runtime": "7.23.7",
2222
"@discoveryjs/json-ext": "0.5.7",
23-
"@ngtools/webpack": "github:angular/ngtools-webpack-builds#e880531",
23+
"@ngtools/webpack": "github:angular/ngtools-webpack-builds#3deb0d4",
2424
"@vitejs/plugin-basic-ssl": "1.0.2",
2525
"ansi-colors": "4.1.3",
2626
"autoprefixer": "10.4.16",

src/builders/dev-server/vite-server.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -341,7 +341,7 @@ async function setupServer(serverOptions, outputFiles, assets, preserveSymlinks,
341341
publicDir: false,
342342
esbuild: false,
343343
mode: 'development',
344-
appType: 'spa',
344+
appType: 'mpa',
345345
css: {
346346
devSourcemap: true,
347347
},

src/tools/vite/angular-memory-plugin.js

Lines changed: 24 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,7 @@ function createAngularMemoryPlugin(options) {
6161
map: mapContents && Buffer.from(mapContents).toString('utf-8'),
6262
};
6363
},
64+
// eslint-disable-next-line max-lines-per-function
6465
configureServer(server) {
6566
const originalssrTransform = server.ssrTransform;
6667
server.ssrTransform = async (code, map, url, originalCode) => {
@@ -124,14 +125,15 @@ function createAngularMemoryPlugin(options) {
124125
// Returning a function, installs middleware after the main transform middleware but
125126
// before the built-in HTML middleware
126127
return () => {
128+
server.middlewares.use(angularHtmlFallbackMiddleware);
127129
function angularSSRMiddleware(req, res, next) {
128130
const url = req.originalUrl;
129131
if (!req.url ||
130132
// Skip if path is not defined.
131133
!url ||
132134
// Skip if path is like a file.
133-
// NOTE: We use a regexp to mitigate against matching requests like: /browse/pl.0ef59752c0cd457dbf1391f08cbd936f
134-
/^\.[a-z]{2,4}$/i.test((0, node_path_1.extname)(url.split('?')[0]))) {
135+
// NOTE: We use a mime type lookup to mitigate against matching requests like: /browse/pl.0ef59752c0cd457dbf1391f08cbd936f
136+
lookupMimeTypeFromRequest(url)) {
135137
next();
136138
return;
137139
}
@@ -227,3 +229,23 @@ function pathnameWithoutBasePath(url, basePath) {
227229
? pathname.slice(basePath.length - 1)
228230
: pathname;
229231
}
232+
function angularHtmlFallbackMiddleware(req, res, next) {
233+
// Similar to how it is handled in vite
234+
// https://github.com/vitejs/vite/blob/main/packages/vite/src/node/server/middlewares/htmlFallback.ts#L15C19-L15C45
235+
if ((req.method === 'GET' || req.method === 'HEAD') &&
236+
(!req.url || !lookupMimeTypeFromRequest(req.url)) &&
237+
(!req.headers.accept ||
238+
req.headers.accept.includes('text/html') ||
239+
req.headers.accept.includes('text/*') ||
240+
req.headers.accept.includes('*/*'))) {
241+
req.url = '/index.html';
242+
}
243+
next();
244+
}
245+
function lookupMimeTypeFromRequest(url) {
246+
const extension = (0, node_path_1.extname)(url.split('?')[0]);
247+
if (extension === '.ico') {
248+
return 'image/x-icon';
249+
}
250+
return extension && (0, mrmime_1.lookup)(extension);
251+
}

uniqueId

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
Wed Jan 24 2024 15:20:44 GMT+0000 (Coordinated Universal Time)
1+
Wed Jan 24 2024 17:58:49 GMT+0000 (Coordinated Universal Time)

0 commit comments

Comments
 (0)