{"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/utils/get-local-config.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/environment/list/action.ts","../src/cloud/command.ts","../src/environment/command.ts","../src/environment/list/command.ts","../src/environment/list/index.ts","../src/environment/link/action.ts","../src/environment/link/command.ts","../src/environment/link/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 ProjectInfo = {\n  id: string;\n  name: string;\n  targetEnvironment?: string;\n  displayName?: string;\n  nodeVersion?: string;\n  region?: string;\n  plan?: string;\n  url?: string;\n};\n\nexport type EnvironmentInfo = Record<string, unknown>;\n\nexport type EnvironmentDetails = {\n  name: string;\n  hasLiveDeployment: boolean;\n  hasPendingDeployment: boolean;\n};\n\nexport type ProjectInput = Omit<ProjectInfo, '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 ListEnvironmentsResponse = {\n  data: {\n    data: EnvironmentInfo[] | Record<string, never>;\n  };\n};\n\nexport type ListLinkProjectsResponse = {\n  data: {\n    data: ProjectInfo[] | Record<string, never>;\n  };\n};\n\nexport type ListLinkEnvironmentsResponse = {\n  data: {\n    data: EnvironmentDetails[] | Record<string, never>;\n  };\n};\n\nexport type GetProjectResponse = {\n  data: {\n    displayName: string;\n    updatedAt: string;\n    suspendedAt?: string;\n    isTrial: boolean;\n    environments: string[];\n    environmentsDetails: EnvironmentDetails[];\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; targetEnvironment?: 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  listEnvironments(project: { name: string }): Promise<AxiosResponse<ListEnvironmentsResponse>>;\n\n  listLinkEnvironments(project: {\n    name: string;\n  }): Promise<AxiosResponse<ListLinkEnvironmentsResponse>>;\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), targetEnvironment: project.targetEnvironment },\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 listEnvironments({ name }): Promise<AxiosResponse<ListEnvironmentsResponse>> {\n      try {\n        const response = await axiosCloudAPI.get(`/projects/${name}/environments`);\n\n        if (response.status !== 200) {\n          throw new Error('Error fetching cloud environments from the server.');\n        }\n\n        return response;\n      } catch (error) {\n        logger.debug(\n          \"🥲 Oops! Couldn't retrieve your project's environments from the server. Please try again.\"\n        );\n        throw error;\n      }\n    },\n\n    async listLinkEnvironments({ name }): Promise<AxiosResponse<ListLinkEnvironmentsResponse>> {\n      try {\n        const response = await axiosCloudAPI.get(`/projects/${name}/environments-linkable`);\n\n        if (response.status !== 200) {\n          throw new Error('Error fetching cloud environments from the server.');\n        }\n\n        return response;\n      } catch (error) {\n        logger.debug(\n          \"🥲 Oops! Couldn't retrieve your project's environments 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 { merge } from 'lodash';\nimport type { ProjectInfo } from './cli-api';\n\nexport const LOCAL_SAVE_FILENAME = '.strapi-cloud.json';\n\nexport type LocalSave = {\n  project?: Omit<ProjectInfo, 'id'>;\n};\n\n// Utility type for making all properties optional recursively\ntype DeepPartial<T> = {\n  [P in keyof T]?: T[P] extends object ? DeepPartial<T[P]> : T[P];\n};\n\nexport type LocalPatch = {\n  project?: DeepPartial<Omit<ProjectInfo, 'id'>>;\n};\n\nconst getFilePath = (directoryPath?: string): string =>\n  path.join(directoryPath || process.cwd(), LOCAL_SAVE_FILENAME);\n\nexport async function save(data: LocalSave, { directoryPath }: { directoryPath?: string } = {}) {\n  const pathToFile = getFilePath(directoryPath);\n  // Ensure the directory exists and creates it if not\n  await fse.ensureDir(path.dirname(pathToFile));\n  await fse.writeJson(pathToFile, data, { encoding: 'utf8' });\n}\n\nexport async function retrieve({\n  directoryPath,\n}: { directoryPath?: string } = {}): Promise<LocalSave> {\n  const pathToFile = getFilePath(directoryPath);\n  const pathExists = await fse.pathExists(pathToFile);\n  if (!pathExists) {\n    return {};\n  }\n  return fse.readJSON(pathToFile, { encoding: 'utf8' });\n}\n\nexport async function patch(\n  patchData: LocalPatch,\n  { directoryPath }: { directoryPath?: string } = {}\n) {\n  const pathToFile = getFilePath(directoryPath);\n  const existingData = await retrieve({ directoryPath });\n  if (!existingData) {\n    throw new Error('No configuration data found to patch.');\n  }\n  const newData = merge(existingData, patchData);\n  await fse.writeJson(pathToFile, newData, { encoding: 'utf8' });\n}\n\nexport async function deleteConfig({ directoryPath }: { directoryPath?: string } = {}) {\n  const pathToFile = getFilePath(directoryPath);\n  const pathExists = await fse.pathExists(pathToFile);\n  if (pathExists) {\n    await fse.remove(pathToFile);\n  }\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(\n              (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              },\n              {} as Record<string, yup.SchemaOf<string> | yup.SchemaOf<Export>>\n            )\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, 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","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 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","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 { createCommand } from 'commander';\nimport { 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 = ({ ctx }) => {\n  return createCommand('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    .option('-f, --force', 'Skip confirmation to deploy')\n    .option('-e, --env <name>', 'Specify the environment to deploy')\n    .action((opts) => runAction('deploy', action)(ctx, opts));\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 chalk from 'chalk';\nimport type { CLIContext } from '../types';\nimport { local } from '../services';\nimport { LocalSave } from '../services/strapi-info-save';\n\nasync function getLocalConfig(ctx: CLIContext): Promise<LocalSave | null> {\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 getLocalProject(ctx: CLIContext) {\n  const localConfig = await getLocalConfig(ctx);\n\n  if (!localConfig || !localConfig.project) {\n    ctx.logger.warn(\n      `\\nWe couldn't find a valid local project config.\\nPlease link your local project to an existing Strapi Cloud project using the ${chalk.cyan(\n        'link'\n      )} command.`\n    );\n    process.exit(1);\n  }\n  return localConfig.project;\n}\n\nexport { getLocalConfig, getLocalProject };\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';\nimport { getLocalConfig } from '../utils/get-local-config';\n\nconst QUIT_OPTION = 'Quit';\n\ninterface LinkProjectValue {\n  name: string;\n  displayName: string;\n}\n\ninterface LinkProjectAnswer extends Answers {\n  linkProject: LinkProjectValue;\n}\n\ninterface LinkProjectInput extends Answers {\n  linkProject: LinkProjectValue | string;\n}\n\ntype ProjectsList = {\n  name: string;\n  value: {\n    name: string;\n    displayName: string;\n  };\n}[];\n\ntype Project = {\n  name: string;\n  displayName: string;\n  isMaintainer: boolean;\n};\n\nasync function promptForRelink(\n  ctx: CLIContext,\n  cloudApiService: CloudApiService,\n  existingConfig: LocalSave | null\n) {\n  if (existingConfig && existingConfig.project) {\n    const { shouldRelink } = await inquirer.prompt([\n      {\n        type: 'confirm',\n        name: 'shouldRelink',\n        message: `A project named ${chalk.cyan(\n          existingConfig.project.displayName\n            ? existingConfig.project.displayName\n            : existingConfig.project.name\n        )} is already linked to this local folder. Do you want to update the link?`,\n        default: false,\n      },\n    ]);\n\n    if (!shouldRelink) {\n      await trackEvent(ctx, cloudApiService, 'didNotLinkProject', {\n        currentProjectName: existingConfig.project?.name,\n      });\n      return false;\n    }\n  }\n\n  return true;\n}\n\nasync function getProjectsList(\n  ctx: CLIContext,\n  cloudApiService: CloudApiService,\n  existingConfig: LocalSave | null\n) {\n  const spinner = ctx.logger.spinner('Fetching your projects...\\n').start();\n\n  try {\n    const {\n      data: { data: projectList },\n    } = await cloudApiService.listLinkProjects();\n    spinner.succeed();\n\n    if (!Array.isArray(projectList)) {\n      ctx.logger.log(\"We couldn't find any projects available for linking in Strapi Cloud.\");\n      return null;\n    }\n    const projects: ProjectsList = (projectList as unknown as Project[])\n      .filter(\n        (project: Project) =>\n          !(project.isMaintainer || project.name === existingConfig?.project?.name)\n      )\n      .map((project: Project) => {\n        return {\n          name: project.displayName,\n          value: { name: project.name, displayName: project.displayName },\n        };\n      });\n    if (projects.length === 0) {\n      ctx.logger.log(\"We couldn't find any projects available for linking in Strapi Cloud.\");\n      return null;\n    }\n    return projects;\n  } catch (e) {\n    spinner.fail('An error occurred while fetching your projects from Strapi Cloud.');\n    ctx.logger.debug('Failed to list projects', e);\n    return null;\n  }\n}\n\nasync function getUserSelection(\n  ctx: CLIContext,\n  projects: ProjectsList\n): Promise<LinkProjectAnswer | null> {\n  const { logger } = ctx;\n  try {\n    const answer: LinkProjectInput = await inquirer.prompt([\n      {\n        type: 'list',\n        name: 'linkProject',\n        message: 'Which project do you want to link?',\n        choices: [...projects, { name: chalk.grey(`(${QUIT_OPTION})`), value: null }],\n      },\n    ]);\n\n    if (!answer.linkProject) {\n      return null;\n    }\n\n    return answer as LinkProjectAnswer;\n  } catch (e) {\n    logger.debug('Failed to get user input', e);\n    logger.error('An error occurred while trying to get your input.');\n    return null;\n  }\n}\n\nexport default async (ctx: CLIContext) => {\n  const { getValidToken } = await tokenServiceFactory(ctx);\n  const token = await getValidToken(ctx, promptLogin);\n  const { logger } = ctx;\n\n  if (!token) {\n    return;\n  }\n\n  const cloudApiService = await cloudApiFactory(ctx, token);\n\n  const existingConfig: LocalSave | null = await getLocalConfig(ctx);\n  const shouldRelink = await promptForRelink(ctx, cloudApiService, existingConfig);\n\n  if (!shouldRelink) {\n    return;\n  }\n  await trackEvent(ctx, cloudApiService, 'willLinkProject', {});\n\n  const projects: ProjectsList | null | undefined = await getProjectsList(\n    ctx,\n    cloudApiService,\n    existingConfig\n  );\n\n  if (!projects) {\n    return;\n  }\n\n  const answer: LinkProjectAnswer | null = await getUserSelection(ctx, projects);\n\n  if (!answer) {\n    return;\n  }\n\n  try {\n    const { confirmAction } = await inquirer.prompt([\n      {\n        type: 'confirm',\n        name: 'confirmAction',\n        message:\n          'Warning: Once linked, deploying from CLI will replace the existing project and its data. Confirm to proceed:',\n        default: false,\n      },\n    ]);\n\n    if (!confirmAction) {\n      await trackEvent(ctx, cloudApiService, 'didNotLinkProject', {\n        cancelledProjectName: answer.linkProject.name,\n        currentProjectName: existingConfig ? existingConfig.project?.name : null,\n      });\n      return;\n    }\n\n    await local.save({ project: answer.linkProject });\n    logger.log(\n      ` You have successfully linked your project to ${chalk.cyan(answer.linkProject.displayName)}. You are now able to deploy your project.`\n    );\n    await trackEvent(ctx, cloudApiService, 'didLinkProject', {\n      projectInternalName: answer.linkProject,\n    });\n  } catch (e) {\n    logger.debug('Failed to link project', e);\n    logger.error('An error occurred while linking the project.');\n    await trackEvent(ctx, cloudApiService, 'didNotLinkProject', {\n      projectInternalName: answer.linkProject,\n    });\n  }\n};\n","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 { createCommand } from 'commander';\nimport type { StrapiCloudCommand } from '../types';\nimport { runAction } from '../utils/helpers';\nimport action from './action';\n\n/**\n * `$ cloud device flow login`\n */\nconst command: StrapiCloudCommand = ({ ctx }) => {\n  return createCommand('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 { createCommand } from 'commander';\nimport type { StrapiCloudCommand } from '../types';\nimport { runAction } from '../utils/helpers';\nimport action from './action';\n\n/**\n * `$ cloud device flow logout`\n */\nconst command: StrapiCloudCommand = ({ ctx }) => {\n  return createCommand('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 { createCommand } from 'commander';\nimport { 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 = ({ ctx }) => {\n  return createCommand('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 chalk from 'chalk';\nimport type { CLIContext } from '../../types';\nimport { cloudApiFactory, tokenServiceFactory } from '../../services';\nimport { promptLogin } from '../../login/action';\nimport { trackEvent } from '../../utils/analytics';\nimport { getLocalProject } from '../../utils/get-local-config';\n\nexport default async (ctx: CLIContext) => {\n  const { getValidToken } = await tokenServiceFactory(ctx);\n  const token = await getValidToken(ctx, promptLogin);\n  const { logger } = ctx;\n\n  if (!token) {\n    return;\n  }\n\n  const project = await getLocalProject(ctx);\n  if (!project) {\n    ctx.logger.debug(`No valid local project configuration was found.`);\n    return;\n  }\n\n  const cloudApiService = await cloudApiFactory(ctx, token);\n  const spinner = logger.spinner('Fetching environments...').start();\n  await trackEvent(ctx, cloudApiService, 'willListEnvironment', {\n    projectInternalName: project.name,\n  });\n\n  try {\n    const {\n      data: { data: environmentsList },\n    } = await cloudApiService.listEnvironments({ name: project.name });\n    spinner.succeed();\n    logger.log(environmentsList);\n    await trackEvent(ctx, cloudApiService, 'didListEnvironment', {\n      projectInternalName: project.name,\n    });\n  } catch (e: any) {\n    if (e.response && e.response.status === 404) {\n      spinner.succeed();\n      logger.warn(\n        `\\nThe project associated with this folder does not exist in Strapi Cloud. \\nPlease link your local project to an existing Strapi Cloud project using the ${chalk.cyan(\n          'link'\n        )} command`\n      );\n    } else {\n      spinner.fail('An error occurred while fetching environments data from Strapi Cloud.');\n      logger.debug('Failed to list environments', e);\n    }\n    await trackEvent(ctx, cloudApiService, 'didNotListEnvironment', {\n      projectInternalName: project.name,\n    });\n  }\n};\n","import { Command } from 'commander';\nimport { runAction } from '../utils/helpers';\nimport listAction from '../environment/list/action';\n\nexport function defineCloudNamespace(command: Command, ctx: unknown): Command {\n  const cloud = command.command('cloud').description('Manage Strapi Cloud projects');\n\n  // Define cloud namespace aliases:\n  cloud\n    .command('environments')\n    .description('Alias for cloud environment list')\n    .action(() => runAction('list', listAction)(ctx));\n  return cloud;\n}\n","import { Command } from 'commander';\nimport { defineCloudNamespace } from '../cloud/command';\n\nlet environmentCmd: Command | null = null;\n\nexport const initializeEnvironmentCommand = (command: Command, ctx: unknown): Command => {\n  if (!environmentCmd) {\n    const cloud = defineCloudNamespace(command, ctx);\n    environmentCmd = cloud.command('environment').description('Manage environments');\n  }\n  return environmentCmd;\n};\n","import { type StrapiCloudCommand } from '../../types';\nimport { runAction } from '../../utils/helpers';\nimport action from './action';\nimport { initializeEnvironmentCommand } from '../command';\n\nconst command: StrapiCloudCommand = ({ command, ctx }) => {\n  const environmentCmd = initializeEnvironmentCommand(command, ctx);\n\n  environmentCmd\n    .command('list')\n    .description('List Strapi Cloud project environments')\n    .option('-d, --debug', 'Enable debugging mode with verbose logs')\n    .option('-s, --silent', \"Don't log anything\")\n    .action(() => runAction('list', 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-environments',\n  description: 'List Strapi Cloud environments',\n  action,\n  command,\n} as StrapiCloudCommandInfo;\n","import chalk from 'chalk';\nimport inquirer, { type Answers } from 'inquirer';\nimport { EnvironmentDetails, ProjectInput } from '../../services/cli-api';\nimport type { CLIContext, CloudApiService } from '../../types';\nimport { cloudApiFactory, tokenServiceFactory, local } from '../../services';\nimport { promptLogin } from '../../login/action';\nimport { trackEvent } from '../../utils/analytics';\nimport { getLocalProject } from '../../utils/get-local-config';\n\nconst QUIT_OPTION = 'Quit';\n\ninterface LinkEnvironmentAnswer extends Answers {\n  targetEnvironment: string;\n}\n\ninterface LinkEnvironmentInput extends Answers {\n  targetEnvironment: string;\n}\n\ntype EnvironmentsList = EnvironmentDetails[];\n\nexport default async (ctx: CLIContext) => {\n  const { getValidToken } = await tokenServiceFactory(ctx);\n  const token = await getValidToken(ctx, promptLogin);\n  const { logger } = ctx;\n\n  if (!token) {\n    return;\n  }\n\n  const project = await getLocalProject(ctx);\n\n  if (!project) {\n    logger.debug(`No valid local project configuration was found.`);\n    return;\n  }\n\n  const cloudApiService = await cloudApiFactory(ctx, token);\n  const environments = await getEnvironmentsList(ctx, cloudApiService, project);\n\n  if (!environments) {\n    logger.debug(`Fetching environments failed.`);\n    return;\n  }\n\n  if (environments.length === 0) {\n    logger.log(\n      `The only available environment is already linked. You can add a new one from your project settings on the Strapi Cloud dashboard.`\n    );\n    return;\n  }\n\n  const answer: LinkEnvironmentAnswer | null = await promptUserForEnvironment(ctx, environments);\n\n  if (!answer) {\n    return;\n  }\n\n  await trackEvent(ctx, cloudApiService, 'willLinkEnvironment', {\n    projectName: project.name,\n    environmentName: answer.targetEnvironment,\n  });\n\n  try {\n    await local.patch({ project: { targetEnvironment: answer.targetEnvironment } });\n  } catch (e) {\n    await trackEvent(ctx, cloudApiService, 'didNotLinkEnvironment', {\n      projectName: project.name,\n      environmentName: answer.targetEnvironment,\n    });\n    logger.debug('Failed to link environment', e);\n    logger.error(\n      'Failed to link the environment. If this issue persists, try re-linking your project or contact support.'\n    );\n    process.exit(1);\n  }\n\n  logger.log(\n    ` You have successfully linked your project to ${chalk.cyan(answer.targetEnvironment)}, on ${chalk.cyan(project.displayName)}. You are now able to deploy your project.`\n  );\n  await trackEvent(ctx, cloudApiService, 'didLinkEnvironment', {\n    projectName: project.name,\n    environmentName: answer.targetEnvironment,\n  });\n};\n\nasync function promptUserForEnvironment(\n  ctx: CLIContext,\n  environments: EnvironmentsList\n): Promise<LinkEnvironmentAnswer | null> {\n  const { logger } = ctx;\n\n  try {\n    const answer: LinkEnvironmentInput = await inquirer.prompt([\n      {\n        type: 'list',\n        name: 'targetEnvironment',\n        message: 'Which environment do you want to link?',\n        choices: [...environments, { name: chalk.grey(`(${QUIT_OPTION})`), value: null }],\n      },\n    ]);\n\n    if (!answer.targetEnvironment) {\n      return null;\n    }\n\n    return answer;\n  } catch (e) {\n    logger.debug('Failed to get user input', e);\n    logger.error('An error occurred while trying to get your environment selection.');\n    return null;\n  }\n}\n\nasync function getEnvironmentsList(\n  ctx: CLIContext,\n  cloudApiService: CloudApiService,\n  project: ProjectInput\n) {\n  const spinner = ctx.logger.spinner('Fetching environments...\\n').start();\n\n  try {\n    const {\n      data: { data: environmentsList },\n    } = await cloudApiService.listLinkEnvironments({ name: project.name });\n\n    if (!Array.isArray(environmentsList) || environmentsList.length === 0) {\n      throw new Error('Environments not found in server response');\n    }\n    spinner.succeed();\n    return environmentsList.filter(\n      (environment: EnvironmentDetails) => environment.name !== project.targetEnvironment\n    );\n  } catch (e: any) {\n    if (e.response && e.response.status === 404) {\n      spinner.succeed();\n      ctx.logger.warn(\n        `\\nThe project associated with this folder does not exist in Strapi Cloud. \\nPlease link your local project to an existing Strapi Cloud project using the ${chalk.cyan(\n          'link'\n        )} command.`\n      );\n    } else {\n      spinner.fail('An error occurred while fetching environments data from Strapi Cloud.');\n      ctx.logger.debug('Failed to list environments', e);\n    }\n  }\n}\n","import { type StrapiCloudCommand } from '../../types';\nimport { runAction } from '../../utils/helpers';\nimport action from './action';\nimport { initializeEnvironmentCommand } from '../command';\n\nconst command: StrapiCloudCommand = ({ command, ctx }) => {\n  const environmentCmd = initializeEnvironmentCommand(command, ctx);\n\n  environmentCmd\n    .command('link')\n    .description('Link project to a specific Strapi Cloud project environment')\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-environment',\n  description: 'Link Strapi Cloud environment to a local project',\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 listEnvironments from './environment/list';\nimport linkEnvironment from './environment/link';\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  linkEnvironment,\n  listProjects,\n  listEnvironments,\n};\n\nconst cloudCommands = [\n  deployProject,\n  link,\n  login,\n  logout,\n  linkEnvironment,\n  listProjects,\n  listEnvironments,\n];\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      const subCommand = await cloudCommand.command({ command, ctx, argv });\n\n      if (subCommand) {\n        command.addCommand(subCommand);\n      }\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","getLocalConfig","name","loginAction","value","packageJson","openModule","cliConfig","choice","createProject","local.save","url","QUIT_OPTION","env","local.retrieve","createProjectAction","action","command","listAction","environmentCmd","local.patch","crypto"],"mappings":"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"}