@nx/js 16.5.0 → 16.5.2

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/generators.json CHANGED
@@ -12,7 +12,6 @@
12
12
  "init": {
13
13
  "factory": "./src/generators/init/init#initSchematic",
14
14
  "schema": "./src/generators/init/schema.json",
15
- "aliases": ["lib"],
16
15
  "x-type": "init",
17
16
  "description": "Initialize a TS/JS workspace.",
18
17
  "hidden": true
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@nx/js",
3
- "version": "16.5.0",
3
+ "version": "16.5.2",
4
4
  "private": false,
5
5
  "description": "The JS plugin for Nx contains executors and generators that provide the best experience for developing JavaScript and TypeScript projects. ",
6
6
  "repository": {
@@ -39,9 +39,9 @@
39
39
  "@babel/preset-env": "^7.15.0",
40
40
  "@babel/preset-typescript": "^7.15.0",
41
41
  "@babel/runtime": "^7.14.8",
42
- "@nrwl/js": "16.5.0",
43
- "@nx/devkit": "16.5.0",
44
- "@nx/workspace": "16.5.0",
42
+ "@nrwl/js": "16.5.2",
43
+ "@nx/devkit": "16.5.2",
44
+ "@nx/workspace": "16.5.2",
45
45
  "@phenomnomnominal/tsquery": "~5.0.1",
46
46
  "babel-plugin-const-enum": "^1.0.1",
47
47
  "babel-plugin-macros": "^2.8.0",
@@ -69,5 +69,5 @@
69
69
  "access": "public"
70
70
  },
71
71
  "types": "./src/index.d.ts",
72
- "gitHead": "eaebcc34f92db2200dab0bde2e2e1dde107a47bf"
72
+ "gitHead": "928273940d11aa7dea87cb625a92f2c3ec62e726"
73
73
  }
