Socket
Socket
Sign inDemoInstall

@adraffy/ens-normalize

Package Overview
Dependencies
Maintainers
1
Versions
51
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

@adraffy/ens-normalize - npm Package Compare versions

Comparing version 1.0.5 to 1.0.6

195

ens-normalize.js

@@ -1,24 +0,1 @@

function bytes_from_base64(s) {
return Uint8Array.from(atob(s), c => c.charCodeAt(0));
}
const TABLE_M = bytes_from_base64('goBwgJMHgIctAQEBAgECAQFICzAVEAFlBwIGAgIBBCMBHhtbCzoJCQEYBAEJAQMBBSsDPAgqGAEhNgMBEgEHCgIdAzgBAQcCAgIDCQEKAhoBAgM4AQEFBAICAwMBHgIDAQsDOAEBCAEDAQMUAhYGAQM4AQEHAgICAwcDCgIeATsFAwMBBAkBKAU3AQEHAQMBBAcCCwIdAzgBAQcBAwEEBwILAhwENwIBBwEDAQQJAQoCHQNGAQQGAQEBCBICPQECBwwIYgECCQsGSgIbAQEBAQEEAjEUAQIFCwEkCQFkFBcEBAMBAwIHAwQNDAEBCgSCPwODMgQcAx0CHgJAIAkBLQMBAXUCIgF2DAQMgFsFOQoBHQIBMB8xBS8RJgkMAx4NOA4wFIAYAwEVBAEGAQIDgEZAglAhi34DgA0BYCCBqgZpAvVUBAEKIAJQAoCQAQMBBAEXBQQBUwIyEhoSDQEmCBkNLAQvDiQBQw4MAQgCLQMyAQEDAgIFAgEBKQUFAoBsCAECzrABgmEQEBCDTQGAYgGAFQWGBgMBAgUEKAMEAYAlAoG9BIEDAoAZCzEEegM1DykBAgIKBC0LBwE9AyQOEAIsAQwDMA4IBAECXAwGAYAgDBUENwIBBwICAgMJAQoCAgcDBYBAEhcBURSAawcCCRsCUhFqDWUPgIAPgHUGAQICBAEBAQKADQcCBwMBHAooBwEECAEJCy4QgRUIAQhSFgEOegYDAQECAQcBAUIFAQIBBYDbBMt5BTsHg5gBATcHBFEBCwLMKwKR4S4CF4GeBQMGCAgCBx4EgBQDhzs3BDIIAQ4BFgUBD4TQBwERAgcBAgEFgIUHgPcBPQSFYAdtB/8LmDWAcA==');
const TABLE_I = bytes_from_base64('gC0BgiEBlDsDAQGHewFUAQMB/wBeGxCAbwH/AD4gBP8LxNyAcA==');
const TABLE_D = bytes_from_base64('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');
const TABLE_N = bytes_from_base64('QRqAQmUXgH4BBzCCKQOE6gYRCAEJJFEDgA8AEIEqACA/gIEmgeKOIQacnogSK4W/AgNacwigqyIDhhZEA4ITBwQUCgM8gMkIuGAIBiAKCCAICCAIBiAaCECAhAa91wYKBwwEdoAbBIpKgqcJir1NGmAAGgCGljDXHoSHA7XZAAaA2gEDgNMBCgYAFYAwFAVrBwNYgFwDgCMDBRJ2Br74BAUoAgYUAAQO9/FQuh3O5AObCYKaBNPigEsK3zcHGmIGGgAqBuBSBAUoAgYUCwO/SQAGgNoBA4DTAQoGAwaAMAIGDAIGDAIDDAwEn7qDkyj/AUWwgAgkgOCAHAuA/gEPGAEHIIGjA/8BiGWERzP/AZaAi20gl4DVACD/ACvA5SAa/wJcfQAaAAAaAAAHAAESEAAaDwAaAA0EGgEICgAEIwMHDgELEAAaHQAaAAMEBgIIDAEHEgEaIwMEBgEFCgUHFAEaIwAaAAAaAAAaAAAaAAAaAAAaAAAaAAAaAAAaAAAaAAAaAAAaAAQRhiABByQBESMCBiYHESUBByQBESMCBiYHESUBByQBESMCBiYHESUBByQBESMCBiYHESUBByQBESMCBiYLCoanAAoAAAoAAAoAAAoAkIAi/wNSZIRoBP8DRj0cBABdAwIdAwCCAhqLRYomCmE=');
const TABLE_W = [
'gCqAQghdAQIChpIEhpUBfEaApAIEAgQCBAIEAgQCBAIEAgQCBAIEAgQCBAIEAgQCBAIEAgQCBAIEAgQCBAIEAgQGDAIEAwYCBAIEBAgCBAIEAgQDBgIEAgQCBAIEAgQCBAIEAgQCBAIEAgQCBAIEAgQCBAIEAgQCBAIEAgQCBAIEAoBvAYB2AgQCBAKBlQKDQAGBHwIEAoEeAYEXAoEcAQIBgRUDgCIBgHgBBAGBEQKBHAEGAgwBAQGBHQSBLAEGAgYBgScCBAIEAoE2AYEvAoE2A4ErAoE2AYEvAoE0AQIBgS0CBAKBOAGBMQQIESICBAIEAgQCBAIEAgQCBAMGAgQCBAIEAgQCBAIEAgQCBAYMAoA/AVQBdAIEAgQCBAIEAgQCBAIEAgQCBAIEAgQCBAIEAgQCBAIEAgQCBAIEAoCBAoCKAgQCBAIEAgQCBAIEAgQCBAjT5AHT0QKAwwHVGAPTxwKBAwGBkgEGAYAJAgQCBAIEAgRig00Bg3wBg3cBEAGDjgEEAQwBg5MBBCiDVAGDbQEOAQoBg7pcgFYBAgIkAoDMK4APAgQCgPMCgPwJgHgHgA0BhWkFhaoCAgECQBIBSQEMARoBEAEDAQkBCwIyAgQCBAIEAgQCBAIEAgQCBAIEAgQCBAJpAQ4BBAIVAQUCgAYCaQFwZoBMAgQCBAIEAgQCBAIEAgQCBAIEAgQCBAIEAgQCBAIEAgQKFAIEAgQCBAIEAgQCBAIEAgQCBAIEAgQCBAIEAgQCBAIEAgQCBAIEAgQCBAIEAgQCBAIEAgQDBgIEAgQCBAIEAgQCBAMGAgQCBAIEAgQCBAIEAgQCBAIEAgQCBAIEAgQCBAIEAgQCBAIEAgQCBAIEAgQCBAIEAgQCBAIEAgQCBAIEAgQCBAIEAgQCBAIEAgQCBAIEAgQCBAIEAgQCBAIEAgQCBIlekziBO7u4BgwvuCGLBJjTAQQBFAEGAQIBAAEQATIB/wDEUIAk/wDMUwGAigGAhwIEAQIBgnAKglsBgugBguUBBAEEAQIBBAErAYNeAQIBtOIBuL8BBAECAYNoAQQBAgGDaQIIAQQBgTwBgTcBg0oBtQQBAgG4zQEIAQIBuNABtNsBg3EBuN4Esj0BAgGGOwESAQYBAgGF+AECARwBCgECDoBsI4NVAYNdAYNkAYJJAYJYAYNrAYNyAQQBCAS1rAG1OwFf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',
'spbg2oAAFzZnRoAZ4HEhBsLiwsOAAQ=='
].map(bytes_from_base64);
const TABLE_V = bytes_from_base64('iM2AAIAAgACAAIAAgACAAG4BEX1wgACASoA1AYZaAR+AHoIOgGRmAUcBkQz6ByaAGIAPbYC2gHfd0oWHKg86egGADHWANWOAdYAAgH2AAHd1gI6AhAGAIlQTUoEmgIUBUg==');
const TABLE_LD = bytes_from_base64('haABBQEBAQEFBA0BBwECIwIIEBImAQIJAQEBAQIoAwIBEgMFBAEJAQEBAQECHwsDDwIEAQECAwIGSiFWBQIBAQoBAQoBAQQCAR0BAgUSCgUCAgYBD46+ARhZDiIBAf8AEBUz4c0FCAEFCgEDCgSAEQEBAQMDAQIBAQIBHAKA0SIBAYGMAwERDAMcBAIMLgEBAgQBAgIBAgEBAgEFAv8AWbRE');
const TABLE_RD = bytes_from_base64('haABAR4BCiMCAQMBXwEBGAIKAwIBEAEBHh0zSiFVGQcBAQQBBAUTAwECBhENARuOvgEYWQ4iAQH\/ABAVMuHOBgEBAQIDCQEKAgEGBYAQEhcGgNIjgYwVDAQbEi4BAQUBCAEEBAL/AFm1RA==');
const TABLE_T = bytes_from_base64('gC0BgdJwgJMHgIctAQEBAgECAQFICwEBLhUQAWUHAgYCAgEEIQEBAR4bWws6CQkBGAQBCQEDAQUrAzwIKhgBIDcBAQEECAQBAwcKAh0BOgEEBAgBFAIaAQICOQEEAgQCAgMDAR4CAwELAjkBBAUBAgQBFAIWBgEBOgECAQEECAEHAgsCHgE9AQwBMgEDATcBAQMFAwEEBwILAh0BOgECAQYBBQIUAhwCOQIEBAgBFAIdAUgBBwMBAVoBAgcMCGIBAgkLBkoCGwEBAQEBNw4BBQECBQsBJAkBZgQBBgECAgIZAgQDEAQNAQICBgEPAYI\/A4MyAx0CHgIeAkACAQcIAQILCQEtAwEBdQIiAXYDBAIJAQYDgFsCAgE6AQEHAQEBAQIIBgoCATAfMQQwAQEFAQEFASgJDAIgBAICAQM4AQECAwEBAzoIAgKAGAMBDQEHBAEGAQMCgEZAgYsBAgIaBTEFBQZgIYt+A4ANAWAggaoEawL1VAQBCiACUAKAkAEDAQQBGQIFAYAXAhoSDQEmCBkLLgMwAQIEAgInAUMGAgICAgwBCAEvATMBAQMCAgUCAQEqAggBgG4BAgEEAc6wAYJhEBAQgE8BgHkDgYEBgGIBgBUFhgYDAQIFBCgDBAGAJQKBvQSBAwKAGQsxBHsBNg8pAQICCgMxBAICBwE9AyQFAQg+AQwCNAkKBAIBXwMCAQECBgGAIAEDCBUCOQIDASUHAwWAQwgCAwEBFwFUBgEBBAIBAoBuBAYCAQIbAlUIAgEBAmoBAQECBgEBZQMCBAEFgIMJAQKAgAIBAQQBgBAEAgIEASAKKAYCBAgBCQYCAy4NAQKBFgcBBgEBUhYCBwECAQJ6BgMBAQIBBwEBSAIDAQEBgNsClLsJtjcFOweDmAE\/BFEBzDgCAQSR3C4CF4GgAwkQAgceBIAUA4c7NwQyCAEOARYFAQ+E0AcBEQIHAQIBBYCFB4D3AT0EhWAHbQj\/C5c1AR5ggACAcA==');
class TableReader {

@@ -32,2 +9,3 @@ constructor(table) {

}
read_byte() { return this.table[this.pos++]; }
read() { // unsigned pseudo-huffman (note: assumes tables are valid)

@@ -49,6 +27,87 @@ let {table, pos} = this;

let i = this.read();
return (i & 1) ? -((i + 1) >> 1) : (i >> 1);
return (i & 1) ? (~i >> 1) : (i >> 1);
}
}
function bytes_from_base64(s) {
return Uint8Array.from(atob(s), c => c.charCodeAt(0));
}
// compressed lookup tables
// Ignored/Disallowed/Mapped/Valid/Deviation [IdnaMappingTable.txt]
const TABLE_I = bytes_from_base64('gC0BgiEBlDsDAQGHewFUAQMB/wBeGxCAbwH/AD4gBP8LxNyAcA==');
const TABLE_D = bytes_from_base64('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');
const TABLE_N = bytes_from_base64('QRqAQmUXgH4BBzCCKQOE6gYRCAEJJFEDgA8AEIEqACA/gIEmgeKOIQacnogSK4W/AgNacwigqyIDhhZEA4ITBwQUCgM8gMkIuGAIBiAKCCAICCAIBiAaCECAhAa91wYKBwwEdoAbBIpKgqcJir1NGmAAGgCGljDXHoSHA7XZAAaA2gEDgNMBCgYAFYAwFAVrBwNYgFwDgCMDBRJ2Br74BAUoAgYUAAQO9/FQuh3O5AObCYKaBNPigEsK3zcHGmIGGgAqBuBSBAUoAgYUCwO/SQAGgNoBA4DTAQoGAwaAMAIGDAIGDAIDDAwEn7qDkyj/AUWwgAgkgOCAHAuA/gEPGAEHIIGjA/8BiGWERzP/AZaAi20gl4DVACD/ACvA5SAa/wJcfQAaAAAaAAAHAAESEAAaDwAaAA0EGgEICgAEIwMHDgELEAAaHQAaAAMEBgIIDAEHEgEaIwMEBgEFCgUHFAEaIwAaAAAaAAAaAAAaAAAaAAAaAAAaAAAaAAAaAAAaAAAaAAAaAAQRhiABByQBESMCBiYHESUBByQBESMCBiYHESUBByQBESMCBiYHESUBByQBESMCBiYHESUBByQBESMCBiYLCoanAAoAAAoAAAoAAAoAkIAi/wNSZIRoBP8DRj0cBABdAwIdAwCCAhqLRYomCmE=');
const TABLE_W = [
'gCqAQghdAQIChpIEhpUBfEaApAIEAgQCBAIEAgQCBAIEAgQCBAIEAgQCBAIEAgQCBAIEAgQCBAIEAgQCBAIEAgQGDAIEAwYCBAIEBAgCBAIEAgQDBgIEAgQCBAIEAgQCBAIEAgQCBAIEAgQCBAIEAgQCBAIEAgQCBAIEAgQCBAIEAoBvAYB2AgQCBAKBlQKDQAGBHwIEAoEeAYEXAoEcAQIBgRUDgCIBgHgBBAGBEQKBHAEGAgwBAQGBHQSBLAEGAgYBgScCBAIEAoE2AYEvAoE2A4ErAoE2AYEvAoE0AQIBgS0CBAKBOAGBMQQIESICBAIEAgQCBAIEAgQCBAMGAgQCBAIEAgQCBAIEAgQCBAYMAoA/AVQBdAIEAgQCBAIEAgQCBAIEAgQCBAIEAgQCBAIEAgQCBAIEAgQCBAIEAoCBAoCKAgQCBAIEAgQCBAIEAgQCBAjT5AHT0QKAwwHVGAPTxwKBAwGBkgEGAYAJAgQCBAIEAgRig00Bg3wBg3cBEAGDjgEEAQwBg5MBBCiDVAGDbQEOAQoBg7pcgFYBAgIkAoDMK4APAgQCgPMCgPwJgHgHgA0BhWkFhaoCAgECQBIBSQEMARoBEAEDAQkBCwIyAgQCBAIEAgQCBAIEAgQCBAIEAgQCBAJpAQ4BBAIVAQUCgAYCaQFwZoBMAgQCBAIEAgQCBAIEAgQCBAIEAgQCBAIEAgQCBAIEAgQKFAIEAgQCBAIEAgQCBAIEAgQCBAIEAgQCBAIEAgQCBAIEAgQCBAIEAgQCBAIEAgQCBAIEAgQDBgIEAgQCBAIEAgQCBAMGAgQCBAIEAgQCBAIEAgQCBAIEAgQCBAIEAgQCBAIEAgQCBAIEAgQCBAIEAgQCBAIEAgQCBAIEAgQCBAIEAgQCBAIEAgQCBAIEAgQCBAIEAgQCBAIEAgQCBAIEAgQCBIlekziBO7u4BgwvuCGLBJjTAQQBFAEGAQIBAAEQATIB/wDEUIAk/wDMUwGAigGAhwIEAQIBgnAKglsBgugBguUBBAEEAQIBBAErAYNeAQIBtOIBuL8BBAECAYNoAQQBAgGDaQIIAQQBgTwBgTcBg0oBtQQBAgG4zQEIAQIBuNABtNsBg3EBuN4Esj0BAgGGOwESAQYBAgGF+AECARwBCgECDoBsI4NVAYNdAYNkAYJJAYJYAYNrAYNyAQQBCAS1rAG1OwFf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',
'spbg2oAAFzZnRoAZ4HEhBsLiwsOAAQ=='
].map(bytes_from_base64);
// CheckJoiners [DerivedGeneralCategory.txt]
const TABLE_M = bytes_from_base64('goBwgJMHgIctAQEBAgECAQFICzAVEAFlBwIGAgIBBCMBHhtbCzoJCQEYBAEJAQMBBSsDPAgqGAEhNgMBEgEHCgIdAzgBAQcCAgIDCQEKAhoBAgM4AQEFBAICAwMBHgIDAQsDOAEBCAEDAQMUAhYGAQM4AQEHAgICAwcDCgIeATsFAwMBBAkBKAU3AQEHAQMBBAcCCwIdAzgBAQcBAwEEBwILAhwENwIBBwEDAQQJAQoCHQNGAQQGAQEBCBICPQECBwwIYgECCQsGSgIbAQEBAQEEAjEUAQIFCwEkCQFkFBcEBAMBAwIHAwQNDAEBCgSCPwODMgQcAx0CHgJAIAkBLQMBAXUCIgF2DAQMgFsFOQoBHQIBMB8xBS8RJgkMAx4NOA4wFIAYAwEVBAEGAQIDgEZAglAhi34DgA0BYCCBqgZpAvVUBAEKIAJQAoCQAQMBBAEXBQQBUwIyEhoSDQEmCBkNLAQvDiQBQw4MAQgCLQMyAQEDAgIFAgEBKQUFAoBsCAECzrABgmEQEBCDTQGAYgGAFQWGBgMBAgUEKAMEAYAlAoG9BIEDAoAZCzEEegM1DykBAgIKBC0LBwE9AyQOEAIsAQwDMA4IBAECXAwGAYAgDBUENwIBBwICAgMJAQoCAgcDBYBAEhcBURSAawcCCRsCUhFqDWUPgIAPgHUGAQICBAEBAQKADQcCBwMBHAooBwEECAEJCy4QgRUIAQhSFgEOegYDAQECAQcBAUIFAQIBBYDbBMt5BTsHg5gBATcHBFEBCwLMKwKR4S4CF4GeBQMGCAgCBx4EgBQDhzs3BDIIAQ4BFgUBD4TQBwERAgcBAgEFgIUHgPcBPQSFYAdtB/8LmDWAcA==');
// CONTEXTJ [DerivedCombiningClass.txt, DerivedJoiningType.txt]
const TABLE_V = bytes_from_base64('iM2AAIAAgACAAIAAgACAAG4BEX1wgACASoA1AYZaAR+AHoIOgGRmAUcBkQz6ByaAGIAPbYC2gHfd0oWHKg86egGADHWANWOAdYAAgH2AAHd1gI6AhAGAIlQTUoEmgIUBUg==');
const TABLE_LD = bytes_from_base64('haABBQEBAQEFBA0BBwECIwIIEBImAQIJAQEBAQIoAwIBEgMFBAEJAQEBAQECHwsDDwIEAQECAwIGSiFWBQIBAQoBAQoBAQQCAR0BAgUSCgUCAgYBD46+ARhZDiIBAf8AEBUz4c0FCAEFCgEDCgSAEQEBAQMDAQIBAQIBHAKA0SIBAYGMAwERDAMcBAIMLgEBAgQBAgIBAgEBAgEFAv8AWbRE');
const TABLE_RD = bytes_from_base64('haABAR4BCiMCAQMBXwEBGAIKAwIBEAEBHh0zSiFVGQcBAQQBBAUTAwECBhENARuOvgEYWQ4iAQH\/ABAVMuHOBgEBAQIDCQEKAgEGBYAQEhcGgNIjgYwVDAQbEi4BAQUBCAEEBAL/AFm1RA==');
const TABLE_T = bytes_from_base64('gC0BgdJwgJMHgIctAQEBAgECAQFICwEBLhUQAWUHAgYCAgEEIQEBAR4bWws6CQkBGAQBCQEDAQUrAzwIKhgBIDcBAQEECAQBAwcKAh0BOgEEBAgBFAIaAQICOQEEAgQCAgMDAR4CAwELAjkBBAUBAgQBFAIWBgEBOgECAQEECAEHAgsCHgE9AQwBMgEDATcBAQMFAwEEBwILAh0BOgECAQYBBQIUAhwCOQIEBAgBFAIdAUgBBwMBAVoBAgcMCGIBAgkLBkoCGwEBAQEBNw4BBQECBQsBJAkBZgQBBgECAgIZAgQDEAQNAQICBgEPAYI\/A4MyAx0CHgIeAkACAQcIAQILCQEtAwEBdQIiAXYDBAIJAQYDgFsCAgE6AQEHAQEBAQIIBgoCATAfMQQwAQEFAQEFASgJDAIgBAICAQM4AQECAwEBAzoIAgKAGAMBDQEHBAEGAQMCgEZAgYsBAgIaBTEFBQZgIYt+A4ANAWAggaoEawL1VAQBCiACUAKAkAEDAQQBGQIFAYAXAhoSDQEmCBkLLgMwAQIEAgInAUMGAgICAgwBCAEvATMBAQMCAgUCAQEqAggBgG4BAgEEAc6wAYJhEBAQgE8BgHkDgYEBgGIBgBUFhgYDAQIFBCgDBAGAJQKBvQSBAwKAGQsxBHsBNg8pAQICCgMxBAICBwE9AyQFAQg+AQwCNAkKBAIBXwMCAQECBgGAIAEDCBUCOQIDASUHAwWAQwgCAwEBFwFUBgEBBAIBAoBuBAYCAQIbAlUIAgEBAmoBAQECBgEBZQMCBAEFgIMJAQKAgAIBAQQBgBAEAgIEASAKKAYCBAgBCQYCAy4NAQKBFgcBBgEBUhYCBwECAQJ6BgMBAQIBBwEBSAIDAQEBgNsClLsJtjcFOweDmAE\/BFEBzDgCAQSR3C4CF4GgAwkQAgceBIAUA4c7NwQyCAEOARYFAQ+E0AcBEQIHAQIBBYCFB4D3AT0EhWAHbQj\/C5c1AR5ggACAcA==');
// emoji-zwj-sequences.txt
const EMOJI = decode_zwnj_emoji('DAcV/wNpUAAAAAAAAAIAAAAAzkj/AxqIAAACAAD/AxqJAP8DGooAAP8DaZZJAgABAgBIAEkCAP8DaVADAAIBAAICAgUAAhAFBf8DaVAAAAAAAAAAAgAAAAAAAIpQzkj/AxqEAgACAAIA/wMaiQD/AxqEAgAEAIjo/wNpUAMAAgECAQICAgUAAgECilQUBQL/A3ZiAAAAAAAAAAAAAAAAAAAAAAAAAP8DaHYAAAACAAAAAgAAAAIAAAACAAAA/wN2ZAAAAAAAAAAAAAAAAAAAAAAAAAD/A2h4AgICBwQCAgcCBAIHAgIEBwICAl8JKv8DaVAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIpQAAAAAAAAAAAAAAAAAAAAAAAAAP8DaHYAAAAAAgAAAAACAAAAAAIAAAAAAgAAAAAHAAAAAAAAAAAAAgAAAAAAAAAAAAIAAAAAAAAAAAACAAAAAAAAAAAAAgAAAAAAAAAAAAcAAAACAAAAAgAAAAIAAAACAAAAzkgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wNplgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/A2lQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAEAAAAAAgAAAAABAAAAAAIAAAAAAQAAAAACAAAAAAEAAAAAAgAAAACKUAAAAAAAAAAAAAAAAAAAAAAAAAD/A2h2AgICAgcCAgICBwICAgIHAgICAgcCAgICBwICAgIHAgICAgcCAgICBwICAgIHAgICAgcCAgICBwICAgIHAgICAgcCAgICBwICAgIFAgICBwQCAgcCBAIHAgIEBwICAoA0Bwr/A2lQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACKUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wNodgAAAAAAAAAAAgAAAAAAAAAAAgAAAAAAAAAAAgAAAAAAAAAAAgAAAAAAAAAABwAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAABwAAAAAAAAAAAgAAAAAAAAAAAgAAAAAAAAAAAgAAAAAAAAAAAgAAAAAAAAAAzkgAAAAA/wMj8gAAAP8DI/EAAAAA/wMj8gAAAP8DI/EAAAAA/wMj8gAAAP8DI/EAAAAA/wMj8gAAAP8DI/EAAAAA/wMj8gAAAP8DI/EAAAAAAAAAAAD/AyPyAAAAAAAAAP8DI/EAAAAAAAAAAAD/AyPyAAAAAAAAAP8DI/EAAAAAAAAAAAD/AyPyAAAAAAAAAP8DI/EAAAAAAAAAAAD/AyPyAAAAAAAAAP8DI/EAAAAAAAAAAAD/AyPyAAAAAAAAAP8DI/EAAAD/AyPyAAAAAP8DI/EAAAD/AyPyAAAAAP8DI/EAAAD/AyPyAAAAAP8DI/EAAAD/AyPyAAAAAP8DI/EAAAD/AyPyAAAAAP8DaVAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAABAAAAAgAAAAEAAAAAAgAAAAABAAAAAgAAAAEAAAAAAgAAAAABAAAAAgAAAAEAAAAAAgAAAAABAAAAAgAAAAEAAAAAAgAAAAABAAAAAgAAAIpQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/A2h2AgICAgUCAgIHAgICAgcEAgIHAgICAgcCBAIHAgICAgcCAgQHAgICAgcCAgIFAgICAgcCAgICBQICAgUCAgIHAgICAgcCAgICBwQCAgcEAgIHAgICAgcCAgICBwIEAgcCBAIHAgICAgcCAgICBwICBAcCAgQHAgICAgcCAgICBwICAgUCAgIDAgICBwICAgIHBAICBwICAgIHAgQCBwICAgIHAgIEBwICAgIHAgICBQICAgKAPwMB/wNpUAACAAEAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAACKUAAAAAAAAAAAAAAAAAAAAAAAAAD/AyYvAP8DGhQAAgAMAAIAAgCAxAACAAIAAgAEAAgAFAACAAgAAgCBXACBIAACAAIACAAEAAIAgCoAIgACAAIAhGAAHgAEAAIAAgAGAAIAAgCAdAACACgAAgACAAoABAACAAIAAgACAAIAAgACAAIAAgCKbQAAAAIAAACKUAAAAP8DJVkA/wMZngACKBpMDINaDgKGtv8DaUwCAQL/AxwjAoBk/wMY7GoSLiIIgAYEgRwCgFYKgigkhboaAv8DJs8CgGT/AxjsahIuIgiABgSBHAKAVgqCKCSFuhoC/wMmzwKAZP8DGOxqEi4iCIAGBIEcAoBWCoIoJIW6GgL/Ayd5BAMEAwQDBAMEAwQDBAMEAwQDBAMEAwQDBAMEAwQDBAMEAwQDBAMEAwQDBAMEAwQDBAMEAwQDBAMEAwQDBAMEAwQDBAMEAwQDBAMEAwQDBAMEAwQDBAMEAwQDBAMEAwQDBAMEAwT/AydcAgICBQICAgUCAgKIm4oo/wMoI/8DGUL/AxpPiXb/Ax2+/wMla/8DHciB/waCf4AygsMEAv8DdCIAAAAAilEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAilAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/AyYvAAAAAAAAAAAA/wMaFAAAAAAAAAAAAAIAAAAAAAAAAAAMAAAAAAAAAAAAAgAAAAAAAAAAAAIAAAAAAAAAAACAxAAAAAAAAAAAAAQAAAAAAAAAAAACAAAAAAAAAAAABAAAAAAAAAAAAAgAAAAAAAAAAAAUAAAAAAAAAAAAAgAAAAAAAAAAAAgAAAAAAAAAAAACAAAAAAAAAAAAgVwAAAAAAAAAAACBIAAAAAAAAAAAAAIAAAAAAAAAAAACAAAAAAAAAAAACAAAAAAAAAAAAAQAAAAAAAAAAAACAAAAAAAAAAAAgCoAAAAAAAAAAAAiAAAAAAAAAAAAAgAAAAAAAAAAAAIAAAAAAAAAAACEYAAAAAAAAAAAAB4AAAAAAAAAAAAEAAAAAAAAAAAAAgAAAAAAAAAAAAIAAAAAAAAAAAAIAAAAAAAAAAAAAgAAAAAAAAAAAIB0AAAAAAAAAAAAAgAAAAAAAAAAACgAAAAAAAAAAAACAAAAAAAAAAAAAgAAAAAAAAAAAAoAAAAAAAAAAAAEAAAAAAAAAAAAAgAAAAAAAAAAAAIAAAAAAAAAAAACAAAAAAAAAAAAAgAAAAAAAAAAAAIAAAAAAAAAAAACAAAAAAAAAAAAAgAAAAAAAAAAAIppAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAilAAAAAAAAAAAAAAAAAAAAAAAAAA/wNodgICAgIHAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAABwAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAcAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAHAAIAAgACAAIABwACAAIAAgACAAcAAgACAAIAAgAHAAIAAgACAAIABwACAAIAAgACAAcAAgACAAIAAgAHAAIAAgACAAIABwACAAIAAgACAAcAAgACAAIAAgAHAAIAAgACAAIABwACAAIAAgACAAcAAgACAAIAAgAHAAIAAgACAAIABwACAAIAAgACAAcAAgACAAIAAgAHAAIAAgACAAIABwACAAIAAgACAAcAAgACAAIAAgAHAAIAAgACAAIABwACAAIAAgACAAcAAgACAAIAAgAHAAIAAgACAAIABwACAAIAAgACAAcAAgACAAIAAgAHAAIAAgACAAIABwACAAIAAgACAAcAAgACAAIAAgAHAAIAAgACAAIABwACAAIAAgACAAcAAgACAAIAAgAHAAIAAgACAAIABwACAAIAAgACAAcAAgACAAIAAgAHAAIAAgACAAIABwACAAIAAgACAAcAAgACAAIAAgAHAAIAAgACAAIABwACAAIAAgACAAcAAgACAAIAAgAHAAIAAgACAAIABwACAAIAAgACAAcAAgACAAIAAgAHAAIAAgACAAIABwACAAIAAgACAAcAAgACAAIAAgAHAAIAAgACAAIABwACAAIAAgACAAcAAAACAAAAAgAAAAIAAAACAAAABwAAAAIAAAACAAAAAgAAAAIAAAAHAAAAAgAAAAIAAAACAAAAAgAAAP8DZ4gAAAAA/wMaXQKAZP8DGOxqEi4iCIAGBIEcAoBWCoIoJIW6GgL/AybPAoBk/wMY7GoSLiIIgAYEgRwCgFYKgigkhboaAv8DJs8CgGT/AxjsahIuIgiABgSBHAKAVgqCKCSFuhoC/wMmzwKAZP8DGOxqEi4iCIAGBIEcAoBWCoIoJIW6GgL/AybPAoBk/wMY7GoSLiIIgAYEgRwCgFYKgigkhboaAv8DJs8CgGT/AxjsahIuIgiABgSBHAKAVgqCKCSFuhoC/wMmzwKAZP8DGOxqEi4iCIAGBIEcAoBWCoIoJIW6GgL/AybPAoBk/wMY7GoSLiIIgAYEgRwCgFYKgigkhboaAv8DJs8CgGT/AxjsahIuIgiABgSBHAKAVgqCKCSFuhoC/wMmzwKAZP8DGOxqEi4iCIAGBIEcAoBWCoIoJIW6GgL/AybPAoBk/wMY7GoSLiIIgAYEgRwCgFYKgigkhboaAv8DJs8CgGT/AxjsahIuIgiABgSBHAKAVgqCKCSFuhoC/wMmzwKAZP8DGOxqEi4iCIAGBIEcAoBWCoIoJIW6GgL/AybPAoBk/wMY7GoSLiIIgAYEgRwCgFYKgigkhboaAv8DJs8CgGT/AxjsahIuIgiABgSBHAKAVgqCKCSFuhoC/wMneQQDBAMEAwQDBAMEAwQDBAMEAwQDBAMEAwQDBAMEAwQDBAMEAwQDBAMEAwQDBAMEAwQDBAMEAwQDBAMEAwQDBAMEAwQDBAMEAwQDBAMEAwQDBAMEAwQDBAMEAwQDBAMEAwQDBAMEAwQDBAMEAwQDBAMEAwQDBAMEAwQDBAMEAwQDBAMEAwQDBAMEAwQDBAMEAwQDBAMEAwQDBAMEAwQDBAMEAwQDBAMEAwQDBAMEAwQDBAMEAwQDBAMEAwQDBAMEAwQDBAMEAwQDBAMEAwQDBAMEAwQDBAMEAwQDBAMEAwQDBAMEAwQDBAMEAwQDBAMEAwQDBAMEAwQDBAMEAwQDBAMEAwQDBAMEAwQDBAMEAwQDBAMEAwQDBAMEAwQDBAMEAwQDBAMEAwQDBAMEAwQDBAMEAwQDBAMEAwQDBAMEAwQDBAMEAwQDBAMEAwQDBAMEAwQDBAMEAwQDBAMEAwQDBAMEAwQDBAMEAwQDBAMEAwQDBAMEAwQDBAMEAwQDBAMEAwQDBAMEAwQDBAMEAwQDBAMEAwQDBAMEAwQDBAMEAwQDBAMEAwQDBAMEAwQDBAMEAwQDBAMEAwQDBAMEAwQDBAMEAwQDBAMEAwQDBAMEAwQDBAMEAwT/AydcAgICBQICAgUCAgIFAgICBQICAgUCAgIFAgICBQICAgUCAgIFAgICBQICAgUCAgIFAgICBQICAgUCAgI=');
function decode_zwnj_emoji(s) {
let r = new TableReader(bytes_from_base64(s));
let buckets = []; // stored by post-idna length
while (r.more) {
let n = r.read(); // group size
let w = r.read_byte(); // group width
let p = r.read(); // bit positions of zwnj
let m = [];
for (let i = 0; i < n; i++) m.push([]);
let b = w;
for (let i = 0; i < w; i++) { // signed delta-encoded, transposed
if (p & (1 << (i - 1))) {
m.forEach(v => v.push(0x200D)); // insert zwnj
--b; // discount
} else {
let y = 0;
for (let v of m) v.push(y += r.read_signed());
}
}
let bucket = buckets[b];
if (!bucket) buckets[b] = bucket = [];
bucket.push(...m);
}
for (let v of buckets) if (v) v.sort((a, b) => a[0] - b[0]); // store sorted
return buckets;
}
export function upgrade_zwnj_emoji(v) {
let ret = [];
next_cp: for (let i = 0, n = v.length; i < n; i++) {
let cp0 = v[i];
next_bucket: for (let b = Math.min(n - i, EMOJI.length); b >= 1; b--) { // only consider emoji that fit
let bucket = EMOJI[b];
if (!bucket) continue;
next_emoji: for (let emoji of bucket) { // todo: binary search
let c = emoji[0] - cp0;
if (c < 0) continue;
if (c > 0) continue next_bucket;
let j = i + 1;
for (let k = 1; k < emoji.length; k++) {
let cp = emoji[k];
if (cp == 0x200D) continue;
if (cp != v[j++]) continue next_emoji;
}
ret.push(emoji); // apply upgrade
i += b - 1;
continue next_cp;
}
}
ret.push(cp0);
}
return ret.flat();
}
// member are 1-tuples [unsigned(cp)]

