rrule-temporal
Version:
Recurrence rule (rrule) processing using Temporal PlainDate/PlainDateTime, with cross-timezone and cross-calendar rrule support
597 lines (595 loc) • 22.6 kB
JavaScript
import {
RRuleTemporal
} from "./chunk-PDW5N23H.js";
// src/totext.ts
var en = {
weekdayNames: ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"],
monthNames: [
"January",
"February",
"March",
"April",
"May",
"June",
"July",
"August",
"September",
"October",
"November",
"December"
],
units: {
year: { singular: "year", plural: "years" },
month: { singular: "month", plural: "months" },
week: { singular: "week", plural: "weeks" },
day: { singular: "day", plural: "days" },
hour: { singular: "hour", plural: "hours" },
minute: { singular: "minute", plural: "minutes" },
second: { singular: "second", plural: "seconds" }
},
words: {
every: "every",
weekday: "weekday",
on: "on",
in: "in",
on_the: "on the",
day_of_month: "day of the month",
day_of_year: "day of the year",
in_week: "in week",
at: "at",
at_minute: "at minute",
at_second: "at second",
until: "until",
for: "for",
time: "time",
times: "times",
instance: "instance",
week_starts_on: "week starts on",
with: "with",
additional_date: "additional date",
additional_dates: "additional dates",
excluding: "excluding",
date: "date",
dates: "dates",
and: "and",
last: "last"
},
ordinal: (n) => {
const abs = Math.abs(n);
const suffix = abs % 10 === 1 && abs % 100 !== 11 ? "st" : abs % 10 === 2 && abs % 100 !== 12 ? "nd" : abs % 10 === 3 && abs % 100 !== 13 ? "rd" : "th";
return n < 0 ? `last` : `${abs}${suffix}`;
}
};
var es = {
weekdayNames: ["lunes", "martes", "mi\xE9rcoles", "jueves", "viernes", "s\xE1bado", "domingo"],
monthNames: [
"enero",
"febrero",
"marzo",
"abril",
"mayo",
"junio",
"julio",
"agosto",
"septiembre",
"octubre",
"noviembre",
"diciembre"
],
units: {
year: { singular: "a\xF1o", plural: "a\xF1os" },
month: { singular: "mes", plural: "meses" },
week: { singular: "semana", plural: "semanas" },
day: { singular: "d\xEDa", plural: "d\xEDas" },
hour: { singular: "hora", plural: "horas" },
minute: { singular: "minuto", plural: "minutos" },
second: { singular: "segundo", plural: "segundos" }
},
words: {
every: "cada",
weekday: "d\xEDa de la semana",
on: "en",
in: "en",
on_the: "el",
day_of_month: "d\xEDa del mes",
day_of_year: "d\xEDa del a\xF1o",
in_week: "en la semana",
at: "a las",
at_minute: "en el minuto",
at_second: "en el segundo",
until: "hasta",
for: "durante",
time: "vez",
times: "veces",
instance: "ocasi\xF3n",
week_starts_on: "la semana comienza el",
with: "con",
additional_date: "fecha adicional",
additional_dates: "fechas adicionales",
excluding: "excluyendo",
date: "fecha",
dates: "fechas",
and: "y",
last: "\xFAltimo"
},
ordinal: (n) => n < 0 ? "\xFAltimo" : `${Math.abs(n)}\xBA`
};
var hi = {
weekdayNames: ["\u0938\u094B\u092E\u0935\u093E\u0930", "\u092E\u0902\u0917\u0932\u0935\u093E\u0930", "\u092C\u0941\u0927\u0935\u093E\u0930", "\u0917\u0941\u0930\u0941\u0935\u093E\u0930", "\u0936\u0941\u0915\u094D\u0930\u0935\u093E\u0930", "\u0936\u0928\u093F\u0935\u093E\u0930", "\u0930\u0935\u093F\u0935\u093E\u0930"],
monthNames: [
"\u091C\u0928\u0935\u0930\u0940",
"\u092B\u0930\u0935\u0930\u0940",
"\u092E\u093E\u0930\u094D\u091A",
"\u0905\u092A\u094D\u0930\u0948\u0932",
"\u092E\u0908",
"\u091C\u0942\u0928",
"\u091C\u0941\u0932\u093E\u0908",
"\u0905\u0917\u0938\u094D\u0924",
"\u0938\u093F\u0924\u0902\u092C\u0930",
"\u0905\u0915\u094D\u091F\u0942\u092C\u0930",
"\u0928\u0935\u0902\u092C\u0930",
"\u0926\u093F\u0938\u0902\u092C\u0930"
],
units: {
year: { singular: "\u0938\u093E\u0932", plural: "\u0938\u093E\u0932" },
month: { singular: "\u092E\u0939\u0940\u0928\u093E", plural: "\u092E\u0939\u0940\u0928\u0947" },
week: { singular: "\u0938\u092A\u094D\u0924\u093E\u0939", plural: "\u0938\u092A\u094D\u0924\u093E\u0939" },
day: { singular: "\u0926\u093F\u0928", plural: "\u0926\u093F\u0928" },
hour: { singular: "\u0918\u0902\u091F\u093E", plural: "\u0918\u0902\u091F\u0947" },
minute: { singular: "\u092E\u093F\u0928\u091F", plural: "\u092E\u093F\u0928\u091F" },
second: { singular: "\u0938\u0947\u0915\u0902\u0921", plural: "\u0938\u0947\u0915\u0902\u0921" }
},
words: {
every: "\u0939\u0930",
weekday: "\u0938\u092A\u094D\u0924\u093E\u0939 \u0915\u093E \u0926\u093F\u0928",
on: "\u0915\u094B",
in: "\u092E\u0947\u0902",
on_the: "\u0915\u094B",
day_of_month: "\u092E\u0939\u0940\u0928\u0947 \u0915\u093E \u0926\u093F\u0928",
day_of_year: "\u0938\u093E\u0932 \u0915\u093E \u0926\u093F\u0928",
in_week: "\u0938\u092A\u094D\u0924\u093E\u0939",
at: "\u092A\u0930",
at_minute: "\u092E\u093F\u0928\u091F \u092A\u0930",
at_second: "\u0938\u0947\u0915\u0902\u0921 \u092A\u0930",
until: "\u0924\u0915",
for: "\u0915\u0947 \u0932\u093F\u090F",
time: "\u092C\u093E\u0930",
times: "\u092C\u093E\u0930",
instance: "\u092C\u093E\u0930",
week_starts_on: "\u0938\u092A\u094D\u0924\u093E\u0939 \u0936\u0941\u0930\u0942 \u0939\u094B\u0924\u093E \u0939\u0948",
with: "\u0938\u093E\u0925",
additional_date: "\u0905\u0924\u093F\u0930\u093F\u0915\u094D\u0924 \u0924\u093E\u0930\u0940\u0916",
additional_dates: "\u0905\u0924\u093F\u0930\u093F\u0915\u094D\u0924 \u0924\u093E\u0930\u0940\u0916\u0947\u0902",
excluding: "\u0915\u094B \u091B\u094B\u0921\u093C\u0915\u0930",
date: "\u0924\u093E\u0930\u0940\u0916",
dates: "\u0924\u093E\u0930\u0940\u0916\u0947\u0902",
and: "\u0914\u0930",
last: "\u0906\u0916\u093F\u0930\u0940"
},
ordinal: (n) => n < 0 ? "\u0906\u0916\u093F\u0930\u0940" : `${Math.abs(n)}\u0935\u093E\u0902`
};
var yue = {
weekdayNames: ["\u661F\u671F\u4E00", "\u661F\u671F\u4E8C", "\u661F\u671F\u4E09", "\u661F\u671F\u56DB", "\u661F\u671F\u4E94", "\u661F\u671F\u516D", "\u661F\u671F\u65E5"],
monthNames: ["\u4E00\u6708", "\u4E8C\u6708", "\u4E09\u6708", "\u56DB\u6708", "\u4E94\u6708", "\u516D\u6708", "\u4E03\u6708", "\u516B\u6708", "\u4E5D\u6708", "\u5341\u6708", "\u5341\u4E00\u6708", "\u5341\u4E8C\u6708"],
units: {
year: { singular: "\u5E74", plural: "\u5E74" },
month: { singular: "\u6708", plural: "\u6708" },
week: { singular: "\u9031", plural: "\u9031" },
day: { singular: "\u65E5", plural: "\u65E5" },
hour: { singular: "\u5C0F\u6642", plural: "\u5C0F\u6642" },
minute: { singular: "\u5206\u9418", plural: "\u5206\u9418" },
second: { singular: "\u79D2", plural: "\u79D2" }
},
words: {
every: "\u6BCF",
weekday: "\u5E73\u65E5",
on: "\u5728",
in: "\u65BC",
on_the: "\u5728",
day_of_month: "\u6708\u7684\u65E5\u5B50",
day_of_year: "\u5E74\u7684\u65E5\u5B50",
in_week: "\u7B2C",
at: "\u5728",
at_minute: "\u5728\u7B2C",
at_second: "\u5728\u7B2C",
until: "\u76F4\u5230",
for: "\u5171",
time: "\u6B21",
times: "\u6B21",
instance: "\u6B21",
week_starts_on: "\u661F\u671F\u958B\u59CB\u65BC",
with: "\u5E36\u6709",
additional_date: "\u984D\u5916\u65E5\u671F",
additional_dates: "\u984D\u5916\u65E5\u671F",
excluding: "\u6392\u9664",
date: "\u65E5\u671F",
dates: "\u65E5\u671F",
and: "\u548C",
last: "\u6700\u5F8C"
},
ordinal: (n) => n < 0 ? "\u6700\u5F8C" : `\u7B2C${Math.abs(n)}`
};
var ar = {
weekdayNames: ["\u0627\u0644\u0627\u062B\u0646\u064A\u0646", "\u0627\u0644\u062B\u0644\u0627\u062B\u0627\u0621", "\u0627\u0644\u0623\u0631\u0628\u0639\u0627\u0621", "\u0627\u0644\u062E\u0645\u064A\u0633", "\u0627\u0644\u062C\u0645\u0639\u0629", "\u0627\u0644\u0633\u0628\u062A", "\u0627\u0644\u0623\u062D\u062F"],
monthNames: [
"\u064A\u0646\u0627\u064A\u0631",
"\u0641\u0628\u0631\u0627\u064A\u0631",
"\u0645\u0627\u0631\u0633",
"\u0623\u0628\u0631\u064A\u0644",
"\u0645\u0627\u064A\u0648",
"\u064A\u0648\u0646\u064A\u0648",
"\u064A\u0648\u0644\u064A\u0648",
"\u0623\u063A\u0633\u0637\u0633",
"\u0633\u0628\u062A\u0645\u0628\u0631",
"\u0623\u0643\u062A\u0648\u0628\u0631",
"\u0646\u0648\u0641\u0645\u0628\u0631",
"\u062F\u064A\u0633\u0645\u0628\u0631"
],
units: {
year: { singular: "\u0633\u0646\u0629", plural: "\u0633\u0646\u0648\u0627\u062A" },
month: { singular: "\u0634\u0647\u0631", plural: "\u0623\u0634\u0647\u0631" },
week: { singular: "\u0623\u0633\u0628\u0648\u0639", plural: "\u0623\u0633\u0627\u0628\u064A\u0639" },
day: { singular: "\u064A\u0648\u0645", plural: "\u0623\u064A\u0627\u0645" },
hour: { singular: "\u0633\u0627\u0639\u0629", plural: "\u0633\u0627\u0639\u0627\u062A" },
minute: { singular: "\u062F\u0642\u064A\u0642\u0629", plural: "\u062F\u0642\u0627\u0626\u0642" },
second: { singular: "\u062B\u0627\u0646\u064A\u0629", plural: "\u062B\u0648\u0627\u0646\u064A" }
},
words: {
every: "\u0643\u0644",
weekday: "\u064A\u0648\u0645 \u0645\u0646 \u0623\u064A\u0627\u0645 \u0627\u0644\u0623\u0633\u0628\u0648\u0639",
on: "\u0641\u064A",
in: "\u0641\u064A",
on_the: "\u0641\u064A \u0627\u0644\u0640",
day_of_month: "\u064A\u0648\u0645 \u0645\u0646 \u0627\u0644\u0634\u0647\u0631",
day_of_year: "\u064A\u0648\u0645 \u0645\u0646 \u0627\u0644\u0633\u0646\u0629",
in_week: "\u0641\u064A \u0627\u0644\u0623\u0633\u0628\u0648\u0639",
at: "\u0639\u0646\u062F",
at_minute: "\u0641\u064A \u0627\u0644\u062F\u0642\u064A\u0642\u0629",
at_second: "\u0641\u064A \u0627\u0644\u062B\u0627\u0646\u064A\u0629",
until: "\u062D\u062A\u0649",
for: "\u0644\u0645\u062F\u0629",
time: "\u0645\u0631\u0629",
times: "\u0645\u0631\u0627\u062A",
instance: "\u0645\u0631\u0629",
week_starts_on: "\u064A\u0628\u062F\u0623 \u0627\u0644\u0623\u0633\u0628\u0648\u0639 \u064A\u0648\u0645",
with: "\u0645\u0639",
additional_date: "\u062A\u0627\u0631\u064A\u062E \u0625\u0636\u0627\u0641\u064A",
additional_dates: "\u062A\u0648\u0627\u0631\u064A\u062E \u0625\u0636\u0627\u0641\u064A\u0629",
excluding: "\u0628\u0627\u0633\u062A\u062B\u0646\u0627\u0621",
date: "\u062A\u0627\u0631\u064A\u062E",
dates: "\u062A\u0648\u0627\u0631\u064A\u062E",
and: "\u0648",
last: "\u0627\u0644\u0623\u062E\u064A\u0631"
},
ordinal: (n) => {
if (n < 0) return "\u0627\u0644\u0623\u062E\u064A\u0631";
const abs = Math.abs(n);
const map = {
1: "\u0627\u0644\u0623\u0648\u0644",
2: "\u0627\u0644\u062B\u0627\u0646\u064A",
3: "\u0627\u0644\u062B\u0627\u0644\u062B",
4: "\u0627\u0644\u0631\u0627\u0628\u0639",
5: "\u0627\u0644\u062E\u0627\u0645\u0633",
6: "\u0627\u0644\u0633\u0627\u062F\u0633",
7: "\u0627\u0644\u0633\u0627\u0628\u0639",
8: "\u0627\u0644\u062B\u0627\u0645\u0646",
9: "\u0627\u0644\u062A\u0627\u0633\u0639",
10: "\u0627\u0644\u0639\u0627\u0634\u0631",
11: "\u0627\u0644\u062D\u0627\u062F\u064A \u0639\u0634\u0631",
12: "\u0627\u0644\u062B\u0627\u0646\u064A \u0639\u0634\u0631",
13: "\u0627\u0644\u062B\u0627\u0644\u062B \u0639\u0634\u0631"
};
return map[abs] || abs.toString();
}
};
var he = {
weekdayNames: ["\u05D9\u05D5\u05DD \u05E9\u05E0\u05D9", "\u05D9\u05D5\u05DD \u05E9\u05DC\u05D9\u05E9\u05D9", "\u05D9\u05D5\u05DD \u05E8\u05D1\u05D9\u05E2\u05D9", "\u05D9\u05D5\u05DD \u05D7\u05DE\u05D9\u05E9\u05D9", "\u05D9\u05D5\u05DD \u05E9\u05D9\u05E9\u05D9", "\u05D9\u05D5\u05DD \u05E9\u05D1\u05EA", "\u05D9\u05D5\u05DD \u05E8\u05D0\u05E9\u05D5\u05DF"],
monthNames: [
"\u05D9\u05E0\u05D5\u05D0\u05E8",
"\u05E4\u05D1\u05E8\u05D5\u05D0\u05E8",
"\u05DE\u05E8\u05E5",
"\u05D0\u05E4\u05E8\u05D9\u05DC",
"\u05DE\u05D0\u05D9",
"\u05D9\u05D5\u05E0\u05D9",
"\u05D9\u05D5\u05DC\u05D9",
"\u05D0\u05D5\u05D2\u05D5\u05E1\u05D8",
"\u05E1\u05E4\u05D8\u05DE\u05D1\u05E8",
"\u05D0\u05D5\u05E7\u05D8\u05D5\u05D1\u05E8",
"\u05E0\u05D5\u05D1\u05DE\u05D1\u05E8",
"\u05D3\u05E6\u05DE\u05D1\u05E8"
],
units: {
year: { singular: "\u05E9\u05E0\u05D4", plural: "\u05E9\u05E0\u05D9\u05DD" },
month: { singular: "\u05D7\u05D5\u05D3\u05E9", plural: "\u05D7\u05D5\u05D3\u05E9\u05D9\u05DD" },
week: { singular: "\u05E9\u05D1\u05D5\u05E2", plural: "\u05E9\u05D1\u05D5\u05E2\u05D5\u05EA" },
day: { singular: "\u05D9\u05D5\u05DD", plural: "\u05D9\u05DE\u05D9\u05DD" },
hour: { singular: "\u05E9\u05E2\u05D4", plural: "\u05E9\u05E2\u05D5\u05EA" },
minute: { singular: "\u05D3\u05E7\u05D4", plural: "\u05D3\u05E7\u05D5\u05EA" },
second: { singular: "\u05E9\u05E0\u05D9\u05D4", plural: "\u05E9\u05E0\u05D9\u05D5\u05EA" }
},
words: {
every: "\u05DB\u05DC",
weekday: "\u05D9\u05D5\u05DD \u05D7\u05D5\u05DC",
on: "\u05D1",
in: "\u05D1",
on_the: "\u05D1",
day_of_month: "\u05D9\u05D5\u05DD \u05D1\u05D7\u05D5\u05D3\u05E9",
day_of_year: "\u05D9\u05D5\u05DD \u05D1\u05E9\u05E0\u05D4",
in_week: "\u05D1\u05E9\u05D1\u05D5\u05E2",
at: "\u05D1\u05E9\u05E2\u05D4",
at_minute: "\u05D1\u05D3\u05E7\u05D4",
at_second: "\u05D1\u05E9\u05E0\u05D9\u05D4",
until: "\u05E2\u05D3",
for: "\u05D1\u05DE\u05E9\u05DA",
time: "\u05E4\u05E2\u05DD",
times: "\u05E4\u05E2\u05DE\u05D9\u05DD",
instance: "\u05E4\u05E2\u05DD",
week_starts_on: "\u05E9\u05D1\u05D5\u05E2 \u05DE\u05EA\u05D7\u05D9\u05DC \u05D1",
with: "\u05E2\u05DD",
additional_date: "\u05EA\u05D0\u05E8\u05D9\u05DA \u05E0\u05D5\u05E1\u05E3",
additional_dates: "\u05EA\u05D0\u05E8\u05D9\u05DB\u05D9\u05DD \u05E0\u05D5\u05E1\u05E4\u05D9\u05DD",
excluding: "\u05DC\u05DE\u05E2\u05D8",
date: "\u05EA\u05D0\u05E8\u05D9\u05DA",
dates: "\u05EA\u05D0\u05E8\u05D9\u05DB\u05D9\u05DD",
and: "\u05D5",
last: "\u05D0\u05D7\u05E8\u05D5\u05DF"
},
ordinal: (n) => {
if (n < 0) return "\u05D0\u05D7\u05E8\u05D5\u05DF";
const abs = Math.abs(n);
const map = {
1: "\u05E8\u05D0\u05E9\u05D5\u05DF",
2: "\u05E9\u05E0\u05D9",
3: "\u05E9\u05DC\u05D9\u05E9\u05D9",
4: "\u05E8\u05D1\u05D9\u05E2\u05D9",
5: "\u05D7\u05DE\u05D9\u05E9\u05D9",
6: "\u05E9\u05D9\u05E9\u05D9",
7: "\u05E9\u05D1\u05D9\u05E2\u05D9",
8: "\u05E9\u05DE\u05D9\u05E0\u05D9",
9: "\u05EA\u05E9\u05D9\u05E2\u05D9",
10: "\u05E2\u05E9\u05D9\u05E8\u05D9",
11: "\u05D0\u05D7\u05D3 \u05E2\u05E9\u05E8",
12: "\u05E9\u05E0\u05D9\u05DD \u05E2\u05E9\u05E8",
13: "\u05E9\u05DC\u05D5\u05E9\u05D4 \u05E2\u05E9\u05E8"
};
return map[abs] || abs.toString();
}
};
var zh = {
weekdayNames: ["\u661F\u671F\u4E00", "\u661F\u671F\u4E8C", "\u661F\u671F\u4E09", "\u661F\u671F\u56DB", "\u661F\u671F\u4E94", "\u661F\u671F\u516D", "\u661F\u671F\u65E5"],
monthNames: ["\u4E00\u6708", "\u4E8C\u6708", "\u4E09\u6708", "\u56DB\u6708", "\u4E94\u6708", "\u516D\u6708", "\u4E03\u6708", "\u516B\u6708", "\u4E5D\u6708", "\u5341\u6708", "\u5341\u4E00\u6708", "\u5341\u4E8C\u6708"],
units: {
year: { singular: "\u5E74", plural: "\u5E74" },
month: { singular: "\u6708", plural: "\u6708" },
week: { singular: "\u5468", plural: "\u5468" },
day: { singular: "\u65E5", plural: "\u65E5" },
hour: { singular: "\u5C0F\u65F6", plural: "\u5C0F\u65F6" },
minute: { singular: "\u5206\u949F", plural: "\u5206\u949F" },
second: { singular: "\u79D2", plural: "\u79D2" }
},
words: {
every: "\u6BCF",
weekday: "\u5DE5\u4F5C\u65E5",
on: "\u5728",
in: "\u5728",
on_the: "\u5728",
day_of_month: "\u6708\u7684\u65E5\u5B50",
day_of_year: "\u5E74\u7684\u65E5\u5B50",
in_week: "\u7B2C",
at: "\u5728",
at_minute: "\u5728\u7B2C",
at_second: "\u5728\u7B2C",
until: "\u76F4\u5230",
for: "\u5171",
time: "\u6B21",
times: "\u6B21",
instance: "\u6B21",
week_starts_on: "\u661F\u671F\u5F00\u59CB\u4E8E",
with: "\u5E26\u6709",
additional_date: "\u989D\u5916\u65E5\u671F",
additional_dates: "\u989D\u5916\u65E5\u671F",
excluding: "\u6392\u9664",
date: "\u65E5\u671F",
dates: "\u65E5\u671F",
and: "\u548C",
last: "\u6700\u540E"
},
ordinal: (n) => n < 0 ? "\u6700\u540E" : `\u7B2C${Math.abs(n)}`
};
var ALL_LOCALES = { en, es, hi, yue, ar, he, zh };
var env = typeof process !== "undefined" && process.env ? process.env.TOTEXT_LANGS : void 0;
var active = env ? env.split(",").map((s) => s.trim()).filter(Boolean) : Object.keys(ALL_LOCALES);
var LOCALES = {};
for (const l of active) {
if (ALL_LOCALES[l]) LOCALES[l] = ALL_LOCALES[l];
}
function defaultOrdinal(n) {
const abs = Math.abs(n);
const suffix = abs % 10 === 1 && abs % 100 !== 11 ? "st" : abs % 10 === 2 && abs % 100 !== 12 ? "nd" : abs % 10 === 3 && abs % 100 !== 13 ? "rd" : "th";
return n < 0 ? `last` : `${abs}${suffix}`;
}
function ordinal(n, locale) {
return locale.ordinal ? locale.ordinal(n) : defaultOrdinal(n);
}
function list(arr, mapFn = (x) => `${x}`, final) {
const mapped = arr.map(mapFn);
if (mapped.length === 1) return mapped[0];
return mapped.slice(0, -1).join(", ") + ` ${final} ` + mapped[mapped.length - 1];
}
function formatByDayToken(tok, locale) {
if (typeof tok === "number") return tok.toString();
const m = tok.match(/^([+-]?\d+)?(MO|TU|WE|TH|FR|SA|SU)$/);
if (!m) return tok;
const ord = m[1] ? parseInt(m[1], 10) : 0;
const weekdayMap = {
MO: 0,
TU: 1,
WE: 2,
TH: 3,
FR: 4,
SA: 5,
SU: 6
};
const idx = weekdayMap[m[2]];
const name = locale.weekdayNames[idx];
if (ord === 0) return name;
if (ord === -1) return `${locale.words.last} ${name}`;
return `${ordinal(ord, locale)} ${name}`;
}
function formatTime(hour, minute = 0, second = 0) {
const hr12 = (hour + 11) % 12 + 1;
const ampm = hour < 12 ? "AM" : "PM";
const mm = String(minute).padStart(2, "0");
const ss = String(second).padStart(2, "0");
if (second) {
return `${hr12}:${mm}:${ss} ${ampm}`;
}
if (minute) {
return `${hr12}:${mm} ${ampm}`;
}
return `${hr12} ${ampm}`;
}
function tzAbbreviation(zdt) {
const parts = new Intl.DateTimeFormat("en-US", {
timeZone: zdt.timeZoneId,
timeZoneName: "short",
hour: "numeric"
}).formatToParts(new Date(zdt.epochMilliseconds));
const tzPart = parts.find((p) => p.type === "timeZoneName");
return (tzPart == null ? void 0 : tzPart.value) || zdt.timeZoneId;
}
function toText(input, locale) {
const rule = typeof input === "string" ? new RRuleTemporal({ rruleString: input }) : input;
const opts = rule.options();
const lang = (locale != null ? locale : Intl.DateTimeFormat().resolvedOptions().locale).split("-")[0];
const data = LOCALES[lang] || en;
const {
freq,
interval = 1,
count,
until,
byDay,
byHour,
byMinute,
bySecond,
byMonth,
byMonthDay,
byYearDay,
byWeekNo,
bySetPos,
wkst,
rDate,
exDate
} = opts;
const parts = [data.words.every];
const baseKey = {
YEARLY: "year",
MONTHLY: "month",
WEEKLY: "week",
DAILY: "day",
HOURLY: "hour",
MINUTELY: "minute",
SECONDLY: "second"
}[freq];
const base = data.units[baseKey];
const daysNormalized = byDay == null ? void 0 : byDay.map((d) => d.toUpperCase());
const isWeekdays = daysNormalized && daysNormalized.length === 5 && ["MO", "TU", "WE", "TH", "FR"].every((d) => daysNormalized.includes(d));
const isEveryday = daysNormalized && daysNormalized.length === 7 && ["MO", "TU", "WE", "TH", "FR", "SA", "SU"].every((d) => daysNormalized.includes(d));
if (freq === "WEEKLY" && interval === 1 && isWeekdays) {
parts.push(data.words.weekday);
} else if (freq === "WEEKLY" && interval === 1 && isEveryday) {
parts.push(data.units.day.singular);
} else {
if (interval !== 1) {
parts.push(interval.toString(), base.plural);
} else {
parts.push(base.singular);
}
}
if (freq === "WEEKLY" && byDay && !isWeekdays && !isEveryday) {
parts.push(
data.words.on,
list(byDay, (t) => formatByDayToken(t, data), data.words.and)
);
} else if (byDay && freq !== "WEEKLY") {
parts.push(
data.words.on,
list(byDay, (t) => formatByDayToken(t, data), data.words.and)
);
}
if (byMonth) {
parts.push(
data.words.in,
list(byMonth, (m) => data.monthNames[m - 1], data.words.and)
);
}
if (byMonthDay) {
parts.push(
data.words.on_the,
list(byMonthDay, (d) => ordinal(d, data), data.words.and),
data.words.day_of_month
);
}
if (byYearDay) {
parts.push(
data.words.on_the,
list(byYearDay, (d) => ordinal(d, data), data.words.and),
data.words.day_of_year
);
}
if (byWeekNo) {
parts.push(
data.words.in_week,
list(byWeekNo, (n) => n.toString(), data.words.and)
);
}
if (byHour) {
const minutes = byMinute != null ? byMinute : [0];
const seconds = bySecond != null ? bySecond : [0];
const times = byHour.flatMap((h) => minutes.flatMap((m) => seconds.map((s) => formatTime(h, m, s))));
parts.push(data.words.at, list(times, void 0, data.words.and));
parts.push(tzAbbreviation(opts.dtstart));
}
if (!byHour && byMinute) {
parts.push(data.words.at_minute, list(byMinute, void 0, data.words.and));
}
if (!byHour && !byMinute && bySecond) {
parts.push(data.words.at_second, list(bySecond, void 0, data.words.and));
}
if (until) {
const monthName = data.monthNames[until.month - 1];
parts.push(data.words.until, `${monthName} ${until.day}, ${until.year}`);
} else if (count !== void 0) {
parts.push(data.words.for, count.toString(), count === 1 ? data.words.time : data.words.times);
}
if (bySetPos) {
parts.push(
data.words.on_the,
list(bySetPos, (n) => ordinal(n, data), data.words.and),
data.words.instance
);
}
if (wkst) {
const wkName = formatByDayToken(wkst, data);
parts.push(data.words.week_starts_on, wkName);
}
if (rDate && rDate.length) {
parts.push(
data.words.with,
`${rDate.length}`,
rDate.length === 1 ? data.words.additional_date : data.words.additional_dates
);
}
if (exDate && exDate.length) {
parts.push(data.words.excluding, `${exDate.length}`, exDate.length === 1 ? data.words.date : data.words.dates);
}
if (opts.rscale) {
const rscale = opts.rscale;
const skip = opts.skip;
parts.push(`(RSCALE=${rscale}${skip ? `;SKIP=${skip}` : ""})`);
}
return parts.join(" ");
}
export {
toText
};