@shawnstack/quickforge 1.3.11 → 1.3.13

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.
Files changed (111) hide show
  1. package/README.md +348 -348
  2. package/dist/assets/{anthropic-BhEXDaZj.js → anthropic-Ckozj5YL.js} +1 -1
  3. package/dist/assets/{azure-openai-responses-CFlZwiSr.js → azure-openai-responses-BwnfX0zX.js} +1 -1
  4. package/dist/assets/{google-BumI9ApQ.js → google-C68FfCgv.js} +1 -1
  5. package/dist/assets/{google-gemini-cli-9F_64APo.js → google-gemini-cli-Bvmj_VP7.js} +1 -1
  6. package/dist/assets/{google-vertex-BuKt-2cB.js → google-vertex-DfBcqFGy.js} +1 -1
  7. package/dist/assets/{icons-DBuN_6a3.js → icons-BHkxP7oT.js} +1 -1
  8. package/dist/assets/{index-CyTFbohp.js → index-Bx9iFrzC.js} +491 -472
  9. package/dist/assets/index-kYsI9py3.css +3 -0
  10. package/dist/assets/{mistral-CkDHcwlg.js → mistral-soe30nal.js} +1 -1
  11. package/dist/assets/{openai-codex-responses-BYsm-OtI.js → openai-codex-responses-BX3Fx3LC.js} +1 -1
  12. package/dist/assets/{openai-completions-gEkjff3b.js → openai-completions-CYI6ynqy.js} +1 -1
  13. package/dist/assets/{openai-responses-lWr_i_IH.js → openai-responses-X7pjajQb.js} +1 -1
  14. package/dist/assets/{openai-responses-shared-B99zkRSu.js → openai-responses-shared-Cx1dCwfa.js} +1 -1
  15. package/dist/assets/{react-vendor-BA_xfwfk.js → react-vendor-CmyL2roG.js} +1 -1
  16. package/dist/index.html +10 -4
  17. package/dist/manifest.webmanifest +30 -0
  18. package/dist/pwa-icon-192.png +0 -0
  19. package/dist/pwa-icon-512.png +0 -0
  20. package/dist/pwa-maskable-512.png +0 -0
  21. package/dist/sw.js +79 -0
  22. package/node_modules/@aws-sdk/client-bedrock-runtime/package.json +13 -13
  23. package/node_modules/@aws-sdk/core/package.json +5 -5
  24. package/node_modules/@aws-sdk/credential-provider-env/package.json +5 -5
  25. package/node_modules/@aws-sdk/credential-provider-http/package.json +7 -7
  26. package/node_modules/@aws-sdk/credential-provider-ini/package.json +12 -12
  27. package/node_modules/@aws-sdk/credential-provider-login/package.json +6 -6
  28. package/node_modules/@aws-sdk/credential-provider-node/package.json +10 -10
  29. package/node_modules/@aws-sdk/credential-provider-process/package.json +5 -5
  30. package/node_modules/@aws-sdk/credential-provider-sso/node_modules/@aws-sdk/token-providers/package.json +6 -6
  31. package/node_modules/@aws-sdk/credential-provider-sso/package.json +7 -7
  32. package/node_modules/@aws-sdk/credential-provider-web-identity/package.json +6 -6
  33. package/node_modules/@aws-sdk/eventstream-handler-node/package.json +4 -4
  34. package/node_modules/@aws-sdk/middleware-eventstream/package.json +4 -4
  35. package/node_modules/@aws-sdk/middleware-websocket/package.json +6 -6
  36. package/node_modules/@aws-sdk/nested-clients/dist-cjs/submodules/cognito-identity/index.js +1 -1
  37. package/node_modules/@aws-sdk/nested-clients/dist-cjs/submodules/signin/index.js +1 -1
  38. package/node_modules/@aws-sdk/nested-clients/dist-cjs/submodules/sso/index.js +1 -1
  39. package/node_modules/@aws-sdk/nested-clients/dist-cjs/submodules/sso-oidc/index.js +1 -1
  40. package/node_modules/@aws-sdk/nested-clients/dist-cjs/submodules/sts/index.js +1 -1
  41. package/node_modules/@aws-sdk/nested-clients/package.json +8 -8
  42. package/node_modules/@aws-sdk/signature-v4-multi-region/package.json +4 -4
  43. package/node_modules/@aws-sdk/token-providers/package.json +6 -6
  44. package/node_modules/@aws-sdk/types/package.json +2 -2
  45. package/node_modules/@aws-sdk/xml-builder/package.json +2 -2
  46. package/node_modules/@protobufjs/eventemitter/CHANGELOG.md +8 -0
  47. package/node_modules/@protobufjs/eventemitter/index.js +17 -7
  48. package/node_modules/@protobufjs/eventemitter/package.json +2 -2
  49. package/node_modules/@protobufjs/eventemitter/tests/index.js +39 -3
  50. package/node_modules/@smithy/core/cbor.js +0 -1
  51. package/node_modules/@smithy/core/checksum.js +1 -1
  52. package/node_modules/@smithy/core/client.js +0 -1
  53. package/node_modules/@smithy/core/config.js +1 -1
  54. package/node_modules/@smithy/core/endpoints.js +0 -1
  55. package/node_modules/@smithy/core/event-streams.js +0 -1
  56. package/node_modules/@smithy/core/package.json +1 -1
  57. package/node_modules/@smithy/core/protocols.js +0 -1
  58. package/node_modules/@smithy/core/retry.js +1 -1
  59. package/node_modules/@smithy/core/schema.js +0 -1
  60. package/node_modules/@smithy/core/serde.js +0 -1
  61. package/node_modules/@smithy/credential-provider-imds/package.json +2 -2
  62. package/node_modules/@smithy/fetch-http-handler/package.json +2 -2
  63. package/node_modules/@smithy/node-http-handler/package.json +2 -2
  64. package/node_modules/@smithy/signature-v4/package.json +2 -2
  65. package/node_modules/es-object-atoms/CHANGELOG.md +21 -14
  66. package/node_modules/es-object-atoms/package.json +6 -7
  67. package/node_modules/es-object-atoms/tsconfig.json +1 -0
  68. package/node_modules/hono/dist/adapter/deno/websocket.js +5 -1
  69. package/node_modules/hono/dist/cjs/adapter/deno/websocket.js +5 -1
  70. package/node_modules/hono/dist/cjs/index.js +3 -0
  71. package/node_modules/hono/dist/cjs/middleware/compress/index.js +31 -5
  72. package/node_modules/hono/dist/cjs/utils/compress.js +1 -1
  73. package/node_modules/hono/dist/cjs/utils/filepath.js +1 -1
  74. package/node_modules/hono/dist/cjs/utils/ipaddr.js +1 -1
  75. package/node_modules/hono/dist/cjs/utils/mime.js +15 -17
  76. package/node_modules/hono/dist/index.js +2 -0
  77. package/node_modules/hono/dist/middleware/compress/index.js +30 -5
  78. package/node_modules/hono/dist/utils/compress.js +1 -1
  79. package/node_modules/hono/dist/utils/filepath.js +1 -1
  80. package/node_modules/hono/dist/utils/ipaddr.js +1 -1
  81. package/node_modules/hono/dist/utils/mime.js +15 -17
  82. package/node_modules/hono/package.json +3 -3
  83. package/node_modules/protobufjs/dist/light/protobuf.js +127 -69
  84. package/node_modules/protobufjs/dist/light/protobuf.min.js +3 -3
  85. package/node_modules/protobufjs/dist/minimal/protobuf.js +62 -25
  86. package/node_modules/protobufjs/dist/minimal/protobuf.min.js +3 -3
  87. package/node_modules/protobufjs/dist/protobuf.js +148 -76
  88. package/node_modules/protobufjs/dist/protobuf.min.js +3 -3
  89. package/node_modules/protobufjs/ext/descriptor/index.js +7 -2
  90. package/node_modules/protobufjs/package.json +2 -2
  91. package/node_modules/protobufjs/src/converter.js +8 -5
  92. package/node_modules/protobufjs/src/encoder.js +8 -5
  93. package/node_modules/protobufjs/src/enum.js +2 -2
  94. package/node_modules/protobufjs/src/field.js +1 -1
  95. package/node_modules/protobufjs/src/namespace.js +2 -0
  96. package/node_modules/protobufjs/src/object.js +6 -6
  97. package/node_modules/protobufjs/src/parse.js +19 -5
  98. package/node_modules/protobufjs/src/root.js +14 -8
  99. package/node_modules/protobufjs/src/type.js +8 -5
  100. package/node_modules/protobufjs/src/util/minimal.js +32 -7
  101. package/node_modules/protobufjs/src/util/patterns.js +0 -1
  102. package/node_modules/protobufjs/src/util.js +4 -3
  103. package/node_modules/protobufjs/src/wrappers.js +11 -7
  104. package/node_modules/protobufjs/src/writer.js +11 -9
  105. package/node_modules/ws/lib/receiver.js +54 -0
  106. package/node_modules/ws/lib/websocket-server.js +8 -0
  107. package/node_modules/ws/lib/websocket.js +14 -0
  108. package/node_modules/ws/package.json +1 -1
  109. package/package.json +1 -1
  110. package/server/routes/workspace.mjs +33 -1
  111. package/dist/assets/index-CcEjffmu.css +0 -3
