@adraffy/ens-normalize
Advanced tools
Comparing version 1.3.16 to 1.5.0
@@ -1,1 +0,1 @@ | ||
function A(A){return 1&A?~A>>1:A>>1}function B(A,B){let w=Array(A);for(let g=0,C=-1;g<A;g++)w[g]=C+=1+B();return w}function w(B,w){let g=Array(B);for(let C=0,o=0;C<B;C++)g[C]=o+=A(w());return g}function g(A){let w=new Set(B(A(),A)),g=A(),C=B(g,A),o=function(A,B){let w=Array(A);for(let g=0;g<A;g++)w[g]=1+B();return w}(g,A);for(let A=0;A<g;A++)for(let B=0;B<o[A];B++)w.add(C[A]+B);return w}function C(A){let B=[];for(;;){let w=A();if(0==w)break;B.push(Q(w,A))}for(;;){let w=A()-1;if(w<0)break;B.push(e(w,A))}return B.flat().sort(((A,B)=>A[0]-B[0]))}function o(A){let B=[];for(;;){let w=A();if(0==w)break;B.push(w)}return B}function r(A,B,g,C){let o=Array(A).fill().map((()=>[]));for(let r=0;r<B;r++)w(A,g).forEach(((A,B)=>o[B].push(C?C[A]:A)));return o}function Q(A,B){let w=1+B(),g=B(),C=o(B);return r(C.length,1+A,B).map(((A,B)=>[A[0],A.slice(1),C[B],w,g]))}function e(A,B){return r(1+B(),1+A,B).map((A=>[A[0],A.slice(1)]))}function n(A,B,w){let g={};for(;;){let C=B(A);if(0==C.length)break;let o=1+A(),Q=Array(o).fill(g);for(let B of C)Q=r(o,B,A,w).map(((A,B)=>{let w=Q[B],g=String.fromCodePoint(...A),C=w[g];return C||(C=w[g]={}),C}));Q.forEach((A=>A[""]=1))}return g}function f(A,B){for(let[w,g,C,o,r]of A){let A=B-w;if(A<0)break;if(C>0){if(A<o*C&&A%o==0){let B=A/o;return g.map((A=>A+B*r))}}else if(0==A)return g}}function t(A){return A.replace(/[^\x20-\x21\x23-\x7A\x7C\x7E]/gu,(A=>`{${function(A){return A.toString(16).toUpperCase().padStart(2,"0")}(A.codePointAt(0))}}`))}function D(A){if("string"!=typeof A)throw new TypeError("expected string");return[...A].map((A=>A.codePointAt(0)))}var i,E=(i="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",function(A){let B=0;return()=>A[B++]}(function(A){let B=0;function w(){return A[B++]<<8|A[B++]}let g=w(),C=1,o=[0,1];for(let A=1;A<g;A++)o.push(C+=w());let r=w(),Q=B;B+=r;let e=0,n=0;function f(){return 0==e&&(n=n<<8|A[B++],e=8),n>>--e&1}const t=2**31,D=t>>>1,i=t-1;let E=0;for(let A=0;A<31;A++)E=E<<1|f();let I=[],Y=0,l=t;for(;;){let A=Math.floor(((E-Y+1)*C-1)/l),B=0,w=g;for(;w-B>1;){let g=B+w>>>1;A<o[g]?w=g:B=g}if(0==B)break;I.push(B);let r=Y+Math.floor(l*o[B]/C),Q=Y+Math.floor(l*o[B+1]/C)-1;for(;0==((r^Q)&D);)E=E<<1&i|f(),r=r<<1&i,Q=Q<<1&i|1;for(;r&~Q&536870912;)E=E&D|E<<1&i>>>1|f(),r=r<<1^D,Q=(Q^D)<<1|D|1;Y=r,l=1+Q-r}let u=g-4;return I.map((B=>{switch(B-u){case 3:return u+65792+(A[Q++]<<16|A[Q++]<<8|A[Q++]);case 2:return u+256+(A[Q++]<<8|A[Q++]);case 1:return u+A[Q++];default:return B-1}}))}(Uint8Array.from(atob(i),(A=>A.charCodeAt(0))))));const I=g(E),Y=g(E),l=C(E),u=g(E),c=g(E),F=g(E),k=g(E),M=g(E),h=g(E),J=g(E),U=n(E,(A=>Array(A()).fill(1))),G=n(E,o,[...k,...M].sort(((A,B)=>A-B)));function K(A,B=""){return Object.hasOwn(A,B)}function T(A,B){let w=$(...B.filter((A=>65039!=A)));if(K(A,w))return A[w]}function N(A,B){let w=A[B];if(!w)return;let g=A[B+1];if(J.has(w)&&g&&h.has(g))return[2,[w,g]];let C=65039===g;return k.has(w)?[C?2:1,[w]]:M.has(w)&&C?[2,[w,65039]]:void 0}function H(A,B){let w=A[B],g=$(w);if(K(U,g)){let w=U[g],C=B+1;for(;;){let B=A[C];if(!B)break;let g=$(B);if(!K(w,g))break;w=w[g],C++}if(K(w))return[C-B,A.slice(B,C)]}let C=A[B+1],o=c.has(w);if(o&&8419===C)return[2,[w,8419]];if((o||F.has(w))&&65039===C&&8419===A[B+2])return[3,o?[w,8419]:[w,65039,8419]];let r=N(A,B);if(!r)return[0];let[Q,e]=r,n=B+Q;if(C=A[n],8205===C){let w=T(G,e);if(w){let g,C=[],o=n;for(;8205===A[o++];){let B=N(A,o);if(!B)break;let[r,Q]=B;if(w=T(w,Q),!w)break;o+=r,C.push(8205,...Q),K(w)&&(e.push(...C),C.length=0,g=o)}if(g)return[g-B,e]}}return r}const a=Array(E()).fill().map((()=>g(E))),s=C(E),S=g(E),L=44032;function V(A){return A>=L&&A<55204}function j(A,B){if(A<128)B(A);else if(V(A)){let w=A-L,g=w%588/28|0,C=w%28;B(4352+(w/588|0)),B(4449+g),C>0&&B(4519+C)}else{let w=f(s,A);if(w)for(let A of w)j(A,B);else B(A)}}function R(A,B){let w=[];function g(){w.sort(((A,B)=>A[0]-B[0])).forEach((([A,w])=>B(A,w))),w.length=0}function C(A){let C=1+a.findIndex((B=>B.has(A)));0==C?(g(),B(C,A)):w.push([C,A])}A.forEach((A=>j(A,C))),g()}function b(A){let B=[],w=[],g=-1,C=0;return R(A,(function(A,o){if(-1===g)0==A?g=o:B.push(o);else if(C>0&&C>=A)0==A?(B.push(g,...w),w.length=0,g=o):w.push(o),C=A;else{let r=function(A,B){if(A>=4352&&A<4371&&B>=4449&&B<4470)return L+(588*(A-4352)+28*(B-4449));if(V(A)&&B>4519&&B<4547&&(A-L)%28==0)return A+(B-4519);for(let[w,g]of s)if(2==g.length&&g[0]==A&&g[1]==B){if(S.has(w))break;return w}return-1}(g,o);r>=0?g=r:0==C&&0==A?(B.push(g),g=o):(w.push(o),C=A)}})),g>=0&&B.push(g),B.push(...w),B}const P=a[E()],W=g(E),d=g(E),x=g(E),X=g(E),O=g(E),p=g(E);const m=g(E),y=g(E),z=g(E),q=g(E),v=g(E),Z=g(E);const $=String.fromCodePoint.bind(String);function _(A){let B=wA(b(D(A)),(A=>{if(46==A)return;if(Y.has(A))return[];if(I.has(A))return[A];let B=f(l,A);if(B)return B;throw new Error(`Disallowed character "${t($(A))}"`)})).map((A=>({cps:A.flatMap((({e:A,v:B})=>A??B)),text:A.reduce(((A,{v:B})=>(B?A.push(...B):A.length>0&&A.push(65039),A)),[])}))),w=B.some((A=>A.text.some((A=>m.has(A)||z.has(A)))));return B.map((({cps:A,text:B})=>{if(A.length>0){if(u.has(A[0]))throw BA(A,"leading combining mark");try{!function(A){for(let B=0,w=A.length-1;B<=w;B++){switch(A[B]){case 8204:if(B>0&&P.has(A[B-1]))continue;if(B>0&&B<w){let g=B-1;for(;g>0&&W.has(A[g]);)g--;if(d.has(A[g])){let g=B+1;for(;g<w&&W.has(A[g]);)g++;if(x.has(A[g]))continue}}break;case 8205:if(B>0&&P.has(A[B-1]))continue;break;case 183:if(B>0&&B<w&&108==A[B-1]&&108==A[B+1])continue;break;case 885:if(B<w&&X.has(A[B+1]))continue;break;case 1523:case 1524:if(B>0&&O.has(A[B-1]))continue;break;default:continue}throw new Error(`No context for "${t($(A[B]))}"`)}if(A.some((A=>A>=1632&&A<=1641))&&A.some((A=>A>=1776&&A<=1785)))throw new Error("Disallowed arabic-indic digit mixture");if(A.includes(12539)&&!A.some((A=>p.has(A))))throw new Error("Disallowed katakana")}(B),w&&function(A){let B=A.length-1;if(m.has(A[0])){if(!A.every((A=>m.has(A)||z.has(A)||q.has(A)||v.has(A)||Z.has(A))))throw new Error("RTL: disallowed properties");for(;Z.has(A[B]);)B--;if(B=A[B],!(m.has(B)||q.has(B)||z.has(B)))throw new Error("RTL: disallowed ending");if(A.some((A=>q.has(A)))&&A.some((A=>z.has(A))))throw new Error("RTL: AN+EN")}else{if(!y.has(A[0]))throw new Error("unknown direction");if(!A.every((A=>y.has(A)||q.has(A)||v.has(A)||Z.has(A))))throw new Error("LTR: disallowed properties");for(;Z.has(A[B]);)B--;if(B=A[B],!y.has(B)&&!q.has(B))throw new Error("LTR: disallowed ending")}}(B)}catch(B){throw BA(A,B.message)}}return $(...A)})).join($(46))}function AA(A){return wA(b(D(A)),(A=>{if(46==A)return{};if(I.has(A))return[A];if(Y.has(A))return{i:A};let B=f(l,A);return B?{m:B,u:[A]}:{d:A}}))[0]}function BA(A,B){return new Error(`Disallowed label "${t($(...A))}": ${B}`)}function wA(A,B){let w=[],g=[],C=[g];function o(){w.length>0&&(g.push({v:w}),w=[])}for(let r=0;r<A.length;r++){let[Q,e]=H(A,r);if(Q>0){o(),g.push({e:e,u:A.slice(r,r+Q)}),r+=Q-1;continue}let n=B(A[r]);Array.isArray(n)?w.push(...n):(o(),n?g.push(n):(g=[],C.push(g)))}return o(),C}export{_ as ens_normalize,AA as ens_tokenize}; | ||
function A(A){return 1&A?~A>>1:A>>1}function g(A,g){let B=Array(A);for(let C=0,w=-1;C<A;C++)B[C]=w+=1+g();return B}function B(g,B){let C=Array(g);for(let w=0,o=0;w<g;w++)C[w]=o+=A(B());return C}function C(A,B){let C=g(A(),A),w=A(),o=g(w,A),e=function(A,g){let B=Array(A);for(let C=0;C<A;C++)B[C]=1+g();return B}(w,A);for(let A=0;A<w;A++)for(let g=0;g<e[A];g++)C.push(o[A]+g);return B?C.map((A=>B[A])):C}function w(A,g,C,w){let o=Array(A).fill().map((()=>[]));for(let e=0;e<g;e++)B(A,C).forEach(((A,g)=>o[g].push(w?w(A):A)));return o}function o(A,g){let B=1+g(),C=g(),o=function(A){let g=[];for(;;){let B=A();if(0==B)break;g.push(B)}return g}(g);return w(o.length,1+A,g).flatMap(((A,g)=>{let[w,...e]=A;return Array(o[g]).fill().map(((A,g)=>{let o=g*C;return[w+g*B,e.map((A=>A+o))]}))}))}function e(A,g){return w(1+g(),1+A,g).map((A=>[A[0],A.slice(1)]))}var t=function(A){let g=0;return()=>A[g++]}(function(A){let g=0;function B(){return A[g++]<<8|A[g++]}let C=B(),w=1,o=[0,1];for(let A=1;A<C;A++)o.push(w+=B());let e=B(),t=g;g+=e;let n=0,E=0;function Q(){return 0==n&&(E=E<<8|A[g++],n=8),E>>--n&1}const I=2**31,D=I>>>1,s=I-1;let M=0;for(let A=0;A<31;A++)M=M<<1|Q();let l=[],r=0,F=I;for(;;){let A=Math.floor(((M-r+1)*w-1)/F),g=0,B=C;for(;B-g>1;){let C=g+B>>>1;A<o[C]?B=C:g=C}if(0==g)break;l.push(g);let e=r+Math.floor(F*o[g]/w),t=r+Math.floor(F*o[g+1]/w)-1;for(;0==((e^t)&D);)M=M<<1&s|Q(),e=e<<1&s,t=t<<1&s|1;for(;e&~t&536870912;)M=M&D|M<<1&s>>>1|Q(),e=e<<1^D,t=(t^D)<<1|D|1;r=e,F=1+t-e}let K=C-4;return l.map((g=>{switch(g-K){case 3:return K+65792+(A[t++]<<16|A[t++]<<8|A[t++]);case 2:return K+256+(A[t++]<<8|A[t++]);case 1:return K+A[t++];default:return g-1}}))}(Uint8Array.from(atob("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"),(A=>A.charCodeAt(0)))));const n=new Set(C(t)),E=new Set(C(t)),Q=function(A){let g=[];for(;;){let B=A();if(0==B)break;g.push(o(B,A))}for(;;){let B=A()-1;if(B<0)break;g.push(e(B,A))}return Object.fromEntries(g.flat())}(t),I=function(A){let g=C(A).sort(((A,g)=>A-g));return function B(){let w=[];for(;;){let o=C(A);if(0==o.length)break;w.push({set:new Set(o.map((A=>g[A]))),node:B()})}w.sort(((A,g)=>g.set.size-A.set.size));let o=A();return{branches:w,valid:0!=(1&o),fe0f:0!=(2&o),save:0!=(4&o),check:0!=(8&o)}}()}(t);function D(A){return A.filter((A=>65039!=A))}function s(A,g=!1){let B=[...A].map((A=>A.codePointAt(0))).reverse(),C=[];for(;B.length;){let A=M(B,I);if(A){C.push(...g?A.emoji:D(A.input));continue}let w=B.pop();if(n.has(w)){C.push(w);continue}if(E.has(w))continue;let o=Q[w];if(!o)throw new Error(`Disallowed codepoint: 0x${w.toString(16).toUpperCase()}`);C.push(...o)}return String.fromCodePoint(...C).normalize("NFC")}function M(A,g){let B,C,w=[],o=[],e=A.length;for(;e;){let t=A[--e];if(65039!==t){if(g=g.branches.find((A=>A.set.has(t)))?.node,!g)break;w.push(t),C=g.fe0f,C&&w.push(65039),g.valid&&(C&&e>0&&65039==A[e-1]&&(C=!1,e--),B=w.slice(),o.push(...A.slice(e).reverse()),A.length=e)}else{if(!C)break;C=!1}}if(B)return{input:o,emoji:B}}new Set(C(t,[...n].sort(((A,g)=>A-g))));export{s as ens_normalize}; |
@@ -1,1 +0,1 @@ | ||
function t(t){return t.toString(16).toUpperCase().padStart(2,"0")}function n(n){return`{${t(n)}}`}function e(...e){return o=String.fromCodePoint(...e),(d=n=>8204==n?'<span class="mod zwj">ZWNJ</span>':8205==n?'<span class="mod zwj">ZWJ</span>':`<code>${t(n)}</code>`)||(d=n),o.replace(/(?:([\x00-\x20\x7F\xA0\s\u200C\u200D\u{E0020}-\u{E007F}])|([^\x21-\x25\x27-\x3B\x3D\x3F-\x7E]))/gu,((t,n,e)=>n?d(n.codePointAt(0)):`&#${e.codePointAt(0)};`));var o,d}function o(n){return`Hex: 0x${n.map(t).join(" ")}\nDec: ${n.join(" ")}`}function d(n,d=!0){let r=document.createElement("div");return r.classList.add("tokens"),r.append(...n.flatMap((({v:n,m:r,i:a,d:i,e:s,u:p})=>{let l;if(s){let n=d?s:p;l=document.createElement("a"),l.href=`https://emojipedia.org/${String.fromCodePoint(...n)}`,l.classList.add("glyph");for(let e of n){let n=document.createElement("span");if(8205==e)n.classList.add("mod","zwj"),n.innerHTML="ZWJ";else if(65039==e)n.classList.add("mod","dropped","style"),n.innerHTML="FE0F";else if(8419==e)n.classList.add("mod","keycap"),n.innerHTML="Keycap";else if(e>=917536&&e<=917631){e-=917504;let o=String.fromCodePoint(e);127===e?(n.classList.add("mod"),n.innerHTML="TagEnd"):(/^[\x21-\x7E]+$/gu.test(o)?n.innerHTML=o:(n=document.createElement("code"),n.innerHTML=t(e)),n.classList.add("mod","tag"))}else s.includes(e)?(n.classList.add("emoji"),n.innerHTML=String.fromCodePoint(e)):(n=document.createElement("code"),n.classList.add("mod","dropped"),n.innerHTML=t(e));l.append(n)}}else if(l=document.createElement("div"),n)l.innerHTML=e(...n),l.title=o(n),l.classList.add("valid");else if(r){l.classList.add("mapped");for(let t of d?r:p){let n=document.createElement("span");n.innerHTML=e(t),n.title=o([t]),l.append(n)}}else a?(l=document.createElement("code"),l.innerHTML=t(a),l.title=o([a]),l.classList.add("ignored")):void 0!==i?(l.classList.add("disallowed"),l.innerHTML=e(i),l.title=o([i])):(l.classList.add("stop"),l.innerHTML=".");return l}))),r}function r(){let t=document.createElement("style");t.innerText="\n\t.tokens {\n\t\tdisplay: flex;\n\t\tflex-wrap: wrap;\n\t\tgap: 2px;\n\t}\n\t.tokens > * {\n\t\tpadding: 2px 4px;\n\t\tdisplay: flex;\n\t\talign-items: center;\n\t\tgap: 4px;\n\t}\n\t.tokens a {\n\t\ttext-decoration: none;\n\t}\n\t.tokens a:hover {\n\t\toutline: 2px solid #00f;\n\t}\n\t.tokens .valid {\n\t\tborder-radius: 5px;\n\t\tbackground: #cfc;\n\t\tborder: 2px solid #0a0;\n\t\tline-break: anywhere;\n\t}\n\t.tokens .ignored {\n\t\tcolor: #fff;\n\t\tbackground: #aaa;\n\t\tmin-width: 5px;\n\t}\n\t.tokens .disallowed {\n\t\tbackground: #f66;\t\n\t}\n\t.tokens .mapped {\n\t\tdisplay: flex;\n\t\tborder: 2px solid #66f;\n\t\tbackground: #ccf;\n\t\tborder-radius: 5px;\n\t}\n\t.tokens .mapped span {\n\t\tmargin-bottom: -4px;\n\t\tborder-bottom: 4px solid #000;\n\t}\n\t.tokens .stop {\n\t\tfont-weight: bold;\n\t}\n\t.tokens .glyph {\n\t\tborder: 2px solid #0aa;\n\t\tborder-radius: 0.5rem;\n\t\tbackground: #cff;\n\t}\n\t.tokens .mod {\n\t\tfont-size: 70%;\n\t\tpadding: 2px;\n\t\tbackground: #333;\n\t\tcolor: #fff;\n\t\tborder-radius: 5px;\n\t}\n\t.tokens .mod.zwj {\n\t\tbackground: #0aa;\n\t}\n\t.tokens .mod.tag {\n\t\tbackground: #33f;\n\t}\n\t.tokens .mod.dropped {\n\t\tbackground: #aaa;\n\t\tmin-width: 5px;\n\t}\n\t.tokens code {\n\t\tfont-size: 90%;\n\t\tpadding: 2px;\n\t\tborder-radius: 5px;\n\t\tcolor: #fff;\n\t\tbackground: rgba(0, 0, 0, .3);\n\t\talign-self: center;\n\t}",document.body.append(t)}export{d as dom_from_tokens,r as use_default_style}; | ||
function t(t){return t.toString(16).toUpperCase()}function n(n){return`{${t(n)}}`}function e(t,e=n){return t.replace(/(?:([\x00-\x20\x7F\xA0\s\u200C\u200D\u{E0020}-\u{E007F}])|([^\x21-\x25\x27-\x3B\x3D\x3F-\x7E]))/gu,((t,n,d)=>n?e(n.codePointAt(0)):`&#${d.codePointAt(0)}`))}function d(n){return e(String.fromCodePoint(...n),(n=>8204==n?'<span class="mod zwj">ZWNJ</span>':8205==n?'<span class="mod zwj">ZWJ</span>':`<code>${t(n)}</code>`))}function o(n){return`Hex: 0x${n.map(t).join(" ")}\nDec: ${n.join(" ")}`}function a(){let t=document.createElement("span");return t.classList.add("arrow"),t.innerHTML="→",t}function s(n,e){let r=document.createElement("div");return r.classList.add("tokens"),e&&(n=n.flatMap((t=>"nfc"===t.type?t.tokens:t))),r.append(...n.flatMap((n=>{let r;if("emoji"===n.type){let d=e?n.input:n.cps;r=document.createElement("a"),r.href=`https://emojipedia.org/${String.fromCodePoint(...n.emoji)}`,r.classList.add("glyph"),r.append(...d.map(((n,e)=>{let d=document.createElement("span");if(8205==n)d.classList.add("mod","zwj"),d.innerHTML="ZWJ";else if(65039==n)d.classList.add("mod","dropped","style"),d.innerHTML="FE0F";else if(8419==n)d.classList.add("mod","keycap"),d.innerHTML="Keycap";else if(n>=917536&&n<=917631){n-=917504;let e=String.fromCodePoint(n);127===n?(d.classList.add("mod"),d.innerHTML="TagEnd"):(/^[\x21-\x7E]+$/gu.test(e)?d.innerHTML=e:(d=document.createElement("code"),d.innerHTML=t(n)),d.classList.add("mod","tag"))}else d.classList.add("emoji"),d.innerHTML=String.fromCodePoint(n);return d})))}else if("nfc"===n.type){r=document.createElement("div"),r.classList.add("nfc");let t=s(n.tokens,!1);t.classList.add("before");let e=document.createElement("div");e.classList.add("valid"),e.innerHTML=d(n.cps),e.title=o(n.cps),r.append(t,a(),e)}else if(r=document.createElement("div"),"valid"===n.type)r.classList.add("valid"),r.innerHTML=d(n.cps),r.title=o(n.cps);else if("mapped"===n.type){r.classList.add("mapped");let t=document.createElement("span");t.classList.add("before"),t.innerHTML=d([n.cp]),t.title=o([n.cp]),r.append(t),e||r.append(a(),...n.cps.map((t=>{let n=document.createElement("span");return n.innerHTML=d([t]),n.title=o([t]),n})))}else if("ignored"===n.type)r=document.createElement("code"),r.innerHTML=t(n.cp),r.title=o([n.cp]),r.classList.add("ignored");else if("disallowed"===n.type)r.classList.add("disallowed"),r.innerHTML=d([n.cp]),r.title=o([n.cp]);else{if("stop"!==n.type)throw new TypeError(`unknown token type: ${n.type}`);r.classList.add("stop"),r.innerHTML="."}return r}))),r}function r(){let t=document.createElement("style");t.innerText="\n\t.tokens {\n\t\tdisplay: flex;\n\t\tflex-wrap: wrap;\n\t\tgap: 2px;\n\t}\n\t.tokens > * {\n\t\tpadding: 2px 4px;\n\t\tdisplay: flex;\n\t\talign-items: center;\n\t\tgap: 4px;\n\t}\n\t.tokens a {\n\t\ttext-decoration: none;\n\t}\n\t.tokens a:hover {\n\t\toutline: 2px solid #00f;\n\t}\n\t.tokens .valid {\n\t\tborder-radius: 5px;\n\t\tbackground: #cfc;\n\t\tborder: 2px solid #0a0;\n\t\tline-break: anywhere;\n\t}\n\t.tokens .ignored {\n\t\tcolor: #fff;\n\t\tbackground: #aaa;\n\t\tmin-width: 5px;\n\t}\n\t.tokens .disallowed {\n\t\tbackground: #f66;\t\n\t}\n\t.tokens .mapped {\n\t\tdisplay: flex;\n\t\tborder: 2px solid #66f;\n\t\tbackground: #ccf;\n\t\tborder-radius: 5px;\n\t}\n\t.tokens .mapped span:first-child {\n\t\tmargin-bottom: -4px;\n\t\tborder-bottom: 4px solid #000;\n\t}\n\t.tokens .stop {\n\t\tfont-weight: bold;\n\t}\n\t.tokens .glyph {\n\t\tborder: 2px solid #0aa;\n\t\tborder-radius: 0.5rem;\n\t\tbackground: #cff;\n\t}\n\t.tokens .mod {\n\t\tfont-size: 70%;\n\t\tpadding: 2px;\n\t\tbackground: #333;\n\t\tcolor: #fff;\n\t\tborder-radius: 5px;\n\t}\n\t.tokens .mod.zwj {\n\t\tbackground: #0aa;\n\t}\n\t.tokens .mod.tag {\n\t\tbackground: #33f;\n\t}\n\t.tokens .mod.dropped {\n\t\tbackground: #aaa;\n\t\tmin-width: 5px;\n\t}\n\t.tokens .arrow {\n\t\tcolor: #666;\n\t}\n\t.tokens .nfc {\n\t\tdisplay: flex;\n\t\tborder: 2px solid #fa0;\n\t\tbackground: #fd8;\n\t\tborder-radius: 5px;\n\t}\n\t.tokens code {\n\t\tfont-size: 90%;\n\t\tpadding: 2px;\n\t\tborder-radius: 5px;\n\t\tcolor: #fff;\n\t\tbackground: rgba(0, 0, 0, .3);\n\t\talign-self: center;\n\t}",document.body.append(t)}export{s as dom_from_tokens,r as use_default_style}; |
export function ens_normalize(name: string): string; | ||
export function ens_tokenize(name: string): {}[]; | ||
interface BaseToken { | ||
type: string; | ||
} | ||
interface DisallowedToken extends BaseToken { | ||
type: 'invalid' | 'disallowed'; | ||
cp: number; | ||
} | ||
interface AllowedToken extends BaseToken { | ||
type: string; | ||
cps: number[]; | ||
} | ||
interface ValidToken extends AllowedToken { | ||
type: 'valid'; | ||
} | ||
interface MappedToken extends AllowedToken { | ||
type: 'mapped'; | ||
cp: number; | ||
} | ||
interface EmojiToken extends AllowedToken { | ||
type: 'emoji'; | ||
emoji: number[]; | ||
} | ||
interface NFCToken extends AllowedToken { | ||
type: 'nfc'; | ||
input: number[]; | ||
tokens: Token[]; | ||
} | ||
type Token = DisallowedToken | ValidToken | MappedToken | EmojiToken | NFCToken; | ||
export function ens_tokenize(name: string): Token[]; |
@@ -1,1 +0,1 @@ | ||
export * from './dist/ens-normalize.js'; | ||
export * from './src/lib.js'; |
{ | ||
"name": "@adraffy/ens-normalize", | ||
"version": "1.3.16", | ||
"version": "1.5.0", | ||
"description": "Compact ES6 Ethereum Name Service (ENS) Name Normalizer", | ||
@@ -29,9 +29,14 @@ "keywords": [ | ||
"scripts": { | ||
"unicode-download": "node build/unicode.js download", | ||
"unicode-parse": "node build/unicode.js parse", | ||
"build-tables": "node build/build-tables.js all", | ||
"build": "node build/build.js", | ||
"test-source": "node test/test-lib.js build/lib-normalize.js", | ||
"test-build": "node test/test-lib.js dist/ens-normalize.js" | ||
"make": "node src/make.js", | ||
"build": "rollup -c", | ||
"build-dev": "rollup -c rollup-dev.config.js", | ||
"test": "node test/validate.js" | ||
}, | ||
"devDependencies": { | ||
"@adraffy/ensip-norm": "^0.0.4", | ||
"@adraffy/punycode": "^0.0.2", | ||
"@rollup/plugin-node-resolve": "^13.3.0", | ||
"rollup": "^2.77.1", | ||
"rollup-plugin-terser": "^7.0.2" | ||
} | ||
} | ||
} |
# ens-normalize.js | ||
1-file, 1-function, 1-argument, 0-dependancy Compact ES6 Ethereum Name Service (ENS) Name Normalizer. | ||
0-dependancy Compact ES6 Ethereum Name Service (ENS) Name Normalizer. | ||
* Uses Unicode v14.0.0 + [UTS-51](https://unicode.org/reports/tr51/) + [UTS-46](https://unicode.org/reports/tr46/) w/IDNA2008 | ||
* Handles [`ContextJ/ContextO`](https://github.com/adraffy/ens-normalize.js/blob/main/build/context.js) | ||
* Handles [`CheckBidi`](https://github.com/adraffy/ens-normalize.js/blob/main/build/bidi.js) | ||
* Passes **100%** [IDNATestV2](https://adraffy.github.io/ens-normalize.js/test/report-idna.html) (Using `uts46` Payload) | ||
* Handles [Emoji ZWJ Sequences](https://unicode.org/emoji/charts/emoji-zwj-sequences.html) | ||
* Passes **100%** [Emoji Sequences](https://adraffy.github.io/ens-normalize.js/test/report-emoji.html) (Using `uts51` Payload) | ||
* Passes **100%** [NormalizationTests](https://adraffy.github.io/ens-normalize.js/test/report-nf.html) | ||
* Ignores [Punycode](https://datatracker.ietf.org/doc/html/rfc3492) | ||
* Passes **100%** [ENSIP Norm Validation Tests](https://adraffy.github.io/ensip-norm/) | ||
* Filesize: 20KB | ||
* [Demo](https://adraffy.github.io/ens-normalize.js/test/resolver.html) | ||
--- | ||
* [Demo: Resolver](https://adraffy.github.io/ens-normalize.js/test/resolver.html) | ||
* Generated Report vs `eth-ens-namehash` [Latest version](https://adraffy.github.io/ens-normalize.js/test/output/ens-2.0.15-adraffy-1.3.16.html) | ||
```Javascript | ||
import {ens_normalize} from '@adraffy/ens-normalize'; | ||
// browser: | ||
// 'https://unpkg.com/@adraffy/ens-normalize@latest/dist/ens-normalize.min.js' | ||
// npm i @adraffy/ens-normalize | ||
// browser: https://unpkg.com/@adraffy/ens-normalize@latest/dist/index.min.js | ||
// Primary API: string -> string | ||
let normalized = ens_normalize('š“āāļø.eth'); // throws | ||
let normalized = ens_normalize('š“āāļø.eth'); // throws on invalid names | ||
// ready for namehash | ||
// errors: | ||
// - not a string | ||
// - contains disallowed character | ||
// - label starts with combining mark | ||
// - character out of context | ||
// - bidi error | ||
// note: does not enforce .eth TLD 3-character minimum | ||
``` | ||
Instead of exposing an IDNA-like API (`is_valid()`, `get_mapped()`, etc.), this library converts names to tokens for use in providing a better UX for end-users. Also, see: <b>parts.js</b> submodule below. | ||
Instead of exposing an IDNA-like API (`is_valid()`, `get_mapped()`, etc.), this library exposes a single function which converts names to tokens: | ||
```JavaScript | ||
// Secondary API: string -> [{tokens,...}] | ||
// Secondary API: string -> Token[] | ||
// turn a name into a list of tokens | ||
let tokens = ens_tokenize('Rš©\uFE0Fa\xAD./'); // never throws | ||
// [ | ||
// {m: [0x72], u:[0x52]}, // mapped u:"R" -> m:"r" | ||
// {e: [0x1F4A9], u:[0x1F4A9,0xFE0F]}, // emoji: u:"š©" -> e:"š©" | ||
// {v: [0x61]}, // valid: "a" | ||
// {i: 0xAD}, // ignored: \xAD | ||
// {}, // stop: "." | ||
// {d: 0x2F} // disallowed: "/" | ||
// { | ||
// type: 'mapped', | ||
// cp: 82, // input | ||
// cps: [ 114 ] // output | ||
// }, | ||
// { | ||
// type: 'emoji', | ||
// input: [ 128169, 65039 ], // input | ||
// emoji: [ 128169, 65039 ], // ideal form | ||
// cps: [ 128169 ] // output | ||
// }, | ||
// { type: 'valid', cps: [ 97 ] }, | ||
// { type: 'ignored', cp: 173 }, | ||
// { type: 'stop' }, | ||
// { type: 'disallowed', cp: 47 } | ||
// ] | ||
``` | ||
### Independent submodules: | ||
```Javascript | ||
// Unicode Normalized Forms | ||
// see: build/nf.js (algo) | ||
// see: build/lib-nf.js (api) | ||
// see: https://adraffy.github.io/ens-normalize.js/test/report-nf.html | ||
import {nfc, nfd} from 'dist/nf.min.js'; | ||
// {nfc,nfd}(string): string | ||
// CheckBidi | ||
// see: build/bidi.js (algo) | ||
// see: build/lib-bidi.js (api) | ||
// see: https://www.rfc-editor.org/rfc/rfc5893.html#section-2 | ||
import {check_bidi, is_bidi_domain_name} from 'dist/bidi.min.js'; | ||
// is_bidi_domain_name(string): bool | ||
// check_bidi(string) throws | ||
## Build | ||
// Parts -- generate HTML from parsed tokens | ||
// see: build/lib-parts.js (api) | ||
// see: https://adraffy.github.io/ens-normalize.js/test/report-emoji.html | ||
import {dom_from_tokens, use_default_style} from 'dist/parts.min.js'; | ||
// use_default_style(); installs a stylesheet | ||
// DOMNode.append(dom_from_tokens(ens_tokenize('raffy.eth'))); | ||
``` | ||
## Building | ||
* Clone to access `build/`. The actual source is in `build/lib-normalize.js`. You can run this file directly. | ||
* Run `node build/unicode.js download` to download data from [unicode.org](https://www.unicode.org/Public/). | ||
* Run `node build/unicode.js parse` to parse those files into JSON files. | ||
* Run `node build/build-tables.js all` to build compressed rule payloads. | ||
* Run `node test/test-lib.js build/lib-normalize.js` to test the source template. | ||
* Run `node build/build.js` to inject the compressed tables into the source template and create `dist/` files. | ||
* Run `node test/test-lib.js dist/ens-normalize.js` to test the generated library. | ||
* `npm run make` compress data from [@adraffy/ensip-norm](https://adraffy.github.io/ensip-norm/) | ||
* `npm run test` run validation tests | ||
* `npm run build` create `/dist/` | ||
* `npm run build-dev` compile `parts.js`, `dns.js`, and `all.js` |
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
Major refactor
Supply chain riskPackage has recently undergone a major refactor. It may be unstable or indicate significant internal changes. Use caution when updating to versions that include significant changes.
Found 1 instance in 1 package
Long strings
Supply chain riskContains long string literals, which may be a sign of obfuscated or packed code.
Found 1 instance in 1 package
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
Major refactor
Supply chain riskPackage has recently undergone a major refactor. It may be unstable or indicate significant internal changes. Use caution when updating to versions that include significant changes.
Found 1 instance in 1 package
161759
5
24
1833
47
1