idna-uts46-hx
Advanced tools
Comparing version 5.1.2 to 6.0.0
@@ -14,4 +14,4 @@ { | ||
{ | ||
"prepareCmd": "npm run build && npx lint-staged", | ||
"successCmd": "gulp -f gulpfile.cjs publish --notes \"${encodeURIComponent(nextRelease.notes)}\"" | ||
"prepareCmd": "npm run prepare", | ||
"successCmd": "gulp -f gulpfile.cjs publishNotification --update \"${nextRelease.version}\" --type \"${nextRelease.type}\" --notes \"${encodeURIComponent(nextRelease.notes)}\"" | ||
} | ||
@@ -27,3 +27,2 @@ ], | ||
"release.config.js", | ||
"dist/index.d.ts", | ||
"dist/index.mjs", | ||
@@ -30,0 +29,0 @@ "dist/index.cjs", |
@@ -28,17 +28,17 @@ # Contributing | ||
* Using welcoming and inclusive language | ||
* Being respectful of differing viewpoints and experiences | ||
* Gracefully accepting constructive criticism | ||
* Focusing on what is best for the community | ||
* Showing empathy towards other community members | ||
- Using welcoming and inclusive language | ||
- Being respectful of differing viewpoints and experiences | ||
- Gracefully accepting constructive criticism | ||
- Focusing on what is best for the community | ||
- Showing empathy towards other community members | ||
Examples of unacceptable behavior by participants include: | ||
* The use of sexualized language or imagery and unwelcome sexual attention or | ||
- The use of sexualized language or imagery and unwelcome sexual attention or | ||
advances | ||
* Trolling, insulting/derogatory comments, and personal or political attacks | ||
* Public or private harassment | ||
* Publishing others' private information, such as a physical or electronic | ||
- Trolling, insulting/derogatory comments, and personal or political attacks | ||
- Public or private harassment | ||
- Publishing others' private information, such as a physical or electronic | ||
address, without explicit permission | ||
* Other conduct which could reasonably be considered inappropriate in a | ||
- Other conduct which could reasonably be considered inappropriate in a | ||
professional setting | ||
@@ -45,0 +45,0 @@ |
@@ -0,1 +1,13 @@ | ||
# [6.0.0](https://github.com/centralnicgroup-opensource/rtldev-middleware-idna-uts46/compare/v5.1.2...v6.0.0) (2024-2-22) | ||
### Code Refactoring | ||
* **tr46:** reviewed in direction of tr46 as core library and adding our logic around ([d0c080a](https://github.com/centralnicgroup-opensource/rtldev-middleware-idna-uts46/commit/d0c080a0d1ae9382cda2b4dd8d233805c8da5cdd)) | ||
### BREAKING CHANGES | ||
* **tr46:** Migration to package tr46. Find Notes and Migration Guide as part of the README.md | ||
## [5.1.2](https://github.com/hexonet/idna-uts46/compare/v5.1.1...v5.1.2) (2023-10-31) | ||
@@ -2,0 +14,0 @@ |
{ | ||
"name": "idna-uts46-hx", | ||
"description": "A UTS #46 processing algorithm for IDNA2008 strings", | ||
"version": "5.1.2", | ||
"description": "Convert Domain Names correctly from IDN to Punycode and vice-versa and offer TR46 processing.", | ||
"version": "6.0.0", | ||
"private": false, | ||
"type": "module", | ||
"main": "dist/index.mjs", | ||
"typings": "dist/index.d.ts", | ||
"license": "MIT", | ||
@@ -14,5 +13,5 @@ "sideEffects": false, | ||
}, | ||
"homepage": "https://github.com/hexonet/idna-uts46", | ||
"repository": "github:hexonet/idna-uts46", | ||
"bugs": "https://github.com/hexonet/idna-uts46/issues", | ||
"homepage": "https://github.com/centralnicgroup-opensource/rtldev-middleware-idna-uts46", | ||
"repository": "github:centralnicgroup-opensource/rtldev-middleware-idna-uts46", | ||
"bugs": "https://github.com/centralnicgroup-opensource/rtldev-middleware-idna-uts46/issues", | ||
"keywords": [ | ||
@@ -22,40 +21,29 @@ "unicode", | ||
"idna", | ||
"domain" | ||
"domain", | ||
"convert", | ||
"converter" | ||
], | ||
"nyc": { | ||
"reporter": [ | ||
"html", | ||
"text" | ||
], | ||
"exclude": [ | ||
"test", | ||
"scripts", | ||
"rollup*", | ||
"**/*.spec.js", | ||
"idna-map.js" | ||
] | ||
}, | ||
"unicodeVersion": "15.1.0", | ||
"scripts": { | ||
"prettier": "prettier -u --write \"**/*\"", | ||
"build": "npm run build:unicode-tables && npm run build:rollup", | ||
"build": "rollup -c rollup-esm.config.mjs", | ||
"pretest": "npm run build", | ||
"test": "mocha", | ||
"test:coverage": "cross-env NODE_ENV=development nyc npm run test --silent", | ||
"test:serve": "npm run test:serve-prepare && serve", | ||
"test:serve-prepare": "cp node_modules/mocha/mocha.css dist/index.bundle.js dist/index.mjs test", | ||
"test:coverage": "c8 mocha", | ||
"posttest:coverage": "trap ' ' INT; serve coverage/", | ||
"preserve": "cp node_modules/mocha/mocha.css dist/index.bundle.js dist/index.mjs test", | ||
"serve": "trap ' ' INT; serve test/", | ||
"postserve": "rm test/mocha.css test/index.bundle.js test/index.mjs", | ||
"lint": "eslint .", | ||
"prepare": "npm run build && npx lint-staged", | ||
"build:unicode-upgrade": "tsx scripts/unicode-upgrade.ts", | ||
"build:unicode-checkversion": "tsx scripts/unicode-checkversion.ts", | ||
"build:unicode-tables": "tsx scripts/build-unicode-tables.ts 15.1.0", | ||
"build:rollup": "rollup -c rollup-esm.config.mjs" | ||
"prepare": "npm run build && npx lint-staged" | ||
}, | ||
"overrides": { | ||
"glob-parent": "^6.0.2" | ||
"glob-parent": "^6.0.2", | ||
"chokidar": "^3.5.3" | ||
}, | ||
"dependencies": { | ||
"punycode": "^2.1.1" | ||
"tr46": "^5.0.0" | ||
}, | ||
"devDependencies": { | ||
"@rollup/plugin-commonjs": "^25.0.7", | ||
"@rollup/plugin-json": "^6.1.0", | ||
"@rollup/plugin-node-resolve": "^15.2.1", | ||
@@ -66,20 +54,14 @@ "@rollup/plugin-terser": "^0.4.3", | ||
"@semantic-release/git": "^10.0.1", | ||
"@types/node": "^20.4.2", | ||
"axios": "^1.3.4", | ||
"cross-env": "^7.0.3", | ||
"esbuild": "^0.19.2", | ||
"c8": "^9.1.0", | ||
"eslint": "^8.35.0", | ||
"eslint-plugin-mocha": "^10.1.0", | ||
"gulp": "^4.0.2", | ||
"lint-staged": "^15.0.1", | ||
"mocha": "^10.2.0", | ||
"nyc": "^15.1.0", | ||
"prettier": "^3.0.0", | ||
"rollup": "^4.0.0", | ||
"rollup-plugin-bundle-size": "^1.0.3", | ||
"rtldev-middleware-gulp-release-notification-plugin": "github:centralnicgroup-opensource/rtldev-middleware-gulp-release-notification-plugin", | ||
"semantic-release": "^22.0.5", | ||
"rtldev-middleware-gulp-release-notification-plugin": "github:centralnicgroup-opensource/rtldev-middleware-gulp-release-notification-plugin#semver:^2.0.3", | ||
"semantic-release": "^23.0.0", | ||
"serve": "^14.2.0", | ||
"terser": "^5.19.4", | ||
"tsx": "^3.12.3" | ||
"terser": "^5.19.4" | ||
}, | ||
@@ -86,0 +68,0 @@ "lint-staged": { |
@@ -9,4 +9,3 @@ # IDNA-UTS #46 in JavaScript | ||
This module is a IDNA UTS46 connector library for javascript. | ||
This is a maintained fork of the idna-uts46 library originally written by jcranmer. Continously maintained by KaiSchwarz-cnic and fully ported to JS by dawsbot. | ||
This module is a IDNA UTS46 connector library for javascript. In addition to the default functionality of tr46, we offer converting domain names to unicode / punycode considering the respective registry provider's behavior. | ||
@@ -26,9 +25,46 @@ The [JS Punycode converter library](https://github.com/bestiejs/punycode.js/) is | ||
## v6 Notes & Migration Guide | ||
With v6 we migrated our library to npm package `tr46` as software dependency. By that step we use a library that is actively maintained in direction of correctly supporting the `TR46` standard and supporting the latest Version of the Unicode Standard. Reinventing the wheel isn't useful and something we have time or resources for. We were able to dramatically decrease the number of lines of code on our end. | ||
### Improvements | ||
- method `toUnicode` comes with auto-detection of `transitionalProcessing` setting based on the provided domain name input | ||
- method `toAscii` comes with auto-detection of `transitionalProcessing` setting based on the provided domain name input | ||
### Breaking Changes | ||
In general, we don't see a blocker for upgrading to v6. Still, consider the below changes. | ||
#### Performance | ||
We haven't tested for this explicitely, but as we dropped the IDNA mapping table on our end by the Migration to package `tr46`, there's no longer a compression included for it as that table is no longer directly in our hands. This was a great way for improving the page load time on browser side. Maintainability + Efforts > Performance. This may again change in future, but needs resources assigned. PR = welcome. | ||
#### New Labels for Options | ||
The below configuration options for the methods `toUnicode`and `toAscii` must be renamed in case you're using them: | ||
| **Option, old** | **Option, new** | | ||
| --------------- | ---------------------- | | ||
| transitional | transitionalProcessing | | ||
| useStd3ASCII | useSTD3ASCIIRules | | ||
| verifyDnsLength | verifyDNSLength | | ||
#### Behavior | ||
Earlier versions kept option `transitional` by default to false which is now automatically detected and results may therefore differ. | ||
This affects the `toAscii` method. | ||
The `toUnicode` function did not allow for a options parameter in earlier versions, now it follows the exemplary way of package `tr46`. | ||
## Authors | ||
NOTE: As mentioned, initial work done by [jcranmer](https://github.com/jcranmer). | ||
- [KaiSchwarz-cnic](https://github.com/kaischwarz-cnic) | ||
- [dawsbot](https://github.com/dawsbot) | ||
**Thanks for the below former contributions:** | ||
- Initial work done by [jcranmer](https://github.com/jcranmer). | ||
- v5: Migration of the IDNA Mapping Table's Build Process from Python to NodeJS5 by [dawsbot](https://github.com/dawsbot) | ||
- v5: Performance Improvements for the Browser Bundle's Page Load by [dawsbot](https://github.com/dawsbot) | ||
See also the list of [contributors](https://github.com/hexonet/idna-uts46/graphs/contributors) who participated in this project. | ||
@@ -35,0 +71,0 @@ |
151
src/index.js
@@ -1,115 +0,27 @@ | ||
import { ucs2encode, ucs2decode, decode, toASCII } from 'punycode/'; | ||
import { mapChar, mapStr } from './idna-map'; | ||
import tr46 from 'tr46'; | ||
function mapLabel(label, useStd3ASCII, transitional) { | ||
const mapped = []; | ||
const chars = ucs2decode(label); | ||
for (let i = 0; i < chars.length; i++) { | ||
const cp = chars[i]; | ||
const ch = ucs2encode([chars[i]]); | ||
const composite = mapChar(cp); | ||
const flags = composite >> 23; | ||
const kind = (composite >> 21) & 3; | ||
const index = (composite >> 5) & 0xffff; | ||
const length = composite & 0x1f; | ||
const value = mapStr.substr(index, length); | ||
if (kind === 0 || (useStd3ASCII && flags & 1)) { | ||
throw new Error('Illegal char ' + ch); | ||
} else if (kind === 1) { | ||
mapped.push(value); | ||
} else if (kind === 2) { | ||
mapped.push(transitional ? value : ch); | ||
/* istanbul ignore next */ | ||
} else if (kind === 3) { | ||
mapped.push(ch); | ||
} | ||
} | ||
const newLabel = mapped.join('').normalize('NFC'); | ||
return newLabel; | ||
function getDefaultOptions(domain) { | ||
return { | ||
transitionalProcessing: !domain.match( | ||
/\.(?:be|ca|de|swiss|fr|pm|re|tf|wf|yt)\.?$/, | ||
), | ||
}; | ||
} | ||
function process(domain, transitional, useStd3ASCII) { | ||
/* istanbul ignore if */ | ||
if (useStd3ASCII === undefined) { | ||
useStd3ASCII = false; | ||
function toAscii(domain, opts = {}) { | ||
const pc = tr46.toASCII(domain, { ...getDefaultOptions(domain), ...opts }); | ||
if (pc !== null) { | ||
return pc; | ||
} | ||
const mappedIDNA = mapLabel(domain, useStd3ASCII, transitional); | ||
// Step 3. Break | ||
let labels = mappedIDNA.split('.'); | ||
// Step 4. Convert/Validate | ||
labels = labels.map(function (label) { | ||
if (label.startsWith('xn--')) { | ||
label = decode(label.substring(4)); | ||
validateLabel(label, useStd3ASCII, false); | ||
} else { | ||
validateLabel(label, useStd3ASCII, transitional); | ||
} | ||
return label; | ||
}); | ||
return labels.join('.'); | ||
throw new Error(`Unable to translate ${domain} to ASCII.`); | ||
} | ||
function validateLabel(label, useStd3ASCII, transitional) { | ||
// 2. The label must not contain a U+002D HYPHEN-MINUS character in both the | ||
// third position and fourth positions. | ||
if (label[2] === '-' && label[3] === '-') { | ||
throw new Error('Failed to validate ' + label); | ||
function toUnicode(domain, opts = {}) { | ||
const idn = tr46.toUnicode(domain, { ...getDefaultOptions(domain), ...opts }); | ||
if (idn !== null && !idn.error) { | ||
return idn.domain; | ||
} | ||
// 3. The label must neither begin nor end with a U+002D HYPHEN-MINUS | ||
// character. | ||
if (label.startsWith('-') || label.endsWith('-')) { | ||
throw new Error('Failed to validate ' + label); | ||
} | ||
// 4. The label must not contain a U+002E ( . ) FULL STOP. | ||
// this should nerver happen as label is chunked internally by this character | ||
/* istanbul ignore if */ | ||
if (label.includes('.')) { | ||
throw new Error('Failed to validate ' + label); | ||
} | ||
if (mapLabel(label, useStd3ASCII, transitional) !== label) { | ||
throw new Error('Failed to validate ' + label); | ||
} | ||
// 5. The label must not begin with a combining mark, that is: | ||
// General_Category=Mark. | ||
const ch = label.codePointAt(0); | ||
if (mapChar(ch) & (0x2 << 23)) { | ||
throw new Error('Label contains illegal character: ' + ch); | ||
} | ||
throw new Error(`Unable to translate ${domain} to Unicode.`); | ||
} | ||
function toAscii(domain, options) { | ||
if (options === undefined) { | ||
options = {}; | ||
} | ||
const transitional = 'transitional' in options ? options.transitional : true; | ||
const useStd3ASCII = 'useStd3ASCII' in options ? options.useStd3ASCII : false; | ||
const verifyDnsLength = | ||
'verifyDnsLength' in options ? options.verifyDnsLength : false; | ||
const labels = process(domain, transitional, useStd3ASCII).split('.'); | ||
const asciiLabels = labels.map(toASCII); | ||
const asciiString = asciiLabels.join('.'); | ||
let i; | ||
if (verifyDnsLength) { | ||
if (asciiString.length < 1 || asciiString.length > 253) { | ||
throw new Error('DNS name has wrong length: ' + asciiString); | ||
} | ||
for (i = 0; i < asciiLabels.length; i++) { | ||
// for .. of replacement | ||
const label = asciiLabels[i]; | ||
if (label.length < 1 || label.length > 63) { | ||
throw new Error('DNS label has wrong length: ' + label); | ||
} | ||
} | ||
} | ||
return asciiString; | ||
} | ||
function convert(domains) { | ||
@@ -122,22 +34,11 @@ const isArrayInput = Array.isArray(domains); | ||
domains.forEach((domain) => { | ||
let pc, tmp; | ||
try { | ||
pc = toAscii(domain, { | ||
transitional: !domain.match( | ||
/\.(?:be|ca|de|fr|pm|re|swiss|tf|wf|yt)\.?$/, | ||
), | ||
}); | ||
tmp = { | ||
PC: pc, | ||
IDN: toUnicode(pc), | ||
}; | ||
results.PC.push(toAscii(domain)); | ||
results.IDN.push(toUnicode(domain)); | ||
} catch (e) { | ||
tmp = { | ||
PC: domain, | ||
IDN: domain, | ||
}; | ||
results.PC.push(domain); | ||
results.IDN.push(domain); | ||
} | ||
results.PC.push(tmp.PC); | ||
results.IDN.push(tmp.IDN); | ||
}); | ||
if (isArrayInput) { | ||
@@ -149,10 +50,2 @@ return results; | ||
function toUnicode(domain, options) { | ||
if (options === undefined) { | ||
options = {}; | ||
} | ||
const useStd3ASCII = 'useStd3ASCII' in options ? options.useStd3ASCII : false; | ||
return process(domain, false, useStd3ASCII); | ||
} | ||
export { toUnicode, toAscii, convert }; |
'use strict'; | ||
import assert from 'assert'; | ||
import * as uts46 from '../dist/index.mjs'; | ||
import * as uts46 from '../src/index.js'; | ||
@@ -25,3 +25,3 @@ suite('toASCII', function () { | ||
uts46.toAscii('faß.de', { | ||
transitional: true, | ||
transitionalProcessing: true, | ||
}), | ||
@@ -32,3 +32,3 @@ 'fass.de', | ||
uts46.toAscii('faß.de', { | ||
transitional: false, | ||
transitionalProcessing: false, | ||
}), | ||
@@ -39,3 +39,3 @@ 'xn--fa-hia.de', | ||
uts46.toAscii('xn--fa-hia.de', { | ||
transitional: true, | ||
transitionalProcessing: true, | ||
}), | ||
@@ -49,3 +49,3 @@ 'xn--fa-hia.de', | ||
uts46.toAscii('not=std3', { | ||
useStd3ASCII: true, | ||
useSTD3ASCIIRules: true, | ||
}); | ||
@@ -59,3 +59,3 @@ }); | ||
uts46.toAscii('', { | ||
verifyDnsLength: false, | ||
verifyDNSLength: false, | ||
}), | ||
@@ -66,3 +66,3 @@ '', | ||
uts46.toAscii('', { | ||
verifyDnsLength: true, | ||
verifyDNSLength: true, | ||
}); | ||
@@ -74,14 +74,16 @@ }); | ||
uts46.toAscii('this..is.almost.right', { | ||
verifyDnsLength: true, | ||
transitionalProcessing: false, | ||
verifyDNSLength: true, | ||
}); | ||
}); | ||
assert.throws(function () { | ||
uts46.toAscii('a.'.repeat(252 / 2) + 'aa', { | ||
verifyDnsLength: true, | ||
// 254 characters | ||
uts46.toAscii('a.'.repeat(126) + 'aa', { | ||
verifyDNSLength: true, | ||
}); | ||
}); | ||
assert.doesNotThrow(function () { | ||
// Exactly 253 characters. | ||
uts46.toAscii('a.'.repeat(252 / 2) + 'a', { | ||
verifyDnsLength: true, | ||
// 253 characters | ||
uts46.toAscii('a.'.repeat(126) + 'a', { | ||
verifyDNSLength: true, | ||
}); | ||
@@ -91,3 +93,3 @@ }); | ||
uts46.toAscii('a'.repeat(64), { | ||
verifyDnsLength: true, | ||
verifyDNSLength: true, | ||
}); | ||
@@ -97,3 +99,3 @@ }); | ||
uts46.toAscii('a'.repeat(63), { | ||
verifyDnsLength: true, | ||
verifyDNSLength: true, | ||
}); | ||
@@ -105,3 +107,6 @@ }); | ||
test('Defaults to transitional', function () { | ||
assert.strict.equal(uts46.toAscii('faß.de'), 'fass.de'); | ||
assert.strict.equal( | ||
uts46.toAscii('faß.de', { transitionalProcessing: true }), | ||
'fass.de', | ||
); | ||
}); | ||
@@ -131,3 +136,3 @@ test('Non-BMP characters', function () { | ||
uts46.toUnicode('not=std3', { | ||
useStd3ASCII: true, | ||
useSTD3ASCIIRules: true, | ||
}); | ||
@@ -161,3 +166,3 @@ }); | ||
uts46.toAscii('fass.de', { | ||
transitional: true, | ||
transitionalProcessing: true, | ||
}), | ||
@@ -168,3 +173,3 @@ 'fass.de', | ||
uts46.toAscii('fass.de', { | ||
transitional: false, | ||
transitionalProcessing: false, | ||
}), | ||
@@ -178,3 +183,3 @@ 'fass.de', | ||
uts46.toAscii('faß.de', { | ||
transitional: true, | ||
transitionalProcessing: true, | ||
}), | ||
@@ -185,3 +190,3 @@ 'fass.de', | ||
uts46.toAscii('faß.de', { | ||
transitional: false, | ||
transitionalProcessing: false, | ||
}), | ||
@@ -195,3 +200,3 @@ 'xn--fa-hia.de', | ||
uts46.toAscii('fäß.de', { | ||
transitional: true, | ||
transitionalProcessing: true, | ||
}), | ||
@@ -202,3 +207,3 @@ 'xn--fss-qla.de', | ||
uts46.toAscii('fäß.de', { | ||
transitional: false, | ||
transitionalProcessing: false, | ||
}), | ||
@@ -212,3 +217,3 @@ 'xn--f-qfao.de', | ||
uts46.toAscii('xn--fa-hia.de', { | ||
transitional: true, | ||
transitionalProcessing: true, | ||
}), | ||
@@ -219,3 +224,3 @@ 'xn--fa-hia.de', | ||
uts46.toAscii('xn--fa-hia.de', { | ||
transitional: false, | ||
transitionalProcessing: false, | ||
}), | ||
@@ -229,3 +234,3 @@ 'xn--fa-hia.de', | ||
uts46.toAscii('₹.com', { | ||
transitional: true, | ||
transitionalProcessing: true, | ||
}), | ||
@@ -236,3 +241,3 @@ 'xn--yzg.com', | ||
uts46.toAscii('₹.com', { | ||
transitional: false, | ||
transitionalProcessing: false, | ||
}), | ||
@@ -246,3 +251,3 @@ 'xn--yzg.com', | ||
uts46.toAscii('𑀓.com', { | ||
transitional: true, | ||
transitionalProcessing: true, | ||
}), | ||
@@ -253,3 +258,3 @@ 'xn--n00d.com', | ||
uts46.toAscii('𑀓.com', { | ||
transitional: false, | ||
transitionalProcessing: false, | ||
}), | ||
@@ -265,3 +270,3 @@ 'xn--n00d.com', | ||
uts46.toAscii('\u0080.com', { | ||
transitional: true, | ||
transitionalProcessing: true, | ||
}); | ||
@@ -271,3 +276,3 @@ }); | ||
uts46.toAscii('\u0080.com', { | ||
transitional: false, | ||
transitionalProcessing: false, | ||
}); | ||
@@ -282,3 +287,3 @@ }); | ||
uts46.toAscii('xn--a.com', { | ||
transitional: true, | ||
transitionalProcessing: true, | ||
}); | ||
@@ -288,3 +293,3 @@ }); | ||
uts46.toAscii('xn--a.com', { | ||
transitional: false, | ||
transitionalProcessing: false, | ||
}); | ||
@@ -295,6 +300,11 @@ }); | ||
// ab | ||
assert.strict.equal(uts46.toUnicode('ab'), 'a\u200Cb'); // no error thrown | ||
assert.strict.equal( | ||
uts46.toUnicode('ab', { | ||
transitionalProcessing: false, | ||
}), | ||
'a\u200Cb', | ||
); // no error thrown | ||
assert.strict.equal( | ||
uts46.toAscii('ab', { | ||
transitional: true, | ||
transitionalProcessing: true, | ||
}), | ||
@@ -305,3 +315,3 @@ 'ab', | ||
uts46.toAscii('ab', { | ||
transitional: false, | ||
transitionalProcessing: false, | ||
}), | ||
@@ -317,3 +327,3 @@ 'xn--ab-j1t', | ||
// no error thrown | ||
transitional: true, | ||
transitionalProcessing: true, | ||
}), | ||
@@ -324,3 +334,3 @@ 'xn--ab-j1t', | ||
uts46.toAscii('xn--ab-j1t', { | ||
transitional: false, | ||
transitionalProcessing: false, | ||
}), | ||
@@ -334,3 +344,3 @@ 'xn--ab-j1t', | ||
uts46.toAscii('öbb.at', { | ||
transitional: true, | ||
transitionalProcessing: true, | ||
}), | ||
@@ -341,3 +351,3 @@ 'xn--bb-eka.at', | ||
uts46.toAscii('öbb.at', { | ||
transitional: false, | ||
transitionalProcessing: false, | ||
}), | ||
@@ -351,3 +361,3 @@ 'xn--bb-eka.at', | ||
uts46.toAscii('ÖBB.at', { | ||
transitional: true, | ||
transitionalProcessing: true, | ||
}), | ||
@@ -358,3 +368,3 @@ 'xn--bb-eka.at', | ||
uts46.toAscii('ÖBB.at', { | ||
transitional: false, | ||
transitionalProcessing: false, | ||
}), | ||
@@ -368,3 +378,3 @@ 'xn--bb-eka.at', | ||
uts46.toAscii('ȡog.de', { | ||
transitional: true, | ||
transitionalProcessing: true, | ||
}), | ||
@@ -375,3 +385,3 @@ 'xn--og-09a.de', | ||
uts46.toAscii('ȡog.de', { | ||
transitional: false, | ||
transitionalProcessing: false, | ||
}), | ||
@@ -385,3 +395,3 @@ 'xn--og-09a.de', | ||
uts46.toAscii('☕.de', { | ||
transitional: true, | ||
transitionalProcessing: true, | ||
}), | ||
@@ -392,3 +402,3 @@ 'xn--53h.de', | ||
uts46.toAscii('☕.de', { | ||
transitional: false, | ||
transitionalProcessing: false, | ||
}), | ||
@@ -402,3 +412,3 @@ 'xn--53h.de', | ||
uts46.toAscii('I♥NY.de', { | ||
transitional: true, | ||
transitionalProcessing: true, | ||
}), | ||
@@ -409,3 +419,3 @@ 'xn--iny-zx5a.de', | ||
uts46.toAscii('I♥NY.de', { | ||
transitional: false, | ||
transitionalProcessing: false, | ||
}), | ||
@@ -422,3 +432,3 @@ 'xn--iny-zx5a.de', | ||
uts46.toAscii('ABC・日本.co.jp', { | ||
transitional: true, | ||
transitionalProcessing: true, | ||
}), | ||
@@ -429,3 +439,3 @@ 'xn--abc-rs4b422ycvb.co.jp', | ||
uts46.toAscii('ABC・日本.co.jp', { | ||
transitional: false, | ||
transitionalProcessing: false, | ||
}), | ||
@@ -439,3 +449,3 @@ 'xn--abc-rs4b422ycvb.co.jp', | ||
uts46.toAscii('日本。co。jp', { | ||
transitional: true, | ||
transitionalProcessing: true, | ||
}), | ||
@@ -446,3 +456,3 @@ 'xn--wgv71a.co.jp', | ||
uts46.toAscii('日本。co。jp', { | ||
transitional: false, | ||
transitionalProcessing: false, | ||
}), | ||
@@ -456,3 +466,3 @@ 'xn--wgv71a.co.jp', | ||
uts46.toAscii('日本。co.jp', { | ||
transitional: true, | ||
transitionalProcessing: true, | ||
}), | ||
@@ -463,3 +473,3 @@ 'xn--wgv71a.co.jp', | ||
uts46.toAscii('日本。co.jp', { | ||
transitional: false, | ||
transitionalProcessing: false, | ||
}), | ||
@@ -475,3 +485,3 @@ 'xn--wgv71a.co.jp', | ||
uts46.toAscii('日本⒈co.jp', { | ||
transitional: true, | ||
transitionalProcessing: true, | ||
}); | ||
@@ -481,3 +491,3 @@ }); | ||
uts46.toAscii('日本⒈co.jp', { | ||
transitional: false, | ||
transitionalProcessing: false, | ||
}); | ||
@@ -490,3 +500,3 @@ }); | ||
uts46.toAscii('x\u0327\u0301.de', { | ||
transitional: true, | ||
transitionalProcessing: true, | ||
}), | ||
@@ -497,3 +507,3 @@ 'xn--x-xbb7i.de', | ||
uts46.toAscii('x\u0327\u0301.de', { | ||
transitional: false, | ||
transitionalProcessing: false, | ||
}), | ||
@@ -507,3 +517,3 @@ 'xn--x-xbb7i.de', | ||
uts46.toAscii('x\u0301\u0327.de', { | ||
transitional: true, | ||
transitionalProcessing: true, | ||
}), | ||
@@ -514,3 +524,3 @@ 'xn--x-xbb7i.de', | ||
uts46.toAscii('x\u0301\u0327.de', { | ||
transitional: false, | ||
transitionalProcessing: false, | ||
}), | ||
@@ -521,6 +531,11 @@ 'xn--x-xbb7i.de', | ||
// σόλος.gr | ||
assert.strict.equal(uts46.toUnicode('σόλος.gr'), 'σόλος.gr'); | ||
assert.strict.equal( | ||
uts46.toUnicode('σόλος.gr', { | ||
transitionalProcessing: false, | ||
}), | ||
'σόλος.gr', | ||
); | ||
assert.strict.equal( | ||
uts46.toAscii('σόλος.gr', { | ||
transitional: true, | ||
transitionalProcessing: true, | ||
}), | ||
@@ -531,3 +546,3 @@ 'xn--wxaikc6b.gr', | ||
uts46.toAscii('σόλος.gr', { | ||
transitional: false, | ||
transitionalProcessing: false, | ||
}), | ||
@@ -538,6 +553,11 @@ 'xn--wxaijb9b.gr', | ||
// Σόλος.gr | ||
assert.strict.equal(uts46.toUnicode('Σόλος.gr'), 'σόλος.gr'); | ||
assert.strict.equal( | ||
uts46.toUnicode('Σόλος.gr', { | ||
transitionalProcessing: false, | ||
}), | ||
'σόλος.gr', | ||
); | ||
assert.strict.equal( | ||
uts46.toAscii('Σόλος.gr', { | ||
transitional: true, | ||
transitionalProcessing: true, | ||
}), | ||
@@ -548,3 +568,3 @@ 'xn--wxaikc6b.gr', | ||
uts46.toAscii('Σόλος.gr', { | ||
transitional: false, | ||
transitionalProcessing: false, | ||
}), | ||
@@ -558,3 +578,3 @@ 'xn--wxaijb9b.gr', | ||
uts46.toAscii('ΣΌΛΟΣ.grﻋﺮﺑﻲ.de', { | ||
transitional: true, | ||
transitionalProcessing: true, | ||
}), | ||
@@ -565,3 +585,3 @@ 'xn--wxaikc6b.xn--gr-gtd9a1b0g.de', | ||
uts46.toAscii('ΣΌΛΟΣ.grﻋﺮﺑﻲ.de', { | ||
transitional: false, | ||
transitionalProcessing: false, | ||
}), | ||
@@ -575,3 +595,3 @@ 'xn--wxaikc6b.xn--gr-gtd9a1b0g.de', | ||
uts46.toAscii('عربي.de', { | ||
transitional: true, | ||
transitionalProcessing: true, | ||
}), | ||
@@ -582,3 +602,3 @@ 'xn--ngbrx4e.de', | ||
uts46.toAscii('عربي.de', { | ||
transitional: false, | ||
transitionalProcessing: false, | ||
}), | ||
@@ -592,3 +612,3 @@ 'xn--ngbrx4e.de', | ||
uts46.toAscii('نامهای.de', { | ||
transitional: true, | ||
transitionalProcessing: true, | ||
}), | ||
@@ -599,3 +619,3 @@ 'xn--mgba3gch31f.de', | ||
uts46.toAscii('نامهای.de', { | ||
transitional: false, | ||
transitionalProcessing: false, | ||
}), | ||
@@ -610,3 +630,3 @@ 'xn--mgba3gch31f.de', | ||
uts46.toAscii('نامه\u200Cای.de', { | ||
transitional: true, | ||
transitionalProcessing: true, | ||
}), | ||
@@ -617,3 +637,3 @@ 'xn--mgba3gch31f.de', | ||
uts46.toAscii('نامه\u200Cای.de', { | ||
transitional: false, | ||
transitionalProcessing: false, | ||
}), | ||
@@ -620,0 +640,0 @@ 'xn--mgba3gch31f060k.de', |
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is too big to display
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
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
No bug tracker
MaintenancePackage does not have a linked bug tracker in package.json.
Found 1 instance in 1 package
No repository
Supply chain riskPackage does not have a linked source code repository. Without this field, a package will have no reference to the location of the source code use to generate the package.
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
Filesystem access
Supply chain riskAccesses the file system, and could potentially read sensitive data.
Found 1 instance in 1 package
No bug tracker
MaintenancePackage does not have a linked bug tracker in package.json.
Found 1 instance in 1 package
No repository
Supply chain riskPackage does not have a linked source code repository. Without this field, a package will have no reference to the location of the source code use to generate the package.
Found 1 instance in 1 package
718098
19
3252
73
1
24
+ Addedtr46@^5.0.0
+ Addedtr46@5.0.0(transitive)
- Removedpunycode@^2.1.1