@@ -17,14 +17,43 @@ var __copyProps = (to, from, except, desc) => {
17
17
  var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
18
18
  var compress_exports = {};
19
19
  __export(compress_exports, {
20
+ COMPRESSIBLE_CONTENT_TYPE_REGEX: () => import_compress.COMPRESSIBLE_CONTENT_TYPE_REGEX,
20
21
  compress: () => compress
21
22
  });
22
23
  module.exports = __toCommonJS(compress_exports);
24
+ var import_accept = require("../../utils/accept");
23
25
  var import_compress = require("../../utils/compress");
24
26
  const ENCODING_TYPES = ["gzip", "deflate"];
25
27
  const cacheControlNoTransformRegExp = /(?:^|,)\s*?no-transform\s*?(?:,|$)/i;
28
+ const selectEncoding = (header, candidates) => {
29
+ if (header === void 0) {
30
+ return void 0;
31
+ }
32
+ const accepts = (0, import_accept.parseAccept)(header);
33
+ const wildcardQ = accepts.find((a) => a.type === "*")?.q;
34
+ let best;
35
+ for (const enc of candidates) {
36
+ const explicit = accepts.find((a) => a.type.toLowerCase() === enc);
37
+ const q = explicit ? explicit.q : wildcardQ ?? 0;
38
+ if (q === 1) {
39
+ return enc;
40
+ } else if (q > 0 && (!best || q > best.q)) {
41
+ best = { encoding: enc, q };
42
+ }
43
+ }
44
+ return best?.encoding;
45
+ };
26
46
  const compress = (options) => {
27
47
  const threshold = options?.threshold ?? 1024;
48
+ const candidates = options?.encoding ? [options.encoding] : ENCODING_TYPES;
49
+ const contentTypeFilter = options?.contentTypeFilter ?? import_compress.COMPRESSIBLE_CONTENT_TYPE_REGEX;
50
+ const shouldCompress = typeof contentTypeFilter === "function" ? (res) => {
51
+ const type = res.headers.get("Content-Type");
52
+ return type && contentTypeFilter(type);
53
+ } : (res) => {
54
+ const type = res.headers.get("Content-Type");
55
+ return type && contentTypeFilter.test(type);
56
+ };
28
57
  return async function compress2(ctx, next) {
29
58
  await next();
30
59
  const contentLength = ctx.res.headers.get("Content-Length");
@@ -37,7 +66,7 @@ const compress = (options) => {
37
66
  return;
38
67
  }
39
68
  const accepted = ctx.req.header("Accept-Encoding");
40
- const encoding = options?.encoding ?? ENCODING_TYPES.find((encoding2) => accepted?.includes(encoding2));
69
+ const encoding = selectEncoding(accepted, candidates);
41
70
  if (!encoding || !ctx.res.body) {
42
71
  return;
43
72
  }
@@ -51,15 +80,12 @@ const compress = (options) => {
51
80
  }
52
81
  };
53
82
  };
54
- const shouldCompress = (res) => {
55
- const type = res.headers.get("Content-Type");
56
- return type && import_compress.COMPRESSIBLE_CONTENT_TYPE_REGEX.test(type);
57
- };
58
83
  const shouldTransform = (res) => {
59
84
  const cacheControl = res.headers.get("Cache-Control");
60
85
  return !cacheControl || !cacheControlNoTransformRegExp.test(cacheControl);
61
86
  };
62
87
  // Annotate the CommonJS export names for ESM import in node:
63
88
  0 && (module.exports = {
89
+ COMPRESSIBLE_CONTENT_TYPE_REGEX,
64
90
  compress
65
91
  });
@@ -20,7 +20,7 @@ __export(compress_exports, {
20
20
  COMPRESSIBLE_CONTENT_TYPE_REGEX: () => COMPRESSIBLE_CONTENT_TYPE_REGEX
21
21
  });
22
22
  module.exports = __toCommonJS(compress_exports);
23
- const COMPRESSIBLE_CONTENT_TYPE_REGEX = /^\s*(?:text\/(?!event-stream(?:[;\s]|$))[^;\s]+|application\/(?:javascript|json|xml|xml-dtd|ecmascript|dart|postscript|rtf|tar|toml|vnd\.dart|vnd\.ms-fontobject|vnd\.ms-opentype|wasm|x-httpd-php|x-javascript|x-ns-proxy-autoconfig|x-sh|x-tar|x-virtualbox-hdd|x-virtualbox-ova|x-virtualbox-ovf|x-virtualbox-vbox|x-virtualbox-vdi|x-virtualbox-vhd|x-virtualbox-vmdk|x-www-form-urlencoded)|font\/(?:otf|ttf)|image\/(?:bmp|vnd\.adobe\.photoshop|vnd\.microsoft\.icon|vnd\.ms-dds|x-icon|x-ms-bmp)|message\/rfc822|model\/gltf-binary|x-shader\/x-fragment|x-shader\/x-vertex|[^;\s]+?\+(?:json|text|xml|yaml))(?:[;\s]|$)/i;
23
+ const COMPRESSIBLE_CONTENT_TYPE_REGEX = /^\s*(?:text\/(?!event-stream(?:[;\s]|$))[^;\s]+|application\/(?:javascript|json|xml|xml-dtd|ecmascript|dart|msgpack|postscript|rtf|tar|toml|vnd\.dart|vnd\.ms-fontobject|vnd\.ms-opentype|vnd\.msgpack|wasm|x-httpd-php|x-javascript|x-msgpack|x-ns-proxy-autoconfig|x-sh|x-tar|x-virtualbox-hdd|x-virtualbox-ova|x-virtualbox-ovf|x-virtualbox-vbox|x-virtualbox-vdi|x-virtualbox-vhd|x-virtualbox-vmdk|x-www-form-urlencoded)|font\/(?:otf|ttf)|image\/(?:bmp|vnd\.adobe\.photoshop|vnd\.microsoft\.icon|vnd\.ms-dds|x-icon|x-ms-bmp)|message\/rfc822|model\/gltf-binary|x-shader\/x-fragment|x-shader\/x-vertex|[^;\s]+?\+(?:json|text|xml|yaml|msgpack))(?:[;\s]|$)/i;
24
24
  // Annotate the CommonJS export names for ESM import in node:
25
25
  0 && (module.exports = {
26
26
  COMPRESSIBLE_CONTENT_TYPE_REGEX
@@ -42,7 +42,7 @@ const getFilePathWithoutDefaultDocument = (options) => {
42
42
  return;
43
43
  }
44
44
  filename = filename.replace(/^\.?[\/\\]/, "");
45
- filename = filename.replace(/\\/, "/");
45
+ filename = filename.replace(/\\/g, "/");
46
46
  root = root.replace(/\/$/, "");
47
47
  let path = root ? root + "/" + filename : filename;
48
48
  path = path.replace(/^\.?\//, "");
@@ -294,7 +294,7 @@ const convertIPv6BinaryToString = (ipV6) => {
294
294
  maxZeroEnd = 8;
295
295
  }
296
296
  }
297
- if (maxZeroStart !== -1) {
297
+ if (maxZeroStart !== -1 && maxZeroEnd - maxZeroStart > 1) {
298
298
  sections.splice(maxZeroStart, maxZeroEnd - maxZeroStart, ":");
299
299
  }
300
300
  return sections.join(":").replace(/:{2,}/g, "::");
@@ -28,15 +28,13 @@ const getMimeType = (filename, mimes = baseMimes) => {
28
28
  if (!match) {
29
29
  return;
30
30
  }
31
- let mimeType = mimes[match[1].toLowerCase()];
32
- if (mimeType && mimeType.startsWith("text")) {
33
- mimeType += "; charset=utf-8";
34
- }
35
- return mimeType;
31
+ return mimes[match[1].toLowerCase()];
36
32
  };
37
33
  const getExtension = (mimeType) => {
34
+ const baseType = mimeType.split(";", 1)[0].trim();
38
35
  for (const ext in baseMimes) {
39
- if (baseMimes[ext] === mimeType) {
36
+ const stored = baseMimes[ext];
37
+ if (stored === mimeType || stored.split(";", 1)[0].trim() === baseType) {
40
38
  return ext;
41
39
  }
42
40
  }
@@ -48,25 +46,25 @@ const _baseMimes = {
48
46
  av1: "video/av1",
49
47
  bin: "application/octet-stream",
50
48
  bmp: "image/bmp",
51
- css: "text/css",
52
- csv: "text/csv",
49
+ css: "text/css; charset=utf-8",
50
+ csv: "text/csv; charset=utf-8",
53
51
  eot: "application/vnd.ms-fontobject",
54
52
  epub: "application/epub+zip",
55
53
  gif: "image/gif",
56
54
  gz: "application/gzip",
57
- htm: "text/html",
58
- html: "text/html",
55
+ htm: "text/html; charset=utf-8",
56
+ html: "text/html; charset=utf-8",
59
57
  ico: "image/x-icon",
60
- ics: "text/calendar",
58
+ ics: "text/calendar; charset=utf-8",
61
59
  jpeg: "image/jpeg",
62
60
  jpg: "image/jpeg",
63
- js: "text/javascript",
61
+ js: "text/javascript; charset=utf-8",
64
62
  json: "application/json",
65
63
  jsonld: "application/ld+json",
66
64
  map: "application/json",
67
65
  mid: "audio/x-midi",
68
66
  midi: "audio/x-midi",
69
- mjs: "text/javascript",
67
+ mjs: "text/javascript; charset=utf-8",
70
68
  mp3: "audio/mpeg",
71
69
  mp4: "video/mp4",
72
70
  mpeg: "video/mpeg",
@@ -78,12 +76,12 @@ const _baseMimes = {
78
76
  pdf: "application/pdf",
79
77
  png: "image/png",
80
78
  rtf: "application/rtf",
81
- svg: "image/svg+xml",
79
+ svg: "image/svg+xml; charset=utf-8",
82
80
  tif: "image/tiff",
83
81
  tiff: "image/tiff",
84
82
  ts: "video/mp2t",
85
83
  ttf: "font/ttf",
86
- txt: "text/plain",
84
+ txt: "text/plain; charset=utf-8",
87
85
  wasm: "application/wasm",
88
86
  webm: "video/webm",
89
87
  weba: "audio/webm",
@@ -91,8 +89,8 @@ const _baseMimes = {
91
89
  webp: "image/webp",
92
90
  woff: "font/woff",
93
91
  woff2: "font/woff2",
94
- xhtml: "application/xhtml+xml",
95
- xml: "application/xml",
92
+ xhtml: "application/xhtml+xml; charset=utf-8",
93
+ xml: "application/xml; charset=utf-8",
96
94
  zip: "application/zip",
97
95
  "3gp": "video/3gpp",
98
96
  "3g2": "video/3gpp2",
@@ -1,5 +1,7 @@
1
1
  // src/index.ts
2
2
  import { Hono } from "./hono.js";
3
+ import { Context } from "./context.js";
3
4
  export {
5
+ Context,
4
6
  Hono
5
7
  };
@@ -1,9 +1,37 @@
1
1
  // src/middleware/compress/index.ts
2
+ import { parseAccept } from "../../utils/accept.js";
2
3
  import { COMPRESSIBLE_CONTENT_TYPE_REGEX } from "../../utils/compress.js";
3
4
  var ENCODING_TYPES = ["gzip", "deflate"];
4
5
  var cacheControlNoTransformRegExp = /(?:^|,)\s*?no-transform\s*?(?:,|$)/i;
6
+ var selectEncoding = (header, candidates) => {
7
+ if (header === void 0) {
8
+ return void 0;
9
+ }
10
+ const accepts = parseAccept(header);
11
+ const wildcardQ = accepts.find((a) => a.type === "*")?.q;
12
+ let best;
13
+ for (const enc of candidates) {
14
+ const explicit = accepts.find((a) => a.type.toLowerCase() === enc);
15
+ const q = explicit ? explicit.q : wildcardQ ?? 0;
16
+ if (q === 1) {
17
+ return enc;
18
+ } else if (q > 0 && (!best || q > best.q)) {
19
+ best = { encoding: enc, q };
20
+ }
21
+ }
22
+ return best?.encoding;
23
+ };
5
24
  var compress = (options) => {
6
25
  const threshold = options?.threshold ?? 1024;
26
+ const candidates = options?.encoding ? [options.encoding] : ENCODING_TYPES;
27
+ const contentTypeFilter = options?.contentTypeFilter ?? COMPRESSIBLE_CONTENT_TYPE_REGEX;
28
+ const shouldCompress = typeof contentTypeFilter === "function" ? (res) => {
29
+ const type = res.headers.get("Content-Type");
30
+ return type && contentTypeFilter(type);
31
+ } : (res) => {
32
+ const type = res.headers.get("Content-Type");
33
+ return type && contentTypeFilter.test(type);
34
+ };
7
35
  return async function compress2(ctx, next) {
8
36
  await next();
9
37
  const contentLength = ctx.res.headers.get("Content-Length");
@@ -16,7 +44,7 @@ var compress = (options) => {
16
44
  return;
17
45
  }
18
46
  const accepted = ctx.req.header("Accept-Encoding");
19
- const encoding = options?.encoding ?? ENCODING_TYPES.find((encoding2) => accepted?.includes(encoding2));
47
+ const encoding = selectEncoding(accepted, candidates);
20
48
  if (!encoding || !ctx.res.body) {
21
49
  return;
22
50
  }
@@ -30,14 +58,11 @@ var compress = (options) => {
30
58
  }
31
59
  };
32
60
  };
33
- var shouldCompress = (res) => {
34
- const type = res.headers.get("Content-Type");
35
- return type && COMPRESSIBLE_CONTENT_TYPE_REGEX.test(type);
36
- };
37
61
  var shouldTransform = (res) => {
38
62
  const cacheControl = res.headers.get("Cache-Control");
39
63
  return !cacheControl || !cacheControlNoTransformRegExp.test(cacheControl);
40
64
  };
41
65
  export {
66
+ COMPRESSIBLE_CONTENT_TYPE_REGEX,
42
67
  compress
43
68
  };
@@ -1,5 +1,5 @@
1
1
  // src/utils/compress.ts
2
- var COMPRESSIBLE_CONTENT_TYPE_REGEX = /^\s*(?:text\/(?!event-stream(?:[;\s]|$))[^;\s]+|application\/(?:javascript|json|xml|xml-dtd|ecmascript|dart|postscript|rtf|tar|toml|vnd\.dart|vnd\.ms-fontobject|vnd\.ms-opentype|wasm|x-httpd-php|x-javascript|x-ns-proxy-autoconfig|x-sh|x-tar|x-virtualbox-hdd|x-virtualbox-ova|x-virtualbox-ovf|x-virtualbox-vbox|x-virtualbox-vdi|x-virtualbox-vhd|x-virtualbox-vmdk|x-www-form-urlencoded)|font\/(?:otf|ttf)|image\/(?:bmp|vnd\.adobe\.photoshop|vnd\.microsoft\.icon|vnd\.ms-dds|x-icon|x-ms-bmp)|message\/rfc822|model\/gltf-binary|x-shader\/x-fragment|x-shader\/x-vertex|[^;\s]+?\+(?:json|text|xml|yaml))(?:[;\s]|$)/i;
2
+ var COMPRESSIBLE_CONTENT_TYPE_REGEX = /^\s*(?:text\/(?!event-stream(?:[;\s]|$))[^;\s]+|application\/(?:javascript|json|xml|xml-dtd|ecmascript|dart|msgpack|postscript|rtf|tar|toml|vnd\.dart|vnd\.ms-fontobject|vnd\.ms-opentype|vnd\.msgpack|wasm|x-httpd-php|x-javascript|x-msgpack|x-ns-proxy-autoconfig|x-sh|x-tar|x-virtualbox-hdd|x-virtualbox-ova|x-virtualbox-ovf|x-virtualbox-vbox|x-virtualbox-vdi|x-virtualbox-vhd|x-virtualbox-vmdk|x-www-form-urlencoded)|font\/(?:otf|ttf)|image\/(?:bmp|vnd\.adobe\.photoshop|vnd\.microsoft\.icon|vnd\.ms-dds|x-icon|x-ms-bmp)|message\/rfc822|model\/gltf-binary|x-shader\/x-fragment|x-shader\/x-vertex|[^;\s]+?\+(?:json|text|xml|yaml|msgpack))(?:[;\s]|$)/i;
3
3
  export {
4
4
  COMPRESSIBLE_CONTENT_TYPE_REGEX
5
5
  };
@@ -20,7 +20,7 @@ var getFilePathWithoutDefaultDocument = (options) => {
20
20
  return;
21
21
  }
22
22
  filename = filename.replace(/^\.?[\/\\]/, "");
23
- filename = filename.replace(/\\/, "/");
23
+ filename = filename.replace(/\\/g, "/");
24
24
  root = root.replace(/\/$/, "");
25
25
  let path = root ? root + "/" + filename : filename;
26
26
  path = path.replace(/^\.?\//, "");
@@ -265,7 +265,7 @@ var convertIPv6BinaryToString = (ipV6) => {
265
265
  maxZeroEnd = 8;
266
266
  }
267
267
  }
268
- if (maxZeroStart !== -1) {
268
+ if (maxZeroStart !== -1 && maxZeroEnd - maxZeroStart > 1) {
269
269
  sections.splice(maxZeroStart, maxZeroEnd - maxZeroStart, ":");
270
270
  }
271
271
  return sections.join(":").replace(/:{2,}/g, "::");
@@ -5,15 +5,13 @@ var getMimeType = (filename, mimes = baseMimes) => {
5
5
  if (!match) {
6
6
  return;
7
7
  }
8
- let mimeType = mimes[match[1].toLowerCase()];
9
- if (mimeType && mimeType.startsWith("text")) {
10
- mimeType += "; charset=utf-8";
11
- }
12
- return mimeType;
8
+ return mimes[match[1].toLowerCase()];
13
9
  };
14
10
  var getExtension = (mimeType) => {
11
+ const baseType = mimeType.split(";", 1)[0].trim();
15
12
  for (const ext in baseMimes) {
16
- if (baseMimes[ext] === mimeType) {
13
+ const stored = baseMimes[ext];
14
+ if (stored === mimeType || stored.split(";", 1)[0].trim() === baseType) {
17
15
  return ext;
18
16
  }
19
17
  }
@@ -25,25 +23,25 @@ var _baseMimes = {
25
23
  av1: "video/av1",
26
24
  bin: "application/octet-stream",
27
25
  bmp: "image/bmp",
28
- css: "text/css",
29
- csv: "text/csv",
26
+ css: "text/css; charset=utf-8",
27
+ csv: "text/csv; charset=utf-8",
30
28
  eot: "application/vnd.ms-fontobject",
31
29
  epub: "application/epub+zip",
32
30
  gif: "image/gif",
33
31
  gz: "application/gzip",
34
- htm: "text/html",
35
- html: "text/html",
32
+ htm: "text/html; charset=utf-8",
33
+ html: "text/html; charset=utf-8",
36
34
  ico: "image/x-icon",
37
- ics: "text/calendar",
35
+ ics: "text/calendar; charset=utf-8",
38
36
  jpeg: "image/jpeg",
39
37
  jpg: "image/jpeg",
40
- js: "text/javascript",
38
+ js: "text/javascript; charset=utf-8",
41
39
  json: "application/json",
42
40
  jsonld: "application/ld+json",
43
41
  map: "application/json",
44
42
  mid: "audio/x-midi",
45
43
  midi: "audio/x-midi",
46
- mjs: "text/javascript",
44
+ mjs: "text/javascript; charset=utf-8",
47
45
  mp3: "audio/mpeg",
48
46
  mp4: "video/mp4",
49
47
  mpeg: "video/mpeg",
@@ -55,12 +53,12 @@ var _baseMimes = {
55
53
  pdf: "application/pdf",
56
54
  png: "image/png",
57
55
  rtf: "application/rtf",
58
- svg: "image/svg+xml",
56
+ svg: "image/svg+xml; charset=utf-8",
59
57
  tif: "image/tiff",
60
58
  tiff: "image/tiff",
61
59
  ts: "video/mp2t",
62
60
  ttf: "font/ttf",
63
- txt: "text/plain",
61
+ txt: "text/plain; charset=utf-8",
64
62
  wasm: "application/wasm",
65
63
  webm: "video/webm",
66
64
  weba: "audio/webm",
@@ -68,8 +66,8 @@ var _baseMimes = {
68
66
  webp: "image/webp",
69
67
  woff: "font/woff",
70
68
  woff2: "font/woff2",
71
- xhtml: "application/xhtml+xml",
72
- xml: "application/xml",
69
+ xhtml: "application/xhtml+xml; charset=utf-8",
70
+ xml: "application/xml; charset=utf-8",
73
71
  zip: "application/zip",
74
72
  "3gp": "video/3gpp",
75
73
  "3g2": "video/3gpp2",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "hono",
3
- "version": "4.12.21",
3
+ "version": "4.12.23",
4
4
  "description": "Web framework built on Web Standards",
5
5
  "main": "dist/cjs/index.js",
6
6
  "type": "module",
@@ -663,7 +663,7 @@
663
663
  "@types/node": "^24.3.0",
664
664
  "@types/ws": "^8.18.1",
665
665
  "@typescript/native-preview": "7.0.0-dev.20260210.1",
666
- "@vitest/coverage-v8": "^3.2.4",
666
+ "@vitest/coverage-v8": "^4.1.7",
667
667
  "arg": "^5.0.2",
668
668
  "bun-types": "^1.2.20",
669
669
  "editorconfig-checker": "6.1.1",
@@ -680,7 +680,7 @@
680
680
  "typescript": "^5.9.2",
681
681
  "undici": "^6.21.3",
682
682
  "vite-plugin-fastly-js-compute": "^0.4.2",
683
- "vitest": "^3.2.4",
683
+ "vitest": "^4.1.7",
684
684
  "wrangler": "4.12.0",
685
685
  "ws": "^8.18.0",
686
686
  "zod": "^3.23.8"