dx-server 0.9.0 → 0.10.0

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 (85) hide show
  1. package/README.md +245 -250
  2. package/cjs/body.d.ts +7 -7
  3. package/cjs/body.js +8 -8
  4. package/cjs/bodyHelpers.js +6 -6
  5. package/cjs/connect.d.ts +2 -2
  6. package/cjs/connect.js +5 -5
  7. package/cjs/dx.d.ts +1 -1
  8. package/cjs/dx.js +22 -13
  9. package/cjs/dxHelpers.d.ts +2 -2
  10. package/cjs/dxHelpers.js +12 -7
  11. package/cjs/express.d.ts +1 -1
  12. package/cjs/express.js +16 -14
  13. package/cjs/helpers.d.ts +2 -2
  14. package/cjs/helpers.js +10 -10
  15. package/cjs/index.d.ts +6 -6
  16. package/cjs/index.js +28 -28
  17. package/cjs/polyfillWithResolvers.js +2 -3
  18. package/cjs/router.js +7 -6
  19. package/cjs/static.d.ts +5 -0
  20. package/cjs/static.js +12 -12
  21. package/cjs/staticHelpers.d.ts +16 -4
  22. package/cjs/staticHelpers.js +191 -9
  23. package/cjs/stream.d.ts +1 -1
  24. package/cjs/stream.js +3 -3
  25. package/{esm → cjs/vendors}/contentType.js +7 -3
  26. package/{esm → cjs/vendors}/etag.d.ts +3 -1
  27. package/cjs/{etag.js → vendors/etag.js} +1 -1
  28. package/cjs/vendors/fresh.d.ts +23 -0
  29. package/cjs/vendors/fresh.js +102 -0
  30. package/cjs/vendors/mime.d.ts +1 -0
  31. package/cjs/vendors/mime.js +42 -0
  32. package/cjs/vendors/mimeDb.d.ts +9413 -0
  33. package/cjs/vendors/mimeDb.js +9417 -0
  34. package/cjs/vendors/mimeScore.d.ts +5 -0
  35. package/cjs/vendors/mimeScore.js +50 -0
  36. package/cjs/vendors/onFinished.d.ts +14 -0
  37. package/cjs/vendors/onFinished.js +245 -0
  38. package/cjs/vendors/rangeParser.d.ts +10 -0
  39. package/cjs/vendors/rangeParser.js +125 -0
  40. package/esm/body.d.ts +7 -7
  41. package/esm/body.js +2 -2
  42. package/esm/bodyHelpers.js +3 -3
  43. package/esm/connect.d.ts +2 -2
  44. package/esm/connect.js +3 -3
  45. package/esm/dx.d.ts +1 -1
  46. package/esm/dx.js +21 -12
  47. package/esm/dxHelpers.d.ts +2 -2
  48. package/esm/dxHelpers.js +10 -5
  49. package/esm/express.d.ts +1 -1
  50. package/esm/express.js +16 -14
  51. package/esm/helpers.d.ts +2 -2
  52. package/esm/helpers.js +2 -2
  53. package/esm/index.d.ts +6 -6
  54. package/esm/index.js +6 -6
  55. package/esm/polyfillWithResolvers.js +2 -3
  56. package/esm/router.js +6 -5
  57. package/esm/static.d.ts +5 -0
  58. package/esm/static.js +10 -10
  59. package/esm/staticHelpers.d.ts +16 -4
  60. package/esm/staticHelpers.js +191 -9
  61. package/esm/stream.d.ts +1 -1
  62. package/esm/stream.js +3 -3
  63. package/{cjs → esm/vendors}/contentType.js +3 -7
  64. package/{cjs → esm/vendors}/etag.d.ts +3 -1
  65. package/esm/vendors/etag.js +90 -0
  66. package/esm/vendors/fresh.d.ts +23 -0
  67. package/esm/vendors/fresh.js +96 -0
  68. package/esm/vendors/mime.d.ts +1 -0
  69. package/esm/vendors/mime.js +35 -0
  70. package/esm/vendors/mimeDb.d.ts +9413 -0
  71. package/esm/vendors/mimeDb.js +9415 -0
  72. package/esm/vendors/mimeScore.d.ts +5 -0
  73. package/esm/vendors/mimeScore.js +46 -0
  74. package/esm/vendors/onFinished.d.ts +14 -0
  75. package/esm/vendors/onFinished.js +241 -0
  76. package/esm/vendors/rangeParser.d.ts +10 -0
  77. package/esm/vendors/rangeParser.js +121 -0
  78. package/package.json +1 -5
  79. package/cjs/file.d.ts +0 -3
  80. package/cjs/file.js +0 -12
  81. package/esm/etag.js +0 -90
  82. package/esm/file.d.ts +0 -3
  83. package/esm/file.js +0 -8
  84. /package/cjs/{contentType.d.ts → vendors/contentType.d.ts} +0 -0
  85. /package/esm/{contentType.d.ts → vendors/contentType.d.ts} +0 -0
