nx 17.3.0-rc.1 → 17.3.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.
Files changed (47) hide show
  1. package/bin/run-executor.js +1 -1
  2. package/package.json +12 -12
  3. package/src/adapter/compat.d.ts +1 -1
  4. package/src/adapter/compat.js +1 -0
  5. package/src/command-line/affected/command-object.d.ts +4 -4
  6. package/src/command-line/affected/command-object.js +4 -4
  7. package/src/command-line/graph/graph.js +1 -1
  8. package/src/command-line/release/publish.d.ts +1 -1
  9. package/src/command-line/release/publish.js +24 -19
  10. package/src/command-line/report/report.js +1 -1
  11. package/src/command-line/run/run.js +21 -7
  12. package/src/config/project-graph.d.ts +2 -2
  13. package/src/config/workspaces.d.ts +1 -1
  14. package/src/config/workspaces.js +2 -2
  15. package/src/core/graph/main.js +1 -1
  16. package/src/core/graph/polyfills.js +1 -1
  17. package/src/core/graph/styles.css +1 -1
  18. package/src/daemon/client/client.js +1 -1
  19. package/src/devkit-exports.js +1 -1
  20. package/src/executors/run-script/run-script.impl.js +2 -6
  21. package/src/generators/utils/project-configuration.js +2 -2
  22. package/src/hasher/hash-task.js +1 -1
  23. package/src/hasher/task-hasher.d.ts +4 -4
  24. package/src/nx-cloud/generators/connect-to-nx-cloud/schema.json +1 -1
  25. package/src/plugins/js/project-graph/build-dependencies/strip-source-code.d.ts +1 -1
  26. package/src/plugins/js/project-graph/build-dependencies/strip-source-code.js +1 -1
  27. package/src/plugins/js/project-graph/build-dependencies/typescript-import-locator.d.ts +1 -1
  28. package/src/plugins/js/project-graph/build-dependencies/typescript-import-locator.js +1 -1
  29. package/src/plugins/js/utils/register.d.ts +1 -1
  30. package/src/plugins/js/utils/register.js +2 -0
  31. package/src/project-graph/file-utils.d.ts +1 -1
  32. package/src/project-graph/file-utils.js +2 -2
  33. package/src/project-graph/nx-deps-cache.js +1 -1
  34. package/src/project-graph/project-graph-builder.d.ts +1 -1
  35. package/src/project-graph/project-graph-builder.js +1 -1
  36. package/src/project-graph/utils/normalize-project-nodes.js +0 -21
  37. package/src/project-graph/utils/project-configuration-utils.d.ts +1 -1
  38. package/src/project-graph/utils/project-configuration-utils.js +56 -21
  39. package/src/tasks-runner/create-task-graph.js +1 -1
  40. package/src/tasks-runner/init-tasks-runner.js +1 -1
  41. package/src/tasks-runner/run-command.js +4 -4
  42. package/src/tasks-runner/task-env.js +1 -2
  43. package/src/tasks-runner/utils.d.ts +1 -1
  44. package/src/utils/nx-plugin.deprecated.d.ts +6 -6
  45. package/src/utils/nx-plugin.deprecated.js +1 -1
  46. package/src/utils/typescript.js +1 -1
  47. package/src/utils/workspace-configuration-check.js +1 -1
@@ -60,7 +60,7 @@ process.on('message', async (message) => {
60
60
  process.exit(statusCode);
61
61
  }
62
62
  catch (e) {
63
- console.error(`Could not find 'nx' module in this workspace.`, e);
63
+ console.error(e);
64
64
  process.exit(1);
65
65
  }
66
66
  });
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "nx",
3
- "version": "17.3.0-rc.1",
3
+ "version": "17.3.1",
4
4
  "private": false,
5
5
  "description": "The core Nx plugin contains the core functionality of Nx like the project graph, nx commands and task orchestration.",
6
6
  "repository": {
@@ -66,7 +66,7 @@
66
66
  "yargs-parser": "21.1.1",
67
67
  "node-machine-id": "1.1.12",
68
68
  "ora": "5.3.0",
69
- "@nrwl/tao": "17.3.0-rc.1"
69
+ "@nrwl/tao": "17.3.1"
70
70
  },
71
71
  "peerDependencies": {
72
72
  "@swc-node/register": "^1.6.7",
@@ -81,16 +81,16 @@
81
81
  }
