├── .gitignore ├── .vscode └── settings.json ├── LICENSE ├── README.md ├── bin ├── ts-eager-paths.sh └── ts-eager.sh ├── package-lock.json ├── package.json ├── register-paths.js ├── register.js ├── test ├── basic │ ├── test.ts │ └── tsconfig.json ├── decorators │ ├── test.ts │ └── tsconfig.json ├── paths │ ├── lib │ │ └── file1.ts │ ├── test.ts │ └── tsconfig.json └── test.js └── tsconfig.json /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | -------------------------------------------------------------------------------- /.vscode/settings.json: -------------------------------------------------------------------------------- 1 | { 2 | "editor.defaultFormatter": "esbenp.prettier-vscode", 3 | "editor.formatOnSave": true, 4 | "eslint.validate": ["javascript"], 5 | "editor.codeActionsOnSave": { 6 | "source.fixAll.eslint": true 7 | }, 8 | "typescript.tsdk": "node_modules/typescript/lib" 9 | } 10 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2020 Michael Hart 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. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # ts-eager 2 | 3 | Fast TypeScript runner and register hook with eager compilation. 4 | 5 | Similar to [`ts-node`](https://github.com/TypeStrong/ts-node), except it uses [`esbuild`](https://github.com/evanw/esbuild) – an extremely fast TypeScript transpiler – to eagerly compile all included files from your `tsconfig.json` on startup. This makes a noticeable difference for tasks where you're likely to load a good portion of your TS files, eg running tests. 6 | 7 | It falls back to lazy compilation if a file is require'd that's not in `tsconfig.json`, and will also fallback to `ts-node` (if it's installed) for any type-specific compilation that `esbuild` doesn't support (such as `emitDecoratorMetadata`). It will also optionally require `tsconfig-paths` for `paths` support if your `tsconfig` needs it. 8 | 9 | ## Installation 10 | 11 | ```console 12 | npm install -D ts-eager 13 | 14 | # Optional, but recommended: for determining files from tsconfig.json 15 | npm install -D typescript 16 | 17 | # Optional, if you need emitDecoratorMetadata support 18 | npm install -D ts-node 19 | 20 | # Optional, if you need paths support 21 | npm install -D tsconfig-paths 22 | ``` 23 | 24 | ## Usage 25 | 26 | ```console 27 | ts-eager myfile.ts 28 | ``` 29 | 30 | Or as a require hook: 31 | 32 | ```console 33 | node -r ts-eager/register myfile.ts 34 | ``` 35 | 36 | ## Configuration 37 | 38 | `ts-eager` doesn't have any specific command-line options – it invokes `node` and passes all command-line arguments through. 39 | 40 | It supports these environment variables: 41 | 42 | - `TS_EAGER_LOGLEVEL`: 'error' (default), 'warning', 'info', 'silent' 43 | - `TS_NODE_PROJECT`: tsconfig file (default tsconfig.json) 44 | - `TS_NODE_IGNORE`: comma separated regexes to skip compilation completely 45 | 46 | ## Examples 47 | 48 | If you want to customize which files `ts-eager` compiles up-front, you can specify a different `tsconfig.json` using `TS_NODE_PROJECT`, and then use the standard TypeScript `include`/`exclude` options in your config. 49 | 50 | For example, if this was in `tsconfig.test.json`: 51 | 52 | ```json 53 | { 54 | "extends": "./tsconfig.json", 55 | "include": ["test"], 56 | "exclude": ["**/*.template.ts"] 57 | } 58 | ``` 59 | 60 | Then you could run `mocha` like this: 61 | 62 | ```console 63 | TS_NODE_PROJECT=tsconfig.test.json mocha -r ts-eager/register 64 | ``` 65 | 66 | And it would only eagerly compile files in `test`, and exclude any matching `*.template.ts`. 67 | 68 | `mocha` also supports adding require hooks in `.mocharc.json`: 69 | 70 | ```json 71 | { 72 | "recursive": true, 73 | "require": ["ts-eager/register"], 74 | "timeout": 5000 75 | } 76 | ``` 77 | -------------------------------------------------------------------------------- /bin/ts-eager-paths.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | # deprecated: ts-eager detects paths presence automatically now 3 | exec node -r ts-eager/register-paths ${1+"$@"} 4 | -------------------------------------------------------------------------------- /bin/ts-eager.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | exec node -r ts-eager/register ${1+"$@"} 3 | -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "ts-eager", 3 | "version": "2.0.2", 4 | "lockfileVersion": 1, 5 | "requires": true, 6 | "dependencies": { 7 | "@babel/code-frame": { 8 | "version": "7.12.11", 9 | "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.11.tgz", 10 | "integrity": "sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==", 11 | "dev": true, 12 | "requires": { 13 | "@babel/highlight": "^7.10.4" 14 | } 15 | }, 16 | "@babel/helper-validator-identifier": { 17 | "version": "7.14.0", 18 | "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.0.tgz", 19 | "integrity": "sha512-V3ts7zMSu5lfiwWDVWzRDGIN+lnCEUdaXgtVHJgLb1rGaA6jMrtB9EmE7L18foXJIE8Un/A/h6NJfGQp/e1J4A==", 20 | "dev": true 21 | }, 22 | "@babel/highlight": { 23 | "version": "7.14.0", 24 | "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.14.0.tgz", 25 | "integrity": "sha512-YSCOwxvTYEIMSGaBQb5kDDsCopDdiUGsqpatp3fOlI4+2HQSkTmEVWnVuySdAC5EWCqSWWTv0ib63RjR7dTBdg==", 26 | "dev": true, 27 | "requires": { 28 | "@babel/helper-validator-identifier": "^7.14.0", 29 | "chalk": "^2.0.0", 30 | "js-tokens": "^4.0.0" 31 | }, 32 | "dependencies": { 33 | "chalk": { 34 | "version": "2.4.2", 35 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", 36 | "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", 37 | "dev": true, 38 | "requires": { 39 | "ansi-styles": "^3.2.1", 40 | "escape-string-regexp": "^1.0.5", 41 | "supports-color": "^5.3.0" 42 | } 43 | } 44 | } 45 | }, 46 | "@eslint/eslintrc": { 47 | "version": "0.4.1", 48 | "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.4.1.tgz", 49 | "integrity": "sha512-5v7TDE9plVhvxQeWLXDTvFvJBdH6pEsdnl2g/dAptmuFEPedQ4Erq5rsDsX+mvAM610IhNaO2W5V1dOOnDKxkQ==", 50 | "dev": true, 51 | "requires": { 52 | "ajv": "^6.12.4", 53 | "debug": "^4.1.1", 54 | "espree": "^7.3.0", 55 | "globals": "^12.1.0", 56 | "ignore": "^4.0.6", 57 | "import-fresh": "^3.2.1", 58 | "js-yaml": "^3.13.1", 59 | "minimatch": "^3.0.4", 60 | "strip-json-comments": "^3.1.1" 61 | }, 62 | "dependencies": { 63 | "globals": { 64 | "version": "12.4.0", 65 | "resolved": "https://registry.npmjs.org/globals/-/globals-12.4.0.tgz", 66 | "integrity": "sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg==", 67 | "dev": true, 68 | "requires": { 69 | "type-fest": "^0.8.1" 70 | } 71 | } 72 | } 73 | }, 74 | "@types/json5": { 75 | "version": "0.0.29", 76 | "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", 77 | "integrity": "sha1-7ihweulOEdK4J7y+UnC86n8+ce4=", 78 | "dev": true 79 | }, 80 | "@types/node": { 81 | "version": "14.14.44", 82 | "resolved": "https://registry.npmjs.org/@types/node/-/node-14.14.44.tgz", 83 | "integrity": "sha512-+gaugz6Oce6ZInfI/tK4Pq5wIIkJMEJUu92RB3Eu93mtj4wjjjz9EB5mLp5s1pSsLXdC/CPut/xF20ZzAQJbTA==", 84 | "dev": true 85 | }, 86 | "acorn": { 87 | "version": "7.4.1", 88 | "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", 89 | "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", 90 | "dev": true 91 | }, 92 | "acorn-jsx": { 93 | "version": "5.3.1", 94 | "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.1.tgz", 95 | "integrity": "sha512-K0Ptm/47OKfQRpNQ2J/oIN/3QYiK6FwW+eJbILhsdxh2WTLdl+30o8aGdTbm5JbffpFFAg/g+zi1E+jvJha5ng==", 96 | "dev": true 97 | }, 98 | "ajv": { 99 | "version": "6.12.6", 100 | "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", 101 | "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", 102 | "dev": true, 103 | "requires": { 104 | "fast-deep-equal": "^3.1.1", 105 | "fast-json-stable-stringify": "^2.0.0", 106 | "json-schema-traverse": "^0.4.1", 107 | "uri-js": "^4.2.2" 108 | } 109 | }, 110 | "ansi-colors": { 111 | "version": "4.1.1", 112 | "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", 113 | "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", 114 | "dev": true 115 | }, 116 | "ansi-regex": { 117 | "version": "5.0.0", 118 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", 119 | "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", 120 | "dev": true 121 | }, 122 | "ansi-styles": { 123 | "version": "3.2.1", 124 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", 125 | "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", 126 | "dev": true, 127 | "requires": { 128 | "color-convert": "^1.9.0" 129 | } 130 | }, 131 | "arg": { 132 | "version": "4.1.3", 133 | "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", 134 | "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", 135 | "dev": true 136 | }, 137 | "argparse": { 138 | "version": "1.0.10", 139 | "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", 140 | "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", 141 | "dev": true, 142 | "requires": { 143 | "sprintf-js": "~1.0.2" 144 | } 145 | }, 146 | "astral-regex": { 147 | "version": "2.0.0", 148 | "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", 149 | "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", 150 | "dev": true 151 | }, 152 | "balanced-match": { 153 | "version": "1.0.2", 154 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", 155 | "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", 156 | "dev": true 157 | }, 158 | "brace-expansion": { 159 | "version": "1.1.11", 160 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", 161 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", 162 | "dev": true, 163 | "requires": { 164 | "balanced-match": "^1.0.0", 165 | "concat-map": "0.0.1" 166 | } 167 | }, 168 | "buffer-from": { 169 | "version": "1.1.1", 170 | "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", 171 | "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==" 172 | }, 173 | "callsites": { 174 | "version": "3.1.0", 175 | "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", 176 | "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", 177 | "dev": true 178 | }, 179 | "chalk": { 180 | "version": "4.1.1", 181 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", 182 | "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", 183 | "dev": true, 184 | "requires": { 185 | "ansi-styles": "^4.1.0", 186 | "supports-color": "^7.1.0" 187 | }, 188 | "dependencies": { 189 | "ansi-styles": { 190 | "version": "4.3.0", 191 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", 192 | "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", 193 | "dev": true, 194 | "requires": { 195 | "color-convert": "^2.0.1" 196 | } 197 | }, 198 | "color-convert": { 199 | "version": "2.0.1", 200 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", 201 | "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", 202 | "dev": true, 203 | "requires": { 204 | "color-name": "~1.1.4" 205 | } 206 | }, 207 | "color-name": { 208 | "version": "1.1.4", 209 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", 210 | "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", 211 | "dev": true 212 | }, 213 | "has-flag": { 214 | "version": "4.0.0", 215 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", 216 | "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", 217 | "dev": true 218 | }, 219 | "supports-color": { 220 | "version": "7.2.0", 221 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", 222 | "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", 223 | "dev": true, 224 | "requires": { 225 | "has-flag": "^4.0.0" 226 | } 227 | } 228 | } 229 | }, 230 | "color-convert": { 231 | "version": "1.9.3", 232 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", 233 | "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", 234 | "dev": true, 235 | "requires": { 236 | "color-name": "1.1.3" 237 | } 238 | }, 239 | "color-name": { 240 | "version": "1.1.3", 241 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", 242 | "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", 243 | "dev": true 244 | }, 245 | "concat-map": { 246 | "version": "0.0.1", 247 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", 248 | "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", 249 | "dev": true 250 | }, 251 | "create-require": { 252 | "version": "1.1.1", 253 | "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", 254 | "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", 255 | "dev": true 256 | }, 257 | "cross-spawn": { 258 | "version": "7.0.3", 259 | "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", 260 | "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", 261 | "dev": true, 262 | "requires": { 263 | "path-key": "^3.1.0", 264 | "shebang-command": "^2.0.0", 265 | "which": "^2.0.1" 266 | } 267 | }, 268 | "debug": { 269 | "version": "4.3.1", 270 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", 271 | "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", 272 | "dev": true, 273 | "requires": { 274 | "ms": "2.1.2" 275 | } 276 | }, 277 | "deep-is": { 278 | "version": "0.1.3", 279 | "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", 280 | "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", 281 | "dev": true 282 | }, 283 | "diff": { 284 | "version": "4.0.2", 285 | "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", 286 | "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", 287 | "dev": true 288 | }, 289 | "doctrine": { 290 | "version": "3.0.0", 291 | "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", 292 | "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", 293 | "dev": true, 294 | "requires": { 295 | "esutils": "^2.0.2" 296 | } 297 | }, 298 | "emoji-regex": { 299 | "version": "8.0.0", 300 | "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", 301 | "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", 302 | "dev": true 303 | }, 304 | "enquirer": { 305 | "version": "2.3.6", 306 | "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz", 307 | "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==", 308 | "dev": true, 309 | "requires": { 310 | "ansi-colors": "^4.1.1" 311 | } 312 | }, 313 | "esbuild": { 314 | "version": "0.11.20", 315 | "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.11.20.tgz", 316 | "integrity": "sha512-QOZrVpN/Yz74xfat0H6euSgn3RnwLevY1mJTEXneukz1ln9qB+ieaerRMzSeETpz/UJWsBMzRVR/andBht5WKw==" 317 | }, 318 | "escape-string-regexp": { 319 | "version": "1.0.5", 320 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", 321 | "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", 322 | "dev": true 323 | }, 324 | "eslint": { 325 | "version": "7.26.0", 326 | "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.26.0.tgz", 327 | "integrity": "sha512-4R1ieRf52/izcZE7AlLy56uIHHDLT74Yzz2Iv2l6kDaYvEu9x+wMB5dZArVL8SYGXSYV2YAg70FcW5Y5nGGNIg==", 328 | "dev": true, 329 | "requires": { 330 | "@babel/code-frame": "7.12.11", 331 | "@eslint/eslintrc": "^0.4.1", 332 | "ajv": "^6.10.0", 333 | "chalk": "^4.0.0", 334 | "cross-spawn": "^7.0.2", 335 | "debug": "^4.0.1", 336 | "doctrine": "^3.0.0", 337 | "enquirer": "^2.3.5", 338 | "eslint-scope": "^5.1.1", 339 | "eslint-utils": "^2.1.0", 340 | "eslint-visitor-keys": "^2.0.0", 341 | "espree": "^7.3.1", 342 | "esquery": "^1.4.0", 343 | "esutils": "^2.0.2", 344 | "file-entry-cache": "^6.0.1", 345 | "functional-red-black-tree": "^1.0.1", 346 | "glob-parent": "^5.0.0", 347 | "globals": "^13.6.0", 348 | "ignore": "^4.0.6", 349 | "import-fresh": "^3.0.0", 350 | "imurmurhash": "^0.1.4", 351 | "is-glob": "^4.0.0", 352 | "js-yaml": "^3.13.1", 353 | "json-stable-stringify-without-jsonify": "^1.0.1", 354 | "levn": "^0.4.1", 355 | "lodash": "^4.17.21", 356 | "minimatch": "^3.0.4", 357 | "natural-compare": "^1.4.0", 358 | "optionator": "^0.9.1", 359 | "progress": "^2.0.0", 360 | "regexpp": "^3.1.0", 361 | "semver": "^7.2.1", 362 | "strip-ansi": "^6.0.0", 363 | "strip-json-comments": "^3.1.0", 364 | "table": "^6.0.4", 365 | "text-table": "^0.2.0", 366 | "v8-compile-cache": "^2.0.3" 367 | } 368 | }, 369 | "eslint-config-prettier": { 370 | "version": "8.3.0", 371 | "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.3.0.tgz", 372 | "integrity": "sha512-BgZuLUSeKzvlL/VUjx/Yb787VQ26RU3gGjA3iiFvdsp/2bMfVIWUVP7tjxtjS0e+HP409cPlPvNkQloz8C91ew==", 373 | "dev": true 374 | }, 375 | "eslint-scope": { 376 | "version": "5.1.1", 377 | "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", 378 | "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", 379 | "dev": true, 380 | "requires": { 381 | "esrecurse": "^4.3.0", 382 | "estraverse": "^4.1.1" 383 | } 384 | }, 385 | "eslint-utils": { 386 | "version": "2.1.0", 387 | "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", 388 | "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", 389 | "dev": true, 390 | "requires": { 391 | "eslint-visitor-keys": "^1.1.0" 392 | }, 393 | "dependencies": { 394 | "eslint-visitor-keys": { 395 | "version": "1.3.0", 396 | "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", 397 | "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", 398 | "dev": true 399 | } 400 | } 401 | }, 402 | "eslint-visitor-keys": { 403 | "version": "2.1.0", 404 | "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", 405 | "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", 406 | "dev": true 407 | }, 408 | "espree": { 409 | "version": "7.3.1", 410 | "resolved": "https://registry.npmjs.org/espree/-/espree-7.3.1.tgz", 411 | "integrity": "sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g==", 412 | "dev": true, 413 | "requires": { 414 | "acorn": "^7.4.0", 415 | "acorn-jsx": "^5.3.1", 416 | "eslint-visitor-keys": "^1.3.0" 417 | }, 418 | "dependencies": { 419 | "eslint-visitor-keys": { 420 | "version": "1.3.0", 421 | "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", 422 | "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", 423 | "dev": true 424 | } 425 | } 426 | }, 427 | "esprima": { 428 | "version": "4.0.1", 429 | "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", 430 | "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", 431 | "dev": true 432 | }, 433 | "esquery": { 434 | "version": "1.4.0", 435 | "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz", 436 | "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==", 437 | "dev": true, 438 | "requires": { 439 | "estraverse": "^5.1.0" 440 | }, 441 | "dependencies": { 442 | "estraverse": { 443 | "version": "5.2.0", 444 | "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", 445 | "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", 446 | "dev": true 447 | } 448 | } 449 | }, 450 | "esrecurse": { 451 | "version": "4.3.0", 452 | "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", 453 | "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", 454 | "dev": true, 455 | "requires": { 456 | "estraverse": "^5.2.0" 457 | }, 458 | "dependencies": { 459 | "estraverse": { 460 | "version": "5.2.0", 461 | "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", 462 | "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", 463 | "dev": true 464 | } 465 | } 466 | }, 467 | "estraverse": { 468 | "version": "4.3.0", 469 | "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", 470 | "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", 471 | "dev": true 472 | }, 473 | "esutils": { 474 | "version": "2.0.3", 475 | "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", 476 | "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", 477 | "dev": true 478 | }, 479 | "fast-deep-equal": { 480 | "version": "3.1.3", 481 | "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", 482 | "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", 483 | "dev": true 484 | }, 485 | "fast-json-stable-stringify": { 486 | "version": "2.1.0", 487 | "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", 488 | "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", 489 | "dev": true 490 | }, 491 | "fast-levenshtein": { 492 | "version": "2.0.6", 493 | "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", 494 | "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", 495 | "dev": true 496 | }, 497 | "file-entry-cache": { 498 | "version": "6.0.1", 499 | "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", 500 | "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", 501 | "dev": true, 502 | "requires": { 503 | "flat-cache": "^3.0.4" 504 | } 505 | }, 506 | "flat-cache": { 507 | "version": "3.0.4", 508 | "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", 509 | "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", 510 | "dev": true, 511 | "requires": { 512 | "flatted": "^3.1.0", 513 | "rimraf": "^3.0.2" 514 | } 515 | }, 516 | "flatted": { 517 | "version": "3.1.1", 518 | "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.1.1.tgz", 519 | "integrity": "sha512-zAoAQiudy+r5SvnSw3KJy5os/oRJYHzrzja/tBDqrZtNhUw8bt6y8OBzMWcjWr+8liV8Eb6yOhw8WZ7VFZ5ZzA==", 520 | "dev": true 521 | }, 522 | "fs.realpath": { 523 | "version": "1.0.0", 524 | "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", 525 | "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", 526 | "dev": true 527 | }, 528 | "functional-red-black-tree": { 529 | "version": "1.0.1", 530 | "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", 531 | "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", 532 | "dev": true 533 | }, 534 | "glob": { 535 | "version": "7.1.7", 536 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz", 537 | "integrity": "sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==", 538 | "dev": true, 539 | "requires": { 540 | "fs.realpath": "^1.0.0", 541 | "inflight": "^1.0.4", 542 | "inherits": "2", 543 | "minimatch": "^3.0.4", 544 | "once": "^1.3.0", 545 | "path-is-absolute": "^1.0.0" 546 | } 547 | }, 548 | "glob-parent": { 549 | "version": "5.1.2", 550 | "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", 551 | "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", 552 | "dev": true, 553 | "requires": { 554 | "is-glob": "^4.0.1" 555 | } 556 | }, 557 | "globals": { 558 | "version": "13.8.0", 559 | "resolved": "https://registry.npmjs.org/globals/-/globals-13.8.0.tgz", 560 | "integrity": "sha512-rHtdA6+PDBIjeEvA91rpqzEvk/k3/i7EeNQiryiWuJH0Hw9cpyJMAt2jtbAwUaRdhD+573X4vWw6IcjKPasi9Q==", 561 | "dev": true, 562 | "requires": { 563 | "type-fest": "^0.20.2" 564 | }, 565 | "dependencies": { 566 | "type-fest": { 567 | "version": "0.20.2", 568 | "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", 569 | "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", 570 | "dev": true 571 | } 572 | } 573 | }, 574 | "has-flag": { 575 | "version": "3.0.0", 576 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", 577 | "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", 578 | "dev": true 579 | }, 580 | "ignore": { 581 | "version": "4.0.6", 582 | "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", 583 | "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", 584 | "dev": true 585 | }, 586 | "import-fresh": { 587 | "version": "3.3.0", 588 | "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", 589 | "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", 590 | "dev": true, 591 | "requires": { 592 | "parent-module": "^1.0.0", 593 | "resolve-from": "^4.0.0" 594 | } 595 | }, 596 | "imurmurhash": { 597 | "version": "0.1.4", 598 | "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", 599 | "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", 600 | "dev": true 601 | }, 602 | "inflight": { 603 | "version": "1.0.6", 604 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", 605 | "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", 606 | "dev": true, 607 | "requires": { 608 | "once": "^1.3.0", 609 | "wrappy": "1" 610 | } 611 | }, 612 | "inherits": { 613 | "version": "2.0.4", 614 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", 615 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", 616 | "dev": true 617 | }, 618 | "is-extglob": { 619 | "version": "2.1.1", 620 | "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", 621 | "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", 622 | "dev": true 623 | }, 624 | "is-fullwidth-code-point": { 625 | "version": "3.0.0", 626 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", 627 | "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", 628 | "dev": true 629 | }, 630 | "is-glob": { 631 | "version": "4.0.1", 632 | "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", 633 | "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", 634 | "dev": true, 635 | "requires": { 636 | "is-extglob": "^2.1.1" 637 | } 638 | }, 639 | "isexe": { 640 | "version": "2.0.0", 641 | "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", 642 | "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", 643 | "dev": true 644 | }, 645 | "js-tokens": { 646 | "version": "4.0.0", 647 | "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", 648 | "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", 649 | "dev": true 650 | }, 651 | "js-yaml": { 652 | "version": "3.14.1", 653 | "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", 654 | "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", 655 | "dev": true, 656 | "requires": { 657 | "argparse": "^1.0.7", 658 | "esprima": "^4.0.0" 659 | } 660 | }, 661 | "json-schema-traverse": { 662 | "version": "0.4.1", 663 | "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", 664 | "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", 665 | "dev": true 666 | }, 667 | "json-stable-stringify-without-jsonify": { 668 | "version": "1.0.1", 669 | "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", 670 | "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", 671 | "dev": true 672 | }, 673 | "json5": { 674 | "version": "1.0.1", 675 | "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", 676 | "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", 677 | "dev": true, 678 | "requires": { 679 | "minimist": "^1.2.0" 680 | } 681 | }, 682 | "levn": { 683 | "version": "0.4.1", 684 | "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", 685 | "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", 686 | "dev": true, 687 | "requires": { 688 | "prelude-ls": "^1.2.1", 689 | "type-check": "~0.4.0" 690 | } 691 | }, 692 | "lodash": { 693 | "version": "4.17.21", 694 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", 695 | "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", 696 | "dev": true 697 | }, 698 | "lodash.clonedeep": { 699 | "version": "4.5.0", 700 | "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", 701 | "integrity": "sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8=", 702 | "dev": true 703 | }, 704 | "lodash.truncate": { 705 | "version": "4.4.2", 706 | "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz", 707 | "integrity": "sha1-WjUNoLERO4N+z//VgSy+WNbq4ZM=", 708 | "dev": true 709 | }, 710 | "lru-cache": { 711 | "version": "6.0.0", 712 | "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", 713 | "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", 714 | "dev": true, 715 | "requires": { 716 | "yallist": "^4.0.0" 717 | } 718 | }, 719 | "make-error": { 720 | "version": "1.3.6", 721 | "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", 722 | "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", 723 | "dev": true 724 | }, 725 | "minimatch": { 726 | "version": "3.0.4", 727 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", 728 | "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", 729 | "dev": true, 730 | "requires": { 731 | "brace-expansion": "^1.1.7" 732 | } 733 | }, 734 | "minimist": { 735 | "version": "1.2.5", 736 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", 737 | "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", 738 | "dev": true 739 | }, 740 | "ms": { 741 | "version": "2.1.2", 742 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", 743 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", 744 | "dev": true 745 | }, 746 | "natural-compare": { 747 | "version": "1.4.0", 748 | "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", 749 | "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", 750 | "dev": true 751 | }, 752 | "once": { 753 | "version": "1.4.0", 754 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 755 | "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", 756 | "dev": true, 757 | "requires": { 758 | "wrappy": "1" 759 | } 760 | }, 761 | "optionator": { 762 | "version": "0.9.1", 763 | "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", 764 | "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", 765 | "dev": true, 766 | "requires": { 767 | "deep-is": "^0.1.3", 768 | "fast-levenshtein": "^2.0.6", 769 | "levn": "^0.4.1", 770 | "prelude-ls": "^1.2.1", 771 | "type-check": "^0.4.0", 772 | "word-wrap": "^1.2.3" 773 | } 774 | }, 775 | "parent-module": { 776 | "version": "1.0.1", 777 | "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", 778 | "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", 779 | "dev": true, 780 | "requires": { 781 | "callsites": "^3.0.0" 782 | } 783 | }, 784 | "path-is-absolute": { 785 | "version": "1.0.1", 786 | "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", 787 | "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", 788 | "dev": true 789 | }, 790 | "path-key": { 791 | "version": "3.1.1", 792 | "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", 793 | "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", 794 | "dev": true 795 | }, 796 | "prelude-ls": { 797 | "version": "1.2.1", 798 | "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", 799 | "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", 800 | "dev": true 801 | }, 802 | "prettier": { 803 | "version": "2.3.0", 804 | "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.3.0.tgz", 805 | "integrity": "sha512-kXtO4s0Lz/DW/IJ9QdWhAf7/NmPWQXkFr/r/WkR3vyI+0v8amTDxiaQSLzs8NBlytfLWX/7uQUMIW677yLKl4w==", 806 | "dev": true 807 | }, 808 | "progress": { 809 | "version": "2.0.3", 810 | "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", 811 | "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", 812 | "dev": true 813 | }, 814 | "punycode": { 815 | "version": "2.1.1", 816 | "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", 817 | "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", 818 | "dev": true 819 | }, 820 | "reflect-metadata": { 821 | "version": "0.1.13", 822 | "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.1.13.tgz", 823 | "integrity": "sha512-Ts1Y/anZELhSsjMcU605fU9RE4Oi3p5ORujwbIKXfWa+0Zxs510Qrmrce5/Jowq3cHSZSJqBjypxmHarc+vEWg==", 824 | "dev": true 825 | }, 826 | "regexpp": { 827 | "version": "3.1.0", 828 | "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.1.0.tgz", 829 | "integrity": "sha512-ZOIzd8yVsQQA7j8GCSlPGXwg5PfmA1mrq0JP4nGhh54LaKN3xdai/vHUDu74pKwV8OxseMS65u2NImosQcSD0Q==", 830 | "dev": true 831 | }, 832 | "require-from-string": { 833 | "version": "2.0.2", 834 | "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", 835 | "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", 836 | "dev": true 837 | }, 838 | "resolve-from": { 839 | "version": "4.0.0", 840 | "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", 841 | "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", 842 | "dev": true 843 | }, 844 | "rimraf": { 845 | "version": "3.0.2", 846 | "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", 847 | "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", 848 | "dev": true, 849 | "requires": { 850 | "glob": "^7.1.3" 851 | } 852 | }, 853 | "semver": { 854 | "version": "7.3.5", 855 | "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", 856 | "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", 857 | "dev": true, 858 | "requires": { 859 | "lru-cache": "^6.0.0" 860 | } 861 | }, 862 | "shebang-command": { 863 | "version": "2.0.0", 864 | "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", 865 | "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", 866 | "dev": true, 867 | "requires": { 868 | "shebang-regex": "^3.0.0" 869 | } 870 | }, 871 | "shebang-regex": { 872 | "version": "3.0.0", 873 | "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", 874 | "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", 875 | "dev": true 876 | }, 877 | "slice-ansi": { 878 | "version": "4.0.0", 879 | "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", 880 | "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", 881 | "dev": true, 882 | "requires": { 883 | "ansi-styles": "^4.0.0", 884 | "astral-regex": "^2.0.0", 885 | "is-fullwidth-code-point": "^3.0.0" 886 | }, 887 | "dependencies": { 888 | "ansi-styles": { 889 | "version": "4.3.0", 890 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", 891 | "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", 892 | "dev": true, 893 | "requires": { 894 | "color-convert": "^2.0.1" 895 | } 896 | }, 897 | "color-convert": { 898 | "version": "2.0.1", 899 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", 900 | "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", 901 | "dev": true, 902 | "requires": { 903 | "color-name": "~1.1.4" 904 | } 905 | }, 906 | "color-name": { 907 | "version": "1.1.4", 908 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", 909 | "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", 910 | "dev": true 911 | } 912 | } 913 | }, 914 | "source-map": { 915 | "version": "0.6.1", 916 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", 917 | "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" 918 | }, 919 | "source-map-support": { 920 | "version": "0.5.19", 921 | "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.19.tgz", 922 | "integrity": "sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==", 923 | "requires": { 924 | "buffer-from": "^1.0.0", 925 | "source-map": "^0.6.0" 926 | } 927 | }, 928 | "sprintf-js": { 929 | "version": "1.0.3", 930 | "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", 931 | "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", 932 | "dev": true 933 | }, 934 | "string-width": { 935 | "version": "4.2.2", 936 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz", 937 | "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==", 938 | "dev": true, 939 | "requires": { 940 | "emoji-regex": "^8.0.0", 941 | "is-fullwidth-code-point": "^3.0.0", 942 | "strip-ansi": "^6.0.0" 943 | } 944 | }, 945 | "strip-ansi": { 946 | "version": "6.0.0", 947 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", 948 | "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", 949 | "dev": true, 950 | "requires": { 951 | "ansi-regex": "^5.0.0" 952 | } 953 | }, 954 | "strip-bom": { 955 | "version": "3.0.0", 956 | "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", 957 | "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", 958 | "dev": true 959 | }, 960 | "strip-json-comments": { 961 | "version": "3.1.1", 962 | "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", 963 | "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", 964 | "dev": true 965 | }, 966 | "supports-color": { 967 | "version": "5.5.0", 968 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", 969 | "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", 970 | "dev": true, 971 | "requires": { 972 | "has-flag": "^3.0.0" 973 | } 974 | }, 975 | "table": { 976 | "version": "6.7.0", 977 | "resolved": "https://registry.npmjs.org/table/-/table-6.7.0.tgz", 978 | "integrity": "sha512-SAM+5p6V99gYiiy2gT5ArdzgM1dLDed0nkrWmG6Fry/bUS/m9x83BwpJUOf1Qj/x2qJd+thL6IkIx7qPGRxqBw==", 979 | "dev": true, 980 | "requires": { 981 | "ajv": "^8.0.1", 982 | "lodash.clonedeep": "^4.5.0", 983 | "lodash.truncate": "^4.4.2", 984 | "slice-ansi": "^4.0.0", 985 | "string-width": "^4.2.0", 986 | "strip-ansi": "^6.0.0" 987 | }, 988 | "dependencies": { 989 | "ajv": { 990 | "version": "8.3.0", 991 | "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.3.0.tgz", 992 | "integrity": "sha512-RYE7B5An83d7eWnDR8kbdaIFqmKCNsP16ay1hDbJEU+sa0e3H9SebskCt0Uufem6cfAVu7Col6ubcn/W+Sm8/Q==", 993 | "dev": true, 994 | "requires": { 995 | "fast-deep-equal": "^3.1.1", 996 | "json-schema-traverse": "^1.0.0", 997 | "require-from-string": "^2.0.2", 998 | "uri-js": "^4.2.2" 999 | } 1000 | }, 1001 | "json-schema-traverse": { 1002 | "version": "1.0.0", 1003 | "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", 1004 | "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", 1005 | "dev": true 1006 | } 1007 | } 1008 | }, 1009 | "text-table": { 1010 | "version": "0.2.0", 1011 | "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", 1012 | "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", 1013 | "dev": true 1014 | }, 1015 | "ts-node": { 1016 | "version": "9.1.1", 1017 | "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-9.1.1.tgz", 1018 | "integrity": "sha512-hPlt7ZACERQGf03M253ytLY3dHbGNGrAq9qIHWUY9XHYl1z7wYngSr3OQ5xmui8o2AaxsONxIzjafLUiWBo1Fg==", 1019 | "dev": true, 1020 | "requires": { 1021 | "arg": "^4.1.0", 1022 | "create-require": "^1.1.0", 1023 | "diff": "^4.0.1", 1024 | "make-error": "^1.1.1", 1025 | "source-map-support": "^0.5.17", 1026 | "yn": "3.1.1" 1027 | } 1028 | }, 1029 | "tsconfig-paths": { 1030 | "version": "3.9.0", 1031 | "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.9.0.tgz", 1032 | "integrity": "sha512-dRcuzokWhajtZWkQsDVKbWyY+jgcLC5sqJhg2PSgf4ZkH2aHPvaOY8YWGhmjb68b5qqTfasSsDO9k7RUiEmZAw==", 1033 | "dev": true, 1034 | "requires": { 1035 | "@types/json5": "^0.0.29", 1036 | "json5": "^1.0.1", 1037 | "minimist": "^1.2.0", 1038 | "strip-bom": "^3.0.0" 1039 | } 1040 | }, 1041 | "type-check": { 1042 | "version": "0.4.0", 1043 | "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", 1044 | "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", 1045 | "dev": true, 1046 | "requires": { 1047 | "prelude-ls": "^1.2.1" 1048 | } 1049 | }, 1050 | "type-fest": { 1051 | "version": "0.8.1", 1052 | "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", 1053 | "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", 1054 | "dev": true 1055 | }, 1056 | "typescript": { 1057 | "version": "4.2.4", 1058 | "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.2.4.tgz", 1059 | "integrity": "sha512-V+evlYHZnQkaz8TRBuxTA92yZBPotr5H+WhQ7bD3hZUndx5tGOa1fuCgeSjxAzM1RiN5IzvadIXTVefuuwZCRg==", 1060 | "dev": true 1061 | }, 1062 | "uri-js": { 1063 | "version": "4.4.1", 1064 | "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", 1065 | "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", 1066 | "dev": true, 1067 | "requires": { 1068 | "punycode": "^2.1.0" 1069 | } 1070 | }, 1071 | "v8-compile-cache": { 1072 | "version": "2.3.0", 1073 | "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz", 1074 | "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==", 1075 | "dev": true 1076 | }, 1077 | "which": { 1078 | "version": "2.0.2", 1079 | "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", 1080 | "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", 1081 | "dev": true, 1082 | "requires": { 1083 | "isexe": "^2.0.0" 1084 | } 1085 | }, 1086 | "word-wrap": { 1087 | "version": "1.2.3", 1088 | "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", 1089 | "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", 1090 | "dev": true 1091 | }, 1092 | "wrappy": { 1093 | "version": "1.0.2", 1094 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 1095 | "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", 1096 | "dev": true 1097 | }, 1098 | "yallist": { 1099 | "version": "4.0.0", 1100 | "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", 1101 | "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", 1102 | "dev": true 1103 | }, 1104 | "yn": { 1105 | "version": "3.1.1", 1106 | "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", 1107 | "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", 1108 | "dev": true 1109 | } 1110 | } 1111 | } 1112 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "ts-eager", 3 | "version": "2.0.2", 4 | "description": "Fast TypeScript runner using esbuild for eager compilation", 5 | "main": "index.js", 6 | "repository": "github.com/mhart/ts-eager", 7 | "author": "Michael Hart (https://github.com/mhart)", 8 | "license": "MIT", 9 | "engines": { 10 | "node": ">=12.18.4" 11 | }, 12 | "bin": { 13 | "ts-eager": "bin/ts-eager.sh", 14 | "ts-eager-paths": "bin/ts-eager-paths.sh" 15 | }, 16 | "files": [ 17 | "bin", 18 | "*.js" 19 | ], 20 | "devDependencies": { 21 | "@types/node": "^14.14.44", 22 | "eslint": "^7.26.0", 23 | "eslint-config-prettier": "^8.3.0", 24 | "prettier": "^2.3.0", 25 | "reflect-metadata": "^0.1.13", 26 | "ts-node": "^9.1.1", 27 | "tsconfig-paths": "^3.9.0", 28 | "typescript": "^4.2.4" 29 | }, 30 | "scripts": { 31 | "test": "node test/test.js", 32 | "tsc": "tsc", 33 | "lint": "eslint ." 34 | }, 35 | "prettier": { 36 | "semi": false, 37 | "singleQuote": true, 38 | "printWidth": 120 39 | }, 40 | "eslintConfig": { 41 | "extends": [ 42 | "eslint:recommended", 43 | "prettier" 44 | ], 45 | "env": { 46 | "node": true, 47 | "es2017": true 48 | }, 49 | "parserOptions": { 50 | "ecmaVersion": 2019, 51 | "sourceType": "module" 52 | } 53 | }, 54 | "dependencies": { 55 | "esbuild": "^0.11.20", 56 | "source-map-support": "^0.5.19" 57 | } 58 | } 59 | -------------------------------------------------------------------------------- /register-paths.js: -------------------------------------------------------------------------------- 1 | // deprecated: ts-eager/register detects paths presence automatically now 2 | require('./register.js') 3 | require('tsconfig-paths/register') 4 | -------------------------------------------------------------------------------- /register.js: -------------------------------------------------------------------------------- 1 | /* eslint-disable no-console */ 2 | const { readFileSync } = require('fs') 3 | const { tmpdir } = require('os') 4 | const { resolve, extname, dirname } = require('path') 5 | const { buildSync } = require('esbuild') 6 | const sourceMapSupport = require('source-map-support') 7 | 8 | const logLevel = process.env.TS_EAGER_LOGLEVEL || 'error' // 'warning', 'info', 'silent' 9 | 10 | const tsconfigName = process.env.TS_NODE_PROJECT || undefined 11 | const ignoreRegexes = process.env.TS_NODE_IGNORE || '(?:^|/)node_modules/' 12 | 13 | const ignores = ignoreRegexes.split(/ *, */g).map((str) => new RegExp(str)) 14 | 15 | let tsconfig = '' 16 | let basePath = process.cwd() 17 | let files = [] 18 | let allowJs = false 19 | let emitDecoratorMetadata = false 20 | let compilerOptions 21 | try { 22 | const { sys, findConfigFile, readConfigFile, parseJsonConfigFileContent } = require('typescript') 23 | 24 | tsconfig = findConfigFile('.', sys.fileExists, tsconfigName) || 'tsconfig.json' 25 | const parsedConfig = parseJsonConfigFileContent(readConfigFile(tsconfig, sys.readFile).config, sys, '.') 26 | 27 | basePath = dirname(tsconfig) 28 | files = parsedConfig.fileNames 29 | allowJs = !!parsedConfig.options.allowJs 30 | emitDecoratorMetadata = !!parsedConfig.options.emitDecoratorMetadata 31 | 32 | compilerOptions = parsedConfig.raw.compilerOptions 33 | 34 | const { baseUrl, paths } = parsedConfig.options 35 | if (Object.keys(paths || {}).length) { 36 | try { 37 | require('tsconfig-paths').register({ baseUrl, paths }) 38 | } catch (e) { 39 | if (['warning', 'info'].includes(logLevel)) { 40 | console.error('tsconfig has paths, but tsconfig-paths is not installed') 41 | console.error('Proceeding without paths support...') 42 | } 43 | } 44 | } 45 | } catch (e) { 46 | if (['warning', 'info'].includes(logLevel)) { 47 | console.error(`Could not parse ${tsconfigName || 'tsconfig.json'} (is typescript installed?)`) 48 | console.error(e) 49 | console.error('Proceeding without eager compilation...') 50 | } 51 | } 52 | 53 | files = files.filter((file) => !file.endsWith('.d.ts')).map((path) => resolve(basePath, path)) 54 | 55 | if (logLevel == 'info') { 56 | console.log('Eagerly compiling:', files) 57 | } 58 | 59 | const extensions = (allowJs ? ['.js', '.jsx'] : []).concat(['.ts', '.tsx']) 60 | 61 | const defaultEsbuildOptions = { 62 | tsconfig: tsconfig || undefined, 63 | target: 'node' + process.versions.node.split('.')[0], 64 | format: 'cjs', 65 | sourcemap: 'inline', 66 | write: false, 67 | logLevel, 68 | outdir: tmpdir(), // ignored if write is false 69 | } 70 | 71 | // The default esbuild buffer size seems to be too small for medium-sized projects 72 | // and node will throw ENOBUFS errors, so we increase it here to 256MB if not already set 73 | // https://github.com/evanw/esbuild/blob/6be0962826a97dd49f6e1f4f93277442783d5257/lib/npm/node.ts#L347 74 | if (process.env.ESBUILD_MAX_BUFFER == null) { 75 | process.env.ESBUILD_MAX_BUFFER = 256 * 1024 * 1024 76 | } 77 | 78 | const { warnings, outputFiles } = buildSync({ 79 | ...defaultEsbuildOptions, 80 | entryPoints: files, 81 | }) 82 | for (const warning of warnings) { 83 | console.error(warning.location) 84 | console.error(warning.text) 85 | } 86 | 87 | const fileContents = (outputFiles || []).reduce((map, { contents }, ix) => map.set(files[ix], contents), new Map()) 88 | 89 | const decoder = new TextDecoder('utf-8') 90 | 91 | const retrieveFile = (path) => { 92 | let js = fileContents.get(path) 93 | if (js != null && typeof js !== 'string') { 94 | js = decoder.decode(js) 95 | fileContents.set(path, js) 96 | } 97 | return js 98 | } 99 | 100 | let tsNodeService 101 | 102 | const compile = (code, filename) => { 103 | if (!fileContents.has(filename)) { 104 | const { warnings, outputFiles } = buildSync({ 105 | ...defaultEsbuildOptions, 106 | stdin: { 107 | loader: extname(filename).slice(1), 108 | sourcefile: filename, 109 | contents: code, 110 | }, 111 | }) 112 | for (const warning of warnings) { 113 | console.error(warning.location) 114 | console.error(warning.text) 115 | } 116 | const { contents } = (outputFiles || [])[0] || {} 117 | if (contents != null) { 118 | fileContents.set(filename, contents) 119 | } 120 | } 121 | if (emitDecoratorMetadata) { 122 | const js = retrieveFile(filename) 123 | if (/^var __decorate(Class|Param)? = /m.test(js) && !/^var __metadata = /m.test(js)) { 124 | if (tsNodeService == null) { 125 | const { create } = require('ts-node') 126 | tsNodeService = create({ transpileOnly: true, compilerOptions, skipProject: !!compilerOptions }) 127 | } 128 | fileContents.set(filename, tsNodeService.compile(code, filename)) 129 | } 130 | } 131 | return retrieveFile(filename) 132 | } 133 | 134 | let requireExtensions 135 | try { 136 | requireExtensions = require.extensions 137 | } catch (e) { 138 | console.error('Could not register extension') 139 | throw e 140 | } 141 | 142 | const shouldIgnore = (relname) => { 143 | const path = relname.replace(/\\/g, '/') 144 | return ignores.some((x) => x.test(path)) 145 | } 146 | 147 | const origJsHandler = requireExtensions['.js'] 148 | 149 | const registerExtension = (ext, compile) => { 150 | const origHandler = requireExtensions[ext] || origJsHandler 151 | requireExtensions[ext] = function (module, filename) { 152 | if (shouldIgnore(filename)) { 153 | return origHandler(module, filename) 154 | } 155 | const code = readFileSync(filename, 'utf8') 156 | return module._compile(compile(code, filename), filename) 157 | } 158 | } 159 | 160 | sourceMapSupport.install({ retrieveFile, environment: 'node', handleUncaughtExceptions: false }) 161 | 162 | extensions.forEach((ext) => registerExtension(ext, compile)) 163 | -------------------------------------------------------------------------------- /test/basic/test.ts: -------------------------------------------------------------------------------- 1 | import { platform } from 'os' 2 | import assert from 'assert' 3 | 4 | assert.ok(platform()) 5 | -------------------------------------------------------------------------------- /test/basic/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "target": "ES2019", 4 | "lib": ["ES2019"], 5 | "module": "commonjs", 6 | "allowJs": true, 7 | "noEmit": true, 8 | "strict": true, 9 | "noImplicitAny": true, 10 | "strictNullChecks": true, 11 | "noUnusedLocals": true, 12 | "resolveJsonModule": true, 13 | "esModuleInterop": true 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /test/decorators/test.ts: -------------------------------------------------------------------------------- 1 | import assert from 'assert' 2 | import 'reflect-metadata' 3 | 4 | class Point { 5 | x?: number 6 | y?: number 7 | } 8 | 9 | class Line { 10 | private _p0?: Point 11 | private _p1?: Point 12 | 13 | @validate 14 | set p0(value: Point | undefined) { 15 | this._p0 = value 16 | } 17 | get p0() { 18 | return this._p0 19 | } 20 | 21 | @validate 22 | set p1(value: Point | undefined) { 23 | this._p1 = value 24 | } 25 | get p1() { 26 | return this._p1 27 | } 28 | } 29 | 30 | function validate(target: any, propertyKey: string, descriptor: TypedPropertyDescriptor) { 31 | let set = descriptor.set || (() => true) 32 | descriptor.set = function (value: T) { 33 | let type = Reflect.getMetadata('design:type', target, propertyKey) 34 | if (!(value instanceof type)) { 35 | throw new TypeError('Invalid type.') 36 | } 37 | set.call(target, value) 38 | } 39 | } 40 | 41 | const line = new Line() 42 | line.p0 = new Point() 43 | line.p1 = new Point() 44 | assert.throws(() => (line.p1 = undefined), /Invalid type/) 45 | -------------------------------------------------------------------------------- /test/decorators/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "target": "ES2019", 4 | "lib": ["ES2019"], 5 | "module": "commonjs", 6 | "allowJs": true, 7 | "noEmit": true, 8 | "strict": true, 9 | "noImplicitAny": true, 10 | "strictNullChecks": true, 11 | "noUnusedLocals": true, 12 | "resolveJsonModule": true, 13 | "esModuleInterop": true, 14 | "experimentalDecorators": true, 15 | "emitDecoratorMetadata": true 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /test/paths/lib/file1.ts: -------------------------------------------------------------------------------- 1 | export const a = 1 2 | -------------------------------------------------------------------------------- /test/paths/test.ts: -------------------------------------------------------------------------------- 1 | import assert from 'assert' 2 | import { a } from 'lib/file1' 3 | 4 | assert.strictEqual(a, 1) 5 | -------------------------------------------------------------------------------- /test/paths/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "target": "ES2019", 4 | "lib": ["ES2019"], 5 | "module": "commonjs", 6 | "allowJs": true, 7 | "noEmit": true, 8 | "strict": true, 9 | "noImplicitAny": true, 10 | "strictNullChecks": true, 11 | "noUnusedLocals": true, 12 | "resolveJsonModule": true, 13 | "esModuleInterop": true, 14 | "baseUrl": ".", 15 | "paths": { 16 | "lib/*": ["lib/*"] 17 | } 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /test/test.js: -------------------------------------------------------------------------------- 1 | const { readdirSync } = require('fs') 2 | const { execSync } = require('child_process') 3 | 4 | const testDirs = readdirSync(__dirname).filter((name) => !name.includes('.')) 5 | 6 | for (const testDir of testDirs) { 7 | console.log(`Testing ${testDir}...`) 8 | execSync(`${__dirname}/../node_modules/.bin/tsc`, { cwd: `${__dirname}/${testDir}`, stdio: 'inherit' }) 9 | execSync(`node -r ${__dirname}/../register.js test.ts`, { cwd: `${__dirname}/${testDir}`, stdio: 'inherit' }) 10 | } 11 | 12 | console.log('All tests passed') 13 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "target": "ES2019", 4 | "lib": ["ES2019"], 5 | "module": "commonjs", 6 | "allowJs": true, 7 | "noEmit": true, 8 | "strict": true, 9 | "noImplicitAny": true, 10 | "strictNullChecks": true, 11 | "noUnusedLocals": true, 12 | "resolveJsonModule": true, 13 | "esModuleInterop": true 14 | }, 15 | "exclude": ["test"] 16 | } 17 | --------------------------------------------------------------------------------