├── .dockerignore ├── .github └── PULL_REQUEST_TEMPLATE.md ├── .gitignore ├── .npmignore ├── .vscode └── launch.json ├── LICENSE ├── README.md ├── azure-pipelines.yml ├── docker ├── Dockerfile.node10 ├── Dockerfile.node12 ├── Dockerfile.node6 ├── Dockerfile.node8 └── README.md ├── package-lock.json ├── package.json ├── src ├── Cpass.ts ├── index.ts └── utils │ ├── common.ts │ ├── encryptor.ts │ ├── machineId.ts │ └── networkId.ts ├── test ├── .mocharc.json ├── manual │ └── basic.ts └── test.spec.ts ├── tsconfig.json └── tslint.json /.dockerignore: -------------------------------------------------------------------------------- 1 | node_modules/ -------------------------------------------------------------------------------- /.github/PULL_REQUEST_TEMPLATE.md: -------------------------------------------------------------------------------- 1 | When submitting a PR, please make sure you to: 2 | 3 | - submit the PR to the `dev` branch, **not** the `master` branch 4 | - in the body, reference the issue that it closes by number in the format `Closes #000` 5 | - provide brief description of introduced enhancements 6 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules/ 2 | dist/ 3 | -------------------------------------------------------------------------------- /.npmignore: -------------------------------------------------------------------------------- 1 | !dist/ 2 | .github/ 3 | .vscode/ 4 | test/ 5 | src/ 6 | docker/ 7 | tsconfig.json 8 | tslint.json 9 | .dockerignore 10 | azure-pipelines.yml 11 | -------------------------------------------------------------------------------- /.vscode/launch.json: -------------------------------------------------------------------------------- 1 | { 2 | // Use IntelliSense to learn about possible attributes. 3 | // Hover to view descriptions of existing attributes. 4 | // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 5 | "version": "0.2.0", 6 | "configurations": [ 7 | { 8 | "name": "Current TS File", 9 | "type": "node", 10 | "request": "launch", 11 | "program": "${workspaceRoot}/node_modules/ts-node/dist/bin.js", 12 | "args": ["${relativeFile}"], 13 | "cwd": "${workspaceRoot}", 14 | "protocol": "inspector" 15 | }, { 16 | "name": "Current TS Tests File", 17 | "type": "node", 18 | "request": "launch", 19 | "program": "${workspaceRoot}/node_modules/mocha/bin/_mocha", 20 | "args": ["-r", "ts-node/register", "${relativeFile}"], 21 | "cwd": "${workspaceRoot}", 22 | "protocol": "inspector" 23 | } 24 | ] 25 | } -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2017 Andrew Koltyakov 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # cpass - simplified secured password two-ways encryption 2 | 3 | [![NPM](https://nodei.co/npm/cpass.png?mini=true&downloads=true&downloadRank=true&stars=true)](https://nodei.co/npm/cpass/) 4 | 5 | [![npm version](https://badge.fury.io/js/cpass.svg)](https://badge.fury.io/js/cpass) 6 | [![Downloads](https://img.shields.io/npm/dm/cpass.svg)](https://www.npmjs.com/package/cpass) 7 | [![Build Status](https://dev.azure.com/koltyakov/SPNode/_apis/build/status/cpass?branchName=master)](https://dev.azure.com/koltyakov/SPNode/_build/latest?definitionId=5&branchName=master) 8 | 9 | > Encrypts password to some sort of a 'secure string' to be stored in text configs to reduce risks of a silly leak. 10 | 11 | Decripts a 'secure string' to plain password. 12 | 13 | ## Installation 14 | 15 | ```bash 16 | npm install cpass 17 | ``` 18 | 19 | ## Usage 20 | 21 | ### JavaScript 22 | 23 | ```javascript 24 | const Cpass = require('cpass').Cpass; 25 | const cpass = new Cpass(); 26 | 27 | const password = 'password'; 28 | 29 | const secured = cpass.encode(password); 30 | // secured: "40bbb043608f54d....MhKghXTcaR2A//yNXg==" - is unique on different machines 31 | 32 | const unsecured = cpass.decode(secured); 33 | // unsecured: 'password' 34 | ``` 35 | 36 | ### TypeScript 37 | 38 | ```javascript 39 | import { Cpass } from 'cpass'; 40 | const cpass = new Cpass(); 41 | 42 | const password = 'password'; 43 | 44 | const secured = cpass.encode(password); 45 | // secured: "40bbb043608f54d....MhKghXTcaR2A//yNXg==" - is unique on different machines 46 | 47 | const unsecured = cpass.decode(secured); 48 | // unsecured: 'password' 49 | ``` 50 | 51 | Decoding plain text will return it back: 52 | 53 | ```javascript 54 | const plainText = 'plain (not encoded text)'; 55 | const decodedText = cpass.decode(plainText); 56 | // decodedText: 'plain (not encoded text)' 57 | // plainText === decodedText 58 | ``` 59 | 60 | ### Encryption with master key 61 | 62 | ```javascript 63 | import { Cpass } from 'cpass'; 64 | const cpass = new Cpass('MasterKey'); 65 | ``` 66 | 67 | ## Tests 68 | 69 | ### Local run 70 | 71 | ```bash 72 | npm run test 73 | ``` 74 | 75 | ### Run in Docker for specific Node.js version 76 | 77 | ```bash 78 | # Build an image 79 | docker build -f ./docker/Dockerfile.node8 -t cpass.node8 . 80 | # Run tests 81 | docker run cpass.node8 82 | ``` 83 | 84 | ## Comments 85 | 86 | This module is not for a real security purposes. Just for 'dummy hackers' secure and minifying risks of any password storage in a plain form. 87 | 88 | Once encoded, the password secured form can be decoded only on the same machine, but the logic behind this is very straightforward. 89 | -------------------------------------------------------------------------------- /azure-pipelines.yml: -------------------------------------------------------------------------------- 1 | trigger: 2 | - master 3 | - dev 4 | 5 | pool: 6 | vmImage: 'ubuntu-latest' 7 | strategy: 8 | matrix: 9 | # node_8_x: 10 | # node_version: 8.x 11 | node_10_x: 12 | node_version: 10.x 13 | node_12_x: 14 | node_version: 12.x 15 | node_14_x: 16 | node_version: 14.x 17 | 18 | steps: 19 | - task: NodeTool@0 20 | inputs: 21 | versionSpec: $(node_version) 22 | displayName: 'Install Node.js' 23 | 24 | - script: | 25 | npm ci 26 | npm run build 27 | displayName: 'Dependencies & Build' 28 | 29 | - script: npm run test 30 | displayName: 'Run tests' 31 | -------------------------------------------------------------------------------- /docker/Dockerfile.node10: -------------------------------------------------------------------------------- 1 | FROM node:10.16.3-alpine 2 | WORKDIR /usr/src/app 3 | COPY package.json /usr/src/app 4 | RUN npm install 5 | COPY . /usr/src/app 6 | EXPOSE 3000 7 | CMD ["npm", "run", "test"] -------------------------------------------------------------------------------- /docker/Dockerfile.node12: -------------------------------------------------------------------------------- 1 | FROM node:12.10.0-alpine 2 | WORKDIR /usr/src/app 3 | COPY package.json /usr/src/app 4 | RUN npm install 5 | COPY . /usr/src/app 6 | EXPOSE 3000 7 | CMD ["npm", "run", "test"] -------------------------------------------------------------------------------- /docker/Dockerfile.node6: -------------------------------------------------------------------------------- 1 | FROM node:6.11.2-alpine 2 | WORKDIR /usr/src/app 3 | COPY package.json /usr/src/app 4 | RUN npm install 5 | COPY . /usr/src/app 6 | EXPOSE 3000 7 | CMD ["npm", "run", "test"] -------------------------------------------------------------------------------- /docker/Dockerfile.node8: -------------------------------------------------------------------------------- 1 | FROM node:8.16.1-alpine 2 | WORKDIR /usr/src/app 3 | COPY package.json /usr/src/app 4 | RUN npm install 5 | COPY . /usr/src/app 6 | EXPOSE 3000 7 | CMD ["npm", "run", "test"] -------------------------------------------------------------------------------- /docker/README.md: -------------------------------------------------------------------------------- 1 | 2 | # CPASS 3 | 4 | ## Test with Docker 5 | 6 | ### In project root folder 7 | 8 | Go to `cpass` root folder, not `./docker` 9 | 10 | ### Build image 11 | 12 | ```bash 13 | docker build -f ./docker/Dockerfile.node8 -t cpass.node8 . 14 | ``` 15 | 16 | ### Run container && Tests 17 | 18 | ```bash 19 | docker run cpass.node8 20 | ``` 21 | 22 | ## Misc 23 | 24 | ### Lists containers 25 | 26 | ```bash 27 | docker ps 28 | ``` 29 | 30 | ### Lists images 31 | 32 | ```bash 33 | docker images 34 | ``` 35 | 36 | ### Delete image 37 | 38 | ```bash 39 | docker rmi 8ef72 40 | ``` 41 | 42 | (first image guid symbols) 43 | 44 | ### Build and run all at once 45 | 46 | ```bash 47 | docker build -f ./docker/Dockerfile.node12 -t cpass.node12 . 48 | docker build -f ./docker/Dockerfile.node10 -t cpass.node10 . 49 | docker build -f ./docker/Dockerfile.node8 -t cpass.node8 . 50 | docker build -f ./docker/Dockerfile.node6 -t cpass.node6 . 51 | docker run cpass.node12 52 | docker run cpass.node10 53 | docker run cpass.node8 54 | docker run cpass.node6 55 | ``` -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "cpass", 3 | "version": "2.3.0", 4 | "lockfileVersion": 1, 5 | "requires": true, 6 | "dependencies": { 7 | "@babel/code-frame": { 8 | "version": "7.10.4", 9 | "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz", 10 | "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==", 11 | "dev": true, 12 | "requires": { 13 | "@babel/highlight": "^7.10.4" 14 | } 15 | }, 16 | "@babel/helper-validator-identifier": { 17 | "version": "7.10.4", 18 | "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz", 19 | "integrity": "sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw==", 20 | "dev": true 21 | }, 22 | "@babel/highlight": { 23 | "version": "7.10.4", 24 | "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz", 25 | "integrity": "sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==", 26 | "dev": true, 27 | "requires": { 28 | "@babel/helper-validator-identifier": "^7.10.4", 29 | "chalk": "^2.0.0", 30 | "js-tokens": "^4.0.0" 31 | } 32 | }, 33 | "@types/chai": { 34 | "version": "4.2.11", 35 | "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.2.11.tgz", 36 | "integrity": "sha512-t7uW6eFafjO+qJ3BIV2gGUyZs27egcNRkUdalkud+Qa3+kg//f129iuOFivHDXQ+vnU3fDXuwgv0cqMCbcE8sw==", 37 | "dev": true 38 | }, 39 | "@types/mocha": { 40 | "version": "8.0.0", 41 | "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-8.0.0.tgz", 42 | "integrity": "sha512-jWeYcTo3sCH/rMgsdYXDTO85GNRyTCII5dayMIu/ZO4zbEot1E3iNGaOwpLReLUHjeNQFkgeNNVYlY4dX6azQQ==", 43 | "dev": true 44 | }, 45 | "@types/node": { 46 | "version": "14.0.23", 47 | "resolved": "https://registry.npmjs.org/@types/node/-/node-14.0.23.tgz", 48 | "integrity": "sha512-Z4U8yDAl5TFkmYsZdFPdjeMa57NOvnaf1tljHzhouaPEp7LCj2JKkejpI1ODviIAQuW4CcQmxkQ77rnLsOOoKw==", 49 | "dev": true 50 | }, 51 | "ansi-colors": { 52 | "version": "4.1.1", 53 | "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", 54 | "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", 55 | "dev": true 56 | }, 57 | "ansi-regex": { 58 | "version": "3.0.0", 59 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", 60 | "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", 61 | "dev": true 62 | }, 63 | "ansi-styles": { 64 | "version": "3.2.1", 65 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", 66 | "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", 67 | "dev": true, 68 | "requires": { 69 | "color-convert": "^1.9.0" 70 | } 71 | }, 72 | "anymatch": { 73 | "version": "3.1.1", 74 | "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz", 75 | "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==", 76 | "dev": true, 77 | "requires": { 78 | "normalize-path": "^3.0.0", 79 | "picomatch": "^2.0.4" 80 | } 81 | }, 82 | "arg": { 83 | "version": "4.1.3", 84 | "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", 85 | "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", 86 | "dev": true 87 | }, 88 | "argparse": { 89 | "version": "1.0.10", 90 | "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", 91 | "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", 92 | "dev": true, 93 | "requires": { 94 | "sprintf-js": "~1.0.2" 95 | } 96 | }, 97 | "array.prototype.map": { 98 | "version": "1.0.2", 99 | "resolved": "https://registry.npmjs.org/array.prototype.map/-/array.prototype.map-1.0.2.tgz", 100 | "integrity": "sha512-Az3OYxgsa1g7xDYp86l0nnN4bcmuEITGe1rbdEBVkrqkzMgDcbdQ2R7r41pNzti+4NMces3H8gMmuioZUilLgw==", 101 | "dev": true, 102 | "requires": { 103 | "define-properties": "^1.1.3", 104 | "es-abstract": "^1.17.0-next.1", 105 | "es-array-method-boxes-properly": "^1.0.0", 106 | "is-string": "^1.0.4" 107 | } 108 | }, 109 | "assertion-error": { 110 | "version": "1.1.0", 111 | "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", 112 | "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", 113 | "dev": true 114 | }, 115 | "balanced-match": { 116 | "version": "1.0.0", 117 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", 118 | "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", 119 | "dev": true 120 | }, 121 | "binary-extensions": { 122 | "version": "2.1.0", 123 | "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.1.0.tgz", 124 | "integrity": "sha512-1Yj8h9Q+QDF5FzhMs/c9+6UntbD5MkRfRwac8DoEm9ZfUBZ7tZ55YcGVAzEe4bXsdQHEk+s9S5wsOKVdZrw0tQ==", 125 | "dev": true 126 | }, 127 | "brace-expansion": { 128 | "version": "1.1.11", 129 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", 130 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", 131 | "dev": true, 132 | "requires": { 133 | "balanced-match": "^1.0.0", 134 | "concat-map": "0.0.1" 135 | } 136 | }, 137 | "braces": { 138 | "version": "3.0.2", 139 | "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", 140 | "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", 141 | "dev": true, 142 | "requires": { 143 | "fill-range": "^7.0.1" 144 | } 145 | }, 146 | "browser-stdout": { 147 | "version": "1.3.1", 148 | "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", 149 | "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", 150 | "dev": true 151 | }, 152 | "buffer-from": { 153 | "version": "1.1.1", 154 | "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", 155 | "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", 156 | "dev": true 157 | }, 158 | "builtin-modules": { 159 | "version": "1.1.1", 160 | "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", 161 | "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=", 162 | "dev": true 163 | }, 164 | "camelcase": { 165 | "version": "5.3.1", 166 | "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", 167 | "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", 168 | "dev": true 169 | }, 170 | "chai": { 171 | "version": "4.2.0", 172 | "resolved": "https://registry.npmjs.org/chai/-/chai-4.2.0.tgz", 173 | "integrity": "sha512-XQU3bhBukrOsQCuwZndwGcCVQHyZi53fQ6Ys1Fym7E4olpIqqZZhhoFJoaKVvV17lWQoXYwgWN2nF5crA8J2jw==", 174 | "dev": true, 175 | "requires": { 176 | "assertion-error": "^1.1.0", 177 | "check-error": "^1.0.2", 178 | "deep-eql": "^3.0.1", 179 | "get-func-name": "^2.0.0", 180 | "pathval": "^1.1.0", 181 | "type-detect": "^4.0.5" 182 | } 183 | }, 184 | "chalk": { 185 | "version": "2.4.2", 186 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", 187 | "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", 188 | "dev": true, 189 | "requires": { 190 | "ansi-styles": "^3.2.1", 191 | "escape-string-regexp": "^1.0.5", 192 | "supports-color": "^5.3.0" 193 | }, 194 | "dependencies": { 195 | "supports-color": { 196 | "version": "5.5.0", 197 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", 198 | "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", 199 | "dev": true, 200 | "requires": { 201 | "has-flag": "^3.0.0" 202 | } 203 | } 204 | } 205 | }, 206 | "check-error": { 207 | "version": "1.0.2", 208 | "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz", 209 | "integrity": "sha1-V00xLt2Iu13YkS6Sht1sCu1KrII=", 210 | "dev": true 211 | }, 212 | "chokidar": { 213 | "version": "3.3.1", 214 | "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.3.1.tgz", 215 | "integrity": "sha512-4QYCEWOcK3OJrxwvyyAOxFuhpvOVCYkr33LPfFNBjAD/w3sEzWsp2BUOkI4l9bHvWioAd0rc6NlHUOEaWkTeqg==", 216 | "dev": true, 217 | "requires": { 218 | "anymatch": "~3.1.1", 219 | "braces": "~3.0.2", 220 | "fsevents": "~2.1.2", 221 | "glob-parent": "~5.1.0", 222 | "is-binary-path": "~2.1.0", 223 | "is-glob": "~4.0.1", 224 | "normalize-path": "~3.0.0", 225 | "readdirp": "~3.3.0" 226 | } 227 | }, 228 | "cliui": { 229 | "version": "5.0.0", 230 | "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", 231 | "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", 232 | "dev": true, 233 | "requires": { 234 | "string-width": "^3.1.0", 235 | "strip-ansi": "^5.2.0", 236 | "wrap-ansi": "^5.1.0" 237 | }, 238 | "dependencies": { 239 | "ansi-regex": { 240 | "version": "4.1.0", 241 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", 242 | "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", 243 | "dev": true 244 | }, 245 | "string-width": { 246 | "version": "3.1.0", 247 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", 248 | "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", 249 | "dev": true, 250 | "requires": { 251 | "emoji-regex": "^7.0.1", 252 | "is-fullwidth-code-point": "^2.0.0", 253 | "strip-ansi": "^5.1.0" 254 | } 255 | }, 256 | "strip-ansi": { 257 | "version": "5.2.0", 258 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", 259 | "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", 260 | "dev": true, 261 | "requires": { 262 | "ansi-regex": "^4.1.0" 263 | } 264 | } 265 | } 266 | }, 267 | "color-convert": { 268 | "version": "1.9.3", 269 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", 270 | "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", 271 | "dev": true, 272 | "requires": { 273 | "color-name": "1.1.3" 274 | } 275 | }, 276 | "color-name": { 277 | "version": "1.1.3", 278 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", 279 | "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", 280 | "dev": true 281 | }, 282 | "commander": { 283 | "version": "2.20.3", 284 | "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", 285 | "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", 286 | "dev": true 287 | }, 288 | "concat-map": { 289 | "version": "0.0.1", 290 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", 291 | "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", 292 | "dev": true 293 | }, 294 | "debug": { 295 | "version": "3.2.6", 296 | "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", 297 | "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", 298 | "dev": true, 299 | "requires": { 300 | "ms": "^2.1.1" 301 | } 302 | }, 303 | "decamelize": { 304 | "version": "1.2.0", 305 | "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", 306 | "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", 307 | "dev": true 308 | }, 309 | "deep-eql": { 310 | "version": "3.0.1", 311 | "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-3.0.1.tgz", 312 | "integrity": "sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw==", 313 | "dev": true, 314 | "requires": { 315 | "type-detect": "^4.0.0" 316 | } 317 | }, 318 | "define-properties": { 319 | "version": "1.1.3", 320 | "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", 321 | "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", 322 | "dev": true, 323 | "requires": { 324 | "object-keys": "^1.0.12" 325 | } 326 | }, 327 | "diff": { 328 | "version": "4.0.2", 329 | "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", 330 | "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", 331 | "dev": true 332 | }, 333 | "emoji-regex": { 334 | "version": "7.0.3", 335 | "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", 336 | "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", 337 | "dev": true 338 | }, 339 | "es-abstract": { 340 | "version": "1.17.6", 341 | "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.6.tgz", 342 | "integrity": "sha512-Fr89bON3WFyUi5EvAeI48QTWX0AyekGgLA8H+c+7fbfCkJwRWRMLd8CQedNEyJuoYYhmtEqY92pgte1FAhBlhw==", 343 | "dev": true, 344 | "requires": { 345 | "es-to-primitive": "^1.2.1", 346 | "function-bind": "^1.1.1", 347 | "has": "^1.0.3", 348 | "has-symbols": "^1.0.1", 349 | "is-callable": "^1.2.0", 350 | "is-regex": "^1.1.0", 351 | "object-inspect": "^1.7.0", 352 | "object-keys": "^1.1.1", 353 | "object.assign": "^4.1.0", 354 | "string.prototype.trimend": "^1.0.1", 355 | "string.prototype.trimstart": "^1.0.1" 356 | } 357 | }, 358 | "es-array-method-boxes-properly": { 359 | "version": "1.0.0", 360 | "resolved": "https://registry.npmjs.org/es-array-method-boxes-properly/-/es-array-method-boxes-properly-1.0.0.tgz", 361 | "integrity": "sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA==", 362 | "dev": true 363 | }, 364 | "es-get-iterator": { 365 | "version": "1.1.0", 366 | "resolved": "https://registry.npmjs.org/es-get-iterator/-/es-get-iterator-1.1.0.tgz", 367 | "integrity": "sha512-UfrmHuWQlNMTs35e1ypnvikg6jCz3SK8v8ImvmDsh36fCVUR1MqoFDiyn0/k52C8NqO3YsO8Oe0azeesNuqSsQ==", 368 | "dev": true, 369 | "requires": { 370 | "es-abstract": "^1.17.4", 371 | "has-symbols": "^1.0.1", 372 | "is-arguments": "^1.0.4", 373 | "is-map": "^2.0.1", 374 | "is-set": "^2.0.1", 375 | "is-string": "^1.0.5", 376 | "isarray": "^2.0.5" 377 | } 378 | }, 379 | "es-to-primitive": { 380 | "version": "1.2.1", 381 | "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", 382 | "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", 383 | "dev": true, 384 | "requires": { 385 | "is-callable": "^1.1.4", 386 | "is-date-object": "^1.0.1", 387 | "is-symbol": "^1.0.2" 388 | } 389 | }, 390 | "escape-string-regexp": { 391 | "version": "1.0.5", 392 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", 393 | "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", 394 | "dev": true 395 | }, 396 | "esprima": { 397 | "version": "4.0.1", 398 | "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", 399 | "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", 400 | "dev": true 401 | }, 402 | "fill-range": { 403 | "version": "7.0.1", 404 | "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", 405 | "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", 406 | "dev": true, 407 | "requires": { 408 | "to-regex-range": "^5.0.1" 409 | } 410 | }, 411 | "find-up": { 412 | "version": "4.1.0", 413 | "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", 414 | "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", 415 | "dev": true, 416 | "requires": { 417 | "locate-path": "^5.0.0", 418 | "path-exists": "^4.0.0" 419 | } 420 | }, 421 | "flat": { 422 | "version": "4.1.0", 423 | "resolved": "https://registry.npmjs.org/flat/-/flat-4.1.0.tgz", 424 | "integrity": "sha512-Px/TiLIznH7gEDlPXcUD4KnBusa6kR6ayRUVcnEAbreRIuhkqow/mun59BuRXwoYk7ZQOLW1ZM05ilIvK38hFw==", 425 | "dev": true, 426 | "requires": { 427 | "is-buffer": "~2.0.3" 428 | } 429 | }, 430 | "fs.realpath": { 431 | "version": "1.0.0", 432 | "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", 433 | "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", 434 | "dev": true 435 | }, 436 | "fsevents": { 437 | "version": "2.1.3", 438 | "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.3.tgz", 439 | "integrity": "sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==", 440 | "dev": true, 441 | "optional": true 442 | }, 443 | "function-bind": { 444 | "version": "1.1.1", 445 | "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", 446 | "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", 447 | "dev": true 448 | }, 449 | "get-caller-file": { 450 | "version": "2.0.5", 451 | "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", 452 | "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", 453 | "dev": true 454 | }, 455 | "get-func-name": { 456 | "version": "2.0.0", 457 | "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz", 458 | "integrity": "sha1-6td0q+5y4gQJQzoGY2YCPdaIekE=", 459 | "dev": true 460 | }, 461 | "glob": { 462 | "version": "7.1.6", 463 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", 464 | "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", 465 | "dev": true, 466 | "requires": { 467 | "fs.realpath": "^1.0.0", 468 | "inflight": "^1.0.4", 469 | "inherits": "2", 470 | "minimatch": "^3.0.4", 471 | "once": "^1.3.0", 472 | "path-is-absolute": "^1.0.0" 473 | } 474 | }, 475 | "glob-parent": { 476 | "version": "5.1.1", 477 | "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.1.tgz", 478 | "integrity": "sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==", 479 | "dev": true, 480 | "requires": { 481 | "is-glob": "^4.0.1" 482 | } 483 | }, 484 | "growl": { 485 | "version": "1.10.5", 486 | "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz", 487 | "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==", 488 | "dev": true 489 | }, 490 | "has": { 491 | "version": "1.0.3", 492 | "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", 493 | "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", 494 | "dev": true, 495 | "requires": { 496 | "function-bind": "^1.1.1" 497 | } 498 | }, 499 | "has-flag": { 500 | "version": "3.0.0", 501 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", 502 | "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", 503 | "dev": true 504 | }, 505 | "has-symbols": { 506 | "version": "1.0.1", 507 | "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz", 508 | "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==", 509 | "dev": true 510 | }, 511 | "he": { 512 | "version": "1.2.0", 513 | "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", 514 | "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", 515 | "dev": true 516 | }, 517 | "inflight": { 518 | "version": "1.0.6", 519 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", 520 | "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", 521 | "dev": true, 522 | "requires": { 523 | "once": "^1.3.0", 524 | "wrappy": "1" 525 | } 526 | }, 527 | "inherits": { 528 | "version": "2.0.4", 529 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", 530 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", 531 | "dev": true 532 | }, 533 | "is-arguments": { 534 | "version": "1.0.4", 535 | "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.0.4.tgz", 536 | "integrity": "sha512-xPh0Rmt8NE65sNzvyUmWgI1tz3mKq74lGA0mL8LYZcoIzKOzDh6HmrYm3d18k60nHerC8A9Km8kYu87zfSFnLA==", 537 | "dev": true 538 | }, 539 | "is-binary-path": { 540 | "version": "2.1.0", 541 | "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", 542 | "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", 543 | "dev": true, 544 | "requires": { 545 | "binary-extensions": "^2.0.0" 546 | } 547 | }, 548 | "is-buffer": { 549 | "version": "2.0.4", 550 | "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.4.tgz", 551 | "integrity": "sha512-Kq1rokWXOPXWuaMAqZiJW4XxsmD9zGx9q4aePabbn3qCRGedtH7Cm+zV8WETitMfu1wdh+Rvd6w5egwSngUX2A==", 552 | "dev": true 553 | }, 554 | "is-callable": { 555 | "version": "1.2.0", 556 | "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.0.tgz", 557 | "integrity": "sha512-pyVD9AaGLxtg6srb2Ng6ynWJqkHU9bEM087AKck0w8QwDarTfNcpIYoU8x8Hv2Icm8u6kFJM18Dag8lyqGkviw==", 558 | "dev": true 559 | }, 560 | "is-date-object": { 561 | "version": "1.0.2", 562 | "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.2.tgz", 563 | "integrity": "sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g==", 564 | "dev": true 565 | }, 566 | "is-extglob": { 567 | "version": "2.1.1", 568 | "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", 569 | "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", 570 | "dev": true 571 | }, 572 | "is-fullwidth-code-point": { 573 | "version": "2.0.0", 574 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", 575 | "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", 576 | "dev": true 577 | }, 578 | "is-glob": { 579 | "version": "4.0.1", 580 | "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", 581 | "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", 582 | "dev": true, 583 | "requires": { 584 | "is-extglob": "^2.1.1" 585 | } 586 | }, 587 | "is-map": { 588 | "version": "2.0.1", 589 | "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.1.tgz", 590 | "integrity": "sha512-T/S49scO8plUiAOA2DBTBG3JHpn1yiw0kRp6dgiZ0v2/6twi5eiB0rHtHFH9ZIrvlWc6+4O+m4zg5+Z833aXgw==", 591 | "dev": true 592 | }, 593 | "is-number": { 594 | "version": "7.0.0", 595 | "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", 596 | "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", 597 | "dev": true 598 | }, 599 | "is-regex": { 600 | "version": "1.1.0", 601 | "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.0.tgz", 602 | "integrity": "sha512-iI97M8KTWID2la5uYXlkbSDQIg4F6o1sYboZKKTDpnDQMLtUL86zxhgDet3Q2SriaYsyGqZ6Mn2SjbRKeLHdqw==", 603 | "dev": true, 604 | "requires": { 605 | "has-symbols": "^1.0.1" 606 | } 607 | }, 608 | "is-set": { 609 | "version": "2.0.1", 610 | "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.1.tgz", 611 | "integrity": "sha512-eJEzOtVyenDs1TMzSQ3kU3K+E0GUS9sno+F0OBT97xsgcJsF9nXMBtkT9/kut5JEpM7oL7X/0qxR17K3mcwIAA==", 612 | "dev": true 613 | }, 614 | "is-string": { 615 | "version": "1.0.5", 616 | "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.5.tgz", 617 | "integrity": "sha512-buY6VNRjhQMiF1qWDouloZlQbRhDPCebwxSjxMjxgemYT46YMd2NR0/H+fBhEfWX4A/w9TBJ+ol+okqJKFE6vQ==", 618 | "dev": true 619 | }, 620 | "is-symbol": { 621 | "version": "1.0.3", 622 | "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.3.tgz", 623 | "integrity": "sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ==", 624 | "dev": true, 625 | "requires": { 626 | "has-symbols": "^1.0.1" 627 | } 628 | }, 629 | "isarray": { 630 | "version": "2.0.5", 631 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", 632 | "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", 633 | "dev": true 634 | }, 635 | "isexe": { 636 | "version": "2.0.0", 637 | "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", 638 | "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", 639 | "dev": true 640 | }, 641 | "iterate-iterator": { 642 | "version": "1.0.1", 643 | "resolved": "https://registry.npmjs.org/iterate-iterator/-/iterate-iterator-1.0.1.tgz", 644 | "integrity": "sha512-3Q6tudGN05kbkDQDI4CqjaBf4qf85w6W6GnuZDtUVYwKgtC1q8yxYX7CZed7N+tLzQqS6roujWvszf13T+n9aw==", 645 | "dev": true 646 | }, 647 | "iterate-value": { 648 | "version": "1.0.2", 649 | "resolved": "https://registry.npmjs.org/iterate-value/-/iterate-value-1.0.2.tgz", 650 | "integrity": "sha512-A6fMAio4D2ot2r/TYzr4yUWrmwNdsN5xL7+HUiyACE4DXm+q8HtPcnFTp+NnW3k4N05tZ7FVYFFb2CR13NxyHQ==", 651 | "dev": true, 652 | "requires": { 653 | "es-get-iterator": "^1.0.2", 654 | "iterate-iterator": "^1.0.1" 655 | } 656 | }, 657 | "js-tokens": { 658 | "version": "4.0.0", 659 | "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", 660 | "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", 661 | "dev": true 662 | }, 663 | "js-yaml": { 664 | "version": "3.13.1", 665 | "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", 666 | "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", 667 | "dev": true, 668 | "requires": { 669 | "argparse": "^1.0.7", 670 | "esprima": "^4.0.0" 671 | } 672 | }, 673 | "locate-path": { 674 | "version": "5.0.0", 675 | "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", 676 | "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", 677 | "dev": true, 678 | "requires": { 679 | "p-locate": "^4.1.0" 680 | } 681 | }, 682 | "lodash": { 683 | "version": "4.17.19", 684 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.19.tgz", 685 | "integrity": "sha512-JNvd8XER9GQX0v2qJgsaN/mzFCNA5BRe/j8JN9d+tWyGLSodKQHKFicdwNYzWwI3wjRnaKPsGj1XkBjx/F96DQ==", 686 | "dev": true 687 | }, 688 | "log-symbols": { 689 | "version": "3.0.0", 690 | "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-3.0.0.tgz", 691 | "integrity": "sha512-dSkNGuI7iG3mfvDzUuYZyvk5dD9ocYCYzNU6CYDE6+Xqd+gwme6Z00NS3dUh8mq/73HaEtT7m6W+yUPtU6BZnQ==", 692 | "dev": true, 693 | "requires": { 694 | "chalk": "^2.4.2" 695 | } 696 | }, 697 | "make-error": { 698 | "version": "1.3.6", 699 | "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", 700 | "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", 701 | "dev": true 702 | }, 703 | "minimatch": { 704 | "version": "3.0.4", 705 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", 706 | "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", 707 | "dev": true, 708 | "requires": { 709 | "brace-expansion": "^1.1.7" 710 | } 711 | }, 712 | "minimist": { 713 | "version": "1.2.5", 714 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", 715 | "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", 716 | "dev": true 717 | }, 718 | "mkdirp": { 719 | "version": "0.5.5", 720 | "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", 721 | "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", 722 | "dev": true, 723 | "requires": { 724 | "minimist": "^1.2.5" 725 | } 726 | }, 727 | "mocha": { 728 | "version": "8.0.1", 729 | "resolved": "https://registry.npmjs.org/mocha/-/mocha-8.0.1.tgz", 730 | "integrity": "sha512-vefaXfdYI8+Yo8nPZQQi0QO2o+5q9UIMX1jZ1XMmK3+4+CQjc7+B0hPdUeglXiTlr8IHMVRo63IhO9Mzt6fxOg==", 731 | "dev": true, 732 | "requires": { 733 | "ansi-colors": "4.1.1", 734 | "browser-stdout": "1.3.1", 735 | "chokidar": "3.3.1", 736 | "debug": "3.2.6", 737 | "diff": "4.0.2", 738 | "escape-string-regexp": "1.0.5", 739 | "find-up": "4.1.0", 740 | "glob": "7.1.6", 741 | "growl": "1.10.5", 742 | "he": "1.2.0", 743 | "js-yaml": "3.13.1", 744 | "log-symbols": "3.0.0", 745 | "minimatch": "3.0.4", 746 | "ms": "2.1.2", 747 | "object.assign": "4.1.0", 748 | "promise.allsettled": "1.0.2", 749 | "serialize-javascript": "3.0.0", 750 | "strip-json-comments": "3.0.1", 751 | "supports-color": "7.1.0", 752 | "which": "2.0.2", 753 | "wide-align": "1.1.3", 754 | "workerpool": "6.0.0", 755 | "yargs": "13.3.2", 756 | "yargs-parser": "13.1.2", 757 | "yargs-unparser": "1.6.0" 758 | } 759 | }, 760 | "ms": { 761 | "version": "2.1.2", 762 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", 763 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", 764 | "dev": true 765 | }, 766 | "normalize-path": { 767 | "version": "3.0.0", 768 | "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", 769 | "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", 770 | "dev": true 771 | }, 772 | "object-inspect": { 773 | "version": "1.8.0", 774 | "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.8.0.tgz", 775 | "integrity": "sha512-jLdtEOB112fORuypAyl/50VRVIBIdVQOSUUGQHzJ4xBSbit81zRarz7GThkEFZy1RceYrWYcPcBFPQwHyAc1gA==", 776 | "dev": true 777 | }, 778 | "object-keys": { 779 | "version": "1.1.1", 780 | "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", 781 | "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", 782 | "dev": true 783 | }, 784 | "object.assign": { 785 | "version": "4.1.0", 786 | "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz", 787 | "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==", 788 | "dev": true, 789 | "requires": { 790 | "define-properties": "^1.1.2", 791 | "function-bind": "^1.1.1", 792 | "has-symbols": "^1.0.0", 793 | "object-keys": "^1.0.11" 794 | } 795 | }, 796 | "once": { 797 | "version": "1.4.0", 798 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 799 | "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", 800 | "dev": true, 801 | "requires": { 802 | "wrappy": "1" 803 | } 804 | }, 805 | "p-limit": { 806 | "version": "2.3.0", 807 | "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", 808 | "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", 809 | "dev": true, 810 | "requires": { 811 | "p-try": "^2.0.0" 812 | } 813 | }, 814 | "p-locate": { 815 | "version": "4.1.0", 816 | "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", 817 | "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", 818 | "dev": true, 819 | "requires": { 820 | "p-limit": "^2.2.0" 821 | } 822 | }, 823 | "p-try": { 824 | "version": "2.2.0", 825 | "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", 826 | "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", 827 | "dev": true 828 | }, 829 | "path-exists": { 830 | "version": "4.0.0", 831 | "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", 832 | "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", 833 | "dev": true 834 | }, 835 | "path-is-absolute": { 836 | "version": "1.0.1", 837 | "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", 838 | "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", 839 | "dev": true 840 | }, 841 | "path-parse": { 842 | "version": "1.0.6", 843 | "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", 844 | "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==", 845 | "dev": true 846 | }, 847 | "pathval": { 848 | "version": "1.1.0", 849 | "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.0.tgz", 850 | "integrity": "sha1-uULm1L3mUwBe9rcTYd74cn0GReA=", 851 | "dev": true 852 | }, 853 | "picomatch": { 854 | "version": "2.2.2", 855 | "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz", 856 | "integrity": "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==", 857 | "dev": true 858 | }, 859 | "promise.allsettled": { 860 | "version": "1.0.2", 861 | "resolved": "https://registry.npmjs.org/promise.allsettled/-/promise.allsettled-1.0.2.tgz", 862 | "integrity": "sha512-UpcYW5S1RaNKT6pd+s9jp9K9rlQge1UXKskec0j6Mmuq7UJCvlS2J2/s/yuPN8ehftf9HXMxWlKiPbGGUzpoRg==", 863 | "dev": true, 864 | "requires": { 865 | "array.prototype.map": "^1.0.1", 866 | "define-properties": "^1.1.3", 867 | "es-abstract": "^1.17.0-next.1", 868 | "function-bind": "^1.1.1", 869 | "iterate-value": "^1.0.0" 870 | } 871 | }, 872 | "readdirp": { 873 | "version": "3.3.0", 874 | "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.3.0.tgz", 875 | "integrity": "sha512-zz0pAkSPOXXm1viEwygWIPSPkcBYjW1xU5j/JBh5t9bGCJwa6f9+BJa6VaB2g+b55yVrmXzqkyLf4xaWYM0IkQ==", 876 | "dev": true, 877 | "requires": { 878 | "picomatch": "^2.0.7" 879 | } 880 | }, 881 | "require-directory": { 882 | "version": "2.1.1", 883 | "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", 884 | "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", 885 | "dev": true 886 | }, 887 | "require-main-filename": { 888 | "version": "2.0.0", 889 | "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", 890 | "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", 891 | "dev": true 892 | }, 893 | "resolve": { 894 | "version": "1.17.0", 895 | "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz", 896 | "integrity": "sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==", 897 | "dev": true, 898 | "requires": { 899 | "path-parse": "^1.0.6" 900 | } 901 | }, 902 | "scmp": { 903 | "version": "2.1.0", 904 | "resolved": "https://registry.npmjs.org/scmp/-/scmp-2.1.0.tgz", 905 | "integrity": "sha512-o/mRQGk9Rcer/jEEw/yw4mwo3EU/NvYvp577/Btqrym9Qy5/MdWGBqipbALgd2lrdWTJ5/gqDusxfnQBxOxT2Q==" 906 | }, 907 | "semver": { 908 | "version": "5.7.1", 909 | "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", 910 | "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", 911 | "dev": true 912 | }, 913 | "serialize-javascript": { 914 | "version": "3.0.0", 915 | "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-3.0.0.tgz", 916 | "integrity": "sha512-skZcHYw2vEX4bw90nAr2iTTsz6x2SrHEnfxgKYmZlvJYBEZrvbKtobJWlQ20zczKb3bsHHXXTYt48zBA7ni9cw==", 917 | "dev": true 918 | }, 919 | "set-blocking": { 920 | "version": "2.0.0", 921 | "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", 922 | "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", 923 | "dev": true 924 | }, 925 | "source-map": { 926 | "version": "0.6.1", 927 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", 928 | "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", 929 | "dev": true 930 | }, 931 | "source-map-support": { 932 | "version": "0.5.19", 933 | "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.19.tgz", 934 | "integrity": "sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==", 935 | "dev": true, 936 | "requires": { 937 | "buffer-from": "^1.0.0", 938 | "source-map": "^0.6.0" 939 | } 940 | }, 941 | "sprintf-js": { 942 | "version": "1.0.3", 943 | "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", 944 | "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", 945 | "dev": true 946 | }, 947 | "string-width": { 948 | "version": "2.1.1", 949 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", 950 | "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", 951 | "dev": true, 952 | "requires": { 953 | "is-fullwidth-code-point": "^2.0.0", 954 | "strip-ansi": "^4.0.0" 955 | } 956 | }, 957 | "string.prototype.trimend": { 958 | "version": "1.0.1", 959 | "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.1.tgz", 960 | "integrity": "sha512-LRPxFUaTtpqYsTeNKaFOw3R4bxIzWOnbQ837QfBylo8jIxtcbK/A/sMV7Q+OAV/vWo+7s25pOE10KYSjaSO06g==", 961 | "dev": true, 962 | "requires": { 963 | "define-properties": "^1.1.3", 964 | "es-abstract": "^1.17.5" 965 | } 966 | }, 967 | "string.prototype.trimstart": { 968 | "version": "1.0.1", 969 | "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.1.tgz", 970 | "integrity": "sha512-XxZn+QpvrBI1FOcg6dIpxUPgWCPuNXvMD72aaRaUQv1eD4e/Qy8i/hFTe0BUmD60p/QA6bh1avmuPTfNjqVWRw==", 971 | "dev": true, 972 | "requires": { 973 | "define-properties": "^1.1.3", 974 | "es-abstract": "^1.17.5" 975 | } 976 | }, 977 | "strip-ansi": { 978 | "version": "4.0.0", 979 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", 980 | "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", 981 | "dev": true, 982 | "requires": { 983 | "ansi-regex": "^3.0.0" 984 | } 985 | }, 986 | "strip-json-comments": { 987 | "version": "3.0.1", 988 | "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.0.1.tgz", 989 | "integrity": "sha512-VTyMAUfdm047mwKl+u79WIdrZxtFtn+nBxHeb844XBQ9uMNTuTHdx2hc5RiAJYqwTj3wc/xe5HLSdJSkJ+WfZw==", 990 | "dev": true 991 | }, 992 | "supports-color": { 993 | "version": "7.1.0", 994 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", 995 | "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", 996 | "dev": true, 997 | "requires": { 998 | "has-flag": "^4.0.0" 999 | }, 1000 | "dependencies": { 1001 | "has-flag": { 1002 | "version": "4.0.0", 1003 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", 1004 | "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", 1005 | "dev": true 1006 | } 1007 | } 1008 | }, 1009 | "to-regex-range": { 1010 | "version": "5.0.1", 1011 | "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", 1012 | "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", 1013 | "dev": true, 1014 | "requires": { 1015 | "is-number": "^7.0.0" 1016 | } 1017 | }, 1018 | "ts-node": { 1019 | "version": "8.10.2", 1020 | "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-8.10.2.tgz", 1021 | "integrity": "sha512-ISJJGgkIpDdBhWVu3jufsWpK3Rzo7bdiIXJjQc0ynKxVOVcg2oIrf2H2cejminGrptVc6q6/uynAHNCuWGbpVA==", 1022 | "dev": true, 1023 | "requires": { 1024 | "arg": "^4.1.0", 1025 | "diff": "^4.0.1", 1026 | "make-error": "^1.1.1", 1027 | "source-map-support": "^0.5.17", 1028 | "yn": "3.1.1" 1029 | } 1030 | }, 1031 | "tslib": { 1032 | "version": "1.13.0", 1033 | "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.13.0.tgz", 1034 | "integrity": "sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q==", 1035 | "dev": true 1036 | }, 1037 | "tslint": { 1038 | "version": "6.1.2", 1039 | "resolved": "https://registry.npmjs.org/tslint/-/tslint-6.1.2.tgz", 1040 | "integrity": "sha512-UyNrLdK3E0fQG/xWNqAFAC5ugtFyPO4JJR1KyyfQAyzR8W0fTRrC91A8Wej4BntFzcvETdCSDa/4PnNYJQLYiA==", 1041 | "dev": true, 1042 | "requires": { 1043 | "@babel/code-frame": "^7.0.0", 1044 | "builtin-modules": "^1.1.1", 1045 | "chalk": "^2.3.0", 1046 | "commander": "^2.12.1", 1047 | "diff": "^4.0.1", 1048 | "glob": "^7.1.1", 1049 | "js-yaml": "^3.13.1", 1050 | "minimatch": "^3.0.4", 1051 | "mkdirp": "^0.5.3", 1052 | "resolve": "^1.3.2", 1053 | "semver": "^5.3.0", 1054 | "tslib": "^1.10.0", 1055 | "tsutils": "^2.29.0" 1056 | } 1057 | }, 1058 | "tsutils": { 1059 | "version": "2.29.0", 1060 | "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-2.29.0.tgz", 1061 | "integrity": "sha512-g5JVHCIJwzfISaXpXE1qvNalca5Jwob6FjI4AoPlqMusJ6ftFE7IkkFoMhVLRgK+4Kx3gkzb8UZK5t5yTTvEmA==", 1062 | "dev": true, 1063 | "requires": { 1064 | "tslib": "^1.8.1" 1065 | } 1066 | }, 1067 | "type-detect": { 1068 | "version": "4.0.8", 1069 | "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", 1070 | "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", 1071 | "dev": true 1072 | }, 1073 | "typescript": { 1074 | "version": "3.9.7", 1075 | "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.9.7.tgz", 1076 | "integrity": "sha512-BLbiRkiBzAwsjut4x/dsibSTB6yWpwT5qWmC2OfuCg3GgVQCSgMs4vEctYPhsaGtd0AeuuHMkjZ2h2WG8MSzRw==", 1077 | "dev": true 1078 | }, 1079 | "which": { 1080 | "version": "2.0.2", 1081 | "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", 1082 | "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", 1083 | "dev": true, 1084 | "requires": { 1085 | "isexe": "^2.0.0" 1086 | } 1087 | }, 1088 | "which-module": { 1089 | "version": "2.0.0", 1090 | "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", 1091 | "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", 1092 | "dev": true 1093 | }, 1094 | "wide-align": { 1095 | "version": "1.1.3", 1096 | "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", 1097 | "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", 1098 | "dev": true, 1099 | "requires": { 1100 | "string-width": "^1.0.2 || 2" 1101 | } 1102 | }, 1103 | "workerpool": { 1104 | "version": "6.0.0", 1105 | "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.0.0.tgz", 1106 | "integrity": "sha512-fU2OcNA/GVAJLLyKUoHkAgIhKb0JoCpSjLC/G2vYKxUjVmQwGbRVeoPJ1a8U4pnVofz4AQV5Y/NEw8oKqxEBtA==", 1107 | "dev": true 1108 | }, 1109 | "wrap-ansi": { 1110 | "version": "5.1.0", 1111 | "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", 1112 | "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", 1113 | "dev": true, 1114 | "requires": { 1115 | "ansi-styles": "^3.2.0", 1116 | "string-width": "^3.0.0", 1117 | "strip-ansi": "^5.0.0" 1118 | }, 1119 | "dependencies": { 1120 | "ansi-regex": { 1121 | "version": "4.1.0", 1122 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", 1123 | "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", 1124 | "dev": true 1125 | }, 1126 | "string-width": { 1127 | "version": "3.1.0", 1128 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", 1129 | "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", 1130 | "dev": true, 1131 | "requires": { 1132 | "emoji-regex": "^7.0.1", 1133 | "is-fullwidth-code-point": "^2.0.0", 1134 | "strip-ansi": "^5.1.0" 1135 | } 1136 | }, 1137 | "strip-ansi": { 1138 | "version": "5.2.0", 1139 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", 1140 | "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", 1141 | "dev": true, 1142 | "requires": { 1143 | "ansi-regex": "^4.1.0" 1144 | } 1145 | } 1146 | } 1147 | }, 1148 | "wrappy": { 1149 | "version": "1.0.2", 1150 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 1151 | "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", 1152 | "dev": true 1153 | }, 1154 | "y18n": { 1155 | "version": "4.0.0", 1156 | "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz", 1157 | "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==", 1158 | "dev": true 1159 | }, 1160 | "yargs": { 1161 | "version": "13.3.2", 1162 | "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz", 1163 | "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==", 1164 | "dev": true, 1165 | "requires": { 1166 | "cliui": "^5.0.0", 1167 | "find-up": "^3.0.0", 1168 | "get-caller-file": "^2.0.1", 1169 | "require-directory": "^2.1.1", 1170 | "require-main-filename": "^2.0.0", 1171 | "set-blocking": "^2.0.0", 1172 | "string-width": "^3.0.0", 1173 | "which-module": "^2.0.0", 1174 | "y18n": "^4.0.0", 1175 | "yargs-parser": "^13.1.2" 1176 | }, 1177 | "dependencies": { 1178 | "ansi-regex": { 1179 | "version": "4.1.0", 1180 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", 1181 | "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", 1182 | "dev": true 1183 | }, 1184 | "find-up": { 1185 | "version": "3.0.0", 1186 | "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", 1187 | "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", 1188 | "dev": true, 1189 | "requires": { 1190 | "locate-path": "^3.0.0" 1191 | } 1192 | }, 1193 | "locate-path": { 1194 | "version": "3.0.0", 1195 | "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", 1196 | "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", 1197 | "dev": true, 1198 | "requires": { 1199 | "p-locate": "^3.0.0", 1200 | "path-exists": "^3.0.0" 1201 | } 1202 | }, 1203 | "p-locate": { 1204 | "version": "3.0.0", 1205 | "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", 1206 | "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", 1207 | "dev": true, 1208 | "requires": { 1209 | "p-limit": "^2.0.0" 1210 | } 1211 | }, 1212 | "path-exists": { 1213 | "version": "3.0.0", 1214 | "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", 1215 | "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", 1216 | "dev": true 1217 | }, 1218 | "string-width": { 1219 | "version": "3.1.0", 1220 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", 1221 | "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", 1222 | "dev": true, 1223 | "requires": { 1224 | "emoji-regex": "^7.0.1", 1225 | "is-fullwidth-code-point": "^2.0.0", 1226 | "strip-ansi": "^5.1.0" 1227 | } 1228 | }, 1229 | "strip-ansi": { 1230 | "version": "5.2.0", 1231 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", 1232 | "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", 1233 | "dev": true, 1234 | "requires": { 1235 | "ansi-regex": "^4.1.0" 1236 | } 1237 | } 1238 | } 1239 | }, 1240 | "yargs-parser": { 1241 | "version": "13.1.2", 1242 | "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz", 1243 | "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==", 1244 | "dev": true, 1245 | "requires": { 1246 | "camelcase": "^5.0.0", 1247 | "decamelize": "^1.2.0" 1248 | } 1249 | }, 1250 | "yargs-unparser": { 1251 | "version": "1.6.0", 1252 | "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-1.6.0.tgz", 1253 | "integrity": "sha512-W9tKgmSn0DpSatfri0nx52Joq5hVXgeLiqR/5G0sZNDoLZFOr/xjBUDcShCOGNsBnEMNo1KAMBkTej1Hm62HTw==", 1254 | "dev": true, 1255 | "requires": { 1256 | "flat": "^4.1.0", 1257 | "lodash": "^4.17.15", 1258 | "yargs": "^13.3.0" 1259 | } 1260 | }, 1261 | "yn": { 1262 | "version": "3.1.1", 1263 | "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", 1264 | "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", 1265 | "dev": true 1266 | } 1267 | } 1268 | } 1269 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "cpass", 3 | "version": "2.3.0", 4 | "description": "Simplified secured password two-ways encryption", 5 | "main": "./dist/index.js", 6 | "typings": "./dist/index", 7 | "scripts": { 8 | "build": "rm -rf ./dist && npm run lint && tsc -p .", 9 | "lint": "tslint -p .", 10 | "test": "mocha --config ./test/.mocharc.json || ECHO." 11 | }, 12 | "repository": { 13 | "type": "git", 14 | "url": "git+https://github.com/koltyakov/cpass.git" 15 | }, 16 | "keywords": [ 17 | "password", 18 | "encrypt", 19 | "decrypt", 20 | "dummy security" 21 | ], 22 | "author": "Andrew Koltyakov ", 23 | "license": "MIT", 24 | "bugs": { 25 | "url": "https://github.com/koltyakov/cpass/issues" 26 | }, 27 | "homepage": "https://github.com/koltyakov/cpass#readme", 28 | "dependencies": { 29 | "scmp": "^2.1.0" 30 | }, 31 | "devDependencies": { 32 | "@types/chai": "^4.2.11", 33 | "@types/mocha": "^8.0.0", 34 | "@types/node": "^14.0.23", 35 | "chai": "^4.2.0", 36 | "mocha": "^8.0.1", 37 | "ts-node": "^8.10.2", 38 | "tslint": "^6.1.2", 39 | "typescript": "^3.9.7" 40 | } 41 | } 42 | -------------------------------------------------------------------------------- /src/Cpass.ts: -------------------------------------------------------------------------------- 1 | import { hash } from './utils/common'; 2 | import { machineIdSync } from './utils/machineId'; 3 | import { networkId } from './utils/networkId'; 4 | import { Encryptor } from './utils/encryptor'; 5 | 6 | export class Cpass { 7 | 8 | private encryptor: Encryptor; 9 | private machineId: string; 10 | 11 | constructor(masterKey?: string) { 12 | this.machineId = (typeof masterKey !== 'undefined' && masterKey !== null) ? hash(masterKey) : this.getMachineId(); 13 | this.encryptor = new Encryptor(this.machineId); 14 | } 15 | 16 | public encode = (unsecured: string): string => this.encryptor.encrypt(unsecured); 17 | 18 | public decode = (secured: string): string => this.encryptor.decrypt(secured) || secured; 19 | 20 | private getMachineId = (): string => { 21 | let mId: string; 22 | try { 23 | mId = machineIdSync(false); 24 | } catch (ex) { 25 | mId = networkId(false); 26 | } 27 | return mId; 28 | } 29 | 30 | } 31 | -------------------------------------------------------------------------------- /src/index.ts: -------------------------------------------------------------------------------- 1 | export { Cpass } from './Cpass'; 2 | -------------------------------------------------------------------------------- /src/utils/common.ts: -------------------------------------------------------------------------------- 1 | import { createHash } from 'crypto'; 2 | 3 | export const hash = (data: string): string => createHash('sha256').update(data).digest('hex'); 4 | -------------------------------------------------------------------------------- /src/utils/encryptor.ts: -------------------------------------------------------------------------------- 1 | // Copied and converted to TypeScript initially to apply support for aes-256-cbc 2 | // Source: https://github.com/sehrope/node-simple-encryptor 3 | 4 | import * as crypto from 'crypto'; 5 | import * as scmp from 'scmp'; 6 | 7 | // Arbitrary min length, nothing should shorter than this: 8 | const MIN_KEY_LENGTH = 16; 9 | 10 | export interface IEncryptorOptions { 11 | key: string; 12 | hmac?: boolean; 13 | debug?: boolean; 14 | } 15 | 16 | export class Encryptor { 17 | 18 | private chipherAlgorithm = 'aes-256-cbc'; 19 | private debug: boolean; 20 | private cryptoKey: Buffer; 21 | private verifyHmac: boolean; 22 | private reviver: (key: any, value: any) => any; 23 | 24 | constructor(opts: IEncryptorOptions | string) { 25 | if (typeof opts === 'string') { 26 | opts = { key: opts }; 27 | } 28 | 29 | this.verifyHmac = typeof opts.hmac !== 'undefined' ? opts.hmac : true; 30 | this.debug = typeof opts.debug !== 'undefined' ? opts.debug : false; 31 | 32 | if (!opts.key || typeof opts.key !== 'string') { 33 | throw Error('a string key must be specified'); 34 | } 35 | if (opts.key.length < MIN_KEY_LENGTH) { 36 | throw Error(`key must be at least ${MIN_KEY_LENGTH} characters long`); 37 | } 38 | 39 | // Use SHA-256 to derive a 32-byte key from the specified string. 40 | // NOTE: We could alternatively do some kind of key stretching here. 41 | this.cryptoKey = crypto.createHash('sha256').update(opts.key).digest(); 42 | } 43 | 44 | // Returns the HMAC(text) using the derived cryptoKey 45 | // Defaults to returning the result as hex. 46 | public hmac(text: string, format: crypto.HexBase64Latin1Encoding = 'hex'): string { 47 | return crypto.createHmac('sha256', this.cryptoKey).update(text).digest(format); 48 | } 49 | 50 | // Encrypts an arbitrary object using the derived cryptoKey and retursn the result as text. 51 | // The object is first serialized to JSON (via JSON.stringify) and the result is encrypted. 52 | // 53 | // The format of the output is: 54 | // [] 55 | // 56 | // : Optional HMAC 57 | // : Randomly generated initailization vector 58 | // : The encrypted object 59 | public encrypt(obj: any): string { 60 | const json = JSON.stringify(obj); 61 | 62 | // First generate a random IV. 63 | // AES-256 IV size is sixteen bytes: 64 | const iv = crypto.randomBytes(16); 65 | 66 | // Make sure to use the 'iv' variant when creating the cipher object: 67 | const cipher = crypto.createCipheriv(this.chipherAlgorithm, this.cryptoKey, iv); 68 | 69 | // Generate the encrypted json: 70 | const encryptedJson = cipher.update(json, 'utf8', 'base64') + cipher.final('base64'); 71 | 72 | // Include the hex-encoded IV + the encrypted base64 data 73 | // NOTE: We're using hex for encoding the IV to ensure that it's of constant length. 74 | let result = iv.toString('hex') + encryptedJson; 75 | 76 | if (this.verifyHmac) { 77 | // Prepend an HMAC to the result to verify it's integrity prior to decrypting. 78 | // NOTE: We're using hex for encoding the hmac to ensure that it's of constant length 79 | result = this.hmac(result, 'hex') + result; 80 | } 81 | 82 | return result; 83 | } 84 | 85 | // Decrypts the encrypted cipherText and returns back the original object. 86 | // If the cipherText cannot be decrypted (bad key, bad text, bad serialization) then it returns null. 87 | // 88 | // NOTE: This function never throws an error. It will instead return null if it cannot decrypt the cipherText. 89 | // NOTE: It's possible that the data decrypted is null (since it's valid input for encrypt(...)). 90 | // It's up to the caller to decide if the result is valid. 91 | public decrypt(cipherText: string): string | null { 92 | if (!cipherText) { 93 | return null; 94 | } 95 | try { 96 | if (this.verifyHmac) { 97 | // Extract the HMAC from the start of the message: 98 | const expectedHmac = cipherText.substring(0, 64); 99 | // The remaining message is the IV + encrypted message: 100 | cipherText = cipherText.substring(64); 101 | // Calculate the actual HMAC of the message: 102 | const actualHmac = this.hmac(cipherText); 103 | if (!scmp(Buffer.from(actualHmac, 'hex'), Buffer.from(expectedHmac, 'hex'))) { 104 | throw Error('HMAC does not match'); 105 | } 106 | } 107 | 108 | // Extract the IV from the beginning of the message: 109 | const iv = Buffer.from(cipherText.substring(0, 32), 'hex'); 110 | // The remaining text is the encrypted JSON: 111 | const encryptedJson = cipherText.substring(32); 112 | 113 | // Make sure to use the 'iv' variant when creating the decipher object: 114 | const decipher = crypto.createDecipheriv(this.chipherAlgorithm, this.cryptoKey, iv); 115 | // Decrypt the JSON: 116 | const json = decipher.update(encryptedJson, 'base64', 'utf8') + decipher.final('utf8'); 117 | 118 | // Return the parsed object: 119 | return JSON.parse(json, this.reviver); 120 | } catch (error) { 121 | // If we get an error log it and ignore it. Decrypting should never fail. 122 | if (this.debug) { 123 | console.error(`Exception in decrypt (ignored): ${error}`); 124 | } 125 | return null; 126 | } 127 | } 128 | 129 | } 130 | -------------------------------------------------------------------------------- /src/utils/machineId.ts: -------------------------------------------------------------------------------- 1 | import { exec, execSync } from 'child_process'; 2 | import { hash } from './common'; 3 | 4 | const platforms = { 5 | darwin: 'ioreg -rd1 -c IOPlatformExpertDevice', 6 | ia32: '%windir%\\sysnative\\cmd.exe \/c %windir%\\System32\\REG QUERY HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Cryptography /v MachineGuid', 7 | x64: '%windir%\\System32\\REG QUERY HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Cryptography /v MachineGuid', 8 | linux: 'cat /var/lib/dbus/machine-id /etc/machine-id 2> /dev/null || :' 9 | }; 10 | 11 | const expose = (machineRawInfo: string): string => { 12 | switch (process.platform) { 13 | case 'darwin': 14 | return machineRawInfo 15 | .split('IOPlatformUUID')[1] 16 | .split('\n')[0].replace(/\=|\s+|\"/ig, '') 17 | .toLowerCase(); 18 | case 'win32': 19 | return machineRawInfo 20 | .toString() 21 | .split('REG_SZ')[1] 22 | .replace(/\r+|\n+|\s+/ig, '') 23 | .toLowerCase(); 24 | case 'linux': 25 | return machineRawInfo 26 | .toString() 27 | .replace(/\r+|\n+|\s+/ig, '') 28 | .toLowerCase(); 29 | default: 30 | throw new Error(`Unsupported platform: ${process.platform}`); 31 | } 32 | }; 33 | 34 | const getExecCommand = (): string => { 35 | let command: string; 36 | if (process.platform === 'win32') { 37 | let is32 = false; 38 | try { 39 | is32 = !!require('fs').statSync('C:\\windows\\sysnative'); 40 | // tslint:disable-next-line:no-empty 41 | } catch (e) { } 42 | command = platforms[is32 ? 'ia32' : 'x64']; 43 | } else { 44 | command = platforms[process.platform]; 45 | } 46 | return command; 47 | }; 48 | 49 | export const machineIdSync = (original: boolean = true): string => { 50 | const id: string = expose(execSync(getExecCommand()).toString()); 51 | return original ? id : hash(id); 52 | }; 53 | 54 | export const machineId = (original: boolean = true): Promise => { 55 | return new Promise((resolve, reject) => { 56 | return exec(getExecCommand(), {}, (err, stdout) => { 57 | if (err) { 58 | return reject( 59 | new Error(`Error while obtaining machine id: ${err.stack}`) 60 | ); 61 | } 62 | const id: string = expose(stdout.toString()); 63 | return resolve(original ? id : hash(id)); 64 | }); 65 | }); 66 | }; 67 | -------------------------------------------------------------------------------- /src/utils/networkId.ts: -------------------------------------------------------------------------------- 1 | import { networkInterfaces, hostname } from 'os'; 2 | import { hash } from './common'; 3 | 4 | export const networkIds = (original: boolean = true): string[] => { 5 | const networkIntfs = networkInterfaces() || {}; 6 | const netIds: string[] = []; 7 | Object.keys(networkIntfs).forEach(intfsProp => { 8 | Object.keys(networkIntfs[intfsProp]).forEach(adapterProp => { 9 | const iNet = networkIntfs[intfsProp][adapterProp]; 10 | if (iNet && iNet.address.length && !iNet.internal && iNet.mac !== '00:00:00:00:00:00') { 11 | if (netIds.indexOf(iNet.mac) === -1) { 12 | netIds.push(iNet.mac); 13 | } 14 | } 15 | }); 16 | }); 17 | if (netIds.length === 0) { 18 | netIds.push(hostname()); 19 | } 20 | return original ? netIds : netIds.map(netId => hash(netId)); 21 | }; 22 | 23 | export const networkId = (original: boolean = true): string => { 24 | const netId: string = networkIds(original)[0]; 25 | return original ? netId : hash(netId); 26 | }; 27 | -------------------------------------------------------------------------------- /test/.mocharc.json: -------------------------------------------------------------------------------- 1 | { 2 | "require": "ts-node/register", 3 | "watch-extensions": ["ts"], 4 | "extension": ["ts"], 5 | "watch-files": ["test/**/*.spec.ts"], 6 | "opts": false 7 | } -------------------------------------------------------------------------------- /test/manual/basic.ts: -------------------------------------------------------------------------------- 1 | import { Cpass } from '../../src'; 2 | 3 | const original = 'secret'; 4 | const cpass = new Cpass('CUSTOM_KEY'); 5 | const encoded = cpass.encode(original); 6 | 7 | console.log(encoded); 8 | 9 | console.log(cpass.decode(encoded)); -------------------------------------------------------------------------------- /test/test.spec.ts: -------------------------------------------------------------------------------- 1 | import { expect } from 'chai'; 2 | import * as mocha from 'mocha'; 3 | 4 | import { Cpass } from '../src'; 5 | import { machineIdSync } from '../src/utils/machineId'; 6 | import { networkId } from '../src/utils/networkId'; 7 | 8 | let cpass: Cpass; 9 | const modes: any = [null, 'master_key_mode']; 10 | 11 | describe(`Cpass tests`, () => { 12 | 13 | for (const mode of modes) { 14 | 15 | describe(`Mode: ${mode === null ? 'Auto' : 'Master Key'}`, () => { 16 | 17 | before('Setup cpass', () => { 18 | cpass = new Cpass(mode); 19 | }); 20 | 21 | it(`should encode a string`, () => { 22 | const original = 'original string'; 23 | const encoded = cpass.encode(original); 24 | expect(encoded).not.equal(original); 25 | }); 26 | 27 | it(`should decode to the original`, () => { 28 | const original = 'password'; 29 | const encoded = cpass.encode(original); 30 | const decoded = cpass.decode(encoded); 31 | expect(decoded).is.equal(original); 32 | }); 33 | 34 | it(`should decode plain to itself`, () => { 35 | const original = 'plain_password'; 36 | const decoded = cpass.decode(original); 37 | expect(decoded).is.equal(original); 38 | }); 39 | 40 | it(`should not decode modified hash`, () => { 41 | const original = 'plain_password'; 42 | const encoded = cpass.encode(original); 43 | const modified = encoded + '_'; 44 | const decoded = cpass.decode(modified); 45 | expect(decoded).is.not.equal(original); 46 | expect(decoded).is.equal(modified); 47 | }); 48 | 49 | }); 50 | 51 | } 52 | 53 | describe(`Special conditions`, () => { 54 | 55 | it(`should decode differently 1`, () => { 56 | const original = 'plain_password'; 57 | const cpass1 = new Cpass('Key1'); 58 | const cpass2 = new Cpass('Key2'); 59 | const encoded1 = cpass1.encode(original); 60 | const encoded2 = cpass2.encode(original); 61 | expect(encoded1).is.not.equal(encoded2); 62 | }); 63 | 64 | it(`should decode differently 2`, () => { 65 | const original = 'plain_password'; 66 | const cpass1 = new Cpass(); 67 | const cpass2 = new Cpass('Key'); 68 | const encoded1 = cpass1.encode(original); 69 | const encoded2 = cpass2.encode(original); 70 | expect(encoded1).is.not.equal(encoded2); 71 | }); 72 | 73 | it(`should receive machineId`, () => { 74 | const mId = machineIdSync(false) || ''; 75 | expect(mId.length).is.greaterThan(0); 76 | }); 77 | 78 | it(`should receive networkId`, () => { 79 | const nId = networkId(false) || ''; 80 | expect(nId.length).is.greaterThan(0); 81 | }); 82 | 83 | it(`should use machineId with priority`, () => { 84 | const original = 'plain_password'; 85 | const mId = machineIdSync(true); 86 | const cpass1 = new Cpass(mId); 87 | const cpass2 = new Cpass(); 88 | const encoded = cpass1.encode(original); 89 | const decoded = cpass2.decode(encoded); 90 | expect(decoded).is.equal(original); 91 | }); 92 | 93 | it(`should decode by a specific key`, () => { 94 | const original = 'plain_password'; 95 | const encoded = '6230a961ee20ecc45d40cbf55b777e086b47044850a8c30' + 96 | 'f446b32fa2b0a97f3897e034bf3e04cd891e1f3c13730c6' + 97 | '55d1oCZxXLg9QZknoY8UVL8WKJKgyKVZ4DW99X+C/pfRc='; 98 | cpass = new Cpass('My_Secret_Key'); 99 | const decoded = cpass.decode(encoded); 100 | expect(decoded).is.equal(original); 101 | }); 102 | 103 | }); 104 | 105 | }); 106 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "target": "es5", 4 | "module": "commonjs", 5 | "lib": ["es2017"], 6 | "sourceMap": true, 7 | "declaration": true, 8 | "moduleResolution": "node", 9 | "noImplicitAny": false, 10 | "removeComments": true, 11 | "newLine": "LF", 12 | "skipLibCheck": true, 13 | "types": ["node", "mocha"], 14 | "outDir": "dist" 15 | }, 16 | "include": [ 17 | "src/**/*.ts", 18 | "test/**/*.ts" 19 | ], 20 | "exclude": [ 21 | "node_modules", 22 | "dist", 23 | "test" 24 | ] 25 | } -------------------------------------------------------------------------------- /tslint.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "tslint:latest", 3 | "rules": { 4 | "semicolon": [true, "always", "ignore-interfaces"], 5 | "space-before-function-paren": [true, "never"], 6 | "no-console": false, 7 | "no-implicit-dependencies": false 8 | } 9 | } 10 | --------------------------------------------------------------------------------