@strapi/cloud-cli 5.18.0 → 5.19.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.
Files changed (44) hide show
  1. package/dist/create-project/action.d.ts +2 -2
  2. package/dist/create-project/action.d.ts.map +1 -1
  3. package/dist/create-project/action.js +38 -11
  4. package/dist/create-project/action.js.map +1 -1
  5. package/dist/create-project/action.mjs +39 -12
  6. package/dist/create-project/action.mjs.map +1 -1
  7. package/dist/deploy-project/action.d.ts.map +1 -1
  8. package/dist/deploy-project/action.js +54 -17
  9. package/dist/deploy-project/action.js.map +1 -1
  10. package/dist/deploy-project/action.mjs +55 -18
  11. package/dist/deploy-project/action.mjs.map +1 -1
  12. package/dist/package.json.js +4 -4
  13. package/dist/package.json.mjs +4 -4
  14. package/dist/services/build-logs.d.ts.map +1 -1
  15. package/dist/services/build-logs.js +7 -7
  16. package/dist/services/build-logs.js.map +1 -1
  17. package/dist/services/build-logs.mjs +7 -7
  18. package/dist/services/build-logs.mjs.map +1 -1
  19. package/dist/services/cli-api.d.ts +7 -2
  20. package/dist/services/cli-api.d.ts.map +1 -1
  21. package/dist/services/cli-api.js +2 -3
  22. package/dist/services/cli-api.js.map +1 -1
  23. package/dist/services/cli-api.mjs +2 -3
  24. package/dist/services/cli-api.mjs.map +1 -1
  25. package/dist/services/notification.d.ts +4 -1
  26. package/dist/services/notification.d.ts.map +1 -1
  27. package/dist/services/notification.js +44 -2
  28. package/dist/services/notification.js.map +1 -1
  29. package/dist/services/notification.mjs +44 -2
  30. package/dist/services/notification.mjs.map +1 -1
  31. package/dist/types.d.ts +11 -0
  32. package/dist/types.d.ts.map +1 -1
  33. package/dist/utils/compress-files.d.ts.map +1 -1
  34. package/dist/utils/compress-files.js +2 -0
  35. package/dist/utils/compress-files.js.map +1 -1
  36. package/dist/utils/compress-files.mjs +2 -0
  37. package/dist/utils/compress-files.mjs.map +1 -1
  38. package/dist/utils/error-message-factories.d.ts +9 -0
  39. package/dist/utils/error-message-factories.d.ts.map +1 -0
  40. package/dist/utils/error-message-factories.js +25 -0
  41. package/dist/utils/error-message-factories.js.map +1 -0
  42. package/dist/utils/error-message-factories.mjs +22 -0
  43. package/dist/utils/error-message-factories.mjs.map +1 -0
  44. package/package.json +4 -4
@@ -1,4 +1,4 @@
1
- import type { CLIContext } from '../types';
2
- declare const _default: (ctx: CLIContext) => Promise<any>;
1
+ import { CLIContext, CreateProjectResponse } from '../types';
2
+ declare const _default: (ctx: CLIContext) => Promise<CreateProjectResponse | undefined>;
3
3
  export default _default;
4
4
  //# sourceMappingURL=action.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"action.d.ts","sourceRoot":"","sources":["../../src/create-project/action.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,UAAU,EAAgC,MAAM,UAAU,CAAC;8BAyD9C,UAAU;AAArC,wBAyCE"}
1
+ {"version":3,"file":"action.d.ts","sourceRoot":"","sources":["../../src/create-project/action.ts"],"names":[],"mappings":"AAGA,OAAO,EACL,UAAU,EAGV,qBAAqB,EAGtB,MAAM,UAAU,CAAC;8BAsGS,UAAU;AAArC,wBAyCE"}
@@ -13,6 +13,9 @@ require('cli-progress');
13
13
  var getProjectNameFromPkg = require('./utils/get-project-name-from-pkg.js');
14
14
  var action$1 = require('../login/action.js');
15
15
  var projectQuestions_utils = require('./utils/project-questions.utils.js');
16
+ var api = require('../config/api.js');
17
+ var notification = require('../services/notification.js');
18
+ var errorMessageFactories = require('../utils/error-message-factories.js');
16
19
 
