@naverpay/nurl 0.0.5 → 0.0.7
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.d.ts +1 -1
- package/dist/cjs/index.js +1 -1
- package/dist/cjs/index.js.map +1 -1
- package/dist/esm/index.d.mts +1 -1
- package/dist/esm/index.mjs +1 -2
- package/dist/esm/index.mjs.map +1 -1
- package/package.json +1 -1
package/dist/cjs/index.d.ts
CHANGED
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){
|
|
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
|
package/dist/cjs/index.js.map
CHANGED
|
@@ -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 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 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}${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","encodedSearch","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
|
+
{"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\n extends Partial<\n Pick<\n URL,\n | 'href'\n | 'protocol'\n | 'host'\n | 'hostname'\n | 'port'\n | 'pathname'\n | 'search'\n | 'hash'\n | 'username'\n | 'password'\n >\n > {\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/dist/esm/index.d.mts
CHANGED
package/dist/esm/index.mjs
CHANGED
|
@@ -112,8 +112,7 @@ class p {
|
|
|
112
112
|
return this._search;
|
|
113
113
|
}
|
|
114
114
|
set search(t) {
|
|
115
|
-
|
|
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);
|
package/dist/esm/index.mjs.map
CHANGED
|
@@ -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 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 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}${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","encodedSearch","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
|
+
{"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\n extends Partial<\n Pick<\n URL,\n | 'href'\n | 'protocol'\n | 'host'\n | 'hostname'\n | 'port'\n | 'pathname'\n | 'search'\n | 'hash'\n | 'username'\n | 'password'\n >\n > {\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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"}
|