hono 0.2.3 → 0.2.4
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.
- package/README.md +5 -0
- package/dist/context.js +16 -3
- package/dist/hono.js +1 -0
- package/dist/middleware/mustache/mustache.js +13 -5
- package/dist/middleware/serve-static/serve-static.d.ts +6 -0
- package/dist/middleware/serve-static/serve-static.js +44 -0
- package/dist/middleware.d.ts +3 -0
- package/dist/middleware.js +2 -0
- package/dist/utils/cloudflare.d.ts +1 -1
- package/dist/utils/cloudflare.js +1 -2
- package/dist/utils/mime.d.ts +1 -0
- package/dist/utils/mime.js +92 -0
- package/package.json +1 -1
package/README.md
CHANGED
package/dist/context.js
CHANGED
|
@@ -24,9 +24,22 @@ class Context {
|
|
|
24
24
|
newResponse(data, init = {}) {
|
|
25
25
|
init.status = init.status || this._status;
|
|
26
26
|
init.statusText = init.statusText || this._statusText;
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
27
|
+
init.headers = Object.assign(Object.assign({}, this._headers), init.headers);
|
|
28
|
+
// Content-Length
|
|
29
|
+
let length = 0;
|
|
30
|
+
if (data) {
|
|
31
|
+
if (data instanceof ArrayBuffer) {
|
|
32
|
+
length = data.byteLength;
|
|
33
|
+
}
|
|
34
|
+
else if (typeof data == 'string') {
|
|
35
|
+
const Encoder = new TextEncoder();
|
|
36
|
+
length = Encoder.encode(data).byteLength || 0;
|
|
37
|
+
}
|
|
38
|
+
else {
|
|
39
|
+
length = data.bytelength;
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
init.headers = Object.assign(Object.assign({}, init.headers), { 'Content-Length': length.toString() });
|
|
30
43
|
return new Response(data, init);
|
|
31
44
|
}
|
|
32
45
|
body(data, status = this._status, headers = this._headers) {
|
package/dist/hono.js
CHANGED
|
@@ -16,19 +16,20 @@ const mustache = () => {
|
|
|
16
16
|
throw new Error('If you want to use Mustache Middleware, install mustache module.');
|
|
17
17
|
}
|
|
18
18
|
c.render = async (filename, view = {}, options) => {
|
|
19
|
-
const
|
|
20
|
-
if (!
|
|
19
|
+
const buffer = await (0, cloudflare_1.getContentFromKVAsset)(`${filename}${EXTENSION}`);
|
|
20
|
+
if (!buffer) {
|
|
21
21
|
throw new Error(`Template "${filename}${EXTENSION}" is not found or blank.`);
|
|
22
22
|
}
|
|
23
|
+
const content = bufferToString(buffer);
|
|
23
24
|
const partialArgs = {};
|
|
24
25
|
if (options) {
|
|
25
26
|
const partials = options;
|
|
26
27
|
for (const key of Object.keys(partials)) {
|
|
27
|
-
const
|
|
28
|
-
if (!
|
|
28
|
+
const partialBuffer = await (0, cloudflare_1.getContentFromKVAsset)(`${partials[key]}${EXTENSION}`);
|
|
29
|
+
if (!partialBuffer) {
|
|
29
30
|
throw new Error(`Partial Template "${partials[key]}${EXTENSION}" is not found or blank.`);
|
|
30
31
|
}
|
|
31
|
-
partialArgs[key] =
|
|
32
|
+
partialArgs[key] = bufferToString(partialBuffer);
|
|
32
33
|
}
|
|
33
34
|
}
|
|
34
35
|
const output = Mustache.render(content, view, partialArgs);
|
|
@@ -38,3 +39,10 @@ const mustache = () => {
|
|
|
38
39
|
};
|
|
39
40
|
};
|
|
40
41
|
exports.mustache = mustache;
|
|
42
|
+
const bufferToString = (buffer) => {
|
|
43
|
+
if (buffer instanceof ArrayBuffer) {
|
|
44
|
+
const enc = new TextDecoder('utf-8');
|
|
45
|
+
return enc.decode(buffer);
|
|
46
|
+
}
|
|
47
|
+
return buffer;
|
|
48
|
+
};
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.serveStatic = void 0;
|
|
4
|
+
const cloudflare_1 = require("../../utils/cloudflare");
|
|
5
|
+
const mime_1 = require("../../utils/mime");
|
|
6
|
+
const DEFAULT_DOCUMENT = 'index.html';
|
|
7
|
+
// This middleware is available only on Cloudflare Workers.
|
|
8
|
+
const serveStatic = (opt = { root: '' }) => {
|
|
9
|
+
return async (c, next) => {
|
|
10
|
+
await next();
|
|
11
|
+
const url = new URL(c.req.url);
|
|
12
|
+
const path = getKVPath(url.pathname, opt.root);
|
|
13
|
+
const content = await (0, cloudflare_1.getContentFromKVAsset)(path);
|
|
14
|
+
if (content) {
|
|
15
|
+
const mimeType = (0, mime_1.getMimeType)(path);
|
|
16
|
+
if (mimeType) {
|
|
17
|
+
c.header('Content-Type', mimeType);
|
|
18
|
+
}
|
|
19
|
+
c.res = c.body(content);
|
|
20
|
+
}
|
|
21
|
+
else {
|
|
22
|
+
// console.debug(`Static file: ${path} is not found`)
|
|
23
|
+
}
|
|
24
|
+
};
|
|
25
|
+
};
|
|
26
|
+
exports.serveStatic = serveStatic;
|
|
27
|
+
const getKVPath = (filename, root) => {
|
|
28
|
+
if (filename.endsWith('/')) {
|
|
29
|
+
// /top/ => /top/index.html
|
|
30
|
+
filename = filename.concat(DEFAULT_DOCUMENT);
|
|
31
|
+
}
|
|
32
|
+
else if (!(0, mime_1.getMimeType)(filename)) {
|
|
33
|
+
// /top => /top/index.html
|
|
34
|
+
filename = filename.concat('/' + DEFAULT_DOCUMENT);
|
|
35
|
+
}
|
|
36
|
+
// /foo.html => foo.html
|
|
37
|
+
filename = filename.replace(/^\//, '');
|
|
38
|
+
// assets/ => assets
|
|
39
|
+
root = root.replace(/\/$/, '');
|
|
40
|
+
// ./assets/foo.html => assets/foo.html
|
|
41
|
+
let path = root + '/' + filename;
|
|
42
|
+
path = path.replace(/^\.?\//, '');
|
|
43
|
+
return path;
|
|
44
|
+
};
|
package/dist/middleware.d.ts
CHANGED
|
@@ -22,4 +22,7 @@ export declare class Middleware {
|
|
|
22
22
|
}) => (c: import("./context").Context, next: Function) => Promise<void>;
|
|
23
23
|
static cookie: () => (c: import("./context").Context, next: Function) => Promise<void>;
|
|
24
24
|
static mustache: () => (c: import("./context").Context, next: Function) => Promise<void>;
|
|
25
|
+
static serveStatic: (opt?: {
|
|
26
|
+
root: string;
|
|
27
|
+
}) => (c: import("./context").Context, next: Function) => Promise<void>;
|
|
25
28
|
}
|
package/dist/middleware.js
CHANGED
|
@@ -9,6 +9,7 @@ const body_parse_1 = require("./middleware/body-parse/body-parse");
|
|
|
9
9
|
const cors_1 = require("./middleware/cors/cors");
|
|
10
10
|
const cookie_1 = require("./middleware/cookie/cookie");
|
|
11
11
|
const mustache_1 = require("./middleware/mustache/mustache");
|
|
12
|
+
const serve_static_1 = require("./middleware/serve-static/serve-static");
|
|
12
13
|
class Middleware {
|
|
13
14
|
}
|
|
14
15
|
exports.Middleware = Middleware;
|
|
@@ -20,3 +21,4 @@ Middleware.bodyParse = body_parse_1.bodyParse;
|
|
|
20
21
|
Middleware.cors = cors_1.cors;
|
|
21
22
|
Middleware.cookie = cookie_1.cookie;
|
|
22
23
|
Middleware.mustache = mustache_1.mustache;
|
|
24
|
+
Middleware.serveStatic = serve_static_1.serveStatic;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
export declare const getContentFromKVAsset: (path: string) => Promise<
|
|
1
|
+
export declare const getContentFromKVAsset: (path: string) => Promise<ArrayBuffer>;
|
package/dist/utils/cloudflare.js
CHANGED
|
@@ -14,8 +14,7 @@ const getContentFromKVAsset = async (path) => {
|
|
|
14
14
|
if (!key) {
|
|
15
15
|
return;
|
|
16
16
|
}
|
|
17
|
-
let content;
|
|
18
|
-
content = await ASSET_NAMESPACE.get(key, { type: 'text' });
|
|
17
|
+
let content = await ASSET_NAMESPACE.get(key, { type: 'arrayBuffer' });
|
|
19
18
|
if (content) {
|
|
20
19
|
content = content;
|
|
21
20
|
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare const getMimeType: (filename: string) => string;
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.getMimeType = void 0;
|
|
4
|
+
const getMimeType = (filename) => {
|
|
5
|
+
const regexp = /\.([a-zA-Z0-9]+?)$/;
|
|
6
|
+
const match = filename.match(regexp);
|
|
7
|
+
if (!match) {
|
|
8
|
+
return;
|
|
9
|
+
}
|
|
10
|
+
let mimeType = mimes[match[1]];
|
|
11
|
+
if (mimeType.startsWith('text') || mimeType === 'application/json') {
|
|
12
|
+
mimeType += '; charset=utf-8';
|
|
13
|
+
}
|
|
14
|
+
return mimeType;
|
|
15
|
+
};
|
|
16
|
+
exports.getMimeType = getMimeType;
|
|
17
|
+
const mimes = {
|
|
18
|
+
aac: 'audio/aac',
|
|
19
|
+
abw: 'application/x-abiword',
|
|
20
|
+
arc: 'application/x-freearc',
|
|
21
|
+
avi: 'video/x-msvideo',
|
|
22
|
+
azw: 'application/vnd.amazon.ebook',
|
|
23
|
+
bin: 'application/octet-stream',
|
|
24
|
+
bmp: 'image/bmp',
|
|
25
|
+
bz: 'application/x-bzip',
|
|
26
|
+
bz2: 'application/x-bzip2',
|
|
27
|
+
csh: 'application/x-csh',
|
|
28
|
+
css: 'text/css',
|
|
29
|
+
csv: 'text/csv',
|
|
30
|
+
doc: 'application/msword',
|
|
31
|
+
docx: 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',
|
|
32
|
+
eot: 'application/vnd.ms-fontobject',
|
|
33
|
+
epub: 'application/epub+zip',
|
|
34
|
+
gz: 'application/gzip',
|
|
35
|
+
gif: 'image/gif',
|
|
36
|
+
htm: 'text/html',
|
|
37
|
+
html: 'text/html',
|
|
38
|
+
ico: 'image/vnd.microsoft.icon',
|
|
39
|
+
ics: 'text/calendar',
|
|
40
|
+
jar: 'application/java-archive',
|
|
41
|
+
jpeg: 'image/jpeg',
|
|
42
|
+
jpg: 'image/jpeg',
|
|
43
|
+
js: 'text/javascript',
|
|
44
|
+
json: 'application/json',
|
|
45
|
+
jsonld: 'application/ld+json',
|
|
46
|
+
mid: 'audio/x-midi',
|
|
47
|
+
midi: 'audio/x-midi',
|
|
48
|
+
mjs: 'text/javascript',
|
|
49
|
+
mp3: 'audio/mpeg',
|
|
50
|
+
mpeg: 'video/mpeg',
|
|
51
|
+
mpkg: 'application/vnd.apple.installer+xml',
|
|
52
|
+
odp: 'application/vnd.oasis.opendocument.presentation',
|
|
53
|
+
ods: 'application/vnd.oasis.opendocument.spreadsheet',
|
|
54
|
+
odt: 'application/vnd.oasis.opendocument.text',
|
|
55
|
+
oga: 'audio/ogg',
|
|
56
|
+
ogv: 'video/ogg',
|
|
57
|
+
ogx: 'application/ogg',
|
|
58
|
+
opus: 'audio/opus',
|
|
59
|
+
otf: 'font/otf',
|
|
60
|
+
png: 'image/png',
|
|
61
|
+
pdf: 'application/pdf',
|
|
62
|
+
php: 'application/php',
|
|
63
|
+
ppt: 'application/vnd.ms-powerpoint',
|
|
64
|
+
pptx: 'application/vnd.openxmlformats-officedocument.presentationml.presentation',
|
|
65
|
+
rar: 'application/vnd.rar',
|
|
66
|
+
rtf: 'application/rtf',
|
|
67
|
+
sh: 'application/x-sh',
|
|
68
|
+
svg: 'image/svg+xml',
|
|
69
|
+
swf: 'application/x-shockwave-flash',
|
|
70
|
+
tar: 'application/x-tar',
|
|
71
|
+
tif: 'image/tiff',
|
|
72
|
+
tiff: 'image/tiff',
|
|
73
|
+
ts: 'video/mp2t',
|
|
74
|
+
ttf: 'font/ttf',
|
|
75
|
+
txt: 'text/plain',
|
|
76
|
+
vsd: 'application/vnd.visio',
|
|
77
|
+
wav: 'audio/wav',
|
|
78
|
+
weba: 'audio/webm',
|
|
79
|
+
webm: 'video/webm',
|
|
80
|
+
webp: 'image/webp',
|
|
81
|
+
woff: 'font/woff',
|
|
82
|
+
woff2: 'font/woff2',
|
|
83
|
+
xhtml: 'application/xhtml+xml',
|
|
84
|
+
xls: 'application/vnd.ms-excel',
|
|
85
|
+
xlsx: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
|
|
86
|
+
xml: 'application/xml',
|
|
87
|
+
xul: 'application/vnd.mozilla.xul+xml',
|
|
88
|
+
zip: 'application/zip',
|
|
89
|
+
'3gp': 'video/3gpp',
|
|
90
|
+
'3g2': 'video/3gpp2',
|
|
91
|
+
'7z': 'application/x-7z-compressed',
|
|
92
|
+
};
|