aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLibravatar Kristóf Marussy <kristof@marussy.com>2022-01-03 03:07:50 +0100
committerLibravatar Kristóf Marussy <kristof@marussy.com>2022-02-08 21:42:22 +0100
commit59fc8666ae26f672ab6232cd637021aa61cd0e76 (patch)
tree10a4328e9ccb1a2fcdc6c1042876d4f1d5630946
parentfeat: Add Profile and Service stores (diff)
downloadsophie-59fc8666ae26f672ab6232cd637021aa61cd0e76.tar.gz
sophie-59fc8666ae26f672ab6232cd637021aa61cd0e76.tar.zst
sophie-59fc8666ae26f672ab6232cd637021aa61cd0e76.zip
feat: Rewrite the config if new details are added
If we generate a new ID or a new profile, it should be added to the config file immediately. Signed-off-by: Kristóf Marussy <kristof@marussy.com>
-rw-r--r--packages/main/package.json2
-rw-r--r--packages/main/src/controllers/__tests__/initConfig.spec.ts41
-rw-r--r--packages/main/src/controllers/initConfig.ts23
-rw-r--r--yarn.lock173
4 files changed, 220 insertions, 19 deletions
diff --git a/packages/main/package.json b/packages/main/package.json
index 80a93b9..c03e81e 100644
--- a/packages/main/package.json
+++ b/packages/main/package.json
@@ -11,6 +11,7 @@
11 "@sophie/service-shared": "workspace:*", 11 "@sophie/service-shared": "workspace:*",
12 "@sophie/shared": "workspace:*", 12 "@sophie/shared": "workspace:*",
13 "chalk": "^5.0.0", 13 "chalk": "^5.0.0",
14 "deep-equal": "^2.0.5",
14 "electron": "17.0.0", 15 "electron": "17.0.0",
15 "fs-extra": "^10.0.0", 16 "fs-extra": "^10.0.0",
16 "json5": "^2.2.0", 17 "json5": "^2.2.0",
@@ -26,6 +27,7 @@
26 }, 27 },
27 "devDependencies": { 28 "devDependencies": {
28 "@jest/globals": "^27.4.6", 29 "@jest/globals": "^27.4.6",
30 "@types/deep-equal": "^1.0.1",
29 "@types/electron-devtools-installer": "^2.2.1", 31 "@types/electron-devtools-installer": "^2.2.1",
30 "@types/lodash-es": "^4.17.5", 32 "@types/lodash-es": "^4.17.5",
31 "@types/ms": "^0.7.31", 33 "@types/ms": "^0.7.31",
diff --git a/packages/main/src/controllers/__tests__/initConfig.spec.ts b/packages/main/src/controllers/__tests__/initConfig.spec.ts
index 11e7690..241ab2d 100644
--- a/packages/main/src/controllers/__tests__/initConfig.spec.ts
+++ b/packages/main/src/controllers/__tests__/initConfig.spec.ts
@@ -20,6 +20,7 @@
20 20
21import { jest } from '@jest/globals'; 21import { jest } from '@jest/globals';
22import { mocked } from 'jest-mock'; 22import { mocked } from 'jest-mock';
23import { getSnapshot } from 'mobx-state-tree';
23import ms from 'ms'; 24import ms from 'ms';
24 25
25import type ConfigPersistenceService from '../../services/ConfigPersistenceService'; 26import type ConfigPersistenceService from '../../services/ConfigPersistenceService';
@@ -74,6 +75,8 @@ describe('when initializing', () => {
74 mocked(persistenceService.readConfig).mockResolvedValueOnce({ 75 mocked(persistenceService.readConfig).mockResolvedValueOnce({
75 found: true, 76 found: true,
76 data: { 77 data: {
78 // Use a default empty config file to not trigger config rewrite.
79 ...getSnapshot(config),
77 themeSource: 'dark', 80 themeSource: 'dark',
78 }, 81 },
79 }); 82 });
@@ -95,7 +98,21 @@ describe('when initializing', () => {
95 }); 98 });
96 }); 99 });
97 100
98 it('should not apply an invalid config file', async () => { 101 it('should update the config file if new details are added during read', async () => {
102 mocked(persistenceService.readConfig).mockResolvedValueOnce({
103 found: true,
104 data: {
105 themeSource: 'light',
106 profile: {
107 name: 'Test profile',
108 },
109 },
110 });
111 await initConfig(config, persistenceService);
112 expect(persistenceService.writeConfig).toHaveBeenCalledTimes(1);
113 });
114
115 it('should not apply an invalid config file but should not overwrite it', async () => {
99 mocked(persistenceService.readConfig).mockResolvedValueOnce({ 116 mocked(persistenceService.readConfig).mockResolvedValueOnce({
100 found: true, 117 found: true,
101 data: { 118 data: {
@@ -104,6 +121,7 @@ describe('when initializing', () => {
104 }); 121 });
105 await initConfig(config, persistenceService); 122 await initConfig(config, persistenceService);
106 expect(config.themeSource).not.toBe(-1); 123 expect(config.themeSource).not.toBe(-1);
124 expect(persistenceService.writeConfig).not.toHaveBeenCalled();
107 }); 125 });
108 126
109 it('should bail if it cannot determine whether there is a config file', async () => { 127 it('should bail if it cannot determine whether there is a config file', async () => {
@@ -122,7 +140,7 @@ describe('when it has loaded the config', () => {
122 beforeEach(async () => { 140 beforeEach(async () => {
123 mocked(persistenceService.readConfig).mockResolvedValueOnce({ 141 mocked(persistenceService.readConfig).mockResolvedValueOnce({
124 found: true, 142 found: true,
125 data: {}, 143 data: getSnapshot(config),
126 }); 144 });
127 mocked(persistenceService.watchConfig).mockReturnValueOnce(watcherDisposer); 145 mocked(persistenceService.watchConfig).mockReturnValueOnce(watcherDisposer);
128 sutDisposer = await initConfig(config, persistenceService, throttleMs); 146 sutDisposer = await initConfig(config, persistenceService, throttleMs);
@@ -152,6 +170,8 @@ describe('when it has loaded the config', () => {
152 mocked(persistenceService.readConfig).mockResolvedValueOnce({ 170 mocked(persistenceService.readConfig).mockResolvedValueOnce({
153 found: true, 171 found: true,
154 data: { 172 data: {
173 // Use a default empty config file to not trigger config rewrite.
174 ...getSnapshot(config),
155 themeSource: 'dark', 175 themeSource: 'dark',
156 }, 176 },
157 }); 177 });
@@ -161,7 +181,21 @@ describe('when it has loaded the config', () => {
161 expect(config.themeSource).toBe('dark'); 181 expect(config.themeSource).toBe('dark');
162 }); 182 });
163 183
164 it('should not apply an invalid config file when it has changed', async () => { 184 it('should update the config file if new details are added', async () => {
185 mocked(persistenceService.readConfig).mockResolvedValueOnce({
186 found: true,
187 data: {
188 themeSource: 'light',
189 profile: {
190 name: 'Test profile',
191 },
192 },
193 });
194 await configChangedCallback();
195 expect(persistenceService.writeConfig).toHaveBeenCalledTimes(1);
196 });
197
198 it('should not apply an invalid config file when it has changed but should not overwrite it', async () => {
165 mocked(persistenceService.readConfig).mockResolvedValueOnce({ 199 mocked(persistenceService.readConfig).mockResolvedValueOnce({
166 found: true, 200 found: true,
167 data: { 201 data: {
@@ -170,6 +204,7 @@ describe('when it has loaded the config', () => {
170 }); 204 });
171 await configChangedCallback(); 205 await configChangedCallback();
172 expect(config.themeSource).not.toBe(-1); 206 expect(config.themeSource).not.toBe(-1);
207 expect(persistenceService.writeConfig).not.toHaveBeenCalled();
173 }); 208 });
174 209
175 it('should handle config reading errors gracefully', async () => { 210 it('should handle config reading errors gracefully', async () => {
diff --git a/packages/main/src/controllers/initConfig.ts b/packages/main/src/controllers/initConfig.ts
index 93be978..2dcabaf 100644
--- a/packages/main/src/controllers/initConfig.ts
+++ b/packages/main/src/controllers/initConfig.ts
@@ -18,12 +18,13 @@
18 * SPDX-License-Identifier: AGPL-3.0-only 18 * SPDX-License-Identifier: AGPL-3.0-only
19 */ 19 */
20 20
21import deepEqual from 'deep-equal';
21import { debounce } from 'lodash-es'; 22import { debounce } from 'lodash-es';
22import { getSnapshot, onSnapshot } from 'mobx-state-tree'; 23import { getSnapshot, onSnapshot } from 'mobx-state-tree';
23import ms from 'ms'; 24import ms from 'ms';
24 25
25import type ConfigPersistenceService from '../services/ConfigPersistenceService.js'; 26import type ConfigPersistenceService from '../services/ConfigPersistenceService';
26import { Config, ConfigFileIn, ConfigSnapshotOut } from '../stores/Config.js'; 27import { Config, ConfigFileIn, ConfigSnapshotOut } from '../stores/Config';
27import type Disposer from '../utils/Disposer'; 28import type Disposer from '../utils/Disposer';
28import { getLogger } from '../utils/log'; 29import { getLogger } from '../utils/log';
29 30
@@ -40,6 +41,12 @@ export default async function initConfig(
40 41
41 let lastSnapshotOnDisk: ConfigSnapshotOut | undefined; 42 let lastSnapshotOnDisk: ConfigSnapshotOut | undefined;
42 43
44 async function writeConfig(): Promise<void> {
45 const snapshot = getSnapshot(config);
46 await persistenceService.writeConfig(snapshot);
47 lastSnapshotOnDisk = snapshot;
48 }
49
43 async function readConfig(): Promise<boolean> { 50 async function readConfig(): Promise<boolean> {
44 const result = await persistenceService.readConfig(); 51 const result = await persistenceService.readConfig();
45 if (result.found) { 52 if (result.found) {
@@ -49,18 +56,16 @@ export default async function initConfig(
49 config.loadFromConfigFile(result.data as ConfigFileIn); 56 config.loadFromConfigFile(result.data as ConfigFileIn);
50 } catch (error) { 57 } catch (error) {
51 log.error('Failed to apply config snapshot', result.data, error); 58 log.error('Failed to apply config snapshot', result.data, error);
59 return true;
60 }
61 lastSnapshotOnDisk = getSnapshot(config);
62 if (!deepEqual(result.data, lastSnapshotOnDisk, { strict: true })) {
63 await writeConfig();
52 } 64 }
53 } 65 }
54 lastSnapshotOnDisk = getSnapshot(config);
55 return result.found; 66 return result.found;
56 } 67 }
57 68
58 async function writeConfig(): Promise<void> {
59 const snapshot = getSnapshot(config);
60 await persistenceService.writeConfig(snapshot);
61 lastSnapshotOnDisk = snapshot;
62 }
63
64 if (!(await readConfig())) { 69 if (!(await readConfig())) {
65 log.info('Config file was not found'); 70 log.info('Config file was not found');
66 await writeConfig(); 71 await writeConfig();
diff --git a/yarn.lock b/yarn.lock
index eba34a3..f7dd338 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -1237,12 +1237,14 @@ __metadata:
1237 "@jest/globals": ^27.4.6 1237 "@jest/globals": ^27.4.6
1238 "@sophie/service-shared": "workspace:*" 1238 "@sophie/service-shared": "workspace:*"
1239 "@sophie/shared": "workspace:*" 1239 "@sophie/shared": "workspace:*"
1240 "@types/deep-equal": ^1.0.1
1240 "@types/electron-devtools-installer": ^2.2.1 1241 "@types/electron-devtools-installer": ^2.2.1
1241 "@types/lodash-es": ^4.17.5 1242 "@types/lodash-es": ^4.17.5
1242 "@types/ms": ^0.7.31 1243 "@types/ms": ^0.7.31
1243 "@types/node": ^17.0.12 1244 "@types/node": ^17.0.12
1244 "@types/slug": ^5 1245 "@types/slug": ^5
1245 chalk: ^5.0.0 1246 chalk: ^5.0.0
1247 deep-equal: ^2.0.5
1246 electron: 17.0.0 1248 electron: 17.0.0
1247 electron-devtools-installer: ^3.2.0 1249 electron-devtools-installer: ^3.2.0
1248 esbuild: ^0.14.14 1250 esbuild: ^0.14.14
@@ -1418,6 +1420,13 @@ __metadata:
1418 languageName: node 1420 languageName: node
1419 linkType: hard 1421 linkType: hard
1420 1422
1423"@types/deep-equal@npm:^1.0.1":
1424 version: 1.0.1
1425 resolution: "@types/deep-equal@npm:1.0.1"
1426 checksum: 689b5737dd0a37d173d9e1231c07f70a1a9a989087b757422e1d167ec3640fd7eb8a538bd6008b3df400c4c11ed07a6c2a92d9aafc1f98ffaa04731a9442c781
1427 languageName: node
1428 linkType: hard
1429
1421"@types/electron-devtools-installer@npm:^2.2.1": 1430"@types/electron-devtools-installer@npm:^2.2.1":
1422 version: 2.2.1 1431 version: 2.2.1
1423 resolution: "@types/electron-devtools-installer@npm:2.2.1" 1432 resolution: "@types/electron-devtools-installer@npm:2.2.1"
@@ -2203,6 +2212,13 @@ __metadata:
2203 languageName: node 2212 languageName: node
2204 linkType: hard 2213 linkType: hard
2205 2214
2215"available-typed-arrays@npm:^1.0.5":
2216 version: 1.0.5
2217 resolution: "available-typed-arrays@npm:1.0.5"
2218 checksum: 20eb47b3cefd7db027b9bbb993c658abd36d4edd3fe1060e83699a03ee275b0c9b216cc076ff3f2db29073225fb70e7613987af14269ac1fe2a19803ccc97f1a
2219 languageName: node
2220 linkType: hard
2221
2206"axe-core@npm:^4.3.5": 2222"axe-core@npm:^4.3.5":
2207 version: 4.3.5 2223 version: 4.3.5
2208 resolution: "axe-core@npm:4.3.5" 2224 resolution: "axe-core@npm:4.3.5"
@@ -3113,6 +3129,29 @@ __metadata:
3113 languageName: node 3129 languageName: node
3114 linkType: hard 3130 linkType: hard
3115 3131
3132"deep-equal@npm:^2.0.5":
3133 version: 2.0.5
3134 resolution: "deep-equal@npm:2.0.5"
3135 dependencies:
3136 call-bind: ^1.0.0
3137 es-get-iterator: ^1.1.1
3138 get-intrinsic: ^1.0.1
3139 is-arguments: ^1.0.4
3140 is-date-object: ^1.0.2
3141 is-regex: ^1.1.1
3142 isarray: ^2.0.5
3143 object-is: ^1.1.4
3144 object-keys: ^1.1.1
3145 object.assign: ^4.1.2
3146 regexp.prototype.flags: ^1.3.0
3147 side-channel: ^1.0.3
3148 which-boxed-primitive: ^1.0.1
3149 which-collection: ^1.0.1
3150 which-typed-array: ^1.1.2
3151 checksum: 2bb7332badf589b540184d25098acac750e30fe11c8dce4523d03fc5db15f46881a0105e6bf0b64bb0c57213a95ed964029ff0259026ad6f7f9e0019f8200de5
3152 languageName: node
3153 linkType: hard
3154
3116"deep-equal@npm:~0.0.0": 3155"deep-equal@npm:~0.0.0":
3117 version: 0.0.0 3156 version: 0.0.0
3118 resolution: "deep-equal@npm:0.0.0" 3157 resolution: "deep-equal@npm:0.0.0"
@@ -3508,7 +3547,7 @@ __metadata:
3508 languageName: node 3547 languageName: node
3509 linkType: hard 3548 linkType: hard
3510 3549
3511"es-abstract@npm:^1.19.0, es-abstract@npm:^1.19.1": 3550"es-abstract@npm:^1.18.5, es-abstract@npm:^1.19.0, es-abstract@npm:^1.19.1":
3512 version: 1.19.1 3551 version: 1.19.1
3513 resolution: "es-abstract@npm:1.19.1" 3552 resolution: "es-abstract@npm:1.19.1"
3514 dependencies: 3553 dependencies:
@@ -3536,6 +3575,22 @@ __metadata:
3536 languageName: node 3575 languageName: node
3537 linkType: hard 3576 linkType: hard
3538 3577
3578"es-get-iterator@npm:^1.1.1":
3579 version: 1.1.2
3580 resolution: "es-get-iterator@npm:1.1.2"
3581 dependencies:
3582 call-bind: ^1.0.2
3583 get-intrinsic: ^1.1.0
3584 has-symbols: ^1.0.1
3585 is-arguments: ^1.1.0
3586 is-map: ^2.0.2
3587 is-set: ^2.0.2
3588 is-string: ^1.0.5
3589 isarray: ^2.0.5
3590 checksum: f75e66acb6a45686fa08b3ade9c9421a70d36a0c43ed4363e67f4d7aab2226cb73dd977cb48abbaf75721b946d3cd810682fcf310c7ad0867802fbf929b17dcf
3591 languageName: node
3592 linkType: hard
3593
3539"es-to-primitive@npm:^1.2.1": 3594"es-to-primitive@npm:^1.2.1":
3540 version: 1.2.1 3595 version: 1.2.1
3541 resolution: "es-to-primitive@npm:1.2.1" 3596 resolution: "es-to-primitive@npm:1.2.1"
@@ -4587,6 +4642,13 @@ __metadata:
4587 languageName: node 4642 languageName: node
4588 linkType: hard 4643 linkType: hard
4589 4644
4645"foreach@npm:^2.0.5":
4646 version: 2.0.5
4647 resolution: "foreach@npm:2.0.5"
4648 checksum: dab4fbfef0b40b69ee5eab81bcb9626b8fa8b3469c8cfa26480f3e5e1ee08c40eae07048c9a967c65aeda26e774511ccc70b3f10a604c01753c6ef24361f0fc8
4649 languageName: node
4650 linkType: hard
4651
4590"form-data@npm:^3.0.0": 4652"form-data@npm:^3.0.0":
4591 version: 3.0.1 4653 version: 3.0.1
4592 resolution: "form-data@npm:3.0.1" 4654 resolution: "form-data@npm:3.0.1"
@@ -4723,7 +4785,7 @@ __metadata:
4723 languageName: node 4785 languageName: node
4724 linkType: hard 4786 linkType: hard
4725 4787
4726"get-intrinsic@npm:^1.0.2, get-intrinsic@npm:^1.1.0, get-intrinsic@npm:^1.1.1": 4788"get-intrinsic@npm:^1.0.1, get-intrinsic@npm:^1.0.2, get-intrinsic@npm:^1.1.0, get-intrinsic@npm:^1.1.1":
4727 version: 1.1.1 4789 version: 1.1.1
4728 resolution: "get-intrinsic@npm:1.1.1" 4790 resolution: "get-intrinsic@npm:1.1.1"
4729 dependencies: 4791 dependencies:
@@ -5259,6 +5321,16 @@ __metadata:
5259 languageName: node 5321 languageName: node
5260 linkType: hard 5322 linkType: hard
5261 5323
5324"is-arguments@npm:^1.0.4, is-arguments@npm:^1.1.0":
5325 version: 1.1.1
5326 resolution: "is-arguments@npm:1.1.1"
5327 dependencies:
5328 call-bind: ^1.0.2
5329 has-tostringtag: ^1.0.0
5330 checksum: 7f02700ec2171b691ef3e4d0e3e6c0ba408e8434368504bb593d0d7c891c0dbfda6d19d30808b904a6cb1929bca648c061ba438c39f296c2a8ca083229c49f27
5331 languageName: node
5332 linkType: hard
5333
5262"is-arrayish@npm:^0.2.1": 5334"is-arrayish@npm:^0.2.1":
5263 version: 0.2.1 5335 version: 0.2.1
5264 resolution: "is-arrayish@npm:0.2.1" 5336 resolution: "is-arrayish@npm:0.2.1"
@@ -5341,7 +5413,7 @@ __metadata:
5341 languageName: node 5413 languageName: node
5342 linkType: hard 5414 linkType: hard
5343 5415
5344"is-date-object@npm:^1.0.1": 5416"is-date-object@npm:^1.0.1, is-date-object@npm:^1.0.2":
5345 version: 1.0.5 5417 version: 1.0.5
5346 resolution: "is-date-object@npm:1.0.5" 5418 resolution: "is-date-object@npm:1.0.5"
5347 dependencies: 5419 dependencies:
@@ -5397,6 +5469,13 @@ __metadata:
5397 languageName: node 5469 languageName: node
5398 linkType: hard 5470 linkType: hard
5399 5471
5472"is-map@npm:^2.0.1, is-map@npm:^2.0.2":
5473 version: 2.0.2
5474 resolution: "is-map@npm:2.0.2"
5475 checksum: ace3d0ecd667bbdefdb1852de601268f67f2db725624b1958f279316e13fecb8fa7df91fd60f690d7417b4ec180712f5a7ee967008e27c65cfd475cc84337728
5476 languageName: node
5477 linkType: hard
5478
5400"is-negative-zero@npm:^2.0.1": 5479"is-negative-zero@npm:^2.0.1":
5401 version: 2.0.2 5480 version: 2.0.2
5402 resolution: "is-negative-zero@npm:2.0.2" 5481 resolution: "is-negative-zero@npm:2.0.2"
@@ -5448,7 +5527,7 @@ __metadata:
5448 languageName: node 5527 languageName: node
5449 linkType: hard 5528 linkType: hard
5450 5529
5451"is-regex@npm:^1.1.4": 5530"is-regex@npm:^1.1.1, is-regex@npm:^1.1.4":
5452 version: 1.1.4 5531 version: 1.1.4
5453 resolution: "is-regex@npm:1.1.4" 5532 resolution: "is-regex@npm:1.1.4"
5454 dependencies: 5533 dependencies:
@@ -5458,6 +5537,13 @@ __metadata:
5458 languageName: node 5537 languageName: node
5459 linkType: hard 5538 linkType: hard
5460 5539
5540"is-set@npm:^2.0.1, is-set@npm:^2.0.2":
5541 version: 2.0.2
5542 resolution: "is-set@npm:2.0.2"
5543 checksum: b64343faf45e9387b97a6fd32be632ee7b269bd8183701f3b3f5b71a7cf00d04450ed8669d0bd08753e08b968beda96fca73a10fd0ff56a32603f64deba55a57
5544 languageName: node
5545 linkType: hard
5546
5461"is-shared-array-buffer@npm:^1.0.1": 5547"is-shared-array-buffer@npm:^1.0.1":
5462 version: 1.0.1 5548 version: 1.0.1
5463 resolution: "is-shared-array-buffer@npm:1.0.1" 5549 resolution: "is-shared-array-buffer@npm:1.0.1"
@@ -5490,6 +5576,19 @@ __metadata:
5490 languageName: node 5576 languageName: node
5491 linkType: hard 5577 linkType: hard
5492 5578
5579"is-typed-array@npm:^1.1.7":
5580 version: 1.1.8
5581 resolution: "is-typed-array@npm:1.1.8"
5582 dependencies:
5583 available-typed-arrays: ^1.0.5
5584 call-bind: ^1.0.2
5585 es-abstract: ^1.18.5
5586 foreach: ^2.0.5
5587 has-tostringtag: ^1.0.0
5588 checksum: aa0f9f0716e19e2fb8aef69e69e4205479d25ace778e2339fc910948115cde4b0d9aff9d5d1e8b80f09a5664998278e05e54ad3dc9cb12cefcf86db71084ed00
5589 languageName: node
5590 linkType: hard
5591
5493"is-typedarray@npm:^1.0.0": 5592"is-typedarray@npm:^1.0.0":
5494 version: 1.0.0 5593 version: 1.0.0
5495 resolution: "is-typedarray@npm:1.0.0" 5594 resolution: "is-typedarray@npm:1.0.0"
@@ -5497,6 +5596,13 @@ __metadata:
5497 languageName: node 5596 languageName: node
5498 linkType: hard 5597 linkType: hard
5499 5598
5599"is-weakmap@npm:^2.0.1":
5600 version: 2.0.1
5601 resolution: "is-weakmap@npm:2.0.1"
5602 checksum: 1222bb7e90c32bdb949226e66d26cb7bce12e1e28e3e1b40bfa6b390ba3e08192a8664a703dff2a00a84825f4e022f9cd58c4599ff9981ab72b1d69479f4f7f6
5603 languageName: node
5604 linkType: hard
5605
5500"is-weakref@npm:^1.0.1": 5606"is-weakref@npm:^1.0.1":
5501 version: 1.0.2 5607 version: 1.0.2
5502 resolution: "is-weakref@npm:1.0.2" 5608 resolution: "is-weakref@npm:1.0.2"
@@ -5506,6 +5612,16 @@ __metadata:
5506 languageName: node 5612 languageName: node
5507 linkType: hard 5613 linkType: hard
5508 5614
5615"is-weakset@npm:^2.0.1":
5616 version: 2.0.2
5617 resolution: "is-weakset@npm:2.0.2"
5618 dependencies:
5619 call-bind: ^1.0.2
5620 get-intrinsic: ^1.1.1
5621 checksum: 5d8698d1fa599a0635d7ca85be9c26d547b317ed8fd83fc75f03efbe75d50001b5eececb1e9971de85fcde84f69ae6f8346bc92d20d55d46201d328e4c74a367
5622 languageName: node
5623 linkType: hard
5624
5509"is-yarn-global@npm:^0.3.0": 5625"is-yarn-global@npm:^0.3.0":
5510 version: 0.3.0 5626 version: 0.3.0
5511 resolution: "is-yarn-global@npm:0.3.0" 5627 resolution: "is-yarn-global@npm:0.3.0"
@@ -5513,6 +5629,13 @@ __metadata:
5513 languageName: node 5629 languageName: node
5514 linkType: hard 5630 linkType: hard
5515 5631
5632"isarray@npm:^2.0.5":
5633 version: 2.0.5
5634 resolution: "isarray@npm:2.0.5"
5635 checksum: bd5bbe4104438c4196ba58a54650116007fa0262eccef13a4c55b2e09a5b36b59f1e75b9fcc49883dd9d4953892e6fc007eef9e9155648ceea036e184b0f930a
5636 languageName: node
5637 linkType: hard
5638
5516"isarray@npm:~1.0.0": 5639"isarray@npm:~1.0.0":
5517 version: 1.0.0 5640 version: 1.0.0
5518 resolution: "isarray@npm:1.0.0" 5641 resolution: "isarray@npm:1.0.0"
@@ -7002,6 +7125,16 @@ __metadata:
7002 languageName: node 7125 languageName: node
7003 linkType: hard 7126 linkType: hard
7004 7127
7128"object-is@npm:^1.1.4":
7129 version: 1.1.5
7130 resolution: "object-is@npm:1.1.5"
7131 dependencies:
7132 call-bind: ^1.0.2
7133 define-properties: ^1.1.3
7134 checksum: 989b18c4cba258a6b74dc1d74a41805c1a1425bce29f6cabb50dcb1a6a651ea9104a1b07046739a49a5bb1bc49727bcb00efd5c55f932f6ea04ec8927a7901fe
7135 languageName: node
7136 linkType: hard
7137
7005"object-keys@npm:^1.0.12, object-keys@npm:^1.1.1": 7138"object-keys@npm:^1.0.12, object-keys@npm:^1.1.1":
7006 version: 1.1.1 7139 version: 1.1.1
7007 resolution: "object-keys@npm:1.1.1" 7140 resolution: "object-keys@npm:1.1.1"
@@ -7703,7 +7836,7 @@ __metadata:
7703 languageName: node 7836 languageName: node
7704 linkType: hard 7837 linkType: hard
7705 7838
7706"regexp.prototype.flags@npm:^1.3.1": 7839"regexp.prototype.flags@npm:^1.3.0, regexp.prototype.flags@npm:^1.3.1":
7707 version: 1.3.1 7840 version: 1.3.1
7708 resolution: "regexp.prototype.flags@npm:1.3.1" 7841 resolution: "regexp.prototype.flags@npm:1.3.1"
7709 dependencies: 7842 dependencies:
@@ -8099,7 +8232,7 @@ __metadata:
8099 languageName: node 8232 languageName: node
8100 linkType: hard 8233 linkType: hard
8101 8234
8102"side-channel@npm:^1.0.4": 8235"side-channel@npm:^1.0.3, side-channel@npm:^1.0.4":
8103 version: 1.0.4 8236 version: 1.0.4
8104 resolution: "side-channel@npm:1.0.4" 8237 resolution: "side-channel@npm:1.0.4"
8105 dependencies: 8238 dependencies:
@@ -9176,7 +9309,7 @@ __metadata:
9176 languageName: node 9309 languageName: node
9177 linkType: hard 9310 linkType: hard
9178 9311
9179"which-boxed-primitive@npm:^1.0.2": 9312"which-boxed-primitive@npm:^1.0.1, which-boxed-primitive@npm:^1.0.2":
9180 version: 1.0.2 9313 version: 1.0.2
9181 resolution: "which-boxed-primitive@npm:1.0.2" 9314 resolution: "which-boxed-primitive@npm:1.0.2"
9182 dependencies: 9315 dependencies:
@@ -9189,6 +9322,32 @@ __metadata:
9189 languageName: node 9322 languageName: node
9190 linkType: hard 9323 linkType: hard
9191 9324
9325"which-collection@npm:^1.0.1":
9326 version: 1.0.1
9327 resolution: "which-collection@npm:1.0.1"
9328 dependencies:
9329 is-map: ^2.0.1
9330 is-set: ^2.0.1
9331 is-weakmap: ^2.0.1
9332 is-weakset: ^2.0.1
9333 checksum: c815bbd163107ef9cb84f135e6f34453eaf4cca994e7ba85ddb0d27cea724c623fae2a473ceccfd5549c53cc65a5d82692de418166df3f858e1e5dc60818581c
9334 languageName: node
9335 linkType: hard
9336
9337"which-typed-array@npm:^1.1.2":
9338 version: 1.1.7
9339 resolution: "which-typed-array@npm:1.1.7"
9340 dependencies:
9341 available-typed-arrays: ^1.0.5
9342 call-bind: ^1.0.2
9343 es-abstract: ^1.18.5
9344 foreach: ^2.0.5
9345 has-tostringtag: ^1.0.0
9346 is-typed-array: ^1.1.7
9347 checksum: 147837cf5866e36b6b2e427731709e02f79f1578477cbde68ed773a5307520a6cb6836c73c79c30690a473266ee59010b83b6d9b25d8d677a40ff77fb37a8a84
9348 languageName: node
9349 linkType: hard
9350
9192"which@npm:^2.0.1, which@npm:^2.0.2": 9351"which@npm:^2.0.1, which@npm:^2.0.2":
9193 version: 2.0.2 9352 version: 2.0.2
9194 resolution: "which@npm:2.0.2" 9353 resolution: "which@npm:2.0.2"