82
82
  },
83
83
  "optionalDependencies": {
84
- "@nx/nx-darwin-x64": "17.3.0-rc.1",
85
- "@nx/nx-darwin-arm64": "17.3.0-rc.1",
86
- "@nx/nx-linux-x64-gnu": "17.3.0-rc.1",
87
- "@nx/nx-linux-x64-musl": "17.3.0-rc.1",
88
- "@nx/nx-win32-x64-msvc": "17.3.0-rc.1",
89
- "@nx/nx-linux-arm64-gnu": "17.3.0-rc.1",
90
- "@nx/nx-linux-arm64-musl": "17.3.0-rc.1",
91
- "@nx/nx-linux-arm-gnueabihf": "17.3.0-rc.1",
92
- "@nx/nx-win32-arm64-msvc": "17.3.0-rc.1",
93
- "@nx/nx-freebsd-x64": "17.3.0-rc.1"
84
+ "@nx/nx-darwin-x64": "17.3.1",
85
+ "@nx/nx-darwin-arm64": "17.3.1",
86
+ "@nx/nx-linux-x64-gnu": "17.3.1",
87
+ "@nx/nx-linux-x64-musl": "17.3.1",
88
+ "@nx/nx-win32-x64-msvc": "17.3.1",
89
+ "@nx/nx-linux-arm64-gnu": "17.3.1",
90
+ "@nx/nx-linux-arm64-musl": "17.3.1",
91
+ "@nx/nx-linux-arm-gnueabihf": "17.3.1",
92
+ "@nx/nx-win32-arm64-msvc": "17.3.1",
93
+ "@nx/nx-freebsd-x64": "17.3.1"
94
94
  },
95
95
  "nx-migrations": {
96
96
  "migrations": "./migrations.json",
@@ -1,2 +1,2 @@
1
- export declare const allowedProjectExtensions: readonly ["tags", "implicitDependencies", "configFilePath", "$schema", "generators", "namedInputs", "name", "files", "root", "sourceRoot", "projectType", "release"];
1
+ export declare const allowedProjectExtensions: readonly ["tags", "implicitDependencies", "configFilePath", "$schema", "generators", "namedInputs", "name", "files", "root", "sourceRoot", "projectType", "release", "includedScripts"];
2
2
  export declare const allowedWorkspaceExtensions: readonly ["implicitDependencies", "affected", "tasksRunnerOptions", "workspaceLayout", "plugins", "targetDefaults", "files", "generators", "namedInputs", "extends", "cli", "pluginsConfig", "defaultProject", "installation", "release", "nxCloudAccessToken", "nxCloudUrl", "nxCloudEncryptionKey", "parallel", "cacheDirectory", "useDaemonProcess"];
@@ -27,6 +27,7 @@ exports.allowedProjectExtensions = [
27
27
  'sourceRoot',
28
28
  'projectType',
29
29
  'release',
30
+ 'includedScripts',
30
31
  ];
31
32
  // If we pass props on the workspace that angular doesn't know about,
32
33
  // it throws a warning that users see. We want to pass them still,
@@ -4,13 +4,13 @@ export declare const yargsAffectedTestCommand: CommandModule;
4
4
  export declare const yargsAffectedBuildCommand: CommandModule;
5
5
  export declare const yargsAffectedLintCommand: CommandModule;
6
6
  export declare const yargsAffectedE2ECommand: CommandModule;
7
- export declare const affectedGraphDeprecationMessage = "Use `nx graph --affected`, or `nx affected --graph` instead depending on which best suits your use case. The `affected:graph` command will be removed in Nx 18.";
7
+ export declare const affectedGraphDeprecationMessage = "Use `nx graph --affected`, or `nx affected --graph` instead depending on which best suits your use case. The `affected:graph` command will be removed in Nx 19.";
8
8
  /**
9
- * @deprecated 'Use `nx graph --affected`, or` nx affected --graph` instead depending on which best suits your use case. The `affected:graph` command will be removed in Nx 18.'
9
+ * @deprecated 'Use `nx graph --affected`, or` nx affected --graph` instead depending on which best suits your use case. The `affected:graph` command will be removed in Nx 19.'
10
10
  */
11
11
  export declare const yargsAffectedGraphCommand: CommandModule;
12
- export declare const printAffectedDeprecationMessage = "Use `nx show projects --affected`, `nx affected --graph -t build` or `nx graph --affected` depending on which best suits your use case. The `print-affected` command will be removed in Nx 18.";
12
+ export declare const printAffectedDeprecationMessage = "Use `nx show projects --affected`, `nx affected --graph -t build` or `nx graph --affected` depending on which best suits your use case. The `print-affected` command will be removed in Nx 19.";
13
13
  /**
14
- * @deprecated 'Use `nx show --affected`, `nx affected --graph` or `nx graph --affected` depending on which best suits your use case. The `print-affected` command will be removed in Nx 18.'
14
+ * @deprecated 'Use `nx show --affected`, `nx affected --graph` or `nx graph --affected` depending on which best suits your use case. The `print-affected` command will be removed in Nx 19.'
15
15
  */
16
16
  export declare const yargsPrintAffectedCommand: CommandModule;
@@ -54,9 +54,9 @@ exports.yargsAffectedE2ECommand = {
54
54
  target: 'e2e',
55
55
  }),
