From 14e4ca70b438dd3eaaa404bc0ca31d22a62b45be Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Karol=20S=C3=B3jko?= Date: Wed, 6 Jul 2022 10:36:32 +0200 Subject: [PATCH] feat: add analytics package --- .pnp.cjs | 581 +++++++++--------- ...lytics-npm-1.6.0-39bec110e3-6a5e861526.zip | Bin 18606 -> 0 bytes packages/analytics/.eslintignore | 1 + packages/analytics/.eslintrc | 6 + packages/analytics/CHANGELOG.md | 86 +++ packages/analytics/jest.config.js | 11 + packages/analytics/linter.tsconfig.json | 4 + packages/analytics/package.json | 39 ++ .../src/Domain/Analytics/AnalyticsActivity.ts | 6 + .../Analytics/AnalyticsStoreInterface.ts | 10 + .../Statistics/StatisticsStoreInterface.ts | 8 + packages/analytics/src/Domain/Time/Period.ts | 10 + .../Domain/Time/PeriodKeyGenerator.spec.ts | 58 ++ .../src/Domain/Time/PeriodKeyGenerator.ts | 99 +++ .../Time/PeriodKeyGeneratorInterface.ts | 5 + packages/analytics/src/Domain/index.ts | 6 + .../Infra/Redis/RedisAnalyticsStore.spec.ts | 131 ++++ .../src/Infra/Redis/RedisAnalyticsStore.ts | 84 +++ .../Infra/Redis/RedisStatisticsStore.spec.ts | 92 +++ .../src/Infra/Redis/RedisStatisticsStore.ts | 99 +++ packages/analytics/src/Infra/index.ts | 2 + packages/analytics/src/index.ts | 2 + packages/analytics/tsconfig.json | 11 + packages/api-gateway/package.json | 2 +- packages/auth/package.json | 2 +- packages/domain-events/.eslintignore | 1 - packages/syncing-server/package.json | 2 +- tsconfig.json | 13 +- yarn.lock | 26 +- 29 files changed, 1095 insertions(+), 302 deletions(-) delete mode 100644 .yarn/cache/@standardnotes-analytics-npm-1.6.0-39bec110e3-6a5e861526.zip create mode 100644 packages/analytics/.eslintignore create mode 100644 packages/analytics/.eslintrc create mode 100644 packages/analytics/CHANGELOG.md create mode 100644 packages/analytics/jest.config.js create mode 100644 packages/analytics/linter.tsconfig.json create mode 100644 packages/analytics/package.json create mode 100644 packages/analytics/src/Domain/Analytics/AnalyticsActivity.ts create mode 100644 packages/analytics/src/Domain/Analytics/AnalyticsStoreInterface.ts create mode 100644 packages/analytics/src/Domain/Statistics/StatisticsStoreInterface.ts create mode 100644 packages/analytics/src/Domain/Time/Period.ts create mode 100644 packages/analytics/src/Domain/Time/PeriodKeyGenerator.spec.ts create mode 100644 packages/analytics/src/Domain/Time/PeriodKeyGenerator.ts create mode 100644 packages/analytics/src/Domain/Time/PeriodKeyGeneratorInterface.ts create mode 100644 packages/analytics/src/Domain/index.ts create mode 100644 packages/analytics/src/Infra/Redis/RedisAnalyticsStore.spec.ts create mode 100644 packages/analytics/src/Infra/Redis/RedisAnalyticsStore.ts create mode 100644 packages/analytics/src/Infra/Redis/RedisStatisticsStore.spec.ts create mode 100644 packages/analytics/src/Infra/Redis/RedisStatisticsStore.ts create mode 100644 packages/analytics/src/Infra/index.ts create mode 100644 packages/analytics/src/index.ts create mode 100644 packages/analytics/tsconfig.json diff --git a/.pnp.cjs b/.pnp.cjs index cd2f7a622..0c7d3e892 100755 --- a/.pnp.cjs +++ b/.pnp.cjs @@ -20,6 +20,10 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { "name": "@standardnotes/server-monorepo",\ "reference": "workspace:."\ },\ + {\ + "name": "@standardnotes/analytics",\ + "reference": "workspace:packages/analytics"\ + },\ {\ "name": "@standardnotes/api-gateway",\ "reference": "workspace:packages/api-gateway"\ @@ -52,6 +56,7 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { "enableTopLevelFallback": true,\ "ignorePatternData": "(^(?:\\\\.yarn\\\\/sdks(?:\\\\/(?!\\\\.{1,2}(?:\\\\/|$))(?:(?:(?!(?:^|\\\\/)\\\\.{1,2}(?:\\\\/|$)).)*?)|$))$)",\ "fallbackExclusionList": [\ + ["@standardnotes/analytics", ["workspace:packages/analytics"]],\ ["@standardnotes/api-gateway", ["workspace:packages/api-gateway"]],\ ["@standardnotes/auth-server", ["workspace:packages/auth"]],\ ["@standardnotes/domain-events", ["workspace:packages/domain-events"]],\ @@ -328,10 +333,10 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { ],\ "linkType": "SOFT"\ }],\ - ["virtual:3f0e0a85921a62029800b8f2c0f068fe72af12d4635dd7e42d2f1f4eee00103f9e9c5d6e857f4ff71f9c7aacc15b0efe7ccc00ddaa7e0948bf528cb1f61ef86c#npm:7.8.4", {\ - "packageLocation": "./.yarn/__virtual__/@babel-plugin-syntax-async-generators-virtual-72a6df5c65/0/cache/@babel-plugin-syntax-async-generators-npm-7.8.4-d10cf993c9-7ed1c1d9b9.zip/node_modules/@babel/plugin-syntax-async-generators/",\ + ["virtual:5c57728fdafd275fbceb3333cd469b7d71caf5fff87ea726fbfb2e82fced070ef689d0532e794e122b27fd916e42ed309a23709515b5ddb5c12cd35d573e0609#npm:7.8.4", {\ + "packageLocation": "./.yarn/__virtual__/@babel-plugin-syntax-async-generators-virtual-c51632284e/0/cache/@babel-plugin-syntax-async-generators-npm-7.8.4-d10cf993c9-7ed1c1d9b9.zip/node_modules/@babel/plugin-syntax-async-generators/",\ "packageDependencies": [\ - ["@babel/plugin-syntax-async-generators", "virtual:3f0e0a85921a62029800b8f2c0f068fe72af12d4635dd7e42d2f1f4eee00103f9e9c5d6e857f4ff71f9c7aacc15b0efe7ccc00ddaa7e0948bf528cb1f61ef86c#npm:7.8.4"],\ + ["@babel/plugin-syntax-async-generators", "virtual:5c57728fdafd275fbceb3333cd469b7d71caf5fff87ea726fbfb2e82fced070ef689d0532e794e122b27fd916e42ed309a23709515b5ddb5c12cd35d573e0609#npm:7.8.4"],\ ["@babel/core", "npm:7.18.6"],\ ["@babel/helper-plugin-utils", "npm:7.18.6"],\ ["@types/babel__core", "npm:7.1.19"]\ @@ -342,10 +347,10 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { ],\ "linkType": "HARD"\ }],\ - ["virtual:88e8afac1808a7ea0495137247f12972bf8ff63736df3d967463d45fc3283fee7228e733a51043455f37a32513ebc5254c7a990a2e48a581ba95e0dd0bee457b#npm:7.8.4", {\ - "packageLocation": "./.yarn/__virtual__/@babel-plugin-syntax-async-generators-virtual-70d6c54d98/0/cache/@babel-plugin-syntax-async-generators-npm-7.8.4-d10cf993c9-7ed1c1d9b9.zip/node_modules/@babel/plugin-syntax-async-generators/",\ + ["virtual:f9e5bbd48d4bfce3eb2c606acdcf754dc03f5e4ad4e0894f8faaf348a4b861acc4da61e0b37c65344963f14a484562b8e56b144ad7908e3cad8464f1ba78f5fa#npm:7.8.4", {\ + "packageLocation": "./.yarn/__virtual__/@babel-plugin-syntax-async-generators-virtual-64c2ce1092/0/cache/@babel-plugin-syntax-async-generators-npm-7.8.4-d10cf993c9-7ed1c1d9b9.zip/node_modules/@babel/plugin-syntax-async-generators/",\ "packageDependencies": [\ - ["@babel/plugin-syntax-async-generators", "virtual:88e8afac1808a7ea0495137247f12972bf8ff63736df3d967463d45fc3283fee7228e733a51043455f37a32513ebc5254c7a990a2e48a581ba95e0dd0bee457b#npm:7.8.4"],\ + ["@babel/plugin-syntax-async-generators", "virtual:f9e5bbd48d4bfce3eb2c606acdcf754dc03f5e4ad4e0894f8faaf348a4b861acc4da61e0b37c65344963f14a484562b8e56b144ad7908e3cad8464f1ba78f5fa#npm:7.8.4"],\ ["@babel/core", "npm:7.18.6"],\ ["@babel/helper-plugin-utils", "npm:7.18.6"],\ ["@types/babel__core", null]\ @@ -365,10 +370,10 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { ],\ "linkType": "SOFT"\ }],\ - ["virtual:3f0e0a85921a62029800b8f2c0f068fe72af12d4635dd7e42d2f1f4eee00103f9e9c5d6e857f4ff71f9c7aacc15b0efe7ccc00ddaa7e0948bf528cb1f61ef86c#npm:7.8.3", {\ - "packageLocation": "./.yarn/__virtual__/@babel-plugin-syntax-bigint-virtual-2532af29ed/0/cache/@babel-plugin-syntax-bigint-npm-7.8.3-b05d971e6c-3a10849d83.zip/node_modules/@babel/plugin-syntax-bigint/",\ + ["virtual:5c57728fdafd275fbceb3333cd469b7d71caf5fff87ea726fbfb2e82fced070ef689d0532e794e122b27fd916e42ed309a23709515b5ddb5c12cd35d573e0609#npm:7.8.3", {\ + "packageLocation": "./.yarn/__virtual__/@babel-plugin-syntax-bigint-virtual-366a701d76/0/cache/@babel-plugin-syntax-bigint-npm-7.8.3-b05d971e6c-3a10849d83.zip/node_modules/@babel/plugin-syntax-bigint/",\ "packageDependencies": [\ - ["@babel/plugin-syntax-bigint", "virtual:3f0e0a85921a62029800b8f2c0f068fe72af12d4635dd7e42d2f1f4eee00103f9e9c5d6e857f4ff71f9c7aacc15b0efe7ccc00ddaa7e0948bf528cb1f61ef86c#npm:7.8.3"],\ + ["@babel/plugin-syntax-bigint", "virtual:5c57728fdafd275fbceb3333cd469b7d71caf5fff87ea726fbfb2e82fced070ef689d0532e794e122b27fd916e42ed309a23709515b5ddb5c12cd35d573e0609#npm:7.8.3"],\ ["@babel/core", "npm:7.18.6"],\ ["@babel/helper-plugin-utils", "npm:7.18.6"],\ ["@types/babel__core", "npm:7.1.19"]\ @@ -379,10 +384,10 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { ],\ "linkType": "HARD"\ }],\ - ["virtual:88e8afac1808a7ea0495137247f12972bf8ff63736df3d967463d45fc3283fee7228e733a51043455f37a32513ebc5254c7a990a2e48a581ba95e0dd0bee457b#npm:7.8.3", {\ - "packageLocation": "./.yarn/__virtual__/@babel-plugin-syntax-bigint-virtual-9cd9d7baa2/0/cache/@babel-plugin-syntax-bigint-npm-7.8.3-b05d971e6c-3a10849d83.zip/node_modules/@babel/plugin-syntax-bigint/",\ + ["virtual:f9e5bbd48d4bfce3eb2c606acdcf754dc03f5e4ad4e0894f8faaf348a4b861acc4da61e0b37c65344963f14a484562b8e56b144ad7908e3cad8464f1ba78f5fa#npm:7.8.3", {\ + "packageLocation": "./.yarn/__virtual__/@babel-plugin-syntax-bigint-virtual-7a8106d071/0/cache/@babel-plugin-syntax-bigint-npm-7.8.3-b05d971e6c-3a10849d83.zip/node_modules/@babel/plugin-syntax-bigint/",\ "packageDependencies": [\ - ["@babel/plugin-syntax-bigint", "virtual:88e8afac1808a7ea0495137247f12972bf8ff63736df3d967463d45fc3283fee7228e733a51043455f37a32513ebc5254c7a990a2e48a581ba95e0dd0bee457b#npm:7.8.3"],\ + ["@babel/plugin-syntax-bigint", "virtual:f9e5bbd48d4bfce3eb2c606acdcf754dc03f5e4ad4e0894f8faaf348a4b861acc4da61e0b37c65344963f14a484562b8e56b144ad7908e3cad8464f1ba78f5fa#npm:7.8.3"],\ ["@babel/core", "npm:7.18.6"],\ ["@babel/helper-plugin-utils", "npm:7.18.6"],\ ["@types/babel__core", null]\ @@ -402,10 +407,10 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { ],\ "linkType": "SOFT"\ }],\ - ["virtual:3f0e0a85921a62029800b8f2c0f068fe72af12d4635dd7e42d2f1f4eee00103f9e9c5d6e857f4ff71f9c7aacc15b0efe7ccc00ddaa7e0948bf528cb1f61ef86c#npm:7.12.13", {\ - "packageLocation": "./.yarn/__virtual__/@babel-plugin-syntax-class-properties-virtual-0c572e7e0c/0/cache/@babel-plugin-syntax-class-properties-npm-7.12.13-002ee9d930-24f34b196d.zip/node_modules/@babel/plugin-syntax-class-properties/",\ + ["virtual:5c57728fdafd275fbceb3333cd469b7d71caf5fff87ea726fbfb2e82fced070ef689d0532e794e122b27fd916e42ed309a23709515b5ddb5c12cd35d573e0609#npm:7.12.13", {\ + "packageLocation": "./.yarn/__virtual__/@babel-plugin-syntax-class-properties-virtual-bf1f73d7df/0/cache/@babel-plugin-syntax-class-properties-npm-7.12.13-002ee9d930-24f34b196d.zip/node_modules/@babel/plugin-syntax-class-properties/",\ "packageDependencies": [\ - ["@babel/plugin-syntax-class-properties", "virtual:3f0e0a85921a62029800b8f2c0f068fe72af12d4635dd7e42d2f1f4eee00103f9e9c5d6e857f4ff71f9c7aacc15b0efe7ccc00ddaa7e0948bf528cb1f61ef86c#npm:7.12.13"],\ + ["@babel/plugin-syntax-class-properties", "virtual:5c57728fdafd275fbceb3333cd469b7d71caf5fff87ea726fbfb2e82fced070ef689d0532e794e122b27fd916e42ed309a23709515b5ddb5c12cd35d573e0609#npm:7.12.13"],\ ["@babel/core", "npm:7.18.6"],\ ["@babel/helper-plugin-utils", "npm:7.18.6"],\ ["@types/babel__core", "npm:7.1.19"]\ @@ -416,10 +421,10 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { ],\ "linkType": "HARD"\ }],\ - ["virtual:88e8afac1808a7ea0495137247f12972bf8ff63736df3d967463d45fc3283fee7228e733a51043455f37a32513ebc5254c7a990a2e48a581ba95e0dd0bee457b#npm:7.12.13", {\ - "packageLocation": "./.yarn/__virtual__/@babel-plugin-syntax-class-properties-virtual-2864cc598e/0/cache/@babel-plugin-syntax-class-properties-npm-7.12.13-002ee9d930-24f34b196d.zip/node_modules/@babel/plugin-syntax-class-properties/",\ + ["virtual:f9e5bbd48d4bfce3eb2c606acdcf754dc03f5e4ad4e0894f8faaf348a4b861acc4da61e0b37c65344963f14a484562b8e56b144ad7908e3cad8464f1ba78f5fa#npm:7.12.13", {\ + "packageLocation": "./.yarn/__virtual__/@babel-plugin-syntax-class-properties-virtual-e0ae681c8b/0/cache/@babel-plugin-syntax-class-properties-npm-7.12.13-002ee9d930-24f34b196d.zip/node_modules/@babel/plugin-syntax-class-properties/",\ "packageDependencies": [\ - ["@babel/plugin-syntax-class-properties", "virtual:88e8afac1808a7ea0495137247f12972bf8ff63736df3d967463d45fc3283fee7228e733a51043455f37a32513ebc5254c7a990a2e48a581ba95e0dd0bee457b#npm:7.12.13"],\ + ["@babel/plugin-syntax-class-properties", "virtual:f9e5bbd48d4bfce3eb2c606acdcf754dc03f5e4ad4e0894f8faaf348a4b861acc4da61e0b37c65344963f14a484562b8e56b144ad7908e3cad8464f1ba78f5fa#npm:7.12.13"],\ ["@babel/core", "npm:7.18.6"],\ ["@babel/helper-plugin-utils", "npm:7.18.6"],\ ["@types/babel__core", null]\ @@ -439,10 +444,10 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { ],\ "linkType": "SOFT"\ }],\ - ["virtual:3f0e0a85921a62029800b8f2c0f068fe72af12d4635dd7e42d2f1f4eee00103f9e9c5d6e857f4ff71f9c7aacc15b0efe7ccc00ddaa7e0948bf528cb1f61ef86c#npm:7.10.4", {\ - "packageLocation": "./.yarn/__virtual__/@babel-plugin-syntax-import-meta-virtual-4dc1ee2bbc/0/cache/@babel-plugin-syntax-import-meta-npm-7.10.4-4a0a0158bc-166ac1125d.zip/node_modules/@babel/plugin-syntax-import-meta/",\ + ["virtual:5c57728fdafd275fbceb3333cd469b7d71caf5fff87ea726fbfb2e82fced070ef689d0532e794e122b27fd916e42ed309a23709515b5ddb5c12cd35d573e0609#npm:7.10.4", {\ + "packageLocation": "./.yarn/__virtual__/@babel-plugin-syntax-import-meta-virtual-a706468d6a/0/cache/@babel-plugin-syntax-import-meta-npm-7.10.4-4a0a0158bc-166ac1125d.zip/node_modules/@babel/plugin-syntax-import-meta/",\ "packageDependencies": [\ - ["@babel/plugin-syntax-import-meta", "virtual:3f0e0a85921a62029800b8f2c0f068fe72af12d4635dd7e42d2f1f4eee00103f9e9c5d6e857f4ff71f9c7aacc15b0efe7ccc00ddaa7e0948bf528cb1f61ef86c#npm:7.10.4"],\ + ["@babel/plugin-syntax-import-meta", "virtual:5c57728fdafd275fbceb3333cd469b7d71caf5fff87ea726fbfb2e82fced070ef689d0532e794e122b27fd916e42ed309a23709515b5ddb5c12cd35d573e0609#npm:7.10.4"],\ ["@babel/core", "npm:7.18.6"],\ ["@babel/helper-plugin-utils", "npm:7.18.6"],\ ["@types/babel__core", "npm:7.1.19"]\ @@ -453,10 +458,10 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { ],\ "linkType": "HARD"\ }],\ - ["virtual:88e8afac1808a7ea0495137247f12972bf8ff63736df3d967463d45fc3283fee7228e733a51043455f37a32513ebc5254c7a990a2e48a581ba95e0dd0bee457b#npm:7.10.4", {\ - "packageLocation": "./.yarn/__virtual__/@babel-plugin-syntax-import-meta-virtual-dc7ad4e60a/0/cache/@babel-plugin-syntax-import-meta-npm-7.10.4-4a0a0158bc-166ac1125d.zip/node_modules/@babel/plugin-syntax-import-meta/",\ + ["virtual:f9e5bbd48d4bfce3eb2c606acdcf754dc03f5e4ad4e0894f8faaf348a4b861acc4da61e0b37c65344963f14a484562b8e56b144ad7908e3cad8464f1ba78f5fa#npm:7.10.4", {\ + "packageLocation": "./.yarn/__virtual__/@babel-plugin-syntax-import-meta-virtual-2241cefcc1/0/cache/@babel-plugin-syntax-import-meta-npm-7.10.4-4a0a0158bc-166ac1125d.zip/node_modules/@babel/plugin-syntax-import-meta/",\ "packageDependencies": [\ - ["@babel/plugin-syntax-import-meta", "virtual:88e8afac1808a7ea0495137247f12972bf8ff63736df3d967463d45fc3283fee7228e733a51043455f37a32513ebc5254c7a990a2e48a581ba95e0dd0bee457b#npm:7.10.4"],\ + ["@babel/plugin-syntax-import-meta", "virtual:f9e5bbd48d4bfce3eb2c606acdcf754dc03f5e4ad4e0894f8faaf348a4b861acc4da61e0b37c65344963f14a484562b8e56b144ad7908e3cad8464f1ba78f5fa#npm:7.10.4"],\ ["@babel/core", "npm:7.18.6"],\ ["@babel/helper-plugin-utils", "npm:7.18.6"],\ ["@types/babel__core", null]\ @@ -476,10 +481,10 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { ],\ "linkType": "SOFT"\ }],\ - ["virtual:3f0e0a85921a62029800b8f2c0f068fe72af12d4635dd7e42d2f1f4eee00103f9e9c5d6e857f4ff71f9c7aacc15b0efe7ccc00ddaa7e0948bf528cb1f61ef86c#npm:7.8.3", {\ - "packageLocation": "./.yarn/__virtual__/@babel-plugin-syntax-json-strings-virtual-d129fa84f5/0/cache/@babel-plugin-syntax-json-strings-npm-7.8.3-6dc7848179-bf5aea1f31.zip/node_modules/@babel/plugin-syntax-json-strings/",\ + ["virtual:5c57728fdafd275fbceb3333cd469b7d71caf5fff87ea726fbfb2e82fced070ef689d0532e794e122b27fd916e42ed309a23709515b5ddb5c12cd35d573e0609#npm:7.8.3", {\ + "packageLocation": "./.yarn/__virtual__/@babel-plugin-syntax-json-strings-virtual-a40ac93075/0/cache/@babel-plugin-syntax-json-strings-npm-7.8.3-6dc7848179-bf5aea1f31.zip/node_modules/@babel/plugin-syntax-json-strings/",\ "packageDependencies": [\ - ["@babel/plugin-syntax-json-strings", "virtual:3f0e0a85921a62029800b8f2c0f068fe72af12d4635dd7e42d2f1f4eee00103f9e9c5d6e857f4ff71f9c7aacc15b0efe7ccc00ddaa7e0948bf528cb1f61ef86c#npm:7.8.3"],\ + ["@babel/plugin-syntax-json-strings", "virtual:5c57728fdafd275fbceb3333cd469b7d71caf5fff87ea726fbfb2e82fced070ef689d0532e794e122b27fd916e42ed309a23709515b5ddb5c12cd35d573e0609#npm:7.8.3"],\ ["@babel/core", "npm:7.18.6"],\ ["@babel/helper-plugin-utils", "npm:7.18.6"],\ ["@types/babel__core", "npm:7.1.19"]\ @@ -490,10 +495,10 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { ],\ "linkType": "HARD"\ }],\ - ["virtual:88e8afac1808a7ea0495137247f12972bf8ff63736df3d967463d45fc3283fee7228e733a51043455f37a32513ebc5254c7a990a2e48a581ba95e0dd0bee457b#npm:7.8.3", {\ - "packageLocation": "./.yarn/__virtual__/@babel-plugin-syntax-json-strings-virtual-101be89b6d/0/cache/@babel-plugin-syntax-json-strings-npm-7.8.3-6dc7848179-bf5aea1f31.zip/node_modules/@babel/plugin-syntax-json-strings/",\ + ["virtual:f9e5bbd48d4bfce3eb2c606acdcf754dc03f5e4ad4e0894f8faaf348a4b861acc4da61e0b37c65344963f14a484562b8e56b144ad7908e3cad8464f1ba78f5fa#npm:7.8.3", {\ + "packageLocation": "./.yarn/__virtual__/@babel-plugin-syntax-json-strings-virtual-61ba4040b6/0/cache/@babel-plugin-syntax-json-strings-npm-7.8.3-6dc7848179-bf5aea1f31.zip/node_modules/@babel/plugin-syntax-json-strings/",\ "packageDependencies": [\ - ["@babel/plugin-syntax-json-strings", "virtual:88e8afac1808a7ea0495137247f12972bf8ff63736df3d967463d45fc3283fee7228e733a51043455f37a32513ebc5254c7a990a2e48a581ba95e0dd0bee457b#npm:7.8.3"],\ + ["@babel/plugin-syntax-json-strings", "virtual:f9e5bbd48d4bfce3eb2c606acdcf754dc03f5e4ad4e0894f8faaf348a4b861acc4da61e0b37c65344963f14a484562b8e56b144ad7908e3cad8464f1ba78f5fa#npm:7.8.3"],\ ["@babel/core", "npm:7.18.6"],\ ["@babel/helper-plugin-utils", "npm:7.18.6"],\ ["@types/babel__core", null]\ @@ -513,10 +518,10 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { ],\ "linkType": "SOFT"\ }],\ - ["virtual:3f0e0a85921a62029800b8f2c0f068fe72af12d4635dd7e42d2f1f4eee00103f9e9c5d6e857f4ff71f9c7aacc15b0efe7ccc00ddaa7e0948bf528cb1f61ef86c#npm:7.10.4", {\ - "packageLocation": "./.yarn/__virtual__/@babel-plugin-syntax-logical-assignment-operators-virtual-b65e0a3b66/0/cache/@babel-plugin-syntax-logical-assignment-operators-npm-7.10.4-72ae00fdf6-aff3357703.zip/node_modules/@babel/plugin-syntax-logical-assignment-operators/",\ + ["virtual:5c57728fdafd275fbceb3333cd469b7d71caf5fff87ea726fbfb2e82fced070ef689d0532e794e122b27fd916e42ed309a23709515b5ddb5c12cd35d573e0609#npm:7.10.4", {\ + "packageLocation": "./.yarn/__virtual__/@babel-plugin-syntax-logical-assignment-operators-virtual-2f357119bb/0/cache/@babel-plugin-syntax-logical-assignment-operators-npm-7.10.4-72ae00fdf6-aff3357703.zip/node_modules/@babel/plugin-syntax-logical-assignment-operators/",\ "packageDependencies": [\ - ["@babel/plugin-syntax-logical-assignment-operators", "virtual:3f0e0a85921a62029800b8f2c0f068fe72af12d4635dd7e42d2f1f4eee00103f9e9c5d6e857f4ff71f9c7aacc15b0efe7ccc00ddaa7e0948bf528cb1f61ef86c#npm:7.10.4"],\ + ["@babel/plugin-syntax-logical-assignment-operators", "virtual:5c57728fdafd275fbceb3333cd469b7d71caf5fff87ea726fbfb2e82fced070ef689d0532e794e122b27fd916e42ed309a23709515b5ddb5c12cd35d573e0609#npm:7.10.4"],\ ["@babel/core", "npm:7.18.6"],\ ["@babel/helper-plugin-utils", "npm:7.18.6"],\ ["@types/babel__core", "npm:7.1.19"]\ @@ -527,10 +532,10 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { ],\ "linkType": "HARD"\ }],\ - ["virtual:88e8afac1808a7ea0495137247f12972bf8ff63736df3d967463d45fc3283fee7228e733a51043455f37a32513ebc5254c7a990a2e48a581ba95e0dd0bee457b#npm:7.10.4", {\ - "packageLocation": "./.yarn/__virtual__/@babel-plugin-syntax-logical-assignment-operators-virtual-02d2218542/0/cache/@babel-plugin-syntax-logical-assignment-operators-npm-7.10.4-72ae00fdf6-aff3357703.zip/node_modules/@babel/plugin-syntax-logical-assignment-operators/",\ + ["virtual:f9e5bbd48d4bfce3eb2c606acdcf754dc03f5e4ad4e0894f8faaf348a4b861acc4da61e0b37c65344963f14a484562b8e56b144ad7908e3cad8464f1ba78f5fa#npm:7.10.4", {\ + "packageLocation": "./.yarn/__virtual__/@babel-plugin-syntax-logical-assignment-operators-virtual-c8bd14d033/0/cache/@babel-plugin-syntax-logical-assignment-operators-npm-7.10.4-72ae00fdf6-aff3357703.zip/node_modules/@babel/plugin-syntax-logical-assignment-operators/",\ "packageDependencies": [\ - ["@babel/plugin-syntax-logical-assignment-operators", "virtual:88e8afac1808a7ea0495137247f12972bf8ff63736df3d967463d45fc3283fee7228e733a51043455f37a32513ebc5254c7a990a2e48a581ba95e0dd0bee457b#npm:7.10.4"],\ + ["@babel/plugin-syntax-logical-assignment-operators", "virtual:f9e5bbd48d4bfce3eb2c606acdcf754dc03f5e4ad4e0894f8faaf348a4b861acc4da61e0b37c65344963f14a484562b8e56b144ad7908e3cad8464f1ba78f5fa#npm:7.10.4"],\ ["@babel/core", "npm:7.18.6"],\ ["@babel/helper-plugin-utils", "npm:7.18.6"],\ ["@types/babel__core", null]\ @@ -550,10 +555,10 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { ],\ "linkType": "SOFT"\ }],\ - ["virtual:3f0e0a85921a62029800b8f2c0f068fe72af12d4635dd7e42d2f1f4eee00103f9e9c5d6e857f4ff71f9c7aacc15b0efe7ccc00ddaa7e0948bf528cb1f61ef86c#npm:7.8.3", {\ - "packageLocation": "./.yarn/__virtual__/@babel-plugin-syntax-nullish-coalescing-operator-virtual-9700d96988/0/cache/@babel-plugin-syntax-nullish-coalescing-operator-npm-7.8.3-8a723173b5-87aca49189.zip/node_modules/@babel/plugin-syntax-nullish-coalescing-operator/",\ + ["virtual:5c57728fdafd275fbceb3333cd469b7d71caf5fff87ea726fbfb2e82fced070ef689d0532e794e122b27fd916e42ed309a23709515b5ddb5c12cd35d573e0609#npm:7.8.3", {\ + "packageLocation": "./.yarn/__virtual__/@babel-plugin-syntax-nullish-coalescing-operator-virtual-79ba9e2918/0/cache/@babel-plugin-syntax-nullish-coalescing-operator-npm-7.8.3-8a723173b5-87aca49189.zip/node_modules/@babel/plugin-syntax-nullish-coalescing-operator/",\ "packageDependencies": [\ - ["@babel/plugin-syntax-nullish-coalescing-operator", "virtual:3f0e0a85921a62029800b8f2c0f068fe72af12d4635dd7e42d2f1f4eee00103f9e9c5d6e857f4ff71f9c7aacc15b0efe7ccc00ddaa7e0948bf528cb1f61ef86c#npm:7.8.3"],\ + ["@babel/plugin-syntax-nullish-coalescing-operator", "virtual:5c57728fdafd275fbceb3333cd469b7d71caf5fff87ea726fbfb2e82fced070ef689d0532e794e122b27fd916e42ed309a23709515b5ddb5c12cd35d573e0609#npm:7.8.3"],\ ["@babel/core", "npm:7.18.6"],\ ["@babel/helper-plugin-utils", "npm:7.18.6"],\ ["@types/babel__core", "npm:7.1.19"]\ @@ -564,10 +569,10 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { ],\ "linkType": "HARD"\ }],\ - ["virtual:88e8afac1808a7ea0495137247f12972bf8ff63736df3d967463d45fc3283fee7228e733a51043455f37a32513ebc5254c7a990a2e48a581ba95e0dd0bee457b#npm:7.8.3", {\ - "packageLocation": "./.yarn/__virtual__/@babel-plugin-syntax-nullish-coalescing-operator-virtual-562e7cb319/0/cache/@babel-plugin-syntax-nullish-coalescing-operator-npm-7.8.3-8a723173b5-87aca49189.zip/node_modules/@babel/plugin-syntax-nullish-coalescing-operator/",\ + ["virtual:f9e5bbd48d4bfce3eb2c606acdcf754dc03f5e4ad4e0894f8faaf348a4b861acc4da61e0b37c65344963f14a484562b8e56b144ad7908e3cad8464f1ba78f5fa#npm:7.8.3", {\ + "packageLocation": "./.yarn/__virtual__/@babel-plugin-syntax-nullish-coalescing-operator-virtual-3ad8f56fe1/0/cache/@babel-plugin-syntax-nullish-coalescing-operator-npm-7.8.3-8a723173b5-87aca49189.zip/node_modules/@babel/plugin-syntax-nullish-coalescing-operator/",\ "packageDependencies": [\ - ["@babel/plugin-syntax-nullish-coalescing-operator", "virtual:88e8afac1808a7ea0495137247f12972bf8ff63736df3d967463d45fc3283fee7228e733a51043455f37a32513ebc5254c7a990a2e48a581ba95e0dd0bee457b#npm:7.8.3"],\ + ["@babel/plugin-syntax-nullish-coalescing-operator", "virtual:f9e5bbd48d4bfce3eb2c606acdcf754dc03f5e4ad4e0894f8faaf348a4b861acc4da61e0b37c65344963f14a484562b8e56b144ad7908e3cad8464f1ba78f5fa#npm:7.8.3"],\ ["@babel/core", "npm:7.18.6"],\ ["@babel/helper-plugin-utils", "npm:7.18.6"],\ ["@types/babel__core", null]\ @@ -587,10 +592,10 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { ],\ "linkType": "SOFT"\ }],\ - ["virtual:3f0e0a85921a62029800b8f2c0f068fe72af12d4635dd7e42d2f1f4eee00103f9e9c5d6e857f4ff71f9c7aacc15b0efe7ccc00ddaa7e0948bf528cb1f61ef86c#npm:7.10.4", {\ - "packageLocation": "./.yarn/__virtual__/@babel-plugin-syntax-numeric-separator-virtual-22cb427ea7/0/cache/@babel-plugin-syntax-numeric-separator-npm-7.10.4-81444be605-01ec5547bd.zip/node_modules/@babel/plugin-syntax-numeric-separator/",\ + ["virtual:5c57728fdafd275fbceb3333cd469b7d71caf5fff87ea726fbfb2e82fced070ef689d0532e794e122b27fd916e42ed309a23709515b5ddb5c12cd35d573e0609#npm:7.10.4", {\ + "packageLocation": "./.yarn/__virtual__/@babel-plugin-syntax-numeric-separator-virtual-a3b55e0774/0/cache/@babel-plugin-syntax-numeric-separator-npm-7.10.4-81444be605-01ec5547bd.zip/node_modules/@babel/plugin-syntax-numeric-separator/",\ "packageDependencies": [\ - ["@babel/plugin-syntax-numeric-separator", "virtual:3f0e0a85921a62029800b8f2c0f068fe72af12d4635dd7e42d2f1f4eee00103f9e9c5d6e857f4ff71f9c7aacc15b0efe7ccc00ddaa7e0948bf528cb1f61ef86c#npm:7.10.4"],\ + ["@babel/plugin-syntax-numeric-separator", "virtual:5c57728fdafd275fbceb3333cd469b7d71caf5fff87ea726fbfb2e82fced070ef689d0532e794e122b27fd916e42ed309a23709515b5ddb5c12cd35d573e0609#npm:7.10.4"],\ ["@babel/core", "npm:7.18.6"],\ ["@babel/helper-plugin-utils", "npm:7.18.6"],\ ["@types/babel__core", "npm:7.1.19"]\ @@ -601,10 +606,10 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { ],\ "linkType": "HARD"\ }],\ - ["virtual:88e8afac1808a7ea0495137247f12972bf8ff63736df3d967463d45fc3283fee7228e733a51043455f37a32513ebc5254c7a990a2e48a581ba95e0dd0bee457b#npm:7.10.4", {\ - "packageLocation": "./.yarn/__virtual__/@babel-plugin-syntax-numeric-separator-virtual-e25a0d576d/0/cache/@babel-plugin-syntax-numeric-separator-npm-7.10.4-81444be605-01ec5547bd.zip/node_modules/@babel/plugin-syntax-numeric-separator/",\ + ["virtual:f9e5bbd48d4bfce3eb2c606acdcf754dc03f5e4ad4e0894f8faaf348a4b861acc4da61e0b37c65344963f14a484562b8e56b144ad7908e3cad8464f1ba78f5fa#npm:7.10.4", {\ + "packageLocation": "./.yarn/__virtual__/@babel-plugin-syntax-numeric-separator-virtual-072e02f567/0/cache/@babel-plugin-syntax-numeric-separator-npm-7.10.4-81444be605-01ec5547bd.zip/node_modules/@babel/plugin-syntax-numeric-separator/",\ "packageDependencies": [\ - ["@babel/plugin-syntax-numeric-separator", "virtual:88e8afac1808a7ea0495137247f12972bf8ff63736df3d967463d45fc3283fee7228e733a51043455f37a32513ebc5254c7a990a2e48a581ba95e0dd0bee457b#npm:7.10.4"],\ + ["@babel/plugin-syntax-numeric-separator", "virtual:f9e5bbd48d4bfce3eb2c606acdcf754dc03f5e4ad4e0894f8faaf348a4b861acc4da61e0b37c65344963f14a484562b8e56b144ad7908e3cad8464f1ba78f5fa#npm:7.10.4"],\ ["@babel/core", "npm:7.18.6"],\ ["@babel/helper-plugin-utils", "npm:7.18.6"],\ ["@types/babel__core", null]\ @@ -624,10 +629,10 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { ],\ "linkType": "SOFT"\ }],\ - ["virtual:3f0e0a85921a62029800b8f2c0f068fe72af12d4635dd7e42d2f1f4eee00103f9e9c5d6e857f4ff71f9c7aacc15b0efe7ccc00ddaa7e0948bf528cb1f61ef86c#npm:7.8.3", {\ - "packageLocation": "./.yarn/__virtual__/@babel-plugin-syntax-object-rest-spread-virtual-988f4f39f7/0/cache/@babel-plugin-syntax-object-rest-spread-npm-7.8.3-60bd05b6ae-fddcf581a5.zip/node_modules/@babel/plugin-syntax-object-rest-spread/",\ + ["virtual:5c57728fdafd275fbceb3333cd469b7d71caf5fff87ea726fbfb2e82fced070ef689d0532e794e122b27fd916e42ed309a23709515b5ddb5c12cd35d573e0609#npm:7.8.3", {\ + "packageLocation": "./.yarn/__virtual__/@babel-plugin-syntax-object-rest-spread-virtual-5657375b8f/0/cache/@babel-plugin-syntax-object-rest-spread-npm-7.8.3-60bd05b6ae-fddcf581a5.zip/node_modules/@babel/plugin-syntax-object-rest-spread/",\ "packageDependencies": [\ - ["@babel/plugin-syntax-object-rest-spread", "virtual:3f0e0a85921a62029800b8f2c0f068fe72af12d4635dd7e42d2f1f4eee00103f9e9c5d6e857f4ff71f9c7aacc15b0efe7ccc00ddaa7e0948bf528cb1f61ef86c#npm:7.8.3"],\ + ["@babel/plugin-syntax-object-rest-spread", "virtual:5c57728fdafd275fbceb3333cd469b7d71caf5fff87ea726fbfb2e82fced070ef689d0532e794e122b27fd916e42ed309a23709515b5ddb5c12cd35d573e0609#npm:7.8.3"],\ ["@babel/core", "npm:7.18.6"],\ ["@babel/helper-plugin-utils", "npm:7.18.6"],\ ["@types/babel__core", "npm:7.1.19"]\ @@ -638,10 +643,10 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { ],\ "linkType": "HARD"\ }],\ - ["virtual:88e8afac1808a7ea0495137247f12972bf8ff63736df3d967463d45fc3283fee7228e733a51043455f37a32513ebc5254c7a990a2e48a581ba95e0dd0bee457b#npm:7.8.3", {\ - "packageLocation": "./.yarn/__virtual__/@babel-plugin-syntax-object-rest-spread-virtual-38ee2beb32/0/cache/@babel-plugin-syntax-object-rest-spread-npm-7.8.3-60bd05b6ae-fddcf581a5.zip/node_modules/@babel/plugin-syntax-object-rest-spread/",\ + ["virtual:f9e5bbd48d4bfce3eb2c606acdcf754dc03f5e4ad4e0894f8faaf348a4b861acc4da61e0b37c65344963f14a484562b8e56b144ad7908e3cad8464f1ba78f5fa#npm:7.8.3", {\ + "packageLocation": "./.yarn/__virtual__/@babel-plugin-syntax-object-rest-spread-virtual-ed7c8a6181/0/cache/@babel-plugin-syntax-object-rest-spread-npm-7.8.3-60bd05b6ae-fddcf581a5.zip/node_modules/@babel/plugin-syntax-object-rest-spread/",\ "packageDependencies": [\ - ["@babel/plugin-syntax-object-rest-spread", "virtual:88e8afac1808a7ea0495137247f12972bf8ff63736df3d967463d45fc3283fee7228e733a51043455f37a32513ebc5254c7a990a2e48a581ba95e0dd0bee457b#npm:7.8.3"],\ + ["@babel/plugin-syntax-object-rest-spread", "virtual:f9e5bbd48d4bfce3eb2c606acdcf754dc03f5e4ad4e0894f8faaf348a4b861acc4da61e0b37c65344963f14a484562b8e56b144ad7908e3cad8464f1ba78f5fa#npm:7.8.3"],\ ["@babel/core", "npm:7.18.6"],\ ["@babel/helper-plugin-utils", "npm:7.18.6"],\ ["@types/babel__core", null]\ @@ -661,10 +666,10 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { ],\ "linkType": "SOFT"\ }],\ - ["virtual:3f0e0a85921a62029800b8f2c0f068fe72af12d4635dd7e42d2f1f4eee00103f9e9c5d6e857f4ff71f9c7aacc15b0efe7ccc00ddaa7e0948bf528cb1f61ef86c#npm:7.8.3", {\ - "packageLocation": "./.yarn/__virtual__/@babel-plugin-syntax-optional-catch-binding-virtual-873785b45e/0/cache/@babel-plugin-syntax-optional-catch-binding-npm-7.8.3-ce337427d8-910d90e72b.zip/node_modules/@babel/plugin-syntax-optional-catch-binding/",\ + ["virtual:5c57728fdafd275fbceb3333cd469b7d71caf5fff87ea726fbfb2e82fced070ef689d0532e794e122b27fd916e42ed309a23709515b5ddb5c12cd35d573e0609#npm:7.8.3", {\ + "packageLocation": "./.yarn/__virtual__/@babel-plugin-syntax-optional-catch-binding-virtual-1fb7763fa5/0/cache/@babel-plugin-syntax-optional-catch-binding-npm-7.8.3-ce337427d8-910d90e72b.zip/node_modules/@babel/plugin-syntax-optional-catch-binding/",\ "packageDependencies": [\ - ["@babel/plugin-syntax-optional-catch-binding", "virtual:3f0e0a85921a62029800b8f2c0f068fe72af12d4635dd7e42d2f1f4eee00103f9e9c5d6e857f4ff71f9c7aacc15b0efe7ccc00ddaa7e0948bf528cb1f61ef86c#npm:7.8.3"],\ + ["@babel/plugin-syntax-optional-catch-binding", "virtual:5c57728fdafd275fbceb3333cd469b7d71caf5fff87ea726fbfb2e82fced070ef689d0532e794e122b27fd916e42ed309a23709515b5ddb5c12cd35d573e0609#npm:7.8.3"],\ ["@babel/core", "npm:7.18.6"],\ ["@babel/helper-plugin-utils", "npm:7.18.6"],\ ["@types/babel__core", "npm:7.1.19"]\ @@ -675,10 +680,10 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { ],\ "linkType": "HARD"\ }],\ - ["virtual:88e8afac1808a7ea0495137247f12972bf8ff63736df3d967463d45fc3283fee7228e733a51043455f37a32513ebc5254c7a990a2e48a581ba95e0dd0bee457b#npm:7.8.3", {\ - "packageLocation": "./.yarn/__virtual__/@babel-plugin-syntax-optional-catch-binding-virtual-69ff5cf49d/0/cache/@babel-plugin-syntax-optional-catch-binding-npm-7.8.3-ce337427d8-910d90e72b.zip/node_modules/@babel/plugin-syntax-optional-catch-binding/",\ + ["virtual:f9e5bbd48d4bfce3eb2c606acdcf754dc03f5e4ad4e0894f8faaf348a4b861acc4da61e0b37c65344963f14a484562b8e56b144ad7908e3cad8464f1ba78f5fa#npm:7.8.3", {\ + "packageLocation": "./.yarn/__virtual__/@babel-plugin-syntax-optional-catch-binding-virtual-166f3f447a/0/cache/@babel-plugin-syntax-optional-catch-binding-npm-7.8.3-ce337427d8-910d90e72b.zip/node_modules/@babel/plugin-syntax-optional-catch-binding/",\ "packageDependencies": [\ - ["@babel/plugin-syntax-optional-catch-binding", "virtual:88e8afac1808a7ea0495137247f12972bf8ff63736df3d967463d45fc3283fee7228e733a51043455f37a32513ebc5254c7a990a2e48a581ba95e0dd0bee457b#npm:7.8.3"],\ + ["@babel/plugin-syntax-optional-catch-binding", "virtual:f9e5bbd48d4bfce3eb2c606acdcf754dc03f5e4ad4e0894f8faaf348a4b861acc4da61e0b37c65344963f14a484562b8e56b144ad7908e3cad8464f1ba78f5fa#npm:7.8.3"],\ ["@babel/core", "npm:7.18.6"],\ ["@babel/helper-plugin-utils", "npm:7.18.6"],\ ["@types/babel__core", null]\ @@ -698,10 +703,10 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { ],\ "linkType": "SOFT"\ }],\ - ["virtual:3f0e0a85921a62029800b8f2c0f068fe72af12d4635dd7e42d2f1f4eee00103f9e9c5d6e857f4ff71f9c7aacc15b0efe7ccc00ddaa7e0948bf528cb1f61ef86c#npm:7.8.3", {\ - "packageLocation": "./.yarn/__virtual__/@babel-plugin-syntax-optional-chaining-virtual-65b680484a/0/cache/@babel-plugin-syntax-optional-chaining-npm-7.8.3-f3f3c79579-eef94d53a1.zip/node_modules/@babel/plugin-syntax-optional-chaining/",\ + ["virtual:5c57728fdafd275fbceb3333cd469b7d71caf5fff87ea726fbfb2e82fced070ef689d0532e794e122b27fd916e42ed309a23709515b5ddb5c12cd35d573e0609#npm:7.8.3", {\ + "packageLocation": "./.yarn/__virtual__/@babel-plugin-syntax-optional-chaining-virtual-fd0fffcdff/0/cache/@babel-plugin-syntax-optional-chaining-npm-7.8.3-f3f3c79579-eef94d53a1.zip/node_modules/@babel/plugin-syntax-optional-chaining/",\ "packageDependencies": [\ - ["@babel/plugin-syntax-optional-chaining", "virtual:3f0e0a85921a62029800b8f2c0f068fe72af12d4635dd7e42d2f1f4eee00103f9e9c5d6e857f4ff71f9c7aacc15b0efe7ccc00ddaa7e0948bf528cb1f61ef86c#npm:7.8.3"],\ + ["@babel/plugin-syntax-optional-chaining", "virtual:5c57728fdafd275fbceb3333cd469b7d71caf5fff87ea726fbfb2e82fced070ef689d0532e794e122b27fd916e42ed309a23709515b5ddb5c12cd35d573e0609#npm:7.8.3"],\ ["@babel/core", "npm:7.18.6"],\ ["@babel/helper-plugin-utils", "npm:7.18.6"],\ ["@types/babel__core", "npm:7.1.19"]\ @@ -712,10 +717,10 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { ],\ "linkType": "HARD"\ }],\ - ["virtual:88e8afac1808a7ea0495137247f12972bf8ff63736df3d967463d45fc3283fee7228e733a51043455f37a32513ebc5254c7a990a2e48a581ba95e0dd0bee457b#npm:7.8.3", {\ - "packageLocation": "./.yarn/__virtual__/@babel-plugin-syntax-optional-chaining-virtual-0084ffb620/0/cache/@babel-plugin-syntax-optional-chaining-npm-7.8.3-f3f3c79579-eef94d53a1.zip/node_modules/@babel/plugin-syntax-optional-chaining/",\ + ["virtual:f9e5bbd48d4bfce3eb2c606acdcf754dc03f5e4ad4e0894f8faaf348a4b861acc4da61e0b37c65344963f14a484562b8e56b144ad7908e3cad8464f1ba78f5fa#npm:7.8.3", {\ + "packageLocation": "./.yarn/__virtual__/@babel-plugin-syntax-optional-chaining-virtual-1334ad0b93/0/cache/@babel-plugin-syntax-optional-chaining-npm-7.8.3-f3f3c79579-eef94d53a1.zip/node_modules/@babel/plugin-syntax-optional-chaining/",\ "packageDependencies": [\ - ["@babel/plugin-syntax-optional-chaining", "virtual:88e8afac1808a7ea0495137247f12972bf8ff63736df3d967463d45fc3283fee7228e733a51043455f37a32513ebc5254c7a990a2e48a581ba95e0dd0bee457b#npm:7.8.3"],\ + ["@babel/plugin-syntax-optional-chaining", "virtual:f9e5bbd48d4bfce3eb2c606acdcf754dc03f5e4ad4e0894f8faaf348a4b861acc4da61e0b37c65344963f14a484562b8e56b144ad7908e3cad8464f1ba78f5fa#npm:7.8.3"],\ ["@babel/core", "npm:7.18.6"],\ ["@babel/helper-plugin-utils", "npm:7.18.6"],\ ["@types/babel__core", null]\ @@ -735,10 +740,10 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { ],\ "linkType": "SOFT"\ }],\ - ["virtual:3f0e0a85921a62029800b8f2c0f068fe72af12d4635dd7e42d2f1f4eee00103f9e9c5d6e857f4ff71f9c7aacc15b0efe7ccc00ddaa7e0948bf528cb1f61ef86c#npm:7.14.5", {\ - "packageLocation": "./.yarn/__virtual__/@babel-plugin-syntax-top-level-await-virtual-795186b350/0/cache/@babel-plugin-syntax-top-level-await-npm-7.14.5-60a0a2e83b-bbd1a56b09.zip/node_modules/@babel/plugin-syntax-top-level-await/",\ + ["virtual:5c57728fdafd275fbceb3333cd469b7d71caf5fff87ea726fbfb2e82fced070ef689d0532e794e122b27fd916e42ed309a23709515b5ddb5c12cd35d573e0609#npm:7.14.5", {\ + "packageLocation": "./.yarn/__virtual__/@babel-plugin-syntax-top-level-await-virtual-1997a1560d/0/cache/@babel-plugin-syntax-top-level-await-npm-7.14.5-60a0a2e83b-bbd1a56b09.zip/node_modules/@babel/plugin-syntax-top-level-await/",\ "packageDependencies": [\ - ["@babel/plugin-syntax-top-level-await", "virtual:3f0e0a85921a62029800b8f2c0f068fe72af12d4635dd7e42d2f1f4eee00103f9e9c5d6e857f4ff71f9c7aacc15b0efe7ccc00ddaa7e0948bf528cb1f61ef86c#npm:7.14.5"],\ + ["@babel/plugin-syntax-top-level-await", "virtual:5c57728fdafd275fbceb3333cd469b7d71caf5fff87ea726fbfb2e82fced070ef689d0532e794e122b27fd916e42ed309a23709515b5ddb5c12cd35d573e0609#npm:7.14.5"],\ ["@babel/core", "npm:7.18.6"],\ ["@babel/helper-plugin-utils", "npm:7.18.6"],\ ["@types/babel__core", "npm:7.1.19"]\ @@ -749,10 +754,10 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { ],\ "linkType": "HARD"\ }],\ - ["virtual:88e8afac1808a7ea0495137247f12972bf8ff63736df3d967463d45fc3283fee7228e733a51043455f37a32513ebc5254c7a990a2e48a581ba95e0dd0bee457b#npm:7.14.5", {\ - "packageLocation": "./.yarn/__virtual__/@babel-plugin-syntax-top-level-await-virtual-b163490018/0/cache/@babel-plugin-syntax-top-level-await-npm-7.14.5-60a0a2e83b-bbd1a56b09.zip/node_modules/@babel/plugin-syntax-top-level-await/",\ + ["virtual:f9e5bbd48d4bfce3eb2c606acdcf754dc03f5e4ad4e0894f8faaf348a4b861acc4da61e0b37c65344963f14a484562b8e56b144ad7908e3cad8464f1ba78f5fa#npm:7.14.5", {\ + "packageLocation": "./.yarn/__virtual__/@babel-plugin-syntax-top-level-await-virtual-d24b73d0f8/0/cache/@babel-plugin-syntax-top-level-await-npm-7.14.5-60a0a2e83b-bbd1a56b09.zip/node_modules/@babel/plugin-syntax-top-level-await/",\ "packageDependencies": [\ - ["@babel/plugin-syntax-top-level-await", "virtual:88e8afac1808a7ea0495137247f12972bf8ff63736df3d967463d45fc3283fee7228e733a51043455f37a32513ebc5254c7a990a2e48a581ba95e0dd0bee457b#npm:7.14.5"],\ + ["@babel/plugin-syntax-top-level-await", "virtual:f9e5bbd48d4bfce3eb2c606acdcf754dc03f5e4ad4e0894f8faaf348a4b861acc4da61e0b37c65344963f14a484562b8e56b144ad7908e3cad8464f1ba78f5fa#npm:7.14.5"],\ ["@babel/core", "npm:7.18.6"],\ ["@babel/helper-plugin-utils", "npm:7.18.6"],\ ["@types/babel__core", null]\ @@ -772,10 +777,10 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { ],\ "linkType": "SOFT"\ }],\ - ["virtual:c457ca7d89b3ce4fafd02cf50646d9e37f211d427f3f27797953e7a92557db37294a7870524ffb7409853e4b8596de76f717ae526807c30a6a10d30f4752bbaa#npm:7.18.6", {\ - "packageLocation": "./.yarn/__virtual__/@babel-plugin-syntax-typescript-virtual-fa80dabcb8/0/cache/@babel-plugin-syntax-typescript-npm-7.18.6-4ad9dd7d2a-2cde73725e.zip/node_modules/@babel/plugin-syntax-typescript/",\ + ["virtual:b26687beb2614ce39983d45755ee1addcfe600e4f0030ebc42cd973d8bc10089112f81ea1266f3ec074ad029140ad57839a71eecdae7a68945739b618ffcfb74#npm:7.18.6", {\ + "packageLocation": "./.yarn/__virtual__/@babel-plugin-syntax-typescript-virtual-4f93349711/0/cache/@babel-plugin-syntax-typescript-npm-7.18.6-4ad9dd7d2a-2cde73725e.zip/node_modules/@babel/plugin-syntax-typescript/",\ "packageDependencies": [\ - ["@babel/plugin-syntax-typescript", "virtual:c457ca7d89b3ce4fafd02cf50646d9e37f211d427f3f27797953e7a92557db37294a7870524ffb7409853e4b8596de76f717ae526807c30a6a10d30f4752bbaa#npm:7.18.6"],\ + ["@babel/plugin-syntax-typescript", "virtual:b26687beb2614ce39983d45755ee1addcfe600e4f0030ebc42cd973d8bc10089112f81ea1266f3ec074ad029140ad57839a71eecdae7a68945739b618ffcfb74#npm:7.18.6"],\ ["@babel/core", "npm:7.18.6"],\ ["@babel/helper-plugin-utils", "npm:7.18.6"],\ ["@types/babel__core", null]\ @@ -1233,12 +1238,12 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { ],\ "linkType": "SOFT"\ }],\ - ["virtual:4da8bab4935625c2820fbdf15dd84c6f0f24c72f612f8d458490cad6eb367cd20b930febadfe94ecf3f274e97168173373617db9c693194d2d780053e65cfd06#npm:27.5.1", {\ - "packageLocation": "./.yarn/__virtual__/@jest-core-virtual-f55e2a37ba/0/cache/@jest-core-npm-27.5.1-b2d79816b3-904a94ad8f.zip/node_modules/@jest/core/",\ + ["virtual:561500c89be00f7cb4ddf90a2878aca2ad5df584a251ef79d09bee0ab019ca7e06ee5599a47f174e8a316decd4fb0b7c70ef1416c703ab2a350a1f3787071b88#npm:27.5.1", {\ + "packageLocation": "./.yarn/__virtual__/@jest-core-virtual-4f4ff16f77/0/cache/@jest-core-npm-27.5.1-b2d79816b3-904a94ad8f.zip/node_modules/@jest/core/",\ "packageDependencies": [\ - ["@jest/core", "virtual:4da8bab4935625c2820fbdf15dd84c6f0f24c72f612f8d458490cad6eb367cd20b930febadfe94ecf3f274e97168173373617db9c693194d2d780053e65cfd06#npm:27.5.1"],\ + ["@jest/core", "virtual:561500c89be00f7cb4ddf90a2878aca2ad5df584a251ef79d09bee0ab019ca7e06ee5599a47f174e8a316decd4fb0b7c70ef1416c703ab2a350a1f3787071b88#npm:27.5.1"],\ ["@jest/console", "npm:27.5.1"],\ - ["@jest/reporters", "virtual:f55e2a37bae3791afd3855f95f0a569fbe14de7428b124244857d90ef36bccd45cc99f9f5aa3b4f337db4d54c2789ca701ec2141f52e752ffb3d9ccc8bd652bc#npm:27.5.1"],\ + ["@jest/reporters", "virtual:4f4ff16f77dafa8fc797a688b1d64c7a7785e0f95d9557bb288efe4f7e30db51144ecbe1dee9eadc0614b04aa7f88589b216b8b4b46444764e823f7e465458fe#npm:27.5.1"],\ ["@jest/test-result", "npm:27.5.1"],\ ["@jest/transform", "npm:27.5.1"],\ ["@jest/types", "npm:27.5.1"],\ @@ -1250,7 +1255,7 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { ["exit", "npm:0.1.2"],\ ["graceful-fs", "npm:4.2.10"],\ ["jest-changed-files", "npm:27.5.1"],\ - ["jest-config", "virtual:f55e2a37bae3791afd3855f95f0a569fbe14de7428b124244857d90ef36bccd45cc99f9f5aa3b4f337db4d54c2789ca701ec2141f52e752ffb3d9ccc8bd652bc#npm:27.5.1"],\ + ["jest-config", "virtual:4f4ff16f77dafa8fc797a688b1d64c7a7785e0f95d9557bb288efe4f7e30db51144ecbe1dee9eadc0614b04aa7f88589b216b8b4b46444764e823f7e465458fe#npm:27.5.1"],\ ["jest-haste-map", "npm:27.5.1"],\ ["jest-message-util", "npm:27.5.1"],\ ["jest-regex-util", "npm:27.5.1"],\ @@ -1427,6 +1432,44 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { ],\ "linkType": "SOFT"\ }],\ + ["virtual:4f4ff16f77dafa8fc797a688b1d64c7a7785e0f95d9557bb288efe4f7e30db51144ecbe1dee9eadc0614b04aa7f88589b216b8b4b46444764e823f7e465458fe#npm:27.5.1", {\ + "packageLocation": "./.yarn/__virtual__/@jest-reporters-virtual-8d9e944844/0/cache/@jest-reporters-npm-27.5.1-a792fda73f-faba5eafb8.zip/node_modules/@jest/reporters/",\ + "packageDependencies": [\ + ["@jest/reporters", "virtual:4f4ff16f77dafa8fc797a688b1d64c7a7785e0f95d9557bb288efe4f7e30db51144ecbe1dee9eadc0614b04aa7f88589b216b8b4b46444764e823f7e465458fe#npm:27.5.1"],\ + ["@bcoe/v8-coverage", "npm:0.2.3"],\ + ["@jest/console", "npm:27.5.1"],\ + ["@jest/test-result", "npm:27.5.1"],\ + ["@jest/transform", "npm:27.5.1"],\ + ["@jest/types", "npm:27.5.1"],\ + ["@types/node", "npm:18.0.3"],\ + ["@types/node-notifier", null],\ + ["chalk", "npm:4.1.2"],\ + ["collect-v8-coverage", "npm:1.0.1"],\ + ["exit", "npm:0.1.2"],\ + ["glob", "npm:7.2.3"],\ + ["graceful-fs", "npm:4.2.10"],\ + ["istanbul-lib-coverage", "npm:3.2.0"],\ + ["istanbul-lib-instrument", "npm:5.2.0"],\ + ["istanbul-lib-report", "npm:3.0.0"],\ + ["istanbul-lib-source-maps", "npm:4.0.1"],\ + ["istanbul-reports", "npm:3.1.4"],\ + ["jest-haste-map", "npm:27.5.1"],\ + ["jest-resolve", "npm:27.5.1"],\ + ["jest-util", "npm:27.5.1"],\ + ["jest-worker", "npm:27.5.1"],\ + ["node-notifier", null],\ + ["slash", "npm:3.0.0"],\ + ["source-map", "npm:0.6.1"],\ + ["string-length", "npm:4.0.2"],\ + ["terminal-link", "npm:2.1.1"],\ + ["v8-to-istanbul", "npm:8.1.1"]\ + ],\ + "packagePeers": [\ + "@types/node-notifier",\ + "node-notifier"\ + ],\ + "linkType": "HARD"\ + }],\ ["virtual:be4e72803e29b182091e80c76796946e511ab86087b964364e80b13fa253ee8f1865c00c32a13774c8f168666c26ea00b79dff20ff97d84a2c6a60b1d53603ae#npm:28.1.2", {\ "packageLocation": "./.yarn/__virtual__/@jest-reporters-virtual-c23ea69330/0/cache/@jest-reporters-npm-28.1.2-8a0dea0c1e-26aa66e8ea.zip/node_modules/@jest/reporters/",\ "packageDependencies": [\ @@ -1464,44 +1507,6 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { "node-notifier"\ ],\ "linkType": "HARD"\ - }],\ - ["virtual:f55e2a37bae3791afd3855f95f0a569fbe14de7428b124244857d90ef36bccd45cc99f9f5aa3b4f337db4d54c2789ca701ec2141f52e752ffb3d9ccc8bd652bc#npm:27.5.1", {\ - "packageLocation": "./.yarn/__virtual__/@jest-reporters-virtual-fb5138d9e9/0/cache/@jest-reporters-npm-27.5.1-a792fda73f-faba5eafb8.zip/node_modules/@jest/reporters/",\ - "packageDependencies": [\ - ["@jest/reporters", "virtual:f55e2a37bae3791afd3855f95f0a569fbe14de7428b124244857d90ef36bccd45cc99f9f5aa3b4f337db4d54c2789ca701ec2141f52e752ffb3d9ccc8bd652bc#npm:27.5.1"],\ - ["@bcoe/v8-coverage", "npm:0.2.3"],\ - ["@jest/console", "npm:27.5.1"],\ - ["@jest/test-result", "npm:27.5.1"],\ - ["@jest/transform", "npm:27.5.1"],\ - ["@jest/types", "npm:27.5.1"],\ - ["@types/node", "npm:18.0.3"],\ - ["@types/node-notifier", null],\ - ["chalk", "npm:4.1.2"],\ - ["collect-v8-coverage", "npm:1.0.1"],\ - ["exit", "npm:0.1.2"],\ - ["glob", "npm:7.2.3"],\ - ["graceful-fs", "npm:4.2.10"],\ - ["istanbul-lib-coverage", "npm:3.2.0"],\ - ["istanbul-lib-instrument", "npm:5.2.0"],\ - ["istanbul-lib-report", "npm:3.0.0"],\ - ["istanbul-lib-source-maps", "npm:4.0.1"],\ - ["istanbul-reports", "npm:3.1.4"],\ - ["jest-haste-map", "npm:27.5.1"],\ - ["jest-resolve", "npm:27.5.1"],\ - ["jest-util", "npm:27.5.1"],\ - ["jest-worker", "npm:27.5.1"],\ - ["node-notifier", null],\ - ["slash", "npm:3.0.0"],\ - ["source-map", "npm:0.6.1"],\ - ["string-length", "npm:4.0.2"],\ - ["terminal-link", "npm:2.1.1"],\ - ["v8-to-istanbul", "npm:8.1.1"]\ - ],\ - "packagePeers": [\ - "@types/node-notifier",\ - "node-notifier"\ - ],\ - "linkType": "HARD"\ }]\ ]],\ ["@jest/schemas", [\ @@ -2625,12 +2630,20 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { }]\ ]],\ ["@standardnotes/analytics", [\ - ["npm:1.6.0", {\ - "packageLocation": "./.yarn/cache/@standardnotes-analytics-npm-1.6.0-39bec110e3-6a5e861526.zip/node_modules/@standardnotes/analytics/",\ + ["workspace:packages/analytics", {\ + "packageLocation": "./packages/analytics/",\ "packageDependencies": [\ - ["@standardnotes/analytics", "npm:1.6.0"]\ + ["@standardnotes/analytics", "workspace:packages/analytics"],\ + ["@types/ioredis", "npm:4.28.10"],\ + ["@types/jest", "npm:27.5.2"],\ + ["@typescript-eslint/eslint-plugin", "virtual:c66bf20e88479ada0172094776519a9f51acc4731d22079b60a295bcec7ea42d5545cbce58a77a50d932bf953298799135e99707486e343da6d99ba1d167bdbd#npm:5.30.5"],\ + ["eslint-plugin-prettier", "virtual:c66bf20e88479ada0172094776519a9f51acc4731d22079b60a295bcec7ea42d5545cbce58a77a50d932bf953298799135e99707486e343da6d99ba1d167bdbd#npm:4.2.1"],\ + ["ioredis", "npm:4.28.5"],\ + ["jest", "virtual:c66bf20e88479ada0172094776519a9f51acc4731d22079b60a295bcec7ea42d5545cbce58a77a50d932bf953298799135e99707486e343da6d99ba1d167bdbd#npm:27.5.1"],\ + ["reflect-metadata", "npm:0.1.13"],\ + ["ts-jest", "virtual:c66bf20e88479ada0172094776519a9f51acc4731d22079b60a295bcec7ea42d5545cbce58a77a50d932bf953298799135e99707486e343da6d99ba1d167bdbd#npm:27.1.5"]\ ],\ - "linkType": "HARD"\ + "linkType": "SOFT"\ }]\ ]],\ ["@standardnotes/api", [\ @@ -2655,7 +2668,7 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { ["@standardnotes/api-gateway", "workspace:packages/api-gateway"],\ ["@newrelic/winston-enricher", "virtual:04783e12400851b8a3d76e71495851cc94959db6e62f04cb0a31190080629440b182d8c8eb4d7f2b04e281912f2783a5fd4d2c3c6ab68d38b7097246c93f4c19#npm:2.1.2"],\ ["@sentry/node", "npm:7.5.0"],\ - ["@standardnotes/analytics", "npm:1.6.0"],\ + ["@standardnotes/analytics", "workspace:packages/analytics"],\ ["@standardnotes/auth", "npm:3.19.4"],\ ["@standardnotes/domain-events", "workspace:packages/domain-events"],\ ["@standardnotes/domain-events-infra", "workspace:packages/domain-events-infra"],\ @@ -2710,7 +2723,7 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { ["@standardnotes/auth-server", "workspace:packages/auth"],\ ["@newrelic/winston-enricher", "virtual:04783e12400851b8a3d76e71495851cc94959db6e62f04cb0a31190080629440b182d8c8eb4d7f2b04e281912f2783a5fd4d2c3c6ab68d38b7097246c93f4c19#npm:2.1.2"],\ ["@sentry/node", "npm:7.5.0"],\ - ["@standardnotes/analytics", "npm:1.6.0"],\ + ["@standardnotes/analytics", "workspace:packages/analytics"],\ ["@standardnotes/api", "npm:1.1.19"],\ ["@standardnotes/auth", "npm:3.19.4"],\ ["@standardnotes/common", "npm:1.23.1"],\ @@ -2797,8 +2810,8 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { ["@standardnotes/features", "npm:1.50.0"],\ ["@standardnotes/scheduler", "npm:1.1.2"],\ ["@types/jest", "npm:28.1.4"],\ - ["@typescript-eslint/eslint-plugin", "virtual:e1128e9ebb31076ea8e955c00397fd108ee8bf0fb2df3b2a603c510b7014a507cfa360bccf848efc1ec8c431656aa94c5ad08bcec32950bdf1278d01cd890e4f#npm:5.30.5"],\ - ["eslint-plugin-prettier", "virtual:e1128e9ebb31076ea8e955c00397fd108ee8bf0fb2df3b2a603c510b7014a507cfa360bccf848efc1ec8c431656aa94c5ad08bcec32950bdf1278d01cd890e4f#npm:4.2.1"],\ + ["@typescript-eslint/eslint-plugin", "virtual:c66bf20e88479ada0172094776519a9f51acc4731d22079b60a295bcec7ea42d5545cbce58a77a50d932bf953298799135e99707486e343da6d99ba1d167bdbd#npm:5.30.5"],\ + ["eslint-plugin-prettier", "virtual:c66bf20e88479ada0172094776519a9f51acc4731d22079b60a295bcec7ea42d5545cbce58a77a50d932bf953298799135e99707486e343da6d99ba1d167bdbd#npm:4.2.1"],\ ["jest", "virtual:e1128e9ebb31076ea8e955c00397fd108ee8bf0fb2df3b2a603c510b7014a507cfa360bccf848efc1ec8c431656aa94c5ad08bcec32950bdf1278d01cd890e4f#npm:28.1.2"],\ ["reflect-metadata", "npm:0.1.13"],\ ["ts-jest", "virtual:e1128e9ebb31076ea8e955c00397fd108ee8bf0fb2df3b2a603c510b7014a507cfa360bccf848efc1ec8c431656aa94c5ad08bcec32950bdf1278d01cd890e4f#npm:28.0.5"]\ @@ -2815,15 +2828,15 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { ["@types/ioredis", "npm:4.28.10"],\ ["@types/jest", "npm:27.5.2"],\ ["@types/newrelic", "npm:7.0.3"],\ - ["@typescript-eslint/eslint-plugin", "virtual:e1128e9ebb31076ea8e955c00397fd108ee8bf0fb2df3b2a603c510b7014a507cfa360bccf848efc1ec8c431656aa94c5ad08bcec32950bdf1278d01cd890e4f#npm:5.30.5"],\ + ["@typescript-eslint/eslint-plugin", "virtual:c66bf20e88479ada0172094776519a9f51acc4731d22079b60a295bcec7ea42d5545cbce58a77a50d932bf953298799135e99707486e343da6d99ba1d167bdbd#npm:5.30.5"],\ ["aws-sdk", "npm:2.1168.0"],\ - ["eslint-plugin-prettier", "virtual:e1128e9ebb31076ea8e955c00397fd108ee8bf0fb2df3b2a603c510b7014a507cfa360bccf848efc1ec8c431656aa94c5ad08bcec32950bdf1278d01cd890e4f#npm:4.2.1"],\ + ["eslint-plugin-prettier", "virtual:c66bf20e88479ada0172094776519a9f51acc4731d22079b60a295bcec7ea42d5545cbce58a77a50d932bf953298799135e99707486e343da6d99ba1d167bdbd#npm:4.2.1"],\ ["ioredis", "npm:4.28.5"],\ - ["jest", "virtual:685a6222c3349423674bb7f0684ba34e2ab20912010f352e04dcf707a156e13183fc382e2417cb37a60f3e7b52fd0178c53181674890e1773eb83e190dc13378#npm:27.5.1"],\ + ["jest", "virtual:c66bf20e88479ada0172094776519a9f51acc4731d22079b60a295bcec7ea42d5545cbce58a77a50d932bf953298799135e99707486e343da6d99ba1d167bdbd#npm:27.5.1"],\ ["newrelic", "npm:8.14.1"],\ ["reflect-metadata", "npm:0.1.13"],\ ["sqs-consumer", "virtual:685a6222c3349423674bb7f0684ba34e2ab20912010f352e04dcf707a156e13183fc382e2417cb37a60f3e7b52fd0178c53181674890e1773eb83e190dc13378#npm:5.7.0"],\ - ["ts-jest", "virtual:685a6222c3349423674bb7f0684ba34e2ab20912010f352e04dcf707a156e13183fc382e2417cb37a60f3e7b52fd0178c53181674890e1773eb83e190dc13378#npm:27.1.5"],\ + ["ts-jest", "virtual:c66bf20e88479ada0172094776519a9f51acc4731d22079b60a295bcec7ea42d5545cbce58a77a50d932bf953298799135e99707486e343da6d99ba1d167bdbd#npm:27.1.5"],\ ["winston", "npm:3.8.1"]\ ],\ "linkType": "SOFT"\ @@ -2974,11 +2987,11 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { ["@types/jest", "npm:28.1.4"],\ ["@types/newrelic", "npm:7.0.3"],\ ["@types/node", "npm:18.0.3"],\ - ["@typescript-eslint/eslint-plugin", "virtual:e1128e9ebb31076ea8e955c00397fd108ee8bf0fb2df3b2a603c510b7014a507cfa360bccf848efc1ec8c431656aa94c5ad08bcec32950bdf1278d01cd890e4f#npm:5.30.5"],\ + ["@typescript-eslint/eslint-plugin", "virtual:c66bf20e88479ada0172094776519a9f51acc4731d22079b60a295bcec7ea42d5545cbce58a77a50d932bf953298799135e99707486e343da6d99ba1d167bdbd#npm:5.30.5"],\ ["aws-sdk", "npm:2.1168.0"],\ ["dayjs", "npm:1.11.3"],\ ["dotenv", "npm:8.2.0"],\ - ["eslint-plugin-prettier", "virtual:e1128e9ebb31076ea8e955c00397fd108ee8bf0fb2df3b2a603c510b7014a507cfa360bccf848efc1ec8c431656aa94c5ad08bcec32950bdf1278d01cd890e4f#npm:4.2.1"],\ + ["eslint-plugin-prettier", "virtual:c66bf20e88479ada0172094776519a9f51acc4731d22079b60a295bcec7ea42d5545cbce58a77a50d932bf953298799135e99707486e343da6d99ba1d167bdbd#npm:4.2.1"],\ ["inversify", "npm:5.0.5"],\ ["ioredis", "npm:5.1.0"],\ ["jest", "virtual:e1128e9ebb31076ea8e955c00397fd108ee8bf0fb2df3b2a603c510b7014a507cfa360bccf848efc1ec8c431656aa94c5ad08bcec32950bdf1278d01cd890e4f#npm:28.1.2"],\ @@ -3070,7 +3083,7 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { ["@standardnotes/syncing-server", "workspace:packages/syncing-server"],\ ["@newrelic/winston-enricher", "virtual:04783e12400851b8a3d76e71495851cc94959db6e62f04cb0a31190080629440b182d8c8eb4d7f2b04e281912f2783a5fd4d2c3c6ab68d38b7097246c93f4c19#npm:2.1.2"],\ ["@sentry/node", "npm:7.5.0"],\ - ["@standardnotes/analytics", "npm:1.6.0"],\ + ["@standardnotes/analytics", "workspace:packages/analytics"],\ ["@standardnotes/auth", "npm:3.19.4"],\ ["@standardnotes/common", "npm:1.23.1"],\ ["@standardnotes/domain-events", "workspace:packages/domain-events"],\ @@ -3672,7 +3685,7 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { ["ignore", "npm:5.2.0"],\ ["regexpp", "npm:3.2.0"],\ ["semver", "npm:7.3.7"],\ - ["tsutils", "virtual:a494d2d5cb9c7415bd516909b7bd7e445ce3cd777e25a22b31a8c08b68b78f647b57e72ac5429a893f70d7a8705296469270e9532e56532dac63f2edc052dcec#npm:3.21.0"],\ + ["tsutils", "virtual:a701e8faf4c6b245fc4985636d3e7eecbb676ed70fff3464fce6c7a5aa8af393ac6dd3e22dcae90cbadce31aca3a1e26eaf8eb9018d00366ec052b25723c6bb7#npm:3.21.0"],\ ["typescript", null]\ ],\ "packagePeers": [\ @@ -3685,24 +3698,24 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { ],\ "linkType": "HARD"\ }],\ - ["virtual:e1128e9ebb31076ea8e955c00397fd108ee8bf0fb2df3b2a603c510b7014a507cfa360bccf848efc1ec8c431656aa94c5ad08bcec32950bdf1278d01cd890e4f#npm:5.30.5", {\ - "packageLocation": "./.yarn/__virtual__/@typescript-eslint-eslint-plugin-virtual-a494d2d5cb/0/cache/@typescript-eslint-eslint-plugin-npm-5.30.5-56e8842647-cf763fb091.zip/node_modules/@typescript-eslint/eslint-plugin/",\ + ["virtual:c66bf20e88479ada0172094776519a9f51acc4731d22079b60a295bcec7ea42d5545cbce58a77a50d932bf953298799135e99707486e343da6d99ba1d167bdbd#npm:5.30.5", {\ + "packageLocation": "./.yarn/__virtual__/@typescript-eslint-eslint-plugin-virtual-a701e8faf4/0/cache/@typescript-eslint-eslint-plugin-npm-5.30.5-56e8842647-cf763fb091.zip/node_modules/@typescript-eslint/eslint-plugin/",\ "packageDependencies": [\ - ["@typescript-eslint/eslint-plugin", "virtual:e1128e9ebb31076ea8e955c00397fd108ee8bf0fb2df3b2a603c510b7014a507cfa360bccf848efc1ec8c431656aa94c5ad08bcec32950bdf1278d01cd890e4f#npm:5.30.5"],\ + ["@typescript-eslint/eslint-plugin", "virtual:c66bf20e88479ada0172094776519a9f51acc4731d22079b60a295bcec7ea42d5545cbce58a77a50d932bf953298799135e99707486e343da6d99ba1d167bdbd#npm:5.30.5"],\ ["@types/eslint", null],\ ["@types/typescript", null],\ ["@types/typescript-eslint__parser", null],\ ["@typescript-eslint/parser", null],\ ["@typescript-eslint/scope-manager", "npm:5.30.5"],\ - ["@typescript-eslint/type-utils", "virtual:a494d2d5cb9c7415bd516909b7bd7e445ce3cd777e25a22b31a8c08b68b78f647b57e72ac5429a893f70d7a8705296469270e9532e56532dac63f2edc052dcec#npm:5.30.5"],\ - ["@typescript-eslint/utils", "virtual:a494d2d5cb9c7415bd516909b7bd7e445ce3cd777e25a22b31a8c08b68b78f647b57e72ac5429a893f70d7a8705296469270e9532e56532dac63f2edc052dcec#npm:5.30.5"],\ + ["@typescript-eslint/type-utils", "virtual:a701e8faf4c6b245fc4985636d3e7eecbb676ed70fff3464fce6c7a5aa8af393ac6dd3e22dcae90cbadce31aca3a1e26eaf8eb9018d00366ec052b25723c6bb7#npm:5.30.5"],\ + ["@typescript-eslint/utils", "virtual:a701e8faf4c6b245fc4985636d3e7eecbb676ed70fff3464fce6c7a5aa8af393ac6dd3e22dcae90cbadce31aca3a1e26eaf8eb9018d00366ec052b25723c6bb7#npm:5.30.5"],\ ["debug", "virtual:b86a9fb34323a98c6519528ed55faa0d9b44ca8879307c0b29aa384bde47ff59a7d0c9051b31246f14521dfb71ba3c5d6d0b35c29fffc17bf875aa6ad977d9e8#npm:4.3.4"],\ ["eslint", null],\ ["functional-red-black-tree", "npm:1.0.1"],\ ["ignore", "npm:5.2.0"],\ ["regexpp", "npm:3.2.0"],\ ["semver", "npm:7.3.7"],\ - ["tsutils", "virtual:a494d2d5cb9c7415bd516909b7bd7e445ce3cd777e25a22b31a8c08b68b78f647b57e72ac5429a893f70d7a8705296469270e9532e56532dac63f2edc052dcec#npm:3.21.0"],\ + ["tsutils", "virtual:a701e8faf4c6b245fc4985636d3e7eecbb676ed70fff3464fce6c7a5aa8af393ac6dd3e22dcae90cbadce31aca3a1e26eaf8eb9018d00366ec052b25723c6bb7#npm:3.21.0"],\ ["typescript", null]\ ],\ "packagePeers": [\ @@ -3724,15 +3737,15 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { ["@types/typescript-eslint__parser", null],\ ["@typescript-eslint/parser", "virtual:f16699e48080c5e5e9044bd1b8263f17d30ec4f2835602b65a6ea6943ccc23f384f86fef49b1a9c9121abd253bf13b0c7eae76bcc1f8a8c3112948cf6fbfbbcb#npm:5.30.5"],\ ["@typescript-eslint/scope-manager", "npm:5.30.5"],\ - ["@typescript-eslint/type-utils", "virtual:a494d2d5cb9c7415bd516909b7bd7e445ce3cd777e25a22b31a8c08b68b78f647b57e72ac5429a893f70d7a8705296469270e9532e56532dac63f2edc052dcec#npm:5.30.5"],\ - ["@typescript-eslint/utils", "virtual:a494d2d5cb9c7415bd516909b7bd7e445ce3cd777e25a22b31a8c08b68b78f647b57e72ac5429a893f70d7a8705296469270e9532e56532dac63f2edc052dcec#npm:5.30.5"],\ + ["@typescript-eslint/type-utils", "virtual:a701e8faf4c6b245fc4985636d3e7eecbb676ed70fff3464fce6c7a5aa8af393ac6dd3e22dcae90cbadce31aca3a1e26eaf8eb9018d00366ec052b25723c6bb7#npm:5.30.5"],\ + ["@typescript-eslint/utils", "virtual:a701e8faf4c6b245fc4985636d3e7eecbb676ed70fff3464fce6c7a5aa8af393ac6dd3e22dcae90cbadce31aca3a1e26eaf8eb9018d00366ec052b25723c6bb7#npm:5.30.5"],\ ["debug", "virtual:b86a9fb34323a98c6519528ed55faa0d9b44ca8879307c0b29aa384bde47ff59a7d0c9051b31246f14521dfb71ba3c5d6d0b35c29fffc17bf875aa6ad977d9e8#npm:4.3.4"],\ ["eslint", null],\ ["functional-red-black-tree", "npm:1.0.1"],\ ["ignore", "npm:5.2.0"],\ ["regexpp", "npm:3.2.0"],\ ["semver", "npm:7.3.7"],\ - ["tsutils", "virtual:a494d2d5cb9c7415bd516909b7bd7e445ce3cd777e25a22b31a8c08b68b78f647b57e72ac5429a893f70d7a8705296469270e9532e56532dac63f2edc052dcec#npm:3.21.0"],\ + ["tsutils", "virtual:a701e8faf4c6b245fc4985636d3e7eecbb676ed70fff3464fce6c7a5aa8af393ac6dd3e22dcae90cbadce31aca3a1e26eaf8eb9018d00366ec052b25723c6bb7#npm:3.21.0"],\ ["typescript", null]\ ],\ "packagePeers": [\ @@ -3783,7 +3796,7 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { ["@types/typescript", null],\ ["@typescript-eslint/scope-manager", "npm:5.30.5"],\ ["@typescript-eslint/types", "npm:5.30.5"],\ - ["@typescript-eslint/typescript-estree", "virtual:1281b5976fbd82a752119e842b46851390eb21d1e1e09890d105307e2f5a80ccdcfc8d06824747c753b2641692a6ca83a19921bf85e2a330147b1187f624d2de#npm:5.30.5"],\ + ["@typescript-eslint/typescript-estree", "virtual:88ab8651a580797d7f324e37350531c263fefbb27f1fc46e5b8375e61563225250ef83ca300b659dec69914dff4206d1d1cd466001cf6db38cb5ec1e1b1fed3a#npm:5.30.5"],\ ["debug", "virtual:b86a9fb34323a98c6519528ed55faa0d9b44ca8879307c0b29aa384bde47ff59a7d0c9051b31246f14521dfb71ba3c5d6d0b35c29fffc17bf875aa6ad977d9e8#npm:4.3.4"],\ ["eslint", null],\ ["typescript", null]\ @@ -3825,7 +3838,7 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { ["@typescript-eslint/utils", "virtual:086d5bd6b4e5d96fda55ccc2a5af0528303859d284b1954eaad5afbaac50aa245db7047bbcafdf4fc959515b8cd2427f5a5803a7c405d7c9bb68e8a25fb54f8f#npm:5.30.5"],\ ["debug", "virtual:b86a9fb34323a98c6519528ed55faa0d9b44ca8879307c0b29aa384bde47ff59a7d0c9051b31246f14521dfb71ba3c5d6d0b35c29fffc17bf875aa6ad977d9e8#npm:4.3.4"],\ ["eslint", "npm:8.19.0"],\ - ["tsutils", "virtual:a494d2d5cb9c7415bd516909b7bd7e445ce3cd777e25a22b31a8c08b68b78f647b57e72ac5429a893f70d7a8705296469270e9532e56532dac63f2edc052dcec#npm:3.21.0"],\ + ["tsutils", "virtual:a701e8faf4c6b245fc4985636d3e7eecbb676ed70fff3464fce6c7a5aa8af393ac6dd3e22dcae90cbadce31aca3a1e26eaf8eb9018d00366ec052b25723c6bb7#npm:3.21.0"],\ ["typescript", null]\ ],\ "packagePeers": [\ @@ -3836,16 +3849,16 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { ],\ "linkType": "HARD"\ }],\ - ["virtual:a494d2d5cb9c7415bd516909b7bd7e445ce3cd777e25a22b31a8c08b68b78f647b57e72ac5429a893f70d7a8705296469270e9532e56532dac63f2edc052dcec#npm:5.30.5", {\ - "packageLocation": "./.yarn/__virtual__/@typescript-eslint-type-utils-virtual-f011d8a424/0/cache/@typescript-eslint-type-utils-npm-5.30.5-765594d88b-080cc12317.zip/node_modules/@typescript-eslint/type-utils/",\ + ["virtual:a701e8faf4c6b245fc4985636d3e7eecbb676ed70fff3464fce6c7a5aa8af393ac6dd3e22dcae90cbadce31aca3a1e26eaf8eb9018d00366ec052b25723c6bb7#npm:5.30.5", {\ + "packageLocation": "./.yarn/__virtual__/@typescript-eslint-type-utils-virtual-3491ceb3a1/0/cache/@typescript-eslint-type-utils-npm-5.30.5-765594d88b-080cc12317.zip/node_modules/@typescript-eslint/type-utils/",\ "packageDependencies": [\ - ["@typescript-eslint/type-utils", "virtual:a494d2d5cb9c7415bd516909b7bd7e445ce3cd777e25a22b31a8c08b68b78f647b57e72ac5429a893f70d7a8705296469270e9532e56532dac63f2edc052dcec#npm:5.30.5"],\ + ["@typescript-eslint/type-utils", "virtual:a701e8faf4c6b245fc4985636d3e7eecbb676ed70fff3464fce6c7a5aa8af393ac6dd3e22dcae90cbadce31aca3a1e26eaf8eb9018d00366ec052b25723c6bb7#npm:5.30.5"],\ ["@types/eslint", null],\ ["@types/typescript", null],\ - ["@typescript-eslint/utils", "virtual:a494d2d5cb9c7415bd516909b7bd7e445ce3cd777e25a22b31a8c08b68b78f647b57e72ac5429a893f70d7a8705296469270e9532e56532dac63f2edc052dcec#npm:5.30.5"],\ + ["@typescript-eslint/utils", "virtual:a701e8faf4c6b245fc4985636d3e7eecbb676ed70fff3464fce6c7a5aa8af393ac6dd3e22dcae90cbadce31aca3a1e26eaf8eb9018d00366ec052b25723c6bb7#npm:5.30.5"],\ ["debug", "virtual:b86a9fb34323a98c6519528ed55faa0d9b44ca8879307c0b29aa384bde47ff59a7d0c9051b31246f14521dfb71ba3c5d6d0b35c29fffc17bf875aa6ad977d9e8#npm:4.3.4"],\ ["eslint", null],\ - ["tsutils", "virtual:a494d2d5cb9c7415bd516909b7bd7e445ce3cd777e25a22b31a8c08b68b78f647b57e72ac5429a893f70d7a8705296469270e9532e56532dac63f2edc052dcec#npm:3.21.0"],\ + ["tsutils", "virtual:a701e8faf4c6b245fc4985636d3e7eecbb676ed70fff3464fce6c7a5aa8af393ac6dd3e22dcae90cbadce31aca3a1e26eaf8eb9018d00366ec052b25723c6bb7#npm:3.21.0"],\ ["typescript", null]\ ],\ "packagePeers": [\ @@ -3874,26 +3887,6 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { ],\ "linkType": "SOFT"\ }],\ - ["virtual:1281b5976fbd82a752119e842b46851390eb21d1e1e09890d105307e2f5a80ccdcfc8d06824747c753b2641692a6ca83a19921bf85e2a330147b1187f624d2de#npm:5.30.5", {\ - "packageLocation": "./.yarn/__virtual__/@typescript-eslint-typescript-estree-virtual-ca0315c80c/0/cache/@typescript-eslint-typescript-estree-npm-5.30.5-da9a64fff6-19dce426c8.zip/node_modules/@typescript-eslint/typescript-estree/",\ - "packageDependencies": [\ - ["@typescript-eslint/typescript-estree", "virtual:1281b5976fbd82a752119e842b46851390eb21d1e1e09890d105307e2f5a80ccdcfc8d06824747c753b2641692a6ca83a19921bf85e2a330147b1187f624d2de#npm:5.30.5"],\ - ["@types/typescript", null],\ - ["@typescript-eslint/types", "npm:5.30.5"],\ - ["@typescript-eslint/visitor-keys", "npm:5.30.5"],\ - ["debug", "virtual:b86a9fb34323a98c6519528ed55faa0d9b44ca8879307c0b29aa384bde47ff59a7d0c9051b31246f14521dfb71ba3c5d6d0b35c29fffc17bf875aa6ad977d9e8#npm:4.3.4"],\ - ["globby", "npm:11.1.0"],\ - ["is-glob", "npm:4.0.3"],\ - ["semver", "npm:7.3.7"],\ - ["tsutils", "virtual:a494d2d5cb9c7415bd516909b7bd7e445ce3cd777e25a22b31a8c08b68b78f647b57e72ac5429a893f70d7a8705296469270e9532e56532dac63f2edc052dcec#npm:3.21.0"],\ - ["typescript", null]\ - ],\ - "packagePeers": [\ - "@types/typescript",\ - "typescript"\ - ],\ - "linkType": "HARD"\ - }],\ ["virtual:406f88bbff41411d4cefda7d6b38557acc65de118685466d47b39a0c0c99b46d56bd91f71f9ae4fdf5cb897b1fa4931738085dfcabdfbbec6231466dd9267aa7#npm:5.30.5", {\ "packageLocation": "./.yarn/__virtual__/@typescript-eslint-typescript-estree-virtual-bdae2dd6e8/0/cache/@typescript-eslint-typescript-estree-npm-5.30.5-da9a64fff6-19dce426c8.zip/node_modules/@typescript-eslint/typescript-estree/",\ "packageDependencies": [\ @@ -3913,6 +3906,26 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { "typescript"\ ],\ "linkType": "HARD"\ + }],\ + ["virtual:88ab8651a580797d7f324e37350531c263fefbb27f1fc46e5b8375e61563225250ef83ca300b659dec69914dff4206d1d1cd466001cf6db38cb5ec1e1b1fed3a#npm:5.30.5", {\ + "packageLocation": "./.yarn/__virtual__/@typescript-eslint-typescript-estree-virtual-a4c6e8e1fe/0/cache/@typescript-eslint-typescript-estree-npm-5.30.5-da9a64fff6-19dce426c8.zip/node_modules/@typescript-eslint/typescript-estree/",\ + "packageDependencies": [\ + ["@typescript-eslint/typescript-estree", "virtual:88ab8651a580797d7f324e37350531c263fefbb27f1fc46e5b8375e61563225250ef83ca300b659dec69914dff4206d1d1cd466001cf6db38cb5ec1e1b1fed3a#npm:5.30.5"],\ + ["@types/typescript", null],\ + ["@typescript-eslint/types", "npm:5.30.5"],\ + ["@typescript-eslint/visitor-keys", "npm:5.30.5"],\ + ["debug", "virtual:b86a9fb34323a98c6519528ed55faa0d9b44ca8879307c0b29aa384bde47ff59a7d0c9051b31246f14521dfb71ba3c5d6d0b35c29fffc17bf875aa6ad977d9e8#npm:4.3.4"],\ + ["globby", "npm:11.1.0"],\ + ["is-glob", "npm:4.0.3"],\ + ["semver", "npm:7.3.7"],\ + ["tsutils", "virtual:a701e8faf4c6b245fc4985636d3e7eecbb676ed70fff3464fce6c7a5aa8af393ac6dd3e22dcae90cbadce31aca3a1e26eaf8eb9018d00366ec052b25723c6bb7#npm:3.21.0"],\ + ["typescript", null]\ + ],\ + "packagePeers": [\ + "@types/typescript",\ + "typescript"\ + ],\ + "linkType": "HARD"\ }]\ ]],\ ["@typescript-eslint/utils", [\ @@ -3931,7 +3944,7 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { ["@types/json-schema", "npm:7.0.11"],\ ["@typescript-eslint/scope-manager", "npm:5.30.5"],\ ["@typescript-eslint/types", "npm:5.30.5"],\ - ["@typescript-eslint/typescript-estree", "virtual:1281b5976fbd82a752119e842b46851390eb21d1e1e09890d105307e2f5a80ccdcfc8d06824747c753b2641692a6ca83a19921bf85e2a330147b1187f624d2de#npm:5.30.5"],\ + ["@typescript-eslint/typescript-estree", "virtual:88ab8651a580797d7f324e37350531c263fefbb27f1fc46e5b8375e61563225250ef83ca300b659dec69914dff4206d1d1cd466001cf6db38cb5ec1e1b1fed3a#npm:5.30.5"],\ ["eslint", "npm:8.19.0"],\ ["eslint-scope", "npm:5.1.1"],\ ["eslint-utils", "virtual:147f1e0c86a84d48481240b8e403f896c0a34824f0fc1ec5f4df888495cb5f88fc2038bd76184debe0641b1891aeae2a4c3b5d4709f3d70958d507af9ee17e38#npm:3.0.0"]\ @@ -3942,18 +3955,18 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { ],\ "linkType": "HARD"\ }],\ - ["virtual:a494d2d5cb9c7415bd516909b7bd7e445ce3cd777e25a22b31a8c08b68b78f647b57e72ac5429a893f70d7a8705296469270e9532e56532dac63f2edc052dcec#npm:5.30.5", {\ - "packageLocation": "./.yarn/__virtual__/@typescript-eslint-utils-virtual-1281b5976f/0/cache/@typescript-eslint-utils-npm-5.30.5-4cd4c166a4-12f68cb34a.zip/node_modules/@typescript-eslint/utils/",\ + ["virtual:a701e8faf4c6b245fc4985636d3e7eecbb676ed70fff3464fce6c7a5aa8af393ac6dd3e22dcae90cbadce31aca3a1e26eaf8eb9018d00366ec052b25723c6bb7#npm:5.30.5", {\ + "packageLocation": "./.yarn/__virtual__/@typescript-eslint-utils-virtual-88ab8651a5/0/cache/@typescript-eslint-utils-npm-5.30.5-4cd4c166a4-12f68cb34a.zip/node_modules/@typescript-eslint/utils/",\ "packageDependencies": [\ - ["@typescript-eslint/utils", "virtual:a494d2d5cb9c7415bd516909b7bd7e445ce3cd777e25a22b31a8c08b68b78f647b57e72ac5429a893f70d7a8705296469270e9532e56532dac63f2edc052dcec#npm:5.30.5"],\ + ["@typescript-eslint/utils", "virtual:a701e8faf4c6b245fc4985636d3e7eecbb676ed70fff3464fce6c7a5aa8af393ac6dd3e22dcae90cbadce31aca3a1e26eaf8eb9018d00366ec052b25723c6bb7#npm:5.30.5"],\ ["@types/eslint", null],\ ["@types/json-schema", "npm:7.0.11"],\ ["@typescript-eslint/scope-manager", "npm:5.30.5"],\ ["@typescript-eslint/types", "npm:5.30.5"],\ - ["@typescript-eslint/typescript-estree", "virtual:1281b5976fbd82a752119e842b46851390eb21d1e1e09890d105307e2f5a80ccdcfc8d06824747c753b2641692a6ca83a19921bf85e2a330147b1187f624d2de#npm:5.30.5"],\ + ["@typescript-eslint/typescript-estree", "virtual:88ab8651a580797d7f324e37350531c263fefbb27f1fc46e5b8375e61563225250ef83ca300b659dec69914dff4206d1d1cd466001cf6db38cb5ec1e1b1fed3a#npm:5.30.5"],\ ["eslint", null],\ ["eslint-scope", "npm:5.1.1"],\ - ["eslint-utils", "virtual:1281b5976fbd82a752119e842b46851390eb21d1e1e09890d105307e2f5a80ccdcfc8d06824747c753b2641692a6ca83a19921bf85e2a330147b1187f624d2de#npm:3.0.0"]\ + ["eslint-utils", "virtual:88ab8651a580797d7f324e37350531c263fefbb27f1fc46e5b8375e61563225250ef83ca300b659dec69914dff4206d1d1cd466001cf6db38cb5ec1e1b1fed3a#npm:3.0.0"]\ ],\ "packagePeers": [\ "@types/eslint",\ @@ -4395,16 +4408,16 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { ],\ "linkType": "SOFT"\ }],\ - ["virtual:a24dc55c5dd62abb88a73921af3adf8502401e72c334de4c256bcadbdc068fb706f214d757eba0fc6b6c20e5ed85a18f5051f3cd660235135a0c1fee54fffb8c#npm:27.5.1", {\ - "packageLocation": "./.yarn/__virtual__/babel-jest-virtual-3804e7a60d/0/cache/babel-jest-npm-27.5.1-f9f56b9874-4e93e6e9fb.zip/node_modules/babel-jest/",\ + ["virtual:40a1f22d62967c1a5e506a20b4b59bbf57213d123cfe52d5abffe5a04d68888799548b167e263cac1d3ddc276c692811bc4903ff03b9542b4415b753dcc34480#npm:27.5.1", {\ + "packageLocation": "./.yarn/__virtual__/babel-jest-virtual-573065ef02/0/cache/babel-jest-npm-27.5.1-f9f56b9874-4e93e6e9fb.zip/node_modules/babel-jest/",\ "packageDependencies": [\ - ["babel-jest", "virtual:a24dc55c5dd62abb88a73921af3adf8502401e72c334de4c256bcadbdc068fb706f214d757eba0fc6b6c20e5ed85a18f5051f3cd660235135a0c1fee54fffb8c#npm:27.5.1"],\ + ["babel-jest", "virtual:40a1f22d62967c1a5e506a20b4b59bbf57213d123cfe52d5abffe5a04d68888799548b167e263cac1d3ddc276c692811bc4903ff03b9542b4415b753dcc34480#npm:27.5.1"],\ ["@babel/core", "npm:7.18.6"],\ ["@jest/transform", "npm:27.5.1"],\ ["@jest/types", "npm:27.5.1"],\ ["@types/babel__core", "npm:7.1.19"],\ ["babel-plugin-istanbul", "npm:6.1.1"],\ - ["babel-preset-jest", "virtual:3804e7a60dc0e2215023b7290ed9a9352aff66b6a7636682b6b6feb0961fbcf56c69b29949fb6467c5a1f7291596c4c7aa7e19834b8efa1e309401a413f5cf7c#npm:27.5.1"],\ + ["babel-preset-jest", "virtual:573065ef025ab27087967f3a27f3e432eaf593596cd91786bb6fa5231c08a9c512eb49276c1827c58d8396dc2c7628548ef506fd5a35aff76277157312dc646c#npm:27.5.1"],\ ["chalk", "npm:4.1.2"],\ ["graceful-fs", "npm:4.2.10"],\ ["slash", "npm:3.0.0"]\ @@ -4479,23 +4492,23 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { ],\ "linkType": "SOFT"\ }],\ - ["virtual:bba36ad8da86cb026253ddaf7aaa7bf35f45c66ae110da25fc98166d9d71262f1e7b006e7858dd28823aadc68026f2d09de803e9560f6f9644e8ee8e8af481a1#npm:1.0.1", {\ - "packageLocation": "./.yarn/__virtual__/babel-preset-current-node-syntax-virtual-3f0e0a8592/0/cache/babel-preset-current-node-syntax-npm-1.0.1-849ec71e32-d118c27424.zip/node_modules/babel-preset-current-node-syntax/",\ + ["virtual:40759046f1bb1d8dec680b32f0b987d426f96097d45ae8725af27fc0b0632dee7c6248adaea753839c46e3fb4b4cfeefbab1330adb668dfdf7d17c525a16da8a#npm:1.0.1", {\ + "packageLocation": "./.yarn/__virtual__/babel-preset-current-node-syntax-virtual-5c57728fda/0/cache/babel-preset-current-node-syntax-npm-1.0.1-849ec71e32-d118c27424.zip/node_modules/babel-preset-current-node-syntax/",\ "packageDependencies": [\ - ["babel-preset-current-node-syntax", "virtual:bba36ad8da86cb026253ddaf7aaa7bf35f45c66ae110da25fc98166d9d71262f1e7b006e7858dd28823aadc68026f2d09de803e9560f6f9644e8ee8e8af481a1#npm:1.0.1"],\ + ["babel-preset-current-node-syntax", "virtual:40759046f1bb1d8dec680b32f0b987d426f96097d45ae8725af27fc0b0632dee7c6248adaea753839c46e3fb4b4cfeefbab1330adb668dfdf7d17c525a16da8a#npm:1.0.1"],\ ["@babel/core", "npm:7.18.6"],\ - ["@babel/plugin-syntax-async-generators", "virtual:3f0e0a85921a62029800b8f2c0f068fe72af12d4635dd7e42d2f1f4eee00103f9e9c5d6e857f4ff71f9c7aacc15b0efe7ccc00ddaa7e0948bf528cb1f61ef86c#npm:7.8.4"],\ - ["@babel/plugin-syntax-bigint", "virtual:3f0e0a85921a62029800b8f2c0f068fe72af12d4635dd7e42d2f1f4eee00103f9e9c5d6e857f4ff71f9c7aacc15b0efe7ccc00ddaa7e0948bf528cb1f61ef86c#npm:7.8.3"],\ - ["@babel/plugin-syntax-class-properties", "virtual:3f0e0a85921a62029800b8f2c0f068fe72af12d4635dd7e42d2f1f4eee00103f9e9c5d6e857f4ff71f9c7aacc15b0efe7ccc00ddaa7e0948bf528cb1f61ef86c#npm:7.12.13"],\ - ["@babel/plugin-syntax-import-meta", "virtual:3f0e0a85921a62029800b8f2c0f068fe72af12d4635dd7e42d2f1f4eee00103f9e9c5d6e857f4ff71f9c7aacc15b0efe7ccc00ddaa7e0948bf528cb1f61ef86c#npm:7.10.4"],\ - ["@babel/plugin-syntax-json-strings", "virtual:3f0e0a85921a62029800b8f2c0f068fe72af12d4635dd7e42d2f1f4eee00103f9e9c5d6e857f4ff71f9c7aacc15b0efe7ccc00ddaa7e0948bf528cb1f61ef86c#npm:7.8.3"],\ - ["@babel/plugin-syntax-logical-assignment-operators", "virtual:3f0e0a85921a62029800b8f2c0f068fe72af12d4635dd7e42d2f1f4eee00103f9e9c5d6e857f4ff71f9c7aacc15b0efe7ccc00ddaa7e0948bf528cb1f61ef86c#npm:7.10.4"],\ - ["@babel/plugin-syntax-nullish-coalescing-operator", "virtual:3f0e0a85921a62029800b8f2c0f068fe72af12d4635dd7e42d2f1f4eee00103f9e9c5d6e857f4ff71f9c7aacc15b0efe7ccc00ddaa7e0948bf528cb1f61ef86c#npm:7.8.3"],\ - ["@babel/plugin-syntax-numeric-separator", "virtual:3f0e0a85921a62029800b8f2c0f068fe72af12d4635dd7e42d2f1f4eee00103f9e9c5d6e857f4ff71f9c7aacc15b0efe7ccc00ddaa7e0948bf528cb1f61ef86c#npm:7.10.4"],\ - ["@babel/plugin-syntax-object-rest-spread", "virtual:3f0e0a85921a62029800b8f2c0f068fe72af12d4635dd7e42d2f1f4eee00103f9e9c5d6e857f4ff71f9c7aacc15b0efe7ccc00ddaa7e0948bf528cb1f61ef86c#npm:7.8.3"],\ - ["@babel/plugin-syntax-optional-catch-binding", "virtual:3f0e0a85921a62029800b8f2c0f068fe72af12d4635dd7e42d2f1f4eee00103f9e9c5d6e857f4ff71f9c7aacc15b0efe7ccc00ddaa7e0948bf528cb1f61ef86c#npm:7.8.3"],\ - ["@babel/plugin-syntax-optional-chaining", "virtual:3f0e0a85921a62029800b8f2c0f068fe72af12d4635dd7e42d2f1f4eee00103f9e9c5d6e857f4ff71f9c7aacc15b0efe7ccc00ddaa7e0948bf528cb1f61ef86c#npm:7.8.3"],\ - ["@babel/plugin-syntax-top-level-await", "virtual:3f0e0a85921a62029800b8f2c0f068fe72af12d4635dd7e42d2f1f4eee00103f9e9c5d6e857f4ff71f9c7aacc15b0efe7ccc00ddaa7e0948bf528cb1f61ef86c#npm:7.14.5"],\ + ["@babel/plugin-syntax-async-generators", "virtual:5c57728fdafd275fbceb3333cd469b7d71caf5fff87ea726fbfb2e82fced070ef689d0532e794e122b27fd916e42ed309a23709515b5ddb5c12cd35d573e0609#npm:7.8.4"],\ + ["@babel/plugin-syntax-bigint", "virtual:5c57728fdafd275fbceb3333cd469b7d71caf5fff87ea726fbfb2e82fced070ef689d0532e794e122b27fd916e42ed309a23709515b5ddb5c12cd35d573e0609#npm:7.8.3"],\ + ["@babel/plugin-syntax-class-properties", "virtual:5c57728fdafd275fbceb3333cd469b7d71caf5fff87ea726fbfb2e82fced070ef689d0532e794e122b27fd916e42ed309a23709515b5ddb5c12cd35d573e0609#npm:7.12.13"],\ + ["@babel/plugin-syntax-import-meta", "virtual:5c57728fdafd275fbceb3333cd469b7d71caf5fff87ea726fbfb2e82fced070ef689d0532e794e122b27fd916e42ed309a23709515b5ddb5c12cd35d573e0609#npm:7.10.4"],\ + ["@babel/plugin-syntax-json-strings", "virtual:5c57728fdafd275fbceb3333cd469b7d71caf5fff87ea726fbfb2e82fced070ef689d0532e794e122b27fd916e42ed309a23709515b5ddb5c12cd35d573e0609#npm:7.8.3"],\ + ["@babel/plugin-syntax-logical-assignment-operators", "virtual:5c57728fdafd275fbceb3333cd469b7d71caf5fff87ea726fbfb2e82fced070ef689d0532e794e122b27fd916e42ed309a23709515b5ddb5c12cd35d573e0609#npm:7.10.4"],\ + ["@babel/plugin-syntax-nullish-coalescing-operator", "virtual:5c57728fdafd275fbceb3333cd469b7d71caf5fff87ea726fbfb2e82fced070ef689d0532e794e122b27fd916e42ed309a23709515b5ddb5c12cd35d573e0609#npm:7.8.3"],\ + ["@babel/plugin-syntax-numeric-separator", "virtual:5c57728fdafd275fbceb3333cd469b7d71caf5fff87ea726fbfb2e82fced070ef689d0532e794e122b27fd916e42ed309a23709515b5ddb5c12cd35d573e0609#npm:7.10.4"],\ + ["@babel/plugin-syntax-object-rest-spread", "virtual:5c57728fdafd275fbceb3333cd469b7d71caf5fff87ea726fbfb2e82fced070ef689d0532e794e122b27fd916e42ed309a23709515b5ddb5c12cd35d573e0609#npm:7.8.3"],\ + ["@babel/plugin-syntax-optional-catch-binding", "virtual:5c57728fdafd275fbceb3333cd469b7d71caf5fff87ea726fbfb2e82fced070ef689d0532e794e122b27fd916e42ed309a23709515b5ddb5c12cd35d573e0609#npm:7.8.3"],\ + ["@babel/plugin-syntax-optional-chaining", "virtual:5c57728fdafd275fbceb3333cd469b7d71caf5fff87ea726fbfb2e82fced070ef689d0532e794e122b27fd916e42ed309a23709515b5ddb5c12cd35d573e0609#npm:7.8.3"],\ + ["@babel/plugin-syntax-top-level-await", "virtual:5c57728fdafd275fbceb3333cd469b7d71caf5fff87ea726fbfb2e82fced070ef689d0532e794e122b27fd916e42ed309a23709515b5ddb5c12cd35d573e0609#npm:7.14.5"],\ ["@types/babel__core", "npm:7.1.19"]\ ],\ "packagePeers": [\ @@ -4504,23 +4517,23 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { ],\ "linkType": "HARD"\ }],\ - ["virtual:c457ca7d89b3ce4fafd02cf50646d9e37f211d427f3f27797953e7a92557db37294a7870524ffb7409853e4b8596de76f717ae526807c30a6a10d30f4752bbaa#npm:1.0.1", {\ - "packageLocation": "./.yarn/__virtual__/babel-preset-current-node-syntax-virtual-88e8afac18/0/cache/babel-preset-current-node-syntax-npm-1.0.1-849ec71e32-d118c27424.zip/node_modules/babel-preset-current-node-syntax/",\ + ["virtual:b26687beb2614ce39983d45755ee1addcfe600e4f0030ebc42cd973d8bc10089112f81ea1266f3ec074ad029140ad57839a71eecdae7a68945739b618ffcfb74#npm:1.0.1", {\ + "packageLocation": "./.yarn/__virtual__/babel-preset-current-node-syntax-virtual-f9e5bbd48d/0/cache/babel-preset-current-node-syntax-npm-1.0.1-849ec71e32-d118c27424.zip/node_modules/babel-preset-current-node-syntax/",\ "packageDependencies": [\ - ["babel-preset-current-node-syntax", "virtual:c457ca7d89b3ce4fafd02cf50646d9e37f211d427f3f27797953e7a92557db37294a7870524ffb7409853e4b8596de76f717ae526807c30a6a10d30f4752bbaa#npm:1.0.1"],\ + ["babel-preset-current-node-syntax", "virtual:b26687beb2614ce39983d45755ee1addcfe600e4f0030ebc42cd973d8bc10089112f81ea1266f3ec074ad029140ad57839a71eecdae7a68945739b618ffcfb74#npm:1.0.1"],\ ["@babel/core", "npm:7.18.6"],\ - ["@babel/plugin-syntax-async-generators", "virtual:88e8afac1808a7ea0495137247f12972bf8ff63736df3d967463d45fc3283fee7228e733a51043455f37a32513ebc5254c7a990a2e48a581ba95e0dd0bee457b#npm:7.8.4"],\ - ["@babel/plugin-syntax-bigint", "virtual:88e8afac1808a7ea0495137247f12972bf8ff63736df3d967463d45fc3283fee7228e733a51043455f37a32513ebc5254c7a990a2e48a581ba95e0dd0bee457b#npm:7.8.3"],\ - ["@babel/plugin-syntax-class-properties", "virtual:88e8afac1808a7ea0495137247f12972bf8ff63736df3d967463d45fc3283fee7228e733a51043455f37a32513ebc5254c7a990a2e48a581ba95e0dd0bee457b#npm:7.12.13"],\ - ["@babel/plugin-syntax-import-meta", "virtual:88e8afac1808a7ea0495137247f12972bf8ff63736df3d967463d45fc3283fee7228e733a51043455f37a32513ebc5254c7a990a2e48a581ba95e0dd0bee457b#npm:7.10.4"],\ - ["@babel/plugin-syntax-json-strings", "virtual:88e8afac1808a7ea0495137247f12972bf8ff63736df3d967463d45fc3283fee7228e733a51043455f37a32513ebc5254c7a990a2e48a581ba95e0dd0bee457b#npm:7.8.3"],\ - ["@babel/plugin-syntax-logical-assignment-operators", "virtual:88e8afac1808a7ea0495137247f12972bf8ff63736df3d967463d45fc3283fee7228e733a51043455f37a32513ebc5254c7a990a2e48a581ba95e0dd0bee457b#npm:7.10.4"],\ - ["@babel/plugin-syntax-nullish-coalescing-operator", "virtual:88e8afac1808a7ea0495137247f12972bf8ff63736df3d967463d45fc3283fee7228e733a51043455f37a32513ebc5254c7a990a2e48a581ba95e0dd0bee457b#npm:7.8.3"],\ - ["@babel/plugin-syntax-numeric-separator", "virtual:88e8afac1808a7ea0495137247f12972bf8ff63736df3d967463d45fc3283fee7228e733a51043455f37a32513ebc5254c7a990a2e48a581ba95e0dd0bee457b#npm:7.10.4"],\ - ["@babel/plugin-syntax-object-rest-spread", "virtual:88e8afac1808a7ea0495137247f12972bf8ff63736df3d967463d45fc3283fee7228e733a51043455f37a32513ebc5254c7a990a2e48a581ba95e0dd0bee457b#npm:7.8.3"],\ - ["@babel/plugin-syntax-optional-catch-binding", "virtual:88e8afac1808a7ea0495137247f12972bf8ff63736df3d967463d45fc3283fee7228e733a51043455f37a32513ebc5254c7a990a2e48a581ba95e0dd0bee457b#npm:7.8.3"],\ - ["@babel/plugin-syntax-optional-chaining", "virtual:88e8afac1808a7ea0495137247f12972bf8ff63736df3d967463d45fc3283fee7228e733a51043455f37a32513ebc5254c7a990a2e48a581ba95e0dd0bee457b#npm:7.8.3"],\ - ["@babel/plugin-syntax-top-level-await", "virtual:88e8afac1808a7ea0495137247f12972bf8ff63736df3d967463d45fc3283fee7228e733a51043455f37a32513ebc5254c7a990a2e48a581ba95e0dd0bee457b#npm:7.14.5"],\ + ["@babel/plugin-syntax-async-generators", "virtual:f9e5bbd48d4bfce3eb2c606acdcf754dc03f5e4ad4e0894f8faaf348a4b861acc4da61e0b37c65344963f14a484562b8e56b144ad7908e3cad8464f1ba78f5fa#npm:7.8.4"],\ + ["@babel/plugin-syntax-bigint", "virtual:f9e5bbd48d4bfce3eb2c606acdcf754dc03f5e4ad4e0894f8faaf348a4b861acc4da61e0b37c65344963f14a484562b8e56b144ad7908e3cad8464f1ba78f5fa#npm:7.8.3"],\ + ["@babel/plugin-syntax-class-properties", "virtual:f9e5bbd48d4bfce3eb2c606acdcf754dc03f5e4ad4e0894f8faaf348a4b861acc4da61e0b37c65344963f14a484562b8e56b144ad7908e3cad8464f1ba78f5fa#npm:7.12.13"],\ + ["@babel/plugin-syntax-import-meta", "virtual:f9e5bbd48d4bfce3eb2c606acdcf754dc03f5e4ad4e0894f8faaf348a4b861acc4da61e0b37c65344963f14a484562b8e56b144ad7908e3cad8464f1ba78f5fa#npm:7.10.4"],\ + ["@babel/plugin-syntax-json-strings", "virtual:f9e5bbd48d4bfce3eb2c606acdcf754dc03f5e4ad4e0894f8faaf348a4b861acc4da61e0b37c65344963f14a484562b8e56b144ad7908e3cad8464f1ba78f5fa#npm:7.8.3"],\ + ["@babel/plugin-syntax-logical-assignment-operators", "virtual:f9e5bbd48d4bfce3eb2c606acdcf754dc03f5e4ad4e0894f8faaf348a4b861acc4da61e0b37c65344963f14a484562b8e56b144ad7908e3cad8464f1ba78f5fa#npm:7.10.4"],\ + ["@babel/plugin-syntax-nullish-coalescing-operator", "virtual:f9e5bbd48d4bfce3eb2c606acdcf754dc03f5e4ad4e0894f8faaf348a4b861acc4da61e0b37c65344963f14a484562b8e56b144ad7908e3cad8464f1ba78f5fa#npm:7.8.3"],\ + ["@babel/plugin-syntax-numeric-separator", "virtual:f9e5bbd48d4bfce3eb2c606acdcf754dc03f5e4ad4e0894f8faaf348a4b861acc4da61e0b37c65344963f14a484562b8e56b144ad7908e3cad8464f1ba78f5fa#npm:7.10.4"],\ + ["@babel/plugin-syntax-object-rest-spread", "virtual:f9e5bbd48d4bfce3eb2c606acdcf754dc03f5e4ad4e0894f8faaf348a4b861acc4da61e0b37c65344963f14a484562b8e56b144ad7908e3cad8464f1ba78f5fa#npm:7.8.3"],\ + ["@babel/plugin-syntax-optional-catch-binding", "virtual:f9e5bbd48d4bfce3eb2c606acdcf754dc03f5e4ad4e0894f8faaf348a4b861acc4da61e0b37c65344963f14a484562b8e56b144ad7908e3cad8464f1ba78f5fa#npm:7.8.3"],\ + ["@babel/plugin-syntax-optional-chaining", "virtual:f9e5bbd48d4bfce3eb2c606acdcf754dc03f5e4ad4e0894f8faaf348a4b861acc4da61e0b37c65344963f14a484562b8e56b144ad7908e3cad8464f1ba78f5fa#npm:7.8.3"],\ + ["@babel/plugin-syntax-top-level-await", "virtual:f9e5bbd48d4bfce3eb2c606acdcf754dc03f5e4ad4e0894f8faaf348a4b861acc4da61e0b37c65344963f14a484562b8e56b144ad7908e3cad8464f1ba78f5fa#npm:7.14.5"],\ ["@types/babel__core", null]\ ],\ "packagePeers": [\ @@ -4552,7 +4565,7 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { ["@babel/core", "npm:7.18.6"],\ ["@types/babel__core", "npm:7.1.19"],\ ["babel-plugin-jest-hoist", "npm:28.1.1"],\ - ["babel-preset-current-node-syntax", "virtual:bba36ad8da86cb026253ddaf7aaa7bf35f45c66ae110da25fc98166d9d71262f1e7b006e7858dd28823aadc68026f2d09de803e9560f6f9644e8ee8e8af481a1#npm:1.0.1"]\ + ["babel-preset-current-node-syntax", "virtual:40759046f1bb1d8dec680b32f0b987d426f96097d45ae8725af27fc0b0632dee7c6248adaea753839c46e3fb4b4cfeefbab1330adb668dfdf7d17c525a16da8a#npm:1.0.1"]\ ],\ "packagePeers": [\ "@babel/core",\ @@ -4560,14 +4573,14 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { ],\ "linkType": "HARD"\ }],\ - ["virtual:3804e7a60dc0e2215023b7290ed9a9352aff66b6a7636682b6b6feb0961fbcf56c69b29949fb6467c5a1f7291596c4c7aa7e19834b8efa1e309401a413f5cf7c#npm:27.5.1", {\ - "packageLocation": "./.yarn/__virtual__/babel-preset-jest-virtual-5bc7eadf36/0/cache/babel-preset-jest-npm-27.5.1-2c76f7f68c-251bcea11c.zip/node_modules/babel-preset-jest/",\ + ["virtual:573065ef025ab27087967f3a27f3e432eaf593596cd91786bb6fa5231c08a9c512eb49276c1827c58d8396dc2c7628548ef506fd5a35aff76277157312dc646c#npm:27.5.1", {\ + "packageLocation": "./.yarn/__virtual__/babel-preset-jest-virtual-40759046f1/0/cache/babel-preset-jest-npm-27.5.1-2c76f7f68c-251bcea11c.zip/node_modules/babel-preset-jest/",\ "packageDependencies": [\ - ["babel-preset-jest", "virtual:3804e7a60dc0e2215023b7290ed9a9352aff66b6a7636682b6b6feb0961fbcf56c69b29949fb6467c5a1f7291596c4c7aa7e19834b8efa1e309401a413f5cf7c#npm:27.5.1"],\ + ["babel-preset-jest", "virtual:573065ef025ab27087967f3a27f3e432eaf593596cd91786bb6fa5231c08a9c512eb49276c1827c58d8396dc2c7628548ef506fd5a35aff76277157312dc646c#npm:27.5.1"],\ ["@babel/core", "npm:7.18.6"],\ ["@types/babel__core", "npm:7.1.19"],\ ["babel-plugin-jest-hoist", "npm:27.5.1"],\ - ["babel-preset-current-node-syntax", "virtual:bba36ad8da86cb026253ddaf7aaa7bf35f45c66ae110da25fc98166d9d71262f1e7b006e7858dd28823aadc68026f2d09de803e9560f6f9644e8ee8e8af481a1#npm:1.0.1"]\ + ["babel-preset-current-node-syntax", "virtual:40759046f1bb1d8dec680b32f0b987d426f96097d45ae8725af27fc0b0632dee7c6248adaea753839c46e3fb4b4cfeefbab1330adb668dfdf7d17c525a16da8a#npm:1.0.1"]\ ],\ "packagePeers": [\ "@babel/core",\ @@ -6460,10 +6473,10 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { ],\ "linkType": "HARD"\ }],\ - ["virtual:e1128e9ebb31076ea8e955c00397fd108ee8bf0fb2df3b2a603c510b7014a507cfa360bccf848efc1ec8c431656aa94c5ad08bcec32950bdf1278d01cd890e4f#npm:4.2.1", {\ - "packageLocation": "./.yarn/__virtual__/eslint-plugin-prettier-virtual-5679ad787c/0/cache/eslint-plugin-prettier-npm-4.2.1-ba8e1240f1-b9e839d233.zip/node_modules/eslint-plugin-prettier/",\ + ["virtual:c66bf20e88479ada0172094776519a9f51acc4731d22079b60a295bcec7ea42d5545cbce58a77a50d932bf953298799135e99707486e343da6d99ba1d167bdbd#npm:4.2.1", {\ + "packageLocation": "./.yarn/__virtual__/eslint-plugin-prettier-virtual-6a094684d1/0/cache/eslint-plugin-prettier-npm-4.2.1-ba8e1240f1-b9e839d233.zip/node_modules/eslint-plugin-prettier/",\ "packageDependencies": [\ - ["eslint-plugin-prettier", "virtual:e1128e9ebb31076ea8e955c00397fd108ee8bf0fb2df3b2a603c510b7014a507cfa360bccf848efc1ec8c431656aa94c5ad08bcec32950bdf1278d01cd890e4f#npm:4.2.1"],\ + ["eslint-plugin-prettier", "virtual:c66bf20e88479ada0172094776519a9f51acc4731d22079b60a295bcec7ea42d5545cbce58a77a50d932bf953298799135e99707486e343da6d99ba1d167bdbd#npm:4.2.1"],\ ["@types/eslint", null],\ ["@types/eslint-config-prettier", null],\ ["@types/prettier", null],\ @@ -6533,12 +6546,12 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { ],\ "linkType": "SOFT"\ }],\ - ["virtual:1281b5976fbd82a752119e842b46851390eb21d1e1e09890d105307e2f5a80ccdcfc8d06824747c753b2641692a6ca83a19921bf85e2a330147b1187f624d2de#npm:3.0.0", {\ - "packageLocation": "./.yarn/__virtual__/eslint-utils-virtual-b3632d0d58/0/cache/eslint-utils-npm-3.0.0-630b3a4013-0668fe02f5.zip/node_modules/eslint-utils/",\ + ["virtual:147f1e0c86a84d48481240b8e403f896c0a34824f0fc1ec5f4df888495cb5f88fc2038bd76184debe0641b1891aeae2a4c3b5d4709f3d70958d507af9ee17e38#npm:3.0.0", {\ + "packageLocation": "./.yarn/__virtual__/eslint-utils-virtual-dcc1d231c4/0/cache/eslint-utils-npm-3.0.0-630b3a4013-0668fe02f5.zip/node_modules/eslint-utils/",\ "packageDependencies": [\ - ["eslint-utils", "virtual:1281b5976fbd82a752119e842b46851390eb21d1e1e09890d105307e2f5a80ccdcfc8d06824747c753b2641692a6ca83a19921bf85e2a330147b1187f624d2de#npm:3.0.0"],\ + ["eslint-utils", "virtual:147f1e0c86a84d48481240b8e403f896c0a34824f0fc1ec5f4df888495cb5f88fc2038bd76184debe0641b1891aeae2a4c3b5d4709f3d70958d507af9ee17e38#npm:3.0.0"],\ ["@types/eslint", null],\ - ["eslint", null],\ + ["eslint", "npm:8.19.0"],\ ["eslint-visitor-keys", "npm:2.1.0"]\ ],\ "packagePeers": [\ @@ -6547,12 +6560,12 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { ],\ "linkType": "HARD"\ }],\ - ["virtual:147f1e0c86a84d48481240b8e403f896c0a34824f0fc1ec5f4df888495cb5f88fc2038bd76184debe0641b1891aeae2a4c3b5d4709f3d70958d507af9ee17e38#npm:3.0.0", {\ - "packageLocation": "./.yarn/__virtual__/eslint-utils-virtual-dcc1d231c4/0/cache/eslint-utils-npm-3.0.0-630b3a4013-0668fe02f5.zip/node_modules/eslint-utils/",\ + ["virtual:88ab8651a580797d7f324e37350531c263fefbb27f1fc46e5b8375e61563225250ef83ca300b659dec69914dff4206d1d1cd466001cf6db38cb5ec1e1b1fed3a#npm:3.0.0", {\ + "packageLocation": "./.yarn/__virtual__/eslint-utils-virtual-af95a3ccea/0/cache/eslint-utils-npm-3.0.0-630b3a4013-0668fe02f5.zip/node_modules/eslint-utils/",\ "packageDependencies": [\ - ["eslint-utils", "virtual:147f1e0c86a84d48481240b8e403f896c0a34824f0fc1ec5f4df888495cb5f88fc2038bd76184debe0641b1891aeae2a4c3b5d4709f3d70958d507af9ee17e38#npm:3.0.0"],\ + ["eslint-utils", "virtual:88ab8651a580797d7f324e37350531c263fefbb27f1fc46e5b8375e61563225250ef83ca300b659dec69914dff4206d1d1cd466001cf6db38cb5ec1e1b1fed3a#npm:3.0.0"],\ ["@types/eslint", null],\ - ["eslint", "npm:8.19.0"],\ + ["eslint", null],\ ["eslint-visitor-keys", "npm:2.1.0"]\ ],\ "packagePeers": [\ @@ -8406,14 +8419,14 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { ],\ "linkType": "SOFT"\ }],\ - ["virtual:685a6222c3349423674bb7f0684ba34e2ab20912010f352e04dcf707a156e13183fc382e2417cb37a60f3e7b52fd0178c53181674890e1773eb83e190dc13378#npm:27.5.1", {\ - "packageLocation": "./.yarn/__virtual__/jest-virtual-4da8bab493/0/cache/jest-npm-27.5.1-bacad4fe2a-96f1d69042.zip/node_modules/jest/",\ + ["virtual:c66bf20e88479ada0172094776519a9f51acc4731d22079b60a295bcec7ea42d5545cbce58a77a50d932bf953298799135e99707486e343da6d99ba1d167bdbd#npm:27.5.1", {\ + "packageLocation": "./.yarn/__virtual__/jest-virtual-561500c89b/0/cache/jest-npm-27.5.1-bacad4fe2a-96f1d69042.zip/node_modules/jest/",\ "packageDependencies": [\ - ["jest", "virtual:685a6222c3349423674bb7f0684ba34e2ab20912010f352e04dcf707a156e13183fc382e2417cb37a60f3e7b52fd0178c53181674890e1773eb83e190dc13378#npm:27.5.1"],\ - ["@jest/core", "virtual:4da8bab4935625c2820fbdf15dd84c6f0f24c72f612f8d458490cad6eb367cd20b930febadfe94ecf3f274e97168173373617db9c693194d2d780053e65cfd06#npm:27.5.1"],\ + ["jest", "virtual:c66bf20e88479ada0172094776519a9f51acc4731d22079b60a295bcec7ea42d5545cbce58a77a50d932bf953298799135e99707486e343da6d99ba1d167bdbd#npm:27.5.1"],\ + ["@jest/core", "virtual:561500c89be00f7cb4ddf90a2878aca2ad5df584a251ef79d09bee0ab019ca7e06ee5599a47f174e8a316decd4fb0b7c70ef1416c703ab2a350a1f3787071b88#npm:27.5.1"],\ ["@types/node-notifier", null],\ ["import-local", "npm:3.1.0"],\ - ["jest-cli", "virtual:4da8bab4935625c2820fbdf15dd84c6f0f24c72f612f8d458490cad6eb367cd20b930febadfe94ecf3f274e97168173373617db9c693194d2d780053e65cfd06#npm:27.5.1"],\ + ["jest-cli", "virtual:561500c89be00f7cb4ddf90a2878aca2ad5df584a251ef79d09bee0ab019ca7e06ee5599a47f174e8a316decd4fb0b7c70ef1416c703ab2a350a1f3787071b88#npm:27.5.1"],\ ["node-notifier", null]\ ],\ "packagePeers": [\ @@ -8530,11 +8543,11 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { ],\ "linkType": "SOFT"\ }],\ - ["virtual:4da8bab4935625c2820fbdf15dd84c6f0f24c72f612f8d458490cad6eb367cd20b930febadfe94ecf3f274e97168173373617db9c693194d2d780053e65cfd06#npm:27.5.1", {\ - "packageLocation": "./.yarn/__virtual__/jest-cli-virtual-f0bed8645a/0/cache/jest-cli-npm-27.5.1-e801369688-6c0a69fb48.zip/node_modules/jest-cli/",\ + ["virtual:561500c89be00f7cb4ddf90a2878aca2ad5df584a251ef79d09bee0ab019ca7e06ee5599a47f174e8a316decd4fb0b7c70ef1416c703ab2a350a1f3787071b88#npm:27.5.1", {\ + "packageLocation": "./.yarn/__virtual__/jest-cli-virtual-76b4da325e/0/cache/jest-cli-npm-27.5.1-e801369688-6c0a69fb48.zip/node_modules/jest-cli/",\ "packageDependencies": [\ - ["jest-cli", "virtual:4da8bab4935625c2820fbdf15dd84c6f0f24c72f612f8d458490cad6eb367cd20b930febadfe94ecf3f274e97168173373617db9c693194d2d780053e65cfd06#npm:27.5.1"],\ - ["@jest/core", "virtual:4da8bab4935625c2820fbdf15dd84c6f0f24c72f612f8d458490cad6eb367cd20b930febadfe94ecf3f274e97168173373617db9c693194d2d780053e65cfd06#npm:27.5.1"],\ + ["jest-cli", "virtual:561500c89be00f7cb4ddf90a2878aca2ad5df584a251ef79d09bee0ab019ca7e06ee5599a47f174e8a316decd4fb0b7c70ef1416c703ab2a350a1f3787071b88#npm:27.5.1"],\ + ["@jest/core", "virtual:561500c89be00f7cb4ddf90a2878aca2ad5df584a251ef79d09bee0ab019ca7e06ee5599a47f174e8a316decd4fb0b7c70ef1416c703ab2a350a1f3787071b88#npm:27.5.1"],\ ["@jest/test-result", "npm:27.5.1"],\ ["@jest/types", "npm:27.5.1"],\ ["@types/node-notifier", null],\ @@ -8542,7 +8555,7 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { ["exit", "npm:0.1.2"],\ ["graceful-fs", "npm:4.2.10"],\ ["import-local", "npm:3.1.0"],\ - ["jest-config", "virtual:f55e2a37bae3791afd3855f95f0a569fbe14de7428b124244857d90ef36bccd45cc99f9f5aa3b4f337db4d54c2789ca701ec2141f52e752ffb3d9ccc8bd652bc#npm:27.5.1"],\ + ["jest-config", "virtual:4f4ff16f77dafa8fc797a688b1d64c7a7785e0f95d9557bb288efe4f7e30db51144ecbe1dee9eadc0614b04aa7f88589b216b8b4b46444764e823f7e465458fe#npm:27.5.1"],\ ["jest-util", "npm:27.5.1"],\ ["jest-validate", "npm:27.5.1"],\ ["node-notifier", null],\ @@ -8596,6 +8609,43 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { ],\ "linkType": "SOFT"\ }],\ + ["virtual:4f4ff16f77dafa8fc797a688b1d64c7a7785e0f95d9557bb288efe4f7e30db51144ecbe1dee9eadc0614b04aa7f88589b216b8b4b46444764e823f7e465458fe#npm:27.5.1", {\ + "packageLocation": "./.yarn/__virtual__/jest-config-virtual-40a1f22d62/0/cache/jest-config-npm-27.5.1-e70d159078-1188fd46c0.zip/node_modules/jest-config/",\ + "packageDependencies": [\ + ["jest-config", "virtual:4f4ff16f77dafa8fc797a688b1d64c7a7785e0f95d9557bb288efe4f7e30db51144ecbe1dee9eadc0614b04aa7f88589b216b8b4b46444764e823f7e465458fe#npm:27.5.1"],\ + ["@babel/core", "npm:7.18.6"],\ + ["@jest/test-sequencer", "npm:27.5.1"],\ + ["@jest/types", "npm:27.5.1"],\ + ["@types/ts-node", null],\ + ["babel-jest", "virtual:40a1f22d62967c1a5e506a20b4b59bbf57213d123cfe52d5abffe5a04d68888799548b167e263cac1d3ddc276c692811bc4903ff03b9542b4415b753dcc34480#npm:27.5.1"],\ + ["chalk", "npm:4.1.2"],\ + ["ci-info", "npm:3.3.2"],\ + ["deepmerge", "npm:4.2.2"],\ + ["glob", "npm:7.2.3"],\ + ["graceful-fs", "npm:4.2.10"],\ + ["jest-circus", "npm:27.5.1"],\ + ["jest-environment-jsdom", "npm:27.5.1"],\ + ["jest-environment-node", "npm:27.5.1"],\ + ["jest-get-type", "npm:27.5.1"],\ + ["jest-jasmine2", "npm:27.5.1"],\ + ["jest-regex-util", "npm:27.5.1"],\ + ["jest-resolve", "npm:27.5.1"],\ + ["jest-runner", "npm:27.5.1"],\ + ["jest-util", "npm:27.5.1"],\ + ["jest-validate", "npm:27.5.1"],\ + ["micromatch", "npm:4.0.5"],\ + ["parse-json", "npm:5.2.0"],\ + ["pretty-format", "npm:27.5.1"],\ + ["slash", "npm:3.0.0"],\ + ["strip-json-comments", "npm:3.1.1"],\ + ["ts-node", null]\ + ],\ + "packagePeers": [\ + "@types/ts-node",\ + "ts-node"\ + ],\ + "linkType": "HARD"\ + }],\ ["virtual:8f4947e08dcb45735ee77d5a260b2310de3268f5b92b94a6efcc47099caf8f899f9b32c9bf1d08502d4053db389564a0affa1806edcdb359e723d94d9eb6dead#npm:28.1.2", {\ "packageLocation": "./.yarn/__virtual__/jest-config-virtual-27612d1c64/0/cache/jest-config-npm-28.1.2-56df4d8edb-ddc4de7a28.zip/node_modules/jest-config/",\ "packageDependencies": [\ @@ -8669,43 +8719,6 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { "ts-node"\ ],\ "linkType": "HARD"\ - }],\ - ["virtual:f55e2a37bae3791afd3855f95f0a569fbe14de7428b124244857d90ef36bccd45cc99f9f5aa3b4f337db4d54c2789ca701ec2141f52e752ffb3d9ccc8bd652bc#npm:27.5.1", {\ - "packageLocation": "./.yarn/__virtual__/jest-config-virtual-a24dc55c5d/0/cache/jest-config-npm-27.5.1-e70d159078-1188fd46c0.zip/node_modules/jest-config/",\ - "packageDependencies": [\ - ["jest-config", "virtual:f55e2a37bae3791afd3855f95f0a569fbe14de7428b124244857d90ef36bccd45cc99f9f5aa3b4f337db4d54c2789ca701ec2141f52e752ffb3d9ccc8bd652bc#npm:27.5.1"],\ - ["@babel/core", "npm:7.18.6"],\ - ["@jest/test-sequencer", "npm:27.5.1"],\ - ["@jest/types", "npm:27.5.1"],\ - ["@types/ts-node", null],\ - ["babel-jest", "virtual:a24dc55c5dd62abb88a73921af3adf8502401e72c334de4c256bcadbdc068fb706f214d757eba0fc6b6c20e5ed85a18f5051f3cd660235135a0c1fee54fffb8c#npm:27.5.1"],\ - ["chalk", "npm:4.1.2"],\ - ["ci-info", "npm:3.3.2"],\ - ["deepmerge", "npm:4.2.2"],\ - ["glob", "npm:7.2.3"],\ - ["graceful-fs", "npm:4.2.10"],\ - ["jest-circus", "npm:27.5.1"],\ - ["jest-environment-jsdom", "npm:27.5.1"],\ - ["jest-environment-node", "npm:27.5.1"],\ - ["jest-get-type", "npm:27.5.1"],\ - ["jest-jasmine2", "npm:27.5.1"],\ - ["jest-regex-util", "npm:27.5.1"],\ - ["jest-resolve", "npm:27.5.1"],\ - ["jest-runner", "npm:27.5.1"],\ - ["jest-util", "npm:27.5.1"],\ - ["jest-validate", "npm:27.5.1"],\ - ["micromatch", "npm:4.0.5"],\ - ["parse-json", "npm:5.2.0"],\ - ["pretty-format", "npm:27.5.1"],\ - ["slash", "npm:3.0.0"],\ - ["strip-json-comments", "npm:3.1.1"],\ - ["ts-node", null]\ - ],\ - "packagePeers": [\ - "@types/ts-node",\ - "ts-node"\ - ],\ - "linkType": "HARD"\ }]\ ]],\ ["jest-diff", [\ @@ -9244,14 +9257,14 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { ["jest-snapshot", "npm:27.5.1"],\ ["@babel/core", "npm:7.18.6"],\ ["@babel/generator", "npm:7.18.7"],\ - ["@babel/plugin-syntax-typescript", "virtual:c457ca7d89b3ce4fafd02cf50646d9e37f211d427f3f27797953e7a92557db37294a7870524ffb7409853e4b8596de76f717ae526807c30a6a10d30f4752bbaa#npm:7.18.6"],\ + ["@babel/plugin-syntax-typescript", "virtual:b26687beb2614ce39983d45755ee1addcfe600e4f0030ebc42cd973d8bc10089112f81ea1266f3ec074ad029140ad57839a71eecdae7a68945739b618ffcfb74#npm:7.18.6"],\ ["@babel/traverse", "npm:7.18.6"],\ ["@babel/types", "npm:7.18.7"],\ ["@jest/transform", "npm:27.5.1"],\ ["@jest/types", "npm:27.5.1"],\ ["@types/babel__traverse", "npm:7.17.1"],\ ["@types/prettier", "npm:2.6.3"],\ - ["babel-preset-current-node-syntax", "virtual:c457ca7d89b3ce4fafd02cf50646d9e37f211d427f3f27797953e7a92557db37294a7870524ffb7409853e4b8596de76f717ae526807c30a6a10d30f4752bbaa#npm:1.0.1"],\ + ["babel-preset-current-node-syntax", "virtual:b26687beb2614ce39983d45755ee1addcfe600e4f0030ebc42cd973d8bc10089112f81ea1266f3ec074ad029140ad57839a71eecdae7a68945739b618ffcfb74#npm:1.0.1"],\ ["chalk", "npm:4.1.2"],\ ["expect", "npm:27.5.1"],\ ["graceful-fs", "npm:4.2.10"],\ @@ -9273,7 +9286,7 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { ["jest-snapshot", "npm:28.1.2"],\ ["@babel/core", "npm:7.18.6"],\ ["@babel/generator", "npm:7.18.7"],\ - ["@babel/plugin-syntax-typescript", "virtual:c457ca7d89b3ce4fafd02cf50646d9e37f211d427f3f27797953e7a92557db37294a7870524ffb7409853e4b8596de76f717ae526807c30a6a10d30f4752bbaa#npm:7.18.6"],\ + ["@babel/plugin-syntax-typescript", "virtual:b26687beb2614ce39983d45755ee1addcfe600e4f0030ebc42cd973d8bc10089112f81ea1266f3ec074ad029140ad57839a71eecdae7a68945739b618ffcfb74#npm:7.18.6"],\ ["@babel/traverse", "npm:7.18.6"],\ ["@babel/types", "npm:7.18.7"],\ ["@jest/expect-utils", "npm:28.1.1"],\ @@ -9281,7 +9294,7 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { ["@jest/types", "npm:28.1.1"],\ ["@types/babel__traverse", "npm:7.17.1"],\ ["@types/prettier", "npm:2.6.3"],\ - ["babel-preset-current-node-syntax", "virtual:c457ca7d89b3ce4fafd02cf50646d9e37f211d427f3f27797953e7a92557db37294a7870524ffb7409853e4b8596de76f717ae526807c30a6a10d30f4752bbaa#npm:1.0.1"],\ + ["babel-preset-current-node-syntax", "virtual:b26687beb2614ce39983d45755ee1addcfe600e4f0030ebc42cd973d8bc10089112f81ea1266f3ec074ad029140ad57839a71eecdae7a68945739b618ffcfb74#npm:1.0.1"],\ ["chalk", "npm:4.1.2"],\ ["expect", "npm:28.1.1"],\ ["graceful-fs", "npm:4.2.10"],\ @@ -13329,10 +13342,10 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { ],\ "linkType": "SOFT"\ }],\ - ["virtual:685a6222c3349423674bb7f0684ba34e2ab20912010f352e04dcf707a156e13183fc382e2417cb37a60f3e7b52fd0178c53181674890e1773eb83e190dc13378#npm:27.1.5", {\ - "packageLocation": "./.yarn/__virtual__/ts-jest-virtual-9ecc793579/0/cache/ts-jest-npm-27.1.5-6f0b4fcb08-3ef51c538b.zip/node_modules/ts-jest/",\ + ["virtual:c66bf20e88479ada0172094776519a9f51acc4731d22079b60a295bcec7ea42d5545cbce58a77a50d932bf953298799135e99707486e343da6d99ba1d167bdbd#npm:27.1.5", {\ + "packageLocation": "./.yarn/__virtual__/ts-jest-virtual-60afd746e1/0/cache/ts-jest-npm-27.1.5-6f0b4fcb08-3ef51c538b.zip/node_modules/ts-jest/",\ "packageDependencies": [\ - ["ts-jest", "virtual:685a6222c3349423674bb7f0684ba34e2ab20912010f352e04dcf707a156e13183fc382e2417cb37a60f3e7b52fd0178c53181674890e1773eb83e190dc13378#npm:27.1.5"],\ + ["ts-jest", "virtual:c66bf20e88479ada0172094776519a9f51acc4731d22079b60a295bcec7ea42d5545cbce58a77a50d932bf953298799135e99707486e343da6d99ba1d167bdbd#npm:27.1.5"],\ ["@babel/core", null],\ ["@types/babel-jest", null],\ ["@types/babel__core", null],\ @@ -13343,7 +13356,7 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { ["bs-logger", "npm:0.2.6"],\ ["esbuild", null],\ ["fast-json-stable-stringify", "npm:2.1.0"],\ - ["jest", "virtual:685a6222c3349423674bb7f0684ba34e2ab20912010f352e04dcf707a156e13183fc382e2417cb37a60f3e7b52fd0178c53181674890e1773eb83e190dc13378#npm:27.5.1"],\ + ["jest", "virtual:c66bf20e88479ada0172094776519a9f51acc4731d22079b60a295bcec7ea42d5545cbce58a77a50d932bf953298799135e99707486e343da6d99ba1d167bdbd#npm:27.5.1"],\ ["jest-util", "npm:27.5.1"],\ ["json5", "npm:2.2.1"],\ ["lodash.memoize", "npm:4.1.2"],\ @@ -13509,10 +13522,10 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { ],\ "linkType": "SOFT"\ }],\ - ["virtual:a494d2d5cb9c7415bd516909b7bd7e445ce3cd777e25a22b31a8c08b68b78f647b57e72ac5429a893f70d7a8705296469270e9532e56532dac63f2edc052dcec#npm:3.21.0", {\ - "packageLocation": "./.yarn/__virtual__/tsutils-virtual-5df27aa47b/0/cache/tsutils-npm-3.21.0-347e6636c5-1843f4c1b2.zip/node_modules/tsutils/",\ + ["virtual:a701e8faf4c6b245fc4985636d3e7eecbb676ed70fff3464fce6c7a5aa8af393ac6dd3e22dcae90cbadce31aca3a1e26eaf8eb9018d00366ec052b25723c6bb7#npm:3.21.0", {\ + "packageLocation": "./.yarn/__virtual__/tsutils-virtual-4499967331/0/cache/tsutils-npm-3.21.0-347e6636c5-1843f4c1b2.zip/node_modules/tsutils/",\ "packageDependencies": [\ - ["tsutils", "virtual:a494d2d5cb9c7415bd516909b7bd7e445ce3cd777e25a22b31a8c08b68b78f647b57e72ac5429a893f70d7a8705296469270e9532e56532dac63f2edc052dcec#npm:3.21.0"],\ + ["tsutils", "virtual:a701e8faf4c6b245fc4985636d3e7eecbb676ed70fff3464fce6c7a5aa8af393ac6dd3e22dcae90cbadce31aca3a1e26eaf8eb9018d00366ec052b25723c6bb7#npm:3.21.0"],\ ["@types/typescript", null],\ ["tslib", "npm:1.14.1"],\ ["typescript", null]\ diff --git a/.yarn/cache/@standardnotes-analytics-npm-1.6.0-39bec110e3-6a5e861526.zip b/.yarn/cache/@standardnotes-analytics-npm-1.6.0-39bec110e3-6a5e861526.zip deleted file mode 100644 index 548cea7a8e4ac43cc60101fe6826718b0e3b0bb8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18606 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 QpnplADE0XIo($~&0Pp9d0ssI2 diff --git a/packages/analytics/.eslintignore b/packages/analytics/.eslintignore new file mode 100644 index 000000000..1521c8b76 --- /dev/null +++ b/packages/analytics/.eslintignore @@ -0,0 +1 @@ +dist diff --git a/packages/analytics/.eslintrc b/packages/analytics/.eslintrc new file mode 100644 index 000000000..cb7136174 --- /dev/null +++ b/packages/analytics/.eslintrc @@ -0,0 +1,6 @@ +{ + "extends": "../../.eslintrc", + "parserOptions": { + "project": "./linter.tsconfig.json" + } +} diff --git a/packages/analytics/CHANGELOG.md b/packages/analytics/CHANGELOG.md new file mode 100644 index 000000000..63a480cfb --- /dev/null +++ b/packages/analytics/CHANGELOG.md @@ -0,0 +1,86 @@ +# Change Log + +All notable changes to this project will be documented in this file. +See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. + +## [1.6.1](https://github.com/standardnotes/snjs/compare/@standardnotes/analytics@1.6.0...@standardnotes/analytics@1.6.1) (2022-07-04) + +### Bug Fixes + +* add missing reflect-metadata package to all packages ([ce3a5bb](https://github.com/standardnotes/snjs/commit/ce3a5bbf3f1d2276ac4abc3eec3c6a44c8c3ba9b)) + +# [1.6.0](https://github.com/standardnotes/snjs/compare/@standardnotes/analytics@1.5.0...@standardnotes/analytics@1.6.0) (2022-06-02) + +### Features + +* refactor analytics store to handle different periods of time ([00d4f3f](https://github.com/standardnotes/snjs/commit/00d4f3f2f742b0deb5ef4cd415c672574cb3a911)) + +# [1.5.0](https://github.com/standardnotes/snjs/compare/@standardnotes/analytics@1.4.1...@standardnotes/analytics@1.5.0) (2022-06-01) + +### Features + +* add unmarking activities ([09cea1d](https://github.com/standardnotes/snjs/commit/09cea1d8e97dd83f2eaafaef5ff680aef8c5c3ff)) + +## [1.4.1](https://github.com/standardnotes/snjs/compare/@standardnotes/analytics@1.4.0...@standardnotes/analytics@1.4.1) (2022-06-01) + +### Bug Fixes + +* rename analytics activity backup to email backup ([30d2db6](https://github.com/standardnotes/snjs/commit/30d2db63e5dec05b3f0976211c661d8aa0e04139)) + +# [1.4.0](https://github.com/standardnotes/snjs/compare/@standardnotes/analytics@1.3.1...@standardnotes/analytics@1.4.0) (2022-06-01) + +### Features + +* add calculating total counts of activites in analytics ([6ed659a](https://github.com/standardnotes/snjs/commit/6ed659a7c4411ce2555e4af96dc5473c3d03fd41)) + +## [1.3.1](https://github.com/standardnotes/snjs/compare/@standardnotes/analytics@1.3.0...@standardnotes/analytics@1.3.1) (2022-05-26) + +### Bug Fixes + +* add backup analytics activity ([cf7ae68](https://github.com/standardnotes/snjs/commit/cf7ae68e13aa9403702340da8a3bca35e9273784)) + +# [1.3.0](https://github.com/standardnotes/snjs/compare/@standardnotes/analytics@1.2.0...@standardnotes/analytics@1.3.0) (2022-05-26) + +### Features + +* add calculating activity retention in analytics ([bc2f26d](https://github.com/standardnotes/snjs/commit/bc2f26d63a8ff0e2750b37bc1ee56297f6a8c98d)) + +# [1.2.0](https://github.com/standardnotes/snjs/compare/@standardnotes/analytics@1.1.0...@standardnotes/analytics@1.2.0) (2022-05-26) + +### Features + +* add activity indicators in analytics ([e6f5b5a](https://github.com/standardnotes/snjs/commit/e6f5b5afbff1f5f96adfcba42f4708fa74ac7f80)) + +# [1.1.0](https://github.com/standardnotes/snjs/compare/@standardnotes/analytics@1.0.7...@standardnotes/analytics@1.1.0) (2022-05-24) + +### Features + +* add marking activity in analytics ([#750](https://github.com/standardnotes/snjs/issues/750)) ([2a68fa6](https://github.com/standardnotes/snjs/commit/2a68fa6636c24e79443359d31a8427d50ca87cca)) + +## [1.0.7](https://github.com/standardnotes/snjs/compare/@standardnotes/analytics@1.0.5...@standardnotes/analytics@1.0.7) (2022-05-04) + +**Note:** Version bump only for package @standardnotes/analytics + +## [1.0.6](https://github.com/standardnotes/snjs/compare/@standardnotes/analytics@1.0.5...@standardnotes/analytics@1.0.6) (2022-05-04) + +**Note:** Version bump only for package @standardnotes/analytics + +## [1.0.5](https://github.com/standardnotes/snjs/compare/@standardnotes/analytics@1.0.4...@standardnotes/analytics@1.0.5) (2022-04-22) + +**Note:** Version bump only for package @standardnotes/analytics + +## [1.0.4](https://github.com/standardnotes/snjs/compare/@standardnotes/analytics@1.0.3...@standardnotes/analytics@1.0.4) (2022-04-15) + +**Note:** Version bump only for package @standardnotes/analytics + +## [1.0.3](https://github.com/standardnotes/snjs/compare/@standardnotes/analytics@1.0.2...@standardnotes/analytics@1.0.3) (2022-04-11) + +**Note:** Version bump only for package @standardnotes/analytics + +## [1.0.2](https://github.com/standardnotes/snjs/compare/@standardnotes/analytics@1.0.1...@standardnotes/analytics@1.0.2) (2022-03-31) + +**Note:** Version bump only for package @standardnotes/analytics + +## 1.0.1 (2022-03-10) + +**Note:** Version bump only for package @standardnotes/analytics diff --git a/packages/analytics/jest.config.js b/packages/analytics/jest.config.js new file mode 100644 index 000000000..c3dae96f3 --- /dev/null +++ b/packages/analytics/jest.config.js @@ -0,0 +1,11 @@ +// eslint-disable-next-line @typescript-eslint/no-var-requires +const base = require('../../jest.config'); + +module.exports = { + ...base, + globals: { + 'ts-jest': { + tsconfig: 'tsconfig.json', + }, + }, +}; diff --git a/packages/analytics/linter.tsconfig.json b/packages/analytics/linter.tsconfig.json new file mode 100644 index 000000000..c1a7d22c5 --- /dev/null +++ b/packages/analytics/linter.tsconfig.json @@ -0,0 +1,4 @@ +{ + "extends": "./tsconfig.json", + "exclude": ["dist"] +} diff --git a/packages/analytics/package.json b/packages/analytics/package.json new file mode 100644 index 000000000..03e3cc6f8 --- /dev/null +++ b/packages/analytics/package.json @@ -0,0 +1,39 @@ +{ + "name": "@standardnotes/analytics", + "version": "1.7.0", + "engines": { + "node": ">=14.0.0 <17.0.0" + }, + "description": "Analytics tools for Standard Notes projects", + "main": "dist/src/index.js", + "author": "Standard Notes", + "types": "dist/src/index.d.ts", + "files": [ + "dist/src" + ], + "publishConfig": { + "access": "public" + }, + "license": "AGPL-3.0-or-later", + "scripts": { + "clean": "rm -fr dist", + "prestart": "yarn clean", + "start": "tsc -p tsconfig.json --watch", + "prebuild": "yarn clean", + "build": "tsc -p tsconfig.json", + "lint": "eslint . --ext .ts", + "test:unit": "jest spec --coverage" + }, + "devDependencies": { + "@types/ioredis": "^4.28.8", + "@types/jest": "^27.4.1", + "@typescript-eslint/eslint-plugin": "^5.30.0", + "eslint-plugin-prettier": "^4.2.1", + "ioredis": "^4.28.5", + "jest": "^27.5.1", + "ts-jest": "^27.1.3" + }, + "dependencies": { + "reflect-metadata": "^0.1.13" + } +} diff --git a/packages/analytics/src/Domain/Analytics/AnalyticsActivity.ts b/packages/analytics/src/Domain/Analytics/AnalyticsActivity.ts new file mode 100644 index 000000000..3dcf74361 --- /dev/null +++ b/packages/analytics/src/Domain/Analytics/AnalyticsActivity.ts @@ -0,0 +1,6 @@ +export enum AnalyticsActivity { + EditingItems = 'editing-items', + Login = 'login', + EmailUnbackedUpData = 'email-unbacked-up-data', + EmailBackup = 'email-backup', +} diff --git a/packages/analytics/src/Domain/Analytics/AnalyticsStoreInterface.ts b/packages/analytics/src/Domain/Analytics/AnalyticsStoreInterface.ts new file mode 100644 index 000000000..2eaa7d08b --- /dev/null +++ b/packages/analytics/src/Domain/Analytics/AnalyticsStoreInterface.ts @@ -0,0 +1,10 @@ +import { Period } from '../Time/Period' +import { AnalyticsActivity } from './AnalyticsActivity' + +export interface AnalyticsStoreInterface { + unmarkActivity(activities: AnalyticsActivity[], analyticsId: number, periods: Period[]): Promise + markActivity(activities: AnalyticsActivity[], analyticsId: number, periods: Period[]): Promise + wasActivityDone(activity: AnalyticsActivity, analyticsId: number, period: Period): Promise + calculateActivityRetention(activity: AnalyticsActivity, firstPeriod: Period, secondPeriod: Period): Promise + calculateActivityTotalCount(activity: AnalyticsActivity, period: Period): Promise +} diff --git a/packages/analytics/src/Domain/Statistics/StatisticsStoreInterface.ts b/packages/analytics/src/Domain/Statistics/StatisticsStoreInterface.ts new file mode 100644 index 000000000..9dc8a09b0 --- /dev/null +++ b/packages/analytics/src/Domain/Statistics/StatisticsStoreInterface.ts @@ -0,0 +1,8 @@ +export interface StatisticsStoreInterface { + incrementSNJSVersionUsage(snjsVersion: string): Promise + incrementApplicationVersionUsage(applicationVersion: string): Promise + incrementOutOfSyncIncidents(): Promise + getYesterdaySNJSUsage(): Promise> + getYesterdayApplicationUsage(): Promise> + getYesterdayOutOfSyncIncidents(): Promise +} diff --git a/packages/analytics/src/Domain/Time/Period.ts b/packages/analytics/src/Domain/Time/Period.ts new file mode 100644 index 000000000..a648cfe95 --- /dev/null +++ b/packages/analytics/src/Domain/Time/Period.ts @@ -0,0 +1,10 @@ +export enum Period { + Today, + Yesterday, + DayBeforeYesterday, + ThisWeek, + LastWeek, + WeekBeforeLastWeek, + ThisMonth, + LastMonth, +} diff --git a/packages/analytics/src/Domain/Time/PeriodKeyGenerator.spec.ts b/packages/analytics/src/Domain/Time/PeriodKeyGenerator.spec.ts new file mode 100644 index 000000000..81ee8a98b --- /dev/null +++ b/packages/analytics/src/Domain/Time/PeriodKeyGenerator.spec.ts @@ -0,0 +1,58 @@ +import { Period } from './Period' +import { PeriodKeyGenerator } from './PeriodKeyGenerator' + +describe('PeriodKeyGenerator', () => { + const createGenerator = () => new PeriodKeyGenerator() + + beforeEach(() => { + jest.useFakeTimers('modern') + jest.setSystemTime(1653395155000) + }) + + afterEach(() => { + jest.useRealTimers() + }) + + it('should generate a period key for today', () => { + expect(createGenerator().getPeriodKey(Period.Today)).toEqual('2022-5-24') + }) + + it('should generate a period key for yesterday', () => { + expect(createGenerator().getPeriodKey(Period.Yesterday)).toEqual('2022-5-23') + }) + + it('should generate a period key for the day before yesterday', () => { + expect(createGenerator().getPeriodKey(Period.DayBeforeYesterday)).toEqual('2022-5-22') + }) + + it('should generate a period key for this week', () => { + expect(createGenerator().getPeriodKey(Period.ThisWeek)).toEqual('2022-week-21') + }) + + it('should generate a period key for last week', () => { + expect(createGenerator().getPeriodKey(Period.LastWeek)).toEqual('2022-week-20') + }) + + it('should generate a period key for the week before last week', () => { + expect(createGenerator().getPeriodKey(Period.WeekBeforeLastWeek)).toEqual('2022-week-19') + }) + + it('should generate a period key for this month', () => { + expect(createGenerator().getPeriodKey(Period.ThisMonth)).toEqual('2022-5') + }) + + it('should generate a period key for last month', () => { + expect(createGenerator().getPeriodKey(Period.LastMonth)).toEqual('2022-4') + }) + + it('should throw error on unsupported period', () => { + let error = null + try { + createGenerator().getPeriodKey(42 as Period) + } catch (caughtError) { + error = caughtError + } + + expect(error).not.toBeNull() + }) +}) diff --git a/packages/analytics/src/Domain/Time/PeriodKeyGenerator.ts b/packages/analytics/src/Domain/Time/PeriodKeyGenerator.ts new file mode 100644 index 000000000..e5eeb9499 --- /dev/null +++ b/packages/analytics/src/Domain/Time/PeriodKeyGenerator.ts @@ -0,0 +1,99 @@ +import { Period } from './Period' +import { PeriodKeyGeneratorInterface } from './PeriodKeyGeneratorInterface' + +export class PeriodKeyGenerator implements PeriodKeyGeneratorInterface { + getPeriodKey(period: Period): string { + switch (period) { + case Period.Today: + return this.getDailyKey() + case Period.Yesterday: + return this.getDailyKey(this.getYesterdayDate()) + case Period.DayBeforeYesterday: + return this.getDailyKey(this.getDayBeforeYesterdayDate()) + case Period.ThisWeek: + return this.getWeeklyKey() + case Period.LastWeek: + return this.getWeeklyKey(this.getLastWeekDate()) + case Period.WeekBeforeLastWeek: + return this.getWeeklyKey(this.getWeekBeforeLastWeekDate()) + case Period.ThisMonth: + return this.getMonthlyKey() + case Period.LastMonth: + return this.getMonthlyKey(this.getLastMonthDate()) + default: + throw new Error(`Unsuporrted period: ${period}`) + } + } + + private getMonthlyKey(date?: Date): string { + date = date ?? new Date() + + return `${this.getYear(date)}-${this.getMonth(date)}` + } + + private getDailyKey(date?: Date): string { + date = date ?? new Date() + + return `${this.getYear(date)}-${this.getMonth(date)}-${this.getDayOfTheMonth(date)}` + } + + private getWeeklyKey(date?: Date): string { + date = date ?? new Date() + + const firstJanuary = new Date(date.getFullYear(), 0, 1) + + const numberOfDaysPassed = Math.floor((date.getTime() - firstJanuary.getTime()) / (24 * 60 * 60 * 1000)) + + const weekNumber = Math.ceil((date.getDay() + 1 + numberOfDaysPassed) / 7) + + return `${this.getYear(date)}-week-${weekNumber}` + } + + private getYear(date: Date): string { + return date.getFullYear().toString() + } + + private getMonth(date: Date): string { + return (date.getMonth() + 1).toString() + } + + private getDayOfTheMonth(date: Date): string { + return date.getDate().toString() + } + + private getYesterdayDate(): Date { + const yesterday = new Date() + yesterday.setDate(new Date().getDate() - 1) + + return yesterday + } + + private getDayBeforeYesterdayDate(): Date { + const dayBeforeYesterday = new Date() + dayBeforeYesterday.setDate(new Date().getDate() - 2) + + return dayBeforeYesterday + } + + private getLastWeekDate(): Date { + const yesterday = new Date() + yesterday.setDate(new Date().getDate() - 7) + + return yesterday + } + + private getLastMonthDate(): Date { + const lastMonth = new Date() + lastMonth.setDate(1) + lastMonth.setMonth(lastMonth.getMonth() - 1) + + return lastMonth + } + + private getWeekBeforeLastWeekDate(): Date { + const yesterday = new Date() + yesterday.setDate(new Date().getDate() - 14) + + return yesterday + } +} diff --git a/packages/analytics/src/Domain/Time/PeriodKeyGeneratorInterface.ts b/packages/analytics/src/Domain/Time/PeriodKeyGeneratorInterface.ts new file mode 100644 index 000000000..f4db990a8 --- /dev/null +++ b/packages/analytics/src/Domain/Time/PeriodKeyGeneratorInterface.ts @@ -0,0 +1,5 @@ +import { Period } from './Period' + +export interface PeriodKeyGeneratorInterface { + getPeriodKey(period: Period): string +} diff --git a/packages/analytics/src/Domain/index.ts b/packages/analytics/src/Domain/index.ts new file mode 100644 index 000000000..6b92fa2bc --- /dev/null +++ b/packages/analytics/src/Domain/index.ts @@ -0,0 +1,6 @@ +export * from './Analytics/AnalyticsActivity' +export * from './Analytics/AnalyticsStoreInterface' +export * from './Statistics/StatisticsStoreInterface' +export * from './Time/Period' +export * from './Time/PeriodKeyGenerator' +export * from './Time/PeriodKeyGeneratorInterface' diff --git a/packages/analytics/src/Infra/Redis/RedisAnalyticsStore.spec.ts b/packages/analytics/src/Infra/Redis/RedisAnalyticsStore.spec.ts new file mode 100644 index 000000000..785fa7273 --- /dev/null +++ b/packages/analytics/src/Infra/Redis/RedisAnalyticsStore.spec.ts @@ -0,0 +1,131 @@ +import * as IORedis from 'ioredis' +import { Period } from '../../Domain' +import { AnalyticsActivity } from '../../Domain/Analytics/AnalyticsActivity' +import { PeriodKeyGeneratorInterface } from '../../Domain/Time/PeriodKeyGeneratorInterface' + +import { RedisAnalyticsStore } from './RedisAnalyticsStore' + +describe('RedisAnalyticsStore', () => { + let redisClient: IORedis.Redis + let pipeline: IORedis.Pipeline + let periodKeyGenerator: PeriodKeyGeneratorInterface + + const createStore = () => new RedisAnalyticsStore(periodKeyGenerator, redisClient) + + beforeEach(() => { + pipeline = {} as jest.Mocked + pipeline.incr = jest.fn() + pipeline.setbit = jest.fn() + pipeline.exec = jest.fn() + + redisClient = {} as jest.Mocked + redisClient.pipeline = jest.fn().mockReturnValue(pipeline) + redisClient.incr = jest.fn() + redisClient.setbit = jest.fn() + redisClient.getbit = jest.fn().mockReturnValue(1) + redisClient.send_command = jest.fn() + + periodKeyGenerator = {} as jest.Mocked + periodKeyGenerator.getPeriodKey = jest.fn().mockReturnValue('period-key') + }) + + it('should calculate total count of activities', async () => { + redisClient.bitcount = jest.fn().mockReturnValue(70) + + expect(await createStore().calculateActivityTotalCount(AnalyticsActivity.EditingItems, Period.Yesterday)).toEqual( + 70, + ) + + expect(redisClient.bitcount).toHaveBeenCalledWith('bitmap:action:editing-items:timespan:period-key') + }) + + it('should calculate activity retention', async () => { + redisClient.bitcount = jest.fn().mockReturnValueOnce(7).mockReturnValueOnce(10) + + expect( + await createStore().calculateActivityRetention( + AnalyticsActivity.EditingItems, + Period.DayBeforeYesterday, + Period.Yesterday, + ), + ).toEqual(70) + + expect(redisClient.send_command).toHaveBeenCalledWith( + 'BITOP', + 'AND', + 'bitmap:action:editing-items:timespan:period-key-period-key', + 'bitmap:action:editing-items:timespan:period-key', + 'bitmap:action:editing-items:timespan:period-key', + ) + }) + + it('shoud tell if activity was done', async () => { + await createStore().wasActivityDone(AnalyticsActivity.EditingItems, 123, Period.Yesterday) + + expect(redisClient.getbit).toHaveBeenCalledWith('bitmap:action:editing-items:timespan:period-key', 123) + }) + + it('should mark activity as done', async () => { + await createStore().markActivity([AnalyticsActivity.EditingItems], 123, [Period.Today]) + + expect(pipeline.setbit).toBeCalledTimes(1) + expect(pipeline.setbit).toHaveBeenNthCalledWith(1, 'bitmap:action:editing-items:timespan:period-key', 123, 1) + expect(pipeline.exec).toHaveBeenCalled() + }) + + it('should mark activities as done', async () => { + await createStore().markActivity([AnalyticsActivity.EditingItems, AnalyticsActivity.EmailUnbackedUpData], 123, [ + Period.Today, + Period.ThisWeek, + ]) + + expect(pipeline.setbit).toBeCalledTimes(4) + expect(pipeline.setbit).toHaveBeenNthCalledWith(1, 'bitmap:action:editing-items:timespan:period-key', 123, 1) + expect(pipeline.setbit).toHaveBeenNthCalledWith(2, 'bitmap:action:editing-items:timespan:period-key', 123, 1) + expect(pipeline.setbit).toHaveBeenNthCalledWith( + 3, + 'bitmap:action:email-unbacked-up-data:timespan:period-key', + 123, + 1, + ) + expect(pipeline.setbit).toHaveBeenNthCalledWith( + 4, + 'bitmap:action:email-unbacked-up-data:timespan:period-key', + 123, + 1, + ) + expect(pipeline.exec).toHaveBeenCalled() + }) + + it('should unmark activity as done', async () => { + await createStore().unmarkActivity([AnalyticsActivity.EditingItems], 123, [Period.Today]) + + expect(pipeline.setbit).toBeCalledTimes(1) + expect(pipeline.setbit).toHaveBeenNthCalledWith(1, 'bitmap:action:editing-items:timespan:period-key', 123, 0) + expect(pipeline.exec).toHaveBeenCalled() + }) + + it('should unmark activities as done', async () => { + await createStore().unmarkActivity([AnalyticsActivity.EditingItems, AnalyticsActivity.EmailUnbackedUpData], 123, [ + Period.Today, + Period.ThisWeek, + ]) + + expect(pipeline.setbit).toBeCalledTimes(4) + expect(pipeline.setbit).toHaveBeenNthCalledWith(1, 'bitmap:action:editing-items:timespan:period-key', 123, 0) + expect(pipeline.setbit).toHaveBeenNthCalledWith(2, 'bitmap:action:editing-items:timespan:period-key', 123, 0) + expect(pipeline.setbit).toHaveBeenNthCalledWith( + 3, + 'bitmap:action:email-unbacked-up-data:timespan:period-key', + 123, + 0, + ) + expect(pipeline.setbit).toHaveBeenNthCalledWith( + 4, + 'bitmap:action:email-unbacked-up-data:timespan:period-key', + 123, + 0, + ) + expect(pipeline.exec).toHaveBeenCalled() + }) +}) diff --git a/packages/analytics/src/Infra/Redis/RedisAnalyticsStore.ts b/packages/analytics/src/Infra/Redis/RedisAnalyticsStore.ts new file mode 100644 index 000000000..7e6bf5477 --- /dev/null +++ b/packages/analytics/src/Infra/Redis/RedisAnalyticsStore.ts @@ -0,0 +1,84 @@ +import * as IORedis from 'ioredis' + +import { Period } from '../../Domain/Time/Period' +import { PeriodKeyGeneratorInterface } from '../../Domain/Time/PeriodKeyGeneratorInterface' +import { AnalyticsActivity } from '../../Domain/Analytics/AnalyticsActivity' +import { AnalyticsStoreInterface } from '../../Domain/Analytics/AnalyticsStoreInterface' + +export class RedisAnalyticsStore implements AnalyticsStoreInterface { + constructor(private periodKeyGenerator: PeriodKeyGeneratorInterface, private redisClient: IORedis.Redis) {} + + async markActivity(activities: AnalyticsActivity[], analyticsId: number, periods: Period[]): Promise { + const pipeline = this.redisClient.pipeline() + + for (const activity of activities) { + for (const period of periods) { + pipeline.setbit( + `bitmap:action:${activity}:timespan:${this.periodKeyGenerator.getPeriodKey(period)}`, + analyticsId, + 1, + ) + } + } + + await pipeline.exec() + } + + async unmarkActivity(activities: AnalyticsActivity[], analyticsId: number, periods: Period[]): Promise { + const pipeline = this.redisClient.pipeline() + + for (const activity of activities) { + for (const period of periods) { + pipeline.setbit( + `bitmap:action:${activity}:timespan:${this.periodKeyGenerator.getPeriodKey(period)}`, + analyticsId, + 0, + ) + } + } + + await pipeline.exec() + } + + async wasActivityDone(activity: AnalyticsActivity, analyticsId: number, period: Period): Promise { + const bitValue = await this.redisClient.getbit( + `bitmap:action:${activity}:timespan:${this.periodKeyGenerator.getPeriodKey(period)}`, + analyticsId, + ) + + return bitValue === 1 + } + + async calculateActivityRetention( + activity: AnalyticsActivity, + firstPeriod: Period, + secondPeriod: Period, + ): Promise { + const initialPeriodKey = this.periodKeyGenerator.getPeriodKey(firstPeriod) + const subsequentPeriodKey = this.periodKeyGenerator.getPeriodKey(secondPeriod) + + const diffKey = `bitmap:action:${activity}:timespan:${initialPeriodKey}-${subsequentPeriodKey}` + + await this.redisClient.send_command( + 'BITOP', + 'AND', + diffKey, + `bitmap:action:${activity}:timespan:${initialPeriodKey}`, + `bitmap:action:${activity}:timespan:${subsequentPeriodKey}`, + ) + + const retainedTotalInActivity = await this.redisClient.bitcount(diffKey) + + const initialTotalInActivity = await this.redisClient.bitcount( + `bitmap:action:${activity}:timespan:${initialPeriodKey}`, + ) + + return Math.ceil((retainedTotalInActivity * 100) / initialTotalInActivity) + } + + async calculateActivityTotalCount(activity: AnalyticsActivity, period: Period): Promise { + return this.redisClient.bitcount( + `bitmap:action:${activity}:timespan:${this.periodKeyGenerator.getPeriodKey(period)}`, + ) + } +} diff --git a/packages/analytics/src/Infra/Redis/RedisStatisticsStore.spec.ts b/packages/analytics/src/Infra/Redis/RedisStatisticsStore.spec.ts new file mode 100644 index 000000000..c30b295ae --- /dev/null +++ b/packages/analytics/src/Infra/Redis/RedisStatisticsStore.spec.ts @@ -0,0 +1,92 @@ +import * as IORedis from 'ioredis' +import { PeriodKeyGeneratorInterface } from '../../Domain' + +import { RedisStatisticsStore } from './RedisStatisticsStore' + +describe('RedisStatisticsStore', () => { + let redisClient: IORedis.Redis + let periodKeyGenerator: PeriodKeyGeneratorInterface + let pipeline: IORedis.Pipeline + + const createStore = () => new RedisStatisticsStore(periodKeyGenerator, redisClient) + + beforeEach(() => { + pipeline = {} as jest.Mocked + pipeline.incr = jest.fn() + pipeline.setbit = jest.fn() + pipeline.exec = jest.fn() + + redisClient = {} as jest.Mocked + redisClient.pipeline = jest.fn().mockReturnValue(pipeline) + redisClient.incr = jest.fn() + redisClient.setbit = jest.fn() + redisClient.getbit = jest.fn().mockReturnValue(1) + redisClient.send_command = jest.fn() + + periodKeyGenerator = {} as jest.Mocked + periodKeyGenerator.getPeriodKey = jest.fn().mockReturnValue('period-key') + }) + + it('should get yesterday out of sync incidents', async () => { + redisClient.get = jest.fn().mockReturnValue(1) + + expect(await createStore().getYesterdayOutOfSyncIncidents()).toEqual(1) + }) + + it('should default to 0 yesterday out of sync incidents', async () => { + redisClient.get = jest.fn().mockReturnValue(null) + + expect(await createStore().getYesterdayOutOfSyncIncidents()).toEqual(0) + }) + + it('should get yesterday application version usage', async () => { + redisClient.keys = jest + .fn() + .mockReturnValue([ + 'count:action:application-request:1.2.3:timespan:2022-3-10', + 'count:action:application-request:2.3.4:timespan:2022-3-10', + ]) + redisClient.get = jest.fn().mockReturnValueOnce(3).mockReturnValueOnce(4) + + expect(await createStore().getYesterdayApplicationUsage()).toEqual([ + { count: 3, version: '1.2.3' }, + { count: 4, version: '2.3.4' }, + ]) + }) + + it('should get yesterday snjs version usage', async () => { + redisClient.keys = jest + .fn() + .mockReturnValue([ + 'count:action:snjs-request:1.2.3:timespan:2022-3-10', + 'count:action:snjs-request:2.3.4:timespan:2022-3-10', + ]) + redisClient.get = jest.fn().mockReturnValueOnce(3).mockReturnValueOnce(4) + + expect(await createStore().getYesterdaySNJSUsage()).toEqual([ + { count: 3, version: '1.2.3' }, + { count: 4, version: '2.3.4' }, + ]) + }) + + it('should increment application version usage', async () => { + await createStore().incrementApplicationVersionUsage('1.2.3') + + expect(pipeline.incr).toHaveBeenCalled() + expect(pipeline.exec).toHaveBeenCalled() + }) + + it('should increment snjs version usage', async () => { + await createStore().incrementSNJSVersionUsage('1.2.3') + + expect(pipeline.incr).toHaveBeenCalled() + expect(pipeline.exec).toHaveBeenCalled() + }) + + it('should increment out of sync incedent count', async () => { + await createStore().incrementOutOfSyncIncidents() + + expect(pipeline.incr).toHaveBeenCalled() + expect(pipeline.exec).toHaveBeenCalled() + }) +}) diff --git a/packages/analytics/src/Infra/Redis/RedisStatisticsStore.ts b/packages/analytics/src/Infra/Redis/RedisStatisticsStore.ts new file mode 100644 index 000000000..381509c54 --- /dev/null +++ b/packages/analytics/src/Infra/Redis/RedisStatisticsStore.ts @@ -0,0 +1,99 @@ +import * as IORedis from 'ioredis' + +import { Period, PeriodKeyGeneratorInterface } from '../../Domain' + +import { StatisticsStoreInterface } from '../../Domain/Statistics/StatisticsStoreInterface' + +export class RedisStatisticsStore implements StatisticsStoreInterface { + constructor(private periodKeyGenerator: PeriodKeyGeneratorInterface, private redisClient: IORedis.Redis) {} + + async getYesterdayOutOfSyncIncidents(): Promise { + const count = await this.redisClient.get( + `count:action:out-of-sync:timespan:${this.periodKeyGenerator.getPeriodKey(Period.Yesterday)}`, + ) + + if (count === null) { + return 0 + } + + return +count + } + + async incrementOutOfSyncIncidents(): Promise { + const pipeline = this.redisClient.pipeline() + + pipeline.incr(`count:action:out-of-sync:timespan:${this.periodKeyGenerator.getPeriodKey(Period.Today)}`) + pipeline.incr(`count:action:out-of-sync:timespan:${this.periodKeyGenerator.getPeriodKey(Period.ThisWeek)}`) + pipeline.incr(`count:action:out-of-sync:timespan:${this.periodKeyGenerator.getPeriodKey(Period.ThisMonth)}`) + + await pipeline.exec() + } + + async getYesterdaySNJSUsage(): Promise<{ version: string; count: number }[]> { + const keys = await this.redisClient.keys( + `count:action:snjs-request:*:timespan:${this.periodKeyGenerator.getPeriodKey(Period.Yesterday)}`, + ) + + return this.getRequestCountPerVersion(keys) + } + + async getYesterdayApplicationUsage(): Promise<{ version: string; count: number }[]> { + const keys = await this.redisClient.keys( + `count:action:application-request:*:timespan:${this.periodKeyGenerator.getPeriodKey(Period.Yesterday)}`, + ) + + return this.getRequestCountPerVersion(keys) + } + + async incrementApplicationVersionUsage(applicationVersion: string): Promise { + const pipeline = this.redisClient.pipeline() + + pipeline.incr( + `count:action:application-request:${applicationVersion}:timespan:${this.periodKeyGenerator.getPeriodKey( + Period.Today, + )}`, + ) + pipeline.incr( + `count:action:application-request:${applicationVersion}:timespan:${this.periodKeyGenerator.getPeriodKey( + Period.ThisWeek, + )}`, + ) + pipeline.incr( + `count:action:application-request:${applicationVersion}:timespan:${this.periodKeyGenerator.getPeriodKey( + Period.ThisMonth, + )}`, + ) + + await pipeline.exec() + } + + async incrementSNJSVersionUsage(snjsVersion: string): Promise { + const pipeline = this.redisClient.pipeline() + + pipeline.incr( + `count:action:snjs-request:${snjsVersion}:timespan:${this.periodKeyGenerator.getPeriodKey(Period.Today)}`, + ) + pipeline.incr( + `count:action:snjs-request:${snjsVersion}:timespan:${this.periodKeyGenerator.getPeriodKey(Period.ThisWeek)}`, + ) + pipeline.incr( + `count:action:snjs-request:${snjsVersion}:timespan:${this.periodKeyGenerator.getPeriodKey(Period.ThisMonth)}`, + ) + + await pipeline.exec() + } + + private async getRequestCountPerVersion(keys: string[]): Promise<{ version: string; count: number }[]> { + const statistics = [] + for (const key of keys) { + const count = await this.redisClient.get(key) + const version = key.split(':')[3] + statistics.push({ + version, + count: +(count as string), + }) + } + + return statistics + } +} diff --git a/packages/analytics/src/Infra/index.ts b/packages/analytics/src/Infra/index.ts new file mode 100644 index 000000000..fb303e395 --- /dev/null +++ b/packages/analytics/src/Infra/index.ts @@ -0,0 +1,2 @@ +export * from './Redis/RedisAnalyticsStore' +export * from './Redis/RedisStatisticsStore' diff --git a/packages/analytics/src/index.ts b/packages/analytics/src/index.ts new file mode 100644 index 000000000..8d4e50e74 --- /dev/null +++ b/packages/analytics/src/index.ts @@ -0,0 +1,2 @@ +export * from './Domain' +export * from './Infra' diff --git a/packages/analytics/tsconfig.json b/packages/analytics/tsconfig.json new file mode 100644 index 000000000..8d2588d39 --- /dev/null +++ b/packages/analytics/tsconfig.json @@ -0,0 +1,11 @@ +{ + "extends": "../../tsconfig.json", + "compilerOptions": { + "composite": true, + "outDir": "./dist", + }, + "include": [ + "src/**/*" + ], + "references": [] +} diff --git a/packages/api-gateway/package.json b/packages/api-gateway/package.json index 66c56b9b4..e4e9a1e11 100644 --- a/packages/api-gateway/package.json +++ b/packages/api-gateway/package.json @@ -24,7 +24,7 @@ "dependencies": { "@newrelic/winston-enricher": "^2.1.0", "@sentry/node": "^7.3.0", - "@standardnotes/analytics": "^1.6.0", + "@standardnotes/analytics": "workspace:*", "@standardnotes/auth": "3.19.4", "@standardnotes/domain-events": "workspace:*", "@standardnotes/domain-events-infra": "workspace:*", diff --git a/packages/auth/package.json b/packages/auth/package.json index 1654e43ce..c2b4fa085 100644 --- a/packages/auth/package.json +++ b/packages/auth/package.json @@ -33,7 +33,7 @@ "dependencies": { "@newrelic/winston-enricher": "^2.1.0", "@sentry/node": "^7.3.0", - "@standardnotes/analytics": "^1.6.0", + "@standardnotes/analytics": "workspace:*", "@standardnotes/api": "^1.1.19", "@standardnotes/auth": "^3.19.4", "@standardnotes/common": "^1.23.1", diff --git a/packages/domain-events/.eslintignore b/packages/domain-events/.eslintignore index f06235c46..1521c8b76 100644 --- a/packages/domain-events/.eslintignore +++ b/packages/domain-events/.eslintignore @@ -1,2 +1 @@ -node_modules dist diff --git a/packages/syncing-server/package.json b/packages/syncing-server/package.json index 50a77d7c3..d1a810db5 100644 --- a/packages/syncing-server/package.json +++ b/packages/syncing-server/package.json @@ -26,7 +26,7 @@ "dependencies": { "@newrelic/winston-enricher": "^2.1.0", "@sentry/node": "^7.3.0", - "@standardnotes/analytics": "^1.6.0", + "@standardnotes/analytics": "workspace:*", "@standardnotes/auth": "^3.19.4", "@standardnotes/common": "^1.23.1", "@standardnotes/domain-events": "workspace:*", diff --git a/tsconfig.json b/tsconfig.json index 947c636fc..8b0b4551d 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -23,7 +23,10 @@ "exclude": ["**/*.spec.ts", "dist", "test-setup.ts"], "references": [ { - "path": "./packages/scheduler" + "path": "./packages/analytics" + }, + { + "path": "./packages/api-gateway" }, { "path": "./packages/auth" @@ -34,14 +37,14 @@ { "path": "./packages/domain-events-infra" }, - { - "path": "./packages/syncing-server" - }, { "path": "./packages/files" }, { - "path": "./packages/api-gateway" + "path": "./packages/scheduler" + }, + { + "path": "./packages/syncing-server" } ] } diff --git a/yarn.lock b/yarn.lock index 69c1afefd..9131fe6ce 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1939,12 +1939,20 @@ __metadata: languageName: node linkType: hard -"@standardnotes/analytics@npm:^1.6.0": - version: 1.6.0 - resolution: "@standardnotes/analytics@npm:1.6.0" - checksum: 6a5e86152673ce9ddce43c52b5f699a1b3ba5141e58a944bda8eaa88fc2f4169df27239f82633226752bf3f10f9804f426721b9c919d10fbfbb51f952430eb1f - languageName: node - linkType: hard +"@standardnotes/analytics@workspace:*, @standardnotes/analytics@workspace:packages/analytics": + version: 0.0.0-use.local + resolution: "@standardnotes/analytics@workspace:packages/analytics" + dependencies: + "@types/ioredis": ^4.28.8 + "@types/jest": ^27.4.1 + "@typescript-eslint/eslint-plugin": ^5.30.0 + eslint-plugin-prettier: ^4.2.1 + ioredis: ^4.28.5 + jest: ^27.5.1 + reflect-metadata: ^0.1.13 + ts-jest: ^27.1.3 + languageName: unknown + linkType: soft "@standardnotes/api-gateway@workspace:packages/api-gateway": version: 0.0.0-use.local @@ -1952,7 +1960,7 @@ __metadata: dependencies: "@newrelic/winston-enricher": ^2.1.0 "@sentry/node": ^7.3.0 - "@standardnotes/analytics": ^1.6.0 + "@standardnotes/analytics": "workspace:*" "@standardnotes/auth": 3.19.4 "@standardnotes/domain-events": "workspace:*" "@standardnotes/domain-events-infra": "workspace:*" @@ -2008,7 +2016,7 @@ __metadata: dependencies: "@newrelic/winston-enricher": ^2.1.0 "@sentry/node": ^7.3.0 - "@standardnotes/analytics": ^1.6.0 + "@standardnotes/analytics": "workspace:*" "@standardnotes/api": ^1.1.19 "@standardnotes/auth": ^3.19.4 "@standardnotes/common": ^1.23.1 @@ -2351,7 +2359,7 @@ __metadata: dependencies: "@newrelic/winston-enricher": ^2.1.0 "@sentry/node": ^7.3.0 - "@standardnotes/analytics": ^1.6.0 + "@standardnotes/analytics": "workspace:*" "@standardnotes/auth": ^3.19.4 "@standardnotes/common": ^1.23.1 "@standardnotes/domain-events": "workspace:*"