{"version":3,"file":"index.mjs","sources":["../src/index.ts"],"sourcesContent":["import * as fs from 'fs'\nimport * as path from 'path'\nimport ora from 'ora'\nimport chalk from 'chalk'\nimport { uid } from 'uid'\nimport removeDir from 'del'\n\n/**\n * Log helper\n * @returns - {start, info, success, error} functions\n */\nexport const logger = () => {\n  const logInfo = chalk.bold.blue\n  const logSuccess = chalk.bold.green\n  const logError = chalk.bold.red\n  const spinner = ora(`${logInfo('Process')}`)\n  return {\n    spinner,\n    start: (value: string) => spinner.start(logInfo(value)),\n    info: (value: string) => spinner.info(logInfo(value)),\n    success: (value: string) => spinner.succeed(logSuccess(value)),\n    error: (value: string) => spinner.warn(logError(value)),\n  }\n}\n\n/**\n * Check extension file string by array\n * @param file\n * @param exts\n * @returns regex\n */\n\nexport const checkFileExt = (file: string, exts: string[]) => {\n  const regex = new RegExp(`^.*(\\.({|{[a-zA-Z,]*,)|\\.)(${exts.join('|')})(,[,a-zA-Z]*}|}|)$`)\n  return regex.test(file)\n}\n\n/**\n * Copy files from input dir to output dir\n * @param pathIn\n * @param pathOut\n * @param exts\n */\nexport const copyFiles = (pathIn: string, pathOut: string, exts?: string[], includes?: string) => {\n  if (!fs.existsSync(pathOut)) fs.mkdirSync(pathOut)\n  fs.readdirSync(pathIn).forEach((file: string) => {\n    if ((exts && checkFileExt(file, exts)) || !exts) {\n      if ((includes && file.includes(includes)) || !includes) {\n        if (fs.lstatSync(path.resolve(pathIn, file)).isFile()) {\n          fs.copyFileSync(path.resolve(pathIn, file), path.resolve(pathOut, file))\n        }\n      }\n    }\n  })\n}\n\n/**\n * Create dir if not exist, remove file on output dir.\n * @param pathOut\n * @param exts\n * @param remove\n */\nexport const prepareOutputDir = (pathOut: string, exts: string[], remove?: boolean) => {\n  if (!fs.existsSync(pathOut)) fs.mkdirSync(pathOut)\n  if (remove) {\n    fs.readdirSync(pathOut).forEach((file: string) => {\n      if ((exts && checkFileExt(file, exts)) || !exts) {\n        if (fs.lstatSync(path.resolve(pathOut, file)).isFile()) {\n          fs.unlinkSync(path.resolve(pathOut, file))\n        }\n      }\n    })\n  }\n}\n\n/**\n * Get UID\n * @param size\n * @returns\n */\nexport const getUID = (size?: number) => '%temp%' + uid(size || 10)\n\n/**\n * Pipeline\n * @param [...fns]\n * @returns (props, options, callback) => Promise\n */\n\nexport const pipeline = (...fns: any) => (props: TypeToolProp, options?: any, callback?: any) =>\n  fns.reduce(\n    (\n      prevFn: Promise<any>,\n      nextFn: (props: TypeToolProp, options?: any, callback?: any) => any,\n      index: string | number,\n    ) => prevFn.then((e: any) => nextFn(e, options && options[index], callback && callback[index])),\n    Promise.resolve(props),\n  )\n\n/**\n * Watch pathIn changes and reload pipeline\n * @param pipeline\n * @param props\n * @param options\n * @param callback\n */\n\nexport const watchPipeline = (\n  pipeline: (props: TypeToolProp, options: any, callback: any) => Promise<any>,\n  props: TypeToolProp,\n  options: any,\n  callback: any,\n) => {\n  let watcher = false\n  pipeline(props, options, callback)\n  fs.watch(props.pathIn || props.pathOut, (_eventType, filename: any) => {\n    const dirPath = path.resolve(props.pathIn || props.pathOut, filename)\n\n    if (fs.existsSync(dirPath) && fs.statSync(dirPath).isFile()) {\n      if (!watcher && filename) {\n        setTimeout(() => {\n          pipeline(props, options, callback)\n            .then(() => {\n              watcher = false\n            })\n            .catch(e => {\n              console.log(e)\n            })\n        }, 1000)\n      }\n\n      watcher = true\n    }\n  })\n}\n\nexport const changeExtension = (file: string, extension?: string) => {\n  if (!extension) return file\n  const basename = path.basename(file, path.extname(file))\n  return path.join(path.dirname(file), basename + extension)\n}\n\nexport interface TypeToolProp {\n  pathIn?: string\n  pathOut: string\n  copy?: boolean\n  verbose?: boolean\n  includes?: string\n}\n\nexport interface TypeLogger {\n  start: ora.Ora\n  info: ora.Ora\n  success: ora.Ora\n  error: ora.Ora\n}\n\nexport interface TypeProps {\n  exts?: string[]\n  name?: string\n  removePrevFile?: boolean\n  [key: string]: any\n}\n\nexport interface TypeOnEveryFile {\n  pathIn?: string\n  pathOut: string\n  file: string\n  props: any\n  options: any\n  wrapperProps: TypeProps\n  log: any //TypeLogger\n  next: (value: void | PromiseLike<void>) => void\n}\n\nexport interface TypeOnBody {\n  pathIn?: string\n  pathOut: string\n  props: any\n  options: any\n  wrapperProps: TypeProps\n  log: any //TypeLogger\n}\n\nexport interface TypeToolOptions {\n  copy?: boolean\n  verbose?: boolean\n  excludes?: string\n}\n\nexport const wrapper = (\n  onEveryFile?: ({ pathIn, pathOut, file, props, options, wrapperProps }: TypeOnEveryFile) => void,\n  onBody?: ({ pathIn, pathOut, props, options, wrapperProps }: TypeOnBody) => Promise<unknown> | void,\n  props?: TypeProps,\n) => (_props: TypeToolProp, _options?: TypeToolOptions) =>\n  new Promise(resolve => {\n    const uid = getUID()\n    const pathIn = _props.pathIn || _props.pathOut\n    const { pathOut, copy, verbose, includes } = _props\n    const { excludes } = _options || {}\n    const pathTemp = path.resolve(pathIn, uid)\n\n    const { removePrevFile } = props || {}\n    const exts = props?.exts || []\n    const name = (props && props.name) || 'Undefined'\n\n    const log = logger()\n\n    log.start(name)\n\n    if (copy) copyFiles(pathIn, pathOut)\n\n    copyFiles(pathIn, pathTemp, exts, includes)\n\n    prepareOutputDir(pathOut, exts, removePrevFile)\n\n    const removeDirHelper = () => {\n      removeDir(pathTemp, { force: true }).then(() => {\n        log.success(`${name} \\n`)\n        resolve({ pathOut })\n      })\n    }\n\n    const innerLog = (value: string) => {\n      if (!verbose) return\n      log.info(value)\n    }\n\n    const promiseEveryFile = Promise.all(\n      fs.readdirSync(pathTemp).map((file: string) => {\n        if (excludes && file.includes(excludes)) return Promise.resolve()\n        return new Promise<void>(resolve => {\n          if (checkFileExt(file, exts)) {\n            if (onEveryFile) {\n              onEveryFile({\n                pathIn: pathTemp,\n                pathOut,\n                file,\n                props: _props,\n                options: _options,\n                wrapperProps: props || {},\n                next: resolve,\n                log: innerLog,\n              })\n            } else {\n              resolve()\n            }\n          } else {\n            resolve()\n          }\n        })\n      }),\n    )\n\n    promiseEveryFile\n      .then(() => {\n        if (onBody) {\n          const promiseBody = onBody({\n            pathIn: pathTemp,\n            pathOut,\n            props: _props,\n            options: _options,\n            wrapperProps: props || {},\n            log: innerLog,\n          })\n          if (promiseBody) {\n            promiseBody\n              .then(() => {\n                removeDirHelper()\n              })\n              .catch(e => {\n                log.error(e)\n              })\n          } else {\n            removeDirHelper()\n          }\n        } else {\n          removeDirHelper()\n        }\n      })\n      .catch(e => {\n        log.error(e)\n      })\n  })\n"],"names":["logger","logInfo","chalk","bold","blue","logSuccess","green","logError","red","spinner","ora","start","value","info","success","succeed","error","warn","checkFileExt","file","exts","RegExp","join","test","copyFiles","pathIn","pathOut","includes","fs","existsSync","mkdirSync","readdirSync","forEach","lstatSync","path","resolve","isFile","copyFileSync","prepareOutputDir","remove","unlinkSync","getUID","size","uid","pipeline","props","options","callback","reduce","prevFn","nextFn","index","then","e","Promise","watchPipeline","watcher","watch","_eventType","filename","dirPath","statSync","setTimeout","console","log","changeExtension","extension","basename","extname","dirname","wrapper","onEveryFile","onBody","_props","_options","copy","verbose","excludes","pathTemp","removePrevFile","name","removeDirHelper","removeDir","force","innerLog","promiseEveryFile","all","map","wrapperProps","next","promiseBody"],"mappings":"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"}