src/url.ts (67 lines of code) (raw):
import * as url from 'url';
type DATE_TYPE = string | Date | moment.Moment
const portMap: { [key: string]: string } = {
ftp: '21',
gopher: '70',
http: '80',
https: '443',
ws: '80',
wss: '443',
};
export default class TeaURL {
_url: url.URL
constructor(str: string) {
this._url = new url.URL(str);
}
path(): string {
return this._url.pathname + this._url.search;
}
pathname(): string {
return this._url.pathname;
}
protocol(): string {
return this._url.protocol ? this._url.protocol.replace(':', '') : '';
}
hostname(): string {
return this._url.hostname;
}
host(): string {
return this._url.host;
}
port(): string {
return this._url.port || portMap[this.protocol()];
}
hash(): string {
return this._url.hash ? this._url.hash.replace('#', '') : '';
}
search(): string {
return this._url.search ? this._url.search.replace('?', '') : '';
}
href(): string {
return this._url.href;
}
auth(): string {
return `${this._url.username}:${this._url.password}`;
}
static parse(url: string): TeaURL {
return new TeaURL(url);
}
static urlEncode(url: string): string {
return url != null ? encodeURIComponent(url) : '';
}
static percentEncode(raw: string): string {
return raw != null ? encodeURIComponent(raw).replace('+', '%20')
.replace('*', '%2A').replace('%7E', '~') : null;
}
static pathEncode(path: string): string {
if (!path || path === '/') {
return path;
}
const paths = path.split('/');
const sb = [];
for (const s of paths) {
sb.push(TeaURL.percentEncode(s));
}
return sb.join('/');
}
}