diff --git a/docs/generated/packages/detox/generators/init.json b/docs/generated/packages/detox/generators/init.json index c9ef2dcdd1..15159e77fb 100644 --- a/docs/generated/packages/detox/generators/init.json +++ b/docs/generated/packages/detox/generators/init.json @@ -12,6 +12,12 @@ "type": "boolean", "default": false, "x-priority": "internal" + }, + "skipPackageJson": { + "type": "boolean", + "default": false, + "description": "Do not add dependencies to `package.json`.", + "x-priority": "internal" } }, "required": [], diff --git a/docs/generated/packages/nest/generators/init.json b/docs/generated/packages/nest/generators/init.json index ab90718961..3940e91703 100644 --- a/docs/generated/packages/nest/generators/init.json +++ b/docs/generated/packages/nest/generators/init.json @@ -19,6 +19,12 @@ "description": "Skip formatting files.", "type": "boolean", "default": false + }, + "skipPackageJson": { + "description": "Do not add dependencies to `package.json`.", + "type": "boolean", + "default": false, + "x-priority": "internal" } }, "additionalProperties": false, diff --git a/docs/generated/packages/nest/generators/library.json b/docs/generated/packages/nest/generators/library.json index 522851a343..2fe5b804d4 100644 --- a/docs/generated/packages/nest/generators/library.json +++ b/docs/generated/packages/nest/generators/library.json @@ -122,6 +122,12 @@ "type": "boolean", "description": "Whether or not to configure the ESLint \"parserOptions.project\" option. We do not do this by default for lint performance reasons.", "default": false + }, + "skipPackageJson": { + "description": "Do not add dependencies to `package.json`.", + "type": "boolean", + "default": false, + "x-priority": "internal" } }, "additionalProperties": false, diff --git a/docs/generated/packages/next/generators/application.json b/docs/generated/packages/next/generators/application.json index 68c5481d6a..da58d77246 100644 --- a/docs/generated/packages/next/generators/application.json +++ b/docs/generated/packages/next/generators/application.json @@ -118,6 +118,12 @@ "description": "Use a custom Express server for the Next.js application.", "type": "boolean", "default": false + }, + "skipPackageJson": { + "type": "boolean", + "default": false, + "description": "Do not add dependencies to `package.json`.", + "x-priority": "internal" } }, "required": [], diff --git a/docs/generated/packages/next/generators/init.json b/docs/generated/packages/next/generators/init.json index 2e31c64868..2859ac27a4 100644 --- a/docs/generated/packages/next/generators/init.json +++ b/docs/generated/packages/next/generators/init.json @@ -30,6 +30,12 @@ "type": "boolean", "default": false, "description": "Use JavaScript instead of TypeScript" + }, + "skipPackageJson": { + "type": "boolean", + "default": false, + "description": "Do not add dependencies to `package.json`.", + "x-priority": "internal" } }, "required": [], diff --git a/docs/generated/packages/next/generators/library.json b/docs/generated/packages/next/generators/library.json index 0fed14885e..f06dff5a61 100644 --- a/docs/generated/packages/next/generators/library.json +++ b/docs/generated/packages/next/generators/library.json @@ -146,6 +146,12 @@ "type": "boolean", "default": true, "x-deprecated": "Nx only supports standaloneConfig" + }, + "skipPackageJson": { + "type": "boolean", + "default": false, + "description": "Do not add dependencies to `package.json`.", + "x-priority": "internal" } }, "required": ["name"], diff --git a/e2e/add-nx-to-monorepo/src/add-nx-to-monorepo.test.ts b/e2e/add-nx-to-monorepo/src/add-nx-to-monorepo.test.ts index a1d3b330d0..9037fffdcf 100644 --- a/e2e/add-nx-to-monorepo/src/add-nx-to-monorepo.test.ts +++ b/e2e/add-nx-to-monorepo/src/add-nx-to-monorepo.test.ts @@ -2,13 +2,11 @@ import { createNonNxProjectDirectory, runCLI, runCommand, - tmpProjPath, updateFile, getPackageManagerCommand, getSelectedPackageManager, getPublishedVersion, } from '@nrwl/e2e/utils'; -import { Workspaces } from 'nx/src/config/workspaces'; describe('add-nx-to-monorepo', () => { const pmc = getPackageManagerCommand({ diff --git a/e2e/workspace-create-npm/jest.config.ts b/e2e/workspace-create-npm/jest.config.ts new file mode 100644 index 0000000000..893e2c7c9f --- /dev/null +++ b/e2e/workspace-create-npm/jest.config.ts @@ -0,0 +1,11 @@ +/* eslint-disable */ +export default { + transform: { + '^.+\\.[tj]sx?$': 'ts-jest', + }, + moduleFileExtensions: ['ts', 'tsx', 'js', 'jsx', 'html'], + maxWorkers: 1, + globals: { 'ts-jest': { tsconfig: '/tsconfig.spec.json' } }, + displayName: 'e2e-workspace-create-npm', + preset: '../../jest.preset.js', +}; diff --git a/e2e/workspace-create-npm/project.json b/e2e/workspace-create-npm/project.json new file mode 100644 index 0000000000..0a105367b6 --- /dev/null +++ b/e2e/workspace-create-npm/project.json @@ -0,0 +1,11 @@ +{ + "name": "e2e-workspace-create-npm", + "$schema": "../../node_modules/nx/schemas/project-schema.json", + "sourceRoot": "e2e/workspace-create-npm", + "projectType": "application", + "targets": { + "e2e": {}, + "run-e2e-tests": {} + }, + "implicitDependencies": ["create-nx-workspace"] +} diff --git a/e2e/workspace-create/src/create-nx-workspace-npm.test.ts b/e2e/workspace-create-npm/src/create-nx-workspace-npm.test.ts similarity index 74% rename from e2e/workspace-create/src/create-nx-workspace-npm.test.ts rename to e2e/workspace-create-npm/src/create-nx-workspace-npm.test.ts index edcc5d4c42..a78a87b57a 100644 --- a/e2e/workspace-create/src/create-nx-workspace-npm.test.ts +++ b/e2e/workspace-create-npm/src/create-nx-workspace-npm.test.ts @@ -1,11 +1,14 @@ +import { forEach } from '@angular-devkit/schematics'; import { checkFilesExist, cleanupProject, packageInstall, readJson, + removeFile, runCLI, runCreateWorkspace, uniq, + updateJson, } from '@nrwl/e2e/utils'; describe('create-nx-workspace --preset=npm', () => { @@ -25,7 +28,9 @@ describe('create-nx-workspace --preset=npm', () => { const appName = uniq('my-app'); expect(() => { - runCLI(`generate @nrwl/angular:app ${appName} --no-interactive`); + runCLI( + `generate @nrwl/angular:app ${appName} --skipPackageJson --no-interactive` + ); }).not.toThrowError(); checkFilesExist('tsconfig.base.json'); }, 1_000_000); @@ -35,7 +40,9 @@ describe('create-nx-workspace --preset=npm', () => { const libName = uniq('lib'); expect(() => { - runCLI(`generate @nrwl/angular:lib ${libName} --no-interactive`); + runCLI( + `generate @nrwl/angular:lib ${libName} --skipPackageJson --no-interactive` + ); }).not.toThrowError(); checkFilesExist('tsconfig.base.json'); const tsconfig = readJson(`tsconfig.base.json`); @@ -50,7 +57,9 @@ describe('create-nx-workspace --preset=npm', () => { const libName = uniq('lib'); expect(() => - runCLI(`generate @nrwl/workspace:library ${libName} --no-interactive`) + runCLI( + `generate @nrwl/workspace:library ${libName} --skipPackageJson --no-interactive` + ) ).not.toThrowError(); checkFilesExist('tsconfig.base.json'); const tsconfig = readJson(`tsconfig.base.json`); @@ -65,7 +74,9 @@ describe('create-nx-workspace --preset=npm', () => { const libName = uniq('lib'); expect(() => - runCLI(`generate @nrwl/js:library ${libName} --no-interactive`) + runCLI( + `generate @nrwl/js:library ${libName} --skipPackageJson --no-interactive` + ) ).not.toThrowError(); checkFilesExist('tsconfig.base.json'); const tsconfig = readJson(`tsconfig.base.json`); @@ -80,7 +91,9 @@ describe('create-nx-workspace --preset=npm', () => { const appName = uniq('my-app'); expect(() => - runCLI(`generate @nrwl/web:app ${appName} --no-interactive`) + runCLI( + `generate @nrwl/web:app ${appName} --skipPackageJson --no-interactive` + ) ).not.toThrowError(); checkFilesExist('tsconfig.base.json'); }); @@ -91,7 +104,9 @@ describe('create-nx-workspace --preset=npm', () => { const appName = uniq('my-app'); expect(() => { - runCLI(`generate @nrwl/react:app ${appName} --no-interactive`); + runCLI( + `generate @nrwl/react:app ${appName} --skipPackageJson --no-interactive` + ); }).not.toThrowError(); checkFilesExist('tsconfig.base.json'); }); @@ -102,7 +117,9 @@ describe('create-nx-workspace --preset=npm', () => { const libName = uniq('lib'); expect(() => { - runCLI(`generate @nrwl/react:lib ${libName} --no-interactive`); + runCLI( + `generate @nrwl/react:lib ${libName} --skipPackageJson --no-interactive` + ); }).not.toThrowError(); checkFilesExist('tsconfig.base.json'); const tsconfig = readJson(`tsconfig.base.json`); @@ -117,7 +134,9 @@ describe('create-nx-workspace --preset=npm', () => { const appName = uniq('my-app'); expect(() => { - runCLI(`generate @nrwl/next:app ${appName} --no-interactive`); + runCLI( + `generate @nrwl/next:app ${appName} --skipPackageJson --no-interactive` + ); }).not.toThrowError(); checkFilesExist('tsconfig.base.json'); }); @@ -128,7 +147,9 @@ describe('create-nx-workspace --preset=npm', () => { const libName = uniq('lib'); expect(() => { - runCLI(`generate @nrwl/next:lib ${libName} --no-interactive`); + runCLI( + `generate @nrwl/next:lib ${libName} --skipPackageJson --no-interactive` + ); }).not.toThrowError(); checkFilesExist('tsconfig.base.json'); const tsconfig = readJson(`tsconfig.base.json`); @@ -143,7 +164,9 @@ describe('create-nx-workspace --preset=npm', () => { const appName = uniq('my-app'); expect(() => { - runCLI(`generate @nrwl/react-native:app ${appName} --no-interactive`); + runCLI( + `generate @nrwl/react-native:app ${appName} --install=false --skipPackageJson --no-interactive` + ); }).not.toThrowError(); checkFilesExist('tsconfig.base.json'); }); @@ -154,7 +177,9 @@ describe('create-nx-workspace --preset=npm', () => { const libName = uniq('lib'); expect(() => { - runCLI(`generate @nrwl/react-native:lib ${libName} --no-interactive`); + runCLI( + `generate @nrwl/react-native:lib ${libName} --skipPackageJson --no-interactive` + ); }).not.toThrowError(); checkFilesExist('tsconfig.base.json'); const tsconfig = readJson(`tsconfig.base.json`); @@ -169,7 +194,9 @@ describe('create-nx-workspace --preset=npm', () => { const appName = uniq('my-app'); expect(() => { - runCLI(`generate @nrwl/node:app ${appName} --no-interactive`); + runCLI( + `generate @nrwl/node:app ${appName} --skipPackageJson --no-interactive` + ); }).not.toThrowError(); checkFilesExist('tsconfig.base.json'); }); @@ -180,7 +207,9 @@ describe('create-nx-workspace --preset=npm', () => { const libName = uniq('lib'); expect(() => { - runCLI(`generate @nrwl/node:lib ${libName} --no-interactive`); + runCLI( + `generate @nrwl/node:lib ${libName} --skipPackageJson --no-interactive` + ); }).not.toThrowError(); checkFilesExist('tsconfig.base.json'); const tsconfig = readJson(`tsconfig.base.json`); @@ -195,7 +224,9 @@ describe('create-nx-workspace --preset=npm', () => { const appName = uniq('my-app'); expect(() => { - runCLI(`generate @nrwl/nest:app ${appName} --no-interactive`); + runCLI( + `generate @nrwl/nest:app ${appName} --skipPackageJson --no-interactive` + ); }).not.toThrowError(); checkFilesExist('tsconfig.base.json'); }); @@ -206,7 +237,9 @@ describe('create-nx-workspace --preset=npm', () => { const libName = uniq('lib'); expect(() => { - runCLI(`generate @nrwl/nest:lib ${libName} --no-interactive`); + runCLI( + `generate @nrwl/nest:lib ${libName} --skipPackageJson --no-interactive` + ); }).not.toThrowError(); checkFilesExist('tsconfig.base.json'); const tsconfig = readJson(`tsconfig.base.json`); @@ -221,7 +254,9 @@ describe('create-nx-workspace --preset=npm', () => { const appName = uniq('my-app'); expect(() => { - runCLI(`generate @nrwl/express:app ${appName} --no-interactive`); + runCLI( + `generate @nrwl/express:app ${appName} --skipPackageJson --no-interactive` + ); }).not.toThrowError(); checkFilesExist('tsconfig.base.json'); }); diff --git a/e2e/workspace-create-npm/tsconfig.json b/e2e/workspace-create-npm/tsconfig.json new file mode 100644 index 0000000000..6d5abf8483 --- /dev/null +++ b/e2e/workspace-create-npm/tsconfig.json @@ -0,0 +1,13 @@ +{ + "extends": "../../tsconfig.base.json", + "compilerOptions": { + "types": ["node", "jest"] + }, + "include": [], + "files": [], + "references": [ + { + "path": "./tsconfig.spec.json" + } + ] +} diff --git a/e2e/workspace-create-npm/tsconfig.spec.json b/e2e/workspace-create-npm/tsconfig.spec.json new file mode 100644 index 0000000000..1a24bfb0a1 --- /dev/null +++ b/e2e/workspace-create-npm/tsconfig.spec.json @@ -0,0 +1,20 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "outDir": "../../dist/out-tsc", + "module": "commonjs", + "types": ["jest", "node"] + }, + "include": [ + "**/*.test.ts", + "**/*.spec.ts", + "**/*.spec.tsx", + "**/*.test.tsx", + "**/*.spec.js", + "**/*.test.js", + "**/*.spec.jsx", + "**/*.test.jsx", + "**/*.d.ts", + "jest.config.ts" + ] +} diff --git a/packages/detox/src/generators/application/application.ts b/packages/detox/src/generators/application/application.ts index cc1c60a318..6be9bfeac1 100644 --- a/packages/detox/src/generators/application/application.ts +++ b/packages/detox/src/generators/application/application.ts @@ -13,6 +13,7 @@ export async function detoxApplicationGenerator(host: Tree, schema: Schema) { const options = normalizeOptions(host, schema); const initTask = await detoxInitGenerator(host, { + ...options, skipFormat: true, }); createFiles(host, options); diff --git a/packages/detox/src/generators/init/schema.json b/packages/detox/src/generators/init/schema.json index e4c7516e6d..5bc0ad9d29 100644 --- a/packages/detox/src/generators/init/schema.json +++ b/packages/detox/src/generators/init/schema.json @@ -9,6 +9,12 @@ "type": "boolean", "default": false, "x-priority": "internal" + }, + "skipPackageJson": { + "type": "boolean", + "default": false, + "description": "Do not add dependencies to `package.json`.", + "x-priority": "internal" } }, "required": [] diff --git a/packages/expo/src/generators/init/init.ts b/packages/expo/src/generators/init/init.ts index 3207c76ddf..8d24682796 100644 --- a/packages/expo/src/generators/init/init.ts +++ b/packages/expo/src/generators/init/init.ts @@ -59,12 +59,15 @@ export async function expoInitGenerator(host: Tree, schema: Schema) { } if (!schema.unitTestRunner || schema.unitTestRunner === 'jest') { - const jestTask = await jestInitGenerator(host, {}); + const jestTask = await jestInitGenerator(host, schema); tasks.push(jestTask); } if (!schema.e2eTestRunner || schema.e2eTestRunner === 'detox') { - const detoxTask = await detoxInitGenerator(host, { skipFormat: true }); + const detoxTask = await detoxInitGenerator(host, { + ...schema, + skipFormat: true, + }); tasks.push(detoxTask); } diff --git a/packages/nest/src/generators/application/application.ts b/packages/nest/src/generators/application/application.ts index 5daffb6559..2dcb2e3800 100644 --- a/packages/nest/src/generators/application/application.ts +++ b/packages/nest/src/generators/application/application.ts @@ -17,6 +17,7 @@ export async function applicationGenerator( ): Promise { const options = normalizeOptions(tree, rawOptions); const initTask = await initGenerator(tree, { + skipPackageJson: options.skipPackageJson, unitTestRunner: options.unitTestRunner, skipFormat: true, }); diff --git a/packages/nest/src/generators/init/init.ts b/packages/nest/src/generators/init/init.ts index b196db03a2..6008c31ade 100644 --- a/packages/nest/src/generators/init/init.ts +++ b/packages/nest/src/generators/init/init.ts @@ -10,14 +10,21 @@ export async function initGenerator( rawOptions: InitGeneratorOptions ): Promise { const options = normalizeOptions(rawOptions); + const tasks: GeneratorCallback[] = []; + const nodeInitTask = await nodeInitGenerator(tree, options); - const installPackagesTask = addDependencies(tree); + tasks.push(nodeInitTask); + + if (!options.skipPackageJson) { + const installPackagesTask = addDependencies(tree); + tasks.push(installPackagesTask); + } if (!options.skipFormat) { await formatFiles(tree); } - return runTasksInSerial(nodeInitTask, installPackagesTask); + return runTasksInSerial(...tasks); } export default initGenerator; diff --git a/packages/nest/src/generators/init/schema.d.ts b/packages/nest/src/generators/init/schema.d.ts index 2967c2b490..4830cf67c5 100644 --- a/packages/nest/src/generators/init/schema.d.ts +++ b/packages/nest/src/generators/init/schema.d.ts @@ -3,4 +3,5 @@ import { UnitTestRunner } from '../utils'; export interface InitGeneratorOptions { skipFormat?: boolean; unitTestRunner?: UnitTestRunner; + skipPackageJson?: boolean; } diff --git a/packages/nest/src/generators/init/schema.json b/packages/nest/src/generators/init/schema.json index b6012046d2..af3ed5fcb3 100644 --- a/packages/nest/src/generators/init/schema.json +++ b/packages/nest/src/generators/init/schema.json @@ -16,6 +16,12 @@ "description": "Skip formatting files.", "type": "boolean", "default": false + }, + "skipPackageJson": { + "description": "Do not add dependencies to `package.json`.", + "type": "boolean", + "default": false, + "x-priority": "internal" } }, "additionalProperties": false, diff --git a/packages/nest/src/generators/library/schema.d.ts b/packages/nest/src/generators/library/schema.d.ts index 926181de13..2e80e65030 100644 --- a/packages/nest/src/generators/library/schema.d.ts +++ b/packages/nest/src/generators/library/schema.d.ts @@ -29,6 +29,7 @@ export interface LibraryGeneratorOptions { unitTestRunner?: UnitTestRunner; standaloneConfig?: boolean; setParserOptionsProject?: boolean; + skipPackageJson?: boolean; } export interface NormalizedOptions extends LibraryGeneratorOptions { diff --git a/packages/nest/src/generators/library/schema.json b/packages/nest/src/generators/library/schema.json index 1f89ec8e63..df3e8967e2 100644 --- a/packages/nest/src/generators/library/schema.json +++ b/packages/nest/src/generators/library/schema.json @@ -122,6 +122,12 @@ "type": "boolean", "description": "Whether or not to configure the ESLint \"parserOptions.project\" option. We do not do this by default for lint performance reasons.", "default": false + }, + "skipPackageJson": { + "description": "Do not add dependencies to `package.json`.", + "type": "boolean", + "default": false, + "x-priority": "internal" } }, "additionalProperties": false, diff --git a/packages/next/src/generators/application/schema.d.ts b/packages/next/src/generators/application/schema.d.ts index 9af6170384..dc6de0d244 100644 --- a/packages/next/src/generators/application/schema.d.ts +++ b/packages/next/src/generators/application/schema.d.ts @@ -16,4 +16,5 @@ export interface Schema { standaloneConfig?: boolean; swc?: boolean; customServer?: boolean; + skipPackageJson?: boolean; } diff --git a/packages/next/src/generators/application/schema.json b/packages/next/src/generators/application/schema.json index 343453186b..79db0c6d1b 100644 --- a/packages/next/src/generators/application/schema.json +++ b/packages/next/src/generators/application/schema.json @@ -118,6 +118,12 @@ "description": "Use a custom Express server for the Next.js application.", "type": "boolean", "default": false + }, + "skipPackageJson": { + "type": "boolean", + "default": false, + "description": "Do not add dependencies to `package.json`.", + "x-priority": "internal" } }, "required": [], diff --git a/packages/next/src/generators/init/init.ts b/packages/next/src/generators/init/init.ts index 62792f9ef7..26ea4198a4 100644 --- a/packages/next/src/generators/init/init.ts +++ b/packages/next/src/generators/init/init.ts @@ -58,8 +58,10 @@ export async function nextInitGenerator(host: Tree, schema: InitSchema) { const reactTask = await reactInitGenerator(host, schema); tasks.push(reactTask); - const installTask = updateDependencies(host); - tasks.push(installTask); + if (!schema.skipPackageJson) { + const installTask = updateDependencies(host); + tasks.push(installTask); + } addGitIgnoreEntry(host); diff --git a/packages/next/src/generators/init/schema.d.ts b/packages/next/src/generators/init/schema.d.ts index a0157cab6e..0ef1c5ded9 100644 --- a/packages/next/src/generators/init/schema.d.ts +++ b/packages/next/src/generators/init/schema.d.ts @@ -3,4 +3,5 @@ export interface InitSchema { e2eTestRunner?: 'cypress' | 'none'; skipFormat?: boolean; js?: boolean; + skipPackageJson?: boolean; } diff --git a/packages/next/src/generators/init/schema.json b/packages/next/src/generators/init/schema.json index 13370bb45a..9fa41c1956 100644 --- a/packages/next/src/generators/init/schema.json +++ b/packages/next/src/generators/init/schema.json @@ -27,6 +27,12 @@ "type": "boolean", "default": false, "description": "Use JavaScript instead of TypeScript" + }, + "skipPackageJson": { + "type": "boolean", + "default": false, + "description": "Do not add dependencies to `package.json`.", + "x-priority": "internal" } }, "required": [] diff --git a/packages/next/src/generators/library/schema.d.ts b/packages/next/src/generators/library/schema.d.ts index d3da5279f0..82862f1591 100644 --- a/packages/next/src/generators/library/schema.d.ts +++ b/packages/next/src/generators/library/schema.d.ts @@ -22,4 +22,5 @@ export interface Schema { strict?: boolean; setParserOptionsProject?: boolean; standaloneConfig?: boolean; + skipPackageJson?: boolean; } diff --git a/packages/next/src/generators/library/schema.json b/packages/next/src/generators/library/schema.json index ca79a9d00b..f5b1c95c6c 100644 --- a/packages/next/src/generators/library/schema.json +++ b/packages/next/src/generators/library/schema.json @@ -149,6 +149,12 @@ "type": "boolean", "default": true, "x-deprecated": "Nx only supports standaloneConfig" + }, + "skipPackageJson": { + "type": "boolean", + "default": false, + "description": "Do not add dependencies to `package.json`.", + "x-priority": "internal" } }, "required": ["name"], diff --git a/packages/react-native/src/generators/init/init.ts b/packages/react-native/src/generators/init/init.ts index fe6e9a4e9a..12cde68ee5 100644 --- a/packages/react-native/src/generators/init/init.ts +++ b/packages/react-native/src/generators/init/init.ts @@ -65,7 +65,10 @@ export async function reactNativeInitGenerator(host: Tree, schema: Schema) { } if (!schema.e2eTestRunner || schema.e2eTestRunner === 'detox') { - const detoxTask = await detoxInitGenerator(host, {}); + const detoxTask = await detoxInitGenerator(host, { + ...schema, + skipFormat: true, + }); tasks.push(detoxTask); }