diff --git a/.changeset/large-tables-wonder.md b/.changeset/large-tables-wonder.md new file mode 100644 index 0000000000..05ab456543 --- /dev/null +++ b/.changeset/large-tables-wonder.md @@ -0,0 +1,5 @@ +--- +'@backstage/cli': patch +--- + +Add support for optional `auth` app entry point. diff --git a/packages/cli/src/lib/bundler/config.ts b/packages/cli/src/lib/bundler/config.ts index a9d5c2aa67..1361849063 100644 --- a/packages/cli/src/lib/bundler/config.ts +++ b/packages/cli/src/lib/bundler/config.ts @@ -127,6 +127,8 @@ export async function createConfig( plugins.push( new HtmlWebpackPlugin({ + chunks: ['main'], + filename: 'index.html', template: paths.targetHtml, templateParameters: { publicPath, @@ -135,6 +137,20 @@ export async function createConfig( }), ); + if (paths.targetAuthEntry) { + plugins.push( + new HtmlWebpackPlugin({ + chunks: ['auth'], + filename: 'auth/index.html', + template: paths.targetHtml, + templateParameters: { + publicPath, + config: frontendConfig, + }, + }), + ); + } + const buildInfo = await readBuildInfo(); plugins.push( new webpack.DefinePlugin({ @@ -172,7 +188,10 @@ export async function createConfig( }, devtool: isDev ? 'eval-cheap-module-source-map' : 'source-map', context: paths.targetPath, - entry: [...(options.additionalEntryPoints ?? []), paths.targetEntry], + entry: { + main: [...(options.additionalEntryPoints ?? []), paths.targetEntry], + ...(paths.targetAuthEntry ? { auth: paths.targetAuthEntry } : {}), + }, resolve: { extensions: ['.ts', '.tsx', '.mjs', '.js', '.jsx', '.json', '.wasm'], mainFields: ['browser', 'module', 'main'], diff --git a/packages/cli/src/lib/bundler/paths.ts b/packages/cli/src/lib/bundler/paths.ts index 3d4925c66b..33936137c5 100644 --- a/packages/cli/src/lib/bundler/paths.ts +++ b/packages/cli/src/lib/bundler/paths.ts @@ -38,6 +38,14 @@ export function resolveBundlingPaths(options: BundlingPathsOptions) { return resolvePath(targetDir, `${pathString}.js`); }; + const resolveTargetOptionalModule = (pathString: string) => { + try { + return resolveTargetModule(pathString); + } catch { + return undefined; + } + }; + let targetPublic = undefined; let targetHtml = resolvePath(targetDir, 'public/index.html'); @@ -51,12 +59,18 @@ export function resolveBundlingPaths(options: BundlingPathsOptions) { } } + let targetAuthHtml = targetHtml; + if (fs.pathExistsSync(resolvePath(targetDir, 'public/auth.html'))) { + targetAuthHtml = resolvePath(targetDir, 'public/auth.html'); + } + // Backend plugin dev run file const targetRunFile = resolvePath(targetDir, 'src/run.ts'); const runFileExists = fs.pathExistsSync(targetRunFile); return { targetHtml, + targetAuthHtml, targetPublic, targetPath: resolvePath(targetDir, '.'), targetRunFile: runFileExists ? targetRunFile : undefined, @@ -65,6 +79,7 @@ export function resolveBundlingPaths(options: BundlingPathsOptions) { targetSrc: resolvePath(targetDir, 'src'), targetDev: resolvePath(targetDir, 'dev'), targetEntry: resolveTargetModule(entry), + targetAuthEntry: resolveTargetOptionalModule('src/auth'), targetTsConfig: paths.resolveTargetRoot('tsconfig.json'), targetPackageJson: resolvePath(targetDir, 'package.json'), rootNodeModules: paths.resolveTargetRoot('node_modules'),