@naverpay/nurl 0.0.8 → 0.0.9
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 +4 -1
- package/dist/cjs/index.js +1 -1
- package/dist/cjs/index.js.map +1 -1
- package/dist/esm/index.d.mts +4 -1
- package/dist/esm/index.mjs +89 -73
- package/dist/esm/index.mjs.map +1 -1
- package/package.json +1 -1
package/dist/cjs/index.d.ts
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
interface URLOptions extends Partial<Pick<URL, 'href' | 'protocol' | 'host' | 'hostname' | 'port' | 'pathname' | 'search' | 'hash' | 'username' | 'password'>> {
|
|
2
2
|
baseUrl?: string;
|
|
3
3
|
query?: Record<string, string>;
|
|
4
|
+
basePath?: string;
|
|
4
5
|
}
|
|
5
6
|
declare class NURL implements URL {
|
|
6
7
|
private _href;
|
|
@@ -16,7 +17,9 @@ declare class NURL implements URL {
|
|
|
16
17
|
private _password;
|
|
17
18
|
private _baseUrl;
|
|
18
19
|
private _searchParams;
|
|
20
|
+
private _basePath;
|
|
19
21
|
constructor(input?: string | URL | URLOptions);
|
|
22
|
+
static withBasePath(basePath: string): (urlOptions?: string | URL | URLOptions) => NURL;
|
|
20
23
|
static create(input?: string | URL | URLOptions): NURL;
|
|
21
24
|
static canParse(input: string): boolean;
|
|
22
25
|
get baseUrl(): string;
|
|
@@ -32,7 +35,7 @@ declare class NURL implements URL {
|
|
|
32
35
|
get port(): string;
|
|
33
36
|
set port(value: string);
|
|
34
37
|
get pathname(): string;
|
|
35
|
-
set pathname(
|
|
38
|
+
set pathname(inputPathname: string);
|
|
36
39
|
get search(): string;
|
|
37
40
|
set search(search: string);
|
|
38
41
|
setSearchParams(_params: Record<string, string>): void;
|
package/dist/cjs/index.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";const y="-",L={overflow:"Overflow: input needs wider integers to process","not-basic":"Illegal input >= 0x80 (not a basic code point)","invalid-input":"Invalid input"},
|
|
1
|
+
"use strict";const y="-",L={overflow:"Overflow: input needs wider integers to process","not-basic":"Illegal input >= 0x80 (not a basic code point)","invalid-input":"Invalid input"},P=35,f=Math.floor,w=String.fromCharCode;function l(e){throw new RangeError(L[e])}function A(e){const t=[];let s=0;const r=e.length;for(;s<r;){const a=e.charCodeAt(s++);if(a>=55296&&a<=56319&&s<r){const h=e.charCodeAt(s++);(h&64512)==56320?t.push(((a&1023)<<10)+(h&1023)+65536):(t.push(a),s--)}else t.push(a)}return t}const W=e=>e>=48&&e<58?26+(e-48):e>=65&&e<91?e-65:e>=97&&e<123?e-97:36,C=(e,t)=>e+22+75*(e<26?1:0)-0,I=(e,t,s)=>{let r=0;for(e=s?f(e/700):e>>1,e+=f(e/t);e>P*26>>1;r+=36)e=f(e/P);return f(r+(P+1)*e/(e+38))},U=e=>{const t=[],s=e.length;let r=0,a=128,h=72,i=e.lastIndexOf(y);i<0&&(i=0);for(let n=0;n<i;++n)e.charCodeAt(n)>=128&&l("not-basic"),t.push(e.charCodeAt(n));for(let n=i>0?i+1:0;n<s;){const u=r;for(let m=1,c=36;;c+=36){n>=s&&l("invalid-input");const _=W(e.charCodeAt(n++));_>=36&&l("invalid-input"),_>f((2147483647-r)/m)&&l("overflow"),r+=_*m;const p=c<=h?1:c>=h+26?26:c-h;if(_<p)break;const d=36-p;m>f(2147483647/d)&&l("overflow"),m*=d}const o=t.length+1;h=I(r-u,o,u==0),f(r/o)>2147483647-a&&l("overflow"),a+=f(r/o),r%=o,t.splice(r++,0,a)}return String.fromCodePoint(...t)},E=e=>{const t=[],s=A(e),r=s.length;let a=128,h=0,i=72;for(const o of s)o<128&&t.push(w(o));const n=t.length;let u=n;for(n&&t.push(y);u<r;){let o=2147483647;for(const c of s)c>=a&&c<o&&(o=c);const m=u+1;o-a>f((2147483647-h)/m)&&l("overflow"),h+=(o-a)*m,a=o;for(const c of s)if(c<a&&++h>2147483647&&l("overflow"),c===a){let _=h;for(let p=36;;p+=36){const d=p<=i?1:p>=i+26?26:p-i;if(_<d)break;const S=_-d,x=36-d;t.push(w(C(d+S%x))),_=f(S/x)}t.push(w(C(_))),i=I(h,m,u===n),h=0,++u}++h,++a}return t.join("")},M=/^:/,v=/^\[.*\]$/;function R(e){return M.test(e)||v.test(e)}function b(e){return e.split("/").filter(R)}function $(e){return e.slice(1,M.test(e)?void 0:-1)}function H(e,t){return b(e).reduce((s,r)=>{const a=$(r);return t[a]?s.replace(r,t[a]):s},e)}function T(e,t){return b(e).reduce((s,r)=>{const a=$(r),{[a]:h,...i}=s;return i},t)}const j=127;function D(e){return e.charCodeAt(0)>j}class g{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._basePath="",this.punycodePrefix="xn--",this._searchParams=new URLSearchParams,typeof t=="string"||t instanceof URL)this.href=t.toString();else if(t){if(t.basePath&&(this._basePath=t.basePath.startsWith("/")?t.basePath:`/${t.basePath}`),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){const s=this._basePath;let r=t.pathname;s&&!r.startsWith(s)&&(r=`${s}${r.startsWith("/")?"":"/"}${r}`),this.pathname=H(r,t.query??{})}if(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=T(t.pathname??"",t.query);Object.keys(s).length>0&&(this.search=new URLSearchParams(s).toString())}this.updateHref()}}static withBasePath(t){return s=>typeof s=="string"||s instanceof URL?new g({href:s.toString(),basePath:t}):new g({...s,basePath:t})}static create(t){return new g(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,r]=t.split(":"),a=this.encodeHostname(s);this._host=r?`${a}:${r}`:a,this._hostname=a,this._port=r||"",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){let s=t;this._basePath&&!s.startsWith(this._basePath)&&(s=`${this._basePath}${s.startsWith("/")?"":"/"}${s}`);const r=s.split("/").map(a=>R(a)?a:encodeURI(a)).join("/");this._pathname=r.startsWith("/")?r:`/${r}`,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),r=b(this._pathname).map($);Object.keys(t).forEach(a=>{r.includes(a)?this._pathname=H(this._pathname,{[a]:t[a]}):s.append(a,t[a])}),this._search=s.toString()?`?${s.toString()}`:"",this._searchParams=s,this.updateHref()}removeSearchParams(...t){const s=new URLSearchParams(this._searchParams);t.forEach(r=>{s.delete(r)}),this._search=s.toString()?`?${s.toString()}`:"",this._searchParams=s,this.updateHref()}get searchParams(){return new Proxy(this._searchParams,{get:(t,s,r)=>{const a=Reflect.get(t,s,r);return typeof a=="function"?(...h)=>{const i=a.apply(t,h);return this._search=this._searchParams.toString()?`?${this._searchParams.toString()}`:"",this.updateHref(),i}:a}})}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 r of s)if(D(r))return`${this.punycodePrefix}${E(s)}`;return s}).join(".")}get decodedIDN(){let t=this._href;return this._hostname.split(".").forEach(s=>{t=t.replace(s,U(s.replace(this.punycodePrefix,"")))}),t}get decodedHostname(){return this._hostname.split(".").map(t=>U(t.replace(this.punycodePrefix,""))).join(".")}}module.exports=g;
|
|
2
2
|
//# sourceMappingURL=index.js.map
|
package/dist/cjs/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../../src/punycode.ts","../../src/utils.ts","../../src/nurl.ts"],"sourcesContent":["/* eslint-disable eqeqeq */\n/* eslint-disable no-param-reassign */\n\ninterface PunycodeStatic {\n version: string\n ucs2: {\n decode(string: string): number[]\n encode(codePoints: number[]): string\n }\n decode(input: string): string\n encode(input: string): string\n toASCII(input: string): string\n toUnicode(input: string): string\n}\n\ntype ErrorMessages = Record<string, string>\n\n/** Highest positive signed 32-bit float value */\nconst maxInt: number = 2147483647 // aka. 0x7FFFFFFF or 2^31-1\n\n/** Bootstring parameters */\nconst base: number = 36\nconst tMin: number = 1\nconst tMax: number = 26\nconst skew: number = 38\nconst damp: number = 700\nconst initialBias: number = 72\nconst initialN: number = 128 // 0x80\nconst delimiter: string = '-' // '\\x2D'\n\n/** Regular expressions */\nconst regexPunycode: RegExp = /^xn--/\nconst regexNonASCII: RegExp = /[^\\0-\\x7F]/ // Note: U+007F DEL is excluded too.\nconst regexSeparators: RegExp = /[\\x2E\\u3002\\uFF0E\\uFF61]/g // RFC 3490 separators\n\n/** Error messages */\nconst errors: ErrorMessages = {\n overflow: 'Overflow: input needs wider integers to process',\n 'not-basic': 'Illegal input >= 0x80 (not a basic code point)',\n 'invalid-input': 'Invalid input',\n}\n\n/** Convenience shortcuts */\nconst baseMinusTMin: number = base - tMin\nconst floor: (x: number) => number = Math.floor\nconst stringFromCharCode: (...codes: number[]) => string = String.fromCharCode\n\n/* -------------------------------------------------------------------------- */\n\n/**\n * A generic error utility function.\n * @private\n * @param {string} type The error type.\n * @throws {RangeError} with the applicable error message.\n */\nfunction error(type: string): never {\n throw new RangeError(errors[type])\n}\n\n/**\n * A generic `Array#map` utility function.\n * @private\n * @param {T[]} array The array to iterate over.\n * @param {(value: T) => U} callback The function that gets called for every array item.\n * @returns {U[]} A new array of values returned by the callback function.\n */\nfunction map<T, U>(array: T[], callback: (value: T) => U): U[] {\n const result: U[] = new Array(array.length)\n let length: number = array.length\n while (length--) {\n result[length] = callback(array[length])\n }\n return result\n}\n\n/**\n * A simple `Array#map`-like wrapper to work with domain name strings or email addresses.\n * @private\n * @param {string} domain The domain name or email address.\n * @param {(string: string) => string} callback The function that gets called for every character.\n * @returns {string} A new string of characters returned by the callback function.\n */\nfunction mapDomain(domain: string, callback: (string: string) => string): string {\n const parts: string[] = domain.split('@')\n let result: string = ''\n if (parts.length > 1) {\n // In email addresses, only the domain name should be punycoded. Leave\n // the local part (i.e. everything up to `@`) intact.\n result = parts[0] + '@'\n domain = parts[1]\n }\n // Avoid `split(regex)` for IE8 compatibility. See #17.\n domain = domain.replace(regexSeparators, '\\x2E')\n const labels: string[] = domain.split('.')\n const encoded: string = map(labels, callback).join('.')\n return result + encoded\n}\n\n/**\n * Creates an array containing the numeric code points of each Unicode\n * character in the string.\n * @param {string} string The Unicode input string (UCS-2).\n * @returns {number[]} The new array of code points.\n */\nfunction ucs2decode(string: string): number[] {\n const output: number[] = []\n let counter: number = 0\n const length: number = string.length\n\n while (counter < length) {\n const value: number = string.charCodeAt(counter++)\n if (value >= 0xd800 && value <= 0xdbff && counter < length) {\n // It's a high surrogate, and there is a next character.\n const extra: number = string.charCodeAt(counter++)\n if ((extra & 0xfc00) == 0xdc00) {\n // Low surrogate.\n output.push(((value & 0x3ff) << 10) + (extra & 0x3ff) + 0x10000)\n } else {\n // It's an unmatched surrogate; only append this code unit, in case the\n // next code unit is the high surrogate of a surrogate pair.\n output.push(value)\n counter--\n }\n } else {\n output.push(value)\n }\n }\n return output\n}\n\n/**\n * Creates a string based on an array of numeric code points.\n * @param {number[]} codePoints The array of numeric code points.\n * @returns {string} The new Unicode string (UCS-2).\n */\nconst ucs2encode = (codePoints: number[]): string => String.fromCodePoint(...codePoints)\n\n/**\n * Converts a basic code point into a digit/integer.\n * @private\n * @param {number} codePoint The basic numeric code point value.\n * @returns {number} The numeric value of a basic code point.\n */\nconst basicToDigit = (codePoint: number): number => {\n if (codePoint >= 0x30 && codePoint < 0x3a) {\n return 26 + (codePoint - 0x30)\n }\n if (codePoint >= 0x41 && codePoint < 0x5b) {\n return codePoint - 0x41\n }\n if (codePoint >= 0x61 && codePoint < 0x7b) {\n return codePoint - 0x61\n }\n return base\n}\n\n/**\n * Converts a digit/integer into a basic code point.\n * @private\n * @param {number} digit The numeric value of a basic code point.\n * @param {number} flag The flag value.\n * @returns {number} The basic code point.\n */\nconst digitToBasic = (digit: number, flag: number): number => {\n // 0..25 map to ASCII a..z or A..Z\n // 26..35 map to ASCII 0..9\n // @descriptoin 원래 코드는 아래와 같았지만, 타입스크립트에서는 불리언 연산이 안되서 임의로 수정\n // return digit + 22 + 75 * (digit < 26) - ((flag != 0) << 5)\n return digit + 22 + 75 * (digit < 26 ? 1 : 0) - ((flag != 0 ? 1 : 0) << 5)\n}\n\n/**\n * Bias adaptation function as per section 3.4 of RFC 3492.\n * @private\n * @param {number} delta The delta value.\n * @param {number} numPoints The number of points.\n * @param {boolean} firstTime Whether this is the first time.\n * @returns {number} The adapted bias.\n */\nconst adapt = (delta: number, numPoints: number, firstTime: boolean): number => {\n let k: number = 0\n delta = firstTime ? floor(delta / damp) : delta >> 1\n delta += floor(delta / numPoints)\n for (; /* no initialization */ delta > (baseMinusTMin * tMax) >> 1; k += base) {\n delta = floor(delta / baseMinusTMin)\n }\n return floor(k + ((baseMinusTMin + 1) * delta) / (delta + skew))\n}\n\n/**\n * Converts a Punycode string of ASCII-only symbols to a string of Unicode symbols.\n * @param {string} input The Punycode string of ASCII-only symbols.\n * @returns {string} The resulting string of Unicode symbols.\n */\nconst decode = (input: string): string => {\n const output: number[] = []\n const inputLength: number = input.length\n let i: number = 0\n let n: number = initialN\n let bias: number = initialBias\n\n let basic: number = input.lastIndexOf(delimiter)\n if (basic < 0) {\n basic = 0\n }\n\n for (let j: number = 0; j < basic; ++j) {\n if (input.charCodeAt(j) >= 0x80) {\n error('not-basic')\n }\n output.push(input.charCodeAt(j))\n }\n\n for (let index: number = basic > 0 ? basic + 1 : 0; index < inputLength /* no final expression */; ) {\n const oldi: number = i\n for (let w: number = 1, k: number = base /* no condition */; ; k += base) {\n if (index >= inputLength) {\n error('invalid-input')\n }\n\n const digit: number = basicToDigit(input.charCodeAt(index++))\n\n if (digit >= base) {\n error('invalid-input')\n }\n if (digit > floor((maxInt - i) / w)) {\n error('overflow')\n }\n\n i += digit * w\n const t: number = k <= bias ? tMin : k >= bias + tMax ? tMax : k - bias\n\n if (digit < t) {\n break\n }\n\n const baseMinusT: number = base - t\n if (w > floor(maxInt / baseMinusT)) {\n error('overflow')\n }\n\n w *= baseMinusT\n }\n\n const out: number = output.length + 1\n bias = adapt(i - oldi, out, oldi == 0)\n\n if (floor(i / out) > maxInt - n) {\n error('overflow')\n }\n\n n += floor(i / out)\n i %= out\n\n output.splice(i++, 0, n)\n }\n\n return String.fromCodePoint(...output)\n}\n\n/**\n * Converts a string of Unicode symbols to a Punycode string of ASCII-only symbols.\n * @param {string} input The string of Unicode symbols.\n * @returns {string} The resulting Punycode string of ASCII-only symbols.\n */\nconst encode = (input: string): string => {\n const output: string[] = []\n\n // Convert the input in UCS-2 to an array of Unicode code points.\n const inputArray: number[] = ucs2decode(input)\n\n // Cache the length.\n const inputLength: number = inputArray.length\n\n // Initialize the state.\n let n: number = initialN\n let delta: number = 0\n let bias: number = initialBias\n\n // Handle the basic code points.\n for (const currentValue of inputArray) {\n if (currentValue < 0x80) {\n output.push(stringFromCharCode(currentValue))\n }\n }\n\n const basicLength: number = output.length\n let handledCPCount: number = basicLength\n\n // Finish the basic string with a delimiter unless it's empty.\n if (basicLength) {\n output.push(delimiter)\n }\n\n // Main encoding loop:\n while (handledCPCount < inputLength) {\n let m: number = maxInt\n for (const currentValue of inputArray) {\n if (currentValue >= n && currentValue < m) {\n m = currentValue\n }\n }\n\n const handledCPCountPlusOne: number = handledCPCount + 1\n if (m - n > floor((maxInt - delta) / handledCPCountPlusOne)) {\n error('overflow')\n }\n\n delta += (m - n) * handledCPCountPlusOne\n n = m\n\n for (const currentValue of inputArray) {\n if (currentValue < n && ++delta > maxInt) {\n error('overflow')\n }\n if (currentValue === n) {\n let q: number = delta\n for (let k: number = base /* no condition */; ; k += base) {\n const t: number = k <= bias ? tMin : k >= bias + tMax ? tMax : k - bias\n if (q < t) {\n break\n }\n const qMinusT: number = q - t\n const baseMinusT: number = base - t\n output.push(stringFromCharCode(digitToBasic(t + (qMinusT % baseMinusT), 0)))\n q = floor(qMinusT / baseMinusT)\n }\n\n output.push(stringFromCharCode(digitToBasic(q, 0)))\n bias = adapt(delta, handledCPCountPlusOne, handledCPCount === basicLength)\n delta = 0\n ++handledCPCount\n }\n }\n\n ++delta\n ++n\n }\n return output.join('')\n}\n\n/**\n * Converts a Punycode string representing a domain name or an email address to Unicode.\n * @param {string} input The Punycoded domain name or email address.\n * @returns {string} The Unicode representation of the given Punycode string.\n */\nconst toUnicode = (input: string): string => {\n return mapDomain(input, (string: string): string => {\n return regexPunycode.test(string) ? decode(string.slice(4).toLowerCase()) : string\n })\n}\n\n/**\n * Converts a Unicode string representing a domain name or an email address to Punycode.\n * @param {string} input The domain name or email address to convert.\n * @returns {string} The Punycode representation of the given domain name or email address.\n */\nconst toASCII = (input: string): string => {\n return mapDomain(input, (string: string): string => {\n return regexNonASCII.test(string) ? 'xn--' + encode(string) : string\n })\n}\n\n/** Define the public API */\n/**\n * @description originated from https://unpkg.com/browse/punycode@2.3.1/\n */\nconst punycode: PunycodeStatic = {\n version: '2.3.1',\n ucs2: {\n decode: ucs2decode,\n encode: ucs2encode,\n },\n decode,\n encode,\n toASCII,\n toUnicode,\n}\n\nexport {ucs2decode, ucs2encode, decode, encode, toASCII, toUnicode}\nexport default punycode\n","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","import {decode, encode} from './punycode'\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}${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":["delimiter","errors","overflow","baseMinusTMin","base","floor","Math","stringFromCharCode","String","fromCharCode","error","type","RangeError","ucs2decode","string","output","counter","length","value","charCodeAt","extra","push","basicToDigit","codePoint","digitToBasic","digit","flag","adapt","delta","numPoints","firstTime","k","damp","tMax","skew","decode","input","inputLength","i","n","initialN","bias","initialBias","basic","lastIndexOf","j","index","oldi","w","maxInt","t","tMin","baseMinusT","out","splice","fromCodePoint","encode","inputArray","currentValue","basicLength","handledCPCount","m","handledCPCountPlusOne","q","qMinusT","join","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","NURL","constructor","_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","updateHref","create","canParse","startsWith","url","origin","console","warn","searchParams","encodedHostname","encodeHostname","encodedPathname","map","segment","encodeURI","setSearchParams","_params","appendSearchParams","dynamicRoutes","forEach","key","includes","append","removeSearchParams","_keys","delete","Proxy","get","target","prop","receiver","Reflect","args","result","apply","toJSON","decodedIDN","decodedHostname"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../src/punycode.ts","../../src/utils.ts","../../src/nurl.ts"],"sourcesContent":["/* eslint-disable eqeqeq */\n/* eslint-disable no-param-reassign */\n\ninterface PunycodeStatic {\n version: string\n ucs2: {\n decode(string: string): number[]\n encode(codePoints: number[]): string\n }\n decode(input: string): string\n encode(input: string): string\n toASCII(input: string): string\n toUnicode(input: string): string\n}\n\ntype ErrorMessages = Record<string, string>\n\n/** Highest positive signed 32-bit float value */\nconst maxInt: number = 2147483647 // aka. 0x7FFFFFFF or 2^31-1\n\n/** Bootstring parameters */\nconst base: number = 36\nconst tMin: number = 1\nconst tMax: number = 26\nconst skew: number = 38\nconst damp: number = 700\nconst initialBias: number = 72\nconst initialN: number = 128 // 0x80\nconst delimiter: string = '-' // '\\x2D'\n\n/** Regular expressions */\nconst regexPunycode: RegExp = /^xn--/\nconst regexNonASCII: RegExp = /[^\\0-\\x7F]/ // Note: U+007F DEL is excluded too.\nconst regexSeparators: RegExp = /[\\x2E\\u3002\\uFF0E\\uFF61]/g // RFC 3490 separators\n\n/** Error messages */\nconst errors: ErrorMessages = {\n overflow: 'Overflow: input needs wider integers to process',\n 'not-basic': 'Illegal input >= 0x80 (not a basic code point)',\n 'invalid-input': 'Invalid input',\n}\n\n/** Convenience shortcuts */\nconst baseMinusTMin: number = base - tMin\nconst floor: (x: number) => number = Math.floor\nconst stringFromCharCode: (...codes: number[]) => string = String.fromCharCode\n\n/* -------------------------------------------------------------------------- */\n\n/**\n * A generic error utility function.\n * @private\n * @param {string} type The error type.\n * @throws {RangeError} with the applicable error message.\n */\nfunction error(type: string): never {\n throw new RangeError(errors[type])\n}\n\n/**\n * A generic `Array#map` utility function.\n * @private\n * @param {T[]} array The array to iterate over.\n * @param {(value: T) => U} callback The function that gets called for every array item.\n * @returns {U[]} A new array of values returned by the callback function.\n */\nfunction map<T, U>(array: T[], callback: (value: T) => U): U[] {\n const result: U[] = new Array(array.length)\n let length: number = array.length\n while (length--) {\n result[length] = callback(array[length])\n }\n return result\n}\n\n/**\n * A simple `Array#map`-like wrapper to work with domain name strings or email addresses.\n * @private\n * @param {string} domain The domain name or email address.\n * @param {(string: string) => string} callback The function that gets called for every character.\n * @returns {string} A new string of characters returned by the callback function.\n */\nfunction mapDomain(domain: string, callback: (string: string) => string): string {\n const parts: string[] = domain.split('@')\n let result: string = ''\n if (parts.length > 1) {\n // In email addresses, only the domain name should be punycoded. Leave\n // the local part (i.e. everything up to `@`) intact.\n result = parts[0] + '@'\n domain = parts[1]\n }\n // Avoid `split(regex)` for IE8 compatibility. See #17.\n domain = domain.replace(regexSeparators, '\\x2E')\n const labels: string[] = domain.split('.')\n const encoded: string = map(labels, callback).join('.')\n return result + encoded\n}\n\n/**\n * Creates an array containing the numeric code points of each Unicode\n * character in the string.\n * @param {string} string The Unicode input string (UCS-2).\n * @returns {number[]} The new array of code points.\n */\nfunction ucs2decode(string: string): number[] {\n const output: number[] = []\n let counter: number = 0\n const length: number = string.length\n\n while (counter < length) {\n const value: number = string.charCodeAt(counter++)\n if (value >= 0xd800 && value <= 0xdbff && counter < length) {\n // It's a high surrogate, and there is a next character.\n const extra: number = string.charCodeAt(counter++)\n if ((extra & 0xfc00) == 0xdc00) {\n // Low surrogate.\n output.push(((value & 0x3ff) << 10) + (extra & 0x3ff) + 0x10000)\n } else {\n // It's an unmatched surrogate; only append this code unit, in case the\n // next code unit is the high surrogate of a surrogate pair.\n output.push(value)\n counter--\n }\n } else {\n output.push(value)\n }\n }\n return output\n}\n\n/**\n * Creates a string based on an array of numeric code points.\n * @param {number[]} codePoints The array of numeric code points.\n * @returns {string} The new Unicode string (UCS-2).\n */\nconst ucs2encode = (codePoints: number[]): string => String.fromCodePoint(...codePoints)\n\n/**\n * Converts a basic code point into a digit/integer.\n * @private\n * @param {number} codePoint The basic numeric code point value.\n * @returns {number} The numeric value of a basic code point.\n */\nconst basicToDigit = (codePoint: number): number => {\n if (codePoint >= 0x30 && codePoint < 0x3a) {\n return 26 + (codePoint - 0x30)\n }\n if (codePoint >= 0x41 && codePoint < 0x5b) {\n return codePoint - 0x41\n }\n if (codePoint >= 0x61 && codePoint < 0x7b) {\n return codePoint - 0x61\n }\n return base\n}\n\n/**\n * Converts a digit/integer into a basic code point.\n * @private\n * @param {number} digit The numeric value of a basic code point.\n * @param {number} flag The flag value.\n * @returns {number} The basic code point.\n */\nconst digitToBasic = (digit: number, flag: number): number => {\n // 0..25 map to ASCII a..z or A..Z\n // 26..35 map to ASCII 0..9\n // @descriptoin 원래 코드는 아래와 같았지만, 타입스크립트에서는 불리언 연산이 안되서 임의로 수정\n // return digit + 22 + 75 * (digit < 26) - ((flag != 0) << 5)\n return digit + 22 + 75 * (digit < 26 ? 1 : 0) - ((flag != 0 ? 1 : 0) << 5)\n}\n\n/**\n * Bias adaptation function as per section 3.4 of RFC 3492.\n * @private\n * @param {number} delta The delta value.\n * @param {number} numPoints The number of points.\n * @param {boolean} firstTime Whether this is the first time.\n * @returns {number} The adapted bias.\n */\nconst adapt = (delta: number, numPoints: number, firstTime: boolean): number => {\n let k: number = 0\n delta = firstTime ? floor(delta / damp) : delta >> 1\n delta += floor(delta / numPoints)\n for (; /* no initialization */ delta > (baseMinusTMin * tMax) >> 1; k += base) {\n delta = floor(delta / baseMinusTMin)\n }\n return floor(k + ((baseMinusTMin + 1) * delta) / (delta + skew))\n}\n\n/**\n * Converts a Punycode string of ASCII-only symbols to a string of Unicode symbols.\n * @param {string} input The Punycode string of ASCII-only symbols.\n * @returns {string} The resulting string of Unicode symbols.\n */\nconst decode = (input: string): string => {\n const output: number[] = []\n const inputLength: number = input.length\n let i: number = 0\n let n: number = initialN\n let bias: number = initialBias\n\n let basic: number = input.lastIndexOf(delimiter)\n if (basic < 0) {\n basic = 0\n }\n\n for (let j: number = 0; j < basic; ++j) {\n if (input.charCodeAt(j) >= 0x80) {\n error('not-basic')\n }\n output.push(input.charCodeAt(j))\n }\n\n for (let index: number = basic > 0 ? basic + 1 : 0; index < inputLength /* no final expression */; ) {\n const oldi: number = i\n for (let w: number = 1, k: number = base /* no condition */; ; k += base) {\n if (index >= inputLength) {\n error('invalid-input')\n }\n\n const digit: number = basicToDigit(input.charCodeAt(index++))\n\n if (digit >= base) {\n error('invalid-input')\n }\n if (digit > floor((maxInt - i) / w)) {\n error('overflow')\n }\n\n i += digit * w\n const t: number = k <= bias ? tMin : k >= bias + tMax ? tMax : k - bias\n\n if (digit < t) {\n break\n }\n\n const baseMinusT: number = base - t\n if (w > floor(maxInt / baseMinusT)) {\n error('overflow')\n }\n\n w *= baseMinusT\n }\n\n const out: number = output.length + 1\n bias = adapt(i - oldi, out, oldi == 0)\n\n if (floor(i / out) > maxInt - n) {\n error('overflow')\n }\n\n n += floor(i / out)\n i %= out\n\n output.splice(i++, 0, n)\n }\n\n return String.fromCodePoint(...output)\n}\n\n/**\n * Converts a string of Unicode symbols to a Punycode string of ASCII-only symbols.\n * @param {string} input The string of Unicode symbols.\n * @returns {string} The resulting Punycode string of ASCII-only symbols.\n */\nconst encode = (input: string): string => {\n const output: string[] = []\n\n // Convert the input in UCS-2 to an array of Unicode code points.\n const inputArray: number[] = ucs2decode(input)\n\n // Cache the length.\n const inputLength: number = inputArray.length\n\n // Initialize the state.\n let n: number = initialN\n let delta: number = 0\n let bias: number = initialBias\n\n // Handle the basic code points.\n for (const currentValue of inputArray) {\n if (currentValue < 0x80) {\n output.push(stringFromCharCode(currentValue))\n }\n }\n\n const basicLength: number = output.length\n let handledCPCount: number = basicLength\n\n // Finish the basic string with a delimiter unless it's empty.\n if (basicLength) {\n output.push(delimiter)\n }\n\n // Main encoding loop:\n while (handledCPCount < inputLength) {\n let m: number = maxInt\n for (const currentValue of inputArray) {\n if (currentValue >= n && currentValue < m) {\n m = currentValue\n }\n }\n\n const handledCPCountPlusOne: number = handledCPCount + 1\n if (m - n > floor((maxInt - delta) / handledCPCountPlusOne)) {\n error('overflow')\n }\n\n delta += (m - n) * handledCPCountPlusOne\n n = m\n\n for (const currentValue of inputArray) {\n if (currentValue < n && ++delta > maxInt) {\n error('overflow')\n }\n if (currentValue === n) {\n let q: number = delta\n for (let k: number = base /* no condition */; ; k += base) {\n const t: number = k <= bias ? tMin : k >= bias + tMax ? tMax : k - bias\n if (q < t) {\n break\n }\n const qMinusT: number = q - t\n const baseMinusT: number = base - t\n output.push(stringFromCharCode(digitToBasic(t + (qMinusT % baseMinusT), 0)))\n q = floor(qMinusT / baseMinusT)\n }\n\n output.push(stringFromCharCode(digitToBasic(q, 0)))\n bias = adapt(delta, handledCPCountPlusOne, handledCPCount === basicLength)\n delta = 0\n ++handledCPCount\n }\n }\n\n ++delta\n ++n\n }\n return output.join('')\n}\n\n/**\n * Converts a Punycode string representing a domain name or an email address to Unicode.\n * @param {string} input The Punycoded domain name or email address.\n * @returns {string} The Unicode representation of the given Punycode string.\n */\nconst toUnicode = (input: string): string => {\n return mapDomain(input, (string: string): string => {\n return regexPunycode.test(string) ? decode(string.slice(4).toLowerCase()) : string\n })\n}\n\n/**\n * Converts a Unicode string representing a domain name or an email address to Punycode.\n * @param {string} input The domain name or email address to convert.\n * @returns {string} The Punycode representation of the given domain name or email address.\n */\nconst toASCII = (input: string): string => {\n return mapDomain(input, (string: string): string => {\n return regexNonASCII.test(string) ? 'xn--' + encode(string) : string\n })\n}\n\n/** Define the public API */\n/**\n * @description originated from https://unpkg.com/browse/punycode@2.3.1/\n */\nconst punycode: PunycodeStatic = {\n version: '2.3.1',\n ucs2: {\n decode: ucs2decode,\n encode: ucs2encode,\n },\n decode,\n encode,\n toASCII,\n toUnicode,\n}\n\nexport {ucs2decode, ucs2encode, decode, encode, toASCII, toUnicode}\nexport default punycode\n","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","import {decode, encode} from './punycode'\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 basePath?: 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 private _basePath: string = ''\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.basePath) {\n this._basePath = input.basePath.startsWith('/') ? input.basePath : `/${input.basePath}`\n }\n\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 const basePath = this._basePath\n let adjustedPathname = input.pathname\n if (basePath && !adjustedPathname.startsWith(basePath)) {\n adjustedPathname = `${basePath}${adjustedPathname.startsWith('/') ? '' : '/'}${adjustedPathname}`\n }\n\n this.pathname = refinePathnameWithQuery(adjustedPathname, 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 withBasePath(basePath: string) {\n return (urlOptions?: string | URL | URLOptions) => {\n if (typeof urlOptions === 'string' || urlOptions instanceof URL) {\n return new NURL({href: urlOptions.toString(), basePath})\n }\n return new NURL({...urlOptions, basePath})\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(inputPathname: string) {\n let pathname = inputPathname\n if (this._basePath && !pathname.startsWith(this._basePath)) {\n pathname = `${this._basePath}${pathname.startsWith('/') ? '' : '/'}${pathname}`\n }\n\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}${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":["delimiter","errors","overflow","baseMinusTMin","base","floor","Math","stringFromCharCode","String","fromCharCode","error","type","RangeError","ucs2decode","string","output","counter","length","value","charCodeAt","extra","push","basicToDigit","codePoint","digitToBasic","digit","flag","adapt","delta","numPoints","firstTime","k","damp","tMax","skew","decode","input","inputLength","i","n","initialN","bias","initialBias","basic","lastIndexOf","j","index","oldi","w","maxInt","t","tMin","baseMinusT","out","splice","fromCodePoint","encode","inputArray","currentValue","basicLength","handledCPCount","m","handledCPCountPlusOne","q","qMinusT","join","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","NURL","constructor","_href","_protocol","_host","_hostname","_port","_pathname","_search","_hash","_origin","_username","_password","_baseUrl","_searchParams","URLSearchParams","_basePath","punycodePrefix","URL","href","toString","basePath","startsWith","baseUrl","protocol","host","hostname","port","adjustedPathname","search","hash","username","password","refinedQuery","Object","keys","updateHref","withBasePath","urlOptions","create","canParse","url","origin","console","warn","searchParams","encodedHostname","encodeHostname","inputPathname","encodedPathname","map","segment","encodeURI","setSearchParams","_params","appendSearchParams","dynamicRoutes","forEach","key","includes","append","removeSearchParams","_keys","delete","Proxy","get","target","prop","receiver","Reflect","args","result","apply","toJSON","decodedIDN","decodedHostname"],"mappings":"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"}
|
package/dist/esm/index.d.mts
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
interface URLOptions extends Partial<Pick<URL, 'href' | 'protocol' | 'host' | 'hostname' | 'port' | 'pathname' | 'search' | 'hash' | 'username' | 'password'>> {
|
|
2
2
|
baseUrl?: string;
|
|
3
3
|
query?: Record<string, string>;
|
|
4
|
+
basePath?: string;
|
|
4
5
|
}
|
|
5
6
|
declare class NURL implements URL {
|
|
6
7
|
private _href;
|
|
@@ -16,7 +17,9 @@ declare class NURL implements URL {
|
|
|
16
17
|
private _password;
|
|
17
18
|
private _baseUrl;
|
|
18
19
|
private _searchParams;
|
|
20
|
+
private _basePath;
|
|
19
21
|
constructor(input?: string | URL | URLOptions);
|
|
22
|
+
static withBasePath(basePath: string): (urlOptions?: string | URL | URLOptions) => NURL;
|
|
20
23
|
static create(input?: string | URL | URLOptions): NURL;
|
|
21
24
|
static canParse(input: string): boolean;
|
|
22
25
|
get baseUrl(): string;
|
|
@@ -32,7 +35,7 @@ declare class NURL implements URL {
|
|
|
32
35
|
get port(): string;
|
|
33
36
|
set port(value: string);
|
|
34
37
|
get pathname(): string;
|
|
35
|
-
set pathname(
|
|
38
|
+
set pathname(inputPathname: string);
|
|
36
39
|
get search(): string;
|
|
37
40
|
set search(search: string);
|
|
38
41
|
setSearchParams(_params: Record<string, string>): void;
|
package/dist/esm/index.mjs
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
const
|
|
1
|
+
const y = "-", L = {
|
|
2
2
|
overflow: "Overflow: input needs wider integers to process",
|
|
3
3
|
"not-basic": "Illegal input >= 0x80 (not a basic code point)",
|
|
4
4
|
"invalid-input": "Invalid input"
|
|
5
|
-
},
|
|
5
|
+
}, P = 35, f = Math.floor, w = String.fromCharCode;
|
|
6
6
|
function l(e) {
|
|
7
7
|
throw new RangeError(L[e]);
|
|
8
8
|
}
|
|
@@ -11,118 +11,132 @@ function A(e) {
|
|
|
11
11
|
let s = 0;
|
|
12
12
|
const r = e.length;
|
|
13
13
|
for (; s < r; ) {
|
|
14
|
-
const
|
|
15
|
-
if (
|
|
16
|
-
const
|
|
17
|
-
(
|
|
14
|
+
const a = e.charCodeAt(s++);
|
|
15
|
+
if (a >= 55296 && a <= 56319 && s < r) {
|
|
16
|
+
const h = e.charCodeAt(s++);
|
|
17
|
+
(h & 64512) == 56320 ? t.push(((a & 1023) << 10) + (h & 1023) + 65536) : (t.push(a), s--);
|
|
18
18
|
} else
|
|
19
|
-
t.push(
|
|
19
|
+
t.push(a);
|
|
20
20
|
}
|
|
21
21
|
return t;
|
|
22
22
|
}
|
|
23
|
-
const
|
|
23
|
+
const W = (e) => e >= 48 && e < 58 ? 26 + (e - 48) : e >= 65 && e < 91 ? e - 65 : e >= 97 && e < 123 ? e - 97 : 36, C = (e, t) => e + 22 + 75 * (e < 26 ? 1 : 0) - 0, I = (e, t, s) => {
|
|
24
24
|
let r = 0;
|
|
25
25
|
for (
|
|
26
26
|
e = s ? f(e / 700) : e >> 1, e += f(e / t);
|
|
27
27
|
/* no initialization */
|
|
28
|
-
e >
|
|
28
|
+
e > P * 26 >> 1;
|
|
29
29
|
r += 36
|
|
30
30
|
)
|
|
31
|
-
e = f(e /
|
|
32
|
-
return f(r + (
|
|
33
|
-
},
|
|
31
|
+
e = f(e / P);
|
|
32
|
+
return f(r + (P + 1) * e / (e + 38));
|
|
33
|
+
}, U = (e) => {
|
|
34
34
|
const t = [], s = e.length;
|
|
35
|
-
let r = 0,
|
|
35
|
+
let r = 0, a = 128, h = 72, i = e.lastIndexOf(y);
|
|
36
36
|
i < 0 && (i = 0);
|
|
37
37
|
for (let n = 0; n < i; ++n)
|
|
38
38
|
e.charCodeAt(n) >= 128 && l("not-basic"), t.push(e.charCodeAt(n));
|
|
39
39
|
for (let n = i > 0 ? i + 1 : 0; n < s; ) {
|
|
40
|
-
const
|
|
40
|
+
const u = r;
|
|
41
41
|
for (let m = 1, c = 36; ; c += 36) {
|
|
42
42
|
n >= s && l("invalid-input");
|
|
43
|
-
const _ =
|
|
43
|
+
const _ = W(e.charCodeAt(n++));
|
|
44
44
|
_ >= 36 && l("invalid-input"), _ > f((2147483647 - r) / m) && l("overflow"), r += _ * m;
|
|
45
|
-
const
|
|
46
|
-
if (_ <
|
|
45
|
+
const p = c <= h ? 1 : c >= h + 26 ? 26 : c - h;
|
|
46
|
+
if (_ < p)
|
|
47
47
|
break;
|
|
48
|
-
const d = 36 -
|
|
48
|
+
const d = 36 - p;
|
|
49
49
|
m > f(2147483647 / d) && l("overflow"), m *= d;
|
|
50
50
|
}
|
|
51
51
|
const o = t.length + 1;
|
|
52
|
-
|
|
52
|
+
h = I(r - u, o, u == 0), f(r / o) > 2147483647 - a && l("overflow"), a += f(r / o), r %= o, t.splice(r++, 0, a);
|
|
53
53
|
}
|
|
54
54
|
return String.fromCodePoint(...t);
|
|
55
|
-
},
|
|
55
|
+
}, E = (e) => {
|
|
56
56
|
const t = [], s = A(e), r = s.length;
|
|
57
|
-
let
|
|
57
|
+
let a = 128, h = 0, i = 72;
|
|
58
58
|
for (const o of s)
|
|
59
59
|
o < 128 && t.push(w(o));
|
|
60
60
|
const n = t.length;
|
|
61
|
-
let
|
|
62
|
-
for (n && t.push(
|
|
61
|
+
let u = n;
|
|
62
|
+
for (n && t.push(y); u < r; ) {
|
|
63
63
|
let o = 2147483647;
|
|
64
64
|
for (const c of s)
|
|
65
|
-
c >=
|
|
66
|
-
const m =
|
|
67
|
-
o -
|
|
65
|
+
c >= a && c < o && (o = c);
|
|
66
|
+
const m = u + 1;
|
|
67
|
+
o - a > f((2147483647 - h) / m) && l("overflow"), h += (o - a) * m, a = o;
|
|
68
68
|
for (const c of s)
|
|
69
|
-
if (c <
|
|
70
|
-
let _ =
|
|
71
|
-
for (let
|
|
72
|
-
const d =
|
|
69
|
+
if (c < a && ++h > 2147483647 && l("overflow"), c === a) {
|
|
70
|
+
let _ = h;
|
|
71
|
+
for (let p = 36; ; p += 36) {
|
|
72
|
+
const d = p <= i ? 1 : p >= i + 26 ? 26 : p - i;
|
|
73
73
|
if (_ < d)
|
|
74
74
|
break;
|
|
75
|
-
const
|
|
76
|
-
t.push(w(
|
|
75
|
+
const S = _ - d, x = 36 - d;
|
|
76
|
+
t.push(w(C(d + S % x))), _ = f(S / x);
|
|
77
77
|
}
|
|
78
|
-
t.push(w(
|
|
78
|
+
t.push(w(C(_))), i = I(h, m, u === n), h = 0, ++u;
|
|
79
79
|
}
|
|
80
|
-
++
|
|
80
|
+
++h, ++a;
|
|
81
81
|
}
|
|
82
82
|
return t.join("");
|
|
83
|
-
},
|
|
84
|
-
function
|
|
85
|
-
return
|
|
86
|
-
}
|
|
87
|
-
function P(e) {
|
|
88
|
-
return e.split("/").filter(I);
|
|
83
|
+
}, M = /^:/, v = /^\[.*\]$/;
|
|
84
|
+
function R(e) {
|
|
85
|
+
return M.test(e) || v.test(e);
|
|
89
86
|
}
|
|
90
87
|
function b(e) {
|
|
91
|
-
return e.
|
|
88
|
+
return e.split("/").filter(R);
|
|
89
|
+
}
|
|
90
|
+
function $(e) {
|
|
91
|
+
return e.slice(1, M.test(e) ? void 0 : -1);
|
|
92
92
|
}
|
|
93
|
-
function
|
|
94
|
-
return
|
|
95
|
-
const
|
|
96
|
-
return t[
|
|
93
|
+
function H(e, t) {
|
|
94
|
+
return b(e).reduce((s, r) => {
|
|
95
|
+
const a = $(r);
|
|
96
|
+
return t[a] ? s.replace(r, t[a]) : s;
|
|
97
97
|
}, e);
|
|
98
98
|
}
|
|
99
99
|
function T(e, t) {
|
|
100
|
-
return
|
|
101
|
-
const
|
|
102
|
-
[
|
|
100
|
+
return b(e).reduce((s, r) => {
|
|
101
|
+
const a = $(r), {
|
|
102
|
+
[a]: h,
|
|
103
103
|
...i
|
|
104
104
|
} = s;
|
|
105
105
|
return i;
|
|
106
106
|
}, t);
|
|
107
107
|
}
|
|
108
|
-
const
|
|
109
|
-
function
|
|
110
|
-
return e.charCodeAt(0) >
|
|
108
|
+
const j = 127;
|
|
109
|
+
function D(e) {
|
|
110
|
+
return e.charCodeAt(0) > j;
|
|
111
111
|
}
|
|
112
|
-
class
|
|
112
|
+
class g {
|
|
113
113
|
constructor(t) {
|
|
114
|
-
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)
|
|
114
|
+
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._basePath = "", this.punycodePrefix = "xn--", this._searchParams = new URLSearchParams(), typeof t == "string" || t instanceof URL)
|
|
115
115
|
this.href = t.toString();
|
|
116
116
|
else if (t) {
|
|
117
|
-
if (t.
|
|
117
|
+
if (t.basePath && (this._basePath = t.basePath.startsWith("/") ? t.basePath : `/${t.basePath}`), 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) {
|
|
118
|
+
const s = this._basePath;
|
|
119
|
+
let r = t.pathname;
|
|
120
|
+
s && !r.startsWith(s) && (r = `${s}${r.startsWith("/") ? "" : "/"}${r}`), this.pathname = H(r, t.query ?? {});
|
|
121
|
+
}
|
|
122
|
+
if (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) {
|
|
118
123
|
const s = T(t.pathname ?? "", t.query);
|
|
119
124
|
Object.keys(s).length > 0 && (this.search = new URLSearchParams(s).toString());
|
|
120
125
|
}
|
|
121
126
|
this.updateHref();
|
|
122
127
|
}
|
|
123
128
|
}
|
|
129
|
+
static withBasePath(t) {
|
|
130
|
+
return (s) => typeof s == "string" || s instanceof URL ? new g({
|
|
131
|
+
href: s.toString(),
|
|
132
|
+
basePath: t
|
|
133
|
+
}) : new g({
|
|
134
|
+
...s,
|
|
135
|
+
basePath: t
|
|
136
|
+
});
|
|
137
|
+
}
|
|
124
138
|
static create(t) {
|
|
125
|
-
return new
|
|
139
|
+
return new g(t);
|
|
126
140
|
}
|
|
127
141
|
static canParse(t) {
|
|
128
142
|
if (t.startsWith("/"))
|
|
@@ -166,8 +180,8 @@ class M {
|
|
|
166
180
|
return this._host;
|
|
167
181
|
}
|
|
168
182
|
set host(t) {
|
|
169
|
-
const [s, r] = t.split(":"),
|
|
170
|
-
this._host = r ? `${
|
|
183
|
+
const [s, r] = t.split(":"), a = this.encodeHostname(s);
|
|
184
|
+
this._host = r ? `${a}:${r}` : a, this._hostname = a, this._port = r || "", this.updateHref();
|
|
171
185
|
}
|
|
172
186
|
get hostname() {
|
|
173
187
|
return this._hostname;
|
|
@@ -186,8 +200,10 @@ class M {
|
|
|
186
200
|
return this._pathname;
|
|
187
201
|
}
|
|
188
202
|
set pathname(t) {
|
|
189
|
-
|
|
190
|
-
this.
|
|
203
|
+
let s = t;
|
|
204
|
+
this._basePath && !s.startsWith(this._basePath) && (s = `${this._basePath}${s.startsWith("/") ? "" : "/"}${s}`);
|
|
205
|
+
const r = s.split("/").map((a) => R(a) ? a : encodeURI(a)).join("/");
|
|
206
|
+
this._pathname = r.startsWith("/") ? r : `/${r}`, this.updateHref();
|
|
191
207
|
}
|
|
192
208
|
get search() {
|
|
193
209
|
return this._search;
|
|
@@ -200,11 +216,11 @@ class M {
|
|
|
200
216
|
this._search = s.toString() ? `?${s.toString()}` : "", this._searchParams = s, this.updateHref();
|
|
201
217
|
}
|
|
202
218
|
appendSearchParams(t) {
|
|
203
|
-
const s = new URLSearchParams(this._searchParams), r =
|
|
204
|
-
Object.keys(t).forEach((
|
|
205
|
-
r.includes(
|
|
206
|
-
[
|
|
207
|
-
}) : s.append(
|
|
219
|
+
const s = new URLSearchParams(this._searchParams), r = b(this._pathname).map($);
|
|
220
|
+
Object.keys(t).forEach((a) => {
|
|
221
|
+
r.includes(a) ? this._pathname = H(this._pathname, {
|
|
222
|
+
[a]: t[a]
|
|
223
|
+
}) : s.append(a, t[a]);
|
|
208
224
|
}), this._search = s.toString() ? `?${s.toString()}` : "", this._searchParams = s, this.updateHref();
|
|
209
225
|
}
|
|
210
226
|
removeSearchParams(...t) {
|
|
@@ -216,11 +232,11 @@ class M {
|
|
|
216
232
|
get searchParams() {
|
|
217
233
|
return new Proxy(this._searchParams, {
|
|
218
234
|
get: (t, s, r) => {
|
|
219
|
-
const
|
|
220
|
-
return typeof
|
|
221
|
-
const i =
|
|
235
|
+
const a = Reflect.get(t, s, r);
|
|
236
|
+
return typeof a == "function" ? (...h) => {
|
|
237
|
+
const i = a.apply(t, h);
|
|
222
238
|
return this._search = this._searchParams.toString() ? `?${this._searchParams.toString()}` : "", this.updateHref(), i;
|
|
223
|
-
} :
|
|
239
|
+
} : a;
|
|
224
240
|
}
|
|
225
241
|
});
|
|
226
242
|
}
|
|
@@ -261,22 +277,22 @@ class M {
|
|
|
261
277
|
encodeHostname(t) {
|
|
262
278
|
return t.split(".").map((s) => {
|
|
263
279
|
for (const r of s)
|
|
264
|
-
if (
|
|
265
|
-
return `${this.punycodePrefix}${
|
|
280
|
+
if (D(r))
|
|
281
|
+
return `${this.punycodePrefix}${E(s)}`;
|
|
266
282
|
return s;
|
|
267
283
|
}).join(".");
|
|
268
284
|
}
|
|
269
285
|
get decodedIDN() {
|
|
270
286
|
let t = this._href;
|
|
271
287
|
return this._hostname.split(".").forEach((s) => {
|
|
272
|
-
t = t.replace(s,
|
|
288
|
+
t = t.replace(s, U(s.replace(this.punycodePrefix, "")));
|
|
273
289
|
}), t;
|
|
274
290
|
}
|
|
275
291
|
get decodedHostname() {
|
|
276
|
-
return this._hostname.split(".").map((t) =>
|
|
292
|
+
return this._hostname.split(".").map((t) => U(t.replace(this.punycodePrefix, ""))).join(".");
|
|
277
293
|
}
|
|
278
294
|
}
|
|
279
295
|
export {
|
|
280
|
-
|
|
296
|
+
g as default
|
|
281
297
|
};
|
|
282
298
|
//# sourceMappingURL=index.mjs.map
|
package/dist/esm/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.mjs","sources":["../../src/punycode.ts","../../src/utils.ts","../../src/nurl.ts"],"sourcesContent":["/* eslint-disable eqeqeq */\n/* eslint-disable no-param-reassign */\n\ninterface PunycodeStatic {\n version: string\n ucs2: {\n decode(string: string): number[]\n encode(codePoints: number[]): string\n }\n decode(input: string): string\n encode(input: string): string\n toASCII(input: string): string\n toUnicode(input: string): string\n}\n\ntype ErrorMessages = Record<string, string>\n\n/** Highest positive signed 32-bit float value */\nconst maxInt: number = 2147483647 // aka. 0x7FFFFFFF or 2^31-1\n\n/** Bootstring parameters */\nconst base: number = 36\nconst tMin: number = 1\nconst tMax: number = 26\nconst skew: number = 38\nconst damp: number = 700\nconst initialBias: number = 72\nconst initialN: number = 128 // 0x80\nconst delimiter: string = '-' // '\\x2D'\n\n/** Regular expressions */\nconst regexPunycode: RegExp = /^xn--/\nconst regexNonASCII: RegExp = /[^\\0-\\x7F]/ // Note: U+007F DEL is excluded too.\nconst regexSeparators: RegExp = /[\\x2E\\u3002\\uFF0E\\uFF61]/g // RFC 3490 separators\n\n/** Error messages */\nconst errors: ErrorMessages = {\n overflow: 'Overflow: input needs wider integers to process',\n 'not-basic': 'Illegal input >= 0x80 (not a basic code point)',\n 'invalid-input': 'Invalid input',\n}\n\n/** Convenience shortcuts */\nconst baseMinusTMin: number = base - tMin\nconst floor: (x: number) => number = Math.floor\nconst stringFromCharCode: (...codes: number[]) => string = String.fromCharCode\n\n/* -------------------------------------------------------------------------- */\n\n/**\n * A generic error utility function.\n * @private\n * @param {string} type The error type.\n * @throws {RangeError} with the applicable error message.\n */\nfunction error(type: string): never {\n throw new RangeError(errors[type])\n}\n\n/**\n * A generic `Array#map` utility function.\n * @private\n * @param {T[]} array The array to iterate over.\n * @param {(value: T) => U} callback The function that gets called for every array item.\n * @returns {U[]} A new array of values returned by the callback function.\n */\nfunction map<T, U>(array: T[], callback: (value: T) => U): U[] {\n const result: U[] = new Array(array.length)\n let length: number = array.length\n while (length--) {\n result[length] = callback(array[length])\n }\n return result\n}\n\n/**\n * A simple `Array#map`-like wrapper to work with domain name strings or email addresses.\n * @private\n * @param {string} domain The domain name or email address.\n * @param {(string: string) => string} callback The function that gets called for every character.\n * @returns {string} A new string of characters returned by the callback function.\n */\nfunction mapDomain(domain: string, callback: (string: string) => string): string {\n const parts: string[] = domain.split('@')\n let result: string = ''\n if (parts.length > 1) {\n // In email addresses, only the domain name should be punycoded. Leave\n // the local part (i.e. everything up to `@`) intact.\n result = parts[0] + '@'\n domain = parts[1]\n }\n // Avoid `split(regex)` for IE8 compatibility. See #17.\n domain = domain.replace(regexSeparators, '\\x2E')\n const labels: string[] = domain.split('.')\n const encoded: string = map(labels, callback).join('.')\n return result + encoded\n}\n\n/**\n * Creates an array containing the numeric code points of each Unicode\n * character in the string.\n * @param {string} string The Unicode input string (UCS-2).\n * @returns {number[]} The new array of code points.\n */\nfunction ucs2decode(string: string): number[] {\n const output: number[] = []\n let counter: number = 0\n const length: number = string.length\n\n while (counter < length) {\n const value: number = string.charCodeAt(counter++)\n if (value >= 0xd800 && value <= 0xdbff && counter < length) {\n // It's a high surrogate, and there is a next character.\n const extra: number = string.charCodeAt(counter++)\n if ((extra & 0xfc00) == 0xdc00) {\n // Low surrogate.\n output.push(((value & 0x3ff) << 10) + (extra & 0x3ff) + 0x10000)\n } else {\n // It's an unmatched surrogate; only append this code unit, in case the\n // next code unit is the high surrogate of a surrogate pair.\n output.push(value)\n counter--\n }\n } else {\n output.push(value)\n }\n }\n return output\n}\n\n/**\n * Creates a string based on an array of numeric code points.\n * @param {number[]} codePoints The array of numeric code points.\n * @returns {string} The new Unicode string (UCS-2).\n */\nconst ucs2encode = (codePoints: number[]): string => String.fromCodePoint(...codePoints)\n\n/**\n * Converts a basic code point into a digit/integer.\n * @private\n * @param {number} codePoint The basic numeric code point value.\n * @returns {number} The numeric value of a basic code point.\n */\nconst basicToDigit = (codePoint: number): number => {\n if (codePoint >= 0x30 && codePoint < 0x3a) {\n return 26 + (codePoint - 0x30)\n }\n if (codePoint >= 0x41 && codePoint < 0x5b) {\n return codePoint - 0x41\n }\n if (codePoint >= 0x61 && codePoint < 0x7b) {\n return codePoint - 0x61\n }\n return base\n}\n\n/**\n * Converts a digit/integer into a basic code point.\n * @private\n * @param {number} digit The numeric value of a basic code point.\n * @param {number} flag The flag value.\n * @returns {number} The basic code point.\n */\nconst digitToBasic = (digit: number, flag: number): number => {\n // 0..25 map to ASCII a..z or A..Z\n // 26..35 map to ASCII 0..9\n // @descriptoin 원래 코드는 아래와 같았지만, 타입스크립트에서는 불리언 연산이 안되서 임의로 수정\n // return digit + 22 + 75 * (digit < 26) - ((flag != 0) << 5)\n return digit + 22 + 75 * (digit < 26 ? 1 : 0) - ((flag != 0 ? 1 : 0) << 5)\n}\n\n/**\n * Bias adaptation function as per section 3.4 of RFC 3492.\n * @private\n * @param {number} delta The delta value.\n * @param {number} numPoints The number of points.\n * @param {boolean} firstTime Whether this is the first time.\n * @returns {number} The adapted bias.\n */\nconst adapt = (delta: number, numPoints: number, firstTime: boolean): number => {\n let k: number = 0\n delta = firstTime ? floor(delta / damp) : delta >> 1\n delta += floor(delta / numPoints)\n for (; /* no initialization */ delta > (baseMinusTMin * tMax) >> 1; k += base) {\n delta = floor(delta / baseMinusTMin)\n }\n return floor(k + ((baseMinusTMin + 1) * delta) / (delta + skew))\n}\n\n/**\n * Converts a Punycode string of ASCII-only symbols to a string of Unicode symbols.\n * @param {string} input The Punycode string of ASCII-only symbols.\n * @returns {string} The resulting string of Unicode symbols.\n */\nconst decode = (input: string): string => {\n const output: number[] = []\n const inputLength: number = input.length\n let i: number = 0\n let n: number = initialN\n let bias: number = initialBias\n\n let basic: number = input.lastIndexOf(delimiter)\n if (basic < 0) {\n basic = 0\n }\n\n for (let j: number = 0; j < basic; ++j) {\n if (input.charCodeAt(j) >= 0x80) {\n error('not-basic')\n }\n output.push(input.charCodeAt(j))\n }\n\n for (let index: number = basic > 0 ? basic + 1 : 0; index < inputLength /* no final expression */; ) {\n const oldi: number = i\n for (let w: number = 1, k: number = base /* no condition */; ; k += base) {\n if (index >= inputLength) {\n error('invalid-input')\n }\n\n const digit: number = basicToDigit(input.charCodeAt(index++))\n\n if (digit >= base) {\n error('invalid-input')\n }\n if (digit > floor((maxInt - i) / w)) {\n error('overflow')\n }\n\n i += digit * w\n const t: number = k <= bias ? tMin : k >= bias + tMax ? tMax : k - bias\n\n if (digit < t) {\n break\n }\n\n const baseMinusT: number = base - t\n if (w > floor(maxInt / baseMinusT)) {\n error('overflow')\n }\n\n w *= baseMinusT\n }\n\n const out: number = output.length + 1\n bias = adapt(i - oldi, out, oldi == 0)\n\n if (floor(i / out) > maxInt - n) {\n error('overflow')\n }\n\n n += floor(i / out)\n i %= out\n\n output.splice(i++, 0, n)\n }\n\n return String.fromCodePoint(...output)\n}\n\n/**\n * Converts a string of Unicode symbols to a Punycode string of ASCII-only symbols.\n * @param {string} input The string of Unicode symbols.\n * @returns {string} The resulting Punycode string of ASCII-only symbols.\n */\nconst encode = (input: string): string => {\n const output: string[] = []\n\n // Convert the input in UCS-2 to an array of Unicode code points.\n const inputArray: number[] = ucs2decode(input)\n\n // Cache the length.\n const inputLength: number = inputArray.length\n\n // Initialize the state.\n let n: number = initialN\n let delta: number = 0\n let bias: number = initialBias\n\n // Handle the basic code points.\n for (const currentValue of inputArray) {\n if (currentValue < 0x80) {\n output.push(stringFromCharCode(currentValue))\n }\n }\n\n const basicLength: number = output.length\n let handledCPCount: number = basicLength\n\n // Finish the basic string with a delimiter unless it's empty.\n if (basicLength) {\n output.push(delimiter)\n }\n\n // Main encoding loop:\n while (handledCPCount < inputLength) {\n let m: number = maxInt\n for (const currentValue of inputArray) {\n if (currentValue >= n && currentValue < m) {\n m = currentValue\n }\n }\n\n const handledCPCountPlusOne: number = handledCPCount + 1\n if (m - n > floor((maxInt - delta) / handledCPCountPlusOne)) {\n error('overflow')\n }\n\n delta += (m - n) * handledCPCountPlusOne\n n = m\n\n for (const currentValue of inputArray) {\n if (currentValue < n && ++delta > maxInt) {\n error('overflow')\n }\n if (currentValue === n) {\n let q: number = delta\n for (let k: number = base /* no condition */; ; k += base) {\n const t: number = k <= bias ? tMin : k >= bias + tMax ? tMax : k - bias\n if (q < t) {\n break\n }\n const qMinusT: number = q - t\n const baseMinusT: number = base - t\n output.push(stringFromCharCode(digitToBasic(t + (qMinusT % baseMinusT), 0)))\n q = floor(qMinusT / baseMinusT)\n }\n\n output.push(stringFromCharCode(digitToBasic(q, 0)))\n bias = adapt(delta, handledCPCountPlusOne, handledCPCount === basicLength)\n delta = 0\n ++handledCPCount\n }\n }\n\n ++delta\n ++n\n }\n return output.join('')\n}\n\n/**\n * Converts a Punycode string representing a domain name or an email address to Unicode.\n * @param {string} input The Punycoded domain name or email address.\n * @returns {string} The Unicode representation of the given Punycode string.\n */\nconst toUnicode = (input: string): string => {\n return mapDomain(input, (string: string): string => {\n return regexPunycode.test(string) ? decode(string.slice(4).toLowerCase()) : string\n })\n}\n\n/**\n * Converts a Unicode string representing a domain name or an email address to Punycode.\n * @param {string} input The domain name or email address to convert.\n * @returns {string} The Punycode representation of the given domain name or email address.\n */\nconst toASCII = (input: string): string => {\n return mapDomain(input, (string: string): string => {\n return regexNonASCII.test(string) ? 'xn--' + encode(string) : string\n })\n}\n\n/** Define the public API */\n/**\n * @description originated from https://unpkg.com/browse/punycode@2.3.1/\n */\nconst punycode: PunycodeStatic = {\n version: '2.3.1',\n ucs2: {\n decode: ucs2decode,\n encode: ucs2encode,\n },\n decode,\n encode,\n toASCII,\n toUnicode,\n}\n\nexport {ucs2decode, ucs2encode, decode, encode, toASCII, toUnicode}\nexport default punycode\n","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","import {decode, encode} from './punycode'\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}${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":["delimiter","errors","overflow","baseMinusTMin","base","floor","Math","stringFromCharCode","String","fromCharCode","error","type","RangeError","ucs2decode","string","output","counter","length","value","charCodeAt","extra","push","basicToDigit","codePoint","digitToBasic","digit","flag","adapt","delta","numPoints","firstTime","k","damp","tMax","skew","decode","input","inputLength","i","n","initialN","bias","initialBias","basic","lastIndexOf","j","index","oldi","w","maxInt","t","tMin","baseMinusT","out","splice","fromCodePoint","encode","inputArray","currentValue","basicLength","handledCPCount","m","handledCPCountPlusOne","q","qMinusT","join","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","NURL","constructor","_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","updateHref","create","canParse","startsWith","url","origin","console","warn","searchParams","encodedHostname","encodeHostname","encodedPathname","map","segment","encodeURI","setSearchParams","_params","appendSearchParams","dynamicRoutes","forEach","key","includes","append","removeSearchParams","_keys","delete","Proxy","get","target","prop","receiver","Reflect","args","result","apply","toJSON","decodedIDN","decodedHostname"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.mjs","sources":["../../src/punycode.ts","../../src/utils.ts","../../src/nurl.ts"],"sourcesContent":["/* eslint-disable eqeqeq */\n/* eslint-disable no-param-reassign */\n\ninterface PunycodeStatic {\n version: string\n ucs2: {\n decode(string: string): number[]\n encode(codePoints: number[]): string\n }\n decode(input: string): string\n encode(input: string): string\n toASCII(input: string): string\n toUnicode(input: string): string\n}\n\ntype ErrorMessages = Record<string, string>\n\n/** Highest positive signed 32-bit float value */\nconst maxInt: number = 2147483647 // aka. 0x7FFFFFFF or 2^31-1\n\n/** Bootstring parameters */\nconst base: number = 36\nconst tMin: number = 1\nconst tMax: number = 26\nconst skew: number = 38\nconst damp: number = 700\nconst initialBias: number = 72\nconst initialN: number = 128 // 0x80\nconst delimiter: string = '-' // '\\x2D'\n\n/** Regular expressions */\nconst regexPunycode: RegExp = /^xn--/\nconst regexNonASCII: RegExp = /[^\\0-\\x7F]/ // Note: U+007F DEL is excluded too.\nconst regexSeparators: RegExp = /[\\x2E\\u3002\\uFF0E\\uFF61]/g // RFC 3490 separators\n\n/** Error messages */\nconst errors: ErrorMessages = {\n overflow: 'Overflow: input needs wider integers to process',\n 'not-basic': 'Illegal input >= 0x80 (not a basic code point)',\n 'invalid-input': 'Invalid input',\n}\n\n/** Convenience shortcuts */\nconst baseMinusTMin: number = base - tMin\nconst floor: (x: number) => number = Math.floor\nconst stringFromCharCode: (...codes: number[]) => string = String.fromCharCode\n\n/* -------------------------------------------------------------------------- */\n\n/**\n * A generic error utility function.\n * @private\n * @param {string} type The error type.\n * @throws {RangeError} with the applicable error message.\n */\nfunction error(type: string): never {\n throw new RangeError(errors[type])\n}\n\n/**\n * A generic `Array#map` utility function.\n * @private\n * @param {T[]} array The array to iterate over.\n * @param {(value: T) => U} callback The function that gets called for every array item.\n * @returns {U[]} A new array of values returned by the callback function.\n */\nfunction map<T, U>(array: T[], callback: (value: T) => U): U[] {\n const result: U[] = new Array(array.length)\n let length: number = array.length\n while (length--) {\n result[length] = callback(array[length])\n }\n return result\n}\n\n/**\n * A simple `Array#map`-like wrapper to work with domain name strings or email addresses.\n * @private\n * @param {string} domain The domain name or email address.\n * @param {(string: string) => string} callback The function that gets called for every character.\n * @returns {string} A new string of characters returned by the callback function.\n */\nfunction mapDomain(domain: string, callback: (string: string) => string): string {\n const parts: string[] = domain.split('@')\n let result: string = ''\n if (parts.length > 1) {\n // In email addresses, only the domain name should be punycoded. Leave\n // the local part (i.e. everything up to `@`) intact.\n result = parts[0] + '@'\n domain = parts[1]\n }\n // Avoid `split(regex)` for IE8 compatibility. See #17.\n domain = domain.replace(regexSeparators, '\\x2E')\n const labels: string[] = domain.split('.')\n const encoded: string = map(labels, callback).join('.')\n return result + encoded\n}\n\n/**\n * Creates an array containing the numeric code points of each Unicode\n * character in the string.\n * @param {string} string The Unicode input string (UCS-2).\n * @returns {number[]} The new array of code points.\n */\nfunction ucs2decode(string: string): number[] {\n const output: number[] = []\n let counter: number = 0\n const length: number = string.length\n\n while (counter < length) {\n const value: number = string.charCodeAt(counter++)\n if (value >= 0xd800 && value <= 0xdbff && counter < length) {\n // It's a high surrogate, and there is a next character.\n const extra: number = string.charCodeAt(counter++)\n if ((extra & 0xfc00) == 0xdc00) {\n // Low surrogate.\n output.push(((value & 0x3ff) << 10) + (extra & 0x3ff) + 0x10000)\n } else {\n // It's an unmatched surrogate; only append this code unit, in case the\n // next code unit is the high surrogate of a surrogate pair.\n output.push(value)\n counter--\n }\n } else {\n output.push(value)\n }\n }\n return output\n}\n\n/**\n * Creates a string based on an array of numeric code points.\n * @param {number[]} codePoints The array of numeric code points.\n * @returns {string} The new Unicode string (UCS-2).\n */\nconst ucs2encode = (codePoints: number[]): string => String.fromCodePoint(...codePoints)\n\n/**\n * Converts a basic code point into a digit/integer.\n * @private\n * @param {number} codePoint The basic numeric code point value.\n * @returns {number} The numeric value of a basic code point.\n */\nconst basicToDigit = (codePoint: number): number => {\n if (codePoint >= 0x30 && codePoint < 0x3a) {\n return 26 + (codePoint - 0x30)\n }\n if (codePoint >= 0x41 && codePoint < 0x5b) {\n return codePoint - 0x41\n }\n if (codePoint >= 0x61 && codePoint < 0x7b) {\n return codePoint - 0x61\n }\n return base\n}\n\n/**\n * Converts a digit/integer into a basic code point.\n * @private\n * @param {number} digit The numeric value of a basic code point.\n * @param {number} flag The flag value.\n * @returns {number} The basic code point.\n */\nconst digitToBasic = (digit: number, flag: number): number => {\n // 0..25 map to ASCII a..z or A..Z\n // 26..35 map to ASCII 0..9\n // @descriptoin 원래 코드는 아래와 같았지만, 타입스크립트에서는 불리언 연산이 안되서 임의로 수정\n // return digit + 22 + 75 * (digit < 26) - ((flag != 0) << 5)\n return digit + 22 + 75 * (digit < 26 ? 1 : 0) - ((flag != 0 ? 1 : 0) << 5)\n}\n\n/**\n * Bias adaptation function as per section 3.4 of RFC 3492.\n * @private\n * @param {number} delta The delta value.\n * @param {number} numPoints The number of points.\n * @param {boolean} firstTime Whether this is the first time.\n * @returns {number} The adapted bias.\n */\nconst adapt = (delta: number, numPoints: number, firstTime: boolean): number => {\n let k: number = 0\n delta = firstTime ? floor(delta / damp) : delta >> 1\n delta += floor(delta / numPoints)\n for (; /* no initialization */ delta > (baseMinusTMin * tMax) >> 1; k += base) {\n delta = floor(delta / baseMinusTMin)\n }\n return floor(k + ((baseMinusTMin + 1) * delta) / (delta + skew))\n}\n\n/**\n * Converts a Punycode string of ASCII-only symbols to a string of Unicode symbols.\n * @param {string} input The Punycode string of ASCII-only symbols.\n * @returns {string} The resulting string of Unicode symbols.\n */\nconst decode = (input: string): string => {\n const output: number[] = []\n const inputLength: number = input.length\n let i: number = 0\n let n: number = initialN\n let bias: number = initialBias\n\n let basic: number = input.lastIndexOf(delimiter)\n if (basic < 0) {\n basic = 0\n }\n\n for (let j: number = 0; j < basic; ++j) {\n if (input.charCodeAt(j) >= 0x80) {\n error('not-basic')\n }\n output.push(input.charCodeAt(j))\n }\n\n for (let index: number = basic > 0 ? basic + 1 : 0; index < inputLength /* no final expression */; ) {\n const oldi: number = i\n for (let w: number = 1, k: number = base /* no condition */; ; k += base) {\n if (index >= inputLength) {\n error('invalid-input')\n }\n\n const digit: number = basicToDigit(input.charCodeAt(index++))\n\n if (digit >= base) {\n error('invalid-input')\n }\n if (digit > floor((maxInt - i) / w)) {\n error('overflow')\n }\n\n i += digit * w\n const t: number = k <= bias ? tMin : k >= bias + tMax ? tMax : k - bias\n\n if (digit < t) {\n break\n }\n\n const baseMinusT: number = base - t\n if (w > floor(maxInt / baseMinusT)) {\n error('overflow')\n }\n\n w *= baseMinusT\n }\n\n const out: number = output.length + 1\n bias = adapt(i - oldi, out, oldi == 0)\n\n if (floor(i / out) > maxInt - n) {\n error('overflow')\n }\n\n n += floor(i / out)\n i %= out\n\n output.splice(i++, 0, n)\n }\n\n return String.fromCodePoint(...output)\n}\n\n/**\n * Converts a string of Unicode symbols to a Punycode string of ASCII-only symbols.\n * @param {string} input The string of Unicode symbols.\n * @returns {string} The resulting Punycode string of ASCII-only symbols.\n */\nconst encode = (input: string): string => {\n const output: string[] = []\n\n // Convert the input in UCS-2 to an array of Unicode code points.\n const inputArray: number[] = ucs2decode(input)\n\n // Cache the length.\n const inputLength: number = inputArray.length\n\n // Initialize the state.\n let n: number = initialN\n let delta: number = 0\n let bias: number = initialBias\n\n // Handle the basic code points.\n for (const currentValue of inputArray) {\n if (currentValue < 0x80) {\n output.push(stringFromCharCode(currentValue))\n }\n }\n\n const basicLength: number = output.length\n let handledCPCount: number = basicLength\n\n // Finish the basic string with a delimiter unless it's empty.\n if (basicLength) {\n output.push(delimiter)\n }\n\n // Main encoding loop:\n while (handledCPCount < inputLength) {\n let m: number = maxInt\n for (const currentValue of inputArray) {\n if (currentValue >= n && currentValue < m) {\n m = currentValue\n }\n }\n\n const handledCPCountPlusOne: number = handledCPCount + 1\n if (m - n > floor((maxInt - delta) / handledCPCountPlusOne)) {\n error('overflow')\n }\n\n delta += (m - n) * handledCPCountPlusOne\n n = m\n\n for (const currentValue of inputArray) {\n if (currentValue < n && ++delta > maxInt) {\n error('overflow')\n }\n if (currentValue === n) {\n let q: number = delta\n for (let k: number = base /* no condition */; ; k += base) {\n const t: number = k <= bias ? tMin : k >= bias + tMax ? tMax : k - bias\n if (q < t) {\n break\n }\n const qMinusT: number = q - t\n const baseMinusT: number = base - t\n output.push(stringFromCharCode(digitToBasic(t + (qMinusT % baseMinusT), 0)))\n q = floor(qMinusT / baseMinusT)\n }\n\n output.push(stringFromCharCode(digitToBasic(q, 0)))\n bias = adapt(delta, handledCPCountPlusOne, handledCPCount === basicLength)\n delta = 0\n ++handledCPCount\n }\n }\n\n ++delta\n ++n\n }\n return output.join('')\n}\n\n/**\n * Converts a Punycode string representing a domain name or an email address to Unicode.\n * @param {string} input The Punycoded domain name or email address.\n * @returns {string} The Unicode representation of the given Punycode string.\n */\nconst toUnicode = (input: string): string => {\n return mapDomain(input, (string: string): string => {\n return regexPunycode.test(string) ? decode(string.slice(4).toLowerCase()) : string\n })\n}\n\n/**\n * Converts a Unicode string representing a domain name or an email address to Punycode.\n * @param {string} input The domain name or email address to convert.\n * @returns {string} The Punycode representation of the given domain name or email address.\n */\nconst toASCII = (input: string): string => {\n return mapDomain(input, (string: string): string => {\n return regexNonASCII.test(string) ? 'xn--' + encode(string) : string\n })\n}\n\n/** Define the public API */\n/**\n * @description originated from https://unpkg.com/browse/punycode@2.3.1/\n */\nconst punycode: PunycodeStatic = {\n version: '2.3.1',\n ucs2: {\n decode: ucs2decode,\n encode: ucs2encode,\n },\n decode,\n encode,\n toASCII,\n toUnicode,\n}\n\nexport {ucs2decode, ucs2encode, decode, encode, toASCII, toUnicode}\nexport default punycode\n","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","import {decode, encode} from './punycode'\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 basePath?: 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 private _basePath: string = ''\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.basePath) {\n this._basePath = input.basePath.startsWith('/') ? input.basePath : `/${input.basePath}`\n }\n\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 const basePath = this._basePath\n let adjustedPathname = input.pathname\n if (basePath && !adjustedPathname.startsWith(basePath)) {\n adjustedPathname = `${basePath}${adjustedPathname.startsWith('/') ? '' : '/'}${adjustedPathname}`\n }\n\n this.pathname = refinePathnameWithQuery(adjustedPathname, 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 withBasePath(basePath: string) {\n return (urlOptions?: string | URL | URLOptions) => {\n if (typeof urlOptions === 'string' || urlOptions instanceof URL) {\n return new NURL({href: urlOptions.toString(), basePath})\n }\n return new NURL({...urlOptions, basePath})\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(inputPathname: string) {\n let pathname = inputPathname\n if (this._basePath && !pathname.startsWith(this._basePath)) {\n pathname = `${this._basePath}${pathname.startsWith('/') ? '' : '/'}${pathname}`\n }\n\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}${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":["delimiter","errors","overflow","baseMinusTMin","base","floor","Math","stringFromCharCode","String","fromCharCode","error","type","RangeError","ucs2decode","string","output","counter","length","value","charCodeAt","extra","push","basicToDigit","codePoint","digitToBasic","digit","flag","adapt","delta","numPoints","firstTime","k","damp","tMax","skew","decode","input","inputLength","i","n","initialN","bias","initialBias","basic","lastIndexOf","j","index","oldi","w","maxInt","t","tMin","baseMinusT","out","splice","fromCodePoint","encode","inputArray","currentValue","basicLength","handledCPCount","m","handledCPCountPlusOne","q","qMinusT","join","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","NURL","constructor","_href","_protocol","_host","_hostname","_port","_pathname","_search","_hash","_origin","_username","_password","_baseUrl","_searchParams","URLSearchParams","_basePath","punycodePrefix","URL","href","toString","basePath","startsWith","baseUrl","protocol","host","hostname","port","adjustedPathname","search","hash","username","password","refinedQuery","Object","keys","updateHref","withBasePath","urlOptions","create","canParse","url","origin","console","warn","searchParams","encodedHostname","encodeHostname","inputPathname","encodedPathname","map","segment","encodeURI","setSearchParams","_params","appendSearchParams","dynamicRoutes","forEach","key","includes","append","removeSearchParams","_keys","delete","Proxy","get","target","prop","receiver","Reflect","args","result","apply","toJSON","decodedIDN","decodedHostname"],"mappings":"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"}
|