From 4f70cdb72166a8ca467d9d6606a0e0cd372608c0 Mon Sep 17 00:00:00 2001 From: Emily Xiong Date: Tue, 18 Feb 2025 07:54:35 -0800 Subject: [PATCH] feat(angular): add release option to angular publishable libraries (#29869) --- .../src/release-publishable-libraries.test.ts | 62 ++++++++++++++++++- .../src/generators/library/lib/add-project.ts | 11 +++- .../angular/src/generators/library/library.ts | 6 +- 3 files changed, 75 insertions(+), 4 deletions(-) diff --git a/e2e/release/src/release-publishable-libraries.test.ts b/e2e/release/src/release-publishable-libraries.test.ts index b8ad759cb9..c4c2f38e2f 100644 --- a/e2e/release/src/release-publishable-libraries.test.ts +++ b/e2e/release/src/release-publishable-libraries.test.ts @@ -26,6 +26,7 @@ expect.addSnapshotSerializer({ .replaceAll(/size:\s*\d*\s?B/g, 'size: XXXB') .replaceAll(/\d*\.\d*\s?kB/g, 'XXX.XXX kb') .replaceAll(/\d*B\s+src\//g, 'XXB src/') + .replaceAll(/\d*B\s+lib\//g, 'XXB lib/') .replaceAll(/\d*B\s+index/g, 'XXB index') .replaceAll(/total files:\s+\d*/g, 'total files: X') .replaceAll(/\d*B\s+README.md/g, 'XXB README.md') @@ -51,7 +52,7 @@ describe('release publishable libraries', () => { beforeAll(async () => { newProject({ - packages: ['@nx/js', '@nx/react'], + packages: ['@nx/js', '@nx/react', '@nx/angular'], }); // Normalize git committer information so it is deterministic in snapshots @@ -67,7 +68,7 @@ describe('release publishable libraries', () => { // This is the verdaccio instance that the e2e tests themselves are working from e2eRegistryUrl = execSync('npm config get registry').toString().trim(); - }, 60000); + }, 100000); beforeEach(() => { try { @@ -190,4 +191,61 @@ describe('release publishable libraries', () => { NX Successfully ran target nx-release-publish for project {project-name} `); }); + + it('should be able to release publishable angular library', async () => { + const angularLib = uniq('my-pkg-'); + runCLI( + `generate @nx/angular:lib packages/${angularLib} --publishable --importPath=@proj/${angularLib} --no-interactive` + ); + + const releaseOutput = runCLI(`release --specifier 0.0.4 --yes`); + expect(releaseOutput).toMatchInlineSnapshot(` + NX Executing pre-version command + NX Running release version for project: {project-name} + {project-name} 🔍 Reading data for package "@proj/{project-name}" from dist/packages/{project-name}/package.json + {project-name} 📄 Resolved the current version as 0.0.3 from git tag "v0.0.3". + {project-name} 📄 Using the provided version specifier "0.0.4". + {project-name} ✍️ New version 0.0.4 written to dist/packages/{project-name}/package.json + "name": "@proj/{project-name}", + - "version": "0.0.1", + + "version": "0.0.4", + "peerDependencies": { + } + + + NX Staging changed files with git + No files to stage. Skipping git add. + NX Generating an entry in CHANGELOG.md for v0.0.4 + + ## 0.0.4 (YYYY-MM-DD) + + + + This was a version bump only, there were no code changes. + + + ## 0.0.3 (YYYY-MM-DD) + This was a version bump only, there were no code changes. + NX Staging changed files with git + NX Committing changes with git + NX Tagging commit with git + NX Running target nx-release-publish for project {project-name}: + - {project-name} + > nx run {project-name}:nx-release-publish + 📦 @proj/{project-name}@0.0.4 + === Tarball Contents === + XXB README.md + XXX.XXX kb fesm2022/proj-{project-name}.mjs + XXX.XXX kb fesm2022/proj-{project-name}.mjs.map + XXB index.d.ts + XXB lib/{project-name}/{project-name}.component.d.ts + XXXB package.json + === Tarball Details === + name: @proj/{project-name} + version: 0.0.4 + filename: proj-{project-name}-0.0.4.tgz + package size: XXX.XXX kb + unpacked size: XXX.XXX kb + shasum: {SHASUM} + integrity: XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX + total files: X + Published to ${e2eRegistryUrl} with tag "latest" + NX Successfully ran target nx-release-publish for project {project-name} + `); + }); }); diff --git a/packages/angular/src/generators/library/lib/add-project.ts b/packages/angular/src/generators/library/lib/add-project.ts index 466ed991d8..40c8a65959 100644 --- a/packages/angular/src/generators/library/lib/add-project.ts +++ b/packages/angular/src/generators/library/lib/add-project.ts @@ -3,8 +3,9 @@ import { addProjectConfiguration, joinPathFragments } from '@nx/devkit'; import type { AngularProjectConfiguration } from '../../../utils/types'; import type { NormalizedSchema } from './normalized-schema'; import { addBuildTargetDefaults } from '@nx/devkit/src/generators/target-defaults-utils'; +import { addReleaseConfigForNonTsSolution } from '@nx/js/src/generators/library/utils/add-release-config'; -export function addProject( +export async function addProject( tree: Tree, libraryOptions: NormalizedSchema['libraryOptions'] ) { @@ -41,6 +42,14 @@ export function addProject( }, defaultConfiguration: 'production', }; + + if (libraryOptions.publishable) { + await addReleaseConfigForNonTsSolution( + tree, + libraryOptions.name, + project + ); + } } addProjectConfiguration(tree, libraryOptions.name, project); diff --git a/packages/angular/src/generators/library/library.ts b/packages/angular/src/generators/library/library.ts index 5605a60774..239898adf9 100644 --- a/packages/angular/src/generators/library/library.ts +++ b/packages/angular/src/generators/library/library.ts @@ -33,6 +33,7 @@ import { logShowProjectCommand } from '@nx/devkit/src/utils/log-show-project-com import { UnitTestRunner } from '../../utils/test-runners'; import { addVitest } from '../utils/add-vitest'; import { assertNotUsingTsSolutionSetup } from '@nx/js/src/utils/typescript/ts-solution-setup'; +import { releaseTasks } from '@nx/js/src/generators/library/utils/add-release-config'; export async function libraryGenerator( tree: Tree, @@ -73,7 +74,7 @@ export async function libraryGenerator( ensureAngularDependencies(tree); } - const project = addProject(tree, libraryOptions); + const project = await addProject(tree, libraryOptions); createFiles(tree, options, project); updateTsConfig(tree, libraryOptions); @@ -112,6 +113,9 @@ export async function libraryGenerator( true ); addBuildableLibrariesPostCssDependencies(tree); + if (libraryOptions.publishable) { + await releaseTasks(tree); + } } addTsConfigPath(tree, libraryOptions.importPath, [