README
ens-normalize.js
1-file, 1-function, 1-argument, 0-dependancy Compact ES6 Ethereum Name Service (ENS) Name Normalizer.
- Uses Unicode v14.0.0 + UTS-51 + UTS-46 w/IDNA2008
- Handles
ContextJ/ContextO
- Handles
CheckBidi
- Passes 100% IDNATestV2 (Using
uts46
Payload) - Handles Emoji ZWJ Sequences
- Passes 100% Emoji Sequences (Using
uts51
Payload) - Passes 100% NormalizationTests
- Handles Punycode, adapted from mathiasbynens/punycode.js
- Demo: Resolver
- Demo: Display Name
- Generated Report vs
eth-ens-namehash
Latest version ā¢ Prior (IDNA2003)
import {ens_normalize} from '@adraffy/ens-normalize';
// browser:
// 'https://unpkg.com/@adraffy/ens-normalize@latest/dist/ens-normalize.min.js'
// alternatives:
// - ens-normalize-xbidi.min.js (no CheckBidi)
// - ens-normalize-xnfc.min.js (use default String.normalize)
// see: /dist/ for more
// Primary API: string -> string
let normalized = ens_normalize('š“āāļø.eth'); // throws
// ready for namehash
// errors:
// - not a string
// - contains disallowed character
// - punycode error
// - label has double-hyphen
// - label starts/ends with hyphen
// - 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: parts.js submodule below.
// Secondary API: string -> [{tokens,...}]
// 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: "/"
// ]
Independent submodules:
// 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
// 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 inbuild/lib-normalize.js
. You can run this file directly. - Run
node build/unicode.js download
to download data from unicode.org. - 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
npm run test-source
to testbuild/lib-normalize.js
. - Run
npm run build
ornode build/build.js all
to inject the compressed tables into the source template and create the readable and minifieddist/
files. - Run
npm run test-build
to testdist/ens-normalize.js
.