@hubspot/cli 7.6.0-beta.5 → 7.6.0-beta.6
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/__tests__/migrate.test.js +27 -29
- package/api/migrate.d.ts +7 -0
- package/api/migrate.js +22 -22
- package/bin/cli.js +92 -97
- package/bin/hs +2 -2
- package/bin/hscms +2 -2
- package/bin/silenceErrors.js +1 -2
- package/commands/__tests__/account.test.js +29 -34
- package/commands/__tests__/auth.test.js +11 -16
- package/commands/__tests__/cms.test.js +15 -20
- package/commands/__tests__/config.test.js +14 -19
- package/commands/__tests__/create.test.js +10 -15
- package/commands/__tests__/customObject.test.js +14 -19
- package/commands/__tests__/doctor.test.js +43 -48
- package/commands/__tests__/feedback.test.js +7 -45
- package/commands/__tests__/fetch.test.js +29 -28
- package/commands/__tests__/filemanager.test.js +14 -19
- package/commands/__tests__/function.test.js +16 -21
- package/commands/__tests__/getStarted.test.js +45 -50
- package/commands/__tests__/hubdb.test.js +17 -22
- package/commands/__tests__/init.test.js +12 -17
- package/commands/__tests__/lint.test.js +13 -18
- package/commands/__tests__/list.test.js +18 -23
- package/commands/__tests__/logs.test.js +28 -27
- package/commands/__tests__/mcp.test.js +14 -19
- package/commands/__tests__/mv.test.js +14 -52
- package/commands/__tests__/open.test.js +13 -51
- package/commands/__tests__/project.test.js +44 -49
- package/commands/__tests__/remove.test.js +13 -51
- package/commands/__tests__/sandbox.test.js +14 -19
- package/commands/__tests__/secret.test.js +16 -21
- package/commands/__tests__/testAccount.test.js +16 -21
- package/commands/__tests__/theme.test.js +15 -20
- package/commands/account/__tests__/auth.test.js +11 -16
- package/commands/account/__tests__/clean.test.js +12 -17
- package/commands/account/__tests__/createOverride.test.js +10 -15
- package/commands/account/__tests__/info.test.js +11 -16
- package/commands/account/__tests__/list.test.js +11 -16
- package/commands/account/__tests__/remove.test.js +13 -18
- package/commands/account/__tests__/removeOverride.js +8 -13
- package/commands/account/__tests__/rename.test.js +15 -20
- package/commands/account/__tests__/use.test.js +10 -15
- package/commands/account/auth.d.ts +1 -1
- package/commands/account/auth.js +78 -69
- package/commands/account/clean.d.ts +1 -1
- package/commands/account/clean.js +55 -60
- package/commands/account/createOverride.d.ts +1 -1
- package/commands/account/createOverride.js +52 -57
- package/commands/account/info.d.ts +1 -1
- package/commands/account/info.js +33 -35
- package/commands/account/list.d.ts +1 -1
- package/commands/account/list.js +43 -45
- package/commands/account/remove.d.ts +1 -1
- package/commands/account/remove.js +37 -42
- package/commands/account/removeOverride.d.ts +1 -1
- package/commands/account/removeOverride.js +38 -43
- package/commands/account/rename.d.ts +1 -1
- package/commands/account/rename.js +18 -20
- package/commands/account/use.d.ts +1 -1
- package/commands/account/use.js +29 -31
- package/commands/account.d.ts +1 -1
- package/commands/account.js +23 -28
- package/commands/app/__tests__/migrate.test.js +29 -34
- package/commands/app/migrate.d.ts +2 -2
- package/commands/app/migrate.js +40 -43
- package/commands/app/secret/__tests__/add.test.js +6 -11
- package/commands/app/secret/__tests__/delete.test.js +6 -11
- package/commands/app/secret/__tests__/list.test.js +6 -11
- package/commands/app/secret/__tests__/update.test.js +6 -11
- package/commands/app/secret/add.d.ts +1 -1
- package/commands/app/secret/add.js +28 -30
- package/commands/app/secret/delete.d.ts +1 -1
- package/commands/app/secret/delete.js +34 -36
- package/commands/app/secret/list.d.ts +1 -1
- package/commands/app/secret/list.js +25 -27
- package/commands/app/secret/update.d.ts +1 -1
- package/commands/app/secret/update.js +32 -34
- package/commands/app/secret.d.ts +1 -1
- package/commands/app/secret.js +12 -17
- package/commands/app.d.ts +1 -1
- package/commands/app.js +6 -11
- package/commands/auth.d.ts +1 -1
- package/commands/auth.js +70 -72
- package/commands/cms/convertFields.d.ts +1 -1
- package/commands/cms/convertFields.js +34 -39
- package/commands/cms/getReactModule.d.ts +1 -1
- package/commands/cms/getReactModule.js +32 -37
- package/commands/cms/lighthouseScore.d.ts +1 -1
- package/commands/cms/lighthouseScore.js +67 -72
- package/commands/cms.d.ts +1 -1
- package/commands/cms.js +11 -16
- package/commands/completion.d.ts +1 -1
- package/commands/completion.js +10 -15
- package/commands/config/migrate.d.ts +1 -1
- package/commands/config/migrate.js +27 -32
- package/commands/config/set.d.ts +2 -1
- package/commands/config/set.js +40 -32
- package/commands/config.d.ts +1 -1
- package/commands/config.js +8 -13
- package/commands/create/api-sample.d.ts +1 -1
- package/commands/create/api-sample.js +28 -33
- package/commands/create/app.d.ts +1 -1
- package/commands/create/app.js +3 -5
- package/commands/create/function.d.ts +1 -1
- package/commands/create/function.js +9 -11
- package/commands/create/index.d.ts +1 -1
- package/commands/create/index.js +19 -24
- package/commands/create/module.d.ts +1 -1
- package/commands/create/module.js +12 -14
- package/commands/create/react-app.d.ts +1 -1
- package/commands/create/react-app.js +3 -5
- package/commands/create/template.d.ts +1 -1
- package/commands/create/template.js +12 -14
- package/commands/create/vue-app.d.ts +1 -1
- package/commands/create/vue-app.js +3 -5
- package/commands/create/webpack-serverless.d.ts +1 -1
- package/commands/create/webpack-serverless.js +3 -5
- package/commands/create/website-theme.d.ts +1 -1
- package/commands/create/website-theme.js +5 -7
- package/commands/create.d.ts +2 -2
- package/commands/create.js +30 -35
- package/commands/customObject/__tests__/create.test.js +13 -18
- package/commands/customObject/__tests__/schema.test.js +18 -23
- package/commands/customObject/create.d.ts +1 -1
- package/commands/customObject/create.js +28 -30
- package/commands/customObject/schema/__tests__/create.test.js +13 -18
- package/commands/customObject/schema/__tests__/delete.test.js +13 -18
- package/commands/customObject/schema/__tests__/fetch-all.test.js +13 -18
- package/commands/customObject/schema/__tests__/fetch.test.js +13 -18
- package/commands/customObject/schema/__tests__/list.test.js +13 -18
- package/commands/customObject/schema/__tests__/update.test.js +13 -18
- package/commands/customObject/schema/create.d.ts +1 -1
- package/commands/customObject/schema/create.js +28 -30
- package/commands/customObject/schema/delete.d.ts +1 -1
- package/commands/customObject/schema/delete.js +24 -26
- package/commands/customObject/schema/fetch-all.d.ts +1 -1
- package/commands/customObject/schema/fetch-all.js +22 -24
- package/commands/customObject/schema/fetch.d.ts +1 -1
- package/commands/customObject/schema/fetch.js +24 -26
- package/commands/customObject/schema/list.d.ts +1 -1
- package/commands/customObject/schema/list.js +13 -15
- package/commands/customObject/schema/update.d.ts +1 -1
- package/commands/customObject/schema/update.js +32 -34
- package/commands/customObject/schema.d.ts +1 -1
- package/commands/customObject/schema.js +17 -22
- package/commands/customObject.d.ts +1 -1
- package/commands/customObject.js +13 -18
- package/commands/doctor.d.ts +1 -1
- package/commands/doctor.js +28 -33
- package/commands/feedback.d.ts +1 -1
- package/commands/feedback.js +19 -24
- package/commands/fetch.d.ts +1 -1
- package/commands/fetch.js +28 -30
- package/commands/filemanager/__tests__/fetch.test.js +17 -22
- package/commands/filemanager/__tests__/upload.test.js +15 -20
- package/commands/filemanager/fetch.d.ts +1 -1
- package/commands/filemanager/fetch.js +23 -25
- package/commands/filemanager/upload.d.ts +1 -1
- package/commands/filemanager/upload.js +39 -44
- package/commands/filemanager.d.ts +1 -1
- package/commands/filemanager.js +8 -13
- package/commands/function/deploy.d.ts +1 -1
- package/commands/function/deploy.js +35 -40
- package/commands/function/list.d.ts +1 -1
- package/commands/function/list.js +24 -29
- package/commands/function/server.d.ts +1 -1
- package/commands/function/server.js +15 -17
- package/commands/function.d.ts +1 -1
- package/commands/function.js +12 -18
- package/commands/getStarted.d.ts +1 -1
- package/commands/getStarted.js +119 -125
- package/commands/hubdb/__tests__/clear.test.js +13 -18
- package/commands/hubdb/__tests__/create.test.js +13 -18
- package/commands/hubdb/__tests__/delete.test.js +13 -18
- package/commands/hubdb/__tests__/fetch.test.js +13 -18
- package/commands/hubdb/__tests__/list.test.js +23 -28
- package/commands/hubdb/clear.d.ts +1 -1
- package/commands/hubdb/clear.js +20 -22
- package/commands/hubdb/create.d.ts +1 -1
- package/commands/hubdb/create.js +30 -35
- package/commands/hubdb/delete.d.ts +1 -1
- package/commands/hubdb/delete.js +24 -26
- package/commands/hubdb/fetch.d.ts +1 -1
- package/commands/hubdb/fetch.js +17 -19
- package/commands/hubdb/list.d.ts +1 -1
- package/commands/hubdb/list.js +33 -35
- package/commands/hubdb.d.ts +1 -1
- package/commands/hubdb.js +18 -24
- package/commands/init.d.ts +1 -1
- package/commands/init.js +83 -88
- package/commands/lint.d.ts +1 -1
- package/commands/lint.js +24 -26
- package/commands/list.d.ts +1 -1
- package/commands/list.js +32 -37
- package/commands/logs.d.ts +1 -1
- package/commands/logs.js +35 -37
- package/commands/mcp/__tests__/setup.test.js +7 -12
- package/commands/mcp/__tests__/start.test.js +7 -12
- package/commands/mcp/setup.d.ts +1 -1
- package/commands/mcp/setup.js +17 -19
- package/commands/mcp/start.d.ts +1 -1
- package/commands/mcp/start.js +32 -34
- package/commands/mcp.d.ts +1 -1
- package/commands/mcp.js +7 -12
- package/commands/module/marketplace-validate.d.ts +1 -1
- package/commands/module/marketplace-validate.js +21 -26
- package/commands/module.d.ts +1 -1
- package/commands/module.js +7 -13
- package/commands/mv.d.ts +1 -1
- package/commands/mv.js +20 -22
- package/commands/open.d.ts +1 -1
- package/commands/open.js +19 -21
- package/commands/project/__tests__/add.test.js +10 -15
- package/commands/project/__tests__/create.test.js +14 -19
- package/commands/project/__tests__/deploy.test.js +96 -134
- package/commands/project/__tests__/devUnifiedFlow.test.js +133 -141
- package/commands/project/__tests__/download.test.js +14 -19
- package/commands/project/__tests__/installDeps.test.js +32 -70
- package/commands/project/__tests__/listBuilds.test.js +14 -19
- package/commands/project/__tests__/logs.test.js +56 -94
- package/commands/project/__tests__/migrate.test.js +25 -30
- package/commands/project/__tests__/migrateApp.test.js +17 -22
- package/commands/project/__tests__/open.test.js +16 -21
- package/commands/project/__tests__/profile.test.js +14 -19
- package/commands/project/__tests__/upload.test.js +18 -23
- package/commands/project/__tests__/watch.test.js +14 -19
- package/commands/project/add.d.ts +1 -1
- package/commands/project/add.js +34 -36
- package/commands/project/cloneApp.d.ts +1 -1
- package/commands/project/cloneApp.js +67 -72
- package/commands/project/create.d.ts +2 -2
- package/commands/project/create.js +63 -68
- package/commands/project/deploy.d.ts +1 -1
- package/commands/project/deploy.js +67 -69
- package/commands/project/dev/deprecatedFlow.d.ts +2 -2
- package/commands/project/dev/deprecatedFlow.js +52 -58
- package/commands/project/dev/index.d.ts +1 -1
- package/commands/project/dev/index.js +44 -47
- package/commands/project/dev/unifiedFlow.d.ts +3 -3
- package/commands/project/dev/unifiedFlow.js +63 -71
- package/commands/project/download.d.ts +1 -1
- package/commands/project/download.js +35 -40
- package/commands/project/installDeps.d.ts +1 -1
- package/commands/project/installDeps.js +29 -34
- package/commands/project/listBuilds.d.ts +1 -1
- package/commands/project/listBuilds.js +40 -45
- package/commands/project/logs.d.ts +1 -1
- package/commands/project/logs.js +52 -54
- package/commands/project/migrate.d.ts +1 -1
- package/commands/project/migrate.js +24 -26
- package/commands/project/migrateApp.d.ts +2 -2
- package/commands/project/migrateApp.js +18 -20
- package/commands/project/open.d.ts +1 -1
- package/commands/project/open.js +25 -30
- package/commands/project/profile/add.d.ts +1 -1
- package/commands/project/profile/add.js +68 -73
- package/commands/project/profile/delete.d.ts +1 -1
- package/commands/project/profile/delete.js +68 -61
- package/commands/project/profile.d.ts +1 -1
- package/commands/project/profile.js +9 -14
- package/commands/project/upload.d.ts +1 -1
- package/commands/project/upload.js +50 -55
- package/commands/project/validate.d.ts +1 -1
- package/commands/project/validate.js +36 -40
- package/commands/project/watch.d.ts +1 -1
- package/commands/project/watch.js +59 -61
- package/commands/project.d.ts +1 -1
- package/commands/project.js +38 -43
- package/commands/remove.d.ts +1 -1
- package/commands/remove.js +15 -17
- package/commands/sandbox/__tests__/create.test.js +222 -20
- package/commands/sandbox/__tests__/delete.test.js +15 -20
- package/commands/sandbox/create.d.ts +2 -2
- package/commands/sandbox/create.js +92 -79
- package/commands/sandbox/delete.d.ts +1 -1
- package/commands/sandbox/delete.js +94 -96
- package/commands/sandbox.d.ts +1 -1
- package/commands/sandbox.js +9 -14
- package/commands/secret/__tests__/addSecret.test.js +13 -18
- package/commands/secret/__tests__/deleteSecret.test.js +13 -18
- package/commands/secret/__tests__/listSecret.test.js +13 -18
- package/commands/secret/__tests__/updateSecret.test.js +13 -18
- package/commands/secret/addSecret.d.ts +1 -1
- package/commands/secret/addSecret.js +26 -28
- package/commands/secret/deleteSecret.d.ts +1 -1
- package/commands/secret/deleteSecret.js +27 -29
- package/commands/secret/listSecret.d.ts +1 -1
- package/commands/secret/listSecret.js +19 -21
- package/commands/secret/updateSecret.d.ts +1 -1
- package/commands/secret/updateSecret.js +25 -27
- package/commands/secret.d.ts +1 -1
- package/commands/secret.js +13 -18
- package/commands/testAccount/__tests__/create.test.js +17 -22
- package/commands/testAccount/__tests__/createConfig.test.js +6 -11
- package/commands/testAccount/__tests__/delete.test.js +15 -20
- package/commands/testAccount/create.d.ts +1 -1
- package/commands/testAccount/create.js +63 -58
- package/commands/testAccount/createConfig.d.ts +1 -1
- package/commands/testAccount/createConfig.js +36 -41
- package/commands/testAccount/delete.d.ts +1 -1
- package/commands/testAccount/delete.js +17 -19
- package/commands/testAccount.d.ts +1 -1
- package/commands/testAccount.js +10 -15
- package/commands/theme/__tests__/generate-selectors.test.js +7 -12
- package/commands/theme/__tests__/marketplace-validate.test.js +14 -19
- package/commands/theme/__tests__/preview.test.js +12 -17
- package/commands/theme/generate-selectors.d.ts +1 -1
- package/commands/theme/generate-selectors.js +23 -28
- package/commands/theme/marketplace-validate.d.ts +1 -1
- package/commands/theme/marketplace-validate.js +19 -24
- package/commands/theme/preview.d.ts +1 -1
- package/commands/theme/preview.js +60 -65
- package/commands/theme.d.ts +1 -1
- package/commands/theme.js +11 -16
- package/commands/upload.d.ts +1 -1
- package/commands/upload.js +77 -82
- package/commands/watch.d.ts +1 -1
- package/commands/watch.js +45 -51
- package/lang/en.d.ts +31 -8
- package/lang/en.js +404 -384
- package/lang/en.lyaml +4 -2
- package/lib/__tests__/accountTypes.test.js +20 -22
- package/lib/__tests__/buildAccount.test.js +88 -65
- package/lib/__tests__/commonOpts.test.js +20 -22
- package/lib/__tests__/dependencyManagement.test.js +46 -51
- package/lib/__tests__/developerTestAccounts.test.js +27 -62
- package/lib/__tests__/hasFeature.test.js +6 -8
- package/lib/__tests__/npm.test.js +15 -20
- package/lib/__tests__/oauth.test.js +23 -28
- package/lib/__tests__/parsing.test.js +18 -20
- package/lib/__tests__/polling.test.js +24 -26
- package/lib/__tests__/process.test.js +14 -19
- package/lib/__tests__/projectProfiles.test.js +34 -39
- package/lib/__tests__/sandboxSync.test.js +30 -35
- package/lib/__tests__/sandboxes.test.js +29 -31
- package/lib/__tests__/serverlessLogs.test.js +8 -13
- package/lib/__tests__/usageTracking.test.js +33 -34
- package/lib/__tests__/validation.test.js +18 -20
- package/lib/__tests__/yargsUtils.test.js +17 -41
- package/lib/accountTypes.js +24 -34
- package/lib/app/__tests__/migrate.test.js +117 -109
- package/lib/app/__tests__/migrate_legacy.test.js +29 -31
- package/lib/app/migrate.d.ts +18 -4
- package/lib/app/migrate.js +152 -148
- package/lib/app/migrate_legacy.d.ts +1 -1
- package/lib/app/migrate_legacy.js +72 -78
- package/lib/app/urls.js +5 -9
- package/lib/buildAccount.d.ts +5 -2
- package/lib/buildAccount.js +126 -80
- package/lib/commonOpts.d.ts +1 -1
- package/lib/commonOpts.js +67 -59
- package/lib/configMigrate.js +34 -38
- package/lib/configOptions.d.ts +5 -0
- package/lib/configOptions.js +44 -40
- package/lib/constants.d.ts +8 -0
- package/lib/constants.js +39 -34
- package/lib/customObject.js +2 -6
- package/lib/dependencyManagement.js +37 -45
- package/lib/developerTestAccounts.d.ts +1 -1
- package/lib/developerTestAccounts.js +34 -39
- package/lib/doctor/Diagnosis.d.ts +1 -1
- package/lib/doctor/Diagnosis.js +25 -29
- package/lib/doctor/DiagnosticInfoBuilder.d.ts +1 -1
- package/lib/doctor/DiagnosticInfoBuilder.js +30 -37
- package/lib/doctor/Doctor.d.ts +1 -1
- package/lib/doctor/Doctor.js +94 -101
- package/lib/doctor/__tests__/Diagnosis.test.js +9 -14
- package/lib/doctor/__tests__/DiagnosticInfoBuilder.test.js +29 -34
- package/lib/doctor/__tests__/Doctor.test.js +24 -26
- package/lib/enums/exitCodes.js +1 -4
- package/lib/errorHandlers/index.js +33 -44
- package/lib/errorHandlers/suppressError.d.ts +1 -1
- package/lib/errorHandlers/suppressError.js +28 -31
- package/lib/errors/ProjectValidationError.d.ts +4 -0
- package/lib/errors/ProjectValidationError.js +9 -0
- package/lib/filesystem.js +8 -15
- package/lib/generateSelectors.js +18 -29
- package/lib/hasFeature.d.ts +1 -1
- package/lib/hasFeature.js +3 -6
- package/lib/interpolation.js +11 -18
- package/lib/lang.d.ts +1 -1
- package/lib/lang.js +22 -27
- package/lib/links.js +16 -24
- package/lib/marketplaceValidate.js +29 -39
- package/lib/mcp/setup.d.ts +4 -0
- package/lib/mcp/setup.js +106 -82
- package/lib/middleware/__test__/configMiddleware.test.js +20 -55
- package/lib/middleware/__test__/gitMiddleware.test.js +7 -42
- package/lib/middleware/__test__/notificationsMiddleware.test.js +2 -4
- package/lib/middleware/__test__/requestMiddleware.test.js +6 -11
- package/lib/middleware/__test__/utils.test.js +9 -11
- package/lib/middleware/__test__/yargsChecksMiddleware.test.js +9 -44
- package/lib/middleware/autoUpdateMiddleware.js +33 -40
- package/lib/middleware/configMiddleware.js +36 -42
- package/lib/middleware/fireAlarmMiddleware.js +12 -18
- package/lib/middleware/gitMiddleware.js +5 -8
- package/lib/middleware/notificationsMiddleware.js +16 -23
- package/lib/middleware/requestMiddleware.js +4 -10
- package/lib/middleware/utils.js +1 -4
- package/lib/middleware/yargsChecksMiddleware.js +10 -13
- package/lib/npm.js +14 -23
- package/lib/oauth.js +29 -35
- package/lib/parsing.js +3 -6
- package/lib/polling.js +11 -15
- package/lib/process.js +11 -19
- package/lib/projectProfiles.d.ts +2 -2
- package/lib/projectProfiles.js +32 -42
- package/lib/projects/ProjectLogsManager.js +18 -21
- package/lib/projects/__tests__/AppDevModeInterface.test.js +140 -145
- package/lib/projects/__tests__/LocalDevProcess.test.js +100 -140
- package/lib/projects/__tests__/LocalDevWebsocketServer.test.js +201 -37
- package/lib/projects/__tests__/ProjectLogsManager.test.js +56 -58
- package/lib/projects/__tests__/buildAndDeploy.test.js +7 -9
- package/lib/projects/__tests__/components.test.js +9 -14
- package/lib/projects/__tests__/localDevHelpers.test.js +117 -0
- package/lib/projects/__tests__/projects.test.js +35 -40
- package/lib/projects/__tests__/structure.test.js +43 -81
- package/lib/projects/add/__tests__/legacyAddComponent.test.js +26 -28
- package/lib/projects/add/__tests__/v3AddComponent.test.js +25 -30
- package/lib/projects/add/legacyAddComponent.d.ts +1 -1
- package/lib/projects/add/legacyAddComponent.js +24 -30
- package/lib/projects/add/v3AddComponent.d.ts +1 -1
- package/lib/projects/add/v3AddComponent.js +37 -42
- package/lib/projects/buildAndDeploy.d.ts +1 -1
- package/lib/projects/buildAndDeploy.js +88 -97
- package/lib/projects/components.js +19 -25
- package/lib/projects/config.d.ts +1 -1
- package/lib/projects/config.js +32 -41
- package/lib/projects/create/__tests__/legacy.test.js +22 -57
- package/lib/projects/create/__tests__/v3.test.js +5 -7
- package/lib/projects/create/index.d.ts +3 -3
- package/lib/projects/create/index.js +19 -22
- package/lib/projects/create/legacy.d.ts +1 -1
- package/lib/projects/create/legacy.js +25 -31
- package/lib/projects/create/v3.d.ts +3 -5
- package/lib/projects/create/v3.js +47 -59
- package/lib/projects/ensureProjectExists.js +31 -37
- package/lib/projects/localDev/AppDevModeInterface.d.ts +3 -3
- package/lib/projects/localDev/AppDevModeInterface.js +58 -60
- package/lib/projects/localDev/DevServerManager.d.ts +1 -1
- package/lib/projects/localDev/DevServerManager.js +22 -24
- package/lib/projects/localDev/DevServerManagerV2.d.ts +2 -2
- package/lib/projects/localDev/DevServerManagerV2.js +15 -20
- package/lib/projects/localDev/LocalDevLogger.d.ts +1 -2
- package/lib/projects/localDev/LocalDevLogger.js +66 -66
- package/lib/projects/localDev/LocalDevManager.d.ts +1 -1
- package/lib/projects/localDev/LocalDevManager.js +106 -111
- package/lib/projects/localDev/LocalDevProcess.d.ts +6 -5
- package/lib/projects/localDev/LocalDevProcess.js +37 -50
- package/lib/projects/localDev/LocalDevState.d.ts +5 -7
- package/lib/projects/localDev/LocalDevState.js +9 -11
- package/lib/projects/localDev/LocalDevWatcher.d.ts +1 -1
- package/lib/projects/localDev/LocalDevWatcher.js +6 -11
- package/lib/projects/localDev/LocalDevWebsocketServer.d.ts +3 -3
- package/lib/projects/localDev/LocalDevWebsocketServer.js +63 -55
- package/lib/projects/localDev/helpers.d.ts +10 -3
- package/lib/projects/localDev/helpers.js +211 -174
- package/lib/projects/structure.d.ts +3 -3
- package/lib/projects/structure.js +32 -78
- package/lib/projects/ui.js +10 -13
- package/lib/projects/upload.d.ts +1 -1
- package/lib/projects/upload.js +57 -73
- package/lib/projects/urls.d.ts +1 -1
- package/lib/projects/urls.js +15 -25
- package/lib/projects/watch.d.ts +1 -1
- package/lib/projects/watch.js +48 -54
- package/lib/prompts/__tests__/downloadProjectPrompt.test.js +9 -11
- package/lib/prompts/__tests__/projectsLogsPrompt.test.js +11 -16
- package/lib/prompts/accountNamePrompt.d.ts +1 -1
- package/lib/prompts/accountNamePrompt.js +26 -31
- package/lib/prompts/accountsPrompt.js +12 -15
- package/lib/prompts/cmsFieldPrompt.js +13 -19
- package/lib/prompts/createApiSamplePrompt.d.ts +1 -1
- package/lib/prompts/createApiSamplePrompt.js +9 -12
- package/lib/prompts/createDeveloperTestAccountConfigPrompt.d.ts +1 -1
- package/lib/prompts/createDeveloperTestAccountConfigPrompt.js +23 -26
- package/lib/prompts/createFunctionPrompt.js +17 -20
- package/lib/prompts/createModulePrompt.js +12 -15
- package/lib/prompts/createTemplatePrompt.js +5 -8
- package/lib/prompts/downloadProjectPrompt.js +17 -20
- package/lib/prompts/installAppPrompt.js +19 -26
- package/lib/prompts/personalAccessKeyPrompt.d.ts +2 -2
- package/lib/prompts/personalAccessKeyPrompt.js +40 -47
- package/lib/prompts/previewPrompt.js +15 -22
- package/lib/prompts/projectAddPrompt.d.ts +1 -1
- package/lib/prompts/projectAddPrompt.js +14 -18
- package/lib/prompts/projectDevTargetAccountPrompt.d.ts +1 -1
- package/lib/prompts/projectDevTargetAccountPrompt.js +48 -54
- package/lib/prompts/projectNameAndDestPrompt.d.ts +1 -1
- package/lib/prompts/projectNameAndDestPrompt.js +22 -29
- package/lib/prompts/projectNamePrompt.js +11 -14
- package/lib/prompts/projectsLogsPrompt.js +5 -8
- package/lib/prompts/promptUtils.d.ts +1 -1
- package/lib/prompts/promptUtils.js +17 -24
- package/lib/prompts/sandboxesPrompt.d.ts +1 -1
- package/lib/prompts/sandboxesPrompt.js +26 -30
- package/lib/prompts/secretPrompt.js +10 -15
- package/lib/prompts/selectAppPrompt.js +11 -14
- package/lib/prompts/selectHubDBTablePrompt.js +24 -30
- package/lib/prompts/selectProjectTemplatePrompt.d.ts +1 -1
- package/lib/prompts/selectProjectTemplatePrompt.js +10 -13
- package/lib/prompts/selectPublicAppForMigrationPrompt.js +22 -25
- package/lib/prompts/setAsDefaultAccountPrompt.js +13 -16
- package/lib/prompts/uploadPrompt.js +11 -17
- package/lib/sandboxSync.d.ts +1 -1
- package/lib/sandboxSync.js +58 -65
- package/lib/sandboxes.d.ts +5 -1
- package/lib/sandboxes.js +72 -76
- package/lib/schema.js +13 -20
- package/lib/serverlessLogs.js +45 -52
- package/lib/testUtils.js +4 -8
- package/lib/ui/SpinniesManager.d.ts +1 -1
- package/lib/ui/SpinniesManager.js +29 -34
- package/lib/ui/boxen.js +11 -14
- package/lib/ui/git.js +14 -20
- package/lib/ui/index.d.ts +6 -0
- package/lib/ui/index.js +56 -76
- package/lib/ui/logger.js +10 -13
- package/lib/ui/serverlessFunctionLogs.js +14 -20
- package/lib/ui/spinniesUtils.js +24 -39
- package/lib/ui/supportHyperlinks.js +3 -6
- package/lib/ui/supportsColor.js +11 -17
- package/lib/ui/table.js +6 -13
- package/lib/upload.js +15 -21
- package/lib/usageTracking.js +35 -44
- package/lib/utils/__tests__/isDeepEqual.test.js +269 -0
- package/lib/utils/hasFlag.js +2 -8
- package/lib/utils/isDeepEqual.d.ts +1 -0
- package/lib/utils/isDeepEqual.js +31 -0
- package/lib/validation.js +48 -87
- package/lib/yargsUtils.d.ts +2 -1
- package/lib/yargsUtils.js +19 -16
- package/mcp-server/server.js +6 -8
- package/mcp-server/tools/index.js +15 -16
- package/mcp-server/tools/project/{AddFeatureToProject.d.ts → AddFeatureToProjectTool.d.ts} +5 -5
- package/mcp-server/tools/project/AddFeatureToProjectTool.js +76 -0
- package/mcp-server/tools/project/CreateProjectTool.d.ts +4 -4
- package/mcp-server/tools/project/CreateProjectTool.js +40 -54
- package/mcp-server/tools/project/{DeployProject.d.ts → DeployProjectTool.d.ts} +2 -2
- package/mcp-server/tools/project/DeployProjectTool.js +49 -0
- package/mcp-server/tools/project/GetConfigValuesTool.d.ts +20 -0
- package/mcp-server/tools/project/GetConfigValuesTool.js +51 -0
- package/mcp-server/tools/project/GuidedWalkthroughTool.d.ts +1 -1
- package/mcp-server/tools/project/GuidedWalkthroughTool.js +21 -25
- package/mcp-server/tools/project/UploadProjectTools.d.ts +1 -1
- package/mcp-server/tools/project/UploadProjectTools.js +12 -19
- package/mcp-server/tools/project/ValidateProjectTool.d.ts +1 -1
- package/mcp-server/tools/project/ValidateProjectTool.js +13 -17
- package/mcp-server/tools/project/__tests__/AddFeatureToProjectTool.test.d.ts +1 -0
- package/mcp-server/tools/project/__tests__/{AddFeatureToProject.test.js → AddFeatureToProjectTool.test.js} +15 -17
- package/mcp-server/tools/project/__tests__/CreateProjectTool.test.js +12 -15
- package/mcp-server/tools/project/__tests__/DeployProjectTool.test.d.ts +1 -0
- package/mcp-server/tools/project/__tests__/{DeployProject.test.js → DeployProjectTool.test.js} +6 -8
- package/mcp-server/tools/project/__tests__/GetConfigValuesTool.test.d.ts +1 -0
- package/mcp-server/tools/project/__tests__/GetConfigValuesTool.test.js +198 -0
- package/mcp-server/tools/project/__tests__/GuidedWalkthroughTool.test.js +4 -6
- package/mcp-server/tools/project/__tests__/UploadProjectTools.test.js +4 -6
- package/mcp-server/tools/project/__tests__/ValidateProjectTool.test.js +4 -6
- package/mcp-server/tools/project/constants.d.ts +1 -0
- package/mcp-server/tools/project/constants.js +14 -9
- package/mcp-server/types.js +1 -5
- package/mcp-server/utils/__tests__/command.test.js +9 -11
- package/mcp-server/utils/__tests__/project.test.js +12 -17
- package/mcp-server/utils/command.d.ts +1 -1
- package/mcp-server/utils/command.js +4 -11
- package/mcp-server/utils/content.d.ts +1 -1
- package/mcp-server/utils/content.js +2 -6
- package/mcp-server/utils/project.js +8 -14
- package/mcp-server/utils/toolUsageTracking.js +11 -14
- package/package.json +21 -14
- package/types/Cms.d.ts +1 -1
- package/types/Cms.js +1 -2
- package/types/LocalDev.d.ts +4 -6
- package/types/LocalDev.js +1 -2
- package/types/ProjectComponents.d.ts +2 -2
- package/types/ProjectComponents.js +1 -2
- package/types/Projects.d.ts +1 -1
- package/types/Projects.js +2 -5
- package/types/Prompts.js +1 -2
- package/types/Sandboxes.js +1 -2
- package/types/Yargs.js +1 -2
- package/ui/index.d.ts +1 -0
- package/ui/index.js +6 -0
- package/mcp-server/tools/project/AddFeatureToProject.js +0 -88
- package/mcp-server/tools/project/DeployProject.js +0 -53
- /package/{mcp-server/tools/project/__tests__/AddFeatureToProject.test.d.ts → lib/projects/__tests__/localDevHelpers.test.d.ts} +0 -0
- /package/{mcp-server/tools/project/__tests__/DeployProject.test.d.ts → lib/utils/__tests__/isDeepEqual.test.d.ts} +0 -0
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
import fs from 'fs-extra';
|
|
2
|
+
import os from 'os';
|
|
3
|
+
import { vi, describe, it, expect, beforeEach, afterEach } from 'vitest';
|
|
4
|
+
import { downloadProject } from '@hubspot/local-dev-lib/api/projects';
|
|
5
|
+
import { extractZipArchive } from '@hubspot/local-dev-lib/archive';
|
|
6
|
+
import { translate } from '@hubspot/project-parsing-lib';
|
|
7
|
+
import { isDeployedProjectUpToDateWithLocal } from '../localDev/helpers.js';
|
|
8
|
+
import { isDeepEqual } from '../../utils/isDeepEqual.js';
|
|
9
|
+
// Mock all external dependencies
|
|
10
|
+
vi.mock('@hubspot/local-dev-lib/api/projects');
|
|
11
|
+
vi.mock('@hubspot/local-dev-lib/archive');
|
|
12
|
+
vi.mock('@hubspot/project-parsing-lib');
|
|
13
|
+
vi.mock('fs-extra');
|
|
14
|
+
vi.mock('os');
|
|
15
|
+
vi.mock('../../utils/isDeepEqual.js');
|
|
16
|
+
describe('isDeployedProjectUpToDateWithLocal', () => {
|
|
17
|
+
const mockProjectName = 'test-project';
|
|
18
|
+
const mockAccountId = 123456;
|
|
19
|
+
const mockBuildId = 789;
|
|
20
|
+
const mockProjectConfig = {
|
|
21
|
+
name: mockProjectName,
|
|
22
|
+
srcDir: 'src',
|
|
23
|
+
platformVersion: '1.0.0',
|
|
24
|
+
};
|
|
25
|
+
const mockLocalNode = {
|
|
26
|
+
uid: 'component1',
|
|
27
|
+
componentType: 'APP',
|
|
28
|
+
localDev: {
|
|
29
|
+
componentRoot: '/local/path',
|
|
30
|
+
componentConfigPath: '/local/path/config.json',
|
|
31
|
+
configUpdatedSinceLastUpload: false,
|
|
32
|
+
},
|
|
33
|
+
componentDeps: {},
|
|
34
|
+
metaFilePath: '/local/path',
|
|
35
|
+
config: { name: 'Component 1' },
|
|
36
|
+
files: [],
|
|
37
|
+
};
|
|
38
|
+
const mockLocalProjectNodes = {
|
|
39
|
+
component1: mockLocalNode,
|
|
40
|
+
};
|
|
41
|
+
const mockTempDir = '/tmp/test-temp-dir';
|
|
42
|
+
const mockZippedProject = Buffer.from('fake-zip-data');
|
|
43
|
+
beforeEach(() => {
|
|
44
|
+
vi.clearAllMocks();
|
|
45
|
+
// Mock fs.mkdtemp
|
|
46
|
+
fs.mkdtemp.mockResolvedValue(mockTempDir);
|
|
47
|
+
// Mock fs.pathExists
|
|
48
|
+
fs.pathExists.mockResolvedValue(true);
|
|
49
|
+
// Mock fs.remove
|
|
50
|
+
fs.remove.mockResolvedValue(undefined);
|
|
51
|
+
// Mock os.tmpdir
|
|
52
|
+
os.tmpdir.mockReturnValue('/tmp');
|
|
53
|
+
});
|
|
54
|
+
afterEach(() => {
|
|
55
|
+
vi.restoreAllMocks();
|
|
56
|
+
});
|
|
57
|
+
describe('when projects are identical', () => {
|
|
58
|
+
it('should return true for identical projects', async () => {
|
|
59
|
+
// Mock downloadProject
|
|
60
|
+
downloadProject.mockResolvedValue({
|
|
61
|
+
data: mockZippedProject,
|
|
62
|
+
});
|
|
63
|
+
// Mock extractZipArchive
|
|
64
|
+
extractZipArchive.mockResolvedValue(undefined);
|
|
65
|
+
// Mock translate to return identical nodes
|
|
66
|
+
translate.mockResolvedValue({
|
|
67
|
+
intermediateNodesIndexedByUid: mockLocalProjectNodes,
|
|
68
|
+
});
|
|
69
|
+
// Mock isDeepEqual to return true for identical projects
|
|
70
|
+
isDeepEqual.mockReturnValue(true);
|
|
71
|
+
const result = await isDeployedProjectUpToDateWithLocal(mockProjectConfig, mockAccountId, mockBuildId, mockLocalProjectNodes);
|
|
72
|
+
expect(result).toBe(true);
|
|
73
|
+
expect(isDeepEqual).toHaveBeenCalledWith(mockLocalProjectNodes, mockLocalProjectNodes, ['localDev']);
|
|
74
|
+
expect(fs.remove).toHaveBeenCalledWith(mockTempDir);
|
|
75
|
+
});
|
|
76
|
+
});
|
|
77
|
+
describe('when projects are different', () => {
|
|
78
|
+
it('should return false for different projects', async () => {
|
|
79
|
+
// Mock downloadProject
|
|
80
|
+
downloadProject.mockResolvedValue({
|
|
81
|
+
data: mockZippedProject,
|
|
82
|
+
});
|
|
83
|
+
// Mock extractZipArchive
|
|
84
|
+
extractZipArchive.mockResolvedValue(undefined);
|
|
85
|
+
// Mock translate to return different nodes
|
|
86
|
+
const differentDeployedNodes = {};
|
|
87
|
+
translate.mockResolvedValue({
|
|
88
|
+
intermediateNodesIndexedByUid: differentDeployedNodes,
|
|
89
|
+
});
|
|
90
|
+
// Mock isDeepEqual to return false for different projects
|
|
91
|
+
isDeepEqual.mockReturnValue(false);
|
|
92
|
+
const result = await isDeployedProjectUpToDateWithLocal(mockProjectConfig, mockAccountId, mockBuildId, mockLocalProjectNodes);
|
|
93
|
+
expect(result).toBe(false);
|
|
94
|
+
expect(isDeepEqual).toHaveBeenCalledWith(mockLocalProjectNodes, differentDeployedNodes, ['localDev']);
|
|
95
|
+
});
|
|
96
|
+
});
|
|
97
|
+
describe('error handling', () => {
|
|
98
|
+
it('should clean up temp directory even when errors occur', async () => {
|
|
99
|
+
// Mock downloadProject to throw an error after temp dir is created
|
|
100
|
+
downloadProject.mockRejectedValue(new Error('Download Error'));
|
|
101
|
+
await expect(isDeployedProjectUpToDateWithLocal(mockProjectConfig, mockAccountId, mockBuildId, mockLocalProjectNodes)).rejects.toThrow('Download Error');
|
|
102
|
+
expect(fs.remove).toHaveBeenCalledWith(mockTempDir);
|
|
103
|
+
});
|
|
104
|
+
it('should handle translateForLocalDev errors', async () => {
|
|
105
|
+
// Mock downloadProject
|
|
106
|
+
downloadProject.mockResolvedValue({
|
|
107
|
+
data: mockZippedProject,
|
|
108
|
+
});
|
|
109
|
+
// Mock extractZipArchive
|
|
110
|
+
extractZipArchive.mockResolvedValue(undefined);
|
|
111
|
+
// Mock translate to throw an error
|
|
112
|
+
translate.mockRejectedValue(new Error('Translation Error'));
|
|
113
|
+
await expect(isDeployedProjectUpToDateWithLocal(mockProjectConfig, mockAccountId, mockBuildId, mockLocalProjectNodes)).rejects.toThrow('Translation Error');
|
|
114
|
+
expect(fs.remove).toHaveBeenCalledWith(mockTempDir);
|
|
115
|
+
});
|
|
116
|
+
});
|
|
117
|
+
});
|
|
@@ -1,22 +1,17 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
};
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
const os_1 = __importDefault(require("os"));
|
|
8
|
-
const path_1 = __importDefault(require("path"));
|
|
9
|
-
const exitCodes_1 = require("../../enums/exitCodes");
|
|
10
|
-
const config_1 = require("../../projects/config");
|
|
11
|
-
const logger_1 = require("@hubspot/local-dev-lib/logger");
|
|
1
|
+
import fs from 'fs';
|
|
2
|
+
import os from 'os';
|
|
3
|
+
import path from 'path';
|
|
4
|
+
import { EXIT_CODES } from '../../enums/exitCodes.js';
|
|
5
|
+
import { validateProjectConfig } from '../../projects/config.js';
|
|
6
|
+
import { logger } from '@hubspot/local-dev-lib/logger';
|
|
12
7
|
vi.mock('@hubspot/local-dev-lib/logger');
|
|
13
8
|
describe('lib/projects', () => {
|
|
14
9
|
describe('validateProjectConfig()', () => {
|
|
15
10
|
let projectDir;
|
|
16
11
|
let exitMock;
|
|
17
12
|
beforeAll(() => {
|
|
18
|
-
projectDir =
|
|
19
|
-
|
|
13
|
+
projectDir = fs.mkdtempSync(path.join(os.tmpdir(), 'projects-'));
|
|
14
|
+
fs.mkdirSync(path.join(projectDir, 'src'));
|
|
20
15
|
});
|
|
21
16
|
beforeEach(() => {
|
|
22
17
|
// @ts-expect-error - Mocking process.exit
|
|
@@ -29,60 +24,60 @@ describe('lib/projects', () => {
|
|
|
29
24
|
});
|
|
30
25
|
it('rejects undefined configuration', () => {
|
|
31
26
|
// @ts-ignore Testing invalid input
|
|
32
|
-
|
|
33
|
-
expect(exitMock).toHaveBeenCalledWith(
|
|
34
|
-
expect(
|
|
27
|
+
validateProjectConfig(null, projectDir);
|
|
28
|
+
expect(exitMock).toHaveBeenCalledWith(EXIT_CODES.ERROR);
|
|
29
|
+
expect(logger.error).toHaveBeenCalledWith(expect.stringMatching(/.*Unable to locate a project configuration file. Try running again from a project directory, or run*/));
|
|
35
30
|
});
|
|
36
31
|
it('rejects configuration with missing name', () => {
|
|
37
32
|
// @ts-ignore Testing invalid input
|
|
38
|
-
|
|
39
|
-
expect(exitMock).toHaveBeenCalledWith(
|
|
40
|
-
expect(
|
|
33
|
+
validateProjectConfig({ srcDir: '.' }, projectDir);
|
|
34
|
+
expect(exitMock).toHaveBeenCalledWith(EXIT_CODES.ERROR);
|
|
35
|
+
expect(logger.error).toHaveBeenCalledWith(expect.stringMatching(/.*missing required fields*/));
|
|
41
36
|
});
|
|
42
37
|
it('rejects configuration with missing srcDir', () => {
|
|
43
38
|
// @ts-ignore Testing invalid input
|
|
44
|
-
|
|
45
|
-
expect(exitMock).toHaveBeenCalledWith(
|
|
46
|
-
expect(
|
|
39
|
+
validateProjectConfig({ name: 'hello' }, projectDir);
|
|
40
|
+
expect(exitMock).toHaveBeenCalledWith(EXIT_CODES.ERROR);
|
|
41
|
+
expect(logger.error).toHaveBeenCalledWith(expect.stringMatching(/.*missing required fields.*/));
|
|
47
42
|
});
|
|
48
43
|
describe('rejects configuration with srcDir outside project directory', () => {
|
|
49
44
|
it('for parent directory', () => {
|
|
50
|
-
|
|
51
|
-
expect(exitMock).toHaveBeenCalledWith(
|
|
52
|
-
expect(
|
|
45
|
+
validateProjectConfig({ name: 'hello', srcDir: '..', platformVersion: '' }, projectDir);
|
|
46
|
+
expect(exitMock).toHaveBeenCalledWith(EXIT_CODES.ERROR);
|
|
47
|
+
expect(logger.error).toHaveBeenCalledWith(expect.stringContaining('srcDir: ".."'));
|
|
53
48
|
});
|
|
54
49
|
it('for root directory', () => {
|
|
55
|
-
|
|
56
|
-
expect(exitMock).toHaveBeenCalledWith(
|
|
57
|
-
expect(
|
|
50
|
+
validateProjectConfig({ name: 'hello', srcDir: '/', platformVersion: '' }, projectDir);
|
|
51
|
+
expect(exitMock).toHaveBeenCalledWith(EXIT_CODES.ERROR);
|
|
52
|
+
expect(logger.error).toHaveBeenCalledWith(expect.stringContaining('srcDir: "/"'));
|
|
58
53
|
});
|
|
59
54
|
it('for complicated directory', () => {
|
|
60
55
|
const srcDir = './src/././../src/../../src';
|
|
61
|
-
|
|
62
|
-
expect(exitMock).toHaveBeenCalledWith(
|
|
63
|
-
expect(
|
|
56
|
+
validateProjectConfig({ name: 'hello', srcDir, platformVersion: '' }, projectDir);
|
|
57
|
+
expect(exitMock).toHaveBeenCalledWith(EXIT_CODES.ERROR);
|
|
58
|
+
expect(logger.error).toHaveBeenCalledWith(expect.stringContaining(`srcDir: "${srcDir}"`));
|
|
64
59
|
});
|
|
65
60
|
});
|
|
66
61
|
it('rejects configuration with srcDir that does not exist', () => {
|
|
67
|
-
|
|
68
|
-
expect(exitMock).toHaveBeenCalledWith(
|
|
69
|
-
expect(
|
|
62
|
+
validateProjectConfig({ name: 'hello', srcDir: 'foo', platformVersion: '' }, projectDir);
|
|
63
|
+
expect(exitMock).toHaveBeenCalledWith(EXIT_CODES.ERROR);
|
|
64
|
+
expect(logger.error).toHaveBeenCalledWith(expect.stringMatching(/.*could not be found in.*/));
|
|
70
65
|
});
|
|
71
66
|
describe('accepts configuration with valid srcDir', () => {
|
|
72
67
|
it('for current directory', () => {
|
|
73
|
-
|
|
68
|
+
validateProjectConfig({ name: 'hello', srcDir: '.', platformVersion: '' }, projectDir);
|
|
74
69
|
expect(exitMock).not.toHaveBeenCalled();
|
|
75
|
-
expect(
|
|
70
|
+
expect(logger.error).not.toHaveBeenCalled();
|
|
76
71
|
});
|
|
77
72
|
it('for relative directory', () => {
|
|
78
|
-
|
|
73
|
+
validateProjectConfig({ name: 'hello', srcDir: './src', platformVersion: '' }, projectDir);
|
|
79
74
|
expect(exitMock).not.toHaveBeenCalled();
|
|
80
|
-
expect(
|
|
75
|
+
expect(logger.error).not.toHaveBeenCalled();
|
|
81
76
|
});
|
|
82
77
|
it('for implied relative directory', () => {
|
|
83
|
-
|
|
78
|
+
validateProjectConfig({ name: 'hello', srcDir: 'src', platformVersion: '' }, projectDir);
|
|
84
79
|
expect(exitMock).not.toHaveBeenCalled();
|
|
85
|
-
expect(
|
|
80
|
+
expect(logger.error).not.toHaveBeenCalled();
|
|
86
81
|
});
|
|
87
82
|
});
|
|
88
83
|
});
|
|
@@ -1,50 +1,12 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
-
}
|
|
8
|
-
Object.defineProperty(o, k2, desc);
|
|
9
|
-
}) : (function(o, m, k, k2) {
|
|
10
|
-
if (k2 === undefined) k2 = k;
|
|
11
|
-
o[k2] = m[k];
|
|
12
|
-
}));
|
|
13
|
-
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
-
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
-
}) : function(o, v) {
|
|
16
|
-
o["default"] = v;
|
|
17
|
-
});
|
|
18
|
-
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
-
var ownKeys = function(o) {
|
|
20
|
-
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
-
var ar = [];
|
|
22
|
-
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
-
return ar;
|
|
24
|
-
};
|
|
25
|
-
return ownKeys(o);
|
|
26
|
-
};
|
|
27
|
-
return function (mod) {
|
|
28
|
-
if (mod && mod.__esModule) return mod;
|
|
29
|
-
var result = {};
|
|
30
|
-
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
-
__setModuleDefault(result, mod);
|
|
32
|
-
return result;
|
|
33
|
-
};
|
|
34
|
-
})();
|
|
35
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
36
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
37
|
-
};
|
|
38
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
|
-
const fs_1 = __importDefault(require("fs"));
|
|
40
|
-
const HSfs = __importStar(require("@hubspot/local-dev-lib/fs"));
|
|
41
|
-
const logger_1 = require("@hubspot/local-dev-lib/logger");
|
|
42
|
-
const structure_1 = require("../structure");
|
|
43
|
-
const Projects_1 = require("../../../types/Projects");
|
|
1
|
+
import fs from 'fs';
|
|
2
|
+
import * as HSfs from '@hubspot/local-dev-lib/fs';
|
|
3
|
+
import { logger } from '@hubspot/local-dev-lib/logger';
|
|
4
|
+
import { getComponentTypeFromConfigFile, loadConfigFile, getAppCardConfigs, getIsLegacyApp, componentIsApp, findProjectComponents, getProjectComponentTypes, getComponentUid, componentIsPublicApp, } from '../structure.js';
|
|
5
|
+
import { ComponentTypes } from '../../../types/Projects.js';
|
|
44
6
|
vi.mock('fs');
|
|
45
7
|
vi.mock('@hubspot/local-dev-lib/fs');
|
|
46
8
|
vi.mock('@hubspot/local-dev-lib/logger');
|
|
47
|
-
const mockedReadFileSync =
|
|
9
|
+
const mockedReadFileSync = fs.readFileSync;
|
|
48
10
|
const mockedWalk = HSfs.walk;
|
|
49
11
|
const getMockPrivateAppConfig = (cards = []) => ({
|
|
50
12
|
name: 'test-app',
|
|
@@ -61,43 +23,43 @@ const getMockPrivateAppConfig = (cards = []) => ({
|
|
|
61
23
|
describe('lib/projects/structure', () => {
|
|
62
24
|
describe('getComponentTypeFromConfigFile()', () => {
|
|
63
25
|
it('returns correct type for public app config', () => {
|
|
64
|
-
expect(
|
|
26
|
+
expect(getComponentTypeFromConfigFile('public-app.json')).toBe(ComponentTypes.PublicApp);
|
|
65
27
|
});
|
|
66
28
|
it('returns correct type for private app config', () => {
|
|
67
|
-
expect(
|
|
29
|
+
expect(getComponentTypeFromConfigFile('app.json')).toBe(ComponentTypes.PrivateApp);
|
|
68
30
|
});
|
|
69
31
|
it('returns correct type for theme config', () => {
|
|
70
|
-
expect(
|
|
32
|
+
expect(getComponentTypeFromConfigFile('theme.json')).toBe(ComponentTypes.HublTheme);
|
|
71
33
|
});
|
|
72
34
|
it('returns null for unknown config file', () => {
|
|
73
|
-
expect(
|
|
35
|
+
expect(getComponentTypeFromConfigFile('unknown.json')).toBeNull();
|
|
74
36
|
});
|
|
75
37
|
});
|
|
76
38
|
describe('loadConfigFile()', () => {
|
|
77
39
|
it('returns parsed JSON when file exists', () => {
|
|
78
40
|
const mockConfig = { name: 'test-app' };
|
|
79
41
|
mockedReadFileSync.mockReturnValue(JSON.stringify(mockConfig));
|
|
80
|
-
expect(
|
|
42
|
+
expect(loadConfigFile('test/path/app.json')).toEqual(mockConfig);
|
|
81
43
|
});
|
|
82
44
|
it('returns null when file read fails', () => {
|
|
83
45
|
mockedReadFileSync.mockImplementation(() => {
|
|
84
46
|
throw new Error('File not found');
|
|
85
47
|
});
|
|
86
|
-
expect(
|
|
87
|
-
expect(
|
|
48
|
+
expect(loadConfigFile('nonexistent/path/app.json')).toBeNull();
|
|
49
|
+
expect(logger.debug).toHaveBeenCalled();
|
|
88
50
|
});
|
|
89
51
|
});
|
|
90
52
|
describe('getAppCardConfigs()', () => {
|
|
91
53
|
const mockAppPath = '/test/path';
|
|
92
54
|
it('returns empty array when no cards exist', () => {
|
|
93
55
|
const appConfig = getMockPrivateAppConfig();
|
|
94
|
-
expect(
|
|
56
|
+
expect(getAppCardConfigs(appConfig, mockAppPath)).toEqual([]);
|
|
95
57
|
});
|
|
96
58
|
it('returns array of card configs when valid cards exist', () => {
|
|
97
59
|
const mockCardConfig = { type: 'crm-card' };
|
|
98
60
|
mockedReadFileSync.mockReturnValue(JSON.stringify(mockCardConfig));
|
|
99
61
|
const appConfig = getMockPrivateAppConfig([{ file: 'card.json' }]);
|
|
100
|
-
expect(
|
|
62
|
+
expect(getAppCardConfigs(appConfig, mockAppPath)).toEqual([
|
|
101
63
|
mockCardConfig,
|
|
102
64
|
]);
|
|
103
65
|
});
|
|
@@ -108,11 +70,11 @@ describe('lib/projects/structure', () => {
|
|
|
108
70
|
const cardConfig = { type: 'crm-card' };
|
|
109
71
|
const appConfig = getMockPrivateAppConfig([{ file: 'card.json' }]);
|
|
110
72
|
mockedReadFileSync.mockReturnValue(JSON.stringify(cardConfig));
|
|
111
|
-
expect(
|
|
73
|
+
expect(getIsLegacyApp(appConfig, mockAppPath)).toBe(true);
|
|
112
74
|
});
|
|
113
75
|
it('returns false when the app has no cards', () => {
|
|
114
76
|
const appConfig = getMockPrivateAppConfig();
|
|
115
|
-
expect(
|
|
77
|
+
expect(getIsLegacyApp(appConfig, mockAppPath)).toBe(false);
|
|
116
78
|
});
|
|
117
79
|
it('returns false for non-legacy app', () => {
|
|
118
80
|
const cardConfig = {
|
|
@@ -120,20 +82,20 @@ describe('lib/projects/structure', () => {
|
|
|
120
82
|
};
|
|
121
83
|
const appConfig = getMockPrivateAppConfig([{ file: 'card.json' }]);
|
|
122
84
|
mockedReadFileSync.mockReturnValue(JSON.stringify(cardConfig));
|
|
123
|
-
expect(
|
|
85
|
+
expect(getIsLegacyApp(appConfig, mockAppPath)).toBe(false);
|
|
124
86
|
});
|
|
125
87
|
});
|
|
126
88
|
describe('findProjectComponents()', () => {
|
|
127
89
|
it('returns an empty array of components when no components are found', async () => {
|
|
128
90
|
mockedWalk.mockReturnValue([]);
|
|
129
|
-
const components = await
|
|
91
|
+
const components = await findProjectComponents('');
|
|
130
92
|
expect(components).toEqual([]);
|
|
131
93
|
});
|
|
132
94
|
it('returns an array of components when components are found', async () => {
|
|
133
95
|
const cardConfig = { type: 'crm-card' };
|
|
134
96
|
const appConfig = getMockPrivateAppConfig();
|
|
135
97
|
const component = {
|
|
136
|
-
type:
|
|
98
|
+
type: ComponentTypes.PrivateApp,
|
|
137
99
|
config: appConfig,
|
|
138
100
|
runnable: true,
|
|
139
101
|
path: '',
|
|
@@ -142,108 +104,108 @@ describe('lib/projects/structure', () => {
|
|
|
142
104
|
mockedReadFileSync
|
|
143
105
|
.mockReturnValueOnce(JSON.stringify(appConfig))
|
|
144
106
|
.mockReturnValueOnce(JSON.stringify(cardConfig));
|
|
145
|
-
const components = await
|
|
107
|
+
const components = await findProjectComponents('');
|
|
146
108
|
expect(components).toEqual([component]);
|
|
147
109
|
});
|
|
148
110
|
});
|
|
149
111
|
describe('getProjectComponentTypes()', () => {
|
|
150
112
|
it('returns the correct component types', () => {
|
|
151
113
|
const component = {
|
|
152
|
-
type:
|
|
114
|
+
type: ComponentTypes.PrivateApp,
|
|
153
115
|
config: getMockPrivateAppConfig(),
|
|
154
116
|
runnable: true,
|
|
155
117
|
path: 'test/path',
|
|
156
118
|
};
|
|
157
119
|
const components = [component];
|
|
158
|
-
expect(
|
|
159
|
-
[
|
|
120
|
+
expect(getProjectComponentTypes(components)).toEqual({
|
|
121
|
+
[ComponentTypes.PrivateApp]: true,
|
|
160
122
|
});
|
|
161
123
|
});
|
|
162
124
|
it('returns the correct component types for multiple components', () => {
|
|
163
125
|
const component1 = {
|
|
164
|
-
type:
|
|
126
|
+
type: ComponentTypes.PrivateApp,
|
|
165
127
|
config: getMockPrivateAppConfig(),
|
|
166
128
|
runnable: true,
|
|
167
129
|
path: 'test/path',
|
|
168
130
|
};
|
|
169
131
|
const component2 = {
|
|
170
|
-
type:
|
|
132
|
+
type: ComponentTypes.PublicApp,
|
|
171
133
|
// Config doesn't matter for this test so we can use a private app config
|
|
172
134
|
config: getMockPrivateAppConfig(),
|
|
173
135
|
runnable: true,
|
|
174
136
|
path: 'test/path',
|
|
175
137
|
};
|
|
176
138
|
const components = [component1, component2];
|
|
177
|
-
expect(
|
|
178
|
-
[
|
|
179
|
-
[
|
|
139
|
+
expect(getProjectComponentTypes(components)).toEqual({
|
|
140
|
+
[ComponentTypes.PrivateApp]: true,
|
|
141
|
+
[ComponentTypes.PublicApp]: true,
|
|
180
142
|
});
|
|
181
143
|
});
|
|
182
144
|
it('returns an empty object when no components are provided', () => {
|
|
183
145
|
const components = [];
|
|
184
|
-
expect(
|
|
146
|
+
expect(getProjectComponentTypes(components)).toEqual({});
|
|
185
147
|
});
|
|
186
148
|
});
|
|
187
149
|
describe('getComponentUid()', () => {
|
|
188
150
|
it('returns uid from the component config', () => {
|
|
189
151
|
const component = {
|
|
190
|
-
type:
|
|
152
|
+
type: ComponentTypes.PrivateApp,
|
|
191
153
|
config: getMockPrivateAppConfig(),
|
|
192
154
|
runnable: true,
|
|
193
155
|
path: 'test/path',
|
|
194
156
|
};
|
|
195
|
-
expect(
|
|
157
|
+
expect(getComponentUid(component)).toBe(component.config.uid);
|
|
196
158
|
});
|
|
197
159
|
it('returns null for null input', () => {
|
|
198
|
-
expect(
|
|
160
|
+
expect(getComponentUid(null)).toBeNull();
|
|
199
161
|
});
|
|
200
162
|
});
|
|
201
163
|
describe('componentIsApp()', () => {
|
|
202
164
|
it('returns true for public app component', () => {
|
|
203
165
|
const component = {
|
|
204
|
-
type:
|
|
166
|
+
type: ComponentTypes.PublicApp,
|
|
205
167
|
// Config doesn't matter for this test so we can use a private app config
|
|
206
168
|
config: getMockPrivateAppConfig(),
|
|
207
169
|
runnable: true,
|
|
208
170
|
path: 'test/path',
|
|
209
171
|
};
|
|
210
|
-
expect(
|
|
172
|
+
expect(componentIsApp(component)).toBe(true);
|
|
211
173
|
});
|
|
212
174
|
it('returns true for private app component', () => {
|
|
213
175
|
const component = {
|
|
214
|
-
type:
|
|
176
|
+
type: ComponentTypes.PrivateApp,
|
|
215
177
|
config: getMockPrivateAppConfig(),
|
|
216
178
|
runnable: true,
|
|
217
179
|
path: 'test/path',
|
|
218
180
|
};
|
|
219
|
-
expect(
|
|
181
|
+
expect(componentIsApp(component)).toBe(true);
|
|
220
182
|
});
|
|
221
183
|
it('returns false for null input', () => {
|
|
222
|
-
expect(
|
|
184
|
+
expect(componentIsApp(null)).toBe(false);
|
|
223
185
|
});
|
|
224
186
|
});
|
|
225
187
|
describe('componentIsPublicApp()', () => {
|
|
226
188
|
it('returns true for public app component', () => {
|
|
227
189
|
const component = {
|
|
228
|
-
type:
|
|
190
|
+
type: ComponentTypes.PublicApp,
|
|
229
191
|
// Config doesn't matter for this test so we can use a private app config
|
|
230
192
|
config: getMockPrivateAppConfig(),
|
|
231
193
|
runnable: true,
|
|
232
194
|
path: 'test/path',
|
|
233
195
|
};
|
|
234
|
-
expect(
|
|
196
|
+
expect(componentIsPublicApp(component)).toBe(true);
|
|
235
197
|
});
|
|
236
198
|
it('returns false for private app component', () => {
|
|
237
199
|
const component = {
|
|
238
|
-
type:
|
|
200
|
+
type: ComponentTypes.PrivateApp,
|
|
239
201
|
config: getMockPrivateAppConfig(),
|
|
240
202
|
runnable: true,
|
|
241
203
|
path: 'test/path',
|
|
242
204
|
};
|
|
243
|
-
expect(
|
|
205
|
+
expect(componentIsPublicApp(component)).toBe(false);
|
|
244
206
|
});
|
|
245
207
|
it('returns false for null input', () => {
|
|
246
|
-
expect(
|
|
208
|
+
expect(componentIsPublicApp(null)).toBe(false);
|
|
247
209
|
});
|
|
248
210
|
});
|
|
249
211
|
});
|