@zag-js/i18n-utils 0.39.0 → 0.41.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/dist/index.d.mts CHANGED
@@ -1,3 +1,24 @@
1
+ interface FormatBytesOptions {
2
+ unit?: "bit" | "byte";
3
+ unitDisplay?: "long" | "short" | "narrow";
4
+ }
5
+ declare const formatBytes: (bytes: number, locale?: string, options?: FormatBytesOptions) => string;
6
+
7
+ /**
8
+ * Formats a date using the given format string as defined in:
9
+ * https://www.unicode.org/reports/tr35/tr35-dates.html#Date_Field_Symbol_Table
10
+ */
11
+ declare function formatDate(date: Date, format: string, locale: string, timeZone?: string): string;
12
+
13
+ declare function formatList(list: string[], locale: string, options?: Intl.ListFormatOptions): string;
14
+
15
+ declare function formatNumber(v: number, locale: string, options?: Intl.NumberFormatOptions): string;
16
+
17
+ declare function formatRelativeTime(value: Date, locale: string, options?: Intl.RelativeTimeFormatOptions): string;
18
+
19
+ declare function isRTL(locale: string): boolean;
20
+ declare function getLocaleDir(locale: string): "rtl" | "ltr";
21
+
1
22
  type Direction = "rtl" | "ltr";
