├── .circleci └── config.yml ├── .gitignore ├── 0-base ├── Dockerfile ├── Tiltfile ├── index.html ├── index.js ├── kubernetes.yaml ├── now.py ├── package.json ├── public │ └── pets.png └── yarn.lock ├── 1-measured ├── .dockerignore ├── Dockerfile ├── Tiltfile ├── index.js ├── kubernetes.yaml ├── now.py ├── package.json ├── public │ └── pets.png ├── views │ └── index.mustache └── yarn.lock ├── 101-debugger ├── .dockerignore ├── Dockerfile ├── Tiltfile ├── index.js ├── kubernetes.yaml ├── now.py ├── package.json ├── public │ └── pets.png ├── views │ └── index.mustache └── yarn.lock ├── 2-optimized-dockerfile ├── .dockerignore ├── Dockerfile ├── Tiltfile ├── index.js ├── kubernetes.yaml ├── now.py ├── package.json ├── public │ └── pets.png ├── views │ └── index.mustache └── yarn.lock ├── 3-recommended ├── .dockerignore ├── Dockerfile ├── Tiltfile ├── index.js ├── kubernetes.yaml ├── now.py ├── package.json ├── public │ └── pets.png ├── views │ └── index.mustache └── yarn.lock ├── LICENSE ├── NOTICE ├── README.md ├── test ├── test.ps1 └── test.sh └── tests-example ├── .dockerignore ├── Dockerfile ├── Tiltfile ├── Tiltfile.tests ├── foo.test.js ├── index.js ├── index.test.js ├── kubernetes.yaml ├── now.py ├── package.json ├── public └── pets.png ├── views └── index.mustache └── yarn.lock /.circleci/config.yml: -------------------------------------------------------------------------------- 1 | version: 2.1 2 | jobs: 3 | build: 4 | docker: 5 | - image: docker/tilt:latest 6 | 7 | steps: 8 | - checkout 9 | - setup_remote_docker 10 | - run: apt install -y python3 11 | - run: apt install -y npm 12 | - run: npm install -g yarn 13 | - run: ctlptl create cluster kind --registry=ctlptl-registry && test/test.sh 14 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | **/node_modules 2 | **/start-time.txt 3 | */.idea 4 | **/yarn-error.log 5 | 6 | **/tilt_modules 7 | -------------------------------------------------------------------------------- /0-base/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM node:20 2 | 3 | WORKDIR /app 4 | 5 | ADD . . 6 | 7 | RUN yarn install 8 | 9 | ENTRYPOINT [ "node", "/app/index.js" ] 10 | -------------------------------------------------------------------------------- /0-base/Tiltfile: -------------------------------------------------------------------------------- 1 | # -*- mode: Python -* 2 | 3 | k8s_yaml('kubernetes.yaml') 4 | k8s_resource('example-nodejs', port_forwards=8000, 5 | resource_deps=['deploy'] 6 | ) 7 | 8 | # Records the current time, then kicks off a server update. 9 | # Normally, you would let Tilt do deploys automatically, but this 10 | # shows you how to set up a custom workflow that measures it. 11 | local_resource( 12 | 'deploy', 13 | 'python3 now.py > start-time.txt', 14 | ) 15 | 16 | docker_build('example-nodejs-image', '.') 17 | -------------------------------------------------------------------------------- /0-base/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 |
5 | 6 |
Hello cats!
7 |
8 | 9 | 10 | -------------------------------------------------------------------------------- /0-base/index.js: -------------------------------------------------------------------------------- 1 | const express = require('express'); 2 | const app = express(); 3 | const path = require('path'); 4 | 5 | app.use(express.static('public')); 6 | 7 | app.get('/', (req, res) => { 8 | res.sendFile(path.join(__dirname + '/index.html')); 9 | }); 10 | 11 | app.listen(8000, () => { 12 | console.log('Server running at http://localhost:8000/'); 13 | }); 14 | -------------------------------------------------------------------------------- /0-base/kubernetes.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: apps/v1 2 | kind: Deployment 3 | metadata: 4 | name: example-nodejs 5 | labels: 6 | app: example-nodejs 7 | spec: 8 | selector: 9 | matchLabels: 10 | app: example-nodejs 11 | template: 12 | metadata: 13 | labels: 14 | app: example-nodejs 15 | spec: 16 | containers: 17 | - name: example-nodejs 18 | image: example-nodejs-image 19 | ports: 20 | - containerPort: 8000 21 | -------------------------------------------------------------------------------- /0-base/now.py: -------------------------------------------------------------------------------- 1 | import time 2 | 3 | print("%d" % (float(time.time()) * 1000 * 1000 * 1000)) -------------------------------------------------------------------------------- /0-base/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "tilt-example-nodejs", 3 | "version": "1.0.0", 4 | "main": "index.js", 5 | "license": "MIT", 6 | "dependencies": { 7 | "express": "^4.17.1", 8 | "immutable": "^3.8.2" 9 | }, 10 | "devDependencies": {} 11 | } 12 | -------------------------------------------------------------------------------- /0-base/public/pets.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tilt-dev/tilt-example-nodejs/d81e0ca6f7866cfddcea0094943abdb9fb16b5ee/0-base/public/pets.png -------------------------------------------------------------------------------- /0-base/yarn.lock: -------------------------------------------------------------------------------- 1 | # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. 2 | # yarn lockfile v1 3 | 4 | 5 | accepts@~1.3.7: 6 | version "1.3.7" 7 | resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.7.tgz#531bc726517a3b2b41f850021c6cc15eaab507cd" 8 | integrity sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA== 9 | dependencies: 10 | mime-types "~2.1.24" 11 | negotiator "0.6.2" 12 | 13 | array-flatten@1.1.1: 14 | version "1.1.1" 15 | resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2" 16 | integrity sha1-ml9pkFGx5wczKPKgCJaLZOopVdI= 17 | 18 | body-parser@1.19.0: 19 | version "1.19.0" 20 | resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.19.0.tgz#96b2709e57c9c4e09a6fd66a8fd979844f69f08a" 21 | integrity sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw== 22 | dependencies: 23 | bytes "3.1.0" 24 | content-type "~1.0.4" 25 | debug "2.6.9" 26 | depd "~1.1.2" 27 | http-errors "1.7.2" 28 | iconv-lite "0.4.24" 29 | on-finished "~2.3.0" 30 | qs "6.7.0" 31 | raw-body "2.4.0" 32 | type-is "~1.6.17" 33 | 34 | bytes@3.1.0: 35 | version "3.1.0" 36 | resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.0.tgz#f6cf7933a360e0588fa9fde85651cdc7f805d1f6" 37 | integrity sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg== 38 | 39 | content-disposition@0.5.3: 40 | version "0.5.3" 41 | resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.3.tgz#e130caf7e7279087c5616c2007d0485698984fbd" 42 | integrity sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g== 43 | dependencies: 44 | safe-buffer "5.1.2" 45 | 46 | content-type@~1.0.4: 47 | version "1.0.4" 48 | resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.4.tgz#e138cc75e040c727b1966fe5e5f8c9aee256fe3b" 49 | integrity sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA== 50 | 51 | cookie-signature@1.0.6: 52 | version "1.0.6" 53 | resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c" 54 | integrity sha1-4wOogrNCzD7oylE6eZmXNNqzriw= 55 | 56 | cookie@0.4.0: 57 | version "0.4.0" 58 | resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.4.0.tgz#beb437e7022b3b6d49019d088665303ebe9c14ba" 59 | integrity sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg== 60 | 61 | debug@2.6.9: 62 | version "2.6.9" 63 | resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" 64 | integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== 65 | dependencies: 66 | ms "2.0.0" 67 | 68 | depd@~1.1.2: 69 | version "1.1.2" 70 | resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9" 71 | integrity sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak= 72 | 73 | destroy@~1.0.4: 74 | version "1.0.4" 75 | resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.0.4.tgz#978857442c44749e4206613e37946205826abd80" 76 | integrity sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA= 77 | 78 | ee-first@1.1.1: 79 | version "1.1.1" 80 | resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" 81 | integrity sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0= 82 | 83 | encodeurl@~1.0.2: 84 | version "1.0.2" 85 | resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" 86 | integrity sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k= 87 | 88 | escape-html@~1.0.3: 89 | version "1.0.3" 90 | resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" 91 | integrity sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg= 92 | 93 | etag@~1.8.1: 94 | version "1.8.1" 95 | resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" 96 | integrity sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc= 97 | 98 | express@^4.17.1: 99 | version "4.17.1" 100 | resolved "https://registry.yarnpkg.com/express/-/express-4.17.1.tgz#4491fc38605cf51f8629d39c2b5d026f98a4c134" 101 | integrity sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g== 102 | dependencies: 103 | accepts "~1.3.7" 104 | array-flatten "1.1.1" 105 | body-parser "1.19.0" 106 | content-disposition "0.5.3" 107 | content-type "~1.0.4" 108 | cookie "0.4.0" 109 | cookie-signature "1.0.6" 110 | debug "2.6.9" 111 | depd "~1.1.2" 112 | encodeurl "~1.0.2" 113 | escape-html "~1.0.3" 114 | etag "~1.8.1" 115 | finalhandler "~1.1.2" 116 | fresh "0.5.2" 117 | merge-descriptors "1.0.1" 118 | methods "~1.1.2" 119 | on-finished "~2.3.0" 120 | parseurl "~1.3.3" 121 | path-to-regexp "0.1.7" 122 | proxy-addr "~2.0.5" 123 | qs "6.7.0" 124 | range-parser "~1.2.1" 125 | safe-buffer "5.1.2" 126 | send "0.17.1" 127 | serve-static "1.14.1" 128 | setprototypeof "1.1.1" 129 | statuses "~1.5.0" 130 | type-is "~1.6.18" 131 | utils-merge "1.0.1" 132 | vary "~1.1.2" 133 | 134 | finalhandler@~1.1.2: 135 | version "1.1.2" 136 | resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.1.2.tgz#b7e7d000ffd11938d0fdb053506f6ebabe9f587d" 137 | integrity sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA== 138 | dependencies: 139 | debug "2.6.9" 140 | encodeurl "~1.0.2" 141 | escape-html "~1.0.3" 142 | on-finished "~2.3.0" 143 | parseurl "~1.3.3" 144 | statuses "~1.5.0" 145 | unpipe "~1.0.0" 146 | 147 | forwarded@~0.1.2: 148 | version "0.1.2" 149 | resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.1.2.tgz#98c23dab1175657b8c0573e8ceccd91b0ff18c84" 150 | integrity sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ= 151 | 152 | fresh@0.5.2: 153 | version "0.5.2" 154 | resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" 155 | integrity sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac= 156 | 157 | http-errors@1.7.2: 158 | version "1.7.2" 159 | resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.7.2.tgz#4f5029cf13239f31036e5b2e55292bcfbcc85c8f" 160 | integrity sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg== 161 | dependencies: 162 | depd "~1.1.2" 163 | inherits "2.0.3" 164 | setprototypeof "1.1.1" 165 | statuses ">= 1.5.0 < 2" 166 | toidentifier "1.0.0" 167 | 168 | http-errors@~1.7.2: 169 | version "1.7.3" 170 | resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.7.3.tgz#6c619e4f9c60308c38519498c14fbb10aacebb06" 171 | integrity sha512-ZTTX0MWrsQ2ZAhA1cejAwDLycFsd7I7nVtnkT3Ol0aqodaKW+0CTZDQ1uBv5whptCnc8e8HeRRJxRs0kmm/Qfw== 172 | dependencies: 173 | depd "~1.1.2" 174 | inherits "2.0.4" 175 | setprototypeof "1.1.1" 176 | statuses ">= 1.5.0 < 2" 177 | toidentifier "1.0.0" 178 | 179 | iconv-lite@0.4.24: 180 | version "0.4.24" 181 | resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" 182 | integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== 183 | dependencies: 184 | safer-buffer ">= 2.1.2 < 3" 185 | 186 | immutable@^3.8.2: 187 | version "3.8.2" 188 | resolved "https://registry.yarnpkg.com/immutable/-/immutable-3.8.2.tgz#c2439951455bb39913daf281376f1530e104adf3" 189 | integrity sha1-wkOZUUVbs5kT2vKBN28VMOEErfM= 190 | 191 | inherits@2.0.3: 192 | version "2.0.3" 193 | resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" 194 | integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4= 195 | 196 | inherits@2.0.4: 197 | version "2.0.4" 198 | resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" 199 | integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== 200 | 201 | ipaddr.js@1.9.1: 202 | version "1.9.1" 203 | resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.1.tgz#bff38543eeb8984825079ff3a2a8e6cbd46781b3" 204 | integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g== 205 | 206 | media-typer@0.3.0: 207 | version "0.3.0" 208 | resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" 209 | integrity sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g= 210 | 211 | merge-descriptors@1.0.1: 212 | version "1.0.1" 213 | resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61" 214 | integrity sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E= 215 | 216 | methods@~1.1.2: 217 | version "1.1.2" 218 | resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" 219 | integrity sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4= 220 | 221 | mime-db@1.43.0: 222 | version "1.43.0" 223 | resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.43.0.tgz#0a12e0502650e473d735535050e7c8f4eb4fae58" 224 | integrity sha512-+5dsGEEovYbT8UY9yD7eE4XTc4UwJ1jBYlgaQQF38ENsKR3wj/8q8RFZrF9WIZpB2V1ArTVFUva8sAul1NzRzQ== 225 | 226 | mime-types@~2.1.24: 227 | version "2.1.26" 228 | resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.26.tgz#9c921fc09b7e149a65dfdc0da4d20997200b0a06" 229 | integrity sha512-01paPWYgLrkqAyrlDorC1uDwl2p3qZT7yl806vW7DvDoxwXi46jsjFbg+WdwotBIk6/MbEhO/dh5aZ5sNj/dWQ== 230 | dependencies: 231 | mime-db "1.43.0" 232 | 233 | mime@1.6.0: 234 | version "1.6.0" 235 | resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" 236 | integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== 237 | 238 | ms@2.0.0: 239 | version "2.0.0" 240 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" 241 | integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g= 242 | 243 | ms@2.1.1: 244 | version "2.1.1" 245 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.1.tgz#30a5864eb3ebb0a66f2ebe6d727af06a09d86e0a" 246 | integrity sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg== 247 | 248 | negotiator@0.6.2: 249 | version "0.6.2" 250 | resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.2.tgz#feacf7ccf525a77ae9634436a64883ffeca346fb" 251 | integrity sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw== 252 | 253 | on-finished@~2.3.0: 254 | version "2.3.0" 255 | resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947" 256 | integrity sha1-IPEzZIGwg811M3mSoWlxqi2QaUc= 257 | dependencies: 258 | ee-first "1.1.1" 259 | 260 | parseurl@~1.3.3: 261 | version "1.3.3" 262 | resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4" 263 | integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ== 264 | 265 | path-to-regexp@0.1.7: 266 | version "0.1.7" 267 | resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c" 268 | integrity sha1-32BBeABfUi8V60SQ5yR6G/qmf4w= 269 | 270 | proxy-addr@~2.0.5: 271 | version "2.0.6" 272 | resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.6.tgz#fdc2336505447d3f2f2c638ed272caf614bbb2bf" 273 | integrity sha512-dh/frvCBVmSsDYzw6n926jv974gddhkFPfiN8hPOi30Wax25QZyZEGveluCgliBnqmuM+UJmBErbAUFIoDbjOw== 274 | dependencies: 275 | forwarded "~0.1.2" 276 | ipaddr.js "1.9.1" 277 | 278 | qs@6.7.0: 279 | version "6.7.0" 280 | resolved "https://registry.yarnpkg.com/qs/-/qs-6.7.0.tgz#41dc1a015e3d581f1621776be31afb2876a9b1bc" 281 | integrity sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ== 282 | 283 | range-parser@~1.2.1: 284 | version "1.2.1" 285 | resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031" 286 | integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== 287 | 288 | raw-body@2.4.0: 289 | version "2.4.0" 290 | resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.4.0.tgz#a1ce6fb9c9bc356ca52e89256ab59059e13d0332" 291 | integrity sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q== 292 | dependencies: 293 | bytes "3.1.0" 294 | http-errors "1.7.2" 295 | iconv-lite "0.4.24" 296 | unpipe "1.0.0" 297 | 298 | safe-buffer@5.1.2: 299 | version "5.1.2" 300 | resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" 301 | integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== 302 | 303 | "safer-buffer@>= 2.1.2 < 3": 304 | version "2.1.2" 305 | resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" 306 | integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== 307 | 308 | send@0.17.1: 309 | version "0.17.1" 310 | resolved "https://registry.yarnpkg.com/send/-/send-0.17.1.tgz#c1d8b059f7900f7466dd4938bdc44e11ddb376c8" 311 | integrity sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg== 312 | dependencies: 313 | debug "2.6.9" 314 | depd "~1.1.2" 315 | destroy "~1.0.4" 316 | encodeurl "~1.0.2" 317 | escape-html "~1.0.3" 318 | etag "~1.8.1" 319 | fresh "0.5.2" 320 | http-errors "~1.7.2" 321 | mime "1.6.0" 322 | ms "2.1.1" 323 | on-finished "~2.3.0" 324 | range-parser "~1.2.1" 325 | statuses "~1.5.0" 326 | 327 | serve-static@1.14.1: 328 | version "1.14.1" 329 | resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.14.1.tgz#666e636dc4f010f7ef29970a88a674320898b2f9" 330 | integrity sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg== 331 | dependencies: 332 | encodeurl "~1.0.2" 333 | escape-html "~1.0.3" 334 | parseurl "~1.3.3" 335 | send "0.17.1" 336 | 337 | setprototypeof@1.1.1: 338 | version "1.1.1" 339 | resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.1.tgz#7e95acb24aa92f5885e0abef5ba131330d4ae683" 340 | integrity sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw== 341 | 342 | "statuses@>= 1.5.0 < 2", statuses@~1.5.0: 343 | version "1.5.0" 344 | resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c" 345 | integrity sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow= 346 | 347 | toidentifier@1.0.0: 348 | version "1.0.0" 349 | resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.0.tgz#7e1be3470f1e77948bc43d94a3c8f4d7752ba553" 350 | integrity sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw== 351 | 352 | type-is@~1.6.17, type-is@~1.6.18: 353 | version "1.6.18" 354 | resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131" 355 | integrity sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g== 356 | dependencies: 357 | media-typer "0.3.0" 358 | mime-types "~2.1.24" 359 | 360 | unpipe@1.0.0, unpipe@~1.0.0: 361 | version "1.0.0" 362 | resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" 363 | integrity sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw= 364 | 365 | utils-merge@1.0.1: 366 | version "1.0.1" 367 | resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" 368 | integrity sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM= 369 | 370 | vary@~1.1.2: 371 | version "1.1.2" 372 | resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" 373 | integrity sha1-IpnwLG3tMNSllhsLn3RSShj2NPw= 374 | -------------------------------------------------------------------------------- /1-measured/.dockerignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | -------------------------------------------------------------------------------- /1-measured/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM node:20 2 | 3 | WORKDIR /app 4 | 5 | ADD . . 6 | 7 | RUN yarn install 8 | 9 | ENTRYPOINT [ "node", "/app/index.js" ] 10 | -------------------------------------------------------------------------------- /1-measured/Tiltfile: -------------------------------------------------------------------------------- 1 | # -*- mode: Python -* 2 | 3 | k8s_yaml('kubernetes.yaml') 4 | k8s_resource('example-nodejs', port_forwards=8000, 5 | resource_deps=['deploy'] 6 | ) 7 | 8 | # Records the current time, then kicks off a server update. 9 | # Normally, you would let Tilt do deploys automatically, but this 10 | # shows you how to set up a custom workflow that measures it. 11 | local_resource( 12 | 'deploy', 13 | 'python3 now.py > start-time.txt', 14 | ) 15 | 16 | docker_build('example-nodejs-image', '.') 17 | -------------------------------------------------------------------------------- /1-measured/index.js: -------------------------------------------------------------------------------- 1 | /* 2 | Gratefully adapted from https://github.com/HemingwayLee/sample-mustache-express 3 | */ 4 | const fs = require('fs'); 5 | 6 | const express = require('express'); 7 | const app = express(); 8 | const mustacheExpress = require('mustache-express'); 9 | 10 | let timeSince = 'N/A'; 11 | 12 | app.engine('mustache', mustacheExpress()); 13 | 14 | app.set('view engine', 'mustache'); 15 | app.set('views', __dirname + '/views'); 16 | app.use(express.static('public')); 17 | 18 | app.get('/', (req, res) => { 19 | res.render('index.mustache', { 20 | time: timeSince, 21 | }); 22 | }); 23 | 24 | app.listen(8000, () => { 25 | timeSince = getSecsSinceDeploy(); 26 | console.log('Server running at http://localhost:8000/'); 27 | }); 28 | 29 | function getSecsSinceDeploy() { 30 | let curTimeMs = new Date().getTime(); 31 | let contents = fs.readFileSync('/app/start-time.txt', 'utf8'); 32 | let startTimeMs = parseInt(contents.trim()) / 10**6; 33 | return ((curTimeMs - startTimeMs) / 10**3).toFixed(2) 34 | } 35 | -------------------------------------------------------------------------------- /1-measured/kubernetes.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: apps/v1 2 | kind: Deployment 3 | metadata: 4 | name: example-nodejs 5 | labels: 6 | app: example-nodejs 7 | spec: 8 | selector: 9 | matchLabels: 10 | app: example-nodejs 11 | template: 12 | metadata: 13 | labels: 14 | app: example-nodejs 15 | spec: 16 | containers: 17 | - name: example-nodejs 18 | image: example-nodejs-image 19 | ports: 20 | - containerPort: 8000 21 | -------------------------------------------------------------------------------- /1-measured/now.py: -------------------------------------------------------------------------------- 1 | import time 2 | 3 | print("%d" % (float(time.time()) * 1000 * 1000 * 1000)) -------------------------------------------------------------------------------- /1-measured/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "tilt-example-nodejs", 3 | "version": "1.0.0", 4 | "main": "index.js", 5 | "license": "MIT", 6 | "dependencies": { 7 | "express": "^4.17.1", 8 | "immutable": "^3.8.2", 9 | "mustache-express": "^1.3.0" 10 | }, 11 | "devDependencies": {} 12 | } 13 | -------------------------------------------------------------------------------- /1-measured/public/pets.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tilt-dev/tilt-example-nodejs/d81e0ca6f7866cfddcea0094943abdb9fb16b5ee/1-measured/public/pets.png -------------------------------------------------------------------------------- /1-measured/views/index.mustache: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 |
5 | 6 |
Hello cats!
7 |
Time from "deploy" button pressed → server up: {{time}}s
8 |
9 | 10 | 11 | -------------------------------------------------------------------------------- /1-measured/yarn.lock: -------------------------------------------------------------------------------- 1 | # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. 2 | # yarn lockfile v1 3 | 4 | 5 | accepts@~1.3.7: 6 | version "1.3.7" 7 | resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.7.tgz#531bc726517a3b2b41f850021c6cc15eaab507cd" 8 | integrity sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA== 9 | dependencies: 10 | mime-types "~2.1.24" 11 | negotiator "0.6.2" 12 | 13 | array-flatten@1.1.1: 14 | version "1.1.1" 15 | resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2" 16 | integrity sha1-ml9pkFGx5wczKPKgCJaLZOopVdI= 17 | 18 | async@~3.1.0: 19 | version "3.1.1" 20 | resolved "https://registry.yarnpkg.com/async/-/async-3.1.1.tgz#dd3542db03de837979c9ebbca64ca01b06dc98df" 21 | integrity sha512-X5Dj8hK1pJNC2Wzo2Rcp9FBVdJMGRR/S7V+lH46s8GVFhtbo5O4Le5GECCF/8PISVdkUA6mMPvgz7qTTD1rf1g== 22 | 23 | body-parser@1.19.0: 24 | version "1.19.0" 25 | resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.19.0.tgz#96b2709e57c9c4e09a6fd66a8fd979844f69f08a" 26 | integrity sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw== 27 | dependencies: 28 | bytes "3.1.0" 29 | content-type "~1.0.4" 30 | debug "2.6.9" 31 | depd "~1.1.2" 32 | http-errors "1.7.2" 33 | iconv-lite "0.4.24" 34 | on-finished "~2.3.0" 35 | qs "6.7.0" 36 | raw-body "2.4.0" 37 | type-is "~1.6.17" 38 | 39 | bytes@3.1.0: 40 | version "3.1.0" 41 | resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.0.tgz#f6cf7933a360e0588fa9fde85651cdc7f805d1f6" 42 | integrity sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg== 43 | 44 | content-disposition@0.5.3: 45 | version "0.5.3" 46 | resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.3.tgz#e130caf7e7279087c5616c2007d0485698984fbd" 47 | integrity sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g== 48 | dependencies: 49 | safe-buffer "5.1.2" 50 | 51 | content-type@~1.0.4: 52 | version "1.0.4" 53 | resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.4.tgz#e138cc75e040c727b1966fe5e5f8c9aee256fe3b" 54 | integrity sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA== 55 | 56 | cookie-signature@1.0.6: 57 | version "1.0.6" 58 | resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c" 59 | integrity sha1-4wOogrNCzD7oylE6eZmXNNqzriw= 60 | 61 | cookie@0.4.0: 62 | version "0.4.0" 63 | resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.4.0.tgz#beb437e7022b3b6d49019d088665303ebe9c14ba" 64 | integrity sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg== 65 | 66 | debug@2.6.9: 67 | version "2.6.9" 68 | resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" 69 | integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== 70 | dependencies: 71 | ms "2.0.0" 72 | 73 | depd@~1.1.2: 74 | version "1.1.2" 75 | resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9" 76 | integrity sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak= 77 | 78 | destroy@~1.0.4: 79 | version "1.0.4" 80 | resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.0.4.tgz#978857442c44749e4206613e37946205826abd80" 81 | integrity sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA= 82 | 83 | ee-first@1.1.1: 84 | version "1.1.1" 85 | resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" 86 | integrity sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0= 87 | 88 | encodeurl@~1.0.2: 89 | version "1.0.2" 90 | resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" 91 | integrity sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k= 92 | 93 | escape-html@~1.0.3: 94 | version "1.0.3" 95 | resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" 96 | integrity sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg= 97 | 98 | etag@~1.8.1: 99 | version "1.8.1" 100 | resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" 101 | integrity sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc= 102 | 103 | express@^4.17.1: 104 | version "4.17.1" 105 | resolved "https://registry.yarnpkg.com/express/-/express-4.17.1.tgz#4491fc38605cf51f8629d39c2b5d026f98a4c134" 106 | integrity sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g== 107 | dependencies: 108 | accepts "~1.3.7" 109 | array-flatten "1.1.1" 110 | body-parser "1.19.0" 111 | content-disposition "0.5.3" 112 | content-type "~1.0.4" 113 | cookie "0.4.0" 114 | cookie-signature "1.0.6" 115 | debug "2.6.9" 116 | depd "~1.1.2" 117 | encodeurl "~1.0.2" 118 | escape-html "~1.0.3" 119 | etag "~1.8.1" 120 | finalhandler "~1.1.2" 121 | fresh "0.5.2" 122 | merge-descriptors "1.0.1" 123 | methods "~1.1.2" 124 | on-finished "~2.3.0" 125 | parseurl "~1.3.3" 126 | path-to-regexp "0.1.7" 127 | proxy-addr "~2.0.5" 128 | qs "6.7.0" 129 | range-parser "~1.2.1" 130 | safe-buffer "5.1.2" 131 | send "0.17.1" 132 | serve-static "1.14.1" 133 | setprototypeof "1.1.1" 134 | statuses "~1.5.0" 135 | type-is "~1.6.18" 136 | utils-merge "1.0.1" 137 | vary "~1.1.2" 138 | 139 | finalhandler@~1.1.2: 140 | version "1.1.2" 141 | resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.1.2.tgz#b7e7d000ffd11938d0fdb053506f6ebabe9f587d" 142 | integrity sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA== 143 | dependencies: 144 | debug "2.6.9" 145 | encodeurl "~1.0.2" 146 | escape-html "~1.0.3" 147 | on-finished "~2.3.0" 148 | parseurl "~1.3.3" 149 | statuses "~1.5.0" 150 | unpipe "~1.0.0" 151 | 152 | forwarded@~0.1.2: 153 | version "0.1.2" 154 | resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.1.2.tgz#98c23dab1175657b8c0573e8ceccd91b0ff18c84" 155 | integrity sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ= 156 | 157 | fresh@0.5.2: 158 | version "0.5.2" 159 | resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" 160 | integrity sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac= 161 | 162 | http-errors@1.7.2: 163 | version "1.7.2" 164 | resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.7.2.tgz#4f5029cf13239f31036e5b2e55292bcfbcc85c8f" 165 | integrity sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg== 166 | dependencies: 167 | depd "~1.1.2" 168 | inherits "2.0.3" 169 | setprototypeof "1.1.1" 170 | statuses ">= 1.5.0 < 2" 171 | toidentifier "1.0.0" 172 | 173 | http-errors@~1.7.2: 174 | version "1.7.3" 175 | resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.7.3.tgz#6c619e4f9c60308c38519498c14fbb10aacebb06" 176 | integrity sha512-ZTTX0MWrsQ2ZAhA1cejAwDLycFsd7I7nVtnkT3Ol0aqodaKW+0CTZDQ1uBv5whptCnc8e8HeRRJxRs0kmm/Qfw== 177 | dependencies: 178 | depd "~1.1.2" 179 | inherits "2.0.4" 180 | setprototypeof "1.1.1" 181 | statuses ">= 1.5.0 < 2" 182 | toidentifier "1.0.0" 183 | 184 | iconv-lite@0.4.24: 185 | version "0.4.24" 186 | resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" 187 | integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== 188 | dependencies: 189 | safer-buffer ">= 2.1.2 < 3" 190 | 191 | immutable@^3.8.2: 192 | version "3.8.2" 193 | resolved "https://registry.yarnpkg.com/immutable/-/immutable-3.8.2.tgz#c2439951455bb39913daf281376f1530e104adf3" 194 | integrity sha1-wkOZUUVbs5kT2vKBN28VMOEErfM= 195 | 196 | inherits@2.0.3: 197 | version "2.0.3" 198 | resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" 199 | integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4= 200 | 201 | inherits@2.0.4: 202 | version "2.0.4" 203 | resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" 204 | integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== 205 | 206 | ipaddr.js@1.9.1: 207 | version "1.9.1" 208 | resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.1.tgz#bff38543eeb8984825079ff3a2a8e6cbd46781b3" 209 | integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g== 210 | 211 | lru-cache@~5.1.1: 212 | version "5.1.1" 213 | resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920" 214 | integrity sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w== 215 | dependencies: 216 | yallist "^3.0.2" 217 | 218 | media-typer@0.3.0: 219 | version "0.3.0" 220 | resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" 221 | integrity sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g= 222 | 223 | merge-descriptors@1.0.1: 224 | version "1.0.1" 225 | resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61" 226 | integrity sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E= 227 | 228 | methods@~1.1.2: 229 | version "1.1.2" 230 | resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" 231 | integrity sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4= 232 | 233 | mime-db@1.43.0: 234 | version "1.43.0" 235 | resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.43.0.tgz#0a12e0502650e473d735535050e7c8f4eb4fae58" 236 | integrity sha512-+5dsGEEovYbT8UY9yD7eE4XTc4UwJ1jBYlgaQQF38ENsKR3wj/8q8RFZrF9WIZpB2V1ArTVFUva8sAul1NzRzQ== 237 | 238 | mime-types@~2.1.24: 239 | version "2.1.26" 240 | resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.26.tgz#9c921fc09b7e149a65dfdc0da4d20997200b0a06" 241 | integrity sha512-01paPWYgLrkqAyrlDorC1uDwl2p3qZT7yl806vW7DvDoxwXi46jsjFbg+WdwotBIk6/MbEhO/dh5aZ5sNj/dWQ== 242 | dependencies: 243 | mime-db "1.43.0" 244 | 245 | mime@1.6.0: 246 | version "1.6.0" 247 | resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" 248 | integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== 249 | 250 | ms@2.0.0: 251 | version "2.0.0" 252 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" 253 | integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g= 254 | 255 | ms@2.1.1: 256 | version "2.1.1" 257 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.1.tgz#30a5864eb3ebb0a66f2ebe6d727af06a09d86e0a" 258 | integrity sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg== 259 | 260 | mustache-express@^1.3.0: 261 | version "1.3.0" 262 | resolved "https://registry.yarnpkg.com/mustache-express/-/mustache-express-1.3.0.tgz#91d67121e3553d42d6c995f4c32793db89492493" 263 | integrity sha512-JWG8Rzxh9tpoLEH0NZ2u/caDiwhIkW+50IOBrcO+lHya3tCYj41bYPDEHCxPbKXvPrSyMNpI6ly4xdU2zpNQtg== 264 | dependencies: 265 | async "~3.1.0" 266 | lru-cache "~5.1.1" 267 | mustache "^3.1.0" 268 | 269 | mustache@^3.1.0: 270 | version "3.2.1" 271 | resolved "https://registry.yarnpkg.com/mustache/-/mustache-3.2.1.tgz#89e78a9d207d78f2799b1e95764a25bf71a28322" 272 | integrity sha512-RERvMFdLpaFfSRIEe632yDm5nsd0SDKn8hGmcUwswnyiE5mtdZLDybtHAz6hjJhawokF0hXvGLtx9mrQfm6FkA== 273 | 274 | negotiator@0.6.2: 275 | version "0.6.2" 276 | resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.2.tgz#feacf7ccf525a77ae9634436a64883ffeca346fb" 277 | integrity sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw== 278 | 279 | on-finished@~2.3.0: 280 | version "2.3.0" 281 | resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947" 282 | integrity sha1-IPEzZIGwg811M3mSoWlxqi2QaUc= 283 | dependencies: 284 | ee-first "1.1.1" 285 | 286 | parseurl@~1.3.3: 287 | version "1.3.3" 288 | resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4" 289 | integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ== 290 | 291 | path-to-regexp@0.1.7: 292 | version "0.1.7" 293 | resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c" 294 | integrity sha1-32BBeABfUi8V60SQ5yR6G/qmf4w= 295 | 296 | proxy-addr@~2.0.5: 297 | version "2.0.6" 298 | resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.6.tgz#fdc2336505447d3f2f2c638ed272caf614bbb2bf" 299 | integrity sha512-dh/frvCBVmSsDYzw6n926jv974gddhkFPfiN8hPOi30Wax25QZyZEGveluCgliBnqmuM+UJmBErbAUFIoDbjOw== 300 | dependencies: 301 | forwarded "~0.1.2" 302 | ipaddr.js "1.9.1" 303 | 304 | qs@6.7.0: 305 | version "6.7.0" 306 | resolved "https://registry.yarnpkg.com/qs/-/qs-6.7.0.tgz#41dc1a015e3d581f1621776be31afb2876a9b1bc" 307 | integrity sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ== 308 | 309 | range-parser@~1.2.1: 310 | version "1.2.1" 311 | resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031" 312 | integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== 313 | 314 | raw-body@2.4.0: 315 | version "2.4.0" 316 | resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.4.0.tgz#a1ce6fb9c9bc356ca52e89256ab59059e13d0332" 317 | integrity sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q== 318 | dependencies: 319 | bytes "3.1.0" 320 | http-errors "1.7.2" 321 | iconv-lite "0.4.24" 322 | unpipe "1.0.0" 323 | 324 | safe-buffer@5.1.2: 325 | version "5.1.2" 326 | resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" 327 | integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== 328 | 329 | "safer-buffer@>= 2.1.2 < 3": 330 | version "2.1.2" 331 | resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" 332 | integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== 333 | 334 | send@0.17.1: 335 | version "0.17.1" 336 | resolved "https://registry.yarnpkg.com/send/-/send-0.17.1.tgz#c1d8b059f7900f7466dd4938bdc44e11ddb376c8" 337 | integrity sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg== 338 | dependencies: 339 | debug "2.6.9" 340 | depd "~1.1.2" 341 | destroy "~1.0.4" 342 | encodeurl "~1.0.2" 343 | escape-html "~1.0.3" 344 | etag "~1.8.1" 345 | fresh "0.5.2" 346 | http-errors "~1.7.2" 347 | mime "1.6.0" 348 | ms "2.1.1" 349 | on-finished "~2.3.0" 350 | range-parser "~1.2.1" 351 | statuses "~1.5.0" 352 | 353 | serve-static@1.14.1: 354 | version "1.14.1" 355 | resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.14.1.tgz#666e636dc4f010f7ef29970a88a674320898b2f9" 356 | integrity sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg== 357 | dependencies: 358 | encodeurl "~1.0.2" 359 | escape-html "~1.0.3" 360 | parseurl "~1.3.3" 361 | send "0.17.1" 362 | 363 | setprototypeof@1.1.1: 364 | version "1.1.1" 365 | resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.1.tgz#7e95acb24aa92f5885e0abef5ba131330d4ae683" 366 | integrity sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw== 367 | 368 | "statuses@>= 1.5.0 < 2", statuses@~1.5.0: 369 | version "1.5.0" 370 | resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c" 371 | integrity sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow= 372 | 373 | toidentifier@1.0.0: 374 | version "1.0.0" 375 | resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.0.tgz#7e1be3470f1e77948bc43d94a3c8f4d7752ba553" 376 | integrity sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw== 377 | 378 | type-is@~1.6.17, type-is@~1.6.18: 379 | version "1.6.18" 380 | resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131" 381 | integrity sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g== 382 | dependencies: 383 | media-typer "0.3.0" 384 | mime-types "~2.1.24" 385 | 386 | unpipe@1.0.0, unpipe@~1.0.0: 387 | version "1.0.0" 388 | resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" 389 | integrity sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw= 390 | 391 | utils-merge@1.0.1: 392 | version "1.0.1" 393 | resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" 394 | integrity sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM= 395 | 396 | vary@~1.1.2: 397 | version "1.1.2" 398 | resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" 399 | integrity sha1-IpnwLG3tMNSllhsLn3RSShj2NPw= 400 | 401 | yallist@^3.0.2: 402 | version "3.1.1" 403 | resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" 404 | integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== 405 | -------------------------------------------------------------------------------- /101-debugger/.dockerignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | -------------------------------------------------------------------------------- /101-debugger/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM node:20 2 | 3 | # Default value; will be overridden by build_args, if passed 4 | ARG node_env=production 5 | 6 | ENV NODE_ENV $node_env 7 | 8 | WORKDIR /app 9 | 10 | ADD package.json . 11 | ADD yarn.lock . 12 | RUN yarn install 13 | 14 | ADD . . 15 | 16 | ENTRYPOINT [ "node", "/app/index.js" ] 17 | -------------------------------------------------------------------------------- /101-debugger/Tiltfile: -------------------------------------------------------------------------------- 1 | # -*- mode: Python -* 2 | 3 | k8s_yaml('kubernetes.yaml') 4 | 5 | k8s_resource('example-nodejs', port_forwards=[ 6 | 8000, # app itself 7 | 9229 # debugger 8 | ], resource_deps=['deploy'] 9 | ) 10 | 11 | # Records the current time, then kicks off a server update. 12 | # Normally, you would let Tilt do deploys automatically, but this 13 | # shows you how to set up a custom workflow that measures it. 14 | local_resource( 15 | 'deploy', 16 | 'python3 now.py > start-time.txt', 17 | ) 18 | 19 | # Add a live_update rule to our docker_build 20 | congrats = "🎉 Congrats, you ran a live_update! 🎉" 21 | docker_build('example-nodejs-image', '.', 22 | build_args={'node_env': 'development'}, 23 | entrypoint='yarn run nodemon --inspect=0.0.0.0:9229 /app/index.js', 24 | live_update=[ 25 | sync('.', '/app'), 26 | run('cd /app && yarn install', trigger=['./package.json', './yarn.lock']), 27 | 28 | # if all that changed was start-time.txt, make sure the server 29 | # reloads so that it will reflect the new startup time 30 | run('touch /app/index.js', trigger='./start-time.txt'), 31 | 32 | # add a congrats message! 33 | run('sed -i "s/Hello cats!/{}/g" /app/views/index.mustache'. 34 | format(congrats)), 35 | ]) 36 | -------------------------------------------------------------------------------- /101-debugger/index.js: -------------------------------------------------------------------------------- 1 | /* 2 | Gratefully adapted from https://github.com/HemingwayLee/sample-mustache-express 3 | */ 4 | const fs = require('fs'); 5 | 6 | const express = require('express'); 7 | const app = express(); 8 | const mustacheExpress = require('mustache-express'); 9 | 10 | let timeSince = 'N/A'; 11 | 12 | app.engine('mustache', mustacheExpress()); 13 | 14 | app.set('view engine', 'mustache'); 15 | app.set('views', __dirname + '/views'); 16 | app.use(express.static('public')); 17 | 18 | app.get('/', (req, res) => { 19 | res.render('index.mustache', { 20 | time: timeSince, 21 | }); 22 | }); 23 | 24 | app.listen(8000, () => { 25 | timeSince = getSecsSinceDeploy(); 26 | console.log('Server running at http://localhost:8000/'); 27 | }); 28 | 29 | function getSecsSinceDeploy() { 30 | let curTimeMs = new Date().getTime(); 31 | let contents = fs.readFileSync('/app/start-time.txt', 'utf8'); 32 | let startTimeMs = parseInt(contents.trim()) / 10**6; 33 | return ((curTimeMs - startTimeMs) / 10**3).toFixed(2) 34 | } 35 | -------------------------------------------------------------------------------- /101-debugger/kubernetes.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: apps/v1 2 | kind: Deployment 3 | metadata: 4 | name: example-nodejs 5 | labels: 6 | app: example-nodejs 7 | spec: 8 | selector: 9 | matchLabels: 10 | app: example-nodejs 11 | template: 12 | metadata: 13 | labels: 14 | app: example-nodejs 15 | spec: 16 | containers: 17 | - name: example-nodejs 18 | image: example-nodejs-image 19 | ports: 20 | - name: http 21 | containerPort: 8000 22 | - name: debug 23 | containerPort: 9229 24 | -------------------------------------------------------------------------------- /101-debugger/now.py: -------------------------------------------------------------------------------- 1 | import time 2 | 3 | print("%d" % (float(time.time()) * 1000 * 1000 * 1000)) -------------------------------------------------------------------------------- /101-debugger/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "tilt-example-nodejs", 3 | "version": "1.0.0", 4 | "main": "index.js", 5 | "license": "MIT", 6 | "dependencies": { 7 | "express": "^4.17.1", 8 | "immutable": "^3.8.2", 9 | "mustache-express": "^1.3.0" 10 | }, 11 | "devDependencies": { 12 | "nodemon": "^2.0.2" 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /101-debugger/public/pets.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tilt-dev/tilt-example-nodejs/d81e0ca6f7866cfddcea0094943abdb9fb16b5ee/101-debugger/public/pets.png -------------------------------------------------------------------------------- /101-debugger/views/index.mustache: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 |
5 | 6 |
Hello cats!
7 |
Time from "deploy" button pressed → server up: {{time}}s
8 |
9 | 10 | 11 | -------------------------------------------------------------------------------- /101-debugger/yarn.lock: -------------------------------------------------------------------------------- 1 | # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. 2 | # yarn lockfile v1 3 | 4 | 5 | abbrev@1: 6 | version "1.1.1" 7 | resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" 8 | integrity sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q== 9 | 10 | accepts@~1.3.7: 11 | version "1.3.7" 12 | resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.7.tgz#531bc726517a3b2b41f850021c6cc15eaab507cd" 13 | integrity sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA== 14 | dependencies: 15 | mime-types "~2.1.24" 16 | negotiator "0.6.2" 17 | 18 | ansi-align@^2.0.0: 19 | version "2.0.0" 20 | resolved "https://registry.yarnpkg.com/ansi-align/-/ansi-align-2.0.0.tgz#c36aeccba563b89ceb556f3690f0b1d9e3547f7f" 21 | integrity sha1-w2rsy6VjuJzrVW82kPCx2eNUf38= 22 | dependencies: 23 | string-width "^2.0.0" 24 | 25 | ansi-regex@^3.0.0: 26 | version "3.0.0" 27 | resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998" 28 | integrity sha1-7QMXwyIGT3lGbAKWa922Bas32Zg= 29 | 30 | ansi-styles@^3.2.1: 31 | version "3.2.1" 32 | resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" 33 | integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== 34 | dependencies: 35 | color-convert "^1.9.0" 36 | 37 | anymatch@~3.1.1: 38 | version "3.1.1" 39 | resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.1.tgz#c55ecf02185e2469259399310c173ce31233b142" 40 | integrity sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg== 41 | dependencies: 42 | normalize-path "^3.0.0" 43 | picomatch "^2.0.4" 44 | 45 | array-flatten@1.1.1: 46 | version "1.1.1" 47 | resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2" 48 | integrity sha1-ml9pkFGx5wczKPKgCJaLZOopVdI= 49 | 50 | async@~3.1.0: 51 | version "3.1.1" 52 | resolved "https://registry.yarnpkg.com/async/-/async-3.1.1.tgz#dd3542db03de837979c9ebbca64ca01b06dc98df" 53 | integrity sha512-X5Dj8hK1pJNC2Wzo2Rcp9FBVdJMGRR/S7V+lH46s8GVFhtbo5O4Le5GECCF/8PISVdkUA6mMPvgz7qTTD1rf1g== 54 | 55 | balanced-match@^1.0.0: 56 | version "1.0.0" 57 | resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" 58 | integrity sha1-ibTRmasr7kneFk6gK4nORi1xt2c= 59 | 60 | binary-extensions@^2.0.0: 61 | version "2.0.0" 62 | resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.0.0.tgz#23c0df14f6a88077f5f986c0d167ec03c3d5537c" 63 | integrity sha512-Phlt0plgpIIBOGTT/ehfFnbNlfsDEiqmzE2KRXoX1bLIlir4X/MR+zSyBEkL05ffWgnRSf/DXv+WrUAVr93/ow== 64 | 65 | body-parser@1.19.0: 66 | version "1.19.0" 67 | resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.19.0.tgz#96b2709e57c9c4e09a6fd66a8fd979844f69f08a" 68 | integrity sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw== 69 | dependencies: 70 | bytes "3.1.0" 71 | content-type "~1.0.4" 72 | debug "2.6.9" 73 | depd "~1.1.2" 74 | http-errors "1.7.2" 75 | iconv-lite "0.4.24" 76 | on-finished "~2.3.0" 77 | qs "6.7.0" 78 | raw-body "2.4.0" 79 | type-is "~1.6.17" 80 | 81 | boxen@^1.2.1: 82 | version "1.3.0" 83 | resolved "https://registry.yarnpkg.com/boxen/-/boxen-1.3.0.tgz#55c6c39a8ba58d9c61ad22cd877532deb665a20b" 84 | integrity sha512-TNPjfTr432qx7yOjQyaXm3dSR0MH9vXp7eT1BFSl/C51g+EFnOR9hTg1IreahGBmDNCehscshe45f+C1TBZbLw== 85 | dependencies: 86 | ansi-align "^2.0.0" 87 | camelcase "^4.0.0" 88 | chalk "^2.0.1" 89 | cli-boxes "^1.0.0" 90 | string-width "^2.0.0" 91 | term-size "^1.2.0" 92 | widest-line "^2.0.0" 93 | 94 | brace-expansion@^1.1.7: 95 | version "1.1.11" 96 | resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" 97 | integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== 98 | dependencies: 99 | balanced-match "^1.0.0" 100 | concat-map "0.0.1" 101 | 102 | braces@~3.0.2: 103 | version "3.0.2" 104 | resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" 105 | integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== 106 | dependencies: 107 | fill-range "^7.0.1" 108 | 109 | bytes@3.1.0: 110 | version "3.1.0" 111 | resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.0.tgz#f6cf7933a360e0588fa9fde85651cdc7f805d1f6" 112 | integrity sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg== 113 | 114 | camelcase@^4.0.0: 115 | version "4.1.0" 116 | resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-4.1.0.tgz#d545635be1e33c542649c69173e5de6acfae34dd" 117 | integrity sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0= 118 | 119 | capture-stack-trace@^1.0.0: 120 | version "1.0.1" 121 | resolved "https://registry.yarnpkg.com/capture-stack-trace/-/capture-stack-trace-1.0.1.tgz#a6c0bbe1f38f3aa0b92238ecb6ff42c344d4135d" 122 | integrity sha512-mYQLZnx5Qt1JgB1WEiMCf2647plpGeQ2NMR/5L0HNZzGQo4fuSPnK+wjfPnKZV0aiJDgzmWqqkV/g7JD+DW0qw== 123 | 124 | chalk@^2.0.1: 125 | version "2.4.2" 126 | resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" 127 | integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== 128 | dependencies: 129 | ansi-styles "^3.2.1" 130 | escape-string-regexp "^1.0.5" 131 | supports-color "^5.3.0" 132 | 133 | chokidar@^3.2.2: 134 | version "3.3.1" 135 | resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.3.1.tgz#c84e5b3d18d9a4d77558fef466b1bf16bbeb3450" 136 | integrity sha512-4QYCEWOcK3OJrxwvyyAOxFuhpvOVCYkr33LPfFNBjAD/w3sEzWsp2BUOkI4l9bHvWioAd0rc6NlHUOEaWkTeqg== 137 | dependencies: 138 | anymatch "~3.1.1" 139 | braces "~3.0.2" 140 | glob-parent "~5.1.0" 141 | is-binary-path "~2.1.0" 142 | is-glob "~4.0.1" 143 | normalize-path "~3.0.0" 144 | readdirp "~3.3.0" 145 | optionalDependencies: 146 | fsevents "~2.1.2" 147 | 148 | ci-info@^1.5.0: 149 | version "1.6.0" 150 | resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-1.6.0.tgz#2ca20dbb9ceb32d4524a683303313f0304b1e497" 151 | integrity sha512-vsGdkwSCDpWmP80ncATX7iea5DWQemg1UgCW5J8tqjU3lYw4FBYuj89J0CTVomA7BEfvSZd84GmHko+MxFQU2A== 152 | 153 | cli-boxes@^1.0.0: 154 | version "1.0.0" 155 | resolved "https://registry.yarnpkg.com/cli-boxes/-/cli-boxes-1.0.0.tgz#4fa917c3e59c94a004cd61f8ee509da651687143" 156 | integrity sha1-T6kXw+WclKAEzWH47lCdplFocUM= 157 | 158 | color-convert@^1.9.0: 159 | version "1.9.3" 160 | resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" 161 | integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== 162 | dependencies: 163 | color-name "1.1.3" 164 | 165 | color-name@1.1.3: 166 | version "1.1.3" 167 | resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" 168 | integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU= 169 | 170 | concat-map@0.0.1: 171 | version "0.0.1" 172 | resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" 173 | integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= 174 | 175 | configstore@^3.0.0: 176 | version "3.1.2" 177 | resolved "https://registry.yarnpkg.com/configstore/-/configstore-3.1.2.tgz#c6f25defaeef26df12dd33414b001fe81a543f8f" 178 | integrity sha512-vtv5HtGjcYUgFrXc6Kx747B83MRRVS5R1VTEQoXvuP+kMI+if6uywV0nDGoiydJRy4yk7h9od5Og0kxx4zUXmw== 179 | dependencies: 180 | dot-prop "^4.1.0" 181 | graceful-fs "^4.1.2" 182 | make-dir "^1.0.0" 183 | unique-string "^1.0.0" 184 | write-file-atomic "^2.0.0" 185 | xdg-basedir "^3.0.0" 186 | 187 | content-disposition@0.5.3: 188 | version "0.5.3" 189 | resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.3.tgz#e130caf7e7279087c5616c2007d0485698984fbd" 190 | integrity sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g== 191 | dependencies: 192 | safe-buffer "5.1.2" 193 | 194 | content-type@~1.0.4: 195 | version "1.0.4" 196 | resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.4.tgz#e138cc75e040c727b1966fe5e5f8c9aee256fe3b" 197 | integrity sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA== 198 | 199 | cookie-signature@1.0.6: 200 | version "1.0.6" 201 | resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c" 202 | integrity sha1-4wOogrNCzD7oylE6eZmXNNqzriw= 203 | 204 | cookie@0.4.0: 205 | version "0.4.0" 206 | resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.4.0.tgz#beb437e7022b3b6d49019d088665303ebe9c14ba" 207 | integrity sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg== 208 | 209 | create-error-class@^3.0.0: 210 | version "3.0.2" 211 | resolved "https://registry.yarnpkg.com/create-error-class/-/create-error-class-3.0.2.tgz#06be7abef947a3f14a30fd610671d401bca8b7b6" 212 | integrity sha1-Br56vvlHo/FKMP1hBnHUAbyot7Y= 213 | dependencies: 214 | capture-stack-trace "^1.0.0" 215 | 216 | cross-spawn@^5.0.1: 217 | version "5.1.0" 218 | resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-5.1.0.tgz#e8bd0efee58fcff6f8f94510a0a554bbfa235449" 219 | integrity sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk= 220 | dependencies: 221 | lru-cache "^4.0.1" 222 | shebang-command "^1.2.0" 223 | which "^1.2.9" 224 | 225 | crypto-random-string@^1.0.0: 226 | version "1.0.0" 227 | resolved "https://registry.yarnpkg.com/crypto-random-string/-/crypto-random-string-1.0.0.tgz#a230f64f568310e1498009940790ec99545bca7e" 228 | integrity sha1-ojD2T1aDEOFJgAmUB5DsmVRbyn4= 229 | 230 | debug@2.6.9, debug@^2.2.0: 231 | version "2.6.9" 232 | resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" 233 | integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== 234 | dependencies: 235 | ms "2.0.0" 236 | 237 | debug@^3.2.6: 238 | version "3.2.6" 239 | resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.6.tgz#e83d17de16d8a7efb7717edbe5fb10135eee629b" 240 | integrity sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ== 241 | dependencies: 242 | ms "^2.1.1" 243 | 244 | deep-extend@^0.6.0: 245 | version "0.6.0" 246 | resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac" 247 | integrity sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA== 248 | 249 | depd@~1.1.2: 250 | version "1.1.2" 251 | resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9" 252 | integrity sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak= 253 | 254 | destroy@~1.0.4: 255 | version "1.0.4" 256 | resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.0.4.tgz#978857442c44749e4206613e37946205826abd80" 257 | integrity sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA= 258 | 259 | dot-prop@^4.1.0: 260 | version "4.2.1" 261 | resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-4.2.1.tgz#45884194a71fc2cda71cbb4bceb3a4dd2f433ba4" 262 | integrity sha512-l0p4+mIuJIua0mhxGoh4a+iNL9bmeK5DvnSVQa6T0OhrVmaEa1XScX5Etc673FePCJOArq/4Pa2cLGODUWTPOQ== 263 | dependencies: 264 | is-obj "^1.0.0" 265 | 266 | duplexer3@^0.1.4: 267 | version "0.1.4" 268 | resolved "https://registry.yarnpkg.com/duplexer3/-/duplexer3-0.1.4.tgz#ee01dd1cac0ed3cbc7fdbea37dc0a8f1ce002ce2" 269 | integrity sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI= 270 | 271 | ee-first@1.1.1: 272 | version "1.1.1" 273 | resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" 274 | integrity sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0= 275 | 276 | encodeurl@~1.0.2: 277 | version "1.0.2" 278 | resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" 279 | integrity sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k= 280 | 281 | escape-html@~1.0.3: 282 | version "1.0.3" 283 | resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" 284 | integrity sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg= 285 | 286 | escape-string-regexp@^1.0.5: 287 | version "1.0.5" 288 | resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" 289 | integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= 290 | 291 | etag@~1.8.1: 292 | version "1.8.1" 293 | resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" 294 | integrity sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc= 295 | 296 | execa@^0.7.0: 297 | version "0.7.0" 298 | resolved "https://registry.yarnpkg.com/execa/-/execa-0.7.0.tgz#944becd34cc41ee32a63a9faf27ad5a65fc59777" 299 | integrity sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c= 300 | dependencies: 301 | cross-spawn "^5.0.1" 302 | get-stream "^3.0.0" 303 | is-stream "^1.1.0" 304 | npm-run-path "^2.0.0" 305 | p-finally "^1.0.0" 306 | signal-exit "^3.0.0" 307 | strip-eof "^1.0.0" 308 | 309 | express@^4.17.1: 310 | version "4.17.1" 311 | resolved "https://registry.yarnpkg.com/express/-/express-4.17.1.tgz#4491fc38605cf51f8629d39c2b5d026f98a4c134" 312 | integrity sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g== 313 | dependencies: 314 | accepts "~1.3.7" 315 | array-flatten "1.1.1" 316 | body-parser "1.19.0" 317 | content-disposition "0.5.3" 318 | content-type "~1.0.4" 319 | cookie "0.4.0" 320 | cookie-signature "1.0.6" 321 | debug "2.6.9" 322 | depd "~1.1.2" 323 | encodeurl "~1.0.2" 324 | escape-html "~1.0.3" 325 | etag "~1.8.1" 326 | finalhandler "~1.1.2" 327 | fresh "0.5.2" 328 | merge-descriptors "1.0.1" 329 | methods "~1.1.2" 330 | on-finished "~2.3.0" 331 | parseurl "~1.3.3" 332 | path-to-regexp "0.1.7" 333 | proxy-addr "~2.0.5" 334 | qs "6.7.0" 335 | range-parser "~1.2.1" 336 | safe-buffer "5.1.2" 337 | send "0.17.1" 338 | serve-static "1.14.1" 339 | setprototypeof "1.1.1" 340 | statuses "~1.5.0" 341 | type-is "~1.6.18" 342 | utils-merge "1.0.1" 343 | vary "~1.1.2" 344 | 345 | fill-range@^7.0.1: 346 | version "7.0.1" 347 | resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" 348 | integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== 349 | dependencies: 350 | to-regex-range "^5.0.1" 351 | 352 | finalhandler@~1.1.2: 353 | version "1.1.2" 354 | resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.1.2.tgz#b7e7d000ffd11938d0fdb053506f6ebabe9f587d" 355 | integrity sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA== 356 | dependencies: 357 | debug "2.6.9" 358 | encodeurl "~1.0.2" 359 | escape-html "~1.0.3" 360 | on-finished "~2.3.0" 361 | parseurl "~1.3.3" 362 | statuses "~1.5.0" 363 | unpipe "~1.0.0" 364 | 365 | forwarded@~0.1.2: 366 | version "0.1.2" 367 | resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.1.2.tgz#98c23dab1175657b8c0573e8ceccd91b0ff18c84" 368 | integrity sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ= 369 | 370 | fresh@0.5.2: 371 | version "0.5.2" 372 | resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" 373 | integrity sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac= 374 | 375 | fsevents@~2.1.2: 376 | version "2.1.2" 377 | resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.1.2.tgz#4c0a1fb34bc68e543b4b82a9ec392bfbda840805" 378 | integrity sha512-R4wDiBwZ0KzpgOWetKDug1FZcYhqYnUYKtfZYt4mD5SBz76q0KR4Q9o7GIPamsVPGmW3EYPPJ0dOOjvx32ldZA== 379 | 380 | get-stream@^3.0.0: 381 | version "3.0.0" 382 | resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-3.0.0.tgz#8e943d1358dc37555054ecbe2edb05aa174ede14" 383 | integrity sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ= 384 | 385 | glob-parent@~5.1.0: 386 | version "5.1.1" 387 | resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.1.tgz#b6c1ef417c4e5663ea498f1c45afac6916bbc229" 388 | integrity sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ== 389 | dependencies: 390 | is-glob "^4.0.1" 391 | 392 | global-dirs@^0.1.0: 393 | version "0.1.1" 394 | resolved "https://registry.yarnpkg.com/global-dirs/-/global-dirs-0.1.1.tgz#b319c0dd4607f353f3be9cca4c72fc148c49f445" 395 | integrity sha1-sxnA3UYH81PzvpzKTHL8FIxJ9EU= 396 | dependencies: 397 | ini "^1.3.4" 398 | 399 | got@^6.7.1: 400 | version "6.7.1" 401 | resolved "https://registry.yarnpkg.com/got/-/got-6.7.1.tgz#240cd05785a9a18e561dc1b44b41c763ef1e8db0" 402 | integrity sha1-JAzQV4WpoY5WHcG0S0HHY+8ejbA= 403 | dependencies: 404 | create-error-class "^3.0.0" 405 | duplexer3 "^0.1.4" 406 | get-stream "^3.0.0" 407 | is-redirect "^1.0.0" 408 | is-retry-allowed "^1.0.0" 409 | is-stream "^1.0.0" 410 | lowercase-keys "^1.0.0" 411 | safe-buffer "^5.0.1" 412 | timed-out "^4.0.0" 413 | unzip-response "^2.0.1" 414 | url-parse-lax "^1.0.0" 415 | 416 | graceful-fs@^4.1.11, graceful-fs@^4.1.2: 417 | version "4.2.3" 418 | resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.3.tgz#4a12ff1b60376ef09862c2093edd908328be8423" 419 | integrity sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ== 420 | 421 | has-flag@^3.0.0: 422 | version "3.0.0" 423 | resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" 424 | integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0= 425 | 426 | http-errors@1.7.2: 427 | version "1.7.2" 428 | resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.7.2.tgz#4f5029cf13239f31036e5b2e55292bcfbcc85c8f" 429 | integrity sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg== 430 | dependencies: 431 | depd "~1.1.2" 432 | inherits "2.0.3" 433 | setprototypeof "1.1.1" 434 | statuses ">= 1.5.0 < 2" 435 | toidentifier "1.0.0" 436 | 437 | http-errors@~1.7.2: 438 | version "1.7.3" 439 | resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.7.3.tgz#6c619e4f9c60308c38519498c14fbb10aacebb06" 440 | integrity sha512-ZTTX0MWrsQ2ZAhA1cejAwDLycFsd7I7nVtnkT3Ol0aqodaKW+0CTZDQ1uBv5whptCnc8e8HeRRJxRs0kmm/Qfw== 441 | dependencies: 442 | depd "~1.1.2" 443 | inherits "2.0.4" 444 | setprototypeof "1.1.1" 445 | statuses ">= 1.5.0 < 2" 446 | toidentifier "1.0.0" 447 | 448 | iconv-lite@0.4.24: 449 | version "0.4.24" 450 | resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" 451 | integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== 452 | dependencies: 453 | safer-buffer ">= 2.1.2 < 3" 454 | 455 | ignore-by-default@^1.0.1: 456 | version "1.0.1" 457 | resolved "https://registry.yarnpkg.com/ignore-by-default/-/ignore-by-default-1.0.1.tgz#48ca6d72f6c6a3af00a9ad4ae6876be3889e2b09" 458 | integrity sha1-SMptcvbGo68Aqa1K5odr44ieKwk= 459 | 460 | immutable@^3.8.2: 461 | version "3.8.2" 462 | resolved "https://registry.yarnpkg.com/immutable/-/immutable-3.8.2.tgz#c2439951455bb39913daf281376f1530e104adf3" 463 | integrity sha1-wkOZUUVbs5kT2vKBN28VMOEErfM= 464 | 465 | import-lazy@^2.1.0: 466 | version "2.1.0" 467 | resolved "https://registry.yarnpkg.com/import-lazy/-/import-lazy-2.1.0.tgz#05698e3d45c88e8d7e9d92cb0584e77f096f3e43" 468 | integrity sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM= 469 | 470 | imurmurhash@^0.1.4: 471 | version "0.1.4" 472 | resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" 473 | integrity sha1-khi5srkoojixPcT7a21XbyMUU+o= 474 | 475 | inherits@2.0.3: 476 | version "2.0.3" 477 | resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" 478 | integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4= 479 | 480 | inherits@2.0.4: 481 | version "2.0.4" 482 | resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" 483 | integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== 484 | 485 | ini@^1.3.4, ini@~1.3.0: 486 | version "1.3.8" 487 | resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.8.tgz#a29da425b48806f34767a4efce397269af28432c" 488 | integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew== 489 | 490 | ipaddr.js@1.9.1: 491 | version "1.9.1" 492 | resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.1.tgz#bff38543eeb8984825079ff3a2a8e6cbd46781b3" 493 | integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g== 494 | 495 | is-binary-path@~2.1.0: 496 | version "2.1.0" 497 | resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" 498 | integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== 499 | dependencies: 500 | binary-extensions "^2.0.0" 501 | 502 | is-ci@^1.0.10: 503 | version "1.2.1" 504 | resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-1.2.1.tgz#e3779c8ee17fccf428488f6e281187f2e632841c" 505 | integrity sha512-s6tfsaQaQi3JNciBH6shVqEDvhGut0SUXr31ag8Pd8BBbVVlcGfWhpPmEOoM6RJ5TFhbypvf5yyRw/VXW1IiWg== 506 | dependencies: 507 | ci-info "^1.5.0" 508 | 509 | is-extglob@^2.1.1: 510 | version "2.1.1" 511 | resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" 512 | integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI= 513 | 514 | is-fullwidth-code-point@^2.0.0: 515 | version "2.0.0" 516 | resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" 517 | integrity sha1-o7MKXE8ZkYMWeqq5O+764937ZU8= 518 | 519 | is-glob@^4.0.1, is-glob@~4.0.1: 520 | version "4.0.1" 521 | resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.1.tgz#7567dbe9f2f5e2467bc77ab83c4a29482407a5dc" 522 | integrity sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg== 523 | dependencies: 524 | is-extglob "^2.1.1" 525 | 526 | is-installed-globally@^0.1.0: 527 | version "0.1.0" 528 | resolved "https://registry.yarnpkg.com/is-installed-globally/-/is-installed-globally-0.1.0.tgz#0dfd98f5a9111716dd535dda6492f67bf3d25a80" 529 | integrity sha1-Df2Y9akRFxbdU13aZJL2e/PSWoA= 530 | dependencies: 531 | global-dirs "^0.1.0" 532 | is-path-inside "^1.0.0" 533 | 534 | is-npm@^1.0.0: 535 | version "1.0.0" 536 | resolved "https://registry.yarnpkg.com/is-npm/-/is-npm-1.0.0.tgz#f2fb63a65e4905b406c86072765a1a4dc793b9f4" 537 | integrity sha1-8vtjpl5JBbQGyGBydloaTceTufQ= 538 | 539 | is-number@^7.0.0: 540 | version "7.0.0" 541 | resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" 542 | integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== 543 | 544 | is-obj@^1.0.0: 545 | version "1.0.1" 546 | resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-1.0.1.tgz#3e4729ac1f5fde025cd7d83a896dab9f4f67db0f" 547 | integrity sha1-PkcprB9f3gJc19g6iW2rn09n2w8= 548 | 549 | is-path-inside@^1.0.0: 550 | version "1.0.1" 551 | resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-1.0.1.tgz#8ef5b7de50437a3fdca6b4e865ef7aa55cb48036" 552 | integrity sha1-jvW33lBDej/cprToZe96pVy0gDY= 553 | dependencies: 554 | path-is-inside "^1.0.1" 555 | 556 | is-redirect@^1.0.0: 557 | version "1.0.0" 558 | resolved "https://registry.yarnpkg.com/is-redirect/-/is-redirect-1.0.0.tgz#1d03dded53bd8db0f30c26e4f95d36fc7c87dc24" 559 | integrity sha1-HQPd7VO9jbDzDCbk+V02/HyH3CQ= 560 | 561 | is-retry-allowed@^1.0.0: 562 | version "1.2.0" 563 | resolved "https://registry.yarnpkg.com/is-retry-allowed/-/is-retry-allowed-1.2.0.tgz#d778488bd0a4666a3be8a1482b9f2baafedea8b4" 564 | integrity sha512-RUbUeKwvm3XG2VYamhJL1xFktgjvPzL0Hq8C+6yrWIswDy3BIXGqCxhxkc30N9jqK311gVU137K8Ei55/zVJRg== 565 | 566 | is-stream@^1.0.0, is-stream@^1.1.0: 567 | version "1.1.0" 568 | resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" 569 | integrity sha1-EtSj3U5o4Lec6428hBc66A2RykQ= 570 | 571 | isexe@^2.0.0: 572 | version "2.0.0" 573 | resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" 574 | integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA= 575 | 576 | latest-version@^3.0.0: 577 | version "3.1.0" 578 | resolved "https://registry.yarnpkg.com/latest-version/-/latest-version-3.1.0.tgz#a205383fea322b33b5ae3b18abee0dc2f356ee15" 579 | integrity sha1-ogU4P+oyKzO1rjsYq+4NwvNW7hU= 580 | dependencies: 581 | package-json "^4.0.0" 582 | 583 | lowercase-keys@^1.0.0: 584 | version "1.0.1" 585 | resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-1.0.1.tgz#6f9e30b47084d971a7c820ff15a6c5167b74c26f" 586 | integrity sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA== 587 | 588 | lru-cache@^4.0.1: 589 | version "4.1.5" 590 | resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.5.tgz#8bbe50ea85bed59bc9e33dcab8235ee9bcf443cd" 591 | integrity sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g== 592 | dependencies: 593 | pseudomap "^1.0.2" 594 | yallist "^2.1.2" 595 | 596 | lru-cache@~5.1.1: 597 | version "5.1.1" 598 | resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920" 599 | integrity sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w== 600 | dependencies: 601 | yallist "^3.0.2" 602 | 603 | make-dir@^1.0.0: 604 | version "1.3.0" 605 | resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-1.3.0.tgz#79c1033b80515bd6d24ec9933e860ca75ee27f0c" 606 | integrity sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ== 607 | dependencies: 608 | pify "^3.0.0" 609 | 610 | media-typer@0.3.0: 611 | version "0.3.0" 612 | resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" 613 | integrity sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g= 614 | 615 | merge-descriptors@1.0.1: 616 | version "1.0.1" 617 | resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61" 618 | integrity sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E= 619 | 620 | methods@~1.1.2: 621 | version "1.1.2" 622 | resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" 623 | integrity sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4= 624 | 625 | mime-db@1.43.0: 626 | version "1.43.0" 627 | resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.43.0.tgz#0a12e0502650e473d735535050e7c8f4eb4fae58" 628 | integrity sha512-+5dsGEEovYbT8UY9yD7eE4XTc4UwJ1jBYlgaQQF38ENsKR3wj/8q8RFZrF9WIZpB2V1ArTVFUva8sAul1NzRzQ== 629 | 630 | mime-types@~2.1.24: 631 | version "2.1.26" 632 | resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.26.tgz#9c921fc09b7e149a65dfdc0da4d20997200b0a06" 633 | integrity sha512-01paPWYgLrkqAyrlDorC1uDwl2p3qZT7yl806vW7DvDoxwXi46jsjFbg+WdwotBIk6/MbEhO/dh5aZ5sNj/dWQ== 634 | dependencies: 635 | mime-db "1.43.0" 636 | 637 | mime@1.6.0: 638 | version "1.6.0" 639 | resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" 640 | integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== 641 | 642 | minimatch@^3.0.4: 643 | version "3.0.4" 644 | resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" 645 | integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA== 646 | dependencies: 647 | brace-expansion "^1.1.7" 648 | 649 | minimist@^1.2.0: 650 | version "1.2.5" 651 | resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602" 652 | integrity sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw== 653 | 654 | ms@2.0.0: 655 | version "2.0.0" 656 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" 657 | integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g= 658 | 659 | ms@2.1.1: 660 | version "2.1.1" 661 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.1.tgz#30a5864eb3ebb0a66f2ebe6d727af06a09d86e0a" 662 | integrity sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg== 663 | 664 | ms@^2.1.1: 665 | version "2.1.2" 666 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" 667 | integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== 668 | 669 | mustache-express@^1.3.0: 670 | version "1.3.0" 671 | resolved "https://registry.yarnpkg.com/mustache-express/-/mustache-express-1.3.0.tgz#91d67121e3553d42d6c995f4c32793db89492493" 672 | integrity sha512-JWG8Rzxh9tpoLEH0NZ2u/caDiwhIkW+50IOBrcO+lHya3tCYj41bYPDEHCxPbKXvPrSyMNpI6ly4xdU2zpNQtg== 673 | dependencies: 674 | async "~3.1.0" 675 | lru-cache "~5.1.1" 676 | mustache "^3.1.0" 677 | 678 | mustache@^3.1.0: 679 | version "3.2.1" 680 | resolved "https://registry.yarnpkg.com/mustache/-/mustache-3.2.1.tgz#89e78a9d207d78f2799b1e95764a25bf71a28322" 681 | integrity sha512-RERvMFdLpaFfSRIEe632yDm5nsd0SDKn8hGmcUwswnyiE5mtdZLDybtHAz6hjJhawokF0hXvGLtx9mrQfm6FkA== 682 | 683 | negotiator@0.6.2: 684 | version "0.6.2" 685 | resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.2.tgz#feacf7ccf525a77ae9634436a64883ffeca346fb" 686 | integrity sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw== 687 | 688 | nodemon@^2.0.2: 689 | version "2.0.2" 690 | resolved "https://registry.yarnpkg.com/nodemon/-/nodemon-2.0.2.tgz#9c7efeaaf9b8259295a97e5d4585ba8f0cbe50b0" 691 | integrity sha512-GWhYPMfde2+M0FsHnggIHXTqPDHXia32HRhh6H0d75Mt9FKUoCBvumNHr7LdrpPBTKxsWmIEOjoN+P4IU6Hcaw== 692 | dependencies: 693 | chokidar "^3.2.2" 694 | debug "^3.2.6" 695 | ignore-by-default "^1.0.1" 696 | minimatch "^3.0.4" 697 | pstree.remy "^1.1.7" 698 | semver "^5.7.1" 699 | supports-color "^5.5.0" 700 | touch "^3.1.0" 701 | undefsafe "^2.0.2" 702 | update-notifier "^2.5.0" 703 | 704 | nopt@~1.0.10: 705 | version "1.0.10" 706 | resolved "https://registry.yarnpkg.com/nopt/-/nopt-1.0.10.tgz#6ddd21bd2a31417b92727dd585f8a6f37608ebee" 707 | integrity sha1-bd0hvSoxQXuScn3Vhfim83YI6+4= 708 | dependencies: 709 | abbrev "1" 710 | 711 | normalize-path@^3.0.0, normalize-path@~3.0.0: 712 | version "3.0.0" 713 | resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" 714 | integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== 715 | 716 | npm-run-path@^2.0.0: 717 | version "2.0.2" 718 | resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-2.0.2.tgz#35a9232dfa35d7067b4cb2ddf2357b1871536c5f" 719 | integrity sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8= 720 | dependencies: 721 | path-key "^2.0.0" 722 | 723 | on-finished@~2.3.0: 724 | version "2.3.0" 725 | resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947" 726 | integrity sha1-IPEzZIGwg811M3mSoWlxqi2QaUc= 727 | dependencies: 728 | ee-first "1.1.1" 729 | 730 | p-finally@^1.0.0: 731 | version "1.0.0" 732 | resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae" 733 | integrity sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4= 734 | 735 | package-json@^4.0.0: 736 | version "4.0.1" 737 | resolved "https://registry.yarnpkg.com/package-json/-/package-json-4.0.1.tgz#8869a0401253661c4c4ca3da6c2121ed555f5eed" 738 | integrity sha1-iGmgQBJTZhxMTKPabCEh7VVfXu0= 739 | dependencies: 740 | got "^6.7.1" 741 | registry-auth-token "^3.0.1" 742 | registry-url "^3.0.3" 743 | semver "^5.1.0" 744 | 745 | parseurl@~1.3.3: 746 | version "1.3.3" 747 | resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4" 748 | integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ== 749 | 750 | path-is-inside@^1.0.1: 751 | version "1.0.2" 752 | resolved "https://registry.yarnpkg.com/path-is-inside/-/path-is-inside-1.0.2.tgz#365417dede44430d1c11af61027facf074bdfc53" 753 | integrity sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM= 754 | 755 | path-key@^2.0.0: 756 | version "2.0.1" 757 | resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40" 758 | integrity sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A= 759 | 760 | path-to-regexp@0.1.7: 761 | version "0.1.7" 762 | resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c" 763 | integrity sha1-32BBeABfUi8V60SQ5yR6G/qmf4w= 764 | 765 | picomatch@^2.0.4, picomatch@^2.0.7: 766 | version "2.2.2" 767 | resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.2.2.tgz#21f333e9b6b8eaff02468f5146ea406d345f4dad" 768 | integrity sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg== 769 | 770 | pify@^3.0.0: 771 | version "3.0.0" 772 | resolved "https://registry.yarnpkg.com/pify/-/pify-3.0.0.tgz#e5a4acd2c101fdf3d9a4d07f0dbc4db49dd28176" 773 | integrity sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY= 774 | 775 | prepend-http@^1.0.1: 776 | version "1.0.4" 777 | resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-1.0.4.tgz#d4f4562b0ce3696e41ac52d0e002e57a635dc6dc" 778 | integrity sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw= 779 | 780 | proxy-addr@~2.0.5: 781 | version "2.0.6" 782 | resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.6.tgz#fdc2336505447d3f2f2c638ed272caf614bbb2bf" 783 | integrity sha512-dh/frvCBVmSsDYzw6n926jv974gddhkFPfiN8hPOi30Wax25QZyZEGveluCgliBnqmuM+UJmBErbAUFIoDbjOw== 784 | dependencies: 785 | forwarded "~0.1.2" 786 | ipaddr.js "1.9.1" 787 | 788 | pseudomap@^1.0.2: 789 | version "1.0.2" 790 | resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3" 791 | integrity sha1-8FKijacOYYkX7wqKw0wa5aaChrM= 792 | 793 | pstree.remy@^1.1.7: 794 | version "1.1.7" 795 | resolved "https://registry.yarnpkg.com/pstree.remy/-/pstree.remy-1.1.7.tgz#c76963a28047ed61542dc361aa26ee55a7fa15f3" 796 | integrity sha512-xsMgrUwRpuGskEzBFkH8NmTimbZ5PcPup0LA8JJkHIm2IMUbQcpo3yeLNWVrufEYjh8YwtSVh0xz6UeWc5Oh5A== 797 | 798 | qs@6.7.0: 799 | version "6.7.0" 800 | resolved "https://registry.yarnpkg.com/qs/-/qs-6.7.0.tgz#41dc1a015e3d581f1621776be31afb2876a9b1bc" 801 | integrity sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ== 802 | 803 | range-parser@~1.2.1: 804 | version "1.2.1" 805 | resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031" 806 | integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== 807 | 808 | raw-body@2.4.0: 809 | version "2.4.0" 810 | resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.4.0.tgz#a1ce6fb9c9bc356ca52e89256ab59059e13d0332" 811 | integrity sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q== 812 | dependencies: 813 | bytes "3.1.0" 814 | http-errors "1.7.2" 815 | iconv-lite "0.4.24" 816 | unpipe "1.0.0" 817 | 818 | rc@^1.0.1, rc@^1.1.6: 819 | version "1.2.8" 820 | resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed" 821 | integrity sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw== 822 | dependencies: 823 | deep-extend "^0.6.0" 824 | ini "~1.3.0" 825 | minimist "^1.2.0" 826 | strip-json-comments "~2.0.1" 827 | 828 | readdirp@~3.3.0: 829 | version "3.3.0" 830 | resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.3.0.tgz#984458d13a1e42e2e9f5841b129e162f369aff17" 831 | integrity sha512-zz0pAkSPOXXm1viEwygWIPSPkcBYjW1xU5j/JBh5t9bGCJwa6f9+BJa6VaB2g+b55yVrmXzqkyLf4xaWYM0IkQ== 832 | dependencies: 833 | picomatch "^2.0.7" 834 | 835 | registry-auth-token@^3.0.1: 836 | version "3.4.0" 837 | resolved "https://registry.yarnpkg.com/registry-auth-token/-/registry-auth-token-3.4.0.tgz#d7446815433f5d5ed6431cd5dca21048f66b397e" 838 | integrity sha512-4LM6Fw8eBQdwMYcES4yTnn2TqIasbXuwDx3um+QRs7S55aMKCBKBxvPXl2RiUjHwuJLTyYfxSpmfSAjQpcuP+A== 839 | dependencies: 840 | rc "^1.1.6" 841 | safe-buffer "^5.0.1" 842 | 843 | registry-url@^3.0.3: 844 | version "3.1.0" 845 | resolved "https://registry.yarnpkg.com/registry-url/-/registry-url-3.1.0.tgz#3d4ef870f73dde1d77f0cf9a381432444e174942" 846 | integrity sha1-PU74cPc93h138M+aOBQyRE4XSUI= 847 | dependencies: 848 | rc "^1.0.1" 849 | 850 | safe-buffer@5.1.2: 851 | version "5.1.2" 852 | resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" 853 | integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== 854 | 855 | safe-buffer@^5.0.1: 856 | version "5.2.0" 857 | resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.0.tgz#b74daec49b1148f88c64b68d49b1e815c1f2f519" 858 | integrity sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg== 859 | 860 | "safer-buffer@>= 2.1.2 < 3": 861 | version "2.1.2" 862 | resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" 863 | integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== 864 | 865 | semver-diff@^2.0.0: 866 | version "2.1.0" 867 | resolved "https://registry.yarnpkg.com/semver-diff/-/semver-diff-2.1.0.tgz#4bbb8437c8d37e4b0cf1a68fd726ec6d645d6d36" 868 | integrity sha1-S7uEN8jTfksM8aaP1ybsbWRdbTY= 869 | dependencies: 870 | semver "^5.0.3" 871 | 872 | semver@^5.0.3, semver@^5.1.0, semver@^5.7.1: 873 | version "5.7.1" 874 | resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" 875 | integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== 876 | 877 | send@0.17.1: 878 | version "0.17.1" 879 | resolved "https://registry.yarnpkg.com/send/-/send-0.17.1.tgz#c1d8b059f7900f7466dd4938bdc44e11ddb376c8" 880 | integrity sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg== 881 | dependencies: 882 | debug "2.6.9" 883 | depd "~1.1.2" 884 | destroy "~1.0.4" 885 | encodeurl "~1.0.2" 886 | escape-html "~1.0.3" 887 | etag "~1.8.1" 888 | fresh "0.5.2" 889 | http-errors "~1.7.2" 890 | mime "1.6.0" 891 | ms "2.1.1" 892 | on-finished "~2.3.0" 893 | range-parser "~1.2.1" 894 | statuses "~1.5.0" 895 | 896 | serve-static@1.14.1: 897 | version "1.14.1" 898 | resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.14.1.tgz#666e636dc4f010f7ef29970a88a674320898b2f9" 899 | integrity sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg== 900 | dependencies: 901 | encodeurl "~1.0.2" 902 | escape-html "~1.0.3" 903 | parseurl "~1.3.3" 904 | send "0.17.1" 905 | 906 | setprototypeof@1.1.1: 907 | version "1.1.1" 908 | resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.1.tgz#7e95acb24aa92f5885e0abef5ba131330d4ae683" 909 | integrity sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw== 910 | 911 | shebang-command@^1.2.0: 912 | version "1.2.0" 913 | resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea" 914 | integrity sha1-RKrGW2lbAzmJaMOfNj/uXer98eo= 915 | dependencies: 916 | shebang-regex "^1.0.0" 917 | 918 | shebang-regex@^1.0.0: 919 | version "1.0.0" 920 | resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" 921 | integrity sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM= 922 | 923 | signal-exit@^3.0.0, signal-exit@^3.0.2: 924 | version "3.0.2" 925 | resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d" 926 | integrity sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0= 927 | 928 | "statuses@>= 1.5.0 < 2", statuses@~1.5.0: 929 | version "1.5.0" 930 | resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c" 931 | integrity sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow= 932 | 933 | string-width@^2.0.0, string-width@^2.1.1: 934 | version "2.1.1" 935 | resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" 936 | integrity sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw== 937 | dependencies: 938 | is-fullwidth-code-point "^2.0.0" 939 | strip-ansi "^4.0.0" 940 | 941 | strip-ansi@^4.0.0: 942 | version "4.0.0" 943 | resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f" 944 | integrity sha1-qEeQIusaw2iocTibY1JixQXuNo8= 945 | dependencies: 946 | ansi-regex "^3.0.0" 947 | 948 | strip-eof@^1.0.0: 949 | version "1.0.0" 950 | resolved "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf" 951 | integrity sha1-u0P/VZim6wXYm1n80SnJgzE2Br8= 952 | 953 | strip-json-comments@~2.0.1: 954 | version "2.0.1" 955 | resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" 956 | integrity sha1-PFMZQukIwml8DsNEhYwobHygpgo= 957 | 958 | supports-color@^5.3.0, supports-color@^5.5.0: 959 | version "5.5.0" 960 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" 961 | integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== 962 | dependencies: 963 | has-flag "^3.0.0" 964 | 965 | term-size@^1.2.0: 966 | version "1.2.0" 967 | resolved "https://registry.yarnpkg.com/term-size/-/term-size-1.2.0.tgz#458b83887f288fc56d6fffbfad262e26638efa69" 968 | integrity sha1-RYuDiH8oj8Vtb/+/rSYuJmOO+mk= 969 | dependencies: 970 | execa "^0.7.0" 971 | 972 | timed-out@^4.0.0: 973 | version "4.0.1" 974 | resolved "https://registry.yarnpkg.com/timed-out/-/timed-out-4.0.1.tgz#f32eacac5a175bea25d7fab565ab3ed8741ef56f" 975 | integrity sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8= 976 | 977 | to-regex-range@^5.0.1: 978 | version "5.0.1" 979 | resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" 980 | integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== 981 | dependencies: 982 | is-number "^7.0.0" 983 | 984 | toidentifier@1.0.0: 985 | version "1.0.0" 986 | resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.0.tgz#7e1be3470f1e77948bc43d94a3c8f4d7752ba553" 987 | integrity sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw== 988 | 989 | touch@^3.1.0: 990 | version "3.1.0" 991 | resolved "https://registry.yarnpkg.com/touch/-/touch-3.1.0.tgz#fe365f5f75ec9ed4e56825e0bb76d24ab74af83b" 992 | integrity sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA== 993 | dependencies: 994 | nopt "~1.0.10" 995 | 996 | type-is@~1.6.17, type-is@~1.6.18: 997 | version "1.6.18" 998 | resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131" 999 | integrity sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g== 1000 | dependencies: 1001 | media-typer "0.3.0" 1002 | mime-types "~2.1.24" 1003 | 1004 | undefsafe@^2.0.2: 1005 | version "2.0.3" 1006 | resolved "https://registry.yarnpkg.com/undefsafe/-/undefsafe-2.0.3.tgz#6b166e7094ad46313b2202da7ecc2cd7cc6e7aae" 1007 | integrity sha512-nrXZwwXrD/T/JXeygJqdCO6NZZ1L66HrxM/Z7mIq2oPanoN0F1nLx3lwJMu6AwJY69hdixaFQOuoYsMjE5/C2A== 1008 | dependencies: 1009 | debug "^2.2.0" 1010 | 1011 | unique-string@^1.0.0: 1012 | version "1.0.0" 1013 | resolved "https://registry.yarnpkg.com/unique-string/-/unique-string-1.0.0.tgz#9e1057cca851abb93398f8b33ae187b99caec11a" 1014 | integrity sha1-nhBXzKhRq7kzmPizOuGHuZyuwRo= 1015 | dependencies: 1016 | crypto-random-string "^1.0.0" 1017 | 1018 | unpipe@1.0.0, unpipe@~1.0.0: 1019 | version "1.0.0" 1020 | resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" 1021 | integrity sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw= 1022 | 1023 | unzip-response@^2.0.1: 1024 | version "2.0.1" 1025 | resolved "https://registry.yarnpkg.com/unzip-response/-/unzip-response-2.0.1.tgz#d2f0f737d16b0615e72a6935ed04214572d56f97" 1026 | integrity sha1-0vD3N9FrBhXnKmk17QQhRXLVb5c= 1027 | 1028 | update-notifier@^2.5.0: 1029 | version "2.5.0" 1030 | resolved "https://registry.yarnpkg.com/update-notifier/-/update-notifier-2.5.0.tgz#d0744593e13f161e406acb1d9408b72cad08aff6" 1031 | integrity sha512-gwMdhgJHGuj/+wHJJs9e6PcCszpxR1b236igrOkUofGhqJuG+amlIKwApH1IW1WWl7ovZxsX49lMBWLxSdm5Dw== 1032 | dependencies: 1033 | boxen "^1.2.1" 1034 | chalk "^2.0.1" 1035 | configstore "^3.0.0" 1036 | import-lazy "^2.1.0" 1037 | is-ci "^1.0.10" 1038 | is-installed-globally "^0.1.0" 1039 | is-npm "^1.0.0" 1040 | latest-version "^3.0.0" 1041 | semver-diff "^2.0.0" 1042 | xdg-basedir "^3.0.0" 1043 | 1044 | url-parse-lax@^1.0.0: 1045 | version "1.0.0" 1046 | resolved "https://registry.yarnpkg.com/url-parse-lax/-/url-parse-lax-1.0.0.tgz#7af8f303645e9bd79a272e7a14ac68bc0609da73" 1047 | integrity sha1-evjzA2Rem9eaJy56FKxovAYJ2nM= 1048 | dependencies: 1049 | prepend-http "^1.0.1" 1050 | 1051 | utils-merge@1.0.1: 1052 | version "1.0.1" 1053 | resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" 1054 | integrity sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM= 1055 | 1056 | vary@~1.1.2: 1057 | version "1.1.2" 1058 | resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" 1059 | integrity sha1-IpnwLG3tMNSllhsLn3RSShj2NPw= 1060 | 1061 | which@^1.2.9: 1062 | version "1.3.1" 1063 | resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" 1064 | integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== 1065 | dependencies: 1066 | isexe "^2.0.0" 1067 | 1068 | widest-line@^2.0.0: 1069 | version "2.0.1" 1070 | resolved "https://registry.yarnpkg.com/widest-line/-/widest-line-2.0.1.tgz#7438764730ec7ef4381ce4df82fb98a53142a3fc" 1071 | integrity sha512-Ba5m9/Fa4Xt9eb2ELXt77JxVDV8w7qQrH0zS/TWSJdLyAwQjWoOzpzj5lwVftDz6n/EOu3tNACS84v509qwnJA== 1072 | dependencies: 1073 | string-width "^2.1.1" 1074 | 1075 | write-file-atomic@^2.0.0: 1076 | version "2.4.3" 1077 | resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-2.4.3.tgz#1fd2e9ae1df3e75b8d8c367443c692d4ca81f481" 1078 | integrity sha512-GaETH5wwsX+GcnzhPgKcKjJ6M2Cq3/iZp1WyY/X1CSqrW+jVNM9Y7D8EC2sM4ZG/V8wZlSniJnCKWPmBYAucRQ== 1079 | dependencies: 1080 | graceful-fs "^4.1.11" 1081 | imurmurhash "^0.1.4" 1082 | signal-exit "^3.0.2" 1083 | 1084 | xdg-basedir@^3.0.0: 1085 | version "3.0.0" 1086 | resolved "https://registry.yarnpkg.com/xdg-basedir/-/xdg-basedir-3.0.0.tgz#496b2cc109eca8dbacfe2dc72b603c17c5870ad4" 1087 | integrity sha1-SWsswQnsqNus/i3HK2A8F8WHCtQ= 1088 | 1089 | yallist@^2.1.2: 1090 | version "2.1.2" 1091 | resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52" 1092 | integrity sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI= 1093 | 1094 | yallist@^3.0.2: 1095 | version "3.1.1" 1096 | resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" 1097 | integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== 1098 | -------------------------------------------------------------------------------- /2-optimized-dockerfile/.dockerignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | -------------------------------------------------------------------------------- /2-optimized-dockerfile/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM node:20 2 | 3 | WORKDIR /app 4 | 5 | ADD package.json . 6 | ADD yarn.lock . 7 | RUN yarn install 8 | 9 | ADD . . 10 | 11 | ENTRYPOINT [ "node", "/app/index.js" ] 12 | -------------------------------------------------------------------------------- /2-optimized-dockerfile/Tiltfile: -------------------------------------------------------------------------------- 1 | # -*- mode: Python -* 2 | 3 | k8s_yaml('kubernetes.yaml') 4 | k8s_resource('example-nodejs', port_forwards=8000, 5 | resource_deps=['deploy'] 6 | ) 7 | 8 | # Records the current time, then kicks off a server update. 9 | # Normally, you would let Tilt do deploys automatically, but this 10 | # shows you how to set up a custom workflow that measures it. 11 | local_resource( 12 | 'deploy', 13 | 'python3 now.py > start-time.txt', 14 | ) 15 | 16 | docker_build('example-nodejs-image', '.') 17 | -------------------------------------------------------------------------------- /2-optimized-dockerfile/index.js: -------------------------------------------------------------------------------- 1 | /* 2 | Gratefully adapted from https://github.com/HemingwayLee/sample-mustache-express 3 | */ 4 | const fs = require('fs'); 5 | 6 | const express = require('express'); 7 | const app = express(); 8 | const mustacheExpress = require('mustache-express'); 9 | 10 | let timeSince = 'N/A'; 11 | 12 | app.engine('mustache', mustacheExpress()); 13 | 14 | app.set('view engine', 'mustache'); 15 | app.set('views', __dirname + '/views'); 16 | app.use(express.static('public')); 17 | 18 | app.get('/', (req, res) => { 19 | res.render('index.mustache', { 20 | time: timeSince, 21 | }); 22 | }); 23 | 24 | app.listen(8000, () => { 25 | timeSince = getSecsSinceDeploy(); 26 | console.log('Server running at http://localhost:8000/'); 27 | }); 28 | 29 | function getSecsSinceDeploy() { 30 | let curTimeMs = new Date().getTime(); 31 | let contents = fs.readFileSync('/app/start-time.txt', 'utf8'); 32 | let startTimeMs = parseInt(contents.trim()) / 10**6; 33 | return ((curTimeMs - startTimeMs) / 10**3).toFixed(2) 34 | } 35 | -------------------------------------------------------------------------------- /2-optimized-dockerfile/kubernetes.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: apps/v1 2 | kind: Deployment 3 | metadata: 4 | name: example-nodejs 5 | labels: 6 | app: example-nodejs 7 | spec: 8 | selector: 9 | matchLabels: 10 | app: example-nodejs 11 | template: 12 | metadata: 13 | labels: 14 | app: example-nodejs 15 | spec: 16 | containers: 17 | - name: example-nodejs 18 | image: example-nodejs-image 19 | ports: 20 | - containerPort: 8000 21 | -------------------------------------------------------------------------------- /2-optimized-dockerfile/now.py: -------------------------------------------------------------------------------- 1 | import time 2 | 3 | print("%d" % (float(time.time()) * 1000 * 1000 * 1000)) -------------------------------------------------------------------------------- /2-optimized-dockerfile/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "tilt-example-nodejs", 3 | "version": "1.0.0", 4 | "main": "index.js", 5 | "license": "MIT", 6 | "dependencies": { 7 | "express": "^4.17.1", 8 | "immutable": "^3.8.2", 9 | "mustache-express": "^1.3.0" 10 | }, 11 | "devDependencies": {} 12 | } 13 | -------------------------------------------------------------------------------- /2-optimized-dockerfile/public/pets.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tilt-dev/tilt-example-nodejs/d81e0ca6f7866cfddcea0094943abdb9fb16b5ee/2-optimized-dockerfile/public/pets.png -------------------------------------------------------------------------------- /2-optimized-dockerfile/views/index.mustache: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 |
5 | 6 |
Hello cats!
7 |
Time from "deploy" button pressed → server up: {{time}}s
8 |
9 | 10 | 11 | -------------------------------------------------------------------------------- /2-optimized-dockerfile/yarn.lock: -------------------------------------------------------------------------------- 1 | # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. 2 | # yarn lockfile v1 3 | 4 | 5 | accepts@~1.3.7: 6 | version "1.3.7" 7 | resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.7.tgz#531bc726517a3b2b41f850021c6cc15eaab507cd" 8 | integrity sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA== 9 | dependencies: 10 | mime-types "~2.1.24" 11 | negotiator "0.6.2" 12 | 13 | array-flatten@1.1.1: 14 | version "1.1.1" 15 | resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2" 16 | integrity sha1-ml9pkFGx5wczKPKgCJaLZOopVdI= 17 | 18 | async@~3.1.0: 19 | version "3.1.1" 20 | resolved "https://registry.yarnpkg.com/async/-/async-3.1.1.tgz#dd3542db03de837979c9ebbca64ca01b06dc98df" 21 | integrity sha512-X5Dj8hK1pJNC2Wzo2Rcp9FBVdJMGRR/S7V+lH46s8GVFhtbo5O4Le5GECCF/8PISVdkUA6mMPvgz7qTTD1rf1g== 22 | 23 | body-parser@1.19.0: 24 | version "1.19.0" 25 | resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.19.0.tgz#96b2709e57c9c4e09a6fd66a8fd979844f69f08a" 26 | integrity sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw== 27 | dependencies: 28 | bytes "3.1.0" 29 | content-type "~1.0.4" 30 | debug "2.6.9" 31 | depd "~1.1.2" 32 | http-errors "1.7.2" 33 | iconv-lite "0.4.24" 34 | on-finished "~2.3.0" 35 | qs "6.7.0" 36 | raw-body "2.4.0" 37 | type-is "~1.6.17" 38 | 39 | bytes@3.1.0: 40 | version "3.1.0" 41 | resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.0.tgz#f6cf7933a360e0588fa9fde85651cdc7f805d1f6" 42 | integrity sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg== 43 | 44 | content-disposition@0.5.3: 45 | version "0.5.3" 46 | resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.3.tgz#e130caf7e7279087c5616c2007d0485698984fbd" 47 | integrity sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g== 48 | dependencies: 49 | safe-buffer "5.1.2" 50 | 51 | content-type@~1.0.4: 52 | version "1.0.4" 53 | resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.4.tgz#e138cc75e040c727b1966fe5e5f8c9aee256fe3b" 54 | integrity sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA== 55 | 56 | cookie-signature@1.0.6: 57 | version "1.0.6" 58 | resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c" 59 | integrity sha1-4wOogrNCzD7oylE6eZmXNNqzriw= 60 | 61 | cookie@0.4.0: 62 | version "0.4.0" 63 | resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.4.0.tgz#beb437e7022b3b6d49019d088665303ebe9c14ba" 64 | integrity sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg== 65 | 66 | debug@2.6.9: 67 | version "2.6.9" 68 | resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" 69 | integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== 70 | dependencies: 71 | ms "2.0.0" 72 | 73 | depd@~1.1.2: 74 | version "1.1.2" 75 | resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9" 76 | integrity sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak= 77 | 78 | destroy@~1.0.4: 79 | version "1.0.4" 80 | resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.0.4.tgz#978857442c44749e4206613e37946205826abd80" 81 | integrity sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA= 82 | 83 | ee-first@1.1.1: 84 | version "1.1.1" 85 | resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" 86 | integrity sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0= 87 | 88 | encodeurl@~1.0.2: 89 | version "1.0.2" 90 | resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" 91 | integrity sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k= 92 | 93 | escape-html@~1.0.3: 94 | version "1.0.3" 95 | resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" 96 | integrity sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg= 97 | 98 | etag@~1.8.1: 99 | version "1.8.1" 100 | resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" 101 | integrity sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc= 102 | 103 | express@^4.17.1: 104 | version "4.17.1" 105 | resolved "https://registry.yarnpkg.com/express/-/express-4.17.1.tgz#4491fc38605cf51f8629d39c2b5d026f98a4c134" 106 | integrity sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g== 107 | dependencies: 108 | accepts "~1.3.7" 109 | array-flatten "1.1.1" 110 | body-parser "1.19.0" 111 | content-disposition "0.5.3" 112 | content-type "~1.0.4" 113 | cookie "0.4.0" 114 | cookie-signature "1.0.6" 115 | debug "2.6.9" 116 | depd "~1.1.2" 117 | encodeurl "~1.0.2" 118 | escape-html "~1.0.3" 119 | etag "~1.8.1" 120 | finalhandler "~1.1.2" 121 | fresh "0.5.2" 122 | merge-descriptors "1.0.1" 123 | methods "~1.1.2" 124 | on-finished "~2.3.0" 125 | parseurl "~1.3.3" 126 | path-to-regexp "0.1.7" 127 | proxy-addr "~2.0.5" 128 | qs "6.7.0" 129 | range-parser "~1.2.1" 130 | safe-buffer "5.1.2" 131 | send "0.17.1" 132 | serve-static "1.14.1" 133 | setprototypeof "1.1.1" 134 | statuses "~1.5.0" 135 | type-is "~1.6.18" 136 | utils-merge "1.0.1" 137 | vary "~1.1.2" 138 | 139 | finalhandler@~1.1.2: 140 | version "1.1.2" 141 | resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.1.2.tgz#b7e7d000ffd11938d0fdb053506f6ebabe9f587d" 142 | integrity sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA== 143 | dependencies: 144 | debug "2.6.9" 145 | encodeurl "~1.0.2" 146 | escape-html "~1.0.3" 147 | on-finished "~2.3.0" 148 | parseurl "~1.3.3" 149 | statuses "~1.5.0" 150 | unpipe "~1.0.0" 151 | 152 | forwarded@~0.1.2: 153 | version "0.1.2" 154 | resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.1.2.tgz#98c23dab1175657b8c0573e8ceccd91b0ff18c84" 155 | integrity sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ= 156 | 157 | fresh@0.5.2: 158 | version "0.5.2" 159 | resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" 160 | integrity sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac= 161 | 162 | http-errors@1.7.2: 163 | version "1.7.2" 164 | resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.7.2.tgz#4f5029cf13239f31036e5b2e55292bcfbcc85c8f" 165 | integrity sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg== 166 | dependencies: 167 | depd "~1.1.2" 168 | inherits "2.0.3" 169 | setprototypeof "1.1.1" 170 | statuses ">= 1.5.0 < 2" 171 | toidentifier "1.0.0" 172 | 173 | http-errors@~1.7.2: 174 | version "1.7.3" 175 | resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.7.3.tgz#6c619e4f9c60308c38519498c14fbb10aacebb06" 176 | integrity sha512-ZTTX0MWrsQ2ZAhA1cejAwDLycFsd7I7nVtnkT3Ol0aqodaKW+0CTZDQ1uBv5whptCnc8e8HeRRJxRs0kmm/Qfw== 177 | dependencies: 178 | depd "~1.1.2" 179 | inherits "2.0.4" 180 | setprototypeof "1.1.1" 181 | statuses ">= 1.5.0 < 2" 182 | toidentifier "1.0.0" 183 | 184 | iconv-lite@0.4.24: 185 | version "0.4.24" 186 | resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" 187 | integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== 188 | dependencies: 189 | safer-buffer ">= 2.1.2 < 3" 190 | 191 | immutable@^3.8.2: 192 | version "3.8.2" 193 | resolved "https://registry.yarnpkg.com/immutable/-/immutable-3.8.2.tgz#c2439951455bb39913daf281376f1530e104adf3" 194 | integrity sha1-wkOZUUVbs5kT2vKBN28VMOEErfM= 195 | 196 | inherits@2.0.3: 197 | version "2.0.3" 198 | resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" 199 | integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4= 200 | 201 | inherits@2.0.4: 202 | version "2.0.4" 203 | resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" 204 | integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== 205 | 206 | ipaddr.js@1.9.1: 207 | version "1.9.1" 208 | resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.1.tgz#bff38543eeb8984825079ff3a2a8e6cbd46781b3" 209 | integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g== 210 | 211 | lru-cache@~5.1.1: 212 | version "5.1.1" 213 | resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920" 214 | integrity sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w== 215 | dependencies: 216 | yallist "^3.0.2" 217 | 218 | media-typer@0.3.0: 219 | version "0.3.0" 220 | resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" 221 | integrity sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g= 222 | 223 | merge-descriptors@1.0.1: 224 | version "1.0.1" 225 | resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61" 226 | integrity sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E= 227 | 228 | methods@~1.1.2: 229 | version "1.1.2" 230 | resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" 231 | integrity sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4= 232 | 233 | mime-db@1.43.0: 234 | version "1.43.0" 235 | resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.43.0.tgz#0a12e0502650e473d735535050e7c8f4eb4fae58" 236 | integrity sha512-+5dsGEEovYbT8UY9yD7eE4XTc4UwJ1jBYlgaQQF38ENsKR3wj/8q8RFZrF9WIZpB2V1ArTVFUva8sAul1NzRzQ== 237 | 238 | mime-types@~2.1.24: 239 | version "2.1.26" 240 | resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.26.tgz#9c921fc09b7e149a65dfdc0da4d20997200b0a06" 241 | integrity sha512-01paPWYgLrkqAyrlDorC1uDwl2p3qZT7yl806vW7DvDoxwXi46jsjFbg+WdwotBIk6/MbEhO/dh5aZ5sNj/dWQ== 242 | dependencies: 243 | mime-db "1.43.0" 244 | 245 | mime@1.6.0: 246 | version "1.6.0" 247 | resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" 248 | integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== 249 | 250 | ms@2.0.0: 251 | version "2.0.0" 252 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" 253 | integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g= 254 | 255 | ms@2.1.1: 256 | version "2.1.1" 257 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.1.tgz#30a5864eb3ebb0a66f2ebe6d727af06a09d86e0a" 258 | integrity sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg== 259 | 260 | mustache-express@^1.3.0: 261 | version "1.3.0" 262 | resolved "https://registry.yarnpkg.com/mustache-express/-/mustache-express-1.3.0.tgz#91d67121e3553d42d6c995f4c32793db89492493" 263 | integrity sha512-JWG8Rzxh9tpoLEH0NZ2u/caDiwhIkW+50IOBrcO+lHya3tCYj41bYPDEHCxPbKXvPrSyMNpI6ly4xdU2zpNQtg== 264 | dependencies: 265 | async "~3.1.0" 266 | lru-cache "~5.1.1" 267 | mustache "^3.1.0" 268 | 269 | mustache@^3.1.0: 270 | version "3.2.1" 271 | resolved "https://registry.yarnpkg.com/mustache/-/mustache-3.2.1.tgz#89e78a9d207d78f2799b1e95764a25bf71a28322" 272 | integrity sha512-RERvMFdLpaFfSRIEe632yDm5nsd0SDKn8hGmcUwswnyiE5mtdZLDybtHAz6hjJhawokF0hXvGLtx9mrQfm6FkA== 273 | 274 | negotiator@0.6.2: 275 | version "0.6.2" 276 | resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.2.tgz#feacf7ccf525a77ae9634436a64883ffeca346fb" 277 | integrity sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw== 278 | 279 | on-finished@~2.3.0: 280 | version "2.3.0" 281 | resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947" 282 | integrity sha1-IPEzZIGwg811M3mSoWlxqi2QaUc= 283 | dependencies: 284 | ee-first "1.1.1" 285 | 286 | parseurl@~1.3.3: 287 | version "1.3.3" 288 | resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4" 289 | integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ== 290 | 291 | path-to-regexp@0.1.7: 292 | version "0.1.7" 293 | resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c" 294 | integrity sha1-32BBeABfUi8V60SQ5yR6G/qmf4w= 295 | 296 | proxy-addr@~2.0.5: 297 | version "2.0.6" 298 | resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.6.tgz#fdc2336505447d3f2f2c638ed272caf614bbb2bf" 299 | integrity sha512-dh/frvCBVmSsDYzw6n926jv974gddhkFPfiN8hPOi30Wax25QZyZEGveluCgliBnqmuM+UJmBErbAUFIoDbjOw== 300 | dependencies: 301 | forwarded "~0.1.2" 302 | ipaddr.js "1.9.1" 303 | 304 | qs@6.7.0: 305 | version "6.7.0" 306 | resolved "https://registry.yarnpkg.com/qs/-/qs-6.7.0.tgz#41dc1a015e3d581f1621776be31afb2876a9b1bc" 307 | integrity sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ== 308 | 309 | range-parser@~1.2.1: 310 | version "1.2.1" 311 | resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031" 312 | integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== 313 | 314 | raw-body@2.4.0: 315 | version "2.4.0" 316 | resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.4.0.tgz#a1ce6fb9c9bc356ca52e89256ab59059e13d0332" 317 | integrity sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q== 318 | dependencies: 319 | bytes "3.1.0" 320 | http-errors "1.7.2" 321 | iconv-lite "0.4.24" 322 | unpipe "1.0.0" 323 | 324 | safe-buffer@5.1.2: 325 | version "5.1.2" 326 | resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" 327 | integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== 328 | 329 | "safer-buffer@>= 2.1.2 < 3": 330 | version "2.1.2" 331 | resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" 332 | integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== 333 | 334 | send@0.17.1: 335 | version "0.17.1" 336 | resolved "https://registry.yarnpkg.com/send/-/send-0.17.1.tgz#c1d8b059f7900f7466dd4938bdc44e11ddb376c8" 337 | integrity sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg== 338 | dependencies: 339 | debug "2.6.9" 340 | depd "~1.1.2" 341 | destroy "~1.0.4" 342 | encodeurl "~1.0.2" 343 | escape-html "~1.0.3" 344 | etag "~1.8.1" 345 | fresh "0.5.2" 346 | http-errors "~1.7.2" 347 | mime "1.6.0" 348 | ms "2.1.1" 349 | on-finished "~2.3.0" 350 | range-parser "~1.2.1" 351 | statuses "~1.5.0" 352 | 353 | serve-static@1.14.1: 354 | version "1.14.1" 355 | resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.14.1.tgz#666e636dc4f010f7ef29970a88a674320898b2f9" 356 | integrity sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg== 357 | dependencies: 358 | encodeurl "~1.0.2" 359 | escape-html "~1.0.3" 360 | parseurl "~1.3.3" 361 | send "0.17.1" 362 | 363 | setprototypeof@1.1.1: 364 | version "1.1.1" 365 | resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.1.tgz#7e95acb24aa92f5885e0abef5ba131330d4ae683" 366 | integrity sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw== 367 | 368 | "statuses@>= 1.5.0 < 2", statuses@~1.5.0: 369 | version "1.5.0" 370 | resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c" 371 | integrity sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow= 372 | 373 | toidentifier@1.0.0: 374 | version "1.0.0" 375 | resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.0.tgz#7e1be3470f1e77948bc43d94a3c8f4d7752ba553" 376 | integrity sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw== 377 | 378 | type-is@~1.6.17, type-is@~1.6.18: 379 | version "1.6.18" 380 | resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131" 381 | integrity sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g== 382 | dependencies: 383 | media-typer "0.3.0" 384 | mime-types "~2.1.24" 385 | 386 | unpipe@1.0.0, unpipe@~1.0.0: 387 | version "1.0.0" 388 | resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" 389 | integrity sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw= 390 | 391 | utils-merge@1.0.1: 392 | version "1.0.1" 393 | resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" 394 | integrity sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM= 395 | 396 | vary@~1.1.2: 397 | version "1.1.2" 398 | resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" 399 | integrity sha1-IpnwLG3tMNSllhsLn3RSShj2NPw= 400 | 401 | yallist@^3.0.2: 402 | version "3.1.1" 403 | resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" 404 | integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== 405 | -------------------------------------------------------------------------------- /3-recommended/.dockerignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | -------------------------------------------------------------------------------- /3-recommended/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM node:20 2 | 3 | # Default value; will be overridden by build_args, if passed 4 | ARG node_env=production 5 | 6 | ENV NODE_ENV $node_env 7 | 8 | WORKDIR /app 9 | 10 | ADD package.json . 11 | ADD yarn.lock . 12 | RUN yarn install 13 | 14 | ADD . . 15 | 16 | ENTRYPOINT [ "node", "/app/index.js" ] 17 | -------------------------------------------------------------------------------- /3-recommended/Tiltfile: -------------------------------------------------------------------------------- 1 | # -*- mode: Python -* 2 | 3 | k8s_yaml('kubernetes.yaml') 4 | k8s_resource('example-nodejs', port_forwards=8000, 5 | resource_deps=['deploy'] 6 | ) 7 | 8 | # Records the current time, then kicks off a server update. 9 | # Normally, you would let Tilt do deploys automatically, but this 10 | # shows you how to set up a custom workflow that measures it. 11 | local_resource( 12 | 'deploy', 13 | 'python3 now.py > start-time.txt', 14 | ) 15 | 16 | # Add a live_update rule to our docker_build 17 | congrats = "🎉 Congrats, you ran a live_update! 🎉" 18 | docker_build('example-nodejs-image', '.', 19 | build_args={'node_env': 'development'}, 20 | entrypoint='yarn run nodemon --ext js,mustache /app/index.js', 21 | live_update=[ 22 | sync('.', '/app'), 23 | run('cd /app && yarn install', trigger=['./package.json', './yarn.lock']), 24 | 25 | # if all that changed was start-time.txt, make sure the server 26 | # reloads so that it will reflect the new startup time 27 | run('touch /app/index.js', trigger='./start-time.txt'), 28 | 29 | # add a congrats message! 30 | run('sed -i "s/Hello cats!/{}/g" /app/views/index.mustache'. 31 | format(congrats)), 32 | ]) 33 | -------------------------------------------------------------------------------- /3-recommended/index.js: -------------------------------------------------------------------------------- 1 | /* 2 | Gratefully adapted from https://github.com/HemingwayLee/sample-mustache-express 3 | */ 4 | const fs = require('fs'); 5 | 6 | const express = require('express'); 7 | const app = express(); 8 | const mustacheExpress = require('mustache-express'); 9 | 10 | let timeSince = 'N/A'; 11 | 12 | app.engine('mustache', mustacheExpress()); 13 | 14 | app.set('view engine', 'mustache'); 15 | app.set('views', __dirname + '/views'); 16 | app.use(express.static('public')); 17 | 18 | app.get('/', (req, res) => { 19 | res.render('index.mustache', { 20 | time: timeSince, 21 | }); 22 | }); 23 | 24 | app.listen(8000, () => { 25 | timeSince = getSecsSinceDeploy(); 26 | console.log('Server running at http://localhost:8000/'); 27 | }); 28 | 29 | function getSecsSinceDeploy() { 30 | let curTimeMs = new Date().getTime(); 31 | let contents = fs.readFileSync('/app/start-time.txt', 'utf8'); 32 | let startTimeMs = parseInt(contents.trim()) / 10**6; 33 | return ((curTimeMs - startTimeMs) / 10**3).toFixed(2) 34 | } 35 | -------------------------------------------------------------------------------- /3-recommended/kubernetes.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: apps/v1 2 | kind: Deployment 3 | metadata: 4 | name: example-nodejs 5 | labels: 6 | app: example-nodejs 7 | spec: 8 | selector: 9 | matchLabels: 10 | app: example-nodejs 11 | template: 12 | metadata: 13 | labels: 14 | app: example-nodejs 15 | spec: 16 | containers: 17 | - name: example-nodejs 18 | image: example-nodejs-image 19 | ports: 20 | - containerPort: 8000 21 | -------------------------------------------------------------------------------- /3-recommended/now.py: -------------------------------------------------------------------------------- 1 | import time 2 | 3 | print("%d" % (float(time.time()) * 1000 * 1000 * 1000)) -------------------------------------------------------------------------------- /3-recommended/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "tilt-example-nodejs", 3 | "version": "1.0.0", 4 | "main": "index.js", 5 | "license": "MIT", 6 | "dependencies": { 7 | "express": "^4.17.1", 8 | "immutable": "^3.8.2", 9 | "mustache-express": "^1.3.0" 10 | }, 11 | "devDependencies": { 12 | "nodemon": "^2.0.2" 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /3-recommended/public/pets.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tilt-dev/tilt-example-nodejs/d81e0ca6f7866cfddcea0094943abdb9fb16b5ee/3-recommended/public/pets.png -------------------------------------------------------------------------------- /3-recommended/views/index.mustache: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 |
5 | 6 |
Hello cats!
7 |
Time from "deploy" button pressed → server up: {{time}}s
8 |
9 | 10 | 11 | -------------------------------------------------------------------------------- /3-recommended/yarn.lock: -------------------------------------------------------------------------------- 1 | # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. 2 | # yarn lockfile v1 3 | 4 | 5 | abbrev@1: 6 | version "1.1.1" 7 | resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" 8 | integrity sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q== 9 | 10 | accepts@~1.3.7: 11 | version "1.3.7" 12 | resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.7.tgz#531bc726517a3b2b41f850021c6cc15eaab507cd" 13 | integrity sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA== 14 | dependencies: 15 | mime-types "~2.1.24" 16 | negotiator "0.6.2" 17 | 18 | ansi-align@^2.0.0: 19 | version "2.0.0" 20 | resolved "https://registry.yarnpkg.com/ansi-align/-/ansi-align-2.0.0.tgz#c36aeccba563b89ceb556f3690f0b1d9e3547f7f" 21 | integrity sha1-w2rsy6VjuJzrVW82kPCx2eNUf38= 22 | dependencies: 23 | string-width "^2.0.0" 24 | 25 | ansi-regex@^3.0.0: 26 | version "3.0.0" 27 | resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998" 28 | integrity sha1-7QMXwyIGT3lGbAKWa922Bas32Zg= 29 | 30 | ansi-styles@^3.2.1: 31 | version "3.2.1" 32 | resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" 33 | integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== 34 | dependencies: 35 | color-convert "^1.9.0" 36 | 37 | anymatch@~3.1.1: 38 | version "3.1.1" 39 | resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.1.tgz#c55ecf02185e2469259399310c173ce31233b142" 40 | integrity sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg== 41 | dependencies: 42 | normalize-path "^3.0.0" 43 | picomatch "^2.0.4" 44 | 45 | array-flatten@1.1.1: 46 | version "1.1.1" 47 | resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2" 48 | integrity sha1-ml9pkFGx5wczKPKgCJaLZOopVdI= 49 | 50 | async@~3.1.0: 51 | version "3.1.1" 52 | resolved "https://registry.yarnpkg.com/async/-/async-3.1.1.tgz#dd3542db03de837979c9ebbca64ca01b06dc98df" 53 | integrity sha512-X5Dj8hK1pJNC2Wzo2Rcp9FBVdJMGRR/S7V+lH46s8GVFhtbo5O4Le5GECCF/8PISVdkUA6mMPvgz7qTTD1rf1g== 54 | 55 | balanced-match@^1.0.0: 56 | version "1.0.0" 57 | resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" 58 | integrity sha1-ibTRmasr7kneFk6gK4nORi1xt2c= 59 | 60 | binary-extensions@^2.0.0: 61 | version "2.0.0" 62 | resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.0.0.tgz#23c0df14f6a88077f5f986c0d167ec03c3d5537c" 63 | integrity sha512-Phlt0plgpIIBOGTT/ehfFnbNlfsDEiqmzE2KRXoX1bLIlir4X/MR+zSyBEkL05ffWgnRSf/DXv+WrUAVr93/ow== 64 | 65 | body-parser@1.19.0: 66 | version "1.19.0" 67 | resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.19.0.tgz#96b2709e57c9c4e09a6fd66a8fd979844f69f08a" 68 | integrity sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw== 69 | dependencies: 70 | bytes "3.1.0" 71 | content-type "~1.0.4" 72 | debug "2.6.9" 73 | depd "~1.1.2" 74 | http-errors "1.7.2" 75 | iconv-lite "0.4.24" 76 | on-finished "~2.3.0" 77 | qs "6.7.0" 78 | raw-body "2.4.0" 79 | type-is "~1.6.17" 80 | 81 | boxen@^1.2.1: 82 | version "1.3.0" 83 | resolved "https://registry.yarnpkg.com/boxen/-/boxen-1.3.0.tgz#55c6c39a8ba58d9c61ad22cd877532deb665a20b" 84 | integrity sha512-TNPjfTr432qx7yOjQyaXm3dSR0MH9vXp7eT1BFSl/C51g+EFnOR9hTg1IreahGBmDNCehscshe45f+C1TBZbLw== 85 | dependencies: 86 | ansi-align "^2.0.0" 87 | camelcase "^4.0.0" 88 | chalk "^2.0.1" 89 | cli-boxes "^1.0.0" 90 | string-width "^2.0.0" 91 | term-size "^1.2.0" 92 | widest-line "^2.0.0" 93 | 94 | brace-expansion@^1.1.7: 95 | version "1.1.11" 96 | resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" 97 | integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== 98 | dependencies: 99 | balanced-match "^1.0.0" 100 | concat-map "0.0.1" 101 | 102 | braces@~3.0.2: 103 | version "3.0.2" 104 | resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" 105 | integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== 106 | dependencies: 107 | fill-range "^7.0.1" 108 | 109 | bytes@3.1.0: 110 | version "3.1.0" 111 | resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.0.tgz#f6cf7933a360e0588fa9fde85651cdc7f805d1f6" 112 | integrity sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg== 113 | 114 | camelcase@^4.0.0: 115 | version "4.1.0" 116 | resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-4.1.0.tgz#d545635be1e33c542649c69173e5de6acfae34dd" 117 | integrity sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0= 118 | 119 | capture-stack-trace@^1.0.0: 120 | version "1.0.1" 121 | resolved "https://registry.yarnpkg.com/capture-stack-trace/-/capture-stack-trace-1.0.1.tgz#a6c0bbe1f38f3aa0b92238ecb6ff42c344d4135d" 122 | integrity sha512-mYQLZnx5Qt1JgB1WEiMCf2647plpGeQ2NMR/5L0HNZzGQo4fuSPnK+wjfPnKZV0aiJDgzmWqqkV/g7JD+DW0qw== 123 | 124 | chalk@^2.0.1: 125 | version "2.4.2" 126 | resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" 127 | integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== 128 | dependencies: 129 | ansi-styles "^3.2.1" 130 | escape-string-regexp "^1.0.5" 131 | supports-color "^5.3.0" 132 | 133 | chokidar@^3.2.2: 134 | version "3.3.1" 135 | resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.3.1.tgz#c84e5b3d18d9a4d77558fef466b1bf16bbeb3450" 136 | integrity sha512-4QYCEWOcK3OJrxwvyyAOxFuhpvOVCYkr33LPfFNBjAD/w3sEzWsp2BUOkI4l9bHvWioAd0rc6NlHUOEaWkTeqg== 137 | dependencies: 138 | anymatch "~3.1.1" 139 | braces "~3.0.2" 140 | glob-parent "~5.1.0" 141 | is-binary-path "~2.1.0" 142 | is-glob "~4.0.1" 143 | normalize-path "~3.0.0" 144 | readdirp "~3.3.0" 145 | optionalDependencies: 146 | fsevents "~2.1.2" 147 | 148 | ci-info@^1.5.0: 149 | version "1.6.0" 150 | resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-1.6.0.tgz#2ca20dbb9ceb32d4524a683303313f0304b1e497" 151 | integrity sha512-vsGdkwSCDpWmP80ncATX7iea5DWQemg1UgCW5J8tqjU3lYw4FBYuj89J0CTVomA7BEfvSZd84GmHko+MxFQU2A== 152 | 153 | cli-boxes@^1.0.0: 154 | version "1.0.0" 155 | resolved "https://registry.yarnpkg.com/cli-boxes/-/cli-boxes-1.0.0.tgz#4fa917c3e59c94a004cd61f8ee509da651687143" 156 | integrity sha1-T6kXw+WclKAEzWH47lCdplFocUM= 157 | 158 | color-convert@^1.9.0: 159 | version "1.9.3" 160 | resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" 161 | integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== 162 | dependencies: 163 | color-name "1.1.3" 164 | 165 | color-name@1.1.3: 166 | version "1.1.3" 167 | resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" 168 | integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU= 169 | 170 | concat-map@0.0.1: 171 | version "0.0.1" 172 | resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" 173 | integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= 174 | 175 | configstore@^3.0.0: 176 | version "3.1.2" 177 | resolved "https://registry.yarnpkg.com/configstore/-/configstore-3.1.2.tgz#c6f25defaeef26df12dd33414b001fe81a543f8f" 178 | integrity sha512-vtv5HtGjcYUgFrXc6Kx747B83MRRVS5R1VTEQoXvuP+kMI+if6uywV0nDGoiydJRy4yk7h9od5Og0kxx4zUXmw== 179 | dependencies: 180 | dot-prop "^4.1.0" 181 | graceful-fs "^4.1.2" 182 | make-dir "^1.0.0" 183 | unique-string "^1.0.0" 184 | write-file-atomic "^2.0.0" 185 | xdg-basedir "^3.0.0" 186 | 187 | content-disposition@0.5.3: 188 | version "0.5.3" 189 | resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.3.tgz#e130caf7e7279087c5616c2007d0485698984fbd" 190 | integrity sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g== 191 | dependencies: 192 | safe-buffer "5.1.2" 193 | 194 | content-type@~1.0.4: 195 | version "1.0.4" 196 | resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.4.tgz#e138cc75e040c727b1966fe5e5f8c9aee256fe3b" 197 | integrity sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA== 198 | 199 | cookie-signature@1.0.6: 200 | version "1.0.6" 201 | resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c" 202 | integrity sha1-4wOogrNCzD7oylE6eZmXNNqzriw= 203 | 204 | cookie@0.4.0: 205 | version "0.4.0" 206 | resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.4.0.tgz#beb437e7022b3b6d49019d088665303ebe9c14ba" 207 | integrity sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg== 208 | 209 | create-error-class@^3.0.0: 210 | version "3.0.2" 211 | resolved "https://registry.yarnpkg.com/create-error-class/-/create-error-class-3.0.2.tgz#06be7abef947a3f14a30fd610671d401bca8b7b6" 212 | integrity sha1-Br56vvlHo/FKMP1hBnHUAbyot7Y= 213 | dependencies: 214 | capture-stack-trace "^1.0.0" 215 | 216 | cross-spawn@^5.0.1: 217 | version "5.1.0" 218 | resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-5.1.0.tgz#e8bd0efee58fcff6f8f94510a0a554bbfa235449" 219 | integrity sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk= 220 | dependencies: 221 | lru-cache "^4.0.1" 222 | shebang-command "^1.2.0" 223 | which "^1.2.9" 224 | 225 | crypto-random-string@^1.0.0: 226 | version "1.0.0" 227 | resolved "https://registry.yarnpkg.com/crypto-random-string/-/crypto-random-string-1.0.0.tgz#a230f64f568310e1498009940790ec99545bca7e" 228 | integrity sha1-ojD2T1aDEOFJgAmUB5DsmVRbyn4= 229 | 230 | debug@2.6.9, debug@^2.2.0: 231 | version "2.6.9" 232 | resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" 233 | integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== 234 | dependencies: 235 | ms "2.0.0" 236 | 237 | debug@^3.2.6: 238 | version "3.2.6" 239 | resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.6.tgz#e83d17de16d8a7efb7717edbe5fb10135eee629b" 240 | integrity sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ== 241 | dependencies: 242 | ms "^2.1.1" 243 | 244 | deep-extend@^0.6.0: 245 | version "0.6.0" 246 | resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac" 247 | integrity sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA== 248 | 249 | depd@~1.1.2: 250 | version "1.1.2" 251 | resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9" 252 | integrity sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak= 253 | 254 | destroy@~1.0.4: 255 | version "1.0.4" 256 | resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.0.4.tgz#978857442c44749e4206613e37946205826abd80" 257 | integrity sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA= 258 | 259 | dot-prop@^4.1.0: 260 | version "4.2.0" 261 | resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-4.2.0.tgz#1f19e0c2e1aa0e32797c49799f2837ac6af69c57" 262 | integrity sha512-tUMXrxlExSW6U2EXiiKGSBVdYgtV8qlHL+C10TsW4PURY/ic+eaysnSkwB4kA/mBlCyy/IKDJ+Lc3wbWeaXtuQ== 263 | dependencies: 264 | is-obj "^1.0.0" 265 | 266 | duplexer3@^0.1.4: 267 | version "0.1.4" 268 | resolved "https://registry.yarnpkg.com/duplexer3/-/duplexer3-0.1.4.tgz#ee01dd1cac0ed3cbc7fdbea37dc0a8f1ce002ce2" 269 | integrity sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI= 270 | 271 | ee-first@1.1.1: 272 | version "1.1.1" 273 | resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" 274 | integrity sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0= 275 | 276 | encodeurl@~1.0.2: 277 | version "1.0.2" 278 | resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" 279 | integrity sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k= 280 | 281 | escape-html@~1.0.3: 282 | version "1.0.3" 283 | resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" 284 | integrity sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg= 285 | 286 | escape-string-regexp@^1.0.5: 287 | version "1.0.5" 288 | resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" 289 | integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= 290 | 291 | etag@~1.8.1: 292 | version "1.8.1" 293 | resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" 294 | integrity sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc= 295 | 296 | execa@^0.7.0: 297 | version "0.7.0" 298 | resolved "https://registry.yarnpkg.com/execa/-/execa-0.7.0.tgz#944becd34cc41ee32a63a9faf27ad5a65fc59777" 299 | integrity sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c= 300 | dependencies: 301 | cross-spawn "^5.0.1" 302 | get-stream "^3.0.0" 303 | is-stream "^1.1.0" 304 | npm-run-path "^2.0.0" 305 | p-finally "^1.0.0" 306 | signal-exit "^3.0.0" 307 | strip-eof "^1.0.0" 308 | 309 | express@^4.17.1: 310 | version "4.17.1" 311 | resolved "https://registry.yarnpkg.com/express/-/express-4.17.1.tgz#4491fc38605cf51f8629d39c2b5d026f98a4c134" 312 | integrity sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g== 313 | dependencies: 314 | accepts "~1.3.7" 315 | array-flatten "1.1.1" 316 | body-parser "1.19.0" 317 | content-disposition "0.5.3" 318 | content-type "~1.0.4" 319 | cookie "0.4.0" 320 | cookie-signature "1.0.6" 321 | debug "2.6.9" 322 | depd "~1.1.2" 323 | encodeurl "~1.0.2" 324 | escape-html "~1.0.3" 325 | etag "~1.8.1" 326 | finalhandler "~1.1.2" 327 | fresh "0.5.2" 328 | merge-descriptors "1.0.1" 329 | methods "~1.1.2" 330 | on-finished "~2.3.0" 331 | parseurl "~1.3.3" 332 | path-to-regexp "0.1.7" 333 | proxy-addr "~2.0.5" 334 | qs "6.7.0" 335 | range-parser "~1.2.1" 336 | safe-buffer "5.1.2" 337 | send "0.17.1" 338 | serve-static "1.14.1" 339 | setprototypeof "1.1.1" 340 | statuses "~1.5.0" 341 | type-is "~1.6.18" 342 | utils-merge "1.0.1" 343 | vary "~1.1.2" 344 | 345 | fill-range@^7.0.1: 346 | version "7.0.1" 347 | resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" 348 | integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== 349 | dependencies: 350 | to-regex-range "^5.0.1" 351 | 352 | finalhandler@~1.1.2: 353 | version "1.1.2" 354 | resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.1.2.tgz#b7e7d000ffd11938d0fdb053506f6ebabe9f587d" 355 | integrity sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA== 356 | dependencies: 357 | debug "2.6.9" 358 | encodeurl "~1.0.2" 359 | escape-html "~1.0.3" 360 | on-finished "~2.3.0" 361 | parseurl "~1.3.3" 362 | statuses "~1.5.0" 363 | unpipe "~1.0.0" 364 | 365 | forwarded@~0.1.2: 366 | version "0.1.2" 367 | resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.1.2.tgz#98c23dab1175657b8c0573e8ceccd91b0ff18c84" 368 | integrity sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ= 369 | 370 | fresh@0.5.2: 371 | version "0.5.2" 372 | resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" 373 | integrity sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac= 374 | 375 | fsevents@~2.1.2: 376 | version "2.1.2" 377 | resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.1.2.tgz#4c0a1fb34bc68e543b4b82a9ec392bfbda840805" 378 | integrity sha512-R4wDiBwZ0KzpgOWetKDug1FZcYhqYnUYKtfZYt4mD5SBz76q0KR4Q9o7GIPamsVPGmW3EYPPJ0dOOjvx32ldZA== 379 | 380 | get-stream@^3.0.0: 381 | version "3.0.0" 382 | resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-3.0.0.tgz#8e943d1358dc37555054ecbe2edb05aa174ede14" 383 | integrity sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ= 384 | 385 | glob-parent@~5.1.0: 386 | version "5.1.1" 387 | resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.1.tgz#b6c1ef417c4e5663ea498f1c45afac6916bbc229" 388 | integrity sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ== 389 | dependencies: 390 | is-glob "^4.0.1" 391 | 392 | global-dirs@^0.1.0: 393 | version "0.1.1" 394 | resolved "https://registry.yarnpkg.com/global-dirs/-/global-dirs-0.1.1.tgz#b319c0dd4607f353f3be9cca4c72fc148c49f445" 395 | integrity sha1-sxnA3UYH81PzvpzKTHL8FIxJ9EU= 396 | dependencies: 397 | ini "^1.3.4" 398 | 399 | got@^6.7.1: 400 | version "6.7.1" 401 | resolved "https://registry.yarnpkg.com/got/-/got-6.7.1.tgz#240cd05785a9a18e561dc1b44b41c763ef1e8db0" 402 | integrity sha1-JAzQV4WpoY5WHcG0S0HHY+8ejbA= 403 | dependencies: 404 | create-error-class "^3.0.0" 405 | duplexer3 "^0.1.4" 406 | get-stream "^3.0.0" 407 | is-redirect "^1.0.0" 408 | is-retry-allowed "^1.0.0" 409 | is-stream "^1.0.0" 410 | lowercase-keys "^1.0.0" 411 | safe-buffer "^5.0.1" 412 | timed-out "^4.0.0" 413 | unzip-response "^2.0.1" 414 | url-parse-lax "^1.0.0" 415 | 416 | graceful-fs@^4.1.11, graceful-fs@^4.1.2: 417 | version "4.2.3" 418 | resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.3.tgz#4a12ff1b60376ef09862c2093edd908328be8423" 419 | integrity sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ== 420 | 421 | has-flag@^3.0.0: 422 | version "3.0.0" 423 | resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" 424 | integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0= 425 | 426 | http-errors@1.7.2: 427 | version "1.7.2" 428 | resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.7.2.tgz#4f5029cf13239f31036e5b2e55292bcfbcc85c8f" 429 | integrity sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg== 430 | dependencies: 431 | depd "~1.1.2" 432 | inherits "2.0.3" 433 | setprototypeof "1.1.1" 434 | statuses ">= 1.5.0 < 2" 435 | toidentifier "1.0.0" 436 | 437 | http-errors@~1.7.2: 438 | version "1.7.3" 439 | resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.7.3.tgz#6c619e4f9c60308c38519498c14fbb10aacebb06" 440 | integrity sha512-ZTTX0MWrsQ2ZAhA1cejAwDLycFsd7I7nVtnkT3Ol0aqodaKW+0CTZDQ1uBv5whptCnc8e8HeRRJxRs0kmm/Qfw== 441 | dependencies: 442 | depd "~1.1.2" 443 | inherits "2.0.4" 444 | setprototypeof "1.1.1" 445 | statuses ">= 1.5.0 < 2" 446 | toidentifier "1.0.0" 447 | 448 | iconv-lite@0.4.24: 449 | version "0.4.24" 450 | resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" 451 | integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== 452 | dependencies: 453 | safer-buffer ">= 2.1.2 < 3" 454 | 455 | ignore-by-default@^1.0.1: 456 | version "1.0.1" 457 | resolved "https://registry.yarnpkg.com/ignore-by-default/-/ignore-by-default-1.0.1.tgz#48ca6d72f6c6a3af00a9ad4ae6876be3889e2b09" 458 | integrity sha1-SMptcvbGo68Aqa1K5odr44ieKwk= 459 | 460 | immutable@^3.8.2: 461 | version "3.8.2" 462 | resolved "https://registry.yarnpkg.com/immutable/-/immutable-3.8.2.tgz#c2439951455bb39913daf281376f1530e104adf3" 463 | integrity sha1-wkOZUUVbs5kT2vKBN28VMOEErfM= 464 | 465 | import-lazy@^2.1.0: 466 | version "2.1.0" 467 | resolved "https://registry.yarnpkg.com/import-lazy/-/import-lazy-2.1.0.tgz#05698e3d45c88e8d7e9d92cb0584e77f096f3e43" 468 | integrity sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM= 469 | 470 | imurmurhash@^0.1.4: 471 | version "0.1.4" 472 | resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" 473 | integrity sha1-khi5srkoojixPcT7a21XbyMUU+o= 474 | 475 | inherits@2.0.3: 476 | version "2.0.3" 477 | resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" 478 | integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4= 479 | 480 | inherits@2.0.4: 481 | version "2.0.4" 482 | resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" 483 | integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== 484 | 485 | ini@^1.3.4, ini@~1.3.0: 486 | version "1.3.8" 487 | resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.8.tgz#a29da425b48806f34767a4efce397269af28432c" 488 | integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew== 489 | 490 | ipaddr.js@1.9.1: 491 | version "1.9.1" 492 | resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.1.tgz#bff38543eeb8984825079ff3a2a8e6cbd46781b3" 493 | integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g== 494 | 495 | is-binary-path@~2.1.0: 496 | version "2.1.0" 497 | resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" 498 | integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== 499 | dependencies: 500 | binary-extensions "^2.0.0" 501 | 502 | is-ci@^1.0.10: 503 | version "1.2.1" 504 | resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-1.2.1.tgz#e3779c8ee17fccf428488f6e281187f2e632841c" 505 | integrity sha512-s6tfsaQaQi3JNciBH6shVqEDvhGut0SUXr31ag8Pd8BBbVVlcGfWhpPmEOoM6RJ5TFhbypvf5yyRw/VXW1IiWg== 506 | dependencies: 507 | ci-info "^1.5.0" 508 | 509 | is-extglob@^2.1.1: 510 | version "2.1.1" 511 | resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" 512 | integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI= 513 | 514 | is-fullwidth-code-point@^2.0.0: 515 | version "2.0.0" 516 | resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" 517 | integrity sha1-o7MKXE8ZkYMWeqq5O+764937ZU8= 518 | 519 | is-glob@^4.0.1, is-glob@~4.0.1: 520 | version "4.0.1" 521 | resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.1.tgz#7567dbe9f2f5e2467bc77ab83c4a29482407a5dc" 522 | integrity sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg== 523 | dependencies: 524 | is-extglob "^2.1.1" 525 | 526 | is-installed-globally@^0.1.0: 527 | version "0.1.0" 528 | resolved "https://registry.yarnpkg.com/is-installed-globally/-/is-installed-globally-0.1.0.tgz#0dfd98f5a9111716dd535dda6492f67bf3d25a80" 529 | integrity sha1-Df2Y9akRFxbdU13aZJL2e/PSWoA= 530 | dependencies: 531 | global-dirs "^0.1.0" 532 | is-path-inside "^1.0.0" 533 | 534 | is-npm@^1.0.0: 535 | version "1.0.0" 536 | resolved "https://registry.yarnpkg.com/is-npm/-/is-npm-1.0.0.tgz#f2fb63a65e4905b406c86072765a1a4dc793b9f4" 537 | integrity sha1-8vtjpl5JBbQGyGBydloaTceTufQ= 538 | 539 | is-number@^7.0.0: 540 | version "7.0.0" 541 | resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" 542 | integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== 543 | 544 | is-obj@^1.0.0: 545 | version "1.0.1" 546 | resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-1.0.1.tgz#3e4729ac1f5fde025cd7d83a896dab9f4f67db0f" 547 | integrity sha1-PkcprB9f3gJc19g6iW2rn09n2w8= 548 | 549 | is-path-inside@^1.0.0: 550 | version "1.0.1" 551 | resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-1.0.1.tgz#8ef5b7de50437a3fdca6b4e865ef7aa55cb48036" 552 | integrity sha1-jvW33lBDej/cprToZe96pVy0gDY= 553 | dependencies: 554 | path-is-inside "^1.0.1" 555 | 556 | is-redirect@^1.0.0: 557 | version "1.0.0" 558 | resolved "https://registry.yarnpkg.com/is-redirect/-/is-redirect-1.0.0.tgz#1d03dded53bd8db0f30c26e4f95d36fc7c87dc24" 559 | integrity sha1-HQPd7VO9jbDzDCbk+V02/HyH3CQ= 560 | 561 | is-retry-allowed@^1.0.0: 562 | version "1.2.0" 563 | resolved "https://registry.yarnpkg.com/is-retry-allowed/-/is-retry-allowed-1.2.0.tgz#d778488bd0a4666a3be8a1482b9f2baafedea8b4" 564 | integrity sha512-RUbUeKwvm3XG2VYamhJL1xFktgjvPzL0Hq8C+6yrWIswDy3BIXGqCxhxkc30N9jqK311gVU137K8Ei55/zVJRg== 565 | 566 | is-stream@^1.0.0, is-stream@^1.1.0: 567 | version "1.1.0" 568 | resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" 569 | integrity sha1-EtSj3U5o4Lec6428hBc66A2RykQ= 570 | 571 | isexe@^2.0.0: 572 | version "2.0.0" 573 | resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" 574 | integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA= 575 | 576 | latest-version@^3.0.0: 577 | version "3.1.0" 578 | resolved "https://registry.yarnpkg.com/latest-version/-/latest-version-3.1.0.tgz#a205383fea322b33b5ae3b18abee0dc2f356ee15" 579 | integrity sha1-ogU4P+oyKzO1rjsYq+4NwvNW7hU= 580 | dependencies: 581 | package-json "^4.0.0" 582 | 583 | lowercase-keys@^1.0.0: 584 | version "1.0.1" 585 | resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-1.0.1.tgz#6f9e30b47084d971a7c820ff15a6c5167b74c26f" 586 | integrity sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA== 587 | 588 | lru-cache@^4.0.1: 589 | version "4.1.5" 590 | resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.5.tgz#8bbe50ea85bed59bc9e33dcab8235ee9bcf443cd" 591 | integrity sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g== 592 | dependencies: 593 | pseudomap "^1.0.2" 594 | yallist "^2.1.2" 595 | 596 | lru-cache@~5.1.1: 597 | version "5.1.1" 598 | resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920" 599 | integrity sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w== 600 | dependencies: 601 | yallist "^3.0.2" 602 | 603 | make-dir@^1.0.0: 604 | version "1.3.0" 605 | resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-1.3.0.tgz#79c1033b80515bd6d24ec9933e860ca75ee27f0c" 606 | integrity sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ== 607 | dependencies: 608 | pify "^3.0.0" 609 | 610 | media-typer@0.3.0: 611 | version "0.3.0" 612 | resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" 613 | integrity sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g= 614 | 615 | merge-descriptors@1.0.1: 616 | version "1.0.1" 617 | resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61" 618 | integrity sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E= 619 | 620 | methods@~1.1.2: 621 | version "1.1.2" 622 | resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" 623 | integrity sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4= 624 | 625 | mime-db@1.43.0: 626 | version "1.43.0" 627 | resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.43.0.tgz#0a12e0502650e473d735535050e7c8f4eb4fae58" 628 | integrity sha512-+5dsGEEovYbT8UY9yD7eE4XTc4UwJ1jBYlgaQQF38ENsKR3wj/8q8RFZrF9WIZpB2V1ArTVFUva8sAul1NzRzQ== 629 | 630 | mime-types@~2.1.24: 631 | version "2.1.26" 632 | resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.26.tgz#9c921fc09b7e149a65dfdc0da4d20997200b0a06" 633 | integrity sha512-01paPWYgLrkqAyrlDorC1uDwl2p3qZT7yl806vW7DvDoxwXi46jsjFbg+WdwotBIk6/MbEhO/dh5aZ5sNj/dWQ== 634 | dependencies: 635 | mime-db "1.43.0" 636 | 637 | mime@1.6.0: 638 | version "1.6.0" 639 | resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" 640 | integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== 641 | 642 | minimatch@^3.0.4: 643 | version "3.0.4" 644 | resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" 645 | integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA== 646 | dependencies: 647 | brace-expansion "^1.1.7" 648 | 649 | minimist@^1.2.0: 650 | version "1.2.5" 651 | resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602" 652 | integrity sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw== 653 | 654 | ms@2.0.0: 655 | version "2.0.0" 656 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" 657 | integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g= 658 | 659 | ms@2.1.1: 660 | version "2.1.1" 661 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.1.tgz#30a5864eb3ebb0a66f2ebe6d727af06a09d86e0a" 662 | integrity sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg== 663 | 664 | ms@^2.1.1: 665 | version "2.1.2" 666 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" 667 | integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== 668 | 669 | mustache-express@^1.3.0: 670 | version "1.3.0" 671 | resolved "https://registry.yarnpkg.com/mustache-express/-/mustache-express-1.3.0.tgz#91d67121e3553d42d6c995f4c32793db89492493" 672 | integrity sha512-JWG8Rzxh9tpoLEH0NZ2u/caDiwhIkW+50IOBrcO+lHya3tCYj41bYPDEHCxPbKXvPrSyMNpI6ly4xdU2zpNQtg== 673 | dependencies: 674 | async "~3.1.0" 675 | lru-cache "~5.1.1" 676 | mustache "^3.1.0" 677 | 678 | mustache@^3.1.0: 679 | version "3.2.1" 680 | resolved "https://registry.yarnpkg.com/mustache/-/mustache-3.2.1.tgz#89e78a9d207d78f2799b1e95764a25bf71a28322" 681 | integrity sha512-RERvMFdLpaFfSRIEe632yDm5nsd0SDKn8hGmcUwswnyiE5mtdZLDybtHAz6hjJhawokF0hXvGLtx9mrQfm6FkA== 682 | 683 | negotiator@0.6.2: 684 | version "0.6.2" 685 | resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.2.tgz#feacf7ccf525a77ae9634436a64883ffeca346fb" 686 | integrity sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw== 687 | 688 | nodemon@^2.0.2: 689 | version "2.0.2" 690 | resolved "https://registry.yarnpkg.com/nodemon/-/nodemon-2.0.2.tgz#9c7efeaaf9b8259295a97e5d4585ba8f0cbe50b0" 691 | integrity sha512-GWhYPMfde2+M0FsHnggIHXTqPDHXia32HRhh6H0d75Mt9FKUoCBvumNHr7LdrpPBTKxsWmIEOjoN+P4IU6Hcaw== 692 | dependencies: 693 | chokidar "^3.2.2" 694 | debug "^3.2.6" 695 | ignore-by-default "^1.0.1" 696 | minimatch "^3.0.4" 697 | pstree.remy "^1.1.7" 698 | semver "^5.7.1" 699 | supports-color "^5.5.0" 700 | touch "^3.1.0" 701 | undefsafe "^2.0.2" 702 | update-notifier "^2.5.0" 703 | 704 | nopt@~1.0.10: 705 | version "1.0.10" 706 | resolved "https://registry.yarnpkg.com/nopt/-/nopt-1.0.10.tgz#6ddd21bd2a31417b92727dd585f8a6f37608ebee" 707 | integrity sha1-bd0hvSoxQXuScn3Vhfim83YI6+4= 708 | dependencies: 709 | abbrev "1" 710 | 711 | normalize-path@^3.0.0, normalize-path@~3.0.0: 712 | version "3.0.0" 713 | resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" 714 | integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== 715 | 716 | npm-run-path@^2.0.0: 717 | version "2.0.2" 718 | resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-2.0.2.tgz#35a9232dfa35d7067b4cb2ddf2357b1871536c5f" 719 | integrity sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8= 720 | dependencies: 721 | path-key "^2.0.0" 722 | 723 | on-finished@~2.3.0: 724 | version "2.3.0" 725 | resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947" 726 | integrity sha1-IPEzZIGwg811M3mSoWlxqi2QaUc= 727 | dependencies: 728 | ee-first "1.1.1" 729 | 730 | p-finally@^1.0.0: 731 | version "1.0.0" 732 | resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae" 733 | integrity sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4= 734 | 735 | package-json@^4.0.0: 736 | version "4.0.1" 737 | resolved "https://registry.yarnpkg.com/package-json/-/package-json-4.0.1.tgz#8869a0401253661c4c4ca3da6c2121ed555f5eed" 738 | integrity sha1-iGmgQBJTZhxMTKPabCEh7VVfXu0= 739 | dependencies: 740 | got "^6.7.1" 741 | registry-auth-token "^3.0.1" 742 | registry-url "^3.0.3" 743 | semver "^5.1.0" 744 | 745 | parseurl@~1.3.3: 746 | version "1.3.3" 747 | resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4" 748 | integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ== 749 | 750 | path-is-inside@^1.0.1: 751 | version "1.0.2" 752 | resolved "https://registry.yarnpkg.com/path-is-inside/-/path-is-inside-1.0.2.tgz#365417dede44430d1c11af61027facf074bdfc53" 753 | integrity sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM= 754 | 755 | path-key@^2.0.0: 756 | version "2.0.1" 757 | resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40" 758 | integrity sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A= 759 | 760 | path-to-regexp@0.1.7: 761 | version "0.1.7" 762 | resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c" 763 | integrity sha1-32BBeABfUi8V60SQ5yR6G/qmf4w= 764 | 765 | picomatch@^2.0.4, picomatch@^2.0.7: 766 | version "2.2.2" 767 | resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.2.2.tgz#21f333e9b6b8eaff02468f5146ea406d345f4dad" 768 | integrity sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg== 769 | 770 | pify@^3.0.0: 771 | version "3.0.0" 772 | resolved "https://registry.yarnpkg.com/pify/-/pify-3.0.0.tgz#e5a4acd2c101fdf3d9a4d07f0dbc4db49dd28176" 773 | integrity sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY= 774 | 775 | prepend-http@^1.0.1: 776 | version "1.0.4" 777 | resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-1.0.4.tgz#d4f4562b0ce3696e41ac52d0e002e57a635dc6dc" 778 | integrity sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw= 779 | 780 | proxy-addr@~2.0.5: 781 | version "2.0.6" 782 | resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.6.tgz#fdc2336505447d3f2f2c638ed272caf614bbb2bf" 783 | integrity sha512-dh/frvCBVmSsDYzw6n926jv974gddhkFPfiN8hPOi30Wax25QZyZEGveluCgliBnqmuM+UJmBErbAUFIoDbjOw== 784 | dependencies: 785 | forwarded "~0.1.2" 786 | ipaddr.js "1.9.1" 787 | 788 | pseudomap@^1.0.2: 789 | version "1.0.2" 790 | resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3" 791 | integrity sha1-8FKijacOYYkX7wqKw0wa5aaChrM= 792 | 793 | pstree.remy@^1.1.7: 794 | version "1.1.7" 795 | resolved "https://registry.yarnpkg.com/pstree.remy/-/pstree.remy-1.1.7.tgz#c76963a28047ed61542dc361aa26ee55a7fa15f3" 796 | integrity sha512-xsMgrUwRpuGskEzBFkH8NmTimbZ5PcPup0LA8JJkHIm2IMUbQcpo3yeLNWVrufEYjh8YwtSVh0xz6UeWc5Oh5A== 797 | 798 | qs@6.7.0: 799 | version "6.7.0" 800 | resolved "https://registry.yarnpkg.com/qs/-/qs-6.7.0.tgz#41dc1a015e3d581f1621776be31afb2876a9b1bc" 801 | integrity sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ== 802 | 803 | range-parser@~1.2.1: 804 | version "1.2.1" 805 | resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031" 806 | integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== 807 | 808 | raw-body@2.4.0: 809 | version "2.4.0" 810 | resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.4.0.tgz#a1ce6fb9c9bc356ca52e89256ab59059e13d0332" 811 | integrity sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q== 812 | dependencies: 813 | bytes "3.1.0" 814 | http-errors "1.7.2" 815 | iconv-lite "0.4.24" 816 | unpipe "1.0.0" 817 | 818 | rc@^1.0.1, rc@^1.1.6: 819 | version "1.2.8" 820 | resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed" 821 | integrity sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw== 822 | dependencies: 823 | deep-extend "^0.6.0" 824 | ini "~1.3.0" 825 | minimist "^1.2.0" 826 | strip-json-comments "~2.0.1" 827 | 828 | readdirp@~3.3.0: 829 | version "3.3.0" 830 | resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.3.0.tgz#984458d13a1e42e2e9f5841b129e162f369aff17" 831 | integrity sha512-zz0pAkSPOXXm1viEwygWIPSPkcBYjW1xU5j/JBh5t9bGCJwa6f9+BJa6VaB2g+b55yVrmXzqkyLf4xaWYM0IkQ== 832 | dependencies: 833 | picomatch "^2.0.7" 834 | 835 | registry-auth-token@^3.0.1: 836 | version "3.4.0" 837 | resolved "https://registry.yarnpkg.com/registry-auth-token/-/registry-auth-token-3.4.0.tgz#d7446815433f5d5ed6431cd5dca21048f66b397e" 838 | integrity sha512-4LM6Fw8eBQdwMYcES4yTnn2TqIasbXuwDx3um+QRs7S55aMKCBKBxvPXl2RiUjHwuJLTyYfxSpmfSAjQpcuP+A== 839 | dependencies: 840 | rc "^1.1.6" 841 | safe-buffer "^5.0.1" 842 | 843 | registry-url@^3.0.3: 844 | version "3.1.0" 845 | resolved "https://registry.yarnpkg.com/registry-url/-/registry-url-3.1.0.tgz#3d4ef870f73dde1d77f0cf9a381432444e174942" 846 | integrity sha1-PU74cPc93h138M+aOBQyRE4XSUI= 847 | dependencies: 848 | rc "^1.0.1" 849 | 850 | safe-buffer@5.1.2: 851 | version "5.1.2" 852 | resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" 853 | integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== 854 | 855 | safe-buffer@^5.0.1: 856 | version "5.2.0" 857 | resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.0.tgz#b74daec49b1148f88c64b68d49b1e815c1f2f519" 858 | integrity sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg== 859 | 860 | "safer-buffer@>= 2.1.2 < 3": 861 | version "2.1.2" 862 | resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" 863 | integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== 864 | 865 | semver-diff@^2.0.0: 866 | version "2.1.0" 867 | resolved "https://registry.yarnpkg.com/semver-diff/-/semver-diff-2.1.0.tgz#4bbb8437c8d37e4b0cf1a68fd726ec6d645d6d36" 868 | integrity sha1-S7uEN8jTfksM8aaP1ybsbWRdbTY= 869 | dependencies: 870 | semver "^5.0.3" 871 | 872 | semver@^5.0.3, semver@^5.1.0, semver@^5.7.1: 873 | version "5.7.1" 874 | resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" 875 | integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== 876 | 877 | send@0.17.1: 878 | version "0.17.1" 879 | resolved "https://registry.yarnpkg.com/send/-/send-0.17.1.tgz#c1d8b059f7900f7466dd4938bdc44e11ddb376c8" 880 | integrity sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg== 881 | dependencies: 882 | debug "2.6.9" 883 | depd "~1.1.2" 884 | destroy "~1.0.4" 885 | encodeurl "~1.0.2" 886 | escape-html "~1.0.3" 887 | etag "~1.8.1" 888 | fresh "0.5.2" 889 | http-errors "~1.7.2" 890 | mime "1.6.0" 891 | ms "2.1.1" 892 | on-finished "~2.3.0" 893 | range-parser "~1.2.1" 894 | statuses "~1.5.0" 895 | 896 | serve-static@1.14.1: 897 | version "1.14.1" 898 | resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.14.1.tgz#666e636dc4f010f7ef29970a88a674320898b2f9" 899 | integrity sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg== 900 | dependencies: 901 | encodeurl "~1.0.2" 902 | escape-html "~1.0.3" 903 | parseurl "~1.3.3" 904 | send "0.17.1" 905 | 906 | setprototypeof@1.1.1: 907 | version "1.1.1" 908 | resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.1.tgz#7e95acb24aa92f5885e0abef5ba131330d4ae683" 909 | integrity sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw== 910 | 911 | shebang-command@^1.2.0: 912 | version "1.2.0" 913 | resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea" 914 | integrity sha1-RKrGW2lbAzmJaMOfNj/uXer98eo= 915 | dependencies: 916 | shebang-regex "^1.0.0" 917 | 918 | shebang-regex@^1.0.0: 919 | version "1.0.0" 920 | resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" 921 | integrity sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM= 922 | 923 | signal-exit@^3.0.0, signal-exit@^3.0.2: 924 | version "3.0.2" 925 | resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d" 926 | integrity sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0= 927 | 928 | "statuses@>= 1.5.0 < 2", statuses@~1.5.0: 929 | version "1.5.0" 930 | resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c" 931 | integrity sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow= 932 | 933 | string-width@^2.0.0, string-width@^2.1.1: 934 | version "2.1.1" 935 | resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" 936 | integrity sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw== 937 | dependencies: 938 | is-fullwidth-code-point "^2.0.0" 939 | strip-ansi "^4.0.0" 940 | 941 | strip-ansi@^4.0.0: 942 | version "4.0.0" 943 | resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f" 944 | integrity sha1-qEeQIusaw2iocTibY1JixQXuNo8= 945 | dependencies: 946 | ansi-regex "^3.0.0" 947 | 948 | strip-eof@^1.0.0: 949 | version "1.0.0" 950 | resolved "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf" 951 | integrity sha1-u0P/VZim6wXYm1n80SnJgzE2Br8= 952 | 953 | strip-json-comments@~2.0.1: 954 | version "2.0.1" 955 | resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" 956 | integrity sha1-PFMZQukIwml8DsNEhYwobHygpgo= 957 | 958 | supports-color@^5.3.0, supports-color@^5.5.0: 959 | version "5.5.0" 960 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" 961 | integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== 962 | dependencies: 963 | has-flag "^3.0.0" 964 | 965 | term-size@^1.2.0: 966 | version "1.2.0" 967 | resolved "https://registry.yarnpkg.com/term-size/-/term-size-1.2.0.tgz#458b83887f288fc56d6fffbfad262e26638efa69" 968 | integrity sha1-RYuDiH8oj8Vtb/+/rSYuJmOO+mk= 969 | dependencies: 970 | execa "^0.7.0" 971 | 972 | timed-out@^4.0.0: 973 | version "4.0.1" 974 | resolved "https://registry.yarnpkg.com/timed-out/-/timed-out-4.0.1.tgz#f32eacac5a175bea25d7fab565ab3ed8741ef56f" 975 | integrity sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8= 976 | 977 | to-regex-range@^5.0.1: 978 | version "5.0.1" 979 | resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" 980 | integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== 981 | dependencies: 982 | is-number "^7.0.0" 983 | 984 | toidentifier@1.0.0: 985 | version "1.0.0" 986 | resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.0.tgz#7e1be3470f1e77948bc43d94a3c8f4d7752ba553" 987 | integrity sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw== 988 | 989 | touch@^3.1.0: 990 | version "3.1.0" 991 | resolved "https://registry.yarnpkg.com/touch/-/touch-3.1.0.tgz#fe365f5f75ec9ed4e56825e0bb76d24ab74af83b" 992 | integrity sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA== 993 | dependencies: 994 | nopt "~1.0.10" 995 | 996 | type-is@~1.6.17, type-is@~1.6.18: 997 | version "1.6.18" 998 | resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131" 999 | integrity sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g== 1000 | dependencies: 1001 | media-typer "0.3.0" 1002 | mime-types "~2.1.24" 1003 | 1004 | undefsafe@^2.0.2: 1005 | version "2.0.3" 1006 | resolved "https://registry.yarnpkg.com/undefsafe/-/undefsafe-2.0.3.tgz#6b166e7094ad46313b2202da7ecc2cd7cc6e7aae" 1007 | integrity sha512-nrXZwwXrD/T/JXeygJqdCO6NZZ1L66HrxM/Z7mIq2oPanoN0F1nLx3lwJMu6AwJY69hdixaFQOuoYsMjE5/C2A== 1008 | dependencies: 1009 | debug "^2.2.0" 1010 | 1011 | unique-string@^1.0.0: 1012 | version "1.0.0" 1013 | resolved "https://registry.yarnpkg.com/unique-string/-/unique-string-1.0.0.tgz#9e1057cca851abb93398f8b33ae187b99caec11a" 1014 | integrity sha1-nhBXzKhRq7kzmPizOuGHuZyuwRo= 1015 | dependencies: 1016 | crypto-random-string "^1.0.0" 1017 | 1018 | unpipe@1.0.0, unpipe@~1.0.0: 1019 | version "1.0.0" 1020 | resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" 1021 | integrity sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw= 1022 | 1023 | unzip-response@^2.0.1: 1024 | version "2.0.1" 1025 | resolved "https://registry.yarnpkg.com/unzip-response/-/unzip-response-2.0.1.tgz#d2f0f737d16b0615e72a6935ed04214572d56f97" 1026 | integrity sha1-0vD3N9FrBhXnKmk17QQhRXLVb5c= 1027 | 1028 | update-notifier@^2.5.0: 1029 | version "2.5.0" 1030 | resolved "https://registry.yarnpkg.com/update-notifier/-/update-notifier-2.5.0.tgz#d0744593e13f161e406acb1d9408b72cad08aff6" 1031 | integrity sha512-gwMdhgJHGuj/+wHJJs9e6PcCszpxR1b236igrOkUofGhqJuG+amlIKwApH1IW1WWl7ovZxsX49lMBWLxSdm5Dw== 1032 | dependencies: 1033 | boxen "^1.2.1" 1034 | chalk "^2.0.1" 1035 | configstore "^3.0.0" 1036 | import-lazy "^2.1.0" 1037 | is-ci "^1.0.10" 1038 | is-installed-globally "^0.1.0" 1039 | is-npm "^1.0.0" 1040 | latest-version "^3.0.0" 1041 | semver-diff "^2.0.0" 1042 | xdg-basedir "^3.0.0" 1043 | 1044 | url-parse-lax@^1.0.0: 1045 | version "1.0.0" 1046 | resolved "https://registry.yarnpkg.com/url-parse-lax/-/url-parse-lax-1.0.0.tgz#7af8f303645e9bd79a272e7a14ac68bc0609da73" 1047 | integrity sha1-evjzA2Rem9eaJy56FKxovAYJ2nM= 1048 | dependencies: 1049 | prepend-http "^1.0.1" 1050 | 1051 | utils-merge@1.0.1: 1052 | version "1.0.1" 1053 | resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" 1054 | integrity sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM= 1055 | 1056 | vary@~1.1.2: 1057 | version "1.1.2" 1058 | resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" 1059 | integrity sha1-IpnwLG3tMNSllhsLn3RSShj2NPw= 1060 | 1061 | which@^1.2.9: 1062 | version "1.3.1" 1063 | resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" 1064 | integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== 1065 | dependencies: 1066 | isexe "^2.0.0" 1067 | 1068 | widest-line@^2.0.0: 1069 | version "2.0.1" 1070 | resolved "https://registry.yarnpkg.com/widest-line/-/widest-line-2.0.1.tgz#7438764730ec7ef4381ce4df82fb98a53142a3fc" 1071 | integrity sha512-Ba5m9/Fa4Xt9eb2ELXt77JxVDV8w7qQrH0zS/TWSJdLyAwQjWoOzpzj5lwVftDz6n/EOu3tNACS84v509qwnJA== 1072 | dependencies: 1073 | string-width "^2.1.1" 1074 | 1075 | write-file-atomic@^2.0.0: 1076 | version "2.4.3" 1077 | resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-2.4.3.tgz#1fd2e9ae1df3e75b8d8c367443c692d4ca81f481" 1078 | integrity sha512-GaETH5wwsX+GcnzhPgKcKjJ6M2Cq3/iZp1WyY/X1CSqrW+jVNM9Y7D8EC2sM4ZG/V8wZlSniJnCKWPmBYAucRQ== 1079 | dependencies: 1080 | graceful-fs "^4.1.11" 1081 | imurmurhash "^0.1.4" 1082 | signal-exit "^3.0.2" 1083 | 1084 | xdg-basedir@^3.0.0: 1085 | version "3.0.0" 1086 | resolved "https://registry.yarnpkg.com/xdg-basedir/-/xdg-basedir-3.0.0.tgz#496b2cc109eca8dbacfe2dc72b603c17c5870ad4" 1087 | integrity sha1-SWsswQnsqNus/i3HK2A8F8WHCtQ= 1088 | 1089 | yallist@^2.1.2: 1090 | version "2.1.2" 1091 | resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52" 1092 | integrity sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI= 1093 | 1094 | yallist@^3.0.2: 1095 | version "3.1.1" 1096 | resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" 1097 | integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== 1098 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Apache License 2 | Version 2.0, January 2004 3 | http://www.apache.org/licenses/ 4 | 5 | TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 6 | 7 | 1. Definitions. 8 | 9 | "License" shall mean the terms and conditions for use, reproduction, 10 | and distribution as defined by Sections 1 through 9 of this document. 11 | 12 | "Licensor" shall mean the copyright owner or entity authorized by 13 | the copyright owner that is granting the License. 14 | 15 | "Legal Entity" shall mean the union of the acting entity and all 16 | other entities that control, are controlled by, or are under common 17 | control with that entity. For the purposes of this definition, 18 | "control" means (i) the power, direct or indirect, to cause the 19 | direction or management of such entity, whether by contract or 20 | otherwise, or (ii) ownership of fifty percent (50%) or more of the 21 | outstanding shares, or (iii) beneficial ownership of such entity. 22 | 23 | "You" (or "Your") shall mean an individual or Legal Entity 24 | exercising permissions granted by this License. 25 | 26 | "Source" form shall mean the preferred form for making modifications, 27 | including but not limited to software source code, documentation 28 | source, and configuration files. 29 | 30 | "Object" form shall mean any form resulting from mechanical 31 | transformation or translation of a Source form, including but 32 | not limited to compiled object code, generated documentation, 33 | and conversions to other media types. 34 | 35 | "Work" shall mean the work of authorship, whether in Source or 36 | Object form, made available under the License, as indicated by a 37 | copyright notice that is included in or attached to the work 38 | (an example is provided in the Appendix below). 39 | 40 | "Derivative Works" shall mean any work, whether in Source or Object 41 | form, that is based on (or derived from) the Work and for which the 42 | editorial revisions, annotations, elaborations, or other modifications 43 | represent, as a whole, an original work of authorship. For the purposes 44 | of this License, Derivative Works shall not include works that remain 45 | separable from, or merely link (or bind by name) to the interfaces of, 46 | the Work and Derivative Works thereof. 47 | 48 | "Contribution" shall mean any work of authorship, including 49 | the original version of the Work and any modifications or additions 50 | to that Work or Derivative Works thereof, that is intentionally 51 | submitted to Licensor for inclusion in the Work by the copyright owner 52 | or by an individual or Legal Entity authorized to submit on behalf of 53 | the copyright owner. For the purposes of this definition, "submitted" 54 | means any form of electronic, verbal, or written communication sent 55 | to the Licensor or its representatives, including but not limited to 56 | communication on electronic mailing lists, source code control systems, 57 | and issue tracking systems that are managed by, or on behalf of, the 58 | Licensor for the purpose of discussing and improving the Work, but 59 | excluding communication that is conspicuously marked or otherwise 60 | designated in writing by the copyright owner as "Not a Contribution." 61 | 62 | "Contributor" shall mean Licensor and any individual or Legal Entity 63 | on behalf of whom a Contribution has been received by Licensor and 64 | subsequently incorporated within the Work. 65 | 66 | 2. Grant of Copyright License. Subject to the terms and conditions of 67 | this License, each Contributor hereby grants to You a perpetual, 68 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 69 | copyright license to reproduce, prepare Derivative Works of, 70 | publicly display, publicly perform, sublicense, and distribute the 71 | Work and such Derivative Works in Source or Object form. 72 | 73 | 3. Grant of Patent License. Subject to the terms and conditions of 74 | this License, each Contributor hereby grants to You a perpetual, 75 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 76 | (except as stated in this section) patent license to make, have made, 77 | use, offer to sell, sell, import, and otherwise transfer the Work, 78 | where such license applies only to those patent claims licensable 79 | by such Contributor that are necessarily infringed by their 80 | Contribution(s) alone or by combination of their Contribution(s) 81 | with the Work to which such Contribution(s) was submitted. If You 82 | institute patent litigation against any entity (including a 83 | cross-claim or counterclaim in a lawsuit) alleging that the Work 84 | or a Contribution incorporated within the Work constitutes direct 85 | or contributory patent infringement, then any patent licenses 86 | granted to You under this License for that Work shall terminate 87 | as of the date such litigation is filed. 88 | 89 | 4. Redistribution. You may reproduce and distribute copies of the 90 | Work or Derivative Works thereof in any medium, with or without 91 | modifications, and in Source or Object form, provided that You 92 | meet the following conditions: 93 | 94 | (a) You must give any other recipients of the Work or 95 | Derivative Works a copy of this License; and 96 | 97 | (b) You must cause any modified files to carry prominent notices 98 | stating that You changed the files; and 99 | 100 | (c) You must retain, in the Source form of any Derivative Works 101 | that You distribute, all copyright, patent, trademark, and 102 | attribution notices from the Source form of the Work, 103 | excluding those notices that do not pertain to any part of 104 | the Derivative Works; and 105 | 106 | (d) If the Work includes a "NOTICE" text file as part of its 107 | distribution, then any Derivative Works that You distribute must 108 | include a readable copy of the attribution notices contained 109 | within such NOTICE file, excluding those notices that do not 110 | pertain to any part of the Derivative Works, in at least one 111 | of the following places: within a NOTICE text file distributed 112 | as part of the Derivative Works; within the Source form or 113 | documentation, if provided along with the Derivative Works; or, 114 | within a display generated by the Derivative Works, if and 115 | wherever such third-party notices normally appear. The contents 116 | of the NOTICE file are for informational purposes only and 117 | do not modify the License. You may add Your own attribution 118 | notices within Derivative Works that You distribute, alongside 119 | or as an addendum to the NOTICE text from the Work, provided 120 | that such additional attribution notices cannot be construed 121 | as modifying the License. 122 | 123 | You may add Your own copyright statement to Your modifications and 124 | may provide additional or different license terms and conditions 125 | for use, reproduction, or distribution of Your modifications, or 126 | for any such Derivative Works as a whole, provided Your use, 127 | reproduction, and distribution of the Work otherwise complies with 128 | the conditions stated in this License. 129 | 130 | 5. Submission of Contributions. Unless You explicitly state otherwise, 131 | any Contribution intentionally submitted for inclusion in the Work 132 | by You to the Licensor shall be under the terms and conditions of 133 | this License, without any additional terms or conditions. 134 | Notwithstanding the above, nothing herein shall supersede or modify 135 | the terms of any separate license agreement you may have executed 136 | with Licensor regarding such Contributions. 137 | 138 | 6. Trademarks. This License does not grant permission to use the trade 139 | names, trademarks, service marks, or product names of the Licensor, 140 | except as required for reasonable and customary use in describing the 141 | origin of the Work and reproducing the content of the NOTICE file. 142 | 143 | 7. Disclaimer of Warranty. Unless required by applicable law or 144 | agreed to in writing, Licensor provides the Work (and each 145 | Contributor provides its Contributions) on an "AS IS" BASIS, 146 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or 147 | implied, including, without limitation, any warranties or conditions 148 | of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A 149 | PARTICULAR PURPOSE. You are solely responsible for determining the 150 | appropriateness of using or redistributing the Work and assume any 151 | risks associated with Your exercise of permissions under this License. 152 | 153 | 8. Limitation of Liability. In no event and under no legal theory, 154 | whether in tort (including negligence), contract, or otherwise, 155 | unless required by applicable law (such as deliberate and grossly 156 | negligent acts) or agreed to in writing, shall any Contributor be 157 | liable to You for damages, including any direct, indirect, special, 158 | incidental, or consequential damages of any character arising as a 159 | result of this License or out of the use or inability to use the 160 | Work (including but not limited to damages for loss of goodwill, 161 | work stoppage, computer failure or malfunction, or any and all 162 | other commercial damages or losses), even if such Contributor 163 | has been advised of the possibility of such damages. 164 | 165 | 9. Accepting Warranty or Additional Liability. While redistributing 166 | the Work or Derivative Works thereof, You may choose to offer, 167 | and charge a fee for, acceptance of support, warranty, indemnity, 168 | or other liability obligations and/or rights consistent with this 169 | License. However, in accepting such obligations, You may act only 170 | on Your own behalf and on Your sole responsibility, not on behalf 171 | of any other Contributor, and only if You agree to indemnify, 172 | defend, and hold each Contributor harmless for any liability 173 | incurred by, or claims asserted against, such Contributor by reason 174 | of your accepting any such warranty or additional liability. 175 | 176 | END OF TERMS AND CONDITIONS 177 | 178 | APPENDIX: How to apply the Apache License to your work. 179 | 180 | To apply the Apache License to your work, attach the following 181 | boilerplate notice, with the fields enclosed by brackets "[]" 182 | replaced with your own identifying information. (Don't include 183 | the brackets!) The text should be enclosed in the appropriate 184 | comment syntax for the file format. We also recommend that a 185 | file or class name and description of purpose be included on the 186 | same "printed page" as the copyright notice for easier 187 | identification within third-party archives. 188 | 189 | Copyright [yyyy] [name of copyright owner] 190 | 191 | Licensed under the Apache License, Version 2.0 (the "License"); 192 | you may not use this file except in compliance with the License. 193 | You may obtain a copy of the License at 194 | 195 | http://www.apache.org/licenses/LICENSE-2.0 196 | 197 | Unless required by applicable law or agreed to in writing, software 198 | distributed under the License is distributed on an "AS IS" BASIS, 199 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 200 | See the License for the specific language governing permissions and 201 | limitations under the License. 202 | -------------------------------------------------------------------------------- /NOTICE: -------------------------------------------------------------------------------- 1 | Tilt Example NodeJS 2 | Copyright 2022 Docker, Inc. 3 | 4 | This product includes software developed at Docker, Inc. (https://www.docker.com). 5 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # tilt-example-nodejs 2 | 3 | [![Build Status](https://circleci.com/gh/tilt-dev/tilt-example-nodejs/tree/master.svg?style=shield)](https://circleci.com/gh/tilt-dev/tilt-example-nodejs) 4 | 5 | An example project that demonstrates how to use Tilt to develop on a NodeJS app (using Express for serving and Mustache for templating). 6 | 7 | ## Fastest Deployment 8 | 9 | This progression of examples shows how to start, and incrementally update your project for the fastest possible update time. Follow along in our [NodeJS example project guide](https://docs.tilt.dev/example_nodejs.html). 10 | 11 | - [0-base](0-base): the simplest way to start 12 | - [1-measured](1-measured): use `local_resource` to measure your deployment time 13 | - [2-optimized-dockerfile](2-optimized-dockerfile): be sure to optimize your Dockerfile to make good use of caching 14 | - [3-recommended](3-recommended): use `live_update` for super-fast deploys 15 | 16 | ## Other Configurations 17 | 18 | - [101-debugger](101-debugger): The recommended setup, exposing a debugger on port 9229 that you 19 | can connect to with your favorite NodeJS debugger (chrome://inspect, VSCode, IntelliJ, etc) 20 | - [tests-example](tests-example): an example of how to use Tilt to run your tests for you as you iterate 21 | 22 | ## License 23 | 24 | Copyright 2022 Docker, Inc. 25 | 26 | Licensed under [the Apache License, Version 2.0](LICENSE) 27 | -------------------------------------------------------------------------------- /test/test.ps1: -------------------------------------------------------------------------------- 1 | 2 | echo "Testing 0-base" 3 | tilt ci --file 0-base/Tiltfile 4 | if (!$?) { 5 | throw "failed" 6 | } 7 | tilt down --file 0-base/Tiltfile 8 | 9 | echo "Testing 1-measured" 10 | tilt ci --file 1-measured/Tiltfile 11 | if (!$?) { 12 | throw "failed" 13 | } 14 | tilt down --file 1-measured/Tiltfile 15 | 16 | echo "Testing 2-optimized-dockerfile" 17 | tilt ci --file 2-optimized-dockerfile/Tiltfile 18 | if (!$?) { 19 | throw "failed" 20 | } 21 | tilt down --file 2-optimized-dockerfile/Tiltfile 22 | 23 | echo "Testing 3-recommended" 24 | tilt ci --file 3-recommended/Tiltfile 25 | if (!$?) { 26 | throw "failed" 27 | } 28 | tilt down --file 3-recommended/Tiltfile 29 | -------------------------------------------------------------------------------- /test/test.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | set -ex 4 | 5 | # cd to the root of the repo. 6 | cd $(dirname $(dirname $0)) 7 | 8 | echo "Testing 0-base" 9 | tilt ci --file 0-base/Tiltfile 10 | tilt down --file 0-base/Tiltfile 11 | 12 | echo "Testing 1-measured" 13 | tilt ci --file 1-measured/Tiltfile 14 | tilt down --file 1-measured/Tiltfile 15 | 16 | echo "Testing 2-optimized" 17 | tilt ci --file 2-optimized-dockerfile/Tiltfile 18 | tilt down --file 2-optimized-dockerfile/Tiltfile 19 | 20 | echo "Testing 3-recommended" 21 | tilt ci --file 3-recommended/Tiltfile 22 | tilt down --file 3-recommended/Tiltfile 23 | 24 | echo "Testing 101-debugger" 25 | tilt ci --file 101-debugger/Tiltfile 26 | tilt down --file 101-debugger/Tiltfile 27 | 28 | echo "Testing tests-example" 29 | tilt ci --file tests-example/Tiltfile 30 | tilt down --file tests-example/Tiltfile 31 | -------------------------------------------------------------------------------- /tests-example/.dockerignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | yarn-error.log 3 | -------------------------------------------------------------------------------- /tests-example/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM node:20 2 | 3 | # Default value; will be overridden by build_args, if passed 4 | ARG node_env=production 5 | 6 | ENV NODE_ENV $node_env 7 | 8 | WORKDIR /app 9 | 10 | ADD package.json . 11 | ADD yarn.lock . 12 | RUN yarn install 13 | 14 | ADD . . 15 | 16 | ENTRYPOINT [ "node", "/app/index.js" ] 17 | -------------------------------------------------------------------------------- /tests-example/Tiltfile: -------------------------------------------------------------------------------- 1 | # -*- mode: Python -* 2 | 3 | # Tilt can run your tests for you, so you get fast feedback while iterating on your app 4 | include('Tiltfile.tests') 5 | 6 | k8s_yaml('kubernetes.yaml') 7 | k8s_resource('example-nodejs', port_forwards=8000, 8 | resource_deps=['deploy'] 9 | ) 10 | 11 | # Records the current time, then kicks off a server update. 12 | # Normally, you would let Tilt do deploys automatically, but this 13 | # shows you how to set up a custom workflow that measures it. 14 | local_resource( 15 | 'deploy', 16 | 'python3 now.py > start-time.txt', 17 | ) 18 | 19 | # Add a live_update rule to our docker_build 20 | congrats = "🎉 Congrats, you ran a live_update! 🎉" 21 | docker_build('example-nodejs-image', '.', 22 | build_args={'node_env': 'development'}, 23 | entrypoint='yarn run nodemon /app/index.js', 24 | live_update=[ 25 | sync('.', '/app'), 26 | run('cd /app && yarn install', trigger=['./package.json', './yarn.lock']), 27 | 28 | # if all that changed was start-time.txt, make sure the server 29 | # reloads so that it will reflect the new startup time 30 | run('touch /app/index.js', trigger='./start-time.txt'), 31 | 32 | # add a congrats message! 33 | run('sed -i "s/Hello cats!/{}/g" /app/views/index.mustache'. 34 | format(congrats)), 35 | ]) 36 | -------------------------------------------------------------------------------- /tests-example/Tiltfile.tests: -------------------------------------------------------------------------------- 1 | # -*- mode: Python -*- 2 | 3 | # For more on the `test_jest_yarn` extension: 4 | # https://github.com/tilt-dev/tilt-extensions/tree/master/tests/javascript 5 | # For more on tests in Tilt: https://docs.tilt.dev/tests_in_tilt.html 6 | load('ext://tests/javascript', 'test_jest_yarn') 7 | 8 | # Jest is smart about what tests it runs (by default, only runs tests related to files 9 | # that have changed since your last commit), so it won't be too expensive to run this 10 | # on every file change 11 | # Make sure you have "scripts.test" configured in "package.json" 12 | # (this is done automatically for you in some frameworks, e.g. React) 13 | test_jest_yarn('unit-tests', '.', 14 | with_install=True, # make sure all dependencies are present locally so you can run tests 15 | 16 | # in CI mode, run ALL tests (not just those related to files changed since last commit) 17 | only_changed=config.tilt_subcommand != 'ci') 18 | -------------------------------------------------------------------------------- /tests-example/foo.test.js: -------------------------------------------------------------------------------- 1 | test("foo is okay", () => { 2 | expect("foo").toEqual("foo") 3 | }); 4 | 5 | test("bar is okay", () => { 6 | expect("bar").toEqual("bar") 7 | }); 8 | 9 | test("baz is okay", () => { 10 | expect("baz").toEqual("baz") 11 | }); 12 | -------------------------------------------------------------------------------- /tests-example/index.js: -------------------------------------------------------------------------------- 1 | /* 2 | Gratefully adapted from https://github.com/HemingwayLee/sample-mustache-express 3 | */ 4 | const fs = require('fs'); 5 | 6 | const express = require('express'); 7 | const app = express(); 8 | const mustacheExpress = require('mustache-express'); 9 | 10 | let timeSince = 'N/A'; 11 | 12 | app.engine('mustache', mustacheExpress()); 13 | 14 | app.set('view engine', 'mustache'); 15 | app.set('views', __dirname + '/views'); 16 | app.use(express.static('public')); 17 | 18 | app.get('/', (req, res) => { 19 | res.render('index.mustache', { 20 | time: timeSince, 21 | }); 22 | }); 23 | 24 | app.listen(8000, () => { 25 | timeSince = getSecsSinceDeploy(); 26 | console.log('Server running at http://localhost:8000/'); 27 | }); 28 | 29 | function getSecsSinceDeploy() { 30 | let curTimeMs = new Date().getTime(); 31 | let contents = fs.readFileSync('/app/start-time.txt', 'utf8'); 32 | let startTimeMs = parseInt(contents.trim()) / 10**6; 33 | return ((curTimeMs - startTimeMs) / 10**3).toFixed(2) 34 | } 35 | -------------------------------------------------------------------------------- /tests-example/index.test.js: -------------------------------------------------------------------------------- 1 | test("everything is okay", () => { 2 | expect(1).toEqual(1) 3 | }); 4 | -------------------------------------------------------------------------------- /tests-example/kubernetes.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: apps/v1 2 | kind: Deployment 3 | metadata: 4 | name: example-nodejs 5 | labels: 6 | app: example-nodejs 7 | spec: 8 | selector: 9 | matchLabels: 10 | app: example-nodejs 11 | template: 12 | metadata: 13 | labels: 14 | app: example-nodejs 15 | spec: 16 | containers: 17 | - name: example-nodejs 18 | image: example-nodejs-image 19 | ports: 20 | - containerPort: 8000 21 | -------------------------------------------------------------------------------- /tests-example/now.py: -------------------------------------------------------------------------------- 1 | import time 2 | 3 | print("%d" % (float(time.time()) * 1000 * 1000 * 1000)) -------------------------------------------------------------------------------- /tests-example/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "tilt-example-nodejs", 3 | "version": "1.0.0", 4 | "main": "index.js", 5 | "license": "MIT", 6 | "dependencies": { 7 | "express": "^4.17.1", 8 | "immutable": "^3.8.2", 9 | "mustache-express": "^1.3.0" 10 | }, 11 | "devDependencies": { 12 | "jest": "^26.6.3", 13 | "nodemon": "^2.0.2" 14 | }, 15 | "scripts": { 16 | "test": "jest" 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /tests-example/public/pets.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tilt-dev/tilt-example-nodejs/d81e0ca6f7866cfddcea0094943abdb9fb16b5ee/tests-example/public/pets.png -------------------------------------------------------------------------------- /tests-example/views/index.mustache: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 |
5 | 6 |
Hello cats!
7 |
Time from "deploy" button pressed → server up: {{time}}s
8 |
9 | 10 | 11 | --------------------------------------------------------------------------------