@@ -91,3 +150,3 @@ function lookup_member(table, cp) {

y += r.read_signed();
if (d < n) return String.fromCodePoint(y + d);
if (d < n) return y + d;
x += n;

@@ -110,3 +169,3 @@ }

}
return String.fromCodePoint(...v);
return v;
}

@@ -184,18 +243,16 @@ for (let j = 0; j < width; j++) {

// warning: these should not be used directly
// expects code point (number)
// is_* returns boolean
// get_* returns list-of-code-points or undefined
export function is_disallowed(cp) {
return lookup_member_span(TABLE_D, typeof cp === 'string' ? cp.codePointAt(0) : cp);
return lookup_member_span(TABLE_D, cp);
}
export function is_ignored(cp) {
return lookup_member_span(TABLE_I, typeof cp === 'string' ? cp.codePointAt(0) : cp);
return lookup_member_span(TABLE_I, cp);
}
export function is_combining_mark(cp) {
return lookup_member_span(TABLE_M, typeof cp === 'string' ? cp.codePointAt(0) : cp);
return lookup_member_span(TABLE_M, cp);
}
// returns mapped string or undefined
// warning: this does not check if disallowed/ignored
export function get_mapped(cp) {
if (typeof cp === 'string') cp = cp.codePointAt(0);
let mapped = lookup_linear(TABLE_N, cp);

@@ -209,9 +266,12 @@ if (mapped) return mapped;

// idna2008 with CONTEXTJ
// 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) {
if (typeof s !== 'string') throw new Error('expected string');
let v = [...s].map(x => x.codePointAt(0));
return v.map((cp, i) => {
if (typeof s !== 'string') throw new TypeError('expected string');
let v = [...s].map(x => x.codePointAt(0)); // convert to code-points
const empty = [];
return String.fromCodePoint(...upgrade_zwnj_emoji(v.map((cp, i) => {
if (is_disallowed(cp)) throw new Error(`disallowed: 0x${cp.toString(16).padStart(2, '0')}`);
if (is_ignored(cp)) return '';
if (is_ignored(cp)) return empty;
if (cp === 0x200C) { // https://datatracker.ietf.org/doc/html/rfc5892#appendix-A.1

@@ -221,4 +281,4 @@ // rule 1: V + cp

if (i > 0 && lookup_member(TABLE_V, v[i - 1])) {
return String.fromCodePoint(cp);
}
return cp; // allowed
}
// rule 2: {L,D} + T* + cp + T* + {R,D}

@@ -233,8 +293,7 @@ // L,D,T,R = Joining_Type

if (lookup_member_span(TABLE_RD, v[tail])) { // R or D
return String.fromCodePoint(cp);
return cp; // allowed
}
}
}
//throw new Error('disallowed: zero-width joiner without context');
return ''; // ignored
}
return empty; // ignore
} else if (cp === 0x200D) { // https://datatracker.ietf.org/doc/html/rfc5892#appendix-A.2

@@ -244,24 +303,38 @@ // rule 1: V + cp

if (i > 0 && lookup_member(TABLE_V, v[i - 1])) {
return String.fromCodePoint(cp);
return cp; // allowed
}
//throw new Error('disallowed: zero-width non-joiner without context');
return ''; // ignored
return empty; // ignore
}
return get_mapped(cp) ?? String.fromCodePoint(cp);
}).join('').normalize('NFC');
return get_mapped(cp) ?? cp;
}).flat())).normalize('NFC');
}
// primary api
export function ens_normalize(name) {
return idna(name).split('.').map(s => {
if (s.startsWith('xn--')) {
s = puny_decode(s.slice(4));
if (idna(s) !== s) throw new Error(`puny-idna mismatch on label: ${s}`); // can this happen?
// expects a string
// throws TypeError if not a string
// returns a normalized string ready for namehash
// throws Error if not normalizable
export function ens_normalize(name) { // https://unicode.org/reports/tr46/#Processing
// idna() will:
// 1. map all full-stops to "." (see: Section 2.3 and Section 4.5)
// 2. apply ContextJ rules (see: Section 4.1 Rule #7) [as-of v14.0.0, ContextJ does not span a stop]
// 3. apply Section 4 Processing Rule #1 (Map) and Rule #2 (Normalize)
return idna(name).split('.').map(label => { // Section 4 Processing Rule #3 (Break)
if (label.startsWith('xn--')) { // Rule #4 (Convert)
label = puny_decode(label.slice(4));
if (idna(label) !== label) throw new Error(`puny-idna mismatch on label: ${label}`); // can this happen?
}
if (s.length >= 4 && s[2] == '-' && s[3] == '-') throw new Error(`double-hyphen at label[3:4]: ${s}`);
if (s.startsWith('-')) throw new Error(`hyphen at label start: ${s}`);
if (s.endsWith('-')) throw new Error(`hyphen at label end: ${s}`);
if (s.length > 0 && is_combining_mark(s)) throw new Error(`mark at label start: ${s}`);
return s;
// Section 4.1 Rule #1 (NFC) is already satisfied by idna()
// apply Section 4.1 Rule #2
if (label.length >= 4 && label[2] == '-' && label[3] == '-') throw new Error(`double-hyphen at label[3:4]: ${label}`);
// apply Section 4.1 Rule #3
if (label.startsWith('-')) throw new Error(`hyphen at label start: ${label}`);
if (label.endsWith('-')) throw new Error(`hyphen at label end: ${label}`);
// apply Section 4.1 Rule #5
if (label.length > 0 && is_combining_mark(label.codePointAt(0))) throw new Error(`mark at label start: ${label}`);
// Section 4.1 Rule #6 (Valid) is satisfied by idna() following EIP-137 (transitional=N, useSTD3AsciiRules=Y)
// Section 4.1 Rule #7 (ContextJ) is satisfied by idna()
// Section 4.1 Rule #8 NYI
return label;
}).join('.');
}
{
"name": "@adraffy/ens-normalize",
"version": "1.0.5",
"version": "1.0.6",
"description": "Compact ES6 Ethereum Name Service (ENS) Name Normalizer",

@@ -21,3 +21,6 @@ "keywords": ["ENS", "Ethereum", "UTS-46", "IDNA2008"],

"url" : "http://raffy.antistupid.com"
},
"scripts": {
"test": "node ./test/test.js"
}
}
SocketSocket SOC 2 Logo

Product

  • Package Alerts
  • Integrations
  • Docs
  • Pricing
  • FAQ
  • Roadmap
  • Changelog

Packages

npm

Stay in touch

Get open source security insights delivered straight into your inbox.


  • Terms
  • Privacy
  • Security

Made with ⚡️ by Socket Inc