From 5c16bbdb469e12af4b152215fc081202bb56a233 Mon Sep 17 00:00:00 2001 From: Alan Agius <17563226+alan-agius4@users.noreply.github.com> Date: Thu, 3 Jul 2025 12:35:47 +0000 Subject: [PATCH] fix(@angular/build): expose unit test and karma builder API This commit exposes the Karma and Unit test builder API Closes: #30644 --- goldens/public-api/angular/build/index.api.md | 60 +++++++++++++++++++ .../build/src/builders/unit-test/builder.ts | 14 +++-- .../build/src/builders/unit-test/index.ts | 6 +- .../src/builders/unit-test/karma-bridge.ts | 4 +- .../build/src/builders/unit-test/options.ts | 6 +- packages/angular/build/src/index.ts | 6 ++ 6 files changed, 83 insertions(+), 13 deletions(-) diff --git a/goldens/public-api/angular/build/index.api.md b/goldens/public-api/angular/build/index.api.md index aa9ac693864e..6e01517ec550 100644 --- a/goldens/public-api/angular/build/index.api.md +++ b/goldens/public-api/angular/build/index.api.md @@ -6,6 +6,7 @@ import { BuilderContext } from '@angular-devkit/architect'; import { BuilderOutput } from '@angular-devkit/architect'; +import type { ConfigOptions } from 'karma'; import type http from 'node:http'; import { OutputFile } from 'esbuild'; import type { Plugin as Plugin_2 } from 'esbuild'; @@ -151,9 +152,17 @@ export function executeDevServerBuilder(options: DevServerBuilderOptions, contex // @public export function executeExtractI18nBuilder(options: ExtractI18nBuilderOptions, context: BuilderContext, extensions?: ApplicationBuilderExtensions): Promise; +// @public +export function executeKarmaBuilder(options: KarmaBuilderOptions, context: BuilderContext, transforms?: { + karmaOptions?: (options: KarmaConfigOptions) => KarmaConfigOptions; +}): AsyncIterable; + // @public export function executeNgPackagrBuilder(options: NgPackagrBuilderOptions, context: BuilderContext): AsyncIterableIterator; +// @public +export function executeUnitTestBuilder(options: UnitTestBuilderOptions, context: BuilderContext, extensions?: ApplicationBuilderExtensions): AsyncIterable; + // @public export type ExtractI18nBuilderOptions = { buildTarget?: string; @@ -164,6 +173,40 @@ export type ExtractI18nBuilderOptions = { progress?: boolean; }; +// @public +export type KarmaBuilderOptions = { + aot?: boolean; + assets?: AssetPattern_2[]; + browsers?: Browsers; + codeCoverage?: boolean; + codeCoverageExclude?: string[]; + define?: { + [key: string]: string; + }; + exclude?: string[]; + externalDependencies?: string[]; + fileReplacements?: FileReplacement_2[]; + include?: string[]; + inlineStyleLanguage?: InlineStyleLanguage_2; + karmaConfig?: string; + loader?: { + [key: string]: any; + }; + main?: string; + poll?: number; + polyfills?: string[]; + preserveSymlinks?: boolean; + progress?: boolean; + reporters?: string[]; + scripts?: ScriptElement_2[]; + sourceMap?: SourceMapUnion_2; + stylePreprocessorOptions?: StylePreprocessorOptions_2; + styles?: StyleElement_2[]; + tsConfig: string; + watch?: boolean; + webWorkerTsConfig?: string; +}; + // @public export type NgPackagrBuilderOptions = { poll?: number; @@ -172,6 +215,23 @@ export type NgPackagrBuilderOptions = { watch?: boolean; }; +// @public +export type UnitTestBuilderOptions = { + browsers?: string[]; + buildTarget: string; + codeCoverage?: boolean; + codeCoverageExclude?: string[]; + codeCoverageReporters?: SchemaCodeCoverageReporter[]; + debug?: boolean; + exclude?: string[]; + include?: string[]; + providersFile?: string; + reporters?: string[]; + runner: Runner; + tsConfig: string; + watch?: boolean; +}; + // (No @packageDocumentation comment for this package) ``` diff --git a/packages/angular/build/src/builders/unit-test/builder.ts b/packages/angular/build/src/builders/unit-test/builder.ts index 2df5aed0eabb..f056dd4d10b0 100644 --- a/packages/angular/build/src/builders/unit-test/builder.ts +++ b/packages/angular/build/src/builders/unit-test/builder.ts @@ -24,10 +24,14 @@ import { OutputHashing } from '../application/schema'; import { writeTestFiles } from '../karma/application_builder'; import { findTests, getTestEntrypoints } from '../karma/find-tests'; import { useKarmaBuilder } from './karma-bridge'; -import { NormalizedUnitTestOptions, injectTestingPolyfills, normalizeOptions } from './options'; -import type { Schema as UnitTestOptions } from './schema'; +import { + NormalizedUnitTestBuilderOptions, + injectTestingPolyfills, + normalizeOptions, +} from './options'; +import type { Schema as UnitTestBuilderOptions } from './schema'; -export type { UnitTestOptions }; +export type { UnitTestBuilderOptions }; type VitestCoverageOption = Exclude; @@ -36,7 +40,7 @@ type VitestCoverageOption = Exclude { @@ -383,7 +387,7 @@ function generateOutputPath(): string { return path.join('dist', 'test-out', `${datePrefix}-${uuidSuffix}`); } function generateCoverageOption( - codeCoverage: NormalizedUnitTestOptions['codeCoverage'], + codeCoverage: NormalizedUnitTestBuilderOptions['codeCoverage'], workspaceRoot: string, outputPath: string, ): VitestCoverageOption { diff --git a/packages/angular/build/src/builders/unit-test/index.ts b/packages/angular/build/src/builders/unit-test/index.ts index bd325ec661fa..47666cdc1067 100644 --- a/packages/angular/build/src/builders/unit-test/index.ts +++ b/packages/angular/build/src/builders/unit-test/index.ts @@ -7,10 +7,10 @@ */ import { type Builder, createBuilder } from '@angular-devkit/architect'; -import { type UnitTestOptions, execute } from './builder'; +import { type UnitTestBuilderOptions, execute } from './builder'; -export { type UnitTestOptions, execute }; +export { type UnitTestBuilderOptions, execute }; -const builder: Builder = createBuilder(execute); +const builder: Builder = createBuilder(execute); export default builder; diff --git a/packages/angular/build/src/builders/unit-test/karma-bridge.ts b/packages/angular/build/src/builders/unit-test/karma-bridge.ts index ece522f59601..4fa7b085802c 100644 --- a/packages/angular/build/src/builders/unit-test/karma-bridge.ts +++ b/packages/angular/build/src/builders/unit-test/karma-bridge.ts @@ -9,11 +9,11 @@ import type { BuilderContext, BuilderOutput } from '@angular-devkit/architect'; import type { ApplicationBuilderInternalOptions } from '../application/options'; import type { KarmaBuilderOptions } from '../karma'; -import { type NormalizedUnitTestOptions, injectTestingPolyfills } from './options'; +import { type NormalizedUnitTestBuilderOptions, injectTestingPolyfills } from './options'; export async function useKarmaBuilder( context: BuilderContext, - unitTestOptions: NormalizedUnitTestOptions, + unitTestOptions: NormalizedUnitTestBuilderOptions, ): Promise> { if (unitTestOptions.debug) { context.logger.warn( diff --git a/packages/angular/build/src/builders/unit-test/options.ts b/packages/angular/build/src/builders/unit-test/options.ts index 5363d8916d97..43147a23c065 100644 --- a/packages/angular/build/src/builders/unit-test/options.ts +++ b/packages/angular/build/src/builders/unit-test/options.ts @@ -11,14 +11,14 @@ import path from 'node:path'; import { normalizeCacheOptions } from '../../utils/normalize-cache'; import { getProjectRootPaths } from '../../utils/project-metadata'; import { isTTY } from '../../utils/tty'; -import type { Schema as UnitTestOptions } from './schema'; +import type { Schema as UnitTestBuilderOptions } from './schema'; -export type NormalizedUnitTestOptions = Awaited>; +export type NormalizedUnitTestBuilderOptions = Awaited>; export async function normalizeOptions( context: BuilderContext, projectName: string, - options: UnitTestOptions, + options: UnitTestBuilderOptions, ) { // Setup base paths based on workspace root and project information const workspaceRoot = context.workspaceRoot; diff --git a/packages/angular/build/src/index.ts b/packages/angular/build/src/index.ts index a27e1f5ae9d2..2831f59a38f4 100644 --- a/packages/angular/build/src/index.ts +++ b/packages/angular/build/src/index.ts @@ -26,3 +26,9 @@ export { execute as executeNgPackagrBuilder, type NgPackagrBuilderOptions, } from './builders/ng-packagr'; +export { + execute as executeUnitTestBuilder, + type UnitTestBuilderOptions, +} from './builders/unit-test'; + +export { execute as executeKarmaBuilder, type KarmaBuilderOptions } from './builders/karma';