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