@zag-js/i18n-utils 0.38.1 → 0.40.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 +8 -2
- package/dist/index.d.ts +8 -2
- package/dist/index.js +64 -5
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +63 -5
- package/dist/index.mjs.map +1 -1
- package/package.json +2 -2
package/dist/index.d.mts
CHANGED
|
@@ -15,7 +15,13 @@ declare function getLocaleDir(locale: string): "rtl" | "ltr";
|
|
|
15
15
|
|
|
16
16
|
declare function formatNumber(v: number, locale: string, options?: Intl.NumberFormatOptions): string;
|
|
17
17
|
|
|
18
|
-
declare function formatRelativeTime(value:
|
|
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;
|
|
19
25
|
|
|
20
26
|
interface LocaleOptions {
|
|
21
27
|
locale?: string;
|
|
@@ -24,4 +30,4 @@ interface LocaleOptions {
|
|
|
24
30
|
}
|
|
25
31
|
declare function trackLocale(options?: LocaleOptions): () => void;
|
|
26
32
|
|
|
27
|
-
export { type Locale, type LocaleOptions, formatNumber, formatRelativeTime, getDefaultLocale, getLocaleDir, isRTL, trackLocale };
|
|
33
|
+
export { type FormatBytesOptions, type Locale, type LocaleOptions, formatBytes, formatNumber, formatRelativeTime, getDefaultLocale, getLocaleDir, isRTL, trackLocale };
|
package/dist/index.d.ts
CHANGED
|
@@ -15,7 +15,13 @@ declare function getLocaleDir(locale: string): "rtl" | "ltr";
|
|
|
15
15
|
|
|
16
16
|
declare function formatNumber(v: number, locale: string, options?: Intl.NumberFormatOptions): string;
|
|
17
17
|
|
|
18
|
-
declare function formatRelativeTime(value:
|
|
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;
|
|
19
25
|
|
|
20
26
|
interface LocaleOptions {
|
|
21
27
|
locale?: string;
|
|
@@ -24,4 +30,4 @@ interface LocaleOptions {
|
|
|
24
30
|
}
|
|
25
31
|
declare function trackLocale(options?: LocaleOptions): () => void;
|
|
26
32
|
|
|
27
|
-
export { type Locale, type LocaleOptions, formatNumber, formatRelativeTime, getDefaultLocale, getLocaleDir, isRTL, trackLocale };
|
|
33
|
+
export { type FormatBytesOptions, type Locale, type LocaleOptions, formatBytes, formatNumber, formatRelativeTime, getDefaultLocale, getLocaleDir, isRTL, trackLocale };
|
package/dist/index.js
CHANGED
|
@@ -20,6 +20,7 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
|
|
|
20
20
|
// src/index.ts
|
|
21
21
|
var src_exports = {};
|
|
22
22
|
__export(src_exports, {
|
|
23
|
+
formatBytes: () => formatBytes,
|
|
23
24
|
formatNumber: () => formatNumber,
|
|
24
25
|
formatRelativeTime: () => formatRelativeTime,
|
|
25
26
|
getDefaultLocale: () => getDefaultLocale,
|
|
@@ -77,7 +78,7 @@ function getLocaleDir(locale) {
|
|
|
77
78
|
return isRTL(locale) ? "rtl" : "ltr";
|
|
78
79
|
}
|
|
79
80
|
|
|
80
|
-
// src/
|
|
81
|
+
// src/locale.ts
|
|
81
82
|
function getDefaultLocale() {
|
|
82
83
|
let locale = typeof navigator !== "undefined" && (navigator.language || navigator.userLanguage) || "en-US";
|
|
83
84
|
try {
|
|
@@ -91,7 +92,7 @@ function getDefaultLocale() {
|
|
|
91
92
|
};
|
|
92
93
|
}
|
|
93
94
|
|
|
94
|
-
// src/
|
|
95
|
+
// src/cache.ts
|
|
95
96
|
function i18nCache(Ins) {
|
|
96
97
|
const formatterCache = /* @__PURE__ */ new Map();
|
|
97
98
|
return function create(locale, options) {
|
|
@@ -114,10 +115,67 @@ function formatNumber(v, locale, options = {}) {
|
|
|
114
115
|
|
|
115
116
|
// src/relative-time-format.ts
|
|
116
117
|
var getRelativeTimeFormatter = i18nCache(Intl.RelativeTimeFormat);
|
|
117
|
-
function formatRelativeTime(value,
|
|
118
|
-
const
|
|
119
|
-
|
|
118
|
+
function formatRelativeTime(value, locale, options = {}) {
|
|
119
|
+
const rtf = getRelativeTimeFormatter(locale, options);
|
|
120
|
+
const now = /* @__PURE__ */ new Date();
|
|
121
|
+
const diff = getDistance(now, value);
|
|
122
|
+
if (diff.years > 0)
|
|
123
|
+
return rtf.format(diff.years * diff.sign, "year");
|
|
124
|
+
if (diff.months > 0)
|
|
125
|
+
return rtf.format(diff.months * diff.sign, "month");
|
|
126
|
+
if (diff.weeks > 0)
|
|
127
|
+
return rtf.format(diff.weeks * diff.sign, "week");
|
|
128
|
+
if (diff.days > 0)
|
|
129
|
+
return rtf.format(diff.days * diff.sign, "day");
|
|
130
|
+
if (diff.hours > 0)
|
|
131
|
+
return rtf.format(diff.hours * diff.sign, "hour");
|
|
132
|
+
if (diff.minutes > 0)
|
|
133
|
+
return rtf.format(diff.minutes * diff.sign, "minute");
|
|
134
|
+
return rtf.format(diff.seconds * diff.sign, "second");
|
|
120
135
|
}
|
|
136
|
+
var SECOND_TO_MS = 1e3;
|
|
137
|
+
var MINUTE_TO_MS = 1e3 * 60;
|
|
138
|
+
var HOUR_TO_MS = 1e3 * 60 * 60;
|
|
139
|
+
var DAY_TO_MS = 1e3 * 60 * 60 * 24;
|
|
140
|
+
var WEEK_TO_MS = 1e3 * 60 * 60 * 24 * 7;
|
|
141
|
+
var MONTH_TO_MS = 1e3 * 60 * 60 * 24 * 30;
|
|
142
|
+
var YEAR_TO_MS = 1e3 * 60 * 60 * 24 * 365;
|
|
143
|
+
function getDistance(startDate, endDate) {
|
|
144
|
+
const endTime = endDate.getTime();
|
|
145
|
+
const startTime = startDate.getTime();
|
|
146
|
+
const distance = Math.abs(endTime - startTime);
|
|
147
|
+
return {
|
|
148
|
+
sign: Math.sign(endTime - startTime),
|
|
149
|
+
days: Math.floor(distance / DAY_TO_MS),
|
|
150
|
+
hours: Math.floor(distance % DAY_TO_MS / HOUR_TO_MS),
|
|
151
|
+
minutes: Math.floor(distance % HOUR_TO_MS / MINUTE_TO_MS),
|
|
152
|
+
seconds: Math.floor(distance % MINUTE_TO_MS / SECOND_TO_MS),
|
|
153
|
+
weeks: Math.floor(distance / WEEK_TO_MS),
|
|
154
|
+
months: Math.floor(distance / MONTH_TO_MS),
|
|
155
|
+
years: Math.floor(distance / YEAR_TO_MS)
|
|
156
|
+
};
|
|
157
|
+
}
|
|
158
|
+
|
|
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
|
+
};
|
|
121
179
|
|
|
122
180
|
// src/track-locale.ts
|
|
123
181
|
var import_dom_query = require("@zag-js/dom-query");
|
|
@@ -135,6 +193,7 @@ function trackLocale(options = {}) {
|
|
|
135
193
|
}
|
|
136
194
|
// Annotate the CommonJS export names for ESM import in node:
|
|
137
195
|
0 && (module.exports = {
|
|
196
|
+
formatBytes,
|
|
138
197
|
formatNumber,
|
|
139
198
|
formatRelativeTime,
|
|
140
199
|
getDefaultLocale,
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/is-rtl.ts","../src/get-default-locale.ts","../src/i18n-cache.ts","../src/number-format.ts","../src/relative-time-format.ts","../src/track-locale.ts"],"sourcesContent":["export { getDefaultLocale } from \"./get-default-locale\"\nexport type { Locale } from \"./get-default-locale\"\nexport { getLocaleDir, isRTL } from \"./is-rtl\"\nexport * from \"./number-format\"\nexport * from \"./relative-time-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 \"./i18n-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 \"./i18n-cache\"\n\nconst getRelativeTimeFormatter = i18nCache(Intl.RelativeTimeFormat)\n\nexport function formatRelativeTime(\n value: number,\n unit: Intl.RelativeTimeFormatUnit,\n locale: string,\n options: Intl.RelativeTimeFormatOptions = {},\n) {\n const formatter = getRelativeTimeFormatter(locale, options)\n return formatter.format(value, unit)\n}\n","import { getWindow } from \"@zag-js/dom-query\"\nimport { getDefaultLocale, type Locale } from \"./get-default-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":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACAA,IAAM,cAAc,oBAAI,IAAI;AAAA,EAC1B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAED,IAAM,YAAY,oBAAI,IAAI;AAAA,EACxB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAEM,SAAS,MAAM,QAAgB;AACpC,MAAI,KAAK,QAAQ;AACf,UAAM,SAAS,IAAI,KAAK,OAAO,MAAM,EAAE,SAAS,EAAE,UAAU;AAC5D,WAAO,YAAY,IAAI,MAAM;AAAA,EAC/B;AAEA,QAAM,OAAO,OAAO,MAAM,GAAG,EAAE,CAAC;AAChC,SAAO,UAAU,IAAI,IAAI;AAC3B;AAEO,SAAS,aAAa,QAAgB;AAC3C,SAAO,MAAM,MAAM,IAAI,QAAQ;AACjC;;;AClCO,SAAS,mBAA2B;AACzC,MAAI,SAAU,OAAO,cAAc,gBAAgB,UAAU,YAAY,UAAU,iBAAkB;AAErG,MAAI;AACF,SAAK,eAAe,mBAAmB,CAAC,MAAM,CAAC;AAAA,EACjD,SAAS,MAAM;AACb,aAAS;AAAA,EACX;AAEA,SAAO;AAAA,IACL;AAAA,IACA,KAAK,MAAM,MAAM,IAAI,QAAQ;AAAA,EAC/B;AACF;;;ACpBO,SAAS,UAAwD,KAAQ;AAC9E,QAAM,iBAAiB,oBAAI,IAAe;AAE1C,SAAO,SAAS,OAAO,QAAgB,SAA2D;AAChG,UAAM,WACJ,UACC,UACG,OAAO,QAAQ,OAAO,EACnB,KAAK,CAAC,GAAG,MAAO,EAAE,CAAC,IAAI,EAAE,CAAC,IAAI,KAAK,CAAE,EACrC,KAAK,IACR;AAEN,QAAI,eAAe,IAAI,QAAQ,GAAG;AAChC,aAAO,eAAe,IAAI,QAAQ;AAAA,IACpC;AAGA,QAAI,YAAY,IAAI,IAAI,QAAQ,OAAO;AACvC,mBAAe,IAAI,UAAU,SAAS;AAEtC,WAAO;AAAA,EACT;AACF;;;AC5BA,IAAM,qBAAqB,UAAU,KAAK,YAAY;AAE/C,SAAS,aAAa,GAAW,QAAgB,UAAoC,CAAC,GAAG;AAC9F,QAAM,YAAY,mBAAmB,QAAQ,OAAO;AACpD,SAAO,UAAU,OAAO,CAAC;AAC3B;;;ACLA,IAAM,2BAA2B,UAAU,KAAK,kBAAkB;AAE3D,SAAS,mBACd,OACA,MACA,QACA,UAA0C,CAAC,GAC3C;AACA,QAAM,YAAY,yBAAyB,QAAQ,OAAO;AAC1D,SAAO,UAAU,OAAO,OAAO,IAAI;AACrC;;;ACZA,uBAA0B;AASnB,SAAS,YAAY,UAAyB,CAAC,GAAG;AACvD,QAAM,EAAE,aAAa,eAAe,IAAI;AAExC,mBAAiB,iBAAiB,CAAC;AAEnC,QAAM,qBAAqB,MAAM;AAC/B,qBAAiB,iBAAiB,CAAC;AAAA,EACrC;AAEA,QAAM,MAAM,kBAAc,4BAAU,YAAY,CAAC,IAAI;AAErD,MAAI,iBAAiB,kBAAkB,kBAAkB;AAEzD,SAAO,MAAM;AACX,QAAI,oBAAoB,kBAAkB,kBAAkB;AAAA,EAC9D;AACF;","names":[]}
|
|
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":[]}
|
package/dist/index.mjs
CHANGED
|
@@ -46,7 +46,7 @@ function getLocaleDir(locale) {
|
|
|
46
46
|
return isRTL(locale) ? "rtl" : "ltr";
|
|
47
47
|
}
|
|
48
48
|
|
|
49
|
-
// src/
|
|
49
|
+
// src/locale.ts
|
|
50
50
|
function getDefaultLocale() {
|
|
51
51
|
let locale = typeof navigator !== "undefined" && (navigator.language || navigator.userLanguage) || "en-US";
|
|
52
52
|
try {
|
|
@@ -60,7 +60,7 @@ function getDefaultLocale() {
|
|
|
60
60
|
};
|
|
61
61
|
}
|
|
62
62
|
|
|
63
|
-
// src/
|
|
63
|
+
// src/cache.ts
|
|
64
64
|
function i18nCache(Ins) {
|
|
65
65
|
const formatterCache = /* @__PURE__ */ new Map();
|
|
66
66
|
return function create(locale, options) {
|
|
@@ -83,10 +83,67 @@ function formatNumber(v, locale, options = {}) {
|
|
|
83
83
|
|
|
84
84
|
// src/relative-time-format.ts
|
|
85
85
|
var getRelativeTimeFormatter = i18nCache(Intl.RelativeTimeFormat);
|
|
86
|
-
function formatRelativeTime(value,
|
|
87
|
-
const
|
|
88
|
-
|
|
86
|
+
function formatRelativeTime(value, locale, options = {}) {
|
|
87
|
+
const rtf = getRelativeTimeFormatter(locale, options);
|
|
88
|
+
const now = /* @__PURE__ */ new Date();
|
|
89
|
+
const diff = getDistance(now, value);
|
|
90
|
+
if (diff.years > 0)
|
|
91
|
+
return rtf.format(diff.years * diff.sign, "year");
|
|
92
|
+
if (diff.months > 0)
|
|
93
|
+
return rtf.format(diff.months * diff.sign, "month");
|
|
94
|
+
if (diff.weeks > 0)
|
|
95
|
+
return rtf.format(diff.weeks * diff.sign, "week");
|
|
96
|
+
if (diff.days > 0)
|
|
97
|
+
return rtf.format(diff.days * diff.sign, "day");
|
|
98
|
+
if (diff.hours > 0)
|
|
99
|
+
return rtf.format(diff.hours * diff.sign, "hour");
|
|
100
|
+
if (diff.minutes > 0)
|
|
101
|
+
return rtf.format(diff.minutes * diff.sign, "minute");
|
|
102
|
+
return rtf.format(diff.seconds * diff.sign, "second");
|
|
89
103
|
}
|
|
104
|
+
var SECOND_TO_MS = 1e3;
|
|
105
|
+
var MINUTE_TO_MS = 1e3 * 60;
|
|
106
|
+
var HOUR_TO_MS = 1e3 * 60 * 60;
|
|
107
|
+
var DAY_TO_MS = 1e3 * 60 * 60 * 24;
|
|
108
|
+
var WEEK_TO_MS = 1e3 * 60 * 60 * 24 * 7;
|
|
109
|
+
var MONTH_TO_MS = 1e3 * 60 * 60 * 24 * 30;
|
|
110
|
+
var YEAR_TO_MS = 1e3 * 60 * 60 * 24 * 365;
|
|
111
|
+
function getDistance(startDate, endDate) {
|
|
112
|
+
const endTime = endDate.getTime();
|
|
113
|
+
const startTime = startDate.getTime();
|
|
114
|
+
const distance = Math.abs(endTime - startTime);
|
|
115
|
+
return {
|
|
116
|
+
sign: Math.sign(endTime - startTime),
|
|
117
|
+
days: Math.floor(distance / DAY_TO_MS),
|
|
118
|
+
hours: Math.floor(distance % DAY_TO_MS / HOUR_TO_MS),
|
|
119
|
+
minutes: Math.floor(distance % HOUR_TO_MS / MINUTE_TO_MS),
|
|
120
|
+
seconds: Math.floor(distance % MINUTE_TO_MS / SECOND_TO_MS),
|
|
121
|
+
weeks: Math.floor(distance / WEEK_TO_MS),
|
|
122
|
+
months: Math.floor(distance / MONTH_TO_MS),
|
|
123
|
+
years: Math.floor(distance / YEAR_TO_MS)
|
|
124
|
+
};
|
|
125
|
+
}
|
|
126
|
+
|
|
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
|
+
};
|
|
90
147
|
|
|
91
148
|
// src/track-locale.ts
|
|
92
149
|
import { getWindow } from "@zag-js/dom-query";
|
|
@@ -103,6 +160,7 @@ function trackLocale(options = {}) {
|
|
|
103
160
|
};
|
|
104
161
|
}
|
|
105
162
|
export {
|
|
163
|
+
formatBytes,
|
|
106
164
|
formatNumber,
|
|
107
165
|
formatRelativeTime,
|
|
108
166
|
getDefaultLocale,
|
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/is-rtl.ts","../src/
|
|
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":[]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@zag-js/i18n-utils",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.40.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.
|
|
27
|
+
"@zag-js/dom-query": "0.40.0"
|
|
28
28
|
},
|
|
29
29
|
"devDependencies": {
|
|
30
30
|
"clean-package": "2.2.0"
|