@samline/date 1.0.0 → 2.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 +102 -6
- package/dist/browser/global.d.ts +6 -1
- package/dist/browser/global.js +84 -22
- package/dist/browser/global.js.map +1 -1
- package/dist/index.d.ts +10 -4
- package/dist/index.js +84 -22
- package/dist/index.js.map +1 -1
- package/dist/react/index.d.ts +2 -2
- package/dist/react/index.js +50 -23
- package/dist/react/index.js.map +1 -1
- package/dist/svelte/index.d.ts +2 -2
- package/dist/svelte/index.js +50 -23
- package/dist/svelte/index.js.map +1 -1
- package/dist/vanilla/index.d.ts +1 -1
- package/dist/vanilla/index.js +84 -22
- package/dist/vanilla/index.js.map +1 -1
- package/dist/vue/index.d.ts +2 -2
- package/dist/vue/index.js +50 -23
- package/dist/vue/index.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -35,10 +35,37 @@ npm install @samline/date
|
|
|
35
35
|
|
|
36
36
|
## Quick Start
|
|
37
37
|
|
|
38
|
+
```ts
|
|
39
|
+
import { getDate } from '@samline/date'
|
|
40
|
+
|
|
41
|
+
const date = await getDate({
|
|
42
|
+
date: '23/03/2026',
|
|
43
|
+
input: 'DD/MM/YYYY',
|
|
44
|
+
output: 'MMMM D, YYYY'
|
|
45
|
+
})
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
You can also inspect the effective locale before formatting:
|
|
49
|
+
|
|
50
|
+
```ts
|
|
51
|
+
import { resolveLocale } from '@samline/date'
|
|
52
|
+
|
|
53
|
+
resolveLocale('es-mx')
|
|
54
|
+
// es-mx
|
|
55
|
+
|
|
56
|
+
resolveLocale('en-us')
|
|
57
|
+
// en
|
|
58
|
+
|
|
59
|
+
resolveLocale('zz-zz')
|
|
60
|
+
// null
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
For repeated work with the same locale or invalid text, create one formatter instance and reuse it:
|
|
64
|
+
|
|
38
65
|
```ts
|
|
39
66
|
import { createDateFormatter } from '@samline/date'
|
|
40
67
|
|
|
41
|
-
const formatter = createDateFormatter({ locale: 'es-mx'
|
|
68
|
+
const formatter = createDateFormatter({ locale: 'es-mx' })
|
|
42
69
|
|
|
43
70
|
await formatter.ready
|
|
44
71
|
|
|
@@ -55,7 +82,7 @@ const date = formatter.getDate({
|
|
|
55
82
|
|
|
56
83
|
```ts
|
|
57
84
|
createDateFormatter(config?: {
|
|
58
|
-
locale?:
|
|
85
|
+
locale?: LocaleInput
|
|
59
86
|
strict?: boolean
|
|
60
87
|
invalid?: string
|
|
61
88
|
}): {
|
|
@@ -64,16 +91,18 @@ createDateFormatter(config?: {
|
|
|
64
91
|
isValidDate(props: DateParsingOptions): boolean
|
|
65
92
|
getSupportedLocales(): readonly SupportedLocale[]
|
|
66
93
|
getCurrentLocale(): SupportedLocale
|
|
67
|
-
setLocale(locale:
|
|
94
|
+
setLocale(locale: LocaleInput): Promise<void>
|
|
68
95
|
ready: Promise<void>
|
|
69
96
|
}
|
|
70
97
|
```
|
|
71
98
|
|
|
72
99
|
Creates a formatter instance with its own locale state. This avoids coupling framework wrappers and utility calls to the global Day.js locale.
|
|
73
100
|
|
|
74
|
-
|
|
101
|
+
`strict` is `true` by default, so parsing fails when the input does not match the provided format exactly. Use `strict: false` only when you explicitly want lenient parsing.
|
|
75
102
|
|
|
76
|
-
If you override `locale` per call, make sure
|
|
103
|
+
If you override `locale` per call, make sure the effective locale was already loaded by a formatter instance.
|
|
104
|
+
|
|
105
|
+
Regional locale input falls back to the base locale when the exact variant is not supported by the package. For example, `en-us` resolves to `en`, while `es-mx` stays as `es-mx` because that locale is supported explicitly.
|
|
77
106
|
|
|
78
107
|
The formatter instance exposes:
|
|
79
108
|
|
|
@@ -85,6 +114,57 @@ The formatter instance exposes:
|
|
|
85
114
|
- `getSupportedLocales()`
|
|
86
115
|
- `ready`
|
|
87
116
|
|
|
117
|
+
### Locale helpers
|
|
118
|
+
|
|
119
|
+
```ts
|
|
120
|
+
resolveLocale(locale: LocaleInput): SupportedLocale | null
|
|
121
|
+
isSupportedLocale(locale: string): boolean
|
|
122
|
+
```
|
|
123
|
+
|
|
124
|
+
Use `resolveLocale` when you want to know the effective locale before creating a formatter or calling a helper.
|
|
125
|
+
|
|
126
|
+
Use `isSupportedLocale` when you only need a boolean check after the package applies its exact-match and base-locale fallback rules.
|
|
127
|
+
|
|
128
|
+
These helpers are also available in the browser build through `DateKit.resolveLocale(...)` and `DateKit.isSupportedLocale(...)`.
|
|
129
|
+
|
|
130
|
+
### One-shot helpers
|
|
131
|
+
|
|
132
|
+
```ts
|
|
133
|
+
getDate(props?: GetDateOptions, config?: DateFormatterConfig): Promise<string>
|
|
134
|
+
parseDate(props: DateParsingOptions, config?: DateFormatterConfig): Promise<ParseDateResult>
|
|
135
|
+
isValidDate(props: DateParsingOptions, config?: DateFormatterConfig): Promise<boolean>
|
|
136
|
+
```
|
|
137
|
+
|
|
138
|
+
Use these helpers when you only need a single operation and do not want to create a formatter instance manually.
|
|
139
|
+
|
|
140
|
+
| Helper | Returns | Use it when you need |
|
|
141
|
+
| --- | --- | --- |
|
|
142
|
+
| `getDate(...)` | formatted string | a final display value |
|
|
143
|
+
| `parseDate(...)` | structured parse result | validation details, `Date`, `iso`, `timestamp`, or deferred formatting |
|
|
144
|
+
| `isValidDate(...)` | boolean | only a yes or no validation check |
|
|
145
|
+
|
|
146
|
+
```ts
|
|
147
|
+
import { getDate, isValidDate, parseDate } from '@samline/date'
|
|
148
|
+
|
|
149
|
+
const value = await getDate({
|
|
150
|
+
date: '23/03/2026',
|
|
151
|
+
input: 'DD/MM/YYYY',
|
|
152
|
+
output: 'YYYY-MM-DD'
|
|
153
|
+
})
|
|
154
|
+
|
|
155
|
+
const parsed = await parseDate({
|
|
156
|
+
date: '23/03/2026',
|
|
157
|
+
input: 'DD/MM/YYYY'
|
|
158
|
+
})
|
|
159
|
+
|
|
160
|
+
const valid = await isValidDate({
|
|
161
|
+
date: '1970-00-00',
|
|
162
|
+
input: 'YYYY-MM-DD'
|
|
163
|
+
})
|
|
164
|
+
```
|
|
165
|
+
|
|
166
|
+
They load the requested locale automatically and also use `strict: true` by default.
|
|
167
|
+
|
|
88
168
|
### parseDate
|
|
89
169
|
|
|
90
170
|
```ts
|
|
@@ -126,7 +206,23 @@ The package ships helper support for these locale keys:
|
|
|
126
206
|
- `it`
|
|
127
207
|
- `ja`
|
|
128
208
|
|
|
129
|
-
|
|
209
|
+
You can also pass regional locale input such as `en-us`, `fr-ca`, or `pt-pt`.
|
|
210
|
+
|
|
211
|
+
The resolution rule is:
|
|
212
|
+
|
|
213
|
+
- if the exact locale exists, use it
|
|
214
|
+
- otherwise, try the base locale before the hyphen
|
|
215
|
+
- if neither exists, throw an unsupported locale error
|
|
216
|
+
|
|
217
|
+
Examples:
|
|
218
|
+
|
|
219
|
+
- `es-mx` -> `es-mx`
|
|
220
|
+
- `es-ar` -> `es`
|
|
221
|
+
- `en-us` -> `en`
|
|
222
|
+
- `pt-pt` -> `pt`
|
|
223
|
+
- `zz-zz` -> error
|
|
224
|
+
|
|
225
|
+
Use a simple locale like `fr` or `en` when the base language is enough. Use a regional locale like `es-mx` or `pt-br` when you need a supported country-specific variant.
|
|
130
226
|
|
|
131
227
|
## Documentation
|
|
132
228
|
|
package/dist/browser/global.d.ts
CHANGED
|
@@ -1,8 +1,13 @@
|
|
|
1
|
-
import { DateFormatterConfig, DateFormatter, SupportedLocale } from '../index.js';
|
|
1
|
+
import { DateFormatterConfig, DateFormatter, GetDateOptions, SupportedLocale, DateParsingOptions, ParseDateResult, LocaleInput } from '../index.js';
|
|
2
2
|
|
|
3
3
|
declare const DateKit: {
|
|
4
4
|
createDateFormatter: (config?: DateFormatterConfig) => DateFormatter;
|
|
5
|
+
getDate: (props?: GetDateOptions, config?: DateFormatterConfig) => Promise<string>;
|
|
5
6
|
getSupportedLocales: () => readonly SupportedLocale[];
|
|
7
|
+
isSupportedLocale: (locale: string) => boolean;
|
|
8
|
+
parseDate: (props: DateParsingOptions, config?: DateFormatterConfig) => Promise<ParseDateResult>;
|
|
9
|
+
isValidDate: (props: DateParsingOptions, config?: DateFormatterConfig) => Promise<boolean>;
|
|
10
|
+
resolveLocale: (locale: LocaleInput) => SupportedLocale | null;
|
|
6
11
|
};
|
|
7
12
|
declare global {
|
|
8
13
|
interface Window {
|
package/dist/browser/global.js
CHANGED
|
@@ -25,8 +25,29 @@ var localeLoaders = {
|
|
|
25
25
|
it: () => import("dayjs/locale/it.js"),
|
|
26
26
|
ja: () => import("dayjs/locale/ja.js")
|
|
27
27
|
};
|
|
28
|
+
var normalizeLocale = (locale) => {
|
|
29
|
+
return locale.trim().toLowerCase().replace(/_/g, "-");
|
|
30
|
+
};
|
|
31
|
+
var asSupportedLocale = (locale) => {
|
|
32
|
+
if (!SUPPORTED_LOCALES.includes(locale)) {
|
|
33
|
+
return null;
|
|
34
|
+
}
|
|
35
|
+
return locale;
|
|
36
|
+
};
|
|
28
37
|
var isSupportedLocale = (locale) => {
|
|
29
|
-
return
|
|
38
|
+
return resolveLocale(locale) !== null;
|
|
39
|
+
};
|
|
40
|
+
var resolveLocale = (locale) => {
|
|
41
|
+
const normalizedLocale = normalizeLocale(locale);
|
|
42
|
+
const exactLocale = asSupportedLocale(normalizedLocale);
|
|
43
|
+
if (exactLocale) {
|
|
44
|
+
return exactLocale;
|
|
45
|
+
}
|
|
46
|
+
const [baseLocale] = normalizedLocale.split("-");
|
|
47
|
+
if (!baseLocale) {
|
|
48
|
+
return null;
|
|
49
|
+
}
|
|
50
|
+
return asSupportedLocale(baseLocale);
|
|
30
51
|
};
|
|
31
52
|
var ensureLocaleLoaded = async (locale) => {
|
|
32
53
|
const load = localeLoaders[locale];
|
|
@@ -42,11 +63,29 @@ dayjs.locale("en");
|
|
|
42
63
|
var DEFAULT_FORMAT = "YYYY-MM-DD";
|
|
43
64
|
var DEFAULT_LOCALE = "en";
|
|
44
65
|
var DEFAULT_INVALID_DATE = "Invalid Date";
|
|
66
|
+
var DEFAULT_STRICT = true;
|
|
67
|
+
var createResolvedConfig = (locale, config) => ({
|
|
68
|
+
locale,
|
|
69
|
+
strict: config?.strict ?? DEFAULT_STRICT,
|
|
70
|
+
invalid: config?.invalid ?? DEFAULT_INVALID_DATE
|
|
71
|
+
});
|
|
45
72
|
var getInvalidDateText = (config, props) => {
|
|
46
73
|
return props?.invalid ?? config?.invalid ?? DEFAULT_INVALID_DATE;
|
|
47
74
|
};
|
|
48
75
|
var getTargetLocale = (currentLocale, props) => {
|
|
49
|
-
|
|
76
|
+
if (!props?.locale) {
|
|
77
|
+
return currentLocale;
|
|
78
|
+
}
|
|
79
|
+
return resolveLocaleOrThrow(props.locale);
|
|
80
|
+
};
|
|
81
|
+
var getHelperLocale = (config, props) => {
|
|
82
|
+
if (props?.locale) {
|
|
83
|
+
return resolveLocaleOrThrow(props.locale);
|
|
84
|
+
}
|
|
85
|
+
if (config?.locale) {
|
|
86
|
+
return resolveLocaleOrThrow(config.locale);
|
|
87
|
+
}
|
|
88
|
+
return DEFAULT_LOCALE;
|
|
50
89
|
};
|
|
51
90
|
var parseDateValue = (value, input, locale, strict) => {
|
|
52
91
|
if (!input) {
|
|
@@ -82,11 +121,11 @@ var createFormatterParseDate = (getConfig) => {
|
|
|
82
121
|
};
|
|
83
122
|
};
|
|
84
123
|
};
|
|
85
|
-
var createFormatterIsValidDate = (
|
|
86
|
-
return (props) =>
|
|
124
|
+
var createFormatterIsValidDate = (parseDate2) => {
|
|
125
|
+
return (props) => parseDate2(props).isValid;
|
|
87
126
|
};
|
|
88
127
|
var createFormatterGetDate = (getConfig) => {
|
|
89
|
-
const
|
|
128
|
+
const parseDate2 = createFormatterParseDate(getConfig);
|
|
90
129
|
return (props) => {
|
|
91
130
|
const config = getConfig();
|
|
92
131
|
const locale = getTargetLocale(config.locale, props);
|
|
@@ -97,7 +136,7 @@ var createFormatterGetDate = (getConfig) => {
|
|
|
97
136
|
if (props.date === void 0) {
|
|
98
137
|
return dayjs().locale(locale).format(output);
|
|
99
138
|
}
|
|
100
|
-
const parsed =
|
|
139
|
+
const parsed = parseDate2({
|
|
101
140
|
date: props.date,
|
|
102
141
|
input: props.input,
|
|
103
142
|
locale: props.locale,
|
|
@@ -109,31 +148,49 @@ var createFormatterGetDate = (getConfig) => {
|
|
|
109
148
|
return parsed.format(output);
|
|
110
149
|
};
|
|
111
150
|
};
|
|
112
|
-
function
|
|
113
|
-
|
|
114
|
-
|
|
151
|
+
function resolveLocaleOrThrow(locale) {
|
|
152
|
+
const resolvedLocale = resolveLocale(locale);
|
|
153
|
+
if (!resolvedLocale) {
|
|
154
|
+
throw new Error(
|
|
155
|
+
`Unsupported locale: ${locale}. The package tries an exact locale match first and then falls back to the base locale.`
|
|
156
|
+
);
|
|
115
157
|
}
|
|
158
|
+
return resolvedLocale;
|
|
116
159
|
}
|
|
117
160
|
var getSupportedLocales = () => SUPPORTED_LOCALES;
|
|
161
|
+
var getDate = async (props, config) => {
|
|
162
|
+
const locale = getHelperLocale(config, props);
|
|
163
|
+
const formatter = createDateFormatter({ ...config, locale });
|
|
164
|
+
await formatter.ready;
|
|
165
|
+
return formatter.getDate(props);
|
|
166
|
+
};
|
|
167
|
+
var parseDate = async (props, config) => {
|
|
168
|
+
const locale = getHelperLocale(config, props);
|
|
169
|
+
const formatter = createDateFormatter({ ...config, locale });
|
|
170
|
+
await formatter.ready;
|
|
171
|
+
return formatter.parseDate(props);
|
|
172
|
+
};
|
|
173
|
+
var isValidDate = async (props, config) => {
|
|
174
|
+
const locale = getHelperLocale(config, props);
|
|
175
|
+
const formatter = createDateFormatter({ ...config, locale });
|
|
176
|
+
await formatter.ready;
|
|
177
|
+
return formatter.isValidDate(props);
|
|
178
|
+
};
|
|
118
179
|
var createDateFormatter = (config) => {
|
|
119
|
-
let currentLocale = config?.locale
|
|
120
|
-
const getConfig = () => (
|
|
121
|
-
locale: currentLocale,
|
|
122
|
-
strict: config?.strict ?? false,
|
|
123
|
-
invalid: config?.invalid ?? DEFAULT_INVALID_DATE
|
|
124
|
-
});
|
|
180
|
+
let currentLocale = config?.locale ? resolveLocaleOrThrow(config.locale) : DEFAULT_LOCALE;
|
|
181
|
+
const getConfig = () => createResolvedConfig(currentLocale, config);
|
|
125
182
|
const ready = ensureLocaleLoaded(currentLocale);
|
|
126
|
-
const
|
|
183
|
+
const parseDate2 = createFormatterParseDate(getConfig);
|
|
127
184
|
return {
|
|
128
185
|
getDate: createFormatterGetDate(getConfig),
|
|
129
|
-
parseDate,
|
|
130
|
-
isValidDate: createFormatterIsValidDate(
|
|
186
|
+
parseDate: parseDate2,
|
|
187
|
+
isValidDate: createFormatterIsValidDate(parseDate2),
|
|
131
188
|
getSupportedLocales,
|
|
132
189
|
getCurrentLocale: () => currentLocale,
|
|
133
190
|
setLocale: async (locale) => {
|
|
134
|
-
|
|
135
|
-
await ensureLocaleLoaded(
|
|
136
|
-
currentLocale =
|
|
191
|
+
const resolvedLocale = resolveLocaleOrThrow(locale);
|
|
192
|
+
await ensureLocaleLoaded(resolvedLocale);
|
|
193
|
+
currentLocale = resolvedLocale;
|
|
137
194
|
},
|
|
138
195
|
ready
|
|
139
196
|
};
|
|
@@ -142,7 +199,12 @@ var createDateFormatter = (config) => {
|
|
|
142
199
|
// src/browser/global.ts
|
|
143
200
|
var DateKit = {
|
|
144
201
|
createDateFormatter,
|
|
145
|
-
|
|
202
|
+
getDate,
|
|
203
|
+
getSupportedLocales,
|
|
204
|
+
isSupportedLocale,
|
|
205
|
+
parseDate,
|
|
206
|
+
isValidDate,
|
|
207
|
+
resolveLocale
|
|
146
208
|
};
|
|
147
209
|
if (typeof window !== "undefined") {
|
|
148
210
|
window.DateKit = DateKit;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/core/date.ts","../../src/core/locales.ts","../../src/browser/global.ts"],"sourcesContent":["import customParseFormat from 'dayjs/plugin/customParseFormat.js'\nimport dayjs from 'dayjs'\nimport type { Dayjs } from 'dayjs'\n\nimport { ensureLocaleLoaded, isSupportedLocale, SUPPORTED_LOCALES, type SupportedLocale } from './locales.js'\n\ndayjs.extend(customParseFormat)\ndayjs.locale('en')\n\nexport type DateValue = string | number | Date\n\ntype DateInputOptions = {\n input?: string | readonly string[]\n locale?: SupportedLocale\n strict?: boolean\n}\n\nexport type DateParsingOptions = DateInputOptions & {\n date: DateValue\n}\n\nexport type GetDateOptions = DateInputOptions & {\n date?: DateValue\n output?: string\n invalid?: string\n}\n\nexport type DateFormatterConfig = {\n locale?: SupportedLocale\n strict?: boolean\n invalid?: string\n}\n\nexport type DateFormatter = {\n getDate: (props?: GetDateOptions) => string\n parseDate: (props: DateParsingOptions) => ParseDateResult\n isValidDate: (props: DateParsingOptions) => boolean\n getSupportedLocales: () => readonly SupportedLocale[]\n getCurrentLocale: () => SupportedLocale\n setLocale: (locale: SupportedLocale) => Promise<void>\n ready: Promise<void>\n}\n\nexport type ParseDateSuccess = {\n isValid: true\n locale: SupportedLocale\n date: Date\n iso: string\n timestamp: number\n format: (output?: string) => string\n}\n\nexport type ParseDateFailure = {\n isValid: false\n locale: SupportedLocale\n date: null\n iso: null\n timestamp: null\n error: string\n}\n\nexport type ParseDateResult = ParseDateSuccess | ParseDateFailure\n\nconst DEFAULT_FORMAT = 'YYYY-MM-DD'\nconst DEFAULT_LOCALE: SupportedLocale = 'en'\nconst DEFAULT_INVALID_DATE = 'Invalid Date'\n\nconst getInvalidDateText = (config?: DateFormatterConfig, props?: GetDateOptions): string => {\n return props?.invalid ?? config?.invalid ?? DEFAULT_INVALID_DATE\n}\n\nconst getTargetLocale = (currentLocale: SupportedLocale, props?: GetDateOptions): SupportedLocale => {\n return props?.locale ?? currentLocale\n}\n\nconst parseDateValue = (\n value: DateValue,\n input: DateParsingOptions['input'],\n locale: SupportedLocale,\n strict: boolean\n): Dayjs => {\n if (!input) {\n return dayjs(value).locale(locale)\n }\n\n if (typeof input === 'string') {\n return dayjs(value, input, locale, strict).locale(locale)\n }\n\n return dayjs(value, [...input], locale, strict).locale(locale)\n}\n\nconst createFormatterParseDate = (getConfig: () => Required<DateFormatterConfig>) => {\n return (props: DateParsingOptions): ParseDateResult => {\n const config = getConfig()\n const locale = getTargetLocale(config.locale, props)\n const parsed = parseDateValue(props.date, props.input, locale, props.strict ?? config.strict)\n\n if (!parsed.isValid()) {\n return {\n isValid: false,\n locale,\n date: null,\n iso: null,\n timestamp: null,\n error: getInvalidDateText(config, props)\n }\n }\n\n return {\n isValid: true,\n locale,\n date: parsed.toDate(),\n iso: parsed.toISOString(),\n timestamp: parsed.valueOf(),\n format: (output = DEFAULT_FORMAT) => parsed.format(output)\n }\n }\n}\n\nconst createFormatterIsValidDate = (parseDate: (props: DateParsingOptions) => ParseDateResult) => {\n return (props: DateParsingOptions): boolean => parseDate(props).isValid\n}\n\nconst createFormatterGetDate = (getConfig: () => Required<DateFormatterConfig>) => {\n const parseDate = createFormatterParseDate(getConfig)\n\n return (props?: GetDateOptions): string => {\n const config = getConfig()\n const locale = getTargetLocale(config.locale, props)\n const output = props?.output ?? DEFAULT_FORMAT\n\n if (!props) {\n return dayjs().locale(locale).format(DEFAULT_FORMAT)\n }\n\n if (props.date === undefined) {\n return dayjs().locale(locale).format(output)\n }\n\n const parsed = parseDate({\n date: props.date,\n input: props.input,\n locale: props.locale,\n strict: props.strict\n })\n\n if (!parsed.isValid) {\n return props.invalid ?? parsed.error\n }\n\n return parsed.format(output)\n }\n}\n\nfunction assertSupportedLocale(locale: string): asserts locale is SupportedLocale {\n if (!isSupportedLocale(locale)) {\n throw new Error(`Unsupported locale: ${locale}`)\n }\n}\n\nexport const getSupportedLocales = (): readonly SupportedLocale[] => SUPPORTED_LOCALES\n\nexport const createDateFormatter = (config?: DateFormatterConfig): DateFormatter => {\n let currentLocale = config?.locale ?? DEFAULT_LOCALE\n\n const getConfig = (): Required<DateFormatterConfig> => ({\n locale: currentLocale,\n strict: config?.strict ?? false,\n invalid: config?.invalid ?? DEFAULT_INVALID_DATE\n })\n\n const ready = ensureLocaleLoaded(currentLocale)\n const parseDate = createFormatterParseDate(getConfig)\n\n return {\n getDate: createFormatterGetDate(getConfig),\n parseDate,\n isValidDate: createFormatterIsValidDate(parseDate),\n getSupportedLocales,\n getCurrentLocale: () => currentLocale,\n setLocale: async (locale: SupportedLocale) => {\n assertSupportedLocale(locale)\n await ensureLocaleLoaded(locale)\n currentLocale = locale\n },\n ready\n }\n}\n","export const SUPPORTED_LOCALES = [\n 'en',\n 'es',\n 'es-mx',\n 'fr',\n 'pt',\n 'pt-br',\n 'de',\n 'it',\n 'ja'\n] as const\n\nexport type SupportedLocale = (typeof SUPPORTED_LOCALES)[number]\n\nconst localeLoaders: Record<SupportedLocale, (() => Promise<unknown>) | null> = {\n en: null,\n es: () => import('dayjs/locale/es.js'),\n 'es-mx': () => import('dayjs/locale/es-mx.js'),\n fr: () => import('dayjs/locale/fr.js'),\n pt: () => import('dayjs/locale/pt.js'),\n 'pt-br': () => import('dayjs/locale/pt-br.js'),\n de: () => import('dayjs/locale/de.js'),\n it: () => import('dayjs/locale/it.js'),\n ja: () => import('dayjs/locale/ja.js')\n}\n\nexport const isSupportedLocale = (locale: string): locale is SupportedLocale => {\n return SUPPORTED_LOCALES.includes(locale as SupportedLocale)\n}\n\nexport const ensureLocaleLoaded = async (locale: SupportedLocale): Promise<void> => {\n const load = localeLoaders[locale]\n\n if (!load) {\n return\n }\n\n await load()\n}\n","import { createDateFormatter, getSupportedLocales } from '../index.js'\n\nexport const DateKit = {\n createDateFormatter,\n getSupportedLocales\n}\n\ndeclare global {\n interface Window {\n DateKit: typeof DateKit\n }\n}\n\nif (typeof window !== 'undefined') {\n window.DateKit = DateKit\n}\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../../src/core/date.ts","../../src/core/locales.ts","../../src/browser/global.ts"],"sourcesContent":["import customParseFormat from 'dayjs/plugin/customParseFormat.js'\nimport dayjs from 'dayjs'\nimport type { Dayjs } from 'dayjs'\n\nimport { ensureLocaleLoaded, resolveLocale, SUPPORTED_LOCALES, type LocaleInput, type SupportedLocale } from './locales.js'\n\ndayjs.extend(customParseFormat)\ndayjs.locale('en')\n\nexport type DateValue = string | number | Date\n\ntype DateInputOptions = {\n input?: string | readonly string[]\n locale?: LocaleInput\n strict?: boolean\n}\n\nexport type DateParsingOptions = DateInputOptions & {\n date: DateValue\n}\n\nexport type GetDateOptions = DateInputOptions & {\n date?: DateValue\n output?: string\n invalid?: string\n}\n\nexport type DateFormatterConfig = {\n locale?: LocaleInput\n strict?: boolean\n invalid?: string\n}\n\ntype ResolvedDateFormatterConfig = {\n locale: SupportedLocale\n strict: boolean\n invalid: string\n}\n\nexport type DateFormatter = {\n getDate: (props?: GetDateOptions) => string\n parseDate: (props: DateParsingOptions) => ParseDateResult\n isValidDate: (props: DateParsingOptions) => boolean\n getSupportedLocales: () => readonly SupportedLocale[]\n getCurrentLocale: () => SupportedLocale\n setLocale: (locale: LocaleInput) => Promise<void>\n ready: Promise<void>\n}\n\nexport type ParseDateSuccess = {\n isValid: true\n locale: SupportedLocale\n date: Date\n iso: string\n timestamp: number\n format: (output?: string) => string\n}\n\nexport type ParseDateFailure = {\n isValid: false\n locale: SupportedLocale\n date: null\n iso: null\n timestamp: null\n error: string\n}\n\nexport type ParseDateResult = ParseDateSuccess | ParseDateFailure\n\nconst DEFAULT_FORMAT = 'YYYY-MM-DD'\nconst DEFAULT_LOCALE: SupportedLocale = 'en'\nconst DEFAULT_INVALID_DATE = 'Invalid Date'\nconst DEFAULT_STRICT = true\n\nconst createResolvedConfig = (\n locale: SupportedLocale,\n config?: DateFormatterConfig\n): ResolvedDateFormatterConfig => ({\n locale,\n strict: config?.strict ?? DEFAULT_STRICT,\n invalid: config?.invalid ?? DEFAULT_INVALID_DATE\n})\n\nconst getInvalidDateText = (config?: DateFormatterConfig, props?: GetDateOptions): string => {\n return props?.invalid ?? config?.invalid ?? DEFAULT_INVALID_DATE\n}\n\nconst getTargetLocale = (currentLocale: SupportedLocale, props?: GetDateOptions): SupportedLocale => {\n if (!props?.locale) {\n return currentLocale\n }\n\n return resolveLocaleOrThrow(props.locale)\n}\n\nconst getHelperLocale = <T extends { locale?: LocaleInput }>(\n config?: DateFormatterConfig,\n props?: T\n): SupportedLocale => {\n if (props?.locale) {\n return resolveLocaleOrThrow(props.locale)\n }\n\n if (config?.locale) {\n return resolveLocaleOrThrow(config.locale)\n }\n\n return DEFAULT_LOCALE\n}\n\nconst parseDateValue = (\n value: DateValue,\n input: DateParsingOptions['input'],\n locale: SupportedLocale,\n strict: boolean\n): Dayjs => {\n if (!input) {\n return dayjs(value).locale(locale)\n }\n\n if (typeof input === 'string') {\n return dayjs(value, input, locale, strict).locale(locale)\n }\n\n return dayjs(value, [...input], locale, strict).locale(locale)\n}\n\nconst createFormatterParseDate = (getConfig: () => ResolvedDateFormatterConfig) => {\n return (props: DateParsingOptions): ParseDateResult => {\n const config = getConfig()\n const locale = getTargetLocale(config.locale, props)\n const parsed = parseDateValue(props.date, props.input, locale, props.strict ?? config.strict)\n\n if (!parsed.isValid()) {\n return {\n isValid: false,\n locale,\n date: null,\n iso: null,\n timestamp: null,\n error: getInvalidDateText(config, props)\n }\n }\n\n return {\n isValid: true,\n locale,\n date: parsed.toDate(),\n iso: parsed.toISOString(),\n timestamp: parsed.valueOf(),\n format: (output = DEFAULT_FORMAT) => parsed.format(output)\n }\n }\n}\n\nconst createFormatterIsValidDate = (parseDate: (props: DateParsingOptions) => ParseDateResult) => {\n return (props: DateParsingOptions): boolean => parseDate(props).isValid\n}\n\nconst createFormatterGetDate = (getConfig: () => ResolvedDateFormatterConfig) => {\n const parseDate = createFormatterParseDate(getConfig)\n\n return (props?: GetDateOptions): string => {\n const config = getConfig()\n const locale = getTargetLocale(config.locale, props)\n const output = props?.output ?? DEFAULT_FORMAT\n\n if (!props) {\n return dayjs().locale(locale).format(DEFAULT_FORMAT)\n }\n\n if (props.date === undefined) {\n return dayjs().locale(locale).format(output)\n }\n\n const parsed = parseDate({\n date: props.date,\n input: props.input,\n locale: props.locale,\n strict: props.strict\n })\n\n if (!parsed.isValid) {\n return props.invalid ?? parsed.error\n }\n\n return parsed.format(output)\n }\n}\n\nfunction resolveLocaleOrThrow(locale: LocaleInput): SupportedLocale {\n const resolvedLocale = resolveLocale(locale)\n\n if (!resolvedLocale) {\n throw new Error(\n `Unsupported locale: ${locale}. The package tries an exact locale match first and then falls back to the base locale.`\n )\n }\n\n return resolvedLocale\n}\n\nexport const getSupportedLocales = (): readonly SupportedLocale[] => SUPPORTED_LOCALES\n\nexport const getDate = async (props?: GetDateOptions, config?: DateFormatterConfig): Promise<string> => {\n const locale = getHelperLocale(config, props)\n const formatter = createDateFormatter({ ...config, locale })\n\n await formatter.ready\n\n return formatter.getDate(props)\n}\n\nexport const parseDate = async (\n props: DateParsingOptions,\n config?: DateFormatterConfig\n): Promise<ParseDateResult> => {\n const locale = getHelperLocale(config, props)\n const formatter = createDateFormatter({ ...config, locale })\n\n await formatter.ready\n\n return formatter.parseDate(props)\n}\n\nexport const isValidDate = async (\n props: DateParsingOptions,\n config?: DateFormatterConfig\n): Promise<boolean> => {\n const locale = getHelperLocale(config, props)\n const formatter = createDateFormatter({ ...config, locale })\n\n await formatter.ready\n\n return formatter.isValidDate(props)\n}\n\nexport const createDateFormatter = (config?: DateFormatterConfig): DateFormatter => {\n let currentLocale = config?.locale ? resolveLocaleOrThrow(config.locale) : DEFAULT_LOCALE\n\n const getConfig = (): ResolvedDateFormatterConfig => createResolvedConfig(currentLocale, config)\n\n const ready = ensureLocaleLoaded(currentLocale)\n const parseDate = createFormatterParseDate(getConfig)\n\n return {\n getDate: createFormatterGetDate(getConfig),\n parseDate,\n isValidDate: createFormatterIsValidDate(parseDate),\n getSupportedLocales,\n getCurrentLocale: () => currentLocale,\n setLocale: async (locale: LocaleInput) => {\n const resolvedLocale = resolveLocaleOrThrow(locale)\n\n await ensureLocaleLoaded(resolvedLocale)\n currentLocale = resolvedLocale\n },\n ready\n }\n}\n","export const SUPPORTED_LOCALES = [\n 'en',\n 'es',\n 'es-mx',\n 'fr',\n 'pt',\n 'pt-br',\n 'de',\n 'it',\n 'ja'\n] as const\n\nexport type SupportedLocale = (typeof SUPPORTED_LOCALES)[number]\nexport type LocaleInput = string\n\nconst localeLoaders: Record<SupportedLocale, (() => Promise<unknown>) | null> = {\n en: null,\n es: () => import('dayjs/locale/es.js'),\n 'es-mx': () => import('dayjs/locale/es-mx.js'),\n fr: () => import('dayjs/locale/fr.js'),\n pt: () => import('dayjs/locale/pt.js'),\n 'pt-br': () => import('dayjs/locale/pt-br.js'),\n de: () => import('dayjs/locale/de.js'),\n it: () => import('dayjs/locale/it.js'),\n ja: () => import('dayjs/locale/ja.js')\n}\n\nconst normalizeLocale = (locale: string): string => {\n return locale.trim().toLowerCase().replace(/_/g, '-')\n}\n\nconst asSupportedLocale = (locale: string): SupportedLocale | null => {\n if (!SUPPORTED_LOCALES.includes(locale as SupportedLocale)) {\n return null\n }\n\n return locale as SupportedLocale\n}\n\nexport const isSupportedLocale = (locale: string): boolean => {\n return resolveLocale(locale) !== null\n}\n\nexport const resolveLocale = (locale: LocaleInput): SupportedLocale | null => {\n const normalizedLocale = normalizeLocale(locale)\n const exactLocale = asSupportedLocale(normalizedLocale)\n\n if (exactLocale) {\n return exactLocale\n }\n\n const [baseLocale] = normalizedLocale.split('-')\n\n if (!baseLocale) {\n return null\n }\n\n return asSupportedLocale(baseLocale)\n}\n\nexport const ensureLocaleLoaded = async (locale: SupportedLocale): Promise<void> => {\n const load = localeLoaders[locale]\n\n if (!load) {\n return\n }\n\n await load()\n}\n","import {\n createDateFormatter,\n getDate,\n getSupportedLocales,\n isSupportedLocale,\n isValidDate,\n parseDate,\n resolveLocale\n} from '../index.js'\n\nexport const DateKit = {\n createDateFormatter,\n getDate,\n getSupportedLocales,\n isSupportedLocale,\n parseDate,\n isValidDate,\n resolveLocale\n}\n\ndeclare global {\n interface Window {\n DateKit: typeof DateKit\n }\n}\n\nif (typeof window !== 'undefined') {\n window.DateKit = DateKit\n}\n"],"mappings":"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","names":["parseDate"]}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,10 +1,13 @@
|
|
|
1
1
|
declare const SUPPORTED_LOCALES: readonly ["en", "es", "es-mx", "fr", "pt", "pt-br", "de", "it", "ja"];
|
|
2
2
|
type SupportedLocale = (typeof SUPPORTED_LOCALES)[number];
|
|
3
|
+
type LocaleInput = string;
|
|
4
|
+
declare const isSupportedLocale: (locale: string) => boolean;
|
|
5
|
+
declare const resolveLocale: (locale: LocaleInput) => SupportedLocale | null;
|
|
3
6
|
|
|
4
7
|
type DateValue = string | number | Date;
|
|
5
8
|
type DateInputOptions = {
|
|
6
9
|
input?: string | readonly string[];
|
|
7
|
-
locale?:
|
|
10
|
+
locale?: LocaleInput;
|
|
8
11
|
strict?: boolean;
|
|
9
12
|
};
|
|
10
13
|
type DateParsingOptions = DateInputOptions & {
|
|
@@ -16,7 +19,7 @@ type GetDateOptions = DateInputOptions & {
|
|
|
16
19
|
invalid?: string;
|
|
17
20
|
};
|
|
18
21
|
type DateFormatterConfig = {
|
|
19
|
-
locale?:
|
|
22
|
+
locale?: LocaleInput;
|
|
20
23
|
strict?: boolean;
|
|
21
24
|
invalid?: string;
|
|
22
25
|
};
|
|
@@ -26,7 +29,7 @@ type DateFormatter = {
|
|
|
26
29
|
isValidDate: (props: DateParsingOptions) => boolean;
|
|
27
30
|
getSupportedLocales: () => readonly SupportedLocale[];
|
|
28
31
|
getCurrentLocale: () => SupportedLocale;
|
|
29
|
-
setLocale: (locale:
|
|
32
|
+
setLocale: (locale: LocaleInput) => Promise<void>;
|
|
30
33
|
ready: Promise<void>;
|
|
31
34
|
};
|
|
32
35
|
type ParseDateSuccess = {
|
|
@@ -47,6 +50,9 @@ type ParseDateFailure = {
|
|
|
47
50
|
};
|
|
48
51
|
type ParseDateResult = ParseDateSuccess | ParseDateFailure;
|
|
49
52
|
declare const getSupportedLocales: () => readonly SupportedLocale[];
|
|
53
|
+
declare const getDate: (props?: GetDateOptions, config?: DateFormatterConfig) => Promise<string>;
|
|
54
|
+
declare const parseDate: (props: DateParsingOptions, config?: DateFormatterConfig) => Promise<ParseDateResult>;
|
|
55
|
+
declare const isValidDate: (props: DateParsingOptions, config?: DateFormatterConfig) => Promise<boolean>;
|
|
50
56
|
declare const createDateFormatter: (config?: DateFormatterConfig) => DateFormatter;
|
|
51
57
|
|
|
52
|
-
export { type DateFormatter, type DateFormatterConfig, type DateParsingOptions, type DateValue, type GetDateOptions, type ParseDateFailure, type ParseDateResult, type ParseDateSuccess, SUPPORTED_LOCALES, type SupportedLocale, createDateFormatter, getSupportedLocales };
|
|
58
|
+
export { type DateFormatter, type DateFormatterConfig, type DateParsingOptions, type DateValue, type GetDateOptions, type LocaleInput, type ParseDateFailure, type ParseDateResult, type ParseDateSuccess, SUPPORTED_LOCALES, type SupportedLocale, createDateFormatter, getDate, getSupportedLocales, isSupportedLocale, isValidDate, parseDate, resolveLocale };
|
package/dist/index.js
CHANGED
|
@@ -25,8 +25,29 @@ var localeLoaders = {
|
|
|
25
25
|
it: () => import("dayjs/locale/it.js"),
|
|
26
26
|
ja: () => import("dayjs/locale/ja.js")
|
|
27
27
|
};
|
|
28
|
+
var normalizeLocale = (locale) => {
|
|
29
|
+
return locale.trim().toLowerCase().replace(/_/g, "-");
|
|
30
|
+
};
|
|
31
|
+
var asSupportedLocale = (locale) => {
|
|
32
|
+
if (!SUPPORTED_LOCALES.includes(locale)) {
|
|
33
|
+
return null;
|
|
34
|
+
}
|
|
35
|
+
return locale;
|
|
36
|
+
};
|
|
28
37
|
var isSupportedLocale = (locale) => {
|
|
29
|
-
return
|
|
38
|
+
return resolveLocale(locale) !== null;
|
|
39
|
+
};
|
|
40
|
+
var resolveLocale = (locale) => {
|
|
41
|
+
const normalizedLocale = normalizeLocale(locale);
|
|
42
|
+
const exactLocale = asSupportedLocale(normalizedLocale);
|
|
43
|
+
if (exactLocale) {
|
|
44
|
+
return exactLocale;
|
|
45
|
+
}
|
|
46
|
+
const [baseLocale] = normalizedLocale.split("-");
|
|
47
|
+
if (!baseLocale) {
|
|
48
|
+
return null;
|
|
49
|
+
}
|
|
50
|
+
return asSupportedLocale(baseLocale);
|
|
30
51
|
};
|
|
31
52
|
var ensureLocaleLoaded = async (locale) => {
|
|
32
53
|
const load = localeLoaders[locale];
|
|
@@ -42,11 +63,29 @@ dayjs.locale("en");
|
|
|
42
63
|
var DEFAULT_FORMAT = "YYYY-MM-DD";
|
|
43
64
|
var DEFAULT_LOCALE = "en";
|
|
44
65
|
var DEFAULT_INVALID_DATE = "Invalid Date";
|
|
66
|
+
var DEFAULT_STRICT = true;
|
|
67
|
+
var createResolvedConfig = (locale, config) => ({
|
|
68
|
+
locale,
|
|
69
|
+
strict: config?.strict ?? DEFAULT_STRICT,
|
|
70
|
+
invalid: config?.invalid ?? DEFAULT_INVALID_DATE
|
|
71
|
+
});
|
|
45
72
|
var getInvalidDateText = (config, props) => {
|
|
46
73
|
return props?.invalid ?? config?.invalid ?? DEFAULT_INVALID_DATE;
|
|
47
74
|
};
|
|
48
75
|
var getTargetLocale = (currentLocale, props) => {
|
|
49
|
-
|
|
76
|
+
if (!props?.locale) {
|
|
77
|
+
return currentLocale;
|
|
78
|
+
}
|
|
79
|
+
return resolveLocaleOrThrow(props.locale);
|
|
80
|
+
};
|
|
81
|
+
var getHelperLocale = (config, props) => {
|
|
82
|
+
if (props?.locale) {
|
|
83
|
+
return resolveLocaleOrThrow(props.locale);
|
|
84
|
+
}
|
|
85
|
+
if (config?.locale) {
|
|
86
|
+
return resolveLocaleOrThrow(config.locale);
|
|
87
|
+
}
|
|
88
|
+
return DEFAULT_LOCALE;
|
|
50
89
|
};
|
|
51
90
|
var parseDateValue = (value, input, locale, strict) => {
|
|
52
91
|
if (!input) {
|
|
@@ -82,11 +121,11 @@ var createFormatterParseDate = (getConfig) => {
|
|
|
82
121
|
};
|
|
83
122
|
};
|
|
84
123
|
};
|
|
85
|
-
var createFormatterIsValidDate = (
|
|
86
|
-
return (props) =>
|
|
124
|
+
var createFormatterIsValidDate = (parseDate2) => {
|
|
125
|
+
return (props) => parseDate2(props).isValid;
|
|
87
126
|
};
|
|
88
127
|
var createFormatterGetDate = (getConfig) => {
|
|
89
|
-
const
|
|
128
|
+
const parseDate2 = createFormatterParseDate(getConfig);
|
|
90
129
|
return (props) => {
|
|
91
130
|
const config = getConfig();
|
|
92
131
|
const locale = getTargetLocale(config.locale, props);
|
|
@@ -97,7 +136,7 @@ var createFormatterGetDate = (getConfig) => {
|
|
|
97
136
|
if (props.date === void 0) {
|
|
98
137
|
return dayjs().locale(locale).format(output);
|
|
99
138
|
}
|
|
100
|
-
const parsed =
|
|
139
|
+
const parsed = parseDate2({
|
|
101
140
|
date: props.date,
|
|
102
141
|
input: props.input,
|
|
103
142
|
locale: props.locale,
|
|
@@ -109,31 +148,49 @@ var createFormatterGetDate = (getConfig) => {
|
|
|
109
148
|
return parsed.format(output);
|
|
110
149
|
};
|
|
111
150
|
};
|
|
112
|
-
function
|
|
113
|
-
|
|
114
|
-
|
|
151
|
+
function resolveLocaleOrThrow(locale) {
|
|
152
|
+
const resolvedLocale = resolveLocale(locale);
|
|
153
|
+
if (!resolvedLocale) {
|
|
154
|
+
throw new Error(
|
|
155
|
+
`Unsupported locale: ${locale}. The package tries an exact locale match first and then falls back to the base locale.`
|
|
156
|
+
);
|
|
115
157
|
}
|
|
158
|
+
return resolvedLocale;
|
|
116
159
|
}
|
|
117
160
|
var getSupportedLocales = () => SUPPORTED_LOCALES;
|
|
161
|
+
var getDate = async (props, config) => {
|
|
162
|
+
const locale = getHelperLocale(config, props);
|
|
163
|
+
const formatter = createDateFormatter({ ...config, locale });
|
|
164
|
+
await formatter.ready;
|
|
165
|
+
return formatter.getDate(props);
|
|
166
|
+
};
|
|
167
|
+
var parseDate = async (props, config) => {
|
|
168
|
+
const locale = getHelperLocale(config, props);
|
|
169
|
+
const formatter = createDateFormatter({ ...config, locale });
|
|
170
|
+
await formatter.ready;
|
|
171
|
+
return formatter.parseDate(props);
|
|
172
|
+
};
|
|
173
|
+
var isValidDate = async (props, config) => {
|
|
174
|
+
const locale = getHelperLocale(config, props);
|
|
175
|
+
const formatter = createDateFormatter({ ...config, locale });
|
|
176
|
+
await formatter.ready;
|
|
177
|
+
return formatter.isValidDate(props);
|
|
178
|
+
};
|
|
118
179
|
var createDateFormatter = (config) => {
|
|
119
|
-
let currentLocale = config?.locale
|
|
120
|
-
const getConfig = () => (
|
|
121
|
-
locale: currentLocale,
|
|
122
|
-
strict: config?.strict ?? false,
|
|
123
|
-
invalid: config?.invalid ?? DEFAULT_INVALID_DATE
|
|
124
|
-
});
|
|
180
|
+
let currentLocale = config?.locale ? resolveLocaleOrThrow(config.locale) : DEFAULT_LOCALE;
|
|
181
|
+
const getConfig = () => createResolvedConfig(currentLocale, config);
|
|
125
182
|
const ready = ensureLocaleLoaded(currentLocale);
|
|
126
|
-
const
|
|
183
|
+
const parseDate2 = createFormatterParseDate(getConfig);
|
|
127
184
|
return {
|
|
128
185
|
getDate: createFormatterGetDate(getConfig),
|
|
129
|
-
parseDate,
|
|
130
|
-
isValidDate: createFormatterIsValidDate(
|
|
186
|
+
parseDate: parseDate2,
|
|
187
|
+
isValidDate: createFormatterIsValidDate(parseDate2),
|
|
131
188
|
getSupportedLocales,
|
|
132
189
|
getCurrentLocale: () => currentLocale,
|
|
133
190
|
setLocale: async (locale) => {
|
|
134
|
-
|
|
135
|
-
await ensureLocaleLoaded(
|
|
136
|
-
currentLocale =
|
|
191
|
+
const resolvedLocale = resolveLocaleOrThrow(locale);
|
|
192
|
+
await ensureLocaleLoaded(resolvedLocale);
|
|
193
|
+
currentLocale = resolvedLocale;
|
|
137
194
|
},
|
|
138
195
|
ready
|
|
139
196
|
};
|
|
@@ -141,6 +198,11 @@ var createDateFormatter = (config) => {
|
|
|
141
198
|
export {
|
|
142
199
|
SUPPORTED_LOCALES,
|
|
143
200
|
createDateFormatter,
|
|
144
|
-
|
|
201
|
+
getDate,
|
|
202
|
+
getSupportedLocales,
|
|
203
|
+
isSupportedLocale,
|
|
204
|
+
isValidDate,
|
|
205
|
+
parseDate,
|
|
206
|
+
resolveLocale
|
|
145
207
|
};
|
|
146
208
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/core/date.ts","../src/core/locales.ts"],"sourcesContent":["import customParseFormat from 'dayjs/plugin/customParseFormat.js'\nimport dayjs from 'dayjs'\nimport type { Dayjs } from 'dayjs'\n\nimport { ensureLocaleLoaded, isSupportedLocale, SUPPORTED_LOCALES, type SupportedLocale } from './locales.js'\n\ndayjs.extend(customParseFormat)\ndayjs.locale('en')\n\nexport type DateValue = string | number | Date\n\ntype DateInputOptions = {\n input?: string | readonly string[]\n locale?: SupportedLocale\n strict?: boolean\n}\n\nexport type DateParsingOptions = DateInputOptions & {\n date: DateValue\n}\n\nexport type GetDateOptions = DateInputOptions & {\n date?: DateValue\n output?: string\n invalid?: string\n}\n\nexport type DateFormatterConfig = {\n locale?: SupportedLocale\n strict?: boolean\n invalid?: string\n}\n\nexport type DateFormatter = {\n getDate: (props?: GetDateOptions) => string\n parseDate: (props: DateParsingOptions) => ParseDateResult\n isValidDate: (props: DateParsingOptions) => boolean\n getSupportedLocales: () => readonly SupportedLocale[]\n getCurrentLocale: () => SupportedLocale\n setLocale: (locale: SupportedLocale) => Promise<void>\n ready: Promise<void>\n}\n\nexport type ParseDateSuccess = {\n isValid: true\n locale: SupportedLocale\n date: Date\n iso: string\n timestamp: number\n format: (output?: string) => string\n}\n\nexport type ParseDateFailure = {\n isValid: false\n locale: SupportedLocale\n date: null\n iso: null\n timestamp: null\n error: string\n}\n\nexport type ParseDateResult = ParseDateSuccess | ParseDateFailure\n\nconst DEFAULT_FORMAT = 'YYYY-MM-DD'\nconst DEFAULT_LOCALE: SupportedLocale = 'en'\nconst DEFAULT_INVALID_DATE = 'Invalid Date'\n\nconst getInvalidDateText = (config?: DateFormatterConfig, props?: GetDateOptions): string => {\n return props?.invalid ?? config?.invalid ?? DEFAULT_INVALID_DATE\n}\n\nconst getTargetLocale = (currentLocale: SupportedLocale, props?: GetDateOptions): SupportedLocale => {\n return props?.locale ?? currentLocale\n}\n\nconst parseDateValue = (\n value: DateValue,\n input: DateParsingOptions['input'],\n locale: SupportedLocale,\n strict: boolean\n): Dayjs => {\n if (!input) {\n return dayjs(value).locale(locale)\n }\n\n if (typeof input === 'string') {\n return dayjs(value, input, locale, strict).locale(locale)\n }\n\n return dayjs(value, [...input], locale, strict).locale(locale)\n}\n\nconst createFormatterParseDate = (getConfig: () => Required<DateFormatterConfig>) => {\n return (props: DateParsingOptions): ParseDateResult => {\n const config = getConfig()\n const locale = getTargetLocale(config.locale, props)\n const parsed = parseDateValue(props.date, props.input, locale, props.strict ?? config.strict)\n\n if (!parsed.isValid()) {\n return {\n isValid: false,\n locale,\n date: null,\n iso: null,\n timestamp: null,\n error: getInvalidDateText(config, props)\n }\n }\n\n return {\n isValid: true,\n locale,\n date: parsed.toDate(),\n iso: parsed.toISOString(),\n timestamp: parsed.valueOf(),\n format: (output = DEFAULT_FORMAT) => parsed.format(output)\n }\n }\n}\n\nconst createFormatterIsValidDate = (parseDate: (props: DateParsingOptions) => ParseDateResult) => {\n return (props: DateParsingOptions): boolean => parseDate(props).isValid\n}\n\nconst createFormatterGetDate = (getConfig: () => Required<DateFormatterConfig>) => {\n const parseDate = createFormatterParseDate(getConfig)\n\n return (props?: GetDateOptions): string => {\n const config = getConfig()\n const locale = getTargetLocale(config.locale, props)\n const output = props?.output ?? DEFAULT_FORMAT\n\n if (!props) {\n return dayjs().locale(locale).format(DEFAULT_FORMAT)\n }\n\n if (props.date === undefined) {\n return dayjs().locale(locale).format(output)\n }\n\n const parsed = parseDate({\n date: props.date,\n input: props.input,\n locale: props.locale,\n strict: props.strict\n })\n\n if (!parsed.isValid) {\n return props.invalid ?? parsed.error\n }\n\n return parsed.format(output)\n }\n}\n\nfunction assertSupportedLocale(locale: string): asserts locale is SupportedLocale {\n if (!isSupportedLocale(locale)) {\n throw new Error(`Unsupported locale: ${locale}`)\n }\n}\n\nexport const getSupportedLocales = (): readonly SupportedLocale[] => SUPPORTED_LOCALES\n\nexport const createDateFormatter = (config?: DateFormatterConfig): DateFormatter => {\n let currentLocale = config?.locale ?? DEFAULT_LOCALE\n\n const getConfig = (): Required<DateFormatterConfig> => ({\n locale: currentLocale,\n strict: config?.strict ?? false,\n invalid: config?.invalid ?? DEFAULT_INVALID_DATE\n })\n\n const ready = ensureLocaleLoaded(currentLocale)\n const parseDate = createFormatterParseDate(getConfig)\n\n return {\n getDate: createFormatterGetDate(getConfig),\n parseDate,\n isValidDate: createFormatterIsValidDate(parseDate),\n getSupportedLocales,\n getCurrentLocale: () => currentLocale,\n setLocale: async (locale: SupportedLocale) => {\n assertSupportedLocale(locale)\n await ensureLocaleLoaded(locale)\n currentLocale = locale\n },\n ready\n }\n}\n","export const SUPPORTED_LOCALES = [\n 'en',\n 'es',\n 'es-mx',\n 'fr',\n 'pt',\n 'pt-br',\n 'de',\n 'it',\n 'ja'\n] as const\n\nexport type SupportedLocale = (typeof SUPPORTED_LOCALES)[number]\n\nconst localeLoaders: Record<SupportedLocale, (() => Promise<unknown>) | null> = {\n en: null,\n es: () => import('dayjs/locale/es.js'),\n 'es-mx': () => import('dayjs/locale/es-mx.js'),\n fr: () => import('dayjs/locale/fr.js'),\n pt: () => import('dayjs/locale/pt.js'),\n 'pt-br': () => import('dayjs/locale/pt-br.js'),\n de: () => import('dayjs/locale/de.js'),\n it: () => import('dayjs/locale/it.js'),\n ja: () => import('dayjs/locale/ja.js')\n}\n\nexport const isSupportedLocale = (locale: string): locale is SupportedLocale => {\n return SUPPORTED_LOCALES.includes(locale as SupportedLocale)\n}\n\nexport const ensureLocaleLoaded = async (locale: SupportedLocale): Promise<void> => {\n const load = localeLoaders[locale]\n\n if (!load) {\n return\n }\n\n await load()\n}\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../src/core/date.ts","../src/core/locales.ts"],"sourcesContent":["import customParseFormat from 'dayjs/plugin/customParseFormat.js'\nimport dayjs from 'dayjs'\nimport type { Dayjs } from 'dayjs'\n\nimport { ensureLocaleLoaded, resolveLocale, SUPPORTED_LOCALES, type LocaleInput, type SupportedLocale } from './locales.js'\n\ndayjs.extend(customParseFormat)\ndayjs.locale('en')\n\nexport type DateValue = string | number | Date\n\ntype DateInputOptions = {\n input?: string | readonly string[]\n locale?: LocaleInput\n strict?: boolean\n}\n\nexport type DateParsingOptions = DateInputOptions & {\n date: DateValue\n}\n\nexport type GetDateOptions = DateInputOptions & {\n date?: DateValue\n output?: string\n invalid?: string\n}\n\nexport type DateFormatterConfig = {\n locale?: LocaleInput\n strict?: boolean\n invalid?: string\n}\n\ntype ResolvedDateFormatterConfig = {\n locale: SupportedLocale\n strict: boolean\n invalid: string\n}\n\nexport type DateFormatter = {\n getDate: (props?: GetDateOptions) => string\n parseDate: (props: DateParsingOptions) => ParseDateResult\n isValidDate: (props: DateParsingOptions) => boolean\n getSupportedLocales: () => readonly SupportedLocale[]\n getCurrentLocale: () => SupportedLocale\n setLocale: (locale: LocaleInput) => Promise<void>\n ready: Promise<void>\n}\n\nexport type ParseDateSuccess = {\n isValid: true\n locale: SupportedLocale\n date: Date\n iso: string\n timestamp: number\n format: (output?: string) => string\n}\n\nexport type ParseDateFailure = {\n isValid: false\n locale: SupportedLocale\n date: null\n iso: null\n timestamp: null\n error: string\n}\n\nexport type ParseDateResult = ParseDateSuccess | ParseDateFailure\n\nconst DEFAULT_FORMAT = 'YYYY-MM-DD'\nconst DEFAULT_LOCALE: SupportedLocale = 'en'\nconst DEFAULT_INVALID_DATE = 'Invalid Date'\nconst DEFAULT_STRICT = true\n\nconst createResolvedConfig = (\n locale: SupportedLocale,\n config?: DateFormatterConfig\n): ResolvedDateFormatterConfig => ({\n locale,\n strict: config?.strict ?? DEFAULT_STRICT,\n invalid: config?.invalid ?? DEFAULT_INVALID_DATE\n})\n\nconst getInvalidDateText = (config?: DateFormatterConfig, props?: GetDateOptions): string => {\n return props?.invalid ?? config?.invalid ?? DEFAULT_INVALID_DATE\n}\n\nconst getTargetLocale = (currentLocale: SupportedLocale, props?: GetDateOptions): SupportedLocale => {\n if (!props?.locale) {\n return currentLocale\n }\n\n return resolveLocaleOrThrow(props.locale)\n}\n\nconst getHelperLocale = <T extends { locale?: LocaleInput }>(\n config?: DateFormatterConfig,\n props?: T\n): SupportedLocale => {\n if (props?.locale) {\n return resolveLocaleOrThrow(props.locale)\n }\n\n if (config?.locale) {\n return resolveLocaleOrThrow(config.locale)\n }\n\n return DEFAULT_LOCALE\n}\n\nconst parseDateValue = (\n value: DateValue,\n input: DateParsingOptions['input'],\n locale: SupportedLocale,\n strict: boolean\n): Dayjs => {\n if (!input) {\n return dayjs(value).locale(locale)\n }\n\n if (typeof input === 'string') {\n return dayjs(value, input, locale, strict).locale(locale)\n }\n\n return dayjs(value, [...input], locale, strict).locale(locale)\n}\n\nconst createFormatterParseDate = (getConfig: () => ResolvedDateFormatterConfig) => {\n return (props: DateParsingOptions): ParseDateResult => {\n const config = getConfig()\n const locale = getTargetLocale(config.locale, props)\n const parsed = parseDateValue(props.date, props.input, locale, props.strict ?? config.strict)\n\n if (!parsed.isValid()) {\n return {\n isValid: false,\n locale,\n date: null,\n iso: null,\n timestamp: null,\n error: getInvalidDateText(config, props)\n }\n }\n\n return {\n isValid: true,\n locale,\n date: parsed.toDate(),\n iso: parsed.toISOString(),\n timestamp: parsed.valueOf(),\n format: (output = DEFAULT_FORMAT) => parsed.format(output)\n }\n }\n}\n\nconst createFormatterIsValidDate = (parseDate: (props: DateParsingOptions) => ParseDateResult) => {\n return (props: DateParsingOptions): boolean => parseDate(props).isValid\n}\n\nconst createFormatterGetDate = (getConfig: () => ResolvedDateFormatterConfig) => {\n const parseDate = createFormatterParseDate(getConfig)\n\n return (props?: GetDateOptions): string => {\n const config = getConfig()\n const locale = getTargetLocale(config.locale, props)\n const output = props?.output ?? DEFAULT_FORMAT\n\n if (!props) {\n return dayjs().locale(locale).format(DEFAULT_FORMAT)\n }\n\n if (props.date === undefined) {\n return dayjs().locale(locale).format(output)\n }\n\n const parsed = parseDate({\n date: props.date,\n input: props.input,\n locale: props.locale,\n strict: props.strict\n })\n\n if (!parsed.isValid) {\n return props.invalid ?? parsed.error\n }\n\n return parsed.format(output)\n }\n}\n\nfunction resolveLocaleOrThrow(locale: LocaleInput): SupportedLocale {\n const resolvedLocale = resolveLocale(locale)\n\n if (!resolvedLocale) {\n throw new Error(\n `Unsupported locale: ${locale}. The package tries an exact locale match first and then falls back to the base locale.`\n )\n }\n\n return resolvedLocale\n}\n\nexport const getSupportedLocales = (): readonly SupportedLocale[] => SUPPORTED_LOCALES\n\nexport const getDate = async (props?: GetDateOptions, config?: DateFormatterConfig): Promise<string> => {\n const locale = getHelperLocale(config, props)\n const formatter = createDateFormatter({ ...config, locale })\n\n await formatter.ready\n\n return formatter.getDate(props)\n}\n\nexport const parseDate = async (\n props: DateParsingOptions,\n config?: DateFormatterConfig\n): Promise<ParseDateResult> => {\n const locale = getHelperLocale(config, props)\n const formatter = createDateFormatter({ ...config, locale })\n\n await formatter.ready\n\n return formatter.parseDate(props)\n}\n\nexport const isValidDate = async (\n props: DateParsingOptions,\n config?: DateFormatterConfig\n): Promise<boolean> => {\n const locale = getHelperLocale(config, props)\n const formatter = createDateFormatter({ ...config, locale })\n\n await formatter.ready\n\n return formatter.isValidDate(props)\n}\n\nexport const createDateFormatter = (config?: DateFormatterConfig): DateFormatter => {\n let currentLocale = config?.locale ? resolveLocaleOrThrow(config.locale) : DEFAULT_LOCALE\n\n const getConfig = (): ResolvedDateFormatterConfig => createResolvedConfig(currentLocale, config)\n\n const ready = ensureLocaleLoaded(currentLocale)\n const parseDate = createFormatterParseDate(getConfig)\n\n return {\n getDate: createFormatterGetDate(getConfig),\n parseDate,\n isValidDate: createFormatterIsValidDate(parseDate),\n getSupportedLocales,\n getCurrentLocale: () => currentLocale,\n setLocale: async (locale: LocaleInput) => {\n const resolvedLocale = resolveLocaleOrThrow(locale)\n\n await ensureLocaleLoaded(resolvedLocale)\n currentLocale = resolvedLocale\n },\n ready\n }\n}\n","export const SUPPORTED_LOCALES = [\n 'en',\n 'es',\n 'es-mx',\n 'fr',\n 'pt',\n 'pt-br',\n 'de',\n 'it',\n 'ja'\n] as const\n\nexport type SupportedLocale = (typeof SUPPORTED_LOCALES)[number]\nexport type LocaleInput = string\n\nconst localeLoaders: Record<SupportedLocale, (() => Promise<unknown>) | null> = {\n en: null,\n es: () => import('dayjs/locale/es.js'),\n 'es-mx': () => import('dayjs/locale/es-mx.js'),\n fr: () => import('dayjs/locale/fr.js'),\n pt: () => import('dayjs/locale/pt.js'),\n 'pt-br': () => import('dayjs/locale/pt-br.js'),\n de: () => import('dayjs/locale/de.js'),\n it: () => import('dayjs/locale/it.js'),\n ja: () => import('dayjs/locale/ja.js')\n}\n\nconst normalizeLocale = (locale: string): string => {\n return locale.trim().toLowerCase().replace(/_/g, '-')\n}\n\nconst asSupportedLocale = (locale: string): SupportedLocale | null => {\n if (!SUPPORTED_LOCALES.includes(locale as SupportedLocale)) {\n return null\n }\n\n return locale as SupportedLocale\n}\n\nexport const isSupportedLocale = (locale: string): boolean => {\n return resolveLocale(locale) !== null\n}\n\nexport const resolveLocale = (locale: LocaleInput): SupportedLocale | null => {\n const normalizedLocale = normalizeLocale(locale)\n const exactLocale = asSupportedLocale(normalizedLocale)\n\n if (exactLocale) {\n return exactLocale\n }\n\n const [baseLocale] = normalizedLocale.split('-')\n\n if (!baseLocale) {\n return null\n }\n\n return asSupportedLocale(baseLocale)\n}\n\nexport const ensureLocaleLoaded = async (locale: SupportedLocale): Promise<void> => {\n const load = localeLoaders[locale]\n\n if (!load) {\n return\n }\n\n await load()\n}\n"],"mappings":"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","names":["parseDate"]}
|
package/dist/react/index.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { DateFormatterConfig, GetDateOptions, DateParsingOptions, ParseDateResult, SupportedLocale } from '../index.js';
|
|
1
|
+
import { DateFormatterConfig, GetDateOptions, DateParsingOptions, ParseDateResult, SupportedLocale, LocaleInput } from '../index.js';
|
|
2
2
|
|
|
3
3
|
type UseDateFormatterOptions = DateFormatterConfig;
|
|
4
4
|
declare const useDateFormatter: (options?: UseDateFormatterOptions) => {
|
|
@@ -9,7 +9,7 @@ declare const useDateFormatter: (options?: UseDateFormatterOptions) => {
|
|
|
9
9
|
isValidDate: (props: DateParsingOptions) => boolean;
|
|
10
10
|
getSupportedLocales: () => readonly SupportedLocale[];
|
|
11
11
|
ready: Promise<void>;
|
|
12
|
-
setLocale: (nextLocale:
|
|
12
|
+
setLocale: (nextLocale: LocaleInput) => Promise<void>;
|
|
13
13
|
};
|
|
14
14
|
|
|
15
15
|
export { type UseDateFormatterOptions, useDateFormatter };
|