@nx/workspace 23.2.0-beta.7 → 23.2.0-beta.9

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.
@@ -3,7 +3,6 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.convertToInferredGenerator = convertToInferredGenerator;
4
4
  const internal_1 = require("@nx/devkit/internal");
5
5
  const devkit_1 = require("@nx/devkit");
6
- const enquirer_1 = require("enquirer");
7
6
  async function convertToInferredGenerator(tree, options) {
8
7
  const generatorCollectionChoices = await getPossibleConvertToInferredGenerators();
9
8
  if (generatorCollectionChoices.size === 0) {
@@ -23,19 +22,12 @@ async function convertToInferredGenerator(tree, options) {
23
22
  }
24
23
  else {
25
24
  const allChoices = Array.from(generatorCollectionChoices.keys());
26
- generatorsToRun = (await (0, enquirer_1.prompt)({
27
- type: 'multiselect',
28
- name: 'generatorsToRun',
25
+ generatorsToRun = await (0, internal_1.multiselectPrompt)({
29
26
  message: 'Which inference plugin do you want to use?',
30
27
  choices: allChoices,
31
- initial: allChoices,
32
- validate: (result) => {
33
- if (result.length === 0) {
34
- return 'Please select at least one plugin.';
35
- }
36
- return true;
37
- },
38
- })).generatorsToRun;
28
+ initialValues: allChoices,
29
+ required: true,
30
+ });
39
31
  }
40
32
  if (generatorsToRun.length === 0) {
41
33
  devkit_1.output.error({
@@ -3,7 +3,8 @@
3
3
  <% if(cliCommand === 'ng') { %>
4
4
  "angular.ng-template",<% }
5
5
  %>
6
- "nrwl.angular-console",
7
- "esbenp.prettier-vscode"
6
+ "nrwl.angular-console"<% if(formatter === 'prettier') { %>,
7
+ "esbenp.prettier-vscode"<% } %><% if(formatter === 'oxfmt') { %>,
8
+ "oxc.oxc-vscode"<% } %>
8
9
  ]
9
10
  }
@@ -89,6 +89,7 @@ function generatePreset(host, opts) {
89
89
  : null,
90
90
  opts.nxCloudToken ? `--nxCloudToken=${opts.nxCloudToken}` : null,
91
91
  opts.formatter ? `--formatter=${opts.formatter}` : null,
92
+ opts.skipInstall ? `--skipInstall` : null,
92
93
  opts.workspaces !== false ? `--workspaces` : `--no-workspaces`,
93
94
  opts.useProjectJson ? `--useProjectJson` : null,
94
95
  ].filter((e) => !!e);
@@ -99,8 +100,9 @@ function generatePreset(host, opts) {
99
100
  // `typescript: >3.0.0` peer to 7.x, whose entry point dropped the compiler API.
100
101
  function getPresetDependencies({ preset, presetVersion, bundler, e2eTestRunner, js, }) {
101
102
  switch (preset) {
102
- // Empty workspaces — no preset generator runs, so `@nx/js:init` never adds
103
- // typescript and pinning it here would be net-new.
103
+ // These generate no project, so `@nx/js:init` never runs to add typescript
104
+ // and pinning it here would be net-new. The preset generator itself does
105
+ // run - it sets up the chosen formatter.
104
106
  case presets_1.Preset.Apps:
105
107
  case presets_1.Preset.NPM:
106
108
  return { dependencies: {}, dev: { '@nx/js': versions_1.nxVersion } };
@@ -8,7 +8,6 @@ const semver_1 = require("semver");
8
8
  const default_base_1 = require("../../utilities/default-base");
9
9
  const versions_1 = require("../../utils/versions");
10
10
  const presets_1 = require("../utils/presets");
11
- const internal_2 = require("@nx/devkit/internal");
12
11
  // map from the preset to the name of the plugin s.t. the README can have a more
13
12
  // meaningful generator command.
14
13
  const presetToPluginMap = {
@@ -135,7 +134,7 @@ async function generateWorkspaceFiles(tree, options) {
135
134
  await createReadme(tree, options, token);
136
135
  let aiAgentsCallback = undefined;
137
136
  if (options.aiAgents && options.aiAgents.length > 0) {
138
- aiAgentsCallback = await (0, internal_2.setupAiAgentsGenerator)(tree, {
137
+ aiAgentsCallback = await (0, internal_1.setupAiAgentsGenerator)(tree, {
139
138
  directory: options.directory,
140
139
  writeNxCloudRules: options.nxCloud !== 'skip',
141
140
  packageVersion: 'latest',
@@ -228,6 +227,10 @@ function createFiles(tree, options) {
228
227
  ...options,
229
228
  nxVersion: versions_1.nxVersion,
230
229
  packageManager: options.packageManager,
230
+ // After the spread and always defined: `formatter` is optional on the
231
+ // schema, and EJS throws a ReferenceError on a key that is absent rather
232
+ // than treating it as undefined.
233
+ formatter: options.formatter ?? 'none',
231
234
  });
232
235
  }
233
236
  async function createReadme(tree, { name, appName, directory, preset, nxCloud, workspaces }, nxCloudToken) {
@@ -28,7 +28,7 @@ interface Schema {
28
28
  useGitHub?: boolean;
29
29
  nxCloud?: 'yes' | 'skip' | 'circleci' | 'github';
30
30
  analytics?: boolean;
31
- formatter?: string;
31
+ formatter?: 'none' | 'prettier' | 'oxfmt';
32
32
  workspaces?: boolean;
33
33
  workspaceGlobs?: string | string[];
34
34
  useProjectJson?: boolean;
@@ -27,7 +27,16 @@ async function newGenerator(tree, opts) {
27
27
  (0, devkit_1.installPackagesTask)(tree, false, options.directory, options.packageManager);
28
28
  }
29
29
  // TODO: move all of these into create-nx-workspace
30
- if (options.preset !== presets_1.Preset.NPM && !options.isCustomPreset) {
30
+ // The npm preset normally skips the preset generator entirely, which is why
31
+ // `--formatter` used to be dropped for it. Run it when there is a formatter
32
+ // to set up. `schema.json` defaults to `none`, so this fork is taken only
33
+ // when a formatter was actually asked for, which on this preset means an
34
+ // explicit `--formatter`.
35
+ const npmPresetNeedsFormatter = options.preset === presets_1.Preset.NPM &&
36
+ !!options.formatter &&
37
+ options.formatter !== 'none';
38
+ if ((options.preset !== presets_1.Preset.NPM || npmPresetNeedsFormatter) &&
39
+ !options.isCustomPreset) {
31
40
  await (0, generate_preset_1.generatePreset)(tree, options);
32
41
  }
33
42
  // if we move this into create-nx-workspace, we can also easily log things out like nx console install success
@@ -99,6 +99,7 @@
99
99
  "formatter": {
100
100
  "description": "The tool to use for code formatting.",
101
101
  "type": "string",
102
+ "enum": ["none", "prettier", "oxfmt"],
102
103
  "default": "none"
103
104
  },
104
105
  "workspaces": {
@@ -17,8 +17,28 @@ async function createPreset(tree, options) {
17
17
  const nxJson = (0, devkit_1.readNxJson)(tree);
18
18
  const addPlugin = process.env.NX_ADD_PLUGINS !== 'false' &&
19
19
  nxJson.useInferencePlugins !== false;
20
- if (options.preset === presets_1.Preset.Apps) {
21
- return;
20
+ if (options.preset === presets_1.Preset.Apps || options.preset === presets_1.Preset.NPM) {
21
+ // These presets generate no project, so nothing downstream would set the
22
+ // formatter up and the choice would be dropped. Only the formatter is
23
+ // configured here - `@nx/js:init` would also add TypeScript and register
24
+ // its plugin, which both presets deliberately leave out.
25
+ //
26
+ // `@nx/js` is only in the new workspace's package.json, not necessarily on
27
+ // disk. `validateOptions` allows `skipInstall` with these presets, so the
28
+ // require has to be reached only when there is a formatter to set up AND
29
+ // the install that puts `@nx/js` there actually ran.
30
+ if (!options.formatter || options.formatter === 'none') {
31
+ return;
32
+ }
33
+ if (options.skipInstall) {
34
+ // No follow-up command to name: `@nx/js:init` is what sets a formatter
35
+ // up, and running it here is what the comment above rules out for these
36
+ // presets.
37
+ devkit_1.logger.warn(`Skipped ${options.formatter} setup: it lives in @nx/js, which --skipInstall leaves uninstalled.`);
38
+ return;
39
+ }
40
+ const { setUpFormatter } = require('@nx' + '/js');
41
+ return setUpFormatter(tree, options.formatter);
22
42
  }
23
43
  else if (options.preset === presets_1.Preset.AngularMonorepo) {
24
44
  const { applicationGenerator: angularApplicationGenerator } = require('@nx' + '/angular/generators');
@@ -39,6 +59,7 @@ async function createPreset(tree, options) {
39
59
  ssr: options.ssr,
40
60
  prefix: options.prefix,
41
61
  zoneless: options.zoneless,
62
+ formatter: options.formatter,
42
63
  nxCloudToken: options.nxCloudToken,
43
64
  });
44
65
  }
@@ -62,6 +83,7 @@ async function createPreset(tree, options) {
62
83
  ssr: options.ssr,
63
84
  prefix: options.prefix,
64
85
  zoneless: options.zoneless,
86
+ formatter: options.formatter,
65
87
  nxCloudToken: options.nxCloudToken,
66
88
  });
67
89
  }
@@ -132,6 +154,7 @@ async function createPreset(tree, options) {
132
154
  unitTestRunner: options.unitTestRunner ?? 'vitest',
133
155
  addPlugin,
134
156
  nxCloudToken: options.nxCloudToken,
157
+ formatter: options.formatter,
135
158
  });
136
159
  }
137
160
  else if (options.preset === presets_1.Preset.Nuxt) {
@@ -162,6 +185,7 @@ async function createPreset(tree, options) {
162
185
  unitTestRunner: options.unitTestRunner ?? 'vitest',
163
186
  addPlugin,
164
187
  nxCloudToken: options.nxCloudToken,
188
+ formatter: options.formatter,
165
189
  });
166
190
  }
167
191
  else if (options.preset === presets_1.Preset.NextJs) {
@@ -208,6 +232,7 @@ async function createPreset(tree, options) {
208
232
  e2eTestRunner: options.e2eTestRunner ?? 'playwright',
209
233
  addPlugin,
210
234
  nxCloudToken: options.nxCloudToken,
235
+ formatter: options.formatter,
211
236
  });
212
237
  }
213
238
  else if (options.preset === presets_1.Preset.Nest) {
@@ -271,9 +296,17 @@ async function createPreset(tree, options) {
271
296
  }
272
297
  else if (options.preset === presets_1.Preset.TS) {
273
298
  const { initGenerator } = require('@nx' + '/js');
299
+ // `validateOptions` allows `skipInstall` here, and this run must then stay
300
+ // install-free: `skipPackageJson` gates both `ensurePackage` and the
301
+ // package.json write that would make `installPackagesTask` install, and
302
+ // `skipFormat` keeps `formatFiles` from loading the formatter. The
303
+ // formatter config is still written, so detection restores the dependency
304
+ // on the next `@nx/js:init`-running generator.
274
305
  return initGenerator(tree, {
275
306
  formatter: options.formatter,
276
307
  addTsPlugin: process.env.NX_ADD_PLUGINS !== 'false' && options.workspaces,
308
+ skipPackageJson: options.skipInstall,
309
+ skipFormat: options.skipInstall,
277
310
  });
278
311
  }
279
312
  else if (options.preset === presets_1.Preset.TsStandalone) {
@@ -290,6 +323,7 @@ async function createPreset(tree, options) {
290
323
  js: options.js,
291
324
  rootProject: true,
292
325
  addPlugin,
326
+ formatter: options.formatter,
293
327
  });
294
328
  }
295
329
  else if (options.preset === presets_1.Preset.NodeStandalone) {
@@ -306,6 +340,7 @@ async function createPreset(tree, options) {
306
340
  e2eTestRunner: options.e2eTestRunner ?? 'jest',
307
341
  unitTestRunner: options.unitTestRunner,
308
342
  addPlugin,
343
+ formatter: options.formatter,
309
344
  });
310
345
  }
311
346
  else if (options.preset === presets_1.Preset.NodeMonorepo) {
@@ -6,7 +6,8 @@ export interface Schema {
6
6
  preset: Preset;
7
7
  style?: string;
8
8
  linter?: string;
9
- formatter?: string;
9
+ formatter?: 'none' | 'prettier' | 'oxfmt';
10
+ skipInstall?: boolean;
10
11
  workspaces?: boolean;
11
12
  framework?: string;
12
13
  packageManager?: string;
@@ -103,9 +103,15 @@
103
103
  "description": "Generate an application that does not use 'zone.js'.",
104
104
  "type": "boolean"
105
105
  },
106
+ "skipInstall": {
107
+ "description": "Skip installing dependencies. Formatter setup needs @nx/js on disk, so it is skipped too.",
108
+ "type": "boolean",
109
+ "default": false
110
+ },
106
111
  "formatter": {
107
112
  "description": "The tool to use for code formatting.",
108
113
  "type": "string",
114
+ "enum": ["none", "prettier", "oxfmt"],
109
115
  "default": "none"
110
116
  },
111
117
  "workspaces": {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@nx/workspace",
3
- "version": "23.2.0-beta.7",
3
+ "version": "23.2.0-beta.9",
4
4
  "private": false,
5
5
  "type": "commonjs",
6
6
  "files": [
@@ -80,16 +80,15 @@
80
80
  "dependencies": {
81
81
  "@zkochan/js-yaml": "0.0.7",
82
82
  "chalk": "^4.1.0",
83
- "enquirer": "~2.3.6",
84
83
  "picomatch": "4.0.4",
85
84
  "semver": "^7.6.3",
86
85
  "tslib": "^2.3.0",
87
86
  "yargs-parser": "21.1.1",
88
- "nx": "23.2.0-beta.7",
89
- "@nx/devkit": "23.2.0-beta.7"
87
+ "nx": "23.2.0-beta.9",
88
+ "@nx/devkit": "23.2.0-beta.9"
90
89
  },
91
90
  "devDependencies": {
92
- "nx": "23.2.0-beta.7"
91
+ "nx": "23.2.0-beta.9"
93
92
  },
94
93
  "publishConfig": {
95
94
  "access": "public"