@gobrand/tiempo 2.3.2 → 2.3.3

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 CHANGED
@@ -314,6 +314,47 @@ format(instant, "yyyy-MM-dd HH:mm", { timeZone: "America/New_York" }); // "2025-
314
314
  format(instant, "yyyy-MM-dd HH:mm", { timeZone: "Asia/Tokyo" }); // "2025-01-21 05:30"
315
315
  ```
316
316
 
317
+ #### `formatPlainDate(date, formatStr, options?)`
318
+
319
+ Format a Temporal.PlainDate using date-fns-like format tokens. Only supports date-related tokens (no time or timezone tokens).
320
+
321
+ **Parameters:**
322
+ - `date` (Temporal.PlainDate): A Temporal.PlainDate to format
323
+ - `formatStr` (string): Format string using date-fns tokens (e.g., "yyyy-MM-dd")
324
+ - `options` (FormatPlainDateOptions, optional): Configuration for locale
325
+ - `locale` (string): BCP 47 language tag (default: "en-US")
326
+
327
+ **Returns:** `string` - Formatted date string
328
+
329
+ **Supported tokens:**
330
+ - **Year**: `yyyy` (2025), `yy` (25), `y` (2025)
331
+ - **Month**: `MMMM` (January), `MMM` (Jan), `MM` (01), `M` (1), `Mo` (1st)
332
+ - **Day**: `dd` (20), `d` (20), `do` (20th)
333
+ - **Weekday**: `EEEE` (Monday), `EEE` (Mon), `EEEEE` (M)
334
+ - **Quarter**: `Q` (1), `QQQ` (Q1), `QQQQ` (1st quarter)
335
+ - **Era**: `G` (AD), `GGGG` (Anno Domini)
336
+ - **Escape text**: Use single quotes `'...'`, double single quotes `''` for literal quote
337
+
338
+ **Example:**
339
+ ```typescript
340
+ import { formatPlainDate, today } from '@gobrand/tiempo';
341
+
342
+ const date = Temporal.PlainDate.from("2025-01-20");
343
+
344
+ formatPlainDate(date, "yyyy-MM-dd"); // "2025-01-20"
345
+ formatPlainDate(date, "MMMM d, yyyy"); // "January 20, 2025"
346
+ formatPlainDate(date, "EEEE, MMMM do, yyyy"); // "Monday, January 20th, 2025"
347
+ formatPlainDate(date, "MM/dd/yyyy"); // "01/20/2025"
348
+
349
+ // With locale
350
+ formatPlainDate(date, "MMMM d, yyyy", { locale: "es-ES" }); // "enero 20, 2025"
351
+ formatPlainDate(date, "EEEE", { locale: "de-DE" }); // "Montag"
352
+
353
+ // Use with today()
354
+ const todayFormatted = formatPlainDate(today(), "EEEE, MMMM do");
355
+ // "Thursday, January 23rd"
356
+ ```
357
+
317
358
  ### Start/End Utilities
318
359
 
319
360
  #### `today(timezone?)`
@@ -0,0 +1,186 @@
1
+ // src/formatPlainDate.ts
2
+ import "@js-temporal/polyfill";
3
+ function formatPlainDate(date, formatStr, options = {}) {
4
+ const { locale = "en-US" } = options;
5
+ let result = "";
6
+ let i = 0;
7
+ const len = formatStr.length;
8
+ while (i < len) {
9
+ const char = formatStr[i];
10
+ if (!char) break;
11
+ if (char === "'") {
12
+ if (i + 1 < len && formatStr[i + 1] === "'") {
13
+ result += "'";
14
+ i += 2;
15
+ continue;
16
+ }
17
+ i++;
18
+ while (i < len) {
19
+ if (formatStr[i] === "'") {
20
+ if (i + 1 < len && formatStr[i + 1] === "'") {
21
+ result += "'";
22
+ i += 2;
23
+ } else {
24
+ i++;
25
+ break;
26
+ }
27
+ } else {
28
+ result += formatStr[i];
29
+ i++;
30
+ }
31
+ }
32
+ continue;
33
+ }
34
+ const token = consumeToken(formatStr, i, char);
35
+ if (token !== null) {
36
+ result += formatToken(token, date, locale);
37
+ i += token.length;
38
+ } else {
39
+ result += char;
40
+ i++;
41
+ }
42
+ }
43
+ return result;
44
+ }
45
+ function consumeToken(formatStr, start, char) {
46
+ if (char === "M" && start + 1 < formatStr.length && formatStr[start + 1] === "o") {
47
+ return "Mo";
48
+ }
49
+ if (char === "d" && start + 1 < formatStr.length && formatStr[start + 1] === "o") {
50
+ return "do";
51
+ }
52
+ let end = start;
53
+ while (end < formatStr.length && formatStr[end] === char) {
54
+ end++;
55
+ }
56
+ const count = end - start;
57
+ const validTokens = [
58
+ // Era
59
+ "GGGGG",
60
+ "GGGG",
61
+ "GGG",
62
+ "GG",
63
+ "G",
64
+ // Year
65
+ "yyyy",
66
+ "yyy",
67
+ "yy",
68
+ "y",
69
+ // Quarter
70
+ "QQQQQ",
71
+ "QQQQ",
72
+ "QQQ",
73
+ "QQ",
74
+ "Q",
75
+ // Month
76
+ "MMMMM",
77
+ "MMMM",
78
+ "MMM",
79
+ "MM",
80
+ "M",
81
+ // Day
82
+ "dd",
83
+ "d",
84
+ // Weekday
85
+ "EEEEEE",
86
+ "EEEEE",
87
+ "EEEE",
88
+ "EEE",
89
+ "EE",
90
+ "E"
91
+ ];
92
+ for (let len = Math.min(count, 6); len > 0; len--) {
93
+ const candidate = char.repeat(len);
94
+ if (validTokens.includes(candidate)) {
95
+ return candidate;
96
+ }
97
+ }
98
+ return null;
99
+ }
100
+ function formatToken(token, date, locale) {
101
+ switch (token) {
102
+ // Era
103
+ case "GGGGG":
104
+ return formatPart(date, "era", "narrow", locale);
105
+ case "GGGG":
106
+ return formatPart(date, "era", "long", locale);
107
+ case "GGG":
108
+ case "GG":
109
+ case "G":
110
+ return formatPart(date, "era", "short", locale);
111
+ // Year
112
+ case "yyyy":
113
+ return date.year.toString().padStart(4, "0");
114
+ case "yyy":
115
+ return date.year.toString().padStart(3, "0");
116
+ case "yy":
117
+ return (date.year % 100).toString().padStart(2, "0");
118
+ case "y":
119
+ return date.year.toString();
120
+ // Quarter
121
+ case "QQQQQ":
122
+ return Math.ceil(date.month / 3).toString();
123
+ case "QQQQ": {
124
+ const quarter = Math.ceil(date.month / 3);
125
+ return `${quarter}${getOrdinalSuffix(quarter)} quarter`;
126
+ }
127
+ case "QQQ":
128
+ return `Q${Math.ceil(date.month / 3)}`;
129
+ case "QQ":
130
+ return Math.ceil(date.month / 3).toString().padStart(2, "0");
131
+ case "Q":
132
+ return Math.ceil(date.month / 3).toString();
133
+ // Month
134
+ case "MMMMM":
135
+ return formatPart(date, "month", "narrow", locale);
136
+ case "MMMM":
137
+ return formatPart(date, "month", "long", locale);
138
+ case "MMM":
139
+ return formatPart(date, "month", "short", locale);
140
+ case "MM":
141
+ return date.month.toString().padStart(2, "0");
142
+ case "Mo":
143
+ return `${date.month}${getOrdinalSuffix(date.month)}`;
144
+ case "M":
145
+ return date.month.toString();
146
+ // Day of month
147
+ case "do":
148
+ return `${date.day}${getOrdinalSuffix(date.day)}`;
149
+ case "dd":
150
+ return date.day.toString().padStart(2, "0");
151
+ case "d":
152
+ return date.day.toString();
153
+ // Day of week
154
+ case "EEEEEE":
155
+ return formatPart(date, "weekday", "short", locale).slice(0, 2);
156
+ case "EEEEE":
157
+ return formatPart(date, "weekday", "narrow", locale);
158
+ case "EEEE":
159
+ return formatPart(date, "weekday", "long", locale);
160
+ case "EEE":
161
+ case "EE":
162
+ case "E":
163
+ return formatPart(date, "weekday", "short", locale);
164
+ default:
165
+ return token;
166
+ }
167
+ }
168
+ function formatPart(date, part, style, locale) {
169
+ const options = {
170
+ [part]: style
171
+ };
172
+ return date.toLocaleString(locale, options);
173
+ }
174
+ function getOrdinalSuffix(num) {
175
+ const j = num % 10;
176
+ const k = num % 100;
177
+ if (j === 1 && k !== 11) return "st";
178
+ if (j === 2 && k !== 12) return "nd";
179
+ if (j === 3 && k !== 13) return "rd";
180
+ return "th";
181
+ }
182
+
183
+ export {
184
+ formatPlainDate
185
+ };
186
+ //# sourceMappingURL=chunk-3A6X6WV5.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/formatPlainDate.ts"],"sourcesContent":["import { Temporal } from '@js-temporal/polyfill';\n\nexport interface FormatPlainDateOptions {\n locale?: string;\n}\n\n/**\n * Format a Temporal.PlainDate using date-fns-like format tokens.\n * Uses Intl.DateTimeFormat under the hood for locale support.\n *\n * Only supports date-related tokens (no time or timezone tokens).\n *\n * @param date - A Temporal.PlainDate to format\n * @param formatStr - Format string using date-fns tokens (e.g., \"yyyy-MM-dd\")\n * @param options - Optional configuration for locale\n * @returns Formatted date string\n *\n * @example\n * ```typescript\n * const date = Temporal.PlainDate.from(\"2025-01-20\");\n *\n * formatPlainDate(date, \"yyyy-MM-dd\"); // \"2025-01-20\"\n * formatPlainDate(date, \"MMMM d, yyyy\"); // \"January 20, 2025\"\n * formatPlainDate(date, \"EEEE, MMMM do, yyyy\"); // \"Monday, January 20th, 2025\"\n *\n * // With locale\n * formatPlainDate(date, \"MMMM d, yyyy\", { locale: \"es-ES\" }); // \"enero 20, 2025\"\n * ```\n */\nexport function formatPlainDate(\n date: Temporal.PlainDate,\n formatStr: string,\n options: FormatPlainDateOptions = {}\n): string {\n const { locale = 'en-US' } = options;\n\n let result = '';\n let i = 0;\n const len = formatStr.length;\n\n while (i < len) {\n const char = formatStr[i];\n if (!char) break;\n\n // Handle escaped text\n if (char === \"'\") {\n // Check for double single quote (not inside a string, just '')\n if (i + 1 < len && formatStr[i + 1] === \"'\") {\n result += \"'\";\n i += 2;\n continue;\n }\n // Find closing quote, handling '' inside the string\n i++;\n while (i < len) {\n if (formatStr[i] === \"'\") {\n // Check if it's a doubled quote ''\n if (i + 1 < len && formatStr[i + 1] === \"'\") {\n result += \"'\";\n i += 2;\n } else {\n // End of quoted string\n i++;\n break;\n }\n } else {\n result += formatStr[i];\n i++;\n }\n }\n continue;\n }\n\n // Check for tokens by looking ahead\n const token = consumeToken(formatStr, i, char);\n if (token !== null) {\n result += formatToken(token, date, locale);\n i += token.length;\n } else {\n result += char;\n i++;\n }\n }\n\n return result;\n}\n\nfunction consumeToken(formatStr: string, start: number, char: string): string | null {\n // Special case for 'Mo' and 'do' - these end with 'o'\n if (char === 'M' && start + 1 < formatStr.length && formatStr[start + 1] === 'o') {\n return 'Mo';\n }\n if (char === 'd' && start + 1 < formatStr.length && formatStr[start + 1] === 'o') {\n return 'do';\n }\n\n // Count how many consecutive identical characters\n let end = start;\n while (end < formatStr.length && formatStr[end] === char) {\n end++;\n }\n const count = end - start;\n\n // Valid tokens for PlainDate (date-only, no time/timezone)\n const validTokens = [\n // Era\n 'GGGGG',\n 'GGGG',\n 'GGG',\n 'GG',\n 'G',\n // Year\n 'yyyy',\n 'yyy',\n 'yy',\n 'y',\n // Quarter\n 'QQQQQ',\n 'QQQQ',\n 'QQQ',\n 'QQ',\n 'Q',\n // Month\n 'MMMMM',\n 'MMMM',\n 'MMM',\n 'MM',\n 'M',\n // Day\n 'dd',\n 'd',\n // Weekday\n 'EEEEEE',\n 'EEEEE',\n 'EEEE',\n 'EEE',\n 'EE',\n 'E',\n ];\n\n // Try to match from longest to shortest\n for (let len = Math.min(count, 6); len > 0; len--) {\n const candidate = char.repeat(len);\n if (validTokens.includes(candidate)) {\n return candidate;\n }\n }\n\n return null;\n}\n\nfunction formatToken(token: string, date: Temporal.PlainDate, locale: string): string {\n switch (token) {\n // Era\n case 'GGGGG':\n return formatPart(date, 'era', 'narrow', locale);\n case 'GGGG':\n return formatPart(date, 'era', 'long', locale);\n case 'GGG':\n case 'GG':\n case 'G':\n return formatPart(date, 'era', 'short', locale);\n\n // Year\n case 'yyyy':\n return date.year.toString().padStart(4, '0');\n case 'yyy':\n return date.year.toString().padStart(3, '0');\n case 'yy':\n return (date.year % 100).toString().padStart(2, '0');\n case 'y':\n return date.year.toString();\n\n // Quarter\n case 'QQQQQ':\n return Math.ceil(date.month / 3).toString();\n case 'QQQQ': {\n const quarter = Math.ceil(date.month / 3);\n return `${quarter}${getOrdinalSuffix(quarter)} quarter`;\n }\n case 'QQQ':\n return `Q${Math.ceil(date.month / 3)}`;\n case 'QQ':\n return Math.ceil(date.month / 3)\n .toString()\n .padStart(2, '0');\n case 'Q':\n return Math.ceil(date.month / 3).toString();\n\n // Month\n case 'MMMMM':\n return formatPart(date, 'month', 'narrow', locale);\n case 'MMMM':\n return formatPart(date, 'month', 'long', locale);\n case 'MMM':\n return formatPart(date, 'month', 'short', locale);\n case 'MM':\n return date.month.toString().padStart(2, '0');\n case 'Mo':\n return `${date.month}${getOrdinalSuffix(date.month)}`;\n case 'M':\n return date.month.toString();\n\n // Day of month\n case 'do':\n return `${date.day}${getOrdinalSuffix(date.day)}`;\n case 'dd':\n return date.day.toString().padStart(2, '0');\n case 'd':\n return date.day.toString();\n\n // Day of week\n case 'EEEEEE':\n return formatPart(date, 'weekday', 'short', locale).slice(0, 2);\n case 'EEEEE':\n return formatPart(date, 'weekday', 'narrow', locale);\n case 'EEEE':\n return formatPart(date, 'weekday', 'long', locale);\n case 'EEE':\n case 'EE':\n case 'E':\n return formatPart(date, 'weekday', 'short', locale);\n\n default:\n return token;\n }\n}\n\nfunction formatPart(\n date: Temporal.PlainDate,\n part: 'era' | 'year' | 'month' | 'weekday' | 'day',\n style: 'narrow' | 'short' | 'long' | 'numeric' | '2-digit',\n locale: string\n): string {\n const options: Intl.DateTimeFormatOptions = {\n [part]: style,\n };\n\n return date.toLocaleString(locale, options);\n}\n\nfunction getOrdinalSuffix(num: number): string {\n const j = num % 10;\n const k = num % 100;\n if (j === 1 && k !== 11) return 'st';\n if (j === 2 && k !== 12) return 'nd';\n if (j === 3 && k !== 13) return 'rd';\n return 'th';\n}\n"],"mappings":"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","names":[]}
@@ -0,0 +1,29 @@
1
+ import { Temporal } from '@js-temporal/polyfill';
2
+ export interface FormatPlainDateOptions {
3
+ locale?: string;
4
+ }
5
+ /**
6
+ * Format a Temporal.PlainDate using date-fns-like format tokens.
7
+ * Uses Intl.DateTimeFormat under the hood for locale support.
8
+ *
9
+ * Only supports date-related tokens (no time or timezone tokens).
10
+ *
11
+ * @param date - A Temporal.PlainDate to format
12
+ * @param formatStr - Format string using date-fns tokens (e.g., "yyyy-MM-dd")
13
+ * @param options - Optional configuration for locale
14
+ * @returns Formatted date string
15
+ *
16
+ * @example
17
+ * ```typescript
18
+ * const date = Temporal.PlainDate.from("2025-01-20");
19
+ *
20
+ * formatPlainDate(date, "yyyy-MM-dd"); // "2025-01-20"
21
+ * formatPlainDate(date, "MMMM d, yyyy"); // "January 20, 2025"
22
+ * formatPlainDate(date, "EEEE, MMMM do, yyyy"); // "Monday, January 20th, 2025"
23
+ *
24
+ * // With locale
25
+ * formatPlainDate(date, "MMMM d, yyyy", { locale: "es-ES" }); // "enero 20, 2025"
26
+ * ```
27
+ */
28
+ export declare function formatPlainDate(date: Temporal.PlainDate, formatStr: string, options?: FormatPlainDateOptions): string;
29
+ //# sourceMappingURL=formatPlainDate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"formatPlainDate.d.ts","sourceRoot":"","sources":["../src/formatPlainDate.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAEjD,MAAM,WAAW,sBAAsB;IACrC,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,wBAAgB,eAAe,CAC7B,IAAI,EAAE,QAAQ,CAAC,SAAS,EACxB,SAAS,EAAE,MAAM,EACjB,OAAO,GAAE,sBAA2B,GACnC,MAAM,CAoDR"}
@@ -0,0 +1,7 @@
1
+ import {
2
+ formatPlainDate
3
+ } from "./chunk-3A6X6WV5.js";
4
+ export {
5
+ formatPlainDate
6
+ };
7
+ //# sourceMappingURL=formatPlainDate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=formatPlainDate.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"formatPlainDate.test.d.ts","sourceRoot":"","sources":["../src/formatPlainDate.test.ts"],"names":[],"mappings":""}
package/dist/index.d.ts CHANGED
@@ -3,6 +3,7 @@ export { toUtc } from './toUtc';
3
3
  export { toUtcString } from './toUtcString';
