From 8330992e27fa044bfaec9106fc070af317f55824 Mon Sep 17 00:00:00 2001 From: Charles Lyding <19598772+clydin@users.noreply.github.com> Date: Wed, 14 May 2025 11:02:15 -0400 Subject: [PATCH] fix(@schematics/angular): support using default browser option when not present The Angular schematics that require knowledge of the main entry point of an application will now use the default value for the `application` builder. The default value as per the `application` build system is `/main.ts`. --- .../angular/environments/index_spec.ts | 2 +- packages/schematics/angular/server/index_spec.ts | 2 +- .../schematics/angular/service-worker/index.ts | 6 ++---- .../angular/service-worker/index_spec.ts | 2 +- packages/schematics/angular/ssr/index_spec.ts | 2 +- .../angular/utility/standalone/util.ts | 16 ++++++++++++---- 6 files changed, 18 insertions(+), 12 deletions(-) diff --git a/packages/schematics/angular/environments/index_spec.ts b/packages/schematics/angular/environments/index_spec.ts index 3db69c5d866c..d53026a28a4d 100644 --- a/packages/schematics/angular/environments/index_spec.ts +++ b/packages/schematics/angular/environments/index_spec.ts @@ -50,7 +50,7 @@ describe('Environments Schematic', () => { build.builder = Builders.Browser; build.options = { ...build.options, - main: build.options.browser, + main: 'projects/foo/src/main.ts', browser: undefined, }; diff --git a/packages/schematics/angular/server/index_spec.ts b/packages/schematics/angular/server/index_spec.ts index f3e5e277d8ef..de6046e38c00 100644 --- a/packages/schematics/angular/server/index_spec.ts +++ b/packages/schematics/angular/server/index_spec.ts @@ -269,7 +269,7 @@ describe('Server Schematic', () => { build.builder = Builders.Browser; build.options = { ...build.options, - main: build.options.browser, + main: 'projects/bar/src/main.ts', browser: undefined, }; diff --git a/packages/schematics/angular/service-worker/index.ts b/packages/schematics/angular/service-worker/index.ts index e32969d9d0c6..0f794981faa0 100644 --- a/packages/schematics/angular/service-worker/index.ts +++ b/packages/schematics/angular/service-worker/index.ts @@ -28,7 +28,7 @@ import { getAppModulePath, isStandaloneApp } from '../utility/ng-ast-utils'; import { relativePathToWorkspaceRoot } from '../utility/paths'; import { targetBuildNotFoundError } from '../utility/project-targets'; import { findAppConfig } from '../utility/standalone/app_config'; -import { findBootstrapApplicationCall } from '../utility/standalone/util'; +import { findBootstrapApplicationCall, getMainFilePath } from '../utility/standalone/util'; import { Builders } from '../utility/workspace-models'; import { Schema as ServiceWorkerOptions } from './schema'; @@ -119,20 +119,18 @@ export default function (options: ServiceWorkerOptions): Rule { } const buildOptions = buildTarget.options as Record; - let browserEntryPoint: string | undefined; + const browserEntryPoint = await getMainFilePath(host, options.project); const ngswConfigPath = join(normalize(project.root), 'ngsw-config.json'); if ( buildTarget.builder === Builders.Application || buildTarget.builder === Builders.BuildApplication ) { - browserEntryPoint = buildOptions.browser as string; const productionConf = buildTarget.configurations?.production; if (productionConf) { productionConf.serviceWorker = ngswConfigPath; } } else { - browserEntryPoint = buildOptions.main as string; buildOptions.serviceWorker = true; buildOptions.ngswConfigPath = ngswConfigPath; } diff --git a/packages/schematics/angular/service-worker/index_spec.ts b/packages/schematics/angular/service-worker/index_spec.ts index e9ec677f44ba..fbd976e48960 100644 --- a/packages/schematics/angular/service-worker/index_spec.ts +++ b/packages/schematics/angular/service-worker/index_spec.ts @@ -203,7 +203,7 @@ describe('Service Worker Schematic', () => { build.builder = Builders.Browser; build.options = { ...build.options, - main: build.options.browser, + main: 'projects/bar/src/main.ts', browser: undefined, }; diff --git a/packages/schematics/angular/ssr/index_spec.ts b/packages/schematics/angular/ssr/index_spec.ts index 97b534aba8e1..4c70e971e54b 100644 --- a/packages/schematics/angular/ssr/index_spec.ts +++ b/packages/schematics/angular/ssr/index_spec.ts @@ -182,7 +182,7 @@ describe('SSR Schematic', () => { build.builder = '@angular-devkit/build-angular:browser'; build.options = { ...build.options, - main: build.options.browser, + main: 'projects/test-app/src/main.ts', browser: undefined, }; diff --git a/packages/schematics/angular/utility/standalone/util.ts b/packages/schematics/angular/utility/standalone/util.ts index 6d5648b68fd6..4c64e68ad559 100644 --- a/packages/schematics/angular/utility/standalone/util.ts +++ b/packages/schematics/angular/utility/standalone/util.ts @@ -7,6 +7,7 @@ */ import { SchematicsException, Tree } from '@angular-devkit/schematics'; +import { join } from 'node:path/posix'; import ts from '../../third_party/github.com/Microsoft/TypeScript/lib/typescript'; import { Change, applyToUpdateRecorder } from '../change'; import { targetBuildNotFoundError } from '../project-targets'; @@ -23,16 +24,23 @@ export async function getMainFilePath(tree: Tree, projectName: string): Promise< const project = workspace.projects.get(projectName); const buildTarget = project?.targets.get('build'); - if (!buildTarget) { + if (!project || !buildTarget) { throw targetBuildNotFoundError(); } const options = buildTarget.options as Record; - return buildTarget.builder === Builders.Application || + if ( + buildTarget.builder === Builders.Application || buildTarget.builder === Builders.BuildApplication - ? options.browser - : options.main; + ) { + // These builders support a default of `/main.ts` + const projectSourceRoot = project.sourceRoot ?? join(project.root, 'src'); + + return options.browser ?? join(projectSourceRoot, 'main.ts'); + } + + return options.main; } /**