@@ -65,37 +65,60 @@ function nodeExecutor(options, context) {
65
65
  childProcess: null,
66
66
  promise: null,
67
67
  start: () => tslib_1.__awaiter(this, void 0, void 0, function* () {
68
- let buildFailed = false;
69
- // Run the build
70
- task.promise = new Promise((resolve, reject) => tslib_1.__awaiter(this, void 0, void 0, function* () {
71
- task.childProcess = (0, child_process_1.exec)(`npx nx run ${context.projectName}:${buildTarget.target}${buildTarget.configuration ? `:${buildTarget.configuration}` : ''}`, {
72
- cwd: context.root,
73
- }, (error, stdout, stderr) => {
74
- if (
75
- // Build succeeded
76
- !error ||
77
- // If task was killed then another build process has started, ignore errors.
78
- task.killed) {
79
- resolve();
80
- return;
81
- }
82
- devkit_1.logger.info(stdout);
83
- buildFailed = true;
84
- if (options.watch) {
85
- devkit_1.logger.error(`Build failed, waiting for changes to restart...`);
86
- resolve(); // Don't reject because it'll error out and kill the Nx process.
87
- }
88
- else {
89
- devkit_1.logger.error(`Build failed. See above for errors.`);
68
+ if (options.runBuildTargetDependencies) {
69
+ // If task dependencies are to be run, then we need to run through CLI since `runExecutor` doesn't support it.
70
+ task.promise = new Promise((resolve, reject) => tslib_1.__awaiter(this, void 0, void 0, function* () {
71
+ task.childProcess = (0, child_process_1.fork)(require.resolve('nx'), [
72
+ 'run',
73
+ `${context.projectName}:${buildTarget.target}${buildTarget.configuration
74
+ ? `:${buildTarget.configuration}`
75
+ : ''}`,
76
+ ], {
77
+ cwd: context.root,
78
+ stdio: 'inherit',
79
+ });
80
+ task.childProcess.once('exit', (code) => {
81
+ if (code === 0)
82
+ resolve();
83
+ else
84
+ reject();
85
+ });
86
+ }));
87
+ }
88
+ else {
89
+ const output = yield (0, devkit_1.runExecutor)(buildTarget, Object.assign(Object.assign({}, options.buildTargetOptions), { watch: false }), context);
90
+ task.promise = new Promise((resolve, reject) => tslib_1.__awaiter(this, void 0, void 0, function* () {
91
+ var _g;
92
+ let error = false;
93
+ let event;
94
+ do {
95
+ event = yield output.next();
96
+ if (((_g = event.value) === null || _g === void 0 ? void 0 : _g.success) === false) {
97
+ error = true;
98
+ }
99
+ } while (!event.done);
100
+ if (error)
90
101
  reject();
91
- }
92
- });
93
- }));
94
- // Wait for build to finish
95
- yield task.promise;
96
- // Task may have been stopped due to another running task.
97
- // OR build failed, so don't start the process.
98
- if (task.killed || buildFailed)
102
+ else
103
+ resolve();
104
+ }));
105
+ }
106
+ // Wait for build to finish.
107
+ try {
108
+ yield task.promise;
109
+ }
110
+ catch (_f) {
111
+ // If in watch-mode, don't throw or else the process exits.
112
+ if (options.watch) {
113
+ devkit_1.logger.error(`Build failed, waiting for changes to restart...`);
114
+ return;
115
+ }
116
+ else {
117
+ throw new Error(`Build failed. See above for errors.`);
118
+ }
119
+ }
120
+ // Before running the program, check if the task has been killed (by a new change during watch).
121
+ if (task.killed)
99
122
  return;
100
123
  // Run the program
101
124
  task.promise = new Promise((resolve, reject) => {
@@ -105,15 +128,17 @@ function nodeExecutor(options, context) {
105
128
  stdio: [0, 1, 'pipe', 'ipc'],
106
129
  env: Object.assign(Object.assign({}, process.env), { NX_FILE_TO_RUN: fileToRunCorrectPath(fileToRun), NX_MAPPINGS: JSON.stringify(mappings) }),
107
130
  });
108
- task.childProcess.stderr.on('data', (data) => {
131
+ const handleStdErr = (data) => {
109
132
  // Don't log out error if task is killed and new one has started.
110
133
  // This could happen if a new build is triggered while new process is starting, since the operation is not atomic.
111
134
  // Log the error in normal mode
112
135
  if (!options.watch || !task.killed) {
113
136
  devkit_1.logger.error(data.toString());
114
137
  }
115
- });
138
+ };
139
+ task.childProcess.stderr.on('data', handleStdErr);
116
140
  task.childProcess.once('exit', (code) => {
141
+ task.childProcess.off('data', handleStdErr);
117
142
  if (options.watch && !task.killed) {
118
143
  devkit_1.logger.info(`NX Process exited with code ${code}, waiting for changes to restart...`);
119
144
  }
@@ -132,7 +157,12 @@ function nodeExecutor(options, context) {
132
157
  if (task.childProcess) {
133
158
  yield (0, kill_tree_1.killTree)(task.childProcess.pid, signal);
134
159
  }
135
- yield task.promise;
160
+ try {
161
+ yield task.promise;
162
+ }
163
+ catch (_h) {
164
+ // Doesn't matter if task fails, we just need to wait until it finishes.
165
+ }
136
166
  }),
137
167
  };
138
168
  tasks.push(task);
@@ -142,13 +172,13 @@ function nodeExecutor(options, context) {
142
172
  watchProjects: [context.projectName],
143
173
  includeDependentProjects: true,
144
174
  }, (err, data) => tslib_1.__awaiter(this, void 0, void 0, function* () {
145
- var _f;
175
+ var _j;
146
176
  if (err === 'closed') {
147
177
  devkit_1.logger.error(`Watch error: Daemon closed the connection`);
148
178
  process.exit(1);
149
179
  }
150
180
  else if (err) {
151
- devkit_1.logger.error(`Watch error: ${(_f = err === null || err === void 0 ? void 0 : err.message) !== null && _f !== void 0 ? _f : 'Unknown'}`);
181
+ devkit_1.logger.error(`Watch error: ${(_j = err === null || err === void 0 ? void 0 : err.message) !== null && _j !== void 0 ? _j : 'Unknown'}`);
152
182
  }
153
183
  else {
154
184
  devkit_1.logger.info(`NX File change detected. Restarting...`);
@@ -14,4 +14,5 @@ export interface NodeExecutorOptions {
14
14
  port: number;
15
15
  watch?: boolean;
16
16
  debounce?: number;
17
+ runBuildTargetDependencies?: boolean;
17
18
  }
@@ -27,12 +27,14 @@
27
27
  "host": {
28
28
  "type": "string",
29
29
  "default": "localhost",
30
- "description": "The host to inspect the process on."
30
+ "description": "The host to inspect the process on.",
31
+ "x-priority": "important"
31
32
  },
32
33
  "port": {
33
34
  "type": "number",
34
35
  "default": 9229,
35
- "description": "The port to inspect the process on. Setting port to 0 will assign random free ports to all forked processes."
36
+ "description": "The port to inspect the process on. Setting port to 0 will assign random free ports to all forked processes.",
37
+ "x-priority": "important"
36
38
  },
37
39
  "inspect": {
38
40
  "oneOf": [
@@ -45,7 +47,8 @@
45
47
  }
46
48
  ],
47
49
  "description": "Ensures the app is starting with debugging.",
48
- "default": "inspect"
50
+ "default": "inspect",
51
+ "x-priority": "important"
49
52
  },
50
53
  "runtimeArgs": {
51
54
  "type": "array",
@@ -53,7 +56,8 @@
53
56
  "default": [],
54
57
  "items": {
55
58
  "type": "string"
56
- }
59
+ },
60
+ "x-priority": "important"
57
61
  },
58
62
  "args": {
59
63
  "type": "array",
@@ -61,19 +65,28 @@
61
65
  "default": [],
62
66
  "items": {
63
67
  "type": "string"
64
- }
68
+ },
69
+ "x-priority": "important"
65
70
  },
66
71
  "watch": {
67
72
  "type": "boolean",
68
73
  "description": "Enable re-building when files change.",
69
- "default": true
74
+ "default": true,
75
+ "x-priority": "important"
70
76
  },
71
77
  "debounce": {
72
78
  "type": "number",
73
79
  "description": "Delay in milliseconds to wait before restarting. Useful to batch multiple file changes events together. Set to zero (0) to disable.",
74
- "default": 500
80
+ "default": 500,
81
+ "x-priority": "important"
82
+ },
83
+ "runBuildTargetDependencies": {
84
+ "type": "boolean",
85
+ "description": "Whether to run dependencies before running the build. Set this to true if the project does not build libraries from source (e.g. 'buildLibsFromSource: false').",
86
+ "default": false
75
87
  }
76
88
  },
77
89
  "additionalProperties": false,
78
- "required": ["buildTarget"]
90
+ "required": ["buildTarget"],
91
+ "examplesFile": "../../../docs/node-examples.md"
79
92
  }
@@ -43,20 +43,21 @@ function tscBatchExecutor(taskGraph, inputs, overrides, context) {
43
43
  }
44
44
  },
45
45
  };
