--------------------------------------------------------------------------------
/v12/.gitignore:
--------------------------------------------------------------------------------
1 | # Logs
2 | logs
3 | *.log
4 | npm-debug.log*
5 | yarn-debug.log*
6 | yarn-error.log*
7 |
8 | # Runtime data
9 | pids
10 | *.pid
11 | *.seed
12 | *.pid.lock
13 |
14 | # Directory for instrumented libs generated by jscoverage/JSCover
15 | lib-cov
16 |
17 | # Coverage directory used by tools like istanbul
18 | coverage
19 |
20 | # nyc test coverage
21 | .nyc_output
22 |
23 | # Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files)
24 | .grunt
25 |
26 | # Bower dependency directory (https://bower.io/)
27 | bower_components
28 |
29 | # node-waf configuration
30 | .lock-wscript
31 |
32 | # Compiled binary addons (https://nodejs.org/api/addons.html)
33 | build/Release
34 |
35 | # Dependency directories
36 | node_modules/
37 | jspm_packages/
38 |
39 | # TypeScript v1 declaration files
40 | typings/
41 |
42 | # Optional npm cache directory
43 | .npm
44 |
45 | # Optional eslint cache
46 | .eslintcache
47 |
48 | # Optional REPL history
49 | .node_repl_history
50 |
51 | # Output of 'npm pack'
52 | *.tgz
53 |
54 | # Yarn Integrity file
55 | .yarn-integrity
56 |
57 | # dotenv environment variables file
58 | .env
59 |
60 | # next.js build output
61 | .next
62 |
--------------------------------------------------------------------------------
/v12/app.js:
--------------------------------------------------------------------------------
1 | const express = require('express');
2 | const path = require('path');
3 | const favicon = require('serve-favicon');
4 | const logger = require('morgan');
5 | const cookieParser = require('cookie-parser');
6 | const bodyParser = require('body-parser');
7 | const index = require('./routes/index');
8 | const app = express();
9 |
10 | // view engine setup
11 | app.set('views', path.join(__dirname, 'views'));
12 | app.set('view engine', 'hbs');
13 |
14 | app.use(favicon(path.join(__dirname, 'public', 'favicon.ico')));
15 | app.use(logger('dev'));
16 | app.use(bodyParser.json());
17 | app.use(bodyParser.urlencoded({ extended: false }));
18 | app.use(cookieParser());
19 | app.use(express.static(path.join(__dirname, 'public')));
20 |
21 | app.use('/', index);
22 |
23 | // catch 404 and forward to error handler
24 | app.use((req, res, next) => {
25 | const err = new Error('Not Found');
26 | err.status = 404;
27 | next(err);
28 | });
29 |
30 | // error handler
31 | app.use((err, req, res, next) => {
32 | // set locals, only providing error in development
33 | res.locals.message = err.message;
34 | res.locals.error = req.app.get('env') === 'development' ? err : {};
35 |
36 | // render the error page
37 | res.status(err.status || 500);
38 | res.render('error');
39 | });
40 |
41 | module.exports = app;
42 |
--------------------------------------------------------------------------------
/v12/bin/www:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env node
2 |
3 | /**
4 | * Module dependencies.
5 | */
6 |
7 | var app = require('../app');
8 | var debug = require('debug')('node-blobs-image-resize:server');
9 | var http = require('http');
10 |
11 | /**
12 | * Get port from environment and store in Express.
13 | */
14 |
15 | var port = normalizePort(process.env.PORT || '3000');
16 | app.set('port', port);
17 |
18 | /**
19 | * Create HTTP server.
20 | */
21 |
22 | var server = http.createServer(app);
23 |
24 | /**
25 | * Listen on provided port, on all network interfaces.
26 | */
27 |
28 | server.listen(port);
29 | server.on('error', onError);
30 | server.on('listening', onListening);
31 |
32 | /**
33 | * Normalize a port into a number, string, or false.
34 | */
35 |
36 | function normalizePort(val) {
37 | var port = parseInt(val, 10);
38 |
39 | if (isNaN(port)) {
40 | // named pipe
41 | return val;
42 | }
43 |
44 | if (port >= 0) {
45 | // port number
46 | return port;
47 | }
48 |
49 | return false;
50 | }
51 |
52 | /**
53 | * Event listener for HTTP server "error" event.
54 | */
55 |
56 | function onError(error) {
57 | if (error.syscall !== 'listen') {
58 | throw error;
59 | }
60 |
61 | var bind = typeof port === 'string'
62 | ? 'Pipe ' + port
63 | : 'Port ' + port;
64 |
65 | // handle specific listen errors with friendly messages
66 | switch (error.code) {
67 | case 'EACCES':
68 | console.error(bind + ' requires elevated privileges');
69 | process.exit(1);
70 | break;
71 | case 'EADDRINUSE':
72 | console.error(bind + ' is already in use');
73 | process.exit(1);
74 | break;
75 | default:
76 | throw error;
77 | }
78 | }
79 |
80 | /**
81 | * Event listener for HTTP server "listening" event.
82 | */
83 |
84 | function onListening() {
85 | var addr = server.address();
86 | var bind = typeof addr === 'string'
87 | ? 'pipe ' + addr
88 | : 'port ' + addr.port;
89 | debug('Listening on ' + bind);
90 | }
91 |
--------------------------------------------------------------------------------
/v12/package-lock.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "node-blobs-image-resize",
3 | "version": "0.0.12",
4 | "lockfileVersion": 1,
5 | "requires": true,
6 | "dependencies": {
7 | "@azure/abort-controller": {
8 | "version": "1.0.1",
9 | "resolved": "https://registry.npmjs.org/@azure/abort-controller/-/abort-controller-1.0.1.tgz",
10 | "integrity": "sha512-wP2Jw6uPp8DEDy0n4KNidvwzDjyVV2xnycEIq7nPzj1rHyb/r+t3OPeNT1INZePP2wy5ZqlwyuyOMTi0ePyY1A==",
11 | "requires": {
12 | "tslib": "^1.9.3"
13 | }
14 | },
15 | "@azure/core-asynciterator-polyfill": {
16 | "version": "1.0.0",
17 | "resolved": "https://registry.npmjs.org/@azure/core-asynciterator-polyfill/-/core-asynciterator-polyfill-1.0.0.tgz",
18 | "integrity": "sha512-kmv8CGrPfN9SwMwrkiBK9VTQYxdFQEGe0BmQk+M8io56P9KNzpAxcWE/1fxJj7uouwN4kXF0BHW8DNlgx+wtCg=="
19 | },
20 | "@azure/core-auth": {
21 | "version": "1.1.2",
22 | "resolved": "https://registry.npmjs.org/@azure/core-auth/-/core-auth-1.1.2.tgz",
23 | "integrity": "sha512-IUbP/f3v96dpHgXUwsAjUwDzjlUjawyUhWhGKKB6Qxy+iqppC/pVBPyc6kdpyTe7H30HN+4H3f0lar7Wp9Hx6A==",
24 | "requires": {
25 | "@azure/abort-controller": "^1.0.0",
26 | "@azure/core-tracing": "1.0.0-preview.8",
27 | "@opentelemetry/api": "^0.6.1",
28 | "tslib": "^1.10.0"
29 | }
30 | },
31 | "@azure/core-http": {
32 | "version": "1.1.3",
33 | "resolved": "https://registry.npmjs.org/@azure/core-http/-/core-http-1.1.3.tgz",
34 | "integrity": "sha512-GysW3+BRVV4L9cs3GsuCbnlyibrQU6hh5mcJ7hlnk7tdUBzWybUvJ8/P/nHX49PgwRmi81pD5v1ht2jF0IzxAQ==",
35 | "requires": {
36 | "@azure/abort-controller": "^1.0.0",
37 | "@azure/core-auth": "^1.1.2",
38 | "@azure/core-tracing": "1.0.0-preview.8",
39 | "@azure/logger": "^1.0.0",
40 | "@opentelemetry/api": "^0.6.1",
41 | "@types/node-fetch": "^2.5.0",
42 | "@types/tunnel": "^0.0.1",
43 | "form-data": "^3.0.0",
44 | "node-fetch": "^2.6.0",
45 | "process": "^0.11.10",
46 | "tough-cookie": "^4.0.0",
47 | "tslib": "^1.10.0",
48 | "tunnel": "^0.0.6",
49 | "uuid": "^8.1.0",
50 | "xml2js": "^0.4.19"
51 | }
52 | },
53 | "@azure/core-lro": {
54 | "version": "1.0.2",
55 | "resolved": "https://registry.npmjs.org/@azure/core-lro/-/core-lro-1.0.2.tgz",
56 | "integrity": "sha512-Yr0JD7GKryOmbcb5wHCQoQ4KCcH5QJWRNorofid+UvudLaxnbCfvKh/cUfQsGUqRjO9L/Bw4X7FP824DcHdMxw==",
57 | "requires": {
58 | "@azure/abort-controller": "^1.0.0",
59 | "@azure/core-http": "^1.1.1",
60 | "events": "^3.0.0",
61 | "tslib": "^1.10.0"
62 | }
63 | },
64 | "@azure/core-paging": {
65 | "version": "1.1.1",
66 | "resolved": "https://registry.npmjs.org/@azure/core-paging/-/core-paging-1.1.1.tgz",
67 | "integrity": "sha512-hqEJBEGKan4YdOaL9ZG/GRG6PXaFd/Wb3SSjQW4LWotZzgl6xqG00h6wmkrpd2NNkbBkD1erLHBO3lPHApv+iQ==",
68 | "requires": {
69 | "@azure/core-asynciterator-polyfill": "^1.0.0"
70 | }
71 | },
72 | "@azure/core-tracing": {
73 | "version": "1.0.0-preview.8",
74 | "resolved": "https://registry.npmjs.org/@azure/core-tracing/-/core-tracing-1.0.0-preview.8.tgz",
75 | "integrity": "sha512-ZKUpCd7Dlyfn7bdc+/zC/sf0aRIaNQMDuSj2RhYRFe3p70hVAnYGp3TX4cnG2yoEALp/LTj/XnZGQ8Xzf6Ja/Q==",
76 | "requires": {
77 | "@opencensus/web-types": "0.0.7",
78 | "@opentelemetry/api": "^0.6.1",
79 | "tslib": "^1.10.0"
80 | }
81 | },
82 | "@azure/logger": {
83 | "version": "1.0.0",
84 | "resolved": "https://registry.npmjs.org/@azure/logger/-/logger-1.0.0.tgz",
85 | "integrity": "sha512-g2qLDgvmhyIxR3JVS8N67CyIOeFRKQlX/llxYJQr1OSGQqM3HTpVP8MjmjcEKbL/OIt2N9C9UFaNQuKOw1laOA==",
86 | "requires": {
87 | "tslib": "^1.9.3"
88 | }
89 | },
90 | "@azure/storage-blob": {
91 | "version": "12.1.2",
92 | "resolved": "https://registry.npmjs.org/@azure/storage-blob/-/storage-blob-12.1.2.tgz",
93 | "integrity": "sha512-PCHgG4r3xLt5FaFj+uiMqrRpuzD3TD17cvxCeA1JKK2bJEf8b07H3QRLQVf0DM1MmvYY8FgQagkWZTp+jr9yew==",
94 | "requires": {
95 | "@azure/abort-controller": "^1.0.0",
96 | "@azure/core-http": "^1.1.1",
97 | "@azure/core-lro": "^1.0.2",
98 | "@azure/core-paging": "^1.1.1",
99 | "@azure/core-tracing": "1.0.0-preview.8",
100 | "@azure/logger": "^1.0.0",
101 | "@opentelemetry/api": "^0.6.1",
102 | "events": "^3.0.0",
103 | "tslib": "^1.10.0"
104 | }
105 | },
106 | "@opencensus/web-types": {
107 | "version": "0.0.7",
108 | "resolved": "https://registry.npmjs.org/@opencensus/web-types/-/web-types-0.0.7.tgz",
109 | "integrity": "sha512-xB+w7ZDAu3YBzqH44rCmG9/RlrOmFuDPt/bpf17eJr8eZSrLt7nc7LnWdxM9Mmoj/YKMHpxRg28txu3TcpiL+g=="
110 | },
111 | "@opentelemetry/api": {
112 | "version": "0.6.1",
113 | "resolved": "https://registry.npmjs.org/@opentelemetry/api/-/api-0.6.1.tgz",
114 | "integrity": "sha512-wpufGZa7tTxw7eAsjXJtiyIQ42IWQdX9iUQp7ACJcKo1hCtuhLU+K2Nv1U6oRwT1oAlZTE6m4CgWKZBhOiau3Q==",
115 | "requires": {
116 | "@opentelemetry/context-base": "^0.6.1"
117 | }
118 | },
119 | "@opentelemetry/context-base": {
120 | "version": "0.6.1",
121 | "resolved": "https://registry.npmjs.org/@opentelemetry/context-base/-/context-base-0.6.1.tgz",
122 | "integrity": "sha512-5bHhlTBBq82ti3qPT15TRxkYTFPPQWbnkkQkmHPtqiS1XcTB69cEKd3Jm7Cfi/vkPoyxapmePE9tyA7EzLt8SQ=="
123 | },
124 | "@types/node": {
125 | "version": "14.0.14",
126 | "resolved": "https://registry.npmjs.org/@types/node/-/node-14.0.14.tgz",
127 | "integrity": "sha512-syUgf67ZQpaJj01/tRTknkMNoBBLWJOBODF0Zm4NrXmiSuxjymFrxnTu1QVYRubhVkRcZLYZG8STTwJRdVm/WQ=="
128 | },
129 | "@types/node-fetch": {
130 | "version": "2.5.7",
131 | "resolved": "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-2.5.7.tgz",
132 | "integrity": "sha512-o2WVNf5UhWRkxlf6eq+jMZDu7kjgpgJfl4xVNlvryc95O/6F2ld8ztKX+qu+Rjyet93WAWm5LjeX9H5FGkODvw==",
133 | "requires": {
134 | "@types/node": "*",
135 | "form-data": "^3.0.0"
136 | }
137 | },
138 | "@types/tunnel": {
139 | "version": "0.0.1",
140 | "resolved": "https://registry.npmjs.org/@types/tunnel/-/tunnel-0.0.1.tgz",
141 | "integrity": "sha512-AOqu6bQu5MSWwYvehMXLukFHnupHrpZ8nvgae5Ggie9UwzDR1CCwoXgSSWNZJuyOlCdfdsWMA5F2LlmvyoTv8A==",
142 | "requires": {
143 | "@types/node": "*"
144 | }
145 | },
146 | "accepts": {
147 | "version": "1.3.7",
148 | "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz",
149 | "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==",
150 | "requires": {
151 | "mime-types": "~2.1.24",
152 | "negotiator": "0.6.2"
153 | }
154 | },
155 | "append-field": {
156 | "version": "1.0.0",
157 | "resolved": "https://registry.npmjs.org/append-field/-/append-field-1.0.0.tgz",
158 | "integrity": "sha1-HjRA6RXwsSA9I3SOeO3XubW0PlY="
159 | },
160 | "array-flatten": {
161 | "version": "1.1.1",
162 | "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz",
163 | "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI="
164 | },
165 | "asynckit": {
166 | "version": "0.4.0",
167 | "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
168 | "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k="
169 | },
170 | "basic-auth": {
171 | "version": "2.0.1",
172 | "resolved": "https://registry.npmjs.org/basic-auth/-/basic-auth-2.0.1.tgz",
173 | "integrity": "sha512-NF+epuEdnUYVlGuhaxbbq+dvJttwLnGY+YixlXlME5KpQ5W3CnXA5cVTneY3SPbPDRkcjMbifrwmFYcClgOZeg==",
174 | "requires": {
175 | "safe-buffer": "5.1.2"
176 | }
177 | },
178 | "body-parser": {
179 | "version": "1.19.0",
180 | "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz",
181 | "integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==",
182 | "requires": {
183 | "bytes": "3.1.0",
184 | "content-type": "~1.0.4",
185 | "debug": "2.6.9",
186 | "depd": "~1.1.2",
187 | "http-errors": "1.7.2",
188 | "iconv-lite": "0.4.24",
189 | "on-finished": "~2.3.0",
190 | "qs": "6.7.0",
191 | "raw-body": "2.4.0",
192 | "type-is": "~1.6.17"
193 | },
194 | "dependencies": {
195 | "debug": {
196 | "version": "2.6.9",
197 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
198 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
199 | "requires": {
200 | "ms": "2.0.0"
201 | }
202 | }
203 | }
204 | },
205 | "buffer-from": {
206 | "version": "1.1.1",
207 | "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz",
208 | "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A=="
209 | },
210 | "busboy": {
211 | "version": "0.2.14",
212 | "resolved": "https://registry.npmjs.org/busboy/-/busboy-0.2.14.tgz",
213 | "integrity": "sha1-bCpiLvz0fFe7vh4qnDetNseSVFM=",
214 | "requires": {
215 | "dicer": "0.2.5",
216 | "readable-stream": "1.1.x"
217 | },
218 | "dependencies": {
219 | "isarray": {
220 | "version": "0.0.1",
221 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz",
222 | "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8="
223 | },
224 | "readable-stream": {
225 | "version": "1.1.14",
226 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz",
227 | "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=",
228 | "requires": {
229 | "core-util-is": "~1.0.0",
230 | "inherits": "~2.0.1",
231 | "isarray": "0.0.1",
232 | "string_decoder": "~0.10.x"
233 | }
234 | },
235 | "string_decoder": {
236 | "version": "0.10.31",
237 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz",
238 | "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ="
239 | }
240 | }
241 | },
242 | "bytes": {
243 | "version": "3.1.0",
244 | "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz",
245 | "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg=="
246 | },
247 | "combined-stream": {
248 | "version": "1.0.8",
249 | "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
250 | "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
251 | "requires": {
252 | "delayed-stream": "~1.0.0"
253 | }
254 | },
255 | "concat-stream": {
256 | "version": "1.6.2",
257 | "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz",
258 | "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==",
259 | "requires": {
260 | "buffer-from": "^1.0.0",
261 | "inherits": "^2.0.3",
262 | "readable-stream": "^2.2.2",
263 | "typedarray": "^0.0.6"
264 | }
265 | },
266 | "content-disposition": {
267 | "version": "0.5.3",
268 | "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz",
269 | "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==",
270 | "requires": {
271 | "safe-buffer": "5.1.2"
272 | }
273 | },
274 | "content-type": {
275 | "version": "1.0.4",
276 | "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz",
277 | "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA=="
278 | },
279 | "cookie": {
280 | "version": "0.4.0",
281 | "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz",
282 | "integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg=="
283 | },
284 | "cookie-parser": {
285 | "version": "1.4.5",
286 | "resolved": "https://registry.npmjs.org/cookie-parser/-/cookie-parser-1.4.5.tgz",
287 | "integrity": "sha512-f13bPUj/gG/5mDr+xLmSxxDsB9DQiTIfhJS/sqjrmfAWiAN+x2O4i/XguTL9yDZ+/IFDanJ+5x7hC4CXT9Tdzw==",
288 | "requires": {
289 | "cookie": "0.4.0",
290 | "cookie-signature": "1.0.6"
291 | }
292 | },
293 | "cookie-signature": {
294 | "version": "1.0.6",
295 | "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz",
296 | "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw="
297 | },
298 | "core-util-is": {
299 | "version": "1.0.2",
300 | "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz",
301 | "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac="
302 | },
303 | "debug": {
304 | "version": "4.1.1",
305 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz",
306 | "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==",
307 | "requires": {
308 | "ms": "^2.1.1"
309 | },
310 | "dependencies": {
311 | "ms": {
312 | "version": "2.1.2",
313 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
314 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
315 | }
316 | }
317 | },
318 | "delayed-stream": {
319 | "version": "1.0.0",
320 | "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
321 | "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk="
322 | },
323 | "depd": {
324 | "version": "1.1.2",
325 | "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz",
326 | "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak="
327 | },
328 | "destroy": {
329 | "version": "1.0.4",
330 | "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz",
331 | "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA="
332 | },
333 | "dicer": {
334 | "version": "0.2.5",
335 | "resolved": "https://registry.npmjs.org/dicer/-/dicer-0.2.5.tgz",
336 | "integrity": "sha1-WZbAhrszIYyBLAkL3cCc0S+stw8=",
337 | "requires": {
338 | "readable-stream": "1.1.x",
339 | "streamsearch": "0.1.2"
340 | },
341 | "dependencies": {
342 | "isarray": {
343 | "version": "0.0.1",
344 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz",
345 | "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8="
346 | },
347 | "readable-stream": {
348 | "version": "1.1.14",
349 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz",
350 | "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=",
351 | "requires": {
352 | "core-util-is": "~1.0.0",
353 | "inherits": "~2.0.1",
354 | "isarray": "0.0.1",
355 | "string_decoder": "~0.10.x"
356 | }
357 | },
358 | "string_decoder": {
359 | "version": "0.10.31",
360 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz",
361 | "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ="
362 | }
363 | }
364 | },
365 | "dotenv": {
366 | "version": "8.2.0",
367 | "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-8.2.0.tgz",
368 | "integrity": "sha512-8sJ78ElpbDJBHNeBzUbUVLsqKdccaa/BXF1uPTw3GrvQTBgrQrtObr2mUrE38vzYd8cEv+m/JBfDLioYcfXoaw=="
369 | },
370 | "ee-first": {
371 | "version": "1.1.1",
372 | "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
373 | "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0="
374 | },
375 | "encodeurl": {
376 | "version": "1.0.2",
377 | "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz",
378 | "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k="
379 | },
380 | "escape-html": {
381 | "version": "1.0.3",
382 | "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz",
383 | "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg="
384 | },
385 | "etag": {
386 | "version": "1.8.1",
387 | "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz",
388 | "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc="
389 | },
390 | "events": {
391 | "version": "3.1.0",
392 | "resolved": "https://registry.npmjs.org/events/-/events-3.1.0.tgz",
393 | "integrity": "sha512-Rv+u8MLHNOdMjTAFeT3nCjHn2aGlx435FP/sDHNaRhDEMwyI/aB22Kj2qIN8R0cw3z28psEQLYwxVKLsKrMgWg=="
394 | },
395 | "express": {
396 | "version": "4.17.1",
397 | "resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz",
398 | "integrity": "sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==",
399 | "requires": {
400 | "accepts": "~1.3.7",
401 | "array-flatten": "1.1.1",
402 | "body-parser": "1.19.0",
403 | "content-disposition": "0.5.3",
404 | "content-type": "~1.0.4",
405 | "cookie": "0.4.0",
406 | "cookie-signature": "1.0.6",
407 | "debug": "2.6.9",
408 | "depd": "~1.1.2",
409 | "encodeurl": "~1.0.2",
410 | "escape-html": "~1.0.3",
411 | "etag": "~1.8.1",
412 | "finalhandler": "~1.1.2",
413 | "fresh": "0.5.2",
414 | "merge-descriptors": "1.0.1",
415 | "methods": "~1.1.2",
416 | "on-finished": "~2.3.0",
417 | "parseurl": "~1.3.3",
418 | "path-to-regexp": "0.1.7",
419 | "proxy-addr": "~2.0.5",
420 | "qs": "6.7.0",
421 | "range-parser": "~1.2.1",
422 | "safe-buffer": "5.1.2",
423 | "send": "0.17.1",
424 | "serve-static": "1.14.1",
425 | "setprototypeof": "1.1.1",
426 | "statuses": "~1.5.0",
427 | "type-is": "~1.6.18",
428 | "utils-merge": "1.0.1",
429 | "vary": "~1.1.2"
430 | },
431 | "dependencies": {
432 | "debug": {
433 | "version": "2.6.9",
434 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
435 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
436 | "requires": {
437 | "ms": "2.0.0"
438 | }
439 | }
440 | }
441 | },
442 | "finalhandler": {
443 | "version": "1.1.2",
444 | "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz",
445 | "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==",
446 | "requires": {
447 | "debug": "2.6.9",
448 | "encodeurl": "~1.0.2",
449 | "escape-html": "~1.0.3",
450 | "on-finished": "~2.3.0",
451 | "parseurl": "~1.3.3",
452 | "statuses": "~1.5.0",
453 | "unpipe": "~1.0.0"
454 | },
455 | "dependencies": {
456 | "debug": {
457 | "version": "2.6.9",
458 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
459 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
460 | "requires": {
461 | "ms": "2.0.0"
462 | }
463 | }
464 | }
465 | },
466 | "foreachasync": {
467 | "version": "3.0.0",
468 | "resolved": "https://registry.npmjs.org/foreachasync/-/foreachasync-3.0.0.tgz",
469 | "integrity": "sha1-VQKYfchxS+M5IJfzLgBxyd7gfPY="
470 | },
471 | "form-data": {
472 | "version": "3.0.0",
473 | "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.0.tgz",
474 | "integrity": "sha512-CKMFDglpbMi6PyN+brwB9Q/GOw0eAnsrEZDgcsH5Krhz5Od/haKHAX0NmQfha2zPPz0JpWzA7GJHGSnvCRLWsg==",
475 | "requires": {
476 | "asynckit": "^0.4.0",
477 | "combined-stream": "^1.0.8",
478 | "mime-types": "^2.1.12"
479 | }
480 | },
481 | "forwarded": {
482 | "version": "0.1.2",
483 | "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz",
484 | "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ="
485 | },
486 | "fresh": {
487 | "version": "0.5.2",
488 | "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz",
489 | "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac="
490 | },
491 | "from2": {
492 | "version": "2.3.0",
493 | "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz",
494 | "integrity": "sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8=",
495 | "requires": {
496 | "inherits": "^2.0.1",
497 | "readable-stream": "^2.0.0"
498 | }
499 | },
500 | "handlebars": {
501 | "version": "4.7.6",
502 | "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.6.tgz",
503 | "integrity": "sha512-1f2BACcBfiwAfStCKZNrUCgqNZkGsAT7UM3kkYtXuLo0KnaVfjKOyf7PRzB6++aK9STyT1Pd2ZCPe3EGOXleXA==",
504 | "requires": {
505 | "minimist": "^1.2.5",
506 | "neo-async": "^2.6.0",
507 | "source-map": "^0.6.1",
508 | "uglify-js": "^3.1.4",
509 | "wordwrap": "^1.0.0"
510 | }
511 | },
512 | "hbs": {
513 | "version": "4.1.1",
514 | "resolved": "https://registry.npmjs.org/hbs/-/hbs-4.1.1.tgz",
515 | "integrity": "sha512-6QsbB4RwbpL4cb4DNyjEEPF+suwp+3yZqFVlhILEn92ScC0U4cDCR+FDX53jkfKJPhutcqhAvs+rOLZw5sQrDA==",
516 | "requires": {
517 | "handlebars": "4.7.6",
518 | "walk": "2.3.14"
519 | }
520 | },
521 | "http-errors": {
522 | "version": "1.7.2",
523 | "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz",
524 | "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==",
525 | "requires": {
526 | "depd": "~1.1.2",
527 | "inherits": "2.0.3",
528 | "setprototypeof": "1.1.1",
529 | "statuses": ">= 1.5.0 < 2",
530 | "toidentifier": "1.0.0"
531 | }
532 | },
533 | "iconv-lite": {
534 | "version": "0.4.24",
535 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
536 | "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
537 | "requires": {
538 | "safer-buffer": ">= 2.1.2 < 3"
539 | }
540 | },
541 | "inherits": {
542 | "version": "2.0.3",
543 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
544 | "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4="
545 | },
546 | "into-stream": {
547 | "version": "5.1.1",
548 | "resolved": "https://registry.npmjs.org/into-stream/-/into-stream-5.1.1.tgz",
549 | "integrity": "sha512-krrAJ7McQxGGmvaYbB7Q1mcA+cRwg9Ij2RfWIeVesNBgVDZmzY/Fa4IpZUT3bmdRzMzdf/mzltCG2Dq99IZGBA==",
550 | "requires": {
551 | "from2": "^2.3.0",
552 | "p-is-promise": "^3.0.0"
553 | }
554 | },
555 | "ipaddr.js": {
556 | "version": "1.9.1",
557 | "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz",
558 | "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g=="
559 | },
560 | "isarray": {
561 | "version": "1.0.0",
562 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
563 | "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE="
564 | },
565 | "media-typer": {
566 | "version": "0.3.0",
567 | "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz",
568 | "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g="
569 | },
570 | "merge-descriptors": {
571 | "version": "1.0.1",
572 | "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz",
573 | "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E="
574 | },
575 | "methods": {
576 | "version": "1.1.2",
577 | "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz",
578 | "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4="
579 | },
580 | "mime": {
581 | "version": "1.6.0",
582 | "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz",
583 | "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg=="
584 | },
585 | "mime-db": {
586 | "version": "1.44.0",
587 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.44.0.tgz",
588 | "integrity": "sha512-/NOTfLrsPBVeH7YtFPgsVWveuL+4SjjYxaQ1xtM1KMFj7HdxlBlxeyNLzhyJVx7r4rZGJAZ/6lkKCitSc/Nmpg=="
589 | },
590 | "mime-types": {
591 | "version": "2.1.27",
592 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.27.tgz",
593 | "integrity": "sha512-JIhqnCasI9yD+SsmkquHBxTSEuZdQX5BuQnS2Vc7puQQQ+8yiP5AY5uWhpdv4YL4VM5c6iliiYWPgJ/nJQLp7w==",
594 | "requires": {
595 | "mime-db": "1.44.0"
596 | }
597 | },
598 | "minimist": {
599 | "version": "1.2.5",
600 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz",
601 | "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw=="
602 | },
603 | "mkdirp": {
604 | "version": "0.5.5",
605 | "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz",
606 | "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==",
607 | "requires": {
608 | "minimist": "^1.2.5"
609 | }
610 | },
611 | "morgan": {
612 | "version": "1.10.0",
613 | "resolved": "https://registry.npmjs.org/morgan/-/morgan-1.10.0.tgz",
614 | "integrity": "sha512-AbegBVI4sh6El+1gNwvD5YIck7nSA36weD7xvIxG4in80j/UoK8AEGaWnnz8v1GxonMCltmlNs5ZKbGvl9b1XQ==",
615 | "requires": {
616 | "basic-auth": "~2.0.1",
617 | "debug": "2.6.9",
618 | "depd": "~2.0.0",
619 | "on-finished": "~2.3.0",
620 | "on-headers": "~1.0.2"
621 | },
622 | "dependencies": {
623 | "debug": {
624 | "version": "2.6.9",
625 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
626 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
627 | "requires": {
628 | "ms": "2.0.0"
629 | }
630 | },
631 | "depd": {
632 | "version": "2.0.0",
633 | "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz",
634 | "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw=="
635 | }
636 | }
637 | },
638 | "ms": {
639 | "version": "2.0.0",
640 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
641 | "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
642 | },
643 | "multer": {
644 | "version": "1.4.2",
645 | "resolved": "https://registry.npmjs.org/multer/-/multer-1.4.2.tgz",
646 | "integrity": "sha512-xY8pX7V+ybyUpbYMxtjM9KAiD9ixtg5/JkeKUTD6xilfDv0vzzOFcCp4Ljb1UU3tSOM3VTZtKo63OmzOrGi3Cg==",
647 | "requires": {
648 | "append-field": "^1.0.0",
649 | "busboy": "^0.2.11",
650 | "concat-stream": "^1.5.2",
651 | "mkdirp": "^0.5.1",
652 | "object-assign": "^4.1.1",
653 | "on-finished": "^2.3.0",
654 | "type-is": "^1.6.4",
655 | "xtend": "^4.0.0"
656 | }
657 | },
658 | "negotiator": {
659 | "version": "0.6.2",
660 | "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz",
661 | "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw=="
662 | },
663 | "neo-async": {
664 | "version": "2.6.1",
665 | "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.1.tgz",
666 | "integrity": "sha512-iyam8fBuCUpWeKPGpaNMetEocMt364qkCsfL9JuhjXX6dRnguRVOfk2GZaDpPjcOKiiXCPINZC1GczQ7iTq3Zw=="
667 | },
668 | "node-fetch": {
669 | "version": "2.6.0",
670 | "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.0.tgz",
671 | "integrity": "sha512-8dG4H5ujfvFiqDmVu9fQ5bOHUC15JMjMY/Zumv26oOvvVJjM67KF8koCWIabKQ1GJIa9r2mMZscBq/TbdOcmNA=="
672 | },
673 | "object-assign": {
674 | "version": "4.1.1",
675 | "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
676 | "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM="
677 | },
678 | "on-finished": {
679 | "version": "2.3.0",
680 | "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz",
681 | "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=",
682 | "requires": {
683 | "ee-first": "1.1.1"
684 | }
685 | },
686 | "on-headers": {
687 | "version": "1.0.2",
688 | "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz",
689 | "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA=="
690 | },
691 | "p-is-promise": {
692 | "version": "3.0.0",
693 | "resolved": "https://registry.npmjs.org/p-is-promise/-/p-is-promise-3.0.0.tgz",
694 | "integrity": "sha512-Wo8VsW4IRQSKVXsJCn7TomUaVtyfjVDn3nUP7kE967BQk0CwFpdbZs0X0uk5sW9mkBa9eNM7hCMaG93WUAwxYQ=="
695 | },
696 | "parseurl": {
697 | "version": "1.3.3",
698 | "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz",
699 | "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ=="
700 | },
701 | "path-to-regexp": {
702 | "version": "0.1.7",
703 | "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz",
704 | "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w="
705 | },
706 | "process": {
707 | "version": "0.11.10",
708 | "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz",
709 | "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI="
710 | },
711 | "process-nextick-args": {
712 | "version": "2.0.1",
713 | "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz",
714 | "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag=="
715 | },
716 | "proxy-addr": {
717 | "version": "2.0.6",
718 | "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.6.tgz",
719 | "integrity": "sha512-dh/frvCBVmSsDYzw6n926jv974gddhkFPfiN8hPOi30Wax25QZyZEGveluCgliBnqmuM+UJmBErbAUFIoDbjOw==",
720 | "requires": {
721 | "forwarded": "~0.1.2",
722 | "ipaddr.js": "1.9.1"
723 | }
724 | },
725 | "psl": {
726 | "version": "1.8.0",
727 | "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz",
728 | "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ=="
729 | },
730 | "punycode": {
731 | "version": "2.1.1",
732 | "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz",
733 | "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A=="
734 | },
735 | "qs": {
736 | "version": "6.7.0",
737 | "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz",
738 | "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ=="
739 | },
740 | "range-parser": {
741 | "version": "1.2.1",
742 | "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz",
743 | "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg=="
744 | },
745 | "raw-body": {
746 | "version": "2.4.0",
747 | "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz",
748 | "integrity": "sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==",
749 | "requires": {
750 | "bytes": "3.1.0",
751 | "http-errors": "1.7.2",
752 | "iconv-lite": "0.4.24",
753 | "unpipe": "1.0.0"
754 | }
755 | },
756 | "readable-stream": {
757 | "version": "2.3.7",
758 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz",
759 | "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==",
760 | "requires": {
761 | "core-util-is": "~1.0.0",
762 | "inherits": "~2.0.3",
763 | "isarray": "~1.0.0",
764 | "process-nextick-args": "~2.0.0",
765 | "safe-buffer": "~5.1.1",
766 | "string_decoder": "~1.1.1",
767 | "util-deprecate": "~1.0.1"
768 | }
769 | },
770 | "safe-buffer": {
771 | "version": "5.1.2",
772 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
773 | "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="
774 | },
775 | "safer-buffer": {
776 | "version": "2.1.2",
777 | "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
778 | "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="
779 | },
780 | "sax": {
781 | "version": "1.2.4",
782 | "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz",
783 | "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw=="
784 | },
785 | "send": {
786 | "version": "0.17.1",
787 | "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz",
788 | "integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==",
789 | "requires": {
790 | "debug": "2.6.9",
791 | "depd": "~1.1.2",
792 | "destroy": "~1.0.4",
793 | "encodeurl": "~1.0.2",
794 | "escape-html": "~1.0.3",
795 | "etag": "~1.8.1",
796 | "fresh": "0.5.2",
797 | "http-errors": "~1.7.2",
798 | "mime": "1.6.0",
799 | "ms": "2.1.1",
800 | "on-finished": "~2.3.0",
801 | "range-parser": "~1.2.1",
802 | "statuses": "~1.5.0"
803 | },
804 | "dependencies": {
805 | "debug": {
806 | "version": "2.6.9",
807 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
808 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
809 | "requires": {
810 | "ms": "2.0.0"
811 | },
812 | "dependencies": {
813 | "ms": {
814 | "version": "2.0.0",
815 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
816 | "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
817 | }
818 | }
819 | },
820 | "ms": {
821 | "version": "2.1.1",
822 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz",
823 | "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg=="
824 | }
825 | }
826 | },
827 | "serve-favicon": {
828 | "version": "2.5.0",
829 | "resolved": "https://registry.npmjs.org/serve-favicon/-/serve-favicon-2.5.0.tgz",
830 | "integrity": "sha1-k10kDN/g9YBTB/3+ln2IlCosvPA=",
831 | "requires": {
832 | "etag": "~1.8.1",
833 | "fresh": "0.5.2",
834 | "ms": "2.1.1",
835 | "parseurl": "~1.3.2",
836 | "safe-buffer": "5.1.1"
837 | },
838 | "dependencies": {
839 | "ms": {
840 | "version": "2.1.1",
841 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz",
842 | "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg=="
843 | },
844 | "safe-buffer": {
845 | "version": "5.1.1",
846 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz",
847 | "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg=="
848 | }
849 | }
850 | },
851 | "serve-static": {
852 | "version": "1.14.1",
853 | "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.1.tgz",
854 | "integrity": "sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==",
855 | "requires": {
856 | "encodeurl": "~1.0.2",
857 | "escape-html": "~1.0.3",
858 | "parseurl": "~1.3.3",
859 | "send": "0.17.1"
860 | }
861 | },
862 | "setprototypeof": {
863 | "version": "1.1.1",
864 | "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz",
865 | "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw=="
866 | },
867 | "source-map": {
868 | "version": "0.6.1",
869 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
870 | "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="
871 | },
872 | "statuses": {
873 | "version": "1.5.0",
874 | "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz",
875 | "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow="
876 | },
877 | "streamsearch": {
878 | "version": "0.1.2",
879 | "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-0.1.2.tgz",
880 | "integrity": "sha1-gIudDlb8Jz2Am6VzOOkpkZoanxo="
881 | },
882 | "string_decoder": {
883 | "version": "1.1.1",
884 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
885 | "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
886 | "requires": {
887 | "safe-buffer": "~5.1.0"
888 | }
889 | },
890 | "toidentifier": {
891 | "version": "1.0.0",
892 | "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz",
893 | "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw=="
894 | },
895 | "tough-cookie": {
896 | "version": "4.0.0",
897 | "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.0.0.tgz",
898 | "integrity": "sha512-tHdtEpQCMrc1YLrMaqXXcj6AxhYi/xgit6mZu1+EDWUn+qhUf8wMQoFIy9NXuq23zAwtcB0t/MjACGR18pcRbg==",
899 | "requires": {
900 | "psl": "^1.1.33",
901 | "punycode": "^2.1.1",
902 | "universalify": "^0.1.2"
903 | }
904 | },
905 | "tslib": {
906 | "version": "1.13.0",
907 | "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.13.0.tgz",
908 | "integrity": "sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q=="
909 | },
910 | "tunnel": {
911 | "version": "0.0.6",
912 | "resolved": "https://registry.npmjs.org/tunnel/-/tunnel-0.0.6.tgz",
913 | "integrity": "sha512-1h/Lnq9yajKY2PEbBadPXj3VxsDDu844OnaAo52UVmIzIvwwtBPIuNvkjuzBlTWpfJyUbG3ez0KSBibQkj4ojg=="
914 | },
915 | "type-is": {
916 | "version": "1.6.18",
917 | "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz",
918 | "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==",
919 | "requires": {
920 | "media-typer": "0.3.0",
921 | "mime-types": "~2.1.24"
922 | }
923 | },
924 | "typedarray": {
925 | "version": "0.0.6",
926 | "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz",
927 | "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c="
928 | },
929 | "uglify-js": {
930 | "version": "3.10.0",
931 | "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.10.0.tgz",
932 | "integrity": "sha512-Esj5HG5WAyrLIdYU74Z3JdG2PxdIusvj6IWHMtlyESxc7kcDz7zYlYjpnSokn1UbpV0d/QX9fan7gkCNd/9BQA==",
933 | "optional": true
934 | },
935 | "universalify": {
936 | "version": "0.1.2",
937 | "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz",
938 | "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg=="
939 | },
940 | "unpipe": {
941 | "version": "1.0.0",
942 | "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz",
943 | "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw="
944 | },
945 | "util-deprecate": {
946 | "version": "1.0.2",
947 | "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
948 | "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8="
949 | },
950 | "utils-merge": {
951 | "version": "1.0.1",
952 | "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz",
953 | "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM="
954 | },
955 | "uuid": {
956 | "version": "8.2.0",
957 | "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.2.0.tgz",
958 | "integrity": "sha512-CYpGiFTUrmI6OBMkAdjSDM0k5h8SkkiTP4WAjQgDgNB1S3Ou9VBEvr6q0Kv2H1mMk7IWfxYGpMH5sd5AvcIV2Q=="
959 | },
960 | "vary": {
961 | "version": "1.1.2",
962 | "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz",
963 | "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw="
964 | },
965 | "walk": {
966 | "version": "2.3.14",
967 | "resolved": "https://registry.npmjs.org/walk/-/walk-2.3.14.tgz",
968 | "integrity": "sha512-5skcWAUmySj6hkBdH6B6+3ddMjVQYH5Qy9QGbPmN8kVmLteXk+yVXg+yfk1nbX30EYakahLrr8iPcCxJQSCBeg==",
969 | "requires": {
970 | "foreachasync": "^3.0.0"
971 | }
972 | },
973 | "wordwrap": {
974 | "version": "1.0.0",
975 | "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz",
976 | "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus="
977 | },
978 | "xml2js": {
979 | "version": "0.4.23",
980 | "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.23.tgz",
981 | "integrity": "sha512-ySPiMjM0+pLDftHgXY4By0uswI3SPKLDw/i3UXbnO8M/p28zqexCUoPmQFrYD+/1BzhGJSs2i1ERWKJAtiLrug==",
982 | "requires": {
983 | "sax": ">=0.6.0",
984 | "xmlbuilder": "~11.0.0"
985 | }
986 | },
987 | "xmlbuilder": {
988 | "version": "11.0.1",
989 | "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz",
990 | "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA=="
991 | },
992 | "xtend": {
993 | "version": "4.0.2",
994 | "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz",
995 | "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ=="
996 | }
997 | }
998 | }
999 |
--------------------------------------------------------------------------------
/v12/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "node-blobs-image-resize",
3 | "version": "0.0.12",
4 | "private": true,
5 | "engines": {
6 | "node": ">=10.14.1",
7 | "npm": ">=6.13.4"
8 | },
9 | "scripts": {
10 | "start": "node ./bin/www"
11 | },
12 | "dependencies": {
13 | "@azure/storage-blob": "^12.1.2",
14 | "body-parser": "^1.18.3",
15 | "cookie-parser": "~1.4.3",
16 | "debug": "^4.1.1",
17 | "dotenv": "^8.2.0",
18 | "express": "^4.17.1",
19 | "hbs": "^4.1.1",
20 | "into-stream": "^5.1.1",
21 | "morgan": "^1.10.0",
22 | "multer": "^1.4.1",
23 | "serve-favicon": "~2.5.0"
24 | }
25 | }
26 |
--------------------------------------------------------------------------------
/v12/public/favicon.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Azure-Samples/azure-sdk-for-js-storage-blob-stream-nodejs/50eb069440e805489c5d8c7232b4735f130322c2/v12/public/favicon.ico
--------------------------------------------------------------------------------
/v12/public/stylesheets/style.css:
--------------------------------------------------------------------------------
1 | body {
2 | padding: 50px;
3 | font: 14px "Lucida Grande", Helvetica, Arial, sans-serif;
4 | }
5 |
6 | a {
7 | color: #00B7FF;
8 | }
9 |
10 | .upload-container {
11 | border: solid 1px #ccc;
12 | padding: 10px;
13 | max-width: fit-content;
14 | margin-bottom: 10px
15 | }
--------------------------------------------------------------------------------
/v12/routes/index.js:
--------------------------------------------------------------------------------
1 | if (process.env.NODE_ENV !== 'production') {
2 | require('dotenv').config();
3 | }
4 |
5 | const {
6 | BlobServiceClient,
7 | StorageSharedKeyCredential,
8 | newPipeline
9 | } = require('@azure/storage-blob');
10 |
11 | const express = require('express');
12 | const router = express.Router();
13 | const containerName1 = 'thumbnails';
14 | const multer = require('multer');
15 | const inMemoryStorage = multer.memoryStorage();
16 | const uploadStrategy = multer({ storage: inMemoryStorage }).single('image');
17 | const getStream = require('into-stream');
18 | const containerName2 = 'images';
19 | const ONE_MEGABYTE = 1024 * 1024;
20 | const uploadOptions = { bufferSize: 4 * ONE_MEGABYTE, maxBuffers: 20 };
21 | const ONE_MINUTE = 60 * 1000;
22 |
23 | const sharedKeyCredential = new StorageSharedKeyCredential(
24 | process.env.AZURE_STORAGE_ACCOUNT_NAME,
25 | process.env.AZURE_STORAGE_ACCOUNT_ACCESS_KEY);
26 | const pipeline = newPipeline(sharedKeyCredential);
27 |
28 | const blobServiceClient = new BlobServiceClient(
29 | `https://${process.env.AZURE_STORAGE_ACCOUNT_NAME}.blob.core.windows.net`,
30 | pipeline
31 | );
32 |
33 | const getBlobName = originalName => {
34 | // Use a random number to generate a unique file name,
35 | // removing "0." from the start of the string.
36 | const identifier = Math.random().toString().replace(/0\./, '');
37 | return `${identifier}-${originalName}`;
38 | };
39 |
40 | router.get('/', async (req, res, next) => {
41 |
42 | let viewData;
43 |
44 | try {
45 | const containerClient = blobServiceClient.getContainerClient(containerName1);
46 | const listBlobsResponse = await containerClient.listBlobFlatSegment();
47 |
48 | for await (const blob of listBlobsResponse.segment.blobItems) {
49 | console.log(`Blob: ${blob.name}`);
50 | }
51 |
52 | viewData = {
53 | title: 'Home',
54 | viewName: 'index',
55 | accountName: process.env.AZURE_STORAGE_ACCOUNT_NAME,
56 | containerName: containerName1
57 | };
58 |
59 | if (listBlobsResponse.segment.blobItems.length) {
60 | viewData.thumbnails = listBlobsResponse.segment.blobItems;
61 | }
62 | } catch (err) {
63 | viewData = {
64 | title: 'Error',
65 | viewName: 'error',
66 | message: 'There was an error contacting the blob storage container.',
67 | error: err
68 | };
69 | res.status(500);
70 | } finally {
71 | res.render(viewData.viewName, viewData);
72 | }
73 | });
74 |
75 | router.post('/', uploadStrategy, async (req, res) => {
76 | const blobName = getBlobName(req.file.originalname);
77 | const stream = getStream(req.file.buffer);
78 | const containerClient = blobServiceClient.getContainerClient(containerName2);;
79 | const blockBlobClient = containerClient.getBlockBlobClient(blobName);
80 |
81 | try {
82 | await blockBlobClient.uploadStream(stream,
83 | uploadOptions.bufferSize, uploadOptions.maxBuffers,
84 | { blobHTTPHeaders: { blobContentType: "image/jpeg" } });
85 | res.render('success', { message: 'File uploaded to Azure Blob storage.' });
86 | } catch (err) {
87 | res.render('error', { message: err.message });
88 | }
89 | });
90 |
91 | module.exports = router;
--------------------------------------------------------------------------------
/v12/views/error.hbs:
--------------------------------------------------------------------------------
1 | {{message}}
2 | {{error.status}}
3 | {{error.stack}}
4 |
--------------------------------------------------------------------------------
/v12/views/index.hbs:
--------------------------------------------------------------------------------
1 | Image Resizer
2 |
3 | Upload Photos
4 |
9 |
10 | {{message}}
11 |
12 | Generated Thumbnails
13 | {{#each this.thumbnails}}
14 |
15 | {{/each}}
16 |
17 |
18 | This app has no official privacy policy. Your data will be uploaded to a service in order to produce a thumbnail. Your images will be public once you upload them and there is no automated way to remove them.
19 |
20 |
--------------------------------------------------------------------------------
/v12/views/layout.hbs:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | {{title}}
5 |
6 |
7 |
8 | {{{body}}}
9 |
10 |
11 |
--------------------------------------------------------------------------------
/v12/views/success.hbs:
--------------------------------------------------------------------------------
1 | Success!
2 |
3 | {{message}}
4 |
5 | Return home to view thumbnails
--------------------------------------------------------------------------------