You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					201 lines
				
				3.7 KiB
			
		
		
			
		
	
	
					201 lines
				
				3.7 KiB
			| 
								 
											3 years ago
										 
									 | 
							
								"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;
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								};
							 |