{"_id":"clirio","_rev":"56-d3957166ce2f69c2a3c730c5ef7a855a","name":"clirio","dist-tags":{"latest":"4.0.0","alpha":"4.0.0-alpha.0"},"versions":{"0.1.0":{"name":"clirio","version":"0.1.0","keywords":["cli","console","command","option","parser","argument","args","argv","terminal","shell","interface"],"author":{"name":"Stepan Zabelin"},"license":"MIT","_id":"clirio@0.1.0","maintainers":[{"name":"stepanzabelin","email":"stepanzabelin@gmail.com"}],"homepage":"https://github.com/stepanzabelin/clirio#readme","bugs":{"url":"https://github.com/stepanzabelin/clirio/issues"},"dist":{"shasum":"3fefcca95a5fa7ae37eb0bb420abd3f8592ebcd8","tarball":"https://registry.npmjs.org/clirio/-/clirio-0.1.0.tgz","fileCount":415,"integrity":"sha512-QU7N3aKauitbWoZqgjergv1mPYHLpqNAHLR7TRxTGgDJJYAq5HVQJ/SqntKtpYUs5iWWBpKyJB1yzqhnH+rY1Q==","signatures":[{"sig":"MEUCIQCt4IS6Sno+HRjAecz1QHkGDZ1GhH54aXP46SzLcv20zAIgFF3v5L2erZ5Y8qruFL72ov4hNkDbwimQCXiN5wmmT4I=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":445834,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJiEM/uACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmqtRBAAnTUgGSqBlGh+6I4Y3yq8KKnj+CT+QvJ+5WSS5axvS2scN2DD\r\nY++A7kfdwyFL7df8KfVHe3gCWDBcjQo1dRlVxxj5rJNQmUV2g+u6PEr7+2vv\r\nApmMNmYzXEJ2mPn4vbZ7zE4UG8s7yVtTuAymR9e/X0hF/W55IpY29a4fyBNQ\r\nI4RzH1Y11B+F2Ls6P62I8QscyrPyxTxEvu03H/lcXI0ecQCIuEjqhIh+cURb\r\nvMeW7dCQ/FGBiF/LGEsjf4MejUL5Dh+evb5JaaOp3ua67Vy1XLkv9wPoBZK6\r\nMsPhH/DLLcAQ5g/pGRaC8Hrz8af6DMJ8Nfv6YdVnw2EuT0Mk1XyYhFHGtJgy\r\n6mRnsJjoVDcr1FXjzJXxcdP+xpfYYD388BC/eTNhMN0vVNG1TABBqtvtF73m\r\ntaOWIFJXx0ONRos7ifnmM8P1zP0dJcuQrsxww6T8CaNHfjXiImUkFohObrqi\r\nre5ngf970v/y24Z7CpGd5yoBUBK3EhgAZFijgOS2cOcMlowcGLLdfVcUCwCw\r\nTlBI9v6ztOtnm7taNUr9EVY6mOergBPv8hABebiEw7lYRdG9vV2SO03WQSWf\r\ni2N5mgruxzNYzviPGvgymvI2qgtUkeVPHFg9ulEY3KTX7WiDjmBKgMVQKr3U\r\nX8rwopCkEQUYkf4hjYEKIzEwf0i1ndoXl6Y=\r\n=aA8E\r\n-----END PGP SIGNATURE-----\r\n"},"jest":{"rootDir":"src","testRegex":".spec.ts$","transform":{"^.+\\.(t|j)s$":"ts-jest"},"testEnvironment":"node","moduleFileExtensions":["js","json","ts"]},"main":"build/main/index.js","config":{"commitizen":{"path":"cz-conventional-changelog"}},"module":"build/module/index.js","engines":{"node":">=10"},"gitHead":"97d4343258a4db7fe5cf533d70669212a4c07375","scripts":{"cov":"run-s build test:unit cov:html cov:lcov && open-cli coverage/index.html","doc":"run-s doc:html && open-cli build/docs/index.html","fix":"run-s fix:*","test":"run-s build test:*","build":"run-p build:*","version":"standard-version","doc:html":"typedoc src/ --exclude **/*.spec.ts --target ES6 --mode file --out build/docs","doc:json":"typedoc src/ --exclude **/*.spec.ts --target ES6 --mode file --json build/docs/typedoc.json","fix:lint":"eslint src --ext .ts --fix","check-cli":"run-s test diff-integration-tests check-integration-tests","test:lint":"eslint src --ext .ts","test:unit":"jest --silent=false --bail","build:main":"tsc -p tsconfig.json","reset-hard":"git clean -dfx && git reset --hard && yarn","doc:publish":"gh-pages -m \"[ci skip] Updates\" -d build/docs","watch:build":"tsc -p tsconfig.json -w","build:module":"tsc -p tsconfig.module.json","fix:prettier":"prettier \"src/**/*.ts\" --write","test:prettier":"prettier \"src/**/*.ts\" --list-different","test:spelling":"cspell \"{README.md,.github/*.md,src/**/*.ts}\"","prepare-release":"run-s reset-hard test cov:check doc:html version doc:publish","diff-integration-tests":"mkdir -p diff && rm -rf diff/test && cp -r test diff/test && rm -rf diff/test/test-*/.git && cd diff && git init --quiet && git add -A && git commit --quiet --no-verify --allow-empty -m 'WIP' && echo '\\n\\nCommitted most recent integration test output in the \"diff\" directory. Review the changes with \"cd diff && git diff HEAD\" or your preferred git diff viewer.'","check-integration-tests":"run-s check-integration-test:*"},"typings":"build/main/index.d.ts","_npmUser":{"name":"stepanzabelin","email":"stepanzabelin@gmail.com"},"prettier":{"singleQuote":true},"repository":{"url":"git+https://github.com/stepanzabelin/clirio.git","type":"git"},"_npmVersion":"6.14.16","description":"Clirio - a mini framework for node.js command-line interfaces","directories":{},"_nodeVersion":"14.18.2","dependencies":{"joi-class-decorators":"^1.0.4"},"_hasShrinkwrap":false,"devDependencies":{"joi":"^17.5.0","jest":"^27.4.7","sinon":"^12.0.1","cspell":"^4.1.0","dotenv":"^10.0.0","eslint":"^7.8.0","codecov":"^3.5.0","ts-jest":"^27.1.3","ts-node":"^9.0.0","typedoc":"^0.19.0","gh-pages":"^3.1.0","prettier":"^2.1.1","typescript":"^4.5.4","@types/jest":"^27.4.0","@types/node":"^17.0.8","npm-run-all":"^4.1.5","@types/sinon":"^10.0.6","reflect-metadata":"^0.1.13","standard-version":"^9.0.0","eslint-plugin-import":"^2.22.0","eslint-config-prettier":"^6.11.0","@typescript-eslint/parser":"^4.0.1","cz-conventional-changelog":"^3.3.0","eslint-plugin-eslint-comments":"^3.2.0","@typescript-eslint/eslint-plugin":"^4.0.1"},"peerDependencies":{"joi":"^17.2.1","reflect-metadata":"^0.1.13"},"_npmOperationalInternal":{"tmp":"tmp/clirio_0.1.0_1645268974388_0.4240355349519702","host":"s3://npm-registry-packages"}},"1.0.0-alpha.1":{"name":"clirio","version":"1.0.0-alpha.1","keywords":["cli","console","command","option","parser","argument","args","argv","terminal","shell","interface"],"author":{"name":"Stepan Zabelin"},"license":"MIT","_id":"clirio@1.0.0-alpha.1","maintainers":[{"name":"stepanzabelin","email":"stepanzabelin@gmail.com"}],"homepage":"https://github.com/stepanzabelin/clirio#readme","bugs":{"url":"https://github.com/stepanzabelin/clirio/issues"},"dist":{"shasum":"14404a233d8bf067e32fa58b6f2c765a41a4cc54","tarball":"https://registry.npmjs.org/clirio/-/clirio-1.0.0-alpha.1.tgz","fileCount":536,"integrity":"sha512-08Zt2OJ/YCwFFMUjdDXsTfV1+Tw4cdNiA92E9yUEqK7JvfKfkIm6Te0IUWeaeXf/UyGaJ0wdUV1jdmm8A1ZgeA==","signatures":[{"sig":"MEYCIQDi9GML9dEAd/uc8xuPh6t6a/Rpn1yE+LWI0gBZ0kUZxAIhAPgAOCrkEeKcgmwkKaV9buO3ontqm/CWriZaCndxMw1J","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":563221},"jest":{"rootDir":"src","testRegex":".spec.ts$","transform":{"^.+\\.(t|j)s$":"ts-jest"},"testEnvironment":"node","moduleNameMapper":{"^@clirio$":"<rootDir>/index.ts"},"moduleFileExtensions":["js","json","ts"]},"main":"build/main/index.js","module":"build/module/index.js","engines":{"node":">=10"},"gitHead":"7b63b664200236095236c3d9fb06833a430444df","scripts":{"dev":"ts-node -r tsconfig-paths/register src/test-cli-app/run","fix":"run-s fix:*","test":"run-s build test:*","build":"run-p build:*","prepack":"pinst --disable","prepare":"husky install","postpack":"pinst --enable","test:unit":"jest --silent=false --bail","build:main":"tsc -p tsconfig.json","fix:eslint":"eslint ./src --ext .ts  -c .eslintrc-final.json --fix","postinstall":"husky install","test:cspell":"cspell \"{./**/*.js,./**/*.ts}\" --no-progress","test:eslint":"eslint ./src --quiet -c .eslintrc-final.json","watch:build":"tsc -p tsconfig.json -w","build:module":"tsc -p tsconfig.module.json","fix:prettier":"prettier --write \"./src/**/*.ts\"","test:typescript":"tsc -p tsconfig.json --noEmit"},"typings":"build/main/index.d.ts","_npmUser":{"name":"stepanzabelin","email":"stepanzabelin@gmail.com"},"deprecated":"alpha","repository":{"url":"git+https://github.com/stepanzabelin/clirio.git","type":"git"},"_npmVersion":"6.14.18","description":"Clirio - a mini framework for node.js command-line interfaces","directories":{},"_nodeVersion":"18.13.0","dependencies":{"reflect-metadata":"^0.1.13"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^27.4.7","husky":"^8.0.3","pinst":"^3.0.0","sinon":"^12.0.1","cspell":"^6.31.1","eslint":"^8.44.0","ts-jest":"^27.1.3","ts-node":"^9.0.0","prettier":"^3.0.0","typescript":"^4.5.4","@types/jest":"^27.4.0","@types/node":"^17.0.8","npm-run-all":"^4.1.5","@types/sinon":"^10.0.6","eslint-plugin-jest":"^27.2.3","eslint-plugin-import":"^2.22.0","eslint-config-prettier":"^6.11.0","eslint-plugin-prettier":"^5.0.0","@typescript-eslint/parser":"^5.54.1","eslint-plugin-unused-imports":"^3.0.0","eslint-plugin-eslint-comments":"^3.2.0","@typescript-eslint/eslint-plugin":"^5.54.1"},"_npmOperationalInternal":{"tmp":"tmp/clirio_1.0.0-alpha.1_1691004990084_0.9762430454669395","host":"s3://npm-registry-packages"}},"1.0.0-alpha.2":{"name":"clirio","version":"1.0.0-alpha.2","keywords":["cli","console","command","option","parser","argument","args","argv","terminal","shell","interface"],"author":{"name":"Stepan Zabelin"},"license":"MIT","_id":"clirio@1.0.0-alpha.2","maintainers":[{"name":"stepanzabelin","email":"stepanzabelin@gmail.com"}],"homepage":"https://github.com/stepanzabelin/clirio#readme","bugs":{"url":"https://github.com/stepanzabelin/clirio/issues"},"dist":{"shasum":"cd8761f33edf76f24abf1ec21676aa953225f232","tarball":"https://registry.npmjs.org/clirio/-/clirio-1.0.0-alpha.2.tgz","fileCount":536,"integrity":"sha512-T+KaSRRQg5aDvLzIDgy9Z8+rfgh8ng/zrYwexXjv/4biOHjxR70LQ5CNi0stYxDHYDE9S7LAqerZY0zwklCoCA==","signatures":[{"sig":"MEYCIQCUoGUkXNygbloiSFTY1ybbd05xnfy2uoqZHiPxDUXJigIhAIJpCPXQbK8d2uhbyoIzEmo3SS1IpEVSoybxCjkL3K6g","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":563322},"jest":{"rootDir":"src","testRegex":".spec.ts$","transform":{"^.+\\.(t|j)s$":"ts-jest"},"testEnvironment":"node","moduleNameMapper":{"^@clirio$":"<rootDir>/index.ts"},"moduleFileExtensions":["js","json","ts"]},"main":"build/main/index.js","module":"build/module/index.js","engines":{"node":">=10"},"gitHead":"71a076a91a65f04b31252bdcbf98e386eb47fa87","scripts":{"dev":"ts-node -r tsconfig-paths/register src/test-cli-app/run","fix":"run-s fix:*","test":"run-s build test:*","build":"run-p build:*","prepack":"pinst --disable","prepare":"husky install","postpack":"pinst --enable","test:unit":"jest --silent=false --bail","build:main":"tsc -p tsconfig.json","fix:eslint":"eslint ./src --ext .ts  -c .eslintrc-final.json --fix","postinstall":"husky install","test:cspell":"cspell \"{./**/*.js,./**/*.ts}\" --no-progress","test:eslint":"eslint ./src --quiet -c .eslintrc-final.json","watch:build":"tsc -p tsconfig.json -w","build:module":"tsc -p tsconfig.module.json","fix:prettier":"prettier --write \"./src/**/*.ts\"","test:typescript":"tsc -p tsconfig.json --noEmit"},"typings":"build/main/index.d.ts","_npmUser":{"name":"stepanzabelin","email":"stepanzabelin@gmail.com"},"deprecated":"alpha","repository":{"url":"git+https://github.com/stepanzabelin/clirio.git","type":"git"},"_npmVersion":"6.14.18","description":"Clirio is a mini framework for node.js command-line interfaces","directories":{},"_nodeVersion":"18.13.0","dependencies":{"reflect-metadata":"^0.1.13"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^27.4.7","husky":"^8.0.3","pinst":"^3.0.0","sinon":"^12.0.1","cspell":"^6.31.1","eslint":"^8.44.0","ts-jest":"^27.1.3","ts-node":"^9.0.0","prettier":"^3.0.0","typescript":"^4.5.4","@types/jest":"^27.4.0","@types/node":"^17.0.8","npm-run-all":"^4.1.5","@types/sinon":"^10.0.6","eslint-plugin-jest":"^27.2.3","eslint-plugin-import":"^2.22.0","eslint-config-prettier":"^6.11.0","eslint-plugin-prettier":"^5.0.0","@typescript-eslint/parser":"^5.54.1","eslint-plugin-unused-imports":"^3.0.0","eslint-plugin-eslint-comments":"^3.2.0","@typescript-eslint/eslint-plugin":"^5.54.1"},"_npmOperationalInternal":{"tmp":"tmp/clirio_1.0.0-alpha.2_1691088174545_0.1410822102419007","host":"s3://npm-registry-packages"}},"1.0.0-alpha.3":{"name":"clirio","version":"1.0.0-alpha.3","keywords":["cli","console","command","option","parser","argument","args","argv","terminal","shell","interface"],"author":{"name":"Stepan Zabelin"},"license":"MIT","_id":"clirio@1.0.0-alpha.3","maintainers":[{"name":"stepanzabelin","email":"stepanzabelin@gmail.com"}],"homepage":"https://github.com/stepanzabelin/clirio#readme","bugs":{"url":"https://github.com/stepanzabelin/clirio/issues"},"dist":{"shasum":"8af774f6d69bb621aa19de6eabd6f3a11a3fe1ad","tarball":"https://registry.npmjs.org/clirio/-/clirio-1.0.0-alpha.3.tgz","fileCount":536,"integrity":"sha512-tx1Zx+HiYVe2tcLbJ8JWJWnnnSDtUgHQBdPNXVy6zYi32R281D2ft21T3ZTejhiQztb8xtckQD/14T4CMsczVw==","signatures":[{"sig":"MEUCIQDdeudsOU+Vpqj5uQvfdzljEJLOoy5XeaNPYJf39PDRZAIgGEP1dOGs1RUBORbxhK3tdgM8f9Z9Kgb6rkH24Y+ueQU=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":563098},"jest":{"rootDir":"src","testRegex":".spec.ts$","transform":{"^.+\\.(t|j)s$":"ts-jest"},"testEnvironment":"node","moduleNameMapper":{"^@clirio$":"<rootDir>/index.ts"},"moduleFileExtensions":["js","json","ts"]},"main":"build/main/index.js","module":"build/module/index.js","engines":{"node":">=10"},"gitHead":"675cfcc2743eac111c338df56eef852bca8e0819","scripts":{"dev":"ts-node -r tsconfig-paths/register src/test-cli-app/run","fix":"run-s fix:*","test":"run-s build test:*","build":"run-p build:*","prepack":"pinst --disable","prepare":"husky install","postpack":"pinst --enable","test:unit":"jest --silent=false --bail","build:main":"tsc -p tsconfig.json","fix:eslint":"eslint ./src --ext .ts  -c .eslintrc-final.json --fix","postinstall":"husky install","test:cspell":"cspell \"{./**/*.js,./**/*.ts}\" --no-progress","test:eslint":"eslint ./src --quiet -c .eslintrc-final.json","watch:build":"tsc -p tsconfig.json -w","build:module":"tsc -p tsconfig.module.json","fix:prettier":"prettier --write \"./src/**/*.ts\"","test:typescript":"tsc -p tsconfig.json --noEmit"},"typings":"build/main/index.d.ts","_npmUser":{"name":"stepanzabelin","email":"stepanzabelin@gmail.com"},"deprecated":"alpha","repository":{"url":"git+https://github.com/stepanzabelin/clirio.git","type":"git"},"_npmVersion":"6.14.18","description":"Clirio is a mini framework for node.js command-line interfaces","directories":{},"_nodeVersion":"18.13.0","dependencies":{"reflect-metadata":"^0.1.13"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^27.4.7","husky":"^8.0.3","pinst":"^3.0.0","sinon":"^12.0.1","cspell":"^6.31.1","eslint":"^8.44.0","ts-jest":"^27.1.3","ts-node":"^9.0.0","prettier":"^3.0.0","typescript":"^4.5.4","@types/jest":"^27.4.0","@types/node":"^17.0.8","npm-run-all":"^4.1.5","@types/sinon":"^10.0.6","eslint-plugin-jest":"^27.2.3","eslint-plugin-import":"^2.22.0","eslint-config-prettier":"^6.11.0","eslint-plugin-prettier":"^5.0.0","@typescript-eslint/parser":"^5.54.1","eslint-plugin-unused-imports":"^3.0.0","eslint-plugin-eslint-comments":"^3.2.0","@typescript-eslint/eslint-plugin":"^5.54.1"},"_npmOperationalInternal":{"tmp":"tmp/clirio_1.0.0-alpha.3_1691167037836_0.10809810302586587","host":"s3://npm-registry-packages"}},"1.0.0-alpha.4":{"name":"clirio","version":"1.0.0-alpha.4","keywords":["cli","console","command","option","parser","argument","args","argv","terminal","shell","interface"],"author":{"name":"Stepan Zabelin"},"license":"MIT","_id":"clirio@1.0.0-alpha.4","maintainers":[{"name":"stepanzabelin","email":"stepanzabelin@gmail.com"}],"homepage":"https://github.com/stepanzabelin/clirio#readme","bugs":{"url":"https://github.com/stepanzabelin/clirio/issues"},"dist":{"shasum":"1d5325ff226233bb506050d884802fbfe9d1a96d","tarball":"https://registry.npmjs.org/clirio/-/clirio-1.0.0-alpha.4.tgz","fileCount":472,"integrity":"sha512-ggwtbCHCD/KEMW3mtks/MBi32a/eeZOL8z+iwNW3iUTI+mKRg3TEas94Vp9mo4l8T1qoVJIUFGw746I7Lg6V/g==","signatures":[{"sig":"MEQCIBI158AdJkRzd0hIN9nBalxb5rWK7i7DmgjKuyhSfbSpAiAMG/69gdHI032hIJxgB+fELQ+vkTK8zy9fUn4bBQeUuA==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":330665},"main":"build/main/index.js","module":"build/module/index.js","engines":{"node":">=12"},"gitHead":"65278bd1d1ef543e1fb606c595f6f973df6fd692","scripts":{"dev":"ts-node -r tsconfig-paths/register test-cli-app/run","fix":"run-s fix:*","test":"run-s build test:*","build":"run-p build:*","prepack":"pinst --disable","prepare":"husky install","postpack":"pinst --enable","test:unit":"jest --silent=false --bail","build:main":"tsc -p tsconfig.main.json","fix:eslint":"eslint \"./src/**/*.ts\" \"./tests/**/*.ts\"  \"./test-cli-app/**/*.ts\" -c .eslintrc-final.json --fix","postinstall":"husky install","test:cspell":"cspell \"{./**/*.js,./**/*.ts}\" --no-progress","test:eslint":"eslint \"./src/**/*.ts\" \"./tests/**/*.ts\"  \"./test-cli-app/**/*.ts\" --quiet -c .eslintrc-final.json","watch:build":"tsc -p tsconfig.json -w","build:module":"tsc -p tsconfig.module.json","fix:prettier":"prettier --write \"./src/**/*.ts\"","test:typescript":"tsc -p tsconfig.json --noEmit"},"typings":"build/main/index.d.ts","_npmUser":{"name":"stepanzabelin","email":"stepanzabelin@gmail.com"},"deprecated":"alpha","repository":{"url":"git+https://github.com/stepanzabelin/clirio.git","type":"git"},"_npmVersion":"6.14.18","description":"Clirio is a mini framework for node.js command-line interfaces","directories":{},"_nodeVersion":"18.13.0","dependencies":{"reflect-metadata":"^0.1.13"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^27.4.7","husky":"^8.0.3","pinst":"^3.0.0","sinon":"^12.0.1","cspell":"^6.31.1","eslint":"^8.44.0","ts-jest":"^27.1.3","ts-node":"^9.0.0","prettier":"^3.0.0","typescript":"^4.5.4","@types/jest":"^27.4.0","@types/node":"^17.0.8","npm-run-all":"^4.1.5","@types/sinon":"^10.0.6","eslint-plugin-jest":"^27.2.3","eslint-plugin-import":"^2.22.0","eslint-config-prettier":"^6.11.0","eslint-plugin-prettier":"^5.0.0","@typescript-eslint/parser":"^5.54.1","eslint-plugin-unused-imports":"^3.0.0","eslint-plugin-eslint-comments":"^3.2.0","@typescript-eslint/eslint-plugin":"^5.54.1"},"_npmOperationalInternal":{"tmp":"tmp/clirio_1.0.0-alpha.4_1691229745196_0.2922617434595287","host":"s3://npm-registry-packages"}},"1.0.0":{"name":"clirio","version":"1.0.0","keywords":["cli","console","command","option","parser","argument","args","argv","terminal","shell","interface"],"author":{"name":"Stepan Zabelin"},"license":"MIT","_id":"clirio@1.0.0","maintainers":[{"name":"stepanzabelin","email":"stepanzabelin@gmail.com"}],"homepage":"https://github.com/stepanzabelin/clirio#readme","bugs":{"url":"https://github.com/stepanzabelin/clirio/issues"},"dist":{"shasum":"bd2c9a4916f9c364d24724923b8ab86cf1fda008","tarball":"https://registry.npmjs.org/clirio/-/clirio-1.0.0.tgz","fileCount":472,"integrity":"sha512-cZs9WYtZAWNEcAHrhNV+kSWnV4nuPVn+xtKT2zsu84Dzw+Zrmb8DzkdSgsUm3apEbnEvru6LQsZHi0RCnJgv1A==","signatures":[{"sig":"MEUCIEDmuIJZaw98oy2lQXCsi+FYgsBjYze76FmIm4NC5cLyAiEAjmmO4uSKbMrE4pqlbO8DXY8xMBbT3AVdOTPr7gXgz5c=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":334211},"main":"build/main/index.js","module":"build/module/index.js","engines":{"node":">=12"},"gitHead":"079aef7cb19bfc2a1237c0724379bc65c3eb0163","scripts":{"dev":"ts-node -r tsconfig-paths/register test-cli-app/run","fix":"run-s fix:*","test":"run-s build test:*","build":"run-p build:*","prepack":"pinst --disable","prepare":"husky install","postpack":"pinst --enable","test:unit":"jest --silent=false --bail","build:main":"tsc -p tsconfig.main.json","fix:eslint":"eslint \"./src/**/*.ts\" \"./tests/**/*.ts\"  \"./test-cli-app/**/*.ts\" -c .eslintrc-final.json --fix","postinstall":"husky install","test:cspell":"cspell \"./{src,test-cli-app}/**/*.ts\" --no-progress","test:eslint":"eslint \"./src/**/*.ts\" \"./tests/**/*.ts\"  \"./test-cli-app/**/*.ts\" --quiet -c .eslintrc-final.json","watch:build":"tsc -p tsconfig.json -w","build:module":"tsc -p tsconfig.module.json","fix:prettier":"prettier --write \"./{src,tests,test-cli-app}/**/*.ts\"","test:typescript":"tsc -p tsconfig.json --noEmit"},"typings":"build/main/index.d.ts","_npmUser":{"name":"stepanzabelin","email":"stepanzabelin@gmail.com"},"repository":{"url":"git+https://github.com/stepanzabelin/clirio.git","type":"git"},"_npmVersion":"6.14.18","description":"Clirio is a mini framework for node.js command-line interfaces","directories":{},"_nodeVersion":"18.13.0","dependencies":{"reflect-metadata":"^0.1.13"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^27.4.7","husky":"^8.0.3","pinst":"^3.0.0","sinon":"^12.0.1","cspell":"^6.31.1","eslint":"^8.44.0","ts-jest":"^27.1.3","ts-node":"^9.0.0","prettier":"^3.0.0","typescript":"^4.5.4","@types/jest":"^27.4.0","@types/node":"^17.0.8","npm-run-all":"^4.1.5","@types/sinon":"^10.0.6","eslint-plugin-jest":"^27.2.3","eslint-plugin-import":"^2.22.0","eslint-config-prettier":"^6.11.0","eslint-plugin-prettier":"^5.0.0","@typescript-eslint/parser":"^5.54.1","eslint-plugin-unused-imports":"^3.0.0","eslint-plugin-eslint-comments":"^3.2.0","@typescript-eslint/eslint-plugin":"^5.54.1"},"_npmOperationalInternal":{"tmp":"tmp/clirio_1.0.0_1691266332699_0.46287910575958247","host":"s3://npm-registry-packages"}},"1.1.0":{"name":"clirio","version":"1.1.0","keywords":["cli","console","command","option","parser","argument","args","argv","terminal","shell","interface"],"author":{"name":"Stepan Zabelin"},"license":"MIT","_id":"clirio@1.1.0","maintainers":[{"name":"stepanzabelin","email":"stepanzabelin@gmail.com"}],"homepage":"https://github.com/stepanzabelin/clirio#readme","bugs":{"url":"https://github.com/stepanzabelin/clirio/issues"},"dist":{"shasum":"c440e682785ecdee6ea654159c40129e30ed1e88","tarball":"https://registry.npmjs.org/clirio/-/clirio-1.1.0.tgz","fileCount":472,"integrity":"sha512-udFciDIKnmZwN1DwBYaWofAQgBFkyATe8bg9Fy+FiT5LuglVBt+tqx9gjiJUITUtcv+aXvMPdbuQxVRgbPxBJw==","signatures":[{"sig":"MEUCIQC2DO9yW7dt1TTvjYMGx5BcghU/hG5di/Swh3bYltCKegIgfs0xQonBeiN1fNhmJuUo6m9FARlBJAIt/ETfbYsvt34=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":334481},"main":"build/main/index.js","module":"build/module/index.js","engines":{"node":">=12"},"gitHead":"6d492fc42ae89bbaec9f490dc670236bfdd5e055","scripts":{"dev":"ts-node -r tsconfig-paths/register test-cli-app/run","fix":"run-s fix:*","test":"run-s build test:*","build":"run-p build:*","prepack":"pinst --disable","prepare":"husky install","postpack":"pinst --enable","test:unit":"jest --silent=false --bail","build:main":"tsc -p tsconfig.main.json","fix:eslint":"eslint \"./src/**/*.ts\" \"./tests/**/*.ts\"  \"./test-cli-app/**/*.ts\" -c .eslintrc-final.json --fix","postinstall":"husky install","test:cspell":"cspell \"./{src,test-cli-app}/**/*.ts\" --no-progress","test:eslint":"eslint \"./src/**/*.ts\" \"./tests/**/*.ts\"  \"./test-cli-app/**/*.ts\" --quiet -c .eslintrc-final.json","watch:build":"tsc -p tsconfig.json -w","build:module":"tsc -p tsconfig.module.json","fix:prettier":"prettier --write \"./{src,tests,test-cli-app}/**/*.ts\"","test:typescript":"tsc -p tsconfig.json --noEmit"},"typings":"build/main/index.d.ts","_npmUser":{"name":"stepanzabelin","email":"stepanzabelin@gmail.com"},"repository":{"url":"git+https://github.com/stepanzabelin/clirio.git","type":"git"},"_npmVersion":"6.14.18","description":"Clirio is a mini framework for node.js command-line interfaces","directories":{},"_nodeVersion":"18.13.0","dependencies":{"reflect-metadata":"^0.1.13"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^27.4.7","husky":"^8.0.3","pinst":"^3.0.0","sinon":"^12.0.1","cspell":"^6.31.1","eslint":"^8.44.0","ts-jest":"^27.1.3","ts-node":"^9.0.0","prettier":"^3.0.0","typescript":"^4.5.4","@types/jest":"^27.4.0","@types/node":"^17.0.8","npm-run-all":"^4.1.5","@types/sinon":"^10.0.6","eslint-plugin-jest":"^27.2.3","eslint-plugin-import":"^2.22.0","eslint-config-prettier":"^6.11.0","eslint-plugin-prettier":"^5.0.0","@typescript-eslint/parser":"^5.54.1","eslint-plugin-unused-imports":"^3.0.0","eslint-plugin-eslint-comments":"^3.2.0","@typescript-eslint/eslint-plugin":"^5.54.1"},"_npmOperationalInternal":{"tmp":"tmp/clirio_1.1.0_1692650920429_0.9472573149292183","host":"s3://npm-registry-packages"}},"1.2.0":{"name":"clirio","version":"1.2.0","keywords":["cli","console","command","option","parser","argument","args","argv","terminal","shell","interface"],"author":{"name":"Stepan Zabelin"},"license":"MIT","_id":"clirio@1.2.0","maintainers":[{"name":"stepanzabelin","email":"stepanzabelin@gmail.com"}],"homepage":"https://github.com/stepanzabelin/clirio#readme","bugs":{"url":"https://github.com/stepanzabelin/clirio/issues"},"dist":{"shasum":"d6d1856a8c70427b4926911e9b8e964f9641b9ee","tarball":"https://registry.npmjs.org/clirio/-/clirio-1.2.0.tgz","fileCount":472,"integrity":"sha512-7NHrq8ij88/2tXrAqrs23HB2HphmXncK9sccCbdeIXhPwNLbeCbuXRMCRKJ6ObfNTzDXhOgPSH+EEUoLcv+ujg==","signatures":[{"sig":"MEUCIBV2Bd9L22BnjycJwX4ddfkYNitrDvjE5IFBv7vHTduOAiEAvCQDxSeKCYHC1vKm4mHyZbgQiAh0jUm1wsBG+Rplgpk=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":334227},"main":"build/main/index.js","module":"build/module/index.js","engines":{"node":">=12"},"gitHead":"10aa0d124c403b97447577a82f9d32da0cc11a8d","scripts":{"dev":"ts-node -r tsconfig-paths/register test-cli-app/run","fix":"run-s fix:*","test":"run-s build test:*","build":"run-p build:*","prepack":"pinst --disable","prepare":"husky install","postpack":"pinst --enable","test:unit":"jest --silent=false --bail","build:main":"tsc -p tsconfig.main.json","fix:eslint":"eslint \"./src/**/*.ts\" \"./tests/**/*.ts\"  \"./test-cli-app/**/*.ts\" -c .eslintrc-final.json --fix","postinstall":"husky install","test:cspell":"cspell \"./{src,test-cli-app}/**/*.ts\" --no-progress","test:eslint":"eslint \"./src/**/*.ts\" \"./tests/**/*.ts\"  \"./test-cli-app/**/*.ts\" --quiet -c .eslintrc-final.json","watch:build":"tsc -p tsconfig.json -w","build:module":"tsc -p tsconfig.module.json","fix:prettier":"prettier --write \"./{src,tests,test-cli-app}/**/*.ts\"","test:typescript":"tsc -p tsconfig.json --noEmit"},"typings":"build/main/index.d.ts","_npmUser":{"name":"stepanzabelin","email":"stepanzabelin@gmail.com"},"repository":{"url":"git+https://github.com/stepanzabelin/clirio.git","type":"git"},"_npmVersion":"9.8.0","description":"Clirio is a mini framework for node.js command-line interfaces","directories":{},"_nodeVersion":"20.5.1","dependencies":{"reflect-metadata":"^0.1.13"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^27.4.7","husky":"^8.0.3","pinst":"^3.0.0","sinon":"^12.0.1","cspell":"^6.31.1","eslint":"^8.44.0","ts-jest":"^27.1.3","ts-node":"^9.0.0","prettier":"^3.0.0","typescript":"^4.5.4","@types/jest":"^27.4.0","@types/node":"^17.0.8","npm-run-all":"^4.1.5","@types/sinon":"^10.0.6","eslint-plugin-jest":"^27.2.3","eslint-plugin-import":"^2.22.0","eslint-config-prettier":"^6.11.0","eslint-plugin-prettier":"^5.0.0","@typescript-eslint/parser":"^5.54.1","eslint-plugin-unused-imports":"^3.0.0","eslint-plugin-eslint-comments":"^3.2.0","@typescript-eslint/eslint-plugin":"^5.54.1"},"_npmOperationalInternal":{"tmp":"tmp/clirio_1.2.0_1692981962319_0.3656172779531446","host":"s3://npm-registry-packages"}},"2.0.0-dev.1":{"name":"clirio","version":"2.0.0-dev.1","keywords":["cli","console","command","option","parser","argument","args","argv","terminal","shell","interface"],"author":{"name":"Stepan Zabelin"},"license":"MIT","_id":"clirio@2.0.0-dev.1","maintainers":[{"name":"stepanzabelin","email":"stepanzabelin@gmail.com"}],"homepage":"https://github.com/stepanzabelin/clirio#readme","bugs":{"url":"https://github.com/stepanzabelin/clirio/issues"},"dist":{"shasum":"05f40132b6680dad5bcc32a4fa8dce58800992c2","tarball":"https://registry.npmjs.org/clirio/-/clirio-2.0.0-dev.1.tgz","fileCount":496,"integrity":"sha512-c9vEw9CoHzWRI8uiho0XKbU4Tz+B/yl9PryUx2AaKkcC0L5TtblijvqxyYKZwicYqGYUXFEdNGRqcqSsyGf9zg==","signatures":[{"sig":"MEQCIG2XdRT+5ctuYSpywTw9loyeK9AdxIvEMODs0FJaR9IJAiBg2mewdL+1pUn4f9uH5CHAmeAedha0woK+FErSthMzwA==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":350652},"main":"build/main/index.js","module":"build/module/index.js","engines":{"node":">=12"},"gitHead":"8fe2e3ca97a2216dcdb70cb1e6d14b251dcd27f2","scripts":{"dev":"ts-node -r tsconfig-paths/register test-cli-app/run","fix":"run-s fix:*","test":"run-s build test:*","build":"run-p build:*","prepack":"pinst --disable","prepare":"husky install","postpack":"pinst --enable","test:unit":"jest --silent=false --bail","build:main":"tsc -p tsconfig.main.json","fix:eslint":"eslint \"./src/**/*.ts\" \"./tests/**/*.ts\"  \"./test-cli-app/**/*.ts\" -c .eslintrc-final.json --fix","postinstall":"husky install","test:cspell":"cspell \"./{src,test-cli-app}/**/*.ts\" --no-progress","test:eslint":"eslint \"./src/**/*.ts\" \"./tests/**/*.ts\"  \"./test-cli-app/**/*.ts\" --quiet -c .eslintrc-final.json","watch:build":"tsc -p tsconfig.json -w","build:module":"tsc -p tsconfig.module.json","fix:prettier":"prettier --write \"./{src,tests,test-cli-app}/**/*.ts\"","test:typescript":"tsc -p tsconfig.json --noEmit"},"typings":"build/main/index.d.ts","_npmUser":{"name":"stepanzabelin","email":"stepanzabelin@gmail.com"},"deprecated":"alpha","repository":{"url":"git+https://github.com/stepanzabelin/clirio.git","type":"git"},"_npmVersion":"9.8.0","description":"Clirio is a mini framework for node.js command-line interfaces","directories":{},"_nodeVersion":"20.5.1","dependencies":{"reflect-metadata":"^0.1.13"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^27.4.7","husky":"^8.0.3","pinst":"^3.0.0","sinon":"^12.0.1","cspell":"^6.31.1","eslint":"^8.44.0","ts-jest":"^27.1.3","ts-node":"^9.0.0","prettier":"^3.0.0","typescript":"^4.5.4","@types/jest":"^27.4.0","@types/node":"^17.0.8","npm-run-all":"^4.1.5","@types/sinon":"^10.0.6","eslint-plugin-jest":"^27.2.3","eslint-plugin-import":"^2.22.0","eslint-config-prettier":"^6.11.0","eslint-plugin-prettier":"^5.0.0","@typescript-eslint/parser":"^5.54.1","eslint-plugin-unused-imports":"^3.0.0","eslint-plugin-eslint-comments":"^3.2.0","@typescript-eslint/eslint-plugin":"^5.54.1"},"_npmOperationalInternal":{"tmp":"tmp/clirio_2.0.0-dev.1_1693131309076_0.7879671407980475","host":"s3://npm-registry-packages"}},"2.0.0":{"name":"clirio","version":"2.0.0","keywords":["cli","console","command","option","parser","argument","args","argv","terminal","shell","interface"],"author":{"name":"Stepan Zabelin"},"license":"MIT","_id":"clirio@2.0.0","maintainers":[{"name":"stepanzabelin","email":"stepanzabelin@gmail.com"}],"homepage":"https://github.com/stepanzabelin/clirio#readme","bugs":{"url":"https://github.com/stepanzabelin/clirio/issues"},"dist":{"shasum":"745c3a8ca9bf083de4aece688bba10e6fd174a14","tarball":"https://registry.npmjs.org/clirio/-/clirio-2.0.0.tgz","fileCount":496,"integrity":"sha512-V7qzv2h8LzriBxEcFPXdMyfdW42g8yU8wVPfQ9le0zgoVTxX3ZzpnZx4QRy5+WkW5EEN3on7fqmzOY1L809RjQ==","signatures":[{"sig":"MEUCICwMNpSiNzzqtbBQ5Kdq+NhcsRAtqbDwRqjlsvIjWuyOAiEA5M13qD07n+xOo0ezNdTx3H1x+g8J46JIug9M/jqXKOw=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":351374},"main":"build/main/index.js","module":"build/module/index.js","engines":{"node":">=12"},"gitHead":"9f4279dd2f5886a0bb7ae93f8c6d0bfc79f3fe6f","scripts":{"dev":"ts-node -r tsconfig-paths/register test-cli-app/run","fix":"run-s fix:*","test":"run-s build test:*","build":"run-p build:*","prepack":"pinst --disable","prepare":"husky install","postpack":"pinst --enable","test:unit":"jest --silent=false --bail","build:main":"tsc -p tsconfig.main.json","fix:eslint":"eslint \"./src/**/*.ts\" \"./tests/**/*.ts\"  \"./test-cli-app/**/*.ts\" -c .eslintrc-final.json --fix","postinstall":"husky install","test:cspell":"cspell \"./{src,test-cli-app}/**/*.ts\" --no-progress","test:eslint":"eslint \"./src/**/*.ts\" \"./tests/**/*.ts\"  \"./test-cli-app/**/*.ts\" --quiet -c .eslintrc-final.json","watch:build":"tsc -p tsconfig.json -w","build:module":"tsc -p tsconfig.module.json","fix:prettier":"prettier --write \"./{src,tests,test-cli-app}/**/*.ts\"","test:typescript":"tsc -p tsconfig.json --noEmit"},"typings":"build/main/index.d.ts","_npmUser":{"name":"stepanzabelin","email":"stepanzabelin@gmail.com"},"repository":{"url":"git+https://github.com/stepanzabelin/clirio.git","type":"git"},"_npmVersion":"9.8.0","description":"Clirio is a mini framework for node.js command-line interfaces","directories":{},"_nodeVersion":"20.5.1","dependencies":{"reflect-metadata":"^0.1.13"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^27.4.7","husky":"^8.0.3","pinst":"^3.0.0","sinon":"^12.0.1","cspell":"^6.31.1","eslint":"^8.44.0","ts-jest":"^27.1.3","ts-node":"^9.0.0","prettier":"^3.0.0","typescript":"^4.5.4","@types/jest":"^27.4.0","@types/node":"^17.0.8","npm-run-all":"^4.1.5","@types/sinon":"^10.0.6","eslint-plugin-jest":"^27.2.3","eslint-plugin-import":"^2.22.0","eslint-config-prettier":"^6.11.0","eslint-plugin-prettier":"^5.0.0","@typescript-eslint/parser":"^5.54.1","eslint-plugin-unused-imports":"^3.0.0","eslint-plugin-eslint-comments":"^3.2.0","@typescript-eslint/eslint-plugin":"^5.54.1"},"_npmOperationalInternal":{"tmp":"tmp/clirio_2.0.0_1696015555786_0.3872406402148125","host":"s3://npm-registry-packages"}},"2.0.1":{"name":"clirio","version":"2.0.1","keywords":["cli","console","command","option","parser","argument","args","argv","terminal","shell","interface"],"author":{"name":"Stepan Zabelin"},"license":"MIT","_id":"clirio@2.0.1","maintainers":[{"name":"stepanzabelin","email":"stepanzabelin@gmail.com"}],"homepage":"https://github.com/stepanzabelin/clirio#readme","bugs":{"url":"https://github.com/stepanzabelin/clirio/issues"},"dist":{"shasum":"88db402c3905fdc64cadc72fea921c018a6383d8","tarball":"https://registry.npmjs.org/clirio/-/clirio-2.0.1.tgz","fileCount":496,"integrity":"sha512-htEG/ZjK5R2BO6KFIcNDcDi/CdkFHCzEX8Ygz19i18vnxTbcukA82l0xdfnK9eLhpIa6GfJpgX+FtjjSmnr7PA==","signatures":[{"sig":"MEUCIQDtSfY+Mr0CudQDcgTehkaNcCbgpS/LVn7sXnG5qFlFjgIgYnpgEdzu+LX4lL+tf6PxVzO3YG3r/suQfEnuYJCt2Us=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":352233},"main":"build/main/index.js","module":"build/module/index.js","engines":{"node":">=12"},"gitHead":"b82cdef962470d539cf14c6d188c1b4573ae4891","scripts":{"dev":"ts-node -r tsconfig-paths/register test-cli-app/run","fix":"run-s fix:*","test":"run-s build test:*","build":"run-p build:*","prepack":"pinst --disable","prepare":"husky install","postpack":"pinst --enable","test:unit":"jest --silent=false --bail","build:main":"tsc -p tsconfig.main.json","fix:eslint":"eslint \"./src/**/*.ts\" \"./tests/**/*.ts\"  \"./test-cli-app/**/*.ts\" -c .eslintrc-final.json --fix","postinstall":"husky install","test:cspell":"cspell \"./{src,test-cli-app}/**/*.ts\" --no-progress","test:eslint":"eslint \"./src/**/*.ts\" \"./tests/**/*.ts\"  \"./test-cli-app/**/*.ts\" --quiet -c .eslintrc-final.json","watch:build":"tsc -p tsconfig.json -w","build:module":"tsc -p tsconfig.module.json","fix:prettier":"prettier --write \"./{src,tests,test-cli-app}/**/*.ts\"","test:typescript":"tsc -p tsconfig.json --noEmit"},"typings":"build/main/index.d.ts","_npmUser":{"name":"stepanzabelin","email":"stepanzabelin@gmail.com"},"repository":{"url":"git+https://github.com/stepanzabelin/clirio.git","type":"git"},"_npmVersion":"9.8.0","description":"Clirio is a mini framework for node.js command-line interfaces","directories":{},"_nodeVersion":"20.5.1","dependencies":{"reflect-metadata":"^0.1.13"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^27.4.7","husky":"^8.0.3","pinst":"^3.0.0","sinon":"^12.0.1","cspell":"^6.31.1","eslint":"^8.44.0","ts-jest":"^27.1.3","ts-node":"^9.0.0","prettier":"^3.0.0","typescript":"^4.5.4","@types/jest":"^27.4.0","@types/node":"^17.0.8","npm-run-all":"^4.1.5","@types/sinon":"^10.0.6","eslint-plugin-jest":"^27.2.3","eslint-plugin-import":"^2.22.0","eslint-config-prettier":"^6.11.0","eslint-plugin-prettier":"^5.0.0","@typescript-eslint/parser":"^5.54.1","eslint-plugin-unused-imports":"^3.0.0","eslint-plugin-eslint-comments":"^3.2.0","@typescript-eslint/eslint-plugin":"^5.54.1"},"_npmOperationalInternal":{"tmp":"tmp/clirio_2.0.1_1696158870804_0.4382663758015404","host":"s3://npm-registry-packages"}},"3.0.0-dev.1":{"name":"clirio","version":"3.0.0-dev.1","keywords":["cli","console","command","option","parser","argument","args","argv","terminal","shell","interface"],"author":{"name":"Stepan Zabelin"},"license":"MIT","_id":"clirio@3.0.0-dev.1","maintainers":[{"name":"stepanzabelin","email":"stepanzabelin@gmail.com"}],"homepage":"https://github.com/stepanzabelin/clirio#readme","bugs":{"url":"https://github.com/stepanzabelin/clirio/issues"},"dist":{"shasum":"938f5e15ca4bf24d47f78b458c7e6007b81ea533","tarball":"https://registry.npmjs.org/clirio/-/clirio-3.0.0-dev.1.tgz","fileCount":520,"integrity":"sha512-j+LqFpdPC0bQCnxmMxomnSFdjMumJAja/++n4255pOHec6fl2gi/Z7J1fRt285429U8HjmZz9jFdUK/9APfwEQ==","signatures":[{"sig":"MEYCIQCANHAibZFutfMvG6RXzyRAZVV3GpXH/iM/A/EN6xRSRAIhALati8iN2UBPsPbSAuvV5j9poTrdZ5ZsQc3JQHRbsl3p","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":344838},"main":"build/main/index.js","module":"build/module/index.js","engines":{"node":">=12"},"gitHead":"41dd7e908ba3ee92ba34c6c508417e6405e2e2e5","scripts":{"dev":"ts-node -r tsconfig-paths/register test-cli-app/run","fix":"run-s fix:*","test":"run-s build test:*","build":"run-p build:*","prepack":"pinst --disable","prepare":"husky install","postpack":"pinst --enable","test:unit":"jest --silent=false --bail","build:main":"tsc -p tsconfig.main.json","fix:eslint":"eslint \"./src/**/*.ts\" \"./tests/**/*.ts\"  \"./test-cli-app/**/*.ts\" -c .eslintrc-final.json --fix","postinstall":"husky install","test:cspell":"cspell \"./{src,test-cli-app}/**/*.ts\" --no-progress","test:eslint":"eslint \"./src/**/*.ts\" \"./tests/**/*.ts\"  \"./test-cli-app/**/*.ts\" --quiet -c .eslintrc-final.json","watch:build":"tsc -p tsconfig.json -w","build:module":"tsc -p tsconfig.module.json","fix:prettier":"prettier --write \"./{src,tests,test-cli-app}/**/*.ts\"","test:typescript":"tsc -p tsconfig.json --noEmit"},"typings":"build/main/index.d.ts","_npmUser":{"name":"stepanzabelin","email":"stepanzabelin@gmail.com"},"deprecated":"dev version","repository":{"url":"git+https://github.com/stepanzabelin/clirio.git","type":"git"},"_npmVersion":"10.1.0","description":"Clirio is a mini framework for node.js command-line interfaces","directories":{},"_nodeVersion":"20.8.1","dependencies":{"reflect-metadata":"^0.1.13"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^27.4.7","husky":"^8.0.3","pinst":"^3.0.0","sinon":"^12.0.1","cspell":"^6.31.1","eslint":"^8.44.0","ts-jest":"^27.1.3","ts-node":"^9.0.0","prettier":"^3.0.0","typescript":"^4.5.4","@types/jest":"^27.4.0","@types/node":"^17.0.8","npm-run-all":"^4.1.5","@types/sinon":"^10.0.6","eslint-plugin-jest":"^27.2.3","eslint-plugin-import":"^2.22.0","eslint-config-prettier":"^6.11.0","eslint-plugin-prettier":"^5.0.0","@typescript-eslint/parser":"^5.54.1","eslint-plugin-unused-imports":"^3.0.0","eslint-plugin-eslint-comments":"^3.2.0","@typescript-eslint/eslint-plugin":"^5.54.1"},"_npmOperationalInternal":{"tmp":"tmp/clirio_3.0.0-dev.1_1699826462689_0.7349996420519935","host":"s3://npm-registry-packages"}},"3.0.0-dev.2":{"name":"clirio","version":"3.0.0-dev.2","keywords":["cli","console","command","option","parser","argument","args","argv","terminal","shell","interface"],"author":{"name":"Stepan Zabelin"},"license":"MIT","_id":"clirio@3.0.0-dev.2","maintainers":[{"name":"stepanzabelin","email":"stepanzabelin@gmail.com"}],"homepage":"https://github.com/stepanzabelin/clirio#readme","bugs":{"url":"https://github.com/stepanzabelin/clirio/issues"},"dist":{"shasum":"b0e8aaa7336d0d0b449cf9256f868634aa8d41df","tarball":"https://registry.npmjs.org/clirio/-/clirio-3.0.0-dev.2.tgz","fileCount":520,"integrity":"sha512-kV79PwR7E+8Ul4yuxHxdHYzRov8MVXGWnyq3McVf5yI/LMI3EDOBiE/7EZVoGvxvFeGwt4FMMzvLTLVcBZ2BAQ==","signatures":[{"sig":"MEUCIGrUdwcCEL7+gzn4pvi7/yPD9SUqbe8EGLlu0BtC31PqAiEA3QYDjo0ffHVJ98PeehTOdzWqiOeCGHfA/4hCwXm8j+c=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":345001},"main":"build/main/index.js","module":"build/module/index.js","engines":{"node":">=12"},"gitHead":"c013fd8a1d072277d721ac66bb937d17c0a4a5bd","scripts":{"dev":"ts-node -r tsconfig-paths/register test-cli-app/run","fix":"run-s fix:*","test":"run-s build test:*","build":"run-p build:*","prepack":"pinst --disable","prepare":"husky install","postpack":"pinst --enable","test:unit":"jest --silent=false --bail","build:main":"tsc -p tsconfig.main.json","fix:eslint":"eslint \"./src/**/*.ts\" \"./tests/**/*.ts\"  \"./test-cli-app/**/*.ts\" -c .eslintrc-final.json --fix","postinstall":"husky install","test:cspell":"cspell \"./{src,test-cli-app}/**/*.ts\" --no-progress","test:eslint":"eslint \"./src/**/*.ts\" \"./tests/**/*.ts\"  \"./test-cli-app/**/*.ts\" --quiet -c .eslintrc-final.json","watch:build":"tsc -p tsconfig.json -w","build:module":"tsc -p tsconfig.module.json","fix:prettier":"prettier --write \"./{src,tests,test-cli-app}/**/*.ts\"","test:typescript":"tsc -p tsconfig.json --noEmit"},"typings":"build/main/index.d.ts","_npmUser":{"name":"stepanzabelin","email":"stepanzabelin@gmail.com"},"deprecated":"dev version","repository":{"url":"git+https://github.com/stepanzabelin/clirio.git","type":"git"},"_npmVersion":"10.1.0","description":"Clirio is a mini framework for node.js command-line interfaces","directories":{},"_nodeVersion":"20.8.1","dependencies":{"reflect-metadata":"^0.1.13"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^27.4.7","husky":"^8.0.3","pinst":"^3.0.0","sinon":"^12.0.1","cspell":"^6.31.1","eslint":"^8.44.0","ts-jest":"^27.1.3","ts-node":"^10.9.1","prettier":"^3.0.0","typescript":"^4.5.4","@types/jest":"^27.4.0","@types/node":"^17.0.8","npm-run-all":"^4.1.5","@types/sinon":"^10.0.6","eslint-plugin-jest":"^27.2.3","eslint-plugin-import":"^2.22.0","eslint-config-prettier":"^6.11.0","eslint-plugin-prettier":"^5.0.0","@typescript-eslint/parser":"^5.54.1","eslint-plugin-unused-imports":"^3.0.0","eslint-plugin-eslint-comments":"^3.2.0","@typescript-eslint/eslint-plugin":"^5.54.1"},"_npmOperationalInternal":{"tmp":"tmp/clirio_3.0.0-dev.2_1699903296128_0.8226275581592986","host":"s3://npm-registry-packages"}},"3.0.0":{"name":"clirio","version":"3.0.0","keywords":["cli","console","command","option","parser","argument","args","argv","terminal","shell","interface"],"author":{"name":"Stepan Zabelin"},"license":"MIT","_id":"clirio@3.0.0","maintainers":[{"name":"stepanzabelin","email":"stepanzabelin@gmail.com"}],"homepage":"https://github.com/stepanzabelin/clirio#readme","bugs":{"url":"https://github.com/stepanzabelin/clirio/issues"},"dist":{"shasum":"5eabd04c0323d131ea30c7aaec38ac7ce78c2e32","tarball":"https://registry.npmjs.org/clirio/-/clirio-3.0.0.tgz","fileCount":520,"integrity":"sha512-tb84zu7s/nrUmg9/AN8mA6Ua7nh8Bw+pfgPyeyzoQR+nRKvcCB4FFrJBp3CjLvRcS6I9BCigP20ylszzITyuPw==","signatures":[{"sig":"MEQCIBerYF+/FoZgM+GArg0nbg+rHVhwXE/h0E2UH0TKeY9/AiBcIF36sUOKNnhTeRv+sTUR5lrbFt1gTpmW8Qd6V283wQ==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":345617},"main":"build/main/index.js","module":"build/module/index.js","engines":{"node":">=12"},"gitHead":"bca70246a896a40213aafc2a847678219a73f914","scripts":{"dev":"ts-node -r tsconfig-paths/register test-cli-app/run","fix":"run-s fix:*","test":"run-s build test:*","build":"run-p build:*","prepack":"pinst --disable","prepare":"husky install","postpack":"pinst --enable","test:unit":"jest --silent=false --bail","build:main":"tsc -p tsconfig.main.json","fix:eslint":"eslint \"./src/**/*.ts\" \"./tests/**/*.ts\"  \"./test-cli-app/**/*.ts\" -c .eslintrc-final.json --fix","postinstall":"husky install","test:cspell":"cspell \"./{src,test-cli-app}/**/*.ts\" --no-progress","test:eslint":"eslint \"./src/**/*.ts\" \"./tests/**/*.ts\"  \"./test-cli-app/**/*.ts\" --quiet -c .eslintrc-final.json","watch:build":"tsc -p tsconfig.json -w","build:module":"tsc -p tsconfig.module.json","fix:prettier":"prettier --write \"./{src,tests,test-cli-app}/**/*.ts\"","test:typescript":"tsc -p tsconfig.json --noEmit"},"typings":"build/main/index.d.ts","_npmUser":{"name":"stepanzabelin","email":"stepanzabelin@gmail.com"},"repository":{"url":"git+https://github.com/stepanzabelin/clirio.git","type":"git"},"_npmVersion":"10.1.0","description":"Clirio is a mini framework for node.js command-line interfaces","directories":{},"_nodeVersion":"20.8.1","dependencies":{"reflect-metadata":"^0.1.13"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^27.4.7","husky":"^8.0.3","pinst":"^3.0.0","sinon":"^12.0.1","cspell":"^6.31.1","eslint":"^8.44.0","ts-jest":"^27.1.3","ts-node":"^10.9.1","prettier":"^3.0.0","typescript":"^4.5.4","@types/jest":"^27.4.0","@types/node":"^17.0.8","npm-run-all":"^4.1.5","@types/sinon":"^10.0.6","eslint-plugin-jest":"^27.2.3","eslint-plugin-import":"^2.22.0","eslint-config-prettier":"^6.11.0","eslint-plugin-prettier":"^5.0.0","@typescript-eslint/parser":"^5.54.1","eslint-plugin-unused-imports":"^3.0.0","eslint-plugin-eslint-comments":"^3.2.0","@typescript-eslint/eslint-plugin":"^5.54.1"},"_npmOperationalInternal":{"tmp":"tmp/clirio_3.0.0_1699914442503_0.33064995607318526","host":"s3://npm-registry-packages"}},"3.0.1":{"name":"clirio","version":"3.0.1","keywords":["cli","console","command","option","parser","argument","args","argv","terminal","shell","interface"],"author":{"name":"Stepan Zabelin"},"license":"MIT","_id":"clirio@3.0.1","maintainers":[{"name":"stepanzabelin","email":"stepanzabelin@gmail.com"}],"homepage":"https://github.com/stepanzabelin/clirio#readme","bugs":{"url":"https://github.com/stepanzabelin/clirio/issues"},"dist":{"shasum":"b2317dfe96b1a18f171edf025d233c8527b86132","tarball":"https://registry.npmjs.org/clirio/-/clirio-3.0.1.tgz","fileCount":520,"integrity":"sha512-twvcFqbnoOjncFaKWHVbt8484sdvftoLkOKLHEBShEqULKRp7gFf+kS0N46I9XNP0hBj6WAm2vhbxmRMvE/fCQ==","signatures":[{"sig":"MEYCIQCGlgZRPp3ZrjYqi/rS1AmlNWZG7mV3z7Wb2J8FNbXejQIhANMU3HWm05+oReQZUqUKErMY33NAI3+i4Ygw8DzdbWIN","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":345770},"main":"build/main/index.js","module":"build/module/index.js","engines":{"node":">=12"},"gitHead":"8d36571157e4e5c56e4a8a83408ac4076bf0b898","scripts":{"dev":"ts-node -r tsconfig-paths/register test-cli-app/run","fix":"run-s fix:*","test":"run-s build test:*","build":"run-p build:*","prepack":"pinst --disable","prepare":"husky install","postpack":"pinst --enable","test:unit":"jest --silent=false --bail","build:main":"tsc -p tsconfig.main.json","fix:eslint":"eslint \"./src/**/*.ts\" \"./tests/**/*.ts\"  \"./test-cli-app/**/*.ts\" -c .eslintrc-final.json --fix","postinstall":"husky install","test:cspell":"cspell \"./{src,test-cli-app}/**/*.ts\" --no-progress","test:eslint":"eslint \"./src/**/*.ts\" \"./tests/**/*.ts\"  \"./test-cli-app/**/*.ts\" --quiet -c .eslintrc-final.json","watch:build":"tsc -p tsconfig.json -w","build:module":"tsc -p tsconfig.module.json","fix:prettier":"prettier --write \"./{src,tests,test-cli-app}/**/*.ts\"","test:typescript":"tsc -p tsconfig.json --noEmit"},"typings":"build/main/index.d.ts","_npmUser":{"name":"stepanzabelin","email":"stepanzabelin@gmail.com"},"repository":{"url":"git+https://github.com/stepanzabelin/clirio.git","type":"git"},"_npmVersion":"10.1.0","description":"Clirio is a mini framework for node.js command-line interfaces","directories":{},"_nodeVersion":"20.8.1","dependencies":{"reflect-metadata":"^0.1.13"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^27.4.7","husky":"^8.0.3","pinst":"^3.0.0","sinon":"^12.0.1","cspell":"^6.31.1","eslint":"^8.44.0","ts-jest":"^27.1.3","ts-node":"^10.9.1","prettier":"^3.0.0","typescript":"^4.5.4","@types/jest":"^27.4.0","@types/node":"^17.0.8","npm-run-all":"^4.1.5","@types/sinon":"^10.0.6","eslint-plugin-jest":"^27.2.3","eslint-plugin-import":"^2.22.0","eslint-config-prettier":"^6.11.0","eslint-plugin-prettier":"^5.0.0","@typescript-eslint/parser":"^5.54.1","eslint-plugin-unused-imports":"^3.0.0","eslint-plugin-eslint-comments":"^3.2.0","@typescript-eslint/eslint-plugin":"^5.54.1"},"_npmOperationalInternal":{"tmp":"tmp/clirio_3.0.1_1700999989608_0.42822846044350604","host":"s3://npm-registry-packages"}},"3.0.2":{"name":"clirio","version":"3.0.2","keywords":["cli","console","command","option","parser","argument","args","argv","terminal","shell","interface"],"author":{"name":"Stepan Zabelin"},"license":"MIT","_id":"clirio@3.0.2","maintainers":[{"name":"stepanzabelin","email":"stepanzabelin@gmail.com"}],"homepage":"https://github.com/stepanzabelin/clirio#readme","bugs":{"url":"https://github.com/stepanzabelin/clirio/issues"},"dist":{"shasum":"cbf4d183d7c06dc33f291eb14ff101faa92ae928","tarball":"https://registry.npmjs.org/clirio/-/clirio-3.0.2.tgz","fileCount":520,"integrity":"sha512-rNzcpZnw2w63XyioOuG6FR5iaYL1Yb08TkD6Jezp0woXwfQYJwfWfJHsPLie0FS76Zu574VLaTVhr836y8MZcw==","signatures":[{"sig":"MEYCIQCh4n1cocdkFOGF+SFId8e48JZw/KmbB7dggrA7kzGMpgIhALOM96UpKsChZAnD8HDuMDOPFWKHmszM8cfH/nU6zMez","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":346307},"main":"build/main/index.js","module":"build/module/index.js","engines":{"node":">=12"},"gitHead":"d2c4d6a487d06798f581ce230b6ac1afbc1ce846","scripts":{"dev":"ts-node -r tsconfig-paths/register test-cli-app/run","fix":"run-s fix:*","test":"run-s build test:*","build":"run-p build:*","prepack":"pinst --disable","prepare":"husky install","postpack":"pinst --enable","test:unit":"jest --silent=false --bail","build:main":"tsc -p tsconfig.main.json","fix:eslint":"eslint \"./src/**/*.ts\" \"./tests/**/*.ts\"  \"./test-cli-app/**/*.ts\" -c .eslintrc-final.json --fix","postinstall":"husky install","test:cspell":"cspell \"./{src,test-cli-app}/**/*.ts\" --no-progress","test:eslint":"eslint \"./src/**/*.ts\" \"./tests/**/*.ts\"  \"./test-cli-app/**/*.ts\" --quiet -c .eslintrc-final.json","watch:build":"tsc -p tsconfig.json -w","build:module":"tsc -p tsconfig.module.json","fix:prettier":"prettier --write \"./{src,tests,test-cli-app}/**/*.ts\"","test:typescript":"tsc -p tsconfig.json --noEmit"},"typings":"build/main/index.d.ts","_npmUser":{"name":"stepanzabelin","email":"stepanzabelin@gmail.com"},"repository":{"url":"git+https://github.com/stepanzabelin/clirio.git","type":"git"},"_npmVersion":"10.2.4","description":"Clirio is a mini framework for node.js command-line interfaces","directories":{},"_nodeVersion":"20.11.1","dependencies":{"reflect-metadata":"^0.1.13"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^27.4.7","husky":"^8.0.3","pinst":"^3.0.0","sinon":"^12.0.1","cspell":"^6.31.1","eslint":"^8.44.0","ts-jest":"^27.1.3","ts-node":"^10.9.1","prettier":"^3.0.0","typescript":"^4.5.4","@types/jest":"^27.4.0","@types/node":"^17.0.8","npm-run-all":"^4.1.5","@types/sinon":"^10.0.6","eslint-plugin-jest":"^27.2.3","eslint-plugin-import":"^2.22.0","eslint-config-prettier":"^6.11.0","eslint-plugin-prettier":"^5.0.0","@typescript-eslint/parser":"^5.54.1","eslint-plugin-unused-imports":"^3.0.0","eslint-plugin-eslint-comments":"^3.2.0","@typescript-eslint/eslint-plugin":"^5.54.1"},"_npmOperationalInternal":{"tmp":"tmp/clirio_3.0.2_1710588000208_0.3256814490937856","host":"s3://npm-registry-packages"}},"3.0.3":{"name":"clirio","version":"3.0.3","keywords":["cli","console","command","option","parser","argument","args","argv","terminal","shell","interface"],"author":{"name":"Stepan Zabelin"},"license":"MIT","_id":"clirio@3.0.3","maintainers":[{"name":"stepanzabelin","email":"stepanzabelin@gmail.com"}],"homepage":"https://github.com/stepanzabelin/clirio#readme","bugs":{"url":"https://github.com/stepanzabelin/clirio/issues"},"dist":{"shasum":"25270f889d437b280c8f9aad652dd91b62d668d0","tarball":"https://registry.npmjs.org/clirio/-/clirio-3.0.3.tgz","fileCount":520,"integrity":"sha512-N5LKRdGVKyGeLXHBbKp4mGxsLO7n2x0LFydDgTqOjY69mKpDHJ+I2IN61R2lCa4WK7ozCbXRn1ynfezm/Nfueg==","signatures":[{"sig":"MEUCIQDYy+4AG+MxwepbE485MijT+u9OpKfxSUzwesT3JubFxQIgFf9rPH5uFKu57qJQ3UneKPl6CcZd920cTLkxuZfvm1g=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":346273},"main":"build/main/index.js","module":"build/module/index.js","engines":{"node":">=12"},"gitHead":"183013034a86c9feec03931ed2f43f9564f9ca6e","scripts":{"dev":"ts-node -r tsconfig-paths/register test-cli-app/run","fix":"run-s fix:*","test":"run-s build test:*","build":"run-p build:*","prepack":"pinst --disable","prepare":"husky install","postpack":"pinst --enable","test:unit":"jest --silent=false --bail","build:main":"tsc -p tsconfig.main.json","fix:eslint":"eslint \"./src/**/*.ts\" \"./tests/**/*.ts\"  \"./test-cli-app/**/*.ts\" -c .eslintrc-final.json --fix","postinstall":"husky install","test:cspell":"cspell \"./{src,test-cli-app}/**/*.ts\" --no-progress","test:eslint":"eslint \"./src/**/*.ts\" \"./tests/**/*.ts\"  \"./test-cli-app/**/*.ts\" --quiet -c .eslintrc-final.json","watch:build":"tsc -p tsconfig.json -w","build:module":"tsc -p tsconfig.module.json","fix:prettier":"prettier --write \"./{src,tests,test-cli-app}/**/*.ts\"","test:typescript":"tsc -p tsconfig.json --noEmit"},"typings":"build/main/index.d.ts","_npmUser":{"name":"stepanzabelin","email":"stepanzabelin@gmail.com"},"repository":{"url":"git+https://github.com/stepanzabelin/clirio.git","type":"git"},"_npmVersion":"10.2.4","description":"Clirio is a mini framework for node.js command-line interfaces","directories":{},"_nodeVersion":"20.11.1","dependencies":{"reflect-metadata":"^0.1.13"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^27.4.7","husky":"^8.0.3","pinst":"^3.0.0","sinon":"^12.0.1","cspell":"^6.31.1","eslint":"^8.44.0","ts-jest":"^27.1.3","ts-node":"^10.9.1","prettier":"^3.0.0","typescript":"^4.5.4","@types/jest":"^27.4.0","@types/node":"^17.0.8","npm-run-all":"^4.1.5","@types/sinon":"^10.0.6","eslint-plugin-jest":"^27.2.3","eslint-plugin-import":"^2.22.0","eslint-config-prettier":"^6.11.0","eslint-plugin-prettier":"^5.0.0","@typescript-eslint/parser":"^5.54.1","eslint-plugin-unused-imports":"^3.0.0","eslint-plugin-eslint-comments":"^3.2.0","@typescript-eslint/eslint-plugin":"^5.54.1"},"_npmOperationalInternal":{"tmp":"tmp/clirio_3.0.3_1710588262090_0.8478243927745372","host":"s3://npm-registry-packages"}},"3.0.4":{"name":"clirio","version":"3.0.4","keywords":["cli","console","command","option","parser","argument","args","argv","terminal","shell","interface"],"author":{"name":"Stepan Zabelin"},"license":"MIT","_id":"clirio@3.0.4","maintainers":[{"name":"stepanzabelin","email":"stepanzabelin@gmail.com"}],"homepage":"https://github.com/stepanzabelin/clirio#readme","bugs":{"url":"https://github.com/stepanzabelin/clirio/issues"},"dist":{"shasum":"955ce4f9ff14105738138fddd6b34a393a258c0e","tarball":"https://registry.npmjs.org/clirio/-/clirio-3.0.4.tgz","fileCount":520,"integrity":"sha512-ssyx9lqAW3JvIql82eNk26480nBcKxkiouuAfD4vjYAmVH+x+HFuL8ZsNiswGIq8tOu8ezc7ZJwfDqvW02V13w==","signatures":[{"sig":"MEYCIQDAIiDAbLdQVBQm5+DYMuit+LDbqK0QR08uAaJoWBN6awIhAIg/Hosr6/9FYiK6/gAntNXd5HWH8qzlp+bgZXVTS4HP","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":346614},"main":"build/main/index.js","module":"build/module/index.js","engines":{"node":">=12"},"gitHead":"ad9b61b5c3309231ae92cd434375beab63eec7b0","scripts":{"dev":"ts-node -r tsconfig-paths/register test-cli-app/run","fix":"run-s fix:*","test":"run-s build test:*","build":"run-p build:*","prepack":"pinst --disable","prepare":"husky install","postpack":"pinst --enable","test:unit":"jest --silent=false --bail","build:main":"tsc -p tsconfig.main.json","fix:eslint":"eslint \"./src/**/*.ts\" \"./tests/**/*.ts\"  \"./test-cli-app/**/*.ts\" -c .eslintrc-final.json --fix","postinstall":"husky install","test:cspell":"cspell \"./{src,test-cli-app}/**/*.ts\" --no-progress","test:eslint":"eslint \"./src/**/*.ts\" \"./tests/**/*.ts\"  \"./test-cli-app/**/*.ts\" --quiet -c .eslintrc-final.json","watch:build":"tsc -p tsconfig.json -w","build:module":"tsc -p tsconfig.module.json","fix:prettier":"prettier --write \"./{src,tests,test-cli-app}/**/*.ts\"","test:typescript":"tsc -p tsconfig.json --noEmit"},"typings":"build/main/index.d.ts","_npmUser":{"name":"stepanzabelin","email":"stepanzabelin@gmail.com"},"repository":{"url":"git+https://github.com/stepanzabelin/clirio.git","type":"git"},"_npmVersion":"10.2.4","description":"Clirio is a mini framework for node.js command-line interfaces","directories":{},"_nodeVersion":"20.11.1","dependencies":{"reflect-metadata":"^0.1.13"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^27.4.7","husky":"^8.0.3","pinst":"^3.0.0","sinon":"^12.0.1","cspell":"^6.31.1","eslint":"^8.44.0","ts-jest":"^27.1.3","ts-node":"^10.9.1","prettier":"^3.0.0","typescript":"^4.5.4","@types/jest":"^27.4.0","@types/node":"^17.0.8","npm-run-all":"^4.1.5","@types/sinon":"^10.0.6","eslint-plugin-jest":"^27.2.3","eslint-plugin-import":"^2.22.0","eslint-config-prettier":"^6.11.0","eslint-plugin-prettier":"^5.0.0","@typescript-eslint/parser":"^5.54.1","eslint-plugin-unused-imports":"^3.0.0","eslint-plugin-eslint-comments":"^3.2.0","@typescript-eslint/eslint-plugin":"^5.54.1"},"_npmOperationalInternal":{"tmp":"tmp/clirio_3.0.4_1715429180021_0.17890154769529132","host":"s3://npm-registry-packages"}},"3.1.0":{"name":"clirio","version":"3.1.0","keywords":["cli","console","command","option","parser","argument","args","argv","terminal","shell","interface"],"author":{"name":"Stepan Zabelin"},"license":"MIT","_id":"clirio@3.1.0","maintainers":[{"name":"stepanzabelin","email":"stepanzabelin@gmail.com"}],"homepage":"https://github.com/stepanzabelin/clirio#readme","bugs":{"url":"https://github.com/stepanzabelin/clirio/issues"},"dist":{"shasum":"56cbefc85ab94f6ec5d8115429c58ee3e3445f14","tarball":"https://registry.npmjs.org/clirio/-/clirio-3.1.0.tgz","fileCount":684,"integrity":"sha512-6djAsclsjyLj02F/9u4MDSJHqqNNruiX0ArSI5vo42rte8ErqmgpfEHqVIbs08bKxZoTdmOe/68mcyB9H+/8MA==","signatures":[{"sig":"MEUCIQCL0+u2kn5UmU1/WP2PXGglegxVd50/JMm3q8CJ30IXQQIgLRc7o97H4WyvB9YcRWWryC+bxnyBZtFQdigpEmEGiSE=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":429275},"main":"build/main/index.js","types":"build/main/index.d.ts","module":"build/module/index.js","engines":{"node":">=12"},"gitHead":"f4a1f5ee4e85a688d37fdd719528601a212eccc2","scripts":{"dev":"ts-node -r tsconfig-paths/register test-cli-app/run","fix":"run-s fix:*","test":"run-s build test:*","build":"run-p build:*","prepack":"pinst --disable","prepare":"husky install","postpack":"pinst --enable","test:unit":"jest --silent=false --bail","build:main":"tsc -p tsconfig.main.json","fix:eslint":"eslint \"./src/**/*.ts\" \"./tests/**/*.ts\"  \"./test-cli-app/**/*.ts\" --fix","postinstall":"husky install","test:cspell":"cspell \"./{src,test-cli-app}/**/*.ts\" --no-progress","test:eslint":"eslint \"./src/**/*.ts\" \"./tests/**/*.ts\"  \"./test-cli-app/**/*.ts\" --quiet","watch:build":"tsc -p tsconfig.json -w","build:module":"tsc -p tsconfig.module.json","fix:prettier":"prettier --write \"./{src,tests,test-cli-app}/**/*.ts\"","test:typescript":"tsc -p tsconfig.json --noEmit"},"typings":"build/main/index.d.ts","_npmUser":{"name":"stepanzabelin","email":"stepanzabelin@gmail.com"},"repository":{"url":"git+https://github.com/stepanzabelin/clirio.git","type":"git"},"_npmVersion":"10.9.3","description":"Clirio is a mini framework for node.js command-line interfaces","directories":{},"_nodeVersion":"22.19.0","dependencies":{"reflect-metadata":"^0.2.2"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.7","husky":"^9","pinst":"^3.0.0","sinon":"^21","cspell":"^9","eslint":"^9","ts-jest":"^29.4","ts-node":"^10.9.1","prettier":"^3.0.0","typescript":"^5.8","@types/jest":"^29","@types/node":"^20","npm-run-all":"^4.1.5","@types/sinon":"^17","typescript-eslint":"^8","eslint-plugin-jest":"^29","eslint-plugin-import":"^2.32","eslint-config-prettier":"^10","eslint-plugin-prettier":"^5","@typescript-eslint/parser":"^5.54.1","eslint-plugin-unused-imports":"^4","eslint-plugin-eslint-comments":"^3.2.0","@typescript-eslint/eslint-plugin":"^5.54.1"},"_npmOperationalInternal":{"tmp":"tmp/clirio_3.1.0_1775920421425_0.6311751344671543","host":"s3://npm-registry-packages-npm-production"}},"4.0.0-alpha.0":{"name":"clirio","version":"4.0.0-alpha.0","keywords":["cli","console","command","option","parser","argument","args","argv","terminal","shell","interface"],"author":{"name":"Stepan Zabelin"},"license":"MIT","_id":"clirio@4.0.0-alpha.0","maintainers":[{"name":"stepanzabelin","email":"stepanzabelin@gmail.com"}],"homepage":"https://github.com/stepanzabelin/clirio#readme","bugs":{"url":"https://github.com/stepanzabelin/clirio/issues"},"dist":{"shasum":"5bcf337e49a565f471ba022ef4a371df005dc528","tarball":"https://registry.npmjs.org/clirio/-/clirio-4.0.0-alpha.0.tgz","fileCount":653,"integrity":"sha512-gXtVG4/1wdct5jNVjeJJRg1HLUl8/mOYPFHexXnlo21fwIAT1otdQ4smKV2lESnHb0QNCQ/Le1rYPUl/2EXZ8w==","signatures":[{"sig":"MEUCIBE6fZWH7+O3qMHqT3Cef7QN38cxdL9ZoayC/jQ1aVFsAiEAjC/yQEFxkmsBOzLIWvTYtl6ZqnzoebprKFwGqIKof4U=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":429532},"main":"build/main/index.js","types":"build/main/index.d.ts","module":"build/module/index.js","engines":{"node":">=22.13.0"},"gitHead":"bc320f8d07a98a3abb5622d811ff9776e6154609","scripts":{"dev":"ts-node -r tsconfig-paths/register test-cli-app/run","fix":"run-s \"fix:*\"","test":"run-s build \"test:*\"","build":"run-s clean build:compile","clean":"node -e \"const fs=require('fs'); if (fs.existsSync('build')) (fs.rmSync ? fs.rmSync('build', { recursive: true, force: true }) : fs.rmdirSync('build', { recursive: true }))\"","prepack":"run-s build","prepare":"husky","test:unit":"jest --silent=false --bail","build:main":"tsc -p tsconfig.main.json","fix:eslint":"eslint \"./src/**/*.ts\" \"./tests/**/*.ts\"  \"./test-cli-app/**/*.ts\" --fix","test:cspell":"cspell \"./{src,test-cli-app}/**/*.ts\" --no-progress","test:eslint":"eslint \"./src/**/*.ts\" \"./tests/**/*.ts\"  \"./test-cli-app/**/*.ts\" --quiet","watch:build":"tsc -p tsconfig.json -w","build:module":"tsc -p tsconfig.module.json","fix:prettier":"prettier --write \"./{src,tests,test-cli-app}/**/*.ts\"","test:package":"node scripts/check-package-entry.cjs","build:compile":"run-p build:main build:module","test:typescript":"tsc -p tsconfig.json --noEmit"},"typings":"build/main/index.d.ts","_npmUser":{"name":"stepanzabelin","email":"stepanzabelin@gmail.com"},"repository":{"url":"git+https://github.com/stepanzabelin/clirio.git","type":"git"},"_npmVersion":"10.9.3","description":"Clirio is a mini framework for node.js command-line interfaces","directories":{},"resolutions":{"glob@npm:^10.4.1":"npm:13.0.6","glob@npm:^10.5.0":"npm:13.0.6","test-exclude@npm:^6.0.0":"npm:7.0.1"},"_nodeVersion":"22.19.0","dependencies":{"reflect-metadata":"^0.2.2"},"_hasShrinkwrap":false,"packageManager":"yarn@4.17.0","readmeFilename":"README.md","devDependencies":{"jest":"^30.4.2","husky":"^9.1.7","sinon":"^22.0.0","cspell":"^10.0.1","eslint":"^10.6.0","globals":"^17.7.0","ts-jest":"^29.4.11","ts-node":"^10.9.2","prettier":"^3.9.4","@eslint/js":"^10.0.1","typescript":"^6.0.3","@types/jest":"^30.0.0","@types/node":"^26.1.0","@types/sinon":"^22.0.0","npm-run-all2":"^8.0.4","@eslint/compat":"^2.1.0","tsconfig-paths":"^4.2.0","typescript-eslint":"^8.62.1","eslint-plugin-jest":"^29.15.4","eslint-config-prettier":"^10.1.8","eslint-plugin-import-x":"^4.17.1","eslint-plugin-prettier":"^5.5.6","@typescript-eslint/parser":"^8.62.1","eslint-plugin-eslint-comments":"^3.2.0","@typescript-eslint/eslint-plugin":"^8.62.1"},"_npmOperationalInternal":{"tmp":"tmp/clirio_4.0.0-alpha.0_1783269713595_0.7265611722223198","host":"s3://npm-registry-packages-npm-production"}},"4.0.0":{"name":"clirio","version":"4.0.0","description":"Clirio is a mini framework for node.js command-line interfaces","main":"build/main/index.js","types":"build/main/index.d.ts","typings":"build/main/index.d.ts","module":"build/module/index.js","repository":{"type":"git","url":"git+https://github.com/stepanzabelin/clirio.git"},"license":"MIT","packageManager":"yarn@4.17.0","keywords":["cli","console","command","option","parser","argument","args","argv","terminal","shell","interface"],"author":{"name":"Stepan Zabelin"},"scripts":{"clean":"node -e \"const fs=require('fs'); if (fs.existsSync('build')) (fs.rmSync ? fs.rmSync('build', { recursive: true, force: true }) : fs.rmdirSync('build', { recursive: true }))\"","build":"run-s clean build:compile","build:compile":"run-p build:main build:module","build:main":"tsc -p tsconfig.main.json","build:module":"tsc -p tsconfig.module.json","watch:build":"tsc -p tsconfig.json -w","fix:prettier":"prettier --write \"./{src,tests,test-cli-app}/**/*.ts\"","fix:eslint":"eslint \"./src/**/*.ts\" \"./tests/**/*.ts\"  \"./test-cli-app/**/*.ts\" --fix","fix":"run-s \"fix:*\"","test:eslint":"eslint \"./src/**/*.ts\" \"./tests/**/*.ts\"  \"./test-cli-app/**/*.ts\" --quiet","test:typescript":"tsc -p tsconfig.json --noEmit","test:cspell":"cspell \"./{src,test-cli-app}/**/*.ts\" --no-progress","test:unit":"jest --silent=false --bail","test:package":"node scripts/check-package-entry.cjs","test":"run-s build \"test:*\"","prepack":"run-s build","prepare":"husky","dev":"ts-node -r tsconfig-paths/register test-cli-app/run"},"engines":{"node":">=22.13.0"},"dependencies":{"reflect-metadata":"^0.2.2"},"devDependencies":{"@eslint/compat":"^2.1.0","@eslint/js":"^10.0.1","@types/jest":"^30.0.0","@types/node":"^26.1.0","@types/sinon":"^22.0.0","@typescript-eslint/eslint-plugin":"^8.62.1","@typescript-eslint/parser":"^8.62.1","cspell":"^10.0.1","eslint":"^10.6.0","eslint-config-prettier":"^10.1.8","eslint-plugin-eslint-comments":"^3.2.0","eslint-plugin-import-x":"^4.17.1","eslint-plugin-jest":"^29.15.4","eslint-plugin-prettier":"^5.5.6","globals":"^17.7.0","husky":"^9.1.7","jest":"^30.4.2","npm-run-all2":"^8.0.4","prettier":"^3.9.4","sinon":"^22.0.0","ts-jest":"^29.4.11","ts-node":"^10.9.2","tsconfig-paths":"^4.2.0","typescript":"^6.0.3","typescript-eslint":"^8.62.1"},"resolutions":{"glob@npm:^10.4.1":"npm:13.0.6","glob@npm:^10.5.0":"npm:13.0.6","test-exclude@npm:^6.0.0":"npm:7.0.1"},"_id":"clirio@4.0.0","gitHead":"bc320f8d07a98a3abb5622d811ff9776e6154609","bugs":{"url":"https://github.com/stepanzabelin/clirio/issues"},"homepage":"https://github.com/stepanzabelin/clirio#readme","_nodeVersion":"22.19.0","_npmVersion":"10.9.3","dist":{"integrity":"sha512-Wv46pqFtQcaZFD88YpICpaM0pdWdTpONs+egVC4w3r1AzoO8FFtne98hz4WYim4nDQ5NyuVZl1eWYhZpGWUXZg==","shasum":"578a9cc0a5fe425b95d4b4e45ac254fa856baf1d","tarball":"https://registry.npmjs.org/clirio/-/clirio-4.0.0.tgz","fileCount":653,"unpackedSize":429524,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEQCIFGaVITJtK/v+DVRiFTDwNmYciCE0OW8rchWdizV7MckAiBb7VQHu/9/bo8x0NZo3AyICjuRZcDX9S+XNdVcOVsmeQ=="}]},"_npmUser":{"name":"stepanzabelin","email":"stepanzabelin@gmail.com"},"directories":{},"maintainers":[{"name":"stepanzabelin","email":"stepanzabelin@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/clirio_4.0.0_1783362282128_0.15518359658571912"},"_hasShrinkwrap":false}},"time":{"created":"2022-02-15T17:19:33.950Z","modified":"2026-07-06T18:24:42.374Z","0.0.1":"2022-02-07T21:08:08.319Z","0.0.2":"2022-02-15T17:19:34.150Z","0.0.3":"2022-02-15T17:59:13.893Z","0.0.4":"2022-02-15T20:08:45.422Z","0.0.5":"2022-02-15T20:24:41.582Z","0.0.6":"2022-02-15T20:33:59.501Z","0.0.7":"2022-02-16T19:05:16.677Z","0.0.8":"2022-02-16T19:52:06.365Z","0.0.9":"2022-02-16T21:15:06.040Z","0.0.10":"2022-02-16T21:15:46.762Z","0.0.11":"2022-02-17T18:22:49.686Z","0.0.12":"2022-02-17T21:46:39.577Z","0.0.14":"2022-02-18T17:36:05.560Z","0.1.0":"2022-02-19T11:09:34.588Z","1.0.0-alpha.1":"2023-08-02T19:36:30.375Z","1.0.0-alpha.2":"2023-08-03T18:42:54.799Z","1.0.0-alpha.3":"2023-08-04T16:37:18.197Z","1.0.0-alpha.4":"2023-08-05T10:02:25.418Z","1.0.0":"2023-08-05T20:12:12.955Z","1.1.0":"2023-08-21T20:48:40.679Z","1.2.0":"2023-08-25T16:46:02.572Z","2.0.0-dev.1":"2023-08-27T10:15:09.389Z","2.0.0":"2023-09-29T19:25:56.059Z","2.0.1":"2023-10-01T11:14:31.025Z","3.0.0-dev.1":"2023-11-12T22:01:02.946Z","3.0.0-dev.2":"2023-11-13T19:21:36.337Z","3.0.0":"2023-11-13T22:27:22.806Z","3.0.1":"2023-11-26T11:59:49.859Z","3.0.2":"2024-03-16T11:20:00.417Z","3.0.3":"2024-03-16T11:24:22.321Z","3.0.4":"2024-05-11T12:06:20.210Z","3.1.0":"2026-04-11T15:13:41.612Z","4.0.0-alpha.0":"2026-07-05T16:41:53.739Z","4.0.0":"2026-07-06T18:24:42.272Z"},"bugs":{"url":"https://github.com/stepanzabelin/clirio/issues"},"author":{"name":"Stepan Zabelin"},"license":"MIT","homepage":"https://github.com/stepanzabelin/clirio#readme","keywords":["cli","console","command","option","parser","argument","args","argv","terminal","shell","interface"],"repository":{"type":"git","url":"git+https://github.com/stepanzabelin/clirio.git"},"description":"Clirio is a mini framework for node.js command-line interfaces","maintainers":[{"name":"stepanzabelin","email":"stepanzabelin@gmail.com"}],"readme":"# Clirio\n\nA mini framework for Node.js command-line interfaces built around TypeScript, decorators, and DTOs\n\nClirio is a routing and data-control library for terminal commands. It helps you describe CLI commands as modules and actions, map raw input into typed DTOs, and keep validation and transformation close to the place where a command is handled. In that sense, it can be used as an alternative to tools like [commander](https://www.npmjs.com/package/commander), [args](https://www.npmjs.com/package/args), [argparse](https://www.npmjs.com/package/argparse) and others.\n\nThe [author](https://github.com/stepanzabelin) is inspired by [angular](https://github.com/angular) and [nestjs](https://github.com/nestjs/nest)\n\nYou can also combine Clirio with interactive command-line libraries such as [inquirer](https://www.npmjs.com/package/inquirer), [terminal-kit](https://www.npmjs.com/package/terminal-kit), [chalk](https://www.npmjs.com/package/chalk), and others.\n\nThe Clirio starter kit is [here](https://github.com/stepanzabelin/clirio-starter-kit)\n\n![Demo](./docs/demo.gif)\n\n#### Table of Contents\n\n- [Clirio](#clirio)\n  - [Installation](#installation)\n  - [Quick Start](#quick-start)\n  - [Starter kit](#starter-kit)\n  - [Definitions](#definitions)\n  - [Parsing args](#parsing-args)\n  - [App configuration](#app-configuration)\n  - [Modules](#modules)\n  - [Actions](#actions)\n    - [Command patterns](#command-patterns)\n    - [Empty command](#empty-command)\n    - [Failure command](#failure-command)\n  - [Data control](#data-control)\n    - [Params](#params-data-control)\n    - [Options](#options-data-control)\n    - [Envs](#envs-data-control)\n  - [Input DTO](#input-dto)\n    - [Validation](#validation)\n    - [Transformation](#transformation)\n  - [Pipes](#pipes)\n  - [Exceptions](#exceptions)\n  - [Filters](#filters)\n  - [Displaying help](#displaying-help)\n    - [Clirio Helper](#clirio-helper)\n    - [Hidden commands](#hidden-commands)\n  - [Displaying Version](#displaying-version)\n  - [Clirio API](#clirio-api)\n    - [setConfig](#setconfig)\n    - [setGlobalPipe](#setglobalpipe)\n    - [setGlobalFilter](#setglobalfilter)\n    - [addModule](#addmodule)\n    - [setModules](#setmodules)\n    - [execute](#execute)\n  - [Clirio utils](#clirio-utils)\n    - [valid](#cliriovalid)\n    - [form](#clirioform)\n    - [parse](#clirioparse)\n    - [describe](#cliriodescribe)\n  - [Decorators](#decorators)\n    - [Command](#command-decorator)\n    - [Empty](#empty-decorator)\n    - [Env](#env-decorator)\n    - [Envs](#envs-decorator)\n    - [Filter](#filter-decorator)\n    - [Failure](#failure-decorator)\n    - [Helper](#helper-decorator)\n    - [Module](#module-decorator)\n    - [Option](#option-decorator)\n    - [Options](#options-decorator)\n    - [Param](#param-decorator)\n    - [Params](#params-decorator)\n    - [Pipe](#pipe-decorator)\n    - [Transform](#transform-decorator)\n    - [Validate](#validate-decorator)\n\n## Installation\n\n```bash\nnpm install clirio\n\n```\n\n```bash\nyarn add clirio\n\n```\n\n## Quick Start\n\nThere are 3 easy steps to build a Clirio app.\n\nThe example below emulates the `git status` CLI command with options.\n\n1. Create a DTO to describe input options\n\n```ts\nimport { Option } from 'clirio';\n\nclass GitStatusDto {\n  @Option('--branch, -b')\n  readonly branch?: string;\n\n  @Option('--ignore-submodules')\n  readonly ignoreSubmodules?: string;\n\n  @Option('--short, -s')\n  readonly short?: null;\n}\n```\n\n2. Create a module to group related commands\n\n```ts\nimport { Module, Command, Options } from 'clirio';\n\n@Module()\nexport class GitModule {\n  @Command('git status')\n  public status(@Options() options: GitStatusDto) {\n    // handled data is available here\n    console.log(options);\n  }\n}\n```\n\n3. Configure the main class\n\n```ts\nimport { Clirio } from 'clirio';\n\nconst clirio = new Clirio();\nclirio.addModule(GitModule);\nclirio.execute();\n```\n\n##### Result\n\n```bash\n$ my-cli git status -b master --ignore-submodules  all --short\n```\n\nThe command `git status` will be routed to the `GitModule.status` method.\n\n```console\n{ branch: 'master', ignoreSubmodules: 'all', short: null }\n```\n\nAt this point you can use the received data in your own application logic.\n\nThe implementation of your own CLI entrypoint (for example `my-cli`) is described in the [starter kit](https://github.com/stepanzabelin/clirio-starter-kit)\n\n\n#### The way with typing, validation, transformation\n\nThe `GitStatusOptionsDto` entity can be made stricter with validation and transformation rules.\n\n\n```ts\nimport { Clirio, Option, Validate, Transform } from 'clirio';\n\nclass GitStatusOptionsDto {\n  @Option('--branch, -b')\n  @Validate(Clirio.valid.STRING)\n  readonly branch: string;\n\n  @Option('--ignore-submodules, -i')\n  @Validate((v) => ['none', 'untracked', 'dirty', 'all'].includes(v))\n  readonly ignoreSubmodules: 'none' | 'untracked' | 'dirty' | 'all';\n\n  @Option('--short, -s')\n  @Transform(Clirio.form.FLAG)\n  readonly short: boolean;\n}\n```\n\n```ts\n@Module()\nexport class GitModule {\n  @Command('git status')\n  public status(@Options() options: GitStatusOptionsDto) {\n    // \"options\" has already been typed, validated, and transformed here\n    console.log(`branch: ${options.branch}`);\n    console.log(`ignoreSubmodules: ${options.ignoreSubmodules}`);\n    console.log(`short: ${options.short}`);\n  }\n}\n```\n\n##### Result\n\n```bash\n$ my-cli git status -b master --ignore-submodules  all --short\n```\n\n```console\n  branch: master\n  ignoreSubmodules: all\n  short: true\n```\n\nThe details are described below.\n\n## Starter kit\n\nClirio is designed in a way that works well with SOLID-style architecture, OOP, dependency injection, and other common application patterns.\n\nThe **[Clirio starter kit](https://github.com/stepanzabelin/clirio-starter-kit)** contains a recommended project setup, but you can also integrate Clirio with your own libraries, containers, and custom decorators.\n\n## Definitions\n\nThe anatomy of a shell CLI is described in [wiki](https://en.wikipedia.org/wiki/Command-line_interface#Anatomy_of_a_shell_CLI)\n\nThe following definitions are used throughout the Clirio documentation.\n\n##### Bash example\n\n```bash\n$  node migration-cli.js run 123556 -u user -p pass --db=\"db-name\"\n```\n\n##### The incoming command-line\n\n| node migration-cli.js | run 123556 -u user -p pass --db=\"db-name\" |\n| :-------------------: | :---------------------------------------: |\n|      launch path      |                 arguments                 |\n\n##### The parsed command-line\n\n| node migration-cli.js | run 123556 | -u user -p pass --db=\"db-name\" |\n| :-------------------: | :--------: | :----------------------------: |\n|      launch path      |  command   |            options             |\n\n##### The matched command-line\n\n| node migration-cli.js |  run   | 123556 | -u user | -p pass | --db=\"db-name\" |\n| :-------------------: | :----: | :----: | :-----: | :-----: | :------------: |\n|      launch path      | action | param  | option  | option  |     option     |\n\n##### Arguments Definition\n\n\"Arguments\" are all space-separated command-line parts after `launch path`\n\n##### Command Definition\n\n\"Command\" is the space-separated part of the input without leading dashes\n\n##### Params Definition\n\n\"Params\" are values obtained by matching a command against a command pattern\n\n##### Options Definition\n\n\"Options\" are named command-line inputs that start with one or more leading dashes.\n\nAn option can be a key-value pair or a standalone key:\n\n`--name=Alex`, `--name Alex`, `-n Alex`, `--version`, `-v`\n\nA long option starts with `--` and keeps the full key, for example `--ignore-submodules`. A short option starts with `-` and uses one-character keys, for example `-v`.\n\n##### Grouped short options\n\nShort options can be grouped.\n\n`-abc` is parsed as three short options: `-a`, `-b`, and `-c`.\n\nIf a grouped short option is followed by a value, that value belongs to the last key in the group:\n\n```bash\n$ my-cli run -abc value\n```\n\n| option | value   |\n| ------ | ------- |\n| `a`    | `null`  |\n| `b`    | `null`  |\n| `c`    | `value` |\n\n## Parsing args\n\nThis is how Clirio parses a command-line:\n\n```ts\nClirio.parse('test --foo 15 -b -a -r 22');\n```\n\n```ts\nClirio.describe(['test', '--foo=15', '-b', '-a', '-r', '22']);\n```\n\nResult:\n\n```json\n[\n  { \"type\": \"action\", \"key\": 0, \"value\": \"test\" },\n  { \"type\": \"option\", \"key\": \"foo\", \"value\": \"15\" },\n  { \"type\": \"option\", \"key\": \"b\", \"value\": null },\n  { \"type\": \"option\", \"key\": \"a\", \"value\": null },\n  { \"type\": \"option\", \"key\": \"r\", \"value\": \"22\" }\n]\n```\n\nAnother example:\n\n```bash\n$ my-cli set-time 10:56 --format=AM -ei 15\n```\n\n| type   | key      | value      |\n| ------ | -------- | ---------- |\n| action | 0        | \"set-time\" |\n| action | 1        | \"10:56\"    |\n| option | \"format\" | \"AM\"       |\n| option | \"e\"      | null       |\n| option | \"i\"      | \"15\"       |\n\n##### Summary\n\n- all parts of the command-line without a leading dash will be described as actions\n- any action has keys as a numerical index in ascending order\n- any standalone option has the raw value `null`\n- any option starting with a single dash is split into one-character short options\n- a value after grouped short options belongs to the last short option\n- all options are parsed into key-value entries\n- the raw value of any options can be a `string` or `null`\n\n## App configuration\n\nThe application usually consists of the following parts:\n\n1. the main class: `Clirio`\n2. modules: custom classes or their instances\n3. actions: methods in those modules decorated with Clirio decorators\n\n`Clirio` is the main class. It configures the application and links modules together.\n\n```ts\nconst cli = new Clirio();\ncli.setModules([HelloModule, CommonModule, GitModule, MigrationModule]);\ncli.execute();\n```\n\nModules can be instantiated manually if you want to plug in dependency injection.\n\n```ts\ncli.setModules([\n  HelloModule,\n  new CommonModule(),\n  diContainer.resolve(CommonModule),\n]);\n```\n\nAn example of that setup is available in the [starter kit](https://github.com/stepanzabelin/clirio-starter-kit)\n\n## Modules\n\nClirio modules are custom classes marked with the `@Module()` decorator. You can think of them as controllers for your CLI.\nAn application can have one module or many. Each module contains actions that describe command patterns.\n\nUsing a single common module:\n\n```ts\n@Module()\nexport class CommonModule {\n  @Command('hello there')\n  public helloThere() {\n    // ...\n  }\n\n  @Command('migration run')\n  public migrationRun() {\n    // ...\n  }\n}\n```\n\nAs a result, 2 commands will be available:\n\n```bash\n$ my-cli hello there\n$ my-cli migration run\n```\n\nUsing multiple modules helps separate unrelated commands and keep the code organized:\n\n```ts\n@Module('hello')\nexport class HelloModule {\n  @Command('there')\n  public helloThere() {\n    // ...\n  }\n}\n\n@Module('migration')\nexport class MigrationModule {\n  @Command('run')\n  public run() {\n    // ...\n  }\n}\n```\n\n## Actions\n\nClirio actions are methods inside modules decorated with Clirio action decorators.\n\n```ts\n@Module()\nexport class HelloModule {\n  @Command('hello')\n  public helloThere() {\n    console.log('Hello! It works!');\n  }\n\n  @Command('bye')\n  public help() {\n    console.log('Bye! See you later');\n  }\n\n  @Empty()\n  public empty() {\n    console.log(chalk.yellow('You have not entered anything'));\n  }\n\n  @Failure()\n  public failure() {\n    console.log(chalk.red('You have entered a non-existent command'));\n  }\n}\n```\n\n### Command patterns\n\nThe `@Command()` decorator is used to define a command pattern.\n\n```ts\n@Module()\nexport class MigrationModule {\n  @Command('init')\n  public initMigration() {}\n\n  @Command('migration run|up')\n  public runMigration() {}\n\n  @Command('migration to <name>')\n  public migrateTo() {}\n\n  @Command('migration merge <name1> <name2>')\n  public mergeMigrations() {}\n\n  @Command('migration delete <...names>')\n  public deleteMigrations() {}\n}\n```\n\nThe final pattern is built from `@Module(...)` and `@Command(...)`, then matched against the command-line.\n\nA pattern can consist of one or more space-separated arguments.\n\n##### Case 1. Exact match\n\nThe exact command will be matched.\n\n```ts\n  @Command('hello')\n  @Command('hello my friends')\n```\n\n| Command pattern  | Matching command-line |\n| ---------------- | --------------------- |\n| hello            | hello                 |\n| hello there      | hello there           |\n| hello my friends | hello my friends      |\n\n##### Case 2. Match variants\n\nUse the `|` operator to set match variants. Multiple command-lines can be routed to the same action. The number of space-separated parts must stay the same.\n\n```ts\n  @Command('migration run|up')\n  @Command('hello|hey|hi')\n```\n\n| Command pattern   | Matching command-line          |\n| ----------------- | ------------------------------ |\n| migration run\\|up | migration run<br> migration up |\n| hello\\|hey\\|hi    | hello<br> hey<br> hi           |\n\n##### Case 3. Pattern with value masks\n\nUse the `< >` operator to mark a position that can contain any value. The number of space-separated parts must still match.\n\n```ts\n  @Command('hello <first-name> <last-name>')\n  @Command('set-time <time>')\n```\n\n| Command pattern                    | Matching command-line                                                |\n| ---------------------------------- | -------------------------------------------------------------------- |\n| hello \\<first-name\\> \\<last-name\\> | hello Alex Smith<br>hello John Anderson<br> ... etc.                 |\n| set-time \\<time\\>                  | set-time 11:50<br> set-time now<br> set-time 1232343545<br> ... etc. |\n\nUse [Params data control](#params-data-control) to receive those values in a DTO.\n\n##### Case 4. Pattern with rest values mask\n\nUse the `<... >` operator to capture an array of values.\nOnly one rest mask can appear in a command pattern, and it must be at the end.\n\n```ts\n  @Command('hello <...all-names>')\n  @Command('get cities <...cities>')\n```\n\n| Command pattern          | Matching command-line                                               |\n| ------------------------ | ------------------------------------------------------------------- |\n| hello \\<...all-names\\>   | hello Alex John Sarah Arthur<br/> hello Max<br> ... etc.            |\n| get cities \\<...cities\\> | get cities Prague New-York Moscow<br>get cities Berlin<br> ... etc. |\n\nUse [Params data control](#params-data-control) to get the entered values\n\n##### Case 5. Option match\n\nThis pattern is designed for special cases such as \"help\" and \"version\". It performs an exact match against an option-style command. Match variants can be separated by commas.\n\n```ts\n  @Command('--help, -h')\n  @Command('--mode=check')\n```\n\n| Command pattern | Matching command-line |\n| --------------- | --------------------- |\n| --help, -h      | --help<br/> -h        |\n| --version, -v   | --version<br/> -v     |\n| --mode=check    | --mode=check          |\n\nUse [Options data control](#options-data-control) if you want that command to accept additional options.\nTo avoid ambiguous matching, do not mix this pattern with other kinds of command patterns.\n\n## Empty command\n\nThe `@Empty()` action decorator lets a module handle the case when nothing is entered.\nEach module can declare its own `@Empty()` action.\n\n```ts\n@Module()\nexport class CommonModule {\n  @Command('hello')\n  public hello() {}\n\n  @Empty()\n  public empty() {\n    console.log(\"You haven't entered anything\");\n  }\n}\n```\n\n```bash\n$ my-cli\n```\n\n```console\nYou haven't entered anything\n```\n\nWhen a module has a command prefix, empty handlers are matched and ranked by that prefix.\n\n```ts\n@Module('migration')\nexport class MigrationModule {\n  @Command('init')\n  public initMigration() {}\n\n  @Empty()\n  public empty() {\n    console.log(\n      'The migration module requires additional instruction. Type --help',\n    );\n  }\n}\n```\n\n```bash\n$ my-cli migration\n```\n\n```console\nThe migration module requires additional instruction. Type --help\n```\n\n### Failure command\n\nThe `@Failure()` action decorator lets a module handle the case when command patterns do not match.\n\nEach module can declare its own `@Failure()` action.\n\nIf this decorator is not specified, Clirio throws a default error.\n\n```ts\n@Module()\nexport class CommonModule {\n  @Command('hello')\n  public hello() {}\n\n  @Failure()\n  public failure() {\n    console.log('There is no such a command!');\n  }\n}\n```\n\n```bash\n$ my-cli goodbye\n```\n\n```console\nThere is no such a command!\n```\n\nWhen a module has a command prefix, failure handlers are matched and ranked by that prefix.\n\n```ts\n@Module('migration')\nexport class MigrationModule {\n  @Command('init')\n  public initMigration() {}\n\n  @Failure()\n  public failure() {\n    console.log('The migration module got the wrong instruction');\n  }\n}\n```\n\n```bash\n$ my-cli migration stop\n```\n\n```console\nThe migration module got the wrong instruction\n```\n\n## Data control\n\nClirio uses [parameter decorators](https://www.typescriptlang.org/docs/handbook/decorators.html) to control input data.\nThe `@Params()` and `@Options()` decorators are provided for this purpose.\n\n```ts\n@Module()\nexport class LocatorModule {\n  @Command('get-location <city>')\n  public getLocation(@Params() params: unknown, @Options() options: unknown) {\n    console.log(params);\n    console.log(options);\n  }\n}\n```\n\n```bash\n$ my-cli get-location Prague --format=DMS --verbose\n```\n\n```console\n{ city: \"Prague\" }\n{ format: \"DMS\", verbose: null }\n```\n\n### Params data control\n\nTo handle incoming data in a typed way, use DTOs instead of `unknown`.\n\n### Params DTO\n\nThe `@Param()` decorator is provided for DTO properties. It can take the name of a param mask and map it to a DTO property.\n\n```ts\nexport class HelloParamsDto {\n  @Param('first-name')\n  readonly firstName?: string;\n\n  @Param('last-name')\n  readonly lastName?: string;\n}\n```\n\n```ts\n@Module()\nexport class HelloModule {\n  @Command('hello <first-name> <last-name>')\n  public hello(@Params() params: HelloParamsDto) {\n    console.log(params);\n  }\n}\n```\n\nHere the second and third parts of the command-line are value masks.\nThe `hello` method will be called when the user enters a three-part command. The last two parts are passed into the params DTO.\n\n```bash\n$ my-cli hello Alex Smith\n```\n\n```console\n{ firstName: \"Alex\", lastName: \"Smith\" }\n```\n\nThe `@Param()` decorator can be used without arguments. In that case, DTO properties are mapped to input keys with the same name.\nIf the `@Param()` decorator is absent, no mapping is performed for that property.\n\n```ts\nexport class HelloParamsDto {\n  @Param()\n  readonly 'first-name'?: string;\n\n  @Param()\n  readonly 'last-name'?: string;\n}\n```\n\n```bash\n$ my-cli hello Alex Smith\n```\n\n```console\n{ \"first-name\": \"Alex\", \"last-name\": \"Smith\" }\n```\n\n##### Example with the rest values mask\n\n```ts\n@Module()\nexport class GitModule {\n  @Command('git add <...all-files>')\n  public add(@Params() params: AddParamsDto) {\n    // Type checking works for \"params\" variable\n    console.log(params.allFiles);\n  }\n}\n```\n\n```ts\nclass AddParamsDto {\n  @Param('all-files')\n  readonly allFiles: string[];\n}\n```\n\n```bash\n$ my-cli git add test.txt logo.png\n```\n\n```console\n{ allFiles: ['test.txt', 'logo.png'] }\n```\n\n### Options data control\n\nThe `@Options()` decorator is provided for command options.\n\n```ts\n@Module()\nexport class GitModule {\n  @Command('git status')\n  public status(@Options() options: GitStatusOptionsDto) {\n    console.log(options);\n  }\n}\n```\n\n### Options DTO\n\nThe `@Option()` decorator is provided for DTO properties. It can accept comma-separated key aliases and map them to a DTO property.\n\n```ts\nimport { Clirio, Option, Transform } from 'clirio';\n\nclass GitStatusOptionsDto {\n  @Option('--branch, -b')\n  readonly branch?: string;\n\n  @Option('--ignore-submodules, -i')\n  readonly ignoreSubmodules?: string;\n\n  @Option('--short, -s')\n  @Transform(Clirio.form.FLAG)\n  readonly short?: boolean;\n}\n```\n\n```bash\n$ my-cli git status --branch=master --ignore-submodules=all --short\n\n$ my-cli git status --branch master --ignore-submodules all --short\n\n$ my-cli git status -b master -i all -s\n\n```\n\nEach of these inputs leads to the same result:\n\n```console\n{ branch: 'master', ignoreSubmodules: 'all', short: true }\n```\n\nIf the `@Option()` decorator is absent, no mapping is performed for that property.\n\n```bash\n$ my-cli git status --branch=master --ignore-submodules=all --short\n```\n\n```console\n{ branch: 'master', 'ignore-submodules': 'all', short: null }\n```\n\n## Input DTO\n\nDTOs used to control input can have Clirio decorators such as `@Param()`, `@Option()`, `@Env()`, `@Validate()`, and `@Transform()`. You can also add your own metadata decorators if a pipe needs to read that metadata later.\nBefore validation and transformation, every incoming value is one of the following raw forms:\n\n```ts\ntype Value = string | null | (string | null)[];\n```\n\nFor every matched command, Clirio prepares controlled input in this order:\n\n1. Raw params, options, and envs are mapped to DTO property names.\n2. `@Validate()` checks run on the raw property value.\n3. `@Transform()` runs and replaces the property value with the returned value.\n4. Pipes receive the transformed DTO object.\n5. The action receives the values returned by the pipes.\n\n##### example of data control (options and params)\n\n```ts\n@Module()\nexport class SomeModule {\n  @Command('set-limit <limit>')\n  public setLimit(\n    @Params() params: SetLimitParamsDto,\n    @Options() options: SetLimitOptionDto,\n  ) {\n    console.log(params);\n    console.log(options);\n  }\n}\n```\n\nClirio provides the `@Validate()` and `@Transform()` decorators.\nIn this example they are used on DTO properties such as `SetLimitParamsDto` and `SetLimitOptionDto`.\n\n```ts\nimport { Option, Validate, Transform } from 'clirio';\nimport { MyCustomDecorator } from 'src/my-decorators';\n\nclass SetLimitParamsDto {\n  @Param('limit')\n  @Validate((v) => /^[0-9]+$/.test(String(v))) // accept digits only\n  @Transform((v) => Number(v)) // transform string to number\n  @MyCustomDecorator() // can be handled later in a pipe\n  readonly limit: number;\n}\n```\n\n### Envs data control\n\nThe `@Envs()` decorator is provided for environment variables.\n\n```ts\nimport { Envs } from 'clirio';\n\n@Module('migration')\nexport class MigrationModule {\n  @Command('test-connect')\n  public testConnect(@Envs() envs: TestConnectEnvsDto) {\n    // ...\n  }\n}\n```\n\n### Envs DTO\n\nThe `@Env()` decorator is provided for DTO properties.\n\n```ts\nimport { Env } from 'clirio';\n\nexport class TestConnectEnvsDto {\n  @Env('DB_HOST')\n  readonly host: string;\n\n  @Env('DB_PORT')\n  @Transform((v) => Number(v))\n  readonly port: number;\n\n  @Env('DB_USER')\n  readonly user: string;\n\n  @Env('DB_PASSWORD')\n  readonly password: string;\n}\n```\n\n### Validation\n\nThe `@Validate()` decorator is provided to check input params, options, and envs.\nIt should be used on DTO properties together with `@Option()`, `@Param()`, or `@Env()`, depending on the kind of controlled data.\nValidation runs before transformation, so validators receive raw CLI values such as strings, `null`, `undefined`, or arrays.\nValidation never changes the value. For example, `Clirio.valid.NUMBER` can accept `\"15\"`, but the action still receives `\"15\"` unless you also add a transform.\n`@Validate()` accepts either a single function or an array of functions. The functions are executed from left to right, and each one must return `boolean` or `null`:\n\n- if a function returns `false`, Clirio throws a validation error immediately\n- if a function returns `null`, Clirio moves on to the next validator in the chain\n- if a function returns `true`, the validation chain for that property stops successfully\n\nThis makes validator order important. Guard validators such as `OPTIONAL` and `NULLABLE` should usually come before stricter validators such as `STRING` or `NUMBER`.\n\n```ts\nimport { Module, Command, Options } from 'clirio';\n\n@Module()\nexport class GitModule {\n  @Command('git status')\n  public status(@Options() options: GitStatusDto) {\n    console.log(options);\n  }\n}\n```\n\n```ts\nimport { Clirio, Option, Transform, Validate } from 'clirio';\n\nclass GitStatusDto {\n  @Option('--branch, -b')\n  @Validate((v) => typeof v === 'string')\n  readonly branch: string;\n\n  @Option('--ignore-submodules')\n  @Validate(\n    (v) => v === undefined || ['none', 'untracked', 'dirty', 'all'].includes(v),\n  )\n  readonly ignoreSubmodules?: 'none' | 'untracked' | 'dirty' | 'all';\n\n  @Option('--short, -s')\n  @Transform(Clirio.form.FLAG)\n  readonly short?: boolean;\n}\n```\n\n```bash\n$ my-cli git status --ignore-submodules\n```\n\n```console\nThe \"branch\" option is wrong\n```\n\nFor every failed validation, Clirio throws the same error shape: `The \"%KEY_NAME%\" %DATA_TYPE% is wrong`\n\nThe error is thrown as a `ClirioValidationError` with `dataType` and `propertyName`, so filters and callers can distinguish whether the problem came from params, options, or envs.\n\nTo have more flexible validations, use [Pipes](#pipes).\n\nYou can [configure](#setconfig) unknown option handling. If `allowUncontrolledOptions` is set to `false`, any option key that is not declared in the DTO will cause an `INVALID_OPTIONS` error.\n\n##### Validation of an optional key\n\n```ts\nclass OptionsDto {\n  @Option('--id')\n  @Validate([\n    (v) => (v === undefined ? true : null),\n    (v) => /^[0-9]+$/.test(String(v)),\n  ])\n  readonly id?: string;\n}\n```\n\n##### Using built-in checks\n\n```ts\nclass OptionsDto {\n  @Option('--id')\n  @Validate([Clirio.valid.OPTIONAL, Clirio.valid.NUMBER])\n  readonly id?: string;\n}\n```\n\n##### Validation of nullable key\n\n```ts\nclass OptionsDto {\n  @Option('--type')\n  @Validate([Clirio.valid.NULLABLE, Clirio.valid.STRING])\n  readonly type: string | null;\n}\n```\n\n##### Validation of a required key\n\n```ts\nclass OptionsDto {\n  @Option('--name')\n  @Validate([Clirio.valid.REQUIRED, Clirio.valid.STRING])\n  readonly name!: string;\n}\n```\n\nSee [Clirio.valid](#cliriovalid)\n\n## Transformation\n\nThe `@Transform()` decorator is provided to transform input data.\n\nIt should be used on DTO properties together with `@Option()`, `@Param()`, or `@Env()`, depending on the kind of controlled data.\n\n`@Transform()` takes a transform function as an argument.\nTransformation runs after validation. The transform function receives the validated raw value for that property, and its return value becomes the value passed to pipes and actions.\n\nUse one `@Transform()` per property. If a value needs several transformation steps, compose them in one function or move the logic into a [pipe](#pipes).\n\n```ts\nimport { Option, Param, Transform } from 'clirio';\n\nclass SetAutoParamsDto {\n  @Param()\n  @Transform((v) => v.toUpperCase())\n  readonly model: string;\n\n  @Param('speed-limit')\n  @Transform((v) => Number(v))\n  readonly speedLimit: number;\n}\n\nclass SetAutoOptionsDto {\n  @Option('--turbo')\n  @Transform((v) => v === null || v === 'yes')\n  readonly turbo: boolean;\n}\n\n```\n\n```ts\nimport { Module, Command, Options, Params } from 'clirio';\n\n@Module('auto')\nexport class AutoModule {\n  @Command('set <model> <speed-limit>')\n  public set(\n    @Params() params: SetAutoParamsDto,\n    @Options() options: SetAutoOptionsDto,\n  ) {\n    console.log(params);\n    console.log(options);\n  }\n}\n```\n\n```bash\n$ my-cli auto set bmw 300 --turbo=yes\n```\n\n```console\n{ model: 'BMW', speedLimit: 300 }\n{ turbo: true }\n```\n\n##### Summation and concatenation\n\n```ts\n@Module()\nexport class SumModule {\n  @Command('sum <first> <second>')\n  public sum(@Params() params: SumParamsDto) {\n    console.log(params.first + params.second);\n  }\n}\n```\n\nWithout transformation\n\n```ts\nclass SumParamsDto {\n  @Param()\n  readonly first: unknown;\n\n  @Param()\n  readonly second: unknown;\n}\n```\n\n```bash\n$ my-cli sum 5 15\n```\n\n```console\n'515'\n```\n\nWith transformation\n\n```ts\nclass SumParamsDto {\n  @Param()\n  @Transform((v) => Number(v))\n  readonly first: number;\n\n  @Param()\n  @Transform((v) => Number(v))\n  readonly second: number;\n}\n```\n\n```bash\n$ my-cli sum 5 15\n```\n\n```console\n20\n```\n\n##### Using built-in forms\n\n```ts\nclass SumParamsDto {\n  @Param()\n  @Transform(Clirio.form.NUMBER)\n  readonly first: number;\n}\n```\n\n```ts\nclass SetAutoOptionsDto {\n  @Option('--turbo')\n  @Transform(Clirio.form.FLAG)\n  readonly turbo: boolean;\n}\n```\n\nSee [Clirio.form](#clirioform)\n\n## Pipes\n\nPipes are processors for controlled data: params, options, and envs. They are useful when property-level `@Validate()` or `@Transform()` is too small for the job.\n\nUse a pipe when:\n\n- a rule depends on several fields, for example `--force` cannot be used together with `--dry-run`\n- you need to normalize the whole DTO object\n- you want to read metadata from your own decorators\n- the same validation or transformation should be reused for many commands\n\nA pipe runs after DTO property validation and transformation. If an action receives both `@Params()` and `@Options()`, the same pipe can be called once for params and once for options. Use `input.dataType` to know which object is being processed.\n\nThe `transform()` method receives the current DTO object and must return the object that should be passed to the action. Throw an error to stop command execution.\n\n```ts\nimport { ClirioPipe, PipeContext, ClirioValidationError } from 'clirio';\n\nexport class MigrationUpPipe implements ClirioPipe {\n  transform(data: any, input: PipeContext): any | never {\n    if (input.dataType === 'params') {\n      // validation\n      if (!/^[0-9]+$/.test(data.migrationId)) {\n        throw new ClirioValidationError('the \"migration-id\" param is not a number', {\n          dataType: input.dataType,\n          propertyName: 'migrationId',\n        });\n      }\n\n      // transformation string to number\n      return { migrationId: Number(data.migrationId) };\n    }\n\n    return data;\n  }\n}\n```\n\nThe `PipeContext` argument contains:\n\n| Field      | Meaning                                                             |\n| ---------- | ------------------------------------------------------------------- |\n| `dataType` | `params`, `options`, or `envs`                                      |\n| `entity`   | the DTO class being processed                                       |\n| `scope`    | `global` or `action`, depending on where the pipe was attached      |\n\n`input.entity` is useful for advanced pipes that read reflection data from the DTO class, including metadata from your own decorators.\n\nThe `@Pipe()` decorator is provided for attaching pipes to an action.\n\n##### Example\n\n```ts\nimport { Param } from 'clirio';\n\nexport class MigrationUpParamsDto {\n  @Param('migration-id')\n  readonly migrationId!: string;\n}\n```\n\n```ts\nimport { Command, Module, Params, Pipe } from 'clirio';\n\n@Module()\nexport class MigrationModule {\n  @Command('migration up <migration-id>')\n  @Pipe(MigrationUpPipe)\n  public up(@Params() params: MigrationUpParamsDto) {\n    console.log(params);\n  }\n}\n```\n\n```bash\n$ my-cli migration up 15\n```\n\n```console\n{ migrationId: 15 }\n```\n\n##### Processing several input types\n\nThe same pipe can process params, options, and envs. Clirio calls the pipe separately for each controlled input object, and `input.dataType` tells the pipe which object it is handling now.\n\n```ts\nimport { ClirioPipe, PipeContext, ClirioValidationError } from 'clirio';\n\nexport class MigrationPipe implements ClirioPipe {\n  transform(data: any, input: PipeContext): any | never {\n    // controlled params\n    if (input.dataType === 'params') {\n      // validation\n      if (!/^[0-9]+$/.test(data.migrationId)) {\n        throw new ClirioValidationError('the \"migration-id\" param is not a number', {\n          dataType: input.dataType,\n          propertyName: 'migrationId',\n        });\n      }\n\n      // transformation\n      return {\n        ...data,\n        migrationId: Number(data.migrationId),\n      };\n    }\n\n    // controlled options\n    if (input.dataType === 'options') {\n      // validation\n      if (data.force && data.dryRun) {\n        throw new ClirioValidationError(\n          'options \"--force\" and \"--dry-run\" cannot be used together',\n          {\n            dataType: input.dataType,\n            propertyName: 'force',\n          },\n        );\n      }\n\n      // transformation\n      return {\n        ...data,\n        env: String(data.env ?? 'local').toLowerCase(),\n      };\n    }\n\n    return data;\n  }\n}\n```\n\nIf a method receives both `@Params()` and `@Options()`, the pipe result for params is passed to the params argument, and the pipe result for options is passed to the options argument.\n\nYou can add pipes to each action or apply them globally to all commands.\nIf several pipes are applied, they run in sequence. The next pipe receives the result returned by the previous one.\nGlobal pipes run before action-level pipes. If needed, `@Pipe(SomePipe, { overwriteGlobal: true })` can be used to disable the global pipe for a specific action.\n\n### Example of a global pipe\n\n```ts\nconst cli = new Clirio();\ncli.addModule(MigrationModule);\ncli.setGlobalPipe(CommonPipe);\ncli.execute();\n```\n\n## Exceptions\n\nExceptions can be thrown in pipes or actions. Clirio also provides special exception classes that make it easier to communicate CLI-friendly errors.\n\n- ClirioValidationError\n- ClirioCommonError\n\n```ts\nimport { Module, Command, ClirioCommonError } from 'clirio';\n\n@Module()\nexport class CommonModule {\n  @Command('check')\n  public check() {\n    throw new ClirioCommonError('Not working!', { code: 'CUSTOM_ERR_CODE' });\n  }\n}\n```\n\n```ts\nimport { Clirio, ClirioValidationError, ClirioCommonError } from 'clirio';\n\nconst cli = new Clirio();\ncli.setModules([GitModule]);\ncli.execute().catch((err) => {\n  if (err instanceof ClirioValidationError) {\n    console.log('Validation error', err.message);\n    process.exit(9);\n  }\n\n  if (err instanceof ClirioCommonError) {\n    console.log('Common error', err.message);\n    process.exit(5);\n  }\n\n  console.log('unknown error', err.message);\n  process.exit(1);\n});\n```\n\n## Filters\n\nFilters are designed to catch exceptions raised by actions, pipes, validation, or explicit application logic.\n\n```ts\n@Module('ping')\nexport class PingModule {\n  @Command('pong')\n  @Filter(PingPongFilter)\n  public pong() {\n    throw new ClirioCommonError('Not working!', { code: 'CUSTOM_ERR_CODE' });\n  }\n}\n```\n\n```ts\nimport {\n  ClirioCommonError,\n  ClirioFilter,\n  ClirioValidationError,\n  FilterContext,\n} from 'clirio';\n\nexport class PingPongFilter implements ClirioFilter {\n  catch(\n    error: Error | ClirioCommonError | ClirioValidationError,\n    context: FilterContext,\n  ): void | never {\n    if (error instanceof ClirioValidationError) {\n      console.log('Validation error', error.message);\n      process.exit(9);\n    }\n\n    if (error instanceof ClirioCommonError) {\n      console.log('Common error', error.message);\n      process.exit(5);\n    }\n\n    console.log('unknown error', error.message);\n    process.exit(1);\n  }\n}\n```\n\nYou can add filters to each action or apply them globally to all actions at once.\nIf both global and action-level filters are used, they run in sequence. A filter can handle the current error, rethrow it, or throw a different error.\nIf needed, `@Filter(SomeFilter, { overwriteGlobal: true })` can be used to disable the global filter for a specific action.\n\n### Example of a global filter\n\n```ts\nconst cli = new Clirio();\ncli.addModule(MigrationModule);\ncli.setGlobalFilter(CommonFilter);\ncli.execute();\n```\n\n## Displaying help\n\nClirio also supports special commands expressed as options, which is useful for things like help and version output.\n\n```ts\n@Module()\nexport class CommonModule {\n  @Command('--help')\n  public help() {\n    console.log('Description of commands is here');\n  }\n}\n```\n\n```bash\n$ my-cli --help\n```\n\n```console\nDescription of commands is here\n```\n\nYou can implement other option-style commands in the same way.\n\n```ts\n@Command('-m, --man')\n\n@Command('help|h')\n\n@Command('man <command>')\n```\n\n### Clirio Helper\n\nThe `@Helper()` decorator is provided to handle help mode.\n\n```ts\nimport { Module, Command, Helper, ClirioHelper } from 'clirio';\n\n@Module()\nexport class CommonModule {\n  @Command('hello there', {\n    description: 'Say hello there',\n  })\n  public helloThere() {\n    // ...\n  }\n\n  @Command('-h, --help')\n  public help(@Helper() helper: ClirioHelper) {\n    const dump = helper.dumpAll();\n    console.log(ClirioHelper.formatDump(dump));\n  }\n}\n```\n\n```bash\n$ my-cli --help\n```\n\nThe `ClirioHelper` class provides an API for collecting command descriptions and formatting them.\n\nThe `dumpAll` method returns descriptions for all commands. You can format that data yourself or pass it to `ClirioHelper.formatDump`.\n\n### Displaying help in a particular module\n\nThe `dumpThisModule` method returns the description for the current module.\n\n```ts\n@Module('ping')\nexport class PingModule {\n  @Command('test')\n  public test() {\n    console.log('ping test');\n  }\n\n  @Command('-h, --help')\n  public help(@Helper() helper: ClirioHelper) {\n    const dump = helper.dumpThisModule();\n    console.log(ClirioHelper.formatDump(dump));\n  }\n}\n```\n\n```bash\n$ my-cli ping --help\n```\n\n### Hidden commands\n\nThe `hidden` option in the `Command()` decorator hides a command from generated help output.\n\n```ts\nimport { Module, Command } from 'clirio';\n\n@Module()\nexport class Module {\n  @Command('debug', { hidden: true })\n  public debug() {\n    // ...\n  }\n\n  @Command('hello there', {\n    description: 'Say hello there',\n  })\n  public helloThere() {\n    // ...\n  }\n}\n```\n\nIn this case, `ClirioHelper.formatDump` will omit the `debug` command from help output.\n\n## Displaying Version\n\n```ts\nimport { Module, Command } from 'clirio';\n\n@Module()\nexport class CommonModule {\n  @Command('-v, --version')\n  public version() {\n    console.log('1.3.1');\n  }\n}\n```\n\n```bash\n$ my-cli --version\n```\n\n```console\n1.3.1\n```\n\n## Clirio API\n\n### setConfig\n\nSets the global configuration.\n\n**Parameters:**\n\n- config: Object\n\n**Returns:**\n\n- Clirio\n\n```ts\ncli.setConfig({\n  allowUncontrolledOptions: false,\n});\n```\n\n| Param                    |                                            Description                                             | Default |\n| ------------------------ | :------------------------------------------------------------------------------------------------: | ------: |\n| allowUncontrolledOptions | If `false`, any option key that is not declared in the DTO causes an `INVALID_OPTIONS` error |    true |\n\n### setGlobalPipe\n\nSets a global pipe.\n\n**Parameters:**\n\n- pipe: ClirioPipe\n\n**Returns:**\n\n- Clirio\n\n```ts\ncli.setGlobalPipe(CommonPipe);\n```\n\n### setGlobalFilter\n\nSets a global filter.\n\n**Parameters:**\n\n- pipe: ClirioFilter\n\n**Returns:**\n\n- Clirio\n\n```ts\ncli.setGlobalFilter(CommonFilter);\n```\n\n### addModule\n\nAdds one module.\n\n**Parameters:**\n\n- module: Constructor | Constructor['prototype']\n\n**Returns:**\n\n- Clirio\n\n```ts\ncli.addModule(PingModule);\ncli.addModule(new MigrationModule());\n```\n\n### setModules\n\nSets several modules at once.\n\n**Parameters:**\n\n- modules (Constructor | Constructor['prototype'])[]\n\n**Returns:**\n\n- Clirio\n\n```ts\ncli.setModules([HelloModule, new MigrationModule()]);\n```\n\n### setArgs\n\nThere is no separate `setArgs()` method. To pass arguments manually, call `execute(args)`.\n\nBy default Clirio reads arguments from `process.argv.slice(2)`, but for testing and debugging you can pass them directly.\n\n**Parameters:**\n\n- args: string[]\n\n**Returns:**\n\n- Clirio\n\n```ts\nawait cli.execute(['git', 'add', 'test.txt', 'logo.png']);\n```\n\n### execute\n\nLaunches the Clirio app.\n\n**Parameters:**\n\n`args?: string[]`\n\n**Returns:**\n\n- Promise<void>\n\n```ts\nawait cli.execute();\n```\n\n## Clirio utils\n\nThe `Clirio` class also exposes static methods and helpers.\n\n### Clirio.valid\n\nAn object of built-in check functions for [validation](#validation).\n\n```ts\nClirio.valid.BOOLEAN;\nClirio.valid.NUMBER;\n```\n\n| Key       | Checks if the value is                                                                                 |\n| --------- | ------------------------------------------------------------------------------------------------------ |\n| OPTIONAL  | `undefined`; returns `true` for `undefined`, otherwise returns `null` so the next validator can run     |\n| REQUIRED  | present; returns `false` for `undefined` or `null`, otherwise returns `null`                           |\n| NULLABLE  | `null`; returns `true` for `null`, otherwise returns `null`                                            |\n| NULL      | exactly `null`                                                                                         |\n| NUMBER    | a number that is not `NaN`, or a string that `Number(value)` can convert to a non-`NaN` number         |\n| INTEGER   | an integer number; numeric strings such as `\"15\"` are not accepted                                     |\n| STRING    | `string`                                                                                               |\n| BOOLEAN   | `boolean`, `\"true\"`, or `\"false\"`                                                                      |\n| FLAG      | `null`, `\"true\"`, or `\"false\"`                                                                         |\n| KEY_VALUE | a `key` or `key=value` string, `null`, or an array of those values; empty strings are not accepted      |\n\n`OPTIONAL`, `REQUIRED`, and `NULLABLE` are especially useful as guard validators at the start of a validation chain.\n\n##### example\n\n```ts\nexport class MigrationRunOptionsDto {\n  @Option('--id')\n  @Validate(Clirio.valid.NUMBER)\n  readonly id: string;\n\n  @Option('--start-date, -b')\n  @Validate([Clirio.valid.NULLABLE, Clirio.valid.STRING])\n  readonly startDate: string | null;\n}\n```\n\n### Clirio.form\n\n```ts\nClirio.form.BOOLEAN;\nClirio.form.NUMBER;\n```\n\nAn object of built-in functions for [transformation](#transformation).\n\n| Key       | transforms into                                                                                         |\n| --------- | ------------------------------------------------------------------------------------------------------- |\n| NUMBER    | `number` using `Number(value) || 0`; invalid and empty values become `0`                                |\n| STRING    | `string` using `String(value ?? '')`                                                                    |\n| BOOLEAN   | JavaScript boolean coercion using `Boolean(value)`                                                      |\n| FLAG      | `true` for `null` and `\"true\"`, `false` for every other value                                           |\n| KEY_VALUE | an `object` built from one or more `key` or `key=value` entries; missing values become `null`           |\n| ARRAY     | `[]` for `undefined`, the same array for arrays, or a one-item array for any other value                |\n| PLAIN     | the first item for arrays, otherwise the original `string`, `null`, or `undefined` value                |\n\n##### Flag values\n\nA standalone option is parsed as raw `null`, not as raw `true`:\n\n```bash\n$ my-cli git status --short\n```\n\n```console\n{ short: null }\n```\n\nUse `Clirio.form.FLAG` when the command handler should receive a boolean flag. It converts raw `null` and `\"true\"` into `true`; every other value, including `\"false\"` and `undefined`, becomes `false`.\n\n`Clirio.form.BOOLEAN` uses normal JavaScript coercion, so for example `\"false\"` becomes `true`.\n\n##### example\n\n```ts\nexport class MigrationRunOptionsDto {\n  @Option('--env, -e')\n  @Transform(Clirio.form.KEY_VALUE)\n  readonly envs: Record<string, string>;\n\n  // always an array\n  @Option('--id, -i')\n  @Transform(Clirio.form.ARRAY)\n  readonly ids: string[];\n\n  // always a primitive type\n  @Option('-f, --format')\n  @Transform(Clirio.form.PLAIN)\n  readonly format: string;\n}\n```\n\n### Clirio.parse\n\nParses and describes the command-line.\n\nUse `Clirio.parse()` when you have the raw command line as a string and want the parsed structure shown above.\n\n**Parameters:**\n\n- commandLine: string\n\n**Returns:**\n\n```ts\nArray<\n  | {\n      type: 'option';\n      key: string;\n      value: string | null;\n    }\n  | {\n      type: 'action';\n      key: number;\n      value: string;\n    }\n>;\n```\n\n```ts\nClirio.parse('foo -a --bbb');\n```\n\n### Clirio.describe\n\nDescribes already-split arguments of the command-line.\n\n**Parameters:**\n\n- args: string[]\n\n**Returns:**\n\n```ts\nArray<{\n  type: ArgType;\n  key: string;\n  value: string | null;\n}>;\n```\n\n```ts\nClirio.describe(['foo', '-a', '--bbb']);\n```\n\n## Decorators\n\nClirio works with decorators. You can read more about TypeScript decorators [here](https://www.typescriptlang.org/docs/handbook/decorators.html).\n\n### \"Command\" decorator\n\nThe `@Command()` decorator specifies [the command pattern](#command-patterns).\n\n**Parameters:**\n\n- command: string [optional] - command pattern\n- options: object [optional] - extra options\n  - options.description: string [optional] - description for the help mode\n  - options.hidden: boolean [optional]- hiding the action in the help mode\n\n### \"Empty\" decorator\n\nThe `@Empty()` decorator catches the case when [nothing is entered](#empty-command).\n\n### \"Env\" decorator\n\nThe `@Env()` decorator maps DTO properties in an [Envs DTO](#envs-dto).\n\n### \"Envs\" decorator\n\nThe `@Envs()` decorator controls [environment variables](#envs-data-control).\n\n**Parameters:**\nno parameters\n\n### \"Filter\" decorator\n\nThe `@Filter()` decorator catches [exceptions](#exceptions) raised by actions or pipes.\n\n**Parameters:**\n- filter: ClirioFilter\n- options: object [optional]\n  - options.overwriteGlobal: boolean [optional] - disables the global filter for this action\n\n### \"Failure\" decorator\n\nThe `@Failure()` decorator catches the case when the specified command patterns [don't match](#failure-command).\n\n**Parameters:**\nno parameters\n\n### \"Helper\" decorator\n\nThe `@Helper()` decorator handles [help mode](#displaying-help).\n\n**Parameters:**\nno parameters\n\n### \"Module\" decorator\n\nThe `@Module()` decorator turns a class into a module used to [configure a Clirio app](#app-configuration).\n\n**Parameters:**\n\n- command: string [optional] - command prefix\n- options: object [optional] - extra options\n  - options.description: string [optional] - description for the help mode\n  - options.hidden: boolean [optional] - hiding the module in the help mode\n\n### \"Option\" decorator\n\nThe `@Option()` decorator maps DTO properties in an [options DTO](#options-dto).\n\n**Parameters:**\n\n- key: string [optional] - comma separated key aliases\n- options: object [optional] - extra options\n  - options.description: string [optional] - description for the help mode\n  - options.hidden: boolean [optional] - hiding the option in the help mode\n\n### \"Options\" decorator\n\nThe `@Options()` decorator controls [input options](#options-data-control).\n\n**Parameters:**\nno parameters\n\n### \"Param\" decorator\n\nThe `@Param()` decorator maps DTO properties in a [params DTO](#params-dto).\n\n**Parameters:**\n\n- key: string [optional] - param mask key\n- options: object [optional] - extra options\n  - options.description: string [optional] - description for the help mode\n  - options.hidden: boolean [optional] - hiding the param in the help mode\n\n### \"Params\" decorator\n\nThe `@Params()` decorator controls [input params](#params-data-control).\n\n**Parameters:**\nno parameters\n\n### \"Pipe\" decorator\n\nThe `@Pipe()` decorator [validates and transforms](#pipes) controlled data.\n\n**Parameters:**\n\n- pipe: ClirioPipe\n- options: object [optional]\n  - options.overwriteGlobal: boolean [optional] - disables the global pipe for this action\n\n### \"Transform\" decorator\n\nThe `@Transform()` decorator [transforms](#transformation) input data.\n\n**Parameters:**\n\n- value: a transform function\n  - `(value: any) => any`\n\n### Validate decorator\n\nThe `@Validate()` decorator [validates](#validation) input data.\n\n**Parameters:**\n\n- value: a validation function or an array of validation functions\n  - `(value: any) => boolean | null`\n","readmeFilename":"README.md"}