diff --git a/docs/generated/manifests/packages.json b/docs/generated/manifests/packages.json index 81197f0a0895da..f69614a7ec9746 100644 --- a/docs/generated/manifests/packages.json +++ b/docs/generated/manifests/packages.json @@ -1088,7 +1088,7 @@ "type": "generator" }, "/packages/js/generators/init": { - "description": "Init placeholder.", + "description": "Initial a TS/JS workspace.", "file": "generated/packages/js/generators/init.json", "hidden": true, "name": "init", diff --git a/docs/generated/packages-metadata.json b/docs/generated/packages-metadata.json index 1f1d3bce6ab452..5f691f8cec1620 100644 --- a/docs/generated/packages-metadata.json +++ b/docs/generated/packages-metadata.json @@ -1070,7 +1070,7 @@ "type": "generator" }, { - "description": "Init placeholder.", + "description": "Initial a TS/JS workspace.", "file": "generated/packages/js/generators/init.json", "hidden": true, "name": "init", diff --git a/docs/generated/packages/angular/generators/application.json b/docs/generated/packages/angular/generators/application.json index 1cd3b835217d45..cc7fc0e1544efe 100644 --- a/docs/generated/packages/angular/generators/application.json +++ b/docs/generated/packages/angular/generators/application.json @@ -155,6 +155,12 @@ "default": false, "hidden": true, "x-priority": "internal" + }, + "skipTsConfig": { + "type": "boolean", + "default": false, + "description": "Do not update `tsconfig.json` for development experience.", + "x-priority": "internal" } }, "additionalProperties": false, diff --git a/docs/generated/packages/angular/generators/init.json b/docs/generated/packages/angular/generators/init.json index 8a5cf7cecc7a5d..e319111a8b30e7 100644 --- a/docs/generated/packages/angular/generators/init.json +++ b/docs/generated/packages/angular/generators/init.json @@ -78,6 +78,12 @@ "default": false, "description": "Do not add dependencies to `package.json`.", "x-priority": "internal" + }, + "skipTsConfig": { + "type": "boolean", + "default": false, + "description": "Do not update `tsconfig.json` for development experience.", + "x-priority": "internal" } }, "additionalProperties": false, diff --git a/docs/generated/packages/expo/generators/application.json b/docs/generated/packages/expo/generators/application.json index e2536bfa724a9d..94e6fd61f49b61 100644 --- a/docs/generated/packages/expo/generators/application.json +++ b/docs/generated/packages/expo/generators/application.json @@ -75,6 +75,11 @@ "standaloneConfig": { "description": "Split the project configuration into `/project.json` rather than including it inside `workspace.json`.", "type": "boolean" + }, + "skipPackageJson": { + "type": "boolean", + "default": false, + "description": "Do not add dependencies to `package.json`." } }, "required": ["name"], diff --git a/docs/generated/packages/expo/generators/init.json b/docs/generated/packages/expo/generators/init.json index 9c81f1a1518624..a08b56bdd65706 100644 --- a/docs/generated/packages/expo/generators/init.json +++ b/docs/generated/packages/expo/generators/init.json @@ -25,6 +25,18 @@ "type": "string", "enum": ["detox", "none"], "default": "detox" + }, + "skipPackageJson": { + "type": "boolean", + "default": false, + "description": "Do not add dependencies to `package.json`.", + "x-priority": "internal" + }, + "skipTsConfig": { + "type": "boolean", + "default": false, + "description": "Do not update `tsconfig.json` for development experience.", + "x-priority": "internal" } }, "required": [], diff --git a/docs/generated/packages/js/generators/init.json b/docs/generated/packages/js/generators/init.json index 914e2da79d7397..3f6f58f74ca1f6 100644 --- a/docs/generated/packages/js/generators/init.json +++ b/docs/generated/packages/js/generators/init.json @@ -1,19 +1,33 @@ { "name": "init", - "factory": "./src/generators/init/init#initGenerator", + "factory": "./src/generators/init/init#jsInitGenerator", "schema": { "$schema": "http://json-schema.org/schema", "$id": "NxTypescriptInit", "cli": "nx", "title": "Init nrwl/js", "description": "Init generator placeholder for nrwl/js.", + "properties": { + "skipPackageJson": { + "type": "boolean", + "default": false, + "description": "Do not add dependencies to `package.json`.", + "x-priority": "internal" + }, + "skipTsConfig": { + "type": "boolean", + "default": false, + "description": "Do not update `tsconfig.json` for development experience.", + "x-priority": "internal" + } + }, "presets": [] }, "aliases": ["lib"], "x-type": "init", - "description": "Init placeholder.", + "description": "Initial a TS/JS workspace.", "hidden": true, - "implementation": "/packages/js/src/generators/init/init#initGenerator.ts", + "implementation": "/packages/js/src/generators/init/init#jsInitGenerator.ts", "path": "/packages/js/src/generators/init/schema.json", "type": "generator" } diff --git a/docs/generated/packages/js/generators/library.json b/docs/generated/packages/js/generators/library.json index 453501f12c708d..59bdbb84fd5182 100644 --- a/docs/generated/packages/js/generators/library.json +++ b/docs/generated/packages/js/generators/library.json @@ -113,6 +113,12 @@ "type": "boolean", "description": "Whether to skip TypeScript type checking for SWC compiler.", "default": false + }, + "skipPackageJson": { + "type": "boolean", + "default": false, + "description": "Do not add dependencies to `package.json`.", + "x-priority": "internal" } }, "required": ["name"], diff --git a/docs/generated/packages/next/generators/application.json b/docs/generated/packages/next/generators/application.json index 4e67cac6a43308..9ad1fcc6d467e4 100644 --- a/docs/generated/packages/next/generators/application.json +++ b/docs/generated/packages/next/generators/application.json @@ -76,12 +76,6 @@ "default": false, "x-priority": "internal" }, - "skipWorkspaceJson": { - "description": "Skip updating `workspace.json` with default options based on values provided to this app (e.g. `babel`, `style`).", - "type": "boolean", - "default": false, - "x-priority": "internal" - }, "unitTestRunner": { "type": "string", "enum": ["jest", "none"], @@ -122,6 +116,18 @@ "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" + }, + "skipTsConfig": { + "type": "boolean", + "default": false, + "description": "Do not update `tsconfig.json` for development experience.", + "x-priority": "internal" } }, "required": [], diff --git a/docs/generated/packages/next/generators/init.json b/docs/generated/packages/next/generators/init.json index 2e31c64868b31d..55b0161d23be21 100644 --- a/docs/generated/packages/next/generators/init.json +++ b/docs/generated/packages/next/generators/init.json @@ -30,6 +30,18 @@ "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" + }, + "skipTsConfig": { + "type": "boolean", + "default": false, + "description": "Do not update `tsconfig.json` for development experience.", + "x-priority": "internal" } }, "required": [], diff --git a/docs/generated/packages/node/generators/application.json b/docs/generated/packages/node/generators/application.json index 1384e97cdf1b76..170e14946b5769 100644 --- a/docs/generated/packages/node/generators/application.json +++ b/docs/generated/packages/node/generators/application.json @@ -110,6 +110,12 @@ "enum": ["jest", "none"], "description": "Test runner to use for end to end (e2e) tests", "default": "jest" + }, + "skipTsConfig": { + "type": "boolean", + "default": false, + "description": "Do not update `tsconfig.json` for development experience.", + "x-priority": "internal" } }, "required": [], diff --git a/docs/generated/packages/node/generators/init.json b/docs/generated/packages/node/generators/init.json index f135c0177c2403..471e9c7c1b65cd 100644 --- a/docs/generated/packages/node/generators/init.json +++ b/docs/generated/packages/node/generators/init.json @@ -24,6 +24,18 @@ "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" + }, + "skipTsConfig": { + "type": "boolean", + "default": false, + "description": "Do not update `tsconfig.json` for development experience.", + "x-priority": "internal" } }, "required": [], diff --git a/docs/generated/packages/react-native/generators/application.json b/docs/generated/packages/react-native/generators/application.json index 318198dc3ca72b..73769cb07a1919 100644 --- a/docs/generated/packages/react-native/generators/application.json +++ b/docs/generated/packages/react-native/generators/application.json @@ -83,6 +83,12 @@ "type": "boolean", "default": false, "x-priority": "internal" + }, + "skipTsConfig": { + "type": "boolean", + "default": false, + "description": "Do not update `tsconfig.json` for development experience.", + "x-priority": "internal" } }, "required": [], diff --git a/docs/generated/packages/react-native/generators/init.json b/docs/generated/packages/react-native/generators/init.json index 38e06f61c8e6c0..748795d3e389bc 100644 --- a/docs/generated/packages/react-native/generators/init.json +++ b/docs/generated/packages/react-native/generators/init.json @@ -37,6 +37,12 @@ "type": "boolean", "default": false, "x-priority": "internal" + }, + "skipTsConfig": { + "type": "boolean", + "default": false, + "description": "Do not update `tsconfig.json` for development experience.", + "x-priority": "internal" } }, "required": [], diff --git a/docs/generated/packages/react/generators/init.json b/docs/generated/packages/react/generators/init.json index 5122a0829ac2be..6785e5e2e1349a 100644 --- a/docs/generated/packages/react/generators/init.json +++ b/docs/generated/packages/react/generators/init.json @@ -29,7 +29,14 @@ "skipPackageJson": { "description": "Do not add dependencies to `package.json`.", "type": "boolean", - "default": false + "default": false, + "x-priority": "internal" + }, + "skipTsConfig": { + "type": "boolean", + "default": false, + "description": "Do not update `tsconfig.json` for development experience.", + "x-priority": "internal" }, "skipBabelConfig": { "description": "Do not generate a root babel.config.json (if babel is not needed).", diff --git a/docs/generated/packages/web/generators/application.json b/docs/generated/packages/web/generators/application.json index d90881d3cc7250..f6e4098e6b5d23 100644 --- a/docs/generated/packages/web/generators/application.json +++ b/docs/generated/packages/web/generators/application.json @@ -96,6 +96,12 @@ "standaloneConfig": { "description": "Split the project configuration into `/project.json` rather than including it inside workspace.json", "type": "boolean" + }, + "skipTsConfig": { + "type": "boolean", + "default": false, + "description": "Do not update `tsconfig.json` for development experience.", + "x-priority": "internal" } }, "required": [], diff --git a/docs/generated/packages/web/generators/init.json b/docs/generated/packages/web/generators/init.json index 49f1ae99026f36..76f31dc91b4d08 100644 --- a/docs/generated/packages/web/generators/init.json +++ b/docs/generated/packages/web/generators/init.json @@ -35,12 +35,19 @@ "skipPackageJson": { "description": "Do not add dependencies to `package.json`.", "type": "boolean", - "default": false + "default": false, + "x-priority": "internal" }, "skipBabelConfig": { "description": "Do not generate a root babel.config.json (if babel is not needed).", "type": "boolean", "default": false + }, + "skipTsConfig": { + "type": "boolean", + "default": false, + "description": "Do not update `tsconfig.json` for development experience.", + "x-priority": "internal" } }, "required": [], diff --git a/docs/shared/mental-model/large-tasks.json b/docs/shared/mental-model/large-tasks.json index bcc560ad68a371..c4ec899033a60f 100644 --- a/docs/shared/mental-model/large-tasks.json +++ b/docs/shared/mental-model/large-tasks.json @@ -5689,22 +5689,6 @@ "file": "packages/workspace/src/generators/new/files-readme/README.md.template", "hash": "2a6b2eb20fe9cd8dbc25a9b6ab029193feab7ca2" }, - { - "file": "packages/workspace/src/generators/new/files-root-app/__dot__gitignore", - "hash": "51b9af5269c1df38f3252250d5b46665822374cc" - }, - { - "file": "packages/workspace/src/generators/new/files-root-app/__dot__prettierignore", - "hash": "d0b804da2a462044bb1c63364440b2c2164e86ad" - }, - { - "file": "packages/workspace/src/generators/new/files-root-app/__dot__vscode/extensions.json__tmpl__", - "hash": "aaf47be3eb9d9766b877ee73730fd5073a263321" - }, - { - "file": "packages/workspace/src/generators/new/files-root-app/package.json__tmpl__", - "hash": "8a64a50fdfe1ab69c4e61b921c011b3a0832e99d" - }, { "file": "packages/workspace/src/generators/new/generate-preset.ts", "hash": "b3e6e05a152b87ed121f289aa5ab9ec768612c35", @@ -6543,11 +6527,6 @@ "input": "packages/workspace", "output": "/" }, - { - "input": "packages/workspace", - "glob": "**/files-root-app/**", - "output": "/" - }, { "input": "packages/workspace", "glob": "**/*.json", diff --git a/e2e/workspace-create/src/create-nx-workspace.test.ts b/e2e/workspace-create/src/create-nx-workspace.test.ts index 663a68641d7a26..0b1868f24f0739 100644 --- a/e2e/workspace-create/src/create-nx-workspace.test.ts +++ b/e2e/workspace-create/src/create-nx-workspace.test.ts @@ -6,7 +6,9 @@ import { expectNoAngularDevkit, expectNoTsJestInJestConfig, getSelectedPackageManager, + packageInstall, packageManagerLockFile, + runCLI, runCreateWorkspace, uniq, } from '@nrwl/e2e/utils'; @@ -77,16 +79,6 @@ describe('create-nx-workspace', () => { expectNoAngularDevkit(); }); - it('should be able to create an empty workspace with ts/js capabilities', () => { - const wsName = uniq('ts'); - runCreateWorkspace(wsName, { - preset: 'npm', - packageManager, - }); - - expectNoAngularDevkit(); - }); - it('should be able to create an angular workspace', () => { const wsName = uniq('angular'); const appName = uniq('app'); @@ -273,6 +265,109 @@ describe('create-nx-workspace', () => { checkFilesDoNotExist('.circleci/config.yml'); }); + describe('Start with package-based repo', () => { + const wsName = uniq('npm'); + + beforeEach(() => { + runCreateWorkspace(wsName, { + preset: 'npm', + packageManager, + }); + }); + + it('should add workspace library', () => { + checkFilesDoNotExist('tsconfig.base.json'); + + const libName = uniq('lib'); + packageInstall('@nrwl/workspace', wsName); + + expect(() => + runCLI(`generate @nrwl/workspace:library ${libName} --no-interactive`) + ).not.toThrowError(); + checkFilesExist('tsconfig.base.json'); + }); + + it('should add js library', () => { + const libName = uniq('lib'); + packageInstall('@nrwl/js', wsName); + + expect(() => + runCLI(`generate @nrwl/js:library ${libName} --no-interactive`) + ).not.toThrowError(); + checkFilesExist('tsconfig.base.json'); + }); + + it('should add web library', () => { + const libName = uniq('lib'); + packageInstall('@nrwl/web', wsName); + + expect(() => + runCLI(`generate @nrwl/web:library ${libName} --no-interactive`) + ).not.toThrowError(); + checkFilesExist('tsconfig.base.json'); + }); + + it('should add angular application and library', () => { + const appName = uniq('my-app'); + const libName = uniq('lib'); + packageInstall('@nrwl/angular', wsName); + + expect(() => { + runCLI(`generate @nrwl/angular:app ${appName} --no-interactive`); + runCLI(`generate @nrwl/angular:lib ${libName} --no-interactive`); + }).not.toThrowError(); + checkFilesExist('tsconfig.base.json'); + }); + + it('should add react application and library', () => { + const appName = uniq('my-app'); + const libName = uniq('lib'); + packageInstall('@nrwl/react', wsName); + + expect(() => { + runCLI(`generate @nrwl/react:app ${appName} --no-interactive`); + runCLI(`generate @nrwl/react:lib ${libName} --no-interactive`); + }).not.toThrowError(); + checkFilesExist('tsconfig.base.json'); + }); + + it('should add react-native application and library', () => { + const appName = uniq('my-app'); + const libName = uniq('lib'); + packageInstall('@nrwl/react-native', wsName); + + expect(() => { + runCLI(`generate @nrwl/react-native:app ${appName} --no-interactive`); + runCLI(`generate @nrwl/react-native:lib ${libName} --no-interactive`); + }).not.toThrowError(); + checkFilesExist('tsconfig.base.json'); + }); + + it('should add expo application and library', () => { + const appName = uniq('my-app'); + const libName = uniq('lib'); + packageInstall('@nrwl/expo', wsName); + + expect(() => { + runCLI(`generate @nrwl/expo:app ${appName} --no-interactive`); + runCLI(`generate @nrwl/expo:lib ${libName} --no-interactive`); + }).not.toThrowError(); + checkFilesExist('tsconfig.base.json'); + }); + + it('should add node application and library', () => { + const appName = uniq('my-app'); + const libName = uniq('lib'); + packageInstall('@nrwl/node', wsName); + + expect(() => { + runCLI(`generate @nrwl/node:app ${appName} --no-interactive`); + runCLI(`generate @nrwl/node:lib ${libName} --no-interactive`); + }).not.toThrowError(); + checkFilesExist('tsconfig.base.json'); + }); + }); + describe('Use detected package manager', () => { function setupProject(envPm: 'npm' | 'yarn' | 'pnpm') { process.env.SELECTED_PM = envPm; diff --git a/packages/angular/package.json b/packages/angular/package.json index dd6504a0410fda..5b9766a91c8739 100644 --- a/packages/angular/package.json +++ b/packages/angular/package.json @@ -43,6 +43,7 @@ "@nrwl/cypress": "file:../cypress", "@nrwl/devkit": "file:../devkit", "@nrwl/jest": "file:../jest", + "@nrwl/js": "file:../js", "@nrwl/linter": "file:../linter", "@nrwl/webpack": "file:../webpack", "@nrwl/workspace": "file:../workspace", diff --git a/packages/angular/src/generators/application/schema.d.ts b/packages/angular/src/generators/application/schema.d.ts index 80178effbc0e86..bd3173e0a3573d 100644 --- a/packages/angular/src/generators/application/schema.d.ts +++ b/packages/angular/src/generators/application/schema.d.ts @@ -26,4 +26,5 @@ export interface Schema { skipPackageJson?: boolean; standalone?: boolean; rootProject?: boolean; + skipTsConfig?: boolean; } diff --git a/packages/angular/src/generators/application/schema.json b/packages/angular/src/generators/application/schema.json index 7bc020b154174f..99614189a9779a 100644 --- a/packages/angular/src/generators/application/schema.json +++ b/packages/angular/src/generators/application/schema.json @@ -158,6 +158,12 @@ "default": false, "hidden": true, "x-priority": "internal" + }, + "skipTsConfig": { + "type": "boolean", + "default": false, + "description": "Do not update `tsconfig.json` for development experience.", + "x-priority": "internal" } }, "additionalProperties": false, diff --git a/packages/angular/src/generators/init/init.ts b/packages/angular/src/generators/init/init.ts index 929a7f326d9002..e69e8967c3845b 100755 --- a/packages/angular/src/generators/init/init.ts +++ b/packages/angular/src/generators/init/init.ts @@ -10,6 +10,7 @@ import { } from '@nrwl/devkit'; import { jestInitGenerator } from '@nrwl/jest'; import { Linter } from '@nrwl/linter'; +import { jsInitGenerator } from '@nrwl/js'; import { runTasksInSerial } from '@nrwl/workspace/src/utilities/run-tasks-in-serial'; import { join } from 'path'; import { E2eTestRunner, UnitTestRunner } from '../../utils/test-runners'; @@ -53,13 +54,17 @@ export async function angularInitGenerator( : () => {}; const unitTestTask = await addUnitTestRunner(tree, options); const e2eTask = addE2ETestRunner(tree, options); + const jsInitTask = jsInitGenerator(tree, { + skipPackageJson: options.skipPackageJson, + skipTsConfig: options.skipTsConfig, + }); addGitIgnoreEntry(tree, '.angular'); if (!options.skipFormat) { await formatFiles(tree); } - return runTasksInSerial(depsTask, unitTestTask, e2eTask); + return runTasksInSerial(depsTask, unitTestTask, e2eTask, jsInitTask); } function normalizeOptions(options: Schema): Required { @@ -71,6 +76,7 @@ function normalizeOptions(options: Schema): Required { skipPackageJson: options.skipPackageJson ?? false, style: options.style ?? 'css', unitTestRunner: options.unitTestRunner ?? UnitTestRunner.Jest, + skipTsConfig: options.skipTsConfig, }; } diff --git a/packages/angular/src/generators/init/schema.d.ts b/packages/angular/src/generators/init/schema.d.ts index 8e50f0aa89a895..4bf799ddc0188d 100644 --- a/packages/angular/src/generators/init/schema.d.ts +++ b/packages/angular/src/generators/init/schema.d.ts @@ -10,4 +10,5 @@ export interface Schema { style?: Styles; linter?: Linter; skipPackageJson?: boolean; + skipTsConfig?: boolean; } diff --git a/packages/angular/src/generators/init/schema.json b/packages/angular/src/generators/init/schema.json index 38a1c8856d2b04..68a32a247e885e 100644 --- a/packages/angular/src/generators/init/schema.json +++ b/packages/angular/src/generators/init/schema.json @@ -78,6 +78,12 @@ "default": false, "description": "Do not add dependencies to `package.json`.", "x-priority": "internal" + }, + "skipTsConfig": { + "type": "boolean", + "default": false, + "description": "Do not update `tsconfig.json` for development experience.", + "x-priority": "internal" } }, "additionalProperties": false diff --git a/packages/expo/package.json b/packages/expo/package.json index f67b25d0e83159..ec5c2d2145670f 100644 --- a/packages/expo/package.json +++ b/packages/expo/package.json @@ -29,6 +29,7 @@ "@nrwl/detox": "file:../detox", "@nrwl/devkit": "file:../devkit", "@nrwl/jest": "file:../jest", + "@nrwl/js": "file:../js", "@nrwl/linter": "file:../linter", "@nrwl/react": "file:../react", "@nrwl/webpack": "file:../webpack", diff --git a/packages/expo/src/generators/application/schema.d.ts b/packages/expo/src/generators/application/schema.d.ts index ece0671bfc6aa6..378a0a4c06fefe 100644 --- a/packages/expo/src/generators/application/schema.d.ts +++ b/packages/expo/src/generators/application/schema.d.ts @@ -15,4 +15,5 @@ export interface Schema { setParserOptionsProject?: boolean; // default is false e2eTestRunner: 'detox' | 'none'; // default is detox standaloneConfig?: boolean; + skipPackageJson?: boolean; } diff --git a/packages/expo/src/generators/application/schema.json b/packages/expo/src/generators/application/schema.json index 9395859c2f165b..5a3c04575ccc41 100644 --- a/packages/expo/src/generators/application/schema.json +++ b/packages/expo/src/generators/application/schema.json @@ -75,6 +75,11 @@ "standaloneConfig": { "description": "Split the project configuration into `/project.json` rather than including it inside `workspace.json`.", "type": "boolean" + }, + "skipPackageJson": { + "type": "boolean", + "default": false, + "description": "Do not add dependencies to `package.json`." } }, "required": ["name"] diff --git a/packages/expo/src/generators/init/init.ts b/packages/expo/src/generators/init/init.ts index 7499540472d733..b70cdfb25e1436 100644 --- a/packages/expo/src/generators/init/init.ts +++ b/packages/expo/src/generators/init/init.ts @@ -34,6 +34,7 @@ import { import { runTasksInSerial } from '@nrwl/workspace/src/utilities/run-tasks-in-serial'; import { jestInitGenerator } from '@nrwl/jest'; import { detoxInitGenerator } from '@nrwl/detox'; +import { jsInitGenerator } from '@nrwl/js'; import { addGitIgnoreEntry } from './lib/add-git-ignore-entry'; import { initRootBabelConfig } from './lib/init-root-babel-config'; @@ -42,7 +43,17 @@ export async function expoInitGenerator(host: Tree, schema: Schema) { addGitIgnoreEntry(host); initRootBabelConfig(host); - const tasks = [moveDependency(host), updateDependencies(host)]; + const tasks = [ + moveDependency(host), + jsInitGenerator(host, { + skipPackageJson: schema.skipPackageJson, + skipTsConfig: schema.skipTsConfig, + }), + ]; + + if (!schema.skipPackageJson) { + tasks.push(updateDependencies(host)); + } if (!schema.unitTestRunner || schema.unitTestRunner === 'jest') { const jestTask = jestInitGenerator(host, {}); diff --git a/packages/expo/src/generators/init/schema.d.ts b/packages/expo/src/generators/init/schema.d.ts index 11ea540ee87782..77845e5c4a34e4 100644 --- a/packages/expo/src/generators/init/schema.d.ts +++ b/packages/expo/src/generators/init/schema.d.ts @@ -2,4 +2,6 @@ export interface Schema { unitTestRunner?: 'jest' | 'none'; skipFormat?: boolean; e2eTestRunner?: 'detox' | 'none'; + skipPackageJson?: boolean; + skipTsConfig?: boolean; } diff --git a/packages/expo/src/generators/init/schema.json b/packages/expo/src/generators/init/schema.json index 9ed34d77031263..a6e8cb40b2ce5e 100644 --- a/packages/expo/src/generators/init/schema.json +++ b/packages/expo/src/generators/init/schema.json @@ -22,6 +22,18 @@ "type": "string", "enum": ["detox", "none"], "default": "detox" + }, + "skipPackageJson": { + "type": "boolean", + "default": false, + "description": "Do not add dependencies to `package.json`.", + "x-priority": "internal" + }, + "skipTsConfig": { + "type": "boolean", + "default": false, + "description": "Do not update `tsconfig.json` for development experience.", + "x-priority": "internal" } }, "required": [] diff --git a/packages/js/generators.json b/packages/js/generators.json index 46e4249744b891..db9dc6a7739a60 100644 --- a/packages/js/generators.json +++ b/packages/js/generators.json @@ -10,11 +10,11 @@ "description": "Create a library." }, "init": { - "factory": "./src/generators/init/init#initSchematic", + "factory": "./src/generators/init/init#jsInitSchematic", "schema": "./src/generators/init/schema.json", "aliases": ["lib"], "x-type": "init", - "description": "Init placeholder.", + "description": "Initial a TS/JS workspace.", "hidden": true }, "convert-to-swc": { @@ -34,11 +34,11 @@ "description": "Create a library" }, "init": { - "factory": "./src/generators/init/init#initGenerator", + "factory": "./src/generators/init/init#jsInitGenerator", "schema": "./src/generators/init/schema.json", "aliases": ["lib"], "x-type": "init", - "description": "Init placeholder.", + "description": "Initial a TS/JS workspace.", "hidden": true }, "convert-to-swc": { diff --git a/packages/workspace/src/generators/new/files-integrated-repo/tsconfig.base.json b/packages/js/src/generators/init/files/tsconfig.base.json similarity index 100% rename from packages/workspace/src/generators/new/files-integrated-repo/tsconfig.base.json rename to packages/js/src/generators/init/files/tsconfig.base.json diff --git a/packages/js/src/generators/init/init.ts b/packages/js/src/generators/init/init.ts index b6cf117dbbdd67..bd5bb22578ebd8 100644 --- a/packages/js/src/generators/init/init.ts +++ b/packages/js/src/generators/init/init.ts @@ -1,10 +1,45 @@ -import { convertNxGenerator, logger } from '@nrwl/devkit'; +import { + addDependenciesToPackageJson, + convertNxGenerator, + generateFiles, + GeneratorCallback, + joinPathFragments, + Tree, +} from '@nrwl/devkit'; +import { runTasksInSerial } from '@nrwl/workspace/src/utilities/run-tasks-in-serial'; +import { getRootTsConfigFileName } from '@nrwl/workspace/src/utilities/typescript'; +import { typescriptVersion } from '../../utils/versions'; +import { InitSchema } from './schema'; -export async function initGenerator() { - logger.info( - 'This is a placeholder for @nrwl/js:init generator. If you want to create a library, use @nrwl/js:lib instead' +function addDependencies(host: Tree) { + return addDependenciesToPackageJson( + host, + {}, + { + typescript: typescriptVersion, + } ); } -export default initGenerator; -export const initSchematic = convertNxGenerator(initGenerator); +export function jsInitGenerator( + host: Tree, + schema: InitSchema +): GeneratorCallback { + const tasks: GeneratorCallback[] = []; + + if (!schema.skipPackageJson) { + const installTask = addDependencies(host); + tasks.push(installTask); + } + + // add tsconfig.base.json + if (!schema.skipTsConfig && !getRootTsConfigFileName()) { + generateFiles(host, joinPathFragments(__dirname, './files'), '.', {}); + } + + return runTasksInSerial(...tasks); +} + +export default jsInitGenerator; + +export const jsInitSchematic = convertNxGenerator(jsInitGenerator); diff --git a/packages/js/src/generators/init/schema.d.ts b/packages/js/src/generators/init/schema.d.ts new file mode 100644 index 00000000000000..2c26653f9af819 --- /dev/null +++ b/packages/js/src/generators/init/schema.d.ts @@ -0,0 +1,4 @@ +export interface InitSchema { + skipPackageJson?: boolean; + skipTsConfig?: boolean; +} diff --git a/packages/js/src/generators/init/schema.json b/packages/js/src/generators/init/schema.json index 00e651cc61390b..3b0554368e724a 100644 --- a/packages/js/src/generators/init/schema.json +++ b/packages/js/src/generators/init/schema.json @@ -3,5 +3,19 @@ "$id": "NxTypescriptInit", "cli": "nx", "title": "Init nrwl/js", - "description": "Init generator placeholder for nrwl/js." + "description": "Init generator placeholder for nrwl/js.", + "properties": { + "skipPackageJson": { + "type": "boolean", + "default": false, + "description": "Do not add dependencies to `package.json`.", + "x-priority": "internal" + }, + "skipTsConfig": { + "type": "boolean", + "default": false, + "description": "Do not update `tsconfig.json` for development experience.", + "x-priority": "internal" + } + } } diff --git a/packages/js/src/generators/library/library.ts b/packages/js/src/generators/library/library.ts index 1acdd7c496576d..3279b65a0735cc 100644 --- a/packages/js/src/generators/library/library.ts +++ b/packages/js/src/generators/library/library.ts @@ -35,6 +35,7 @@ import { nxVersion, typesNodeVersion, } from '../../utils/versions'; +import jsInitGenerator from '../init/init'; export async function libraryGenerator( tree: Tree, @@ -54,7 +55,12 @@ export async function projectGenerator( destinationDir: string, filesDir: string ) { - const tasks: GeneratorCallback[] = []; + const tasks: GeneratorCallback[] = [ + jsInitGenerator(tree, { + skipPackageJson: schema.skipPackageJson, + skipTsConfig: schema.skipTsConfig, + }), + ]; const options = normalizeOptions(tree, schema, destinationDir); createFiles(tree, options, `${filesDir}/lib`); diff --git a/packages/js/src/generators/library/schema.json b/packages/js/src/generators/library/schema.json index 3d0dd26ac6cc25..3c2c0d2665b4c2 100644 --- a/packages/js/src/generators/library/schema.json +++ b/packages/js/src/generators/library/schema.json @@ -113,6 +113,12 @@ "type": "boolean", "description": "Whether to skip TypeScript type checking for SWC compiler.", "default": false + }, + "skipPackageJson": { + "type": "boolean", + "default": false, + "description": "Do not add dependencies to `package.json`.", + "x-priority": "internal" } }, "required": ["name"], diff --git a/packages/js/src/index.ts b/packages/js/src/index.ts index d97e88dfd10b54..806e469e04813d 100644 --- a/packages/js/src/index.ts +++ b/packages/js/src/index.ts @@ -5,3 +5,4 @@ export * from './utils/package-json'; export * from './utils/assets'; export * from './utils/package-json/update-package-json'; export { libraryGenerator } from './generators/library/library'; +export { jsInitGenerator } from './generators/init/init'; diff --git a/packages/js/src/utils/schema.d.ts b/packages/js/src/utils/schema.d.ts index c09831472c11e7..3eff3929931991 100644 --- a/packages/js/src/utils/schema.d.ts +++ b/packages/js/src/utils/schema.d.ts @@ -31,6 +31,7 @@ export interface LibraryGeneratorSchema { compiler?: Compiler; bundler?: Bundler; skipTypeCheck?: boolean; + skipPackageJson?: boolean; } export interface ExecutorOptions { diff --git a/packages/js/src/utils/versions.ts b/packages/js/src/utils/versions.ts index 3c9133879634d6..01e72265255afb 100644 --- a/packages/js/src/utils/versions.ts +++ b/packages/js/src/utils/versions.ts @@ -6,3 +6,4 @@ export const esbuildVersion = '^0.15.7'; export const swcCliVersion = '~0.1.55'; export const swcHelpersVersion = '~0.4.11'; export const typesNodeVersion = '18.7.1'; +export const typescriptVersion = '~4.8.2'; diff --git a/packages/next/package.json b/packages/next/package.json index e62d637e6b111e..af5cb5c0fde2a8 100644 --- a/packages/next/package.json +++ b/packages/next/package.json @@ -38,6 +38,7 @@ "@nrwl/cypress": "file:../cypress", "@nrwl/devkit": "file:../devkit", "@nrwl/jest": "file:../jest", + "@nrwl/js": "file:../js", "@nrwl/linter": "file:../linter", "@nrwl/react": "file:../react", "@nrwl/webpack": "file:../webpack", diff --git a/packages/next/src/generators/application/schema.d.ts b/packages/next/src/generators/application/schema.d.ts index d41b279e276709..d0815f0d9ecf54 100644 --- a/packages/next/src/generators/application/schema.d.ts +++ b/packages/next/src/generators/application/schema.d.ts @@ -11,10 +11,11 @@ export interface Schema { unitTestRunner?: 'jest' | 'none'; e2eTestRunner?: 'cypress' | 'none'; linter?: Linter; - skipWorkspaceJson?: boolean; js?: boolean; setParserOptionsProject?: boolean; standaloneConfig?: boolean; swc?: boolean; customServer?: boolean; + skipPackageJson?: boolean; + skipTsConfig?: boolean; } diff --git a/packages/next/src/generators/application/schema.json b/packages/next/src/generators/application/schema.json index 53285da28b54ce..736abfbe96169c 100644 --- a/packages/next/src/generators/application/schema.json +++ b/packages/next/src/generators/application/schema.json @@ -76,12 +76,6 @@ "default": false, "x-priority": "internal" }, - "skipWorkspaceJson": { - "description": "Skip updating `workspace.json` with default options based on values provided to this app (e.g. `babel`, `style`).", - "type": "boolean", - "default": false, - "x-priority": "internal" - }, "unitTestRunner": { "type": "string", "enum": ["jest", "none"], @@ -122,6 +116,18 @@ "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" + }, + "skipTsConfig": { + "type": "boolean", + "default": false, + "description": "Do not update `tsconfig.json` for development experience.", + "x-priority": "internal" } }, "required": [], diff --git a/packages/next/src/generators/init/init.ts b/packages/next/src/generators/init/init.ts index 0f08db7e2eedca..a59ae0ab2abff6 100644 --- a/packages/next/src/generators/init/init.ts +++ b/packages/next/src/generators/init/init.ts @@ -17,6 +17,7 @@ import { } from '../../utils/versions'; import { InitSchema } from './schema'; import { addGitIgnoreEntry } from '../../utils/add-gitignore-entry'; +import { jsInitGenerator } from '@nrwl/js'; function updateDependencies(host: Tree) { return addDependenciesToPackageJson( @@ -35,7 +36,12 @@ function updateDependencies(host: Tree) { } export async function nextInitGenerator(host: Tree, schema: InitSchema) { - const tasks: GeneratorCallback[] = []; + const tasks: GeneratorCallback[] = [ + jsInitGenerator(host, { + skipPackageJson: schema.skipPackageJson, + skipTsConfig: schema.skipTsConfig, + }), + ]; if (!schema.unitTestRunner || schema.unitTestRunner === 'jest') { const jestTask = jestInitGenerator(host, schema); @@ -49,8 +55,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 a0157cab6ecd6c..415afb32d52d13 100644 --- a/packages/next/src/generators/init/schema.d.ts +++ b/packages/next/src/generators/init/schema.d.ts @@ -3,4 +3,6 @@ export interface InitSchema { e2eTestRunner?: 'cypress' | 'none'; skipFormat?: boolean; js?: boolean; + skipPackageJson?: boolean; + skipTsConfig?: boolean; } diff --git a/packages/next/src/generators/init/schema.json b/packages/next/src/generators/init/schema.json index 13370bb45af0cc..eeed29d9a3d0fb 100644 --- a/packages/next/src/generators/init/schema.json +++ b/packages/next/src/generators/init/schema.json @@ -27,6 +27,18 @@ "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" + }, + "skipTsConfig": { + "type": "boolean", + "default": false, + "description": "Do not update `tsconfig.json` for development experience.", + "x-priority": "internal" } }, "required": [] diff --git a/packages/node/src/generators/application/schema.d.ts b/packages/node/src/generators/application/schema.d.ts index d84dc2abcf8ec5..4e9c8e37359fb7 100644 --- a/packages/node/src/generators/application/schema.d.ts +++ b/packages/node/src/generators/application/schema.d.ts @@ -19,6 +19,7 @@ export interface Schema { framework?: NodeJsFrameWorks; port?: number; rootProject?: boolean; + skipTsConfig?: boolean; } export type NodeJsFrameWorks = diff --git a/packages/node/src/generators/application/schema.json b/packages/node/src/generators/application/schema.json index 1c6603344e65cc..514a6c8e9e9c80 100644 --- a/packages/node/src/generators/application/schema.json +++ b/packages/node/src/generators/application/schema.json @@ -110,6 +110,12 @@ "enum": ["jest", "none"], "description": "Test runner to use for end to end (e2e) tests", "default": "jest" + }, + "skipTsConfig": { + "type": "boolean", + "default": false, + "description": "Do not update `tsconfig.json` for development experience.", + "x-priority": "internal" } }, "required": [] diff --git a/packages/node/src/generators/init/init.ts b/packages/node/src/generators/init/init.ts index 88e6a5e0e30c21..56c132196438c2 100644 --- a/packages/node/src/generators/init/init.ts +++ b/packages/node/src/generators/init/init.ts @@ -7,6 +7,8 @@ import { Tree, } from '@nrwl/devkit'; import { jestInitGenerator } from '@nrwl/jest'; +import { runTasksInSerial } from '@nrwl/workspace/src/utilities/run-tasks-in-serial'; +import { jsInitGenerator } from '@nrwl/js'; import { nxVersion, tslibVersion, @@ -36,21 +38,24 @@ function normalizeOptions(schema: Schema) { export async function initGenerator(tree: Tree, schema: Schema) { const options = normalizeOptions(schema); - let jestInstall: GeneratorCallback; + const tasks: GeneratorCallback[] = [ + jsInitGenerator(tree, { + skipPackageJson: schema.skipPackageJson, + skipTsConfig: schema.skipTsConfig, + }), + ]; if (options.unitTestRunner === 'jest') { - jestInstall = await jestInitGenerator(tree, schema); + tasks.push(jestInitGenerator(tree, schema)); + } + + if (!options.skipPackageJson) { + tasks.push(updateDependencies(tree)); } - const installTask = await updateDependencies(tree); if (!options.skipFormat) { await formatFiles(tree); } - return async () => { - if (jestInstall) { - await jestInstall(); - } - await installTask(); - }; + return runTasksInSerial(...tasks); } export default initGenerator; diff --git a/packages/node/src/generators/init/schema.d.ts b/packages/node/src/generators/init/schema.d.ts index 2216c6dbc28bec..c43431f2e7eeb5 100644 --- a/packages/node/src/generators/init/schema.d.ts +++ b/packages/node/src/generators/init/schema.d.ts @@ -2,4 +2,6 @@ export interface Schema { unitTestRunner?: 'jest' | 'none'; skipFormat?: boolean; js?: boolean; + skipPackageJson?: boolean; + skipTsConfig?: boolean; } diff --git a/packages/node/src/generators/init/schema.json b/packages/node/src/generators/init/schema.json index 647e7d4248799d..fd9f5f5d9fec88 100644 --- a/packages/node/src/generators/init/schema.json +++ b/packages/node/src/generators/init/schema.json @@ -21,6 +21,18 @@ "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" + }, + "skipTsConfig": { + "type": "boolean", + "default": false, + "description": "Do not update `tsconfig.json` for development experience.", + "x-priority": "internal" } }, "required": [] diff --git a/packages/react-native/src/generators/application/schema.d.ts b/packages/react-native/src/generators/application/schema.d.ts index fe6bd88365e436..c3c9e6704ac17a 100644 --- a/packages/react-native/src/generators/application/schema.d.ts +++ b/packages/react-native/src/generators/application/schema.d.ts @@ -16,4 +16,5 @@ export interface Schema { e2eTestRunner?: 'detox' | 'none'; install: boolean; // default is true skipPackageJson?: boolean; //default is false + skipTsConfig?: boolean; } diff --git a/packages/react-native/src/generators/application/schema.json b/packages/react-native/src/generators/application/schema.json index 1ef969aa555a00..acd9abba378a04 100644 --- a/packages/react-native/src/generators/application/schema.json +++ b/packages/react-native/src/generators/application/schema.json @@ -83,6 +83,12 @@ "type": "boolean", "default": false, "x-priority": "internal" + }, + "skipTsConfig": { + "type": "boolean", + "default": false, + "description": "Do not update `tsconfig.json` for development experience.", + "x-priority": "internal" } }, "required": [] diff --git a/packages/react-native/src/generators/init/init.ts b/packages/react-native/src/generators/init/init.ts index fcce186663911a..0f53b169e5f733 100644 --- a/packages/react-native/src/generators/init/init.ts +++ b/packages/react-native/src/generators/init/init.ts @@ -13,6 +13,7 @@ import { addBabelInputs } from '@nrwl/js/src/utils/add-babel-inputs'; import { jestInitGenerator } from '@nrwl/jest'; import { detoxInitGenerator } from '@nrwl/detox'; +import { jsInitGenerator } from '@nrwl/js'; import { babelRuntimeVersion, @@ -43,7 +44,12 @@ export async function reactNativeInitGenerator(host: Tree, schema: Schema) { addGitIgnoreEntry(host); addBabelInputs(host); - const tasks: GeneratorCallback[] = []; + const tasks: GeneratorCallback[] = [ + jsInitGenerator(host, { + skipPackageJson: schema.skipPackageJson, + skipTsConfig: schema.skipTsConfig, + }), + ]; if (!schema.skipPackageJson) { const installTask = updateDependencies(host); diff --git a/packages/react-native/src/generators/init/schema.d.ts b/packages/react-native/src/generators/init/schema.d.ts index c1b3399922e56e..9caa3909f5a078 100644 --- a/packages/react-native/src/generators/init/schema.d.ts +++ b/packages/react-native/src/generators/init/schema.d.ts @@ -3,5 +3,6 @@ export interface Schema { skipFormat?: boolean; e2eTestRunner?: 'detox' | 'none'; skipPackageJson?: boolean; //default is false + skipTsConfig?: boolean; js?: boolean; } diff --git a/packages/react-native/src/generators/init/schema.json b/packages/react-native/src/generators/init/schema.json index 4625d0cae8403b..f7c4139e7e08a6 100644 --- a/packages/react-native/src/generators/init/schema.json +++ b/packages/react-native/src/generators/init/schema.json @@ -34,6 +34,12 @@ "type": "boolean", "default": false, "x-priority": "internal" + }, + "skipTsConfig": { + "type": "boolean", + "default": false, + "description": "Do not update `tsconfig.json` for development experience.", + "x-priority": "internal" } }, "required": [] diff --git a/packages/react/package.json b/packages/react/package.json index d0fe3976d10fc7..eae7ac5b622059 100644 --- a/packages/react/package.json +++ b/packages/react/package.json @@ -32,6 +32,7 @@ }, "dependencies": { "@nrwl/devkit": "file:../devkit", + "@nrwl/js": "file:../js", "@nrwl/linter": "file:../linter", "@nrwl/workspace": "file:../workspace", "@phenomnomnominal/tsquery": "4.1.1", diff --git a/packages/react/src/generators/init/init.ts b/packages/react/src/generators/init/init.ts index a50b41672a5818..755333f82eb6ec 100755 --- a/packages/react/src/generators/init/init.ts +++ b/packages/react/src/generators/init/init.ts @@ -10,6 +10,7 @@ import { writeJson, } from '@nrwl/devkit'; import { runTasksInSerial } from '@nrwl/workspace/src/utilities/run-tasks-in-serial'; +import { jsInitGenerator } from '@nrwl/js'; import { babelPresetReactVersion, nxVersion, @@ -85,7 +86,12 @@ function initRootBabelConfig(tree: Tree, schema: InitSchema) { } export async function reactInitGenerator(host: Tree, schema: InitSchema) { - const tasks: GeneratorCallback[] = []; + const tasks: GeneratorCallback[] = [ + jsInitGenerator(host, { + skipPackageJson: schema.skipPackageJson, + skipTsConfig: schema.skipTsConfig, + }), + ]; setDefault(host); diff --git a/packages/react/src/generators/init/schema.d.ts b/packages/react/src/generators/init/schema.d.ts index 1d339905bcb6a4..36c3a1f1dd9e74 100644 --- a/packages/react/src/generators/init/schema.d.ts +++ b/packages/react/src/generators/init/schema.d.ts @@ -4,6 +4,7 @@ export interface InitSchema { skipBabelConfig?: boolean; skipFormat?: boolean; skipPackageJson?: boolean; + skipTsConfig?: boolean; skipHelperLibs?: boolean; js?: boolean; } diff --git a/packages/react/src/generators/init/schema.json b/packages/react/src/generators/init/schema.json index 1c6800c0244a90..1cf85d84dbf415 100644 --- a/packages/react/src/generators/init/schema.json +++ b/packages/react/src/generators/init/schema.json @@ -26,7 +26,14 @@ "skipPackageJson": { "description": "Do not add dependencies to `package.json`.", "type": "boolean", - "default": false + "default": false, + "x-priority": "internal" + }, + "skipTsConfig": { + "type": "boolean", + "default": false, + "description": "Do not update `tsconfig.json` for development experience.", + "x-priority": "internal" }, "skipBabelConfig": { "description": "Do not generate a root babel.config.json (if babel is not needed).", diff --git a/packages/web/src/generators/application/schema.d.ts b/packages/web/src/generators/application/schema.d.ts index 8c66c906e0a480..c979d0fc46204b 100644 --- a/packages/web/src/generators/application/schema.d.ts +++ b/packages/web/src/generators/application/schema.d.ts @@ -15,4 +15,5 @@ export interface Schema { linter?: Linter; standaloneConfig?: boolean; setParserOptionsProject?: boolean; + skipTsConfig?: boolean; } diff --git a/packages/web/src/generators/application/schema.json b/packages/web/src/generators/application/schema.json index 801734666e3530..a3b65b6848a5da 100644 --- a/packages/web/src/generators/application/schema.json +++ b/packages/web/src/generators/application/schema.json @@ -99,6 +99,12 @@ "standaloneConfig": { "description": "Split the project configuration into `/project.json` rather than including it inside workspace.json", "type": "boolean" + }, + "skipTsConfig": { + "type": "boolean", + "default": false, + "description": "Do not update `tsconfig.json` for development experience.", + "x-priority": "internal" } }, "required": [], diff --git a/packages/web/src/generators/init/init.ts b/packages/web/src/generators/init/init.ts index 831be479356959..c3f2f1bf848c36 100644 --- a/packages/web/src/generators/init/init.ts +++ b/packages/web/src/generators/init/init.ts @@ -16,6 +16,7 @@ import { } from '../../utils/versions'; import { Schema } from './schema'; import { addBabelInputs } from '@nrwl/js/src/utils/add-babel-inputs'; +import { jsInitGenerator } from '@nrwl/js'; function updateDependencies(tree: Tree, schema: Schema) { removeDependenciesFromPackageJson(tree, ['@nrwl/web'], []); @@ -41,7 +42,12 @@ function updateDependencies(tree: Tree, schema: Schema) { } export async function webInitGenerator(tree: Tree, schema: Schema) { - let tasks: GeneratorCallback[] = []; + let tasks: GeneratorCallback[] = [ + jsInitGenerator(tree, { + skipPackageJson: schema.skipPackageJson, + skipTsConfig: schema.skipTsConfig, + }), + ]; if (!schema.unitTestRunner || schema.unitTestRunner === 'jest') { const jestTask = jestInitGenerator(tree, { diff --git a/packages/web/src/generators/init/schema.d.ts b/packages/web/src/generators/init/schema.d.ts index 7276adf217146c..3a5d67ecbf3dd9 100644 --- a/packages/web/src/generators/init/schema.d.ts +++ b/packages/web/src/generators/init/schema.d.ts @@ -5,4 +5,5 @@ export interface Schema { skipFormat?: boolean; skipPackageJson?: boolean; skipBabelConfig?: boolean; + skipTsConfig?: boolean; } diff --git a/packages/web/src/generators/init/schema.json b/packages/web/src/generators/init/schema.json index 8e7a8daab5367f..69e4355fd9089a 100644 --- a/packages/web/src/generators/init/schema.json +++ b/packages/web/src/generators/init/schema.json @@ -32,12 +32,19 @@ "skipPackageJson": { "description": "Do not add dependencies to `package.json`.", "type": "boolean", - "default": false + "default": false, + "x-priority": "internal" }, "skipBabelConfig": { "description": "Do not generate a root babel.config.json (if babel is not needed).", "type": "boolean", "default": false + }, + "skipTsConfig": { + "type": "boolean", + "default": false, + "description": "Do not update `tsconfig.json` for development experience.", + "x-priority": "internal" } }, "required": [] diff --git a/packages/workspace/migrations.json b/packages/workspace/migrations.json index ba00b404b5082e..08e9e1eceba7b3 100644 --- a/packages/workspace/migrations.json +++ b/packages/workspace/migrations.json @@ -50,7 +50,7 @@ }, "13-10-0-update-tasks-runner": { "version": "13.10.0-beta.0", - "description": "Update the tasks runner property to import it from the nx package instead of @nrwl/worksapce", + "description": "Update the tasks runner property to import it from the nx package instead of @nrwl/workspace", "cli": "nx", "implementation": "./src/migrations/update-13-10-0/update-tasks-runner" }, diff --git a/packages/workspace/project.json b/packages/workspace/project.json index 3e50ac2ceabd50..92d5dba56af400 100644 --- a/packages/workspace/project.json +++ b/packages/workspace/project.json @@ -44,11 +44,6 @@ "input": "packages/workspace", "output": "/" }, - { - "input": "packages/workspace", - "glob": "**/files-root-app/**", - "output": "/" - }, { "input": "packages/workspace", "glob": "**/*.json", diff --git a/packages/workspace/src/generators/library/files/root/tsconfig.base.json b/packages/workspace/src/generators/library/files/root/tsconfig.base.json new file mode 100644 index 00000000000000..11253ac5c2b7bc --- /dev/null +++ b/packages/workspace/src/generators/library/files/root/tsconfig.base.json @@ -0,0 +1,20 @@ +{ + "compileOnSave": false, + "compilerOptions": { + "rootDir": ".", + "sourceMap": true, + "declaration": false, + "moduleResolution": "node", + "emitDecoratorMetadata": true, + "experimentalDecorators": true, + "importHelpers": true, + "target": "es2015", + "module": "esnext", + "lib": ["es2017", "dom"], + "skipLibCheck": true, + "skipDefaultLibCheck": true, + "baseUrl": ".", + "paths": {} + }, + "exclude": ["node_modules", "tmp"] +} diff --git a/packages/workspace/src/generators/library/library.ts b/packages/workspace/src/generators/library/library.ts index 89197f459f745e..6c10ceb3749b31 100644 --- a/packages/workspace/src/generators/library/library.ts +++ b/packages/workspace/src/generators/library/library.ts @@ -23,7 +23,7 @@ import { getRelativePathToRootTsConfig, getRootTsConfigPathInTree, } from '../../utilities/typescript'; -import { nxVersion } from '../../utils/versions'; +import { nxVersion, typescriptVersion } from '../../utils/versions'; import { Schema } from './schema'; export interface NormalizedSchema extends Schema { @@ -190,9 +190,27 @@ async function addJest( }); } +function addTypescriptDependency(host: Tree) { + return addDependenciesToPackageJson( + host, + {}, + { + typescript: typescriptVersion, + } + ); +} + +function addTsConfigBase(tree: Tree, options: NormalizedSchema) { + // add tsconfig.base.json + if (!options.skipTsConfig && tree.exists('tsconfig.base.json`')) { + generateFiles(tree, joinPathFragments(__dirname, './files/root'), '.', {}); + } +} + export async function libraryGenerator(tree: Tree, schema: Schema) { const options = normalizeOptions(tree, schema); + addTsConfigBase(tree, options); createFiles(tree, options); if (!options.skipTsConfig) { @@ -200,7 +218,7 @@ export async function libraryGenerator(tree: Tree, schema: Schema) { } addProject(tree, options); - const tasks: GeneratorCallback[] = []; + const tasks: GeneratorCallback[] = [addTypescriptDependency(tree)]; if (options.linter !== 'none') { const lintCallback = await addLint(tree, options); diff --git a/packages/workspace/src/generators/new/files-root-app/__dot__gitignore b/packages/workspace/src/generators/new/files-root-app/__dot__gitignore deleted file mode 100644 index 51b9af5269c1df..00000000000000 --- a/packages/workspace/src/generators/new/files-root-app/__dot__gitignore +++ /dev/null @@ -1,39 +0,0 @@ -# See http://help.github.com/ignore-files/ for more about ignoring files. - -# compiled output -dist -tmp -/out-tsc - -# dependencies -node_modules - -# IDEs and editors -/.idea -.project -.classpath -.c9/ -*.launch -.settings/ -*.sublime-workspace - -# IDE - VSCode -.vscode/* -!.vscode/settings.json -!.vscode/tasks.json -!.vscode/launch.json -!.vscode/extensions.json - -# misc -/.sass-cache -/connect.lock -/coverage -/libpeerconnection.log -npm-debug.log -yarn-error.log -testem.log -/typings - -# System Files -.DS_Store -Thumbs.db diff --git a/packages/workspace/src/generators/new/files-root-app/__dot__prettierignore b/packages/workspace/src/generators/new/files-root-app/__dot__prettierignore deleted file mode 100644 index d0b804da2a4620..00000000000000 --- a/packages/workspace/src/generators/new/files-root-app/__dot__prettierignore +++ /dev/null @@ -1,4 +0,0 @@ -# Add files here to ignore them from prettier formatting - -/dist -/coverage diff --git a/packages/workspace/src/generators/new/files-root-app/__dot__vscode/extensions.json__tmpl__ b/packages/workspace/src/generators/new/files-root-app/__dot__vscode/extensions.json__tmpl__ deleted file mode 100644 index aaf47be3eb9d97..00000000000000 --- a/packages/workspace/src/generators/new/files-root-app/__dot__vscode/extensions.json__tmpl__ +++ /dev/null @@ -1,7 +0,0 @@ -{ - "recommendations": [<% if(cliCommand === 'ng') { %> - "angular.ng-template",<% } %> - "nrwl.angular-console", - "esbenp.prettier-vscode" - ] -} diff --git a/packages/workspace/src/generators/new/files-root-app/package.json__tmpl__ b/packages/workspace/src/generators/new/files-root-app/package.json__tmpl__ deleted file mode 100644 index 8a64a50fdfe1ab..00000000000000 --- a/packages/workspace/src/generators/new/files-root-app/package.json__tmpl__ +++ /dev/null @@ -1,16 +0,0 @@ -{ - "name": "<%= formattedNames.fileName %>", - "version": "0.0.0", - "license": "MIT", - "scripts": { - }, - "private": true, - "dependencies": { - }, - "devDependencies": { - "@nrwl/workspace": "<%= nxVersion %>", - "nx": "<%= nxVersion %>", - "prettier": "<%= prettierVersion %>", - "typescript": "<%= typescriptVersion %>" - } -} diff --git a/packages/workspace/src/generators/new/generate-workspace-files.ts b/packages/workspace/src/generators/new/generate-workspace-files.ts index 52f9f3824a9b06..fafcc8b8530ab6 100644 --- a/packages/workspace/src/generators/new/generate-workspace-files.ts +++ b/packages/workspace/src/generators/new/generate-workspace-files.ts @@ -134,11 +134,7 @@ function createNxJson( function createFiles(tree: Tree, options: NormalizedSchema) { const formattedNames = names(options.name); const filesDirName = - options.preset === Preset.AngularStandalone || - options.preset === Preset.ReactStandalone || - options.preset === Preset.NodeServer - ? './files-root-app' - : options.preset === Preset.NPM || options.preset === Preset.Core + options.preset === Preset.NPM || options.preset === Preset.Core ? './files-package-based-repo' : './files-integrated-repo'; generateFiles(tree, pathJoin(__dirname, filesDirName), options.directory, { diff --git a/packages/workspace/src/utilities/typescript.ts b/packages/workspace/src/utilities/typescript.ts index 9b3f7485b8eab6..d72cd360ecfa59 100644 --- a/packages/workspace/src/utilities/typescript.ts +++ b/packages/workspace/src/utilities/typescript.ts @@ -1,8 +1,8 @@ -import { offsetFromRoot, Tree } from '@nrwl/devkit'; -import { workspaceRoot } from '@nrwl/devkit'; +import { offsetFromRoot, Tree, workspaceRoot } from '@nrwl/devkit'; import { existsSync } from 'fs'; import { dirname, join } from 'path'; import type * as ts from 'typescript'; + export { compileTypeScript } from './typescript/compilation'; export type { TypeScriptCompilationOptions } from './typescript/compilation'; export { findNodes } from './typescript/find-nodes'; // TODO(v16): remove this