@strapi/cloud-cli 5.40.0 → 5.41.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/dist/create-project/action.d.ts.map +1 -1
- package/dist/create-project/action.js +1 -1
- package/dist/create-project/action.js.map +1 -1
- package/dist/create-project/action.mjs +1 -1
- package/dist/create-project/action.mjs.map +1 -1
- package/dist/create-project/utils/project-questions.utils.d.ts +1 -1
- package/dist/create-project/utils/project-questions.utils.d.ts.map +1 -1
- package/dist/create-project/utils/project-questions.utils.js.map +1 -1
- package/dist/create-project/utils/project-questions.utils.mjs.map +1 -1
- package/dist/deploy-project/action.d.ts.map +1 -1
- package/dist/deploy-project/action.js +2 -1
- package/dist/deploy-project/action.js.map +1 -1
- package/dist/deploy-project/action.mjs +2 -1
- package/dist/deploy-project/action.mjs.map +1 -1
- package/dist/environment/link/action.js +1 -1
- package/dist/environment/link/action.js.map +1 -1
- package/dist/environment/link/action.mjs +1 -1
- package/dist/environment/link/action.mjs.map +1 -1
- package/dist/link/action.d.ts.map +1 -1
- package/dist/link/action.js +3 -1
- package/dist/link/action.js.map +1 -1
- package/dist/link/action.mjs +3 -1
- package/dist/link/action.mjs.map +1 -1
- package/dist/login/action.d.ts.map +1 -1
- package/dist/login/action.js +1 -1
- package/dist/login/action.js.map +1 -1
- package/dist/login/action.mjs +1 -1
- package/dist/login/action.mjs.map +1 -1
- package/dist/package.json.js +1 -1
- package/dist/package.json.mjs +1 -1
- package/package.json +6 -6
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"action.d.ts","sourceRoot":"","sources":["../../src/create-project/action.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"action.d.ts","sourceRoot":"","sources":["../../src/create-project/action.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,UAAU,EAGV,qBAAqB,EAGtB,MAAM,UAAU,CAAC;8BAsGS,UAAU;AAArC,wBA0CE"}
|
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
var inquirer = require('inquirer');
|
|
4
3
|
var axios = require('axios');
|
|
5
4
|
var fp = require('lodash/fp');
|
|
6
5
|
var cliApi = require('../services/cli-api.js');
|
|
@@ -101,6 +100,7 @@ var action = (async (ctx)=>{
|
|
|
101
100
|
...projectQuestions_utils.getDefaultsFromQuestions(questions)
|
|
102
101
|
};
|
|
103
102
|
const projectAnswersDefaulted = fp.defaults(defaultValues);
|
|
103
|
+
const { default: inquirer } = await import('inquirer');
|
|
104
104
|
const projectAnswers = await inquirer.prompt(questions);
|
|
105
105
|
const projectInput = projectAnswersDefaulted(projectAnswers);
|
|
106
106
|
try {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"action.js","sources":["../../src/create-project/action.ts"],"sourcesContent":["import inquirer from 'inquirer';\nimport { AxiosError } from 'axios';\nimport { defaults } from 'lodash/fp';\nimport {\n CLIContext,\n CloudApiService,\n CloudCliConfig,\n CreateProjectResponse,\n ProjectAnswers,\n ProjectInput,\n} from '../types';\nimport { cloudApiFactory, local, tokenServiceFactory } from '../services';\nimport { VERSION } from '../services/cli-api';\nimport { getProjectNameFromPackageJson } from './utils/get-project-name-from-pkg';\nimport { promptLogin } from '../login/action';\nimport {\n getDefaultsFromQuestions,\n getProjectNodeVersionDefault,\n questionDefaultValuesMapper,\n} from './utils/project-questions.utils';\nimport { apiConfig } from '../config/api';\nimport { notificationServiceFactory } from '../services/notification';\nimport {\n environmentCreationErrorFactory,\n environmentErrorMessageFactory,\n} from '../utils/error-message-factories';\n\nasync function handleError(ctx: CLIContext, error: Error) {\n const { logger } = ctx;\n logger.debug(error);\n if (error instanceof AxiosError) {\n const errorMessage = typeof error.response?.data === 'string' ? error.response.data : null;\n switch (error.response?.status) {\n case 400:\n logger.error(errorMessage || 'Invalid input. Please check your inputs and try again.');\n return;\n case 403:\n logger.error(\n errorMessage ||\n 'You do not have permission to create a project. Please contact support for assistance.'\n );\n return;\n case 503:\n logger.error(\n 'Strapi Cloud project creation is currently unavailable. Please try again later.'\n );\n return;\n default:\n if (errorMessage) {\n logger.error(errorMessage);\n throw error;\n }\n break;\n }\n }\n logger.error(\n 'We encountered an issue while creating your project. Please try again in a moment. If the problem persists, contact support for assistance.'\n );\n}\n\nasync function createProject(\n ctx: CLIContext,\n cloudApi: CloudApiService,\n projectInput: ProjectInput,\n token: string,\n config: CloudCliConfig\n) {\n const { logger } = ctx;\n const projectSpinner = logger.spinner('Setting up your project...').start();\n projectSpinner.indent = 1;\n const notificationService = notificationServiceFactory(ctx);\n const { waitForEnvironmentCreation, close } = notificationService(\n `${apiConfig.apiBaseUrl}/${VERSION}/notifications`,\n token,\n config\n );\n let projectData: CreateProjectResponse;\n try {\n const { data } = await cloudApi.createProject(projectInput);\n projectData = data;\n await local.save({ project: data });\n projectSpinner.succeed('Project created successfully!');\n } catch (e: Error | unknown) {\n projectSpinner.fail(`An error occurred while creating the project on Strapi Cloud.`);\n close();\n throw e;\n }\n if (config.featureFlags.asyncProjectCreationEnabled) {\n const environmentSpinner = logger\n .spinner('Setting up your environment... This may take a minute...')\n .start();\n environmentSpinner.indent = 1;\n try {\n await waitForEnvironmentCreation(projectData.environmentInternalName);\n environmentSpinner.succeed('Environment created successfully!\\n');\n } catch (e: Error | unknown) {\n environmentSpinner.fail(\n `An error occurred while creating the environment on Strapi Cloud.\\n`\n );\n const environmentErrorMessage = environmentErrorMessageFactory({\n projectName: projectData.name,\n firstLine: config.projectCreation.errors.environmentCreationFailed.firstLine,\n secondLine: config.projectCreation.errors.environmentCreationFailed.secondLine,\n });\n logger.log(environmentCreationErrorFactory(environmentErrorMessage));\n return;\n }\n }\n close();\n return projectData;\n}\n\nexport default async (ctx: CLIContext) => {\n const { logger } = ctx;\n const { getValidToken, eraseToken } = await tokenServiceFactory(ctx);\n\n const token = await getValidToken(ctx, promptLogin);\n if (!token) {\n return;\n }\n\n const cloudApi = await cloudApiFactory(ctx, token);\n const { data: config } = await cloudApi.config();\n const projectName = await getProjectNameFromPackageJson(ctx);\n\n const defaultAnswersMapper = questionDefaultValuesMapper({\n name: projectName,\n nodeVersion: getProjectNodeVersionDefault,\n });\n const questions = defaultAnswersMapper(config.projectCreation.questions);\n const defaultValues = {\n ...config.projectCreation.defaults,\n ...getDefaultsFromQuestions(questions),\n };\n\n const projectAnswersDefaulted = defaults(defaultValues);\n const projectAnswers = await inquirer.prompt<ProjectAnswers>(questions);\n\n const projectInput: ProjectInput = projectAnswersDefaulted(projectAnswers);\n\n try {\n return await createProject(ctx, cloudApi, projectInput, token, config);\n } catch (e: Error | unknown) {\n if (e instanceof AxiosError && e.response?.status === 401) {\n logger.warn('Oops! Your session has expired. Please log in again to retry.');\n await eraseToken();\n if (await promptLogin(ctx)) {\n return await createProject(ctx, cloudApi, projectInput, token, config);\n }\n } else {\n await handleError(ctx, e as Error);\n }\n }\n};\n"],"names":["handleError","ctx","error","logger","debug","AxiosError","errorMessage","response","data","status","createProject","cloudApi","projectInput","token","config","projectSpinner","spinner","start","indent","notificationService","notificationServiceFactory","waitForEnvironmentCreation","close","apiConfig","apiBaseUrl","VERSION","projectData","local","project","succeed","e","fail","featureFlags","asyncProjectCreationEnabled","environmentSpinner","environmentInternalName","environmentErrorMessage","environmentErrorMessageFactory","projectName","name","firstLine","projectCreation","errors","environmentCreationFailed","secondLine","log","environmentCreationErrorFactory","getValidToken","eraseToken","tokenServiceFactory","promptLogin","cloudApiFactory","getProjectNameFromPackageJson","defaultAnswersMapper","questionDefaultValuesMapper","nodeVersion","getProjectNodeVersionDefault","questions","defaultValues","defaults","getDefaultsFromQuestions","projectAnswersDefaulted","projectAnswers","inquirer","prompt","warn"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"action.js","sources":["../../src/create-project/action.ts"],"sourcesContent":["import { AxiosError } from 'axios';\nimport { defaults } from 'lodash/fp';\nimport {\n CLIContext,\n CloudApiService,\n CloudCliConfig,\n CreateProjectResponse,\n ProjectAnswers,\n ProjectInput,\n} from '../types';\nimport { cloudApiFactory, local, tokenServiceFactory } from '../services';\nimport { VERSION } from '../services/cli-api';\nimport { getProjectNameFromPackageJson } from './utils/get-project-name-from-pkg';\nimport { promptLogin } from '../login/action';\nimport {\n getDefaultsFromQuestions,\n getProjectNodeVersionDefault,\n questionDefaultValuesMapper,\n} from './utils/project-questions.utils';\nimport { apiConfig } from '../config/api';\nimport { notificationServiceFactory } from '../services/notification';\nimport {\n environmentCreationErrorFactory,\n environmentErrorMessageFactory,\n} from '../utils/error-message-factories';\n\nasync function handleError(ctx: CLIContext, error: Error) {\n const { logger } = ctx;\n logger.debug(error);\n if (error instanceof AxiosError) {\n const errorMessage = typeof error.response?.data === 'string' ? error.response.data : null;\n switch (error.response?.status) {\n case 400:\n logger.error(errorMessage || 'Invalid input. Please check your inputs and try again.');\n return;\n case 403:\n logger.error(\n errorMessage ||\n 'You do not have permission to create a project. Please contact support for assistance.'\n );\n return;\n case 503:\n logger.error(\n 'Strapi Cloud project creation is currently unavailable. Please try again later.'\n );\n return;\n default:\n if (errorMessage) {\n logger.error(errorMessage);\n throw error;\n }\n break;\n }\n }\n logger.error(\n 'We encountered an issue while creating your project. Please try again in a moment. If the problem persists, contact support for assistance.'\n );\n}\n\nasync function createProject(\n ctx: CLIContext,\n cloudApi: CloudApiService,\n projectInput: ProjectInput,\n token: string,\n config: CloudCliConfig\n) {\n const { logger } = ctx;\n const projectSpinner = logger.spinner('Setting up your project...').start();\n projectSpinner.indent = 1;\n const notificationService = notificationServiceFactory(ctx);\n const { waitForEnvironmentCreation, close } = notificationService(\n `${apiConfig.apiBaseUrl}/${VERSION}/notifications`,\n token,\n config\n );\n let projectData: CreateProjectResponse;\n try {\n const { data } = await cloudApi.createProject(projectInput);\n projectData = data;\n await local.save({ project: data });\n projectSpinner.succeed('Project created successfully!');\n } catch (e: Error | unknown) {\n projectSpinner.fail(`An error occurred while creating the project on Strapi Cloud.`);\n close();\n throw e;\n }\n if (config.featureFlags.asyncProjectCreationEnabled) {\n const environmentSpinner = logger\n .spinner('Setting up your environment... This may take a minute...')\n .start();\n environmentSpinner.indent = 1;\n try {\n await waitForEnvironmentCreation(projectData.environmentInternalName);\n environmentSpinner.succeed('Environment created successfully!\\n');\n } catch (e: Error | unknown) {\n environmentSpinner.fail(\n `An error occurred while creating the environment on Strapi Cloud.\\n`\n );\n const environmentErrorMessage = environmentErrorMessageFactory({\n projectName: projectData.name,\n firstLine: config.projectCreation.errors.environmentCreationFailed.firstLine,\n secondLine: config.projectCreation.errors.environmentCreationFailed.secondLine,\n });\n logger.log(environmentCreationErrorFactory(environmentErrorMessage));\n return;\n }\n }\n close();\n return projectData;\n}\n\nexport default async (ctx: CLIContext) => {\n const { logger } = ctx;\n const { getValidToken, eraseToken } = await tokenServiceFactory(ctx);\n\n const token = await getValidToken(ctx, promptLogin);\n if (!token) {\n return;\n }\n\n const cloudApi = await cloudApiFactory(ctx, token);\n const { data: config } = await cloudApi.config();\n const projectName = await getProjectNameFromPackageJson(ctx);\n\n const defaultAnswersMapper = questionDefaultValuesMapper({\n name: projectName,\n nodeVersion: getProjectNodeVersionDefault,\n });\n const questions = defaultAnswersMapper(config.projectCreation.questions);\n const defaultValues = {\n ...config.projectCreation.defaults,\n ...getDefaultsFromQuestions(questions),\n };\n\n const projectAnswersDefaulted = defaults(defaultValues);\n const { default: inquirer } = await import('inquirer');\n const projectAnswers = await inquirer.prompt<ProjectAnswers>(questions);\n\n const projectInput: ProjectInput = projectAnswersDefaulted(projectAnswers);\n\n try {\n return await createProject(ctx, cloudApi, projectInput, token, config);\n } catch (e: Error | unknown) {\n if (e instanceof AxiosError && e.response?.status === 401) {\n logger.warn('Oops! Your session has expired. Please log in again to retry.');\n await eraseToken();\n if (await promptLogin(ctx)) {\n return await createProject(ctx, cloudApi, projectInput, token, config);\n }\n } else {\n await handleError(ctx, e as Error);\n }\n }\n};\n"],"names":["handleError","ctx","error","logger","debug","AxiosError","errorMessage","response","data","status","createProject","cloudApi","projectInput","token","config","projectSpinner","spinner","start","indent","notificationService","notificationServiceFactory","waitForEnvironmentCreation","close","apiConfig","apiBaseUrl","VERSION","projectData","local","project","succeed","e","fail","featureFlags","asyncProjectCreationEnabled","environmentSpinner","environmentInternalName","environmentErrorMessage","environmentErrorMessageFactory","projectName","name","firstLine","projectCreation","errors","environmentCreationFailed","secondLine","log","environmentCreationErrorFactory","getValidToken","eraseToken","tokenServiceFactory","promptLogin","cloudApiFactory","getProjectNameFromPackageJson","defaultAnswersMapper","questionDefaultValuesMapper","nodeVersion","getProjectNodeVersionDefault","questions","defaultValues","defaults","getDefaultsFromQuestions","projectAnswersDefaulted","default","inquirer","projectAnswers","prompt","warn"],"mappings":";;;;;;;;;;;;;;;;;;AA0BA,eAAeA,WAAAA,CAAYC,GAAe,EAAEC,KAAY,EAAA;IACtD,MAAM,EAAEC,MAAM,EAAE,GAAGF,GAAAA;AACnBE,IAAAA,MAAAA,CAAOC,KAAK,CAACF,KAAAA,CAAAA;AACb,IAAA,IAAIA,iBAAiBG,gBAAAA,EAAY;QAC/B,MAAMC,YAAAA,GAAe,OAAOJ,KAAAA,CAAMK,QAAQ,EAAEC,IAAAA,KAAS,QAAA,GAAWN,KAAAA,CAAMK,QAAQ,CAACC,IAAI,GAAG,IAAA;QACtF,OAAQN,KAAAA,CAAMK,QAAQ,EAAEE,MAAAA;YACtB,KAAK,GAAA;gBACHN,MAAAA,CAAOD,KAAK,CAACI,YAAAA,IAAgB,wDAAA,CAAA;AAC7B,gBAAA;YACF,KAAK,GAAA;gBACHH,MAAAA,CAAOD,KAAK,CACVI,YAAAA,IACE,wFAAA,CAAA;AAEJ,gBAAA;YACF,KAAK,GAAA;AACHH,gBAAAA,MAAAA,CAAOD,KAAK,CACV,iFAAA,CAAA;AAEF,gBAAA;AACF,YAAA;AACE,gBAAA,IAAII,YAAAA,EAAc;AAChBH,oBAAAA,MAAAA,CAAOD,KAAK,CAACI,YAAAA,CAAAA;oBACb,MAAMJ,KAAAA;AACR,gBAAA;AACA,gBAAA;AACJ;AACF,IAAA;AACAC,IAAAA,MAAAA,CAAOD,KAAK,CACV,6IAAA,CAAA;AAEJ;AAEA,eAAeQ,aAAAA,CACbT,GAAe,EACfU,QAAyB,EACzBC,YAA0B,EAC1BC,KAAa,EACbC,MAAsB,EAAA;IAEtB,MAAM,EAAEX,MAAM,EAAE,GAAGF,GAAAA;AACnB,IAAA,MAAMc,cAAAA,GAAiBZ,MAAAA,CAAOa,OAAO,CAAC,8BAA8BC,KAAK,EAAA;AACzEF,IAAAA,cAAAA,CAAeG,MAAM,GAAG,CAAA;AACxB,IAAA,MAAMC,sBAAsBC,uCAAAA,CAA2BnB,GAAAA,CAAAA;AACvD,IAAA,MAAM,EAAEoB,0BAA0B,EAAEC,KAAK,EAAE,GAAGH,mBAAAA,CAC5C,CAAA,EAAGI,aAAAA,CAAUC,UAAU,CAAC,CAAC,EAAEC,eAAQ,cAAc,CAAC,EAClDZ,KAAAA,EACAC,MAAAA,CAAAA;IAEF,IAAIY,WAAAA;IACJ,IAAI;AACF,QAAA,MAAM,EAAElB,IAAI,EAAE,GAAG,MAAMG,QAAAA,CAASD,aAAa,CAACE,YAAAA,CAAAA;QAC9Cc,WAAAA,GAAclB,IAAAA;QACd,MAAMmB,mBAAU,CAAC;YAAEC,OAAAA,EAASpB;AAAK,SAAA,CAAA;AACjCO,QAAAA,cAAAA,CAAec,OAAO,CAAC,+BAAA,CAAA;AACzB,IAAA,CAAA,CAAE,OAAOC,CAAAA,EAAoB;AAC3Bf,QAAAA,cAAAA,CAAegB,IAAI,CAAC,CAAC,6DAA6D,CAAC,CAAA;AACnFT,QAAAA,KAAAA,EAAAA;QACA,MAAMQ,CAAAA;AACR,IAAA;AACA,IAAA,IAAIhB,MAAAA,CAAOkB,YAAY,CAACC,2BAA2B,EAAE;AACnD,QAAA,MAAMC,kBAAAA,GAAqB/B,MAAAA,CACxBa,OAAO,CAAC,4DACRC,KAAK,EAAA;AACRiB,QAAAA,kBAAAA,CAAmBhB,MAAM,GAAG,CAAA;QAC5B,IAAI;YACF,MAAMG,0BAAAA,CAA2BK,YAAYS,uBAAuB,CAAA;AACpED,YAAAA,kBAAAA,CAAmBL,OAAO,CAAC,qCAAA,CAAA;AAC7B,QAAA,CAAA,CAAE,OAAOC,CAAAA,EAAoB;AAC3BI,YAAAA,kBAAAA,CAAmBH,IAAI,CACrB,CAAC,mEAAmE,CAAC,CAAA;AAEvE,YAAA,MAAMK,0BAA0BC,oDAAAA,CAA+B;AAC7DC,gBAAAA,WAAAA,EAAaZ,YAAYa,IAAI;AAC7BC,gBAAAA,SAAAA,EAAW1B,OAAO2B,eAAe,CAACC,MAAM,CAACC,yBAAyB,CAACH,SAAS;AAC5EI,gBAAAA,UAAAA,EAAY9B,OAAO2B,eAAe,CAACC,MAAM,CAACC,yBAAyB,CAACC;AACtE,aAAA,CAAA;YACAzC,MAAAA,CAAO0C,GAAG,CAACC,qDAAAA,CAAgCV,uBAAAA,CAAAA,CAAAA;AAC3C,YAAA;AACF,QAAA;AACF,IAAA;AACAd,IAAAA,KAAAA,EAAAA;IACA,OAAOI,WAAAA;AACT;AAEA,aAAe,CAAA,OAAOzB,GAAAA,GAAAA;IACpB,MAAM,EAAEE,MAAM,EAAE,GAAGF,GAAAA;AACnB,IAAA,MAAM,EAAE8C,aAAa,EAAEC,UAAU,EAAE,GAAG,MAAMC,yBAAAA,CAAoBhD,GAAAA,CAAAA;IAEhE,MAAMY,OAAAA,GAAQ,MAAMkC,aAAAA,CAAc9C,GAAAA,EAAKiD,oBAAAA,CAAAA;AACvC,IAAA,IAAI,CAACrC,OAAAA,EAAO;AACV,QAAA;AACF,IAAA;IAEA,MAAMF,QAAAA,GAAW,MAAMwC,sBAAAA,CAAgBlD,GAAAA,EAAKY,OAAAA,CAAAA;AAC5C,IAAA,MAAM,EAAEL,IAAAA,EAAMM,MAAM,EAAE,GAAG,MAAMH,SAASG,MAAM,EAAA;IAC9C,MAAMwB,WAAAA,GAAc,MAAMc,mDAAAA,CAA8BnD,GAAAA,CAAAA;AAExD,IAAA,MAAMoD,uBAAuBC,kDAAAA,CAA4B;QACvDf,IAAAA,EAAMD,WAAAA;QACNiB,WAAAA,EAAaC;AACf,KAAA,CAAA;AACA,IAAA,MAAMC,SAAAA,GAAYJ,oBAAAA,CAAqBvC,MAAAA,CAAO2B,eAAe,CAACgB,SAAS,CAAA;AACvE,IAAA,MAAMC,aAAAA,GAAgB;QACpB,GAAG5C,MAAAA,CAAO2B,eAAe,CAACkB,QAAQ;AAClC,QAAA,GAAGC,gDAAyBH,SAAAA;AAC9B,KAAA;AAEA,IAAA,MAAMI,0BAA0BF,WAAAA,CAASD,aAAAA,CAAAA;AACzC,IAAA,MAAM,EAAEI,OAAAA,EAASC,QAAQ,EAAE,GAAG,MAAM,OAAO,UAAA,CAAA;AAC3C,IAAA,MAAMC,cAAAA,GAAiB,MAAMD,QAAAA,CAASE,MAAM,CAAiBR,SAAAA,CAAAA;AAE7D,IAAA,MAAM7C,eAA6BiD,uBAAAA,CAAwBG,cAAAA,CAAAA;IAE3D,IAAI;AACF,QAAA,OAAO,MAAMtD,aAAAA,CAAcT,GAAAA,EAAKU,QAAAA,EAAUC,cAAcC,OAAAA,EAAOC,MAAAA,CAAAA;AACjE,IAAA,CAAA,CAAE,OAAOgB,CAAAA,EAAoB;AAC3B,QAAA,IAAIA,aAAazB,gBAAAA,IAAcyB,CAAAA,CAAEvB,QAAQ,EAAEE,WAAW,GAAA,EAAK;AACzDN,YAAAA,MAAAA,CAAO+D,IAAI,CAAC,+DAAA,CAAA;YACZ,MAAMlB,UAAAA,EAAAA;YACN,IAAI,MAAME,qBAAYjD,GAAAA,CAAAA,EAAM;AAC1B,gBAAA,OAAO,MAAMS,aAAAA,CAAcT,GAAAA,EAAKU,QAAAA,EAAUC,cAAcC,OAAAA,EAAOC,MAAAA,CAAAA;AACjE,YAAA;QACF,CAAA,MAAO;AACL,YAAA,MAAMd,YAAYC,GAAAA,EAAK6B,CAAAA,CAAAA;AACzB,QAAA;AACF,IAAA;AACF,CAAA;;;;"}
|
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import inquirer from 'inquirer';
|
|
2
1
|
import { AxiosError } from 'axios';
|
|
3
2
|
import { defaults } from 'lodash/fp';
|
|
4
3
|
import { cloudApiFactory, VERSION } from '../services/cli-api.mjs';
|
|
@@ -99,6 +98,7 @@ var action = (async (ctx)=>{
|
|
|
99
98
|
...getDefaultsFromQuestions(questions)
|
|
100
99
|
};
|
|
101
100
|
const projectAnswersDefaulted = defaults(defaultValues);
|
|
101
|
+
const { default: inquirer } = await import('inquirer');
|
|
102
102
|
const projectAnswers = await inquirer.prompt(questions);
|
|
103
103
|
const projectInput = projectAnswersDefaulted(projectAnswers);
|
|
104
104
|
try {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"action.mjs","sources":["../../src/create-project/action.ts"],"sourcesContent":["import inquirer from 'inquirer';\nimport { AxiosError } from 'axios';\nimport { defaults } from 'lodash/fp';\nimport {\n CLIContext,\n CloudApiService,\n CloudCliConfig,\n CreateProjectResponse,\n ProjectAnswers,\n ProjectInput,\n} from '../types';\nimport { cloudApiFactory, local, tokenServiceFactory } from '../services';\nimport { VERSION } from '../services/cli-api';\nimport { getProjectNameFromPackageJson } from './utils/get-project-name-from-pkg';\nimport { promptLogin } from '../login/action';\nimport {\n getDefaultsFromQuestions,\n getProjectNodeVersionDefault,\n questionDefaultValuesMapper,\n} from './utils/project-questions.utils';\nimport { apiConfig } from '../config/api';\nimport { notificationServiceFactory } from '../services/notification';\nimport {\n environmentCreationErrorFactory,\n environmentErrorMessageFactory,\n} from '../utils/error-message-factories';\n\nasync function handleError(ctx: CLIContext, error: Error) {\n const { logger } = ctx;\n logger.debug(error);\n if (error instanceof AxiosError) {\n const errorMessage = typeof error.response?.data === 'string' ? error.response.data : null;\n switch (error.response?.status) {\n case 400:\n logger.error(errorMessage || 'Invalid input. Please check your inputs and try again.');\n return;\n case 403:\n logger.error(\n errorMessage ||\n 'You do not have permission to create a project. Please contact support for assistance.'\n );\n return;\n case 503:\n logger.error(\n 'Strapi Cloud project creation is currently unavailable. Please try again later.'\n );\n return;\n default:\n if (errorMessage) {\n logger.error(errorMessage);\n throw error;\n }\n break;\n }\n }\n logger.error(\n 'We encountered an issue while creating your project. Please try again in a moment. If the problem persists, contact support for assistance.'\n );\n}\n\nasync function createProject(\n ctx: CLIContext,\n cloudApi: CloudApiService,\n projectInput: ProjectInput,\n token: string,\n config: CloudCliConfig\n) {\n const { logger } = ctx;\n const projectSpinner = logger.spinner('Setting up your project...').start();\n projectSpinner.indent = 1;\n const notificationService = notificationServiceFactory(ctx);\n const { waitForEnvironmentCreation, close } = notificationService(\n `${apiConfig.apiBaseUrl}/${VERSION}/notifications`,\n token,\n config\n );\n let projectData: CreateProjectResponse;\n try {\n const { data } = await cloudApi.createProject(projectInput);\n projectData = data;\n await local.save({ project: data });\n projectSpinner.succeed('Project created successfully!');\n } catch (e: Error | unknown) {\n projectSpinner.fail(`An error occurred while creating the project on Strapi Cloud.`);\n close();\n throw e;\n }\n if (config.featureFlags.asyncProjectCreationEnabled) {\n const environmentSpinner = logger\n .spinner('Setting up your environment... This may take a minute...')\n .start();\n environmentSpinner.indent = 1;\n try {\n await waitForEnvironmentCreation(projectData.environmentInternalName);\n environmentSpinner.succeed('Environment created successfully!\\n');\n } catch (e: Error | unknown) {\n environmentSpinner.fail(\n `An error occurred while creating the environment on Strapi Cloud.\\n`\n );\n const environmentErrorMessage = environmentErrorMessageFactory({\n projectName: projectData.name,\n firstLine: config.projectCreation.errors.environmentCreationFailed.firstLine,\n secondLine: config.projectCreation.errors.environmentCreationFailed.secondLine,\n });\n logger.log(environmentCreationErrorFactory(environmentErrorMessage));\n return;\n }\n }\n close();\n return projectData;\n}\n\nexport default async (ctx: CLIContext) => {\n const { logger } = ctx;\n const { getValidToken, eraseToken } = await tokenServiceFactory(ctx);\n\n const token = await getValidToken(ctx, promptLogin);\n if (!token) {\n return;\n }\n\n const cloudApi = await cloudApiFactory(ctx, token);\n const { data: config } = await cloudApi.config();\n const projectName = await getProjectNameFromPackageJson(ctx);\n\n const defaultAnswersMapper = questionDefaultValuesMapper({\n name: projectName,\n nodeVersion: getProjectNodeVersionDefault,\n });\n const questions = defaultAnswersMapper(config.projectCreation.questions);\n const defaultValues = {\n ...config.projectCreation.defaults,\n ...getDefaultsFromQuestions(questions),\n };\n\n const projectAnswersDefaulted = defaults(defaultValues);\n const projectAnswers = await inquirer.prompt<ProjectAnswers>(questions);\n\n const projectInput: ProjectInput = projectAnswersDefaulted(projectAnswers);\n\n try {\n return await createProject(ctx, cloudApi, projectInput, token, config);\n } catch (e: Error | unknown) {\n if (e instanceof AxiosError && e.response?.status === 401) {\n logger.warn('Oops! Your session has expired. Please log in again to retry.');\n await eraseToken();\n if (await promptLogin(ctx)) {\n return await createProject(ctx, cloudApi, projectInput, token, config);\n }\n } else {\n await handleError(ctx, e as Error);\n }\n }\n};\n"],"names":["handleError","ctx","error","logger","debug","AxiosError","errorMessage","response","data","status","createProject","cloudApi","projectInput","token","config","projectSpinner","spinner","start","indent","notificationService","notificationServiceFactory","waitForEnvironmentCreation","close","apiConfig","apiBaseUrl","VERSION","projectData","local","project","succeed","e","fail","featureFlags","asyncProjectCreationEnabled","environmentSpinner","environmentInternalName","environmentErrorMessage","environmentErrorMessageFactory","projectName","name","firstLine","projectCreation","errors","environmentCreationFailed","secondLine","log","environmentCreationErrorFactory","getValidToken","eraseToken","tokenServiceFactory","promptLogin","cloudApiFactory","getProjectNameFromPackageJson","defaultAnswersMapper","questionDefaultValuesMapper","nodeVersion","getProjectNodeVersionDefault","questions","defaultValues","defaults","getDefaultsFromQuestions","projectAnswersDefaulted","projectAnswers","inquirer","prompt","warn"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"action.mjs","sources":["../../src/create-project/action.ts"],"sourcesContent":["import { AxiosError } from 'axios';\nimport { defaults } from 'lodash/fp';\nimport {\n CLIContext,\n CloudApiService,\n CloudCliConfig,\n CreateProjectResponse,\n ProjectAnswers,\n ProjectInput,\n} from '../types';\nimport { cloudApiFactory, local, tokenServiceFactory } from '../services';\nimport { VERSION } from '../services/cli-api';\nimport { getProjectNameFromPackageJson } from './utils/get-project-name-from-pkg';\nimport { promptLogin } from '../login/action';\nimport {\n getDefaultsFromQuestions,\n getProjectNodeVersionDefault,\n questionDefaultValuesMapper,\n} from './utils/project-questions.utils';\nimport { apiConfig } from '../config/api';\nimport { notificationServiceFactory } from '../services/notification';\nimport {\n environmentCreationErrorFactory,\n environmentErrorMessageFactory,\n} from '../utils/error-message-factories';\n\nasync function handleError(ctx: CLIContext, error: Error) {\n const { logger } = ctx;\n logger.debug(error);\n if (error instanceof AxiosError) {\n const errorMessage = typeof error.response?.data === 'string' ? error.response.data : null;\n switch (error.response?.status) {\n case 400:\n logger.error(errorMessage || 'Invalid input. Please check your inputs and try again.');\n return;\n case 403:\n logger.error(\n errorMessage ||\n 'You do not have permission to create a project. Please contact support for assistance.'\n );\n return;\n case 503:\n logger.error(\n 'Strapi Cloud project creation is currently unavailable. Please try again later.'\n );\n return;\n default:\n if (errorMessage) {\n logger.error(errorMessage);\n throw error;\n }\n break;\n }\n }\n logger.error(\n 'We encountered an issue while creating your project. Please try again in a moment. If the problem persists, contact support for assistance.'\n );\n}\n\nasync function createProject(\n ctx: CLIContext,\n cloudApi: CloudApiService,\n projectInput: ProjectInput,\n token: string,\n config: CloudCliConfig\n) {\n const { logger } = ctx;\n const projectSpinner = logger.spinner('Setting up your project...').start();\n projectSpinner.indent = 1;\n const notificationService = notificationServiceFactory(ctx);\n const { waitForEnvironmentCreation, close } = notificationService(\n `${apiConfig.apiBaseUrl}/${VERSION}/notifications`,\n token,\n config\n );\n let projectData: CreateProjectResponse;\n try {\n const { data } = await cloudApi.createProject(projectInput);\n projectData = data;\n await local.save({ project: data });\n projectSpinner.succeed('Project created successfully!');\n } catch (e: Error | unknown) {\n projectSpinner.fail(`An error occurred while creating the project on Strapi Cloud.`);\n close();\n throw e;\n }\n if (config.featureFlags.asyncProjectCreationEnabled) {\n const environmentSpinner = logger\n .spinner('Setting up your environment... This may take a minute...')\n .start();\n environmentSpinner.indent = 1;\n try {\n await waitForEnvironmentCreation(projectData.environmentInternalName);\n environmentSpinner.succeed('Environment created successfully!\\n');\n } catch (e: Error | unknown) {\n environmentSpinner.fail(\n `An error occurred while creating the environment on Strapi Cloud.\\n`\n );\n const environmentErrorMessage = environmentErrorMessageFactory({\n projectName: projectData.name,\n firstLine: config.projectCreation.errors.environmentCreationFailed.firstLine,\n secondLine: config.projectCreation.errors.environmentCreationFailed.secondLine,\n });\n logger.log(environmentCreationErrorFactory(environmentErrorMessage));\n return;\n }\n }\n close();\n return projectData;\n}\n\nexport default async (ctx: CLIContext) => {\n const { logger } = ctx;\n const { getValidToken, eraseToken } = await tokenServiceFactory(ctx);\n\n const token = await getValidToken(ctx, promptLogin);\n if (!token) {\n return;\n }\n\n const cloudApi = await cloudApiFactory(ctx, token);\n const { data: config } = await cloudApi.config();\n const projectName = await getProjectNameFromPackageJson(ctx);\n\n const defaultAnswersMapper = questionDefaultValuesMapper({\n name: projectName,\n nodeVersion: getProjectNodeVersionDefault,\n });\n const questions = defaultAnswersMapper(config.projectCreation.questions);\n const defaultValues = {\n ...config.projectCreation.defaults,\n ...getDefaultsFromQuestions(questions),\n };\n\n const projectAnswersDefaulted = defaults(defaultValues);\n const { default: inquirer } = await import('inquirer');\n const projectAnswers = await inquirer.prompt<ProjectAnswers>(questions);\n\n const projectInput: ProjectInput = projectAnswersDefaulted(projectAnswers);\n\n try {\n return await createProject(ctx, cloudApi, projectInput, token, config);\n } catch (e: Error | unknown) {\n if (e instanceof AxiosError && e.response?.status === 401) {\n logger.warn('Oops! Your session has expired. Please log in again to retry.');\n await eraseToken();\n if (await promptLogin(ctx)) {\n return await createProject(ctx, cloudApi, projectInput, token, config);\n }\n } else {\n await handleError(ctx, e as Error);\n }\n }\n};\n"],"names":["handleError","ctx","error","logger","debug","AxiosError","errorMessage","response","data","status","createProject","cloudApi","projectInput","token","config","projectSpinner","spinner","start","indent","notificationService","notificationServiceFactory","waitForEnvironmentCreation","close","apiConfig","apiBaseUrl","VERSION","projectData","local","project","succeed","e","fail","featureFlags","asyncProjectCreationEnabled","environmentSpinner","environmentInternalName","environmentErrorMessage","environmentErrorMessageFactory","projectName","name","firstLine","projectCreation","errors","environmentCreationFailed","secondLine","log","environmentCreationErrorFactory","getValidToken","eraseToken","tokenServiceFactory","promptLogin","cloudApiFactory","getProjectNameFromPackageJson","defaultAnswersMapper","questionDefaultValuesMapper","nodeVersion","getProjectNodeVersionDefault","questions","defaultValues","defaults","getDefaultsFromQuestions","projectAnswersDefaulted","default","inquirer","projectAnswers","prompt","warn"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"project-questions.utils.d.ts","sourceRoot":"","sources":["../../../src/create-project/utils/project-questions.utils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC;
|
|
1
|
+
{"version":3,"file":"project-questions.utils.d.ts","sourceRoot":"","sources":["../../../src/create-project/utils/project-questions.utils.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC;AACjD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAElD;;;GAGG;AACH,wBAAgB,2BAA2B,CACzC,YAAY,EAAE,OAAO,CAAC;KACnB,CAAC,IAAI,MAAM,cAAc,GACtB,CAAC,CAAC,QAAQ,EAAE,gBAAgB,CAAC,cAAc,CAAC,KAAK,cAAc,CAAC,CAAC,CAAC,CAAC,GACnE,cAAc,CAAC,CAAC,CAAC;CACtB,CAAC,eAGW,cAAc,iBAAiB,cAAc,CAAC,CAAC,KACzD,cAAc,iBAAiB,cAAc,CAAC,CAAC,CAyBnD;AAED;;;GAGG;AACH,wBAAgB,wBAAwB,CACtC,SAAS,EAAE,aAAa,CAAC,gBAAgB,CAAC,cAAc,CAAC,CAAC,GACzD,OAAO,CAAC,cAAc,CAAC,CAOzB;AAED;;;GAGG;AACH,wBAAgB,4BAA4B,CAAC,QAAQ,EAAE,gBAAgB,CAAC,cAAc,CAAC,GAAG,MAAM,CAW/F"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"project-questions.utils.js","sources":["../../../src/create-project/utils/project-questions.utils.ts"],"sourcesContent":["import { DistinctQuestion } from 'inquirer';\nimport type { ProjectAnswers } from '../../types';\n\n/**\n * Apply default values to questions based on the provided mapper\n * @param questionsMap - A partial object with keys matching the ProjectAnswers keys and values being the default value or a function to get the default value\n */\nexport function questionDefaultValuesMapper(\n questionsMap: Partial<{\n [K in keyof ProjectAnswers]:\n | ((question: DistinctQuestion<ProjectAnswers>) => ProjectAnswers[K])\n | ProjectAnswers[K];\n }>\n) {\n return (\n questions: ReadonlyArray<DistinctQuestion<ProjectAnswers>>\n ): ReadonlyArray<DistinctQuestion<ProjectAnswers>> => {\n return questions.map((question) => {\n const questionName = question.name as keyof ProjectAnswers;\n\n // If the question is part of the mapper, apply the default value\n if (questionName in questionsMap) {\n const questionDefault = questionsMap[questionName];\n\n // If the default value is a function, call it with the question and get the default value\n if (typeof questionDefault === 'function') {\n return {\n ...question,\n default: questionDefault(question),\n };\n }\n // else we consider it as a static value\n return {\n ...question,\n default: questionDefault,\n };\n }\n // If the question is not part of the mapper, return the question as is\n return question;\n });\n };\n}\n\n/**\n * Get default values from questions\n * @param questions - An array of questions for project creation\n */\nexport function getDefaultsFromQuestions(\n questions: ReadonlyArray<DistinctQuestion<ProjectAnswers>>\n): Partial<ProjectAnswers> {\n return questions.reduce((acc, question) => {\n if (question.default && question.name) {\n return { ...acc, [question.name]: question.default };\n }\n return acc;\n }, {});\n}\n\n/**\n * Get the default node version based on the current node version if it is in the list of choices\n * @param question - The question for the node version in project creation\n */\nexport function getProjectNodeVersionDefault(question: DistinctQuestion<ProjectAnswers>): string {\n const currentNodeVersion = process.versions.node.split('.')[0];\n\n // Node Version question is set up as a list, but the type of inquirer is dynamic and the question can change in the future (it comes from API)\n if (question.type === 'list' && Array.isArray(question.choices)) {\n const choice = question.choices.find((choice) => choice.value === currentNodeVersion);\n if (choice) {\n return choice.value;\n }\n }\n return question.default;\n}\n"],"names":["questionDefaultValuesMapper","questionsMap","questions","map","question","questionName","name","questionDefault","default","getDefaultsFromQuestions","reduce","acc","getProjectNodeVersionDefault","currentNodeVersion","process","versions","node","split","type","Array","isArray","choices","choice","find","value"],"mappings":";;AAGA;;;IAIO,SAASA,2BAAAA,CACdC,YAIE,EAAA;AAEF,IAAA,OAAO,CACLC,SAAAA,GAAAA;QAEA,OAAOA,SAAAA,CAAUC,GAAG,CAAC,CAACC,QAAAA,GAAAA;YACpB,MAAMC,YAAAA,GAAeD,SAASE,IAAI;;AAGlC,YAAA,IAAID,gBAAgBJ,YAAAA,EAAc;gBAChC,MAAMM,eAAAA,GAAkBN,YAAY,CAACI,YAAAA,CAAa;;gBAGlD,IAAI,OAAOE,oBAAoB,UAAA,EAAY;oBACzC,OAAO;AACL,wBAAA,GAAGH,QAAQ;AACXI,wBAAAA,OAAAA,EAASD,eAAAA,CAAgBH,QAAAA;AAC3B,qBAAA;AACF,gBAAA;;gBAEA,OAAO;AACL,oBAAA,GAAGA,QAAQ;oBACXI,OAAAA,EAASD;AACX,iBAAA;AACF,YAAA;;YAEA,OAAOH,QAAAA;AACT,QAAA,CAAA,CAAA;AACF,IAAA,CAAA;AACF;AAEA;;;IAIO,SAASK,wBAAAA,CACdP,SAA0D,EAAA;AAE1D,IAAA,OAAOA,SAAAA,CAAUQ,MAAM,CAAC,CAACC,GAAAA,EAAKP,QAAAA,GAAAA;AAC5B,QAAA,IAAIA,QAAAA,CAASI,OAAO,IAAIJ,QAAAA,CAASE,IAAI,EAAE;YACrC,OAAO;AAAE,gBAAA,GAAGK,GAAG;AAAE,gBAAA,CAACP,QAAAA,CAASE,IAAI,GAAGF,SAASI;AAAQ,aAAA;AACrD,QAAA;QACA,OAAOG,GAAAA;AACT,IAAA,CAAA,EAAG,EAAC,CAAA;AACN;AAEA;;;IAIO,SAASC,4BAAAA,CAA6BR,QAA0C,EAAA;IACrF,MAAMS,kBAAAA,GAAqBC,OAAAA,CAAQC,QAAQ,CAACC,IAAI,CAACC,KAAK,CAAC,GAAA,CAAI,CAAC,CAAA,CAAE;;IAG9D,IAAIb,QAAAA,CAASc,IAAI,KAAK,MAAA,IAAUC,MAAMC,OAAO,CAAChB,QAAAA,CAASiB,OAAO,CAAA,EAAG;QAC/D,MAAMC,MAAAA,GAASlB,QAAAA,CAASiB,OAAO,CAACE,IAAI,CAAC,CAACD,MAAAA,GAAWA,MAAAA,CAAOE,KAAK,KAAKX,kBAAAA,CAAAA;AAClE,QAAA,IAAIS,MAAAA,EAAQ;AACV,YAAA,OAAOA,OAAOE,KAAK;AACrB,QAAA;AACF,IAAA;AACA,IAAA,OAAOpB,SAASI,OAAO;AACzB;;;;;;"}
|
|
1
|
+
{"version":3,"file":"project-questions.utils.js","sources":["../../../src/create-project/utils/project-questions.utils.ts"],"sourcesContent":["import type { DistinctQuestion } from 'inquirer';\nimport type { ProjectAnswers } from '../../types';\n\n/**\n * Apply default values to questions based on the provided mapper\n * @param questionsMap - A partial object with keys matching the ProjectAnswers keys and values being the default value or a function to get the default value\n */\nexport function questionDefaultValuesMapper(\n questionsMap: Partial<{\n [K in keyof ProjectAnswers]:\n | ((question: DistinctQuestion<ProjectAnswers>) => ProjectAnswers[K])\n | ProjectAnswers[K];\n }>\n) {\n return (\n questions: ReadonlyArray<DistinctQuestion<ProjectAnswers>>\n ): ReadonlyArray<DistinctQuestion<ProjectAnswers>> => {\n return questions.map((question) => {\n const questionName = question.name as keyof ProjectAnswers;\n\n // If the question is part of the mapper, apply the default value\n if (questionName in questionsMap) {\n const questionDefault = questionsMap[questionName];\n\n // If the default value is a function, call it with the question and get the default value\n if (typeof questionDefault === 'function') {\n return {\n ...question,\n default: questionDefault(question),\n };\n }\n // else we consider it as a static value\n return {\n ...question,\n default: questionDefault,\n };\n }\n // If the question is not part of the mapper, return the question as is\n return question;\n });\n };\n}\n\n/**\n * Get default values from questions\n * @param questions - An array of questions for project creation\n */\nexport function getDefaultsFromQuestions(\n questions: ReadonlyArray<DistinctQuestion<ProjectAnswers>>\n): Partial<ProjectAnswers> {\n return questions.reduce((acc, question) => {\n if (question.default && question.name) {\n return { ...acc, [question.name]: question.default };\n }\n return acc;\n }, {});\n}\n\n/**\n * Get the default node version based on the current node version if it is in the list of choices\n * @param question - The question for the node version in project creation\n */\nexport function getProjectNodeVersionDefault(question: DistinctQuestion<ProjectAnswers>): string {\n const currentNodeVersion = process.versions.node.split('.')[0];\n\n // Node Version question is set up as a list, but the type of inquirer is dynamic and the question can change in the future (it comes from API)\n if (question.type === 'list' && Array.isArray(question.choices)) {\n const choice = question.choices.find((choice) => choice.value === currentNodeVersion);\n if (choice) {\n return choice.value;\n }\n }\n return question.default;\n}\n"],"names":["questionDefaultValuesMapper","questionsMap","questions","map","question","questionName","name","questionDefault","default","getDefaultsFromQuestions","reduce","acc","getProjectNodeVersionDefault","currentNodeVersion","process","versions","node","split","type","Array","isArray","choices","choice","find","value"],"mappings":";;AAGA;;;IAIO,SAASA,2BAAAA,CACdC,YAIE,EAAA;AAEF,IAAA,OAAO,CACLC,SAAAA,GAAAA;QAEA,OAAOA,SAAAA,CAAUC,GAAG,CAAC,CAACC,QAAAA,GAAAA;YACpB,MAAMC,YAAAA,GAAeD,SAASE,IAAI;;AAGlC,YAAA,IAAID,gBAAgBJ,YAAAA,EAAc;gBAChC,MAAMM,eAAAA,GAAkBN,YAAY,CAACI,YAAAA,CAAa;;gBAGlD,IAAI,OAAOE,oBAAoB,UAAA,EAAY;oBACzC,OAAO;AACL,wBAAA,GAAGH,QAAQ;AACXI,wBAAAA,OAAAA,EAASD,eAAAA,CAAgBH,QAAAA;AAC3B,qBAAA;AACF,gBAAA;;gBAEA,OAAO;AACL,oBAAA,GAAGA,QAAQ;oBACXI,OAAAA,EAASD;AACX,iBAAA;AACF,YAAA;;YAEA,OAAOH,QAAAA;AACT,QAAA,CAAA,CAAA;AACF,IAAA,CAAA;AACF;AAEA;;;IAIO,SAASK,wBAAAA,CACdP,SAA0D,EAAA;AAE1D,IAAA,OAAOA,SAAAA,CAAUQ,MAAM,CAAC,CAACC,GAAAA,EAAKP,QAAAA,GAAAA;AAC5B,QAAA,IAAIA,QAAAA,CAASI,OAAO,IAAIJ,QAAAA,CAASE,IAAI,EAAE;YACrC,OAAO;AAAE,gBAAA,GAAGK,GAAG;AAAE,gBAAA,CAACP,QAAAA,CAASE,IAAI,GAAGF,SAASI;AAAQ,aAAA;AACrD,QAAA;QACA,OAAOG,GAAAA;AACT,IAAA,CAAA,EAAG,EAAC,CAAA;AACN;AAEA;;;IAIO,SAASC,4BAAAA,CAA6BR,QAA0C,EAAA;IACrF,MAAMS,kBAAAA,GAAqBC,OAAAA,CAAQC,QAAQ,CAACC,IAAI,CAACC,KAAK,CAAC,GAAA,CAAI,CAAC,CAAA,CAAE;;IAG9D,IAAIb,QAAAA,CAASc,IAAI,KAAK,MAAA,IAAUC,MAAMC,OAAO,CAAChB,QAAAA,CAASiB,OAAO,CAAA,EAAG;QAC/D,MAAMC,MAAAA,GAASlB,QAAAA,CAASiB,OAAO,CAACE,IAAI,CAAC,CAACD,MAAAA,GAAWA,MAAAA,CAAOE,KAAK,KAAKX,kBAAAA,CAAAA;AAClE,QAAA,IAAIS,MAAAA,EAAQ;AACV,YAAA,OAAOA,OAAOE,KAAK;AACrB,QAAA;AACF,IAAA;AACA,IAAA,OAAOpB,SAASI,OAAO;AACzB;;;;;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"project-questions.utils.mjs","sources":["../../../src/create-project/utils/project-questions.utils.ts"],"sourcesContent":["import { DistinctQuestion } from 'inquirer';\nimport type { ProjectAnswers } from '../../types';\n\n/**\n * Apply default values to questions based on the provided mapper\n * @param questionsMap - A partial object with keys matching the ProjectAnswers keys and values being the default value or a function to get the default value\n */\nexport function questionDefaultValuesMapper(\n questionsMap: Partial<{\n [K in keyof ProjectAnswers]:\n | ((question: DistinctQuestion<ProjectAnswers>) => ProjectAnswers[K])\n | ProjectAnswers[K];\n }>\n) {\n return (\n questions: ReadonlyArray<DistinctQuestion<ProjectAnswers>>\n ): ReadonlyArray<DistinctQuestion<ProjectAnswers>> => {\n return questions.map((question) => {\n const questionName = question.name as keyof ProjectAnswers;\n\n // If the question is part of the mapper, apply the default value\n if (questionName in questionsMap) {\n const questionDefault = questionsMap[questionName];\n\n // If the default value is a function, call it with the question and get the default value\n if (typeof questionDefault === 'function') {\n return {\n ...question,\n default: questionDefault(question),\n };\n }\n // else we consider it as a static value\n return {\n ...question,\n default: questionDefault,\n };\n }\n // If the question is not part of the mapper, return the question as is\n return question;\n });\n };\n}\n\n/**\n * Get default values from questions\n * @param questions - An array of questions for project creation\n */\nexport function getDefaultsFromQuestions(\n questions: ReadonlyArray<DistinctQuestion<ProjectAnswers>>\n): Partial<ProjectAnswers> {\n return questions.reduce((acc, question) => {\n if (question.default && question.name) {\n return { ...acc, [question.name]: question.default };\n }\n return acc;\n }, {});\n}\n\n/**\n * Get the default node version based on the current node version if it is in the list of choices\n * @param question - The question for the node version in project creation\n */\nexport function getProjectNodeVersionDefault(question: DistinctQuestion<ProjectAnswers>): string {\n const currentNodeVersion = process.versions.node.split('.')[0];\n\n // Node Version question is set up as a list, but the type of inquirer is dynamic and the question can change in the future (it comes from API)\n if (question.type === 'list' && Array.isArray(question.choices)) {\n const choice = question.choices.find((choice) => choice.value === currentNodeVersion);\n if (choice) {\n return choice.value;\n }\n }\n return question.default;\n}\n"],"names":["questionDefaultValuesMapper","questionsMap","questions","map","question","questionName","name","questionDefault","default","getDefaultsFromQuestions","reduce","acc","getProjectNodeVersionDefault","currentNodeVersion","process","versions","node","split","type","Array","isArray","choices","choice","find","value"],"mappings":"AAGA;;;IAIO,SAASA,2BAAAA,CACdC,YAIE,EAAA;AAEF,IAAA,OAAO,CACLC,SAAAA,GAAAA;QAEA,OAAOA,SAAAA,CAAUC,GAAG,CAAC,CAACC,QAAAA,GAAAA;YACpB,MAAMC,YAAAA,GAAeD,SAASE,IAAI;;AAGlC,YAAA,IAAID,gBAAgBJ,YAAAA,EAAc;gBAChC,MAAMM,eAAAA,GAAkBN,YAAY,CAACI,YAAAA,CAAa;;gBAGlD,IAAI,OAAOE,oBAAoB,UAAA,EAAY;oBACzC,OAAO;AACL,wBAAA,GAAGH,QAAQ;AACXI,wBAAAA,OAAAA,EAASD,eAAAA,CAAgBH,QAAAA;AAC3B,qBAAA;AACF,gBAAA;;gBAEA,OAAO;AACL,oBAAA,GAAGA,QAAQ;oBACXI,OAAAA,EAASD;AACX,iBAAA;AACF,YAAA;;YAEA,OAAOH,QAAAA;AACT,QAAA,CAAA,CAAA;AACF,IAAA,CAAA;AACF;AAEA;;;IAIO,SAASK,wBAAAA,CACdP,SAA0D,EAAA;AAE1D,IAAA,OAAOA,SAAAA,CAAUQ,MAAM,CAAC,CAACC,GAAAA,EAAKP,QAAAA,GAAAA;AAC5B,QAAA,IAAIA,QAAAA,CAASI,OAAO,IAAIJ,QAAAA,CAASE,IAAI,EAAE;YACrC,OAAO;AAAE,gBAAA,GAAGK,GAAG;AAAE,gBAAA,CAACP,QAAAA,CAASE,IAAI,GAAGF,SAASI;AAAQ,aAAA;AACrD,QAAA;QACA,OAAOG,GAAAA;AACT,IAAA,CAAA,EAAG,EAAC,CAAA;AACN;AAEA;;;IAIO,SAASC,4BAAAA,CAA6BR,QAA0C,EAAA;IACrF,MAAMS,kBAAAA,GAAqBC,OAAAA,CAAQC,QAAQ,CAACC,IAAI,CAACC,KAAK,CAAC,GAAA,CAAI,CAAC,CAAA,CAAE;;IAG9D,IAAIb,QAAAA,CAASc,IAAI,KAAK,MAAA,IAAUC,MAAMC,OAAO,CAAChB,QAAAA,CAASiB,OAAO,CAAA,EAAG;QAC/D,MAAMC,MAAAA,GAASlB,QAAAA,CAASiB,OAAO,CAACE,IAAI,CAAC,CAACD,MAAAA,GAAWA,MAAAA,CAAOE,KAAK,KAAKX,kBAAAA,CAAAA;AAClE,QAAA,IAAIS,MAAAA,EAAQ;AACV,YAAA,OAAOA,OAAOE,KAAK;AACrB,QAAA;AACF,IAAA;AACA,IAAA,OAAOpB,SAASI,OAAO;AACzB;;;;"}
|
|
1
|
+
{"version":3,"file":"project-questions.utils.mjs","sources":["../../../src/create-project/utils/project-questions.utils.ts"],"sourcesContent":["import type { DistinctQuestion } from 'inquirer';\nimport type { ProjectAnswers } from '../../types';\n\n/**\n * Apply default values to questions based on the provided mapper\n * @param questionsMap - A partial object with keys matching the ProjectAnswers keys and values being the default value or a function to get the default value\n */\nexport function questionDefaultValuesMapper(\n questionsMap: Partial<{\n [K in keyof ProjectAnswers]:\n | ((question: DistinctQuestion<ProjectAnswers>) => ProjectAnswers[K])\n | ProjectAnswers[K];\n }>\n) {\n return (\n questions: ReadonlyArray<DistinctQuestion<ProjectAnswers>>\n ): ReadonlyArray<DistinctQuestion<ProjectAnswers>> => {\n return questions.map((question) => {\n const questionName = question.name as keyof ProjectAnswers;\n\n // If the question is part of the mapper, apply the default value\n if (questionName in questionsMap) {\n const questionDefault = questionsMap[questionName];\n\n // If the default value is a function, call it with the question and get the default value\n if (typeof questionDefault === 'function') {\n return {\n ...question,\n default: questionDefault(question),\n };\n }\n // else we consider it as a static value\n return {\n ...question,\n default: questionDefault,\n };\n }\n // If the question is not part of the mapper, return the question as is\n return question;\n });\n };\n}\n\n/**\n * Get default values from questions\n * @param questions - An array of questions for project creation\n */\nexport function getDefaultsFromQuestions(\n questions: ReadonlyArray<DistinctQuestion<ProjectAnswers>>\n): Partial<ProjectAnswers> {\n return questions.reduce((acc, question) => {\n if (question.default && question.name) {\n return { ...acc, [question.name]: question.default };\n }\n return acc;\n }, {});\n}\n\n/**\n * Get the default node version based on the current node version if it is in the list of choices\n * @param question - The question for the node version in project creation\n */\nexport function getProjectNodeVersionDefault(question: DistinctQuestion<ProjectAnswers>): string {\n const currentNodeVersion = process.versions.node.split('.')[0];\n\n // Node Version question is set up as a list, but the type of inquirer is dynamic and the question can change in the future (it comes from API)\n if (question.type === 'list' && Array.isArray(question.choices)) {\n const choice = question.choices.find((choice) => choice.value === currentNodeVersion);\n if (choice) {\n return choice.value;\n }\n }\n return question.default;\n}\n"],"names":["questionDefaultValuesMapper","questionsMap","questions","map","question","questionName","name","questionDefault","default","getDefaultsFromQuestions","reduce","acc","getProjectNodeVersionDefault","currentNodeVersion","process","versions","node","split","type","Array","isArray","choices","choice","find","value"],"mappings":"AAGA;;;IAIO,SAASA,2BAAAA,CACdC,YAIE,EAAA;AAEF,IAAA,OAAO,CACLC,SAAAA,GAAAA;QAEA,OAAOA,SAAAA,CAAUC,GAAG,CAAC,CAACC,QAAAA,GAAAA;YACpB,MAAMC,YAAAA,GAAeD,SAASE,IAAI;;AAGlC,YAAA,IAAID,gBAAgBJ,YAAAA,EAAc;gBAChC,MAAMM,eAAAA,GAAkBN,YAAY,CAACI,YAAAA,CAAa;;gBAGlD,IAAI,OAAOE,oBAAoB,UAAA,EAAY;oBACzC,OAAO;AACL,wBAAA,GAAGH,QAAQ;AACXI,wBAAAA,OAAAA,EAASD,eAAAA,CAAgBH,QAAAA;AAC3B,qBAAA;AACF,gBAAA;;gBAEA,OAAO;AACL,oBAAA,GAAGA,QAAQ;oBACXI,OAAAA,EAASD;AACX,iBAAA;AACF,YAAA;;YAEA,OAAOH,QAAAA;AACT,QAAA,CAAA,CAAA;AACF,IAAA,CAAA;AACF;AAEA;;;IAIO,SAASK,wBAAAA,CACdP,SAA0D,EAAA;AAE1D,IAAA,OAAOA,SAAAA,CAAUQ,MAAM,CAAC,CAACC,GAAAA,EAAKP,QAAAA,GAAAA;AAC5B,QAAA,IAAIA,QAAAA,CAASI,OAAO,IAAIJ,QAAAA,CAASE,IAAI,EAAE;YACrC,OAAO;AAAE,gBAAA,GAAGK,GAAG;AAAE,gBAAA,CAACP,QAAAA,CAASE,IAAI,GAAGF,SAASI;AAAQ,aAAA;AACrD,QAAA;QACA,OAAOG,GAAAA;AACT,IAAA,CAAA,EAAG,EAAC,CAAA;AACN;AAEA;;;IAIO,SAASC,4BAAAA,CAA6BR,QAA0C,EAAA;IACrF,MAAMS,kBAAAA,GAAqBC,OAAAA,CAAQC,QAAQ,CAACC,IAAI,CAACC,KAAK,CAAC,GAAA,CAAI,CAAC,CAAA,CAAE;;IAG9D,IAAIb,QAAAA,CAASc,IAAI,KAAK,MAAA,IAAUC,MAAMC,OAAO,CAAChB,QAAAA,CAASiB,OAAO,CAAA,EAAG;QAC/D,MAAMC,MAAAA,GAASlB,QAAAA,CAASiB,OAAO,CAACE,IAAI,CAAC,CAACD,MAAAA,GAAWA,MAAAA,CAAOE,KAAK,KAAKX,kBAAAA,CAAAA;AAClE,QAAA,IAAIS,MAAAA,EAAQ;AACV,YAAA,OAAOA,OAAOE,KAAK;AACrB,QAAA;AACF,IAAA;AACA,IAAA,OAAOpB,SAASI,OAAO;AACzB;;;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"action.d.ts","sourceRoot":"","sources":["../../src/deploy-project/action.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"action.d.ts","sourceRoot":"","sources":["../../src/deploy-project/action.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EACV,UAAU,EAKX,MAAM,UAAU,CAAC;AAqBlB,UAAU,UAAU;IAClB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;8BAkO0B,UAAU,QAAQ,UAAU;AAAvD,wBA+IE"}
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
3
|
var fse = require('fs-extra');
|
|
4
|
-
var inquirer = require('inquirer');
|
|
5
4
|
var boxen = require('boxen');
|
|
6
5
|
var path = require('path');
|
|
7
6
|
var chalk = require('chalk');
|
|
@@ -52,6 +51,7 @@ const boxenOptions = {
|
|
|
52
51
|
};
|
|
53
52
|
const QUIT_OPTION = 'Quit';
|
|
54
53
|
async function promptForEnvironment(environments) {
|
|
54
|
+
const { default: inquirer } = await import('inquirer');
|
|
55
55
|
const choices = environments.map((env)=>({
|
|
56
56
|
name: env,
|
|
57
57
|
value: env
|
|
@@ -277,6 +277,7 @@ var action = (async (ctx, opts)=>{
|
|
|
277
277
|
const shouldDisplayWarning = hasPendingOrLiveDeployment(environmentsDetails, project.targetEnvironment);
|
|
278
278
|
if (shouldDisplayWarning) {
|
|
279
279
|
ctx.logger.log(boxen(cliConfig.projectDeployment.confirmationText, boxenOptions));
|
|
280
|
+
const { default: inquirer } = await import('inquirer');
|
|
280
281
|
const { confirm } = await inquirer.prompt([
|
|
281
282
|
{
|
|
282
283
|
type: 'confirm',
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"action.js","sources":["../../src/deploy-project/action.ts"],"sourcesContent":["import fse from 'fs-extra';\nimport inquirer from 'inquirer';\nimport boxen from 'boxen';\nimport path from 'path';\nimport chalk from 'chalk';\nimport { AxiosError } from 'axios';\nimport * as crypto from 'node:crypto';\nimport { apiConfig } from '../config/api';\nimport { compressFilesToTar } from '../utils/compress-files';\nimport createProjectAction from '../create-project/action';\nimport type {\n CLIContext,\n CloudApiService,\n CloudCliConfig,\n EnvironmentDetails,\n ProjectInfo,\n} from '../types';\nimport { getTmpStoragePath } from '../config/local';\nimport { cloudApiFactory, tokenServiceFactory, local } from '../services';\nimport { VERSION } from '../services/cli-api';\nimport { notificationServiceFactory } from '../services/notification';\nimport { loadPkg } from '../utils/pkg';\nimport { buildLogsServiceFactory } from '../services/build-logs';\nimport { promptLogin } from '../login/action';\nimport { trackEvent } from '../utils/analytics';\nimport {\n environmentCreationErrorFactory,\n environmentErrorMessageFactory,\n} from '../utils/error-message-factories';\n\ntype PackageJson = {\n name: string;\n strapi?: {\n uuid: string;\n };\n};\n\ninterface CmdOptions {\n env?: string;\n force?: boolean;\n}\n\nconst boxenOptions: boxen.Options = {\n padding: 1,\n margin: 1,\n align: 'center',\n borderColor: 'yellow',\n borderStyle: 'round',\n};\n\nconst QUIT_OPTION = 'Quit';\n\nasync function promptForEnvironment(environments: string[]): Promise<string> {\n const choices = environments.map((env) => ({ name: env, value: env }));\n const { selectedEnvironment } = await inquirer.prompt([\n {\n type: 'list',\n name: 'selectedEnvironment',\n message: 'Select the environment to deploy:',\n choices: [...choices, { name: chalk.grey(`(${QUIT_OPTION})`), value: null }],\n },\n ]);\n if (selectedEnvironment === null) {\n process.exit(1);\n }\n\n return selectedEnvironment;\n}\n\nasync function upload(\n ctx: CLIContext,\n project: Omit<ProjectInfo, 'id'>,\n cliConfig: CloudCliConfig,\n token: string,\n maxProjectFileSize: number\n) {\n const cloudApi = await cloudApiFactory(ctx, token);\n try {\n const storagePath = await getTmpStoragePath();\n const projectFolder = path.resolve(process.cwd());\n const packageJson = (await loadPkg(ctx)) as PackageJson;\n\n if (!packageJson) {\n ctx.logger.error(\n 'Unable to deploy the project. Please make sure the package.json file is correctly formatted.'\n );\n return;\n }\n\n const compressSpinner = ctx.logger.spinner('Compressing project...').start();\n compressSpinner.indent = 1;\n // hash packageJson.name to avoid conflicts\n const hashname = crypto.createHash('sha512').update(packageJson.name).digest('hex');\n const compressedFilename = `${hashname}.tar.gz`;\n try {\n ctx.logger.debug(\n 'Compression parameters\\n',\n `Storage path: ${storagePath}\\n`,\n `Project folder: ${projectFolder}\\n`,\n `Compressed filename: ${compressedFilename}`\n );\n await compressFilesToTar(storagePath, projectFolder, compressedFilename);\n compressSpinner.succeed(`Project compressed successfully!`);\n } catch (e: unknown) {\n compressSpinner.fail(\n 'Project compression failed. Try again later or check for large/incompatible files.'\n );\n ctx.logger.debug(e);\n process.exit(1);\n }\n\n const tarFilePath = path.resolve(storagePath, compressedFilename);\n const fileStats = await fse.stat(tarFilePath);\n\n if (fileStats.size > maxProjectFileSize) {\n ctx.logger.log(\n 'Unable to proceed: Your project is too big to be transferred, please use a git repo instead.'\n );\n try {\n await fse.remove(tarFilePath);\n } catch (e: any) {\n ctx.logger.log('Unable to remove file: ', tarFilePath);\n ctx.logger.debug(e);\n }\n return;\n }\n\n const progressBar = ctx.logger.progressBar(100, ' ∷ Uploading project');\n\n try {\n const { data } = await cloudApi.deploy(\n { filePath: tarFilePath, project },\n {\n onUploadProgress(progressEvent) {\n const total = progressEvent.total || fileStats.size;\n const percentage = Math.round((progressEvent.loaded * 100) / total);\n progressBar.update(percentage);\n },\n }\n );\n\n progressBar.update(100);\n progressBar.stop();\n ctx.logger.log(`${chalk.green.bold('✔')} Upload finished!\\n`);\n return data.build_id;\n } catch (e: any) {\n progressBar.stop();\n await handleUploadError(ctx, e, project, cliConfig);\n } finally {\n await fse.remove(tarFilePath);\n }\n process.exit(0);\n } catch (e: any) {\n ctx.logger.error('An error occurred while deploying the project. Please try again later.');\n ctx.logger.debug(e);\n process.exit(1);\n }\n}\n\nasync function handleUploadError(\n ctx: CLIContext,\n error: any,\n project: any,\n cliConfig: CloudCliConfig\n) {\n const { logger } = ctx;\n logger.debug(error);\n\n if (error.response?.status) {\n switch (error.response.status) {\n case 405: {\n const environmentErrorMessage = environmentErrorMessageFactory({\n projectName: project.name,\n firstLine: cliConfig.projectDeployment.errors.environmentNotReady.firstLine,\n secondLine: cliConfig.projectDeployment.errors.environmentNotReady.secondLine,\n });\n logger.log(environmentCreationErrorFactory(environmentErrorMessage));\n return;\n }\n case 413:\n logger.error(\n 'The project you are trying to upload is too big. Please remove unnecessary files and try again.'\n );\n return;\n default:\n break;\n }\n }\n logger.error('An error occurred while deploying the project. Please try again later.');\n}\n\nasync function getProject(ctx: CLIContext) {\n const { project } = await local.retrieve();\n if (!project) {\n try {\n const projectResponse = await createProjectAction(ctx);\n if (projectResponse) {\n const { project: projectSaved } = await local.retrieve();\n return projectSaved;\n }\n } catch (e: any) {\n ctx.logger.error('An error occurred while deploying the project. Please try again later.');\n ctx.logger.debug(e);\n process.exit(1);\n }\n }\n return project;\n}\n\nasync function getConfig({\n ctx,\n cloudApiService,\n}: {\n ctx: CLIContext;\n cloudApiService: CloudApiService;\n}): Promise<CloudCliConfig | null> {\n try {\n const { data: cliConfig } = await cloudApiService.config();\n return cliConfig;\n } catch (e) {\n ctx.logger.debug('Failed to get cli config', e);\n return null;\n }\n}\n\nfunction validateEnvironment(ctx: CLIContext, environment: string, environments: string[]): void {\n if (!environments.includes(environment)) {\n ctx.logger.error(`Environment ${environment} does not exist.`);\n process.exit(1);\n }\n}\n\nasync function getTargetEnvironment(\n ctx: CLIContext,\n opts: CmdOptions,\n project: Omit<ProjectInfo, 'id'>,\n environments: string[]\n): Promise<string> {\n if (opts.env) {\n validateEnvironment(ctx, opts.env, environments);\n return opts.env;\n }\n\n if (project.targetEnvironment) {\n return project.targetEnvironment;\n }\n\n if (environments.length > 1) {\n return promptForEnvironment(environments);\n }\n\n return environments[0];\n}\n\nfunction hasPendingOrLiveDeployment(\n environments: EnvironmentDetails[],\n targetEnvironment: string\n): boolean {\n const environment = environments.find((env) => env.name === targetEnvironment);\n if (!environment) {\n throw new Error(`Environment details ${targetEnvironment} not found.`);\n }\n return environment.hasPendingDeployment || environment.hasLiveDeployment || false;\n}\n\nexport default async (ctx: CLIContext, opts: CmdOptions) => {\n const { getValidToken } = await tokenServiceFactory(ctx);\n const token = await getValidToken(ctx, promptLogin);\n if (!token) {\n return;\n }\n\n const project = await getProject(ctx);\n if (!project) {\n process.exit(1);\n }\n\n const cloudApiService = await cloudApiFactory(ctx, token);\n let projectData;\n let environments: string[];\n let environmentsDetails: EnvironmentDetails[];\n\n try {\n const {\n data: { data, metadata },\n } = await cloudApiService.getProject({ name: project.name });\n projectData = data;\n environments = projectData.environments;\n environmentsDetails = projectData.environmentsDetails;\n const isProjectSuspended = projectData.suspendedAt;\n\n if (isProjectSuspended) {\n ctx.logger.log(\n '\\n Oops! This project has been suspended. \\n\\n Please reactivate it from the dashboard to continue deploying: '\n );\n ctx.logger.log(chalk.underline(`${metadata.dashboardUrls.project}`));\n return;\n }\n } catch (e: Error | unknown) {\n if (e instanceof AxiosError && e.response?.data) {\n if (e.response.status === 404) {\n ctx.logger.warn(\n `The project associated with this folder does not exist in Strapi Cloud. \\nPlease link your local project to an existing Strapi Cloud project using the ${chalk.cyan(\n 'link'\n )} command before deploying.`\n );\n } else {\n ctx.logger.error(e.response.data);\n }\n } else {\n ctx.logger.error(\n \"An error occurred while retrieving the project's information. Please try again later.\"\n );\n }\n ctx.logger.debug(e);\n return;\n }\n\n await trackEvent(ctx, cloudApiService, 'willDeployWithCLI', {\n projectInternalName: project.name,\n });\n\n const notificationService = notificationServiceFactory(ctx);\n const buildLogsService = buildLogsServiceFactory(ctx);\n\n const cliConfig = await getConfig({ ctx, cloudApiService });\n if (!cliConfig) {\n ctx.logger.error(\n 'An error occurred while retrieving data from Strapi Cloud. Please check your network or try again later.'\n );\n return;\n }\n\n let maxSize: number = parseInt(cliConfig.maxProjectFileSize, 10);\n if (Number.isNaN(maxSize)) {\n ctx.logger.debug(\n 'An error occurred while parsing the maxProjectFileSize. Using default value.'\n );\n maxSize = 100000000;\n }\n\n project.targetEnvironment = await getTargetEnvironment(ctx, opts, project, environments);\n\n if (!opts.force) {\n const shouldDisplayWarning = hasPendingOrLiveDeployment(\n environmentsDetails,\n project.targetEnvironment\n );\n if (shouldDisplayWarning) {\n ctx.logger.log(boxen(cliConfig.projectDeployment.confirmationText, boxenOptions));\n const { confirm } = await inquirer.prompt([\n {\n type: 'confirm',\n name: 'confirm',\n message: `Do you want to proceed with deployment to ${chalk.cyan(projectData.displayName)} on ${chalk.cyan(project.targetEnvironment)} environment?`,\n },\n ]);\n if (!confirm) {\n process.exit(1);\n }\n }\n }\n\n const buildId = await upload(ctx, project, cliConfig, token, maxSize);\n\n if (!buildId) {\n return;\n }\n\n let notifications: ReturnType<typeof notificationService> | null = null;\n\n try {\n ctx.logger.log(\n `∷ Deploying project to ${chalk.cyan(project.targetEnvironment ?? `production`)} environment...`\n );\n\n notifications = notificationService(\n `${apiConfig.apiBaseUrl}/${VERSION}/notifications`,\n token,\n cliConfig\n );\n\n await buildLogsService(`${apiConfig.apiBaseUrl}/${VERSION}/logs/${buildId}`, token, cliConfig);\n const dashboardUrlLine =\n chalk.cyan(' → ') +\n chalk.cyan.underline(`${apiConfig.dashboardBaseUrl}/projects/${project.name}/deployments`);\n ctx.logger.log(\n boxen(`Project and deployment logs ready at:\\n${dashboardUrlLine}`, {\n padding: 1,\n margin: 1,\n borderStyle: 'round',\n borderColor: 'white',\n titleAlignment: 'left',\n })\n );\n } catch (e: Error | unknown) {\n ctx.logger.debug(e);\n if (e instanceof Error) {\n ctx.logger.error(e.message);\n } else {\n ctx.logger.error('An error occurred while deploying the project. Please try again later.');\n }\n } finally {\n if (notifications) {\n notifications.close();\n }\n }\n};\n"],"names":["boxenOptions","padding","margin","align","borderColor","borderStyle","QUIT_OPTION","promptForEnvironment","environments","choices","map","env","name","value","selectedEnvironment","inquirer","prompt","type","message","chalk","grey","process","exit","upload","ctx","project","cliConfig","token","maxProjectFileSize","cloudApi","cloudApiFactory","storagePath","getTmpStoragePath","projectFolder","path","resolve","cwd","packageJson","loadPkg","logger","error","compressSpinner","spinner","start","indent","hashname","crypto","createHash","update","digest","compressedFilename","debug","compressFilesToTar","succeed","e","fail","tarFilePath","fileStats","fse","stat","size","log","remove","progressBar","data","deploy","filePath","onUploadProgress","progressEvent","total","percentage","Math","round","loaded","stop","green","bold","build_id","handleUploadError","response","status","environmentErrorMessage","environmentErrorMessageFactory","projectName","firstLine","projectDeployment","errors","environmentNotReady","secondLine","environmentCreationErrorFactory","getProject","local","projectResponse","createProjectAction","projectSaved","getConfig","cloudApiService","config","validateEnvironment","environment","includes","getTargetEnvironment","opts","targetEnvironment","length","hasPendingOrLiveDeployment","find","Error","hasPendingDeployment","hasLiveDeployment","getValidToken","tokenServiceFactory","promptLogin","projectData","environmentsDetails","metadata","isProjectSuspended","suspendedAt","underline","dashboardUrls","AxiosError","warn","cyan","trackEvent","projectInternalName","notificationService","notificationServiceFactory","buildLogsService","buildLogsServiceFactory","maxSize","parseInt","Number","isNaN","force","shouldDisplayWarning","boxen","confirmationText","confirm","displayName","buildId","notifications","apiConfig","apiBaseUrl","VERSION","dashboardUrlLine","dashboardBaseUrl","titleAlignment","close"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"action.js","sources":["../../src/deploy-project/action.ts"],"sourcesContent":["import fse from 'fs-extra';\nimport boxen from 'boxen';\nimport path from 'path';\nimport chalk from 'chalk';\nimport { AxiosError } from 'axios';\nimport * as crypto from 'node:crypto';\nimport { apiConfig } from '../config/api';\nimport { compressFilesToTar } from '../utils/compress-files';\nimport createProjectAction from '../create-project/action';\nimport type {\n CLIContext,\n CloudApiService,\n CloudCliConfig,\n EnvironmentDetails,\n ProjectInfo,\n} from '../types';\nimport { getTmpStoragePath } from '../config/local';\nimport { cloudApiFactory, tokenServiceFactory, local } from '../services';\nimport { VERSION } from '../services/cli-api';\nimport { notificationServiceFactory } from '../services/notification';\nimport { loadPkg } from '../utils/pkg';\nimport { buildLogsServiceFactory } from '../services/build-logs';\nimport { promptLogin } from '../login/action';\nimport { trackEvent } from '../utils/analytics';\nimport {\n environmentCreationErrorFactory,\n environmentErrorMessageFactory,\n} from '../utils/error-message-factories';\n\ntype PackageJson = {\n name: string;\n strapi?: {\n uuid: string;\n };\n};\n\ninterface CmdOptions {\n env?: string;\n force?: boolean;\n}\n\nconst boxenOptions: boxen.Options = {\n padding: 1,\n margin: 1,\n align: 'center',\n borderColor: 'yellow',\n borderStyle: 'round',\n};\n\nconst QUIT_OPTION = 'Quit';\n\nasync function promptForEnvironment(environments: string[]): Promise<string> {\n const { default: inquirer } = await import('inquirer');\n const choices = environments.map((env) => ({ name: env, value: env }));\n const { selectedEnvironment } = await inquirer.prompt([\n {\n type: 'list',\n name: 'selectedEnvironment',\n message: 'Select the environment to deploy:',\n choices: [...choices, { name: chalk.grey(`(${QUIT_OPTION})`), value: null }],\n },\n ]);\n if (selectedEnvironment === null) {\n process.exit(1);\n }\n\n return selectedEnvironment;\n}\n\nasync function upload(\n ctx: CLIContext,\n project: Omit<ProjectInfo, 'id'>,\n cliConfig: CloudCliConfig,\n token: string,\n maxProjectFileSize: number\n) {\n const cloudApi = await cloudApiFactory(ctx, token);\n try {\n const storagePath = await getTmpStoragePath();\n const projectFolder = path.resolve(process.cwd());\n const packageJson = (await loadPkg(ctx)) as PackageJson;\n\n if (!packageJson) {\n ctx.logger.error(\n 'Unable to deploy the project. Please make sure the package.json file is correctly formatted.'\n );\n return;\n }\n\n const compressSpinner = ctx.logger.spinner('Compressing project...').start();\n compressSpinner.indent = 1;\n // hash packageJson.name to avoid conflicts\n const hashname = crypto.createHash('sha512').update(packageJson.name).digest('hex');\n const compressedFilename = `${hashname}.tar.gz`;\n try {\n ctx.logger.debug(\n 'Compression parameters\\n',\n `Storage path: ${storagePath}\\n`,\n `Project folder: ${projectFolder}\\n`,\n `Compressed filename: ${compressedFilename}`\n );\n await compressFilesToTar(storagePath, projectFolder, compressedFilename);\n compressSpinner.succeed(`Project compressed successfully!`);\n } catch (e: unknown) {\n compressSpinner.fail(\n 'Project compression failed. Try again later or check for large/incompatible files.'\n );\n ctx.logger.debug(e);\n process.exit(1);\n }\n\n const tarFilePath = path.resolve(storagePath, compressedFilename);\n const fileStats = await fse.stat(tarFilePath);\n\n if (fileStats.size > maxProjectFileSize) {\n ctx.logger.log(\n 'Unable to proceed: Your project is too big to be transferred, please use a git repo instead.'\n );\n try {\n await fse.remove(tarFilePath);\n } catch (e: any) {\n ctx.logger.log('Unable to remove file: ', tarFilePath);\n ctx.logger.debug(e);\n }\n return;\n }\n\n const progressBar = ctx.logger.progressBar(100, ' ∷ Uploading project');\n\n try {\n const { data } = await cloudApi.deploy(\n { filePath: tarFilePath, project },\n {\n onUploadProgress(progressEvent) {\n const total = progressEvent.total || fileStats.size;\n const percentage = Math.round((progressEvent.loaded * 100) / total);\n progressBar.update(percentage);\n },\n }\n );\n\n progressBar.update(100);\n progressBar.stop();\n ctx.logger.log(`${chalk.green.bold('✔')} Upload finished!\\n`);\n return data.build_id;\n } catch (e: any) {\n progressBar.stop();\n await handleUploadError(ctx, e, project, cliConfig);\n } finally {\n await fse.remove(tarFilePath);\n }\n process.exit(0);\n } catch (e: any) {\n ctx.logger.error('An error occurred while deploying the project. Please try again later.');\n ctx.logger.debug(e);\n process.exit(1);\n }\n}\n\nasync function handleUploadError(\n ctx: CLIContext,\n error: any,\n project: any,\n cliConfig: CloudCliConfig\n) {\n const { logger } = ctx;\n logger.debug(error);\n\n if (error.response?.status) {\n switch (error.response.status) {\n case 405: {\n const environmentErrorMessage = environmentErrorMessageFactory({\n projectName: project.name,\n firstLine: cliConfig.projectDeployment.errors.environmentNotReady.firstLine,\n secondLine: cliConfig.projectDeployment.errors.environmentNotReady.secondLine,\n });\n logger.log(environmentCreationErrorFactory(environmentErrorMessage));\n return;\n }\n case 413:\n logger.error(\n 'The project you are trying to upload is too big. Please remove unnecessary files and try again.'\n );\n return;\n default:\n break;\n }\n }\n logger.error('An error occurred while deploying the project. Please try again later.');\n}\n\nasync function getProject(ctx: CLIContext) {\n const { project } = await local.retrieve();\n if (!project) {\n try {\n const projectResponse = await createProjectAction(ctx);\n if (projectResponse) {\n const { project: projectSaved } = await local.retrieve();\n return projectSaved;\n }\n } catch (e: any) {\n ctx.logger.error('An error occurred while deploying the project. Please try again later.');\n ctx.logger.debug(e);\n process.exit(1);\n }\n }\n return project;\n}\n\nasync function getConfig({\n ctx,\n cloudApiService,\n}: {\n ctx: CLIContext;\n cloudApiService: CloudApiService;\n}): Promise<CloudCliConfig | null> {\n try {\n const { data: cliConfig } = await cloudApiService.config();\n return cliConfig;\n } catch (e) {\n ctx.logger.debug('Failed to get cli config', e);\n return null;\n }\n}\n\nfunction validateEnvironment(ctx: CLIContext, environment: string, environments: string[]): void {\n if (!environments.includes(environment)) {\n ctx.logger.error(`Environment ${environment} does not exist.`);\n process.exit(1);\n }\n}\n\nasync function getTargetEnvironment(\n ctx: CLIContext,\n opts: CmdOptions,\n project: Omit<ProjectInfo, 'id'>,\n environments: string[]\n): Promise<string> {\n if (opts.env) {\n validateEnvironment(ctx, opts.env, environments);\n return opts.env;\n }\n\n if (project.targetEnvironment) {\n return project.targetEnvironment;\n }\n\n if (environments.length > 1) {\n return promptForEnvironment(environments);\n }\n\n return environments[0];\n}\n\nfunction hasPendingOrLiveDeployment(\n environments: EnvironmentDetails[],\n targetEnvironment: string\n): boolean {\n const environment = environments.find((env) => env.name === targetEnvironment);\n if (!environment) {\n throw new Error(`Environment details ${targetEnvironment} not found.`);\n }\n return environment.hasPendingDeployment || environment.hasLiveDeployment || false;\n}\n\nexport default async (ctx: CLIContext, opts: CmdOptions) => {\n const { getValidToken } = await tokenServiceFactory(ctx);\n const token = await getValidToken(ctx, promptLogin);\n if (!token) {\n return;\n }\n\n const project = await getProject(ctx);\n if (!project) {\n process.exit(1);\n }\n\n const cloudApiService = await cloudApiFactory(ctx, token);\n let projectData;\n let environments: string[];\n let environmentsDetails: EnvironmentDetails[];\n\n try {\n const {\n data: { data, metadata },\n } = await cloudApiService.getProject({ name: project.name });\n projectData = data;\n environments = projectData.environments;\n environmentsDetails = projectData.environmentsDetails;\n const isProjectSuspended = projectData.suspendedAt;\n\n if (isProjectSuspended) {\n ctx.logger.log(\n '\\n Oops! This project has been suspended. \\n\\n Please reactivate it from the dashboard to continue deploying: '\n );\n ctx.logger.log(chalk.underline(`${metadata.dashboardUrls.project}`));\n return;\n }\n } catch (e: Error | unknown) {\n if (e instanceof AxiosError && e.response?.data) {\n if (e.response.status === 404) {\n ctx.logger.warn(\n `The project associated with this folder does not exist in Strapi Cloud. \\nPlease link your local project to an existing Strapi Cloud project using the ${chalk.cyan(\n 'link'\n )} command before deploying.`\n );\n } else {\n ctx.logger.error(e.response.data);\n }\n } else {\n ctx.logger.error(\n \"An error occurred while retrieving the project's information. Please try again later.\"\n );\n }\n ctx.logger.debug(e);\n return;\n }\n\n await trackEvent(ctx, cloudApiService, 'willDeployWithCLI', {\n projectInternalName: project.name,\n });\n\n const notificationService = notificationServiceFactory(ctx);\n const buildLogsService = buildLogsServiceFactory(ctx);\n\n const cliConfig = await getConfig({ ctx, cloudApiService });\n if (!cliConfig) {\n ctx.logger.error(\n 'An error occurred while retrieving data from Strapi Cloud. Please check your network or try again later.'\n );\n return;\n }\n\n let maxSize: number = parseInt(cliConfig.maxProjectFileSize, 10);\n if (Number.isNaN(maxSize)) {\n ctx.logger.debug(\n 'An error occurred while parsing the maxProjectFileSize. Using default value.'\n );\n maxSize = 100000000;\n }\n\n project.targetEnvironment = await getTargetEnvironment(ctx, opts, project, environments);\n\n if (!opts.force) {\n const shouldDisplayWarning = hasPendingOrLiveDeployment(\n environmentsDetails,\n project.targetEnvironment\n );\n if (shouldDisplayWarning) {\n ctx.logger.log(boxen(cliConfig.projectDeployment.confirmationText, boxenOptions));\n const { default: inquirer } = await import('inquirer');\n const { confirm } = await inquirer.prompt([\n {\n type: 'confirm',\n name: 'confirm',\n message: `Do you want to proceed with deployment to ${chalk.cyan(projectData.displayName)} on ${chalk.cyan(project.targetEnvironment)} environment?`,\n },\n ]);\n if (!confirm) {\n process.exit(1);\n }\n }\n }\n\n const buildId = await upload(ctx, project, cliConfig, token, maxSize);\n\n if (!buildId) {\n return;\n }\n\n let notifications: ReturnType<typeof notificationService> | null = null;\n\n try {\n ctx.logger.log(\n `∷ Deploying project to ${chalk.cyan(project.targetEnvironment ?? `production`)} environment...`\n );\n\n notifications = notificationService(\n `${apiConfig.apiBaseUrl}/${VERSION}/notifications`,\n token,\n cliConfig\n );\n\n await buildLogsService(`${apiConfig.apiBaseUrl}/${VERSION}/logs/${buildId}`, token, cliConfig);\n const dashboardUrlLine =\n chalk.cyan(' → ') +\n chalk.cyan.underline(`${apiConfig.dashboardBaseUrl}/projects/${project.name}/deployments`);\n ctx.logger.log(\n boxen(`Project and deployment logs ready at:\\n${dashboardUrlLine}`, {\n padding: 1,\n margin: 1,\n borderStyle: 'round',\n borderColor: 'white',\n titleAlignment: 'left',\n })\n );\n } catch (e: Error | unknown) {\n ctx.logger.debug(e);\n if (e instanceof Error) {\n ctx.logger.error(e.message);\n } else {\n ctx.logger.error('An error occurred while deploying the project. Please try again later.');\n }\n } finally {\n if (notifications) {\n notifications.close();\n }\n }\n};\n"],"names":["boxenOptions","padding","margin","align","borderColor","borderStyle","QUIT_OPTION","promptForEnvironment","environments","default","inquirer","choices","map","env","name","value","selectedEnvironment","prompt","type","message","chalk","grey","process","exit","upload","ctx","project","cliConfig","token","maxProjectFileSize","cloudApi","cloudApiFactory","storagePath","getTmpStoragePath","projectFolder","path","resolve","cwd","packageJson","loadPkg","logger","error","compressSpinner","spinner","start","indent","hashname","crypto","createHash","update","digest","compressedFilename","debug","compressFilesToTar","succeed","e","fail","tarFilePath","fileStats","fse","stat","size","log","remove","progressBar","data","deploy","filePath","onUploadProgress","progressEvent","total","percentage","Math","round","loaded","stop","green","bold","build_id","handleUploadError","response","status","environmentErrorMessage","environmentErrorMessageFactory","projectName","firstLine","projectDeployment","errors","environmentNotReady","secondLine","environmentCreationErrorFactory","getProject","local","projectResponse","createProjectAction","projectSaved","getConfig","cloudApiService","config","validateEnvironment","environment","includes","getTargetEnvironment","opts","targetEnvironment","length","hasPendingOrLiveDeployment","find","Error","hasPendingDeployment","hasLiveDeployment","getValidToken","tokenServiceFactory","promptLogin","projectData","environmentsDetails","metadata","isProjectSuspended","suspendedAt","underline","dashboardUrls","AxiosError","warn","cyan","trackEvent","projectInternalName","notificationService","notificationServiceFactory","buildLogsService","buildLogsServiceFactory","maxSize","parseInt","Number","isNaN","force","shouldDisplayWarning","boxen","confirmationText","confirm","displayName","buildId","notifications","apiConfig","apiBaseUrl","VERSION","dashboardUrlLine","dashboardBaseUrl","titleAlignment","close"],"mappings":"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"}
|
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import fse__default from 'fs-extra';
|
|
2
|
-
import inquirer from 'inquirer';
|
|
3
2
|
import boxen from 'boxen';
|
|
4
3
|
import path__default from 'path';
|
|
5
4
|
import chalk from 'chalk';
|
|
@@ -31,6 +30,7 @@ const boxenOptions = {
|
|
|
31
30
|
};
|
|
32
31
|
const QUIT_OPTION = 'Quit';
|
|
33
32
|
async function promptForEnvironment(environments) {
|
|
33
|
+
const { default: inquirer } = await import('inquirer');
|
|
34
34
|
const choices = environments.map((env)=>({
|
|
35
35
|
name: env,
|
|
36
36
|
value: env
|
|
@@ -256,6 +256,7 @@ var action = (async (ctx, opts)=>{
|
|
|
256
256
|
const shouldDisplayWarning = hasPendingOrLiveDeployment(environmentsDetails, project.targetEnvironment);
|
|
257
257
|
if (shouldDisplayWarning) {
|
|
258
258
|
ctx.logger.log(boxen(cliConfig.projectDeployment.confirmationText, boxenOptions));
|
|
259
|
+
const { default: inquirer } = await import('inquirer');
|
|
259
260
|
const { confirm } = await inquirer.prompt([
|
|
260
261
|
{
|
|
261
262
|
type: 'confirm',
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"action.mjs","sources":["../../src/deploy-project/action.ts"],"sourcesContent":["import fse from 'fs-extra';\nimport inquirer from 'inquirer';\nimport boxen from 'boxen';\nimport path from 'path';\nimport chalk from 'chalk';\nimport { AxiosError } from 'axios';\nimport * as crypto from 'node:crypto';\nimport { apiConfig } from '../config/api';\nimport { compressFilesToTar } from '../utils/compress-files';\nimport createProjectAction from '../create-project/action';\nimport type {\n CLIContext,\n CloudApiService,\n CloudCliConfig,\n EnvironmentDetails,\n ProjectInfo,\n} from '../types';\nimport { getTmpStoragePath } from '../config/local';\nimport { cloudApiFactory, tokenServiceFactory, local } from '../services';\nimport { VERSION } from '../services/cli-api';\nimport { notificationServiceFactory } from '../services/notification';\nimport { loadPkg } from '../utils/pkg';\nimport { buildLogsServiceFactory } from '../services/build-logs';\nimport { promptLogin } from '../login/action';\nimport { trackEvent } from '../utils/analytics';\nimport {\n environmentCreationErrorFactory,\n environmentErrorMessageFactory,\n} from '../utils/error-message-factories';\n\ntype PackageJson = {\n name: string;\n strapi?: {\n uuid: string;\n };\n};\n\ninterface CmdOptions {\n env?: string;\n force?: boolean;\n}\n\nconst boxenOptions: boxen.Options = {\n padding: 1,\n margin: 1,\n align: 'center',\n borderColor: 'yellow',\n borderStyle: 'round',\n};\n\nconst QUIT_OPTION = 'Quit';\n\nasync function promptForEnvironment(environments: string[]): Promise<string> {\n const choices = environments.map((env) => ({ name: env, value: env }));\n const { selectedEnvironment } = await inquirer.prompt([\n {\n type: 'list',\n name: 'selectedEnvironment',\n message: 'Select the environment to deploy:',\n choices: [...choices, { name: chalk.grey(`(${QUIT_OPTION})`), value: null }],\n },\n ]);\n if (selectedEnvironment === null) {\n process.exit(1);\n }\n\n return selectedEnvironment;\n}\n\nasync function upload(\n ctx: CLIContext,\n project: Omit<ProjectInfo, 'id'>,\n cliConfig: CloudCliConfig,\n token: string,\n maxProjectFileSize: number\n) {\n const cloudApi = await cloudApiFactory(ctx, token);\n try {\n const storagePath = await getTmpStoragePath();\n const projectFolder = path.resolve(process.cwd());\n const packageJson = (await loadPkg(ctx)) as PackageJson;\n\n if (!packageJson) {\n ctx.logger.error(\n 'Unable to deploy the project. Please make sure the package.json file is correctly formatted.'\n );\n return;\n }\n\n const compressSpinner = ctx.logger.spinner('Compressing project...').start();\n compressSpinner.indent = 1;\n // hash packageJson.name to avoid conflicts\n const hashname = crypto.createHash('sha512').update(packageJson.name).digest('hex');\n const compressedFilename = `${hashname}.tar.gz`;\n try {\n ctx.logger.debug(\n 'Compression parameters\\n',\n `Storage path: ${storagePath}\\n`,\n `Project folder: ${projectFolder}\\n`,\n `Compressed filename: ${compressedFilename}`\n );\n await compressFilesToTar(storagePath, projectFolder, compressedFilename);\n compressSpinner.succeed(`Project compressed successfully!`);\n } catch (e: unknown) {\n compressSpinner.fail(\n 'Project compression failed. Try again later or check for large/incompatible files.'\n );\n ctx.logger.debug(e);\n process.exit(1);\n }\n\n const tarFilePath = path.resolve(storagePath, compressedFilename);\n const fileStats = await fse.stat(tarFilePath);\n\n if (fileStats.size > maxProjectFileSize) {\n ctx.logger.log(\n 'Unable to proceed: Your project is too big to be transferred, please use a git repo instead.'\n );\n try {\n await fse.remove(tarFilePath);\n } catch (e: any) {\n ctx.logger.log('Unable to remove file: ', tarFilePath);\n ctx.logger.debug(e);\n }\n return;\n }\n\n const progressBar = ctx.logger.progressBar(100, ' ∷ Uploading project');\n\n try {\n const { data } = await cloudApi.deploy(\n { filePath: tarFilePath, project },\n {\n onUploadProgress(progressEvent) {\n const total = progressEvent.total || fileStats.size;\n const percentage = Math.round((progressEvent.loaded * 100) / total);\n progressBar.update(percentage);\n },\n }\n );\n\n progressBar.update(100);\n progressBar.stop();\n ctx.logger.log(`${chalk.green.bold('✔')} Upload finished!\\n`);\n return data.build_id;\n } catch (e: any) {\n progressBar.stop();\n await handleUploadError(ctx, e, project, cliConfig);\n } finally {\n await fse.remove(tarFilePath);\n }\n process.exit(0);\n } catch (e: any) {\n ctx.logger.error('An error occurred while deploying the project. Please try again later.');\n ctx.logger.debug(e);\n process.exit(1);\n }\n}\n\nasync function handleUploadError(\n ctx: CLIContext,\n error: any,\n project: any,\n cliConfig: CloudCliConfig\n) {\n const { logger } = ctx;\n logger.debug(error);\n\n if (error.response?.status) {\n switch (error.response.status) {\n case 405: {\n const environmentErrorMessage = environmentErrorMessageFactory({\n projectName: project.name,\n firstLine: cliConfig.projectDeployment.errors.environmentNotReady.firstLine,\n secondLine: cliConfig.projectDeployment.errors.environmentNotReady.secondLine,\n });\n logger.log(environmentCreationErrorFactory(environmentErrorMessage));\n return;\n }\n case 413:\n logger.error(\n 'The project you are trying to upload is too big. Please remove unnecessary files and try again.'\n );\n return;\n default:\n break;\n }\n }\n logger.error('An error occurred while deploying the project. Please try again later.');\n}\n\nasync function getProject(ctx: CLIContext) {\n const { project } = await local.retrieve();\n if (!project) {\n try {\n const projectResponse = await createProjectAction(ctx);\n if (projectResponse) {\n const { project: projectSaved } = await local.retrieve();\n return projectSaved;\n }\n } catch (e: any) {\n ctx.logger.error('An error occurred while deploying the project. Please try again later.');\n ctx.logger.debug(e);\n process.exit(1);\n }\n }\n return project;\n}\n\nasync function getConfig({\n ctx,\n cloudApiService,\n}: {\n ctx: CLIContext;\n cloudApiService: CloudApiService;\n}): Promise<CloudCliConfig | null> {\n try {\n const { data: cliConfig } = await cloudApiService.config();\n return cliConfig;\n } catch (e) {\n ctx.logger.debug('Failed to get cli config', e);\n return null;\n }\n}\n\nfunction validateEnvironment(ctx: CLIContext, environment: string, environments: string[]): void {\n if (!environments.includes(environment)) {\n ctx.logger.error(`Environment ${environment} does not exist.`);\n process.exit(1);\n }\n}\n\nasync function getTargetEnvironment(\n ctx: CLIContext,\n opts: CmdOptions,\n project: Omit<ProjectInfo, 'id'>,\n environments: string[]\n): Promise<string> {\n if (opts.env) {\n validateEnvironment(ctx, opts.env, environments);\n return opts.env;\n }\n\n if (project.targetEnvironment) {\n return project.targetEnvironment;\n }\n\n if (environments.length > 1) {\n return promptForEnvironment(environments);\n }\n\n return environments[0];\n}\n\nfunction hasPendingOrLiveDeployment(\n environments: EnvironmentDetails[],\n targetEnvironment: string\n): boolean {\n const environment = environments.find((env) => env.name === targetEnvironment);\n if (!environment) {\n throw new Error(`Environment details ${targetEnvironment} not found.`);\n }\n return environment.hasPendingDeployment || environment.hasLiveDeployment || false;\n}\n\nexport default async (ctx: CLIContext, opts: CmdOptions) => {\n const { getValidToken } = await tokenServiceFactory(ctx);\n const token = await getValidToken(ctx, promptLogin);\n if (!token) {\n return;\n }\n\n const project = await getProject(ctx);\n if (!project) {\n process.exit(1);\n }\n\n const cloudApiService = await cloudApiFactory(ctx, token);\n let projectData;\n let environments: string[];\n let environmentsDetails: EnvironmentDetails[];\n\n try {\n const {\n data: { data, metadata },\n } = await cloudApiService.getProject({ name: project.name });\n projectData = data;\n environments = projectData.environments;\n environmentsDetails = projectData.environmentsDetails;\n const isProjectSuspended = projectData.suspendedAt;\n\n if (isProjectSuspended) {\n ctx.logger.log(\n '\\n Oops! This project has been suspended. \\n\\n Please reactivate it from the dashboard to continue deploying: '\n );\n ctx.logger.log(chalk.underline(`${metadata.dashboardUrls.project}`));\n return;\n }\n } catch (e: Error | unknown) {\n if (e instanceof AxiosError && e.response?.data) {\n if (e.response.status === 404) {\n ctx.logger.warn(\n `The project associated with this folder does not exist in Strapi Cloud. \\nPlease link your local project to an existing Strapi Cloud project using the ${chalk.cyan(\n 'link'\n )} command before deploying.`\n );\n } else {\n ctx.logger.error(e.response.data);\n }\n } else {\n ctx.logger.error(\n \"An error occurred while retrieving the project's information. Please try again later.\"\n );\n }\n ctx.logger.debug(e);\n return;\n }\n\n await trackEvent(ctx, cloudApiService, 'willDeployWithCLI', {\n projectInternalName: project.name,\n });\n\n const notificationService = notificationServiceFactory(ctx);\n const buildLogsService = buildLogsServiceFactory(ctx);\n\n const cliConfig = await getConfig({ ctx, cloudApiService });\n if (!cliConfig) {\n ctx.logger.error(\n 'An error occurred while retrieving data from Strapi Cloud. Please check your network or try again later.'\n );\n return;\n }\n\n let maxSize: number = parseInt(cliConfig.maxProjectFileSize, 10);\n if (Number.isNaN(maxSize)) {\n ctx.logger.debug(\n 'An error occurred while parsing the maxProjectFileSize. Using default value.'\n );\n maxSize = 100000000;\n }\n\n project.targetEnvironment = await getTargetEnvironment(ctx, opts, project, environments);\n\n if (!opts.force) {\n const shouldDisplayWarning = hasPendingOrLiveDeployment(\n environmentsDetails,\n project.targetEnvironment\n );\n if (shouldDisplayWarning) {\n ctx.logger.log(boxen(cliConfig.projectDeployment.confirmationText, boxenOptions));\n const { confirm } = await inquirer.prompt([\n {\n type: 'confirm',\n name: 'confirm',\n message: `Do you want to proceed with deployment to ${chalk.cyan(projectData.displayName)} on ${chalk.cyan(project.targetEnvironment)} environment?`,\n },\n ]);\n if (!confirm) {\n process.exit(1);\n }\n }\n }\n\n const buildId = await upload(ctx, project, cliConfig, token, maxSize);\n\n if (!buildId) {\n return;\n }\n\n let notifications: ReturnType<typeof notificationService> | null = null;\n\n try {\n ctx.logger.log(\n `∷ Deploying project to ${chalk.cyan(project.targetEnvironment ?? `production`)} environment...`\n );\n\n notifications = notificationService(\n `${apiConfig.apiBaseUrl}/${VERSION}/notifications`,\n token,\n cliConfig\n );\n\n await buildLogsService(`${apiConfig.apiBaseUrl}/${VERSION}/logs/${buildId}`, token, cliConfig);\n const dashboardUrlLine =\n chalk.cyan(' → ') +\n chalk.cyan.underline(`${apiConfig.dashboardBaseUrl}/projects/${project.name}/deployments`);\n ctx.logger.log(\n boxen(`Project and deployment logs ready at:\\n${dashboardUrlLine}`, {\n padding: 1,\n margin: 1,\n borderStyle: 'round',\n borderColor: 'white',\n titleAlignment: 'left',\n })\n );\n } catch (e: Error | unknown) {\n ctx.logger.debug(e);\n if (e instanceof Error) {\n ctx.logger.error(e.message);\n } else {\n ctx.logger.error('An error occurred while deploying the project. Please try again later.');\n }\n } finally {\n if (notifications) {\n notifications.close();\n }\n }\n};\n"],"names":["boxenOptions","padding","margin","align","borderColor","borderStyle","QUIT_OPTION","promptForEnvironment","environments","choices","map","env","name","value","selectedEnvironment","inquirer","prompt","type","message","chalk","grey","process","exit","upload","ctx","project","cliConfig","token","maxProjectFileSize","cloudApi","cloudApiFactory","storagePath","getTmpStoragePath","projectFolder","path","resolve","cwd","packageJson","loadPkg","logger","error","compressSpinner","spinner","start","indent","hashname","crypto","createHash","update","digest","compressedFilename","debug","compressFilesToTar","succeed","e","fail","tarFilePath","fileStats","fse","stat","size","log","remove","progressBar","data","deploy","filePath","onUploadProgress","progressEvent","total","percentage","Math","round","loaded","stop","green","bold","build_id","handleUploadError","response","status","environmentErrorMessage","environmentErrorMessageFactory","projectName","firstLine","projectDeployment","errors","environmentNotReady","secondLine","environmentCreationErrorFactory","getProject","local","projectResponse","createProjectAction","projectSaved","getConfig","cloudApiService","config","validateEnvironment","environment","includes","getTargetEnvironment","opts","targetEnvironment","length","hasPendingOrLiveDeployment","find","Error","hasPendingDeployment","hasLiveDeployment","getValidToken","tokenServiceFactory","promptLogin","projectData","environmentsDetails","metadata","isProjectSuspended","suspendedAt","underline","dashboardUrls","AxiosError","warn","cyan","trackEvent","projectInternalName","notificationService","notificationServiceFactory","buildLogsService","buildLogsServiceFactory","maxSize","parseInt","Number","isNaN","force","shouldDisplayWarning","boxen","confirmationText","confirm","displayName","buildId","notifications","apiConfig","apiBaseUrl","VERSION","dashboardUrlLine","dashboardBaseUrl","titleAlignment","close"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"action.mjs","sources":["../../src/deploy-project/action.ts"],"sourcesContent":["import fse from 'fs-extra';\nimport boxen from 'boxen';\nimport path from 'path';\nimport chalk from 'chalk';\nimport { AxiosError } from 'axios';\nimport * as crypto from 'node:crypto';\nimport { apiConfig } from '../config/api';\nimport { compressFilesToTar } from '../utils/compress-files';\nimport createProjectAction from '../create-project/action';\nimport type {\n CLIContext,\n CloudApiService,\n CloudCliConfig,\n EnvironmentDetails,\n ProjectInfo,\n} from '../types';\nimport { getTmpStoragePath } from '../config/local';\nimport { cloudApiFactory, tokenServiceFactory, local } from '../services';\nimport { VERSION } from '../services/cli-api';\nimport { notificationServiceFactory } from '../services/notification';\nimport { loadPkg } from '../utils/pkg';\nimport { buildLogsServiceFactory } from '../services/build-logs';\nimport { promptLogin } from '../login/action';\nimport { trackEvent } from '../utils/analytics';\nimport {\n environmentCreationErrorFactory,\n environmentErrorMessageFactory,\n} from '../utils/error-message-factories';\n\ntype PackageJson = {\n name: string;\n strapi?: {\n uuid: string;\n };\n};\n\ninterface CmdOptions {\n env?: string;\n force?: boolean;\n}\n\nconst boxenOptions: boxen.Options = {\n padding: 1,\n margin: 1,\n align: 'center',\n borderColor: 'yellow',\n borderStyle: 'round',\n};\n\nconst QUIT_OPTION = 'Quit';\n\nasync function promptForEnvironment(environments: string[]): Promise<string> {\n const { default: inquirer } = await import('inquirer');\n const choices = environments.map((env) => ({ name: env, value: env }));\n const { selectedEnvironment } = await inquirer.prompt([\n {\n type: 'list',\n name: 'selectedEnvironment',\n message: 'Select the environment to deploy:',\n choices: [...choices, { name: chalk.grey(`(${QUIT_OPTION})`), value: null }],\n },\n ]);\n if (selectedEnvironment === null) {\n process.exit(1);\n }\n\n return selectedEnvironment;\n}\n\nasync function upload(\n ctx: CLIContext,\n project: Omit<ProjectInfo, 'id'>,\n cliConfig: CloudCliConfig,\n token: string,\n maxProjectFileSize: number\n) {\n const cloudApi = await cloudApiFactory(ctx, token);\n try {\n const storagePath = await getTmpStoragePath();\n const projectFolder = path.resolve(process.cwd());\n const packageJson = (await loadPkg(ctx)) as PackageJson;\n\n if (!packageJson) {\n ctx.logger.error(\n 'Unable to deploy the project. Please make sure the package.json file is correctly formatted.'\n );\n return;\n }\n\n const compressSpinner = ctx.logger.spinner('Compressing project...').start();\n compressSpinner.indent = 1;\n // hash packageJson.name to avoid conflicts\n const hashname = crypto.createHash('sha512').update(packageJson.name).digest('hex');\n const compressedFilename = `${hashname}.tar.gz`;\n try {\n ctx.logger.debug(\n 'Compression parameters\\n',\n `Storage path: ${storagePath}\\n`,\n `Project folder: ${projectFolder}\\n`,\n `Compressed filename: ${compressedFilename}`\n );\n await compressFilesToTar(storagePath, projectFolder, compressedFilename);\n compressSpinner.succeed(`Project compressed successfully!`);\n } catch (e: unknown) {\n compressSpinner.fail(\n 'Project compression failed. Try again later or check for large/incompatible files.'\n );\n ctx.logger.debug(e);\n process.exit(1);\n }\n\n const tarFilePath = path.resolve(storagePath, compressedFilename);\n const fileStats = await fse.stat(tarFilePath);\n\n if (fileStats.size > maxProjectFileSize) {\n ctx.logger.log(\n 'Unable to proceed: Your project is too big to be transferred, please use a git repo instead.'\n );\n try {\n await fse.remove(tarFilePath);\n } catch (e: any) {\n ctx.logger.log('Unable to remove file: ', tarFilePath);\n ctx.logger.debug(e);\n }\n return;\n }\n\n const progressBar = ctx.logger.progressBar(100, ' ∷ Uploading project');\n\n try {\n const { data } = await cloudApi.deploy(\n { filePath: tarFilePath, project },\n {\n onUploadProgress(progressEvent) {\n const total = progressEvent.total || fileStats.size;\n const percentage = Math.round((progressEvent.loaded * 100) / total);\n progressBar.update(percentage);\n },\n }\n );\n\n progressBar.update(100);\n progressBar.stop();\n ctx.logger.log(`${chalk.green.bold('✔')} Upload finished!\\n`);\n return data.build_id;\n } catch (e: any) {\n progressBar.stop();\n await handleUploadError(ctx, e, project, cliConfig);\n } finally {\n await fse.remove(tarFilePath);\n }\n process.exit(0);\n } catch (e: any) {\n ctx.logger.error('An error occurred while deploying the project. Please try again later.');\n ctx.logger.debug(e);\n process.exit(1);\n }\n}\n\nasync function handleUploadError(\n ctx: CLIContext,\n error: any,\n project: any,\n cliConfig: CloudCliConfig\n) {\n const { logger } = ctx;\n logger.debug(error);\n\n if (error.response?.status) {\n switch (error.response.status) {\n case 405: {\n const environmentErrorMessage = environmentErrorMessageFactory({\n projectName: project.name,\n firstLine: cliConfig.projectDeployment.errors.environmentNotReady.firstLine,\n secondLine: cliConfig.projectDeployment.errors.environmentNotReady.secondLine,\n });\n logger.log(environmentCreationErrorFactory(environmentErrorMessage));\n return;\n }\n case 413:\n logger.error(\n 'The project you are trying to upload is too big. Please remove unnecessary files and try again.'\n );\n return;\n default:\n break;\n }\n }\n logger.error('An error occurred while deploying the project. Please try again later.');\n}\n\nasync function getProject(ctx: CLIContext) {\n const { project } = await local.retrieve();\n if (!project) {\n try {\n const projectResponse = await createProjectAction(ctx);\n if (projectResponse) {\n const { project: projectSaved } = await local.retrieve();\n return projectSaved;\n }\n } catch (e: any) {\n ctx.logger.error('An error occurred while deploying the project. Please try again later.');\n ctx.logger.debug(e);\n process.exit(1);\n }\n }\n return project;\n}\n\nasync function getConfig({\n ctx,\n cloudApiService,\n}: {\n ctx: CLIContext;\n cloudApiService: CloudApiService;\n}): Promise<CloudCliConfig | null> {\n try {\n const { data: cliConfig } = await cloudApiService.config();\n return cliConfig;\n } catch (e) {\n ctx.logger.debug('Failed to get cli config', e);\n return null;\n }\n}\n\nfunction validateEnvironment(ctx: CLIContext, environment: string, environments: string[]): void {\n if (!environments.includes(environment)) {\n ctx.logger.error(`Environment ${environment} does not exist.`);\n process.exit(1);\n }\n}\n\nasync function getTargetEnvironment(\n ctx: CLIContext,\n opts: CmdOptions,\n project: Omit<ProjectInfo, 'id'>,\n environments: string[]\n): Promise<string> {\n if (opts.env) {\n validateEnvironment(ctx, opts.env, environments);\n return opts.env;\n }\n\n if (project.targetEnvironment) {\n return project.targetEnvironment;\n }\n\n if (environments.length > 1) {\n return promptForEnvironment(environments);\n }\n\n return environments[0];\n}\n\nfunction hasPendingOrLiveDeployment(\n environments: EnvironmentDetails[],\n targetEnvironment: string\n): boolean {\n const environment = environments.find((env) => env.name === targetEnvironment);\n if (!environment) {\n throw new Error(`Environment details ${targetEnvironment} not found.`);\n }\n return environment.hasPendingDeployment || environment.hasLiveDeployment || false;\n}\n\nexport default async (ctx: CLIContext, opts: CmdOptions) => {\n const { getValidToken } = await tokenServiceFactory(ctx);\n const token = await getValidToken(ctx, promptLogin);\n if (!token) {\n return;\n }\n\n const project = await getProject(ctx);\n if (!project) {\n process.exit(1);\n }\n\n const cloudApiService = await cloudApiFactory(ctx, token);\n let projectData;\n let environments: string[];\n let environmentsDetails: EnvironmentDetails[];\n\n try {\n const {\n data: { data, metadata },\n } = await cloudApiService.getProject({ name: project.name });\n projectData = data;\n environments = projectData.environments;\n environmentsDetails = projectData.environmentsDetails;\n const isProjectSuspended = projectData.suspendedAt;\n\n if (isProjectSuspended) {\n ctx.logger.log(\n '\\n Oops! This project has been suspended. \\n\\n Please reactivate it from the dashboard to continue deploying: '\n );\n ctx.logger.log(chalk.underline(`${metadata.dashboardUrls.project}`));\n return;\n }\n } catch (e: Error | unknown) {\n if (e instanceof AxiosError && e.response?.data) {\n if (e.response.status === 404) {\n ctx.logger.warn(\n `The project associated with this folder does not exist in Strapi Cloud. \\nPlease link your local project to an existing Strapi Cloud project using the ${chalk.cyan(\n 'link'\n )} command before deploying.`\n );\n } else {\n ctx.logger.error(e.response.data);\n }\n } else {\n ctx.logger.error(\n \"An error occurred while retrieving the project's information. Please try again later.\"\n );\n }\n ctx.logger.debug(e);\n return;\n }\n\n await trackEvent(ctx, cloudApiService, 'willDeployWithCLI', {\n projectInternalName: project.name,\n });\n\n const notificationService = notificationServiceFactory(ctx);\n const buildLogsService = buildLogsServiceFactory(ctx);\n\n const cliConfig = await getConfig({ ctx, cloudApiService });\n if (!cliConfig) {\n ctx.logger.error(\n 'An error occurred while retrieving data from Strapi Cloud. Please check your network or try again later.'\n );\n return;\n }\n\n let maxSize: number = parseInt(cliConfig.maxProjectFileSize, 10);\n if (Number.isNaN(maxSize)) {\n ctx.logger.debug(\n 'An error occurred while parsing the maxProjectFileSize. Using default value.'\n );\n maxSize = 100000000;\n }\n\n project.targetEnvironment = await getTargetEnvironment(ctx, opts, project, environments);\n\n if (!opts.force) {\n const shouldDisplayWarning = hasPendingOrLiveDeployment(\n environmentsDetails,\n project.targetEnvironment\n );\n if (shouldDisplayWarning) {\n ctx.logger.log(boxen(cliConfig.projectDeployment.confirmationText, boxenOptions));\n const { default: inquirer } = await import('inquirer');\n const { confirm } = await inquirer.prompt([\n {\n type: 'confirm',\n name: 'confirm',\n message: `Do you want to proceed with deployment to ${chalk.cyan(projectData.displayName)} on ${chalk.cyan(project.targetEnvironment)} environment?`,\n },\n ]);\n if (!confirm) {\n process.exit(1);\n }\n }\n }\n\n const buildId = await upload(ctx, project, cliConfig, token, maxSize);\n\n if (!buildId) {\n return;\n }\n\n let notifications: ReturnType<typeof notificationService> | null = null;\n\n try {\n ctx.logger.log(\n `∷ Deploying project to ${chalk.cyan(project.targetEnvironment ?? `production`)} environment...`\n );\n\n notifications = notificationService(\n `${apiConfig.apiBaseUrl}/${VERSION}/notifications`,\n token,\n cliConfig\n );\n\n await buildLogsService(`${apiConfig.apiBaseUrl}/${VERSION}/logs/${buildId}`, token, cliConfig);\n const dashboardUrlLine =\n chalk.cyan(' → ') +\n chalk.cyan.underline(`${apiConfig.dashboardBaseUrl}/projects/${project.name}/deployments`);\n ctx.logger.log(\n boxen(`Project and deployment logs ready at:\\n${dashboardUrlLine}`, {\n padding: 1,\n margin: 1,\n borderStyle: 'round',\n borderColor: 'white',\n titleAlignment: 'left',\n })\n );\n } catch (e: Error | unknown) {\n ctx.logger.debug(e);\n if (e instanceof Error) {\n ctx.logger.error(e.message);\n } else {\n ctx.logger.error('An error occurred while deploying the project. Please try again later.');\n }\n } finally {\n if (notifications) {\n notifications.close();\n }\n }\n};\n"],"names":["boxenOptions","padding","margin","align","borderColor","borderStyle","QUIT_OPTION","promptForEnvironment","environments","default","inquirer","choices","map","env","name","value","selectedEnvironment","prompt","type","message","chalk","grey","process","exit","upload","ctx","project","cliConfig","token","maxProjectFileSize","cloudApi","cloudApiFactory","storagePath","getTmpStoragePath","projectFolder","path","resolve","cwd","packageJson","loadPkg","logger","error","compressSpinner","spinner","start","indent","hashname","crypto","createHash","update","digest","compressedFilename","debug","compressFilesToTar","succeed","e","fail","tarFilePath","fileStats","fse","stat","size","log","remove","progressBar","data","deploy","filePath","onUploadProgress","progressEvent","total","percentage","Math","round","loaded","stop","green","bold","build_id","handleUploadError","response","status","environmentErrorMessage","environmentErrorMessageFactory","projectName","firstLine","projectDeployment","errors","environmentNotReady","secondLine","environmentCreationErrorFactory","getProject","local","projectResponse","createProjectAction","projectSaved","getConfig","cloudApiService","config","validateEnvironment","environment","includes","getTargetEnvironment","opts","targetEnvironment","length","hasPendingOrLiveDeployment","find","Error","hasPendingDeployment","hasLiveDeployment","getValidToken","tokenServiceFactory","promptLogin","projectData","environmentsDetails","metadata","isProjectSuspended","suspendedAt","underline","dashboardUrls","AxiosError","warn","cyan","trackEvent","projectInternalName","notificationService","notificationServiceFactory","buildLogsService","buildLogsServiceFactory","maxSize","parseInt","Number","isNaN","force","shouldDisplayWarning","boxen","confirmationText","confirm","displayName","buildId","notifications","apiConfig","apiBaseUrl","VERSION","dashboardUrlLine","dashboardBaseUrl","titleAlignment","close"],"mappings":"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"}
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
3
|
var chalk = require('chalk');
|
|
4
|
-
var inquirer = require('inquirer');
|
|
5
4
|
var cliApi = require('../../services/cli-api.js');
|
|
6
5
|
var strapiInfoSave = require('../../services/strapi-info-save.js');
|
|
7
6
|
var token = require('../../services/token.js');
|
|
@@ -67,6 +66,7 @@ var action = (async (ctx)=>{
|
|
|
67
66
|
async function promptUserForEnvironment(ctx, environments) {
|
|
68
67
|
const { logger } = ctx;
|
|
69
68
|
try {
|
|
69
|
+
const { default: inquirer } = await import('inquirer');
|
|
70
70
|
const answer = await inquirer.prompt([
|
|
71
71
|
{
|
|
72
72
|
type: 'list',
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"action.js","sources":["../../../src/environment/link/action.ts"],"sourcesContent":["import chalk from 'chalk';\nimport
|
|
1
|
+
{"version":3,"file":"action.js","sources":["../../../src/environment/link/action.ts"],"sourcesContent":["import chalk from 'chalk';\nimport type { Answers } from 'inquirer';\nimport { EnvironmentDetails, ProjectInput } from '../../services/cli-api';\nimport type { CLIContext, CloudApiService } from '../../types';\nimport { cloudApiFactory, tokenServiceFactory, local } from '../../services';\nimport { promptLogin } from '../../login/action';\nimport { trackEvent } from '../../utils/analytics';\nimport { getLocalProject } from '../../utils/get-local-config';\n\nconst QUIT_OPTION = 'Quit';\n\ninterface LinkEnvironmentAnswer extends Answers {\n targetEnvironment: string;\n}\n\ninterface LinkEnvironmentInput extends Answers {\n targetEnvironment: string;\n}\n\ntype EnvironmentsList = EnvironmentDetails[];\n\nexport default async (ctx: CLIContext) => {\n const { getValidToken } = await tokenServiceFactory(ctx);\n const token = await getValidToken(ctx, promptLogin);\n const { logger } = ctx;\n\n if (!token) {\n return;\n }\n\n const project = await getLocalProject(ctx);\n\n if (!project) {\n logger.debug(`No valid local project configuration was found.`);\n return;\n }\n\n const cloudApiService = await cloudApiFactory(ctx, token);\n const environments = await getEnvironmentsList(ctx, cloudApiService, project);\n\n if (!environments) {\n logger.debug(`Fetching environments failed.`);\n return;\n }\n\n if (environments.length === 0) {\n logger.log(\n `The only available environment is already linked. You can add a new one from your project settings on the Strapi Cloud dashboard.`\n );\n return;\n }\n\n const answer: LinkEnvironmentAnswer | null = await promptUserForEnvironment(ctx, environments);\n\n if (!answer) {\n return;\n }\n\n await trackEvent(ctx, cloudApiService, 'willLinkEnvironment', {\n projectName: project.name,\n environmentName: answer.targetEnvironment,\n });\n\n try {\n await local.patch({ project: { targetEnvironment: answer.targetEnvironment } });\n } catch (e) {\n await trackEvent(ctx, cloudApiService, 'didNotLinkEnvironment', {\n projectName: project.name,\n environmentName: answer.targetEnvironment,\n });\n logger.debug('Failed to link environment', e);\n logger.error(\n 'Failed to link the environment. If this issue persists, try re-linking your project or contact support.'\n );\n process.exit(1);\n }\n\n logger.log(\n ` You have successfully linked your project to ${chalk.cyan(answer.targetEnvironment)}, on ${chalk.cyan(project.displayName)}. You are now able to deploy your project.`\n );\n await trackEvent(ctx, cloudApiService, 'didLinkEnvironment', {\n projectName: project.name,\n environmentName: answer.targetEnvironment,\n });\n};\n\nasync function promptUserForEnvironment(\n ctx: CLIContext,\n environments: EnvironmentsList\n): Promise<LinkEnvironmentAnswer | null> {\n const { logger } = ctx;\n\n try {\n const { default: inquirer } = await import('inquirer');\n const answer: LinkEnvironmentInput = await inquirer.prompt([\n {\n type: 'list',\n name: 'targetEnvironment',\n message: 'Which environment do you want to link?',\n choices: [...environments, { name: chalk.grey(`(${QUIT_OPTION})`), value: null }],\n },\n ]);\n\n if (!answer.targetEnvironment) {\n return null;\n }\n\n return answer;\n } catch (e) {\n logger.debug('Failed to get user input', e);\n logger.error('An error occurred while trying to get your environment selection.');\n return null;\n }\n}\n\nasync function getEnvironmentsList(\n ctx: CLIContext,\n cloudApiService: CloudApiService,\n project: ProjectInput\n) {\n const spinner = ctx.logger.spinner('Fetching environments...\\n').start();\n\n try {\n const {\n data: { data: environmentsList },\n } = await cloudApiService.listLinkEnvironments({ name: project.name });\n\n if (!Array.isArray(environmentsList) || environmentsList.length === 0) {\n throw new Error('Environments not found in server response');\n }\n spinner.succeed();\n return environmentsList.filter(\n (environment: EnvironmentDetails) => environment.name !== project.targetEnvironment\n );\n } catch (e: any) {\n if (e.response && e.response.status === 404) {\n spinner.succeed();\n ctx.logger.warn(\n `\\nThe project associated with this folder does not exist in Strapi Cloud. \\nPlease link your local project to an existing Strapi Cloud project using the ${chalk.cyan(\n 'link'\n )} command.`\n );\n } else {\n spinner.fail('An error occurred while fetching environments data from Strapi Cloud.');\n ctx.logger.debug('Failed to list environments', e);\n }\n }\n}\n"],"names":["QUIT_OPTION","ctx","getValidToken","tokenServiceFactory","token","promptLogin","logger","project","getLocalProject","debug","cloudApiService","cloudApiFactory","environments","getEnvironmentsList","length","log","answer","promptUserForEnvironment","trackEvent","projectName","name","environmentName","targetEnvironment","local","e","error","process","exit","chalk","cyan","displayName","default","inquirer","prompt","type","message","choices","grey","value","spinner","start","data","environmentsList","listLinkEnvironments","Array","isArray","Error","succeed","filter","environment","response","status","warn","fail"],"mappings":"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"}
|
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import chalk from 'chalk';
|
|
2
|
-
import inquirer from 'inquirer';
|
|
3
2
|
import { cloudApiFactory } from '../../services/cli-api.mjs';
|
|
4
3
|
import { patch } from '../../services/strapi-info-save.mjs';
|
|
5
4
|
import { tokenServiceFactory } from '../../services/token.mjs';
|
|
@@ -65,6 +64,7 @@ var action = (async (ctx)=>{
|
|
|
65
64
|
async function promptUserForEnvironment(ctx, environments) {
|
|
66
65
|
const { logger } = ctx;
|
|
67
66
|
try {
|
|
67
|
+
const { default: inquirer } = await import('inquirer');
|
|
68
68
|
const answer = await inquirer.prompt([
|
|
69
69
|
{
|
|
70
70
|
type: 'list',
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"action.mjs","sources":["../../../src/environment/link/action.ts"],"sourcesContent":["import chalk from 'chalk';\nimport
|
|
1
|
+
{"version":3,"file":"action.mjs","sources":["../../../src/environment/link/action.ts"],"sourcesContent":["import chalk from 'chalk';\nimport type { Answers } from 'inquirer';\nimport { EnvironmentDetails, ProjectInput } from '../../services/cli-api';\nimport type { CLIContext, CloudApiService } from '../../types';\nimport { cloudApiFactory, tokenServiceFactory, local } from '../../services';\nimport { promptLogin } from '../../login/action';\nimport { trackEvent } from '../../utils/analytics';\nimport { getLocalProject } from '../../utils/get-local-config';\n\nconst QUIT_OPTION = 'Quit';\n\ninterface LinkEnvironmentAnswer extends Answers {\n targetEnvironment: string;\n}\n\ninterface LinkEnvironmentInput extends Answers {\n targetEnvironment: string;\n}\n\ntype EnvironmentsList = EnvironmentDetails[];\n\nexport default async (ctx: CLIContext) => {\n const { getValidToken } = await tokenServiceFactory(ctx);\n const token = await getValidToken(ctx, promptLogin);\n const { logger } = ctx;\n\n if (!token) {\n return;\n }\n\n const project = await getLocalProject(ctx);\n\n if (!project) {\n logger.debug(`No valid local project configuration was found.`);\n return;\n }\n\n const cloudApiService = await cloudApiFactory(ctx, token);\n const environments = await getEnvironmentsList(ctx, cloudApiService, project);\n\n if (!environments) {\n logger.debug(`Fetching environments failed.`);\n return;\n }\n\n if (environments.length === 0) {\n logger.log(\n `The only available environment is already linked. You can add a new one from your project settings on the Strapi Cloud dashboard.`\n );\n return;\n }\n\n const answer: LinkEnvironmentAnswer | null = await promptUserForEnvironment(ctx, environments);\n\n if (!answer) {\n return;\n }\n\n await trackEvent(ctx, cloudApiService, 'willLinkEnvironment', {\n projectName: project.name,\n environmentName: answer.targetEnvironment,\n });\n\n try {\n await local.patch({ project: { targetEnvironment: answer.targetEnvironment } });\n } catch (e) {\n await trackEvent(ctx, cloudApiService, 'didNotLinkEnvironment', {\n projectName: project.name,\n environmentName: answer.targetEnvironment,\n });\n logger.debug('Failed to link environment', e);\n logger.error(\n 'Failed to link the environment. If this issue persists, try re-linking your project or contact support.'\n );\n process.exit(1);\n }\n\n logger.log(\n ` You have successfully linked your project to ${chalk.cyan(answer.targetEnvironment)}, on ${chalk.cyan(project.displayName)}. You are now able to deploy your project.`\n );\n await trackEvent(ctx, cloudApiService, 'didLinkEnvironment', {\n projectName: project.name,\n environmentName: answer.targetEnvironment,\n });\n};\n\nasync function promptUserForEnvironment(\n ctx: CLIContext,\n environments: EnvironmentsList\n): Promise<LinkEnvironmentAnswer | null> {\n const { logger } = ctx;\n\n try {\n const { default: inquirer } = await import('inquirer');\n const answer: LinkEnvironmentInput = await inquirer.prompt([\n {\n type: 'list',\n name: 'targetEnvironment',\n message: 'Which environment do you want to link?',\n choices: [...environments, { name: chalk.grey(`(${QUIT_OPTION})`), value: null }],\n },\n ]);\n\n if (!answer.targetEnvironment) {\n return null;\n }\n\n return answer;\n } catch (e) {\n logger.debug('Failed to get user input', e);\n logger.error('An error occurred while trying to get your environment selection.');\n return null;\n }\n}\n\nasync function getEnvironmentsList(\n ctx: CLIContext,\n cloudApiService: CloudApiService,\n project: ProjectInput\n) {\n const spinner = ctx.logger.spinner('Fetching environments...\\n').start();\n\n try {\n const {\n data: { data: environmentsList },\n } = await cloudApiService.listLinkEnvironments({ name: project.name });\n\n if (!Array.isArray(environmentsList) || environmentsList.length === 0) {\n throw new Error('Environments not found in server response');\n }\n spinner.succeed();\n return environmentsList.filter(\n (environment: EnvironmentDetails) => environment.name !== project.targetEnvironment\n );\n } catch (e: any) {\n if (e.response && e.response.status === 404) {\n spinner.succeed();\n ctx.logger.warn(\n `\\nThe project associated with this folder does not exist in Strapi Cloud. \\nPlease link your local project to an existing Strapi Cloud project using the ${chalk.cyan(\n 'link'\n )} command.`\n );\n } else {\n spinner.fail('An error occurred while fetching environments data from Strapi Cloud.');\n ctx.logger.debug('Failed to list environments', e);\n }\n }\n}\n"],"names":["QUIT_OPTION","ctx","getValidToken","tokenServiceFactory","token","promptLogin","logger","project","getLocalProject","debug","cloudApiService","cloudApiFactory","environments","getEnvironmentsList","length","log","answer","promptUserForEnvironment","trackEvent","projectName","name","environmentName","targetEnvironment","local","e","error","process","exit","chalk","cyan","displayName","default","inquirer","prompt","type","message","choices","grey","value","spinner","start","data","environmentsList","listLinkEnvironments","Array","isArray","Error","succeed","filter","environment","response","status","warn","fail"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"action.d.ts","sourceRoot":"","sources":["../../src/link/action.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"action.d.ts","sourceRoot":"","sources":["../../src/link/action.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;8BAyIhB,UAAU;AAArC,wBAqEE"}
|
package/dist/link/action.js
CHANGED
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
var inquirer = require('inquirer');
|
|
4
3
|
var chalk = require('chalk');
|
|
5
4
|
var cliApi = require('../services/cli-api.js');
|
|
6
5
|
var strapiInfoSave = require('../services/strapi-info-save.js');
|
|
@@ -15,6 +14,7 @@ var getLocalConfig = require('../utils/get-local-config.js');
|
|
|
15
14
|
const QUIT_OPTION = 'Quit';
|
|
16
15
|
async function promptForRelink(ctx, cloudApiService, existingConfig) {
|
|
17
16
|
if (existingConfig && existingConfig.project) {
|
|
17
|
+
const { default: inquirer } = await import('inquirer');
|
|
18
18
|
const { shouldRelink } = await inquirer.prompt([
|
|
19
19
|
{
|
|
20
20
|
type: 'confirm',
|
|
@@ -64,6 +64,7 @@ async function getProjectsList(ctx, cloudApiService, existingConfig) {
|
|
|
64
64
|
async function getUserSelection(ctx, projects) {
|
|
65
65
|
const { logger } = ctx;
|
|
66
66
|
try {
|
|
67
|
+
const { default: inquirer } = await import('inquirer');
|
|
67
68
|
const answer = await inquirer.prompt([
|
|
68
69
|
{
|
|
69
70
|
type: 'list',
|
|
@@ -111,6 +112,7 @@ var action = (async (ctx)=>{
|
|
|
111
112
|
return;
|
|
112
113
|
}
|
|
113
114
|
try {
|
|
115
|
+
const { default: inquirer } = await import('inquirer');
|
|
114
116
|
const { confirmAction } = await inquirer.prompt([
|
|
115
117
|
{
|
|
116
118
|
type: 'confirm',
|
package/dist/link/action.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"action.js","sources":["../../src/link/action.ts"],"sourcesContent":["import inquirer from 'inquirer';\nimport chalk from 'chalk';\n\nimport type { Answers } from 'inquirer';\nimport type { CLIContext } from '../types';\nimport type { CloudApiService } from '../services/cli-api';\n\nimport { LocalSave } from '../services/strapi-info-save';\nimport { cloudApiFactory, tokenServiceFactory, local } from '../services';\nimport { promptLogin } from '../login/action';\nimport { trackEvent } from '../utils/analytics';\nimport { getLocalConfig } from '../utils/get-local-config';\n\nconst QUIT_OPTION = 'Quit';\n\ninterface LinkProjectValue {\n name: string;\n displayName: string;\n}\n\ninterface LinkProjectAnswer extends Answers {\n linkProject: LinkProjectValue;\n}\n\ninterface LinkProjectInput extends Answers {\n linkProject: LinkProjectValue | string;\n}\n\ntype ProjectsList = {\n name: string;\n value: {\n name: string;\n displayName: string;\n };\n}[];\n\ntype Project = {\n name: string;\n displayName: string;\n isMaintainer: boolean;\n};\n\nasync function promptForRelink(\n ctx: CLIContext,\n cloudApiService: CloudApiService,\n existingConfig: LocalSave | null\n) {\n if (existingConfig && existingConfig.project) {\n const { shouldRelink } = await inquirer.prompt([\n {\n type: 'confirm',\n name: 'shouldRelink',\n message: `A project named ${chalk.cyan(\n existingConfig.project.displayName\n ? existingConfig.project.displayName\n : existingConfig.project.name\n )} is already linked to this local folder. Do you want to update the link?`,\n default: false,\n },\n ]);\n\n if (!shouldRelink) {\n await trackEvent(ctx, cloudApiService, 'didNotLinkProject', {\n currentProjectName: existingConfig.project?.name,\n });\n return false;\n }\n }\n\n return true;\n}\n\nasync function getProjectsList(\n ctx: CLIContext,\n cloudApiService: CloudApiService,\n existingConfig: LocalSave | null\n) {\n const spinner = ctx.logger.spinner('Fetching your projects...\\n').start();\n\n try {\n const {\n data: { data: projectList },\n } = await cloudApiService.listLinkProjects();\n spinner.succeed();\n\n if (!Array.isArray(projectList)) {\n ctx.logger.log(\"We couldn't find any projects available for linking in Strapi Cloud.\");\n return null;\n }\n const projects: ProjectsList = (projectList as unknown as Project[])\n .filter(\n (project: Project) =>\n !(project.isMaintainer || project.name === existingConfig?.project?.name)\n )\n .map((project: Project) => {\n return {\n name: project.displayName,\n value: { name: project.name, displayName: project.displayName },\n };\n });\n if (projects.length === 0) {\n ctx.logger.log(\"We couldn't find any projects available for linking in Strapi Cloud.\");\n return null;\n }\n return projects;\n } catch (e) {\n spinner.fail('An error occurred while fetching your projects from Strapi Cloud.');\n ctx.logger.debug('Failed to list projects', e);\n return null;\n }\n}\n\nasync function getUserSelection(\n ctx: CLIContext,\n projects: ProjectsList\n): Promise<LinkProjectAnswer | null> {\n const { logger } = ctx;\n try {\n const answer: LinkProjectInput = await inquirer.prompt([\n {\n type: 'list',\n name: 'linkProject',\n message: 'Which project do you want to link?',\n choices: [...projects, { name: chalk.grey(`(${QUIT_OPTION})`), value: null }],\n },\n ]);\n\n if (!answer.linkProject) {\n return null;\n }\n\n return answer as LinkProjectAnswer;\n } catch (e) {\n logger.debug('Failed to get user input', e);\n logger.error('An error occurred while trying to get your input.');\n return null;\n }\n}\n\nexport default async (ctx: CLIContext) => {\n const { getValidToken } = await tokenServiceFactory(ctx);\n const token = await getValidToken(ctx, promptLogin);\n const { logger } = ctx;\n\n if (!token) {\n return;\n }\n\n const cloudApiService = await cloudApiFactory(ctx, token);\n\n const existingConfig: LocalSave | null = await getLocalConfig(ctx);\n const shouldRelink = await promptForRelink(ctx, cloudApiService, existingConfig);\n\n if (!shouldRelink) {\n return;\n }\n await trackEvent(ctx, cloudApiService, 'willLinkProject', {});\n\n const projects: ProjectsList | null | undefined = await getProjectsList(\n ctx,\n cloudApiService,\n existingConfig\n );\n\n if (!projects) {\n return;\n }\n\n const answer: LinkProjectAnswer | null = await getUserSelection(ctx, projects);\n\n if (!answer) {\n return;\n }\n\n try {\n const { confirmAction } = await inquirer.prompt([\n {\n type: 'confirm',\n name: 'confirmAction',\n message:\n 'Warning: Once linked, deploying from CLI will replace the existing project and its data. Confirm to proceed:',\n default: false,\n },\n ]);\n\n if (!confirmAction) {\n await trackEvent(ctx, cloudApiService, 'didNotLinkProject', {\n cancelledProjectName: answer.linkProject.name,\n currentProjectName: existingConfig ? existingConfig.project?.name : null,\n });\n return;\n }\n\n await local.save({ project: answer.linkProject });\n logger.log(\n ` You have successfully linked your project to ${chalk.cyan(answer.linkProject.displayName)}. You are now able to deploy your project.`\n );\n await trackEvent(ctx, cloudApiService, 'didLinkProject', {\n projectInternalName: answer.linkProject,\n });\n } catch (e) {\n logger.debug('Failed to link project', e);\n logger.error('An error occurred while linking the project.');\n await trackEvent(ctx, cloudApiService, 'didNotLinkProject', {\n projectInternalName: answer.linkProject,\n });\n }\n};\n"],"names":["QUIT_OPTION","promptForRelink","ctx","cloudApiService","existingConfig","project","shouldRelink","inquirer","prompt","type","name","message","chalk","cyan","displayName","default","trackEvent","currentProjectName","getProjectsList","spinner","logger","start","data","projectList","listLinkProjects","succeed","Array","isArray","log","projects","filter","isMaintainer","map","value","length","e","fail","debug","getUserSelection","answer","choices","grey","linkProject","error","getValidToken","tokenServiceFactory","token","promptLogin","cloudApiFactory","getLocalConfig","confirmAction","cancelledProjectName","local","projectInternalName"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"action.js","sources":["../../src/link/action.ts"],"sourcesContent":["import chalk from 'chalk';\n\nimport type { Answers } from 'inquirer';\nimport type { CLIContext } from '../types';\nimport type { CloudApiService } from '../services/cli-api';\n\nimport { LocalSave } from '../services/strapi-info-save';\nimport { cloudApiFactory, tokenServiceFactory, local } from '../services';\nimport { promptLogin } from '../login/action';\nimport { trackEvent } from '../utils/analytics';\nimport { getLocalConfig } from '../utils/get-local-config';\n\nconst QUIT_OPTION = 'Quit';\n\ninterface LinkProjectValue {\n name: string;\n displayName: string;\n}\n\ninterface LinkProjectAnswer extends Answers {\n linkProject: LinkProjectValue;\n}\n\ninterface LinkProjectInput extends Answers {\n linkProject: LinkProjectValue | string;\n}\n\ntype ProjectsList = {\n name: string;\n value: {\n name: string;\n displayName: string;\n };\n}[];\n\ntype Project = {\n name: string;\n displayName: string;\n isMaintainer: boolean;\n};\n\nasync function promptForRelink(\n ctx: CLIContext,\n cloudApiService: CloudApiService,\n existingConfig: LocalSave | null\n) {\n if (existingConfig && existingConfig.project) {\n const { default: inquirer } = await import('inquirer');\n const { shouldRelink } = await inquirer.prompt([\n {\n type: 'confirm',\n name: 'shouldRelink',\n message: `A project named ${chalk.cyan(\n existingConfig.project.displayName\n ? existingConfig.project.displayName\n : existingConfig.project.name\n )} is already linked to this local folder. Do you want to update the link?`,\n default: false,\n },\n ]);\n\n if (!shouldRelink) {\n await trackEvent(ctx, cloudApiService, 'didNotLinkProject', {\n currentProjectName: existingConfig.project?.name,\n });\n return false;\n }\n }\n\n return true;\n}\n\nasync function getProjectsList(\n ctx: CLIContext,\n cloudApiService: CloudApiService,\n existingConfig: LocalSave | null\n) {\n const spinner = ctx.logger.spinner('Fetching your projects...\\n').start();\n\n try {\n const {\n data: { data: projectList },\n } = await cloudApiService.listLinkProjects();\n spinner.succeed();\n\n if (!Array.isArray(projectList)) {\n ctx.logger.log(\"We couldn't find any projects available for linking in Strapi Cloud.\");\n return null;\n }\n const projects: ProjectsList = (projectList as unknown as Project[])\n .filter(\n (project: Project) =>\n !(project.isMaintainer || project.name === existingConfig?.project?.name)\n )\n .map((project: Project) => {\n return {\n name: project.displayName,\n value: { name: project.name, displayName: project.displayName },\n };\n });\n if (projects.length === 0) {\n ctx.logger.log(\"We couldn't find any projects available for linking in Strapi Cloud.\");\n return null;\n }\n return projects;\n } catch (e) {\n spinner.fail('An error occurred while fetching your projects from Strapi Cloud.');\n ctx.logger.debug('Failed to list projects', e);\n return null;\n }\n}\n\nasync function getUserSelection(\n ctx: CLIContext,\n projects: ProjectsList\n): Promise<LinkProjectAnswer | null> {\n const { logger } = ctx;\n try {\n const { default: inquirer } = await import('inquirer');\n const answer: LinkProjectInput = await inquirer.prompt([\n {\n type: 'list',\n name: 'linkProject',\n message: 'Which project do you want to link?',\n choices: [...projects, { name: chalk.grey(`(${QUIT_OPTION})`), value: null }],\n },\n ]);\n\n if (!answer.linkProject) {\n return null;\n }\n\n return answer as LinkProjectAnswer;\n } catch (e) {\n logger.debug('Failed to get user input', e);\n logger.error('An error occurred while trying to get your input.');\n return null;\n }\n}\n\nexport default async (ctx: CLIContext) => {\n const { getValidToken } = await tokenServiceFactory(ctx);\n const token = await getValidToken(ctx, promptLogin);\n const { logger } = ctx;\n\n if (!token) {\n return;\n }\n\n const cloudApiService = await cloudApiFactory(ctx, token);\n\n const existingConfig: LocalSave | null = await getLocalConfig(ctx);\n const shouldRelink = await promptForRelink(ctx, cloudApiService, existingConfig);\n\n if (!shouldRelink) {\n return;\n }\n await trackEvent(ctx, cloudApiService, 'willLinkProject', {});\n\n const projects: ProjectsList | null | undefined = await getProjectsList(\n ctx,\n cloudApiService,\n existingConfig\n );\n\n if (!projects) {\n return;\n }\n\n const answer: LinkProjectAnswer | null = await getUserSelection(ctx, projects);\n\n if (!answer) {\n return;\n }\n\n try {\n const { default: inquirer } = await import('inquirer');\n const { confirmAction } = await inquirer.prompt([\n {\n type: 'confirm',\n name: 'confirmAction',\n message:\n 'Warning: Once linked, deploying from CLI will replace the existing project and its data. Confirm to proceed:',\n default: false,\n },\n ]);\n\n if (!confirmAction) {\n await trackEvent(ctx, cloudApiService, 'didNotLinkProject', {\n cancelledProjectName: answer.linkProject.name,\n currentProjectName: existingConfig ? existingConfig.project?.name : null,\n });\n return;\n }\n\n await local.save({ project: answer.linkProject });\n logger.log(\n ` You have successfully linked your project to ${chalk.cyan(answer.linkProject.displayName)}. You are now able to deploy your project.`\n );\n await trackEvent(ctx, cloudApiService, 'didLinkProject', {\n projectInternalName: answer.linkProject,\n });\n } catch (e) {\n logger.debug('Failed to link project', e);\n logger.error('An error occurred while linking the project.');\n await trackEvent(ctx, cloudApiService, 'didNotLinkProject', {\n projectInternalName: answer.linkProject,\n });\n }\n};\n"],"names":["QUIT_OPTION","promptForRelink","ctx","cloudApiService","existingConfig","project","default","inquirer","shouldRelink","prompt","type","name","message","chalk","cyan","displayName","trackEvent","currentProjectName","getProjectsList","spinner","logger","start","data","projectList","listLinkProjects","succeed","Array","isArray","log","projects","filter","isMaintainer","map","value","length","e","fail","debug","getUserSelection","answer","choices","grey","linkProject","error","getValidToken","tokenServiceFactory","token","promptLogin","cloudApiFactory","getLocalConfig","confirmAction","cancelledProjectName","local","projectInternalName"],"mappings":"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"}
|
package/dist/link/action.mjs
CHANGED
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import inquirer from 'inquirer';
|
|
2
1
|
import chalk from 'chalk';
|
|
3
2
|
import { cloudApiFactory } from '../services/cli-api.mjs';
|
|
4
3
|
import { save } from '../services/strapi-info-save.mjs';
|
|
@@ -13,6 +12,7 @@ import { getLocalConfig } from '../utils/get-local-config.mjs';
|
|
|
13
12
|
const QUIT_OPTION = 'Quit';
|
|
14
13
|
async function promptForRelink(ctx, cloudApiService, existingConfig) {
|
|
15
14
|
if (existingConfig && existingConfig.project) {
|
|
15
|
+
const { default: inquirer } = await import('inquirer');
|
|
16
16
|
const { shouldRelink } = await inquirer.prompt([
|
|
17
17
|
{
|
|
18
18
|
type: 'confirm',
|
|
@@ -62,6 +62,7 @@ async function getProjectsList(ctx, cloudApiService, existingConfig) {
|
|
|
62
62
|
async function getUserSelection(ctx, projects) {
|
|
63
63
|
const { logger } = ctx;
|
|
64
64
|
try {
|
|
65
|
+
const { default: inquirer } = await import('inquirer');
|
|
65
66
|
const answer = await inquirer.prompt([
|
|
66
67
|
{
|
|
67
68
|
type: 'list',
|
|
@@ -109,6 +110,7 @@ var action = (async (ctx)=>{
|
|
|
109
110
|
return;
|
|
110
111
|
}
|
|
111
112
|
try {
|
|
113
|
+
const { default: inquirer } = await import('inquirer');
|
|
112
114
|
const { confirmAction } = await inquirer.prompt([
|
|
113
115
|
{
|
|
114
116
|
type: 'confirm',
|
package/dist/link/action.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"action.mjs","sources":["../../src/link/action.ts"],"sourcesContent":["import inquirer from 'inquirer';\nimport chalk from 'chalk';\n\nimport type { Answers } from 'inquirer';\nimport type { CLIContext } from '../types';\nimport type { CloudApiService } from '../services/cli-api';\n\nimport { LocalSave } from '../services/strapi-info-save';\nimport { cloudApiFactory, tokenServiceFactory, local } from '../services';\nimport { promptLogin } from '../login/action';\nimport { trackEvent } from '../utils/analytics';\nimport { getLocalConfig } from '../utils/get-local-config';\n\nconst QUIT_OPTION = 'Quit';\n\ninterface LinkProjectValue {\n name: string;\n displayName: string;\n}\n\ninterface LinkProjectAnswer extends Answers {\n linkProject: LinkProjectValue;\n}\n\ninterface LinkProjectInput extends Answers {\n linkProject: LinkProjectValue | string;\n}\n\ntype ProjectsList = {\n name: string;\n value: {\n name: string;\n displayName: string;\n };\n}[];\n\ntype Project = {\n name: string;\n displayName: string;\n isMaintainer: boolean;\n};\n\nasync function promptForRelink(\n ctx: CLIContext,\n cloudApiService: CloudApiService,\n existingConfig: LocalSave | null\n) {\n if (existingConfig && existingConfig.project) {\n const { shouldRelink } = await inquirer.prompt([\n {\n type: 'confirm',\n name: 'shouldRelink',\n message: `A project named ${chalk.cyan(\n existingConfig.project.displayName\n ? existingConfig.project.displayName\n : existingConfig.project.name\n )} is already linked to this local folder. Do you want to update the link?`,\n default: false,\n },\n ]);\n\n if (!shouldRelink) {\n await trackEvent(ctx, cloudApiService, 'didNotLinkProject', {\n currentProjectName: existingConfig.project?.name,\n });\n return false;\n }\n }\n\n return true;\n}\n\nasync function getProjectsList(\n ctx: CLIContext,\n cloudApiService: CloudApiService,\n existingConfig: LocalSave | null\n) {\n const spinner = ctx.logger.spinner('Fetching your projects...\\n').start();\n\n try {\n const {\n data: { data: projectList },\n } = await cloudApiService.listLinkProjects();\n spinner.succeed();\n\n if (!Array.isArray(projectList)) {\n ctx.logger.log(\"We couldn't find any projects available for linking in Strapi Cloud.\");\n return null;\n }\n const projects: ProjectsList = (projectList as unknown as Project[])\n .filter(\n (project: Project) =>\n !(project.isMaintainer || project.name === existingConfig?.project?.name)\n )\n .map((project: Project) => {\n return {\n name: project.displayName,\n value: { name: project.name, displayName: project.displayName },\n };\n });\n if (projects.length === 0) {\n ctx.logger.log(\"We couldn't find any projects available for linking in Strapi Cloud.\");\n return null;\n }\n return projects;\n } catch (e) {\n spinner.fail('An error occurred while fetching your projects from Strapi Cloud.');\n ctx.logger.debug('Failed to list projects', e);\n return null;\n }\n}\n\nasync function getUserSelection(\n ctx: CLIContext,\n projects: ProjectsList\n): Promise<LinkProjectAnswer | null> {\n const { logger } = ctx;\n try {\n const answer: LinkProjectInput = await inquirer.prompt([\n {\n type: 'list',\n name: 'linkProject',\n message: 'Which project do you want to link?',\n choices: [...projects, { name: chalk.grey(`(${QUIT_OPTION})`), value: null }],\n },\n ]);\n\n if (!answer.linkProject) {\n return null;\n }\n\n return answer as LinkProjectAnswer;\n } catch (e) {\n logger.debug('Failed to get user input', e);\n logger.error('An error occurred while trying to get your input.');\n return null;\n }\n}\n\nexport default async (ctx: CLIContext) => {\n const { getValidToken } = await tokenServiceFactory(ctx);\n const token = await getValidToken(ctx, promptLogin);\n const { logger } = ctx;\n\n if (!token) {\n return;\n }\n\n const cloudApiService = await cloudApiFactory(ctx, token);\n\n const existingConfig: LocalSave | null = await getLocalConfig(ctx);\n const shouldRelink = await promptForRelink(ctx, cloudApiService, existingConfig);\n\n if (!shouldRelink) {\n return;\n }\n await trackEvent(ctx, cloudApiService, 'willLinkProject', {});\n\n const projects: ProjectsList | null | undefined = await getProjectsList(\n ctx,\n cloudApiService,\n existingConfig\n );\n\n if (!projects) {\n return;\n }\n\n const answer: LinkProjectAnswer | null = await getUserSelection(ctx, projects);\n\n if (!answer) {\n return;\n }\n\n try {\n const { confirmAction } = await inquirer.prompt([\n {\n type: 'confirm',\n name: 'confirmAction',\n message:\n 'Warning: Once linked, deploying from CLI will replace the existing project and its data. Confirm to proceed:',\n default: false,\n },\n ]);\n\n if (!confirmAction) {\n await trackEvent(ctx, cloudApiService, 'didNotLinkProject', {\n cancelledProjectName: answer.linkProject.name,\n currentProjectName: existingConfig ? existingConfig.project?.name : null,\n });\n return;\n }\n\n await local.save({ project: answer.linkProject });\n logger.log(\n ` You have successfully linked your project to ${chalk.cyan(answer.linkProject.displayName)}. You are now able to deploy your project.`\n );\n await trackEvent(ctx, cloudApiService, 'didLinkProject', {\n projectInternalName: answer.linkProject,\n });\n } catch (e) {\n logger.debug('Failed to link project', e);\n logger.error('An error occurred while linking the project.');\n await trackEvent(ctx, cloudApiService, 'didNotLinkProject', {\n projectInternalName: answer.linkProject,\n });\n }\n};\n"],"names":["QUIT_OPTION","promptForRelink","ctx","cloudApiService","existingConfig","project","shouldRelink","inquirer","prompt","type","name","message","chalk","cyan","displayName","default","trackEvent","currentProjectName","getProjectsList","spinner","logger","start","data","projectList","listLinkProjects","succeed","Array","isArray","log","projects","filter","isMaintainer","map","value","length","e","fail","debug","getUserSelection","answer","choices","grey","linkProject","error","getValidToken","tokenServiceFactory","token","promptLogin","cloudApiFactory","getLocalConfig","confirmAction","cancelledProjectName","local","projectInternalName"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"action.mjs","sources":["../../src/link/action.ts"],"sourcesContent":["import chalk from 'chalk';\n\nimport type { Answers } from 'inquirer';\nimport type { CLIContext } from '../types';\nimport type { CloudApiService } from '../services/cli-api';\n\nimport { LocalSave } from '../services/strapi-info-save';\nimport { cloudApiFactory, tokenServiceFactory, local } from '../services';\nimport { promptLogin } from '../login/action';\nimport { trackEvent } from '../utils/analytics';\nimport { getLocalConfig } from '../utils/get-local-config';\n\nconst QUIT_OPTION = 'Quit';\n\ninterface LinkProjectValue {\n name: string;\n displayName: string;\n}\n\ninterface LinkProjectAnswer extends Answers {\n linkProject: LinkProjectValue;\n}\n\ninterface LinkProjectInput extends Answers {\n linkProject: LinkProjectValue | string;\n}\n\ntype ProjectsList = {\n name: string;\n value: {\n name: string;\n displayName: string;\n };\n}[];\n\ntype Project = {\n name: string;\n displayName: string;\n isMaintainer: boolean;\n};\n\nasync function promptForRelink(\n ctx: CLIContext,\n cloudApiService: CloudApiService,\n existingConfig: LocalSave | null\n) {\n if (existingConfig && existingConfig.project) {\n const { default: inquirer } = await import('inquirer');\n const { shouldRelink } = await inquirer.prompt([\n {\n type: 'confirm',\n name: 'shouldRelink',\n message: `A project named ${chalk.cyan(\n existingConfig.project.displayName\n ? existingConfig.project.displayName\n : existingConfig.project.name\n )} is already linked to this local folder. Do you want to update the link?`,\n default: false,\n },\n ]);\n\n if (!shouldRelink) {\n await trackEvent(ctx, cloudApiService, 'didNotLinkProject', {\n currentProjectName: existingConfig.project?.name,\n });\n return false;\n }\n }\n\n return true;\n}\n\nasync function getProjectsList(\n ctx: CLIContext,\n cloudApiService: CloudApiService,\n existingConfig: LocalSave | null\n) {\n const spinner = ctx.logger.spinner('Fetching your projects...\\n').start();\n\n try {\n const {\n data: { data: projectList },\n } = await cloudApiService.listLinkProjects();\n spinner.succeed();\n\n if (!Array.isArray(projectList)) {\n ctx.logger.log(\"We couldn't find any projects available for linking in Strapi Cloud.\");\n return null;\n }\n const projects: ProjectsList = (projectList as unknown as Project[])\n .filter(\n (project: Project) =>\n !(project.isMaintainer || project.name === existingConfig?.project?.name)\n )\n .map((project: Project) => {\n return {\n name: project.displayName,\n value: { name: project.name, displayName: project.displayName },\n };\n });\n if (projects.length === 0) {\n ctx.logger.log(\"We couldn't find any projects available for linking in Strapi Cloud.\");\n return null;\n }\n return projects;\n } catch (e) {\n spinner.fail('An error occurred while fetching your projects from Strapi Cloud.');\n ctx.logger.debug('Failed to list projects', e);\n return null;\n }\n}\n\nasync function getUserSelection(\n ctx: CLIContext,\n projects: ProjectsList\n): Promise<LinkProjectAnswer | null> {\n const { logger } = ctx;\n try {\n const { default: inquirer } = await import('inquirer');\n const answer: LinkProjectInput = await inquirer.prompt([\n {\n type: 'list',\n name: 'linkProject',\n message: 'Which project do you want to link?',\n choices: [...projects, { name: chalk.grey(`(${QUIT_OPTION})`), value: null }],\n },\n ]);\n\n if (!answer.linkProject) {\n return null;\n }\n\n return answer as LinkProjectAnswer;\n } catch (e) {\n logger.debug('Failed to get user input', e);\n logger.error('An error occurred while trying to get your input.');\n return null;\n }\n}\n\nexport default async (ctx: CLIContext) => {\n const { getValidToken } = await tokenServiceFactory(ctx);\n const token = await getValidToken(ctx, promptLogin);\n const { logger } = ctx;\n\n if (!token) {\n return;\n }\n\n const cloudApiService = await cloudApiFactory(ctx, token);\n\n const existingConfig: LocalSave | null = await getLocalConfig(ctx);\n const shouldRelink = await promptForRelink(ctx, cloudApiService, existingConfig);\n\n if (!shouldRelink) {\n return;\n }\n await trackEvent(ctx, cloudApiService, 'willLinkProject', {});\n\n const projects: ProjectsList | null | undefined = await getProjectsList(\n ctx,\n cloudApiService,\n existingConfig\n );\n\n if (!projects) {\n return;\n }\n\n const answer: LinkProjectAnswer | null = await getUserSelection(ctx, projects);\n\n if (!answer) {\n return;\n }\n\n try {\n const { default: inquirer } = await import('inquirer');\n const { confirmAction } = await inquirer.prompt([\n {\n type: 'confirm',\n name: 'confirmAction',\n message:\n 'Warning: Once linked, deploying from CLI will replace the existing project and its data. Confirm to proceed:',\n default: false,\n },\n ]);\n\n if (!confirmAction) {\n await trackEvent(ctx, cloudApiService, 'didNotLinkProject', {\n cancelledProjectName: answer.linkProject.name,\n currentProjectName: existingConfig ? existingConfig.project?.name : null,\n });\n return;\n }\n\n await local.save({ project: answer.linkProject });\n logger.log(\n ` You have successfully linked your project to ${chalk.cyan(answer.linkProject.displayName)}. You are now able to deploy your project.`\n );\n await trackEvent(ctx, cloudApiService, 'didLinkProject', {\n projectInternalName: answer.linkProject,\n });\n } catch (e) {\n logger.debug('Failed to link project', e);\n logger.error('An error occurred while linking the project.');\n await trackEvent(ctx, cloudApiService, 'didNotLinkProject', {\n projectInternalName: answer.linkProject,\n });\n }\n};\n"],"names":["QUIT_OPTION","promptForRelink","ctx","cloudApiService","existingConfig","project","default","inquirer","shouldRelink","prompt","type","name","message","chalk","cyan","displayName","trackEvent","currentProjectName","getProjectsList","spinner","logger","start","data","projectList","listLinkProjects","succeed","Array","isArray","log","projects","filter","isMaintainer","map","value","length","e","fail","debug","getUserSelection","answer","choices","grey","linkProject","error","getValidToken","tokenServiceFactory","token","promptLogin","cloudApiFactory","getLocalConfig","confirmAction","cancelledProjectName","local","projectInternalName"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"action.d.ts","sourceRoot":"","sources":["../../src/login/action.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"action.d.ts","sourceRoot":"","sources":["../../src/login/action.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAkB,UAAU,EAAE,MAAM,UAAU,CAAC;AAO3D,wBAAsB,WAAW,CAAC,GAAG,EAAE,UAAU,oBAehD;AAED,wBAA8B,WAAW,CACvC,GAAG,EAAE,UAAU,EACf,EAAE,iBAAwB,EAAE,GAAE;IAAE,iBAAiB,CAAC,EAAE,OAAO,CAAA;CAAO,GACjE,OAAO,CAAC,OAAO,CAAC,CAgLlB"}
|
package/dist/login/action.js
CHANGED
|
@@ -4,7 +4,6 @@ Object.defineProperty(exports, '__esModule', { value: true });
|
|
|
4
4
|
|
|
5
5
|
var axios = require('axios');
|
|
6
6
|
var chalk = require('chalk');
|
|
7
|
-
var inquirer = require('inquirer');
|
|
8
7
|
var cliApi = require('../services/cli-api.js');
|
|
9
8
|
require('fs-extra');
|
|
10
9
|
require('path');
|
|
@@ -19,6 +18,7 @@ var context = require('../services/context.js');
|
|
|
19
18
|
|
|
20
19
|
const openModule = import('open');
|
|
21
20
|
async function promptLogin(ctx) {
|
|
21
|
+
const { default: inquirer } = await import('inquirer');
|
|
22
22
|
const response = await inquirer.prompt([
|
|
23
23
|
{
|
|
24
24
|
type: 'confirm',
|
package/dist/login/action.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"action.js","sources":["../../src/login/action.ts"],"sourcesContent":["import axios, { AxiosResponse, AxiosError } from 'axios';\nimport chalk from 'chalk';\nimport inquirer from 'inquirer';\nimport { tokenServiceFactory, cloudApiFactory } from '../services';\nimport type { CloudCliConfig, CLIContext } from '../types';\nimport { apiConfig } from '../config/api';\nimport { trackEvent } from '../utils/analytics';\nimport { setContext } from '../services/context';\n\nconst openModule = import('open');\n\nexport async function promptLogin(ctx: CLIContext) {\n const response = await inquirer.prompt([\n {\n type: 'confirm',\n name: 'login',\n message: 'Would you like to login?',\n },\n ]);\n\n if (response.login) {\n const loginSuccessful = await loginAction(ctx);\n return loginSuccessful;\n }\n return false;\n}\n\nexport default async function loginAction(\n ctx: CLIContext,\n { showDashboardLink = true }: { showDashboardLink?: boolean } = {}\n): Promise<boolean> {\n const { logger, promptExperiment } = ctx;\n const tokenService = await tokenServiceFactory(ctx);\n const existingToken = await tokenService.retrieveToken();\n const cloudApiService = await cloudApiFactory(ctx, existingToken || undefined);\n\n if (existingToken) {\n const isTokenValid = await tokenService.isTokenValid(existingToken);\n if (isTokenValid) {\n try {\n const userInfo = await cloudApiService.getUserInfo();\n const { email } = userInfo.data.data;\n setContext({ ...ctx, user: userInfo.data.data });\n if (email) {\n logger.log(`You are already logged into your account (${email}).`);\n } else {\n logger.log('You are already logged in.');\n }\n if (showDashboardLink) {\n logger.log(\n 'To access your dashboard, please copy and paste the following URL into your web browser:'\n );\n logger.log(chalk.underline(`${apiConfig.dashboardBaseUrl}/projects`));\n }\n return true;\n } catch (e) {\n logger.debug('Failed to fetch user info', e);\n }\n }\n }\n\n let cliConfig: CloudCliConfig;\n try {\n logger.info('🔌 Connecting...');\n const config = await cloudApiService.config();\n cliConfig = config.data;\n } catch (e: unknown) {\n logger.error('🥲 Oops! Something went wrong while logging you in. Please try again.');\n logger.debug(e);\n return false;\n }\n await trackEvent(ctx, cloudApiService, 'willLoginAttempt', {\n ...(promptExperiment && { promptExperiment }),\n });\n\n logger.debug('🔐 Creating device authentication request...', {\n client_id: cliConfig.clientId,\n scope: cliConfig.scope,\n audience: cliConfig.audience,\n });\n const deviceAuthResponse = (await axios\n .post(cliConfig.deviceCodeAuthUrl, {\n client_id: cliConfig.clientId,\n scope: cliConfig.scope,\n audience: cliConfig.audience,\n })\n .catch((e: AxiosError) => {\n logger.error('There was an issue with the authentication process. Please try again.');\n if (e.message) {\n logger.debug(e.message, e);\n } else {\n logger.debug(e);\n }\n })) as AxiosResponse;\n\n openModule.then((open) => {\n open.default(deviceAuthResponse.data.verification_uri_complete).catch((e: Error) => {\n logger.error('We encountered an issue opening the browser. Please try again later.');\n logger.debug(e.message, e);\n });\n });\n\n logger.log('If a browser tab does not open automatically, please follow the next steps:');\n logger.log(\n `1. Open this url in your device: ${deviceAuthResponse.data.verification_uri_complete}`\n );\n logger.log(\n `2. Enter the following code: ${deviceAuthResponse.data.user_code} and confirm to login.\\n`\n );\n\n const tokenPayload = {\n grant_type: 'urn:ietf:params:oauth:grant-type:device_code',\n device_code: deviceAuthResponse.data.device_code,\n client_id: cliConfig.clientId,\n };\n\n let isAuthenticated = false;\n\n const authenticate = async () => {\n const spinner = logger.spinner('Waiting for authentication');\n spinner.start();\n const spinnerFail = () => spinner.fail('Authentication failed!');\n\n while (!isAuthenticated) {\n try {\n const tokenResponse = await axios.post(cliConfig.tokenUrl, tokenPayload);\n const authTokenData = tokenResponse.data;\n\n if (tokenResponse.status === 200) {\n // Token validation\n try {\n logger.debug('🔐 Validating token...');\n await tokenService.validateToken(authTokenData.id_token, cliConfig.jwksUrl);\n logger.debug('🔐 Token validation successful!');\n } catch (e: any) {\n logger.debug(e);\n spinnerFail();\n throw new Error('Unable to proceed: Token validation failed');\n }\n\n logger.debug('🔍 Fetching user information...');\n const cloudApiServiceWithToken = await cloudApiFactory(ctx, authTokenData.access_token);\n // Call to get user info to create the user in DB if not exists\n await cloudApiServiceWithToken.getUserInfo();\n logger.debug('🔍 User information fetched successfully!');\n\n try {\n logger.debug('📝 Saving login information...');\n await tokenService.saveToken(authTokenData.access_token);\n logger.debug('📝 Login information saved successfully!');\n isAuthenticated = true;\n } catch (e) {\n logger.error(\n 'There was a problem saving your login information. Please try logging in again.'\n );\n logger.debug(e);\n spinnerFail();\n return false;\n }\n }\n } catch (e: any) {\n if (e.message === 'Unable to proceed: Token validation failed') {\n logger.error(\n 'There seems to be a problem with your login information. Please try logging in again.'\n );\n spinnerFail();\n await trackEvent(ctx, cloudApiService, 'didNotLogin', {\n loginMethod: 'cli',\n ...(promptExperiment && { promptExperiment }),\n });\n return false;\n }\n if (\n e.response?.data.error &&\n !['authorization_pending', 'slow_down'].includes(e!.response.data.error)\n ) {\n logger.debug(e);\n spinnerFail();\n await trackEvent(ctx, cloudApiService, 'didNotLogin', {\n loginMethod: 'cli',\n ...(promptExperiment && { promptExperiment }),\n });\n return false;\n }\n // Await interval before retrying\n await new Promise((resolve) => {\n setTimeout(resolve, deviceAuthResponse.data.interval * 1000);\n });\n }\n }\n spinner.succeed('Authentication successful!');\n if (showDashboardLink) {\n logger.log('You are now logged into Strapi Cloud.');\n logger.log(\n 'To access your dashboard, please copy and paste the following URL into your web browser:'\n );\n logger.log(chalk.underline(`${apiConfig.dashboardBaseUrl}/projects`));\n }\n await trackEvent(ctx, cloudApiService, 'didLogin', {\n loginMethod: 'cli',\n ...(promptExperiment && { promptExperiment }),\n });\n };\n\n await authenticate();\n return isAuthenticated;\n}\n"],"names":["openModule","promptLogin","ctx","response","inquirer","prompt","type","name","message","login","loginSuccessful","loginAction","showDashboardLink","logger","promptExperiment","tokenService","tokenServiceFactory","existingToken","retrieveToken","cloudApiService","cloudApiFactory","undefined","isTokenValid","userInfo","getUserInfo","email","data","setContext","user","log","chalk","underline","apiConfig","dashboardBaseUrl","e","debug","cliConfig","info","config","error","trackEvent","client_id","clientId","scope","audience","deviceAuthResponse","axios","post","deviceCodeAuthUrl","catch","then","open","default","verification_uri_complete","user_code","tokenPayload","grant_type","device_code","isAuthenticated","authenticate","spinner","start","spinnerFail","fail","tokenResponse","tokenUrl","authTokenData","status","validateToken","id_token","jwksUrl","Error","cloudApiServiceWithToken","access_token","saveToken","loginMethod","includes","Promise","resolve","setTimeout","interval","succeed"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"action.js","sources":["../../src/login/action.ts"],"sourcesContent":["import axios, { AxiosResponse, AxiosError } from 'axios';\nimport chalk from 'chalk';\nimport { tokenServiceFactory, cloudApiFactory } from '../services';\nimport type { CloudCliConfig, CLIContext } from '../types';\nimport { apiConfig } from '../config/api';\nimport { trackEvent } from '../utils/analytics';\nimport { setContext } from '../services/context';\n\nconst openModule = import('open');\n\nexport async function promptLogin(ctx: CLIContext) {\n const { default: inquirer } = await import('inquirer');\n const response = await inquirer.prompt([\n {\n type: 'confirm',\n name: 'login',\n message: 'Would you like to login?',\n },\n ]);\n\n if (response.login) {\n const loginSuccessful = await loginAction(ctx);\n return loginSuccessful;\n }\n return false;\n}\n\nexport default async function loginAction(\n ctx: CLIContext,\n { showDashboardLink = true }: { showDashboardLink?: boolean } = {}\n): Promise<boolean> {\n const { logger, promptExperiment } = ctx;\n const tokenService = await tokenServiceFactory(ctx);\n const existingToken = await tokenService.retrieveToken();\n const cloudApiService = await cloudApiFactory(ctx, existingToken || undefined);\n\n if (existingToken) {\n const isTokenValid = await tokenService.isTokenValid(existingToken);\n if (isTokenValid) {\n try {\n const userInfo = await cloudApiService.getUserInfo();\n const { email } = userInfo.data.data;\n setContext({ ...ctx, user: userInfo.data.data });\n if (email) {\n logger.log(`You are already logged into your account (${email}).`);\n } else {\n logger.log('You are already logged in.');\n }\n if (showDashboardLink) {\n logger.log(\n 'To access your dashboard, please copy and paste the following URL into your web browser:'\n );\n logger.log(chalk.underline(`${apiConfig.dashboardBaseUrl}/projects`));\n }\n return true;\n } catch (e) {\n logger.debug('Failed to fetch user info', e);\n }\n }\n }\n\n let cliConfig: CloudCliConfig;\n try {\n logger.info('🔌 Connecting...');\n const config = await cloudApiService.config();\n cliConfig = config.data;\n } catch (e: unknown) {\n logger.error('🥲 Oops! Something went wrong while logging you in. Please try again.');\n logger.debug(e);\n return false;\n }\n await trackEvent(ctx, cloudApiService, 'willLoginAttempt', {\n ...(promptExperiment && { promptExperiment }),\n });\n\n logger.debug('🔐 Creating device authentication request...', {\n client_id: cliConfig.clientId,\n scope: cliConfig.scope,\n audience: cliConfig.audience,\n });\n const deviceAuthResponse = (await axios\n .post(cliConfig.deviceCodeAuthUrl, {\n client_id: cliConfig.clientId,\n scope: cliConfig.scope,\n audience: cliConfig.audience,\n })\n .catch((e: AxiosError) => {\n logger.error('There was an issue with the authentication process. Please try again.');\n if (e.message) {\n logger.debug(e.message, e);\n } else {\n logger.debug(e);\n }\n })) as AxiosResponse;\n\n openModule.then((open) => {\n open.default(deviceAuthResponse.data.verification_uri_complete).catch((e: Error) => {\n logger.error('We encountered an issue opening the browser. Please try again later.');\n logger.debug(e.message, e);\n });\n });\n\n logger.log('If a browser tab does not open automatically, please follow the next steps:');\n logger.log(\n `1. Open this url in your device: ${deviceAuthResponse.data.verification_uri_complete}`\n );\n logger.log(\n `2. Enter the following code: ${deviceAuthResponse.data.user_code} and confirm to login.\\n`\n );\n\n const tokenPayload = {\n grant_type: 'urn:ietf:params:oauth:grant-type:device_code',\n device_code: deviceAuthResponse.data.device_code,\n client_id: cliConfig.clientId,\n };\n\n let isAuthenticated = false;\n\n const authenticate = async () => {\n const spinner = logger.spinner('Waiting for authentication');\n spinner.start();\n const spinnerFail = () => spinner.fail('Authentication failed!');\n\n while (!isAuthenticated) {\n try {\n const tokenResponse = await axios.post(cliConfig.tokenUrl, tokenPayload);\n const authTokenData = tokenResponse.data;\n\n if (tokenResponse.status === 200) {\n // Token validation\n try {\n logger.debug('🔐 Validating token...');\n await tokenService.validateToken(authTokenData.id_token, cliConfig.jwksUrl);\n logger.debug('🔐 Token validation successful!');\n } catch (e: any) {\n logger.debug(e);\n spinnerFail();\n throw new Error('Unable to proceed: Token validation failed');\n }\n\n logger.debug('🔍 Fetching user information...');\n const cloudApiServiceWithToken = await cloudApiFactory(ctx, authTokenData.access_token);\n // Call to get user info to create the user in DB if not exists\n await cloudApiServiceWithToken.getUserInfo();\n logger.debug('🔍 User information fetched successfully!');\n\n try {\n logger.debug('📝 Saving login information...');\n await tokenService.saveToken(authTokenData.access_token);\n logger.debug('📝 Login information saved successfully!');\n isAuthenticated = true;\n } catch (e) {\n logger.error(\n 'There was a problem saving your login information. Please try logging in again.'\n );\n logger.debug(e);\n spinnerFail();\n return false;\n }\n }\n } catch (e: any) {\n if (e.message === 'Unable to proceed: Token validation failed') {\n logger.error(\n 'There seems to be a problem with your login information. Please try logging in again.'\n );\n spinnerFail();\n await trackEvent(ctx, cloudApiService, 'didNotLogin', {\n loginMethod: 'cli',\n ...(promptExperiment && { promptExperiment }),\n });\n return false;\n }\n if (\n e.response?.data.error &&\n !['authorization_pending', 'slow_down'].includes(e!.response.data.error)\n ) {\n logger.debug(e);\n spinnerFail();\n await trackEvent(ctx, cloudApiService, 'didNotLogin', {\n loginMethod: 'cli',\n ...(promptExperiment && { promptExperiment }),\n });\n return false;\n }\n // Await interval before retrying\n await new Promise((resolve) => {\n setTimeout(resolve, deviceAuthResponse.data.interval * 1000);\n });\n }\n }\n spinner.succeed('Authentication successful!');\n if (showDashboardLink) {\n logger.log('You are now logged into Strapi Cloud.');\n logger.log(\n 'To access your dashboard, please copy and paste the following URL into your web browser:'\n );\n logger.log(chalk.underline(`${apiConfig.dashboardBaseUrl}/projects`));\n }\n await trackEvent(ctx, cloudApiService, 'didLogin', {\n loginMethod: 'cli',\n ...(promptExperiment && { promptExperiment }),\n });\n };\n\n await authenticate();\n return isAuthenticated;\n}\n"],"names":["openModule","promptLogin","ctx","default","inquirer","response","prompt","type","name","message","login","loginSuccessful","loginAction","showDashboardLink","logger","promptExperiment","tokenService","tokenServiceFactory","existingToken","retrieveToken","cloudApiService","cloudApiFactory","undefined","isTokenValid","userInfo","getUserInfo","email","data","setContext","user","log","chalk","underline","apiConfig","dashboardBaseUrl","e","debug","cliConfig","info","config","error","trackEvent","client_id","clientId","scope","audience","deviceAuthResponse","axios","post","deviceCodeAuthUrl","catch","then","open","verification_uri_complete","user_code","tokenPayload","grant_type","device_code","isAuthenticated","authenticate","spinner","start","spinnerFail","fail","tokenResponse","tokenUrl","authTokenData","status","validateToken","id_token","jwksUrl","Error","cloudApiServiceWithToken","access_token","saveToken","loginMethod","includes","Promise","resolve","setTimeout","interval","succeed"],"mappings":"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"}
|
package/dist/login/action.mjs
CHANGED
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import axios from 'axios';
|
|
2
2
|
import chalk from 'chalk';
|
|
3
|
-
import inquirer from 'inquirer';
|
|
4
3
|
import { cloudApiFactory } from '../services/cli-api.mjs';
|
|
5
4
|
import 'fs-extra';
|
|
6
5
|
import 'path';
|
|
@@ -15,6 +14,7 @@ import { setContext } from '../services/context.mjs';
|
|
|
15
14
|
|
|
16
15
|
const openModule = import('open');
|
|
17
16
|
async function promptLogin(ctx) {
|
|
17
|
+
const { default: inquirer } = await import('inquirer');
|
|
18
18
|
const response = await inquirer.prompt([
|
|
19
19
|
{
|
|
20
20
|
type: 'confirm',
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"action.mjs","sources":["../../src/login/action.ts"],"sourcesContent":["import axios, { AxiosResponse, AxiosError } from 'axios';\nimport chalk from 'chalk';\nimport inquirer from 'inquirer';\nimport { tokenServiceFactory, cloudApiFactory } from '../services';\nimport type { CloudCliConfig, CLIContext } from '../types';\nimport { apiConfig } from '../config/api';\nimport { trackEvent } from '../utils/analytics';\nimport { setContext } from '../services/context';\n\nconst openModule = import('open');\n\nexport async function promptLogin(ctx: CLIContext) {\n const response = await inquirer.prompt([\n {\n type: 'confirm',\n name: 'login',\n message: 'Would you like to login?',\n },\n ]);\n\n if (response.login) {\n const loginSuccessful = await loginAction(ctx);\n return loginSuccessful;\n }\n return false;\n}\n\nexport default async function loginAction(\n ctx: CLIContext,\n { showDashboardLink = true }: { showDashboardLink?: boolean } = {}\n): Promise<boolean> {\n const { logger, promptExperiment } = ctx;\n const tokenService = await tokenServiceFactory(ctx);\n const existingToken = await tokenService.retrieveToken();\n const cloudApiService = await cloudApiFactory(ctx, existingToken || undefined);\n\n if (existingToken) {\n const isTokenValid = await tokenService.isTokenValid(existingToken);\n if (isTokenValid) {\n try {\n const userInfo = await cloudApiService.getUserInfo();\n const { email } = userInfo.data.data;\n setContext({ ...ctx, user: userInfo.data.data });\n if (email) {\n logger.log(`You are already logged into your account (${email}).`);\n } else {\n logger.log('You are already logged in.');\n }\n if (showDashboardLink) {\n logger.log(\n 'To access your dashboard, please copy and paste the following URL into your web browser:'\n );\n logger.log(chalk.underline(`${apiConfig.dashboardBaseUrl}/projects`));\n }\n return true;\n } catch (e) {\n logger.debug('Failed to fetch user info', e);\n }\n }\n }\n\n let cliConfig: CloudCliConfig;\n try {\n logger.info('🔌 Connecting...');\n const config = await cloudApiService.config();\n cliConfig = config.data;\n } catch (e: unknown) {\n logger.error('🥲 Oops! Something went wrong while logging you in. Please try again.');\n logger.debug(e);\n return false;\n }\n await trackEvent(ctx, cloudApiService, 'willLoginAttempt', {\n ...(promptExperiment && { promptExperiment }),\n });\n\n logger.debug('🔐 Creating device authentication request...', {\n client_id: cliConfig.clientId,\n scope: cliConfig.scope,\n audience: cliConfig.audience,\n });\n const deviceAuthResponse = (await axios\n .post(cliConfig.deviceCodeAuthUrl, {\n client_id: cliConfig.clientId,\n scope: cliConfig.scope,\n audience: cliConfig.audience,\n })\n .catch((e: AxiosError) => {\n logger.error('There was an issue with the authentication process. Please try again.');\n if (e.message) {\n logger.debug(e.message, e);\n } else {\n logger.debug(e);\n }\n })) as AxiosResponse;\n\n openModule.then((open) => {\n open.default(deviceAuthResponse.data.verification_uri_complete).catch((e: Error) => {\n logger.error('We encountered an issue opening the browser. Please try again later.');\n logger.debug(e.message, e);\n });\n });\n\n logger.log('If a browser tab does not open automatically, please follow the next steps:');\n logger.log(\n `1. Open this url in your device: ${deviceAuthResponse.data.verification_uri_complete}`\n );\n logger.log(\n `2. Enter the following code: ${deviceAuthResponse.data.user_code} and confirm to login.\\n`\n );\n\n const tokenPayload = {\n grant_type: 'urn:ietf:params:oauth:grant-type:device_code',\n device_code: deviceAuthResponse.data.device_code,\n client_id: cliConfig.clientId,\n };\n\n let isAuthenticated = false;\n\n const authenticate = async () => {\n const spinner = logger.spinner('Waiting for authentication');\n spinner.start();\n const spinnerFail = () => spinner.fail('Authentication failed!');\n\n while (!isAuthenticated) {\n try {\n const tokenResponse = await axios.post(cliConfig.tokenUrl, tokenPayload);\n const authTokenData = tokenResponse.data;\n\n if (tokenResponse.status === 200) {\n // Token validation\n try {\n logger.debug('🔐 Validating token...');\n await tokenService.validateToken(authTokenData.id_token, cliConfig.jwksUrl);\n logger.debug('🔐 Token validation successful!');\n } catch (e: any) {\n logger.debug(e);\n spinnerFail();\n throw new Error('Unable to proceed: Token validation failed');\n }\n\n logger.debug('🔍 Fetching user information...');\n const cloudApiServiceWithToken = await cloudApiFactory(ctx, authTokenData.access_token);\n // Call to get user info to create the user in DB if not exists\n await cloudApiServiceWithToken.getUserInfo();\n logger.debug('🔍 User information fetched successfully!');\n\n try {\n logger.debug('📝 Saving login information...');\n await tokenService.saveToken(authTokenData.access_token);\n logger.debug('📝 Login information saved successfully!');\n isAuthenticated = true;\n } catch (e) {\n logger.error(\n 'There was a problem saving your login information. Please try logging in again.'\n );\n logger.debug(e);\n spinnerFail();\n return false;\n }\n }\n } catch (e: any) {\n if (e.message === 'Unable to proceed: Token validation failed') {\n logger.error(\n 'There seems to be a problem with your login information. Please try logging in again.'\n );\n spinnerFail();\n await trackEvent(ctx, cloudApiService, 'didNotLogin', {\n loginMethod: 'cli',\n ...(promptExperiment && { promptExperiment }),\n });\n return false;\n }\n if (\n e.response?.data.error &&\n !['authorization_pending', 'slow_down'].includes(e!.response.data.error)\n ) {\n logger.debug(e);\n spinnerFail();\n await trackEvent(ctx, cloudApiService, 'didNotLogin', {\n loginMethod: 'cli',\n ...(promptExperiment && { promptExperiment }),\n });\n return false;\n }\n // Await interval before retrying\n await new Promise((resolve) => {\n setTimeout(resolve, deviceAuthResponse.data.interval * 1000);\n });\n }\n }\n spinner.succeed('Authentication successful!');\n if (showDashboardLink) {\n logger.log('You are now logged into Strapi Cloud.');\n logger.log(\n 'To access your dashboard, please copy and paste the following URL into your web browser:'\n );\n logger.log(chalk.underline(`${apiConfig.dashboardBaseUrl}/projects`));\n }\n await trackEvent(ctx, cloudApiService, 'didLogin', {\n loginMethod: 'cli',\n ...(promptExperiment && { promptExperiment }),\n });\n };\n\n await authenticate();\n return isAuthenticated;\n}\n"],"names":["openModule","promptLogin","ctx","response","inquirer","prompt","type","name","message","login","loginSuccessful","loginAction","showDashboardLink","logger","promptExperiment","tokenService","tokenServiceFactory","existingToken","retrieveToken","cloudApiService","cloudApiFactory","undefined","isTokenValid","userInfo","getUserInfo","email","data","setContext","user","log","chalk","underline","apiConfig","dashboardBaseUrl","e","debug","cliConfig","info","config","error","trackEvent","client_id","clientId","scope","audience","deviceAuthResponse","axios","post","deviceCodeAuthUrl","catch","then","open","default","verification_uri_complete","user_code","tokenPayload","grant_type","device_code","isAuthenticated","authenticate","spinner","start","spinnerFail","fail","tokenResponse","tokenUrl","authTokenData","status","validateToken","id_token","jwksUrl","Error","cloudApiServiceWithToken","access_token","saveToken","loginMethod","includes","Promise","resolve","setTimeout","interval","succeed"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"action.mjs","sources":["../../src/login/action.ts"],"sourcesContent":["import axios, { AxiosResponse, AxiosError } from 'axios';\nimport chalk from 'chalk';\nimport { tokenServiceFactory, cloudApiFactory } from '../services';\nimport type { CloudCliConfig, CLIContext } from '../types';\nimport { apiConfig } from '../config/api';\nimport { trackEvent } from '../utils/analytics';\nimport { setContext } from '../services/context';\n\nconst openModule = import('open');\n\nexport async function promptLogin(ctx: CLIContext) {\n const { default: inquirer } = await import('inquirer');\n const response = await inquirer.prompt([\n {\n type: 'confirm',\n name: 'login',\n message: 'Would you like to login?',\n },\n ]);\n\n if (response.login) {\n const loginSuccessful = await loginAction(ctx);\n return loginSuccessful;\n }\n return false;\n}\n\nexport default async function loginAction(\n ctx: CLIContext,\n { showDashboardLink = true }: { showDashboardLink?: boolean } = {}\n): Promise<boolean> {\n const { logger, promptExperiment } = ctx;\n const tokenService = await tokenServiceFactory(ctx);\n const existingToken = await tokenService.retrieveToken();\n const cloudApiService = await cloudApiFactory(ctx, existingToken || undefined);\n\n if (existingToken) {\n const isTokenValid = await tokenService.isTokenValid(existingToken);\n if (isTokenValid) {\n try {\n const userInfo = await cloudApiService.getUserInfo();\n const { email } = userInfo.data.data;\n setContext({ ...ctx, user: userInfo.data.data });\n if (email) {\n logger.log(`You are already logged into your account (${email}).`);\n } else {\n logger.log('You are already logged in.');\n }\n if (showDashboardLink) {\n logger.log(\n 'To access your dashboard, please copy and paste the following URL into your web browser:'\n );\n logger.log(chalk.underline(`${apiConfig.dashboardBaseUrl}/projects`));\n }\n return true;\n } catch (e) {\n logger.debug('Failed to fetch user info', e);\n }\n }\n }\n\n let cliConfig: CloudCliConfig;\n try {\n logger.info('🔌 Connecting...');\n const config = await cloudApiService.config();\n cliConfig = config.data;\n } catch (e: unknown) {\n logger.error('🥲 Oops! Something went wrong while logging you in. Please try again.');\n logger.debug(e);\n return false;\n }\n await trackEvent(ctx, cloudApiService, 'willLoginAttempt', {\n ...(promptExperiment && { promptExperiment }),\n });\n\n logger.debug('🔐 Creating device authentication request...', {\n client_id: cliConfig.clientId,\n scope: cliConfig.scope,\n audience: cliConfig.audience,\n });\n const deviceAuthResponse = (await axios\n .post(cliConfig.deviceCodeAuthUrl, {\n client_id: cliConfig.clientId,\n scope: cliConfig.scope,\n audience: cliConfig.audience,\n })\n .catch((e: AxiosError) => {\n logger.error('There was an issue with the authentication process. Please try again.');\n if (e.message) {\n logger.debug(e.message, e);\n } else {\n logger.debug(e);\n }\n })) as AxiosResponse;\n\n openModule.then((open) => {\n open.default(deviceAuthResponse.data.verification_uri_complete).catch((e: Error) => {\n logger.error('We encountered an issue opening the browser. Please try again later.');\n logger.debug(e.message, e);\n });\n });\n\n logger.log('If a browser tab does not open automatically, please follow the next steps:');\n logger.log(\n `1. Open this url in your device: ${deviceAuthResponse.data.verification_uri_complete}`\n );\n logger.log(\n `2. Enter the following code: ${deviceAuthResponse.data.user_code} and confirm to login.\\n`\n );\n\n const tokenPayload = {\n grant_type: 'urn:ietf:params:oauth:grant-type:device_code',\n device_code: deviceAuthResponse.data.device_code,\n client_id: cliConfig.clientId,\n };\n\n let isAuthenticated = false;\n\n const authenticate = async () => {\n const spinner = logger.spinner('Waiting for authentication');\n spinner.start();\n const spinnerFail = () => spinner.fail('Authentication failed!');\n\n while (!isAuthenticated) {\n try {\n const tokenResponse = await axios.post(cliConfig.tokenUrl, tokenPayload);\n const authTokenData = tokenResponse.data;\n\n if (tokenResponse.status === 200) {\n // Token validation\n try {\n logger.debug('🔐 Validating token...');\n await tokenService.validateToken(authTokenData.id_token, cliConfig.jwksUrl);\n logger.debug('🔐 Token validation successful!');\n } catch (e: any) {\n logger.debug(e);\n spinnerFail();\n throw new Error('Unable to proceed: Token validation failed');\n }\n\n logger.debug('🔍 Fetching user information...');\n const cloudApiServiceWithToken = await cloudApiFactory(ctx, authTokenData.access_token);\n // Call to get user info to create the user in DB if not exists\n await cloudApiServiceWithToken.getUserInfo();\n logger.debug('🔍 User information fetched successfully!');\n\n try {\n logger.debug('📝 Saving login information...');\n await tokenService.saveToken(authTokenData.access_token);\n logger.debug('📝 Login information saved successfully!');\n isAuthenticated = true;\n } catch (e) {\n logger.error(\n 'There was a problem saving your login information. Please try logging in again.'\n );\n logger.debug(e);\n spinnerFail();\n return false;\n }\n }\n } catch (e: any) {\n if (e.message === 'Unable to proceed: Token validation failed') {\n logger.error(\n 'There seems to be a problem with your login information. Please try logging in again.'\n );\n spinnerFail();\n await trackEvent(ctx, cloudApiService, 'didNotLogin', {\n loginMethod: 'cli',\n ...(promptExperiment && { promptExperiment }),\n });\n return false;\n }\n if (\n e.response?.data.error &&\n !['authorization_pending', 'slow_down'].includes(e!.response.data.error)\n ) {\n logger.debug(e);\n spinnerFail();\n await trackEvent(ctx, cloudApiService, 'didNotLogin', {\n loginMethod: 'cli',\n ...(promptExperiment && { promptExperiment }),\n });\n return false;\n }\n // Await interval before retrying\n await new Promise((resolve) => {\n setTimeout(resolve, deviceAuthResponse.data.interval * 1000);\n });\n }\n }\n spinner.succeed('Authentication successful!');\n if (showDashboardLink) {\n logger.log('You are now logged into Strapi Cloud.');\n logger.log(\n 'To access your dashboard, please copy and paste the following URL into your web browser:'\n );\n logger.log(chalk.underline(`${apiConfig.dashboardBaseUrl}/projects`));\n }\n await trackEvent(ctx, cloudApiService, 'didLogin', {\n loginMethod: 'cli',\n ...(promptExperiment && { promptExperiment }),\n });\n };\n\n await authenticate();\n return isAuthenticated;\n}\n"],"names":["openModule","promptLogin","ctx","default","inquirer","response","prompt","type","name","message","login","loginSuccessful","loginAction","showDashboardLink","logger","promptExperiment","tokenService","tokenServiceFactory","existingToken","retrieveToken","cloudApiService","cloudApiFactory","undefined","isTokenValid","userInfo","getUserInfo","email","data","setContext","user","log","chalk","underline","apiConfig","dashboardBaseUrl","e","debug","cliConfig","info","config","error","trackEvent","client_id","clientId","scope","audience","deviceAuthResponse","axios","post","deviceCodeAuthUrl","catch","then","open","verification_uri_complete","user_code","tokenPayload","grant_type","device_code","isAuthenticated","authenticate","spinner","start","spinnerFail","fail","tokenResponse","tokenUrl","authTokenData","status","validateToken","id_token","jwksUrl","Error","cloudApiServiceWithToken","access_token","saveToken","loginMethod","includes","Promise","resolve","setTimeout","interval","succeed"],"mappings":"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"}
|
package/dist/package.json.js
CHANGED
package/dist/package.json.mjs
CHANGED
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@strapi/cloud-cli",
|
|
3
|
-
"version": "5.
|
|
3
|
+
"version": "5.41.0",
|
|
4
4
|
"description": "Commands to interact with the Strapi Cloud",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"strapi",
|
|
@@ -48,7 +48,7 @@
|
|
|
48
48
|
"watch": "run -T rollup -c -w"
|
|
49
49
|
},
|
|
50
50
|
"dependencies": {
|
|
51
|
-
"@strapi/utils": "5.
|
|
51
|
+
"@strapi/utils": "5.41.0",
|
|
52
52
|
"axios": "1.13.5",
|
|
53
53
|
"boxen": "5.1.2",
|
|
54
54
|
"chalk": "4.1.2",
|
|
@@ -57,7 +57,7 @@
|
|
|
57
57
|
"eventsource": "2.0.2",
|
|
58
58
|
"fast-safe-stringify": "2.1.1",
|
|
59
59
|
"fs-extra": "11.2.0",
|
|
60
|
-
"inquirer": "
|
|
60
|
+
"inquirer": "9.3.8",
|
|
61
61
|
"jsonwebtoken": "9.0.0",
|
|
62
62
|
"jwks-rsa": "3.1.0",
|
|
63
63
|
"lodash": "4.17.23",
|
|
@@ -65,7 +65,7 @@
|
|
|
65
65
|
"open": "8.4.0",
|
|
66
66
|
"ora": "5.4.1",
|
|
67
67
|
"pkg-up": "3.1.0",
|
|
68
|
-
"tar": "7.5.
|
|
68
|
+
"tar": "7.5.11",
|
|
69
69
|
"xdg-app-paths": "8.3.0",
|
|
70
70
|
"yup": "0.32.9"
|
|
71
71
|
},
|
|
@@ -73,8 +73,8 @@
|
|
|
73
73
|
"@types/cli-progress": "3.11.5",
|
|
74
74
|
"@types/eventsource": "1.1.15",
|
|
75
75
|
"@types/lodash": "^4.14.191",
|
|
76
|
-
"eslint-config-custom": "5.
|
|
77
|
-
"tsconfig": "5.
|
|
76
|
+
"eslint-config-custom": "5.41.0",
|
|
77
|
+
"tsconfig": "5.41.0"
|
|
78
78
|
},
|
|
79
79
|
"engines": {
|
|
80
80
|
"node": ">=20.0.0 <=24.x.x",
|