| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200 | "use strict";const usm = require("./url-state-machine");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 === "failure") {        throw new TypeError("Invalid base URL");      }    }    const parsedURL = usm.basicURLParse(url, { baseURL: parsedBase });    if (parsedURL === "failure") {      throw new TypeError("Invalid URL");    }    this._url = parsedURL;    // TODO: query stuff  }  get href() {    return usm.serializeURL(this._url);  }  set href(v) {    const parsedURL = usm.basicURLParse(v);    if (parsedURL === "failure") {      throw new TypeError("Invalid URL");    }    this._url = parsedURL;  }  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) {    // TODO: query stuff    const url = this._url;    if (v === "") {      url.query = null;      return;    }    const input = v[0] === "?" ? v.substring(1) : v;    url.query = "";    usm.basicURLParse(input, { url, stateOverride: "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;  }};
 |