fetch-xhr-shim 0.0.1-beta
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/dist/cjs/dev.js +55 -0
- package/dist/cjs/encoding/TextDecoderP.js +179 -0
- package/dist/cjs/encoding/TextEncoderP.js +121 -0
- package/dist/cjs/event-system/AbortControllerP.js +28 -0
- package/dist/cjs/event-system/AbortSignalP.js +117 -0
- package/dist/cjs/event-system/CustomEventP.js +35 -0
- package/dist/cjs/event-system/EventP.js +125 -0
- package/dist/cjs/event-system/EventTargetP.js +181 -0
- package/dist/cjs/event-system/ProgressEventP.js +54 -0
- package/dist/cjs/fetch-api/BodyImpl.js +176 -0
- package/dist/cjs/fetch-api/HeadersP.js +184 -0
- package/dist/cjs/fetch-api/RequestP.js +188 -0
- package/dist/cjs/fetch-api/ResponseP.js +93 -0
- package/dist/cjs/fetch-api/fetchP.js +129 -0
- package/dist/cjs/file-system/BlobP.js +171 -0
- package/dist/cjs/file-system/FileP.js +53 -0
- package/dist/cjs/file-system/FileReaderP.js +201 -0
- package/dist/cjs/fixes.js +243 -0
- package/dist/cjs/index.js +59 -0
- package/dist/cjs/network/FormDataP.js +308 -0
- package/dist/cjs/network/URLSearchParamsP.js +235 -0
- package/dist/cjs/polyfill.js +87 -0
- package/dist/cjs/utils.js +70 -0
- package/dist/dev.d.ts +145 -0
- package/dist/esm/dev.js +13 -0
- package/dist/esm/encoding/TextDecoderP.js +175 -0
- package/dist/esm/encoding/TextEncoderP.js +118 -0
- package/dist/esm/event-system/AbortControllerP.js +25 -0
- package/dist/esm/event-system/AbortSignalP.js +112 -0
- package/dist/esm/event-system/CustomEventP.js +32 -0
- package/dist/esm/event-system/EventP.js +121 -0
- package/dist/esm/event-system/EventTargetP.js +174 -0
- package/dist/esm/event-system/ProgressEventP.js +51 -0
- package/dist/esm/fetch-api/BodyImpl.js +172 -0
- package/dist/esm/fetch-api/HeadersP.js +176 -0
- package/dist/esm/fetch-api/RequestP.js +184 -0
- package/dist/esm/fetch-api/ResponseP.js +90 -0
- package/dist/esm/fetch-api/fetchP.js +125 -0
- package/dist/esm/file-system/BlobP.js +164 -0
- package/dist/esm/file-system/FileP.js +50 -0
- package/dist/esm/file-system/FileReaderP.js +197 -0
- package/dist/esm/fixes.js +239 -0
- package/dist/esm/index.js +17 -0
- package/dist/esm/network/FormDataP.js +301 -0
- package/dist/esm/network/URLSearchParamsP.js +231 -0
- package/dist/esm/polyfill.js +85 -0
- package/dist/esm/utils.js +60 -0
- package/dist/fetch-xhr-shim.cjs.min.js +1 -0
- package/dist/fetch-xhr-shim.esm.min.js +1 -0
- package/dist/index.d.ts +300 -0
- package/package.json +59 -0
|
@@ -0,0 +1,308 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var FileP = require('../file-system/FileP.js');
|
|
4
|
+
var BlobP = require('../file-system/BlobP.js');
|
|
5
|
+
var utils = require('../utils.js');
|
|
6
|
+
|
|
7
|
+
class FormDataP {
|
|
8
|
+
constructor(form, submitter) {
|
|
9
|
+
utils.setState(this, "__FormData__", new FormDataState());
|
|
10
|
+
if (form !== undefined) {
|
|
11
|
+
try {
|
|
12
|
+
let elements = form.elements;
|
|
13
|
+
for (let i = 0; i < elements.length; ++i) {
|
|
14
|
+
let elm = elements[i];
|
|
15
|
+
if (!elm.name || elm.disabled || elm.type === "submit" || elm.type === "button" || elm.matches("form fieldset[disabled] *"))
|
|
16
|
+
return;
|
|
17
|
+
if (elm.type === "file") {
|
|
18
|
+
let files = elm.files && elm.files.length
|
|
19
|
+
? elm.files
|
|
20
|
+
: [new FileP.File([], "", { type: "application/octet-stream" })];
|
|
21
|
+
for (let i = 0; i < files.length; ++i) {
|
|
22
|
+
this.append(elm.name, files[i]);
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
else if (elm.type === "select-multiple" || elm.type === "select-one") {
|
|
26
|
+
for (let i = 0; i < elm.options.length; ++i) {
|
|
27
|
+
let opt = elm.options[i];
|
|
28
|
+
!opt.disabled && opt.selected && this.append(elm.name, opt.value);
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
else if (elm.type === "checkbox" || elm.type === "radio") {
|
|
32
|
+
if (elm.checked)
|
|
33
|
+
this.append(elm.name, elm.value);
|
|
34
|
+
}
|
|
35
|
+
else {
|
|
36
|
+
let value = elm.type === "textarea" ? normalizeLinefeeds(elm.value) : elm.value;
|
|
37
|
+
this.append(elm.name, value);
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
catch (e) {
|
|
42
|
+
throw new TypeError("Failed to construct 'FormData': parameter 1 is not of type 'HTMLFormElement'.");
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
if (submitter !== undefined && submitter !== null) {
|
|
46
|
+
console.warn("Ignoring the 'submitter' of 'FormData' constructor: parameter 2 not implemented.");
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
append(name, blobValue, filename) {
|
|
50
|
+
checkArgsFn(arguments.length, 2, "append");
|
|
51
|
+
state(this).array.push(normalizeArgs(name, blobValue, filename));
|
|
52
|
+
}
|
|
53
|
+
delete(name) {
|
|
54
|
+
checkArgsFn(arguments.length, 1, "delete");
|
|
55
|
+
let _name = "" + name;
|
|
56
|
+
let index = -1;
|
|
57
|
+
let array = state(this).array;
|
|
58
|
+
let result = [];
|
|
59
|
+
for (let i = 0; i < array.length; ++i) {
|
|
60
|
+
let item = array[i];
|
|
61
|
+
if (item[0] === _name) {
|
|
62
|
+
index = i;
|
|
63
|
+
continue;
|
|
64
|
+
}
|
|
65
|
+
result.push(item);
|
|
66
|
+
}
|
|
67
|
+
if (index > -1) {
|
|
68
|
+
state(this).array = result;
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
get(name) {
|
|
72
|
+
checkArgsFn(arguments.length, 1, "get");
|
|
73
|
+
let _name = "" + name;
|
|
74
|
+
let array = state(this).array;
|
|
75
|
+
for (let i = 0; i < array.length; ++i) {
|
|
76
|
+
let item = array[i];
|
|
77
|
+
if (item[0] === _name) {
|
|
78
|
+
return item[1];
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
return null;
|
|
82
|
+
}
|
|
83
|
+
getAll(name) {
|
|
84
|
+
checkArgsFn(arguments.length, 1, "getAll");
|
|
85
|
+
let _name = "" + name;
|
|
86
|
+
let array = state(this).array;
|
|
87
|
+
let result = [];
|
|
88
|
+
for (let i = 0; i < array.length; ++i) {
|
|
89
|
+
let item = array[i];
|
|
90
|
+
if (item[0] === _name) {
|
|
91
|
+
result.push(item[1]);
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
return result;
|
|
95
|
+
}
|
|
96
|
+
has(name) {
|
|
97
|
+
checkArgsFn(arguments.length, 1, "has");
|
|
98
|
+
let _name = "" + name;
|
|
99
|
+
let array = state(this).array;
|
|
100
|
+
for (let i = 0; i < array.length; ++i) {
|
|
101
|
+
let item = array[i];
|
|
102
|
+
if (item[0] === _name) {
|
|
103
|
+
return true;
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
return false;
|
|
107
|
+
}
|
|
108
|
+
set(name, blobValue, filename) {
|
|
109
|
+
checkArgsFn(arguments.length, 2, "set");
|
|
110
|
+
let _name = "" + name;
|
|
111
|
+
let _args = normalizeArgs(name, blobValue, filename);
|
|
112
|
+
let index = -1;
|
|
113
|
+
let array = state(this).array;
|
|
114
|
+
let result = [];
|
|
115
|
+
for (let i = 0; i < array.length; ++i) {
|
|
116
|
+
let item = array[i];
|
|
117
|
+
if (item[0] === _name) {
|
|
118
|
+
if (index === -1) {
|
|
119
|
+
index = i;
|
|
120
|
+
result.push(_args);
|
|
121
|
+
}
|
|
122
|
+
continue;
|
|
123
|
+
}
|
|
124
|
+
result.push(item);
|
|
125
|
+
}
|
|
126
|
+
if (index === -1) {
|
|
127
|
+
result.push(_args);
|
|
128
|
+
}
|
|
129
|
+
state(this).array = result;
|
|
130
|
+
}
|
|
131
|
+
forEach(callbackfn, thisArg) {
|
|
132
|
+
checkArgsFn(arguments.length, 1, "forEach");
|
|
133
|
+
if (typeof callbackfn !== "function") {
|
|
134
|
+
throw new TypeError("Failed to execute 'forEach' on 'FormData': parameter 1 is not of type 'Function'.");
|
|
135
|
+
}
|
|
136
|
+
let array = state(this).array;
|
|
137
|
+
for (let i = 0; i < array.length; ++i) {
|
|
138
|
+
let item = array[i];
|
|
139
|
+
callbackfn.call(thisArg, item[1], item[0], thisArg);
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
entries() {
|
|
143
|
+
return state(this).array.map(x => [x[0], x[1]]).values();
|
|
144
|
+
}
|
|
145
|
+
keys() {
|
|
146
|
+
return state(this).array.map(x => x[0]).values();
|
|
147
|
+
}
|
|
148
|
+
values() {
|
|
149
|
+
return state(this).array.map(x => x[1]).values();
|
|
150
|
+
}
|
|
151
|
+
// @ts-ignore
|
|
152
|
+
/** @internal */ [utils._Symbol.iterator]() {
|
|
153
|
+
return this.entries();
|
|
154
|
+
}
|
|
155
|
+
/** @internal */ toString() { return "[object FormData]"; }
|
|
156
|
+
/** @internal */ get [utils._Symbol.toStringTag]() { return "FormData"; }
|
|
157
|
+
/** @internal */ get __MPHTTPX__() { return { chain: ["FormData"] }; }
|
|
158
|
+
}
|
|
159
|
+
/** @internal */
|
|
160
|
+
class FormDataState {
|
|
161
|
+
constructor() {
|
|
162
|
+
this.array = [];
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
function state(target) {
|
|
166
|
+
return target.__FormData__;
|
|
167
|
+
}
|
|
168
|
+
function checkArgsFn(actual, expect, funcName) {
|
|
169
|
+
return utils.checkArgsLength(actual, expect, "FormData", funcName);
|
|
170
|
+
}
|
|
171
|
+
function normalizeArgs(name, value, filename) {
|
|
172
|
+
if (BlobP.isBlob(value)) {
|
|
173
|
+
filename = filename !== undefined
|
|
174
|
+
? ("" + filename)
|
|
175
|
+
: typeof value.name === "string"
|
|
176
|
+
? value.name
|
|
177
|
+
: "blob";
|
|
178
|
+
if (value.name !== filename || BlobP.isBlob(value, true)) {
|
|
179
|
+
let FileClass = !utils.isPolyfillType("Blob", value) ? FileP.File : FileP.FileP;
|
|
180
|
+
value = new FileClass([value], filename);
|
|
181
|
+
}
|
|
182
|
+
return ["" + name, value];
|
|
183
|
+
}
|
|
184
|
+
return ["" + name, "" + value];
|
|
185
|
+
}
|
|
186
|
+
function isFormData(value) {
|
|
187
|
+
return utils.isPolyfillType("FormData", value) || isExternalFormData(value);
|
|
188
|
+
}
|
|
189
|
+
function isExternalFormData(value) {
|
|
190
|
+
let expect = "[object FormData]";
|
|
191
|
+
return (Object.prototype.toString.call(value) === expect || String(value) === expect)
|
|
192
|
+
&& "forEach" in value
|
|
193
|
+
&& typeof value.forEach === "function";
|
|
194
|
+
}
|
|
195
|
+
function FormData_toBlob(formData, externalBoundary) {
|
|
196
|
+
const boundary = externalBoundary || ("----formdata-mphttpx-" + Math.random());
|
|
197
|
+
const p = `--${boundary}\r\nContent-Disposition: form-data; name="`;
|
|
198
|
+
let chunks = [];
|
|
199
|
+
let useNativeBlob = true;
|
|
200
|
+
formData.forEach((value, name) => {
|
|
201
|
+
if (typeof value === "string") {
|
|
202
|
+
chunks.push(p + escape(normalizeLinefeeds(name)) + `"\r\n\r\n${normalizeLinefeeds(value)}\r\n`);
|
|
203
|
+
}
|
|
204
|
+
else {
|
|
205
|
+
if (useNativeBlob && utils.isPolyfillType("Blob", value)) {
|
|
206
|
+
useNativeBlob = false;
|
|
207
|
+
}
|
|
208
|
+
chunks.push(p + escape(normalizeLinefeeds(name)) + `"; filename="${escape(value.name)}"\r\nContent-Type: ${value.type || "application/octet-stream"}\r\n\r\n`, value, `\r\n`);
|
|
209
|
+
}
|
|
210
|
+
});
|
|
211
|
+
chunks.push(`--${boundary}--`);
|
|
212
|
+
let BlobClass = useNativeBlob ? BlobP.Blob : BlobP.BlobP;
|
|
213
|
+
return new BlobClass(chunks, { type: "multipart/form-data; boundary=" + boundary });
|
|
214
|
+
}
|
|
215
|
+
// normalize line feeds for textarea
|
|
216
|
+
// https://html.spec.whatwg.org/multipage/form-elements.html#textarea-line-break-normalisation-transformation
|
|
217
|
+
function normalizeLinefeeds(value) {
|
|
218
|
+
return value.replace(/\r?\n|\r/g, "\r\n");
|
|
219
|
+
}
|
|
220
|
+
function escape(str) {
|
|
221
|
+
return str.replace(/\n/g, '%0A').replace(/\r/g, '%0D').replace(/"/g, '%22');
|
|
222
|
+
}
|
|
223
|
+
function extractBoundary(contentType) {
|
|
224
|
+
if (!contentType)
|
|
225
|
+
return;
|
|
226
|
+
if (!/multipart\/form-data/i.test(contentType))
|
|
227
|
+
return;
|
|
228
|
+
let boundaryMatch = contentType.match(/boundary\s*=\s*([^;]+)/i);
|
|
229
|
+
if (boundaryMatch && boundaryMatch[1]) {
|
|
230
|
+
let boundary = boundaryMatch[1].trim();
|
|
231
|
+
return boundary.replace(/^["']|["']$/g, "");
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
function createFormDataFromBinaryText(text, boundary) {
|
|
235
|
+
const throwParseError = () => {
|
|
236
|
+
throw new TypeError("Could not parse content as FormData.");
|
|
237
|
+
};
|
|
238
|
+
if (typeof text !== "string" || text.trim() === "") {
|
|
239
|
+
throwParseError();
|
|
240
|
+
}
|
|
241
|
+
let firstLineEnd = text.indexOf("\r\n");
|
|
242
|
+
if (firstLineEnd === -1) {
|
|
243
|
+
throwParseError();
|
|
244
|
+
}
|
|
245
|
+
let _boundary = text.substring(2, firstLineEnd).trim();
|
|
246
|
+
if (!_boundary) {
|
|
247
|
+
throwParseError();
|
|
248
|
+
}
|
|
249
|
+
if (boundary !== undefined && boundary !== _boundary) {
|
|
250
|
+
throwParseError();
|
|
251
|
+
}
|
|
252
|
+
let parts = text.split(`--${_boundary}`).filter(part => {
|
|
253
|
+
let trimmed = part.trim();
|
|
254
|
+
return trimmed !== "" && trimmed !== "--";
|
|
255
|
+
});
|
|
256
|
+
if (parts.length === 0) {
|
|
257
|
+
throwParseError();
|
|
258
|
+
}
|
|
259
|
+
let pairs = [];
|
|
260
|
+
let hasFile = false;
|
|
261
|
+
parts.forEach(part => {
|
|
262
|
+
let separatorIndex = part.indexOf("\r\n\r\n");
|
|
263
|
+
if (separatorIndex === -1) {
|
|
264
|
+
throwParseError();
|
|
265
|
+
}
|
|
266
|
+
let headerRaw = part.substring(0, separatorIndex).trim();
|
|
267
|
+
let nameMatch = headerRaw.match(/name="([^"]*)"/);
|
|
268
|
+
if (!nameMatch || nameMatch.length < 2) {
|
|
269
|
+
throwParseError();
|
|
270
|
+
}
|
|
271
|
+
let fieldName = nameMatch[1];
|
|
272
|
+
let filenameMatch = headerRaw.match(/filename="([^"]*)"/);
|
|
273
|
+
let contentRaw = part.substring(separatorIndex + 4);
|
|
274
|
+
if (!filenameMatch) {
|
|
275
|
+
pairs.push([fieldName, contentRaw.replace(/^[\r\n]+|[\r\n]+$/g, "")]);
|
|
276
|
+
}
|
|
277
|
+
else {
|
|
278
|
+
let filename = filenameMatch[1] || "";
|
|
279
|
+
let contentTypeMatch = headerRaw.match(/Content-Type: ([^\r\n]+)/);
|
|
280
|
+
let mimeType = contentTypeMatch ? (contentTypeMatch[1] || "").trim() : "text/plain";
|
|
281
|
+
let content = contentRaw.replace(/\r\n/g, "");
|
|
282
|
+
hasFile = true;
|
|
283
|
+
pairs.push([fieldName, new FileP.File([content], filename, { type: mimeType })]);
|
|
284
|
+
}
|
|
285
|
+
});
|
|
286
|
+
let useNativeFormData = !hasFile || (() => {
|
|
287
|
+
try {
|
|
288
|
+
let fd = new FormDataE();
|
|
289
|
+
fd.append("file", new FileP.File([], ""));
|
|
290
|
+
return typeof fd.get("file") !== "string";
|
|
291
|
+
}
|
|
292
|
+
catch (e) {
|
|
293
|
+
return false;
|
|
294
|
+
}
|
|
295
|
+
})();
|
|
296
|
+
let FormDataClass = useNativeFormData ? FormDataE : FormDataP;
|
|
297
|
+
let formData = new FormDataClass();
|
|
298
|
+
pairs.forEach(x => { formData.append(x[0], x[1]); });
|
|
299
|
+
return formData;
|
|
300
|
+
}
|
|
301
|
+
const FormDataE = (typeof FormData !== "undefined" && FormData) || FormDataP;
|
|
302
|
+
|
|
303
|
+
exports.FormData = FormDataE;
|
|
304
|
+
exports.FormDataP = FormDataP;
|
|
305
|
+
exports.FormData_toBlob = FormData_toBlob;
|
|
306
|
+
exports.createFormDataFromBinaryText = createFormDataFromBinaryText;
|
|
307
|
+
exports.extractBoundary = extractBoundary;
|
|
308
|
+
exports.isFormData = isFormData;
|
|
@@ -0,0 +1,235 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var utils = require('../utils.js');
|
|
4
|
+
|
|
5
|
+
class URLSearchParamsP {
|
|
6
|
+
constructor(init) {
|
|
7
|
+
utils.setState(this, "__URLSearchParams__", new URLSearchParamsState());
|
|
8
|
+
if (init !== undefined) {
|
|
9
|
+
if (isURLSearchParams(init)) {
|
|
10
|
+
init.forEach((value, name) => { this.append(name, value); }, this);
|
|
11
|
+
}
|
|
12
|
+
else if (init && typeof init === "object") {
|
|
13
|
+
if (utils.isSequence(init)) {
|
|
14
|
+
let _init = Array.isArray(init) ? init : Array.from(init);
|
|
15
|
+
for (let i = 0; i < _init.length; ++i) {
|
|
16
|
+
let item = _init[i];
|
|
17
|
+
if (utils.isSequence(item)) {
|
|
18
|
+
let pair = Array.isArray(item) ? item : Array.from(item);
|
|
19
|
+
if (pair.length === 2) {
|
|
20
|
+
this.append(pair[0], pair[1]);
|
|
21
|
+
}
|
|
22
|
+
else {
|
|
23
|
+
throw new TypeError("Failed to construct 'URLSearchParams': Sequence initializer must only contain pair elements");
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
else {
|
|
27
|
+
throw new TypeError("Failed to construct 'URLSearchParams': The provided value cannot be converted to a sequence.");
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
else {
|
|
32
|
+
Object.getOwnPropertyNames(init).forEach(name => { this.append(name, init[name]); }, this);
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
else {
|
|
36
|
+
let _init = "" + init;
|
|
37
|
+
if (_init.indexOf("?") === 0) {
|
|
38
|
+
_init = _init.slice(1);
|
|
39
|
+
}
|
|
40
|
+
let pairs = _init.split("&");
|
|
41
|
+
for (let i = 0; i < pairs.length; ++i) {
|
|
42
|
+
let pair = pairs[i], separatorIndex = pair.indexOf("=");
|
|
43
|
+
if (separatorIndex > -1) {
|
|
44
|
+
this.append(decode(pair.slice(0, separatorIndex)), decode(pair.slice(separatorIndex + 1)));
|
|
45
|
+
}
|
|
46
|
+
else {
|
|
47
|
+
if (pair) {
|
|
48
|
+
this.append(decode(pair), "");
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
get size() { return state(this).array.length; }
|
|
56
|
+
append(name, value) {
|
|
57
|
+
checkArgsFn(arguments.length, 2, "append");
|
|
58
|
+
state(this).array.push(["" + name, normalizeValue(value)]);
|
|
59
|
+
}
|
|
60
|
+
delete(name, value) {
|
|
61
|
+
checkArgsFn(arguments.length, 1, "delete");
|
|
62
|
+
let _name = "" + name;
|
|
63
|
+
let index = -1;
|
|
64
|
+
let array = state(this).array;
|
|
65
|
+
let result = [];
|
|
66
|
+
for (let i = 0; i < array.length; ++i) {
|
|
67
|
+
let item = array[i];
|
|
68
|
+
if (item[0] === _name) {
|
|
69
|
+
if (arguments.length !== 1 && item[1] !== normalizeValue(value)) {
|
|
70
|
+
result.push(item);
|
|
71
|
+
}
|
|
72
|
+
index = i;
|
|
73
|
+
continue;
|
|
74
|
+
}
|
|
75
|
+
result.push(item);
|
|
76
|
+
}
|
|
77
|
+
if (index > -1) {
|
|
78
|
+
state(this).array = result;
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
get(name) {
|
|
82
|
+
checkArgsFn(arguments.length, 1, "get");
|
|
83
|
+
let _name = "" + name;
|
|
84
|
+
let array = state(this).array;
|
|
85
|
+
for (let i = 0; i < array.length; ++i) {
|
|
86
|
+
let item = array[i];
|
|
87
|
+
if (item[0] === _name) {
|
|
88
|
+
return item[1];
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
return null;
|
|
92
|
+
}
|
|
93
|
+
getAll(name) {
|
|
94
|
+
checkArgsFn(arguments.length, 1, "getAll");
|
|
95
|
+
let _name = "" + name;
|
|
96
|
+
let array = state(this).array;
|
|
97
|
+
let result = [];
|
|
98
|
+
for (let i = 0; i < array.length; ++i) {
|
|
99
|
+
let item = array[i];
|
|
100
|
+
if (item[0] === _name) {
|
|
101
|
+
result.push(item[1]);
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
return result;
|
|
105
|
+
}
|
|
106
|
+
has(name, value) {
|
|
107
|
+
checkArgsFn(arguments.length, 1, "has");
|
|
108
|
+
let _name = "" + name;
|
|
109
|
+
let array = state(this).array;
|
|
110
|
+
for (let i = 0; i < array.length; ++i) {
|
|
111
|
+
let item = array[i];
|
|
112
|
+
if (item[0] === _name) {
|
|
113
|
+
if (arguments.length === 1) {
|
|
114
|
+
return true;
|
|
115
|
+
}
|
|
116
|
+
else {
|
|
117
|
+
if (item[1] === normalizeValue(value)) {
|
|
118
|
+
return true;
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
return false;
|
|
124
|
+
}
|
|
125
|
+
set(name, value) {
|
|
126
|
+
checkArgsFn(arguments.length, 2, "set");
|
|
127
|
+
let _name = "" + name;
|
|
128
|
+
let _value = normalizeValue(value);
|
|
129
|
+
let index = -1;
|
|
130
|
+
let array = state(this).array;
|
|
131
|
+
let result = [];
|
|
132
|
+
for (let i = 0; i < array.length; ++i) {
|
|
133
|
+
let item = array[i];
|
|
134
|
+
if (item[0] === _name) {
|
|
135
|
+
if (index === -1) {
|
|
136
|
+
index = i;
|
|
137
|
+
result.push([_name, _value]);
|
|
138
|
+
}
|
|
139
|
+
continue;
|
|
140
|
+
}
|
|
141
|
+
result.push(item);
|
|
142
|
+
}
|
|
143
|
+
if (index === -1) {
|
|
144
|
+
result.push([_name, _value]);
|
|
145
|
+
}
|
|
146
|
+
state(this).array = result;
|
|
147
|
+
}
|
|
148
|
+
sort() {
|
|
149
|
+
state(this).array.sort((a, b) => a[0] < b[0] ? -1 : a[0] > b[0] ? 1 : 0);
|
|
150
|
+
}
|
|
151
|
+
forEach(callbackfn, thisArg) {
|
|
152
|
+
checkArgsFn(arguments.length, 1, "forEach");
|
|
153
|
+
if (typeof callbackfn !== "function") {
|
|
154
|
+
throw new TypeError("Failed to execute 'forEach' on 'URLSearchParams': parameter 1 is not of type 'Function'.");
|
|
155
|
+
}
|
|
156
|
+
let array = state(this).array;
|
|
157
|
+
for (let i = 0; i < array.length; ++i) {
|
|
158
|
+
let item = array[i];
|
|
159
|
+
callbackfn.call(thisArg, item[1], item[0], this);
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
entries() {
|
|
163
|
+
return state(this).array.map(x => [x[0], x[1]]).values();
|
|
164
|
+
}
|
|
165
|
+
keys() {
|
|
166
|
+
return state(this).array.map(x => x[0]).values();
|
|
167
|
+
}
|
|
168
|
+
values() {
|
|
169
|
+
return state(this).array.map(x => x[1]).values();
|
|
170
|
+
}
|
|
171
|
+
// @ts-ignore
|
|
172
|
+
/** @internal */ [utils._Symbol.iterator]() {
|
|
173
|
+
return this.entries();
|
|
174
|
+
}
|
|
175
|
+
toString() {
|
|
176
|
+
let array = state(this).array;
|
|
177
|
+
let result = [];
|
|
178
|
+
for (let i = 0; i < array.length; ++i) {
|
|
179
|
+
let item = array[i];
|
|
180
|
+
result.push(encode(item[0]) + "=" + encode(item[1]));
|
|
181
|
+
}
|
|
182
|
+
return result.join("&");
|
|
183
|
+
}
|
|
184
|
+
/** @internal */ get [utils._Symbol.toStringTag]() { return "URLSearchParams"; }
|
|
185
|
+
/** @internal */ get __MPHTTPX__() { return { chain: ["URLSearchParams"] }; }
|
|
186
|
+
}
|
|
187
|
+
/** @internal */
|
|
188
|
+
class URLSearchParamsState {
|
|
189
|
+
constructor() {
|
|
190
|
+
this.array = [];
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
function state(target) {
|
|
194
|
+
return target.__URLSearchParams__;
|
|
195
|
+
}
|
|
196
|
+
function checkArgsFn(actual, expect, funcName) {
|
|
197
|
+
utils.checkArgsLength(actual, expect, "URLSearchParams", funcName);
|
|
198
|
+
}
|
|
199
|
+
function normalizeValue(value) {
|
|
200
|
+
return typeof value === "string" ? value : (value !== null && value !== undefined && typeof value.toString === "function"
|
|
201
|
+
? value.toString()
|
|
202
|
+
: JSON.stringify(value));
|
|
203
|
+
}
|
|
204
|
+
function encode(str) {
|
|
205
|
+
const replace = {
|
|
206
|
+
"!": "%21",
|
|
207
|
+
"'": "%27",
|
|
208
|
+
"(": "%28",
|
|
209
|
+
")": "%29",
|
|
210
|
+
"~": "%7E",
|
|
211
|
+
"%20": "+",
|
|
212
|
+
"%00": "\x00",
|
|
213
|
+
};
|
|
214
|
+
return encodeURIComponent(str).replace(/[!'\(\)~]|%20|%00/g, match => replace[match]);
|
|
215
|
+
}
|
|
216
|
+
function decode(str) {
|
|
217
|
+
return str
|
|
218
|
+
.replace(/[ +]/g, "%20")
|
|
219
|
+
.replace(/(%[a-f0-9]{2})+/ig, match => decodeURIComponent(match));
|
|
220
|
+
}
|
|
221
|
+
function isURLSearchParams(value) {
|
|
222
|
+
return utils.isPolyfillType("URLSearchParams", value) || isGlobalURLSearchParams(value);
|
|
223
|
+
}
|
|
224
|
+
function isGlobalURLSearchParams(value) {
|
|
225
|
+
return utils.isObjectType("URLSearchParams", value) || (!!value &&
|
|
226
|
+
typeof value === "object" &&
|
|
227
|
+
typeof URLSearchParams !== "undefined" &&
|
|
228
|
+
URLSearchParams &&
|
|
229
|
+
URLSearchParams.prototype.isPrototypeOf(value));
|
|
230
|
+
}
|
|
231
|
+
const URLSearchParamsE = (typeof URLSearchParams !== "undefined" && URLSearchParams) || URLSearchParamsP;
|
|
232
|
+
|
|
233
|
+
exports.URLSearchParams = URLSearchParamsE;
|
|
234
|
+
exports.URLSearchParamsP = URLSearchParamsP;
|
|
235
|
+
exports.isURLSearchParams = isURLSearchParams;
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var TextEncoderP = require('./encoding/TextEncoderP.js');
|
|
4
|
+
var TextDecoderP = require('./encoding/TextDecoderP.js');
|
|
5
|
+
var EventTargetP = require('./event-system/EventTargetP.js');
|
|
6
|
+
var EventP = require('./event-system/EventP.js');
|
|
7
|
+
var CustomEventP = require('./event-system/CustomEventP.js');
|
|
8
|
+
var AbortControllerP = require('./event-system/AbortControllerP.js');
|
|
9
|
+
var AbortSignalP = require('./event-system/AbortSignalP.js');
|
|
10
|
+
var BlobP = require('./file-system/BlobP.js');
|
|
11
|
+
var FileP = require('./file-system/FileP.js');
|
|
12
|
+
var FileReaderP = require('./file-system/FileReaderP.js');
|
|
13
|
+
var URLSearchParamsP = require('./network/URLSearchParamsP.js');
|
|
14
|
+
var FormDataP = require('./network/FormDataP.js');
|
|
15
|
+
var fetchP = require('./fetch-api/fetchP.js');
|
|
16
|
+
var HeadersP = require('./fetch-api/HeadersP.js');
|
|
17
|
+
var RequestP = require('./fetch-api/RequestP.js');
|
|
18
|
+
var ResponseP = require('./fetch-api/ResponseP.js');
|
|
19
|
+
var fixes = require('./fixes.js');
|
|
20
|
+
|
|
21
|
+
/* eslint-disable no-prototype-builtins */
|
|
22
|
+
const g = (typeof globalThis !== "undefined" && globalThis) ||
|
|
23
|
+
(typeof self !== "undefined" && self) ||
|
|
24
|
+
// @ts-ignore eslint-disable-next-line no-undef
|
|
25
|
+
(typeof global !== "undefined" && global) ||
|
|
26
|
+
{};
|
|
27
|
+
if (typeof XMLHttpRequest !== "undefined" && XMLHttpRequest) {
|
|
28
|
+
if (!g.Blob || !g.FormData) {
|
|
29
|
+
fixes.fixXMLHttpRequest();
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
if (typeof WebSocket !== "undefined" && WebSocket) {
|
|
33
|
+
if (!g.Blob) {
|
|
34
|
+
fixes.fixWebSocket();
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
if (!g.TextEncoder) {
|
|
38
|
+
g.TextEncoder = TextEncoderP.TextEncoderP;
|
|
39
|
+
}
|
|
40
|
+
if (!g.TextDecoder) {
|
|
41
|
+
g.TextDecoder = TextDecoderP.TextDecoderP;
|
|
42
|
+
}
|
|
43
|
+
if (!g.EventTarget) {
|
|
44
|
+
g.EventTarget = EventTargetP.EventTargetP;
|
|
45
|
+
if (!g.Event) {
|
|
46
|
+
g.Event = EventP.EventP;
|
|
47
|
+
}
|
|
48
|
+
if (!g.CustomEvent) {
|
|
49
|
+
g.CustomEvent = CustomEventP.CustomEventP;
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
if (!g.AbortController) {
|
|
53
|
+
g.AbortController = AbortControllerP.AbortControllerP;
|
|
54
|
+
}
|
|
55
|
+
if (!g.AbortSignal) {
|
|
56
|
+
g.AbortSignal = AbortSignalP.AbortSignalP;
|
|
57
|
+
}
|
|
58
|
+
if (!g.FileReader) {
|
|
59
|
+
g.FileReader = FileReaderP.FileReaderP;
|
|
60
|
+
if (!g.Blob) {
|
|
61
|
+
g.Blob = BlobP.BlobP;
|
|
62
|
+
}
|
|
63
|
+
if (!g.File) {
|
|
64
|
+
g.File = FileP.FileP;
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
if (!g.URLSearchParams) {
|
|
68
|
+
g.URLSearchParams = URLSearchParamsP.URLSearchParamsP;
|
|
69
|
+
}
|
|
70
|
+
if (!g.FormData) {
|
|
71
|
+
g.FormData = FormDataP.FormDataP;
|
|
72
|
+
}
|
|
73
|
+
if (!g.fetch) {
|
|
74
|
+
g.fetch = fetchP.fetchP;
|
|
75
|
+
if (!g.Headers) {
|
|
76
|
+
g.Headers = HeadersP.HeadersP;
|
|
77
|
+
}
|
|
78
|
+
if (!g.Request) {
|
|
79
|
+
g.Request = RequestP.RequestP;
|
|
80
|
+
}
|
|
81
|
+
if (!g.Response) {
|
|
82
|
+
g.Response = ResponseP.ResponseP;
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
else {
|
|
86
|
+
g.fetch = fixes.fixFetch();
|
|
87
|
+
}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
const _Symbol = {
|
|
4
|
+
iterator: ((typeof Symbol === "function") && (Symbol.iterator || "Symbol(Symbol.iterator)")),
|
|
5
|
+
toStringTag: ((typeof Symbol === "function") && (Symbol.toStringTag || "Symbol(Symbol.toStringTag)")),
|
|
6
|
+
};
|
|
7
|
+
class DOMExceptionP extends Error {
|
|
8
|
+
constructor(message, name) {
|
|
9
|
+
super(message);
|
|
10
|
+
if (name !== undefined)
|
|
11
|
+
this.name = "" + name;
|
|
12
|
+
}
|
|
13
|
+
/** @internal */ get [_Symbol.toStringTag]() { return "DOMException"; }
|
|
14
|
+
/** @internal */ get __MPHTTPX__() { return { chain: ["DOMException"] }; }
|
|
15
|
+
}
|
|
16
|
+
const DOMExceptionE = (() => { try {
|
|
17
|
+
new DOMException();
|
|
18
|
+
return true;
|
|
19
|
+
}
|
|
20
|
+
catch (e) {
|
|
21
|
+
return false;
|
|
22
|
+
} })() ? DOMException : DOMExceptionP;
|
|
23
|
+
function className(object) {
|
|
24
|
+
try {
|
|
25
|
+
return object.__MPHTTPX__.chain[0];
|
|
26
|
+
}
|
|
27
|
+
catch (e) {
|
|
28
|
+
return Object.prototype.toString.call(object).slice(8, -1);
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
function setState(target, name, value) {
|
|
32
|
+
Object.defineProperty(target, name, { value });
|
|
33
|
+
}
|
|
34
|
+
function isObjectType(name, value) {
|
|
35
|
+
return Object.prototype.toString.call(value) === `[object ${name}]`;
|
|
36
|
+
}
|
|
37
|
+
function isPolyfillType(name, value, strict = false) {
|
|
38
|
+
const field = "__MPHTTPX__";
|
|
39
|
+
return !!value
|
|
40
|
+
&& typeof value === "object"
|
|
41
|
+
&& field in value
|
|
42
|
+
&& !!value[field]
|
|
43
|
+
&& typeof value[field] === "object"
|
|
44
|
+
&& "chain" in value[field]
|
|
45
|
+
&& Array.isArray(value[field].chain)
|
|
46
|
+
&& ((index) => strict ? index === 0 : index > -1)(value[field].chain.indexOf(name));
|
|
47
|
+
}
|
|
48
|
+
function isSequence(value) {
|
|
49
|
+
return Array.isArray(value) || (!!value
|
|
50
|
+
&& typeof value === "object"
|
|
51
|
+
&& typeof Symbol === "function"
|
|
52
|
+
&& Symbol.iterator
|
|
53
|
+
&& Symbol.iterator in value
|
|
54
|
+
&& typeof value[Symbol.iterator] === "function");
|
|
55
|
+
}
|
|
56
|
+
function checkArgsLength(actual, expect, className, funcName) {
|
|
57
|
+
if (actual < expect) {
|
|
58
|
+
throw new TypeError(`Failed to ${funcName ? ("execute '" + funcName + "' on") : "construct"} '${className}': ${expect} argument${expect > 1 ? "s" : ""} required, but only ${actual} present.`);
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
exports.DOMException = DOMExceptionE;
|
|
63
|
+
exports.DOMExceptionP = DOMExceptionP;
|
|
64
|
+
exports._Symbol = _Symbol;
|
|
65
|
+
exports.checkArgsLength = checkArgsLength;
|
|
66
|
+
exports.className = className;
|
|
67
|
+
exports.isObjectType = isObjectType;
|
|
68
|
+
exports.isPolyfillType = isPolyfillType;
|
|
69
|
+
exports.isSequence = isSequence;
|
|
70
|
+
exports.setState = setState;
|