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 CHANGED
@@ -358,6 +358,11 @@ export default {
358
358
  return app.fetch(request, env, event)
359
359
  },
360
360
  }
361
+
362
+ /*
363
+ or just do this:
364
+ export default app
365
+ */
361
366
  ```
362
367
 
363
368
  ## Cloudflare Workers with Hono
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
- const Encoder = new TextEncoder();
28
- const length = data ? data.bytelength || Encoder.encode(data).byteLength : 0;
29
- init.headers = Object.assign(Object.assign(Object.assign({}, this._headers), init.headers), { 'Content-Length': String(length) });
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
@@ -48,6 +48,7 @@ class Hono {
48
48
  return this.addRoute('patch', arg, ...args);
49
49
  }
50
50
  /*
51
+ We may implement these HTTP methods:
51
52
  trace
52
53
  copy
53
54
  lock
@@ -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 content = await (0, cloudflare_1.getContentFromKVAsset)(`${filename}${EXTENSION}`);
20
- if (!content) {
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 partialContent = await (0, cloudflare_1.getContentFromKVAsset)(`${partials[key]}${EXTENSION}`);
28
- if (!partialContent) {
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] = partialContent;
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,6 @@
1
+ import type { Context } from '../../context';
2
+ declare type Options = {
3
+ root: string;
4
+ };
5
+ export declare const serveStatic: (opt?: Options) => (c: Context, next: Function) => Promise<void>;
6
+ export {};
@@ -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
+ };
@@ -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
  }
@@ -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<string>;
1
+ export declare const getContentFromKVAsset: (path: string) => Promise<ArrayBuffer>;
@@ -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
+ };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "hono",
3
- "version": "0.2.3",
3
+ "version": "0.2.4",
4
4
  "description": "[炎] Ultrafast web framework for Cloudflare Workers.",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",