46
+ const processTaskPostCompilation = (tsConfig) => {
47
+ if (tsConfigTaskInfoMap[tsConfig]) {
48
+ const taskInfo = tsConfigTaskInfoMap[tsConfig];
49
+ taskInfo.assetsHandler.processAllAssetsOnceSync();
50
+ (0, update_package_json_1.updatePackageJson)(taskInfo.options, taskInfo.context, taskInfo.projectGraphNode, taskInfo.buildableProjectNodeDependencies);
51
+ taskInfo.endTime = Date.now();
52
+ }
53
+ };
46
54
  const typescriptCompilation = (0, lib_1.compileTypescriptSolution)(tsCompilationContext, shouldWatch, logger, {
47
55
  beforeProjectCompilationCallback: (tsConfig) => {
48
56
  if (tsConfigTaskInfoMap[tsConfig]) {
49
57
  tsConfigTaskInfoMap[tsConfig].startTime = Date.now();
50
58
  }
51
59
  },
52
- afterProjectCompilationCallback: (tsConfig) => {
53
- if (tsConfigTaskInfoMap[tsConfig]) {
54
- const taskInfo = tsConfigTaskInfoMap[tsConfig];
55
- taskInfo.assetsHandler.processAllAssetsOnceSync();
56
- (0, update_package_json_1.updatePackageJson)(taskInfo.options, taskInfo.context, taskInfo.projectGraphNode, taskInfo.buildableProjectNodeDependencies);
57
- taskInfo.endTime = Date.now();
58
- }
59
- },
60
+ afterProjectCompilationCallback: processTaskPostCompilation,
60
61
  });
