1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
| const hasIntl = typeof Intl === 'object' && !!Intl
| const Collator = hasIntl && Intl.Collator
| const cache = new Map()
|
| const collatorCompare = (locale, opts) => {
| const collator = new Collator(locale, opts)
| return (a, b) => collator.compare(a, b)
| }
|
| const localeCompare = (locale, opts) => (a, b) => a.localeCompare(b, locale, opts)
|
| const knownOptions = [
| 'sensitivity',
| 'numeric',
| 'ignorePunctuation',
| 'caseFirst',
| ]
|
| const { hasOwnProperty } = Object.prototype
|
| module.exports = (locale, options = {}) => {
| if (!locale || typeof locale !== 'string')
| throw new TypeError('locale required')
|
| const opts = knownOptions.reduce((opts, k) => {
| if (hasOwnProperty.call(options, k)) {
| opts[k] = options[k]
| }
| return opts
| }, {})
| const key = `${locale}\n${JSON.stringify(opts)}`
|
| if (cache.has(key))
| return cache.get(key)
|
| const compare = hasIntl
| ? collatorCompare(locale, opts)
| : localeCompare(locale, opts)
| cache.set(key, compare)
|
| return compare
| }
|
|