@hubspot/cli 8.0.10-experimental.7 → 8.0.11-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 +2 -0
- package/commands/account/auth.js +12 -22
- package/commands/account/clean.js +5 -6
- package/commands/account/createOverride.js +7 -7
- package/commands/account/info.js +2 -1
- package/commands/account/list.js +3 -5
- package/commands/account/remove.js +2 -3
- package/commands/account/removeOverride.js +8 -10
- package/commands/account/rename.js +5 -6
- package/commands/account/use.js +8 -19
- package/commands/api.d.ts +10 -0
- package/commands/api.js +164 -0
- package/commands/app/migrate.js +8 -8
- package/commands/app/secret/add.js +6 -7
- package/commands/app/secret/delete.js +9 -10
- package/commands/app/secret/list.js +6 -7
- package/commands/app/secret/update.js +8 -9
- package/commands/auth.js +12 -12
- package/commands/cms/app/create.js +9 -5
- package/commands/cms/convertFields.js +8 -8
- package/commands/cms/delete.js +2 -3
- package/commands/cms/fetch.js +7 -7
- package/commands/cms/function/create.js +9 -5
- package/commands/cms/function/deploy.js +2 -3
- package/commands/cms/function/list.js +11 -7
- package/commands/cms/function/logs.js +17 -23
- package/commands/cms/function/server.js +2 -3
- package/commands/cms/getReactModule.js +7 -8
- package/commands/cms/lighthouseScore.js +25 -24
- package/commands/cms/lint.js +4 -5
- package/commands/cms/list.js +5 -6
- package/commands/cms/module/create.js +9 -5
- package/commands/cms/module/marketplace-validate.js +7 -8
- package/commands/cms/mv.js +2 -3
- package/commands/cms/template/create.js +10 -6
- package/commands/cms/theme/create.js +5 -5
- package/commands/cms/theme/generate-selectors.js +5 -4
- package/commands/cms/theme/marketplace-validate.js +8 -9
- package/commands/cms/theme/preview.js +16 -8
- package/commands/cms/upload.js +15 -12
- package/commands/cms/watch.js +5 -5
- package/commands/cms/webpack/create.js +5 -5
- package/commands/completion.js +3 -5
- package/commands/config/migrate.js +6 -7
- package/commands/config/set.js +5 -6
- package/commands/customObject/create.js +4 -5
- package/commands/customObject/createSchema.js +4 -5
- package/commands/customObject/deleteSchema.js +4 -5
- package/commands/customObject/fetchAllSchemas.js +2 -3
- package/commands/customObject/fetchSchema.js +2 -3
- package/commands/customObject/listSchemas.js +2 -3
- package/commands/customObject/updateSchema.js +4 -5
- package/commands/doctor.js +8 -8
- package/commands/feedback.js +6 -4
- package/commands/filemanager/fetch.js +5 -6
- package/commands/filemanager/upload.js +5 -5
- package/commands/getStarted.js +14 -16
- package/commands/hubdb/clear.js +5 -6
- package/commands/hubdb/create.js +4 -5
- package/commands/hubdb/delete.js +8 -9
- package/commands/hubdb/fetch.js +5 -6
- package/commands/hubdb/list.js +16 -14
- package/commands/init.js +14 -17
- package/commands/mcp/setup.js +5 -6
- package/commands/mcp/start.js +2 -3
- package/commands/open.js +4 -5
- package/commands/project/add.js +10 -5
- package/commands/project/create.js +10 -10
- package/commands/project/delete.d.ts +7 -0
- package/commands/project/delete.js +74 -0
- package/commands/project/deploy.js +36 -34
- package/commands/project/dev/deprecatedFlow.js +42 -15
- package/commands/project/dev/index.d.ts +3 -3
- package/commands/project/dev/index.js +24 -30
- package/commands/project/dev/unifiedFlow.js +37 -14
- package/commands/project/download.js +10 -11
- package/commands/project/info.d.ts +4 -0
- package/commands/project/info.js +67 -0
- package/commands/project/installDeps.js +9 -6
- package/commands/project/lint.js +11 -8
- package/commands/project/list.js +14 -14
- package/commands/project/listBuilds.js +8 -6
- package/commands/project/logs.js +5 -6
- package/commands/project/migrate.js +8 -8
- package/commands/project/open.js +5 -6
- package/commands/project/profile/add.js +12 -8
- package/commands/project/profile/delete.js +15 -11
- package/commands/project/updateDeps.js +9 -6
- package/commands/project/upload.js +31 -17
- package/commands/project/validate.js +11 -11
- package/commands/project/watch.js +20 -20
- package/commands/project.js +4 -0
- package/commands/sandbox/create.js +15 -15
- package/commands/sandbox/delete.js +13 -14
- package/commands/secret/addSecret.js +6 -7
- package/commands/secret/deleteSecret.js +5 -6
- package/commands/secret/listSecret.js +2 -3
- package/commands/secret/updateSecret.js +4 -5
- package/commands/testAccount/create.d.ts +1 -1
- package/commands/testAccount/create.js +20 -16
- package/commands/testAccount/createConfig.js +7 -8
- package/commands/testAccount/delete.js +27 -18
- package/commands/testAccount/importData.js +6 -7
- package/commands/upgrade.js +9 -10
- package/lang/en.d.ts +123 -5
- package/lang/en.js +121 -6
- package/lib/accountAuth.js +2 -2
- package/lib/buildAccount.js +3 -3
- package/lib/constants.d.ts +0 -1
- package/lib/constants.js +0 -1
- package/lib/doctor/Diagnosis.js +5 -5
- package/lib/errorHandlers/index.js +4 -3
- package/lib/errorHandlers/suppressError.js +4 -0
- package/lib/errors/PromptExitError.d.ts +4 -2
- package/lib/errors/PromptExitError.js +3 -0
- package/lib/hasFeature.js +1 -2
- package/lib/middleware/autoUpdateMiddleware.js +6 -3
- package/lib/process.d.ts +1 -1
- package/lib/process.js +10 -3
- package/lib/projects/create/v2.js +1 -2
- package/lib/projects/delete.d.ts +13 -0
- package/lib/projects/delete.js +193 -0
- package/lib/projects/localDev/AppDevModeInterface.js +11 -11
- package/lib/projects/localDev/DevServerManager_DEPRECATED.d.ts +3 -1
- package/lib/projects/localDev/DevServerManager_DEPRECATED.js +2 -2
- package/lib/projects/localDev/DevSessionManager.d.ts +6 -3
- package/lib/projects/localDev/DevSessionManager.js +31 -19
- package/lib/projects/localDev/LocalDevManager_DEPRECATED.d.ts +3 -0
- package/lib/projects/localDev/LocalDevManager_DEPRECATED.js +16 -12
- package/lib/projects/localDev/LocalDevProcess.js +6 -5
- package/lib/projects/localDev/LocalDevState.d.ts +3 -2
- package/lib/projects/localDev/LocalDevState.js +3 -1
- package/lib/projects/localDev/helpers/account.d.ts +4 -3
- package/lib/projects/localDev/helpers/account.js +16 -19
- package/lib/projects/localDev/helpers/process.d.ts +1 -1
- package/lib/projects/localDev/helpers/process.js +4 -10
- package/lib/projects/localDev/helpers/project.d.ts +4 -3
- package/lib/projects/localDev/helpers/project.js +31 -15
- package/lib/projects/projectInfo.d.ts +5 -0
- package/lib/projects/projectInfo.js +82 -0
- package/lib/projects/projectProfiles.d.ts +1 -2
- package/lib/projects/projectProfiles.js +5 -17
- package/lib/projects/upload.js +19 -0
- package/lib/projects/workspaces.d.ts +42 -0
- package/lib/projects/workspaces.js +350 -0
- package/lib/prompts/createApiSamplePrompt.js +4 -0
- package/lib/prompts/projectProfilePrompt.d.ts +2 -0
- package/lib/prompts/projectProfilePrompt.js +46 -0
- package/lib/prompts/promptUtils.js +3 -2
- package/lib/prompts/selectHubDBTablePrompt.js +2 -2
- package/lib/prompts/selectPublicAppForMigrationPrompt.js +2 -2
- package/lib/theme/cmsDevServerProcess.d.ts +2 -0
- package/lib/theme/cmsDevServerProcess.js +7 -6
- package/lib/ui/SpinniesManager.d.ts +1 -0
- package/lib/ui/SpinniesManager.js +20 -6
- package/lib/ui/spinniesUtils.d.ts +0 -1
- package/lib/ui/spinniesUtils.js +6 -16
- package/lib/usageTracking.d.ts +3 -4
- package/lib/yargs/makeYargsBuilder.d.ts +13 -0
- package/lib/yargs/makeYargsBuilder.js +33 -0
- package/lib/yargs/makeYargsHandlerWithUsageTracking.d.ts +3 -0
- package/lib/yargs/makeYargsHandlerWithUsageTracking.js +95 -0
- package/lib/yargs/strictEnforceBoolean.d.ts +1 -0
- package/lib/yargs/strictEnforceBoolean.js +13 -0
- package/lib/yargsUtils.d.ts +3 -16
- package/lib/yargsUtils.js +3 -48
- package/package.json +5 -4
- package/types/LocalDev.d.ts +5 -0
- package/types/Projects.d.ts +19 -0
- package/types/Yargs.d.ts +18 -1
|
@@ -6,6 +6,7 @@ import { fileURLToPath } from 'url';
|
|
|
6
6
|
import { getConfigFilePath } from '@hubspot/local-dev-lib/config';
|
|
7
7
|
import SpinniesManager from '../ui/SpinniesManager.js';
|
|
8
8
|
import { lib } from '../../lang/en.js';
|
|
9
|
+
import { EXIT_CODES } from '../enums/exitCodes.js';
|
|
9
10
|
const __filename = fileURLToPath(import.meta.url);
|
|
10
11
|
const __dirname = path.dirname(__filename);
|
|
11
12
|
// cms-dev-server version to install to isolated cache
|
|
@@ -83,7 +84,7 @@ async function ensureCmsDevServerCache(targetVersion) {
|
|
|
83
84
|
return cacheDir;
|
|
84
85
|
}
|
|
85
86
|
export async function spawnDevServer(options) {
|
|
86
|
-
const { absoluteSrc, accountName, noSsl, port, generateFieldsTypes, resetSession, dest, } = options;
|
|
87
|
+
const { absoluteSrc, accountName, noSsl, port, generateFieldsTypes, resetSession, dest, exit, } = options;
|
|
87
88
|
// Ensure cms-dev-server is installed in isolated cache
|
|
88
89
|
const cacheDir = await ensureCmsDevServerCache(TARGET_CMS_DEV_SERVER_VERSION);
|
|
89
90
|
// Get config path to pass to createDevServer
|
|
@@ -123,18 +124,18 @@ export async function spawnDevServer(options) {
|
|
|
123
124
|
cwd: cacheDir,
|
|
124
125
|
});
|
|
125
126
|
// Handle process events
|
|
126
|
-
devServer.on('error', error => {
|
|
127
|
+
devServer.on('error', async (error) => {
|
|
127
128
|
console.error(lib.theme.cmsDevServerProcess.serverStartError(error));
|
|
128
|
-
|
|
129
|
+
await exit(EXIT_CODES.ERROR);
|
|
129
130
|
});
|
|
130
|
-
devServer.on('exit', (code, signal) => {
|
|
131
|
+
devServer.on('exit', async (code, signal) => {
|
|
131
132
|
if (code !== 0 && code !== null) {
|
|
132
133
|
console.error(lib.theme.cmsDevServerProcess.serverExit(code));
|
|
133
|
-
|
|
134
|
+
await exit(code);
|
|
134
135
|
}
|
|
135
136
|
if (signal) {
|
|
136
137
|
console.error(lib.theme.cmsDevServerProcess.serverKill(signal));
|
|
137
|
-
|
|
138
|
+
await exit(EXIT_CODES.ERROR);
|
|
138
139
|
}
|
|
139
140
|
});
|
|
140
141
|
// Handle CLI termination
|
|
@@ -10,7 +10,8 @@ The above copyright notice and this permission notice shall be included in all c
|
|
|
10
10
|
import readline from 'readline';
|
|
11
11
|
import chalk from 'chalk';
|
|
12
12
|
import cliCursor from 'cli-cursor';
|
|
13
|
-
import { breakText, cleanStream, colorOptions, getLinesLength, prefixOptions, purgeSpinnerOptions, purgeSpinnersOptions, SPINNERS,
|
|
13
|
+
import { breakText, cleanStream, colorOptions, getLinesLength, prefixOptions, purgeSpinnerOptions, purgeSpinnersOptions, SPINNERS, writeStream, } from './spinniesUtils.js';
|
|
14
|
+
import { isUnicodeSupported } from '@hubspot/local-dev-lib/isUnicodeSupported';
|
|
14
15
|
import { uiLogger } from './logger.js';
|
|
15
16
|
function safeColor(text, color) {
|
|
16
17
|
const chalkFn = chalk[color];
|
|
@@ -29,6 +30,7 @@ class SpinniesManager {
|
|
|
29
30
|
lineCount = 0;
|
|
30
31
|
currentFrameIndex = 0;
|
|
31
32
|
spin;
|
|
33
|
+
sigintHandler = null;
|
|
32
34
|
constructor() {
|
|
33
35
|
this.resetState();
|
|
34
36
|
}
|
|
@@ -37,7 +39,7 @@ class SpinniesManager {
|
|
|
37
39
|
spinnerColor: 'greenBright',
|
|
38
40
|
succeedColor: 'green',
|
|
39
41
|
failColor: 'red',
|
|
40
|
-
spinner:
|
|
42
|
+
spinner: isUnicodeSupported() ? SPINNERS.dots : SPINNERS.dashes,
|
|
41
43
|
disableSpins: false,
|
|
42
44
|
...purgeSpinnersOptions(options),
|
|
43
45
|
};
|
|
@@ -247,12 +249,24 @@ class SpinniesManager {
|
|
|
247
249
|
}
|
|
248
250
|
}
|
|
249
251
|
bindSigint() {
|
|
250
|
-
|
|
251
|
-
|
|
252
|
+
if (this.sigintHandler) {
|
|
253
|
+
process.removeListener('SIGINT', this.sigintHandler);
|
|
254
|
+
}
|
|
255
|
+
this.sigintHandler = () => {
|
|
252
256
|
cliCursor.show();
|
|
253
257
|
readline.moveCursor(process.stderr, 0, this.lineCount);
|
|
254
|
-
process
|
|
255
|
-
|
|
258
|
+
const remainingListeners = process
|
|
259
|
+
.listeners('SIGINT')
|
|
260
|
+
.filter(l => l !== this.sigintHandler);
|
|
261
|
+
if (remainingListeners.length === 0) {
|
|
262
|
+
// process.exit is intentionally used here rather than the command-level
|
|
263
|
+
// exit() function because this SIGINT handler runs outside of a command
|
|
264
|
+
// context and needs to force-terminate the process when no other SIGINT
|
|
265
|
+
// listeners remain to handle it.
|
|
266
|
+
process.exit(0);
|
|
267
|
+
}
|
|
268
|
+
};
|
|
269
|
+
process.on('SIGINT', this.sigintHandler);
|
|
256
270
|
}
|
|
257
271
|
}
|
|
258
272
|
const toExport = new SpinniesManager();
|
|
@@ -28,5 +28,4 @@ export declare function breakText(text: string, prefixLength: number): string;
|
|
|
28
28
|
export declare function getLinesLength(text: string, prefixLength: number): number[];
|
|
29
29
|
export declare function writeStream(stream: NodeJS.WriteStream, output: string, rawLines: number[]): void;
|
|
30
30
|
export declare function cleanStream(stream: NodeJS.WriteStream, rawLines: number[]): void;
|
|
31
|
-
export declare function terminalSupportsUnicode(): boolean;
|
|
32
31
|
export {};
|
package/lib/ui/spinniesUtils.js
CHANGED
|
@@ -9,6 +9,8 @@ The above copyright notice and this permission notice shall be included in all c
|
|
|
9
9
|
**/
|
|
10
10
|
import readline from 'readline';
|
|
11
11
|
import stripAnsi from 'strip-ansi';
|
|
12
|
+
import { isUnicodeSupported } from '@hubspot/local-dev-lib/isUnicodeSupported';
|
|
13
|
+
import { getSymbols } from '@hubspot/local-dev-lib/logger';
|
|
12
14
|
export const VALID_STATUSES = [
|
|
13
15
|
'succeed',
|
|
14
16
|
'fail',
|
|
@@ -64,7 +66,7 @@ export function purgeSpinnersOptions({ spinner, disableSpins, ...others }) {
|
|
|
64
66
|
return { ...colors, ...prefixes, ...disableSpinsOption, spinner };
|
|
65
67
|
}
|
|
66
68
|
function turnToValidSpinner(spinner = {}) {
|
|
67
|
-
const platformSpinner =
|
|
69
|
+
const platformSpinner = isUnicodeSupported()
|
|
68
70
|
? SPINNERS.dots
|
|
69
71
|
: SPINNERS.dashes;
|
|
70
72
|
if (typeof spinner !== 'object') {
|
|
@@ -101,14 +103,9 @@ export function colorOptions({ color, succeedColor, failColor, spinnerColor, })
|
|
|
101
103
|
return colors;
|
|
102
104
|
}
|
|
103
105
|
export function prefixOptions({ succeedPrefix, failPrefix, }) {
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
}
|
|
108
|
-
else {
|
|
109
|
-
succeedPrefix = succeedPrefix || '√';
|
|
110
|
-
failPrefix = failPrefix || '×';
|
|
111
|
-
}
|
|
106
|
+
const symbols = getSymbols();
|
|
107
|
+
succeedPrefix = succeedPrefix || symbols.success;
|
|
108
|
+
failPrefix = failPrefix || symbols.error;
|
|
112
109
|
return { succeedPrefix, failPrefix };
|
|
113
110
|
}
|
|
114
111
|
export function breakText(text, prefixLength) {
|
|
@@ -142,10 +139,3 @@ export function cleanStream(stream, rawLines) {
|
|
|
142
139
|
readline.clearScreenDown(stream);
|
|
143
140
|
readline.moveCursor(stream, 0, -rawLines.length);
|
|
144
141
|
}
|
|
145
|
-
export function terminalSupportsUnicode() {
|
|
146
|
-
// The default command prompt and powershell in Windows do not support Unicode characters.
|
|
147
|
-
// However, the VSCode integrated terminal and the Windows Terminal both do.
|
|
148
|
-
return (process.platform !== 'win32' ||
|
|
149
|
-
process.env.TERM_PROGRAM === 'vscode' ||
|
|
150
|
-
!!process.env.WT_SESSION);
|
|
151
|
-
}
|
package/lib/usageTracking.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
type
|
|
1
|
+
export type UsageTrackingMeta = {
|
|
2
2
|
action?: string;
|
|
3
3
|
os?: string;
|
|
4
4
|
nodeVersion?: string;
|
|
@@ -24,9 +24,8 @@ export declare function getNodeVersionData(): {
|
|
|
24
24
|
nodeMajorVersion: string;
|
|
25
25
|
};
|
|
26
26
|
export declare function getPlatform(): string;
|
|
27
|
-
export declare function trackCommandUsage(command: string, meta?:
|
|
27
|
+
export declare function trackCommandUsage(command: string, meta?: UsageTrackingMeta, accountId?: number): Promise<void>;
|
|
28
28
|
export declare function trackHelpUsage(command: string): Promise<void>;
|
|
29
29
|
export declare function trackConvertFieldsUsage(command: string): Promise<void>;
|
|
30
30
|
export declare function trackAuthAction(command: string, authType: string, step: string, accountId?: number): Promise<void>;
|
|
31
|
-
export declare function trackCommandMetadataUsage(command: string, meta?:
|
|
32
|
-
export {};
|
|
31
|
+
export declare function trackCommandMetadataUsage(command: string, meta?: UsageTrackingMeta, accountId?: number): Promise<void>;
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { Argv } from 'yargs';
|
|
2
|
+
export declare function makeYargsBuilder<T>(callback: (yargs: Argv) => Argv<T>, command: string | string[], describe?: string, options?: {
|
|
3
|
+
useGlobalOptions?: boolean;
|
|
4
|
+
useAccountOptions?: boolean;
|
|
5
|
+
useConfigOptions?: boolean;
|
|
6
|
+
useEnvironmentOptions?: boolean;
|
|
7
|
+
useTestingOptions?: boolean;
|
|
8
|
+
useCmsPublishModeOptions?: boolean | {
|
|
9
|
+
read?: boolean;
|
|
10
|
+
write?: boolean;
|
|
11
|
+
};
|
|
12
|
+
useJSONOutputOptions?: boolean;
|
|
13
|
+
}): (yargs: Argv) => Promise<Argv<T>>;
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { addCustomHelpOutput, addTestingOptions, addAccountOptions, addConfigOptions, addGlobalOptions, addUseEnvironmentOptions, addCmsPublishModeOptions, addJSONOutputOptions, } from '../commonOpts.js';
|
|
2
|
+
export function makeYargsBuilder(callback, command, describe, options = {}) {
|
|
3
|
+
return async function (yargs) {
|
|
4
|
+
if (options.useGlobalOptions) {
|
|
5
|
+
addGlobalOptions(yargs);
|
|
6
|
+
}
|
|
7
|
+
if (options.useAccountOptions) {
|
|
8
|
+
addAccountOptions(yargs);
|
|
9
|
+
}
|
|
10
|
+
if (options.useConfigOptions) {
|
|
11
|
+
addConfigOptions(yargs);
|
|
12
|
+
}
|
|
13
|
+
if (options.useEnvironmentOptions) {
|
|
14
|
+
addUseEnvironmentOptions(yargs);
|
|
15
|
+
}
|
|
16
|
+
if (options.useTestingOptions) {
|
|
17
|
+
addTestingOptions(yargs);
|
|
18
|
+
}
|
|
19
|
+
if (options.useJSONOutputOptions) {
|
|
20
|
+
addJSONOutputOptions(yargs);
|
|
21
|
+
}
|
|
22
|
+
if (options.useCmsPublishModeOptions) {
|
|
23
|
+
const opts = typeof options.useCmsPublishModeOptions === 'object'
|
|
24
|
+
? options.useCmsPublishModeOptions
|
|
25
|
+
: { write: true };
|
|
26
|
+
addCmsPublishModeOptions(yargs, opts);
|
|
27
|
+
}
|
|
28
|
+
const result = callback(yargs);
|
|
29
|
+
// Must go last to pick up available options
|
|
30
|
+
await addCustomHelpOutput(result, command, describe);
|
|
31
|
+
return result;
|
|
32
|
+
};
|
|
33
|
+
}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import { ArgumentsCamelCase } from 'yargs';
|
|
2
|
+
import { CommonArgs } from '../../types/Yargs.js';
|
|
3
|
+
export declare function makeYargsHandlerWithUsageTracking<T extends CommonArgs>(trackingName: string, handler: (args: ArgumentsCamelCase<T>) => Promise<void>): (args: ArgumentsCamelCase<T>) => Promise<void>;
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
import { getConfig } from '@hubspot/local-dev-lib/config';
|
|
2
|
+
import { getStateValue, setStateValue, } from '@hubspot/local-dev-lib/config/state';
|
|
3
|
+
import { STATE_FLAGS } from '@hubspot/local-dev-lib/constants/config';
|
|
4
|
+
import { trackCommandUsage as _trackCommandUsage } from '../usageTracking.js';
|
|
5
|
+
import { pkg } from '../jsonLoader.js';
|
|
6
|
+
import { uiLogger } from '../ui/logger.js';
|
|
7
|
+
import { lib } from '../../lang/en.js';
|
|
8
|
+
import { EXIT_CODES } from '../enums/exitCodes.js';
|
|
9
|
+
import { isPromptExitError } from '../errors/PromptExitError.js';
|
|
10
|
+
import { debugError } from '../errorHandlers/index.js';
|
|
11
|
+
function logUsageTrackingMessage(isJsonOutput) {
|
|
12
|
+
if (isJsonOutput) {
|
|
13
|
+
return;
|
|
14
|
+
}
|
|
15
|
+
try {
|
|
16
|
+
const config = getConfig();
|
|
17
|
+
if (config?.allowUsageTracking !== true) {
|
|
18
|
+
return;
|
|
19
|
+
}
|
|
20
|
+
const lastShownVersion = getStateValue(STATE_FLAGS.USAGE_TRACKING_MESSAGE_LAST_SHOW_VERSION);
|
|
21
|
+
if (lastShownVersion === pkg.version) {
|
|
22
|
+
return;
|
|
23
|
+
}
|
|
24
|
+
setStateValue(STATE_FLAGS.USAGE_TRACKING_MESSAGE_LAST_SHOW_VERSION, pkg.version);
|
|
25
|
+
uiLogger.info(lib.usageTracking.transparencyMessage);
|
|
26
|
+
}
|
|
27
|
+
catch (_e) {
|
|
28
|
+
return;
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
export function makeYargsHandlerWithUsageTracking(trackingName, handler) {
|
|
32
|
+
return async (args) => {
|
|
33
|
+
const meta = {};
|
|
34
|
+
let trackingFired = false;
|
|
35
|
+
const trackingArgs = args;
|
|
36
|
+
const addUsageMetadata = (newMeta) => {
|
|
37
|
+
Object.assign(meta, newMeta);
|
|
38
|
+
};
|
|
39
|
+
trackingArgs.addUsageMetadata = addUsageMetadata;
|
|
40
|
+
const trackCommandUsage = async (successful) => {
|
|
41
|
+
if (trackingFired) {
|
|
42
|
+
return;
|
|
43
|
+
}
|
|
44
|
+
trackingFired = true;
|
|
45
|
+
try {
|
|
46
|
+
const { accountId: overrideAccountId, ...trackingMeta } = meta;
|
|
47
|
+
trackingMeta.successful = successful;
|
|
48
|
+
await _trackCommandUsage(trackingName, trackingMeta, overrideAccountId ?? args.derivedAccountId);
|
|
49
|
+
}
|
|
50
|
+
catch (_e) { }
|
|
51
|
+
};
|
|
52
|
+
const onForcedExit = () => {
|
|
53
|
+
process.exit(EXIT_CODES.SUCCESS);
|
|
54
|
+
};
|
|
55
|
+
const onSigint = async () => {
|
|
56
|
+
process.removeListener('SIGINT', onSigint);
|
|
57
|
+
process.on('SIGINT', onForcedExit);
|
|
58
|
+
try {
|
|
59
|
+
await trackCommandUsage(false);
|
|
60
|
+
}
|
|
61
|
+
catch (_e) { }
|
|
62
|
+
process.removeListener('SIGINT', onForcedExit);
|
|
63
|
+
process.exit(EXIT_CODES.SUCCESS);
|
|
64
|
+
};
|
|
65
|
+
process.on('SIGINT', onSigint);
|
|
66
|
+
const trackCommandUsageAndRemoveListeners = async (successful) => {
|
|
67
|
+
await trackCommandUsage(successful);
|
|
68
|
+
process.removeListener('SIGINT', onSigint);
|
|
69
|
+
process.removeListener('SIGINT', onForcedExit);
|
|
70
|
+
};
|
|
71
|
+
trackingArgs.exit = async (code) => {
|
|
72
|
+
await trackCommandUsageAndRemoveListeners(code !== EXIT_CODES.ERROR);
|
|
73
|
+
return process.exit(code);
|
|
74
|
+
};
|
|
75
|
+
const jsonArgs = args;
|
|
76
|
+
logUsageTrackingMessage(Boolean(jsonArgs.json || jsonArgs.formatOutputAsJson));
|
|
77
|
+
try {
|
|
78
|
+
await handler(trackingArgs);
|
|
79
|
+
}
|
|
80
|
+
catch (e) {
|
|
81
|
+
const isSuccessfulPromptExit = isPromptExitError(e)
|
|
82
|
+
? e.exitCode !== EXIT_CODES.ERROR
|
|
83
|
+
: false;
|
|
84
|
+
await trackCommandUsageAndRemoveListeners(isSuccessfulPromptExit);
|
|
85
|
+
if (isPromptExitError(e)) {
|
|
86
|
+
return process.exit(e.exitCode);
|
|
87
|
+
}
|
|
88
|
+
else {
|
|
89
|
+
debugError(e);
|
|
90
|
+
return process.exit(EXIT_CODES.ERROR);
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
await trackCommandUsageAndRemoveListeners(true);
|
|
94
|
+
};
|
|
95
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function strictEnforceBoolean(rawArgs: string[], booleanOptions: string[]): boolean;
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { commands } from '../../lang/en.js';
|
|
2
|
+
export function strictEnforceBoolean(rawArgs, booleanOptions) {
|
|
3
|
+
for (const option of booleanOptions) {
|
|
4
|
+
const argIndex = rawArgs.findIndex(arg => arg.startsWith(`--${option}=`));
|
|
5
|
+
if (argIndex !== -1) {
|
|
6
|
+
const value = rawArgs[argIndex].split('=')[1];
|
|
7
|
+
if (value && !['true', 'false'].includes(value.toLowerCase())) {
|
|
8
|
+
throw new Error(commands.config.subcommands.set.errors.invalidBoolean(option, value));
|
|
9
|
+
}
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
return true;
|
|
13
|
+
}
|
package/lib/yargsUtils.d.ts
CHANGED
|
@@ -1,16 +1,3 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
export {
|
|
4
|
-
export declare function makeYargsBuilder<T>(callback: (yargs: Argv) => Argv<T>, command: string | string[], describe?: string, options?: {
|
|
5
|
-
useGlobalOptions?: boolean;
|
|
6
|
-
useAccountOptions?: boolean;
|
|
7
|
-
useConfigOptions?: boolean;
|
|
8
|
-
useEnvironmentOptions?: boolean;
|
|
9
|
-
useTestingOptions?: boolean;
|
|
10
|
-
useCmsPublishModeOptions?: boolean | {
|
|
11
|
-
read?: boolean;
|
|
12
|
-
write?: boolean;
|
|
13
|
-
};
|
|
14
|
-
useJSONOutputOptions?: boolean;
|
|
15
|
-
}): (yargs: Argv) => Promise<Argv<T>>;
|
|
16
|
-
export declare function strictEnforceBoolean(rawArgs: string[], booleanOptions: string[]): boolean;
|
|
1
|
+
export { hasFlag } from './utils/hasFlag.js';
|
|
2
|
+
export { makeYargsBuilder } from './yargs/makeYargsBuilder.js';
|
|
3
|
+
export { strictEnforceBoolean } from './yargs/strictEnforceBoolean.js';
|
package/lib/yargsUtils.js
CHANGED
|
@@ -1,49 +1,4 @@
|
|
|
1
|
-
import { addCustomHelpOutput, addTestingOptions, addAccountOptions, addConfigOptions, addGlobalOptions, addUseEnvironmentOptions, addCmsPublishModeOptions, addJSONOutputOptions, } from './commonOpts.js';
|
|
2
|
-
import { hasFlag } from './utils/hasFlag.js';
|
|
3
|
-
import { commands } from '../lang/en.js';
|
|
4
1
|
// Re-export for backwards compatibility
|
|
5
|
-
export { hasFlag };
|
|
6
|
-
export
|
|
7
|
-
|
|
8
|
-
if (options.useGlobalOptions) {
|
|
9
|
-
addGlobalOptions(yargs);
|
|
10
|
-
}
|
|
11
|
-
if (options.useAccountOptions) {
|
|
12
|
-
addAccountOptions(yargs);
|
|
13
|
-
}
|
|
14
|
-
if (options.useConfigOptions) {
|
|
15
|
-
addConfigOptions(yargs);
|
|
16
|
-
}
|
|
17
|
-
if (options.useEnvironmentOptions) {
|
|
18
|
-
addUseEnvironmentOptions(yargs);
|
|
19
|
-
}
|
|
20
|
-
if (options.useTestingOptions) {
|
|
21
|
-
addTestingOptions(yargs);
|
|
22
|
-
}
|
|
23
|
-
if (options.useJSONOutputOptions) {
|
|
24
|
-
addJSONOutputOptions(yargs);
|
|
25
|
-
}
|
|
26
|
-
if (options.useCmsPublishModeOptions) {
|
|
27
|
-
const opts = typeof options.useCmsPublishModeOptions === 'object'
|
|
28
|
-
? options.useCmsPublishModeOptions
|
|
29
|
-
: { write: true };
|
|
30
|
-
addCmsPublishModeOptions(yargs, opts);
|
|
31
|
-
}
|
|
32
|
-
const result = callback(yargs);
|
|
33
|
-
// Must go last to pick up available options
|
|
34
|
-
await addCustomHelpOutput(result, command, describe);
|
|
35
|
-
return result;
|
|
36
|
-
};
|
|
37
|
-
}
|
|
38
|
-
export function strictEnforceBoolean(rawArgs, booleanOptions) {
|
|
39
|
-
for (const option of booleanOptions) {
|
|
40
|
-
const argIndex = rawArgs.findIndex(arg => arg.startsWith(`--${option}=`));
|
|
41
|
-
if (argIndex !== -1) {
|
|
42
|
-
const value = rawArgs[argIndex].split('=')[1];
|
|
43
|
-
if (value && !['true', 'false'].includes(value.toLowerCase())) {
|
|
44
|
-
throw new Error(commands.config.subcommands.set.errors.invalidBoolean(option, value));
|
|
45
|
-
}
|
|
46
|
-
}
|
|
47
|
-
}
|
|
48
|
-
return true;
|
|
49
|
-
}
|
|
2
|
+
export { hasFlag } from './utils/hasFlag.js';
|
|
3
|
+
export { makeYargsBuilder } from './yargs/makeYargsBuilder.js';
|
|
4
|
+
export { strictEnforceBoolean } from './yargs/strictEnforceBoolean.js';
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@hubspot/cli",
|
|
3
|
-
"version": "8.0.
|
|
3
|
+
"version": "8.0.11-experimental.1",
|
|
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",
|
|
@@ -10,10 +10,10 @@
|
|
|
10
10
|
"!**/__tests__/**"
|
|
11
11
|
],
|
|
12
12
|
"dependencies": {
|
|
13
|
-
"@hubspot/local-dev-lib": "5.
|
|
14
|
-
"@hubspot/project-parsing-lib": "0.
|
|
13
|
+
"@hubspot/local-dev-lib": "5.3.3",
|
|
14
|
+
"@hubspot/project-parsing-lib": "0.14.1-beta.0",
|
|
15
15
|
"@hubspot/serverless-dev-runtime": "7.0.7",
|
|
16
|
-
"@hubspot/ui-extensions-dev-server": "2.0.
|
|
16
|
+
"@hubspot/ui-extensions-dev-server": "2.0.4",
|
|
17
17
|
"@inquirer/prompts": "7.1.0",
|
|
18
18
|
"@modelcontextprotocol/sdk": "1.25.0",
|
|
19
19
|
"archiver": "7.0.1",
|
|
@@ -80,6 +80,7 @@
|
|
|
80
80
|
"debug-mcp": "yarn build && npx @modelcontextprotocol/inspector node dist/mcp-server/server.js",
|
|
81
81
|
"hs": "yarn build && node ./dist/bin/hs",
|
|
82
82
|
"hs-debug": "yarn build && NODE_DEBUG=http* node --inspect-brk ./dist/bin/hs",
|
|
83
|
+
"hs-proxy": "yarn build && HTTPS_PROXY=http://localhost:8181 NODE_TLS_REJECT_UNAUTHORIZED=0 node ./dist/bin/hs",
|
|
83
84
|
"lint": "echo 'Linting is disabled for Blazar'",
|
|
84
85
|
"lint:local": "eslint . && prettier --list-different './**/*.{ts,tsx,js,json}'",
|
|
85
86
|
"list-all-commands": "yarn tsx ./scripts/get-all-commands.ts",
|
package/types/LocalDev.d.ts
CHANGED
|
@@ -6,6 +6,10 @@ import { Project } from '@hubspot/local-dev-lib/types/Project';
|
|
|
6
6
|
import { ProjectConfig } from './Projects.js';
|
|
7
7
|
import LocalDevState from '../lib/projects/localDev/LocalDevState.js';
|
|
8
8
|
import { APP_INSTALLATION_STATES, LOCAL_DEV_UI_MESSAGE_RECEIVE_TYPES, LOCAL_DEV_SERVER_MESSAGE_TYPES } from '../lib/constants.js';
|
|
9
|
+
import { ExitFunction } from './Yargs.js';
|
|
10
|
+
export type LocalDevActions = {
|
|
11
|
+
exit: ExitFunction;
|
|
12
|
+
};
|
|
9
13
|
export type LocalDevStateConstructorOptions = {
|
|
10
14
|
targetProjectAccountId: number;
|
|
11
15
|
targetTestingAccountId: number;
|
|
@@ -19,6 +23,7 @@ export type LocalDevStateConstructorOptions = {
|
|
|
19
23
|
};
|
|
20
24
|
initialProjectProfileData: HSProfileVariables;
|
|
21
25
|
env: Environment;
|
|
26
|
+
actions: LocalDevActions;
|
|
22
27
|
};
|
|
23
28
|
export type LocalDevDeployWebsocketMessage = {
|
|
24
29
|
type: typeof LOCAL_DEV_UI_MESSAGE_RECEIVE_TYPES.DEPLOY;
|
package/types/Projects.d.ts
CHANGED
|
@@ -117,6 +117,25 @@ export type AppCardComponentConfig = {
|
|
|
117
117
|
};
|
|
118
118
|
};
|
|
119
119
|
export type GenericComponentConfig = PublicAppComponentConfig | PrivateAppComponentConfig | AppCardComponentConfig;
|
|
120
|
+
export type ProjectInfo = {
|
|
121
|
+
projectName: string;
|
|
122
|
+
platformVersion: string;
|
|
123
|
+
projectId: number;
|
|
124
|
+
deployedBuildId: number;
|
|
125
|
+
autoDeployEnabled: boolean;
|
|
126
|
+
projectUrl?: string;
|
|
127
|
+
app?: {
|
|
128
|
+
name: string;
|
|
129
|
+
id: number;
|
|
130
|
+
uid: string;
|
|
131
|
+
authType?: string;
|
|
132
|
+
distributionType?: string;
|
|
133
|
+
};
|
|
134
|
+
components: {
|
|
135
|
+
uid: string;
|
|
136
|
+
type: string;
|
|
137
|
+
}[];
|
|
138
|
+
};
|
|
120
139
|
export declare enum ComponentTypes {
|
|
121
140
|
PrivateApp = "private-app",
|
|
122
141
|
PublicApp = "public-app",
|
package/types/Yargs.d.ts
CHANGED
|
@@ -1,11 +1,25 @@
|
|
|
1
1
|
import { Options, CommandModule, Argv } from 'yargs';
|
|
2
2
|
import { CmsPublishMode } from '@hubspot/local-dev-lib/types/Files';
|
|
3
|
-
|
|
3
|
+
import { EXIT_CODES } from '../lib/enums/exitCodes.js';
|
|
4
|
+
import { ValueOf } from '@hubspot/local-dev-lib/types/Utils';
|
|
5
|
+
import { UsageTrackingMeta } from '../lib/usageTracking.js';
|
|
6
|
+
export type UsageTrackingMetaWithAccountId = UsageTrackingMeta & {
|
|
7
|
+
accountId?: number;
|
|
8
|
+
};
|
|
9
|
+
export type AddUsageMetadata = (meta: Omit<UsageTrackingMetaWithAccountId, 'successful'>) => void;
|
|
10
|
+
export type UsageTrackingArgs = {
|
|
11
|
+
addUsageMetadata: AddUsageMetadata;
|
|
12
|
+
exit: ExitFunction;
|
|
13
|
+
};
|
|
14
|
+
type AccountMiddlewareArgs = {
|
|
4
15
|
derivedAccountId: number;
|
|
5
16
|
userProvidedAccount?: string;
|
|
17
|
+
};
|
|
18
|
+
type DebugArgs = {
|
|
6
19
|
d: boolean;
|
|
7
20
|
debug: boolean;
|
|
8
21
|
};
|
|
22
|
+
export type CommonArgs = AccountMiddlewareArgs & DebugArgs & UsageTrackingArgs;
|
|
9
23
|
export type ConfigArgs = {
|
|
10
24
|
c?: string;
|
|
11
25
|
config?: string;
|
|
@@ -44,3 +58,6 @@ export interface YargsCommandModule<T, U> extends CommandModule<T, U> {
|
|
|
44
58
|
builder: (yargs: Argv) => Promise<Argv<U>>;
|
|
45
59
|
}
|
|
46
60
|
export type YargsCommandModuleBucket = YargsCommandModule<unknown, object>;
|
|
61
|
+
export type ExitCode = ValueOf<typeof EXIT_CODES>;
|
|
62
|
+
export type ExitFunction = (code: ExitCode) => Promise<never>;
|
|
63
|
+
export {};
|