@@ -1,6 +1,3 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.parseContentType = void 0;
4
1
  // https://github.com/jshttp/content-type/blob/d02574e9640bd4370f148c767b1b877b5a300070/index.js#L106
5
2
  /**
6
3
  * RegExp to match type in RFC 7231 sec 3.1.1.1
@@ -34,14 +31,14 @@ const TOKEN_REGEXP = /^[!#$%&'*+.^_`|~0-9A-Za-z-]+$/;
34
31
  * obs-text = %x80-FF
35
32
  */
36
33
  const QESC_REGEXP = /\\([\u000b\u0020-\u00ff])/g; // eslint-disable-line no-control-regex
37
- function parseContentType(header) {
34
+ export function parseContentType(header) {
38
35
  let index = header.indexOf(';');
39
36
  const mediaType = index !== -1
40
37
  ? header.slice(0, index).trim()
41
38
  : header.trim();
42
39
  if (!TYPE_REGEXP.test(mediaType))
43
40
  throw new TypeError(`invalid media type: ${mediaType}`);
44
- const parameters = {};
41
+ const parameters = Object.create(null);
45
42
  // parse parameters
46
43
  if (index !== -1) {
47
44
  let key;
@@ -69,7 +66,6 @@ function parseContentType(header) {
69
66
  }
70
67
  return { mediaType, parameters };
71
68
  }
72
- exports.parseContentType = parseContentType;
73
69
  /**
74
70
  * RegExp to match chars that must be quoted-pair in RFC 7230 sec 3.2.6
75
71
  */
@@ -89,4 +85,4 @@ function formatContentType({ mediaType, parameters }) {
89
85
  ? Object.keys(parameters).sort().map(key => `; ${key}=${qstring(parameters[key])}`).join('')
90
86
  : ''}`;
91
87
  }
92
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udGVudFR5cGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvY29udGVudFR5cGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQ0EscUdBQXFHO0FBQ3JHOzs7Ozs7R0FNRztBQUNILE1BQU0sV0FBVyxHQUFHLDREQUE0RCxDQUFBO0FBQ2hGOzs7Ozs7Ozs7Ozs7O0dBYUc7QUFDSCxNQUFNLFlBQVksR0FBRyxrS0FBa0ssQ0FBQSxDQUFDLHVDQUF1QztBQUMvTixNQUFNLFdBQVcsR0FBRyx1Q0FBdUMsQ0FBQSxDQUFDLHVDQUF1QztBQUNuRyxNQUFNLFlBQVksR0FBRywrQkFBK0IsQ0FBQTtBQUNwRDs7Ozs7R0FLRztBQUNILE1BQU0sV0FBVyxHQUFHLDRCQUE0QixDQUFBLENBQUMsdUNBQXVDO0FBRXhGLFNBQWdCLGdCQUFnQixDQUFFLE1BQWM7SUFDL0MsSUFBSSxLQUFLLEdBQUcsTUFBTSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQTtJQUMvQixNQUFNLFNBQVMsR0FBRyxLQUFLLEtBQUssQ0FBQyxDQUFDO1FBQzdCLENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQyxJQUFJLEVBQUU7UUFDL0IsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsQ0FBQTtJQUVoQixJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUM7UUFBRSxNQUFNLElBQUksU0FBUyxDQUFDLHVCQUF1QixTQUFTLEVBQUUsQ0FBQyxDQUFBO0lBQ3pGLE1BQU0sVUFBVSxHQUEyQixFQUFFLENBQUE7SUFFN0MsbUJBQW1CO0lBQ25CLElBQUksS0FBSyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDbEIsSUFBSSxHQUFHLENBQUE7UUFDUCxJQUFJLEtBQUssQ0FBQTtRQUNULElBQUksS0FBSyxDQUFBO1FBRVQsTUFBTSxNQUFNLEdBQUcsSUFBSSxNQUFNLENBQUMsWUFB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
88
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udGVudFR5cGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdmVuZG9ycy9jb250ZW50VHlwZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxxR0FBcUc7QUFDckc7Ozs7OztHQU1HO0FBQ0gsTUFBTSxXQUFXLEdBQUcsNERBQTRELENBQUE7QUFDaEY7Ozs7Ozs7Ozs7Ozs7R0FhRztBQUNILE1BQU0sWUFBWSxHQUFHLGtLQUFrSyxDQUFBLENBQUMsdUNBQXVDO0FBQy9OLE1BQU0sV0FBVyxHQUFHLHVDQUF1QyxDQUFBLENBQUMsdUNBQXVDO0FBQ25HLE1BQU0sWUFBWSxHQUFHLCtCQUErQixDQUFBO0FBQ3BEOzs7OztHQUtHO0FBQ0gsTUFBTSxXQUFXLEdBQUcsNEJBQTRCLENBQUEsQ0FBQyx1Q0FBdUM7QUFFeEYsTUFBTSxVQUFVLGdCQUFnQixDQUFFLE1BQWM7SUFDL0MsSUFBSSxLQUFLLEdBQUcsTUFBTSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQTtJQUMvQixNQUFNLFNBQVMsR0FBRyxLQUFLLEtBQUssQ0FBQyxDQUFDO1FBQzdCLENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQyxJQUFJLEVBQUU7UUFDL0IsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsQ0FBQTtJQUVoQixJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUM7UUFBRSxNQUFNLElBQUksU0FBUyxDQUFDLHVCQUF1QixTQUFTLEVBQUUsQ0FBQyxDQUFBO0lBQ3pGLE1BQU0sVUFBVSxHQUEyQixNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFBO0lBRTlELG1CQUFtQjtJQUNuQixJQUFJLEtBQUssS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQ2xCLElBQUksR0FBRyxDQUFBO1FBQ1AsSUFBSSxLQUFLLENBQUE7UUFDVCxJQUFJLEtBQUssQ0FBQTtR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
@@ -1,7 +1,9 @@
1
1
  /// <reference types="node" resolution-mode="require"/>
2
2
  /// <reference types="node" resolution-mode="require"/>
3
+ /// <reference types="node" resolution-mode="require"/>
3
4
  import type { IncomingMessage } from 'node:http';
5
+ import type { Stats } from 'node:fs';
4
6
  export declare function entityTag(buf: Buffer, weak?: boolean): string;
5
- export declare function statTag(stat: any): string;
7
+ export declare function statTag(stat: Stats): string;
6
8
  export declare function isFreshETag(req: IncomingMessage, etag: string): true | undefined;
7
9
  export declare function isFreshModifiedSince(req: IncomingMessage, lastModified: string): boolean | undefined;
@@ -0,0 +1,90 @@
1
+ // etag: https://github.com/jshttp/etag/blob/b9f0642256e63654287299d205bc6ced71b1a228/index.js#L39
2
+ import crypto from 'node:crypto';
3
+ export function entityTag(buf, weak) {
4
+ // pre-computed empty
5
+ return buf.length
6
+ ? `${buf.length.toString(16)}-${crypto
7
+ .createHash('sha1')
8
+ .update(buf)
9
+ .digest('base64')
10
+ .substring(0, 27)}"`
11
+ : `${weak ? 'W/' : ''}"0-2jmj7l5rSw0yVb/vlWAYkK/YBwk"`;
12
+ // https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/ETag#directives
13
+ // weak W/ vs strong eTag
14
+ // same weak eTag: 2 resources might be semantically equivalent, but not byte-for-byte identical
15
+ }
16
+ const CACHE_CONTROL_NO_CACHE_REGEXP = /(?:^|,)\s*?no-cache\s*?(?:,|$)/;
17
+ export function statTag(stat) {
18
+ const mtime = stat.mtime.getTime().toString(16);
19
+ const size = stat.size.toString(16);
20
+ return `"${size}-${mtime}"`;
21
+ }
22
+ // https://github.com/jshttp/fresh/blob/05254186fd7428915224db46144fc94293a7df7d/index.js#L33
23
+ export function isFreshETag(req, etag) {
24
+ const noneMatch = req.headers['if-none-match'];
25
+ if (!noneMatch)
26
+ return;
27
+ // Always return stale when Cache-Control: no-cache
28
+ // to support end-to-end reload requests
29
+ // https://tools.ietf.org/html/rfc2616#section-14.9.4
30
+ const cacheControl = req.headers['cache-control'];
31
+ if (cacheControl && CACHE_CONTROL_NO_CACHE_REGEXP.test(cacheControl))
32
+ return;
33
+ if (noneMatch && noneMatch !== '*') {
34
+ if (!etag)
35
+ return;
36
+ let etagStale = true;
37
+ for (const match of parseTokenList(noneMatch)) {
38
+ if (match === etag || match === `W/${etag}` || `W/${match}` === etag) {
39
+ etagStale = false;
40
+ break;
41
+ }
42
+ }
43
+ if (etagStale)
44
+ return;
45
+ }
46
+ return true;
47
+ }
48
+ export function isFreshModifiedSince(req, lastModified) {
49
+ const modifiedSince = req.headers['if-modified-since'];
50
+ if (!modifiedSince)
51
+ return;
52
+ // Always return stale when Cache-Control: no-cache
53
+ // to support end-to-end reload requests
54
+ // https://tools.ietf.org/html/rfc2616#section-14.9.4
55
+ const cacheControl = req.headers['cache-control'];
56
+ if (cacheControl && CACHE_CONTROL_NO_CACHE_REGEXP.test(cacheControl))
57
+ return;
58
+ if (modifiedSince && lastModified) {
59
+ const lastModifiedDate = Date.parse(lastModified);
60
+ const modifiedSinceDate = Date.parse(modifiedSince);
61
+ return !isNaN(lastModifiedDate) && !isNaN(modifiedSinceDate) && lastModifiedDate <= modifiedSinceDate;
62
+ }
63
+ return true;
64
+ }
65
+ function parseTokenList(str) {
66
+ let end = 0;
67
+ const list = [];
68
+ let start = 0;
69
+ // gather tokens
70
+ for (let i = 0, len = str.length; i < len; i++) {
71
+ switch (str.charCodeAt(i)) {
72
+ case 0x20: /* */
73
+ if (start === end) {
74
+ start = end = i + 1;
75
+ }
76
+ break;
77
+ case 0x2c: /* , */
78
+ list.push(str.substring(start, end));
79
+ start = end = i + 1;
80
+ break;
81
+ default:
82
+ end = i + 1;
83
+ break;
84
+ }
85
+ }
86
+ // final token
87
+ list.push(str.substring(start, end));
88
+ return list;
89
+ }
90
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXRhZy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy92ZW5kb3JzL2V0YWcudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsa0dBQWtHO0FBQ2xHLE9BQU8sTUFBTSxNQUFNLGFBQWEsQ0FBQTtBQUloQyxNQUFNLFVBQVUsU0FBUyxDQUFDLEdBQVcsRUFBRSxJQUFjO0lBQ3BELHFCQUFxQjtJQUNyQixPQUFPLEdBQUcsQ0FBQyxNQUFNO1FBQ2hCLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxJQUFJLE1BQU07YUFDcEMsVUFBVSxDQUFDLE1BQU0sQ0FBQzthQUNsQixNQUFNLENBQUMsR0FBRyxDQUFDO2FBQ1gsTUFBTSxDQUFDLFFBQVEsQ0FBQzthQUNoQixTQUFTLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxHQUFHO1FBQ3JCLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLGlDQUFpQyxDQUFBO0lBQ3ZELDRFQUE0RTtJQUM1RSx5QkFBeUI7SUFDekIsZ0dBQWdHO0FBQ2pHLENBQUM7QUFFRCxNQUFNLDZCQUE2QixHQUFHLGdDQUFnQyxDQUFBO0FBQ3RFLE1BQU0sVUFBVSxPQUFPLENBQUMsSUFBVztJQUNsQyxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sRUFBRSxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsQ0FBQTtJQUMvQyxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsQ0FBQTtJQUVuQyxPQUFPLElBQUksSUFBSSxJQUFJLEtBQUssR0FBRyxDQUFBO0FBQzVCLENBQUM7QUFDRCw2RkFBNkY7QUFDN0YsTUFBTSxVQUFVLFdBQVcsQ0FBQyxHQUFvQixFQUFFLElBQVk7SUFDN0QsTUFBTSxTQUFTLEdBQUcsR0FBRyxDQUFDLE9B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
@@ -0,0 +1,23 @@
1
+ /**
2
+ * Check freshness of the response using request and response headers.
3
+ *
4
+ * @param {Object} reqHeaders
5
+ * @param {Object} resHeaders
6
+ * @return {Boolean}
7
+ * @public
8
+ */
9
+ export declare function fresh(reqHeaders: any, resHeaders: any): boolean;
10
+ /**
11
+ * Parse an HTTP Date into a number.
12
+ *
13
+ * @param {string} date
14
+ * @private
15
+ */
16
+ export declare function parseHttpDate(date: any): number;
17
+ /**
18
+ * Parse a HTTP token list.
19
+ *
20
+ * @param {string} str
21
+ * @private
22
+ */
23
+ export declare function parseTokenList(str: any): any[];
@@ -0,0 +1,96 @@
1
+ const CACHE_CONTROL_NO_CACHE_REGEXP = /(?:^|,)\s*?no-cache\s*?(?:,|$)/;
2
+ /**
3
+ * Check freshness of the response using request and response headers.
4
+ *
5
+ * @param {Object} reqHeaders
6
+ * @param {Object} resHeaders
7
+ * @return {Boolean}
8
+ * @public
9
+ */
10
+ export function fresh(reqHeaders, resHeaders) {
11
+ // fields
12
+ const modifiedSince = reqHeaders['if-modified-since'];
13
+ const noneMatch = reqHeaders['if-none-match'];
14
+ // unconditional request
15
+ if (!modifiedSince && !noneMatch) {
16
+ return false;
17
+ }
18
+ // Always return stale when Cache-Control: no-cache
19
+ // to support end-to-end reload requests
20
+ // https://tools.ietf.org/html/rfc2616#section-14.9.4
21
+ const cacheControl = reqHeaders['cache-control'];
22
+ if (cacheControl && CACHE_CONTROL_NO_CACHE_REGEXP.test(cacheControl)) {
23
+ return false;
24
+ }
25
+ // if-none-match takes precedent over if-modified-since
26
+ if (noneMatch) {
27
+ if (noneMatch === '*') {
28
+ return true;
29
+ }
30
+ const etag = resHeaders.etag;
31
+ if (!etag) {
32
+ return false;
33
+ }
34
+ const matches = parseTokenList(noneMatch);
35
+ for (let i = 0; i < matches.length; i++) {
36
+ const match = matches[i];
37
+ if (match === etag || match === 'W/' + etag || 'W/' + match === etag) {
38
+ return true;
39
+ }
40
+ }
41
+ return false;
42
+ }
43
+ // if-modified-since
44
+ if (modifiedSince) {
45
+ const lastModified = resHeaders['last-modified'];
46
+ const modifiedStale = !lastModified || !(parseHttpDate(lastModified) <= parseHttpDate(modifiedSince));
47
+ if (modifiedStale) {
48
+ return false;
49
+ }
50
+ }
51
+ return true;
52
+ }
53
+ /**
54
+ * Parse an HTTP Date into a number.
55
+ *
56
+ * @param {string} date
57
+ * @private
58
+ */
59
+ export function parseHttpDate(date) {
60
+ const timestamp = date && Date.parse(date);
61
+ // istanbul ignore next: guard against date.js Date.parse patching
62
+ return typeof timestamp === 'number' ? timestamp : NaN;
63
+ }
64
+ /**
65
+ * Parse a HTTP token list.
66
+ *
67
+ * @param {string} str
68
+ * @private
69
+ */
70
+ export function parseTokenList(str) {
71
+ let end = 0;
72
+ const list = [];
73
+ let start = 0;
74
+ // gather tokens
75
+ let i = 0, len = str.length;
76
+ for (; i < len; i++) {
77
+ switch (str.charCodeAt(i)) {
78
+ case 0x20: /* */
79
+ if (start === end) {
80
+ start = end = i + 1;
81
+ }
82
+ break;
83
+ case 0x2c: /* , */
84
+ list.push(str.substring(start, end));
85
+ start = end = i + 1;
86
+ break;
87
+ default:
88
+ end = i + 1;
89
+ break;
90
+ }
91
+ }
92
+ // final token
93
+ list.push(str.substring(start, end));
94
+ return list;
95
+ }
96
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZnJlc2guanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdmVuZG9ycy9mcmVzaC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxNQUFNLDZCQUE2QixHQUFHLGdDQUFnQyxDQUFBO0FBRXRFOzs7Ozs7O0dBT0c7QUFFSCxNQUFNLFVBQVUsS0FBSyxDQUFDLFVBQVUsRUFBRSxVQUFVO0lBQzNDLFNBQVM7SUFDVCxNQUFNLGFBQWEsR0FBRyxVQUFVLENBQUMsbUJBQW1CLENBQUMsQ0FBQTtJQUNyRCxNQUFNLFNBQVMsR0FBRyxVQUFVLENBQUMsZUFBZSxDQUFDLENBQUE7SUFFN0Msd0JBQXdCO0lBQ3hCLElBQUksQ0FBQyxhQUFhLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztRQUNsQyxPQUFPLEtBQUssQ0FBQTtJQUNiLENBQUM7SUFFRCxtREFBbUQ7SUFDbkQsd0NBQXdDO0lBQ3hDLHFEQUFxRDtJQUNyRCxNQUFNLFlBQVksR0FBRyxVQUFVLENBQUMsZUFBZSxDQUFDLENBQUE7SUFDaEQsSUFBSSxZQUFZLElBQUksNkJBQTZCLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxFQUFFLENBQUM7UUFDdEUsT0FBTyxLQUFLLENBQUE7SUFDYixDQUFDO0lBRUQsdURBQXVEO0lBQ3ZELElBQUksU0FBUyxFQUFFLENBQUM7UUFDZixJQUFJLFNBQVMsS0FBSyxHQUFHLEVBQUUsQ0FBQztZQUN2QixPQUFPLElBQUksQ0FBQTtRQUNaLENBQUM7UUFDRCxNQUFNLElBQUksR0FBRyxVQUFVLENBQUMsSUFBSSxDQUFBO1FBRTVCLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUNYLE9BQU8sS0FBSyxDQUFBO1FBQ2IsQ0FBQztRQUVELE1BQU0sT0FBTyxHQUFHLGNBQWMsQ0FBQyxTQUFTLENBQUMsQ0FBQTtRQUN6QyxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsT0FBTyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUs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
@@ -0,0 +1 @@
1
+ export declare function contentTypeForExtension(extension: any): any;
@@ -0,0 +1,35 @@
1
+ import mimeDb from './mimeDb.ts';
2
+ import { mimeScore } from './mimeScore.ts';
3
+ const extensionToMime = Object.create(null);
4
+ for (const [type, { extensions = [] }] of Object.entries(mimeDb))
5
+ for (const extension of extensions)
6
+ extensionToMime[extension] = preferredType(extension, type, extensionToMime[extension]);
7
+ function preferredType(ext, type0, type1) {
8
+ const score0 = type0 ? mimeScore(type0, mimeDb[type0].source) : 0;
9
+ const score1 = type1 ? mimeScore(type1, mimeDb[type1].source) : 0;
10
+ return score0 > score1 ? type0 : type1;
11
+ }
12
+ export function contentTypeForExtension(extension) {
13
+ const mimeType = extensionToMime[extension.toLowerCase()];
14
+ if (!mimeType)
15
+ return;
16
+ if (!mimeType.includes('charset')) {
17
+ const charset = determineCharset(mimeType);
18
+ if (charset)
19
+ return mimeType + '; charset=' + charset.toLowerCase();
20
+ }
21
+ return mimeType;
22
+ }
23
+ const EXTRACT_TYPE_REGEXP = /^\s*([^;\s]*)(?:;|\s|$)/;
24
+ const TEXT_TYPE_REGEXP = /^text\//i;
25
+ function determineCharset(type) {
26
+ // _TODO: use media-typer
27
+ const match = EXTRACT_TYPE_REGEXP.exec(type);
28
+ const mime = match && mimeDb[match[1].toLowerCase()];
29
+ if (mime?.charset)
30
+ return mime.charset;
31
+ // default text/* to utf-8
32
+ if (match && TEXT_TYPE_REGEXP.test(match[1]))
33
+ return 'UTF-8';
34
+ }
35
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWltZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy92ZW5kb3JzL21pbWUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxNQUFNLE1BQU0sYUFBYSxDQUFBO0FBQ2hDLE9BQU8sRUFBQyxTQUFTLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQTtBQUV4QyxNQUFNLGVBQWUsR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFBO0FBRTNDLEtBQUssTUFBTSxDQUFDLElBQUksRUFBRSxFQUFDLFVBQVUsR0FBRyxFQUFFLEVBQUMsQ0FBQyxJQUFJLE1BQU0sQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDO0lBQzdELEtBQUssTUFBTSxTQUFTLElBQUksVUFBVTtRQUNqQyxlQUFlLENBQUMsU0FBUyxDQUFDLEdBQUcsYUFBYSxDQUFDLFNBQVMsRUFBRSxJQUFJLEVBQUUsZUFBZSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUE7QUFFekYsU0FBUyxhQUFhLENBQUMsR0FBRyxFQUFFLEtBQUssRUFBRSxLQUFLO0lBQ3ZDLE1BQU0sTUFBTSxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLEtBQUssRUFBRSxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQTtJQUNqRSxNQUFNLE1BQU0sR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxLQUFLLEVBQUUsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUE7SUFFakUsT0FBTyxNQUFNLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQTtBQUN2QyxDQUFDO0FBRUQsTUFBTSxVQUFVLHVCQUF1QixDQUFDLFNBQVM7SUFDaEQsTUFBTSxRQUFRLEdBQUcsZUFBZSxDQUFDLFNBQVMsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFBO0lBQ3pELElBQUksQ0FBQyxRQUFRO1FBQUUsT0FBTTtJQUNyQixJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDO1FBQ25DLE1BQU0sT0FBTyxHQUFHLGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxDQUFBO1FBQzFDLElBQUksT0FBTztZQUFFLE9BQU8sUUFBUSxHQUFHLFlBQVksR0FBRyxPQUFPLENBQUMsV0FBVyxFQUFFLENBQUE7SUFDcEUsQ0FBQztJQUNELE9BQU8sUUFBUSxDQUFBO0FBQ2hCLENBQUM7QUFFRCxNQUFNLG1CQUFtQixHQUFHLHlCQUF5QixDQUFBO0FBQ3JELE1BQU0sZ0JBQWdCLEdBQUcsVUFBVSxDQUFBO0FBRW5DLFNBQVMsZ0JBQWdCLENBQUUsSUFBSTtJQUM5Qix5QkFBeUI7SUFDekIsTUFBTSxLQUFLLEdBQUcsbUJBQW1CLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFBO0lBQzVDLE1BQU0sSUFBSSxHQUFHLEtBQUssSUFBSSxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUE7SUFFcEQsSUFBSSxJQUFJLEVBQUUsT0FBTztRQUFFLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQTtJQUV0QywwQkFBMEI7SUFDMUIsSUFBSSxLQUFLLElBQUksZ0JBQWdCLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUFFLE9BQU8sT0FBTyxDQUFBO0FBQzdELENBQUMifQ==