mirror of
				https://scm.univ-tours.fr/22107988t/rappaurio-sae501_502.git
				synced 2025-11-04 15:55:22 +01:00 
			
		
		
		
	
		
			
				
	
	
		
			201 lines
		
	
	
		
			3.7 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			201 lines
		
	
	
		
			3.7 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
"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;
 | 
						|
  }
 | 
						|
};
 |