@hubspot/cli 7.5.3-experimental.0 → 7.5.4-experimental.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 +1 -2
- package/api/migrate.js +0 -7
- package/bin/cli.js +2 -0
- package/commands/account/auth.d.ts +10 -0
- package/commands/account/auth.js +168 -0
- package/commands/account/clean.js +38 -5
- package/commands/account/createOverride.d.ts +10 -0
- package/commands/account/createOverride.js +104 -0
- package/commands/account/info.js +23 -0
- package/commands/account/list.js +23 -7
- package/commands/account/remove.js +28 -0
- package/commands/account/removeOverride.d.ts +10 -0
- package/commands/account/removeOverride.js +76 -0
- package/commands/account/use.js +13 -0
- package/commands/account.js +7 -2
- package/commands/auth.js +6 -2
- package/commands/config/migrate.d.ts +10 -0
- package/commands/config/migrate.js +84 -0
- package/commands/config/set.d.ts +10 -0
- package/commands/config/set.js +29 -29
- package/commands/config.d.ts +4 -1
- package/commands/config.js +45 -11
- package/commands/init.js +9 -10
- package/commands/project.js +0 -2
- package/lang/en.js +5 -0
- package/lang/en.lyaml +89 -16
- package/lib/app/migrate.d.ts +2 -2
- package/lib/app/migrate.js +35 -77
- package/lib/app/migrate_legacy.js +3 -5
- package/lib/configMigrate.d.ts +2 -0
- package/lib/configMigrate.js +104 -0
- package/lib/doctor/Diagnosis.d.ts +1 -2
- package/lib/doctor/Diagnosis.js +10 -6
- package/lib/doctor/DiagnosticInfoBuilder.d.ts +1 -0
- package/lib/doctor/DiagnosticInfoBuilder.js +1 -0
- package/lib/doctor/Doctor.d.ts +1 -0
- package/lib/doctor/Doctor.js +18 -0
- package/lib/middleware/configMiddleware.js +5 -1
- package/lib/middleware/fireAlarmMiddleware.d.ts +4 -0
- package/lib/middleware/fireAlarmMiddleware.js +137 -0
- package/lib/projects/index.d.ts +2 -3
- package/lib/ui/index.d.ts +1 -0
- package/lib/ui/index.js +5 -0
- package/package.json +5 -4
- package/types/Yargs.d.ts +3 -6
- package/commands/project/migrate.d.ts +0 -8
- package/commands/project/migrate.js +0 -48
package/lib/doctor/Doctor.d.ts
CHANGED
|
@@ -10,6 +10,7 @@ export declare class Doctor {
|
|
|
10
10
|
private performCliChecks;
|
|
11
11
|
private performProjectChecks;
|
|
12
12
|
private performCliConfigChecks;
|
|
13
|
+
private performDefaultAccountOverrideFileChecks;
|
|
13
14
|
private performCliConfigSettingsChecks;
|
|
14
15
|
private checkIfAccessTokenValid;
|
|
15
16
|
private checkIfNodeIsInstalled;
|
package/lib/doctor/Doctor.js
CHANGED
|
@@ -51,6 +51,7 @@ class Doctor {
|
|
|
51
51
|
...this.performCliConfigChecks(),
|
|
52
52
|
...(this.projectConfig?.projectConfig ? this.performProjectChecks() : []),
|
|
53
53
|
]);
|
|
54
|
+
this.performDefaultAccountOverrideFileChecks();
|
|
54
55
|
this.performCliConfigSettingsChecks();
|
|
55
56
|
SpinniesManager_1.default.succeed('runningDiagnostics', {
|
|
56
57
|
text: i18n(`${i18nKey}.diagnosticsComplete`),
|
|
@@ -88,6 +89,23 @@ class Doctor {
|
|
|
88
89
|
}
|
|
89
90
|
return [this.checkIfAccessTokenValid()];
|
|
90
91
|
}
|
|
92
|
+
performDefaultAccountOverrideFileChecks() {
|
|
93
|
+
const localI18nKey = `${i18nKey}.defaultAccountOverrideFileChecks`;
|
|
94
|
+
if (this.diagnosticInfo?.defaultAccountOverrideFile) {
|
|
95
|
+
this.diagnosis?.addDefaultAccountOverrideFileSection({
|
|
96
|
+
type: 'warning',
|
|
97
|
+
message: i18n(`${localI18nKey}.overrideActive`, {
|
|
98
|
+
defaultAccountOverrideFile: this.diagnosticInfo.defaultAccountOverrideFile,
|
|
99
|
+
}),
|
|
100
|
+
});
|
|
101
|
+
this.diagnosis?.addDefaultAccountOverrideFileSection({
|
|
102
|
+
type: 'warning',
|
|
103
|
+
message: i18n(`${localI18nKey}.overrideAccountId`, {
|
|
104
|
+
overrideAccountId: (0, config_1.getCWDAccountOverride)(),
|
|
105
|
+
}),
|
|
106
|
+
});
|
|
107
|
+
}
|
|
108
|
+
}
|
|
91
109
|
performCliConfigSettingsChecks() {
|
|
92
110
|
if (this.diagnosticInfo?.configSettings.httpUseLocalhost) {
|
|
93
111
|
this.diagnosis?.addCLIConfigSection({
|
|
@@ -52,7 +52,11 @@ async function loadConfigMiddleware(argv) {
|
|
|
52
52
|
process.exit(exitCodes_1.EXIT_CODES.ERROR);
|
|
53
53
|
}
|
|
54
54
|
};
|
|
55
|
-
if ((0, config_1.configFileExists)(true) &&
|
|
55
|
+
if ((0, config_1.configFileExists)(true) &&
|
|
56
|
+
argv.config &&
|
|
57
|
+
!(0, utils_1.isTargetedCommand)(argv._, {
|
|
58
|
+
config: { target: false, subCommands: { migrate: { target: true } } },
|
|
59
|
+
})) {
|
|
56
60
|
logger_1.logger.error((0, lang_1.i18n)(`commands.generalErrors.loadConfigMiddleware.configFileExists`, {
|
|
57
61
|
configPath: (0, config_1.getConfigPath)(),
|
|
58
62
|
}));
|
|
@@ -0,0 +1,137 @@
|
|
|
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.checkFireAlarms = checkFireAlarms;
|
|
7
|
+
const chalk_1 = __importDefault(require("chalk"));
|
|
8
|
+
const fireAlarm_1 = require("@hubspot/local-dev-lib/api/fireAlarm");
|
|
9
|
+
const logger_1 = require("@hubspot/local-dev-lib/logger");
|
|
10
|
+
const errorHandlers_1 = require("../errorHandlers");
|
|
11
|
+
const package_json_1 = __importDefault(require("../../package.json"));
|
|
12
|
+
const ui_1 = require("../ui");
|
|
13
|
+
const lang_1 = require("../lang");
|
|
14
|
+
/*
|
|
15
|
+
* Versions can be formatted like this:
|
|
16
|
+
* =7.2.2 -> targets the exact version 7.2.2
|
|
17
|
+
* =7.2.* -> targets all versions with a major of 7 and a minor of 2
|
|
18
|
+
* =7.* -> targets all versions with a major of 7
|
|
19
|
+
* =* -> targets all versions
|
|
20
|
+
* <=7.2.2 -> targets all versions equal to or less than 7.2.2
|
|
21
|
+
* <=7.2.* -> targets all versions equal to or less than 7.2
|
|
22
|
+
*/
|
|
23
|
+
const WILDCARD = '*';
|
|
24
|
+
function isVersionTargeted(version, targetVersionString) {
|
|
25
|
+
// Assume we're targeting no versions if no version string is found
|
|
26
|
+
// Target all versions using the * wildcard
|
|
27
|
+
if (!targetVersionString) {
|
|
28
|
+
return false;
|
|
29
|
+
}
|
|
30
|
+
// Only support version targeting for the <= or = operator
|
|
31
|
+
if (!targetVersionString.startsWith('<=') &&
|
|
32
|
+
!targetVersionString.startsWith('=')) {
|
|
33
|
+
return false;
|
|
34
|
+
}
|
|
35
|
+
const targetVersion = targetVersionString.substring(targetVersionString.indexOf('=') + 1);
|
|
36
|
+
// Only allow exact version matching for tagged CLI releases (like -beta)
|
|
37
|
+
if (version.includes('-') || targetVersionString.includes('-')) {
|
|
38
|
+
if (!targetVersionString.startsWith('=')) {
|
|
39
|
+
return false;
|
|
40
|
+
}
|
|
41
|
+
return version === targetVersion;
|
|
42
|
+
}
|
|
43
|
+
const targetVersionParts = targetVersion.split('.');
|
|
44
|
+
const versionParts = version.split('.');
|
|
45
|
+
// Require the wildcard to be explicitly set to target all versions
|
|
46
|
+
if (versionParts.length < 3 &&
|
|
47
|
+
versionParts[versionParts.length - 1] !== WILDCARD) {
|
|
48
|
+
return false;
|
|
49
|
+
}
|
|
50
|
+
// Don't allow the less than or equal to operator to be used with the wildcard
|
|
51
|
+
// in the major version part (e.g. <=*)
|
|
52
|
+
if (targetVersionString.startsWith('<=') && versionParts[0] === WILDCARD) {
|
|
53
|
+
return false;
|
|
54
|
+
}
|
|
55
|
+
let targetAnyVersion = false;
|
|
56
|
+
return targetVersionParts.every((targetPart, i) => {
|
|
57
|
+
const versionPart = versionParts[i];
|
|
58
|
+
// Support generic version targeting (like 1.2.*)
|
|
59
|
+
if (targetPart === WILDCARD || targetAnyVersion) {
|
|
60
|
+
targetAnyVersion = true;
|
|
61
|
+
return true;
|
|
62
|
+
}
|
|
63
|
+
// Double check that the target part is a number
|
|
64
|
+
if (isNaN(Number(targetPart))) {
|
|
65
|
+
return false;
|
|
66
|
+
}
|
|
67
|
+
return targetVersionString.startsWith('<=')
|
|
68
|
+
? Number(versionPart) <= Number(targetPart)
|
|
69
|
+
: Number(versionPart) === Number(targetPart);
|
|
70
|
+
});
|
|
71
|
+
}
|
|
72
|
+
function isCommandTargeted(command, targetCommandsString) {
|
|
73
|
+
// Require the wildcard to be explicitly set to target all commands
|
|
74
|
+
if (!targetCommandsString) {
|
|
75
|
+
return false;
|
|
76
|
+
}
|
|
77
|
+
if (targetCommandsString === WILDCARD) {
|
|
78
|
+
return true;
|
|
79
|
+
}
|
|
80
|
+
const targetCommands = targetCommandsString.split(',');
|
|
81
|
+
return targetCommands.some(cmd => command.startsWith(cmd));
|
|
82
|
+
}
|
|
83
|
+
function filterFireAlarm(fireAlarm, command, version) {
|
|
84
|
+
const commandIsTargeted = isCommandTargeted(command, fireAlarm.querySelector);
|
|
85
|
+
const versionIsTargeted = isVersionTargeted(version, fireAlarm.urlRegexPattern);
|
|
86
|
+
return commandIsTargeted && versionIsTargeted;
|
|
87
|
+
}
|
|
88
|
+
async function getFireAlarms(accountId, command, version) {
|
|
89
|
+
let relevantAlarms = [];
|
|
90
|
+
try {
|
|
91
|
+
const { data: fireAlarms } = await (0, fireAlarm_1.fetchFireAlarms)(accountId);
|
|
92
|
+
relevantAlarms = fireAlarms.filter(fireAlarm => filterFireAlarm(fireAlarm, command, version));
|
|
93
|
+
}
|
|
94
|
+
catch (error) {
|
|
95
|
+
(0, errorHandlers_1.debugError)(error);
|
|
96
|
+
}
|
|
97
|
+
return relevantAlarms;
|
|
98
|
+
}
|
|
99
|
+
async function logFireAlarms(accountId, command, version) {
|
|
100
|
+
const alarms = await getFireAlarms(accountId, command, version);
|
|
101
|
+
if (alarms.length > 0) {
|
|
102
|
+
const notifications = alarms.reduce((acc, alarm) => {
|
|
103
|
+
if (alarm.title && alarm.message) {
|
|
104
|
+
return (acc +
|
|
105
|
+
`${acc.length > 0 ? '\n\n' : ''}${chalk_1.default.bold(alarm.title)}\n${alarm.message}`);
|
|
106
|
+
}
|
|
107
|
+
return acc;
|
|
108
|
+
}, '');
|
|
109
|
+
let boxen;
|
|
110
|
+
try {
|
|
111
|
+
// The boxen package is exported as a module, so we have to use a dynamic import
|
|
112
|
+
boxen = (await import('boxen')).default;
|
|
113
|
+
}
|
|
114
|
+
catch (error) {
|
|
115
|
+
logger_1.logger.debug(`${(0, lang_1.i18n)('lib.middleware.fireAlarm.failedToLoadBoxen')}`);
|
|
116
|
+
return;
|
|
117
|
+
}
|
|
118
|
+
logger_1.logger.log(boxen(notifications, {
|
|
119
|
+
title: 'Notifications',
|
|
120
|
+
titleAlignment: 'left',
|
|
121
|
+
borderColor: ui_1.UI_COLORS.MARIGOLD,
|
|
122
|
+
margin: 1,
|
|
123
|
+
padding: 1,
|
|
124
|
+
textAlignment: 'left',
|
|
125
|
+
borderStyle: 'round',
|
|
126
|
+
}));
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
async function checkFireAlarms(args) {
|
|
130
|
+
const { derivedAccountId } = args;
|
|
131
|
+
try {
|
|
132
|
+
await logFireAlarms(derivedAccountId, args._.join(' '), package_json_1.default.version);
|
|
133
|
+
}
|
|
134
|
+
catch (error) {
|
|
135
|
+
(0, errorHandlers_1.debugError)(error);
|
|
136
|
+
}
|
|
137
|
+
}
|
package/lib/projects/index.d.ts
CHANGED
|
@@ -2,11 +2,10 @@ import { Project } from '@hubspot/local-dev-lib/types/Project';
|
|
|
2
2
|
import { ProjectConfig } from '../../types/Projects';
|
|
3
3
|
export declare function writeProjectConfig(configPath: string, config: ProjectConfig): boolean;
|
|
4
4
|
export declare function getIsInProject(dir?: string): boolean;
|
|
5
|
-
export
|
|
5
|
+
export declare function getProjectConfig(dir?: string): Promise<{
|
|
6
6
|
projectDir: string | null;
|
|
7
7
|
projectConfig: ProjectConfig | null;
|
|
8
|
-
}
|
|
9
|
-
export declare function getProjectConfig(dir?: string): Promise<LoadedProjectConfig>;
|
|
8
|
+
}>;
|
|
10
9
|
export declare function validateProjectConfig(projectConfig: ProjectConfig | null, projectDir: string | null): void;
|
|
11
10
|
export declare function ensureProjectExists(accountId: number, projectName: string, { forceCreate, allowCreate, noLogs, withPolling, uploadCommand, }?: {
|
|
12
11
|
forceCreate?: boolean | undefined;
|
package/lib/ui/index.d.ts
CHANGED
|
@@ -15,3 +15,4 @@ export declare function uiDeprecatedTag(message: string, log?: boolean): string
|
|
|
15
15
|
export declare function uiCommandDisabledBanner(command: string, url?: string, message?: string): void;
|
|
16
16
|
export declare function uiDeprecatedDescription(message: string, command: string, url?: string): string | undefined;
|
|
17
17
|
export declare function uiDeprecatedMessage(command: string, url?: string, message?: string): void;
|
|
18
|
+
export declare function indent(level: number): string;
|
package/lib/ui/index.js
CHANGED
|
@@ -15,6 +15,7 @@ exports.uiDeprecatedTag = uiDeprecatedTag;
|
|
|
15
15
|
exports.uiCommandDisabledBanner = uiCommandDisabledBanner;
|
|
16
16
|
exports.uiDeprecatedDescription = uiDeprecatedDescription;
|
|
17
17
|
exports.uiDeprecatedMessage = uiDeprecatedMessage;
|
|
18
|
+
exports.indent = indent;
|
|
18
19
|
const chalk_1 = __importDefault(require("chalk"));
|
|
19
20
|
const config_1 = require("@hubspot/local-dev-lib/config");
|
|
20
21
|
const logger_1 = require("@hubspot/local-dev-lib/logger");
|
|
@@ -148,3 +149,7 @@ function uiDeprecatedMessage(command, url, message) {
|
|
|
148
149
|
uiDeprecatedTag(tag);
|
|
149
150
|
logger_1.logger.log();
|
|
150
151
|
}
|
|
152
|
+
function indent(level) {
|
|
153
|
+
const indentation = ' ';
|
|
154
|
+
return indentation.repeat(level);
|
|
155
|
+
}
|
package/package.json
CHANGED
|
@@ -1,16 +1,17 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@hubspot/cli",
|
|
3
|
-
"version": "7.5.
|
|
3
|
+
"version": "7.5.4-experimental.0",
|
|
4
4
|
"description": "The official CLI for developing on HubSpot",
|
|
5
5
|
"license": "Apache-2.0",
|
|
6
6
|
"repository": "https://github.com/HubSpot/hubspot-cli",
|
|
7
7
|
"dependencies": {
|
|
8
|
-
"@hubspot/local-dev-lib": "3.5.
|
|
9
|
-
"@hubspot/project-parsing-lib": "0.1.
|
|
8
|
+
"@hubspot/local-dev-lib": "3.5.2",
|
|
9
|
+
"@hubspot/project-parsing-lib": "0.1.7",
|
|
10
10
|
"@hubspot/serverless-dev-runtime": "7.0.2",
|
|
11
11
|
"@hubspot/theme-preview-dev-server": "0.0.10",
|
|
12
12
|
"@hubspot/ui-extensions-dev-server": "0.8.52",
|
|
13
13
|
"archiver": "7.0.1",
|
|
14
|
+
"boxen": "8.0.1",
|
|
14
15
|
"chalk": "4.1.2",
|
|
15
16
|
"chokidar": "3.6.0",
|
|
16
17
|
"cli-cursor": "3.1.0",
|
|
@@ -41,7 +42,7 @@
|
|
|
41
42
|
"@types/semver": "^7.5.8",
|
|
42
43
|
"@types/tmp": "^0.2.6",
|
|
43
44
|
"@types/yargs": "^17.0.33",
|
|
44
|
-
"@typescript-eslint/eslint-plugin": "
|
|
45
|
+
"@typescript-eslint/eslint-plugin": "8.29.0",
|
|
45
46
|
"@typescript-eslint/parser": "^8.11.0",
|
|
46
47
|
"axios": "^1.7.2",
|
|
47
48
|
"eslint": "^8.56.0",
|
package/types/Yargs.d.ts
CHANGED
|
@@ -28,14 +28,11 @@ export type TestingArgs = {
|
|
|
28
28
|
qa?: boolean;
|
|
29
29
|
};
|
|
30
30
|
export type MigrateAppOptions = CommonArgs & AccountArgs & EnvironmentArgs & ConfigArgs & {
|
|
31
|
-
name
|
|
32
|
-
dest
|
|
33
|
-
appId
|
|
31
|
+
name: string;
|
|
32
|
+
dest: string;
|
|
33
|
+
appId: number;
|
|
34
34
|
platformVersion: string;
|
|
35
35
|
};
|
|
36
|
-
export type ProjectMigrateOptions = CommonArgs & AccountArgs & EnvironmentArgs & ConfigArgs & {
|
|
37
|
-
dest?: string;
|
|
38
|
-
};
|
|
39
36
|
export type CloneAppArgs = ConfigArgs & EnvironmentArgs & AccountArgs & CommonArgs & {
|
|
40
37
|
dest: string;
|
|
41
38
|
appId: number;
|
|
@@ -1,8 +0,0 @@
|
|
|
1
|
-
import { ArgumentsCamelCase, Argv, CommandModule } from 'yargs';
|
|
2
|
-
import { ProjectMigrateOptions } from '../../types/Yargs';
|
|
3
|
-
export declare const command = "migrate";
|
|
4
|
-
export declare const describe: undefined;
|
|
5
|
-
export declare function handler(options: ArgumentsCamelCase<ProjectMigrateOptions>): Promise<undefined>;
|
|
6
|
-
export declare function builder(yargs: Argv): Argv<ProjectMigrateOptions>;
|
|
7
|
-
declare const migrateAppCommand: CommandModule<unknown, ProjectMigrateOptions>;
|
|
8
|
-
export default migrateAppCommand;
|
|
@@ -1,48 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.describe = exports.command = void 0;
|
|
4
|
-
exports.handler = handler;
|
|
5
|
-
exports.builder = builder;
|
|
6
|
-
const lang_1 = require("../../lib/lang");
|
|
7
|
-
const logger_1 = require("@hubspot/local-dev-lib/logger");
|
|
8
|
-
const commonOpts_1 = require("../../lib/commonOpts");
|
|
9
|
-
const migrate_1 = require("../../lib/app/migrate");
|
|
10
|
-
const projects_1 = require("../../lib/projects");
|
|
11
|
-
const projects_2 = require("@hubspot/local-dev-lib/constants/projects");
|
|
12
|
-
const errorHandlers_1 = require("../../lib/errorHandlers");
|
|
13
|
-
const exitCodes_1 = require("../../lib/enums/exitCodes");
|
|
14
|
-
exports.command = 'migrate';
|
|
15
|
-
exports.describe = undefined; // i18n('commands.project.subcommands.migrate.noProjectConfig')
|
|
16
|
-
async function handler(options) {
|
|
17
|
-
const projectConfig = await (0, projects_1.getProjectConfig)();
|
|
18
|
-
if (!projectConfig) {
|
|
19
|
-
logger_1.logger.error((0, lang_1.i18n)('commands.project.subcommands.migrate.errors.noProjectConfig'));
|
|
20
|
-
return;
|
|
21
|
-
}
|
|
22
|
-
const { derivedAccountId } = options;
|
|
23
|
-
try {
|
|
24
|
-
await (0, migrate_1.migrateApp2025_2)(derivedAccountId, {
|
|
25
|
-
...options,
|
|
26
|
-
name: projectConfig?.projectConfig?.name,
|
|
27
|
-
platformVersion: projects_2.PLATFORM_VERSIONS.unstable,
|
|
28
|
-
}, projectConfig);
|
|
29
|
-
}
|
|
30
|
-
catch (error) {
|
|
31
|
-
(0, errorHandlers_1.logError)(error);
|
|
32
|
-
return process.exit(exitCodes_1.EXIT_CODES.ERROR);
|
|
33
|
-
}
|
|
34
|
-
return process.exit(exitCodes_1.EXIT_CODES.SUCCESS);
|
|
35
|
-
}
|
|
36
|
-
function builder(yargs) {
|
|
37
|
-
(0, commonOpts_1.addConfigOptions)(yargs);
|
|
38
|
-
(0, commonOpts_1.addAccountOptions)(yargs);
|
|
39
|
-
(0, commonOpts_1.addGlobalOptions)(yargs);
|
|
40
|
-
return yargs;
|
|
41
|
-
}
|
|
42
|
-
const migrateAppCommand = {
|
|
43
|
-
command: exports.command,
|
|
44
|
-
describe: exports.describe,
|
|
45
|
-
handler,
|
|
46
|
-
builder,
|
|
47
|
-
};
|
|
48
|
-
exports.default = migrateAppCommand;
|