wapplr 1.0.44 → 1.0.45

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,354 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault")["default"];
4
+
5
+ Object.defineProperty(exports, "__esModule", {
6
+ value: true
7
+ });
8
+ exports.createRenderMiddleware = createRenderMiddleware;
9
+ exports.createNotModifiedMiddleware = createNotModifiedMiddleware;
10
+ exports["default"] = createMiddlewares;
11
+ exports.mimeType = void 0;
12
+
13
+ var _objectWithoutProperties2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutProperties"));
14
+
15
+ var _objectSpread2 = _interopRequireDefault(require("@babel/runtime/helpers/objectSpread2"));
16
+
17
+ var _utils = require("../common/utils");
18
+
19
+ var _middlewares = _interopRequireDefault(require("../common/middlewares"));
20
+
21
+ var _html2 = _interopRequireDefault(require("./html"));
22
+
23
+ var _excluded = ["log"];
24
+ var mimeType = {
25
+ ".ico": "image/x-icon",
26
+ ".html": "text/html",
27
+ ".js": "application/javascript",
28
+ ".json": "application/json",
29
+ ".css": "text/css",
30
+ ".png": "image/png",
31
+ ".jpg": "image/jpeg",
32
+ ".webp": "image/webp",
33
+ ".svg": "image/svg+xml",
34
+ ".wav": "audio/wav",
35
+ ".mp3": "audio/mpeg",
36
+ ".mpg": "video/mpeg",
37
+ ".mp4": "video/mp4",
38
+ ".webm": "video/webm",
39
+ ".pdf": "application/pdf",
40
+ ".zip": "application/zip",
41
+ ".doc": "application/msword",
42
+ ".eot": "application/vnd.ms-fontobject",
43
+ ".ttf": "application/x-font-ttf"
44
+ };
45
+ exports.mimeType = mimeType;
46
+
47
+ function createRenderMiddleware() {
48
+ var p = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
49
+ var wapp = p.wapp;
50
+
51
+ function defaultRenderHandle(req, res, next) {
52
+ var wappResponse = res.wappResponse;
53
+
54
+ if (wappResponse.content && !wappResponse.content.renderType) {
55
+ res.wappResponse.status(wappResponse.statusCode || 200);
56
+ var render = wapp.contents.getComponent("html");
57
+ res.wappResponse.send(render({
58
+ wapp: wapp,
59
+ req: req,
60
+ res: res
61
+ }).replace(/>\s+</g, "><"));
62
+ next();
63
+ } else {
64
+ next();
65
+ }
66
+ }
67
+
68
+ function defaultHandle(req, res, out) {
69
+ if (!wapp.contents.getComponent("html")) {
70
+ wapp.contents.addComponent({
71
+ html: defaultRender
72
+ });
73
+ }
74
+
75
+ var renderMiddlewares = Object.keys(renderMiddleware.handles).map(function (key) {
76
+ return renderMiddleware.handles[key];
77
+ });
78
+ renderMiddlewares.sort();
79
+ var index = 0;
80
+
81
+ function next(err) {
82
+ if (renderMiddlewares[index]) {
83
+ var func = renderMiddlewares[index];
84
+ index = index + 1;
85
+ return func(req, res, err ? function () {
86
+ next(err);
87
+ } : next);
88
+ } else if (typeof out === "function") {
89
+ index = 0;
90
+ return out(err);
91
+ }
92
+
93
+ return null;
94
+ }
95
+
96
+ return next();
97
+ }
98
+
99
+ var defaultRender = _html2["default"];
100
+
101
+ function defaultAddHandle(obj) {
102
+ if (typeof obj === "object" && !obj.length) {
103
+ Object.keys(obj).forEach(function (handleName) {
104
+ var handle = obj[handleName];
105
+
106
+ if (typeof handle == "function") {
107
+ renderMiddleware.handles[handleName] = handle;
108
+ }
109
+ });
110
+ }
111
+ }
112
+
113
+ var renderMiddlewareProperties = Object.create(Object.prototype, {
114
+ handle: (0, _objectSpread2["default"])((0, _objectSpread2["default"])({}, _utils.defaultDescriptor), {}, {
115
+ value: defaultHandle
116
+ }),
117
+ handles: (0, _objectSpread2["default"])((0, _objectSpread2["default"])({}, _utils.defaultDescriptor), {}, {
118
+ value: {
119
+ render: defaultRenderHandle
120
+ }
121
+ }),
122
+ render: (0, _objectSpread2["default"])((0, _objectSpread2["default"])({}, _utils.defaultDescriptor), {}, {
123
+ value: defaultRender
124
+ }),
125
+ addHandle: (0, _objectSpread2["default"])((0, _objectSpread2["default"])({}, _utils.defaultDescriptor), {}, {
126
+ value: defaultAddHandle
127
+ })
128
+ });
129
+
130
+ function renderMiddleware(req, res, next) {
131
+ if (typeof renderMiddleware.handle === "function") {
132
+ renderMiddleware.handle(req, res, next);
133
+ }
134
+
135
+ return renderMiddleware;
136
+ }
137
+
138
+ (0, _utils.mergeProperties)(renderMiddleware, renderMiddlewareProperties);
139
+ Object.defineProperty(renderMiddleware, "wapp", (0, _objectSpread2["default"])((0, _objectSpread2["default"])({}, _utils.defaultDescriptor), {}, {
140
+ writable: false,
141
+ enumerable: false,
142
+ value: wapp
143
+ }));
144
+ return renderMiddleware;
145
+ }
146
+
147
+ function createNotModifiedMiddleware() {
148
+ var p = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
149
+ var wapp = p.wapp;
150
+
151
+ function defaultIsFromCache(req, res) {
152
+ var ifMatch = req.headers["if-match"];
153
+ var ifUnmodifiedSince = req.headers["if-unmodified-since"];
154
+ var ifNoneMatch = req.headers["if-none-match"];
155
+ var ifModifiedSince = req.headers["if-modified-since"];
156
+ var cacheControl = req.headers["cache-control"];
157
+ var etag = res.getHeader("etag");
158
+ var lastModified = res.getHeader("last-modified");
159
+ var conditionalGet = ifMatch || ifUnmodifiedSince || ifNoneMatch || ifModifiedSince;
160
+ var isCacheable = res.wappResponse.statusCode >= 200 && res.wappResponse.statusCode < 300 || res.wappResponse.statusCode === 304;
161
+ var noCache = cacheControl && /(?:^|,)\s*?no-cache\s*?(?:,|$)/.test(cacheControl);
162
+ var unconditional = !ifUnmodifiedSince && !ifNoneMatch;
163
+
164
+ if (unconditional || noCache || !isCacheable || !conditionalGet) {
165
+ return false;
166
+ }
167
+
168
+ var fromCache = false;
169
+
170
+ if (ifNoneMatch && ifNoneMatch !== "*" && etag) {
171
+ var parseTokenList = function parseTokenList(str) {
172
+ var end = 0;
173
+ var list = [];
174
+ var start = 0;
175
+
176
+ for (var i = 0, len = str.length; i < len; i++) {
177
+ switch (str.charCodeAt(i)) {
178
+ case 0x20:
179
+ /* */
180
+ if (start === end) {
181
+ start = end = i + 1;
182
+ }
183
+
184
+ break;
185
+
186
+ case 0x2c:
187
+ /* , */
188
+ list.push(str.substring(start, end));
189
+ start = end = i + 1;
190
+ break;
191
+
192
+ default:
193
+ end = i + 1;
194
+ break;
195
+ }
196
+ }
197
+
198
+ list.push(str.substring(start, end));
199
+ return list;
200
+ };
201
+
202
+ var matches = parseTokenList(ifNoneMatch);
203
+
204
+ for (var i = 0; i < matches.length; i++) {
205
+ var match = matches[i];
206
+
207
+ if (match === etag || match === "W/" + etag || "W/" + match === etag) {
208
+ fromCache = true;
209
+ break;
210
+ }
211
+ }
212
+ }
213
+
214
+ if (ifModifiedSince && lastModified) {
215
+ var parseHttpDate = function parseHttpDate(date) {
216
+ var timestamp = date && Date.parse(date);
217
+ return typeof timestamp === 'number' ? timestamp : NaN;
218
+ };
219
+
220
+ if (parseHttpDate(lastModified) <= parseHttpDate(ifModifiedSince)) {
221
+ fromCache = true;
222
+ }
223
+ }
224
+
225
+ return fromCache;
226
+ }
227
+
228
+ function defaultHandle(req, res, next) {
229
+ var fromCache = notModifiedMiddleware.isFromCache(req, res);
230
+
231
+ if (fromCache) {
232
+ res.wappResponse.status(304);
233
+ res.wapp.log(req, res);
234
+ res.end();
235
+ } else {
236
+ return next();
237
+ }
238
+ }
239
+
240
+ var notModifiedMiddlewareProperties = Object.create(Object.prototype, {
241
+ handle: (0, _objectSpread2["default"])((0, _objectSpread2["default"])({}, _utils.defaultDescriptor), {}, {
242
+ value: defaultHandle
243
+ }),
244
+ isFromCache: (0, _objectSpread2["default"])((0, _objectSpread2["default"])({}, _utils.defaultDescriptor), {}, {
245
+ value: defaultIsFromCache
246
+ })
247
+ });
248
+
249
+ function notModifiedMiddleware(req, res, next) {
250
+ if (typeof notModifiedMiddleware.handle === "function") {
251
+ notModifiedMiddleware.handle(req, res, next);
252
+ }
253
+
254
+ return notModifiedMiddleware;
255
+ }
256
+
257
+ (0, _utils.mergeProperties)(notModifiedMiddleware, notModifiedMiddlewareProperties);
258
+ Object.defineProperty(notModifiedMiddleware, "wapp", (0, _objectSpread2["default"])((0, _objectSpread2["default"])({}, _utils.defaultDescriptor), {}, {
259
+ writable: false,
260
+ enumerable: false,
261
+ value: wapp
262
+ }));
263
+ return notModifiedMiddleware;
264
+ }
265
+
266
+ function createMiddlewares(p) {
267
+ var _commonMiddlewares = (0, _middlewares["default"])(p),
268
+ log = _commonMiddlewares.log,
269
+ rest = (0, _objectWithoutProperties2["default"])(_commonMiddlewares, _excluded);
270
+
271
+ var wapp = p.wapp;
272
+ var wappMiddleware = wapp.middleware;
273
+ var notModifiedMiddleware = createNotModifiedMiddleware(p);
274
+ wappMiddleware.addSendMiddleware({
275
+ headers: function headers(req, res, next) {
276
+ var _res$wappResponse$sen = res.wappResponse.sendData,
277
+ sendData = _res$wappResponse$sen === void 0 ? {} : _res$wappResponse$sen;
278
+
279
+ if (res.setHeader) {
280
+ var data = sendData.data,
281
+ _sendData$stats = sendData.stats,
282
+ stats = _sendData$stats === void 0 ? {} : _sendData$stats,
283
+ _sendData$parsedPath = sendData.parsedPath,
284
+ parsedPath = _sendData$parsedPath === void 0 ? {} : _sendData$parsedPath;
285
+ var _html = data;
286
+ var _parsedPath$ext = parsedPath.ext,
287
+ ext = _parsedPath$ext === void 0 ? ".html" : _parsedPath$ext;
288
+ var mtime = stats.mtime;
289
+
290
+ if (!res.getHeader("Accept-Ranges")) {
291
+ res.setHeader("Accept-Ranges", "bytes");
292
+ }
293
+
294
+ if (!res.getHeader("Content-Type")) {
295
+ res.setHeader("Content-Type", mimeType[ext] || "text/plain");
296
+ }
297
+
298
+ if (!res.getHeader("Content-Length")) {
299
+ res.setHeader("Content-Length", Buffer.byteLength(_html));
300
+ }
301
+
302
+ if (!res.getHeader("Last-Modified") && mtime) {
303
+ res.setHeader("Last-Modified", mtime.toUTCString());
304
+ }
305
+
306
+ if (!res.getHeader("Cache-Control")) {
307
+ res.setHeader("Cache-Control", "public, max-age=0");
308
+ }
309
+
310
+ if (!res.getHeader("X-Powered-By")) {
311
+ res.setHeader("X-Powered-By", "Wapplr");
312
+ }
313
+ }
314
+
315
+ return next();
316
+ },
317
+ etag: function etag(req, res, next) {
318
+ var _res$wappResponse$sen2 = res.wappResponse.sendData,
319
+ sendData = _res$wappResponse$sen2 === void 0 ? {} : _res$wappResponse$sen2;
320
+
321
+ if (res.setHeader) {
322
+ var _sendData$stats2 = sendData.stats,
323
+ stats = _sendData$stats2 === void 0 ? {} : _sendData$stats2;
324
+ var mtime = stats.mtime,
325
+ size = stats.size;
326
+
327
+ if (!res.getHeader("ETag") && mtime && size) {
328
+ var etag = "W/\"".concat(size.toString(16), "-").concat(mtime.getTime().toString(16), "\"");
329
+ res.setHeader("ETag", etag);
330
+ }
331
+ }
332
+
333
+ return next();
334
+ },
335
+ notModified: function notModified(req, res, next) {
336
+ if (res.setHeader) {
337
+ var fromCache = notModifiedMiddleware.isFromCache(req, res);
338
+
339
+ if (fromCache) {
340
+ res.wappResponse.status(304);
341
+ res.wapp.log(req, res);
342
+ res.end();
343
+ return;
344
+ }
345
+ }
346
+
347
+ return next();
348
+ }
349
+ });
350
+ return (0, _objectSpread2["default"])((0, _objectSpread2["default"])({}, rest), {}, {
351
+ render: createRenderMiddleware(p),
352
+ log: log
353
+ });
354
+ }
@@ -0,0 +1,58 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports["default"] = serveStatic;
7
+
8
+ var fs = require("fs");
9
+
10
+ var path = require("path");
11
+
12
+ function serveStatic(publicPath) {
13
+ return function staticMiddleware(req, res, next) {
14
+ var parsedUrl = {
15
+ pathname: req.wappRequest.path
16
+ };
17
+
18
+ try {
19
+ parsedUrl = new URL(req.wappRequest.url);
20
+ } catch (e) {}
21
+
22
+ var sanitizePath = path.normalize(parsedUrl.pathname).replace(/^(\.\.[\/\\])+/, "");
23
+ var pathname = path.join(publicPath, sanitizePath);
24
+ var paredSanitizePath = path.parse(pathname);
25
+ var ext = paredSanitizePath.ext;
26
+
27
+ if (!fs.existsSync(pathname) || !ext) {
28
+ return next();
29
+ }
30
+
31
+ try {
32
+ var data = fs.readFileSync(pathname);
33
+ var stats = fs.statSync(pathname);
34
+ res.wappResponse.status(200);
35
+ res.wappResponse.sendData = {
36
+ data: data,
37
+ stats: stats,
38
+ parsedPath: paredSanitizePath
39
+ };
40
+ var stream = fs.createReadStream(pathname);
41
+ stream.on("error", function onerror(err) {
42
+ res.wappResponse.status(err.statusCode || 500, err);
43
+ res.wapp.log(err, req, res);
44
+ next(err);
45
+ });
46
+ stream.on("open", function onopen() {
47
+ res.wapp.middleware.runSendMiddlewares(req, res, function next() {
48
+ res.wapp.log(req, res);
49
+ stream.pipe(res);
50
+ });
51
+ });
52
+ } catch (err) {
53
+ res.wappResponse.status(err.statusCode || 500, err);
54
+ res.wapp.log(err, req, res);
55
+ next(err);
56
+ }
57
+ };
58
+ }
package/package.json CHANGED
@@ -22,11 +22,11 @@
22
22
  "files": [
23
23
  "dist/*"
24
24
  ],
25
- "version": "1.0.44",
25
+ "version": "1.0.45",
26
26
  "main": "dist/server",
27
27
  "browser": "dist/client",
28
28
  "repository": {
29
29
  "type": "git",
30
30
  "url": "https://github.com/wapplr/wapplr.git"
31
31
  }
32
- }
32
+ }