sanity
Version:
Sanity is a real-time content infrastructure with a scalable, hosted backend featuring a Graph Oriented Query Language (GROQ), asset pipelines and fast edge caches
89 lines (75 loc) • 2.48 kB
text/typescript
type AnyIntlOptions = Intl.DateTimeFormat | Intl.ListFormatOptions | Intl.NumberFormatOptions
/**
* Cache of Intl.* instances. These can be costly to instantiate, but often needed,
* thus this serves as an in-memory cache, and takes into account the options passed.
*
* @internal
* @hidden
*/
export const intlCache = (() => {
const caches = {
dateTimeFormat: createCache<Intl.DateTimeFormat>(),
listFormat: createCache<Intl.ListFormat>(),
numberFormat: createCache<Intl.NumberFormat>(),
relativeTimeFormat: createCache<Intl.RelativeTimeFormat>(),
}
function dateTimeFormat(locale: string, options: Intl.DateTimeFormatOptions) {
const key = getCacheId(locale, options)
let instance = caches.dateTimeFormat[key]
if (instance) {
return instance
}
instance = new Intl.DateTimeFormat(locale, options)
caches.dateTimeFormat[key] = instance
return instance
}
function listFormat(locale: string, options: Intl.ListFormatOptions) {
const key = getCacheId(locale, options)
let instance = caches.listFormat[key]
if (instance) {
return instance
}
instance = new Intl.ListFormat(locale, options)
caches.listFormat[key] = instance
return instance
}
function numberFormat(locale: string, options: Intl.NumberFormatOptions) {
const key = getCacheId(locale, options)
let instance = caches.numberFormat[key]
if (instance) {
return instance
}
instance = new Intl.NumberFormat(locale, options)
caches.numberFormat[key] = instance
return instance
}
function relativeTimeFormat(locale: string, options: Intl.RelativeTimeFormatOptions) {
const key = getCacheId(locale, options)
let instance = caches.relativeTimeFormat[key]
if (instance) {
return instance
}
instance = new Intl.RelativeTimeFormat(locale, options)
caches.relativeTimeFormat[key] = instance
return instance
}
return {
dateTimeFormat,
listFormat,
numberFormat,
relativeTimeFormat,
}
})()
function createCache<T>(): Record<string, T | undefined> {
return Object.create(null)
}
function getCacheId(locale: string, options: AnyIntlOptions) {
return `${locale}-${JSON.stringify(orderedProps(options))}`
}
function orderedProps(obj: AnyIntlOptions) {
const segments: string[] = []
for (const [key, value] of Object.entries(obj)) {
segments.push(`${key}=${JSON.stringify(value)}`)
}
return segments.sort().join('\n')
}