4
4
  export { toDate } from './toDate';
5
5
  export { format, type FormatOptions } from './format';
6
+ export { formatPlainDate, type FormatPlainDateOptions } from './formatPlainDate';
6
7
  export { today } from './today';
7
8
  export { now } from './now';
8
9
  export { startOfDay } from './startOfDay';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAChC,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAClC,OAAO,EAAE,MAAM,EAAE,KAAK,aAAa,EAAE,MAAM,UAAU,CAAC;AACtD,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAChC,OAAO,EAAE,GAAG,EAAE,MAAM,OAAO,CAAC;AAC5B,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAClC,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,EAAE,uBAAuB,EAAE,MAAM,2BAA2B,CAAC;AACpE,OAAO,EAAE,wBAAwB,EAAE,MAAM,4BAA4B,CAAC;AACtE,OAAO,EAAE,wBAAwB,EAAE,MAAM,4BAA4B,CAAC;AACtE,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,EACL,kBAAkB,EAClB,KAAK,yBAAyB,GAC/B,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/dist/index.js CHANGED
@@ -1,6 +1,12 @@
1
+ import {
2
+ toZonedTime
3
+ } from "./chunk-2MP3ESL7.js";
1
4
  import {
2
5
  today
3
6
  } from "./chunk-67QHALIG.js";
