diff --git a/.circleci/config.yml b/.circleci/config.yml index 62e0e1fda433..b8b7eaab2e9a 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -254,6 +254,12 @@ jobs: - custom_attach_workspace - run: yarn build + build-bazel-e2e: + executor: action-executor + steps: + - custom_attach_workspace + - run: yarn bazel build //tests/legacy-cli/... + test: executor: test-executor resource_class: xlarge @@ -379,6 +385,12 @@ workflows: requires: - build + # Compile the e2e tests with bazel to ensure the non-runtime typescript + # compilation completes succesfully. + - build-bazel-e2e: + requires: + - build + # Windows jobs - e2e-cli-win: requires: diff --git a/lib/BUILD.bazel b/lib/BUILD.bazel new file mode 100644 index 000000000000..6f80a75580f2 --- /dev/null +++ b/lib/BUILD.bazel @@ -0,0 +1,12 @@ +load("//tools:defaults.bzl", "ts_library") + +ts_library( + name = "lib", + srcs = ["packages.ts"], + visibility = ["//visibility:public"], + deps = [ + "//packages/angular_devkit/core", + "@npm//@types/node", + "@npm//typescript", + ], +) diff --git a/tests/legacy-cli/BUILD.bazel b/tests/legacy-cli/BUILD.bazel new file mode 100644 index 000000000000..a2c76fbbe307 --- /dev/null +++ b/tests/legacy-cli/BUILD.bazel @@ -0,0 +1,25 @@ +load("//tools:defaults.bzl", "ts_library") + +ts_library( + name = "runner", + testonly = True, + srcs = glob(["**/*.ts"]), + data = [ + "verdaccio.yaml", + "verdaccio_auth.yaml", + ], + deps = [ + "//packages/angular_devkit/core", + "//packages/angular_devkit/core/node", + "//tests/legacy-cli/e2e/assets", + "//tests/legacy-cli/e2e/utils", + "@npm//@types/glob", + "@npm//@types/yargs-parser", + "@npm//ansi-colors", + "@npm//yargs-parser", + + # Loaded dynamically at runtime, not compiletime deps + "//tests/legacy-cli/e2e/setup", + "//tests/legacy-cli/e2e/tests", + ], +) diff --git a/tests/legacy-cli/e2e/assets/BUILD.bazel b/tests/legacy-cli/e2e/assets/BUILD.bazel new file mode 100644 index 000000000000..c5067a937896 --- /dev/null +++ b/tests/legacy-cli/e2e/assets/BUILD.bazel @@ -0,0 +1,11 @@ +load("//tools:defaults.bzl", "js_library") + +js_library( + name = "assets", + srcs = glob(["**"]), + visibility = ["//visibility:public"], + deps = [ + "@npm//jasmine-spec-reporter", + "@npm//ts-node", + ], +) diff --git a/tests/legacy-cli/e2e/ng-snapshot/BUILD.bazel b/tests/legacy-cli/e2e/ng-snapshot/BUILD.bazel new file mode 100644 index 000000000000..5a929766ca6f --- /dev/null +++ b/tests/legacy-cli/e2e/ng-snapshot/BUILD.bazel @@ -0,0 +1,8 @@ +load("//tools:defaults.bzl", "ts_library") + +ts_library( + name = "ng-snapshot", + srcs = [], + data = ["package.json"], + visibility = ["//visibility:public"], +) diff --git a/tests/legacy-cli/e2e/setup/010-local-publish.ts b/tests/legacy-cli/e2e/setup/010-local-publish.ts index 41fd0df79e50..f8902b7d65c0 100644 --- a/tests/legacy-cli/e2e/setup/010-local-publish.ts +++ b/tests/legacy-cli/e2e/setup/010-local-publish.ts @@ -3,7 +3,7 @@ import { execWithEnv, extractNpmEnv } from '../utils/process'; import { isPrereleaseCli } from '../utils/project'; export default async function () { - const testRegistry = getGlobalVariable('package-registry'); + const testRegistry: string = getGlobalVariable('package-registry'); await execWithEnv( 'npm', [ diff --git a/tests/legacy-cli/e2e/setup/100-global-cli.ts b/tests/legacy-cli/e2e/setup/100-global-cli.ts index ce96a91f258e..9f8f1e5f2c5b 100644 --- a/tests/legacy-cli/e2e/setup/100-global-cli.ts +++ b/tests/legacy-cli/e2e/setup/100-global-cli.ts @@ -7,7 +7,7 @@ export default async function () { return; } - const testRegistry = getGlobalVariable('package-registry'); + const testRegistry: string = getGlobalVariable('package-registry'); // Install global Angular CLI. await silentNpm('install', '--global', '@angular/cli', `--registry=${testRegistry}`); diff --git a/tests/legacy-cli/e2e/setup/300-log-environment.ts b/tests/legacy-cli/e2e/setup/300-log-environment.ts index c2d0e6a8edf9..7428a763b9e9 100644 --- a/tests/legacy-cli/e2e/setup/300-log-environment.ts +++ b/tests/legacy-cli/e2e/setup/300-log-environment.ts @@ -10,7 +10,7 @@ export default async function () { return; } - console.log(` ${envName}: ${process.env[envName].replace(/[\n\r]+/g, '\n ')}`); + console.log(` ${envName}: ${process.env[envName]!.replace(/[\n\r]+/g, '\n ')}`); }); await node('--version'); diff --git a/tests/legacy-cli/e2e/setup/500-create-project.ts b/tests/legacy-cli/e2e/setup/500-create-project.ts index 5b0319cf2941..cfe623ce50f4 100644 --- a/tests/legacy-cli/e2e/setup/500-create-project.ts +++ b/tests/legacy-cli/e2e/setup/500-create-project.ts @@ -17,12 +17,10 @@ export default async function () { process.chdir(argv.reuse); await gitClean(); } else { - const extraArgs = []; - // Ensure local test registry is used when outside a project await setNPMConfigRegistry(true); - await ng('new', 'test-project', '--skip-install', ...extraArgs); + await ng('new', 'test-project', '--skip-install'); await expectFileToExist(join(process.cwd(), 'test-project')); process.chdir('./test-project'); diff --git a/tests/legacy-cli/e2e/setup/BUILD.bazel b/tests/legacy-cli/e2e/setup/BUILD.bazel new file mode 100644 index 000000000000..ed2b51101e41 --- /dev/null +++ b/tests/legacy-cli/e2e/setup/BUILD.bazel @@ -0,0 +1,11 @@ +load("//tools:defaults.bzl", "ts_library") + +ts_library( + name = "setup", + testonly = True, + srcs = glob(["**/*.ts"]), + visibility = ["//visibility:public"], + deps = [ + "//tests/legacy-cli/e2e/utils", + ], +) diff --git a/tests/legacy-cli/e2e/tests/BUILD.bazel b/tests/legacy-cli/e2e/tests/BUILD.bazel new file mode 100644 index 000000000000..4f01d7fc3887 --- /dev/null +++ b/tests/legacy-cli/e2e/tests/BUILD.bazel @@ -0,0 +1,20 @@ +load("//tools:defaults.bzl", "ts_library") + +ts_library( + name = "tests", + testonly = True, + srcs = glob(["**/*.ts"]), + visibility = ["//visibility:public"], + deps = [ + "//tests/legacy-cli/e2e/ng-snapshot", + "//tests/legacy-cli/e2e/utils", + "@npm//@types/express", + "@npm//@types/glob", + "@npm//@types/node-fetch", + "@npm//@types/semver", + "@npm//express", + "@npm//glob", + "@npm//node-fetch", + "@npm//semver", + ], +) diff --git a/tests/legacy-cli/e2e/tests/build/build-app-shell-with-schematic.ts b/tests/legacy-cli/e2e/tests/build/build-app-shell-with-schematic.ts index 00f5cedf71c2..8a51686f72eb 100644 --- a/tests/legacy-cli/e2e/tests/build/build-app-shell-with-schematic.ts +++ b/tests/legacy-cli/e2e/tests/build/build-app-shell-with-schematic.ts @@ -12,11 +12,13 @@ export default async function () { const isSnapshotBuild = getGlobalVariable('argv')['ng-snapshots']; if (isSnapshotBuild) { - const packagesToInstall = []; + const packagesToInstall: string[] = []; await updateJsonFile('package.json', (packageJson) => { const dependencies = packageJson['dependencies']; // Iterate over all of the packages to update them to the snapshot version. - for (const [name, version] of Object.entries(snapshots.dependencies)) { + for (const [name, version] of Object.entries( + snapshots.dependencies as { [p: string]: string }, + )) { if (name in dependencies && dependencies[name] !== version) { packagesToInstall.push(version); } diff --git a/tests/legacy-cli/e2e/tests/build/platform-server.ts b/tests/legacy-cli/e2e/tests/build/platform-server.ts index d5938c2efcc1..8f5f1627c061 100644 --- a/tests/legacy-cli/e2e/tests/build/platform-server.ts +++ b/tests/legacy-cli/e2e/tests/build/platform-server.ts @@ -12,11 +12,11 @@ export default async function () { const isSnapshotBuild = getGlobalVariable('argv')['ng-snapshots']; if (isSnapshotBuild) { - const packagesToInstall = []; + const packagesToInstall: string[] = []; await updateJsonFile('package.json', (packageJson) => { const dependencies = packageJson['dependencies']; // Iterate over all of the packages to update them to the snapshot version. - for (const [name, version] of Object.entries(snapshots.dependencies)) { + for (const [name, version] of Object.entries(snapshots.dependencies)) { if (name in dependencies && dependencies[name] !== version) { packagesToInstall.push(version); } diff --git a/tests/legacy-cli/e2e/tests/build/prod-build.ts b/tests/legacy-cli/e2e/tests/build/prod-build.ts index 12131b113275..a7da45344d51 100644 --- a/tests/legacy-cli/e2e/tests/build/prod-build.ts +++ b/tests/legacy-cli/e2e/tests/build/prod-build.ts @@ -39,7 +39,7 @@ export default async function () { } const indexContent = await readFile('dist/test-project/index.html'); - const mainPath = indexContent.match(/src="(main\.[0-9a-zA-Z]{0,32}\.js)"/)[1]; + const mainPath = indexContent.match(/src="(main\.[0-9a-zA-Z]{0,32}\.js)"/)![1]; // Content checks await expectFileToMatch(`dist/test-project/${mainPath}`, bootstrapRegExp); diff --git a/tests/legacy-cli/e2e/tests/commands/add/add-pwa.ts b/tests/legacy-cli/e2e/tests/commands/add/add-pwa.ts index 48dd9f29bc1c..d2115e2cfef2 100644 --- a/tests/legacy-cli/e2e/tests/commands/add/add-pwa.ts +++ b/tests/legacy-cli/e2e/tests/commands/add/add-pwa.ts @@ -53,7 +53,8 @@ export default async function () { // It should correctly generate assetGroups and include at least one URL in each group. const ngswJson = JSON.parse(await readFile(ngswPath)); - const assetGroups = ngswJson.assetGroups.map(({ name, urls }) => ({ + // @ts-ignore + const assetGroups: any[] = ngswJson.assetGroups.map(({ name, urls }) => ({ name, urlCount: urls.length, })); diff --git a/tests/legacy-cli/e2e/tests/i18n/ivy-localize-basehref.ts b/tests/legacy-cli/e2e/tests/i18n/ivy-localize-basehref.ts index fb74452a5ae4..b55cffc22f8d 100644 --- a/tests/legacy-cli/e2e/tests/i18n/ivy-localize-basehref.ts +++ b/tests/legacy-cli/e2e/tests/i18n/ivy-localize-basehref.ts @@ -11,7 +11,7 @@ import { ng } from '../../utils/process'; import { updateJsonFile } from '../../utils/project'; import { externalServer, langTranslations, setupI18nConfig } from './setup'; -const baseHrefs = { +const baseHrefs: { [l: string]: string } = { 'en-US': '/en/', fr: '/fr-FR/', de: '', @@ -59,7 +59,7 @@ export default async function () { await ng('e2e', `--configuration=${lang}`, '--port=0'); // Execute Application E2E tests for a production build without dev server - const server = externalServer(outputPath, baseHrefs[lang] || '/'); + const server = externalServer(outputPath, (baseHrefs[lang] as string) || '/'); try { await ng( 'e2e', diff --git a/tests/legacy-cli/e2e/tests/i18n/ivy-localize-hashes.ts b/tests/legacy-cli/e2e/tests/i18n/ivy-localize-hashes.ts index e370a1d209a4..166ca401b6b3 100644 --- a/tests/legacy-cli/e2e/tests/i18n/ivy-localize-hashes.ts +++ b/tests/legacy-cli/e2e/tests/i18n/ivy-localize-hashes.ts @@ -27,7 +27,7 @@ export default async function () { continue; } - hashes.set(`${lang}/${match.groups.name}`, match.groups.hash); + hashes.set(`${lang}/${match!.groups!.name}`, match!.groups!.hash); } } @@ -48,12 +48,12 @@ export default async function () { continue; } - const id = `${lang}/${match.groups.name}`; + const id = `${lang}/${match!.groups!.name}`; const hash = hashes.get(id); if (!hash) { throw new Error('Unexpected output entry: ' + id); } - if (hash === match.groups.hash) { + if (hash === match!.groups!.hash) { throw new Error('Hash value did not change for entry: ' + id); } diff --git a/tests/legacy-cli/e2e/tests/i18n/setup.ts b/tests/legacy-cli/e2e/tests/i18n/setup.ts index bca561214027..d7954d6e5d59 100644 --- a/tests/legacy-cli/e2e/tests/i18n/setup.ts +++ b/tests/legacy-cli/e2e/tests/i18n/setup.ts @@ -98,12 +98,12 @@ export const formats = { 'json': { ext: 'json', sourceCheck: '"locale": "en-US"', - replacements: [], + replacements: [] as RegExp[][], }, 'arb': { ext: 'arb', sourceCheck: '"@@locale": "en-US"', - replacements: [], + replacements: [] as RegExp[][], }, }; @@ -248,7 +248,7 @@ export async function setupI18nConfig(format: keyof typeof formats = 'xlf') { for (const { lang, translationReplacements } of langTranslations) { if (lang != sourceLocale) { await copyFile(translationFile, `src/locale/messages.${lang}.${formats[format].ext}`); - for (const replacements of translationReplacements) { + for (const replacements of translationReplacements!) { await replaceInFile( `src/locale/messages.${lang}.${formats[format].ext}`, new RegExp(replacements[0], 'g'), diff --git a/tests/legacy-cli/e2e/tests/misc/completion-prompt.ts b/tests/legacy-cli/e2e/tests/misc/completion-prompt.ts index 983fc55f87e4..e4079c9ee7c3 100644 --- a/tests/legacy-cli/e2e/tests/misc/completion-prompt.ts +++ b/tests/legacy-cli/e2e/tests/misc/completion-prompt.ts @@ -408,7 +408,7 @@ source <(ng completion script) const localCliDir = path.join(projectDir, 'node_modules', '.bin'); const localCliBinary = path.join(localCliDir, 'ng'); - const pathDirs = process.env['PATH'].split(':'); + const pathDirs = process.env['PATH']!.split(':'); const pathEnvVar = [...pathDirs, localCliDir].join(':'); const { stdout } = await execWithEnv(localCliBinary, ['version'], { ...DEFAULT_ENV, diff --git a/tests/legacy-cli/e2e/tests/misc/e2e-host.ts b/tests/legacy-cli/e2e/tests/misc/e2e-host.ts index 3ea2d6f72a31..6f5ba1e41332 100644 --- a/tests/legacy-cli/e2e/tests/misc/e2e-host.ts +++ b/tests/legacy-cli/e2e/tests/misc/e2e-host.ts @@ -3,7 +3,7 @@ import { killAllProcesses, ng } from '../../utils/process'; import { updateJsonFile } from '../../utils/project'; export default async function () { - const interfaces = [].concat.apply([], Object.values(os.networkInterfaces())); + const interfaces = Object.values(os.networkInterfaces()).flat() as os.NetworkInterfaceInfo[]; let host = ''; for (const { family, address, internal } of interfaces) { if (family === 'IPv4' && !internal) { diff --git a/tests/legacy-cli/e2e/tests/misc/http-headers.ts b/tests/legacy-cli/e2e/tests/misc/http-headers.ts index 23ebaaa2b5a0..8640d90dd781 100644 --- a/tests/legacy-cli/e2e/tests/misc/http-headers.ts +++ b/tests/legacy-cli/e2e/tests/misc/http-headers.ts @@ -24,7 +24,7 @@ export default async function () { }; }); - let errorMessage = null; + let errorMessage: string | null = null; try { await ng('e2e'); } catch (error) { diff --git a/tests/legacy-cli/e2e/tests/misc/npm-7.ts b/tests/legacy-cli/e2e/tests/misc/npm-7.ts index 10356f173ce2..31cf1a3ad668 100644 --- a/tests/legacy-cli/e2e/tests/misc/npm-7.ts +++ b/tests/legacy-cli/e2e/tests/misc/npm-7.ts @@ -39,7 +39,7 @@ export default async function () { const currentDirectory = process.cwd(); - const extraArgs = []; + const extraArgs: string[] = []; if (isPrereleaseCli()) { extraArgs.push('--next'); } diff --git a/tests/legacy-cli/e2e/tests/misc/public-host.ts b/tests/legacy-cli/e2e/tests/misc/public-host.ts index cdebc93e4070..bf1e74448694 100644 --- a/tests/legacy-cli/e2e/tests/misc/public-host.ts +++ b/tests/legacy-cli/e2e/tests/misc/public-host.ts @@ -8,8 +8,8 @@ export default function () { const firstLocalIp = Object.values(os.networkInterfaces()) .flat() - .filter((ni) => ni.family === 'IPv4' && !ni.internal) - .map((ni) => ni.address) + .filter((ni) => ni?.family === 'IPv4' && !ni?.internal) + .map((ni) => ni!.address) .shift(); const publicHost = `${firstLocalIp}:4200`; const localAddress = `http://${publicHost}`; diff --git a/tests/legacy-cli/e2e/tests/update/update-secure-registry.ts b/tests/legacy-cli/e2e/tests/update/update-secure-registry.ts index f6f7621ffc9a..18ab56859984 100644 --- a/tests/legacy-cli/e2e/tests/update/update-secure-registry.ts +++ b/tests/legacy-cli/e2e/tests/update/update-secure-registry.ts @@ -8,7 +8,7 @@ export default async function () { delete process.env['NPM_CONFIG_REGISTRY']; const worksMessage = 'We analyzed your package.json'; - const extraArgs = []; + const extraArgs: string[] = []; if (isPrereleaseCli()) { extraArgs.push('--next'); } diff --git a/tests/legacy-cli/e2e/utils/BUILD.bazel b/tests/legacy-cli/e2e/utils/BUILD.bazel new file mode 100644 index 000000000000..ef84018e745a --- /dev/null +++ b/tests/legacy-cli/e2e/utils/BUILD.bazel @@ -0,0 +1,25 @@ +load("//tools:defaults.bzl", "ts_library") + +ts_library( + name = "utils", + testonly = True, + srcs = glob(["**/*.ts"]), + visibility = ["//visibility:public"], + deps = [ + "//lib", + "//tests/legacy-cli/e2e/ng-snapshot", + "@npm//@types/glob", + "@npm//@types/node-fetch", + "@npm//@types/semver", + "@npm//@types/yargs-parser", + "@npm//ansi-colors", + "@npm//glob", + "@npm//protractor", + "@npm//puppeteer", + "@npm//rxjs", + "@npm//semver", + "@npm//tree-kill", + "@npm//verdaccio", + "@npm//verdaccio-auth-memory", + ], +) diff --git a/tests/legacy-cli/e2e/utils/env.ts b/tests/legacy-cli/e2e/utils/env.ts index 906f3de451b6..6202e1bb597b 100644 --- a/tests/legacy-cli/e2e/utils/env.ts +++ b/tests/legacy-cli/e2e/utils/env.ts @@ -4,9 +4,9 @@ export function setGlobalVariable(name: string, value: any) { global[name] = value; } -export function getGlobalVariable(name: string): any { +export function getGlobalVariable(name: string): T { if (!(name in global)) { throw new Error(`Trying to access variable "${name}" but it's not defined.`); } - return global[name]; + return global[name] as T; } diff --git a/tests/legacy-cli/e2e/utils/fs.ts b/tests/legacy-cli/e2e/utils/fs.ts index 69ddf92d944c..fd419b45683e 100644 --- a/tests/legacy-cli/e2e/utils/fs.ts +++ b/tests/legacy-cli/e2e/utils/fs.ts @@ -29,7 +29,7 @@ export function symlinkFile(from: string, to: string, type?: string): Promise { +export function createDir(path: string): Promise { return fs.mkdir(path, { recursive: true }); } diff --git a/tests/legacy-cli/e2e/utils/process.ts b/tests/legacy-cli/e2e/utils/process.ts index f1f4608f591e..4960cee26bf6 100644 --- a/tests/legacy-cli/e2e/utils/process.ts +++ b/tests/legacy-cli/e2e/utils/process.ts @@ -10,7 +10,7 @@ import treeKill from 'tree-kill'; interface ExecOptions { silent?: boolean; waitForMatch?: RegExp; - env?: { [varname: string]: string }; + env?: NodeJS.ProcessEnv; stdin?: string; cwd?: string; } @@ -61,7 +61,8 @@ function _exec(options: ExecOptions, cmd: string, args: string[]): Promise { + // @ts-ignore + childProcess.stdout!.on('data', (data: Buffer) => { stdout += data.toString('utf-8'); if (options.silent) { return; @@ -72,7 +73,8 @@ function _exec(options: ExecOptions, cmd: string, args: string[]): Promise line !== '') .forEach((line) => console.log(' ' + line)); }); - childProcess.stderr.on('data', (data: Buffer) => { + // @ts-ignore + childProcess.stderr!.on('data', (data: Buffer) => { stderr += data.toString('utf-8'); if (options.silent) { return; @@ -118,13 +120,15 @@ function _exec(options: ExecOptions, cmd: string, args: string[]): Promise { + // @ts-ignore + childProcess.stdout!.on('data', (data: Buffer) => { if (data.toString().match(match)) { resolve({ stdout, stderr }); matched = true; } }); - childProcess.stderr.on('data', (data: Buffer) => { + // @ts-ignore + childProcess.stderr!.on('data', (data: Buffer) => { if (data.toString().match(match)) { resolve({ stdout, stderr }); matched = true; @@ -134,8 +138,8 @@ function _exec(options: ExecOptions, cmd: string, args: string[]): Promise NPM_CONFIG_RE.test(v)) - .reduce( + .reduce( (vars, n) => { vars[n] = process.env[n]; return vars; @@ -171,13 +175,15 @@ export function waitForAnyProcessOutputToMatch( new Promise((resolve) => { let stdout = ''; let stderr = ''; - childProcess.stdout.on('data', (data: Buffer) => { + // @ts-ignore + childProcess.stdout!.on('data', (data: Buffer) => { stdout += data.toString(); if (data.toString().match(match)) { resolve({ stdout, stderr }); } }); - childProcess.stderr.on('data', (data: Buffer) => { + // @ts-ignore + childProcess.stderr!.on('data', (data: Buffer) => { stderr += data.toString(); if (data.toString().match(match)) { resolve({ stdout, stderr }); @@ -216,19 +222,14 @@ export function silentExec(cmd: string, ...args: string[]) { return _exec({ silent: true }, cmd, args); } -export function execWithEnv( - cmd: string, - args: string[], - env: { [varname: string]: string }, - stdin?: string, -) { +export function execWithEnv(cmd: string, args: string[], env: NodeJS.ProcessEnv, stdin?: string) { return _exec({ env, stdin }, cmd, args); } export async function execAndCaptureError( cmd: string, args: string[], - env?: { [varname: string]: string }, + env?: NodeJS.ProcessEnv, stdin?: string, ): Promise { try { @@ -243,7 +244,7 @@ export function execAndWaitForOutputToMatch( cmd: string, args: string[], match: RegExp, - env?: { [varName: string]: string }, + env?: NodeJS.ProcessEnv, ) { if (cmd === 'ng' && args[0] === 'serve') { // Accept matches up to 20 times after the initial match. diff --git a/tests/legacy-cli/e2e/utils/project.ts b/tests/legacy-cli/e2e/utils/project.ts index dc721c688efe..5843454e2254 100644 --- a/tests/legacy-cli/e2e/utils/project.ts +++ b/tests/legacy-cli/e2e/utils/project.ts @@ -1,6 +1,7 @@ import * as fs from 'fs'; import * as path from 'path'; import { prerelease, SemVer } from 'semver'; +import yargsParser from 'yargs-parser'; import { packages } from '../../../../lib/packages'; import { getGlobalVariable } from './env'; import { prependToFile, readFile, replaceInFile, writeFile } from './fs'; @@ -25,9 +26,8 @@ export function updateTsConfig(fn: (json: any) => any | void) { export function ngServe(...args: string[]) { return execAndWaitForOutputToMatch('ng', ['serve', ...args], / Compiled successfully./); } - -export async function prepareProjectForE2e(name) { - const argv: string[] = getGlobalVariable('argv'); +export async function prepareProjectForE2e(name: string) { + const argv: yargsParser.Arguments = getGlobalVariable('argv'); await git('config', 'user.email', 'angular-core+e2e@google.com'); await git('config', 'user.name', 'Angular CLI E2e'); @@ -88,7 +88,7 @@ export function useSha() { return updateJsonFile('package.json', (json) => { // Install over the project with snapshot builds. function replaceDependencies(key: string) { - const missingSnapshots = []; + const missingSnapshots: string[] = []; Object.keys(json[key] || {}) .filter((name) => name.match(/^@angular\//)) .forEach((name) => { @@ -229,5 +229,5 @@ export async function useCIChrome(projectDir: string = ''): Promise { export const NgCLIVersion = new SemVer(packages['@angular/cli'].version); export function isPrereleaseCli(): boolean { - return prerelease(NgCLIVersion)?.length > 0; + return (prerelease(NgCLIVersion)?.length ?? 0) > 0; } diff --git a/tests/legacy-cli/e2e_runner.ts b/tests/legacy-cli/e2e_runner.ts index 43bb286b0362..4d15654b45c3 100644 --- a/tests/legacy-cli/e2e_runner.ts +++ b/tests/legacy-cli/e2e_runner.ts @@ -70,7 +70,7 @@ function lastLogger() { } const testGlob = argv.glob || 'tests/**/*.ts'; -let currentFileName = null; +let currentFileName = ''; const e2eRoot = path.join(__dirname, 'e2e'); const allSetups = glob.sync('setup/**/*.ts', { nodir: true, cwd: e2eRoot }).sort(); @@ -157,7 +157,7 @@ Promise.all([findFreePort(), findFreePort()]).then(async ([httpPort, httpsPort]) }; let clean = true; - let previousDir = null; + let previousDir: string | null = null; return Promise.resolve() .then(() => printHeader(currentFileName, testIndex)) diff --git a/tools/defaults.bzl b/tools/defaults.bzl index edee9bc5c1e1..8f0e7867f333 100644 --- a/tools/defaults.bzl +++ b/tools/defaults.bzl @@ -1,7 +1,7 @@ """Re-export of some bazel rules with repository-wide defaults.""" load("@npm//@bazel/concatjs/internal:build_defs.bzl", _ts_library = "ts_library_macro") -load("@build_bazel_rules_nodejs//:index.bzl", "copy_to_bin", _pkg_npm = "pkg_npm") +load("@build_bazel_rules_nodejs//:index.bzl", "copy_to_bin", _js_library = "js_library", _pkg_npm = "pkg_npm") load("@rules_pkg//:pkg.bzl", "pkg_tar") load("@npm//@angular/dev-infra-private/bazel:extract_js_module_output.bzl", "extract_js_module_output") load("@aspect_bazel_lib//lib:utils.bzl", "to_label") @@ -50,6 +50,8 @@ def ts_library( **kwargs ) +js_library = _js_library + def pkg_npm(name, pkg_deps = [], use_prodmode_output = False, **kwargs): """Override of pkg_npm to produce package outputs and version substitutions conventional to the angular-cli project.