├── .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 | [](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 |
--------------------------------------------------------------------------------