From 3de1cb608966654b691e502a439fc0205e5b9d55 Mon Sep 17 00:00:00 2001 From: Huy TQ <5723282+imhuytq@users.noreply.github.com> Date: Sat, 11 Jun 2022 01:55:57 +0700 Subject: [PATCH] fix(web): @nrwl/web:file-server throws 404 after refresh (#9839) --- docs/generated/packages/web.json | 5 ++++ .../executors/file-server/file-server.impl.ts | 28 +++++++++++++++---- .../web/src/executors/file-server/schema.d.ts | 1 + .../web/src/executors/file-server/schema.json | 5 ++++ 4 files changed, 33 insertions(+), 6 deletions(-) diff --git a/docs/generated/packages/web.json b/docs/generated/packages/web.json index d1e2fec6d64ce..f13cfdc343e03 100644 --- a/docs/generated/packages/web.json +++ b/docs/generated/packages/web.json @@ -937,6 +937,11 @@ "type": "boolean", "description": "Watch for file changes.", "default": true + }, + "spa": { + "type": "boolean", + "description": "Redirect 404 errors to index.html (useful for SPA's)", + "default": false } }, "additionalProperties": false, diff --git a/packages/web/src/executors/file-server/file-server.impl.ts b/packages/web/src/executors/file-server/file-server.impl.ts index b76df1680d289..de9ba90541dbf 100644 --- a/packages/web/src/executors/file-server/file-server.impl.ts +++ b/packages/web/src/executors/file-server/file-server.impl.ts @@ -1,15 +1,18 @@ -import { - ExecutorContext, - joinPathFragments, - workspaceLayout, -} from '@nrwl/devkit'; import * as chalk from 'chalk'; import { execFileSync, fork } from 'child_process'; import { watch } from 'chokidar'; +import { copyFileSync, unlinkSync } from 'fs'; import { createIgnore } from 'nx/src/utils/ignore'; import { readModulePackageJson } from 'nx/src/utils/package-json'; import { platform } from 'os'; -import { resolve } from 'path'; +import { join, resolve } from 'path'; + +import { + ExecutorContext, + joinPathFragments, + workspaceLayout, +} from '@nrwl/devkit'; + import { Schema } from './schema'; // platform specific command name @@ -139,6 +142,15 @@ export default async function* fileServerExecutor( run(); const outputPath = getBuildTargetOutputPath(options, context); + + if (options.spa) { + const src = join(outputPath, 'index.html'); + const dst = join(outputPath, '404.html'); + + // See: https://github.com/http-party/http-server#magic-files + copyFileSync(src, dst); + } + const args = getHttpServerArgs(options); const { path: pathToHttpServerPkgJson, packageJson } = @@ -163,6 +175,10 @@ export default async function* fileServerExecutor( if (disposeWatch) { disposeWatch(); } + + if (options.spa) { + unlinkSync(join(outputPath, '404.html')); + } }; process.on('exit', processExitListener); process.on('SIGTERM', processExitListener); diff --git a/packages/web/src/executors/file-server/schema.d.ts b/packages/web/src/executors/file-server/schema.d.ts index 45689858b224a..ec5fb0f1eeb1f 100644 --- a/packages/web/src/executors/file-server/schema.d.ts +++ b/packages/web/src/executors/file-server/schema.d.ts @@ -11,4 +11,5 @@ export interface Schema { withDeps: boolean; proxyOptions?: object; watch?: boolean; + spa: boolean; } diff --git a/packages/web/src/executors/file-server/schema.json b/packages/web/src/executors/file-server/schema.json index c40dec2c89351..ca944a0531681 100644 --- a/packages/web/src/executors/file-server/schema.json +++ b/packages/web/src/executors/file-server/schema.json @@ -60,6 +60,11 @@ "type": "boolean", "description": "Watch for file changes.", "default": true + }, + "spa": { + "type": "boolean", + "description": "Redirect 404 errors to index.html (useful for SPA's)", + "default": false } }, "additionalProperties": false,