1// package children are represented with a Map object, but many file systems
2// are case-insensitive and unicode-normalizing, so we need to treat
3// node.children.get('FOO') and node.children.get('foo') as the same thing.
4
5module.exports = class CIMap extends Map {
6  #keys = new Map()
7
8  constructor (items = []) {
9    super()
10    for (const [key, val] of items) {
11      this.set(key, val)
12    }
13  }
14
15  #normKey (key) {
16    if (typeof key !== 'string') {
17      return key
18    }
19    return key.normalize('NFKD').toLowerCase()
20  }
21
22  get (key) {
23    const normKey = this.#normKey(key)
24    return this.#keys.has(normKey) ? super.get(this.#keys.get(normKey))
25      : undefined
26  }
27
28  set (key, val) {
29    const normKey = this.#normKey(key)
30    if (this.#keys.has(normKey)) {
31      super.delete(this.#keys.get(normKey))
32    }
33    this.#keys.set(normKey, key)
34    return super.set(key, val)
35  }
36
37  delete (key) {
38    const normKey = this.#normKey(key)
39    if (this.#keys.has(normKey)) {
40      const prevKey = this.#keys.get(normKey)
41      this.#keys.delete(normKey)
42      return super.delete(prevKey)
43    }
44  }
45
46  has (key) {
47    const normKey = this.#normKey(key)
48    return this.#keys.has(normKey) && super.has(this.#keys.get(normKey))
49  }
50}
51