2 const usm = require("./url-state-machine");
4 exports.implementation = class URLImpl {
5 constructor(constructorArgs) {
6 const url = constructorArgs[0];
7 const base = constructorArgs[1];
10 if (base !== undefined) {
11 parsedBase = usm.basicURLParse(base);
12 if (parsedBase === "failure") {
13 throw new TypeError("Invalid base URL");
17 const parsedURL = usm.basicURLParse(url, { baseURL: parsedBase });
18 if (parsedURL === "failure") {
19 throw new TypeError("Invalid URL");
22 this._url = parsedURL;
28 return usm.serializeURL(this._url);
32 const parsedURL = usm.basicURLParse(v);
33 if (parsedURL === "failure") {
34 throw new TypeError("Invalid URL");
37 this._url = parsedURL;
41 return usm.serializeURLOrigin(this._url);
45 return this._url.scheme + ":";
49 usm.basicURLParse(v + ":", { url: this._url, stateOverride: "scheme start" });
53 return this._url.username;
57 if (usm.cannotHaveAUsernamePasswordPort(this._url)) {
61 usm.setTheUsername(this._url, v);
65 return this._url.password;
69 if (usm.cannotHaveAUsernamePasswordPort(this._url)) {
73 usm.setThePassword(this._url, v);
77 const url = this._url;
79 if (url.host === null) {
83 if (url.port === null) {
84 return usm.serializeHost(url.host);
87 return usm.serializeHost(url.host) + ":" + usm.serializeInteger(url.port);
91 if (this._url.cannotBeABaseURL) {
95 usm.basicURLParse(v, { url: this._url, stateOverride: "host" });
99 if (this._url.host === null) {
103 return usm.serializeHost(this._url.host);
107 if (this._url.cannotBeABaseURL) {
111 usm.basicURLParse(v, { url: this._url, stateOverride: "hostname" });
115 if (this._url.port === null) {
119 return usm.serializeInteger(this._url.port);
123 if (usm.cannotHaveAUsernamePasswordPort(this._url)) {
128 this._url.port = null;
130 usm.basicURLParse(v, { url: this._url, stateOverride: "port" });
135 if (this._url.cannotBeABaseURL) {
136 return this._url.path[0];
139 if (this._url.path.length === 0) {
143 return "/" + this._url.path.join("/");
147 if (this._url.cannotBeABaseURL) {
152 usm.basicURLParse(v, { url: this._url, stateOverride: "path start" });
156 if (this._url.query === null || this._url.query === "") {
160 return "?" + this._url.query;
166 const url = this._url;
173 const input = v[0] === "?" ? v.substring(1) : v;
175 usm.basicURLParse(input, { url, stateOverride: "query" });
179 if (this._url.fragment === null || this._url.fragment === "") {
183 return "#" + this._url.fragment;
188 this._url.fragment = null;
192 const input = v[0] === "#" ? v.substring(1) : v;
193 this._url.fragment = "";
194 usm.basicURLParse(input, { url: this._url, stateOverride: "fragment" });