61
62
  if (shouldWatch) {
62
63
  const taskInfos = Object.values(tsConfigTaskInfoMap);
@@ -79,21 +80,54 @@ function tscBatchExecutor(taskGraph, inputs, overrides, context) {
79
80
  return { value: undefined, done: true };
80
81
  }))))));
81
82
  }
83
+ const toBatchExecutorTaskResult = (tsConfig, success) => ({
84
+ task: tsConfigTaskInfoMap[tsConfig].task,
85
+ result: {
86
+ success: success,
87
+ terminalOutput: tsConfigTaskInfoMap[tsConfig].terminalOutput,
88
+ startTime: tsConfigTaskInfoMap[tsConfig].startTime,
89
+ endTime: tsConfigTaskInfoMap[tsConfig].endTime,
90
+ },
91
+ });
92
+ let isCompilationDone = false;
93
+ const taskTsConfigsToReport = new Set(Object.keys(taskGraph.tasks).map((t) => taskInMemoryTsConfigMap[t].path));
94
+ let tasksToReportIterator;
95
+ const processSkippedTasks = () => {
96
+ const { value: tsConfig, done } = tasksToReportIterator.next();
97
+ if (done) {
98
+ return { value: undefined, done: true };
99
+ }
100
+ tsConfigTaskInfoMap[tsConfig].startTime = Date.now();
101
+ processTaskPostCompilation(tsConfig);
102
+ return { value: toBatchExecutorTaskResult(tsConfig, true), done: false };
103
+ };
82
104
  return yield tslib_1.__await(yield tslib_1.__await(yield* tslib_1.__asyncDelegator(tslib_1.__asyncValues(mapAsyncIterable(typescriptCompilation, (iterator) => tslib_1.__awaiter(this, void 0, void 0, function* () {
105
+ if (isCompilationDone) {
106
+ return processSkippedTasks();
107
+ }
83
108
  const { value, done } = yield iterator.next();
84
109
  if (done) {
85
- return { value, done: true };
110
+ if (taskTsConfigsToReport.size > 0) {
111
+ /**
112
+ * TS compilation is done but we still have tasks to report. This can
113
+ * happen if, for example, a project is identified as affected, but
114
+ * no file in the TS project is actually changed or if running a
115
+ * task with `--skip-nx-cache` and the outputs are already there. There
116
+ * can still be changes to assets or other files we need to process.
117
+ *
118
+ * Switch to handle the iterator for the tasks we still need to report.
119
+ */
120
+ isCompilationDone = true;
121
+ tasksToReportIterator = taskTsConfigsToReport.values();
122
+ return processSkippedTasks();
123
+ }
124
+ return { value: undefined, done: true };
86
125
  }
87
- const taskResult = {
88
- task: tsConfigTaskInfoMap[value.tsConfig].task,
89
- result: {
90
- success: value.success,
91
- terminalOutput: tsConfigTaskInfoMap[value.tsConfig].terminalOutput,
92
- startTime: tsConfigTaskInfoMap[value.tsConfig].startTime,
93
- endTime: tsConfigTaskInfoMap[value.tsConfig].endTime,
94
- },
126
+ taskTsConfigsToReport.delete(value.tsConfig);
127
+ return {
128
+ value: toBatchExecutorTaskResult(value.tsConfig, value.success),
129
+ done: false,
95
130
  };
96
- return { value: taskResult, done: false };
97
131
  }))))));
98
132
  });
99
133
  }
@@ -120,8 +120,10 @@ function setupNpm(options) {
120
120
  throw new Error(`Failed to set npm registry to http://localhost:${options.port}/: ${e.message}`);
121
121
  }
