Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 3 additions & 3 deletions packages/angular/build/src/builders/unit-test/options.ts
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ 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 UnitTestBuilderOptions } from './schema';
import { Runner, type Schema as UnitTestBuilderOptions } from './schema';

export type NormalizedUnitTestBuilderOptions = Awaited<ReturnType<typeof normalizeOptions>>;

Expand Down Expand Up @@ -56,7 +56,7 @@ export async function normalizeOptions(

const { runner, browsers, progress, filter, browserViewport, ui, runnerConfig } = options;

if (ui && runner !== 'vitest') {
if (ui && runner !== Runner.Vitest) {
throw new Error('The "ui" option is only available for the "vitest" runner.');
}

Expand Down Expand Up @@ -95,7 +95,7 @@ export async function normalizeOptions(
include: options.include ?? ['**/*.spec.ts'],
exclude: options.exclude,
filter,
runnerName: runner ?? 'vitest',
runnerName: runner ?? Runner.Vitest,
coverage: {
enabled: options.coverage,
exclude: options.coverageExclude,
Expand Down
4 changes: 2 additions & 2 deletions packages/angular/build/src/builders/unit-test/tests/setup.ts
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ import {
ApplicationBuilderOptions as ApplicationSchema,
buildApplication,
} from '../../../builders/application';
import { Schema } from '../schema';
import { Runner, Schema } from '../schema';

// TODO: Consider using package.json imports field instead of relative path
// after the switch to rules_js.
Expand Down Expand Up @@ -61,7 +61,7 @@ export const UNIT_TEST_BUILDER_INFO = Object.freeze({
export const BASE_OPTIONS = Object.freeze<Schema>({
buildTarget: 'test:build',
tsConfig: 'src/tsconfig.spec.json',
runner: 'vitest' as any,
runner: Runner.Vitest,
});

/**
Expand Down
80 changes: 12 additions & 68 deletions packages/schematics/angular/application/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@ import {
url,
} from '@angular-devkit/schematics';
import { Schema as ComponentOptions, Style as ComponentStyle } from '../component/schema';
import { addTestRunnerDependencies } from '../utility/dependencies';
import {
DependencyType,
ExistingBehavior,
Expand All @@ -34,7 +35,7 @@ import { latestVersions } from '../utility/latest-versions';
import { relativePathToWorkspaceRoot } from '../utility/paths';
import { getWorkspace, updateWorkspace } from '../utility/workspace';
import { Builders, ProjectType } from '../utility/workspace-models';
import { Schema as ApplicationOptions, Style } from './schema';
import { Schema as ApplicationOptions, Style, TestRunner } from './schema';

const APPLICATION_DEV_DEPENDENCIES = [
{ name: '@angular/compiler-cli', version: latestVersions.Angular },
Expand Down Expand Up @@ -187,62 +188,7 @@ function addDependenciesToPackageJson(options: ApplicationOptions): Rule {
}

if (!options.skipTests) {
if (options.testRunner === 'vitest') {
rules.push(
addDependency('vitest', latestVersions['vitest'], {
type: DependencyType.Dev,
existing: ExistingBehavior.Skip,
install: options.skipInstall ? InstallBehavior.None : InstallBehavior.Auto,
}),
addDependency('jsdom', latestVersions['jsdom'], {
type: DependencyType.Dev,
existing: ExistingBehavior.Skip,
install: options.skipInstall ? InstallBehavior.None : InstallBehavior.Auto,
}),
);
} else {
rules.push(
addDependency('karma', latestVersions['karma'], {
type: DependencyType.Dev,
existing: ExistingBehavior.Skip,
install: options.skipInstall ? InstallBehavior.None : InstallBehavior.Auto,
}),
addDependency('karma-chrome-launcher', latestVersions['karma-chrome-launcher'], {
type: DependencyType.Dev,
existing: ExistingBehavior.Skip,
install: options.skipInstall ? InstallBehavior.None : InstallBehavior.Auto,
}),
addDependency('karma-coverage', latestVersions['karma-coverage'], {
type: DependencyType.Dev,
existing: ExistingBehavior.Skip,
install: options.skipInstall ? InstallBehavior.None : InstallBehavior.Auto,
}),
addDependency('karma-jasmine', latestVersions['karma-jasmine'], {
type: DependencyType.Dev,
existing: ExistingBehavior.Skip,
install: options.skipInstall ? InstallBehavior.None : InstallBehavior.Auto,
}),
addDependency(
'karma-jasmine-html-reporter',
latestVersions['karma-jasmine-html-reporter'],
{
type: DependencyType.Dev,
existing: ExistingBehavior.Skip,
install: options.skipInstall ? InstallBehavior.None : InstallBehavior.Auto,
},
),
addDependency('jasmine-core', latestVersions['jasmine-core'], {
type: DependencyType.Dev,
existing: ExistingBehavior.Skip,
install: options.skipInstall ? InstallBehavior.None : InstallBehavior.Auto,
}),
addDependency('@types/jasmine', latestVersions['@types/jasmine'], {
type: DependencyType.Dev,
existing: ExistingBehavior.Skip,
install: options.skipInstall ? InstallBehavior.None : InstallBehavior.Auto,
}),
);
}
rules.push(...addTestRunnerDependencies(options.testRunner, !!options.skipInstall));
}

return chain(rules);
Expand Down Expand Up @@ -392,17 +338,15 @@ function addAppToWorkspaceFile(options: ApplicationOptions, appDir: string): Rul
test:
options.skipTests || options.minimal
? undefined
: options.testRunner === 'vitest'
? {
builder: Builders.BuildUnitTest,
options: {},
}
: {
builder: Builders.BuildUnitTest,
options: {
runner: 'karma',
},
},
: {
builder: Builders.BuildUnitTest,
options:
options.testRunner === TestRunner.Vitest
? {}
: {
runner: 'karma',
},
},
},
};

Expand Down
4 changes: 2 additions & 2 deletions packages/schematics/angular/application/index_spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ import { SchematicTestRunner, UnitTestTree } from '@angular-devkit/schematics/te
import { parse as parseJson } from 'jsonc-parser';
import { latestVersions } from '../utility/latest-versions';
import { Schema as WorkspaceOptions } from '../workspace/schema';
import { Schema as ApplicationOptions, Style, ViewEncapsulation } from './schema';
import { Schema as ApplicationOptions, Style, TestRunner, ViewEncapsulation } from './schema';

// eslint-disable-next-line @typescript-eslint/no-explicit-any
function readJsonFile(tree: UnitTestTree, path: string): any {
Expand Down Expand Up @@ -442,7 +442,7 @@ describe('Application Schematic', () => {
});

it('should set values in angular.json correctly when testRunner is karma', async () => {
const options = { ...defaultOptions, projectRoot: '', testRunner: 'karma' as const };
const options = { ...defaultOptions, projectRoot: '', testRunner: TestRunner.Karma };
const tree = await schematicRunner.runSchematic('application', options, workspaceTree);

const config = JSON.parse(tree.readContent('/angular.json'));
Expand Down
41 changes: 21 additions & 20 deletions packages/schematics/angular/library/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@ import {
url,
} from '@angular-devkit/schematics';
import { join } from 'node:path/posix';
import { addTestRunnerDependencies } from '../utility/dependencies';
import {
DependencyType,
ExistingBehavior,
Expand All @@ -32,7 +33,7 @@ import { latestVersions } from '../utility/latest-versions';
import { relativePathToWorkspaceRoot } from '../utility/paths';
import { getWorkspace, updateWorkspace } from '../utility/workspace';
import { Builders, ProjectType } from '../utility/workspace-models';
import { Schema as LibraryOptions } from './schema';
import { Schema as LibraryOptions, TestRunner } from './schema';

const LIBRARY_DEV_DEPENDENCIES = [
{ name: '@angular/compiler-cli', version: latestVersions.Angular },
Expand Down Expand Up @@ -69,7 +70,7 @@ function addTsProjectReference(...paths: string[]) {
};
}

function addDependenciesToPackageJson(skipInstall: boolean): Rule {
function addDependenciesToPackageJson({ skipInstall, testRunner }: LibraryOptions): Rule {
return chain([
...LIBRARY_DEV_DEPENDENCIES.map((dependency) =>
addDependency(dependency.name, dependency.version, {
Expand All @@ -78,6 +79,7 @@ function addDependenciesToPackageJson(skipInstall: boolean): Rule {
install: skipInstall ? InstallBehavior.None : InstallBehavior.Auto,
}),
),
...addTestRunnerDependencies(testRunner, !!skipInstall),
addDependency('tslib', latestVersions['tslib'], {
type: DependencyType.Default,
existing: ExistingBehavior.Skip,
Expand All @@ -91,7 +93,6 @@ function addLibToWorkspaceFile(
projectRoot: string,
projectName: string,
hasZoneDependency: boolean,
hasVitest: boolean,
): Rule {
return updateWorkspace((workspace) => {
workspace.projects.add({
Expand All @@ -113,20 +114,21 @@ function addLibToWorkspaceFile(
},
},
},
test: hasVitest
? {
builder: Builders.BuildUnitTest,
options: {
tsConfig: `${projectRoot}/tsconfig.spec.json`,
test:
options.testRunner === TestRunner.Vitest
? {
builder: Builders.BuildUnitTest,
options: {
tsConfig: `${projectRoot}/tsconfig.spec.json`,
},
}
: {
builder: Builders.BuildKarma,
options: {
tsConfig: `${projectRoot}/tsconfig.spec.json`,
polyfills: hasZoneDependency ? ['zone.js', 'zone.js/testing'] : undefined,
},
},
}
: {
builder: Builders.BuildKarma,
options: {
tsConfig: `${projectRoot}/tsconfig.spec.json`,
polyfills: hasZoneDependency ? ['zone.js', 'zone.js/testing'] : undefined,
},
},
},
});
});
Expand Down Expand Up @@ -158,7 +160,6 @@ export default function (options: LibraryOptions): Rule {

const distRoot = `dist/${folderName}`;
const sourceDir = `${libDir}/src/lib`;
const hasVitest = getDependency(host, 'vitest') !== null;

const templateSource = apply(url('./files'), [
applyTemplates({
Expand All @@ -172,7 +173,7 @@ export default function (options: LibraryOptions): Rule {
angularLatestVersion: latestVersions.Angular.replace(/~|\^/, ''),
tsLibLatestVersion: latestVersions['tslib'].replace(/~|\^/, ''),
folderName,
testTypesPackage: hasVitest ? 'vitest/globals' : 'jasmine',
testTypesPackage: options.testRunner === TestRunner.Vitest ? 'vitest/globals' : 'jasmine',
}),
move(libDir),
]);
Expand All @@ -181,8 +182,8 @@ export default function (options: LibraryOptions): Rule {

return chain([
mergeWith(templateSource),
addLibToWorkspaceFile(options, libDir, packageName, hasZoneDependency, hasVitest),
options.skipPackageJson ? noop() : addDependenciesToPackageJson(!!options.skipInstall),
addLibToWorkspaceFile(options, libDir, packageName, hasZoneDependency),
options.skipPackageJson ? noop() : addDependenciesToPackageJson(options),
options.skipTsConfig ? noop() : updateTsConfig(packageName, './' + distRoot),
options.skipTsConfig
? noop()
Expand Down
4 changes: 2 additions & 2 deletions packages/schematics/angular/library/index_spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -407,11 +407,11 @@ describe('Library Schematic', () => {
expect(workspace.projects.foo.architect.build.builder).toBe('@angular/build:ng-packagr');
});

it(`should add 'karma' test builder`, async () => {
it(`should add 'unit-test' test builder`, async () => {
const tree = await schematicRunner.runSchematic('library', defaultOptions, workspaceTree);

const workspace = JSON.parse(tree.readContent('/angular.json'));
expect(workspace.projects.foo.architect.test.builder).toBe('@angular/build:karma');
expect(workspace.projects.foo.architect.test.builder).toBe('@angular/build:unit-test');
});

it(`should add 'unit-test' test builder`, async () => {
Expand Down
6 changes: 6 additions & 0 deletions packages/schematics/angular/library/schema.json
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,12 @@
"type": "boolean",
"default": true,
"x-user-analytics": "ep.ng_standalone"
},
"testRunner": {
"description": "The unit testing runner to use.",
"type": "string",
"enum": ["vitest", "karma"],
"default": "vitest"
}
},
"required": ["name"]
Expand Down
19 changes: 12 additions & 7 deletions packages/schematics/angular/ng-new/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ import {
import { Schema as ApplicationOptions } from '../application/schema';
import { JSONFile } from '../utility/json-file';
import { Schema as WorkspaceOptions } from '../workspace/schema';
import { Schema as NgNewOptions } from './schema';
import { Schema as NgNewOptions, TestRunner } from './schema';

export default function (options: NgNewOptions): Rule {
if (!options.directory) {
Expand Down Expand Up @@ -67,16 +67,21 @@ export default function (options: NgNewOptions): Rule {
mergeWith(
apply(empty(), [
schematic('workspace', workspaceOptions),
options.createApplication ? schematic('application', applicationOptions) : noop,
schematic('ai-config', {
tool: options.aiConfig?.length ? options.aiConfig : undefined,
}),
(tree: Tree) => {
if (options.testRunner === 'karma') {
if (options.testRunner === TestRunner.Karma) {
const file = new JSONFile(tree, 'angular.json');
file.modify(['schematics', '@schematics/angular:application', 'testRunner'], 'karma');
// eslint-disable-next-line @typescript-eslint/no-explicit-any
const schematics = file.get(['schematics']) ?? ({} as any);
(schematics['@schematics/angular:application'] ??= {}).testRunner = TestRunner.Karma;
(schematics['@schematics/angular:library'] ??= {}).testRunner = TestRunner.Karma;

file.modify(['schematics'], schematics);
}
},
options.createApplication ? schematic('application', applicationOptions) : noop,
schematic('ai-config', {
tool: options.aiConfig?.length ? options.aiConfig : undefined,
}),
move(options.directory),
]),
),
Expand Down
7 changes: 4 additions & 3 deletions packages/schematics/angular/ng-new/index_spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
*/

import { SchematicTestRunner } from '@angular-devkit/schematics/testing';
import { Schema as NgNewOptions } from './schema';
import { Schema as NgNewOptions, TestRunner } from './schema';

describe('Ng New Schematic', () => {
const schematicRunner = new SchematicTestRunner(
Expand Down Expand Up @@ -159,7 +159,7 @@ describe('Ng New Schematic', () => {
});

it(`should set 'testRunner' to 'karma'`, async () => {
const options = { ...defaultOptions, testRunner: 'karma' as const };
const options = { ...defaultOptions, testRunner: TestRunner.Karma };
const tree = await schematicRunner.runSchematic('ng-new', options);

const {
Expand All @@ -178,11 +178,12 @@ describe('Ng New Schematic', () => {
});

it(`should set 'testRunner' to 'karma' in workspace schematic options`, async () => {
const options = { ...defaultOptions, testRunner: 'karma' as const };
const options = { ...defaultOptions, testRunner: TestRunner.Karma };
const tree = await schematicRunner.runSchematic('ng-new', options);

const { schematics } = JSON.parse(tree.readContent('/bar/angular.json'));
expect(schematics['@schematics/angular:application'].testRunner).toBe('karma');
expect(schematics['@schematics/angular:library'].testRunner).toBe('karma');
});

it(`should not add type to class name when file name style guide is '2016'`, async () => {
Expand Down
Loading