123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115 |
- "use strict";
- Object.defineProperty(exports, "__esModule", {
- value: true
- });
- exports.acceptLanguage = acceptLanguage;
- function parse(raw, preferences, options) {
- const lowers = new Map();
- const header = raw.replace(/[ \t]/g, "");
- if (preferences) {
- let pos = 0;
- for (const preference of preferences){
- const lower = preference.toLowerCase();
- lowers.set(lower, {
- orig: preference,
- pos: pos++
- });
- if (options.prefixMatch) {
- const parts = lower.split("-");
- while(parts.pop(), parts.length > 0){
- const joined = parts.join("-");
- if (!lowers.has(joined)) {
- lowers.set(joined, {
- orig: preference,
- pos: pos++
- });
- }
- }
- }
- }
- }
- const parts = header.split(",");
- const selections = [];
- const map = new Set();
- for(let i = 0; i < parts.length; ++i){
- const part = parts[i];
- if (!part) {
- continue;
- }
- const params = part.split(";");
- if (params.length > 2) {
- throw new Error(`Invalid ${options.type} header`);
- }
- let token = params[0].toLowerCase();
- if (!token) {
- throw new Error(`Invalid ${options.type} header`);
- }
- const selection = {
- token,
- pos: i,
- q: 1
- };
- if (preferences && lowers.has(token)) {
- selection.pref = lowers.get(token).pos;
- }
- map.add(selection.token);
- if (params.length === 2) {
- const q = params[1];
- const [key, value] = q.split("=");
- if (!value || key !== "q" && key !== "Q") {
- throw new Error(`Invalid ${options.type} header`);
- }
- const score = parseFloat(value);
- if (score === 0) {
- continue;
- }
- if (Number.isFinite(score) && score <= 1 && score >= 0.001) {
- selection.q = score;
- }
- }
- selections.push(selection);
- }
- selections.sort((a, b)=>{
- if (b.q !== a.q) {
- return b.q - a.q;
- }
- if (b.pref !== a.pref) {
- if (a.pref === undefined) {
- return 1;
- }
- if (b.pref === undefined) {
- return -1;
- }
- return a.pref - b.pref;
- }
- return a.pos - b.pos;
- });
- const values = selections.map((selection)=>selection.token);
- if (!preferences || !preferences.length) {
- return values;
- }
- const preferred = [];
- for (const selection1 of values){
- if (selection1 === "*") {
- for (const [preference, value] of lowers){
- if (!map.has(preference)) {
- preferred.push(value.orig);
- }
- }
- } else {
- const lower = selection1.toLowerCase();
- if (lowers.has(lower)) {
- preferred.push(lowers.get(lower).orig);
- }
- }
- }
- return preferred;
- }
- function acceptLanguage(header = "", preferences) {
- return parse(header, preferences, {
- type: "accept-language",
- prefixMatch: true
- })[0] || "";
- }
- //# sourceMappingURL=accept-header.js.map
|