{"version":3,"file":"action.mjs","sources":["../../src/login/action.ts"],"sourcesContent":["import axios, { AxiosResponse, AxiosError } from 'axios';\nimport chalk from 'chalk';\nimport { tokenServiceFactory, cloudApiFactory } from '../services';\nimport type { CloudCliConfig, CLIContext } from '../types';\nimport { apiConfig } from '../config/api';\nimport { trackEvent } from '../utils/analytics';\nimport { setContext } from '../services/context';\n\nconst openModule = import('open');\n\nexport async function promptLogin(ctx: CLIContext) {\n  const { default: inquirer } = await import('inquirer');\n  const response = await inquirer.prompt([\n    {\n      type: 'confirm',\n      name: 'login',\n      message: 'Would you like to login?',\n    },\n  ]);\n\n  if (response.login) {\n    const loginSuccessful = await loginAction(ctx);\n    return loginSuccessful;\n  }\n  return false;\n}\n\nexport default async function loginAction(\n  ctx: CLIContext,\n  { showDashboardLink = true }: { showDashboardLink?: boolean } = {}\n): Promise<boolean> {\n  const { logger, promptExperiment } = ctx;\n  const tokenService = await tokenServiceFactory(ctx);\n  const existingToken = await tokenService.retrieveToken();\n  const cloudApiService = await cloudApiFactory(ctx, existingToken || undefined);\n\n  if (existingToken) {\n    const isTokenValid = await tokenService.isTokenValid(existingToken);\n    if (isTokenValid) {\n      try {\n        const userInfo = await cloudApiService.getUserInfo();\n        const { email } = userInfo.data.data;\n        setContext({ ...ctx, user: userInfo.data.data });\n        if (email) {\n          logger.log(`You are already logged into your account (${email}).`);\n        } else {\n          logger.log('You are already logged in.');\n        }\n        if (showDashboardLink) {\n          logger.log(\n            'To access your dashboard, please copy and paste the following URL into your web browser:'\n          );\n          logger.log(chalk.underline(`${apiConfig.dashboardBaseUrl}/projects`));\n        }\n        return true;\n      } catch (e) {\n        logger.debug('Failed to fetch user info', e);\n      }\n    }\n  }\n\n  let cliConfig: CloudCliConfig;\n  try {\n    logger.info('🔌 Connecting...');\n    const config = await cloudApiService.config();\n    cliConfig = config.data;\n  } catch (e: unknown) {\n    logger.error('🥲 Oops! Something went wrong while logging you in. Please try again.');\n    logger.debug(e);\n    return false;\n  }\n  await trackEvent(ctx, cloudApiService, 'willLoginAttempt', {\n    ...(promptExperiment && { promptExperiment }),\n  });\n\n  logger.debug('🔐 Creating device authentication request...', {\n    client_id: cliConfig.clientId,\n    scope: cliConfig.scope,\n    audience: cliConfig.audience,\n  });\n  const deviceAuthResponse = (await axios\n    .post(cliConfig.deviceCodeAuthUrl, {\n      client_id: cliConfig.clientId,\n      scope: cliConfig.scope,\n      audience: cliConfig.audience,\n    })\n    .catch((e: AxiosError) => {\n      logger.error('There was an issue with the authentication process. Please try again.');\n      if (e.message) {\n        logger.debug(e.message, e);\n      } else {\n        logger.debug(e);\n      }\n    })) as AxiosResponse;\n\n  openModule.then((open) => {\n    open.default(deviceAuthResponse.data.verification_uri_complete).catch((e: Error) => {\n      logger.error('We encountered an issue opening the browser. Please try again later.');\n      logger.debug(e.message, e);\n    });\n  });\n\n  logger.log('If a browser tab does not open automatically, please follow the next steps:');\n  logger.log(\n    `1. Open this url in your device: ${deviceAuthResponse.data.verification_uri_complete}`\n  );\n  logger.log(\n    `2. Enter the following code: ${deviceAuthResponse.data.user_code} and confirm to login.\\n`\n  );\n\n  const tokenPayload = {\n    grant_type: 'urn:ietf:params:oauth:grant-type:device_code',\n    device_code: deviceAuthResponse.data.device_code,\n    client_id: cliConfig.clientId,\n  };\n\n  let isAuthenticated = false;\n\n  const authenticate = async () => {\n    const spinner = logger.spinner('Waiting for authentication');\n    spinner.start();\n    const spinnerFail = () => spinner.fail('Authentication failed!');\n\n    while (!isAuthenticated) {\n      try {\n        const tokenResponse = await axios.post(cliConfig.tokenUrl, tokenPayload);\n        const authTokenData = tokenResponse.data;\n\n        if (tokenResponse.status === 200) {\n          // Token validation\n          try {\n            logger.debug('🔐 Validating token...');\n            await tokenService.validateToken(authTokenData.id_token, cliConfig.jwksUrl);\n            logger.debug('🔐 Token validation successful!');\n          } catch (e: any) {\n            logger.debug(e);\n            spinnerFail();\n            throw new Error('Unable to proceed: Token validation failed');\n          }\n\n          logger.debug('🔍 Fetching user information...');\n          const cloudApiServiceWithToken = await cloudApiFactory(ctx, authTokenData.access_token);\n          // Call to get user info to create the user in DB if not exists\n          await cloudApiServiceWithToken.getUserInfo();\n          logger.debug('🔍 User information fetched successfully!');\n\n          try {\n            logger.debug('📝 Saving login information...');\n            await tokenService.saveToken(authTokenData.access_token);\n            logger.debug('📝 Login information saved successfully!');\n            isAuthenticated = true;\n          } catch (e) {\n            logger.error(\n              'There was a problem saving your login information. Please try logging in again.'\n            );\n            logger.debug(e);\n            spinnerFail();\n            return false;\n          }\n        }\n      } catch (e: any) {\n        if (e.message === 'Unable to proceed: Token validation failed') {\n          logger.error(\n            'There seems to be a problem with your login information. Please try logging in again.'\n          );\n          spinnerFail();\n          await trackEvent(ctx, cloudApiService, 'didNotLogin', {\n            loginMethod: 'cli',\n            ...(promptExperiment && { promptExperiment }),\n          });\n          return false;\n        }\n        if (\n          e.response?.data.error &&\n          !['authorization_pending', 'slow_down'].includes(e!.response.data.error)\n        ) {\n          logger.debug(e);\n          spinnerFail();\n          await trackEvent(ctx, cloudApiService, 'didNotLogin', {\n            loginMethod: 'cli',\n            ...(promptExperiment && { promptExperiment }),\n          });\n          return false;\n        }\n        // Await interval before retrying\n        await new Promise((resolve) => {\n          setTimeout(resolve, deviceAuthResponse.data.interval * 1000);\n        });\n      }\n    }\n    spinner.succeed('Authentication successful!');\n    if (showDashboardLink) {\n      logger.log('You are now logged into Strapi Cloud.');\n      logger.log(\n        'To access your dashboard, please copy and paste the following URL into your web browser:'\n      );\n      logger.log(chalk.underline(`${apiConfig.dashboardBaseUrl}/projects`));\n    }\n    await trackEvent(ctx, cloudApiService, 'didLogin', {\n      loginMethod: 'cli',\n      ...(promptExperiment && { promptExperiment }),\n    });\n  };\n\n  await authenticate();\n  return isAuthenticated;\n}\n"],"names":["openModule","promptLogin","ctx","default","inquirer","response","prompt","type","name","message","login","loginSuccessful","loginAction","showDashboardLink","logger","promptExperiment","tokenService","tokenServiceFactory","existingToken","retrieveToken","cloudApiService","cloudApiFactory","undefined","isTokenValid","userInfo","getUserInfo","email","data","setContext","user","log","chalk","underline","apiConfig","dashboardBaseUrl","e","debug","cliConfig","info","config","error","trackEvent","client_id","clientId","scope","audience","deviceAuthResponse","axios","post","deviceCodeAuthUrl","catch","then","open","verification_uri_complete","user_code","tokenPayload","grant_type","device_code","isAuthenticated","authenticate","spinner","start","spinnerFail","fail","tokenResponse","tokenUrl","authTokenData","status","validateToken","id_token","jwksUrl","Error","cloudApiServiceWithToken","access_token","saveToken","loginMethod","includes","Promise","resolve","setTimeout","interval","succeed"],"mappings":"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"}