7
+ import {
8
+ subNanoseconds
9
+ } from "./chunk-WVHAYLBW.js";
4
10
  import {
5
11
  subSeconds
6
12
  } from "./chunk-BH2YB4MV.js";
@@ -20,8 +26,8 @@ import {
20
26
  toUtcString
21
27
  } from "./chunk-DMKGJY4N.js";
22
28
  import {
23
- toZonedTime
24
- } from "./chunk-2MP3ESL7.js";
29
+ startOfWeek
30
+ } from "./chunk-2WMXB7QL.js";
25
31
  import {
26
32
  startOfYear
27
33
  } from "./chunk-YR2UCUIT.js";
@@ -44,8 +50,8 @@ import {
44
50
  subMonths
45
51
  } from "./chunk-52NEOY34.js";
46
52
  import {
47
- subNanoseconds
48
- } from "./chunk-WVHAYLBW.js";
53
+ isSameMonth
54
+ } from "./chunk-ADQTZVMH.js";
49
55
  import {
50
56
  isSameNanosecond
51
57
  } from "./chunk-S63QUP4W.js";
@@ -68,8 +74,8 @@ import {
68
74
  startOfMonth
69
75
  } from "./chunk-TU2UNOOW.js";
70
76
  import {
71
- startOfWeek
72
- } from "./chunk-2WMXB7QL.js";
77
+ isPlainDateAfter
78
+ } from "./chunk-BPZ7BRJW.js";
73
79
  import {
74
80
  isPlainDateBefore
75
81
  } from "./chunk-4E7OGJ3F.js";
