├── .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 | [](https://github.com/WebReflection/not-so-weak/actions) [](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 |
--------------------------------------------------------------------------------