diff --git a/.ng-dev/commit-message.mjs b/.ng-dev/commit-message.mjs index 8790c7d6d1e1..acf372245104 100644 --- a/.ng-dev/commit-message.mjs +++ b/.ng-dev/commit-message.mjs @@ -1,8 +1,8 @@ -import packages from '../lib/packages.js'; +import { getReleasablePackages } from '../lib/packages.mjs'; /** * The configuration for `ng-dev commit-message` commands. - * + * * @type { import("@angular/ng-dev").CommitMessageConfig } */ export const commitMessage = { @@ -10,5 +10,5 @@ export const commitMessage = { minBodyLength: 0, minBodyLengthTypeExcludes: ['docs'], // Note: When changing this logic, also change the `contributing.ejs` file. - scopes: [...Object.keys(packages.packages)], + scopes: getReleasablePackages().map(({ name }) => name), }; diff --git a/.ng-dev/release.mjs b/.ng-dev/release.mjs index c9d78449fd84..4871f71aac31 100644 --- a/.ng-dev/release.mjs +++ b/.ng-dev/release.mjs @@ -1,19 +1,16 @@ import semver from 'semver'; -import packages from '../lib/packages.js'; +import { getReleasablePackages } from '../lib/packages.mjs'; -const npmPackages = Object.entries(packages.releasePackages).map(([name, { experimental }]) => ({ - name, - experimental, -})); +const packages = getReleasablePackages(); -/** +/** * Configuration for the `ng-dev release` command. - * + * * @type { import("@angular/ng-dev").ReleaseConfig } */ export const release = { representativeNpmPackage: '@angular/cli', - npmPackages, + npmPackages: packages.map(({ name, experimental }) => ({ name, experimental })), buildPackages: async () => { // The `performNpmReleaseBuild` function is loaded at runtime to avoid loading additional // files and dependencies unless a build is required. @@ -26,7 +23,7 @@ export const release = { '../scripts/release-checks/dependency-ranges/index.mjs' ); - await assertValidDependencyRanges(newVersion, packages.releasePackages); + await assertValidDependencyRanges(newVersion, packages); }, releaseNotes: { groupOrder: [ diff --git a/.ng-dev/tsconfig.json b/.ng-dev/tsconfig.json index 1c0503523bf5..9f0a0f84be18 100644 --- a/.ng-dev/tsconfig.json +++ b/.ng-dev/tsconfig.json @@ -1,9 +1,11 @@ { "extends": "../tsconfig.json", "compilerOptions": { + "resolveJsonModule": true, "allowJs": true, "module": "Node16", "moduleResolution": "Node16", + "checkJs": true, "noEmit": true, "types": [] }, diff --git a/lib/packages.mjs b/lib/packages.mjs new file mode 100644 index 000000000000..defd9c4dbec6 --- /dev/null +++ b/lib/packages.mjs @@ -0,0 +1,32 @@ +/** + * @license + * Copyright Google LLC All Rights Reserved. + * + * Use of this source code is governed by an MIT-style license that can be + * found in the LICENSE file at https://angular.io/license + */ + +import fastGlob from 'fast-glob'; +import { readFileSync } from 'node:fs'; +import { createRequire } from 'node:module'; + +const require = createRequire(import.meta.url); +const monorepoData = require('../.monorepo.json'); + +export function getReleasablePackages() { + const packages = []; + for (const pkg of fastGlob.sync('./packages/*/*/package.json')) { + const data = JSON.parse(readFileSync(pkg, 'utf-8')); + if (!(data.name in monorepoData.packages)) { + throw new Error(`${data.name} does not exist in .monorepo.json`); + } + + if (data.private) { + continue; + } + + packages.push(data); + } + + return packages; +} diff --git a/package.json b/package.json index 03ff5da5c715..46c2a2a6e4d5 100644 --- a/package.json +++ b/package.json @@ -22,13 +22,13 @@ "build": "node ./bin/devkit-admin build", "build-tsc": "tsc -p tsconfig.json", "lint": "eslint --cache --max-warnings=0 \"**/*.ts\"", - "ng-dev": "ts-node --esm --project .ng-dev/tsconfig.json --transpile-only node_modules/@angular/ng-dev/bundles/cli.mjs", "templates": "node ./bin/devkit-admin templates", "validate": "node ./bin/devkit-admin validate", "postinstall": "yarn webdriver-update && yarn husky && patch-package --patch-dir tools/postinstall/patches", "//webdriver-update-README": "ChromeDriver version must match Puppeteer Chromium version, see https://github.com/GoogleChrome/puppeteer/releases http://chromedriver.chromium.org/downloads", "webdriver-update": "webdriver-manager update --standalone false --gecko false --versions.chrome 106.0.5249.21", "public-api:check": "node goldens/public-api/manage.js test", + "ng-dev": "node --no-warnings=ExperimentalWarning --loader ts-node/esm/transpile-only node_modules/@angular/ng-dev/bundles/cli.mjs", "public-api:update": "node goldens/public-api/manage.js accept", "ts-circular-deps:check": "yarn -s ng-dev ts-circular-deps check --config ./packages/circular-deps-test.conf.js", "ts-circular-deps:approve": "yarn -s ng-dev ts-circular-deps approve --config ./packages/circular-deps-test.conf.js", diff --git a/packages/angular/cli/src/commands/command-config.ts b/packages/angular/cli/src/commands/command-config.ts index 6bb4fc7d2679..3dd58186ecef 100644 --- a/packages/angular/cli/src/commands/command-config.ts +++ b/packages/angular/cli/src/commands/command-config.ts @@ -105,10 +105,13 @@ export const RootCommands: Record< }, }; -export const RootCommandsAliases = Object.values(RootCommands).reduce((prev, current) => { - current.aliases?.forEach((alias) => { - prev[alias] = current; - }); +export const RootCommandsAliases = Object.values(RootCommands).reduce( + (prev, current) => { + current.aliases?.forEach((alias) => { + prev[alias] = current; + }); - return prev; -}, {} as Record); + return prev; + }, + {} as Record, +); diff --git a/packages/angular_devkit/schematics/tasks/package-manager/link-task.ts b/packages/angular_devkit/schematics/tasks/package-manager/link-task.ts index 114aa8658813..77afe8176fa5 100644 --- a/packages/angular_devkit/schematics/tasks/package-manager/link-task.ts +++ b/packages/angular_devkit/schematics/tasks/package-manager/link-task.ts @@ -12,7 +12,10 @@ import { NodePackageName, NodePackageTaskOptions } from './options'; export class NodePackageLinkTask implements TaskConfigurationGenerator { quiet = true; - constructor(public packageName?: string, public workingDirectory?: string) {} + constructor( + public packageName?: string, + public workingDirectory?: string, + ) {} toConfiguration(): TaskConfiguration { return {