@nx/node 20.3.0-beta.0 → 20.3.0-beta.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@nx/node",
3
- "version": "20.3.0-beta.0",
3
+ "version": "20.3.0-beta.1",
4
4
  "private": false,
5
5
  "description": "The Node Plugin for Nx contains generators to manage Node applications within an Nx workspace.",
6
6
  "repository": {
@@ -32,10 +32,10 @@
32
32
  },
33
33
  "dependencies": {
34
34
  "tslib": "^2.3.0",
35
- "@nx/devkit": "20.3.0-beta.0",
36
- "@nx/jest": "20.3.0-beta.0",
37
- "@nx/js": "20.3.0-beta.0",
38
- "@nx/eslint": "20.3.0-beta.0"
35
+ "@nx/devkit": "20.3.0-beta.1",
36
+ "@nx/jest": "20.3.0-beta.1",
37
+ "@nx/js": "20.3.0-beta.1",
38
+ "@nx/eslint": "20.3.0-beta.1"
39
39
  },
40
40
  "publishConfig": {
41
41
  "access": "public"
@@ -4,6 +4,7 @@ export interface NormalizedSchema extends Schema {
4
4
  appProjectRoot: string;
5
5
  parsedTags: string[];
6
6
  outputPath: string;
7
+ isUsingTsSolutionConfig: boolean;
7
8
  }
8
9
  export declare function addLintingToApplication(tree: Tree, options: NormalizedSchema): Promise<GeneratorCallback>;
9
10
  export declare function applicationGenerator(tree: Tree, schema: Schema): Promise<GeneratorCallback>;
@@ -3,11 +3,11 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.addLintingToApplication = addLintingToApplication;
4
4
  exports.applicationGenerator = applicationGenerator;
5
5
  exports.applicationGeneratorInternal = applicationGeneratorInternal;
6
+ const get_import_path_1 = require("@nx/js/src/utils/get-import-path");
6
7
  const devkit_1 = require("@nx/devkit");
7
8
  const project_name_and_root_utils_1 = require("@nx/devkit/src/generators/project-name-and-root-utils");
8
9
  const jest_1 = require("@nx/jest");
9
10
  const js_1 = require("@nx/js");
10
- const ts_solution_setup_1 = require("@nx/js/src/utils/typescript/ts-solution-setup");
11
11
  const versions_1 = require("@nx/js/src/utils/versions");
12
12
  const eslint_1 = require("@nx/eslint");
13
13
  const path_1 = require("path");
@@ -18,6 +18,7 @@ const setup_docker_1 = require("../setup-docker/setup-docker");
18
18
  const has_webpack_plugin_1 = require("../../utils/has-webpack-plugin");
19
19
  const target_defaults_utils_1 = require("@nx/devkit/src/generators/target-defaults-utils");
20
20
  const log_show_project_command_1 = require("@nx/devkit/src/utils/log-show-project-command");
21
+ const ts_solution_setup_1 = require("@nx/js/src/utils/typescript/ts-solution-setup");
21
22
  function getWebpackBuildConfig(project, options) {
22
23
  return {
23
24
  executor: `@nx/webpack:webpack`,
@@ -31,7 +32,7 @@ function getWebpackBuildConfig(project, options) {
31
32
  tsConfig: (0, devkit_1.joinPathFragments)(options.appProjectRoot, 'tsconfig.app.json'),
32
33
  assets: [(0, devkit_1.joinPathFragments)(project.sourceRoot, 'assets')],
33
34
  webpackConfig: (0, devkit_1.joinPathFragments)(options.appProjectRoot, 'webpack.config.js'),
34
- generatePackageJson: true,
35
+ generatePackageJson: options.isUsingTsSolutionConfig ? undefined : true,
35
36
  },
36
37
  configurations: {
37
38
  development: {},
@@ -55,7 +56,7 @@ function getEsBuildConfig(project, options) {
55
56
  main: (0, devkit_1.joinPathFragments)(project.sourceRoot, 'main' + (options.js ? '.js' : '.ts')),
56
57
  tsConfig: (0, devkit_1.joinPathFragments)(options.appProjectRoot, 'tsconfig.app.json'),
57
58
  assets: [(0, devkit_1.joinPathFragments)(project.sourceRoot, 'assets')],
58
- generatePackageJson: true,
59
+ generatePackageJson: options.isUsingTsSolutionConfig ? undefined : true,
59
60
  esbuildOptions: {
60
61
  sourcemap: true,
61
62
  // Generate CJS files as .js so imports can be './foo' rather than './foo.cjs'.
@@ -136,10 +137,25 @@ function addProject(tree, options) {
136
137
  }
137
138
  }
138
139
  project.targets.serve = getServeConfig(options);
139
- (0, devkit_1.addProjectConfiguration)(tree, options.name, project, options.standaloneConfig);
140
+ if (options.isUsingTsSolutionConfig) {
141
+ (0, devkit_1.writeJson)(tree, (0, devkit_1.joinPathFragments)(options.appProjectRoot, 'package.json'), {
142
+ name: (0, get_import_path_1.getImportPath)(tree, options.name),
143
+ version: '0.0.1',
144
+ private: true,
145
+ nx: {
146
+ name: options.name,
147
+ projectType: 'application',
148
+ sourceRoot: project.sourceRoot,
149
+ targets: project.targets,
150
+ tags: project.tags?.length ? project.tags : undefined,
151
+ },
152
+ });
153
+ }
154
+ else {
155
+ (0, devkit_1.addProjectConfiguration)(tree, options.name, project, options.standaloneConfig);
156
+ }
140
157
  }
141
158
  function addAppFiles(tree, options) {
142
- const sourceRoot = (0, devkit_1.joinPathFragments)(options.appProjectRoot, 'src');
143
159
  (0, devkit_1.generateFiles)(tree, (0, path_1.join)(__dirname, './files/common'), options.appProjectRoot, {
144
160
  ...options,
145
161
  tmpl: '',
@@ -265,6 +281,9 @@ function addProjectDependencies(tree, options) {
265
281
  });
266
282
  }
267
283
  function updateTsConfigOptions(tree, options) {
284
+ if (options.isUsingTsSolutionConfig) {
285
+ return;
286
+ }
268
287
  (0, devkit_1.updateJson)(tree, `${options.appProjectRoot}/tsconfig.json`, (json) => {
269
288
  if (options.rootProject) {
270
289
  return {
@@ -296,9 +315,15 @@ async function applicationGenerator(tree, schema) {
296
315
  });
297
316
  }
298
317
  async function applicationGeneratorInternal(tree, schema) {
299
- (0, ts_solution_setup_1.assertNotUsingTsSolutionSetup)(tree, 'node', 'application');
300
- const options = await normalizeOptions(tree, schema);
301
318
  const tasks = [];
319
+ const jsInitTask = await (0, js_1.initGenerator)(tree, {
320
+ ...schema,
321
+ tsConfigName: schema.rootProject ? 'tsconfig.json' : 'tsconfig.base.json',
322
+ skipFormat: true,
323
+ addTsPlugin: schema.useTsSolution,
324
+ });
325
+ tasks.push(jsInitTask);
326
+ const options = await normalizeOptions(tree, schema);
302
327
  if (options.framework === 'nest') {
303
328
  // nx-ignore-next-line
304
329
  const { applicationGenerator } = (0, devkit_1.ensurePackage)('@nx/nest', versions_2.nxVersion);
@@ -322,12 +347,6 @@ async function applicationGeneratorInternal(tree, schema) {
322
347
  },
323
348
  ]);
324
349
  }
325
- const jsInitTask = await (0, js_1.initGenerator)(tree, {
326
- ...schema,
327
- tsConfigName: schema.rootProject ? 'tsconfig.json' : 'tsconfig.base.json',
328
- skipFormat: true,
329
- });
330
- tasks.push(jsInitTask);
331
350
  const initTask = await (0, init_1.initGenerator)(tree, {
332
351
  ...schema,
333
352
  skipFormat: true,
@@ -369,6 +388,13 @@ async function applicationGeneratorInternal(tree, schema) {
369
388
  skipFormat: true,
370
389
  });
371
390
  tasks.push(jestTask);
391
+ // There are no tests by default, so set `--passWithNoTests` to avoid test failure on new project.
392
+ const projectConfig = (0, devkit_1.readProjectConfiguration)(tree, options.name);
393
+ projectConfig.targets ??= {};
394
+ projectConfig.targets.test = {
395
+ options: { passWithNoTests: true },
396
+ };
397
+ (0, devkit_1.updateProjectConfiguration)(tree, options.name, projectConfig);
372
398
  }
373
399
  else {
374
400
  // No need for default spec file if unit testing is not setup.
@@ -404,6 +430,14 @@ async function applicationGeneratorInternal(tree, schema) {
404
430
  if (!options.skipFormat) {
405
431
  await (0, devkit_1.formatFiles)(tree);
406
432
  }
433
+ if (options.isUsingTsSolutionConfig) {
434
+ (0, ts_solution_setup_1.updateTsconfigFiles)(tree, options.appProjectRoot, 'tsconfig.app.json', {
435
+ module: 'nodenext',
436
+ moduleResolution: 'nodenext',
437
+ }, options.linter === 'eslint'
438
+ ? ['eslint.config.js', 'eslint.config.cjs', 'eslint.config.mjs']
439
+ : undefined);
440
+ }
407
441
  tasks.push(() => {
408
442
  (0, log_show_project_command_1.logShowProjectCommand)(options.name);
409
443
  });
@@ -440,6 +474,7 @@ async function normalizeOptions(host, options) {
440
474
  rootProject: options.rootProject ?? false,
441
475
  port: options.port ?? 3000,
442
476
  outputPath: (0, devkit_1.joinPathFragments)('dist', options.rootProject ? options.name : appProjectRoot),
477
+ isUsingTsSolutionConfig: (0, ts_solution_setup_1.isUsingTsSolutionSetup)(host),
443
478
  };
444
479
  }
445
480
  exports.default = applicationGenerator;
@@ -8,6 +8,7 @@ export interface Schema {
8
8
  unitTestRunner?: 'jest' | 'none';
9
9
  e2eTestRunner?: 'jest' | 'none';
10
10
  linter?: Linter | LinterType;
11
+ formatter?: 'none' | 'prettier';
11
12
  tags?: string;
12
13
  frontendProject?: string;
13
14
  swcJest?: boolean;
@@ -23,6 +24,7 @@ export interface Schema {
23
24
  docker?: boolean;
24
25
  isNest?: boolean;
25
26
  addPlugin?: boolean;
27
+ useTsSolution?: boolean;
26
28
  }
27
29
 
28
30
  export type NodeJsFrameWorks = 'express' | 'koa' | 'fastify' | 'nest' | 'none';
@@ -36,14 +36,26 @@
36
36
  "linter": {
37
37
  "description": "The tool to use for running lint checks.",
38
38
  "type": "string",
39
- "enum": ["eslint"],
40
- "default": "eslint"
39
+ "enum": ["eslint", "none"],
40
+ "default": "none",
41
+ "x-prompt": "Which linter would you like to use?",
42
+ "x-priority": "important"
41
43
  },
42
44
  "unitTestRunner": {
43
45
  "type": "string",
44
46
  "enum": ["jest", "none"],
45
47
  "description": "Test runner to use for unit tests.",
46
- "default": "jest"
48
+ "default": "none",
49
+ "x-priority": "important",
50
+ "x-prompt": "Which unit test runner would you like to use?"
51
+ },
52
+ "e2eTestRunner": {
53
+ "type": "string",
54
+ "enum": ["jest", "none"],
55
+ "description": "Test runner to use for end-to-end tests",
56
+ "default": "none",
57
+ "x-priority": "important",
58
+ "x-prompt": "Which end-to-end test runner would you like to use?"
47
59
  },
48
60
  "tags": {
49
61
  "type": "string",
@@ -109,12 +121,6 @@
109
121
  "hidden": true,
110
122
  "x-priority": "internal"
111
123
  },
112
- "e2eTestRunner": {
113
- "type": "string",
114
- "enum": ["jest", "none"],
115
- "description": "Test runner to use for end to end (e2e) tests",
116
- "default": "jest"
117
- },
118
124
  "docker": {
119
125
  "type": "boolean",
120
126
  "description": "Add a docker build target"
@@ -11,6 +11,9 @@ const versions_1 = require("../../utils/versions");
11
11
  const eslint_file_1 = require("@nx/eslint/src/generators/utils/eslint-file");
12
12
  const log_show_project_command_1 = require("@nx/devkit/src/utils/log-show-project-command");
13
13
  const config_file_1 = require("@nx/jest/src/utils/config/config-file");
14
+ const ts_solution_setup_1 = require("@nx/js/src/utils/typescript/ts-solution-setup");
15
+ const get_import_path_1 = require("@nx/js/src/utils/get-import-path");
16
+ const posix_1 = require("node:path/posix");
14
17
  async function e2eProjectGenerator(host, options) {
15
18
  return await e2eProjectGeneratorInternal(host, {
16
19
  addPlugin: false,
@@ -21,23 +24,49 @@ async function e2eProjectGeneratorInternal(host, _options) {
21
24
  const tasks = [];
22
25
  const options = await normalizeOptions(host, _options);
23
26
  const appProject = (0, devkit_1.readProjectConfiguration)(host, options.project);
27
+ const isUsingTsSolutionConfig = (0, ts_solution_setup_1.isUsingTsSolutionSetup)(host);
24
28
  // TODO(@ndcunningham): This is broken.. the outputs are wrong.. and this isn't using the jest generator
25
- (0, devkit_1.addProjectConfiguration)(host, options.e2eProjectName, {
26
- root: options.e2eProjectRoot,
27
- implicitDependencies: [options.project],
28
- projectType: 'application',
29
- targets: {
30
- e2e: {
31
- executor: '@nx/jest:jest',
32
- outputs: ['{workspaceRoot}/coverage/{e2eProjectRoot}'],
33
- options: {
34
- jestConfig: `${options.e2eProjectRoot}/jest.config.ts`,
35
- passWithNoTests: true,
29
+ if (isUsingTsSolutionConfig) {
30
+ (0, devkit_1.writeJson)(host, (0, devkit_1.joinPathFragments)(options.e2eProjectRoot, 'package.json'), {
31
+ name: (0, get_import_path_1.getImportPath)(host, options.e2eProjectName),
32
+ version: '0.0.1',
33
+ private: true,
34
+ nx: {
35
+ name: options.e2eProjectName,
36
+ projectType: 'application',
37
+ implicitDependencies: [options.project],
38
+ targets: {
39
+ e2e: {
40
+ executor: '@nx/jest:jest',
41
+ outputs: ['{workspaceRoot}/coverage/{e2eProjectRoot}'],
42
+ options: {
43
+ jestConfig: `${options.e2eProjectRoot}/jest.config.ts`,
44
+ passWithNoTests: true,
45
+ },
46
+ dependsOn: [`${options.project}:build`],
47
+ },
36
48
  },
37
- dependsOn: [`${options.project}:build`],
38
49
  },
39
- },
40
- });
50
+ });
51
+ }
52
+ else {
53
+ (0, devkit_1.addProjectConfiguration)(host, options.e2eProjectName, {
54
+ root: options.e2eProjectRoot,
55
+ implicitDependencies: [options.project],
56
+ projectType: 'application',
57
+ targets: {
58
+ e2e: {
59
+ executor: '@nx/jest:jest',
60
+ outputs: ['{workspaceRoot}/coverage/{e2eProjectRoot}'],
61
+ options: {
62
+ jestConfig: `${options.e2eProjectRoot}/jest.config.ts`,
63
+ passWithNoTests: true,
64
+ },
65
+ dependsOn: [`${options.project}:build`],
66
+ },
67
+ },
68
+ });
69
+ }
41
70
  // TODO(@nicholas): Find a better way to get build target
42
71
  // We remove the 'test' target from the e2e project because it is not needed
43
72
  // The 'e2e' target is the one that should run the tests for the e2e project
@@ -64,10 +93,14 @@ async function e2eProjectGeneratorInternal(host, _options) {
64
93
  });
65
94
  }
66
95
  const jestPreset = (0, config_file_1.findRootJestPreset)(host) ?? 'jest.preset.js';
96
+ const tsConfigFile = isUsingTsSolutionConfig
97
+ ? 'tsconfig.json'
98
+ : 'tsconfig.spec.json';
67
99
  if (options.projectType === 'server') {
68
100
  (0, devkit_1.generateFiles)(host, path.join(__dirname, 'files/server/common'), options.e2eProjectRoot, {
69
101
  ...options,
70
102
  ...(0, devkit_1.names)(options.rootProject ? 'server' : options.project),
103
+ tsConfigFile,
71
104
  offsetFromRoot: (0, devkit_1.offsetFromRoot)(options.e2eProjectRoot),
72
105
  jestPreset,
73
106
  tmpl: '',
@@ -76,6 +109,7 @@ async function e2eProjectGeneratorInternal(host, _options) {
76
109
  (0, devkit_1.generateFiles)(host, path.join(__dirname, 'files/server/nest'), options.e2eProjectRoot, {
77
110
  ...options,
78
111
  ...(0, devkit_1.names)(options.rootProject ? 'server' : options.project),
112
+ tsConfigFile,
79
113
  offsetFromRoot: (0, devkit_1.offsetFromRoot)(options.e2eProjectRoot),
80
114
  tmpl: '',
81
115
  });
@@ -87,11 +121,27 @@ async function e2eProjectGeneratorInternal(host, _options) {
87
121
  ...options,
88
122
  ...(0, devkit_1.names)(options.rootProject ? 'cli' : options.project),
89
123
  mainFile,
124
+ tsConfigFile,
90
125
  offsetFromRoot: (0, devkit_1.offsetFromRoot)(options.e2eProjectRoot),
91
126
  jestPreset,
92
127
  tmpl: '',
93
128
  });
94
129
  }
130
+ if (isUsingTsSolutionConfig) {
131
+ (0, devkit_1.generateFiles)(host, path.join(__dirname, 'files/ts-solution'), options.e2eProjectRoot, {
132
+ ...options,
133
+ relativeProjectReferencePath: (0, posix_1.relative)(options.e2eProjectRoot, appProject.root),
134
+ offsetFromRoot: (0, devkit_1.offsetFromRoot)(options.e2eProjectRoot),
135
+ tmpl: '',
136
+ });
137
+ }
138
+ else {
139
+ (0, devkit_1.generateFiles)(host, path.join(__dirname, 'files/non-ts-solution'), options.e2eProjectRoot, {
140
+ ...options,
141
+ offsetFromRoot: (0, devkit_1.offsetFromRoot)(options.e2eProjectRoot),
142
+ tmpl: '',
143
+ });
144
+ }
95
145
  // axios is more than likely used in the application code, so install it as a regular dependency.
96
146
  const installTask = (0, devkit_1.addDependenciesToPackageJson)(host, { axios: versions_1.axiosVersion }, {});
97
147
  tasks.push(installTask);
@@ -120,6 +170,16 @@ async function e2eProjectGeneratorInternal(host, _options) {
120
170
  if (!options.skipFormat) {
121
171
  await (0, devkit_1.formatFiles)(host);
122
172
  }
173
+ if (isUsingTsSolutionConfig) {
174
+ (0, devkit_1.updateJson)(host, 'tsconfig.json', (json) => {
175
+ json.references ??= [];
176
+ const e2eRef = `./${options.e2eProjectRoot}`;
177
+ if (!json.references.find((ref) => ref.path === e2eRef)) {
178
+ json.references.push({ path: e2eRef });
179
+ }
180
+ return json;
181
+ });
182
+ }
123
183
  tasks.push(() => {
124
184
  (0, log_show_project_command_1.logShowProjectCommand)(options.e2eProjectName);
125
185
  });
@@ -5,7 +5,7 @@ export default {
5
5
  testEnvironment: 'node',
6
6
  transform: {
7
7
  '^.+\\.[tj]s$': ['ts-jest', {
8
- tsconfig: '<rootDir>/tsconfig.spec.json',
8
+ tsconfig: '<rootDir>/<%= tsConfigFile %>',
9
9
  }],
10
10
  },
11
11
  moduleFileExtensions: ['ts', 'js', 'html'],
@@ -7,7 +7,7 @@ export default {
7
7
  testEnvironment: 'node',
8
8
  transform: {
9
9
  '^.+\\.[tj]s$': ['ts-jest', {
10
- tsconfig: '<rootDir>/tsconfig.spec.json',
10
+ tsconfig: '<rootDir>/<%= tsConfigFile %>',
11
11
  }],
12
12
  },
13
13
  moduleFileExtensions: ['ts', 'js', 'html'],
@@ -0,0 +1,16 @@
1
+ {
2
+ "extends": "<%= offsetFromRoot %>tsconfig.base.json",
3
+ "compilerOptions": {
4
+ "outDir": "out-tsc/<%= e2eProjectName %>",
5
+ "esModuleInterop": true,
6
+ "noUnusedLocals": false,
7
+ "noImplicitAny": false
8
+ },
9
+ "include": [
10
+ "jest.config.ts",
11
+ "src/**/*.ts"
12
+ ],
13
+ "references": [
14
+ { "path": "<%= relativeProjectReferencePath %>" }
15
+ ]
16
+ }
@@ -2,7 +2,6 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.initGenerator = initGenerator;
4
4
  const devkit_1 = require("@nx/devkit");
5
- const ts_solution_setup_1 = require("@nx/js/src/utils/typescript/ts-solution-setup");
6
5
  const versions_1 = require("../../utils/versions");
7
6
  function updateDependencies(tree, options) {
8
7
  const tasks = [];
@@ -11,7 +10,6 @@ function updateDependencies(tree, options) {
11
10
  return (0, devkit_1.runTasksInSerial)(...tasks);
12
11
  }
13
12
  async function initGenerator(tree, options) {
14
- (0, ts_solution_setup_1.assertNotUsingTsSolutionSetup)(tree, 'node', 'init');
15
13
  let installTask = () => { };
16
14
  if (!options.skipPackageJson) {
17
15
  installTask = updateDependencies(tree, options);
@@ -0,0 +1,15 @@
1
+ {
2
+ "extends": "./tsconfig.json",
3
+ "compilerOptions": {
4
+ "baseUrl": ".",
5
+ "rootDir": "src",
6
+ "module": "nodenext",
7
+ "moduleResolution": "nodenext",
8
+ "outDir": "dist",
9
+ "tsBuildInfoFile": "dist/tsconfig.lib.tsbuildinfo",
10
+ "emitDeclarationOnly": false,
11
+ "types": ["node"]
12
+ },
13
+ "exclude": ["jest.config.ts", "src/**/*.spec.ts", "src/**/*.test.ts"],
14
+ "include": ["src/**/*.ts"]
15
+ }
@@ -6,6 +6,7 @@ export interface NormalizedSchema extends Schema {
6
6
  projectRoot: string;
7
7
  parsedTags: string[];
8
8
  compiler: 'swc' | 'tsc';
9
+ isUsingTsSolutionConfig: boolean;
9
10
  }
10
11
  export declare function libraryGenerator(tree: Tree, schema: Schema): Promise<GeneratorCallback>;
11
12
  export declare function libraryGeneratorInternal(tree: Tree, schema: Schema): Promise<GeneratorCallback>;
@@ -7,11 +7,12 @@ const project_name_and_root_utils_1 = require("@nx/devkit/src/generators/project
7
7
  const js_1 = require("@nx/js");
8
8
  const add_swc_config_1 = require("@nx/js/src/utils/swc/add-swc-config");
9
9
  const add_swc_dependencies_1 = require("@nx/js/src/utils/swc/add-swc-dependencies");
10
- const ts_solution_setup_1 = require("@nx/js/src/utils/typescript/ts-solution-setup");
11
10
  const path_1 = require("path");
12
11
  const versions_1 = require("../../utils/versions");
13
12
  const init_1 = require("../init/init");
14
13
  const target_defaults_utils_1 = require("@nx/devkit/src/generators/target-defaults-utils");
14
+ const ts_solution_setup_1 = require("@nx/js/src/utils/typescript/ts-solution-setup");
15
+ const get_import_path_1 = require("@nx/js/src/utils/get-import-path");
15
16
  async function libraryGenerator(tree, schema) {
16
17
  return await libraryGeneratorInternal(tree, {
17
18
  addPlugin: false,
@@ -19,33 +20,46 @@ async function libraryGenerator(tree, schema) {
19
20
  });
20
21
  }
21
22
  async function libraryGeneratorInternal(tree, schema) {
22
- (0, ts_solution_setup_1.assertNotUsingTsSolutionSetup)(tree, 'node', 'library');
23
23
  const options = await normalizeOptions(tree, schema);
24
- const tasks = [
25
- await (0, init_1.initGenerator)(tree, {
26
- ...options,
27
- skipFormat: true,
28
- }),
29
- ];
24
+ const tasks = [];
30
25
  if (options.publishable === true && !schema.importPath) {
31
26
  throw new Error(`For publishable libs you have to provide a proper "--importPath" which needs to be a valid npm package name (e.g. my-awesome-lib or @myorg/my-lib)`);
32
27
  }
33
- const libraryInstall = await (0, js_1.libraryGenerator)(tree, {
34
- ...options,
28
+ // Create `package.json` first because @nx/js:lib generator will update it.
29
+ if (options.isUsingTsSolutionConfig ||
30
+ options.publishable ||
31
+ options.buildable) {
32
+ (0, devkit_1.writeJson)(tree, (0, devkit_1.joinPathFragments)(options.projectRoot, 'package.json'), {
33
+ name: (0, get_import_path_1.getImportPath)(tree, options.name),
34
+ version: '0.0.1',
35
+ private: true,
36
+ files: options.publishable ? ['dist', '!**/*.tsbuildinfo'] : undefined,
37
+ });
38
+ }
39
+ tasks.push(await (0, js_1.libraryGenerator)(tree, {
40
+ ...schema,
35
41
  bundler: schema.buildable || schema.publishable ? 'tsc' : 'none',
36
42
  includeBabelRc: schema.babelJest,
37
- importPath: options.importPath,
43
+ importPath: schema.importPath,
38
44
  testEnvironment: 'node',
39
45
  skipFormat: true,
40
- setParserOptionsProject: options.setParserOptionsProject,
41
- });
42
- tasks.push(libraryInstall);
46
+ setParserOptionsProject: schema.setParserOptionsProject,
47
+ useProjectJson: !options.isUsingTsSolutionConfig,
48
+ }));
49
+ tasks.push(await (0, init_1.initGenerator)(tree, {
50
+ ...options,
51
+ skipFormat: true,
52
+ }));
43
53
  createFiles(tree, options);
44
54
  if (options.js) {
45
55
  (0, devkit_1.updateTsConfigsToJs)(tree, options);
46
56
  }
47
57
  updateProject(tree, options);
48
58
  tasks.push(ensureDependencies(tree));
59
+ // Always run install to link packages.
60
+ if (options.isUsingTsSolutionConfig) {
61
+ tasks.push(() => (0, devkit_1.installPackagesTask)(tree, true));
62
+ }
49
63
  if (!schema.skipFormat) {
50
64
  await (0, devkit_1.formatFiles)(tree);
51
65
  }
@@ -77,6 +91,7 @@ async function normalizeOptions(tree, options) {
77
91
  projectRoot,
78
92
  parsedTags,
79
93
  importPath,
94
+ isUsingTsSolutionConfig: (0, ts_solution_setup_1.isUsingTsSolutionSetup)(tree),
80
95
  };
81
96
  }
82
97
  function createFiles(tree, options) {
@@ -92,9 +107,6 @@ function createFiles(tree, options) {
92
107
  if (options.unitTestRunner === 'none') {
93
108
  tree.delete((0, path_1.join)(options.projectRoot, `./src/lib/${options.fileName}.spec.ts`));
94
109
  }
95
- if (!options.publishable && !options.buildable) {
96
- tree.delete((0, path_1.join)(options.projectRoot, 'package.json'));
97
- }
98
110
  if (options.js) {
99
111
  (0, devkit_1.toJS)(tree);
100
112
  }
@@ -107,17 +119,25 @@ function updateProject(tree, options) {
107
119
  const rootProject = options.projectRoot === '.' || options.projectRoot === '';
108
120
  project.targets = project.targets || {};
109
121
  (0, target_defaults_utils_1.addBuildTargetDefaults)(tree, `@nx/js:${options.compiler}`);
110
- project.targets.build = {
111
- executor: `@nx/js:${options.compiler}`,
112
- outputs: ['{options.outputPath}'],
113
- options: {
114
- outputPath: (0, devkit_1.joinPathFragments)('dist', rootProject ? options.projectName : options.projectRoot),
115
- tsConfig: `${options.projectRoot}/tsconfig.lib.json`,
116
- packageJson: `${options.projectRoot}/package.json`,
117
- main: `${options.projectRoot}/src/index` + (options.js ? '.js' : '.ts'),
118
- assets: [`${options.projectRoot}/*.md`],
119
- },
120
- };
122
+ // For TS solution, we want tsc build to be inferred by `@nx/js/typescript` plugin.
123
+ if (!options.isUsingTsSolutionConfig || options.compiler === 'swc') {
124
+ project.targets.build = {
125
+ executor: `@nx/js:${options.compiler}`,
126
+ outputs: ['{options.outputPath}'],
127
+ options: {
128
+ outputPath: options.isUsingTsSolutionConfig
129
+ ? (0, devkit_1.joinPathFragments)(options.projectRoot, 'dist')
130
+ : (0, devkit_1.joinPathFragments)('dist', rootProject ? options.projectName : options.projectRoot),
131
+ tsConfig: `${options.projectRoot}/tsconfig.lib.json`,
132
+ packageJson: `${options.projectRoot}/package.json`,
133
+ main: `${options.projectRoot}/src/index` + (options.js ? '.js' : '.ts'),
134
+ assets: options.isUsingTsSolutionConfig
135
+ ? undefined
136
+ : [`${options.projectRoot}/*.md`],
137
+ stripLeadingPaths: options.isUsingTsSolutionConfig ? true : undefined,
138
+ },
139
+ };
140
+ }
121
141
  if (options.compiler === 'swc') {
122
142
  (0, add_swc_dependencies_1.addSwcDependencies)(tree);
123
143
  (0, add_swc_config_1.addSwcConfig)(tree, options.projectRoot);
@@ -36,14 +36,18 @@
36
36
  "linter": {
37
37
  "description": "The tool to use for running lint checks.",
38
38
  "type": "string",
39
- "enum": ["eslint"],
40
- "default": "eslint"
39
+ "enum": ["eslint", "none"],
40
+ "default": "none",
41
+ "x-prompt": "Which linter would you like to use?",
42
+ "x-priority": "important"
41
43
  },
42
44
  "unitTestRunner": {
43
45
  "type": "string",
44
46
  "enum": ["jest", "none"],
45
47
  "description": "Test runner to use for unit tests.",
46
- "default": "jest"
48
+ "default": "none",
49
+ "x-prompt": "Which unit test runner would you like to use?",
50
+ "x-priority": "important"
47
51
  },
48
52
  "tags": {
49
53
  "type": "string",
@@ -69,7 +73,7 @@
69
73
  },
70
74
  "buildable": {
71
75
  "type": "boolean",
72
- "default": false,
76
+ "default": true,
73
77
  "description": "Generate a buildable library.",
74
78
  "x-priority": "important"
75
79
  },
@@ -1,12 +0,0 @@
1
- {
2
- "extends": "./tsconfig.json",
3
- "compilerOptions": {
4
- "outDir": "<%= offsetFromRoot %>/dist/out-tsc",
5
- "module": "commonjs",
6
- "types": ["jest", "node"]
7
- },
8
- "include": [
9
- "jest.config.ts",
10
- "src/**/*.ts"
11
- ]
12
- }
@@ -1,13 +0,0 @@
1
- {
2
- "extends": "<%= offsetFromRoot %><% if (rootProject) { %>tsconfig.json<% } else { %>tsconfig.base.json<% } %>",
3
- "files": [],
4
- "include": [],
5
- "references": [
6
- {
7
- "path": "./tsconfig.spec.json"
8
- }
9
- ],
10
- "compilerOptions": {
11
- "esModuleInterop": true
12
- }
13
- }
@@ -1,4 +0,0 @@
1
- {
2
- "name": "<%= importPath %>",
3
- "version": "0.0.1"
4
- }