├── .gitignore ├── LICENSE ├── README.md ├── bin └── create-project ├── package-lock.json ├── package.json ├── src ├── cli.js └── main.js └── templates ├── javascript ├── package.json └── src │ ├── index.js │ └── main.js └── typescript ├── README.md ├── package.json ├── src └── index.ts └── tsconfig.json /.gitignore: -------------------------------------------------------------------------------- 1 | # Logs 2 | logs 3 | *.log 4 | npm-debug.log* 5 | yarn-debug.log* 6 | yarn-error.log* 7 | lerna-debug.log* 8 | 9 | # Diagnostic reports (https://nodejs.org/api/report.html) 10 | report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json 11 | 12 | # Runtime data 13 | pids 14 | *.pid 15 | *.seed 16 | *.pid.lock 17 | 18 | # Directory for instrumented libs generated by jscoverage/JSCover 19 | lib-cov 20 | 21 | # Coverage directory used by tools like istanbul 22 | coverage 23 | 24 | # nyc test coverage 25 | .nyc_output 26 | 27 | # Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files) 28 | .grunt 29 | 30 | # Bower dependency directory (https://bower.io/) 31 | bower_components 32 | 33 | # node-waf configuration 34 | .lock-wscript 35 | 36 | # Compiled binary addons (https://nodejs.org/api/addons.html) 37 | build/Release 38 | 39 | # Dependency directories 40 | node_modules/ 41 | jspm_packages/ 42 | 43 | # TypeScript v1 declaration files 44 | typings/ 45 | 46 | # Optional npm cache directory 47 | .npm 48 | 49 | # Optional eslint cache 50 | .eslintcache 51 | 52 | # Optional REPL history 53 | .node_repl_history 54 | 55 | # Output of 'npm pack' 56 | *.tgz 57 | 58 | # Yarn Integrity file 59 | .yarn-integrity 60 | 61 | # dotenv environment variables file 62 | .env 63 | .env.test 64 | 65 | # parcel-bundler cache (https://parceljs.org/) 66 | .cache 67 | 68 | # next.js build output 69 | .next 70 | 71 | # nuxt.js build output 72 | .nuxt 73 | 74 | # vuepress build output 75 | .vuepress/dist 76 | 77 | # Serverless directories 78 | .serverless/ 79 | 80 | # FuseBox cache 81 | .fusebox/ 82 | 83 | # DynamoDB Local files 84 | .dynamodb/ 85 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2020 Dominik Kundel 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 | # `@dkundel/create-project` 2 | 3 | 🏗 Personal CLI to bootstrap new projects 4 | 5 | ## Installation & Usage 6 | 7 | ```bash 8 | npm init @dkundel/project 9 | # or 10 | npx @dkundel/create-project 11 | # or 12 | npm install -g @dkundel/create-project 13 | create-project 14 | ``` 15 | 16 | ## License 17 | 18 | MIT 19 | 20 | ## Collaborators 21 | 22 | - Dominik Kundel 23 | -------------------------------------------------------------------------------- /bin/create-project: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env node 2 | 3 | require = require('esm')(module /*, options*/); 4 | require('../src/cli.js').cli(process.argv); 5 | -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "@dkundel/create-project", 3 | "version": "1.0.0", 4 | "lockfileVersion": 1, 5 | "requires": true, 6 | "dependencies": { 7 | "@samverschueren/stream-to-observable": { 8 | "version": "0.3.0", 9 | "resolved": "https://registry.npmjs.org/@samverschueren/stream-to-observable/-/stream-to-observable-0.3.0.tgz", 10 | "integrity": "sha512-MI4Xx6LHs4Webyvi6EbspgyAb4D2Q2VtnCQ1blOJcoLS6mVa8lNN2rkIy1CVxfTUpoyIbCTkXES1rLXztFD1lg==", 11 | "requires": { 12 | "any-observable": "^0.3.0" 13 | } 14 | }, 15 | "@types/execa": { 16 | "version": "0.9.0", 17 | "resolved": "https://registry.npmjs.org/@types/execa/-/execa-0.9.0.tgz", 18 | "integrity": "sha512-mgfd93RhzjYBUHHV532turHC2j4l/qxsF/PbfDmprHDEUHmNZGlDn1CEsulGK3AfsPdhkWzZQT/S/k0UGhLGsA==", 19 | "requires": { 20 | "@types/node": "*" 21 | } 22 | }, 23 | "@types/node": { 24 | "version": "11.11.3", 25 | "resolved": "https://registry.npmjs.org/@types/node/-/node-11.11.3.tgz", 26 | "integrity": "sha512-wp6IOGu1lxsfnrD+5mX6qwSwWuqsdkKKxTN4aQc4wByHAKZJf9/D4KXPQ1POUjEbnCP5LMggB0OEFNY9OTsMqg==" 27 | }, 28 | "ajv": { 29 | "version": "6.10.0", 30 | "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.10.0.tgz", 31 | "integrity": "sha512-nffhOpkymDECQyR0mnsUtoCE8RlX38G0rYP+wgLWFyZuUyuuojSSvi/+euOiQBIn63whYwYVIIH1TvE3tu4OEg==", 32 | "requires": { 33 | "fast-deep-equal": "^2.0.1", 34 | "fast-json-stable-stringify": "^2.0.0", 35 | "json-schema-traverse": "^0.4.1", 36 | "uri-js": "^4.2.2" 37 | } 38 | }, 39 | "ansi-escapes": { 40 | "version": "3.2.0", 41 | "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.2.0.tgz", 42 | "integrity": "sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==" 43 | }, 44 | "ansi-regex": { 45 | "version": "3.0.0", 46 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", 47 | "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=" 48 | }, 49 | "ansi-styles": { 50 | "version": "3.2.1", 51 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", 52 | "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", 53 | "requires": { 54 | "color-convert": "^1.9.0" 55 | } 56 | }, 57 | "any-observable": { 58 | "version": "0.3.0", 59 | "resolved": "https://registry.npmjs.org/any-observable/-/any-observable-0.3.0.tgz", 60 | "integrity": "sha512-/FQM1EDkTsf63Ub2C6O7GuYFDsSXUwsaZDurV0np41ocwq0jthUAYCmhBX9f+KwlaCgIuWyr/4WlUQUBfKfZog==" 61 | }, 62 | "any-promise": { 63 | "version": "1.3.0", 64 | "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", 65 | "integrity": "sha1-q8av7tzqUugJzcA3au0845Y10X8=" 66 | }, 67 | "arg": { 68 | "version": "4.1.0", 69 | "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.0.tgz", 70 | "integrity": "sha512-ZWc51jO3qegGkVh8Hwpv636EkbesNV5ZNQPCtRa+0qytRYPEs9IYT9qITY9buezqUH5uqyzlWLcufrzU2rffdg==" 71 | }, 72 | "asn1": { 73 | "version": "0.2.4", 74 | "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", 75 | "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", 76 | "requires": { 77 | "safer-buffer": "~2.1.0" 78 | } 79 | }, 80 | "assert-plus": { 81 | "version": "1.0.0", 82 | "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", 83 | "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" 84 | }, 85 | "asynckit": { 86 | "version": "0.4.0", 87 | "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", 88 | "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" 89 | }, 90 | "aws-sign2": { 91 | "version": "0.7.0", 92 | "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", 93 | "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=" 94 | }, 95 | "aws4": { 96 | "version": "1.8.0", 97 | "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.8.0.tgz", 98 | "integrity": "sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ==" 99 | }, 100 | "bcrypt-pbkdf": { 101 | "version": "1.0.2", 102 | "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", 103 | "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", 104 | "requires": { 105 | "tweetnacl": "^0.14.3" 106 | } 107 | }, 108 | "bluebird": { 109 | "version": "3.5.3", 110 | "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.3.tgz", 111 | "integrity": "sha512-/qKPUQlaW1OyR51WeCPBvRnAlnZFUJkCSG5HzGnuIqhgyJtF+T94lFnn33eiazjRm2LAHVy2guNnaq48X9SJuw==" 112 | }, 113 | "caseless": { 114 | "version": "0.12.0", 115 | "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", 116 | "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=" 117 | }, 118 | "chalk": { 119 | "version": "2.4.2", 120 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", 121 | "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", 122 | "requires": { 123 | "ansi-styles": "^3.2.1", 124 | "escape-string-regexp": "^1.0.5", 125 | "supports-color": "^5.3.0" 126 | } 127 | }, 128 | "chardet": { 129 | "version": "0.7.0", 130 | "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", 131 | "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==" 132 | }, 133 | "cli-cursor": { 134 | "version": "2.1.0", 135 | "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", 136 | "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=", 137 | "requires": { 138 | "restore-cursor": "^2.0.0" 139 | } 140 | }, 141 | "cli-truncate": { 142 | "version": "0.2.1", 143 | "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-0.2.1.tgz", 144 | "integrity": "sha1-nxXPuwcFAFNpIWxiasfQWrkN1XQ=", 145 | "requires": { 146 | "slice-ansi": "0.0.4", 147 | "string-width": "^1.0.1" 148 | }, 149 | "dependencies": { 150 | "ansi-regex": { 151 | "version": "2.1.1", 152 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", 153 | "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" 154 | }, 155 | "is-fullwidth-code-point": { 156 | "version": "1.0.0", 157 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", 158 | "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", 159 | "requires": { 160 | "number-is-nan": "^1.0.0" 161 | } 162 | }, 163 | "string-width": { 164 | "version": "1.0.2", 165 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", 166 | "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", 167 | "requires": { 168 | "code-point-at": "^1.0.0", 169 | "is-fullwidth-code-point": "^1.0.0", 170 | "strip-ansi": "^3.0.0" 171 | } 172 | }, 173 | "strip-ansi": { 174 | "version": "3.0.1", 175 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", 176 | "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", 177 | "requires": { 178 | "ansi-regex": "^2.0.0" 179 | } 180 | } 181 | } 182 | }, 183 | "cli-width": { 184 | "version": "2.2.0", 185 | "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.0.tgz", 186 | "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk=" 187 | }, 188 | "code-point-at": { 189 | "version": "1.1.0", 190 | "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", 191 | "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=" 192 | }, 193 | "color-convert": { 194 | "version": "1.9.3", 195 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", 196 | "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", 197 | "requires": { 198 | "color-name": "1.1.3" 199 | } 200 | }, 201 | "color-name": { 202 | "version": "1.1.3", 203 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", 204 | "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" 205 | }, 206 | "combined-stream": { 207 | "version": "1.0.7", 208 | "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.7.tgz", 209 | "integrity": "sha512-brWl9y6vOB1xYPZcpZde3N9zDByXTosAeMDo4p1wzo6UMOX4vumB+TP1RZ76sfE6Md68Q0NJSrE/gbezd4Ul+w==", 210 | "requires": { 211 | "delayed-stream": "~1.0.0" 212 | } 213 | }, 214 | "core-util-is": { 215 | "version": "1.0.2", 216 | "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", 217 | "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" 218 | }, 219 | "covgen": { 220 | "version": "3.1.0", 221 | "resolved": "https://registry.npmjs.org/covgen/-/covgen-3.1.0.tgz", 222 | "integrity": "sha512-yuifa5IybCe+uMGl6xq/iOcayhyW2ha2FWiernRX/xENpi5IAs6mVjmgECiyncHoXlESKgiFzMPKMExiv0RW/g==", 223 | "requires": { 224 | "mkdirp-promise": "^5.0.1", 225 | "mz": "^2.7.0", 226 | "request": "^2.83.0", 227 | "request-promise": "^4.2.2" 228 | } 229 | }, 230 | "cross-spawn": { 231 | "version": "6.0.5", 232 | "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", 233 | "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", 234 | "requires": { 235 | "nice-try": "^1.0.4", 236 | "path-key": "^2.0.1", 237 | "semver": "^5.5.0", 238 | "shebang-command": "^1.2.0", 239 | "which": "^1.2.9" 240 | } 241 | }, 242 | "dashdash": { 243 | "version": "1.14.1", 244 | "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", 245 | "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", 246 | "requires": { 247 | "assert-plus": "^1.0.0" 248 | } 249 | }, 250 | "date-fns": { 251 | "version": "1.30.1", 252 | "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-1.30.1.tgz", 253 | "integrity": "sha512-hBSVCvSmWC+QypYObzwGOd9wqdDpOt+0wl0KbU+R+uuZBS1jN8VsD1ss3irQDknRj5NvxiTF6oj/nDRnN/UQNw==" 254 | }, 255 | "delayed-stream": { 256 | "version": "1.0.0", 257 | "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", 258 | "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" 259 | }, 260 | "ecc-jsbn": { 261 | "version": "0.1.2", 262 | "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", 263 | "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", 264 | "requires": { 265 | "jsbn": "~0.1.0", 266 | "safer-buffer": "^2.1.0" 267 | } 268 | }, 269 | "elegant-spinner": { 270 | "version": "1.0.1", 271 | "resolved": "https://registry.npmjs.org/elegant-spinner/-/elegant-spinner-1.0.1.tgz", 272 | "integrity": "sha1-2wQ1IcldfjA/2PNFvtwzSc+wcp4=" 273 | }, 274 | "end-of-stream": { 275 | "version": "1.4.1", 276 | "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.1.tgz", 277 | "integrity": "sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q==", 278 | "requires": { 279 | "once": "^1.4.0" 280 | } 281 | }, 282 | "escape-string-regexp": { 283 | "version": "1.0.5", 284 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", 285 | "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" 286 | }, 287 | "esm": { 288 | "version": "3.2.18", 289 | "resolved": "https://registry.npmjs.org/esm/-/esm-3.2.18.tgz", 290 | "integrity": "sha512-1UENjnnI37UDp7KuOqKYjfqdaMim06eBWnDv37smaxTIzDl0ZWnlgoXwsVwD9+Lidw+q/f1gUf2diVMDCycoVw==" 291 | }, 292 | "execa": { 293 | "version": "1.0.0", 294 | "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", 295 | "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", 296 | "requires": { 297 | "cross-spawn": "^6.0.0", 298 | "get-stream": "^4.0.0", 299 | "is-stream": "^1.1.0", 300 | "npm-run-path": "^2.0.0", 301 | "p-finally": "^1.0.0", 302 | "signal-exit": "^3.0.0", 303 | "strip-eof": "^1.0.0" 304 | } 305 | }, 306 | "extend": { 307 | "version": "3.0.2", 308 | "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", 309 | "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" 310 | }, 311 | "external-editor": { 312 | "version": "3.0.3", 313 | "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.0.3.tgz", 314 | "integrity": "sha512-bn71H9+qWoOQKyZDo25mOMVpSmXROAsTJVVVYzrrtol3d4y+AsKjf4Iwl2Q+IuT0kFSQ1qo166UuIwqYq7mGnA==", 315 | "requires": { 316 | "chardet": "^0.7.0", 317 | "iconv-lite": "^0.4.24", 318 | "tmp": "^0.0.33" 319 | } 320 | }, 321 | "extsprintf": { 322 | "version": "1.3.0", 323 | "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", 324 | "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=" 325 | }, 326 | "fast-deep-equal": { 327 | "version": "2.0.1", 328 | "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", 329 | "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=" 330 | }, 331 | "fast-json-stable-stringify": { 332 | "version": "2.0.0", 333 | "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", 334 | "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=" 335 | }, 336 | "figures": { 337 | "version": "2.0.0", 338 | "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", 339 | "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=", 340 | "requires": { 341 | "escape-string-regexp": "^1.0.5" 342 | } 343 | }, 344 | "forever-agent": { 345 | "version": "0.6.1", 346 | "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", 347 | "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=" 348 | }, 349 | "form-data": { 350 | "version": "2.3.3", 351 | "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", 352 | "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", 353 | "requires": { 354 | "asynckit": "^0.4.0", 355 | "combined-stream": "^1.0.6", 356 | "mime-types": "^2.1.12" 357 | } 358 | }, 359 | "get-stream": { 360 | "version": "4.1.0", 361 | "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", 362 | "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", 363 | "requires": { 364 | "pump": "^3.0.0" 365 | } 366 | }, 367 | "getpass": { 368 | "version": "0.1.7", 369 | "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", 370 | "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", 371 | "requires": { 372 | "assert-plus": "^1.0.0" 373 | } 374 | }, 375 | "gitignore": { 376 | "version": "0.6.0", 377 | "resolved": "https://registry.npmjs.org/gitignore/-/gitignore-0.6.0.tgz", 378 | "integrity": "sha1-hRjjnR4S+JbrCXHg+MmC5hbtdl4=" 379 | }, 380 | "har-schema": { 381 | "version": "2.0.0", 382 | "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", 383 | "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=" 384 | }, 385 | "har-validator": { 386 | "version": "5.1.3", 387 | "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.3.tgz", 388 | "integrity": "sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==", 389 | "requires": { 390 | "ajv": "^6.5.5", 391 | "har-schema": "^2.0.0" 392 | } 393 | }, 394 | "has-ansi": { 395 | "version": "2.0.0", 396 | "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", 397 | "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", 398 | "requires": { 399 | "ansi-regex": "^2.0.0" 400 | }, 401 | "dependencies": { 402 | "ansi-regex": { 403 | "version": "2.1.1", 404 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", 405 | "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" 406 | } 407 | } 408 | }, 409 | "has-flag": { 410 | "version": "3.0.0", 411 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", 412 | "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" 413 | }, 414 | "http-signature": { 415 | "version": "1.2.0", 416 | "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", 417 | "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", 418 | "requires": { 419 | "assert-plus": "^1.0.0", 420 | "jsprim": "^1.2.2", 421 | "sshpk": "^1.7.0" 422 | } 423 | }, 424 | "iconv-lite": { 425 | "version": "0.4.24", 426 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", 427 | "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", 428 | "requires": { 429 | "safer-buffer": ">= 2.1.2 < 3" 430 | } 431 | }, 432 | "indent-string": { 433 | "version": "3.2.0", 434 | "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-3.2.0.tgz", 435 | "integrity": "sha1-Sl/W0nzDMvN+VBmlBNu4NxBckok=" 436 | }, 437 | "inquirer": { 438 | "version": "6.2.2", 439 | "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-6.2.2.tgz", 440 | "integrity": "sha512-Z2rREiXA6cHRR9KBOarR3WuLlFzlIfAEIiB45ll5SSadMg7WqOh1MKEjjndfuH5ewXdixWCxqnVfGOQzPeiztA==", 441 | "requires": { 442 | "ansi-escapes": "^3.2.0", 443 | "chalk": "^2.4.2", 444 | "cli-cursor": "^2.1.0", 445 | "cli-width": "^2.0.0", 446 | "external-editor": "^3.0.3", 447 | "figures": "^2.0.0", 448 | "lodash": "^4.17.11", 449 | "mute-stream": "0.0.7", 450 | "run-async": "^2.2.0", 451 | "rxjs": "^6.4.0", 452 | "string-width": "^2.1.0", 453 | "strip-ansi": "^5.0.0", 454 | "through": "^2.3.6" 455 | } 456 | }, 457 | "is-fullwidth-code-point": { 458 | "version": "2.0.0", 459 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", 460 | "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" 461 | }, 462 | "is-observable": { 463 | "version": "1.1.0", 464 | "resolved": "https://registry.npmjs.org/is-observable/-/is-observable-1.1.0.tgz", 465 | "integrity": "sha512-NqCa4Sa2d+u7BWc6CukaObG3Fh+CU9bvixbpcXYhy2VvYS7vVGIdAgnIS5Ks3A/cqk4rebLJ9s8zBstT2aKnIA==", 466 | "requires": { 467 | "symbol-observable": "^1.1.0" 468 | } 469 | }, 470 | "is-promise": { 471 | "version": "2.1.0", 472 | "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz", 473 | "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=" 474 | }, 475 | "is-stream": { 476 | "version": "1.1.0", 477 | "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", 478 | "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=" 479 | }, 480 | "is-typedarray": { 481 | "version": "1.0.0", 482 | "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", 483 | "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" 484 | }, 485 | "isexe": { 486 | "version": "2.0.0", 487 | "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", 488 | "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" 489 | }, 490 | "isstream": { 491 | "version": "0.1.2", 492 | "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", 493 | "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=" 494 | }, 495 | "jsbn": { 496 | "version": "0.1.1", 497 | "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", 498 | "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=" 499 | }, 500 | "json-schema": { 501 | "version": "0.2.3", 502 | "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", 503 | "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=" 504 | }, 505 | "json-schema-traverse": { 506 | "version": "0.4.1", 507 | "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", 508 | "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" 509 | }, 510 | "json-stringify-safe": { 511 | "version": "5.0.1", 512 | "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", 513 | "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=" 514 | }, 515 | "jsprim": { 516 | "version": "1.4.1", 517 | "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", 518 | "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", 519 | "requires": { 520 | "assert-plus": "1.0.0", 521 | "extsprintf": "1.3.0", 522 | "json-schema": "0.2.3", 523 | "verror": "1.10.0" 524 | } 525 | }, 526 | "listr": { 527 | "version": "0.14.3", 528 | "resolved": "https://registry.npmjs.org/listr/-/listr-0.14.3.tgz", 529 | "integrity": "sha512-RmAl7su35BFd/xoMamRjpIE4j3v+L28o8CT5YhAXQJm1fD+1l9ngXY8JAQRJ+tFK2i5njvi0iRUKV09vPwA0iA==", 530 | "requires": { 531 | "@samverschueren/stream-to-observable": "^0.3.0", 532 | "is-observable": "^1.1.0", 533 | "is-promise": "^2.1.0", 534 | "is-stream": "^1.1.0", 535 | "listr-silent-renderer": "^1.1.1", 536 | "listr-update-renderer": "^0.5.0", 537 | "listr-verbose-renderer": "^0.5.0", 538 | "p-map": "^2.0.0", 539 | "rxjs": "^6.3.3" 540 | } 541 | }, 542 | "listr-silent-renderer": { 543 | "version": "1.1.1", 544 | "resolved": "https://registry.npmjs.org/listr-silent-renderer/-/listr-silent-renderer-1.1.1.tgz", 545 | "integrity": "sha1-kktaN1cVN3C/Go4/v3S4u/P5JC4=" 546 | }, 547 | "listr-update-renderer": { 548 | "version": "0.5.0", 549 | "resolved": "https://registry.npmjs.org/listr-update-renderer/-/listr-update-renderer-0.5.0.tgz", 550 | "integrity": "sha512-tKRsZpKz8GSGqoI/+caPmfrypiaq+OQCbd+CovEC24uk1h952lVj5sC7SqyFUm+OaJ5HN/a1YLt5cit2FMNsFA==", 551 | "requires": { 552 | "chalk": "^1.1.3", 553 | "cli-truncate": "^0.2.1", 554 | "elegant-spinner": "^1.0.1", 555 | "figures": "^1.7.0", 556 | "indent-string": "^3.0.0", 557 | "log-symbols": "^1.0.2", 558 | "log-update": "^2.3.0", 559 | "strip-ansi": "^3.0.1" 560 | }, 561 | "dependencies": { 562 | "ansi-regex": { 563 | "version": "2.1.1", 564 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", 565 | "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" 566 | }, 567 | "ansi-styles": { 568 | "version": "2.2.1", 569 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", 570 | "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=" 571 | }, 572 | "chalk": { 573 | "version": "1.1.3", 574 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", 575 | "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", 576 | "requires": { 577 | "ansi-styles": "^2.2.1", 578 | "escape-string-regexp": "^1.0.2", 579 | "has-ansi": "^2.0.0", 580 | "strip-ansi": "^3.0.0", 581 | "supports-color": "^2.0.0" 582 | } 583 | }, 584 | "figures": { 585 | "version": "1.7.0", 586 | "resolved": "https://registry.npmjs.org/figures/-/figures-1.7.0.tgz", 587 | "integrity": "sha1-y+Hjr/zxzUS4DK3+0o3Hk6lwHS4=", 588 | "requires": { 589 | "escape-string-regexp": "^1.0.5", 590 | "object-assign": "^4.1.0" 591 | } 592 | }, 593 | "strip-ansi": { 594 | "version": "3.0.1", 595 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", 596 | "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", 597 | "requires": { 598 | "ansi-regex": "^2.0.0" 599 | } 600 | }, 601 | "supports-color": { 602 | "version": "2.0.0", 603 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", 604 | "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=" 605 | } 606 | } 607 | }, 608 | "listr-verbose-renderer": { 609 | "version": "0.5.0", 610 | "resolved": "https://registry.npmjs.org/listr-verbose-renderer/-/listr-verbose-renderer-0.5.0.tgz", 611 | "integrity": "sha512-04PDPqSlsqIOaaaGZ+41vq5FejI9auqTInicFRndCBgE3bXG8D6W1I+mWhk+1nqbHmyhla/6BUrd5OSiHwKRXw==", 612 | "requires": { 613 | "chalk": "^2.4.1", 614 | "cli-cursor": "^2.1.0", 615 | "date-fns": "^1.27.2", 616 | "figures": "^2.0.0" 617 | } 618 | }, 619 | "lodash": { 620 | "version": "4.17.11", 621 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", 622 | "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==" 623 | }, 624 | "log-symbols": { 625 | "version": "1.0.2", 626 | "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-1.0.2.tgz", 627 | "integrity": "sha1-N2/3tY6jCGoPCfrMdGF+ylAeGhg=", 628 | "requires": { 629 | "chalk": "^1.0.0" 630 | }, 631 | "dependencies": { 632 | "ansi-regex": { 633 | "version": "2.1.1", 634 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", 635 | "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" 636 | }, 637 | "ansi-styles": { 638 | "version": "2.2.1", 639 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", 640 | "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=" 641 | }, 642 | "chalk": { 643 | "version": "1.1.3", 644 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", 645 | "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", 646 | "requires": { 647 | "ansi-styles": "^2.2.1", 648 | "escape-string-regexp": "^1.0.2", 649 | "has-ansi": "^2.0.0", 650 | "strip-ansi": "^3.0.0", 651 | "supports-color": "^2.0.0" 652 | } 653 | }, 654 | "strip-ansi": { 655 | "version": "3.0.1", 656 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", 657 | "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", 658 | "requires": { 659 | "ansi-regex": "^2.0.0" 660 | } 661 | }, 662 | "supports-color": { 663 | "version": "2.0.0", 664 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", 665 | "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=" 666 | } 667 | } 668 | }, 669 | "log-update": { 670 | "version": "2.3.0", 671 | "resolved": "https://registry.npmjs.org/log-update/-/log-update-2.3.0.tgz", 672 | "integrity": "sha1-iDKP19HOeTiykoN0bwsbwSayRwg=", 673 | "requires": { 674 | "ansi-escapes": "^3.0.0", 675 | "cli-cursor": "^2.0.0", 676 | "wrap-ansi": "^3.0.1" 677 | } 678 | }, 679 | "mime-db": { 680 | "version": "1.38.0", 681 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.38.0.tgz", 682 | "integrity": "sha512-bqVioMFFzc2awcdJZIzR3HjZFX20QhilVS7hytkKrv7xFAn8bM1gzc/FOX2awLISvWe0PV8ptFKcon+wZ5qYkg==" 683 | }, 684 | "mime-types": { 685 | "version": "2.1.22", 686 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.22.tgz", 687 | "integrity": "sha512-aGl6TZGnhm/li6F7yx82bJiBZwgiEa4Hf6CNr8YO+r5UHr53tSTYZb102zyU50DOWWKeOv0uQLRL0/9EiKWCog==", 688 | "requires": { 689 | "mime-db": "~1.38.0" 690 | } 691 | }, 692 | "mimic-fn": { 693 | "version": "1.2.0", 694 | "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", 695 | "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==" 696 | }, 697 | "minimist": { 698 | "version": "0.0.8", 699 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", 700 | "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=" 701 | }, 702 | "mkdirp": { 703 | "version": "0.5.1", 704 | "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", 705 | "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", 706 | "requires": { 707 | "minimist": "0.0.8" 708 | } 709 | }, 710 | "mkdirp-promise": { 711 | "version": "5.0.1", 712 | "resolved": "https://registry.npmjs.org/mkdirp-promise/-/mkdirp-promise-5.0.1.tgz", 713 | "integrity": "sha1-6bj2jlUsaKnBcTuEiD96HdA5uKE=", 714 | "requires": { 715 | "mkdirp": "*" 716 | } 717 | }, 718 | "mute-stream": { 719 | "version": "0.0.7", 720 | "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz", 721 | "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=" 722 | }, 723 | "mz": { 724 | "version": "2.7.0", 725 | "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", 726 | "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", 727 | "requires": { 728 | "any-promise": "^1.0.0", 729 | "object-assign": "^4.0.1", 730 | "thenify-all": "^1.0.0" 731 | } 732 | }, 733 | "ncp": { 734 | "version": "2.0.0", 735 | "resolved": "https://registry.npmjs.org/ncp/-/ncp-2.0.0.tgz", 736 | "integrity": "sha1-GVoh1sRuNh0vsSgbo4uR6d9727M=" 737 | }, 738 | "nice-try": { 739 | "version": "1.0.5", 740 | "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", 741 | "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==" 742 | }, 743 | "npm-run-path": { 744 | "version": "2.0.2", 745 | "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", 746 | "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", 747 | "requires": { 748 | "path-key": "^2.0.0" 749 | } 750 | }, 751 | "number-is-nan": { 752 | "version": "1.0.1", 753 | "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", 754 | "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=" 755 | }, 756 | "oauth-sign": { 757 | "version": "0.9.0", 758 | "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", 759 | "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==" 760 | }, 761 | "object-assign": { 762 | "version": "4.1.1", 763 | "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", 764 | "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" 765 | }, 766 | "once": { 767 | "version": "1.4.0", 768 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 769 | "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", 770 | "requires": { 771 | "wrappy": "1" 772 | } 773 | }, 774 | "onetime": { 775 | "version": "2.0.1", 776 | "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", 777 | "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=", 778 | "requires": { 779 | "mimic-fn": "^1.0.0" 780 | } 781 | }, 782 | "os-tmpdir": { 783 | "version": "1.0.2", 784 | "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", 785 | "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=" 786 | }, 787 | "p-finally": { 788 | "version": "1.0.0", 789 | "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", 790 | "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=" 791 | }, 792 | "p-map": { 793 | "version": "2.0.0", 794 | "resolved": "https://registry.npmjs.org/p-map/-/p-map-2.0.0.tgz", 795 | "integrity": "sha512-GO107XdrSUmtHxVoi60qc9tUl/KkNKm+X2CF4P9amalpGxv5YqVPJNfSb0wcA+syCopkZvYYIzW8OVTQW59x/w==" 796 | }, 797 | "path-key": { 798 | "version": "2.0.1", 799 | "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", 800 | "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=" 801 | }, 802 | "performance-now": { 803 | "version": "2.1.0", 804 | "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", 805 | "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=" 806 | }, 807 | "pkg-install": { 808 | "version": "0.2.0", 809 | "resolved": "https://registry.npmjs.org/pkg-install/-/pkg-install-0.2.0.tgz", 810 | "integrity": "sha512-50SoKDmAiXpEeaAX32myrlsoGDdnnP9a2/8ryTGr9r7MnDKrirjdlwMvfIVTY6/AUHq1poa5bHwtvTwhLoqQ6A==", 811 | "requires": { 812 | "@types/execa": "^0.9.0", 813 | "@types/node": "^11.9.4", 814 | "execa": "^1.0.0" 815 | } 816 | }, 817 | "psl": { 818 | "version": "1.1.31", 819 | "resolved": "https://registry.npmjs.org/psl/-/psl-1.1.31.tgz", 820 | "integrity": "sha512-/6pt4+C+T+wZUieKR620OpzN/LlnNKuWjy1iFLQ/UG35JqHlR/89MP1d96dUfkf6Dne3TuLQzOYEYshJ+Hx8mw==" 821 | }, 822 | "pump": { 823 | "version": "3.0.0", 824 | "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", 825 | "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", 826 | "requires": { 827 | "end-of-stream": "^1.1.0", 828 | "once": "^1.3.1" 829 | } 830 | }, 831 | "punycode": { 832 | "version": "2.1.1", 833 | "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", 834 | "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" 835 | }, 836 | "qs": { 837 | "version": "6.5.2", 838 | "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", 839 | "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==" 840 | }, 841 | "request": { 842 | "version": "2.88.0", 843 | "resolved": "https://registry.npmjs.org/request/-/request-2.88.0.tgz", 844 | "integrity": "sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg==", 845 | "requires": { 846 | "aws-sign2": "~0.7.0", 847 | "aws4": "^1.8.0", 848 | "caseless": "~0.12.0", 849 | "combined-stream": "~1.0.6", 850 | "extend": "~3.0.2", 851 | "forever-agent": "~0.6.1", 852 | "form-data": "~2.3.2", 853 | "har-validator": "~5.1.0", 854 | "http-signature": "~1.2.0", 855 | "is-typedarray": "~1.0.0", 856 | "isstream": "~0.1.2", 857 | "json-stringify-safe": "~5.0.1", 858 | "mime-types": "~2.1.19", 859 | "oauth-sign": "~0.9.0", 860 | "performance-now": "^2.1.0", 861 | "qs": "~6.5.2", 862 | "safe-buffer": "^5.1.2", 863 | "tough-cookie": "~2.4.3", 864 | "tunnel-agent": "^0.6.0", 865 | "uuid": "^3.3.2" 866 | } 867 | }, 868 | "request-promise": { 869 | "version": "4.2.4", 870 | "resolved": "https://registry.npmjs.org/request-promise/-/request-promise-4.2.4.tgz", 871 | "integrity": "sha512-8wgMrvE546PzbR5WbYxUQogUnUDfM0S7QIFZMID+J73vdFARkFy+HElj4T+MWYhpXwlLp0EQ8Zoj8xUA0he4Vg==", 872 | "requires": { 873 | "bluebird": "^3.5.0", 874 | "request-promise-core": "1.1.2", 875 | "stealthy-require": "^1.1.1", 876 | "tough-cookie": "^2.3.3" 877 | } 878 | }, 879 | "request-promise-core": { 880 | "version": "1.1.2", 881 | "resolved": "https://registry.npmjs.org/request-promise-core/-/request-promise-core-1.1.2.tgz", 882 | "integrity": "sha512-UHYyq1MO8GsefGEt7EprS8UrXsm1TxEvFUX1IMTuSLU2Rh7fTIdFtl8xD7JiEYiWU2dl+NYAjCTksTehQUxPag==", 883 | "requires": { 884 | "lodash": "^4.17.11" 885 | } 886 | }, 887 | "restore-cursor": { 888 | "version": "2.0.0", 889 | "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", 890 | "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=", 891 | "requires": { 892 | "onetime": "^2.0.0", 893 | "signal-exit": "^3.0.2" 894 | } 895 | }, 896 | "run-async": { 897 | "version": "2.3.0", 898 | "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.3.0.tgz", 899 | "integrity": "sha1-A3GrSuC91yDUFm19/aZP96RFpsA=", 900 | "requires": { 901 | "is-promise": "^2.1.0" 902 | } 903 | }, 904 | "rxjs": { 905 | "version": "6.4.0", 906 | "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.4.0.tgz", 907 | "integrity": "sha512-Z9Yfa11F6B9Sg/BK9MnqnQ+aQYicPLtilXBp2yUtDt2JRCE0h26d33EnfO3ZxoNxG0T92OUucP3Ct7cpfkdFfw==", 908 | "requires": { 909 | "tslib": "^1.9.0" 910 | } 911 | }, 912 | "safe-buffer": { 913 | "version": "5.1.2", 914 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", 915 | "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" 916 | }, 917 | "safer-buffer": { 918 | "version": "2.1.2", 919 | "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", 920 | "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" 921 | }, 922 | "semver": { 923 | "version": "5.6.0", 924 | "resolved": "https://registry.npmjs.org/semver/-/semver-5.6.0.tgz", 925 | "integrity": "sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg==" 926 | }, 927 | "shebang-command": { 928 | "version": "1.2.0", 929 | "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", 930 | "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", 931 | "requires": { 932 | "shebang-regex": "^1.0.0" 933 | } 934 | }, 935 | "shebang-regex": { 936 | "version": "1.0.0", 937 | "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", 938 | "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=" 939 | }, 940 | "signal-exit": { 941 | "version": "3.0.2", 942 | "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", 943 | "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=" 944 | }, 945 | "slice-ansi": { 946 | "version": "0.0.4", 947 | "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-0.0.4.tgz", 948 | "integrity": "sha1-7b+JA/ZvfOL46v1s7tZeJkyDGzU=" 949 | }, 950 | "spdx-license-list": { 951 | "version": "5.0.0", 952 | "resolved": "https://registry.npmjs.org/spdx-license-list/-/spdx-license-list-5.0.0.tgz", 953 | "integrity": "sha512-N5u9tEFRBUzQDjMKRRt8SHxC/UaqYApPmdF4MMFnICQg3z52onNbnneuro/sWw2rd+eGu9agQOzUbD671Xia7Q==" 954 | }, 955 | "sshpk": { 956 | "version": "1.16.1", 957 | "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", 958 | "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", 959 | "requires": { 960 | "asn1": "~0.2.3", 961 | "assert-plus": "^1.0.0", 962 | "bcrypt-pbkdf": "^1.0.0", 963 | "dashdash": "^1.12.0", 964 | "ecc-jsbn": "~0.1.1", 965 | "getpass": "^0.1.1", 966 | "jsbn": "~0.1.0", 967 | "safer-buffer": "^2.0.2", 968 | "tweetnacl": "~0.14.0" 969 | } 970 | }, 971 | "stealthy-require": { 972 | "version": "1.1.1", 973 | "resolved": "https://registry.npmjs.org/stealthy-require/-/stealthy-require-1.1.1.tgz", 974 | "integrity": "sha1-NbCYdbT/SfJqd35QmzCQoyJr8ks=" 975 | }, 976 | "string-width": { 977 | "version": "2.1.1", 978 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", 979 | "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", 980 | "requires": { 981 | "is-fullwidth-code-point": "^2.0.0", 982 | "strip-ansi": "^4.0.0" 983 | }, 984 | "dependencies": { 985 | "strip-ansi": { 986 | "version": "4.0.0", 987 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", 988 | "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", 989 | "requires": { 990 | "ansi-regex": "^3.0.0" 991 | } 992 | } 993 | } 994 | }, 995 | "strip-ansi": { 996 | "version": "5.1.0", 997 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.1.0.tgz", 998 | "integrity": "sha512-TjxrkPONqO2Z8QDCpeE2j6n0M6EwxzyDgzEeGp+FbdvaJAt//ClYi6W5my+3ROlC/hZX2KACUwDfK49Ka5eDvg==", 999 | "requires": { 1000 | "ansi-regex": "^4.1.0" 1001 | }, 1002 | "dependencies": { 1003 | "ansi-regex": { 1004 | "version": "4.1.0", 1005 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", 1006 | "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==" 1007 | } 1008 | } 1009 | }, 1010 | "strip-eof": { 1011 | "version": "1.0.0", 1012 | "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", 1013 | "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=" 1014 | }, 1015 | "supports-color": { 1016 | "version": "5.5.0", 1017 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", 1018 | "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", 1019 | "requires": { 1020 | "has-flag": "^3.0.0" 1021 | } 1022 | }, 1023 | "symbol-observable": { 1024 | "version": "1.2.0", 1025 | "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.2.0.tgz", 1026 | "integrity": "sha512-e900nM8RRtGhlV36KGEU9k65K3mPb1WV70OdjfxlG2EAuM1noi/E/BaW/uMhL7bPEssK8QV57vN3esixjUvcXQ==" 1027 | }, 1028 | "thenify": { 1029 | "version": "3.3.0", 1030 | "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.0.tgz", 1031 | "integrity": "sha1-5p44obq+lpsBCCB5eLn2K4hgSDk=", 1032 | "requires": { 1033 | "any-promise": "^1.0.0" 1034 | } 1035 | }, 1036 | "thenify-all": { 1037 | "version": "1.6.0", 1038 | "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", 1039 | "integrity": "sha1-GhkY1ALY/D+Y+/I02wvMjMEOlyY=", 1040 | "requires": { 1041 | "thenify": ">= 3.1.0 < 4" 1042 | } 1043 | }, 1044 | "through": { 1045 | "version": "2.3.8", 1046 | "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", 1047 | "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=" 1048 | }, 1049 | "tmp": { 1050 | "version": "0.0.33", 1051 | "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", 1052 | "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", 1053 | "requires": { 1054 | "os-tmpdir": "~1.0.2" 1055 | } 1056 | }, 1057 | "tough-cookie": { 1058 | "version": "2.4.3", 1059 | "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.4.3.tgz", 1060 | "integrity": "sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ==", 1061 | "requires": { 1062 | "psl": "^1.1.24", 1063 | "punycode": "^1.4.1" 1064 | }, 1065 | "dependencies": { 1066 | "punycode": { 1067 | "version": "1.4.1", 1068 | "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", 1069 | "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=" 1070 | } 1071 | } 1072 | }, 1073 | "tslib": { 1074 | "version": "1.9.3", 1075 | "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.9.3.tgz", 1076 | "integrity": "sha512-4krF8scpejhaOgqzBEcGM7yDIEfi0/8+8zDRZhNZZ2kjmHJ4hv3zCbQWxoJGz1iw5U0Jl0nma13xzHXcncMavQ==" 1077 | }, 1078 | "tunnel-agent": { 1079 | "version": "0.6.0", 1080 | "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", 1081 | "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", 1082 | "requires": { 1083 | "safe-buffer": "^5.0.1" 1084 | } 1085 | }, 1086 | "tweetnacl": { 1087 | "version": "0.14.5", 1088 | "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", 1089 | "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=" 1090 | }, 1091 | "uri-js": { 1092 | "version": "4.2.2", 1093 | "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", 1094 | "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", 1095 | "requires": { 1096 | "punycode": "^2.1.0" 1097 | } 1098 | }, 1099 | "uuid": { 1100 | "version": "3.3.2", 1101 | "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz", 1102 | "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==" 1103 | }, 1104 | "verror": { 1105 | "version": "1.10.0", 1106 | "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", 1107 | "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", 1108 | "requires": { 1109 | "assert-plus": "^1.0.0", 1110 | "core-util-is": "1.0.2", 1111 | "extsprintf": "^1.2.0" 1112 | } 1113 | }, 1114 | "which": { 1115 | "version": "1.3.1", 1116 | "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", 1117 | "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", 1118 | "requires": { 1119 | "isexe": "^2.0.0" 1120 | } 1121 | }, 1122 | "wrap-ansi": { 1123 | "version": "3.0.1", 1124 | "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-3.0.1.tgz", 1125 | "integrity": "sha1-KIoE2H7aXChuBg3+jxNc6NAH+Lo=", 1126 | "requires": { 1127 | "string-width": "^2.1.1", 1128 | "strip-ansi": "^4.0.0" 1129 | }, 1130 | "dependencies": { 1131 | "strip-ansi": { 1132 | "version": "4.0.0", 1133 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", 1134 | "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", 1135 | "requires": { 1136 | "ansi-regex": "^3.0.0" 1137 | } 1138 | } 1139 | } 1140 | }, 1141 | "wrappy": { 1142 | "version": "1.0.2", 1143 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 1144 | "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" 1145 | } 1146 | } 1147 | } 1148 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "@dkundel/create-project", 3 | "version": "1.0.0", 4 | "description": "A CLI to bootstrap my new projects", 5 | "main": "src/index.js", 6 | "bin": "bin/create-project", 7 | "publishConfig": { 8 | "access": "public" 9 | }, 10 | "scripts": { 11 | "test": "echo \"Error: no test specified\" && exit 1" 12 | }, 13 | "keywords": [ 14 | "cli", 15 | "create-project" 16 | ], 17 | "author": "Dominik Kundel (https://dkundel.com)", 18 | "license": "MIT", 19 | "dependencies": { 20 | "arg": "^4.1.0", 21 | "chalk": "^2.4.2", 22 | "covgen": "^3.1.0", 23 | "esm": "^3.2.18", 24 | "execa": "^1.0.0", 25 | "gitignore": "^0.6.0", 26 | "inquirer": "^6.2.2", 27 | "listr": "^0.14.3", 28 | "ncp": "^2.0.0", 29 | "pkg-install": "^0.2.0", 30 | "spdx-license-list": "^5.0.0" 31 | }, 32 | "files": [ 33 | "bin/", 34 | "src/", 35 | "templates/" 36 | ] 37 | } 38 | -------------------------------------------------------------------------------- /src/cli.js: -------------------------------------------------------------------------------- 1 | import arg from 'arg'; 2 | import inquirer from 'inquirer'; 3 | import { createProject } from './main'; 4 | 5 | function parseArgumentsIntoOptions(rawArgs) { 6 | const args = arg( 7 | { 8 | '--git': Boolean, 9 | '--yes': Boolean, 10 | '--install': Boolean, 11 | '-g': '--git', 12 | '-y': '--yes', 13 | '-i': '--install', 14 | }, 15 | { 16 | argv: rawArgs.slice(2), 17 | } 18 | ); 19 | return { 20 | skipPrompts: args['--yes'] || false, 21 | git: args['--git'] || false, 22 | template: args._[0], 23 | runInstall: args['--install'] || false, 24 | }; 25 | } 26 | 27 | async function promptForMissingOptions(options) { 28 | const defaultTemplate = 'javascript'; 29 | if (options.skipPrompts) { 30 | return { 31 | ...options, 32 | template: options.template || defaultTemplate, 33 | }; 34 | } 35 | 36 | const questions = []; 37 | if (!options.template) { 38 | questions.push({ 39 | type: 'list', 40 | name: 'template', 41 | message: 'Please choose which project template to use', 42 | choices: ['javascript', 'typescript'], 43 | default: defaultTemplate, 44 | }); 45 | } 46 | 47 | if (!options.git) { 48 | questions.push({ 49 | type: 'confirm', 50 | name: 'git', 51 | message: 'Should a git be initialized?', 52 | default: false, 53 | }); 54 | } 55 | 56 | const answers = await inquirer.prompt(questions); 57 | return { 58 | ...options, 59 | template: options.template || answers.template, 60 | git: options.git || answers.git, 61 | }; 62 | } 63 | 64 | export async function cli(args) { 65 | let options = parseArgumentsIntoOptions(args); 66 | options = await promptForMissingOptions(options); 67 | await createProject(options); 68 | } 69 | 70 | // ... 71 | -------------------------------------------------------------------------------- /src/main.js: -------------------------------------------------------------------------------- 1 | import chalk from 'chalk'; 2 | import execa from 'execa'; 3 | import fs from 'fs'; 4 | import gitignore from 'gitignore'; 5 | import Listr from 'listr'; 6 | import ncp from 'ncp'; 7 | import path from 'path'; 8 | import { projectInstall } from 'pkg-install'; 9 | import license from 'spdx-license-list/licenses/MIT'; 10 | import { promisify } from 'util'; 11 | 12 | const access = promisify(fs.access); 13 | const writeFile = promisify(fs.writeFile); 14 | const copy = promisify(ncp); 15 | const writeGitignore = promisify(gitignore.writeFile); 16 | 17 | async function copyTemplateFiles(options) { 18 | return copy(options.templateDirectory, options.targetDirectory, { 19 | clobber: false, 20 | }); 21 | } 22 | 23 | async function createGitignore(options) { 24 | const file = fs.createWriteStream( 25 | path.join(options.targetDirectory, '.gitignore'), 26 | { flags: 'a' } 27 | ); 28 | return writeGitignore({ 29 | type: 'Node', 30 | file: file, 31 | }); 32 | } 33 | 34 | async function createLicense(options) { 35 | const targetPath = path.join(options.targetDirectory, 'LICENSE'); 36 | const licenseContent = license.licenseText 37 | .replace('', new Date().getFullYear()) 38 | .replace('', `${options.name} (${options.email})`); 39 | return writeFile(targetPath, licenseContent, 'utf8'); 40 | } 41 | 42 | async function initGit(options) { 43 | const result = await execa('git', ['init'], { 44 | cwd: options.targetDirectory, 45 | }); 46 | if (result.failed) { 47 | return Promise.reject(new Error('Failed to initialize git')); 48 | } 49 | return; 50 | } 51 | 52 | export async function createProject(options) { 53 | options = { 54 | ...options, 55 | targetDirectory: options.targetDirectory || process.cwd(), 56 | email: 'hi@dominik.dev', 57 | name: 'Dominik Kundel', 58 | }; 59 | 60 | const fullPathName = new URL(import.meta.url).pathname; 61 | const templateDir = path.resolve( 62 | fullPathName.substr(fullPathName.indexOf('/')), 63 | '../../templates', 64 | options.template.toLowerCase() 65 | ); 66 | options.templateDirectory = templateDir; 67 | 68 | try { 69 | await access(templateDir, fs.constants.R_OK); 70 | } catch (err) { 71 | console.error('%s Invalid template name', chalk.red.bold('ERROR')); 72 | process.exit(1); 73 | } 74 | 75 | const tasks = new Listr( 76 | [ 77 | { 78 | title: 'Copy project files', 79 | task: () => copyTemplateFiles(options), 80 | }, 81 | { 82 | title: 'Create gitignore', 83 | task: () => createGitignore(options), 84 | }, 85 | { 86 | title: 'Create License', 87 | task: () => createLicense(options), 88 | }, 89 | { 90 | title: 'Initialize git', 91 | task: () => initGit(options), 92 | enabled: () => options.git, 93 | }, 94 | { 95 | title: 'Install dependencies', 96 | task: () => 97 | projectInstall({ 98 | cwd: options.targetDirectory, 99 | }), 100 | skip: () => 101 | !options.runInstall 102 | ? 'Pass --install to automatically install dependencies' 103 | : undefined, 104 | }, 105 | ], 106 | { 107 | exitOnError: false, 108 | } 109 | ); 110 | 111 | await tasks.run(); 112 | console.log('%s Project ready', chalk.green.bold('DONE')); 113 | return true; 114 | } 115 | -------------------------------------------------------------------------------- /templates/javascript/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "javascript-template", 3 | "version": "1.0.0", 4 | "description": "", 5 | "main": "src/index.js", 6 | "scripts": { 7 | "test": "echo \"Error: no test specified\" && exit 1" 8 | }, 9 | "keywords": [], 10 | "author": "Dominik Kundel (https://dkundel.com)", 11 | "license": "MIT", 12 | "dependencies": { 13 | "esm": "^3.2.18" 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /templates/javascript/src/index.js: -------------------------------------------------------------------------------- 1 | // Set options as a parameter, environment variable, or rc file. 2 | require = require('esm')(module /*, options*/); 3 | module.exports = require('./main.js'); 4 | -------------------------------------------------------------------------------- /templates/javascript/src/main.js: -------------------------------------------------------------------------------- 1 | console.log('Hello'); 2 | -------------------------------------------------------------------------------- /templates/typescript/README.md: -------------------------------------------------------------------------------- 1 | # `typescript-template` 2 | -------------------------------------------------------------------------------- /templates/typescript/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "typescript-template", 3 | "version": "1.0.0", 4 | "description": "", 5 | "main": "dist/index.js", 6 | "scripts": { 7 | "build": "tsc", 8 | "dev": "tsc --watch", 9 | "test": "echo \"Error: no test specified\" && exit 1" 10 | }, 11 | "keywords": [], 12 | "author": "Dominik Kundel (https://dkundel.com)", 13 | "license": "MIT", 14 | "devDependencies": { 15 | "typescript": "^3.3.3333" 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /templates/typescript/src/index.ts: -------------------------------------------------------------------------------- 1 | console.log('Hello World'); 2 | -------------------------------------------------------------------------------- /templates/typescript/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | /* Basic Options */ 4 | "target": "es5" /* Specify ECMAScript target version: 'ES3' (default), 'ES5', 'ES2015', 'ES2016', 'ES2017','ES2018' or 'ESNEXT'. */, 5 | "module": "commonjs" /* Specify module code generation: 'none', 'commonjs', 'amd', 'system', 'umd', 'es2015', or 'ESNext'. */, 6 | // "lib": [], /* Specify library files to be included in the compilation. */ 7 | // "allowJs": true, /* Allow javascript files to be compiled. */ 8 | // "checkJs": true, /* Report errors in .js files. */ 9 | // "jsx": "preserve", /* Specify JSX code generation: 'preserve', 'react-native', or 'react'. */ 10 | "declaration": true /* Generates corresponding '.d.ts' file. */, 11 | // "declarationMap": true, /* Generates a sourcemap for each corresponding '.d.ts' file. */ 12 | "sourceMap": true /* Generates corresponding '.map' file. */, 13 | // "outFile": "./", /* Concatenate and emit output to single file. */ 14 | "outDir": "./dist" /* Redirect output structure to the directory. */, 15 | // "rootDir": "./", /* Specify the root directory of input files. Use to control the output directory structure with --outDir. */ 16 | // "composite": true, /* Enable project compilation */ 17 | // "removeComments": true, /* Do not emit comments to output. */ 18 | // "noEmit": true, /* Do not emit outputs. */ 19 | // "importHelpers": true, /* Import emit helpers from 'tslib'. */ 20 | // "downlevelIteration": true, /* Provide full support for iterables in 'for-of', spread, and destructuring when targeting 'ES5' or 'ES3'. */ 21 | // "isolatedModules": true, /* Transpile each file as a separate module (similar to 'ts.transpileModule'). */ 22 | 23 | /* Strict Type-Checking Options */ 24 | "strict": true /* Enable all strict type-checking options. */, 25 | // "noImplicitAny": true, /* Raise error on expressions and declarations with an implied 'any' type. */ 26 | // "strictNullChecks": true, /* Enable strict null checks. */ 27 | // "strictFunctionTypes": true, /* Enable strict checking of function types. */ 28 | // "strictBindCallApply": true, /* Enable strict 'bind', 'call', and 'apply' methods on functions. */ 29 | // "strictPropertyInitialization": true, /* Enable strict checking of property initialization in classes. */ 30 | // "noImplicitThis": true, /* Raise error on 'this' expressions with an implied 'any' type. */ 31 | // "alwaysStrict": true, /* Parse in strict mode and emit "use strict" for each source file. */ 32 | 33 | /* Additional Checks */ 34 | // "noUnusedLocals": true, /* Report errors on unused locals. */ 35 | // "noUnusedParameters": true, /* Report errors on unused parameters. */ 36 | // "noImplicitReturns": true, /* Report error when not all code paths in function return a value. */ 37 | // "noFallthroughCasesInSwitch": true, /* Report errors for fallthrough cases in switch statement. */ 38 | 39 | /* Module Resolution Options */ 40 | // "moduleResolution": "node", /* Specify module resolution strategy: 'node' (Node.js) or 'classic' (TypeScript pre-1.6). */ 41 | // "baseUrl": "./", /* Base directory to resolve non-absolute module names. */ 42 | // "paths": {}, /* A series of entries which re-map imports to lookup locations relative to the 'baseUrl'. */ 43 | // "rootDirs": [], /* List of root folders whose combined content represents the structure of the project at runtime. */ 44 | // "typeRoots": [], /* List of folders to include type definitions from. */ 45 | // "types": [], /* Type declaration files to be included in compilation. */ 46 | // "allowSyntheticDefaultImports": true, /* Allow default imports from modules with no default export. This does not affect code emit, just typechecking. */ 47 | "esModuleInterop": true /* Enables emit interoperability between CommonJS and ES Modules via creation of namespace objects for all imports. Implies 'allowSyntheticDefaultImports'. */ 48 | // "preserveSymlinks": true, /* Do not resolve the real path of symlinks. */ 49 | 50 | /* Source Map Options */ 51 | // "sourceRoot": "", /* Specify the location where debugger should locate TypeScript files instead of source locations. */ 52 | // "mapRoot": "", /* Specify the location where debugger should locate map files instead of generated locations. */ 53 | // "inlineSourceMap": true, /* Emit a single file with source maps instead of having a separate file. */ 54 | // "inlineSources": true, /* Emit the source alongside the sourcemaps within a single file; requires '--inlineSourceMap' or '--sourceMap' to be set. */ 55 | 56 | /* Experimental Options */ 57 | // "experimentalDecorators": true, /* Enables experimental support for ES7 decorators. */ 58 | // "emitDecoratorMetadata": true, /* Enables experimental support for emitting type metadata for decorators. */ 59 | } 60 | } 61 | --------------------------------------------------------------------------------