├── .github └── workflows │ └── node.js.yml ├── .gitignore ├── .npmignore ├── .npmrc ├── LICENSE ├── README.md ├── cjs ├── index.js └── package.json ├── esm └── index.js ├── package-lock.json ├── package.json ├── test └── index.js └── types └── index.d.ts /.github/workflows/node.js.yml: -------------------------------------------------------------------------------- 1 | # This workflow will do a clean install of node dependencies, cache/restore them, build the source code and run tests across different versions of node 2 | # For more information see: https://help.github.com/actions/language-and-framework-guides/using-nodejs-with-github-actions 3 | 4 | name: build 5 | 6 | on: [push, pull_request] 7 | 8 | jobs: 9 | build: 10 | 11 | runs-on: ubuntu-latest 12 | 13 | strategy: 14 | matrix: 15 | node-version: [16] 16 | 17 | steps: 18 | - uses: actions/checkout@v2 19 | - name: Use Node.js ${{ matrix.node-version }} 20 | uses: actions/setup-node@v2 21 | with: 22 | node-version: ${{ matrix.node-version }} 23 | cache: 'npm' 24 | - run: npm ci 25 | - run: npm run build --if-present 26 | - run: npm test 27 | - run: npm run coverage --if-present 28 | - name: Coveralls 29 | uses: coverallsapp/github-action@master 30 | with: 31 | github-token: ${{ secrets.GITHUB_TOKEN }} 32 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | .nyc_output 3 | coverage/ 4 | node_modules/ 5 | -------------------------------------------------------------------------------- /.npmignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | .nyc_output 3 | .eslintrc.json 4 | .travis.yml 5 | .github 6 | coverage/ 7 | node_modules/ 8 | rollup/ 9 | test/ 10 | -------------------------------------------------------------------------------- /.npmrc: -------------------------------------------------------------------------------- 1 | package-lock=false 2 | package-lock=true 3 | package-lock=true 4 | package-lock=true 5 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | ISC License 2 | 3 | Copyright (c) 2023, Andrea Giammarchi, @WebReflection 4 | 5 | Permission to use, copy, modify, and/or distribute this software for any 6 | purpose with or without fee is hereby granted, provided that the above 7 | copyright notice and this permission notice appear in all copies. 8 | 9 | THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH 10 | REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY 11 | AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, 12 | INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM 13 | LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE 14 | OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR 15 | PERFORMANCE OF THIS SOFTWARE. 16 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Not So Weak 2 | 3 | [![build status](https://github.com/WebReflection/not-so-weak/actions/workflows/node.js.yml/badge.svg)](https://github.com/WebReflection/not-so-weak/actions) [![Coverage Status](https://coveralls.io/repos/github/WebReflection/not-so-weak/badge.svg?branch=main)](https://coveralls.io/github/WebReflection/not-so-weak?branch=main) 4 | 5 | **Social Media Photo by [Pete Nuij](https://unsplash.com/@pete_nuij) on [Unsplash](https://unsplash.com/)** 6 | 7 | Iterable [WeakMap](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/WeakMap) (*WKey*) and [WeakSet](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/WeakSet) (*WSet*) through [FinalizationRegistry](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/FinalizationRegistry) and [WeakRef](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/WeakRef) primitives, reimplementing also the [WeakValue](https://github.com/WebReflection/weak-value#readme) (*WValue*) module, including the optional *callback* for collected values. 8 | 9 | ```js 10 | // const {WSet, WKey, WValue} = require('not-so-weak'); 11 | import {WSet, WKey, WValue} from 'not-so-weak'; 12 | 13 | // class WSet extends WeakSet implements Set {} 14 | // class WKey extends WeakMap implements Map {} 15 | // class WValue extends Map {} 16 | 17 | // node --expose-gc example 18 | const ws = new WSet([{}]); 19 | const wm = new WKey([[{}, 'value']]); 20 | 21 | const wv = new WValue; 22 | wv.set('value', {}, function (key) { 23 | console.assert(this === wv); 24 | console.assert(key === 'value'); 25 | console.log(key, 'value collected'); 26 | }); 27 | 28 | console.assert(ws.size === 1); 29 | console.assert(wm.size === 1); 30 | console.assert([...wm.values()][0] === 'value'); 31 | console.assert([...wv.keys()][0] === 'value'); 32 | 33 | setTimeout(() => { 34 | gc(); 35 | console.assert(ws.size === 0); 36 | console.assert(wm.size === 0); 37 | console.assert(wv.size === 0); 38 | }); 39 | ``` 40 | 41 | ### Suitable For 42 | 43 | * Weak key/value based state/store 44 | * Server Side related tasks that can't bother with manual removal of weakly referenced entries 45 | * every case where you end up swapping to `Map` or `Set` because you realize you cannot iterate over their *Weak* counterpart 46 | * every case where you think there's a memory leak due possibly missing `weakThing.delete(ref)` operations 47 | 48 | ### Not Suitable For 49 | 50 | * raw performance or benchmarks against `Map` or `Set` 51 | * every case where `weakThing.delete(ref)` is already handled by the library or framework logic 52 | -------------------------------------------------------------------------------- /cjs/index.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | /*! (c) Andrea Giammarchi - ISC */ 3 | 4 | const { iterator } = Symbol; 5 | 6 | const refs = new WeakMap; 7 | 8 | const set = value => { 9 | const ref = new WeakRef(value); 10 | refs.set(value, ref); 11 | return ref; 12 | }; 13 | 14 | const get = value => refs.get(value) || set(value); 15 | 16 | class WSet extends Set { 17 | // 18 | #registry = new FinalizationRegistry(ref => super.delete(ref)); 19 | #drop(ref) { 20 | const had = super.delete(ref); 21 | if (had) 22 | this.#registry.unregister(ref); 23 | return had; 24 | } 25 | get size() { return [...this].length } 26 | delete(value) { 27 | return this.#drop(refs.get(value)); 28 | } 29 | has(value) { 30 | return super.has(refs.get(value)); 31 | } 32 | // 33 | constructor(entries = []) { 34 | super(); 35 | for (const value of entries) 36 | this.add(value); 37 | } 38 | clear() { 39 | for (const ref of super[iterator]()) 40 | this.#registry.unregister(ref); 41 | super.clear(); 42 | } 43 | add(value) { 44 | const ref = get(value); 45 | if (!super.has(ref)) { 46 | this.#registry.register(value, ref, ref); 47 | super.add(ref); 48 | } 49 | return this; 50 | } 51 | forEach(callback, thisArg) { 52 | for (const value of [...this]) 53 | callback.call(thisArg, value, value, this); 54 | } 55 | *[iterator]() { 56 | for (const ref of super[iterator]()) { 57 | const value = ref.deref(); 58 | if (value) 59 | yield value; 60 | else 61 | this.#drop(ref); 62 | } 63 | } 64 | *entries() { 65 | for (const value of this) 66 | yield [value, value]; 67 | } 68 | *keys() { yield *this[iterator]() } 69 | *values() { yield *this[iterator]() } 70 | } 71 | exports.WSet = WSet 72 | 73 | const noop = _ => {}; 74 | 75 | class WKey extends Map { 76 | // 77 | #registry = new FinalizationRegistry( 78 | ([ref, callback, value]) => (super.delete(ref), callback.call(this, value)) 79 | ); 80 | #drop(ref) { 81 | const had = super.delete(ref); 82 | if (had) 83 | this.#registry.unregister(ref); 84 | return had; 85 | } 86 | get size() { return [...this].length } 87 | delete(key) { 88 | return this.#drop(refs.get(key)); 89 | } 90 | has(key) { 91 | return super.has(refs.get(key)); 92 | } 93 | // 94 | constructor(entries = []) { 95 | super(); 96 | for (const [key, value] of entries) 97 | this.set(key, value); 98 | } 99 | clear() { 100 | for (const ref of super.keys()) 101 | this.#registry.unregister(ref); 102 | super.clear(); 103 | } 104 | forEach(callback, thisArg) { 105 | for (const [key, value] of [...this]) 106 | callback.call(thisArg, value, key, this); 107 | } 108 | get(key) { 109 | return super.get(refs.get(key)); 110 | } 111 | set(key, value, callback = noop) { 112 | const ref = get(key); 113 | if (!super.has(ref)) 114 | this.#registry.register(key, [ref, callback, value], ref); 115 | return super.set(ref, value); 116 | } 117 | *[iterator]() { 118 | for (const [ref, value] of super[iterator]()) { 119 | const key = ref.deref(); 120 | if (key) 121 | yield [key, value]; 122 | else 123 | this.#drop(ref); 124 | } 125 | } 126 | *entries() { 127 | yield *this[iterator](); 128 | } 129 | *keys() { 130 | for (const [key] of this) 131 | yield key; 132 | } 133 | *values() { 134 | for (const [_, value] of this) 135 | yield value; 136 | } 137 | } 138 | exports.WKey = WKey 139 | 140 | class WValue extends Map { 141 | #registry = new FinalizationRegistry( 142 | ([key, callback]) => (super.delete(key), callback.call(this, key)) 143 | ); 144 | get size() { return [...this].length } 145 | #drop(key, ref) { 146 | const had = super.delete(key); 147 | if (had) 148 | this.#registry.unregister(ref); 149 | return had; 150 | } 151 | constructor(entries = []) { 152 | super(); 153 | for (const [key, value] of entries) 154 | this.set(key, value); 155 | } 156 | clear() { 157 | for (const ref of super.values()) 158 | this.#registry.unregister(ref); 159 | super.clear(); 160 | } 161 | delete(key) { 162 | return this.#drop(key, super.get(key)); 163 | } 164 | forEach(callback, thisArg) { 165 | for (const [key, value] of [...this]) 166 | callback.call(thisArg, value, key, this); 167 | } 168 | get(key) { 169 | return super.get(key)?.deref(); 170 | } 171 | set(key, value, callback = noop) { 172 | let ref = super.get(key); 173 | if (ref) 174 | this.#registry.unregister(ref); 175 | ref = get(value); 176 | this.#registry.register(value, [key, callback], ref); 177 | return super.set(key, ref); 178 | } 179 | *[iterator]() { 180 | for (const [key, ref] of super[iterator]()) { 181 | const value = ref.deref(); 182 | if (value) 183 | yield [key, value]; 184 | else 185 | this.#drop(key, ref); 186 | } 187 | } 188 | *entries() { 189 | yield *this[iterator](); 190 | } 191 | *keys() { 192 | for (const [key] of this) 193 | yield key; 194 | } 195 | *values() { 196 | for (const [_, value] of this) 197 | yield value; 198 | } 199 | } 200 | exports.WValue = WValue 201 | -------------------------------------------------------------------------------- /cjs/package.json: -------------------------------------------------------------------------------- 1 | {"type":"commonjs"} -------------------------------------------------------------------------------- /esm/index.js: -------------------------------------------------------------------------------- 1 | /*! (c) Andrea Giammarchi - ISC */ 2 | 3 | const { iterator } = Symbol; 4 | 5 | const refs = new WeakMap; 6 | 7 | const set = value => { 8 | const ref = new WeakRef(value); 9 | refs.set(value, ref); 10 | return ref; 11 | }; 12 | 13 | const get = value => refs.get(value) || set(value); 14 | 15 | export class WSet extends Set { 16 | // 17 | #registry = new FinalizationRegistry(ref => super.delete(ref)); 18 | #drop(ref) { 19 | const had = super.delete(ref); 20 | if (had) 21 | this.#registry.unregister(ref); 22 | return had; 23 | } 24 | get size() { return [...this].length } 25 | delete(value) { 26 | return this.#drop(refs.get(value)); 27 | } 28 | has(value) { 29 | return super.has(refs.get(value)); 30 | } 31 | // 32 | constructor(entries = []) { 33 | super(); 34 | for (const value of entries) 35 | this.add(value); 36 | } 37 | clear() { 38 | for (const ref of super[iterator]()) 39 | this.#registry.unregister(ref); 40 | super.clear(); 41 | } 42 | add(value) { 43 | const ref = get(value); 44 | if (!super.has(ref)) { 45 | this.#registry.register(value, ref, ref); 46 | super.add(ref); 47 | } 48 | return this; 49 | } 50 | forEach(callback, thisArg) { 51 | for (const value of [...this]) 52 | callback.call(thisArg, value, value, this); 53 | } 54 | *[iterator]() { 55 | for (const ref of super[iterator]()) { 56 | const value = ref.deref(); 57 | if (value) 58 | yield value; 59 | else 60 | this.#drop(ref); 61 | } 62 | } 63 | *entries() { 64 | for (const value of this) 65 | yield [value, value]; 66 | } 67 | *keys() { yield *this[iterator]() } 68 | *values() { yield *this[iterator]() } 69 | } 70 | 71 | const noop = _ => {}; 72 | 73 | export class WKey extends Map { 74 | // 75 | #registry = new FinalizationRegistry( 76 | ([ref, callback, value]) => (super.delete(ref), callback.call(this, value)) 77 | ); 78 | #drop(ref) { 79 | const had = super.delete(ref); 80 | if (had) 81 | this.#registry.unregister(ref); 82 | return had; 83 | } 84 | get size() { return [...this].length } 85 | delete(key) { 86 | return this.#drop(refs.get(key)); 87 | } 88 | has(key) { 89 | return super.has(refs.get(key)); 90 | } 91 | // 92 | constructor(entries = []) { 93 | super(); 94 | for (const [key, value] of entries) 95 | this.set(key, value); 96 | } 97 | clear() { 98 | for (const ref of super.keys()) 99 | this.#registry.unregister(ref); 100 | super.clear(); 101 | } 102 | forEach(callback, thisArg) { 103 | for (const [key, value] of [...this]) 104 | callback.call(thisArg, value, key, this); 105 | } 106 | get(key) { 107 | return super.get(refs.get(key)); 108 | } 109 | set(key, value, callback = noop) { 110 | const ref = get(key); 111 | if (!super.has(ref)) 112 | this.#registry.register(key, [ref, callback, value], ref); 113 | return super.set(ref, value); 114 | } 115 | *[iterator]() { 116 | for (const [ref, value] of super[iterator]()) { 117 | const key = ref.deref(); 118 | if (key) 119 | yield [key, value]; 120 | else 121 | this.#drop(ref); 122 | } 123 | } 124 | *entries() { 125 | yield *this[iterator](); 126 | } 127 | *keys() { 128 | for (const [key] of this) 129 | yield key; 130 | } 131 | *values() { 132 | for (const [_, value] of this) 133 | yield value; 134 | } 135 | } 136 | 137 | export class WValue extends Map { 138 | #registry = new FinalizationRegistry( 139 | ([key, callback]) => (super.delete(key), callback.call(this, key)) 140 | ); 141 | get size() { return [...this].length } 142 | #drop(key, ref) { 143 | const had = super.delete(key); 144 | if (had) 145 | this.#registry.unregister(ref); 146 | return had; 147 | } 148 | constructor(entries = []) { 149 | super(); 150 | for (const [key, value] of entries) 151 | this.set(key, value); 152 | } 153 | clear() { 154 | for (const ref of super.values()) 155 | this.#registry.unregister(ref); 156 | super.clear(); 157 | } 158 | delete(key) { 159 | return this.#drop(key, super.get(key)); 160 | } 161 | forEach(callback, thisArg) { 162 | for (const [key, value] of [...this]) 163 | callback.call(thisArg, value, key, this); 164 | } 165 | get(key) { 166 | return super.get(key)?.deref(); 167 | } 168 | set(key, value, callback = noop) { 169 | let ref = super.get(key); 170 | if (ref) 171 | this.#registry.unregister(ref); 172 | ref = get(value); 173 | this.#registry.register(value, [key, callback], ref); 174 | return super.set(key, ref); 175 | } 176 | *[iterator]() { 177 | for (const [key, ref] of super[iterator]()) { 178 | const value = ref.deref(); 179 | if (value) 180 | yield [key, value]; 181 | else 182 | this.#drop(key, ref); 183 | } 184 | } 185 | *entries() { 186 | yield *this[iterator](); 187 | } 188 | *keys() { 189 | for (const [key] of this) 190 | yield key; 191 | } 192 | *values() { 193 | for (const [_, value] of this) 194 | yield value; 195 | } 196 | } 197 | -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "not-so-weak", 3 | "version": "2.0.0", 4 | "lockfileVersion": 2, 5 | "requires": true, 6 | "packages": { 7 | "": { 8 | "name": "not-so-weak", 9 | "version": "2.0.0", 10 | "license": "ISC", 11 | "devDependencies": { 12 | "ascjs": "^6.0.2", 13 | "c8": "^8.0.0" 14 | } 15 | }, 16 | "node_modules/@babel/parser": { 17 | "version": "7.20.13", 18 | "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.20.13.tgz", 19 | "integrity": "sha512-gFDLKMfpiXCsjt4za2JA9oTMn70CeseCehb11kRZgvd7+F67Hih3OHOK24cRrWECJ/ljfPGac6ygXAs/C8kIvw==", 20 | "dev": true, 21 | "bin": { 22 | "parser": "bin/babel-parser.js" 23 | }, 24 | "engines": { 25 | "node": ">=6.0.0" 26 | } 27 | }, 28 | "node_modules/@bcoe/v8-coverage": { 29 | "version": "0.2.3", 30 | "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", 31 | "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", 32 | "dev": true 33 | }, 34 | "node_modules/@istanbuljs/schema": { 35 | "version": "0.1.3", 36 | "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", 37 | "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", 38 | "dev": true, 39 | "engines": { 40 | "node": ">=8" 41 | } 42 | }, 43 | "node_modules/@jridgewell/resolve-uri": { 44 | "version": "3.1.0", 45 | "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", 46 | "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", 47 | "dev": true, 48 | "engines": { 49 | "node": ">=6.0.0" 50 | } 51 | }, 52 | "node_modules/@jridgewell/sourcemap-codec": { 53 | "version": "1.4.14", 54 | "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", 55 | "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", 56 | "dev": true 57 | }, 58 | "node_modules/@jridgewell/trace-mapping": { 59 | "version": "0.3.17", 60 | "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz", 61 | "integrity": "sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g==", 62 | "dev": true, 63 | "dependencies": { 64 | "@jridgewell/resolve-uri": "3.1.0", 65 | "@jridgewell/sourcemap-codec": "1.4.14" 66 | } 67 | }, 68 | "node_modules/@types/istanbul-lib-coverage": { 69 | "version": "2.0.4", 70 | "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz", 71 | "integrity": "sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==", 72 | "dev": true 73 | }, 74 | "node_modules/ansi-regex": { 75 | "version": "5.0.1", 76 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", 77 | "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", 78 | "dev": true, 79 | "engines": { 80 | "node": ">=8" 81 | } 82 | }, 83 | "node_modules/ansi-styles": { 84 | "version": "4.3.0", 85 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", 86 | "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", 87 | "dev": true, 88 | "dependencies": { 89 | "color-convert": "^2.0.1" 90 | }, 91 | "engines": { 92 | "node": ">=8" 93 | }, 94 | "funding": { 95 | "url": "https://github.com/chalk/ansi-styles?sponsor=1" 96 | } 97 | }, 98 | "node_modules/ascjs": { 99 | "version": "6.0.2", 100 | "resolved": "https://registry.npmjs.org/ascjs/-/ascjs-6.0.2.tgz", 101 | "integrity": "sha512-rCMUWcKZuiL9RhDc5NiKnzT78cq/iPoVxXQTv6TRwf7EJRVabKZb7bTNRf74EQHqVYty59RKvPt6wmD19yqNmQ==", 102 | "dev": true, 103 | "dependencies": { 104 | "@babel/parser": "^7.12.5" 105 | }, 106 | "bin": { 107 | "ascjs": "bin.js" 108 | } 109 | }, 110 | "node_modules/balanced-match": { 111 | "version": "1.0.2", 112 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", 113 | "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", 114 | "dev": true 115 | }, 116 | "node_modules/brace-expansion": { 117 | "version": "1.1.11", 118 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", 119 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", 120 | "dev": true, 121 | "dependencies": { 122 | "balanced-match": "^1.0.0", 123 | "concat-map": "0.0.1" 124 | } 125 | }, 126 | "node_modules/c8": { 127 | "version": "8.0.0", 128 | "resolved": "https://registry.npmjs.org/c8/-/c8-8.0.0.tgz", 129 | "integrity": "sha512-XHA5vSfCLglAc0Xt8eLBZMv19lgiBSjnb1FLAQgnwkuhJYEonpilhEB4Ea3jPAbm0FhD6VVJrc0z73jPe7JyGQ==", 130 | "dev": true, 131 | "dependencies": { 132 | "@bcoe/v8-coverage": "^0.2.3", 133 | "@istanbuljs/schema": "^0.1.3", 134 | "find-up": "^5.0.0", 135 | "foreground-child": "^2.0.0", 136 | "istanbul-lib-coverage": "^3.2.0", 137 | "istanbul-lib-report": "^3.0.0", 138 | "istanbul-reports": "^3.1.4", 139 | "rimraf": "^3.0.2", 140 | "test-exclude": "^6.0.0", 141 | "v8-to-istanbul": "^9.0.0", 142 | "yargs": "^16.2.0", 143 | "yargs-parser": "^20.2.9" 144 | }, 145 | "bin": { 146 | "c8": "bin/c8.js" 147 | }, 148 | "engines": { 149 | "node": ">=12" 150 | } 151 | }, 152 | "node_modules/cliui": { 153 | "version": "7.0.4", 154 | "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", 155 | "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", 156 | "dev": true, 157 | "dependencies": { 158 | "string-width": "^4.2.0", 159 | "strip-ansi": "^6.0.0", 160 | "wrap-ansi": "^7.0.0" 161 | } 162 | }, 163 | "node_modules/color-convert": { 164 | "version": "2.0.1", 165 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", 166 | "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", 167 | "dev": true, 168 | "dependencies": { 169 | "color-name": "~1.1.4" 170 | }, 171 | "engines": { 172 | "node": ">=7.0.0" 173 | } 174 | }, 175 | "node_modules/color-name": { 176 | "version": "1.1.4", 177 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", 178 | "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", 179 | "dev": true 180 | }, 181 | "node_modules/concat-map": { 182 | "version": "0.0.1", 183 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", 184 | "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", 185 | "dev": true 186 | }, 187 | "node_modules/convert-source-map": { 188 | "version": "1.9.0", 189 | "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", 190 | "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", 191 | "dev": true 192 | }, 193 | "node_modules/cross-spawn": { 194 | "version": "7.0.3", 195 | "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", 196 | "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", 197 | "dev": true, 198 | "dependencies": { 199 | "path-key": "^3.1.0", 200 | "shebang-command": "^2.0.0", 201 | "which": "^2.0.1" 202 | }, 203 | "engines": { 204 | "node": ">= 8" 205 | } 206 | }, 207 | "node_modules/emoji-regex": { 208 | "version": "8.0.0", 209 | "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", 210 | "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", 211 | "dev": true 212 | }, 213 | "node_modules/escalade": { 214 | "version": "3.1.1", 215 | "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", 216 | "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", 217 | "dev": true, 218 | "engines": { 219 | "node": ">=6" 220 | } 221 | }, 222 | "node_modules/find-up": { 223 | "version": "5.0.0", 224 | "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", 225 | "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", 226 | "dev": true, 227 | "dependencies": { 228 | "locate-path": "^6.0.0", 229 | "path-exists": "^4.0.0" 230 | }, 231 | "engines": { 232 | "node": ">=10" 233 | }, 234 | "funding": { 235 | "url": "https://github.com/sponsors/sindresorhus" 236 | } 237 | }, 238 | "node_modules/foreground-child": { 239 | "version": "2.0.0", 240 | "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-2.0.0.tgz", 241 | "integrity": "sha512-dCIq9FpEcyQyXKCkyzmlPTFNgrCzPudOe+mhvJU5zAtlBnGVy2yKxtfsxK2tQBThwq225jcvBjpw1Gr40uzZCA==", 242 | "dev": true, 243 | "dependencies": { 244 | "cross-spawn": "^7.0.0", 245 | "signal-exit": "^3.0.2" 246 | }, 247 | "engines": { 248 | "node": ">=8.0.0" 249 | } 250 | }, 251 | "node_modules/fs.realpath": { 252 | "version": "1.0.0", 253 | "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", 254 | "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", 255 | "dev": true 256 | }, 257 | "node_modules/get-caller-file": { 258 | "version": "2.0.5", 259 | "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", 260 | "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", 261 | "dev": true, 262 | "engines": { 263 | "node": "6.* || 8.* || >= 10.*" 264 | } 265 | }, 266 | "node_modules/glob": { 267 | "version": "7.2.3", 268 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", 269 | "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", 270 | "dev": true, 271 | "dependencies": { 272 | "fs.realpath": "^1.0.0", 273 | "inflight": "^1.0.4", 274 | "inherits": "2", 275 | "minimatch": "^3.1.1", 276 | "once": "^1.3.0", 277 | "path-is-absolute": "^1.0.0" 278 | }, 279 | "engines": { 280 | "node": "*" 281 | }, 282 | "funding": { 283 | "url": "https://github.com/sponsors/isaacs" 284 | } 285 | }, 286 | "node_modules/has-flag": { 287 | "version": "4.0.0", 288 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", 289 | "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", 290 | "dev": true, 291 | "engines": { 292 | "node": ">=8" 293 | } 294 | }, 295 | "node_modules/html-escaper": { 296 | "version": "2.0.2", 297 | "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", 298 | "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", 299 | "dev": true 300 | }, 301 | "node_modules/inflight": { 302 | "version": "1.0.6", 303 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", 304 | "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", 305 | "dev": true, 306 | "dependencies": { 307 | "once": "^1.3.0", 308 | "wrappy": "1" 309 | } 310 | }, 311 | "node_modules/inherits": { 312 | "version": "2.0.4", 313 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", 314 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", 315 | "dev": true 316 | }, 317 | "node_modules/is-fullwidth-code-point": { 318 | "version": "3.0.0", 319 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", 320 | "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", 321 | "dev": true, 322 | "engines": { 323 | "node": ">=8" 324 | } 325 | }, 326 | "node_modules/isexe": { 327 | "version": "2.0.0", 328 | "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", 329 | "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", 330 | "dev": true 331 | }, 332 | "node_modules/istanbul-lib-coverage": { 333 | "version": "3.2.0", 334 | "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz", 335 | "integrity": "sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==", 336 | "dev": true, 337 | "engines": { 338 | "node": ">=8" 339 | } 340 | }, 341 | "node_modules/istanbul-lib-report": { 342 | "version": "3.0.0", 343 | "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", 344 | "integrity": "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==", 345 | "dev": true, 346 | "dependencies": { 347 | "istanbul-lib-coverage": "^3.0.0", 348 | "make-dir": "^3.0.0", 349 | "supports-color": "^7.1.0" 350 | }, 351 | "engines": { 352 | "node": ">=8" 353 | } 354 | }, 355 | "node_modules/istanbul-reports": { 356 | "version": "3.1.5", 357 | "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.5.tgz", 358 | "integrity": "sha512-nUsEMa9pBt/NOHqbcbeJEgqIlY/K7rVWUX6Lql2orY5e9roQOthbR3vtY4zzf2orPELg80fnxxk9zUyPlgwD1w==", 359 | "dev": true, 360 | "dependencies": { 361 | "html-escaper": "^2.0.0", 362 | "istanbul-lib-report": "^3.0.0" 363 | }, 364 | "engines": { 365 | "node": ">=8" 366 | } 367 | }, 368 | "node_modules/locate-path": { 369 | "version": "6.0.0", 370 | "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", 371 | "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", 372 | "dev": true, 373 | "dependencies": { 374 | "p-locate": "^5.0.0" 375 | }, 376 | "engines": { 377 | "node": ">=10" 378 | }, 379 | "funding": { 380 | "url": "https://github.com/sponsors/sindresorhus" 381 | } 382 | }, 383 | "node_modules/make-dir": { 384 | "version": "3.1.0", 385 | "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", 386 | "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", 387 | "dev": true, 388 | "dependencies": { 389 | "semver": "^6.0.0" 390 | }, 391 | "engines": { 392 | "node": ">=8" 393 | }, 394 | "funding": { 395 | "url": "https://github.com/sponsors/sindresorhus" 396 | } 397 | }, 398 | "node_modules/minimatch": { 399 | "version": "3.1.2", 400 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", 401 | "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", 402 | "dev": true, 403 | "dependencies": { 404 | "brace-expansion": "^1.1.7" 405 | }, 406 | "engines": { 407 | "node": "*" 408 | } 409 | }, 410 | "node_modules/once": { 411 | "version": "1.4.0", 412 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 413 | "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", 414 | "dev": true, 415 | "dependencies": { 416 | "wrappy": "1" 417 | } 418 | }, 419 | "node_modules/p-limit": { 420 | "version": "3.1.0", 421 | "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", 422 | "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", 423 | "dev": true, 424 | "dependencies": { 425 | "yocto-queue": "^0.1.0" 426 | }, 427 | "engines": { 428 | "node": ">=10" 429 | }, 430 | "funding": { 431 | "url": "https://github.com/sponsors/sindresorhus" 432 | } 433 | }, 434 | "node_modules/p-locate": { 435 | "version": "5.0.0", 436 | "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", 437 | "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", 438 | "dev": true, 439 | "dependencies": { 440 | "p-limit": "^3.0.2" 441 | }, 442 | "engines": { 443 | "node": ">=10" 444 | }, 445 | "funding": { 446 | "url": "https://github.com/sponsors/sindresorhus" 447 | } 448 | }, 449 | "node_modules/path-exists": { 450 | "version": "4.0.0", 451 | "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", 452 | "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", 453 | "dev": true, 454 | "engines": { 455 | "node": ">=8" 456 | } 457 | }, 458 | "node_modules/path-is-absolute": { 459 | "version": "1.0.1", 460 | "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", 461 | "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", 462 | "dev": true, 463 | "engines": { 464 | "node": ">=0.10.0" 465 | } 466 | }, 467 | "node_modules/path-key": { 468 | "version": "3.1.1", 469 | "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", 470 | "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", 471 | "dev": true, 472 | "engines": { 473 | "node": ">=8" 474 | } 475 | }, 476 | "node_modules/require-directory": { 477 | "version": "2.1.1", 478 | "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", 479 | "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", 480 | "dev": true, 481 | "engines": { 482 | "node": ">=0.10.0" 483 | } 484 | }, 485 | "node_modules/rimraf": { 486 | "version": "3.0.2", 487 | "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", 488 | "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", 489 | "dev": true, 490 | "dependencies": { 491 | "glob": "^7.1.3" 492 | }, 493 | "bin": { 494 | "rimraf": "bin.js" 495 | }, 496 | "funding": { 497 | "url": "https://github.com/sponsors/isaacs" 498 | } 499 | }, 500 | "node_modules/semver": { 501 | "version": "6.3.1", 502 | "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", 503 | "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", 504 | "dev": true, 505 | "bin": { 506 | "semver": "bin/semver.js" 507 | } 508 | }, 509 | "node_modules/shebang-command": { 510 | "version": "2.0.0", 511 | "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", 512 | "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", 513 | "dev": true, 514 | "dependencies": { 515 | "shebang-regex": "^3.0.0" 516 | }, 517 | "engines": { 518 | "node": ">=8" 519 | } 520 | }, 521 | "node_modules/shebang-regex": { 522 | "version": "3.0.0", 523 | "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", 524 | "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", 525 | "dev": true, 526 | "engines": { 527 | "node": ">=8" 528 | } 529 | }, 530 | "node_modules/signal-exit": { 531 | "version": "3.0.7", 532 | "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", 533 | "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", 534 | "dev": true 535 | }, 536 | "node_modules/string-width": { 537 | "version": "4.2.3", 538 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", 539 | "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", 540 | "dev": true, 541 | "dependencies": { 542 | "emoji-regex": "^8.0.0", 543 | "is-fullwidth-code-point": "^3.0.0", 544 | "strip-ansi": "^6.0.1" 545 | }, 546 | "engines": { 547 | "node": ">=8" 548 | } 549 | }, 550 | "node_modules/strip-ansi": { 551 | "version": "6.0.1", 552 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", 553 | "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", 554 | "dev": true, 555 | "dependencies": { 556 | "ansi-regex": "^5.0.1" 557 | }, 558 | "engines": { 559 | "node": ">=8" 560 | } 561 | }, 562 | "node_modules/supports-color": { 563 | "version": "7.2.0", 564 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", 565 | "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", 566 | "dev": true, 567 | "dependencies": { 568 | "has-flag": "^4.0.0" 569 | }, 570 | "engines": { 571 | "node": ">=8" 572 | } 573 | }, 574 | "node_modules/test-exclude": { 575 | "version": "6.0.0", 576 | "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", 577 | "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", 578 | "dev": true, 579 | "dependencies": { 580 | "@istanbuljs/schema": "^0.1.2", 581 | "glob": "^7.1.4", 582 | "minimatch": "^3.0.4" 583 | }, 584 | "engines": { 585 | "node": ">=8" 586 | } 587 | }, 588 | "node_modules/v8-to-istanbul": { 589 | "version": "9.0.1", 590 | "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.0.1.tgz", 591 | "integrity": "sha512-74Y4LqY74kLE6IFyIjPtkSTWzUZmj8tdHT9Ii/26dvQ6K9Dl2NbEfj0XgU2sHCtKgt5VupqhlO/5aWuqS+IY1w==", 592 | "dev": true, 593 | "dependencies": { 594 | "@jridgewell/trace-mapping": "^0.3.12", 595 | "@types/istanbul-lib-coverage": "^2.0.1", 596 | "convert-source-map": "^1.6.0" 597 | }, 598 | "engines": { 599 | "node": ">=10.12.0" 600 | } 601 | }, 602 | "node_modules/which": { 603 | "version": "2.0.2", 604 | "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", 605 | "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", 606 | "dev": true, 607 | "dependencies": { 608 | "isexe": "^2.0.0" 609 | }, 610 | "bin": { 611 | "node-which": "bin/node-which" 612 | }, 613 | "engines": { 614 | "node": ">= 8" 615 | } 616 | }, 617 | "node_modules/wrap-ansi": { 618 | "version": "7.0.0", 619 | "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", 620 | "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", 621 | "dev": true, 622 | "dependencies": { 623 | "ansi-styles": "^4.0.0", 624 | "string-width": "^4.1.0", 625 | "strip-ansi": "^6.0.0" 626 | }, 627 | "engines": { 628 | "node": ">=10" 629 | }, 630 | "funding": { 631 | "url": "https://github.com/chalk/wrap-ansi?sponsor=1" 632 | } 633 | }, 634 | "node_modules/wrappy": { 635 | "version": "1.0.2", 636 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 637 | "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", 638 | "dev": true 639 | }, 640 | "node_modules/y18n": { 641 | "version": "5.0.8", 642 | "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", 643 | "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", 644 | "dev": true, 645 | "engines": { 646 | "node": ">=10" 647 | } 648 | }, 649 | "node_modules/yargs": { 650 | "version": "16.2.0", 651 | "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", 652 | "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", 653 | "dev": true, 654 | "dependencies": { 655 | "cliui": "^7.0.2", 656 | "escalade": "^3.1.1", 657 | "get-caller-file": "^2.0.5", 658 | "require-directory": "^2.1.1", 659 | "string-width": "^4.2.0", 660 | "y18n": "^5.0.5", 661 | "yargs-parser": "^20.2.2" 662 | }, 663 | "engines": { 664 | "node": ">=10" 665 | } 666 | }, 667 | "node_modules/yargs-parser": { 668 | "version": "20.2.9", 669 | "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", 670 | "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", 671 | "dev": true, 672 | "engines": { 673 | "node": ">=10" 674 | } 675 | }, 676 | "node_modules/yocto-queue": { 677 | "version": "0.1.0", 678 | "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", 679 | "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", 680 | "dev": true, 681 | "engines": { 682 | "node": ">=10" 683 | }, 684 | "funding": { 685 | "url": "https://github.com/sponsors/sindresorhus" 686 | } 687 | } 688 | }, 689 | "dependencies": { 690 | "@babel/parser": { 691 | "version": "7.20.13", 692 | "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.20.13.tgz", 693 | "integrity": "sha512-gFDLKMfpiXCsjt4za2JA9oTMn70CeseCehb11kRZgvd7+F67Hih3OHOK24cRrWECJ/ljfPGac6ygXAs/C8kIvw==", 694 | "dev": true 695 | }, 696 | "@bcoe/v8-coverage": { 697 | "version": "0.2.3", 698 | "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", 699 | "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", 700 | "dev": true 701 | }, 702 | "@istanbuljs/schema": { 703 | "version": "0.1.3", 704 | "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", 705 | "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", 706 | "dev": true 707 | }, 708 | "@jridgewell/resolve-uri": { 709 | "version": "3.1.0", 710 | "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", 711 | "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", 712 | "dev": true 713 | }, 714 | "@jridgewell/sourcemap-codec": { 715 | "version": "1.4.14", 716 | "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", 717 | "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", 718 | "dev": true 719 | }, 720 | "@jridgewell/trace-mapping": { 721 | "version": "0.3.17", 722 | "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz", 723 | "integrity": "sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g==", 724 | "dev": true, 725 | "requires": { 726 | "@jridgewell/resolve-uri": "3.1.0", 727 | "@jridgewell/sourcemap-codec": "1.4.14" 728 | } 729 | }, 730 | "@types/istanbul-lib-coverage": { 731 | "version": "2.0.4", 732 | "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz", 733 | "integrity": "sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==", 734 | "dev": true 735 | }, 736 | "ansi-regex": { 737 | "version": "5.0.1", 738 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", 739 | "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", 740 | "dev": true 741 | }, 742 | "ansi-styles": { 743 | "version": "4.3.0", 744 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", 745 | "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", 746 | "dev": true, 747 | "requires": { 748 | "color-convert": "^2.0.1" 749 | } 750 | }, 751 | "ascjs": { 752 | "version": "6.0.2", 753 | "resolved": "https://registry.npmjs.org/ascjs/-/ascjs-6.0.2.tgz", 754 | "integrity": "sha512-rCMUWcKZuiL9RhDc5NiKnzT78cq/iPoVxXQTv6TRwf7EJRVabKZb7bTNRf74EQHqVYty59RKvPt6wmD19yqNmQ==", 755 | "dev": true, 756 | "requires": { 757 | "@babel/parser": "^7.12.5" 758 | } 759 | }, 760 | "balanced-match": { 761 | "version": "1.0.2", 762 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", 763 | "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", 764 | "dev": true 765 | }, 766 | "brace-expansion": { 767 | "version": "1.1.11", 768 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", 769 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", 770 | "dev": true, 771 | "requires": { 772 | "balanced-match": "^1.0.0", 773 | "concat-map": "0.0.1" 774 | } 775 | }, 776 | "c8": { 777 | "version": "8.0.0", 778 | "resolved": "https://registry.npmjs.org/c8/-/c8-8.0.0.tgz", 779 | "integrity": "sha512-XHA5vSfCLglAc0Xt8eLBZMv19lgiBSjnb1FLAQgnwkuhJYEonpilhEB4Ea3jPAbm0FhD6VVJrc0z73jPe7JyGQ==", 780 | "dev": true, 781 | "requires": { 782 | "@bcoe/v8-coverage": "^0.2.3", 783 | "@istanbuljs/schema": "^0.1.3", 784 | "find-up": "^5.0.0", 785 | "foreground-child": "^2.0.0", 786 | "istanbul-lib-coverage": "^3.2.0", 787 | "istanbul-lib-report": "^3.0.0", 788 | "istanbul-reports": "^3.1.4", 789 | "rimraf": "^3.0.2", 790 | "test-exclude": "^6.0.0", 791 | "v8-to-istanbul": "^9.0.0", 792 | "yargs": "^16.2.0", 793 | "yargs-parser": "^20.2.9" 794 | } 795 | }, 796 | "cliui": { 797 | "version": "7.0.4", 798 | "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", 799 | "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", 800 | "dev": true, 801 | "requires": { 802 | "string-width": "^4.2.0", 803 | "strip-ansi": "^6.0.0", 804 | "wrap-ansi": "^7.0.0" 805 | } 806 | }, 807 | "color-convert": { 808 | "version": "2.0.1", 809 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", 810 | "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", 811 | "dev": true, 812 | "requires": { 813 | "color-name": "~1.1.4" 814 | } 815 | }, 816 | "color-name": { 817 | "version": "1.1.4", 818 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", 819 | "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", 820 | "dev": true 821 | }, 822 | "concat-map": { 823 | "version": "0.0.1", 824 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", 825 | "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", 826 | "dev": true 827 | }, 828 | "convert-source-map": { 829 | "version": "1.9.0", 830 | "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", 831 | "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", 832 | "dev": true 833 | }, 834 | "cross-spawn": { 835 | "version": "7.0.3", 836 | "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", 837 | "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", 838 | "dev": true, 839 | "requires": { 840 | "path-key": "^3.1.0", 841 | "shebang-command": "^2.0.0", 842 | "which": "^2.0.1" 843 | } 844 | }, 845 | "emoji-regex": { 846 | "version": "8.0.0", 847 | "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", 848 | "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", 849 | "dev": true 850 | }, 851 | "escalade": { 852 | "version": "3.1.1", 853 | "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", 854 | "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", 855 | "dev": true 856 | }, 857 | "find-up": { 858 | "version": "5.0.0", 859 | "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", 860 | "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", 861 | "dev": true, 862 | "requires": { 863 | "locate-path": "^6.0.0", 864 | "path-exists": "^4.0.0" 865 | } 866 | }, 867 | "foreground-child": { 868 | "version": "2.0.0", 869 | "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-2.0.0.tgz", 870 | "integrity": "sha512-dCIq9FpEcyQyXKCkyzmlPTFNgrCzPudOe+mhvJU5zAtlBnGVy2yKxtfsxK2tQBThwq225jcvBjpw1Gr40uzZCA==", 871 | "dev": true, 872 | "requires": { 873 | "cross-spawn": "^7.0.0", 874 | "signal-exit": "^3.0.2" 875 | } 876 | }, 877 | "fs.realpath": { 878 | "version": "1.0.0", 879 | "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", 880 | "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", 881 | "dev": true 882 | }, 883 | "get-caller-file": { 884 | "version": "2.0.5", 885 | "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", 886 | "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", 887 | "dev": true 888 | }, 889 | "glob": { 890 | "version": "7.2.3", 891 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", 892 | "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", 893 | "dev": true, 894 | "requires": { 895 | "fs.realpath": "^1.0.0", 896 | "inflight": "^1.0.4", 897 | "inherits": "2", 898 | "minimatch": "^3.1.1", 899 | "once": "^1.3.0", 900 | "path-is-absolute": "^1.0.0" 901 | } 902 | }, 903 | "has-flag": { 904 | "version": "4.0.0", 905 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", 906 | "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", 907 | "dev": true 908 | }, 909 | "html-escaper": { 910 | "version": "2.0.2", 911 | "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", 912 | "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", 913 | "dev": true 914 | }, 915 | "inflight": { 916 | "version": "1.0.6", 917 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", 918 | "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", 919 | "dev": true, 920 | "requires": { 921 | "once": "^1.3.0", 922 | "wrappy": "1" 923 | } 924 | }, 925 | "inherits": { 926 | "version": "2.0.4", 927 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", 928 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", 929 | "dev": true 930 | }, 931 | "is-fullwidth-code-point": { 932 | "version": "3.0.0", 933 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", 934 | "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", 935 | "dev": true 936 | }, 937 | "isexe": { 938 | "version": "2.0.0", 939 | "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", 940 | "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", 941 | "dev": true 942 | }, 943 | "istanbul-lib-coverage": { 944 | "version": "3.2.0", 945 | "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz", 946 | "integrity": "sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==", 947 | "dev": true 948 | }, 949 | "istanbul-lib-report": { 950 | "version": "3.0.0", 951 | "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", 952 | "integrity": "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==", 953 | "dev": true, 954 | "requires": { 955 | "istanbul-lib-coverage": "^3.0.0", 956 | "make-dir": "^3.0.0", 957 | "supports-color": "^7.1.0" 958 | } 959 | }, 960 | "istanbul-reports": { 961 | "version": "3.1.5", 962 | "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.5.tgz", 963 | "integrity": "sha512-nUsEMa9pBt/NOHqbcbeJEgqIlY/K7rVWUX6Lql2orY5e9roQOthbR3vtY4zzf2orPELg80fnxxk9zUyPlgwD1w==", 964 | "dev": true, 965 | "requires": { 966 | "html-escaper": "^2.0.0", 967 | "istanbul-lib-report": "^3.0.0" 968 | } 969 | }, 970 | "locate-path": { 971 | "version": "6.0.0", 972 | "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", 973 | "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", 974 | "dev": true, 975 | "requires": { 976 | "p-locate": "^5.0.0" 977 | } 978 | }, 979 | "make-dir": { 980 | "version": "3.1.0", 981 | "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", 982 | "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", 983 | "dev": true, 984 | "requires": { 985 | "semver": "^6.0.0" 986 | } 987 | }, 988 | "minimatch": { 989 | "version": "3.1.2", 990 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", 991 | "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", 992 | "dev": true, 993 | "requires": { 994 | "brace-expansion": "^1.1.7" 995 | } 996 | }, 997 | "once": { 998 | "version": "1.4.0", 999 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 1000 | "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", 1001 | "dev": true, 1002 | "requires": { 1003 | "wrappy": "1" 1004 | } 1005 | }, 1006 | "p-limit": { 1007 | "version": "3.1.0", 1008 | "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", 1009 | "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", 1010 | "dev": true, 1011 | "requires": { 1012 | "yocto-queue": "^0.1.0" 1013 | } 1014 | }, 1015 | "p-locate": { 1016 | "version": "5.0.0", 1017 | "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", 1018 | "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", 1019 | "dev": true, 1020 | "requires": { 1021 | "p-limit": "^3.0.2" 1022 | } 1023 | }, 1024 | "path-exists": { 1025 | "version": "4.0.0", 1026 | "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", 1027 | "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", 1028 | "dev": true 1029 | }, 1030 | "path-is-absolute": { 1031 | "version": "1.0.1", 1032 | "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", 1033 | "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", 1034 | "dev": true 1035 | }, 1036 | "path-key": { 1037 | "version": "3.1.1", 1038 | "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", 1039 | "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", 1040 | "dev": true 1041 | }, 1042 | "require-directory": { 1043 | "version": "2.1.1", 1044 | "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", 1045 | "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", 1046 | "dev": true 1047 | }, 1048 | "rimraf": { 1049 | "version": "3.0.2", 1050 | "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", 1051 | "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", 1052 | "dev": true, 1053 | "requires": { 1054 | "glob": "^7.1.3" 1055 | } 1056 | }, 1057 | "semver": { 1058 | "version": "6.3.1", 1059 | "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", 1060 | "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", 1061 | "dev": true 1062 | }, 1063 | "shebang-command": { 1064 | "version": "2.0.0", 1065 | "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", 1066 | "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", 1067 | "dev": true, 1068 | "requires": { 1069 | "shebang-regex": "^3.0.0" 1070 | } 1071 | }, 1072 | "shebang-regex": { 1073 | "version": "3.0.0", 1074 | "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", 1075 | "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", 1076 | "dev": true 1077 | }, 1078 | "signal-exit": { 1079 | "version": "3.0.7", 1080 | "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", 1081 | "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", 1082 | "dev": true 1083 | }, 1084 | "string-width": { 1085 | "version": "4.2.3", 1086 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", 1087 | "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", 1088 | "dev": true, 1089 | "requires": { 1090 | "emoji-regex": "^8.0.0", 1091 | "is-fullwidth-code-point": "^3.0.0", 1092 | "strip-ansi": "^6.0.1" 1093 | } 1094 | }, 1095 | "strip-ansi": { 1096 | "version": "6.0.1", 1097 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", 1098 | "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", 1099 | "dev": true, 1100 | "requires": { 1101 | "ansi-regex": "^5.0.1" 1102 | } 1103 | }, 1104 | "supports-color": { 1105 | "version": "7.2.0", 1106 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", 1107 | "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", 1108 | "dev": true, 1109 | "requires": { 1110 | "has-flag": "^4.0.0" 1111 | } 1112 | }, 1113 | "test-exclude": { 1114 | "version": "6.0.0", 1115 | "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", 1116 | "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", 1117 | "dev": true, 1118 | "requires": { 1119 | "@istanbuljs/schema": "^0.1.2", 1120 | "glob": "^7.1.4", 1121 | "minimatch": "^3.0.4" 1122 | } 1123 | }, 1124 | "v8-to-istanbul": { 1125 | "version": "9.0.1", 1126 | "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.0.1.tgz", 1127 | "integrity": "sha512-74Y4LqY74kLE6IFyIjPtkSTWzUZmj8tdHT9Ii/26dvQ6K9Dl2NbEfj0XgU2sHCtKgt5VupqhlO/5aWuqS+IY1w==", 1128 | "dev": true, 1129 | "requires": { 1130 | "@jridgewell/trace-mapping": "^0.3.12", 1131 | "@types/istanbul-lib-coverage": "^2.0.1", 1132 | "convert-source-map": "^1.6.0" 1133 | } 1134 | }, 1135 | "which": { 1136 | "version": "2.0.2", 1137 | "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", 1138 | "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", 1139 | "dev": true, 1140 | "requires": { 1141 | "isexe": "^2.0.0" 1142 | } 1143 | }, 1144 | "wrap-ansi": { 1145 | "version": "7.0.0", 1146 | "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", 1147 | "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", 1148 | "dev": true, 1149 | "requires": { 1150 | "ansi-styles": "^4.0.0", 1151 | "string-width": "^4.1.0", 1152 | "strip-ansi": "^6.0.0" 1153 | } 1154 | }, 1155 | "wrappy": { 1156 | "version": "1.0.2", 1157 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 1158 | "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", 1159 | "dev": true 1160 | }, 1161 | "y18n": { 1162 | "version": "5.0.8", 1163 | "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", 1164 | "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", 1165 | "dev": true 1166 | }, 1167 | "yargs": { 1168 | "version": "16.2.0", 1169 | "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", 1170 | "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", 1171 | "dev": true, 1172 | "requires": { 1173 | "cliui": "^7.0.2", 1174 | "escalade": "^3.1.1", 1175 | "get-caller-file": "^2.0.5", 1176 | "require-directory": "^2.1.1", 1177 | "string-width": "^4.2.0", 1178 | "y18n": "^5.0.5", 1179 | "yargs-parser": "^20.2.2" 1180 | } 1181 | }, 1182 | "yargs-parser": { 1183 | "version": "20.2.9", 1184 | "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", 1185 | "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", 1186 | "dev": true 1187 | }, 1188 | "yocto-queue": { 1189 | "version": "0.1.0", 1190 | "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", 1191 | "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", 1192 | "dev": true 1193 | } 1194 | } 1195 | } 1196 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "not-so-weak", 3 | "version": "2.0.0", 4 | "main": "./cjs/index.js", 5 | "scripts": { 6 | "build": "npm run cjs && npm run test", 7 | "cjs": "ascjs esm cjs", 8 | "test": "c8 node --expose-gc test/index.js", 9 | "coverage": "mkdir -p ./coverage; c8 report --reporter=text-lcov > ./coverage/lcov.info" 10 | }, 11 | "types": "./types/index.d.ts", 12 | "keywords": [ 13 | "WeakMap", 14 | "WeakSet", 15 | "Weakvalue", 16 | "iterable" 17 | ], 18 | "author": "Andrea Giammarchi", 19 | "license": "ISC", 20 | "devDependencies": { 21 | "ascjs": "^6.0.2", 22 | "c8": "^8.0.0" 23 | }, 24 | "module": "./esm/index.js", 25 | "type": "module", 26 | "exports": { 27 | ".": { 28 | "import": "./esm/index.js", 29 | "default": "./cjs/index.js" 30 | }, 31 | "./package.json": "./package.json" 32 | }, 33 | "directories": { 34 | "test": "test" 35 | }, 36 | "repository": { 37 | "type": "git", 38 | "url": "git+https://github.com/WebReflection/not-so-weak.git" 39 | }, 40 | "bugs": { 41 | "url": "https://github.com/WebReflection/not-so-weak/issues" 42 | }, 43 | "homepage": "https://github.com/WebReflection/not-so-weak#readme", 44 | "description": "Iterable WeakMap, WeakSet and WeakValue." 45 | } 46 | -------------------------------------------------------------------------------- /test/index.js: -------------------------------------------------------------------------------- 1 | import {WSet, WKey, WValue} from '../esm/index.js'; 2 | 3 | const assert = (got, expected, message = {got, expected}) => { 4 | if (!Object.is(got, expected)) { 5 | console.error(message); 6 | process.exit(1); 7 | } 8 | }; 9 | 10 | // Removed as MDN warning suggests 11 | // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Symbol/species 12 | // assert(WSet[Symbol.species], WSet); 13 | // assert(WKey[Symbol.species], WKey); 14 | // assert(WValue[Symbol.species], WValue); 15 | 16 | const ws = new WSet([{}]); 17 | 18 | let wkFinalization = false; 19 | const wk = new WKey; 20 | wk.set({}, 'value', function (value) { 21 | assert(value, 'value', 'wk finalization callback'); 22 | assert(this, wk, 'wk finalization context'); 23 | wkFinalization = true; 24 | }); 25 | 26 | let wvFinalization = false; 27 | const wv = new WValue; 28 | wv.set('value', {}, function (key) { 29 | assert(key, 'value', 'wv finalization callback'); 30 | assert(this, wv, 'wv finalization context'); 31 | wvFinalization = true; 32 | }); 33 | 34 | const wvNoCallback = new WValue([['value', {}]]); 35 | 36 | assert(ws.size, 1, 'ok ws size'); 37 | assert(wk.size, 1, 'ok wk size'); 38 | assert(wv.size, 1, 'ok wv size'); 39 | assert(wvNoCallback.size, 1, 'ok wvNoCallback size'); 40 | 41 | gc(); 42 | setTimeout(() => { 43 | gc(); 44 | setTimeout(() => { 45 | gc(); 46 | assert(ws.size, 0, 'ok ws collector'); 47 | assert(wk.size, 0, 'ok wk collector'); 48 | assert(wv.size, 0, 'ok wv collector'); 49 | assert(wvNoCallback.size, 0, 'ok wv collector'); 50 | assert(wkFinalization, true, 'ok wk finalization'); 51 | assert(wvFinalization, true, 'ok wv finalization'); 52 | 53 | ws.add({}); 54 | wk.set({}, 'value'); 55 | wv.set('value', {}); 56 | setTimeout(() => { 57 | gc(); 58 | assert(ws.size, 0, 'ok ws collector'); 59 | assert(wk.size, 0, 'ok wk collector'); 60 | assert(wv.size, 0, 'ok wv collector'); 61 | }); 62 | }, 100); 63 | }, 100); 64 | 65 | const wsAPI = new WSet; 66 | wsAPI.add(ws); 67 | assert(wsAPI.size, 1, 'ok ws add'); 68 | wsAPI.add(ws); 69 | assert(wsAPI.size, 1, 'ok ws repeated add'); 70 | assert(wsAPI.has(ws), true, 'ok ws has'); 71 | assert([...wsAPI.keys()][0], [...wsAPI.values()][0], 'ok ws keys/values'); 72 | assert([...wsAPI.keys()][0], ws, 'ok ws keys/values check'); 73 | assert([...wsAPI.entries()][0][0], [...wsAPI.entries()][0][1], 'ok ws entries'); 74 | assert([...wsAPI.entries()][0][0], ws, 'ok ws entries check'); 75 | let each = 0; 76 | wsAPI.forEach(function (a, b, set) { 77 | each++; 78 | assert(this, ws); 79 | assert(a, ws); 80 | assert(b, ws); 81 | assert(set, wsAPI); 82 | }, ws); 83 | assert(each, 1, 'ok ws forEach'); 84 | assert(wsAPI.delete(ws), true, 'ok ws delete'); 85 | assert(wsAPI.delete(ws), false, 'ok ws repeated delete'); 86 | assert(wsAPI.has(ws), false, 'ok ws repeated has'); 87 | wsAPI.add(ws); 88 | assert(wsAPI.size, 1); 89 | wsAPI.clear(); 90 | assert(wsAPI.size, 0); 91 | 92 | const wkAPI = new WKey([[wk, 'value']]); 93 | assert(wkAPI.size, 1, 'ok wk constructor'); 94 | wkAPI.set(wk, 'new value'); 95 | assert(wkAPI.size, 1, 'ok wk repeated add'); 96 | assert(wkAPI.has(wk), true, 'ok wk has'); 97 | assert(wkAPI.get(wk), 'new value', 'ok wk get'); 98 | assert([...wkAPI.keys()][0], wk, 'ok wk keys check'); 99 | assert([...wkAPI.values()][0], 'new value', 'ok wk values check'); 100 | assert([...wkAPI.entries()][0][0], wk, 'ok wk entries keys check'); 101 | assert([...wkAPI.entries()][0][1], 'new value', 'ok wk entries values check'); 102 | let wkeach = 0; 103 | wkAPI.forEach(function (value, key, map) { 104 | wkeach++; 105 | assert(this, wk); 106 | assert(value, 'new value'); 107 | assert(key, wk); 108 | assert(map, wkAPI); 109 | }, wk); 110 | assert(wkeach, 1, 'ok wk forEach'); 111 | assert(wkAPI.delete(wk), true, 'ok wk delete'); 112 | assert(wkAPI.delete(wk), false, 'ok wk repeated delete'); 113 | assert(wkAPI.has(wk), false, 'ok wk repeated has'); 114 | wkAPI.set(wk, 1); 115 | assert(wkAPI.size, 1); 116 | wkAPI.clear(); 117 | assert(wkAPI.size, 0); 118 | 119 | 120 | const wvAPI = new WValue([['value', wk]]); 121 | assert(wvAPI.size, 1, 'ok wv constructor'); 122 | wvAPI.set('value', wv); 123 | assert(wvAPI.size, 1, 'ok wv repeated add'); 124 | assert(wvAPI.has('value'), true, 'ok wv has'); 125 | assert(wvAPI.get('value'), wv, 'ok wv get'); 126 | assert([...wvAPI.keys()][0], 'value', 'ok wv keys check'); 127 | assert([...wvAPI.values()][0], wv, 'ok wv values check'); 128 | assert([...wvAPI.entries()][0][0], 'value', 'ok wv entries keys check'); 129 | assert([...wvAPI.entries()][0][1], wv, 'ok wv entries values check'); 130 | let wveach = 0; 131 | wvAPI.forEach(function (value, key, map) { 132 | wveach++; 133 | assert(this, wv); 134 | assert(value, wv); 135 | assert(key, 'value'); 136 | assert(map, wvAPI); 137 | }, wv); 138 | assert(wveach, 1, 'ok wv forEach'); 139 | assert(wvAPI.delete('value'), true, 'ok wv delete'); 140 | assert(wvAPI.delete('value'), false, 'ok wv repeated delete'); 141 | assert(wvAPI.has('value'), false, 'ok wv repeated has'); 142 | wvAPI.set(1, wv); 143 | assert(wvAPI.size, 1); 144 | wvAPI.clear(); 145 | assert(wvAPI.size, 0); 146 | -------------------------------------------------------------------------------- /types/index.d.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * An iterable WeakSet. 3 | */ 4 | export class WSet extends WeakSet { 5 | clear(): void; 6 | /** 7 | * Executes a provided function once per each value in the WeakSet object, in insertion order. 8 | */ 9 | forEach(callbackfn: (value: T, value2: T, set: WSet) => void, thisArg?: any): void; 10 | /** 11 | * @returns the number of (unique) elements in the WeakSet. 12 | */ 13 | readonly size: number; 14 | /** Iterates over values in the WeakSet. */ 15 | [Symbol.iterator](): IterableIterator; 16 | /** 17 | * Returns an iterable of [v,v] pairs for every value `v` in the WeakSet. 18 | */ 19 | entries(): IterableIterator<[T, T]>; 20 | /** 21 | * Despite its name, returns an iterable of the values in the WeakSet. 22 | */ 23 | keys(): IterableIterator; 24 | 25 | /** 26 | * Returns an iterable of values in the WeakSet. 27 | */ 28 | values(): IterableIterator; 29 | } 30 | 31 | /** 32 | * An iterable WeakMap. 33 | */ 34 | export class WKey extends WeakMap { 35 | clear(): void; 36 | /** 37 | * Executes a provided function once per each key/value pair in the WeakMap, in insertion order. 38 | */ 39 | forEach(callbackfn: (value: V, key: K, map: WKey) => void, thisArg?: any): void; 40 | /** 41 | * @returns the number of elements in the WeakMap. 42 | */ 43 | readonly size: number; 44 | /** Returns an iterable of entries in the map. */ 45 | [Symbol.iterator](): IterableIterator<[K, V]>; 46 | /** 47 | * Returns an iterable of key, value pairs for every entry in the map. 48 | */ 49 | entries(): IterableIterator<[K, V]>; 50 | 51 | /** 52 | * Returns an iterable of keys in the map 53 | */ 54 | keys(): IterableIterator; 55 | 56 | /** 57 | * Returns an iterable of values in the map 58 | */ 59 | values(): IterableIterator; 60 | } 61 | 62 | 63 | /** 64 | * A Map with weak values insted of keys. 65 | */ 66 | export class WValue extends Map {} 67 | --------------------------------------------------------------------------------