122
122
  return () => {
123
+ var _a, _b, _c;
123
124
  try {
124
- if (npmRegistryPath) {
125
+ const currentNpmRegistryPath = (_c = (_b = (_a = (0, child_process_1.execSync)(`npm config get registry --location ${options.location}`)) === null || _a === void 0 ? void 0 : _a.toString()) === null || _b === void 0 ? void 0 : _b.trim()) === null || _c === void 0 ? void 0 : _c.replace('\u001b[2K\u001b[1G', ''); // strip out ansi codes
126
+ if (npmRegistryPath && currentNpmRegistryPath.includes('localhost')) {
125
127
  (0, child_process_1.execSync)(`npm config set registry ${npmRegistryPath} --location ${options.location}`);
126
128
  devkit_1.logger.info(`Reset npm registry to ${npmRegistryPath}`);
127
129
  }
@@ -174,8 +176,10 @@ function setupYarn(options) {
174
176
  devkit_1.logger.info(`Whitelisted http://localhost:${options.port}/ as an unsafe http server`);
175
177
  }
176
178
  return () => {
179
+ var _a, _b, _c;
177
180
  try {
178
- if (yarnRegistryPath) {
181
+ const currentYarnRegistryPath = (_c = (_b = (_a = (0, child_process_1.execSync)(`yarn config get ${registryConfigName}`)) === null || _a === void 0 ? void 0 : _a.toString()) === null || _b === void 0 ? void 0 : _b.trim()) === null || _c === void 0 ? void 0 : _c.replace('\u001b[2K\u001b[1G', ''); // strip out ansi codes
182
+ if (yarnRegistryPath && currentYarnRegistryPath.includes('localhost')) {
179
183
  (0, child_process_1.execSync)(`yarn config set ${registryConfigName} ${yarnRegistryPath}` +
180
184
  (options.location === 'user' ? ' --home' : ''));
181
185
  devkit_1.logger.info(`Reset yarn ${registryConfigName} to ${yarnRegistryPath}`);
@@ -0,0 +1,7 @@
1
+ import { type ProjectGraph, type ProjectGraphProjectNode, type ProjectFileMap } from '@nx/devkit';
2
+ /**
3
+ * Finds all npm dependencies and their expected versions for a given project.
4
+ */
5
+ export declare function findNpmDependencies(workspaceRoot: string, sourceProject: ProjectGraphProjectNode, projectGraph: ProjectGraph, projectFileMap: ProjectFileMap, buildTarget: string, options?: {
6
+ includeTransitiveDependencies?: boolean;
7
+ }): Record<string, string>;
@@ -0,0 +1,115 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.findNpmDependencies = void 0;
4
+ const path_1 = require("path");
5
+ const file_utils_1 = require("nx/src/project-graph/file-utils");
6
+ const task_hasher_1 = require("nx/src/hasher/task-hasher");
7
+ const devkit_1 = require("@nx/devkit");
8
+ const fileutils_1 = require("nx/src/utils/fileutils");
9
+ const project_graph_1 = require("nx/src/config/project-graph");
10
+ const ts_config_1 = require("./typescript/ts-config");
11
+ /**
12
+ * Finds all npm dependencies and their expected versions for a given project.
13
+ */
14
+ function findNpmDependencies(workspaceRoot, sourceProject, projectGraph, projectFileMap, buildTarget, options = {}) {
15
+ let seen = null;
16
+ if (options.includeTransitiveDependencies) {
17
+ seen = new Set();
18
+ }
19
+ const results = {};
20
+ function collectAll(currentProject, collectedDeps) {
21
+ if (seen === null || seen === void 0 ? void 0 : seen.has(currentProject.name))
22
+ return;
23
+ collectDependenciesFromFileMap(workspaceRoot, currentProject, projectGraph, projectFileMap, buildTarget, collectedDeps);
24
+ collectHelperDependencies(workspaceRoot, currentProject, projectGraph, buildTarget, collectedDeps);
25
+ if (options.includeTransitiveDependencies) {
26
+ const projectDeps = projectGraph.dependencies[currentProject.name];
27
+ for (const dep of projectDeps) {
28
+ const projectDep = projectGraph.nodes[dep.target];
29
+ if (projectDep)
30
+ collectAll(projectDep, collectedDeps);
31
+ }
32
+ }
33
+ }
34
+ collectAll(sourceProject, results);
35
+ return results;
36
+ }
37
+ exports.findNpmDependencies = findNpmDependencies;
38
+ // Keep track of workspace libs we already read package.json for so we don't read from disk again.
39
+ const seenWorkspaceDeps = {};
40
+ function collectDependenciesFromFileMap(workspaceRoot, sourceProject, projectGraph, projectFileMap, buildTarget, npmDeps) {
41
+ const rawFiles = projectFileMap[sourceProject.name];
42
+ if (!rawFiles)
43
+ return;
44
+ // Cannot read inputs if the target does not exist on the project.
45
+ if (!sourceProject.data.targets[buildTarget])
46
+ return;
47
+ const inputs = (0, task_hasher_1.getTargetInputs)((0, file_utils_1.readNxJson)(), sourceProject, buildTarget).selfInputs;
48
+ const files = (0, task_hasher_1.filterUsingGlobPatterns)(sourceProject.data.root, projectFileMap[sourceProject.name] || [], inputs);
49
+ for (const fileData of files) {
50
+ if (!fileData.deps ||
51
+ fileData.file ===
52
+ (0, devkit_1.joinPathFragments)(sourceProject.data.root, 'package.json')) {
53
+ continue;
54
+ }
55
+ for (const dep of fileData.deps) {
56
+ const target = (0, project_graph_1.fileDataDepTarget)(dep);
57
+ // If the node is external, then read package info from `data`.
58
+ const externalDep = projectGraph.externalNodes[target];
59
+ if ((externalDep === null || externalDep === void 0 ? void 0 : externalDep.type) === 'npm') {
60
+ npmDeps[externalDep.data.packageName] = externalDep.data.version;
61
+ continue;
62
+ }
63
+ // If node is internal, then try reading package info from `package.json` (which must exist for this to work).
64
+ const workspaceDep = projectGraph.nodes[target];
65
+ if (!workspaceDep)
66
+ continue;
67
+ const cached = seenWorkspaceDeps[workspaceDep.name];
68
+ if (cached) {
69
+ npmDeps[cached.name] = cached.version;
70
+ }
71
+ else {
72
+ const packageJson = readPackageJson(workspaceDep, workspaceRoot);
73
+ if (packageJson) {
74
+ // This is a workspace lib so we can't reliably read in a specific version since it depends on how the workspace is set up.
75
+ // ASSUMPTION: Most users will use '*' for workspace lib versions. Otherwise, they can manually update it.
76
+ npmDeps[packageJson.name] = '*';
77
+ seenWorkspaceDeps[workspaceDep.name] = {
78
+ name: packageJson.name,
79
+ version: '*',
80
+ };
81
+ }
82
+ }
83
+ }
84
+ }
85
+ }
86
+ function readPackageJson(project, workspaceRoot) {
87
+ const packageJsonPath = (0, path_1.join)(workspaceRoot, project.data.root, 'package.json');
88
+ if ((0, fileutils_1.fileExists)(packageJsonPath))
89
+ return (0, devkit_1.readJsonFile)(packageJsonPath);
90
+ return null;
91
+ }
92
+ function collectHelperDependencies(workspaceRoot, sourceProject, projectGraph, buildTarget, npmDeps) {
93
+ var _a, _b, _c, _d;
94
+ const target = sourceProject.data.targets[buildTarget];
95
+ if (!target)
96
+ return;
97
+ if (target.executor === '@nx/js:tsc' && ((_a = target.options) === null || _a === void 0 ? void 0 : _a.tsConfig)) {
98
+ const tsConfig = (0, ts_config_1.readTsConfig)((0, path_1.join)(workspaceRoot, target.options.tsConfig));
99
+ if (tsConfig === null || tsConfig === void 0 ? void 0 : tsConfig.options['importHelpers']) {
100
+ npmDeps['tslib'] = (_b = projectGraph.externalNodes['npm:tslib']) === null || _b === void 0 ? void 0 : _b.data.version;
101
+ }
102
+ }
103
+ if (target.executor === '@nx/js:swc') {
104
+ const swcConfigPath = target.options.swcrc
105
+ ? (0, path_1.join)(workspaceRoot, target.options.swcrc)
106
+ : (0, path_1.join)(workspaceRoot, sourceProject.data.root, '.swcrc');
107
+ const swcConfig = (0, fileutils_1.fileExists)(swcConfigPath)
108
+ ? (0, devkit_1.readJsonFile)(swcConfigPath)
109
+ : {};
110
+ if ((_c = swcConfig === null || swcConfig === void 0 ? void 0 : swcConfig.jsc) === null || _c === void 0 ? void 0 : _c.externalHelpers) {
111
+ npmDeps['@swc/helpers'] =
112
+ (_d = projectGraph.externalNodes['npm:@swc/helpers']) === null || _d === void 0 ? void 0 : _d.data.version;
113
+ }
114
+ }
115
+ }