bcp-47-match
Advanced tools
Comparing version 2.0.2 to 2.0.3
@@ -13,12 +13,36 @@ export function basicFilter( | ||
): string | undefined | ||
/** | ||
* BCP-47 tag. | ||
*/ | ||
export type Tag = string | ||
/** | ||
* List of BCP-47 tags. | ||
*/ | ||
export type Tags = Array<Tag> | ||
/** | ||
* RFC 4647 range. | ||
*/ | ||
export type Range = string | ||
/** | ||
* List of RFC 4647 range. | ||
*/ | ||
export type Ranges = Array<Range> | ||
/** | ||
* An internal check. | ||
*/ | ||
export type Check = (tag: Tag, range: Range) => boolean | ||
/** | ||
* Filter: yields all tags that match a range. | ||
*/ | ||
export type Filter = FilterOrLookup<true> | ||
/** | ||
* Lookup: yields the best tag that matches a range. | ||
*/ | ||
export type Lookup = FilterOrLookup<false> | ||
/** | ||
* A check. | ||
*/ | ||
export type FilterOrLookup<IsFilter extends boolean> = ( | ||
tags: Tag | Tags, | ||
ranges?: string | Ranges | undefined | ||
ranges?: Range | Ranges | undefined | ||
) => IsFilter extends true ? Tags : Tag | undefined |
56
index.js
/** | ||
* See <https://tools.ietf.org/html/rfc4647#section-3.1> | ||
* for more information on the algorithms. | ||
* for more info on the algorithms. | ||
*/ | ||
@@ -8,13 +8,23 @@ | ||
* @typedef {string} Tag | ||
* BCP-47 tag. | ||
* @typedef {Array<Tag>} Tags | ||
* List of BCP-47 tags. | ||
* @typedef {string} Range | ||
* RFC 4647 range. | ||
* @typedef {Array<Range>} Ranges | ||
* List of RFC 4647 range. | ||
* | ||
* @callback Check | ||
* An internal check. | ||
* @param {Tag} tag | ||
* BCP-47 tag. | ||
* @param {Range} range | ||
* RFC 4647 range. | ||
* @returns {boolean} | ||
* Whether the range matches the tag. | ||
* | ||
* @typedef {FilterOrLookup<true>} Filter | ||
* Filter: yields all tags that match a range. | ||
* @typedef {FilterOrLookup<false>} Lookup | ||
* Lookup: yields the best tag that matches a range. | ||
*/ | ||
@@ -24,6 +34,11 @@ | ||
* @template {boolean} IsFilter | ||
* Whether to filter or perform a lookup. | ||
* @callback FilterOrLookup | ||
* A check. | ||
* @param {Tag|Tags} tags | ||
* @param {Range|Ranges} [ranges='*'] | ||
* One or more BCP-47 tags. | ||
* @param {Range|Ranges|undefined} [ranges='*'] | ||
* One or more RFC 4647 ranges. | ||
* @returns {IsFilter extends true ? Tags : Tag|undefined} | ||
* Result. | ||
*/ | ||
@@ -33,2 +48,3 @@ | ||
* Factory to perform a filter or a lookup. | ||
* | ||
* This factory creates a function that accepts a list of tags and a list of | ||
@@ -38,11 +54,22 @@ * ranges, and contains logic to exit early for lookups. | ||
* This match function iterates over ranges, and for each range, | ||
* iterates over tags. That way, earlier ranges matching any tag have | ||
* precedence over later ranges. | ||
* iterates over tags. | ||
* That way, earlier ranges matching any tag have precedence over later ranges. | ||
* | ||
* @template {boolean} IsFilter | ||
* @param {Check} check | ||
* A check. | ||
* @param {IsFilter} filter | ||
* Whether to filter or perform a lookup. | ||
* @returns {FilterOrLookup<IsFilter>} | ||
* Filter or lookup. | ||
*/ | ||
function factory(check, filter) { | ||
/** | ||
* @param {Tag|Tags} tags | ||
* One or more BCP-47 tags. | ||
* @param {Range|Ranges|undefined} [ranges='*'] | ||
* One or more RFC 4647 ranges. | ||
* @returns {IsFilter extends true ? Tags : Tag|undefined} | ||
* Result. | ||
*/ | ||
return function (tags, ranges) { | ||
@@ -97,2 +124,9 @@ let left = cast(tags, 'tag') | ||
* of basic language ranges (Section 2.1) to sets of language tags. | ||
* | ||
* @param {Tag|Tags} tags | ||
* One or more BCP-47 tags. | ||
* @param {Range|Ranges|undefined} [ranges='*'] | ||
* One or more RFC 4647 ranges. | ||
* @returns {Tags} | ||
* List of BCP-47 tags. | ||
*/ | ||
@@ -107,2 +141,9 @@ export const basicFilter = factory(function (tag, range) { | ||
* tags. | ||
* | ||
* @param {Tag|Tags} tags | ||
* One or more BCP-47 tags. | ||
* @param {Range|Ranges|undefined} [ranges='*'] | ||
* One or more RFC 4647 ranges. | ||
* @returns {Tags} | ||
* List of BCP-47 tags. | ||
*/ | ||
@@ -157,2 +198,9 @@ export const extendedFilter = factory(function (tag, range) { | ||
* that best matches the range. | ||
* | ||
* @param {Tag|Tags} tags | ||
* One or more BCP-47 tags. | ||
* @param {Range|Ranges|undefined} [ranges='*'] | ||
* One or more RFC 4647 ranges. | ||
* @returns {Tag|undefined} | ||
* BCP-47 tag. | ||
*/ | ||
@@ -159,0 +207,0 @@ export const lookup = factory(function (tag, range) { |
{ | ||
"name": "bcp-47-match", | ||
"version": "2.0.2", | ||
"version": "2.0.3", | ||
"description": "Match BCP 47 language tags with language ranges per RFC 4647", | ||
@@ -38,20 +38,18 @@ "license": "MIT", | ||
"devDependencies": { | ||
"@types/tape": "^4.0.0", | ||
"@types/node": "^18.0.0", | ||
"c8": "^7.0.0", | ||
"chalk": "^5.0.0", | ||
"prettier": "^2.0.0", | ||
"remark-cli": "^10.0.0", | ||
"remark-cli": "^11.0.0", | ||
"remark-preset-wooorm": "^9.0.0", | ||
"rimraf": "^3.0.0", | ||
"tape": "^5.0.0", | ||
"type-coverage": "^2.0.0", | ||
"typescript": "^4.0.0", | ||
"xo": "^0.48.0" | ||
"xo": "^0.52.0" | ||
}, | ||
"scripts": { | ||
"prepublishOnly": "npm run build && npm run format", | ||
"build": "rimraf \"*.d.ts\" && tsc && type-coverage", | ||
"prepack": "npm run build && npm run format", | ||
"build": "tsc --build --clean && tsc --build && type-coverage", | ||
"format": "remark . -qfo && prettier . -w --loglevel warn && xo --fix", | ||
"test-api": "node --conditions development test.js", | ||
"test-coverage": "c8 --check-coverage --branches 100 --functions 100 --lines 100 --statements 100 --reporter lcov npm run test-api", | ||
"test-coverage": "c8 --check-coverage --100 --reporter lcov npm run test-api", | ||
"test": "npm run build && npm run format && npm run test-coverage" | ||
@@ -58,0 +56,0 @@ }, |
@@ -44,3 +44,3 @@ <!--lint disable no-html--> | ||
This package is [ESM only][esm]. | ||
In Node.js (version 12.20+, 14.14+, or 16.0+), install with [npm][]: | ||
In Node.js (version 14.14+, 16.0+), install with [npm][]: | ||
@@ -70,3 +70,3 @@ ```sh | ||
var tags = ['en-GB', 'de-CH', 'en', 'de'] | ||
const tags = ['en-GB', 'de-CH', 'en', 'de'] | ||
@@ -95,4 +95,4 @@ console.log(basicFilter(tags, '*')) // => [ 'en-GB', 'de-CH', 'en', 'de' ] | ||
This package exports the following identifiers: `basicFilter`, `extendedFilter`, | ||
and `lookup`. | ||
This package exports the identifier `basicFilter`, `extendedFilter`, and | ||
`lookup`. | ||
There is no default export. | ||
@@ -138,3 +138,3 @@ | ||
— list of BCP 47 tags | ||
* `ranges` (`string` or `Array<string>`) | ||
* `ranges` (`string` or `Array<string>`, default: `'*'`) | ||
— list of RFC 4647 | ||
@@ -186,3 +186,3 @@ [basic ranges][basic-range] | ||
— list of BCP 47 tags | ||
* `ranges` (`string` or `Array<string>`) | ||
* `ranges` (`string` or `Array<string>`, default: `'*'`) | ||
— list of RFC 4647 [extended ranges][extended-range] | ||
@@ -244,2 +244,3 @@ (aka, matching `/^(\*|[a-z]{1,8})(-(\*|[a-z0-9]{1,8}))*$/i`) | ||
This package is fully typed with [TypeScript][]. | ||
It exports no additional types. | ||
@@ -249,3 +250,3 @@ ## Compatibility | ||
This package is at least compatible with all maintained versions of Node.js. | ||
As of now, that is Node.js 12.20+, 14.14+, and 16.0+. | ||
As of now, that is Node.js 14.14+ and 16.0+. | ||
It also works in Deno and modern browsers. | ||
@@ -252,0 +253,0 @@ |
19524
9
252
316