From 73e2bfc939616eeae86cf1d244065cf13410ba60 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pawe=C5=82=20Twardziak?= Date: Sun, 13 Oct 2024 15:51:05 +0200 Subject: [PATCH] chore(solid): align package to nx 20 Closes #1134 BREAKING CHANGE: generator option 'name' is optional in favor of 'directory' one --- docs/docs/solid/generators.md | 38 +++++++++---------- packages/solid/package.json | 14 +++---- .../application/application.spec.ts | 10 +++-- .../src/generators/application/application.ts | 35 ++++++++--------- .../src/generators/application/schema.d.ts | 6 +-- .../src/generators/application/schema.json | 24 +++++------- .../generators/component/component.spec.ts | 14 +++---- .../src/generators/library/library.spec.ts | 2 +- .../solid/src/generators/library/library.ts | 17 ++++----- .../solid/src/generators/library/schema.d.ts | 6 +-- .../solid/src/generators/library/schema.json | 19 +++++----- .../solid/src/generators/utils/testing.ts | 6 +-- 12 files changed, 94 insertions(+), 97 deletions(-) diff --git a/docs/docs/solid/generators.md b/docs/docs/solid/generators.md index 4949b84a..d5fabe7d 100644 --- a/docs/docs/solid/generators.md +++ b/docs/docs/solid/generators.md @@ -28,17 +28,13 @@ nx g application ... --dry-run ### Options -#### name (_**required**_) - -Type: `string` - -#### directory +#### directory (_**required**_) Alias(es): d Type: `string` -A directory where the lib is placed. +A directory where the project is placed. #### e2eTestRunner @@ -60,13 +56,13 @@ Possible values: `eslint` The tool to use for running lint checks. -#### projectNameAndRootFormat +#### name -Type: `string` +Alias(es): n -Possible values: `as-provided`, `derived` +Type: `string` -Whether to generate the project name and root directory as provided (`as-provided`) or generate them composing their values and taking the configured layout into account (`derived`). +A name of the project. #### rootProject (**hidden**) @@ -132,10 +128,14 @@ nx g library ... --dry-run ### Options -#### name (_**required**_) +#### directory (_**required**_) + +Alias(es): d Type: `string` +A directory where the project is placed. + #### buildable Default: `false` @@ -144,14 +144,6 @@ Type: `boolean` Generate a buildable library. -#### directory - -Alias(es): d - -Type: `string` - -A directory where the lib is placed. - #### e2eTestRunner Default: `cypress` @@ -178,6 +170,14 @@ Possible values: `eslint` The tool to use for running lint checks. +#### name + +Alias(es): n + +Type: `string` + +A name of the project. + #### publishable Type: `boolean` diff --git a/packages/solid/package.json b/packages/solid/package.json index 443eba8f..4dec81bf 100644 --- a/packages/solid/package.json +++ b/packages/solid/package.json @@ -27,13 +27,13 @@ "tslib": "^2.3.0" }, "peerDependencies": { - "@nx/devkit": "^19.0.0", - "@nx/vite": "^19.0.0", - "@nx/web": "^19.0.0", - "@nx/cypress": "^19.0.0", - "@nx/jest": "^19.0.0", - "@nx/eslint": "^19.0.0", - "@nx/js": "^19.0.0" + "@nx/devkit": "20.0.0", + "@nx/vite": "20.0.0", + "@nx/web": "20.0.0", + "@nx/cypress": "20.0.0", + "@nx/jest": "20.0.0", + "@nx/eslint": "20.0.0", + "@nx/js": "20.0.0" }, "nx-migrate": { "migrations": "./migrations.json" diff --git a/packages/solid/src/generators/application/application.spec.ts b/packages/solid/src/generators/application/application.spec.ts index e2ddc3e2..25646cc4 100644 --- a/packages/solid/src/generators/application/application.spec.ts +++ b/packages/solid/src/generators/application/application.spec.ts @@ -7,11 +7,10 @@ import { Tree } from '@nx/devkit'; describe('Solid app generator', () => { let tree: Tree; const options: Schema = { - name: 'myApp', + directory: 'apps/my-app', linter: Linter.EsLint, unitTestRunner: 'vitest', e2eTestRunner: 'cypress', - projectNameAndRootFormat: 'derived', }; beforeEach(() => { @@ -26,7 +25,12 @@ describe('Solid app generator', () => { }); it('should add vite specific files as rootProject', async () => { - await applicationGenerator(tree, { ...options, rootProject: true }); + await applicationGenerator(tree, { + ...options, + directory: '.', + name: options.directory.replace('apps/', ''), + rootProject: true, + }); expect(tree.exists(`public/index.html`)).toBeFalsy(); expect(tree.exists(`index.html`)).toBeTruthy(); }); diff --git a/packages/solid/src/generators/application/application.ts b/packages/solid/src/generators/application/application.ts index 91dc620e..76e2d459 100644 --- a/packages/solid/src/generators/application/application.ts +++ b/packages/solid/src/generators/application/application.ts @@ -16,27 +16,31 @@ import { addJest } from './lib/add-jest'; import { updateJestConfig } from './lib/update-jest-config'; import { addVite } from './lib/add-vite'; import { createFiles } from './lib/create-project-files'; -import { determineProjectNameAndRootOptions } from '@nx/devkit/src/generators/project-name-and-root-utils'; +import { + determineProjectNameAndRootOptions, + ensureProjectName, +} from '@nx/devkit/src/generators/project-name-and-root-utils'; async function normalizeOptions( host: Tree, - options: Schema, - callingGenerator = '@nxext/solid:application' + options: Schema ): Promise> { + await ensureProjectName(host, options, 'application'); const { - projectName: appProjectName, - projectRoot: appProjectRoot, - projectNameAndRootFormat, + projectName, + projectRoot, + names: projectNames, } = await determineProjectNameAndRootOptions(host, { name: options.name, projectType: 'application', directory: options.directory, - projectNameAndRootFormat: options.projectNameAndRootFormat, rootProject: options.rootProject, - callingGenerator, }); - options.rootProject = appProjectRoot === '.'; - options.projectNameAndRootFormat = projectNameAndRootFormat; + options.rootProject = projectRoot === '.'; + const fileName = + /* options.simpleName + ? projectNames.projectSimpleName + : */ projectNames.projectFileName; const nxJson = readNxJson(host); @@ -49,20 +53,18 @@ async function normalizeOptions( e2ePort = nxJson.targetDefaults?.[e2eWebServerTarget].options?.port; } - const e2eProjectName = options.rootProject ? 'e2e' : `${appProjectName}-e2e`; - const e2eProjectRoot = options.rootProject ? 'e2e' : `${appProjectRoot}-e2e`; + const e2eProjectName = options.rootProject ? 'e2e' : `${projectName}-e2e`; + const e2eProjectRoot = options.rootProject ? 'e2e' : `${projectRoot}-e2e`; const e2eWebServerAddress = `http://localhost:${e2ePort}`; const parsedTags = options.tags ? options.tags.split(',').map((s) => s.trim()) : []; - //const fileName = options.pascalCaseFiles ? 'App' : 'app'; - const fileName = 'App'; return { ...options, name: names(options.name).fileName, - projectName: appProjectName, - appProjectRoot, + projectName, + appProjectRoot: projectRoot, e2eProjectName, e2eProjectRoot, e2eWebServerAddress, @@ -78,7 +80,6 @@ export async function applicationGenerator( schema: Schema ): Promise { return await applicationGeneratorInternal(host, { - projectNameAndRootFormat: 'derived', ...schema, }); } diff --git a/packages/solid/src/generators/application/schema.d.ts b/packages/solid/src/generators/application/schema.d.ts index c8fa83bc..5b76b225 100644 --- a/packages/solid/src/generators/application/schema.d.ts +++ b/packages/solid/src/generators/application/schema.d.ts @@ -1,14 +1,12 @@ import { Linter } from '@nx/eslint'; -import { ProjectNameAndRootFormat } from '@nx/devkit/src/generators/project-name-and-root-utils'; export interface Schema { - name: string; + directory: string; + name?: string; tags?: string; linter: Linter; unitTestRunner: 'jest' | 'vitest' | 'none'; e2eTestRunner: 'cypress' | 'none'; - directory?: string; - projectNameAndRootFormat?: ProjectNameAndRootFormat; rootProject?: boolean; host?: string; port?: number; diff --git a/packages/solid/src/generators/application/schema.json b/packages/solid/src/generators/application/schema.json index cd451fae..fddd9891 100644 --- a/packages/solid/src/generators/application/schema.json +++ b/packages/solid/src/generators/application/schema.json @@ -4,14 +4,20 @@ "title": "", "type": "object", "properties": { - "name": { + "directory": { "type": "string", - "description": "", + "description": "A directory where the project is placed.", "$default": { "$source": "argv", "index": 0 }, - "x-prompt": "What name would you like to use?" + "x-prompt": "What directory would you like to use? (full path; e.g. apps/)", + "alias": "d" + }, + "name": { + "type": "string", + "description": "A name of the project.", + "alias": "n" }, "tags": { "type": "string", @@ -24,11 +30,6 @@ "enum": ["eslint"], "default": "eslint" }, - "projectNameAndRootFormat": { - "description": "Whether to generate the project name and root directory as provided (`as-provided`) or generate them composing their values and taking the configured layout into account (`derived`).", - "type": "string", - "enum": ["as-provided", "derived"] - }, "unitTestRunner": { "type": "string", "enum": ["vitest", "jest", "none"], @@ -41,11 +42,6 @@ "description": "Test runner to use for end to end (e2e) tests.", "default": "cypress" }, - "directory": { - "type": "string", - "description": "A directory where the lib is placed.", - "alias": "d" - }, "rootProject": { "description": "Create a application at the root of the workspace", "type": "boolean", @@ -58,5 +54,5 @@ "default": false } }, - "required": ["name"] + "required": ["directory"] } diff --git a/packages/solid/src/generators/component/component.spec.ts b/packages/solid/src/generators/component/component.spec.ts index 6f676390..9e837e1f 100644 --- a/packages/solid/src/generators/component/component.spec.ts +++ b/packages/solid/src/generators/component/component.spec.ts @@ -6,6 +6,8 @@ import { names, Tree } from '@nx/devkit'; describe('component schematic', () => { let tree: Tree; const projectName = uniq('testprojekt'); + const projectAppDirectory = `apps/${projectName}`; + const projectLibDirectory = `libs/${projectName}`; const componentName = uniq('test'); const options: SolidComponentSchema = { name: componentName, @@ -13,30 +15,28 @@ describe('component schematic', () => { unitTestRunner: 'jest', }; - beforeEach(async () => { - tree = await createTestProject(projectName); - }); - it('should run successfully', async () => { + tree = await createTestProject(projectAppDirectory); await expect(componentGenerator(tree, options)).resolves.not.toThrowError(); }); it('should add file', async () => { + tree = await createTestProject(projectAppDirectory); await componentGenerator(tree, options); const name = names(componentName); expect( tree.exists( - `apps/${projectName}/src/components/${name.fileName}/${name.className}.ts` + `${projectAppDirectory}/src/components/${name.fileName}/${name.className}.ts` ) ); }); it('should add file to barrel', async () => { - const tree = await createTestProject(projectName, 'library'); + tree = await createTestProject(projectLibDirectory, 'library'); await componentGenerator(tree, options); const name = names(componentName); - const indexFile = tree.read(`libs/${projectName}/src/index.ts`); + const indexFile = tree.read(`${projectLibDirectory}/src/index.ts`); expect(indexFile.toString('utf-8')).toMatch( `export { default as ${name.className} } from './components/${name.fileName}/${name.className}.ts';` ); diff --git a/packages/solid/src/generators/library/library.spec.ts b/packages/solid/src/generators/library/library.spec.ts index 38c23803..dd1c28c0 100644 --- a/packages/solid/src/generators/library/library.spec.ts +++ b/packages/solid/src/generators/library/library.spec.ts @@ -7,7 +7,7 @@ import { libraryGenerator } from './library'; describe('solid library schematic', () => { let tree: Tree; const options: SolidLibrarySchema = { - name: 'myLib', + directory: 'libs/my-lib', linter: Linter.EsLint, unitTestRunner: 'jest', e2eTestRunner: 'cypress', diff --git a/packages/solid/src/generators/library/library.ts b/packages/solid/src/generators/library/library.ts index 6c8d44db..c9888172 100644 --- a/packages/solid/src/generators/library/library.ts +++ b/packages/solid/src/generators/library/library.ts @@ -15,13 +15,17 @@ import { updateJestConfig } from './lib/update-jest-config'; import { createFiles } from './lib/create-project-files'; import { addVite } from './lib/add-vite'; import { addVitest } from './lib/add-vitest'; -import { determineProjectNameAndRootOptions } from '@nx/devkit/src/generators/project-name-and-root-utils'; +import { + determineProjectNameAndRootOptions, + ensureProjectName, +} from '@nx/devkit/src/generators/project-name-and-root-utils'; import { createOrEditViteConfig } from '@nx/vite'; async function normalizeOptions( host: Tree, options: SolidLibrarySchema ): Promise { + await ensureProjectName(host, options, 'library'); const { projectName, names: projectNames, @@ -32,16 +36,12 @@ async function normalizeOptions( projectType: 'library', directory: options.directory, importPath: options.importPath, - projectNameAndRootFormat: options.projectNameAndRootFormat, - callingGenerator: '@nxext/solid:library', + rootProject: false, }); - const name = names(options.name).fileName; - const projectDirectory = options.directory - ? `${names(options.directory).fileName}/${name}` - : name; const fileName = options.simpleName ? projectNames.projectSimpleName : projectNames.projectFileName; + const parsedTags = options.tags ? options.tags.split(',').map((s) => s.trim()) : []; @@ -53,7 +53,7 @@ async function normalizeOptions( projectRoot, parsedTags, fileName, - projectDirectory, + projectDirectory: projectRoot, importPath, }; } @@ -69,7 +69,6 @@ function updateLibPackageNpmScope(host: Tree, options: NormalizedSchema) { export async function libraryGenerator(host: Tree, schema: SolidLibrarySchema) { return await libraryGeneratorInternal(host, { - projectNameAndRootFormat: 'derived', ...schema, }); } diff --git a/packages/solid/src/generators/library/schema.d.ts b/packages/solid/src/generators/library/schema.d.ts index 631c0459..ffd2f023 100644 --- a/packages/solid/src/generators/library/schema.d.ts +++ b/packages/solid/src/generators/library/schema.d.ts @@ -1,15 +1,13 @@ import { Linter } from '@nx/eslint'; export interface SolidLibrarySchema { - name: string; + directory: string; + name?: string; tags?: string; - linter: Linter; unitTestRunner: 'vitest' | 'jest' | 'none'; e2eTestRunner: 'cypress' | 'none'; - projectNameAndRootFormat?: ProjectNameAndRootFormat; buildable?: boolean; - directory?: string; publishable?: boolean; importPath?: string; skipFormat: boolean; diff --git a/packages/solid/src/generators/library/schema.json b/packages/solid/src/generators/library/schema.json index 623db6fb..e9c21982 100644 --- a/packages/solid/src/generators/library/schema.json +++ b/packages/solid/src/generators/library/schema.json @@ -4,14 +4,20 @@ "title": "", "type": "object", "properties": { - "name": { + "directory": { "type": "string", - "description": "", + "description": "A directory where the project is placed.", "$default": { "$source": "argv", "index": 0 }, - "x-prompt": "What name would you like to use?" + "x-prompt": "What directory would you like to use? (full path; e.g. libs/)", + "alias": "d" + }, + "name": { + "type": "string", + "description": "A name of the project.", + "alias": "n" }, "tags": { "type": "string", @@ -36,11 +42,6 @@ "description": "Test runner to use for end to end (e2e) tests.", "default": "cypress" }, - "directory": { - "type": "string", - "description": "A directory where the lib is placed.", - "alias": "d" - }, "publishable": { "type": "boolean", "description": "Create a publishable library." @@ -65,5 +66,5 @@ "default": false } }, - "required": ["name"] + "required": ["directory"] } diff --git a/packages/solid/src/generators/utils/testing.ts b/packages/solid/src/generators/utils/testing.ts index a06088bf..b7d2f87c 100644 --- a/packages/solid/src/generators/utils/testing.ts +++ b/packages/solid/src/generators/utils/testing.ts @@ -5,7 +5,7 @@ import { Linter } from '@nx/eslint'; import { libraryGenerator } from '../library/library'; export async function createTestProject( - name: string, + directory: string, type: 'application' | 'library' = 'application', unitTestrunner: 'none' | 'jest' = 'none', e2eTestrunner: 'none' | 'cypress' = 'none' @@ -26,7 +26,7 @@ export async function createTestProject( if (type === 'application') { await applicationGenerator(tree, { - name: name, + directory, linter: Linter.EsLint, unitTestRunner: unitTestrunner, e2eTestRunner: e2eTestrunner, @@ -34,7 +34,7 @@ export async function createTestProject( } if (type === 'library') { await libraryGenerator(tree, { - name: name, + directory, linter: Linter.EsLint, unitTestRunner: unitTestrunner, e2eTestRunner: e2eTestrunner,