-
Notifications
You must be signed in to change notification settings - Fork 2.2k
/
init-local.ts
148 lines (135 loc) · 4.14 KB
/
init-local.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
import { getPackageManagerCommand } from '../src/utils/package-manager';
import { performance } from 'perf_hooks';
import { execSync } from 'child_process';
import { commandsObject } from '../src/command-line/nx-commands';
import { WorkspaceTypeAndRoot } from '../src/utils/find-workspace-root';
/**
* Nx is being run inside a workspace.
*
* @param workspace Relevant local workspace properties
*/
process.env.NX_CLI_SET = 'true';
export function initLocal(workspace: WorkspaceTypeAndRoot) {
try {
performance.mark('init-local');
require('nx/src/utils/perf-logging');
if (workspace.type !== 'nx' && shouldDelegateToAngularCLI()) {
handleAngularCLIFallbacks(workspace);
return;
}
if (isKnownCommand()) {
commandsObject.argv;
} else {
const newArgs = rewritePositionalArguments();
commandsObject.parse(newArgs);
}
} catch (e) {
console.error(e.message);
process.exit(1);
}
}
function rewritePositionalArguments() {
if (!process.argv[3] || process.argv[3].startsWith('-')) {
return [
'run',
`${wrapIntoQuotesIfNeeded(process.argv[2])}`,
...process.argv.slice(3),
];
} else {
return [
'run',
`${process.argv[3]}:${wrapIntoQuotesIfNeeded(process.argv[2])}`,
...process.argv.slice(4),
];
}
}
function wrapIntoQuotesIfNeeded(arg: string) {
return arg.indexOf(':') > -1 ? `"${arg}"` : arg;
}
function isKnownCommand() {
const commands = [
...Object.keys(
(commandsObject as any)
.getInternalMethods()
.getCommandInstance()
.getCommandHandlers()
),
'g',
'dep-graph',
'affected:dep-graph',
'format',
'workspace-schematic',
'clear-cache',
'help',
];
return (
!process.argv[2] ||
process.argv[2].startsWith('-') ||
commands.indexOf(process.argv[2]) > -1
);
}
function shouldDelegateToAngularCLI() {
const command = process.argv[2];
const commands = ['add', 'analytics', 'deploy', 'config', 'doc', 'update'];
return commands.indexOf(command) > -1;
}
function handleAngularCLIFallbacks(workspace: WorkspaceTypeAndRoot) {
if (process.argv[2] === 'update' && process.env.FORCE_NG_UPDATE != 'true') {
console.log(
`Nx provides a much improved version of "ng update". It runs the same migrations, but allows you to:`
);
console.log(`- rerun the same migration multiple times`);
console.log(`- reorder migrations, skip migrations`);
console.log(`- fix migrations that "almost work"`);
console.log(`- commit a partially migrated state`);
console.log(
`- change versions of packages to match organizational requirements`
);
console.log(
`And, in general, it is lot more reliable for non-trivial workspaces. Read more at: https://nx.dev/getting-started/nx-and-angular#ng-update-and-nx-migrate`
);
console.log(
`Run "nx migrate latest" to update to the latest version of Nx.`
);
console.log(
`Running "ng update" can still be useful in some dev workflows, so we aren't planning to remove it.`
);
console.log(`If you need to use it, run "FORCE_NG_UPDATE=true ng update".`);
} else if (process.argv[2] === 'add') {
console.log('Ng add is not natively supported by Nx');
const pkg = process.argv[2] === 'add' ? process.argv[3] : process.argv[4];
if (!pkg) {
process.exit(1);
}
const pm = getPackageManagerCommand();
const cmd = `${pm.add} ${pkg} && ${pm.exec} nx g ${pkg}:ng-add`;
console.log(`Instead, we recommend running \`${cmd}\``);
import('enquirer').then((x) =>
x
.prompt<{ c: boolean }>({
name: 'c',
type: 'confirm',
message: 'Run this command?',
})
.then(({ c }) => {
if (c) {
execSync(cmd, { stdio: 'inherit' });
}
})
);
} else {
require('nx/src/adapter/compat');
try {
const cli = require.resolve('@angular/cli/lib/init.js', {
paths: [workspace.dir],
});
require(cli);
} catch (e) {
console.error(
`Could not find '@angular/cli/lib/init.js' module in this workspace.`,
e
);
process.exit(1);
}
}
}