├── .gitignore ├── CHANGELOG.md ├── LICENSE ├── README.md ├── package-lock.json ├── package.json ├── shadow-cljs.edn ├── src └── cscljs │ └── main.cljs └── templates ├── README.md ├── package.json ├── shadow-cljs.edn └── src ├── _build_hooks ├── browser.clj └── index.html ├── browser └── main.cljs ├── library └── main.cljs └── server └── main.cljs /.gitignore: -------------------------------------------------------------------------------- 1 | build/ 2 | node_modules/ 3 | .shadow-cljs/ 4 | .nrepl-port 5 | *.tgz 6 | dist/ 7 | -------------------------------------------------------------------------------- /CHANGELOG.md: -------------------------------------------------------------------------------- 1 | # Changelog 2 | 3 | ## 1.1.4 4 | 5 | - Use `Shadow-CLJS`'s built-in server during watch mode instead of having to run separate server to serve the built assets. 6 | 7 | ## 1.1.3 8 | 9 | - Only `shelljs` is now a non-dev dependency, which should make it slightly faster to run through `npx` 10 | 11 | ## 1.1.2 12 | 13 | - Fixed a typo in the package name shown when running the initializer 14 | - Minor refactoring in the code 15 | 16 | ## 1.1.1 17 | 18 | - Fixed a typo in the usage typical example shown by `-h/--help` 19 | 20 | ## 1.1.0 21 | 22 | ### Removed 23 | 24 | - Removed the option `-i/--install` and only retained the `--no-install` which still skips running `npm install` to the newly created project. 25 | 26 | ### Other 27 | 28 | - Minor code refactoring 29 | 30 | ## 1.0.3 31 | 32 | - Ported code to ClojureScript 33 | 34 | ## 1.0.2 35 | 36 | - Fixed usage with `npx create-shadow-cljs-app ` 37 | 38 | ## <= 1.0.1 39 | 40 | - **DEPRECATED** 41 | - Does not work properly with `npx` 42 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2019 Lambros Petrou 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 | # create-shadow-cljs-app 2 | 3 | This is an NPM initializer to ease the creation of projects using the **awesome** [Shadow-CLJS](https://shadow-cljs.github.io/docs/UsersGuide.html). 4 | 5 | The default template provides out-of-the-box setup for a Node script, a standard `commonjs` library, and a browser-compatible output. 6 | 7 | ## Get started 8 | 9 | To create a project named `cljs-app`, run any of the following commands: 10 | 11 | ``` 12 | npx create-shadow-cljs-app cljs-app 13 | 14 | # or 15 | 16 | npm init shadow-cljs-app cljs-app 17 | ``` 18 | 19 | This will create a directory `cljs-app` with code for the three main targets supported. 20 | 21 | To create release artifacts for all of the available targets run `npm run release`. 22 | 23 | Check the `README.md` of the created project for more details on what you get. 24 | 25 | ## Options 26 | 27 | To see all the options available run `npx create-shadow-cljs-app --help`. 28 | 29 | ## Contributing 30 | 31 | The goal of this project is to provide a no-fuss starting template for projects to use `Shadow-CLJS`. 32 | 33 | I am happy to accept pull requests as long as the goal of the projects remains as is. 34 | 35 | When choosing between simplicity and features, always prefer simplicity. 36 | 37 | ### Local testing 38 | 39 | In order to test the initializer locally you can use [`npx`](https://github.com/npm/npx) to simulate the flow using a local directory. 40 | 41 | ```bash 42 | # Checkout the initializer code 43 | mkdir -p ~/dev && cd ~/dev 44 | git clone https://github.com/lambrospetrou/create-shadow-cljs-app.git 45 | pushd create-shadow-cljs-app && npm install && npm pack && popd 46 | 47 | # Create the new app using the local version of the initializer (use the right version in the `*.tgz` file) 48 | npx ~/dev/create-shadow-cljs-app/create-shadow-cljs-app-1.1.1.tgz --name cljs-app 49 | ``` 50 | -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "create-shadow-cljs-app", 3 | "version": "1.1.4", 4 | "lockfileVersion": 1, 5 | "requires": true, 6 | "dependencies": { 7 | "ansi-styles": { 8 | "version": "3.2.1", 9 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", 10 | "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", 11 | "dev": true, 12 | "requires": { 13 | "color-convert": "^1.9.0" 14 | } 15 | }, 16 | "array-back": { 17 | "version": "3.1.0", 18 | "resolved": "https://registry.npmjs.org/array-back/-/array-back-3.1.0.tgz", 19 | "integrity": "sha512-TkuxA4UCOvxuDK6NZYXCalszEzj+TLszyASooky+i742l9TqsOdYCMJJupxRic61hwquNtppB3hgcuq9SVSH1Q==", 20 | "dev": true 21 | }, 22 | "asn1.js": { 23 | "version": "4.10.1", 24 | "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.10.1.tgz", 25 | "integrity": "sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw==", 26 | "dev": true, 27 | "requires": { 28 | "bn.js": "^4.0.0", 29 | "inherits": "^2.0.1", 30 | "minimalistic-assert": "^1.0.0" 31 | } 32 | }, 33 | "assert": { 34 | "version": "1.5.0", 35 | "resolved": "https://registry.npmjs.org/assert/-/assert-1.5.0.tgz", 36 | "integrity": "sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA==", 37 | "dev": true, 38 | "requires": { 39 | "object-assign": "^4.1.1", 40 | "util": "0.10.3" 41 | }, 42 | "dependencies": { 43 | "inherits": { 44 | "version": "2.0.1", 45 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", 46 | "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=", 47 | "dev": true 48 | }, 49 | "util": { 50 | "version": "0.10.3", 51 | "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", 52 | "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=", 53 | "dev": true, 54 | "requires": { 55 | "inherits": "2.0.1" 56 | } 57 | } 58 | } 59 | }, 60 | "async-limiter": { 61 | "version": "1.0.1", 62 | "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz", 63 | "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==", 64 | "dev": true 65 | }, 66 | "balanced-match": { 67 | "version": "1.0.0", 68 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", 69 | "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" 70 | }, 71 | "base64-js": { 72 | "version": "1.3.1", 73 | "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.1.tgz", 74 | "integrity": "sha512-mLQ4i2QO1ytvGWFWmcngKO//JXAQueZvwEKtjgQFM4jIK0kU+ytMfplL8j+n5mspOfjHwoAg+9yhb7BwAHm36g==", 75 | "dev": true 76 | }, 77 | "bn.js": { 78 | "version": "4.11.8", 79 | "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz", 80 | "integrity": "sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA==", 81 | "dev": true 82 | }, 83 | "brace-expansion": { 84 | "version": "1.1.11", 85 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", 86 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", 87 | "requires": { 88 | "balanced-match": "^1.0.0", 89 | "concat-map": "0.0.1" 90 | } 91 | }, 92 | "brorand": { 93 | "version": "1.1.0", 94 | "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", 95 | "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=", 96 | "dev": true 97 | }, 98 | "browserify-aes": { 99 | "version": "1.2.0", 100 | "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", 101 | "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", 102 | "dev": true, 103 | "requires": { 104 | "buffer-xor": "^1.0.3", 105 | "cipher-base": "^1.0.0", 106 | "create-hash": "^1.1.0", 107 | "evp_bytestokey": "^1.0.3", 108 | "inherits": "^2.0.1", 109 | "safe-buffer": "^5.0.1" 110 | } 111 | }, 112 | "browserify-cipher": { 113 | "version": "1.0.1", 114 | "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz", 115 | "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==", 116 | "dev": true, 117 | "requires": { 118 | "browserify-aes": "^1.0.4", 119 | "browserify-des": "^1.0.0", 120 | "evp_bytestokey": "^1.0.0" 121 | } 122 | }, 123 | "browserify-des": { 124 | "version": "1.0.2", 125 | "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz", 126 | "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==", 127 | "dev": true, 128 | "requires": { 129 | "cipher-base": "^1.0.1", 130 | "des.js": "^1.0.0", 131 | "inherits": "^2.0.1", 132 | "safe-buffer": "^5.1.2" 133 | } 134 | }, 135 | "browserify-rsa": { 136 | "version": "4.0.1", 137 | "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz", 138 | "integrity": "sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ=", 139 | "dev": true, 140 | "requires": { 141 | "bn.js": "^4.1.0", 142 | "randombytes": "^2.0.1" 143 | } 144 | }, 145 | "browserify-sign": { 146 | "version": "4.0.4", 147 | "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.0.4.tgz", 148 | "integrity": "sha1-qk62jl17ZYuqa/alfmMMvXqT0pg=", 149 | "dev": true, 150 | "requires": { 151 | "bn.js": "^4.1.1", 152 | "browserify-rsa": "^4.0.0", 153 | "create-hash": "^1.1.0", 154 | "create-hmac": "^1.1.2", 155 | "elliptic": "^6.0.0", 156 | "inherits": "^2.0.1", 157 | "parse-asn1": "^5.0.0" 158 | } 159 | }, 160 | "browserify-zlib": { 161 | "version": "0.2.0", 162 | "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz", 163 | "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==", 164 | "dev": true, 165 | "requires": { 166 | "pako": "~1.0.5" 167 | } 168 | }, 169 | "buffer": { 170 | "version": "4.9.1", 171 | "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.1.tgz", 172 | "integrity": "sha1-bRu2AbB6TvztlwlBMgkwJ8lbwpg=", 173 | "dev": true, 174 | "requires": { 175 | "base64-js": "^1.0.2", 176 | "ieee754": "^1.1.4", 177 | "isarray": "^1.0.0" 178 | } 179 | }, 180 | "buffer-xor": { 181 | "version": "1.0.3", 182 | "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", 183 | "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=", 184 | "dev": true 185 | }, 186 | "builtin-status-codes": { 187 | "version": "3.0.0", 188 | "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", 189 | "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=", 190 | "dev": true 191 | }, 192 | "chalk": { 193 | "version": "2.4.2", 194 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", 195 | "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", 196 | "dev": true, 197 | "requires": { 198 | "ansi-styles": "^3.2.1", 199 | "escape-string-regexp": "^1.0.5", 200 | "supports-color": "^5.3.0" 201 | } 202 | }, 203 | "cipher-base": { 204 | "version": "1.0.4", 205 | "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", 206 | "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", 207 | "dev": true, 208 | "requires": { 209 | "inherits": "^2.0.1", 210 | "safe-buffer": "^5.0.1" 211 | } 212 | }, 213 | "color-convert": { 214 | "version": "1.9.3", 215 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", 216 | "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", 217 | "dev": true, 218 | "requires": { 219 | "color-name": "1.1.3" 220 | } 221 | }, 222 | "color-name": { 223 | "version": "1.1.3", 224 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", 225 | "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", 226 | "dev": true 227 | }, 228 | "colors": { 229 | "version": "1.3.3", 230 | "resolved": "https://registry.npmjs.org/colors/-/colors-1.3.3.tgz", 231 | "integrity": "sha512-mmGt/1pZqYRjMxB1axhTo16/snVZ5krrKkcmMeVKxzECMMXoCgnvTPp10QgHfcbQZw8Dq2jMNG6je4JlWU0gWg==", 232 | "dev": true 233 | }, 234 | "command-line-args": { 235 | "version": "5.1.1", 236 | "resolved": "https://registry.npmjs.org/command-line-args/-/command-line-args-5.1.1.tgz", 237 | "integrity": "sha512-hL/eG8lrll1Qy1ezvkant+trihbGnaKaeEjj6Scyr3DN+RC7iQ5Rz84IeLERfAWDGo0HBSNAakczwgCilDXnWg==", 238 | "dev": true, 239 | "requires": { 240 | "array-back": "^3.0.1", 241 | "find-replace": "^3.0.0", 242 | "lodash.camelcase": "^4.3.0", 243 | "typical": "^4.0.0" 244 | } 245 | }, 246 | "command-line-usage": { 247 | "version": "6.0.2", 248 | "resolved": "https://registry.npmjs.org/command-line-usage/-/command-line-usage-6.0.2.tgz", 249 | "integrity": "sha512-Jr9RQM43qWDwpRJOa0lgZw0LhiU8tgOqoR+xxIcb3eT5vFZi69fBWUODMSBtGUYI1qTlElPl3txFQY6rChVuXQ==", 250 | "dev": true, 251 | "requires": { 252 | "array-back": "^3.1.0", 253 | "chalk": "^2.4.2", 254 | "table-layout": "^1.0.0", 255 | "typical": "^5.1.0" 256 | }, 257 | "dependencies": { 258 | "typical": { 259 | "version": "5.1.0", 260 | "resolved": "https://registry.npmjs.org/typical/-/typical-5.1.0.tgz", 261 | "integrity": "sha512-t5Ik8UAwBal1P1XzuVE4dc+RYQZicLUGJdvqr/vdqsED7SQECgsGBylldSsfWZL7RQjxT3xhQcKHWhLaVSR6YQ==", 262 | "dev": true 263 | } 264 | } 265 | }, 266 | "concat-map": { 267 | "version": "0.0.1", 268 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", 269 | "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" 270 | }, 271 | "console-browserify": { 272 | "version": "1.1.0", 273 | "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.1.0.tgz", 274 | "integrity": "sha1-8CQcRXMKn8YyOyBtvzjtx0HQuxA=", 275 | "dev": true, 276 | "requires": { 277 | "date-now": "^0.1.4" 278 | } 279 | }, 280 | "constants-browserify": { 281 | "version": "1.0.0", 282 | "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", 283 | "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=", 284 | "dev": true 285 | }, 286 | "core-util-is": { 287 | "version": "1.0.2", 288 | "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", 289 | "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", 290 | "dev": true 291 | }, 292 | "create-ecdh": { 293 | "version": "4.0.3", 294 | "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.3.tgz", 295 | "integrity": "sha512-GbEHQPMOswGpKXM9kCWVrremUcBmjteUaQ01T9rkKCPDXfUHX0IoP9LpHYo2NPFampa4e+/pFDc3jQdxrxQLaw==", 296 | "dev": true, 297 | "requires": { 298 | "bn.js": "^4.1.0", 299 | "elliptic": "^6.0.0" 300 | } 301 | }, 302 | "create-hash": { 303 | "version": "1.2.0", 304 | "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", 305 | "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", 306 | "dev": true, 307 | "requires": { 308 | "cipher-base": "^1.0.1", 309 | "inherits": "^2.0.1", 310 | "md5.js": "^1.3.4", 311 | "ripemd160": "^2.0.1", 312 | "sha.js": "^2.4.0" 313 | } 314 | }, 315 | "create-hmac": { 316 | "version": "1.1.7", 317 | "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", 318 | "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", 319 | "dev": true, 320 | "requires": { 321 | "cipher-base": "^1.0.3", 322 | "create-hash": "^1.1.0", 323 | "inherits": "^2.0.1", 324 | "ripemd160": "^2.0.0", 325 | "safe-buffer": "^5.0.1", 326 | "sha.js": "^2.4.8" 327 | } 328 | }, 329 | "crypto-browserify": { 330 | "version": "3.12.0", 331 | "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz", 332 | "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==", 333 | "dev": true, 334 | "requires": { 335 | "browserify-cipher": "^1.0.0", 336 | "browserify-sign": "^4.0.0", 337 | "create-ecdh": "^4.0.0", 338 | "create-hash": "^1.1.0", 339 | "create-hmac": "^1.1.0", 340 | "diffie-hellman": "^5.0.0", 341 | "inherits": "^2.0.1", 342 | "pbkdf2": "^3.0.3", 343 | "public-encrypt": "^4.0.0", 344 | "randombytes": "^2.0.0", 345 | "randomfill": "^1.0.3" 346 | } 347 | }, 348 | "date-now": { 349 | "version": "0.1.4", 350 | "resolved": "https://registry.npmjs.org/date-now/-/date-now-0.1.4.tgz", 351 | "integrity": "sha1-6vQ5/U1ISK105cx9vvIAZyueNFs=", 352 | "dev": true 353 | }, 354 | "deep-extend": { 355 | "version": "0.6.0", 356 | "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", 357 | "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", 358 | "dev": true 359 | }, 360 | "des.js": { 361 | "version": "1.0.0", 362 | "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.0.tgz", 363 | "integrity": "sha1-wHTS4qpqipoH29YfmhXCzYPsjsw=", 364 | "dev": true, 365 | "requires": { 366 | "inherits": "^2.0.1", 367 | "minimalistic-assert": "^1.0.0" 368 | } 369 | }, 370 | "diffie-hellman": { 371 | "version": "5.0.3", 372 | "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", 373 | "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", 374 | "dev": true, 375 | "requires": { 376 | "bn.js": "^4.1.0", 377 | "miller-rabin": "^4.0.0", 378 | "randombytes": "^2.0.0" 379 | } 380 | }, 381 | "domain-browser": { 382 | "version": "1.2.0", 383 | "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz", 384 | "integrity": "sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==", 385 | "dev": true 386 | }, 387 | "elliptic": { 388 | "version": "6.5.0", 389 | "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.0.tgz", 390 | "integrity": "sha512-eFOJTMyCYb7xtE/caJ6JJu+bhi67WCYNbkGSknu20pmM8Ke/bqOfdnZWxyoGN26JgfxTbXrsCkEw4KheCT/KGg==", 391 | "dev": true, 392 | "requires": { 393 | "bn.js": "^4.4.0", 394 | "brorand": "^1.0.1", 395 | "hash.js": "^1.0.0", 396 | "hmac-drbg": "^1.0.0", 397 | "inherits": "^2.0.1", 398 | "minimalistic-assert": "^1.0.0", 399 | "minimalistic-crypto-utils": "^1.0.0" 400 | } 401 | }, 402 | "es6-object-assign": { 403 | "version": "1.1.0", 404 | "resolved": "https://registry.npmjs.org/es6-object-assign/-/es6-object-assign-1.1.0.tgz", 405 | "integrity": "sha1-wsNYJlYkfDnqEHyx5mUrb58kUjw=", 406 | "dev": true 407 | }, 408 | "escape-string-regexp": { 409 | "version": "1.0.5", 410 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", 411 | "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", 412 | "dev": true 413 | }, 414 | "events": { 415 | "version": "3.0.0", 416 | "resolved": "https://registry.npmjs.org/events/-/events-3.0.0.tgz", 417 | "integrity": "sha512-Dc381HFWJzEOhQ+d8pkNon++bk9h6cdAoAj4iE6Q4y6xgTzySWXlKn05/TVNpjnfRqi/X0EpJEJohPjNI3zpVA==", 418 | "dev": true 419 | }, 420 | "evp_bytestokey": { 421 | "version": "1.0.3", 422 | "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", 423 | "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", 424 | "dev": true, 425 | "requires": { 426 | "md5.js": "^1.3.4", 427 | "safe-buffer": "^5.1.1" 428 | } 429 | }, 430 | "find-replace": { 431 | "version": "3.0.0", 432 | "resolved": "https://registry.npmjs.org/find-replace/-/find-replace-3.0.0.tgz", 433 | "integrity": "sha512-6Tb2myMioCAgv5kfvP5/PkZZ/ntTpVK39fHY7WkWBgvbeE+VHd/tZuZ4mrC+bxh4cfOZeYKVPaJIZtZXV7GNCQ==", 434 | "dev": true, 435 | "requires": { 436 | "array-back": "^3.0.1" 437 | } 438 | }, 439 | "fs.realpath": { 440 | "version": "1.0.0", 441 | "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", 442 | "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" 443 | }, 444 | "glob": { 445 | "version": "7.1.4", 446 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.4.tgz", 447 | "integrity": "sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A==", 448 | "requires": { 449 | "fs.realpath": "^1.0.0", 450 | "inflight": "^1.0.4", 451 | "inherits": "2", 452 | "minimatch": "^3.0.4", 453 | "once": "^1.3.0", 454 | "path-is-absolute": "^1.0.0" 455 | } 456 | }, 457 | "has-flag": { 458 | "version": "3.0.0", 459 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", 460 | "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", 461 | "dev": true 462 | }, 463 | "hash-base": { 464 | "version": "3.0.4", 465 | "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.0.4.tgz", 466 | "integrity": "sha1-X8hoaEfs1zSZQDMZprCj8/auSRg=", 467 | "dev": true, 468 | "requires": { 469 | "inherits": "^2.0.1", 470 | "safe-buffer": "^5.0.1" 471 | } 472 | }, 473 | "hash.js": { 474 | "version": "1.1.7", 475 | "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", 476 | "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", 477 | "dev": true, 478 | "requires": { 479 | "inherits": "^2.0.3", 480 | "minimalistic-assert": "^1.0.1" 481 | } 482 | }, 483 | "hmac-drbg": { 484 | "version": "1.0.1", 485 | "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", 486 | "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", 487 | "dev": true, 488 | "requires": { 489 | "hash.js": "^1.0.3", 490 | "minimalistic-assert": "^1.0.0", 491 | "minimalistic-crypto-utils": "^1.0.1" 492 | } 493 | }, 494 | "https-browserify": { 495 | "version": "1.0.0", 496 | "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", 497 | "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=", 498 | "dev": true 499 | }, 500 | "ieee754": { 501 | "version": "1.1.13", 502 | "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.13.tgz", 503 | "integrity": "sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg==", 504 | "dev": true 505 | }, 506 | "inflight": { 507 | "version": "1.0.6", 508 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", 509 | "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", 510 | "requires": { 511 | "once": "^1.3.0", 512 | "wrappy": "1" 513 | } 514 | }, 515 | "inherits": { 516 | "version": "2.0.4", 517 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", 518 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" 519 | }, 520 | "interpret": { 521 | "version": "1.2.0", 522 | "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.2.0.tgz", 523 | "integrity": "sha512-mT34yGKMNceBQUoVn7iCDKDntA7SC6gycMAWzGx1z/CMCTV7b2AAtXlo3nRyHZ1FelRkQbQjprHSYGwzLtkVbw==" 524 | }, 525 | "isarray": { 526 | "version": "1.0.0", 527 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", 528 | "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", 529 | "dev": true 530 | }, 531 | "isexe": { 532 | "version": "2.0.0", 533 | "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", 534 | "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", 535 | "dev": true 536 | }, 537 | "lodash.camelcase": { 538 | "version": "4.3.0", 539 | "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", 540 | "integrity": "sha1-soqmKIorn8ZRA1x3EfZathkDMaY=", 541 | "dev": true 542 | }, 543 | "md5.js": { 544 | "version": "1.3.5", 545 | "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", 546 | "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", 547 | "dev": true, 548 | "requires": { 549 | "hash-base": "^3.0.0", 550 | "inherits": "^2.0.1", 551 | "safe-buffer": "^5.1.2" 552 | } 553 | }, 554 | "miller-rabin": { 555 | "version": "4.0.1", 556 | "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", 557 | "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", 558 | "dev": true, 559 | "requires": { 560 | "bn.js": "^4.0.0", 561 | "brorand": "^1.0.1" 562 | } 563 | }, 564 | "minimalistic-assert": { 565 | "version": "1.0.1", 566 | "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", 567 | "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", 568 | "dev": true 569 | }, 570 | "minimalistic-crypto-utils": { 571 | "version": "1.0.1", 572 | "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", 573 | "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=", 574 | "dev": true 575 | }, 576 | "minimatch": { 577 | "version": "3.0.4", 578 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", 579 | "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", 580 | "requires": { 581 | "brace-expansion": "^1.1.7" 582 | } 583 | }, 584 | "minimist": { 585 | "version": "1.2.5", 586 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", 587 | "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", 588 | "dev": true 589 | }, 590 | "mkdirp": { 591 | "version": "0.5.5", 592 | "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", 593 | "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", 594 | "dev": true, 595 | "requires": { 596 | "minimist": "^1.2.5" 597 | } 598 | }, 599 | "node-libs-browser": { 600 | "version": "2.2.1", 601 | "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.2.1.tgz", 602 | "integrity": "sha512-h/zcD8H9kaDZ9ALUWwlBUDo6TKF8a7qBSCSEGfjTVIYeqsioSKaAX+BN7NgiMGp6iSIXZ3PxgCu8KS3b71YK5Q==", 603 | "dev": true, 604 | "requires": { 605 | "assert": "^1.1.1", 606 | "browserify-zlib": "^0.2.0", 607 | "buffer": "^4.3.0", 608 | "console-browserify": "^1.1.0", 609 | "constants-browserify": "^1.0.0", 610 | "crypto-browserify": "^3.11.0", 611 | "domain-browser": "^1.1.1", 612 | "events": "^3.0.0", 613 | "https-browserify": "^1.0.0", 614 | "os-browserify": "^0.3.0", 615 | "path-browserify": "0.0.1", 616 | "process": "^0.11.10", 617 | "punycode": "^1.2.4", 618 | "querystring-es3": "^0.2.0", 619 | "readable-stream": "^2.3.3", 620 | "stream-browserify": "^2.0.1", 621 | "stream-http": "^2.7.2", 622 | "string_decoder": "^1.0.0", 623 | "timers-browserify": "^2.0.4", 624 | "tty-browserify": "0.0.0", 625 | "url": "^0.11.0", 626 | "util": "^0.11.0", 627 | "vm-browserify": "^1.0.1" 628 | } 629 | }, 630 | "object-assign": { 631 | "version": "4.1.1", 632 | "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", 633 | "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", 634 | "dev": true 635 | }, 636 | "once": { 637 | "version": "1.4.0", 638 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 639 | "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", 640 | "requires": { 641 | "wrappy": "1" 642 | } 643 | }, 644 | "os-browserify": { 645 | "version": "0.3.0", 646 | "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz", 647 | "integrity": "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=", 648 | "dev": true 649 | }, 650 | "pako": { 651 | "version": "1.0.10", 652 | "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.10.tgz", 653 | "integrity": "sha512-0DTvPVU3ed8+HNXOu5Bs+o//Mbdj9VNQMUOe9oKCwh8l0GNwpTDMKCWbRjgtD291AWnkAgkqA/LOnQS8AmS1tw==", 654 | "dev": true 655 | }, 656 | "parse-asn1": { 657 | "version": "5.1.4", 658 | "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.4.tgz", 659 | "integrity": "sha512-Qs5duJcuvNExRfFZ99HDD3z4mAi3r9Wl/FOjEOijlxwCZs7E7mW2vjTpgQ4J8LpTF8x5v+1Vn5UQFejmWT11aw==", 660 | "dev": true, 661 | "requires": { 662 | "asn1.js": "^4.0.0", 663 | "browserify-aes": "^1.0.0", 664 | "create-hash": "^1.1.0", 665 | "evp_bytestokey": "^1.0.0", 666 | "pbkdf2": "^3.0.3", 667 | "safe-buffer": "^5.1.1" 668 | } 669 | }, 670 | "path-browserify": { 671 | "version": "0.0.1", 672 | "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.1.tgz", 673 | "integrity": "sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ==", 674 | "dev": true 675 | }, 676 | "path-is-absolute": { 677 | "version": "1.0.1", 678 | "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", 679 | "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" 680 | }, 681 | "path-parse": { 682 | "version": "1.0.6", 683 | "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", 684 | "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==" 685 | }, 686 | "pbkdf2": { 687 | "version": "3.0.17", 688 | "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.0.17.tgz", 689 | "integrity": "sha512-U/il5MsrZp7mGg3mSQfn742na2T+1/vHDCG5/iTI3X9MKUuYUZVLQhyRsg06mCgDBTd57TxzgZt7P+fYfjRLtA==", 690 | "dev": true, 691 | "requires": { 692 | "create-hash": "^1.1.2", 693 | "create-hmac": "^1.1.4", 694 | "ripemd160": "^2.0.1", 695 | "safe-buffer": "^5.0.1", 696 | "sha.js": "^2.4.8" 697 | } 698 | }, 699 | "process": { 700 | "version": "0.11.10", 701 | "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", 702 | "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=", 703 | "dev": true 704 | }, 705 | "process-nextick-args": { 706 | "version": "2.0.1", 707 | "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", 708 | "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", 709 | "dev": true 710 | }, 711 | "public-encrypt": { 712 | "version": "4.0.3", 713 | "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz", 714 | "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==", 715 | "dev": true, 716 | "requires": { 717 | "bn.js": "^4.1.0", 718 | "browserify-rsa": "^4.0.0", 719 | "create-hash": "^1.1.0", 720 | "parse-asn1": "^5.0.0", 721 | "randombytes": "^2.0.1", 722 | "safe-buffer": "^5.1.2" 723 | } 724 | }, 725 | "punycode": { 726 | "version": "1.4.1", 727 | "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", 728 | "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", 729 | "dev": true 730 | }, 731 | "querystring": { 732 | "version": "0.2.0", 733 | "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", 734 | "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=", 735 | "dev": true 736 | }, 737 | "querystring-es3": { 738 | "version": "0.2.1", 739 | "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz", 740 | "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=", 741 | "dev": true 742 | }, 743 | "randombytes": { 744 | "version": "2.1.0", 745 | "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", 746 | "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", 747 | "dev": true, 748 | "requires": { 749 | "safe-buffer": "^5.1.0" 750 | } 751 | }, 752 | "randomfill": { 753 | "version": "1.0.4", 754 | "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz", 755 | "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==", 756 | "dev": true, 757 | "requires": { 758 | "randombytes": "^2.0.5", 759 | "safe-buffer": "^5.1.0" 760 | } 761 | }, 762 | "readable-stream": { 763 | "version": "2.3.6", 764 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", 765 | "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", 766 | "dev": true, 767 | "requires": { 768 | "core-util-is": "~1.0.0", 769 | "inherits": "~2.0.3", 770 | "isarray": "~1.0.0", 771 | "process-nextick-args": "~2.0.0", 772 | "safe-buffer": "~5.1.1", 773 | "string_decoder": "~1.1.1", 774 | "util-deprecate": "~1.0.1" 775 | }, 776 | "dependencies": { 777 | "safe-buffer": { 778 | "version": "5.1.2", 779 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", 780 | "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", 781 | "dev": true 782 | }, 783 | "string_decoder": { 784 | "version": "1.1.1", 785 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", 786 | "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", 787 | "dev": true, 788 | "requires": { 789 | "safe-buffer": "~5.1.0" 790 | } 791 | } 792 | } 793 | }, 794 | "readline-sync": { 795 | "version": "1.4.10", 796 | "resolved": "https://registry.npmjs.org/readline-sync/-/readline-sync-1.4.10.tgz", 797 | "integrity": "sha512-gNva8/6UAe8QYepIQH/jQ2qn91Qj0B9sYjMBBs3QOB8F2CXcKgLxQaJRP76sWVRQt+QU+8fAkCbCvjjMFu7Ycw==", 798 | "dev": true 799 | }, 800 | "rechoir": { 801 | "version": "0.6.2", 802 | "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", 803 | "integrity": "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=", 804 | "requires": { 805 | "resolve": "^1.1.6" 806 | } 807 | }, 808 | "reduce-flatten": { 809 | "version": "2.0.0", 810 | "resolved": "https://registry.npmjs.org/reduce-flatten/-/reduce-flatten-2.0.0.tgz", 811 | "integrity": "sha512-EJ4UNY/U1t2P/2k6oqotuX2Cc3T6nxJwsM0N0asT7dhrtH1ltUxDn4NalSYmPE2rCkVpcf/X6R0wDwcFpzhd4w==", 812 | "dev": true 813 | }, 814 | "resolve": { 815 | "version": "1.12.0", 816 | "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.12.0.tgz", 817 | "integrity": "sha512-B/dOmuoAik5bKcD6s6nXDCjzUKnaDvdkRyAk6rsmsKLipWj4797iothd7jmmUhWTfinVMU+wc56rYKsit2Qy4w==", 818 | "requires": { 819 | "path-parse": "^1.0.6" 820 | } 821 | }, 822 | "ripemd160": { 823 | "version": "2.0.2", 824 | "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", 825 | "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", 826 | "dev": true, 827 | "requires": { 828 | "hash-base": "^3.0.0", 829 | "inherits": "^2.0.1" 830 | } 831 | }, 832 | "safe-buffer": { 833 | "version": "5.2.0", 834 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.0.tgz", 835 | "integrity": "sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg==", 836 | "dev": true 837 | }, 838 | "setimmediate": { 839 | "version": "1.0.5", 840 | "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", 841 | "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=", 842 | "dev": true 843 | }, 844 | "sha.js": { 845 | "version": "2.4.11", 846 | "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", 847 | "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", 848 | "dev": true, 849 | "requires": { 850 | "inherits": "^2.0.1", 851 | "safe-buffer": "^5.0.1" 852 | } 853 | }, 854 | "shadow-cljs": { 855 | "version": "2.8.51", 856 | "resolved": "https://registry.npmjs.org/shadow-cljs/-/shadow-cljs-2.8.51.tgz", 857 | "integrity": "sha512-drCXFin3Zb4Sghv2uzW08J8K/1egmw0EW54z7DNkptStVU4NKdmo2kGMaAq0q/XyIzX1A0iJXFgsfOhrhGAmqg==", 858 | "dev": true, 859 | "requires": { 860 | "mkdirp": "^0.5.1", 861 | "node-libs-browser": "^2.0.0", 862 | "readline-sync": "^1.4.7", 863 | "shadow-cljs-jar": "1.3.1", 864 | "source-map-support": "^0.4.15", 865 | "which": "^1.3.1", 866 | "ws": "^3.0.0" 867 | } 868 | }, 869 | "shadow-cljs-jar": { 870 | "version": "1.3.1", 871 | "resolved": "https://registry.npmjs.org/shadow-cljs-jar/-/shadow-cljs-jar-1.3.1.tgz", 872 | "integrity": "sha512-IJSm4Gfu/wWDsOQ0wNrSxuaGdjzsd78us+3bop3cpWsoO2Igdu6VIBItYrZHRRBKl5LIZKXfnSh/2eWG3C1EFw==", 873 | "dev": true 874 | }, 875 | "shelljs": { 876 | "version": "0.8.3", 877 | "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.3.tgz", 878 | "integrity": "sha512-fc0BKlAWiLpwZljmOvAOTE/gXawtCoNrP5oaY7KIaQbbyHeQVg01pSEuEGvGh3HEdBU4baCD7wQBwADmM/7f7A==", 879 | "requires": { 880 | "glob": "^7.0.0", 881 | "interpret": "^1.0.0", 882 | "rechoir": "^0.6.2" 883 | } 884 | }, 885 | "shx": { 886 | "version": "0.3.2", 887 | "resolved": "https://registry.npmjs.org/shx/-/shx-0.3.2.tgz", 888 | "integrity": "sha512-aS0mWtW3T2sHAenrSrip2XGv39O9dXIFUqxAEWHEOS1ePtGIBavdPJY1kE2IHl14V/4iCbUiNDPGdyYTtmhSoA==", 889 | "dev": true, 890 | "requires": { 891 | "es6-object-assign": "^1.0.3", 892 | "minimist": "^1.2.0", 893 | "shelljs": "^0.8.1" 894 | }, 895 | "dependencies": { 896 | "minimist": { 897 | "version": "1.2.5", 898 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", 899 | "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", 900 | "dev": true 901 | } 902 | } 903 | }, 904 | "source-map": { 905 | "version": "0.5.7", 906 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", 907 | "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", 908 | "dev": true 909 | }, 910 | "source-map-support": { 911 | "version": "0.4.18", 912 | "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.4.18.tgz", 913 | "integrity": "sha512-try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA==", 914 | "dev": true, 915 | "requires": { 916 | "source-map": "^0.5.6" 917 | } 918 | }, 919 | "stream-browserify": { 920 | "version": "2.0.2", 921 | "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.2.tgz", 922 | "integrity": "sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg==", 923 | "dev": true, 924 | "requires": { 925 | "inherits": "~2.0.1", 926 | "readable-stream": "^2.0.2" 927 | } 928 | }, 929 | "stream-http": { 930 | "version": "2.8.3", 931 | "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.8.3.tgz", 932 | "integrity": "sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw==", 933 | "dev": true, 934 | "requires": { 935 | "builtin-status-codes": "^3.0.0", 936 | "inherits": "^2.0.1", 937 | "readable-stream": "^2.3.6", 938 | "to-arraybuffer": "^1.0.0", 939 | "xtend": "^4.0.0" 940 | } 941 | }, 942 | "string_decoder": { 943 | "version": "1.3.0", 944 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", 945 | "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", 946 | "dev": true, 947 | "requires": { 948 | "safe-buffer": "~5.2.0" 949 | } 950 | }, 951 | "supports-color": { 952 | "version": "5.5.0", 953 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", 954 | "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", 955 | "dev": true, 956 | "requires": { 957 | "has-flag": "^3.0.0" 958 | } 959 | }, 960 | "table-layout": { 961 | "version": "1.0.0", 962 | "resolved": "https://registry.npmjs.org/table-layout/-/table-layout-1.0.0.tgz", 963 | "integrity": "sha512-o8V8u943KXX9gLNK/Ss1n6Nn4YhpyY/RRnp3hKv/zTA+SXYiQnzJQlR8CZQf1RqYqgkiWMJ54Mv+Vq9Kfzxz1A==", 964 | "dev": true, 965 | "requires": { 966 | "array-back": "^3.1.0", 967 | "deep-extend": "~0.6.0", 968 | "typical": "^5.0.0", 969 | "wordwrapjs": "^4.0.0" 970 | }, 971 | "dependencies": { 972 | "typical": { 973 | "version": "5.1.0", 974 | "resolved": "https://registry.npmjs.org/typical/-/typical-5.1.0.tgz", 975 | "integrity": "sha512-t5Ik8UAwBal1P1XzuVE4dc+RYQZicLUGJdvqr/vdqsED7SQECgsGBylldSsfWZL7RQjxT3xhQcKHWhLaVSR6YQ==", 976 | "dev": true 977 | } 978 | } 979 | }, 980 | "timers-browserify": { 981 | "version": "2.0.11", 982 | "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.11.tgz", 983 | "integrity": "sha512-60aV6sgJ5YEbzUdn9c8kYGIqOubPoUdqQCul3SBAsRCZ40s6Y5cMcrW4dt3/k/EsbLVJNl9n6Vz3fTc+k2GeKQ==", 984 | "dev": true, 985 | "requires": { 986 | "setimmediate": "^1.0.4" 987 | } 988 | }, 989 | "to-arraybuffer": { 990 | "version": "1.0.1", 991 | "resolved": "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz", 992 | "integrity": "sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M=", 993 | "dev": true 994 | }, 995 | "tty-browserify": { 996 | "version": "0.0.0", 997 | "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz", 998 | "integrity": "sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=", 999 | "dev": true 1000 | }, 1001 | "typical": { 1002 | "version": "4.0.0", 1003 | "resolved": "https://registry.npmjs.org/typical/-/typical-4.0.0.tgz", 1004 | "integrity": "sha512-VAH4IvQ7BDFYglMd7BPRDfLgxZZX4O4TFcRDA6EN5X7erNJJq+McIEp8np9aVtxrCJ6qx4GTYVfOWNjcqwZgRw==", 1005 | "dev": true 1006 | }, 1007 | "ultron": { 1008 | "version": "1.1.1", 1009 | "resolved": "https://registry.npmjs.org/ultron/-/ultron-1.1.1.tgz", 1010 | "integrity": "sha512-UIEXBNeYmKptWH6z8ZnqTeS8fV74zG0/eRU9VGkpzz+LIJNs8W/zM/L+7ctCkRrgbNnnR0xxw4bKOr0cW0N0Og==", 1011 | "dev": true 1012 | }, 1013 | "url": { 1014 | "version": "0.11.0", 1015 | "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", 1016 | "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=", 1017 | "dev": true, 1018 | "requires": { 1019 | "punycode": "1.3.2", 1020 | "querystring": "0.2.0" 1021 | }, 1022 | "dependencies": { 1023 | "punycode": { 1024 | "version": "1.3.2", 1025 | "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", 1026 | "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=", 1027 | "dev": true 1028 | } 1029 | } 1030 | }, 1031 | "util": { 1032 | "version": "0.11.1", 1033 | "resolved": "https://registry.npmjs.org/util/-/util-0.11.1.tgz", 1034 | "integrity": "sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ==", 1035 | "dev": true, 1036 | "requires": { 1037 | "inherits": "2.0.3" 1038 | }, 1039 | "dependencies": { 1040 | "inherits": { 1041 | "version": "2.0.3", 1042 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", 1043 | "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", 1044 | "dev": true 1045 | } 1046 | } 1047 | }, 1048 | "util-deprecate": { 1049 | "version": "1.0.2", 1050 | "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", 1051 | "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", 1052 | "dev": true 1053 | }, 1054 | "vm-browserify": { 1055 | "version": "1.1.0", 1056 | "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.0.tgz", 1057 | "integrity": "sha512-iq+S7vZJE60yejDYM0ek6zg308+UZsdtPExWP9VZoCFCz1zkJoXFnAX7aZfd/ZwrkidzdUZL0C/ryW+JwAiIGw==", 1058 | "dev": true 1059 | }, 1060 | "which": { 1061 | "version": "1.3.1", 1062 | "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", 1063 | "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", 1064 | "dev": true, 1065 | "requires": { 1066 | "isexe": "^2.0.0" 1067 | } 1068 | }, 1069 | "wordwrapjs": { 1070 | "version": "4.0.0", 1071 | "resolved": "https://registry.npmjs.org/wordwrapjs/-/wordwrapjs-4.0.0.tgz", 1072 | "integrity": "sha512-Svqw723a3R34KvsMgpjFBYCgNOSdcW3mQFK4wIfhGQhtaFVOJmdYoXgi63ne3dTlWgatVcUc7t4HtQ/+bUVIzQ==", 1073 | "dev": true, 1074 | "requires": { 1075 | "reduce-flatten": "^2.0.0", 1076 | "typical": "^5.0.0" 1077 | }, 1078 | "dependencies": { 1079 | "typical": { 1080 | "version": "5.1.0", 1081 | "resolved": "https://registry.npmjs.org/typical/-/typical-5.1.0.tgz", 1082 | "integrity": "sha512-t5Ik8UAwBal1P1XzuVE4dc+RYQZicLUGJdvqr/vdqsED7SQECgsGBylldSsfWZL7RQjxT3xhQcKHWhLaVSR6YQ==", 1083 | "dev": true 1084 | } 1085 | } 1086 | }, 1087 | "wrappy": { 1088 | "version": "1.0.2", 1089 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 1090 | "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" 1091 | }, 1092 | "ws": { 1093 | "version": "3.3.3", 1094 | "resolved": "https://registry.npmjs.org/ws/-/ws-3.3.3.tgz", 1095 | "integrity": "sha512-nnWLa/NwZSt4KQJu51MYlCcSQ5g7INpOrOMt4XV8j4dqTXdmlUmSHQ8/oLC069ckre0fRsgfvsKwbTdtKLCDkA==", 1096 | "dev": true, 1097 | "requires": { 1098 | "async-limiter": "~1.0.0", 1099 | "safe-buffer": "~5.1.0", 1100 | "ultron": "~1.1.0" 1101 | }, 1102 | "dependencies": { 1103 | "safe-buffer": { 1104 | "version": "5.1.2", 1105 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", 1106 | "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", 1107 | "dev": true 1108 | } 1109 | } 1110 | }, 1111 | "xtend": { 1112 | "version": "4.0.2", 1113 | "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", 1114 | "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", 1115 | "dev": true 1116 | } 1117 | } 1118 | } 1119 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "create-shadow-cljs-app", 3 | "version": "1.1.4", 4 | "description": "Easy creation of ClojureScript applications using Shadow-CLJS", 5 | "bin": { 6 | "create-shadow-cljs-app": "dist/index.js" 7 | }, 8 | "main": "dist/index.js", 9 | "files": [ 10 | "dist/" 11 | ], 12 | "scripts": { 13 | "clean": "shx rm -rf dist", 14 | "watch": "shadow-cljs watch app", 15 | "release": "shadow-cljs release app", 16 | "postrelease": "shx cp -rf templates dist/", 17 | "prepack": "npm run clean && npm run release" 18 | }, 19 | "keywords": [ 20 | "shadow-cljs", 21 | "clojurescript", 22 | "cljs", 23 | "node-script", 24 | "browser", 25 | "commonjs", 26 | "clojure" 27 | ], 28 | "author": "lambrospetrou", 29 | "devDependencies": { 30 | "shadow-cljs": "^2.8.51", 31 | "shx": "^0.3.2", 32 | "colors": "^1.3.3", 33 | "command-line-args": "^5.1.1", 34 | "command-line-usage": "^6.0.2" 35 | }, 36 | "dependencies": { 37 | "shelljs": "^0.8.3" 38 | }, 39 | "license": "MIT", 40 | "engines": { 41 | "node": ">=8" 42 | }, 43 | "homepage": "https://github.com/lambrospetrou/create-shadow-cljs-app", 44 | "bugs": "https://github.com/lambrospetrou/create-shadow-cljs-app/issues", 45 | "repository": { 46 | "type": "git", 47 | "url": "git+https://github.com/lambrospetrou/create-shadow-cljs-app.git" 48 | } 49 | } 50 | -------------------------------------------------------------------------------- /shadow-cljs.edn: -------------------------------------------------------------------------------- 1 | {:source-paths ["src"] 2 | :dependencies [] 3 | :builds 4 | ; https://shadow-cljs.github.io/docs/UsersGuide.html#target-node-script 5 | {:app {:target :node-script 6 | :output-to "dist/index.js" 7 | :main cscljs.main/-main 8 | 9 | :js-options {:js-provider :shadow 10 | :keep-native-requires true 11 | ; `shelljs` uses dynamic `requires` which breaks Shadow-CLJS bundling. 12 | ; We exclude it here from any Closure processing and will just leave it 13 | ; as a normal `require` from `node_modules`. Therefore, we still need to 14 | ; have it as a non-dev dependency. 15 | ; - https://github.com/thheller/shadow-cljs/issues/290#issuecomment-524626179 16 | ; - https://github.com/shelljs/shelljs/issues/962 17 | :keep-as-require #{"shelljs"} 18 | :output-feature-set :es6 19 | :closure-output-charset "ascii"} 20 | 21 | ; :release {:compiler-options { 22 | ; ;:optimizations :simple 23 | ; :variable-renaming :off 24 | ; :property-renaming :off 25 | ; :pretty-print true 26 | ; ;:source-map true 27 | ; }} 28 | 29 | :devtools {:after-load cscljs.main/-main} 30 | }}} 31 | -------------------------------------------------------------------------------- /src/cscljs/main.cljs: -------------------------------------------------------------------------------- 1 | (ns cscljs.main 2 | (:require 3 | [clojure.string :as str] 4 | ["colors" :as colors] 5 | ["path" :as path] 6 | ["command-line-args" :as cla] 7 | ["command-line-usage" :as clu] 8 | ["shelljs" :as sh])) 9 | 10 | (defn read-args [^js cla ^js clu ^js sh] 11 | (let [ 12 | optionDefs 13 | [ 14 | { 15 | :name "name" 16 | :alias "n" 17 | :description "The name of the project" 18 | :defaultOption true 19 | :defaultValue nil 20 | :type js/String 21 | }, 22 | { 23 | :name "description" 24 | :alias "d" 25 | :description "The description of the project" 26 | :defaultValue nil 27 | :type js/String 28 | }, 29 | { 30 | :name "no-install" 31 | :description "Skip `npm install` on the newly created project" 32 | :defaultValue false 33 | :type js/Boolean 34 | } 35 | { 36 | :name "help" 37 | :alias "h" 38 | :description "Show usage" 39 | :defaultValue false 40 | :type js/Boolean 41 | } 42 | ] 43 | options 44 | (js->clj (cla (clj->js optionDefs) (clj->js {:partial true})) :keywordize-keys true)] 45 | (if (:help options) 46 | (do 47 | (println 48 | (clu (clj->js [ 49 | {:header "Typical Example", 50 | :content "npx create-shadow-cljs-app "} 51 | {:header "Available options" 52 | :optionList optionDefs} 53 | {:content "Project home: {underline https://github.com/lambrospetrou/create-shadow-cljs-app}"} 54 | ]))) 55 | (js/process.exit 0)) 56 | options))) 57 | 58 | (defn make-ctx [args ^js sh] 59 | { 60 | :name (:name args) 61 | :description (:description args) 62 | 63 | :args args 64 | :cwd (.. sh pwd toString) 65 | :templatesPath (.join path js/__dirname "templates") 66 | :projectPath (.join path (.. sh pwd toString) (get args :name "")) 67 | 68 | :sh sh 69 | }) 70 | 71 | (defn initProjectDir [{:keys [^js sh name]}] 72 | (when (str/blank? name) 73 | (.echo sh (.bgRed colors (.white colors "The project name cannot be empty. Provide one using the -n/--name options."))) 74 | (js/process.exit 1)) 75 | 76 | (when (some #(= name %) (js->clj (.ls sh "."))) 77 | (.echo sh (.bgRed colors (.white colors (str "The given directory '" name "' already exists, please choose a different one.")))) 78 | (js/process.exit 1)) 79 | 80 | (.mkdir sh "-p" name)) 81 | 82 | (defn copyTemplates [{:keys [^js sh templatesPath projectPath]}] 83 | (.echo sh (.bold colors "\t:: Copying project files...")) 84 | (.cp sh "-rf" (.join path templatesPath "*") projectPath) 85 | (.. 86 | sh 87 | (ShellString. (str/join "\n" [ 88 | "build/" 89 | "node_modules/" 90 | "target/" 91 | ".shadow-cljs/" 92 | ".nrepl-port" 93 | ])) 94 | (to (.join path projectPath ".gitignore")))) 95 | 96 | (defn updatePackageJson [{:keys [^js sh name description projectPath]}] 97 | (.echo sh (.bold colors "\t:: Updating `package.json`...")) 98 | (let [projectPkgJson (.join path projectPath "package.json") 99 | original (js->clj (js/JSON.parse (.. sh (cat projectPkgJson) (toString)))) 100 | updated (-> 101 | original 102 | (assoc "name" name) 103 | (assoc "description" 104 | (or description (get original "description"))))] 105 | (.. sh (ShellString. (js/JSON.stringify (clj->js updated) nil 2)) (to projectPkgJson)))) 106 | 107 | (defn installDependencies [{:keys [^js sh args cwd projectPath]}] 108 | (when (not (:no-install args)) 109 | (.echo sh (.bold colors "\t:: Installing NPM dependencies...")) 110 | (.cd sh projectPath) 111 | (.exec sh "npm install") 112 | (.cd sh cwd))) 113 | 114 | (defn initGitRepository [{:keys [^js sh cwd projectPath]}] 115 | (when (.which sh "git") 116 | (.echo sh (.bold colors "\t:: Initializing .git...")) 117 | (.cd sh projectPath) 118 | (.exec sh "git init .") 119 | (.exec sh "git add --all .") 120 | (.exec sh "git commit -m 'Initial commit'") 121 | (.cd sh cwd))) 122 | 123 | (defn -main [] 124 | (let [args (read-args cla clu sh) 125 | ctx (make-ctx args sh)] 126 | (set! (-> sh (.-config) (.-silent)) true) 127 | (set! (-> sh (.-config) (.-fatal)) true) 128 | 129 | (.echo sh (.bold colors (.green colors ":: Running the `create-shadow-cljs-app` initializer"))) 130 | (initProjectDir ctx) 131 | (copyTemplates ctx) 132 | (updatePackageJson ctx) 133 | (installDependencies ctx) 134 | (initGitRepository ctx) 135 | (.echo sh (.bold colors (.green colors (str ":: Successfully created '" (:name ctx) "'!")))))) 136 | -------------------------------------------------------------------------------- /templates/README.md: -------------------------------------------------------------------------------- 1 | Node.js example with ClojureScript with [shadow-cljs](https://github.com/thheller/shadow-cljs) 2 | ---- 3 | 4 | - [Shadow-cljs](http://shadow-cljs.org/) 5 | - [Integrate with NPM modules](https://shadow-cljs.github.io/docs/UsersGuide.html#npm) 6 | - [ClojureScript cheatsheet](https://cljs.info/cheatsheet/) 7 | 8 | ### Develop 9 | 10 | Install all dependencies. 11 | 12 | ```bash 13 | npm run install 14 | ``` 15 | 16 | Watch compile with with hot reloading, using the `browser` target as example. 17 | 18 | ``` 19 | npm run watch:browser 20 | ``` 21 | 22 | The above command will also start a server at port `5000` so that you can open `http://localhost:5000` and load the website. 23 | 24 | ### Production release 25 | 26 | Build production builds for each target. 27 | 28 | ```bash 29 | # Build all targets 30 | npm run release 31 | # or 32 | npm run release:app 33 | npm run release:library 34 | npm run release:browser 35 | ``` 36 | 37 | #### Browser 38 | 39 | ```bash 40 | # Build the JS bundle 41 | npm run release:browser 42 | 43 | # Serve the demo at http://localhost:5000 44 | npm run start:browser 45 | ``` 46 | 47 | This will generate a file inside `build/browser/browser-main.js`, and use it from the generated `build/browser/index.html` which loads the script. 48 | 49 | The `browser-main.js` file contains your JavaScript logic, so copy that into your server and load it into your main website HTML. See the provided `src/_build_hooks/index.html` as an example. 50 | 51 | - [Browser target](https://shadow-cljs.github.io/docs/UsersGuide.html#target-browser) 52 | 53 | #### Node application 54 | 55 | ``` 56 | npm run release:app 57 | ``` 58 | 59 | Compiles the Node app, `:app` target, to `build/node-app.js`. 60 | 61 | You can run your app/script by running `node build/node-app.js`. 62 | 63 | - [Node application target](https://shadow-cljs.github.io/docs/UsersGuide.html#target-node-script) 64 | 65 | #### Library 66 | 67 | Apart from the main Node script/app generated, we can also generate a library in the standard `commonjs` format that can be used in other Node/JavaScript projects, or as a handler in AWS Lambda. 68 | 69 | ``` 70 | npm run release:library 71 | ``` 72 | 73 | You can test the library generated by running the default AWS Lambda handler provided: 74 | 75 | ``` 76 | node -e 'require("./build/lib.js").handler({"a": 10}, null, (_, result) => console.log(JSON.stringify(result)))' 77 | ``` 78 | 79 | - [Node library target](https://shadow-cljs.github.io/docs/UsersGuide.html#target-node-library) 80 | - [Multiple named exports](https://shadow-cljs.github.io/docs/UsersGuide.html#_multiple_static_named_exports) 81 | 82 | ### REPL 83 | 84 | Start a REPL connected to current running program, `app` for the `:build-id`: 85 | 86 | ```bash 87 | npx shadow-cljs cljs-repl app 88 | ``` 89 | 90 | ### License 91 | 92 | MIT 93 | -------------------------------------------------------------------------------- /templates/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "create-shadow-cljs", 3 | "version": "0.0.1", 4 | "description": "ClojureScript project setup with Shadow-CLJS", 5 | "scripts": { 6 | "release": "run-s release:*", 7 | "release:app": "shadow-cljs release app", 8 | "watch:app": "shadow-cljs watch app", 9 | "release:library": "shadow-cljs release library", 10 | "watch:library": "shadow-cljs watch library", 11 | "release:browser": "shadow-cljs release browser", 12 | "watch:browser": "shadow-cljs watch browser", 13 | "start:browser": "serve -s build/browser" 14 | }, 15 | "keywords": [], 16 | "devDependencies": { 17 | "npm-run-all": "^4.1.5", 18 | "serve": "^11.1.0", 19 | "shadow-cljs": "^2.8.39" 20 | }, 21 | "license": "MIT" 22 | } 23 | -------------------------------------------------------------------------------- /templates/shadow-cljs.edn: -------------------------------------------------------------------------------- 1 | {:source-paths ["src"] 2 | :dependencies [] 3 | 4 | :dev-http {5000 "build/browser"} 5 | :nrepl {:port 8777} 6 | 7 | :builds 8 | ; https://shadow-cljs.github.io/docs/UsersGuide.html#target-node-script 9 | {:app {:target :node-script 10 | :output-to "build/node-app.js" 11 | :main server.main/-main 12 | :devtools {:after-load server.main/reload!}} 13 | ; https://shadow-cljs.github.io/docs/UsersGuide.html#target-node-library 14 | :library {:target :node-library 15 | :output-to "build/lib.js" 16 | :exports {:handler library.main/handler}} 17 | ; https://shadow-cljs.github.io/docs/UsersGuide.html#target-browser 18 | :browser {:target :browser 19 | :output-dir "build/browser" 20 | :asset-path "." 21 | :modules {:browser-main {:entries [browser.main] 22 | :init-fn browser.main/init}} 23 | :build-hooks [(_build_hooks.browser/copy-index)]}}} 24 | -------------------------------------------------------------------------------- /templates/src/_build_hooks/browser.clj: -------------------------------------------------------------------------------- 1 | (ns _build_hooks.browser 2 | (:require [clojure.java.shell :as sh])) 3 | 4 | (defn copy-index 5 | {:shadow.build/stage :flush} 6 | [state & args] 7 | (sh/sh "cp" "src/_build_hooks/index.html" "build/browser") 8 | state) 9 | -------------------------------------------------------------------------------- /templates/src/_build_hooks/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | ShadowCLJS 6 | 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /templates/src/browser/main.cljs: -------------------------------------------------------------------------------- 1 | (ns browser.main) 2 | 3 | ; The output will be loadable through the `