nx 19.8.0 → 19.8.2
Sign up to get free protection for your applications and to get access to all the features.
- package/.eslintrc.json +11 -2
- package/bin/nx.js +10 -2
- package/package.json +12 -13
- package/schemas/nx-schema.json +26 -21
- package/src/adapter/compat.d.ts +1 -1
- package/src/adapter/compat.js +1 -0
- package/src/command-line/activate-powerpack/activate-powerpack.js +3 -1
- package/src/command-line/add/add.js +4 -2
- package/src/command-line/connect/view-logs.js +1 -0
- package/src/command-line/exec/exec.js +6 -1
- package/src/command-line/format/format.js +3 -1
- package/src/command-line/graph/graph.js +10 -9
- package/src/command-line/init/implementation/add-nx-to-nest.js +5 -5
- package/src/command-line/init/implementation/angular/integrated-workspace.js +4 -1
- package/src/command-line/init/implementation/angular/legacy-angular-versions.js +5 -2
- package/src/command-line/init/implementation/dot-nx/add-nx-scripts.js +3 -1
- package/src/command-line/init/implementation/dot-nx/nxw.js +1 -0
- package/src/command-line/init/implementation/react/check-for-uncommitted-changes.js +3 -1
- package/src/command-line/init/implementation/react/clean-up-files.js +7 -7
- package/src/command-line/init/implementation/react/index.js +36 -17
- package/src/command-line/init/implementation/react/rename-js-to-jsx.js +3 -3
- package/src/command-line/init/implementation/utils.js +5 -1
- package/src/command-line/init/init-v1.js +1 -0
- package/src/command-line/init/init-v2.js +2 -1
- package/src/command-line/migrate/command-object.js +4 -0
- package/src/command-line/migrate/migrate.js +1 -1
- package/src/command-line/release/changelog.js +1 -2
- package/src/command-line/release/config/version-plans.js +9 -8
- package/src/command-line/release/plan.js +6 -5
- package/src/command-line/release/release.js +2 -2
- package/src/command-line/release/utils/exec-command.js +1 -0
- package/src/command-line/release/utils/github.js +1 -0
- package/src/command-line/release/utils/launch-editor.js +6 -1
- package/src/command-line/release/version.js +6 -3
- package/src/command-line/report/report.d.ts +3 -1
- package/src/command-line/report/report.js +17 -2
- package/src/command-line/reset/reset.js +4 -4
- package/src/command-line/run/run.js +1 -0
- package/src/command-line/sync/sync.js +5 -4
- package/src/command-line/watch/watch.js +1 -0
- package/src/config/nx-json.d.ts +4 -0
- package/src/daemon/cache.d.ts +1 -2
- package/src/daemon/cache.js +12 -21
- package/src/daemon/client/client.d.ts +4 -1
- package/src/daemon/client/client.js +9 -8
- package/src/daemon/client/generate-help-output.js +1 -0
- package/src/daemon/server/sync-generators.d.ts +4 -1
- package/src/daemon/server/sync-generators.js +33 -15
- package/src/daemon/tmp-dir.js +6 -7
- package/src/executors/run-commands/run-commands.impl.js +1 -0
- package/src/executors/run-script/run-script.impl.js +1 -0
- package/src/generators/tree.d.ts +1 -1
- package/src/generators/tree.js +11 -11
- package/src/native/index.d.ts +1 -1
- package/src/native/nx.wasm32-wasi.wasm +0 -0
- package/src/nx-cloud/generators/connect-to-nx-cloud/connect-to-nx-cloud.js +1 -1
- package/src/plugins/js/index.js +1 -2
- package/src/project-graph/file-utils.js +1 -0
- package/src/project-graph/nx-deps-cache.js +5 -6
- package/src/tasks-runner/cache.d.ts +3 -1
- package/src/tasks-runner/cache.js +29 -29
- package/src/tasks-runner/default-tasks-runner.js +1 -1
- package/src/tasks-runner/life-cycles/formatting-utils.d.ts +1 -1
- package/src/tasks-runner/life-cycles/formatting-utils.js +27 -15
- package/src/tasks-runner/life-cycles/task-history-life-cycle.js +3 -0
- package/src/tasks-runner/remove-old-cache-records.js +2 -3
- package/src/tasks-runner/task-orchestrator.d.ts +3 -1
- package/src/tasks-runner/task-orchestrator.js +3 -2
- package/src/tasks-runner/tasks-schedule.js +1 -1
- package/src/utils/ab-testing.js +4 -1
- package/src/utils/child-process.js +5 -3
- package/src/utils/command-line-utils.js +7 -1
- package/src/utils/default-base.js +5 -2
- package/src/utils/fileutils.d.ts +9 -1
- package/src/utils/fileutils.js +29 -12
- package/src/utils/git-utils.index-filter.js +2 -1
- package/src/utils/git-utils.js +4 -0
- package/src/utils/git-utils.tree-filter.js +3 -1
- package/src/utils/ignore.js +2 -2
- package/src/utils/package-manager.js +2 -2
- package/src/utils/powerpack.d.ts +1 -1
- package/src/utils/powerpack.js +3 -8
- package/src/utils/sync-generators.d.ts +13 -3
- package/src/utils/sync-generators.js +99 -25
- package/src/utils/task-history.d.ts +2 -2
- package/src/utils/task-history.js +4 -1
@@ -16,6 +16,7 @@ function runNxSync(cmd, options) {
|
|
16
16
|
else {
|
17
17
|
options ??= {};
|
18
18
|
options.cwd ??= process.cwd();
|
19
|
+
options.windowsHide ??= true;
|
19
20
|
const offsetFromRoot = (0, path_1.relative)(options.cwd, (0, workspace_root_1.workspaceRootInner)(options.cwd, null));
|
20
21
|
if (process.platform === 'win32') {
|
21
22
|
baseCmd = '.\\' + (0, path_1.join)(`${offsetFromRoot}`, 'nx.bat');
|
@@ -34,6 +35,7 @@ async function runNxAsync(cmd, options) {
|
|
34
35
|
else {
|
35
36
|
options ??= {};
|
36
37
|
options.cwd ??= process.cwd();
|
38
|
+
options.windowsHide ??= true;
|
37
39
|
const offsetFromRoot = (0, path_1.relative)(options.cwd, (0, workspace_root_1.workspaceRootInner)(options.cwd, null));
|
38
40
|
if (process.platform === 'win32') {
|
39
41
|
baseCmd = '.\\' + (0, path_1.join)(`${offsetFromRoot}`, 'nx.bat');
|
@@ -46,13 +48,13 @@ async function runNxAsync(cmd, options) {
|
|
46
48
|
if (options?.silent) {
|
47
49
|
delete options.silent;
|
48
50
|
}
|
49
|
-
|
51
|
+
return new Promise((resolve, reject) => {
|
50
52
|
const child = (0, child_process_1.exec)(`${baseCmd} ${cmd}`, options, (error, stdout, stderr) => {
|
51
53
|
if (error) {
|
52
|
-
reject(error);
|
54
|
+
reject(stderr || stdout || error.message);
|
53
55
|
}
|
54
56
|
else {
|
55
|
-
resolve(
|
57
|
+
resolve();
|
56
58
|
}
|
57
59
|
});
|
58
60
|
if (!silent) {
|
@@ -222,6 +222,7 @@ function getMergeBase(base, head = 'HEAD') {
|
|
222
222
|
maxBuffer: file_utils_1.TEN_MEGABYTES,
|
223
223
|
cwd: workspace_root_1.workspaceRoot,
|
224
224
|
stdio: 'pipe',
|
225
|
+
windowsHide: true,
|
225
226
|
})
|
226
227
|
.toString()
|
227
228
|
.trim();
|
@@ -232,6 +233,7 @@ function getMergeBase(base, head = 'HEAD') {
|
|
232
233
|
maxBuffer: file_utils_1.TEN_MEGABYTES,
|
233
234
|
cwd: workspace_root_1.workspaceRoot,
|
234
235
|
stdio: 'pipe',
|
236
|
+
windowsHide: true,
|
235
237
|
})
|
236
238
|
.toString()
|
237
239
|
.trim();
|
@@ -245,7 +247,11 @@ function getFilesUsingBaseAndHead(base, head) {
|
|
245
247
|
return parseGitOutput(`git diff --name-only --no-renames --relative "${base}" "${head}"`);
|
246
248
|
}
|
247
249
|
function parseGitOutput(command) {
|
248
|
-
return (0, child_process_1.execSync)(command, {
|
250
|
+
return (0, child_process_1.execSync)(command, {
|
251
|
+
maxBuffer: file_utils_1.TEN_MEGABYTES,
|
252
|
+
cwd: workspace_root_1.workspaceRoot,
|
253
|
+
windowsHide: true,
|
254
|
+
})
|
249
255
|
.toString('utf-8')
|
250
256
|
.split('\n')
|
251
257
|
.map((a) => a.trim())
|
@@ -5,8 +5,11 @@ const child_process_1 = require("child_process");
|
|
5
5
|
function deduceDefaultBase() {
|
6
6
|
const nxDefaultBase = 'main';
|
7
7
|
try {
|
8
|
-
return ((0, child_process_1.execSync)('git config --get init.defaultBranch'
|
9
|
-
|
8
|
+
return ((0, child_process_1.execSync)('git config --get init.defaultBranch', {
|
9
|
+
windowsHide: true,
|
10
|
+
})
|
11
|
+
.toString()
|
12
|
+
.trim() || nxDefaultBase);
|
10
13
|
}
|
11
14
|
catch {
|
12
15
|
return nxDefaultBase;
|
package/src/utils/fileutils.d.ts
CHANGED
@@ -1,5 +1,5 @@
|
|
1
1
|
import type { JsonParseOptions, JsonSerializeOptions } from './json';
|
2
|
-
import { PathLike } from 'fs';
|
2
|
+
import { PathLike } from 'node:fs';
|
3
3
|
export interface JsonReadOptions extends JsonParseOptions {
|
4
4
|
/**
|
5
5
|
* mutable field recording whether JSON ends with new line
|
@@ -43,6 +43,14 @@ export declare function readYamlFile<T extends object = any>(path: string, optio
|
|
43
43
|
* @param options JSON serialize options
|
44
44
|
*/
|
45
45
|
export declare function writeJsonFile<T extends object = object>(path: string, data: T, options?: JsonWriteOptions): void;
|
46
|
+
/**
|
47
|
+
* Serializes the given data to JSON and writes it to a file asynchronously.
|
48
|
+
*
|
49
|
+
* @param path A path to a file.
|
50
|
+
* @param data data which should be serialized to JSON and written to the file
|
51
|
+
* @param options JSON serialize options
|
52
|
+
*/
|
53
|
+
export declare function writeJsonFileAsync<T extends object = object>(path: string, data: T, options?: JsonWriteOptions): Promise<void>;
|
46
54
|
/**
|
47
55
|
* Check if a directory exists
|
48
56
|
* @param path Path to directory
|
package/src/utils/fileutils.js
CHANGED
@@ -3,6 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.readJsonFile = readJsonFile;
|
4
4
|
exports.readYamlFile = readYamlFile;
|
5
5
|
exports.writeJsonFile = writeJsonFile;
|
6
|
+
exports.writeJsonFileAsync = writeJsonFileAsync;
|
6
7
|
exports.directoryExists = directoryExists;
|
7
8
|
exports.fileExists = fileExists;
|
8
9
|
exports.createDirectory = createDirectory;
|
@@ -10,7 +11,8 @@ exports.isRelativePath = isRelativePath;
|
|
10
11
|
exports.extractFileFromTarball = extractFileFromTarball;
|
11
12
|
exports.readFileIfExisting = readFileIfExisting;
|
12
13
|
const json_1 = require("./json");
|
13
|
-
const
|
14
|
+
const node_fs_1 = require("node:fs");
|
15
|
+
const promises_1 = require("node:fs/promises");
|
14
16
|
const path_1 = require("path");
|
15
17
|
const tar = require("tar-stream");
|
16
18
|
const zlib_1 = require("zlib");
|
@@ -22,7 +24,7 @@ const zlib_1 = require("zlib");
|
|
22
24
|
* @returns Object the JSON content of the file represents
|
23
25
|
*/
|
24
26
|
function readJsonFile(path, options) {
|
25
|
-
const content = (0,
|
27
|
+
const content = (0, node_fs_1.readFileSync)(path, 'utf-8');
|
26
28
|
if (options) {
|
27
29
|
options.endsWithNewline = content.charCodeAt(content.length - 1) === 10;
|
28
30
|
}
|
@@ -41,7 +43,7 @@ function readJsonFile(path, options) {
|
|
41
43
|
* @returns
|
42
44
|
*/
|
43
45
|
function readYamlFile(path, options) {
|
44
|
-
const content = (0,
|
46
|
+
const content = (0, node_fs_1.readFileSync)(path, 'utf-8');
|
45
47
|
const { load } = require('@zkochan/js-yaml');
|
46
48
|
return load(content, { ...options, filename: path });
|
47
49
|
}
|
@@ -53,12 +55,27 @@ function readYamlFile(path, options) {
|
|
53
55
|
* @param options JSON serialize options
|
54
56
|
*/
|
55
57
|
function writeJsonFile(path, data, options) {
|
56
|
-
(0,
|
58
|
+
(0, node_fs_1.mkdirSync)((0, path_1.dirname)(path), { recursive: true });
|
57
59
|
const serializedJson = (0, json_1.serializeJson)(data, options);
|
58
60
|
const content = options?.appendNewLine
|
59
61
|
? `${serializedJson}\n`
|
60
62
|
: serializedJson;
|
61
|
-
(0,
|
63
|
+
(0, node_fs_1.writeFileSync)(path, content, { encoding: 'utf-8' });
|
64
|
+
}
|
65
|
+
/**
|
66
|
+
* Serializes the given data to JSON and writes it to a file asynchronously.
|
67
|
+
*
|
68
|
+
* @param path A path to a file.
|
69
|
+
* @param data data which should be serialized to JSON and written to the file
|
70
|
+
* @param options JSON serialize options
|
71
|
+
*/
|
72
|
+
async function writeJsonFileAsync(path, data, options) {
|
73
|
+
await (0, promises_1.mkdir)((0, path_1.dirname)(path), { recursive: true });
|
74
|
+
const serializedJson = (0, json_1.serializeJson)(data, options);
|
75
|
+
const content = options?.appendNewLine
|
76
|
+
? `${serializedJson}\n`
|
77
|
+
: serializedJson;
|
78
|
+
await (0, promises_1.writeFile)(path, content, { encoding: 'utf-8' });
|
62
79
|
}
|
63
80
|
/**
|
64
81
|
* Check if a directory exists
|
@@ -66,7 +83,7 @@ function writeJsonFile(path, data, options) {
|
|
66
83
|
*/
|
67
84
|
function directoryExists(path) {
|
68
85
|
try {
|
69
|
-
return (0,
|
86
|
+
return (0, node_fs_1.statSync)(path).isDirectory();
|
70
87
|
}
|
71
88
|
catch {
|
72
89
|
return false;
|
@@ -78,14 +95,14 @@ function directoryExists(path) {
|
|
78
95
|
*/
|
79
96
|
function fileExists(path) {
|
80
97
|
try {
|
81
|
-
return (0,
|
98
|
+
return (0, node_fs_1.statSync)(path).isFile();
|
82
99
|
}
|
83
100
|
catch {
|
84
101
|
return false;
|
85
102
|
}
|
86
103
|
}
|
87
104
|
function createDirectory(path) {
|
88
|
-
(0,
|
105
|
+
(0, node_fs_1.mkdirSync)(path, { recursive: true });
|
89
106
|
}
|
90
107
|
function isRelativePath(path) {
|
91
108
|
return (path === '.' ||
|
@@ -102,9 +119,9 @@ function isRelativePath(path) {
|
|
102
119
|
*/
|
103
120
|
async function extractFileFromTarball(tarballPath, file, destinationFilePath) {
|
104
121
|
return new Promise((resolve, reject) => {
|
105
|
-
(0,
|
122
|
+
(0, node_fs_1.mkdirSync)((0, path_1.dirname)(destinationFilePath), { recursive: true });
|
106
123
|
var tarExtractStream = tar.extract();
|
107
|
-
const destinationFileStream = (0,
|
124
|
+
const destinationFileStream = (0, node_fs_1.createWriteStream)(destinationFilePath);
|
108
125
|
let isFileExtracted = false;
|
109
126
|
tarExtractStream.on('entry', function (header, stream, next) {
|
110
127
|
if (header.name === file) {
|
@@ -126,9 +143,9 @@ async function extractFileFromTarball(tarballPath, file, destinationFilePath) {
|
|
126
143
|
reject();
|
127
144
|
}
|
128
145
|
});
|
129
|
-
(0,
|
146
|
+
(0, node_fs_1.createReadStream)(tarballPath).pipe((0, zlib_1.createGunzip)()).pipe(tarExtractStream);
|
130
147
|
});
|
131
148
|
}
|
132
149
|
function readFileIfExisting(path) {
|
133
|
-
return (0,
|
150
|
+
return (0, node_fs_1.existsSync)(path) ? (0, node_fs_1.readFileSync)(path, 'utf-8') : '';
|
134
151
|
}
|
@@ -9,9 +9,10 @@ try {
|
|
9
9
|
const { execSync } = require('child_process');
|
10
10
|
// NOTE: Using env vars because Windows PowerShell has its own handling of quotes (") messes up quotes in args, even if escaped.
|
11
11
|
const src = process.env.NX_IMPORT_SOURCE;
|
12
|
-
execSync('git read-tree --empty', { stdio: 'inherit' });
|
12
|
+
execSync('git read-tree --empty', { stdio: 'inherit', windowsHide: true });
|
13
13
|
execSync(`git reset ${process.env.GIT_COMMIT} -- "${src}"`, {
|
14
14
|
stdio: 'inherit',
|
15
|
+
windowsHide: true,
|
15
16
|
});
|
16
17
|
}
|
17
18
|
catch (error) {
|
package/src/utils/git-utils.js
CHANGED
@@ -36,6 +36,7 @@ class GitRepository {
|
|
36
36
|
getGitRootPath(cwd) {
|
37
37
|
return (0, child_process_1.execSync)('git rev-parse --show-toplevel', {
|
38
38
|
cwd,
|
39
|
+
windowsHide: true,
|
39
40
|
})
|
40
41
|
.toString()
|
41
42
|
.trim();
|
@@ -176,6 +177,7 @@ function getGithubSlugOrNull() {
|
|
176
177
|
try {
|
177
178
|
const gitRemote = (0, child_process_1.execSync)('git remote -v', {
|
178
179
|
stdio: 'pipe',
|
180
|
+
windowsHide: true,
|
179
181
|
}).toString();
|
180
182
|
// If there are no remotes, we default to github
|
181
183
|
if (!gitRemote || gitRemote.length === 0) {
|
@@ -226,6 +228,7 @@ function commitChanges(commitMessage, directory) {
|
|
226
228
|
stdio: 'pipe',
|
227
229
|
input: commitMessage,
|
228
230
|
cwd: directory,
|
231
|
+
windowsHide: true,
|
229
232
|
});
|
230
233
|
}
|
231
234
|
catch (err) {
|
@@ -247,6 +250,7 @@ function getLatestCommitSha() {
|
|
247
250
|
return (0, child_process_1.execSync)('git rev-parse HEAD', {
|
248
251
|
encoding: 'utf8',
|
249
252
|
stdio: 'pipe',
|
253
|
+
windowsHide: true,
|
250
254
|
}).trim();
|
251
255
|
}
|
252
256
|
catch {
|
@@ -14,7 +14,9 @@ try {
|
|
14
14
|
// NOTE: Using env vars because Windows PowerShell has its own handling of quotes (") messes up quotes in args, even if escaped.
|
15
15
|
const src = process.env.NX_IMPORT_SOURCE;
|
16
16
|
const dest = process.env.NX_IMPORT_DESTINATION;
|
17
|
-
const files = execSync(`git ls-files -z ${src}
|
17
|
+
const files = execSync(`git ls-files -z ${src}`, {
|
18
|
+
windowsHide: true,
|
19
|
+
})
|
18
20
|
.toString()
|
19
21
|
.trim()
|
20
22
|
.split('\x00')
|
package/src/utils/ignore.js
CHANGED
@@ -4,7 +4,7 @@ exports.ALWAYS_IGNORE = void 0;
|
|
4
4
|
exports.getIgnoredGlobs = getIgnoredGlobs;
|
5
5
|
exports.getAlwaysIgnore = getAlwaysIgnore;
|
6
6
|
exports.getIgnoreObject = getIgnoreObject;
|
7
|
-
const
|
7
|
+
const node_fs_1 = require("node:fs");
|
8
8
|
const ignore_1 = require("ignore");
|
9
9
|
const fileutils_1 = require("./fileutils");
|
10
10
|
const path_1 = require("./path");
|
@@ -48,7 +48,7 @@ function getIgnoreObject(root = workspace_root_1.workspaceRoot) {
|
|
48
48
|
function getIgnoredGlobsFromFile(file, root) {
|
49
49
|
try {
|
50
50
|
const results = [];
|
51
|
-
const contents = (0,
|
51
|
+
const contents = (0, node_fs_1.readFileSync)(file, 'utf-8');
|
52
52
|
const lines = contents.split('\n');
|
53
53
|
for (const line of lines) {
|
54
54
|
const trimmed = line.trim();
|
@@ -15,7 +15,7 @@ exports.packageRegistryView = packageRegistryView;
|
|
15
15
|
exports.packageRegistryPack = packageRegistryPack;
|
16
16
|
const child_process_1 = require("child_process");
|
17
17
|
const fs_1 = require("fs");
|
18
|
-
const
|
18
|
+
const promises_1 = require("node:fs/promises");
|
19
19
|
const path_1 = require("path");
|
20
20
|
const semver_1 = require("semver");
|
21
21
|
const tmp_1 = require("tmp");
|
@@ -301,7 +301,7 @@ function createTempNpmDirectory() {
|
|
301
301
|
copyPackageManagerConfigurationFiles(workspace_root_1.workspaceRoot, dir);
|
302
302
|
const cleanup = async () => {
|
303
303
|
try {
|
304
|
-
await (0,
|
304
|
+
await (0, promises_1.rm)(dir, { recursive: true, force: true });
|
305
305
|
}
|
306
306
|
catch {
|
307
307
|
// It's okay if this fails, the OS will clean it up eventually
|
package/src/utils/powerpack.d.ts
CHANGED
@@ -1,5 +1,5 @@
|
|
1
1
|
export declare function printPowerpackLicense(): Promise<void>;
|
2
|
-
export declare function getPowerpackLicenseInformation(): Promise<
|
2
|
+
export declare function getPowerpackLicenseInformation(): Promise<import("@nx/powerpack-license").PowerpackLicense>;
|
3
3
|
export declare class NxPowerpackNotInstalledError extends Error {
|
4
4
|
constructor(e: Error);
|
5
5
|
}
|
package/src/utils/powerpack.js
CHANGED
@@ -9,22 +9,17 @@ const workspace_root_1 = require("./workspace-root");
|
|
9
9
|
async function printPowerpackLicense() {
|
10
10
|
try {
|
11
11
|
const { organizationName, seatCount, workspaceCount } = await getPowerpackLicenseInformation();
|
12
|
-
logger_1.logger.log(`Nx Powerpack Licensed to ${organizationName} for ${seatCount} user${seatCount > 1 ? '' : 's'} in ${workspaceCount} workspace${workspaceCount > 1 ? '' : 's'}`);
|
12
|
+
logger_1.logger.log(`Nx Powerpack Licensed to ${organizationName} for ${seatCount} user${seatCount > 1 ? '' : 's'} in ${workspaceCount === 9999 ? 'an unlimited number of' : workspaceCount} workspace${workspaceCount > 1 ? '' : 's'}`);
|
13
13
|
}
|
14
14
|
catch { }
|
15
15
|
}
|
16
16
|
async function getPowerpackLicenseInformation() {
|
17
17
|
try {
|
18
|
-
const { getPowerpackLicenseInformation } = (await Promise.resolve().then(() => require(
|
19
|
-
// @ts-ignore
|
20
|
-
'@nx/powerpack-license'
|
21
|
-
// TODO(@FrozenPandaz): Provide the right type here.
|
22
|
-
)));
|
23
|
-
// )) as typeof import('@nx/powerpack-license');
|
18
|
+
const { getPowerpackLicenseInformation } = (await Promise.resolve().then(() => require('@nx/powerpack-license')));
|
24
19
|
return getPowerpackLicenseInformation(workspace_root_1.workspaceRoot);
|
25
20
|
}
|
26
21
|
catch (e) {
|
27
|
-
if ('code' in e && e.code === '
|
22
|
+
if ('code' in e && e.code === 'MODULE_NOT_FOUND') {
|
28
23
|
throw new NxPowerpackNotInstalledError(e);
|
29
24
|
}
|
30
25
|
throw e;
|
@@ -18,6 +18,8 @@ export type SyncGeneratorRunSuccessResult = {
|
|
18
18
|
type SerializableSimpleError = {
|
19
19
|
message: string;
|
20
20
|
stack: string | undefined;
|
21
|
+
title?: string;
|
22
|
+
bodyLines?: string[];
|
21
23
|
};
|
22
24
|
export type SyncGeneratorRunErrorResult = {
|
23
25
|
generatorName: string;
|
@@ -36,16 +38,24 @@ type FlushSyncGeneratorChangesFailure = {
|
|
36
38
|
generalFailure?: SerializableSimpleError;
|
37
39
|
};
|
38
40
|
export type FlushSyncGeneratorChangesResult = FlushSyncGeneratorChangesSuccess | FlushSyncGeneratorChangesFailure;
|
41
|
+
export declare class SyncError extends Error {
|
42
|
+
title: string;
|
43
|
+
bodyLines?: string[];
|
44
|
+
constructor(title: string, bodyLines?: string[]);
|
45
|
+
}
|
39
46
|
export declare function getSyncGeneratorChanges(generators: string[]): Promise<SyncGeneratorRunResult[]>;
|
40
47
|
export declare function flushSyncGeneratorChanges(results: SyncGeneratorRunResult[]): Promise<FlushSyncGeneratorChangesResult>;
|
41
|
-
export declare function collectAllRegisteredSyncGenerators(projectGraph: ProjectGraph, nxJson: NxJsonConfiguration): Promise<
|
48
|
+
export declare function collectAllRegisteredSyncGenerators(projectGraph: ProjectGraph, nxJson: NxJsonConfiguration): Promise<{
|
49
|
+
globalGenerators: string[];
|
50
|
+
taskGenerators: string[];
|
51
|
+
}>;
|
42
52
|
export declare function runSyncGenerator(tree: Tree, generatorSpecifier: string, projects: Record<string, ProjectConfiguration>): Promise<SyncGeneratorRunResult>;
|
43
53
|
export declare function collectEnabledTaskSyncGeneratorsFromProjectGraph(projectGraph: ProjectGraph, nxJson: NxJsonConfiguration): Set<string>;
|
44
54
|
export declare function collectEnabledTaskSyncGeneratorsFromTaskGraph(taskGraph: TaskGraph, projectGraph: ProjectGraph, nxJson: NxJsonConfiguration): Set<string>;
|
45
55
|
export declare function collectRegisteredGlobalSyncGenerators(nxJson?: NxJsonConfiguration<string[] | "*">): Set<string>;
|
46
56
|
export declare function getSyncGeneratorSuccessResultsMessageLines(results: SyncGeneratorRunResult[]): string[];
|
47
|
-
export declare function getFailedSyncGeneratorsFixMessageLines(results: SyncGeneratorRunResult[], verbose: boolean): string[];
|
48
|
-
export declare function getFlushFailureMessageLines(result: FlushSyncGeneratorChangesFailure, verbose: boolean): string[];
|
57
|
+
export declare function getFailedSyncGeneratorsFixMessageLines(results: SyncGeneratorRunResult[], verbose: boolean, globalGeneratorSet?: Set<string>): string[];
|
58
|
+
export declare function getFlushFailureMessageLines(result: FlushSyncGeneratorChangesFailure, verbose: boolean, globalGeneratorSet?: Set<string>): string[];
|
49
59
|
export declare function processSyncGeneratorResultErrors(results: SyncGeneratorRunResult[]): {
|
50
60
|
failedGeneratorsCount: number;
|
51
61
|
areAllResultsFailures: boolean;
|
@@ -1,5 +1,6 @@
|
|
1
1
|
"use strict";
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
3
|
+
exports.SyncError = void 0;
|
3
4
|
exports.getSyncGeneratorChanges = getSyncGeneratorChanges;
|
4
5
|
exports.flushSyncGeneratorChanges = flushSyncGeneratorChanges;
|
5
6
|
exports.collectAllRegisteredSyncGenerators = collectAllRegisteredSyncGenerators;
|
@@ -22,6 +23,15 @@ const project_graph_1 = require("../project-graph/project-graph");
|
|
22
23
|
const workspace_context_1 = require("./workspace-context");
|
23
24
|
const workspace_root_1 = require("./workspace-root");
|
24
25
|
const chalk = require("chalk");
|
26
|
+
class SyncError extends Error {
|
27
|
+
constructor(title, bodyLines) {
|
28
|
+
super(title);
|
29
|
+
this.title = title;
|
30
|
+
this.bodyLines = bodyLines;
|
31
|
+
this.name = this.constructor.name;
|
32
|
+
}
|
33
|
+
}
|
34
|
+
exports.SyncError = SyncError;
|
25
35
|
async function getSyncGeneratorChanges(generators) {
|
26
36
|
perf_hooks_1.performance.mark('get-sync-generators-changes:start');
|
27
37
|
let results;
|
@@ -43,10 +53,12 @@ async function flushSyncGeneratorChanges(results) {
|
|
43
53
|
}
|
44
54
|
async function collectAllRegisteredSyncGenerators(projectGraph, nxJson) {
|
45
55
|
if (!client_1.daemonClient.enabled()) {
|
46
|
-
return
|
47
|
-
...
|
48
|
-
|
49
|
-
|
56
|
+
return {
|
57
|
+
globalGenerators: [...collectRegisteredGlobalSyncGenerators()],
|
58
|
+
taskGenerators: [
|
59
|
+
...collectEnabledTaskSyncGeneratorsFromProjectGraph(projectGraph, nxJson),
|
60
|
+
],
|
61
|
+
};
|
50
62
|
}
|
51
63
|
return await client_1.daemonClient.getRegisteredSyncGenerators();
|
52
64
|
}
|
@@ -75,7 +87,7 @@ async function runSyncGenerator(tree, generatorSpecifier, projects) {
|
|
75
87
|
catch (e) {
|
76
88
|
return {
|
77
89
|
generatorName: generatorSpecifier,
|
78
|
-
error:
|
90
|
+
error: toSerializableError(e),
|
79
91
|
};
|
80
92
|
}
|
81
93
|
}
|
@@ -140,28 +152,48 @@ function getSyncGeneratorSuccessResultsMessageLines(results) {
|
|
140
152
|
}
|
141
153
|
return messageLines;
|
142
154
|
}
|
143
|
-
function getFailedSyncGeneratorsFixMessageLines(results, verbose) {
|
155
|
+
function getFailedSyncGeneratorsFixMessageLines(results, verbose, globalGeneratorSet = new Set()) {
|
144
156
|
const messageLines = [];
|
145
|
-
const
|
157
|
+
const globalGenerators = [];
|
158
|
+
const taskGenerators = [];
|
159
|
+
let isFirst = true;
|
146
160
|
for (const result of results) {
|
147
161
|
if ('error' in result) {
|
148
|
-
|
149
|
-
|
150
|
-
|
162
|
+
if (!isFirst) {
|
163
|
+
messageLines.push('');
|
164
|
+
}
|
165
|
+
isFirst = false;
|
166
|
+
messageLines.push(`The ${chalk.bold(result.generatorName)} sync generator reported the following error:`, '', errorToString(result.error, verbose));
|
167
|
+
if (globalGeneratorSet.has(result.generatorName)) {
|
168
|
+
globalGenerators.push(result.generatorName);
|
169
|
+
}
|
170
|
+
else {
|
171
|
+
taskGenerators.push(result.generatorName);
|
172
|
+
}
|
151
173
|
}
|
152
174
|
}
|
153
|
-
messageLines.push(...getFailedSyncGeneratorsMessageLines(
|
175
|
+
messageLines.push(...getFailedSyncGeneratorsMessageLines(taskGenerators, globalGenerators, verbose));
|
154
176
|
return messageLines;
|
155
177
|
}
|
156
|
-
function getFlushFailureMessageLines(result, verbose) {
|
178
|
+
function getFlushFailureMessageLines(result, verbose, globalGeneratorSet = new Set()) {
|
157
179
|
const messageLines = [];
|
158
|
-
const
|
180
|
+
const globalGenerators = [];
|
181
|
+
const taskGenerators = [];
|
182
|
+
let isFirst = true;
|
159
183
|
for (const failure of result.generatorFailures) {
|
160
|
-
|
161
|
-
|
162
|
-
|
184
|
+
if (!isFirst) {
|
185
|
+
messageLines.push('');
|
186
|
+
}
|
187
|
+
isFirst = false;
|
188
|
+
messageLines.push(`The ${chalk.bold(failure.generator)} sync generator failed to apply its changes with the following error:`, '', errorToString(failure.error, verbose));
|
189
|
+
if (globalGeneratorSet.has(failure.generator)) {
|
190
|
+
globalGenerators.push(failure.generator);
|
191
|
+
}
|
192
|
+
else {
|
193
|
+
taskGenerators.push(failure.generator);
|
194
|
+
}
|
163
195
|
}
|
164
|
-
messageLines.push(...getFailedSyncGeneratorsMessageLines(
|
196
|
+
messageLines.push(...getFailedSyncGeneratorsMessageLines(taskGenerators, globalGenerators, verbose));
|
165
197
|
if (result.generalFailure) {
|
166
198
|
if (messageLines.length > 0) {
|
167
199
|
messageLines.push('');
|
@@ -242,7 +274,7 @@ async function flushSyncGeneratorChangesToDisk(results) {
|
|
242
274
|
catch (e) {
|
243
275
|
generatorFailures.push({
|
244
276
|
generator: result.generatorName,
|
245
|
-
error:
|
277
|
+
error: toSerializableError(e),
|
246
278
|
});
|
247
279
|
}
|
248
280
|
}
|
@@ -255,25 +287,67 @@ async function flushSyncGeneratorChangesToDisk(results) {
|
|
255
287
|
catch (e) {
|
256
288
|
return {
|
257
289
|
generatorFailures,
|
258
|
-
generalFailure:
|
290
|
+
generalFailure: toSerializableError(e),
|
259
291
|
};
|
260
292
|
}
|
261
293
|
return generatorFailures.length > 0
|
262
294
|
? { generatorFailures }
|
263
295
|
: { success: true };
|
264
296
|
}
|
265
|
-
function getFailedSyncGeneratorsMessageLines(
|
297
|
+
function getFailedSyncGeneratorsMessageLines(taskGenerators, globalGenerators, verbose) {
|
266
298
|
const messageLines = [];
|
267
|
-
if (
|
299
|
+
if (taskGenerators.length + globalGenerators.length === 1) {
|
268
300
|
messageLines.push('', verbose
|
269
301
|
? 'Please check the error above and address the issue.'
|
270
|
-
: 'Please check the error above and address the issue. You can provide the `--verbose` flag to get more details.'
|
302
|
+
: 'Please check the error above and address the issue. You can provide the `--verbose` flag to get more details.');
|
303
|
+
if (taskGenerators.length === 1) {
|
304
|
+
messageLines.push(`If needed, you can disable the failing sync generator by setting \`sync.disabledTaskSyncGenerators: ["${taskGenerators[0]}"]\` in your \`nx.json\`.`);
|
305
|
+
}
|
306
|
+
else {
|
307
|
+
messageLines.push(`If needed, you can remove the failing global sync generator "${globalGenerators[0]}" from the \`sync.globalGenerators\` array in your \`nx.json\`.`);
|
308
|
+
}
|
271
309
|
}
|
272
|
-
else if (
|
273
|
-
const generatorsString = generators.map((g) => `"${g}"`).join(', ');
|
310
|
+
else if (taskGenerators.length + globalGenerators.length > 1) {
|
274
311
|
messageLines.push('', verbose
|
275
312
|
? 'Please check the errors above and address the issues.'
|
276
|
-
: 'Please check the errors above and address the issues. You can provide the `--verbose` flag to get more details.'
|
313
|
+
: 'Please check the errors above and address the issues. You can provide the `--verbose` flag to get more details.');
|
314
|
+
if (taskGenerators.length > 0) {
|
315
|
+
const generatorsString = taskGenerators.map((g) => `"${g}"`).join(', ');
|
316
|
+
messageLines.push(`If needed, you can disable the failing task sync generators by setting \`sync.disabledTaskSyncGenerators: [${generatorsString}]\` in your \`nx.json\`.`);
|
317
|
+
}
|
318
|
+
if (globalGenerators.length > 0) {
|
319
|
+
const lastGenerator = globalGenerators.pop();
|
320
|
+
const generatorsString = globalGenerators.length > 0
|
321
|
+
? `${globalGenerators
|
322
|
+
.map((g) => `"${g}"`)
|
323
|
+
.join(', ')} and "${lastGenerator}"`
|
324
|
+
: `"${lastGenerator}"`;
|
325
|
+
messageLines.push(`If needed, you can remove the failing global sync generators ${generatorsString} from the \`sync.globalGenerators\` array in your \`nx.json\`.`);
|
326
|
+
}
|
277
327
|
}
|
278
328
|
return messageLines;
|
279
329
|
}
|
330
|
+
function errorToString(error, verbose) {
|
331
|
+
if (error.title) {
|
332
|
+
let message = ` ${chalk.red(error.title)}`;
|
333
|
+
if (error.bodyLines?.length) {
|
334
|
+
message += `
|
335
|
+
|
336
|
+
${error.bodyLines
|
337
|
+
.map((bodyLine) => `${bodyLine.split('\n').join('\n ')}`)
|
338
|
+
.join('\n ')}`;
|
339
|
+
return message;
|
340
|
+
}
|
341
|
+
}
|
342
|
+
return ` ${chalk.red(error.message)}${verbose && error.stack ? '\n ' + error.stack : ''}`;
|
343
|
+
}
|
344
|
+
function toSerializableError(error) {
|
345
|
+
return error instanceof SyncError
|
346
|
+
? {
|
347
|
+
title: error.title,
|
348
|
+
bodyLines: error.bodyLines,
|
349
|
+
message: error.message,
|
350
|
+
stack: error.stack,
|
351
|
+
}
|
352
|
+
: { message: error.message, stack: error.stack };
|
353
|
+
}
|
@@ -12,6 +12,6 @@ export declare class TaskHistory {
|
|
12
12
|
}
|
13
13
|
/**
|
14
14
|
* This function returns the singleton instance of TaskHistory
|
15
|
-
* @returns singleton instance of TaskHistory
|
15
|
+
* @returns singleton instance of TaskHistory, null if database is disabled or WASM is not enabled
|
16
16
|
*/
|
17
|
-
export declare function getTaskHistory(): TaskHistory;
|
17
|
+
export declare function getTaskHistory(): TaskHistory | null;
|
@@ -38,9 +38,12 @@ exports.TaskHistory = TaskHistory;
|
|
38
38
|
let taskHistory;
|
39
39
|
/**
|
40
40
|
* This function returns the singleton instance of TaskHistory
|
41
|
-
* @returns singleton instance of TaskHistory
|
41
|
+
* @returns singleton instance of TaskHistory, null if database is disabled or WASM is not enabled
|
42
42
|
*/
|
43
43
|
function getTaskHistory() {
|
44
|
+
if (process.env.NX_DISABLE_DB === 'true' || !native_1.IS_WASM) {
|
45
|
+
return null;
|
46
|
+
}
|
44
47
|
if (!taskHistory) {
|
45
48
|
taskHistory = new TaskHistory();
|
46
49
|
}
|