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; | ||
|  |   } | ||
|  | }; |