nx 19.4.0-rc.0 → 19.4.0
Sign up to get free protection for your applications and to get access to all the features.
package/package.json
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
{
|
2
2
|
"name": "nx",
|
3
|
-
"version": "19.4.0
|
3
|
+
"version": "19.4.0",
|
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": {
|
@@ -70,7 +70,7 @@
|
|
70
70
|
"yargs-parser": "21.1.1",
|
71
71
|
"node-machine-id": "1.1.12",
|
72
72
|
"ora": "5.3.0",
|
73
|
-
"@nrwl/tao": "19.4.0
|
73
|
+
"@nrwl/tao": "19.4.0"
|
74
74
|
},
|
75
75
|
"peerDependencies": {
|
76
76
|
"@swc-node/register": "^1.8.0",
|
@@ -85,16 +85,16 @@
|
|
85
85
|
}
|
86
86
|
},
|
87
87
|
"optionalDependencies": {
|
88
|
-
"@nx/nx-darwin-x64": "19.4.0
|
89
|
-
"@nx/nx-darwin-arm64": "19.4.0
|
90
|
-
"@nx/nx-linux-x64-gnu": "19.4.0
|
91
|
-
"@nx/nx-linux-x64-musl": "19.4.0
|
92
|
-
"@nx/nx-win32-x64-msvc": "19.4.0
|
93
|
-
"@nx/nx-linux-arm64-gnu": "19.4.0
|
94
|
-
"@nx/nx-linux-arm64-musl": "19.4.0
|
95
|
-
"@nx/nx-linux-arm-gnueabihf": "19.4.0
|
96
|
-
"@nx/nx-win32-arm64-msvc": "19.4.0
|
97
|
-
"@nx/nx-freebsd-x64": "19.4.0
|
88
|
+
"@nx/nx-darwin-x64": "19.4.0",
|
89
|
+
"@nx/nx-darwin-arm64": "19.4.0",
|
90
|
+
"@nx/nx-linux-x64-gnu": "19.4.0",
|
91
|
+
"@nx/nx-linux-x64-musl": "19.4.0",
|
92
|
+
"@nx/nx-win32-x64-msvc": "19.4.0",
|
93
|
+
"@nx/nx-linux-arm64-gnu": "19.4.0",
|
94
|
+
"@nx/nx-linux-arm64-musl": "19.4.0",
|
95
|
+
"@nx/nx-linux-arm-gnueabihf": "19.4.0",
|
96
|
+
"@nx/nx-win32-arm64-msvc": "19.4.0",
|
97
|
+
"@nx/nx-freebsd-x64": "19.4.0"
|
98
98
|
},
|
99
99
|
"nx-migrations": {
|
100
100
|
"migrations": "./migrations.json",
|
@@ -1,2 +1,8 @@
|
|
1
1
|
export declare function shortenedCloudUrl(installationSource: string, accessToken?: string, usesGithub?: boolean): Promise<string>;
|
2
2
|
export declare function repoUsesGithub(github?: boolean): Promise<boolean>;
|
3
|
+
export declare function removeTrailingSlash(apiUrl: string): string;
|
4
|
+
export declare function getURLifShortenFailed(usesGithub: boolean, githubSlug: string, apiUrl: string, source: string, accessToken?: string): string;
|
5
|
+
export declare function getNxCloudVersion(apiUrl: string): Promise<string | null>;
|
6
|
+
export declare function removeVersionModifier(versionString: string): string;
|
7
|
+
export declare function versionIsValid(version: string): boolean;
|
8
|
+
export declare function compareCleanCloudVersions(version1: string, version2: string): number;
|
@@ -1,14 +1,21 @@
|
|
1
1
|
"use strict";
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
3
|
-
exports.repoUsesGithub = exports.shortenedCloudUrl = void 0;
|
3
|
+
exports.compareCleanCloudVersions = exports.versionIsValid = exports.removeVersionModifier = exports.getNxCloudVersion = exports.getURLifShortenFailed = exports.removeTrailingSlash = exports.repoUsesGithub = exports.shortenedCloudUrl = void 0;
|
4
4
|
const devkit_exports_1 = require("../../devkit-exports");
|
5
5
|
const git_utils_1 = require("../../utils/git-utils");
|
6
|
-
const semver_1 = require("semver");
|
7
6
|
async function shortenedCloudUrl(installationSource, accessToken, usesGithub) {
|
8
7
|
const githubSlug = (0, git_utils_1.getGithubSlugOrNull)();
|
9
8
|
const apiUrl = removeTrailingSlash(process.env.NX_CLOUD_API || process.env.NRWL_API || `https://cloud.nx.app`);
|
10
|
-
|
11
|
-
|
9
|
+
try {
|
10
|
+
const version = await getNxCloudVersion(apiUrl);
|
11
|
+
if ((version && compareCleanCloudVersions(version, '2406.11.5') < 0) ||
|
12
|
+
!version) {
|
13
|
+
return apiUrl;
|
14
|
+
}
|
15
|
+
}
|
16
|
+
catch (e) {
|
17
|
+
devkit_exports_1.logger.verbose(`Failed to get Nx Cloud version.
|
18
|
+
${e}`);
|
12
19
|
return apiUrl;
|
13
20
|
}
|
14
21
|
const source = getSource(installationSource);
|
@@ -44,6 +51,7 @@ exports.repoUsesGithub = repoUsesGithub;
|
|
44
51
|
function removeTrailingSlash(apiUrl) {
|
45
52
|
return apiUrl[apiUrl.length - 1] === '/' ? apiUrl.slice(0, -1) : apiUrl;
|
46
53
|
}
|
54
|
+
exports.removeTrailingSlash = removeTrailingSlash;
|
47
55
|
function getSource(installationSource) {
|
48
56
|
if (installationSource.includes('nx-init')) {
|
49
57
|
return 'nx-init';
|
@@ -69,6 +77,7 @@ function getURLifShortenFailed(usesGithub, githubSlug, apiUrl, source, accessTok
|
|
69
77
|
}
|
70
78
|
return `${apiUrl}/setup/connect-workspace/manual?accessToken=${accessToken}&source=${source}`;
|
71
79
|
}
|
80
|
+
exports.getURLifShortenFailed = getURLifShortenFailed;
|
72
81
|
async function getInstallationSupportsGitHub(apiUrl) {
|
73
82
|
try {
|
74
83
|
const response = await require('axios').get(`${apiUrl}/nx-cloud/system/features`);
|
@@ -89,17 +98,55 @@ async function getNxCloudVersion(apiUrl) {
|
|
89
98
|
try {
|
90
99
|
const response = await require('axios').get(`${apiUrl}/nx-cloud/system/version`);
|
91
100
|
const version = removeVersionModifier(response.data.version);
|
101
|
+
const isValid = versionIsValid(version);
|
92
102
|
if (!version) {
|
93
103
|
throw new Error('Failed to extract version from response.');
|
94
104
|
}
|
105
|
+
if (!isValid) {
|
106
|
+
throw new Error(`Invalid version format: ${version}`);
|
107
|
+
}
|
95
108
|
return version;
|
96
109
|
}
|
97
110
|
catch (e) {
|
98
111
|
devkit_exports_1.logger.verbose(`Failed to get version of Nx Cloud.
|
99
112
|
${e}`);
|
113
|
+
return null;
|
100
114
|
}
|
101
115
|
}
|
116
|
+
exports.getNxCloudVersion = getNxCloudVersion;
|
102
117
|
function removeVersionModifier(versionString) {
|
103
|
-
// version
|
118
|
+
// Cloud version string is in the format of YYMM.DD.BuildNumber-Modifier
|
104
119
|
return versionString.split(/[\.-]/).slice(0, 3).join('.');
|
105
120
|
}
|
121
|
+
exports.removeVersionModifier = removeVersionModifier;
|
122
|
+
function versionIsValid(version) {
|
123
|
+
// Updated Regex pattern to require YYMM.DD.BuildNumber format
|
124
|
+
// All parts are required, including the BuildNumber.
|
125
|
+
const pattern = /^\d{4}\.\d{2}\.\d+$/;
|
126
|
+
return pattern.test(version);
|
127
|
+
}
|
128
|
+
exports.versionIsValid = versionIsValid;
|
129
|
+
function compareCleanCloudVersions(version1, version2) {
|
130
|
+
const parseVersion = (version) => {
|
131
|
+
// The format we're using is YYMM.DD.BuildNumber
|
132
|
+
const parts = version.split('.').map((part) => parseInt(part, 10));
|
133
|
+
return {
|
134
|
+
yearMonth: parts[0],
|
135
|
+
day: parts[1],
|
136
|
+
buildNumber: parts[2],
|
137
|
+
};
|
138
|
+
};
|
139
|
+
const v1 = parseVersion(version1);
|
140
|
+
const v2 = parseVersion(version2);
|
141
|
+
if (v1.yearMonth !== v2.yearMonth) {
|
142
|
+
return v1.yearMonth > v2.yearMonth ? 1 : -1;
|
143
|
+
}
|
144
|
+
if (v1.day !== v2.day) {
|
145
|
+
return v1.day > v2.day ? 1 : -1;
|
146
|
+
}
|
147
|
+
if (v1.buildNumber !== v2.buildNumber) {
|
148
|
+
return v1.buildNumber > v2.buildNumber ? 1 : -1;
|
149
|
+
}
|
150
|
+
return 0;
|
151
|
+
}
|
152
|
+
exports.compareCleanCloudVersions = compareCleanCloudVersions;
|
@@ -10,6 +10,7 @@ const configuration_1 = require("../../../config/configuration");
|
|
10
10
|
const nx_deps_cache_1 = require("../../../project-graph/nx-deps-cache");
|
11
11
|
const path_1 = require("path");
|
12
12
|
const task_hasher_1 = require("../../../hasher/task-hasher");
|
13
|
+
const output_1 = require("../../../utils/output");
|
13
14
|
/**
|
14
15
|
* Creates a package.json in the output directory for support to install dependencies within containers.
|
15
16
|
*
|
@@ -106,6 +107,19 @@ function createPackageJson(projectName, graph, options = {}, fileMap = null) {
|
|
106
107
|
packageJson.dependencies &&= (0, object_sort_1.sortObjectByKeys)(packageJson.dependencies);
|
107
108
|
packageJson.peerDependencies &&= (0, object_sort_1.sortObjectByKeys)(packageJson.peerDependencies);
|
108
109
|
packageJson.peerDependenciesMeta &&= (0, object_sort_1.sortObjectByKeys)(packageJson.peerDependenciesMeta);
|
110
|
+
if (rootPackageJson.packageManager) {
|
111
|
+
if (packageJson.packageManager &&
|
112
|
+
packageJson.packageManager !== rootPackageJson.packageManager) {
|
113
|
+
output_1.output.warn({
|
114
|
+
title: 'Package Manager Mismatch',
|
115
|
+
bodyLines: [
|
116
|
+
`The project ${projectName} has explicitly specified "packageManager" config of "${packageJson.packageManager}" but the workspace is using "${rootPackageJson.packageManager}".`,
|
117
|
+
`Please remove the project level "packageManager" config or align it with the workspace root package.json.`,
|
118
|
+
],
|
119
|
+
});
|
120
|
+
}
|
121
|
+
packageJson.packageManager = rootPackageJson.packageManager;
|
122
|
+
}
|
109
123
|
return packageJson;
|
110
124
|
}
|
111
125
|
exports.createPackageJson = createPackageJson;
|
@@ -1,4 +1,3 @@
|
|
1
|
-
import type { TsConfigOptions } from 'ts-node';
|
2
1
|
import type { CompilerOptions } from 'typescript';
|
3
2
|
/**
|
4
3
|
* Optionally, if swc-node and tsconfig-paths are available in the current workspace, apply the require
|
@@ -24,7 +23,7 @@ export declare function registerTsProject(tsConfigPath: string): () => void;
|
|
24
23
|
*/
|
25
24
|
export declare function registerTsProject(path: string, configFilename: string): any;
|
26
25
|
export declare function getSwcTranspiler(compilerOptions: CompilerOptions): (...args: unknown[]) => unknown;
|
27
|
-
export declare function getTsNodeTranspiler(compilerOptions: CompilerOptions
|
26
|
+
export declare function getTsNodeTranspiler(compilerOptions: CompilerOptions): (...args: unknown[]) => unknown;
|
28
27
|
export declare function getTranspiler(compilerOptions: CompilerOptions, tsConfigRaw?: unknown): () => (...args: unknown[]) => unknown;
|
29
28
|
/**
|
30
29
|
* Register ts-node or swc-node given a set of compiler options.
|
@@ -7,7 +7,45 @@ const swcNodeInstalled = packageIsInstalled('@swc-node/register');
|
|
7
7
|
const tsNodeInstalled = packageIsInstalled('ts-node/register');
|
8
8
|
let ts;
|
9
9
|
let isTsEsmLoaderRegistered = false;
|
10
|
+
/**
|
11
|
+
* tsx is a utility to run TypeScript files in node which is growing in popularity:
|
12
|
+
* https://tsx.is
|
13
|
+
*
|
14
|
+
* Behind the scenes it is invoking node with relevant --require and --import flags.
|
15
|
+
*
|
16
|
+
* If the user is invoking Nx via a script which is being invoked via tsx, then we
|
17
|
+
* do not need to register any transpiler at all as the environment will have already
|
18
|
+
* been configured by tsx. In fact, registering a transpiler such as ts-node or swc
|
19
|
+
* in this case causes issues.
|
20
|
+
*
|
21
|
+
* Because node is being invoked by tsx, the tsx binary does not end up in the final
|
22
|
+
* process.argv and so we need to check a few possible things to account for usage
|
23
|
+
* via different package managers (e.g. pnpm does not set process._ to tsx, but rather
|
24
|
+
* pnpm itself, modern yarn does not set process._ at all etc.).
|
25
|
+
*/
|
26
|
+
const isInvokedByTsx = (() => {
|
27
|
+
if (process.env._?.endsWith(`${path_1.sep}tsx`)) {
|
28
|
+
return true;
|
29
|
+
}
|
30
|
+
const requireArgs = [];
|
31
|
+
const importArgs = [];
|
32
|
+
(process.execArgv ?? []).forEach((arg, i) => {
|
33
|
+
if (arg === '-r' || arg === '--require') {
|
34
|
+
requireArgs.push(process.execArgv[i + 1]);
|
35
|
+
}
|
36
|
+
if (arg === '--import') {
|
37
|
+
importArgs.push(process.execArgv[i + 1]);
|
38
|
+
}
|
39
|
+
});
|
40
|
+
const isTsxPath = (p) => p.includes(`${path_1.sep}tsx${path_1.sep}`);
|
41
|
+
return (requireArgs.some((a) => isTsxPath(a)) ||
|
42
|
+
importArgs.some((a) => isTsxPath(a)));
|
43
|
+
})();
|
10
44
|
function registerTsProject(path, configFilename) {
|
45
|
+
// See explanation alongside isInvokedByTsx declaration
|
46
|
+
if (isInvokedByTsx) {
|
47
|
+
return () => { };
|
48
|
+
}
|
11
49
|
const tsConfigPath = configFilename ? (0, path_1.join)(path, configFilename) : path;
|
12
50
|
const compilerOptions = readCompilerOptions(tsConfigPath);
|
13
51
|
const cleanupFunctions = [
|
@@ -41,7 +79,13 @@ function getSwcTranspiler(compilerOptions) {
|
|
41
79
|
return typeof cleanupFn === 'function' ? cleanupFn : () => { };
|
42
80
|
}
|
43
81
|
exports.getSwcTranspiler = getSwcTranspiler;
|
44
|
-
|
82
|
+
const registered = new Set();
|
83
|
+
function getTsNodeTranspiler(compilerOptions) {
|
84
|
+
// Just return if transpiler was already registered before.
|
85
|
+
const registrationKey = JSON.stringify(compilerOptions);
|
86
|
+
if (registered.has(registrationKey)) {
|
87
|
+
return () => { };
|
88
|
+
}
|
45
89
|
const { register } = require('ts-node');
|
46
90
|
// ts-node doesn't provide a cleanup method
|
47
91
|
const service = register({
|
@@ -50,13 +94,14 @@ function getTsNodeTranspiler(compilerOptions, tsNodeOptions) {
|
|
50
94
|
// we already read and provide the compiler options, so prevent ts-node from reading them again
|
51
95
|
skipProject: true,
|
52
96
|
});
|
97
|
+
registered.add(registrationKey);
|
53
98
|
const { transpiler, swc } = service.options;
|
54
99
|
// Don't warn if a faster transpiler is enabled
|
55
100
|
if (!transpiler && !swc) {
|
56
101
|
warnTsNodeUsage();
|
57
102
|
}
|
58
103
|
return () => {
|
59
|
-
service
|
104
|
+
// Do not cleanup ts-node service since other consumers may need it
|
60
105
|
};
|
61
106
|
}
|
62
107
|
exports.getTsNodeTranspiler = getTsNodeTranspiler;
|
@@ -121,7 +166,7 @@ function getTranspiler(compilerOptions, tsConfigRaw) {
|
|
121
166
|
// We can fall back on ts-node if it's available
|
122
167
|
if (tsNodeInstalled) {
|
123
168
|
const tsNodeOptions = filterRecognizedTsConfigTsNodeOptions(tsConfigRaw).recognized;
|
124
|
-
return () => getTsNodeTranspiler(compilerOptions
|
169
|
+
return () => getTsNodeTranspiler(compilerOptions);
|
125
170
|
}
|
126
171
|
}
|
127
172
|
exports.getTranspiler = getTranspiler;
|