{"version":3,"file":"helpers.mjs","sources":["../../../../src/cli/utils/helpers.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-var-requires */\nimport chalk from 'chalk';\nimport { has, isString, isArray } from 'lodash/fp';\nimport { prompt } from 'inquirer';\nimport boxen from 'boxen';\nimport type { Command } from 'commander';\n\n/**\n * Helper functions for the Strapi CLI\n */\nconst bytesPerKb = 1024;\nconst sizes = ['B ', 'KB', 'MB', 'GB', 'TB', 'PB'];\n\n/**\n * Convert bytes to a human readable formatted string, for example \"1024\" becomes \"1KB\"\n */\nconst readableBytes = (bytes: number, decimals = 1, padStart = 0) => {\n if (!bytes) {\n return '0';\n }\n const i = Math.floor(Math.log(bytes) / Math.log(bytesPerKb));\n const result = `${parseFloat((bytes / bytesPerKb ** i).toFixed(decimals))} ${sizes[i].padStart(\n 2\n )}`;\n\n return result.padStart(padStart);\n};\n\ninterface ExitWithOptions {\n logger?: Console;\n prc?: NodeJS.Process;\n}\n\n/**\n *\n * Display message(s) to console and then call process.exit with code.\n * If code is zero, console.log and green text is used for messages, otherwise console.error and red text.\n *\n */\nconst exitWith = (code: number, message?: string | string[], options: ExitWithOptions = {}) => {\n const { logger = console, prc = process } = options;\n\n const log = (message: string) => {\n if (code === 0) {\n logger.log(chalk.green(message));\n } else {\n logger.error(chalk.red(message));\n }\n };\n\n if (isString(message)) {\n log(message);\n } else if (isArray(message)) {\n message.forEach((msg) => log(msg));\n }\n\n prc.exit(code);\n};\n\n/**\n * assert that a URL object has a protocol value\n *\n */\nconst assertUrlHasProtocol = (url: URL, protocol?: string | string[]) => {\n if (!url.protocol) {\n exitWith(1, `${url.toString()} does not have a protocol`);\n }\n\n // if just checking for the existence of a protocol, return\n if (!protocol) {\n return;\n }\n\n if (isString(protocol)) {\n if (protocol !== url.protocol) {\n exitWith(1, `${url.toString()} must have the protocol ${protocol}`);\n }\n return;\n }\n\n // assume an array\n if (!protocol.some((protocol) => url.protocol === protocol)) {\n return exitWith(\n 1,\n `${url.toString()} must have one of the following protocols: ${protocol.join(',')}`\n );\n }\n};\n\ntype ConditionCallback = (opts: Record) => Promise;\ntype IsMetCallback = (command: Command) => Promise;\ntype IsNotMetCallback = (command: Command) => Promise;\n\n/**\n * Passes commander options to conditionCallback(). If it returns true, call isMetCallback otherwise call isNotMetCallback\n */\nconst ifOptions = (\n conditionCallback: ConditionCallback,\n isMetCallback: IsMetCallback = async () => {},\n isNotMetCallback: IsNotMetCallback = async () => {}\n) => {\n return async (command: Command) => {\n const opts = command.opts();\n if (await conditionCallback(opts)) {\n await isMetCallback(command);\n } else {\n await isNotMetCallback(command);\n }\n };\n};\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 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) =>\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\n/**\n * @description Notify users this is an experimental command and get them to approve first\n * this can be opted out by passing `yes` as a property of the args object.\n *\n * @example\n * ```ts\n * const { notifyExperimentalCommand } = require('../utils/helpers');\n *\n * const myCommand = async ({ force }) => {\n * await notifyExperimentalCommand('plugin:build', { force });\n * }\n * ```\n */\nconst notifyExperimentalCommand = async (name: string, { force }: { force?: boolean } = {}) => {\n console.log(\n boxen(\n `The ${chalk.bold(\n chalk.underline(name)\n )} command is considered experimental, use at your own risk.`,\n {\n title: 'Warning',\n padding: 1,\n margin: 1,\n align: 'center',\n borderColor: 'yellow',\n borderStyle: 'bold',\n }\n )\n );\n\n if (!force) {\n const { confirmed } = await prompt({\n type: 'confirm',\n name: 'confirmed',\n message: 'Do you want to continue?',\n });\n\n if (!confirmed) {\n process.exit(0);\n }\n }\n};\n\nexport {\n exitWith,\n assertUrlHasProtocol,\n ifOptions,\n readableBytes,\n runAction,\n assertCwdContainsStrapiProject,\n notifyExperimentalCommand,\n};\n"],"names":["bytesPerKb","sizes","readableBytes","bytes","decimals","padStart","i","Math","floor","log","result","parseFloat","toFixed","exitWith","code","message","options","logger","console","prc","process","chalk","green","error","red","isString","isArray","forEach","msg","exit","assertUrlHasProtocol","url","protocol","toString","some","join","ifOptions","conditionCallback","isMetCallback","isNotMetCallback","command","opts","assertCwdContainsStrapiProject","name","logErrorAndExit","yellow","pkgJSON","require","cwd","has","err","runAction","action","args","Promise","resolve","then","catch"],"mappings":"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"}