@webiny/cli-core 6.3.0 → 6.4.0-beta.1
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/Cli.js +12 -11
- package/Cli.js.map +1 -1
- package/abstractions/createAbstraction.js +3 -2
- package/abstractions/createAbstraction.js.map +1 -1
- package/abstractions/features/CliCommand.js +2 -4
- package/abstractions/features/CliCommand.js.map +1 -1
- package/abstractions/features/ErrorHandler.js +2 -1
- package/abstractions/features/ErrorHandler.js.map +1 -1
- package/abstractions/features/GlobalCliOption.js +2 -1
- package/abstractions/features/GlobalCliOption.js.map +1 -1
- package/abstractions/features/IsCi.js +2 -1
- package/abstractions/features/IsCi.js.map +1 -1
- package/abstractions/features/index.js +0 -2
- package/abstractions/features/types.js +0 -3
- package/abstractions/index.js +0 -2
- package/abstractions/services/ArgvParserService.js +2 -1
- package/abstractions/services/ArgvParserService.js.map +1 -1
- package/abstractions/services/CliParamsService.js +2 -1
- package/abstractions/services/CliParamsService.js.map +1 -1
- package/abstractions/services/CommandsRegistryService.js +2 -1
- package/abstractions/services/CommandsRegistryService.js.map +1 -1
- package/abstractions/services/GetArgvService.js +2 -1
- package/abstractions/services/GetArgvService.js.map +1 -1
- package/abstractions/services/GetCliRunnerService.js +2 -1
- package/abstractions/services/GetCliRunnerService.js.map +1 -1
- package/abstractions/services/GetIsCiService.js +2 -1
- package/abstractions/services/GetIsCiService.js.map +1 -1
- package/abstractions/services/GetProjectSdkService.js +2 -1
- package/abstractions/services/GetProjectSdkService.js.map +1 -1
- package/abstractions/services/GlobalOptionsRegistryService.js +2 -1
- package/abstractions/services/GlobalOptionsRegistryService.js.map +1 -1
- package/abstractions/services/LoggerService.js +2 -1
- package/abstractions/services/LoggerService.js.map +1 -1
- package/abstractions/services/RunCliRunnerService.js +2 -1
- package/abstractions/services/RunCliRunnerService.js.map +1 -1
- package/abstractions/services/StdioService.js +2 -1
- package/abstractions/services/StdioService.js.map +1 -1
- package/abstractions/services/UiService.js +2 -1
- package/abstractions/services/UiService.js.map +1 -1
- package/abstractions/services/index.js +0 -2
- package/createCliContainer.js +87 -113
- package/createCliContainer.js.map +1 -1
- package/decorators/CommandsWithGracefulErrorHandling.js +34 -32
- package/decorators/CommandsWithGracefulErrorHandling.js.map +1 -1
- package/decorators/DeployCommandWithTelemetry.js +72 -82
- package/decorators/DeployCommandWithTelemetry.js.map +1 -1
- package/decorators/index.js +0 -2
- package/exports/cli/command.js +0 -2
- package/exports/cli.js +0 -2
- package/extensions/CliCommand.js +15 -18
- package/extensions/CliCommand.js.map +1 -1
- package/extensions/CliCommandDecorator.js +15 -18
- package/extensions/CliCommandDecorator.js.map +1 -1
- package/extensions/index.js +5 -2
- package/extensions/index.js.map +1 -1
- package/features/AboutCommand.js +80 -86
- package/features/AboutCommand.js.map +1 -1
- package/features/BuildCommand/BuildCommand.js +46 -36
- package/features/BuildCommand/BuildCommand.js.map +1 -1
- package/features/BuildCommand/buildRunners/BaseBuildRunner.js +10 -13
- package/features/BuildCommand/buildRunners/BaseBuildRunner.js.map +1 -1
- package/features/BuildCommand/buildRunners/BuildRunner.js +18 -21
- package/features/BuildCommand/buildRunners/BuildRunner.js.map +1 -1
- package/features/BuildCommand/buildRunners/MultipleBuildsRunner.js +20 -19
- package/features/BuildCommand/buildRunners/MultipleBuildsRunner.js.map +1 -1
- package/features/BuildCommand/buildRunners/SingleBuildRunner.js +15 -14
- package/features/BuildCommand/buildRunners/SingleBuildRunner.js.map +1 -1
- package/features/BuildCommand/buildRunners/ZeroBuildsRunner.js +3 -4
- package/features/BuildCommand/buildRunners/ZeroBuildsRunner.js.map +1 -1
- package/features/BuildCommand/index.js +0 -2
- package/features/ConfigCommand.js +55 -56
- package/features/ConfigCommand.js.map +1 -1
- package/features/DeployCommand/DeployCommand.js +162 -156
- package/features/DeployCommand/DeployCommand.js.map +1 -1
- package/features/DeployCommand/deployOutputs/BaseDeployOutput.js +12 -17
- package/features/DeployCommand/deployOutputs/BaseDeployOutput.js.map +1 -1
- package/features/DeployCommand/deployOutputs/DeployOutput.js +16 -17
- package/features/DeployCommand/deployOutputs/DeployOutput.js.map +1 -1
- package/features/DeployCommand/deployOutputs/NoDeploymentLogsDeployOutput.js +89 -54
- package/features/DeployCommand/deployOutputs/NoDeploymentLogsDeployOutput.js.map +1 -1
- package/features/DeployCommand/deployOutputs/WithDeploymentLogsDeployOutput.js +24 -37
- package/features/DeployCommand/deployOutputs/WithDeploymentLogsDeployOutput.js.map +1 -1
- package/features/DeployCommand/index.js +0 -2
- package/features/DepsSync/BuildDependencyTree.js +16 -21
- package/features/DepsSync/BuildDependencyTree.js.map +1 -1
- package/features/DepsSync/DependencyTree.js +108 -126
- package/features/DepsSync/DependencyTree.js.map +1 -1
- package/features/DepsSync/ListAllPackageJsonFiles.js +19 -14
- package/features/DepsSync/ListAllPackageJsonFiles.js.map +1 -1
- package/features/DepsSync/ListAllPackages.js +7 -9
- package/features/DepsSync/ListAllPackages.js.map +1 -1
- package/features/DepsSync/commands/SyncDepsCommand.js +30 -24
- package/features/DepsSync/commands/SyncDepsCommand.js.map +1 -1
- package/features/DepsSync/commands/VerifyDepsCommand.js +69 -70
- package/features/DepsSync/commands/VerifyDepsCommand.js.map +1 -1
- package/features/DepsSync/createDependencyTree.js +25 -18
- package/features/DepsSync/createDependencyTree.js.map +1 -1
- package/features/DepsSync/createReferenceFile.js +21 -25
- package/features/DepsSync/createReferenceFile.js.map +1 -1
- package/features/DepsSync/index.js +0 -2
- package/features/DepsSync/paths.js +3 -6
- package/features/DepsSync/paths.js.map +1 -1
- package/features/DepsSync/types.js +7 -6
- package/features/DepsSync/types.js.map +1 -1
- package/features/DestroyCommand/DestroyCommand.js +71 -67
- package/features/DestroyCommand/DestroyCommand.js.map +1 -1
- package/features/DestroyCommand/index.js +0 -2
- package/features/DisableTelemetryCommand.js +28 -25
- package/features/DisableTelemetryCommand.js.map +1 -1
- package/features/EnableTelemetryCommand.js +28 -25
- package/features/EnableTelemetryCommand.js.map +1 -1
- package/features/ExtensionCommand/ExtensionCommand.js +60 -63
- package/features/ExtensionCommand/ExtensionCommand.js.map +1 -1
- package/features/ExtensionCommand/index.js +0 -2
- package/features/InfoCommand/InfoCommand.js +54 -56
- package/features/InfoCommand/InfoCommand.js.map +1 -1
- package/features/InfoCommand/PrintInfoForEnv.js +31 -47
- package/features/InfoCommand/PrintInfoForEnv.js.map +1 -1
- package/features/InfoCommand/index.js +0 -2
- package/features/IsCi/IsCi.js +14 -11
- package/features/IsCi/IsCi.js.map +1 -1
- package/features/IsCi/index.js +1 -3
- package/features/OpenCommand.js +48 -47
- package/features/OpenCommand.js.map +1 -1
- package/features/OutputCommand.js +56 -69
- package/features/OutputCommand.js.map +1 -1
- package/features/PulumiCommand/PulumiCommand.js +48 -41
- package/features/PulumiCommand/PulumiCommand.js.map +1 -1
- package/features/PulumiCommand/index.js +0 -2
- package/features/RefreshCommand/RefreshCommand.js +42 -36
- package/features/RefreshCommand/RefreshCommand.js.map +1 -1
- package/features/RefreshCommand/index.js +0 -2
- package/features/UpgradeCommand/UpgradeCommand.js +112 -101
- package/features/UpgradeCommand/UpgradeCommand.js.map +1 -1
- package/features/UpgradeCommand/UpgradeCommandHandler.js +90 -101
- package/features/UpgradeCommand/UpgradeCommandHandler.js.map +1 -1
- package/features/UpgradeCommand/abstraction.js +2 -1
- package/features/UpgradeCommand/abstraction.js.map +1 -1
- package/features/UpgradeCommand/feature.js +7 -6
- package/features/UpgradeCommand/feature.js.map +1 -1
- package/features/UpgradeCommand/index.js +0 -2
- package/features/WatchCommand/WatchCommand.js +131 -131
- package/features/WatchCommand/WatchCommand.js.map +1 -1
- package/features/WatchCommand/createPrefixer.js +11 -15
- package/features/WatchCommand/createPrefixer.js.map +1 -1
- package/features/WatchCommand/getRandomColorForString.js +86 -8
- package/features/WatchCommand/getRandomColorForString.js.map +1 -1
- package/features/WatchCommand/index.js +0 -2
- package/features/Wcp/LinkProjectCommand.js +119 -138
- package/features/Wcp/LinkProjectCommand.js.map +1 -1
- package/features/Wcp/LoginCommand.js +104 -118
- package/features/Wcp/LoginCommand.js.map +1 -1
- package/features/Wcp/LogoutCommand.js +29 -23
- package/features/Wcp/LogoutCommand.js.map +1 -1
- package/features/Wcp/WhoAmICommand.js +33 -29
- package/features/Wcp/WhoAmICommand.js.map +1 -1
- package/features/common/index.js +0 -2
- package/features/common/options.js +41 -50
- package/features/common/options.js.map +1 -1
- package/features/globalOptions/LogLevelGlobalOption.js +25 -16
- package/features/globalOptions/LogLevelGlobalOption.js.map +1 -1
- package/features/globalOptions/ShowLogsGlobalOption.js +16 -15
- package/features/globalOptions/ShowLogsGlobalOption.js.map +1 -1
- package/features/globalOptions/StackTraceGlobalOption.js +16 -15
- package/features/globalOptions/StackTraceGlobalOption.js.map +1 -1
- package/features/globalOptions/index.js +0 -2
- package/features/gracefulErrorHandlers/DdbPutItemConditionalCheckFailedGracefulErrorHandler.js +17 -16
- package/features/gracefulErrorHandlers/DdbPutItemConditionalCheckFailedGracefulErrorHandler.js.map +1 -1
- package/features/gracefulErrorHandlers/MissingFilesInBuildGracefulErrorHandler.js +12 -18
- package/features/gracefulErrorHandlers/MissingFilesInBuildGracefulErrorHandler.js.map +1 -1
- package/features/gracefulErrorHandlers/PendingOperationsGracefulErrorHandler.js +19 -19
- package/features/gracefulErrorHandlers/PendingOperationsGracefulErrorHandler.js.map +1 -1
- package/features/gracefulErrorHandlers/index.js +0 -2
- package/features/index.js +0 -2
- package/features/utils/index.js +0 -2
- package/features/utils/measureDuration.js +7 -8
- package/features/utils/measureDuration.js.map +1 -1
- package/index.js +0 -2
- package/package.json +11 -11
- package/services/ArgvParserService/ArgvParserService.js +27 -33
- package/services/ArgvParserService/ArgvParserService.js.map +1 -1
- package/services/ArgvParserService/index.js +0 -2
- package/services/CliParamsService/CliParamsService.js +18 -15
- package/services/CliParamsService/CliParamsService.js.map +1 -1
- package/services/CliParamsService/index.js +0 -2
- package/services/CommandsRegistryService/CommandsRegistryService.js +19 -13
- package/services/CommandsRegistryService/CommandsRegistryService.js.map +1 -1
- package/services/CommandsRegistryService/index.js +0 -2
- package/services/GetArgvService/GetArgvService.js +14 -11
- package/services/GetArgvService/GetArgvService.js.map +1 -1
- package/services/GetArgvService/index.js +0 -2
- package/services/GetCliRunnerService/GetCliRunnerService.js +119 -155
- package/services/GetCliRunnerService/GetCliRunnerService.js.map +1 -1
- package/services/GetCliRunnerService/index.js +0 -2
- package/services/GetIsCiService/GetIsCiService.js +9 -8
- package/services/GetIsCiService/GetIsCiService.js.map +1 -1
- package/services/GetIsCiService/index.js +1 -3
- package/services/GetProjectSdkService/GetProjectSdkService.js +25 -24
- package/services/GetProjectSdkService/GetProjectSdkService.js.map +1 -1
- package/services/GetProjectSdkService/index.js +0 -2
- package/services/GlobalOptionsRegistryService/GlobalOptionsRegistryService.js +19 -13
- package/services/GlobalOptionsRegistryService/GlobalOptionsRegistryService.js.map +1 -1
- package/services/GlobalOptionsRegistryService/index.js +0 -2
- package/services/LoggerService/LoggerService.js +75 -87
- package/services/LoggerService/LoggerService.js.map +1 -1
- package/services/LoggerService/index.js +0 -2
- package/services/RunCliRunnerService/RunCliRunnerService.js +15 -13
- package/services/RunCliRunnerService/RunCliRunnerService.js.map +1 -1
- package/services/RunCliRunnerService/index.js +0 -2
- package/services/StdioService/StdioService.js +15 -14
- package/services/StdioService/StdioService.js.map +1 -1
- package/services/StdioService/index.js +0 -2
- package/services/UiService/UiService.js +55 -58
- package/services/UiService/UiService.js.map +1 -1
- package/services/UiService/index.js +0 -2
- package/services/index.js +0 -2
- package/utils/ManuallyReportedError.js +7 -6
- package/utils/ManuallyReportedError.js.map +1 -1
- package/abstractions/features/index.js.map +0 -1
- package/abstractions/features/types.js.map +0 -1
- package/abstractions/index.js.map +0 -1
- package/abstractions/services/index.js.map +0 -1
- package/decorators/index.js.map +0 -1
- package/exports/cli/command.js.map +0 -1
- package/exports/cli.js.map +0 -1
- package/features/BuildCommand/index.js.map +0 -1
- package/features/DeployCommand/index.js.map +0 -1
- package/features/DepsSync/index.js.map +0 -1
- package/features/DestroyCommand/index.js.map +0 -1
- package/features/ExtensionCommand/index.js.map +0 -1
- package/features/InfoCommand/index.js.map +0 -1
- package/features/IsCi/index.js.map +0 -1
- package/features/PulumiCommand/index.js.map +0 -1
- package/features/RefreshCommand/index.js.map +0 -1
- package/features/UpgradeCommand/index.js.map +0 -1
- package/features/WatchCommand/index.js.map +0 -1
- package/features/common/index.js.map +0 -1
- package/features/globalOptions/index.js.map +0 -1
- package/features/gracefulErrorHandlers/index.js.map +0 -1
- package/features/index.js.map +0 -1
- package/features/utils/index.js.map +0 -1
- package/index.js.map +0 -1
- package/services/ArgvParserService/index.js.map +0 -1
- package/services/CliParamsService/index.js.map +0 -1
- package/services/CommandsRegistryService/index.js.map +0 -1
- package/services/GetArgvService/index.js.map +0 -1
- package/services/GetCliRunnerService/index.js.map +0 -1
- package/services/GetIsCiService/index.js.map +0 -1
- package/services/GetProjectSdkService/index.js.map +0 -1
- package/services/GlobalOptionsRegistryService/index.js.map +0 -1
- package/services/LoggerService/index.js.map +0 -1
- package/services/RunCliRunnerService/index.js.map +0 -1
- package/services/StdioService/index.js.map +0 -1
- package/services/UiService/index.js.map +0 -1
- package/services/index.js.map +0 -1
|
@@ -1,146 +1,127 @@
|
|
|
1
1
|
import { createImplementation } from "@webiny/di";
|
|
2
2
|
import inquirer from "inquirer";
|
|
3
3
|
import { CliCommandFactory, GetProjectSdkService, UiService } from "../../abstractions/index.js";
|
|
4
|
-
import { setTimeout } from "node:timers/promises";
|
|
5
|
-
const sleep = (ms = 1500)
|
|
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
|
-
|
|
4
|
+
import { setTimeout as promises_setTimeout } from "node:timers/promises";
|
|
5
|
+
const sleep = (ms = 1500)=>promises_setTimeout(ms);
|
|
6
|
+
class LinkProjectCommand {
|
|
7
|
+
constructor(getProjectSdkService, uiService){
|
|
8
|
+
this.getProjectSdkService = getProjectSdkService;
|
|
9
|
+
this.uiService = uiService;
|
|
10
|
+
}
|
|
11
|
+
async execute() {
|
|
12
|
+
const projectSdk = await this.getProjectSdkService.execute();
|
|
13
|
+
const wcp = projectSdk.wcp;
|
|
14
|
+
const ui = this.uiService;
|
|
15
|
+
return {
|
|
16
|
+
name: "link-project",
|
|
17
|
+
description: "Link a Webiny project with Webiny Control Panel",
|
|
18
|
+
examples: [
|
|
19
|
+
"$0 link-project"
|
|
20
|
+
],
|
|
21
|
+
handler: async ()=>{
|
|
22
|
+
const user = await wcp.getUser();
|
|
23
|
+
if (!user) return void ui.error("You must be logged in to link a project.");
|
|
24
|
+
const orgProjectId = await projectSdk.getProjectId();
|
|
25
|
+
if (orgProjectId) {
|
|
26
|
+
const [, projectId] = orgProjectId.split("/");
|
|
27
|
+
const project = user.projects.find((item)=>item.id === projectId);
|
|
28
|
+
if (project) {
|
|
29
|
+
ui.info("Your %s project is already linked.", orgProjectId);
|
|
30
|
+
const prompt = inquirer.createPromptModule();
|
|
31
|
+
const { proceed } = await prompt({
|
|
32
|
+
name: "proceed",
|
|
33
|
+
message: "Would you like to re-link it?",
|
|
34
|
+
type: "confirm",
|
|
35
|
+
default: false
|
|
36
|
+
});
|
|
37
|
+
if (!proceed) return;
|
|
38
|
+
ui.emptyLine();
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
const wcpAppUrl = projectSdk.wcp.getWcpAppUrl().toString();
|
|
42
|
+
if (!user.orgs.length) {
|
|
43
|
+
ui.info("It seems you're not part of any organization. Please log in to Webiny Control Panel and create one.");
|
|
44
|
+
const prompt = inquirer.createPromptModule();
|
|
45
|
+
const { proceed } = await prompt({
|
|
46
|
+
name: "proceed",
|
|
47
|
+
message: "Would you like to do that now?",
|
|
48
|
+
type: "confirm",
|
|
49
|
+
default: false
|
|
50
|
+
});
|
|
51
|
+
if (proceed) open(wcpAppUrl);
|
|
52
|
+
return;
|
|
53
|
+
}
|
|
54
|
+
let selectedOrg;
|
|
55
|
+
if (1 === user.orgs.length) selectedOrg = user.orgs[0];
|
|
56
|
+
else {
|
|
57
|
+
ui.info("It seems you're part of multiple organizations. ");
|
|
58
|
+
const choices = user.orgs.map((item)=>({
|
|
59
|
+
name: item.name,
|
|
60
|
+
value: item
|
|
61
|
+
}));
|
|
62
|
+
const prompt = inquirer.createPromptModule();
|
|
63
|
+
selectedOrg = await prompt({
|
|
64
|
+
name: "org",
|
|
65
|
+
message: "Select organization:",
|
|
66
|
+
type: "select",
|
|
67
|
+
choices,
|
|
68
|
+
default: choices[0].value
|
|
69
|
+
}).then((result)=>result.org);
|
|
70
|
+
}
|
|
71
|
+
const orgProjects = user.projects.filter((item)=>item.org.id === selectedOrg.id);
|
|
72
|
+
if (!orgProjects.length) {
|
|
73
|
+
ui.info("It seems there are no projects created within the %s organization.", selectedOrg.name);
|
|
74
|
+
const prompt = inquirer.createPromptModule();
|
|
75
|
+
const { proceed } = await prompt({
|
|
76
|
+
name: "proceed",
|
|
77
|
+
message: "Would you like to create one now?",
|
|
78
|
+
type: "confirm",
|
|
79
|
+
default: false
|
|
80
|
+
});
|
|
81
|
+
if (proceed) open(wcpAppUrl);
|
|
82
|
+
return;
|
|
83
|
+
}
|
|
84
|
+
let selectedProject;
|
|
85
|
+
if (1 === orgProjects.length) selectedProject = user.projects[0];
|
|
86
|
+
else {
|
|
87
|
+
ui.info("It seems there are multiple projects created within the organization.", selectedOrg.name);
|
|
88
|
+
const choices = orgProjects.map((item)=>({
|
|
89
|
+
name: item.name,
|
|
90
|
+
value: item
|
|
91
|
+
}));
|
|
92
|
+
const prompt = inquirer.createPromptModule();
|
|
93
|
+
selectedProject = await prompt({
|
|
94
|
+
name: "project",
|
|
95
|
+
message: "Select project:",
|
|
96
|
+
type: "select",
|
|
97
|
+
choices,
|
|
98
|
+
default: choices[0].value
|
|
99
|
+
}).then((result)=>result.project);
|
|
100
|
+
}
|
|
101
|
+
await sleep();
|
|
102
|
+
ui.emptyLine();
|
|
103
|
+
ui.info("Linking %s project...", selectedProject.name);
|
|
104
|
+
await sleep();
|
|
105
|
+
await projectSdk.setProjectId(`${selectedOrg.id}/${selectedProject.id}`, {
|
|
106
|
+
force: true
|
|
107
|
+
});
|
|
108
|
+
ui.success("%s Project %s linked successfully.", "✔", selectedProject.name);
|
|
109
|
+
await sleep();
|
|
110
|
+
ui.emptyLine();
|
|
111
|
+
ui.textBold("Next Steps");
|
|
112
|
+
ui.text("‣ deploy your project via the yarn webiny deploy command");
|
|
44
113
|
}
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
}
|
|
48
|
-
const wcpAppUrl = projectSdk.wcp.getWcpAppUrl().toString();
|
|
49
|
-
|
|
50
|
-
// Get user's organizations.
|
|
51
|
-
if (!user.orgs.length) {
|
|
52
|
-
ui.info("It seems you're not part of any organization. Please log in to Webiny Control Panel and create one.");
|
|
53
|
-
const prompt = inquirer.createPromptModule();
|
|
54
|
-
const {
|
|
55
|
-
proceed
|
|
56
|
-
} = await prompt({
|
|
57
|
-
name: "proceed",
|
|
58
|
-
message: "Would you like to do that now?",
|
|
59
|
-
type: "confirm",
|
|
60
|
-
default: false
|
|
61
|
-
});
|
|
62
|
-
if (proceed) {
|
|
63
|
-
open(wcpAppUrl);
|
|
64
|
-
}
|
|
65
|
-
return;
|
|
66
|
-
}
|
|
67
|
-
let selectedOrg;
|
|
68
|
-
if (user.orgs.length === 1) {
|
|
69
|
-
selectedOrg = user.orgs[0];
|
|
70
|
-
} else {
|
|
71
|
-
ui.info("It seems you're part of multiple organizations. ");
|
|
72
|
-
const choices = user.orgs.map(item => ({
|
|
73
|
-
name: item.name,
|
|
74
|
-
value: item
|
|
75
|
-
}));
|
|
76
|
-
const prompt = inquirer.createPromptModule();
|
|
77
|
-
selectedOrg = await prompt({
|
|
78
|
-
name: "org",
|
|
79
|
-
message: "Select organization:",
|
|
80
|
-
type: "select",
|
|
81
|
-
choices,
|
|
82
|
-
default: choices[0].value
|
|
83
|
-
}).then(result => result.org);
|
|
84
|
-
}
|
|
85
|
-
const orgProjects = user.projects.filter(item => item.org.id === selectedOrg.id);
|
|
86
|
-
|
|
87
|
-
// Get user's projects.
|
|
88
|
-
if (!orgProjects.length) {
|
|
89
|
-
ui.info("It seems there are no projects created within the %s organization.", selectedOrg.name);
|
|
90
|
-
const prompt = inquirer.createPromptModule();
|
|
91
|
-
const {
|
|
92
|
-
proceed
|
|
93
|
-
} = await prompt({
|
|
94
|
-
name: "proceed",
|
|
95
|
-
message: "Would you like to create one now?",
|
|
96
|
-
type: "confirm",
|
|
97
|
-
default: false
|
|
98
|
-
});
|
|
99
|
-
if (proceed) {
|
|
100
|
-
open(wcpAppUrl);
|
|
101
|
-
}
|
|
102
|
-
return;
|
|
103
|
-
}
|
|
104
|
-
let selectedProject;
|
|
105
|
-
if (orgProjects.length === 1) {
|
|
106
|
-
selectedProject = user.projects[0];
|
|
107
|
-
} else {
|
|
108
|
-
ui.info(`It seems there are multiple projects created within the organization.`, selectedOrg.name);
|
|
109
|
-
const choices = orgProjects.map(item => ({
|
|
110
|
-
name: item.name,
|
|
111
|
-
value: item
|
|
112
|
-
}));
|
|
113
|
-
const prompt = inquirer.createPromptModule();
|
|
114
|
-
selectedProject = await prompt({
|
|
115
|
-
name: "project",
|
|
116
|
-
message: "Select project:",
|
|
117
|
-
type: "select",
|
|
118
|
-
choices,
|
|
119
|
-
default: choices[0].value
|
|
120
|
-
}).then(result => result.project);
|
|
121
|
-
}
|
|
122
|
-
await sleep();
|
|
123
|
-
ui.emptyLine();
|
|
124
|
-
ui.info("Linking %s project...", selectedProject.name);
|
|
125
|
-
await sleep();
|
|
126
|
-
|
|
127
|
-
// Assign the necessary IDs into root `webiny.project.ts` project file.
|
|
128
|
-
await projectSdk.setProjectId(`${selectedOrg.id}/${selectedProject.id}`, {
|
|
129
|
-
force: true
|
|
130
|
-
});
|
|
131
|
-
ui.success(`%s Project %s linked successfully.`, "✔", selectedProject.name);
|
|
132
|
-
await sleep();
|
|
133
|
-
ui.emptyLine();
|
|
134
|
-
ui.textBold("Next Steps");
|
|
135
|
-
ui.text(`‣ deploy your project via the yarn webiny deploy command`);
|
|
136
|
-
}
|
|
137
|
-
};
|
|
138
|
-
}
|
|
114
|
+
};
|
|
115
|
+
}
|
|
139
116
|
}
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
117
|
+
const linkProjectCommand = createImplementation({
|
|
118
|
+
abstraction: CliCommandFactory,
|
|
119
|
+
implementation: LinkProjectCommand,
|
|
120
|
+
dependencies: [
|
|
121
|
+
GetProjectSdkService,
|
|
122
|
+
UiService
|
|
123
|
+
]
|
|
144
124
|
});
|
|
125
|
+
export { LinkProjectCommand, linkProjectCommand };
|
|
145
126
|
|
|
146
127
|
//# sourceMappingURL=LinkProjectCommand.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["createImplementation","inquirer","CliCommandFactory","GetProjectSdkService","UiService","setTimeout","sleep","ms","LinkProjectCommand","constructor","getProjectSdkService","uiService","execute","projectSdk","wcp","ui","name","description","examples","handler","user","getUser","error","orgProjectId","getProjectId","projectId","split","project","projects","find","item","id","info","prompt","createPromptModule","proceed","message","type","default","emptyLine","wcpAppUrl","getWcpAppUrl","toString","orgs","length","open","selectedOrg","choices","map","value","then","result","org","orgProjects","filter","selectedProject","setProjectId","force","success","textBold","text","linkProjectCommand","abstraction","implementation","dependencies"],"sources":["LinkProjectCommand.ts"],"sourcesContent":["import { createImplementation } from \"@webiny/di\";\nimport inquirer from \"inquirer\";\nimport { CliCommandFactory, GetProjectSdkService, UiService } from \"~/abstractions/index.js\";\nimport { setTimeout } from \"node:timers/promises\";\n\nconst sleep = (ms: number = 1500) => setTimeout(ms);\n\nexport class LinkProjectCommand implements CliCommandFactory.Interface<void> {\n constructor(\n private getProjectSdkService: GetProjectSdkService.Interface,\n private uiService: UiService.Interface\n ) {}\n\n async execute() {\n const projectSdk = await this.getProjectSdkService.execute();\n const wcp = projectSdk.wcp;\n const ui = this.uiService;\n\n return {\n name: \"link-project\",\n description: \"Link a Webiny project with Webiny Control Panel\",\n examples: [\"$0 link-project\"],\n handler: async () => {\n const user = await wcp.getUser();\n\n if (!user) {\n ui.error(\"You must be logged in to link a project.\");\n return;\n }\n\n // User already linked a project?\n const orgProjectId = await projectSdk.getProjectId();\n if (orgProjectId) {\n const [, projectId] = orgProjectId.split(\"/\");\n const project = user.projects.find(item => item.id === projectId);\n if (project) {\n ui.info(\"Your %s project is already linked.\", orgProjectId);\n\n const prompt = inquirer.createPromptModule();\n const { proceed } = await prompt({\n name: \"proceed\",\n message: \"Would you like to re-link it?\",\n type: \"confirm\",\n default: false\n });\n\n if (!proceed) {\n return;\n }\n\n ui.emptyLine();\n }\n }\n\n const wcpAppUrl = projectSdk.wcp.getWcpAppUrl().toString();\n\n // Get user's organizations.\n if (!user.orgs.length) {\n ui.info(\n \"It seems you're not part of any organization. Please log in to Webiny Control Panel and create one.\"\n );\n\n const prompt = inquirer.createPromptModule();\n const { proceed } = await prompt({\n name: \"proceed\",\n message: \"Would you like to do that now?\",\n type: \"confirm\",\n default: false\n });\n\n if (proceed) {\n open(wcpAppUrl);\n }\n return;\n }\n\n let selectedOrg;\n if (user.orgs.length === 1) {\n selectedOrg = user.orgs[0];\n } else {\n ui.info(\"It seems you're part of multiple organizations. \");\n const choices = user.orgs.map(item => ({\n name: item.name,\n value: item\n }));\n\n const prompt = inquirer.createPromptModule();\n selectedOrg = await prompt({\n name: \"org\",\n message: \"Select organization:\",\n type: \"select\",\n choices,\n default: choices[0].value\n }).then(result => result.org);\n }\n\n const orgProjects = user.projects.filter(item => item.org.id === selectedOrg.id);\n\n // Get user's projects.\n if (!orgProjects.length) {\n ui.info(\n \"It seems there are no projects created within the %s organization.\",\n selectedOrg.name\n );\n\n const prompt = inquirer.createPromptModule();\n const { proceed } = await prompt({\n name: \"proceed\",\n message: \"Would you like to create one now?\",\n type: \"confirm\",\n default: false\n });\n\n if (proceed) {\n open(wcpAppUrl);\n }\n return;\n }\n\n let selectedProject;\n if (orgProjects.length === 1) {\n selectedProject = user.projects[0];\n } else {\n ui.info(\n `It seems there are multiple projects created within the organization.`,\n selectedOrg.name\n );\n const choices = orgProjects.map(item => ({\n name: item.name,\n value: item\n }));\n const prompt = inquirer.createPromptModule();\n selectedProject = await prompt({\n name: \"project\",\n message: \"Select project:\",\n type: \"select\",\n choices,\n default: choices[0].value\n }).then(result => result.project);\n }\n\n await sleep();\n ui.emptyLine();\n\n ui.info(\"Linking %s project...\", selectedProject.name);\n\n await sleep();\n\n // Assign the necessary IDs into root `webiny.project.ts` project file.\n await projectSdk.setProjectId(`${selectedOrg.id}/${selectedProject.id}`, {\n force: true\n });\n\n ui.success(`%s Project %s linked successfully.`, \"✔\", selectedProject.name);\n\n await sleep();\n\n ui.emptyLine();\n ui.textBold(\"Next Steps\");\n\n ui.text(`‣ deploy your project via the yarn webiny deploy command`);\n }\n };\n }\n}\n\nexport const linkProjectCommand = createImplementation({\n abstraction: CliCommandFactory,\n implementation: LinkProjectCommand,\n dependencies: [GetProjectSdkService, UiService]\n});\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"features/Wcp/LinkProjectCommand.js","sources":["../../../src/features/Wcp/LinkProjectCommand.ts"],"sourcesContent":["import { createImplementation } from \"@webiny/di\";\nimport inquirer from \"inquirer\";\nimport { CliCommandFactory, GetProjectSdkService, UiService } from \"~/abstractions/index.js\";\nimport { setTimeout } from \"node:timers/promises\";\n\nconst sleep = (ms: number = 1500) => setTimeout(ms);\n\nexport class LinkProjectCommand implements CliCommandFactory.Interface<void> {\n constructor(\n private getProjectSdkService: GetProjectSdkService.Interface,\n private uiService: UiService.Interface\n ) {}\n\n async execute() {\n const projectSdk = await this.getProjectSdkService.execute();\n const wcp = projectSdk.wcp;\n const ui = this.uiService;\n\n return {\n name: \"link-project\",\n description: \"Link a Webiny project with Webiny Control Panel\",\n examples: [\"$0 link-project\"],\n handler: async () => {\n const user = await wcp.getUser();\n\n if (!user) {\n ui.error(\"You must be logged in to link a project.\");\n return;\n }\n\n // User already linked a project?\n const orgProjectId = await projectSdk.getProjectId();\n if (orgProjectId) {\n const [, projectId] = orgProjectId.split(\"/\");\n const project = user.projects.find(item => item.id === projectId);\n if (project) {\n ui.info(\"Your %s project is already linked.\", orgProjectId);\n\n const prompt = inquirer.createPromptModule();\n const { proceed } = await prompt({\n name: \"proceed\",\n message: \"Would you like to re-link it?\",\n type: \"confirm\",\n default: false\n });\n\n if (!proceed) {\n return;\n }\n\n ui.emptyLine();\n }\n }\n\n const wcpAppUrl = projectSdk.wcp.getWcpAppUrl().toString();\n\n // Get user's organizations.\n if (!user.orgs.length) {\n ui.info(\n \"It seems you're not part of any organization. Please log in to Webiny Control Panel and create one.\"\n );\n\n const prompt = inquirer.createPromptModule();\n const { proceed } = await prompt({\n name: \"proceed\",\n message: \"Would you like to do that now?\",\n type: \"confirm\",\n default: false\n });\n\n if (proceed) {\n open(wcpAppUrl);\n }\n return;\n }\n\n let selectedOrg;\n if (user.orgs.length === 1) {\n selectedOrg = user.orgs[0];\n } else {\n ui.info(\"It seems you're part of multiple organizations. \");\n const choices = user.orgs.map(item => ({\n name: item.name,\n value: item\n }));\n\n const prompt = inquirer.createPromptModule();\n selectedOrg = await prompt({\n name: \"org\",\n message: \"Select organization:\",\n type: \"select\",\n choices,\n default: choices[0].value\n }).then(result => result.org);\n }\n\n const orgProjects = user.projects.filter(item => item.org.id === selectedOrg.id);\n\n // Get user's projects.\n if (!orgProjects.length) {\n ui.info(\n \"It seems there are no projects created within the %s organization.\",\n selectedOrg.name\n );\n\n const prompt = inquirer.createPromptModule();\n const { proceed } = await prompt({\n name: \"proceed\",\n message: \"Would you like to create one now?\",\n type: \"confirm\",\n default: false\n });\n\n if (proceed) {\n open(wcpAppUrl);\n }\n return;\n }\n\n let selectedProject;\n if (orgProjects.length === 1) {\n selectedProject = user.projects[0];\n } else {\n ui.info(\n `It seems there are multiple projects created within the organization.`,\n selectedOrg.name\n );\n const choices = orgProjects.map(item => ({\n name: item.name,\n value: item\n }));\n const prompt = inquirer.createPromptModule();\n selectedProject = await prompt({\n name: \"project\",\n message: \"Select project:\",\n type: \"select\",\n choices,\n default: choices[0].value\n }).then(result => result.project);\n }\n\n await sleep();\n ui.emptyLine();\n\n ui.info(\"Linking %s project...\", selectedProject.name);\n\n await sleep();\n\n // Assign the necessary IDs into root `webiny.project.ts` project file.\n await projectSdk.setProjectId(`${selectedOrg.id}/${selectedProject.id}`, {\n force: true\n });\n\n ui.success(`%s Project %s linked successfully.`, \"✔\", selectedProject.name);\n\n await sleep();\n\n ui.emptyLine();\n ui.textBold(\"Next Steps\");\n\n ui.text(`‣ deploy your project via the yarn webiny deploy command`);\n }\n };\n }\n}\n\nexport const linkProjectCommand = createImplementation({\n abstraction: CliCommandFactory,\n implementation: LinkProjectCommand,\n dependencies: [GetProjectSdkService, UiService]\n});\n"],"names":["sleep","ms","setTimeout","LinkProjectCommand","getProjectSdkService","uiService","projectSdk","wcp","ui","user","orgProjectId","projectId","project","item","prompt","inquirer","proceed","wcpAppUrl","open","selectedOrg","choices","result","orgProjects","selectedProject","linkProjectCommand","createImplementation","CliCommandFactory","GetProjectSdkService","UiService"],"mappings":"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"}
|
|
@@ -1,126 +1,112 @@
|
|
|
1
1
|
import { createImplementation } from "@webiny/di";
|
|
2
2
|
import { CliCommandFactory, GetProjectSdkService, LoggerService, UiService } from "../../abstractions/index.js";
|
|
3
|
-
import { setTimeout } from "node:timers/promises";
|
|
4
|
-
import
|
|
5
|
-
const sleep = (ms = 1500)
|
|
6
|
-
|
|
7
|
-
// 120 retries * 2000ms interval = 4 minutes until the command returns an error.
|
|
3
|
+
import { setTimeout as promises_setTimeout } from "node:timers/promises";
|
|
4
|
+
import open_0 from "open";
|
|
5
|
+
const sleep = (ms = 1500)=>promises_setTimeout(ms);
|
|
8
6
|
const LOGIN_RETRIES_COUNT = 30;
|
|
9
|
-
const LOGIN_RETRIES_INTERVAL =
|
|
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
|
-
|
|
7
|
+
const LOGIN_RETRIES_INTERVAL = 2000;
|
|
8
|
+
class LoginCommand {
|
|
9
|
+
constructor(getProjectSdkService, uiService, loggerService){
|
|
10
|
+
this.getProjectSdkService = getProjectSdkService;
|
|
11
|
+
this.uiService = uiService;
|
|
12
|
+
this.loggerService = loggerService;
|
|
13
|
+
}
|
|
14
|
+
async execute() {
|
|
15
|
+
return {
|
|
16
|
+
name: "login",
|
|
17
|
+
description: "Log in to Webiny Control Panel",
|
|
18
|
+
examples: [
|
|
19
|
+
"$0 login"
|
|
20
|
+
],
|
|
21
|
+
options: [
|
|
22
|
+
{
|
|
23
|
+
name: "pat",
|
|
24
|
+
description: "Personal Access Token (PAT) to use for authentication",
|
|
25
|
+
type: "string"
|
|
26
|
+
}
|
|
27
|
+
],
|
|
28
|
+
handler: async ({ pat: patFromParams })=>{
|
|
29
|
+
const projectSdk = await this.getProjectSdkService.execute();
|
|
30
|
+
const wcp = projectSdk.wcp;
|
|
31
|
+
const ui = this.uiService;
|
|
32
|
+
const logger = this.loggerService;
|
|
33
|
+
let pat = null;
|
|
34
|
+
if (patFromParams) {
|
|
35
|
+
pat = await wcp.getUserPat(patFromParams);
|
|
36
|
+
if (pat && pat.expiresOn) pat = await wcp.createUserPat({
|
|
37
|
+
meta: pat.meta
|
|
38
|
+
}, pat.token);
|
|
39
|
+
} else {
|
|
40
|
+
const generatedPat = await wcp.generateUserPat();
|
|
41
|
+
const queryParams = `pat=${generatedPat}&pat_name=${encodeURIComponent("Webiny CLI")}&ref=cli`;
|
|
42
|
+
const openUrl = wcp.getWcpAppUrl().join(`/login/cli?${queryParams}`).toString();
|
|
43
|
+
logger.debug("Opening %s...", openUrl);
|
|
44
|
+
await open_0(openUrl);
|
|
45
|
+
const graphql = {
|
|
46
|
+
variables: {
|
|
47
|
+
token: generatedPat
|
|
48
|
+
},
|
|
49
|
+
headers: {
|
|
50
|
+
Authorization: generatedPat
|
|
51
|
+
}
|
|
52
|
+
};
|
|
53
|
+
let retries = 0;
|
|
54
|
+
const result = await new Promise((resolve)=>{
|
|
55
|
+
const interval = setInterval(async ()=>{
|
|
56
|
+
retries++;
|
|
57
|
+
if (retries > LOGIN_RETRIES_COUNT) {
|
|
58
|
+
clearInterval(interval);
|
|
59
|
+
resolve(null);
|
|
60
|
+
}
|
|
61
|
+
try {
|
|
62
|
+
const pat = await wcp.getUserPat(generatedPat);
|
|
63
|
+
clearInterval(interval);
|
|
64
|
+
resolve(pat);
|
|
65
|
+
} catch (err) {
|
|
66
|
+
logger.debug({
|
|
67
|
+
err,
|
|
68
|
+
graphqlRequest: graphql
|
|
69
|
+
}, `Could not login. Will try again in ${LOGIN_RETRIES_INTERVAL}ms.`);
|
|
70
|
+
}
|
|
71
|
+
}, LOGIN_RETRIES_INTERVAL);
|
|
72
|
+
});
|
|
73
|
+
if (!result) throw new Error(`Could not login. Did you complete the sign in / sign up process at ${wcp.getWcpAppUrl().toString()}?`);
|
|
74
|
+
pat = result;
|
|
75
|
+
}
|
|
76
|
+
if (!pat) throw new Error("Could not log in. Could not obtain a valid Personal Access Token.");
|
|
77
|
+
projectSdk.wcp.storePatToLocalStorage(pat.token);
|
|
78
|
+
ui.success("%s You've successfully logged in to Webiny Control Panel.", "✔");
|
|
79
|
+
let projectLinked = await projectSdk.getProjectId().then((id)=>!!id);
|
|
80
|
+
if (projectLinked) return;
|
|
81
|
+
if (pat.meta && pat.meta.orgId && pat.meta.projectId) {
|
|
82
|
+
await sleep();
|
|
83
|
+
ui.emptyLine();
|
|
84
|
+
const { orgId, projectId } = pat.meta;
|
|
85
|
+
const id = `${orgId}/${projectId}`;
|
|
86
|
+
ui.info("Project %s detected. Linking...", id);
|
|
87
|
+
await projectSdk.setProjectId(id);
|
|
88
|
+
await sleep();
|
|
89
|
+
ui.success("Project %s linked successfully.", id);
|
|
90
|
+
projectLinked = true;
|
|
91
|
+
}
|
|
92
|
+
await sleep();
|
|
93
|
+
ui.emptyLine();
|
|
94
|
+
ui.textBold("Next Steps");
|
|
95
|
+
if (!projectLinked) ui.text('‣ link your project via the "yarn webiny project link" command');
|
|
96
|
+
ui.text('‣ deploy your project via the "yarn webiny deploy" command');
|
|
56
97
|
}
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
const result = await new Promise(resolve => {
|
|
60
|
-
const interval = setInterval(async () => {
|
|
61
|
-
retries++;
|
|
62
|
-
if (retries > LOGIN_RETRIES_COUNT) {
|
|
63
|
-
clearInterval(interval);
|
|
64
|
-
resolve(null);
|
|
65
|
-
}
|
|
66
|
-
try {
|
|
67
|
-
const pat = await wcp.getUserPat(generatedPat);
|
|
68
|
-
clearInterval(interval);
|
|
69
|
-
resolve(pat);
|
|
70
|
-
} catch (err) {
|
|
71
|
-
// Do nothing.
|
|
72
|
-
logger.debug({
|
|
73
|
-
err,
|
|
74
|
-
graphqlRequest: graphql
|
|
75
|
-
}, `Could not login. Will try again in ${LOGIN_RETRIES_INTERVAL}ms.`);
|
|
76
|
-
}
|
|
77
|
-
}, LOGIN_RETRIES_INTERVAL);
|
|
78
|
-
});
|
|
79
|
-
if (!result) {
|
|
80
|
-
throw new Error(`Could not login. Did you complete the sign in / sign up process at ${wcp.getWcpAppUrl().toString()}?`);
|
|
81
|
-
}
|
|
82
|
-
pat = result;
|
|
83
|
-
}
|
|
84
|
-
if (!pat) {
|
|
85
|
-
throw new Error(`Could not log in. Could not obtain a valid Personal Access Token.`);
|
|
86
|
-
}
|
|
87
|
-
projectSdk.wcp.storePatToLocalStorage(pat.token);
|
|
88
|
-
ui.success(`%s You've successfully logged in to Webiny Control Panel.`, "✔");
|
|
89
|
-
let projectLinked = await projectSdk.getProjectId().then(id => !!id);
|
|
90
|
-
if (projectLinked) {
|
|
91
|
-
return;
|
|
92
|
-
}
|
|
93
|
-
|
|
94
|
-
// If we have `orgId` and `projectId` in PAT's metadata, let's immediately link the project.
|
|
95
|
-
if (pat.meta && pat.meta.orgId && pat.meta.projectId) {
|
|
96
|
-
await sleep();
|
|
97
|
-
ui.emptyLine();
|
|
98
|
-
const {
|
|
99
|
-
orgId,
|
|
100
|
-
projectId
|
|
101
|
-
} = pat.meta;
|
|
102
|
-
const id = `${orgId}/${projectId}`;
|
|
103
|
-
ui.info(`Project %s detected. Linking...`, id);
|
|
104
|
-
await projectSdk.setProjectId(id);
|
|
105
|
-
await sleep();
|
|
106
|
-
ui.success(`Project %s linked successfully.`, id);
|
|
107
|
-
projectLinked = true;
|
|
108
|
-
}
|
|
109
|
-
await sleep();
|
|
110
|
-
ui.emptyLine();
|
|
111
|
-
ui.textBold("Next Steps");
|
|
112
|
-
if (!projectLinked) {
|
|
113
|
-
ui.text(`‣ link your project via the "yarn webiny project link" command`);
|
|
114
|
-
}
|
|
115
|
-
ui.text(`‣ deploy your project via the "yarn webiny deploy" command`);
|
|
116
|
-
}
|
|
117
|
-
};
|
|
118
|
-
}
|
|
98
|
+
};
|
|
99
|
+
}
|
|
119
100
|
}
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
101
|
+
const loginCommand = createImplementation({
|
|
102
|
+
abstraction: CliCommandFactory,
|
|
103
|
+
implementation: LoginCommand,
|
|
104
|
+
dependencies: [
|
|
105
|
+
GetProjectSdkService,
|
|
106
|
+
UiService,
|
|
107
|
+
LoggerService
|
|
108
|
+
]
|
|
124
109
|
});
|
|
110
|
+
export { LoginCommand, loginCommand };
|
|
125
111
|
|
|
126
112
|
//# sourceMappingURL=LoginCommand.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["createImplementation","CliCommandFactory","GetProjectSdkService","LoggerService","UiService","setTimeout","open","sleep","ms","LOGIN_RETRIES_COUNT","LOGIN_RETRIES_INTERVAL","LoginCommand","constructor","getProjectSdkService","uiService","loggerService","execute","name","description","examples","options","type","handler","pat","patFromParams","projectSdk","wcp","ui","logger","getUserPat","expiresOn","createUserPat","meta","token","generatedPat","generateUserPat","queryParams","encodeURIComponent","openUrl","getWcpAppUrl","join","toString","debug","graphql","variables","headers","Authorization","retries","result","Promise","resolve","interval","setInterval","clearInterval","err","graphqlRequest","Error","storePatToLocalStorage","success","projectLinked","getProjectId","then","id","orgId","projectId","emptyLine","info","setProjectId","textBold","text","loginCommand","abstraction","implementation","dependencies"],"sources":["LoginCommand.ts"],"sourcesContent":["import { createImplementation } from \"@webiny/di\";\nimport { IWcpUserPatModel } from \"@webiny/project/abstractions/models/index.js\";\nimport {\n CliCommandFactory,\n GetProjectSdkService,\n LoggerService,\n UiService\n} from \"~/abstractions/index.js\";\nimport { setTimeout } from \"node:timers/promises\";\nimport { WcpUserPatModel } from \"@webiny/project/models/index.js\";\nimport open from \"open\";\n\nconst sleep = (ms: number = 1500) => setTimeout(ms);\n\n// 120 retries * 2000ms interval = 4 minutes until the command returns an error.\nconst LOGIN_RETRIES_COUNT = 30;\nconst LOGIN_RETRIES_INTERVAL = 2_000;\n\ninterface ILoginCommandParams {\n pat?: string;\n}\n\nexport class LoginCommand implements CliCommandFactory.Interface<ILoginCommandParams> {\n constructor(\n private getProjectSdkService: GetProjectSdkService.Interface,\n private uiService: UiService.Interface,\n private loggerService: LoggerService.Interface\n ) {}\n\n async execute(): Promise<CliCommandFactory.CommandDefinition<ILoginCommandParams>> {\n return {\n name: \"login\",\n description: \"Log in to Webiny Control Panel\",\n examples: [\"$0 login\"],\n options: [\n {\n name: \"pat\",\n description: \"Personal Access Token (PAT) to use for authentication\",\n type: \"string\"\n }\n ],\n handler: async ({ pat: patFromParams }: ILoginCommandParams) => {\n const projectSdk = await this.getProjectSdkService.execute();\n const wcp = projectSdk.wcp;\n const ui = this.uiService;\n const logger = this.loggerService;\n\n let pat: IWcpUserPatModel | null = null;\n\n if (patFromParams) {\n pat = await wcp.getUserPat(patFromParams);\n\n // If we've received a PAT that has expiration, let's create a long-lived PAT.\n // We don't want to have our users interrupted because of an expired PAT.\n if (pat && pat.expiresOn) {\n pat = await wcp.createUserPat({ meta: pat.meta }, pat.token);\n }\n } else {\n const generatedPat = await wcp.generateUserPat();\n\n const queryParams = `pat=${generatedPat}&pat_name=${encodeURIComponent(\n \"Webiny CLI\"\n )}&ref=cli`;\n\n const openUrl = wcp.getWcpAppUrl().join(`/login/cli?${queryParams}`).toString();\n\n logger.debug(`Opening %s...`, openUrl);\n await open(openUrl);\n\n const graphql = {\n variables: { token: generatedPat },\n headers: {\n Authorization: generatedPat\n }\n };\n\n let retries = 0;\n\n const result = await new Promise<WcpUserPatModel | null>(resolve => {\n const interval = setInterval(async () => {\n retries++;\n if (retries > LOGIN_RETRIES_COUNT) {\n clearInterval(interval);\n resolve(null);\n }\n\n try {\n const pat = await wcp.getUserPat(generatedPat);\n clearInterval(interval);\n resolve(pat);\n } catch (err) {\n // Do nothing.\n logger.debug(\n {\n err,\n graphqlRequest: graphql\n },\n `Could not login. Will try again in ${LOGIN_RETRIES_INTERVAL}ms.`\n );\n }\n }, LOGIN_RETRIES_INTERVAL);\n });\n\n if (!result) {\n throw new Error(\n `Could not login. Did you complete the sign in / sign up process at ${wcp\n .getWcpAppUrl()\n .toString()}?`\n );\n }\n\n pat = result;\n }\n\n if (!pat) {\n throw new Error(\n `Could not log in. Could not obtain a valid Personal Access Token.`\n );\n }\n\n projectSdk.wcp.storePatToLocalStorage(pat.token);\n\n ui.success(`%s You've successfully logged in to Webiny Control Panel.`, \"✔\");\n\n let projectLinked = await projectSdk.getProjectId().then(id => !!id);\n if (projectLinked) {\n return;\n }\n\n // If we have `orgId` and `projectId` in PAT's metadata, let's immediately link the project.\n if (pat.meta && pat.meta.orgId && pat.meta.projectId) {\n await sleep();\n ui.emptyLine();\n\n const { orgId, projectId } = pat.meta;\n\n const id = `${orgId}/${projectId}`;\n ui.info(`Project %s detected. Linking...`, id);\n await projectSdk.setProjectId(id);\n\n await sleep();\n ui.success(`Project %s linked successfully.`, id);\n projectLinked = true;\n }\n\n await sleep();\n\n ui.emptyLine();\n ui.textBold(\"Next Steps\");\n\n if (!projectLinked) {\n ui.text(`‣ link your project via the \"yarn webiny project link\" command`);\n }\n\n ui.text(`‣ deploy your project via the \"yarn webiny deploy\" command`);\n }\n };\n }\n}\n\nexport const loginCommand = createImplementation({\n abstraction: CliCommandFactory,\n implementation: LoginCommand,\n dependencies: [GetProjectSdkService, UiService, LoggerService]\n});\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"features/Wcp/LoginCommand.js","sources":["../../../src/features/Wcp/LoginCommand.ts"],"sourcesContent":["import { createImplementation } from \"@webiny/di\";\nimport { IWcpUserPatModel } from \"@webiny/project/abstractions/models/index.js\";\nimport {\n CliCommandFactory,\n GetProjectSdkService,\n LoggerService,\n UiService\n} from \"~/abstractions/index.js\";\nimport { setTimeout } from \"node:timers/promises\";\nimport { WcpUserPatModel } from \"@webiny/project/models/index.js\";\nimport open from \"open\";\n\nconst sleep = (ms: number = 1500) => setTimeout(ms);\n\n// 120 retries * 2000ms interval = 4 minutes until the command returns an error.\nconst LOGIN_RETRIES_COUNT = 30;\nconst LOGIN_RETRIES_INTERVAL = 2_000;\n\ninterface ILoginCommandParams {\n pat?: string;\n}\n\nexport class LoginCommand implements CliCommandFactory.Interface<ILoginCommandParams> {\n constructor(\n private getProjectSdkService: GetProjectSdkService.Interface,\n private uiService: UiService.Interface,\n private loggerService: LoggerService.Interface\n ) {}\n\n async execute(): Promise<CliCommandFactory.CommandDefinition<ILoginCommandParams>> {\n return {\n name: \"login\",\n description: \"Log in to Webiny Control Panel\",\n examples: [\"$0 login\"],\n options: [\n {\n name: \"pat\",\n description: \"Personal Access Token (PAT) to use for authentication\",\n type: \"string\"\n }\n ],\n handler: async ({ pat: patFromParams }: ILoginCommandParams) => {\n const projectSdk = await this.getProjectSdkService.execute();\n const wcp = projectSdk.wcp;\n const ui = this.uiService;\n const logger = this.loggerService;\n\n let pat: IWcpUserPatModel | null = null;\n\n if (patFromParams) {\n pat = await wcp.getUserPat(patFromParams);\n\n // If we've received a PAT that has expiration, let's create a long-lived PAT.\n // We don't want to have our users interrupted because of an expired PAT.\n if (pat && pat.expiresOn) {\n pat = await wcp.createUserPat({ meta: pat.meta }, pat.token);\n }\n } else {\n const generatedPat = await wcp.generateUserPat();\n\n const queryParams = `pat=${generatedPat}&pat_name=${encodeURIComponent(\n \"Webiny CLI\"\n )}&ref=cli`;\n\n const openUrl = wcp.getWcpAppUrl().join(`/login/cli?${queryParams}`).toString();\n\n logger.debug(`Opening %s...`, openUrl);\n await open(openUrl);\n\n const graphql = {\n variables: { token: generatedPat },\n headers: {\n Authorization: generatedPat\n }\n };\n\n let retries = 0;\n\n const result = await new Promise<WcpUserPatModel | null>(resolve => {\n const interval = setInterval(async () => {\n retries++;\n if (retries > LOGIN_RETRIES_COUNT) {\n clearInterval(interval);\n resolve(null);\n }\n\n try {\n const pat = await wcp.getUserPat(generatedPat);\n clearInterval(interval);\n resolve(pat);\n } catch (err) {\n // Do nothing.\n logger.debug(\n {\n err,\n graphqlRequest: graphql\n },\n `Could not login. Will try again in ${LOGIN_RETRIES_INTERVAL}ms.`\n );\n }\n }, LOGIN_RETRIES_INTERVAL);\n });\n\n if (!result) {\n throw new Error(\n `Could not login. Did you complete the sign in / sign up process at ${wcp\n .getWcpAppUrl()\n .toString()}?`\n );\n }\n\n pat = result;\n }\n\n if (!pat) {\n throw new Error(\n `Could not log in. Could not obtain a valid Personal Access Token.`\n );\n }\n\n projectSdk.wcp.storePatToLocalStorage(pat.token);\n\n ui.success(`%s You've successfully logged in to Webiny Control Panel.`, \"✔\");\n\n let projectLinked = await projectSdk.getProjectId().then(id => !!id);\n if (projectLinked) {\n return;\n }\n\n // If we have `orgId` and `projectId` in PAT's metadata, let's immediately link the project.\n if (pat.meta && pat.meta.orgId && pat.meta.projectId) {\n await sleep();\n ui.emptyLine();\n\n const { orgId, projectId } = pat.meta;\n\n const id = `${orgId}/${projectId}`;\n ui.info(`Project %s detected. Linking...`, id);\n await projectSdk.setProjectId(id);\n\n await sleep();\n ui.success(`Project %s linked successfully.`, id);\n projectLinked = true;\n }\n\n await sleep();\n\n ui.emptyLine();\n ui.textBold(\"Next Steps\");\n\n if (!projectLinked) {\n ui.text(`‣ link your project via the \"yarn webiny project link\" command`);\n }\n\n ui.text(`‣ deploy your project via the \"yarn webiny deploy\" command`);\n }\n };\n }\n}\n\nexport const loginCommand = createImplementation({\n abstraction: CliCommandFactory,\n implementation: LoginCommand,\n dependencies: [GetProjectSdkService, UiService, LoggerService]\n});\n"],"names":["sleep","ms","setTimeout","LOGIN_RETRIES_COUNT","LOGIN_RETRIES_INTERVAL","LoginCommand","getProjectSdkService","uiService","loggerService","patFromParams","projectSdk","wcp","ui","logger","pat","generatedPat","queryParams","encodeURIComponent","openUrl","open","graphql","retries","result","Promise","resolve","interval","setInterval","clearInterval","err","Error","projectLinked","id","orgId","projectId","loginCommand","createImplementation","CliCommandFactory","GetProjectSdkService","UiService","LoggerService"],"mappings":"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"}
|