create-nx-workspace 22.5.2 → 22.5.4
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/bin/create-nx-workspace.d.ts.map +1 -1
- package/bin/create-nx-workspace.js +30 -41
- package/package.json +1 -1
- package/src/create-workspace-options.d.ts +6 -1
- package/src/create-workspace-options.d.ts.map +1 -1
- package/src/create-workspace.d.ts.map +1 -1
- package/src/create-workspace.js +66 -55
- package/src/internal-utils/prompts.d.ts +1 -1
- package/src/internal-utils/prompts.d.ts.map +1 -1
- package/src/internal-utils/prompts.js +12 -46
- package/src/utils/nx/ab-testing.d.ts.map +1 -1
- package/src/utils/nx/ab-testing.js +13 -58
- package/src/utils/nx/messages.d.ts +1 -1
- package/src/utils/nx/messages.d.ts.map +1 -1
- package/src/utils/nx/messages.js +6 -9
- package/src/utils/nx/nx-cloud.d.ts +3 -3
- package/src/utils/nx/nx-cloud.d.ts.map +1 -1
- package/src/utils/nx/nx-cloud.js +21 -15
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"create-nx-workspace.d.ts","sourceRoot":"","sources":["../../../../packages/create-nx-workspace/bin/create-nx-workspace.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"create-nx-workspace.d.ts","sourceRoot":"","sources":["../../../../packages/create-nx-workspace/bin/create-nx-workspace.ts"],"names":[],"mappings":"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"}
|
|
@@ -165,7 +165,7 @@ exports.commandsObject = yargs
|
|
|
165
165
|
const errorCode = error instanceof error_utils_1.CnwError ? error.code : 'UNKNOWN';
|
|
166
166
|
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
167
167
|
const errorFile = error instanceof Error ? extractErrorFile(error) : undefined;
|
|
168
|
-
useCloud = argv.nxCloud !== 'skip';
|
|
168
|
+
useCloud = argv.nxCloud !== 'skip' && argv.nxCloud !== 'never';
|
|
169
169
|
await (0, ab_testing_1.recordStat)({
|
|
170
170
|
nxVersion: nx_version_1.nxVersion,
|
|
171
171
|
command: 'create-nx-workspace',
|
|
@@ -276,7 +276,7 @@ async function main(parsedArgs) {
|
|
|
276
276
|
await (0, ab_testing_1.recordStat)({
|
|
277
277
|
nxVersion: nx_version_1.nxVersion,
|
|
278
278
|
command: 'create-nx-workspace',
|
|
279
|
-
useCloud: parsedArgs.nxCloud !== 'skip',
|
|
279
|
+
useCloud: parsedArgs.nxCloud !== 'skip' && parsedArgs.nxCloud !== 'never',
|
|
280
280
|
meta: {
|
|
281
281
|
type: 'complete',
|
|
282
282
|
flowVariant: (0, ab_testing_1.getFlowVariant)(),
|
|
@@ -404,7 +404,7 @@ async function normalizeArgsMiddleware(argv) {
|
|
|
404
404
|
await (0, ab_testing_1.recordStat)({
|
|
405
405
|
nxVersion: nx_version_1.nxVersion,
|
|
406
406
|
command: 'create-nx-workspace',
|
|
407
|
-
useCloud: argv.nxCloud !== 'skip',
|
|
407
|
+
useCloud: argv.nxCloud !== 'skip' && argv.nxCloud !== 'never',
|
|
408
408
|
meta: {
|
|
409
409
|
type: 'start',
|
|
410
410
|
flowVariant: (0, ab_testing_1.getFlowVariant)(),
|
|
@@ -424,23 +424,36 @@ async function normalizeArgsMiddleware(argv) {
|
|
|
424
424
|
const ghAvailable = (0, git_1.isGhCliAvailable)();
|
|
425
425
|
let nxCloud;
|
|
426
426
|
let completionMessageKey;
|
|
427
|
+
let skipCloudConnect = false;
|
|
428
|
+
let neverConnectToCloud = false;
|
|
427
429
|
if (argv.skipGit === true) {
|
|
428
430
|
nxCloud = 'skip';
|
|
429
431
|
completionMessageKey = undefined;
|
|
430
432
|
}
|
|
431
433
|
else {
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
|
|
434
|
+
const cloudChoice = await (0, prompts_1.determineNxCloudV2)(argv);
|
|
435
|
+
if (cloudChoice === 'yes') {
|
|
436
|
+
nxCloud = 'yes';
|
|
437
|
+
skipCloudConnect = false;
|
|
438
|
+
}
|
|
439
|
+
else if (cloudChoice === 'skip') {
|
|
440
|
+
nxCloud = 'skip';
|
|
441
|
+
}
|
|
442
|
+
else {
|
|
443
|
+
nxCloud = 'never';
|
|
444
|
+
neverConnectToCloud = true;
|
|
445
|
+
}
|
|
435
446
|
completionMessageKey =
|
|
436
|
-
|
|
447
|
+
cloudChoice === 'never'
|
|
448
|
+
? undefined
|
|
449
|
+
: (0, ab_testing_1.getCompletionMessageKeyForVariant)();
|
|
437
450
|
}
|
|
438
451
|
packageManager = argv.packageManager ?? (0, package_manager_1.detectInvokedPackageManager)();
|
|
439
452
|
Object.assign(argv, {
|
|
440
453
|
nxCloud,
|
|
441
|
-
useGitHub: nxCloud !== 'skip',
|
|
442
|
-
|
|
443
|
-
|
|
454
|
+
useGitHub: nxCloud !== 'skip' && nxCloud !== 'never',
|
|
455
|
+
skipCloudConnect,
|
|
456
|
+
neverConnectToCloud,
|
|
444
457
|
completionMessageKey,
|
|
445
458
|
packageManager,
|
|
446
459
|
defaultBase: 'main',
|
|
@@ -450,7 +463,7 @@ async function normalizeArgsMiddleware(argv) {
|
|
|
450
463
|
await (0, ab_testing_1.recordStat)({
|
|
451
464
|
nxVersion: nx_version_1.nxVersion,
|
|
452
465
|
command: 'create-nx-workspace',
|
|
453
|
-
useCloud: nxCloud !== 'skip',
|
|
466
|
+
useCloud: nxCloud !== 'skip' && nxCloud !== 'never',
|
|
454
467
|
meta: {
|
|
455
468
|
type: 'precreate',
|
|
456
469
|
flowVariant: (0, ab_testing_1.getFlowVariant)(),
|
|
@@ -482,38 +495,14 @@ async function normalizeArgsMiddleware(argv) {
|
|
|
482
495
|
packageManager = await (0, prompts_1.determinePackageManager)(argv);
|
|
483
496
|
const aiAgents = await (0, prompts_1.determineAiAgents)(argv);
|
|
484
497
|
const defaultBase = await (0, prompts_1.determineDefaultBase)(argv);
|
|
485
|
-
//
|
|
486
|
-
const
|
|
487
|
-
|
|
488
|
-
|
|
489
|
-
|
|
490
|
-
let skipCloudConnect = false;
|
|
491
|
-
if (argv.skipGit === true) {
|
|
492
|
-
nxCloud = 'skip';
|
|
493
|
-
useGitHub = undefined;
|
|
494
|
-
}
|
|
495
|
-
else if (cliNxCloudArgProvided) {
|
|
496
|
-
// CLI arg provided: use existing flow (CI provider selection if needed)
|
|
497
|
-
nxCloud = await (0, prompts_1.determineNxCloud)(argv);
|
|
498
|
-
useGitHub =
|
|
499
|
-
nxCloud === 'skip'
|
|
500
|
-
? undefined
|
|
501
|
-
: nxCloud === 'github' || (await (0, prompts_1.determineIfGitHubWillBeUsed)(argv));
|
|
502
|
-
}
|
|
503
|
-
else {
|
|
504
|
-
// No CLI arg: use simplified prompt (same as template flow)
|
|
505
|
-
nxCloud = await (0, prompts_1.determineNxCloudV2)(argv);
|
|
506
|
-
useGitHub = nxCloud !== 'skip';
|
|
507
|
-
completionMessageKey =
|
|
508
|
-
nxCloud === 'skip' ? undefined : (0, ab_testing_1.getCompletionMessageKeyForVariant)();
|
|
509
|
-
// Deferred connection: skip cloud connect but show banner (CLOUD-4255)
|
|
510
|
-
skipCloudConnect = nxCloud !== 'skip';
|
|
511
|
-
}
|
|
498
|
+
// NXC-4020: Restored v22.1.3 simple flow (CI prompt → caching fallback)
|
|
499
|
+
const nxCloud = argv.skipGit === true ? 'skip' : await (0, prompts_1.determineNxCloud)(argv);
|
|
500
|
+
const useGitHub = nxCloud === 'skip'
|
|
501
|
+
? undefined
|
|
502
|
+
: nxCloud === 'github' || (await (0, prompts_1.determineIfGitHubWillBeUsed)(argv));
|
|
512
503
|
Object.assign(argv, {
|
|
513
504
|
nxCloud,
|
|
514
505
|
useGitHub,
|
|
515
|
-
skipCloudConnect,
|
|
516
|
-
completionMessageKey,
|
|
517
506
|
packageManager,
|
|
518
507
|
defaultBase,
|
|
519
508
|
aiAgents,
|
|
@@ -522,7 +511,7 @@ async function normalizeArgsMiddleware(argv) {
|
|
|
522
511
|
await (0, ab_testing_1.recordStat)({
|
|
523
512
|
nxVersion: nx_version_1.nxVersion,
|
|
524
513
|
command: 'create-nx-workspace',
|
|
525
|
-
useCloud: nxCloud !== 'skip',
|
|
514
|
+
useCloud: nxCloud !== 'skip' && nxCloud !== 'never',
|
|
526
515
|
meta: {
|
|
527
516
|
type: 'precreate',
|
|
528
517
|
flowVariant: (0, ab_testing_1.getFlowVariant)(),
|
package/package.json
CHANGED
|
@@ -41,10 +41,15 @@ export interface CreateWorkspaceOptions {
|
|
|
41
41
|
cliName?: string;
|
|
42
42
|
aiAgents?: Agent[];
|
|
43
43
|
/**
|
|
44
|
-
* @description Skip cloud connection (
|
|
44
|
+
* @description Skip cloud connection (deferred - show banner but don't write nxCloudId)
|
|
45
45
|
* @default false
|
|
46
46
|
*/
|
|
47
47
|
skipCloudConnect?: boolean;
|
|
48
|
+
/**
|
|
49
|
+
* @description Set neverConnectToCloud in nx.json (full opt-out)
|
|
50
|
+
* @default false
|
|
51
|
+
*/
|
|
52
|
+
neverConnectToCloud?: boolean;
|
|
48
53
|
/**
|
|
49
54
|
* @description Whether GitHub CLI (gh) is available on the system (for telemetry)
|
|
50
55
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"create-workspace-options.d.ts","sourceRoot":"","sources":["../../../../packages/create-nx-workspace/src/create-workspace-options.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAC9C,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAChE,OAAO,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAEzD,MAAM,WAAW,sBAAsB;IACrC,IAAI,EAAE,MAAM,CAAC;IACb,cAAc,EAAE,cAAc,CAAC;IAC/B,OAAO,EAAE,OAAO,CAAC;IACjB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,oBAAoB,CAAC,EAAE,oBAAoB,CAAC;IAC5C;;;OAGG;IACH,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB;;;OAGG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB;;;OAGG;IACH,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB;;;OAGG;IACH,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB;;;OAGG;IACH,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,MAAM,CAAC,EAAE;QACP,IAAI,EAAE,MAAM,CAAC;QACb,KAAK,EAAE,MAAM,CAAC;QACd,OAAO,EAAE,MAAM,CAAC;KACjB,CAAC;IACF,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,KAAK,EAAE,CAAC;IACnB;;;OAGG;IACH,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B;;OAEG;IACH,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;AAED,eAAO,MAAM,eAAe,yEAOlB,CAAC;AACX,MAAM,MAAM,KAAK,GAAG,CAAC,OAAO,eAAe,CAAC,CAAC,MAAM,CAAC,CAAC;AACrD,eAAO,MAAM,eAAe,EAAE,MAAM,CAAC,KAAK,EAAE,MAAM,CAOjD,CAAC"}
|
|
1
|
+
{"version":3,"file":"create-workspace-options.d.ts","sourceRoot":"","sources":["../../../../packages/create-nx-workspace/src/create-workspace-options.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAC9C,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAChE,OAAO,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAEzD,MAAM,WAAW,sBAAsB;IACrC,IAAI,EAAE,MAAM,CAAC;IACb,cAAc,EAAE,cAAc,CAAC;IAC/B,OAAO,EAAE,OAAO,CAAC;IACjB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,oBAAoB,CAAC,EAAE,oBAAoB,CAAC;IAC5C;;;OAGG;IACH,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB;;;OAGG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB;;;OAGG;IACH,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB;;;OAGG;IACH,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB;;;OAGG;IACH,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,MAAM,CAAC,EAAE;QACP,IAAI,EAAE,MAAM,CAAC;QACb,KAAK,EAAE,MAAM,CAAC;QACd,OAAO,EAAE,MAAM,CAAC;KACjB,CAAC;IACF,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,KAAK,EAAE,CAAC;IACnB;;;OAGG;IACH,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B;;;OAGG;IACH,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAC9B;;OAEG;IACH,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;AAED,eAAO,MAAM,eAAe,yEAOlB,CAAC;AACX,MAAM,MAAM,KAAK,GAAG,CAAC,OAAO,eAAe,CAAC,CAAC,MAAM,CAAC,CAAC;AACrD,eAAO,MAAM,eAAe,EAAE,MAAM,CAAC,KAAK,EAAE,MAAM,CAOjD,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"create-workspace.d.ts","sourceRoot":"","sources":["../../../../packages/create-nx-workspace/src/create-workspace.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,sBAAsB,EAAE,MAAM,4BAA4B,CAAC;AAGpE,OAAO,EAGL,aAAa,EACd,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"create-workspace.d.ts","sourceRoot":"","sources":["../../../../packages/create-nx-workspace/src/create-workspace.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,sBAAsB,EAAE,MAAM,4BAA4B,CAAC;AAGpE,OAAO,EAGL,aAAa,EACd,MAAM,iBAAiB,CAAC;AA4BzB,wBAAgB,4BAA4B,IAAI;IAC9C,SAAS,EAAE,MAAM,GAAG,SAAS,CAAC;IAC9B,UAAU,EAAE,MAAM,GAAG,SAAS,CAAC;CAChC,CAEA;AAED,wBAAsB,eAAe,CAAC,CAAC,SAAS,sBAAsB,EACpE,MAAM,EAAE,MAAM,GAAG,SAAS,EAC1B,OAAO,EAAE,CAAC,EACV,OAAO,CAAC,EAAE,CAAC;;;;;GA+QZ;AAED,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAI7D"}
|
package/src/create-workspace.js
CHANGED
|
@@ -82,26 +82,25 @@ async function createWorkspace(preset, options, rawArgs) {
|
|
|
82
82
|
throw e;
|
|
83
83
|
}
|
|
84
84
|
// Connect to Nx Cloud for template flow
|
|
85
|
-
|
|
86
|
-
|
|
85
|
+
if (nxCloud !== 'skip' &&
|
|
86
|
+
nxCloud !== 'never' &&
|
|
87
|
+
!options.skipCloudConnect) {
|
|
87
88
|
await (0, nx_cloud_1.connectToNxCloudForTemplate)(directory, 'create-nx-workspace', useGitHub);
|
|
88
89
|
}
|
|
89
90
|
}
|
|
90
91
|
else {
|
|
91
|
-
// Preset flow
|
|
92
|
+
// NXC-4020: Preset flow — restored to match v22.1.3
|
|
92
93
|
if (!preset) {
|
|
93
94
|
throw new Error('Preset is required when not using a template. Please provide --preset or --template.');
|
|
94
95
|
}
|
|
95
96
|
const tmpDir = await (0, create_sandbox_1.createSandbox)(packageManager);
|
|
96
97
|
const workspaceGlobs = getWorkspaceGlobsFromPreset(preset);
|
|
97
|
-
//
|
|
98
|
+
// NXC-4020: Pass actual nxCloud value (v22.1.3 behavior) so nxCloudId is set in nx.json
|
|
99
|
+
// Previous: nxCloud: 'skip' override to defer cloud connection
|
|
98
100
|
directory = await (0, create_empty_workspace_1.createEmptyWorkspace)(tmpDir, name, packageManager, {
|
|
99
101
|
...options,
|
|
100
102
|
preset,
|
|
101
103
|
workspaceGlobs,
|
|
102
|
-
// We want new workspaces to have a short URL to finish Cloud onboarding, but not have nxCloudId set up since it will be handled as part of the onboarding flow.
|
|
103
|
-
// This is skipping nxCloudId for the "custom" flow.
|
|
104
|
-
nxCloud: 'skip',
|
|
105
104
|
});
|
|
106
105
|
// Mark workspace as ready for SIGINT handler
|
|
107
106
|
workspaceDirectory = directory;
|
|
@@ -114,11 +113,33 @@ async function createWorkspace(preset, options, rawArgs) {
|
|
|
114
113
|
}
|
|
115
114
|
}
|
|
116
115
|
const isTemplate = !!options.template;
|
|
117
|
-
//
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
116
|
+
// Handle "Never" opt-out: set neverConnectToCloud in nx.json
|
|
117
|
+
if (options.neverConnectToCloud) {
|
|
118
|
+
(0, nx_cloud_1.setNeverConnectToCloud)(directory);
|
|
119
|
+
}
|
|
120
|
+
// NXC-4020: Preset flow cloud handling matches v22.1.3 exactly:
|
|
121
|
+
// 1. Read token (cloud was connected during createEmptyWorkspace)
|
|
122
|
+
// 2. Setup CI for specific providers (not 'yes')
|
|
123
|
+
// 3. Generate onboarding URL
|
|
124
|
+
// 4. Git init with connectUrl
|
|
125
|
+
// 5. Show completion message
|
|
126
|
+
let connectUrl;
|
|
127
|
+
let nxCloudInfo;
|
|
128
|
+
if (!isTemplate && nxCloud !== 'skip' && nxCloud !== 'never') {
|
|
129
|
+
const token = (0, nx_cloud_1.readNxCloudToken)(directory);
|
|
130
|
+
if (nxCloud !== 'yes') {
|
|
131
|
+
await (0, setup_ci_1.setupCI)(directory, nxCloud, packageManager);
|
|
132
|
+
}
|
|
133
|
+
connectUrl = await (0, nx_cloud_1.createNxCloudOnboardingUrl)(nxCloud, token, directory, useGitHub);
|
|
134
|
+
// Store for SIGINT handler
|
|
135
|
+
cloudConnectUrl = connectUrl;
|
|
136
|
+
}
|
|
137
|
+
// Template flow: CI setup and cloud connection handled separately
|
|
138
|
+
if (isTemplate &&
|
|
139
|
+
nxCloud !== 'skip' &&
|
|
140
|
+
nxCloud !== 'never' &&
|
|
141
|
+
nxCloud !== 'yes') {
|
|
142
|
+
await (0, setup_ci_1.setupCI)(directory, nxCloud, packageManager);
|
|
122
143
|
}
|
|
123
144
|
let pushedToVcs = git_1.VcsPushStatus.SkippedGit;
|
|
124
145
|
if (!skipGit) {
|
|
@@ -127,13 +148,11 @@ async function createWorkspace(preset, options, rawArgs) {
|
|
|
127
148
|
(0, ai_output_1.logProgress)('initializing', 'Initializing git repository...');
|
|
128
149
|
}
|
|
129
150
|
try {
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
// -
|
|
133
|
-
//
|
|
134
|
-
if (commit &&
|
|
135
|
-
!skipGitHubPush &&
|
|
136
|
-
(nxCloud === 'github' || nxCloud === 'yes')) {
|
|
151
|
+
// NXC-4020: Pass connectUrl to git init (v22.1.3 behavior)
|
|
152
|
+
await (0, git_1.initializeGitRepo)(directory, { defaultBase, commit, connectUrl });
|
|
153
|
+
// NXC-4020: Only push for github CI provider (v22.1.3 behavior)
|
|
154
|
+
// Previous: also pushed for nxCloud === 'yes'
|
|
155
|
+
if (commit && !skipGitHubPush && nxCloud === 'github') {
|
|
137
156
|
pushedToVcs = await (0, git_1.pushToGitHub)(directory, {
|
|
138
157
|
skipGitHubPush,
|
|
139
158
|
name,
|
|
@@ -144,60 +163,52 @@ async function createWorkspace(preset, options, rawArgs) {
|
|
|
144
163
|
}
|
|
145
164
|
catch (e) {
|
|
146
165
|
if (e instanceof Error) {
|
|
147
|
-
if (!
|
|
166
|
+
if (!(0, ai_output_1.isAiAgent)()) {
|
|
148
167
|
output_1.output.error({
|
|
149
168
|
title: 'Could not initialize git repository',
|
|
150
169
|
bodyLines: (0, error_utils_1.mapErrorToBodyLines)(e),
|
|
151
170
|
});
|
|
152
171
|
}
|
|
153
|
-
// In AI mode, error will be handled by the caller
|
|
154
172
|
}
|
|
155
173
|
else {
|
|
156
174
|
console.error(e);
|
|
157
175
|
}
|
|
158
176
|
}
|
|
159
177
|
}
|
|
160
|
-
//
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
: (0, nx_cloud_1.readNxCloudToken)(directory);
|
|
177
|
-
connectUrl = await (0, nx_cloud_1.createNxCloudOnboardingUrl)(nxCloud, token, directory, useGitHub);
|
|
178
|
-
// Store for SIGINT handler
|
|
179
|
-
cloudConnectUrl = connectUrl;
|
|
180
|
-
// Update README with connect URL (strips markers, adds connect section)
|
|
181
|
-
// Then commit the change - amend if not pushed, new commit if already pushed
|
|
182
|
-
if (isTemplate) {
|
|
178
|
+
// NXC-4020: Preset flow completion message matches v22.1.3
|
|
179
|
+
if (!isTemplate && connectUrl) {
|
|
180
|
+
nxCloudInfo = await (0, nx_cloud_1.getNxCloudInfo)(nxCloud, connectUrl, pushedToVcs, rawArgs?.nxCloud);
|
|
181
|
+
}
|
|
182
|
+
// Template flow: cloud URL generation and completion message
|
|
183
|
+
if (isTemplate) {
|
|
184
|
+
if (nxCloud !== 'skip' && nxCloud !== 'never') {
|
|
185
|
+
const aiModeForCloud = (0, ai_output_1.isAiAgent)();
|
|
186
|
+
if (aiModeForCloud) {
|
|
187
|
+
(0, ai_output_1.logProgress)('configuring', 'Configuring Nx Cloud...');
|
|
188
|
+
}
|
|
189
|
+
const token = options.skipCloudConnect
|
|
190
|
+
? undefined
|
|
191
|
+
: (0, nx_cloud_1.readNxCloudToken)(directory);
|
|
192
|
+
connectUrl = await (0, nx_cloud_1.createNxCloudOnboardingUrl)(nxCloud, token, directory, useGitHub);
|
|
193
|
+
cloudConnectUrl = connectUrl;
|
|
183
194
|
const readmeUpdated = (0, update_readme_1.addConnectUrlToReadme)(directory, connectUrl);
|
|
184
195
|
if (readmeUpdated && !skipGit && commit) {
|
|
185
196
|
const alreadyPushed = pushedToVcs === git_1.VcsPushStatus.PushedToVcs;
|
|
186
197
|
await (0, update_readme_1.amendOrCommitReadme)(directory, alreadyPushed);
|
|
187
198
|
}
|
|
199
|
+
nxCloudInfo = await (0, nx_cloud_1.getNxCloudInfo)(nxCloud, connectUrl, pushedToVcs);
|
|
188
200
|
}
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
201
|
+
else {
|
|
202
|
+
// Strip marker comments from README
|
|
203
|
+
const readmeUpdated = (0, update_readme_1.addConnectUrlToReadme)(directory, undefined);
|
|
204
|
+
if (readmeUpdated && !skipGit && commit) {
|
|
205
|
+
const alreadyPushed = pushedToVcs === git_1.VcsPushStatus.PushedToVcs;
|
|
206
|
+
await (0, update_readme_1.amendOrCommitReadme)(directory, alreadyPushed);
|
|
207
|
+
}
|
|
208
|
+
if (nxCloud === 'skip') {
|
|
209
|
+
nxCloudInfo = (0, nx_cloud_1.getSkippedNxCloudInfo)();
|
|
210
|
+
}
|
|
198
211
|
}
|
|
199
|
-
// Show nx connect message when user skips cloud in template flow
|
|
200
|
-
nxCloudInfo = (0, nx_cloud_1.getSkippedNxCloudInfo)();
|
|
201
212
|
}
|
|
202
213
|
return {
|
|
203
214
|
nxCloudInfo,
|
|
@@ -8,7 +8,7 @@ export declare function determineNxCloud(parsedArgs: yargs.Arguments<{
|
|
|
8
8
|
export declare function determineNxCloudV2(parsedArgs: yargs.Arguments<{
|
|
9
9
|
nxCloud?: string;
|
|
10
10
|
interactive?: boolean;
|
|
11
|
-
}>): Promise<'
|
|
11
|
+
}>): Promise<'yes' | 'skip' | 'never'>;
|
|
12
12
|
export declare function determineIfGitHubWillBeUsed(parsedArgs: yargs.Arguments<{
|
|
13
13
|
nxCloud: NxCloud;
|
|
14
14
|
useGitHub?: boolean;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"prompts.d.ts","sourceRoot":"","sources":["../../../../../packages/create-nx-workspace/src/internal-utils/prompts.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAO/B,OAAO,EAEL,cAAc,EAEf,MAAM,0BAA0B,CAAC;AAElC,OAAO,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAC;AAE/C,OAAO,EACL,KAAK,EAGN,MAAM,6BAA6B,CAAC;AAGrC,wBAAsB,gBAAgB,CACpC,UAAU,EAAE,KAAK,CAAC,SAAS,CAAC;IAAE,OAAO,EAAE,OAAO,CAAA;CAAE,CAAC,GAChD,OAAO,CAAC,OAAO,CAAC,CAQlB;AAED,wBAAsB,kBAAkB,CACtC,UAAU,EAAE,KAAK,CAAC,SAAS,CAAC;IAAE,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,WAAW,CAAC,EAAE,OAAO,CAAA;CAAE,CAAC,GACvE,OAAO,CAAC,
|
|
1
|
+
{"version":3,"file":"prompts.d.ts","sourceRoot":"","sources":["../../../../../packages/create-nx-workspace/src/internal-utils/prompts.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAO/B,OAAO,EAEL,cAAc,EAEf,MAAM,0BAA0B,CAAC;AAElC,OAAO,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAC;AAE/C,OAAO,EACL,KAAK,EAGN,MAAM,6BAA6B,CAAC;AAGrC,wBAAsB,gBAAgB,CACpC,UAAU,EAAE,KAAK,CAAC,SAAS,CAAC;IAAE,OAAO,EAAE,OAAO,CAAA;CAAE,CAAC,GAChD,OAAO,CAAC,OAAO,CAAC,CAQlB;AAED,wBAAsB,kBAAkB,CACtC,UAAU,EAAE,KAAK,CAAC,SAAS,CAAC;IAAE,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,WAAW,CAAC,EAAE,OAAO,CAAA;CAAE,CAAC,GACvE,OAAO,CAAC,KAAK,GAAG,MAAM,GAAG,OAAO,CAAC,CAiBnC;AAED,wBAAsB,2BAA2B,CAC/C,UAAU,EAAE,KAAK,CAAC,SAAS,CAAC;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,SAAS,CAAC,EAAE,OAAO,CAAA;CAAE,CAAC,GACrE,OAAO,CAAC,OAAO,CAAC,CAelB;AA4BD,wBAAsB,iBAAiB,CACrC,UAAU,EAAE,KAAK,CAAC,SAAS,CAAC;IAC1B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB,CAAC,GACD,OAAO,CAAC,MAAM,GAAG,QAAQ,CAAC,CAG5B;AAED,wBAAsB,iBAAiB,CACrC,UAAU,EAAE,KAAK,CAAC,SAAS,CAAC;IAAE,QAAQ,CAAC,EAAE,KAAK,EAAE,CAAC;IAAC,WAAW,CAAC,EAAE,OAAO,CAAA;CAAE,CAAC,GACzE,OAAO,CAAC,KAAK,EAAE,CAAC,CAElB;AAqBD,wBAAsB,oBAAoB,CACxC,UAAU,EAAE,KAAK,CAAC,SAAS,CAAC;IAAE,WAAW,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,GACpD,OAAO,CAAC,MAAM,CAAC,CAwBjB;AAED,wBAAsB,uBAAuB,CAC3C,UAAU,EAAE,KAAK,CAAC,SAAS,CAAC;IAAE,cAAc,EAAE,MAAM,CAAA;CAAE,CAAC,GACtD,OAAO,CAAC,cAAc,CAAC,CAiCzB"}
|
|
@@ -11,7 +11,6 @@ const enquirer = require("enquirer");
|
|
|
11
11
|
const chalk = require("chalk");
|
|
12
12
|
const ab_testing_1 = require("../utils/nx/ab-testing");
|
|
13
13
|
const default_base_1 = require("../utils/git/default-base");
|
|
14
|
-
const git_1 = require("../utils/git/git");
|
|
15
14
|
const package_manager_1 = require("../utils/package-manager");
|
|
16
15
|
const string_utils_1 = require("../utils/string-utils");
|
|
17
16
|
const is_ci_1 = require("../utils/ci/is-ci");
|
|
@@ -31,15 +30,22 @@ async function determineNxCloud(parsedArgs) {
|
|
|
31
30
|
async function determineNxCloudV2(parsedArgs) {
|
|
32
31
|
// Provided via flag
|
|
33
32
|
if (parsedArgs.nxCloud) {
|
|
34
|
-
|
|
33
|
+
if (parsedArgs.nxCloud === 'skip')
|
|
34
|
+
return 'skip';
|
|
35
|
+
if (parsedArgs.nxCloud === 'never')
|
|
36
|
+
return 'never';
|
|
37
|
+
return 'yes';
|
|
35
38
|
}
|
|
36
39
|
// Non-interactive mode
|
|
37
40
|
if (!parsedArgs.interactive || (0, is_ci_1.isCI)()) {
|
|
38
41
|
return 'skip';
|
|
39
42
|
}
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
+
const result = await nxCloudPrompt('setupNxCloudV2');
|
|
44
|
+
if (result === 'never')
|
|
45
|
+
return 'never';
|
|
46
|
+
if (result === 'skip')
|
|
47
|
+
return 'skip';
|
|
48
|
+
return 'yes';
|
|
43
49
|
}
|
|
44
50
|
async function determineIfGitHubWillBeUsed(parsedArgs) {
|
|
45
51
|
if (parsedArgs.nxCloud === 'yes' || parsedArgs.nxCloud === 'circleci') {
|
|
@@ -83,47 +89,7 @@ async function nxCloudPrompt(key) {
|
|
|
83
89
|
async function determineTemplate(parsedArgs) {
|
|
84
90
|
if (parsedArgs.template)
|
|
85
91
|
return parsedArgs.template;
|
|
86
|
-
|
|
87
|
-
return 'custom';
|
|
88
|
-
if (!parsedArgs.interactive || (0, is_ci_1.isCI)())
|
|
89
|
-
return 'custom';
|
|
90
|
-
// Docs generation needs preset flow to document all presets
|
|
91
|
-
if (process.env.NX_GENERATE_DOCS_PROCESS === 'true')
|
|
92
|
-
return 'custom';
|
|
93
|
-
// Template flow requires git for cloning - fall back to custom preset if git is not available
|
|
94
|
-
if (!(0, git_1.isGitAvailable)())
|
|
95
|
-
return 'custom';
|
|
96
|
-
const { template } = await enquirer.prompt([
|
|
97
|
-
{
|
|
98
|
-
name: 'template',
|
|
99
|
-
message: 'Which starter do you want to use?',
|
|
100
|
-
type: 'autocomplete',
|
|
101
|
-
choices: [
|
|
102
|
-
{
|
|
103
|
-
name: 'nrwl/empty-template',
|
|
104
|
-
message: 'Minimal (empty monorepo without projects)',
|
|
105
|
-
},
|
|
106
|
-
{
|
|
107
|
-
name: 'nrwl/react-template',
|
|
108
|
-
message: 'React (fullstack monorepo with React and Express)',
|
|
109
|
-
},
|
|
110
|
-
{
|
|
111
|
-
name: 'nrwl/angular-template',
|
|
112
|
-
message: 'Angular (fullstack monorepo with Angular and Express)',
|
|
113
|
-
},
|
|
114
|
-
{
|
|
115
|
-
name: 'nrwl/typescript-template',
|
|
116
|
-
message: 'NPM Packages (monorepo with TypeScript packages ready to publish)',
|
|
117
|
-
},
|
|
118
|
-
{
|
|
119
|
-
name: 'custom',
|
|
120
|
-
message: 'Custom (advanced setup with additional frameworks)',
|
|
121
|
-
},
|
|
122
|
-
],
|
|
123
|
-
initial: 0,
|
|
124
|
-
},
|
|
125
|
-
]);
|
|
126
|
-
return template;
|
|
92
|
+
return 'custom';
|
|
127
93
|
}
|
|
128
94
|
async function determineAiAgents(parsedArgs) {
|
|
129
95
|
return parsedArgs.aiAgents ?? [];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ab-testing.d.ts","sourceRoot":"","sources":["../../../../../../packages/create-nx-workspace/src/utils/nx/ab-testing.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAAE,aAAa,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC;AAsEtE;;;GAGG;AACH,wBAAgB,cAAc,IAAI,MAAM,CAKvC;AAED;;;GAGG;AACH,wBAAgB,iCAAiC,IAAI,oBAAoB,CAExE;AAED,wBAAgB,qBAAqB,IAAI,OAAO,CAI/C;AAiBD;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,CAQ/D;AAED;;;;;;;GAOG;AACH,wBAAgB,gBAAgB,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,aAAa,
|
|
1
|
+
{"version":3,"file":"ab-testing.d.ts","sourceRoot":"","sources":["../../../../../../packages/create-nx-workspace/src/utils/nx/ab-testing.ts"],"names":[],"mappings":"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"}
|
|
@@ -133,16 +133,7 @@ function isEnterpriseCloudUrl(cloudUrl) {
|
|
|
133
133
|
* @param cloudUrl - The Nx Cloud URL. If enterprise, always returns '0'.
|
|
134
134
|
*/
|
|
135
135
|
function getBannerVariant(cloudUrl) {
|
|
136
|
-
|
|
137
|
-
if (isEnterpriseCloudUrl(cloudUrl)) {
|
|
138
|
-
return '0';
|
|
139
|
-
}
|
|
140
|
-
// Docs generation uses variant 0 for deterministic output
|
|
141
|
-
if (process.env.NX_GENERATE_DOCS_PROCESS === 'true') {
|
|
142
|
-
return '0';
|
|
143
|
-
}
|
|
144
|
-
// Standard URLs get variant 2 banner
|
|
145
|
-
return '2';
|
|
136
|
+
return '0';
|
|
146
137
|
}
|
|
147
138
|
exports.NxCloudChoices = [
|
|
148
139
|
'github',
|
|
@@ -151,6 +142,7 @@ exports.NxCloudChoices = [
|
|
|
151
142
|
'bitbucket-pipelines',
|
|
152
143
|
'circleci',
|
|
153
144
|
'skip',
|
|
145
|
+
'never',
|
|
154
146
|
'yes', // Deprecated but still handled
|
|
155
147
|
];
|
|
156
148
|
const messageOptions = {
|
|
@@ -177,72 +169,35 @@ const messageOptions = {
|
|
|
177
169
|
],
|
|
178
170
|
/**
|
|
179
171
|
* These messages are a fallback for setting up CI as well as when migrating major versions
|
|
180
|
-
*
|
|
172
|
+
* NXC-4020: Restored to v22.1.3 wording
|
|
181
173
|
*/
|
|
182
174
|
setupNxCloud: [
|
|
183
175
|
{
|
|
184
|
-
code: '
|
|
185
|
-
message: '
|
|
176
|
+
code: 'enable-caching2',
|
|
177
|
+
message: 'Would you like remote caching to make your build faster?',
|
|
186
178
|
initial: 0,
|
|
187
179
|
choices: [
|
|
188
180
|
{ value: 'yes', name: 'Yes' },
|
|
189
|
-
{ value: 'skip', name: '
|
|
181
|
+
{ value: 'skip', name: 'No - I would not like remote caching' },
|
|
190
182
|
],
|
|
191
|
-
footer: '\
|
|
183
|
+
footer: '\nRead more about remote caching at https://nx.dev/ci/features/remote-cache',
|
|
184
|
+
hint: '(can be disabled any time)',
|
|
192
185
|
fallback: undefined,
|
|
193
|
-
completionMessage: '
|
|
186
|
+
completionMessage: 'cache-setup',
|
|
194
187
|
},
|
|
195
188
|
],
|
|
196
189
|
/**
|
|
197
190
|
* Simplified Cloud prompt for template flow
|
|
198
191
|
*/
|
|
199
192
|
setupNxCloudV2: [
|
|
200
|
-
//{
|
|
201
|
-
// code: 'cloud-v2-remote-cache-visit',
|
|
202
|
-
// message: 'Enable remote caching with Nx Cloud?',
|
|
203
|
-
// initial: 0,
|
|
204
|
-
// choices: [
|
|
205
|
-
// { value: 'yes', name: 'Yes' },
|
|
206
|
-
// { value: 'skip', name: 'Skip' },
|
|
207
|
-
// ],
|
|
208
|
-
// footer:
|
|
209
|
-
// '\nRemote caching makes your builds faster for development and in CI: https://nx.dev/ci/features/remote-cache',
|
|
210
|
-
// fallback: undefined,
|
|
211
|
-
// completionMessage: 'cache-setup',
|
|
212
|
-
//},
|
|
213
|
-
//{
|
|
214
|
-
// code: 'cloud-v2-fast-ci-visit',
|
|
215
|
-
// message: 'Speed up CI and reduce compute costs with Nx Cloud?',
|
|
216
|
-
// initial: 0,
|
|
217
|
-
// choices: [
|
|
218
|
-
// { value: 'yes', name: 'Yes' },
|
|
219
|
-
// { value: 'skip', name: 'Skip' },
|
|
220
|
-
// ],
|
|
221
|
-
// footer:
|
|
222
|
-
// '\n70% faster CI, 60% less compute, Automatically fix broken PRs: https://nx.dev/nx-cloud',
|
|
223
|
-
// fallback: undefined,
|
|
224
|
-
// completionMessage: 'ci-setup',
|
|
225
|
-
//},
|
|
226
|
-
//{
|
|
227
|
-
// code: 'cloud-v2-green-prs-visit',
|
|
228
|
-
// message: 'Get to green PRs faster with Nx Cloud?',
|
|
229
|
-
// initial: 0,
|
|
230
|
-
// choices: [
|
|
231
|
-
// { value: 'yes', name: 'Yes' },
|
|
232
|
-
// { value: 'skip', name: 'Skip' },
|
|
233
|
-
// ],
|
|
234
|
-
// footer:
|
|
235
|
-
// '\nAutomatically fix broken PRs, 70% faster CI: https://nx.dev/nx-cloud',
|
|
236
|
-
// fallback: undefined,
|
|
237
|
-
// completionMessage: 'ci-setup',
|
|
238
|
-
//},
|
|
239
193
|
{
|
|
240
|
-
code: '
|
|
241
|
-
message: '
|
|
194
|
+
code: 'connect-to-cloud',
|
|
195
|
+
message: 'Connect to Nx Cloud?',
|
|
242
196
|
initial: 0,
|
|
243
197
|
choices: [
|
|
244
198
|
{ value: 'yes', name: 'Yes' },
|
|
245
|
-
{ value: 'skip', name: 'Skip' },
|
|
199
|
+
{ value: 'skip', name: 'Skip for now' },
|
|
200
|
+
{ value: 'never', name: "No, don't ask again" },
|
|
246
201
|
],
|
|
247
202
|
footer: '\nAutomatically fix broken PRs, 70% faster CI: https://nx.dev/nx-cloud',
|
|
248
203
|
fallback: undefined,
|
|
@@ -14,7 +14,7 @@ declare const completionMessages: {
|
|
|
14
14
|
readonly title: "Your CI setup is almost complete.";
|
|
15
15
|
};
|
|
16
16
|
readonly 'cache-setup': {
|
|
17
|
-
readonly title: "Your remote cache
|
|
17
|
+
readonly title: "Your remote cache is almost complete.";
|
|
18
18
|
};
|
|
19
19
|
readonly 'platform-setup': {
|
|
20
20
|
readonly title: "Your platform setup is almost complete.";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"messages.d.ts","sourceRoot":"","sources":["../../../../../../packages/create-nx-workspace/src/utils/nx/messages.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAE3C;;;;GAIG;AACH,MAAM,MAAM,aAAa,GAAG,GAAG,GAAG,GAAG,CAAC;
|
|
1
|
+
{"version":3,"file":"messages.d.ts","sourceRoot":"","sources":["../../../../../../packages/create-nx-workspace/src/utils/nx/messages.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAE3C;;;;GAIG;AACH,MAAM,MAAM,aAAa,GAAG,GAAG,GAAG,GAAG,CAAC;AAiDtC;;;GAGG;AACH,QAAA,MAAM,kBAAkB;;;;;;;;;;CAWd,CAAC;AAEX,MAAM,MAAM,oBAAoB,GAAG,MAAM,OAAO,kBAAkB,CAAC;AAEnE,wBAAgB,oBAAoB,CAClC,oBAAoB,EAAE,oBAAoB,GAAG,SAAS,EACtD,GAAG,EAAE,MAAM,GAAG,IAAI,EAClB,WAAW,EAAE,aAAa,EAC1B,aAAa,CAAC,EAAE,MAAM,EACtB,aAAa,CAAC,EAAE,aAAa,GAC5B;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,EAAE,CAAA;CAAE,CA2BxC;AAED,wBAAgB,sBAAsB,IAAI;IACxC,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,EAAE,CAAC;CACrB,CAUA"}
|
package/src/utils/nx/messages.js
CHANGED
|
@@ -7,7 +7,7 @@ const git_1 = require("../git/git");
|
|
|
7
7
|
* Generates a simple box banner with the setup URL.
|
|
8
8
|
*/
|
|
9
9
|
function generateSimpleBanner(url) {
|
|
10
|
-
const content = `Finish
|
|
10
|
+
const content = `Finish setup: ${url}`;
|
|
11
11
|
// Add padding around content (3 spaces on each side)
|
|
12
12
|
const innerWidth = content.length + 6;
|
|
13
13
|
const horizontalBorder = '+' + '-'.repeat(innerWidth) + '+';
|
|
@@ -32,19 +32,15 @@ function getBannerLines(variant, url) {
|
|
|
32
32
|
// Variant 0: plain link (no banner)
|
|
33
33
|
return [];
|
|
34
34
|
}
|
|
35
|
-
function getSetupMessage(url, pushedToVcs
|
|
36
|
-
const githubUrl = workspaceName
|
|
37
|
-
? `https://github.com/new?name=${encodeURIComponent(workspaceName)}`
|
|
38
|
-
: 'https://github.com/new';
|
|
35
|
+
function getSetupMessage(url, pushedToVcs) {
|
|
39
36
|
if (pushedToVcs === git_1.VcsPushStatus.PushedToVcs) {
|
|
40
37
|
return url
|
|
41
38
|
? `Go to Nx Cloud and finish the setup: ${url}`
|
|
42
39
|
: 'Return to Nx Cloud and finish the setup.';
|
|
43
40
|
}
|
|
44
|
-
// User needs to push first
|
|
45
41
|
const action = url ? 'go' : 'return';
|
|
46
42
|
const urlSuffix = url ? `: ${url}` : '.';
|
|
47
|
-
return `Push your repo
|
|
43
|
+
return `Push your repo, then ${action} to Nx Cloud and finish the setup${urlSuffix}`;
|
|
48
44
|
}
|
|
49
45
|
/**
|
|
50
46
|
* Completion messages shown after workspace creation.
|
|
@@ -55,7 +51,8 @@ const completionMessages = {
|
|
|
55
51
|
title: 'Your CI setup is almost complete.',
|
|
56
52
|
},
|
|
57
53
|
'cache-setup': {
|
|
58
|
-
|
|
54
|
+
// NXC-4020: Restored to v22.1.3 wording (was "Your remote cache setup is almost complete.")
|
|
55
|
+
title: 'Your remote cache is almost complete.',
|
|
59
56
|
},
|
|
60
57
|
'platform-setup': {
|
|
61
58
|
title: 'Your platform setup is almost complete.',
|
|
@@ -79,7 +76,7 @@ function getCompletionMessage(completionMessageKey, url, pushedToVcs, workspaceN
|
|
|
79
76
|
}
|
|
80
77
|
}
|
|
81
78
|
// Variant 0 (control) or fallback: plain link message
|
|
82
|
-
const bodyLines = [getSetupMessage(url, pushedToVcs
|
|
79
|
+
const bodyLines = [getSetupMessage(url, pushedToVcs)];
|
|
83
80
|
return {
|
|
84
81
|
title,
|
|
85
82
|
bodyLines,
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import { VcsPushStatus } from '../git/git';
|
|
2
|
-
|
|
3
|
-
export type NxCloud = 'yes' | 'github' | 'gitlab' | 'azure' | 'bitbucket-pipelines' | 'circleci' | 'skip';
|
|
2
|
+
export type NxCloud = 'yes' | 'github' | 'gitlab' | 'azure' | 'bitbucket-pipelines' | 'circleci' | 'skip' | 'never';
|
|
4
3
|
export declare function connectToNxCloudForTemplate(directory: string, installationSource: string, useGitHub?: boolean): Promise<string | null>;
|
|
5
4
|
export declare function readNxCloudToken(directory: string): string;
|
|
6
5
|
export declare function createNxCloudOnboardingUrl(nxCloud: NxCloud, token: string | undefined, directory: string, useGitHub?: boolean): Promise<string>;
|
|
7
|
-
export declare function getNxCloudInfo(connectCloudUrl: string, pushedToVcs: VcsPushStatus,
|
|
6
|
+
export declare function getNxCloudInfo(nxCloud: NxCloud, connectCloudUrl: string, pushedToVcs: VcsPushStatus, rawNxCloud?: NxCloud): Promise<string>;
|
|
8
7
|
export declare function getSkippedNxCloudInfo(): string;
|
|
8
|
+
export declare function setNeverConnectToCloud(directory: string): void;
|
|
9
9
|
//# sourceMappingURL=nx-cloud.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"nx-cloud.d.ts","sourceRoot":"","sources":["../../../../../../packages/create-nx-workspace/src/utils/nx/nx-cloud.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"nx-cloud.d.ts","sourceRoot":"","sources":["../../../../../../packages/create-nx-workspace/src/utils/nx/nx-cloud.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAO3C,MAAM,MAAM,OAAO,GACf,KAAK,GACL,QAAQ,GACR,QAAQ,GACR,OAAO,GACP,qBAAqB,GACrB,UAAU,GACV,MAAM,GACN,OAAO,CAAC;AAEZ,wBAAsB,2BAA2B,CAC/C,SAAS,EAAE,MAAM,EACjB,kBAAkB,EAAE,MAAM,EAC1B,SAAS,CAAC,EAAE,OAAO,GAClB,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CA+BxB;AAED,wBAAgB,gBAAgB,CAAC,SAAS,EAAE,MAAM,UAiBjD;AAED,wBAAsB,0BAA0B,CAC9C,OAAO,EAAE,OAAO,EAChB,KAAK,EAAE,MAAM,GAAG,SAAS,EACzB,SAAS,EAAE,MAAM,EACjB,SAAS,CAAC,EAAE,OAAO,GAClB,OAAO,CAAC,MAAM,CAAC,CAgCjB;AAKD,wBAAsB,cAAc,CAClC,OAAO,EAAE,OAAO,EAChB,eAAe,EAAE,MAAM,EACvB,WAAW,EAAE,aAAa,EAC1B,UAAU,CAAC,EAAE,OAAO,mBAUrB;AAED,wBAAgB,qBAAqB,WAIpC;AAED,wBAAgB,sBAAsB,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAO9D"}
|
package/src/utils/nx/nx-cloud.js
CHANGED
|
@@ -5,6 +5,7 @@ exports.readNxCloudToken = readNxCloudToken;
|
|
|
5
5
|
exports.createNxCloudOnboardingUrl = createNxCloudOnboardingUrl;
|
|
6
6
|
exports.getNxCloudInfo = getNxCloudInfo;
|
|
7
7
|
exports.getSkippedNxCloudInfo = getSkippedNxCloudInfo;
|
|
8
|
+
exports.setNeverConnectToCloud = setNeverConnectToCloud;
|
|
8
9
|
const output_1 = require("../output");
|
|
9
10
|
const messages_1 = require("./messages");
|
|
10
11
|
const ab_testing_1 = require("./ab-testing");
|
|
@@ -41,7 +42,8 @@ function readNxCloudToken(directory) {
|
|
|
41
42
|
// nx-ignore-next-line
|
|
42
43
|
));
|
|
43
44
|
const { accessToken, nxCloudId } = getCloudOptions(directory);
|
|
44
|
-
|
|
45
|
+
// NXC-4020: Restored to v22.1.3 wording
|
|
46
|
+
nxCloudSpinner.succeed('Nx Cloud has been set up successfully');
|
|
45
47
|
return accessToken || nxCloudId;
|
|
46
48
|
}
|
|
47
49
|
async function createNxCloudOnboardingUrl(nxCloud, token, directory, useGitHub) {
|
|
@@ -62,21 +64,17 @@ async function createNxCloudOnboardingUrl(nxCloud, token, directory, useGitHub)
|
|
|
62
64
|
return createNxCloudOnboardingURL(source, token, meta, false, useGitHub ??
|
|
63
65
|
(nxCloud === 'yes' || nxCloud === 'github' || nxCloud === 'circleci'), directory);
|
|
64
66
|
}
|
|
65
|
-
|
|
67
|
+
// NXC-4020: Restored v22.1.3 signature — determines message from nxCloud value,
|
|
68
|
+
// uses rawNxCloud to decide whether to show URL (hide when user passed --nxCloud explicitly).
|
|
69
|
+
// Previous signature: (connectCloudUrl, pushedToVcs, completionMessageKey?, workspaceName?)
|
|
70
|
+
async function getNxCloudInfo(nxCloud, connectCloudUrl, pushedToVcs, rawNxCloud) {
|
|
71
|
+
const completionMessageKey = nxCloud === 'yes' ? 'cache-setup' : 'ci-setup';
|
|
66
72
|
const out = new output_1.CLIOutput(false);
|
|
67
|
-
//
|
|
68
|
-
//
|
|
69
|
-
const
|
|
70
|
-
const message = (0, messages_1.getCompletionMessage)(completionMessageKey,
|
|
71
|
-
|
|
72
|
-
// without the NX badge since nothing was actually configured
|
|
73
|
-
if (!message.title) {
|
|
74
|
-
out.addNewline();
|
|
75
|
-
out.writeLines(message.bodyLines ?? []);
|
|
76
|
-
}
|
|
77
|
-
else {
|
|
78
|
-
out.success(message);
|
|
79
|
-
}
|
|
73
|
+
// When rawNxCloud is a string (user explicitly passed --nxCloud), hide the URL
|
|
74
|
+
// because the user "already knows" where to go
|
|
75
|
+
const url = typeof rawNxCloud === 'string' ? null : connectCloudUrl;
|
|
76
|
+
const message = (0, messages_1.getCompletionMessage)(completionMessageKey, url, pushedToVcs);
|
|
77
|
+
out.success(message);
|
|
80
78
|
return out.getOutput();
|
|
81
79
|
}
|
|
82
80
|
function getSkippedNxCloudInfo() {
|
|
@@ -84,3 +82,11 @@ function getSkippedNxCloudInfo() {
|
|
|
84
82
|
out.success((0, messages_1.getSkippedCloudMessage)());
|
|
85
83
|
return out.getOutput();
|
|
86
84
|
}
|
|
85
|
+
function setNeverConnectToCloud(directory) {
|
|
86
|
+
const { readFileSync, writeFileSync } = require('fs');
|
|
87
|
+
const { join } = require('path');
|
|
88
|
+
const nxJsonPath = join(directory, 'nx.json');
|
|
89
|
+
const nxJson = JSON.parse(readFileSync(nxJsonPath, 'utf-8'));
|
|
90
|
+
nxJson.neverConnectToCloud = true;
|
|
91
|
+
writeFileSync(nxJsonPath, JSON.stringify(nxJson, null, 2) + '\n');
|
|
92
|
+
}
|