{"version":3,"file":"index.mjs","sources":["../src/config/api.ts","../src/utils/compress-files.ts","../src/config/local.ts","../src/services/cli-api.ts","../src/services/strapi-info-save.ts","../src/services/token.ts","../src/services/logger.ts","../src/utils/pkg.ts","../src/create-project/utils/get-project-name-from-pkg.ts","../src/utils/analytics.ts","../src/login/action.ts","../src/create-project/utils/project-questions.utils.ts","../src/create-project/action.ts","../src/services/notification.ts","../src/services/build-logs.ts","../src/deploy-project/action.ts","../src/utils/helpers.ts","../src/deploy-project/command.ts","../src/deploy-project/index.ts","../src/link/action.ts","../src/link/command.ts","../src/link/index.ts","../src/login/command.ts","../src/login/index.ts","../src/logout/action.ts","../src/logout/command.ts","../src/logout/index.ts","../src/create-project/command.ts","../src/create-project/index.ts","../src/list-projects/action.ts","../src/list-projects/command.ts","../src/list-projects/index.ts","../src/index.ts"],"sourcesContent":["import { env } from '@strapi/utils';\n\nexport const apiConfig = {\n  apiBaseUrl: env('STRAPI_CLI_CLOUD_API', 'https://cloud-cli-api.strapi.io'),\n  dashboardBaseUrl: env('STRAPI_CLI_CLOUD_DASHBOARD', 'https://cloud.strapi.io'),\n};\n","import * as fse from 'fs-extra';\nimport * as tar from 'tar';\nimport * as path from 'path';\nimport { minimatch } from 'minimatch';\n\nconst IGNORED_PATTERNS = [\n  '**/.git/**',\n  '**/node_modules/**',\n  '**/build/**',\n  '**/dist/**',\n  '**/.cache/**',\n  '**/.circleci/**',\n  '**/.github/**',\n  '**/.gitignore',\n  '**/.gitkeep',\n  '**/.gitlab-ci.yml',\n  '**/.idea/**',\n  '**/.vscode/**',\n];\n\nconst isIgnoredFile = (folderPath: string, file: string, ignorePatterns: string[]): boolean => {\n  ignorePatterns.push(...IGNORED_PATTERNS);\n  const relativeFilePath = path.join(folderPath, file);\n  let isIgnored = false;\n  for (const pattern of ignorePatterns) {\n    if (pattern.startsWith('!')) {\n      if (minimatch(relativeFilePath, pattern.slice(1), { matchBase: true, dot: true })) {\n        return false;\n      }\n    } else if (minimatch(relativeFilePath, pattern, { matchBase: true, dot: true })) {\n      if (path.basename(file) !== '.gitkeep') {\n        isIgnored = true;\n      }\n    }\n  }\n  return isIgnored;\n};\n\nconst getFiles = async (\n  dirPath: string,\n  ignorePatterns: string[] = [],\n  subfolder: string = ''\n): Promise<string[]> => {\n  const arrayOfFiles: string[] = [];\n  const entries = await fse.readdir(path.join(dirPath, subfolder));\n\n  for (const entry of entries) {\n    const entryPathFromRoot = path.join(subfolder, entry);\n    const entryPath = path.relative(dirPath, entryPathFromRoot);\n    const isIgnored = isIgnoredFile(dirPath, entryPathFromRoot, ignorePatterns);\n\n    if (!isIgnored) {\n      if (fse.statSync(entryPath).isDirectory()) {\n        const subFiles = await getFiles(dirPath, ignorePatterns, entryPathFromRoot);\n        arrayOfFiles.push(...subFiles);\n      } else {\n        arrayOfFiles.push(entryPath);\n      }\n    }\n  }\n  return arrayOfFiles;\n};\n\nconst readGitignore = async (folderPath: string): Promise<string[]> => {\n  const gitignorePath = path.resolve(folderPath, '.gitignore');\n  const pathExist = await fse.pathExists(gitignorePath);\n\n  if (!pathExist) return [];\n\n  const gitignoreContent = await fse.readFile(gitignorePath, 'utf8');\n\n  return gitignoreContent\n    .split(/\\r?\\n/)\n    .filter((line) => Boolean(line.trim()) && !line.startsWith('#'));\n};\n\nconst compressFilesToTar = async (\n  storagePath: string,\n  folderToCompress: string,\n  filename: string\n): Promise<void> => {\n  const ignorePatterns = await readGitignore(folderToCompress);\n  const filesToCompress = await getFiles(folderToCompress, ignorePatterns);\n\n  return tar.c(\n    {\n      gzip: true,\n      file: path.resolve(storagePath, filename),\n    },\n    filesToCompress\n  );\n};\n\nexport { compressFilesToTar, isIgnoredFile };\n","import path from 'path';\nimport os from 'os';\nimport fse from 'fs-extra';\nimport XDGAppPaths from 'xdg-app-paths';\n\nconst APP_FOLDER_NAME = 'com.strapi.cli';\n\nexport const CONFIG_FILENAME = 'config.json';\n\nexport type LocalConfig = {\n  token?: string;\n  deviceId?: string;\n};\n\nasync function checkDirectoryExists(directoryPath: string) {\n  try {\n    const fsStat = await fse.lstat(directoryPath);\n    return fsStat.isDirectory();\n  } catch (e) {\n    return false;\n  }\n}\n\n// Determine storage path based on the operating system\nexport async function getTmpStoragePath() {\n  const storagePath = path.join(os.tmpdir(), APP_FOLDER_NAME);\n  await fse.ensureDir(storagePath);\n  return storagePath;\n}\n\nasync function getConfigPath() {\n  const configDirs = XDGAppPaths(APP_FOLDER_NAME).configDirs();\n  const configPath = configDirs.find(checkDirectoryExists);\n\n  if (!configPath) {\n    await fse.ensureDir(configDirs[0]);\n    return configDirs[0];\n  }\n  return configPath;\n}\n\nexport async function getLocalConfig(): Promise<LocalConfig> {\n  const configPath = await getConfigPath();\n  const configFilePath = path.join(configPath, CONFIG_FILENAME);\n  await fse.ensureFile(configFilePath);\n  try {\n    return await fse.readJSON(configFilePath, { encoding: 'utf8', throws: true });\n  } catch (e) {\n    return {};\n  }\n}\n\nexport async function saveLocalConfig(data: LocalConfig) {\n  const configPath = await getConfigPath();\n  const configFilePath = path.join(configPath, CONFIG_FILENAME);\n  await fse.writeJson(configFilePath, data, { encoding: 'utf8', spaces: 2, mode: 0o600 });\n}\n","import axios, { type AxiosResponse } from 'axios';\nimport fse from 'fs-extra';\nimport os from 'os';\nimport { apiConfig } from '../config/api';\nimport type { CLIContext, CloudCliConfig, TrackPayload } from '../types';\nimport { getLocalConfig } from '../config/local';\n\nimport packageJson from '../../package.json';\n\nexport const VERSION = 'v1';\n\nexport type ProjectInfos = {\n  id: string;\n  name: string;\n  displayName?: string;\n  nodeVersion?: string;\n  region?: string;\n  plan?: string;\n  url?: string;\n};\n\nexport type ProjectInput = Omit<ProjectInfos, 'id'>;\n\nexport type DeployResponse = {\n  build_id: string;\n  image: string;\n};\n\nexport type ListProjectsResponse = {\n  data: {\n    data: string;\n  };\n};\n\nexport type ListLinkProjectsResponse = {\n  data: {\n    data: ProjectInfos[] | Record<string, never>;\n  };\n};\n\nexport type GetProjectResponse = {\n  data: {\n    updatedAt: string;\n    suspendedAt?: string;\n    isTrial: boolean;\n  };\n  metadata: {\n    dashboardUrls: {\n      project: string;\n      deployments: string;\n    };\n  };\n};\n\nexport interface CloudApiService {\n  deploy(\n    deployInput: {\n      filePath: string;\n      project: { name: string };\n    },\n    {\n      onUploadProgress,\n    }: {\n      onUploadProgress: (progressEvent: { loaded: number; total?: number }) => void;\n    }\n  ): Promise<AxiosResponse<DeployResponse>>;\n\n  createProject(createProjectInput: ProjectInput): Promise<{\n    data: ProjectInput;\n    status: number;\n  }>;\n\n  getUserInfo(): Promise<AxiosResponse>;\n\n  config(): Promise<AxiosResponse<CloudCliConfig>>;\n\n  listProjects(): Promise<AxiosResponse<ListProjectsResponse>>;\n\n  listLinkProjects(): Promise<AxiosResponse<ListLinkProjectsResponse>>;\n\n  getProject(project: { name: string }): Promise<AxiosResponse<GetProjectResponse>>;\n\n  track(event: string, payload?: TrackPayload): Promise<AxiosResponse<void>>;\n}\n\nexport async function cloudApiFactory(\n  { logger }: { logger: CLIContext['logger'] },\n  token?: string\n): Promise<CloudApiService> {\n  const localConfig = await getLocalConfig();\n  const customHeaders = {\n    'x-device-id': localConfig.deviceId,\n    'x-app-version': packageJson.version,\n    'x-os-name': os.type(),\n    'x-os-version': os.version(),\n    'x-language': Intl.DateTimeFormat().resolvedOptions().locale,\n    'x-node-version': process.versions.node,\n  };\n  const axiosCloudAPI = axios.create({\n    baseURL: `${apiConfig.apiBaseUrl}/${VERSION}`,\n    headers: {\n      'Content-Type': 'application/json',\n      ...customHeaders,\n    },\n  });\n\n  if (token) {\n    axiosCloudAPI.defaults.headers.Authorization = `Bearer ${token}`;\n  }\n\n  return {\n    deploy({ filePath, project }, { onUploadProgress }) {\n      return axiosCloudAPI.post(\n        `/deploy/${project.name}`,\n        { file: fse.createReadStream(filePath) },\n        {\n          headers: {\n            'Content-Type': 'multipart/form-data',\n          },\n          onUploadProgress,\n        }\n      );\n    },\n\n    async createProject({ name, nodeVersion, region, plan }) {\n      const response = await axiosCloudAPI.post('/project', {\n        projectName: name,\n        region,\n        nodeVersion,\n        plan,\n      });\n\n      return {\n        data: {\n          id: response.data.id,\n          name: response.data.name,\n          nodeVersion: response.data.nodeVersion,\n          region: response.data.region,\n        },\n        status: response.status,\n      };\n    },\n\n    getUserInfo() {\n      return axiosCloudAPI.get('/user');\n    },\n\n    async config(): Promise<AxiosResponse<CloudCliConfig>> {\n      try {\n        const response = await axiosCloudAPI.get('/config');\n\n        if (response.status !== 200) {\n          throw new Error('Error fetching cloud CLI config from the server.');\n        }\n\n        return response;\n      } catch (error) {\n        logger.debug(\n          \"🥲 Oops! Couldn't retrieve the cloud CLI config from the server. Please try again.\"\n        );\n\n        throw error;\n      }\n    },\n\n    async listProjects(): Promise<AxiosResponse<ListProjectsResponse>> {\n      try {\n        const response = await axiosCloudAPI.get('/projects');\n\n        if (response.status !== 200) {\n          throw new Error('Error fetching cloud projects from the server.');\n        }\n\n        return response;\n      } catch (error) {\n        logger.debug(\n          \"🥲 Oops! Couldn't retrieve your project's list from the server. Please try again.\"\n        );\n        throw error;\n      }\n    },\n\n    async listLinkProjects(): Promise<AxiosResponse<ListLinkProjectsResponse, unknown>> {\n      try {\n        const response = await axiosCloudAPI.get('/projects-linkable');\n\n        if (response.status !== 200) {\n          throw new Error('Error fetching cloud projects from the server.');\n        }\n\n        return response;\n      } catch (error) {\n        logger.debug(\n          \"🥲 Oops! Couldn't retrieve your project's list from the server. Please try again.\"\n        );\n        throw error;\n      }\n    },\n\n    async getProject({ name }): Promise<AxiosResponse<GetProjectResponse>> {\n      try {\n        const response = await axiosCloudAPI.get(`/projects/${name}`);\n\n        if (response.status !== 200) {\n          throw new Error(\"Error fetching project's details.\");\n        }\n\n        return response;\n      } catch (error) {\n        logger.debug(\n          \"🥲 Oops! There was a problem retrieving your project's details. Please try again.\"\n        );\n        throw error;\n      }\n    },\n\n    track(event, payload = {}) {\n      return axiosCloudAPI.post<void>('/track', {\n        event,\n        payload,\n      });\n    },\n  };\n}\n","import fse from 'fs-extra';\nimport path from 'path';\nimport type { ProjectInfos } from './cli-api';\n\nexport const LOCAL_SAVE_FILENAME = '.strapi-cloud.json';\n\nexport type LocalSave = {\n  project?: Omit<ProjectInfos, 'id'>;\n};\n\nexport async function save(data: LocalSave, { directoryPath }: { directoryPath?: string } = {}) {\n  const alreadyInFileData = await retrieve({ directoryPath });\n  const storedData = { ...alreadyInFileData, ...data };\n  const pathToFile = path.join(directoryPath || process.cwd(), LOCAL_SAVE_FILENAME);\n  // Ensure the directory exists\n  await fse.ensureDir(path.dirname(pathToFile));\n  await fse.writeJson(pathToFile, storedData, { encoding: 'utf8' });\n}\n\nexport async function retrieve({\n  directoryPath,\n}: { directoryPath?: string } = {}): Promise<LocalSave> {\n  const pathToFile = path.join(directoryPath || process.cwd(), LOCAL_SAVE_FILENAME);\n  const pathExists = await fse.pathExists(pathToFile);\n  if (!pathExists) {\n    return {};\n  }\n\n  return fse.readJSON(pathToFile, { encoding: 'utf8' });\n}\n","import jwksClient, { type JwksClient, type SigningKey } from 'jwks-rsa';\nimport type { JwtHeader, VerifyErrors } from 'jsonwebtoken';\nimport jwt from 'jsonwebtoken';\nimport { getLocalConfig, saveLocalConfig } from '../config/local';\nimport type { CloudCliConfig, CLIContext } from '../types';\nimport { cloudApiFactory } from './cli-api';\n\nlet cliConfig: CloudCliConfig;\n\ninterface DecodedToken {\n  [key: string]: any;\n}\n\nexport async function tokenServiceFactory({ logger }: { logger: CLIContext['logger'] }) {\n  const cloudApiService = await cloudApiFactory({ logger });\n\n  async function saveToken(str: string) {\n    const appConfig = await getLocalConfig();\n\n    if (!appConfig) {\n      logger.error('There was a problem saving your token. Please try again.');\n      return;\n    }\n\n    appConfig.token = str;\n\n    try {\n      await saveLocalConfig(appConfig);\n    } catch (e: Error | unknown) {\n      logger.debug(e);\n      logger.error('There was a problem saving your token. Please try again.');\n    }\n  }\n\n  async function retrieveToken() {\n    const appConfig = await getLocalConfig();\n    if (appConfig.token) {\n      // check if token is still valid\n      if (await isTokenValid(appConfig.token)) {\n        return appConfig.token;\n      }\n    }\n    return undefined;\n  }\n\n  async function validateToken(idToken: string, jwksUrl: string): Promise<void> {\n    const client: JwksClient = jwksClient({\n      jwksUri: jwksUrl,\n    });\n\n    // Get the Key from the JWKS using the token header's Key ID (kid)\n    const getKey = (header: JwtHeader, callback: (e: Error | null, key?: string) => void) => {\n      client.getSigningKey(header.kid, (e: Error | null, key?: SigningKey) => {\n        if (e) {\n          callback(e);\n        } else if (key) {\n          const publicKey = 'publicKey' in key ? key.publicKey : key.rsaPublicKey;\n          callback(null, publicKey);\n        } else {\n          callback(new Error('Key not found'));\n        }\n      });\n    };\n\n    const decodedToken = jwt.decode(idToken, { complete: true }) as DecodedToken;\n    if (!decodedToken) {\n      if (typeof idToken === 'undefined' || idToken === '') {\n        logger.warn('You need to be logged in to use this feature. Please log in and try again.');\n      } else {\n        logger.error(\n          'There seems to be a problem with your login information. Please try logging in again.'\n        );\n      }\n      return Promise.reject(new Error('Invalid token'));\n    }\n\n    // Verify the JWT token signature using the JWKS Key\n    return new Promise<void>((resolve, reject) => {\n      jwt.verify(idToken, getKey, (err: VerifyErrors | null) => {\n        if (err) {\n          reject(err);\n        }\n        if (decodedToken.payload.exp < Math.floor(Date.now() / 1000)) {\n          reject(new Error('Token is expired'));\n        }\n        resolve();\n      });\n    });\n  }\n\n  async function isTokenValid(token: string) {\n    try {\n      const config = await cloudApiService.config();\n\n      cliConfig = config.data;\n      if (token) {\n        await validateToken(token, cliConfig.jwksUrl);\n        return true;\n      }\n      return false;\n    } catch (e) {\n      logger.debug(e);\n      return false;\n    }\n  }\n\n  async function eraseToken() {\n    const appConfig = await getLocalConfig();\n    if (!appConfig) {\n      return;\n    }\n\n    delete appConfig.token;\n\n    try {\n      await saveLocalConfig(appConfig);\n    } catch (e: Error | unknown) {\n      logger.debug(e);\n      logger.error(\n        'There was an issue removing your login information. Please try logging out again.'\n      );\n      throw e;\n    }\n  }\n\n  async function getValidToken(\n    ctx: CLIContext,\n    loginAction: (ctx: CLIContext) => Promise<boolean>\n  ) {\n    let token = await retrieveToken();\n\n    while (!token || !(await isTokenValid(token))) {\n      logger.log(\n        token\n          ? 'Oops! Your token seems expired or invalid. Please login again.'\n          : \"We couldn't find a valid token. You need to be logged in to use this feature.\"\n      );\n      if (!(await loginAction(ctx))) return null;\n      token = await retrieveToken();\n    }\n\n    return token;\n  }\n\n  return {\n    saveToken,\n    retrieveToken,\n    validateToken,\n    isTokenValid,\n    eraseToken,\n    getValidToken,\n  };\n}\n","import chalk from 'chalk';\nimport stringify from 'fast-safe-stringify';\n\nimport ora from 'ora';\nimport * as cliProgress from 'cli-progress';\n\nexport interface LoggerOptions {\n  silent?: boolean;\n  debug?: boolean;\n  timestamp?: boolean;\n}\n\nexport interface Logger {\n  warnings: number;\n  errors: number;\n  debug: (...args: unknown[]) => void;\n  info: (...args: unknown[]) => void;\n  success: (...args: unknown[]) => void;\n  warn: (...args: unknown[]) => void;\n  error: (...args: unknown[]) => void;\n  log: (...args: unknown[]) => void;\n  spinner: (text: string) => Pick<ora.Ora, 'succeed' | 'fail' | 'start' | 'text' | 'isSpinning'>;\n  progressBar: (\n    totalSize: number,\n    text: string\n  ) => Pick<cliProgress.SingleBar, 'start' | 'stop' | 'update'>;\n}\n\nconst stringifyArg = (arg: unknown) => {\n  return typeof arg === 'object' ? stringify(arg) : arg;\n};\n\nconst createLogger = (options: LoggerOptions = {}): Logger => {\n  const { silent = false, debug = false, timestamp = true } = options;\n\n  const state = { errors: 0, warning: 0 };\n\n  return {\n    get warnings() {\n      return state.warning;\n    },\n\n    get errors() {\n      return state.errors;\n    },\n\n    async debug(...args) {\n      if (silent || !debug) {\n        return;\n      }\n\n      console.log(\n        chalk.cyan(`[DEBUG]${timestamp ? `\\t[${new Date().toISOString()}]` : ''}`),\n        ...args.map(stringifyArg)\n      );\n    },\n\n    info(...args) {\n      if (silent) {\n        return;\n      }\n\n      console.info(\n        chalk.blue(`[INFO]${timestamp ? `\\t[${new Date().toISOString()}]` : ''}`),\n        ...args.map(stringifyArg)\n      );\n    },\n\n    log(...args) {\n      if (silent) {\n        return;\n      }\n\n      console.info(\n        chalk.blue(`${timestamp ? `\\t[${new Date().toISOString()}]` : ''}`),\n        ...args.map(stringifyArg)\n      );\n    },\n\n    success(...args) {\n      if (silent) {\n        return;\n      }\n\n      console.info(\n        chalk.green(`[SUCCESS]${timestamp ? `\\t[${new Date().toISOString()}]` : ''}`),\n        ...args.map(stringifyArg)\n      );\n    },\n\n    warn(...args) {\n      state.warning += 1;\n\n      if (silent) {\n        return;\n      }\n\n      console.warn(\n        chalk.yellow(`[WARN]${timestamp ? `\\t[${new Date().toISOString()}]` : ''}`),\n        ...args.map(stringifyArg)\n      );\n    },\n\n    error(...args) {\n      state.errors += 1;\n\n      if (silent) {\n        return;\n      }\n\n      console.error(\n        chalk.red(`[ERROR]${timestamp ? `\\t[${new Date().toISOString()}]` : ''}`),\n        ...args.map(stringifyArg)\n      );\n    },\n\n    // @ts-expect-error – returning a subpart of ora is fine because the types tell us what is what.\n    spinner(text: string) {\n      if (silent) {\n        return {\n          succeed() {\n            return this;\n          },\n          fail() {\n            return this;\n          },\n          start() {\n            return this;\n          },\n          text: '',\n          isSpinning: false,\n        };\n      }\n\n      return ora(text);\n    },\n\n    progressBar(totalSize: number, text: string) {\n      if (silent) {\n        return {\n          start() {\n            return this;\n          },\n          stop() {\n            return this;\n          },\n          update() {\n            return this;\n          },\n        };\n      }\n\n      const progressBar = new cliProgress.SingleBar({\n        format: `${text ? `${text} |` : ''}${chalk.green('{bar}')}| {percentage}%`,\n        barCompleteChar: '\\u2588',\n        barIncompleteChar: '\\u2591',\n        hideCursor: true,\n        forceRedraw: true,\n      });\n\n      progressBar.start(totalSize, 0);\n\n      return progressBar;\n    },\n  };\n};\n\nexport { createLogger };\n","import * as fse from 'fs-extra';\nimport os from 'os';\nimport pkgUp from 'pkg-up';\nimport * as yup from 'yup';\nimport chalk from 'chalk';\nimport { Logger } from '../services/logger';\n\ninterface Export {\n  types?: string;\n  source: string;\n  module?: string;\n  import?: string;\n  require?: string;\n  default: string;\n}\n\nconst packageJsonSchema = yup.object({\n  name: yup.string().required(),\n  exports: yup.lazy((value) =>\n    yup\n      .object(\n        typeof value === 'object'\n          ? Object.entries(value).reduce((acc, [key, value]) => {\n              if (typeof value === 'object') {\n                acc[key] = yup\n                  .object({\n                    types: yup.string().optional(),\n                    source: yup.string().required(),\n                    module: yup.string().optional(),\n                    import: yup.string().required(),\n                    require: yup.string().required(),\n                    default: yup.string().required(),\n                  })\n                  .noUnknown(true);\n              } else {\n                acc[key] = yup\n                  .string()\n                  .matches(/^\\.\\/.*\\.json$/)\n                  .required();\n              }\n\n              return acc;\n            }, {} as Record<string, yup.SchemaOf<string> | yup.SchemaOf<Export>>)\n          : undefined\n      )\n      .optional()\n  ),\n});\n\ntype PackageJson = yup.Asserts<typeof packageJsonSchema>;\n\n/**\n * @description being a task to load the package.json starting from the current working directory\n * using a shallow find for the package.json  and `fs` to read the file. If no package.json is found,\n * the process will throw with an appropriate error message.\n */\nconst loadPkg = async ({ cwd, logger }: { cwd: string; logger: Logger }): Promise<PackageJson> => {\n  const pkgPath = await pkgUp({ cwd });\n\n  if (!pkgPath) {\n    throw new Error('Could not find a package.json in the current directory');\n  }\n\n  const buffer = await fse.readFile(pkgPath);\n\n  const pkg = JSON.parse(buffer.toString());\n\n  logger.debug('Loaded package.json:', os.EOL, pkg);\n\n  return pkg;\n};\n\n/**\n * @description validate the package.json against a standardised schema using `yup`.\n * If the validation fails, the process will throw with an appropriate error message.\n */\nconst validatePkg = async ({ pkg }: { pkg: object }): Promise<PackageJson> => {\n  try {\n    return await packageJsonSchema.validate(pkg, {\n      strict: true,\n    });\n  } catch (err) {\n    if (err instanceof yup.ValidationError) {\n      switch (err.type) {\n        case 'required':\n          if (err.path) {\n            throw new Error(\n              `'${err.path}' in 'package.json' is required as type '${chalk.magenta(\n                yup.reach(packageJsonSchema, err.path).type\n              )}'`\n            );\n          }\n          break;\n        /**\n         * This will only be thrown if there are keys in the export map\n         * that we don't expect so we can therefore make some assumptions\n         */\n        case 'noUnknown':\n          if (err.path && err.params && 'unknown' in err.params) {\n            throw new Error(\n              `'${err.path}' in 'package.json' contains the unknown key ${chalk.magenta(\n                err.params.unknown\n              )}, for compatability only the following keys are allowed: ${chalk.magenta(\n                \"['types', 'source', 'import', 'require', 'default']\"\n              )}`\n            );\n          }\n          break;\n        default:\n          if (err.path && err.params && 'type' in err.params && 'value' in err.params) {\n            throw new Error(\n              `'${err.path}' in 'package.json' must be of type '${chalk.magenta(\n                err.params.type\n              )}' (recieved '${chalk.magenta(typeof err.params.value)}')`\n            );\n          }\n      }\n    }\n\n    throw err;\n  }\n};\n\nexport type { PackageJson, Export };\nexport { loadPkg, validatePkg };\n","import { CLIContext } from '../../types';\nimport { PackageJson, loadPkg } from '../../utils/pkg';\n\nexport async function getProjectNameFromPackageJson(ctx: CLIContext): Promise<string> {\n  try {\n    const packageJson = (await loadPkg(ctx)) as PackageJson;\n    return packageJson.name || 'my-strapi-project';\n  } catch (e) {\n    return 'my-strapi-project';\n  }\n}\n","import type { CLIContext, CloudApiService, TrackPayload } from '../types';\n\nconst trackEvent = async (\n  ctx: CLIContext,\n  cloudApiService: CloudApiService,\n  eventName: string,\n  eventData: TrackPayload\n) => {\n  try {\n    await cloudApiService.track(eventName, eventData);\n  } catch (e) {\n    ctx.logger.debug(`Failed to track ${eventName}`, e);\n  }\n};\n\nexport { trackEvent };\n","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';\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(ctx: CLIContext): Promise<boolean> {\n  const { logger } = 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        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        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        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 to the Strapi Cloud API...');\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\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', { loginMethod: 'cli' });\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', { loginMethod: 'cli' });\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    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    await trackEvent(ctx, cloudApiService, 'didLogin', { loginMethod: 'cli' });\n  };\n\n  await authenticate();\n  return isAuthenticated;\n}\n","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","import inquirer from 'inquirer';\nimport { AxiosError } from 'axios';\nimport { defaults } from 'lodash/fp';\nimport type { CLIContext, CloudApiService, 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(\n  ctx: CLIContext,\n  cloudApi: CloudApiService,\n  projectInput: ProjectInput\n): Promise<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): Promise<ProjectInput | undefined> => {\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","import EventSource from 'eventsource';\nimport type { CLIContext, CloudCliConfig } from '../types';\n\ntype Event = {\n  type: string;\n  data: string;\n  lastEventId: string;\n  origin: string;\n};\n\nexport function notificationServiceFactory({ logger }: CLIContext) {\n  return (url: string, token: string, cliConfig: CloudCliConfig) => {\n    const CONN_TIMEOUT = Number(cliConfig.notificationsConnectionTimeout);\n\n    const es = new EventSource(url, {\n      headers: {\n        Authorization: `Bearer ${token}`,\n      },\n    });\n    let timeoutId: NodeJS.Timeout;\n\n    const resetTimeout = () => {\n      clearTimeout(timeoutId);\n      timeoutId = setTimeout(() => {\n        logger.log(\n          'We were unable to connect to the server at this time. This could be due to a temporary issue. Please try again in a moment.'\n        );\n        es.close();\n      }, CONN_TIMEOUT); // 5 minutes\n    };\n\n    es.onopen = resetTimeout;\n    es.onmessage = (event: Event) => {\n      resetTimeout();\n      const data = JSON.parse(event.data);\n\n      if (data.message) {\n        logger.log(data.message);\n      }\n\n      // Close connection when a specific event is received\n      if (data.event === 'deploymentFinished' || data.event === 'deploymentFailed') {\n        es.close();\n      }\n    };\n  };\n}\n","import EventSource from 'eventsource';\nimport { CLIContext, type CloudCliConfig } from '../types';\n\nconst buildLogsServiceFactory = ({ logger }: CLIContext) => {\n  return async (url: string, token: string, cliConfig: CloudCliConfig) => {\n    const CONN_TIMEOUT = Number(cliConfig.buildLogsConnectionTimeout);\n    const MAX_RETRIES = Number(cliConfig.buildLogsMaxRetries);\n\n    return new Promise((resolve, reject) => {\n      let timeoutId: NodeJS.Timeout | null = null;\n      let retries = 0;\n\n      const connect = (url: string) => {\n        const spinner = logger.spinner('Connecting to server to get build logs');\n        spinner.start();\n        const es = new EventSource(`${url}`, {\n          headers: {\n            Authorization: `Bearer ${token}`,\n          },\n        });\n\n        const clearExistingTimeout = () => {\n          if (timeoutId) {\n            clearTimeout(timeoutId);\n          }\n        };\n\n        const resetTimeout = () => {\n          clearExistingTimeout();\n          timeoutId = setTimeout(() => {\n            if (spinner.isSpinning) {\n              spinner.fail(\n                'We were unable to connect to the server to get build logs at this time. This could be due to a temporary issue.'\n              );\n            }\n            es.close();\n            reject(new Error('Connection timed out'));\n          }, CONN_TIMEOUT);\n        };\n\n        es.onopen = resetTimeout;\n\n        es.addEventListener('finished', (event) => {\n          const data = JSON.parse(event.data);\n          logger.log(data.msg);\n          es.close();\n          clearExistingTimeout();\n          resolve(null);\n        });\n\n        es.addEventListener('log', (event) => {\n          if (spinner.isSpinning) {\n            spinner.succeed();\n          }\n          resetTimeout();\n          const data = JSON.parse(event.data);\n          logger.log(data.msg);\n        });\n\n        es.onerror = async () => {\n          retries += 1;\n          if (retries > MAX_RETRIES) {\n            spinner.fail('We were unable to connect to the server to get build logs at this time.');\n            es.close();\n            clearExistingTimeout(); // Important to clear the event loop from remaining timeout - avoid to wait for nothing while the timeout is running\n            reject(new Error('Max retries reached'));\n          }\n        };\n      };\n\n      connect(url);\n    });\n  };\n};\n\nexport { buildLogsServiceFactory };\n","import fse from 'fs-extra';\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  GetProjectResponse,\n  ProjectInput,\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\nasync function upload(\n  ctx: CLIContext,\n  project: ProjectInput,\n  token: string,\n  maxProjectFileSize: number\n) {\n  const cloudApi = await cloudApiFactory(ctx, token);\n  // * Upload project\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 assertProjectSuspension(\n  ctx: CLIContext,\n  projectSuspendedAt: string | undefined,\n  projectPageURL: string\n): asserts projectSuspendedAt is undefined {\n  if (projectSuspendedAt) {\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(projectPageURL));\n    throw new Error('Project is suspended');\n  }\n}\n\nasync function getProjectData(\n  { ctx, cloudApiService }: { ctx: CLIContext; cloudApiService: CloudApiService },\n  projectInternalName: string\n): Promise<GetProjectResponse | null> {\n  try {\n    const { data } = await cloudApiService.getProject({ name: projectInternalName });\n    return data;\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 null;\n  }\n}\n\nexport default async (ctx: CLIContext) => {\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\n  if (!project) {\n    return;\n  }\n  const cloudApiService = await cloudApiFactory(ctx, token);\n  const projectResponse = await getProjectData({ ctx, cloudApiService }, project.name);\n\n  if (!projectResponse) {\n    return;\n  }\n  const { data: projectData, metadata: projectMetadata } = projectResponse;\n\n  try {\n    assertProjectSuspension(ctx, projectData.suspendedAt, projectMetadata.dashboardUrls.project);\n  } catch (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  const buildId = await upload(ctx, project, token, maxSize);\n\n  if (!buildId) {\n    return;\n  }\n\n  try {\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(chalk.underline(projectMetadata.dashboardUrls.deployments));\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","import chalk from 'chalk';\nimport { has } from 'lodash/fp';\n\n// TODO: Remove duplicated code by extracting to a shared package\n\nconst assertCwdContainsStrapiProject = (name: string) => {\n  const logErrorAndExit = () => {\n    console.log(\n      `You need to run ${chalk.yellow(\n        `strapi ${name}`\n      )} in a Strapi project. Make sure you are in the right directory.`\n    );\n    process.exit(1);\n  };\n\n  try {\n    // eslint-disable-next-line @typescript-eslint/no-var-requires\n    const pkgJSON = require(`${process.cwd()}/package.json`);\n    if (\n      !has('dependencies.@strapi/strapi', pkgJSON) &&\n      !has('devDependencies.@strapi/strapi', pkgJSON)\n    ) {\n      logErrorAndExit();\n    }\n  } catch (err) {\n    logErrorAndExit();\n  }\n};\n\nconst runAction =\n  (name: string, action: (...args: any[]) => Promise<unknown>) =>\n  (...args: unknown[]) => {\n    assertCwdContainsStrapiProject(name);\n\n    Promise.resolve()\n      .then(() => {\n        return action(...args);\n      })\n      .catch((error) => {\n        console.error(error);\n        process.exit(1);\n      });\n  };\n\nexport { runAction };\n","import { type StrapiCloudCommand } from '../types';\nimport { runAction } from '../utils/helpers';\nimport action from './action';\n\n/**\n * `$ deploy project to the cloud`\n */\nconst command: StrapiCloudCommand = ({ command, ctx }) => {\n  command\n    .command('cloud:deploy')\n    .alias('deploy')\n    .description('Deploy a Strapi Cloud project')\n    .option('-d, --debug', 'Enable debugging mode with verbose logs')\n    .option('-s, --silent', \"Don't log anything\")\n    .action(() => runAction('deploy', action)(ctx));\n};\n\nexport default command;\n","import action from './action';\nimport command from './command';\nimport type { StrapiCloudCommandInfo } from '../types';\n\nexport { action, command };\n\nexport default {\n  name: 'deploy-project',\n  description: 'Deploy a Strapi Cloud project',\n  action,\n  command,\n} as StrapiCloudCommandInfo;\n","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';\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 getExistingConfig(ctx: CLIContext) {\n  try {\n    return await local.retrieve();\n  } catch (e) {\n    ctx.logger.debug('Failed to get project config', e);\n    ctx.logger.error('An error occurred while retrieving config data from your local project.');\n    return null;\n  }\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 getExistingConfig(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(`Project ${chalk.cyan(answer.linkProject.displayName)} linked successfully.`);\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","import { type StrapiCloudCommand } from '../types';\nimport { runAction } from '../utils/helpers';\nimport action from './action';\n\n/**\n * `$ link local directory to project of the cloud`\n */\nconst command: StrapiCloudCommand = ({ command, ctx }) => {\n  command\n    .command('cloud:link')\n    .alias('link')\n    .description('Link a local directory to a Strapi Cloud project')\n    .option('-d, --debug', 'Enable debugging mode with verbose logs')\n    .option('-s, --silent', \"Don't log anything\")\n    .action(() => runAction('link', action)(ctx));\n};\n\nexport default command;\n","import action from './action';\nimport command from './command';\nimport type { StrapiCloudCommandInfo } from '../types';\n\nexport { action, command };\n\nexport default {\n  name: 'link-project',\n  description: 'Link a local directory to a Strapi Cloud project',\n  action,\n  command,\n} as StrapiCloudCommandInfo;\n","import type { StrapiCloudCommand } from '../types';\nimport { runAction } from '../utils/helpers';\nimport action from './action';\n\n/**\n * `$ cloud device flow login`\n */\nconst command: StrapiCloudCommand = ({ command, ctx }) => {\n  command\n    .command('cloud:login')\n    .alias('login')\n    .description('Strapi Cloud Login')\n    .addHelpText(\n      'after',\n      '\\nAfter running this command, you will be prompted to enter your authentication information.'\n    )\n    .option('-d, --debug', 'Enable debugging mode with verbose logs')\n    .option('-s, --silent', \"Don't log anything\")\n    .action(() => runAction('login', action)(ctx));\n};\n\nexport default command;\n","import action from './action';\nimport command from './command';\nimport type { StrapiCloudCommandInfo } from '../types';\n\nexport { action, command };\n\nexport default {\n  name: 'login',\n  description: 'Strapi Cloud Login',\n  action,\n  command,\n} as StrapiCloudCommandInfo;\n","import type { CLIContext } from '../types';\nimport { tokenServiceFactory, cloudApiFactory } from '../services';\nimport { trackEvent } from '../utils/analytics';\n\nconst openModule = import('open');\n\nexport default async (ctx: CLIContext) => {\n  const { logger } = ctx;\n  const { retrieveToken, eraseToken } = await tokenServiceFactory(ctx);\n\n  const token = await retrieveToken();\n  if (!token) {\n    logger.log(\"You're already logged out.\");\n    return;\n  }\n  const cloudApiService = await cloudApiFactory(ctx, token);\n  const config = await cloudApiService.config();\n  const cliConfig = config.data;\n\n  try {\n    await eraseToken();\n\n    openModule.then((open) => {\n      open\n        .default(\n          `${cliConfig.baseUrl}/oidc/logout?client_id=${encodeURIComponent(\n            cliConfig.clientId\n          )}&logout_hint=${encodeURIComponent(token)}\n          `\n        )\n        .catch((e: Error) => {\n          // Failing to open the logout URL is not a critical error, so we just log it\n          logger.debug(e.message, e);\n        });\n    });\n\n    logger.log(\n      '🔌 You have been logged out from the CLI. If you are on a shared computer, please make sure to log out from the Strapi Cloud Dashboard as well.'\n    );\n  } catch (e) {\n    logger.error('🥲 Oops! Something went wrong while logging you out. Please try again.');\n    logger.debug(e);\n  }\n  await trackEvent(ctx, cloudApiService, 'didLogout', { loginMethod: 'cli' });\n};\n","import type { StrapiCloudCommand } from '../types';\nimport { runAction } from '../utils/helpers';\nimport action from './action';\n\n/**\n * `$ cloud device flow logout`\n */\nconst command: StrapiCloudCommand = ({ command, ctx }) => {\n  command\n    .command('cloud:logout')\n    .alias('logout')\n    .description('Strapi Cloud Logout')\n    .option('-d, --debug', 'Enable debugging mode with verbose logs')\n    .option('-s, --silent', \"Don't log anything\")\n    .action(() => runAction('logout', action)(ctx));\n};\n\nexport default command;\n","import action from './action';\nimport command from './command';\n\nexport { action, command };\n\nexport default {\n  name: 'logout',\n  description: 'Strapi Cloud Logout',\n  action,\n  command,\n};\n","import { type StrapiCloudCommand } from '../types';\nimport { runAction } from '../utils/helpers';\nimport action from './action';\n\n/**\n * `$ create project in Strapi cloud`\n */\nconst command: StrapiCloudCommand = ({ command, ctx }) => {\n  command\n    .command('cloud:create-project')\n    .description('Create a Strapi Cloud project')\n    .option('-d, --debug', 'Enable debugging mode with verbose logs')\n    .option('-s, --silent', \"Don't log anything\")\n    .action(() => runAction('cloud:create-project', action)(ctx));\n};\n\nexport default command;\n","import action from './action';\nimport command from './command';\nimport type { StrapiCloudCommandInfo } from '../types';\n\nexport { action, command };\n\nexport default {\n  name: 'create-project',\n  description: 'Create a new project',\n  action,\n  command,\n} as StrapiCloudCommandInfo;\n","import type { CLIContext } from '../types';\nimport { cloudApiFactory, tokenServiceFactory } from '../services';\nimport { promptLogin } from '../login/action';\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  const spinner = logger.spinner('Fetching your projects...').start();\n\n  try {\n    const {\n      data: { data: projectList },\n    } = await cloudApiService.listProjects();\n    spinner.succeed();\n    logger.log(projectList);\n  } catch (e) {\n    ctx.logger.debug('Failed to list projects', e);\n    spinner.fail('An error occurred while fetching your projects from Strapi Cloud.');\n  }\n};\n","import { type StrapiCloudCommand } from '../types';\nimport { runAction } from '../utils/helpers';\nimport action from './action';\n\n/**\n * `$ list project from the cloud`\n */\nconst command: StrapiCloudCommand = ({ command, ctx }) => {\n  command\n    .command('cloud:projects')\n    .alias('projects')\n    .description('List Strapi Cloud projects')\n    .option('-d, --debug', 'Enable debugging mode with verbose logs')\n    .option('-s, --silent', \"Don't log anything\")\n    .action(() => runAction('projects', action)(ctx));\n};\n\nexport default command;\n","import action from './action';\nimport command from './command';\nimport type { StrapiCloudCommandInfo } from '../types';\n\nexport { action, command };\n\nexport default {\n  name: 'list-projects',\n  description: 'List Strapi Cloud projects',\n  action,\n  command,\n} as StrapiCloudCommandInfo;\n","import { Command } from 'commander';\nimport crypto from 'crypto';\nimport deployProject from './deploy-project';\nimport link from './link';\nimport login from './login';\nimport logout from './logout';\nimport createProject from './create-project';\nimport listProjects from './list-projects';\nimport { CLIContext } from './types';\nimport { getLocalConfig, saveLocalConfig } from './config/local';\n\nexport const cli = {\n  deployProject,\n  link,\n  login,\n  logout,\n  createProject,\n  listProjects,\n};\n\nconst cloudCommands = [deployProject, link, login, logout, listProjects];\n\nasync function initCloudCLIConfig() {\n  const localConfig = await getLocalConfig();\n\n  if (!localConfig.deviceId) {\n    localConfig.deviceId = crypto.randomUUID();\n  }\n\n  await saveLocalConfig(localConfig);\n}\n\nexport async function buildStrapiCloudCommands({\n  command,\n  ctx,\n  argv,\n}: {\n  command: Command;\n  ctx: CLIContext;\n  argv: string[];\n}) {\n  await initCloudCLIConfig();\n  // Load all commands\n  for (const cloudCommand of cloudCommands) {\n    try {\n      // Add this command to the Commander command object\n      await cloudCommand.command({ command, ctx, argv });\n    } catch (e) {\n      console.error(`Failed to load command ${cloudCommand.name}`, e);\n    }\n  }\n}\n\nexport * as services from './services';\n\nexport * from './types';\n"],"names":["fse","path","name","loginAction","value","packageJson","openModule","cliConfig","choice","createProject","local.save","url","local.retrieve","createProjectAction","action","command","crypto"],"mappings":"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"}