{"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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"}