@hubspot/cli 7.7.16-experimental.0 → 7.7.16-experimental.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/bin/cli.js +4 -0
- package/bin/hs +1 -1
- package/commands/getStarted.d.ts +9 -0
- package/commands/getStarted.js +227 -0
- package/commands/init.js +6 -1
- package/commands/mcp/setup.d.ts +2 -2
- package/commands/mcp/setup.js +2 -0
- package/commands/mcp/start.d.ts +2 -2
- package/commands/mcp/start.js +3 -1
- package/commands/project/deploy.d.ts +1 -0
- package/commands/project/deploy.js +29 -3
- package/commands/project/upload.d.ts +2 -2
- package/commands/project/upload.js +18 -23
- package/commands/project/validate.d.ts +6 -0
- package/commands/project/validate.js +82 -0
- package/commands/project.js +2 -0
- package/commands/testAccount/create.d.ts +6 -0
- package/commands/testAccount/create.js +110 -0
- package/commands/testAccount/createConfig.d.ts +10 -0
- package/commands/testAccount/createConfig.js +98 -0
- package/commands/testAccount/delete.d.ts +6 -0
- package/commands/testAccount/delete.js +48 -0
- package/commands/testAccount.d.ts +3 -0
- package/commands/testAccount.js +28 -0
- package/lang/en.d.ts +143 -29
- package/lang/en.js +143 -32
- package/lang/en.lyaml +9 -14
- package/lib/app/migrate.js +15 -3
- package/lib/commonOpts.d.ts +2 -0
- package/lib/commonOpts.js +21 -9
- package/lib/constants.d.ts +5 -0
- package/lib/constants.js +6 -1
- package/lib/doctor/Doctor.js +1 -1
- package/lib/errorHandlers/index.js +7 -0
- package/lib/mcp/setup.d.ts +9 -0
- package/lib/mcp/setup.js +23 -21
- package/lib/projectProfiles.d.ts +1 -0
- package/lib/projectProfiles.js +18 -0
- package/lib/projects/buildAndDeploy.js +1 -1
- package/lib/projects/localDev/AppDevModeInterface.d.ts +3 -0
- package/lib/projects/localDev/AppDevModeInterface.js +45 -16
- package/lib/projects/localDev/LocalDevManager.js +1 -1
- package/lib/projects/upload.d.ts +3 -0
- package/lib/projects/upload.js +56 -22
- package/lib/projects/urls.d.ts +2 -0
- package/lib/projects/urls.js +10 -0
- package/lib/prompts/createDeveloperTestAccountConfigPrompt.d.ts +17 -0
- package/lib/prompts/createDeveloperTestAccountConfigPrompt.js +96 -0
- package/lib/prompts/installAppPrompt.d.ts +2 -1
- package/lib/prompts/installAppPrompt.js +12 -2
- package/lib/prompts/promptUtils.d.ts +1 -0
- package/lib/prompts/promptUtils.js +2 -0
- package/lib/ui/logger.d.ts +1 -0
- package/lib/ui/logger.js +1 -0
- package/lib/yargsUtils.d.ts +1 -0
- package/lib/yargsUtils.js +3 -0
- package/mcp-server/tools/index.js +2 -0
- package/mcp-server/tools/project/CreateProjectTool.d.ts +3 -3
- package/mcp-server/tools/project/CreateProjectTool.js +5 -1
- package/mcp-server/tools/project/DeployProject.js +1 -1
- package/mcp-server/tools/project/UploadProjectTools.js +1 -1
- package/mcp-server/tools/project/ValidateProjectTool.d.ts +17 -0
- package/mcp-server/tools/project/ValidateProjectTool.js +35 -0
- package/package.json +10 -9
- package/types/LocalDev.d.ts +1 -0
- package/types/Yargs.d.ts +4 -0
package/bin/cli.js
CHANGED
|
@@ -44,6 +44,8 @@ const feedback_1 = __importDefault(require("../commands/feedback"));
|
|
|
44
44
|
const doctor_1 = __importDefault(require("../commands/doctor"));
|
|
45
45
|
const completion_1 = __importDefault(require("../commands/completion"));
|
|
46
46
|
const app_1 = __importDefault(require("../commands/app"));
|
|
47
|
+
const testAccount_1 = __importDefault(require("../commands/testAccount"));
|
|
48
|
+
const getStarted_1 = __importDefault(require("../commands/getStarted"));
|
|
47
49
|
const mcp_1 = __importDefault(require("../commands/mcp"));
|
|
48
50
|
function getTerminalWidth() {
|
|
49
51
|
const width = yargs_1.default.terminalWidth();
|
|
@@ -123,6 +125,8 @@ const argv = yargs_1.default
|
|
|
123
125
|
.command(doctor_1.default)
|
|
124
126
|
.command(completion_1.default)
|
|
125
127
|
.command(app_1.default)
|
|
128
|
+
.command(testAccount_1.default)
|
|
129
|
+
.command(getStarted_1.default)
|
|
126
130
|
.command(mcp_1.default)
|
|
127
131
|
.help()
|
|
128
132
|
.alias('h', 'help')
|
package/bin/hs
CHANGED
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { AccountArgs, YargsCommandModule, CommonArgs, ConfigArgs, EnvironmentArgs } from '../types/Yargs';
|
|
2
|
+
export declare const command = "get-started";
|
|
3
|
+
export declare const describe: undefined;
|
|
4
|
+
type GetStartedArgs = CommonArgs & ConfigArgs & AccountArgs & EnvironmentArgs & {
|
|
5
|
+
name?: string;
|
|
6
|
+
dest?: string;
|
|
7
|
+
};
|
|
8
|
+
declare const getStartedCommand: YargsCommandModule<unknown, GetStartedArgs>;
|
|
9
|
+
export default getStartedCommand;
|
|
@@ -0,0 +1,227 @@
|
|
|
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.describe = exports.command = void 0;
|
|
7
|
+
const fs_extra_1 = __importDefault(require("fs-extra"));
|
|
8
|
+
const path_1 = __importDefault(require("path"));
|
|
9
|
+
const open_1 = __importDefault(require("open"));
|
|
10
|
+
const path_2 = require("@hubspot/local-dev-lib/path");
|
|
11
|
+
const github_1 = require("@hubspot/local-dev-lib/github");
|
|
12
|
+
const en_1 = require("../lang/en");
|
|
13
|
+
const usageTracking_1 = require("../lib/usageTracking");
|
|
14
|
+
const exitCodes_1 = require("../lib/enums/exitCodes");
|
|
15
|
+
const yargsUtils_1 = require("../lib/yargsUtils");
|
|
16
|
+
const promptUtils_1 = require("../lib/prompts/promptUtils");
|
|
17
|
+
const createProjectPrompt_1 = require("../lib/prompts/createProjectPrompt");
|
|
18
|
+
const ui_1 = require("../lib/ui");
|
|
19
|
+
const logger_1 = require("../lib/ui/logger");
|
|
20
|
+
const errorHandlers_1 = require("../lib/errorHandlers");
|
|
21
|
+
const upload_1 = require("../lib/projects/upload");
|
|
22
|
+
const constants_1 = require("../lib/constants");
|
|
23
|
+
const config_1 = require("../lib/projects/config");
|
|
24
|
+
const buildAndDeploy_1 = require("../lib/projects/buildAndDeploy");
|
|
25
|
+
const urls_1 = require("../lib/projects/urls");
|
|
26
|
+
const links_1 = require("../lib/links");
|
|
27
|
+
exports.command = 'get-started';
|
|
28
|
+
exports.describe = undefined;
|
|
29
|
+
async function handler(args) {
|
|
30
|
+
const { derivedAccountId } = args;
|
|
31
|
+
// TODO: Put this in constants.ts once we have a defined place for the template before INBOUND
|
|
32
|
+
const templateSource = 'robrown-hubspot/hubspot-project-components-ua-app-objects-beta';
|
|
33
|
+
(0, usageTracking_1.trackCommandUsage)('get-started', {}, derivedAccountId);
|
|
34
|
+
(0, ui_1.uiInfoSection)(en_1.commands.getStarted.startTitle, () => {
|
|
35
|
+
logger_1.uiLogger.log(en_1.commands.getStarted.startDescription);
|
|
36
|
+
});
|
|
37
|
+
const { default: selectedOption } = await (0, promptUtils_1.promptUser)([
|
|
38
|
+
{
|
|
39
|
+
type: 'list',
|
|
40
|
+
name: 'default',
|
|
41
|
+
message: en_1.commands.getStarted.prompts.selectOption,
|
|
42
|
+
choices: [
|
|
43
|
+
{
|
|
44
|
+
name: en_1.commands.getStarted.prompts.options.app,
|
|
45
|
+
value: constants_1.GET_STARTED_OPTIONS.APP,
|
|
46
|
+
},
|
|
47
|
+
{
|
|
48
|
+
name: en_1.commands.getStarted.prompts.options.cms,
|
|
49
|
+
value: constants_1.GET_STARTED_OPTIONS.CMS,
|
|
50
|
+
},
|
|
51
|
+
],
|
|
52
|
+
default: constants_1.GET_STARTED_OPTIONS.APP,
|
|
53
|
+
},
|
|
54
|
+
]);
|
|
55
|
+
if (selectedOption === constants_1.GET_STARTED_OPTIONS.CMS) {
|
|
56
|
+
logger_1.uiLogger.log(' ');
|
|
57
|
+
logger_1.uiLogger.log(en_1.commands.getStarted.designManager);
|
|
58
|
+
if (process.env.BROWSER !== 'none') {
|
|
59
|
+
logger_1.uiLogger.log(' ');
|
|
60
|
+
const { shouldOpen } = await (0, promptUtils_1.promptUser)([
|
|
61
|
+
{
|
|
62
|
+
name: 'shouldOpen',
|
|
63
|
+
type: 'confirm',
|
|
64
|
+
message: en_1.commands.getStarted.openDesignManagerPrompt,
|
|
65
|
+
},
|
|
66
|
+
]);
|
|
67
|
+
if (shouldOpen) {
|
|
68
|
+
logger_1.uiLogger.log('');
|
|
69
|
+
(0, links_1.openLink)(derivedAccountId, 'design-manager');
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
process.exit(exitCodes_1.EXIT_CODES.SUCCESS);
|
|
73
|
+
}
|
|
74
|
+
else {
|
|
75
|
+
logger_1.uiLogger.log(' ');
|
|
76
|
+
logger_1.uiLogger.log(en_1.commands.getStarted.prompts.appSelected);
|
|
77
|
+
// 1. Fetch project templates
|
|
78
|
+
let latestRepoReleaseTag;
|
|
79
|
+
const { dest, name } = await (0, createProjectPrompt_1.createProjectPrompt)(args);
|
|
80
|
+
// Specific template for get-started command
|
|
81
|
+
const projectTemplate = {
|
|
82
|
+
name: 'private-app-get-started-template',
|
|
83
|
+
label: 'CRM getting started project with private apps',
|
|
84
|
+
path: 'projects/private-app-get-started-template',
|
|
85
|
+
};
|
|
86
|
+
// 3. Create the project files
|
|
87
|
+
const projectDest = path_1.default.resolve((0, path_2.getCwd)(), dest);
|
|
88
|
+
const { projectConfig: existingProjectConfig, projectDir: existingProjectDir, } = await (0, config_1.getProjectConfig)(projectDest);
|
|
89
|
+
if (existingProjectConfig &&
|
|
90
|
+
existingProjectDir &&
|
|
91
|
+
projectDest.startsWith(existingProjectDir)) {
|
|
92
|
+
logger_1.uiLogger.log(' ');
|
|
93
|
+
logger_1.uiLogger.error(en_1.commands.project.create.errors.cannotNestProjects(existingProjectDir));
|
|
94
|
+
process.exit(exitCodes_1.EXIT_CODES.ERROR);
|
|
95
|
+
}
|
|
96
|
+
const repo = templateSource || constants_1.HUBSPOT_PROJECT_COMPONENTS_GITHUB_PATH;
|
|
97
|
+
// 4. Clone the project template from GitHub
|
|
98
|
+
// This is temporary until we have the UA template in the main repo
|
|
99
|
+
try {
|
|
100
|
+
await (0, github_1.cloneGithubRepo)(repo, projectDest, {
|
|
101
|
+
sourceDir: projectTemplate.path,
|
|
102
|
+
tag: latestRepoReleaseTag,
|
|
103
|
+
hideLogs: true,
|
|
104
|
+
});
|
|
105
|
+
}
|
|
106
|
+
catch (err) {
|
|
107
|
+
(0, errorHandlers_1.debugError)(err);
|
|
108
|
+
logger_1.uiLogger.log(' ');
|
|
109
|
+
logger_1.uiLogger.error(en_1.commands.project.create.errors.failedToDownloadProject);
|
|
110
|
+
process.exit(exitCodes_1.EXIT_CODES.ERROR);
|
|
111
|
+
}
|
|
112
|
+
const projectConfigPath = path_1.default.join(projectDest, constants_1.PROJECT_CONFIG_FILE);
|
|
113
|
+
const parsedConfigFile = JSON.parse(fs_extra_1.default.readFileSync(projectConfigPath).toString());
|
|
114
|
+
(0, config_1.writeProjectConfig)(projectConfigPath, {
|
|
115
|
+
...parsedConfigFile,
|
|
116
|
+
name,
|
|
117
|
+
});
|
|
118
|
+
logger_1.uiLogger.log(' ');
|
|
119
|
+
logger_1.uiLogger.success(en_1.commands.project.create.logs.success(name, projectDest));
|
|
120
|
+
logger_1.uiLogger.log(' ');
|
|
121
|
+
logger_1.uiLogger.log(en_1.commands.getStarted.prompts.projectCreated.title);
|
|
122
|
+
logger_1.uiLogger.log(' ');
|
|
123
|
+
logger_1.uiLogger.log(en_1.commands.getStarted.prompts.projectCreated.description);
|
|
124
|
+
logger_1.uiLogger.log(' ');
|
|
125
|
+
// 5. Ask user if they want to upload the project
|
|
126
|
+
const { shouldUpload } = await (0, promptUtils_1.promptUser)([
|
|
127
|
+
{
|
|
128
|
+
type: 'confirm',
|
|
129
|
+
name: 'shouldUpload',
|
|
130
|
+
message: en_1.commands.getStarted.prompts.uploadProject,
|
|
131
|
+
default: true,
|
|
132
|
+
},
|
|
133
|
+
]);
|
|
134
|
+
if (shouldUpload) {
|
|
135
|
+
try {
|
|
136
|
+
// Get the project config for the newly created project
|
|
137
|
+
const { projectConfig: newProjectConfig, projectDir: newProjectDir } = await (0, config_1.getProjectConfig)(projectDest);
|
|
138
|
+
if (!newProjectConfig || !newProjectDir) {
|
|
139
|
+
logger_1.uiLogger.log(' ');
|
|
140
|
+
logger_1.uiLogger.error(en_1.commands.getStarted.errors.configFileNotFound);
|
|
141
|
+
process.exit(exitCodes_1.EXIT_CODES.ERROR);
|
|
142
|
+
}
|
|
143
|
+
(0, config_1.validateProjectConfig)(newProjectConfig, newProjectDir);
|
|
144
|
+
const targetAccountId = derivedAccountId;
|
|
145
|
+
logger_1.uiLogger.log(' ');
|
|
146
|
+
logger_1.uiLogger.log(en_1.commands.getStarted.logs.uploadingProject);
|
|
147
|
+
logger_1.uiLogger.log(' ');
|
|
148
|
+
const { result, uploadError } = await (0, upload_1.handleProjectUpload)({
|
|
149
|
+
accountId: targetAccountId,
|
|
150
|
+
projectConfig: newProjectConfig,
|
|
151
|
+
projectDir: newProjectDir,
|
|
152
|
+
callbackFunc: buildAndDeploy_1.pollProjectBuildAndDeploy,
|
|
153
|
+
uploadMessage: 'Initial upload from get-started command',
|
|
154
|
+
forceCreate: true, // Auto-create project on HubSpot
|
|
155
|
+
isUploadCommand: false,
|
|
156
|
+
sendIR: (0, buildAndDeploy_1.useV3Api)(newProjectConfig.platformVersion),
|
|
157
|
+
skipValidation: false,
|
|
158
|
+
});
|
|
159
|
+
if (uploadError) {
|
|
160
|
+
logger_1.uiLogger.log(' ');
|
|
161
|
+
logger_1.uiLogger.error(en_1.commands.getStarted.errors.uploadFailed);
|
|
162
|
+
(0, errorHandlers_1.debugError)(uploadError);
|
|
163
|
+
}
|
|
164
|
+
else if (result) {
|
|
165
|
+
logger_1.uiLogger.log(' ');
|
|
166
|
+
logger_1.uiLogger.success(en_1.commands.getStarted.logs.uploadSuccess);
|
|
167
|
+
if (process.env.BROWSER !== 'none') {
|
|
168
|
+
logger_1.uiLogger.log(' ');
|
|
169
|
+
logger_1.uiLogger.log(en_1.commands.getStarted.developerOverviewBrowserOpenPrep);
|
|
170
|
+
logger_1.uiLogger.log(' ');
|
|
171
|
+
const { shouldOpenOverview } = await (0, promptUtils_1.promptUser)([
|
|
172
|
+
{
|
|
173
|
+
name: 'shouldOpenOverview',
|
|
174
|
+
type: 'confirm',
|
|
175
|
+
message: en_1.commands.getStarted.openDeveloperOverviewPrompt,
|
|
176
|
+
},
|
|
177
|
+
]);
|
|
178
|
+
if (shouldOpenOverview) {
|
|
179
|
+
(0, open_1.default)((0, urls_1.getProjectComponentDistributionUrl)(name, 'get_started_app', derivedAccountId), { url: true });
|
|
180
|
+
logger_1.uiLogger.log(' ');
|
|
181
|
+
logger_1.uiLogger.success(en_1.commands.getStarted.openedDeveloperOverview);
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
logger_1.uiLogger.log(' ');
|
|
185
|
+
(0, ui_1.uiFeatureHighlight)(['projectDevCommand']);
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
catch (err) {
|
|
189
|
+
logger_1.uiLogger.log(' ');
|
|
190
|
+
logger_1.uiLogger.error(en_1.commands.getStarted.errors.uploadFailed);
|
|
191
|
+
(0, errorHandlers_1.debugError)(err);
|
|
192
|
+
process.exit(exitCodes_1.EXIT_CODES.ERROR);
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
process.exit(exitCodes_1.EXIT_CODES.SUCCESS);
|
|
197
|
+
}
|
|
198
|
+
function getStartedBuilder(yargs) {
|
|
199
|
+
yargs.options({
|
|
200
|
+
name: {
|
|
201
|
+
describe: en_1.commands.getStarted.options.name.describe,
|
|
202
|
+
type: 'string',
|
|
203
|
+
},
|
|
204
|
+
dest: {
|
|
205
|
+
describe: en_1.commands.getStarted.options.dest.describe,
|
|
206
|
+
type: 'string',
|
|
207
|
+
},
|
|
208
|
+
'template-source': {
|
|
209
|
+
describe: en_1.commands.getStarted.options.templateSource.describe,
|
|
210
|
+
type: 'string',
|
|
211
|
+
},
|
|
212
|
+
});
|
|
213
|
+
return yargs;
|
|
214
|
+
}
|
|
215
|
+
const builder = (0, yargsUtils_1.makeYargsBuilder)(getStartedBuilder, exports.command, en_1.commands.getStarted.verboseDescribe, {
|
|
216
|
+
useGlobalOptions: true,
|
|
217
|
+
useAccountOptions: true,
|
|
218
|
+
useConfigOptions: true,
|
|
219
|
+
useEnvironmentOptions: true,
|
|
220
|
+
});
|
|
221
|
+
const getStartedCommand = {
|
|
222
|
+
command: exports.command,
|
|
223
|
+
describe: exports.describe,
|
|
224
|
+
handler,
|
|
225
|
+
builder,
|
|
226
|
+
};
|
|
227
|
+
exports.default = getStartedCommand;
|
package/commands/init.js
CHANGED
|
@@ -132,7 +132,12 @@ async function handler(args) {
|
|
|
132
132
|
authType: AUTH_TYPE_NAMES[authType],
|
|
133
133
|
account: name || accountId,
|
|
134
134
|
}));
|
|
135
|
-
(0, ui_1.uiFeatureHighlight)([
|
|
135
|
+
(0, ui_1.uiFeatureHighlight)([
|
|
136
|
+
'getStartedCommand',
|
|
137
|
+
'helpCommand',
|
|
138
|
+
'authCommand',
|
|
139
|
+
'accountsListCommand',
|
|
140
|
+
]);
|
|
136
141
|
if (!disableTracking) {
|
|
137
142
|
await (0, usageTracking_1.trackAuthAction)('init', authType, TRACKING_STATUS.COMPLETE, accountId);
|
|
138
143
|
}
|
package/commands/mcp/setup.d.ts
CHANGED
package/commands/mcp/setup.js
CHANGED
|
@@ -5,6 +5,7 @@ const yargsUtils_1 = require("../../lib/yargsUtils");
|
|
|
5
5
|
const en_1 = require("../../lang/en");
|
|
6
6
|
const logger_1 = require("../../lib/ui/logger");
|
|
7
7
|
const setup_1 = require("../../lib/mcp/setup");
|
|
8
|
+
const usageTracking_1 = require("../../lib/usageTracking");
|
|
8
9
|
const command = ['setup', 'update'];
|
|
9
10
|
const describe = undefined; // Leave hidden for now
|
|
10
11
|
async function handler(args) {
|
|
@@ -15,6 +16,7 @@ async function handler(args) {
|
|
|
15
16
|
logger_1.uiLogger.error(en_1.commands.mcp.setup.errors.needsNode20);
|
|
16
17
|
process.exit(exitCodes_1.EXIT_CODES.ERROR);
|
|
17
18
|
}
|
|
19
|
+
(0, usageTracking_1.trackCommandUsage)('mcp-setup', {}, args.derivedAccountId);
|
|
18
20
|
try {
|
|
19
21
|
const derivedTargets = await (0, setup_1.addMcpServerToConfig)(args.client);
|
|
20
22
|
if (args.addDocsSearch) {
|
package/commands/mcp/start.d.ts
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
import { YargsCommandModule } from '../../types/Yargs';
|
|
2
|
-
declare const mcpStartCommand: YargsCommandModule<unknown,
|
|
1
|
+
import { CommonArgs, YargsCommandModule } from '../../types/Yargs';
|
|
2
|
+
declare const mcpStartCommand: YargsCommandModule<unknown, CommonArgs>;
|
|
3
3
|
export default mcpStartCommand;
|
package/commands/mcp/start.js
CHANGED
|
@@ -12,9 +12,10 @@ const logger_1 = require("../../lib/ui/logger");
|
|
|
12
12
|
const errorHandlers_1 = require("../../lib/errorHandlers");
|
|
13
13
|
const en_1 = require("../../lang/en");
|
|
14
14
|
const process_1 = require("../../lib/process");
|
|
15
|
+
const usageTracking_1 = require("../../lib/usageTracking");
|
|
15
16
|
const command = 'start';
|
|
16
17
|
const describe = undefined; // Leave hidden for now
|
|
17
|
-
async function handler() {
|
|
18
|
+
async function handler(args) {
|
|
18
19
|
try {
|
|
19
20
|
await import('@modelcontextprotocol/sdk/server/mcp.js');
|
|
20
21
|
}
|
|
@@ -22,6 +23,7 @@ async function handler() {
|
|
|
22
23
|
logger_1.uiLogger.error(en_1.commands.mcp.start.errors.needsNode20);
|
|
23
24
|
process.exit(exitCodes_1.EXIT_CODES.ERROR);
|
|
24
25
|
}
|
|
26
|
+
(0, usageTracking_1.trackCommandUsage)('mcp-start', {}, args.derivedAccountId);
|
|
25
27
|
await startMcpServer();
|
|
26
28
|
}
|
|
27
29
|
async function startMcpServer() {
|
|
@@ -4,6 +4,7 @@ export type ProjectDeployArgs = CommonArgs & ConfigArgs & AccountArgs & Environm
|
|
|
4
4
|
build?: number;
|
|
5
5
|
buildId?: number;
|
|
6
6
|
profile?: string;
|
|
7
|
+
force: boolean;
|
|
7
8
|
};
|
|
8
9
|
declare const projectDeployCommand: YargsCommandModule<unknown, ProjectDeployArgs>;
|
|
9
10
|
export default projectDeployCommand;
|
|
@@ -22,6 +22,7 @@ const exitCodes_1 = require("../../lib/enums/exitCodes");
|
|
|
22
22
|
const ui_2 = require("../../lib/ui");
|
|
23
23
|
const yargsUtils_1 = require("../../lib/yargsUtils");
|
|
24
24
|
const projectProfiles_1 = require("../../lib/projectProfiles");
|
|
25
|
+
const constants_1 = require("../../lib/constants");
|
|
25
26
|
const command = 'deploy';
|
|
26
27
|
const describe = (0, ui_1.uiBetaTag)((0, lang_1.i18n)(`commands.project.subcommands.deploy.describe`), false);
|
|
27
28
|
function validateBuildId(buildId, deployedBuildId, latestBuildId, projectName, accountId) {
|
|
@@ -40,8 +41,22 @@ function validateBuildId(buildId, deployedBuildId, latestBuildId, projectName, a
|
|
|
40
41
|
}
|
|
41
42
|
return true;
|
|
42
43
|
}
|
|
44
|
+
function logDeployErrors(errorData) {
|
|
45
|
+
logger_1.logger.error(errorData.message);
|
|
46
|
+
errorData.errors.forEach(err => {
|
|
47
|
+
if (err.subCategory === constants_1.PROJECT_ERROR_TYPES.DEPLOY_CONTAINS_REMOVALS) {
|
|
48
|
+
logger_1.logger.log((0, lang_1.i18n)(`commands.project.subcommands.deploy.errors.deployContainsRemovals`, {
|
|
49
|
+
componentName: err.context.COMPONENT_NAME,
|
|
50
|
+
forceFlag: (0, ui_2.uiCommandReference)('--force'),
|
|
51
|
+
}));
|
|
52
|
+
}
|
|
53
|
+
else {
|
|
54
|
+
logger_1.logger.log(err.message);
|
|
55
|
+
}
|
|
56
|
+
});
|
|
57
|
+
}
|
|
43
58
|
async function handler(args) {
|
|
44
|
-
const { derivedAccountId, project: projectOption, buildId: buildIdOption, } = args;
|
|
59
|
+
const { derivedAccountId, project: projectOption, buildId: buildIdOption, force: forceOption, } = args;
|
|
45
60
|
const accountConfig = (0, config_1.getAccountConfig)(derivedAccountId);
|
|
46
61
|
const accountType = accountConfig && accountConfig.accountType;
|
|
47
62
|
let targetAccountId;
|
|
@@ -103,7 +118,7 @@ async function handler(args) {
|
|
|
103
118
|
logger_1.logger.error((0, lang_1.i18n)(`commands.project.subcommands.deploy.errors.noBuildId`));
|
|
104
119
|
return process.exit(exitCodes_1.EXIT_CODES.ERROR);
|
|
105
120
|
}
|
|
106
|
-
const { data: deployResp } = await (0, projects_1.deployProject)(targetAccountId, projectName, buildIdToDeploy, (0, buildAndDeploy_1.useV3Api)(projectConfig?.platformVersion));
|
|
121
|
+
const { data: deployResp } = await (0, projects_1.deployProject)(targetAccountId, projectName, buildIdToDeploy, (0, buildAndDeploy_1.useV3Api)(projectConfig?.platformVersion), forceOption);
|
|
107
122
|
if (!deployResp) {
|
|
108
123
|
logger_1.logger.error((0, lang_1.i18n)(`commands.project.subcommands.deploy.errors.deploy`));
|
|
109
124
|
return process.exit(exitCodes_1.EXIT_CODES.ERROR);
|
|
@@ -119,7 +134,12 @@ async function handler(args) {
|
|
|
119
134
|
}));
|
|
120
135
|
}
|
|
121
136
|
else if ((0, index_1.isHubSpotHttpError)(e) && e.status === 400) {
|
|
122
|
-
|
|
137
|
+
if (e.data?.message && e.data?.errors) {
|
|
138
|
+
logDeployErrors(e.data);
|
|
139
|
+
}
|
|
140
|
+
else {
|
|
141
|
+
logger_1.logger.error(e.message);
|
|
142
|
+
}
|
|
123
143
|
}
|
|
124
144
|
else {
|
|
125
145
|
(0, index_2.logError)(e, new index_2.ApiErrorContext({
|
|
@@ -147,6 +167,12 @@ function projectDeployBuilder(yargs) {
|
|
|
147
167
|
type: 'string',
|
|
148
168
|
hidden: true,
|
|
149
169
|
},
|
|
170
|
+
force: {
|
|
171
|
+
alias: ['f'],
|
|
172
|
+
describe: (0, lang_1.i18n)(`commands.project.subcommands.deploy.options.force.describe`),
|
|
173
|
+
default: false,
|
|
174
|
+
type: 'boolean',
|
|
175
|
+
},
|
|
150
176
|
});
|
|
151
177
|
yargs.conflicts('profile', 'project');
|
|
152
178
|
yargs.conflicts('profile', 'account');
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { CommonArgs, YargsCommandModule } from '../../types/Yargs';
|
|
2
|
-
type ProjectUploadArgs = CommonArgs & {
|
|
1
|
+
import { CommonArgs, JSONOutputArgs, YargsCommandModule } from '../../types/Yargs';
|
|
2
|
+
type ProjectUploadArgs = CommonArgs & JSONOutputArgs & {
|
|
3
3
|
forceCreate: boolean;
|
|
4
4
|
message: string;
|
|
5
5
|
m: string;
|
|
@@ -13,40 +13,26 @@ const usageTracking_1 = require("../../lib/usageTracking");
|
|
|
13
13
|
const config_2 = require("../../lib/projects/config");
|
|
14
14
|
const ui_2 = require("../../lib/projects/ui");
|
|
15
15
|
const upload_1 = require("../../lib/projects/upload");
|
|
16
|
+
const projectProfiles_1 = require("../../lib/projectProfiles");
|
|
16
17
|
const buildAndDeploy_2 = require("../../lib/projects/buildAndDeploy");
|
|
17
18
|
const lang_1 = require("../../lib/lang");
|
|
18
19
|
const constants_1 = require("../../lib/constants");
|
|
19
20
|
const index_2 = require("../../lib/errorHandlers/index");
|
|
20
21
|
const exitCodes_1 = require("../../lib/enums/exitCodes");
|
|
21
22
|
const yargsUtils_1 = require("../../lib/yargsUtils");
|
|
22
|
-
const
|
|
23
|
+
const logger_2 = require("../../lib/ui/logger");
|
|
23
24
|
const command = 'upload';
|
|
24
25
|
const describe = (0, ui_1.uiBetaTag)((0, lang_1.i18n)(`commands.project.subcommands.upload.describe`), false);
|
|
25
26
|
async function handler(args) {
|
|
26
|
-
const { forceCreate, message, derivedAccountId,
|
|
27
|
+
const { forceCreate, message, derivedAccountId, skipValidation, formatOutputAsJson, profile, } = args;
|
|
28
|
+
const jsonOutput = {};
|
|
27
29
|
const { projectConfig, projectDir } = await (0, config_2.getProjectConfig)();
|
|
28
30
|
(0, config_2.validateProjectConfig)(projectConfig, projectDir);
|
|
29
|
-
let targetAccountId
|
|
30
|
-
if (
|
|
31
|
-
|
|
32
|
-
(0, projectProfiles_1.logProfileHeader)(args.profile);
|
|
33
|
-
const profile = (0, projectProfiles_1.loadProfile)(projectConfig, projectDir, args.profile);
|
|
34
|
-
if (!profile) {
|
|
35
|
-
(0, ui_1.uiLine)();
|
|
36
|
-
process.exit(exitCodes_1.EXIT_CODES.ERROR);
|
|
37
|
-
}
|
|
38
|
-
targetAccountId = profile.accountId;
|
|
39
|
-
(0, projectProfiles_1.logProfileFooter)(profile, true);
|
|
40
|
-
}
|
|
41
|
-
else {
|
|
42
|
-
// A profile must be specified if this project has profiles configured
|
|
43
|
-
await (0, projectProfiles_1.exitIfUsingProfiles)(projectConfig, projectDir);
|
|
44
|
-
}
|
|
45
|
-
}
|
|
46
|
-
if (!targetAccountId) {
|
|
47
|
-
// The user is not using profiles, so we can use the derived accountId
|
|
48
|
-
targetAccountId = derivedAccountId;
|
|
31
|
+
let targetAccountId;
|
|
32
|
+
if ((0, buildAndDeploy_1.useV3Api)(projectConfig.platformVersion)) {
|
|
33
|
+
targetAccountId = await (0, projectProfiles_1.loadAndValidateProfile)(projectConfig, projectDir, profile);
|
|
49
34
|
}
|
|
35
|
+
targetAccountId = targetAccountId || derivedAccountId;
|
|
50
36
|
const accountConfig = (0, config_1.getAccountConfig)(targetAccountId);
|
|
51
37
|
const accountType = accountConfig && accountConfig.accountType;
|
|
52
38
|
(0, usageTracking_1.trackCommandUsage)('project-upload', { type: accountType }, targetAccountId);
|
|
@@ -88,7 +74,12 @@ async function handler(args) {
|
|
|
88
74
|
}));
|
|
89
75
|
(0, ui_2.logFeedbackMessage)(result.buildId);
|
|
90
76
|
await (0, buildAndDeploy_2.displayWarnLogs)(targetAccountId, projectConfig.name, result.buildId);
|
|
91
|
-
|
|
77
|
+
}
|
|
78
|
+
if (result && result.succeeded && formatOutputAsJson) {
|
|
79
|
+
jsonOutput.buildId = result.buildId;
|
|
80
|
+
if (result.deployResult) {
|
|
81
|
+
jsonOutput.deployId = result.deployResult.deployId;
|
|
82
|
+
}
|
|
92
83
|
}
|
|
93
84
|
}
|
|
94
85
|
catch (e) {
|
|
@@ -98,6 +89,9 @@ async function handler(args) {
|
|
|
98
89
|
}));
|
|
99
90
|
process.exit(exitCodes_1.EXIT_CODES.ERROR);
|
|
100
91
|
}
|
|
92
|
+
if (formatOutputAsJson) {
|
|
93
|
+
logger_2.uiLogger.json(jsonOutput);
|
|
94
|
+
}
|
|
101
95
|
process.exit(exitCodes_1.EXIT_CODES.SUCCESS);
|
|
102
96
|
}
|
|
103
97
|
function projectUploadBuilder(yargs) {
|
|
@@ -139,6 +133,7 @@ const builder = (0, yargsUtils_1.makeYargsBuilder)(projectUploadBuilder, command
|
|
|
139
133
|
useConfigOptions: true,
|
|
140
134
|
useAccountOptions: true,
|
|
141
135
|
useEnvironmentOptions: true,
|
|
136
|
+
useJSONOutputOptions: true,
|
|
142
137
|
});
|
|
143
138
|
const projectUploadCommand = {
|
|
144
139
|
command,
|
|
@@ -0,0 +1,82 @@
|
|
|
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
|
+
const path_1 = __importDefault(require("path"));
|
|
7
|
+
const config_1 = require("@hubspot/local-dev-lib/config");
|
|
8
|
+
const buildAndDeploy_1 = require("../../lib/projects/buildAndDeploy");
|
|
9
|
+
const usageTracking_1 = require("../../lib/usageTracking");
|
|
10
|
+
const logger_1 = require("../../lib/ui/logger");
|
|
11
|
+
const config_2 = require("../../lib/projects/config");
|
|
12
|
+
const exitCodes_1 = require("../../lib/enums/exitCodes");
|
|
13
|
+
const yargsUtils_1 = require("../../lib/yargsUtils");
|
|
14
|
+
const upload_1 = require("../../lib/projects/upload");
|
|
15
|
+
const en_1 = require("../../lang/en");
|
|
16
|
+
const projectProfiles_1 = require("../../lib/projectProfiles");
|
|
17
|
+
const errorHandlers_1 = require("../../lib/errorHandlers");
|
|
18
|
+
const command = 'validate';
|
|
19
|
+
const describe = undefined;
|
|
20
|
+
async function handler(args) {
|
|
21
|
+
const { derivedAccountId, profile } = args;
|
|
22
|
+
const { projectConfig, projectDir } = await (0, config_2.getProjectConfig)();
|
|
23
|
+
if (!projectConfig) {
|
|
24
|
+
logger_1.uiLogger.error(en_1.commands.project.validate.mustBeRanWithinAProject);
|
|
25
|
+
process.exit(exitCodes_1.EXIT_CODES.ERROR);
|
|
26
|
+
}
|
|
27
|
+
if (!(0, buildAndDeploy_1.useV3Api)(projectConfig?.platformVersion)) {
|
|
28
|
+
logger_1.uiLogger.error(en_1.commands.project.validate.badVersion);
|
|
29
|
+
process.exit(exitCodes_1.EXIT_CODES.ERROR);
|
|
30
|
+
}
|
|
31
|
+
(0, config_2.validateProjectConfig)(projectConfig, projectDir);
|
|
32
|
+
let targetAccountId = await (0, projectProfiles_1.loadAndValidateProfile)(projectConfig, projectDir, profile);
|
|
33
|
+
targetAccountId = targetAccountId || derivedAccountId;
|
|
34
|
+
const accountConfig = (0, config_1.getAccountConfig)(targetAccountId);
|
|
35
|
+
const accountType = accountConfig && accountConfig.accountType;
|
|
36
|
+
(0, usageTracking_1.trackCommandUsage)('project-validate', { type: accountType }, targetAccountId);
|
|
37
|
+
const srcDir = path_1.default.resolve(projectDir, projectConfig.srcDir);
|
|
38
|
+
try {
|
|
39
|
+
(0, upload_1.validateSourceDirectory)(srcDir, projectConfig);
|
|
40
|
+
}
|
|
41
|
+
catch (e) {
|
|
42
|
+
(0, errorHandlers_1.logError)(e);
|
|
43
|
+
process.exit(exitCodes_1.EXIT_CODES.ERROR);
|
|
44
|
+
}
|
|
45
|
+
try {
|
|
46
|
+
await (0, upload_1.handleTranslate)(projectDir, projectConfig, targetAccountId, false, profile);
|
|
47
|
+
}
|
|
48
|
+
catch (e) {
|
|
49
|
+
(0, errorHandlers_1.logError)(e);
|
|
50
|
+
process.exit(exitCodes_1.EXIT_CODES.ERROR);
|
|
51
|
+
}
|
|
52
|
+
logger_1.uiLogger.success(en_1.commands.project.validate.success(projectConfig.name));
|
|
53
|
+
process.exit(exitCodes_1.EXIT_CODES.SUCCESS);
|
|
54
|
+
}
|
|
55
|
+
function projectValidateBuilder(yargs) {
|
|
56
|
+
yargs.options({
|
|
57
|
+
profile: {
|
|
58
|
+
type: 'string',
|
|
59
|
+
alias: 'p',
|
|
60
|
+
describe: en_1.commands.project.validate.options.profile.describe,
|
|
61
|
+
hidden: true,
|
|
62
|
+
},
|
|
63
|
+
});
|
|
64
|
+
yargs.conflicts('profile', 'account');
|
|
65
|
+
yargs.example([
|
|
66
|
+
['$0 project validate', en_1.commands.project.validate.examples.default],
|
|
67
|
+
]);
|
|
68
|
+
return yargs;
|
|
69
|
+
}
|
|
70
|
+
const builder = (0, yargsUtils_1.makeYargsBuilder)(projectValidateBuilder, command, describe, {
|
|
71
|
+
useGlobalOptions: true,
|
|
72
|
+
useConfigOptions: true,
|
|
73
|
+
useAccountOptions: true,
|
|
74
|
+
useEnvironmentOptions: true,
|
|
75
|
+
});
|
|
76
|
+
const projectValidateCommand = {
|
|
77
|
+
command,
|
|
78
|
+
describe,
|
|
79
|
+
handler,
|
|
80
|
+
builder,
|
|
81
|
+
};
|
|
82
|
+
exports.default = projectValidateCommand;
|
package/commands/project.js
CHANGED
|
@@ -20,6 +20,7 @@ const migrateApp_1 = __importDefault(require("./project/migrateApp"));
|
|
|
20
20
|
const cloneApp_1 = __importDefault(require("./project/cloneApp"));
|
|
21
21
|
const installDeps_1 = __importDefault(require("./project/installDeps"));
|
|
22
22
|
const profile_1 = __importDefault(require("./project/profile"));
|
|
23
|
+
const validate_1 = __importDefault(require("./project/validate"));
|
|
23
24
|
const yargsUtils_1 = require("../lib/yargsUtils");
|
|
24
25
|
const command = ['project', 'projects'];
|
|
25
26
|
const describe = (0, ui_1.uiBetaTag)((0, lang_1.i18n)(`commands.project.describe`), false);
|
|
@@ -40,6 +41,7 @@ function projectBuilder(yargs) {
|
|
|
40
41
|
.command(cloneApp_1.default)
|
|
41
42
|
.command(installDeps_1.default)
|
|
42
43
|
.command(profile_1.default)
|
|
44
|
+
.command(validate_1.default)
|
|
43
45
|
.demandCommand(1, '');
|
|
44
46
|
return yargs;
|
|
45
47
|
}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { CommonArgs, ConfigArgs, AccountArgs, TestingArgs, YargsCommandModule, EnvironmentArgs, JSONOutputArgs } from '../../types/Yargs';
|
|
2
|
+
type CreateTestAccountArgs = CommonArgs & AccountArgs & ConfigArgs & TestingArgs & EnvironmentArgs & JSONOutputArgs & {
|
|
3
|
+
configPath?: string;
|
|
4
|
+
};
|
|
5
|
+
declare const createTestAccountCommand: YargsCommandModule<unknown, CreateTestAccountArgs>;
|
|
6
|
+
export default createTestAccountCommand;
|