Files
klz-cables.com/.pnpm-store/v10/files/72/82452f7d2d67ce74a3fbb7a6099df8034dd8f62a431cddfb4be5acb19bc4eaf10cc5f4a1177e331bf99422a1f0fbe4ff80ded06011775c99f76f8a6b95a6e3
Marc Mintel 5397309103
Some checks failed
Build & Deploy / 🔍 Prepare (push) Successful in 20s
Build & Deploy / 🧪 QA (push) Failing after 34s
Build & Deploy / 🏗️ Build (push) Has started running
Build & Deploy / 🚀 Deploy (push) Has been cancelled
Build & Deploy / 🧪 Smoke Test (push) Has been cancelled
Build & Deploy / ⚡ Lighthouse (push) Has been cancelled
Build & Deploy / 🔔 Notify (push) Has been cancelled
fix(products): fix breadcrumbs and product filtering (backport from main)
2026-02-24 16:04:21 +01:00

119 lines
3.3 KiB
Plaintext

/**
* https://unicode.org/reports/tr35/tr35-dates.html#Date_Field_Symbol_Table
* Credit: https://github.com/caridy/intl-datetimeformat-pattern/blob/master/index.js
* with some tweaks
*/
const DATE_TIME_REGEX = /(?:[Eec]{1,6}|G{1,5}|[Qq]{1,5}|(?:[yYur]+|U{1,5})|[ML]{1,5}|d{1,2}|D{1,3}|F{1}|[abB]{1,5}|[hkHK]{1,2}|w{1,2}|W{1}|m{1,2}|s{1,2}|[zZOvVxX]{1,4})(?=([^']*'[^']*')*[^']*$)/g;
/**
* Parse Date time skeleton into Intl.DateTimeFormatOptions
* Ref: https://unicode.org/reports/tr35/tr35-dates.html#Date_Field_Symbol_Table
* @public
* @param skeleton skeleton string
*/
export function parseDateTimeSkeleton(skeleton) {
const result = {};
skeleton.replace(DATE_TIME_REGEX, (match) => {
const len = match.length;
switch (match[0]) {
case "G":
result.era = len === 4 ? "long" : len === 5 ? "narrow" : "short";
break;
case "y":
result.year = len === 2 ? "2-digit" : "numeric";
break;
case "Y":
case "u":
case "U":
case "r": throw new RangeError("`Y/u/U/r` (year) patterns are not supported, use `y` instead");
case "q":
case "Q": throw new RangeError("`q/Q` (quarter) patterns are not supported");
case "M":
case "L":
result.month = [
"numeric",
"2-digit",
"short",
"long",
"narrow"
][len - 1];
break;
case "w":
case "W": throw new RangeError("`w/W` (week) patterns are not supported");
case "d":
result.day = ["numeric", "2-digit"][len - 1];
break;
case "D":
case "F":
case "g": throw new RangeError("`D/F/g` (day) patterns are not supported, use `d` instead");
case "E":
result.weekday = len === 4 ? "long" : len === 5 ? "narrow" : "short";
break;
case "e":
if (len < 4) {
throw new RangeError("`e..eee` (weekday) patterns are not supported");
}
result.weekday = [
"short",
"long",
"narrow",
"short"
][len - 4];
break;
case "c":
if (len < 4) {
throw new RangeError("`c..ccc` (weekday) patterns are not supported");
}
result.weekday = [
"short",
"long",
"narrow",
"short"
][len - 4];
break;
case "a":
result.hour12 = true;
break;
case "b":
case "B": throw new RangeError("`b/B` (period) patterns are not supported, use `a` instead");
case "h":
result.hourCycle = "h12";
result.hour = ["numeric", "2-digit"][len - 1];
break;
case "H":
result.hourCycle = "h23";
result.hour = ["numeric", "2-digit"][len - 1];
break;
case "K":
result.hourCycle = "h11";
result.hour = ["numeric", "2-digit"][len - 1];
break;
case "k":
result.hourCycle = "h24";
result.hour = ["numeric", "2-digit"][len - 1];
break;
case "j":
case "J":
case "C": throw new RangeError("`j/J/C` (hour) patterns are not supported, use `h/H/K/k` instead");
case "m":
result.minute = ["numeric", "2-digit"][len - 1];
break;
case "s":
result.second = ["numeric", "2-digit"][len - 1];
break;
case "S":
case "A": throw new RangeError("`S/A` (second) patterns are not supported, use `s` instead");
case "z":
result.timeZoneName = len < 4 ? "short" : "long";
break;
case "Z":
case "O":
case "v":
case "V":
case "X":
case "x": throw new RangeError("`Z/O/v/V/X/x` (timeZone) patterns are not supported, use `z` instead");
}
return "";
});
return result;
}