@naverpay/nurl 0.0.4 → 0.0.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/cjs/index.js CHANGED
@@ -1,2 +1,2 @@
1
- "use strict";const i=require("npm-punycode"),f=/^:/,d=/^\[.*\]$/;function p(h){return f.test(h)||d.test(h)}function o(h){return h.split("/").filter(p)}function n(h){return h.slice(1,f.test(h)?void 0:-1)}function m(h,t){return o(h).reduce((s,e)=>{const r=n(e);return t[r]?s.replace(e,t[r]):s},h)}function u(h,t){return o(h).reduce((s,e)=>{const r=n(e),{[r]:_,...a}=s;return a},t)}const l=127;function P(h){return h.charCodeAt(0)>l}class c{constructor(t){if(this._href="",this._protocol="",this._host="",this._hostname="",this._port="",this._pathname="",this._search="",this._hash="",this._origin="",this._username="",this._password="",this._baseUrl="",this._searchParams=new URLSearchParams,this.punycodePrefix="xn--",this._searchParams=new URLSearchParams,typeof t=="string"||t instanceof URL)this.href=t.toString();else if(t){if(t.baseUrl&&(this.baseUrl=t.baseUrl),t.href&&(this.href=t.href),t.protocol&&(this.protocol=t.protocol),t.host&&(this.host=t.host),t.hostname&&(this.hostname=t.hostname),t.port&&(this.port=t.port),t.pathname&&(this.pathname=m(t.pathname,t.query??{})),t.search&&(this.search=t.search),t.hash&&(this.hash=t.hash),t.username&&(this.username=t.username),t.password&&(this.password=t.password),t.query){const s=u(t.pathname??"",t.query);Object.keys(s).length>0&&(this.search=new URLSearchParams(s).toString())}this.updateHref()}}static create(t){return new c(t)}static canParse(t){if(t.startsWith("/"))return/^\/[^?#]*(\?[^#]*)?(#.*)?$/.test(t);try{return new URL(t),!0}catch{return/^[^:/?#]+(\.[^:/?#]+)+(\/[^?#]*(\?[^#]*)?(#.*)?)?$/.test(t)}}get baseUrl(){return this._baseUrl}set baseUrl(t){this._baseUrl=t;try{const s=new URL(t);this._protocol=s.protocol,this._host=s.host,this._hostname=s.hostname,this._port=s.port,this._origin=s.origin,this._username=s.username,this._password=s.password,s.pathname!=="/"&&(this._pathname=s.pathname),s.search&&(this._search=s.search,this._searchParams=new URLSearchParams(s.search)),s.hash&&(this._hash=s.hash),this.updateHref()}catch(s){console.warn(`Invalid baseUrl: ${t}`,s)}}get href(){return this.pathname.length===1?`${this._href}/`:this._href}set href(t){try{const s=new URL(t);this._href=s.href,this._protocol=s.protocol,this._host=s.host,this._hostname=s.hostname,this._port=s.port,this._pathname=s.pathname,this._search=s.search,this._hash=s.hash,this._origin=s.origin,this._username=s.username,this._password=s.password,this._searchParams=s.searchParams}catch(s){console.warn(`Can not parse ${t}`,s)}}get protocol(){return this._protocol}set protocol(t){this._protocol=t,this.updateHref()}get host(){return this._host}set host(t){const[s,e]=t.split(":"),r=this.encodeHostname(s);this._host=e?`${r}:${e}`:r,this._hostname=r,this._port=e||"",this.updateHref()}get hostname(){return this._hostname}set hostname(t){const s=this.encodeHostname(t);this._hostname=s,this._host=this._port?`${s}:${this._port}`:s,this.updateHref()}get port(){return this._port}set port(t){this._port=t,this._host=`${this._hostname}${t?":"+t:""}`,this.updateHref()}get pathname(){return this._pathname}set pathname(t){const s=t.split("/").map(e=>p(e)?e:encodeURI(e)).join("/");this._pathname=s.startsWith("/")?s:`/${s}`,this.updateHref()}get search(){return this._search}set search(t){const s=encodeURI(t);this._search=s.startsWith("?")?s:`?${s}`,this._searchParams=new URLSearchParams(s),this.updateHref()}setSearchParams(t){const s=new URLSearchParams(t);this._search=s.toString()?`?${s.toString()}`:"",this._searchParams=s,this.updateHref()}appendSearchParams(t){const s=new URLSearchParams(this._searchParams),e=o(this._pathname).map(n);Object.keys(t).forEach(r=>{e.includes(r)?this._pathname=m(this._pathname,{[r]:t[r]}):s.append(r,t[r])}),this._search=s.toString()?`?${s.toString()}`:"",this._searchParams=s,this.updateHref()}removeSearchParams(...t){const s=new URLSearchParams(this._searchParams);t.forEach(e=>{s.delete(e)}),this._search=s.toString()?`?${s.toString()}`:"",this._searchParams=s,this.updateHref()}get searchParams(){return new Proxy(this._searchParams,{get:(t,s,e)=>{const r=Reflect.get(t,s,e);return typeof r=="function"?(..._)=>{const a=r.apply(t,_);return this._search=this._searchParams.toString()?`?${this._searchParams.toString()}`:"",this.updateHref(),a}:r}})}get hash(){return this._hash}set hash(t){this._hash=t.startsWith("#")?t:`#${t}`,this.updateHref()}get origin(){return this._origin}get username(){return this._username}set username(t){this._username=t,this.updateHref()}get password(){return this._password}set password(t){this._password=t,this.updateHref()}updateHref(){if(this._baseUrl){const t=new URL(this._baseUrl);t.pathname=this._pathname,t.search=this._search,t.hash=this._hash,this._href=t.href,this._origin=t.origin}else this._href=`${this._protocol}${this._protocol&&"//"}${this._username}${this._password?":"+this._password:""}${this._username||this._password?"@":""}${this._hostname}${this._port?":"+this._port:""}${this._pathname==="/"?"":this._pathname}${this._search}${this._hash}`,this._origin=`${this._protocol}//${this._hostname}${this._port?":"+this._port:""}`}toString(){return this.href}toJSON(){return this.href}encodeHostname(t){return t.split(".").map(s=>{for(const e of s)if(P(e))return`${this.punycodePrefix}${i.encode(s)}`;return s}).join(".")}get decodedIDN(){let t=this._href;return this._hostname.split(".").forEach(s=>{t=t.replace(s,i.decode(s.replace(this.punycodePrefix,"")))}),t}get decodedHostname(){return this._hostname.split(".").map(t=>i.decode(t.replace(this.punycodePrefix,""))).join(".")}}module.exports=c;
1
+ "use strict";const i=require("npm-punycode"),f=/^:/,d=/^\[.*\]$/;function p(h){return f.test(h)||d.test(h)}function o(h){return h.split("/").filter(p)}function n(h){return h.slice(1,f.test(h)?void 0:-1)}function m(h,t){return o(h).reduce((s,e)=>{const r=n(e);return t[r]?s.replace(e,t[r]):s},h)}function u(h,t){return o(h).reduce((s,e)=>{const r=n(e),{[r]:_,...a}=s;return a},t)}const l=127;function P(h){return h.charCodeAt(0)>l}class c{constructor(t){if(this._href="",this._protocol="",this._host="",this._hostname="",this._port="",this._pathname="",this._search="",this._hash="",this._origin="",this._username="",this._password="",this._baseUrl="",this._searchParams=new URLSearchParams,this.punycodePrefix="xn--",this._searchParams=new URLSearchParams,typeof t=="string"||t instanceof URL)this.href=t.toString();else if(t){if(t.baseUrl&&(this.baseUrl=t.baseUrl),t.href&&(this.href=t.href),t.protocol&&(this.protocol=t.protocol),t.host&&(this.host=t.host),t.hostname&&(this.hostname=t.hostname),t.port&&(this.port=t.port),t.pathname&&(this.pathname=m(t.pathname,t.query??{})),t.search&&(this.search=t.search),t.hash&&(this.hash=t.hash),t.username&&(this.username=t.username),t.password&&(this.password=t.password),t.query){const s=u(t.pathname??"",t.query);Object.keys(s).length>0&&(this.search=new URLSearchParams(s).toString())}this.updateHref()}}static create(t){return new c(t)}static canParse(t){if(t.startsWith("/"))return/^\/[^?#]*(\?[^#]*)?(#.*)?$/.test(t);try{return new URL(t),!0}catch{return/^[^:/?#]+(\.[^:/?#]+)+(\/[^?#]*(\?[^#]*)?(#.*)?)?$/.test(t)}}get baseUrl(){return this._baseUrl}set baseUrl(t){this._baseUrl=t;try{const s=new URL(t);this._protocol=s.protocol,this._host=s.host,this._hostname=s.hostname,this._port=s.port,this._origin=s.origin,this._username=s.username,this._password=s.password,s.pathname!=="/"&&(this._pathname=s.pathname),s.search&&(this._search=s.search,this._searchParams=new URLSearchParams(s.search)),s.hash&&(this._hash=s.hash),this.updateHref()}catch(s){console.warn(`Invalid baseUrl: ${t}`,s)}}get href(){return this.pathname.length===1?`${this._href}/`:this._href}set href(t){try{const s=new URL(t);this._href=s.href,this._protocol=s.protocol,this._host=s.host,this._hostname=s.hostname,this._port=s.port,this._pathname=s.pathname,this._search=s.search,this._hash=s.hash,this._origin=s.origin,this._username=s.username,this._password=s.password,this._searchParams=s.searchParams}catch(s){console.warn(`Can not parse ${t}`,s)}}get protocol(){return this._protocol}set protocol(t){this._protocol=t,this.updateHref()}get host(){return this._host}set host(t){const[s,e]=t.split(":"),r=this.encodeHostname(s);this._host=e?`${r}:${e}`:r,this._hostname=r,this._port=e||"",this.updateHref()}get hostname(){return this._hostname}set hostname(t){const s=this.encodeHostname(t);this._hostname=s,this._host=this._port?`${s}:${this._port}`:s,this.updateHref()}get port(){return this._port}set port(t){this._port=t,this._host=`${this._hostname}${t?":"+t:""}`,this.updateHref()}get pathname(){return this._pathname}set pathname(t){const s=t.split("/").map(e=>p(e)?e:encodeURI(e)).join("/");this._pathname=s.startsWith("/")?s:`/${s}`,this.updateHref()}get search(){return this._search}set search(t){this._search=t.startsWith("?")?t:`?${t}`,this._searchParams=new URLSearchParams(t),this.updateHref()}setSearchParams(t){const s=new URLSearchParams(t);this._search=s.toString()?`?${s.toString()}`:"",this._searchParams=s,this.updateHref()}appendSearchParams(t){const s=new URLSearchParams(this._searchParams),e=o(this._pathname).map(n);Object.keys(t).forEach(r=>{e.includes(r)?this._pathname=m(this._pathname,{[r]:t[r]}):s.append(r,t[r])}),this._search=s.toString()?`?${s.toString()}`:"",this._searchParams=s,this.updateHref()}removeSearchParams(...t){const s=new URLSearchParams(this._searchParams);t.forEach(e=>{s.delete(e)}),this._search=s.toString()?`?${s.toString()}`:"",this._searchParams=s,this.updateHref()}get searchParams(){return new Proxy(this._searchParams,{get:(t,s,e)=>{const r=Reflect.get(t,s,e);return typeof r=="function"?(..._)=>{const a=r.apply(t,_);return this._search=this._searchParams.toString()?`?${this._searchParams.toString()}`:"",this.updateHref(),a}:r}})}get hash(){return this._hash}set hash(t){this._hash=t.startsWith("#")?t:`#${t}`,this.updateHref()}get origin(){return this._origin}get username(){return this._username}set username(t){this._username=t,this.updateHref()}get password(){return this._password}set password(t){this._password=t,this.updateHref()}updateHref(){if(this._baseUrl){const t=new URL(this._baseUrl);t.pathname=this._pathname,t.search=this._search,t.hash=this._hash,this._href=t.href,this._origin=t.origin}else this._href=`${this._protocol}${this._protocol&&"//"}${this._username}${this._password?":"+this._password:""}${this._username||this._password?"@":""}${this._hostname}${this._port?":"+this._port:""}${this._pathname==="/"?"":this._pathname}${this._search}${this._hash}`,this._origin=`${this._protocol}//${this._hostname}${this._port?":"+this._port:""}`}toString(){return this.href}toJSON(){return this.href}encodeHostname(t){return t.split(".").map(s=>{for(const e of s)if(P(e))return`${this.punycodePrefix}${i.encode(s)}`;return s}).join(".")}get decodedIDN(){let t=this._href;return this._hostname.split(".").forEach(s=>{t=t.replace(s,i.decode(s.replace(this.punycodePrefix,"")))}),t}get decodedHostname(){return this._hostname.split(".").map(t=>i.decode(t.replace(this.punycodePrefix,""))).join(".")}}module.exports=c;
2
2
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../../src/utils.ts","../../src/nurl.ts"],"sourcesContent":["const DYNAMIC_PATH_COLON_REGEXP = /^:/\nconst DYNAMIC_PATH_BRACKETS_REGEXP = /^\\[.*\\]$/\n\nexport function isDynamicPath(path: string) {\n return DYNAMIC_PATH_COLON_REGEXP.test(path) || DYNAMIC_PATH_BRACKETS_REGEXP.test(path)\n}\n\nexport function getDynamicPaths(pathname: string): string[] {\n return pathname.split('/').filter(isDynamicPath)\n}\n\nexport function extractPathKey(path: string): string {\n return path.slice(1, DYNAMIC_PATH_COLON_REGEXP.test(path) ? undefined : -1)\n}\n\n/**\n * Replaces dynamic paths in the pathname with values from the query\n * @param {string} pathname\n * @param {Record<string, string>} query\n * @returns {string} refined pathname\n */\nexport function refinePathnameWithQuery(pathname: string, query: Record<string, string>): string {\n return getDynamicPaths(pathname).reduce((acc, path) => {\n const pathKey = extractPathKey(path)\n return query[pathKey] ? acc.replace(path, query[pathKey]) : acc\n }, pathname)\n}\n\n/**\n * Removes queries that have already been used in the pathname.\n * @param {string} pathname\n * @param {Record<string, string>} query\n * @returns {Record<string, string>} refined query\n */\nexport function refineQueryWithPathname(pathname: string, query: Record<string, string>): Record<string, string> {\n return getDynamicPaths(pathname).reduce((acc, path) => {\n const pathKey = extractPathKey(path)\n const {[pathKey]: _, ...remainingQuery} = acc\n return remainingQuery\n }, query)\n}\n\nconst MAX_ASCII_CODE = 127\nexport function isASCIICodeChar(char: string) {\n return char.charCodeAt(0) > MAX_ASCII_CODE\n}\n","/**\n * Note: We use 'npm-punycode' alias instead of 'punycode/' to properly support dual packages in ESM.\n * This ensures that this third-party module is used instead of the built-in\n * Node.js 'punycode' module, which has been deprecated since Node.js v7.0.0.\n * @see https://github.com/mathiasbynens/punycode.js#installation\n * @see https://nodejs.org/api/punycode.html for deprecation info\n */\nimport {decode, encode} from 'npm-punycode'\n\nimport {\n extractPathKey,\n getDynamicPaths,\n isASCIICodeChar,\n isDynamicPath,\n refinePathnameWithQuery,\n refineQueryWithPathname,\n} from './utils'\n\ninterface URLOptions extends Partial<URL> {\n baseUrl?: string\n query?: Record<string, string>\n}\n\nexport default class NURL implements URL {\n private _href: string = ''\n private _protocol: string = ''\n private _host: string = ''\n private _hostname: string = ''\n private _port: string = ''\n private _pathname: string = ''\n private _search: string = ''\n private _hash: string = ''\n private _origin: string = ''\n private _username: string = ''\n private _password: string = ''\n private _baseUrl: string = ''\n private _searchParams: URLSearchParams = new URLSearchParams()\n\n constructor(input?: string | URL | URLOptions) {\n this._searchParams = new URLSearchParams()\n if (typeof input === 'string' || input instanceof URL) {\n this.href = input.toString()\n } else if (input) {\n if (input.baseUrl) {\n this.baseUrl = input.baseUrl\n }\n if (input.href) {\n this.href = input.href\n }\n if (input.protocol) {\n this.protocol = input.protocol\n }\n if (input.host) {\n this.host = input.host\n }\n if (input.hostname) {\n this.hostname = input.hostname\n }\n if (input.port) {\n this.port = input.port\n }\n if (input.pathname) {\n this.pathname = refinePathnameWithQuery(input.pathname, input.query ?? {})\n }\n if (input.search) {\n this.search = input.search\n }\n if (input.hash) {\n this.hash = input.hash\n }\n if (input.username) {\n this.username = input.username\n }\n if (input.password) {\n this.password = input.password\n }\n if (input.query) {\n const refinedQuery = refineQueryWithPathname(input.pathname ?? '', input.query)\n if (Object.keys(refinedQuery).length > 0) {\n this.search = new URLSearchParams(refinedQuery).toString()\n }\n }\n this.updateHref()\n }\n }\n\n static create(input?: string | URL | URLOptions) {\n return new NURL(input)\n }\n\n static canParse(input: string): boolean {\n if (input.startsWith('/')) {\n return /^\\/[^?#]*(\\?[^#]*)?(#.*)?$/.test(input)\n }\n\n try {\n // eslint-disable-next-line no-new\n new URL(input)\n return true\n } catch {\n // URL 생성자로 파싱할 수 없는 경우, 추가적인 검사를 수행\n // 예: 'example.com' 또는 'example.com/path'와 같은 형식 허용\n return /^[^:/?#]+(\\.[^:/?#]+)+(\\/[^?#]*(\\?[^#]*)?(#.*)?)?$/.test(input)\n }\n }\n\n get baseUrl(): string {\n return this._baseUrl\n }\n\n set baseUrl(value: string) {\n this._baseUrl = value\n try {\n const url = new URL(value)\n this._protocol = url.protocol\n this._host = url.host\n this._hostname = url.hostname\n this._port = url.port\n this._origin = url.origin\n this._username = url.username\n this._password = url.password\n if (url.pathname !== '/') {\n this._pathname = url.pathname\n }\n if (url.search) {\n this._search = url.search\n this._searchParams = new URLSearchParams(url.search)\n }\n if (url.hash) {\n this._hash = url.hash\n }\n this.updateHref()\n } catch (error) {\n // eslint-disable-next-line no-console\n console.warn(`Invalid baseUrl: ${value}`, error)\n }\n }\n\n get href(): string {\n return this.pathname.length === 1 ? `${this._href}/` : this._href\n }\n\n set href(value: string) {\n try {\n const url = new URL(value)\n this._href = url.href\n this._protocol = url.protocol\n this._host = url.host\n this._hostname = url.hostname\n this._port = url.port\n this._pathname = url.pathname\n this._search = url.search\n this._hash = url.hash\n this._origin = url.origin\n this._username = url.username\n this._password = url.password\n this._searchParams = url.searchParams\n } catch (error) {\n // eslint-disable-next-line no-console\n console.warn(`Can not parse ${value}`, error)\n }\n }\n\n get protocol(): string {\n return this._protocol\n }\n\n set protocol(value: string) {\n this._protocol = value\n this.updateHref()\n }\n\n get host(): string {\n return this._host\n }\n\n set host(value: string) {\n const [hostname, port] = value.split(':')\n\n const encodedHostname = this.encodeHostname(hostname)\n\n this._host = port ? `${encodedHostname}:${port}` : encodedHostname\n this._hostname = encodedHostname\n this._port = port || ''\n this.updateHref()\n }\n\n get hostname(): string {\n return this._hostname\n }\n\n set hostname(value: string) {\n const encodedHostname = this.encodeHostname(value)\n\n this._hostname = encodedHostname\n this._host = this._port ? `${encodedHostname}:${this._port}` : encodedHostname\n this.updateHref()\n }\n\n get port(): string {\n return this._port\n }\n\n set port(value: string) {\n this._port = value\n this._host = `${this._hostname}${value ? ':' + value : ''}`\n this.updateHref()\n }\n\n get pathname(): string {\n return this._pathname\n }\n\n set pathname(pathname: string) {\n const encodedPathname = pathname\n .split('/')\n .map((segment) => (isDynamicPath(segment) ? segment : encodeURI(segment)))\n .join('/')\n\n this._pathname = encodedPathname.startsWith('/') ? encodedPathname : `/${encodedPathname}`\n this.updateHref()\n }\n\n get search(): string {\n return this._search\n }\n\n set search(search: string) {\n const encodedSearch = encodeURI(search)\n this._search = encodedSearch.startsWith('?') ? encodedSearch : `?${encodedSearch}`\n this._searchParams = new URLSearchParams(encodedSearch)\n this.updateHref()\n }\n\n setSearchParams(_params: Record<string, string>): void {\n const searchParams = new URLSearchParams(_params)\n\n this._search = searchParams.toString() ? `?${searchParams.toString()}` : ''\n this._searchParams = searchParams\n this.updateHref()\n }\n\n appendSearchParams(_params: Record<string, string>): void {\n const searchParams = new URLSearchParams(this._searchParams)\n const dynamicRoutes = getDynamicPaths(this._pathname).map(extractPathKey)\n\n Object.keys(_params).forEach((key) => {\n if (dynamicRoutes.includes(key)) {\n this._pathname = refinePathnameWithQuery(this._pathname, {[key]: _params[key]})\n } else {\n searchParams.append(key, _params[key])\n }\n })\n\n this._search = searchParams.toString() ? `?${searchParams.toString()}` : ''\n this._searchParams = searchParams\n this.updateHref()\n }\n\n removeSearchParams(..._keys: string[]): void {\n const searchParams = new URLSearchParams(this._searchParams)\n\n _keys.forEach((key) => {\n searchParams.delete(key)\n })\n\n this._search = searchParams.toString() ? `?${searchParams.toString()}` : ''\n this._searchParams = searchParams\n this.updateHref()\n }\n\n get searchParams(): URLSearchParams {\n return new Proxy(this._searchParams, {\n get: (target, prop, receiver) => {\n const value = Reflect.get(target, prop, receiver)\n if (typeof value === 'function') {\n return (...args: unknown[]) => {\n const result = value.apply(target, args)\n this._search = this._searchParams.toString() ? `?${this._searchParams.toString()}` : ''\n this.updateHref()\n return result\n }\n }\n return value\n },\n })\n }\n\n get hash(): string {\n return this._hash\n }\n\n set hash(value: string) {\n this._hash = value.startsWith('#') ? value : `#${value}`\n this.updateHref()\n }\n\n get origin(): string {\n return this._origin\n }\n\n get username(): string {\n return this._username\n }\n\n set username(value: string) {\n this._username = value\n this.updateHref()\n }\n\n get password(): string {\n return this._password\n }\n\n set password(value: string) {\n this._password = value\n this.updateHref()\n }\n\n private updateHref() {\n if (this._baseUrl) {\n const baseUrl = new URL(this._baseUrl)\n baseUrl.pathname = this._pathname\n baseUrl.search = this._search\n baseUrl.hash = this._hash\n this._href = baseUrl.href\n this._origin = baseUrl.origin\n } else {\n this._href = `${this._protocol}${this._protocol && '//'}${this._username}${this._password ? ':' + this._password : ''}${\n this._username || this._password ? '@' : ''\n }${this._hostname}${this._port ? ':' + this._port : ''}${this._pathname === '/' ? '' : this._pathname}${this._search}${this._hash}`\n\n this._origin = `${this._protocol}//${this._hostname}${this._port ? ':' + this._port : ''}`\n }\n }\n\n toString(): string {\n return this.href\n }\n\n toJSON(): string {\n return this.href\n }\n\n private punycodePrefix = 'xn--'\n\n private encodeHostname(hostname: string): string {\n return hostname\n .split('.')\n .map((segment) => {\n for (const char of segment) {\n if (isASCIICodeChar(char)) {\n return `${this.punycodePrefix}${encode(segment)}`\n }\n }\n return segment\n })\n .join('.')\n }\n\n get decodedIDN(): string {\n let href = this._href\n\n this._hostname.split('.').forEach((segment) => {\n href = href.replace(segment, decode(segment.replace(this.punycodePrefix, '')))\n })\n\n return href\n }\n\n get decodedHostname(): string {\n return this._hostname\n .split('.')\n .map((segment) => decode(segment.replace(this.punycodePrefix, '')))\n .join('.')\n }\n}\n"],"names":["DYNAMIC_PATH_COLON_REGEXP","DYNAMIC_PATH_BRACKETS_REGEXP","isDynamicPath","path","test","getDynamicPaths","pathname","split","filter","extractPathKey","slice","refinePathnameWithQuery","query","reduce","acc","pathKey","replace","refineQueryWithPathname","_","remainingQuery","MAX_ASCII_CODE","isASCIICodeChar","char","charCodeAt","NURL","constructor","input","_href","_protocol","_host","_hostname","_port","_pathname","_search","_hash","_origin","_username","_password","_baseUrl","_searchParams","URLSearchParams","punycodePrefix","URL","href","toString","baseUrl","protocol","host","hostname","port","search","hash","username","password","refinedQuery","Object","keys","length","updateHref","create","canParse","startsWith","value","url","origin","error","console","warn","searchParams","encodedHostname","encodeHostname","encodedPathname","map","segment","encodeURI","join","encodedSearch","setSearchParams","_params","appendSearchParams","dynamicRoutes","forEach","key","includes","append","removeSearchParams","_keys","delete","Proxy","get","target","prop","receiver","Reflect","args","result","apply","toJSON","encode","decodedIDN","decode","decodedHostname"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sources":["../../src/utils.ts","../../src/nurl.ts"],"sourcesContent":["const DYNAMIC_PATH_COLON_REGEXP = /^:/\nconst DYNAMIC_PATH_BRACKETS_REGEXP = /^\\[.*\\]$/\n\nexport function isDynamicPath(path: string) {\n return DYNAMIC_PATH_COLON_REGEXP.test(path) || DYNAMIC_PATH_BRACKETS_REGEXP.test(path)\n}\n\nexport function getDynamicPaths(pathname: string): string[] {\n return pathname.split('/').filter(isDynamicPath)\n}\n\nexport function extractPathKey(path: string): string {\n return path.slice(1, DYNAMIC_PATH_COLON_REGEXP.test(path) ? undefined : -1)\n}\n\n/**\n * Replaces dynamic paths in the pathname with values from the query\n * @param {string} pathname\n * @param {Record<string, string>} query\n * @returns {string} refined pathname\n */\nexport function refinePathnameWithQuery(pathname: string, query: Record<string, string>): string {\n return getDynamicPaths(pathname).reduce((acc, path) => {\n const pathKey = extractPathKey(path)\n return query[pathKey] ? acc.replace(path, query[pathKey]) : acc\n }, pathname)\n}\n\n/**\n * Removes queries that have already been used in the pathname.\n * @param {string} pathname\n * @param {Record<string, string>} query\n * @returns {Record<string, string>} refined query\n */\nexport function refineQueryWithPathname(pathname: string, query: Record<string, string>): Record<string, string> {\n return getDynamicPaths(pathname).reduce((acc, path) => {\n const pathKey = extractPathKey(path)\n const {[pathKey]: _, ...remainingQuery} = acc\n return remainingQuery\n }, query)\n}\n\nconst MAX_ASCII_CODE = 127\nexport function isASCIICodeChar(char: string) {\n return char.charCodeAt(0) > MAX_ASCII_CODE\n}\n","/**\n * Note: We use 'npm-punycode' alias instead of 'punycode/' to properly support dual packages in ESM.\n * This ensures that this third-party module is used instead of the built-in\n * Node.js 'punycode' module, which has been deprecated since Node.js v7.0.0.\n * @see https://github.com/mathiasbynens/punycode.js#installation\n * @see https://nodejs.org/api/punycode.html for deprecation info\n */\nimport punycode from 'npm-punycode'\n\nimport {\n extractPathKey,\n getDynamicPaths,\n isASCIICodeChar,\n isDynamicPath,\n refinePathnameWithQuery,\n refineQueryWithPathname,\n} from './utils'\n\ninterface URLOptions extends Partial<URL> {\n baseUrl?: string\n query?: Record<string, string>\n}\n\nexport default class NURL implements URL {\n private _href: string = ''\n private _protocol: string = ''\n private _host: string = ''\n private _hostname: string = ''\n private _port: string = ''\n private _pathname: string = ''\n private _search: string = ''\n private _hash: string = ''\n private _origin: string = ''\n private _username: string = ''\n private _password: string = ''\n private _baseUrl: string = ''\n private _searchParams: URLSearchParams = new URLSearchParams()\n\n constructor(input?: string | URL | URLOptions) {\n this._searchParams = new URLSearchParams()\n if (typeof input === 'string' || input instanceof URL) {\n this.href = input.toString()\n } else if (input) {\n if (input.baseUrl) {\n this.baseUrl = input.baseUrl\n }\n if (input.href) {\n this.href = input.href\n }\n if (input.protocol) {\n this.protocol = input.protocol\n }\n if (input.host) {\n this.host = input.host\n }\n if (input.hostname) {\n this.hostname = input.hostname\n }\n if (input.port) {\n this.port = input.port\n }\n if (input.pathname) {\n this.pathname = refinePathnameWithQuery(input.pathname, input.query ?? {})\n }\n if (input.search) {\n this.search = input.search\n }\n if (input.hash) {\n this.hash = input.hash\n }\n if (input.username) {\n this.username = input.username\n }\n if (input.password) {\n this.password = input.password\n }\n if (input.query) {\n const refinedQuery = refineQueryWithPathname(input.pathname ?? '', input.query)\n if (Object.keys(refinedQuery).length > 0) {\n this.search = new URLSearchParams(refinedQuery).toString()\n }\n }\n this.updateHref()\n }\n }\n\n static create(input?: string | URL | URLOptions) {\n return new NURL(input)\n }\n\n static canParse(input: string): boolean {\n if (input.startsWith('/')) {\n return /^\\/[^?#]*(\\?[^#]*)?(#.*)?$/.test(input)\n }\n\n try {\n // eslint-disable-next-line no-new\n new URL(input)\n return true\n } catch {\n // URL 생성자로 파싱할 수 없는 경우, 추가적인 검사를 수행\n // 예: 'example.com' 또는 'example.com/path'와 같은 형식 허용\n return /^[^:/?#]+(\\.[^:/?#]+)+(\\/[^?#]*(\\?[^#]*)?(#.*)?)?$/.test(input)\n }\n }\n\n get baseUrl(): string {\n return this._baseUrl\n }\n\n set baseUrl(value: string) {\n this._baseUrl = value\n try {\n const url = new URL(value)\n this._protocol = url.protocol\n this._host = url.host\n this._hostname = url.hostname\n this._port = url.port\n this._origin = url.origin\n this._username = url.username\n this._password = url.password\n if (url.pathname !== '/') {\n this._pathname = url.pathname\n }\n if (url.search) {\n this._search = url.search\n this._searchParams = new URLSearchParams(url.search)\n }\n if (url.hash) {\n this._hash = url.hash\n }\n this.updateHref()\n } catch (error) {\n // eslint-disable-next-line no-console\n console.warn(`Invalid baseUrl: ${value}`, error)\n }\n }\n\n get href(): string {\n return this.pathname.length === 1 ? `${this._href}/` : this._href\n }\n\n set href(value: string) {\n try {\n const url = new URL(value)\n this._href = url.href\n this._protocol = url.protocol\n this._host = url.host\n this._hostname = url.hostname\n this._port = url.port\n this._pathname = url.pathname\n this._search = url.search\n this._hash = url.hash\n this._origin = url.origin\n this._username = url.username\n this._password = url.password\n this._searchParams = url.searchParams\n } catch (error) {\n // eslint-disable-next-line no-console\n console.warn(`Can not parse ${value}`, error)\n }\n }\n\n get protocol(): string {\n return this._protocol\n }\n\n set protocol(value: string) {\n this._protocol = value\n this.updateHref()\n }\n\n get host(): string {\n return this._host\n }\n\n set host(value: string) {\n const [hostname, port] = value.split(':')\n\n const encodedHostname = this.encodeHostname(hostname)\n\n this._host = port ? `${encodedHostname}:${port}` : encodedHostname\n this._hostname = encodedHostname\n this._port = port || ''\n this.updateHref()\n }\n\n get hostname(): string {\n return this._hostname\n }\n\n set hostname(value: string) {\n const encodedHostname = this.encodeHostname(value)\n\n this._hostname = encodedHostname\n this._host = this._port ? `${encodedHostname}:${this._port}` : encodedHostname\n this.updateHref()\n }\n\n get port(): string {\n return this._port\n }\n\n set port(value: string) {\n this._port = value\n this._host = `${this._hostname}${value ? ':' + value : ''}`\n this.updateHref()\n }\n\n get pathname(): string {\n return this._pathname\n }\n\n set pathname(pathname: string) {\n const encodedPathname = pathname\n .split('/')\n .map((segment) => (isDynamicPath(segment) ? segment : encodeURI(segment)))\n .join('/')\n\n this._pathname = encodedPathname.startsWith('/') ? encodedPathname : `/${encodedPathname}`\n this.updateHref()\n }\n\n get search(): string {\n return this._search\n }\n\n set search(search: string) {\n this._search = search.startsWith('?') ? search : `?${search}`\n this._searchParams = new URLSearchParams(search)\n this.updateHref()\n }\n\n setSearchParams(_params: Record<string, string>): void {\n const searchParams = new URLSearchParams(_params)\n\n this._search = searchParams.toString() ? `?${searchParams.toString()}` : ''\n this._searchParams = searchParams\n this.updateHref()\n }\n\n appendSearchParams(_params: Record<string, string>): void {\n const searchParams = new URLSearchParams(this._searchParams)\n const dynamicRoutes = getDynamicPaths(this._pathname).map(extractPathKey)\n\n Object.keys(_params).forEach((key) => {\n if (dynamicRoutes.includes(key)) {\n this._pathname = refinePathnameWithQuery(this._pathname, {[key]: _params[key]})\n } else {\n searchParams.append(key, _params[key])\n }\n })\n\n this._search = searchParams.toString() ? `?${searchParams.toString()}` : ''\n this._searchParams = searchParams\n this.updateHref()\n }\n\n removeSearchParams(..._keys: string[]): void {\n const searchParams = new URLSearchParams(this._searchParams)\n\n _keys.forEach((key) => {\n searchParams.delete(key)\n })\n\n this._search = searchParams.toString() ? `?${searchParams.toString()}` : ''\n this._searchParams = searchParams\n this.updateHref()\n }\n\n get searchParams(): URLSearchParams {\n return new Proxy(this._searchParams, {\n get: (target, prop, receiver) => {\n const value = Reflect.get(target, prop, receiver)\n if (typeof value === 'function') {\n return (...args: unknown[]) => {\n const result = value.apply(target, args)\n this._search = this._searchParams.toString() ? `?${this._searchParams.toString()}` : ''\n this.updateHref()\n return result\n }\n }\n return value\n },\n })\n }\n\n get hash(): string {\n return this._hash\n }\n\n set hash(value: string) {\n this._hash = value.startsWith('#') ? value : `#${value}`\n this.updateHref()\n }\n\n get origin(): string {\n return this._origin\n }\n\n get username(): string {\n return this._username\n }\n\n set username(value: string) {\n this._username = value\n this.updateHref()\n }\n\n get password(): string {\n return this._password\n }\n\n set password(value: string) {\n this._password = value\n this.updateHref()\n }\n\n private updateHref() {\n if (this._baseUrl) {\n const baseUrl = new URL(this._baseUrl)\n baseUrl.pathname = this._pathname\n baseUrl.search = this._search\n baseUrl.hash = this._hash\n this._href = baseUrl.href\n this._origin = baseUrl.origin\n } else {\n this._href = `${this._protocol}${this._protocol && '//'}${this._username}${this._password ? ':' + this._password : ''}${\n this._username || this._password ? '@' : ''\n }${this._hostname}${this._port ? ':' + this._port : ''}${this._pathname === '/' ? '' : this._pathname}${this._search}${this._hash}`\n\n this._origin = `${this._protocol}//${this._hostname}${this._port ? ':' + this._port : ''}`\n }\n }\n\n toString(): string {\n return this.href\n }\n\n toJSON(): string {\n return this.href\n }\n\n private punycodePrefix = 'xn--'\n\n private encodeHostname(hostname: string): string {\n return hostname\n .split('.')\n .map((segment) => {\n for (const char of segment) {\n if (isASCIICodeChar(char)) {\n return `${this.punycodePrefix}${punycode.encode(segment)}`\n }\n }\n return segment\n })\n .join('.')\n }\n\n get decodedIDN(): string {\n let href = this._href\n\n this._hostname.split('.').forEach((segment) => {\n href = href.replace(segment, punycode.decode(segment.replace(this.punycodePrefix, '')))\n })\n\n return href\n }\n\n get decodedHostname(): string {\n return this._hostname\n .split('.')\n .map((segment) => punycode.decode(segment.replace(this.punycodePrefix, '')))\n .join('.')\n }\n}\n"],"names":["DYNAMIC_PATH_COLON_REGEXP","DYNAMIC_PATH_BRACKETS_REGEXP","isDynamicPath","path","test","getDynamicPaths","pathname","split","filter","extractPathKey","slice","refinePathnameWithQuery","query","reduce","acc","pathKey","replace","refineQueryWithPathname","_","remainingQuery","MAX_ASCII_CODE","isASCIICodeChar","char","charCodeAt","NURL","constructor","input","_href","_protocol","_host","_hostname","_port","_pathname","_search","_hash","_origin","_username","_password","_baseUrl","_searchParams","URLSearchParams","punycodePrefix","URL","href","toString","baseUrl","protocol","host","hostname","port","search","hash","username","password","refinedQuery","Object","keys","length","updateHref","create","canParse","startsWith","value","url","origin","error","console","warn","searchParams","encodedHostname","encodeHostname","encodedPathname","map","segment","encodeURI","join","setSearchParams","_params","appendSearchParams","dynamicRoutes","forEach","key","includes","append","removeSearchParams","_keys","delete","Proxy","get","target","prop","receiver","Reflect","args","result","apply","toJSON","punycode","encode","decodedIDN","decode","decodedHostname"],"mappings":"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"}
@@ -1,32 +1,32 @@
1
- import { encode as d, decode as c } from "npm-punycode";
2
- const m = /^:/, u = /^\[.*\]$/;
1
+ import i from "npm-punycode";
2
+ const m = /^:/, d = /^\[.*\]$/;
3
3
  function f(h) {
4
- return m.test(h) || u.test(h);
4
+ return m.test(h) || d.test(h);
5
5
  }
6
- function i(h) {
6
+ function o(h) {
7
7
  return h.split("/").filter(f);
8
8
  }
9
- function o(h) {
9
+ function n(h) {
10
10
  return h.slice(1, m.test(h) ? void 0 : -1);
11
11
  }
12
12
  function _(h, t) {
13
- return i(h).reduce((s, e) => {
14
- const r = o(e);
13
+ return o(h).reduce((s, e) => {
14
+ const r = n(e);
15
15
  return t[r] ? s.replace(e, t[r]) : s;
16
16
  }, h);
17
17
  }
18
- function l(h, t) {
19
- return i(h).reduce((s, e) => {
20
- const r = o(e), {
21
- [r]: n,
18
+ function u(h, t) {
19
+ return o(h).reduce((s, e) => {
20
+ const r = n(e), {
21
+ [r]: c,
22
22
  ...a
23
23
  } = s;
24
24
  return a;
25
25
  }, t);
26
26
  }
27
- const P = 127;
28
- function g(h) {
29
- return h.charCodeAt(0) > P;
27
+ const l = 127;
28
+ function P(h) {
29
+ return h.charCodeAt(0) > l;
30
30
  }
31
31
  class p {
32
32
  constructor(t) {
@@ -34,7 +34,7 @@ class p {
34
34
  this.href = t.toString();
35
35
  else if (t) {
36
36
  if (t.baseUrl && (this.baseUrl = t.baseUrl), t.href && (this.href = t.href), t.protocol && (this.protocol = t.protocol), t.host && (this.host = t.host), t.hostname && (this.hostname = t.hostname), t.port && (this.port = t.port), t.pathname && (this.pathname = _(t.pathname, t.query ?? {})), t.search && (this.search = t.search), t.hash && (this.hash = t.hash), t.username && (this.username = t.username), t.password && (this.password = t.password), t.query) {
37
- const s = l(t.pathname ?? "", t.query);
37
+ const s = u(t.pathname ?? "", t.query);
38
38
  Object.keys(s).length > 0 && (this.search = new URLSearchParams(s).toString());
39
39
  }
40
40
  this.updateHref();
@@ -112,15 +112,14 @@ class p {
112
112
  return this._search;
113
113
  }
114
114
  set search(t) {
115
- const s = encodeURI(t);
116
- this._search = s.startsWith("?") ? s : `?${s}`, this._searchParams = new URLSearchParams(s), this.updateHref();
115
+ this._search = t.startsWith("?") ? t : `?${t}`, this._searchParams = new URLSearchParams(t), this.updateHref();
117
116
  }
118
117
  setSearchParams(t) {
119
118
  const s = new URLSearchParams(t);
120
119
  this._search = s.toString() ? `?${s.toString()}` : "", this._searchParams = s, this.updateHref();
121
120
  }
122
121
  appendSearchParams(t) {
123
- const s = new URLSearchParams(this._searchParams), e = i(this._pathname).map(o);
122
+ const s = new URLSearchParams(this._searchParams), e = o(this._pathname).map(n);
124
123
  Object.keys(t).forEach((r) => {
125
124
  e.includes(r) ? this._pathname = _(this._pathname, {
126
125
  [r]: t[r]
@@ -137,8 +136,8 @@ class p {
137
136
  return new Proxy(this._searchParams, {
138
137
  get: (t, s, e) => {
139
138
  const r = Reflect.get(t, s, e);
140
- return typeof r == "function" ? (...n) => {
141
- const a = r.apply(t, n);
139
+ return typeof r == "function" ? (...c) => {
140
+ const a = r.apply(t, c);
142
141
  return this._search = this._searchParams.toString() ? `?${this._searchParams.toString()}` : "", this.updateHref(), a;
143
142
  } : r;
144
143
  }
@@ -181,19 +180,19 @@ class p {
181
180
  encodeHostname(t) {
182
181
  return t.split(".").map((s) => {
183
182
  for (const e of s)
184
- if (g(e))
185
- return `${this.punycodePrefix}${d(s)}`;
183
+ if (P(e))
184
+ return `${this.punycodePrefix}${i.encode(s)}`;
186
185
  return s;
187
186
  }).join(".");
188
187
  }
189
188
  get decodedIDN() {
190
189
  let t = this._href;
191
190
  return this._hostname.split(".").forEach((s) => {
192
- t = t.replace(s, c(s.replace(this.punycodePrefix, "")));
191
+ t = t.replace(s, i.decode(s.replace(this.punycodePrefix, "")));
193
192
  }), t;
194
193
  }
195
194
  get decodedHostname() {
196
- return this._hostname.split(".").map((t) => c(t.replace(this.punycodePrefix, ""))).join(".");
195
+ return this._hostname.split(".").map((t) => i.decode(t.replace(this.punycodePrefix, ""))).join(".");
197
196
  }
198
197
  }
199
198
  export {
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","sources":["../../src/utils.ts","../../src/nurl.ts"],"sourcesContent":["const DYNAMIC_PATH_COLON_REGEXP = /^:/\nconst DYNAMIC_PATH_BRACKETS_REGEXP = /^\\[.*\\]$/\n\nexport function isDynamicPath(path: string) {\n return DYNAMIC_PATH_COLON_REGEXP.test(path) || DYNAMIC_PATH_BRACKETS_REGEXP.test(path)\n}\n\nexport function getDynamicPaths(pathname: string): string[] {\n return pathname.split('/').filter(isDynamicPath)\n}\n\nexport function extractPathKey(path: string): string {\n return path.slice(1, DYNAMIC_PATH_COLON_REGEXP.test(path) ? undefined : -1)\n}\n\n/**\n * Replaces dynamic paths in the pathname with values from the query\n * @param {string} pathname\n * @param {Record<string, string>} query\n * @returns {string} refined pathname\n */\nexport function refinePathnameWithQuery(pathname: string, query: Record<string, string>): string {\n return getDynamicPaths(pathname).reduce((acc, path) => {\n const pathKey = extractPathKey(path)\n return query[pathKey] ? acc.replace(path, query[pathKey]) : acc\n }, pathname)\n}\n\n/**\n * Removes queries that have already been used in the pathname.\n * @param {string} pathname\n * @param {Record<string, string>} query\n * @returns {Record<string, string>} refined query\n */\nexport function refineQueryWithPathname(pathname: string, query: Record<string, string>): Record<string, string> {\n return getDynamicPaths(pathname).reduce((acc, path) => {\n const pathKey = extractPathKey(path)\n const {[pathKey]: _, ...remainingQuery} = acc\n return remainingQuery\n }, query)\n}\n\nconst MAX_ASCII_CODE = 127\nexport function isASCIICodeChar(char: string) {\n return char.charCodeAt(0) > MAX_ASCII_CODE\n}\n","/**\n * Note: We use 'npm-punycode' alias instead of 'punycode/' to properly support dual packages in ESM.\n * This ensures that this third-party module is used instead of the built-in\n * Node.js 'punycode' module, which has been deprecated since Node.js v7.0.0.\n * @see https://github.com/mathiasbynens/punycode.js#installation\n * @see https://nodejs.org/api/punycode.html for deprecation info\n */\nimport {decode, encode} from 'npm-punycode'\n\nimport {\n extractPathKey,\n getDynamicPaths,\n isASCIICodeChar,\n isDynamicPath,\n refinePathnameWithQuery,\n refineQueryWithPathname,\n} from './utils'\n\ninterface URLOptions extends Partial<URL> {\n baseUrl?: string\n query?: Record<string, string>\n}\n\nexport default class NURL implements URL {\n private _href: string = ''\n private _protocol: string = ''\n private _host: string = ''\n private _hostname: string = ''\n private _port: string = ''\n private _pathname: string = ''\n private _search: string = ''\n private _hash: string = ''\n private _origin: string = ''\n private _username: string = ''\n private _password: string = ''\n private _baseUrl: string = ''\n private _searchParams: URLSearchParams = new URLSearchParams()\n\n constructor(input?: string | URL | URLOptions) {\n this._searchParams = new URLSearchParams()\n if (typeof input === 'string' || input instanceof URL) {\n this.href = input.toString()\n } else if (input) {\n if (input.baseUrl) {\n this.baseUrl = input.baseUrl\n }\n if (input.href) {\n this.href = input.href\n }\n if (input.protocol) {\n this.protocol = input.protocol\n }\n if (input.host) {\n this.host = input.host\n }\n if (input.hostname) {\n this.hostname = input.hostname\n }\n if (input.port) {\n this.port = input.port\n }\n if (input.pathname) {\n this.pathname = refinePathnameWithQuery(input.pathname, input.query ?? {})\n }\n if (input.search) {\n this.search = input.search\n }\n if (input.hash) {\n this.hash = input.hash\n }\n if (input.username) {\n this.username = input.username\n }\n if (input.password) {\n this.password = input.password\n }\n if (input.query) {\n const refinedQuery = refineQueryWithPathname(input.pathname ?? '', input.query)\n if (Object.keys(refinedQuery).length > 0) {\n this.search = new URLSearchParams(refinedQuery).toString()\n }\n }\n this.updateHref()\n }\n }\n\n static create(input?: string | URL | URLOptions) {\n return new NURL(input)\n }\n\n static canParse(input: string): boolean {\n if (input.startsWith('/')) {\n return /^\\/[^?#]*(\\?[^#]*)?(#.*)?$/.test(input)\n }\n\n try {\n // eslint-disable-next-line no-new\n new URL(input)\n return true\n } catch {\n // URL 생성자로 파싱할 수 없는 경우, 추가적인 검사를 수행\n // 예: 'example.com' 또는 'example.com/path'와 같은 형식 허용\n return /^[^:/?#]+(\\.[^:/?#]+)+(\\/[^?#]*(\\?[^#]*)?(#.*)?)?$/.test(input)\n }\n }\n\n get baseUrl(): string {\n return this._baseUrl\n }\n\n set baseUrl(value: string) {\n this._baseUrl = value\n try {\n const url = new URL(value)\n this._protocol = url.protocol\n this._host = url.host\n this._hostname = url.hostname\n this._port = url.port\n this._origin = url.origin\n this._username = url.username\n this._password = url.password\n if (url.pathname !== '/') {\n this._pathname = url.pathname\n }\n if (url.search) {\n this._search = url.search\n this._searchParams = new URLSearchParams(url.search)\n }\n if (url.hash) {\n this._hash = url.hash\n }\n this.updateHref()\n } catch (error) {\n // eslint-disable-next-line no-console\n console.warn(`Invalid baseUrl: ${value}`, error)\n }\n }\n\n get href(): string {\n return this.pathname.length === 1 ? `${this._href}/` : this._href\n }\n\n set href(value: string) {\n try {\n const url = new URL(value)\n this._href = url.href\n this._protocol = url.protocol\n this._host = url.host\n this._hostname = url.hostname\n this._port = url.port\n this._pathname = url.pathname\n this._search = url.search\n this._hash = url.hash\n this._origin = url.origin\n this._username = url.username\n this._password = url.password\n this._searchParams = url.searchParams\n } catch (error) {\n // eslint-disable-next-line no-console\n console.warn(`Can not parse ${value}`, error)\n }\n }\n\n get protocol(): string {\n return this._protocol\n }\n\n set protocol(value: string) {\n this._protocol = value\n this.updateHref()\n }\n\n get host(): string {\n return this._host\n }\n\n set host(value: string) {\n const [hostname, port] = value.split(':')\n\n const encodedHostname = this.encodeHostname(hostname)\n\n this._host = port ? `${encodedHostname}:${port}` : encodedHostname\n this._hostname = encodedHostname\n this._port = port || ''\n this.updateHref()\n }\n\n get hostname(): string {\n return this._hostname\n }\n\n set hostname(value: string) {\n const encodedHostname = this.encodeHostname(value)\n\n this._hostname = encodedHostname\n this._host = this._port ? `${encodedHostname}:${this._port}` : encodedHostname\n this.updateHref()\n }\n\n get port(): string {\n return this._port\n }\n\n set port(value: string) {\n this._port = value\n this._host = `${this._hostname}${value ? ':' + value : ''}`\n this.updateHref()\n }\n\n get pathname(): string {\n return this._pathname\n }\n\n set pathname(pathname: string) {\n const encodedPathname = pathname\n .split('/')\n .map((segment) => (isDynamicPath(segment) ? segment : encodeURI(segment)))\n .join('/')\n\n this._pathname = encodedPathname.startsWith('/') ? encodedPathname : `/${encodedPathname}`\n this.updateHref()\n }\n\n get search(): string {\n return this._search\n }\n\n set search(search: string) {\n const encodedSearch = encodeURI(search)\n this._search = encodedSearch.startsWith('?') ? encodedSearch : `?${encodedSearch}`\n this._searchParams = new URLSearchParams(encodedSearch)\n this.updateHref()\n }\n\n setSearchParams(_params: Record<string, string>): void {\n const searchParams = new URLSearchParams(_params)\n\n this._search = searchParams.toString() ? `?${searchParams.toString()}` : ''\n this._searchParams = searchParams\n this.updateHref()\n }\n\n appendSearchParams(_params: Record<string, string>): void {\n const searchParams = new URLSearchParams(this._searchParams)\n const dynamicRoutes = getDynamicPaths(this._pathname).map(extractPathKey)\n\n Object.keys(_params).forEach((key) => {\n if (dynamicRoutes.includes(key)) {\n this._pathname = refinePathnameWithQuery(this._pathname, {[key]: _params[key]})\n } else {\n searchParams.append(key, _params[key])\n }\n })\n\n this._search = searchParams.toString() ? `?${searchParams.toString()}` : ''\n this._searchParams = searchParams\n this.updateHref()\n }\n\n removeSearchParams(..._keys: string[]): void {\n const searchParams = new URLSearchParams(this._searchParams)\n\n _keys.forEach((key) => {\n searchParams.delete(key)\n })\n\n this._search = searchParams.toString() ? `?${searchParams.toString()}` : ''\n this._searchParams = searchParams\n this.updateHref()\n }\n\n get searchParams(): URLSearchParams {\n return new Proxy(this._searchParams, {\n get: (target, prop, receiver) => {\n const value = Reflect.get(target, prop, receiver)\n if (typeof value === 'function') {\n return (...args: unknown[]) => {\n const result = value.apply(target, args)\n this._search = this._searchParams.toString() ? `?${this._searchParams.toString()}` : ''\n this.updateHref()\n return result\n }\n }\n return value\n },\n })\n }\n\n get hash(): string {\n return this._hash\n }\n\n set hash(value: string) {\n this._hash = value.startsWith('#') ? value : `#${value}`\n this.updateHref()\n }\n\n get origin(): string {\n return this._origin\n }\n\n get username(): string {\n return this._username\n }\n\n set username(value: string) {\n this._username = value\n this.updateHref()\n }\n\n get password(): string {\n return this._password\n }\n\n set password(value: string) {\n this._password = value\n this.updateHref()\n }\n\n private updateHref() {\n if (this._baseUrl) {\n const baseUrl = new URL(this._baseUrl)\n baseUrl.pathname = this._pathname\n baseUrl.search = this._search\n baseUrl.hash = this._hash\n this._href = baseUrl.href\n this._origin = baseUrl.origin\n } else {\n this._href = `${this._protocol}${this._protocol && '//'}${this._username}${this._password ? ':' + this._password : ''}${\n this._username || this._password ? '@' : ''\n }${this._hostname}${this._port ? ':' + this._port : ''}${this._pathname === '/' ? '' : this._pathname}${this._search}${this._hash}`\n\n this._origin = `${this._protocol}//${this._hostname}${this._port ? ':' + this._port : ''}`\n }\n }\n\n toString(): string {\n return this.href\n }\n\n toJSON(): string {\n return this.href\n }\n\n private punycodePrefix = 'xn--'\n\n private encodeHostname(hostname: string): string {\n return hostname\n .split('.')\n .map((segment) => {\n for (const char of segment) {\n if (isASCIICodeChar(char)) {\n return `${this.punycodePrefix}${encode(segment)}`\n }\n }\n return segment\n })\n .join('.')\n }\n\n get decodedIDN(): string {\n let href = this._href\n\n this._hostname.split('.').forEach((segment) => {\n href = href.replace(segment, decode(segment.replace(this.punycodePrefix, '')))\n })\n\n return href\n }\n\n get decodedHostname(): string {\n return this._hostname\n .split('.')\n .map((segment) => decode(segment.replace(this.punycodePrefix, '')))\n .join('.')\n }\n}\n"],"names":["DYNAMIC_PATH_COLON_REGEXP","DYNAMIC_PATH_BRACKETS_REGEXP","isDynamicPath","path","test","getDynamicPaths","pathname","split","filter","extractPathKey","slice","refinePathnameWithQuery","query","reduce","acc","pathKey","replace","refineQueryWithPathname","_","remainingQuery","MAX_ASCII_CODE","isASCIICodeChar","char","charCodeAt","NURL","constructor","input","_href","_protocol","_host","_hostname","_port","_pathname","_search","_hash","_origin","_username","_password","_baseUrl","_searchParams","URLSearchParams","punycodePrefix","URL","href","toString","baseUrl","protocol","host","hostname","port","search","hash","username","password","refinedQuery","Object","keys","length","updateHref","create","canParse","startsWith","value","url","origin","error","console","warn","searchParams","encodedHostname","encodeHostname","encodedPathname","map","segment","encodeURI","join","encodedSearch","setSearchParams","_params","appendSearchParams","dynamicRoutes","forEach","key","includes","append","removeSearchParams","_keys","delete","Proxy","get","target","prop","receiver","Reflect","args","result","apply","toJSON","encode","decodedIDN","decode","decodedHostname"],"mappings":"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"}
1
+ {"version":3,"file":"index.mjs","sources":["../../src/utils.ts","../../src/nurl.ts"],"sourcesContent":["const DYNAMIC_PATH_COLON_REGEXP = /^:/\nconst DYNAMIC_PATH_BRACKETS_REGEXP = /^\\[.*\\]$/\n\nexport function isDynamicPath(path: string) {\n return DYNAMIC_PATH_COLON_REGEXP.test(path) || DYNAMIC_PATH_BRACKETS_REGEXP.test(path)\n}\n\nexport function getDynamicPaths(pathname: string): string[] {\n return pathname.split('/').filter(isDynamicPath)\n}\n\nexport function extractPathKey(path: string): string {\n return path.slice(1, DYNAMIC_PATH_COLON_REGEXP.test(path) ? undefined : -1)\n}\n\n/**\n * Replaces dynamic paths in the pathname with values from the query\n * @param {string} pathname\n * @param {Record<string, string>} query\n * @returns {string} refined pathname\n */\nexport function refinePathnameWithQuery(pathname: string, query: Record<string, string>): string {\n return getDynamicPaths(pathname).reduce((acc, path) => {\n const pathKey = extractPathKey(path)\n return query[pathKey] ? acc.replace(path, query[pathKey]) : acc\n }, pathname)\n}\n\n/**\n * Removes queries that have already been used in the pathname.\n * @param {string} pathname\n * @param {Record<string, string>} query\n * @returns {Record<string, string>} refined query\n */\nexport function refineQueryWithPathname(pathname: string, query: Record<string, string>): Record<string, string> {\n return getDynamicPaths(pathname).reduce((acc, path) => {\n const pathKey = extractPathKey(path)\n const {[pathKey]: _, ...remainingQuery} = acc\n return remainingQuery\n }, query)\n}\n\nconst MAX_ASCII_CODE = 127\nexport function isASCIICodeChar(char: string) {\n return char.charCodeAt(0) > MAX_ASCII_CODE\n}\n","/**\n * Note: We use 'npm-punycode' alias instead of 'punycode/' to properly support dual packages in ESM.\n * This ensures that this third-party module is used instead of the built-in\n * Node.js 'punycode' module, which has been deprecated since Node.js v7.0.0.\n * @see https://github.com/mathiasbynens/punycode.js#installation\n * @see https://nodejs.org/api/punycode.html for deprecation info\n */\nimport punycode from 'npm-punycode'\n\nimport {\n extractPathKey,\n getDynamicPaths,\n isASCIICodeChar,\n isDynamicPath,\n refinePathnameWithQuery,\n refineQueryWithPathname,\n} from './utils'\n\ninterface URLOptions extends Partial<URL> {\n baseUrl?: string\n query?: Record<string, string>\n}\n\nexport default class NURL implements URL {\n private _href: string = ''\n private _protocol: string = ''\n private _host: string = ''\n private _hostname: string = ''\n private _port: string = ''\n private _pathname: string = ''\n private _search: string = ''\n private _hash: string = ''\n private _origin: string = ''\n private _username: string = ''\n private _password: string = ''\n private _baseUrl: string = ''\n private _searchParams: URLSearchParams = new URLSearchParams()\n\n constructor(input?: string | URL | URLOptions) {\n this._searchParams = new URLSearchParams()\n if (typeof input === 'string' || input instanceof URL) {\n this.href = input.toString()\n } else if (input) {\n if (input.baseUrl) {\n this.baseUrl = input.baseUrl\n }\n if (input.href) {\n this.href = input.href\n }\n if (input.protocol) {\n this.protocol = input.protocol\n }\n if (input.host) {\n this.host = input.host\n }\n if (input.hostname) {\n this.hostname = input.hostname\n }\n if (input.port) {\n this.port = input.port\n }\n if (input.pathname) {\n this.pathname = refinePathnameWithQuery(input.pathname, input.query ?? {})\n }\n if (input.search) {\n this.search = input.search\n }\n if (input.hash) {\n this.hash = input.hash\n }\n if (input.username) {\n this.username = input.username\n }\n if (input.password) {\n this.password = input.password\n }\n if (input.query) {\n const refinedQuery = refineQueryWithPathname(input.pathname ?? '', input.query)\n if (Object.keys(refinedQuery).length > 0) {\n this.search = new URLSearchParams(refinedQuery).toString()\n }\n }\n this.updateHref()\n }\n }\n\n static create(input?: string | URL | URLOptions) {\n return new NURL(input)\n }\n\n static canParse(input: string): boolean {\n if (input.startsWith('/')) {\n return /^\\/[^?#]*(\\?[^#]*)?(#.*)?$/.test(input)\n }\n\n try {\n // eslint-disable-next-line no-new\n new URL(input)\n return true\n } catch {\n // URL 생성자로 파싱할 수 없는 경우, 추가적인 검사를 수행\n // 예: 'example.com' 또는 'example.com/path'와 같은 형식 허용\n return /^[^:/?#]+(\\.[^:/?#]+)+(\\/[^?#]*(\\?[^#]*)?(#.*)?)?$/.test(input)\n }\n }\n\n get baseUrl(): string {\n return this._baseUrl\n }\n\n set baseUrl(value: string) {\n this._baseUrl = value\n try {\n const url = new URL(value)\n this._protocol = url.protocol\n this._host = url.host\n this._hostname = url.hostname\n this._port = url.port\n this._origin = url.origin\n this._username = url.username\n this._password = url.password\n if (url.pathname !== '/') {\n this._pathname = url.pathname\n }\n if (url.search) {\n this._search = url.search\n this._searchParams = new URLSearchParams(url.search)\n }\n if (url.hash) {\n this._hash = url.hash\n }\n this.updateHref()\n } catch (error) {\n // eslint-disable-next-line no-console\n console.warn(`Invalid baseUrl: ${value}`, error)\n }\n }\n\n get href(): string {\n return this.pathname.length === 1 ? `${this._href}/` : this._href\n }\n\n set href(value: string) {\n try {\n const url = new URL(value)\n this._href = url.href\n this._protocol = url.protocol\n this._host = url.host\n this._hostname = url.hostname\n this._port = url.port\n this._pathname = url.pathname\n this._search = url.search\n this._hash = url.hash\n this._origin = url.origin\n this._username = url.username\n this._password = url.password\n this._searchParams = url.searchParams\n } catch (error) {\n // eslint-disable-next-line no-console\n console.warn(`Can not parse ${value}`, error)\n }\n }\n\n get protocol(): string {\n return this._protocol\n }\n\n set protocol(value: string) {\n this._protocol = value\n this.updateHref()\n }\n\n get host(): string {\n return this._host\n }\n\n set host(value: string) {\n const [hostname, port] = value.split(':')\n\n const encodedHostname = this.encodeHostname(hostname)\n\n this._host = port ? `${encodedHostname}:${port}` : encodedHostname\n this._hostname = encodedHostname\n this._port = port || ''\n this.updateHref()\n }\n\n get hostname(): string {\n return this._hostname\n }\n\n set hostname(value: string) {\n const encodedHostname = this.encodeHostname(value)\n\n this._hostname = encodedHostname\n this._host = this._port ? `${encodedHostname}:${this._port}` : encodedHostname\n this.updateHref()\n }\n\n get port(): string {\n return this._port\n }\n\n set port(value: string) {\n this._port = value\n this._host = `${this._hostname}${value ? ':' + value : ''}`\n this.updateHref()\n }\n\n get pathname(): string {\n return this._pathname\n }\n\n set pathname(pathname: string) {\n const encodedPathname = pathname\n .split('/')\n .map((segment) => (isDynamicPath(segment) ? segment : encodeURI(segment)))\n .join('/')\n\n this._pathname = encodedPathname.startsWith('/') ? encodedPathname : `/${encodedPathname}`\n this.updateHref()\n }\n\n get search(): string {\n return this._search\n }\n\n set search(search: string) {\n this._search = search.startsWith('?') ? search : `?${search}`\n this._searchParams = new URLSearchParams(search)\n this.updateHref()\n }\n\n setSearchParams(_params: Record<string, string>): void {\n const searchParams = new URLSearchParams(_params)\n\n this._search = searchParams.toString() ? `?${searchParams.toString()}` : ''\n this._searchParams = searchParams\n this.updateHref()\n }\n\n appendSearchParams(_params: Record<string, string>): void {\n const searchParams = new URLSearchParams(this._searchParams)\n const dynamicRoutes = getDynamicPaths(this._pathname).map(extractPathKey)\n\n Object.keys(_params).forEach((key) => {\n if (dynamicRoutes.includes(key)) {\n this._pathname = refinePathnameWithQuery(this._pathname, {[key]: _params[key]})\n } else {\n searchParams.append(key, _params[key])\n }\n })\n\n this._search = searchParams.toString() ? `?${searchParams.toString()}` : ''\n this._searchParams = searchParams\n this.updateHref()\n }\n\n removeSearchParams(..._keys: string[]): void {\n const searchParams = new URLSearchParams(this._searchParams)\n\n _keys.forEach((key) => {\n searchParams.delete(key)\n })\n\n this._search = searchParams.toString() ? `?${searchParams.toString()}` : ''\n this._searchParams = searchParams\n this.updateHref()\n }\n\n get searchParams(): URLSearchParams {\n return new Proxy(this._searchParams, {\n get: (target, prop, receiver) => {\n const value = Reflect.get(target, prop, receiver)\n if (typeof value === 'function') {\n return (...args: unknown[]) => {\n const result = value.apply(target, args)\n this._search = this._searchParams.toString() ? `?${this._searchParams.toString()}` : ''\n this.updateHref()\n return result\n }\n }\n return value\n },\n })\n }\n\n get hash(): string {\n return this._hash\n }\n\n set hash(value: string) {\n this._hash = value.startsWith('#') ? value : `#${value}`\n this.updateHref()\n }\n\n get origin(): string {\n return this._origin\n }\n\n get username(): string {\n return this._username\n }\n\n set username(value: string) {\n this._username = value\n this.updateHref()\n }\n\n get password(): string {\n return this._password\n }\n\n set password(value: string) {\n this._password = value\n this.updateHref()\n }\n\n private updateHref() {\n if (this._baseUrl) {\n const baseUrl = new URL(this._baseUrl)\n baseUrl.pathname = this._pathname\n baseUrl.search = this._search\n baseUrl.hash = this._hash\n this._href = baseUrl.href\n this._origin = baseUrl.origin\n } else {\n this._href = `${this._protocol}${this._protocol && '//'}${this._username}${this._password ? ':' + this._password : ''}${\n this._username || this._password ? '@' : ''\n }${this._hostname}${this._port ? ':' + this._port : ''}${this._pathname === '/' ? '' : this._pathname}${this._search}${this._hash}`\n\n this._origin = `${this._protocol}//${this._hostname}${this._port ? ':' + this._port : ''}`\n }\n }\n\n toString(): string {\n return this.href\n }\n\n toJSON(): string {\n return this.href\n }\n\n private punycodePrefix = 'xn--'\n\n private encodeHostname(hostname: string): string {\n return hostname\n .split('.')\n .map((segment) => {\n for (const char of segment) {\n if (isASCIICodeChar(char)) {\n return `${this.punycodePrefix}${punycode.encode(segment)}`\n }\n }\n return segment\n })\n .join('.')\n }\n\n get decodedIDN(): string {\n let href = this._href\n\n this._hostname.split('.').forEach((segment) => {\n href = href.replace(segment, punycode.decode(segment.replace(this.punycodePrefix, '')))\n })\n\n return href\n }\n\n get decodedHostname(): string {\n return this._hostname\n .split('.')\n .map((segment) => punycode.decode(segment.replace(this.punycodePrefix, '')))\n .join('.')\n }\n}\n"],"names":["DYNAMIC_PATH_COLON_REGEXP","DYNAMIC_PATH_BRACKETS_REGEXP","isDynamicPath","path","test","getDynamicPaths","pathname","split","filter","extractPathKey","slice","refinePathnameWithQuery","query","reduce","acc","pathKey","replace","refineQueryWithPathname","_","remainingQuery","MAX_ASCII_CODE","isASCIICodeChar","char","charCodeAt","NURL","constructor","input","_href","_protocol","_host","_hostname","_port","_pathname","_search","_hash","_origin","_username","_password","_baseUrl","_searchParams","URLSearchParams","punycodePrefix","URL","href","toString","baseUrl","protocol","host","hostname","port","search","hash","username","password","refinedQuery","Object","keys","length","updateHref","create","canParse","startsWith","value","url","origin","error","console","warn","searchParams","encodedHostname","encodeHostname","encodedPathname","map","segment","encodeURI","join","setSearchParams","_params","appendSearchParams","dynamicRoutes","forEach","key","includes","append","removeSearchParams","_keys","delete","Proxy","get","target","prop","receiver","Reflect","args","result","apply","toJSON","punycode","encode","decodedIDN","decode","decodedHostname"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@naverpay/nurl",
3
- "version": "0.0.4",
3
+ "version": "0.0.6",
4
4
  "description": "URL build library",
5
5
  "main": "./dist/cjs/index.js",
6
6
  "module": "./dist/esm/index.mjs",