{"bugs":{"url":"https://github.com/huarse/cli-base/issues"},"dist":{"shasum":"e78d6820a4b4464da640a2c77430459d3972358e","tarball":"https://registry.npmjs.org/@irim/cli-base/-/cli-base-1.2.0-beta.3.tgz","fileCount":50,"integrity":"sha512-MLYhrwgy6t0C4LklrML3fG8FPd5pLglACUImJUaghhc2+S3OC7G4dcAn6QMuZa/dvo4uE/hJysq3I/kdKyWTgQ==","signatures":[{"sig":"MEQCIGssMFGHgqtwuboWk3+N2ZbD73qh2XkZ+ZV5AW8FJnK9AiAaOAzd1mREdzRYQF509+ef1zs+8t+kLZtxKtcYzzDGOw==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":71442,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJj8FcqACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmq9cA/8CJAL0tBH0EI+7G4hkSRldEwT2yggmvUMsoQfxEK1lrdywXbV\r\ntGbOWvauyCbm0Kj1bPPiquxpoVvtipB0450PmMmrllDz0n5DKSPXdPD0IdpE\r\nNVRyDpwMxAqKWHSrYklFSv1rOEyvQl8nDGV9/1krmHx013ey/KqdXfyWDiZ2\r\nsMDFCVnAWy2zb+5s/IF4pkxdOAS6+yINy3wnup+hPEKGDuT2spIjQOeTipS8\r\n/DB+rFZBHrK+4J9Mcl5xDOj4HPRme2bYKxFXRsq7/3ChO9zSsbGTNpvpHCnz\r\nT2V7x4dY4kOBQ4kuVVM/fWegpaX0fvmYttkXEPPjO1lwQvt6aphToHntzeCP\r\nG5GGPZ0HIYVrupFBBYsjwuIspsu5YGBTT+bQmVsIT9evnq/w2WooIIRz3Nj9\r\nMHzqQ2bZ3og0M6D3SBgAYdwol4MWTi7DdzzXi0ys95IjkHb/LDHqmi9Y8W1Z\r\n9Maj//u2r1rebYSX0Tl152DvGEiEgmuDbOQ/EyoGpEfKLYXjrOcgt55exXXP\r\nxBZCO6uXWCUiAMRjXjB9x/4YkaSdR+qNY1bHLQrUnvHahPw9Fz1s4B+9SW7s\r\nLDNrRBQc/BK6svO9RbjGRwLv5q4WiDkFem9X5TK4pnj1T0wHZ1aXywRi6a2K\r\naJDDOIRGgvBEA26plD+ZSvXsU/lPYfWkiN0=\r\n=bbCx\r\n-----END PGP SIGNATURE-----\r\n"},"main":"./lib/index.js","name":"@irim/cli-base","types":"./types/index.d.ts","author":{"name":"CAIHUAZHI","email":"huarse@gmail.com"},"readme":"# CLI BASE TOOLS\n\n![version](https://img.shields.io/npm/v/@irim/cli-base)\n![license](https://img.shields.io/npm/l/@irim/cli-base)\n![downloads](https://img.shields.io/npm/dw/@irim/cli-base)\n\nNode Cli 基础方法库\n\n## Getting Started\n\n- `$ npm install @irim/cli-base --save`\n\n```ts\nimport { consts, utils, files } from '@irim/cli-base';\nconst { print } = utils;\n\nprint('debug', 'hello', 'world');\n```\n\n## API\n\n### 1. consts 静态常量\n\n| 属性名   | 描述                | 类型      |\n| -------- | ------------------- | --------- |\n| HOMEPATH | 用户 home 目录      | `string`  |\n| IS_WIN   | 是否是 windows 系统 | `boolean` |\n\n### 2. utils 一些常用的方法\n\n| 方法名          | 描述                                 | 参数定义                                                                 | 返回值                         |\n| --------------- | ------------------------------------ | ------------------------------------------------------------------------ | ------------------------------ |\n| progressBar     | 返回一个进度条 string                | `recent: number, total?: number, label?: string`                         | `string`                       |\n| print           | 带颜色级别的 console.log             | `type: 'debug'|'info'|'success'|'warn'|'error', ...msgs: BaseType[]`     | `(filepath: string) => any`    |\n| printJSON       | 打印单层的 JSON                      | `json: Record<string, BaseType>`                                         | `void`                         |\n| parseProperties | 解析 .properties 文件，返回一个 JSON | `file: string`                                                           | `Promise<Record<string, any>>` |\n| templateRender  | 最简单的模板渲染                     | `tpl: string, data: Record<string, any> = {}`                            | `string`                       |\n| confirm         | node 控制台二次确认                  | `message: string, defaultValue = false`                                  | `Promise<boolean>`             |\n| select          | node 控制台用户选择                  | `message: string, options: SelectOptions<T>[], defaultValue: T`          | `Promise<T>`                   |\n| multi           | node 控制台用户多选                  | `message: string, options: SelectOptions<T>[], defaultValue: T[]`        | `Promise<T[]>`                 |\n| input           | node 控制台用户输入                  | `message: string, defaultValue?: string, validator = (v: string) => any` | `Promise<string>`              |\n| password        | node 控制台密码输入                  | `message: string, defaultValue?: string, validator = (v: string) => any` | `Promise<string>`              |\n| holding         | node 控制台进入等待状态，按回车继续  | `tips = '按回车继续...'`                                                 | `Promise<boolean>`             |\n| exec            | 执行 shell 命令，返回执行结果        | `command: string, cwd = process.cwd()`                                   | `Promise<any>`                 |\n| execSync        | 同步执行 shell 命令                  | `command: string, cwd = process.cwd()`                                   | `SpawnSyncReturns`             |\n\n其中 `input` 和 `password` 方法的第 3 个参数是校验方法，入参是输入的值，如果返回 false 或 Error（支持 Promise），则表示校验失败，例如：\n\n```ts\nutils.input('请输入用户名', null, async (value) => {\n  // 直接校验\n  return value === 'zhangsan'; \n\n  // 返回自定义错误文案\n  return value === 'zhangsan' ? true : new Error('校验失败！');\n\n  // 远程校验\n  return await request(`api/validate?name=${value}`);\n});\n```\n\n#### 扩展的类型定义\n\n```ts\n/**\n * 基本类型，不算 object、null、undefined\n */\nexport type BaseType = string | number | boolean | symbol;\n```\n\n### 3. files 文件操作相关的常用方法\n\n| 方法名          | 描述                                                      | 参数定义                                                                                        | 返回值                   |\n| --------------- | --------------------------------------------------------- | ----------------------------------------------------------------------------------------------- | ------------------------ |\n| fileIterator    | 遍历目录文件，执行 callback                               | 见下文                                                                                          | `Promise<any>`           |\n| dirSyncIterator | 遍历目录文件，同步到目标目录，并对每一个文件执行 callback | 见下文                                                                                          | `Promise<any>`           |\n| getFileCount    | 统计目录中的文件数量                                      | `src: string, exclude?: RegExp`                                                                 | `Promise<number>`        |\n| copyDir         | 逐个复制目录中的文件                                      | `options: OptionShape`                                                                          | `Promise<any>`           |\n| clearDir        | 清空目录(有二次确认)                                      | `options: ClearOptions`                                                                         | `Promise<boolean>`       |\n| findInFolder    | 从目录中查找内容符合条件的文件                            | `src: string, callback: (filePath: string, content: string) => boolean, options: SearchOptions` | `Promise<SearchResult[]` |\n\n#### 扩展的类型定义\n\n```ts\n// 遍历文件目录，执行 callback\nexport async function fileIterator(\n  /** 目录路径 */\n  src: string,\n  /** 执行到文件时的回调，如果返回 false 或 async false，则遍历中止 */\n  fileCallback: (filePath: string, fileRelativePath: string) => any,\n  /** 执行到目录时的回调 */\n  dirCallback?: (dirRelativePath: string) => any,\n  /** 忽略的文件 */\n): Promise<any>;\n\n// 遍历文件目录，同步到目标目录，并对每一个文件执行 callback\nexport async function dirSyncIterator(\n  /** 源文件目录 */\n  source: string,\n  /** 目标目录 */\n  target: string,\n  /** 执行到文件时的回调 */\n  callback: (sourceFile: string, targetFile: string) => any,\n  /** 忽略的文件 */\n  exclude?: RegExp\n): Promise<any>\n\n// copyDir 方法的参数\nexport interface OptionShape {\n  /** 文件来源目录 */\n  src: string;\n  /** 目标目录 */\n  dist: string;\n  /** 文件内容替换规则  */\n  replacer?: { holder: RegExp; value: string }[];\n  /** 忽略的文件 */\n  exclude?: RegExp;\n  /** 只读文件（不读取&替换的文件） */\n  readonlyFile?: RegExp;\n  /** 文件名替换方法 */\n  fileNameTransfer?: (name: string) => string;\n  /** 文件内容格式化方法 */\n  contentFormatter?: (content: string, src: string) => Promise<string>;\n}\n\n// clearDir 方法的参数 \nexport interface ClearOptions {\n  /** 要清除的目录 */\n  src: string;\n  /** 是否有二次确认 */\n  confirm?: boolean;\n  /** 二次确认文案 */\n  confirmText?: string;\n  /** 忽略的文件 */\n  exclude?: RegExp;\n}\n\n// findInFolder 方法的参数\nexport interface SearchOptions {\n  /** 是否找到所有文件，默认 false，即找到第 1 个就返回 */\n  all?: boolean;\n  /** 如果指定了 include，则只处理匹配的文件 */\n  include?: RegExp;\n  /** 匹配规则的文件跳过 */\n  exclude?: RegExp;\n  /** 文件大小限制(byte)，超过大小的文件不遍历 */\n  limit?: number;\n  /** 读取文件的编码，默认是 utf-8 */\n  encoding?: BufferEncoding;\n}\n\nexport interface SearchResult {\n  filePath: string;\n  fileRelativePath: string;\n  fileSize: number;\n}\n```\n\n## CHANGELOG\n\n<!-- - **version**: change logs -->\n- **1.0.0** 发布 1.0 版本，整合并优化 已有能力\n- **1.0.4** 优化文档，迁移代码仓库\n- **1.1.0** 去掉 `BaseAction` ，简化架构\n- **1.1.7** 增强 `utils.print` 方法，可以将日志输出到本地\n- **1.1.9** 新增 `utils.multi` 方法，可以用于多选\n- **1.1.11** 优化 `files.copyDir` 方法，修改默认的配置项\n- **1.1.14** 新增 `utils.promiseTimer` 方法，可以将 promise 方法封装成带超时机制的方法\n\n## LICENSE\n\nBSD-3-Clause License\n\n## Contact Us\n\n[CAIHUAZHI](mailto:huarse@gmail.com)\n","gitHead":"2cde3104656a52a7c73821222d9fc25a908950e8","license":"BSD-3-Clause","scripts":{"dev":"tsc --outDir lib --module CommonJS --target ES2017 --watch","test":"jest","build":"npm run build:lib && npm run build:esm","clear":"rm -rf ./{lib,esm,types}","eslint":"eslint --ext .ts,.tsx ./src","prepare":"husky install .husky","prebuild":"npm run eslint && npm run clear","prettier":"prettier -w '**/*.{js,jsx,tsx,ts,less,md,json}'","build:esm":"tsc --outDir esm --module ES6 --target ES2017","build:lib":"tsc --outDir lib --module CommonJS --target ES2017","eslint:fix":"eslint --fix --ext .ts,.tsx ./src","test:watch":"jest --watch --silent","prepublishOnly":"npm run build"},"_npmUser":{"name":"huarse","email":"huarse@gmail.com"},"homepage":"https://github.com/huarse/cli-base#readme","keywords":["cli-base"],"repository":{"url":"git+ssh://git@github.com/huarse/cli-base.git","type":"git"},"_npmVersion":"8.1.0","description":"Base Module for Command Line Tools","directories":{},"lint-staged":{"*.ts?(x)":["prettier --parser=typescript --write","eslint --fix"],"*.{js,jsx,less,md,json}":["prettier --write"]},"maintainers":[{"name":"huarse","email":"huarse@gmail.com"}],"_nodeVersion":"14.18.1","dependencies":{"ora":"^5.4.0","chalk":"^4.1.1","fs-extra":"^10.0.0","inquirer":"^8.2.3","properties":"^1.2.1","cross-spawn":"^7.0.3","@types/fs-extra":"^9.0.0"},"publishConfig":{"registry":"https://registry.npmjs.org"},"_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"jest":"^28.1.2","husky":"^7.0.4","eslint":"^8.34.0","prettier":"^2.8.4","typescript":"^4.9.5","@babel/core":"^7.20.12","@types/jest":"^28.1.4","lint-staged":"^12.4.1","@commitlint/cli":"^17.4.4","@types/inquirer":"^8.0.0","@babel/preset-env":"^7.20.2","@types/cross-spawn":"^6.0.2","eslint-config-intl":"^1.0.1","jest-environment-jsdom":"^28.1.2","@babel/preset-typescript":"^7.18.6","@typescript-eslint/parser":"^5.52.0","@commitlint/config-conventional":"^17.4.4"},"_npmOperationalInternal":{"tmp":"tmp/cli-base_1.2.0-beta.3_1676695338059_0.28085067282563125","host":"s3://npm-registry-packages"},"_id":"@irim/cli-base@1.2.0-beta.3","version":"1.2.0-beta.3"}