@@ -91,12 +97,12 @@ import {
91
97
  import {
92
98
  isSameMinute
93
99
  } from "./chunk-LDO6PRNJ.js";
94
- import {
95
- isSameMonth
96
- } from "./chunk-ADQTZVMH.js";
97
100
  import {
98
101
  format
99
102
  } from "./chunk-2G5RJGPR.js";
103
+ import {
104
+ formatPlainDate
105
+ } from "./chunk-3A6X6WV5.js";
100
106
  import {
101
107
  intlFormatDistance
102
108
  } from "./chunk-XEDXPI5G.js";
@@ -112,9 +118,6 @@ import {
112
118
  import {
113
119
  isPast
114
120
  } from "./chunk-2H4KLXGL.js";
115
- import {
116
- isPlainDateAfter
117
- } from "./chunk-BPZ7BRJW.js";
118
121
  import {
119
122
  differenceInNanoseconds
120
123
  } from "./chunk-OABS374T.js";
@@ -215,6 +218,7 @@ export {
215
218
  endOfWeek,
216
219
  endOfYear,
217
220
  format,
221
+ formatPlainDate,
218
222
  intlFormatDistance,
219
223
  isAfter,
220
224
  isBefore,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@gobrand/tiempo",
3
- "version": "2.3.2",
3
+ "version": "2.3.3",
4
4
  "description": "Lightweight utility functions for converting between UTC and timezone-aware datetimes using the Temporal API",
5
5
  "private": false,
6
6
  "publishConfig": {