@httpland/compression-middleware 1.0.0-beta.1
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/LICENSE +20 -0
- package/README.md +208 -0
- package/esm/deps/deno.land/std@0.180.0/http/_negotiation/common.js +40 -0
- package/esm/deps/deno.land/std@0.180.0/http/_negotiation/encoding.js +121 -0
- package/esm/deps/deno.land/std@0.180.0/http/_negotiation/language.js +110 -0
- package/esm/deps/deno.land/std@0.180.0/http/_negotiation/media_type.js +174 -0
- package/esm/deps/deno.land/std@0.180.0/http/negotiation.js +36 -0
- package/esm/deps/deno.land/std@0.180.0/media_types/_db.js +33 -0
- package/esm/deps/deno.land/std@0.180.0/media_types/_util.js +122 -0
- package/esm/deps/deno.land/std@0.180.0/media_types/content_type.js +54 -0
- package/esm/deps/deno.land/std@0.180.0/media_types/extension.js +25 -0
- package/esm/deps/deno.land/std@0.180.0/media_types/extensions_by_type.js +30 -0
- package/esm/deps/deno.land/std@0.180.0/media_types/format_media_type.js +60 -0
- package/esm/deps/deno.land/std@0.180.0/media_types/get_charset.js +36 -0
- package/esm/deps/deno.land/std@0.180.0/media_types/mod.js +22 -0
- package/esm/deps/deno.land/std@0.180.0/media_types/parse_media_type.js +121 -0
- package/esm/deps/deno.land/std@0.180.0/media_types/type_by_extension.js +23 -0
- package/esm/deps/deno.land/std@0.180.0/media_types/vendor/mime-db.v1.52.0.js +8555 -0
- package/esm/deps/deno.land/x/vary@1.0.0/mod.js +108 -0
- package/esm/deps.js +8 -0
- package/esm/encoders/deflate.js +11 -0
- package/esm/encoders/gzip.js +11 -0
- package/esm/encoders/utils.js +7 -0
- package/esm/middleware.js +55 -0
- package/esm/mod.js +3 -0
- package/esm/package.json +3 -0
- package/esm/transform.js +23 -0
- package/esm/types.js +3 -0
- package/esm/utils.js +19 -0
- package/package.json +55 -0
- package/script/deps/deno.land/std@0.180.0/http/_negotiation/common.js +45 -0
- package/script/deps/deno.land/std@0.180.0/http/_negotiation/encoding.js +125 -0
- package/script/deps/deno.land/std@0.180.0/http/_negotiation/language.js +114 -0
- package/script/deps/deno.land/std@0.180.0/http/_negotiation/media_type.js +178 -0
- package/script/deps/deno.land/std@0.180.0/http/negotiation.js +42 -0
- package/script/deps/deno.land/std@0.180.0/media_types/_db.js +39 -0
- package/script/deps/deno.land/std@0.180.0/media_types/_util.js +132 -0
- package/script/deps/deno.land/std@0.180.0/media_types/content_type.js +58 -0
- package/script/deps/deno.land/std@0.180.0/media_types/extension.js +29 -0
- package/script/deps/deno.land/std@0.180.0/media_types/extensions_by_type.js +34 -0
- package/script/deps/deno.land/std@0.180.0/media_types/format_media_type.js +64 -0
- package/script/deps/deno.land/std@0.180.0/media_types/get_charset.js +40 -0
- package/script/deps/deno.land/std@0.180.0/media_types/mod.js +38 -0
- package/script/deps/deno.land/std@0.180.0/media_types/parse_media_type.js +125 -0
- package/script/deps/deno.land/std@0.180.0/media_types/type_by_extension.js +27 -0
- package/script/deps/deno.land/std@0.180.0/media_types/vendor/mime-db.v1.52.0.js +8557 -0
- package/script/deps/deno.land/x/vary@1.0.0/mod.js +113 -0
- package/script/deps.js +22 -0
- package/script/encoders/deflate.js +14 -0
- package/script/encoders/gzip.js +14 -0
- package/script/encoders/utils.js +10 -0
- package/script/middleware.js +61 -0
- package/script/mod.js +7 -0
- package/script/package.json +3 -0
- package/script/transform.js +27 -0
- package/script/types.js +4 -0
- package/script/utils.js +24 -0
- package/types/deps/deno.land/std@0.180.0/http/_negotiation/common.d.ts +37 -0
- package/types/deps/deno.land/std@0.180.0/http/_negotiation/encoding.d.ts +33 -0
- package/types/deps/deno.land/std@0.180.0/http/_negotiation/language.d.ts +30 -0
- package/types/deps/deno.land/std@0.180.0/http/_negotiation/media_type.d.ts +30 -0
- package/types/deps/deno.land/std@0.180.0/http/negotiation.d.ts +126 -0
- package/types/deps/deno.land/std@0.180.0/media_types/_db.d.ts +5 -0
- package/types/deps/deno.land/std@0.180.0/media_types/_util.d.ts +21 -0
- package/types/deps/deno.land/std@0.180.0/media_types/content_type.d.ts +38 -0
- package/types/deps/deno.land/std@0.180.0/media_types/extension.d.ts +17 -0
- package/types/deps/deno.land/std@0.180.0/media_types/extensions_by_type.d.ts +20 -0
- package/types/deps/deno.land/std@0.180.0/media_types/format_media_type.d.ts +16 -0
- package/types/deps/deno.land/std@0.180.0/media_types/get_charset.d.ts +15 -0
- package/types/deps/deno.land/std@0.180.0/media_types/mod.d.ts +20 -0
- package/types/deps/deno.land/std@0.180.0/media_types/parse_media_type.d.ts +37 -0
- package/types/deps/deno.land/std@0.180.0/media_types/type_by_extension.d.ts +17 -0
- package/types/deps/deno.land/std@0.180.0/media_types/vendor/mime-db.v1.52.0.d.ts +8518 -0
- package/types/deps/deno.land/x/vary@1.0.0/mod.d.ts +23 -0
- package/types/deps.d.ts +7 -0
- package/types/encoders/deflate.d.ts +3 -0
- package/types/encoders/gzip.d.ts +3 -0
- package/types/encoders/utils.d.ts +4 -0
- package/types/middleware.d.ts +28 -0
- package/types/mod.d.ts +2 -0
- package/types/transform.d.ts +3 -0
- package/types/types.d.ts +15 -0
- package/types/utils.d.ts +2 -0
|
@@ -0,0 +1,178 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// Copyright 2018-2023 the Deno authors. All rights reserved. MIT license.
|
|
3
|
+
/*!
|
|
4
|
+
* Adapted directly from negotiator at https://github.com/jshttp/negotiator/
|
|
5
|
+
* which is licensed as follows:
|
|
6
|
+
*
|
|
7
|
+
* (The MIT License)
|
|
8
|
+
*
|
|
9
|
+
* Copyright (c) 2012-2014 Federico Romero
|
|
10
|
+
* Copyright (c) 2012-2014 Isaac Z. Schlueter
|
|
11
|
+
* Copyright (c) 2014-2015 Douglas Christopher Wilson
|
|
12
|
+
*
|
|
13
|
+
* Permission is hereby granted, free of charge, to any person obtaining
|
|
14
|
+
* a copy of this software and associated documentation files (the
|
|
15
|
+
* 'Software'), to deal in the Software without restriction, including
|
|
16
|
+
* without limitation the rights to use, copy, modify, merge, publish,
|
|
17
|
+
* distribute, sublicense, and/or sell copies of the Software, and to
|
|
18
|
+
* permit persons to whom the Software is furnished to do so, subject to
|
|
19
|
+
* the following conditions:
|
|
20
|
+
*
|
|
21
|
+
* The above copyright notice and this permission notice shall be
|
|
22
|
+
* included in all copies or substantial portions of the Software.
|
|
23
|
+
*
|
|
24
|
+
* THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
|
|
25
|
+
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
|
26
|
+
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
|
27
|
+
* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
|
|
28
|
+
* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
|
|
29
|
+
* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
|
|
30
|
+
* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
31
|
+
*/
|
|
32
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
33
|
+
exports.preferredMediaTypes = void 0;
|
|
34
|
+
const common_js_1 = require("./common.js");
|
|
35
|
+
const simpleMediaTypeRegExp = /^\s*([^\s\/;]+)\/([^;\s]+)\s*(?:;(.*))?$/;
|
|
36
|
+
function quoteCount(str) {
|
|
37
|
+
let count = 0;
|
|
38
|
+
let index = 0;
|
|
39
|
+
while ((index = str.indexOf(`"`, index)) !== -1) {
|
|
40
|
+
count++;
|
|
41
|
+
index++;
|
|
42
|
+
}
|
|
43
|
+
return count;
|
|
44
|
+
}
|
|
45
|
+
function splitMediaTypes(accept) {
|
|
46
|
+
const accepts = accept.split(",");
|
|
47
|
+
let j = 0;
|
|
48
|
+
for (let i = 1; i < accepts.length; i++) {
|
|
49
|
+
if (quoteCount(accepts[j]) % 2 === 0) {
|
|
50
|
+
accepts[++j] = accepts[i];
|
|
51
|
+
}
|
|
52
|
+
else {
|
|
53
|
+
accepts[j] += `,${accepts[i]}`;
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
accepts.length = j + 1;
|
|
57
|
+
return accepts;
|
|
58
|
+
}
|
|
59
|
+
function splitParameters(str) {
|
|
60
|
+
const parameters = str.split(";");
|
|
61
|
+
let j = 0;
|
|
62
|
+
for (let i = 1; i < parameters.length; i++) {
|
|
63
|
+
if (quoteCount(parameters[j]) % 2 === 0) {
|
|
64
|
+
parameters[++j] = parameters[i];
|
|
65
|
+
}
|
|
66
|
+
else {
|
|
67
|
+
parameters[j] += `;${parameters[i]}`;
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
parameters.length = j + 1;
|
|
71
|
+
return parameters.map((p) => p.trim());
|
|
72
|
+
}
|
|
73
|
+
function splitKeyValuePair(str) {
|
|
74
|
+
const [key, value] = str.split("=");
|
|
75
|
+
return [key.toLowerCase(), value];
|
|
76
|
+
}
|
|
77
|
+
function parseMediaType(str, i) {
|
|
78
|
+
const match = simpleMediaTypeRegExp.exec(str);
|
|
79
|
+
if (!match) {
|
|
80
|
+
return;
|
|
81
|
+
}
|
|
82
|
+
const params = Object.create(null);
|
|
83
|
+
let q = 1;
|
|
84
|
+
const [, type, subtype, parameters] = match;
|
|
85
|
+
if (parameters) {
|
|
86
|
+
const kvps = splitParameters(parameters).map(splitKeyValuePair);
|
|
87
|
+
for (const [key, val] of kvps) {
|
|
88
|
+
const value = val && val[0] === `"` && val[val.length - 1] === `"`
|
|
89
|
+
? val.slice(1, val.length - 1)
|
|
90
|
+
: val;
|
|
91
|
+
if (key === "q" && value) {
|
|
92
|
+
q = parseFloat(value);
|
|
93
|
+
break;
|
|
94
|
+
}
|
|
95
|
+
params[key] = value;
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
return { type, subtype, params, q, i };
|
|
99
|
+
}
|
|
100
|
+
function parseAccept(accept) {
|
|
101
|
+
const accepts = splitMediaTypes(accept);
|
|
102
|
+
const mediaTypes = [];
|
|
103
|
+
for (let i = 0; i < accepts.length; i++) {
|
|
104
|
+
const mediaType = parseMediaType(accepts[i].trim(), i);
|
|
105
|
+
if (mediaType) {
|
|
106
|
+
mediaTypes.push(mediaType);
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
return mediaTypes;
|
|
110
|
+
}
|
|
111
|
+
function getFullType(spec) {
|
|
112
|
+
return `${spec.type}/${spec.subtype}`;
|
|
113
|
+
}
|
|
114
|
+
function specify(type, spec, index) {
|
|
115
|
+
const p = parseMediaType(type, index);
|
|
116
|
+
if (!p) {
|
|
117
|
+
return;
|
|
118
|
+
}
|
|
119
|
+
let s = 0;
|
|
120
|
+
if (spec.type.toLowerCase() === p.type.toLowerCase()) {
|
|
121
|
+
s |= 4;
|
|
122
|
+
}
|
|
123
|
+
else if (spec.type !== "*") {
|
|
124
|
+
return;
|
|
125
|
+
}
|
|
126
|
+
if (spec.subtype.toLowerCase() === p.subtype.toLowerCase()) {
|
|
127
|
+
s |= 2;
|
|
128
|
+
}
|
|
129
|
+
else if (spec.subtype !== "*") {
|
|
130
|
+
return;
|
|
131
|
+
}
|
|
132
|
+
const keys = Object.keys(spec.params);
|
|
133
|
+
if (keys.length) {
|
|
134
|
+
if (keys.every((key) => (spec.params[key] || "").toLowerCase() ===
|
|
135
|
+
(p.params[key] || "").toLowerCase())) {
|
|
136
|
+
s |= 1;
|
|
137
|
+
}
|
|
138
|
+
else {
|
|
139
|
+
return;
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
return {
|
|
143
|
+
i: index,
|
|
144
|
+
o: spec.o,
|
|
145
|
+
q: spec.q,
|
|
146
|
+
s,
|
|
147
|
+
};
|
|
148
|
+
}
|
|
149
|
+
function getMediaTypePriority(type, accepted, index) {
|
|
150
|
+
let priority = { o: -1, q: 0, s: 0, i: index };
|
|
151
|
+
for (const accepts of accepted) {
|
|
152
|
+
const spec = specify(type, accepts, index);
|
|
153
|
+
if (spec &&
|
|
154
|
+
((priority.s || 0) - (spec.s || 0) ||
|
|
155
|
+
(priority.q || 0) - (spec.q || 0) ||
|
|
156
|
+
(priority.o || 0) - (spec.o || 0)) < 0) {
|
|
157
|
+
priority = spec;
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
return priority;
|
|
161
|
+
}
|
|
162
|
+
function preferredMediaTypes(accept, provided) {
|
|
163
|
+
const accepts = parseAccept(accept === undefined ? "*/*" : accept || "");
|
|
164
|
+
if (!provided) {
|
|
165
|
+
return accepts
|
|
166
|
+
.filter(common_js_1.isQuality)
|
|
167
|
+
.sort(common_js_1.compareSpecs)
|
|
168
|
+
.map(getFullType);
|
|
169
|
+
}
|
|
170
|
+
const priorities = provided.map((type, index) => {
|
|
171
|
+
return getMediaTypePriority(type, accepts, index);
|
|
172
|
+
});
|
|
173
|
+
return priorities
|
|
174
|
+
.filter(common_js_1.isQuality)
|
|
175
|
+
.sort(common_js_1.compareSpecs)
|
|
176
|
+
.map((priority) => provided[priorities.indexOf(priority)]);
|
|
177
|
+
}
|
|
178
|
+
exports.preferredMediaTypes = preferredMediaTypes;
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// Copyright 2018-2023 the Deno authors. All rights reserved. MIT license.
|
|
3
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
+
exports.acceptsLanguages = exports.acceptsEncodings = exports.accepts = void 0;
|
|
5
|
+
/**
|
|
6
|
+
* Contains the functions {@linkcode accepts}, {@linkcode acceptsEncodings}, and
|
|
7
|
+
* {@linkcode acceptsLanguages} to provide content negotiation capabilities.
|
|
8
|
+
*
|
|
9
|
+
* @module
|
|
10
|
+
*/
|
|
11
|
+
const encoding_js_1 = require("./_negotiation/encoding.js");
|
|
12
|
+
const language_js_1 = require("./_negotiation/language.js");
|
|
13
|
+
const media_type_js_1 = require("./_negotiation/media_type.js");
|
|
14
|
+
function accepts(request, ...types) {
|
|
15
|
+
const accept = request.headers.get("accept");
|
|
16
|
+
return types.length
|
|
17
|
+
? accept ? (0, media_type_js_1.preferredMediaTypes)(accept, types)[0] : types[0]
|
|
18
|
+
: accept
|
|
19
|
+
? (0, media_type_js_1.preferredMediaTypes)(accept)
|
|
20
|
+
: ["*/*"];
|
|
21
|
+
}
|
|
22
|
+
exports.accepts = accepts;
|
|
23
|
+
function acceptsEncodings(request, ...encodings) {
|
|
24
|
+
const acceptEncoding = request.headers.get("accept-encoding");
|
|
25
|
+
return encodings.length
|
|
26
|
+
? acceptEncoding
|
|
27
|
+
? (0, encoding_js_1.preferredEncodings)(acceptEncoding, encodings)[0]
|
|
28
|
+
: encodings[0]
|
|
29
|
+
: acceptEncoding
|
|
30
|
+
? (0, encoding_js_1.preferredEncodings)(acceptEncoding)
|
|
31
|
+
: ["*"];
|
|
32
|
+
}
|
|
33
|
+
exports.acceptsEncodings = acceptsEncodings;
|
|
34
|
+
function acceptsLanguages(request, ...langs) {
|
|
35
|
+
const acceptLanguage = request.headers.get("accept-language");
|
|
36
|
+
return langs.length
|
|
37
|
+
? acceptLanguage ? (0, language_js_1.preferredLanguages)(acceptLanguage, langs)[0] : langs[0]
|
|
38
|
+
: acceptLanguage
|
|
39
|
+
? (0, language_js_1.preferredLanguages)(acceptLanguage)
|
|
40
|
+
: ["*"];
|
|
41
|
+
}
|
|
42
|
+
exports.acceptsLanguages = acceptsLanguages;
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.db = exports.types = void 0;
|
|
7
|
+
// Copyright 2018-2023 the Deno authors. All rights reserved. MIT license.
|
|
8
|
+
const mime_db_v1_52_0_js_1 = __importDefault(require("./vendor/mime-db.v1.52.0.js"));
|
|
9
|
+
exports.db = mime_db_v1_52_0_js_1.default;
|
|
10
|
+
const _util_js_1 = require("./_util.js");
|
|
11
|
+
/** A map of the media type for a given extension */
|
|
12
|
+
exports.types = new Map();
|
|
13
|
+
/** Internal function to populate the maps based on the Mime DB. */
|
|
14
|
+
(function populateMaps() {
|
|
15
|
+
const preference = ["nginx", "apache", undefined, "iana"];
|
|
16
|
+
for (const type of Object.keys(mime_db_v1_52_0_js_1.default)) {
|
|
17
|
+
const mime = mime_db_v1_52_0_js_1.default[type];
|
|
18
|
+
const exts = mime.extensions;
|
|
19
|
+
if (!exts || !exts.length) {
|
|
20
|
+
continue;
|
|
21
|
+
}
|
|
22
|
+
// @ts-ignore work around denoland/dnt#148
|
|
23
|
+
_util_js_1.extensions.set(type, exts);
|
|
24
|
+
for (const ext of exts) {
|
|
25
|
+
const current = exports.types.get(ext);
|
|
26
|
+
if (current) {
|
|
27
|
+
const from = preference.indexOf(mime_db_v1_52_0_js_1.default[current].source);
|
|
28
|
+
const to = preference.indexOf(mime.source);
|
|
29
|
+
if (current !== "application/octet-stream" &&
|
|
30
|
+
(from > to ||
|
|
31
|
+
// @ts-ignore work around denoland/dnt#148
|
|
32
|
+
(from === to && current.startsWith("application/")))) {
|
|
33
|
+
continue;
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
exports.types.set(ext, type);
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
})();
|
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// Copyright 2018-2023 the Deno authors. All rights reserved. MIT license.
|
|
3
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
+
exports.needsEncoding = exports.isToken = exports.isIterator = exports.decode2331Encoding = exports.consumeMediaParam = exports.consumeValue = exports.consumeToken = exports.extensions = void 0;
|
|
5
|
+
/** A map of extensions for a given media type. */
|
|
6
|
+
exports.extensions = new Map();
|
|
7
|
+
function consumeToken(v) {
|
|
8
|
+
const notPos = indexOf(v, isNotTokenChar);
|
|
9
|
+
if (notPos == -1) {
|
|
10
|
+
return [v, ""];
|
|
11
|
+
}
|
|
12
|
+
if (notPos == 0) {
|
|
13
|
+
return ["", v];
|
|
14
|
+
}
|
|
15
|
+
return [v.slice(0, notPos), v.slice(notPos)];
|
|
16
|
+
}
|
|
17
|
+
exports.consumeToken = consumeToken;
|
|
18
|
+
function consumeValue(v) {
|
|
19
|
+
if (!v) {
|
|
20
|
+
return ["", v];
|
|
21
|
+
}
|
|
22
|
+
if (v[0] !== `"`) {
|
|
23
|
+
return consumeToken(v);
|
|
24
|
+
}
|
|
25
|
+
let value = "";
|
|
26
|
+
for (let i = 1; i < v.length; i++) {
|
|
27
|
+
const r = v[i];
|
|
28
|
+
if (r === `"`) {
|
|
29
|
+
return [value, v.slice(i + 1)];
|
|
30
|
+
}
|
|
31
|
+
if (r === "\\" && i + 1 < v.length && isTSpecial(v[i + 1])) {
|
|
32
|
+
value += v[i + 1];
|
|
33
|
+
i++;
|
|
34
|
+
continue;
|
|
35
|
+
}
|
|
36
|
+
if (r === "\r" || r === "\n") {
|
|
37
|
+
return ["", v];
|
|
38
|
+
}
|
|
39
|
+
value += v[i];
|
|
40
|
+
}
|
|
41
|
+
return ["", v];
|
|
42
|
+
}
|
|
43
|
+
exports.consumeValue = consumeValue;
|
|
44
|
+
function consumeMediaParam(v) {
|
|
45
|
+
let rest = v.trimStart();
|
|
46
|
+
if (!rest.startsWith(";")) {
|
|
47
|
+
return ["", "", v];
|
|
48
|
+
}
|
|
49
|
+
rest = rest.slice(1);
|
|
50
|
+
rest = rest.trimStart();
|
|
51
|
+
let param;
|
|
52
|
+
[param, rest] = consumeToken(rest);
|
|
53
|
+
param = param.toLowerCase();
|
|
54
|
+
if (!param) {
|
|
55
|
+
return ["", "", v];
|
|
56
|
+
}
|
|
57
|
+
rest = rest.slice(1);
|
|
58
|
+
rest = rest.trimStart();
|
|
59
|
+
const [value, rest2] = consumeValue(rest);
|
|
60
|
+
if (value == "" && rest2 === rest) {
|
|
61
|
+
return ["", "", v];
|
|
62
|
+
}
|
|
63
|
+
rest = rest2;
|
|
64
|
+
return [param, value, rest];
|
|
65
|
+
}
|
|
66
|
+
exports.consumeMediaParam = consumeMediaParam;
|
|
67
|
+
function decode2331Encoding(v) {
|
|
68
|
+
const sv = v.split(`'`, 3);
|
|
69
|
+
if (sv.length !== 3) {
|
|
70
|
+
return undefined;
|
|
71
|
+
}
|
|
72
|
+
const charset = sv[0].toLowerCase();
|
|
73
|
+
if (!charset) {
|
|
74
|
+
return undefined;
|
|
75
|
+
}
|
|
76
|
+
if (charset != "us-ascii" && charset != "utf-8") {
|
|
77
|
+
return undefined;
|
|
78
|
+
}
|
|
79
|
+
const encv = decodeURI(sv[2]);
|
|
80
|
+
if (!encv) {
|
|
81
|
+
return undefined;
|
|
82
|
+
}
|
|
83
|
+
return encv;
|
|
84
|
+
}
|
|
85
|
+
exports.decode2331Encoding = decode2331Encoding;
|
|
86
|
+
function indexOf(s, fn) {
|
|
87
|
+
let i = -1;
|
|
88
|
+
for (const v of s) {
|
|
89
|
+
i++;
|
|
90
|
+
if (fn(v)) {
|
|
91
|
+
return i;
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
return -1;
|
|
95
|
+
}
|
|
96
|
+
function isIterator(obj) {
|
|
97
|
+
if (obj == null) {
|
|
98
|
+
return false;
|
|
99
|
+
}
|
|
100
|
+
// deno-lint-ignore no-explicit-any
|
|
101
|
+
return typeof obj[Symbol.iterator] === "function";
|
|
102
|
+
}
|
|
103
|
+
exports.isIterator = isIterator;
|
|
104
|
+
function isToken(s) {
|
|
105
|
+
if (!s) {
|
|
106
|
+
return false;
|
|
107
|
+
}
|
|
108
|
+
return indexOf(s, isNotTokenChar) < 0;
|
|
109
|
+
}
|
|
110
|
+
exports.isToken = isToken;
|
|
111
|
+
function isNotTokenChar(r) {
|
|
112
|
+
return !isTokenChar(r);
|
|
113
|
+
}
|
|
114
|
+
function isTokenChar(r) {
|
|
115
|
+
const code = r.charCodeAt(0);
|
|
116
|
+
return code > 0x20 && code < 0x7f && !isTSpecial(r);
|
|
117
|
+
}
|
|
118
|
+
function isTSpecial(r) {
|
|
119
|
+
return `()<>@,;:\\"/[]?=`.includes(r[0]);
|
|
120
|
+
}
|
|
121
|
+
const CHAR_CODE_SPACE = " ".charCodeAt(0);
|
|
122
|
+
const CHAR_CODE_TILDE = "~".charCodeAt(0);
|
|
123
|
+
function needsEncoding(s) {
|
|
124
|
+
for (const b of s) {
|
|
125
|
+
const charCode = b.charCodeAt(0);
|
|
126
|
+
if ((charCode < CHAR_CODE_SPACE || charCode > CHAR_CODE_TILDE) && b !== "\t") {
|
|
127
|
+
return true;
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
return false;
|
|
131
|
+
}
|
|
132
|
+
exports.needsEncoding = needsEncoding;
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.contentType = void 0;
|
|
4
|
+
// Copyright 2018-2023 the Deno authors. All rights reserved. MIT license.
|
|
5
|
+
const parse_media_type_js_1 = require("./parse_media_type.js");
|
|
6
|
+
const type_by_extension_js_1 = require("./type_by_extension.js");
|
|
7
|
+
const get_charset_js_1 = require("./get_charset.js");
|
|
8
|
+
const format_media_type_js_1 = require("./format_media_type.js");
|
|
9
|
+
/**
|
|
10
|
+
* Given an extension or media type, return a full `Content-Type` or
|
|
11
|
+
* `Content-Disposition` header value.
|
|
12
|
+
*
|
|
13
|
+
* The function will treat the `extensionOrType` as a media type when it
|
|
14
|
+
* contains a `/`, otherwise it will process it as an extension, with or without
|
|
15
|
+
* the leading `.`.
|
|
16
|
+
*
|
|
17
|
+
* Returns `undefined` if unable to resolve the media type.
|
|
18
|
+
*
|
|
19
|
+
* > Note: a side effect of `deno/x/media_types` was that you could pass a file
|
|
20
|
+
* > name (e.g. `file.json`) and it would return the content type. This behavior
|
|
21
|
+
* > is intentionally not supported here. If you want to get an extension for a
|
|
22
|
+
* > file name, use `extname()` from `std/path/mod.ts` to determine the
|
|
23
|
+
* > extension and pass it here.
|
|
24
|
+
*
|
|
25
|
+
* @example
|
|
26
|
+
* ```ts
|
|
27
|
+
* import { contentType } from "https://deno.land/std@$STD_VERSION/media_types/content_type.ts";
|
|
28
|
+
*
|
|
29
|
+
* contentType(".json"); // `application/json; charset=UTF-8`
|
|
30
|
+
* contentType("text/html"); // `text/html; charset=UTF-8`
|
|
31
|
+
* contentType("text/html; charset=UTF-8"); // `text/html; charset=UTF-8`
|
|
32
|
+
* contentType("txt"); // `text/plain; charset=UTF-8`
|
|
33
|
+
* contentType("foo"); // undefined
|
|
34
|
+
* contentType("file.json"); // undefined
|
|
35
|
+
* ```
|
|
36
|
+
*/
|
|
37
|
+
function contentType(extensionOrType) {
|
|
38
|
+
try {
|
|
39
|
+
const [mediaType, params = {}] = extensionOrType.includes("/")
|
|
40
|
+
? (0, parse_media_type_js_1.parseMediaType)(extensionOrType)
|
|
41
|
+
: [(0, type_by_extension_js_1.typeByExtension)(extensionOrType), undefined];
|
|
42
|
+
if (!mediaType) {
|
|
43
|
+
return undefined;
|
|
44
|
+
}
|
|
45
|
+
if (!("charset" in params)) {
|
|
46
|
+
const charset = (0, get_charset_js_1.getCharset)(mediaType);
|
|
47
|
+
if (charset) {
|
|
48
|
+
params.charset = charset;
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
return (0, format_media_type_js_1.formatMediaType)(mediaType, params);
|
|
52
|
+
}
|
|
53
|
+
catch {
|
|
54
|
+
// just swallow returning undefined
|
|
55
|
+
}
|
|
56
|
+
return undefined;
|
|
57
|
+
}
|
|
58
|
+
exports.contentType = contentType;
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.extension = void 0;
|
|
4
|
+
// Copyright 2018-2023 the Deno authors. All rights reserved. MIT license.
|
|
5
|
+
const extensions_by_type_js_1 = require("./extensions_by_type.js");
|
|
6
|
+
/**
|
|
7
|
+
* For a given media type, return the most relevant extension, or `undefined`
|
|
8
|
+
* if no extension can be found.
|
|
9
|
+
*
|
|
10
|
+
* Extensions are returned without a leading `.`.
|
|
11
|
+
*
|
|
12
|
+
* @example
|
|
13
|
+
* ```ts
|
|
14
|
+
* import { extension } from "https://deno.land/std@$STD_VERSION/media_types/extension.ts";
|
|
15
|
+
*
|
|
16
|
+
* extension("text/plain"); // `txt`
|
|
17
|
+
* extension("application/json"); // `json`
|
|
18
|
+
* extension("text/html; charset=UTF-8"); // `html`
|
|
19
|
+
* extension("application/foo"); // undefined
|
|
20
|
+
* ```
|
|
21
|
+
*/
|
|
22
|
+
function extension(type) {
|
|
23
|
+
const exts = (0, extensions_by_type_js_1.extensionsByType)(type);
|
|
24
|
+
if (exts) {
|
|
25
|
+
return exts[0];
|
|
26
|
+
}
|
|
27
|
+
return undefined;
|
|
28
|
+
}
|
|
29
|
+
exports.extension = extension;
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.extensionsByType = exports.extensions = void 0;
|
|
4
|
+
// Copyright 2018-2023 the Deno authors. All rights reserved. MIT license.
|
|
5
|
+
const parse_media_type_js_1 = require("./parse_media_type.js");
|
|
6
|
+
const _util_js_1 = require("./_util.js");
|
|
7
|
+
Object.defineProperty(exports, "extensions", { enumerable: true, get: function () { return _util_js_1.extensions; } });
|
|
8
|
+
/**
|
|
9
|
+
* Returns the extensions known to be associated with the media type `type`.
|
|
10
|
+
* The returned extensions will each begin with a leading dot, as in `.html`.
|
|
11
|
+
*
|
|
12
|
+
* When `type` has no associated extensions, the function returns `undefined`.
|
|
13
|
+
*
|
|
14
|
+
* Extensions are returned without a leading `.`.
|
|
15
|
+
*
|
|
16
|
+
* @example
|
|
17
|
+
* ```ts
|
|
18
|
+
* import { extensionsByType } from "https://deno.land/std@$STD_VERSION/media_types/extensions_by_type.ts";
|
|
19
|
+
*
|
|
20
|
+
* extensionsByType("application/json"); // ["json", "map"]
|
|
21
|
+
* extensionsByType("text/html; charset=UTF-8"); // ["html", "htm", "shtml"]
|
|
22
|
+
* extensionsByType("application/foo"); // undefined
|
|
23
|
+
* ```
|
|
24
|
+
*/
|
|
25
|
+
function extensionsByType(type) {
|
|
26
|
+
try {
|
|
27
|
+
const [mediaType] = (0, parse_media_type_js_1.parseMediaType)(type);
|
|
28
|
+
return _util_js_1.extensions.get(mediaType);
|
|
29
|
+
}
|
|
30
|
+
catch {
|
|
31
|
+
// just swallow errors, returning undefined
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
exports.extensionsByType = extensionsByType;
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.formatMediaType = void 0;
|
|
4
|
+
// Copyright 2018-2023 the Deno authors. All rights reserved. MIT license.
|
|
5
|
+
const _util_js_1 = require("./_util.js");
|
|
6
|
+
/** Serializes the media type and the optional parameters as a media type
|
|
7
|
+
* conforming to RFC 2045 and RFC 2616.
|
|
8
|
+
*
|
|
9
|
+
* The type and parameter names are written in lower-case.
|
|
10
|
+
*
|
|
11
|
+
* When any of the arguments results in a standard violation then the return
|
|
12
|
+
* value will be an empty string (`""`).
|
|
13
|
+
*
|
|
14
|
+
* @example
|
|
15
|
+
* ```ts
|
|
16
|
+
* import { formatMediaType } from "https://deno.land/std@$STD_VERSION/media_types/format_media_type.ts";
|
|
17
|
+
*
|
|
18
|
+
* formatMediaType("text/plain", { charset: "UTF-8" }); // `text/plain; charset=UTF-8`
|
|
19
|
+
* ```
|
|
20
|
+
*/
|
|
21
|
+
function formatMediaType(type, param) {
|
|
22
|
+
let b = "";
|
|
23
|
+
const [major, sub] = type.split("/");
|
|
24
|
+
if (!sub) {
|
|
25
|
+
if (!(0, _util_js_1.isToken)(type)) {
|
|
26
|
+
return "";
|
|
27
|
+
}
|
|
28
|
+
b += type.toLowerCase();
|
|
29
|
+
}
|
|
30
|
+
else {
|
|
31
|
+
if (!(0, _util_js_1.isToken)(major) || !(0, _util_js_1.isToken)(sub)) {
|
|
32
|
+
return "";
|
|
33
|
+
}
|
|
34
|
+
b += `${major.toLowerCase()}/${sub.toLowerCase()}`;
|
|
35
|
+
}
|
|
36
|
+
if (param) {
|
|
37
|
+
param = (0, _util_js_1.isIterator)(param) ? Object.fromEntries(param) : param;
|
|
38
|
+
const attrs = Object.keys(param);
|
|
39
|
+
attrs.sort();
|
|
40
|
+
for (const attribute of attrs) {
|
|
41
|
+
if (!(0, _util_js_1.isToken)(attribute)) {
|
|
42
|
+
return "";
|
|
43
|
+
}
|
|
44
|
+
const value = param[attribute];
|
|
45
|
+
b += `; ${attribute.toLowerCase()}`;
|
|
46
|
+
const needEnc = (0, _util_js_1.needsEncoding)(value);
|
|
47
|
+
if (needEnc) {
|
|
48
|
+
b += "*";
|
|
49
|
+
}
|
|
50
|
+
b += "=";
|
|
51
|
+
if (needEnc) {
|
|
52
|
+
b += `utf-8''${encodeURIComponent(value)}`;
|
|
53
|
+
continue;
|
|
54
|
+
}
|
|
55
|
+
if ((0, _util_js_1.isToken)(value)) {
|
|
56
|
+
b += value;
|
|
57
|
+
continue;
|
|
58
|
+
}
|
|
59
|
+
b += `"${value.replace(/["\\]/gi, (m) => `\\${m}`)}"`;
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
return b;
|
|
63
|
+
}
|
|
64
|
+
exports.formatMediaType = formatMediaType;
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.getCharset = void 0;
|
|
4
|
+
// Copyright 2018-2023 the Deno authors. All rights reserved. MIT license.
|
|
5
|
+
const parse_media_type_js_1 = require("./parse_media_type.js");
|
|
6
|
+
const _db_js_1 = require("./_db.js");
|
|
7
|
+
/**
|
|
8
|
+
* Given a media type or header value, identify the encoding charset. If the
|
|
9
|
+
* charset cannot be determined, the function returns `undefined`.
|
|
10
|
+
*
|
|
11
|
+
* @example
|
|
12
|
+
* ```ts
|
|
13
|
+
* import { getCharset } from "https://deno.land/std@$STD_VERSION/media_types/get_charset.ts";
|
|
14
|
+
*
|
|
15
|
+
* getCharset("text/plain"); // `UTF-8`
|
|
16
|
+
* getCharset("application/foo"); // undefined
|
|
17
|
+
* getCharset("application/news-checkgroups"); // `US-ASCII`
|
|
18
|
+
* getCharset("application/news-checkgroups; charset=UTF-8"); // `UTF-8`
|
|
19
|
+
* ```
|
|
20
|
+
*/
|
|
21
|
+
function getCharset(type) {
|
|
22
|
+
try {
|
|
23
|
+
const [mediaType, params] = (0, parse_media_type_js_1.parseMediaType)(type);
|
|
24
|
+
if (params && params["charset"]) {
|
|
25
|
+
return params["charset"];
|
|
26
|
+
}
|
|
27
|
+
const entry = _db_js_1.db[mediaType];
|
|
28
|
+
if (entry && entry.charset) {
|
|
29
|
+
return entry.charset;
|
|
30
|
+
}
|
|
31
|
+
if (mediaType.startsWith("text/")) {
|
|
32
|
+
return "UTF-8";
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
catch {
|
|
36
|
+
// just swallow errors, returning undefined
|
|
37
|
+
}
|
|
38
|
+
return undefined;
|
|
39
|
+
}
|
|
40
|
+
exports.getCharset = getCharset;
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// Copyright 2018-2023 the Deno authors. All rights reserved. MIT license.
|
|
3
|
+
// This module is browser compatible.
|
|
4
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
5
|
+
if (k2 === undefined) k2 = k;
|
|
6
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
7
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
8
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
9
|
+
}
|
|
10
|
+
Object.defineProperty(o, k2, desc);
|
|
11
|
+
}) : (function(o, m, k, k2) {
|
|
12
|
+
if (k2 === undefined) k2 = k;
|
|
13
|
+
o[k2] = m[k];
|
|
14
|
+
}));
|
|
15
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
16
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
17
|
+
};
|
|
18
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
19
|
+
/** Utility functions for media types (MIME types).
|
|
20
|
+
*
|
|
21
|
+
* This API is inspired by the GoLang [`mime`](https://pkg.go.dev/mime) package
|
|
22
|
+
* and [jshttp/mime-types](https://github.com/jshttp/mime-types), and is
|
|
23
|
+
* designed to integrate and improve the APIs from
|
|
24
|
+
* [deno.land/x/media_types](https://deno.land/x/media_types).
|
|
25
|
+
*
|
|
26
|
+
* The `vendor` folder contains copy of the
|
|
27
|
+
* [jshttp/mime-db](https://github.com/jshttp/mime-types) `db.json` file along
|
|
28
|
+
* with its license.
|
|
29
|
+
*
|
|
30
|
+
* @module
|
|
31
|
+
*/
|
|
32
|
+
__exportStar(require("./content_type.js"), exports);
|
|
33
|
+
__exportStar(require("./extension.js"), exports);
|
|
34
|
+
__exportStar(require("./extensions_by_type.js"), exports);
|
|
35
|
+
__exportStar(require("./format_media_type.js"), exports);
|
|
36
|
+
__exportStar(require("./get_charset.js"), exports);
|
|
37
|
+
__exportStar(require("./parse_media_type.js"), exports);
|
|
38
|
+
__exportStar(require("./type_by_extension.js"), exports);
|