UNPKG

@web-atoms/core

Version:
99 lines (89 loc) 3.02 kB
import { AtomUI } from "../web/core/AtomUI"; import { INameValuePairs, INameValues } from "./types"; export class AtomUri { public protocol: string; public path: string; public query: INameValues; public hash: INameValues; // public scheme: string; public host: string; public port: string; public get pathAndQuery() { const q: string[] = []; const h: string[] = []; for (const key in this.query) { if (this.query.hasOwnProperty(key)) { const element = this.query[key]; if (element === undefined || element === null) { continue; } q.push(`${encodeURIComponent(key)}=${encodeURIComponent(element.toString())}`); } } for (const key in this.hash) { if (this.hash.hasOwnProperty(key)) { const element = this.hash[key]; if (element === undefined || element === null) { continue; } h.push(`${encodeURIComponent(key)}=${encodeURIComponent(element.toString())}`); } } const query = q.length ? "?" + q.join("&") : ""; const hash = h.length ? "#" + h.join("&") : ""; let path: string = this.path || "/"; if (path.startsWith("/")) { path = path.substr(1); } return `${path}${query}${hash}`; } /** * */ constructor(url: string) { let path: string ; let query: string = ""; let hash: string = ""; let t: string[] = url.split("?"); path = t[0]; if (t.length === 2) { query = t[1] || ""; t = query.split("#"); query = t[0]; hash = t[1] || ""; } else { t = path.split("#"); path = t[0]; hash = t[1] || ""; } // extract protocol and domain... let scheme: string = ""; let host: string = ""; let port: string = ""; let i: number = path.indexOf("//"); if (i !== -1) { scheme = path.substr(0, i); path = path.substr(i + 2); i = path.indexOf("/"); if (i !== -1) { host = path.substr(0, i); path = path.substr(i + 1); t = host.split(":"); if (t.length > 1) { host = t[0]; port = t[1]; } } } this.host = host; this.protocol = scheme; this.port = port; this.path = path; this.query = AtomUI.parseUrl(query); this.hash = AtomUI.parseUrl(hash); } public toString(): string { const port = this.port ? ":" + this.port : ""; return `${this.protocol}//${this.host}${port}/${this.pathAndQuery}`; } }