From ce6622f8583af809c8f5c5fdb894e9b02665f8ee Mon Sep 17 00:00:00 2001 From: Phil Kunz Date: Sun, 2 May 2021 16:32:24 +0000 Subject: [PATCH] BREAKING CHANGE(core): update --- test/test.ts | 11 ++++- ts/smarturl.classes.smarturl.ts | 75 ++++++++++++++++++++++++++++++--- 2 files changed, 79 insertions(+), 7 deletions(-) diff --git a/test/test.ts b/test/test.ts index 0a19d80..b0aa898 100644 --- a/test/test.ts +++ b/test/test.ts @@ -9,8 +9,17 @@ tap.test('first test', async () => { }); tap.test('should parse an URL', async () => { - const parsedUrl = testSmarturl.parseUrl('https://lossless.com'); + const testUrl = 'https://lossless.com:3000/?some=cool&more=yes'; + // const urlMod = await import('url'); + // const altParsed = urlMod.parse(testUrl); + // console.log(altParsed); + const parsedUrl = smarturl.Smarturl.createFromUrl(testUrl, { + searchParams: { + more: 'overwritten' + } + }); console.log(parsedUrl); + console.log(parsedUrl.toString()); }); tap.start(); diff --git a/ts/smarturl.classes.smarturl.ts b/ts/smarturl.classes.smarturl.ts index 65489a3..13978c3 100644 --- a/ts/smarturl.classes.smarturl.ts +++ b/ts/smarturl.classes.smarturl.ts @@ -1,6 +1,6 @@ import * as plugins from './smarturl.plugins'; -export interface IUrlObject{ +export interface IUrlObject { href: string; origin: string; protocol: string; @@ -9,15 +9,52 @@ export interface IUrlObject{ host: string; hostname: string; port: string; + path: string; pathname: string; search: string; - searchParams: any; + searchParams: ISearchParams; hash: string; } -export class Smarturl { - public parseUrl(urlArg: string) { +export interface ISearchParams { + [key: string]: string; +} + +export class Smarturl implements IUrlObject { + public static createFromUrl( + urlArg: string, + optionsArg?: { + searchParams?: ISearchParams; + } + ): Smarturl { const parsedUrlInstance = new plugins.url.URL(urlArg); + const searchParams: ISearchParams = {}; + + // enrichment + const searchParamKeys = parsedUrlInstance.searchParams.keys(); + for (const key of searchParamKeys) { + searchParams[key] = parsedUrlInstance.searchParams.get(key); + } + if (optionsArg?.searchParams) { + for (const key of Object.keys(optionsArg.searchParams)) { + searchParams[key] = optionsArg.searchParams[key]; + } + } + + let path = parsedUrlInstance.pathname; + if (Object.keys(searchParams).length > 0) { + path += '?'; + let first = true; + for(const key of Object.keys(searchParams)) { + if (first) { + first = false; + } else { + path += '&'; + } + path += `${key}=${searchParams[key]}`; + } + } + const parsedUrl: IUrlObject = { href: parsedUrlInstance.href, origin: parsedUrlInstance.origin, @@ -27,11 +64,13 @@ export class Smarturl { host: parsedUrlInstance.host, hostname: parsedUrlInstance.hostname, port: parsedUrlInstance.port, + path, pathname: parsedUrlInstance.pathname, search: parsedUrlInstance.search, - searchParams: parsedUrlInstance.searchParams, + searchParams, hash: parsedUrlInstance.hash, }; + if (!parsedUrl.port && parsedUrl.protocol === 'https:') { // console.log(`inferring port 443 for "https:"`); parsedUrl.port = '443'; @@ -40,6 +79,30 @@ export class Smarturl { // console.log(`inferring port 80 for "http:"`); parsedUrl.port = '80'; } - return parsedUrl; + const returnSmarturl = new Smarturl(); + Object.assign(returnSmarturl, parsedUrl); + return returnSmarturl; + } + public static createFromParsedUrl() {} + + // INSTANCE + href: string; + origin: string; + protocol: string; + username: string; + password: string; + host: string; + hostname: string; + port: string; + path: string; + pathname: string; + search: string; + searchParams: ISearchParams; + hash: string; + + constructor() {} + + toString() { + return `${this.protocol}//${this.hostname}:${this.port}${this.path}` } }