fast-uri
Version:
Dependency-free RFC 3986 URI toolbox
211 lines (184 loc) • 6 kB
JavaScript
const test = require('tape')
const fastURI = require('..')
const {
normalizePathEncoding,
escapePreservingEscapes
} = require('../lib/utils')
// Helper: any %uXXXX in output is a bug. RFC 3986 only allows %XX.
const PERCENT_U = /%u[\da-fA-F]{4}/
test('normalizePathEncoding emits UTF-8 %XX for BMP chars', (t) => {
const cases = [
['/日本', '/%E6%97%A5%E6%9C%AC'],
['/ä', '/%C3%A4'],
['/€', '/%E2%82%AC'],
['/中文/path', '/%E4%B8%AD%E6%96%87/path']
]
t.plan(cases.length * 2)
cases.forEach(([input, expected]) => {
const out = normalizePathEncoding(input)
t.equal(out, expected, input)
t.notOk(PERCENT_U.test(out), 'no %uXXXX in ' + out)
})
})
test('normalizePathEncoding emits 4-byte UTF-8 for supplementary plane (emoji)', (t) => {
const cases = [
['/😀', '/%F0%9F%98%80'],
['/🚀', '/%F0%9F%9A%80'],
['/a🚀b', '/a%F0%9F%9A%80b']
]
t.plan(cases.length * 2)
cases.forEach(([input, expected]) => {
const out = normalizePathEncoding(input)
t.equal(out, expected, input)
t.notOk(PERCENT_U.test(out), 'no %uXXXX in ' + out)
})
})
test('normalizePathEncoding encodes control chars as %XX', (t) => {
const cases = [
['