@strapi/cloud-cli 0.0.0-experimental.3b8cc96a7394e7143a734079f23163e4316d01f5 → 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +1 -1
- package/package.json +8 -54
- package/bin/index.js +0 -7
- package/dist/bin.d.ts +0 -5
- package/dist/bin.d.ts.map +0 -1
- package/dist/bin.js +0 -172
- package/dist/bin.js.map +0 -1
- package/dist/config/api.d.ts +0 -4
- package/dist/config/api.d.ts.map +0 -1
- package/dist/config/local.d.ts +0 -8
- package/dist/config/local.d.ts.map +0 -1
- package/dist/create-project/action.d.ts +0 -4
- package/dist/create-project/action.d.ts.map +0 -1
- package/dist/create-project/index.d.ts +0 -9
- package/dist/create-project/index.d.ts.map +0 -1
- package/dist/deploy-project/action.d.ts +0 -4
- package/dist/deploy-project/action.d.ts.map +0 -1
- package/dist/deploy-project/command.d.ts +0 -7
- package/dist/deploy-project/command.d.ts.map +0 -1
- package/dist/deploy-project/index.d.ts +0 -11
- package/dist/deploy-project/index.d.ts.map +0 -1
- package/dist/index.d.ts +0 -13
- package/dist/index.d.ts.map +0 -1
- package/dist/index.js +0 -1004
- package/dist/index.js.map +0 -1
- package/dist/index.mjs +0 -948
- package/dist/index.mjs.map +0 -1
- package/dist/login/action.d.ts +0 -4
- package/dist/login/action.d.ts.map +0 -1
- package/dist/login/command.d.ts +0 -7
- package/dist/login/command.d.ts.map +0 -1
- package/dist/login/index.d.ts +0 -11
- package/dist/login/index.d.ts.map +0 -1
- package/dist/logout/action.d.ts +0 -4
- package/dist/logout/action.d.ts.map +0 -1
- package/dist/logout/command.d.ts +0 -7
- package/dist/logout/command.d.ts.map +0 -1
- package/dist/logout/index.d.ts +0 -11
- package/dist/logout/index.d.ts.map +0 -1
- package/dist/services/build-logs.d.ts +0 -4
- package/dist/services/build-logs.d.ts.map +0 -1
- package/dist/services/cli-api.d.ts +0 -37
- package/dist/services/cli-api.d.ts.map +0 -1
- package/dist/services/index.d.ts +0 -5
- package/dist/services/index.d.ts.map +0 -1
- package/dist/services/logger.d.ts +0 -22
- package/dist/services/logger.d.ts.map +0 -1
- package/dist/services/notification.d.ts +0 -3
- package/dist/services/notification.d.ts.map +0 -1
- package/dist/services/strapi-info-save.d.ts +0 -15
- package/dist/services/strapi-info-save.d.ts.map +0 -1
- package/dist/services/token.d.ts +0 -12
- package/dist/services/token.d.ts.map +0 -1
- package/dist/types.d.ts +0 -33
- package/dist/types.d.ts.map +0 -1
- package/dist/utils/compress-files.d.ts +0 -4
- package/dist/utils/compress-files.d.ts.map +0 -1
- package/dist/utils/helpers.d.ts +0 -3
- package/dist/utils/helpers.d.ts.map +0 -1
- package/dist/utils/pkg.d.ts +0 -121
- package/dist/utils/pkg.d.ts.map +0 -1
- package/dist/utils/tests/compress-files.test.d.ts +0 -2
- package/dist/utils/tests/compress-files.test.d.ts.map +0 -1
package/dist/index.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../src/config/api.ts","../src/utils/compress-files.ts","../src/services/cli-api.ts","../src/services/strapi-info-save.ts","../src/config/local.ts","../src/services/token.ts","../src/services/logger.ts","../src/create-project/action.ts","../src/services/notification.ts","../src/utils/pkg.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/login/action.ts","../src/login/command.ts","../src/login/index.ts","../src/logout/action.ts","../src/logout/command.ts","../src/logout/index.ts","../src/create-project/index.ts","../src/index.ts"],"sourcesContent":["import { env } from '@strapi/utils';\n\nexport const apiConfig = {\n apiBaseUrl: env('STRAPI_CLI_CLOUD_API', 'https://cli.cloud.strapi.io'),\n};\n","import * as fs from 'fs';\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 getFiles = (\n dirPath: string,\n ignorePatterns: string[] = [],\n arrayOfFiles: string[] = [],\n subfolder: string = '',\n): string[] => {\n const entries = fs.readdirSync(path.join(dirPath, subfolder));\n entries.forEach((entry) => {\n const entryPathFromRoot = path.join(subfolder, entry);\n const entryPath = path.relative(dirPath, entryPathFromRoot);\n const isIgnored = isIgnoredFile(dirPath, entryPathFromRoot, ignorePatterns);\n if (isIgnored) {\n return;\n }\n if (fs.statSync(entryPath).isDirectory()) {\n getFiles(dirPath, ignorePatterns, arrayOfFiles, entryPathFromRoot);\n } else {\n arrayOfFiles.push(entryPath);\n }\n });\n return arrayOfFiles;\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 readGitignore = (folderPath: string): string[] => {\n const gitignorePath = path.resolve(folderPath, '.gitignore');\n if (!fs.existsSync(gitignorePath)) return [];\n const gitignoreContent = fs.readFileSync(gitignorePath, 'utf8');\n return gitignoreContent\n .split('\\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 = readGitignore(folderToCompress);\n const filesToCompress = 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 axios, { type AxiosResponse } from 'axios';\nimport * as fs from 'fs';\nimport { apiConfig } from '../config/api';\nimport type { CloudCliConfig } from '../types';\n\nexport const VERSION = 'v1';\n\nexport type ProjectInfos = {\n name: string;\n nodeVersion: string;\n region: string;\n plan?: string;\n url?: string;\n};\nexport type ProjectInput = Omit<ProjectInfos, 'id'>;\n\nexport type DeployResponse = {\n build_id: string;\n image: string;\n};\n\nexport interface CloudApiService {\n deploy(\n deployInput: {\n filePath: string;\n project: { name: string };\n },\n {\n onUploadProgress,\n }: {\n onUploadProgress: (progressEvent: { loaded: number; total?: number }) => void;\n }\n ): Promise<AxiosResponse<DeployResponse>>;\n\n createProject(projectInput: ProjectInput): Promise<{\n data: ProjectInfos;\n status: number;\n }>;\n\n getUserInfo(): Promise<AxiosResponse>;\n\n config(): Promise<AxiosResponse<CloudCliConfig>>;\n\n listProjects(): Promise<AxiosResponse<ProjectInfos[]>>;\n}\n\nexport function cloudApiFactory(token?: string): CloudApiService {\n const axiosCloudAPI = axios.create({\n baseURL: `${apiConfig.apiBaseUrl}/${VERSION}`,\n headers: {\n 'Content-Type': 'application/json',\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: fs.createReadStream(filePath) },\n {\n headers: {\n 'Content-Type': 'multipart/form-data',\n },\n onUploadProgress,\n }\n );\n },\n\n async createProject({ name, nodeVersion, region, plan }) {\n const response = await axiosCloudAPI.post('/project', {\n projectName: name,\n region,\n nodeVersion,\n plan,\n });\n\n return {\n data: {\n id: response.data.id,\n name: response.data.name,\n nodeVersion: response.data.nodeVersion,\n region: response.data.region,\n },\n status: response.status,\n };\n },\n\n getUserInfo() {\n return axiosCloudAPI.get('/user');\n },\n\n config(): Promise<AxiosResponse<CloudCliConfig>> {\n return axiosCloudAPI.get('/config');\n },\n\n listProjects() {\n return axiosCloudAPI.get<ProjectInfos[]>('/projects');\n },\n };\n}\n","import fs from 'fs';\nimport path from 'path';\nimport type { ProjectInfos } from './cli-api';\n\nexport const LOCAL_SAVE_FILENAME = '.strapi-cloud.json';\n\nexport type LocalSave = {\n project?: ProjectInfos;\n};\n\nexport function save(data: LocalSave, { directoryPath }: { directoryPath?: string } = {}) {\n const storedData = { ...retrieve(), ...data };\n const pathToFile = path.join(directoryPath || process.cwd(), LOCAL_SAVE_FILENAME);\n // Ensure the directory exists\n if (!fs.existsSync(path.dirname(pathToFile))) {\n fs.mkdirSync(path.dirname(pathToFile), { recursive: true });\n }\n fs.writeFileSync(pathToFile, JSON.stringify(storedData), 'utf8');\n}\n\nexport function retrieve({ directoryPath }: { directoryPath?: string } = {}): LocalSave {\n const pathToFile = path.join(directoryPath || process.cwd(), LOCAL_SAVE_FILENAME);\n if (!fs.existsSync(pathToFile)) {\n return {};\n }\n\n return JSON.parse(fs.readFileSync(pathToFile, 'utf8'));\n}\n\nexport function erase({ directoryPath }: { directoryPath?: string } = {}) {\n const pathToFile = path.join(directoryPath || process.cwd(), LOCAL_SAVE_FILENAME);\n if (fs.existsSync(pathToFile)) {\n fs.unlinkSync(pathToFile);\n }\n}\n","import path from 'path';\nimport os from 'os';\nimport fs from 'fs';\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};\n\nfunction checkDirectoryExists(directoryPath: string) {\n try {\n return fs.lstatSync(directoryPath).isDirectory();\n } catch (e) {\n return false;\n }\n}\n\n// Determine storage path based on the operating system\nexport function getTmpStoragePath() {\n const storagePath = path.join(os.tmpdir(), APP_FOLDER_NAME);\n if (!checkDirectoryExists(storagePath)) {\n fs.mkdirSync(storagePath, { recursive: true });\n }\n return storagePath;\n}\n\nfunction getConfigPath() {\n const configDirs = XDGAppPaths(APP_FOLDER_NAME).configDirs();\n const configPath = configDirs.find(checkDirectoryExists);\n\n if (!configPath) {\n fs.mkdirSync(configDirs[0], { recursive: true });\n return configDirs[0];\n }\n return configPath;\n}\n\nexport function getLocalConfig(): LocalConfig {\n const configPath = getConfigPath();\n const configFilePath = path.join(configPath, CONFIG_FILENAME);\n if (!fs.existsSync(configFilePath)) {\n return {};\n }\n try {\n return JSON.parse(fs.readFileSync(configFilePath, 'utf8'));\n } catch (e) {\n return {};\n }\n}\n\nexport function saveLocalConfig(data: LocalConfig) {\n const configPath = getConfigPath();\n const configFilePath = path.join(configPath, CONFIG_FILENAME);\n fs.writeFileSync(configFilePath, JSON.stringify(data), { encoding: 'utf8', mode: 0o600 });\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\nconst cloudApiService = cloudApiFactory();\n\nlet cliConfig: CloudCliConfig;\n\ninterface DecodedToken {\n [key: string]: any;\n}\n\nexport function tokenServiceFactory({ logger }: { logger: CLIContext['logger'] }) {\n function saveToken(str: string) {\n const appConfig = 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 saveLocalConfig(appConfig);\n } catch (error: Error | unknown) {\n logger.debug(error);\n logger.error('There was a problem saving your token. Please try again.');\n }\n }\n\n async function retrieveToken() {\n const appConfig = 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: (err: Error | null, key?: string) => void) => {\n client.getSigningKey(header.kid, (err: Error | null, key?: SigningKey) => {\n if (err) {\n callback(err);\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 // Decode the JWT token to get the header and payload\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 }\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 } else {\n resolve();\n }\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 (error) {\n logger.debug(error);\n return false;\n }\n }\n\n function eraseToken() {\n const appConfig = getLocalConfig();\n if (!appConfig) {\n return;\n }\n\n delete appConfig.token;\n\n try {\n saveLocalConfig(appConfig);\n } catch (error: Error | unknown) {\n logger.debug(error);\n logger.error(\n 'There was an issue removing your login information. Please try logging out again.'\n );\n }\n }\n\n async function getValidToken() {\n const token = await retrieveToken();\n if (!token) {\n logger.log('No token found. Please login first.');\n return null;\n }\n\n if (!(await isTokenValid(token))) {\n logger.log('Unable to proceed: Token is expired or not valid. Please login again.');\n return null;\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 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 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 debug(...args) {\n if (silent || !debug) {\n return;\n }\n\n console.log(\n chalk.cyan(`[DEBUG]${timestamp ? `\\t[${new Date().toISOString()}]` : ''}`),\n ...args\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\n );\n },\n\n log(...args) {\n if (silent) {\n return;\n }\n\n console.info(chalk.blue(`${timestamp ? `\\t[${new Date().toISOString()}]` : ''}`), ...args);\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\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\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\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 inquirer from 'inquirer';\nimport { AxiosError } from 'axios';\nimport { defaults } from 'lodash/fp';\nimport type { CLIContext, ProjectAnswers, ProjectInput } from '../types';\nimport { tokenServiceFactory, cloudApiFactory, local } from '../services';\n\nfunction handleError(ctx: CLIContext, error: Error) {\n const tokenService = tokenServiceFactory(ctx);\n const { logger } = ctx;\n\n logger.debug(JSON.stringify(error));\n if (error instanceof AxiosError) {\n switch (error.response?.status) {\n case 401:\n logger.error('Your session has expired. Please log in again.');\n tokenService.eraseToken();\n return;\n case 403:\n logger.error(\n error.response.data ||\n 'You do not have permission to create a project. Please contact support for assistance.'\n );\n return;\n case 400:\n logger.error('Invalid input. Please check your inputs and try again.');\n return;\n default:\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\nexport default (ctx: CLIContext) => {\n const { getValidToken } = tokenServiceFactory(ctx);\n\n return async () => {\n const token = await getValidToken();\n if (!token) {\n return;\n }\n const cloudApi = cloudApiFactory(token);\n const { data: config } = await cloudApi.config();\n const { questions, defaults: defaultValues } = config.projectCreation;\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 const { data } = await cloudApi.createProject(projectInput);\n local.save({ project: data });\n return data;\n } catch (error: Error | unknown) {\n handleError(ctx, error as Error);\n }\n };\n};\n","import EventSource from 'eventsource';\nimport type { CLIContext } from '../types';\n\ntype Event = {\n type: string;\n data: string;\n lastEventId: string;\n origin: string;\n};\n\nconst CONN_TIMEOUT = 5 * 60 * 1000; // 5 minutes\n\nexport function notificationServiceFactory({ logger }: CLIContext) {\n return (url: string, token: string) => {\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 fs from 'fs/promises';\nimport os from 'os';\nimport pkgUp from 'pkg-up';\nimport * as yup from 'yup';\nimport chalk from 'chalk';\nimport { Logger } from '../services/logger';\n\ninterface Export {\n types?: string;\n source: string;\n module?: string;\n import?: string;\n require?: string;\n default: string;\n}\n\nconst packageJsonSchema = yup.object({\n name: yup.string().required(),\n exports: yup.lazy((value) =>\n yup\n .object(\n typeof value === 'object'\n ? Object.entries(value).reduce((acc, [key, value]) => {\n if (typeof value === 'object') {\n acc[key] = yup\n .object({\n types: yup.string().optional(),\n source: yup.string().required(),\n module: yup.string().optional(),\n import: yup.string().required(),\n require: yup.string().required(),\n default: yup.string().required(),\n })\n .noUnknown(true);\n } else {\n acc[key] = yup\n .string()\n .matches(/^\\.\\/.*\\.json$/)\n .required();\n }\n\n return acc;\n }, {} as Record<string, yup.SchemaOf<string> | yup.SchemaOf<Export>>)\n : undefined\n )\n .optional()\n ),\n});\n\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<object> => {\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 fs.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\ntype PackageJson = yup.Asserts<typeof packageJsonSchema>;\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 const validatedPkg = await packageJsonSchema.validate(pkg, {\n strict: true,\n });\n\n return validatedPkg;\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 EventSource from 'eventsource';\nimport { CLIContext } from '../types';\n\nconst buildLogsServiceFactory = ({ logger }: CLIContext) => {\n return async (url: string, token: string) => {\n const CONN_TIMEOUT = 120000; // 2 mins\n const MAX_RETRIES = 5;\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 logger.log(\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 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 reject(new Error('Max retries reached'));\n }\n };\n };\n\n connect(url);\n });\n };\n};\n\nexport { buildLogsServiceFactory };\n","import fs from 'fs';\nimport path from 'path';\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 { CLIContext, ProjectInfos } 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';\n\nconst FILE_SIZE_LIMIT = 100 * 1024 * 1024; // 100MB\n\ntype PackageJson = {\n name: string;\n strapi?: {\n uuid: string;\n };\n};\n\nasync function upload(ctx: CLIContext, project: ProjectInfos, token: string) {\n const cloudApi = cloudApiFactory(token);\n // * Upload project\n try {\n const storagePath = 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 (error: unknown) {\n ctx.logger.error(\n '⚠️ Project compression failed. Try again later or check for large/incompatible files.'\n );\n ctx.logger.debug(error);\n process.exit(1);\n }\n\n const tarFilePath = path.resolve(storagePath, compressedFilename);\n const fileStats = fs.statSync(tarFilePath);\n\n if (fileStats.size > FILE_SIZE_LIMIT) {\n return ctx.logger.log(\n 'Unable to proceed: Your project is too big to be transferred, please use a git repo instead.'\n );\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 (error: any) {\n progressBar.stop();\n if (error instanceof AxiosError && error.response?.data) {\n if (error.response.status === 404) {\n ctx.logger.error(\n `The project does not exist. Remove the ${local.LOCAL_SAVE_FILENAME} file and try again.`\n );\n } else {\n ctx.logger.error(error.response.data);\n }\n } else {\n ctx.logger.error('An error occurred while deploying the project. Please try again later.');\n }\n\n ctx.logger.debug(JSON.stringify(error));\n } finally {\n fs.rmSync(tarFilePath, { force: true });\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(JSON.stringify(e));\n process.exit(1);\n }\n}\n\nasync function getProject(ctx: CLIContext) {\n const { project } = local.retrieve();\n if (!project) {\n try {\n return await createProjectAction(ctx)();\n } catch (error: any) {\n ctx.logger.error('An error occurred while deploying the project. Please try again later.');\n ctx.logger.debug(JSON.stringify(error));\n process.exit(1);\n }\n }\n return project;\n}\n\nexport default async (ctx: CLIContext) => {\n const { getValidToken } = tokenServiceFactory(ctx);\n const token = await getValidToken();\n\n if (!token) {\n return;\n }\n\n const project = await getProject(ctx);\n\n if (!project) {\n return;\n }\n\n const notificationService = notificationServiceFactory(ctx);\n const buildLogsService = buildLogsServiceFactory(ctx);\n\n const buildId = await upload(ctx, project, token);\n\n try {\n await Promise.all([\n notificationService(`${apiConfig.apiBaseUrl}/notifications`, token),\n buildLogsService(`${apiConfig.apiBaseUrl}/v1/logs/${buildId}`, token),\n ]);\n } catch (e: Error | unknown) {\n if (e instanceof Error) {\n ctx.logger.error(e.message);\n }\n }\n};\n","import chalk from 'chalk';\nimport { has } from 'lodash/fp';\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<void>) =>\n (...args: unknown[]) => {\n assertCwdContainsStrapiProject(name);\n\n Promise.resolve()\n .then(() => {\n return action(...args);\n })\n .catch((error) => {\n console.error(error);\n process.exit(1);\n });\n };\n\nexport { runAction };\n","import { type StrapiCloudCommand } from '../types';\nimport { runAction } from '../utils/helpers';\nimport action from './action';\n\n/**\n * `$ deploy project to the cloud`\n */\nconst command: StrapiCloudCommand = ({ command, ctx }) => {\n return command\n .command('cloud:deploy')\n .alias('deploy')\n .description('Deploy a Strapi Cloud project')\n .action(() => runAction('deploy', 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: 'deploy-project',\n description: 'Deploy a Strapi Cloud project',\n action,\n command,\n};\n","import axios, { AxiosResponse, AxiosError } from 'axios';\nimport { tokenServiceFactory, cloudApiFactory } from '../services';\n\nimport type { CloudCliConfig, CLIContext } from '../types';\n\nconst openModule = import('open');\nconst cloudApiService = cloudApiFactory();\n\nexport default async (ctx: CLIContext) => {\n const { logger } = ctx;\n const tokenService = tokenServiceFactory(ctx);\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 (error: unknown) {\n logger.error('🥲 Oops! Something went wrong while logging you in. Please try again.');\n logger.debug(error);\n return;\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((error: AxiosError) => {\n logger.error('There was an issue with the authentication process. Please try again.');\n if (error.message) {\n logger.debug(error.message, error);\n } else {\n logger.debug(error);\n }\n })) as AxiosResponse;\n\n openModule.then((open) => {\n open.default(deviceAuthResponse.data.verification_uri_complete).catch((err: Error) => {\n logger.error('We encountered an issue opening the browser. Please try again later.');\n logger.debug(err.message, err);\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 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 (error: any) {\n logger.debug(error);\n spinnerFail();\n throw new Error('Unable to proceed: Token validation failed');\n }\n const cloudApiService = cloudApiFactory(authTokenData.access_token);\n\n logger.debug('🔍 Fetching user information...');\n // Call to get user info to create the user in DB if not exists\n await cloudApiService.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 (error) {\n logger.error(\n 'There was a problem saving your login information. Please try logging in again.'\n );\n logger.debug(error);\n spinnerFail();\n return;\n }\n }\n } catch (error: any) {\n if (error.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 return;\n }\n if (\n error.response?.data.error &&\n !['authorization_pending', 'slow_down'].includes(error!.response.data.error)\n ) {\n logger.debug(error);\n spinnerFail();\n return;\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 in to Strapi Cloud.');\n };\n\n await authenticate();\n};\n","import type { StrapiCloudCommand } from '../types';\nimport { runAction } from '../utils/helpers';\nimport action from './action';\n\n/**\n * `$ cloud device flow login`\n */\nconst command: StrapiCloudCommand = ({ command, ctx }) => {\n return command\n .command('cloud:login')\n .alias('login')\n .description('Strapi Cloud Login')\n .addHelpText('after', '\\nAfter running this command, you will be prompted to enter your authentication information.')\n .action(() => runAction('login', 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: 'login',\n description: 'Strapi Cloud Login',\n action,\n command,\n};\n","import type { CLIContext } from '../types';\nimport { tokenServiceFactory } from '../services';\n\nexport default async (ctx: CLIContext) => {\n const { logger } = ctx;\n const { retrieveToken, eraseToken } = tokenServiceFactory(ctx);\n\n const token = await retrieveToken();\n if (!token) {\n logger.log(\"You're already logged out.\");\n return;\n }\n try {\n // we might want also to perform extra actions like logging out from the auth0 tenant\n await eraseToken();\n logger.log('🔌 You have been logged out.');\n } catch (error) {\n logger.error('🥲 Oops! Something went wrong while logging you out. Please try again.');\n logger.debug(error);\n }\n};\n","import type { StrapiCloudCommand } from '../types';\nimport { runAction } from '../utils/helpers';\nimport action from './action';\n\n/**\n * `$ cloud device flow logout`\n */\nconst command: StrapiCloudCommand = ({ command, ctx }) => {\n return command\n .command('cloud:logout')\n .alias('logout')\n .description('Strapi Cloud Logout')\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 action from './action';\n\nexport { action };\n\nexport default {\n name: 'create-project',\n description: 'Create a new project',\n action,\n};\n","import * as deployProject from './deploy-project';\nimport * as login from './login';\nimport * as logout from './logout';\nimport * as createProject from './create-project';\n\nexport const cli = {\n deployProject,\n login,\n logout,\n createProject,\n};\n\nexport * as services from './services';\n\nexport * from './types';\n"],"names":["env","fs","path","minimatch","tar","axios","os","XDGAppPaths","cloudApiService","jwksClient","jwt","chalk","ora","cliProgress","AxiosError","defaults","inquirer","local.save","EventSource","yup","value","pkgUp","CONN_TIMEOUT","url","crypto","local.LOCAL_SAVE_FILENAME","local.retrieve","createProjectAction","has","action","command","cliConfig"],"mappings":"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"}
|