UNPKG

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
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 };