@hubspot/cli 7.4.9-experimental.0 → 7.4.10-beta.0
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/api/migrate.d.ts +14 -4
- package/api/migrate.js +16 -2
- package/bin/cli.js +9 -187
- package/commands/account/auth.d.ts +6 -0
- package/commands/account/auth.js +198 -0
- package/commands/account/clean.d.ts +3 -7
- package/commands/account/clean.js +54 -14
- package/commands/account/createOverride.d.ts +6 -0
- package/commands/account/createOverride.js +121 -0
- package/commands/account/info.d.ts +3 -7
- package/commands/account/info.js +51 -9
- package/commands/account/list.d.ts +3 -7
- package/commands/account/list.js +38 -13
- package/commands/account/remove.d.ts +3 -7
- package/commands/account/remove.js +57 -11
- package/commands/account/removeOverride.d.ts +6 -0
- package/commands/account/removeOverride.js +93 -0
- package/commands/account/rename.d.ts +3 -7
- package/commands/account/rename.js +16 -9
- package/commands/account/use.d.ts +5 -9
- package/commands/account/use.js +39 -9
- package/commands/account.d.ts +3 -4
- package/commands/account.js +35 -53
- package/commands/app/migrate.d.ts +5 -6
- package/commands/app/migrate.js +60 -44
- package/commands/app.d.ts +2 -5
- package/commands/app.js +9 -9
- package/commands/auth.d.ts +3 -7
- package/commands/auth.js +25 -15
- package/commands/cms/convertFields.d.ts +7 -1
- package/commands/cms/convertFields.js +57 -41
- package/commands/cms/getReactModule.d.ts +7 -1
- package/commands/cms/getReactModule.js +52 -34
- package/commands/cms/lighthouseScore.d.ts +8 -1
- package/commands/cms/lighthouseScore.js +133 -100
- package/commands/cms.d.ts +3 -1
- package/commands/cms.js +24 -16
- package/commands/completion.d.ts +3 -1
- package/commands/completion.js +25 -13
- package/commands/config/migrate.d.ts +6 -0
- package/commands/config/migrate.js +94 -0
- package/commands/config/set.d.ts +10 -1
- package/commands/config/set.js +61 -32
- package/commands/config.d.ts +3 -1
- package/commands/config.js +21 -11
- package/commands/create/api-sample.d.ts +3 -1
- package/commands/create/api-sample.js +34 -36
- package/commands/create/app.d.ts +3 -1
- package/commands/create/app.js +9 -7
- package/commands/create/function.d.ts +3 -1
- package/commands/create/function.js +11 -10
- package/commands/create/index.d.ts +5 -1
- package/commands/create/index.js +23 -11
- package/commands/create/module.d.ts +3 -1
- package/commands/create/module.js +14 -13
- package/commands/create/react-app.d.ts +3 -1
- package/commands/create/react-app.js +10 -7
- package/commands/create/template.d.ts +3 -1
- package/commands/create/template.js +14 -14
- package/commands/create/vue-app.d.ts +3 -1
- package/commands/create/vue-app.js +10 -7
- package/commands/create/webpack-serverless.d.ts +3 -1
- package/commands/create/webpack-serverless.js +10 -7
- package/commands/create/website-theme.d.ts +3 -1
- package/commands/create/website-theme.js +10 -9
- package/commands/create.d.ts +4 -24
- package/commands/create.js +64 -75
- package/commands/customObject/create.d.ts +4 -9
- package/commands/customObject/create.js +17 -10
- package/commands/customObject/schema/create.d.ts +4 -9
- package/commands/customObject/schema/create.js +18 -11
- package/commands/customObject/schema/delete.d.ts +4 -9
- package/commands/customObject/schema/delete.js +21 -11
- package/commands/customObject/schema/fetch-all.d.ts +4 -9
- package/commands/customObject/schema/fetch-all.js +19 -11
- package/commands/customObject/schema/fetch.d.ts +4 -9
- package/commands/customObject/schema/fetch.js +19 -11
- package/commands/customObject/schema/list.d.ts +4 -8
- package/commands/customObject/schema/list.js +17 -10
- package/commands/customObject/schema/update.d.ts +4 -9
- package/commands/customObject/schema/update.js +18 -11
- package/commands/customObject/schema.d.ts +3 -5
- package/commands/customObject/schema.js +27 -54
- package/commands/customObject.d.ts +3 -4
- package/commands/customObject.js +22 -48
- package/commands/doctor.d.ts +6 -8
- package/commands/doctor.js +32 -22
- package/commands/feedback.d.ts +4 -1
- package/commands/feedback.js +40 -48
- package/commands/fetch.d.ts +12 -1
- package/commands/fetch.js +49 -34
- package/commands/filemanager/fetch.d.ts +4 -9
- package/commands/filemanager/fetch.js +18 -11
- package/commands/filemanager/upload.d.ts +4 -9
- package/commands/filemanager/upload.js +17 -11
- package/commands/filemanager.d.ts +3 -4
- package/commands/filemanager.js +20 -42
- package/commands/function/deploy.d.ts +6 -1
- package/commands/function/deploy.js +70 -50
- package/commands/function/list.d.ts +6 -1
- package/commands/function/list.js +44 -32
- package/commands/function/server.d.ts +10 -1
- package/commands/function/server.js +49 -38
- package/commands/function.d.ts +5 -1
- package/commands/function.js +24 -11
- package/commands/hubdb/clear.d.ts +4 -9
- package/commands/hubdb/clear.js +21 -15
- package/commands/hubdb/create.d.ts +4 -9
- package/commands/hubdb/create.js +23 -17
- package/commands/hubdb/delete.d.ts +4 -9
- package/commands/hubdb/delete.js +24 -16
- package/commands/hubdb/fetch.d.ts +4 -9
- package/commands/hubdb/fetch.js +20 -14
- package/commands/hubdb.d.ts +3 -2
- package/commands/hubdb.js +24 -47
- package/commands/init.d.ts +3 -7
- package/commands/init.js +28 -23
- package/commands/lint.d.ts +6 -4
- package/commands/lint.js +44 -44
- package/commands/list.d.ts +3 -7
- package/commands/list.js +23 -16
- package/commands/logs.d.ts +10 -1
- package/commands/logs.js +53 -45
- package/commands/module/marketplace-validate.d.ts +6 -1
- package/commands/module/marketplace-validate.js +39 -28
- package/commands/module.d.ts +3 -1
- package/commands/module.js +22 -12
- package/commands/mv.d.ts +3 -7
- package/commands/mv.js +22 -15
- package/commands/open.d.ts +3 -7
- package/commands/open.js +22 -15
- package/commands/project/add.d.ts +3 -7
- package/commands/project/add.js +28 -23
- package/commands/project/cloneApp.d.ts +6 -8
- package/commands/project/cloneApp.js +49 -45
- package/commands/project/create.d.ts +10 -1
- package/commands/project/create.js +85 -63
- package/commands/project/deploy.d.ts +4 -6
- package/commands/project/deploy.js +66 -36
- package/commands/project/dev/deprecatedFlow.js +32 -25
- package/commands/project/dev/index.d.ts +4 -5
- package/commands/project/dev/index.js +70 -25
- package/commands/project/dev/unifiedFlow.d.ts +2 -1
- package/commands/project/dev/unifiedFlow.js +58 -27
- package/commands/project/download.d.ts +3 -7
- package/commands/project/download.js +18 -19
- package/commands/project/installDeps.d.ts +6 -1
- package/commands/project/installDeps.js +48 -32
- package/commands/project/listBuilds.d.ts +3 -7
- package/commands/project/listBuilds.js +32 -27
- package/commands/project/logs.d.ts +10 -1
- package/commands/project/logs.js +73 -65
- package/commands/project/migrate.d.ts +7 -0
- package/commands/project/migrate.js +71 -0
- package/commands/project/migrateApp.d.ts +3 -8
- package/commands/project/migrateApp.js +23 -20
- package/commands/project/open.d.ts +3 -7
- package/commands/project/open.js +29 -21
- package/commands/project/profile/add.d.ts +7 -0
- package/commands/project/profile/add.js +190 -0
- package/commands/project/profile/remove.d.ts +6 -0
- package/commands/project/profile/remove.js +119 -0
- package/commands/project/profile.d.ts +3 -0
- package/commands/project/profile.js +25 -0
- package/commands/project/upload.d.ts +10 -1
- package/commands/project/upload.js +110 -56
- package/commands/project/watch.d.ts +6 -1
- package/commands/project/watch.js +95 -61
- package/commands/project.d.ts +3 -1
- package/commands/project.js +49 -35
- package/commands/remove.d.ts +3 -7
- package/commands/remove.js +25 -15
- package/commands/sandbox/create.d.ts +4 -9
- package/commands/sandbox/create.js +27 -21
- package/commands/sandbox/delete.d.ts +4 -9
- package/commands/sandbox/delete.js +35 -29
- package/commands/sandbox.d.ts +3 -4
- package/commands/sandbox.js +20 -44
- package/commands/secret/addSecret.d.ts +4 -9
- package/commands/secret/addSecret.js +21 -15
- package/commands/secret/deleteSecret.d.ts +4 -9
- package/commands/secret/deleteSecret.js +28 -18
- package/commands/secret/listSecret.d.ts +4 -9
- package/commands/secret/listSecret.js +19 -13
- package/commands/secret/updateSecret.d.ts +4 -9
- package/commands/secret/updateSecret.js +25 -17
- package/commands/secret.d.ts +3 -4
- package/commands/secret.js +25 -49
- package/commands/theme/generate-selectors.d.ts +3 -7
- package/commands/theme/generate-selectors.js +18 -11
- package/commands/theme/marketplace-validate.d.ts +4 -9
- package/commands/theme/marketplace-validate.js +21 -15
- package/commands/theme/preview.d.ts +4 -9
- package/commands/theme/preview.js +31 -24
- package/commands/theme.d.ts +3 -4
- package/commands/theme.js +23 -47
- package/commands/upload.d.ts +12 -1
- package/commands/upload.js +118 -98
- package/commands/watch.d.ts +14 -1
- package/commands/watch.js +76 -66
- package/lang/en.d.ts +2932 -0
- package/lang/en.js +2796 -3318
- package/lang/en.lyaml +120 -58
- package/lib/accountTypes.d.ts +1 -0
- package/lib/accountTypes.js +12 -0
- package/lib/app/migrate.d.ts +33 -4
- package/lib/app/migrate.js +218 -93
- package/lib/app/migrate_legacy.d.ts +2 -2
- package/lib/app/migrate_legacy.js +15 -12
- package/lib/app/urls.d.ts +16 -0
- package/lib/app/urls.js +16 -0
- package/lib/buildAccount.d.ts +1 -2
- package/lib/buildAccount.js +11 -10
- package/lib/commonOpts.d.ts +3 -4
- package/lib/commonOpts.js +46 -18
- package/lib/configMigrate.d.ts +2 -0
- package/lib/configMigrate.js +118 -0
- package/lib/configOptions.d.ts +4 -0
- package/lib/configOptions.js +41 -45
- package/lib/constants.d.ts +10 -0
- package/lib/constants.js +11 -1
- package/lib/dependencyManagement.d.ts +0 -5
- package/lib/dependencyManagement.js +14 -40
- package/lib/doctor/Diagnosis.d.ts +1 -2
- package/lib/doctor/Diagnosis.js +19 -16
- package/lib/doctor/DiagnosticInfoBuilder.d.ts +2 -1
- package/lib/doctor/DiagnosticInfoBuilder.js +10 -9
- package/lib/doctor/Doctor.d.ts +1 -0
- package/lib/doctor/Doctor.js +59 -45
- package/lib/errorHandlers/index.js +6 -7
- package/lib/errorHandlers/suppressError.js +18 -26
- package/lib/filesystem.d.ts +1 -1
- package/lib/generateSelectors.js +1 -2
- package/lib/hasFeature.d.ts +3 -1
- package/lib/interpolation.d.ts +2 -3
- package/lib/lang.d.ts +2 -3
- package/lib/middleware/__test__/configMiddleware.test.d.ts +1 -0
- package/lib/middleware/__test__/configMiddleware.test.js +194 -0
- package/lib/middleware/__test__/gitMiddleware.test.d.ts +1 -0
- package/lib/middleware/__test__/gitMiddleware.test.js +76 -0
- package/lib/middleware/__test__/notificationsMiddleware.test.d.ts +1 -0
- package/lib/middleware/__test__/notificationsMiddleware.test.js +10 -0
- package/lib/middleware/__test__/requestMiddleware.test.d.ts +1 -0
- package/lib/middleware/__test__/requestMiddleware.test.js +20 -0
- package/lib/middleware/__test__/utils.test.d.ts +1 -0
- package/lib/middleware/__test__/utils.test.js +53 -0
- package/lib/middleware/__test__/yargsChecksMiddleware.test.d.ts +1 -0
- package/lib/middleware/__test__/yargsChecksMiddleware.test.js +81 -0
- package/lib/middleware/autoUpdateMiddleware.d.ts +1 -0
- package/lib/middleware/autoUpdateMiddleware.js +89 -0
- package/lib/middleware/configMiddleware.d.ts +13 -0
- package/lib/middleware/configMiddleware.js +124 -0
- package/lib/middleware/fireAlarmMiddleware.d.ts +4 -0
- package/lib/middleware/fireAlarmMiddleware.js +123 -0
- package/lib/middleware/gitMiddleware.d.ts +2 -0
- package/lib/middleware/gitMiddleware.js +14 -0
- package/lib/middleware/notificationsMiddleware.d.ts +1 -0
- package/lib/middleware/notificationsMiddleware.js +38 -0
- package/lib/middleware/requestMiddleware.d.ts +1 -0
- package/lib/middleware/requestMiddleware.js +11 -0
- package/lib/middleware/utils.d.ts +8 -0
- package/lib/middleware/utils.js +17 -0
- package/lib/middleware/yargsChecksMiddleware.d.ts +4 -0
- package/lib/middleware/yargsChecksMiddleware.js +24 -0
- package/lib/npm.d.ts +9 -0
- package/lib/npm.js +36 -0
- package/lib/oauth.js +1 -2
- package/lib/process.js +1 -2
- package/lib/projectProfiles.d.ts +6 -0
- package/lib/projectProfiles.js +65 -0
- package/lib/projects/ProjectLogsManager.d.ts +1 -1
- package/lib/projects/ProjectLogsManager.js +16 -21
- package/lib/projects/buildAndDeploy.js +45 -41
- package/lib/projects/config.d.ts +9 -0
- package/lib/projects/config.js +79 -0
- package/lib/projects/create.js +5 -6
- package/lib/projects/ensureProjectExists.d.ts +11 -0
- package/lib/projects/ensureProjectExists.js +97 -0
- package/lib/projects/localDev/AppDevModeInterface.d.ts +26 -0
- package/lib/projects/localDev/AppDevModeInterface.js +156 -0
- package/lib/{DevServerManager.d.ts → projects/localDev/DevServerManager.d.ts} +1 -1
- package/lib/{DevServerManager.js → projects/localDev/DevServerManager.js} +6 -6
- package/lib/projects/localDev/DevServerManagerV2.d.ts +22 -0
- package/lib/{DevServerManagerV2.js → projects/localDev/DevServerManagerV2.js} +22 -19
- package/lib/projects/localDev/LocalDevLogger.d.ts +30 -0
- package/lib/projects/localDev/LocalDevLogger.js +158 -0
- package/lib/{LocalDevManager.d.ts → projects/localDev/LocalDevManager.d.ts} +1 -1
- package/lib/{LocalDevManager.js → projects/localDev/LocalDevManager.js} +57 -83
- package/lib/projects/localDev/LocalDevProcess.d.ts +27 -0
- package/lib/projects/localDev/LocalDevProcess.js +171 -0
- package/lib/projects/localDev/LocalDevState.d.ts +37 -0
- package/lib/projects/localDev/LocalDevState.js +78 -0
- package/lib/projects/localDev/LocalDevWatcher.d.ts +10 -0
- package/lib/projects/localDev/LocalDevWatcher.js +56 -0
- package/lib/projects/localDev/LocalDevWebsocketServer.d.ts +17 -0
- package/lib/projects/localDev/LocalDevWebsocketServer.js +92 -0
- package/lib/{localDev.d.ts → projects/localDev/helpers.d.ts} +5 -4
- package/lib/{localDev.js → projects/localDev/helpers.js} +98 -114
- package/lib/projects/ui.d.ts +1 -0
- package/lib/projects/ui.js +15 -0
- package/lib/projects/upload.d.ts +14 -2
- package/lib/projects/upload.js +19 -35
- package/lib/projects/urls.d.ts +1 -0
- package/lib/projects/urls.js +6 -0
- package/lib/projects/watch.d.ts +1 -1
- package/lib/projects/watch.js +21 -18
- package/lib/prompts/accountNamePrompt.js +16 -13
- package/lib/prompts/accountsPrompt.js +1 -2
- package/lib/prompts/cmsFieldPrompt.js +1 -2
- package/lib/prompts/createApiSamplePrompt.d.ts +2 -10
- package/lib/prompts/createApiSamplePrompt.js +4 -5
- package/lib/prompts/createFunctionPrompt.js +13 -14
- package/lib/prompts/createModulePrompt.js +8 -9
- package/lib/prompts/createProjectPrompt.d.ts +11 -4
- package/lib/prompts/createProjectPrompt.js +14 -9
- package/lib/prompts/createTemplatePrompt.d.ts +22 -4
- package/lib/prompts/createTemplatePrompt.js +1 -2
- package/lib/prompts/downloadProjectPrompt.js +3 -4
- package/lib/prompts/installAppPrompt.d.ts +1 -0
- package/lib/prompts/installAppPrompt.js +35 -0
- package/lib/prompts/personalAccessKeyPrompt.js +17 -18
- package/lib/prompts/previewPrompt.js +5 -6
- package/lib/prompts/projectAddPrompt.js +4 -5
- package/lib/prompts/projectDevTargetAccountPrompt.js +18 -12
- package/lib/prompts/projectNamePrompt.js +5 -6
- package/lib/prompts/projectsLogsPrompt.js +3 -2
- package/lib/prompts/promptUtils.d.ts +3 -2
- package/lib/prompts/promptUtils.js +2 -1
- package/lib/prompts/sandboxesPrompt.js +5 -6
- package/lib/prompts/secretPrompt.js +2 -3
- package/lib/prompts/selectHubDBTablePrompt.js +11 -8
- package/lib/prompts/selectPublicAppPrompt.js +6 -7
- package/lib/prompts/setAsDefaultAccountPrompt.js +1 -2
- package/lib/prompts/uploadPrompt.js +4 -5
- package/lib/sandboxSync.js +15 -14
- package/lib/sandboxes.js +12 -13
- package/lib/serverlessLogs.js +4 -6
- package/lib/testUtils.d.ts +3 -3
- package/lib/testUtils.js +8 -9
- package/lib/ui/SpinniesManager.d.ts +1 -1
- package/lib/ui/boxen.d.ts +5 -0
- package/lib/ui/boxen.js +30 -0
- package/lib/ui/git.js +8 -9
- package/lib/ui/index.d.ts +4 -2
- package/lib/ui/index.js +20 -17
- package/lib/ui/logger.d.ts +10 -0
- package/lib/ui/logger.js +15 -0
- package/lib/ui/serverlessFunctionLogs.js +2 -3
- package/lib/ui/spinniesUtils.d.ts +5 -5
- package/lib/upload.d.ts +1 -1
- package/lib/validation.js +4 -5
- package/lib/yargsUtils.d.ts +5 -1
- package/lib/yargsUtils.js +6 -0
- package/package.json +10 -6
- package/types/Cms.d.ts +30 -0
- package/types/Cms.js +2 -0
- package/types/LocalDev.d.ts +24 -0
- package/types/LocalDev.js +2 -0
- package/types/Yargs.d.ts +12 -11
- package/lib/DevServerManagerV2.d.ts +0 -33
- package/lib/LocalDevManagerV2.d.ts +0 -64
- package/lib/LocalDevManagerV2.js +0 -377
- package/lib/projects/index.d.ts +0 -20
- package/lib/projects/index.js +0 -194
- package/lib/prompts/installPublicAppPrompt.d.ts +0 -1
- package/lib/prompts/installPublicAppPrompt.js +0 -40
|
@@ -8,16 +8,17 @@ exports.useV3Api = useV3Api;
|
|
|
8
8
|
exports.displayWarnLogs = displayWarnLogs;
|
|
9
9
|
exports.pollProjectBuildAndDeploy = pollProjectBuildAndDeploy;
|
|
10
10
|
const chalk_1 = __importDefault(require("chalk"));
|
|
11
|
-
const logger_1 = require("@hubspot/local-dev-lib/logger");
|
|
12
11
|
const projects_1 = require("@hubspot/local-dev-lib/api/projects");
|
|
13
12
|
const constants_1 = require("../constants");
|
|
14
13
|
const SpinniesManager_1 = __importDefault(require("../ui/SpinniesManager"));
|
|
15
|
-
const lang_1 = require("../lang");
|
|
16
14
|
const errorHandlers_1 = require("../errorHandlers");
|
|
17
15
|
const ui_1 = require("../ui");
|
|
18
16
|
const urls_1 = require("./urls");
|
|
19
17
|
const exitCodes_1 = require("../enums/exitCodes");
|
|
20
|
-
const
|
|
18
|
+
const en_1 = require("../../lang/en");
|
|
19
|
+
const logger_1 = require("../ui/logger");
|
|
20
|
+
const constants_2 = require("@hubspot/project-parsing-lib/src/lib/constants");
|
|
21
|
+
const project_parsing_lib_1 = require("@hubspot/project-parsing-lib");
|
|
21
22
|
const SPINNER_STATUS = {
|
|
22
23
|
SPINNING: 'spinning',
|
|
23
24
|
};
|
|
@@ -50,19 +51,14 @@ function getSubtaskType(task) {
|
|
|
50
51
|
return task.deployType;
|
|
51
52
|
}
|
|
52
53
|
function handleTaskStatusError(statusText) {
|
|
53
|
-
logger_1.
|
|
54
|
-
taskType: statusText.TYPE_KEY === constants_1.PROJECT_BUILD_TEXT.TYPE_KEY
|
|
55
|
-
? 'build'
|
|
56
|
-
: 'deploy',
|
|
57
|
-
openCommand: (0, ui_1.uiCommandReference)('hs project open'),
|
|
58
|
-
}));
|
|
54
|
+
logger_1.uiLogger.error(en_1.lib.projectBuildAndDeploy.makePollTaskStatusFunc.errorFetchingTaskStatus(statusText.TYPE_KEY === constants_1.PROJECT_BUILD_TEXT.TYPE_KEY ? 'build' : 'deploy'));
|
|
59
55
|
process.exit(exitCodes_1.EXIT_CODES.ERROR);
|
|
60
56
|
}
|
|
61
57
|
function makePollTaskStatusFunc({ statusFn, structureFn, statusText, statusStrings, linkToHubSpot, }) {
|
|
62
58
|
return async function (accountId, taskName, taskId, deployedBuildId, silenceLogs = false) {
|
|
63
59
|
const displayId = deployedBuildId || taskId;
|
|
64
60
|
if (linkToHubSpot && !silenceLogs) {
|
|
65
|
-
logger_1.
|
|
61
|
+
logger_1.uiLogger.log(`\n${linkToHubSpot(accountId, taskName, taskId, deployedBuildId)}\n`);
|
|
66
62
|
}
|
|
67
63
|
SpinniesManager_1.default.init();
|
|
68
64
|
const overallTaskSpinniesKey = `overallTaskStatus-${statusText.STATUS_TEXT}`;
|
|
@@ -77,14 +73,27 @@ function makePollTaskStatusFunc({ statusFn, structureFn, statusText, statusStrin
|
|
|
77
73
|
structureFn(accountId, taskName, taskId),
|
|
78
74
|
]);
|
|
79
75
|
const subtasks = getSubtasks(initialTaskStatus);
|
|
80
|
-
const
|
|
76
|
+
const hiddenComponentBuildIds = [];
|
|
77
|
+
const tasksById = subtasks
|
|
78
|
+
.filter(subtask => {
|
|
79
|
+
// TODO: Remove this filtering logic when visible=false for SERVERLESS_PACKAGE
|
|
80
|
+
const shouldBeVisible = getSubtaskType(subtask) !== (0, project_parsing_lib_1.mapToInternalType)(constants_2.AppFunctionsPackageKey);
|
|
81
|
+
if (!shouldBeVisible) {
|
|
82
|
+
hiddenComponentBuildIds.push(subtask.id);
|
|
83
|
+
}
|
|
84
|
+
return shouldBeVisible;
|
|
85
|
+
})
|
|
86
|
+
.reduce((acc, subtask) => {
|
|
81
87
|
const { id, visible } = subtask;
|
|
82
88
|
if (visible) {
|
|
83
89
|
acc[id] = subtask;
|
|
84
90
|
}
|
|
85
91
|
return acc;
|
|
86
92
|
}, {});
|
|
87
|
-
const structuredTasks = Object.keys(taskStructure)
|
|
93
|
+
const structuredTasks = Object.keys(taskStructure)
|
|
94
|
+
// TODO: Remove this filtering logic when visible=false for SERVERLESS_PACKAGE
|
|
95
|
+
.filter(buildId => !hiddenComponentBuildIds.includes(buildId))
|
|
96
|
+
.map(key => {
|
|
88
97
|
return {
|
|
89
98
|
...tasksById[key],
|
|
90
99
|
subtasks: taskStructure[key]
|
|
@@ -95,9 +104,10 @@ function makePollTaskStatusFunc({ statusFn, structureFn, statusText, statusStrin
|
|
|
95
104
|
const numComponents = structuredTasks.length;
|
|
96
105
|
const componentCountText = silenceLogs
|
|
97
106
|
? ''
|
|
98
|
-
:
|
|
99
|
-
?
|
|
100
|
-
|
|
107
|
+
: numComponents === 1
|
|
108
|
+
? en_1.lib.projectBuildAndDeploy.makePollTaskStatusFunc
|
|
109
|
+
.componentCountSingular
|
|
110
|
+
: en_1.lib.projectBuildAndDeploy.makePollTaskStatusFunc.componentCount(numComponents);
|
|
101
111
|
SpinniesManager_1.default.update(overallTaskSpinniesKey, {
|
|
102
112
|
text: `${statusStrings.INITIALIZE(taskName, displayId)}\n${componentCountText}`,
|
|
103
113
|
});
|
|
@@ -129,7 +139,7 @@ function makePollTaskStatusFunc({ statusFn, structureFn, statusText, statusStrin
|
|
|
129
139
|
taskStatus = data;
|
|
130
140
|
}
|
|
131
141
|
catch (e) {
|
|
132
|
-
logger_1.
|
|
142
|
+
logger_1.uiLogger.debug(e);
|
|
133
143
|
(0, errorHandlers_1.logError)(e, new errorHandlers_1.ApiErrorContext({
|
|
134
144
|
accountId,
|
|
135
145
|
projectName: taskName,
|
|
@@ -152,8 +162,10 @@ function makePollTaskStatusFunc({ statusFn, structureFn, statusText, statusStrin
|
|
|
152
162
|
if (status === statusText.STATES.SUCCESS ||
|
|
153
163
|
status === statusText.STATES.FAILURE) {
|
|
154
164
|
const taskStatusText = subtask.status === statusText.STATES.SUCCESS
|
|
155
|
-
?
|
|
156
|
-
|
|
165
|
+
? en_1.lib.projectBuildAndDeploy.makePollTaskStatusFunc
|
|
166
|
+
.successStatusText
|
|
167
|
+
: en_1.lib.projectBuildAndDeploy.makePollTaskStatusFunc
|
|
168
|
+
.failedStatusText;
|
|
157
169
|
const hasNewline = spinner?.text?.includes('\n') || Boolean(topLevelTask);
|
|
158
170
|
const updatedText = `${spinner?.text?.replace('\n', '')} ${taskStatusText}${hasNewline ? '\n' : ''}`;
|
|
159
171
|
if (status === statusText.STATES.SUCCESS) {
|
|
@@ -181,23 +193,23 @@ function makePollTaskStatusFunc({ statusFn, structureFn, statusText, statusStrin
|
|
|
181
193
|
if (!silenceLogs) {
|
|
182
194
|
const failedSubtasks = subtasks.filter(subtask => subtask.status === 'FAILURE');
|
|
183
195
|
(0, ui_1.uiLine)();
|
|
184
|
-
logger_1.
|
|
196
|
+
logger_1.uiLogger.log(`${statusStrings.SUBTASK_FAIL(failedSubtasks.length === 1
|
|
185
197
|
? getSubtaskName(failedSubtasks[0])
|
|
186
198
|
: failedSubtasks.length + ' components', displayId)}\n`);
|
|
187
|
-
logger_1.
|
|
199
|
+
logger_1.uiLogger.log(en_1.lib.projectBuildAndDeploy.makePollTaskStatusFunc.errorSummary);
|
|
188
200
|
(0, ui_1.uiLine)();
|
|
189
201
|
const displayErrors = failedSubtasks.filter(subtask => subtask?.standardError?.subCategory !==
|
|
190
202
|
constants_1.PROJECT_ERROR_TYPES.SUBBUILD_FAILED &&
|
|
191
203
|
subtask?.standardError?.subCategory !==
|
|
192
204
|
constants_1.PROJECT_ERROR_TYPES.SUBDEPLOY_FAILED);
|
|
193
205
|
displayErrors.forEach(subTask => {
|
|
194
|
-
logger_1.
|
|
195
|
-
logger_1.
|
|
206
|
+
logger_1.uiLogger.log(`\n--- ${chalk_1.default.bold(getSubtaskName(subTask))} failed with the following error ---`);
|
|
207
|
+
logger_1.uiLogger.error(subTask.errorMessage);
|
|
196
208
|
// Log nested errors
|
|
197
209
|
if (subTask.standardError && subTask.standardError.errors) {
|
|
198
|
-
logger_1.
|
|
210
|
+
logger_1.uiLogger.log('');
|
|
199
211
|
subTask.standardError.errors.forEach(error => {
|
|
200
|
-
logger_1.
|
|
212
|
+
logger_1.uiLogger.log(error.message);
|
|
201
213
|
});
|
|
202
214
|
}
|
|
203
215
|
});
|
|
@@ -224,11 +236,11 @@ function pollBuildAutodeployStatus(accountId, taskName, buildId) {
|
|
|
224
236
|
build = response.data;
|
|
225
237
|
}
|
|
226
238
|
catch (e) {
|
|
227
|
-
logger_1.
|
|
228
|
-
return reject(new Error(
|
|
239
|
+
logger_1.uiLogger.debug(e);
|
|
240
|
+
return reject(new Error(en_1.lib.projectBuildAndDeploy.pollBuildAutodeployStatusError(buildId)));
|
|
229
241
|
}
|
|
230
242
|
if (!build || !build.status) {
|
|
231
|
-
return reject(new Error(
|
|
243
|
+
return reject(new Error(en_1.lib.projectBuildAndDeploy.pollBuildAutodeployStatusError(buildId)));
|
|
232
244
|
}
|
|
233
245
|
if (build.deployStatusTaskLocator || maxIntervals <= 0) {
|
|
234
246
|
clearInterval(pollInterval);
|
|
@@ -287,9 +299,9 @@ async function displayWarnLogs(accountId, projectName, taskId, isDeploy = false)
|
|
|
287
299
|
if (result && result.logs) {
|
|
288
300
|
const logLength = result.logs.length;
|
|
289
301
|
result.logs.forEach((log, i) => {
|
|
290
|
-
logger_1.
|
|
302
|
+
logger_1.uiLogger.warn(log.message);
|
|
291
303
|
if (i < logLength - 1) {
|
|
292
|
-
logger_1.
|
|
304
|
+
logger_1.uiLogger.log('');
|
|
293
305
|
}
|
|
294
306
|
});
|
|
295
307
|
}
|
|
@@ -311,10 +323,7 @@ async function pollProjectBuildAndDeploy(accountId, projectConfig, tempFile, bui
|
|
|
311
323
|
}
|
|
312
324
|
else if (buildStatus.isAutoDeployEnabled) {
|
|
313
325
|
if (!silenceLogs) {
|
|
314
|
-
logger_1.
|
|
315
|
-
accountIdentifier: (0, ui_1.uiAccountDescription)(accountId),
|
|
316
|
-
buildId,
|
|
317
|
-
}));
|
|
326
|
+
logger_1.uiLogger.log(en_1.lib.projectBuildAndDeploy.pollProjectBuildAndDeploy.buildSucceededAutomaticallyDeploying(buildId, (0, ui_1.uiAccountDescription)(accountId)));
|
|
318
327
|
await displayWarnLogs(accountId, projectConfig.name, buildId);
|
|
319
328
|
}
|
|
320
329
|
// autoDeployId of 0 indicates a skipped deploy
|
|
@@ -331,22 +340,17 @@ async function pollProjectBuildAndDeploy(accountId, projectConfig, tempFile, bui
|
|
|
331
340
|
}
|
|
332
341
|
}
|
|
333
342
|
else if (!silenceLogs) {
|
|
334
|
-
logger_1.
|
|
335
|
-
buildId,
|
|
336
|
-
viewDeploysLink: (0, ui_1.uiLink)((0, lang_1.i18n)(`${i18nKey}.pollProjectBuildAndDeploy.viewDeploys`), (0, urls_1.getProjectActivityUrl)(projectConfig.name, accountId)),
|
|
337
|
-
}));
|
|
343
|
+
logger_1.uiLogger.log(en_1.lib.projectBuildAndDeploy.pollProjectBuildAndDeploy.unableToFindAutodeployStatus(buildId, (0, ui_1.uiLink)(en_1.lib.projectBuildAndDeploy.pollProjectBuildAndDeploy.viewDeploys, (0, urls_1.getProjectActivityUrl)(projectConfig.name, accountId))));
|
|
338
344
|
}
|
|
339
345
|
}
|
|
340
346
|
try {
|
|
341
347
|
if (tempFile) {
|
|
342
348
|
tempFile.removeCallback();
|
|
343
|
-
logger_1.
|
|
344
|
-
path: tempFile.name,
|
|
345
|
-
}));
|
|
349
|
+
logger_1.uiLogger.debug(en_1.lib.projectBuildAndDeploy.pollProjectBuildAndDeploy.cleanedUpTempFile(tempFile.name));
|
|
346
350
|
}
|
|
347
351
|
}
|
|
348
352
|
catch (e) {
|
|
349
|
-
|
|
353
|
+
(0, errorHandlers_1.logError)(e);
|
|
350
354
|
}
|
|
351
355
|
if (result && result.deployResult) {
|
|
352
356
|
await displayWarnLogs(accountId, projectConfig.name, result.deployResult.deployId, true);
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { ProjectConfig } from '../../types/Projects';
|
|
2
|
+
export declare function writeProjectConfig(configPath: string, config: ProjectConfig): boolean;
|
|
3
|
+
export declare function getIsInProject(dir?: string): boolean;
|
|
4
|
+
export interface LoadedProjectConfig {
|
|
5
|
+
projectDir: string | null;
|
|
6
|
+
projectConfig: ProjectConfig | null;
|
|
7
|
+
}
|
|
8
|
+
export declare function getProjectConfig(dir?: string): Promise<LoadedProjectConfig>;
|
|
9
|
+
export declare function validateProjectConfig(projectConfig: ProjectConfig | null, projectDir: string | null): asserts projectConfig is ProjectConfig;
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.writeProjectConfig = writeProjectConfig;
|
|
7
|
+
exports.getIsInProject = getIsInProject;
|
|
8
|
+
exports.getProjectConfig = getProjectConfig;
|
|
9
|
+
exports.validateProjectConfig = validateProjectConfig;
|
|
10
|
+
const fs_extra_1 = __importDefault(require("fs-extra"));
|
|
11
|
+
const path_1 = __importDefault(require("path"));
|
|
12
|
+
const findup_sync_1 = __importDefault(require("findup-sync"));
|
|
13
|
+
const path_2 = require("@hubspot/local-dev-lib/path");
|
|
14
|
+
const constants_1 = require("../constants");
|
|
15
|
+
const en_1 = require("../../lang/en");
|
|
16
|
+
const exitCodes_1 = require("../enums/exitCodes");
|
|
17
|
+
const logger_1 = require("../ui/logger");
|
|
18
|
+
function writeProjectConfig(configPath, config) {
|
|
19
|
+
try {
|
|
20
|
+
fs_extra_1.default.ensureFileSync(configPath);
|
|
21
|
+
fs_extra_1.default.writeFileSync(configPath, JSON.stringify(config, null, 2));
|
|
22
|
+
logger_1.uiLogger.debug(`Wrote project config at ${configPath}`);
|
|
23
|
+
}
|
|
24
|
+
catch (e) {
|
|
25
|
+
logger_1.uiLogger.debug(e);
|
|
26
|
+
return false;
|
|
27
|
+
}
|
|
28
|
+
return true;
|
|
29
|
+
}
|
|
30
|
+
function getIsInProject(dir) {
|
|
31
|
+
const configPath = getProjectConfigPath(dir);
|
|
32
|
+
return !!configPath;
|
|
33
|
+
}
|
|
34
|
+
function getProjectConfigPath(dir) {
|
|
35
|
+
const projectDir = dir ? (0, path_2.getAbsoluteFilePath)(dir) : (0, path_2.getCwd)();
|
|
36
|
+
const configPath = (0, findup_sync_1.default)(constants_1.PROJECT_CONFIG_FILE, {
|
|
37
|
+
cwd: projectDir,
|
|
38
|
+
nocase: true,
|
|
39
|
+
});
|
|
40
|
+
return configPath;
|
|
41
|
+
}
|
|
42
|
+
async function getProjectConfig(dir) {
|
|
43
|
+
const configPath = getProjectConfigPath(dir);
|
|
44
|
+
if (!configPath) {
|
|
45
|
+
return { projectConfig: null, projectDir: null };
|
|
46
|
+
}
|
|
47
|
+
try {
|
|
48
|
+
const config = fs_extra_1.default.readFileSync(configPath);
|
|
49
|
+
const projectConfig = JSON.parse(config.toString());
|
|
50
|
+
return {
|
|
51
|
+
projectDir: path_1.default.dirname(configPath),
|
|
52
|
+
projectConfig,
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
catch (e) {
|
|
56
|
+
logger_1.uiLogger.error(en_1.lib.projects.getProjectConfig.error);
|
|
57
|
+
return { projectConfig: null, projectDir: null };
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
function validateProjectConfig(projectConfig, projectDir) {
|
|
61
|
+
if (!projectConfig || !projectDir) {
|
|
62
|
+
logger_1.uiLogger.error(en_1.lib.projects.validateProjectConfig.configNotFound);
|
|
63
|
+
return process.exit(exitCodes_1.EXIT_CODES.ERROR);
|
|
64
|
+
}
|
|
65
|
+
if (!projectConfig.name || !projectConfig.srcDir) {
|
|
66
|
+
logger_1.uiLogger.error(en_1.lib.projects.validateProjectConfig.configMissingFields);
|
|
67
|
+
return process.exit(exitCodes_1.EXIT_CODES.ERROR);
|
|
68
|
+
}
|
|
69
|
+
const resolvedPath = path_1.default.resolve(projectDir, projectConfig.srcDir);
|
|
70
|
+
if (!resolvedPath.startsWith(projectDir)) {
|
|
71
|
+
const projectConfigFile = path_1.default.relative('.', path_1.default.join(projectDir, constants_1.PROJECT_CONFIG_FILE));
|
|
72
|
+
logger_1.uiLogger.error(en_1.lib.projects.validateProjectConfig.srcOutsideProjectDir(projectConfigFile, projectConfig.srcDir));
|
|
73
|
+
return process.exit(exitCodes_1.EXIT_CODES.ERROR);
|
|
74
|
+
}
|
|
75
|
+
if (!fs_extra_1.default.existsSync(resolvedPath)) {
|
|
76
|
+
logger_1.uiLogger.error(en_1.lib.projects.validateProjectConfig.srcDirNotFound(projectConfig.srcDir, projectDir));
|
|
77
|
+
return process.exit(exitCodes_1.EXIT_CODES.ERROR);
|
|
78
|
+
}
|
|
79
|
+
}
|
package/lib/projects/create.js
CHANGED
|
@@ -3,13 +3,12 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.EMPTY_PROJECT_TEMPLATE_NAME = void 0;
|
|
4
4
|
exports.getProjectComponentListFromRepo = getProjectComponentListFromRepo;
|
|
5
5
|
exports.getProjectTemplateListFromRepo = getProjectTemplateListFromRepo;
|
|
6
|
-
const logger_1 = require("@hubspot/local-dev-lib/logger");
|
|
7
6
|
const github_1 = require("@hubspot/local-dev-lib/api/github");
|
|
8
7
|
const constants_1 = require("../constants");
|
|
9
8
|
const exitCodes_1 = require("../enums/exitCodes");
|
|
10
|
-
const lang_1 = require("../lang");
|
|
11
9
|
const index_1 = require("../errorHandlers/index");
|
|
12
|
-
const
|
|
10
|
+
const en_1 = require("../../lang/en");
|
|
11
|
+
const logger_1 = require("../ui/logger");
|
|
13
12
|
exports.EMPTY_PROJECT_TEMPLATE_NAME = 'no-template';
|
|
14
13
|
const PROJECT_TEMPLATE_PROPERTIES = ['name', 'label', 'path', 'insertPath'];
|
|
15
14
|
async function getProjectComponentListFromRepo(githubRef) {
|
|
@@ -34,17 +33,17 @@ async function getProjectTemplateListFromRepo(templateSource, githubRef) {
|
|
|
34
33
|
}
|
|
35
34
|
catch (e) {
|
|
36
35
|
(0, index_1.debugError)(e);
|
|
37
|
-
logger_1.
|
|
36
|
+
logger_1.uiLogger.error(en_1.lib.projects.create.errors.missingConfigFileTemplateSource);
|
|
38
37
|
return process.exit(exitCodes_1.EXIT_CODES.ERROR);
|
|
39
38
|
}
|
|
40
39
|
if (!config || !config[constants_1.PROJECT_COMPONENT_TYPES.PROJECTS]) {
|
|
41
|
-
logger_1.
|
|
40
|
+
logger_1.uiLogger.error(en_1.lib.projects.create.errors.noProjectsInConfig);
|
|
42
41
|
return process.exit(exitCodes_1.EXIT_CODES.ERROR);
|
|
43
42
|
}
|
|
44
43
|
const templates = config[constants_1.PROJECT_COMPONENT_TYPES.PROJECTS];
|
|
45
44
|
const templatesContainAllProperties = templates.every(config => PROJECT_TEMPLATE_PROPERTIES.every(p => Object.prototype.hasOwnProperty.call(config, p)));
|
|
46
45
|
if (!templatesContainAllProperties) {
|
|
47
|
-
logger_1.
|
|
46
|
+
logger_1.uiLogger.error(en_1.lib.projects.create.errors.missingPropertiesInConfig);
|
|
48
47
|
return process.exit(exitCodes_1.EXIT_CODES.ERROR);
|
|
49
48
|
}
|
|
50
49
|
return templates;
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { Project } from '@hubspot/local-dev-lib/types/Project';
|
|
2
|
+
export declare function ensureProjectExists(accountId: number, projectName: string, { forceCreate, allowCreate, noLogs, withPolling, uploadCommand, }?: {
|
|
3
|
+
forceCreate?: boolean | undefined;
|
|
4
|
+
allowCreate?: boolean | undefined;
|
|
5
|
+
noLogs?: boolean | undefined;
|
|
6
|
+
withPolling?: boolean | undefined;
|
|
7
|
+
uploadCommand?: boolean | undefined;
|
|
8
|
+
}): Promise<{
|
|
9
|
+
projectExists: boolean;
|
|
10
|
+
project?: Project;
|
|
11
|
+
}>;
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.ensureProjectExists = ensureProjectExists;
|
|
7
|
+
const projects_1 = require("@hubspot/local-dev-lib/api/projects");
|
|
8
|
+
const index_1 = require("@hubspot/local-dev-lib/errors/index");
|
|
9
|
+
const constants_1 = require("../constants");
|
|
10
|
+
const promptUtils_1 = require("../prompts/promptUtils");
|
|
11
|
+
const exitCodes_1 = require("../enums/exitCodes");
|
|
12
|
+
const ui_1 = require("../ui");
|
|
13
|
+
const SpinniesManager_1 = __importDefault(require("../ui/SpinniesManager"));
|
|
14
|
+
const index_2 = require("../errorHandlers/index");
|
|
15
|
+
const en_1 = require("../../lang/en");
|
|
16
|
+
const logger_1 = require("../ui/logger");
|
|
17
|
+
async function pollFetchProject(accountId, projectName) {
|
|
18
|
+
// Temporary solution for gating slowness. Retry on 403 statusCode
|
|
19
|
+
return new Promise((resolve, reject) => {
|
|
20
|
+
let pollCount = 0;
|
|
21
|
+
SpinniesManager_1.default.init();
|
|
22
|
+
SpinniesManager_1.default.add('pollFetchProject', {
|
|
23
|
+
text: en_1.lib.projects.pollFetchProject.checkingProject((0, ui_1.uiAccountDescription)(accountId)),
|
|
24
|
+
});
|
|
25
|
+
const pollInterval = setInterval(async () => {
|
|
26
|
+
try {
|
|
27
|
+
const response = await (0, projects_1.fetchProject)(accountId, projectName);
|
|
28
|
+
if (response && response.data) {
|
|
29
|
+
SpinniesManager_1.default.remove('pollFetchProject');
|
|
30
|
+
clearInterval(pollInterval);
|
|
31
|
+
resolve(response);
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
catch (err) {
|
|
35
|
+
if ((0, index_1.isSpecifiedError)(err, {
|
|
36
|
+
statusCode: 403,
|
|
37
|
+
category: 'GATED',
|
|
38
|
+
subCategory: 'BuildPipelineErrorType.PORTAL_GATED',
|
|
39
|
+
}) &&
|
|
40
|
+
pollCount < 15) {
|
|
41
|
+
pollCount += 1;
|
|
42
|
+
}
|
|
43
|
+
else {
|
|
44
|
+
SpinniesManager_1.default.remove('pollFetchProject');
|
|
45
|
+
clearInterval(pollInterval);
|
|
46
|
+
reject(err);
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
}, constants_1.DEFAULT_POLLING_DELAY);
|
|
50
|
+
});
|
|
51
|
+
}
|
|
52
|
+
async function ensureProjectExists(accountId, projectName, { forceCreate = false, allowCreate = true, noLogs = false, withPolling = false, uploadCommand = false, } = {}) {
|
|
53
|
+
const accountIdentifier = (0, ui_1.uiAccountDescription)(accountId);
|
|
54
|
+
try {
|
|
55
|
+
const { data: project } = withPolling
|
|
56
|
+
? await pollFetchProject(accountId, projectName)
|
|
57
|
+
: await (0, projects_1.fetchProject)(accountId, projectName);
|
|
58
|
+
return { projectExists: !!project, project };
|
|
59
|
+
}
|
|
60
|
+
catch (err) {
|
|
61
|
+
if ((0, index_1.isSpecifiedError)(err, { statusCode: 404 })) {
|
|
62
|
+
let shouldCreateProject = forceCreate;
|
|
63
|
+
if (allowCreate && !shouldCreateProject) {
|
|
64
|
+
const promptLangFunction = uploadCommand
|
|
65
|
+
? en_1.lib.projects.ensureProjectExists.createPromptUpload
|
|
66
|
+
: en_1.lib.projects.ensureProjectExists.createPrompt;
|
|
67
|
+
const promptResult = await (0, promptUtils_1.promptUser)([
|
|
68
|
+
{
|
|
69
|
+
name: 'shouldCreateProject',
|
|
70
|
+
message: promptLangFunction(projectName, accountIdentifier),
|
|
71
|
+
type: 'confirm',
|
|
72
|
+
},
|
|
73
|
+
]);
|
|
74
|
+
shouldCreateProject = promptResult.shouldCreateProject;
|
|
75
|
+
}
|
|
76
|
+
if (shouldCreateProject) {
|
|
77
|
+
try {
|
|
78
|
+
const { data: project } = await (0, projects_1.createProject)(accountId, projectName);
|
|
79
|
+
logger_1.uiLogger.success(en_1.lib.projects.ensureProjectExists.createSuccess(projectName, accountIdentifier));
|
|
80
|
+
return { projectExists: true, project };
|
|
81
|
+
}
|
|
82
|
+
catch (err) {
|
|
83
|
+
(0, index_2.logError)(err, new index_2.ApiErrorContext({ accountId }));
|
|
84
|
+
return { projectExists: false };
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
else {
|
|
88
|
+
if (!noLogs) {
|
|
89
|
+
logger_1.uiLogger.log(en_1.lib.projects.ensureProjectExists.notFound(projectName, accountIdentifier));
|
|
90
|
+
}
|
|
91
|
+
return { projectExists: false };
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
(0, index_2.logError)(err, new index_2.ApiErrorContext({ accountId }));
|
|
95
|
+
process.exit(exitCodes_1.EXIT_CODES.ERROR);
|
|
96
|
+
}
|
|
97
|
+
}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { PublicApp } from '@hubspot/local-dev-lib/types/Apps';
|
|
2
|
+
import { AppIRNode } from '../../../types/ProjectComponents';
|
|
3
|
+
import LocalDevState from './LocalDevState';
|
|
4
|
+
import LocalDevLogger from './LocalDevLogger';
|
|
5
|
+
type AppDevModeInterfaceConstructorOptions = {
|
|
6
|
+
localDevState: LocalDevState;
|
|
7
|
+
localDevLogger: LocalDevLogger;
|
|
8
|
+
};
|
|
9
|
+
declare class AppDevModeInterface {
|
|
10
|
+
localDevState: LocalDevState;
|
|
11
|
+
localDevLogger: LocalDevLogger;
|
|
12
|
+
_appNode?: AppIRNode | null;
|
|
13
|
+
appData?: PublicApp;
|
|
14
|
+
marketplaceAppInstalls?: number;
|
|
15
|
+
constructor(options: AppDevModeInterfaceConstructorOptions);
|
|
16
|
+
private get appNode();
|
|
17
|
+
private getAppInstallUrl;
|
|
18
|
+
private fetchAppData;
|
|
19
|
+
private checkMarketplaceAppInstalls;
|
|
20
|
+
private checkTestAccountAppInstallation;
|
|
21
|
+
setup(args: any): Promise<void>;
|
|
22
|
+
start(): Promise<void>;
|
|
23
|
+
fileChange(filePath: string, event: string): Promise<void>;
|
|
24
|
+
cleanup(): Promise<void>;
|
|
25
|
+
}
|
|
26
|
+
export default AppDevModeInterface;
|
|
@@ -0,0 +1,156 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const localDevAuth_1 = require("@hubspot/local-dev-lib/api/localDevAuth");
|
|
4
|
+
const appsDev_1 = require("@hubspot/local-dev-lib/api/appsDev");
|
|
5
|
+
const ui_extensions_dev_server_1 = require("@hubspot/ui-extensions-dev-server");
|
|
6
|
+
const portManager_1 = require("@hubspot/local-dev-lib/portManager");
|
|
7
|
+
const constants_1 = require("../../constants");
|
|
8
|
+
const exitCodes_1 = require("../../enums/exitCodes");
|
|
9
|
+
const structure_1 = require("../../projects/structure");
|
|
10
|
+
const ui_1 = require("../../ui");
|
|
11
|
+
const index_1 = require("../../errorHandlers/index");
|
|
12
|
+
const installAppPrompt_1 = require("../../prompts/installAppPrompt");
|
|
13
|
+
const promptUtils_1 = require("../../prompts/promptUtils");
|
|
14
|
+
const en_1 = require("../../../lang/en");
|
|
15
|
+
const logger_1 = require("../../ui/logger");
|
|
16
|
+
const urls_1 = require("../../app/urls");
|
|
17
|
+
class AppDevModeInterface {
|
|
18
|
+
localDevState;
|
|
19
|
+
localDevLogger;
|
|
20
|
+
_appNode;
|
|
21
|
+
appData;
|
|
22
|
+
marketplaceAppInstalls;
|
|
23
|
+
constructor(options) {
|
|
24
|
+
this.localDevState = options.localDevState;
|
|
25
|
+
this.localDevLogger = options.localDevLogger;
|
|
26
|
+
// Static auth apps are currently only installable in the portal that the project resides in
|
|
27
|
+
// This limitation will eventually be removed, but in the meantime we need this check or the install
|
|
28
|
+
// will always fail with a confusing message
|
|
29
|
+
if (this.appNode?.config.auth.type === constants_1.APP_AUTH_TYPES.STATIC &&
|
|
30
|
+
this.localDevState.targetTestingAccountId !==
|
|
31
|
+
this.localDevState.targetProjectAccountId) {
|
|
32
|
+
logger_1.uiLogger.error(en_1.lib.LocalDevManager.staticAuthAccountsMustMatch);
|
|
33
|
+
process.exit(exitCodes_1.EXIT_CODES.ERROR);
|
|
34
|
+
}
|
|
35
|
+
if (!this.localDevState.targetProjectAccountId ||
|
|
36
|
+
!this.localDevState.projectConfig ||
|
|
37
|
+
!this.localDevState.projectDir) {
|
|
38
|
+
logger_1.uiLogger.error(en_1.lib.LocalDevManager.failedToInitialize);
|
|
39
|
+
process.exit(exitCodes_1.EXIT_CODES.ERROR);
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
// Assumes only one app per project
|
|
43
|
+
get appNode() {
|
|
44
|
+
if (this._appNode === undefined) {
|
|
45
|
+
this._appNode =
|
|
46
|
+
Object.values(this.localDevState.projectNodes).find(structure_1.isAppIRNode) ||
|
|
47
|
+
null;
|
|
48
|
+
}
|
|
49
|
+
return this._appNode;
|
|
50
|
+
}
|
|
51
|
+
async getAppInstallUrl() {
|
|
52
|
+
if (this.appNode?.config.auth.type === constants_1.APP_AUTH_TYPES.OAUTH) {
|
|
53
|
+
return (0, urls_1.getOauthAppInstallUrl)({
|
|
54
|
+
targetAccountId: this.localDevState.targetTestingAccountId,
|
|
55
|
+
env: this.localDevState.env,
|
|
56
|
+
clientId: this.appData.clientId, // This is only called after checking that appData exists
|
|
57
|
+
scopes: this.appNode.config.auth.requiredScopes,
|
|
58
|
+
redirectUrls: this.appNode.config.auth.redirectUrls,
|
|
59
|
+
});
|
|
60
|
+
}
|
|
61
|
+
const { data: { results }, } = await (0, appsDev_1.fetchPublicAppsForPortal)(this.localDevState.targetProjectAccountId);
|
|
62
|
+
const app = results.find(app => app.sourceId === this.appNode?.uid);
|
|
63
|
+
if (!app) {
|
|
64
|
+
logger_1.uiLogger.error(en_1.lib.LocalDevManager.staticAuthAccountsMustMatch);
|
|
65
|
+
process.exit(exitCodes_1.EXIT_CODES.ERROR);
|
|
66
|
+
}
|
|
67
|
+
return (0, urls_1.getStaticAuthAppInstallUrl)({
|
|
68
|
+
targetAccountId: this.localDevState.targetTestingAccountId,
|
|
69
|
+
env: this.localDevState.env,
|
|
70
|
+
appId: `${app.id}`,
|
|
71
|
+
});
|
|
72
|
+
}
|
|
73
|
+
async fetchAppData() {
|
|
74
|
+
const { data: { results: portalApps }, } = await (0, appsDev_1.fetchPublicAppsForPortal)(this.localDevState.targetProjectAccountId);
|
|
75
|
+
const appData = portalApps.find(({ sourceId }) => sourceId === this.appNode?.uid);
|
|
76
|
+
if (!appData) {
|
|
77
|
+
return;
|
|
78
|
+
}
|
|
79
|
+
const { data: { uniquePortalInstallCount }, } = await (0, appsDev_1.fetchPublicAppProductionInstallCounts)(appData.id, this.localDevState.targetProjectAccountId);
|
|
80
|
+
this.appData = appData;
|
|
81
|
+
this.marketplaceAppInstalls = uniquePortalInstallCount;
|
|
82
|
+
}
|
|
83
|
+
async checkMarketplaceAppInstalls() {
|
|
84
|
+
if (!this.appData || !this.marketplaceAppInstalls) {
|
|
85
|
+
return;
|
|
86
|
+
}
|
|
87
|
+
(0, ui_1.uiLine)();
|
|
88
|
+
logger_1.uiLogger.warn(en_1.lib.LocalDevManager.activeInstallWarning.installCount(this.appData.name, this.marketplaceAppInstalls));
|
|
89
|
+
logger_1.uiLogger.log(en_1.lib.LocalDevManager.activeInstallWarning.explanation);
|
|
90
|
+
(0, ui_1.uiLine)();
|
|
91
|
+
const proceed = await (0, promptUtils_1.confirmPrompt)(en_1.lib.LocalDevManager.activeInstallWarning.confirmationPrompt, { defaultAnswer: false });
|
|
92
|
+
if (!proceed) {
|
|
93
|
+
process.exit(exitCodes_1.EXIT_CODES.SUCCESS);
|
|
94
|
+
}
|
|
95
|
+
this.localDevLogger.addUploadWarning(en_1.lib.AppDevModeInterface.defaultMarketplaceAppWarning(this.marketplaceAppInstalls));
|
|
96
|
+
}
|
|
97
|
+
async checkTestAccountAppInstallation() {
|
|
98
|
+
if (!this.appNode || !this.appData) {
|
|
99
|
+
return;
|
|
100
|
+
}
|
|
101
|
+
// If the app is static auth, always prompt the user to install the app.
|
|
102
|
+
// We are currently going this because we have no method to determine if the static auth app
|
|
103
|
+
// is already installed in the portal
|
|
104
|
+
if (this.appNode.config.auth.type === constants_1.APP_AUTH_TYPES.STATIC) {
|
|
105
|
+
return (0, installAppPrompt_1.installAppPrompt)(await this.getAppInstallUrl(), false);
|
|
106
|
+
}
|
|
107
|
+
const { data: { isInstalledWithScopeGroups, previouslyAuthorizedScopeGroups }, } = await (0, localDevAuth_1.fetchAppInstallationData)(this.localDevState.targetTestingAccountId, this.localDevState.projectId, this.appNode.uid, this.appNode.config.auth.requiredScopes, this.appNode.config.auth.optionalScopes);
|
|
108
|
+
const isReinstall = previouslyAuthorizedScopeGroups.length > 0;
|
|
109
|
+
if (!isInstalledWithScopeGroups) {
|
|
110
|
+
const installUrl = await this.getAppInstallUrl();
|
|
111
|
+
await (0, installAppPrompt_1.installAppPrompt)(installUrl, isReinstall);
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
// @ts-expect-error TODO: reconcile types between CLI and UIE Dev Server
|
|
115
|
+
// In the future, update UIE Dev Server to use LocalDevState
|
|
116
|
+
async setup(args) {
|
|
117
|
+
if (!this.appNode) {
|
|
118
|
+
return;
|
|
119
|
+
}
|
|
120
|
+
try {
|
|
121
|
+
await this.fetchAppData();
|
|
122
|
+
if (this.appNode.config.distribution === constants_1.APP_DISTRIBUTION_TYPES.MARKETPLACE) {
|
|
123
|
+
await this.checkMarketplaceAppInstalls();
|
|
124
|
+
}
|
|
125
|
+
await this.checkTestAccountAppInstallation();
|
|
126
|
+
}
|
|
127
|
+
catch (e) {
|
|
128
|
+
(0, index_1.logError)(e);
|
|
129
|
+
}
|
|
130
|
+
return ui_extensions_dev_server_1.DevModeUnifiedInterface.setup(args);
|
|
131
|
+
}
|
|
132
|
+
async start() {
|
|
133
|
+
if (!this.appNode) {
|
|
134
|
+
return;
|
|
135
|
+
}
|
|
136
|
+
return ui_extensions_dev_server_1.DevModeUnifiedInterface.start({
|
|
137
|
+
accountId: this.localDevState.targetTestingAccountId,
|
|
138
|
+
// @ts-expect-error TODO: reconcile types between CLI and UIE Dev Server
|
|
139
|
+
projectConfig: this.localDevState.projectConfig,
|
|
140
|
+
requestPorts: portManager_1.requestPorts,
|
|
141
|
+
});
|
|
142
|
+
}
|
|
143
|
+
async fileChange(filePath, event) {
|
|
144
|
+
if (!this.appNode) {
|
|
145
|
+
return;
|
|
146
|
+
}
|
|
147
|
+
return ui_extensions_dev_server_1.DevModeUnifiedInterface.fileChange(filePath, event);
|
|
148
|
+
}
|
|
149
|
+
async cleanup() {
|
|
150
|
+
if (!this.appNode) {
|
|
151
|
+
return;
|
|
152
|
+
}
|
|
153
|
+
return ui_extensions_dev_server_1.DevModeUnifiedInterface.cleanup();
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
exports.default = AppDevModeInterface;
|