(
function (f){
if (
typeof exports===
"object" &&
typeof module!==
"undefined" ){module.expor
ts=f()}else if (typeof define==="function" &&define.amd){define([],f)}else {var g;if (typeof window!=="undefined" ){g=window}else if (typeof global!=="undefined" ){g=global}else if (typeof self!=="undefined" ){g=self}else {g=this }g.whatwgURL = f()}})(function (){var define,module,exports;return (function (){function r(e,n,t){function o(i,f){if (!n[i]){if (!e[i]){var c="function" ==typeof require&&require;if (!f&&c)return c(i,!0);if (u)return u(i,!0);var a=new Error("Cannot find module '" +i+"'" );throw a.code="MODULE_NOT_FOUND" ,a}var p=n[i]={exports:{}};e[i][0].call(p.exports,function (r){var n=e[i][1][r];return o(n||r)},p,p.exports,r,e,n,t)}return n[i].exports}for (var u="function" ==typeof require&&require,i=0;i<t.length;i++)o(t[i]);return o}return r})()({1:[function (require,module,exports){
"use strict" ;
const usm = require("./url-state-machine" );
const urlencoded = require("./urlencoded" );
const URLSearchParams = require("./URLSearchParams" );
exports.implementation = class URLImpl {
constructor(constructorArgs) {
const url = constructorArgs[0];
const base = constructorArgs[1];
let parsedBase = null ;
if (base !== undefined) {
parsedBase = usm.basicURLParse(base);
if (parsedBase === null ) {
throw new TypeError(`Invalid base URL: ${base}`);
}
}
const parsedURL = usm.basicURLParse(url, { baseURL: parsedBase });
if (parsedURL === null ) {
throw new TypeError(`Invalid URL: ${url}`);
}
const query = parsedURL.query !== null ? parsedURL.query : "" ;
this ._url = parsedURL;
// We cannot invoke the "new URLSearchParams object" algorithm without going through the constructor, which strips
// question mark by default. Therefore the doNotStripQMark hack is used.
this ._query = URLSearchParams.createImpl([query], { doNotStripQMark: true });
this ._query._url = this ;
}
get href() {
return usm.serializeURL(this ._url);
}
set href(v) {
const parsedURL = usm.basicURLParse(v);
if (parsedURL === null ) {
throw new TypeError(`Invalid URL: ${v}`);
}
this ._url = parsedURL;
this ._query._list.splice(0);
const { query } = parsedURL;
if (query !== null ) {
this ._query._list = urlencoded.parseUrlencoded(query);
}
}
get origin() {
return usm.serializeURLOrigin(this ._url);
}
get protocol() {
return this ._url.scheme + ":" ;
}
set protocol(v) {
usm.basicURLParse(v + ":" , { url: this ._url, stateOverride: "scheme start" });
}
get username() {
return this ._url.username;
}
set username(v) {
if (usm.cannotHaveAUsernamePasswordPort(this ._url)) {
return ;
}
usm.setTheUsername(this ._url, v);
}
get password() {
return this ._url.password;
}
set password(v) {
if (usm.cannotHaveAUsernamePasswordPort(this ._url)) {
return ;
}
usm.setThePassword(this ._url, v);
}
get host() {
const url = this ._url;
if (url.host === null ) {
return "" ;
}
if (url.port === null ) {
return usm.serializeHost(url.host);
}
return usm.serializeHost(url.host) + ":" + usm.serializeInteger(url.port);
}
set host(v) {
if (this ._url.cannotBeABaseURL) {
return ;
}
usm.basicURLParse(v, { url: this ._url, stateOverride: "host" });
}
get hostname() {
if (this ._url.host === null ) {
return "" ;
}
return usm.serializeHost(this ._url.host);
}
set hostname(v) {
if (this ._url.cannotBeABaseURL) {
return ;
}
usm.basicURLParse(v, { url: this ._url, stateOverride: "hostname" });
}
get port() {
if (this ._url.port === null ) {
return "" ;
}
return usm.serializeInteger(this ._url.port);
}
set port(v) {
if (usm.cannotHaveAUsernamePasswordPort(this ._url)) {
return ;
}
if (v === "" ) {
this ._url.port = null ;
} else {
usm.basicURLParse(v, { url: this ._url, stateOverride: "port" });
}
}
get pathname() {
if (this ._url.cannotBeABaseURL) {
return this ._url.path[0];
}
if (this ._url.path.length === 0) {
return "" ;
}
return "/" + this ._url.path.join("/" );
}
set pathname(v) {
if (this ._url.cannotBeABaseURL) {
return ;
}
this ._url.path = [];
usm.basicURLParse(v, { url: this ._url, stateOverride: "path start" });
}
get search() {
if (this ._url.query === null || this ._url.query === "" ) {
return "" ;
}
return "?" + this ._url.query;
}
set search(v) {
const url = this ._url;
if (v === "" ) {
url.query = null ;
this ._query._list = [];
return ;
}
const input = v[0] === "?" ? v.substring(1) : v;
url.query = "" ;
usm.basicURLParse(input, { url, stateOverride: "query" });
this ._query._list = urlencoded.parseUrlencoded(input);
}
get searchParams() {
return this ._query;
}
get hash() {
if (this ._url.fragment === null || this ._url.fragment === "" ) {
return "" ;
}
return "#" + this ._url.fragment;
}
set hash(v) {
if (v === "" ) {
this ._url.fragment = null ;
return ;
}
const input = v[0] === "#" ? v.substring(1) : v;
this ._url.fragment = "" ;
usm.basicURLParse(input, { url: this ._url, stateOverride: "fragment" });
}
toJSON() {
return this .href;
}
};
},{"./URLSearchParams" :4,"./url-state-machine" :7,"./urlencoded" :8}],2:[function (require,module,exports){
"use strict" ;
const conversions = require("webidl-conversions" );
const utils = require("./utils.js" );
const impl = utils.implSymbol;
class URL {
constructor(url) {
if (arguments.length < 1) {
throw new TypeError("Failed to construct 'URL': 1 argument required, but only " + arguments.length + " present." );
}
const args = [];
{
let curArg = arguments[0];
curArg = conversions["USVString" ](curArg, { context: "Failed to construct 'URL': parameter 1" });
args.push(curArg);
}
{
let curArg = arguments[1];
if (curArg !== undefined) {
curArg = conversions["USVString" ](curArg, { context: "Failed to construct 'URL': parameter 2" });
}
args.push(curArg);
}
return iface.setup(Object.create(new .target.prototype), args);
}
toJSON() {
if (!this || !module.exports.is(this )) {
throw new TypeError("Illegal invocation" );
}
return this [impl].toJSON();
}
get href() {
if (!this || !module.exports.is(this )) {
throw new TypeError("Illegal invocation" );
}
return this [impl]["href" ];
}
set href(V) {
if (!this || !module.exports.is(this )) {
throw new TypeError("Illegal invocation" );
}
V = conversions["USVString" ](V, { context: "Failed to set the 'href' property on 'URL': The provided value" });
this [impl]["href" ] = V;
}
toString() {
if (!this || !module.exports.is(this )) {
throw new TypeError("Illegal invocation" );
}
return this [impl]["href" ];
}
get origin() {
if (!this || !module.exports.is(this )) {
throw new TypeError("Illegal invocation" );
}
return this [impl]["origin" ];
}
get protocol() {
if (!this || !module.exports.is(this )) {
throw new TypeError("Illegal invocation" );
}
return this [impl]["protocol" ];
}
set protocol(V) {
if (!this || !module.exports.is(this )) {
throw new TypeError("Illegal invocation" );
}
V = conversions["USVString" ](V, { context: "Failed to set the 'protocol' property on 'URL': The provided value" });
this [impl]["protocol" ] = V;
}
get username() {
if (!this || !module.exports.is(this )) {
throw new TypeError("Illegal invocation" );
}
return this [impl]["username" ];
}
set username(V) {
if (!this || !module.exports.is(this )) {
throw new TypeError("Illegal invocation" );
}
V = conversions["USVString" ](V, { context: "Failed to set the 'username' property on 'URL': The provided value" });
this [impl]["username" ] = V;
}
get password() {
if (!this || !module.exports.is(this )) {
throw new TypeError("Illegal invocation" );
}
return this [impl]["password" ];
}
set password(V) {
if (!this || !module.exports.is(this )) {
throw new TypeError("Illegal invocation" );
}
V = conversions["USVString" ](V, { context: "Failed to set the 'password' property on 'URL': The provided value" });
this [impl]["password" ] = V;
}
get host() {
if (!this || !module.exports.is(this )) {
throw new TypeError("Illegal invocation" );
}
return this [impl]["host" ];
}
set host(V) {
if (!this || !module.exports.is(this )) {
throw new TypeError("Illegal invocation" );
}
V = conversions["USVString" ](V, { context: "Failed to set the 'host' property on 'URL': The provided value" });
this [impl]["host" ] = V;
}
get hostname() {
if (!this || !module.exports.is(this )) {
throw new TypeError("Illegal invocation" );
}
return this [impl]["hostname" ];
}
set hostname(V) {
if (!this || !module.exports.is(this )) {
throw new TypeError("Illegal invocation" );
}
V = conversions["USVString" ](V, { context: "Failed to set the 'hostname' property on 'URL': The provided value" });
this [impl]["hostname" ] = V;
}
get port() {
if (!this || !module.exports.is(this )) {
throw new TypeError("Illegal invocation" );
}
return this [impl]["port" ];
}
set port(V) {
if (!this || !module.exports.is(this )) {
throw new TypeError("Illegal invocation" );
}
V = conversions["USVString" ](V, { context: "Failed to set the 'port' property on 'URL': The provided value" });
this [impl]["port" ] = V;
}
get pathname() {
if (!this || !module.exports.is(this )) {
throw new TypeError("Illegal invocation" );
}
return this [impl]["pathname" ];
}
set pathname(V) {
if (!this || !module.exports.is(this )) {
throw new TypeError("Illegal invocation" );
}
V = conversions["USVString" ](V, { context: "Failed to set the 'pathname' property on 'URL': The provided value" });
this [impl]["pathname" ] = V;
}
get search() {
if (!this || !module.exports.is(this )) {
throw new TypeError("Illegal invocation" );
}
return this [impl]["search" ];
}
set search(V) {
if (!this || !module.exports.is(this )) {
throw new TypeError("Illegal invocation" );
}
V = conversions["USVString" ](V, { context: "Failed to set the 'search' property on 'URL': The provided value" });
this [impl]["search" ] = V;
}
get searchParams() {
if (!this || !module.exports.is(this )) {
throw new TypeError("Illegal invocation" );
}
return utils.getSameObject(this , "searchParams" , () => {
return utils.tryWrapperForImpl(this [impl]["searchParams" ]);
});
}
get hash() {
if (!this || !module.exports.is(this )) {
throw new TypeError("Illegal invocation" );
}
return this [impl]["hash" ];
}
set hash(V) {
if (!this || !module.exports.is(this )) {
throw new TypeError("Illegal invocation" );
}
V = conversions["USVString" ](V, { context: "Failed to set the 'hash' property on 'URL': The provided value" });
this [impl]["hash" ] = V;
}
}
Object.defineProperties(URL.prototype, {
toJSON: { enumerable: true },
href: { enumerable: true },
toString: { enumerable: true },
origin: { enumerable: true },
protocol: { enumerable: true },
username: { enumerable: true },
password: { enumerable: true },
host: { enumerable: true },
hostname: { enumerable: true },
port: { enumerable: true },
pathname: { enumerable: true },
search: { enumerable: true },
searchParams: { enumerable: true },
hash: { enumerable: true },
[Symbol.toStringTag]: { value: "URL" , configurable: true }
});
const iface = {
// When an interface-module that implements this interface as a mixin is loaded, it will append its own `.is()`
// method into this array. It allows objects that directly implements *those* interfaces to be recognized as
// implementing this mixin interface.
_mixedIntoPredicates: [],
is(obj) {
if (obj) {
if (utils.hasOwn(obj, impl) && obj[impl] instanceof Impl.implementation) {
return true ;
}
for (const isMixedInto of module.exports._mixedIntoPredicates) {
if (isMixedInto(obj)) {
return true ;
}
}
}
return false ;
},
isImpl(obj) {
if (obj) {
if (obj instanceof Impl.implementation) {
return true ;
}
const wrapper = utils.wrapperForImpl(obj);
for (const isMixedInto of module.exports._mixedIntoPredicates) {
if (isMixedInto(wrapper)) {
return true ;
}
}
}
return false ;
},
convert(obj, { context = "The provided value" } = {}) {
if (module.exports.is(obj)) {
return utils.implForWrapper(obj);
}
throw new TypeError(`${context} is not of type 'URL' .`);
},
create(constructorArgs, privateData) {
let obj = Object.create(URL.prototype);
obj = this .setup(obj, constructorArgs, privateData);
return obj;
},
createImpl(constructorArgs, privateData) {
let obj = Object.create(URL.prototype);
obj = this .setup(obj, constructorArgs, privateData);
return utils.implForWrapper(obj);
},
_internalSetup(obj) {},
setup(obj, constructorArgs, privateData) {
if (!privateData) privateData = {};
privateData.wrapper = obj;
this ._internalSetup(obj);
Object.defineProperty(obj, impl, {
value: new Impl.implementation(constructorArgs, privateData),
configurable: true
});
obj[impl][utils.wrapperSymbol] = obj;
if (Impl.init) {
Impl.init(obj[impl], privateData);
}
return obj;
},
interface : URL,
expose: {
Window: { URL },
Worker: { URL }
}
}; // iface
module.exports = iface;
const Impl = require("./URL-impl.js" );
},{"./URL-impl.js" :1,"./utils.js" :9,"webidl-conversions" :18}],3:[function (require,module,exports){
"use strict" ;
const stableSortBy = require("lodash.sortby" );
const urlencoded = require("./urlencoded" );
exports.implementation = class URLSearchParamsImpl {
constructor(constructorArgs, { doNotStripQMark = false }) {
let init = constructorArgs[0];
this ._list = [];
this ._url = null ;
if (!doNotStripQMark && typeof init === "string" && init[0] === "?" ) {
init = init.slice(1);
}
if (Array.isArray(init)) {
for (const pair of init) {
if (pair.length !== 2) {
throw new TypeError("Failed to construct 'URLSearchParams': parameter 1 sequence's element does not " +
"contain exactly two elements." );
}
this ._list.push([pair[0], pair[1]]);
}
} else if (typeof init === "object" && Object.getPrototypeOf(init) === null ) {
for (const name of Object.keys(init)) {
const value = init[name];
this ._list.push([name, value]);
}
} else {
this ._list = urlencoded.parseUrlencoded(init);
}
}
_updateSteps() {
if (this ._url !== null ) {
let query = urlencoded.serializeUrlencoded(this ._list);
if (query === "" ) {
query = null ;
}
this ._url._url.query = query;
}
}
append(name, value) {
this ._list.push([name, value]);
this ._updateSteps();
}
delete (name) {
let i = 0;
while (i < this ._list.length) {
if (this ._list[i][0] === name) {
this ._list.splice(i, 1);
} else {
i++;
}
}
this ._updateSteps();
}
get(name) {
for (const tuple of this ._list) {
if (tuple[0] === name) {
return tuple[1];
}
}
return null ;
}
getAll(name) {
const output = [];
for (const tuple of this ._list) {
if (tuple[0] === name) {
output.push(tuple[1]);
}
}
return output;
}
has(name) {
for (const tuple of this ._list) {
if (tuple[0] === name) {
return true ;
}
}
return false ;
}
set(name, value) {
let found = false ;
let i = 0;
while (i < this ._list.length) {
if (this ._list[i][0] === name) {
if (found) {
this ._list.splice(i, 1);
} else {
found = true ;
this ._list[i][1] = value;
i++;
}
} else {
i++;
}
}
if (!found) {
this ._list.push([name, value]);
}
this ._updateSteps();
}
sort() {
this ._list = stableSortBy(this ._list, [0]);
this ._updateSteps();
}
[Symbol.iterator]() {
return this ._list[Symbol.iterator]();
}
toString() {
return urlencoded.serializeUrlencoded(this ._list);
}
};
},{"./urlencoded" :8,"lodash.sortby" :14}],4:[function (require,module,exports){
"use strict" ;
const conversions = require("webidl-conversions" );
const utils = require("./utils.js" );
const impl = utils.implSymbol;
const IteratorPrototype = Object.create(utils.IteratorPrototype, {
next: {
value: function next() {
const internal = this [utils.iterInternalSymbol];
const { target, kind, index } = internal;
const values = Array.from(target[impl]);
const len = values.length;
if (index >= len) {
return { value: undefined, done: true };
}
const pair = values[index];
internal.index = index + 1;
const [key, value] = pair.map(utils.tryWrapperForImpl);
let result;
switch (kind) {
case "key" :
result = key;
break ;
case "value" :
result = value;
break ;
case "key+value" :
result = [key, value];
break ;
}
return { value: result, done: false };
},
writable: true ,
enumerable: true ,
configurable: true
},
[Symbol.toStringTag]: {
value: "URLSearchParams Iterator" ,
configurable: true
}
});
class URLSearchParams {
constructor() {
const args = [];
{
let curArg = arguments[0];
if (curArg !== undefined) {
if (utils.isObject(curArg)) {
if (curArg[Symbol.iterator] !== undefined) {
if (!utils.isObject(curArg)) {
throw new TypeError(
"Failed to construct 'URLSearchParams': parameter 1" + " sequence" + " is not an iterable object."
);
} else {
const V = [];
const tmp = curArg;
for (let nextItem of tmp) {
if (!utils.isObject(nextItem)) {
throw new TypeError(
"Failed to construct 'URLSearchParams': parameter 1" +
" sequence" +
"'s element" +
" is not an iterable object."
);
} else {
const V = [];
const tmp = nextItem;
for (let nextItem of tmp) {
nextItem = conversions["USVString" ](nextItem, {
context:
"Failed to construct 'URLSearchParams': parameter 1" + " sequence" + "'s element" + "'s element"
});
V.push(nextItem);
}
nextItem = V;
}
V.push(nextItem);
}
curArg = V;
}
} else {
if (!utils.isObject(curArg)) {
throw new TypeError(
"Failed to construct 'URLSearchParams': parameter 1" + " record" + " is not an object."
);
} else {
const result = Object.create(null );
for (const key of Reflect.ownKeys(curArg)) {
const desc = Object.getOwnPropertyDescriptor(curArg, key);
if (desc && desc.enumerable) {
let typedKey = key;
typedKey = conversions["USVString" ](typedKey, {
context: "Failed to construct 'URLSearchParams': parameter 1" + " record" + "'s key"
});
let typedValue = curArg[key];
typedValue = conversions["USVString" ](typedValue, {
context: "Failed to construct 'URLSearchParams': parameter 1" + " record" + "'s value"
});
result[typedKey] = typedValue;
}
}
curArg = result;
}
}
} else {
curArg = conversions["USVString" ](curArg, { context: "Failed to construct 'URLSearchParams': parameter 1" });
}
} else {
curArg = "" ;
}
args.push(curArg);
}
return iface.setup(Object.create(new .target.prototype), args);
}
append(name, value) {
if (!this || !module.exports.is(this )) {
throw new TypeError("Illegal invocation" );
}
if (arguments.length < 2) {
throw new TypeError(
"Failed to execute 'append' on 'URLSearchParams': 2 arguments required, but only " +
arguments.length +
" present."
);
}
const args = [];
{
let curArg = arguments[0];
curArg = conversions["USVString" ](curArg, {
context: "Failed to execute 'append' on 'URLSearchParams': parameter 1"
});
args.push(curArg);
}
{
let curArg = arguments[1];
curArg = conversions["USVString" ](curArg, {
context: "Failed to execute 'append' on 'URLSearchParams': parameter 2"
});
args.push(curArg);
}
return this [impl].append(...args);
}
delete (name) {
if (!this || !module.exports.is(this )) {
throw new TypeError("Illegal invocation" );
}
if (arguments.length < 1) {
throw new TypeError(
"Failed to execute 'delete' on 'URLSearchParams': 1 argument required, but only " +
arguments.length +
" present."
);
}
const args = [];
{
let curArg = arguments[0];
curArg = conversions["USVString" ](curArg, {
context: "Failed to execute 'delete' on 'URLSearchParams': parameter 1"
});
args.push(curArg);
}
return this [impl].delete (...args);
}
get(name) {
if (!this || !module.exports.is(this )) {
throw new TypeError("Illegal invocation" );
}
if (arguments.length < 1) {
throw new TypeError(
"Failed to execute 'get' on 'URLSearchParams': 1 argument required, but only " + arguments.length + " present."
);
}
const args = [];
{
let curArg = arguments[0];
curArg = conversions["USVString" ](curArg, {
context: "Failed to execute 'get' on 'URLSearchParams': parameter 1"
});
args.push(curArg);
}
return this [impl].get(...args);
}
getAll(name) {
if (!this || !module.exports.is(this )) {
throw new TypeError("Illegal invocation" );
}
if (arguments.length < 1) {
throw new TypeError(
"Failed to execute 'getAll' on 'URLSearchParams': 1 argument required, but only " +
arguments.length +
" present."
);
}
const args = [];
{
let curArg = arguments[0];
curArg = conversions["USVString" ](curArg, {
context: "Failed to execute 'getAll' on 'URLSearchParams': parameter 1"
});
args.push(curArg);
}
return utils.tryWrapperForImpl(this [impl].getAll(...args));
}
has(name) {
if (!this || !module.exports.is(this )) {
throw new TypeError("Illegal invocation" );
}
if (arguments.length < 1) {
throw new TypeError(
"Failed to execute 'has' on 'URLSearchParams': 1 argument required, but only " + arguments.length + " present."
);
}
const args = [];
{
let curArg = arguments[0];
curArg = conversions["USVString" ](curArg, {
context: "Failed to execute 'has' on 'URLSearchParams': parameter 1"
});
args.push(curArg);
}
return this [impl].has(...args);
}
set(name, value) {
if (!this || !module.exports.is(this )) {
throw new TypeError("Illegal invocation" );
}
if (arguments.length < 2) {
throw new TypeError(
"Failed to execute 'set' on 'URLSearchParams': 2 arguments required, but only " + arguments.length + " present."
);
}
const args = [];
{
let curArg = arguments[0];
curArg = conversions["USVString" ](curArg, {
context: "Failed to execute 'set' on 'URLSearchParams': parameter 1"
});
args.push(curArg);
}
{
let curArg = arguments[1];
curArg = conversions["USVString" ](curArg, {
context: "Failed to execute 'set' on 'URLSearchParams': parameter 2"
});
args.push(curArg);
}
return this [impl].set(...args);
}
sort() {
if (!this || !module.exports.is(this )) {
throw new TypeError("Illegal invocation" );
}
return this [impl].sort();
}
toString() {
if (!this || !module.exports.is(this )) {
throw new TypeError("Illegal invocation" );
}
return this [impl].toString();
}
keys() {
if (!this || !module.exports.is(this )) {
throw new TypeError("Illegal invocation" );
}
return module.exports.createDefaultIterator(this , "key" );
}
values() {
if (!this || !module.exports.is(this )) {
throw new TypeError("Illegal invocation" );
}
return module.exports.createDefaultIterator(this , "value" );
}
entries() {
if (!this || !module.exports.is(this )) {
throw new TypeError("Illegal invocation" );
}
return module.exports.createDefaultIterator(this , "key+value" );
}
forEach(callback) {
if (!this || !module.exports.is(this )) {
throw new TypeError("Illegal invocation" );
}
if (arguments.length < 1) {
throw new TypeError("Failed to execute 'forEach' on 'iterable': 1 argument required, " + "but only 0 present." );
}
if (typeof callback !== "function" ) {
throw new TypeError(
"Failed to execute 'forEach' on 'iterable': The callback provided " + "as parameter 1 is not a function."
);
}
const thisArg = arguments[1];
let pairs = Array.from(this [impl]);
let i = 0;
while (i < pairs.length) {
const [key, value] = pairs[i].map(utils.tryWrapperForImpl);
callback.call(thisArg, value, key, this );
pairs = Array.from(this [impl]);
i++;
}
}
}
Object.defineProperties(URLSearchParams.prototype, {
append: { enumerable: true },
delete : { enumerable: true },
get: { enumerable: true },
getAll: { enumerable: true },
has: { enumerable: true },
set: { enumerable: true },
sort: { enumerable: true },
toString: { enumerable: true },
keys: { enumerable: true },
values: { enumerable: true },
entries: { enumerable: true },
forEach: { enumerable: true },
[Symbol.toStringTag]: { value: "URLSearchParams" , configurable: true },
[Symbol.iterator]: { value: URLSearchParams.prototype.entries, configurable: true , writable: true }
});
const iface = {
// When an interface-module that implements this interface as a mixin is loaded, it will append its own `.is()`
// method into this array. It allows objects that directly implements *those* interfaces to be recognized as
// implementing this mixin interface.
_mixedIntoPredicates: [],
is(obj) {
if (obj) {
if (utils.hasOwn(obj, impl) && obj[impl] instanceof Impl.implementation) {
return true ;
}
for (const isMixedInto of module.exports._mixedIntoPredicates) {
if (isMixedInto(obj)) {
return true ;
}
}
}
return false ;
},
isImpl(obj) {
if (obj) {
if (obj instanceof Impl.implementation) {
return true ;
}
const wrapper = utils.wrapperForImpl(obj);
for (const isMixedInto of module.exports._mixedIntoPredicates) {
if (isMixedInto(wrapper)) {
return true ;
}
}
}
return false ;
},
convert(obj, { context = "The provided value" } = {}) {
if (module.exports.is(obj)) {
return utils.implForWrapper(obj);
}
throw new TypeError(`${context} is not of type 'URLSearchParams' .`);
},
createDefaultIterator(target, kind) {
const iterator = Object.create(IteratorPrototype);
Object.defineProperty(iterator, utils.iterInternalSymbol, {
value: { target, kind, index: 0 },
configurable: true
});
return iterator;
},
create(constructorArgs, privateData) {
let obj = Object.create(URLSearchParams.prototype);
obj = this .setup(obj, constructorArgs, privateData);
return obj;
},
createImpl(constructorArgs, privateData) {
let obj = Object.create(URLSearchParams.prototype);
obj = this .setup(obj, constructorArgs, privateData);
return utils.implForWrapper(obj);
},
_internalSetup(obj) {},
setup(obj, constructorArgs, privateData) {
if (!privateData) privateData = {};
privateData.wrapper = obj;
this ._internalSetup(obj);
Object.defineProperty(obj, impl, {
value: new Impl.implementation(constructorArgs, privateData),
configurable: true
});
obj[impl][utils.wrapperSymbol] = obj;
if (Impl.init) {
Impl.init(obj[impl], privateData);
}
return obj;
},
interface : URLSearchParams,
expose: {
Window: { URLSearchParams },
Worker: { URLSearchParams }
}
}; // iface
module.exports = iface;
const Impl = require("./URLSearchParams-impl.js" );
},{"./URLSearchParams-impl.js" :3,"./utils.js" :9,"webidl-conversions" :18}],5:[function (require,module,exports){
"use strict" ;
function isASCIIDigit(c) {
return c >= 0x30 && c <= 0x39;
}
function isASCIIAlpha(c) {
return (c >= 0x41 && c <= 0x5A) || (c >= 0x61 && c <= 0x7A);
}
function isASCIIAlphanumeric(c) {
return isASCIIAlpha(c) || isASCIIDigit(c);
}
function isASCIIHex(c) {
return isASCIIDigit(c) || (c >= 0x41 && c <= 0x46) || (c >= 0x61 && c <= 0x66);
}
module.exports = {
isASCIIDigit,
isASCIIAlpha,
isASCIIAlphanumeric,
isASCIIHex
};
},{}],6:[function (require,module,exports){
"use strict" ;
exports.URL = require("./URL" ).interface ;
exports.URLSearchParams = require("./URLSearchParams" ).interface ;
exports.parseURL = require("./url-state-machine" ).parseURL;
exports.basicURLParse = require("./url-state-machine" ).basicURLParse;
exports.serializeURL = require("./url-state-machine" ).serializeURL;
exports.serializeHost = require("./url-state-machine" ).serializeHost;
exports.serializeInteger = require("./url-state-machine" ).serializeInteger;
exports.serializeURLOrigin = require("./url-state-machine" ).serializeURLOrigin;
exports.setTheUsername = require("./url-state-machine" ).setTheUsername;
exports.setThePassword = require("./url-state-machine" ).setThePassword;
exports.cannotHaveAUsernamePasswordPort = require("./url-state-machine" ).cannotHaveAUsernamePasswordPort;
exports.percentDecode = require("./urlencoded" ).percentDecode;
},{"./URL" :2,"./URLSearchParams" :4,"./url-state-machine" :7,"./urlencoded" :8}],7:[function (require,module,exports){
(function (Buffer){(function (){
"use strict" ;
const punycode = require("punycode" );
const tr46 = require("tr46" );
const infra = require("./infra" );
const { percentEncode, percentDecode } = require("./urlencoded" );
const specialSchemes = {
ftp: 21,
file: null ,
gopher: 70,
http: 80,
https: 443,
ws: 80,
wss: 443
};
const failure = Symbol("failure" );
function countSymbols(str) {
return punycode.ucs2.decode(str).length;
}
function at(input, idx) {
const c = input[idx];
return isNaN(c) ? undefined : String.fromCodePoint(c);
}
function isSingleDot(buffer) {
return buffer === "." || buffer.toLowerCase() === "%2e" ;
}
function isDoubleDot(buffer) {
buffer = buffer.toLowerCase();
return buffer === ".." || buffer === "%2e." || buffer === ".%2e" || buffer === "%2e%2e" ;
}
function isWindowsDriveLetterCodePoints(cp1, cp2) {
return infra.isASCIIAlpha(cp1) && (cp2 === 58 || cp2 === 124);
}
function isWindowsDriveLetterString(string) {
return string.length === 2 && infra.isASCIIAlpha(string.codePointAt(0)) && (string[1] === ":" || string[1] === "|" );
}
function isNormalizedWindowsDriveLetterString(string) {
return string.length === 2 && infra.isASCIIAlpha(string.codePointAt(0)) && string[1] === ":" ;
}
function containsForbiddenHostCodePoint(string) {
return string.search(/\u0000|\u0009|\u000A|\u000D|\u0020|#|%|\/|:|\?|@|\[|\\|\]/) !== -1;
}
function containsForbiddenHostCodePointExcludingPercent(string) {
return string.search(/\u0000|\u0009|\u000A|\u000D|\u0020|#|\/|:|\?|@|\[|\\|\]/) !== -1;
}
function isSpecialScheme(scheme) {
return specialSchemes[scheme] !== undefined;
}
function isSpecial(url) {
return isSpecialScheme(url.scheme);
}
function isNotSpecial(url) {
return !isSpecialScheme(url.scheme);
}
function defaultPort(scheme) {
return specialSchemes[scheme];
}
function utf8PercentEncode(c) {
const buf = Buffer.from(c);
let str = "" ;
for (let i = 0; i < buf.length; ++i) {
str += percentEncode(buf[i]);
}
return str;
}
function isC0ControlPercentEncode(c) {
return c <= 0x1F || c > 0x7E;
}
const extraUserinfoPercentEncodeSet =
new Set([47, 58, 59, 61, 64, 91, 92, 93, 94, 124]);
function isUserinfoPercentEncode(c) {
return isPathPercentEncode(c) || extraUserinfoPercentEncodeSet.has(c);
}
const extraFragmentPercentEncodeSet = new Set([32, 34, 60, 62, 96]);
function isFragmentPercentEncode(c) {
return isC0ControlPercentEncode(c) || extraFragmentPercentEncodeSet.has(c);
}
const extraPathPercentEncodeSet = new Set([35, 63, 123, 125]);
function isPathPercentEncode(c) {
return isFragmentPercentEncode(c) || extraPathPercentEncodeSet.has(c);
}
function percentEncodeChar(c, encodeSetPredicate) {
const cStr = String.fromCodePoint(c);
if (encodeSetPredicate(c)) {
return utf8PercentEncode(cStr);
}
return cStr;
}
function parseIPv4Number(input) {
let R = 10;
if (input.length >= 2 && input.charAt(0) === "0" && input.charAt(1).toLowerCase() === "x" ) {
input = input.substring(2);
R = 16;
} else if (input.length >= 2 && input.charAt(0) === "0" ) {
input = input.substring(1);
R = 8;
}
if (input === "" ) {
return 0;
}
let regex = /[^0-7]/;
if (R === 10) {
regex = /[^0-9]/;
}
if (R === 16) {
regex = /[^0-9A-Fa-f]/;
}
if (regex.test(input)) {
return failure;
}
return parseInt(input, R);
}
function parseIPv4(input) {
const parts = input.split("." );
if (parts[parts.length - 1] === "" ) {
if (parts.length > 1) {
parts.pop();
}
}
if (parts.length > 4) {
return input;
}
const numbers = [];
for (const part of parts) {
if (part === "" ) {
return input;
}
const n = parseIPv4Number(part);
if (n === failure) {
return input;
}
numbers.push(n);
}
for (let i = 0; i < numbers.length - 1; ++i) {
if (numbers[i] > 255) {
return failure;
}
}
if (numbers[numbers.length - 1] >= Math.pow(256, 5 - numbers.length)) {
return failure;
}
let ipv4 = numbers.pop();
let counter = 0;
for (const n of numbers) {
ipv4 += n * Math.pow(256, 3 - counter);
++counter;
}
return ipv4;
}
function serializeIPv4(address) {
let output = "" ;
let n = address;
for (let i = 1; i <= 4; ++i) {
output = String(n % 256) + output;
if (i !== 4) {
output = "." + output;
}
n = Math.floor(n / 256);
}
return output;
}
function parseIPv6(input) {
const address = [0, 0, 0, 0, 0, 0, 0, 0];
let pieceIndex = 0;
let compress = null ;
let pointer = 0;
input = punycode.ucs2.decode(input);
if (input[pointer] === 58) {
if (input[pointer + 1] !== 58) {
return failure;
}
pointer += 2;
++pieceIndex;
compress = pieceIndex;
}
while (pointer < input.length) {
if (pieceIndex === 8) {
return failure;
}
if (input[pointer] === 58) {
if (compress !== null ) {
return failure;
}
++pointer;
++pieceIndex;
compress = pieceIndex;
continue ;
}
let value = 0;
let length = 0;
while (length < 4 && infra.isASCIIHex(input[pointer])) {
value = value * 0x10 + parseInt(at(input, pointer), 16);
++pointer;
++length;
}
if (input[pointer] === 46) {
if (length === 0) {
return failure;
}
pointer -= length;
if (pieceIndex > 6) {
return failure;
}
let numbersSeen = 0;
while (input[pointer] !== undefined) {
let ipv4Piece = null ;
if (numbersSeen > 0) {
if (input[pointer] === 46 && numbersSeen < 4) {
++pointer;
} else {
return failure;
}
}
if (!infra.isASCIIDigit(input[pointer])) {
return failure;
}
while (infra.isASCIIDigit(input[pointer])) {
const number = parseInt(at(input, pointer));
if (ipv4Piece === null ) {
ipv4Piece = number;
} else if (ipv4Piece === 0) {
return failure;
} else {
ipv4Piece = ipv4Piece * 10 + number;
}
if (ipv4Piece > 255) {
return failure;
}
++pointer;
}
address[pieceIndex] = address[pieceIndex] * 0x100 + ipv4Piece;
++numbersSeen;
if (numbersSeen === 2 || numbersSeen === 4) {
++pieceIndex;
}
}
if (numbersSeen !== 4) {
return failure;
}
break ;
} else if (input[pointer] === 58) {
++pointer;
if (input[pointer] === undefined) {
return failure;
}
} else if (input[pointer] !== undefined) {
return failure;
}
address[pieceIndex] = value;
++pieceIndex;
}
if (compress !== null ) {
let swaps = pieceIndex - compress;
pieceIndex = 7;
while (pieceIndex !== 0 && swaps > 0) {
const temp = address[compress + swaps - 1];
address[compress + swaps - 1] = address[pieceIndex];
address[pieceIndex] = temp;
--pieceIndex;
--swaps;
}
} else if (compress === null && pieceIndex !== 8) {
return failure;
}
return address;
}
function serializeIPv6(address) {
let output = "" ;
const seqResult = findLongestZeroSequence(address);
const compress = seqResult.idx;
let ignore0 = false ;
for (let pieceIndex = 0; pieceIndex <= 7; ++pieceIndex) {
if (ignore0 && address[pieceIndex] === 0) {
continue ;
} else if (ignore0) {
ignore0 = false ;
}
if (compress === pieceIndex) {
const separator = pieceIndex === 0 ? "::" : ":" ;
output += separator;
ignore0 = true ;
continue ;
}
output += address[pieceIndex].toString(16);
if (pieceIndex !== 7) {
output += ":" ;
}
}
return output;
}
function parseHost(input, isNotSpecialArg = false ) {
if (input[0] === "[" ) {
if (input[input.length - 1] !== "]" ) {
return failure;
}
return parseIPv6(input.substring(1, input.length - 1));
}
if (isNotSpecialArg) {
return parseOpaqueHost(input);
}
const domain = percentDecode(Buffer.from(input)).toString();
const asciiDomain = domainToASCII(domain);
if (asciiDomain === failure) {
return failure;
}
if (containsForbiddenHostCodePoint(asciiDomain)) {
return failure;
}
const ipv4Host = parseIPv4(asciiDomain);
if (typeof ipv4Host === "number" || ipv4Host === failure) {
return ipv4Host;
}
return asciiDomain;
}
function parseOpaqueHost(input) {
if (containsForbiddenHostCodePointExcludingPercent(input)) {
return failure;
}
let output = "" ;
const decoded = punycode.ucs2.decode(input);
for (let i = 0; i < decoded.length; ++i) {
output += percentEncodeChar(decoded[i], isC0ControlPercentEncode);
}
return output;
}
function findLongestZeroSequence(arr) {
let maxIdx = null ;
let maxLen = 1; // only find elements > 1
let currStart = null ;
let currLen = 0;
for (let i = 0; i < arr.length; ++i) {
if (arr[i] !== 0) {
if (currLen > maxLen) {
maxIdx = currStart;
maxLen = currLen;
}
currStart = null ;
currLen = 0;
} else {
if (currStart === null ) {
currStart = i;
}
++currLen;
}
}
// if trailing zeros
if (currLen > maxLen) {
maxIdx = currStart;
maxLen = currLen;
}
return {
idx: maxIdx,
len: maxLen
};
}
function serializeHost(host) {
if (typeof host === "number" ) {
return serializeIPv4(host);
}
// IPv6 serializer
if (host instanceof Array) {
return "[" + serializeIPv6(host) + "]" ;
}
return host;
}
function domainToASCII(domain, beStrict = false ) {
const result = tr46.toASCII(domain, {
checkBidi: true ,
checkHyphens: false ,
checkJoiners: true ,
useSTD3ASCIIRules: beStrict,
verifyDNSLength: beStrict
});
if (result === null ) {
return failure;
}
return result;
}
function trimControlChars(url) {
return url.replace(/^[\u0000-\u001F\u0020]+|[\u0000-\u001F\u0020]+$/g, "" );
}
function trimTabAndNewline(url) {
return url.replace(/\u0009|\u000A|\u000D/g, "" );
}
function shortenPath(url) {
const { path } = url;
if (path.length === 0) {
return ;
}
if (url.scheme === "file" && path.length === 1 && isNormalizedWindowsDriveLetter(path[0])) {
return ;
}
path.pop();
}
function includesCredentials(url) {
return url.username !== "" || url.password !== "" ;
}
function cannotHaveAUsernamePasswordPort(url) {
return url.host === null || url.host === "" || url.cannotBeABaseURL || url.scheme === "file" ;
}
function isNormalizedWindowsDriveLetter(string) {
return /^[A-Za-z]:$/.test(string);
}
function URLStateMachine(input, base, encodingOverride, url, stateOverride) {
this .pointer = 0;
this .input = input;
this .base = base || null ;
this .encodingOverride = encodingOverride || "utf-8" ;
this .stateOverride = stateOverride;
this .url = url;
this .failure = false ;
this .parseError = false ;
if (!this .url) {
this .url = {
scheme: "" ,
username: "" ,
password: "" ,
host: null ,
port: null ,
path: [],
query: null ,
fragment: null ,
cannotBeABaseURL: false
};
const res = trimControlChars(this .input);
if (res !== this .input) {
this .parseError = true ;
}
this .input = res;
}
const res = trimTabAndNewline(this .input);
if (res !== this .input) {
this .parseError = true ;
}
this .input = res;
this .state = stateOverride || "scheme start" ;
this .buffer = "" ;
this .atFlag = false ;
this .arrFlag = false ;
this .passwordTokenSeenFlag = false ;
this .input = punycode.ucs2.decode(this .input);
for (; this .pointer <= this .input.length; ++this .pointer) {
const c = this .input[this .pointer];
const cStr = isNaN(c) ? undefined : String.fromCodePoint(c);
// exec state machine
const ret = this ["parse " + this .state](c, cStr);
if (!ret) {
break ; // terminate algorithm
} else if (ret === failure) {
this .failure = true ;
break ;
}
}
}
URLStateMachine.prototype["parse scheme start" ] = function parseSchemeStart(c, cStr) {
if (infra.isASCIIAlpha(c)) {
this .buffer += cStr.toLowerCase();
this .state = "scheme" ;
} else if (!this .stateOverride) {
this .state = "no scheme" ;
--this .pointer;
} else {
this .parseError = true ;
return failure;
}
return true ;
};
URLStateMachine.prototype["parse scheme" ] = function parseScheme(c, cStr) {
if (infra.isASCIIAlphanumeric(c) || c === 43 || c === 45 || c === 46) {
this .buffer += cStr.toLowerCase();
} else if (c === 58) {
if (this .stateOverride) {
if (isSpecial(this .url) && !isSpecialScheme(this .buffer)) {
return false ;
}
if (!isSpecial(this .url) && isSpecialScheme(this .buffer)) {
return false ;
}
if ((includesCredentials(this .url) || this .url.port !== null ) && this .buffer === "file" ) {
return false ;
}
if (this .url.scheme === "file" && (this .url.host === "" || this .url.host === null )) {
return false ;
}
}
this .url.scheme = this .buffer;
if (this .stateOverride) {
if (this .url.port === defaultPort(this .url.scheme)) {
this .url.port = null ;
}
return false ;
}
this .buffer = "" ;
if (this .url.scheme === "file" ) {
if (this .input[this .pointer + 1] !== 47 || this .input[this .pointer + 2] !== 47) {
this .parseError = true ;
}
this .state = "file" ;
} else if (isSpecial(this .url) && this .base !== null && this .base.scheme === this .url.scheme) {
this .state = "special relative or authority" ;
} else if (isSpecial(this .url)) {
this .state = "special authority slashes" ;
} else if (this .input[this .pointer + 1] === 47) {
this .state = "path or authority" ;
++this .pointer;
} else {
this .url.cannotBeABaseURL = true ;
this .url.path.push("" );
this .state = "cannot-be-a-base-URL path" ;
}
} else if (!this .stateOverride) {
this .buffer = "" ;
this .state = "no scheme" ;
this .pointer = -1;
} else {
this .parseError = true ;
return failure;
}
return true ;
};
URLStateMachine.prototype["parse no scheme" ] = function parseNoScheme(c) {
if (this .base === null || (this .base.cannotBeABaseURL && c !== 35)) {
return failure;
} else if (this .base.cannotBeABaseURL && c === 35) {
this .url.scheme = this .base.scheme;
this .url.path = this .base.path.slice();
this .url.query = this .base.query;
this .url.fragment = "" ;
this .url.cannotBeABaseURL = true ;
this .state = "fragment" ;
} else if (this .base.scheme === "file" ) {
this .state = "file" ;
--this .pointer;
} else {
this .state = "relative" ;
--this .pointer;
}
return true ;
};
URLStateMachine.prototype["parse special relative or authority" ] = function parseSpecialRelativeOrAuthority(c) {
if (c === 47 && this .input[this .pointer + 1] === 47) {
this .state = "special authority ignore slashes" ;
++this .pointer;
} else {
this .parseError = true ;
this .state = "relative" ;
--this .pointer;
}
return true ;
};
URLStateMachine.prototype["parse path or authority" ] = function parsePathOrAuthority(c) {
if (c === 47) {
this .state = "authority" ;
} else {
this .state = "path" ;
--this .pointer;
}
return true ;
};
URLStateMachine.prototype["parse relative" ] = function parseRelative(c) {
this .url.scheme = this .base.scheme;
if (isNaN(c)) {
this .url.username = this .base.username;
this .url.password = this .base.password;
this .url.host = this .base.host;
this .url.port = this .base.port;
this .url.path = this .base.path.slice();
this .url.query = this .base.query;
} else if (c === 47) {
this .state = "relative slash" ;
} else if (c === 63) {
this .url.username = this .base.username;
this .url.password = this .base.password;
this .url.host = this .base.host;
this .url.port = this .base.port;
this .url.path = this .base.path.slice();
this .url.query = "" ;
this .state = "query" ;
} else if (c === 35) {
this .url.username = this .base.username;
this .url.password = this .base.password;
this .url.host = this .base.host;
this .url.port = this .base.port;
this .url.path = this .base.path.slice();
this .url.query = this .base.query;
this .url.fragment = "" ;
this .state = "fragment" ;
} else if (isSpecial(this .url) && c === 92) {
this .parseError = true ;
this .state = "relative slash" ;
} else {
this .url.username = this .base.username;
this .url.password = this .base.password;
this .url.host = this .base.host;
this .url.port = this .base.port;
this .url.path = this .base.path.slice(0, this .base.path.length - 1);
this .state = "path" ;
--this .pointer;
}
return true ;
};
URLStateMachine.prototype["parse relative slash" ] = function parseRelativeSlash(c) {
if (isSpecial(this .url) && (c === 47 || c === 92)) {
if (c === 92) {
this .parseError = true ;
}
this .state = "special authority ignore slashes" ;
} else if (c === 47) {
this .state = "authority" ;
} else {
this .url.username = this .base.username;
this .url.password = this .base.password;
this .url.host = this .base.host;
this .url.port = this .base.port;
this .state = "path" ;
--this .pointer;
}
return true ;
};
URLStateMachine.prototype["parse special authority slashes" ] = function parseSpecialAuthoritySlashes(c) {
if (c === 47 && this .input[this .pointer + 1] === 47) {
this .state = "special authority ignore slashes" ;
++this .pointer;
} else {
this .parseError = true ;
this .state = "special authority ignore slashes" ;
--this .pointer;
}
return true ;
};
URLStateMachine.prototype["parse special authority ignore slashes" ] = function parseSpecialAuthorityIgnoreSlashes(c) {
if (c !== 47 && c !== 92) {
this .state = "authority" ;
--this .pointer;
} else {
this .parseError = true ;
}
return true ;
};
URLStateMachine.prototype["parse authority" ] = function parseAuthority(c, cStr) {
if (c === 64) {
this .parseError = true ;
if (this .atFlag) {
this .buffer = "%40" + this .buffer;
}
this .atFlag = true ;
// careful, this is based on buffer and has its own pointer (this.pointer != pointer) and inner chars
const len = countSymbols(this .buffer);
for (let pointer = 0; pointer < len; ++pointer) {
const codePoint = this .buffer.codePointAt(pointer);
if (codePoint === 58 && !this .passwordTokenSeenFlag) {
this .passwordTokenSeenFlag = true ;
continue ;
}
const encodedCodePoints = percentEncodeChar(codePoint, isUserinfoPercentEncode);
if (this .passwordTokenSeenFlag) {
this .url.password += encodedCodePoints;
} else {
this .url.username += encodedCodePoints;
}
}
this .buffer = "" ;
} else if (isNaN(c) || c === 47 || c === 63 || c === 35 ||
(isSpecial(this .url) && c === 92)) {
if (this .atFlag && this .buffer === "" ) {
this .parseError = true ;
return failure;
}
this .pointer -= countSymbols(this .buffer) + 1;
this .buffer = "" ;
this .state = "host" ;
} else {
this .buffer += cStr;
}
return true ;
};
URLStateMachine.prototype["parse hostname" ] =
URLStateMachine.prototype["parse host" ] = function parseHostName(c, cStr) {
if (this .stateOverride && this .url.scheme === "file" ) {
--this .pointer;
this .state = "file host" ;
} else if (c === 58 && !this .arrFlag) {
if (this .buffer === "" ) {
this .parseError = true ;
return failure;
}
const host = parseHost(this .buffer, isNotSpecial(this .url));
if (host === failure) {
return failure;
}
this .url.host = host;
this .buffer = "" ;
this .state = "port" ;
if (this .stateOverride === "hostname" ) {
return false ;
}
} else if (isNaN(c) || c === 47 || c === 63 || c === 35 ||
(isSpecial(this .url) && c === 92)) {
--this .pointer;
if (isSpecial(this .url) && this .buffer === "" ) {
this .parseError = true ;
return failure;
} else if (this .stateOverride && this .buffer === "" &&
(includesCredentials(this .url) || this .url.port !== null )) {
this .parseError = true ;
return false ;
}
const host = parseHost(this .buffer, isNotSpecial(this .url));
if (host === failure) {
return failure;
}
this .url.host = host;
this .buffer = "" ;
this .state = "path start" ;
if (this .stateOverride) {
return false ;
}
} else {
if (c === 91) {
this .arrFlag = true ;
} else if (c === 93) {
this .arrFlag = false ;
}
this .buffer += cStr;
}
return true ;
};
URLStateMachine.prototype["parse port" ] = function parsePort(c, cStr) {
if (infra.isASCIIDigit(c)) {
this .buffer += cStr;
} else if (isNaN(c) || c === 47 || c === 63 || c === 35 ||
(isSpecial(this .url) && c === 92) ||
this .stateOverride) {
if (this .buffer !== "" ) {
const port = parseInt(this .buffer);
if (port > Math.pow(2, 16) - 1) {
this .parseError = true ;
return failure;
}
this .url.port = port === defaultPort(this .url.scheme) ? null : port;
this .buffer = "" ;
}
if (this .stateOverride) {
return false ;
}
this .state = "path start" ;
--this .pointer;
} else {
this .parseError = true ;
return failure;
}
return true ;
};
const fileOtherwiseCodePoints = new Set([47, 92, 63, 35]);
function startsWithWindowsDriveLetter(input, pointer) {
const length = input.length - pointer;
return length >= 2 &&
isWindowsDriveLetterCodePoints(input[pointer], input[pointer + 1]) &&
(length === 2 || fileOtherwiseCodePoints.has(input[pointer + 2]));
}
URLStateMachine.prototype["parse file" ] = function parseFile(c) {
this .url.scheme = "file" ;
if (c === 47 || c === 92) {
if (c === 92) {
this .parseError = true ;
}
this .state = "file slash" ;
} else if (this .base !== null && this .base.scheme === "file" ) {
if (isNaN(c)) {
this .url.host = this .base.host;
this .url.path = this .base.path.slice();
this .url.query = this .base.query;
} else if (c === 63) {
this .url.host = this .base.host;
this .url.path = this .base.path.slice();
this .url.query = "" ;
this .state = "query" ;
} else if (c === 35) {
this .url.host = this .base.host;
this .url.path = this .base.path.slice();
this .url.query = this .base.query;
this .url.fragment = "" ;
this .state = "fragment" ;
} else {
if (!startsWithWindowsDriveLetter(this .input, this .pointer)) {
this .url.host = this .base.host;
this .url.path = this .base.path.slice();
shortenPath(this .url);
} else {
this .parseError = true ;
}
this .state = "path" ;
--this .pointer;
}
} else {
this .state = "path" ;
--this .pointer;
}
return true ;
};
URLStateMachine.prototype["parse file slash" ] = function parseFileSlash(c) {
if (c === 47 || c === 92) {
if (c === 92) {
this .parseError = true ;
}
this .state = "file host" ;
} else {
if (this .base !== null && this .base.scheme === "file" &&
!startsWithWindowsDriveLetter(this .input, this .pointer)) {
if (isNormalizedWindowsDriveLetterString(this .base.path[0])) {
this .url.path.push(this .base.path[0]);
} else {
this .url.host = this .base.host;
}
}
this .state = "path" ;
--this .pointer;
}
return true ;
};
URLStateMachine.prototype["parse file host" ] = function parseFileHost(c, cStr) {
if (isNaN(c) || c === 47 || c === 92 || c === 63 || c === 35) {
--this .pointer;
if (!this .stateOverride && isWindowsDriveLetterString(this .buffer)) {
this .parseError = true ;
this .state = "path" ;
} else if (this .buffer === "" ) {
this .url.host = "" ;
if (this .stateOverride) {
return false ;
}
this .state = "path start" ;
} else {
let host = parseHost(this .buffer, isNotSpecial(this .url));
if (host === failure) {
return failure;
}
if (host === "localhost" ) {
host = "" ;
}
this .url.host = host;
if (this .stateOverride) {
return false ;
}
this .buffer = "" ;
this .state = "path start" ;
}
} else {
this .buffer += cStr;
}
return true ;
};
URLStateMachine.prototype["parse path start" ] = function parsePathStart(c) {
if (isSpecial(this .url)) {
if (c === 92) {
this .parseError = true ;
}
this .state = "path" ;
if (c !== 47 && c !== 92) {
--this .pointer;
}
} else if (!this .stateOverride && c === 63) {
this .url.query = "" ;
this .state = "query" ;
} else if (!this .stateOverride && c === 35) {
this .url.fragment = "" ;
this .state = "fragment" ;
} else if (c !== undefined) {
this .state = "path" ;
if (c !== 47) {
--this .pointer;
}
}
return true ;
};
URLStateMachine.prototype["parse path" ] = function parsePath(c) {
if (isNaN(c) || c === 47 || (isSpecial(this .url) && c === 92) ||
(!this .stateOverride && (c === 63 || c === 35))) {
if (isSpecial(this .url) && c === 92) {
this .parseError = true ;
}
if (isDoubleDot(this .buffer)) {
shortenPath(this .url);
if (c !== 47 && !(isSpecial(this .url) && c === 92)) {
this .url.path.push("" );
}
} else if (isSingleDot(this .buffer) && c !== 47 &&
!(isSpecial(this .url) && c === 92)) {
this .url.path.push("" );
} else if (!isSingleDot(this .buffer)) {
if (this .url.scheme === "file" && this .url.path.length === 0 && isWindowsDriveLetterString(this .buffer)) {
if (this .url.host !== "" && this .url.host !== null ) {
this .parseError = true ;
this .url.host = "" ;
}
this .buffer = this .buffer[0] + ":" ;
}
this .url.path.push(this .buffer);
}
this .buffer = "" ;
if (this .url.scheme === "file" && (c === undefined || c === 63 || c === 35)) {
while (this .url.path.length > 1 && this .url.path[0] === "" ) {
this .parseError = true ;
this .url.path.shift();
}
}
if (c === 63) {
this .url.query = "" ;
this .state = "query" ;
}
if (c === 35) {
this .url.fragment = "" ;
this .state = "fragment" ;
}
} else {
// TODO: If c is not a URL code point and not "%", parse error.
if (c === 37 &&
(!infra.isASCIIHex(this .input[this .pointer + 1]) ||
!infra.isASCIIHex(this .input[this .pointer + 2]))) {
this .parseError = true ;
}
this .buffer += percentEncodeChar(c, isPathPercentEncode);
}
return true ;
};
URLStateMachine.prototype["parse cannot-be-a-base-URL path" ] = function parseCannotBeABaseURLPath(c) {
if (c === 63) {
this .url.query = "" ;
this .state = "query" ;
} else if (c === 35) {
this .url.fragment = "" ;
this .state = "fragment" ;
} else {
// TODO: Add: not a URL code point
if (!isNaN(c) && c !== 37) {
this .parseError = true ;
}
if (c === 37 &&
(!infra.isASCIIHex(this .input[this .pointer + 1]) ||
!infra.isASCIIHex(this .input[this .pointer + 2]))) {
this .parseError = true ;
}
if (!isNaN(c)) {
this .url.path[0] = this .url.path[0] + percentEncodeChar(c, isC0ControlPercentEncode);
}
}
return true ;
};
URLStateMachine.prototype["parse query" ] = function parseQuery(c, cStr) {
if (isNaN(c) || (!this .stateOverride && c === 35)) {
if (!isSpecial(this .url) || this .url.scheme === "ws" || this .url.scheme === "wss" ) {
this .encodingOverride = "utf-8" ;
}
const buffer = Buffer.from(this .buffer); // TODO: Use encoding override instead
for (let i = 0; i < buffer.length; ++i) {
if (buffer[i] < 0x21 ||
buffer[i] > 0x7E ||
buffer[i] === 0x22 || buffer[i] === 0x23 || buffer[i] === 0x3C || buffer[i] === 0x3E ||
(buffer[i] === 0x27 && isSpecial(this .url))) {
this .url.query += percentEncode(buffer[i]);
} else {
this .url.query += String.fromCodePoint(buffer[i]);
}
}
this .buffer = "" ;
if (c === 35) {
this .url.fragment = "" ;
this .state = "fragment" ;
}
} else {
// TODO: If c is not a URL code point and not "%", parse error.
if (c === 37 &&
(!infra.isASCIIHex(this .input[this .pointer + 1]) ||
!infra.isASCIIHex(this .input[this .pointer + 2]))) {
this .parseError = true ;
}
this .buffer += cStr;
}
return true ;
};
URLStateMachine.prototype["parse fragment" ] = function parseFragment(c) {
if (isNaN(c)) { // do nothing
} else if (c === 0x0) {
this .parseError = true ;
} else {
// TODO: If c is not a URL code point and not "%", parse error.
if (c === 37 &&
(!infra.isASCIIHex(this .input[this .pointer + 1]) ||
!infra.isASCIIHex(this .input[this .pointer + 2]))) {
this .parseError = true ;
}
this .url.fragment += percentEncodeChar(c, isFragmentPercentEncode);
}
return true ;
};
function serializeURL(url, excludeFragment) {
let output = url.scheme + ":" ;
if (url.host !== null ) {
output += "//";
if (url.username !== "" || url.password !== "" ) {
output += url.username;
if (url.password !== "" ) {
output += ":" + url.password;
}
output += "@" ;
}
output += serializeHost(url.host);
if (url.port !== null ) {
output += ":" + url.port;
}
} else if (url.host === null && url.scheme === "file" ) {
output += "//";
}
if (url.cannotBeABaseURL) {
output += url.path[0];
} else {
for (const string of url.path) {
output += "/" + string;
}
}
if (url.query !== null ) {
output += "?" + url.query;
}
if (!excludeFragment && url.fragment !== null ) {
output += "#" + url.fragment;
}
return output;
}
function serializeOrigin(tuple) {
let result = tuple.scheme + "://";
result += serializeHost(tuple.host);
if (tuple.port !== null ) {
result += ":" + tuple.port;
}
return result;
}
module.exports.serializeURL = serializeURL;
module.exports.serializeURLOrigin = function (url) {
// https://url.spec.whatwg.org/#concept-url-origin
switch (url.scheme) {
case "blob" :
try {
return module.exports.serializeURLOrigin(module.exports.parseURL(url.path[0]));
} catch (e) {
// serializing an opaque origin returns "null"
return "null" ;
}
case "ftp" :
case "gopher" :
case "http" :
case "https" :
case "ws" :
case "wss" :
return serializeOrigin({
scheme: url.scheme,
host: url.host,
port: url.port
});
case "file" :
// The spec says:
// > Unfortunate as it is, this is left as an exercise to the reader. When in doubt, return a new opaque origin.
// Browsers tested so far:
// - Chrome says "file://", but treats file: URLs as cross-origin for most (all?) purposes; see e.g.
// https://bugs.chromium.org/p/chromium/issues/detail?id=37586
// - Firefox says "null", but treats file: URLs as same-origin sometimes based on directory stuff; see
// https://developer.mozilla.org/en-US/docs/Archive/Misc_top_level/Same-origin_policy_for_file:_URIs
return "null" ;
default :
// serializing an opaque origin returns "null"
return "null" ;
}
};
module.exports.basicURLParse = function (input, options) {
if (options === undefined) {
options = {};
}
const usm = new URLStateMachine(input, options.baseURL, options.encodingOverride, options.url, options.stateOverride);
if (usm.failure) {
return null ;
}
return usm.url;
};
module.exports.setTheUsername = function (url, username) {
url.username = "" ;
const decoded = punycode.ucs2.decode(username);
for (let i = 0; i < decoded.length; ++i) {
url.username += percentEncodeChar(decoded[i], isUserinfoPercentEncode);
}
};
module.exports.setThePassword = function (url, password) {
url.password = "" ;
const decoded = punycode.ucs2.decode(password);
for (let i = 0; i < decoded.length; ++i) {
url.password += percentEncodeChar(decoded[i], isUserinfoPercentEncode);
}
};
module.exports.serializeHost = serializeHost;
module.exports.cannotHaveAUsernamePasswordPort = cannotHaveAUsernamePasswordPort;
module.exports.serializeInteger = function (integer) {
return String(integer);
};
module.exports.parseURL = function (input, options) {
if (options === undefined) {
options = {};
}
// We don't handle blobs, so this just delegates:
return module.exports.basicURLParse(input, { baseURL: options.baseURL, encodingOverride: options.encodingOverride });
};
}).call(this )}).call(this ,require("buffer" ).Buffer)
},{"./infra" :5,"./urlencoded" :8,"buffer" :12,"punycode" :11,"tr46" :15}],8:[function (require,module,exports){
(function (Buffer){(function (){
"use strict" ;
const { isASCIIHex } = require("./infra" );
function strictlySplitByteSequence(buf, cp) {
const list = [];
let last = 0;
let i = buf.indexOf(cp);
while (i >= 0) {
list.push(buf.slice(last, i));
last = i + 1;
i = buf.indexOf(cp, last);
}
if (last !== buf.length) {
list.push(buf.slice(last));
}
return list;
}
function replaceByteInByteSequence(buf, from, to) {
let i = buf.indexOf(from);
while (i >= 0) {
buf[i] = to;
i = buf.indexOf(from, i + 1);
}
return buf;
}
function percentEncode(c) {
let hex = c.toString(16).toUpperCase();
if (hex.length === 1) {
hex = "0" + hex;
}
return "%" + hex;
}
function percentDecode(input) {
const output = Buffer.alloc(input.byteLength);
let ptr = 0;
for (let i = 0; i < input.length; ++i) {
if (input[i] !== 37 || !isASCIIHex(input[i + 1]) || !isASCIIHex(input[i + 2])) {
output[ptr++] = input[i];
} else {
output[ptr++] = parseInt(input.slice(i + 1, i + 3).toString(), 16);
i += 2;
}
}
return output.slice(0, ptr);
}
function parseUrlencoded(input) {
const sequences = strictlySplitByteSequence(input, 38);
const output = [];
for (const bytes of sequences) {
if (bytes.length === 0) {
continue ;
}
let name;
let value;
const indexOfEqual = bytes.indexOf(61);
--> --------------------
--> maximum size reached
--> --------------------
Messung V0.5 C=93 H=97 G=94
¤ Dauer der Verarbeitung: 0.36 Sekunden
¤
*© Formatika GbR, Deutschland