56
56
  };
57
- exports.affectedGraphDeprecationMessage = 'Use `nx graph --affected`, or `nx affected --graph` instead depending on which best suits your use case. The `affected:graph` command will be removed in Nx 18.';
57
+ exports.affectedGraphDeprecationMessage = 'Use `nx graph --affected`, or `nx affected --graph` instead depending on which best suits your use case. The `affected:graph` command will be removed in Nx 19.';
58
58
  /**
59
- * @deprecated 'Use `nx graph --affected`, or` nx affected --graph` instead depending on which best suits your use case. The `affected:graph` command will be removed in Nx 18.'
59
+ * @deprecated 'Use `nx graph --affected`, or` nx affected --graph` instead depending on which best suits your use case. The `affected:graph` command will be removed in Nx 19.'
60
60
  */
61
61
  exports.yargsAffectedGraphCommand = {
62
62
  command: 'affected:graph',
@@ -68,9 +68,9 @@ exports.yargsAffectedGraphCommand = {
68
68
  }),
69
69
  deprecated: exports.affectedGraphDeprecationMessage,
70
70
  };
71
- exports.printAffectedDeprecationMessage = 'Use `nx show projects --affected`, `nx affected --graph -t build` or `nx graph --affected` depending on which best suits your use case. The `print-affected` command will be removed in Nx 18.';
71
+ exports.printAffectedDeprecationMessage = 'Use `nx show projects --affected`, `nx affected --graph -t build` or `nx graph --affected` depending on which best suits your use case. The `print-affected` command will be removed in Nx 19.';
72
72
  /**
73
- * @deprecated 'Use `nx show --affected`, `nx affected --graph` or `nx graph --affected` depending on which best suits your use case. The `print-affected` command will be removed in Nx 18.'
73
+ * @deprecated 'Use `nx show --affected`, `nx affected --graph` or `nx graph --affected` depending on which best suits your use case. The `print-affected` command will be removed in Nx 19.'
74
74
  */
75
75
  exports.yargsPrintAffectedCommand = {
76
76
  command: 'print-affected',
@@ -244,7 +244,7 @@ async function generateGraph(args, affectedProjects) {
244
244
  '- affectedProjects',
245
245
  '- criticalPath',
246
246
  '',
247
- 'These fields will be removed in Nx 18. If you need to see which projects were affected, use `nx show projects --affected`.',
247
+ 'These fields will be removed in Nx 19. If you need to see which projects were affected, use `nx show projects --affected`.',
248
248
  ],
249
249
  });