17
20
  async function handleError(ctx, error) {
18
21
  const { logger } = ctx;
@@ -20,39 +23,63 @@ async function handleError(ctx, error) {
20
23
  if (error instanceof axios.AxiosError) {
21
24
  const errorMessage = typeof error.response?.data === 'string' ? error.response.data : null;
22
25
  switch(error.response?.status){
23
- case 403:
24
- logger.error(errorMessage || 'You do not have permission to create a project. Please contact support for assistance.');
25
- return;
26
26
  case 400:
27
27
  logger.error(errorMessage || 'Invalid input. Please check your inputs and try again.');
28
28
  return;
29
+ case 403:
30
+ logger.error(errorMessage || 'You do not have permission to create a project. Please contact support for assistance.');
31
+ return;
29
32
  case 503:
30
33
  logger.error('Strapi Cloud project creation is currently unavailable. Please try again later.');
31
34
  return;
32
35
  default:
33
36
  if (errorMessage) {
34
37
  logger.error(errorMessage);
35
- return;
38
+ throw error;
36
39
  }
37
40
  break;
38
41
  }
39
42
  }
40
43
  logger.error('We encountered an issue while creating your project. Please try again in a moment. If the problem persists, contact support for assistance.');
41
44
  }
42
- async function createProject(ctx, cloudApi, projectInput) {
45
+ async function createProject(ctx, cloudApi, projectInput, token, config) {
43
46
  const { logger } = ctx;
44
- const spinner = logger.spinner('Setting up your project...').start();
47
+ const projectSpinner = logger.spinner('Setting up your project...').start();
48
+ projectSpinner.indent = 1;
49
+ const notificationService = notification.notificationServiceFactory(ctx);
50
+ const { waitForEnvironmentCreation, close } = notificationService(`${api.apiConfig.apiBaseUrl}/${cliApi.VERSION}/notifications`, token, config);
51
+ let projectData;
45
52
  try {
46
53
  const { data } = await cloudApi.createProject(projectInput);
54
+ projectData = data;
47
55
  await strapiInfoSave.save({
48
56
  project: data
49
57
  });
50
- spinner.succeed('Project created successfully!');
51
- return data;
58
+ projectSpinner.succeed('Project created successfully!');
52
59
  } catch (e) {
53
- spinner.fail('An error occurred while creating the project on Strapi Cloud.');
60
+ projectSpinner.fail(`An error occurred while creating the project on Strapi Cloud.`);
61
+ close();
54
62
  throw e;
55
63
  }
64
+ if (config.featureFlags.asyncProjectCreationEnabled) {
65
+ const environmentSpinner = logger.spinner('Setting up your environment... This may take a minute...').start();
66
+ environmentSpinner.indent = 1;
67
+ try {
68
+ await waitForEnvironmentCreation(projectData.environmentInternalName);
69
+ environmentSpinner.succeed('Environment created successfully!\n');
70
+ } catch (e) {
71
+ environmentSpinner.fail(`An error occurred while creating the environment on Strapi Cloud.\n`);
72
+ const environmentErrorMessage = errorMessageFactories.environmentErrorMessageFactory({
73
+ projectName: projectData.name,
74
+ firstLine: config.projectCreation.errors.environmentCreationFailed.firstLine,
75
+ secondLine: config.projectCreation.errors.environmentCreationFailed.secondLine
76
+ });
77
+ logger.log(errorMessageFactories.environmentCreationErrorFactory(environmentErrorMessage));
78
+ return;
79
+ }
80
+ }
81
+ close();
82
+ return projectData;
56
83
  }
57
84
  var action = (async (ctx)=>{
58
85
  const { logger } = ctx;
@@ -77,13 +104,13 @@ var action = (async (ctx)=>{
77
104
  const projectAnswers = await inquirer.prompt(questions);
78
105
  const projectInput = projectAnswersDefaulted(projectAnswers);
79
106
  try {
80
- return await createProject(ctx, cloudApi, projectInput);
107
+ return await createProject(ctx, cloudApi, projectInput, token$1, config);
81
108
  } catch (e) {
82
109
  if (e instanceof axios.AxiosError && e.response?.status === 401) {
83
110
  logger.warn('Oops! Your session has expired. Please log in again to retry.');
84
111
  await eraseToken();
85
112
  if (await action$1.promptLogin(ctx)) {
86
- return await createProject(ctx, cloudApi, projectInput);
113
+ return await createProject(ctx, cloudApi, projectInput, token$1, config);
87
114
  }
88
115
  } else {
89
116
  await handleError(ctx, e);
@@ -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 type { CLIContext, ProjectAnswers, ProjectInput } from '../types';\nimport { cloudApiFactory, local, tokenServiceFactory } from '../services';\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';\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 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 400:\n logger.error(errorMessage || 'Invalid input. Please check your inputs and try again.');\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 return;\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(ctx: CLIContext, cloudApi: any, projectInput: ProjectInput) {\n const { logger } = ctx;\n const spinner = logger.spinner('Setting up your project...').start();\n try {\n const { data } = await cloudApi.createProject(projectInput);\n await local.save({ project: data });\n spinner.succeed('Project created successfully!');\n return data;\n } catch (e: Error | unknown) {\n spinner.fail('An error occurred while creating the project on Strapi Cloud.');\n throw e;\n }\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);\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);\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","spinner","start","local","project","succeed","e","fail","getValidToken","eraseToken","tokenServiceFactory","token","promptLogin","cloudApiFactory","config","projectName","getProjectNameFromPackageJson","defaultAnswersMapper","questionDefaultValuesMapper","name","nodeVersion","getProjectNodeVersionDefault","questions","projectCreation","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 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":";;;;;;;;;;;;;;;;;;;AA2BA,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,gBAAY,EAAA;QAC/B,MAAMC,YAAAA,GAAe,OAAOJ,KAAAA,CAAMK,QAAQ,EAAEC,IAAS,KAAA,QAAA,GAAWN,KAAMK,CAAAA,QAAQ,CAACC,IAAI,GAAG,IAAA;QACtF,OAAQN,KAAAA,CAAMK,QAAQ,EAAEE,MAAAA;YACtB,KAAK,GAAA;gBACHN,MAAOD,CAAAA,KAAK,CAACI,YAAgB,IAAA,wDAAA,CAAA;AAC7B,gBAAA;YACF,KAAK,GAAA;gBACHH,MAAOD,CAAAA,KAAK,CACVI,YACE,IAAA,wFAAA,CAAA;AAEJ,gBAAA;YACF,KAAK,GAAA;AACHH,gBAAAA,MAAAA,CAAOD,KAAK,CACV,iFAAA,CAAA;AAEF,gBAAA;AACF,YAAA;AACE,gBAAA,IAAII,YAAc,EAAA;AAChBH,oBAAAA,MAAAA,CAAOD,KAAK,CAACI,YAAAA,CAAAA;oBACb,MAAMJ,KAAAA;AACR;AACA,gBAAA;AACJ;AACF;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,cAAiBZ,GAAAA,MAAAA,CAAOa,OAAO,CAAC,8BAA8BC,KAAK,EAAA;AACzEF,IAAAA,cAAAA,CAAeG,MAAM,GAAG,CAAA;AACxB,IAAA,MAAMC,sBAAsBC,uCAA2BnB,CAAAA,GAAAA,CAAAA;AACvD,IAAA,MAAM,EAAEoB,0BAA0B,EAAEC,KAAK,EAAE,GAAGH,oBAC5C,CAAC,EAAEI,aAAUC,CAAAA,UAAU,CAAC,CAAC,EAAEC,eAAQ,cAAc,CAAC,EAClDZ,KACAC,EAAAA,MAAAA,CAAAA;IAEF,IAAIY,WAAAA;IACJ,IAAI;AACF,QAAA,MAAM,EAAElB,IAAI,EAAE,GAAG,MAAMG,QAAAA,CAASD,aAAa,CAACE,YAAAA,CAAAA;QAC9Cc,WAAclB,GAAAA,IAAAA;QACd,MAAMmB,mBAAU,CAAC;YAAEC,OAASpB,EAAAA;AAAK,SAAA,CAAA;AACjCO,QAAAA,cAAAA,CAAec,OAAO,CAAC,+BAAA,CAAA;AACzB,KAAA,CAAE,OAAOC,CAAoB,EAAA;AAC3Bf,QAAAA,cAAAA,CAAegB,IAAI,CAAC,CAAC,6DAA6D,CAAC,CAAA;AACnFT,QAAAA,KAAAA,EAAAA;QACA,MAAMQ,CAAAA;AACR;AACA,IAAA,IAAIhB,MAAOkB,CAAAA,YAAY,CAACC,2BAA2B,EAAE;AACnD,QAAA,MAAMC,kBAAqB/B,GAAAA,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,SAAA,CAAE,OAAOC,CAAoB,EAAA;AAC3BI,YAAAA,kBAAAA,CAAmBH,IAAI,CACrB,CAAC,mEAAmE,CAAC,CAAA;AAEvE,YAAA,MAAMK,0BAA0BC,oDAA+B,CAAA;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,MAAO0C,CAAAA,GAAG,CAACC,qDAAgCV,CAAAA,uBAAAA,CAAAA,CAAAA;AAC3C,YAAA;AACF;AACF;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,yBAAoBhD,CAAAA,GAAAA,CAAAA;IAEhE,MAAMY,OAAAA,GAAQ,MAAMkC,aAAAA,CAAc9C,GAAKiD,EAAAA,oBAAAA,CAAAA;AACvC,IAAA,IAAI,CAACrC,OAAO,EAAA;AACV,QAAA;AACF;IAEA,MAAMF,QAAAA,GAAW,MAAMwC,sBAAAA,CAAgBlD,GAAKY,EAAAA,OAAAA,CAAAA;AAC5C,IAAA,MAAM,EAAEL,IAAMM,EAAAA,MAAM,EAAE,GAAG,MAAMH,SAASG,MAAM,EAAA;IAC9C,MAAMwB,WAAAA,GAAc,MAAMc,mDAA8BnD,CAAAA,GAAAA,CAAAA;AAExD,IAAA,MAAMoD,uBAAuBC,kDAA4B,CAAA;QACvDf,IAAMD,EAAAA,WAAAA;QACNiB,WAAaC,EAAAA;AACf,KAAA,CAAA;AACA,IAAA,MAAMC,SAAYJ,GAAAA,oBAAAA,CAAqBvC,MAAO2B,CAAAA,eAAe,CAACgB,SAAS,CAAA;AACvE,IAAA,MAAMC,aAAgB,GAAA;QACpB,GAAG5C,MAAAA,CAAO2B,eAAe,CAACkB,QAAQ;AAClC,QAAA,GAAGC,gDAAyBH,SAAU;AACxC,KAAA;AAEA,IAAA,MAAMI,0BAA0BF,WAASD,CAAAA,aAAAA,CAAAA;AACzC,IAAA,MAAMI,cAAiB,GAAA,MAAMC,QAASC,CAAAA,MAAM,CAAiBP,SAAAA,CAAAA;AAE7D,IAAA,MAAM7C,eAA6BiD,uBAAwBC,CAAAA,cAAAA,CAAAA;IAE3D,IAAI;AACF,QAAA,OAAO,MAAMpD,aAAAA,CAAcT,GAAKU,EAAAA,QAAAA,EAAUC,cAAcC,OAAOC,EAAAA,MAAAA,CAAAA;AACjE,KAAA,CAAE,OAAOgB,CAAoB,EAAA;AAC3B,QAAA,IAAIA,aAAazB,gBAAcyB,IAAAA,CAAAA,CAAEvB,QAAQ,EAAEE,WAAW,GAAK,EAAA;AACzDN,YAAAA,MAAAA,CAAO8D,IAAI,CAAC,+DAAA,CAAA;YACZ,MAAMjB,UAAAA,EAAAA;YACN,IAAI,MAAME,qBAAYjD,GAAM,CAAA,EAAA;AAC1B,gBAAA,OAAO,MAAMS,aAAAA,CAAcT,GAAKU,EAAAA,QAAAA,EAAUC,cAAcC,OAAOC,EAAAA,MAAAA,CAAAA;AACjE;SACK,MAAA;AACL,YAAA,MAAMd,YAAYC,GAAK6B,EAAAA,CAAAA,CAAAA;AACzB;AACF;AACF,CAAA;;;;"}
@@ -1,7 +1,7 @@
1
1
  import inquirer from 'inquirer';
2
2
  import { AxiosError } from 'axios';
3
3
  import { defaults } from 'lodash/fp';
4
- import { cloudApiFactory } from '../services/cli-api.mjs';
4
+ import { cloudApiFactory, VERSION } from '../services/cli-api.mjs';
5
5
  import { save } from '../services/strapi-info-save.mjs';
6
6
  import { tokenServiceFactory } from '../services/token.mjs';
7
7
  import 'chalk';
@@ -11,6 +11,9 @@ import 'cli-progress';
11
11
  import { getProjectNameFromPackageJson } from './utils/get-project-name-from-pkg.mjs';
12
12
  import { promptLogin } from '../login/action.mjs';
13
13
  import { getDefaultsFromQuestions, questionDefaultValuesMapper, getProjectNodeVersionDefault } from './utils/project-questions.utils.mjs';
14
+ import { apiConfig } from '../config/api.mjs';
15
+ import { notificationServiceFactory } from '../services/notification.mjs';
16
+ import { environmentErrorMessageFactory, environmentCreationErrorFactory } from '../utils/error-message-factories.mjs';
14
17
 
15
18
  async function handleError(ctx, error) {
16
19
  const { logger } = ctx;
@@ -18,39 +21,63 @@ async function handleError(ctx, error) {
18
21
  if (error instanceof AxiosError) {
19
22
  const errorMessage = typeof error.response?.data === 'string' ? error.response.data : null;
20
23
  switch(error.response?.status){
21
- case 403:
22
- logger.error(errorMessage || 'You do not have permission to create a project. Please contact support for assistance.');
23
- return;
24
24
  case 400:
25
25
  logger.error(errorMessage || 'Invalid input. Please check your inputs and try again.');
26
26
  return;
27
+ case 403:
28
+ logger.error(errorMessage || 'You do not have permission to create a project. Please contact support for assistance.');
29
+ return;
27
30
  case 503:
28
31
  logger.error('Strapi Cloud project creation is currently unavailable. Please try again later.');
29
32
  return;
30
33
  default:
31
34
  if (errorMessage) {
32
35
  logger.error(errorMessage);
33
- return;
36
+ throw error;
34
37
  }
35
38
  break;
36
39
  }
37
40
  }
38
41
  logger.error('We encountered an issue while creating your project. Please try again in a moment. If the problem persists, contact support for assistance.');
39
42
  }
40
- async function createProject(ctx, cloudApi, projectInput) {
43
+ async function createProject(ctx, cloudApi, projectInput, token, config) {
41
44
  const { logger } = ctx;
42
- const spinner = logger.spinner('Setting up your project...').start();
45
+ const projectSpinner = logger.spinner('Setting up your project...').start();
46
+ projectSpinner.indent = 1;
47
+ const notificationService = notificationServiceFactory(ctx);
48
+ const { waitForEnvironmentCreation, close } = notificationService(`${apiConfig.apiBaseUrl}/${VERSION}/notifications`, token, config);
49
+ let projectData;
43
50
  try {
44
51
  const { data } = await cloudApi.createProject(projectInput);
52
+ projectData = data;
45
53
  await save({
46
54
  project: data
47
55
  });
48
- spinner.succeed('Project created successfully!');
49
- return data;
56
+ projectSpinner.succeed('Project created successfully!');
50
57
  } catch (e) {
51
- spinner.fail('An error occurred while creating the project on Strapi Cloud.');
58
+ projectSpinner.fail(`An error occurred while creating the project on Strapi Cloud.`);
59
+ close();
52
60
  throw e;
53
61
  }
62
+ if (config.featureFlags.asyncProjectCreationEnabled) {
63
+ const environmentSpinner = logger.spinner('Setting up your environment... This may take a minute...').start();
64
+ environmentSpinner.indent = 1;
65
+ try {
66
+ await waitForEnvironmentCreation(projectData.environmentInternalName);
67
+ environmentSpinner.succeed('Environment created successfully!\n');
68
+ } catch (e) {
69
+ environmentSpinner.fail(`An error occurred while creating the environment on Strapi Cloud.\n`);
70
+ const environmentErrorMessage = environmentErrorMessageFactory({
71
+ projectName: projectData.name,
72
+ firstLine: config.projectCreation.errors.environmentCreationFailed.firstLine,
73
+ secondLine: config.projectCreation.errors.environmentCreationFailed.secondLine
74
+ });
75
+ logger.log(environmentCreationErrorFactory(environmentErrorMessage));
76
+ return;
77
+ }
78
+ }
79
+ close();
80
+ return projectData;
54
81
  }
55
82
  var action = (async (ctx)=>{
56
83
  const { logger } = ctx;
@@ -75,13 +102,13 @@ var action = (async (ctx)=>{
75
102
  const projectAnswers = await inquirer.prompt(questions);
76
103
  const projectInput = projectAnswersDefaulted(projectAnswers);
77
104
  try {
78
- return await createProject(ctx, cloudApi, projectInput);
105
+ return await createProject(ctx, cloudApi, projectInput, token, config);
79
106
  } catch (e) {
80
107
  if (e instanceof AxiosError && e.response?.status === 401) {
81
108
  logger.warn('Oops! Your session has expired. Please log in again to retry.');
82
109
  await eraseToken();
83
110
  if (await promptLogin(ctx)) {
84
- return await createProject(ctx, cloudApi, projectInput);
111
+ return await createProject(ctx, cloudApi, projectInput, token, config);
85
112
  }
86
113
  } else {
87
114
  await handleError(ctx, e);
@@ -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 type { CLIContext, ProjectAnswers, ProjectInput } from '../types';\nimport { cloudApiFactory, local, tokenServiceFactory } from '../services';\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';\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 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 400:\n logger.error(errorMessage || 'Invalid input. Please check your inputs and try again.');\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 return;\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(ctx: CLIContext, cloudApi: any, projectInput: ProjectInput) {\n const { logger } = ctx;\n const spinner = logger.spinner('Setting up your project...').start();\n try {\n const { data } = await cloudApi.createProject(projectInput);\n await local.save({ project: data });\n spinner.succeed('Project created successfully!');\n return data;\n } catch (e: Error | unknown) {\n spinner.fail('An error occurred while creating the project on Strapi Cloud.');\n throw e;\n }\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);\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);\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","spinner","start","local","project","succeed","e","fail","getValidToken","eraseToken","tokenServiceFactory","token","promptLogin","cloudApiFactory","config","projectName","getProjectNameFromPackageJson","defaultAnswersMapper","questionDefaultValuesMapper","name","nodeVersion","getProjectNodeVersionDefault","questions","projectCreation","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 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":";;;;;;;;;;;;;;;;;AA2BA,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,UAAY,EAAA;QAC/B,MAAMC,YAAAA,GAAe,OAAOJ,KAAAA,CAAMK,QAAQ,EAAEC,IAAS,KAAA,QAAA,GAAWN,KAAMK,CAAAA,QAAQ,CAACC,IAAI,GAAG,IAAA;QACtF,OAAQN,KAAAA,CAAMK,QAAQ,EAAEE,MAAAA;YACtB,KAAK,GAAA;gBACHN,MAAOD,CAAAA,KAAK,CAACI,YAAgB,IAAA,wDAAA,CAAA;AAC7B,gBAAA;YACF,KAAK,GAAA;gBACHH,MAAOD,CAAAA,KAAK,CACVI,YACE,IAAA,wFAAA,CAAA;AAEJ,gBAAA;YACF,KAAK,GAAA;AACHH,gBAAAA,MAAAA,CAAOD,KAAK,CACV,iFAAA,CAAA;AAEF,gBAAA;AACF,YAAA;AACE,gBAAA,IAAII,YAAc,EAAA;AAChBH,oBAAAA,MAAAA,CAAOD,KAAK,CAACI,YAAAA,CAAAA;oBACb,MAAMJ,KAAAA;AACR;AACA,gBAAA;AACJ;AACF;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,cAAiBZ,GAAAA,MAAAA,CAAOa,OAAO,CAAC,8BAA8BC,KAAK,EAAA;AACzEF,IAAAA,cAAAA,CAAeG,MAAM,GAAG,CAAA;AACxB,IAAA,MAAMC,sBAAsBC,0BAA2BnB,CAAAA,GAAAA,CAAAA;AACvD,IAAA,MAAM,EAAEoB,0BAA0B,EAAEC,KAAK,EAAE,GAAGH,oBAC5C,CAAC,EAAEI,SAAUC,CAAAA,UAAU,CAAC,CAAC,EAAEC,QAAQ,cAAc,CAAC,EAClDZ,KACAC,EAAAA,MAAAA,CAAAA;IAEF,IAAIY,WAAAA;IACJ,IAAI;AACF,QAAA,MAAM,EAAElB,IAAI,EAAE,GAAG,MAAMG,QAAAA,CAASD,aAAa,CAACE,YAAAA,CAAAA;QAC9Cc,WAAclB,GAAAA,IAAAA;QACd,MAAMmB,IAAU,CAAC;YAAEC,OAASpB,EAAAA;AAAK,SAAA,CAAA;AACjCO,QAAAA,cAAAA,CAAec,OAAO,CAAC,+BAAA,CAAA;AACzB,KAAA,CAAE,OAAOC,CAAoB,EAAA;AAC3Bf,QAAAA,cAAAA,CAAegB,IAAI,CAAC,CAAC,6DAA6D,CAAC,CAAA;AACnFT,QAAAA,KAAAA,EAAAA;QACA,MAAMQ,CAAAA;AACR;AACA,IAAA,IAAIhB,MAAOkB,CAAAA,YAAY,CAACC,2BAA2B,EAAE;AACnD,QAAA,MAAMC,kBAAqB/B,GAAAA,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,SAAA,CAAE,OAAOC,CAAoB,EAAA;AAC3BI,YAAAA,kBAAAA,CAAmBH,IAAI,CACrB,CAAC,mEAAmE,CAAC,CAAA;AAEvE,YAAA,MAAMK,0BAA0BC,8BAA+B,CAAA;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,MAAO0C,CAAAA,GAAG,CAACC,+BAAgCV,CAAAA,uBAAAA,CAAAA,CAAAA;AAC3C,YAAA;AACF;AACF;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,mBAAoBhD,CAAAA,GAAAA,CAAAA;IAEhE,MAAMY,KAAAA,GAAQ,MAAMkC,aAAAA,CAAc9C,GAAKiD,EAAAA,WAAAA,CAAAA;AACvC,IAAA,IAAI,CAACrC,KAAO,EAAA;AACV,QAAA;AACF;IAEA,MAAMF,QAAAA,GAAW,MAAMwC,eAAAA,CAAgBlD,GAAKY,EAAAA,KAAAA,CAAAA;AAC5C,IAAA,MAAM,EAAEL,IAAMM,EAAAA,MAAM,EAAE,GAAG,MAAMH,SAASG,MAAM,EAAA;IAC9C,MAAMwB,WAAAA,GAAc,MAAMc,6BAA8BnD,CAAAA,GAAAA,CAAAA;AAExD,IAAA,MAAMoD,uBAAuBC,2BAA4B,CAAA;QACvDf,IAAMD,EAAAA,WAAAA;QACNiB,WAAaC,EAAAA;AACf,KAAA,CAAA;AACA,IAAA,MAAMC,SAAYJ,GAAAA,oBAAAA,CAAqBvC,MAAO2B,CAAAA,eAAe,CAACgB,SAAS,CAAA;AACvE,IAAA,MAAMC,aAAgB,GAAA;QACpB,GAAG5C,MAAAA,CAAO2B,eAAe,CAACkB,QAAQ;AAClC,QAAA,GAAGC,yBAAyBH,SAAU;AACxC,KAAA;AAEA,IAAA,MAAMI,0BAA0BF,QAASD,CAAAA,aAAAA,CAAAA;AACzC,IAAA,MAAMI,cAAiB,GAAA,MAAMC,QAASC,CAAAA,MAAM,CAAiBP,SAAAA,CAAAA;AAE7D,IAAA,MAAM7C,eAA6BiD,uBAAwBC,CAAAA,cAAAA,CAAAA;IAE3D,IAAI;AACF,QAAA,OAAO,MAAMpD,aAAAA,CAAcT,GAAKU,EAAAA,QAAAA,EAAUC,cAAcC,KAAOC,EAAAA,MAAAA,CAAAA;AACjE,KAAA,CAAE,OAAOgB,CAAoB,EAAA;AAC3B,QAAA,IAAIA,aAAazB,UAAcyB,IAAAA,CAAAA,CAAEvB,QAAQ,EAAEE,WAAW,GAAK,EAAA;AACzDN,YAAAA,MAAAA,CAAO8D,IAAI,CAAC,+DAAA,CAAA;YACZ,MAAMjB,UAAAA,EAAAA;YACN,IAAI,MAAME,YAAYjD,GAAM,CAAA,EAAA;AAC1B,gBAAA,OAAO,MAAMS,aAAAA,CAAcT,GAAKU,EAAAA,QAAAA,EAAUC,cAAcC,KAAOC,EAAAA,MAAAA,CAAAA;AACjE;SACK,MAAA;AACL,YAAA,MAAMd,YAAYC,GAAK6B,EAAAA,CAAAA,CAAAA;AACzB;AACF;AACF,CAAA;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"action.d.ts","sourceRoot":"","sources":["../../src/deploy-project/action.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EACV,UAAU,EAKX,MAAM,UAAU,CAAC;AAgBlB,UAAU,UAAU;IAClB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;8BA6L0B,UAAU,QAAQ,UAAU;AAAvD,wBA6HE"}
1
+ {"version":3,"file":"action.d.ts","sourceRoot":"","sources":["../../src/deploy-project/action.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EACV,UAAU,EAKX,MAAM,UAAU,CAAC;AAqBlB,UAAU,UAAU;IAClB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;8BAiO0B,UAAU,QAAQ,UAAU;AAAvD,wBA8IE"}
@@ -22,6 +22,7 @@ var pkg = require('../utils/pkg.js');
22
22
  var buildLogs = require('../services/build-logs.js');
23
23
  var action$1 = require('../login/action.js');
24
24
  var analytics = require('../utils/analytics.js');
25
+ var errorMessageFactories = require('../utils/error-message-factories.js');
25
26
 
26
27
  function _interopNamespaceDefault(e) {
27
28
  var n = Object.create(null);
@@ -74,7 +75,7 @@ async function promptForEnvironment(environments) {
74
75
  }
75
76
  return selectedEnvironment;
76
77
  }
77
- async function upload(ctx, project, token, maxProjectFileSize) {
78
+ async function upload(ctx, project, cliConfig, token, maxProjectFileSize) {
78
79
  const cloudApi = await cliApi.cloudApiFactory(ctx, token);
79
80
  try {
80
81
  const storagePath = await local.getTmpStoragePath();
@@ -84,16 +85,17 @@ async function upload(ctx, project, token, maxProjectFileSize) {
84
85
  ctx.logger.error('Unable to deploy the project. Please make sure the package.json file is correctly formatted.');
85
86
  return;
86
87
  }
87
- ctx.logger.log('📦 Compressing project...');
88
+ const compressSpinner = ctx.logger.spinner('Compressing project...').start();
89
+ compressSpinner.indent = 1;
88
90
  // hash packageJson.name to avoid conflicts
89
91
  const hashname = crypto__namespace.createHash('sha512').update(packageJson.name).digest('hex');
90
92
  const compressedFilename = `${hashname}.tar.gz`;
91
93
  try {
92
94
  ctx.logger.debug('Compression parameters\n', `Storage path: ${storagePath}\n`, `Project folder: ${projectFolder}\n`, `Compressed filename: ${compressedFilename}`);
93
95
  await compressFiles.compressFilesToTar(storagePath, projectFolder, compressedFilename);
94
- ctx.logger.log('📦 Project compressed successfully!');
96
+ compressSpinner.succeed(`Project compressed successfully!`);
95
97
  } catch (e) {
96
- ctx.logger.error('⚠️ Project compression failed. Try again later or check for large/incompatible files.');
98
+ compressSpinner.fail('Project compression failed. Try again later or check for large/incompatible files.');
97
99
  ctx.logger.debug(e);
98
100
  process.exit(1);
99
101
  }
@@ -109,8 +111,7 @@ async function upload(ctx, project, token, maxProjectFileSize) {
109
111
  }
110
112
  return;
111
113
  }
112
- ctx.logger.info('🚀 Uploading project...');
113
- const progressBar = ctx.logger.progressBar(100, 'Upload Progress');
114
+ const progressBar = ctx.logger.progressBar(100, ' Uploading project');
114
115
  try {
115
116
  const { data } = await cloudApi.deploy({
116
117
  filePath: tarFilePath,
@@ -124,12 +125,11 @@ async function upload(ctx, project, token, maxProjectFileSize) {
124
125
  });
125
126
  progressBar.update(100);
126
127
  progressBar.stop();
127
- ctx.logger.success(' Upload finished!');
128
+ ctx.logger.log(`${chalk.green.bold('✔')} Upload finished!\n`);
128
129
  return data.build_id;
129
130
  } catch (e) {
130
131
  progressBar.stop();
131
- ctx.logger.error('An error occurred while deploying the project. Please try again later.');
132
- ctx.logger.debug(e);
132
+ await handleUploadError(ctx, e, project, cliConfig);
133
133
  } finally{
134
134
  await fse.remove(tarFilePath);
135
135
  }
@@ -140,11 +140,37 @@ async function upload(ctx, project, token, maxProjectFileSize) {
140
140
  process.exit(1);
141
141
  }
142
142
  }
143
+ async function handleUploadError(ctx, error, project, cliConfig) {
144
+ const { logger } = ctx;
145
+ logger.debug(error);
146
+ if (error.response?.status) {
147
+ switch(error.response.status){
148
+ case 405:
149
+ {
150
+ const environmentErrorMessage = errorMessageFactories.environmentErrorMessageFactory({
151
+ projectName: project.name,
152
+ firstLine: cliConfig.projectDeployment.errors.environmentNotReady.firstLine,
153
+ secondLine: cliConfig.projectDeployment.errors.environmentNotReady.secondLine
154
+ });
155
+ logger.log(errorMessageFactories.environmentCreationErrorFactory(environmentErrorMessage));
156
+ return;
157
+ }
158
+ case 413:
159
+ logger.error('The project you are trying to upload is too big. Please remove unnecessary files and try again.');
160
+ return;
161
+ }
162
+ }
163
+ logger.error('An error occurred while deploying the project. Please try again later.');
164
+ }
143
165
  async function getProject(ctx) {
144
166
  const { project } = await strapiInfoSave.retrieve();
145
167
  if (!project) {
146
168
  try {
147
- return await action$2(ctx);
169
+ const projectResponse = await action$2(ctx);
170
+ if (projectResponse) {
171
+ const { project: projectSaved } = await strapiInfoSave.retrieve();
172
+ return projectSaved;
173
+ }
148
174
  } catch (e) {
149
175
  ctx.logger.error('An error occurred while deploying the project. Please try again later.');
150
176
  ctx.logger.debug(e);
@@ -196,7 +222,7 @@ var action = (async (ctx, opts)=>{
196
222
  }
197
223
  const project = await getProject(ctx);
198
224
  if (!project) {
199
- return;
225
+ process.exit(1);
200
226
  }
201
227
  const cloudApiService = await cliApi.cloudApiFactory(ctx, token$1);
202
228
  let projectData;
@@ -263,16 +289,23 @@ var action = (async (ctx, opts)=>{
263
289
  }
264
290
  }
265
291
  }
266
- const buildId = await upload(ctx, project, token$1, maxSize);
292
+ const buildId = await upload(ctx, project, cliConfig, token$1, maxSize);
267
293
  if (!buildId) {
268
294
  return;
269
295
  }
296
+ let notifications = null;
270
297
  try {
271
- ctx.logger.log(`🚀 Deploying project to ${chalk.cyan(project.targetEnvironment ?? `production`)} environment...`);
272
- notificationService(`${api.apiConfig.apiBaseUrl}/notifications`, token$1, cliConfig);
273
- await buildLogsService(`${api.apiConfig.apiBaseUrl}/v1/logs/${buildId}`, token$1, cliConfig);
274
- ctx.logger.log('Visit the following URL for deployment logs. Your deployment will be available here shortly.');
275
- ctx.logger.log(chalk.underline(`${api.apiConfig.dashboardBaseUrl}/projects/${project.name}/deployments`));
298
+ ctx.logger.log(`∷ Deploying project to ${chalk.cyan(project.targetEnvironment ?? `production`)} environment...`);
299
+ notifications = notificationService(`${api.apiConfig.apiBaseUrl}/${cliApi.VERSION}/notifications`, token$1, cliConfig);
300
+ await buildLogsService(`${api.apiConfig.apiBaseUrl}/${cliApi.VERSION}/logs/${buildId}`, token$1, cliConfig);
301
+ const dashboardUrlLine = chalk.cyan(' → ') + chalk.cyan.underline(`${api.apiConfig.dashboardBaseUrl}/projects/${project.name}/deployments`);
302
+ ctx.logger.log(boxen(`Project and deployment logs ready at:\n${dashboardUrlLine}`, {
303
+ padding: 1,
304
+ margin: 1,
305
+ borderStyle: 'round',
306
+ borderColor: 'white',
307
+ titleAlignment: 'left'
308
+ }));
276
309
  } catch (e) {
277
310
  ctx.logger.debug(e);
278
311
  if (e instanceof Error) {
@@ -280,6 +313,10 @@ var action = (async (ctx, opts)=>{
280
313
  } else {
281
314
  ctx.logger.error('An error occurred while deploying the project. Please try again later.');
282
315
  }
316
+ } finally{
317
+ if (notifications) {
318
+ notifications.close();
319
+ }
283
320
  }
284
321
  });
285
322
 
@@ -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 { 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';\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: ProjectInfo,\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 ctx.logger.log('📦 Compressing project...');\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 ctx.logger.log('📦 Project compressed successfully!');\n } catch (e: unknown) {\n ctx.logger.error(\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 ctx.logger.info('🚀 Uploading project...');\n const progressBar = ctx.logger.progressBar(100, 'Upload Progress');\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.success('✨ Upload finished!');\n return data.build_id;\n } catch (e: any) {\n progressBar.stop();\n ctx.logger.error('An error occurred while deploying the project. Please try again later.');\n ctx.logger.debug(e);\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 getProject(ctx: CLIContext) {\n const { project } = await local.retrieve();\n if (!project) {\n try {\n return await createProjectAction(ctx);\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: ProjectInfo,\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 return;\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, token, maxSize);\n\n if (!buildId) {\n return;\n }\n\n try {\n ctx.logger.log(\n `🚀 Deploying project to ${chalk.cyan(project.targetEnvironment ?? `production`)} environment...`\n );\n notificationService(`${apiConfig.apiBaseUrl}/notifications`, token, cliConfig);\n await buildLogsService(`${apiConfig.apiBaseUrl}/v1/logs/${buildId}`, token, cliConfig);\n\n ctx.logger.log(\n 'Visit the following URL for deployment logs. Your deployment will be available here shortly.'\n );\n ctx.logger.log(\n chalk.underline(`${apiConfig.dashboardBaseUrl}/projects/${project.name}/deployments`)\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 }\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","token","maxProjectFileSize","cloudApi","cloudApiFactory","storagePath","getTmpStoragePath","projectFolder","path","resolve","cwd","packageJson","loadPkg","logger","error","log","hashname","crypto","createHash","update","digest","compressedFilename","debug","compressFilesToTar","e","tarFilePath","fileStats","fse","stat","size","remove","info","progressBar","data","deploy","filePath","onUploadProgress","progressEvent","total","percentage","Math","round","loaded","stop","success","build_id","getProject","local","createProjectAction","getConfig","cloudApiService","cliConfig","config","validateEnvironment","environment","includes","getTargetEnvironment","opts","targetEnvironment","length","hasPendingOrLiveDeployment","find","Error","hasPendingDeployment","hasLiveDeployment","getValidToken","tokenServiceFactory","promptLogin","projectData","environmentsDetails","metadata","isProjectSuspended","suspendedAt","underline","dashboardUrls","AxiosError","response","status","warn","cyan","trackEvent","projectInternalName","notificationService","notificationServiceFactory","buildLogsService","buildLogsServiceFactory","maxSize","parseInt","Number","isNaN","force","shouldDisplayWarning","boxen","projectDeployment","confirmationText","confirm","displayName","buildId","apiConfig","apiBaseUrl","dashboardBaseUrl"],"mappings":"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"}
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":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA0CA,MAAMA,YAA8B,GAAA;IAClCC,OAAS,EAAA,CAAA;IACTC,MAAQ,EAAA,CAAA;IACRC,KAAO,EAAA,QAAA;IACPC,WAAa,EAAA,QAAA;IACbC,WAAa,EAAA;AACf,CAAA;AAEA,MAAMC,WAAc,GAAA,MAAA;AAEpB,eAAeC,qBAAqBC,YAAsB,EAAA;AACxD,IAAA,MAAMC,UAAUD,YAAaE,CAAAA,GAAG,CAAC,CAACC,OAAS;YAAEC,IAAMD,EAAAA,GAAAA;YAAKE,KAAOF,EAAAA;SAAI,CAAA,CAAA;AACnE,IAAA,MAAM,EAAEG,mBAAmB,EAAE,GAAG,MAAMC,QAAAA,CAASC,MAAM,CAAC;AACpD,QAAA;YACEC,IAAM,EAAA,MAAA;YACNL,IAAM,EAAA,qBAAA;YACNM,OAAS,EAAA,mCAAA;YACTT,OAAS,EAAA;AAAIA,gBAAAA,GAAAA,OAAAA;AAAS,gBAAA;oBAAEG,IAAMO,EAAAA,KAAAA,CAAMC,IAAI,CAAC,CAAC,CAAC,EAAEd,WAAAA,CAAY,CAAC,CAAC,CAAA;oBAAGO,KAAO,EAAA;AAAK;AAAE;AAC9E;AACD,KAAA,CAAA;AACD,IAAA,IAAIC,wBAAwB,IAAM,EAAA;AAChCO,QAAAA,OAAAA,CAAQC,IAAI,CAAC,CAAA,CAAA;AACf;IAEA,OAAOR,mBAAAA;AACT;AAEA,eAAeS,MAAAA,CACbC,GAAe,EACfC,OAAgC,EAChCC,SAAyB,EACzBC,KAAa,EACbC,kBAA0B,EAAA;IAE1B,MAAMC,QAAAA,GAAW,MAAMC,sBAAAA,CAAgBN,GAAKG,EAAAA,KAAAA,CAAAA;IAC5C,IAAI;AACF,QAAA,MAAMI,cAAc,MAAMC,uBAAAA,EAAAA;AAC1B,QAAA,MAAMC,aAAgBC,GAAAA,IAAAA,CAAKC,OAAO,CAACd,QAAQe,GAAG,EAAA,CAAA;QAC9C,MAAMC,WAAAA,GAAe,MAAMC,WAAQd,CAAAA,GAAAA,CAAAA;AAEnC,QAAA,IAAI,CAACa,WAAa,EAAA;YAChBb,GAAIe,CAAAA,MAAM,CAACC,KAAK,CACd,8FAAA,CAAA;AAEF,YAAA;AACF;AAEA,QAAA,MAAMC,kBAAkBjB,GAAIe,CAAAA,MAAM,CAACG,OAAO,CAAC,0BAA0BC,KAAK,EAAA;AAC1EF,QAAAA,eAAAA,CAAgBG,MAAM,GAAG,CAAA;;QAEzB,MAAMC,QAAAA,GAAWC,iBAAOC,CAAAA,UAAU,CAAC,QAAA,CAAA,CAAUC,MAAM,CAACX,WAAYzB,CAAAA,IAAI,CAAEqC,CAAAA,MAAM,CAAC,KAAA,CAAA;AAC7E,QAAA,MAAMC,kBAAqB,GAAA,CAAC,EAAEL,QAAAA,CAAS,OAAO,CAAC;QAC/C,IAAI;YACFrB,GAAIe,CAAAA,MAAM,CAACY,KAAK,CACd,4BACA,CAAC,cAAc,EAAEpB,WAAAA,CAAY,EAAE,CAAC,EAChC,CAAC,gBAAgB,EAAEE,aAAAA,CAAc,EAAE,CAAC,EACpC,CAAC,qBAAqB,EAAEiB,kBAAAA,CAAmB,CAAC,CAAA;YAE9C,MAAME,gCAAAA,CAAmBrB,aAAaE,aAAeiB,EAAAA,kBAAAA,CAAAA;AACrDT,YAAAA,eAAAA,CAAgBY,OAAO,CAAC,CAAC,gCAAgC,CAAC,CAAA;AAC5D,SAAA,CAAE,OAAOC,CAAY,EAAA;AACnBb,YAAAA,eAAAA,CAAgBc,IAAI,CAClB,oFAAA,CAAA;YAEF/B,GAAIe,CAAAA,MAAM,CAACY,KAAK,CAACG,CAAAA,CAAAA;AACjBjC,YAAAA,OAAAA,CAAQC,IAAI,CAAC,CAAA,CAAA;AACf;AAEA,QAAA,MAAMkC,WAActB,GAAAA,IAAAA,CAAKC,OAAO,CAACJ,WAAamB,EAAAA,kBAAAA,CAAAA;AAC9C,QAAA,MAAMO,SAAY,GAAA,MAAMC,GAAIC,CAAAA,IAAI,CAACH,WAAAA,CAAAA;QAEjC,IAAIC,SAAAA,CAAUG,IAAI,GAAGhC,kBAAoB,EAAA;YACvCJ,GAAIe,CAAAA,MAAM,CAACsB,GAAG,CACZ,8FAAA,CAAA;YAEF,IAAI;gBACF,MAAMH,GAAAA,CAAII,MAAM,CAACN,WAAAA,CAAAA;AACnB,aAAA,CAAE,OAAOF,CAAQ,EAAA;AACf9B,gBAAAA,GAAAA,CAAIe,MAAM,CAACsB,GAAG,CAAC,yBAA2BL,EAAAA,WAAAA,CAAAA;gBAC1ChC,GAAIe,CAAAA,MAAM,CAACY,KAAK,CAACG,CAAAA,CAAAA;AACnB;AACA,YAAA;AACF;AAEA,QAAA,MAAMS,cAAcvC,GAAIe,CAAAA,MAAM,CAACwB,WAAW,CAAC,GAAK,EAAA,sBAAA,CAAA;QAEhD,IAAI;AACF,YAAA,MAAM,EAAEC,IAAI,EAAE,GAAG,MAAMnC,QAAAA,CAASoC,MAAM,CACpC;gBAAEC,QAAUV,EAAAA,WAAAA;AAAa/B,gBAAAA;aACzB,EAAA;AACE0C,gBAAAA,gBAAAA,CAAAA,CAAiBC,aAAa,EAAA;AAC5B,oBAAA,MAAMC,KAAQD,GAAAA,aAAAA,CAAcC,KAAK,IAAIZ,UAAUG,IAAI;oBACnD,MAAMU,UAAAA,GAAaC,KAAKC,KAAK,CAAC,aAAeC,CAAAA,MAAM,GAAG,GAAOJ,GAAAA,KAAAA,CAAAA;AAC7DN,oBAAAA,WAAAA,CAAYf,MAAM,CAACsB,UAAAA,CAAAA;AACrB;AACF,aAAA,CAAA;AAGFP,YAAAA,WAAAA,CAAYf,MAAM,CAAC,GAAA,CAAA;AACnBe,YAAAA,WAAAA,CAAYW,IAAI,EAAA;AAChBlD,YAAAA,GAAAA,CAAIe,MAAM,CAACsB,GAAG,CAAC,CAAC,EAAE1C,KAAMwD,CAAAA,KAAK,CAACC,IAAI,CAAC,GAAA,CAAA,CAAK,mBAAmB,CAAC,CAAA;AAC5D,YAAA,OAAOZ,KAAKa,QAAQ;AACtB,SAAA,CAAE,OAAOvB,CAAQ,EAAA;AACfS,YAAAA,WAAAA,CAAYW,IAAI,EAAA;YAChB,MAAMI,iBAAAA,CAAkBtD,GAAK8B,EAAAA,CAAAA,EAAG7B,OAASC,EAAAA,SAAAA,CAAAA;SACjC,QAAA;YACR,MAAMgC,GAAAA,CAAII,MAAM,CAACN,WAAAA,CAAAA;AACnB;AACAnC,QAAAA,OAAAA,CAAQC,IAAI,CAAC,CAAA,CAAA;AACf,KAAA,CAAE,OAAOgC,CAAQ,EAAA;QACf9B,GAAIe,CAAAA,MAAM,CAACC,KAAK,CAAC,wEAAA,CAAA;QACjBhB,GAAIe,CAAAA,MAAM,CAACY,KAAK,CAACG,CAAAA,CAAAA;AACjBjC,QAAAA,OAAAA,CAAQC,IAAI,CAAC,CAAA,CAAA;AACf;AACF;AAEA,eAAewD,kBACbtD,GAAe,EACfgB,KAAU,EACVf,OAAY,EACZC,SAAyB,EAAA;IAEzB,MAAM,EAAEa,MAAM,EAAE,GAAGf,GAAAA;AACnBe,IAAAA,MAAAA,CAAOY,KAAK,CAACX,KAAAA,CAAAA;IAEb,IAAIA,KAAAA,CAAMuC,QAAQ,EAAEC,MAAQ,EAAA;QAC1B,OAAQxC,KAAAA,CAAMuC,QAAQ,CAACC,MAAM;YAC3B,KAAK,GAAA;AAAK,gBAAA;AACR,oBAAA,MAAMC,0BAA0BC,oDAA+B,CAAA;AAC7DC,wBAAAA,WAAAA,EAAa1D,QAAQb,IAAI;AACzBwE,wBAAAA,SAAAA,EAAW1D,UAAU2D,iBAAiB,CAACC,MAAM,CAACC,mBAAmB,CAACH,SAAS;AAC3EI,wBAAAA,UAAAA,EAAY9D,UAAU2D,iBAAiB,CAACC,MAAM,CAACC,mBAAmB,CAACC;AACrE,qBAAA,CAAA;oBACAjD,MAAOsB,CAAAA,GAAG,CAAC4B,qDAAgCR,CAAAA,uBAAAA,CAAAA,CAAAA;AAC3C,oBAAA;AACF;YACA,KAAK,GAAA;AACH1C,gBAAAA,MAAAA,CAAOC,KAAK,CACV,iGAAA,CAAA;AAEF,gBAAA;AAGJ;AACF;AACAD,IAAAA,MAAAA,CAAOC,KAAK,CAAC,wEAAA,CAAA;AACf;AAEA,eAAekD,WAAWlE,GAAe,EAAA;AACvC,IAAA,MAAM,EAAEC,OAAO,EAAE,GAAG,MAAMkE,uBAAc,EAAA;AACxC,IAAA,IAAI,CAAClE,OAAS,EAAA;QACZ,IAAI;YACF,MAAMmE,eAAAA,GAAkB,MAAMC,QAAoBrE,CAAAA,GAAAA,CAAAA;AAClD,YAAA,IAAIoE,eAAiB,EAAA;AACnB,gBAAA,MAAM,EAAEnE,OAASqE,EAAAA,YAAY,EAAE,GAAG,MAAMH,uBAAc,EAAA;gBACtD,OAAOG,YAAAA;AACT;AACF,SAAA,CAAE,OAAOxC,CAAQ,EAAA;YACf9B,GAAIe,CAAAA,MAAM,CAACC,KAAK,CAAC,wEAAA,CAAA;YACjBhB,GAAIe,CAAAA,MAAM,CAACY,KAAK,CAACG,CAAAA,CAAAA;AACjBjC,YAAAA,OAAAA,CAAQC,IAAI,CAAC,CAAA,CAAA;AACf;AACF;IACA,OAAOG,OAAAA;AACT;AAEA,eAAesE,SAAU,CAAA,EACvBvE,GAAG,EACHwE,eAAe,EAIhB,EAAA;IACC,IAAI;AACF,QAAA,MAAM,EAAEhC,IAAMtC,EAAAA,SAAS,EAAE,GAAG,MAAMsE,gBAAgBC,MAAM,EAAA;QACxD,OAAOvE,SAAAA;AACT,KAAA,CAAE,OAAO4B,CAAG,EAAA;AACV9B,QAAAA,GAAAA,CAAIe,MAAM,CAACY,KAAK,CAAC,0BAA4BG,EAAAA,CAAAA,CAAAA;QAC7C,OAAO,IAAA;AACT;AACF;AAEA,SAAS4C,mBAAoB1E,CAAAA,GAAe,EAAE2E,WAAmB,EAAE3F,YAAsB,EAAA;AACvF,IAAA,IAAI,CAACA,YAAAA,CAAa4F,QAAQ,CAACD,WAAc,CAAA,EAAA;QACvC3E,GAAIe,CAAAA,MAAM,CAACC,KAAK,CAAC,CAAC,YAAY,EAAE2D,WAAY,CAAA,gBAAgB,CAAC,CAAA;AAC7D9E,QAAAA,OAAAA,CAAQC,IAAI,CAAC,CAAA,CAAA;AACf;AACF;AAEA,eAAe+E,qBACb7E,GAAe,EACf8E,IAAgB,EAChB7E,OAAgC,EAChCjB,YAAsB,EAAA;IAEtB,IAAI8F,IAAAA,CAAK3F,GAAG,EAAE;QACZuF,mBAAoB1E,CAAAA,GAAAA,EAAK8E,IAAK3F,CAAAA,GAAG,EAAEH,YAAAA,CAAAA;AACnC,QAAA,OAAO8F,KAAK3F,GAAG;AACjB;IAEA,IAAIc,OAAAA,CAAQ8E,iBAAiB,EAAE;AAC7B,QAAA,OAAO9E,QAAQ8E,iBAAiB;AAClC;IAEA,IAAI/F,YAAAA,CAAagG,MAAM,GAAG,CAAG,EAAA;AAC3B,QAAA,OAAOjG,oBAAqBC,CAAAA,YAAAA,CAAAA;AAC9B;IAEA,OAAOA,YAAY,CAAC,CAAE,CAAA;AACxB;AAEA,SAASiG,0BAAAA,CACPjG,YAAkC,EAClC+F,iBAAyB,EAAA;IAEzB,MAAMJ,WAAAA,GAAc3F,aAAakG,IAAI,CAAC,CAAC/F,GAAQA,GAAAA,GAAAA,CAAIC,IAAI,KAAK2F,iBAAAA,CAAAA;AAC5D,IAAA,IAAI,CAACJ,WAAa,EAAA;AAChB,QAAA,MAAM,IAAIQ,KAAM,CAAA,CAAC,oBAAoB,EAAEJ,iBAAAA,CAAkB,WAAW,CAAC,CAAA;AACvE;AACA,IAAA,OAAOJ,WAAYS,CAAAA,oBAAoB,IAAIT,WAAAA,CAAYU,iBAAiB,IAAI,KAAA;AAC9E;AAEA,aAAe,CAAA,OAAOrF,GAAiB8E,EAAAA,IAAAA,GAAAA;AACrC,IAAA,MAAM,EAAEQ,aAAa,EAAE,GAAG,MAAMC,yBAAoBvF,CAAAA,GAAAA,CAAAA;IACpD,MAAMG,OAAAA,GAAQ,MAAMmF,aAAAA,CAActF,GAAKwF,EAAAA,oBAAAA,CAAAA;AACvC,IAAA,IAAI,CAACrF,OAAO,EAAA;AACV,QAAA;AACF;IAEA,MAAMF,OAAAA,GAAU,MAAMiE,UAAWlE,CAAAA,GAAAA,CAAAA;AACjC,IAAA,IAAI,CAACC,OAAS,EAAA;AACZJ,QAAAA,OAAAA,CAAQC,IAAI,CAAC,CAAA,CAAA;AACf;IAEA,MAAM0E,eAAAA,GAAkB,MAAMlE,sBAAAA,CAAgBN,GAAKG,EAAAA,OAAAA,CAAAA;IACnD,IAAIsF,WAAAA;IACJ,IAAIzG,YAAAA;IACJ,IAAI0G,mBAAAA;IAEJ,IAAI;AACF,QAAA,MAAM,EACJlD,IAAAA,EAAM,EAAEA,IAAI,EAAEmD,QAAQ,EAAE,EACzB,GAAG,MAAMnB,eAAgBN,CAAAA,UAAU,CAAC;AAAE9E,YAAAA,IAAAA,EAAMa,QAAQb;AAAK,SAAA,CAAA;QAC1DqG,WAAcjD,GAAAA,IAAAA;AACdxD,QAAAA,YAAAA,GAAeyG,YAAYzG,YAAY;AACvC0G,QAAAA,mBAAAA,GAAsBD,YAAYC,mBAAmB;QACrD,MAAME,kBAAAA,GAAqBH,YAAYI,WAAW;AAElD,QAAA,IAAID,kBAAoB,EAAA;YACtB5F,GAAIe,CAAAA,MAAM,CAACsB,GAAG,CACZ,gHAAA,CAAA;AAEFrC,YAAAA,GAAAA,CAAIe,MAAM,CAACsB,GAAG,CAAC1C,MAAMmG,SAAS,CAAC,CAAC,EAAEH,QAASI,CAAAA,aAAa,CAAC9F,OAAO,CAAC,CAAC,CAAA,CAAA;AAClE,YAAA;AACF;AACF,KAAA,CAAE,OAAO6B,CAAoB,EAAA;AAC3B,QAAA,IAAIA,CAAakE,YAAAA,gBAAAA,IAAclE,CAAEyB,CAAAA,QAAQ,EAAEf,IAAM,EAAA;AAC/C,YAAA,IAAIV,CAAEyB,CAAAA,QAAQ,CAACC,MAAM,KAAK,GAAK,EAAA;AAC7BxD,gBAAAA,GAAAA,CAAIe,MAAM,CAACkF,IAAI,CACb,CAAC,uJAAuJ,EAAEtG,KAAAA,CAAMuG,IAAI,CAClK,MACA,CAAA,CAAA,0BAA0B,CAAC,CAAA;aAE1B,MAAA;AACLlG,gBAAAA,GAAAA,CAAIe,MAAM,CAACC,KAAK,CAACc,CAAEyB,CAAAA,QAAQ,CAACf,IAAI,CAAA;AAClC;SACK,MAAA;YACLxC,GAAIe,CAAAA,MAAM,CAACC,KAAK,CACd,uFAAA,CAAA;AAEJ;QACAhB,GAAIe,CAAAA,MAAM,CAACY,KAAK,CAACG,CAAAA,CAAAA;AACjB,QAAA;AACF;IAEA,MAAMqE,oBAAAA,CAAWnG,GAAKwE,EAAAA,eAAAA,EAAiB,mBAAqB,EAAA;AAC1D4B,QAAAA,mBAAAA,EAAqBnG,QAAQb;AAC/B,KAAA,CAAA;AAEA,IAAA,MAAMiH,sBAAsBC,uCAA2BtG,CAAAA,GAAAA,CAAAA;AACvD,IAAA,MAAMuG,mBAAmBC,iCAAwBxG,CAAAA,GAAAA,CAAAA;IAEjD,MAAME,SAAAA,GAAY,MAAMqE,SAAU,CAAA;AAAEvE,QAAAA,GAAAA;AAAKwE,QAAAA;AAAgB,KAAA,CAAA;AACzD,IAAA,IAAI,CAACtE,SAAW,EAAA;QACdF,GAAIe,CAAAA,MAAM,CAACC,KAAK,CACd,0GAAA,CAAA;AAEF,QAAA;AACF;AAEA,IAAA,IAAIyF,OAAkBC,GAAAA,QAAAA,CAASxG,SAAUE,CAAAA,kBAAkB,EAAE,EAAA,CAAA;IAC7D,IAAIuG,MAAAA,CAAOC,KAAK,CAACH,OAAU,CAAA,EAAA;QACzBzG,GAAIe,CAAAA,MAAM,CAACY,KAAK,CACd,8EAAA,CAAA;QAEF8E,OAAU,GAAA,SAAA;AACZ;AAEAxG,IAAAA,OAAAA,CAAQ8E,iBAAiB,GAAG,MAAMF,oBAAqB7E,CAAAA,GAAAA,EAAK8E,MAAM7E,OAASjB,EAAAA,YAAAA,CAAAA;IAE3E,IAAI,CAAC8F,IAAK+B,CAAAA,KAAK,EAAE;AACf,QAAA,MAAMC,oBAAuB7B,GAAAA,0BAAAA,CAC3BS,mBACAzF,EAAAA,OAAAA,CAAQ8E,iBAAiB,CAAA;AAE3B,QAAA,IAAI+B,oBAAsB,EAAA;YACxB9G,GAAIe,CAAAA,MAAM,CAACsB,GAAG,CAAC0E,MAAM7G,SAAU2D,CAAAA,iBAAiB,CAACmD,gBAAgB,EAAExI,YAAAA,CAAAA,CAAAA;AACnE,YAAA,MAAM,EAAEyI,OAAO,EAAE,GAAG,MAAM1H,QAAAA,CAASC,MAAM,CAAC;AACxC,gBAAA;oBACEC,IAAM,EAAA,SAAA;oBACNL,IAAM,EAAA,SAAA;AACNM,oBAAAA,OAAAA,EAAS,CAAC,0CAA0C,EAAEC,MAAMuG,IAAI,CAACT,YAAYyB,WAAW,CAAA,CAAE,IAAI,EAAEvH,MAAMuG,IAAI,CAACjG,QAAQ8E,iBAAiB,CAAA,CAAE,aAAa;AACrJ;AACD,aAAA,CAAA;AACD,YAAA,IAAI,CAACkC,OAAS,EAAA;AACZpH,gBAAAA,OAAAA,CAAQC,IAAI,CAAC,CAAA,CAAA;AACf;AACF;AACF;AAEA,IAAA,MAAMqH,UAAU,MAAMpH,MAAAA,CAAOC,GAAKC,EAAAA,OAAAA,EAASC,WAAWC,OAAOsG,EAAAA,OAAAA,CAAAA;AAE7D,IAAA,IAAI,CAACU,OAAS,EAAA;AACZ,QAAA;AACF;AAEA,IAAA,IAAIC,aAA+D,GAAA,IAAA;IAEnE,IAAI;AACFpH,QAAAA,GAAAA,CAAIe,MAAM,CAACsB,GAAG,CACZ,CAAC,uBAAuB,EAAE1C,KAAMuG,CAAAA,IAAI,CAACjG,OAAAA,CAAQ8E,iBAAiB,IAAI,CAAC,UAAU,CAAC,CAAA,CAAE,eAAe,CAAC,CAAA;AAGlGqC,QAAAA,aAAAA,GAAgBf,mBACd,CAAA,CAAC,EAAEgB,aAAAA,CAAUC,UAAU,CAAC,CAAC,EAAEC,cAAQ,CAAA,cAAc,CAAC,EAClDpH,OACAD,EAAAA,SAAAA,CAAAA;AAGF,QAAA,MAAMqG,gBAAiB,CAAA,CAAC,EAAEc,aAAAA,CAAUC,UAAU,CAAC,CAAC,EAAEC,cAAAA,CAAQ,MAAM,EAAEJ,OAAQ,CAAA,CAAC,EAAEhH,OAAOD,EAAAA,SAAAA,CAAAA;QACpF,MAAMsH,gBAAAA,GACJ7H,MAAMuG,IAAI,CAAC,UACXvG,KAAMuG,CAAAA,IAAI,CAACJ,SAAS,CAAC,CAAC,EAAEuB,aAAAA,CAAUI,gBAAgB,CAAC,UAAU,EAAExH,OAAQb,CAAAA,IAAI,CAAC,YAAY,CAAC,CAAA;QAC3FY,GAAIe,CAAAA,MAAM,CAACsB,GAAG,CACZ0E,KAAAA,CAAM,CAAC,uCAAuC,EAAES,gBAAiB,CAAA,CAAC,EAAE;YAClE/I,OAAS,EAAA,CAAA;YACTC,MAAQ,EAAA,CAAA;YACRG,WAAa,EAAA,OAAA;YACbD,WAAa,EAAA,OAAA;YACb8I,cAAgB,EAAA;AAClB,SAAA,CAAA,CAAA;AAEJ,KAAA,CAAE,OAAO5F,CAAoB,EAAA;QAC3B9B,GAAIe,CAAAA,MAAM,CAACY,KAAK,CAACG,CAAAA,CAAAA;AACjB,QAAA,IAAIA,aAAaqD,KAAO,EAAA;AACtBnF,YAAAA,GAAAA,CAAIe,MAAM,CAACC,KAAK,CAACc,EAAEpC,OAAO,CAAA;SACrB,MAAA;YACLM,GAAIe,CAAAA,MAAM,CAACC,KAAK,CAAC,wEAAA,CAAA;AACnB;KACQ,QAAA;AACR,QAAA,IAAIoG,aAAe,EAAA;AACjBA,YAAAA,aAAAA,CAAcO,KAAK,EAAA;AACrB;AACF;AACF,CAAA;;;;"}