@adraffy/ens-normalize
Advanced tools
Comparing version 1.1.1 to 1.2.0
@@ -1,51 +0,93 @@ | ||
export const VERSION = '1.1.1'; | ||
// built: 2021-12-12T05:55:37.727Z | ||
export const VERSION = '1.2.0'; | ||
export const UNICODE = '14.0.0'; | ||
// injected from ./decoder.js | ||
class Decoder { | ||
constructor(bytes) { | ||
let buf = 0; | ||
let n = 0; | ||
let ret = []; | ||
next: for (let x of bytes) { | ||
buf = (buf << 8) | x; | ||
n += 8; | ||
while (n >= 3) { | ||
switch ((buf >> (n - 2)) & 3) { // upper 2 bits | ||
case 3: | ||
if (n < 10) continue next; | ||
ret.push((buf >> (n -= 10)) & 255); | ||
continue; | ||
case 2: | ||
if (n < 6) continue next; | ||
ret.push((buf >> (n -= 6)) & 15); | ||
continue; | ||
default: | ||
ret.push((buf >> (n -= 3)) & 3); | ||
} | ||
function arithmetic_decoder(bytes) { | ||
let pos = 0; | ||
function u16() { return (bytes[pos++] << 8) | bytes[pos++]; } | ||
// decode the frequency table | ||
let symbol_count = u16(); | ||
let total = 1; | ||
let acc = [0, 1]; // first symbol has frequency 1 | ||
for (let i = 1; i < symbol_count; i++) { | ||
acc.push(total += u16()); | ||
} | ||
// skip the symbols that index into the payload | ||
let skip = u16(); | ||
let pos_payload = pos; | ||
pos += skip; | ||
let read_width = 0; | ||
let read_buffer = 0; | ||
function read_bit() { | ||
if (read_width == 0) { | ||
// this will read beyond end of buffer | ||
// but (undefined|0) => zero pad | ||
read_buffer = (read_buffer << 8) | bytes[pos++]; | ||
read_width += 8; | ||
} | ||
return (read_buffer >> --read_width) & 1; | ||
} | ||
const N = 31; | ||
const FULL = 2**N; | ||
const HALF = FULL >>> 1; | ||
const QRTR = HALF >> 1; | ||
const MASK = FULL - 1; | ||
let register = 0; | ||
for (let i = 0; i < N; i++) register = (register << 1) | read_bit(); | ||
let symbols = []; | ||
let low = 0; | ||
let range = FULL; | ||
while (true) { | ||
let value = Math.floor((((register - low + 1) * total) - 1) / range); | ||
let start = 0; | ||
let end = symbol_count; | ||
while (end - start > 1) { | ||
let mid = (start + end) >>> 1; | ||
if (value < acc[mid]) { | ||
end = mid; | ||
} else { | ||
start = mid; | ||
} | ||
} | ||
this.buf = ret; | ||
//this.buf = bytes; | ||
if (start == 0) break; | ||
symbols.push(start); | ||
let a = low + Math.floor(range * acc[start] / total); | ||
let b = low + Math.floor(range * acc[start+1] / total) - 1 | ||
while (((a ^ b) & HALF) == 0) { | ||
register = (register << 1) & MASK | read_bit(); | ||
a = (a << 1) & MASK; | ||
b = (b << 1) & MASK | 1; | ||
} | ||
while (a & ~b & QRTR) { | ||
register = (register & HALF) | ((register << 1) & (MASK >>> 1)) | read_bit(); | ||
a = (a << 1) ^ HALF; | ||
b = ((b ^ HALF) << 1) | HALF | 1; | ||
} | ||
low = a; | ||
range = 1 + b - a; | ||
} | ||
let offset = symbol_count - 4; | ||
return symbols.map(x => { | ||
switch (x - offset) { | ||
case 3: return offset + 0x10100 + ((bytes[pos_payload++] << 16) | (bytes[pos_payload++] << 8) | bytes[pos_payload++]); | ||
case 2: return offset + 0x100 + ((bytes[pos_payload++] << 8) | bytes[pos_payload++]); | ||
case 1: return offset + bytes[pos_payload++]; | ||
default: return x - 1; | ||
} | ||
}); | ||
} | ||
// injected from ./decoder.js | ||
class Decoder { | ||
constructor(values) { | ||
this.pos = 0; | ||
this.values = values; | ||
} | ||
/* | ||
get more() { | ||
return this.pos < this.table.length; | ||
} | ||
*/ | ||
// unsigned pseudo-huffman | ||
// note: no overflow check | ||
read() { | ||
let {buf, pos} = this; | ||
let x0 = buf[pos]; | ||
if (x0 < 0x80) { | ||
this.pos += 1; | ||
return x0; | ||
} | ||
if (x0 < 0xFF) { | ||
this.pos += 2; | ||
return 0x80 + (((x0 & 0x7F) << 8) | buf[pos+1]); | ||
} | ||
this.pos += 4; | ||
return 0x7F80 + ((buf[pos+1] << 16) | (buf[pos+2] << 8) | buf[pos+3]); | ||
return this.values[this.pos++]; | ||
} | ||
@@ -71,2 +113,9 @@ read_signed() { // eg. [0,1,2,3...] => [0,-1,1,-2,...] | ||
} | ||
read_member_tables(n) { | ||
let ret = []; | ||
for (let i =0; i < n; i++) { | ||
ret.push(this.read_member_table()); | ||
} | ||
return ret; | ||
} | ||
// returns [[x, n], ...] s.t. [x,3] == [x,x+1,x+2] | ||
@@ -88,7 +137,11 @@ read_member_table() { | ||
let ret = []; | ||
for (let n = this.read(), i = 0; i < n; i++) { | ||
ret.push(this.read_linear_table()); | ||
while (true) { | ||
let w = this.read(); | ||
if (w == 0) break; | ||
ret.push(this.read_linear_table(w)); | ||
} | ||
for (let n = 1 + this.read(), i = 1; i < n; i++) { | ||
ret.push(this.read_mapped_replacement(i)); | ||
while (true) { | ||
let w = this.read() - 1; | ||
if (w < 0) break; | ||
ret.push(this.read_mapped_replacement(w)); | ||
} | ||
@@ -110,3 +163,3 @@ return ret.flat().sort((a, b) => a[0] - b[0]); | ||
read_mapped_replacement(w) { | ||
let n = this.read(); | ||
let n = 1 + this.read(); | ||
let vX = this.read_ascending(n); | ||
@@ -116,4 +169,3 @@ let mY = this.read_ys_transposed(n, w); | ||
} | ||
read_linear_table() { | ||
let w = 1 + this.read(); | ||
read_linear_table(w) { | ||
let dx = 1 + this.read(); | ||
@@ -154,2 +206,26 @@ let dy = this.read(); | ||
} | ||
// injected from ./decoder.js | ||
function lookup_mapped(table, cp) { | ||
for (let [x, ys, n, dx, dy] of table) { | ||
let d = cp - x; | ||
if (d < 0) break; | ||
if (n > 0) { | ||
if (d < dx * n && d % dx == 0) { | ||
let r = d / dx; | ||
return ys.map(y => y + r * dy); | ||
} | ||
} else if (d == 0) { | ||
return ys; | ||
} | ||
} | ||
} | ||
// injected from ./decoder.js | ||
function lookup_member(table, cp) { | ||
for (let [x, n] of table) { | ||
let d = cp - x; | ||
if (d < 0) break; | ||
if (d < n) return true; | ||
} | ||
return false; | ||
} | ||
// injected from ./utils.js | ||
@@ -159,4 +235,17 @@ function escape_unicode(s) { | ||
} | ||
// injected from ./utils.js | ||
function split_on(v, x) { | ||
let ret = []; | ||
let pos = 0; | ||
while (true) { | ||
let next = v.indexOf(x, pos); | ||
if (next == -1) break; | ||
ret.push(v.slice(pos, next)); | ||
pos = next + 1; | ||
} | ||
ret.push(v.slice(pos)); | ||
return ret; | ||
} | ||
// compressed lookup tables | ||
let r = new Decoder(Uint8Array.from(atob('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BAAAAAAAAACcAAAAAAAAAIAAAAAAAAAIAAAAAAAAAIAAAAAAAAAIAAAAAAAAATgAAAAAAAABAAAAAAAAABAAAAAAAAABAAAAAAAAABAAAAAAAAACcIIIIThBBBCcIIIIThBBBCcIIIIThBBBCcIIIIThBBBCcIIIIThBBBCcIIIIThBBBCcIIIIThBBBCcIIIIThBBBCcIIIIThBBBCcIIIIThBBBCcIIIIThBBBCcIIIIThBBBCcIIIIThBBBCcIIIIThBBBCcIIIIThBBBCcIIIIThBBBCcIIIIThBBBCcIIIIThBBBCcIIIIThBBBCcIIIIThBBBCcIIIIThBBBCcIIIIThBBBCcIIIIThBBBCcIIIITgBABABABACcAIAIAIAIATgBABABABAD/3s/EAAf+8a11cBsn/vGPs2rEsuyKjgJpOBxxcBq1XBZRknC91jS/95N564DZP/eMfZtWJZdkVHATScDji4DVquCyjJOF7rGl/7ybz1wGyf+8Y+zasSy7IqOAmk4HHFwGrVcFlGScL3WNL/3k3nrgNk/94x9m1Yll2RUcBNJwOOLgNWq4LKMk4XusaX/vJvPXAbJ/7xj7NqxLLsio4CaTgccXAatVwWUZJwvdY0v/eTeeuA2T/3jH2bViWXZFRwE0nA44uA1argsoyThe6xpf+8m89cBsn/vGPs2rEsuyKjgJpOBxxcBq1XBZRknC91jS/95N564DZP/eMfZtWJZdkVHATScDji4DVquCyjJOF7rGl/7ybz1wGyf+8Y+zasSy7IqOAmk4HHFwGrVcFlGScL3WNL/3k3nrgNk/94x9m1Yll2RUcBNJwOOLgNWq4LKMk4XusaX/vJvPXAbJ/7xj7NqxLLsio4CaTgccXAatVwWUZJwvdY0v/eTeeuA2T/3jH2bViWXZFRwE0nA44uA1argsoyThe6xpf+8m89cBsn/vGPs2rEsuyKjgJpOBxxcBq1XBZRknC91jS/95N564DZP/eMfZtWJZdkVHATScDji4DVquCyjJOF7rGl/7ybz1wGyf+8Y+zasSy7IqOAmk4HHFwGrVcFlGScL3WNL/3k+8yORyORyORyORyORyORyORyORyORyORyORyORyORyORyORyORyORyORyORyORyORyORyORyORyORyORyORyORyORyORyORyORyORyORyORyORyORyORyORyORyORyORyORyORyORyORyORyORyORyORyORyORyORyORyORyORyORyORyORyORyORyORyORyORyORyORyORyORyORyORyORyORyORyORyORyORyORyORyORyORyORyORyORyORyORyORyORyORyORyORyORyORyORyORyORyORyORyORyORyORyORyORyORyORyORyORyORyORyORyORyORyORyORyORyORyORyORyf+8n1xJSpKVJSpKVJSpKVJSpKVJSpKVJSpKVJSpKVJYmz/73bYgAAAAAAAAB/72jdgAgAgAgAgB/73bZAAAAAAAAAB/72jeElPIlOpFOlJOkpQDwHD6DuFuL8BmGT8Ddo8qxHWVfwHQcdo3EVWZZuSsbVClTKzqmRJcB5d999+P6fj9/AV14rJt12JOTEDkl/A5XwHbarjPDdfvvB51wG7sqZ04qaU6SlwGrFnar6Zpf3/Tzth4DTzrGQy08D8+Qkk43kRJLLLbbJJbbbc7bbZOOLEMfx1YlfTNOmVM7J555aOD5bgMv4DP675+B2ym2mSpcJpPF8/6uP/Ln+M4zjM+I4zjczknmnqxnGVLRPjKkpnxnGcZxnGcZxnGcZxnGcZx3EZ8RtxGfEbcRnxG3EZ8RtxGfEcRpppp5DieE3+mrFKs2oqc1OK08D/XFZ//43zuNX3PT+AyLGTi0xJRxChX4/kspypGckklEkpklTyzzyzkmWlkolkkmjGcZy8klSqnFCSZCiSjIZZJXp5KJJJJLJJJJJJJJJJJJJJJJJJpxnGSTLJKSVKqZZZUXk+R1XTEkklZlj+P4zjOMzYjjOMkudzVYzjJc82MlyTYzjOM4zjOM4zjOM4zjOM4ziE2ITYhNiE2ITYhNiE2ITYhNiE1NNNNOQllkklFHGaSSTwGha7wHuZhwWebRwG2cB7WgZvknAX8DlWf8D8XOc9z3u8xz2tdB2M2NcHnHB6vwe3dp+3ceHwv+ZRw2Q8L/WUcFneKZBdJV3GwZBkGQZBoHAZBoGQd968+7Yhi+JY3NxWrcVq9VY97yvfy3YB6+PensP/jIuK/8Sz8B7HAejwHtcB6c3AZhwGM8B83AenViXA2cB2etY1wHOzWTd93GgZRil3dY7/40zWv/Gz/niHAettFmSelQ563RiHp7KkkkkkkkkkkkliCSSSXF9vNsQ9HyO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'), c => c.charCodeAt(0))); | ||
let r = new Decoder(arithmetic_decoder(Uint8Array.from(atob('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qjuwVaqACmM+jEZEUmlGPt8+4z7fPtk+1T7hPuE+3T7dPt0+3T7bPts+1z7XPtc+1z7hzHDMbsxsI1QzTCJFASMVRQAvOA0zRzkFE043JWIQ39Lf0N/O38zfyt/I38bfxN/C38Df0t/Q387fzN/KNTM1NTUzMzNCA0IPQg/KKsooyibKJMoiyiDKHsocyhrKGMoqyijKJsokyiLKIMoeyhzKGsoYyirKKNzcXgRs7TqnO61Vp4AHYzuMQ0RPaUMfF7oHVAezyOs/JD7BSkIqG65tPs49Ckg+5h5SYg5oPEQwOjwmGCMxMx8pDRD1QhBCJPY+5RYQYQsVcl48JwseqUIDQhMACScnL0ViOB04RScVPBYGBlMIQTHHF2AQX7NAQDI4PBYjJxE5HSNBUDcVWjIXNjALOiAYQiIlFlIVBkhCQgMx1lhgGl81QEIiJ0IDBkEC55AJkE2IApjEApjJApjECCgC55AJlALnkE2IApjIApjJApjKAufWCQgJAueQfgLnkAmQAqRvAphUAAQAnABgagOgtAmtCZACo5kCl94MApoF9gLnjAKaY6QClywqRgBclgFoBPoCpQ+kApcsKkYAXJYBaAT6AqUPpAKXLCpGAFyWAWgE+gKluQKlnAfbCWgCpmMCl4ICmI8ItgKb/gKjqwKcCAE/Ab9ycwLnkAmQAua2TYgCojICojECojICojECojICojECojICojECojICojECojICojECojICojECojICojECojICojECojICojECojICojECojICojECojICojECojICojECojIC55AJkALmth4C55AJkALmtk2IAufWAueQCZAC5rYCAgLyYgmRCZACpG8CmFQABACcAGBqA6C0CakJkALmtgLlyAKYnaQClywqRgBclgFoBPoCpQ+kApcsKkYAXJYBaAT6AqUPpAKXLCpGAFyWAWgE+gKlD6QClywqRgBclgFoBPoCpQ+kApcsKkYAXJYBaAT6AqUPpAKXLCpGAFyWAWgE+gKlD6QClywqRgBclgFoBPoCpQ+kApcsKkYAXJYBaAT6AqUPpAKXLCpGAFyWAWgE+gKlD6QClywqRgBclgFoBPoCpQ+kApcsKkYAXJYBaAT6AqUPpAKXLCpGAFyWAWgE+gKlD6QClywqRgBclgFoBPoCpQ+kApcsKkYAXJYBaAT6AqUPpAKX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'), c => c.charCodeAt(0)))); | ||
const COMBINING_MARKS = r.read_member_table(); | ||
@@ -168,27 +257,93 @@ const IGNORED = r.read_member_table(); | ||
const JOIN_RD = r.read_member_table(); | ||
const VIRAMA = r.read_member_table(); | ||
const MAPPED = r.read_mapped_table(); | ||
const ZWNJ_EMOJI = r.read_emoji(); | ||
const MAPPED = r.read_mapped_table(); | ||
r = null; | ||
const COMBINING_RANK = r.read_member_tables(1 + r.read()); | ||
const VIRAMA = COMBINING_RANK[r.read()]; | ||
const DECOMP = r.read_mapped_table(); | ||
const COMP_EXCLUSIONS = r.read_member_table(); | ||
const BIDI_R_AL = r.read_member_table(); | ||
const BIDI_L = r.read_member_table(); | ||
const BIDI_AN = r.read_member_table(); | ||
const BIDI_EN = r.read_member_table(); | ||
const BIDI_ECTOB = r.read_member_table(); | ||
const BIDI_NSM = r.read_member_table(); | ||
function lookup_member(table, cp) { | ||
for (let [x, n] of table) { | ||
let d = cp - x; | ||
if (d < 0) break; | ||
if (d < n) return true; | ||
// ************************************************************ | ||
// normalization forms | ||
// algorithmic hangul | ||
// https://www.unicode.org/versions/Unicode14.0.0/ch03.pdf | ||
const S0 = 0xAC00; | ||
const L0 = 0x1100; | ||
const V0 = 0x1161; | ||
const T0 = 0x11A7; | ||
const L_COUNT = 19; | ||
const V_COUNT = 21; | ||
const T_COUNT = 28; | ||
const N_COUNT = V_COUNT * T_COUNT; | ||
const S_COUNT = L_COUNT * N_COUNT; | ||
const S1 = S0 + S_COUNT; | ||
const L1 = L0 + L_COUNT; | ||
const V1 = V0 + V_COUNT; | ||
const T1 = T0 + T_COUNT; | ||
function is_hangul(cp) { | ||
return cp >= S0 && cp < S1; | ||
} | ||
function decompose(cp, next) { | ||
if (cp < 0x80) { | ||
next(cp); | ||
} else if (is_hangul(cp)) { | ||
let s_index = cp - S0; | ||
let l_index = s_index / N_COUNT | 0; | ||
let v_index = (s_index % N_COUNT) / T_COUNT | 0; | ||
let t_index = s_index % T_COUNT; | ||
next(L0 + l_index); | ||
next(V0 + v_index); | ||
if (t_index > 0) next(T0 + t_index); | ||
} else { | ||
let mapped = lookup_mapped(DECOMP, cp); | ||
if (mapped) { | ||
for (let cp of mapped) { | ||
decompose(cp, next); | ||
} | ||
} else { | ||
next(cp); | ||
} | ||
} | ||
return false; | ||
} | ||
function compose_pair(a, b) { | ||
if (a >= L0 && a < L1 && b >= V0 && b < V1) { // LV | ||
let l_index = a - L0; | ||
let v_index = b - V0; | ||
let lv_index = l_index * N_COUNT + v_index * T_COUNT; | ||
return S0 + lv_index; | ||
} else if (is_hangul(a) && b > T0 && b < T1 && (a - S0) % T_COUNT == 0) { | ||
return a + (b - T0); | ||
} else { | ||
for (let [combined, v] of DECOMP) { | ||
if (v.length == 2 && v[0] == a && v[1] == b) { | ||
if (lookup_member(COMP_EXCLUSIONS, combined)) break; | ||
return combined; | ||
} | ||
} | ||
} | ||
return -1; | ||
} | ||
function lookup_mapped(cp) { | ||
for (let [x, y, n, dx, dy] of MAPPED) { | ||
let d = cp - x; | ||
if (d < 0) break; | ||
if (n > 0) { | ||
if (d < n && d % dx == 0) { | ||
let r = d / dx; | ||
return y.map(x => x + r * dy); | ||
} | ||
} else if (d == 0) { | ||
return y; | ||
function decomposer(cps, callback) { | ||
let stack = []; | ||
cps.forEach(cp => decompose(cp, next)); | ||
drain(); | ||
function drain() { | ||
stack.sort((a, b) => a[0] - b[0]).forEach(([rank, cp]) => callback(rank, cp)); | ||
stack.length = 0; | ||
} | ||
function next(cp) { | ||
let rank = 1 + COMBINING_RANK.findIndex(table => lookup_member(table, cp)); | ||
if (rank == 0) { | ||
drain(); | ||
callback(rank, cp); | ||
} else { | ||
stack.push([rank, cp]); | ||
} | ||
@@ -198,100 +353,130 @@ } | ||
export function is_zwnj_emoji(v, pos) { | ||
let {length} = v; | ||
for (let b = Math.min(pos, ZWNJ_EMOJI.length); b > 0; b--) { | ||
let bucket = ZWNJ_EMOJI[b]; | ||
if (!bucket) continue; | ||
next: for (let emoji of bucket) { // TODO: early abort | ||
let i = pos - b; | ||
for (let c of emoji) { | ||
if (i >= length) continue next; | ||
let ci = v[i]; | ||
if (ci === 0xFE0F) { // this could be is_ignored() | ||
i++; // skip | ||
continue; | ||
} else if (c != v[i++]) { | ||
continue next; | ||
} | ||
export function nfd(cps) { | ||
let ret = []; | ||
decomposer(cps, (_, cp) => ret.push(cp)); | ||
return ret; | ||
} | ||
export function nfc(cps) { | ||
let ret = []; | ||
let stack = []; | ||
let prev_cp = -1; | ||
let prev_rank = 0; | ||
decomposer(cps, next); | ||
if (prev_cp >= 0) ret.push(prev_cp); | ||
ret.push(...stack); | ||
return ret; | ||
function next(rank, cp) { | ||
if (prev_cp === -1) { | ||
if (rank == 0) { | ||
prev_cp = cp; | ||
} else { | ||
ret.push(cp); | ||
} | ||
return true; | ||
} else if (prev_rank > 0 && prev_rank >= rank) { | ||
if (rank == 0) { | ||
ret.push(prev_cp, ...stack); | ||
stack.length = 0; | ||
prev_cp = cp; | ||
} else { | ||
stack.push(cp); | ||
} | ||
prev_rank = rank; | ||
} else { | ||
let composed = compose_pair(prev_cp, cp); | ||
if (composed >= 0) { | ||
prev_cp = composed; | ||
} else if (prev_rank == 0 && rank == 0) { | ||
ret.push(prev_cp); | ||
prev_cp = cp; | ||
} else { | ||
stack.push(cp); | ||
prev_rank = rank; | ||
} | ||
} | ||
} | ||
return false; | ||
} | ||
// adapted from https://github.com/mathiasbynens/punycode.js | ||
// overflow removed because only used after idna | ||
// note: not safe to export for general use | ||
// string -> string | ||
function puny_decode(input) { | ||
let output = []; | ||
let index = input.lastIndexOf('-'); | ||
for (let i = 0; i < index; ++i) { | ||
let code = input.charCodeAt(i); | ||
if (code >= 0x80) throw new Error('punycode: expected basic'); | ||
output.push(code); | ||
// ************************************************************ | ||
function puny_decode(cps) { | ||
// https://datatracker.ietf.org/doc/html/rfc3492 | ||
// adapted from https://github.com/mathiasbynens/punycode.js | ||
// puny format: "xn--{ascii}-{0-9a-z}" | ||
// this function receives normalized cps such that: | ||
// * no uppercase | ||
// * no overflow (#section-6.4) | ||
let ret = []; | ||
let pos = cps.lastIndexOf(0x2D); // hyphen | ||
for (let i = 0; i < pos; i++) { | ||
let cp = cps[i]; | ||
if (cp >= 0x80) throw new Error('expected ASCII'); | ||
ret.push(cp); | ||
} | ||
index++; // skip delimiter | ||
// https://datatracker.ietf.org/doc/html/rfc3492#section-3.4 | ||
pos++; // skip hyphen | ||
// #section-5 | ||
const BASE = 36; | ||
const T_MIN = 1; | ||
const T_MAX = 26; | ||
const DELTA_SKEW = 38; | ||
const DELTA_DAMP = 700; | ||
const BASE_MIN = BASE - T_MIN; | ||
const MAX_DELTA = (BASE_MIN * T_MAX) >> 1; | ||
let bias = 72; | ||
let n = 0x80; | ||
let i = 0; | ||
const {length} = input; | ||
while (index < length) { | ||
const SKEW = 38; | ||
const DAMP = 700; | ||
const MAX_DELTA = (BASE - T_MIN) * T_MAX >> 1; | ||
let i = 0, n = 128, bias = 72; | ||
while (pos < cps.length) { | ||
let prev = i; | ||
for (let w = 1, k = BASE; ; k += BASE) { | ||
if (index >= length) throw new Error('punycode: invalid'); | ||
let code = input.charCodeAt(index++) | ||
if (code < 0x3A) { // 30 + 0A | ||
code -= 0x16; | ||
} else if (code < 0x5B) { // 41 + 1A | ||
code -= 0x41; | ||
} else if (code < 0x7B) { // 61 + 1A | ||
code -= 0x61; | ||
if (pos >= cps.length) throw new Error(`invalid encoding`); | ||
let cp = cps[pos++]; | ||
if (cp >= 0x30 && cp <= 0x39) { // 0-9 | ||
cp -= 0x16; // 26 + (code - 0x30) | ||
} else if (cp >= 0x61 && cp <= 0x7A) { // a-z | ||
cp -= 0x61; | ||
} else { | ||
throw new Error(`punycode: invalid byte ${code}`); | ||
throw new Error(`invalid character ${cp}`); | ||
} | ||
i += code * w; | ||
i += cp * w; | ||
const t = k <= bias ? T_MIN : (k >= bias + T_MAX ? T_MAX : k - bias); | ||
if (code < t) break; | ||
if (cp < t) break; | ||
w *= BASE - t; | ||
} | ||
const out = output.length + 1; | ||
let delta = i - prev; | ||
delta = prev == 0 ? (delta / DELTA_DAMP)|0 : delta >> 1; | ||
delta += (delta / out)|0; | ||
let len = ret.length + 1; | ||
let delta = prev == 0 ? (i / DAMP)|0 : (i - prev) >> 1; | ||
delta += (delta / len)|0; | ||
let k = 0; | ||
while (delta > MAX_DELTA) { | ||
delta = (delta / BASE_MIN)|0; | ||
k += BASE; | ||
for (; delta > MAX_DELTA; k += BASE) { | ||
delta = (delta / (BASE - T_MIN))|0; | ||
} | ||
bias = (k + BASE * delta / (delta + DELTA_SKEW))|0; | ||
n += (i / out)|0; | ||
i %= out; | ||
output.splice(i++, 0, n); | ||
bias = (k + (BASE - T_MIN + 1) * delta / (delta + SKEW))|0; | ||
n += (i / len)|0; | ||
i %= len; | ||
ret.splice(i++, 0, n); | ||
} | ||
return String.fromCodePoint(...output); | ||
return ret; | ||
} | ||
function is_virama(cp) { | ||
return lookup_member(VIRAMA, cp); | ||
// ************************************************************ | ||
function is_zwnj_emoji(v, pos) { | ||
let {length} = v; | ||
for (let b = Math.min(pos, ZWNJ_EMOJI.length); b > 0; b--) { | ||
let bucket = ZWNJ_EMOJI[b]; | ||
if (!bucket) continue; | ||
next: for (let emoji of bucket) { // TODO: early abort | ||
let i = pos - b; | ||
for (let c of emoji) { | ||
if (i >= length) continue next; | ||
let ci = v[i]; | ||
if (ci === 0xFE0F) { // this could be is_ignored() | ||
i++; // skip | ||
continue; | ||
} else if (c != v[i++]) { | ||
continue next; | ||
} | ||
} | ||
return true; | ||
} | ||
} | ||
return false; | ||
} | ||
function is_combining_mark(cp) { | ||
return lookup_member(COMBINING_MARKS, cp); | ||
} | ||
// warning: these should not be used directly | ||
// expects code-point (number) | ||
// is_* returns boolean | ||
export function is_disallowed(cp) { | ||
@@ -304,48 +489,42 @@ return lookup_member(DISALLOWED, cp); | ||
export function get_mapped(cp) { | ||
return lookup_mapped(cp)?.slice(); | ||
return lookup_mapped(MAPPED, cp)?.slice(); | ||
} | ||
export class DisallowedLabelError extends Error { | ||
constructor(message, label) { | ||
super(`Disallowed label "${escape_unicode(label)}": ${message}`); | ||
this.label = label; | ||
constructor(message, cps) { | ||
super(`Disallowed label "${escape_unicode(String.fromCodePoint(...cps))}": ${message}`); | ||
this.codePoints = cps; | ||
} | ||
} | ||
export class DisallowedCharacterError extends Error { | ||
constructor(cp, i, desc = '') { | ||
super(`Disallowed character "${escape_unicode(String.fromCodePoint(cp))}" at position ${1+i}` + (desc ? `: ${desc}` : '')); | ||
constructor(cp, desc = '') { | ||
super(`Disallowed character "${escape_unicode(String.fromCodePoint(cp))}"` + (desc ? `: ${desc}` : '')); | ||
this.codePoint = cp; | ||
this.offset = i; | ||
} | ||
} | ||
// expects a string | ||
// throws TypeError if not a string | ||
// returns a string normalized according to IDNA 2008, according to UTS-46 (v14.0.0), +CONTEXTJ, +ZWJ EMOJI | ||
export function idna(s, ignore_disallowed = false) { | ||
if (typeof s !== 'string') throw new TypeError('expected string'); | ||
let v = [...s].map(x => x.codePointAt(0)); // convert to code-points | ||
// never throws if ignore_disallowed | ||
function nfc_idna_contextj_emoji(cps, ignore_disallowed = false) { | ||
const empty = []; | ||
return String.fromCodePoint(...v.map((cp, i) => { | ||
return nfc(cps.map((cp, i) => { | ||
// disallowed: Leave the code point unchanged in the string, and record that there was an error. | ||
if (is_disallowed(cp)) { | ||
if (ignore_disallowed) return empty; | ||
throw new DisallowedCharacterError(cp, i); | ||
throw new DisallowedCharacterError(cp); | ||
} | ||
// ignored: Remove the code point from the string. This is equivalent to mapping the code point to an empty string. | ||
if (is_ignored(cp)) return empty; | ||
if (cp === 0x200C) { // https://datatracker.ietf.org/doc/html/rfc5892#appendix-A.1 | ||
// rule 1: V + cp | ||
// 1.) V + cp | ||
// V = Combining_Class "Virama" | ||
if (i > 0 && is_virama(v[i - 1])) { | ||
return cp; // allowed | ||
} | ||
// rule 2: {L,D} + T* + cp + T* + {R,D} | ||
if (i > 0 && lookup_member(VIRAMA, cps[i - 1])) return cp; // allowed | ||
// 2.) {L,D} + T* + cp + T* + {R,D} | ||
// L,D,T,R = Joining_Type | ||
if (i > 0 && i < v.length - 1) { // there is room on either side | ||
if (i > 0 && i < cps.length - 1) { // there is room on either side | ||
let head = i - 1; | ||
while (head > 0 && lookup_member(JOIN_T, v[head])) head--; // T* | ||
if (lookup_member(JOIN_LD, v[head])) { // L or D | ||
while (head > 0 && lookup_member(JOIN_T, cps[head])) head--; // T* | ||
if (lookup_member(JOIN_LD, cps[head])) { // L or D | ||
let tail = i + 1; | ||
while (tail < v.length - 1 && lookup_member(JOIN_T, v[tail])) tail++; // T* | ||
if (lookup_member(JOIN_RD, v[tail])) { // R or D | ||
while (tail < cps.length - 1 && lookup_member(JOIN_T, cps[tail])) tail++; // T* | ||
if (lookup_member(JOIN_RD, cps[tail])) { // R or D | ||
return cp; // allowed | ||
@@ -356,18 +535,17 @@ } | ||
if (ignore_disallowed) return empty; | ||
throw new DisallowedCharacterError(cp, i, `ZWJ outside of context`); | ||
throw new DisallowedCharacterError(cp, `ZWJ outside of context`); | ||
} else if (cp === 0x200D) { // https://datatracker.ietf.org/doc/html/rfc5892#appendix-A.2 | ||
// rule 1: V + cp | ||
// 1.) V + cp | ||
// V = Combining_Class "Virama" | ||
if (i > 0 && is_virama(v[i - 1])) { | ||
return cp; // allowed | ||
} | ||
// custom rule: emoji | ||
if (is_zwnj_emoji(v, i)) { | ||
return cp; // allowed | ||
} | ||
if (i > 0 && lookup_member(VIRAMA, cps[i - 1])) return cp; // allowed | ||
// [Custom ENS Rule] Emoji | ||
if (is_zwnj_emoji(cps, i)) return cp; // allowed | ||
if (ignore_disallowed) return empty; | ||
throw new DisallowedCharacterError(cp, i, `ZWNJ outside of context`); | ||
throw new DisallowedCharacterError(cp, `ZWNJ outside of context`); | ||
} | ||
return lookup_mapped(cp) ?? cp; | ||
}).flat()).normalize('NFC'); | ||
// mapped: Replace the code point in the string by the value for the mapping in Section 5, IDNA Mapping Table. | ||
// deviation: Leave the code point unchanged in the string. | ||
// valid: Leave the code point unchanged in the string. | ||
return lookup_mapped(MAPPED, cp) ?? cp; | ||
}).flat()); | ||
} | ||
@@ -379,30 +557,116 @@ | ||
// returns a string ready for namehash | ||
export function ens_normalize(name, ignore_disallowed = false) { // https://unicode.org/reports/tr46/#Processing | ||
// Processing Rule #1 (Map) via idna() | ||
// Processing Rule #2 (Normalize) via idna() | ||
// Processing Rule #3 (Break) | ||
return idna(name, ignore_disallowed).split('.').map(label => { | ||
// Processing Rule #4 (Convert) | ||
if (label.startsWith('xn--')) { | ||
let s = puny_decode(label.slice(4)); | ||
if (s != idna(s, true)) throw new DisallowedLabelError(`puny not idna`, label); | ||
label = s; | ||
export function ens_normalize(name, ignore_disallowed = false, check_bidi = true) { | ||
// https://github.com/ethereum/EIPs/blob/master/EIPS/eip-137.md | ||
// "UTS46 with the options transitional=false and useSTD3AsciiRules=true." | ||
// see: build-tables.js | ||
// assumptions: | ||
// * CheckHyphens = true | ||
// * CheckJoiners = true | ||
// * CheckBidi = unknown | ||
const STOP = 0x2E; | ||
const HYPHEN = 0x2D; | ||
// https://unicode.org/reports/tr46/#Processing | ||
// https://unicode.org/reports/tr46/#Validity_Criteria | ||
// [Processing] 1.) Map | ||
// [Processing] 2.) Normalize | ||
// [Processing] 3.) Break | ||
let labels = split_on(nfc_idna_contextj_emoji([...name].map(x => x.codePointAt(0), ignore_disallowed)), STOP).map(cps => { | ||
// [Processing] 4.) Convert/Validate | ||
if (cps.length >= 4 && cps[2] == HYPHEN && cps[3] == HYPHEN) { // "**--" | ||
if (cps[0] == 0x78 && cps[1] == 0x6E) { // "xn--" | ||
// Attempt to convert the rest of the label to Unicode according to Punycode [RFC3492]. | ||
// If that conversion fails, record that there was an error, and continue with the next label. | ||
let puny; | ||
try { | ||
puny = puny_decode(cps.slice(4)); | ||
} catch (err) { | ||
throw new DisallowedLabelError(`punycode: ${err.message}`, cps); | ||
} | ||
// With either Transitional or Nontransitional Processing, sources already in Punycode are validated without mapping. | ||
// In particular, Punycode containing Deviation characters, such as href="xn--fu-hia.de" (for fuß.de) is not remapped. | ||
// This provides a mechanism allowing explicit use of Deviation characters even during a transition period. | ||
// [Custom ENS Rule] deviate from UTS-46 and remap | ||
let idna = nfc_idna_contextj_emoji(puny, true); | ||
if (puny.length != idna.length || !puny.every((x, i) => x == idna[i])) throw new DisallowedLabelError(`puny not idna`, cps); | ||
// Otherwise replace the original label in the string by the results of the conversion. | ||
cps = puny; | ||
} | ||
} | ||
// Processing Rule #4 (Validate) | ||
// Section 4.1 Validity Criteria | ||
// https://unicode.org/reports/tr46/#Validity_Criteria | ||
// Rule #1 (NFC) via by idna() | ||
// Rule #2 | ||
if (/^.{2}--/u.test(label)) throw new DisallowedLabelError(`double-hyphen at position 3`, label); | ||
// Rule #3 | ||
if (label.startsWith('-')) throw new DisallowedLabelError(`leading hyphen`, label); | ||
if (label.endsWith('-')) throw new DisallowedLabelError(`trailing hyphen`, label); | ||
// Rule #4 (Stop) via idna() | ||
// Rule #5 | ||
if (label.length > 0 && is_combining_mark(label.codePointAt(0))) throw new DisallowedLabelError(`leading combining mark`, label); | ||
// Rule #6 (Valid) via idna() | ||
// Rule #7 (ContextJ) via idna() | ||
// Rule #8 (Bidi) NYI | ||
return label; | ||
}).join('.'); | ||
return cps; | ||
}); | ||
for (let cps of labels) { | ||
if (cps.length == 0) continue; | ||
// [Validity] 1.) The label must be in Unicode Normalization Form NFC. | ||
// => satsified by nfc_idna() | ||
// [Validity] 2.) If CheckHyphens, the label must not contain a U+002D HYPHEN-MINUS character in both the third and fourth positions. | ||
// note: we check this here because puny can expand into "aa--bb" | ||
if (cps.length >= 4 && cps[2] == HYPHEN && cps[3] == HYPHEN) throw new DisallowedLabelError(`invalid label extension`, cps); | ||
// [Validity] 3.) If CheckHyphens, the label must neither begin nor end with a U+002D HYPHEN-MINUS character. | ||
if (cps[0] == HYPHEN) throw new DisallowedLabelError(`leading hyphen`, cps); | ||
if (cps[cps.length - 1] == HYPHEN) throw new DisallowedLabelError(`trailing hyphen`, cps); | ||
// [Validity] 4.) The label must not contain a U+002E ( . ) FULL STOP. | ||
// => satisfied by [Processing] 3.) Break | ||
// [Validity] 5.) The label must not begin with a combining mark, that is: General_Category=Mark. | ||
if (lookup_member(COMBINING_MARKS, cps[0])) throw new DisallowedLabelError(`leading combining mark`, cps); | ||
// [Validity] 6.) For Nontransitional Processing, each value must be either valid or deviation. | ||
// => satisfied by nfc_idna() | ||
// [Validity] 7.) If CheckJoiners, the label must satisify the ContextJ rules | ||
// => satisfied by nfc_idna() | ||
// [Validity] 8.) see below | ||
} | ||
if (check_bidi) { | ||
// [Validity] 8.) If CheckBidi, and if the domain name is a Bidi domain name, then the label | ||
// must satisfy all six of the numbered conditions in [IDNA2008] RFC 5893, Section 2. | ||
// * The spec is ambiguious regarding when you can determine a domain name is bidi | ||
// * According to IDNATestV2, this is calculated AFTER puny decoding | ||
// https://unicode.org/reports/tr46/#Notation | ||
// A Bidi domain name is a domain name containing at least one character with BIDI_Class R, AL, or AN | ||
if (labels.some(cps => cps.some(cp => lookup_member(BIDI_R_AL, cp) || lookup_member(BIDI_AN, cp)))) { | ||
for (let cps of labels) { | ||
if (cps.length == 0) continue; | ||
// https://www.rfc-editor.org/rfc/rfc5893.txt | ||
// 1.) The first character must be a character with Bidi property L, R, | ||
// or AL. If it has the R or AL property, it is an RTL label; if it | ||
// has the L property, it is an LTR label. | ||
if (lookup_member(BIDI_R_AL, cps[0])) { // RTL | ||
// 2.) In an RTL label, only characters with the Bidi properties R, AL, | ||
// AN, EN, ES, CS, ET, ON, BN, or NSM are allowed. | ||
if (!cps.every(cp => lookup_member(BIDI_R_AL, cp) | ||
|| lookup_member(BIDI_AN, cp) | ||
|| lookup_member(BIDI_EN, cp) | ||
|| lookup_member(BIDI_ECTOB, cp) | ||
|| lookup_member(BIDI_NSM, cp))) throw new DisallowedLabelError(`bidi RTL: disallowed properties`, cps); | ||
// 3. In an RTL label, the end of the label must be a character with | ||
// Bidi property R, AL, EN, or AN, followed by zero or more | ||
// characters with Bidi property NSM. | ||
let last = cps.length - 1; | ||
while (lookup_member(BIDI_NSM, cps[last])) last--; | ||
last = cps[last]; | ||
if (!(lookup_member(BIDI_R_AL, last) | ||
|| lookup_member(BIDI_EN, last) | ||
|| lookup_member(BIDI_AN, last))) throw new DisallowedLabelError(`bidi RTL: disallowed ending`, cps); | ||
// 4. In an RTL label, if an EN is present, no AN may be present, and vice versa. | ||
let en = cps.some(cp => lookup_member(BIDI_EN, cp)); | ||
let an = cps.some(cp => lookup_member(BIDI_AN, cp)); | ||
if (en && an) throw new DisallowedLabelError(`bidi RTL: AN+EN`, cps); | ||
} else if (lookup_member(BIDI_L, cps[0])) { // LTR | ||
// 5. In an LTR label, only characters with the Bidi properties L, EN, | ||
// ES, CS, ET, ON, BN, or NSM are allowed. | ||
if (!cps.every(cp => lookup_member(BIDI_L, cp) | ||
|| lookup_member(BIDI_EN, cp) | ||
|| lookup_member(BIDI_ECTOB, cp) | ||
|| lookup_member(BIDI_NSM, cp))) throw new DisallowedLabelError(`bidi LTR: disallowed properties`, cps); | ||
// 6. end with L or EN .. 0+ NSM | ||
let last = cps.length - 1; | ||
while (lookup_member(BIDI_NSM, cps[last])) last--; | ||
last = cps[last]; | ||
if (!lookup_member(BIDI_L, last) | ||
&& !lookup_member(BIDI_EN, last)) throw new DisallowedLabelError(`bidi LTR: disallowed ending`, cps); | ||
} else { | ||
throw new DisallowedLabelError(`bidi without direction`, cps); | ||
} | ||
} | ||
} | ||
} | ||
return labels.map(cps => String.fromCodePoint(...cps)).join(String.fromCodePoint(STOP)); | ||
} |
@@ -1,1 +0,1 @@ | ||
export const VERSION="1.1.1";export const UNICODE="14.0.0";class A{constructor(e){let n=0;let t=0;let c=[];A:for(let A of e){n=n<<8|A;t+=8;while(t>=3){switch(n>>t-2&3){case 3:if(t<10)continue A;c.push(n>>(t-=10)&255);continue;case 2:if(t<6)continue A;c.push(n>>(t-=6)&15);continue;default:c.push(n>>(t-=3)&3)}}}this.buf=c;this.pos=0}read(){let{buf:A,pos:e}=this;let n=A[e];if(n<128){this.pos+=1;return n}if(n<255){this.pos+=2;return 128+((n&127)<<8|A[e+1])}this.pos+=4;return 32640+(A[e+1]<<16|A[e+2]<<8|A[e+3])}A(){let A=this.read();return A&1?~A>>1:A>>1}t(e){let n=Array(e);for(let A=0;A<e;A++)n[A]=1+this.read();return n}O(n){let t=Array(n);for(let A=0,e=-1;A<n;A++)t[A]=e+=1+this.read();return t}B(n){let t=Array(n);for(let A=0,e=0;A<n;A++)t[A]=e+=this.A();return t}l(){let A=this.O(this.read());let e=this.read();let n=this.O(e);let t=this.t(e);return[...A.map(A=>[A,1]),...n.map((A,e)=>[A,t[e]])].sort((A,e)=>A[0]-e[0])}k(){let n=[];for(let A=this.read(),e=0;e<A;e++){n.push(this.i())}for(let A=1+this.read(),e=1;e<A;e++){n.push(this.v(e))}return n.flat().sort((A,e)=>A[0]-e[0])}J(t,e){let c=[this.B(t)];for(let A=1;A<e;A++){let e=Array(t);let n=c[A-1];for(let A=0;A<t;A++){e[A]=n[A]+this.A()}c.push(e)}return c}v(A){let e=this.read();let n=this.O(e);let t=this.J(e,A);return n.map((A,e)=>[A,t.map(A=>A[e])])}i(){let A=1+this.read();let n=1+this.read();let t=this.read();let e=1+this.read();let c=this.O(e);let O=this.t(e);let r=this.J(e,A);return c.map((A,e)=>[A,r.map(A=>A[e]),O[e],n,t])}G(){let r=[];for(let A=this.read();A>0;A--){let e=1+this.read();let n=1+this.read();let t=1+this.read();let c=[];let O=[];for(let A=0;A<e;A++)O.push([]);for(let A=0;A<n;A++){if(t&1<<A-1){n++;c.push(A);O.forEach(A=>A.push(8205))}else{this.B(e).forEach((A,e)=>O[e].push(A))}}for(let e of c){let A=r[e];if(!A)r[e]=A=[];A.push(...O)}}return r}}function t(A){return A.replace(/[^\.\-a-z0-9]/giu,A=>`{${A.codePointAt(0).toString(16).toUpperCase()}}`)}let e=new A(Uint8Array.from(atob("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BAAAAAAAAACcAAAAAAAAAIAAAAAAAAAIAAAAAAAAAIAAAAAAAAAIAAAAAAAAATgAAAAAAAABAAAAAAAAABAAAAAAAAABAAAAAAAAABAAAAAAAAACcIIIIThBBBCcIIIIThBBBCcIIIIThBBBCcIIIIThBBBCcIIIIThBBBCcIIIIThBBBCcIIIIThBBBCcIIIIThBBBCcIIIIThBBBCcIIIIThBBBCcIIIIThBBBCcIIIIThBBBCcIIIIThBBBCcIIIIThBBBCcIIIIThBBBCcIIIIThBBBCcIIIIThBBBCcIIIIThBBBCcIIIIThBBBCcIIIIThBBBCcIIIIThBBBCcIIIIThBBBCcIIIIThBBBCcIIIITgBABABABACcAIAIAIAIATgBABABABAD/3s/EAAf+8a11cBsn/vGPs2rEsuyKjgJpOBxxcBq1XBZRknC91jS/95N564DZP/eMfZtWJZdkVHATScDji4DVquCyjJOF7rGl/7ybz1wGyf+8Y+zasSy7IqOAmk4HHFwGrVcFlGScL3WNL/3k3nrgNk/94x9m1Yll2RUcBNJwOOLgNWq4LKMk4XusaX/vJvPXAbJ/7xj7NqxLLsio4CaTgccXAatVwWUZJwvdY0v/eTeeuA2T/3jH2bViWXZFRwE0nA44uA1argsoyThe6xpf+8m89cBsn/vGPs2rEsuyKjgJpOBxxcBq1XBZRknC91jS/95N564DZP/eMfZtWJZdkVHATScDji4DVquCyjJOF7rGl/7ybz1wGyf+8Y+zasSy7IqOAmk4HHFwGrVcFlGScL3WNL/3k3nrgNk/94x9m1Yll2RUcBNJwOOLgNWq4LKMk4XusaX/vJvPXAbJ/7xj7NqxLLsio4CaTgccXAatVwWUZJwvdY0v/eTeeuA2T/3jH2bViWXZFRwE0nA44uA1argsoyThe6xpf+8m89cBsn/vGPs2rEsuyKjgJpOBxxcBq1XBZRknC91jS/95N564DZP/eMfZtWJZdkVHATScDji4DVquCyjJOF7rGl/7ybz1wGyf+8Y+zasSy7IqOAmk4HHFwGrVcFlGScL3WNL/3k+8yORyORyORyORyORyORyORyORyORyORyORyORyORyORyORyORyORyORyORyORyORyORyORyORyORyORyORyORyORyORyORyORyORyORyORyORyORyORyORyORyORyORyORyORyORyORyORyORyORyORyORyORyORyORyORyORyORyORyORyORyORyORyORyORyORyORyORyORyORyORyORyORyORyORyORyORyORyORyORyORyORyORyORyORyORyORyORyORyORyORyORyORyORyORyORyORyORyORyORyORyORyORyORyORyORyORyORyORyORyORyORyORyORyORyORyORyORyf+8n1xJSpKVJSpKVJSpKVJSpKVJSpKVJSpKVJSpKVJYmz/73bYgAAAAAAAAB/72jdgAgAgAgAgB/73bZAAAAAAAAAB/72jeElPIlOpFOlJOkpQDwHD6DuFuL8BmGT8Ddo8qxHWVfwHQcdo3EVWZZuSsbVClTKzqmRJcB5d999+P6fj9/AV14rJt12JOTEDkl/A5XwHbarjPDdfvvB51wG7sqZ04qaU6SlwGrFnar6Zpf3/Tzth4DTzrGQy08D8+Qkk43kRJLLLbbJJbbbc7bbZOOLEMfx1YlfTNOmVM7J555aOD5bgMv4DP675+B2ym2mSpcJpPF8/6uP/Ln+M4zjM+I4zjczknmnqxnGVLRPjKkpnxnGcZxnGcZxnGcZxnGcZx3EZ8RtxGfEbcRnxG3EZ8RtxGfEcRpppp5DieE3+mrFKs2oqc1OK08D/XFZ//43zuNX3PT+AyLGTi0xJRxChX4/kspypGckklEkpklTyzzyzkmWlkolkkmjGcZy8klSqnFCSZCiSjIZZJXp5KJJJJLJJJJJJJJJJJJJJJJJJpxnGSTLJKSVKqZZZUXk+R1XTEkklZlj+P4zjOMzYjjOMkudzVYzjJc82MlyTYzjOM4zjOM4zjOM4zjOM4ziE2ITYhNiE2ITYhNiE2ITYhNiE1NNNNOQllkklFHGaSSTwGha7wHuZhwWebRwG2cB7WgZvknAX8DlWf8D8XOc9z3u8xz2tdB2M2NcHnHB6vwe3dp+3ceHwv+ZRw2Q8L/WUcFneKZBdJV3GwZBkGQZBoHAZBoGQd968+7Yhi+JY3NxWrcVq9VY97yvfy3YB6+PensP/jIuK/8Sz8B7HAejwHtcB6c3AZhwGM8B83AenViXA2cB2etY1wHOzWTd93GgZRil3dY7/40zWv/Gz/niHAettFmSelQ563RiHp7KkkkkkkkkkkkliCSSSXF9vNsQ9HyO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"),A=>A.charCodeAt(0)));const n=e.l();const c=e.l();const O=e.l();const r=e.l();const B=e.l();const l=e.l();const f=e.l();const y=e.G();const w=e.k();e=null;function k(A,t){for(let[e,n]of A){let A=t-e;if(A<0)break;if(A<n)return true}return false}function x(r){for(let[e,n,t,c,O]of w){let A=r-e;if(A<0)break;if(t>0){if(A<t&&A%c==0){let e=A/c;return n.map(A=>A+e*O)}}else if(A==0){return n}}}export function is_zwnj_emoji(c,O){let{length:r}=c;for(let t=Math.min(O,y.length);t>0;t--){let e=y[t];if(!e)continue;A:for(let A of e){let n=O-t;for(let e of A){if(n>=r)continue A;let A=c[n];if(A===65039){n++;continue}else if(e!=c[n++]){continue A}}return true}}return false}function i(t){let c=[];let O=t.lastIndexOf("-");for(let e=0;e<O;++e){let A=t.charCodeAt(e);if(A>=128)throw new Error("punycode: expected basic");c.push(A)}O++;const r=36;const B=1;const l=26;const f=38;const y=700;const w=r-B;const k=w*l>>1;let x=72;let i=128;let v=0;const{length:s}=t;while(O<s){let A=v;for(let e=1,n=r;;n+=r){if(O>=s)throw new Error("punycode: invalid");let A=t.charCodeAt(O++);if(A<58){A-=22}else if(A<91){A-=65}else if(A<123){A-=97}else{throw new Error(`punycode: invalid byte ${A}`)}v+=A*e;const G=n<=x?B:n>=x+l?l:n-x;if(A<G)break;e*=r-G}const J=c.length+1;let e=v-A;e=A==0?e/y|0:e>>1;e+=e/J|0;let n=0;while(e>k){e=e/w|0;n+=r}x=n+r*e/(e+f)|0;i+=v/J|0;v%=J;c.splice(v++,0,i)}return String.fromCodePoint(...c)}function v(A){return k(f,A)}function s(A){return k(n,A)}export function is_disallowed(A){return k(O,A)}export function is_ignored(A){return k(c,A)}export function get_mapped(A){return x(A)?.slice()}export class DisallowedLabelError extends Error{constructor(A,e){super(`Disallowed label "${t(e)}": ${A}`);this.label=e}}export class DisallowedCharacterError extends Error{constructor(A,e,n=""){super(`Disallowed character "${t(String.fromCodePoint(A))}" at position ${1+e}`+(n?`: ${n}`:""));this.codePoint=A;this.offset=e}}export function idna(A,t=false){if(typeof A!=="string")throw new TypeError("expected string");let c=[...A].map(A=>A.codePointAt(0));const O=[];return String.fromCodePoint(...c.map((e,n)=>{if(is_disallowed(e)){if(t)return O;throw new DisallowedCharacterError(e,n)}if(is_ignored(e))return O;if(e===8204){if(n>0&&v(c[n-1])){return e}if(n>0&&n<c.length-1){let A=n-1;while(A>0&&k(r,c[A]))A--;if(k(B,c[A])){let A=n+1;while(A<c.length-1&&k(r,c[A]))A++;if(k(l,c[A])){return e}}}if(t)return O;throw new DisallowedCharacterError(e,n,`ZWJ outside of context`)}else if(e===8205){if(n>0&&v(c[n-1])){return e}if(is_zwnj_emoji(c,n)){return e}if(t)return O;throw new DisallowedCharacterError(e,n,`ZWNJ outside of context`)}return x(e)??e}).flat()).normalize("NFC")}export function ens_normalize(A,e=false){return idna(A,e).split(".").map(e=>{if(e.startsWith("xn--")){let A=i(e.slice(4));if(A!=idna(A,true))throw new DisallowedLabelError(`puny not idna`,e);e=A}if(/^.{2}--/u.test(e))throw new DisallowedLabelError(`double-hyphen at position 3`,e);if(e.startsWith("-"))throw new DisallowedLabelError(`leading hyphen`,e);if(e.endsWith("-"))throw new DisallowedLabelError(`trailing hyphen`,e);if(e.length>0&&s(e.codePointAt(0)))throw new DisallowedLabelError(`leading combining mark`,e);return e}).join(".")} | ||
var A="1.2.0",B="14.0.0";function o(C,w){for(let[A,g,B,Q,E]of C){var o=w-A;if(o<0)break;if(0<B){if(o<Q*B&&o%Q==0){let B=o/Q;return g.map(A=>A+B*E)}}else if(0==o)return g}}function r(A,B){for(var[g,Q]of A){g=B-g;if(g<0)break;if(g<Q)return!0}return!1}function g(A){return A.replace(/[^\.\-a-z0-9]/giu,A=>`{${A.codePointAt(0).toString(16).toUpperCase()}}`)}let Q=new class{constructor(A){this.pos=0,this.values=A}A(){return this.values[this.pos++]}B(){var A=this.A();return 1&A?~A>>1:A>>1}g(B){let g=Array(B);for(let A=0;A<B;A++)g[A]=1+this.A();return g}Q(g){let Q=Array(g);for(let A=0,B=-1;A<g;A++)Q[A]=B+=1+this.A();return Q}C(g){let Q=Array(g);for(let A=0,B=0;A<g;A++)Q[A]=B+=this.B();return Q}w(B){let g=[];for(let A=0;A<B;A++)g.push(this.o());return g}o(){let A=this.Q(this.A());var B=this.A();let g=this.Q(B),Q=this.g(B);return[...A.map(A=>[A,1]),...g.map((A,B)=>[A,Q[B]])].sort((A,B)=>A[0]-B[0])}r(){let A=[];for(;;){var B=this.A();if(0==B)break;A.push(this.D(B))}for(;;){var g=this.A()-1;if(g<0)break;A.push(this.t(g))}return A.flat().sort((A,B)=>A[0]-B[0])}e(g,B){let Q=[this.C(g)];for(let A=1;A<B;A++){let B=Array(g);var E=Q[A-1];for(let A=0;A<g;A++)B[A]=E[A]+this.B();Q.push(B)}return Q}t(A){var B=1+this.A();let g=this.Q(B),Q=this.e(B,A);return g.map((A,B)=>[A,Q.map(A=>A[B])])}D(A){let g=1+this.A(),Q=this.A();var B=1+this.A();let E=this.Q(B),C=this.g(B),w=this.e(B,A);return E.map((A,B)=>[A,w.map(A=>A[B]),C[B],g,Q])}i(){let E=[];for(let A=this.A();0<A;A--){var C=1+this.A();let B=1+this.A();var w,o=1+this.A();let g=[],Q=[];for(let A=0;A<C;A++)Q.push([]);for(let A=0;A<B;A++)o&1<<A-1?(B++,g.push(A),Q.forEach(A=>A.push(8205))):this.C(C).forEach((A,B)=>Q[B].push(A));for(w of g){let A=E[w];A||(E[w]=A=[]),A.push(...Q)}}return E}}(function(B){let A=0;function g(){return B[A++]<<8|B[A++]}var E=g();let C=1,w=[0,1];for(let A=1;A<E;A++)w.push(C+=g());var Q=g();let o=A;A+=Q;let r=0,D=0;function t(){return 0==r&&(D=D<<8|B[A++],r+=8),D>>--r&1}var e=2**31>>>1,i=2**31-1;let n=0;for(let A=0;A<31;A++)n=n<<1|t();let I=[],s=0,c=2**31;for(;;){var N=Math.floor(((n-s+1)*C-1)/c);let A=0,B=E;for(;1<B-A;){var K=A+B>>>1;N<w[K]?B=K:A=K}if(0==A)break;I.push(A);let g=s+Math.floor(c*w[A]/C),Q=s+Math.floor(c*w[A+1]/C)-1;for(;0==((g^Q)&e);)n=n<<1&i|t(),g=g<<1&i,Q=Q<<1&i|1;for(;g&~Q&536870912;)n=n&e|n<<1&i>>>1|t(),g=g<<1^e,Q=(Q^e)<<1|e|1;s=g,c=1+Q-g}let P=E-4;return I.map(A=>{switch(A-P){case 3:return 65792+P+(B[o++]<<16|B[o++]<<8|B[o++]);case 2:return 256+P+(B[o++]<<8|B[o++]);case 1:return P+B[o++];default:return A-1}})}(Uint8Array.from(atob("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qjuwVaqACmM+jEZEUmlGPt8+4z7fPtk+1T7hPuE+3T7dPt0+3T7bPts+1z7XPtc+1z7hzHDMbsxsI1QzTCJFASMVRQAvOA0zRzkFE043JWIQ39Lf0N/O38zfyt/I38bfxN/C38Df0t/Q387fzN/KNTM1NTUzMzNCA0IPQg/KKsooyibKJMoiyiDKHsocyhrKGMoqyijKJsokyiLKIMoeyhzKGsoYyirKKNzcXgRs7TqnO61Vp4AHYzuMQ0RPaUMfF7oHVAezyOs/JD7BSkIqG65tPs49Ckg+5h5SYg5oPEQwOjwmGCMxMx8pDRD1QhBCJPY+5RYQYQsVcl48JwseqUIDQhMACScnL0ViOB04RScVPBYGBlMIQTHHF2AQX7NAQDI4PBYjJxE5HSNBUDcVWjIXNjALOiAYQiIlFlIVBkhCQgMx1lhgGl81QEIiJ0IDBkEC55AJkE2IApjEApjJApjECCgC55AJlALnkE2IApjIApjJApjKAufWCQgJAueQfgLnkAmQAqRvAphUAAQAnABgagOgtAmtCZACo5kCl94MApoF9gLnjAKaY6QClywqRgBclgFoBPoCpQ+kApcsKkYAXJYBaAT6AqUPpAKXLCpGAFyWAWgE+gKluQKlnAfbCWgCpmMCl4ICmI8ItgKb/gKjqwKcCAE/Ab9ycwLnkAmQAua2TYgCojICojECojICojECojICojECojICojECojICojECojICojECojICojECojICojECojICojECojICojECojICojECojICojECojICojECojICojECojIC55AJkALmth4C55AJkALmtk2IAufWAueQCZAC5rYCAgLyYgmRCZACpG8CmFQABACcAGBqA6C0CakJkALmtgLlyAKYnaQClywqRgBclgFoBPoCpQ+kApcsKkYAXJYBaAT6AqUPpAKXLCpGAFyWAWgE+gKlD6QClywqRgBclgFoBPoCpQ+kApcsKkYAXJYBaAT6AqUPpAKXLCpGAFyWAWgE+gKlD6QClywqRgBclgFoBPoCpQ+kApcsKkYAXJYBaAT6AqUPpAKXLCpGAFyWAWgE+gKlD6QClywqRgBclgFoBPoCpQ+kApcsKkYAXJYBaAT6AqUPpAKXLCpGAFyWAWgE+gKlD6QClywqRgBclgFoBPoCpQ+kApcsKkYAXJYBaAT6AqUPpAKX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"),A=>A.charCodeAt(0))));const D=Q.o(),E=Q.o(),C=Q.o(),w=Q.o(),t=Q.o(),e=Q.o(),i=Q.r(),n=Q.i(),I=Q.w(1+Q.A()),s=I[Q.A()],c=Q.r(),N=Q.o(),K=Q.o(),P=Q.o(),h=Q.o(),F=Q.o(),Y=Q.o(),T=Q.o(),U=44032,l=4352,G=4449,f=4519;const k=28,M=21*k;var a=19*M;const L=U+a,H=l+19,u=G+21,R=f+k;function v(A){return A>=U&&A<L}function y(A,g){let Q=[];function E(){Q.sort((A,B)=>A[0]-B[0]).forEach(([A,B])=>g(A,B)),Q.length=0}function B(B){var A=1+I.findIndex(A=>r(A,B));0==A?(E(),g(A,B)):Q.push([A,B])}A.forEach(A=>function A(B,g){if(B<128)g(B);else if(v(B)){var Q=(C=B-U)/M|0,E=C%M/k|0,C=C%k;g(l+Q),g(G+E),0<C&&g(f+C)}else if(C=o(c,B))for(var w of C)A(w,g);else g(B)}(A,B)),E()}function J(A){let g=[];return y(A,(A,B)=>g.push(B)),g}function j(A){let Q=[],E=[],C=-1,w=0;return y(A,function(A,B){{var g;-1===C?0==A?C=B:Q.push(B):0<w&&w>=A?(0==A?(Q.push(C,...E),E.length=0,C=B):E.push(B),w=A):0<=(g=function(A,B){if(A>=l&&A<H&&B>=G&&B<u){var g=A-l,Q=B-G,Q=g*M+Q*k;return U+Q}if(v(A)&&B>f&&B<R&&(A-U)%k==0)return A+(B-f);for(var[E,C]of c)if(2==C.length&&C[0]==A&&C[1]==B){if(r(N,E))break;return E}return-1}(C,B))?C=g:0==w&&0==A?(Q.push(C),C=B):(E.push(B),w=A)}}),0<=C&&Q.push(C),Q.push(...E),Q}function z(A){return r(C,A)}function O(A){return r(E,A)}function m(A){return o(i,A)?.slice()}class d extends Error{constructor(A,B){super(`Disallowed label "${g(String.fromCodePoint(...B))}": `+A),this.codePoints=B}}class Z extends Error{constructor(A,B=""){super(`Disallowed character "${g(String.fromCodePoint(A))}"`+(B?": "+B:"")),this.codePoint=A}}function b(Q,A=!1){const E=[];return j(Q.map((B,g)=>{if(z(B)){if(A)return E;throw new Z(B)}if(O(B))return E;if(8204===B){if(0<g&&r(s,Q[g-1]))return B;if(0<g&&g<Q.length-1){let A=g-1;for(;0<A&&r(w,Q[A]);)A--;if(r(t,Q[A])){let A=g+1;for(;A<Q.length-1&&r(w,Q[A]);)A++;if(r(e,Q[A]))return B}}if(A)return E;throw new Z(B,"ZWJ outside of context")}if(8205!==B)return o(i,B)??B;if(0<g&&r(s,Q[g-1]))return B;if(function(g,Q){var E=g["length"];for(let B=Math.min(Q,n.length);0<B;B--){var A=n[B];if(A)A:for(var C of A){let A=Q-B;for(var w of C){if(A>=E)continue A;if(65039!==g[A]){if(w!=g[A++])continue A}else A++}return 1}}}(Q,g))return B;if(A)return E;throw new Z(B,"ZWNJ outside of context")}).flat())}function S(A,B=!1,g=!0){var Q;let E=function(A,B){let g=[],Q=0;for(;;){var E=A.indexOf(B,Q);if(-1==E)break;g.push(A.slice(Q,E)),Q=E+1}return g.push(A.slice(Q)),g}(b([...A].map(A=>A.codePointAt(0),B)),46).map(B=>{if(4<=B.length&&45==B[2]&&45==B[3]&&120==B[0]&&110==B[1]){let A;try{A=function(Q){let g=[],E=Q.lastIndexOf(45);for(let A=0;A<E;A++){var B=Q[A];if(128<=B)throw new Error("expected ASCII");g.push(B)}E++;let C=0,w=128,o=72;for(;E<Q.length;){var r=C;for(let B=1,g=36;;g+=36){if(E>=Q.length)throw new Error("invalid encoding");let A=Q[E++];if(48<=A&&A<=57)A-=22;else{if(!(97<=A&&A<=122))throw new Error("invalid character "+A);A-=97}C+=A*B;var D=g<=o?1:g>=o+26?26:g-o;if(A<D)break;B*=36-D}var t=g.length+1;let A=0==r?C/700|0:C-r>>1;A+=A/t|0;let B=0;for(;455<A;B+=36)A=A/35|0;o=B+36*A/(A+38)|0,w+=C/t|0,C%=t,g.splice(C++,0,w)}return g}(B.slice(4))}catch(A){throw new d("punycode: "+A.message,B)}let g=b(A,!0);if(A.length!=g.length||!A.every((A,B)=>A==g[B]))throw new d("puny not idna",B);B=A}return B});for(Q of E)if(0!=Q.length){if(4<=Q.length&&45==Q[2]&&45==Q[3])throw new d("invalid label extension",Q);if(45==Q[0])throw new d("leading hyphen",Q);if(45==Q[Q.length-1])throw new d("trailing hyphen",Q);if(r(D,Q[0]))throw new d("leading combining mark",Q)}if(g&&E.some(A=>A.some(A=>r(K,A)||r(h,A))))for(var C of E)if(0!=C.length)if(r(K,C[0])){if(!C.every(A=>r(K,A)||r(h,A)||r(F,A)||r(Y,A)||r(T,A)))throw new d("bidi RTL: disallowed properties",C);let A=C.length-1;for(;r(T,C[A]);)A--;if(A=C[A],!(r(K,A)||r(F,A)||r(h,A)))throw new d("bidi RTL: disallowed ending",C);var w=C.some(A=>r(F,A)),o=C.some(A=>r(h,A));if(w&&o)throw new d("bidi RTL: AN+EN",C)}else{if(!r(P,C[0]))throw new d("bidi without direction",C);{if(!C.every(A=>r(P,A)||r(F,A)||r(Y,A)||r(T,A)))throw new d("bidi LTR: disallowed properties",C);let A=C.length-1;for(;r(T,C[A]);)A--;if(A=C[A],!r(P,A)&&!r(F,A))throw new d("bidi LTR: disallowed ending",C)}}return E.map(A=>String.fromCodePoint(...A)).join(String.fromCodePoint(46))}export{A as VERSION,B as UNICODE,J as nfd,j as nfc,z as is_disallowed,O as is_ignored,m as get_mapped,d as DisallowedLabelError,Z as DisallowedCharacterError,S as ens_normalize}; |
@@ -1,1 +0,11 @@ | ||
export function ens_normalize(name: string, ignore_disallowed?: boolean): string; | ||
export function ens_normalize(name: string, ignore_disallowed?: boolean, check_bidi?: boolean): string; | ||
export function nfc(code_points: number[]): number[]; | ||
export function nfd(code_points: number[]): number[]; | ||
export function is_disallowed(code_point: number): boolean; | ||
export function is_ignored(code_point: number): boolean; | ||
export function get_mapped(code_point: number): undefined|number[]; | ||
export const VERSION: string; | ||
export const UNICODE: string; |
{ | ||
"name": "@adraffy/ens-normalize", | ||
"version": "1.1.1", | ||
"version": "1.2.0", | ||
"description": "Compact ES6 Ethereum Name Service (ENS) Name Normalizer", | ||
@@ -25,14 +25,3 @@ "keywords": [ | ||
"url": "http://raffy.antistupid.com" | ||
}, | ||
"scripts": { | ||
"test-source": "node test/test-lib.js build/ens-normalize.js", | ||
"test-build": "node test/test-lib.js dist/ens-normalize.js", | ||
"test-dist": "node test/test-lib.js dist/ens-normalize.min.js", | ||
"build-source": "node build/build-source.js", | ||
"build-dist": "uglifyjs dist/ens-normalize.js --mangle --mangle-props regex=/^read/ --toplevel --output dist/ens-normalize.min.js", | ||
"build": "(npm run test-source) && (npm run build-source) && (npm run test-build) && (npm run build-dist) && (npm run test-dist)", | ||
"report-idna": "node test/report-idna.js", | ||
"report-ens": "node test/report-ens.js", | ||
"report-reg": "node test/report-registered.js" | ||
} | ||
} |
@@ -8,8 +8,8 @@ # ens-normalize.js | ||
* Handles [Punycode](https://datatracker.ietf.org/doc/html/rfc3492), adapted from [mathiasbynens/punycode.js](https://github.com/mathiasbynens/punycode.js) | ||
--- | ||
* [Live Demo](https://raffy.antistupid.com/eth/ens-resolver.html) | ||
* Generated Report: [Unicode IDNATestV2](https://adraffy.github.io/ens-normalize.js/test/output/idna.html) | ||
* Generated Report: [eth-ens-namehash/normalize](https://adraffy.github.io/ens-normalize.js/test/output/ens.html) | ||
* Passes **100%** [IDNATestV2](https://adraffy.github.io/ens-normalize.js/test/report-idna.html) | ||
* Passes **100%** [NormalizationTests](https://adraffy.github.io/ens-normalize.js/test/report-nf.html) | ||
* Generated Report: [eth-ens-namehash](https://adraffy.github.io/ens-normalize.js/test/output/ens.html) | ||
@@ -22,2 +22,3 @@ | ||
// example: | ||
@@ -27,13 +28,8 @@ let normalized = ens_normalize('🚴♂️.eth'); // throws if error | ||
// optional argument: ignore_disallowed (default: false) | ||
// when truthy, disallowed characters are ignored | ||
console.log(ens_normalize('_', true)); // === '' | ||
console.log(ens_normalize('_')); // throws: disallowed | ||
// errors: | ||
// - not a string | ||
// - contains disallowed character if !ignore_disallowed | ||
// - contains disallowed character | ||
// - puny decode failure | ||
// - puny decode mismatch | ||
// - label has double-hyphen at [3:4] | ||
// - label has double-hyphen | ||
// - label starts/ends with hyphen | ||
@@ -45,8 +41,20 @@ // - label starts with combining mark | ||
### Experimental Features | ||
```Javascript | ||
// 1st optional argument: ignore_disallowed (default: false) | ||
// when truthy, disallowed characters are ignored | ||
console.log(ens_normalize('_', true)); // === '' | ||
console.log(ens_normalize('_')); // throws: disallowed | ||
// 2nd optional argument: check_bidi (default: false) | ||
// when truthy, bidi domain names are checked for validity | ||
``` | ||
--- | ||
## Build Notes | ||
## Building | ||
* Clone to access `build/`. These files are not included in the npm version. | ||
* The actual source is in `build/ens-normalize.js`. | ||
* Use `npm run dist` to build the injected and minified versions. | ||
* Clone to access `build/`. The actual source is in `build/ens-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` to extract the necessary tables as JSON and generate compressed tables as binary. | ||
* Run `node build/build-source.js` to inject the compressed tables into the source template and create the normal and minified `dist/` files. |
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
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
93588
764
56