250
250
  output_1.output.success({
@@ -5,4 +5,4 @@ export declare const releasePublishCLIHandler: (args: PublishOptions) => Promise
5
5
  * of Nx. We intentionally do not wrap the implementation with handleErrors because users need
6
6
  * to have control over their own error handling when using the API.
7
7
  */
8
- export declare function releasePublish(args: PublishOptions, isCLI?: boolean): Promise<void>;
8
+ export declare function releasePublish(args: PublishOptions, isCLI?: boolean): Promise<number>;
@@ -48,25 +48,32 @@ async function releasePublish(args, isCLI = false) {
48
48
  * for dependencies, because that could cause projects outset of the filtered set to be published.
49
49
  */
50
50
  const shouldExcludeTaskDependencies = _args.projects?.length > 0 || _args.groups?.length > 0;
51
+ let overallExitStatus = 0;
51
52
  if (args.projects?.length) {
52
53
  /**
53
54
  * Run publishing for all remaining release groups and filtered projects within them
54
55
  */
55
56
  for (const releaseGroup of releaseGroups) {
56
- await runPublishOnProjects(_args, projectGraph, nxJson, Array.from(releaseGroupToFilteredProjects.get(releaseGroup)), shouldExcludeTaskDependencies, isCLI);
57
+ const status = await runPublishOnProjects(_args, projectGraph, nxJson, Array.from(releaseGroupToFilteredProjects.get(releaseGroup)), shouldExcludeTaskDependencies, isCLI);
58
+ if (status !== 0) {
59
+ overallExitStatus = status || 1;
60
+ }
57
61
  }
58
- return process.exit(0);
62
+ return overallExitStatus;
59
63
  }
60
64
  /**
61
65
  * Run publishing for all remaining release groups
62
66
  */
63
67
  for (const releaseGroup of releaseGroups) {
64
- await runPublishOnProjects(_args, projectGraph, nxJson, releaseGroup.projects, shouldExcludeTaskDependencies, isCLI);
68
+ const status = await runPublishOnProjects(_args, projectGraph, nxJson, releaseGroup.projects, shouldExcludeTaskDependencies, isCLI);
69
+ if (status !== 0) {
70
+ overallExitStatus = status || 1;
71
+ }
65
72
  }
66
73
  if (_args.dryRun) {
67
74
  logger_1.logger.warn(`\nNOTE: The "dryRun" flag means no projects were actually published.`);
68
75
  }
69
- process.exit(0);
76
+ return overallExitStatus;
70
77
  }
71
78
  exports.releasePublish = releasePublish;
72
79
  async function runPublishOnProjects(args, projectGraph, nxJson, projectNames, shouldExcludeTaskDependencies, isCLI) {
@@ -99,7 +106,7 @@ async function runPublishOnProjects(args, projectGraph, nxJson, projectNames, sh
99
106
  if (args.graph) {
100
107
  const file = (0, command_line_utils_1.readGraphFileFromGraphArg)(args);
101
108
  const projectNames = projectsToRun.map((t) => t.name);
102
- return await (0, graph_1.generateGraph)({
109
+ await (0, graph_1.generateGraph)({
103
110
  watch: false,
104
111
  all: false,
105
112
  open: true,
@@ -108,12 +115,21 @@ async function runPublishOnProjects(args, projectGraph, nxJson, projectNames, sh
108
115
  projects: projectNames,
109
116
  file,
110
117
  }, projectNames);
118
+ return 0;
119
+ }
120
+ const requiredTargetName = 'nx-release-publish';
121
+ const projectsWithTarget = projectsToRun.filter((project) => (0, project_graph_utils_1.projectHasTarget)(project, requiredTargetName));
122
+ if (projectsWithTarget.length === 0) {
123
+ throw new Error(`Based on your config, the following projects were matched for publishing but do not have the "${requiredTargetName}" target specified:\n${[
124
+ ...projectsToRun.map((p) => `- ${p.name}`),
125
+ '',
126
+ `This is usually caused by not having an appropriate plugin, such as "@nx/js" installed, which will add the appropriate "${requiredTargetName}" target for you automatically.`,
127
+ ].join('\n')}\n`);
111
128
  }
112
- ensureAllProjectsHaveTarget(projectsToRun);
113
129
  /**
114
130
  * Run the relevant nx-release-publish executor on each of the selected projects.
115
131
  */
116
- const status = await (0, run_command_1.runCommand)(projectsToRun, projectGraph, { nxJson }, {
132
+ const status = await (0, run_command_1.runCommand)(projectsWithTarget, projectGraph, { nxJson }, {
117
133
  targets,
118
134
  outputStyle: 'static',
119
135
  ...args,
@@ -129,16 +145,5 @@ async function runPublishOnProjects(args, projectGraph, nxJson, projectNames, sh
129
145
  // Throw an additional error for programmatic API usage
130
146
  throw new Error('One or more of the selected projects could not be published');
131
147
  }
132
- }
133
- function ensureAllProjectsHaveTarget(projectsToRun) {
134
- const requiredTargetName = 'nx-release-publish';
135
- const projectsMissingTarget = projectsToRun.filter((project) => !(0, project_graph_utils_1.projectHasTarget)(project, requiredTargetName));
136
- if (projectsMissingTarget.length === 0) {
137
- return;
138
- }
139
- throw new Error(`Based on your config, the following projects were matched for publishing but do not have the "${requiredTargetName}" target specified:\n${[
140
- ...projectsMissingTarget.map((p) => `- ${p.name}`),
141
- '',
142
- 'There are a few possible reasons for this: (1) The projects may be private (2) You may not have an appropriate plugin (such as `@nx/js`) installed which adds the target automatically to public projects (3) You intended to configure the target manually, or exclude those projects via config in nx.json',
143
- ].join('\n')}\n`);
148
+ return 0;
144
149
  }
@@ -180,7 +180,7 @@ function findInstalledCommunityPlugins() {
180
180
  exports.findInstalledCommunityPlugins = findInstalledCommunityPlugins;
181
181
  function findInstalledPackagesWeCareAbout() {
182
182
  const packagesWeMayCareAbout = {};
183
- // TODO (v18): Remove workaround for hiding @nrwl packages when matching @nx package is found.
183
+ // TODO (v19): Remove workaround for hiding @nrwl packages when matching @nx package is found.
184
184
  const packageChangeMap = {
185
185
  '@nrwl/nx-plugin': '@nx/plugin',
186
186
  '@nx/plugin': '@nrwl/nx-plugin',
@@ -7,8 +7,10 @@ const path_1 = require("path");
7
7
  const serialize_overrides_into_command_line_1 = require("../../utils/serialize-overrides-into-command-line");
8
8
  const project_graph_1 = require("../../project-graph/project-graph");
9
9
  const configuration_1 = require("../../config/configuration");
10
+ const native_1 = require("../../native");
10
11
  const async_iterator_1 = require("../../utils/async-iterator");
11
12
  const executor_utils_1 = require("./executor-utils");
13
+ const child_process_1 = require("../../utils/child-process");
12
14
  function printRunHelp(opts, schema, plugin) {
13
15
  (0, print_help_1.printHelp)(`run ${opts.project}:${opts.target}`, schema, {
14
16
  mode: 'run',
@@ -45,7 +47,7 @@ async function iteratorToProcessStatusCode(i) {
45
47
  clearInterval(keepProcessAliveInterval);
46
48
  }
47
49
  }
48
- async function parseExecutorAndTarget({ project, target, configuration }, root, projectsConfigurations, nxJsonConfiguration) {
50
+ async function parseExecutorAndTarget({ project, target }, root, projectsConfigurations) {
49
51
  const proj = projectsConfigurations.projects[project];
50
52
  const targetConfig = proj.targets?.[target];
51
53
  if (!targetConfig) {
@@ -55,17 +57,30 @@ async function parseExecutorAndTarget({ project, target, configuration }, root,
55
57
  const { schema, implementationFactory } = (0, executor_utils_1.getExecutorInformation)(nodeModule, executor, root, projectsConfigurations.projects);
56
58
  return { executor, implementationFactory, nodeModule, schema, targetConfig };
57
59
  }
58
- async function printTargetRunHelpInternal({ project, target, configuration }, root, projectsConfigurations, nxJsonConfiguration) {
59
- const { executor, nodeModule, schema } = await parseExecutorAndTarget({ project, target, configuration }, root, projectsConfigurations, nxJsonConfiguration);
60
+ async function printTargetRunHelpInternal({ project, target }, root, projectsConfigurations) {
61
+ const { executor, nodeModule, schema, targetConfig } = await parseExecutorAndTarget({ project, target }, root, projectsConfigurations);
60
62
  printRunHelp({ project, target }, schema, {
61
63
  plugin: nodeModule,
62
64
  entity: executor,
63
65
  });
64
- process.exit(0);
66
+ if (nodeModule === 'nx' &&
67
+ executor === 'run-commands' &&
68
+ targetConfig.options.command) {
69
+ const command = targetConfig.options.command.split(' ')[0];
70
+ await new Promise(() => {
71
+ const cp = new child_process_1.PseudoTtyProcess((0, native_1.runCommand)(`${command} --help`));
72
+ cp.onExit((code) => {
73
+ process.exit(code);
74
+ });
75
+ });
76
+ }
77
+ else {
78
+ process.exit(0);
79
+ }
65
80
  }
66
81
  async function runExecutorInternal({ project, target, configuration }, overrides, root, cwd, projectsConfigurations, nxJsonConfiguration, projectGraph, taskGraph, isVerbose) {
67
82
  validateProject(projectsConfigurations, project);
68
- const { executor, implementationFactory, nodeModule, schema, targetConfig } = await parseExecutorAndTarget({ project, target, configuration }, root, projectsConfigurations, nxJsonConfiguration);
83
+ const { executor, implementationFactory, nodeModule, schema, targetConfig } = await parseExecutorAndTarget({ project, target, configuration }, root, projectsConfigurations);
69
84
  configuration ??= targetConfig.defaultConfiguration;
70
85
  const combinedOptions = (0, params_1.combineOptionsForExecutor)(overrides, configuration, targetConfig, schema, project, (0, path_1.relative)(root, cwd), isVerbose);
71
86
  if ((0, executor_utils_1.getExecutorInformation)(nodeModule, executor, root, projectsConfigurations.projects).isNxExecutor) {
@@ -143,8 +158,7 @@ function printTargetRunHelp(targetDescription, root) {
143
158
  const projectGraph = (0, project_graph_1.readCachedProjectGraph)();
144
159
  return (0, params_1.handleErrors)(false, async () => {
145
160
  const projectsConfigurations = (0, project_graph_1.readProjectsConfigurationFromProjectGraph)(projectGraph);
146
- const nxJsonConfiguration = (0, configuration_1.readNxJson)();
147
- printTargetRunHelpInternal(targetDescription, root, projectsConfigurations, nxJsonConfiguration);
161
+ await printTargetRunHelpInternal(targetDescription, root, projectsConfigurations);
148
162
  });
149
163
  }
150
164
  exports.printTargetRunHelp = printTargetRunHelp;
@@ -111,7 +111,7 @@ export interface ProjectGraphDependency {
111
111
  }
112
112
  /**
113
113
  * Additional information to be used to process a project graph
114
- * @deprecated The {@link ProjectGraphProcessor} is deprecated. This will be removed in Nx 18.
114
+ * @deprecated The {@link ProjectGraphProcessor} is deprecated. This will be removed in Nx 19.
115
115
  */
116
116
  export interface ProjectGraphProcessorContext {
117
117
  /**
@@ -132,6 +132,6 @@ export interface ProjectGraphProcessorContext {
132
132
  }
133
133
  /**
134
134
  * A function that produces an updated ProjectGraph
135
- * @deprecated Use {@link CreateNodes} and {@link CreateDependencies} instead. This will be removed in Nx 18.
135
+ * @deprecated Use {@link CreateNodes} and {@link CreateDependencies} instead. This will be removed in Nx 19.
136
136
  */
137
137
  export type ProjectGraphProcessor = (currentGraph: ProjectGraph, context: ProjectGraphProcessorContext) => ProjectGraph | Promise<ProjectGraph>;
@@ -1,7 +1,7 @@
1
1
  import type { NxJsonConfiguration } from './nx-json';
2
2
  import { ProjectsConfigurations } from './workspace-json-project-json';
3
3
  /**
4
- * @deprecated This will be removed in v18. Use {@link readProjectsConfigurationFromProjectGraph} instead.
4
+ * @deprecated This will be removed in v19. Use {@link readProjectsConfigurationFromProjectGraph} instead.
5
5
  */
6
6
  export declare class Workspaces {
7
7
  private root;
@@ -4,9 +4,9 @@ exports.toProjectName = exports.Workspaces = void 0;
4
4
  const path_1 = require("path");
5
5
  const project_graph_1 = require("../project-graph/project-graph");
6
6
  const nx_json_1 = require("./nx-json");
7
- // TODO(v18): remove this class
7
+ // TODO(v19): remove this class
8
8
  /**
9
- * @deprecated This will be removed in v18. Use {@link readProjectsConfigurationFromProjectGraph} instead.
9
+ * @deprecated This will be removed in v19. Use {@link readProjectsConfigurationFromProjectGraph} instead.
10
10
  */
11
11
  class Workspaces {
12
12
  constructor(root) {