2
23
  interface Locale {
3
24
  locale: string;
@@ -10,19 +31,6 @@ declare global {
10
31
  }
11
32
  declare function getDefaultLocale(): Locale;
12
33
 
13
- declare function isRTL(locale: string): boolean;
14
- declare function getLocaleDir(locale: string): "rtl" | "ltr";
15
-
16
- declare function formatNumber(v: number, locale: string, options?: Intl.NumberFormatOptions): string;
17
-
18
- declare function formatRelativeTime(value: Date, locale: string, options?: Intl.RelativeTimeFormatOptions): string;
19
-
20
- interface FormatBytesOptions {
21
- unit?: "bit" | "byte";
22
- unitDisplay?: "long" | "short" | "narrow";
23
- }
24
- declare const formatBytes: (bytes: number, locale?: string, options?: FormatBytesOptions) => string;
25
-
26
34
  interface LocaleOptions {
27
35
  locale?: string;
28
36
  getRootNode?: () => ShadowRoot | Document | Node;
@@ -30,4 +38,4 @@ interface LocaleOptions {
30
38
  }
31
39
  declare function trackLocale(options?: LocaleOptions): () => void;
32
40
 
33
- export { type FormatBytesOptions, type Locale, type LocaleOptions, formatBytes, formatNumber, formatRelativeTime, getDefaultLocale, getLocaleDir, isRTL, trackLocale };
41
+ export { type FormatBytesOptions, type Locale, type LocaleOptions, formatBytes, formatDate, formatList, formatNumber, formatRelativeTime, getDefaultLocale, getLocaleDir, isRTL, trackLocale };
package/dist/index.d.ts CHANGED
@@ -1,3 +1,24 @@
1
+ interface FormatBytesOptions {
2
+ unit?: "bit" | "byte";
3
+ unitDisplay?: "long" | "short" | "narrow";
4
+ }
5
+ declare const formatBytes: (bytes: number, locale?: string, options?: FormatBytesOptions) => string;
6
+
7
+ /**
8
+ * Formats a date using the given format string as defined in:
9
+ * https://www.unicode.org/reports/tr35/tr35-dates.html#Date_Field_Symbol_Table
10
+ */
11
+ declare function formatDate(date: Date, format: string, locale: string, timeZone?: string): string;
12
+
13
+ declare function formatList(list: string[], locale: string, options?: Intl.ListFormatOptions): string;
14
+
15
+ declare function formatNumber(v: number, locale: string, options?: Intl.NumberFormatOptions): string;
16
+
17
+ declare function formatRelativeTime(value: Date, locale: string, options?: Intl.RelativeTimeFormatOptions): string;
18
+
19
+ declare function isRTL(locale: string): boolean;
20
+ declare function getLocaleDir(locale: string): "rtl" | "ltr";
21
+
1
22
  type Direction = "rtl" | "ltr";
2
23
  interface Locale {
3
24
  locale: string;
@@ -10,19 +31,6 @@ declare global {
10
31
  }
11
32
  declare function getDefaultLocale(): Locale;
12
33
 
13
- declare function isRTL(locale: string): boolean;
14
- declare function getLocaleDir(locale: string): "rtl" | "ltr";
15
-
16
- declare function formatNumber(v: number, locale: string, options?: Intl.NumberFormatOptions): string;
17
-
18
- declare function formatRelativeTime(value: Date, locale: string, options?: Intl.RelativeTimeFormatOptions): string;
19
-
20
- interface FormatBytesOptions {
21
- unit?: "bit" | "byte";
22
- unitDisplay?: "long" | "short" | "narrow";
23
- }
24
- declare const formatBytes: (bytes: number, locale?: string, options?: FormatBytesOptions) => string;
25
-
26
34
  interface LocaleOptions {
27
35
  locale?: string;
28
36
  getRootNode?: () => ShadowRoot | Document | Node;
@@ -30,4 +38,4 @@ interface LocaleOptions {
30
38
  }
31
39
  declare function trackLocale(options?: LocaleOptions): () => void;
32
40
 
33
- export { type FormatBytesOptions, type Locale, type LocaleOptions, formatBytes, formatNumber, formatRelativeTime, getDefaultLocale, getLocaleDir, isRTL, trackLocale };
41
+ export { type FormatBytesOptions, type Locale, type LocaleOptions, formatBytes, formatDate, formatList, formatNumber, formatRelativeTime, getDefaultLocale, getLocaleDir, isRTL, trackLocale };
package/dist/index.js CHANGED
@@ -21,6 +21,8 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
21
21
  var src_exports = {};
22
22
  __export(src_exports, {
23
23
  formatBytes: () => formatBytes,
24
+ formatDate: () => formatDate,
25
+ formatList: () => formatList,
24
26
  formatNumber: () => formatNumber,
25
27
  formatRelativeTime: () => formatRelativeTime,
26
28
  getDefaultLocale: () => getDefaultLocale,
@@ -30,68 +32,6 @@ __export(src_exports, {
30
32
  });
31
33
  module.exports = __toCommonJS(src_exports);
32
34
 
33
- // src/is-rtl.ts
34
- var RTL_SCRIPTS = /* @__PURE__ */ new Set([
35
- "Avst",
36
- "Arab",
37
- "Armi",
38
- "Syrc",
39
- "Samr",
40
- "Mand",
41
- "Thaa",
42
- "Mend",
43
- "Nkoo",
44
- "Adlm",
45
- "Rohg",
46
- "Hebr"
47
- ]);
48
- var RTL_LANGS = /* @__PURE__ */ new Set([
49
- "ae",
50
- "ar",
51
- "arc",
52
- "bcc",
53
- "bqi",
54
- "ckb",
55
- "dv",
56
- "fa",
57
- "glk",
58
- "he",
59
- "ku",
60
- "mzn",
61
- "nqo",
62
- "pnb",
63
- "ps",
64
- "sd",
65
- "ug",
66
- "ur",
67
- "yi"
68
- ]);
69
- function isRTL(locale) {
70
- if (Intl.Locale) {
71
- const script = new Intl.Locale(locale).maximize().script ?? "";
72
- return RTL_SCRIPTS.has(script);
73
- }
74
- const lang = locale.split("-")[0];
75
- return RTL_LANGS.has(lang);
76
- }
77
- function getLocaleDir(locale) {
78
- return isRTL(locale) ? "rtl" : "ltr";
79
- }
80
-
81
- // src/locale.ts
82
- function getDefaultLocale() {
83
- let locale = typeof navigator !== "undefined" && (navigator.language || navigator.userLanguage) || "en-US";
84
- try {
85
- Intl.DateTimeFormat.supportedLocalesOf([locale]);
86
- } catch (_err) {
87
- locale = "en-US";
88
- }
89
- return {
90
- locale,
91
- dir: isRTL(locale) ? "rtl" : "ltr"
92
- };
93
- }
94
-
95
35
  // src/cache.ts
96
36
  function i18nCache(Ins) {
97
37
  const formatterCache = /* @__PURE__ */ new Map();
@@ -106,14 +46,264 @@ function i18nCache(Ins) {
106
46
  };
107
47
  }
108
48
 
109
- // src/number-format.ts
49
+ // src/format-number.ts
110
50
  var getNumberFormatter = i18nCache(Intl.NumberFormat);
111
51
  function formatNumber(v, locale, options = {}) {
112
52
  const formatter = getNumberFormatter(locale, options);
113
53
  return formatter.format(v);
114
54
  }
115
55
 
116
- // src/relative-time-format.ts
56
+ // src/format-bytes.ts
57
+ var bitPrefixes = ["", "kilo", "mega", "giga", "tera"];
58
+ var bytePrefixes = ["", "kilo", "mega", "giga", "tera", "peta"];
59
+ var formatBytes = (bytes, locale = "en-US", options = {}) => {
60
+ if (isNaN(bytes))
61
+ return "";
62
+ if (bytes === 0)
63
+ return "0 B";
64
+ const { unit = "byte", unitDisplay = "short" } = options;
65
+ const prefix = unit === "bit" ? bitPrefixes : bytePrefixes;
66
+ const index = Math.max(0, Math.min(Math.floor(Math.log10(bytes) / 3), prefix.length - 1));
67
+ const _unit = prefix[index] + unit;
68
+ const _unitDisplay = unitDisplay || "short";
69
+ const v = parseFloat((bytes / Math.pow(1e3, index)).toPrecision(3));
70
+ return formatNumber(v, locale, {
71
+ style: "unit",
72
+ unit: _unit,
73
+ unitDisplay: _unitDisplay
74
+ });
75
+ };
76
+
77
+ // src/format-date.ts
78
+ var symbols = "\\s|\\.|-|/|\\\\|,|\\$|\\!|\\?|:|;";
79
+ function createRegEx(sign) {
80
+ return new RegExp("(^|>|" + symbols + ")(" + sign + ")($|<|" + symbols + ")", "g");
81
+ }
82
+ var FORMATS = [
83
+ "G",
84
+ "GG",
85
+ "GGG",
86
+ "GGGG",
87
+ "GGGGG",
88
+ "y",
89
+ "yo",
90
+ "yy",
91
+ "yyy",
92
+ "yyyy",
93
+ "Y",
94
+ "Yo",
95
+ "YY",
96
+ "YYY",
97
+ "YYYY",
98
+ "Q",
99
+ "Qo",
100
+ "QQ",
101
+ "QQQ",
102
+ "QQQQ",
103
+ "QQQQQ",
104
+ "M",
105
+ "Mo",
106
+ "MM",
107
+ "MMM",
108
+ "MMMM",
109
+ "MMMMM",
110
+ "E",
111
+ "EE",
112
+ "EEE",
113
+ "EEEE",
114
+ "EEEEE",
115
+ "EEEEEE",
116
+ "a",
117
+ "aa",
118
+ "aaa",
119
+ "aaaa",
120
+ "aaaaa",
121
+ "d",
122
+ "do",
123
+ "dd",
124
+ "D",
125
+ "Do",
126
+ "DD",
127
+ "DDD",
128
+ "w",
129
+ "wo",
130
+ "ww",
131
+ "s",
132
+ "so",
133
+ "ss",
134
+ "m",
135
+ "mo",
136
+ "mm",
137
+ "h",
138
+ "ho",
139
+ "hh",
140
+ "H",
141
+ "Ho",
142
+ "HH",
143
+ "z",
144
+ "zz",
145
+ "zzz",
146
+ "zzzz",
147
+ "T"
148
+ ];
149
+ function ordinal(num) {
150
+ const n = typeof num === "string" ? parseFloat(num) : num;
151
+ let suffix = "th";
152
+ if (n % 10 === 1 && n % 100 !== 11) {
153
+ suffix = "st";
154
+ } else if (n % 10 === 2 && n % 100 !== 12) {
155
+ suffix = "nd";
156
+ } else if (n % 10 === 3 && n % 100 !== 13) {
157
+ suffix = "rd";
158
+ }
159
+ return `${n}${suffix}`;
160
+ }
161
+ function pad(num, length) {
162
+ return String(num).padStart(length, "0");
163
+ }
164
+ function zone(str) {
165
+ return str.split(/AM|PM/)[1].trim();
166
+ }
167
+ function getFormat(date, options) {
168
+ const { locale, format, timeZone } = options;
169
+ switch (format) {
170
+ case "G":
171
+ case "GG":
172
+ case "GGG":
173
+ return date.toLocaleString(locale, { era: "short" });
174
+ case "GGGG":
175
+ return date.toLocaleString(locale, { era: "long" });
176
+ case "GGGGG":
177
+ return date.toLocaleString(locale, { era: "narrow" });
178
+ case "y":
179
+ case "Y":
180
+ return date.getFullYear();
181
+ case "yo":
182
+ case "Yo":
183
+ return ordinal(date.toLocaleString(locale, { year: "numeric" }));
184
+ case "yy":
185
+ case "YY":
186
+ return date.toLocaleString(locale, { year: "2-digit" });
187
+ case "yyy":
188
+ case "YYY":
189
+ return date.toLocaleString(locale, { year: "numeric" }).padStart(3, "0");
190
+ case "yyyy":
191
+ case "YYYY":
192
+ return date.toLocaleString(locale, { year: "numeric" }).padStart(4, "0");
193
+ case "Q":
194
+ case "QQQQQ":
195
+ return Math.ceil((date.getMonth() + 1) / 3);
196
+ case "Qo":
197
+ return ordinal(Math.ceil((date.getMonth() + 1) / 3));
198
+ case "QQ":
199
+ return pad(Math.ceil((date.getMonth() + 1) / 3), 2);
200
+ case "QQQ":
201
+ return `Q${Math.ceil((date.getMonth() + 1) / 3)}`;
202
+ case "QQQQ": {
203
+ const base = ordinal(String(Math.ceil((date.getMonth() + 1) / 3)));
204
+ return `${base} quarter`;
205
+ }
206
+ case "M":
207
+ return date.getMonth() + 1;
208
+ case "Mo":
209
+ return ordinal(date.getMonth() + 1);
210
+ case "MM":
211
+ return date.toLocaleString(locale, { month: "2-digit" });
212
+ case "MMM":
213
+ return date.toLocaleString(locale, { month: "short" });
214
+ case "MMMM":
215
+ return date.toLocaleString(locale, { month: "long" });
216
+ case "MMMMM":
217
+ return date.toLocaleString(locale, { month: "narrow" });
218
+ case "w":
219
+ return Math.ceil(date.getDate() / 7);
220
+ case "wo":
221
+ return ordinal(Math.ceil(date.getDate() / 7));
222
+ case "ww":
223
+ return pad(Math.ceil(date.getDate() / 7), 2);
224
+ case "d":
225
+ case "D":
226
+ return date.getDate();
227
+ case "do":
228
+ case "Do":
229
+ return ordinal(date.getDate());
230
+ case "dd":
231
+ case "DD":
232
+ return date.toLocaleString(locale, { day: "2-digit" });
233
+ case "DDD":
234
+ return pad(date.getDate(), 3);
235
+ case "E":
236
+ case "EE":
237
+ case "EEE":
238
+ return date.toLocaleString(locale, { weekday: "short" });
239
+ case "EEEE":
240
+ return date.toLocaleString(locale, { weekday: "long" });
241
+ case "EEEEE":
242
+ return date.toLocaleString(locale, { weekday: "narrow" });
243
+ case "EEEEEE":
244
+ return date.toLocaleString(locale, { weekday: "short" }).slice(0, 2);
245
+ case "h":
246
+ return date.toLocaleString(locale, { hour: "numeric", hour12: true });
247
+ case "ho":
248
+ return ordinal(date.toLocaleString(locale, { hour: "2-digit", hour12: true }));
249
+ case "hh":
250
+ return date.toLocaleString(locale, { hour: "2-digit", hour12: true });
251
+ case "H":
252
+ return date.toLocaleString(locale, { hour: "numeric", hour12: false });
253
+ case "Ho":
254
+ return ordinal(+date.toLocaleString(locale, { hour: "numeric", hour12: false }));
255
+ case "HH":
256
+ return date.toLocaleString(locale, { hour: "2-digit", hour12: false });
257
+ case "m":
258
+ return date.toLocaleString(locale, { minute: "numeric" });
259
+ case "mo":
260
+ return ordinal(date.toLocaleString(locale, { minute: "numeric" }));
261
+ case "mm":
262
+ return date.toLocaleString(locale, { minute: "2-digit" });
263
+ case "s":
264
+ return date.toLocaleString(locale, { second: "numeric" });
265
+ case "so":
266
+ return ordinal(date.toLocaleString(locale, { second: "numeric" }));
267
+ case "ss":
268
+ return date.toLocaleString(locale, { second: "2-digit" });
269
+ case "T":
270
+ return date.getTime();
271
+ case "a":
272
+ case "aa":
273
+ case "aaa":
274
+ return date.toLocaleString(locale, { hour: "numeric", hour12: true }).toLocaleUpperCase();
275
+ case "aaaa":
276
+ return date.toLocaleString(locale, { hour: "numeric", hour12: true }).toLocaleLowerCase();
277
+ case "aaaaa":
278
+ return date.toLocaleString(locale, { hour: "numeric", hour12: true }).charAt(0);
279
+ case "z":
280
+ case "zz":
281
+ case "zzz": {
282
+ return zone(date.toLocaleString(locale, { timeZone, timeZoneName: "shortOffset" }));
283
+ }
284
+ case "zzzz":
285
+ return zone(date.toLocaleString(locale, { timeZone, timeZoneName: "longOffset" }));
286
+ default:
287
+ throw new Error(`Unknown format: ${format}`);
288
+ }
289
+ }
290
+ function formatDate(date, format, locale, timeZone) {
291
+ let result = format;
292
+ for (const key of FORMATS) {
293
+ const res = getFormat(date, { locale, format: key, timeZone });
294
+ result = result.replace(createRegEx(key), "$1" + res + "$3");
295
+ }
296
+ return result;
297
+ }
298
+
299
+ // src/format-list.ts
300
+ var getListFormatter = i18nCache(Intl.ListFormat);
301
+ function formatList(list, locale, options = {}) {
302
+ const formatter = getListFormatter(locale, options);
303
+ return formatter.format(list);
304
+ }
305
+
306
+ // src/format-relative-time.ts
117
307
  var getRelativeTimeFormatter = i18nCache(Intl.RelativeTimeFormat);
118
308
  function formatRelativeTime(value, locale, options = {}) {
119
309
  const rtf = getRelativeTimeFormatter(locale, options);
@@ -156,26 +346,67 @@ function getDistance(startDate, endDate) {
156
346
  };
157
347
  }
158
348
 
159
- // src/byte-format.ts
160
- var bitPrefixes = ["", "kilo", "mega", "giga", "tera"];
161
- var bytePrefixes = ["", "kilo", "mega", "giga", "tera", "peta"];
162
- var formatBytes = (bytes, locale = "en-US", options = {}) => {
163
- if (isNaN(bytes))
164
- return "";
165
- if (bytes === 0)
166
- return "0 B";
167
- const { unit = "byte", unitDisplay = "short" } = options;
168
- const prefix = unit === "bit" ? bitPrefixes : bytePrefixes;
169
- const index = Math.max(0, Math.min(Math.floor(Math.log10(bytes) / 3), prefix.length - 1));
170
- const _unit = prefix[index] + unit;
171
- const _unitDisplay = unitDisplay || "short";
172
- const v = parseFloat((bytes / Math.pow(1e3, index)).toPrecision(3));
173
- return formatNumber(v, locale, {
174
- style: "unit",
175
- unit: _unit,
176
- unitDisplay: _unitDisplay
177
- });
178
- };
349
+ // src/is-rtl.ts
350
+ var RTL_SCRIPTS = /* @__PURE__ */ new Set([
351
+ "Avst",
352
+ "Arab",
353
+ "Armi",
354
+ "Syrc",
355
+ "Samr",
356
+ "Mand",
357
+ "Thaa",
358
+ "Mend",
359
+ "Nkoo",
360
+ "Adlm",
361
+ "Rohg",
362
+ "Hebr"
363
+ ]);
364
+ var RTL_LANGS = /* @__PURE__ */ new Set([
365
+ "ae",
366
+ "ar",
367
+ "arc",
368
+ "bcc",
369
+ "bqi",
370
+ "ckb",
371
+ "dv",
372
+ "fa",
373
+ "glk",
374
+ "he",
375
+ "ku",
376
+ "mzn",
377
+ "nqo",
378
+ "pnb",
379
+ "ps",
380
+ "sd",
381
+ "ug",
382
+ "ur",
383
+ "yi"
384
+ ]);
385
+ function isRTL(locale) {
386
+ if (Intl.Locale) {
387
+ const script = new Intl.Locale(locale).maximize().script ?? "";
388
+ return RTL_SCRIPTS.has(script);
389
+ }
390
+ const lang = locale.split("-")[0];
391
+ return RTL_LANGS.has(lang);
392
+ }
393
+ function getLocaleDir(locale) {
394
+ return isRTL(locale) ? "rtl" : "ltr";
395
+ }
396
+
397
+ // src/locale.ts
398
+ function getDefaultLocale() {
399
+ let locale = typeof navigator !== "undefined" && (navigator.language || navigator.userLanguage) || "en-US";
400
+ try {
401
+ Intl.DateTimeFormat.supportedLocalesOf([locale]);
402
+ } catch (_err) {
403
+ locale = "en-US";
404
+ }
405
+ return {
406
+ locale,
407
+ dir: isRTL(locale) ? "rtl" : "ltr"
408
+ };
409
+ }
179
410
 
180
411
  // src/track-locale.ts
181
412
  var import_dom_query = require("@zag-js/dom-query");
@@ -194,6 +425,8 @@ function trackLocale(options = {}) {
194
425
  // Annotate the CommonJS export names for ESM import in node:
195
426
  0 && (module.exports = {
196
427
  formatBytes,
428
+ formatDate,
429
+ formatList,
197
430
  formatNumber,
198
431
  formatRelativeTime,
199
432
  getDefaultLocale,
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/is-rtl.ts","../src/locale.ts","../src/cache.ts","../src/number-format.ts","../src/relative-time-format.ts","../src/byte-format.ts","../src/track-locale.ts"],"sourcesContent":["export { getDefaultLocale } from \"./locale\"\nexport type { Locale } from \"./locale\"\nexport { getLocaleDir, isRTL } from \"./is-rtl\"\nexport * from \"./number-format\"\nexport * from \"./relative-time-format\"\nexport * from \"./byte-format\"\nexport { trackLocale } from \"./track-locale\"\nexport type { LocaleOptions } from \"./track-locale\"\n","const RTL_SCRIPTS = new Set([\n \"Avst\",\n \"Arab\",\n \"Armi\",\n \"Syrc\",\n \"Samr\",\n \"Mand\",\n \"Thaa\",\n \"Mend\",\n \"Nkoo\",\n \"Adlm\",\n \"Rohg\",\n \"Hebr\",\n])\n\nconst RTL_LANGS = new Set([\n \"ae\",\n \"ar\",\n \"arc\",\n \"bcc\",\n \"bqi\",\n \"ckb\",\n \"dv\",\n \"fa\",\n \"glk\",\n \"he\",\n \"ku\",\n \"mzn\",\n \"nqo\",\n \"pnb\",\n \"ps\",\n \"sd\",\n \"ug\",\n \"ur\",\n \"yi\",\n])\n\nexport function isRTL(locale: string) {\n if (Intl.Locale) {\n const script = new Intl.Locale(locale).maximize().script ?? \"\"\n return RTL_SCRIPTS.has(script)\n }\n\n const lang = locale.split(\"-\")[0]\n return RTL_LANGS.has(lang)\n}\n\nexport function getLocaleDir(locale: string) {\n return isRTL(locale) ? \"rtl\" : \"ltr\"\n}\n","import { isRTL } from \"./is-rtl\"\n\nexport type Direction = \"rtl\" | \"ltr\"\n\nexport interface Locale {\n locale: string\n dir: Direction\n}\n\ndeclare global {\n interface Navigator {\n userLanguage?: string\n }\n}\n\nexport function getDefaultLocale(): Locale {\n let locale = (typeof navigator !== \"undefined\" && (navigator.language || navigator.userLanguage)) || \"en-US\"\n\n try {\n Intl.DateTimeFormat.supportedLocalesOf([locale])\n } catch (_err) {\n locale = \"en-US\"\n }\n\n return {\n locale,\n dir: isRTL(locale) ? \"rtl\" : \"ltr\",\n }\n}\n","type FormatOptions<T> = T extends Intl.NumberFormat\n ? Intl.NumberFormatOptions\n : T extends Intl.DateTimeFormat\n ? Intl.DateTimeFormatOptions\n : T extends Intl.RelativeTimeFormat\n ? Intl.RelativeTimeFormatOptions\n : never\n\nexport function i18nCache<T extends abstract new (...args: any) => any>(Ins: T) {\n const formatterCache = new Map<string, T>()\n\n return function create(locale: string, options?: FormatOptions<InstanceType<T>>): InstanceType<T> {\n const cacheKey =\n locale +\n (options\n ? Object.entries(options)\n .sort((a, b) => (a[0] < b[0] ? -1 : 1))\n .join()\n : \"\")\n\n if (formatterCache.has(cacheKey)) {\n return formatterCache.get(cacheKey) as any\n }\n\n // @ts-ignore\n let formatter = new Ins(locale, options)\n formatterCache.set(cacheKey, formatter)\n\n return formatter as any\n }\n}\n","import { i18nCache } from \"./cache\"\n\nconst getNumberFormatter = i18nCache(Intl.NumberFormat)\n\nexport function formatNumber(v: number, locale: string, options: Intl.NumberFormatOptions = {}) {\n const formatter = getNumberFormatter(locale, options)\n return formatter.format(v)\n}\n","import { i18nCache } from \"./cache\"\n\nconst getRelativeTimeFormatter = i18nCache(Intl.RelativeTimeFormat)\n\nexport function formatRelativeTime(value: Date, locale: string, options: Intl.RelativeTimeFormatOptions = {}) {\n const rtf = getRelativeTimeFormatter(locale, options)\n const now = new Date()\n const diff = getDistance(now, value)\n if (diff.years > 0) return rtf.format(diff.years * diff.sign, \"year\")\n if (diff.months > 0) return rtf.format(diff.months * diff.sign, \"month\")\n if (diff.weeks > 0) return rtf.format(diff.weeks * diff.sign, \"week\")\n if (diff.days > 0) return rtf.format(diff.days * diff.sign, \"day\")\n if (diff.hours > 0) return rtf.format(diff.hours * diff.sign, \"hour\")\n if (diff.minutes > 0) return rtf.format(diff.minutes * diff.sign, \"minute\")\n return rtf.format(diff.seconds * diff.sign, \"second\")\n}\n\nconst SECOND_TO_MS = 1000\nconst MINUTE_TO_MS = 1000 * 60\nconst HOUR_TO_MS = 1000 * 60 * 60\nconst DAY_TO_MS = 1000 * 60 * 60 * 24\nconst WEEK_TO_MS = 1000 * 60 * 60 * 24 * 7\nconst MONTH_TO_MS = 1000 * 60 * 60 * 24 * 30\nconst YEAR_TO_MS = 1000 * 60 * 60 * 24 * 365\n\nfunction getDistance(startDate: Date, endDate: Date) {\n const endTime = endDate.getTime()\n const startTime = startDate.getTime()\n const distance = Math.abs(endTime - startTime)\n\n return {\n sign: Math.sign(endTime - startTime),\n days: Math.floor(distance / DAY_TO_MS),\n hours: Math.floor((distance % DAY_TO_MS) / HOUR_TO_MS),\n minutes: Math.floor((distance % HOUR_TO_MS) / MINUTE_TO_MS),\n seconds: Math.floor((distance % MINUTE_TO_MS) / SECOND_TO_MS),\n weeks: Math.floor(distance / WEEK_TO_MS),\n months: Math.floor(distance / MONTH_TO_MS),\n years: Math.floor(distance / YEAR_TO_MS),\n }\n}\n","import { formatNumber } from \"./number-format\"\n\nconst bitPrefixes = [\"\", \"kilo\", \"mega\", \"giga\", \"tera\"]\nconst bytePrefixes = [\"\", \"kilo\", \"mega\", \"giga\", \"tera\", \"peta\"]\n\nexport interface FormatBytesOptions {\n unit?: \"bit\" | \"byte\"\n unitDisplay?: \"long\" | \"short\" | \"narrow\"\n}\n\nexport const formatBytes = (bytes: number, locale = \"en-US\", options: FormatBytesOptions = {}) => {\n if (isNaN(bytes)) return \"\"\n if (bytes === 0) return \"0 B\"\n\n const { unit = \"byte\", unitDisplay = \"short\" } = options\n\n const prefix = unit === \"bit\" ? bitPrefixes : bytePrefixes\n const index = Math.max(0, Math.min(Math.floor(Math.log10(bytes) / 3), prefix.length - 1))\n\n const _unit = prefix[index] + unit\n const _unitDisplay = unitDisplay || \"short\"\n\n const v = parseFloat((bytes / Math.pow(1000, index)).toPrecision(3))\n\n return formatNumber(v, locale, {\n style: \"unit\",\n unit: _unit,\n unitDisplay: _unitDisplay,\n })\n}\n","import { getWindow } from \"@zag-js/dom-query\"\nimport { getDefaultLocale, type Locale } from \"./locale\"\n\nexport interface LocaleOptions {\n locale?: string\n getRootNode?: () => ShadowRoot | Document | Node\n onLocaleChange?: (locale: Locale) => void\n}\n\nexport function trackLocale(options: LocaleOptions = {}) {\n const { getRootNode, onLocaleChange } = options\n\n onLocaleChange?.(getDefaultLocale())\n\n const handleLocaleChange = () => {\n onLocaleChange?.(getDefaultLocale())\n }\n\n const win = getRootNode ? getWindow(getRootNode()) : window\n\n win.addEventListener(\"languagechange\", handleLocaleChange)\n\n return () => {\n win.removeEventListener(\"languagechange\", handleLocaleChange)\n }\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../src/index.ts","../src/cache.ts","../src/format-number.ts","../src/format-bytes.ts","../src/format-date.ts","../src/format-list.ts","../src/format-relative-time.ts","../src/is-rtl.ts","../src/locale.ts","../src/track-locale.ts"],"sourcesContent":["export * from \"./format-bytes\"\nexport * from \"./format-date\"\nexport * from \"./format-list\"\nexport * from \"./format-number\"\nexport * from \"./format-relative-time\"\nexport { getLocaleDir, isRTL } from \"./is-rtl\"\nexport { getDefaultLocale } from \"./locale\"\nexport type { Locale } from \"./locale\"\nexport { trackLocale } from \"./track-locale\"\nexport type { LocaleOptions } from \"./track-locale\"\n","type FormatOptions<T> = T extends Intl.NumberFormat\n ? Intl.NumberFormatOptions\n : T extends Intl.DateTimeFormat\n ? Intl.DateTimeFormatOptions\n : T extends Intl.RelativeTimeFormat\n ? Intl.RelativeTimeFormatOptions\n : T extends Intl.ListFormat\n ? Intl.ListFormatOptions\n : T extends Intl.PluralRules\n ? Intl.PluralRulesOptions\n : never\n\nexport function i18nCache<T extends abstract new (...args: any) => any>(Ins: T) {\n const formatterCache = new Map<string, T>()\n\n return function create(locale: string, options?: FormatOptions<InstanceType<T>>): InstanceType<T> {\n const cacheKey =\n locale +\n (options\n ? Object.entries(options)\n .sort((a, b) => (a[0] < b[0] ? -1 : 1))\n .join()\n : \"\")\n\n if (formatterCache.has(cacheKey)) {\n return formatterCache.get(cacheKey) as any\n }\n\n // @ts-ignore\n let formatter = new Ins(locale, options)\n formatterCache.set(cacheKey, formatter)\n\n return formatter as any\n }\n}\n","import { i18nCache } from \"./cache\"\n\nconst getNumberFormatter = i18nCache(Intl.NumberFormat)\n\nexport function formatNumber(v: number, locale: string, options: Intl.NumberFormatOptions = {}) {\n const formatter = getNumberFormatter(locale, options)\n return formatter.format(v)\n}\n","import { formatNumber } from \"./format-number\"\n\nconst bitPrefixes = [\"\", \"kilo\", \"mega\", \"giga\", \"tera\"]\nconst bytePrefixes = [\"\", \"kilo\", \"mega\", \"giga\", \"tera\", \"peta\"]\n\nexport interface FormatBytesOptions {\n unit?: \"bit\" | \"byte\"\n unitDisplay?: \"long\" | \"short\" | \"narrow\"\n}\n\nexport const formatBytes = (bytes: number, locale = \"en-US\", options: FormatBytesOptions = {}) => {\n if (isNaN(bytes)) return \"\"\n if (bytes === 0) return \"0 B\"\n\n const { unit = \"byte\", unitDisplay = \"short\" } = options\n\n const prefix = unit === \"bit\" ? bitPrefixes : bytePrefixes\n const index = Math.max(0, Math.min(Math.floor(Math.log10(bytes) / 3), prefix.length - 1))\n\n const _unit = prefix[index] + unit\n const _unitDisplay = unitDisplay || \"short\"\n\n const v = parseFloat((bytes / Math.pow(1000, index)).toPrecision(3))\n\n return formatNumber(v, locale, {\n style: \"unit\",\n unit: _unit,\n unitDisplay: _unitDisplay,\n })\n}\n","const symbols = \"\\\\s|\\\\.|-|/|\\\\\\\\|,|\\\\$|\\\\!|\\\\?|:|;\"\n\nfunction createRegEx(sign: string) {\n return new RegExp(\"(^|>|\" + symbols + \")(\" + sign + \")($|<|\" + symbols + \")\", \"g\")\n}\n\n// prettier-ignore\nconst FORMATS = [\n\"G\",\"GG\",\"GGG\",\"GGGG\",\"GGGGG\",\n\"y\",\"yo\",\"yy\",\"yyy\",\"yyyy\",\n\"Y\",\"Yo\",\"YY\",\"YYY\",\"YYYY\",\n\"Q\",\"Qo\",\"QQ\",\"QQQ\",\"QQQQ\",\"QQQQQ\",\n\"M\",\"Mo\",\"MM\",\"MMM\",\"MMMM\",\"MMMMM\",\n\"E\",\"EE\",\"EEE\",\"EEEE\",\"EEEEE\",\"EEEEEE\",\n\"a\",\"aa\",\"aaa\",\"aaaa\",\"aaaaa\",\n\"d\",\"do\",\"dd\",\n\"D\",\"Do\",\"DD\",\"DDD\",\n\"w\",\"wo\",\"ww\",\n\"s\",\"so\",\"ss\",\n\"m\",\"mo\",\"mm\",\n\"h\",\"ho\",\"hh\",\n\"H\",\"Ho\",\"HH\",\n\"z\",\"zz\",\"zzz\",\"zzzz\",\n\"T\",\n] as const\n\ntype Format = (typeof FORMATS)[number]\n\ninterface FormatDateOptions {\n locale: string\n format: Format\n timeZone?: string\n}\n\nfunction ordinal(num: string | number) {\n const n = typeof num === \"string\" ? parseFloat(num) : num\n let suffix = \"th\"\n if (n % 10 === 1 && n % 100 !== 11) {\n suffix = \"st\"\n } else if (n % 10 === 2 && n % 100 !== 12) {\n suffix = \"nd\"\n } else if (n % 10 === 3 && n % 100 !== 13) {\n suffix = \"rd\"\n }\n return `${n}${suffix}`\n}\n\nfunction pad(num: number, length: number) {\n return String(num).padStart(length, \"0\")\n}\n\nfunction zone(str: string) {\n return str.split(/AM|PM/)[1].trim()\n}\n\nfunction getFormat(date: Date, options: FormatDateOptions) {\n const { locale, format, timeZone } = options\n\n switch (format) {\n // era\n case \"G\":\n case \"GG\":\n case \"GGG\":\n return date.toLocaleString(locale, { era: \"short\" })\n case \"GGGG\":\n return date.toLocaleString(locale, { era: \"long\" })\n case \"GGGGG\":\n return date.toLocaleString(locale, { era: \"narrow\" })\n\n // year\n case \"y\":\n case \"Y\":\n return date.getFullYear()\n case \"yo\":\n case \"Yo\":\n return ordinal(date.toLocaleString(locale, { year: \"numeric\" }))\n case \"yy\":\n case \"YY\":\n return date.toLocaleString(locale, { year: \"2-digit\" })\n case \"yyy\":\n case \"YYY\":\n return date.toLocaleString(locale, { year: \"numeric\" }).padStart(3, \"0\")\n case \"yyyy\":\n case \"YYYY\":\n return date.toLocaleString(locale, { year: \"numeric\" }).padStart(4, \"0\")\n\n // quarter\n case \"Q\":\n case \"QQQQQ\":\n return Math.ceil((date.getMonth() + 1) / 3)\n case \"Qo\":\n return ordinal(Math.ceil((date.getMonth() + 1) / 3))\n case \"QQ\":\n return pad(Math.ceil((date.getMonth() + 1) / 3), 2)\n case \"QQQ\":\n return `Q${Math.ceil((date.getMonth() + 1) / 3)}`\n case \"QQQQ\": {\n const base = ordinal(String(Math.ceil((date.getMonth() + 1) / 3)))\n return `${base} quarter`\n }\n\n // month\n case \"M\":\n return date.getMonth() + 1\n case \"Mo\":\n return ordinal(date.getMonth() + 1)\n case \"MM\":\n return date.toLocaleString(locale, { month: \"2-digit\" })\n case \"MMM\":\n return date.toLocaleString(locale, { month: \"short\" })\n case \"MMMM\":\n return date.toLocaleString(locale, { month: \"long\" })\n case \"MMMMM\":\n return date.toLocaleString(locale, { month: \"narrow\" })\n\n // week\n case \"w\":\n return Math.ceil(date.getDate() / 7)\n case \"wo\":\n return ordinal(Math.ceil(date.getDate() / 7))\n case \"ww\":\n return pad(Math.ceil(date.getDate() / 7), 2)\n\n // day\n case \"d\":\n case \"D\":\n return date.getDate()\n case \"do\":\n case \"Do\":\n return ordinal(date.getDate())\n case \"dd\":\n case \"DD\":\n return date.toLocaleString(locale, { day: \"2-digit\" })\n case \"DDD\":\n return pad(date.getDate(), 3)\n\n // weekday\n case \"E\":\n case \"EE\":\n case \"EEE\":\n return date.toLocaleString(locale, { weekday: \"short\" })\n case \"EEEE\":\n return date.toLocaleString(locale, { weekday: \"long\" })\n case \"EEEEE\":\n return date.toLocaleString(locale, { weekday: \"narrow\" })\n case \"EEEEEE\":\n return date.toLocaleString(locale, { weekday: \"short\" }).slice(0, 2)\n\n // hour\n case \"h\":\n return date.toLocaleString(locale, { hour: \"numeric\", hour12: true })\n case \"ho\":\n return ordinal(date.toLocaleString(locale, { hour: \"2-digit\", hour12: true }))\n case \"hh\":\n return date.toLocaleString(locale, { hour: \"2-digit\", hour12: true })\n case \"H\":\n return date.toLocaleString(locale, { hour: \"numeric\", hour12: false })\n case \"Ho\":\n return ordinal(+date.toLocaleString(locale, { hour: \"numeric\", hour12: false }))\n case \"HH\":\n return date.toLocaleString(locale, { hour: \"2-digit\", hour12: false })\n\n // minute\n case \"m\":\n return date.toLocaleString(locale, { minute: \"numeric\" })\n case \"mo\":\n return ordinal(date.toLocaleString(locale, { minute: \"numeric\" }))\n case \"mm\":\n return date.toLocaleString(locale, { minute: \"2-digit\" })\n\n // second\n case \"s\":\n return date.toLocaleString(locale, { second: \"numeric\" })\n case \"so\":\n return ordinal(date.toLocaleString(locale, { second: \"numeric\" }))\n case \"ss\":\n return date.toLocaleString(locale, { second: \"2-digit\" })\n\n // timestamp\n case \"T\":\n return date.getTime()\n\n // day period\n case \"a\":\n case \"aa\":\n case \"aaa\":\n return date.toLocaleString(locale, { hour: \"numeric\", hour12: true }).toLocaleUpperCase()\n case \"aaaa\":\n return date.toLocaleString(locale, { hour: \"numeric\", hour12: true }).toLocaleLowerCase()\n case \"aaaaa\":\n return date.toLocaleString(locale, { hour: \"numeric\", hour12: true }).charAt(0)\n\n // TODO:Revise this\n case \"z\":\n case \"zz\":\n case \"zzz\": {\n return zone(date.toLocaleString(locale, { timeZone, timeZoneName: \"shortOffset\" }))\n }\n case \"zzzz\":\n return zone(date.toLocaleString(locale, { timeZone, timeZoneName: \"longOffset\" }))\n\n default:\n throw new Error(`Unknown format: ${format}`)\n }\n}\n\n/**\n * Formats a date using the given format string as defined in:\n * https://www.unicode.org/reports/tr35/tr35-dates.html#Date_Field_Symbol_Table\n */\nexport function formatDate(date: Date, format: string, locale: string, timeZone?: string) {\n let result = format\n for (const key of FORMATS) {\n const res = getFormat(date, { locale, format: key, timeZone })\n result = result.replace(createRegEx(key), \"$1\" + res + \"$3\")\n }\n return result\n}\n","import { i18nCache } from \"./cache\"\n\nconst getListFormatter = i18nCache(Intl.ListFormat)\n\nexport function formatList(list: string[], locale: string, options: Intl.ListFormatOptions = {}) {\n const formatter = getListFormatter(locale, options)\n return formatter.format(list)\n}\n","import { i18nCache } from \"./cache\"\n\nconst getRelativeTimeFormatter = i18nCache(Intl.RelativeTimeFormat)\n\nexport function formatRelativeTime(value: Date, locale: string, options: Intl.RelativeTimeFormatOptions = {}) {\n const rtf = getRelativeTimeFormatter(locale, options)\n\n const now = new Date()\n const diff = getDistance(now, value)\n\n if (diff.years > 0) return rtf.format(diff.years * diff.sign, \"year\")\n if (diff.months > 0) return rtf.format(diff.months * diff.sign, \"month\")\n if (diff.weeks > 0) return rtf.format(diff.weeks * diff.sign, \"week\")\n if (diff.days > 0) return rtf.format(diff.days * diff.sign, \"day\")\n if (diff.hours > 0) return rtf.format(diff.hours * diff.sign, \"hour\")\n if (diff.minutes > 0) return rtf.format(diff.minutes * diff.sign, \"minute\")\n\n return rtf.format(diff.seconds * diff.sign, \"second\")\n}\n\nconst SECOND_TO_MS = 1000\nconst MINUTE_TO_MS = 1000 * 60\nconst HOUR_TO_MS = 1000 * 60 * 60\nconst DAY_TO_MS = 1000 * 60 * 60 * 24\nconst WEEK_TO_MS = 1000 * 60 * 60 * 24 * 7\nconst MONTH_TO_MS = 1000 * 60 * 60 * 24 * 30\nconst YEAR_TO_MS = 1000 * 60 * 60 * 24 * 365\n\nfunction getDistance(startDate: Date, endDate: Date) {\n const endTime = endDate.getTime()\n const startTime = startDate.getTime()\n const distance = Math.abs(endTime - startTime)\n\n return {\n sign: Math.sign(endTime - startTime),\n days: Math.floor(distance / DAY_TO_MS),\n hours: Math.floor((distance % DAY_TO_MS) / HOUR_TO_MS),\n minutes: Math.floor((distance % HOUR_TO_MS) / MINUTE_TO_MS),\n seconds: Math.floor((distance % MINUTE_TO_MS) / SECOND_TO_MS),\n weeks: Math.floor(distance / WEEK_TO_MS),\n months: Math.floor(distance / MONTH_TO_MS),\n years: Math.floor(distance / YEAR_TO_MS),\n }\n}\n","const RTL_SCRIPTS = new Set([\n \"Avst\",\n \"Arab\",\n \"Armi\",\n \"Syrc\",\n \"Samr\",\n \"Mand\",\n \"Thaa\",\n \"Mend\",\n \"Nkoo\",\n \"Adlm\",\n \"Rohg\",\n \"Hebr\",\n])\n\nconst RTL_LANGS = new Set([\n \"ae\",\n \"ar\",\n \"arc\",\n \"bcc\",\n \"bqi\",\n \"ckb\",\n \"dv\",\n \"fa\",\n \"glk\",\n \"he\",\n \"ku\",\n \"mzn\",\n \"nqo\",\n \"pnb\",\n \"ps\",\n \"sd\",\n \"ug\",\n \"ur\",\n \"yi\",\n])\n\nexport function isRTL(locale: string) {\n if (Intl.Locale) {\n const script = new Intl.Locale(locale).maximize().script ?? \"\"\n return RTL_SCRIPTS.has(script)\n }\n\n const lang = locale.split(\"-\")[0]\n return RTL_LANGS.has(lang)\n}\n\nexport function getLocaleDir(locale: string) {\n return isRTL(locale) ? \"rtl\" : \"ltr\"\n}\n","import { isRTL } from \"./is-rtl\"\n\nexport type Direction = \"rtl\" | \"ltr\"\n\nexport interface Locale {\n locale: string\n dir: Direction\n}\n\ndeclare global {\n interface Navigator {\n userLanguage?: string\n }\n}\n\nexport function getDefaultLocale(): Locale {\n let locale = (typeof navigator !== \"undefined\" && (navigator.language || navigator.userLanguage)) || \"en-US\"\n\n try {\n Intl.DateTimeFormat.supportedLocalesOf([locale])\n } catch (_err) {\n locale = \"en-US\"\n }\n\n return {\n locale,\n dir: isRTL(locale) ? \"rtl\" : \"ltr\",\n }\n}\n","import { getWindow } from \"@zag-js/dom-query\"\nimport { getDefaultLocale, type Locale } from \"./locale\"\n\nexport interface LocaleOptions {\n locale?: string\n getRootNode?: () => ShadowRoot | Document | Node\n onLocaleChange?: (locale: Locale) => void\n}\n\nexport function trackLocale(options: LocaleOptions = {}) {\n const { getRootNode, onLocaleChange } = options\n\n onLocaleChange?.(getDefaultLocale())\n\n const handleLocaleChange = () => {\n onLocaleChange?.(getDefaultLocale())\n }\n\n const win = getRootNode ? getWindow(getRootNode()) : window\n\n win.addEventListener(\"languagechange\", handleLocaleChange)\n\n return () => {\n win.removeEventListener(\"languagechange\", handleLocaleChange)\n }\n}\n"],"mappings":"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","names":[]}
package/dist/index.mjs CHANGED
@@ -1,65 +1,3 @@
1
- // src/is-rtl.ts
2
- var RTL_SCRIPTS = /* @__PURE__ */ new Set([
3
- "Avst",
4
- "Arab",
5
- "Armi",
6
- "Syrc",
7
- "Samr",
8
- "Mand",
9
- "Thaa",
10
- "Mend",
11
- "Nkoo",
12
- "Adlm",
13
- "Rohg",
14
- "Hebr"
15
- ]);
16
- var RTL_LANGS = /* @__PURE__ */ new Set([
17
- "ae",
18
- "ar",
19
- "arc",
20
- "bcc",
21
- "bqi",
22
- "ckb",
23
- "dv",
24
- "fa",
25
- "glk",
26
- "he",
27
- "ku",
28
- "mzn",
29
- "nqo",
30
- "pnb",
31
- "ps",
32
- "sd",
33
- "ug",
34
- "ur",
35
- "yi"
36
- ]);
37
- function isRTL(locale) {
38
- if (Intl.Locale) {
39
- const script = new Intl.Locale(locale).maximize().script ?? "";
40
- return RTL_SCRIPTS.has(script);
41
- }
42
- const lang = locale.split("-")[0];
43
- return RTL_LANGS.has(lang);
44
- }
45
- function getLocaleDir(locale) {
46
- return isRTL(locale) ? "rtl" : "ltr";
47
- }
48
-
49
- // src/locale.ts
50
- function getDefaultLocale() {
51
- let locale = typeof navigator !== "undefined" && (navigator.language || navigator.userLanguage) || "en-US";
52
- try {
53
- Intl.DateTimeFormat.supportedLocalesOf([locale]);
54
- } catch (_err) {
55
- locale = "en-US";
56
- }
57
- return {
58
- locale,
59
- dir: isRTL(locale) ? "rtl" : "ltr"
60
- };
61
- }
62
-
63
1
  // src/cache.ts
64
2
  function i18nCache(Ins) {
65
3
  const formatterCache = /* @__PURE__ */ new Map();
@@ -74,14 +12,264 @@ function i18nCache(Ins) {
74
12
  };
75
13
  }
76
14
 
77
- // src/number-format.ts
15
+ // src/format-number.ts
78
16
  var getNumberFormatter = i18nCache(Intl.NumberFormat);
79
17
  function formatNumber(v, locale, options = {}) {
80
18
  const formatter = getNumberFormatter(locale, options);
81
19
  return formatter.format(v);
82
20
  }
83
21
 
84
- // src/relative-time-format.ts
22
+ // src/format-bytes.ts
23
+ var bitPrefixes = ["", "kilo", "mega", "giga", "tera"];
24
+ var bytePrefixes = ["", "kilo", "mega", "giga", "tera", "peta"];
25
+ var formatBytes = (bytes, locale = "en-US", options = {}) => {
26
+ if (isNaN(bytes))
27
+ return "";
28
+ if (bytes === 0)
29
+ return "0 B";
30
+ const { unit = "byte", unitDisplay = "short" } = options;
31
+ const prefix = unit === "bit" ? bitPrefixes : bytePrefixes;
32
+ const index = Math.max(0, Math.min(Math.floor(Math.log10(bytes) / 3), prefix.length - 1));
33
+ const _unit = prefix[index] + unit;
34
+ const _unitDisplay = unitDisplay || "short";
35
+ const v = parseFloat((bytes / Math.pow(1e3, index)).toPrecision(3));
36
+ return formatNumber(v, locale, {
37
+ style: "unit",
38
+ unit: _unit,
39
+ unitDisplay: _unitDisplay
40
+ });
41
+ };
42
+
43
+ // src/format-date.ts
44
+ var symbols = "\\s|\\.|-|/|\\\\|,|\\$|\\!|\\?|:|;";
45
+ function createRegEx(sign) {
46
+ return new RegExp("(^|>|" + symbols + ")(" + sign + ")($|<|" + symbols + ")", "g");
47
+ }
48
+ var FORMATS = [
49
+ "G",
50
+ "GG",
51
+ "GGG",
52
+ "GGGG",
53
+ "GGGGG",
54
+ "y",
55
+ "yo",
56
+ "yy",
57
+ "yyy",
58
+ "yyyy",
59
+ "Y",
60
+ "Yo",
61
+ "YY",
62
+ "YYY",
63
+ "YYYY",
64
+ "Q",
65
+ "Qo",
66
+ "QQ",
67
+ "QQQ",
68
+ "QQQQ",
69
+ "QQQQQ",
70
+ "M",
71
+ "Mo",
72
+ "MM",
73
+ "MMM",
74
+ "MMMM",
75
+ "MMMMM",
76
+ "E",
77
+ "EE",
78
+ "EEE",
79
+ "EEEE",
80
+ "EEEEE",
81
+ "EEEEEE",
82
+ "a",
83
+ "aa",
84
+ "aaa",
85
+ "aaaa",
86
+ "aaaaa",
87
+ "d",
88
+ "do",
89
+ "dd",
90
+ "D",
91
+ "Do",
92
+ "DD",
93
+ "DDD",
94
+ "w",
95
+ "wo",
96
+ "ww",
97
+ "s",
98
+ "so",
99
+ "ss",
100
+ "m",
101
+ "mo",
102
+ "mm",
103
+ "h",
104
+ "ho",
105
+ "hh",
106
+ "H",
107
+ "Ho",
108
+ "HH",
109
+ "z",
110
+ "zz",
111
+ "zzz",
112
+ "zzzz",
113
+ "T"
114
+ ];
115
+ function ordinal(num) {
116
+ const n = typeof num === "string" ? parseFloat(num) : num;
117
+ let suffix = "th";
118
+ if (n % 10 === 1 && n % 100 !== 11) {
119
+ suffix = "st";
120
+ } else if (n % 10 === 2 && n % 100 !== 12) {
121
+ suffix = "nd";
122
+ } else if (n % 10 === 3 && n % 100 !== 13) {
123
+ suffix = "rd";
124
+ }
125
+ return `${n}${suffix}`;
126
+ }
127
+ function pad(num, length) {
128
+ return String(num).padStart(length, "0");
129
+ }
130
+ function zone(str) {
131
+ return str.split(/AM|PM/)[1].trim();
132
+ }
133
+ function getFormat(date, options) {
134
+ const { locale, format, timeZone } = options;
135
+ switch (format) {
136
+ case "G":
137
+ case "GG":
138
+ case "GGG":
139
+ return date.toLocaleString(locale, { era: "short" });
140
+ case "GGGG":
141
+ return date.toLocaleString(locale, { era: "long" });
142
+ case "GGGGG":
143
+ return date.toLocaleString(locale, { era: "narrow" });
144
+ case "y":
145
+ case "Y":
146
+ return date.getFullYear();
147
+ case "yo":
148
+ case "Yo":
149
+ return ordinal(date.toLocaleString(locale, { year: "numeric" }));
150
+ case "yy":
151
+ case "YY":
152
+ return date.toLocaleString(locale, { year: "2-digit" });
153
+ case "yyy":
154
+ case "YYY":
155
+ return date.toLocaleString(locale, { year: "numeric" }).padStart(3, "0");
156
+ case "yyyy":
157
+ case "YYYY":
158
+ return date.toLocaleString(locale, { year: "numeric" }).padStart(4, "0");
159
+ case "Q":
160
+ case "QQQQQ":
161
+ return Math.ceil((date.getMonth() + 1) / 3);
162
+ case "Qo":
163
+ return ordinal(Math.ceil((date.getMonth() + 1) / 3));
164
+ case "QQ":
165
+ return pad(Math.ceil((date.getMonth() + 1) / 3), 2);
166
+ case "QQQ":
167
+ return `Q${Math.ceil((date.getMonth() + 1) / 3)}`;
168
+ case "QQQQ": {
169
+ const base = ordinal(String(Math.ceil((date.getMonth() + 1) / 3)));
170
+ return `${base} quarter`;
171
+ }
172
+ case "M":
173
+ return date.getMonth() + 1;
174
+ case "Mo":
175
+ return ordinal(date.getMonth() + 1);
176
+ case "MM":
177
+ return date.toLocaleString(locale, { month: "2-digit" });
178
+ case "MMM":
179
+ return date.toLocaleString(locale, { month: "short" });
180
+ case "MMMM":
181
+ return date.toLocaleString(locale, { month: "long" });
182
+ case "MMMMM":
183
+ return date.toLocaleString(locale, { month: "narrow" });
184
+ case "w":
185
+ return Math.ceil(date.getDate() / 7);
186
+ case "wo":
187
+ return ordinal(Math.ceil(date.getDate() / 7));
188
+ case "ww":
189
+ return pad(Math.ceil(date.getDate() / 7), 2);
190
+ case "d":
191
+ case "D":
192
+ return date.getDate();
193
+ case "do":
194
+ case "Do":
195
+ return ordinal(date.getDate());
196
+ case "dd":
197
+ case "DD":
198
+ return date.toLocaleString(locale, { day: "2-digit" });
199
+ case "DDD":
200
+ return pad(date.getDate(), 3);
201
+ case "E":
202
+ case "EE":
203
+ case "EEE":
204
+ return date.toLocaleString(locale, { weekday: "short" });
205
+ case "EEEE":
206
+ return date.toLocaleString(locale, { weekday: "long" });
207
+ case "EEEEE":
208
+ return date.toLocaleString(locale, { weekday: "narrow" });
209
+ case "EEEEEE":
210
+ return date.toLocaleString(locale, { weekday: "short" }).slice(0, 2);
211
+ case "h":
212
+ return date.toLocaleString(locale, { hour: "numeric", hour12: true });
213
+ case "ho":
214
+ return ordinal(date.toLocaleString(locale, { hour: "2-digit", hour12: true }));
215
+ case "hh":
216
+ return date.toLocaleString(locale, { hour: "2-digit", hour12: true });
217
+ case "H":
218
+ return date.toLocaleString(locale, { hour: "numeric", hour12: false });
219
+ case "Ho":
220
+ return ordinal(+date.toLocaleString(locale, { hour: "numeric", hour12: false }));
221
+ case "HH":
222
+ return date.toLocaleString(locale, { hour: "2-digit", hour12: false });
223
+ case "m":
224
+ return date.toLocaleString(locale, { minute: "numeric" });
225
+ case "mo":
226
+ return ordinal(date.toLocaleString(locale, { minute: "numeric" }));
227
+ case "mm":
228
+ return date.toLocaleString(locale, { minute: "2-digit" });
229
+ case "s":
230
+ return date.toLocaleString(locale, { second: "numeric" });
231
+ case "so":
232
+ return ordinal(date.toLocaleString(locale, { second: "numeric" }));
233
+ case "ss":
234
+ return date.toLocaleString(locale, { second: "2-digit" });
235
+ case "T":
236
+ return date.getTime();
237
+ case "a":
238
+ case "aa":
239
+ case "aaa":
240
+ return date.toLocaleString(locale, { hour: "numeric", hour12: true }).toLocaleUpperCase();
241
+ case "aaaa":
242
+ return date.toLocaleString(locale, { hour: "numeric", hour12: true }).toLocaleLowerCase();
243
+ case "aaaaa":
244
+ return date.toLocaleString(locale, { hour: "numeric", hour12: true }).charAt(0);
245
+ case "z":
246
+ case "zz":
247
+ case "zzz": {
248
+ return zone(date.toLocaleString(locale, { timeZone, timeZoneName: "shortOffset" }));
249
+ }
250
+ case "zzzz":
251
+ return zone(date.toLocaleString(locale, { timeZone, timeZoneName: "longOffset" }));
252
+ default:
253
+ throw new Error(`Unknown format: ${format}`);
254
+ }
255
+ }
256
+ function formatDate(date, format, locale, timeZone) {
257
+ let result = format;
258
+ for (const key of FORMATS) {
259
+ const res = getFormat(date, { locale, format: key, timeZone });
260
+ result = result.replace(createRegEx(key), "$1" + res + "$3");
261
+ }
262
+ return result;
263
+ }
264
+
265
+ // src/format-list.ts
266
+ var getListFormatter = i18nCache(Intl.ListFormat);
267
+ function formatList(list, locale, options = {}) {
268
+ const formatter = getListFormatter(locale, options);
269
+ return formatter.format(list);
270
+ }
271
+
272
+ // src/format-relative-time.ts
85
273
  var getRelativeTimeFormatter = i18nCache(Intl.RelativeTimeFormat);
86
274
  function formatRelativeTime(value, locale, options = {}) {
87
275
  const rtf = getRelativeTimeFormatter(locale, options);
@@ -124,26 +312,67 @@ function getDistance(startDate, endDate) {
124
312
  };
125
313
  }
126
314
 
127
- // src/byte-format.ts
128
- var bitPrefixes = ["", "kilo", "mega", "giga", "tera"];
129
- var bytePrefixes = ["", "kilo", "mega", "giga", "tera", "peta"];
130
- var formatBytes = (bytes, locale = "en-US", options = {}) => {
131
- if (isNaN(bytes))
132
- return "";
133
- if (bytes === 0)
134
- return "0 B";
135
- const { unit = "byte", unitDisplay = "short" } = options;
136
- const prefix = unit === "bit" ? bitPrefixes : bytePrefixes;
137
- const index = Math.max(0, Math.min(Math.floor(Math.log10(bytes) / 3), prefix.length - 1));
138
- const _unit = prefix[index] + unit;
139
- const _unitDisplay = unitDisplay || "short";
140
- const v = parseFloat((bytes / Math.pow(1e3, index)).toPrecision(3));
141
- return formatNumber(v, locale, {
142
- style: "unit",
143
- unit: _unit,
144
- unitDisplay: _unitDisplay
145
- });
146
- };
315
+ // src/is-rtl.ts
316
+ var RTL_SCRIPTS = /* @__PURE__ */ new Set([
317
+ "Avst",
318
+ "Arab",
319
+ "Armi",
320
+ "Syrc",
321
+ "Samr",
322
+ "Mand",
323
+ "Thaa",
324
+ "Mend",
325
+ "Nkoo",
326
+ "Adlm",
327
+ "Rohg",
328
+ "Hebr"
329
+ ]);
330
+ var RTL_LANGS = /* @__PURE__ */ new Set([
331
+ "ae",
332
+ "ar",
333
+ "arc",
334
+ "bcc",
335
+ "bqi",
336
+ "ckb",
337
+ "dv",
338
+ "fa",
339
+ "glk",
340
+ "he",
341
+ "ku",
342
+ "mzn",
343
+ "nqo",
344
+ "pnb",
345
+ "ps",
346
+ "sd",
347
+ "ug",
348
+ "ur",
349
+ "yi"
350
+ ]);
351
+ function isRTL(locale) {
352
+ if (Intl.Locale) {
353
+ const script = new Intl.Locale(locale).maximize().script ?? "";
354
+ return RTL_SCRIPTS.has(script);
355
+ }
356
+ const lang = locale.split("-")[0];
357
+ return RTL_LANGS.has(lang);
358
+ }
359
+ function getLocaleDir(locale) {
360
+ return isRTL(locale) ? "rtl" : "ltr";
361
+ }
362
+
363
+ // src/locale.ts
364
+ function getDefaultLocale() {
365
+ let locale = typeof navigator !== "undefined" && (navigator.language || navigator.userLanguage) || "en-US";
366
+ try {
367
+ Intl.DateTimeFormat.supportedLocalesOf([locale]);
368
+ } catch (_err) {
369
+ locale = "en-US";
370
+ }
371
+ return {
372
+ locale,
373
+ dir: isRTL(locale) ? "rtl" : "ltr"
374
+ };
375
+ }
147
376
 
148
377
  // src/track-locale.ts
149
378
  import { getWindow } from "@zag-js/dom-query";
@@ -161,6 +390,8 @@ function trackLocale(options = {}) {
161
390
  }
162
391
  export {
163
392
  formatBytes,
393
+ formatDate,
394
+ formatList,
164
395
  formatNumber,
165
396
  formatRelativeTime,
166
397
  getDefaultLocale,
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/is-rtl.ts","../src/locale.ts","../src/cache.ts","../src/number-format.ts","../src/relative-time-format.ts","../src/byte-format.ts","../src/track-locale.ts"],"sourcesContent":["const RTL_SCRIPTS = new Set([\n \"Avst\",\n \"Arab\",\n \"Armi\",\n \"Syrc\",\n \"Samr\",\n \"Mand\",\n \"Thaa\",\n \"Mend\",\n \"Nkoo\",\n \"Adlm\",\n \"Rohg\",\n \"Hebr\",\n])\n\nconst RTL_LANGS = new Set([\n \"ae\",\n \"ar\",\n \"arc\",\n \"bcc\",\n \"bqi\",\n \"ckb\",\n \"dv\",\n \"fa\",\n \"glk\",\n \"he\",\n \"ku\",\n \"mzn\",\n \"nqo\",\n \"pnb\",\n \"ps\",\n \"sd\",\n \"ug\",\n \"ur\",\n \"yi\",\n])\n\nexport function isRTL(locale: string) {\n if (Intl.Locale) {\n const script = new Intl.Locale(locale).maximize().script ?? \"\"\n return RTL_SCRIPTS.has(script)\n }\n\n const lang = locale.split(\"-\")[0]\n return RTL_LANGS.has(lang)\n}\n\nexport function getLocaleDir(locale: string) {\n return isRTL(locale) ? \"rtl\" : \"ltr\"\n}\n","import { isRTL } from \"./is-rtl\"\n\nexport type Direction = \"rtl\" | \"ltr\"\n\nexport interface Locale {\n locale: string\n dir: Direction\n}\n\ndeclare global {\n interface Navigator {\n userLanguage?: string\n }\n}\n\nexport function getDefaultLocale(): Locale {\n let locale = (typeof navigator !== \"undefined\" && (navigator.language || navigator.userLanguage)) || \"en-US\"\n\n try {\n Intl.DateTimeFormat.supportedLocalesOf([locale])\n } catch (_err) {\n locale = \"en-US\"\n }\n\n return {\n locale,\n dir: isRTL(locale) ? \"rtl\" : \"ltr\",\n }\n}\n","type FormatOptions<T> = T extends Intl.NumberFormat\n ? Intl.NumberFormatOptions\n : T extends Intl.DateTimeFormat\n ? Intl.DateTimeFormatOptions\n : T extends Intl.RelativeTimeFormat\n ? Intl.RelativeTimeFormatOptions\n : never\n\nexport function i18nCache<T extends abstract new (...args: any) => any>(Ins: T) {\n const formatterCache = new Map<string, T>()\n\n return function create(locale: string, options?: FormatOptions<InstanceType<T>>): InstanceType<T> {\n const cacheKey =\n locale +\n (options\n ? Object.entries(options)\n .sort((a, b) => (a[0] < b[0] ? -1 : 1))\n .join()\n : \"\")\n\n if (formatterCache.has(cacheKey)) {\n return formatterCache.get(cacheKey) as any\n }\n\n // @ts-ignore\n let formatter = new Ins(locale, options)\n formatterCache.set(cacheKey, formatter)\n\n return formatter as any\n }\n}\n","import { i18nCache } from \"./cache\"\n\nconst getNumberFormatter = i18nCache(Intl.NumberFormat)\n\nexport function formatNumber(v: number, locale: string, options: Intl.NumberFormatOptions = {}) {\n const formatter = getNumberFormatter(locale, options)\n return formatter.format(v)\n}\n","import { i18nCache } from \"./cache\"\n\nconst getRelativeTimeFormatter = i18nCache(Intl.RelativeTimeFormat)\n\nexport function formatRelativeTime(value: Date, locale: string, options: Intl.RelativeTimeFormatOptions = {}) {\n const rtf = getRelativeTimeFormatter(locale, options)\n const now = new Date()\n const diff = getDistance(now, value)\n if (diff.years > 0) return rtf.format(diff.years * diff.sign, \"year\")\n if (diff.months > 0) return rtf.format(diff.months * diff.sign, \"month\")\n if (diff.weeks > 0) return rtf.format(diff.weeks * diff.sign, \"week\")\n if (diff.days > 0) return rtf.format(diff.days * diff.sign, \"day\")\n if (diff.hours > 0) return rtf.format(diff.hours * diff.sign, \"hour\")\n if (diff.minutes > 0) return rtf.format(diff.minutes * diff.sign, \"minute\")\n return rtf.format(diff.seconds * diff.sign, \"second\")\n}\n\nconst SECOND_TO_MS = 1000\nconst MINUTE_TO_MS = 1000 * 60\nconst HOUR_TO_MS = 1000 * 60 * 60\nconst DAY_TO_MS = 1000 * 60 * 60 * 24\nconst WEEK_TO_MS = 1000 * 60 * 60 * 24 * 7\nconst MONTH_TO_MS = 1000 * 60 * 60 * 24 * 30\nconst YEAR_TO_MS = 1000 * 60 * 60 * 24 * 365\n\nfunction getDistance(startDate: Date, endDate: Date) {\n const endTime = endDate.getTime()\n const startTime = startDate.getTime()\n const distance = Math.abs(endTime - startTime)\n\n return {\n sign: Math.sign(endTime - startTime),\n days: Math.floor(distance / DAY_TO_MS),\n hours: Math.floor((distance % DAY_TO_MS) / HOUR_TO_MS),\n minutes: Math.floor((distance % HOUR_TO_MS) / MINUTE_TO_MS),\n seconds: Math.floor((distance % MINUTE_TO_MS) / SECOND_TO_MS),\n weeks: Math.floor(distance / WEEK_TO_MS),\n months: Math.floor(distance / MONTH_TO_MS),\n years: Math.floor(distance / YEAR_TO_MS),\n }\n}\n","import { formatNumber } from \"./number-format\"\n\nconst bitPrefixes = [\"\", \"kilo\", \"mega\", \"giga\", \"tera\"]\nconst bytePrefixes = [\"\", \"kilo\", \"mega\", \"giga\", \"tera\", \"peta\"]\n\nexport interface FormatBytesOptions {\n unit?: \"bit\" | \"byte\"\n unitDisplay?: \"long\" | \"short\" | \"narrow\"\n}\n\nexport const formatBytes = (bytes: number, locale = \"en-US\", options: FormatBytesOptions = {}) => {\n if (isNaN(bytes)) return \"\"\n if (bytes === 0) return \"0 B\"\n\n const { unit = \"byte\", unitDisplay = \"short\" } = options\n\n const prefix = unit === \"bit\" ? bitPrefixes : bytePrefixes\n const index = Math.max(0, Math.min(Math.floor(Math.log10(bytes) / 3), prefix.length - 1))\n\n const _unit = prefix[index] + unit\n const _unitDisplay = unitDisplay || \"short\"\n\n const v = parseFloat((bytes / Math.pow(1000, index)).toPrecision(3))\n\n return formatNumber(v, locale, {\n style: \"unit\",\n unit: _unit,\n unitDisplay: _unitDisplay,\n })\n}\n","import { getWindow } from \"@zag-js/dom-query\"\nimport { getDefaultLocale, type Locale } from \"./locale\"\n\nexport interface LocaleOptions {\n locale?: string\n getRootNode?: () => ShadowRoot | Document | Node\n onLocaleChange?: (locale: Locale) => void\n}\n\nexport function trackLocale(options: LocaleOptions = {}) {\n const { getRootNode, onLocaleChange } = options\n\n onLocaleChange?.(getDefaultLocale())\n\n const handleLocaleChange = () => {\n onLocaleChange?.(getDefaultLocale())\n }\n\n const win = getRootNode ? getWindow(getRootNode()) : window\n\n win.addEventListener(\"languagechange\", handleLocaleChange)\n\n return () => {\n win.removeEventListener(\"languagechange\", handleLocaleChange)\n }\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../src/cache.ts","../src/format-number.ts","../src/format-bytes.ts","../src/format-date.ts","../src/format-list.ts","../src/format-relative-time.ts","../src/is-rtl.ts","../src/locale.ts","../src/track-locale.ts"],"sourcesContent":["type FormatOptions<T> = T extends Intl.NumberFormat\n ? Intl.NumberFormatOptions\n : T extends Intl.DateTimeFormat\n ? Intl.DateTimeFormatOptions\n : T extends Intl.RelativeTimeFormat\n ? Intl.RelativeTimeFormatOptions\n : T extends Intl.ListFormat\n ? Intl.ListFormatOptions\n : T extends Intl.PluralRules\n ? Intl.PluralRulesOptions\n : never\n\nexport function i18nCache<T extends abstract new (...args: any) => any>(Ins: T) {\n const formatterCache = new Map<string, T>()\n\n return function create(locale: string, options?: FormatOptions<InstanceType<T>>): InstanceType<T> {\n const cacheKey =\n locale +\n (options\n ? Object.entries(options)\n .sort((a, b) => (a[0] < b[0] ? -1 : 1))\n .join()\n : \"\")\n\n if (formatterCache.has(cacheKey)) {\n return formatterCache.get(cacheKey) as any\n }\n\n // @ts-ignore\n let formatter = new Ins(locale, options)\n formatterCache.set(cacheKey, formatter)\n\n return formatter as any\n }\n}\n","import { i18nCache } from \"./cache\"\n\nconst getNumberFormatter = i18nCache(Intl.NumberFormat)\n\nexport function formatNumber(v: number, locale: string, options: Intl.NumberFormatOptions = {}) {\n const formatter = getNumberFormatter(locale, options)\n return formatter.format(v)\n}\n","import { formatNumber } from \"./format-number\"\n\nconst bitPrefixes = [\"\", \"kilo\", \"mega\", \"giga\", \"tera\"]\nconst bytePrefixes = [\"\", \"kilo\", \"mega\", \"giga\", \"tera\", \"peta\"]\n\nexport interface FormatBytesOptions {\n unit?: \"bit\" | \"byte\"\n unitDisplay?: \"long\" | \"short\" | \"narrow\"\n}\n\nexport const formatBytes = (bytes: number, locale = \"en-US\", options: FormatBytesOptions = {}) => {\n if (isNaN(bytes)) return \"\"\n if (bytes === 0) return \"0 B\"\n\n const { unit = \"byte\", unitDisplay = \"short\" } = options\n\n const prefix = unit === \"bit\" ? bitPrefixes : bytePrefixes\n const index = Math.max(0, Math.min(Math.floor(Math.log10(bytes) / 3), prefix.length - 1))\n\n const _unit = prefix[index] + unit\n const _unitDisplay = unitDisplay || \"short\"\n\n const v = parseFloat((bytes / Math.pow(1000, index)).toPrecision(3))\n\n return formatNumber(v, locale, {\n style: \"unit\",\n unit: _unit,\n unitDisplay: _unitDisplay,\n })\n}\n","const symbols = \"\\\\s|\\\\.|-|/|\\\\\\\\|,|\\\\$|\\\\!|\\\\?|:|;\"\n\nfunction createRegEx(sign: string) {\n return new RegExp(\"(^|>|\" + symbols + \")(\" + sign + \")($|<|\" + symbols + \")\", \"g\")\n}\n\n// prettier-ignore\nconst FORMATS = [\n\"G\",\"GG\",\"GGG\",\"GGGG\",\"GGGGG\",\n\"y\",\"yo\",\"yy\",\"yyy\",\"yyyy\",\n\"Y\",\"Yo\",\"YY\",\"YYY\",\"YYYY\",\n\"Q\",\"Qo\",\"QQ\",\"QQQ\",\"QQQQ\",\"QQQQQ\",\n\"M\",\"Mo\",\"MM\",\"MMM\",\"MMMM\",\"MMMMM\",\n\"E\",\"EE\",\"EEE\",\"EEEE\",\"EEEEE\",\"EEEEEE\",\n\"a\",\"aa\",\"aaa\",\"aaaa\",\"aaaaa\",\n\"d\",\"do\",\"dd\",\n\"D\",\"Do\",\"DD\",\"DDD\",\n\"w\",\"wo\",\"ww\",\n\"s\",\"so\",\"ss\",\n\"m\",\"mo\",\"mm\",\n\"h\",\"ho\",\"hh\",\n\"H\",\"Ho\",\"HH\",\n\"z\",\"zz\",\"zzz\",\"zzzz\",\n\"T\",\n] as const\n\ntype Format = (typeof FORMATS)[number]\n\ninterface FormatDateOptions {\n locale: string\n format: Format\n timeZone?: string\n}\n\nfunction ordinal(num: string | number) {\n const n = typeof num === \"string\" ? parseFloat(num) : num\n let suffix = \"th\"\n if (n % 10 === 1 && n % 100 !== 11) {\n suffix = \"st\"\n } else if (n % 10 === 2 && n % 100 !== 12) {\n suffix = \"nd\"\n } else if (n % 10 === 3 && n % 100 !== 13) {\n suffix = \"rd\"\n }\n return `${n}${suffix}`\n}\n\nfunction pad(num: number, length: number) {\n return String(num).padStart(length, \"0\")\n}\n\nfunction zone(str: string) {\n return str.split(/AM|PM/)[1].trim()\n}\n\nfunction getFormat(date: Date, options: FormatDateOptions) {\n const { locale, format, timeZone } = options\n\n switch (format) {\n // era\n case \"G\":\n case \"GG\":\n case \"GGG\":\n return date.toLocaleString(locale, { era: \"short\" })\n case \"GGGG\":\n return date.toLocaleString(locale, { era: \"long\" })\n case \"GGGGG\":\n return date.toLocaleString(locale, { era: \"narrow\" })\n\n // year\n case \"y\":\n case \"Y\":\n return date.getFullYear()\n case \"yo\":\n case \"Yo\":\n return ordinal(date.toLocaleString(locale, { year: \"numeric\" }))\n case \"yy\":\n case \"YY\":\n return date.toLocaleString(locale, { year: \"2-digit\" })\n case \"yyy\":\n case \"YYY\":\n return date.toLocaleString(locale, { year: \"numeric\" }).padStart(3, \"0\")\n case \"yyyy\":\n case \"YYYY\":\n return date.toLocaleString(locale, { year: \"numeric\" }).padStart(4, \"0\")\n\n // quarter\n case \"Q\":\n case \"QQQQQ\":\n return Math.ceil((date.getMonth() + 1) / 3)\n case \"Qo\":\n return ordinal(Math.ceil((date.getMonth() + 1) / 3))\n case \"QQ\":\n return pad(Math.ceil((date.getMonth() + 1) / 3), 2)\n case \"QQQ\":\n return `Q${Math.ceil((date.getMonth() + 1) / 3)}`\n case \"QQQQ\": {\n const base = ordinal(String(Math.ceil((date.getMonth() + 1) / 3)))\n return `${base} quarter`\n }\n\n // month\n case \"M\":\n return date.getMonth() + 1\n case \"Mo\":\n return ordinal(date.getMonth() + 1)\n case \"MM\":\n return date.toLocaleString(locale, { month: \"2-digit\" })\n case \"MMM\":\n return date.toLocaleString(locale, { month: \"short\" })\n case \"MMMM\":\n return date.toLocaleString(locale, { month: \"long\" })\n case \"MMMMM\":\n return date.toLocaleString(locale, { month: \"narrow\" })\n\n // week\n case \"w\":\n return Math.ceil(date.getDate() / 7)\n case \"wo\":\n return ordinal(Math.ceil(date.getDate() / 7))\n case \"ww\":\n return pad(Math.ceil(date.getDate() / 7), 2)\n\n // day\n case \"d\":\n case \"D\":\n return date.getDate()\n case \"do\":\n case \"Do\":\n return ordinal(date.getDate())\n case \"dd\":\n case \"DD\":\n return date.toLocaleString(locale, { day: \"2-digit\" })\n case \"DDD\":\n return pad(date.getDate(), 3)\n\n // weekday\n case \"E\":\n case \"EE\":\n case \"EEE\":\n return date.toLocaleString(locale, { weekday: \"short\" })\n case \"EEEE\":\n return date.toLocaleString(locale, { weekday: \"long\" })\n case \"EEEEE\":\n return date.toLocaleString(locale, { weekday: \"narrow\" })\n case \"EEEEEE\":\n return date.toLocaleString(locale, { weekday: \"short\" }).slice(0, 2)\n\n // hour\n case \"h\":\n return date.toLocaleString(locale, { hour: \"numeric\", hour12: true })\n case \"ho\":\n return ordinal(date.toLocaleString(locale, { hour: \"2-digit\", hour12: true }))\n case \"hh\":\n return date.toLocaleString(locale, { hour: \"2-digit\", hour12: true })\n case \"H\":\n return date.toLocaleString(locale, { hour: \"numeric\", hour12: false })\n case \"Ho\":\n return ordinal(+date.toLocaleString(locale, { hour: \"numeric\", hour12: false }))\n case \"HH\":\n return date.toLocaleString(locale, { hour: \"2-digit\", hour12: false })\n\n // minute\n case \"m\":\n return date.toLocaleString(locale, { minute: \"numeric\" })\n case \"mo\":\n return ordinal(date.toLocaleString(locale, { minute: \"numeric\" }))\n case \"mm\":\n return date.toLocaleString(locale, { minute: \"2-digit\" })\n\n // second\n case \"s\":\n return date.toLocaleString(locale, { second: \"numeric\" })\n case \"so\":\n return ordinal(date.toLocaleString(locale, { second: \"numeric\" }))\n case \"ss\":\n return date.toLocaleString(locale, { second: \"2-digit\" })\n\n // timestamp\n case \"T\":\n return date.getTime()\n\n // day period\n case \"a\":\n case \"aa\":\n case \"aaa\":\n return date.toLocaleString(locale, { hour: \"numeric\", hour12: true }).toLocaleUpperCase()\n case \"aaaa\":\n return date.toLocaleString(locale, { hour: \"numeric\", hour12: true }).toLocaleLowerCase()\n case \"aaaaa\":\n return date.toLocaleString(locale, { hour: \"numeric\", hour12: true }).charAt(0)\n\n // TODO:Revise this\n case \"z\":\n case \"zz\":\n case \"zzz\": {\n return zone(date.toLocaleString(locale, { timeZone, timeZoneName: \"shortOffset\" }))\n }\n case \"zzzz\":\n return zone(date.toLocaleString(locale, { timeZone, timeZoneName: \"longOffset\" }))\n\n default:\n throw new Error(`Unknown format: ${format}`)\n }\n}\n\n/**\n * Formats a date using the given format string as defined in:\n * https://www.unicode.org/reports/tr35/tr35-dates.html#Date_Field_Symbol_Table\n */\nexport function formatDate(date: Date, format: string, locale: string, timeZone?: string) {\n let result = format\n for (const key of FORMATS) {\n const res = getFormat(date, { locale, format: key, timeZone })\n result = result.replace(createRegEx(key), \"$1\" + res + \"$3\")\n }\n return result\n}\n","import { i18nCache } from \"./cache\"\n\nconst getListFormatter = i18nCache(Intl.ListFormat)\n\nexport function formatList(list: string[], locale: string, options: Intl.ListFormatOptions = {}) {\n const formatter = getListFormatter(locale, options)\n return formatter.format(list)\n}\n","import { i18nCache } from \"./cache\"\n\nconst getRelativeTimeFormatter = i18nCache(Intl.RelativeTimeFormat)\n\nexport function formatRelativeTime(value: Date, locale: string, options: Intl.RelativeTimeFormatOptions = {}) {\n const rtf = getRelativeTimeFormatter(locale, options)\n\n const now = new Date()\n const diff = getDistance(now, value)\n\n if (diff.years > 0) return rtf.format(diff.years * diff.sign, \"year\")\n if (diff.months > 0) return rtf.format(diff.months * diff.sign, \"month\")\n if (diff.weeks > 0) return rtf.format(diff.weeks * diff.sign, \"week\")\n if (diff.days > 0) return rtf.format(diff.days * diff.sign, \"day\")\n if (diff.hours > 0) return rtf.format(diff.hours * diff.sign, \"hour\")\n if (diff.minutes > 0) return rtf.format(diff.minutes * diff.sign, \"minute\")\n\n return rtf.format(diff.seconds * diff.sign, \"second\")\n}\n\nconst SECOND_TO_MS = 1000\nconst MINUTE_TO_MS = 1000 * 60\nconst HOUR_TO_MS = 1000 * 60 * 60\nconst DAY_TO_MS = 1000 * 60 * 60 * 24\nconst WEEK_TO_MS = 1000 * 60 * 60 * 24 * 7\nconst MONTH_TO_MS = 1000 * 60 * 60 * 24 * 30\nconst YEAR_TO_MS = 1000 * 60 * 60 * 24 * 365\n\nfunction getDistance(startDate: Date, endDate: Date) {\n const endTime = endDate.getTime()\n const startTime = startDate.getTime()\n const distance = Math.abs(endTime - startTime)\n\n return {\n sign: Math.sign(endTime - startTime),\n days: Math.floor(distance / DAY_TO_MS),\n hours: Math.floor((distance % DAY_TO_MS) / HOUR_TO_MS),\n minutes: Math.floor((distance % HOUR_TO_MS) / MINUTE_TO_MS),\n seconds: Math.floor((distance % MINUTE_TO_MS) / SECOND_TO_MS),\n weeks: Math.floor(distance / WEEK_TO_MS),\n months: Math.floor(distance / MONTH_TO_MS),\n years: Math.floor(distance / YEAR_TO_MS),\n }\n}\n","const RTL_SCRIPTS = new Set([\n \"Avst\",\n \"Arab\",\n \"Armi\",\n \"Syrc\",\n \"Samr\",\n \"Mand\",\n \"Thaa\",\n \"Mend\",\n \"Nkoo\",\n \"Adlm\",\n \"Rohg\",\n \"Hebr\",\n])\n\nconst RTL_LANGS = new Set([\n \"ae\",\n \"ar\",\n \"arc\",\n \"bcc\",\n \"bqi\",\n \"ckb\",\n \"dv\",\n \"fa\",\n \"glk\",\n \"he\",\n \"ku\",\n \"mzn\",\n \"nqo\",\n \"pnb\",\n \"ps\",\n \"sd\",\n \"ug\",\n \"ur\",\n \"yi\",\n])\n\nexport function isRTL(locale: string) {\n if (Intl.Locale) {\n const script = new Intl.Locale(locale).maximize().script ?? \"\"\n return RTL_SCRIPTS.has(script)\n }\n\n const lang = locale.split(\"-\")[0]\n return RTL_LANGS.has(lang)\n}\n\nexport function getLocaleDir(locale: string) {\n return isRTL(locale) ? \"rtl\" : \"ltr\"\n}\n","import { isRTL } from \"./is-rtl\"\n\nexport type Direction = \"rtl\" | \"ltr\"\n\nexport interface Locale {\n locale: string\n dir: Direction\n}\n\ndeclare global {\n interface Navigator {\n userLanguage?: string\n }\n}\n\nexport function getDefaultLocale(): Locale {\n let locale = (typeof navigator !== \"undefined\" && (navigator.language || navigator.userLanguage)) || \"en-US\"\n\n try {\n Intl.DateTimeFormat.supportedLocalesOf([locale])\n } catch (_err) {\n locale = \"en-US\"\n }\n\n return {\n locale,\n dir: isRTL(locale) ? \"rtl\" : \"ltr\",\n }\n}\n","import { getWindow } from \"@zag-js/dom-query\"\nimport { getDefaultLocale, type Locale } from \"./locale\"\n\nexport interface LocaleOptions {\n locale?: string\n getRootNode?: () => ShadowRoot | Document | Node\n onLocaleChange?: (locale: Locale) => void\n}\n\nexport function trackLocale(options: LocaleOptions = {}) {\n const { getRootNode, onLocaleChange } = options\n\n onLocaleChange?.(getDefaultLocale())\n\n const handleLocaleChange = () => {\n onLocaleChange?.(getDefaultLocale())\n }\n\n const win = getRootNode ? getWindow(getRootNode()) : window\n\n win.addEventListener(\"languagechange\", handleLocaleChange)\n\n return () => {\n win.removeEventListener(\"languagechange\", handleLocaleChange)\n }\n}\n"],"mappings":"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","names":[]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@zag-js/i18n-utils",
3
- "version": "0.39.0",
3
+ "version": "0.41.0",
4
4
  "description": "Interationalization utilities for Zag.js",
5
5
  "keywords": [
6
6
  "js",
@@ -24,7 +24,7 @@
24
24
  },
25
25
  "clean-package": "../../../clean-package.config.json",
26
26
  "dependencies": {
27
- "@zag-js/dom-query": "0.39.0"
27
+ "@zag-js/dom-query": "0.41.0"
28
28
  },
29
29
  "devDependencies": {
30
30
  "clean-package": "2.2.0"