@formkit/tempo 0.1.2 → 1.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +22 -1
- package/dist/add.d.ts +11 -0
- package/dist/add.mjs +50 -0
- package/dist/add.mjs.map +1 -0
- package/dist/addDay.d.ts +4 -3
- package/dist/addDay.mjs.map +1 -1
- package/dist/addHour.d.ts +4 -3
- package/dist/addHour.mjs.map +1 -1
- package/dist/addMillisecond.d.ts +10 -0
- package/dist/addMillisecond.mjs +11 -0
- package/dist/addMillisecond.mjs.map +1 -0
- package/dist/addMinute.d.ts +5 -4
- package/dist/addMinute.mjs.map +1 -1
- package/dist/addMonth.d.ts +5 -5
- package/dist/addMonth.mjs +2 -12
- package/dist/addMonth.mjs.map +1 -1
- package/dist/addSecond.d.ts +4 -3
- package/dist/addSecond.mjs.map +1 -1
- package/dist/addYear.d.ts +5 -5
- package/dist/addYear.mjs +6 -12
- package/dist/addYear.mjs.map +1 -1
- package/dist/ap.mjs +1 -2
- package/dist/ap.mjs.map +1 -1
- package/dist/applyOffset.d.ts +5 -5
- package/dist/applyOffset.mjs +5 -11
- package/dist/applyOffset.mjs.map +1 -1
- package/dist/bundle.d.ts +365 -115
- package/dist/bundle.mjs +364 -180
- package/dist/bundle.mjs.map +1 -1
- package/dist/common.d.ts +27 -7
- package/dist/common.mjs +47 -42
- package/dist/common.mjs.map +1 -1
- package/dist/date.d.ts +2 -2
- package/dist/date.mjs +1 -3
- package/dist/date.mjs.map +1 -1
- package/dist/dayEnd.d.ts +3 -3
- package/dist/dayEnd.mjs.map +1 -1
- package/dist/dayOfYear.d.ts +3 -3
- package/dist/dayOfYear.mjs.map +1 -1
- package/dist/dayStart.d.ts +3 -3
- package/dist/dayStart.mjs +1 -1
- package/dist/dayStart.mjs.map +1 -1
- package/dist/diff.d.ts +38 -0
- package/dist/diff.mjs +86 -0
- package/dist/diff.mjs.map +1 -0
- package/dist/diffDays.d.ts +12 -5
- package/dist/diffDays.mjs +1 -0
- package/dist/diffDays.mjs.map +1 -1
- package/dist/diffHours.d.ts +12 -5
- package/dist/diffHours.mjs +1 -0
- package/dist/diffHours.mjs.map +1 -1
- package/dist/diffMilliseconds.d.ts +10 -4
- package/dist/diffMilliseconds.mjs.map +1 -1
- package/dist/diffMinutes.d.ts +11 -3
- package/dist/diffMinutes.mjs +5 -1
- package/dist/diffMinutes.mjs.map +1 -1
- package/dist/diffMonths.d.ts +10 -4
- package/dist/diffMonths.mjs.map +1 -1
- package/dist/diffSeconds.d.ts +12 -5
- package/dist/diffSeconds.mjs +5 -1
- package/dist/diffSeconds.mjs.map +1 -1
- package/dist/diffWeeks.d.ts +10 -3
- package/dist/diffWeeks.mjs.map +1 -1
- package/dist/diffYears.d.ts +10 -4
- package/dist/diffYears.mjs +4 -1
- package/dist/diffYears.mjs.map +1 -1
- package/dist/format.mjs +2 -3
- package/dist/format.mjs.map +1 -1
- package/dist/handleDateOverflow.d.ts +12 -0
- package/dist/handleDateOverflow.mjs +18 -0
- package/dist/handleDateOverflow.mjs.map +1 -0
- package/dist/hourEnd.d.ts +3 -3
- package/dist/hourEnd.mjs.map +1 -1
- package/dist/hourStart.d.ts +3 -3
- package/dist/hourStart.mjs +1 -1
- package/dist/hourStart.mjs.map +1 -1
- package/dist/index.cjs +380 -183
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +365 -115
- package/dist/index.d.ts +14 -1
- package/dist/index.mjs +26 -0
- package/dist/index.mjs.map +1 -1
- package/dist/isAfter.d.ts +6 -6
- package/dist/isAfter.mjs.map +1 -1
- package/dist/isBefore.d.ts +5 -5
- package/dist/isBefore.mjs.map +1 -1
- package/dist/isEqual.d.ts +13 -4
- package/dist/isEqual.mjs.map +1 -1
- package/dist/isFuture.d.ts +10 -0
- package/dist/isFuture.mjs +9 -0
- package/dist/isFuture.mjs.map +1 -0
- package/dist/isPast.d.ts +10 -0
- package/dist/isPast.mjs +9 -0
- package/dist/isPast.mjs.map +1 -0
- package/dist/iso8601.d.ts +1 -1
- package/dist/iso8601.mjs +4 -7
- package/dist/iso8601.mjs.map +1 -1
- package/dist/minuteEnd.d.ts +3 -3
- package/dist/minuteEnd.mjs.map +1 -1
- package/dist/minuteStart.d.ts +3 -3
- package/dist/minuteStart.mjs +1 -1
- package/dist/minuteStart.mjs.map +1 -1
- package/dist/monthDays.d.ts +3 -3
- package/dist/monthDays.mjs.map +1 -1
- package/dist/monthEnd.d.ts +3 -3
- package/dist/monthEnd.mjs.map +1 -1
- package/dist/monthStart.d.ts +3 -3
- package/dist/monthStart.mjs +1 -1
- package/dist/monthStart.mjs.map +1 -1
- package/dist/nearestDay.d.ts +3 -3
- package/dist/nearestDay.mjs +2 -4
- package/dist/nearestDay.mjs.map +1 -1
- package/dist/offset.d.ts +5 -5
- package/dist/offset.mjs +16 -16
- package/dist/offset.mjs.map +1 -1
- package/dist/parse.mjs +33 -23
- package/dist/parse.mjs.map +1 -1
- package/dist/parts.mjs +14 -24
- package/dist/parts.mjs.map +1 -1
- package/dist/range.mjs +1 -2
- package/dist/range.mjs.map +1 -1
- package/dist/removeOffset.d.ts +4 -4
- package/dist/removeOffset.mjs.map +1 -1
- package/dist/sameDay.d.ts +8 -2
- package/dist/sameDay.mjs.map +1 -1
- package/dist/sameHour.d.ts +8 -2
- package/dist/sameHour.mjs.map +1 -1
- package/dist/sameMillisecond.d.ts +16 -0
- package/dist/sameMillisecond.mjs +11 -0
- package/dist/sameMillisecond.mjs.map +1 -0
- package/dist/sameMinute.d.ts +8 -2
- package/dist/sameMinute.mjs.map +1 -1
- package/dist/sameMonth.d.ts +16 -0
- package/dist/sameMonth.mjs +11 -0
- package/dist/sameMonth.mjs.map +1 -0
- package/dist/sameSecond.d.ts +8 -2
- package/dist/sameSecond.mjs.map +1 -1
- package/dist/sameYear.d.ts +8 -2
- package/dist/sameYear.mjs.map +1 -1
- package/dist/setDayOfMonth.d.ts +11 -0
- package/dist/setDayOfMonth.mjs +16 -0
- package/dist/setDayOfMonth.mjs.map +1 -0
- package/dist/setHour.d.ts +10 -0
- package/dist/setHour.mjs +11 -0
- package/dist/setHour.mjs.map +1 -0
- package/dist/setMilliseconds.d.ts +10 -0
- package/dist/setMilliseconds.mjs +11 -0
- package/dist/setMilliseconds.mjs.map +1 -0
- package/dist/setMinutes.d.ts +10 -0
- package/dist/setMinutes.mjs +11 -0
- package/dist/setMinutes.mjs.map +1 -0
- package/dist/setMonth.d.ts +11 -0
- package/dist/setMonth.mjs +9 -0
- package/dist/setMonth.mjs.map +1 -0
- package/dist/setSeconds.d.ts +10 -0
- package/dist/setSeconds.mjs +11 -0
- package/dist/setSeconds.mjs.map +1 -0
- package/dist/setYear.d.ts +11 -0
- package/dist/setYear.mjs +9 -0
- package/dist/setYear.mjs.map +1 -0
- package/dist/types.d.ts +29 -7
- package/dist/tzDate.d.ts +5 -3
- package/dist/tzDate.mjs.map +1 -1
- package/dist/weekEnd.d.ts +4 -4
- package/dist/weekEnd.mjs +1 -1
- package/dist/weekEnd.mjs.map +1 -1
- package/dist/weekStart.d.ts +4 -4
- package/dist/weekStart.mjs +2 -3
- package/dist/weekStart.mjs.map +1 -1
- package/dist/yearDays.d.ts +3 -3
- package/dist/yearDays.mjs.map +1 -1
- package/dist/yearEnd.d.ts +3 -3
- package/dist/yearEnd.mjs +1 -2
- package/dist/yearEnd.mjs.map +1 -1
- package/dist/yearStart.d.ts +3 -3
- package/dist/yearStart.mjs +2 -3
- package/dist/yearStart.mjs.map +1 -1
- package/package.json +32 -23
package/dist/offset.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/offset.ts"],"sourcesContent":["import { date } from \"./date\"\nimport {
|
|
1
|
+
{"version":3,"sources":["../src/offset.ts"],"sourcesContent":["import { date } from \"./date\"\nimport { secsToOffset, TimezoneToken } from \"./common\"\nimport { deviceTZ } from \"./deviceTZ\"\nimport type { MaybeDateInput } from \"./types\"\n\n/**\n * Converts a date object from one timezone to that same time in UTC. This is\n * only for internal use.\n * @param d - A Date object\n * @param timeZone - A timezone string\n */\nfunction relativeTime(d: Date, timeZone: string): Date {\n const utcParts = new Intl.DateTimeFormat(\"en-US\", {\n era: \"short\",\n year: \"numeric\",\n month: \"numeric\",\n day: \"numeric\",\n hour: \"numeric\",\n minute: \"numeric\",\n second: \"numeric\",\n timeZone,\n hourCycle: \"h23\",\n }).formatToParts(d)\n const p: Record<string, string> = {}\n utcParts.forEach((part) => {\n if (part.type !== \"literal\") p[part.type] = part.value\n })\n // BC year N in Intl = ISO year (1 - N), e.g. 1 BC = year 0, 2 BC = year -1\n const year = p.era === \"BC\" ? 1 - Number(p.year) : Number(p.year)\n const result = new Date(Date.UTC(0, 0, 1, Number(p.hour), Number(p.minute), Number(p.second)))\n // setUTCFullYear with year, month, day together avoids Date.UTC's 0-99 year mapping\n // and ensures leap day validation uses the correct year\n result.setUTCFullYear(year, Number(p.month) - 1, Number(p.day))\n return result\n}\n\n/**\n * Returns the offset between two timezones on a given date. The results are\n * ISO8601 compatible offsets like -0800 or +0530.\n *\n * @param [dateInput] - (default: current time) The date on which to determine the offset\n * @param [tzA] - (default: UTC) The second timezone to compare determine the offset between.\n * @param [tzB] - (default: device) The first timezone to compare determine the offset between.\n */\nexport function offset(\n utcTime?: MaybeDateInput,\n tzA = \"UTC\",\n tzB = \"device\",\n timeZoneToken: TimezoneToken = \"Z\"\n): string {\n tzB = tzB === \"device\" ? deviceTZ() ?? \"utc\" : tzB\n const d = date(utcTime)\n const timeA = relativeTime(d, tzA)\n const timeB = relativeTime(d, tzB)\n const timeDiffInSecs = Math.round((timeB.getTime() - timeA.getTime()) / 1000)\n return secsToOffset(timeDiffInSecs, timeZoneToken)\n}\n"],"mappings":";AAAA,SAAS,YAAY;AACrB,SAAS,oBAAmC;AAC5C,SAAS,gBAAgB;AASzB,SAAS,aAAa,GAAS,UAAwB;AACrD,QAAM,WAAW,IAAI,KAAK,eAAe,SAAS;AAAA,IAChD,KAAK;AAAA,IACL,MAAM;AAAA,IACN,OAAO;AAAA,IACP,KAAK;AAAA,IACL,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR;AAAA,IACA,WAAW;AAAA,EACb,CAAC,EAAE,cAAc,CAAC;AAClB,QAAM,IAA4B,CAAC;AACnC,WAAS,QAAQ,CAAC,SAAS;AACzB,QAAI,KAAK,SAAS,UAAW,GAAE,KAAK,IAAI,IAAI,KAAK;AAAA,EACnD,CAAC;AAED,QAAM,OAAO,EAAE,QAAQ,OAAO,IAAI,OAAO,EAAE,IAAI,IAAI,OAAO,EAAE,IAAI;AAChE,QAAM,SAAS,IAAI,KAAK,KAAK,IAAI,GAAG,GAAG,GAAG,OAAO,EAAE,IAAI,GAAG,OAAO,EAAE,MAAM,GAAG,OAAO,EAAE,MAAM,CAAC,CAAC;AAG7F,SAAO,eAAe,MAAM,OAAO,EAAE,KAAK,IAAI,GAAG,OAAO,EAAE,GAAG,CAAC;AAC9D,SAAO;AACT;AAUO,SAAS,OACd,SACA,MAAM,OACN,MAAM,UACN,gBAA+B,KACvB;AAjDV;AAkDE,QAAM,QAAQ,YAAW,cAAS,MAAT,YAAc,QAAQ;AAC/C,QAAM,IAAI,KAAK,OAAO;AACtB,QAAM,QAAQ,aAAa,GAAG,GAAG;AACjC,QAAM,QAAQ,aAAa,GAAG,GAAG;AACjC,QAAM,iBAAiB,KAAK,OAAO,MAAM,QAAQ,IAAI,MAAM,QAAQ,KAAK,GAAI;AAC5E,SAAO,aAAa,gBAAgB,aAAa;AACnD;","names":[]}
|
package/dist/parse.mjs
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
// src/parse.ts
|
|
2
2
|
import { date } from "./date.mjs";
|
|
3
|
-
import { validate, styles, fixedLength, four, two, validOffset, fixedLengthByOffset } from "./common.mjs";
|
|
3
|
+
import { validate, styles, fixedLength, four, two, validOffset, fixedLengthByOffset, offsetToSecs } from "./common.mjs";
|
|
4
4
|
import { formatStr } from "./formatStr.mjs";
|
|
5
5
|
import { fourDigitYear } from "./fourDigitYear.mjs";
|
|
6
6
|
import { ap } from "./ap.mjs";
|
|
@@ -23,19 +23,16 @@ function parse(dateStrOrOptions, format = "ISO8601", locale = "device") {
|
|
|
23
23
|
} else {
|
|
24
24
|
dateStr = dateStrOrOptions;
|
|
25
25
|
}
|
|
26
|
-
if (!dateStr)
|
|
27
|
-
throw new Error("parse() requires a date string.");
|
|
26
|
+
if (!dateStr) throw new Error("parse() requires a date string.");
|
|
28
27
|
const invalid = () => {
|
|
29
28
|
throw new Error(
|
|
30
29
|
`Date (${dateStr}) does not match format (${formatStr(format, locale)})`
|
|
31
30
|
);
|
|
32
31
|
};
|
|
33
|
-
if (format === "ISO8601")
|
|
34
|
-
return date(dateStr);
|
|
32
|
+
if (format === "ISO8601") return date(dateStr);
|
|
35
33
|
const genitive = styles.includes(format) || typeof format === "object";
|
|
36
34
|
const formatParts = validate(parts(format, locale).filter(partFilter));
|
|
37
|
-
if (!formatParts.length)
|
|
38
|
-
throw new Error("parse() requires a pattern.");
|
|
35
|
+
if (!formatParts.length) throw new Error("parse() requires a pattern.");
|
|
39
36
|
let parsedParts;
|
|
40
37
|
try {
|
|
41
38
|
parsedParts = parseParts(dateStr, formatParts);
|
|
@@ -49,17 +46,19 @@ function parse(dateStrOrOptions, format = "ISO8601", locale = "device") {
|
|
|
49
46
|
["DD", now.getDate()],
|
|
50
47
|
["HH", 0],
|
|
51
48
|
["mm", 0],
|
|
52
|
-
["ss", 0]
|
|
49
|
+
["ss", 0],
|
|
50
|
+
["SSS", 0]
|
|
53
51
|
]);
|
|
54
52
|
let a = null;
|
|
55
53
|
let offset = "";
|
|
56
54
|
parsedParts.forEach((part) => {
|
|
57
|
-
if (part.partName === "literal")
|
|
58
|
-
|
|
59
|
-
if (part.token === part.value)
|
|
60
|
-
return invalid();
|
|
55
|
+
if (part.partName === "literal") return;
|
|
56
|
+
if (part.token === part.value) return invalid();
|
|
61
57
|
const v = Number(part.value);
|
|
62
|
-
if (
|
|
58
|
+
if (part.token === "SSS") {
|
|
59
|
+
const digits = part.value.padEnd(3, "0").slice(0, 3);
|
|
60
|
+
parsed.set("SSS", Number(digits));
|
|
61
|
+
} else if (parsed.has(part.token)) {
|
|
63
62
|
parsed.set(part.token, v);
|
|
64
63
|
} else if (part.token === "YY") {
|
|
65
64
|
parsed.set("YYYY", fourDigitYear(part.value));
|
|
@@ -99,17 +98,24 @@ function parse(dateStrOrOptions, format = "ISO8601", locale = "device") {
|
|
|
99
98
|
parsed.set("HH", 0);
|
|
100
99
|
}
|
|
101
100
|
parsed.set("MM", (parsed.get("MM") || 1) - 1);
|
|
102
|
-
let [Y, M, D, h, m, s] = Array.from(parsed.values());
|
|
101
|
+
let [Y, M, D, h, m, s, ms] = Array.from(parsed.values());
|
|
103
102
|
const maxDaysInMonth = monthDays(/* @__PURE__ */ new Date(`${four(Y)}-${two(M + 1)}-10`));
|
|
104
103
|
if (maxDaysInMonth < D && dateOverflow === "throw")
|
|
105
104
|
throw new Error(`Invalid date ${four(Y)}-${two(M + 1)}-${two(D)}`);
|
|
106
105
|
D = dateOverflow === "backward" ? Math.min(D, maxDaysInMonth) : D;
|
|
107
|
-
const
|
|
108
|
-
|
|
109
|
-
|
|
106
|
+
const msStr = String(ms).padStart(3, "0");
|
|
107
|
+
if (offset) {
|
|
108
|
+
const isoStringUtc = `${four(Y)}-${two(M + 1)}-${two(D)}T${two(h)}:${two(m)}:${two(s)}.${msStr}Z`;
|
|
109
|
+
const d2 = new Date(isoStringUtc);
|
|
110
|
+
if (!isFinite(+d2)) return invalid();
|
|
111
|
+
const len = fixedLengthByOffset(offset);
|
|
112
|
+
const token = len === 5 || len === 8 ? "ZZ" : "Z";
|
|
113
|
+
const offsetSecs = offsetToSecs(offset, token);
|
|
114
|
+
return new Date(d2.getTime() - offsetSecs * 1e3);
|
|
115
|
+
}
|
|
116
|
+
const isoString = `${four(Y)}-${two(M + 1)}-${two(D)}T${two(h)}:${two(m)}:${two(s)}.${msStr}`;
|
|
110
117
|
const d = new Date(isoString);
|
|
111
|
-
if (isFinite(+d))
|
|
112
|
-
return d;
|
|
118
|
+
if (isFinite(+d)) return d;
|
|
113
119
|
return invalid();
|
|
114
120
|
}
|
|
115
121
|
function parseParts(dateStr, formatParts) {
|
|
@@ -129,13 +135,18 @@ function parseParts(dateStr, formatParts) {
|
|
|
129
135
|
len = current.partValue.length;
|
|
130
136
|
} else if (current.partName === "timeZoneName") {
|
|
131
137
|
len = fixedLengthByOffset(dateStr.substring(pos));
|
|
138
|
+
} else if (current.token === "SSS") {
|
|
139
|
+
let end = pos;
|
|
140
|
+
while (end < dateStr.length && /\d/.test(dateStr.charAt(end))) {
|
|
141
|
+
end++;
|
|
142
|
+
}
|
|
143
|
+
len = end - pos;
|
|
132
144
|
} else if (current.token in fixedLength) {
|
|
133
145
|
len = fixedLength[current.token];
|
|
134
146
|
} else if (next) {
|
|
135
147
|
if (next.partName === "literal") {
|
|
136
148
|
len = dateStr.indexOf(next.partValue, pos) - pos;
|
|
137
|
-
if (len < 0)
|
|
138
|
-
throw new Error();
|
|
149
|
+
if (len < 0) throw new Error();
|
|
139
150
|
} else if (next.partName === "dayPeriod") {
|
|
140
151
|
for (let i2 = 1; i2 <= 4; i2++) {
|
|
141
152
|
if (isNaN(Number(dateStr.charAt(pos + i2)))) {
|
|
@@ -145,8 +156,7 @@ function parseParts(dateStr, formatParts) {
|
|
|
145
156
|
}
|
|
146
157
|
} else {
|
|
147
158
|
const nextChar = dateStr.substring(pos).search(/\d/);
|
|
148
|
-
if (nextChar !== -1)
|
|
149
|
-
len = pos + nextChar;
|
|
159
|
+
if (nextChar !== -1) len = pos + nextChar;
|
|
150
160
|
}
|
|
151
161
|
} else {
|
|
152
162
|
len = dateStr.length;
|
package/dist/parse.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/parse.ts"],"sourcesContent":["import { date } from \"./date\"\nimport { validate, styles, fixedLength, four, two, validOffset, fixedLengthByOffset } from \"./common\"\nimport { formatStr } from \"./formatStr\"\nimport { fourDigitYear } from \"./fourDigitYear\"\nimport { ap } from \"./ap\"\nimport { range } from \"./range\"\nimport { monthDays } from \"./monthDays\"\nimport { parts } from \"./parts\"\nimport type {\n ParseOptions,\n Format,\n Part,\n FormatStyle,\n FilledPart,\n FormatToken,\n} from \"./types\"\n\nexport function parse(options: ParseOptions): Date | never\nexport function parse(\n dateStr: string,\n format?: Format,\n locale?: string\n): Date | never\n/**\n * Parses a date string into a Date object using the given format.\n * @param dateStr - A string representing a date.\n * @param format - The format the given string is in.\n * @param locale - The locale to parse the string from.\n */\nexport function parse(\n dateStrOrOptions: string | ParseOptions,\n format: Format = \"ISO8601\",\n locale = \"device\"\n): Date | never {\n let partFilter: (part: Part) => boolean = () => true\n let dateStr: string\n let dateOverflow = \"backward\"\n if (typeof dateStrOrOptions === \"object\") {\n ;({\n date: dateStr,\n format = \"ISO8601\",\n locale = \"device\",\n dateOverflow = \"backward\",\n partFilter = () => true,\n } = dateStrOrOptions)\n } else {\n dateStr = dateStrOrOptions\n }\n if (!dateStr) throw new Error(\"parse() requires a date string.\")\n const invalid = (): never => {\n throw new Error(\n `Date (${dateStr}) does not match format (${formatStr(format, locale)})`\n )\n }\n if (format === \"ISO8601\") return date(dateStr)\n const genitive =\n styles.includes(format as FormatStyle) || typeof format === \"object\"\n const formatParts = validate(parts(format, locale).filter(partFilter))\n if (!formatParts.length) throw new Error(\"parse() requires a pattern.\")\n let parsedParts\n try {\n parsedParts = parseParts(dateStr, formatParts)\n } catch {\n return invalid()\n }\n const now = new Date()\n const parsed = new Map([\n [\"YYYY\", now.getFullYear()],\n [\"MM\", now.getMonth() + 1],\n [\"DD\", now.getDate()],\n [\"HH\", 0],\n [\"mm\", 0],\n [\"ss\", 0],\n ])\n let a: null | boolean = null\n let offset = \"\"\n parsedParts.forEach((part): void | never => {\n if (part.partName === \"literal\") return\n if (part.token === part.value) return invalid()\n const v = Number(part.value)\n if (parsed.has(part.token)) {\n // Parse for YYYY, MM, DD, HH, hh, mm, ss, Z\n parsed.set(part.token, v)\n } else if (part.token === \"YY\") {\n // Parse for YY\n parsed.set(\"YYYY\", fourDigitYear(part.value))\n } else {\n /* MMM - Short name Jan-Dec\n * MMMM - Full name January - December\n * h - Minimum hour digits, 12 hour clock, 1-12\n * hh - 2 hour digits, 12 hour clock, 01-12\n * m - The minute 0-59\n * mm - The minute 00-12\n * s - The second 0-59\n * a - am/pm\n * A - AM/PM\n */\n const t = part.token\n if (t.startsWith(\"d\")) {\n // d, ddd, dddd — we just ignore these because they are non specific\n return\n } else if (t === \"D\") {\n parsed.set(\"DD\", v)\n } else if (t === \"H\" || t.startsWith(\"h\")) {\n parsed.set(\"HH\", v)\n } else if (t === \"M\") {\n parsed.set(\"MM\", v)\n } else if (t === \"a\" || t === \"A\") {\n a = part.value.toLowerCase() === ap(\"am\", locale).toLowerCase()\n } else if (t === \"Z\" || t === \"ZZ\") {\n offset = validOffset(part.value, t)\n } else {\n const values = range(t as FormatToken, locale, genitive)\n const index = values.indexOf(part.value)\n if (index !== -1) {\n switch (t) {\n case \"MMM\":\n case \"MMMM\":\n parsed.set(\"MM\", index + 1)\n break\n }\n }\n }\n }\n })\n let hours = parsed.get(\"HH\") || 0\n if (a === false) {\n hours += hours === 12 ? 0 : 12\n parsed.set(\"HH\", hours === 24 ? 0 : hours)\n } else if (a === true && hours === 12) {\n // 12am === 00 in 24 hour clock.\n parsed.set(\"HH\", 0)\n }\n parsed.set(\"MM\", (parsed.get(\"MM\") || 1) - 1)\n // eslint-disable-next-line prefer-const\n let [Y, M, D, h, m, s] = Array.from(parsed.values())\n\n // Determine if the date is valid for the month.\n const maxDaysInMonth = monthDays(new Date(`${four(Y)}-${two(M + 1)}-10`))\n if (maxDaysInMonth < D && dateOverflow === \"throw\")\n throw new Error(`Invalid date ${four(Y)}-${two(M + 1)}-${two(D)}`)\n D = dateOverflow === \"backward\" ? Math.min(D, maxDaysInMonth) : D\n\n // Create the date.\n const isoString = `${four(Y)}-${two(M + 1)}-${two(D)}T${two(h)}:${two(\n m\n )}:${two(s)}${offset}`\n const d = new Date(isoString)\n if (isFinite(+d)) return d\n return invalid()\n}\n\n/**\n * Given a string date and corresponding format parts, fill the parts with the\n * data from the string.\n * @param dateStr - A string to parse.\n * @param formatParts - The expected parts of the given string.\n */\nexport function parseParts(dateStr: string, formatParts: Part[]): FilledPart[] {\n let i = 0\n const advance = (parts: Part[]): [Part, Part | undefined] => [\n parts[i++],\n parts[i],\n ]\n let pos = 0\n const parsed: FilledPart[] = []\n let n: undefined | Part = undefined\n do {\n const [current, next] = advance(formatParts)\n n = next\n let len = 1\n if (current.partName === \"literal\") {\n // Literals can be discarded\n len = current.partValue.length\n } else if (current.partName === \"timeZoneName\") {\n len = fixedLengthByOffset(dateStr.substring(pos))\n } else if (current.token in fixedLength) {\n // Fixed length parse\n len = fixedLength[current.token as keyof typeof fixedLength]\n } else if (next) {\n // Variable length parse.\n if (next.partName === \"literal\") {\n len = dateStr.indexOf(next.partValue, pos) - pos\n if (len < 0) throw new Error()\n } else if (next.partName === \"dayPeriod\") {\n // Our validator is ensuring that the current item must be a variable\n // length number. We need to extract it.\n for (let i = 1; i <= 4; i++) {\n if (isNaN(Number(dateStr.charAt(pos + i)))) {\n len = i\n break\n }\n }\n } else {\n // Our validator guarantees the next is either not a number or it\n // will be the end of the string\n const nextChar = dateStr.substring(pos).search(/\\d/)\n if (nextChar !== -1) len = pos + nextChar\n }\n } else {\n len = dateStr.length\n }\n\n parsed.push({ ...current, value: dateStr.substring(pos, pos + len) })\n pos += len\n } while (n)\n return parsed\n}\n"],"mappings":"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","names":["parts","i"]}
|
|
1
|
+
{"version":3,"sources":["../src/parse.ts"],"sourcesContent":["import { date } from \"./date\"\nimport { validate, styles, fixedLength, four, two, validOffset, fixedLengthByOffset, offsetToSecs, TimezoneToken } from \"./common\"\nimport { formatStr } from \"./formatStr\"\nimport { fourDigitYear } from \"./fourDigitYear\"\nimport { ap } from \"./ap\"\nimport { range } from \"./range\"\nimport { monthDays } from \"./monthDays\"\nimport { parts } from \"./parts\"\nimport type {\n ParseOptions,\n Format,\n Part,\n FormatStyle,\n FilledPart,\n FormatToken,\n} from \"./types\"\n\nexport function parse(options: ParseOptions): Date | never\nexport function parse(\n dateStr: string,\n format?: Format,\n locale?: string\n): Date | never\n/**\n * Parses a date string into a Date object using the given format.\n * @param dateStr - A string representing a date.\n * @param format - The format the given string is in.\n * @param locale - The locale to parse the string from.\n */\nexport function parse(\n dateStrOrOptions: string | ParseOptions,\n format: Format = \"ISO8601\",\n locale = \"device\"\n): Date | never {\n let partFilter: (part: Part) => boolean = () => true\n let dateStr: string\n let dateOverflow = \"backward\"\n if (typeof dateStrOrOptions === \"object\") {\n ;({\n date: dateStr,\n format = \"ISO8601\",\n locale = \"device\",\n dateOverflow = \"backward\",\n partFilter = () => true,\n } = dateStrOrOptions)\n } else {\n dateStr = dateStrOrOptions\n }\n if (!dateStr) throw new Error(\"parse() requires a date string.\")\n const invalid = (): never => {\n throw new Error(\n `Date (${dateStr}) does not match format (${formatStr(format, locale)})`\n )\n }\n if (format === \"ISO8601\") return date(dateStr)\n const genitive =\n styles.includes(format as FormatStyle) || typeof format === \"object\"\n const formatParts = validate(parts(format, locale).filter(partFilter))\n if (!formatParts.length) throw new Error(\"parse() requires a pattern.\")\n let parsedParts\n try {\n parsedParts = parseParts(dateStr, formatParts)\n } catch {\n return invalid()\n }\n const now = new Date()\n const parsed = new Map([\n [\"YYYY\", now.getFullYear()],\n [\"MM\", now.getMonth() + 1],\n [\"DD\", now.getDate()],\n [\"HH\", 0],\n [\"mm\", 0],\n [\"ss\", 0],\n [\"SSS\", 0],\n ])\n let a: null | boolean = null\n let offset = \"\"\n parsedParts.forEach((part): void | never => {\n if (part.partName === \"literal\") return\n if (part.token === part.value) return invalid()\n const v = Number(part.value)\n // Handle SSS specially - convert variable-length fractional seconds to milliseconds\n if (part.token === \"SSS\") {\n // \"1\" -> 100, \"12\" -> 120, \"123\" -> 123, \"123456\" -> 123\n const digits = part.value.padEnd(3, \"0\").slice(0, 3)\n parsed.set(\"SSS\", Number(digits))\n } else if (parsed.has(part.token)) {\n // Parse for YYYY, MM, DD, HH, hh, mm, ss\n parsed.set(part.token, v)\n } else if (part.token === \"YY\") {\n // Parse for YY\n parsed.set(\"YYYY\", fourDigitYear(part.value))\n } else {\n /* MMM - Short name Jan-Dec\n * MMMM - Full name January - December\n * h - Minimum hour digits, 12 hour clock, 1-12\n * hh - 2 hour digits, 12 hour clock, 01-12\n * m - The minute 0-59\n * mm - The minute 00-12\n * s - The second 0-59\n * a - am/pm\n * A - AM/PM\n */\n const t = part.token\n if (t.startsWith(\"d\")) {\n // d, ddd, dddd — we just ignore these because they are non specific\n return\n } else if (t === \"D\") {\n parsed.set(\"DD\", v)\n } else if (t === \"H\" || t.startsWith(\"h\")) {\n parsed.set(\"HH\", v)\n } else if (t === \"M\") {\n parsed.set(\"MM\", v)\n } else if (t === \"a\" || t === \"A\") {\n a = part.value.toLowerCase() === ap(\"am\", locale).toLowerCase()\n } else if (t === \"Z\" || t === \"ZZ\") {\n offset = validOffset(part.value, t)\n } else {\n const values = range(t as FormatToken, locale, genitive)\n const index = values.indexOf(part.value)\n if (index !== -1) {\n switch (t) {\n case \"MMM\":\n case \"MMMM\":\n parsed.set(\"MM\", index + 1)\n break\n }\n }\n }\n }\n })\n let hours = parsed.get(\"HH\") || 0\n if (a === false) {\n hours += hours === 12 ? 0 : 12\n parsed.set(\"HH\", hours === 24 ? 0 : hours)\n } else if (a === true && hours === 12) {\n // 12am === 00 in 24 hour clock.\n parsed.set(\"HH\", 0)\n }\n parsed.set(\"MM\", (parsed.get(\"MM\") || 1) - 1)\n // eslint-disable-next-line prefer-const\n let [Y, M, D, h, m, s, ms] = Array.from(parsed.values())\n\n // Determine if the date is valid for the month.\n const maxDaysInMonth = monthDays(new Date(`${four(Y)}-${two(M + 1)}-10`))\n if (maxDaysInMonth < D && dateOverflow === \"throw\")\n throw new Error(`Invalid date ${four(Y)}-${two(M + 1)}-${two(D)}`)\n D = dateOverflow === \"backward\" ? Math.min(D, maxDaysInMonth) : D\n\n // Create the date.\n // If there's an offset, we need to handle it manually because JavaScript's Date\n // doesn't support seconds in timezone offsets (e.g., -05:32:11).\n const msStr = String(ms).padStart(3, \"0\")\n if (offset) {\n // Create the date in UTC, then apply the offset manually\n const isoStringUtc = `${four(Y)}-${two(M + 1)}-${two(D)}T${two(h)}:${two(m)}:${two(s)}.${msStr}Z`\n const d = new Date(isoStringUtc)\n if (!isFinite(+d)) return invalid()\n\n const len = fixedLengthByOffset(offset)\n const token: TimezoneToken = len === 5 || len === 8 ? \"ZZ\" : \"Z\"\n const offsetSecs = offsetToSecs(offset, token)\n return new Date(d.getTime() - offsetSecs * 1000)\n }\n\n // No offset - create date in local time (original behavior)\n const isoString = `${four(Y)}-${two(M + 1)}-${two(D)}T${two(h)}:${two(m)}:${two(s)}.${msStr}`\n const d = new Date(isoString)\n if (isFinite(+d)) return d\n return invalid()\n}\n\n/**\n * Given a string date and corresponding format parts, fill the parts with the\n * data from the string.\n * @param dateStr - A string to parse.\n * @param formatParts - The expected parts of the given string.\n */\nexport function parseParts(dateStr: string, formatParts: Part[]): FilledPart[] {\n let i = 0\n const advance = (parts: Part[]): [Part, Part | undefined] => [\n parts[i++],\n parts[i],\n ]\n let pos = 0\n const parsed: FilledPart[] = []\n let n: undefined | Part = undefined\n do {\n const [current, next] = advance(formatParts)\n n = next\n let len = 1\n if (current.partName === \"literal\") {\n // Literals can be discarded\n len = current.partValue.length\n } else if (current.partName === \"timeZoneName\") {\n len = fixedLengthByOffset(dateStr.substring(pos))\n } else if (current.token === \"SSS\") {\n // Variable length: consume all consecutive digits (gracious parsing)\n let end = pos\n while (end < dateStr.length && /\\d/.test(dateStr.charAt(end))) {\n end++\n }\n len = end - pos\n } else if (current.token in fixedLength) {\n // Fixed length parse\n len = fixedLength[current.token as keyof typeof fixedLength]\n } else if (next) {\n // Variable length parse.\n if (next.partName === \"literal\") {\n len = dateStr.indexOf(next.partValue, pos) - pos\n if (len < 0) throw new Error()\n } else if (next.partName === \"dayPeriod\") {\n // Our validator is ensuring that the current item must be a variable\n // length number. We need to extract it.\n for (let i = 1; i <= 4; i++) {\n if (isNaN(Number(dateStr.charAt(pos + i)))) {\n len = i\n break\n }\n }\n } else {\n // Our validator guarantees the next is either not a number or it\n // will be the end of the string\n const nextChar = dateStr.substring(pos).search(/\\d/)\n if (nextChar !== -1) len = pos + nextChar\n }\n } else {\n len = dateStr.length\n }\n\n parsed.push({ ...current, value: dateStr.substring(pos, pos + len) })\n pos += len\n } while (n)\n return parsed\n}\n"],"mappings":"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","names":["d","parts","i"]}
|
package/dist/parts.mjs
CHANGED
|
@@ -7,7 +7,8 @@ import {
|
|
|
7
7
|
clockAgnostic,
|
|
8
8
|
clock24,
|
|
9
9
|
specDate,
|
|
10
|
-
clock12
|
|
10
|
+
clock12,
|
|
11
|
+
fractionalSeconds
|
|
11
12
|
} from "./common.mjs";
|
|
12
13
|
function parts(format, locale) {
|
|
13
14
|
if (styles.includes(format) || typeof format === "object") {
|
|
@@ -16,13 +17,11 @@ function parts(format, locale) {
|
|
|
16
17
|
let f = format;
|
|
17
18
|
let match = 0;
|
|
18
19
|
const testPattern = (pattern) => {
|
|
19
|
-
if (!pattern[2])
|
|
20
|
-
pattern[2] = new RegExp(`(.)?(${pattern[0]})`, "g");
|
|
20
|
+
if (!pattern[2]) pattern[2] = new RegExp(`(.)?(${pattern[0]})`, "g");
|
|
21
21
|
if (pattern[2].test(f)) {
|
|
22
22
|
let didAdd = 0;
|
|
23
23
|
f = f.replace(pattern[2], (_, prefix, actualMatch) => {
|
|
24
|
-
if (prefix === "\\")
|
|
25
|
-
return actualMatch;
|
|
24
|
+
if (prefix === "\\") return actualMatch;
|
|
26
25
|
return `${typeof prefix === "string" ? prefix : ""}{!${didAdd++ ? match : match++}!}`;
|
|
27
26
|
});
|
|
28
27
|
return !!didAdd;
|
|
@@ -49,7 +48,7 @@ function parts(format, locale) {
|
|
|
49
48
|
hour12
|
|
50
49
|
};
|
|
51
50
|
}
|
|
52
|
-
const found24Patterns = clockAgnostic.filter(testPattern).concat(clock24.filter(testPattern)).map(createPart.bind(null, false));
|
|
51
|
+
const found24Patterns = clockAgnostic.filter(testPattern).concat(clock24.filter(testPattern)).concat(fractionalSeconds.filter(testPattern)).map(createPart.bind(null, false));
|
|
53
52
|
const parts2 = validate(
|
|
54
53
|
found24Patterns.concat(
|
|
55
54
|
clock12.filter(testPattern).map(createPart.bind(null, true))
|
|
@@ -78,10 +77,8 @@ function styleParts(format, locale) {
|
|
|
78
77
|
if (typeof format === "string") {
|
|
79
78
|
options.dateStyle = format;
|
|
80
79
|
} else {
|
|
81
|
-
if ("date" in format)
|
|
82
|
-
|
|
83
|
-
if ("time" in format)
|
|
84
|
-
options.timeStyle = format.time;
|
|
80
|
+
if ("date" in format) options.dateStyle = format.date;
|
|
81
|
+
if ("time" in format) options.timeStyle = format.time;
|
|
85
82
|
}
|
|
86
83
|
const formatter = new Intl.DateTimeFormat(locale, options);
|
|
87
84
|
const segments = formatter.formatToParts(new Date(specDate)).map(normStr);
|
|
@@ -97,11 +94,9 @@ function styleParts(format, locale) {
|
|
|
97
94
|
part.type === "hour" ? hourType : void 0,
|
|
98
95
|
options
|
|
99
96
|
);
|
|
100
|
-
if (formatPattern === void 0)
|
|
101
|
-
return;
|
|
97
|
+
if (formatPattern === void 0) return;
|
|
102
98
|
const partValue = formatPattern[1][partName];
|
|
103
|
-
if (!partValue)
|
|
104
|
-
return;
|
|
99
|
+
if (!partValue) return;
|
|
105
100
|
if (!formatPattern[2])
|
|
106
101
|
formatPattern[2] = new RegExp(`${formatPattern[0]}`, "g");
|
|
107
102
|
return {
|
|
@@ -122,8 +117,7 @@ function guessPattern(partName, partValue, locale, hour, options) {
|
|
|
122
117
|
case "year":
|
|
123
118
|
return l === 2 ? tokens.get("YY") : tokens.get("YYYY");
|
|
124
119
|
case "month":
|
|
125
|
-
if (n)
|
|
126
|
-
return l === 1 ? tokens.get("M") : tokens.get("MM");
|
|
120
|
+
if (n) return l === 1 ? tokens.get("M") : tokens.get("MM");
|
|
127
121
|
style = partStyle(locale, partName, partValue);
|
|
128
122
|
switch (style) {
|
|
129
123
|
case "long":
|
|
@@ -144,8 +138,7 @@ function guessPattern(partName, partValue, locale, hour, options) {
|
|
|
144
138
|
return tokens.get("dddd");
|
|
145
139
|
}
|
|
146
140
|
case "hour":
|
|
147
|
-
if (hour === 12)
|
|
148
|
-
return l === 1 ? tokens.get("h") : tokens.get("hh");
|
|
141
|
+
if (hour === 12) return l === 1 ? tokens.get("h") : tokens.get("hh");
|
|
149
142
|
return l === 1 ? tokens.get("H") : tokens.get("HH");
|
|
150
143
|
case "minute":
|
|
151
144
|
return l === 1 ? tokens.get("m") : tokens.get("mm");
|
|
@@ -170,8 +163,7 @@ function partStyle(locale, part, value) {
|
|
|
170
163
|
const formats2 = {};
|
|
171
164
|
for (let i = 0; i < 12; i++) {
|
|
172
165
|
date.setMonth(0 + i);
|
|
173
|
-
if (i in weekdays)
|
|
174
|
-
date.setDate(weekdays[i]);
|
|
166
|
+
if (i in weekdays) date.setDate(weekdays[i]);
|
|
175
167
|
date.setUTCHours(8 + i);
|
|
176
168
|
for (const style of partStyles) {
|
|
177
169
|
const segments = new Intl.DateTimeFormat(
|
|
@@ -190,12 +182,10 @@ function partStyle(locale, part, value) {
|
|
|
190
182
|
(part2) => part2.type === "month"
|
|
191
183
|
);
|
|
192
184
|
const index = segments.findIndex((part2) => part2.type === "month");
|
|
193
|
-
if (index > -1 && genitiveMonth)
|
|
194
|
-
segments[index] = genitiveMonth;
|
|
185
|
+
if (index > -1 && genitiveMonth) segments[index] = genitiveMonth;
|
|
195
186
|
}
|
|
196
187
|
segments.forEach((part2) => {
|
|
197
|
-
if (part2.type === "literal")
|
|
198
|
-
return;
|
|
188
|
+
if (part2.type === "literal") return;
|
|
199
189
|
const type = part2.type;
|
|
200
190
|
formats2[type] = Object.assign(formats2[type] || {}, {
|
|
201
191
|
[part2.value]: style
|
package/dist/parts.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/parts.ts"],"sourcesContent":["import {\n styles,\n normStr,\n tokens,\n memoParts,\n clockAgnostic,\n clock24,\n specDate,\n clock12,\n} from \"./common\"\nimport type {\n ParseOptions,\n Format,\n Part,\n FormatStyle,\n FormatStyleObj,\n FormatPattern,\n NamedFormats,\n NamedFormatOption,\n} from \"./types\"\n/**\n * Given a format string, produce an array of matching \"parts\", each part\n * contains a regular expression and the corresponding\n * Intl.DateTimeFormatPartTypesRegistry key/value.\n * @param format - A format string like MM/DD/YYYY\n * @param locale - The locale to parse for.\n */\nexport function parts(format: Format, locale: string): Part[] {\n if (styles.includes(format as FormatStyle) || typeof format === \"object\") {\n return styleParts(format as FormatStyle | FormatStyleObj, locale)\n }\n let f = format\n let match = 0\n const testPattern = (pattern: FormatPattern) => {\n if (!pattern[2]) pattern[2] = new RegExp(`(.)?(${pattern[0]})`, \"g\")\n if (pattern[2].test(f)) {\n let didAdd = 0\n f = f.replace(pattern[2], (_, prefix, actualMatch) => {\n if (prefix === \"\\\\\") return actualMatch\n return `${typeof prefix === \"string\" ? prefix : \"\"}{!${\n didAdd++ ? match : match++\n }!}`\n })\n return !!didAdd\n }\n return false\n }\n\n function validate(patterns: Part[]): Part[] {\n const parts = patterns.map((part) => part.partName)\n const deduped = new Set(parts)\n if (parts.length > deduped.size) {\n throw new Error(`Cannot reuse format tokens.`)\n }\n return patterns\n }\n\n function createPart(\n hour12: boolean,\n [token, option, exp]: FormatPattern\n ): Part {\n const partName = Object.keys(option)[0] as Intl.DateTimeFormatPartTypes\n const partValue = option[partName] as string\n return {\n option,\n partName,\n partValue,\n token,\n pattern: exp as RegExp,\n hour12,\n }\n }\n\n const found24Patterns = clockAgnostic\n .filter(testPattern)\n .concat(clock24.filter(testPattern))\n .map(createPart.bind(null, false))\n\n // Reset the format before re-checking\n const parts = validate(\n found24Patterns.concat(\n clock12.filter(testPattern).map(createPart.bind(null, true))\n )\n )\n const extractIndex = /^\\{!(\\d+)!\\}$/\n return f\n .split(/(\\{!\\d+!\\})/)\n .map((match: string): Part => {\n const hasIndex = match.match(extractIndex)\n if (hasIndex) {\n return parts[Number(hasIndex[1])]\n }\n return {\n option: { literal: match },\n partName: \"literal\",\n partValue: match,\n token: match,\n pattern: new RegExp(\"\"),\n hour12: false,\n }\n })\n .filter((part) => !(part.partName === \"literal\" && part.partValue === \"\"))\n}\n\n/**\n * Determines the parts in a native date style, like \"full\".\n * @param format - A date style like \"full\" or \"short\"\n * @param locale - The locale string\n */\nfunction styleParts(\n format: FormatStyle | FormatStyleObj,\n locale: string\n): Part[] {\n const options: Intl.DateTimeFormatOptions = {\n timeZone: \"UTC\",\n }\n if (typeof format === \"string\") {\n options.dateStyle = format\n } else {\n if (\"date\" in format) options.dateStyle = format.date\n if (\"time\" in format) options.timeStyle = format.time\n }\n\n const formatter = new Intl.DateTimeFormat(locale, options)\n const segments = formatter.formatToParts(new Date(specDate)).map(normStr)\n const hourTypeSegments = formatter\n .formatToParts(new Date(\"1999-04-05T23:05:01.000Z\"))\n .map(normStr)\n const hourPart = hourTypeSegments.find((segment) => segment.type === \"hour\")\n const hourType = hourPart && hourPart.value === \"23\" ? 24 : 12\n return segments\n .map((part): Part | undefined => {\n const partName = part.type\n const formatPattern = guessPattern(\n part.type,\n part.value,\n locale,\n part.type === \"hour\" ? hourType : undefined,\n options\n )\n if (formatPattern === undefined) return\n const partValue = formatPattern[1][partName]\n if (!partValue) return\n if (!formatPattern[2])\n formatPattern[2] = new RegExp(`${formatPattern[0]}`, \"g\")\n return {\n option: { [partName]: partValue },\n partName,\n partValue,\n token: formatPattern[0],\n pattern: formatPattern[2],\n hour12: hourType === 12,\n }\n })\n .filter((part): part is Part => !!part)\n}\n\n/**\n * Attempts to guess the correct part value type for a given dateStyle. For\n * example a month of 02 would be \"2-digit\".\n *\n * @param partName - The part name to guess for, like 'year' or 'month'\n * @param partValue - The current value, it is assumed this is the smallest denom.\n */\nfunction guessPattern<T extends Intl.DateTimeFormatPartTypes>(\n partName: T,\n partValue: string,\n locale: string,\n hour: T extends \"hour\" ? 12 | 24 : undefined,\n options: Intl.DateTimeFormatOptions\n): FormatPattern | undefined {\n const l = partValue.length\n const n = !isNaN(Number(partValue))\n let style: NamedFormatOption | undefined\n /* eslint-disable @typescript-eslint/no-non-null-assertion */\n switch (partName) {\n case \"year\":\n return l === 2 ? tokens.get(\"YY\") : tokens.get(\"YYYY\")\n case \"month\":\n if (n) return l === 1 ? tokens.get(\"M\") : tokens.get(\"MM\")\n style = partStyle(locale, partName, partValue)\n switch (style) {\n case \"long\":\n return tokens.get(\"MMMM\")\n default:\n return tokens.get(\"MMM\")\n }\n case \"day\":\n return l === 1 ? tokens.get(\"D\") : tokens.get(\"DD\")\n case \"weekday\":\n style = partStyle(locale, partName, partValue)\n switch (style) {\n case \"narrow\":\n return tokens.get(\"d\")\n case \"short\":\n return tokens.get(\"ddd\")\n default:\n return tokens.get(\"dddd\")\n }\n case \"hour\":\n // Need to distinguish the locale’s default as 24 or 12 hour.\n if (hour === 12) return l === 1 ? tokens.get(\"h\") : tokens.get(\"hh\")\n return l === 1 ? tokens.get(\"H\") : tokens.get(\"HH\")\n case \"minute\":\n return l === 1 ? tokens.get(\"m\") : tokens.get(\"mm\")\n case \"second\":\n return l === 1 ? tokens.get(\"s\") : tokens.get(\"ss\")\n case \"dayPeriod\":\n return /^[A-Z]+$/u.test(partValue) ? tokens.get(\"A\") : tokens.get(\"a\")\n case \"literal\":\n return [partValue, { literal: partValue }, new RegExp(\"\")]\n case \"timeZoneName\":\n return options.timeStyle === \"full\" ? tokens.get(\"Z\") : tokens.get(\"ZZ\")\n default:\n return undefined\n }\n /* eslint-enable @typescript-eslint/no-non-null-assertion */\n}\n\n/**\n * Determines what \"style\" a given part is in. For example, if you provide:\n * ```js\n * partStyle('en', 'month', 'Jan')\n * // returns \"short\".\n * ```\n * Part styles are always expected to be \"genitive\" — for use in \"dateStyle\".\n * @param locale - Locale string\n * @param part - The part to attempt a lookup on\n * @param value - The value of a given part.\n */\nfunction partStyle(\n locale: string,\n part: keyof NamedFormats,\n value: string\n): NamedFormatOption | undefined {\n if (!memoParts.has(locale)) {\n const date = new Date(specDate)\n const weekdays = [3, 8, 9, 7, 6, 4, 3]\n const parts = [\"weekday\", \"month\", \"dayPeriod\"]\n const partStyles: NamedFormatOption[] = [\"long\", \"short\", \"narrow\"]\n const formats: Partial<NamedFormats> = {}\n for (let i = 0; i < 12; i++) {\n date.setMonth(0 + i)\n if (i in weekdays) date.setDate(weekdays[i])\n date.setUTCHours(8 + i)\n for (const style of partStyles) {\n const segments = new Intl.DateTimeFormat(\n locale,\n parts.reduce(\n (options, part) => Object.assign(options, { [part]: style }),\n { hour12: true, timeZone: \"UTC\" }\n )\n )\n .formatToParts(date)\n .map(normStr)\n if (style === \"long\" || style === \"short\") {\n const genitiveFormattedParts = new Intl.DateTimeFormat(locale, {\n dateStyle: style === \"short\" ? \"medium\" : \"long\",\n timeZone: \"UTC\",\n })\n .formatToParts(date)\n .map(normStr)\n const genitiveMonth = genitiveFormattedParts.find(\n (part) => part.type === \"month\"\n )\n const index = segments.findIndex((part) => part.type === \"month\")\n if (index > -1 && genitiveMonth) segments[index] = genitiveMonth\n }\n segments.forEach((part) => {\n if (part.type === \"literal\") return\n const type = part.type as keyof NamedFormats\n formats[type] = Object.assign(formats[type] || {}, {\n [part.value]: style,\n })\n })\n }\n }\n memoParts.set(locale, formats as NamedFormats)\n }\n const formats = memoParts.get(locale)\n return formats ? formats[part][value] : undefined\n}\n"],"mappings":";AAAA;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AAkBA,SAAS,MAAM,QAAgB,QAAwB;AAC5D,MAAI,OAAO,SAAS,MAAqB,KAAK,OAAO,WAAW,UAAU;AACxE,WAAO,WAAW,QAAwC,MAAM;AAAA,EAClE;AACA,MAAI,IAAI;AACR,MAAI,QAAQ;AACZ,QAAM,cAAc,CAAC,YAA2B;AAC9C,QAAI,CAAC,QAAQ,CAAC;AAAG,cAAQ,CAAC,IAAI,IAAI,OAAO,QAAQ,QAAQ,CAAC,CAAC,KAAK,GAAG;AACnE,QAAI,QAAQ,CAAC,EAAE,KAAK,CAAC,GAAG;AACtB,UAAI,SAAS;AACb,UAAI,EAAE,QAAQ,QAAQ,CAAC,GAAG,CAAC,GAAG,QAAQ,gBAAgB;AACpD,YAAI,WAAW;AAAM,iBAAO;AAC5B,eAAO,GAAG,OAAO,WAAW,WAAW,SAAS,EAAE,KAChD,WAAW,QAAQ,OACrB;AAAA,MACF,CAAC;AACD,aAAO,CAAC,CAAC;AAAA,IACX;AACA,WAAO;AAAA,EACT;AAEA,WAAS,SAAS,UAA0B;AAC1C,UAAMA,SAAQ,SAAS,IAAI,CAAC,SAAS,KAAK,QAAQ;AAClD,UAAM,UAAU,IAAI,IAAIA,MAAK;AAC7B,QAAIA,OAAM,SAAS,QAAQ,MAAM;AAC/B,YAAM,IAAI,MAAM,6BAA6B;AAAA,IAC/C;AACA,WAAO;AAAA,EACT;AAEA,WAAS,WACP,QACA,CAAC,OAAO,QAAQ,GAAG,GACb;AACN,UAAM,WAAW,OAAO,KAAK,MAAM,EAAE,CAAC;AACtC,UAAM,YAAY,OAAO,QAAQ;AACjC,WAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,SAAS;AAAA,MACT;AAAA,IACF;AAAA,EACF;AAEA,QAAM,kBAAkB,cACrB,OAAO,WAAW,EAClB,OAAO,QAAQ,OAAO,WAAW,CAAC,EAClC,IAAI,WAAW,KAAK,MAAM,KAAK,CAAC;AAGnC,QAAMA,SAAQ;AAAA,IACZ,gBAAgB;AAAA,MACd,QAAQ,OAAO,WAAW,EAAE,IAAI,WAAW,KAAK,MAAM,IAAI,CAAC;AAAA,IAC7D;AAAA,EACF;AACA,QAAM,eAAe;AACrB,SAAO,EACJ,MAAM,aAAa,EACnB,IAAI,CAACC,WAAwB;AAC5B,UAAM,WAAWA,OAAM,MAAM,YAAY;AACzC,QAAI,UAAU;AACZ,aAAOD,OAAM,OAAO,SAAS,CAAC,CAAC,CAAC;AAAA,IAClC;AACA,WAAO;AAAA,MACL,QAAQ,EAAE,SAASC,OAAM;AAAA,MACzB,UAAU;AAAA,MACV,WAAWA;AAAA,MACX,OAAOA;AAAA,MACP,SAAS,IAAI,OAAO,EAAE;AAAA,MACtB,QAAQ;AAAA,IACV;AAAA,EACF,CAAC,EACA,OAAO,CAAC,SAAS,EAAE,KAAK,aAAa,aAAa,KAAK,cAAc,GAAG;AAC7E;AAOA,SAAS,WACP,QACA,QACQ;AACR,QAAM,UAAsC;AAAA,IAC1C,UAAU;AAAA,EACZ;AACA,MAAI,OAAO,WAAW,UAAU;AAC9B,YAAQ,YAAY;AAAA,EACtB,OAAO;AACL,QAAI,UAAU;AAAQ,cAAQ,YAAY,OAAO;AACjD,QAAI,UAAU;AAAQ,cAAQ,YAAY,OAAO;AAAA,EACnD;AAEA,QAAM,YAAY,IAAI,KAAK,eAAe,QAAQ,OAAO;AACzD,QAAM,WAAW,UAAU,cAAc,IAAI,KAAK,QAAQ,CAAC,EAAE,IAAI,OAAO;AACxE,QAAM,mBAAmB,UACtB,cAAc,oBAAI,KAAK,0BAA0B,CAAC,EAClD,IAAI,OAAO;AACd,QAAM,WAAW,iBAAiB,KAAK,CAAC,YAAY,QAAQ,SAAS,MAAM;AAC3E,QAAM,WAAW,YAAY,SAAS,UAAU,OAAO,KAAK;AAC5D,SAAO,SACJ,IAAI,CAAC,SAA2B;AAC/B,UAAM,WAAW,KAAK;AACtB,UAAM,gBAAgB;AAAA,MACpB,KAAK;AAAA,MACL,KAAK;AAAA,MACL;AAAA,MACA,KAAK,SAAS,SAAS,WAAW;AAAA,MAClC;AAAA,IACF;AACA,QAAI,kBAAkB;AAAW;AACjC,UAAM,YAAY,cAAc,CAAC,EAAE,QAAQ;AAC3C,QAAI,CAAC;AAAW;AAChB,QAAI,CAAC,cAAc,CAAC;AAClB,oBAAc,CAAC,IAAI,IAAI,OAAO,GAAG,cAAc,CAAC,CAAC,IAAI,GAAG;AAC1D,WAAO;AAAA,MACL,QAAQ,EAAE,CAAC,QAAQ,GAAG,UAAU;AAAA,MAChC;AAAA,MACA;AAAA,MACA,OAAO,cAAc,CAAC;AAAA,MACtB,SAAS,cAAc,CAAC;AAAA,MACxB,QAAQ,aAAa;AAAA,IACvB;AAAA,EACF,CAAC,EACA,OAAO,CAAC,SAAuB,CAAC,CAAC,IAAI;AAC1C;AASA,SAAS,aACP,UACA,WACA,QACA,MACA,SAC2B;AAC3B,QAAM,IAAI,UAAU;AACpB,QAAM,IAAI,CAAC,MAAM,OAAO,SAAS,CAAC;AAClC,MAAI;AAEJ,UAAQ,UAAU;AAAA,IAChB,KAAK;AACH,aAAO,MAAM,IAAI,OAAO,IAAI,IAAI,IAAI,OAAO,IAAI,MAAM;AAAA,IACvD,KAAK;AACH,UAAI;AAAG,eAAO,MAAM,IAAI,OAAO,IAAI,GAAG,IAAI,OAAO,IAAI,IAAI;AACzD,cAAQ,UAAU,QAAQ,UAAU,SAAS;AAC7C,cAAQ,OAAO;AAAA,QACb,KAAK;AACH,iBAAO,OAAO,IAAI,MAAM;AAAA,QAC1B;AACE,iBAAO,OAAO,IAAI,KAAK;AAAA,MAC3B;AAAA,IACF,KAAK;AACH,aAAO,MAAM,IAAI,OAAO,IAAI,GAAG,IAAI,OAAO,IAAI,IAAI;AAAA,IACpD,KAAK;AACH,cAAQ,UAAU,QAAQ,UAAU,SAAS;AAC7C,cAAQ,OAAO;AAAA,QACb,KAAK;AACH,iBAAO,OAAO,IAAI,GAAG;AAAA,QACvB,KAAK;AACH,iBAAO,OAAO,IAAI,KAAK;AAAA,QACzB;AACE,iBAAO,OAAO,IAAI,MAAM;AAAA,MAC5B;AAAA,IACF,KAAK;AAEH,UAAI,SAAS;AAAI,eAAO,MAAM,IAAI,OAAO,IAAI,GAAG,IAAI,OAAO,IAAI,IAAI;AACnE,aAAO,MAAM,IAAI,OAAO,IAAI,GAAG,IAAI,OAAO,IAAI,IAAI;AAAA,IACpD,KAAK;AACH,aAAO,MAAM,IAAI,OAAO,IAAI,GAAG,IAAI,OAAO,IAAI,IAAI;AAAA,IACpD,KAAK;AACH,aAAO,MAAM,IAAI,OAAO,IAAI,GAAG,IAAI,OAAO,IAAI,IAAI;AAAA,IACpD,KAAK;AACH,aAAO,YAAY,KAAK,SAAS,IAAI,OAAO,IAAI,GAAG,IAAI,OAAO,IAAI,GAAG;AAAA,IACvE,KAAK;AACH,aAAO,CAAC,WAAW,EAAE,SAAS,UAAU,GAAG,IAAI,OAAO,EAAE,CAAC;AAAA,IAC3D,KAAK;AACH,aAAO,QAAQ,cAAc,SAAS,OAAO,IAAI,GAAG,IAAI,OAAO,IAAI,IAAI;AAAA,IACzE;AACE,aAAO;AAAA,EACX;AAEF;AAaA,SAAS,UACP,QACA,MACA,OAC+B;AAC/B,MAAI,CAAC,UAAU,IAAI,MAAM,GAAG;AAC1B,UAAM,OAAO,IAAI,KAAK,QAAQ;AAC9B,UAAM,WAAW,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC;AACrC,UAAMD,SAAQ,CAAC,WAAW,SAAS,WAAW;AAC9C,UAAM,aAAkC,CAAC,QAAQ,SAAS,QAAQ;AAClE,UAAME,WAAiC,CAAC;AACxC,aAAS,IAAI,GAAG,IAAI,IAAI,KAAK;AAC3B,WAAK,SAAS,IAAI,CAAC;AACnB,UAAI,KAAK;AAAU,aAAK,QAAQ,SAAS,CAAC,CAAC;AAC3C,WAAK,YAAY,IAAI,CAAC;AACtB,iBAAW,SAAS,YAAY;AAC9B,cAAM,WAAW,IAAI,KAAK;AAAA,UACxB;AAAA,UACAF,OAAM;AAAA,YACJ,CAAC,SAASG,UAAS,OAAO,OAAO,SAAS,EAAE,CAACA,KAAI,GAAG,MAAM,CAAC;AAAA,YAC3D,EAAE,QAAQ,MAAM,UAAU,MAAM;AAAA,UAClC;AAAA,QACF,EACG,cAAc,IAAI,EAClB,IAAI,OAAO;AACd,YAAI,UAAU,UAAU,UAAU,SAAS;AACzC,gBAAM,yBAAyB,IAAI,KAAK,eAAe,QAAQ;AAAA,YAC7D,WAAW,UAAU,UAAU,WAAW;AAAA,YAC1C,UAAU;AAAA,UACZ,CAAC,EACE,cAAc,IAAI,EAClB,IAAI,OAAO;AACd,gBAAM,gBAAgB,uBAAuB;AAAA,YAC3C,CAACA,UAASA,MAAK,SAAS;AAAA,UAC1B;AACA,gBAAM,QAAQ,SAAS,UAAU,CAACA,UAASA,MAAK,SAAS,OAAO;AAChE,cAAI,QAAQ,MAAM;AAAe,qBAAS,KAAK,IAAI;AAAA,QACrD;AACA,iBAAS,QAAQ,CAACA,UAAS;AACzB,cAAIA,MAAK,SAAS;AAAW;AAC7B,gBAAM,OAAOA,MAAK;AAClB,UAAAD,SAAQ,IAAI,IAAI,OAAO,OAAOA,SAAQ,IAAI,KAAK,CAAC,GAAG;AAAA,YACjD,CAACC,MAAK,KAAK,GAAG;AAAA,UAChB,CAAC;AAAA,QACH,CAAC;AAAA,MACH;AAAA,IACF;AACA,cAAU,IAAI,QAAQD,QAAuB;AAAA,EAC/C;AACA,QAAM,UAAU,UAAU,IAAI,MAAM;AACpC,SAAO,UAAU,QAAQ,IAAI,EAAE,KAAK,IAAI;AAC1C;","names":["parts","match","formats","part"]}
|
|
1
|
+
{"version":3,"sources":["../src/parts.ts"],"sourcesContent":["import {\n styles,\n normStr,\n tokens,\n memoParts,\n clockAgnostic,\n clock24,\n specDate,\n clock12,\n fractionalSeconds,\n} from \"./common\"\nimport type {\n ParseOptions,\n Format,\n Part,\n FormatStyle,\n FormatStyleObj,\n FormatPattern,\n NamedFormats,\n NamedFormatOption,\n} from \"./types\"\n/**\n * Given a format string, produce an array of matching \"parts\", each part\n * contains a regular expression and the corresponding\n * Intl.DateTimeFormatPartTypesRegistry key/value.\n * @param format - A format string like MM/DD/YYYY\n * @param locale - The locale to parse for.\n */\nexport function parts(format: Format, locale: string): Part[] {\n if (styles.includes(format as FormatStyle) || typeof format === \"object\") {\n return styleParts(format as FormatStyle | FormatStyleObj, locale)\n }\n let f = format\n let match = 0\n const testPattern = (pattern: FormatPattern) => {\n if (!pattern[2]) pattern[2] = new RegExp(`(.)?(${pattern[0]})`, \"g\")\n if (pattern[2].test(f)) {\n let didAdd = 0\n f = f.replace(pattern[2], (_, prefix, actualMatch) => {\n if (prefix === \"\\\\\") return actualMatch\n return `${typeof prefix === \"string\" ? prefix : \"\"}{!${\n didAdd++ ? match : match++\n }!}`\n })\n return !!didAdd\n }\n return false\n }\n\n function validate(patterns: Part[]): Part[] {\n const parts = patterns.map((part) => part.partName)\n const deduped = new Set(parts)\n if (parts.length > deduped.size) {\n throw new Error(`Cannot reuse format tokens.`)\n }\n return patterns\n }\n\n function createPart(\n hour12: boolean,\n [token, option, exp]: FormatPattern\n ): Part {\n const partName = Object.keys(option)[0] as Intl.DateTimeFormatPartTypes\n const partValue = option[partName] as string\n return {\n option,\n partName,\n partValue,\n token,\n pattern: exp as RegExp,\n hour12,\n }\n }\n\n const found24Patterns = clockAgnostic\n .filter(testPattern)\n .concat(clock24.filter(testPattern))\n .concat(fractionalSeconds.filter(testPattern))\n .map(createPart.bind(null, false))\n\n // Reset the format before re-checking\n const parts = validate(\n found24Patterns.concat(\n clock12.filter(testPattern).map(createPart.bind(null, true))\n )\n )\n const extractIndex = /^\\{!(\\d+)!\\}$/\n return f\n .split(/(\\{!\\d+!\\})/)\n .map((match: string): Part => {\n const hasIndex = match.match(extractIndex)\n if (hasIndex) {\n return parts[Number(hasIndex[1])]\n }\n return {\n option: { literal: match },\n partName: \"literal\",\n partValue: match,\n token: match,\n pattern: new RegExp(\"\"),\n hour12: false,\n }\n })\n .filter((part) => !(part.partName === \"literal\" && part.partValue === \"\"))\n}\n\n/**\n * Determines the parts in a native date style, like \"full\".\n * @param format - A date style like \"full\" or \"short\"\n * @param locale - The locale string\n */\nfunction styleParts(\n format: FormatStyle | FormatStyleObj,\n locale: string\n): Part[] {\n const options: Intl.DateTimeFormatOptions = {\n timeZone: \"UTC\",\n }\n if (typeof format === \"string\") {\n options.dateStyle = format\n } else {\n if (\"date\" in format) options.dateStyle = format.date\n if (\"time\" in format) options.timeStyle = format.time\n }\n\n const formatter = new Intl.DateTimeFormat(locale, options)\n const segments = formatter.formatToParts(new Date(specDate)).map(normStr)\n const hourTypeSegments = formatter\n .formatToParts(new Date(\"1999-04-05T23:05:01.000Z\"))\n .map(normStr)\n const hourPart = hourTypeSegments.find((segment) => segment.type === \"hour\")\n const hourType = hourPart && hourPart.value === \"23\" ? 24 : 12\n return segments\n .map((part): Part | undefined => {\n const partName = part.type\n const formatPattern = guessPattern(\n part.type,\n part.value,\n locale,\n part.type === \"hour\" ? hourType : undefined,\n options\n )\n if (formatPattern === undefined) return\n const partValue = formatPattern[1][partName]\n if (!partValue) return\n if (!formatPattern[2])\n formatPattern[2] = new RegExp(`${formatPattern[0]}`, \"g\")\n return {\n option: { [partName]: partValue },\n partName,\n partValue,\n token: formatPattern[0],\n pattern: formatPattern[2],\n hour12: hourType === 12,\n }\n })\n .filter((part): part is Part => !!part)\n}\n\n/**\n * Attempts to guess the correct part value type for a given dateStyle. For\n * example a month of 02 would be \"2-digit\".\n *\n * @param partName - The part name to guess for, like 'year' or 'month'\n * @param partValue - The current value, it is assumed this is the smallest denom.\n */\nfunction guessPattern<T extends Intl.DateTimeFormatPartTypes>(\n partName: T,\n partValue: string,\n locale: string,\n hour: T extends \"hour\" ? 12 | 24 : undefined,\n options: Intl.DateTimeFormatOptions\n): FormatPattern | undefined {\n const l = partValue.length\n const n = !isNaN(Number(partValue))\n let style: NamedFormatOption | undefined\n /* eslint-disable @typescript-eslint/no-non-null-assertion */\n switch (partName) {\n case \"year\":\n return l === 2 ? tokens.get(\"YY\") : tokens.get(\"YYYY\")\n case \"month\":\n if (n) return l === 1 ? tokens.get(\"M\") : tokens.get(\"MM\")\n style = partStyle(locale, partName, partValue)\n switch (style) {\n case \"long\":\n return tokens.get(\"MMMM\")\n default:\n return tokens.get(\"MMM\")\n }\n case \"day\":\n return l === 1 ? tokens.get(\"D\") : tokens.get(\"DD\")\n case \"weekday\":\n style = partStyle(locale, partName, partValue)\n switch (style) {\n case \"narrow\":\n return tokens.get(\"d\")\n case \"short\":\n return tokens.get(\"ddd\")\n default:\n return tokens.get(\"dddd\")\n }\n case \"hour\":\n // Need to distinguish the locale’s default as 24 or 12 hour.\n if (hour === 12) return l === 1 ? tokens.get(\"h\") : tokens.get(\"hh\")\n return l === 1 ? tokens.get(\"H\") : tokens.get(\"HH\")\n case \"minute\":\n return l === 1 ? tokens.get(\"m\") : tokens.get(\"mm\")\n case \"second\":\n return l === 1 ? tokens.get(\"s\") : tokens.get(\"ss\")\n case \"dayPeriod\":\n return /^[A-Z]+$/u.test(partValue) ? tokens.get(\"A\") : tokens.get(\"a\")\n case \"literal\":\n return [partValue, { literal: partValue }, new RegExp(\"\")]\n case \"timeZoneName\":\n return options.timeStyle === \"full\" ? tokens.get(\"Z\") : tokens.get(\"ZZ\")\n default:\n return undefined\n }\n /* eslint-enable @typescript-eslint/no-non-null-assertion */\n}\n\n/**\n * Determines what \"style\" a given part is in. For example, if you provide:\n * ```js\n * partStyle('en', 'month', 'Jan')\n * // returns \"short\".\n * ```\n * Part styles are always expected to be \"genitive\" — for use in \"dateStyle\".\n * @param locale - Locale string\n * @param part - The part to attempt a lookup on\n * @param value - The value of a given part.\n */\nfunction partStyle(\n locale: string,\n part: keyof NamedFormats,\n value: string\n): NamedFormatOption | undefined {\n if (!memoParts.has(locale)) {\n const date = new Date(specDate)\n const weekdays = [3, 8, 9, 7, 6, 4, 3]\n const parts = [\"weekday\", \"month\", \"dayPeriod\"]\n const partStyles: NamedFormatOption[] = [\"long\", \"short\", \"narrow\"]\n const formats: Partial<NamedFormats> = {}\n for (let i = 0; i < 12; i++) {\n date.setMonth(0 + i)\n if (i in weekdays) date.setDate(weekdays[i])\n date.setUTCHours(8 + i)\n for (const style of partStyles) {\n const segments = new Intl.DateTimeFormat(\n locale,\n parts.reduce(\n (options, part) => Object.assign(options, { [part]: style }),\n { hour12: true, timeZone: \"UTC\" }\n )\n )\n .formatToParts(date)\n .map(normStr)\n if (style === \"long\" || style === \"short\") {\n const genitiveFormattedParts = new Intl.DateTimeFormat(locale, {\n dateStyle: style === \"short\" ? \"medium\" : \"long\",\n timeZone: \"UTC\",\n })\n .formatToParts(date)\n .map(normStr)\n const genitiveMonth = genitiveFormattedParts.find(\n (part) => part.type === \"month\"\n )\n const index = segments.findIndex((part) => part.type === \"month\")\n if (index > -1 && genitiveMonth) segments[index] = genitiveMonth\n }\n segments.forEach((part) => {\n if (part.type === \"literal\") return\n const type = part.type as keyof NamedFormats\n formats[type] = Object.assign(formats[type] || {}, {\n [part.value]: style,\n })\n })\n }\n }\n memoParts.set(locale, formats as NamedFormats)\n }\n const formats = memoParts.get(locale)\n return formats ? formats[part][value] : undefined\n}\n"],"mappings":"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","names":["parts","match","formats","part"]}
|
package/dist/range.mjs
CHANGED
|
@@ -3,8 +3,7 @@ import { format } from "./format.mjs";
|
|
|
3
3
|
import { ap } from "./ap.mjs";
|
|
4
4
|
function range(token, locale = "en", genitive = false) {
|
|
5
5
|
const r = (n, c) => Array(n).fill("").map((_, i) => `${c(i)}`);
|
|
6
|
-
if (token === "M")
|
|
7
|
-
return r(12, (i) => i + 1);
|
|
6
|
+
if (token === "M") return r(12, (i) => i + 1);
|
|
8
7
|
if (token === "MM")
|
|
9
8
|
return r(12, (i) => {
|
|
10
9
|
const m = i + 1;
|
package/dist/range.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/range.ts"],"sourcesContent":["import { format } from \"./format\"\nimport { ap } from \"./ap\"\nimport type { FormatToken } from \"./types\"\n/**\n * Returns an array of options for a given token in a given locale.\n * @param token - Get the full range of options for a given token\n * @param locale - The locale to fetch the options for.\n */\nexport function range(\n token: FormatToken,\n locale = \"en\",\n genitive = false\n): string[] {\n const r: (n: number, c: (index: number) => string | number) => string[] = (\n n,\n c\n ) =>\n Array(n)\n .fill(\"\")\n .map((_, i) => `${c(i)}`)\n\n if (token === \"M\") return r(12, (i) => i + 1)\n if (token === \"MM\")\n return r(12, (i) => {\n const m = i + 1\n return m < 10 ? `0${m}` : m\n })\n // MMM and MMMM\n if (token.startsWith(\"M\"))\n return range(\"MM\").map((m) =>\n format(`2000-${m}-05`, token, locale, genitive)\n )\n if (token.startsWith(\"d\"))\n return r(7, (i) => `0${i + 2}`).map((d) =>\n format(`2022-10-${d}`, token, locale)\n )\n if (token === \"a\")\n return [ap(\"am\", locale).toLowerCase(), ap(\"pm\", locale).toLowerCase()]\n if (token === \"A\")\n return [ap(\"am\", locale).toUpperCase(), ap(\"pm\", locale).toUpperCase()]\n if (token.startsWith(\"Y\")) {\n const year = new Date().getFullYear()\n return r(120, (i) => i + 1).reduce(\n (ranges, i) => {\n if (i !== \"120\")\n ranges.push(format(`${year + Number(i)}-06-06`, token, locale))\n ranges.unshift(format(`${year - Number(i)}-06-06`, token, locale))\n return ranges\n },\n [format(`${year}-06-06`, token, locale)]\n )\n }\n if (token.startsWith(\"D\"))\n return r(31, (i) => `${token === \"DD\" && i < 9 ? \"0\" : \"\"}${i + 1}`)\n if (token.startsWith(\"H\"))\n return r(24, (i) => `${token === \"HH\" && i < 10 ? \"0\" : \"\"}${i}`)\n if (token.startsWith(\"h\"))\n return r(12, (i) => `${token === \"hh\" && i < 9 ? \"0\" : \"\"}${i + 1}`)\n if (token.startsWith(\"m\") || token.startsWith(\"s\"))\n return r(60, (i) => `${token.length > 1 && i < 10 ? \"0\" : \"\"}${i}`)\n return []\n}\n"],"mappings":";AAAA,SAAS,cAAc;AACvB,SAAS,UAAU;AAOZ,SAAS,MACd,OACA,SAAS,MACT,WAAW,OACD;AACV,QAAM,IAAoE,CACxE,GACA,MAEA,MAAM,CAAC,EACJ,KAAK,EAAE,EACP,IAAI,CAAC,GAAG,MAAM,GAAG,EAAE,CAAC,CAAC,EAAE;AAE5B,MAAI,UAAU
|
|
1
|
+
{"version":3,"sources":["../src/range.ts"],"sourcesContent":["import { format } from \"./format\"\nimport { ap } from \"./ap\"\nimport type { FormatToken } from \"./types\"\n/**\n * Returns an array of options for a given token in a given locale.\n * @param token - Get the full range of options for a given token\n * @param locale - The locale to fetch the options for.\n */\nexport function range(\n token: FormatToken,\n locale = \"en\",\n genitive = false\n): string[] {\n const r: (n: number, c: (index: number) => string | number) => string[] = (\n n,\n c\n ) =>\n Array(n)\n .fill(\"\")\n .map((_, i) => `${c(i)}`)\n\n if (token === \"M\") return r(12, (i) => i + 1)\n if (token === \"MM\")\n return r(12, (i) => {\n const m = i + 1\n return m < 10 ? `0${m}` : m\n })\n // MMM and MMMM\n if (token.startsWith(\"M\"))\n return range(\"MM\").map((m) =>\n format(`2000-${m}-05`, token, locale, genitive)\n )\n if (token.startsWith(\"d\"))\n return r(7, (i) => `0${i + 2}`).map((d) =>\n format(`2022-10-${d}`, token, locale)\n )\n if (token === \"a\")\n return [ap(\"am\", locale).toLowerCase(), ap(\"pm\", locale).toLowerCase()]\n if (token === \"A\")\n return [ap(\"am\", locale).toUpperCase(), ap(\"pm\", locale).toUpperCase()]\n if (token.startsWith(\"Y\")) {\n const year = new Date().getFullYear()\n return r(120, (i) => i + 1).reduce(\n (ranges, i) => {\n if (i !== \"120\")\n ranges.push(format(`${year + Number(i)}-06-06`, token, locale))\n ranges.unshift(format(`${year - Number(i)}-06-06`, token, locale))\n return ranges\n },\n [format(`${year}-06-06`, token, locale)]\n )\n }\n if (token.startsWith(\"D\"))\n return r(31, (i) => `${token === \"DD\" && i < 9 ? \"0\" : \"\"}${i + 1}`)\n if (token.startsWith(\"H\"))\n return r(24, (i) => `${token === \"HH\" && i < 10 ? \"0\" : \"\"}${i}`)\n if (token.startsWith(\"h\"))\n return r(12, (i) => `${token === \"hh\" && i < 9 ? \"0\" : \"\"}${i + 1}`)\n if (token.startsWith(\"m\") || token.startsWith(\"s\"))\n return r(60, (i) => `${token.length > 1 && i < 10 ? \"0\" : \"\"}${i}`)\n return []\n}\n"],"mappings":";AAAA,SAAS,cAAc;AACvB,SAAS,UAAU;AAOZ,SAAS,MACd,OACA,SAAS,MACT,WAAW,OACD;AACV,QAAM,IAAoE,CACxE,GACA,MAEA,MAAM,CAAC,EACJ,KAAK,EAAE,EACP,IAAI,CAAC,GAAG,MAAM,GAAG,EAAE,CAAC,CAAC,EAAE;AAE5B,MAAI,UAAU,IAAK,QAAO,EAAE,IAAI,CAAC,MAAM,IAAI,CAAC;AAC5C,MAAI,UAAU;AACZ,WAAO,EAAE,IAAI,CAAC,MAAM;AAClB,YAAM,IAAI,IAAI;AACd,aAAO,IAAI,KAAK,IAAI,CAAC,KAAK;AAAA,IAC5B,CAAC;AAEH,MAAI,MAAM,WAAW,GAAG;AACtB,WAAO,MAAM,IAAI,EAAE;AAAA,MAAI,CAAC,MACtB,OAAO,QAAQ,CAAC,OAAO,OAAO,QAAQ,QAAQ;AAAA,IAChD;AACF,MAAI,MAAM,WAAW,GAAG;AACtB,WAAO,EAAE,GAAG,CAAC,MAAM,IAAI,IAAI,CAAC,EAAE,EAAE;AAAA,MAAI,CAAC,MACnC,OAAO,WAAW,CAAC,IAAI,OAAO,MAAM;AAAA,IACtC;AACF,MAAI,UAAU;AACZ,WAAO,CAAC,GAAG,MAAM,MAAM,EAAE,YAAY,GAAG,GAAG,MAAM,MAAM,EAAE,YAAY,CAAC;AACxE,MAAI,UAAU;AACZ,WAAO,CAAC,GAAG,MAAM,MAAM,EAAE,YAAY,GAAG,GAAG,MAAM,MAAM,EAAE,YAAY,CAAC;AACxE,MAAI,MAAM,WAAW,GAAG,GAAG;AACzB,UAAM,QAAO,oBAAI,KAAK,GAAE,YAAY;AACpC,WAAO,EAAE,KAAK,CAAC,MAAM,IAAI,CAAC,EAAE;AAAA,MAC1B,CAAC,QAAQ,MAAM;AACb,YAAI,MAAM;AACR,iBAAO,KAAK,OAAO,GAAG,OAAO,OAAO,CAAC,CAAC,UAAU,OAAO,MAAM,CAAC;AAChE,eAAO,QAAQ,OAAO,GAAG,OAAO,OAAO,CAAC,CAAC,UAAU,OAAO,MAAM,CAAC;AACjE,eAAO;AAAA,MACT;AAAA,MACA,CAAC,OAAO,GAAG,IAAI,UAAU,OAAO,MAAM,CAAC;AAAA,IACzC;AAAA,EACF;AACA,MAAI,MAAM,WAAW,GAAG;AACtB,WAAO,EAAE,IAAI,CAAC,MAAM,GAAG,UAAU,QAAQ,IAAI,IAAI,MAAM,EAAE,GAAG,IAAI,CAAC,EAAE;AACrE,MAAI,MAAM,WAAW,GAAG;AACtB,WAAO,EAAE,IAAI,CAAC,MAAM,GAAG,UAAU,QAAQ,IAAI,KAAK,MAAM,EAAE,GAAG,CAAC,EAAE;AAClE,MAAI,MAAM,WAAW,GAAG;AACtB,WAAO,EAAE,IAAI,CAAC,MAAM,GAAG,UAAU,QAAQ,IAAI,IAAI,MAAM,EAAE,GAAG,IAAI,CAAC,EAAE;AACrE,MAAI,MAAM,WAAW,GAAG,KAAK,MAAM,WAAW,GAAG;AAC/C,WAAO,EAAE,IAAI,CAAC,MAAM,GAAG,MAAM,SAAS,KAAK,IAAI,KAAK,MAAM,EAAE,GAAG,CAAC,EAAE;AACpE,SAAO,CAAC;AACV;","names":[]}
|
package/dist/removeOffset.d.ts
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { MaybeDateInput } from './types.js';
|
|
2
2
|
|
|
3
3
|
/**
|
|
4
4
|
* Inverts the offset and applies it to the given date, returning a new date.
|
|
5
|
-
* @param dateInput - The date to remove the offset from.
|
|
6
|
-
* @param offset - The offset to remove in the +-HHmm or +-HH:mm format.
|
|
5
|
+
* @param [dateInput] - The date to remove the offset from. (default: current time)
|
|
6
|
+
* @param [offset] - The offset to remove in the +-HHmm or +-HH:mm format.
|
|
7
7
|
*/
|
|
8
|
-
declare function removeOffset(dateInput
|
|
8
|
+
declare function removeOffset(dateInput?: MaybeDateInput, offset?: string): Date;
|
|
9
9
|
|
|
10
10
|
export { removeOffset };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/removeOffset.ts"],"sourcesContent":["import { applyOffset } from \"./applyOffset\"\nimport type { DateInput } from \"./types\"\n\n/**\n * Inverts the offset and applies it to the given date, returning a new date.\n * @param dateInput - The date to remove the offset from
|
|
1
|
+
{"version":3,"sources":["../src/removeOffset.ts"],"sourcesContent":["import { applyOffset } from \"./applyOffset\"\nimport type { DateInput, MaybeDateInput } from \"./types\"\n\n/**\n * Inverts the offset and applies it to the given date, returning a new date.\n * @param [dateInput] - The date to remove the offset from. (default: current time)\n * @param [offset] - The offset to remove in the +-HHmm or +-HH:mm format.\n */\nexport function removeOffset(dateInput?: MaybeDateInput, offset = \"+00:00\"): Date {\n const positive = offset.slice(0, 1) === \"+\"\n return applyOffset(\n dateInput,\n offset.replace(positive ? \"+\" : \"-\", positive ? \"-\" : \"+\")\n )\n}\n"],"mappings":";AAAA,SAAS,mBAAmB;AAQrB,SAAS,aAAa,WAA4B,SAAS,UAAgB;AAChF,QAAM,WAAW,OAAO,MAAM,GAAG,CAAC,MAAM;AACxC,SAAO;AAAA,IACL;AAAA,IACA,OAAO,QAAQ,WAAW,MAAM,KAAK,WAAW,MAAM,GAAG;AAAA,EAC3D;AACF;","names":[]}
|
package/dist/sameDay.d.ts
CHANGED
|
@@ -1,10 +1,16 @@
|
|
|
1
|
-
import { DateInput } from './types.js';
|
|
1
|
+
import { DateInput, MaybeDateInput } from './types.js';
|
|
2
2
|
|
|
3
3
|
/**
|
|
4
4
|
* Checks if two date objects refer to the same date. Ignores time.
|
|
5
5
|
* @param inputDateA - First date to compare
|
|
6
|
+
* @param [inputDateB] - Second date to compare or the current time if nothing given
|
|
7
|
+
*/
|
|
8
|
+
declare function sameDay(inputDateA: DateInput, inputDateB?: MaybeDateInput): boolean;
|
|
9
|
+
/**
|
|
10
|
+
* Checks if two date objects refer to the same date. Ignores time.
|
|
11
|
+
* @param [inputDateA] - First date to compare or the current time if null given
|
|
6
12
|
* @param inputDateB - Second date to compare
|
|
7
13
|
*/
|
|
8
|
-
declare function sameDay(inputDateA:
|
|
14
|
+
declare function sameDay(inputDateA: MaybeDateInput, inputDateB: DateInput): boolean;
|
|
9
15
|
|
|
10
16
|
export { sameDay };
|
package/dist/sameDay.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/sameDay.ts"],"sourcesContent":["import { date } from \"./date\"\nimport type { DateInput } from \"./types\"\n\n/**\n * Checks if two date objects refer to the same date. Ignores time.\n * @param inputDateA - First date to compare\n * @param inputDateB - Second date to compare\n */\nexport function sameDay(inputDateA: DateInput, inputDateB: DateInput) {\n const a = date(inputDateA)\n const b = date(inputDateB)\n return (\n a.getDate() === b.getDate() &&\n a.getMonth() === b.getMonth() &&\n a.getFullYear() === b.getFullYear()\n )\n}\n"],"mappings":";AAAA,SAAS,YAAY;
|
|
1
|
+
{"version":3,"sources":["../src/sameDay.ts"],"sourcesContent":["import { date } from \"./date\"\nimport type { DateInput, MaybeDateInput } from \"./types\"\n\n/**\n * Checks if two date objects refer to the same date. Ignores time.\n * @param inputDateA - First date to compare\n * @param [inputDateB] - Second date to compare or the current time if nothing given\n */\nexport function sameDay(inputDateA: DateInput, inputDateB?: MaybeDateInput): boolean\n/**\n * Checks if two date objects refer to the same date. Ignores time.\n * @param [inputDateA] - First date to compare or the current time if null given\n * @param inputDateB - Second date to compare\n */\nexport function sameDay(inputDateA: MaybeDateInput, inputDateB: DateInput): boolean\nexport function sameDay(\n inputDateA: MaybeDateInput,\n inputDateB?: MaybeDateInput\n): boolean {\n const a = date(inputDateA)\n const b = date(inputDateB)\n return (\n a.getDate() === b.getDate() &&\n a.getMonth() === b.getMonth() &&\n a.getFullYear() === b.getFullYear()\n )\n}\n"],"mappings":";AAAA,SAAS,YAAY;AAed,SAAS,QACd,YACA,YACS;AACT,QAAM,IAAI,KAAK,UAAU;AACzB,QAAM,IAAI,KAAK,UAAU;AACzB,SACE,EAAE,QAAQ,MAAM,EAAE,QAAQ,KAC1B,EAAE,SAAS,MAAM,EAAE,SAAS,KAC5B,EAAE,YAAY,MAAM,EAAE,YAAY;AAEtC;","names":[]}
|
package/dist/sameHour.d.ts
CHANGED
|
@@ -1,10 +1,16 @@
|
|
|
1
|
-
import { DateInput } from './types.js';
|
|
1
|
+
import { DateInput, MaybeDateInput } from './types.js';
|
|
2
2
|
|
|
3
3
|
/**
|
|
4
4
|
* Checks if two date objects refer to the same time hour. Ignores date.
|
|
5
5
|
* @param inputDateA - First date to compare
|
|
6
|
+
* @param [inputDateB] - Second date to compare or the current time if nothing given
|
|
7
|
+
*/
|
|
8
|
+
declare function sameHour(inputDateA: DateInput, inputDateB?: MaybeDateInput): boolean;
|
|
9
|
+
/**
|
|
10
|
+
* Checks if two date objects refer to the same time hour. Ignores date.
|
|
11
|
+
* @param [inputDateA] - First date to compare or the current time if null given
|
|
6
12
|
* @param inputDateB - Second date to compare
|
|
7
13
|
*/
|
|
8
|
-
declare function sameHour(inputDateA:
|
|
14
|
+
declare function sameHour(inputDateA: MaybeDateInput, inputDateB: DateInput): boolean;
|
|
9
15
|
|
|
10
16
|
export { sameHour };
|
package/dist/sameHour.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/sameHour.ts"],"sourcesContent":["import { date } from \"./date\"\nimport type { DateInput } from \"./types\"\n\n/**\n * Checks if two date objects refer to the same time hour. Ignores date.\n * @param inputDateA - First date to compare\n * @param inputDateB - Second date to compare\n */\nexport function sameHour(inputDateA: DateInput, inputDateB: DateInput) {\n const a = date(inputDateA)\n const b = date(inputDateB)\n return a.getHours() === b.getHours()\n}\n"],"mappings":";AAAA,SAAS,YAAY;
|
|
1
|
+
{"version":3,"sources":["../src/sameHour.ts"],"sourcesContent":["import { date } from \"./date\"\nimport type { DateInput, MaybeDateInput } from \"./types\"\n\n/**\n * Checks if two date objects refer to the same time hour. Ignores date.\n * @param inputDateA - First date to compare\n * @param [inputDateB] - Second date to compare or the current time if nothing given\n */\nexport function sameHour(inputDateA: DateInput, inputDateB?: MaybeDateInput): boolean\n/**\n * Checks if two date objects refer to the same time hour. Ignores date.\n * @param [inputDateA] - First date to compare or the current time if null given\n * @param inputDateB - Second date to compare\n */\nexport function sameHour(inputDateA: MaybeDateInput, inputDateB: DateInput): boolean\nexport function sameHour(\n inputDateA: MaybeDateInput,\n inputDateB?: MaybeDateInput\n): boolean {\n const a = date(inputDateA)\n const b = date(inputDateB)\n return a.getHours() === b.getHours()\n}\n"],"mappings":";AAAA,SAAS,YAAY;AAed,SAAS,SACd,YACA,YACS;AACT,QAAM,IAAI,KAAK,UAAU;AACzB,QAAM,IAAI,KAAK,UAAU;AACzB,SAAO,EAAE,SAAS,MAAM,EAAE,SAAS;AACrC;","names":[]}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { DateInput, MaybeDateInput } from './types.js';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Checks if two date objects refer to the same millisecond. Ignores date.
|
|
5
|
+
* @param inputDateA - First date to compare
|
|
6
|
+
* @param [inputDateB] - Second date to compare or the current time if nothing given
|
|
7
|
+
*/
|
|
8
|
+
declare function sameMillisecond(inputDateA: DateInput, inputDateB?: MaybeDateInput): boolean;
|
|
9
|
+
/**
|
|
10
|
+
* Checks if two date objects refer to the same millisecond. Ignores date.
|
|
11
|
+
* @param [inputDateA] - First date to compare or the current time if null given
|
|
12
|
+
* @param inputDateB - Second date to compare
|
|
13
|
+
*/
|
|
14
|
+
declare function sameMillisecond(inputDateA: MaybeDateInput, inputDateB: DateInput): boolean;
|
|
15
|
+
|
|
16
|
+
export { sameMillisecond };
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
// src/sameMillisecond.ts
|
|
2
|
+
import { date } from "./date.mjs";
|
|
3
|
+
function sameMillisecond(inputDateA, inputDateB) {
|
|
4
|
+
const a = date(inputDateA);
|
|
5
|
+
const b = date(inputDateB);
|
|
6
|
+
return a.getMilliseconds() === b.getMilliseconds();
|
|
7
|
+
}
|
|
8
|
+
export {
|
|
9
|
+
sameMillisecond
|
|
10
|
+
};
|
|
11
|
+
//# sourceMappingURL=sameMillisecond.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/sameMillisecond.ts"],"sourcesContent":["import { date } from \"./date\"\nimport type { DateInput, MaybeDateInput } from \"./types\"\n\n/**\n * Checks if two date objects refer to the same millisecond. Ignores date.\n * @param inputDateA - First date to compare\n * @param [inputDateB] - Second date to compare or the current time if nothing given\n */\nexport function sameMillisecond(inputDateA: DateInput, inputDateB?: MaybeDateInput): boolean\n/**\n * Checks if two date objects refer to the same millisecond. Ignores date.\n * @param [inputDateA] - First date to compare or the current time if null given\n * @param inputDateB - Second date to compare\n */\nexport function sameMillisecond(inputDateA: MaybeDateInput, inputDateB: DateInput): boolean\nexport function sameMillisecond(\n inputDateA: MaybeDateInput,\n inputDateB?: MaybeDateInput\n): boolean {\n const a = date(inputDateA)\n const b = date(inputDateB)\n return a.getMilliseconds() === b.getMilliseconds()\n}\n"],"mappings":";AAAA,SAAS,YAAY;AAed,SAAS,gBACd,YACA,YACS;AACT,QAAM,IAAI,KAAK,UAAU;AACzB,QAAM,IAAI,KAAK,UAAU;AACzB,SAAO,EAAE,gBAAgB,MAAM,EAAE,gBAAgB;AACnD;","names":[]}
|
package/dist/sameMinute.d.ts
CHANGED
|
@@ -1,10 +1,16 @@
|
|
|
1
|
-
import { DateInput } from './types.js';
|
|
1
|
+
import { DateInput, MaybeDateInput } from './types.js';
|
|
2
2
|
|
|
3
3
|
/**
|
|
4
4
|
* Checks if two date objects refer to the same time minutes. Ignores date.
|
|
5
5
|
* @param inputDateA - First date to compare
|
|
6
|
+
* @param [inputDateB] - Second date to compare or the current time if nothing given
|
|
7
|
+
*/
|
|
8
|
+
declare function sameMinute(inputDateA: DateInput, inputDateB?: MaybeDateInput): boolean;
|
|
9
|
+
/**
|
|
10
|
+
* Checks if two date objects refer to the same time minutes. Ignores date.
|
|
11
|
+
* @param [inputDateA] - First date to compare or the current time if null given
|
|
6
12
|
* @param inputDateB - Second date to compare
|
|
7
13
|
*/
|
|
8
|
-
declare function sameMinute(inputDateA:
|
|
14
|
+
declare function sameMinute(inputDateA: MaybeDateInput, inputDateB: DateInput): boolean;
|
|
9
15
|
|
|
10
16
|
export { sameMinute };
|
package/dist/sameMinute.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/sameMinute.ts"],"sourcesContent":["import { date } from \"./date\"\nimport type { DateInput } from \"./types\"\n\n/**\n * Checks if two date objects refer to the same time minutes. Ignores date.\n * @param inputDateA - First date to compare\n * @param inputDateB - Second date to compare\n */\nexport function sameMinute(inputDateA: DateInput, inputDateB: DateInput) {\n const a = date(inputDateA)\n const b = date(inputDateB)\n return a.getMinutes() === b.getMinutes()\n}\n"],"mappings":";AAAA,SAAS,YAAY;
|
|
1
|
+
{"version":3,"sources":["../src/sameMinute.ts"],"sourcesContent":["import { date } from \"./date\"\nimport type { DateInput, MaybeDateInput } from \"./types\"\n\n/**\n * Checks if two date objects refer to the same time minutes. Ignores date.\n * @param inputDateA - First date to compare\n * @param [inputDateB] - Second date to compare or the current time if nothing given\n */\nexport function sameMinute(inputDateA: DateInput, inputDateB?: MaybeDateInput): boolean\n/**\n * Checks if two date objects refer to the same time minutes. Ignores date.\n * @param [inputDateA] - First date to compare or the current time if null given\n * @param inputDateB - Second date to compare\n */\nexport function sameMinute(inputDateA: MaybeDateInput, inputDateB: DateInput): boolean\nexport function sameMinute(\n inputDateA: MaybeDateInput,\n inputDateB?: MaybeDateInput\n): boolean {\n const a = date(inputDateA)\n const b = date(inputDateB)\n return a.getMinutes() === b.getMinutes()\n}\n"],"mappings":";AAAA,SAAS,YAAY;AAed,SAAS,WACd,YACA,YACS;AACT,QAAM,IAAI,KAAK,UAAU;AACzB,QAAM,IAAI,KAAK,UAAU;AACzB,SAAO,EAAE,WAAW,MAAM,EAAE,WAAW;AACzC;","names":[]}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { DateInput, MaybeDateInput } from './types.js';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Checks if two date objects refer to the same time minutes. Ignores date.
|
|
5
|
+
* @param inputDateA - First date to compare
|
|
6
|
+
* @param [inputDateB] - Second date to compare or the current time if nothing given
|
|
7
|
+
*/
|
|
8
|
+
declare function sameMonth(inputDateA: DateInput, inputDateB?: MaybeDateInput): boolean;
|
|
9
|
+
/**
|
|
10
|
+
* Checks if two date objects refer to the same time minutes. Ignores date.
|
|
11
|
+
* @param [inputDateA] - First date to compare or the current time if null given
|
|
12
|
+
* @param inputDateB - Second date to compare
|
|
13
|
+
*/
|
|
14
|
+
declare function sameMonth(inputDateA: MaybeDateInput, inputDateB: DateInput): boolean;
|
|
15
|
+
|
|
16
|
+
export { sameMonth };
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
// src/sameMonth.ts
|
|
2
|
+
import { date } from "./date.mjs";
|
|
3
|
+
function sameMonth(inputDateA, inputDateB) {
|
|
4
|
+
const a = date(inputDateA);
|
|
5
|
+
const b = date(inputDateB);
|
|
6
|
+
return a.getMonth() === b.getMonth();
|
|
7
|
+
}
|
|
8
|
+
export {
|
|
9
|
+
sameMonth
|
|
10
|
+
};
|
|
11
|
+
//# sourceMappingURL=sameMonth.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/sameMonth.ts"],"sourcesContent":["import { date } from \"./date\"\nimport type { DateInput, MaybeDateInput } from \"./types\"\n\n/**\n * Checks if two date objects refer to the same time minutes. Ignores date.\n * @param inputDateA - First date to compare\n * @param [inputDateB] - Second date to compare or the current time if nothing given\n */\nexport function sameMonth(inputDateA: DateInput, inputDateB?: MaybeDateInput): boolean\n/**\n * Checks if two date objects refer to the same time minutes. Ignores date.\n * @param [inputDateA] - First date to compare or the current time if null given\n * @param inputDateB - Second date to compare\n */\nexport function sameMonth(inputDateA: MaybeDateInput, inputDateB: DateInput): boolean\nexport function sameMonth(\n inputDateA: MaybeDateInput,\n inputDateB?: MaybeDateInput\n): boolean {\n const a = date(inputDateA)\n const b = date(inputDateB)\n return a.getMonth() === b.getMonth()\n}\n"],"mappings":";AAAA,SAAS,YAAY;AAed,SAAS,UACd,YACA,YACS;AACT,QAAM,IAAI,KAAK,UAAU;AACzB,QAAM,IAAI,KAAK,UAAU;AACzB,SAAO,EAAE,SAAS,MAAM,EAAE,SAAS;AACrC;","names":[]}
|
package/dist/sameSecond.d.ts
CHANGED
|
@@ -1,10 +1,16 @@
|
|
|
1
|
-
import { DateInput } from './types.js';
|
|
1
|
+
import { DateInput, MaybeDateInput } from './types.js';
|
|
2
2
|
|
|
3
3
|
/**
|
|
4
4
|
* Checks if two date objects refer to the same time seconds. Ignores date.
|
|
5
5
|
* @param inputDateA - First date to compare
|
|
6
|
+
* @param [inputDateB] - Second date to compare or the current time if nothing given
|
|
7
|
+
*/
|
|
8
|
+
declare function sameSecond(inputDateA: DateInput, inputDateB?: MaybeDateInput): boolean;
|
|
9
|
+
/**
|
|
10
|
+
* Checks if two date objects refer to the same time seconds. Ignores date.
|
|
11
|
+
* @param [inputDateA] - First date to compare or the current time if null given
|
|
6
12
|
* @param inputDateB - Second date to compare
|
|
7
13
|
*/
|
|
8
|
-
declare function sameSecond(inputDateA:
|
|
14
|
+
declare function sameSecond(inputDateA: MaybeDateInput, inputDateB: DateInput): boolean;
|
|
9
15
|
|
|
10
16
|
export { sameSecond };
|