{"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<string, any>) => Promise<boolean>;\ntype IsMetCallback = (command: Command) => Promise<void>;\ntype IsNotMetCallback = (command: Command) => Promise<void>;\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<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\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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"}