From 4630be4b8e9aa0f677c3f586b5df6a3352a88516 Mon Sep 17 00:00:00 2001 From: Ilia Kurganskii Date: Fri, 20 Dec 2024 11:23:41 +0100 Subject: [PATCH 01/43] feat: add new packages for RN --- package.json | 4 +- packages/react-native-sdk/.browserslistrc | 1 + packages/react-native-sdk/README.md | 93 +++ packages/react-native-sdk/globals.ts | 7 + packages/react-native-sdk/jest.config.js | 7 + packages/react-native-sdk/package.json | 66 ++ packages/react-native-sdk/rollup.config.js | 3 + .../src/config/getWebInstrumentations.ts | 36 + packages/react-native-sdk/src/config/index.ts | 5 + .../src/config/makeCoreConfig.test.ts | 119 +++ .../src/config/makeCoreConfig.ts | 98 +++ packages/react-native-sdk/src/config/types.ts | 12 + packages/react-native-sdk/src/consts.ts | 1 + packages/react-native-sdk/src/index.ts | 170 +++++ packages/react-native-sdk/src/initialize.ts | 15 + .../src/instrumentations/console/index.ts | 3 + .../console/instrumentation.test.ts | 197 +++++ .../console/instrumentation.ts | 40 + .../src/instrumentations/console/types.ts | 7 + .../src/instrumentations/errors/const.ts | 12 + .../errors/getErrorDetails.ts | 33 + .../errors/getValueAndTypeFromMessage.ts | 12 + .../src/instrumentations/errors/index.ts | 5 + .../errors/instrumentation.ts | 17 + .../errors/registerOnerror.test.ts | 28 + .../errors/registerOnerror.ts | 39 + .../errors/registerOnunhandledrejection.ts | 32 + .../errors/stackFrames/buildStackFrame.ts | 25 + .../errors/stackFrames/const.ts | 21 + .../getDataFromSafariExtensions.ts | 18 + .../stackFrames/getStackFramesFromError.ts | 89 +++ .../errors/stackFrames/index.ts | 7 + .../errors/stackFrames/parseStacktrace.ts | 9 + .../src/instrumentations/errors/types.ts | 9 + .../src/instrumentations/index.ts | 29 + .../instrumentationConstants.ts | 1 + .../src/instrumentations/performance/index.ts | 1 + .../performance/instrumentation.test.ts | 152 ++++ .../performance/instrumentation.ts | 33 + .../performance/navigation.test.ts | 172 +++++ .../performance/navigation.ts | 57 ++ .../performance/performanceConstants.ts | 2 + .../performance/performanceUtils.test.ts | 204 ++++++ .../performance/performanceUtils.ts | 200 +++++ .../performance/performanceUtilsTestData.ts | 87 +++ .../performance/resource.test.ts | 162 ++++ .../instrumentations/performance/resource.ts | 57 ++ .../src/instrumentations/performance/types.ts | 49 ++ .../src/instrumentations/session/index.ts | 16 + .../session/instrumentation.test.ts | 689 ++++++++++++++++++ .../session/instrumentation.ts | 167 +++++ .../PersistentSessionsManager.test.ts | 237 ++++++ .../PersistentSessionsManager.ts | 68 ++ .../sessionManager/VolatileSessionManager.ts | 59 ++ .../VolatileSessionsManager.test.ts | 226 ++++++ .../getSessionManagerByConfig.ts | 9 + .../session/sessionManager/index.ts | 18 + .../session/sessionManager/sampling.test.ts | 72 ++ .../session/sessionManager/sampling.ts | 15 + .../sessionManager/sessionConstants.ts | 18 + .../sessionManagerUtils.test.ts | 355 +++++++++ .../sessionManager/sessionManagerUtils.ts | 110 +++ .../session/sessionManager/types.ts | 14 + .../src/instrumentations/view/index.ts | 1 + .../view/instrumentation.test.ts | 26 + .../instrumentations/view/instrumentation.ts | 33 + .../src/instrumentations/webVitals/index.ts | 1 + .../webVitals/instrumentation.test.ts | 44 ++ .../webVitals/instrumentation.ts | 22 + .../webVitals/webVitalsBasic.test.ts | 42 ++ .../webVitals/webVitalsBasic.ts | 30 + .../webVitalsWithAttribution.test.ts | 263 +++++++ .../webVitals/webVitalsWithAttribution.ts | 170 +++++ .../src/metas/browser/index.ts | 1 + .../src/metas/browser/meta.ts | 41 ++ packages/react-native-sdk/src/metas/const.ts | 6 + packages/react-native-sdk/src/metas/index.ts | 9 + .../react-native-sdk/src/metas/k6/index.ts | 1 + .../react-native-sdk/src/metas/k6/meta.ts | 17 + .../react-native-sdk/src/metas/page/index.ts | 1 + .../react-native-sdk/src/metas/page/meta.ts | 7 + .../react-native-sdk/src/metas/sdk/index.ts | 1 + .../react-native-sdk/src/metas/sdk/meta.ts | 10 + .../src/metas/session/createSession.ts | 9 + .../src/metas/session/index.ts | 1 + .../src/transports/console/index.ts | 2 + .../src/transports/console/transport.ts | 17 + .../src/transports/console/types.ts | 5 + .../src/transports/fetch/index.ts | 2 + .../src/transports/fetch/transport.test.ts | 314 ++++++++ .../src/transports/fetch/transport.ts | 151 ++++ .../src/transports/fetch/types.ts | 25 + .../react-native-sdk/src/transports/index.ts | 5 + packages/react-native-sdk/src/utils/index.ts | 15 + .../react-native-sdk/src/utils/json.test.ts | 19 + packages/react-native-sdk/src/utils/json.ts | 22 + .../src/utils/throttle.test.ts | 64 ++ .../react-native-sdk/src/utils/throttle.ts | 29 + packages/react-native-sdk/src/utils/url.ts | 9 + .../react-native-sdk/src/utils/urls.test.ts | 45 ++ .../src/utils/webStorage.test.ts | 35 + .../react-native-sdk/src/utils/webStorage.ts | 86 +++ packages/react-native-sdk/tsconfig.cjs.json | 12 + packages/react-native-sdk/tsconfig.esm.json | 12 + packages/react-native-sdk/tsconfig.json | 7 + packages/react-native-sdk/tsconfig.spec.json | 11 + packages/react-native-tracing/.browserslistrc | 1 + packages/react-native-tracing/README.md | 10 + packages/react-native-tracing/jest.config.js | 7 + packages/react-native-tracing/package.json | 71 ++ .../react-native-tracing/rollup.config.js | 3 + .../src/faroTraceExporter.ts | 24 + .../src/faroTraceExporter.utils.test.ts | 336 +++++++++ .../src/faroTraceExporter.utils.ts | 47 ++ .../src/faroXhrInstrumentation.ts | 42 ++ .../src/getDefaultInstrumentations.test.ts | 64 ++ .../src/getDefaultOTELInstrumentations.ts | 48 ++ packages/react-native-tracing/src/index.ts | 13 + .../src/instrumentation.ts | 94 +++ .../src/instrumentationUtils.test.ts | 77 ++ .../src/instrumentationUtils.ts | 53 ++ .../react-native-tracing/src/sampler.test.ts | 29 + packages/react-native-tracing/src/sampler.ts | 10 + .../src/sessionSpanProcessor.ts | 40 + packages/react-native-tracing/src/types.ts | 43 ++ .../react-native-tracing/tsconfig.cjs.json | 12 + .../react-native-tracing/tsconfig.esm.json | 12 + packages/react-native-tracing/tsconfig.json | 7 + .../react-native-tracing/tsconfig.spec.json | 11 + 129 files changed, 7195 insertions(+), 1 deletion(-) create mode 100644 packages/react-native-sdk/.browserslistrc create mode 100644 packages/react-native-sdk/README.md create mode 100644 packages/react-native-sdk/globals.ts create mode 100644 packages/react-native-sdk/jest.config.js create mode 100644 packages/react-native-sdk/package.json create mode 100644 packages/react-native-sdk/rollup.config.js create mode 100644 packages/react-native-sdk/src/config/getWebInstrumentations.ts create mode 100644 packages/react-native-sdk/src/config/index.ts create mode 100644 packages/react-native-sdk/src/config/makeCoreConfig.test.ts create mode 100644 packages/react-native-sdk/src/config/makeCoreConfig.ts create mode 100644 packages/react-native-sdk/src/config/types.ts create mode 100644 packages/react-native-sdk/src/consts.ts create mode 100644 packages/react-native-sdk/src/index.ts create mode 100644 packages/react-native-sdk/src/initialize.ts create mode 100644 packages/react-native-sdk/src/instrumentations/console/index.ts create mode 100644 packages/react-native-sdk/src/instrumentations/console/instrumentation.test.ts create mode 100644 packages/react-native-sdk/src/instrumentations/console/instrumentation.ts create mode 100644 packages/react-native-sdk/src/instrumentations/console/types.ts create mode 100644 packages/react-native-sdk/src/instrumentations/errors/const.ts create mode 100644 packages/react-native-sdk/src/instrumentations/errors/getErrorDetails.ts create mode 100644 packages/react-native-sdk/src/instrumentations/errors/getValueAndTypeFromMessage.ts create mode 100644 packages/react-native-sdk/src/instrumentations/errors/index.ts create mode 100644 packages/react-native-sdk/src/instrumentations/errors/instrumentation.ts create mode 100644 packages/react-native-sdk/src/instrumentations/errors/registerOnerror.test.ts create mode 100644 packages/react-native-sdk/src/instrumentations/errors/registerOnerror.ts create mode 100644 packages/react-native-sdk/src/instrumentations/errors/registerOnunhandledrejection.ts create mode 100644 packages/react-native-sdk/src/instrumentations/errors/stackFrames/buildStackFrame.ts create mode 100644 packages/react-native-sdk/src/instrumentations/errors/stackFrames/const.ts create mode 100644 packages/react-native-sdk/src/instrumentations/errors/stackFrames/getDataFromSafariExtensions.ts create mode 100644 packages/react-native-sdk/src/instrumentations/errors/stackFrames/getStackFramesFromError.ts create mode 100644 packages/react-native-sdk/src/instrumentations/errors/stackFrames/index.ts create mode 100644 packages/react-native-sdk/src/instrumentations/errors/stackFrames/parseStacktrace.ts create mode 100644 packages/react-native-sdk/src/instrumentations/errors/types.ts create mode 100644 packages/react-native-sdk/src/instrumentations/index.ts create mode 100644 packages/react-native-sdk/src/instrumentations/instrumentationConstants.ts create mode 100644 packages/react-native-sdk/src/instrumentations/performance/index.ts create mode 100644 packages/react-native-sdk/src/instrumentations/performance/instrumentation.test.ts create mode 100644 packages/react-native-sdk/src/instrumentations/performance/instrumentation.ts create mode 100644 packages/react-native-sdk/src/instrumentations/performance/navigation.test.ts create mode 100644 packages/react-native-sdk/src/instrumentations/performance/navigation.ts create mode 100644 packages/react-native-sdk/src/instrumentations/performance/performanceConstants.ts create mode 100644 packages/react-native-sdk/src/instrumentations/performance/performanceUtils.test.ts create mode 100644 packages/react-native-sdk/src/instrumentations/performance/performanceUtils.ts create mode 100644 packages/react-native-sdk/src/instrumentations/performance/performanceUtilsTestData.ts create mode 100644 packages/react-native-sdk/src/instrumentations/performance/resource.test.ts create mode 100644 packages/react-native-sdk/src/instrumentations/performance/resource.ts create mode 100644 packages/react-native-sdk/src/instrumentations/performance/types.ts create mode 100644 packages/react-native-sdk/src/instrumentations/session/index.ts create mode 100644 packages/react-native-sdk/src/instrumentations/session/instrumentation.test.ts create mode 100644 packages/react-native-sdk/src/instrumentations/session/instrumentation.ts create mode 100644 packages/react-native-sdk/src/instrumentations/session/sessionManager/PersistentSessionsManager.test.ts create mode 100644 packages/react-native-sdk/src/instrumentations/session/sessionManager/PersistentSessionsManager.ts create mode 100644 packages/react-native-sdk/src/instrumentations/session/sessionManager/VolatileSessionManager.ts create mode 100644 packages/react-native-sdk/src/instrumentations/session/sessionManager/VolatileSessionsManager.test.ts create mode 100644 packages/react-native-sdk/src/instrumentations/session/sessionManager/getSessionManagerByConfig.ts create mode 100644 packages/react-native-sdk/src/instrumentations/session/sessionManager/index.ts create mode 100644 packages/react-native-sdk/src/instrumentations/session/sessionManager/sampling.test.ts create mode 100644 packages/react-native-sdk/src/instrumentations/session/sessionManager/sampling.ts create mode 100644 packages/react-native-sdk/src/instrumentations/session/sessionManager/sessionConstants.ts create mode 100644 packages/react-native-sdk/src/instrumentations/session/sessionManager/sessionManagerUtils.test.ts create mode 100644 packages/react-native-sdk/src/instrumentations/session/sessionManager/sessionManagerUtils.ts create mode 100644 packages/react-native-sdk/src/instrumentations/session/sessionManager/types.ts create mode 100644 packages/react-native-sdk/src/instrumentations/view/index.ts create mode 100644 packages/react-native-sdk/src/instrumentations/view/instrumentation.test.ts create mode 100644 packages/react-native-sdk/src/instrumentations/view/instrumentation.ts create mode 100644 packages/react-native-sdk/src/instrumentations/webVitals/index.ts create mode 100644 packages/react-native-sdk/src/instrumentations/webVitals/instrumentation.test.ts create mode 100644 packages/react-native-sdk/src/instrumentations/webVitals/instrumentation.ts create mode 100644 packages/react-native-sdk/src/instrumentations/webVitals/webVitalsBasic.test.ts create mode 100644 packages/react-native-sdk/src/instrumentations/webVitals/webVitalsBasic.ts create mode 100644 packages/react-native-sdk/src/instrumentations/webVitals/webVitalsWithAttribution.test.ts create mode 100644 packages/react-native-sdk/src/instrumentations/webVitals/webVitalsWithAttribution.ts create mode 100644 packages/react-native-sdk/src/metas/browser/index.ts create mode 100644 packages/react-native-sdk/src/metas/browser/meta.ts create mode 100644 packages/react-native-sdk/src/metas/const.ts create mode 100644 packages/react-native-sdk/src/metas/index.ts create mode 100644 packages/react-native-sdk/src/metas/k6/index.ts create mode 100644 packages/react-native-sdk/src/metas/k6/meta.ts create mode 100644 packages/react-native-sdk/src/metas/page/index.ts create mode 100644 packages/react-native-sdk/src/metas/page/meta.ts create mode 100644 packages/react-native-sdk/src/metas/sdk/index.ts create mode 100644 packages/react-native-sdk/src/metas/sdk/meta.ts create mode 100644 packages/react-native-sdk/src/metas/session/createSession.ts create mode 100644 packages/react-native-sdk/src/metas/session/index.ts create mode 100644 packages/react-native-sdk/src/transports/console/index.ts create mode 100644 packages/react-native-sdk/src/transports/console/transport.ts create mode 100644 packages/react-native-sdk/src/transports/console/types.ts create mode 100644 packages/react-native-sdk/src/transports/fetch/index.ts create mode 100644 packages/react-native-sdk/src/transports/fetch/transport.test.ts create mode 100644 packages/react-native-sdk/src/transports/fetch/transport.ts create mode 100644 packages/react-native-sdk/src/transports/fetch/types.ts create mode 100644 packages/react-native-sdk/src/transports/index.ts create mode 100644 packages/react-native-sdk/src/utils/index.ts create mode 100644 packages/react-native-sdk/src/utils/json.test.ts create mode 100644 packages/react-native-sdk/src/utils/json.ts create mode 100644 packages/react-native-sdk/src/utils/throttle.test.ts create mode 100644 packages/react-native-sdk/src/utils/throttle.ts create mode 100644 packages/react-native-sdk/src/utils/url.ts create mode 100644 packages/react-native-sdk/src/utils/urls.test.ts create mode 100644 packages/react-native-sdk/src/utils/webStorage.test.ts create mode 100644 packages/react-native-sdk/src/utils/webStorage.ts create mode 100644 packages/react-native-sdk/tsconfig.cjs.json create mode 100644 packages/react-native-sdk/tsconfig.esm.json create mode 100644 packages/react-native-sdk/tsconfig.json create mode 100644 packages/react-native-sdk/tsconfig.spec.json create mode 100644 packages/react-native-tracing/.browserslistrc create mode 100644 packages/react-native-tracing/README.md create mode 100644 packages/react-native-tracing/jest.config.js create mode 100644 packages/react-native-tracing/package.json create mode 100644 packages/react-native-tracing/rollup.config.js create mode 100644 packages/react-native-tracing/src/faroTraceExporter.ts create mode 100644 packages/react-native-tracing/src/faroTraceExporter.utils.test.ts create mode 100644 packages/react-native-tracing/src/faroTraceExporter.utils.ts create mode 100644 packages/react-native-tracing/src/faroXhrInstrumentation.ts create mode 100644 packages/react-native-tracing/src/getDefaultInstrumentations.test.ts create mode 100644 packages/react-native-tracing/src/getDefaultOTELInstrumentations.ts create mode 100644 packages/react-native-tracing/src/index.ts create mode 100644 packages/react-native-tracing/src/instrumentation.ts create mode 100644 packages/react-native-tracing/src/instrumentationUtils.test.ts create mode 100644 packages/react-native-tracing/src/instrumentationUtils.ts create mode 100644 packages/react-native-tracing/src/sampler.test.ts create mode 100644 packages/react-native-tracing/src/sampler.ts create mode 100644 packages/react-native-tracing/src/sessionSpanProcessor.ts create mode 100644 packages/react-native-tracing/src/types.ts create mode 100644 packages/react-native-tracing/tsconfig.cjs.json create mode 100644 packages/react-native-tracing/tsconfig.esm.json create mode 100644 packages/react-native-tracing/tsconfig.json create mode 100644 packages/react-native-tracing/tsconfig.spec.json diff --git a/package.json b/package.json index 9d0842d5d..b374ea9dd 100644 --- a/package.json +++ b/package.json @@ -94,5 +94,7 @@ "resolutions": { "tough-cookie": "^4.1.3" }, - "dependencies": {} + "dependencies": { + "@grafana/faro-web-tracing": "file:.yalc/@grafana/faro-web-tracing" + } } diff --git a/packages/react-native-sdk/.browserslistrc b/packages/react-native-sdk/.browserslistrc new file mode 100644 index 000000000..8528fd685 --- /dev/null +++ b/packages/react-native-sdk/.browserslistrc @@ -0,0 +1 @@ +supports es6-module \ No newline at end of file diff --git a/packages/react-native-sdk/README.md b/packages/react-native-sdk/README.md new file mode 100644 index 000000000..f3743298d --- /dev/null +++ b/packages/react-native-sdk/README.md @@ -0,0 +1,93 @@ +# @grafana/faro-web-sdk + +Faro is a SDK that can instrument frontend JavaScript applications to collect telemetry and forward it to the +[Grafana Alloy][grafana-alloy-docs] (with app agent receiver integration enabled). + +Grafana Alloy can then send this data to either [Loki][grafana-logs] or [Tempo][grafana-traces]. + +## Get started + +See [quick start for web applications][quick-start]. + +Alternatively, you can use the CDN version of the library. See [use cdn library][use-cdn] for details on how to do so. + +## Instrumentations + +- console - captures messages logged to `console` global object. Only `warn`, `info` and `error` levels by default. +- errors - captures unhandled top level exceptions +- web-vitals - captures performance metrics reported by web vitals API +- session - sends session start event +- view - sends view changed event + +## Metas + +- browser - captures browser metadata: name, version, etc +- page - captures current URL +- view - the web SDK enforces a `default` value for the view meta + +## Transports + +- console - logs events to global `console` +- fetch - sends events over HTTP to a backend + +## Example + +Basic set up, will automatically report errors and web vitals: + +```ts +import { initializeFaro } from '@grafana/faro-web-sdk'; + +const faro = initializeFaro({ + url: 'https://agent.myapp/collect', + apiKey: 'secret', + app: { + name: 'frontend', + version: '1.0.0', + }, +}); + +// send a log message +faro.api.pushLog(['hello world']); + +// will be captured +throw new Error('oh no'); + +// push error manually +faro.api.pushError(new Error('oh no')); +``` + +With OTel tracing and browser console capture: + +```ts +import { ConsoleInstrumentation, getWebInstrumentations, initializeFaro } from '@grafana/faro-web-sdk'; +import { TracingInstrumentation } from '@grafana/faro-web-tracing'; + +const faro = initializeFaro({ + url: 'https://agent.myapp/collect', + apiKey: 'secret', + instrumentations: [...getWebInstrumentations({ captureConsole: true }), new TracingInstrumentation()], + app: { + name: 'frontend', + version: '1.0.0', + }, +}); + +// start a span +faro.api + .getOTEL() + ?.trace.getTracer('frontend') + .startActiveSpan('hello world', (span) => { + // send a log message + faro.api.pushLog(['hello world']); + span.end(); + }); + +// will be captured +throw new Error('oh no'); +``` + +[grafana-alloy-docs]: https://grafana.com/docs/alloy/latest/ +[grafana-logs]: https://grafana.com/logs/ +[grafana-traces]: https://grafana.com/traces/ +[quick-start]: https://github.com/grafana/faro-web-sdk/blob/main/docs/sources/tutorials/quick-start-browser.md +[use-cdn]: https://github.com/grafana/faro-web-sdk/blob/main/docs/sources/tutorials/use-cdn-library.md diff --git a/packages/react-native-sdk/globals.ts b/packages/react-native-sdk/globals.ts new file mode 100644 index 000000000..0b11fdc2e --- /dev/null +++ b/packages/react-native-sdk/globals.ts @@ -0,0 +1,7 @@ +import type { Faro } from '@grafana/faro-core'; + +declare global { + interface Window { + faro: Faro; + } +} diff --git a/packages/react-native-sdk/jest.config.js b/packages/react-native-sdk/jest.config.js new file mode 100644 index 000000000..f6da361d6 --- /dev/null +++ b/packages/react-native-sdk/jest.config.js @@ -0,0 +1,7 @@ +const { jestBaseConfig } = require('../../jest.config.base.js'); + +module.exports = { + ...jestBaseConfig, + roots: ['packages/web-sdk/src'], + testEnvironment: 'jsdom', +}; diff --git a/packages/react-native-sdk/package.json b/packages/react-native-sdk/package.json new file mode 100644 index 000000000..af1e1eacb --- /dev/null +++ b/packages/react-native-sdk/package.json @@ -0,0 +1,66 @@ +{ + "name": "@grafana/react-native-sdk", + "version": "1.12.2", + "description": "Faro instrumentations, metas, transports for web.", + "keywords": [ + "observability", + "apm", + "rum", + "logs", + "traces", + "metrics", + "browser" + ], + "license": "Apache-2.0", + "author": "Grafana Labs", + "homepage": "https://github.com/grafana/faro-web-sdk", + "sideEffects": false, + "repository": { + "type": "git", + "url": "https://github.com/grafana/faro-web-sdk.git", + "directory": "packages/web-sdk" + }, + "main": "./dist/cjs/index.js", + "module": "./dist/esm/index.js", + "types": "./dist/types/index.d.ts", + "files": [ + ".browserslistrc", + "dist", + "globals.ts", + "README.md", + "LICENSE" + ], + "scripts": { + "start": "yarn watch", + "build": "run-s build:*", + "build:compile": "run-p build:compile:*", + "build:compile:cjs": "tsc --build tsconfig.cjs.json", + "build:compile:esm": "tsc --build tsconfig.esm.json", + "build:compile:bundle": "run-s build:compile:bundle:*", + "build:compile:bundle:create": "rollup -c ./rollup.config.js", + "build:compile:bundle:remove-extras": "rimraf dist/bundle/dist", + "watch": "run-s watch:compile", + "watch:compile": "yarn build:compile:cjs -w", + "clean": "rimraf dist/ yarn-error.log", + "quality": "run-s quality:*", + "quality:test": "jest", + "quality:format": "prettier --cache --cache-location=../../.cache/prettier/webSdk --ignore-path ../../.prettierignore -w \"./**/*.{js,jsx,ts,tsx,css,scss,md,yaml,yml,json}\"", + "quality:lint": "run-s quality:lint:*", + "quality:lint:eslint": "eslint --cache --cache-location ../../.cache/eslint/webSdk --ignore-path ../../.eslintignore \"./**/*.{js,jsx,ts,tsx}\"", + "quality:lint:prettier": "prettier --cache --cache-location=../../.cache/prettier/webSdk --ignore-path ../../.prettierignore -c \"./**/*.{js,jsx,ts,tsx,css,scss,md,yaml,yml,json}\"", + "quality:lint:md": "markdownlint README.md", + "quality:circular-deps": "madge --circular ." + }, + "dependencies": { + "@grafana/faro-core": "^1.12.2", + "ua-parser-js": "^1.0.32", + "web-vitals": "^4.0.1" + }, + "devDependencies": { + "@types/ua-parser-js": "^0.7.36", + "user-agent-data-types": "^0.4.2" + }, + "publishConfig": { + "access": "public" + } +} diff --git a/packages/react-native-sdk/rollup.config.js b/packages/react-native-sdk/rollup.config.js new file mode 100644 index 000000000..307e50ee8 --- /dev/null +++ b/packages/react-native-sdk/rollup.config.js @@ -0,0 +1,3 @@ +const { getRollupConfigBase } = require('../../rollup.config.base.js'); + +module.exports = getRollupConfigBase('webSdk'); diff --git a/packages/react-native-sdk/src/config/getWebInstrumentations.ts b/packages/react-native-sdk/src/config/getWebInstrumentations.ts new file mode 100644 index 000000000..7284cebdf --- /dev/null +++ b/packages/react-native-sdk/src/config/getWebInstrumentations.ts @@ -0,0 +1,36 @@ +import type { Instrumentation } from '@grafana/faro-core'; + +import { + ConsoleInstrumentation, + ErrorsInstrumentation, + PerformanceInstrumentation, + SessionInstrumentation, + ViewInstrumentation, + WebVitalsInstrumentation, +} from '../instrumentations'; + +import type { GetWebInstrumentationsOptions } from './types'; + +export function getWebInstrumentations(options: GetWebInstrumentationsOptions = {}): Instrumentation[] { + const instrumentations: Instrumentation[] = [ + new ErrorsInstrumentation(), + new WebVitalsInstrumentation(), + new SessionInstrumentation(), + new ViewInstrumentation(), + ]; + + if (options.enablePerformanceInstrumentation !== false) { + // unshift to ensure that initialization starts before the other instrumentations + instrumentations.unshift(new PerformanceInstrumentation()); + } + + if (options.captureConsole !== false) { + instrumentations.push( + new ConsoleInstrumentation({ + disabledLevels: options.captureConsoleDisabledLevels, + }) + ); + } + + return instrumentations; +} diff --git a/packages/react-native-sdk/src/config/index.ts b/packages/react-native-sdk/src/config/index.ts new file mode 100644 index 000000000..dfbd0c3ca --- /dev/null +++ b/packages/react-native-sdk/src/config/index.ts @@ -0,0 +1,5 @@ +export { getWebInstrumentations } from './getWebInstrumentations'; + +export { makeCoreConfig } from './makeCoreConfig'; + +export type { BrowserConfig, GetWebInstrumentationsOptions } from './types'; diff --git a/packages/react-native-sdk/src/config/makeCoreConfig.test.ts b/packages/react-native-sdk/src/config/makeCoreConfig.test.ts new file mode 100644 index 000000000..526f2b8ae --- /dev/null +++ b/packages/react-native-sdk/src/config/makeCoreConfig.test.ts @@ -0,0 +1,119 @@ +import { defaultLogArgsSerializer, isFunction } from '@grafana/faro-core'; +import type { LogArgsSerializer } from '@grafana/faro-core'; + +import { defaultMetas } from '../metas/const'; + +import { makeCoreConfig } from './makeCoreConfig'; + +describe('defaultMetas', () => { + it('includes K6Meta in defaultMetas for k6 (lab) sessions configured K6 properties.', () => { + (global as any).k6 = { + testRunId: 'abcde', + }; + + const browserConfig = { + url: 'http://example.com/my-collector', + app: {}, + }; + const config = makeCoreConfig(browserConfig); + + expect(config).toBeTruthy(); + expect(config?.metas).toHaveLength(3); + expect(config?.metas.map((item) => (isFunction(item) ? item() : item))).toContainEqual({ + k6: { + isK6Browser: true, + testRunId: 'abcde', + }, + }); + + delete (global as any).k6; + }); + + it('does not include K6 Object properties if not set', () => { + (global as any).k6 = {}; + + const browserConfig = { + url: 'http://example.com/my-collector', + app: {}, + }; + const config = makeCoreConfig(browserConfig); + + expect(config).toBeTruthy(); + expect(config?.metas).toHaveLength(3); + expect(config?.metas.map((item) => (isFunction(item) ? item() : item))).toContainEqual({ + k6: { isK6Browser: true }, + }); + + delete (global as any).k6; + }); + + it('does not include K6Meta in defaultMetas for non-k6 (field) sessions', () => { + expect(defaultMetas).toHaveLength(2); + expect(defaultMetas.map((item) => (isFunction(item) ? item() : item))).not.toContainEqual({ + k6: { isK6Browser: true }, + }); + }); +}); + +describe('config', () => { + it('includes custom logArgsSerializer if one was provided', () => { + const customLogArgsSerializer: LogArgsSerializer = () => 'test'; + + const browserConfig = { + url: 'http://example.com/my-collector', + app: {}, + logArgsSerializer: customLogArgsSerializer, + }; + const config = makeCoreConfig(browserConfig); + + expect(config).toBeTruthy(); + expect(config?.logArgsSerializer).toBe(customLogArgsSerializer); + }); + + it('includes default logArgsSerializer if no custom one was provided', () => { + const browserConfig = { + url: 'http://example.com/my-collector', + app: {}, + }; + const config = makeCoreConfig(browserConfig); + + expect(config).toBeTruthy(); + expect(config?.logArgsSerializer).toBe(defaultLogArgsSerializer); + }); + + it('adds default urls to ignoreUrls', () => { + const browserConfig = { + url: 'http://example.com/my-collector', + app: {}, + }; + const config = makeCoreConfig(browserConfig); + + expect(config).toBeTruthy(); + expect(config?.ignoreUrls).toEqual([/\/collect(?:\/[\w]*)?$/]); + }); + + it('merges configured urls with default URLs into ignoreUrls list', () => { + const browserConfig = { + url: 'http://example.com/my-collector', + app: {}, + ignoreUrls: ['http://example.com/ignore-me'], + }; + const config = makeCoreConfig(browserConfig); + + expect(config).toBeTruthy(); + expect(config?.ignoreUrls).toEqual([browserConfig.ignoreUrls[0], /\/collect(?:\/[\w]*)?$/]); + }); + + it.each(['http://example.com/collect', 'http://example.com/collect/874jdhalkfh7a9'])( + 'Matches default ignoreUrl with urls ending with /collect or ending with /collect followed by alphanumeric characters', + (url) => { + const config = makeCoreConfig({ url: '', app: {} }); + expect(config).toBeTruthy(); + // @ts-expect-error + expect(config?.ignoreUrls[0]).toEqual(/\/collect(?:\/[\w]*)?$/); + + // @ts-expect-error + expect(config.ignoreUrls[0].test(url)).toBe(true); + } + ); +}); diff --git a/packages/react-native-sdk/src/config/makeCoreConfig.ts b/packages/react-native-sdk/src/config/makeCoreConfig.ts new file mode 100644 index 000000000..94ba9f3df --- /dev/null +++ b/packages/react-native-sdk/src/config/makeCoreConfig.ts @@ -0,0 +1,98 @@ +import { + createInternalLogger, + defaultBatchingConfig, + defaultGlobalObjectKey, + defaultInternalLoggerLevel, + defaultLogArgsSerializer, + defaultUnpatchedConsole, + isObject, +} from '@grafana/faro-core'; +import type { Config, MetaItem, Transport } from '@grafana/faro-core'; + +import { defaultEventDomain } from '../consts'; +import { parseStacktrace } from '../instrumentations'; +import { defaultSessionTrackingConfig } from '../instrumentations/session'; +import { defaultMetas } from '../metas'; +import { k6Meta } from '../metas/k6'; +import { FetchTransport } from '../transports'; + +import { getWebInstrumentations } from './getWebInstrumentations'; +import type { BrowserConfig } from './types'; + +export function makeCoreConfig(browserConfig: BrowserConfig): Config | undefined { + const transports: Transport[] = []; + + const internalLogger = createInternalLogger(browserConfig.unpatchedConsole, browserConfig.internalLoggerLevel); + + if (browserConfig.transports) { + if (browserConfig.url || browserConfig.apiKey) { + internalLogger.error('if "transports" is defined, "url" and "apiKey" should not be defined'); + } + + transports.push(...browserConfig.transports); + } else if (browserConfig.url) { + transports.push( + new FetchTransport({ + url: browserConfig.url, + apiKey: browserConfig.apiKey, + }) + ); + } else { + internalLogger.error('either "url" or "transports" must be defined'); + } + + function createMetas(): MetaItem[] { + const initialMetas = defaultMetas; + + if (browserConfig.metas) { + initialMetas.push(...browserConfig.metas); + } + + const isK6BrowserSession = isObject((window as any).k6); + + if (isK6BrowserSession) { + return [...initialMetas, k6Meta]; + } + + return initialMetas; + } + + const config: Config = { + app: browserConfig.app, + batching: { + ...defaultBatchingConfig, + ...browserConfig.batching, + }, + dedupe: browserConfig.dedupe ?? true, + globalObjectKey: browserConfig.globalObjectKey || defaultGlobalObjectKey, + instrumentations: browserConfig.instrumentations ?? getWebInstrumentations(), + internalLoggerLevel: browserConfig.internalLoggerLevel ?? defaultInternalLoggerLevel, + isolate: browserConfig.isolate ?? false, + logArgsSerializer: browserConfig.logArgsSerializer ?? defaultLogArgsSerializer, + metas: createMetas(), + parseStacktrace, + paused: browserConfig.paused ?? false, + preventGlobalExposure: browserConfig.preventGlobalExposure ?? false, + transports, + unpatchedConsole: browserConfig.unpatchedConsole ?? defaultUnpatchedConsole, + + beforeSend: browserConfig.beforeSend, + eventDomain: browserConfig.eventDomain ?? defaultEventDomain, + ignoreErrors: browserConfig.ignoreErrors, + // ignore cloud collector urls by default. These are URLs ending with /collect or /collect/ followed by alphanumeric characters. + ignoreUrls: (browserConfig.ignoreUrls ?? []).concat([/\/collect(?:\/[\w]*)?$/]), + + sessionTracking: { + ...defaultSessionTrackingConfig, + ...browserConfig.sessionTracking, + }, + + user: browserConfig.user, + view: browserConfig.view, + trackResources: browserConfig.trackResources, + trackWebVitalsAttribution: browserConfig.trackWebVitalsAttribution, + consoleInstrumentation: browserConfig.consoleInstrumentation, + }; + + return config; +} diff --git a/packages/react-native-sdk/src/config/types.ts b/packages/react-native-sdk/src/config/types.ts new file mode 100644 index 000000000..4ae11c431 --- /dev/null +++ b/packages/react-native-sdk/src/config/types.ts @@ -0,0 +1,12 @@ +import type { Config, LogLevel } from '@grafana/faro-core'; + +export interface BrowserConfig extends Partial>, Pick { + url?: string; + apiKey?: string; +} + +export interface GetWebInstrumentationsOptions { + captureConsole?: boolean; + captureConsoleDisabledLevels?: LogLevel[]; + enablePerformanceInstrumentation?: boolean; +} diff --git a/packages/react-native-sdk/src/consts.ts b/packages/react-native-sdk/src/consts.ts new file mode 100644 index 000000000..d28fe0865 --- /dev/null +++ b/packages/react-native-sdk/src/consts.ts @@ -0,0 +1 @@ +export const defaultEventDomain = 'browser'; diff --git a/packages/react-native-sdk/src/index.ts b/packages/react-native-sdk/src/index.ts new file mode 100644 index 000000000..bc4374b8d --- /dev/null +++ b/packages/react-native-sdk/src/index.ts @@ -0,0 +1,170 @@ +export { getWebInstrumentations, makeCoreConfig } from './config'; +export type { BrowserConfig } from './config'; + +export { defaultEventDomain } from './consts'; + +export { initializeFaro } from './initialize'; + +export { + buildStackFrame, + ConsoleInstrumentation, + ErrorsInstrumentation, + getDataFromSafariExtensions, + getStackFramesFromError, + parseStacktrace, + ViewInstrumentation, + WebVitalsInstrumentation, + SessionInstrumentation, + PerformanceInstrumentation, +} from './instrumentations'; +export type { ConsoleInstrumentationOptions, ErrorEvent, ExtendedPromiseRejectionEvent } from './instrumentations'; + +export { browserMeta, createSession, defaultMetas, pageMeta, sdkMeta } from './metas'; + +export { ConsoleTransport, FetchTransport } from './transports'; +export type { + ClockFn, + ConsoleTransportOptions, + FetchTransportOptions, + FetchTransportRequestOptions, +} from './transports'; + +export { + faro, + allLogLevels, + BaseExtension, + BaseInstrumentation, + BaseTransport, + Conventions, + createInternalLogger, + createPromiseBuffer, + deepEqual, + defaultExceptionType, + defaultGlobalObjectKey, + defaultInternalLoggerLevel, + defaultLogLevel, + genShortID, + getCurrentTimestamp, + getInternalFaroFromGlobalObject, + getTransportBody, + globalObject, + internalGlobalObjectKey, + isArray, + isBoolean, + isDomError, + isDomException, + isElement, + isElementDefined, + isError, + isErrorDefined, + isErrorEvent, + isEvent, + isEventDefined, + isFunction, + isInstanceOf, + isInt, + isInternalFaroOnGlobalObject, + isMap, + isMapDefined, + isNull, + isNumber, + isObject, + isPrimitive, + isRegExp, + isString, + isSymbol, + isSyntheticEvent, + isThenable, + isToString, + isTypeof, + isUndefined, + InternalLoggerLevel, + LogLevel, + noop, + setInternalFaroOnGlobalObject, + TransportItemType, + transportItemTypeToBodyKey, + VERSION, + EVENT_CLICK, + EVENT_NAVIGATION, + EVENT_ROUTE_CHANGE, + EVENT_SESSION_EXTEND, + EVENT_SESSION_RESUME, + EVENT_SESSION_START, + EVENT_VIEW_CHANGED, +} from '@grafana/faro-core'; + +export type { + Faro, + API, + APIEvent, + BaseObject, + BaseObjectKey, + BaseObjectPrimitiveValue, + BaseObjectValue, + BeforeSendHook, + BufferItem, + Config, + EventAttributes, + EventEvent, + EventsAPI, + ExceptionEvent, + ExceptionStackFrame, + ExceptionsAPI, + ExtendedError, + Extension, + GlobalObject, + Instrumentation, + Instrumentations, + InternalLogger, + LogContext, + LogEvent, + LogsAPI, + MeasurementEvent, + MeasurementsAPI, + Meta, + MetaAPI, + MetaApp, + MetaAttributes, + MetaBrowser, + MetaGetter, + MetaItem, + MetaPage, + Metas, + MetaSDK, + MetaSDKIntegration, + MetaSession, + MetaUser, + MetaView, + OTELApi, + Patterns, + PromiseBuffer, + PromiseBufferOptions, + PromiseProducer, + PushErrorOptions, + PushLogOptions, + PushMeasurementOptions, + Stacktrace, + StacktraceParser, + TraceContext, + TraceEvent, + TracesAPI, + Transport, + TransportBody, + TransportItem, + TransportItemPayload, + Transports, + UnpatchedConsole, +} from '@grafana/faro-core'; + +export { + PersistentSessionsManager, + VolatileSessionsManager, + MAX_SESSION_PERSISTENCE_TIME, + MAX_SESSION_PERSISTENCE_TIME_BUFFER, + SESSION_EXPIRATION_TIME, + SESSION_INACTIVITY_TIME, + STORAGE_KEY, +} from './instrumentations/session'; + +export { getIgnoreUrls } from './utils/url'; diff --git a/packages/react-native-sdk/src/initialize.ts b/packages/react-native-sdk/src/initialize.ts new file mode 100644 index 000000000..fbce52b08 --- /dev/null +++ b/packages/react-native-sdk/src/initialize.ts @@ -0,0 +1,15 @@ +import { initializeFaro as coreInit } from '@grafana/faro-core'; +import type { Faro } from '@grafana/faro-core'; + +import { makeCoreConfig } from './config'; +import type { BrowserConfig } from './config'; + +export function initializeFaro(config: BrowserConfig): Faro { + const coreConfig = makeCoreConfig(config); + + if (!coreConfig) { + return undefined!; + } + + return coreInit(coreConfig); +} diff --git a/packages/react-native-sdk/src/instrumentations/console/index.ts b/packages/react-native-sdk/src/instrumentations/console/index.ts new file mode 100644 index 000000000..07f044954 --- /dev/null +++ b/packages/react-native-sdk/src/instrumentations/console/index.ts @@ -0,0 +1,3 @@ +export { ConsoleInstrumentation } from './instrumentation'; + +export type { ConsoleInstrumentationOptions } from './types'; diff --git a/packages/react-native-sdk/src/instrumentations/console/instrumentation.test.ts b/packages/react-native-sdk/src/instrumentations/console/instrumentation.test.ts new file mode 100644 index 000000000..49d7ae909 --- /dev/null +++ b/packages/react-native-sdk/src/instrumentations/console/instrumentation.test.ts @@ -0,0 +1,197 @@ +import { initializeFaro, LogLevel, TransportItem } from '@grafana/faro-core'; +import type { ExceptionEvent, LogEvent } from '@grafana/faro-core'; +import { mockConfig, MockTransport } from '@grafana/faro-core/src/testUtils'; + +import { makeCoreConfig } from '../../config'; + +import { ConsoleInstrumentation } from './instrumentation'; + +describe('ConsoleInstrumentation', () => { + const originalConsole = console; + + beforeEach(() => { + global.console = { + error: jest.fn(), + log: jest.fn(), + info: jest.fn(), + warn: jest.fn(), + trace: jest.fn(), + debug: jest.fn(), + } as unknown as Console; + }); + + afterEach(() => { + jest.resetAllMocks(); + jest.restoreAllMocks(); + global.console = originalConsole; + }); + + it('sends a faro error when console.error is called', () => { + const mockTransport = new MockTransport(); + + initializeFaro( + makeCoreConfig( + mockConfig({ + transports: [mockTransport], + instrumentations: [new ConsoleInstrumentation()], + unpatchedConsole: { + error: jest.fn(), + } as unknown as Console, + }) + )! + ); + + console.error('console.error no 1'); + console.error('with object', { foo: 'bar', baz: 'bam' }); + + expect(mockTransport.items).toHaveLength(2); + + expect((mockTransport.items[0] as TransportItem)?.payload.type).toBe('Error'); + expect((mockTransport.items[0] as TransportItem)?.payload.value).toBe( + 'console.error: console.error no 1' + ); + expect((mockTransport.items[1] as TransportItem)?.payload.type).toBe('Error'); + expect((mockTransport.items[1] as TransportItem)?.payload.value).toBe( + 'console.error: with object [object Object]' + ); + }); + + it('Handles objects with circular references', () => { + const mockTransport = new MockTransport(); + + initializeFaro( + makeCoreConfig( + mockConfig({ + transports: [mockTransport], + instrumentations: [new ConsoleInstrumentation()], + unpatchedConsole: { + error: jest.fn(), + } as unknown as Console, + }) + )! + ); + + const objWithCircularRef = { foo: 'bar', baz: 'bam' }; + (objWithCircularRef as any).circular = objWithCircularRef; + + console.error('with circular refs object', objWithCircularRef); + + expect((mockTransport.items[0] as TransportItem)?.payload.value).toBe( + 'console.error: with circular refs object [object Object]' + ); + }); + + it('sends a faro log for console.error calls if configured', () => { + const mockTransport = new MockTransport(); + + initializeFaro( + makeCoreConfig( + mockConfig({ + transports: [mockTransport], + instrumentations: [new ConsoleInstrumentation()], + unpatchedConsole: { + error: jest.fn(), + } as unknown as Console, + consoleInstrumentation: { + consoleErrorAsLog: true, + }, + }) + )! + ); + + console.error('console.error log no 1'); + console.error('console.error log with object', { foo: 'bar', baz: 'bam' }); + + expect(mockTransport.items).toHaveLength(2); + + expect((mockTransport.items[0] as TransportItem)?.payload.message).toBe('console.error log no 1'); + expect((mockTransport.items[1] as TransportItem)?.payload.message).toBe( + 'console.error log with object [object Object]' + ); + }); + + it('Uses legacy config options', () => { + const mockTransport = new MockTransport(); + initializeFaro( + makeCoreConfig( + mockConfig({ + transports: [mockTransport], + instrumentations: [ + new ConsoleInstrumentation({ + consoleErrorAsLog: true, + disabledLevels: [LogLevel.LOG], + }), + ], + unpatchedConsole: { + error: jest.fn(), + log: jest.fn(), + info: jest.fn(), + } as unknown as Console, + }) + )! + ); + + console.error('error logs are enabled'); + console.info('info logs are enabled'); + console.log('log logs are disabled'); + + expect(mockTransport.items).toHaveLength(2); + expect((mockTransport.items[0] as TransportItem)?.payload.message).toBe('error logs are enabled'); + expect((mockTransport.items[1] as TransportItem)?.payload.message).toBe('info logs are enabled'); + }); + + it('sends logs for the default enabled event if no config is provided', () => { + const mockTransport = new MockTransport(); + + initializeFaro( + makeCoreConfig( + mockConfig({ + transports: [mockTransport], + instrumentations: [new ConsoleInstrumentation()], + unpatchedConsole: { + error: jest.fn(), + log: jest.fn(), + info: jest.fn(), + warn: jest.fn(), + trace: jest.fn(), + debug: jest.fn(), + } as unknown as Console, + }) + )! + ); + + // included by default + const infoLogMessage = 'info is logged by default'; + console.info(infoLogMessage); + + const warnLogMessage = 'warn is logged by default'; + console.warn(warnLogMessage); + + const errorLogMessage = 'error is logged by default'; + console.error(errorLogMessage); + + const excludedLogMessage = "log isn't logged by default"; + + // excluded by default + console.log(excludedLogMessage); + const excludedTraceLogMessage = "trace isn't logged by default"; + // eslint-disable-next-line no-console + console.trace(excludedTraceLogMessage); + const excludedDebugMessage = "debug isn't logged by default"; + // eslint-disable-next-line no-console + console.debug(excludedDebugMessage); + + expect(mockTransport.items).toHaveLength(3); + + expect((mockTransport.items[0] as TransportItem)?.payload.message).toBe(infoLogMessage); + expect((mockTransport.items[0] as TransportItem)?.payload.level).toBe('info'); + + expect((mockTransport.items[1] as TransportItem)?.payload.message).toBe(warnLogMessage); + expect((mockTransport.items[1] as TransportItem)?.payload.level).toBe('warn'); + + // error is logged by default and is logged as an exception signal + expect((mockTransport.items[2] as TransportItem)?.payload.value).toBe( + 'console.error: ' + errorLogMessage + ); + }); +}); diff --git a/packages/react-native-sdk/src/instrumentations/console/instrumentation.ts b/packages/react-native-sdk/src/instrumentations/console/instrumentation.ts new file mode 100644 index 000000000..4dfe8cb3c --- /dev/null +++ b/packages/react-native-sdk/src/instrumentations/console/instrumentation.ts @@ -0,0 +1,40 @@ +import { allLogLevels, BaseInstrumentation, defaultLogArgsSerializer, LogLevel, VERSION } from '@grafana/faro-core'; + +import type { ConsoleInstrumentationOptions } from './types'; + +export class ConsoleInstrumentation extends BaseInstrumentation { + readonly name = '@grafana/faro-web-sdk:instrumentation-console'; + readonly version = VERSION; + + static defaultDisabledLevels: LogLevel[] = [LogLevel.DEBUG, LogLevel.TRACE, LogLevel.LOG]; + + constructor(private options: ConsoleInstrumentationOptions = {}) { + super(); + } + + initialize() { + this.logDebug('Initializing\n', this.options); + this.options = { ...this.options, ...this.config.consoleInstrumentation }; + + allLogLevels + .filter( + (level) => !(this.options?.disabledLevels ?? ConsoleInstrumentation.defaultDisabledLevels).includes(level) + ) + .forEach((level) => { + /* eslint-disable-next-line no-console */ + console[level] = (...args) => { + try { + if (level === LogLevel.ERROR && !this.options?.consoleErrorAsLog) { + this.api.pushError(new Error('console.error: ' + defaultLogArgsSerializer(args))); + } else { + this.api.pushLog(args, { level }); + } + } catch (err) { + this.logError(err); + } finally { + this.unpatchedConsole[level](...args); + } + }; + }); + } +} diff --git a/packages/react-native-sdk/src/instrumentations/console/types.ts b/packages/react-native-sdk/src/instrumentations/console/types.ts new file mode 100644 index 000000000..4c8166a3d --- /dev/null +++ b/packages/react-native-sdk/src/instrumentations/console/types.ts @@ -0,0 +1,7 @@ +import type { Config } from '@grafana/faro-core'; + +/** + * @deprecated Configure console instrumentation using the `consoleInstrumentation` object in the + * Faro config. + */ +export type ConsoleInstrumentationOptions = Config['consoleInstrumentation']; diff --git a/packages/react-native-sdk/src/instrumentations/errors/const.ts b/packages/react-native-sdk/src/instrumentations/errors/const.ts new file mode 100644 index 000000000..6b97592b0 --- /dev/null +++ b/packages/react-native-sdk/src/instrumentations/errors/const.ts @@ -0,0 +1,12 @@ +export const primitiveUnhandledValue = 'Non-Error promise rejection captured with value:'; +export const primitiveUnhandledType = 'UnhandledRejection'; + +export const domErrorType = 'DOMError'; +export const domExceptionType = 'DOMException'; + +export const objectEventValue = 'Non-Error exception captured with keys:'; + +export const unknownSymbolString = '?'; + +export const valueTypeRegex = + /^(?:[Uu]ncaught (?:exception: )?)?(?:((?:Eval|Internal|Range|Reference|Syntax|Type|URI|)Error): )?(.*)$/i; diff --git a/packages/react-native-sdk/src/instrumentations/errors/getErrorDetails.ts b/packages/react-native-sdk/src/instrumentations/errors/getErrorDetails.ts new file mode 100644 index 000000000..40658b43b --- /dev/null +++ b/packages/react-native-sdk/src/instrumentations/errors/getErrorDetails.ts @@ -0,0 +1,33 @@ +import { isDomError, isDomException, isError, isErrorEvent, isEvent, isObject } from '@grafana/faro-core'; +import type { ExceptionStackFrame } from '@grafana/faro-core'; + +import { domErrorType, domExceptionType, objectEventValue } from './const'; +import { getStackFramesFromError } from './stackFrames'; +import type { ErrorEvent } from './types'; + +export function getErrorDetails(evt: ErrorEvent): [string | undefined, string | undefined, ExceptionStackFrame[]] { + let value: string | undefined; + let type: string | undefined; + let stackFrames: ExceptionStackFrame[] = []; + let isDomErrorRes: boolean | undefined; + let isEventRes: boolean | undefined; + + if (isErrorEvent(evt) && evt.error) { + value = evt.error.message; + type = evt.error.name; + stackFrames = getStackFramesFromError(evt.error); + } else if ((isDomErrorRes = isDomError(evt)) || isDomException(evt)) { + const { name, message } = evt; + + type = name ?? (isDomErrorRes ? domErrorType : domExceptionType); + value = message ? `${type}: ${message}` : type; + } else if (isError(evt)) { + value = evt.message; + stackFrames = getStackFramesFromError(evt); + } else if (isObject(evt) || (isEventRes = isEvent(evt))) { + type = isEventRes ? evt.constructor.name : undefined; + value = `${objectEventValue} ${Object.keys(evt)}`; + } + + return [value, type, stackFrames]; +} diff --git a/packages/react-native-sdk/src/instrumentations/errors/getValueAndTypeFromMessage.ts b/packages/react-native-sdk/src/instrumentations/errors/getValueAndTypeFromMessage.ts new file mode 100644 index 000000000..7781e1435 --- /dev/null +++ b/packages/react-native-sdk/src/instrumentations/errors/getValueAndTypeFromMessage.ts @@ -0,0 +1,12 @@ +import { defaultExceptionType } from '@grafana/faro-core'; + +import { valueTypeRegex } from './const'; + +export function getValueAndTypeFromMessage(message: string): [string, string] { + const groups = message.match(valueTypeRegex); + + const type = groups?.[1] ?? defaultExceptionType; + const value = groups?.[2] ?? message; + + return [value, type]; +} diff --git a/packages/react-native-sdk/src/instrumentations/errors/index.ts b/packages/react-native-sdk/src/instrumentations/errors/index.ts new file mode 100644 index 000000000..903343a78 --- /dev/null +++ b/packages/react-native-sdk/src/instrumentations/errors/index.ts @@ -0,0 +1,5 @@ +export { ErrorsInstrumentation } from './instrumentation'; + +export { buildStackFrame, getDataFromSafariExtensions, getStackFramesFromError, parseStacktrace } from './stackFrames'; + +export type { ErrorEvent, ExtendedPromiseRejectionEvent } from './types'; diff --git a/packages/react-native-sdk/src/instrumentations/errors/instrumentation.ts b/packages/react-native-sdk/src/instrumentations/errors/instrumentation.ts new file mode 100644 index 000000000..2fbd2dfdb --- /dev/null +++ b/packages/react-native-sdk/src/instrumentations/errors/instrumentation.ts @@ -0,0 +1,17 @@ +import { BaseInstrumentation, VERSION } from '@grafana/faro-core'; + +import { registerOnerror } from './registerOnerror'; +import { registerOnunhandledrejection } from './registerOnunhandledrejection'; + +export class ErrorsInstrumentation extends BaseInstrumentation { + readonly name = '@grafana/faro-web-sdk:instrumentation-errors'; + readonly version = VERSION; + + initialize(): void { + this.logDebug('Initializing'); + + registerOnerror(this.api); + + registerOnunhandledrejection(this.api); + } +} diff --git a/packages/react-native-sdk/src/instrumentations/errors/registerOnerror.test.ts b/packages/react-native-sdk/src/instrumentations/errors/registerOnerror.test.ts new file mode 100644 index 000000000..c4f9a118f --- /dev/null +++ b/packages/react-native-sdk/src/instrumentations/errors/registerOnerror.test.ts @@ -0,0 +1,28 @@ +import { mockConfig, MockTransport } from '@grafana/faro-core/src/testUtils'; + +import { initializeFaro } from '../../initialize'; + +import { registerOnerror } from './registerOnerror'; + +describe('registerOnerror', () => { + it('will preserve the old callback', () => { + let called = false; + + window.onerror = () => { + called = true; + }; + + const transport = new MockTransport(); + const { api } = initializeFaro( + mockConfig({ + transports: [transport], + }) + ); + + registerOnerror(api); + + window.onerror('boo', 'some file', 10, 10, new Error('boo')); + expect(called).toBe(true); + expect(transport.items).toHaveLength(1); + }); +}); diff --git a/packages/react-native-sdk/src/instrumentations/errors/registerOnerror.ts b/packages/react-native-sdk/src/instrumentations/errors/registerOnerror.ts new file mode 100644 index 000000000..2142675de --- /dev/null +++ b/packages/react-native-sdk/src/instrumentations/errors/registerOnerror.ts @@ -0,0 +1,39 @@ +import { isString } from '@grafana/faro-core'; +import type { API, ExceptionStackFrame } from '@grafana/faro-core'; + +import { unknownSymbolString } from './const'; +import { getErrorDetails } from './getErrorDetails'; +import { getValueAndTypeFromMessage } from './getValueAndTypeFromMessage'; +import { buildStackFrame } from './stackFrames'; + +export function registerOnerror(api: API): void { + const oldOnerror = window.onerror; + + window.onerror = (...args) => { + try { + const [evt, source, lineno, colno, error] = args; + let value: string | undefined; + let type: string | undefined; + let stackFrames: ExceptionStackFrame[] = []; + const eventIsString = isString(evt); + const initialStackFrame = buildStackFrame(source, unknownSymbolString, lineno, colno); + + if (error || !eventIsString) { + [value, type, stackFrames] = getErrorDetails((error ?? evt) as Error | Event); + + if (stackFrames.length === 0) { + stackFrames = [initialStackFrame]; + } + } else if (eventIsString) { + [value, type] = getValueAndTypeFromMessage(evt); + stackFrames = [initialStackFrame]; + } + + if (value) { + api.pushError(new Error(value), { type, stackFrames }); + } + } finally { + oldOnerror?.apply(window, args); + } + }; +} diff --git a/packages/react-native-sdk/src/instrumentations/errors/registerOnunhandledrejection.ts b/packages/react-native-sdk/src/instrumentations/errors/registerOnunhandledrejection.ts new file mode 100644 index 000000000..a8c10591c --- /dev/null +++ b/packages/react-native-sdk/src/instrumentations/errors/registerOnunhandledrejection.ts @@ -0,0 +1,32 @@ +import { ExceptionStackFrame, isPrimitive } from '@grafana/faro-core'; +import type { API } from '@grafana/faro-core'; + +import { primitiveUnhandledType, primitiveUnhandledValue } from './const'; +import { getErrorDetails } from './getErrorDetails'; +import type { ExtendedPromiseRejectionEvent } from './types'; + +export function registerOnunhandledrejection(api: API): void { + window.addEventListener('unhandledrejection', (evt: ExtendedPromiseRejectionEvent) => { + let error = evt; + + if (error.reason) { + error = evt.reason; + } else if (evt.detail?.reason) { + error = evt.detail?.reason; + } + + let value: string | undefined; + let type: string | undefined; + let stackFrames: ExceptionStackFrame[] = []; + if (isPrimitive(error)) { + value = `${primitiveUnhandledValue} ${String(error)}`; + type = primitiveUnhandledType; + } else { + [value, type, stackFrames] = getErrorDetails(error); + } + + if (value) { + api.pushError(new Error(value), { type, stackFrames }); + } + }); +} diff --git a/packages/react-native-sdk/src/instrumentations/errors/stackFrames/buildStackFrame.ts b/packages/react-native-sdk/src/instrumentations/errors/stackFrames/buildStackFrame.ts new file mode 100644 index 000000000..9d0012303 --- /dev/null +++ b/packages/react-native-sdk/src/instrumentations/errors/stackFrames/buildStackFrame.ts @@ -0,0 +1,25 @@ +import type { ExceptionStackFrame } from '@grafana/faro-core'; + +import { unknownSymbolString } from './const'; + +export function buildStackFrame( + filename: string | undefined, + func: string | undefined, + lineno: number | undefined, + colno: number | undefined +): ExceptionStackFrame { + const stackFrame: ExceptionStackFrame = { + filename: filename || document.location.href, + function: func || unknownSymbolString, + }; + + if (lineno !== undefined) { + stackFrame.lineno = lineno; + } + + if (colno !== undefined) { + stackFrame.colno = colno; + } + + return stackFrame; +} diff --git a/packages/react-native-sdk/src/instrumentations/errors/stackFrames/const.ts b/packages/react-native-sdk/src/instrumentations/errors/stackFrames/const.ts new file mode 100644 index 000000000..00dd57d7e --- /dev/null +++ b/packages/react-native-sdk/src/instrumentations/errors/stackFrames/const.ts @@ -0,0 +1,21 @@ +export const newLineString = '\n'; +export const evalString = 'eval'; +export const unknownSymbolString = '?'; +export const atString = '@'; + +export const webkitLineRegex = + /^\s*at (?:(.*\).*?|.*?) ?\((?:address at )?)?((?:file|https?|blob|chrome-extension|address|native|eval|webpack||[-a-z]+:|.*bundle|\/)?.*?)(?::(\d+))?(?::(\d+))?\)?\s*$/i; +export const webkitEvalRegex = /\((\S*)(?::(\d+))(?::(\d+))\)/; +export const webkitEvalString = 'eval'; +export const webkitAddressAtString = 'address at '; +export const webkitAddressAtStringLength = webkitAddressAtString.length; + +export const firefoxLineRegex = + /^\s*(.*?)(?:\((.*?)\))?(?:^|@)?((?:file|https?|blob|chrome|webpack|resource|moz-extension|safari-extension|safari-web-extension|capacitor)?:\/.*?|\[native code]|[^@]*(?:bundle|\d+\.js)|\/[\w\-. /=]+)(?::(\d+))?(?::(\d+))?\s*$/i; +export const firefoxEvalRegex = /(\S+) line (\d+)(?: > eval line \d+)* > eval/i; +export const firefoxEvalString = ' > eval'; + +export const safariExtensionString = 'safari-extension'; +export const safariWebExtensionString = 'safari-web-extension'; + +export const reactMinifiedRegex = /Minified React error #\d+;/i; diff --git a/packages/react-native-sdk/src/instrumentations/errors/stackFrames/getDataFromSafariExtensions.ts b/packages/react-native-sdk/src/instrumentations/errors/stackFrames/getDataFromSafariExtensions.ts new file mode 100644 index 000000000..a27260f2d --- /dev/null +++ b/packages/react-native-sdk/src/instrumentations/errors/stackFrames/getDataFromSafariExtensions.ts @@ -0,0 +1,18 @@ +import { atString, safariExtensionString, safariWebExtensionString } from './const'; + +export function getDataFromSafariExtensions( + func: string | undefined, + filename: string | undefined +): [string | undefined, string | undefined] { + const isSafariExtension = func?.includes(safariExtensionString); + const isSafariWebExtension = !isSafariExtension && func?.includes(safariWebExtensionString); + + if (!isSafariExtension && !isSafariWebExtension) { + return [func, filename]; + } + + return [ + func?.includes(atString) ? func.split(atString)[0] : func, + isSafariExtension ? `${safariExtensionString}:${filename}` : `${safariWebExtensionString}:${filename}`, + ]; +} diff --git a/packages/react-native-sdk/src/instrumentations/errors/stackFrames/getStackFramesFromError.ts b/packages/react-native-sdk/src/instrumentations/errors/stackFrames/getStackFramesFromError.ts new file mode 100644 index 000000000..e18627d96 --- /dev/null +++ b/packages/react-native-sdk/src/instrumentations/errors/stackFrames/getStackFramesFromError.ts @@ -0,0 +1,89 @@ +import { isNumber } from '@grafana/faro-core'; +import type { ExceptionStackFrame, ExtendedError } from '@grafana/faro-core'; + +import { buildStackFrame } from './buildStackFrame'; +import { + evalString, + firefoxEvalRegex, + firefoxEvalString, + firefoxLineRegex, + newLineString, + reactMinifiedRegex, + webkitAddressAtString, + webkitAddressAtStringLength, + webkitEvalRegex, + webkitEvalString, + webkitLineRegex, +} from './const'; +import { getDataFromSafariExtensions } from './getDataFromSafariExtensions'; + +export function getStackFramesFromError(error: ExtendedError): ExceptionStackFrame[] { + let lines: string[] = []; + + if (error.stacktrace) { + lines = error.stacktrace.split(newLineString).filter((_line, idx) => idx % 2 === 0); + } else if (error.stack) { + lines = error.stack.split(newLineString); + } + + const stackFrames = lines.reduce((acc, line, idx) => { + let parts: RegExpExecArray | null; + let func: string | undefined; + let filename: string | undefined; + let lineno: string | undefined; + let colno: string | undefined; + + if ((parts = webkitLineRegex.exec(line))) { + func = parts[1]; + filename = parts[2]; + lineno = parts[3]; + colno = parts[4]; + + if (filename?.startsWith(webkitEvalString)) { + const submatch = webkitEvalRegex.exec(filename); + + if (submatch) { + filename = submatch[1]; + lineno = submatch[2]; + colno = submatch[3]; + } + } + + filename = filename?.startsWith(webkitAddressAtString) + ? filename.substring(webkitAddressAtStringLength) + : filename; + [func, filename] = getDataFromSafariExtensions(func, filename); + } else if ((parts = firefoxLineRegex.exec(line))) { + func = parts[1]; + filename = parts[3]; + lineno = parts[4]; + colno = parts[5]; + + if (!!filename && filename.includes(firefoxEvalString)) { + const submatch = firefoxEvalRegex.exec(filename); + + if (submatch) { + func = func || evalString; + filename = submatch[1]; + lineno = submatch[2]; + } + } else if (idx === 0 && !colno && isNumber(error.columnNumber)) { + colno = String(error.columnNumber! + 1); + } + + [func, filename] = getDataFromSafariExtensions(func, filename); + } + + if (filename || func) { + acc.push(buildStackFrame(filename, func, lineno ? Number(lineno) : undefined, colno ? Number(colno) : undefined)); + } + + return acc; + }, [] as ExceptionStackFrame[]); + + if (reactMinifiedRegex.test(error.message)) { + return stackFrames.slice(1); + } + + return stackFrames; +} diff --git a/packages/react-native-sdk/src/instrumentations/errors/stackFrames/index.ts b/packages/react-native-sdk/src/instrumentations/errors/stackFrames/index.ts new file mode 100644 index 000000000..57049b8f8 --- /dev/null +++ b/packages/react-native-sdk/src/instrumentations/errors/stackFrames/index.ts @@ -0,0 +1,7 @@ +export { buildStackFrame } from './buildStackFrame'; + +export { getDataFromSafariExtensions } from './getDataFromSafariExtensions'; + +export { getStackFramesFromError } from './getStackFramesFromError'; + +export { parseStacktrace } from './parseStacktrace'; diff --git a/packages/react-native-sdk/src/instrumentations/errors/stackFrames/parseStacktrace.ts b/packages/react-native-sdk/src/instrumentations/errors/stackFrames/parseStacktrace.ts new file mode 100644 index 000000000..353855c94 --- /dev/null +++ b/packages/react-native-sdk/src/instrumentations/errors/stackFrames/parseStacktrace.ts @@ -0,0 +1,9 @@ +import type { ExtendedError, Stacktrace } from '@grafana/faro-core'; + +import { getStackFramesFromError } from './getStackFramesFromError'; + +export function parseStacktrace(error: ExtendedError): Stacktrace { + return { + frames: getStackFramesFromError(error), + }; +} diff --git a/packages/react-native-sdk/src/instrumentations/errors/types.ts b/packages/react-native-sdk/src/instrumentations/errors/types.ts new file mode 100644 index 000000000..4eabd1286 --- /dev/null +++ b/packages/react-native-sdk/src/instrumentations/errors/types.ts @@ -0,0 +1,9 @@ +export interface ExtendedPromiseRejectionEvent extends PromiseRejectionEvent { + detail?: { + reason: PromiseRejectionEvent['reason']; + }; +} + +export type ErrorEvent = (Error | Event) & { + error?: Error; +}; diff --git a/packages/react-native-sdk/src/instrumentations/index.ts b/packages/react-native-sdk/src/instrumentations/index.ts new file mode 100644 index 000000000..c5206d789 --- /dev/null +++ b/packages/react-native-sdk/src/instrumentations/index.ts @@ -0,0 +1,29 @@ +export { SessionInstrumentation } from './session'; + +export { ConsoleInstrumentation } from './console'; +export type { ConsoleInstrumentationOptions } from './console'; + +export { + buildStackFrame, + ErrorsInstrumentation, + getDataFromSafariExtensions, + getStackFramesFromError, + parseStacktrace, +} from './errors'; +export type { ErrorEvent, ExtendedPromiseRejectionEvent } from './errors'; + +export { ViewInstrumentation } from './view'; + +export { WebVitalsInstrumentation } from './webVitals'; + +export { + PersistentSessionsManager, + VolatileSessionsManager, + MAX_SESSION_PERSISTENCE_TIME, + MAX_SESSION_PERSISTENCE_TIME_BUFFER, + SESSION_EXPIRATION_TIME, + SESSION_INACTIVITY_TIME, + STORAGE_KEY, +} from './session'; + +export { PerformanceInstrumentation } from './performance'; diff --git a/packages/react-native-sdk/src/instrumentations/instrumentationConstants.ts b/packages/react-native-sdk/src/instrumentations/instrumentationConstants.ts new file mode 100644 index 000000000..b634fc93e --- /dev/null +++ b/packages/react-native-sdk/src/instrumentations/instrumentationConstants.ts @@ -0,0 +1 @@ +export const NAVIGATION_ID_STORAGE_KEY = 'com.grafana.faro.lastNavigationId'; diff --git a/packages/react-native-sdk/src/instrumentations/performance/index.ts b/packages/react-native-sdk/src/instrumentations/performance/index.ts new file mode 100644 index 000000000..2ff437d05 --- /dev/null +++ b/packages/react-native-sdk/src/instrumentations/performance/index.ts @@ -0,0 +1 @@ +export { PerformanceInstrumentation } from './instrumentation'; diff --git a/packages/react-native-sdk/src/instrumentations/performance/instrumentation.test.ts b/packages/react-native-sdk/src/instrumentations/performance/instrumentation.test.ts new file mode 100644 index 000000000..810c53ea2 --- /dev/null +++ b/packages/react-native-sdk/src/instrumentations/performance/instrumentation.test.ts @@ -0,0 +1,152 @@ +import { initializeFaro } from '@grafana/faro-core'; +import type { EventEvent, TransportItem } from '@grafana/faro-core'; +import { mockConfig, mockInternalLogger, MockTransport } from '@grafana/faro-core/src/testUtils'; + +import { FetchTransport } from '../../transports'; + +import { PerformanceInstrumentation } from './instrumentation'; +import * as navigationModule from './navigation'; +import * as performanceUtilsModule from './performanceUtils'; +import { + analyticsEntry1, + analyticsEntry2, + performanceNavigationEntry, + performanceResourceEntry, +} from './performanceUtilsTestData'; +import * as resourceModule from './resource'; +import type { FaroNavigationItem } from './types'; + +class MockPerformanceObserver { + constructor(private cb: PerformanceObserverCallback) {} + + disconnect = jest.fn(); + + observe() { + this.cb( + { + getEntries() { + return [ + { + name: performanceNavigationEntry.name, + toJSON: () => ({ + ...performanceNavigationEntry, + }), + }, + { + name: performanceResourceEntry.name, + toJSON: () => ({ + ...performanceResourceEntry, + }), + }, + { + name: analyticsEntry1.name, + toJSON: () => ({ + ...analyticsEntry1, + }), + }, + { + name: analyticsEntry2.name, + toJSON: () => ({ + ...analyticsEntry2, + }), + }, + ]; + }, + } as any, + {} as PerformanceObserver + ); + } +} + +const originalPerformanceObserver = (global as any).PerformanceObserver; + +(global as any).PerformanceObserver = MockPerformanceObserver; + +describe('Performance Instrumentation', () => { + afterEach(() => { + jest.clearAllMocks(); + jest.restoreAllMocks(); + }); + + afterAll(() => { + (global as any).PerformanceObserver = originalPerformanceObserver; + }); + + it('Stops initialization if performance observer is not supported', () => { + jest.spyOn(performanceUtilsModule, 'performanceObserverSupported').mockReturnValueOnce(false); + + const mockOnDocumentReady = jest.fn(); + jest.spyOn(performanceUtilsModule, 'onDocumentReady').mockImplementationOnce(mockOnDocumentReady); + + const performance = new PerformanceInstrumentation(); + + const mockDebug = jest.fn(); + performance.internalLogger = { ...mockInternalLogger, debug: mockDebug }; + + performance.initialize(); + + expect(mockDebug).toHaveBeenCalledTimes(1); + expect(mockOnDocumentReady).not.toHaveBeenCalled(); + }); + + it('Starts the performance observers', async () => { + const mockOnDocumentReady = jest.fn(); + jest.spyOn(performanceUtilsModule, 'onDocumentReady').mockImplementation((handleReady) => { + mockOnDocumentReady(); + handleReady(); + }); + + const mockObserveResourceTimings = jest.fn(); + jest.spyOn(resourceModule, 'observeResourceTimings').mockImplementationOnce(mockObserveResourceTimings); + + const mockObserveAndGetNavigationTimings = jest.fn(); + jest.spyOn(navigationModule, 'getNavigationTimings').mockImplementationOnce(() => { + mockObserveAndGetNavigationTimings(); + return Promise.resolve({ faroNavigationId: '123' } as FaroNavigationItem); + }); + + const config = mockConfig({ + instrumentations: [new PerformanceInstrumentation()], + }); + + initializeFaro(config); + + expect(mockOnDocumentReady).toHaveBeenCalledTimes(1); + expect(await mockObserveAndGetNavigationTimings).toHaveBeenCalledTimes(1); + + expect(mockObserveResourceTimings).toHaveBeenCalledTimes(1); + expect(mockObserveResourceTimings).toHaveBeenCalledWith('123', expect.anything(), expect.anything()); + }); + + it('Excludes entries which match the global ignoreUrls ', async () => { + const mockObserveAndGetNavigationTimings = jest.fn(); + jest.spyOn(navigationModule, 'getNavigationTimings').mockImplementationOnce(() => { + mockObserveAndGetNavigationTimings(); + return Promise.resolve({ faroNavigationId: '123' } as FaroNavigationItem); + }); + + const fetchTransport = new FetchTransport({ url: 'abc' }); + const config = mockConfig({ + transports: [fetchTransport], + instrumentations: [new PerformanceInstrumentation()], + ignoreUrls: [/.*foo-analytics/, /.*.analytics.com/, 'http://example.com/awesome-image'], + trackResources: true, + }); + + const faro = initializeFaro(config); + + const mockTransport = new MockTransport( + faro.transports.transports.flatMap((transport) => transport.getIgnoreUrls()) + ); + + faro.transports.add(mockTransport); + faro.transports.remove(fetchTransport); + + expect(await mockObserveAndGetNavigationTimings).toHaveBeenCalledTimes(1); + + expect(mockTransport.items.length).toBe(1); + + const item = mockTransport.items[0] as TransportItem; + expect(item.payload.attributes?.['name']).toBe('http://example.com'); + }); +}); diff --git a/packages/react-native-sdk/src/instrumentations/performance/instrumentation.ts b/packages/react-native-sdk/src/instrumentations/performance/instrumentation.ts new file mode 100644 index 000000000..e5d78dfcf --- /dev/null +++ b/packages/react-native-sdk/src/instrumentations/performance/instrumentation.ts @@ -0,0 +1,33 @@ +import { BaseInstrumentation, VERSION } from '@grafana/faro-core'; +import type { Patterns } from '@grafana/faro-core'; + +import { getNavigationTimings } from './navigation'; +import { onDocumentReady, performanceObserverSupported } from './performanceUtils'; +import { observeResourceTimings } from './resource'; + +export class PerformanceInstrumentation extends BaseInstrumentation { + readonly name = '@grafana/faro-web-sdk:instrumentation-performance'; + readonly version = VERSION; + + initialize() { + if (!performanceObserverSupported()) { + this.logDebug('performance observer not supported. Disable performance instrumentation.'); + return; + } + + onDocumentReady(async () => { + const pushEvent = this.api.pushEvent; + const ignoredUrls = this.getIgnoreUrls(); + + const { faroNavigationId } = await getNavigationTimings(pushEvent, ignoredUrls); + + if (faroNavigationId != null) { + observeResourceTimings(faroNavigationId, pushEvent, ignoredUrls); + } + }); + } + + private getIgnoreUrls(): Patterns { + return this.transports.transports?.flatMap((transport) => transport.getIgnoreUrls()); + } +} diff --git a/packages/react-native-sdk/src/instrumentations/performance/navigation.test.ts b/packages/react-native-sdk/src/instrumentations/performance/navigation.test.ts new file mode 100644 index 000000000..fbde6d74e --- /dev/null +++ b/packages/react-native-sdk/src/instrumentations/performance/navigation.test.ts @@ -0,0 +1,172 @@ +import * as faroCoreModule from '@grafana/faro-core'; + +import * as webStorageModule from '../../utils/webStorage'; +import { webStorageType } from '../../utils/webStorage'; +import { NAVIGATION_ID_STORAGE_KEY } from '../instrumentationConstants'; + +import { getNavigationTimings } from './navigation'; +import * as performanceUtilsModule from './performanceUtils'; +import { createFaroNavigationTiming, createFaroResourceTiming } from './performanceUtils'; +import { performanceNavigationEntry, performanceResourceEntry } from './performanceUtilsTestData'; + +describe('Navigation observer', () => { + const originalTimeOrigin = performance.timeOrigin; + const mockTimeOriginValue = 1722437937; + Object.defineProperty(performance, 'timeOrigin', { + value: mockTimeOriginValue, + configurable: true, + }); + + class MockPerformanceObserver { + constructor(private cb: PerformanceObserverCallback) {} + + disconnect = jest.fn(); + + observe() { + this.cb( + { + getEntries() { + return [ + { + name: performanceNavigationEntry.name, + toJSON: () => ({ + ...performanceNavigationEntry, + }), + }, + { + name: performanceResourceEntry.name, + toJSON: () => ({ + ...performanceResourceEntry, + }), + }, + ]; + }, + } as any, + {} as PerformanceObserver + ); + } + } + + const originalPerformanceObserver = (global as any).PerformanceObserver; + + (global as any).PerformanceObserver = MockPerformanceObserver; + + beforeEach(() => { + jest.clearAllMocks(); + }); + + afterAll(() => { + jest.restoreAllMocks(); + + (global as any).PerformanceObserver = originalPerformanceObserver; + + Object.defineProperty(performance, 'timeOrigin', { + value: originalTimeOrigin, + configurable: true, + }); + }); + + it('Ignores entries where name matches ignoredUrls entry', () => { + const mockPushEvent = jest.fn(); + + const mockEntryUrlIsIgnored = jest.fn(() => true); + jest.spyOn(performanceUtilsModule, 'entryUrlIsIgnored').mockImplementationOnce(mockEntryUrlIsIgnored); + + const ignoredUrls = ['http://example.com']; + getNavigationTimings(mockPushEvent, ignoredUrls); + + expect(mockEntryUrlIsIgnored).toBeCalledTimes(1); + expect(mockEntryUrlIsIgnored).toBeCalledWith(ignoredUrls, performanceNavigationEntry.name); + + expect(mockPushEvent).not.toHaveBeenCalled(); + }); + + it('Builds entry for first navigation', () => { + const mockPushEvent = jest.fn(); + jest.spyOn(performanceUtilsModule, 'entryUrlIsIgnored').mockReturnValueOnce(false); + + const mockNavigationId = '123'; + jest.spyOn(faroCoreModule, 'genShortID').mockReturnValueOnce(mockNavigationId); + + getNavigationTimings(mockPushEvent, ['']); + + expect(mockPushEvent).toHaveBeenCalledTimes(1); + expect(mockPushEvent).toHaveBeenCalledWith( + 'faro.performance.navigation', + { + ...createFaroResourceTiming(performanceNavigationEntry), + ...createFaroNavigationTiming(performanceNavigationEntry), + faroNavigationId: mockNavigationId, + faroPreviousNavigationId: faroCoreModule.unknownString, + }, + undefined, + { + spanContext: { traceId: '0af7651916cd43dd8448eb211c80319c', spanId: 'b7ad6b7169203331' }, + timestampOverwriteMs: mockTimeOriginValue, + } + ); + }); + + it('Captures Server-Timings for w3c trace context', () => { + const mockPushEvent = jest.fn(); + jest.spyOn(performanceUtilsModule, 'entryUrlIsIgnored').mockReturnValueOnce(false); + + const mockNavigationId = '123'; + jest.spyOn(faroCoreModule, 'genShortID').mockReturnValueOnce(mockNavigationId); + + getNavigationTimings(mockPushEvent, ['']); + + expect(mockPushEvent).toHaveBeenCalledTimes(1); + expect(mockPushEvent).toHaveBeenNthCalledWith(1, expect.anything(), expect.anything(), undefined, { + spanContext: { traceId: '0af7651916cd43dd8448eb211c80319c', spanId: 'b7ad6b7169203331' }, + timestampOverwriteMs: mockTimeOriginValue, + }); + }); + + it('Builds entry for subsequent navigation', () => { + const mockPushEvent = jest.fn(); + jest.spyOn(performanceUtilsModule, 'entryUrlIsIgnored').mockReturnValueOnce(false); + + const mockNewNavigationId = '456'; + jest.spyOn(faroCoreModule, 'genShortID').mockReturnValueOnce(mockNewNavigationId); + + const mockPreviousNavigationId = '123'; + jest.spyOn(webStorageModule, 'getItem').mockReturnValueOnce(mockPreviousNavigationId); + + getNavigationTimings(mockPushEvent, ['']); + + expect(mockPushEvent).toHaveBeenCalledTimes(1); + expect(mockPushEvent).toHaveBeenCalledWith( + 'faro.performance.navigation', + { + ...createFaroResourceTiming(performanceNavigationEntry), + ...createFaroNavigationTiming(performanceNavigationEntry), + faroNavigationId: mockNewNavigationId, + faroPreviousNavigationId: mockPreviousNavigationId, + }, + undefined, + { + spanContext: { traceId: '0af7651916cd43dd8448eb211c80319c', spanId: 'b7ad6b7169203331' }, + timestampOverwriteMs: mockTimeOriginValue, + } + ); + }); + + it('Stores navigationId in sessionStorage', () => { + const mockPushEvent = jest.fn(); + jest.spyOn(performanceUtilsModule, 'entryUrlIsIgnored').mockReturnValueOnce(false); + + const mockNewNavigationId = '456'; + jest.spyOn(faroCoreModule, 'genShortID').mockReturnValueOnce(mockNewNavigationId); + + jest.spyOn(webStorageModule, 'getItem').mockReturnValueOnce(null); + + const mockSetItem = jest.fn(); + jest.spyOn(webStorageModule, 'setItem').mockImplementationOnce(mockSetItem); + + getNavigationTimings(mockPushEvent, ['']); + + expect(mockSetItem).toHaveBeenCalledTimes(1); + expect(mockSetItem).toHaveBeenCalledWith(NAVIGATION_ID_STORAGE_KEY, mockNewNavigationId, webStorageType.session); + }); +}); diff --git a/packages/react-native-sdk/src/instrumentations/performance/navigation.ts b/packages/react-native-sdk/src/instrumentations/performance/navigation.ts new file mode 100644 index 000000000..fde969af5 --- /dev/null +++ b/packages/react-native-sdk/src/instrumentations/performance/navigation.ts @@ -0,0 +1,57 @@ +import { genShortID, unknownString } from '@grafana/faro-core'; +import type { EventsAPI, PushEventOptions } from '@grafana/faro-core'; + +import { getItem, setItem, webStorageType } from '../../utils'; +import { NAVIGATION_ID_STORAGE_KEY } from '../instrumentationConstants'; + +import { NAVIGATION_ENTRY } from './performanceConstants'; +import { createFaroNavigationTiming, entryUrlIsIgnored, getSpanContextFromServerTiming } from './performanceUtils'; +import type { FaroNavigationItem } from './types'; + +type SpanContext = PushEventOptions['spanContext']; + +export function getNavigationTimings( + pushEvent: EventsAPI['pushEvent'], + ignoredUrls: Array +): Promise { + let faroNavigationEntryResolve: (value: FaroNavigationItem) => void; + const faroNavigationEntryPromise = new Promise((resolve) => { + faroNavigationEntryResolve = resolve; + }); + + const observer = new PerformanceObserver((observedEntries) => { + const [navigationEntryRaw] = observedEntries.getEntries(); + + if (navigationEntryRaw == null || entryUrlIsIgnored(ignoredUrls, navigationEntryRaw.name)) { + return; + } + + const navEntryJson = navigationEntryRaw.toJSON(); + + let spanContext: SpanContext = getSpanContextFromServerTiming(navEntryJson?.serverTiming); + + const faroPreviousNavigationId = getItem(NAVIGATION_ID_STORAGE_KEY, webStorageType.session) ?? unknownString; + + const faroNavigationEntry: FaroNavigationItem = { + ...createFaroNavigationTiming(navEntryJson), + faroNavigationId: genShortID(), + faroPreviousNavigationId, + }; + + setItem(NAVIGATION_ID_STORAGE_KEY, faroNavigationEntry.faroNavigationId, webStorageType.session); + + pushEvent('faro.performance.navigation', faroNavigationEntry, undefined, { + spanContext, + timestampOverwriteMs: performance.timeOrigin + navEntryJson.startTime, + }); + + faroNavigationEntryResolve(faroNavigationEntry); + }); + + observer.observe({ + type: NAVIGATION_ENTRY, + buffered: true, + }); + + return faroNavigationEntryPromise; +} diff --git a/packages/react-native-sdk/src/instrumentations/performance/performanceConstants.ts b/packages/react-native-sdk/src/instrumentations/performance/performanceConstants.ts new file mode 100644 index 000000000..051df201c --- /dev/null +++ b/packages/react-native-sdk/src/instrumentations/performance/performanceConstants.ts @@ -0,0 +1,2 @@ +export const NAVIGATION_ENTRY = 'navigation'; +export const RESOURCE_ENTRY = 'resource'; diff --git a/packages/react-native-sdk/src/instrumentations/performance/performanceUtils.test.ts b/packages/react-native-sdk/src/instrumentations/performance/performanceUtils.test.ts new file mode 100644 index 000000000..c593cdde5 --- /dev/null +++ b/packages/react-native-sdk/src/instrumentations/performance/performanceUtils.test.ts @@ -0,0 +1,204 @@ +import { + createFaroNavigationTiming, + createFaroResourceTiming, + getSpanContextFromServerTiming, + includePerformanceEntry, +} from './performanceUtils'; +import { performanceNavigationEntry, performanceResourceEntry } from './performanceUtilsTestData'; +import type { FaroNavigationTiming, FaroResourceTiming } from './types'; + +Object.defineProperty(window, 'performance', { + configurable: true, + value: { + timeOrigin: 0, + timing: { + domLoading: 542, + }, + }, + writable: true, +}); + +describe('performanceUtils', () => { + it(`calculates navigation timing`, () => { + const faroNavigationTiming = createFaroNavigationTiming(performanceNavigationEntry); + expect(faroNavigationTiming).toStrictEqual({ + visibilityState: 'visible', + duration: '2700', + pageLoadTime: '2441', + documentParsingTime: '705', + domProcessingTime: '1431', + onLoadTime: '22', + domContentLoadHandlerTime: '3', + ttfb: '542', + type: 'navigate', + + name: 'http://example.com', + tcpHandshakeTime: '53', + dnsLookupTime: '139', + tlsNegotiationTime: '33', + redirectTime: '1', + requestTime: '109', + responseTime: '0', + responseStatus: '200', + fetchTime: '305', + serviceWorkerTime: '237', + decodedBodySize: '530675', + encodedBodySize: '126111', + cacheHitStatus: 'fullLoad', + renderBlockingStatus: 'unknown', + protocol: 'h2', + initiatorType: 'navigation', + } as FaroNavigationTiming); + }); + + it(`calculates resource timings`, () => { + const faroResourceTiming = createFaroResourceTiming(performanceResourceEntry); + expect(faroResourceTiming).toStrictEqual({ + name: 'http://example.com/awesome-image', + duration: '370', + tcpHandshakeTime: '0', + dnsLookupTime: '0', + tlsNegotiationTime: '11', + redirectTime: '0', + requestTime: '359', + responseTime: '0', + responseStatus: '200', + fetchTime: '370', + serviceWorkerTime: '778', + decodedBodySize: '10526', + encodedBodySize: '10526', + cacheHitStatus: 'fullLoad', + renderBlockingStatus: 'unknown', + protocol: 'h2', + initiatorType: 'img', + ttfb: '359', + visibilityState: 'visible', + } as FaroResourceTiming); + }); + + it(`calculates cacheHitStatus`, () => { + expect(createFaroResourceTiming({ transferSize: 0 } as any).cacheHitStatus).toBe('fullLoad'); + expect(createFaroResourceTiming({ transferSize: 1 } as any).cacheHitStatus).toBe('fullLoad'); + + expect(createFaroResourceTiming({ transferSize: 0, decodedBodySize: 1 } as any).cacheHitStatus).toBe('cache'); + + expect(createFaroResourceTiming({ transferSize: 1, encodedBodySize: 0 } as any).cacheHitStatus).toBe('fullLoad'); + expect(createFaroResourceTiming({ transferSize: 1, encodedBodySize: 1 } as any).cacheHitStatus).toBe('fullLoad'); + expect(createFaroResourceTiming({ transferSize: 1, encodedBodySize: 2 } as any).cacheHitStatus).toBe( + 'conditionalFetch' + ); + + // For browsers supporting the responseStatus property + expect( + createFaroResourceTiming({ transferSize: 1, encodedBodySize: 1, responseStatus: 200 } as any).cacheHitStatus + ).toBe('fullLoad'); + expect( + createFaroResourceTiming({ transferSize: 1, encodedBodySize: 1, responseStatus: 304 } as any).cacheHitStatus + ).toBe('conditionalFetch'); + }); + + it(`Sets renderBlockingStatus`, () => { + // For browsers supporting the responseStatus property + expect(createFaroResourceTiming({ renderBlockingStatus: 'blocking' } as any).renderBlockingStatus).toBe('blocking'); + + // For browsers which do not support the responseStatus property + expect(createFaroResourceTiming({} as any).renderBlockingStatus).toBe('unknown'); + }); + + it(`Sets documentParsingTime to "unknown" in case it is not supported by a certain browser`, () => { + Object.defineProperty(window, 'performance', { + configurable: true, + value: { + timeOrigin: 0, + }, + writable: true, + }); + + const faroNavigationTiming = createFaroNavigationTiming(performanceNavigationEntry); + expect(faroNavigationTiming.documentParsingTime).toBe('unknown'); + }); + + it('Returns true for configured entries ', () => { + const initiatorTypes = ['css', 'fetch', 'xmlhttprequest', 'link', 'script']; + + const entries = initiatorTypes.map((initiatorType) => ({ ...performanceResourceEntry, initiatorType })); + + const matchByValue = includePerformanceEntry(entries[0]!, { initiatorType: 'css' }); + expect(matchByValue).toBe(true); + + const matchByMultiValues1 = includePerformanceEntry(entries[1]!, { + initiatorType: ['fetch', 'xmlhttprequest', 'link'], + }); + expect(matchByMultiValues1).toBe(true); + + const matchByMultiValues2 = includePerformanceEntry(entries[2]!, { + initiatorType: ['fetch', 'xmlhttprequest', 1], + }); + expect(matchByMultiValues2).toBe(true); + }); + + it('Returns true if entries are undefined or empty object', () => { + const initiatorTypes = ['css', 'fetch', 'xmlhttprequest', 'link', 'script']; + + const entries = initiatorTypes.map((initiatorType) => ({ ...performanceResourceEntry, initiatorType })); + + const matchedEntriesUndefined = entries.map((entry) => includePerformanceEntry(entry, undefined)); + expect(matchedEntriesUndefined.every((e) => Boolean(e))).toBe(true); + + const matchedEntriesEmptyObject = entries.map((entry) => includePerformanceEntry(entry, {})); + expect(matchedEntriesEmptyObject.every((e) => Boolean(e))).toBe(true); + }); + + it('Returns false if key or value does not match', () => { + const initiatorTypes = ['css', 'fetch', 'xmlhttprequest', 'link', 'script']; + + const entries = initiatorTypes.map((initiatorType) => ({ ...performanceResourceEntry, initiatorType })); + + const noMatchByValue = includePerformanceEntry(entries[0]!, { initiatorType: 'NO_MATCHING_VALUE' }); + expect(noMatchByValue).toBe(false); + + const noMatchingProperty = includePerformanceEntry(entries[1]!, { initiatorTypeABC: 'abc' }); + expect(noMatchingProperty).toBe(false); + + const matchByMultiValues1 = includePerformanceEntry(entries[1]!, { + initiatorType: ['NOfetch', 'NOxmlhttprequest', 'link'], + }); + expect(matchByMultiValues1).toBe(false); + }); + + it('Can extract a span context if server returns a traceId and spanId', () => { + const serverTimings: PerformanceServerTiming[] = [ + { + name: 'traceparent', + description: '00-0af7651916cd43dd8448eb211c80319c-b7ad6b7169203331-01', + duration: 0, + toJSON(): any {}, + }, + ]; + + const spanContext = getSpanContextFromServerTiming(serverTimings); + expect(spanContext).toStrictEqual({ traceId: '0af7651916cd43dd8448eb211c80319c', spanId: 'b7ad6b7169203331' }); + }); + + it('Ignores incoming traceparent server-timings if they are not conformant to w3c trace-context', () => { + const serverTimings: PerformanceServerTiming[] = [ + { + name: 'traceparent', + description: '00-1234-5678-01-02', + duration: 0, + toJSON(): any {}, + }, + ]; + + const spanContext = getSpanContextFromServerTiming(serverTimings); + expect(spanContext).toBeUndefined(); + + const emptyServerTimings: PerformanceServerTiming[] = []; + const spanContextEmpty = getSpanContextFromServerTiming(emptyServerTimings); + expect(spanContextEmpty).toBeUndefined(); + + const undefinedServerTimings = undefined; + const spanContextUndefined = getSpanContextFromServerTiming(undefinedServerTimings); + expect(spanContextUndefined).toBeUndefined(); + }); +}); diff --git a/packages/react-native-sdk/src/instrumentations/performance/performanceUtils.ts b/packages/react-native-sdk/src/instrumentations/performance/performanceUtils.ts new file mode 100644 index 000000000..447778ed9 --- /dev/null +++ b/packages/react-native-sdk/src/instrumentations/performance/performanceUtils.ts @@ -0,0 +1,200 @@ +import { isArray, type PushEventOptions, unknownString } from '@grafana/faro-core'; + +import type { CacheType, FaroNavigationTiming, FaroResourceTiming } from './types'; + +const w3cTraceparentFormat = /^00-[a-f0-9]{32}-[a-f0-9]{16}-[0-9]{1,2}$/; + +type SpanContext = PushEventOptions['spanContext']; + +// Extract traceparent from serverTiming, if present +export function getSpanContextFromServerTiming(serverTimings: PerformanceServerTiming[] = []): SpanContext | undefined { + for (const serverEntry of serverTimings) { + if (serverEntry.name === 'traceparent') { + if (!w3cTraceparentFormat.test(serverEntry.description)) { + continue; + } + + const [, traceId, spanId] = serverEntry.description.split('-'); + if (traceId != null && spanId != null) { + return { traceId, spanId }; + } + + break; + } + } + + return undefined; +} + +export function performanceObserverSupported(): boolean { + return 'PerformanceObserver' in window; +} + +export function entryUrlIsIgnored(ignoredUrls: Array = [], entryName: string): boolean { + return ignoredUrls.some((url) => url && entryName.match(url) != null); +} + +export function onDocumentReady(handleReady: () => void) { + if (document.readyState === 'complete') { + handleReady(); + } else { + const readyStateCompleteHandler = () => { + if (document.readyState === 'complete') { + handleReady(); + document.removeEventListener('readystatechange', readyStateCompleteHandler); + } + }; + + document.addEventListener('readystatechange', readyStateCompleteHandler); + } +} + +type PerformanceEntryAllowProperties = Record | string | number>; + +export function includePerformanceEntry( + performanceEntryJSON: Record, + allowProps: PerformanceEntryAllowProperties = {} +): boolean { + for (const [allowPropKey, allowPropValue] of Object.entries(allowProps)) { + const perfEntryPropVal = performanceEntryJSON[allowPropKey]; + + if (perfEntryPropVal == null) { + return false; + } + + if (isArray(allowPropValue)) { + return allowPropValue.includes(perfEntryPropVal); + } + + return perfEntryPropVal === allowPropValue; + } + + // empty object allows all + return true; +} + +export function createFaroResourceTiming(resourceEntryRaw: PerformanceResourceTiming): FaroResourceTiming { + const { + connectEnd, + connectStart, + decodedBodySize, + domainLookupEnd, + domainLookupStart, + duration, + encodedBodySize, + fetchStart, + initiatorType, + name, + nextHopProtocol, + redirectEnd, + redirectStart, + // @ts-expect-error the renderBlockingStatus property is not available in all browsers + renderBlockingStatus: rbs, + requestStart, + responseEnd, + responseStart, + // @ts-expect-error the renderBlockingStatus property is not available in all browsers + responseStatus, + secureConnectionStart, + transferSize, + workerStart, + } = resourceEntryRaw; + + return { + name: name, + duration: toFaroPerformanceTimingString(duration), + tcpHandshakeTime: toFaroPerformanceTimingString(connectEnd - connectStart), + dnsLookupTime: toFaroPerformanceTimingString(domainLookupEnd - domainLookupStart), + tlsNegotiationTime: toFaroPerformanceTimingString(requestStart - secureConnectionStart), + responseStatus: toFaroPerformanceTimingString(responseStatus), + redirectTime: toFaroPerformanceTimingString(redirectEnd - redirectStart), + requestTime: toFaroPerformanceTimingString(responseStart - requestStart), + responseTime: toFaroPerformanceTimingString(responseEnd - responseStart), + fetchTime: toFaroPerformanceTimingString(responseEnd - fetchStart), + serviceWorkerTime: toFaroPerformanceTimingString(fetchStart - workerStart), + decodedBodySize: toFaroPerformanceTimingString(decodedBodySize), + encodedBodySize: toFaroPerformanceTimingString(encodedBodySize), + cacheHitStatus: getCacheType(), + renderBlockingStatus: toFaroPerformanceTimingString(rbs) as FaroResourceTiming['renderBlockingStatus'], + protocol: nextHopProtocol, + initiatorType: initiatorType, + visibilityState: document.visibilityState, + ttfb: toFaroPerformanceTimingString(responseStart - requestStart), + + // TODO: add in future iteration, ideally after nested objects are supported by the collector. + // serverTiming: resourceEntryRaw.serverTiming, + }; + + function getCacheType(): CacheType { + let cacheType: CacheType = 'fullLoad'; + if (transferSize === 0) { + if (decodedBodySize > 0) { + cacheType = 'cache'; + } + } else { + if (responseStatus != null) { + if (responseStatus === 304) { + cacheType = 'conditionalFetch'; + } + } else if (encodedBodySize > 0 && transferSize < encodedBodySize) { + cacheType = 'conditionalFetch'; + } + } + return cacheType; + } +} + +export function createFaroNavigationTiming(navigationEntryRaw: PerformanceNavigationTiming): FaroNavigationTiming { + const { + activationStart, + domComplete, + domContentLoadedEventEnd, + domContentLoadedEventStart, + domInteractive, + fetchStart, + loadEventEnd, + loadEventStart, + responseStart, + type, + } = navigationEntryRaw; + + const parserStart = getDocumentParsingTime(); + + return { + ...createFaroResourceTiming(navigationEntryRaw), + pageLoadTime: toFaroPerformanceTimingString(domComplete - fetchStart), + documentParsingTime: toFaroPerformanceTimingString(parserStart ? domInteractive - parserStart : null), + domProcessingTime: toFaroPerformanceTimingString(domComplete - domInteractive), + domContentLoadHandlerTime: toFaroPerformanceTimingString(domContentLoadedEventEnd - domContentLoadedEventStart), + onLoadTime: toFaroPerformanceTimingString(loadEventEnd - loadEventStart), + + // For navigation entries we can calculate the TTFB based on activationStart. We overwrite the TTFB value coming with the resource entry. + // For more accuracy on prerendered pages page we calculate relative top the activationStart instead of the start of the navigation. + // clamp to 0 if activationStart occurs after first byte is received. + ttfb: toFaroPerformanceTimingString(Math.max(responseStart - (activationStart ?? 0), 0)), + type: type, + }; +} + +function getDocumentParsingTime(): number | null { + if (performance.timing?.domLoading != null) { + // the browser is about to start parsing the first received bytes of the HTML document. + // This property is deprecated but there isn't a really good alternative atm. + // For now we stick with domLoading and keep researching a better alternative. + return performance.timing.domLoading - performance.timeOrigin; + } + + return null; +} + +function toFaroPerformanceTimingString(v: unknown): string { + if (v == null) { + return unknownString; + } + + if (typeof v === 'number') { + return Math.round(v).toString(); + } + + return v.toString(); +} diff --git a/packages/react-native-sdk/src/instrumentations/performance/performanceUtilsTestData.ts b/packages/react-native-sdk/src/instrumentations/performance/performanceUtilsTestData.ts new file mode 100644 index 000000000..74219ac90 --- /dev/null +++ b/packages/react-native-sdk/src/instrumentations/performance/performanceUtilsTestData.ts @@ -0,0 +1,87 @@ +// the values of this timings are contrived for testing.They do not necessarily reflect reality. +export const performanceNavigationEntry = { + name: 'http://example.com', + entryType: 'navigation', + startTime: 0, + duration: 2700, + initiatorType: 'navigation', + nextHopProtocol: 'h2', + workerStart: 0, + redirectStart: 1, + redirectEnd: 2, + fetchStart: 237, + domainLookupStart: 241, + domainLookupEnd: 380, + connectStart: 380, + connectEnd: 433, + secureConnectionStart: 400, + requestStart: 433, + responseStart: 542, + responseStatus: 200, + responseEnd: 542, + transferSize: 127601, + encodedBodySize: 126111, + decodedBodySize: 530675, + serverTiming: [ + { + name: 'traceparent', + duration: 0, + description: '00-0af7651916cd43dd8448eb211c80319c-b7ad6b7169203331-01', + }, + ], + unloadEventStart: 0, + unloadEventEnd: 0, + domInteractive: 1247, + domContentLoadedEventStart: 1247, + domContentLoadedEventEnd: 1250, + domComplete: 2678, + loadEventStart: 2678, + loadEventEnd: 2700, + type: 'navigate', + redirectCount: 0, +} as unknown as PerformanceNavigationTiming; + +export const performanceResourceEntry = { + name: 'http://example.com/awesome-image', + entryType: 'resource', + startTime: 778, + duration: 370, + initiatorType: 'img', + nextHopProtocol: 'h2', + workerStart: 0, + redirectStart: 0, + redirectEnd: 0, + fetchStart: 778, + domainLookupStart: 778, + domainLookupEnd: 778, + connectStart: 778, + connectEnd: 778, + secureConnectionStart: 778, + requestStart: 789, + responseStart: 1148, + responseStatus: '200', + responseEnd: 1148, + transferSize: 11459, + encodedBodySize: 10526, + decodedBodySize: 10526, + serverTiming: [ + { + name: 'traceparent', + duration: 0, + description: '00-0af7651916cd43dd8448eb211c80319c-b7ad6b7169203331-01', + }, + { + name: 'foo', + duration: 0, + description: 'bar', + }, + ], +} as unknown as PerformanceResourceTiming; + +export const analyticsEntry1 = { + name: 'http://example.com/foo-analytics', +} as unknown as PerformanceResourceTiming; + +export const analyticsEntry2 = { + name: 'http://analytics.com/beacon', +} as unknown as PerformanceResourceTiming; diff --git a/packages/react-native-sdk/src/instrumentations/performance/resource.test.ts b/packages/react-native-sdk/src/instrumentations/performance/resource.test.ts new file mode 100644 index 000000000..83e191531 --- /dev/null +++ b/packages/react-native-sdk/src/instrumentations/performance/resource.test.ts @@ -0,0 +1,162 @@ +import * as faroCoreModule from '@grafana/faro-core'; +import { initializeFaro } from '@grafana/faro-core'; +import { mockConfig } from '@grafana/faro-core/src/testUtils'; + +import * as performanceUtilsModule from './performanceUtils'; +import { createFaroResourceTiming } from './performanceUtils'; +import { performanceResourceEntry } from './performanceUtilsTestData'; +import { observeResourceTimings } from './resource'; + +describe('Resource observer', () => { + const originalTimeOrigin = performance.timeOrigin; + const mockTimeOriginValue = 1000; + Object.defineProperty(performance, 'timeOrigin', { + value: mockTimeOriginValue, + configurable: true, + }); + + class MockPerformanceObserver { + constructor(private cb: PerformanceObserverCallback) {} + + disconnect = jest.fn(); + + observe() { + this.cb( + { + getEntries() { + return [ + { + name: performanceResourceEntry.name, + toJSON: () => ({ + ...performanceResourceEntry, + }), + }, + { + name: 'resource_fetch', + toJSON: () => ({ + ...performanceResourceEntry, + initiatorType: 'fetch', + name: 'resource_fetch', + }), + }, + { + name: 'resource_xmlhttprequest', + toJSON: () => ({ + ...performanceResourceEntry, + initiatorType: 'xmlhttprequest', + name: 'resource_xmlhttprequest', + }), + }, + ]; + }, + } as any, + {} as PerformanceObserver + ); + } + } + + const originalPerformanceObserver = (global as any).PerformanceObserver; + + (global as any).PerformanceObserver = MockPerformanceObserver; + + beforeEach(() => { + jest.clearAllMocks(); + }); + + afterAll(() => { + jest.restoreAllMocks(); + + (global as any).PerformanceObserver = originalPerformanceObserver; + + Object.defineProperty(performance, 'timeOrigin', { + value: originalTimeOrigin, + configurable: true, + }); + }); + + it('Ignores entries where name matches ignoredUrls entry', () => { + const mockPushEvent = jest.fn(); + + const mockEntryUrlIsIgnored = jest.fn(() => true); + jest.spyOn(performanceUtilsModule, 'entryUrlIsIgnored').mockImplementationOnce(mockEntryUrlIsIgnored); + + initializeFaro(mockConfig({ trackResources: true })); + + const ignoredUrls = ['http://example.com']; + observeResourceTimings('123', mockPushEvent, ignoredUrls); + + expect(mockEntryUrlIsIgnored).toBeCalledTimes(1); + expect(mockEntryUrlIsIgnored).toBeCalledWith(ignoredUrls, performanceResourceEntry.name); + + expect(mockPushEvent).not.toHaveBeenCalled(); + }); + + it('Builds entry for first resource', () => { + const mockPushEvent = jest.fn(); + jest.spyOn(performanceUtilsModule, 'entryUrlIsIgnored').mockReturnValueOnce(false); + + const mockResourceId = 'abc'; + jest.spyOn(faroCoreModule, 'genShortID').mockReturnValueOnce(mockResourceId); + + initializeFaro(mockConfig({ trackResources: true })); + + const mockNavigationId = '123'; + observeResourceTimings(mockNavigationId, mockPushEvent, ['']); + + expect(mockPushEvent).toHaveBeenCalledTimes(3); + + expect(mockPushEvent).toHaveBeenNthCalledWith( + 1, + 'faro.performance.resource', + { + ...createFaroResourceTiming(performanceResourceEntry), + faroNavigationId: mockNavigationId, + faroResourceId: mockResourceId, + }, + undefined, + { + spanContext: { traceId: '0af7651916cd43dd8448eb211c80319c', spanId: 'b7ad6b7169203331' }, + timestampOverwriteMs: mockTimeOriginValue + performanceResourceEntry.startTime, + } + ); + }); + + it('Tracks default resource entries if trackResource is unset', () => { + const mockPushEvent = jest.fn(); + jest.spyOn(performanceUtilsModule, 'entryUrlIsIgnored').mockReturnValueOnce(false); + + const trackResourcesNotSetConfig = mockConfig({}); + initializeFaro(trackResourcesNotSetConfig); + + const mockNavigationId = '123'; + observeResourceTimings(mockNavigationId, mockPushEvent, ['']); + + expect(mockPushEvent).toHaveBeenCalledTimes(2); + }); + + it('Tracks all resource entries if trackResource is set to true', () => { + const mockPushEvent = jest.fn(); + jest.spyOn(performanceUtilsModule, 'entryUrlIsIgnored').mockReturnValueOnce(false); + + const trackAllResourcesConfig = mockConfig({ trackResources: true }); + initializeFaro(trackAllResourcesConfig); + + const mockNavigationId = '123'; + observeResourceTimings(mockNavigationId, mockPushEvent, ['']); + + expect(mockPushEvent).toHaveBeenCalledTimes(3); + }); + + it('Does not track any resource entries if trackResource is set to false', () => { + const mockPushEvent = jest.fn(); + jest.spyOn(performanceUtilsModule, 'entryUrlIsIgnored').mockReturnValueOnce(false); + + const trackAllResourcesConfig = mockConfig({ trackResources: false }); + initializeFaro(trackAllResourcesConfig); + + const mockNavigationId = '123'; + observeResourceTimings(mockNavigationId, mockPushEvent, ['']); + + expect(mockPushEvent).toHaveBeenCalledTimes(0); + }); +}); diff --git a/packages/react-native-sdk/src/instrumentations/performance/resource.ts b/packages/react-native-sdk/src/instrumentations/performance/resource.ts new file mode 100644 index 000000000..6a9b88aaf --- /dev/null +++ b/packages/react-native-sdk/src/instrumentations/performance/resource.ts @@ -0,0 +1,57 @@ +import { faro, genShortID } from '@grafana/faro-core'; +import type { EventsAPI, PushEventOptions } from '@grafana/faro-core'; + +import { RESOURCE_ENTRY } from './performanceConstants'; +import { + createFaroResourceTiming, + entryUrlIsIgnored, + getSpanContextFromServerTiming, + includePerformanceEntry, +} from './performanceUtils'; + +type SpanContext = PushEventOptions['spanContext']; + +const DEFAULT_TRACK_RESOURCES = { initiatorType: ['xmlhttprequest', 'fetch'] }; + +export function observeResourceTimings( + faroNavigationId: string, + pushEvent: EventsAPI['pushEvent'], + ignoredUrls: Array +) { + const trackResources = faro.config.trackResources; + + const observer = new PerformanceObserver((observedEntries) => { + const entries = observedEntries.getEntries(); + + for (const resourceEntryRaw of entries) { + if (entryUrlIsIgnored(ignoredUrls, resourceEntryRaw.name)) { + return; + } + + const resourceEntryJson = resourceEntryRaw.toJSON(); + + let spanContext: SpanContext = getSpanContextFromServerTiming(resourceEntryJson?.serverTiming); + + if ( + (trackResources == null && includePerformanceEntry(resourceEntryJson, DEFAULT_TRACK_RESOURCES)) || + trackResources + ) { + const faroResourceEntry = { + ...createFaroResourceTiming(resourceEntryJson), + faroNavigationId, + faroResourceId: genShortID(), + }; + + pushEvent('faro.performance.resource', faroResourceEntry, undefined, { + spanContext, + timestampOverwriteMs: performance.timeOrigin + resourceEntryJson.startTime, + }); + } + } + }); + + observer.observe({ + type: RESOURCE_ENTRY, + buffered: true, + }); +} diff --git a/packages/react-native-sdk/src/instrumentations/performance/types.ts b/packages/react-native-sdk/src/instrumentations/performance/types.ts new file mode 100644 index 000000000..9c53e15c9 --- /dev/null +++ b/packages/react-native-sdk/src/instrumentations/performance/types.ts @@ -0,0 +1,49 @@ +import type { unknownString } from '@grafana/faro-core'; + +export type FaroNavigationTiming = Readonly< + { + duration: string; + documentParsingTime: string; + domProcessingTime: string; + pageLoadTime: string; + domContentLoadHandlerTime: string; + onLoadTime: string; + type: NavigationTimingType; + } & FaroResourceTiming +>; + +export type FaroResourceTiming = Readonly<{ + name: string; + duration: string; + protocol: string; + tcpHandshakeTime: string; + dnsLookupTime: string; + tlsNegotiationTime: string; + responseStatus: string; + redirectTime: string; + requestTime: string; + fetchTime: string; + responseTime: string; + serviceWorkerTime: string; + decodedBodySize: string; + encodedBodySize: string; + cacheHitStatus: 'cache' | 'conditionalFetch' | 'fullLoad'; + renderBlockingStatus: 'blocking' | 'non-blocking' | typeof unknownString; + initiatorType: string; + // serverTiming: PerformanceServerTiming[]; + visibilityState: DocumentVisibilityState; + ttfb: string; +}>; + +export type FaroNavigationItem = { + faroNavigationId: string; + faroPreviousNavigationId: string; +} & FaroNavigationTiming & + FaroResourceTiming; + +export type FaroResourceItem = { + faroNavigationId: string; + faroResourceId: string; +} & FaroResourceTiming; + +export type CacheType = 'cache' | 'conditionalFetch' | 'fullLoad'; diff --git a/packages/react-native-sdk/src/instrumentations/session/index.ts b/packages/react-native-sdk/src/instrumentations/session/index.ts new file mode 100644 index 000000000..0cf17888b --- /dev/null +++ b/packages/react-native-sdk/src/instrumentations/session/index.ts @@ -0,0 +1,16 @@ +export { SessionInstrumentation } from './instrumentation'; + +export { + MAX_SESSION_PERSISTENCE_TIME, + MAX_SESSION_PERSISTENCE_TIME_BUFFER, + PersistentSessionsManager, + SESSION_EXPIRATION_TIME, + SESSION_INACTIVITY_TIME, + STORAGE_KEY, + STORAGE_UPDATE_DELAY, + VolatileSessionsManager, + defaultSessionTrackingConfig, + isSampled, +} from './sessionManager'; + +export type { FaroUserSession } from './sessionManager'; diff --git a/packages/react-native-sdk/src/instrumentations/session/instrumentation.test.ts b/packages/react-native-sdk/src/instrumentations/session/instrumentation.test.ts new file mode 100644 index 000000000..d8890c963 --- /dev/null +++ b/packages/react-native-sdk/src/instrumentations/session/instrumentation.test.ts @@ -0,0 +1,689 @@ +import { + dateNow, + EVENT_SESSION_EXTEND, + EVENT_SESSION_RESUME, + EVENT_SESSION_START, + initializeFaro, +} from '@grafana/faro-core'; +import type { EventEvent, MetaSession, TransportItem } from '@grafana/faro-core'; +import { mockConfig, MockTransport } from '@grafana/faro-core/src/testUtils'; + +import { makeCoreConfig } from '../../config/makeCoreConfig'; +import { createSession } from '../../metas/session'; +import * as createSessionMock from '../../metas/session'; + +import { SessionInstrumentation } from './instrumentation'; +import { + FaroUserSession, + MAX_SESSION_PERSISTENCE_TIME, + SESSION_EXPIRATION_TIME, + SESSION_INACTIVITY_TIME, + STORAGE_KEY, +} from './sessionManager'; +import * as samplingModuleMock from './sessionManager/sampling'; +import { createUserSessionObject } from './sessionManager/sessionManagerUtils'; + +describe('SessionInstrumentation', () => { + let mockStorage: Record = {}; + let setItemSpy: jest.SpyInstance; + let getItemSpy: jest.SpyInstance; + let removeItemSpy: jest.SpyInstance; + + beforeAll(() => { + jest.useFakeTimers(); + setItemSpy = jest.spyOn(global.Storage.prototype, 'setItem').mockImplementation((key, value) => { + mockStorage[key] = value; + }); + + getItemSpy = jest.spyOn(global.Storage.prototype, 'getItem').mockImplementation((key) => mockStorage[key] ?? null); + + removeItemSpy = jest.spyOn(global.Storage.prototype, 'removeItem').mockImplementation((key) => { + delete mockStorage[key]; + }); + }); + + afterEach(() => { + jest.clearAllMocks(); + jest.clearAllTimers(); + jest.spyOn(samplingModuleMock, 'isSampled').mockRestore(); + mockStorage = {}; + }); + + afterAll(() => { + jest.useRealTimers(); + getItemSpy.mockRestore(); + setItemSpy.mockRestore(); + removeItemSpy.mockRestore(); + }); + + it('will send session start event on initialize.', () => { + const transport = new MockTransport(); + const session = createSession({ foo: 'bar' }); + + initializeFaro( + mockConfig({ + transports: [transport], + instrumentations: [new SessionInstrumentation()], + sessionTracking: { + enabled: true, + session, + }, + }) + ); + + expect(transport.items).toHaveLength(1); + + const event = transport.items[0]! as TransportItem; + expect(event.payload.name).toEqual(EVENT_SESSION_START); + expect(event.meta.session?.attributes).toEqual({ foo: 'bar' }); + expect(event.meta.session?.id).toEqual(session.id); + }); + + it('will send session start event for new session.', () => { + const transport = new MockTransport(); + const session = createSession({ foo: 'bar' }); + + const config = mockConfig({ + transports: [transport], + instrumentations: [new SessionInstrumentation()], + sessionTracking: { + enabled: true, + persistent: false, + session, + samplingRate: 1, + }, + }); + + const { api, metas } = initializeFaro(config); + + expect(transport.items).toHaveLength(1); + + let event = transport.items[0]! as TransportItem; + expect(event.payload.name).toEqual(EVENT_SESSION_START); + expect(event.meta.session?.id).toEqual(session.id); + + metas.add({ user: { id: 'foo' } }); + expect(transport.items).toHaveLength(1); + + const newSession = createSession(); + api.setSession(newSession); + expect(transport.items).toHaveLength(2); + expect(event.payload.name).toEqual(EVENT_SESSION_START); + + event = transport.items[1]! as TransportItem; + expect(event.meta.session?.id).toEqual(newSession.id); + }); + + it('will send session_resume event if valid user-session exists in web storage.', () => { + const transport = new MockTransport(); + + const mockNewSessionId = '123'; + mockStorage[STORAGE_KEY] = JSON.stringify(createUserSessionObject({ sessionId: mockNewSessionId })); + + initializeFaro( + mockConfig({ + transports: [transport], + instrumentations: [new SessionInstrumentation()], + sessionTracking: { + enabled: true, + samplingRate: 1, // default + }, + }) + ); + + expect(transport.items).toHaveLength(1); + + let event = transport.items[0]! as TransportItem; + expect(event.payload.name).toEqual(EVENT_SESSION_RESUME); + }); + + it('will send session_extend event if a new session is crated by Faro or manually.', () => { + const transport = new MockTransport(); + + const mockNewSessionId = '123'; + const mockUserSession = createUserSessionObject({ sessionId: mockNewSessionId }); + + mockStorage[STORAGE_KEY] = JSON.stringify(mockUserSession); + + const { api } = initializeFaro( + mockConfig({ + transports: [transport], + instrumentations: [new SessionInstrumentation()], + sessionTracking: { + enabled: true, + persistent: true, + samplingRate: 1, // default + }, + }) + ); + + expect(transport.items).toHaveLength(1); + + let event = transport.items[0]! as TransportItem; + expect(event.payload.name).toEqual(EVENT_SESSION_RESUME); + + jest.advanceTimersByTime(SESSION_EXPIRATION_TIME + 1); + + api.pushLog(['advanceTimersByTime']); + + expect(transport.items).toHaveLength(3); + // extending the session happens before the event is sent, we look at the second item + event = transport.items[1]! as TransportItem; + expect(event.payload.name).toEqual(EVENT_SESSION_EXTEND); + + api.setSession({ id: '456' }); + + expect(transport.items).toHaveLength(4); + event = transport.items[3]! as TransportItem; + expect(event.payload.name).toEqual(EVENT_SESSION_EXTEND); + }); + + it('Initialize session meta with user defined id and attributes provided via the initial session property.', () => { + const mockSessionMeta: MetaSession = { + id: 'new-session', + attributes: { + foo: 'bar', + isSampled: 'true', + }, + }; + + const { metas } = initializeFaro( + mockConfig({ + instrumentations: [new SessionInstrumentation()], + sessionTracking: { + enabled: true, + session: mockSessionMeta, + samplingRate: 1, // default + }, + }) + ); + + expect(metas.value.session).toStrictEqual(mockSessionMeta); + + const sessionFromStorage: FaroUserSession = JSON.parse(mockStorage[STORAGE_KEY]!); + + expect(sessionFromStorage).toStrictEqual({ + sessionId: 'new-session', + isSampled: true, + + // lastActivity and started values are not important for this test so it's ok to take them form the object we verify. + lastActivity: sessionFromStorage.lastActivity, + started: sessionFromStorage.started, + + sessionMeta: { + id: 'new-session', + attributes: { + foo: 'bar', + + // Faro doesn't care about the isSampled value in the meta form localStorage. But it's not worthy to remove it tbh. + isSampled: 'true', + }, + }, + }); + }); + + it('Adds user defined attributes to the extended session meta.', () => { + const mockSessionMeta: MetaSession = { + id: 'new-session', + attributes: { + foo: 'bar', + isSampled: 'true', + }, + }; + + const { api, metas } = initializeFaro( + mockConfig({ + instrumentations: [new SessionInstrumentation()], + sessionTracking: { + enabled: true, + session: mockSessionMeta, + samplingRate: 1, // default + }, + }) + ); + + expect(metas.value.session).toStrictEqual(mockSessionMeta); + + expect(metas.value.session).toStrictEqual({ + ...mockSessionMeta, + attributes: { + ...mockSessionMeta.attributes, + }, + }); + + let sessionFromStorage: FaroUserSession = JSON.parse(mockStorage[STORAGE_KEY]!); + + expect(sessionFromStorage).toStrictEqual({ + sessionId: 'new-session', + isSampled: true, + + // lastActivity and started values are not important for this test so it's ok to take them form the object we verify. + lastActivity: sessionFromStorage.lastActivity, + started: sessionFromStorage.started, + + sessionMeta: { + id: 'new-session', + attributes: { + foo: 'bar', + isSampled: 'true', + }, + }, + }); + + api.setSession({ id: 'extended-session-id', attributes: { location: 'neptun', foo: 'abc' } }); + + expect(metas.value.session).toStrictEqual({ + id: 'extended-session-id', + attributes: { + ...mockSessionMeta.attributes, + location: 'neptun', + foo: 'abc', + previousSession: 'new-session', + }, + }); + + sessionFromStorage = JSON.parse(mockStorage[STORAGE_KEY]!); + + expect(sessionFromStorage).toStrictEqual({ + sessionId: 'extended-session-id', + isSampled: true, + + // lastActivity and started values are not important for this test so it's ok to take them form the object we verify. + lastActivity: sessionFromStorage.lastActivity, + started: sessionFromStorage.started, + + sessionMeta: { + id: 'extended-session-id', + attributes: { + location: 'neptun', + foo: 'abc', + previousSession: 'new-session', + isSampled: 'true', + }, + }, + }); + }); + + it('Initialize session meta with meta attributes from session picked up from web storage.', () => { + const mockSessionMeta: MetaSession = { + id: 'new-session', + attributes: { + foo: 'bar', + location: 'mars', + isSampled: 'true', + }, + }; + + mockStorage[STORAGE_KEY] = JSON.stringify({ + sessionId: mockSessionMeta.id, + sessionMeta: mockSessionMeta, + } as FaroUserSession); + + const { metas } = initializeFaro( + mockConfig({ + instrumentations: [new SessionInstrumentation()], + sessionTracking: { + enabled: true, + session: mockSessionMeta, + samplingRate: 1, // default + }, + }) + ); + + expect(metas.value.session).toStrictEqual(mockSessionMeta); + }); + + it('creates new session meta for browser with no faro session stored in web storage.', () => { + const mockSessionMeta = { id: 'new-session', attributes: { isSampled: 'true' } }; + jest.spyOn(createSessionMock, 'createSession').mockReturnValueOnce(mockSessionMeta); + + const { metas } = initializeFaro( + mockConfig({ + instrumentations: [new SessionInstrumentation()], + sessionTracking: { + enabled: true, + samplingRate: 1, // default + }, + }) + ); + + expect(metas.value.session).toStrictEqual(mockSessionMeta); + }); + + it('creates session meta with id from persisted session for valid tracked session which is within maxSessionPersistenceTime.', () => { + const mockUserSession = createUserSessionObject({ sessionId: 'persisted-session' }); + mockUserSession.sessionMeta = { + id: 'persisted-session', + attributes: { + foo: 'bar', + isSampled: 'true', + }, + }; + + mockStorage[STORAGE_KEY] = JSON.stringify(mockUserSession); + + jest.advanceTimersByTime(SESSION_INACTIVITY_TIME - 1); + + const config = makeCoreConfig( + mockConfig({ + instrumentations: [new SessionInstrumentation()], + sessionTracking: { + enabled: true, + persistent: true, + samplingRate: 1, // default + }, + }) + ); + const { metas } = initializeFaro(config!); + + expect(metas.value.session?.id).toBe(mockUserSession.sessionId); + expect(metas.value.session?.attributes).toStrictEqual(mockUserSession.sessionMeta.attributes); + }); + + it('creates new session meta with new sessionId for invalid tracked session which is within maxSessionPersistenceTime.', () => { + const started = dateNow(); + const mockUserSession = createUserSessionObject({ sessionId: 'persisted-session', started }); + mockUserSession.sessionMeta = { + id: 'persisted-session', + }; + + mockStorage[STORAGE_KEY] = JSON.stringify(mockUserSession); + + jest.advanceTimersByTime(MAX_SESSION_PERSISTENCE_TIME); + + const config = makeCoreConfig( + mockConfig({ + instrumentations: [new SessionInstrumentation()], + sessionTracking: { + enabled: true, + persistent: true, + samplingRate: 1, // default + }, + }) + ); + + const { metas } = initializeFaro(config!); + + expect(removeItemSpy).toBeCalledTimes(0); + expect(metas.value.session?.id).not.toBe(mockUserSession.sessionId); + + const sessionFromStorage: FaroUserSession = JSON.parse(mockStorage[STORAGE_KEY]); + // creates new started timestamp + expect(sessionFromStorage.started).not.toBe(started); + }); + + it('Deletes persisted session if maxSessionPersistenceTime is reached and creates new session meta.', () => { + const mockUserSession = createUserSessionObject({ sessionId: 'persisted-session' }); + mockUserSession.sessionMeta = { + id: 'persisted-session', + }; + + mockStorage[STORAGE_KEY] = JSON.stringify(mockUserSession); + + jest.advanceTimersByTime(MAX_SESSION_PERSISTENCE_TIME + 1); + + const config = makeCoreConfig( + mockConfig({ + instrumentations: [new SessionInstrumentation()], + sessionTracking: { + enabled: true, + persistent: true, + samplingRate: 1, // default + }, + }) + ); + + const { metas } = initializeFaro(config!); + + expect(removeItemSpy).toBeCalledTimes(1); + expect(metas.value.session?.id).not.toBe(mockUserSession.sessionId); + }); + + it('Removes items which are not part of the sample.', () => { + const transport = new MockTransport(); + + jest.spyOn(samplingModuleMock, 'isSampled').mockReturnValue(true); + + const { api } = initializeFaro( + mockConfig({ + transports: [transport], + instrumentations: [new SessionInstrumentation()], + }) + ); + + expect(transport.items).toHaveLength(1); + api.pushLog(['abc']); + + expect(transport.items).toHaveLength(2); + api.pushEvent('def'); + + expect(transport.items).toHaveLength(3); + + jest.spyOn(samplingModuleMock, 'isSampled').mockReturnValueOnce(false); + api.setSession({ id: 'second-session-with-sampling-set-to-false' }); + expect(transport.items).toHaveLength(3); + + api.pushLog(['this log should not be sent']); + expect(transport.items).toHaveLength(3); + }); + + it('Will use sampling decision from valid session from web storage.', () => { + const initialIsSampled = true; + const mockUserSession = createUserSessionObject({ + sessionId: 'persisted-session-ac', + isSampled: initialIsSampled, + }); + + mockStorage[STORAGE_KEY] = JSON.stringify(mockUserSession); + + const config = makeCoreConfig( + mockConfig({ + instrumentations: [new SessionInstrumentation()], + sessionTracking: { + enabled: true, + persistent: true, + samplingRate: 0, + }, + }) + ); + + const { api } = initializeFaro(config!); + const sessionMeta = api.getSession(); + + expect(sessionMeta?.attributes?.['isSampled']).toBe(initialIsSampled.toString()); + expect((JSON.parse(mockStorage[STORAGE_KEY]) as FaroUserSession).isSampled).toBe(initialIsSampled); + }); + + it('Will calculate new sampling decision if session from web storage is invalid.', () => { + const initialIsSampled = true; + const mockUserSession = createUserSessionObject({ + sessionId: 'persisted-session-ac', + isSampled: initialIsSampled, + }); + + mockUserSession.lastActivity = dateNow() - SESSION_EXPIRATION_TIME; + + mockStorage[STORAGE_KEY] = JSON.stringify(mockUserSession); + + const config = makeCoreConfig( + mockConfig({ + instrumentations: [new SessionInstrumentation()], + sessionTracking: { + enabled: true, + persistent: true, + samplingRate: 0, // setting to zero so calculating sampling decision for new session will evaluate to false + }, + }) + ); + + const { api } = initializeFaro(config!); + const sessionMeta = api.getSession(); + + expect(sessionMeta?.attributes?.['isSampled']).toBe('false'); + expect((JSON.parse(mockStorage[STORAGE_KEY]) as FaroUserSession).isSampled).toBe(false); + }); + + it('Will send 0% of the signals.', () => { + const transport = new MockTransport(); + + const config = makeCoreConfig( + mockConfig({ + transports: [transport], + instrumentations: [new SessionInstrumentation()], + sessionTracking: { + enabled: true, + samplingRate: 0, + }, + batching: { + itemLimit: 5, + sendTimeout: 1, + }, + }) + ); + + const { api } = initializeFaro(config!); + + const sentItems = transport.items; + + // starting at two because a session lifetime event is automatically sent by Faro + api.pushEvent('two'); + api.pushEvent('three'); + api.pushEvent('four'); + api.pushEvent('five'); + + expect(sentItems).toHaveLength(0); + }); + + it('Will send 100% of the signals.', () => { + const transport = new MockTransport(); + + const config = makeCoreConfig( + mockConfig({ + transports: [transport], + instrumentations: [new SessionInstrumentation()], + sessionTracking: { + enabled: true, + samplingRate: 1, + }, + batching: { + itemLimit: 5, + sendTimeout: 1, + }, + }) + ); + + const { api } = initializeFaro(config!); + + const sentItems = transport.items; + + // starting at two because a session lifetime event is automatically sent by Faro + api.pushEvent('two'); + api.pushEvent('three'); + api.pushEvent('four'); + api.pushEvent('five'); + + expect(sentItems).toHaveLength(5); + + // Are all isSampled attributes removed? + expect(sentItems.every((item) => typeof item.meta.session?.attributes?.['isSampled'] === 'undefined')).toBe(true); + }); + + it('Will drop signals for new session which is not part of the sample.', () => { + const transport = new MockTransport(); + + const config = makeCoreConfig( + mockConfig({ + transports: [transport], + instrumentations: [new SessionInstrumentation()], + sessionTracking: { + enabled: true, + session: { id: 'abc', attributes: { foo: 'bar' } }, + }, + batching: { + itemLimit: 5, + sendTimeout: 1, + }, + }) + ); + + const { api } = initializeFaro(config!); + const sentItems = transport.items; + + // starting at two because a session lifetime event is automatically sent by Faro + api.pushEvent('two'); + api.pushEvent('three'); + + jest.spyOn(samplingModuleMock, 'isSampled').mockReturnValue(false); + api.setSession(); + + api.pushEvent('four'); + api.pushEvent('five'); + api.pushEvent('six'); + + expect(sentItems).toHaveLength(3); + + // Are all isSampled attributes removed? + expect(sentItems.every((item) => typeof item.meta.session?.attributes?.['isSampled'] === 'undefined')).toBe(true); + + // Are all other attributes retained? + expect(sentItems.every((item) => item.meta.session?.attributes?.['foo'] === 'bar')).toBe(true); + }); + + it('Keep value started timestamp for resumed sessions.', () => { + const transport = new MockTransport(); + + const sessionId = '123'; + const started = dateNow() - 5 * 60 * 1000; + + mockStorage[STORAGE_KEY] = JSON.stringify( + createUserSessionObject({ + sessionId, + started, + }) + ); + + initializeFaro( + mockConfig({ + transports: [transport], + instrumentations: [new SessionInstrumentation()], + sessionTracking: { + enabled: true, + }, + }) + ); + + const sessionFromStorage: FaroUserSession = JSON.parse(mockStorage[STORAGE_KEY]); + + expect(sessionFromStorage.sessionId).toBe(sessionId); + expect(sessionFromStorage.started).toBe(started); + }); + + it('Removes is sampled attribute before transport item is sent.', () => { + const mockNewSessionId = '123'; + + const transport = new MockTransport(); + + initializeFaro( + mockConfig({ + transports: [transport], + instrumentations: [new SessionInstrumentation()], + sessionTracking: { + enabled: true, + samplingRate: 1, + session: { id: mockNewSessionId, attributes: { foo: 'bar' } }, + }, + }) + ); + + expect(transport.items).toHaveLength(1); + + const event = transport.items[0]! as TransportItem; + expect(event.payload.name).toEqual(EVENT_SESSION_START); + expect(event.meta.session).toStrictEqual({ + id: mockNewSessionId, + attributes: { + foo: 'bar', + }, + }); + }); +}); diff --git a/packages/react-native-sdk/src/instrumentations/session/instrumentation.ts b/packages/react-native-sdk/src/instrumentations/session/instrumentation.ts new file mode 100644 index 000000000..33a27c68c --- /dev/null +++ b/packages/react-native-sdk/src/instrumentations/session/instrumentation.ts @@ -0,0 +1,167 @@ +import { + BaseInstrumentation, + dateNow, + EVENT_SESSION_EXTEND, + EVENT_SESSION_RESUME, + EVENT_SESSION_START, + Meta, + MetaSession, + VERSION, +} from '@grafana/faro-core'; +import type { Config } from '@grafana/faro-core'; + +import type { TransportItem } from '../..'; +import { createSession } from '../../metas'; + +import { type FaroUserSession, getSessionManagerByConfig, isSampled } from './sessionManager'; +import { PersistentSessionsManager } from './sessionManager/PersistentSessionsManager'; +import { createUserSessionObject, isUserSessionValid } from './sessionManager/sessionManagerUtils'; +import type { SessionManager } from './sessionManager/types'; + +type LifecycleType = typeof EVENT_SESSION_RESUME | typeof EVENT_SESSION_START; + +export class SessionInstrumentation extends BaseInstrumentation { + readonly name = '@grafana/faro-web-sdk:instrumentation-session'; + readonly version = VERSION; + + // previously notified session, to ensure we don't send session start + // event twice for the same session + private notifiedSession: MetaSession | undefined; + + private sendSessionStartEvent(meta: Meta): void { + const session = meta.session; + + if (session && session.id !== this.notifiedSession?.id) { + if (this.notifiedSession && this.notifiedSession.id === session.attributes?.['previousSession']) { + this.api.pushEvent(EVENT_SESSION_EXTEND, {}, undefined, { skipDedupe: true }); + this.notifiedSession = session; + return; + } + + this.notifiedSession = session; + // no need to add attributes and session id, they are included as part of meta + // automatically + this.api.pushEvent(EVENT_SESSION_START, {}, undefined, { skipDedupe: true }); + } + } + + private createInitialSession( + SessionManager: SessionManager, + sessionsConfig: Required['sessionTracking'] + ): { + initialSession: FaroUserSession; + lifecycleType: LifecycleType; + } { + let userSession: FaroUserSession | null = SessionManager.fetchUserSession(); + + if (sessionsConfig.persistent && sessionsConfig.maxSessionPersistenceTime && userSession) { + const now = dateNow(); + const shouldClearPersistentSession = userSession.lastActivity < now - sessionsConfig.maxSessionPersistenceTime; + + if (shouldClearPersistentSession) { + PersistentSessionsManager.removeUserSession(); + userSession = null; + } + } + + let lifecycleType: LifecycleType; + let initialSession: FaroUserSession; + + if (isUserSessionValid(userSession)) { + const sessionId = userSession?.sessionId; + + initialSession = createUserSessionObject({ + sessionId, + isSampled: userSession!.isSampled || false, + started: userSession?.started, + }); + + initialSession.sessionMeta = { + id: sessionId, + attributes: { + ...sessionsConfig.session?.attributes, + ...userSession?.sessionMeta?.attributes, + // For valid resumed sessions we do not want to recalculate the sampling decision on each init phase. + isSampled: initialSession.isSampled.toString(), + }, + }; + + lifecycleType = EVENT_SESSION_RESUME; + } else { + const sessionId = sessionsConfig.session?.id ?? createSession().id; + + initialSession = createUserSessionObject({ + sessionId, + isSampled: isSampled(), + }); + + initialSession.sessionMeta = { + id: sessionId, + attributes: { + isSampled: initialSession.isSampled.toString(), + ...sessionsConfig.session?.attributes, + }, + }; + + lifecycleType = EVENT_SESSION_START; + } + + return { initialSession, lifecycleType }; + } + + private registerBeforeSendHook(SessionManager: SessionManager) { + const { updateSession } = new SessionManager(); + + this.transports?.addBeforeSendHooks((item) => { + updateSession(); + + const attributes = item.meta.session?.attributes; + + if (attributes && attributes?.['isSampled'] === 'true') { + let newItem: TransportItem = JSON.parse(JSON.stringify(item)); + + const newAttributes = newItem.meta.session?.attributes; + delete newAttributes?.['isSampled']; + + if (Object.keys(newAttributes ?? {}).length === 0) { + delete newItem.meta.session?.attributes; + } + + return newItem; + } + + return null; + }); + } + + initialize() { + this.logDebug('init session instrumentation'); + + const sessionTrackingConfig = this.config.sessionTracking; + + if (sessionTrackingConfig?.enabled) { + const SessionManager = getSessionManagerByConfig(sessionTrackingConfig); + + this.registerBeforeSendHook(SessionManager); + + const { initialSession, lifecycleType } = this.createInitialSession(SessionManager, sessionTrackingConfig); + + SessionManager.storeUserSession(initialSession); + + const initialSessionMeta = initialSession.sessionMeta; + + this.notifiedSession = initialSessionMeta; + this.api.setSession(initialSessionMeta); + + if (lifecycleType === EVENT_SESSION_START) { + this.api.pushEvent(EVENT_SESSION_START, {}, undefined, { skipDedupe: true }); + } + + if (lifecycleType === EVENT_SESSION_RESUME) { + this.api.pushEvent(EVENT_SESSION_RESUME, {}, undefined, { skipDedupe: true }); + } + } + + this.metas.addListener(this.sendSessionStartEvent.bind(this)); + } +} diff --git a/packages/react-native-sdk/src/instrumentations/session/sessionManager/PersistentSessionsManager.test.ts b/packages/react-native-sdk/src/instrumentations/session/sessionManager/PersistentSessionsManager.test.ts new file mode 100644 index 000000000..47c3eab53 --- /dev/null +++ b/packages/react-native-sdk/src/instrumentations/session/sessionManager/PersistentSessionsManager.test.ts @@ -0,0 +1,237 @@ +import * as faroCore from '@grafana/faro-core'; +import { faro, initializeFaro } from '@grafana/faro-core'; +import { mockConfig } from '@grafana/faro-core/src/testUtils'; + +import { PersistentSessionsManager } from './PersistentSessionsManager'; +import * as samplingModule from './sampling'; +import { SESSION_EXPIRATION_TIME, SESSION_INACTIVITY_TIME, STORAGE_KEY } from './sessionConstants'; +import type { FaroUserSession } from './types'; + +const fakeSystemTime = new Date('2023-01-01').getTime(); +const mockInitialSessionId = '123'; + +describe('Persistent Sessions Manager.', () => { + let mockStorage: Record = {}; + let setItemSpy: jest.SpyInstance; + let getItemSpy: jest.SpyInstance; + + let mockOnNewSessionCreated = jest.fn(); + + beforeAll(() => { + jest.useFakeTimers(); + jest.setSystemTime(fakeSystemTime); + + setItemSpy = jest.spyOn(global.Storage.prototype, 'setItem').mockImplementation((key, value) => { + mockStorage[key] = value; + }); + + getItemSpy = jest.spyOn(global.Storage.prototype, 'getItem').mockImplementation((key) => mockStorage[key] ?? null); + + const config = mockConfig({ + sessionTracking: { + enabled: true, + persistent: true, + session: { id: mockInitialSessionId }, + onSessionChange: mockOnNewSessionCreated, + }, + }); + + initializeFaro(config); + }); + + beforeEach(() => { + jest.clearAllMocks(); + mockStorage = {}; + }); + + afterEach(() => { + jest.spyOn(samplingModule, 'isSampled').mockRestore(); + }); + + afterAll(() => { + jest.useRealTimers(); + jest.restoreAllMocks(); + + getItemSpy.mockRestore(); + setItemSpy.mockRestore(); + }); + + it('Updates last active timestamp for valid session.', () => { + const mockIsSampled = jest.fn(); + jest.spyOn(samplingModule, 'isSampled').mockImplementation(mockIsSampled); + + const validSession = { + sessionId: mockInitialSessionId, + lastActivity: fakeSystemTime, + started: fakeSystemTime, + isSampled: true, + }; + + mockStorage[STORAGE_KEY] = JSON.stringify(validSession); + + const { updateSession } = new PersistentSessionsManager(); + + const nextActivityTimeAfterFiveSeconds = fakeSystemTime; + jest.setSystemTime(nextActivityTimeAfterFiveSeconds); + + updateSession(); + + expect(setItemSpy).toBeCalledTimes(1); // called on time in the init function and the in the onActivity func + expect(mockStorage[STORAGE_KEY]).toBe( + JSON.stringify({ + sessionId: mockInitialSessionId, + lastActivity: nextActivityTimeAfterFiveSeconds, + started: fakeSystemTime, + isSampled: true, + }) + ); + }); + + it('Creates a new Faro user session if (old) session if max inactivity duration is reached.', () => { + const mockIsSampled = jest.fn(); + jest.spyOn(samplingModule, 'isSampled').mockImplementation(mockIsSampled); + + const storedSession = { + sessionId: mockInitialSessionId, + lastActivity: fakeSystemTime, + started: fakeSystemTime, + isSampled: true, + }; + + mockStorage[STORAGE_KEY] = JSON.stringify(storedSession); + + const { updateSession } = new PersistentSessionsManager(); + + const mockNewSessionId = 'abcde'; + jest.spyOn(faroCore, 'genShortID').mockReturnValue(mockNewSessionId); + + const maxActivityTimeReached = fakeSystemTime + SESSION_INACTIVITY_TIME; + jest.setSystemTime(maxActivityTimeReached); + + updateSession(); + + // creates and stores new session + const session = JSON.parse(mockStorage[STORAGE_KEY]); + + const matchNewSessionMeta = { + id: mockNewSessionId, + attributes: { + previousSession: mockInitialSessionId, + isSampled: 'true', + }, + }; + expect(session).toStrictEqual({ + sessionId: mockNewSessionId, + lastActivity: maxActivityTimeReached, + started: maxActivityTimeReached, + isSampled: true, + sessionMeta: matchNewSessionMeta, + }); + + // Updates session meta + expect(faro.metas.value.session).toStrictEqual(matchNewSessionMeta); + + // Call session created hook + expect(mockOnNewSessionCreated).toHaveBeenCalledTimes(1); + expect(mockOnNewSessionCreated).toHaveBeenCalledWith(null, matchNewSessionMeta); + }); + + it('Creates a new Faro user session if (old) session expiration time is reached.', () => { + const mockIsSampled = jest.fn(); + jest.spyOn(samplingModule, 'isSampled').mockImplementation(mockIsSampled); + + const oldStoredMeta = { + id: 'aaaa', + attributes: { + previousSession: 'bbbb', + isSampled: 'true', + }, + }; + const storedSession = { + sessionId: mockInitialSessionId, + lastActivity: fakeSystemTime, + started: fakeSystemTime, + isSampled: true, + sessionMeta: oldStoredMeta, + }; + + const { updateSession } = new PersistentSessionsManager(); + + // overwrite auto created session + mockStorage[STORAGE_KEY] = JSON.stringify(storedSession); + + const mockNewSessionId = 'abcde'; + jest.spyOn(faroCore, 'genShortID').mockReturnValue(mockNewSessionId); + + const maxActivityTimeReached = fakeSystemTime + SESSION_EXPIRATION_TIME; + jest.setSystemTime(maxActivityTimeReached); + + updateSession(); + + // creates and stores new session + const session = JSON.parse(mockStorage[STORAGE_KEY]); + + const matchNewSessionMeta = { + id: mockNewSessionId, + attributes: { + previousSession: mockInitialSessionId, + isSampled: 'true', + }, + }; + expect(session).toStrictEqual({ + sessionId: mockNewSessionId, + lastActivity: maxActivityTimeReached, + started: maxActivityTimeReached, + isSampled: true, + sessionMeta: matchNewSessionMeta, + }); + + // Updates session meta + expect(faro.metas.value.session).toStrictEqual(matchNewSessionMeta); + + // Call session created hook + expect(mockOnNewSessionCreated).toHaveBeenCalledTimes(1); + expect(mockOnNewSessionCreated).toHaveBeenCalledWith(oldStoredMeta, matchNewSessionMeta); + }); + + it('Creates a new Faro user session if setSession(§) is called outside the Faro session manager.', () => { + const mockIsSampled = jest.fn(); + jest.spyOn(samplingModule, 'isSampled').mockImplementation(mockIsSampled); + + const storedSession = { + sessionId: mockInitialSessionId, + isSampled: true, + }; + + mockStorage[STORAGE_KEY] = JSON.stringify(storedSession); + + new PersistentSessionsManager(); + + const initialSession: FaroUserSession = JSON.parse(mockStorage[STORAGE_KEY]!); + expect(initialSession.sessionId).toBe(mockInitialSessionId); + + const manualSetSessionId = 'xyz'; + faro.api.setSession({ id: manualSetSessionId }); + expect(mockIsSampled).toHaveBeenCalledTimes(1); + + const newSession: FaroUserSession = JSON.parse(mockStorage[STORAGE_KEY]!); + expect(newSession.sessionId).toBe(manualSetSessionId); + }); + + it('Stores in the locals storage even if it contains objects with circular references.', () => { + const circularObject = { a: 'b' }; + (circularObject as any).circular = circularObject; + + const storedSession = { + sessionId: mockInitialSessionId, + isSampled: true, + circularObject, + lastActivity: fakeSystemTime, + started: fakeSystemTime, + }; + + expect(() => { + PersistentSessionsManager.storeUserSession(storedSession); + }).not.toThrow(); + }); +}); diff --git a/packages/react-native-sdk/src/instrumentations/session/sessionManager/PersistentSessionsManager.ts b/packages/react-native-sdk/src/instrumentations/session/sessionManager/PersistentSessionsManager.ts new file mode 100644 index 000000000..6f0355442 --- /dev/null +++ b/packages/react-native-sdk/src/instrumentations/session/sessionManager/PersistentSessionsManager.ts @@ -0,0 +1,68 @@ +import { faro } from '@grafana/faro-core'; +import type { Meta } from '@grafana/faro-core'; + +import { stringifyExternalJson, throttle } from '../../../utils'; +import { getItem, removeItem, setItem, webStorageType } from '../../../utils/webStorage'; + +import { isSampled } from './sampling'; +import { STORAGE_KEY, STORAGE_UPDATE_DELAY } from './sessionConstants'; +import { addSessionMetadataToNextSession, createUserSessionObject, getUserSessionUpdater } from './sessionManagerUtils'; +import type { FaroUserSession } from './types'; + +export class PersistentSessionsManager { + private static storageTypeLocal = webStorageType.local; + private updateUserSession: ReturnType; + + constructor() { + this.updateUserSession = getUserSessionUpdater({ + fetchUserSession: PersistentSessionsManager.fetchUserSession, + storeUserSession: PersistentSessionsManager.storeUserSession, + }); + + this.init(); + } + + static removeUserSession() { + removeItem(STORAGE_KEY, PersistentSessionsManager.storageTypeLocal); + } + + static storeUserSession(session: FaroUserSession): void { + setItem(STORAGE_KEY, stringifyExternalJson(session), PersistentSessionsManager.storageTypeLocal); + } + + static fetchUserSession(): FaroUserSession | null { + const storedSession = getItem(STORAGE_KEY, PersistentSessionsManager.storageTypeLocal); + + if (storedSession) { + return JSON.parse(storedSession) as FaroUserSession; + } + + return null; + } + + updateSession = throttle(() => this.updateUserSession(), STORAGE_UPDATE_DELAY); + + private init(): void { + document.addEventListener('visibilitychange', () => { + if (document.visibilityState === 'visible') { + this.updateSession(); + } + }); + + // Users can call the setSession() method, so we need to sync this with the local storage session + faro.metas.addListener(function syncSessionIfChangedExternally(meta: Meta) { + const session = meta.session; + const sessionFromLocalStorage = PersistentSessionsManager.fetchUserSession(); + + if (session && session.id !== sessionFromLocalStorage?.sessionId) { + const userSession = addSessionMetadataToNextSession( + createUserSessionObject({ sessionId: session.id, isSampled: isSampled() }), + sessionFromLocalStorage + ); + + PersistentSessionsManager.storeUserSession(userSession); + faro.api.setSession(userSession.sessionMeta); + } + }); + } +} diff --git a/packages/react-native-sdk/src/instrumentations/session/sessionManager/VolatileSessionManager.ts b/packages/react-native-sdk/src/instrumentations/session/sessionManager/VolatileSessionManager.ts new file mode 100644 index 000000000..5707fa332 --- /dev/null +++ b/packages/react-native-sdk/src/instrumentations/session/sessionManager/VolatileSessionManager.ts @@ -0,0 +1,59 @@ +import {faro} from '@grafana/faro-core'; +import type {Meta} from '@grafana/faro-core'; + +import {throttle} from '../../../utils'; +import {stringifyExternalJson} from '../../../utils/json'; + +import {isSampled} from './sampling'; +import {STORAGE_UPDATE_DELAY} from './sessionConstants'; +import {addSessionMetadataToNextSession, createUserSessionObject, getUserSessionUpdater} from './sessionManagerUtils'; +import type {FaroUserSession} from './types'; + +export class VolatileSessionsManager { + private updateUserSession: ReturnType; + private static storedSession: string|null = null; + constructor() { + this.updateUserSession = getUserSessionUpdater({ + fetchUserSession: VolatileSessionsManager.fetchUserSession, + storeUserSession: VolatileSessionsManager.storeUserSession, + }); + + this.init(); + } + + static removeUserSession() { + this.storedSession = null; + } + + static storeUserSession(session: FaroUserSession): void { + this.storedSession = stringifyExternalJson(session) + } + + static fetchUserSession(): FaroUserSession | null { + if (this.storedSession) { + return JSON.parse(this.storedSession) as FaroUserSession; + } + + return null; + } + + updateSession = throttle(() => this.updateUserSession(), STORAGE_UPDATE_DELAY); + + private init(): void { + // Users can call the setSession() method, so we need to sync this with the local storage session + faro.metas.addListener(function syncSessionIfChangedExternally(meta: Meta) { + const session = meta.session; + const sessionFromSessionStorage = VolatileSessionsManager.fetchUserSession(); + + if (session && session.id !== sessionFromSessionStorage?.sessionId) { + const userSession = addSessionMetadataToNextSession( + createUserSessionObject({ sessionId: session.id, isSampled: isSampled() }), + sessionFromSessionStorage + ); + + VolatileSessionsManager.storeUserSession(userSession); + faro.api.setSession(userSession.sessionMeta); + } + }); + } +} diff --git a/packages/react-native-sdk/src/instrumentations/session/sessionManager/VolatileSessionsManager.test.ts b/packages/react-native-sdk/src/instrumentations/session/sessionManager/VolatileSessionsManager.test.ts new file mode 100644 index 000000000..2045c3e2b --- /dev/null +++ b/packages/react-native-sdk/src/instrumentations/session/sessionManager/VolatileSessionsManager.test.ts @@ -0,0 +1,226 @@ +import * as faroCore from '@grafana/faro-core'; +import { faro, initializeFaro } from '@grafana/faro-core'; +import { mockConfig } from '@grafana/faro-core/src/testUtils'; + +import * as samplingModule from './sampling'; +import { SESSION_EXPIRATION_TIME, SESSION_INACTIVITY_TIME, STORAGE_KEY } from './sessionConstants'; +import type { FaroUserSession } from './types'; +import { VolatileSessionsManager } from './VolatileSessionManager'; + +const fakeSystemTime = new Date('2023-01-01').getTime(); +const mockInitialSessionId = '123'; + +describe('Volatile Sessions Manager.', () => { + let mockStorage: Record = {}; + let setItemSpy: jest.SpyInstance; + let getItemSpy: jest.SpyInstance; + + let mockOnNewSessionCreated = jest.fn(); + + beforeAll(() => { + jest.useFakeTimers(); + jest.setSystemTime(fakeSystemTime); + + setItemSpy = jest.spyOn(global.Storage.prototype, 'setItem').mockImplementation((key, value) => { + mockStorage[key] = value; + }); + + getItemSpy = jest.spyOn(global.Storage.prototype, 'getItem').mockImplementation((key) => mockStorage[key] ?? null); + + const config = mockConfig({ + sessionTracking: { + enabled: true, + session: { id: mockInitialSessionId }, + onSessionChange: mockOnNewSessionCreated, + }, + }); + + initializeFaro(config); + }); + + beforeEach(() => { + jest.clearAllMocks(); + mockStorage = {}; + }); + + afterEach(() => { + jest.spyOn(samplingModule, 'isSampled').mockRestore(); + }); + + afterAll(() => { + jest.useRealTimers(); + jest.restoreAllMocks(); + + getItemSpy.mockRestore(); + setItemSpy.mockRestore(); + }); + + it('Updates last active timestamp for valid session.', () => { + const validSession = { + sessionId: mockInitialSessionId, + lastActivity: fakeSystemTime, + started: fakeSystemTime, + isSampled: true, + }; + + mockStorage[STORAGE_KEY] = JSON.stringify(validSession); + + const { updateSession } = new VolatileSessionsManager(); + + const nextActivityTimeAfterFiveSeconds = fakeSystemTime; + jest.setSystemTime(nextActivityTimeAfterFiveSeconds); + + updateSession(); + + expect(setItemSpy).toBeCalledTimes(1); // called on time in the init function and the in the onActivity func + expect(mockStorage[STORAGE_KEY]).toBe( + JSON.stringify({ + sessionId: mockInitialSessionId, + lastActivity: nextActivityTimeAfterFiveSeconds, + started: fakeSystemTime, + isSampled: true, + }) + ); + }); + + it('Creates a new faro user session if (old) session max inactivity duration is reached.', () => { + const storedSession = { + sessionId: mockInitialSessionId, + lastActivity: fakeSystemTime, + started: fakeSystemTime, + isSampled: true, + }; + + mockStorage[STORAGE_KEY] = JSON.stringify(storedSession); + + const { updateSession } = new VolatileSessionsManager(); + + const mockNewSessionId = 'abcde'; + jest.spyOn(faroCore, 'genShortID').mockReturnValue(mockNewSessionId); + + const maxActivityTimeReached = fakeSystemTime + SESSION_INACTIVITY_TIME; + jest.setSystemTime(maxActivityTimeReached); + + updateSession(); + + // creates and stores new session + const session = JSON.parse(mockStorage[STORAGE_KEY]); + + const matchNewSessionMeta = { + id: mockNewSessionId, + attributes: { + previousSession: mockInitialSessionId, + isSampled: 'true', + }, + }; + expect(session).toStrictEqual({ + sessionId: mockNewSessionId, + lastActivity: maxActivityTimeReached, + started: maxActivityTimeReached, + isSampled: true, + sessionMeta: matchNewSessionMeta, + }); + + // Updates session meta + expect(faro.metas.value.session).toStrictEqual(matchNewSessionMeta); + + // Call session created hook + expect(mockOnNewSessionCreated).toHaveBeenCalledTimes(1); + expect(mockOnNewSessionCreated).toHaveBeenCalledWith(null, matchNewSessionMeta); + }); + + it('Creates a new faro user session if (old) session expiration time is reached.', () => { + const oldStoredMeta = { + id: 'aaaa', + attributes: { + previousSession: 'bbbb', + }, + }; + const storedSession = { + sessionId: mockInitialSessionId, + lastActivity: fakeSystemTime, + started: fakeSystemTime, + sessionMeta: oldStoredMeta, + isSampled: true, + }; + + const { updateSession } = new VolatileSessionsManager(); + + // overwrite auto created session + mockStorage[STORAGE_KEY] = JSON.stringify(storedSession); + + const mockNewSessionId = 'abcde'; + jest.spyOn(faroCore, 'genShortID').mockReturnValue(mockNewSessionId); + + const maxActivityTimeReached = fakeSystemTime + SESSION_EXPIRATION_TIME; + jest.setSystemTime(maxActivityTimeReached); + + updateSession(); + + // creates and stores new session + const session = JSON.parse(mockStorage[STORAGE_KEY]); + + const matchNewSessionMeta = { + id: mockNewSessionId, + attributes: { + previousSession: mockInitialSessionId, + isSampled: 'true', + }, + }; + expect(session).toStrictEqual({ + sessionId: mockNewSessionId, + lastActivity: maxActivityTimeReached, + started: maxActivityTimeReached, + isSampled: true, + sessionMeta: matchNewSessionMeta, + }); + + // Updates session meta + expect(faro.metas.value.session).toStrictEqual(matchNewSessionMeta); + + // Call session created hook + expect(mockOnNewSessionCreated).toHaveBeenCalledTimes(1); + expect(mockOnNewSessionCreated).toHaveBeenCalledWith(oldStoredMeta, matchNewSessionMeta); + }); + + it('Creates a new Faro user session if setSession() is called outside the Faro session manager.', () => { + const mockIsSampled = jest.fn(); + jest.spyOn(samplingModule, 'isSampled').mockImplementation(mockIsSampled); + + const storedSession = { + sessionId: mockInitialSessionId, + isSampled: true, + }; + + mockStorage[STORAGE_KEY] = JSON.stringify(storedSession); + + new VolatileSessionsManager(); + + const initialSession: FaroUserSession = JSON.parse(mockStorage[STORAGE_KEY]!); + expect(initialSession.sessionId).toBe(mockInitialSessionId); + + const manualSetSessionId = 'xyz'; + faro.api.setSession({ id: manualSetSessionId }); + expect(mockIsSampled).toHaveBeenCalledTimes(1); + + const newSession: FaroUserSession = JSON.parse(mockStorage[STORAGE_KEY]!); + expect(newSession.sessionId).toBe(manualSetSessionId); + }); + + it('Stores in the locals storage even if it contains objects with circular references.', () => { + const circularObject = { a: 'b' }; + (circularObject as any).circular = circularObject; + + const storedSession = { + sessionId: mockInitialSessionId, + isSampled: true, + circularObject, + lastActivity: fakeSystemTime, + started: fakeSystemTime, + }; + + expect(() => { + VolatileSessionsManager.storeUserSession(storedSession); + }).not.toThrow(); + }); +}); diff --git a/packages/react-native-sdk/src/instrumentations/session/sessionManager/getSessionManagerByConfig.ts b/packages/react-native-sdk/src/instrumentations/session/sessionManager/getSessionManagerByConfig.ts new file mode 100644 index 000000000..dd06a089d --- /dev/null +++ b/packages/react-native-sdk/src/instrumentations/session/sessionManager/getSessionManagerByConfig.ts @@ -0,0 +1,9 @@ +import type { Config } from '@grafana/faro-core'; + +import { PersistentSessionsManager } from './PersistentSessionsManager'; +import type { SessionManager } from './types'; +import { VolatileSessionsManager } from './VolatileSessionManager'; + +export function getSessionManagerByConfig(sessionTrackingConfig: Config['sessionTracking']): SessionManager { + return sessionTrackingConfig?.persistent ? PersistentSessionsManager : VolatileSessionsManager; +} diff --git a/packages/react-native-sdk/src/instrumentations/session/sessionManager/index.ts b/packages/react-native-sdk/src/instrumentations/session/sessionManager/index.ts new file mode 100644 index 000000000..efcd96a0e --- /dev/null +++ b/packages/react-native-sdk/src/instrumentations/session/sessionManager/index.ts @@ -0,0 +1,18 @@ +export { PersistentSessionsManager } from './PersistentSessionsManager'; +export { VolatileSessionsManager } from './VolatileSessionManager'; + +export { + MAX_SESSION_PERSISTENCE_TIME, + MAX_SESSION_PERSISTENCE_TIME_BUFFER, + SESSION_EXPIRATION_TIME, + SESSION_INACTIVITY_TIME, + STORAGE_KEY, + STORAGE_UPDATE_DELAY, + defaultSessionTrackingConfig, +} from './sessionConstants'; + +export { isSampled } from './sampling'; + +export type { FaroUserSession } from './types'; + +export { getSessionManagerByConfig } from './getSessionManagerByConfig'; diff --git a/packages/react-native-sdk/src/instrumentations/session/sessionManager/sampling.test.ts b/packages/react-native-sdk/src/instrumentations/session/sessionManager/sampling.test.ts new file mode 100644 index 000000000..e6da6d8b8 --- /dev/null +++ b/packages/react-native-sdk/src/instrumentations/session/sessionManager/sampling.test.ts @@ -0,0 +1,72 @@ +import { initializeFaro } from '@grafana/faro-core'; +import { mockConfig } from '@grafana/faro-core/src/testUtils'; + +import { createSession } from '../../../metas'; + +import { isSampled } from './sampling'; + +describe('Sampling.', () => { + afterEach(() => { + jest.spyOn(global.Math, 'random').mockRestore(); + }); + + it('Returns false if sampleRate is not of type number.', () => { + const config = mockConfig({ + sessionTracking: { + samplingRate: 'hello' as any, + }, + }); + + initializeFaro(config); + + expect(isSampled()).toBe(false); + }); + + it('Returns proper sampling decision for configured samplingRate.', () => { + let config = mockConfig({ + sessionTracking: { + enabled: true, + samplingRate: 1, + }, + }); + + initializeFaro(config); + expect(isSampled()).toBe(true); + + config.sessionTracking!.samplingRate = 0; + initializeFaro(config); + expect(isSampled()).toBe(false); + }); + + it('Returns proper sampling decision for rate returned by sampler function.', () => { + let config = mockConfig({ + sessionTracking: { + enabled: true, + sampler: () => { + return 1; + }, + }, + }); + + initializeFaro(config); + expect(isSampled()).toBe(true); + + config.sessionTracking!.sampler = () => 0; + initializeFaro(config); + expect(isSampled()).toBe(false); + + config.sessionTracking!.session = createSession({ location: 'moon' }); + config.sessionTracking!.sampler = ({ metas }) => { + if (metas.session?.attributes?.['location'] === 'moon') { + return 0; + } + return 1; + }; + initializeFaro(config); + expect(isSampled()).toBe(false); + + config.sessionTracking!.session = createSession({ location: 'mars' }); + initializeFaro(config); + expect(isSampled()).toBe(true); + }); +}); diff --git a/packages/react-native-sdk/src/instrumentations/session/sessionManager/sampling.ts b/packages/react-native-sdk/src/instrumentations/session/sessionManager/sampling.ts new file mode 100644 index 000000000..0d5470fe2 --- /dev/null +++ b/packages/react-native-sdk/src/instrumentations/session/sessionManager/sampling.ts @@ -0,0 +1,15 @@ +import { faro } from '@grafana/faro-core'; + +export function isSampled(): boolean { + const sendAllSignals = 1; + const sessionTracking = faro.config.sessionTracking; + let samplingRate = + sessionTracking?.sampler?.({ metas: faro.metas.value }) ?? sessionTracking?.samplingRate ?? sendAllSignals; + + if (typeof samplingRate !== 'number') { + const sendNoSignals = 0; + samplingRate = sendNoSignals; + } + + return Math.random() < samplingRate; +} diff --git a/packages/react-native-sdk/src/instrumentations/session/sessionManager/sessionConstants.ts b/packages/react-native-sdk/src/instrumentations/session/sessionManager/sessionConstants.ts new file mode 100644 index 000000000..5a16a6c08 --- /dev/null +++ b/packages/react-native-sdk/src/instrumentations/session/sessionManager/sessionConstants.ts @@ -0,0 +1,18 @@ +import type { Config } from '@grafana/faro-core'; + +export const STORAGE_KEY = 'com.grafana.faro.session'; +export const SESSION_EXPIRATION_TIME = 4 * 60 * 60 * 1000; // hrs +export const SESSION_INACTIVITY_TIME = 15 * 60 * 1000; // minutes +export const STORAGE_UPDATE_DELAY = 1 * 1000; // seconds + +/** + * @deprecated MAX_SESSION_PERSISTENCE_TIME_BUFFER is not used anymore. The constant will be removed in the future + */ +export const MAX_SESSION_PERSISTENCE_TIME_BUFFER = 1 * 60 * 1000; +export const MAX_SESSION_PERSISTENCE_TIME = SESSION_INACTIVITY_TIME; + +export const defaultSessionTrackingConfig: Config['sessionTracking'] = { + enabled: true, + persistent: false, + maxSessionPersistenceTime: MAX_SESSION_PERSISTENCE_TIME, +} as const; diff --git a/packages/react-native-sdk/src/instrumentations/session/sessionManager/sessionManagerUtils.test.ts b/packages/react-native-sdk/src/instrumentations/session/sessionManager/sessionManagerUtils.test.ts new file mode 100644 index 000000000..7ea0a6dcf --- /dev/null +++ b/packages/react-native-sdk/src/instrumentations/session/sessionManager/sessionManagerUtils.test.ts @@ -0,0 +1,355 @@ +import * as faroCore from '@grafana/faro-core'; +import { initializeFaro } from '@grafana/faro-core'; +import { mockConfig } from '@grafana/faro-core/src/testUtils'; + +import { getSessionManagerByConfig } from './getSessionManagerByConfig'; +import { PersistentSessionsManager } from './PersistentSessionsManager'; +import { SESSION_EXPIRATION_TIME, SESSION_INACTIVITY_TIME } from './sessionConstants'; +import * as mockSessionManagerUtils from './sessionManagerUtils'; +import { + addSessionMetadataToNextSession, + createUserSessionObject, + getUserSessionUpdater, + isUserSessionValid, +} from './sessionManagerUtils'; +import type { FaroUserSession } from './types'; +import { VolatileSessionsManager } from './VolatileSessionManager'; + +const fakeSystemTime = new Date('2023-01-01').getTime(); +const mockSessionId = '123'; + +describe('sessionManagerUtils', () => { + beforeAll(() => { + jest.useFakeTimers(); + jest.setSystemTime(fakeSystemTime); + }); + + beforeEach(() => { + jest.resetAllMocks(); + jest.restoreAllMocks(); + }); + + afterAll(() => { + jest.restoreAllMocks(); + jest.useRealTimers(); + }); + + it('creates new user session object.', () => { + jest.spyOn(faroCore, 'genShortID').mockReturnValue(mockSessionId); + + // create new id + const newSession = createUserSessionObject(); + + expect(newSession).toStrictEqual({ + sessionId: mockSessionId, + lastActivity: fakeSystemTime, + started: fakeSystemTime, + isSampled: true, + }); + + // create with given sessionId + const mockInitialSessionId = 'abcde'; + const newSessionWithInitialSessionId = createUserSessionObject({ sessionId: mockInitialSessionId }); + + expect(newSessionWithInitialSessionId).toStrictEqual({ + sessionId: mockInitialSessionId, + lastActivity: fakeSystemTime, + started: fakeSystemTime, + isSampled: true, + }); + }); + + it('creates new user session object and uses user defined generateSessionId.', () => { + const customGeneratedSessionId = 'my-custom-id'; + + const config = mockConfig({ + sessionTracking: { + enabled: true, + generateSessionId() { + return customGeneratedSessionId; + }, + }, + }); + + initializeFaro(config); + + const newSessionWithInitialSessionId = createUserSessionObject(); + + expect(newSessionWithInitialSessionId).toStrictEqual({ + sessionId: customGeneratedSessionId, + lastActivity: fakeSystemTime, + started: fakeSystemTime, + isSampled: true, + }); + }); + + it('checks if user session is valid.', () => { + jest.spyOn(faroCore, 'genShortID').mockReturnValue(mockSessionId); + + // return false if session is null + const isNullSessionInvalid = isUserSessionValid(null); + expect(isNullSessionInvalid).toBe(false); + + // return false if activity timeout is reached + const newInactiveSession = createUserSessionObject(); + newInactiveSession.lastActivity = SESSION_INACTIVITY_TIME; + const isActivityTimeoutSessionInvalid = isUserSessionValid(newInactiveSession); + expect(isActivityTimeoutSessionInvalid).toBe(false); + + // return false if lifetime timeout is reached + const newTimedOutSession = createUserSessionObject(); + newTimedOutSession.started -= SESSION_EXPIRATION_TIME; + const isTimedOutSessionInvalid = isUserSessionValid(newTimedOutSession); + expect(isTimedOutSessionInvalid).toBe(false); + + // return false if session is null + const isNullSessionValid = isUserSessionValid(createUserSessionObject()); + expect(isNullSessionValid).toBe(true); + + // return false if activity timeout is reached + const newActiveSession = createUserSessionObject(); + newActiveSession.lastActivity = fakeSystemTime - 1; + const isActivityTimeoutSessionValid = isUserSessionValid(newActiveSession); + expect(isActivityTimeoutSessionValid).toBe(true); + + // return false if lifetime timeout is reached + const newSessionWithValidLifetime = createUserSessionObject(); + newSessionWithValidLifetime.started -= SESSION_EXPIRATION_TIME - 1; + const isTimedOutSessionValid = isUserSessionValid(newSessionWithValidLifetime); + expect(isTimedOutSessionValid).toBe(true); + }); + + it('configures userSessionUpdater and expands the current user session as well as the current sessionMeta.', () => { + const mockOnSessionChange = jest.fn(); + + const config = mockConfig({ + sessionTracking: { + enabled: true, + onSessionChange: mockOnSessionChange, + }, + }); + + const faro = initializeFaro(config); + + const mockFetchUserSession = jest.fn(); + const mockStoreUserSession = jest.fn(); + + const updateSession = getUserSessionUpdater({ + fetchUserSession: mockFetchUserSession, + storeUserSession: mockStoreUserSession, + }); + + // session is invalid + jest.spyOn(mockSessionManagerUtils, 'isUserSessionValid').mockReturnValueOnce(false); + + const mockSetSession = jest.fn(); + jest.spyOn(faro.api, 'setSession').mockImplementationOnce(mockSetSession); + + mockFetchUserSession.mockReturnValueOnce({ + sessionId: 'abc', + attributes: { + previousSession: 'previousSession', + }, + }); + + jest.spyOn(faroCore, 'genShortID').mockReturnValueOnce(mockSessionId); + + updateSession(); + + expect(mockFetchUserSession).toHaveBeenCalledTimes(1); + expect(mockStoreUserSession).toHaveBeenCalledTimes(1); + expect(mockSetSession).toHaveBeenCalledTimes(1); + expect(mockOnSessionChange).toHaveBeenCalledTimes(1); + + expect(mockSetSession).toHaveBeenCalledWith({ + id: mockSessionId, + attributes: { + previousSession: 'abc', + isSampled: 'true', + }, + }); + + expect(mockOnSessionChange).toHaveBeenCalledWith(null, { + attributes: { previousSession: 'abc', isSampled: 'true' }, + id: '123', + }); + }); + + it('configures userSessionUpdater and expands the current user session as well as the current sessionMeta for a session which already got expanded.', () => { + const currentSessionMeta = { + id: 'currentSession', + attributes: { + previousSession: 'previous', + isSampled: 'true', + }, + }; + + const mockOnSessionChange = jest.fn(); + + const config = mockConfig({ + sessionTracking: { + enabled: true, + onSessionChange: mockOnSessionChange, + session: currentSessionMeta, + }, + }); + + const faro = initializeFaro(config); + + const mockFetchUserSession = jest.fn(); + const mockStoreUserSession = jest.fn(); + + const updateSession = getUserSessionUpdater({ + fetchUserSession: mockFetchUserSession, + storeUserSession: mockStoreUserSession, + }); + + // session is invalid + jest.spyOn(mockSessionManagerUtils, 'isUserSessionValid').mockReturnValueOnce(false); + + const mockSetSession = jest.fn(); + jest.spyOn(faro.api, 'setSession').mockImplementationOnce(mockSetSession); + + mockFetchUserSession.mockReturnValue({ + sessionId: currentSessionMeta.id, + attributes: { + previousSession: currentSessionMeta.attributes.previousSession, + }, + sessionMeta: currentSessionMeta, + }); + + const nextSessionId = 'nextSession'; + jest.spyOn(faroCore, 'genShortID').mockReturnValueOnce(nextSessionId); + + updateSession(); + + const newSessionMeta = { + id: nextSessionId, + attributes: { + previousSession: currentSessionMeta.id, + isSampled: 'true', + }, + }; + + expect(mockSetSession).toHaveBeenCalledWith(newSessionMeta); + + expect(mockOnSessionChange).toHaveBeenCalledWith(currentSessionMeta, newSessionMeta); + }); + + it('Takes session object and adds meta data.', () => { + const config = mockConfig({}); + const { api } = initializeFaro(config); + + const newSession: FaroUserSession = { + lastActivity: 1, + started: 2, + sessionId: 'new-session-id', + isSampled: true, + }; + + const sessionWithMetadata1 = addSessionMetadataToNextSession(newSession, null); + + expect(sessionWithMetadata1).toStrictEqual({ + ...newSession, + sessionMeta: { + id: newSession.sessionId, + attributes: { + isSampled: 'true', + }, + }, + }); + + const previousSession: FaroUserSession = { + lastActivity: 8, + started: 9, + sessionId: 'previous-session-id', + isSampled: true, + }; + + const sessionWithMetadata2 = addSessionMetadataToNextSession(newSession, previousSession); + + expect(sessionWithMetadata2).toStrictEqual({ + ...newSession, + sessionMeta: { + id: newSession.sessionId, + attributes: { + previousSession: previousSession.sessionId, + isSampled: 'true', + }, + }, + }); + + const sessionMeta = { + id: previousSession.sessionId, + attributes: { + previousSession: '12345', + foo: 'bar', + baz: 'bam', + }, + }; + + api.setSession(sessionMeta); + + const sessionWithMetadata3 = addSessionMetadataToNextSession(newSession, previousSession); + + expect(sessionWithMetadata3).toStrictEqual({ + ...newSession, + sessionMeta: { + id: newSession.sessionId, + attributes: { + ...sessionMeta.attributes, + isSampled: 'true', + previousSession: previousSession.sessionId, + }, + }, + }); + }); + + it('forces userSessionUpdater to expand the current user session.', () => { + const mockOnSessionChange = jest.fn(); + + const config = mockConfig({ + sessionTracking: { + enabled: true, + onSessionChange: mockOnSessionChange, + }, + }); + + const faro = initializeFaro(config); + + const mockIsUserSessionValid = jest.fn(); + jest.spyOn(mockSessionManagerUtils, 'isUserSessionValid').mockImplementationOnce(() => { + mockIsUserSessionValid(); + return true; + }); + + const mockFetchUserSession = jest.fn(); + const mockStoreUserSession = jest.fn(); + + const updateSession = getUserSessionUpdater({ + fetchUserSession: mockFetchUserSession, + storeUserSession: mockStoreUserSession, + }); + + const mockSetSession = jest.fn(); + jest.spyOn(faro.api, 'setSession').mockImplementationOnce(mockSetSession); + + updateSession({ forceSessionExtend: true }); + + expect(mockFetchUserSession).toHaveBeenCalledTimes(1); + + expect(mockIsUserSessionValid).not.toHaveBeenCalled(); + + expect(mockStoreUserSession).toHaveBeenCalledTimes(1); + expect(mockSetSession).toHaveBeenCalledTimes(1); + expect(mockOnSessionChange).toHaveBeenCalledTimes(1); + }); + + it('Returns the configured session manager.', () => { + let SessionManager = getSessionManagerByConfig({ persistent: false /* default */ }); + expect(new SessionManager()).toBeInstanceOf(VolatileSessionsManager); + + SessionManager = getSessionManagerByConfig({ persistent: true }); + expect(new SessionManager()).toBeInstanceOf(PersistentSessionsManager); + }); +}); diff --git a/packages/react-native-sdk/src/instrumentations/session/sessionManager/sessionManagerUtils.ts b/packages/react-native-sdk/src/instrumentations/session/sessionManager/sessionManagerUtils.ts new file mode 100644 index 000000000..c125045c5 --- /dev/null +++ b/packages/react-native-sdk/src/instrumentations/session/sessionManager/sessionManagerUtils.ts @@ -0,0 +1,110 @@ +import { dateNow, faro, genShortID } from '@grafana/faro-core'; + +import { isLocalStorageAvailable, isSessionStorageAvailable } from '../../../utils'; + +import { isSampled } from './sampling'; +import { SESSION_EXPIRATION_TIME, SESSION_INACTIVITY_TIME } from './sessionConstants'; +import type { FaroUserSession } from './types'; + +type CreateUserSessionObjectParams = { + sessionId?: string; + started?: number; + lastActivity?: number; + isSampled?: boolean; +}; + +export function createUserSessionObject({ + sessionId, + started, + lastActivity, + isSampled = true, +}: CreateUserSessionObjectParams = {}): FaroUserSession { + const now = dateNow(); + + const generateSessionId = faro.config?.sessionTracking?.generateSessionId; + + if (sessionId == null) { + sessionId = typeof generateSessionId === 'function' ? generateSessionId() : genShortID(); + } + + return { + sessionId, + lastActivity: lastActivity ?? now, + started: started ?? now, + isSampled: isSampled, + }; +} + +export function isUserSessionValid(session: FaroUserSession | null): boolean { + if (session == null) { + return false; + } + + const now = dateNow(); + const lifetimeValid = now - session.started < SESSION_EXPIRATION_TIME; + + if (!lifetimeValid) { + return false; + } + + const inactivityPeriodValid = now - session.lastActivity < SESSION_INACTIVITY_TIME; + return inactivityPeriodValid; +} + +type GetUserSessionUpdaterParams = { + storeUserSession: (session: FaroUserSession) => void; + fetchUserSession: () => FaroUserSession | null; +}; + +type UpdateSessionParams = { forceSessionExtend: boolean }; + +export function getUserSessionUpdater({ + fetchUserSession, + storeUserSession, +}: GetUserSessionUpdaterParams): (options?: UpdateSessionParams) => void { + return function updateSession({ forceSessionExtend } = { forceSessionExtend: false }): void { + if (!fetchUserSession || !storeUserSession) { + return; + } + + const sessionTrackingConfig = faro.config.sessionTracking; + const isPersistentSessions = sessionTrackingConfig?.persistent; + + if ((isPersistentSessions && !isLocalStorageAvailable) || (!isPersistentSessions && !isSessionStorageAvailable)) { + return; + } + + const sessionFromStorage = fetchUserSession(); + + if (forceSessionExtend === false && isUserSessionValid(sessionFromStorage)) { + storeUserSession({ ...sessionFromStorage!, lastActivity: dateNow() }); + } else { + let newSession = addSessionMetadataToNextSession( + createUserSessionObject({ isSampled: isSampled() }), + sessionFromStorage + ); + + storeUserSession(newSession); + + faro.api?.setSession(newSession.sessionMeta); + sessionTrackingConfig?.onSessionChange?.(sessionFromStorage?.sessionMeta ?? null, newSession.sessionMeta!); + } + }; +} + +export function addSessionMetadataToNextSession(newSession: FaroUserSession, previousSession: FaroUserSession | null) { + const sessionWithMeta: Required = { + ...newSession, + sessionMeta: { + id: newSession.sessionId, + attributes: { + ...faro.config.sessionTracking?.session?.attributes, + ...(faro.metas.value.session?.attributes ?? {}), + ...(previousSession != null ? { previousSession: previousSession.sessionId } : {}), + isSampled: newSession.isSampled.toString(), + }, + }, + }; + + return sessionWithMeta; +} diff --git a/packages/react-native-sdk/src/instrumentations/session/sessionManager/types.ts b/packages/react-native-sdk/src/instrumentations/session/sessionManager/types.ts new file mode 100644 index 000000000..d1be351aa --- /dev/null +++ b/packages/react-native-sdk/src/instrumentations/session/sessionManager/types.ts @@ -0,0 +1,14 @@ +import type { MetaSession } from '@grafana/faro-core'; + +import type { PersistentSessionsManager } from './PersistentSessionsManager'; +import type { VolatileSessionsManager } from './VolatileSessionManager'; + +export interface FaroUserSession { + sessionId: string; + lastActivity: number; + started: number; + isSampled: boolean; + sessionMeta?: MetaSession; +} + +export type SessionManager = typeof VolatileSessionsManager | typeof PersistentSessionsManager; diff --git a/packages/react-native-sdk/src/instrumentations/view/index.ts b/packages/react-native-sdk/src/instrumentations/view/index.ts new file mode 100644 index 000000000..ed4bebb8b --- /dev/null +++ b/packages/react-native-sdk/src/instrumentations/view/index.ts @@ -0,0 +1 @@ +export { ViewInstrumentation } from './instrumentation'; diff --git a/packages/react-native-sdk/src/instrumentations/view/instrumentation.test.ts b/packages/react-native-sdk/src/instrumentations/view/instrumentation.test.ts new file mode 100644 index 000000000..97aaf9a84 --- /dev/null +++ b/packages/react-native-sdk/src/instrumentations/view/instrumentation.test.ts @@ -0,0 +1,26 @@ +import { EventEvent, initializeFaro, TransportItem } from '@grafana/faro-core'; +import { mockConfig, MockTransport } from '@grafana/faro-core/src/testUtils'; + +import { ViewInstrumentation } from './instrumentation'; + +describe('ViewInstrumentation', () => { + it('will send view changed event if setView is called.', () => { + const transport = new MockTransport(); + const view = { name: 'my-view' }; + + const { api } = initializeFaro( + mockConfig({ + transports: [transport], + instrumentations: [new ViewInstrumentation()], + view, + }) + ); + + const newView = { name: 'my-view' }; + api.setView(newView); + expect(transport.items).toHaveLength(1); + + let event = transport.items[0]! as TransportItem; + expect(event.meta.view?.name).toEqual(view.name); + }); +}); diff --git a/packages/react-native-sdk/src/instrumentations/view/instrumentation.ts b/packages/react-native-sdk/src/instrumentations/view/instrumentation.ts new file mode 100644 index 000000000..e62d11f2a --- /dev/null +++ b/packages/react-native-sdk/src/instrumentations/view/instrumentation.ts @@ -0,0 +1,33 @@ +import { BaseInstrumentation, EVENT_VIEW_CHANGED, Meta, MetaView, unknownString, VERSION } from '@grafana/faro-core'; + +// all this does is send VIEW_CHANGED event +export class ViewInstrumentation extends BaseInstrumentation { + readonly name = '@grafana/faro-web-sdk:instrumentation-view'; + readonly version = VERSION; + + // previously notified view, to ensure we don't send view changed + // event twice for the same view + private notifiedView: MetaView | undefined; + + private sendViewChangedEvent(meta: Meta): void { + const view = meta.view; + + if (view && view.name !== this.notifiedView?.name) { + this.api.pushEvent( + EVENT_VIEW_CHANGED, + { + fromView: this.notifiedView?.name ?? unknownString, + toView: view.name ?? unknownString, + }, + undefined, + { skipDedupe: true } + ); + + this.notifiedView = view; + } + } + + initialize() { + this.metas.addListener(this.sendViewChangedEvent.bind(this)); + } +} diff --git a/packages/react-native-sdk/src/instrumentations/webVitals/index.ts b/packages/react-native-sdk/src/instrumentations/webVitals/index.ts new file mode 100644 index 000000000..7e752289f --- /dev/null +++ b/packages/react-native-sdk/src/instrumentations/webVitals/index.ts @@ -0,0 +1 @@ +export { WebVitalsInstrumentation } from './instrumentation'; diff --git a/packages/react-native-sdk/src/instrumentations/webVitals/instrumentation.test.ts b/packages/react-native-sdk/src/instrumentations/webVitals/instrumentation.test.ts new file mode 100644 index 000000000..c56010313 --- /dev/null +++ b/packages/react-native-sdk/src/instrumentations/webVitals/instrumentation.test.ts @@ -0,0 +1,44 @@ +import { initializeFaro } from '@grafana/faro-core'; +import { mockConfig, MockTransport } from '@grafana/faro-core/src/testUtils'; + +import { WebVitalsInstrumentation } from './instrumentation'; +import { WebVitalsBasic } from './webVitalsBasic'; +import { WebVitalsWithAttribution } from './webVitalsWithAttribution'; + +jest.mock('./webVitalsWithAttribution'); +jest.mock('./webVitalsBasic'); + +describe('WebVitals Instrumentation', () => { + beforeEach(() => { + jest.clearAllMocks(); + }); + + it('load WebVitalsBasic by default', () => { + const transport = new MockTransport(); + + initializeFaro( + mockConfig({ + transports: [transport], + instrumentations: [new WebVitalsInstrumentation()], + }) + ); + + expect(WebVitalsBasic).toHaveBeenCalledTimes(1); + expect(WebVitalsWithAttribution).toHaveBeenCalledTimes(0); + }); + + it('load WebVitalsWithAttribution when trackWebVitalAttribution is true', () => { + const transport = new MockTransport(); + + initializeFaro( + mockConfig({ + trackWebVitalsAttribution: true, + transports: [transport], + instrumentations: [new WebVitalsInstrumentation()], + }) + ); + + expect(WebVitalsBasic).toHaveBeenCalledTimes(0); + expect(WebVitalsWithAttribution).toHaveBeenCalledTimes(1); + }); +}); diff --git a/packages/react-native-sdk/src/instrumentations/webVitals/instrumentation.ts b/packages/react-native-sdk/src/instrumentations/webVitals/instrumentation.ts new file mode 100644 index 000000000..b4e1fc5a8 --- /dev/null +++ b/packages/react-native-sdk/src/instrumentations/webVitals/instrumentation.ts @@ -0,0 +1,22 @@ +import { BaseInstrumentation, VERSION } from '@grafana/faro-core'; + +import { WebVitalsBasic } from './webVitalsBasic'; +import { WebVitalsWithAttribution } from './webVitalsWithAttribution'; + +export class WebVitalsInstrumentation extends BaseInstrumentation { + readonly name = '@grafana/faro-web-sdk:instrumentation-web-vitals'; + readonly version = VERSION; + + initialize(): void { + this.logDebug('Initializing'); + const webVitals = this.intializeWebVitalsInstrumentation(); + webVitals.initialize(); + } + + private intializeWebVitalsInstrumentation() { + if (this.config.trackWebVitalsAttribution) { + return new WebVitalsWithAttribution(this.api.pushMeasurement); + } + return new WebVitalsBasic(this.api.pushMeasurement); + } +} diff --git a/packages/react-native-sdk/src/instrumentations/webVitals/webVitalsBasic.test.ts b/packages/react-native-sdk/src/instrumentations/webVitals/webVitalsBasic.test.ts new file mode 100644 index 000000000..5dba94784 --- /dev/null +++ b/packages/react-native-sdk/src/instrumentations/webVitals/webVitalsBasic.test.ts @@ -0,0 +1,42 @@ +import type { Metric } from 'web-vitals'; + +import { WebVitalsBasic } from './webVitalsBasic'; + +jest.mock('web-vitals', () => { + type MetricName = Metric['name']; + + function createMetric(name: MetricName): Metric { + return { + name, + value: 0.1, + rating: 'good', + delta: 0.1, + id: 'id', + entries: [], + navigationType: 'navigate', + }; + } + + return { + onCLS: (cb: (metric: Metric) => void) => cb(createMetric('CLS')), + onFCP: (cb: (metric: Metric) => void) => cb(createMetric('FCP')), + onFID: (cb: (metric: Metric) => void) => cb(createMetric('FID')), + onLCP: (cb: (metric: Metric) => void) => cb(createMetric('LCP')), + onTTFB: (cb: (metric: Metric) => void) => cb(createMetric('TTFB')), + onINP: (cb: (metric: Metric) => void) => cb(createMetric('INP')), + }; +}); + +describe('WebVitalsBasicInstrumentation', () => { + it.each(['cls', 'fcp', 'fid', 'inp', 'lcp', 'ttfb'])('send %p metrics correctly', (metric) => { + const pushMeasurement = jest.fn(); + new WebVitalsBasic(pushMeasurement).initialize(); + + expect(pushMeasurement).toHaveBeenCalledWith({ + type: 'web-vitals', + values: { + [metric]: 0.1, + }, + }); + }); +}); diff --git a/packages/react-native-sdk/src/instrumentations/webVitals/webVitalsBasic.ts b/packages/react-native-sdk/src/instrumentations/webVitals/webVitalsBasic.ts new file mode 100644 index 000000000..82b0764bf --- /dev/null +++ b/packages/react-native-sdk/src/instrumentations/webVitals/webVitalsBasic.ts @@ -0,0 +1,30 @@ +import { onCLS, onFCP, onFID, onINP, onLCP, onTTFB } from 'web-vitals'; + +import type { MeasurementsAPI } from '@grafana/faro-core'; + +export class WebVitalsBasic { + static mapping = { + cls: onCLS, + fcp: onFCP, + fid: onFID, + inp: onINP, + lcp: onLCP, + ttfb: onTTFB, + }; + + constructor(private pushMeasurement: MeasurementsAPI['pushMeasurement']) {} + + initialize(): void { + Object.entries(WebVitalsBasic.mapping).forEach(([indicator, executor]) => { + executor((metric) => { + this.pushMeasurement({ + type: 'web-vitals', + + values: { + [indicator]: metric.value, + }, + }); + }); + }); + } +} diff --git a/packages/react-native-sdk/src/instrumentations/webVitals/webVitalsWithAttribution.test.ts b/packages/react-native-sdk/src/instrumentations/webVitals/webVitalsWithAttribution.test.ts new file mode 100644 index 000000000..3f18dd89e --- /dev/null +++ b/packages/react-native-sdk/src/instrumentations/webVitals/webVitalsWithAttribution.test.ts @@ -0,0 +1,263 @@ +import type { MetricWithAttribution } from 'web-vitals/attribution'; + +import { WebVitalsWithAttribution } from './webVitalsWithAttribution'; + +jest.mock('web-vitals/attribution', () => { + type MetricName = MetricWithAttribution['name']; + type MetricAttribution = MetricWithAttribution['attribution']; + + function createMetric(name: MetricName, attribution: MetricAttribution): MetricWithAttribution { + return { + name, + value: 0.1, + rating: 'good', + delta: 0.1, + id: 'id', + entries: [], + navigationType: 'navigate', + attribution, + } as MetricWithAttribution; + } + + return { + onCLS: (cb: (metric: MetricWithAttribution) => void) => { + cb( + createMetric('CLS', { + largestShiftValue: 0.1, + largestShiftTime: 0.1, + largestShiftTarget: 'target', + loadState: 'loading', + }) + ); + }, + onFCP: (cb: (metric: MetricWithAttribution) => void) => { + cb( + createMetric('FCP', { + firstByteToFCP: 0.1, + timeToFirstByte: 0.1, + loadState: 'loading', + }) + ); + }, + onFID: (cb: (metric: MetricWithAttribution) => void) => { + cb( + createMetric('FID', { + eventTime: 0.1, + eventTarget: 'target', + eventType: 'type', + loadState: 'loading', + }) + ); + }, + onLCP: (cb: (metric: MetricWithAttribution) => void) => { + cb( + createMetric('LCP', { + elementRenderDelay: 0.1, + resourceLoadDelay: 0.1, + resourceLoadDuration: 0.1, + timeToFirstByte: 0.1, + element: 'element', + }) + ); + }, + onTTFB: (cb: (metric: MetricWithAttribution) => void) => { + cb( + createMetric('TTFB', { + dnsDuration: 0.1, + connectionDuration: 0.1, + requestDuration: 0.1, + waitingDuration: 0.1, + cacheDuration: 0.1, + }) + ); + }, + onINP: (cb: (metric: MetricWithAttribution) => void) => { + cb( + createMetric('INP', { + eventTime: 0.1, + interactionTarget: 'target', + interactionType: 'pointer', + loadState: 'loading', + interactionTime: 0.1, + }) + ); + }, + }; +}); + +describe('WebVitalsWithAttributionInstrumentation', () => { + it('send cls metrics correctly', () => { + const pushMeasurement = jest.fn(); + new WebVitalsWithAttribution(pushMeasurement).initialize(); + + const values = { + cls: 0.1, + largest_shift_value: 0.1, + largest_shift_time: 0.1, + delta: 0.1, + }; + + const context = { + navigation_entry_id: 'unknown', + navigation_type: 'navigate', + id: 'id', + largest_shift_target: 'target', + load_state: 'loading', + rating: 'good', + }; + + expect(pushMeasurement).toHaveBeenCalledWith( + { + type: 'web-vitals', + values, + }, + { context } + ); + }); + + it('send fcp metrics correctly', () => { + const pushMeasurement = jest.fn(); + new WebVitalsWithAttribution(pushMeasurement).initialize(); + + const values = { + fcp: 0.1, + delta: 0.1, + first_byte_to_fcp: 0.1, + time_to_first_byte: 0.1, + }; + + const context = { + id: 'id', + navigation_entry_id: 'unknown', + navigation_type: 'navigate', + rating: 'good', + load_state: 'loading', + }; + + expect(pushMeasurement).toHaveBeenCalledWith( + { + type: 'web-vitals', + values, + }, + { context } + ); + }); + + it('send fid metrics correctly', () => { + const pushMeasurement = jest.fn(); + new WebVitalsWithAttribution(pushMeasurement).initialize(); + + const values = { + fid: 0.1, + delta: 0.1, + event_time: 0.1, + }; + + const context = { + id: 'id', + navigation_entry_id: 'unknown', + navigation_type: 'navigate', + rating: 'good', + event_target: 'target', + event_type: 'type', + load_state: 'loading', + }; + + expect(pushMeasurement).toHaveBeenCalledWith( + { + type: 'web-vitals', + values, + }, + { context } + ); + }); + + it('send inp metrics correctly', () => { + const pushMeasurement = jest.fn(); + new WebVitalsWithAttribution(pushMeasurement).initialize(); + + const values = { + inp: 0.1, + delta: 0.1, + interaction_time: 0.1, + }; + + const context = { + id: 'id', + navigation_entry_id: 'unknown', + navigation_type: 'navigate', + rating: 'good', + interaction_target: 'target', + interaction_type: 'pointer', + load_state: 'loading', + }; + + expect(pushMeasurement).toHaveBeenCalledWith( + { + type: 'web-vitals', + values, + }, + { context } + ); + }); + + it('send lcp metrics correctly', () => { + const pushMeasurement = jest.fn(); + new WebVitalsWithAttribution(pushMeasurement).initialize(); + + const values = { + lcp: 0.1, + delta: 0.1, + element_render_delay: 0.1, + resource_load_delay: 0.1, + resource_load_duration: 0.1, + time_to_first_byte: 0.1, + }; + + const context = { + id: 'id', + navigation_entry_id: 'unknown', + navigation_type: 'navigate', + rating: 'good', + element: 'element', + }; + + expect(pushMeasurement).toHaveBeenCalledWith( + { + type: 'web-vitals', + values, + }, + { context } + ); + }); + + it('send ttfb metrics correctly', () => { + const pushMeasurement = jest.fn(); + new WebVitalsWithAttribution(pushMeasurement).initialize(); + + const values = { + ttfb: 0.1, + delta: 0.1, + cache_duration: 0.1, + dns_duration: 0.1, + connection_duration: 0.1, + request_duration: 0.1, + waiting_duration: 0.1, + }; + + const context = { + rating: 'good', + id: 'id', + navigation_entry_id: 'unknown', + navigation_type: 'navigate', + }; + + expect(pushMeasurement).toHaveBeenCalledWith( + { + type: 'web-vitals', + values, + }, + { context } + ); + }); +}); diff --git a/packages/react-native-sdk/src/instrumentations/webVitals/webVitalsWithAttribution.ts b/packages/react-native-sdk/src/instrumentations/webVitals/webVitalsWithAttribution.ts new file mode 100644 index 000000000..8ab04f577 --- /dev/null +++ b/packages/react-native-sdk/src/instrumentations/webVitals/webVitalsWithAttribution.ts @@ -0,0 +1,170 @@ +import { onCLS, onFCP, onFID, onINP, onLCP, onTTFB } from 'web-vitals/attribution'; +import type { Metric } from 'web-vitals/attribution'; + +import { unknownString } from '@grafana/faro-core'; +import type { MeasurementEvent, MeasurementsAPI, PushMeasurementOptions } from '@grafana/faro-core'; + +import { getItem, webStorageType } from '../../utils'; +import { NAVIGATION_ID_STORAGE_KEY } from '../instrumentationConstants'; + +type Values = MeasurementEvent['values']; +type Context = Required['context']; + +// duplicate keys saved in variables to save bundle size +// refs: https://github.com/grafana/faro-web-sdk/pull/595#discussion_r1615833968 +const loadStateKey = 'load_state'; +const timeToFirstByteKey = 'time_to_first_byte'; + +export class WebVitalsWithAttribution { + constructor(private corePushMeasurement: MeasurementsAPI['pushMeasurement']) {} + + initialize(): void { + this.measureCLS(); + this.measureFCP(); + this.measureFID(); + this.measureINP(); + this.measureLCP(); + this.measureTTFB(); + } + + private measureCLS(): void { + onCLS((metric) => { + const { loadState, largestShiftValue, largestShiftTime, largestShiftTarget } = metric.attribution; + + const values = this.buildInitialValues(metric); + this.addIfPresent(values, 'largest_shift_value', largestShiftValue); + this.addIfPresent(values, 'largest_shift_time', largestShiftTime); + + const context = this.buildInitialContext(metric); + this.addIfPresent(context, loadStateKey, loadState); + this.addIfPresent(context, 'largest_shift_target', largestShiftTarget); + + this.pushMeasurement(values, context); + }); + } + + private measureFCP(): void { + onFCP((metric) => { + const { firstByteToFCP, timeToFirstByte, loadState } = metric.attribution; + + const values = this.buildInitialValues(metric); + this.addIfPresent(values, 'first_byte_to_fcp', firstByteToFCP); + this.addIfPresent(values, timeToFirstByteKey, timeToFirstByte); + + const context = this.buildInitialContext(metric); + this.addIfPresent(context, loadStateKey, loadState); + + this.pushMeasurement(values, context); + }); + } + + private measureFID(): void { + onFID((metric) => { + const { eventTime, eventTarget, eventType, loadState } = metric.attribution; + + const values = this.buildInitialValues(metric); + this.addIfPresent(values, 'event_time', eventTime); + + const context = this.buildInitialContext(metric); + this.addIfPresent(context, 'event_target', eventTarget); + this.addIfPresent(context, 'event_type', eventType); + this.addIfPresent(context, loadStateKey, loadState); + + this.pushMeasurement(values, context); + }); + } + + private measureINP(): void { + onINP((metric) => { + const { + interactionTime, + presentationDelay, + inputDelay, + processingDuration, + nextPaintTime, + loadState, + interactionTarget, + interactionType, + } = metric.attribution; + + const values = this.buildInitialValues(metric); + this.addIfPresent(values, 'interaction_time', interactionTime); + this.addIfPresent(values, 'presentation_delay', presentationDelay); + this.addIfPresent(values, 'input_delay', inputDelay); + this.addIfPresent(values, 'processing_duration', processingDuration); + this.addIfPresent(values, 'next_paint_time', nextPaintTime); + + const context = this.buildInitialContext(metric); + this.addIfPresent(context, loadStateKey, loadState); + this.addIfPresent(context, 'interaction_target', interactionTarget); + this.addIfPresent(context, 'interaction_type', interactionType); + + this.pushMeasurement(values, context); + }); + } + + private measureLCP(): void { + onLCP((metric) => { + const { elementRenderDelay, resourceLoadDelay, resourceLoadDuration, timeToFirstByte, element } = + metric.attribution; + + const values = this.buildInitialValues(metric); + this.addIfPresent(values, 'element_render_delay', elementRenderDelay); + this.addIfPresent(values, 'resource_load_delay', resourceLoadDelay); + this.addIfPresent(values, 'resource_load_duration', resourceLoadDuration); + this.addIfPresent(values, timeToFirstByteKey, timeToFirstByte); + + const context = this.buildInitialContext(metric); + this.addIfPresent(context, 'element', element); + + this.pushMeasurement(values, context); + }); + } + + private measureTTFB(): void { + onTTFB((metric) => { + const { dnsDuration, connectionDuration, requestDuration, waitingDuration, cacheDuration } = metric.attribution; + + const values = this.buildInitialValues(metric); + this.addIfPresent(values, 'dns_duration', dnsDuration); + this.addIfPresent(values, 'connection_duration', connectionDuration); + this.addIfPresent(values, 'request_duration', requestDuration); + this.addIfPresent(values, 'waiting_duration', waitingDuration); + this.addIfPresent(values, 'cache_duration', cacheDuration); + + const context = this.buildInitialContext(metric); + + this.pushMeasurement(values, context); + }); + } + + private buildInitialValues(metric: Metric): Values { + const indicator = metric.name.toLowerCase(); + return { + [indicator]: metric.value, + delta: metric.delta, + }; + } + + private buildInitialContext(metric: Metric): Context { + const navigationEntryId = getItem(NAVIGATION_ID_STORAGE_KEY, webStorageType.session) ?? unknownString; + + return { + id: metric.id, + rating: metric.rating, + navigation_type: metric.navigationType, + navigation_entry_id: navigationEntryId, + }; + } + + private pushMeasurement(values: Values, context: Context): void { + const type = 'web-vitals'; + this.corePushMeasurement({ type, values }, { context }); + } + + private addIfPresent(source: Values | Context, key: string, metric?: number | string): void { + if (metric) { + source[key] = metric; + } + } +} diff --git a/packages/react-native-sdk/src/metas/browser/index.ts b/packages/react-native-sdk/src/metas/browser/index.ts new file mode 100644 index 000000000..56acf7cbc --- /dev/null +++ b/packages/react-native-sdk/src/metas/browser/index.ts @@ -0,0 +1 @@ +export { browserMeta } from './meta'; diff --git a/packages/react-native-sdk/src/metas/browser/meta.ts b/packages/react-native-sdk/src/metas/browser/meta.ts new file mode 100644 index 000000000..da65f09ea --- /dev/null +++ b/packages/react-native-sdk/src/metas/browser/meta.ts @@ -0,0 +1,41 @@ +import { UAParser } from 'ua-parser-js'; + +import { unknownString } from '@grafana/faro-core'; +import type { Meta, MetaBrowser, MetaItem } from '@grafana/faro-core'; + +export const browserMeta: MetaItem> = () => { + const parser = new UAParser(); + const { name, version } = parser.getBrowser(); + const { name: osName, version: osVersion } = parser.getOS(); + const userAgent = parser.getUA(); + const language = navigator.language; + const mobile = navigator.userAgent.includes('Mobi'); + const brands = getBrands(); + + return { + browser: { + name: name ?? unknownString, + version: version ?? unknownString, + os: `${osName ?? unknownString} ${osVersion ?? unknownString}`, + userAgent: userAgent ?? unknownString, + language: language ?? unknownString, + mobile, + brands: brands ?? unknownString, + viewportWidth: `${window.innerWidth}`, + viewportHeight: `${window.innerHeight}`, + }, + }; + + function getBrands(): MetaBrowser['brands'] | undefined { + if (!name || !version) { + return undefined; + } + + if ('userAgentData' in navigator && navigator.userAgentData) { + // userAgentData in experimental (only Chrome supports it) thus TS does not ship the respective type declarations + return (navigator as any).userAgentData.brands; + } + + return undefined; + } +}; diff --git a/packages/react-native-sdk/src/metas/const.ts b/packages/react-native-sdk/src/metas/const.ts new file mode 100644 index 000000000..b0b72ebeb --- /dev/null +++ b/packages/react-native-sdk/src/metas/const.ts @@ -0,0 +1,6 @@ +import type { MetaItem } from '@grafana/faro-core'; + +import { browserMeta } from './browser'; +import { pageMeta } from './page'; + +export const defaultMetas: MetaItem[] = [browserMeta, pageMeta]; diff --git a/packages/react-native-sdk/src/metas/index.ts b/packages/react-native-sdk/src/metas/index.ts new file mode 100644 index 000000000..6777c92ad --- /dev/null +++ b/packages/react-native-sdk/src/metas/index.ts @@ -0,0 +1,9 @@ +export { browserMeta } from './browser'; + +export { defaultMetas } from './const'; + +export { pageMeta } from './page'; + +export { createSession } from './session'; + +export { sdkMeta } from './sdk'; diff --git a/packages/react-native-sdk/src/metas/k6/index.ts b/packages/react-native-sdk/src/metas/k6/index.ts new file mode 100644 index 000000000..b2670d2af --- /dev/null +++ b/packages/react-native-sdk/src/metas/k6/index.ts @@ -0,0 +1 @@ +export { k6Meta } from './meta'; diff --git a/packages/react-native-sdk/src/metas/k6/meta.ts b/packages/react-native-sdk/src/metas/k6/meta.ts new file mode 100644 index 000000000..6a8654433 --- /dev/null +++ b/packages/react-native-sdk/src/metas/k6/meta.ts @@ -0,0 +1,17 @@ +import type { Meta, MetaItem } from '@grafana/faro-core'; + +type K6Properties = { + testRunId?: string; +}; + +export const k6Meta: MetaItem> = () => { + const k6Properties: K6Properties = (window as any).k6; + + return { + k6: { + // we only add the k6 meta if Faro is running inside a k6 environment, so this is always true + isK6Browser: true, + ...(k6Properties?.testRunId && { testRunId: k6Properties?.testRunId }), + }, + }; +}; diff --git a/packages/react-native-sdk/src/metas/page/index.ts b/packages/react-native-sdk/src/metas/page/index.ts new file mode 100644 index 000000000..bcfe3bb5a --- /dev/null +++ b/packages/react-native-sdk/src/metas/page/index.ts @@ -0,0 +1 @@ +export { pageMeta } from './meta'; diff --git a/packages/react-native-sdk/src/metas/page/meta.ts b/packages/react-native-sdk/src/metas/page/meta.ts new file mode 100644 index 000000000..76f918f41 --- /dev/null +++ b/packages/react-native-sdk/src/metas/page/meta.ts @@ -0,0 +1,7 @@ +import type { Meta, MetaItem } from '@grafana/faro-core'; + +export const pageMeta: MetaItem> = () => ({ + page: { + url: location.href, + }, +}); diff --git a/packages/react-native-sdk/src/metas/sdk/index.ts b/packages/react-native-sdk/src/metas/sdk/index.ts new file mode 100644 index 000000000..403e71db4 --- /dev/null +++ b/packages/react-native-sdk/src/metas/sdk/index.ts @@ -0,0 +1 @@ +export { sdkMeta } from './meta'; diff --git a/packages/react-native-sdk/src/metas/sdk/meta.ts b/packages/react-native-sdk/src/metas/sdk/meta.ts new file mode 100644 index 000000000..1e5f0a9df --- /dev/null +++ b/packages/react-native-sdk/src/metas/sdk/meta.ts @@ -0,0 +1,10 @@ +import { faro, VERSION } from '@grafana/faro-core'; +import type { Meta, MetaItem } from '@grafana/faro-core'; + +export const sdkMeta: MetaItem> = () => ({ + sdk: { + name: '@grafana/faro-core', + version: VERSION, + integrations: faro.config.instrumentations.map(({ name, version }) => ({ name, version })), + }, +}); diff --git a/packages/react-native-sdk/src/metas/session/createSession.ts b/packages/react-native-sdk/src/metas/session/createSession.ts new file mode 100644 index 000000000..35ad12703 --- /dev/null +++ b/packages/react-native-sdk/src/metas/session/createSession.ts @@ -0,0 +1,9 @@ +import { faro, genShortID } from '@grafana/faro-core'; +import type { MetaSession } from '@grafana/faro-core'; + +export function createSession(attributes?: MetaSession['attributes']): MetaSession { + return { + id: faro.config?.sessionTracking?.generateSessionId?.() ?? genShortID(), + attributes, + }; +} diff --git a/packages/react-native-sdk/src/metas/session/index.ts b/packages/react-native-sdk/src/metas/session/index.ts new file mode 100644 index 000000000..f82da188f --- /dev/null +++ b/packages/react-native-sdk/src/metas/session/index.ts @@ -0,0 +1 @@ +export { createSession } from './createSession'; diff --git a/packages/react-native-sdk/src/transports/console/index.ts b/packages/react-native-sdk/src/transports/console/index.ts new file mode 100644 index 000000000..10cbbb94a --- /dev/null +++ b/packages/react-native-sdk/src/transports/console/index.ts @@ -0,0 +1,2 @@ +export { ConsoleTransport } from './transport'; +export type { ConsoleTransportOptions } from './types'; diff --git a/packages/react-native-sdk/src/transports/console/transport.ts b/packages/react-native-sdk/src/transports/console/transport.ts new file mode 100644 index 000000000..4c8b2b16f --- /dev/null +++ b/packages/react-native-sdk/src/transports/console/transport.ts @@ -0,0 +1,17 @@ +import { BaseTransport, getTransportBody, LogLevel, VERSION } from '@grafana/faro-core'; +import type { TransportItem } from '@grafana/faro-core'; + +import type { ConsoleTransportOptions } from './types'; + +export class ConsoleTransport extends BaseTransport { + readonly name = '@grafana/faro-web-sdk:transport-console'; + readonly version = VERSION; + + constructor(private options: ConsoleTransportOptions = {}) { + super(); + } + + send(item: TransportItem): void { + return this.unpatchedConsole[this.options.level ?? LogLevel.DEBUG]('New event', getTransportBody([item])); + } +} diff --git a/packages/react-native-sdk/src/transports/console/types.ts b/packages/react-native-sdk/src/transports/console/types.ts new file mode 100644 index 000000000..6019b1304 --- /dev/null +++ b/packages/react-native-sdk/src/transports/console/types.ts @@ -0,0 +1,5 @@ +import type { LogLevel } from '@grafana/faro-core'; + +export interface ConsoleTransportOptions { + level?: LogLevel; +} diff --git a/packages/react-native-sdk/src/transports/fetch/index.ts b/packages/react-native-sdk/src/transports/fetch/index.ts new file mode 100644 index 000000000..955147b68 --- /dev/null +++ b/packages/react-native-sdk/src/transports/fetch/index.ts @@ -0,0 +1,2 @@ +export { FetchTransport } from './transport'; +export type { ClockFn, FetchTransportOptions, FetchTransportRequestOptions } from './types'; diff --git a/packages/react-native-sdk/src/transports/fetch/transport.test.ts b/packages/react-native-sdk/src/transports/fetch/transport.test.ts new file mode 100644 index 000000000..4d7e45ae1 --- /dev/null +++ b/packages/react-native-sdk/src/transports/fetch/transport.test.ts @@ -0,0 +1,314 @@ +import { + getTransportBody, + initializeFaro, + LogEvent, + LogLevel, + TransportItem, + TransportItemType, +} from '@grafana/faro-core'; +import { mockConfig, mockInternalLogger } from '@grafana/faro-core/src/testUtils'; + +import * as sessionManagerUtilsMock from '../../instrumentations/session/sessionManager/sessionManagerUtils'; + +import { FetchTransport } from './transport'; + +const fetch = jest.fn(() => + Promise.resolve({ + status: 202, + text: () => Promise.resolve(), + }) +); + +(global as any).fetch = fetch; + +const mockSessionId = '123'; + +const item: TransportItem = { + type: TransportItemType.LOG, + payload: { + context: {}, + level: LogLevel.INFO, + message: 'hi', + timestamp: new Date().toISOString(), + }, + meta: { + session: { id: mockSessionId }, + }, +}; + +const largeItem: TransportItem = { + type: TransportItemType.LOG, + payload: { + context: {}, + level: LogLevel.INFO, + message: Buffer.alloc(60_000, 'I').toString('utf-8'), + timestamp: new Date().toISOString(), + }, + meta: { + session: { id: mockSessionId }, + }, +}; + +describe('FetchTransport', () => { + beforeEach(() => { + fetch.mockClear(); + jest.clearAllMocks(); + jest.clearAllTimers(); + }); + + afterAll(() => { + jest.useRealTimers(); + }); + + it('will send event over fetch', () => { + const transport = new FetchTransport({ + url: 'http://example.com/collect', + }); + + transport.metas.value = { session: { id: mockSessionId } }; + + transport.internalLogger = mockInternalLogger; + + transport.send([item]); + + expect(fetch).toHaveBeenCalledTimes(1); + expect(fetch).toHaveBeenCalledWith('http://example.com/collect', { + body: JSON.stringify(getTransportBody([item])), + headers: { + 'Content-Type': 'application/json', + 'x-faro-session-id': mockSessionId, + }, + keepalive: true, + method: 'POST', + }); + }); + + it('will not sending events if buffer size is exhausted', () => { + const transport = new FetchTransport({ + url: 'http://example.com/collect', + bufferSize: 3, + }); + + transport.metas.value = { session: { id: mockSessionId } }; + + transport.internalLogger = mockInternalLogger; + + for (let idx = 0; idx < 6; idx++) { + transport.send([item]); + } + + expect(fetch).toHaveBeenCalledTimes(3); + }); + + it('will back off on 429 for default interval if no retry-after header present', async () => { + let now = Date.now(); + + const transport = new FetchTransport({ + url: 'http://example.com/collect', + defaultRateLimitBackoffMs: 1000, + getNow: () => now, + }); + + transport.metas.value = { session: { id: mockSessionId } }; + + transport.internalLogger = mockInternalLogger; + + fetch.mockImplementationOnce(() => + Promise.resolve({ + status: 429, + headers: { + get: () => '', + }, + text: () => Promise.resolve(), + }) + ); + + await transport.send([item]); + expect(fetch).toHaveBeenCalledTimes(1); + + await transport.send([item]); + expect(fetch).toHaveBeenCalledTimes(1); + + now += 1001; + await transport.send([item]); + expect(fetch).toHaveBeenCalledTimes(2); + }); + + it('will back off on 429 for default interval if retry-after header present, with delay', async () => { + let now = Date.now(); + + const transport = new FetchTransport({ + url: 'http://example.com/collect', + defaultRateLimitBackoffMs: 1000, + getNow: () => now, + }); + + transport.metas.value = { session: { id: mockSessionId } }; + + transport.internalLogger = mockInternalLogger; + + fetch.mockImplementationOnce(() => + Promise.resolve({ + status: 429, + headers: { + get: () => '2', + }, + text: () => Promise.resolve(), + }) + ); + + await transport.send([item]); + expect(fetch).toHaveBeenCalledTimes(1); + + now += 1001; + await transport.send([item]); + expect(fetch).toHaveBeenCalledTimes(1); + + now += 1001; + await transport.send([item]); + expect(fetch).toHaveBeenCalledTimes(2); + }); + + it('will back off on 429 for default interval if retry-after header present, with date', async () => { + let now = Date.now(); + + const transport = new FetchTransport({ + url: 'http://example.com/collect', + defaultRateLimitBackoffMs: 1000, + getNow: () => now, + }); + + transport.metas.value = { session: { id: mockSessionId } }; + + transport.internalLogger = mockInternalLogger; + + fetch.mockImplementationOnce(() => + Promise.resolve({ + status: 429, + headers: { + get: () => new Date(now + 3000).toISOString(), + }, + text: () => Promise.resolve(), + }) + ); + + await transport.send([item]); + expect(fetch).toHaveBeenCalledTimes(1); + + now += 1001; + await transport.send([item]); + expect(fetch).toHaveBeenCalledTimes(1); + + now += 2001; + await transport.send([item]); + expect(fetch).toHaveBeenCalledTimes(2); + }); + + it('will turn off keepalive if the payload length is over 60_000', async () => { + const transport = new FetchTransport({ + url: 'http://example.com/collect', + }); + + transport.metas.value = { session: { id: mockSessionId } }; + + transport.internalLogger = mockInternalLogger; + + transport.send([largeItem]); + + expect(fetch).toHaveBeenCalledTimes(1); + expect(fetch).toHaveBeenCalledWith('http://example.com/collect', { + body: JSON.stringify(getTransportBody([largeItem])), + headers: { + 'Content-Type': 'application/json', + 'x-faro-session-id': mockSessionId, + }, + keepalive: false, + method: 'POST', + }); + }); + + it('will add global ignoredURLs to the ignoredUrls list ', async () => { + const collectorUrl = 'http://example.com/collect'; + + const transport = new FetchTransport({ + url: collectorUrl, + }); + + const globalIgnoreUrls = [/.*foo-analytics/, 'http://example-analytics.com']; + + const config = mockConfig({ + transports: [transport], + ignoreUrls: globalIgnoreUrls, + }); + + const faro = initializeFaro(config); + + transport.internalLogger = mockInternalLogger; + + const ignoreUrls = faro.transports.transports.flatMap((transport) => transport.getIgnoreUrls()); + expect(ignoreUrls).toStrictEqual([collectorUrl, ...globalIgnoreUrls]); + }); + + it('creates a new faro session if collector response indicates an invalid session', async () => { + fetch.mockImplementationOnce(() => + Promise.resolve({ + status: 202, + headers: { + get: (name: string) => ({ 'X-Faro-Session-Status': 'invalid' })[name], + }, + + text: () => Promise.resolve(), + }) + ); + + const mockGetUserSessionUpdater = jest.fn(); + jest.spyOn(sessionManagerUtilsMock, 'getUserSessionUpdater').mockImplementationOnce(mockGetUserSessionUpdater); + + const transport = new FetchTransport({ + url: 'http://example.com/collect', + }); + + transport.metas.value = { session: { id: mockSessionId } }; + transport.internalLogger = mockInternalLogger; + + const config = mockConfig({ + transports: [transport], + sessionTracking: { + enabled: true, + persistent: false, + }, + }); + + initializeFaro(config); + + await transport.send([item]); + + expect(mockGetUserSessionUpdater).toHaveBeenCalledTimes(1); + }); + + it('does not create a new faro session for standard collector responses', async () => { + const mockGetUserSessionUpdater = jest.fn(); + jest.spyOn(sessionManagerUtilsMock, 'getUserSessionUpdater').mockImplementationOnce(mockGetUserSessionUpdater); + + const transport = new FetchTransport({ + url: 'http://example.com/collect', + }); + + transport.metas.value = { session: { id: mockSessionId } }; + transport.internalLogger = mockInternalLogger; + + const config = mockConfig({ + transports: [transport], + sessionTracking: { + enabled: true, + persistent: false, + }, + }); + + initializeFaro(config); + + await transport.send([item]); + + expect(mockGetUserSessionUpdater).not.toHaveBeenCalled(); + }); +}); diff --git a/packages/react-native-sdk/src/transports/fetch/transport.ts b/packages/react-native-sdk/src/transports/fetch/transport.ts new file mode 100644 index 000000000..716a43c8f --- /dev/null +++ b/packages/react-native-sdk/src/transports/fetch/transport.ts @@ -0,0 +1,151 @@ +import { + BaseExtension, + BaseTransport, + createPromiseBuffer, + getTransportBody, + noop, + PromiseBuffer, + VERSION, +} from '@grafana/faro-core'; +import type { Config, Patterns, TransportItem } from '@grafana/faro-core'; + +import { getSessionManagerByConfig } from '../../instrumentations/session/sessionManager'; +import { getUserSessionUpdater } from '../../instrumentations/session/sessionManager/sessionManagerUtils'; + +import type { FetchTransportOptions } from './types'; + +const DEFAULT_BUFFER_SIZE = 30; +const DEFAULT_CONCURRENCY = 5; // chrome supports 10 total, firefox 17 +const DEFAULT_RATE_LIMIT_BACKOFF_MS = 5000; + +const BEACON_BODY_SIZE_LIMIT = 60000; +const TOO_MANY_REQUESTS = 429; +const ACCEPTED = 202; + +export class FetchTransport extends BaseTransport { + readonly name = '@grafana/faro-web-sdk:transport-fetch'; + readonly version = VERSION; + + promiseBuffer: PromiseBuffer; + + private readonly rateLimitBackoffMs: number; + private readonly getNow: () => number; + private disabledUntil: Date = new Date(); + + constructor(private options: FetchTransportOptions) { + super(); + + this.rateLimitBackoffMs = options.defaultRateLimitBackoffMs ?? DEFAULT_RATE_LIMIT_BACKOFF_MS; + this.getNow = options.getNow ?? (() => Date.now()); + + this.promiseBuffer = createPromiseBuffer({ + size: options.bufferSize ?? DEFAULT_BUFFER_SIZE, + concurrency: options.concurrency ?? DEFAULT_CONCURRENCY, + }); + } + + async send(items: TransportItem[]): Promise { + try { + if (this.disabledUntil > new Date(this.getNow())) { + this.logWarn(`Dropping transport item due to too many requests. Backoff until ${this.disabledUntil}`); + + return Promise.resolve(); + } + + await this.promiseBuffer.add(() => { + const body = JSON.stringify(getTransportBody(items)); + + const { url, requestOptions, apiKey } = this.options; + + const { headers, ...restOfRequestOptions } = requestOptions ?? {}; + + let sessionId; + const sessionMeta = this.metas.value.session; + if (sessionMeta != null) { + sessionId = sessionMeta.id; + } + + return fetch(url, { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + ...(headers ?? {}), + ...(apiKey ? { 'x-api-key': apiKey } : {}), + ...(sessionId ? { 'x-faro-session-id': sessionId } : {}), + }, + body, + keepalive: body.length <= BEACON_BODY_SIZE_LIMIT, + ...(restOfRequestOptions ?? {}), + }) + .then(async (response) => { + if (response.status === ACCEPTED) { + const sessionExpired = response.headers.get('X-Faro-Session-Status') === 'invalid'; + + if (sessionExpired) { + this.extendFaroSession(this.config, this.logDebug); + } + } + + if (response.status === TOO_MANY_REQUESTS) { + this.disabledUntil = this.getRetryAfterDate(response); + this.logWarn(`Too many requests, backing off until ${this.disabledUntil}`); + } + + // read the body so the connection can be closed + response.text().catch(noop); + return response; + }) + .catch((err) => { + this.logError('Failed sending payload to the receiver\n', JSON.parse(body), err); + }); + }); + } catch (err) { + this.logError(err); + } + } + + override getIgnoreUrls(): Patterns { + return ([this.options.url] as Patterns).concat(this.config.ignoreUrls ?? []); + } + + override isBatched(): boolean { + return true; + } + + private getRetryAfterDate(response: Response): Date { + const now = this.getNow(); + const retryAfterHeader = response.headers.get('Retry-After'); + + if (retryAfterHeader) { + const delay = Number(retryAfterHeader); + + if (!isNaN(delay)) { + return new Date(delay * 1000 + now); + } + + const date = Date.parse(retryAfterHeader); + + if (!isNaN(date)) { + return new Date(date); + } + } + + return new Date(now + this.rateLimitBackoffMs); + } + + private extendFaroSession(config: Config, logDebug: BaseExtension['logDebug']) { + const SessionExpiredString = `Session expired`; + + const sessionTrackingConfig = config.sessionTracking; + + if (sessionTrackingConfig?.enabled) { + const { fetchUserSession, storeUserSession } = getSessionManagerByConfig(sessionTrackingConfig); + + getUserSessionUpdater({ fetchUserSession, storeUserSession })({ forceSessionExtend: true }); + + logDebug(`${SessionExpiredString} created new session.`); + } else { + logDebug(`${SessionExpiredString}.`); + } + } +} diff --git a/packages/react-native-sdk/src/transports/fetch/types.ts b/packages/react-native-sdk/src/transports/fetch/types.ts new file mode 100644 index 000000000..a637077d2 --- /dev/null +++ b/packages/react-native-sdk/src/transports/fetch/types.ts @@ -0,0 +1,25 @@ +export interface FetchTransportRequestOptions extends Omit { + headers?: Record; +} + +export interface FetchTransportOptions { + // url of the collector endpoint + url: string; + + // will be added as `x-api-key` header + apiKey?: string; + // how many requests to buffer in total + bufferSize?: number; + // how many requests to execute concurrently + concurrency?: number; + // if rate limit response does not include a Retry-After header, + // how many milliseconds to back off before attempting a request. + // intermediate events will be dropped, not buffered + defaultRateLimitBackoffMs?: number; + // get current date. for mocking purposes in tests + getNow?: ClockFn; + // addition options for global.Fetch + requestOptions?: FetchTransportRequestOptions; +} + +export type ClockFn = () => number; diff --git a/packages/react-native-sdk/src/transports/index.ts b/packages/react-native-sdk/src/transports/index.ts new file mode 100644 index 000000000..2cc0ff7d4 --- /dev/null +++ b/packages/react-native-sdk/src/transports/index.ts @@ -0,0 +1,5 @@ +export { ConsoleTransport } from './console'; +export type { ConsoleTransportOptions } from './console'; + +export { FetchTransport } from './fetch'; +export type { ClockFn, FetchTransportOptions, FetchTransportRequestOptions } from './fetch'; diff --git a/packages/react-native-sdk/src/utils/index.ts b/packages/react-native-sdk/src/utils/index.ts new file mode 100644 index 000000000..1a6f89fd2 --- /dev/null +++ b/packages/react-native-sdk/src/utils/index.ts @@ -0,0 +1,15 @@ +export { + isLocalStorageAvailable, + isSessionStorageAvailable, + webStorageType, + getItem, + isWebStorageAvailable, + removeItem, + setItem, +} from './webStorage'; + +export { throttle } from './throttle'; + +export { getCircularDependencyReplacer, stringifyExternalJson } from './json'; + +export { getIgnoreUrls } from './url'; diff --git a/packages/react-native-sdk/src/utils/json.test.ts b/packages/react-native-sdk/src/utils/json.test.ts new file mode 100644 index 000000000..5af6e204e --- /dev/null +++ b/packages/react-native-sdk/src/utils/json.test.ts @@ -0,0 +1,19 @@ +import { getCircularDependencyReplacer, stringifyExternalJson } from './json'; + +describe('json', () => { + it('replace circular references with null value', () => { + const replacer = getCircularDependencyReplacer(); + + const obj = { a: 1 }; + (obj as any).circular = obj; + + expect(JSON.stringify(obj, replacer)).toBe('{"a":1,"circular":null}'); + }); + + it('stringifyExternalJson function replaces circular references with null value', () => { + const obj = { a: 1 }; + (obj as any).circular = obj; + + expect(stringifyExternalJson(obj)).toBe('{"a":1,"circular":null}'); + }); +}); diff --git a/packages/react-native-sdk/src/utils/json.ts b/packages/react-native-sdk/src/utils/json.ts new file mode 100644 index 000000000..dbeb5cae4 --- /dev/null +++ b/packages/react-native-sdk/src/utils/json.ts @@ -0,0 +1,22 @@ +export function getCircularDependencyReplacer() { + const valueSeen = new WeakSet(); + return function (_key: string | Symbol, value: unknown) { + if (typeof value === 'object' && value !== null) { + if (valueSeen.has(value)) { + return null; + } + valueSeen.add(value); + } + return value; + }; +} + +type JSONObject = { + [key: string]: JSONValue; +}; +type JSONArray = JSONValue[] & {}; +type JSONValue = string | number | boolean | null | JSONObject | JSONArray; + +export function stringifyExternalJson(json: any = {}) { + return JSON.stringify(json ?? {}, getCircularDependencyReplacer()); +} diff --git a/packages/react-native-sdk/src/utils/throttle.test.ts b/packages/react-native-sdk/src/utils/throttle.test.ts new file mode 100644 index 000000000..deaa3dbe7 --- /dev/null +++ b/packages/react-native-sdk/src/utils/throttle.test.ts @@ -0,0 +1,64 @@ +import { throttle } from './throttle'; + +describe('throttle', () => { + beforeAll(() => { + jest.useFakeTimers(); + }); + + beforeEach(() => { + jest.clearAllMocks(); + }); + + afterAll(() => { + jest.useRealTimers(); + jest.restoreAllMocks(); + }); + + it('Executes callback immediately for first call and executes the next callback only if delay is reached.', () => { + const mockCallback = jest.fn(); + + const doThrottle = throttle(mockCallback, 500); + + doThrottle(); + expect(mockCallback).toHaveBeenCalledTimes(1); + + jest.advanceTimersByTime(100); + doThrottle(); + expect(mockCallback).toHaveBeenCalledTimes(1); + + jest.advanceTimersByTime(500); + doThrottle(); + expect(mockCallback).toHaveBeenCalledTimes(2); + }); + + it('Applies the args of the last call to callback.', () => { + const mockCallback = jest.fn(); + + const doThrottle = throttle(mockCallback, 500); + + doThrottle('A'); + jest.advanceTimersByTime(200); + expect(mockCallback).toHaveBeenCalledTimes(1); + expect(mockCallback).toHaveBeenCalledWith('A'); + + doThrottle('B'); + jest.advanceTimersByTime(200); + expect(mockCallback).toHaveBeenCalledTimes(1); + expect(mockCallback).toHaveBeenCalledWith('A'); + + doThrottle('C'); + jest.advanceTimersByTime(100); + expect(mockCallback).toHaveBeenCalledTimes(2); + expect(mockCallback).toHaveBeenCalledWith('A'); + + doThrottle('D'); + jest.advanceTimersByTime(100); + expect(mockCallback).toHaveBeenCalledTimes(2); + expect(mockCallback).toHaveBeenLastCalledWith('C'); + + doThrottle('END'); + jest.advanceTimersByTime(400); + expect(mockCallback).toHaveBeenCalledTimes(3); + expect(mockCallback).toHaveBeenLastCalledWith('END'); + }); +}); diff --git a/packages/react-native-sdk/src/utils/throttle.ts b/packages/react-native-sdk/src/utils/throttle.ts new file mode 100644 index 000000000..31a1d0a98 --- /dev/null +++ b/packages/react-native-sdk/src/utils/throttle.ts @@ -0,0 +1,29 @@ +/** + * Tail based throttle which caches the args of the last call and updates + */ +export function throttle void>(callback: T, delay: number) { + let pause = false; + let lastPending: Parameters | null; + + const timeoutBehavior = () => { + if (lastPending == null) { + pause = false; + return; + } + + callback(...lastPending); + lastPending = null; + setTimeout(timeoutBehavior, delay); + }; + + return (...args: Parameters) => { + if (pause) { + lastPending = args; + return; + } + + callback(...args); + pause = true; + setTimeout(timeoutBehavior, delay); + }; +} diff --git a/packages/react-native-sdk/src/utils/url.ts b/packages/react-native-sdk/src/utils/url.ts new file mode 100644 index 000000000..40e8bf008 --- /dev/null +++ b/packages/react-native-sdk/src/utils/url.ts @@ -0,0 +1,9 @@ +import { faro } from '@grafana/faro-core'; +import type { Transport } from '@grafana/faro-core'; + +/** + * Get all configured ignore URLs. + */ +export function getIgnoreUrls() { + return faro.transports.transports.flatMap((transport: Transport) => transport.getIgnoreUrls()); +} diff --git a/packages/react-native-sdk/src/utils/urls.test.ts b/packages/react-native-sdk/src/utils/urls.test.ts new file mode 100644 index 000000000..be026870c --- /dev/null +++ b/packages/react-native-sdk/src/utils/urls.test.ts @@ -0,0 +1,45 @@ +import { BaseTransport, initializeFaro, VERSION } from '@grafana/faro-core'; +import type { Patterns, TransportItem } from '@grafana/faro-core'; +import { mockConfig } from '@grafana/faro-core/src/testUtils'; + +import { getIgnoreUrls } from './url'; + +class MockTransport extends BaseTransport { + readonly name = '@grafana/transport-mock'; + readonly version = VERSION; + + items: TransportItem[] = []; + + constructor(private ignoreURLs: Patterns = []) { + super(); + } + + send(items: TransportItem[]): void | Promise { + this.items.push(...items); + } + + override isBatched(): boolean { + return true; + } + + override getIgnoreUrls(): Patterns { + return (this.ignoreURLs ?? ([] as Patterns[])).concat(this.config.ignoreUrls ?? []); + } +} + +describe('Urls', () => { + it('should return the correct ignore urls for the given configuration', () => { + const transport = new MockTransport(['http://foo.com']); + + initializeFaro( + mockConfig({ + transports: [transport], + ignoreUrls: ['http://example.com', 'http://example2.com/test'], + }) + ); + + const urls = getIgnoreUrls(); + + expect(urls).toEqual(['http://foo.com', 'http://example.com', 'http://example2.com/test']); + }); +}); diff --git a/packages/react-native-sdk/src/utils/webStorage.test.ts b/packages/react-native-sdk/src/utils/webStorage.test.ts new file mode 100644 index 000000000..c1996c529 --- /dev/null +++ b/packages/react-native-sdk/src/utils/webStorage.test.ts @@ -0,0 +1,35 @@ +import { isWebStorageAvailable } from './webStorage'; + +let windowSpy: jest.SpyInstance; + +// TODO: adapt tests +describe('webStorage', () => { + beforeEach(() => { + windowSpy = jest.spyOn(globalThis, 'window', 'get'); + }); + + afterEach(() => { + windowSpy.mockRestore(); + }); + + it('Returns true if local storage is available.', () => { + const localStorageAvailable = isWebStorageAvailable('localStorage'); + expect(localStorageAvailable).toBe(true); + }); + + it('Returns false if local storage is not available.', () => { + disableLocalStorage(); + const localStorageAvailable = isWebStorageAvailable('localStorage'); + expect(localStorageAvailable).toBe(false); + }); +}); + +function disableLocalStorage() { + windowSpy.mockImplementation(() => ({ + localStorage: { + setItem() { + throw new Error(); + }, + }, + })); +} diff --git a/packages/react-native-sdk/src/utils/webStorage.ts b/packages/react-native-sdk/src/utils/webStorage.ts new file mode 100644 index 000000000..948549b10 --- /dev/null +++ b/packages/react-native-sdk/src/utils/webStorage.ts @@ -0,0 +1,86 @@ +import { faro } from '@grafana/faro-core'; + +export const webStorageType = { + session: 'sessionStorage', + local: 'localStorage', +} as const; + +type StorageMechanism = (typeof webStorageType)[keyof typeof webStorageType]; + +// TODO: remove default storage type from all function + +/** + * Check if selected web storage mechanism is available. + * @param type storage mechanism to test availability for. + * @returns + */ +export function isWebStorageAvailable(type: StorageMechanism): boolean { + try { + let storage; + storage = window[type]; + + const testItem = '__faro_storage_test__'; + storage.setItem(testItem, testItem); + storage.removeItem(testItem); + return true; + } catch (error) { + // the above can throw + faro.internalLogger?.info(`Web storage of type ${type} is not available. Reason: ${error}`); + return false; + } +} + +/** + * Get item from SessionStorage or LocalStorage. + * @param key: the item key. + * @param webStorageMechanism: wether the item shall be received form local storage or session storage. Defaults to local storage. + */ +export function getItem(key: string, webStorageMechanism: StorageMechanism): string | null { + if (isWebStorageTypeAvailable(webStorageMechanism)) { + return window[webStorageMechanism].getItem(key); + } + + return null; +} + +/** + * Store item in SessionStorage or LocalStorage. + * @param key: the item key. + * @param value: the item data. + * @param webStorageMechanism: wether the item shall be received form local storage or session storage. Defaults to local storage. + */ +export function setItem(key: string, value: string, webStorageMechanism: StorageMechanism): void { + if (isWebStorageTypeAvailable(webStorageMechanism)) { + try { + window[webStorageMechanism].setItem(key, value); + } catch (error) { + // do nothing + } + } +} + +/** + * Remove item from SessionStorage or LocalStorage. + * @param key: the item key. + * @param webStorageMechanism: wether the item shall be received form local storage or session storage. Defaults to local storage. + */ +export function removeItem(key: string, webStorageMechanism: StorageMechanism): void { + if (isWebStorageTypeAvailable(webStorageMechanism)) { + window[webStorageMechanism].removeItem(key); + } +} + +export const isLocalStorageAvailable = isWebStorageAvailable(webStorageType.local); +export const isSessionStorageAvailable = isWebStorageAvailable(webStorageType.session); + +function isWebStorageTypeAvailable(webStorageMechanism: StorageMechanism) { + if (webStorageMechanism === webStorageType.local) { + return isLocalStorageAvailable; + } + + if (webStorageMechanism === webStorageType.session) { + return isSessionStorageAvailable; + } + + return false; +} diff --git a/packages/react-native-sdk/tsconfig.cjs.json b/packages/react-native-sdk/tsconfig.cjs.json new file mode 100644 index 000000000..4ac1c938e --- /dev/null +++ b/packages/react-native-sdk/tsconfig.cjs.json @@ -0,0 +1,12 @@ +{ + "extends": "../../tsconfig.base.cjs.json", + "compilerOptions": { + "declarationDir": "./dist/types", + "outDir": "./dist/cjs", + "rootDir": "./src", + "tsBuildInfoFile": "../../.cache/tsc/webSdk.cjs.tsbuildinfo" + }, + "include": ["./src"], + "exclude": ["**/*.test.ts"], + "references": [{ "path": "../core/tsconfig.cjs.json" }] +} diff --git a/packages/react-native-sdk/tsconfig.esm.json b/packages/react-native-sdk/tsconfig.esm.json new file mode 100644 index 000000000..82bb08940 --- /dev/null +++ b/packages/react-native-sdk/tsconfig.esm.json @@ -0,0 +1,12 @@ +{ + "extends": "../../tsconfig.base.esm.json", + "compilerOptions": { + "declarationDir": "./dist/types", + "outDir": "./dist/esm", + "rootDir": "./src", + "tsBuildInfoFile": "../../.cache/tsc/webSdk.esm.tsbuildinfo" + }, + "include": ["./src"], + "exclude": ["**/*.test.ts"], + "references": [{ "path": "../core/tsconfig.esm.json" }] +} diff --git a/packages/react-native-sdk/tsconfig.json b/packages/react-native-sdk/tsconfig.json new file mode 100644 index 000000000..db2455a0e --- /dev/null +++ b/packages/react-native-sdk/tsconfig.json @@ -0,0 +1,7 @@ +{ + "references": [ + { "path": "./tsconfig.cjs.json" }, + { "path": "./tsconfig.esm.json" }, + { "path": "./tsconfig.spec.json" } + ] +} diff --git a/packages/react-native-sdk/tsconfig.spec.json b/packages/react-native-sdk/tsconfig.spec.json new file mode 100644 index 000000000..d8e88091c --- /dev/null +++ b/packages/react-native-sdk/tsconfig.spec.json @@ -0,0 +1,11 @@ +{ + "extends": "../../tsconfig.base.spec.json", + "compilerOptions": { + "declarationDir": "./dist/types", + "outDir": "./dist/spec", + "rootDir": "..", + "tsBuildInfoFile": "../../.cache/tsc/webSdk.spec.tsbuildinfo" + }, + "include": ["./src"], + "references": [{ "path": "../core/tsconfig.spec.json" }] +} diff --git a/packages/react-native-tracing/.browserslistrc b/packages/react-native-tracing/.browserslistrc new file mode 100644 index 000000000..8528fd685 --- /dev/null +++ b/packages/react-native-tracing/.browserslistrc @@ -0,0 +1 @@ +supports es6-module \ No newline at end of file diff --git a/packages/react-native-tracing/README.md b/packages/react-native-tracing/README.md new file mode 100644 index 000000000..4404d2544 --- /dev/null +++ b/packages/react-native-tracing/README.md @@ -0,0 +1,10 @@ +# @grafana/faro-web-tracing + +This package provides tools for integrating [OpenTelemetry][opentelemetry-js] based tracing with the +[Faro for the web][faro-web-sdk-package]. + +See [quick start document][quick-start] for instructions how to set up and use. + +[faro-web-sdk-package]: https://github.com/grafana/faro-web-sdk/tree/main/packages/web-sdk +[opentelemetry-js]: https://opentelemetry.io/docs/instrumentation/js/ +[quick-start]: https://github.com/grafana/faro-web-sdk/blob/main/docs/sources/tutorials/quick-start-browser.md diff --git a/packages/react-native-tracing/jest.config.js b/packages/react-native-tracing/jest.config.js new file mode 100644 index 000000000..1396c53ae --- /dev/null +++ b/packages/react-native-tracing/jest.config.js @@ -0,0 +1,7 @@ +const { jestBaseConfig } = require('../../jest.config.base.js'); + +module.exports = { + ...jestBaseConfig, + roots: ['packages/web-tracing/src'], + testEnvironment: 'jsdom', +}; diff --git a/packages/react-native-tracing/package.json b/packages/react-native-tracing/package.json new file mode 100644 index 000000000..3c44d14fe --- /dev/null +++ b/packages/react-native-tracing/package.json @@ -0,0 +1,71 @@ +{ + "name": "@grafana/react-native-tracing", + "version": "1.12.2", + "description": "Faro react-native tracing implementation.", + "keywords": [ + "observability", + "apm", + "rum", + "logs", + "traces", + "metrics", + "browser", + "opentelemetry" + ], + "license": "Apache-2.0", + "author": "Grafana Labs", + "homepage": "https://github.com/grafana/faro-web-sdk", + "sideEffects": false, + "repository": { + "type": "git", + "url": "https://github.com/grafana/faro-web-sdk.git", + "directory": "packages/web-tracing" + }, + "main": "./dist/cjs/index.js", + "module": "./dist/esm/index.js", + "types": "./dist/types/index.d.ts", + "files": [ + ".browserslistrc", + "dist", + "README.md", + "LICENSE" + ], + "scripts": { + "start": "yarn watch", + "build": "run-s build:*", + "build:compile": "run-p build:compile:*", + "build:compile:cjs": "tsc --build tsconfig.cjs.json", + "build:compile:esm": "tsc --build tsconfig.esm.json", + "build:compile:bundle": "run-s build:compile:bundle:*", + "build:compile:bundle:create": "rollup -c ./rollup.config.js", + "build:compile:bundle:remove-extras": "rimraf dist/bundle/dist", + "watch": "run-s watch:compile", + "watch:compile": "yarn build:compile:cjs -w", + "clean": "rimraf dist/ yarn-error.log", + "quality": "run-s quality:*", + "quality:test": "jest", + "quality:format": "prettier --cache --cache-location=../../.cache/prettier/webTracing --ignore-path ../../.prettierignore -w \"./**/*.{js,jsx,ts,tsx,css,scss,md,yaml,yml,json}\"", + "quality:lint": "run-s quality:lint:*", + "quality:lint:eslint": "eslint --cache --cache-location ../../.cache/eslint/webTracing --ignore-path ../../.eslintignore \"./**/*.{js,jsx,ts,tsx}\"", + "quality:lint:prettier": "prettier --cache --cache-location=../../.cache/prettier/webTracing --ignore-path ../../.prettierignore -c \"./**/*.{js,jsx,ts,tsx,css,scss,md,yaml,yml,json}\"", + "quality:lint:md": "markdownlint README.md", + "quality:circular-deps": "madge --circular ." + }, + "dependencies": { + "@grafana/faro-web-sdk": "^1.12.2", + "@opentelemetry/api": "^1.9.0", + "@opentelemetry/context-zone": "1.26.0", + "@opentelemetry/core": "^1.26.0", + "@opentelemetry/exporter-trace-otlp-http": "^0.53.0", + "@opentelemetry/instrumentation": "^0.53.0", + "@opentelemetry/instrumentation-fetch": "^0.53.0", + "@opentelemetry/instrumentation-xml-http-request": "^0.53.0", + "@opentelemetry/otlp-transformer": "^0.53.0", + "@opentelemetry/resources": "^1.26.0", + "@opentelemetry/sdk-trace-web": "^1.26.0", + "@opentelemetry/semantic-conventions": "^1.27.0" + }, + "publishConfig": { + "access": "public" + } +} diff --git a/packages/react-native-tracing/rollup.config.js b/packages/react-native-tracing/rollup.config.js new file mode 100644 index 000000000..4d7434614 --- /dev/null +++ b/packages/react-native-tracing/rollup.config.js @@ -0,0 +1,3 @@ +const { getRollupConfigBase } = require('../../rollup.config.base.js'); + +module.exports = getRollupConfigBase('webTracing'); diff --git a/packages/react-native-tracing/src/faroTraceExporter.ts b/packages/react-native-tracing/src/faroTraceExporter.ts new file mode 100644 index 000000000..d54513e7f --- /dev/null +++ b/packages/react-native-tracing/src/faroTraceExporter.ts @@ -0,0 +1,24 @@ +import { ExportResultCode } from '@opentelemetry/core'; +import type { ExportResult } from '@opentelemetry/core'; +import { createExportTraceServiceRequest } from '@opentelemetry/otlp-transformer'; +import type { ReadableSpan, SpanExporter } from '@opentelemetry/sdk-trace-web'; + +import { sendFaroEvents } from './faroTraceExporter.utils'; +import type { FaroTraceExporterConfig } from './types'; + +export class FaroTraceExporter implements SpanExporter { + constructor(private config: FaroTraceExporterConfig) {} + + export(spans: ReadableSpan[], resultCallback: (result: ExportResult) => void): void { + const traceEvent = createExportTraceServiceRequest(spans, { useHex: true, useLongBits: false }); + + this.config.api.pushTraces(traceEvent); + sendFaroEvents(traceEvent.resourceSpans); + + resultCallback({ code: ExportResultCode.SUCCESS }); + } + + shutdown(): Promise { + return Promise.resolve(undefined); + } +} diff --git a/packages/react-native-tracing/src/faroTraceExporter.utils.test.ts b/packages/react-native-tracing/src/faroTraceExporter.utils.test.ts new file mode 100644 index 000000000..cf11cae08 --- /dev/null +++ b/packages/react-native-tracing/src/faroTraceExporter.utils.test.ts @@ -0,0 +1,336 @@ +import { initializeFaro } from '@grafana/faro-core'; +import { mockConfig } from '@grafana/faro-core/src/testUtils'; + +import { sendFaroEvents } from './faroTraceExporter.utils'; + +describe('faroTraceExporter.utils', () => { + afterEach(() => { + jest.clearAllMocks(); + }); + + it('Emits no faro events if no client spans are contained ', () => { + const faro = initializeFaro(mockConfig()); + + const mockPushEvent = jest.fn(); + jest.spyOn(faro.api, 'pushEvent').mockImplementationOnce(mockPushEvent); + + // remove scopeSpan which contains client span + const data = { + ...testData[0], + scopeSpans: testData[0]?.scopeSpans.map((s) => ({ ...s })), + }; + + data.scopeSpans!.pop(); + + sendFaroEvents([data as any]); + + expect(mockPushEvent).toBeCalledTimes(0); + }); + + it('Creates a Faro event for client spans only', () => { + const faro = initializeFaro(mockConfig()); + + const mockPushEvent = jest.fn(); + jest.spyOn(faro.api, 'pushEvent').mockImplementationOnce(mockPushEvent); + + sendFaroEvents(testData); + + expect(mockPushEvent).toBeCalledTimes(1); + expect(mockPushEvent.mock.lastCall[0]).toBe('faro.tracing.fetch'); + expect(mockPushEvent.mock.lastCall[1]).toStrictEqual({ + component: 'fetch', + session_id: 'my-session-id', + 'http.host': 'my-host', + 'http.method': 'GET', + 'http.response_content_length': '127', + 'http.scheme': 'http', + 'http.status_code': '401', + 'http.status_text': 'Unauthorized', + 'http.url': 'http://foo/bar', + 'http.user_agent': 'my-user-agent', + }); + }); + + it('Uses whole instrumentation name if no "-" is part of the name', () => { + const faro = initializeFaro(mockConfig()); + + const mockPushEvent = jest.fn(); + jest.spyOn(faro.api, 'pushEvent').mockImplementationOnce(mockPushEvent); + + // add scope name without "-" + const data = { + ...testData[0], + scopeSpans: testData[0]?.scopeSpans.map((s) => ({ ...s })), + }; + data.scopeSpans!.at(-1)!.scope.name = '@foo/coolName'; + + sendFaroEvents([data as any]); + + expect(mockPushEvent).toBeCalledTimes(1); + expect(mockPushEvent.mock.lastCall[0]).toBe('faro.tracing.coolName'); + }); + + it('Call Faro event API with traceID and spanID of contained in teh span', () => { + const faro = initializeFaro(mockConfig()); + + const mockPushEvent = jest.fn(); + jest.spyOn(faro.api, 'pushEvent').mockImplementationOnce(mockPushEvent); + + // add scope name without "-" + const data = { + ...testData[0], + scopeSpans: testData[0]?.scopeSpans.map((s) => ({ ...s })), + }; + data.scopeSpans!.at(-1)!.scope.name = '@foo/coolName'; + + sendFaroEvents([data as any]); + + expect(mockPushEvent).toBeCalledTimes(1); + expect(mockPushEvent.mock.lastCall[3]).toStrictEqual({ + spanContext: { + spanId: '4c47d5f85e4b2aec', + traceId: '7fb8581e3db5ebc6be4e36a7a8817cfe', + }, + }); + }); +}); + +// some unnecessary parts are removed to shorten the object a bit. +const testData = [ + { + resource: { + attributes: [], + droppedAttributesCount: 0, + }, + scopeSpans: [ + { + scope: { + name: '@opentelemetry/instrumentation-document-load', + version: '0.35.0', + }, + spans: [ + { + traceId: 'b3eb030d2a6a3ea28fd81a2c3c865d32', + spanId: '146cbe6578eedc77', + parentSpanId: '411fbeb357bad860', + name: 'resourceFetch', + kind: 1, + startTimeUnixNano: '1709051097380000000', + endTimeUnixNano: '1709051097419000000', + attributes: [ + { + key: 'session_id', + value: { + stringValue: '7Zk2kA92sT', + }, + }, + { + key: 'http.url', + value: { + stringValue: + 'http://localhost:5173/@fs/Users/marcoschaefer/Code/Repos/Grafana/faro-web-sdk/packages/core/dist/esm/api/traces/index.js', + }, + }, + { + key: 'http.response_content_length', + value: { + intValue: 652, + }, + }, + ], + droppedAttributesCount: 0, + events: [ + { + attributes: [], + name: 'fetchStart', + timeUnixNano: '1709051097380000000', + droppedAttributesCount: 0, + }, + ], + droppedEventsCount: 0, + status: { + code: 0, + }, + links: [], + droppedLinksCount: 0, + }, + ], + }, + { + scope: { + name: '@grafana/faro-react', + version: '1.3.9', + }, + spans: [ + { + traceId: 'e2e8ca244a7f149ca0f8e820df2d2ec1', + spanId: 'f4e18e624b397865', + name: 'componentMount', + kind: 1, + startTimeUnixNano: '1709051097617000000', + endTimeUnixNano: '1709051097617000000', + attributes: [ + { + key: 'session_id', + value: { + stringValue: '7Zk2kA92sT', + }, + }, + { + key: 'react.component.name', + value: { + stringValue: 'CounterComponent', + }, + }, + ], + droppedAttributesCount: 0, + events: [], + droppedEventsCount: 0, + status: { + code: 0, + }, + links: [], + droppedLinksCount: 0, + }, + ], + }, + { + scope: { + name: '@opentelemetry/instrumentation-fetch', + version: '0.45.1', + }, + spans: [ + { + // this is the only span which is of kind=3 (client) + traceId: '7fb8581e3db5ebc6be4e36a7a8817cfe', + spanId: '4c47d5f85e4b2aec', + parentSpanId: 'da5a27b83e0f2871', + name: 'HTTP GET', + kind: 3, + startTimeUnixNano: '1709051097594000000', + endTimeUnixNano: '1709051097609000000', + attributes: [ + { + key: 'session_id', + value: { + stringValue: 'my-session-id', + }, + }, + { + key: 'component', + value: { + stringValue: 'fetch', + }, + }, + { + key: 'http.method', + value: { + stringValue: 'GET', + }, + }, + { + key: 'http.url', + value: { + stringValue: 'http://foo/bar', + }, + }, + { + key: 'http.status_code', + value: { + intValue: 401, + }, + }, + { + key: 'http.status_text', + value: { + stringValue: 'Unauthorized', + }, + }, + { + key: 'http.host', + value: { + stringValue: 'my-host', + }, + }, + { + key: 'http.scheme', + value: { + stringValue: 'http', + }, + }, + { + key: 'http.user_agent', + value: { + stringValue: 'my-user-agent', + }, + }, + { + key: 'http.response_content_length', + value: { + intValue: 127, + }, + }, + ], + droppedAttributesCount: 0, + events: [ + { + attributes: [], + name: 'fetchStart', + timeUnixNano: '1709051097594000000', + droppedAttributesCount: 0, + }, + { + attributes: [], + name: 'domainLookupStart', + timeUnixNano: '1709051097594000000', + droppedAttributesCount: 0, + }, + { + attributes: [], + name: 'domainLookupEnd', + timeUnixNano: '1709051097594000000', + droppedAttributesCount: 0, + }, + { + attributes: [], + name: 'connectStart', + timeUnixNano: '1709051097594000000', + droppedAttributesCount: 0, + }, + { + attributes: [], + name: 'connectEnd', + timeUnixNano: '1709051097594000000', + droppedAttributesCount: 0, + }, + { + attributes: [], + name: 'requestStart', + timeUnixNano: '1709051097596000000', + droppedAttributesCount: 0, + }, + { + attributes: [], + name: 'responseStart', + timeUnixNano: '1709051097597000000', + droppedAttributesCount: 0, + }, + { + attributes: [], + name: 'responseEnd', + timeUnixNano: '1709051097597000000', + droppedAttributesCount: 0, + }, + ], + droppedEventsCount: 0, + status: { + code: 0, + }, + links: [], + droppedLinksCount: 0, + }, + ], + }, + ], + }, +]; diff --git a/packages/react-native-tracing/src/faroTraceExporter.utils.ts b/packages/react-native-tracing/src/faroTraceExporter.utils.ts new file mode 100644 index 000000000..99f4b30d4 --- /dev/null +++ b/packages/react-native-tracing/src/faroTraceExporter.utils.ts @@ -0,0 +1,47 @@ +import type { SpanContext } from '@opentelemetry/api'; +import { ESpanKind, IResourceSpans } from '@opentelemetry/otlp-transformer'; + +import { faro, unknownString } from '@grafana/faro-core'; +import type { EventAttributes as FaroEventAttributes } from '@grafana/faro-web-sdk'; + +export function sendFaroEvents(resourceSpans: IResourceSpans[] = []) { + for (const resourceSpan of resourceSpans) { + const { scopeSpans } = resourceSpan; + + for (const scopeSpan of scopeSpans) { + const { scope, spans = [] } = scopeSpan; + + for (const span of spans) { + if (span.kind !== ESpanKind.SPAN_KIND_CLIENT) { + continue; + } + + const spanContext: Pick = { + traceId: span.traceId.toString(), + spanId: span.spanId.toString(), + }; + + const faroEventAttributes: FaroEventAttributes = {}; + + for (const attribute of span.attributes) { + faroEventAttributes[attribute.key] = String(Object.values(attribute.value)[0]); + } + + const index = (scope?.name ?? '').indexOf('-'); + let eventName = unknownString; + + if (scope?.name) { + if (index === -1) { + eventName = scope.name.split('/')[1] ?? scope.name; + } + + if (index > -1) { + eventName = scope?.name.substring(index + 1); + } + } + + faro.api.pushEvent(`faro.tracing.${eventName}`, faroEventAttributes, undefined, { spanContext }); + } + } + } +} diff --git a/packages/react-native-tracing/src/faroXhrInstrumentation.ts b/packages/react-native-tracing/src/faroXhrInstrumentation.ts new file mode 100644 index 000000000..419e5dee0 --- /dev/null +++ b/packages/react-native-tracing/src/faroXhrInstrumentation.ts @@ -0,0 +1,42 @@ +import type { Span } from '@opentelemetry/api'; +import { XMLHttpRequestInstrumentation } from '@opentelemetry/instrumentation-xml-http-request'; +import type { XMLHttpRequestInstrumentationConfig } from '@opentelemetry/instrumentation-xml-http-request'; +import type { OpenFunction } from '@opentelemetry/instrumentation-xml-http-request/build/src/types'; + +type Parent = { + _createSpan: (xhr: XMLHttpRequest, url: string, method: string) => Span | undefined; +}; + +export class FaroXhrInstrumentation extends XMLHttpRequestInstrumentation { + private parentCreateSpan: Parent['_createSpan']; + + constructor(config: XMLHttpRequestInstrumentationConfig = {}) { + super(config); + + const self = this as any as Parent; + this.parentCreateSpan = self._createSpan.bind(this); + } + + // Patching the parent's private method to handle url type string or URL + protected override _patchOpen() { + return (original: OpenFunction): OpenFunction => { + const plugin = this; + return function patchOpen(this: XMLHttpRequest, ...args): void { + const method: string = args[0]; + let url: string | URL = args[1]; + + if (isInstanceOfURL(url)) { + url = url.href; + } + + plugin.parentCreateSpan(this, url, method); + + return original.apply(this, args); + }; + }; + } +} + +function isInstanceOfURL(item: any): item is URL { + return item instanceof URL; +} diff --git a/packages/react-native-tracing/src/getDefaultInstrumentations.test.ts b/packages/react-native-tracing/src/getDefaultInstrumentations.test.ts new file mode 100644 index 000000000..1c83733a8 --- /dev/null +++ b/packages/react-native-tracing/src/getDefaultInstrumentations.test.ts @@ -0,0 +1,64 @@ +import { FetchInstrumentation } from '@opentelemetry/instrumentation-fetch'; +import { XMLHttpRequestInstrumentation } from '@opentelemetry/instrumentation-xml-http-request'; + +import { getDefaultOTELInstrumentations } from './getDefaultOTELInstrumentations'; + +jest.mock('@opentelemetry/instrumentation-fetch'); +jest.mock('@opentelemetry/instrumentation-xml-http-request'); + +describe('getDefaultOTELInstrumentations', () => { + afterEach(() => { + jest.clearAllMocks(); + }); + + it('should return an array of instrumentations', () => { + const instrumentations = getDefaultOTELInstrumentations(); + expect(instrumentations).toBeInstanceOf(Array); + expect(instrumentations[0]).toBeInstanceOf(FetchInstrumentation); + expect(instrumentations[1]).toBeInstanceOf(XMLHttpRequestInstrumentation); + }); + + it('should apply default options', () => { + getDefaultOTELInstrumentations(); + + expect(FetchInstrumentation).toHaveBeenCalledWith({ + ignoreNetworkEvents: true, + applyCustomAttributesOnSpan: expect.any(Function), + }); + + expect(XMLHttpRequestInstrumentation).toHaveBeenCalledWith({ + ignoreNetworkEvents: true, + applyCustomAttributesOnSpan: expect.any(Function), + }); + }); + + it('should apply custom options', () => { + const ignoreUrls = ['example.com']; + const propagateTraceHeaderCorsUrls = ['example2.com']; + + getDefaultOTELInstrumentations({ + ignoreUrls, + propagateTraceHeaderCorsUrls, + fetchInstrumentationOptions: { + ignoreNetworkEvents: false, + }, + xhrInstrumentationOptions: { + ignoreNetworkEvents: false, + }, + }); + + expect(FetchInstrumentation).toHaveBeenCalledWith({ + ignoreUrls, + propagateTraceHeaderCorsUrls, + ignoreNetworkEvents: false, + applyCustomAttributesOnSpan: expect.any(Function), + }); + + expect(XMLHttpRequestInstrumentation).toHaveBeenCalledWith({ + ignoreUrls, + propagateTraceHeaderCorsUrls, + ignoreNetworkEvents: false, + applyCustomAttributesOnSpan: expect.any(Function), + }); + }); +}); diff --git a/packages/react-native-tracing/src/getDefaultOTELInstrumentations.ts b/packages/react-native-tracing/src/getDefaultOTELInstrumentations.ts new file mode 100644 index 000000000..8ae12abcb --- /dev/null +++ b/packages/react-native-tracing/src/getDefaultOTELInstrumentations.ts @@ -0,0 +1,48 @@ +import { FetchInstrumentation } from '@opentelemetry/instrumentation-fetch'; + +import { FaroXhrInstrumentation } from './faroXhrInstrumentation'; +import { + fetchCustomAttributeFunctionWithDefaults, + xhrCustomAttributeFunctionWithDefaults, +} from './instrumentationUtils'; +import type { DefaultInstrumentationsOptions, InstrumentationOption } from './types'; + +export function getDefaultOTELInstrumentations(options: DefaultInstrumentationsOptions = {}): InstrumentationOption[] { + const { fetchInstrumentationOptions, xhrInstrumentationOptions, ...sharedOptions } = options; + + const fetchOpts = createFetchInstrumentationOptions(fetchInstrumentationOptions, sharedOptions); + const xhrOpts = createXhrInstrumentationOptions(xhrInstrumentationOptions, sharedOptions); + + return [new FetchInstrumentation(fetchOpts), new FaroXhrInstrumentation(xhrOpts)]; +} +function createFetchInstrumentationOptions( + fetchInstrumentationOptions: DefaultInstrumentationsOptions['fetchInstrumentationOptions'], + sharedOptions: Record +) { + return { + ...sharedOptions, + ignoreNetworkEvents: true, + // keep this here to overwrite the defaults above if provided by the users + ...fetchInstrumentationOptions, + // always keep this function + applyCustomAttributesOnSpan: fetchCustomAttributeFunctionWithDefaults( + fetchInstrumentationOptions?.applyCustomAttributesOnSpan + ), + }; +} + +function createXhrInstrumentationOptions( + xhrInstrumentationOptions: DefaultInstrumentationsOptions['xhrInstrumentationOptions'], + sharedOptions: Record +) { + return { + ...sharedOptions, + ignoreNetworkEvents: true, + // keep this here to overwrite the defaults above if provided by the users + ...xhrInstrumentationOptions, + // always keep this function + applyCustomAttributesOnSpan: xhrCustomAttributeFunctionWithDefaults( + xhrInstrumentationOptions?.applyCustomAttributesOnSpan + ), + }; +} diff --git a/packages/react-native-tracing/src/index.ts b/packages/react-native-tracing/src/index.ts new file mode 100644 index 000000000..7c3fa5448 --- /dev/null +++ b/packages/react-native-tracing/src/index.ts @@ -0,0 +1,13 @@ +export { FaroTraceExporter } from './faroTraceExporter'; + +export { FaroSessionSpanProcessor } from './sessionSpanProcessor'; + +export { getDefaultOTELInstrumentations } from './getDefaultOTELInstrumentations'; + +export { TracingInstrumentation } from './instrumentation'; + +export { getSamplingDecision } from './sampler'; + +export type { FaroTraceExporterConfig, TracingInstrumentationOptions } from './types'; + +export { setSpanStatusOnFetchError, fetchCustomAttributeFunctionWithDefaults } from './instrumentationUtils'; diff --git a/packages/react-native-tracing/src/instrumentation.ts b/packages/react-native-tracing/src/instrumentation.ts new file mode 100644 index 000000000..c04257a9d --- /dev/null +++ b/packages/react-native-tracing/src/instrumentation.ts @@ -0,0 +1,94 @@ +import {context, trace} from '@opentelemetry/api'; +import {W3CTraceContextPropagator} from '@opentelemetry/core'; +import {registerInstrumentations} from '@opentelemetry/instrumentation'; +import {Resource, ResourceAttributes} from '@opentelemetry/resources'; +import {BatchSpanProcessor, StackContextManager, WebTracerProvider} from '@opentelemetry/sdk-trace-web'; +import {ATTR_SERVICE_NAME, ATTR_SERVICE_VERSION,} from '@opentelemetry/semantic-conventions'; + + +import {BaseInstrumentation, Transport, VERSION} from '@grafana/faro-web-sdk'; + +import {FaroTraceExporter} from './faroTraceExporter'; +import {getDefaultOTELInstrumentations} from './getDefaultOTELInstrumentations'; +import {getSamplingDecision} from './sampler'; +import {FaroSessionSpanProcessor} from './sessionSpanProcessor'; +import type {TracingInstrumentationOptions} from './types'; + +// the providing of app name here is not great +// should delay initialization and provide the full Faro config, +// taking app name from it + +export class TracingInstrumentation extends BaseInstrumentation { + name = '@grafana/faro-web-tracing'; + version = VERSION; + + static SCHEDULED_BATCH_DELAY_MS = 1000; + + constructor(private options: TracingInstrumentationOptions = {}) { + super(); + } + + initialize(): void { + const options = this.options; + const attributes: ResourceAttributes = {}; + + if (this.config.app.name) { + attributes[ATTR_SERVICE_NAME] = this.config.app.name; + } + + + if (this.config.app.version) { + attributes[ATTR_SERVICE_VERSION] = this.config.app.version; + } + + Object.assign(attributes, options.resourceAttributes); + + const resource = Resource.default().merge(new Resource(attributes)); + + const provider = new WebTracerProvider({ + resource, + sampler: { + shouldSample: () => { + return { + decision: getSamplingDecision(this.api.getSession()), + }; + }, + }, + }); + + provider.addSpanProcessor( + options.spanProcessor ?? + new FaroSessionSpanProcessor( + new BatchSpanProcessor(new FaroTraceExporter({ api: this.api }), { + scheduledDelayMillis: TracingInstrumentation.SCHEDULED_BATCH_DELAY_MS, + maxExportBatchSize: 30, + }), + this.metas + ) + ); + + provider.register({ + propagator: options.propagator ?? new W3CTraceContextPropagator(), + contextManager: options.contextManager ?? new StackContextManager(), + }); + + const { propagateTraceHeaderCorsUrls, fetchInstrumentationOptions, xhrInstrumentationOptions } = + this.options.instrumentationOptions ?? {}; + + registerInstrumentations({ + instrumentations: + options.instrumentations ?? + getDefaultOTELInstrumentations({ + ignoreUrls: this.getIgnoreUrls(), + propagateTraceHeaderCorsUrls, + fetchInstrumentationOptions, + xhrInstrumentationOptions, + }), + }); + this.api.initOTEL(trace, context); + } + + private getIgnoreUrls(): Array { + return this.transports.transports.flatMap((transport: Transport) => transport.getIgnoreUrls()); + } +} diff --git a/packages/react-native-tracing/src/instrumentationUtils.test.ts b/packages/react-native-tracing/src/instrumentationUtils.test.ts new file mode 100644 index 000000000..f91871b4e --- /dev/null +++ b/packages/react-native-tracing/src/instrumentationUtils.test.ts @@ -0,0 +1,77 @@ +import { SpanStatusCode } from '@opentelemetry/api'; + +import { fetchCustomAttributeFunctionWithDefaults, setSpanStatusOnFetchError } from './instrumentationUtils'; +import * as instrumentationUtilsMock from './instrumentationUtils'; + +describe('faroTraceExporter.utils', () => { + afterEach(() => { + jest.clearAllMocks(); + }); + + test.each([500, 599, 400, 499, new Error()])('set span status on fetch error', (result) => { + const span = { setStatus: jest.fn() } as any; + const request = {} as Request; + const response = result instanceof Error ? result : ({ status: result } as Response); + + setSpanStatusOnFetchError(span, request, response); + + expect(span.setStatus).toBeCalledWith({ code: SpanStatusCode.ERROR }); + }); + + test.each([200, 300, 399])('does not set span status on fetch success', (result) => { + const span = { setStatus: jest.fn() } as any; + const request = {} as Request; + const response = { status: result } as Response; + + setSpanStatusOnFetchError(span, request, response); + + expect(span.setStatus).not.toBeCalled(); + }); + + it('calls custom setSpanStatusOnFetchError from fetchInstrumentationOptions and callback if provided', () => { + const mock = jest.fn(); + jest.spyOn(instrumentationUtilsMock, 'setSpanStatusOnFetchError').mockImplementationOnce(mock); + + const span = { setStatus: jest.fn() } as any; + const request = {} as Request; + const response = { status: 500 } as Response; + const callback = jest.fn(); + + fetchCustomAttributeFunctionWithDefaults(callback)(span, request, response); + + expect(span.setStatus).toBeCalledWith({ code: SpanStatusCode.ERROR }); + expect(callback).toBeCalledWith(span, request, response); + }); + + test.each([500, 599, 400, 499])('set span status on XMLHttpRequest error', (result) => { + const span = { setStatus: jest.fn() } as any; + const xhr = { status: result } as XMLHttpRequest; + + instrumentationUtilsMock.setSpanStatusOnXMLHttpRequestError(span, xhr); + + expect(span.setStatus).toBeCalledWith({ code: SpanStatusCode.ERROR }); + }); + + test.each([200, 300, 399])('does not set span status on XMLHttpRequest success', (result) => { + const span = { setStatus: jest.fn() } as any; + const xhr = { status: result } as XMLHttpRequest; + + instrumentationUtilsMock.setSpanStatusOnXMLHttpRequestError(span, xhr); + + expect(span.setStatus).not.toBeCalled(); + }); + + it('calls custom setSpanStatusOnFetchError from xhrInstrumentationOptions and callback if provided', () => { + const mock = jest.fn(); + jest.spyOn(instrumentationUtilsMock, 'setSpanStatusOnXMLHttpRequestError').mockImplementationOnce(mock); + + const span = { setStatus: jest.fn() } as any; + const xhr = { status: 500 } as XMLHttpRequest; + const callback = jest.fn(); + + instrumentationUtilsMock.xhrCustomAttributeFunctionWithDefaults(callback)(span, xhr); + + expect(span.setStatus).toBeCalledWith({ code: SpanStatusCode.ERROR }); + expect(callback).toBeCalledWith(span, xhr); + }); +}); diff --git a/packages/react-native-tracing/src/instrumentationUtils.ts b/packages/react-native-tracing/src/instrumentationUtils.ts new file mode 100644 index 000000000..d18945d97 --- /dev/null +++ b/packages/react-native-tracing/src/instrumentationUtils.ts @@ -0,0 +1,53 @@ +import { Span, SpanStatusCode } from '@opentelemetry/api'; +import type { FetchCustomAttributeFunction } from '@opentelemetry/instrumentation-fetch'; +import type { XHRCustomAttributeFunction } from '@opentelemetry/instrumentation-xml-http-request'; + +export interface FetchError { + status?: number; + message: string; +} + +/** + * Adds HTTP status code to every span. + * + * The fetch instrumentation does not always set the span status to error as defined by the spec. + * To work around that issue we manually set the span status. + * + * Issue: https://github.com/open-telemetry/opentelemetry-js/issues/3564 + * Spec: https://github.com/open-telemetry/opentelemetry-specification/blob/v1.20.0/specification/trace/semantic_conventions/http.md#status + */ +export function setSpanStatusOnFetchError(span: Span, _request: Request | RequestInit, result: Response | FetchError) { + const httpStatusCode = result instanceof Error ? 0 : result.status; + setSpanStatus(span, httpStatusCode); +} + +export function setSpanStatusOnXMLHttpRequestError(span: Span, xhr: XMLHttpRequest) { + setSpanStatus(span, xhr.status); +} + +function setSpanStatus(span: Span, httpStatusCode?: number) { + if (httpStatusCode == null) { + return; + } + + const isError = httpStatusCode === 0; + const isClientOrServerError = httpStatusCode >= 400 && httpStatusCode < 600; + + if (isError || isClientOrServerError) { + span.setStatus({ code: SpanStatusCode.ERROR }); + } +} + +export function fetchCustomAttributeFunctionWithDefaults(callback?: FetchCustomAttributeFunction) { + return (span: Span, request: Request | RequestInit, result: Response | FetchError) => { + setSpanStatusOnFetchError(span, request, result); + callback?.(span, request, result); + }; +} + +export function xhrCustomAttributeFunctionWithDefaults(callback?: XHRCustomAttributeFunction) { + return (span: Span, xhr: XMLHttpRequest) => { + setSpanStatusOnXMLHttpRequestError(span, xhr); + callback?.(span, xhr); + }; +} diff --git a/packages/react-native-tracing/src/sampler.test.ts b/packages/react-native-tracing/src/sampler.test.ts new file mode 100644 index 000000000..6e836e4e7 --- /dev/null +++ b/packages/react-native-tracing/src/sampler.test.ts @@ -0,0 +1,29 @@ +import { SamplingDecision } from '@opentelemetry/sdk-trace-web'; + +import { getSamplingDecision } from './sampler'; + +describe('Sampler', () => { + afterEach(() => { + jest.restoreAllMocks(); + }); + + it('Set SamplingDecision to NOT_RECORD (0) if session is not part of the sample', () => { + const samplingDecision = getSamplingDecision({ + attributes: { + isSampled: 'false', + }, + }); + + expect(samplingDecision).toBe(SamplingDecision.NOT_RECORD); + }); + + it('Set SamplingDecision to RECORD_AND_SAMPLED (2) if session is part of the sample', () => { + const samplingDecision = getSamplingDecision({ + attributes: { + isSampled: 'true', + }, + }); + + expect(samplingDecision).toBe(SamplingDecision.RECORD_AND_SAMPLED); + }); +}); diff --git a/packages/react-native-tracing/src/sampler.ts b/packages/react-native-tracing/src/sampler.ts new file mode 100644 index 000000000..72e1e1db4 --- /dev/null +++ b/packages/react-native-tracing/src/sampler.ts @@ -0,0 +1,10 @@ +import { SamplingDecision } from '@opentelemetry/sdk-trace-web'; + +import type { MetaSession } from '@grafana/faro-web-sdk'; + +export function getSamplingDecision(sessionMeta: MetaSession = {}): SamplingDecision { + const isSessionSampled = sessionMeta.attributes?.['isSampled'] === 'true'; + const samplingDecision = isSessionSampled ? SamplingDecision.RECORD_AND_SAMPLED : SamplingDecision.NOT_RECORD; + + return samplingDecision; +} diff --git a/packages/react-native-tracing/src/sessionSpanProcessor.ts b/packages/react-native-tracing/src/sessionSpanProcessor.ts new file mode 100644 index 000000000..94ca10864 --- /dev/null +++ b/packages/react-native-tracing/src/sessionSpanProcessor.ts @@ -0,0 +1,40 @@ +import type { Context } from '@opentelemetry/api'; +import type { ReadableSpan, Span, SpanProcessor } from '@opentelemetry/sdk-trace-web'; +// False positive. Package can be resolved. +// eslint-disable-next-line import/no-unresolved +import { ATTR_SESSION_ID } from '@opentelemetry/semantic-conventions/incubating'; + +import type { Metas } from '@grafana/faro-web-sdk'; + +export class FaroSessionSpanProcessor implements SpanProcessor { + constructor( + private processor: SpanProcessor, + private metas: Metas + ) {} + + forceFlush(): Promise { + return this.processor.forceFlush(); + } + + onStart(span: Span, parentContext: Context): void { + const session = this.metas.value.session; + + if (session?.id) { + span.attributes[ATTR_SESSION_ID] = session.id; + /** + * @deprecated will be removed in the future and has been replaced by ATTR_SESSION_ID (session.id) + */ + span.attributes['session_id'] = session.id; + } + + this.processor.onStart(span, parentContext); + } + + onEnd(span: ReadableSpan): void { + this.processor.onEnd(span); + } + + shutdown(): Promise { + return this.processor.shutdown(); + } +} diff --git a/packages/react-native-tracing/src/types.ts b/packages/react-native-tracing/src/types.ts new file mode 100644 index 000000000..519f78ddf --- /dev/null +++ b/packages/react-native-tracing/src/types.ts @@ -0,0 +1,43 @@ +import type { ContextManager, TextMapPropagator } from '@opentelemetry/api'; +import type { Instrumentation } from '@opentelemetry/instrumentation'; +import type { FetchCustomAttributeFunction } from '@opentelemetry/instrumentation-fetch'; +import type { XHRCustomAttributeFunction } from '@opentelemetry/instrumentation-xml-http-request'; +import type { ResourceAttributes } from '@opentelemetry/resources'; +import type { SpanProcessor } from '@opentelemetry/sdk-trace-web'; + +import type { Patterns } from '@grafana/faro-core'; +import type { API } from '@grafana/faro-web-sdk'; + +// type got remove by with experimental/v0.52.0 and is replaced by the following type: +// See: https://github.com/open-telemetry/opentelemetry-js/releases/tag/experimental%2Fv0.52.0 +export type InstrumentationOption = Instrumentation | Instrumentation[]; + +export interface FaroTraceExporterConfig { + api: API; +} + +export interface TracingInstrumentationOptions { + resourceAttributes?: ResourceAttributes; + propagator?: TextMapPropagator; + contextManager?: ContextManager; + instrumentations?: InstrumentationOption[]; + spanProcessor?: SpanProcessor; + instrumentationOptions?: Omit; +} + +export type MatchUrlDefinitions = Patterns; + +export type DefaultInstrumentationsOptions = { + ignoreUrls?: MatchUrlDefinitions; + propagateTraceHeaderCorsUrls?: MatchUrlDefinitions; + + fetchInstrumentationOptions?: { + applyCustomAttributesOnSpan?: FetchCustomAttributeFunction; + ignoreNetworkEvents?: boolean; + }; + + xhrInstrumentationOptions?: { + applyCustomAttributesOnSpan?: XHRCustomAttributeFunction; + ignoreNetworkEvents?: boolean; + }; +}; diff --git a/packages/react-native-tracing/tsconfig.cjs.json b/packages/react-native-tracing/tsconfig.cjs.json new file mode 100644 index 000000000..6dabf9ec2 --- /dev/null +++ b/packages/react-native-tracing/tsconfig.cjs.json @@ -0,0 +1,12 @@ +{ + "extends": "../../tsconfig.base.cjs.json", + "compilerOptions": { + "declarationDir": "./dist/types", + "outDir": "./dist/cjs", + "rootDir": "./src", + "tsBuildInfoFile": "../../.cache/tsc/webTracing.cjs.tsbuildinfo" + }, + "include": ["./src"], + "exclude": ["**/*.test.ts"], + "references": [{ "path": "../core/tsconfig.cjs.json" }, { "path": "../web-sdk/tsconfig.cjs.json" }] +} diff --git a/packages/react-native-tracing/tsconfig.esm.json b/packages/react-native-tracing/tsconfig.esm.json new file mode 100644 index 000000000..a1f9ee4a3 --- /dev/null +++ b/packages/react-native-tracing/tsconfig.esm.json @@ -0,0 +1,12 @@ +{ + "extends": "../../tsconfig.base.esm.json", + "compilerOptions": { + "declarationDir": "./dist/types", + "outDir": "./dist/esm", + "rootDir": "./src", + "tsBuildInfoFile": "../../.cache/tsc/webTracing.esm.tsbuildinfo" + }, + "include": ["./src"], + "exclude": ["**/*.test.ts"], + "references": [{ "path": "../core/tsconfig.esm.json" }, { "path": "../web-sdk/tsconfig.esm.json" }] +} diff --git a/packages/react-native-tracing/tsconfig.json b/packages/react-native-tracing/tsconfig.json new file mode 100644 index 000000000..db2455a0e --- /dev/null +++ b/packages/react-native-tracing/tsconfig.json @@ -0,0 +1,7 @@ +{ + "references": [ + { "path": "./tsconfig.cjs.json" }, + { "path": "./tsconfig.esm.json" }, + { "path": "./tsconfig.spec.json" } + ] +} diff --git a/packages/react-native-tracing/tsconfig.spec.json b/packages/react-native-tracing/tsconfig.spec.json new file mode 100644 index 000000000..efbfc8b76 --- /dev/null +++ b/packages/react-native-tracing/tsconfig.spec.json @@ -0,0 +1,11 @@ +{ + "extends": "../../tsconfig.base.spec.json", + "compilerOptions": { + "declarationDir": "./dist/types", + "outDir": "./dist/spec", + "rootDir": "..", + "tsBuildInfoFile": "../../.cache/tsc/webTracing.spec.tsbuildinfo" + }, + "include": ["./src"], + "references": [{ "path": "../core/tsconfig.spec.json" }] +} From e2f8fe2d9c6ccdec85eacf18e43b4a26ef774c65 Mon Sep 17 00:00:00 2001 From: Ilia Kurganskii Date: Fri, 20 Dec 2024 13:04:11 +0100 Subject: [PATCH 02/43] fix: remove deps --- package.json | 3 --- 1 file changed, 3 deletions(-) diff --git a/package.json b/package.json index b374ea9dd..938634f97 100644 --- a/package.json +++ b/package.json @@ -93,8 +93,5 @@ "packageManager": "yarn@1.22.19", "resolutions": { "tough-cookie": "^4.1.3" - }, - "dependencies": { - "@grafana/faro-web-tracing": "file:.yalc/@grafana/faro-web-tracing" } } From efc8ebbc9e2f0cf6ff165f1c19f75768ae690655 Mon Sep 17 00:00:00 2001 From: Ilia Kurganskii Date: Fri, 20 Dec 2024 17:04:00 +0100 Subject: [PATCH 03/43] fix: ignore browser sdk if flag enabled --- packages/core/src/transports/batchExecutor.ts | 12 +++++++----- packages/core/src/transports/initialize.ts | 1 + packages/core/src/transports/types.ts | 2 ++ 3 files changed, 10 insertions(+), 5 deletions(-) diff --git a/packages/core/src/transports/batchExecutor.ts b/packages/core/src/transports/batchExecutor.ts index 3cfc9ac1a..09c04a824 100644 --- a/packages/core/src/transports/batchExecutor.ts +++ b/packages/core/src/transports/batchExecutor.ts @@ -27,11 +27,13 @@ export class BatchExecutor { // Send batched/buffered data when user navigates to new page, switches or closes the tab, minimizes or closes the browser. // If on mobile, it also sends data if user switches from the browser to a different app. - document.addEventListener('visibilitychange', () => { - if (document.visibilityState === 'hidden') { - this.flush(); - } - }); + if (!options?.ignoreBrowserApi) { + document?.addEventListener('visibilitychange', () => { + if (document.visibilityState === 'hidden') { + this.flush(); + } + }); + } } addItem(item: TransportItem): void { diff --git a/packages/core/src/transports/initialize.ts b/packages/core/src/transports/initialize.ts index 67d0d98f1..e55a73004 100644 --- a/packages/core/src/transports/initialize.ts +++ b/packages/core/src/transports/initialize.ts @@ -145,6 +145,7 @@ export function initializeTransports( batchExecutor = new BatchExecutor(batchedSend, { sendTimeout: config.batching.sendTimeout, itemLimit: config.batching.itemLimit, + ignoreBrowserApi: config.batching.ignoreBrowserApi, paused, }); } diff --git a/packages/core/src/transports/types.ts b/packages/core/src/transports/types.ts index d6e18a989..abf45640f 100644 --- a/packages/core/src/transports/types.ts +++ b/packages/core/src/transports/types.ts @@ -58,4 +58,6 @@ export interface BatchExecutorOptions { // Buffer "sendLimit" is the number of signals before sending the payload readonly itemLimit?: number; readonly paused?: boolean; + + readonly ignoreBrowserApi?: boolean; } From 90358b9de1fef84d374ab4febeb661da969fca69 Mon Sep 17 00:00:00 2001 From: Ilia Kurganskii Date: Sat, 21 Dec 2024 14:19:46 +0100 Subject: [PATCH 04/43] fix: fix related bundles --- packages/core/package.json | 2 +- packages/react-native-sdk/rollup.config.js | 2 +- .../src/transports/fetch/transport.ts | 2 +- packages/react-native-sdk/tsconfig.cjs.json | 2 +- packages/react-native-sdk/tsconfig.esm.json | 2 +- packages/react-native-sdk/tsconfig.spec.json | 2 +- packages/react-native-tracing/package.json | 4 +++- packages/react-native-tracing/rollup.config.js | 2 +- .../src/faroTraceExporter.utils.ts | 2 +- packages/react-native-tracing/src/instrumentation.ts | 7 +++---- packages/react-native-tracing/src/sampler.ts | 2 +- .../react-native-tracing/src/sessionSpanProcessor.ts | 7 ++----- packages/react-native-tracing/src/types.ts | 2 +- packages/react-native-tracing/tsconfig.cjs.json | 4 ++-- packages/react-native-tracing/tsconfig.esm.json | 4 ++-- packages/react-native-tracing/tsconfig.spec.json | 2 +- rollup.config.base.js | 12 ++++++++++++ 17 files changed, 35 insertions(+), 25 deletions(-) diff --git a/packages/core/package.json b/packages/core/package.json index 546bfce65..3f96f0720 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -1,6 +1,6 @@ { "name": "@grafana/faro-core", - "version": "1.12.2", + "version": "1.12.3", "description": "Core package of Faro.", "keywords": [ "observability", diff --git a/packages/react-native-sdk/rollup.config.js b/packages/react-native-sdk/rollup.config.js index 307e50ee8..523c1b5a2 100644 --- a/packages/react-native-sdk/rollup.config.js +++ b/packages/react-native-sdk/rollup.config.js @@ -1,3 +1,3 @@ const { getRollupConfigBase } = require('../../rollup.config.base.js'); -module.exports = getRollupConfigBase('webSdk'); +module.exports = getRollupConfigBase('rnSdk'); diff --git a/packages/react-native-sdk/src/transports/fetch/transport.ts b/packages/react-native-sdk/src/transports/fetch/transport.ts index 716a43c8f..79eebdfbc 100644 --- a/packages/react-native-sdk/src/transports/fetch/transport.ts +++ b/packages/react-native-sdk/src/transports/fetch/transport.ts @@ -23,7 +23,7 @@ const TOO_MANY_REQUESTS = 429; const ACCEPTED = 202; export class FetchTransport extends BaseTransport { - readonly name = '@grafana/faro-web-sdk:transport-fetch'; + readonly name = '@grafana/faro-react-native-sdk:transport-fetch'; readonly version = VERSION; promiseBuffer: PromiseBuffer; diff --git a/packages/react-native-sdk/tsconfig.cjs.json b/packages/react-native-sdk/tsconfig.cjs.json index 4ac1c938e..5f0d71eb8 100644 --- a/packages/react-native-sdk/tsconfig.cjs.json +++ b/packages/react-native-sdk/tsconfig.cjs.json @@ -4,7 +4,7 @@ "declarationDir": "./dist/types", "outDir": "./dist/cjs", "rootDir": "./src", - "tsBuildInfoFile": "../../.cache/tsc/webSdk.cjs.tsbuildinfo" + "tsBuildInfoFile": "../../.cache/tsc/rnSdk.cjs.tsbuildinfo" }, "include": ["./src"], "exclude": ["**/*.test.ts"], diff --git a/packages/react-native-sdk/tsconfig.esm.json b/packages/react-native-sdk/tsconfig.esm.json index 82bb08940..27760ebc7 100644 --- a/packages/react-native-sdk/tsconfig.esm.json +++ b/packages/react-native-sdk/tsconfig.esm.json @@ -4,7 +4,7 @@ "declarationDir": "./dist/types", "outDir": "./dist/esm", "rootDir": "./src", - "tsBuildInfoFile": "../../.cache/tsc/webSdk.esm.tsbuildinfo" + "tsBuildInfoFile": "../../.cache/tsc/rnSdk.esm.tsbuildinfo" }, "include": ["./src"], "exclude": ["**/*.test.ts"], diff --git a/packages/react-native-sdk/tsconfig.spec.json b/packages/react-native-sdk/tsconfig.spec.json index d8e88091c..ac9b3dc0a 100644 --- a/packages/react-native-sdk/tsconfig.spec.json +++ b/packages/react-native-sdk/tsconfig.spec.json @@ -4,7 +4,7 @@ "declarationDir": "./dist/types", "outDir": "./dist/spec", "rootDir": "..", - "tsBuildInfoFile": "../../.cache/tsc/webSdk.spec.tsbuildinfo" + "tsBuildInfoFile": "../../.cache/tsc/rnSdk.spec.tsbuildinfo" }, "include": ["./src"], "references": [{ "path": "../core/tsconfig.spec.json" }] diff --git a/packages/react-native-tracing/package.json b/packages/react-native-tracing/package.json index 3c44d14fe..58f463886 100644 --- a/packages/react-native-tracing/package.json +++ b/packages/react-native-tracing/package.json @@ -52,7 +52,6 @@ "quality:circular-deps": "madge --circular ." }, "dependencies": { - "@grafana/faro-web-sdk": "^1.12.2", "@opentelemetry/api": "^1.9.0", "@opentelemetry/context-zone": "1.26.0", "@opentelemetry/core": "^1.26.0", @@ -67,5 +66,8 @@ }, "publishConfig": { "access": "public" + }, + "peerDependencies": { + "@grafana/react-native-sdk": "^1.12.2" } } diff --git a/packages/react-native-tracing/rollup.config.js b/packages/react-native-tracing/rollup.config.js index 4d7434614..e7fc21638 100644 --- a/packages/react-native-tracing/rollup.config.js +++ b/packages/react-native-tracing/rollup.config.js @@ -1,3 +1,3 @@ const { getRollupConfigBase } = require('../../rollup.config.base.js'); -module.exports = getRollupConfigBase('webTracing'); +module.exports = getRollupConfigBase('rnTracing'); diff --git a/packages/react-native-tracing/src/faroTraceExporter.utils.ts b/packages/react-native-tracing/src/faroTraceExporter.utils.ts index 99f4b30d4..047fb4d2d 100644 --- a/packages/react-native-tracing/src/faroTraceExporter.utils.ts +++ b/packages/react-native-tracing/src/faroTraceExporter.utils.ts @@ -2,7 +2,7 @@ import type { SpanContext } from '@opentelemetry/api'; import { ESpanKind, IResourceSpans } from '@opentelemetry/otlp-transformer'; import { faro, unknownString } from '@grafana/faro-core'; -import type { EventAttributes as FaroEventAttributes } from '@grafana/faro-web-sdk'; +import type { EventAttributes as FaroEventAttributes } from '@grafana/react-native-sdk'; export function sendFaroEvents(resourceSpans: IResourceSpans[] = []) { for (const resourceSpan of resourceSpans) { diff --git a/packages/react-native-tracing/src/instrumentation.ts b/packages/react-native-tracing/src/instrumentation.ts index c04257a9d..b0fe5fa0e 100644 --- a/packages/react-native-tracing/src/instrumentation.ts +++ b/packages/react-native-tracing/src/instrumentation.ts @@ -2,11 +2,11 @@ import {context, trace} from '@opentelemetry/api'; import {W3CTraceContextPropagator} from '@opentelemetry/core'; import {registerInstrumentations} from '@opentelemetry/instrumentation'; import {Resource, ResourceAttributes} from '@opentelemetry/resources'; -import {BatchSpanProcessor, StackContextManager, WebTracerProvider} from '@opentelemetry/sdk-trace-web'; +import {BatchSpanProcessor, WebTracerProvider} from '@opentelemetry/sdk-trace-web'; import {ATTR_SERVICE_NAME, ATTR_SERVICE_VERSION,} from '@opentelemetry/semantic-conventions'; -import {BaseInstrumentation, Transport, VERSION} from '@grafana/faro-web-sdk'; +import {BaseInstrumentation, Transport, VERSION} from '@grafana/react-native-sdk'; import {FaroTraceExporter} from './faroTraceExporter'; import {getDefaultOTELInstrumentations} from './getDefaultOTELInstrumentations'; @@ -19,7 +19,7 @@ import type {TracingInstrumentationOptions} from './types'; // taking app name from it export class TracingInstrumentation extends BaseInstrumentation { - name = '@grafana/faro-web-tracing'; + name = '@grafana/faro-react-native-tracing'; version = VERSION; static SCHEDULED_BATCH_DELAY_MS = 1000; @@ -69,7 +69,6 @@ export class TracingInstrumentation extends BaseInstrumentation { provider.register({ propagator: options.propagator ?? new W3CTraceContextPropagator(), - contextManager: options.contextManager ?? new StackContextManager(), }); const { propagateTraceHeaderCorsUrls, fetchInstrumentationOptions, xhrInstrumentationOptions } = diff --git a/packages/react-native-tracing/src/sampler.ts b/packages/react-native-tracing/src/sampler.ts index 72e1e1db4..64b26cb14 100644 --- a/packages/react-native-tracing/src/sampler.ts +++ b/packages/react-native-tracing/src/sampler.ts @@ -1,6 +1,6 @@ import { SamplingDecision } from '@opentelemetry/sdk-trace-web'; -import type { MetaSession } from '@grafana/faro-web-sdk'; +import type { MetaSession } from '@grafana/react-native-sdk'; export function getSamplingDecision(sessionMeta: MetaSession = {}): SamplingDecision { const isSessionSampled = sessionMeta.attributes?.['isSampled'] === 'true'; diff --git a/packages/react-native-tracing/src/sessionSpanProcessor.ts b/packages/react-native-tracing/src/sessionSpanProcessor.ts index 94ca10864..f5fe72c6c 100644 --- a/packages/react-native-tracing/src/sessionSpanProcessor.ts +++ b/packages/react-native-tracing/src/sessionSpanProcessor.ts @@ -1,10 +1,7 @@ import type { Context } from '@opentelemetry/api'; import type { ReadableSpan, Span, SpanProcessor } from '@opentelemetry/sdk-trace-web'; -// False positive. Package can be resolved. -// eslint-disable-next-line import/no-unresolved -import { ATTR_SESSION_ID } from '@opentelemetry/semantic-conventions/incubating'; -import type { Metas } from '@grafana/faro-web-sdk'; +import type { Metas } from '@grafana/react-native-sdk'; export class FaroSessionSpanProcessor implements SpanProcessor { constructor( @@ -20,7 +17,7 @@ export class FaroSessionSpanProcessor implements SpanProcessor { const session = this.metas.value.session; if (session?.id) { - span.attributes[ATTR_SESSION_ID] = session.id; + span.attributes["session.id"] = session.id; /** * @deprecated will be removed in the future and has been replaced by ATTR_SESSION_ID (session.id) */ diff --git a/packages/react-native-tracing/src/types.ts b/packages/react-native-tracing/src/types.ts index 519f78ddf..8a426bd27 100644 --- a/packages/react-native-tracing/src/types.ts +++ b/packages/react-native-tracing/src/types.ts @@ -6,7 +6,7 @@ import type { ResourceAttributes } from '@opentelemetry/resources'; import type { SpanProcessor } from '@opentelemetry/sdk-trace-web'; import type { Patterns } from '@grafana/faro-core'; -import type { API } from '@grafana/faro-web-sdk'; +import type { API } from '@grafana/react-native-sdk'; // type got remove by with experimental/v0.52.0 and is replaced by the following type: // See: https://github.com/open-telemetry/opentelemetry-js/releases/tag/experimental%2Fv0.52.0 diff --git a/packages/react-native-tracing/tsconfig.cjs.json b/packages/react-native-tracing/tsconfig.cjs.json index 6dabf9ec2..be65fcff9 100644 --- a/packages/react-native-tracing/tsconfig.cjs.json +++ b/packages/react-native-tracing/tsconfig.cjs.json @@ -4,9 +4,9 @@ "declarationDir": "./dist/types", "outDir": "./dist/cjs", "rootDir": "./src", - "tsBuildInfoFile": "../../.cache/tsc/webTracing.cjs.tsbuildinfo" + "tsBuildInfoFile": "../../.cache/tsc/rnTracing.cjs.tsbuildinfo" }, "include": ["./src"], "exclude": ["**/*.test.ts"], - "references": [{ "path": "../core/tsconfig.cjs.json" }, { "path": "../web-sdk/tsconfig.cjs.json" }] + "references": [{ "path": "../core/tsconfig.cjs.json" }, { "path": "../react-native-sdk/tsconfig.cjs.json" }] } diff --git a/packages/react-native-tracing/tsconfig.esm.json b/packages/react-native-tracing/tsconfig.esm.json index a1f9ee4a3..3aa61fb54 100644 --- a/packages/react-native-tracing/tsconfig.esm.json +++ b/packages/react-native-tracing/tsconfig.esm.json @@ -4,9 +4,9 @@ "declarationDir": "./dist/types", "outDir": "./dist/esm", "rootDir": "./src", - "tsBuildInfoFile": "../../.cache/tsc/webTracing.esm.tsbuildinfo" + "tsBuildInfoFile": "../../.cache/tsc/rnTracing.esm.tsbuildinfo" }, "include": ["./src"], "exclude": ["**/*.test.ts"], - "references": [{ "path": "../core/tsconfig.esm.json" }, { "path": "../web-sdk/tsconfig.esm.json" }] + "references": [{ "path": "../core/tsconfig.esm.json" }, { "path": "../react-native-sdk/tsconfig.esm.json" }] } diff --git a/packages/react-native-tracing/tsconfig.spec.json b/packages/react-native-tracing/tsconfig.spec.json index efbfc8b76..8f8f707fd 100644 --- a/packages/react-native-tracing/tsconfig.spec.json +++ b/packages/react-native-tracing/tsconfig.spec.json @@ -4,7 +4,7 @@ "declarationDir": "./dist/types", "outDir": "./dist/spec", "rootDir": "..", - "tsBuildInfoFile": "../../.cache/tsc/webTracing.spec.tsbuildinfo" + "tsBuildInfoFile": "../../.cache/tsc/rnTracing.spec.tsbuildinfo" }, "include": ["./src"], "references": [{ "path": "../core/tsconfig.spec.json" }] diff --git a/rollup.config.base.js b/rollup.config.base.js index a5cefd952..3efffd302 100644 --- a/rollup.config.base.js +++ b/rollup.config.base.js @@ -28,6 +28,18 @@ const modules = { globalName: 'GrafanaFaroWebTracing', externals: ['webSdk'], }, + rnSdk: { + name: '@grafana/react-native-sdk', + bundleName: 'react-native-sdk', + globalName: 'GrafanaFaroReactNativeSdk', + externals: [], + }, + rnTracing: { + name: '@grafana/react-native-tracing', + bundleName: 'react-native-tracing', + globalName: 'GrafanaFaroReactNativeTracing', + externals: ['rnSdk'], + }, transportOtlpHttp: { name: '@grafana/faro-transport-otlp-http', bundleName: 'faro-transport-otlp-http', From 6745ef611b13841ed9c3b3a6db7a4b298713daed Mon Sep 17 00:00:00 2001 From: Lucas Bento Date: Sat, 21 Dec 2024 14:41:04 +0100 Subject: [PATCH 05/43] feat: add initial `instrumentation-websocket` as experimental --- .../instrumentation-websocket/.browserslistrc | 1 + .../instrumentation-websocket/jest.config.js | 16 ++ .../instrumentation-websocket/package.json | 65 +++++++ .../rollup.config.js | 3 + .../instrumentation-websocket/src/index.ts | 1 + .../src/instrumentation.ts | 173 ++++++++++++++++++ .../tsconfig.cjs.json | 12 ++ .../tsconfig.esm.json | 12 ++ .../instrumentation-websocket/tsconfig.json | 10 + .../tsconfig.spec.json | 11 ++ packages/react-native-tracing/package.json | 1 + .../src/getDefaultOTELInstrumentations.ts | 22 ++- rollup.config.base.js | 6 + 13 files changed, 326 insertions(+), 7 deletions(-) create mode 100644 experimental/instrumentation-websocket/.browserslistrc create mode 100644 experimental/instrumentation-websocket/jest.config.js create mode 100644 experimental/instrumentation-websocket/package.json create mode 100644 experimental/instrumentation-websocket/rollup.config.js create mode 100644 experimental/instrumentation-websocket/src/index.ts create mode 100644 experimental/instrumentation-websocket/src/instrumentation.ts create mode 100644 experimental/instrumentation-websocket/tsconfig.cjs.json create mode 100644 experimental/instrumentation-websocket/tsconfig.esm.json create mode 100644 experimental/instrumentation-websocket/tsconfig.json create mode 100644 experimental/instrumentation-websocket/tsconfig.spec.json diff --git a/experimental/instrumentation-websocket/.browserslistrc b/experimental/instrumentation-websocket/.browserslistrc new file mode 100644 index 000000000..8528fd685 --- /dev/null +++ b/experimental/instrumentation-websocket/.browserslistrc @@ -0,0 +1 @@ +supports es6-module \ No newline at end of file diff --git a/experimental/instrumentation-websocket/jest.config.js b/experimental/instrumentation-websocket/jest.config.js new file mode 100644 index 000000000..8be2997df --- /dev/null +++ b/experimental/instrumentation-websocket/jest.config.js @@ -0,0 +1,16 @@ +const { jestBaseConfig } = require('../../jest.config.base.js'); + +module.exports = { + ...jestBaseConfig, + roots: ['experimental/instrumentation-websocket/src'], + testEnvironment: 'jsdom', + setupFiles: ['/experimental/instrumentation-websocket/src/setupTests.ts'], + moduleNameMapper: { + '^@remix-run/router$': '/index.ts', + '^@remix-run/web-blob$': require.resolve('@remix-run/web-blob'), + '^@remix-run/web-fetch$': require.resolve('@remix-run/web-fetch'), + '^@remix-run/web-form-data$': require.resolve('@remix-run/web-form-data'), + '^@remix-run/web-stream$': require.resolve('@remix-run/web-stream'), + '^@web3-storage/multipart-parser$': require.resolve('@web3-storage/multipart-parser'), + }, +}; diff --git a/experimental/instrumentation-websocket/package.json b/experimental/instrumentation-websocket/package.json new file mode 100644 index 000000000..eafd8865f --- /dev/null +++ b/experimental/instrumentation-websocket/package.json @@ -0,0 +1,65 @@ +{ + "name": "@grafana/faro-instrumentation-websocket", + "version": "0.0.1", + "description": "Faro WebSocket auto-instrumentation package", + "keywords": [ + "observability", + "apm", + "rum", + "logs", + "traces", + "metrics", + "websocket" + ], + "main": "./dist/cjs/index.js", + "module": "./dist/esm/index.js", + "types": "./dist/types/index.d.ts", + "scripts": { + "test": "jest", + "start": "yarn watch", + "build": "run-s build:*", + "build:compile": "run-p build:compile:*", + "build:compile:cjs": "tsc --build tsconfig.cjs.json", + "build:compile:esm": "tsc --build tsconfig.esm.json", + "build:compile:bundle": "run-s build:compile:bundle:*", + "build:compile:bundle:create": "rollup -c ./rollup.config.js", + "build:compile:bundle:remove-extras": "rimraf dist/bundle/dist", + "watch": "run-s watch:compile", + "watch:compile": "yarn build:compile:cjs -w", + "clean": "rimraf dist/ yarn-error.log", + "quality": "run-s quality:*", + "quality:test": "jest", + "quality:format": "prettier --cache --cache-location=../../.cache/prettier/instrumentationWebSocket --ignore-path ../../.prettierignore -w \"./**/*.{js,jsx,ts,tsx,css,scss,md,yaml,yml,json}\"", + "quality:lint": "run-s quality:lint:*", + "quality:lint:eslint": "eslint --cache --cache-location ../../.cache/eslint/instrumentationWebSocket --ignore-path ../../.eslintignore \"./**/*.{js,jsx,ts,tsx}\"", + "quality:lint:prettier": "prettier --cache --cache-location=../../.cache/prettier/instrumentationWebSocket --ignore-path ../../.prettierignore -c \"./**/*.{js,jsx,ts,tsx,css,scss,md,yaml,yml,json}\"", + "quality:lint:md": "markdownlint README.md", + "quality:circular-deps": "madge --circular ." + }, + "repository": { + "type": "git", + "url": "git+https://github.com/grafana/faro-web-sdk.git", + "directory": "experimental/instrumentation-websocket" + }, + "author": "Grafana Labs", + "license": "Apache-2.0", + "bugs": { + "url": "https://github.com/grafana/faro-web-sdk/issues" + }, + "homepage": "https://github.com/grafana/faro-web-sdk", + "dependencies": { + "@grafana/faro-core": "^1.12.2" + }, + "devDependencies": { + "@remix-run/web-fetch": "^4.3.4" + }, + "publishConfig": { + "access": "public" + }, + "files": [ + ".browserslistrc", + "dist", + "README.md", + "LICENSE" + ] +} diff --git a/experimental/instrumentation-websocket/rollup.config.js b/experimental/instrumentation-websocket/rollup.config.js new file mode 100644 index 000000000..ca5517ed0 --- /dev/null +++ b/experimental/instrumentation-websocket/rollup.config.js @@ -0,0 +1,3 @@ +const { getRollupConfigBase } = require('../../rollup.config.base.js'); + +module.exports = getRollupConfigBase('instrumentationWebSocket'); diff --git a/experimental/instrumentation-websocket/src/index.ts b/experimental/instrumentation-websocket/src/index.ts new file mode 100644 index 000000000..55ffc2ea6 --- /dev/null +++ b/experimental/instrumentation-websocket/src/index.ts @@ -0,0 +1 @@ +export { WebSocketInstrumentation } from './instrumentation'; diff --git a/experimental/instrumentation-websocket/src/instrumentation.ts b/experimental/instrumentation-websocket/src/instrumentation.ts new file mode 100644 index 000000000..a9edf7503 --- /dev/null +++ b/experimental/instrumentation-websocket/src/instrumentation.ts @@ -0,0 +1,173 @@ +import { context, diag, SpanKind, SpanStatusCode, trace } from '@opentelemetry/api'; +import { _globalThis } from '@opentelemetry/core'; +import { InstrumentationBase, InstrumentationNodeModuleDefinition, isWrapped } from '@opentelemetry/instrumentation'; + +const WS_MODULE = 'WebSocket'; + +const VERSION = '0.0.1'; + +// Helper function to check if URL is localhost +function isLocalhost(url: string): boolean { + try { + const wsUrl = new URL(url); + return wsUrl.hostname === 'localhost' || wsUrl.hostname === '127.0.0.1' || wsUrl.hostname === '[::1]'; + } catch { + return false; + } +} + +export class WebSocketInstrumentation extends InstrumentationBase { + readonly component: string = 'websocket'; + readonly version: string = VERSION; + moduleName = this.component; + constructor() { + super('faro-instrumentation-websocket', VERSION, {}); + } + + protected init() { + return [ + new InstrumentationNodeModuleDefinition( + WS_MODULE, + ['*'], + (moduleExports) => { + diag.debug('Patching WebSocket'); + return this._patchWebSocket(moduleExports); + }, + (moduleExports) => { + diag.debug('Unpatching WebSocket'); + return this._unpatchWebSocket(moduleExports); + } + ), + ]; + } + + /** + * Implements enable function + */ + override enable(): void { + if (typeof WebSocket === 'undefined') { + this._diag.error('WebSocket is not available in this environment'); + return; + } + + try { + if (isWrapped(_globalThis.WebSocket)) { + this._unwrap(_globalThis, 'WebSocket'); + this._diag.debug('removing previous patch for WebSocket'); + } + + this._wrap(_globalThis, 'WebSocket', this._patchWebSocket.bind(this)); + this._diag.debug('WebSocket instrumentation enabled'); + } catch (error) { + this._diag.error('Failed to enable WebSocket instrumentation', error); + } + } + + /** + * Implements disable function + */ + override disable(): void { + try { + if (isWrapped(_globalThis.WebSocket)) { + this._unwrap(_globalThis, 'WebSocket'); + this._diag.debug('WebSocket instrumentation disabled'); + } + } catch (error) { + this._diag.error('Failed to disable WebSocket instrumentation', error); + } + } + + private _patchWebSocket(original: typeof WebSocket): typeof WebSocket { + const self = this; + + return class PatchedWebSocket extends original { + private wsSpan: any; + private wsContext: any; + + constructor(url: string, protocols?: string | string[]) { + super(url, protocols); + + if (isLocalhost(url)) { + console.log('Skipping WebSocket instrumentation for localhost:', url); + return; + } + + const tracer = self.tracer; + this.wsSpan = tracer.startSpan('WebSocket.connect', { + kind: SpanKind.CLIENT, + attributes: { + 'websocket.url': url, + 'websocket.state': 'connecting', + }, + }); + + this.wsContext = trace.setSpan(context.active(), this.wsSpan); + + this.addEventListener('message', (event) => { + const messageSpan = tracer.startSpan( + 'websocket.receive', + { + kind: SpanKind.CLIENT, + attributes: { + 'websocket.url': url, + 'websocket.message_type': typeof event.data, + 'websocket.message_size': event.data?.length, + 'websocket.message_payload': event.data, + }, + }, + this.wsContext + ); + messageSpan.end(); + }); + + this.addEventListener('open', () => { + this.wsSpan.setAttribute('websocket.state', 'connected'); + }); + + this.addEventListener('error', (error: Event) => { + this.wsSpan.setStatus({ + code: SpanStatusCode.ERROR, + message: error instanceof ErrorEvent ? error.message : 'WebSocket error', + }); + this.wsSpan.setAttribute('websocket.state', 'error'); + }); + + this.addEventListener('close', () => { + this.wsSpan.setAttribute('websocket.state', 'closed'); + this.wsSpan.end(); + }); + + // Patch send method + const originalSend = this.send; + this.send = function (data: string) { + try { + originalSend.call(this, data); + const sendSpan = tracer.startSpan( + 'websocket.send', + { + kind: SpanKind.CLIENT, + attributes: { + 'websocket.url': url, + 'websocket.message_type': typeof data, + 'websocket.message_payload': data, + }, + }, + this.wsContext + ); + sendSpan.end(); + } catch (error: unknown) { + this.wsSpan.setStatus({ + code: SpanStatusCode.ERROR, + message: error instanceof Error ? error.message : 'Unknown error', + }); + throw error; + } + }; + } + } as typeof WebSocket; + } + + private _unpatchWebSocket(WebSocketClass: any) { + return WebSocketClass; + } +} diff --git a/experimental/instrumentation-websocket/tsconfig.cjs.json b/experimental/instrumentation-websocket/tsconfig.cjs.json new file mode 100644 index 000000000..c67096e3a --- /dev/null +++ b/experimental/instrumentation-websocket/tsconfig.cjs.json @@ -0,0 +1,12 @@ +{ + "extends": "../../tsconfig.base.cjs.json", + "compilerOptions": { + "declarationDir": "./dist/types", + "outDir": "./dist/cjs", + "rootDir": "./src", + "tsBuildInfoFile": "../../.cache/tsc/instrumentationWebSocket.cjs.tsbuildinfo" + }, + "include": ["./src"], + "exclude": ["**/*.test.ts"], + "references": [{ "path": "../../packages/core/tsconfig.spec.json" }] +} diff --git a/experimental/instrumentation-websocket/tsconfig.esm.json b/experimental/instrumentation-websocket/tsconfig.esm.json new file mode 100644 index 000000000..383db4138 --- /dev/null +++ b/experimental/instrumentation-websocket/tsconfig.esm.json @@ -0,0 +1,12 @@ +{ + "extends": "../../tsconfig.base.esm.json", + "compilerOptions": { + "declarationDir": "./dist/types", + "outDir": "./dist/esm", + "rootDir": "./src", + "tsBuildInfoFile": "../../.cache/tsc/instrumentationWebSocket.esm.tsbuildinfo" + }, + "include": ["./src"], + "exclude": ["**/*.test.ts"], + "references": [{ "path": "../../packages/core/tsconfig.spec.json" }] +} diff --git a/experimental/instrumentation-websocket/tsconfig.json b/experimental/instrumentation-websocket/tsconfig.json new file mode 100644 index 000000000..d622457a1 --- /dev/null +++ b/experimental/instrumentation-websocket/tsconfig.json @@ -0,0 +1,10 @@ +{ + "compilerOptions": { + "noPropertyAccessFromIndexSignature": false + }, + "references": [ + { "path": "./tsconfig.cjs.json" }, + { "path": "./tsconfig.esm.json" }, + { "path": "./tsconfig.spec.json" } + ] +} diff --git a/experimental/instrumentation-websocket/tsconfig.spec.json b/experimental/instrumentation-websocket/tsconfig.spec.json new file mode 100644 index 000000000..623546315 --- /dev/null +++ b/experimental/instrumentation-websocket/tsconfig.spec.json @@ -0,0 +1,11 @@ +{ + "extends": "../../tsconfig.base.spec.json", + "compilerOptions": { + "declarationDir": "./dist/types", + "outDir": "./dist/spec", + "rootDir": "../../", + "tsBuildInfoFile": "../../.cache/tsc/instrumentationWebSocket.spec.tsbuildinfo" + }, + "include": ["./src"], + "references": [{ "path": "../../packages/core/tsconfig.spec.json" }] +} diff --git a/packages/react-native-tracing/package.json b/packages/react-native-tracing/package.json index 3c44d14fe..f229110d2 100644 --- a/packages/react-native-tracing/package.json +++ b/packages/react-native-tracing/package.json @@ -52,6 +52,7 @@ "quality:circular-deps": "madge --circular ." }, "dependencies": { + "@grafana/faro-instrumentation-websocket": "*", "@grafana/faro-web-sdk": "^1.12.2", "@opentelemetry/api": "^1.9.0", "@opentelemetry/context-zone": "1.26.0", diff --git a/packages/react-native-tracing/src/getDefaultOTELInstrumentations.ts b/packages/react-native-tracing/src/getDefaultOTELInstrumentations.ts index 8ae12abcb..a55dfeeac 100644 --- a/packages/react-native-tracing/src/getDefaultOTELInstrumentations.ts +++ b/packages/react-native-tracing/src/getDefaultOTELInstrumentations.ts @@ -1,5 +1,8 @@ +// @ts-nocheck import { FetchInstrumentation } from '@opentelemetry/instrumentation-fetch'; +import { WebSocketInstrumentation } from '@grafana/faro-instrumentation-websocket'; + import { FaroXhrInstrumentation } from './faroXhrInstrumentation'; import { fetchCustomAttributeFunctionWithDefaults, @@ -13,11 +16,16 @@ export function getDefaultOTELInstrumentations(options: DefaultInstrumentationsO const fetchOpts = createFetchInstrumentationOptions(fetchInstrumentationOptions, sharedOptions); const xhrOpts = createXhrInstrumentationOptions(xhrInstrumentationOptions, sharedOptions); - return [new FetchInstrumentation(fetchOpts), new FaroXhrInstrumentation(xhrOpts)]; + return [ + new FetchInstrumentation(fetchOpts), + new FaroXhrInstrumentation(xhrOpts), + // TODO(@lucasbento): fix this type + new WebSocketInstrumentation(), + ]; } function createFetchInstrumentationOptions( - fetchInstrumentationOptions: DefaultInstrumentationsOptions['fetchInstrumentationOptions'], - sharedOptions: Record + fetchInstrumentationOptions: DefaultInstrumentationsOptions['fetchInstrumentationOptions'], + sharedOptions: Record ) { return { ...sharedOptions, @@ -26,14 +34,14 @@ function createFetchInstrumentationOptions( ...fetchInstrumentationOptions, // always keep this function applyCustomAttributesOnSpan: fetchCustomAttributeFunctionWithDefaults( - fetchInstrumentationOptions?.applyCustomAttributesOnSpan + fetchInstrumentationOptions?.applyCustomAttributesOnSpan ), }; } function createXhrInstrumentationOptions( - xhrInstrumentationOptions: DefaultInstrumentationsOptions['xhrInstrumentationOptions'], - sharedOptions: Record + xhrInstrumentationOptions: DefaultInstrumentationsOptions['xhrInstrumentationOptions'], + sharedOptions: Record ) { return { ...sharedOptions, @@ -42,7 +50,7 @@ function createXhrInstrumentationOptions( ...xhrInstrumentationOptions, // always keep this function applyCustomAttributesOnSpan: xhrCustomAttributeFunctionWithDefaults( - xhrInstrumentationOptions?.applyCustomAttributesOnSpan + xhrInstrumentationOptions?.applyCustomAttributesOnSpan ), }; } diff --git a/rollup.config.base.js b/rollup.config.base.js index a5cefd952..4a0d7e092 100644 --- a/rollup.config.base.js +++ b/rollup.config.base.js @@ -58,6 +58,12 @@ const modules = { globalName: 'GrafanaFaroInstrumentationK6Browser', externals: [], }, + instrumentationWebSocket: { + name: '@grafana/faro-instrumentation-websocket', + bundleName: 'faro-instrumentation-websocket', + globalName: 'GrafanaFaroInstrumentationWebSocket', + externals: [], + }, }; exports.getRollupConfigBase = (moduleName) => { From b008d43296aa3c5e05a79ebdc0ef87d5795212b6 Mon Sep 17 00:00:00 2001 From: Marco Caldera Date: Sat, 21 Dec 2024 15:18:28 +0100 Subject: [PATCH 06/43] feat: init react navigation --- packages/react-native-tracing/src/index.ts | 4 ++ .../src/react-navigation/dependencies.ts | 9 +++ .../src/react-navigation/index.ts | 2 + .../src/react-navigation/initialize.ts | 11 ++++ .../src/react-navigation/instrumentation.ts | 18 ++++++ .../src/react-navigation/metaPage.ts | 14 ++++ .../registerFaroReactNavigationContainer.ts | 64 +++++++++++++++++++ .../src/react-navigation/types.ts | 16 +++++ 8 files changed, 138 insertions(+) create mode 100644 packages/react-native-tracing/src/react-navigation/dependencies.ts create mode 100644 packages/react-native-tracing/src/react-navigation/index.ts create mode 100644 packages/react-native-tracing/src/react-navigation/initialize.ts create mode 100644 packages/react-native-tracing/src/react-navigation/instrumentation.ts create mode 100644 packages/react-native-tracing/src/react-navigation/metaPage.ts create mode 100644 packages/react-native-tracing/src/react-navigation/registerFaroReactNavigationContainer.ts create mode 100644 packages/react-native-tracing/src/react-navigation/types.ts diff --git a/packages/react-native-tracing/src/index.ts b/packages/react-native-tracing/src/index.ts index 7c3fa5448..673f63a33 100644 --- a/packages/react-native-tracing/src/index.ts +++ b/packages/react-native-tracing/src/index.ts @@ -11,3 +11,7 @@ export { getSamplingDecision } from './sampler'; export type { FaroTraceExporterConfig, TracingInstrumentationOptions } from './types'; export { setSpanStatusOnFetchError, fetchCustomAttributeFunctionWithDefaults } from './instrumentationUtils'; + +// react-navigation integration + +export { initializeReactNavigationInstrumentation, ReactNavigationIntegration } from './react-navigation'; diff --git a/packages/react-native-tracing/src/react-navigation/dependencies.ts b/packages/react-native-tracing/src/react-navigation/dependencies.ts new file mode 100644 index 000000000..6adbae7ed --- /dev/null +++ b/packages/react-native-tracing/src/react-navigation/dependencies.ts @@ -0,0 +1,9 @@ +import type { API, InternalLogger } from '@grafana/faro-web-sdk'; + +export let internalLogger: InternalLogger; +export let api: API; + +export function setDependencies(newInternalLogger: InternalLogger, newApi: API): void { + internalLogger = newInternalLogger; + api = newApi; +} diff --git a/packages/react-native-tracing/src/react-navigation/index.ts b/packages/react-native-tracing/src/react-navigation/index.ts new file mode 100644 index 000000000..385af2b32 --- /dev/null +++ b/packages/react-native-tracing/src/react-navigation/index.ts @@ -0,0 +1,2 @@ +export { initializeReactNavigationInstrumentation } from './initialize'; +export { ReactNavigationIntegration } from './instrumentation'; diff --git a/packages/react-native-tracing/src/react-navigation/initialize.ts b/packages/react-native-tracing/src/react-navigation/initialize.ts new file mode 100644 index 000000000..8a8bcbcaf --- /dev/null +++ b/packages/react-native-tracing/src/react-navigation/initialize.ts @@ -0,0 +1,11 @@ +import { registerFaroReactNavigationContainer } from './registerFaroReactNavigationContainer'; +import type { ReactNavigationInstrumentation } from './types'; + +/** + * Initializes React Navigation instrumentation for Faro + */ +export function initializeReactNavigationInstrumentation(): ReactNavigationInstrumentation { + return { + registerFaroReactNavigationContainer, + }; +} diff --git a/packages/react-native-tracing/src/react-navigation/instrumentation.ts b/packages/react-native-tracing/src/react-navigation/instrumentation.ts new file mode 100644 index 000000000..80628c277 --- /dev/null +++ b/packages/react-native-tracing/src/react-navigation/instrumentation.ts @@ -0,0 +1,18 @@ +import { BaseInstrumentation, VERSION } from '@grafana/faro-web-sdk'; + +import { setDependencies } from './dependencies'; +import { metaPage } from './metaPage'; + +export class ReactNavigationIntegration extends BaseInstrumentation { + name = '@grafana/faro-react-native-tracing'; + version = VERSION; + + constructor() { + super(); + } + + initialize(): void { + setDependencies(this.internalLogger, this.api); + this.metas.add(metaPage); + } +} diff --git a/packages/react-native-tracing/src/react-navigation/metaPage.ts b/packages/react-native-tracing/src/react-navigation/metaPage.ts new file mode 100644 index 000000000..ff10051fe --- /dev/null +++ b/packages/react-native-tracing/src/react-navigation/metaPage.ts @@ -0,0 +1,14 @@ +import type { Meta, MetaItem } from '@grafana/faro-core'; + +let currentRoute = 'startup'; + +export const metaPage: MetaItem> = () => ({ + page: { + id: currentRoute, + url: currentRoute, + }, +}); + +export function updateCurrentRoute(routeName: string): void { + currentRoute = routeName; +} diff --git a/packages/react-native-tracing/src/react-navigation/registerFaroReactNavigationContainer.ts b/packages/react-native-tracing/src/react-navigation/registerFaroReactNavigationContainer.ts new file mode 100644 index 000000000..555ca2a7d --- /dev/null +++ b/packages/react-native-tracing/src/react-navigation/registerFaroReactNavigationContainer.ts @@ -0,0 +1,64 @@ +import { EVENT_ROUTE_CHANGE } from '@grafana/faro-web-sdk'; + +import { api, internalLogger } from './dependencies'; +import { updateCurrentRoute } from './metaPage'; +import type { NavigationContainer, NavigationContainerRef } from './types'; + +let lastRoute: { + fromRoute?: string; +} = {}; + +/** + * Registers route change tracking for React Navigation. + + * @param navigationContainerRef Ref to a NavigationContainer + */ +export function registerFaroReactNavigationContainer(navigationContainerRef: NavigationContainerRef): void { + console.log('registerFaroReactNavigationContainer'); + let navigationContainer: NavigationContainer; + + // Handle both ref and direct container + if ('current' in navigationContainerRef) { + navigationContainer = navigationContainerRef.current; + } else { + navigationContainer = navigationContainerRef; + } + + if (!navigationContainer) { + internalLogger.warn('Received invalid navigation container ref'); + return; + } + + const initialRoute = navigationContainer.getCurrentRoute(); + if (initialRoute) { + api.setView({ + name: initialRoute.name, + }); + updateCurrentRoute(initialRoute.name); + } + + navigationContainer.addListener('state', () => { + const currentRoute = navigationContainer.getCurrentRoute(); + + if (!currentRoute) { + return; + } + + // Update view and page meta + api.setView({ + name: currentRoute.name, + }); + updateCurrentRoute(currentRoute.name); + + // Send route change event + api.pushEvent(EVENT_ROUTE_CHANGE, { + toRoute: currentRoute.name, + ...lastRoute, + }); + + // Update last route for next change + lastRoute = { + fromRoute: currentRoute.name, + }; + }); +} diff --git a/packages/react-native-tracing/src/react-navigation/types.ts b/packages/react-native-tracing/src/react-navigation/types.ts new file mode 100644 index 000000000..2de255d17 --- /dev/null +++ b/packages/react-native-tracing/src/react-navigation/types.ts @@ -0,0 +1,16 @@ +export interface NavigationRoute { + name: string; + key: string; + params?: Record; +} + +export interface NavigationContainer { + addListener: (type: string, listener: () => void) => void; + getCurrentRoute: () => NavigationRoute; +} + +export type NavigationContainerRef = { current: NavigationContainer } | NavigationContainer; + +export interface ReactNavigationInstrumentation { + registerFaroReactNavigationContainer: (navigationContainerRef: NavigationContainerRef) => void; +} From d26abdf12591b6628a6dd5ff912cdbc09c7240b4 Mon Sep 17 00:00:00 2001 From: Lucas Bento Date: Mon, 23 Dec 2024 12:56:25 +0100 Subject: [PATCH 07/43] feat: add WS message duration tracking --- .../src/instrumentation.ts | 57 ++++++++++++------- 1 file changed, 35 insertions(+), 22 deletions(-) diff --git a/experimental/instrumentation-websocket/src/instrumentation.ts b/experimental/instrumentation-websocket/src/instrumentation.ts index a9edf7503..5c27841ab 100644 --- a/experimental/instrumentation-websocket/src/instrumentation.ts +++ b/experimental/instrumentation-websocket/src/instrumentation.ts @@ -6,6 +6,7 @@ const WS_MODULE = 'WebSocket'; const VERSION = '0.0.1'; +// TODO(@lucasbento): move this somewhere else // Helper function to check if URL is localhost function isLocalhost(url: string): boolean { try { @@ -16,10 +17,17 @@ function isLocalhost(url: string): boolean { } } +// TODO(@lucasbento): move this somewhere else +function generateRequestId(): number { + return Math.floor(Math.random() * Number.MAX_SAFE_INTEGER); +} + export class WebSocketInstrumentation extends InstrumentationBase { readonly component: string = 'websocket'; readonly version: string = VERSION; moduleName = this.component; + private pendingRequests = new Map(); + constructor() { super('faro-instrumentation-websocket', VERSION, {}); } @@ -41,9 +49,6 @@ export class WebSocketInstrumentation extends InstrumentationBase { ]; } - /** - * Implements enable function - */ override enable(): void { if (typeof WebSocket === 'undefined') { this._diag.error('WebSocket is not available in this environment'); @@ -63,9 +68,6 @@ export class WebSocketInstrumentation extends InstrumentationBase { } } - /** - * Implements disable function - */ override disable(): void { try { if (isWrapped(_globalThis.WebSocket)) { @@ -104,20 +106,15 @@ export class WebSocketInstrumentation extends InstrumentationBase { this.wsContext = trace.setSpan(context.active(), this.wsSpan); this.addEventListener('message', (event) => { - const messageSpan = tracer.startSpan( - 'websocket.receive', - { - kind: SpanKind.CLIENT, - attributes: { - 'websocket.url': url, - 'websocket.message_type': typeof event.data, - 'websocket.message_size': event.data?.length, - 'websocket.message_payload': event.data, - }, - }, - this.wsContext - ); - messageSpan.end(); + try { + const response = JSON.parse(event.data); + if (response.requestId && self.pendingRequests.has(response.requestId)) { + const { span } = self.pendingRequests.get(response.requestId)!; + span.end(); + + self.pendingRequests.delete(response.requestId); + } + } catch (_ignored) {} }); this.addEventListener('open', () => { @@ -141,7 +138,16 @@ export class WebSocketInstrumentation extends InstrumentationBase { const originalSend = this.send; this.send = function (data: string) { try { - originalSend.call(this, data); + const requestId = generateRequestId(); + let modifiedData = data; + try { + const payload = JSON.parse(data); + payload.requestId = requestId; + modifiedData = JSON.stringify(payload); + } catch (e) { + self._diag.debug('Failed to modify payload, not JSON:', e); + } + const sendSpan = tracer.startSpan( 'websocket.send', { @@ -150,11 +156,18 @@ export class WebSocketInstrumentation extends InstrumentationBase { 'websocket.url': url, 'websocket.message_type': typeof data, 'websocket.message_payload': data, + 'websocket.request_id': requestId, }, }, this.wsContext ); - sendSpan.end(); + + self.pendingRequests.set(requestId, { + span: sendSpan, + startTime: Date.now(), + }); + + originalSend.call(this, modifiedData); } catch (error: unknown) { this.wsSpan.setStatus({ code: SpanStatusCode.ERROR, From 1615683a0fbde0a2aefc42d17a00aa0263bd80b9 Mon Sep 17 00:00:00 2001 From: Marco Caldera Date: Mon, 23 Dec 2024 15:42:20 +0100 Subject: [PATCH 08/43] fix: instrumentation navigation --- .../src/react-navigation/instrumentation.ts | 2 +- .../react-navigation/registerFaroReactNavigationContainer.ts | 5 ++--- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/packages/react-native-tracing/src/react-navigation/instrumentation.ts b/packages/react-native-tracing/src/react-navigation/instrumentation.ts index 80628c277..857f1c20d 100644 --- a/packages/react-native-tracing/src/react-navigation/instrumentation.ts +++ b/packages/react-native-tracing/src/react-navigation/instrumentation.ts @@ -4,7 +4,7 @@ import { setDependencies } from './dependencies'; import { metaPage } from './metaPage'; export class ReactNavigationIntegration extends BaseInstrumentation { - name = '@grafana/faro-react-native-tracing'; + name = '@grafana/faro-react-native-navigation-tracing'; version = VERSION; constructor() { diff --git a/packages/react-native-tracing/src/react-navigation/registerFaroReactNavigationContainer.ts b/packages/react-native-tracing/src/react-navigation/registerFaroReactNavigationContainer.ts index 555ca2a7d..cb1bcafbc 100644 --- a/packages/react-native-tracing/src/react-navigation/registerFaroReactNavigationContainer.ts +++ b/packages/react-native-tracing/src/react-navigation/registerFaroReactNavigationContainer.ts @@ -14,7 +14,6 @@ let lastRoute: { * @param navigationContainerRef Ref to a NavigationContainer */ export function registerFaroReactNavigationContainer(navigationContainerRef: NavigationContainerRef): void { - console.log('registerFaroReactNavigationContainer'); let navigationContainer: NavigationContainer; // Handle both ref and direct container @@ -29,6 +28,7 @@ export function registerFaroReactNavigationContainer(navigationContainerRef: Nav return; } + // Set initial route const initialRoute = navigationContainer.getCurrentRoute(); if (initialRoute) { api.setView({ @@ -37,14 +37,13 @@ export function registerFaroReactNavigationContainer(navigationContainerRef: Nav updateCurrentRoute(initialRoute.name); } + // Listen for route changes navigationContainer.addListener('state', () => { const currentRoute = navigationContainer.getCurrentRoute(); - if (!currentRoute) { return; } - // Update view and page meta api.setView({ name: currentRoute.name, }); From 4dfeaf2c2935837f788a9fd0bdf266df23420579 Mon Sep 17 00:00:00 2001 From: Marco Caldera Date: Tue, 24 Dec 2024 12:47:53 +0100 Subject: [PATCH 09/43] feat: improve code and add span --- .../src/react-navigation/handlers.ts | 113 ++++++++++++++++++ .../registerFaroReactNavigationContainer.ts | 76 +++++------- .../src/react-navigation/types.ts | 25 +++- 3 files changed, 167 insertions(+), 47 deletions(-) create mode 100644 packages/react-native-tracing/src/react-navigation/handlers.ts diff --git a/packages/react-native-tracing/src/react-navigation/handlers.ts b/packages/react-native-tracing/src/react-navigation/handlers.ts new file mode 100644 index 000000000..be2c2353c --- /dev/null +++ b/packages/react-native-tracing/src/react-navigation/handlers.ts @@ -0,0 +1,113 @@ +import { SpanStatusCode, Tracer } from '@opentelemetry/api'; + +import { EVENT_ROUTE_CHANGE } from '@grafana/faro-web-sdk'; + +import { api, internalLogger } from './dependencies'; +import { updateCurrentRoute } from './metaPage'; +import { NavigationContainer, NavigationState, ROUTE_CHANGE_TIMEOUT_MS, SPAN_ATTRIBUTES, SPAN_NAME } from './types'; + +/** + * Cleans up the navigation state and marks the span as failed. + */ +function discardNavigation(state: NavigationState, reason: string): void { + if (state.activeSpan) { + state.activeSpan.setStatus({ code: SpanStatusCode.ERROR, message: reason }); + state.activeSpan.end(); + state.activeSpan = undefined; + } + + if (state.stateChangeTimeout) { + clearTimeout(state.stateChangeTimeout); + state.stateChangeTimeout = undefined; + } +} + +/** + * Handles the start of a navigation action. + * Creates a new span and records the source route. + */ +export function handleNavigationStart( + state: NavigationState, + tracer: Tracer, + currentRoute: { name: string } | undefined +): void { + if (!currentRoute) { + return; + } + + // Clean up existing navigation if any + if (state.activeSpan) { + internalLogger.debug('Interrupting active navigation'); + discardNavigation(state, 'Navigation interrupted'); + } + + // Start new navigation span + state.activeSpan = tracer.startSpan(SPAN_NAME, { + attributes: { + [SPAN_ATTRIBUTES.type]: 'navigation', + [SPAN_ATTRIBUTES.fromRoute]: currentRoute.name, + }, + }); + + // Record source route + state.lastRoute = { fromRoute: currentRoute.name }; + + // Set timeout for navigation completion + state.stateChangeTimeout = setTimeout(() => { + internalLogger.debug('Navigation timeout exceeded'); + discardNavigation(state, 'Navigation timeout'); + }, ROUTE_CHANGE_TIMEOUT_MS); +} + +/** + * Handles the completion of a navigation action. + * Updates and completes the navigation span. + */ +export function handleNavigationComplete(state: NavigationState, currentRoute: { name: string } | undefined): void { + if (!currentRoute || !state.activeSpan) { + return; + } + + // Clear timeout since navigation completed + if (state.stateChangeTimeout) { + clearTimeout(state.stateChangeTimeout); + state.stateChangeTimeout = undefined; + } + + const { activeSpan, lastRoute } = state; + + // Update span with final route information + activeSpan.setAttributes({ + [SPAN_ATTRIBUTES.toRoute]: currentRoute.name, + [SPAN_ATTRIBUTES.fromRoute]: lastRoute.fromRoute ?? 'unknown', + }); + + // Complete the navigation span + activeSpan.setStatus({ code: SpanStatusCode.OK }); + activeSpan.end(); + state.activeSpan = undefined; + + // Update view and emit events + api.setView({ name: currentRoute.name }); + updateCurrentRoute(currentRoute.name); + + api.pushEvent(EVENT_ROUTE_CHANGE, { + toRoute: currentRoute.name, + ...lastRoute, + }); + + // Update route state + state.lastRoute = { fromRoute: currentRoute.name }; +} + +/** + * Initializes route tracking for the initial screen. + */ +export function initializeInitialRoute(navigationContainer: NavigationContainer, state: NavigationState): void { + const initialRoute = navigationContainer.getCurrentRoute(); + if (initialRoute && !state.isInitialized) { + api.setView({ name: initialRoute.name }); + updateCurrentRoute(initialRoute.name); + state.isInitialized = true; + } +} diff --git a/packages/react-native-tracing/src/react-navigation/registerFaroReactNavigationContainer.ts b/packages/react-native-tracing/src/react-navigation/registerFaroReactNavigationContainer.ts index cb1bcafbc..3e830a6d3 100644 --- a/packages/react-native-tracing/src/react-navigation/registerFaroReactNavigationContainer.ts +++ b/packages/react-native-tracing/src/react-navigation/registerFaroReactNavigationContainer.ts @@ -1,63 +1,47 @@ -import { EVENT_ROUTE_CHANGE } from '@grafana/faro-web-sdk'; - import { api, internalLogger } from './dependencies'; -import { updateCurrentRoute } from './metaPage'; -import type { NavigationContainer, NavigationContainerRef } from './types'; - -let lastRoute: { - fromRoute?: string; -} = {}; +import { handleNavigationComplete, handleNavigationStart, initializeInitialRoute } from './handlers'; +import type { NavigationContainerRef, NavigationState } from './types'; /** * Registers route change tracking for React Navigation. - - * @param navigationContainerRef Ref to a NavigationContainer + * Tracks navigation timing and emits route change events. + * + * @param navigationContainerRef - Ref to a NavigationContainer */ export function registerFaroReactNavigationContainer(navigationContainerRef: NavigationContainerRef): void { - let navigationContainer: NavigationContainer; - - // Handle both ref and direct container - if ('current' in navigationContainerRef) { - navigationContainer = navigationContainerRef.current; - } else { - navigationContainer = navigationContainerRef; - } + const navigationContainer = navigationContainerRef.current; if (!navigationContainer) { internalLogger.warn('Received invalid navigation container ref'); return; } - // Set initial route - const initialRoute = navigationContainer.getCurrentRoute(); - if (initialRoute) { - api.setView({ - name: initialRoute.name, - }); - updateCurrentRoute(initialRoute.name); + const otel = api.getOTEL(); + + if (!otel) { + internalLogger.warn('OpenTelemetry not initialized'); + return; } - // Listen for route changes + const tracer = otel.trace.getTracer('react-navigation'); + const navigationState: NavigationState = { + activeSpan: undefined, + lastRoute: {}, + isInitialized: false, + stateChangeTimeout: undefined, + }; + + initializeInitialRoute(navigationContainer, navigationState); + + // Listen for navigation event start (when an action 'navigate' is dispatched) + navigationContainer.addListener('__unsafe_action__', () => { + internalLogger.debug('Navigation start: ', navigationContainer.getCurrentRoute()); + handleNavigationStart(navigationState, tracer, navigationContainer.getCurrentRoute()); + }); + + // Listen for navigation event complete (when the action is completed) navigationContainer.addListener('state', () => { - const currentRoute = navigationContainer.getCurrentRoute(); - if (!currentRoute) { - return; - } - - api.setView({ - name: currentRoute.name, - }); - updateCurrentRoute(currentRoute.name); - - // Send route change event - api.pushEvent(EVENT_ROUTE_CHANGE, { - toRoute: currentRoute.name, - ...lastRoute, - }); - - // Update last route for next change - lastRoute = { - fromRoute: currentRoute.name, - }; + internalLogger.debug('Navigation complete: ', navigationContainer.getCurrentRoute()); + handleNavigationComplete(navigationState, navigationContainer.getCurrentRoute()); }); } diff --git a/packages/react-native-tracing/src/react-navigation/types.ts b/packages/react-native-tracing/src/react-navigation/types.ts index 2de255d17..63224389c 100644 --- a/packages/react-native-tracing/src/react-navigation/types.ts +++ b/packages/react-native-tracing/src/react-navigation/types.ts @@ -1,3 +1,5 @@ +import type { Span } from '@opentelemetry/api'; + export interface NavigationRoute { name: string; key: string; @@ -9,8 +11,29 @@ export interface NavigationContainer { getCurrentRoute: () => NavigationRoute; } -export type NavigationContainerRef = { current: NavigationContainer } | NavigationContainer; +export type NavigationContainerRef = { current: NavigationContainer }; export interface ReactNavigationInstrumentation { registerFaroReactNavigationContainer: (navigationContainerRef: NavigationContainerRef) => void; } + +export interface RouteState { + fromRoute?: string; +} + +export interface NavigationState { + activeSpan: Span | undefined; + lastRoute: RouteState; + isInitialized: boolean; + stateChangeTimeout?: ReturnType; +} + +export const SPAN_NAME = 'route-change'; + +export const SPAN_ATTRIBUTES = { + type: 'navigation.type', + fromRoute: 'navigation.from_route', + toRoute: 'navigation.to_route', +} as const; + +export const ROUTE_CHANGE_TIMEOUT_MS = 10000; From 02005ea399c47e18df0f01149db5698fc45fb572 Mon Sep 17 00:00:00 2001 From: Marco Caldera Date: Tue, 24 Dec 2024 13:08:39 +0100 Subject: [PATCH 10/43] feat: improve code and add span --- .../src/react-navigation/handlers.ts | 18 +++++++----------- .../src/react-navigation/metaPage.ts | 17 ++++++++++------- .../registerFaroReactNavigationContainer.ts | 9 ++------- .../src/react-navigation/types.ts | 6 +----- 4 files changed, 20 insertions(+), 30 deletions(-) diff --git a/packages/react-native-tracing/src/react-navigation/handlers.ts b/packages/react-native-tracing/src/react-navigation/handlers.ts index be2c2353c..2c1f9d150 100644 --- a/packages/react-native-tracing/src/react-navigation/handlers.ts +++ b/packages/react-native-tracing/src/react-navigation/handlers.ts @@ -3,7 +3,6 @@ import { SpanStatusCode, Tracer } from '@opentelemetry/api'; import { EVENT_ROUTE_CHANGE } from '@grafana/faro-web-sdk'; import { api, internalLogger } from './dependencies'; -import { updateCurrentRoute } from './metaPage'; import { NavigationContainer, NavigationState, ROUTE_CHANGE_TIMEOUT_MS, SPAN_ATTRIBUTES, SPAN_NAME } from './types'; /** @@ -40,18 +39,17 @@ export function handleNavigationStart( internalLogger.debug('Interrupting active navigation'); discardNavigation(state, 'Navigation interrupted'); } + // Record source route + state.fromRoute = currentRoute.name; // Start new navigation span state.activeSpan = tracer.startSpan(SPAN_NAME, { attributes: { [SPAN_ATTRIBUTES.type]: 'navigation', - [SPAN_ATTRIBUTES.fromRoute]: currentRoute.name, + [SPAN_ATTRIBUTES.fromRoute]: state.fromRoute, }, }); - // Record source route - state.lastRoute = { fromRoute: currentRoute.name }; - // Set timeout for navigation completion state.stateChangeTimeout = setTimeout(() => { internalLogger.debug('Navigation timeout exceeded'); @@ -74,12 +72,11 @@ export function handleNavigationComplete(state: NavigationState, currentRoute: { state.stateChangeTimeout = undefined; } - const { activeSpan, lastRoute } = state; + const { activeSpan, fromRoute } = state; // Update span with final route information activeSpan.setAttributes({ [SPAN_ATTRIBUTES.toRoute]: currentRoute.name, - [SPAN_ATTRIBUTES.fromRoute]: lastRoute.fromRoute ?? 'unknown', }); // Complete the navigation span @@ -89,15 +86,14 @@ export function handleNavigationComplete(state: NavigationState, currentRoute: { // Update view and emit events api.setView({ name: currentRoute.name }); - updateCurrentRoute(currentRoute.name); api.pushEvent(EVENT_ROUTE_CHANGE, { + fromRoute: fromRoute, toRoute: currentRoute.name, - ...lastRoute, }); // Update route state - state.lastRoute = { fromRoute: currentRoute.name }; + state.fromRoute = currentRoute.name; } /** @@ -107,7 +103,7 @@ export function initializeInitialRoute(navigationContainer: NavigationContainer, const initialRoute = navigationContainer.getCurrentRoute(); if (initialRoute && !state.isInitialized) { api.setView({ name: initialRoute.name }); - updateCurrentRoute(initialRoute.name); + state.fromRoute = initialRoute.name; state.isInitialized = true; } } diff --git a/packages/react-native-tracing/src/react-navigation/metaPage.ts b/packages/react-native-tracing/src/react-navigation/metaPage.ts index ff10051fe..669083101 100644 --- a/packages/react-native-tracing/src/react-navigation/metaPage.ts +++ b/packages/react-native-tracing/src/react-navigation/metaPage.ts @@ -1,14 +1,17 @@ import type { Meta, MetaItem } from '@grafana/faro-core'; -let currentRoute = 'startup'; +import type { NavigationState } from './types'; + +export const navigationState: NavigationState = { + activeSpan: undefined, + fromRoute: 'unknown', + isInitialized: false, // Not used yet + stateChangeTimeout: undefined, +}; export const metaPage: MetaItem> = () => ({ page: { - id: currentRoute, - url: currentRoute, + id: navigationState.fromRoute, + url: navigationState.fromRoute, }, }); - -export function updateCurrentRoute(routeName: string): void { - currentRoute = routeName; -} diff --git a/packages/react-native-tracing/src/react-navigation/registerFaroReactNavigationContainer.ts b/packages/react-native-tracing/src/react-navigation/registerFaroReactNavigationContainer.ts index 3e830a6d3..04fdd3d5f 100644 --- a/packages/react-native-tracing/src/react-navigation/registerFaroReactNavigationContainer.ts +++ b/packages/react-native-tracing/src/react-navigation/registerFaroReactNavigationContainer.ts @@ -1,6 +1,7 @@ import { api, internalLogger } from './dependencies'; import { handleNavigationComplete, handleNavigationStart, initializeInitialRoute } from './handlers'; -import type { NavigationContainerRef, NavigationState } from './types'; +import { navigationState } from './metaPage'; +import type { NavigationContainerRef } from './types'; /** * Registers route change tracking for React Navigation. @@ -24,12 +25,6 @@ export function registerFaroReactNavigationContainer(navigationContainerRef: Nav } const tracer = otel.trace.getTracer('react-navigation'); - const navigationState: NavigationState = { - activeSpan: undefined, - lastRoute: {}, - isInitialized: false, - stateChangeTimeout: undefined, - }; initializeInitialRoute(navigationContainer, navigationState); diff --git a/packages/react-native-tracing/src/react-navigation/types.ts b/packages/react-native-tracing/src/react-navigation/types.ts index 63224389c..2e32be6b9 100644 --- a/packages/react-native-tracing/src/react-navigation/types.ts +++ b/packages/react-native-tracing/src/react-navigation/types.ts @@ -17,13 +17,9 @@ export interface ReactNavigationInstrumentation { registerFaroReactNavigationContainer: (navigationContainerRef: NavigationContainerRef) => void; } -export interface RouteState { - fromRoute?: string; -} - export interface NavigationState { activeSpan: Span | undefined; - lastRoute: RouteState; + fromRoute: string; isInitialized: boolean; stateChangeTimeout?: ReturnType; } From 406c930fb1a485c9763dcaad76eb372cb61727d5 Mon Sep 17 00:00:00 2001 From: Lucas Bento Date: Wed, 25 Dec 2024 11:22:46 +0100 Subject: [PATCH 11/43] fix: undefined `ErrorEvent` in case of a WS error --- experimental/instrumentation-websocket/src/instrumentation.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/experimental/instrumentation-websocket/src/instrumentation.ts b/experimental/instrumentation-websocket/src/instrumentation.ts index 5c27841ab..2840570e2 100644 --- a/experimental/instrumentation-websocket/src/instrumentation.ts +++ b/experimental/instrumentation-websocket/src/instrumentation.ts @@ -124,7 +124,7 @@ export class WebSocketInstrumentation extends InstrumentationBase { this.addEventListener('error', (error: Event) => { this.wsSpan.setStatus({ code: SpanStatusCode.ERROR, - message: error instanceof ErrorEvent ? error.message : 'WebSocket error', + message: error instanceof Error ? error.message : 'WebSocket error', }); this.wsSpan.setAttribute('websocket.state', 'error'); }); From 4ae14e2b31dfa2cc3b1374b96cf018bfc25f5c2a Mon Sep 17 00:00:00 2001 From: Ilia Kurganskii Date: Wed, 25 Dec 2024 12:34:18 +0100 Subject: [PATCH 12/43] feat: add react-saga and axios packages --- .../.browserslistrc | 1 + .../instrumentation-otel-axios/README.md | 52 +++++ .../instrumentation-otel-axios/jest.config.js | 16 ++ .../instrumentation-otel-axios/package.json | 66 ++++++ .../rollup.config.js | 3 + .../src/constants.ts | 5 + .../instrumentation-otel-axios/src/index.ts | 1 + .../src/instrumentation.ts | 169 ++++++++++++++++ .../src/setupTests.ts | 12 ++ .../instrumentation-otel-axios/src/types.ts | 10 + .../tsconfig.cjs.json | 12 ++ .../tsconfig.esm.json | 12 ++ .../instrumentation-otel-axios/tsconfig.json | 10 + .../tsconfig.spec.json | 11 + .../.browserslistrc | 1 + .../instrumentation-otel-redux-saga/README.md | 52 +++++ .../jest.config.js | 16 ++ .../package.json | 69 +++++++ .../rollup.config.js | 3 + .../src/constants.ts | 5 + .../src/index.ts | 1 + .../src/instrumentation.ts | 190 ++++++++++++++++++ .../src/setupTests.ts | 12 ++ .../src/types.ts | 10 + .../tsconfig.cjs.json | 12 ++ .../tsconfig.esm.json | 12 ++ .../tsconfig.json | 10 + .../tsconfig.spec.json | 11 + packages/react-native-sdk/package.json | 2 +- .../react-native-sdk/src/transports/index.ts | 1 + packages/react-native-tracing/package.json | 1 - .../src/instrumentation.ts | 1 + rollup.config.base.js | 12 ++ yarn.lock | 100 ++++++--- 34 files changed, 871 insertions(+), 30 deletions(-) create mode 100644 experimental/instrumentation-otel-axios/.browserslistrc create mode 100644 experimental/instrumentation-otel-axios/README.md create mode 100644 experimental/instrumentation-otel-axios/jest.config.js create mode 100644 experimental/instrumentation-otel-axios/package.json create mode 100644 experimental/instrumentation-otel-axios/rollup.config.js create mode 100644 experimental/instrumentation-otel-axios/src/constants.ts create mode 100644 experimental/instrumentation-otel-axios/src/index.ts create mode 100644 experimental/instrumentation-otel-axios/src/instrumentation.ts create mode 100644 experimental/instrumentation-otel-axios/src/setupTests.ts create mode 100644 experimental/instrumentation-otel-axios/src/types.ts create mode 100644 experimental/instrumentation-otel-axios/tsconfig.cjs.json create mode 100644 experimental/instrumentation-otel-axios/tsconfig.esm.json create mode 100644 experimental/instrumentation-otel-axios/tsconfig.json create mode 100644 experimental/instrumentation-otel-axios/tsconfig.spec.json create mode 100644 experimental/instrumentation-otel-redux-saga/.browserslistrc create mode 100644 experimental/instrumentation-otel-redux-saga/README.md create mode 100644 experimental/instrumentation-otel-redux-saga/jest.config.js create mode 100644 experimental/instrumentation-otel-redux-saga/package.json create mode 100644 experimental/instrumentation-otel-redux-saga/rollup.config.js create mode 100644 experimental/instrumentation-otel-redux-saga/src/constants.ts create mode 100644 experimental/instrumentation-otel-redux-saga/src/index.ts create mode 100644 experimental/instrumentation-otel-redux-saga/src/instrumentation.ts create mode 100644 experimental/instrumentation-otel-redux-saga/src/setupTests.ts create mode 100644 experimental/instrumentation-otel-redux-saga/src/types.ts create mode 100644 experimental/instrumentation-otel-redux-saga/tsconfig.cjs.json create mode 100644 experimental/instrumentation-otel-redux-saga/tsconfig.esm.json create mode 100644 experimental/instrumentation-otel-redux-saga/tsconfig.json create mode 100644 experimental/instrumentation-otel-redux-saga/tsconfig.spec.json diff --git a/experimental/instrumentation-otel-axios/.browserslistrc b/experimental/instrumentation-otel-axios/.browserslistrc new file mode 100644 index 000000000..8528fd685 --- /dev/null +++ b/experimental/instrumentation-otel-axios/.browserslistrc @@ -0,0 +1 @@ +supports es6-module \ No newline at end of file diff --git a/experimental/instrumentation-otel-axios/README.md b/experimental/instrumentation-otel-axios/README.md new file mode 100644 index 000000000..de1855ade --- /dev/null +++ b/experimental/instrumentation-otel-axios/README.md @@ -0,0 +1,52 @@ +# @grafana/instrumentation-fetch + +Faro instrumentation of the JavaScript [Fetch](https://developer.mozilla.org/en-US/docs/Web/API/Fetch_API) API. + +❗️*Warning*: this package is experimental and may be subject to frequent and breaking changes. +Use at your own risk.❗️ + +## Installation and Usage + +❗️*Warning*: This package is not interoperable with `@opentelemetry/instrumentation-fetch`. +Use one or the other❗️ + +Add the instrumentation as outlined below. +The instrumentation send the following events alongside respective request/response data like HTTP +headers and other response properties like status codes the requests url and more. + +Event names are: + +- `faro.fetch.resolved` for resolved requests. +- `faro.fetch.rejected` for rejected requests. + +```ts +// index.ts +import { FetchInstrumentation } from '@grafana/faro-instrumentation-fetch'; +import { getWebInstrumentations, initializeFaro } from '@grafana/faro-react'; + +initializeFaro({ + // ... + instrumentations: [ + // Load the default Web instrumentations + ...getWebInstrumentations(), + // Add fetch instrumentation + new FetchInstrumentation(), + ], +}); + + +// myApi.ts +fetch(...) // Use fetch as normal - telemetry data is sent to your Faro endpoint +``` + +## Backend correlation + +In order to prepare backend correlation, this instrumentation adds the following headers to each +request that server-side instrumentation can use as context: + +- `x-faro-session` - the client-side session id + +## Planned Development + +- Additional functionality to correlate frontend requests with backend actions +- Event attributes with end-to-end timing details diff --git a/experimental/instrumentation-otel-axios/jest.config.js b/experimental/instrumentation-otel-axios/jest.config.js new file mode 100644 index 000000000..bfeb62baa --- /dev/null +++ b/experimental/instrumentation-otel-axios/jest.config.js @@ -0,0 +1,16 @@ +const { jestBaseConfig } = require('../../jest.config.base.js'); + +module.exports = { + ...jestBaseConfig, + roots: ['experimental/instrumentation-fetch/src'], + testEnvironment: 'jsdom', + setupFiles: ['/experimental/instrumentation-fetch/src/setupTests.ts'], + moduleNameMapper: { + '^@remix-run/router$': '/index.ts', + '^@remix-run/web-blob$': require.resolve('@remix-run/web-blob'), + '^@remix-run/web-fetch$': require.resolve('@remix-run/web-fetch'), + '^@remix-run/web-form-data$': require.resolve('@remix-run/web-form-data'), + '^@remix-run/web-stream$': require.resolve('@remix-run/web-stream'), + '^@web3-storage/multipart-parser$': require.resolve('@web3-storage/multipart-parser'), + }, +}; diff --git a/experimental/instrumentation-otel-axios/package.json b/experimental/instrumentation-otel-axios/package.json new file mode 100644 index 000000000..6919846de --- /dev/null +++ b/experimental/instrumentation-otel-axios/package.json @@ -0,0 +1,66 @@ +{ + "name": "@grafana/faro-instrumentation-otel-axios", + "version": "1.12.2", + "description": "Faro axios open telemetry auto-instrumentation package", + "keywords": [ + "observability", + "apm", + "rum", + "logs", + "traces", + "metrics", + "fetch" + ], + "main": "./dist/cjs/index.js", + "module": "./dist/esm/index.js", + "types": "./dist/types/index.d.ts", + "scripts": { + "test": "jest", + "start": "yarn watch", + "build": "run-s build:*", + "build:compile": "run-p build:compile:*", + "build:compile:cjs": "tsc --build tsconfig.cjs.json", + "build:compile:esm": "tsc --build tsconfig.esm.json", + "build:compile:bundle": "run-s build:compile:bundle:*", + "build:compile:bundle:create": "rollup -c ./rollup.config.js", + "build:compile:bundle:remove-extras": "rimraf dist/bundle/dist", + "watch": "run-s watch:compile", + "watch:compile": "yarn build:compile:cjs -w", + "clean": "rimraf dist/ yarn-error.log", + "quality": "run-s quality:*", + "quality:test": "jest", + "quality:format": "prettier --cache --cache-location=../../.cache/prettier/instrumentationOtelAxios --ignore-path ../../.prettierignore -w \"./**/*.{js,jsx,ts,tsx,css,scss,md,yaml,yml,json}\"", + "quality:lint": "run-s quality:lint:*", + "quality:lint:eslint": "eslint --cache --cache-location ../../.cache/eslint/instrumentationOtelAxios --ignore-path ../../.eslintignore \"./**/*.{js,jsx,ts,tsx}\"", + "quality:lint:prettier": "prettier --cache --cache-location=../../.cache/prettier/instrumentationOtelAxios --ignore-path ../../.prettierignore -c \"./**/*.{js,jsx,ts,tsx,css,scss,md,yaml,yml,json}\"", + "quality:lint:md": "markdownlint README.md", + "quality:circular-deps": "madge --circular ." + }, + "repository": { + "type": "git", + "url": "git+https://github.com/grafana/faro-web-sdk.git", + "directory": "experimental/instrumentation-fetch" + }, + "author": "Grafana Labs", + "license": "Apache-2.0", + "bugs": { + "url": "https://github.com/grafana/faro-web-sdk/issues" + }, + "homepage": "https://github.com/grafana/faro-web-sdk", + "dependencies": { + "@grafana/faro-core": "^1.12.2", + "@opentelemetry/api": "^1.9.0" + }, + "peerDependencies": { + "axios": "*" + }, + "publishConfig": { + "access": "public" + }, + "files": [ + ".browserslistrc", + "dist", + "README.md", + "LICENSE" + ] +} diff --git a/experimental/instrumentation-otel-axios/rollup.config.js b/experimental/instrumentation-otel-axios/rollup.config.js new file mode 100644 index 000000000..c329a1c0a --- /dev/null +++ b/experimental/instrumentation-otel-axios/rollup.config.js @@ -0,0 +1,3 @@ +const { getRollupConfigBase } = require('../../rollup.config.base.js'); + +module.exports = getRollupConfigBase('instrumentationOtelAxios'); diff --git a/experimental/instrumentation-otel-axios/src/constants.ts b/experimental/instrumentation-otel-axios/src/constants.ts new file mode 100644 index 000000000..d6cf7ca33 --- /dev/null +++ b/experimental/instrumentation-otel-axios/src/constants.ts @@ -0,0 +1,5 @@ +export enum AttributeNames { + COMPONENT = 'component', + HTTP_ERROR_NAME = 'http.error_name', + HTTP_STATUS_TEXT = 'http.status_text' +} diff --git a/experimental/instrumentation-otel-axios/src/index.ts b/experimental/instrumentation-otel-axios/src/index.ts new file mode 100644 index 000000000..2914f398b --- /dev/null +++ b/experimental/instrumentation-otel-axios/src/index.ts @@ -0,0 +1 @@ +export { AxiosInstrumentation } from './instrumentation'; diff --git a/experimental/instrumentation-otel-axios/src/instrumentation.ts b/experimental/instrumentation-otel-axios/src/instrumentation.ts new file mode 100644 index 000000000..2070d2313 --- /dev/null +++ b/experimental/instrumentation-otel-axios/src/instrumentation.ts @@ -0,0 +1,169 @@ +import * as api from '@opentelemetry/api'; +import * as core from '@opentelemetry/core'; +import { InstrumentationBase, isWrapped } from '@opentelemetry/instrumentation'; +import * as web from '@opentelemetry/sdk-trace-web'; +import { + SEMATTRS_HTTP_HOST, + SEMATTRS_HTTP_METHOD, + SEMATTRS_HTTP_SCHEME, + SEMATTRS_HTTP_STATUS_CODE, + SEMATTRS_HTTP_URL, + SEMATTRS_HTTP_USER_AGENT +} from '@opentelemetry/semantic-conventions'; +import { Axios, AxiosInstance, AxiosRequestConfig, AxiosResponse } from 'axios'; + +import {AttributeNames} from "./constants"; +import type {AxiosInstrumentationOptions} from "./types"; + +/** + * Additional custom attribute names + */ + + +export const VERSION = '1.12.3'; + +/** + * Configuration interface for the AxiosInstrumentation + */ + + +export class AxiosInstrumentation extends InstrumentationBase { + readonly component: string = 'axios'; + + readonly version: string = VERSION; + + moduleName = this.component; + + constructor(config: AxiosInstrumentationOptions = {}) { + super('@grafana/instrumentation-axios', VERSION, config); + this.enable = this.enable.bind(this); + this.disable = this.disable.bind(this); + } + + init(): void { + // no-op + } + + private _addFinalSpanAttributes(span: api.Span, response: AxiosResponse) { + const responseUrl = `${response.config.baseURL ?? ''}/${response.config.url}`; + const parsedUrl = web.parseUrl(responseUrl); + + span.updateName(`${response.config.method?.toUpperCase()}`); + span.setAttribute(SEMATTRS_HTTP_STATUS_CODE, response.status); + if (response.statusText != null) { + span.setAttribute(AttributeNames.HTTP_STATUS_TEXT, response.statusText); + } + span.setAttribute(SEMATTRS_HTTP_HOST, parsedUrl.host); + span.setAttribute(SEMATTRS_HTTP_SCHEME, parsedUrl.protocol.replace(':', '')); + if (typeof navigator !== 'undefined') { + span.setAttribute(SEMATTRS_HTTP_USER_AGENT, navigator.userAgent); + } + } + + private _addAxiosHeaders(config: AxiosRequestConfig): void { + const headers: Record = config.headers || {}; + api.propagation.inject(api.context.active(), headers); + // @ts-ignore + config.headers = headers; + } + + private createSpan(url: string, options: Partial = {}): api.Span | undefined { + if (core.isUrlIgnored(url, this.getConfig().ignoreUrls)) { + this._diag.debug('ignoring span as url matches ignored url'); + return; + } + + const method = (options.method || 'GET').toUpperCase(); + const spanName = `HTTP ${method}`; + + return this.tracer.startSpan(spanName, { + kind: api.SpanKind.CLIENT, + attributes: { + [AttributeNames.COMPONENT]: this.moduleName, + [SEMATTRS_HTTP_METHOD]: method, + [SEMATTRS_HTTP_URL]: url + } + }); + } + + private _endSpan(span: api.Span, response?: AxiosResponse, error?: Error) { + const endTime = core.millisToHrTime(Date.now()); + + if (response) { + // It's an AxiosResponse + this._addFinalSpanAttributes(span, response); + + if (response.status >= 400) { + span.setStatus({ code: api.SpanStatusCode.ERROR }); + } else { + span.setStatus({ code: api.SpanStatusCode.OK }); + } + } else if (error) { + // It's an error object + span.setStatus({ code: api.SpanStatusCode.ERROR, message: error.message }); + if (error.name) { + span.setAttribute(AttributeNames.HTTP_ERROR_NAME, error.name); + } + } + + span.end(endTime); + } + + private _patchAxios() { + const plugin = this; + + // Wrap axios.request + if (isWrapped(Axios.prototype.request)) { + plugin._unwrap(Axios.prototype, 'request'); + } + + plugin._wrap(Axios.prototype, 'request', (original: , D=any>(config: AxiosRequestConfig) => Promise) => { + return function patchRequest, D = any>(this: AxiosInstance, requestConfig: AxiosRequestConfig): Promise { + const url = requestConfig.url ?? ''; + + // Create a new span if the URL is not ignored + const span = plugin.createSpan(url, { method: requestConfig.method }); + if (!span) { + return original.apply(this, [requestConfig]) as Promise; + } + + return api.context.with(api.trace.setSpan(api.context.active(), span), () => { + plugin._addAxiosHeaders(requestConfig); + + return (original + .apply(this, [requestConfig]) as Promise) + .then((response: R) => { + try { + plugin._endSpan(span, response as AxiosResponse); + } catch (e) { + plugin._diag.error('Error ending span', e); + } + return response; + }) + .catch((error: any) => { + plugin._endSpan( + span, + undefined, + error?.response || { + message: error?.message || 'Unknown error', + name: error?.name || 'Error' + } + ); + throw error; + }); + }); + }; + }); + + } + + override enable(): void { + // Patch the instance passed in via this._config + this._patchAxios(); + } + + override disable(): void { + // Unwrap the instance + this._unwrap(Axios.prototype, 'request'); + } +} diff --git a/experimental/instrumentation-otel-axios/src/setupTests.ts b/experimental/instrumentation-otel-axios/src/setupTests.ts new file mode 100644 index 000000000..c9c335837 --- /dev/null +++ b/experimental/instrumentation-otel-axios/src/setupTests.ts @@ -0,0 +1,12 @@ +import { fetch, Request, Response } from '@remix-run/web-fetch'; + +if (!globalThis.fetch) { + // @ts-expect-error + globalThis.fetch = fetch; + + // @ts-expect-error + globalThis.Request = Request; + + // @ts-expect-error + globalThis.Response = Response; +} diff --git a/experimental/instrumentation-otel-axios/src/types.ts b/experimental/instrumentation-otel-axios/src/types.ts new file mode 100644 index 000000000..0eb796e2e --- /dev/null +++ b/experimental/instrumentation-otel-axios/src/types.ts @@ -0,0 +1,10 @@ +import type {InstrumentationConfig} from "@opentelemetry/instrumentation"; +import type * as web from "@opentelemetry/sdk-trace-web"; + +export interface AxiosInstrumentationOptions extends InstrumentationConfig { + clearTimingResources?: boolean; + propagateTraceHeaderCorsUrls?: web.PropagateTraceHeaderCorsUrls; + ignoreUrls?: Array; + ignoreNetworkEvents?: boolean; + measureRequestSize?: boolean; +} diff --git a/experimental/instrumentation-otel-axios/tsconfig.cjs.json b/experimental/instrumentation-otel-axios/tsconfig.cjs.json new file mode 100644 index 000000000..249bffbb6 --- /dev/null +++ b/experimental/instrumentation-otel-axios/tsconfig.cjs.json @@ -0,0 +1,12 @@ +{ + "extends": "../../tsconfig.base.cjs.json", + "compilerOptions": { + "declarationDir": "./dist/types", + "outDir": "./dist/cjs", + "rootDir": "./src", + "tsBuildInfoFile": "../../.cache/tsc/instrumentationOtelAxios.cjs.tsbuildinfo" + }, + "include": ["./src"], + "exclude": ["**/*.test.ts"], + "references": [{ "path": "../../packages/core/tsconfig.spec.json" }] +} diff --git a/experimental/instrumentation-otel-axios/tsconfig.esm.json b/experimental/instrumentation-otel-axios/tsconfig.esm.json new file mode 100644 index 000000000..1358c23bf --- /dev/null +++ b/experimental/instrumentation-otel-axios/tsconfig.esm.json @@ -0,0 +1,12 @@ +{ + "extends": "../../tsconfig.base.esm.json", + "compilerOptions": { + "declarationDir": "./dist/types", + "outDir": "./dist/esm", + "rootDir": "./src", + "tsBuildInfoFile": "../../.cache/tsc/instrumentationOtelAxios.esm.tsbuildinfo" + }, + "include": ["./src"], + "exclude": ["**/*.test.ts"], + "references": [{ "path": "../../packages/core/tsconfig.spec.json" }] +} diff --git a/experimental/instrumentation-otel-axios/tsconfig.json b/experimental/instrumentation-otel-axios/tsconfig.json new file mode 100644 index 000000000..d622457a1 --- /dev/null +++ b/experimental/instrumentation-otel-axios/tsconfig.json @@ -0,0 +1,10 @@ +{ + "compilerOptions": { + "noPropertyAccessFromIndexSignature": false + }, + "references": [ + { "path": "./tsconfig.cjs.json" }, + { "path": "./tsconfig.esm.json" }, + { "path": "./tsconfig.spec.json" } + ] +} diff --git a/experimental/instrumentation-otel-axios/tsconfig.spec.json b/experimental/instrumentation-otel-axios/tsconfig.spec.json new file mode 100644 index 000000000..74612da48 --- /dev/null +++ b/experimental/instrumentation-otel-axios/tsconfig.spec.json @@ -0,0 +1,11 @@ +{ + "extends": "../../tsconfig.base.spec.json", + "compilerOptions": { + "declarationDir": "./dist/types", + "outDir": "./dist/spec", + "rootDir": "../../", + "tsBuildInfoFile": "../../.cache/tsc/instrumentationOtelAxios.spec.tsbuildinfo" + }, + "include": ["./src"], + "references": [{ "path": "../../packages/core/tsconfig.spec.json" }] +} diff --git a/experimental/instrumentation-otel-redux-saga/.browserslistrc b/experimental/instrumentation-otel-redux-saga/.browserslistrc new file mode 100644 index 000000000..8528fd685 --- /dev/null +++ b/experimental/instrumentation-otel-redux-saga/.browserslistrc @@ -0,0 +1 @@ +supports es6-module \ No newline at end of file diff --git a/experimental/instrumentation-otel-redux-saga/README.md b/experimental/instrumentation-otel-redux-saga/README.md new file mode 100644 index 000000000..de1855ade --- /dev/null +++ b/experimental/instrumentation-otel-redux-saga/README.md @@ -0,0 +1,52 @@ +# @grafana/instrumentation-fetch + +Faro instrumentation of the JavaScript [Fetch](https://developer.mozilla.org/en-US/docs/Web/API/Fetch_API) API. + +❗️*Warning*: this package is experimental and may be subject to frequent and breaking changes. +Use at your own risk.❗️ + +## Installation and Usage + +❗️*Warning*: This package is not interoperable with `@opentelemetry/instrumentation-fetch`. +Use one or the other❗️ + +Add the instrumentation as outlined below. +The instrumentation send the following events alongside respective request/response data like HTTP +headers and other response properties like status codes the requests url and more. + +Event names are: + +- `faro.fetch.resolved` for resolved requests. +- `faro.fetch.rejected` for rejected requests. + +```ts +// index.ts +import { FetchInstrumentation } from '@grafana/faro-instrumentation-fetch'; +import { getWebInstrumentations, initializeFaro } from '@grafana/faro-react'; + +initializeFaro({ + // ... + instrumentations: [ + // Load the default Web instrumentations + ...getWebInstrumentations(), + // Add fetch instrumentation + new FetchInstrumentation(), + ], +}); + + +// myApi.ts +fetch(...) // Use fetch as normal - telemetry data is sent to your Faro endpoint +``` + +## Backend correlation + +In order to prepare backend correlation, this instrumentation adds the following headers to each +request that server-side instrumentation can use as context: + +- `x-faro-session` - the client-side session id + +## Planned Development + +- Additional functionality to correlate frontend requests with backend actions +- Event attributes with end-to-end timing details diff --git a/experimental/instrumentation-otel-redux-saga/jest.config.js b/experimental/instrumentation-otel-redux-saga/jest.config.js new file mode 100644 index 000000000..bfeb62baa --- /dev/null +++ b/experimental/instrumentation-otel-redux-saga/jest.config.js @@ -0,0 +1,16 @@ +const { jestBaseConfig } = require('../../jest.config.base.js'); + +module.exports = { + ...jestBaseConfig, + roots: ['experimental/instrumentation-fetch/src'], + testEnvironment: 'jsdom', + setupFiles: ['/experimental/instrumentation-fetch/src/setupTests.ts'], + moduleNameMapper: { + '^@remix-run/router$': '/index.ts', + '^@remix-run/web-blob$': require.resolve('@remix-run/web-blob'), + '^@remix-run/web-fetch$': require.resolve('@remix-run/web-fetch'), + '^@remix-run/web-form-data$': require.resolve('@remix-run/web-form-data'), + '^@remix-run/web-stream$': require.resolve('@remix-run/web-stream'), + '^@web3-storage/multipart-parser$': require.resolve('@web3-storage/multipart-parser'), + }, +}; diff --git a/experimental/instrumentation-otel-redux-saga/package.json b/experimental/instrumentation-otel-redux-saga/package.json new file mode 100644 index 000000000..07d0c048f --- /dev/null +++ b/experimental/instrumentation-otel-redux-saga/package.json @@ -0,0 +1,69 @@ +{ + "name": "@grafana/faro-instrumentation-otel-redux-saga", + "version": "1.12.2", + "description": "Faro redux-saga open telemetry auto-instrumentation package", + "keywords": [ + "observability", + "apm", + "rum", + "logs", + "traces", + "metrics", + "fetch" + ], + "main": "./dist/cjs/index.js", + "module": "./dist/esm/index.js", + "types": "./dist/types/index.d.ts", + "scripts": { + "test": "jest", + "start": "yarn watch", + "build": "run-s build:*", + "build:compile": "run-p build:compile:*", + "build:compile:cjs": "tsc --build tsconfig.cjs.json", + "build:compile:esm": "tsc --build tsconfig.esm.json", + "build:compile:bundle": "run-s build:compile:bundle:*", + "build:compile:bundle:create": "rollup -c ./rollup.config.js", + "build:compile:bundle:remove-extras": "rimraf dist/bundle/dist", + "watch": "run-s watch:compile", + "watch:compile": "yarn build:compile:cjs -w", + "clean": "rimraf dist/ yarn-error.log", + "quality": "run-s quality:*", + "quality:test": "jest", + "quality:format": "prettier --cache --cache-location=../../.cache/prettier/instrumentationOtelAxios --ignore-path ../../.prettierignore -w \"./**/*.{js,jsx,ts,tsx,css,scss,md,yaml,yml,json}\"", + "quality:lint": "run-s quality:lint:*", + "quality:lint:eslint": "eslint --cache --cache-location ../../.cache/eslint/instrumentationOtelAxios --ignore-path ../../.eslintignore \"./**/*.{js,jsx,ts,tsx}\"", + "quality:lint:prettier": "prettier --cache --cache-location=../../.cache/prettier/instrumentationOtelAxios --ignore-path ../../.prettierignore -c \"./**/*.{js,jsx,ts,tsx,css,scss,md,yaml,yml,json}\"", + "quality:lint:md": "markdownlint README.md", + "quality:circular-deps": "madge --circular ." + }, + "repository": { + "type": "git", + "url": "git+https://github.com/grafana/faro-web-sdk.git", + "directory": "experimental/instrumentation-fetch" + }, + "author": "Grafana Labs", + "license": "Apache-2.0", + "bugs": { + "url": "https://github.com/grafana/faro-web-sdk/issues" + }, + "homepage": "https://github.com/grafana/faro-web-sdk", + "dependencies": { + "@grafana/faro-core": "^1.12.2", + "@opentelemetry/api": "^1.9.0" + }, + "devDependencies": { + "redux-saga": "^1.3.0" + }, + "peerDependencies": { + "redux-saga": "^1" + }, + "publishConfig": { + "access": "public" + }, + "files": [ + ".browserslistrc", + "dist", + "README.md", + "LICENSE" + ] +} diff --git a/experimental/instrumentation-otel-redux-saga/rollup.config.js b/experimental/instrumentation-otel-redux-saga/rollup.config.js new file mode 100644 index 000000000..84883e990 --- /dev/null +++ b/experimental/instrumentation-otel-redux-saga/rollup.config.js @@ -0,0 +1,3 @@ +const { getRollupConfigBase } = require('../../rollup.config.base.js'); + +module.exports = getRollupConfigBase('instrumentationOtelReduxSaga'); diff --git a/experimental/instrumentation-otel-redux-saga/src/constants.ts b/experimental/instrumentation-otel-redux-saga/src/constants.ts new file mode 100644 index 000000000..d6cf7ca33 --- /dev/null +++ b/experimental/instrumentation-otel-redux-saga/src/constants.ts @@ -0,0 +1,5 @@ +export enum AttributeNames { + COMPONENT = 'component', + HTTP_ERROR_NAME = 'http.error_name', + HTTP_STATUS_TEXT = 'http.status_text' +} diff --git a/experimental/instrumentation-otel-redux-saga/src/index.ts b/experimental/instrumentation-otel-redux-saga/src/index.ts new file mode 100644 index 000000000..d5f1e3972 --- /dev/null +++ b/experimental/instrumentation-otel-redux-saga/src/index.ts @@ -0,0 +1 @@ +export { ReduxSagaInstrumentation } from './instrumentation'; diff --git a/experimental/instrumentation-otel-redux-saga/src/instrumentation.ts b/experimental/instrumentation-otel-redux-saga/src/instrumentation.ts new file mode 100644 index 000000000..d7f2f92d6 --- /dev/null +++ b/experimental/instrumentation-otel-redux-saga/src/instrumentation.ts @@ -0,0 +1,190 @@ +import * as api from '@opentelemetry/api'; +import {Span, SpanStatusCode} from '@opentelemetry/api'; +import {InstrumentationBase} from '@opentelemetry/instrumentation'; +import type {InstrumentationConfig} from '@opentelemetry/instrumentation'; +import type {SagaMonitor} from 'redux-saga'; +import type {CallEffect, PutEffect} from 'redux-saga/effects'; + +export interface ReduxSagaInstrumentationConfig extends InstrumentationConfig { + // Add any custom config fields you'd like here. + // For example, you might ignore certain effect types, or customize naming, etc. + shouldPropagateTraceContextPut?: (effect: PutEffect) => boolean; + propagateContextToCall?: (effect: CallEffect) => boolean; +} + +/** + * A minimal SagaMonitor-based instrumentation for Redux-Saga. + */ +export class ReduxSagaInstrumentation extends InstrumentationBase { + private _spans: Map = new Map(); + + constructor(config: ReduxSagaInstrumentationConfig = {}) { + super('@example/redux-saga-instrumentation', '1.0.0', config); + } + + init() {} + + /** + * Returns a custom sagaMonitor that starts/ends spans for saga effects. + */ + public getSagaMonitor(): SagaMonitor { + const instrumentation = this; + + const sagaMonitor: SagaMonitor = { + effectTriggered(info) { + try { + // Called when a new effect is triggered (e.g. call, put, take, fork, etc.) + const { effectId, effect } = info; + const payload = effect?.payload?.args?.[0]?.payload; + const traceparent = payload?.traceparent; + if (traceparent) { + const parentContext = api.propagation.extract(api.context.active(), payload); + const spanName = instrumentation._getEffectName(effect); + const span = instrumentation.tracer.startSpan( + spanName, + { + kind: api.SpanKind.INTERNAL + }, + parentContext + ); + instrumentation._spans.set(effectId, span); + + return; + } + const parentId = info?.parentEffectId; + + const parentSpan = instrumentation._spans.get(parentId); + + if (parentSpan) { + const spanName = instrumentation._getEffectName(effect); + + // Use the parent span's context to create a child span + const childSpan = instrumentation.tracer.startSpan( + spanName, + { kind: api.SpanKind.INTERNAL }, + api.trace.setSpan(api.context.active(), parentSpan) + ); + + if (effect.type === 'PUT' && instrumentation._config.shouldPropagateTraceContextPut?.(effect)) { + const effectPayload = { ...(effect.payload.action.payload || {}) }; + api.propagation.inject(api.trace.setSpan(api.context.active(), childSpan), effectPayload); + effect.payload.action.payload = effectPayload; + } + + // if (effect.type === 'CALL') { + // console.log("WITH CALL NOW") + // const childContext = api.trace.setSpan(api.context.active(), childSpan); + // effect.fn = api.context.bind(childContext, effect.fn); + // } + + instrumentation._spans.set(effectId, childSpan); + } + } catch (e) { + console.log('Error in effectTriggered', e); + } + }, + + effectResolved(effectId: number, result: any) { + try { + // Called when an effect has completed successfully + const span = instrumentation._spans.get(effectId); + if (!span) {return;} + + if (result?.toPromise) { + result.toPromise().then((res: any) => { + // You can add any final attributes or set success + span.setStatus({ code: SpanStatusCode.OK }); + span.end(); + return res; + }); + } else { + span.setStatus({ code: SpanStatusCode.OK }); + span.end(); + } + } catch (e) { + console.log('Error in effectResolved', e); + } + }, + + effectRejected(effectId, error) { + try { + // Called when an effect has failed + const span = instrumentation._spans.get(effectId); + if (!span) {return;} + + span.setStatus({ code: SpanStatusCode.ERROR, message: error?.message }); + span.recordException(error); + span.end(); + instrumentation._spans.delete(effectId); + } catch (e) { + console.log('Error in effectRejected', e); + } + }, + + effectCancelled(effectId) { + try { + // Called when an effect has been cancelled + const span = instrumentation._spans.get(effectId); + if (!span) {return;} + + // You might mark it as a cancellation, or success, or custom + span.setAttribute('redux-saga.cancelled', true); + span.end(); + instrumentation._spans.delete(effectId); + } catch (e) { + console.log('Error in effectCancelled', e); + } + }, + }; + + return sagaMonitor; + } + + /** + * Patches logic: (No real "patch" is needed for redux-saga, we just provide the saga monitor.) + */ + override enable() { + // No actual patching of library code required; + // we'll just provide the custom saga monitor to the saga middleware. + } + + /** + * Unpatch logic: (Remove references or cleanup if needed.) + */ + override disable() { + // If needed, clear out the spans map or do any cleanup + this._spans.clear(); + } + + /** + * Helper: Return a name for the effect (like "call: fetchData" or "put: SOME_ACTION") + */ + private _getEffectName(effect: any): string { + if (effect && typeof effect === 'object') { + if (effect.type === 'CALL') { + // effect.payload.fn can be the function being called + const fnName = effect.payload.fn?.name || 'anonymous'; + + return `redux-saga call(${fnName})`; + } + if (effect.type === 'PUT') { + const actionType = effect.payload?.action?.type || 'unknown'; + + return `redux-saga put(${actionType})`; + } + + if (effect.type === 'FORK') { + const fnName = effect.payload.fn?.name || 'anonymous'; + + return `redux-saga fork(${fnName})`; + } + + if (effect.type === 'SELECT') { + return `redux-saga select(${effect.payload?.selector?.name || 'anonymous'})`; + } + + return `redux-saga ${effect.type.toLowerCase()}`; + } + return 'redux-saga effect'; + } +} diff --git a/experimental/instrumentation-otel-redux-saga/src/setupTests.ts b/experimental/instrumentation-otel-redux-saga/src/setupTests.ts new file mode 100644 index 000000000..c9c335837 --- /dev/null +++ b/experimental/instrumentation-otel-redux-saga/src/setupTests.ts @@ -0,0 +1,12 @@ +import { fetch, Request, Response } from '@remix-run/web-fetch'; + +if (!globalThis.fetch) { + // @ts-expect-error + globalThis.fetch = fetch; + + // @ts-expect-error + globalThis.Request = Request; + + // @ts-expect-error + globalThis.Response = Response; +} diff --git a/experimental/instrumentation-otel-redux-saga/src/types.ts b/experimental/instrumentation-otel-redux-saga/src/types.ts new file mode 100644 index 000000000..0eb796e2e --- /dev/null +++ b/experimental/instrumentation-otel-redux-saga/src/types.ts @@ -0,0 +1,10 @@ +import type {InstrumentationConfig} from "@opentelemetry/instrumentation"; +import type * as web from "@opentelemetry/sdk-trace-web"; + +export interface AxiosInstrumentationOptions extends InstrumentationConfig { + clearTimingResources?: boolean; + propagateTraceHeaderCorsUrls?: web.PropagateTraceHeaderCorsUrls; + ignoreUrls?: Array; + ignoreNetworkEvents?: boolean; + measureRequestSize?: boolean; +} diff --git a/experimental/instrumentation-otel-redux-saga/tsconfig.cjs.json b/experimental/instrumentation-otel-redux-saga/tsconfig.cjs.json new file mode 100644 index 000000000..c011dac47 --- /dev/null +++ b/experimental/instrumentation-otel-redux-saga/tsconfig.cjs.json @@ -0,0 +1,12 @@ +{ + "extends": "../../tsconfig.base.cjs.json", + "compilerOptions": { + "declarationDir": "./dist/types", + "outDir": "./dist/cjs", + "rootDir": "./src", + "tsBuildInfoFile": "../../.cache/tsc/instrumentationOtelReduxSaga.cjs.tsbuildinfo" + }, + "include": ["./src"], + "exclude": ["**/*.test.ts"], + "references": [{ "path": "../../packages/core/tsconfig.spec.json" }] +} diff --git a/experimental/instrumentation-otel-redux-saga/tsconfig.esm.json b/experimental/instrumentation-otel-redux-saga/tsconfig.esm.json new file mode 100644 index 000000000..75e3b392d --- /dev/null +++ b/experimental/instrumentation-otel-redux-saga/tsconfig.esm.json @@ -0,0 +1,12 @@ +{ + "extends": "../../tsconfig.base.esm.json", + "compilerOptions": { + "declarationDir": "./dist/types", + "outDir": "./dist/esm", + "rootDir": "./src", + "tsBuildInfoFile": "../../.cache/tsc/instrumentationOtelReduxSaga.esm.tsbuildinfo" + }, + "include": ["./src"], + "exclude": ["**/*.test.ts"], + "references": [{ "path": "../../packages/core/tsconfig.spec.json" }] +} diff --git a/experimental/instrumentation-otel-redux-saga/tsconfig.json b/experimental/instrumentation-otel-redux-saga/tsconfig.json new file mode 100644 index 000000000..d622457a1 --- /dev/null +++ b/experimental/instrumentation-otel-redux-saga/tsconfig.json @@ -0,0 +1,10 @@ +{ + "compilerOptions": { + "noPropertyAccessFromIndexSignature": false + }, + "references": [ + { "path": "./tsconfig.cjs.json" }, + { "path": "./tsconfig.esm.json" }, + { "path": "./tsconfig.spec.json" } + ] +} diff --git a/experimental/instrumentation-otel-redux-saga/tsconfig.spec.json b/experimental/instrumentation-otel-redux-saga/tsconfig.spec.json new file mode 100644 index 000000000..054f89004 --- /dev/null +++ b/experimental/instrumentation-otel-redux-saga/tsconfig.spec.json @@ -0,0 +1,11 @@ +{ + "extends": "../../tsconfig.base.spec.json", + "compilerOptions": { + "declarationDir": "./dist/types", + "outDir": "./dist/spec", + "rootDir": "../../", + "tsBuildInfoFile": "../../.cache/tsc/instrumentationOtelReduxSaga.spec.tsbuildinfo" + }, + "include": ["./src"], + "references": [{ "path": "../../packages/core/tsconfig.spec.json" }] +} diff --git a/packages/react-native-sdk/package.json b/packages/react-native-sdk/package.json index af1e1eacb..75a299207 100644 --- a/packages/react-native-sdk/package.json +++ b/packages/react-native-sdk/package.json @@ -1,7 +1,7 @@ { "name": "@grafana/react-native-sdk", "version": "1.12.2", - "description": "Faro instrumentations, metas, transports for web.", + "description": "Faro instrumentations, metas, transports for rn.", "keywords": [ "observability", "apm", diff --git a/packages/react-native-sdk/src/transports/index.ts b/packages/react-native-sdk/src/transports/index.ts index 2cc0ff7d4..61147b17a 100644 --- a/packages/react-native-sdk/src/transports/index.ts +++ b/packages/react-native-sdk/src/transports/index.ts @@ -2,4 +2,5 @@ export { ConsoleTransport } from './console'; export type { ConsoleTransportOptions } from './console'; export { FetchTransport } from './fetch'; + export type { ClockFn, FetchTransportOptions, FetchTransportRequestOptions } from './fetch'; diff --git a/packages/react-native-tracing/package.json b/packages/react-native-tracing/package.json index 1dd78c279..de6d1575c 100644 --- a/packages/react-native-tracing/package.json +++ b/packages/react-native-tracing/package.json @@ -52,7 +52,6 @@ "quality:circular-deps": "madge --circular ." }, "dependencies": { - "@grafana/faro-instrumentation-websocket": "*", "@grafana/faro-web-sdk": "^1.12.2", "@opentelemetry/api": "^1.9.0", "@opentelemetry/context-zone": "1.26.0", diff --git a/packages/react-native-tracing/src/instrumentation.ts b/packages/react-native-tracing/src/instrumentation.ts index b0fe5fa0e..adfe0ee28 100644 --- a/packages/react-native-tracing/src/instrumentation.ts +++ b/packages/react-native-tracing/src/instrumentation.ts @@ -69,6 +69,7 @@ export class TracingInstrumentation extends BaseInstrumentation { provider.register({ propagator: options.propagator ?? new W3CTraceContextPropagator(), + contextManager: options.contextManager, }); const { propagateTraceHeaderCorsUrls, fetchInstrumentationOptions, xhrInstrumentationOptions } = diff --git a/rollup.config.base.js b/rollup.config.base.js index ed5a5f0a1..6280b48f4 100644 --- a/rollup.config.base.js +++ b/rollup.config.base.js @@ -76,6 +76,18 @@ const modules = { globalName: 'GrafanaFaroInstrumentationWebSocket', externals: [], }, + instrumentationOtelAxios: { + name: '@grafana/faro-instrumentation-otel-axios', + bundleName: 'faro-instrumentation-otel-axios', + globalName: 'GrafanaFaroInstrumentationOtelAxios', + externals: [], + }, + instrumentationOtelReduxSaga: { + name: '@grafana/faro-instrumentation-otel-redux-saga', + bundleName: 'faro-instrumentation-otel-redux-saga', + globalName: 'GrafanaFaroInstrumentationOtelReduxSaga', + externals: [], + } }; exports.getRollupConfigBase = (moduleName) => { diff --git a/yarn.lock b/yarn.lock index d3c9bf938..4e95ba96d 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1735,6 +1735,49 @@ dependencies: "@swc/helpers" "^0.5.0" +"@redux-saga/core@^1.3.0": + version "1.3.0" + resolved "https://registry.yarnpkg.com/@redux-saga/core/-/core-1.3.0.tgz#2ce08b73d407fc6ea9e7f7d83d2e97d981a3a8b8" + integrity sha512-L+i+qIGuyWn7CIg7k1MteHGfttKPmxwZR5E7OsGikCL2LzYA0RERlaUY00Y3P3ZV2EYgrsYlBrGs6cJP5OKKqA== + dependencies: + "@babel/runtime" "^7.6.3" + "@redux-saga/deferred" "^1.2.1" + "@redux-saga/delay-p" "^1.2.1" + "@redux-saga/is" "^1.1.3" + "@redux-saga/symbols" "^1.1.3" + "@redux-saga/types" "^1.2.1" + typescript-tuple "^2.2.1" + +"@redux-saga/deferred@^1.2.1": + version "1.2.1" + resolved "https://registry.yarnpkg.com/@redux-saga/deferred/-/deferred-1.2.1.tgz#aca373a08ccafd6f3481037f2f7ee97f2c87c3ec" + integrity sha512-cmin3IuuzMdfQjA0lG4B+jX+9HdTgHZZ+6u3jRAOwGUxy77GSlTi4Qp2d6PM1PUoTmQUR5aijlA39scWWPF31g== + +"@redux-saga/delay-p@^1.2.1": + version "1.2.1" + resolved "https://registry.yarnpkg.com/@redux-saga/delay-p/-/delay-p-1.2.1.tgz#e72ac4731c5080a21f75b61bedc31cb639d9e446" + integrity sha512-MdiDxZdvb1m+Y0s4/hgdcAXntpUytr9g0hpcOO1XFVyyzkrDu3SKPgBFOtHn7lhu7n24ZKIAT1qtKyQjHqRd+w== + dependencies: + "@redux-saga/symbols" "^1.1.3" + +"@redux-saga/is@^1.1.3": + version "1.1.3" + resolved "https://registry.yarnpkg.com/@redux-saga/is/-/is-1.1.3.tgz#b333f31967e87e32b4e6b02c75b78d609dd4ad73" + integrity sha512-naXrkETG1jLRfVfhOx/ZdLj0EyAzHYbgJWkXbB3qFliPcHKiWbv/ULQryOAEKyjrhiclmr6AMdgsXFyx7/yE6Q== + dependencies: + "@redux-saga/symbols" "^1.1.3" + "@redux-saga/types" "^1.2.1" + +"@redux-saga/symbols@^1.1.3": + version "1.1.3" + resolved "https://registry.yarnpkg.com/@redux-saga/symbols/-/symbols-1.1.3.tgz#b731d56201719e96dc887dc3ae9016e761654367" + integrity sha512-hCx6ZvU4QAEUojETnX8EVg4ubNLBFl1Lps4j2tX7o45x/2qg37m3c6v+kSp8xjDJY+2tJw4QB3j8o8dsl1FDXg== + +"@redux-saga/types@^1.2.1": + version "1.2.1" + resolved "https://registry.yarnpkg.com/@redux-saga/types/-/types-1.2.1.tgz#9403f51c17cae37edf870c6bc0c81c1ece5ccef8" + integrity sha512-1dgmkh+3so0+LlBWRhGA33ua4MYr7tUOj+a9Si28vUi0IUFNbff1T3sgpeDJI/LaC75bBYnQ0A3wXjn0OrRNBA== + "@reduxjs/toolkit@^2.3.0": version "2.3.0" resolved "https://registry.yarnpkg.com/@reduxjs/toolkit/-/toolkit-2.3.0.tgz#d00134634d6c1678e8563ac50026e429e3b64420" @@ -9380,6 +9423,13 @@ redent@^3.0.0: indent-string "^4.0.0" strip-indent "^3.0.0" +redux-saga@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/redux-saga/-/redux-saga-1.3.0.tgz#a59ada7c28010189355356b99738c9fcb7ade30e" + integrity sha512-J9RvCeAZXSTAibFY0kGw6Iy4EdyDNW7k6Q+liwX+bsck7QVsU78zz8vpBRweEfANxnnlG/xGGeOvf6r8UXzNJQ== + dependencies: + "@redux-saga/core" "^1.3.0" + redux-thunk@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/redux-thunk/-/redux-thunk-3.1.0.tgz#94aa6e04977c30e14e892eae84978c1af6058ff3" @@ -10137,16 +10187,7 @@ string-length@^4.0.1: char-regex "^1.0.2" strip-ansi "^6.0.0" -"string-width-cjs@npm:string-width@^4.2.0": - version "4.2.3" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" - integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== - dependencies: - emoji-regex "^8.0.0" - is-fullwidth-code-point "^3.0.0" - strip-ansi "^6.0.1" - -"string-width@^1.0.2 || 2 || 3 || 4", string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: +"string-width-cjs@npm:string-width@^4.2.0", "string-width@^1.0.2 || 2 || 3 || 4", string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: version "4.2.3" resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== @@ -10237,14 +10278,7 @@ stringify-object@^3.2.1: is-obj "^1.0.1" is-regexp "^1.0.0" -"strip-ansi-cjs@npm:strip-ansi@^6.0.1": - version "6.0.1" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" - integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== - dependencies: - ansi-regex "^5.0.1" - -strip-ansi@^6.0.0, strip-ansi@^6.0.1: +"strip-ansi-cjs@npm:strip-ansi@^6.0.1", strip-ansi@^6.0.0, strip-ansi@^6.0.1: version "6.0.1" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== @@ -10730,6 +10764,25 @@ typedarray@^0.0.6: resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" integrity sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA== +typescript-compare@^0.0.2: + version "0.0.2" + resolved "https://registry.yarnpkg.com/typescript-compare/-/typescript-compare-0.0.2.tgz#7ee40a400a406c2ea0a7e551efd3309021d5f425" + integrity sha512-8ja4j7pMHkfLJQO2/8tut7ub+J3Lw2S3061eJLFQcvs3tsmJKp8KG5NtpLn7KcY2w08edF74BSVN7qJS0U6oHA== + dependencies: + typescript-logic "^0.0.0" + +typescript-logic@^0.0.0: + version "0.0.0" + resolved "https://registry.yarnpkg.com/typescript-logic/-/typescript-logic-0.0.0.tgz#66ebd82a2548f2b444a43667bec120b496890196" + integrity sha512-zXFars5LUkI3zP492ls0VskH3TtdeHCqu0i7/duGt60i5IGPIpAHE/DWo5FqJ6EjQ15YKXrt+AETjv60Dat34Q== + +typescript-tuple@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/typescript-tuple/-/typescript-tuple-2.2.1.tgz#7d9813fb4b355f69ac55032e0363e8bb0f04dad2" + integrity sha512-Zcr0lbt8z5ZdEzERHAMAniTiIKerFCMgd7yjq1fPnDJ43et/k9twIFQMUYff9k5oXcsQ0WpvFcgzK2ZKASoW6Q== + dependencies: + typescript-compare "^0.0.2" + "typescript@>=3 < 6", typescript@^5.0.4, typescript@^5.4.4: version "5.6.3" resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.6.3.tgz#5f3449e31c9d94febb17de03cc081dd56d81db5b" @@ -11197,7 +11250,7 @@ wordwrap@^1.0.0: resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb" integrity sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q== -"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0": +"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0", wrap-ansi@^7.0.0: version "7.0.0" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== @@ -11215,15 +11268,6 @@ wrap-ansi@^6.0.1, wrap-ansi@^6.2.0: string-width "^4.1.0" strip-ansi "^6.0.0" -wrap-ansi@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" - integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== - dependencies: - ansi-styles "^4.0.0" - string-width "^4.1.0" - strip-ansi "^6.0.0" - wrap-ansi@^8.1.0: version "8.1.0" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-8.1.0.tgz#56dc22368ee570face1b49819975d9b9a5ead214" From 911a28813d9b25a1b4ec7172fd3a05934098e929 Mon Sep 17 00:00:00 2001 From: Lucas Bento Date: Wed, 25 Dec 2024 14:49:39 +0100 Subject: [PATCH 13/43] feat: add app startup instrumentation --- .../react-native-tracing/android/build.gradle | 23 +++++ .../android/src/main/AndroidManifest.xml | 3 + .../NativeInstrumentationModule.java | 88 +++++++++++++++++++ .../NativeInstrumentationPackage.java | 27 ++++++ .../ios/NativeInstrumentation.h | 14 +++ .../ios/NativeInstrumentation.m | 8 ++ .../ios/NativeInstrumentation.swift | 53 +++++++++++ packages/react-native-tracing/package.json | 5 +- .../react-native-tracing.podspec | 24 +++++ .../react-native-tracing/src/dependencies.ts | 7 ++ .../src/faroNativeInstrumentation.ts | 19 ++++ packages/react-native-tracing/src/index.ts | 3 + packages/react-native-tracing/src/wrapHOC.tsx | 38 ++++++++ 13 files changed, 311 insertions(+), 1 deletion(-) create mode 100644 packages/react-native-tracing/android/build.gradle create mode 100644 packages/react-native-tracing/android/src/main/AndroidManifest.xml create mode 100644 packages/react-native-tracing/android/src/main/java/com/grafana/nativeinstrumentation/NativeInstrumentationModule.java create mode 100644 packages/react-native-tracing/android/src/main/java/com/grafana/nativeinstrumentation/NativeInstrumentationPackage.java create mode 100644 packages/react-native-tracing/ios/NativeInstrumentation.h create mode 100644 packages/react-native-tracing/ios/NativeInstrumentation.m create mode 100644 packages/react-native-tracing/ios/NativeInstrumentation.swift create mode 100644 packages/react-native-tracing/react-native-tracing.podspec create mode 100644 packages/react-native-tracing/src/dependencies.ts create mode 100644 packages/react-native-tracing/src/faroNativeInstrumentation.ts create mode 100644 packages/react-native-tracing/src/wrapHOC.tsx diff --git a/packages/react-native-tracing/android/build.gradle b/packages/react-native-tracing/android/build.gradle new file mode 100644 index 000000000..c7789ff42 --- /dev/null +++ b/packages/react-native-tracing/android/build.gradle @@ -0,0 +1,23 @@ +buildscript { + repositories { + google() + mavenCentral() + } +} + +apply plugin: 'com.android.library' +apply plugin: 'kotlin-android' + +android { + compileSdkVersion 33 + buildToolsVersion "33.0.0" + + defaultConfig { + minSdkVersion 21 + targetSdkVersion 33 + } +} + +dependencies { + implementation "com.facebook.react:react-native:+" +} \ No newline at end of file diff --git a/packages/react-native-tracing/android/src/main/AndroidManifest.xml b/packages/react-native-tracing/android/src/main/AndroidManifest.xml new file mode 100644 index 000000000..e75532bdb --- /dev/null +++ b/packages/react-native-tracing/android/src/main/AndroidManifest.xml @@ -0,0 +1,3 @@ + + \ No newline at end of file diff --git a/packages/react-native-tracing/android/src/main/java/com/grafana/nativeinstrumentation/NativeInstrumentationModule.java b/packages/react-native-tracing/android/src/main/java/com/grafana/nativeinstrumentation/NativeInstrumentationModule.java new file mode 100644 index 000000000..e5380b7eb --- /dev/null +++ b/packages/react-native-tracing/android/src/main/java/com/grafana/nativeinstrumentation/NativeInstrumentationModule.java @@ -0,0 +1,88 @@ +package com.grafana.nativeinstrumentation; + +import com.facebook.react.bridge.ReactApplicationContext; +import com.facebook.react.bridge.ReactContextBaseJavaModule; +import com.facebook.react.bridge.ReactMethod; +import com.facebook.react.bridge.WritableMap; +import com.facebook.react.bridge.WritableArray; +import com.facebook.react.bridge.Arguments; +import com.facebook.react.bridge.Promise; +import com.facebook.react.module.annotations.ReactModule; +import com.facebook.react.bridge.ReactMarker; +import com.facebook.react.bridge.ReactMarkerConstants; +import com.facebook.react.uimanager.events.RCTEventEmitter; + +@ReactModule(name = NativeInstrumentationModule.NAME) +public class NativeInstrumentationModule extends ReactContextBaseJavaModule implements RCTEventEmitter { + public static final String NAME = "NativeInstrumentation"; + private static Long startTime = null; + private static WritableMap cachedMetrics = null; + + static { + ReactMarker.addListener((name, tag, instanceKey) -> { + long currentTime = System.currentTimeMillis(); + + if (name == ReactMarkerConstants.PRE_RUN_JS_BUNDLE_START) { + android.util.Log.d(NAME, String.format("JS bundle load started at: %d", currentTime)); + initializeNativeInstrumentation(); + } + }); + } + + public NativeInstrumentationModule(ReactApplicationContext reactContext) { + super(reactContext); + android.util.Log.d(NAME, "Module constructor called"); + } + + @Override + public String getName() { + return NAME; + } + + public static void initializeNativeInstrumentation() { + android.util.Log.d(NAME, "Initializing native instrumentation..."); + cachedMetrics = null; + startTime = System.currentTimeMillis(); + android.util.Log.d(NAME, String.format("Initialized with start time: %d (previous metrics cleared)", startTime)); + } + + @ReactMethod + public void getStartupTime(Promise promise) { + android.util.Log.d(NAME, "Getting startup time..."); + + if (startTime == null) { + android.util.Log.e(NAME, "Error: Start time was not initialized"); + promise.reject("NO_START_TIME", "[NativeInstrumentation] Start time was not initialized"); + return; + } + + if (cachedMetrics != null) { + android.util.Log.d(NAME, "Returning cached metrics"); + promise.resolve(cachedMetrics); + return; + } + + long endTime = System.currentTimeMillis(); + long duration = endTime - startTime; + + android.util.Log.d(NAME, String.format( + "Calculating metrics - Start: %d, End: %d, Duration: %d ms", + startTime, endTime, duration + )); + + WritableMap params = Arguments.createMap(); + params.putDouble("startStartupTime", startTime.doubleValue()); + params.putDouble("endStartupTime", (double) endTime); + params.putDouble("startupDuration", (double) duration); + + cachedMetrics = params; + android.util.Log.d(NAME, "Metrics cached and being returned"); + promise.resolve(params); + } + + @ReactMethod + public void addListener(String eventName) {} + + @ReactMethod + public void removeListeners(Integer count) {} +} \ No newline at end of file diff --git a/packages/react-native-tracing/android/src/main/java/com/grafana/nativeinstrumentation/NativeInstrumentationPackage.java b/packages/react-native-tracing/android/src/main/java/com/grafana/nativeinstrumentation/NativeInstrumentationPackage.java new file mode 100644 index 000000000..9a0f3a8c4 --- /dev/null +++ b/packages/react-native-tracing/android/src/main/java/com/grafana/nativeinstrumentation/NativeInstrumentationPackage.java @@ -0,0 +1,27 @@ +package com.grafana.nativeinstrumentation; + +import com.facebook.react.ReactPackage; +import com.facebook.react.bridge.NativeModule; +import com.facebook.react.bridge.ReactApplicationContext; +import com.facebook.react.uimanager.ViewManager; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +public class NativeInstrumentationPackage implements ReactPackage { + @Override + public List createViewManagers(ReactApplicationContext reactContext) { + android.util.Log.d("NativeInstrumentation", "Creating view managers (none needed)"); + return Collections.emptyList(); + } + + @Override + public List createNativeModules(ReactApplicationContext reactContext) { + android.util.Log.d("NativeInstrumentation", "Creating native modules"); + List modules = new ArrayList<>(); + modules.add(new NativeInstrumentationModule(reactContext)); + android.util.Log.d("NativeInstrumentation", "Native instrumentation module added to modules list"); + return modules; + } +} \ No newline at end of file diff --git a/packages/react-native-tracing/ios/NativeInstrumentation.h b/packages/react-native-tracing/ios/NativeInstrumentation.h new file mode 100644 index 000000000..c38cd82f1 --- /dev/null +++ b/packages/react-native-tracing/ios/NativeInstrumentation.h @@ -0,0 +1,14 @@ +#import + +NS_ASSUME_NONNULL_BEGIN + +@interface NativeInstrumentation : NSObject + +- (void)getStartupTime:(RCTPromiseResolveBlock)resolve + rejecter:(RCTPromiseRejectBlock)reject; + ++ (void)initializeNativeInstrumentation; + +@end + +NS_ASSUME_NONNULL_END \ No newline at end of file diff --git a/packages/react-native-tracing/ios/NativeInstrumentation.m b/packages/react-native-tracing/ios/NativeInstrumentation.m new file mode 100644 index 000000000..cc86f4fe2 --- /dev/null +++ b/packages/react-native-tracing/ios/NativeInstrumentation.m @@ -0,0 +1,8 @@ +#import + +@interface RCT_EXTERN_REMAP_MODULE(NativeInstrumentation, NativeInstrumentation, NSObject) + +RCT_EXTERN_METHOD(getStartupTime:(RCTPromiseResolveBlock)resolve + rejecter:(RCTPromiseRejectBlock)reject) + +@end \ No newline at end of file diff --git a/packages/react-native-tracing/ios/NativeInstrumentation.swift b/packages/react-native-tracing/ios/NativeInstrumentation.swift new file mode 100644 index 000000000..607ee5de4 --- /dev/null +++ b/packages/react-native-tracing/ios/NativeInstrumentation.swift @@ -0,0 +1,53 @@ +import Foundation +import React + +@objc(NativeInstrumentation) +public class NativeInstrumentation: NSObject, RCTBridgeModule { + private static var startTime: TimeInterval? + private static var cachedMetrics: [String: Double]? + + @objc + public static func initializeNativeInstrumentation() { + NativeInstrumentation.cachedMetrics = nil + NativeInstrumentation.startTime = Date().timeIntervalSince1970 * 1000 + } + + override init() { + super.init() + } + + @objc + public static func requiresMainQueueSetup() -> Bool { + return false + } + + @objc + public static func moduleName() -> String! { + return "NativeInstrumentation" + } + + @objc + public func getStartupTime(_ resolve: @escaping RCTPromiseResolveBlock, rejecter reject: @escaping RCTPromiseRejectBlock) { + guard let startTime = NativeInstrumentation.startTime else { + reject("NO_START_TIME", "[NativeInstrumentation] Start time was not initialized", nil) + return + } + + if let metrics = NativeInstrumentation.cachedMetrics { + resolve(metrics) + return + } + + let endTime = Date().timeIntervalSince1970 * 1000 + let duration = endTime - startTime + + let metrics: [String: Double] = [ + "startStartupTime": startTime, + "endStartupTime": endTime, + "startupDuration": duration + ] + + NativeInstrumentation.cachedMetrics = metrics + resolve(metrics) + } +} diff --git a/packages/react-native-tracing/package.json b/packages/react-native-tracing/package.json index 1dd78c279..730eebc30 100644 --- a/packages/react-native-tracing/package.json +++ b/packages/react-native-tracing/package.json @@ -28,7 +28,10 @@ ".browserslistrc", "dist", "README.md", - "LICENSE" + "LICENSE", + "android", + "ios", + "react-native-tracing.podspec" ], "scripts": { "start": "yarn watch", diff --git a/packages/react-native-tracing/react-native-tracing.podspec b/packages/react-native-tracing/react-native-tracing.podspec new file mode 100644 index 000000000..b2339ebd2 --- /dev/null +++ b/packages/react-native-tracing/react-native-tracing.podspec @@ -0,0 +1,24 @@ +require 'json' + +package = JSON.parse(File.read(File.join(__dir__, 'package.json'))) + +Pod::Spec.new do |s| + s.name = 'react-native-tracing' + s.version = package['version'] + s.summary = package['description'] + s.license = package['license'] + s.authors = package['author'] + s.homepage = package['homepage'] + s.platform = :ios, "11.0" + s.source = { :git => "https://github.com/grafana/faro-web-sdk.git", :tag => "v#{s.version}" } + s.source_files = "ios/**/*.{h,m,mm,swift}" + s.dependency "React-Core" + + s.pod_target_xcconfig = { + 'DEFINES_MODULE' => 'YES', + 'SWIFT_VERSION' => '5.0', + 'CLANG_ENABLE_MODULES' => 'YES' + } + + s.swift_version = '5.0' +end \ No newline at end of file diff --git a/packages/react-native-tracing/src/dependencies.ts b/packages/react-native-tracing/src/dependencies.ts new file mode 100644 index 000000000..0abed738b --- /dev/null +++ b/packages/react-native-tracing/src/dependencies.ts @@ -0,0 +1,7 @@ +import type { API } from '@grafana/faro-core'; + +export let api: API; + +export function setDependencies(faro: API): void { + api = faro; +} diff --git a/packages/react-native-tracing/src/faroNativeInstrumentation.ts b/packages/react-native-tracing/src/faroNativeInstrumentation.ts new file mode 100644 index 000000000..6ebbfb469 --- /dev/null +++ b/packages/react-native-tracing/src/faroNativeInstrumentation.ts @@ -0,0 +1,19 @@ +// TODO(@lucasbento): fix this +/* eslint-disable import/no-unresolved */ +// @ts-expect-error +import { NativeModules } from 'react-native'; + +import { BaseInstrumentation, VERSION } from '@grafana/faro-web-sdk'; + +import { setDependencies } from './dependencies'; + +const INSTRUMENTATION_NAME = '@grafana/native-instrumentation'; + +export class NativeInstrumentation extends BaseInstrumentation { + readonly name = INSTRUMENTATION_NAME; + readonly version = VERSION; + + initialize(): void { + setDependencies(this.api); + } +} diff --git a/packages/react-native-tracing/src/index.ts b/packages/react-native-tracing/src/index.ts index 673f63a33..56a753946 100644 --- a/packages/react-native-tracing/src/index.ts +++ b/packages/react-native-tracing/src/index.ts @@ -15,3 +15,6 @@ export { setSpanStatusOnFetchError, fetchCustomAttributeFunctionWithDefaults } f // react-navigation integration export { initializeReactNavigationInstrumentation, ReactNavigationIntegration } from './react-navigation'; + +export { wrap } from './wrapHOC'; +export { NativeInstrumentation } from './faroNativeInstrumentation'; diff --git a/packages/react-native-tracing/src/wrapHOC.tsx b/packages/react-native-tracing/src/wrapHOC.tsx new file mode 100644 index 000000000..c93ef84cc --- /dev/null +++ b/packages/react-native-tracing/src/wrapHOC.tsx @@ -0,0 +1,38 @@ +import React, { useEffect } from 'react'; +// @ts-expect-error +// eslint-disable-next-line +import { NativeModules } from 'react-native'; + +import { api } from './dependencies'; + +interface StartupMetrics { + startStartupTime: number; + endStartupTime: number; + startupDuration: number; +} + +// TODO(@lucasbento): figure out where to best place this function +const measureStartupTime = async (): Promise => { + try { + const metrics: StartupMetrics = await NativeModules.NativeInstrumentation.getStartupTime(); + + api.pushMeasurement({ + type: 'app_startup_time', + values: { + startup_duration_ms: metrics.startupDuration, + }, + }); + } catch (error) { + console.error('[NativeInstrumentation] Failed to measure startup time:', error); + } +}; + +export function wrap

(WrappedComponent: React.ComponentType

) { + return function WithStartupTracking(props: P) { + useEffect(() => { + measureStartupTime(); + }, []); + + return ; + }; +} \ No newline at end of file From 6b9b359457d2f5e06ec5c9a60bad84eea5e2670d Mon Sep 17 00:00:00 2001 From: Ilia Kurganskii Date: Thu, 26 Dec 2024 13:13:06 +0100 Subject: [PATCH 14/43] feat: add tracing for takeLatest --- .../src/instrumentation.ts | 34 ++++++++++++++----- 1 file changed, 26 insertions(+), 8 deletions(-) diff --git a/experimental/instrumentation-otel-redux-saga/src/instrumentation.ts b/experimental/instrumentation-otel-redux-saga/src/instrumentation.ts index d7f2f92d6..ecfcb3d7c 100644 --- a/experimental/instrumentation-otel-redux-saga/src/instrumentation.ts +++ b/experimental/instrumentation-otel-redux-saga/src/instrumentation.ts @@ -35,15 +35,18 @@ export class ReduxSagaInstrumentation extends InstrumentationBase{ + console.log('SPAN', span); + instrumentation._spans.set(effectId, span); + } + ); } } catch (e) { console.log('Error in effectTriggered', e); @@ -95,11 +111,13 @@ export class ReduxSagaInstrumentation extends InstrumentationBase Date: Thu, 26 Dec 2024 14:14:21 +0100 Subject: [PATCH 15/43] refactor: add `messageTransform` --- .../src/instrumentation.ts | 57 ++++++++++++------- .../instrumentation-websocket/src/types.ts | 14 +++++ .../instrumentation-websocket/src/utils.ts | 13 +++++ .../src/getDefaultOTELInstrumentations.ts | 9 +-- 4 files changed, 66 insertions(+), 27 deletions(-) create mode 100644 experimental/instrumentation-websocket/src/types.ts create mode 100644 experimental/instrumentation-websocket/src/utils.ts diff --git a/experimental/instrumentation-websocket/src/instrumentation.ts b/experimental/instrumentation-websocket/src/instrumentation.ts index 2840570e2..8168d5231 100644 --- a/experimental/instrumentation-websocket/src/instrumentation.ts +++ b/experimental/instrumentation-websocket/src/instrumentation.ts @@ -2,34 +2,27 @@ import { context, diag, SpanKind, SpanStatusCode, trace } from '@opentelemetry/a import { _globalThis } from '@opentelemetry/core'; import { InstrumentationBase, InstrumentationNodeModuleDefinition, isWrapped } from '@opentelemetry/instrumentation'; +import type { MessageTransform, PendingRequest, WebSocketInstrumentationConfig, WebSocketMessage } from './types'; +import { generateRequestId, isLocalhost } from './utils'; + const WS_MODULE = 'WebSocket'; const VERSION = '0.0.1'; -// TODO(@lucasbento): move this somewhere else -// Helper function to check if URL is localhost -function isLocalhost(url: string): boolean { - try { - const wsUrl = new URL(url); - return wsUrl.hostname === 'localhost' || wsUrl.hostname === '127.0.0.1' || wsUrl.hostname === '[::1]'; - } catch { - return false; - } -} - -// TODO(@lucasbento): move this somewhere else -function generateRequestId(): number { - return Math.floor(Math.random() * Number.MAX_SAFE_INTEGER); -} - -export class WebSocketInstrumentation extends InstrumentationBase { +export class WebSocketInstrumentation> extends InstrumentationBase { readonly component: string = 'websocket'; readonly version: string = VERSION; + moduleName = this.component; - private pendingRequests = new Map(); - constructor() { + private messageTransform: MessageTransform; + + private pendingRequests = new Map(); + + constructor(options: WebSocketInstrumentationConfig = {}) { super('faro-instrumentation-websocket', VERSION, {}); + + this.messageTransform = options.messageTransform ?? this.defaultMessageTransform; } protected init() { @@ -49,6 +42,10 @@ export class WebSocketInstrumentation extends InstrumentationBase { ]; } + private defaultMessageTransform(message: WebSocketMessage): WebSocketMessage | null | undefined { + return message; + } + override enable(): void { if (typeof WebSocket === 'undefined') { this._diag.error('WebSocket is not available in this environment'); @@ -108,12 +105,34 @@ export class WebSocketInstrumentation extends InstrumentationBase { this.addEventListener('message', (event) => { try { const response = JSON.parse(event.data); + if (response.requestId && self.pendingRequests.has(response.requestId)) { const { span } = self.pendingRequests.get(response.requestId)!; span.end(); self.pendingRequests.delete(response.requestId); } + + const transformedMessage = self.messageTransform(response); + if (!transformedMessage) { + return; + } + + const messageSpan = tracer.startSpan( + 'websocket.receive', + { + kind: SpanKind.CLIENT, + attributes: { + 'websocket.url': url, + 'websocket.message_type': typeof event.data, + 'websocket.message_size': event.data?.length, + 'websocket.message_payload': + typeof transformedMessage === 'string' ? transformedMessage : JSON.stringify(transformedMessage), + }, + }, + this.wsContext + ); + messageSpan.end(); } catch (_ignored) {} }); diff --git a/experimental/instrumentation-websocket/src/types.ts b/experimental/instrumentation-websocket/src/types.ts new file mode 100644 index 000000000..a257923a3 --- /dev/null +++ b/experimental/instrumentation-websocket/src/types.ts @@ -0,0 +1,14 @@ +export type WebSocketMessage> = T; + +export type MessageTransform> = ( + message: WebSocketMessage +) => WebSocketMessage | null | undefined; + +export interface WebSocketInstrumentationConfig> { + messageTransform?: MessageTransform; +} + +export interface PendingRequest { + span: import('@opentelemetry/api').Span; + startTime: number; +} diff --git a/experimental/instrumentation-websocket/src/utils.ts b/experimental/instrumentation-websocket/src/utils.ts new file mode 100644 index 000000000..170b29bfe --- /dev/null +++ b/experimental/instrumentation-websocket/src/utils.ts @@ -0,0 +1,13 @@ +// Helper function to check if URL is localhost +export function isLocalhost(url: string): boolean { + try { + const wsUrl = new URL(url); + return wsUrl.hostname === 'localhost' || wsUrl.hostname === '127.0.0.1' || wsUrl.hostname === '[::1]'; + } catch { + return false; + } +} + +export function generateRequestId(): number { + return Math.floor(Math.random() * Number.MAX_SAFE_INTEGER); +} diff --git a/packages/react-native-tracing/src/getDefaultOTELInstrumentations.ts b/packages/react-native-tracing/src/getDefaultOTELInstrumentations.ts index a55dfeeac..c40cdab1f 100644 --- a/packages/react-native-tracing/src/getDefaultOTELInstrumentations.ts +++ b/packages/react-native-tracing/src/getDefaultOTELInstrumentations.ts @@ -1,8 +1,6 @@ // @ts-nocheck import { FetchInstrumentation } from '@opentelemetry/instrumentation-fetch'; -import { WebSocketInstrumentation } from '@grafana/faro-instrumentation-websocket'; - import { FaroXhrInstrumentation } from './faroXhrInstrumentation'; import { fetchCustomAttributeFunctionWithDefaults, @@ -16,12 +14,7 @@ export function getDefaultOTELInstrumentations(options: DefaultInstrumentationsO const fetchOpts = createFetchInstrumentationOptions(fetchInstrumentationOptions, sharedOptions); const xhrOpts = createXhrInstrumentationOptions(xhrInstrumentationOptions, sharedOptions); - return [ - new FetchInstrumentation(fetchOpts), - new FaroXhrInstrumentation(xhrOpts), - // TODO(@lucasbento): fix this type - new WebSocketInstrumentation(), - ]; + return [new FetchInstrumentation(fetchOpts), new FaroXhrInstrumentation(xhrOpts)]; } function createFetchInstrumentationOptions( fetchInstrumentationOptions: DefaultInstrumentationsOptions['fetchInstrumentationOptions'], From 3862f837467d0b39a8818eb3de7796fd9e564872 Mon Sep 17 00:00:00 2001 From: Ilia Kurganskii Date: Thu, 26 Dec 2024 17:00:14 +0100 Subject: [PATCH 16/43] feat: add propagation context to call --- .../src/instrumentation.ts | 7 +++---- .../src/instrumentation.ts | 17 +++++++---------- 2 files changed, 10 insertions(+), 14 deletions(-) diff --git a/experimental/instrumentation-otel-axios/src/instrumentation.ts b/experimental/instrumentation-otel-axios/src/instrumentation.ts index 2070d2313..7da48435f 100644 --- a/experimental/instrumentation-otel-axios/src/instrumentation.ts +++ b/experimental/instrumentation-otel-axios/src/instrumentation.ts @@ -87,8 +87,6 @@ export class AxiosInstrumentation extends InstrumentationBase(span: api.Span, response?: AxiosResponse, error?: Error) { - const endTime = core.millisToHrTime(Date.now()); - if (response) { // It's an AxiosResponse this._addFinalSpanAttributes(span, response); @@ -106,7 +104,7 @@ export class AxiosInstrumentation extends InstrumentationBase { + console.log("CATCHED ERROR", error?.response); plugin._endSpan( span, - undefined, + error?.response, error?.response || { message: error?.message || 'Unknown error', name: error?.name || 'Error' diff --git a/experimental/instrumentation-otel-redux-saga/src/instrumentation.ts b/experimental/instrumentation-otel-redux-saga/src/instrumentation.ts index ecfcb3d7c..2b4d91eb6 100644 --- a/experimental/instrumentation-otel-redux-saga/src/instrumentation.ts +++ b/experimental/instrumentation-otel-redux-saga/src/instrumentation.ts @@ -3,13 +3,14 @@ import {Span, SpanStatusCode} from '@opentelemetry/api'; import {InstrumentationBase} from '@opentelemetry/instrumentation'; import type {InstrumentationConfig} from '@opentelemetry/instrumentation'; import type {SagaMonitor} from 'redux-saga'; -import type {CallEffect, PutEffect} from 'redux-saga/effects'; +import type {PutEffect} from 'redux-saga/effects'; + export interface ReduxSagaInstrumentationConfig extends InstrumentationConfig { // Add any custom config fields you'd like here. // For example, you might ignore certain effect types, or customize naming, etc. shouldPropagateTraceContextPut?: (effect: PutEffect) => boolean; - propagateContextToCall?: (effect: CallEffect) => boolean; + propagateContextToCall?: boolean } /** @@ -65,7 +66,7 @@ export class ReduxSagaInstrumentation extends InstrumentationBase{ - console.log('SPAN', span); - instrumentation._spans.set(effectId, span); } ); + instrumentation._spans.set(effectId, span); } } catch (e) { console.log('Error in effectTriggered', e); From 61e99f265fa678f638b3becc96000c81f0398c64 Mon Sep 17 00:00:00 2001 From: Ilia Kurganskii Date: Mon, 30 Dec 2024 12:16:38 +0100 Subject: [PATCH 17/43] feat: update logs for instumentations --- .../src/instrumentation.ts | 21 +++++++++++-------- .../src/instrumentation.ts | 8 +++---- 2 files changed, 16 insertions(+), 13 deletions(-) diff --git a/experimental/instrumentation-otel-axios/src/instrumentation.ts b/experimental/instrumentation-otel-axios/src/instrumentation.ts index 7da48435f..3d3367ae4 100644 --- a/experimental/instrumentation-otel-axios/src/instrumentation.ts +++ b/experimental/instrumentation-otel-axios/src/instrumentation.ts @@ -139,15 +139,18 @@ export class AxiosInstrumentation extends InstrumentationBase { - console.log("CATCHED ERROR", error?.response); - plugin._endSpan( - span, - error?.response, - error?.response || { - message: error?.message || 'Unknown error', - name: error?.name || 'Error' - } - ); + try { + plugin._endSpan( + span, + error?.response, + error?.response || { + message: error?.message || 'Unknown error', + name: error?.name || 'Error' + } + ); + } catch (e) { + plugin._diag.error('Error ending span', e); + } throw error; }); }); diff --git a/experimental/instrumentation-otel-redux-saga/src/instrumentation.ts b/experimental/instrumentation-otel-redux-saga/src/instrumentation.ts index 2b4d91eb6..3249103e6 100644 --- a/experimental/instrumentation-otel-redux-saga/src/instrumentation.ts +++ b/experimental/instrumentation-otel-redux-saga/src/instrumentation.ts @@ -93,7 +93,7 @@ export class ReduxSagaInstrumentation extends InstrumentationBase Date: Mon, 30 Dec 2024 15:42:59 +0100 Subject: [PATCH 18/43] feat: add axios handler for span --- .../src/instrumentation.ts | 75 +++++++++++-------- .../instrumentation-otel-axios/src/types.ts | 6 +- .../src/instrumentation.ts | 2 +- 3 files changed, 46 insertions(+), 37 deletions(-) diff --git a/experimental/instrumentation-otel-axios/src/instrumentation.ts b/experimental/instrumentation-otel-axios/src/instrumentation.ts index 3d3367ae4..4c2d5b3cd 100644 --- a/experimental/instrumentation-otel-axios/src/instrumentation.ts +++ b/experimental/instrumentation-otel-axios/src/instrumentation.ts @@ -8,25 +8,23 @@ import { SEMATTRS_HTTP_SCHEME, SEMATTRS_HTTP_STATUS_CODE, SEMATTRS_HTTP_URL, - SEMATTRS_HTTP_USER_AGENT + SEMATTRS_HTTP_USER_AGENT, } from '@opentelemetry/semantic-conventions'; import { Axios, AxiosInstance, AxiosRequestConfig, AxiosResponse } from 'axios'; -import {AttributeNames} from "./constants"; -import type {AxiosInstrumentationOptions} from "./types"; +import { AttributeNames } from './constants'; +import type { AxiosInstrumentationOptions } from './types'; /** * Additional custom attribute names */ - export const VERSION = '1.12.3'; /** * Configuration interface for the AxiosInstrumentation */ - export class AxiosInstrumentation extends InstrumentationBase { readonly component: string = 'axios'; @@ -58,6 +56,12 @@ export class AxiosInstrumentation extends InstrumentationBase, D=any>(config: AxiosRequestConfig) => Promise) => { - return function patchRequest, D = any>(this: AxiosInstance, requestConfig: AxiosRequestConfig): Promise { - const url = requestConfig.url ?? ''; - - // Create a new span if the URL is not ignored - const span = plugin.createSpan(url, { method: requestConfig.method }); - if (!span) { - return original.apply(this, [requestConfig]) as Promise; - } - - return api.context.with(api.trace.setSpan(api.context.active(), span), () => { - plugin._addAxiosHeaders(requestConfig); - - return (original - .apply(this, [requestConfig]) as Promise) + plugin._wrap( + Axios.prototype, + 'request', + (original: , D = any>(config: AxiosRequestConfig) => Promise) => { + return function patchRequest, D = any>( + this: AxiosInstance, + requestConfig: AxiosRequestConfig + ): Promise { + const url = requestConfig.url ?? ''; + + // Create a new span if the URL is not ignored + const span = plugin.createSpan(url, { method: requestConfig.method }); + if (!span) { + return original.apply(this, [requestConfig]) as Promise; + } + + return api.context.with(api.trace.setSpan(api.context.active(), span), () => { + plugin._addAxiosHeaders(requestConfig); + + return (original.apply(this, [requestConfig]) as Promise) .then((response: R) => { try { plugin._endSpan(span, response as AxiosResponse); @@ -141,22 +150,22 @@ export class AxiosInstrumentation extends InstrumentationBase { try { plugin._endSpan( - span, - error?.response, - error?.response || { - message: error?.message || 'Unknown error', - name: error?.name || 'Error' - } + span, + error?.response, + error?.response || { + message: error?.message || 'Unknown error', + name: error?.name || 'Error', + } ); } catch (e) { - plugin._diag.error('Error ending span', e); + plugin._diag.error('Error ending span', e); } throw error; }); - }); - }; - }); - + }); + }; + } + ); } override enable(): void { diff --git a/experimental/instrumentation-otel-axios/src/types.ts b/experimental/instrumentation-otel-axios/src/types.ts index 0eb796e2e..8f9bc3723 100644 --- a/experimental/instrumentation-otel-axios/src/types.ts +++ b/experimental/instrumentation-otel-axios/src/types.ts @@ -1,10 +1,10 @@ +import type {Span} from "@opentelemetry/api"; import type {InstrumentationConfig} from "@opentelemetry/instrumentation"; -import type * as web from "@opentelemetry/sdk-trace-web"; +import type {AxiosResponse} from "axios"; export interface AxiosInstrumentationOptions extends InstrumentationConfig { clearTimingResources?: boolean; - propagateTraceHeaderCorsUrls?: web.PropagateTraceHeaderCorsUrls; ignoreUrls?: Array; - ignoreNetworkEvents?: boolean; measureRequestSize?: boolean; + applyCustomAttributesOnSpan?: (span: Span, request: AxiosResponse) => void; } diff --git a/experimental/instrumentation-otel-redux-saga/src/instrumentation.ts b/experimental/instrumentation-otel-redux-saga/src/instrumentation.ts index 3249103e6..1367b32a9 100644 --- a/experimental/instrumentation-otel-redux-saga/src/instrumentation.ts +++ b/experimental/instrumentation-otel-redux-saga/src/instrumentation.ts @@ -20,7 +20,7 @@ export class ReduxSagaInstrumentation extends InstrumentationBase = new Map(); constructor(config: ReduxSagaInstrumentationConfig = {}) { - super('@example/redux-saga-instrumentation', '1.0.0', config); + super('@grafana/redux-saga-instrumentation', '1.0.0', config); } init() {} From de38a9f5cc3d80b1063adfa490c87f7069e6eb69 Mon Sep 17 00:00:00 2001 From: Marco Caldera Date: Tue, 31 Dec 2024 14:08:48 +0100 Subject: [PATCH 19/43] feat: add initial route change --- .../react-native-tracing/src/react-navigation/handlers.ts | 4 ++++ .../react-native-tracing/src/react-navigation/metaPage.ts | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/packages/react-native-tracing/src/react-navigation/handlers.ts b/packages/react-native-tracing/src/react-navigation/handlers.ts index 2c1f9d150..ed4955bab 100644 --- a/packages/react-native-tracing/src/react-navigation/handlers.ts +++ b/packages/react-native-tracing/src/react-navigation/handlers.ts @@ -103,6 +103,10 @@ export function initializeInitialRoute(navigationContainer: NavigationContainer, const initialRoute = navigationContainer.getCurrentRoute(); if (initialRoute && !state.isInitialized) { api.setView({ name: initialRoute.name }); + api.pushEvent(EVENT_ROUTE_CHANGE, { + fromRoute: state.fromRoute, + toRoute: initialRoute.name, + }); state.fromRoute = initialRoute.name; state.isInitialized = true; } diff --git a/packages/react-native-tracing/src/react-navigation/metaPage.ts b/packages/react-native-tracing/src/react-navigation/metaPage.ts index 669083101..fb1b2b038 100644 --- a/packages/react-native-tracing/src/react-navigation/metaPage.ts +++ b/packages/react-native-tracing/src/react-navigation/metaPage.ts @@ -4,7 +4,7 @@ import type { NavigationState } from './types'; export const navigationState: NavigationState = { activeSpan: undefined, - fromRoute: 'unknown', + fromRoute: 'startup', isInitialized: false, // Not used yet stateChangeTimeout: undefined, }; From 364acf14414c30478b904982b5b0e5315acfdc76 Mon Sep 17 00:00:00 2001 From: Lucas Bento Date: Thu, 2 Jan 2025 09:42:14 +0100 Subject: [PATCH 20/43] feat: add `sendTransform` option to `instrumentation-websocket` --- .../src/instrumentation.ts | 29 ++++++++++++------- .../instrumentation-websocket/src/types.ts | 1 + packages/react-native-tracing/src/wrapHOC.tsx | 2 +- 3 files changed, 20 insertions(+), 12 deletions(-) diff --git a/experimental/instrumentation-websocket/src/instrumentation.ts b/experimental/instrumentation-websocket/src/instrumentation.ts index 8168d5231..d4861baaf 100644 --- a/experimental/instrumentation-websocket/src/instrumentation.ts +++ b/experimental/instrumentation-websocket/src/instrumentation.ts @@ -16,13 +16,15 @@ export class WebSocketInstrumentation> extends Instr moduleName = this.component; private messageTransform: MessageTransform; + private sendTransform: MessageTransform; private pendingRequests = new Map(); constructor(options: WebSocketInstrumentationConfig = {}) { super('faro-instrumentation-websocket', VERSION, {}); - this.messageTransform = options.messageTransform ?? this.defaultMessageTransform; + this.messageTransform = options.messageTransform ?? this.defaultTransform; + this.sendTransform = options.sendTransform ?? this.defaultTransform; } protected init() { @@ -42,7 +44,7 @@ export class WebSocketInstrumentation> extends Instr ]; } - private defaultMessageTransform(message: WebSocketMessage): WebSocketMessage | null | undefined { + private defaultTransform(message: WebSocketMessage): WebSocketMessage | null | undefined { return message; } @@ -124,8 +126,6 @@ export class WebSocketInstrumentation> extends Instr kind: SpanKind.CLIENT, attributes: { 'websocket.url': url, - 'websocket.message_type': typeof event.data, - 'websocket.message_size': event.data?.length, 'websocket.message_payload': typeof transformedMessage === 'string' ? transformedMessage : JSON.stringify(transformedMessage), }, @@ -158,13 +158,24 @@ export class WebSocketInstrumentation> extends Instr this.send = function (data: string) { try { const requestId = generateRequestId(); - let modifiedData = data; + let modifiedData; try { const payload = JSON.parse(data); payload.requestId = requestId; - modifiedData = JSON.stringify(payload); + modifiedData = payload; } catch (e) { self._diag.debug('Failed to modify payload, not JSON:', e); + + originalSend.call(this, data); + + return; + } + + originalSend.call(this, JSON.stringify(modifiedData)); + + const transformedData = self.sendTransform(modifiedData); + if (!transformedData) { + return; } const sendSpan = tracer.startSpan( @@ -173,9 +184,7 @@ export class WebSocketInstrumentation> extends Instr kind: SpanKind.CLIENT, attributes: { 'websocket.url': url, - 'websocket.message_type': typeof data, - 'websocket.message_payload': data, - 'websocket.request_id': requestId, + 'websocket.message_payload': JSON.stringify(transformedData), }, }, this.wsContext @@ -185,8 +194,6 @@ export class WebSocketInstrumentation> extends Instr span: sendSpan, startTime: Date.now(), }); - - originalSend.call(this, modifiedData); } catch (error: unknown) { this.wsSpan.setStatus({ code: SpanStatusCode.ERROR, diff --git a/experimental/instrumentation-websocket/src/types.ts b/experimental/instrumentation-websocket/src/types.ts index a257923a3..9d54e38ac 100644 --- a/experimental/instrumentation-websocket/src/types.ts +++ b/experimental/instrumentation-websocket/src/types.ts @@ -6,6 +6,7 @@ export type MessageTransform> = ( export interface WebSocketInstrumentationConfig> { messageTransform?: MessageTransform; + sendTransform?: MessageTransform; } export interface PendingRequest { diff --git a/packages/react-native-tracing/src/wrapHOC.tsx b/packages/react-native-tracing/src/wrapHOC.tsx index c93ef84cc..64a07f00f 100644 --- a/packages/react-native-tracing/src/wrapHOC.tsx +++ b/packages/react-native-tracing/src/wrapHOC.tsx @@ -35,4 +35,4 @@ export function wrap

(WrappedComponent: React.ComponentType

) return ; }; -} \ No newline at end of file +} From d5f4bc65edee5dcc3e3d6fe4fce1e2ac0ce5898f Mon Sep 17 00:00:00 2001 From: Lucas Bento Date: Thu, 2 Jan 2025 12:02:21 +0100 Subject: [PATCH 21/43] fix: missing class methods --- .../NativeInstrumentationModule.java | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/packages/react-native-tracing/android/src/main/java/com/grafana/nativeinstrumentation/NativeInstrumentationModule.java b/packages/react-native-tracing/android/src/main/java/com/grafana/nativeinstrumentation/NativeInstrumentationModule.java index e5380b7eb..adf68f246 100644 --- a/packages/react-native-tracing/android/src/main/java/com/grafana/nativeinstrumentation/NativeInstrumentationModule.java +++ b/packages/react-native-tracing/android/src/main/java/com/grafana/nativeinstrumentation/NativeInstrumentationModule.java @@ -85,4 +85,12 @@ public void addListener(String eventName) {} @ReactMethod public void removeListeners(Integer count) {} + + @Override + public void receiveTouches(String eventName, WritableArray touches, WritableArray changedIndices) { + } + + @Override + public void receiveEvent(int targetTag, String eventName, WritableMap event) { + } } \ No newline at end of file From fdab13c0dd3852e5a0f4b95c96fbb67926ac39d3 Mon Sep 17 00:00:00 2001 From: Ilia Kurganskii Date: Thu, 2 Jan 2025 17:17:05 +0100 Subject: [PATCH 22/43] fix: fix build issue --- packages/react-native-tracing/package.json | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/packages/react-native-tracing/package.json b/packages/react-native-tracing/package.json index 4050e0de2..6dc2d3d31 100644 --- a/packages/react-native-tracing/package.json +++ b/packages/react-native-tracing/package.json @@ -55,7 +55,7 @@ "quality:circular-deps": "madge --circular ." }, "dependencies": { - "@grafana/faro-web-sdk": "^1.12.2", + "@grafana/react-native-sdk": "^1.12.2", "@opentelemetry/api": "^1.9.0", "@opentelemetry/context-zone": "1.26.0", "@opentelemetry/core": "^1.26.0", @@ -70,8 +70,5 @@ }, "publishConfig": { "access": "public" - }, - "peerDependencies": { - "@grafana/react-native-sdk": "^1.12.2" } } From ec6c4d2f3928626a97ba9509664337601d61767b Mon Sep 17 00:00:00 2001 From: Ilia Kurganskii Date: Thu, 2 Jan 2025 17:20:44 +0100 Subject: [PATCH 23/43] fix: fix build issue --- packages/react-native-tracing/src/wrapHOC.tsx | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/packages/react-native-tracing/src/wrapHOC.tsx b/packages/react-native-tracing/src/wrapHOC.tsx index 64a07f00f..c933b497f 100644 --- a/packages/react-native-tracing/src/wrapHOC.tsx +++ b/packages/react-native-tracing/src/wrapHOC.tsx @@ -1,6 +1,4 @@ import React, { useEffect } from 'react'; -// @ts-expect-error -// eslint-disable-next-line import { NativeModules } from 'react-native'; import { api } from './dependencies'; @@ -14,7 +12,7 @@ interface StartupMetrics { // TODO(@lucasbento): figure out where to best place this function const measureStartupTime = async (): Promise => { try { - const metrics: StartupMetrics = await NativeModules.NativeInstrumentation.getStartupTime(); + const metrics: StartupMetrics = await NativeModules['NativeInstrumentation'].getStartupTime(); api.pushMeasurement({ type: 'app_startup_time', From cd0ac8431a731560e2841b4ac26da43bd32a322e Mon Sep 17 00:00:00 2001 From: Ilia Kurganskii Date: Thu, 2 Jan 2025 17:32:53 +0100 Subject: [PATCH 24/43] fix: fix build issue --- packages/react-native-tracing/src/faroNativeInstrumentation.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/react-native-tracing/src/faroNativeInstrumentation.ts b/packages/react-native-tracing/src/faroNativeInstrumentation.ts index 6ebbfb469..6cbe926c1 100644 --- a/packages/react-native-tracing/src/faroNativeInstrumentation.ts +++ b/packages/react-native-tracing/src/faroNativeInstrumentation.ts @@ -3,7 +3,7 @@ // @ts-expect-error import { NativeModules } from 'react-native'; -import { BaseInstrumentation, VERSION } from '@grafana/faro-web-sdk'; +import { BaseInstrumentation, VERSION } from '@grafana/react-native-sdk'; import { setDependencies } from './dependencies'; From 0f153912723cccba799c0e10b3b3e904422e9911 Mon Sep 17 00:00:00 2001 From: Ilia Kurganskii Date: Thu, 2 Jan 2025 18:47:48 +0100 Subject: [PATCH 25/43] fix: fix build issue --- packages/react-native-tracing/package.json | 10 + .../src/faroNativeInstrumentation.ts | 5 - packages/react-native-tracing/src/wrapHOC.tsx | 4 +- yarn.lock | 3337 ++++++++++++++++- 4 files changed, 3283 insertions(+), 73 deletions(-) diff --git a/packages/react-native-tracing/package.json b/packages/react-native-tracing/package.json index 6dc2d3d31..61c799c68 100644 --- a/packages/react-native-tracing/package.json +++ b/packages/react-native-tracing/package.json @@ -68,6 +68,16 @@ "@opentelemetry/sdk-trace-web": "^1.26.0", "@opentelemetry/semantic-conventions": "^1.27.0" }, + "devDependencies": { + "@types/react": "^17.0.0", + "@types/react-native": "^0.63.0", + "react": "^17.0.0", + "react-native": "^0.63.0" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0", + "react-native": "^0.63.0" + }, "publishConfig": { "access": "public" } diff --git a/packages/react-native-tracing/src/faroNativeInstrumentation.ts b/packages/react-native-tracing/src/faroNativeInstrumentation.ts index 6cbe926c1..553631575 100644 --- a/packages/react-native-tracing/src/faroNativeInstrumentation.ts +++ b/packages/react-native-tracing/src/faroNativeInstrumentation.ts @@ -1,8 +1,3 @@ -// TODO(@lucasbento): fix this -/* eslint-disable import/no-unresolved */ -// @ts-expect-error -import { NativeModules } from 'react-native'; - import { BaseInstrumentation, VERSION } from '@grafana/react-native-sdk'; import { setDependencies } from './dependencies'; diff --git a/packages/react-native-tracing/src/wrapHOC.tsx b/packages/react-native-tracing/src/wrapHOC.tsx index c933b497f..09a25d577 100644 --- a/packages/react-native-tracing/src/wrapHOC.tsx +++ b/packages/react-native-tracing/src/wrapHOC.tsx @@ -1,5 +1,4 @@ import React, { useEffect } from 'react'; -import { NativeModules } from 'react-native'; import { api } from './dependencies'; @@ -12,7 +11,8 @@ interface StartupMetrics { // TODO(@lucasbento): figure out where to best place this function const measureStartupTime = async (): Promise => { try { - const metrics: StartupMetrics = await NativeModules['NativeInstrumentation'].getStartupTime(); + const metrics: StartupMetrics = + await require('react-native')['NativeModules']['NativeInstrumentation'].getStartupTime(); api.pushMeasurement({ type: 'app_startup_time', diff --git a/yarn.lock b/yarn.lock index 4e95ba96d..032a1f484 100644 --- a/yarn.lock +++ b/yarn.lock @@ -15,7 +15,7 @@ "@jridgewell/gen-mapping" "^0.3.0" "@jridgewell/trace-mapping" "^0.3.9" -"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.12.13", "@babel/code-frame@^7.25.9", "@babel/code-frame@^7.26.0": +"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.12.13", "@babel/code-frame@^7.25.9", "@babel/code-frame@^7.26.0", "@babel/code-frame@^7.26.2": version "7.26.2" resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.26.2.tgz#4b5fab97d33338eff916235055f0ebc21e573a85" integrity sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ== @@ -24,12 +24,17 @@ js-tokens "^4.0.0" picocolors "^1.0.0" +"@babel/compat-data@^7.20.5", "@babel/compat-data@^7.22.6": + version "7.26.3" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.26.3.tgz#99488264a56b2aded63983abd6a417f03b92ed02" + integrity sha512-nHIxvKPniQXpmQLb0vhY3VaFb3S0YrTAwpOWJZh1wn3oJPjJk9Asva204PsBdmAE8vpzfHudT8DB0scYvy9q0g== + "@babel/compat-data@^7.25.9": version "7.26.2" resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.26.2.tgz#278b6b13664557de95b8f35b90d96785850bb56e" integrity sha512-Z0WgzSEa+aUcdiJuCIqgujCshpMWgUpgOxXotrYPSA53hA3qopNaqcJpyr0hVb1FeWdnqFA35/fUtXgBK8srQg== -"@babel/core@^7.11.6", "@babel/core@^7.12.3", "@babel/core@^7.23.9", "@babel/core@^7.25.2": +"@babel/core@^7.0.0", "@babel/core@^7.11.6", "@babel/core@^7.12.3", "@babel/core@^7.23.9", "@babel/core@^7.25.2": version "7.26.0" resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.26.0.tgz#d78b6023cc8f3114ccf049eb219613f74a747b40" integrity sha512-i1SLeK+DzNnQ3LL/CswPCa/E5u4lh1k6IAEphON8F+cXt0t9euTshDru0q7/IqMa1PMPz5RnHuHscF8/ZJsStg== @@ -61,7 +66,25 @@ "@jridgewell/trace-mapping" "^0.3.25" jsesc "^3.0.2" -"@babel/helper-compilation-targets@^7.25.9": +"@babel/generator@^7.26.3", "@babel/generator@^7.5.0": + version "7.26.3" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.26.3.tgz#ab8d4360544a425c90c248df7059881f4b2ce019" + integrity sha512-6FF/urZvD0sTeO7k6/B15pMLC4CHUv1426lzr3N01aHJTl046uCAh9LXW/fzeXXjPNCJ6iABW5XaWOsIZB93aQ== + dependencies: + "@babel/parser" "^7.26.3" + "@babel/types" "^7.26.3" + "@jridgewell/gen-mapping" "^0.3.5" + "@jridgewell/trace-mapping" "^0.3.25" + jsesc "^3.0.2" + +"@babel/helper-annotate-as-pure@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.25.9.tgz#d8eac4d2dc0d7b6e11fa6e535332e0d3184f06b4" + integrity sha512-gv7320KBUFJz1RnylIg5WWYPRXKZ884AGkYpgpWW02TH66Dl+HaC1t1CKd0z3R4b6hdYEcmrNZHUmfCP+1u3/g== + dependencies: + "@babel/types" "^7.25.9" + +"@babel/helper-compilation-targets@^7.20.7", "@babel/helper-compilation-targets@^7.22.6", "@babel/helper-compilation-targets@^7.25.9": version "7.25.9" resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.25.9.tgz#55af025ce365be3cdc0c1c1e56c6af617ce88875" integrity sha512-j9Db8Suy6yV/VHa4qzrj9yZfZxhLWQdVnRlXxmKLYlhWUVB1sB2G5sxuWYXk/whHD9iW76PmNzxZ4UCnTQTVEQ== @@ -72,6 +95,47 @@ lru-cache "^5.1.1" semver "^6.3.1" +"@babel/helper-create-class-features-plugin@^7.18.6", "@babel/helper-create-class-features-plugin@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.25.9.tgz#7644147706bb90ff613297d49ed5266bde729f83" + integrity sha512-UTZQMvt0d/rSz6KI+qdu7GQze5TIajwTS++GUozlw8VBJDEOAqSXwm1WvmYEZwqdqSGQshRocPDqrt4HBZB3fQ== + dependencies: + "@babel/helper-annotate-as-pure" "^7.25.9" + "@babel/helper-member-expression-to-functions" "^7.25.9" + "@babel/helper-optimise-call-expression" "^7.25.9" + "@babel/helper-replace-supers" "^7.25.9" + "@babel/helper-skip-transparent-expression-wrappers" "^7.25.9" + "@babel/traverse" "^7.25.9" + semver "^6.3.1" + +"@babel/helper-create-regexp-features-plugin@^7.25.9": + version "7.26.3" + resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.26.3.tgz#5169756ecbe1d95f7866b90bb555b022595302a0" + integrity sha512-G7ZRb40uUgdKOQqPLjfD12ZmGA54PzqDFUv2BKImnC9QIfGhIHKvVML0oN8IUiDq4iRqpq74ABpvOaerfWdong== + dependencies: + "@babel/helper-annotate-as-pure" "^7.25.9" + regexpu-core "^6.2.0" + semver "^6.3.1" + +"@babel/helper-define-polyfill-provider@^0.6.2", "@babel/helper-define-polyfill-provider@^0.6.3": + version "0.6.3" + resolved "https://registry.yarnpkg.com/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.3.tgz#f4f2792fae2ef382074bc2d713522cf24e6ddb21" + integrity sha512-HK7Bi+Hj6H+VTHA3ZvBis7V/6hu9QuTrnMXNybfUf2iiuU/N97I8VjB+KbhFF8Rld/Lx5MzoCwPCpPjfK+n8Cg== + dependencies: + "@babel/helper-compilation-targets" "^7.22.6" + "@babel/helper-plugin-utils" "^7.22.5" + debug "^4.1.1" + lodash.debounce "^4.0.8" + resolve "^1.14.2" + +"@babel/helper-member-expression-to-functions@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.25.9.tgz#9dfffe46f727005a5ea29051ac835fb735e4c1a3" + integrity sha512-wbfdZ9w5vk0C0oyHqAJbc62+vet5prjj01jjJ8sKn3j9h3MQQlflEdXYvuqRWjHnM12coDEqiC1IRCi0U/EKwQ== + dependencies: + "@babel/traverse" "^7.25.9" + "@babel/types" "^7.25.9" + "@babel/helper-module-imports@^7.25.9": version "7.25.9" resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.25.9.tgz#e7f8d20602ebdbf9ebbea0a0751fb0f2a4141715" @@ -89,11 +153,35 @@ "@babel/helper-validator-identifier" "^7.25.9" "@babel/traverse" "^7.25.9" -"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.18.6", "@babel/helper-plugin-utils@^7.19.0", "@babel/helper-plugin-utils@^7.25.9", "@babel/helper-plugin-utils@^7.8.0": +"@babel/helper-optimise-call-expression@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.25.9.tgz#3324ae50bae7e2ab3c33f60c9a877b6a0146b54e" + integrity sha512-FIpuNaz5ow8VyrYcnXQTDRGvV6tTjkNtCK/RYNDXGSLlUD6cBuQTSw43CShGxjvfBTfcUA/r6UhUCbtYqkhcuQ== + dependencies: + "@babel/types" "^7.25.9" + +"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.18.6", "@babel/helper-plugin-utils@^7.19.0", "@babel/helper-plugin-utils@^7.20.2", "@babel/helper-plugin-utils@^7.22.5", "@babel/helper-plugin-utils@^7.25.9", "@babel/helper-plugin-utils@^7.8.0": version "7.25.9" resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.25.9.tgz#9cbdd63a9443a2c92a725cca7ebca12cc8dd9f46" integrity sha512-kSMlyUVdWe25rEsRGviIgOWnoT/nfABVWlqt9N19/dIPWViAOW2s9wznP5tURbs/IDuNk4gPy3YdYRgH3uxhBw== +"@babel/helper-replace-supers@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.25.9.tgz#ba447224798c3da3f8713fc272b145e33da6a5c5" + integrity sha512-IiDqTOTBQy0sWyeXyGSC5TBJpGFXBkRynjBeXsvbhQFKj2viwJC76Epz35YLU1fpe/Am6Vppb7W7zM4fPQzLsQ== + dependencies: + "@babel/helper-member-expression-to-functions" "^7.25.9" + "@babel/helper-optimise-call-expression" "^7.25.9" + "@babel/traverse" "^7.25.9" + +"@babel/helper-skip-transparent-expression-wrappers@^7.20.0", "@babel/helper-skip-transparent-expression-wrappers@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.25.9.tgz#0b2e1b62d560d6b1954893fd2b705dc17c91f0c9" + integrity sha512-K4Du3BFa3gvyhzgPcntrkDgZzQaq6uozzcpGbOO1OEJaI+EJdqWIMTLgFgQf6lrfiDFo5FU+BxKepI9RmZqahA== + dependencies: + "@babel/traverse" "^7.25.9" + "@babel/types" "^7.25.9" + "@babel/helper-string-parser@^7.25.9": version "7.25.9" resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.25.9.tgz#1aabb72ee72ed35789b4bbcad3ca2862ce614e8c" @@ -117,6 +205,13 @@ "@babel/template" "^7.25.9" "@babel/types" "^7.26.0" +"@babel/parser@^7.0.0", "@babel/parser@^7.26.3": + version "7.26.3" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.26.3.tgz#8c51c5db6ddf08134af1ddbacf16aaab48bac234" + integrity sha512-WJ/CvmY8Mea8iDXo6a7RK2wbmJITT5fN3BEkRuFlxVyNx8jOKIIhmC4fSkTcPcf8JyavbBwIe6OpiCOBXt/IcA== + dependencies: + "@babel/types" "^7.26.3" + "@babel/parser@^7.1.0", "@babel/parser@^7.14.7", "@babel/parser@^7.20.7", "@babel/parser@^7.21.8", "@babel/parser@^7.23.9", "@babel/parser@^7.25.9", "@babel/parser@^7.26.0", "@babel/parser@^7.26.2": version "7.26.2" resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.26.2.tgz#fd7b6f487cfea09889557ef5d4eeb9ff9a5abd11" @@ -124,6 +219,64 @@ dependencies: "@babel/types" "^7.26.0" +"@babel/plugin-external-helpers@^7.0.0": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-external-helpers/-/plugin-external-helpers-7.25.9.tgz#60c43843746fe3bccd7cb52d07c0b8699c21e6d4" + integrity sha512-Ro9pBweUvdxKyKKmWsqYaloZrxc2V+bseyPI7mV5DqBNvyNeGFFX+rPqicuEyOssiFYfoGyMjOF8n3ZAGBOPtg== + dependencies: + "@babel/helper-plugin-utils" "^7.25.9" + +"@babel/plugin-proposal-class-properties@^7.0.0": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.18.6.tgz#b110f59741895f7ec21a6fff696ec46265c446a3" + integrity sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.18.6" + "@babel/helper-plugin-utils" "^7.18.6" + +"@babel/plugin-proposal-export-default-from@^7.0.0": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-export-default-from/-/plugin-proposal-export-default-from-7.25.9.tgz#52702be6ef8367fc8f18b8438278332beeb8f87c" + integrity sha512-ykqgwNfSnNOB+C8fV5X4mG3AVmvu+WVxcaU9xHHtBb7PCrPeweMmPjGsn8eMaeJg6SJuoUuZENeeSWaarWqonQ== + dependencies: + "@babel/helper-plugin-utils" "^7.25.9" + +"@babel/plugin-proposal-nullish-coalescing-operator@^7.0.0": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.18.6.tgz#fdd940a99a740e577d6c753ab6fbb43fdb9467e1" + integrity sha512-wQxQzxYeJqHcfppzBDnm1yAY0jSRkUXR2z8RePZYrKwMKgMlE8+Z6LUno+bd6LvbGh8Gltvy74+9pIYkr+XkKA== + dependencies: + "@babel/helper-plugin-utils" "^7.18.6" + "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" + +"@babel/plugin-proposal-object-rest-spread@^7.0.0": + version "7.20.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.20.7.tgz#aa662940ef425779c75534a5c41e9d936edc390a" + integrity sha512-d2S98yCiLxDVmBmE8UjGcfPvNEUbA1U5q5WxaWFUGRzJSVAZqm5W6MbPct0jxnegUZ0niLeNX+IOzEs7wYg9Dg== + dependencies: + "@babel/compat-data" "^7.20.5" + "@babel/helper-compilation-targets" "^7.20.7" + "@babel/helper-plugin-utils" "^7.20.2" + "@babel/plugin-syntax-object-rest-spread" "^7.8.3" + "@babel/plugin-transform-parameters" "^7.20.7" + +"@babel/plugin-proposal-optional-catch-binding@^7.0.0": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.18.6.tgz#f9400d0e6a3ea93ba9ef70b09e72dd6da638a2cb" + integrity sha512-Q40HEhs9DJQyaZfUjjn6vE8Cv4GmMHCYuMGIWUnlxH6400VGxOuwWsPt4FxXxJkC/5eOzgn0z21M9gMT4MOhbw== + dependencies: + "@babel/helper-plugin-utils" "^7.18.6" + "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" + +"@babel/plugin-proposal-optional-chaining@^7.0.0": + version "7.21.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.21.0.tgz#886f5c8978deb7d30f678b2e24346b287234d3ea" + integrity sha512-p4zeefM72gpmEe2fkUr/OnOXpWEf8nAgk7ZYVqqfFiyIG7oFfVZcCrU64hWn5xp4tQ9LkV4bTIa5rD0KANpKNA== + dependencies: + "@babel/helper-plugin-utils" "^7.20.2" + "@babel/helper-skip-transparent-expression-wrappers" "^7.20.0" + "@babel/plugin-syntax-optional-chaining" "^7.8.3" + "@babel/plugin-syntax-async-generators@^7.8.4": version "7.8.4" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz#a983fb1aeb2ec3f6ed042a210f640e90e786fe0d" @@ -138,13 +291,34 @@ dependencies: "@babel/helper-plugin-utils" "^7.8.0" -"@babel/plugin-syntax-class-properties@^7.8.3": +"@babel/plugin-syntax-class-properties@^7.0.0", "@babel/plugin-syntax-class-properties@^7.8.3": version "7.12.13" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz#b5c987274c4a3a82b89714796931a6b53544ae10" integrity sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA== dependencies: "@babel/helper-plugin-utils" "^7.12.13" +"@babel/plugin-syntax-dynamic-import@^7.0.0": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz#62bf98b2da3cd21d626154fc96ee5b3cb68eacb3" + integrity sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-export-default-from@^7.0.0": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-export-default-from/-/plugin-syntax-export-default-from-7.25.9.tgz#86614767a9ff140366f0c3766ef218beb32a730a" + integrity sha512-9MhJ/SMTsVqsd69GyQg89lYR4o9T+oDGv5F6IsigxxqFVOyR/IflDLYP8WDI1l8fkhNGGktqkvL5qwNCtGEpgQ== + dependencies: + "@babel/helper-plugin-utils" "^7.25.9" + +"@babel/plugin-syntax-flow@^7.0.0", "@babel/plugin-syntax-flow@^7.2.0", "@babel/plugin-syntax-flow@^7.25.9": + version "7.26.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.26.0.tgz#96507595c21b45fccfc2bc758d5c45452e6164fa" + integrity sha512-B+O2DnPc0iG+YXFqOxv2WNuNU97ToWjOomUQ78DouOENWUaM5sVrmet9mcomUGQFwpJd//gvUagXBSdzO1fRKg== + dependencies: + "@babel/helper-plugin-utils" "^7.25.9" + "@babel/plugin-syntax-import-meta@^7.8.3": version "7.10.4" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz#ee601348c370fa334d2207be158777496521fd51" @@ -159,6 +333,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.8.0" +"@babel/plugin-syntax-jsx@^7.0.0", "@babel/plugin-syntax-jsx@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.25.9.tgz#a34313a178ea56f1951599b929c1ceacee719290" + integrity sha512-ld6oezHQMZsZfp6pWtbjaNDF2tiiCYYDqQszHt5VV437lewP9aSi2Of99CK0D0XB21k7FLgnLcmQKyKzynfeAA== + dependencies: + "@babel/helper-plugin-utils" "^7.25.9" + "@babel/plugin-syntax-jsx@^7.7.2": version "7.18.6" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.18.6.tgz#a8feef63b010150abd97f1649ec296e849943ca0" @@ -173,7 +354,7 @@ dependencies: "@babel/helper-plugin-utils" "^7.10.4" -"@babel/plugin-syntax-nullish-coalescing-operator@^7.8.3": +"@babel/plugin-syntax-nullish-coalescing-operator@^7.0.0", "@babel/plugin-syntax-nullish-coalescing-operator@^7.8.3": version "7.8.3" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz#167ed70368886081f74b5c36c65a88c03b66d1a9" integrity sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ== @@ -187,7 +368,7 @@ dependencies: "@babel/helper-plugin-utils" "^7.10.4" -"@babel/plugin-syntax-object-rest-spread@^7.8.3": +"@babel/plugin-syntax-object-rest-spread@^7.0.0", "@babel/plugin-syntax-object-rest-spread@^7.8.3": version "7.8.3" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz#60e225edcbd98a640332a2e72dd3e66f1af55871" integrity sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA== @@ -201,7 +382,7 @@ dependencies: "@babel/helper-plugin-utils" "^7.8.0" -"@babel/plugin-syntax-optional-chaining@^7.8.3": +"@babel/plugin-syntax-optional-chaining@^7.0.0", "@babel/plugin-syntax-optional-chaining@^7.8.3": version "7.8.3" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz#4f69c2ab95167e0180cd5336613f8c5788f7d48a" integrity sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg== @@ -215,6 +396,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.14.5" +"@babel/plugin-syntax-typescript@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.25.9.tgz#67dda2b74da43727cf21d46cf9afef23f4365399" + integrity sha512-hjMgRy5hb8uJJjUcdWunWVcoi9bGpJp8p5Ol1229PoN6aytsLwNMgmdftO23wnCLMfVmTwZDWMPNq/D1SY60JQ== + dependencies: + "@babel/helper-plugin-utils" "^7.25.9" + "@babel/plugin-syntax-typescript@^7.7.2": version "7.20.0" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.20.0.tgz#4e9a0cfc769c85689b77a2e642d24e9f697fc8c7" @@ -222,20 +410,255 @@ dependencies: "@babel/helper-plugin-utils" "^7.19.0" -"@babel/plugin-transform-react-jsx-self@^7.24.7": +"@babel/plugin-transform-arrow-functions@^7.0.0": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.25.9.tgz#7821d4410bee5daaadbb4cdd9a6649704e176845" + integrity sha512-6jmooXYIwn9ca5/RylZADJ+EnSxVUS5sjeJ9UPk6RWRzXCmOJCy6dqItPJFpw2cuCangPK4OYr5uhGKcmrm5Qg== + dependencies: + "@babel/helper-plugin-utils" "^7.25.9" + +"@babel/plugin-transform-block-scoped-functions@^7.0.0": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.25.9.tgz#5700691dbd7abb93de300ca7be94203764fce458" + integrity sha512-toHc9fzab0ZfenFpsyYinOX0J/5dgJVA2fm64xPewu7CoYHWEivIWKxkK2rMi4r3yQqLnVmheMXRdG+k239CgA== + dependencies: + "@babel/helper-plugin-utils" "^7.25.9" + +"@babel/plugin-transform-block-scoping@^7.0.0": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.25.9.tgz#c33665e46b06759c93687ca0f84395b80c0473a1" + integrity sha512-1F05O7AYjymAtqbsFETboN1NvBdcnzMerO+zlMyJBEz6WkMdejvGWw9p05iTSjC85RLlBseHHQpYaM4gzJkBGg== + dependencies: + "@babel/helper-plugin-utils" "^7.25.9" + +"@babel/plugin-transform-classes@^7.0.0": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.25.9.tgz#7152457f7880b593a63ade8a861e6e26a4469f52" + integrity sha512-mD8APIXmseE7oZvZgGABDyM34GUmK45Um2TXiBUt7PnuAxrgoSVf123qUzPxEr/+/BHrRn5NMZCdE2m/1F8DGg== + dependencies: + "@babel/helper-annotate-as-pure" "^7.25.9" + "@babel/helper-compilation-targets" "^7.25.9" + "@babel/helper-plugin-utils" "^7.25.9" + "@babel/helper-replace-supers" "^7.25.9" + "@babel/traverse" "^7.25.9" + globals "^11.1.0" + +"@babel/plugin-transform-computed-properties@^7.0.0": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.25.9.tgz#db36492c78460e534b8852b1d5befe3c923ef10b" + integrity sha512-HnBegGqXZR12xbcTHlJ9HGxw1OniltT26J5YpfruGqtUHlz/xKf/G2ak9e+t0rVqrjXa9WOhvYPz1ERfMj23AA== + dependencies: + "@babel/helper-plugin-utils" "^7.25.9" + "@babel/template" "^7.25.9" + +"@babel/plugin-transform-destructuring@^7.0.0": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.25.9.tgz#966ea2595c498224340883602d3cfd7a0c79cea1" + integrity sha512-WkCGb/3ZxXepmMiX101nnGiU+1CAdut8oHyEOHxkKuS1qKpU2SMXE2uSvfz8PBuLd49V6LEsbtyPhWC7fnkgvQ== + dependencies: + "@babel/helper-plugin-utils" "^7.25.9" + +"@babel/plugin-transform-exponentiation-operator@^7.0.0": + version "7.26.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.26.3.tgz#e29f01b6de302c7c2c794277a48f04a9ca7f03bc" + integrity sha512-7CAHcQ58z2chuXPWblnn1K6rLDnDWieghSOEmqQsrBenH0P9InCUtOJYD89pvngljmZlJcz3fcmgYsXFNGa1ZQ== + dependencies: + "@babel/helper-plugin-utils" "^7.25.9" + +"@babel/plugin-transform-flow-strip-types@^7.0.0": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.25.9.tgz#85879b42a8f5948fd6317069978e98f23ef8aec1" + integrity sha512-/VVukELzPDdci7UUsWQaSkhgnjIWXnIyRpM02ldxaVoFK96c41So8JcKT3m0gYjyv7j5FNPGS5vfELrWalkbDA== + dependencies: + "@babel/helper-plugin-utils" "^7.25.9" + "@babel/plugin-syntax-flow" "^7.25.9" + +"@babel/plugin-transform-for-of@^7.0.0": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.25.9.tgz#4bdc7d42a213397905d89f02350c5267866d5755" + integrity sha512-LqHxduHoaGELJl2uhImHwRQudhCM50pT46rIBNvtT/Oql3nqiS3wOwP+5ten7NpYSXrrVLgtZU3DZmPtWZo16A== + dependencies: + "@babel/helper-plugin-utils" "^7.25.9" + "@babel/helper-skip-transparent-expression-wrappers" "^7.25.9" + +"@babel/plugin-transform-function-name@^7.0.0": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.25.9.tgz#939d956e68a606661005bfd550c4fc2ef95f7b97" + integrity sha512-8lP+Yxjv14Vc5MuWBpJsoUCd3hD6V9DgBon2FVYL4jJgbnVQ9fTgYmonchzZJOVNgzEgbxp4OwAf6xz6M/14XA== + dependencies: + "@babel/helper-compilation-targets" "^7.25.9" + "@babel/helper-plugin-utils" "^7.25.9" + "@babel/traverse" "^7.25.9" + +"@babel/plugin-transform-literals@^7.0.0": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.25.9.tgz#1a1c6b4d4aa59bc4cad5b6b3a223a0abd685c9de" + integrity sha512-9N7+2lFziW8W9pBl2TzaNht3+pgMIRP74zizeCSrtnSKVdUl8mAjjOP2OOVQAfZ881P2cNjDj1uAMEdeD50nuQ== + dependencies: + "@babel/helper-plugin-utils" "^7.25.9" + +"@babel/plugin-transform-member-expression-literals@^7.0.0": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.25.9.tgz#63dff19763ea64a31f5e6c20957e6a25e41ed5de" + integrity sha512-PYazBVfofCQkkMzh2P6IdIUaCEWni3iYEerAsRWuVd8+jlM1S9S9cz1dF9hIzyoZ8IA3+OwVYIp9v9e+GbgZhA== + dependencies: + "@babel/helper-plugin-utils" "^7.25.9" + +"@babel/plugin-transform-modules-commonjs@^7.0.0": + version "7.26.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.26.3.tgz#8f011d44b20d02c3de44d8850d971d8497f981fb" + integrity sha512-MgR55l4q9KddUDITEzEFYn5ZsGDXMSsU9E+kh7fjRXTIC3RHqfCo8RPRbyReYJh44HQ/yomFkqbOFohXvDCiIQ== + dependencies: + "@babel/helper-module-transforms" "^7.26.0" + "@babel/helper-plugin-utils" "^7.25.9" + +"@babel/plugin-transform-object-assign@^7.0.0": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-assign/-/plugin-transform-object-assign-7.25.9.tgz#686203d53ee688d1642bf3a8c751dfb3981021c8" + integrity sha512-I/Vl1aQnPsrrn837oLbo+VQtkNcjuuiATqwmuweg4fTauwHHQoxyjmjjOVKyO8OaTxgqYTKW3LuQsykXjDf5Ag== + dependencies: + "@babel/helper-plugin-utils" "^7.25.9" + +"@babel/plugin-transform-object-super@^7.0.0": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.25.9.tgz#385d5de135162933beb4a3d227a2b7e52bb4cf03" + integrity sha512-Kj/Gh+Rw2RNLbCK1VAWj2U48yxxqL2x0k10nPtSdRa0O2xnHXalD0s+o1A6a0W43gJ00ANo38jxkQreckOzv5A== + dependencies: + "@babel/helper-plugin-utils" "^7.25.9" + "@babel/helper-replace-supers" "^7.25.9" + +"@babel/plugin-transform-parameters@^7.0.0", "@babel/plugin-transform-parameters@^7.20.7": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.25.9.tgz#b856842205b3e77e18b7a7a1b94958069c7ba257" + integrity sha512-wzz6MKwpnshBAiRmn4jR8LYz/g8Ksg0o80XmwZDlordjwEk9SxBzTWC7F5ef1jhbrbOW2DJ5J6ayRukrJmnr0g== + dependencies: + "@babel/helper-plugin-utils" "^7.25.9" + +"@babel/plugin-transform-property-literals@^7.0.0": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.25.9.tgz#d72d588bd88b0dec8b62e36f6fda91cedfe28e3f" + integrity sha512-IvIUeV5KrS/VPavfSM/Iu+RE6llrHrYIKY1yfCzyO/lMXHQ+p7uGhonmGVisv6tSBSVgWzMBohTcvkC9vQcQFA== + dependencies: + "@babel/helper-plugin-utils" "^7.25.9" + +"@babel/plugin-transform-react-display-name@^7.0.0": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.25.9.tgz#4b79746b59efa1f38c8695065a92a9f5afb24f7d" + integrity sha512-KJfMlYIUxQB1CJfO3e0+h0ZHWOTLCPP115Awhaz8U0Zpq36Gl/cXlpoyMRnUWlhNUBAzldnCiAZNvCDj7CrKxQ== + dependencies: + "@babel/helper-plugin-utils" "^7.25.9" + +"@babel/plugin-transform-react-jsx-self@^7.0.0", "@babel/plugin-transform-react-jsx-self@^7.24.7": version "7.25.9" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.25.9.tgz#c0b6cae9c1b73967f7f9eb2fca9536ba2fad2858" integrity sha512-y8quW6p0WHkEhmErnfe58r7x0A70uKphQm8Sp8cV7tjNQwK56sNVK0M73LK3WuYmsuyrftut4xAkjjgU0twaMg== dependencies: "@babel/helper-plugin-utils" "^7.25.9" -"@babel/plugin-transform-react-jsx-source@^7.24.7": +"@babel/plugin-transform-react-jsx-source@^7.0.0", "@babel/plugin-transform-react-jsx-source@^7.24.7": version "7.25.9" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.25.9.tgz#4c6b8daa520b5f155b5fb55547d7c9fa91417503" integrity sha512-+iqjT8xmXhhYv4/uiYd8FNQsraMFZIfxVSqxxVSZP0WbbSAWvBXAul0m/zu+7Vv4O/3WtApy9pmaTMiumEZgfg== dependencies: "@babel/helper-plugin-utils" "^7.25.9" +"@babel/plugin-transform-react-jsx@^7.0.0": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.25.9.tgz#06367940d8325b36edff5e2b9cbe782947ca4166" + integrity sha512-s5XwpQYCqGerXl+Pu6VDL3x0j2d82eiV77UJ8a2mDHAW7j9SWRqQ2y1fNo1Z74CdcYipl5Z41zvjj4Nfzq36rw== + dependencies: + "@babel/helper-annotate-as-pure" "^7.25.9" + "@babel/helper-module-imports" "^7.25.9" + "@babel/helper-plugin-utils" "^7.25.9" + "@babel/plugin-syntax-jsx" "^7.25.9" + "@babel/types" "^7.25.9" + +"@babel/plugin-transform-regenerator@^7.0.0": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.25.9.tgz#03a8a4670d6cebae95305ac6defac81ece77740b" + integrity sha512-vwDcDNsgMPDGP0nMqzahDWE5/MLcX8sv96+wfX7as7LoF/kr97Bo/7fI00lXY4wUXYfVmwIIyG80fGZ1uvt2qg== + dependencies: + "@babel/helper-plugin-utils" "^7.25.9" + regenerator-transform "^0.15.2" + +"@babel/plugin-transform-runtime@^7.0.0": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.25.9.tgz#62723ea3f5b31ffbe676da9d6dae17138ae580ea" + integrity sha512-nZp7GlEl+yULJrClz0SwHPqir3lc0zsPrDHQUcxGspSL7AKrexNSEfTbfqnDNJUO13bgKyfuOLMF8Xqtu8j3YQ== + dependencies: + "@babel/helper-module-imports" "^7.25.9" + "@babel/helper-plugin-utils" "^7.25.9" + babel-plugin-polyfill-corejs2 "^0.4.10" + babel-plugin-polyfill-corejs3 "^0.10.6" + babel-plugin-polyfill-regenerator "^0.6.1" + semver "^6.3.1" + +"@babel/plugin-transform-shorthand-properties@^7.0.0": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.25.9.tgz#bb785e6091f99f826a95f9894fc16fde61c163f2" + integrity sha512-MUv6t0FhO5qHnS/W8XCbHmiRWOphNufpE1IVxhK5kuN3Td9FT1x4rx4K42s3RYdMXCXpfWkGSbCSd0Z64xA7Ng== + dependencies: + "@babel/helper-plugin-utils" "^7.25.9" + +"@babel/plugin-transform-spread@^7.0.0": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.25.9.tgz#24a35153931b4ba3d13cec4a7748c21ab5514ef9" + integrity sha512-oNknIB0TbURU5pqJFVbOOFspVlrpVwo2H1+HUIsVDvp5VauGGDP1ZEvO8Nn5xyMEs3dakajOxlmkNW7kNgSm6A== + dependencies: + "@babel/helper-plugin-utils" "^7.25.9" + "@babel/helper-skip-transparent-expression-wrappers" "^7.25.9" + +"@babel/plugin-transform-sticky-regex@^7.0.0": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.25.9.tgz#c7f02b944e986a417817b20ba2c504dfc1453d32" + integrity sha512-WqBUSgeVwucYDP9U/xNRQam7xV8W5Zf+6Eo7T2SRVUFlhRiMNFdFz58u0KZmCVVqs2i7SHgpRnAhzRNmKfi2uA== + dependencies: + "@babel/helper-plugin-utils" "^7.25.9" + +"@babel/plugin-transform-template-literals@^7.0.0": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.25.9.tgz#6dbd4a24e8fad024df76d1fac6a03cf413f60fe1" + integrity sha512-o97AE4syN71M/lxrCtQByzphAdlYluKPDBzDVzMmfCobUjjhAryZV0AIpRPrxN0eAkxXO6ZLEScmt+PNhj2OTw== + dependencies: + "@babel/helper-plugin-utils" "^7.25.9" + +"@babel/plugin-transform-typescript@^7.5.0": + version "7.26.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.26.3.tgz#3d6add9c78735623317387ee26d5ada540eee3fd" + integrity sha512-6+5hpdr6mETwSKjmJUdYw0EIkATiQhnELWlE3kJFBwSg/BGIVwVaVbX+gOXBCdc7Ln1RXZxyWGecIXhUfnl7oA== + dependencies: + "@babel/helper-annotate-as-pure" "^7.25.9" + "@babel/helper-create-class-features-plugin" "^7.25.9" + "@babel/helper-plugin-utils" "^7.25.9" + "@babel/helper-skip-transparent-expression-wrappers" "^7.25.9" + "@babel/plugin-syntax-typescript" "^7.25.9" + +"@babel/plugin-transform-unicode-regex@^7.0.0": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.25.9.tgz#5eae747fe39eacf13a8bd006a4fb0b5d1fa5e9b1" + integrity sha512-yoxstj7Rg9dlNn9UQxzk4fcNivwv4nUYz7fYXBaKxvw/lnmPuOm/ikoELygbYq68Bls3D/D+NBPHiLwZdZZ4HA== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.25.9" + "@babel/helper-plugin-utils" "^7.25.9" + +"@babel/register@^7.0.0": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/register/-/register-7.25.9.tgz#1c465acf7dc983d70ccc318eb5b887ecb04f021b" + integrity sha512-8D43jXtGsYmEeDvm4MWHYUpWf8iiXgWYx3fW7E7Wb7Oe6FWqJPl5K6TuFW0dOwNZzEE5rjlaSJYH9JjrUKJszA== + dependencies: + clone-deep "^4.0.1" + find-cache-dir "^2.0.0" + make-dir "^2.1.0" + pirates "^4.0.6" + source-map-support "^0.5.16" + +"@babel/runtime@^7.0.0", "@babel/runtime@^7.8.4": + version "7.26.0" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.26.0.tgz#8600c2f595f277c60815256418b85356a65173c1" + integrity sha512-FDSOghenHTiToteC/QRlv2q3DhPZ/oOXTBoirfWNx1Cx3TMVcGWQtMMmQcSvb/JjpNeGzx8Pq/b4fKEJuWm1sw== + dependencies: + regenerator-runtime "^0.14.0" + "@babel/runtime@^7.12.1", "@babel/runtime@^7.12.5", "@babel/runtime@^7.21.0", "@babel/runtime@^7.24.7", "@babel/runtime@^7.5.5", "@babel/runtime@^7.6.3", "@babel/runtime@^7.8.7", "@babel/runtime@^7.9.2": version "7.24.7" resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.24.7.tgz#f4f0d5530e8dbdf59b3451b9b3e594b6ba082e12" @@ -243,7 +666,7 @@ dependencies: regenerator-runtime "^0.14.0" -"@babel/template@^7.25.9", "@babel/template@^7.3.3": +"@babel/template@^7.0.0", "@babel/template@^7.25.9", "@babel/template@^7.3.3": version "7.25.9" resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.25.9.tgz#ecb62d81a8a6f5dc5fe8abfc3901fc52ddf15016" integrity sha512-9DGttpmPvIxBb/2uwpVo3dqJ+O6RooAFOS+lB+xDqoE2PVCE8nfoHMdZLpfCQRLwvohzXISPZcgxt80xLfsuwg== @@ -252,6 +675,19 @@ "@babel/parser" "^7.25.9" "@babel/types" "^7.25.9" +"@babel/traverse@^7.0.0": + version "7.26.4" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.26.4.tgz#ac3a2a84b908dde6d463c3bfa2c5fdc1653574bd" + integrity sha512-fH+b7Y4p3yqvApJALCPJcwb0/XaOSgtK4pzV6WVjPR5GLFQBRI7pfoX2V2iM48NXvX07NUxxm1Vw98YjqTcU5w== + dependencies: + "@babel/code-frame" "^7.26.2" + "@babel/generator" "^7.26.3" + "@babel/parser" "^7.26.3" + "@babel/template" "^7.25.9" + "@babel/types" "^7.26.3" + debug "^4.3.1" + globals "^11.1.0" + "@babel/traverse@^7.25.9": version "7.25.9" resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.25.9.tgz#a50f8fe49e7f69f53de5bea7e413cd35c5e13c84" @@ -273,11 +709,27 @@ "@babel/helper-string-parser" "^7.25.9" "@babel/helper-validator-identifier" "^7.25.9" +"@babel/types@^7.26.3": + version "7.26.3" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.26.3.tgz#37e79830f04c2b5687acc77db97fbc75fb81f3c0" + integrity sha512-vN5p+1kl59GVKMvTHt55NzzmYVxprfJD+ql7U9NFIfKCBkYE55LYtS+WtPlaYOyzydrKI8Nezd+aZextrd+FMA== + dependencies: + "@babel/helper-string-parser" "^7.25.9" + "@babel/helper-validator-identifier" "^7.25.9" + "@bcoe/v8-coverage@^0.2.3": version "0.2.3" resolved "https://registry.yarnpkg.com/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz#75a2e8b51cb758a7553d6804a5932d7aace75c39" integrity sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw== +"@cnakazawa/watch@^1.0.3": + version "1.0.4" + resolved "https://registry.yarnpkg.com/@cnakazawa/watch/-/watch-1.0.4.tgz#f864ae85004d0fcab6f50be9141c4da368d1656a" + integrity sha512-v9kIhKwjeZThiWrLmj0y17CWoyddASLj9O2yvbZkbvw/N3rWOYy9zkV66ursAoVr0mV15bL8g0c4QZUE6cdDoQ== + dependencies: + exec-sh "^0.3.2" + minimist "^1.2.0" + "@colors/colors@1.5.0": version "1.5.0" resolved "https://registry.yarnpkg.com/@colors/colors/-/colors-1.5.0.tgz#bb504579c1cae923e6576a4f5da43d25f97bdbd9" @@ -540,11 +992,43 @@ protobufjs "^7.2.4" yargs "^17.7.2" +"@hapi/address@2.x.x": + version "2.1.4" + resolved "https://registry.yarnpkg.com/@hapi/address/-/address-2.1.4.tgz#5d67ed43f3fd41a69d4b9ff7b56e7c0d1d0a81e5" + integrity sha512-QD1PhQk+s31P1ixsX0H0Suoupp3VMXzIVMSwobR3F3MSUO2YCV0B7xqLcUw/Bh8yuvd3LhpyqLQWTNcRmp6IdQ== + +"@hapi/bourne@1.x.x": + version "1.3.2" + resolved "https://registry.yarnpkg.com/@hapi/bourne/-/bourne-1.3.2.tgz#0a7095adea067243ce3283e1b56b8a8f453b242a" + integrity sha512-1dVNHT76Uu5N3eJNTYcvxee+jzX4Z9lfciqRRHCU27ihbUcYi+iSc2iml5Ke1LXe1SyJCLA0+14Jh4tXJgOppA== + +"@hapi/hoek@8.x.x", "@hapi/hoek@^8.3.0": + version "8.5.1" + resolved "https://registry.yarnpkg.com/@hapi/hoek/-/hoek-8.5.1.tgz#fde96064ca446dec8c55a8c2f130957b070c6e06" + integrity sha512-yN7kbciD87WzLGc5539Tn0sApjyiGHAJgKvG9W8C7O+6c7qmoQMfVs0W4bX17eqz6C78QJqqFrtgdK5EWf6Qow== + "@hapi/hoek@^9.0.0", "@hapi/hoek@^9.3.0": version "9.3.0" resolved "https://registry.yarnpkg.com/@hapi/hoek/-/hoek-9.3.0.tgz#8368869dcb735be2e7f5cb7647de78e167a251fb" integrity sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ== +"@hapi/joi@^15.0.3": + version "15.1.1" + resolved "https://registry.yarnpkg.com/@hapi/joi/-/joi-15.1.1.tgz#c675b8a71296f02833f8d6d243b34c57b8ce19d7" + integrity sha512-entf8ZMOK8sc+8YfeOlM8pCfg3b5+WZIKBfUaaJT8UsjAAPjartzxIYm3TIbjvA4u+u++KbcXD38k682nVHDAQ== + dependencies: + "@hapi/address" "2.x.x" + "@hapi/bourne" "1.x.x" + "@hapi/hoek" "8.x.x" + "@hapi/topo" "3.x.x" + +"@hapi/topo@3.x.x": + version "3.1.6" + resolved "https://registry.yarnpkg.com/@hapi/topo/-/topo-3.1.6.tgz#68d935fa3eae7fdd5ab0d7f953f3205d8b2bfc29" + integrity sha512-tAag0jEcjwH+P2quUfipd7liWCNX2F8NvYjQp2wtInsZxnMlypdw0FtAOLxtvvkO+GSRRbmNi8m/5y42PQJYCQ== + dependencies: + "@hapi/hoek" "^8.3.0" + "@hapi/topo@^5.1.0": version "5.1.0" resolved "https://registry.yarnpkg.com/@hapi/topo/-/topo-5.1.0.tgz#dc448e332c6c6e37a4dc02fd84ba8d44b9afb012" @@ -609,6 +1093,15 @@ resolved "https://registry.yarnpkg.com/@istanbuljs/schema/-/schema-0.1.3.tgz#e45e384e4b8ec16bce2fd903af78450f6bf7ec98" integrity sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA== +"@jest/console@^24.9.0": + version "24.9.0" + resolved "https://registry.yarnpkg.com/@jest/console/-/console-24.9.0.tgz#79b1bc06fb74a8cfb01cbdedf945584b1b9707f0" + integrity sha512-Zuj6b8TnKXi3q4ymac8EQfc3ea/uhLeCGThFqXeC8H9/raaH8ARPUTdId+XyGd03Z4In0/VjD2OYFcBF09fNLQ== + dependencies: + "@jest/source-map" "^24.9.0" + chalk "^2.0.1" + slash "^2.0.0" + "@jest/console@^29.7.0": version "29.7.0" resolved "https://registry.yarnpkg.com/@jest/console/-/console-29.7.0.tgz#cd4822dbdb84529265c5a2bdb529a3c9cc950ffc" @@ -680,6 +1173,15 @@ expect "^29.7.0" jest-snapshot "^29.7.0" +"@jest/fake-timers@^24.9.0": + version "24.9.0" + resolved "https://registry.yarnpkg.com/@jest/fake-timers/-/fake-timers-24.9.0.tgz#ba3e6bf0eecd09a636049896434d306636540c93" + integrity sha512-eWQcNa2YSwzXWIMC5KufBh3oWRIijrQFROsIqt6v/NS9Io/gknw1jsAC9c+ih/RQX4A3O7SeWAhQeN0goKhT9A== + dependencies: + "@jest/types" "^24.9.0" + jest-message-util "^24.9.0" + jest-mock "^24.9.0" + "@jest/fake-timers@^29.7.0": version "29.7.0" resolved "https://registry.yarnpkg.com/@jest/fake-timers/-/fake-timers-29.7.0.tgz#fd91bf1fffb16d7d0d24a426ab1a47a49881a565" @@ -739,6 +1241,15 @@ dependencies: "@sinclair/typebox" "^0.27.8" +"@jest/source-map@^24.9.0": + version "24.9.0" + resolved "https://registry.yarnpkg.com/@jest/source-map/-/source-map-24.9.0.tgz#0e263a94430be4b41da683ccc1e6bffe2a191714" + integrity sha512-/Xw7xGlsZb4MJzNDgB7PW5crou5JqWiBQaz6xyPd3ArOg2nfn/PunV8+olXbbEZzNl591o5rWKE9BRDaFAuIBg== + dependencies: + callsites "^3.0.0" + graceful-fs "^4.1.15" + source-map "^0.6.0" + "@jest/source-map@^29.6.3": version "29.6.3" resolved "https://registry.yarnpkg.com/@jest/source-map/-/source-map-29.6.3.tgz#d90ba772095cf37a34a5eb9413f1b562a08554c4" @@ -748,6 +1259,15 @@ callsites "^3.0.0" graceful-fs "^4.2.9" +"@jest/test-result@^24.9.0": + version "24.9.0" + resolved "https://registry.yarnpkg.com/@jest/test-result/-/test-result-24.9.0.tgz#11796e8aa9dbf88ea025757b3152595ad06ba0ca" + integrity sha512-XEFrHbBonBJ8dGp2JmF8kP/nQI/ImPpygKHwQ/SY+es59Z3L5PI4Qb9TQQMAEeYsThG1xF0k6tmG0tIKATNiiA== + dependencies: + "@jest/console" "^24.9.0" + "@jest/types" "^24.9.0" + "@types/istanbul-lib-coverage" "^2.0.0" + "@jest/test-result@^29.7.0": version "29.7.0" resolved "https://registry.yarnpkg.com/@jest/test-result/-/test-result-29.7.0.tgz#8db9a80aa1a097bb2262572686734baed9b1657c" @@ -789,6 +1309,25 @@ slash "^3.0.0" write-file-atomic "^4.0.2" +"@jest/types@^24.9.0": + version "24.9.0" + resolved "https://registry.yarnpkg.com/@jest/types/-/types-24.9.0.tgz#63cb26cb7500d069e5a389441a7c6ab5e909fc59" + integrity sha512-XKK7ze1apu5JWQ5eZjHITP66AX+QsLlbaJRBGYr8pNzwcAE2JVkwnf0yqjHTsDRcjR0mujy/NmZMXw5kl+kGBw== + dependencies: + "@types/istanbul-lib-coverage" "^2.0.0" + "@types/istanbul-reports" "^1.1.1" + "@types/yargs" "^13.0.0" + +"@jest/types@^25.5.0": + version "25.5.0" + resolved "https://registry.yarnpkg.com/@jest/types/-/types-25.5.0.tgz#4d6a4793f7b9599fc3680877b856a97dbccf2a9d" + integrity sha512-OXD0RgQ86Tu3MazKo8bnrkDRaDXXMGUqd+kTtLtK1Zb7CRzQcaSRPPPV37SvYTdevXEBVxe0HXylEjs8ibkmCw== + dependencies: + "@types/istanbul-lib-coverage" "^2.0.0" + "@types/istanbul-reports" "^1.1.1" + "@types/yargs" "^15.0.0" + chalk "^3.0.0" + "@jest/types@^29.6.3": version "29.6.3" resolved "https://registry.yarnpkg.com/@jest/types/-/types-29.6.3.tgz#1131f8cf634e7e84c5e77bab12f052af585fba59" @@ -1735,6 +2274,126 @@ dependencies: "@swc/helpers" "^0.5.0" +"@react-native-community/cli-debugger-ui@^4.13.1": + version "4.13.1" + resolved "https://registry.yarnpkg.com/@react-native-community/cli-debugger-ui/-/cli-debugger-ui-4.13.1.tgz#07de6d4dab80ec49231de1f1fbf658b4ad39b32c" + integrity sha512-UFnkg5RTq3s2X15fSkrWY9+5BKOFjihNSnJjTV2H5PtTUFbd55qnxxPw8CxSfK0bXb1IrSvCESprk2LEpqr5cg== + dependencies: + serve-static "^1.13.1" + +"@react-native-community/cli-hermes@^4.13.0": + version "4.13.0" + resolved "https://registry.yarnpkg.com/@react-native-community/cli-hermes/-/cli-hermes-4.13.0.tgz#6243ed9c709dad5e523f1ccd7d21066b32f2899d" + integrity sha512-oG+w0Uby6rSGsUkJGLvMQctZ5eVRLLfhf84lLyz942OEDxFRa9U19YJxOe9FmgCKtotbYiM3P/XhK+SVCuerPQ== + dependencies: + "@react-native-community/cli-platform-android" "^4.13.0" + "@react-native-community/cli-tools" "^4.13.0" + chalk "^3.0.0" + hermes-profile-transformer "^0.0.6" + ip "^1.1.5" + +"@react-native-community/cli-platform-android@^4.10.0", "@react-native-community/cli-platform-android@^4.13.0": + version "4.13.0" + resolved "https://registry.yarnpkg.com/@react-native-community/cli-platform-android/-/cli-platform-android-4.13.0.tgz#922681ec82ee1aadd993598b814df1152118be02" + integrity sha512-3i8sX8GklEytUZwPnojuoFbCjIRzMugCdzDIdZ9UNmi/OhD4/8mLGO0dgXfT4sMWjZwu3qjy45sFfk2zOAgHbA== + dependencies: + "@react-native-community/cli-tools" "^4.13.0" + chalk "^3.0.0" + execa "^1.0.0" + fs-extra "^8.1.0" + glob "^7.1.3" + jetifier "^1.6.2" + lodash "^4.17.15" + logkitty "^0.7.1" + slash "^3.0.0" + xmldoc "^1.1.2" + +"@react-native-community/cli-platform-ios@^4.10.0": + version "4.13.0" + resolved "https://registry.yarnpkg.com/@react-native-community/cli-platform-ios/-/cli-platform-ios-4.13.0.tgz#a738915c68cac86df54e578b59a1311ea62b1aef" + integrity sha512-6THlTu8zp62efkzimfGr3VIuQJ2514o+vScZERJCV1xgEi8XtV7mb/ZKt9o6Y9WGxKKkc0E0b/aVAtgy+L27CA== + dependencies: + "@react-native-community/cli-tools" "^4.13.0" + chalk "^3.0.0" + glob "^7.1.3" + js-yaml "^3.13.1" + lodash "^4.17.15" + plist "^3.0.1" + xcode "^2.0.0" + +"@react-native-community/cli-server-api@^4.13.1": + version "4.13.1" + resolved "https://registry.yarnpkg.com/@react-native-community/cli-server-api/-/cli-server-api-4.13.1.tgz#bee7ee9702afce848e9d6ca3dcd5669b99b125bd" + integrity sha512-vQzsFKD9CjHthA2ehTQX8c7uIzlI9A7ejaIow1I9RlEnLraPH2QqVDmzIdbdh5Od47UPbRzamCgAP8Bnqv3qwQ== + dependencies: + "@react-native-community/cli-debugger-ui" "^4.13.1" + "@react-native-community/cli-tools" "^4.13.0" + compression "^1.7.1" + connect "^3.6.5" + errorhandler "^1.5.0" + nocache "^2.1.0" + pretty-format "^25.1.0" + serve-static "^1.13.1" + ws "^1.1.0" + +"@react-native-community/cli-tools@^4.13.0": + version "4.13.0" + resolved "https://registry.yarnpkg.com/@react-native-community/cli-tools/-/cli-tools-4.13.0.tgz#b406463d33af16cedc4305a9a9257ed32845cf1b" + integrity sha512-s4f489h5+EJksn4CfheLgv5PGOM0CDmK1UEBLw2t/ncWs3cW2VI7vXzndcd/WJHTv3GntJhXDcJMuL+Z2IAOgg== + dependencies: + chalk "^3.0.0" + lodash "^4.17.15" + mime "^2.4.1" + node-fetch "^2.6.0" + open "^6.2.0" + shell-quote "1.6.1" + +"@react-native-community/cli-types@^4.10.1": + version "4.10.1" + resolved "https://registry.yarnpkg.com/@react-native-community/cli-types/-/cli-types-4.10.1.tgz#d68a2dcd1649d3b3774823c64e5e9ce55bfbe1c9" + integrity sha512-ael2f1onoPF3vF7YqHGWy7NnafzGu+yp88BbFbP0ydoCP2xGSUzmZVw0zakPTC040Id+JQ9WeFczujMkDy6jYQ== + +"@react-native-community/cli@^4.10.0": + version "4.14.0" + resolved "https://registry.yarnpkg.com/@react-native-community/cli/-/cli-4.14.0.tgz#bb106a98341bfa2db36060091ff90bfe82ea4f55" + integrity sha512-EYJKBuxFxAu/iwNUfwDq41FjORpvSh1wvQ3qsHjzcR5uaGlWEOJrd3uNJDuKBAS0TVvbEesLF9NEXipjyRVr4Q== + dependencies: + "@hapi/joi" "^15.0.3" + "@react-native-community/cli-debugger-ui" "^4.13.1" + "@react-native-community/cli-hermes" "^4.13.0" + "@react-native-community/cli-server-api" "^4.13.1" + "@react-native-community/cli-tools" "^4.13.0" + "@react-native-community/cli-types" "^4.10.1" + chalk "^3.0.0" + command-exists "^1.2.8" + commander "^2.19.0" + cosmiconfig "^5.1.0" + deepmerge "^3.2.0" + envinfo "^7.7.2" + execa "^1.0.0" + find-up "^4.1.0" + fs-extra "^8.1.0" + glob "^7.1.3" + graceful-fs "^4.1.3" + inquirer "^3.0.6" + leven "^3.1.0" + lodash "^4.17.15" + metro "^0.59.0" + metro-config "^0.59.0" + metro-core "^0.59.0" + metro-react-native-babel-transformer "^0.59.0" + metro-resolver "^0.59.0" + minimist "^1.2.0" + mkdirp "^0.5.1" + node-stream-zip "^1.9.1" + ora "^3.4.0" + pretty-format "^25.2.0" + semver "^6.3.0" + serve-static "^1.13.1" + strip-ansi "^5.2.0" + sudo-prompt "^9.0.0" + wcwidth "^1.0.1" + "@redux-saga/core@^1.3.0": version "1.3.0" resolved "https://registry.yarnpkg.com/@redux-saga/core/-/core-1.3.0.tgz#2ce08b73d407fc6ea9e7f7d83d2e97d981a3a8b8" @@ -2269,6 +2928,14 @@ dependencies: "@types/istanbul-lib-coverage" "*" +"@types/istanbul-reports@^1.1.1": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@types/istanbul-reports/-/istanbul-reports-1.1.2.tgz#e875cc689e47bce549ec81f3df5e6f6f11cfaeb2" + integrity sha512-P/W9yOX/3oPZSpaYOCQzGqgCQRXn0FFO/V8bWrCQs+wLmvVVxk6CRBXALEvNs9OHIatlnlFokfhuDo2ug01ciw== + dependencies: + "@types/istanbul-lib-coverage" "*" + "@types/istanbul-lib-report" "*" + "@types/istanbul-reports@^3.0.0": version "3.0.1" resolved "https://registry.yarnpkg.com/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz#9153fe98bba2bd565a63add9436d6f0d7f8468ff" @@ -2389,6 +3056,13 @@ dependencies: "@types/react" "*" +"@types/react-native@^0.63.0": + version "0.63.75" + resolved "https://registry.yarnpkg.com/@types/react-native/-/react-native-0.63.75.tgz#fbc6a3c45bcce963f7cc9803a65d8f841197f7d0" + integrity sha512-SPlOPHMoSP7eeMaEb3ef1T/Hjsjub4xl1ipj4tqaXZtuF+1Pfgn+S3U2/tHWN++S41c+4BJp+krUJ1LXy7pY7w== + dependencies: + "@types/react" "^16" + "@types/react-redux@^7.1.25": version "7.1.25" resolved "https://registry.yarnpkg.com/@types/react-redux/-/react-redux-7.1.25.tgz#de841631205b24f9dfb4967dd4a7901e048f9a88" @@ -2440,6 +3114,24 @@ "@types/scheduler" "*" csstype "^3.0.2" +"@types/react@^16": + version "16.14.62" + resolved "https://registry.yarnpkg.com/@types/react/-/react-16.14.62.tgz#449e4e81caaf132d0c2c390644e577702db1dd9e" + integrity sha512-BWf7hqninZav6nerxXj+NeZT/mTpDeG6Lk2zREHAy63CrnXoOGPGtNqTFYFN/sqpSaREDP5otVV88axIXmKfGA== + dependencies: + "@types/prop-types" "*" + "@types/scheduler" "^0.16" + csstype "^3.0.2" + +"@types/react@^17.0.0": + version "17.0.83" + resolved "https://registry.yarnpkg.com/@types/react/-/react-17.0.83.tgz#b477c56387b74279281149dcf5ba2a1e2216d131" + integrity sha512-l0m4ArKJvmFtR4e8UmKrj1pB4tUgOhJITf+mADyF/p69Ts1YAR/E+G9XEM0mHXKVRa1dQNHseyyDNzeuAXfXQw== + dependencies: + "@types/prop-types" "*" + "@types/scheduler" "^0.16" + csstype "^3.0.2" + "@types/resolve@1.20.2": version "1.20.2" resolved "https://registry.yarnpkg.com/@types/resolve/-/resolve-1.20.2.tgz#97d26e00cd4a0423b4af620abecf3e6f442b7975" @@ -2450,6 +3142,11 @@ resolved "https://registry.yarnpkg.com/@types/scheduler/-/scheduler-0.16.2.tgz#1a62f89525723dde24ba1b01b092bf5df8ad4d39" integrity sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew== +"@types/scheduler@^0.16": + version "0.16.8" + resolved "https://registry.yarnpkg.com/@types/scheduler/-/scheduler-0.16.8.tgz#ce5ace04cfeabe7ef87c0091e50752e36707deff" + integrity sha512-WZLiwShhwLRmeV6zH+GkbOFT6Z6VklCItrDioxUnv+u4Ll+8vKeFySoFyK/0ctcRpOmwAicELfmys1sDc/Rw+A== + "@types/semver@^7.3.12": version "7.5.8" resolved "https://registry.yarnpkg.com/@types/semver/-/semver-7.5.8.tgz#8268a8c57a3e4abd25c165ecd36237db7948a55e" @@ -2487,6 +3184,11 @@ resolved "https://registry.yarnpkg.com/@types/sizzle/-/sizzle-2.3.9.tgz#d4597dbd4618264c414d7429363e3f50acb66ea2" integrity sha512-xzLEyKB50yqCUPUJkIsrVvoWNfFUbIZI+RspLWt8u+tIW/BetMBZtgV2LY/2o+tYH8dRvQ+eoPf3NdhQCcLE2w== +"@types/stack-utils@^1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@types/stack-utils/-/stack-utils-1.0.1.tgz#0a851d3bd96498fa25c33ab7278ed3bd65f06c3e" + integrity sha512-l42BggppR6zLmpfU6fq9HEa2oGPEI8yrSPL3GITjfRInppYFahObbIQOQK3UGxEnyQpltZLaPe75046NOZQikw== + "@types/stack-utils@^2.0.0": version "2.0.1" resolved "https://registry.yarnpkg.com/@types/stack-utils/-/stack-utils-2.0.1.tgz#20f18294f797f2209b5f65c8e3b5c8e8261d127c" @@ -2522,6 +3224,20 @@ resolved "https://registry.yarnpkg.com/@types/yargs-parser/-/yargs-parser-21.0.0.tgz#0c60e537fa790f5f9472ed2776c2b71ec117351b" integrity sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA== +"@types/yargs@^13.0.0": + version "13.0.12" + resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-13.0.12.tgz#d895a88c703b78af0465a9de88aa92c61430b092" + integrity sha512-qCxJE1qgz2y0hA4pIxjBR+PelCH0U5CK1XJXFwCNqfmliatKp47UCXXE9Dyk1OXBDLvsCF57TqQEJaeLfDYEOQ== + dependencies: + "@types/yargs-parser" "*" + +"@types/yargs@^15.0.0": + version "15.0.19" + resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-15.0.19.tgz#328fb89e46109ecbdb70c295d96ff2f46dfd01b9" + integrity sha512-2XUaGVmyQjgyAZldf0D0c14vvo/yv0MhQBSTJcejMMaitsn3nxCB6TmH4G0ZQf+uxROOa9mpanoSm8h6SG/1ZA== + dependencies: + "@types/yargs-parser" "*" + "@types/yargs@^17.0.8": version "17.0.19" resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-17.0.19.tgz#8dbecdc9ab48bee0cb74f6e3327de3fa0d0c98ae" @@ -2686,6 +3402,11 @@ resolved "https://registry.npmjs.org/@web3-storage/multipart-parser/-/multipart-parser-1.0.0.tgz#6b69dc2a32a5b207ba43e556c25cc136a56659c4" integrity sha512-BEO6al7BYqcnfX15W2cnGR+Q566ACXAT9UQykORCWW80lmkpWsnEob6zJS1ZVBKsSJC8+7vJkHwlp+lXG1UCdw== +"@xmldom/xmldom@^0.8.8": + version "0.8.10" + resolved "https://registry.yarnpkg.com/@xmldom/xmldom/-/xmldom-0.8.10.tgz#a1337ca426aa61cef9fe15b5b28e340a72f6fa99" + integrity sha512-2WALfTl4xo2SkGCYRt6rDTFfk9R1czmBvUQy12gK2KuRKIpWEhcbbzy8EZXtz/jkRqHX8bFEc6FC1HjX4TUWYw== + "@yarnpkg/lockfile@^1.1.0": version "1.1.0" resolved "https://registry.yarnpkg.com/@yarnpkg/lockfile/-/lockfile-1.1.0.tgz#e77a97fbd345b76d83245edcd17d393b1b41fb31" @@ -2741,7 +3462,12 @@ abort-controller@^3.0.0: dependencies: event-target-shim "^5.0.0" -accepts@~1.3.5, accepts@~1.3.8: +absolute-path@^0.0.0: + version "0.0.0" + resolved "https://registry.yarnpkg.com/absolute-path/-/absolute-path-0.0.0.tgz#a78762fbdadfb5297be99b15d35a785b2f095bf7" + integrity sha512-HQiug4c+/s3WOvEnDRxXVmNtSG5s2gJM9r19BTcqjp7BWcE48PB+Y2G6jE65kqI0LpsQeMZygt/b60Gi4KxGyA== + +accepts@~1.3.5, accepts@~1.3.7, accepts@~1.3.8: version "1.3.8" resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.8.tgz#0bf0be125b67014adcb0b0921e62db7bffe16b2e" integrity sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw== @@ -2814,11 +3540,35 @@ ajv@^6.12.4: json-schema-traverse "^0.4.1" uri-js "^4.2.2" +anser@^1.4.9: + version "1.4.10" + resolved "https://registry.yarnpkg.com/anser/-/anser-1.4.10.tgz#befa3eddf282684bd03b63dcda3927aef8c2e35b" + integrity sha512-hCv9AqTQ8ycjpSd3upOJd7vFwW1JaoYQ7tpham03GJ1ca8/65rqn0RpaWpItOAd6ylW9wAw6luXYPJIyPFVOww== + +ansi-colors@^1.0.1: + version "1.1.0" + resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-1.1.0.tgz#6374b4dd5d4718ff3ce27a671a3b1cad077132a9" + integrity sha512-SFKX67auSNoVR38N3L+nvsPjOE0bybKTYbkf5tRvushrAPQ9V75huw0ZxBkKVeRU9kqH3d6HA4xTckbwZ4ixmA== + dependencies: + ansi-wrap "^0.1.0" + ansi-colors@^4.1.1: version "4.1.3" resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-4.1.3.tgz#37611340eb2243e70cc604cad35d63270d48781b" integrity sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw== +ansi-cyan@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/ansi-cyan/-/ansi-cyan-0.1.1.tgz#538ae528af8982f28ae30d86f2f17456d2609873" + integrity sha512-eCjan3AVo/SxZ0/MyIYRtkpxIu/H3xZN7URr1vXVrISxeyz8fUFz0FJziamK4sS8I+t35y4rHg1b2PklyBe/7A== + dependencies: + ansi-wrap "0.1.0" + +ansi-escapes@^3.0.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-3.2.0.tgz#8780b98ff9dbf5638152d1f1fe5c1d7b4442976b" + integrity sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ== + ansi-escapes@^4.2.1, ansi-escapes@^4.3.0: version "4.3.2" resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.3.2.tgz#6b2291d1db7d98b6521d5f1efa42d0f3a9feb65e" @@ -2826,7 +3576,40 @@ ansi-escapes@^4.2.1, ansi-escapes@^4.3.0: dependencies: type-fest "^0.21.3" -ansi-regex@^5.0.1: +ansi-fragments@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/ansi-fragments/-/ansi-fragments-0.2.1.tgz#24409c56c4cc37817c3d7caa99d8969e2de5a05e" + integrity sha512-DykbNHxuXQwUDRv5ibc2b0x7uw7wmwOGLBUd5RmaQ5z8Lhx19vwvKV+FAsM5rEA6dEcHxX+/Ad5s9eF2k2bB+w== + dependencies: + colorette "^1.0.7" + slice-ansi "^2.0.0" + strip-ansi "^5.0.0" + +ansi-gray@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/ansi-gray/-/ansi-gray-0.1.1.tgz#2962cf54ec9792c48510a3deb524436861ef7251" + integrity sha512-HrgGIZUl8h2EHuZaU9hTR/cU5nhKxpVE1V6kdGsQ8e4zirElJ5fvtfc8N7Q1oq1aatO275i8pUFUCpNWCAnVWw== + dependencies: + ansi-wrap "0.1.0" + +ansi-red@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/ansi-red/-/ansi-red-0.1.1.tgz#8c638f9d1080800a353c9c28c8a81ca4705d946c" + integrity sha512-ewaIr5y+9CUTGFwZfpECUbFlGcC0GCw1oqR9RI6h1gQCd9Aj2GxSckCnPsVJnmfMZbwFYE+leZGASgkWl06Jow== + dependencies: + ansi-wrap "0.1.0" + +ansi-regex@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.1.tgz#123d6479e92ad45ad897d4054e3c7ca7db4944e1" + integrity sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw== + +ansi-regex@^4.0.0, ansi-regex@^4.1.0: + version "4.1.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-4.1.1.tgz#164daac87ab2d6f6db3a29875e2d1766582dabed" + integrity sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g== + +ansi-regex@^5.0.0, ansi-regex@^5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== @@ -2836,7 +3619,7 @@ ansi-regex@^6.0.1: resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-6.0.1.tgz#3183e38fae9a65d7cb5e53945cd5897d0260a06a" integrity sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA== -ansi-styles@^3.2.1: +ansi-styles@^3.2.0, ansi-styles@^3.2.1: version "3.2.1" resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== @@ -2860,11 +3643,24 @@ ansi-styles@^6.0.0, ansi-styles@^6.1.0: resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-6.2.1.tgz#0e62320cf99c21afff3b3012192546aacbfb05c5" integrity sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug== +ansi-wrap@0.1.0, ansi-wrap@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/ansi-wrap/-/ansi-wrap-0.1.0.tgz#a82250ddb0015e9a27ca82e82ea603bbfa45efaf" + integrity sha512-ZyznvL8k/FZeQHr2T6LzcJ/+vBApDnMNZvfVFy3At0knswWd6rJ3/0Hhmpu8oqa6C92npmozs890sX9Dl6q+Qw== + any-promise@^1.1.0: version "1.3.0" resolved "https://registry.yarnpkg.com/any-promise/-/any-promise-1.3.0.tgz#abc6afeedcea52e809cdc0376aed3ce39635d17f" integrity sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A== +anymatch@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-2.0.0.tgz#bcb24b4f37934d9aa7ac17b4adaf89e7c76ef2eb" + integrity sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw== + dependencies: + micromatch "^3.1.4" + normalize-path "^2.1.1" + anymatch@^3.0.3, anymatch@~3.1.2: version "3.1.3" resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.3.tgz#790c58b19ba1720a84205b57c618d5ad8524973e" @@ -2923,6 +3719,34 @@ argparse@^2.0.1: resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== +arr-diff@^1.0.1: + version "1.1.0" + resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-1.1.0.tgz#687c32758163588fef7de7b36fabe495eb1a399a" + integrity sha512-OQwDZUqYaQwyyhDJHThmzId8daf4/RFNLaeh3AevmSeZ5Y7ug4Ga/yKc6l6kTZOBW781rCj103ZuTh8GAsB3+Q== + dependencies: + arr-flatten "^1.0.1" + array-slice "^0.2.3" + +arr-diff@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-4.0.0.tgz#d6461074febfec71e7e15235761a329a5dc7c520" + integrity sha512-YVIQ82gZPGBebQV/a8dar4AitzCQs0jjXwMPZllpXMaGjXPYVUawSxQrRsjhjupyVxEvbHgUmIhKVlND+j02kA== + +arr-flatten@^1.0.1, arr-flatten@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.1.0.tgz#36048bbff4e7b47e136644316c99669ea5ae91f1" + integrity sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg== + +arr-union@^2.0.1: + version "2.1.0" + resolved "https://registry.yarnpkg.com/arr-union/-/arr-union-2.1.0.tgz#20f9eab5ec70f5c7d215b1077b1c39161d292c7d" + integrity sha512-t5db90jq+qdgk8aFnxEkjqta0B/GHrM1pxzuuZz2zWsOXc5nKu3t+76s/PQBA8FTcM/ipspIH9jWG4OxCBc2eA== + +arr-union@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/arr-union/-/arr-union-3.1.0.tgz#e39b09aea9def866a8f206e288af63919bae39c4" + integrity sha512-sKpyeERZ02v1FeCZT8lrfJq5u6goHCtpTAzPwJYe7c8SPFOboNjNg1vz2L4VTn9T4PQxEx13TbXLmYUcS6Ug7Q== + array-buffer-byte-length@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/array-buffer-byte-length/-/array-buffer-byte-length-1.0.1.tgz#1e5583ec16763540a27ae52eed99ff899223568f" @@ -2936,6 +3760,11 @@ array-differ@^3.0.0: resolved "https://registry.yarnpkg.com/array-differ/-/array-differ-3.0.0.tgz#3cbb3d0f316810eafcc47624734237d6aee4ae6b" integrity sha512-THtfYS6KtME/yIAhKjZ2ul7XI96lQGHRputJQHO80LAWQnuGP4iCIN8vdMRboGbIEYBwU33q8Tch1os2+X0kMg== +array-filter@~0.0.0: + version "0.0.1" + resolved "https://registry.yarnpkg.com/array-filter/-/array-filter-0.0.1.tgz#7da8cf2e26628ed732803581fd21f67cacd2eeec" + integrity sha512-VW0FpCIhjZdarWjIz8Vpva7U95fl2Jn+b+mmFFMLn8PIVscOQcAgEznwUzTEuUHuqZqIxwzRlcaN/urTFFQoiw== + array-flatten@1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2" @@ -2957,11 +3786,31 @@ array-includes@^3.1.5, array-includes@^3.1.6, array-includes@^3.1.7: get-intrinsic "^1.2.1" is-string "^1.0.7" +array-map@~0.0.0: + version "0.0.1" + resolved "https://registry.yarnpkg.com/array-map/-/array-map-0.0.1.tgz#d1bf3cc8813a7daaa335e5c8eb21d9d06230c1a7" + integrity sha512-sxHIeJTGEsRC8/hYkZzdJNNPZ41EXHVys7pqMw1iwE/Kx8/hto0UbDuGQsSJ0ujPovj9qUZl6EOY/EiZ2g3d9Q== + +array-reduce@~0.0.0: + version "0.0.0" + resolved "https://registry.yarnpkg.com/array-reduce/-/array-reduce-0.0.0.tgz#173899d3ffd1c7d9383e4479525dbe278cab5f2b" + integrity sha512-8jR+StqaC636u7h3ye1co3lQRefgVVUQUhuAmRbDqIMeR2yuXzRvkCNQiQ5J/wbREmoBLNtp13dhaaVpZQDRUw== + +array-slice@^0.2.3: + version "0.2.3" + resolved "https://registry.yarnpkg.com/array-slice/-/array-slice-0.2.3.tgz#dd3cfb80ed7973a75117cdac69b0b99ec86186f5" + integrity sha512-rlVfZW/1Ph2SNySXwR9QYkChp8EkOEiTMO5Vwx60usw04i4nWemkm9RXmQqgkQFaLHsqLuADvjp6IfgL9l2M8Q== + array-union@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d" integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== +array-unique@^0.3.2: + version "0.3.2" + resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428" + integrity sha512-SleRWjh9JUud2wH1hPs9rZBZ33H6T9HOiL0uwGnGx9FpE6wKGyfWugmbkEOIs6qWrZhg0LWeLziLrEwQJhs5mQ== + array.prototype.filter@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/array.prototype.filter/-/array.prototype.filter-1.0.3.tgz#423771edeb417ff5914111fff4277ea0624c0d0e" @@ -3039,6 +3888,11 @@ arrify@^2.0.1: resolved "https://registry.yarnpkg.com/arrify/-/arrify-2.0.1.tgz#c9655e9331e0abcd588d2a7cad7e9956f66701fa" integrity sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug== +asap@~2.0.3, asap@~2.0.6: + version "2.0.6" + resolved "https://registry.yarnpkg.com/asap/-/asap-2.0.6.tgz#e50347611d7e690943208bbdafebcbc2fb866d46" + integrity sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA== + asn1@~0.2.3: version "0.2.6" resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.6.tgz#0d3a7bb6e64e02a90c0303b31f292868ea09a08d" @@ -3051,16 +3905,33 @@ assert-plus@1.0.0, assert-plus@^1.0.0: resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525" integrity sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw== +assign-symbols@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/assign-symbols/-/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367" + integrity sha512-Q+JC7Whu8HhmTdBph/Tq59IoRtoy6KAm5zzPv00WdujX82lbAL8K7WVjne7vdCsAmbF4AYaDOPyO3k0kl8qIrw== + ast-module-types@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/ast-module-types/-/ast-module-types-5.0.0.tgz#32b2b05c56067ff38e95df66f11d6afd6c9ba16b" integrity sha512-JvqziE0Wc0rXQfma0HZC/aY7URXHFuZV84fJRtP8u+lhp0JYCNd5wJzVXP45t0PH0Mej3ynlzvdyITYIu0G4LQ== +astral-regex@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-1.0.0.tgz#6c8c3fb827dd43ee3918f27b82782ab7658a6fd9" + integrity sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg== + astral-regex@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-2.0.0.tgz#483143c567aeed4785759c0865786dc77d7d2e31" integrity sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ== +async@^2.4.0: + version "2.6.4" + resolved "https://registry.yarnpkg.com/async/-/async-2.6.4.tgz#706b7ff6084664cd7eae713f6f965433b5504221" + integrity sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA== + dependencies: + lodash "^4.17.14" + async@^3.2.0, async@^3.2.3: version "3.2.6" resolved "https://registry.yarnpkg.com/async/-/async-3.2.6.tgz#1b0728e14929d51b85b449b7f06e27c1145e38ce" @@ -3083,6 +3954,11 @@ at-least-node@^1.0.0: resolved "https://registry.yarnpkg.com/at-least-node/-/at-least-node-1.0.0.tgz#602cd4b46e844ad4effc92a8011a3c46e0238dc2" integrity sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg== +atob@^2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9" + integrity sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg== + available-typed-arrays@^1.0.6, available-typed-arrays@^1.0.7: version "1.0.7" resolved "https://registry.yarnpkg.com/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz#a5cc375d6a03c2efc87a553f3e0b1522def14846" @@ -3143,6 +4019,35 @@ babel-plugin-jest-hoist@^29.6.3: "@types/babel__core" "^7.1.14" "@types/babel__traverse" "^7.0.6" +babel-plugin-polyfill-corejs2@^0.4.10: + version "0.4.12" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.12.tgz#ca55bbec8ab0edeeef3d7b8ffd75322e210879a9" + integrity sha512-CPWT6BwvhrTO2d8QVorhTCQw9Y43zOu7G9HigcfxvepOU6b8o3tcWad6oVgZIsZCTt42FFv97aA7ZJsbM4+8og== + dependencies: + "@babel/compat-data" "^7.22.6" + "@babel/helper-define-polyfill-provider" "^0.6.3" + semver "^6.3.1" + +babel-plugin-polyfill-corejs3@^0.10.6: + version "0.10.6" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.10.6.tgz#2deda57caef50f59c525aeb4964d3b2f867710c7" + integrity sha512-b37+KR2i/khY5sKmWNVQAnitvquQbNdWy6lJdsr0kmquCKEEUgMKK4SboVM3HtfnZilfjr4MMQ7vY58FVWDtIA== + dependencies: + "@babel/helper-define-polyfill-provider" "^0.6.2" + core-js-compat "^3.38.0" + +babel-plugin-polyfill-regenerator@^0.6.1: + version "0.6.3" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.3.tgz#abeb1f3f1c762eace37587f42548b08b57789bc8" + integrity sha512-LiWSbl4CRSIa5x/JAU6jZiG9eit9w6mz+yVMFwDE83LAWvt0AfGBoZ7HS/mkhrKuh2ZlzfVZYKoLjXdqw6Yt7Q== + dependencies: + "@babel/helper-define-polyfill-provider" "^0.6.3" + +babel-plugin-syntax-trailing-function-commas@^7.0.0-beta.0: + version "7.0.0-beta.0" + resolved "https://registry.yarnpkg.com/babel-plugin-syntax-trailing-function-commas/-/babel-plugin-syntax-trailing-function-commas-7.0.0-beta.0.tgz#aa213c1435e2bffeb6fca842287ef534ad05d5cf" + integrity sha512-Xj9XuRuz3nTSbaTXWv3itLOcxyF4oPD8douBBmj7U9BBC6nEBYfyOJYQMf/8PJAFotC62UY5dFfIGEPr7WswzQ== + babel-preset-current-node-syntax@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz#b4399239b89b2a011f9ddbe3e4f401fc40cff73b" @@ -3161,6 +4066,39 @@ babel-preset-current-node-syntax@^1.0.0: "@babel/plugin-syntax-optional-chaining" "^7.8.3" "@babel/plugin-syntax-top-level-await" "^7.8.3" +babel-preset-fbjs@^3.2.0, babel-preset-fbjs@^3.3.0: + version "3.4.0" + resolved "https://registry.yarnpkg.com/babel-preset-fbjs/-/babel-preset-fbjs-3.4.0.tgz#38a14e5a7a3b285a3f3a86552d650dca5cf6111c" + integrity sha512-9ywCsCvo1ojrw0b+XYk7aFvTH6D9064t0RIL1rtMf3nsa02Xw41MS7sZw216Im35xj/UY0PDBQsa1brUDDF1Ow== + dependencies: + "@babel/plugin-proposal-class-properties" "^7.0.0" + "@babel/plugin-proposal-object-rest-spread" "^7.0.0" + "@babel/plugin-syntax-class-properties" "^7.0.0" + "@babel/plugin-syntax-flow" "^7.0.0" + "@babel/plugin-syntax-jsx" "^7.0.0" + "@babel/plugin-syntax-object-rest-spread" "^7.0.0" + "@babel/plugin-transform-arrow-functions" "^7.0.0" + "@babel/plugin-transform-block-scoped-functions" "^7.0.0" + "@babel/plugin-transform-block-scoping" "^7.0.0" + "@babel/plugin-transform-classes" "^7.0.0" + "@babel/plugin-transform-computed-properties" "^7.0.0" + "@babel/plugin-transform-destructuring" "^7.0.0" + "@babel/plugin-transform-flow-strip-types" "^7.0.0" + "@babel/plugin-transform-for-of" "^7.0.0" + "@babel/plugin-transform-function-name" "^7.0.0" + "@babel/plugin-transform-literals" "^7.0.0" + "@babel/plugin-transform-member-expression-literals" "^7.0.0" + "@babel/plugin-transform-modules-commonjs" "^7.0.0" + "@babel/plugin-transform-object-super" "^7.0.0" + "@babel/plugin-transform-parameters" "^7.0.0" + "@babel/plugin-transform-property-literals" "^7.0.0" + "@babel/plugin-transform-react-display-name" "^7.0.0" + "@babel/plugin-transform-react-jsx" "^7.0.0" + "@babel/plugin-transform-shorthand-properties" "^7.0.0" + "@babel/plugin-transform-spread" "^7.0.0" + "@babel/plugin-transform-template-literals" "^7.0.0" + babel-plugin-syntax-trailing-function-commas "^7.0.0-beta.0" + babel-preset-jest@^29.6.3: version "29.6.3" resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-29.6.3.tgz#fa05fa510e7d493896d7b0dd2033601c840f171c" @@ -3174,11 +4112,24 @@ balanced-match@^1.0.0: resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== -base64-js@^1.3.1: +base64-js@^1.1.2, base64-js@^1.3.1, base64-js@^1.5.1: version "1.5.1" resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== +base@^0.11.1: + version "0.11.2" + resolved "https://registry.yarnpkg.com/base/-/base-0.11.2.tgz#7bde5ced145b6d551a90db87f83c558b4eb48a8f" + integrity sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg== + dependencies: + cache-base "^1.0.1" + class-utils "^0.3.5" + component-emitter "^1.2.1" + define-property "^1.0.0" + isobject "^3.0.1" + mixin-deep "^1.2.0" + pascalcase "^0.1.1" + bcrypt-pbkdf@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz#a4301d389b6a43f9b67ff3ca11a3f6637e360e9e" @@ -3199,6 +4150,11 @@ before-after-hook@^2.2.0: resolved "https://registry.yarnpkg.com/before-after-hook/-/before-after-hook-2.2.3.tgz#c51e809c81a4e354084422b9b26bad88249c517c" integrity sha512-NzUnlZexiaH/46WDhANlyR2bXRopNg4F/zuSA3OpZnllCUgRaOF2znDioDWrmbNVsuZk6l9pMquQB38cfBZwkQ== +big-integer@1.6.x: + version "1.6.52" + resolved "https://registry.yarnpkg.com/big-integer/-/big-integer-1.6.52.tgz#60a887f3047614a8e1bffe5d7173490a97dc8c85" + integrity sha512-QxD8cf2eVqJOOz63z6JIN9BzvVs/dlySa5HGSBH5xtR8dPteIRQnBxxKqkNTiT6jbDTF6jAfrd4oMcND9RGbQg== + bin-links@^4.0.4: version "4.0.4" resolved "https://registry.yarnpkg.com/bin-links/-/bin-links-4.0.4.tgz#c3565832b8e287c85f109a02a17027d152a58a63" @@ -3214,6 +4170,13 @@ binary-extensions@^2.0.0: resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d" integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA== +bindings@^1.5.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/bindings/-/bindings-1.5.0.tgz#10353c9e945334bc0511a6d90b38fbc7c9c504df" + integrity sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ== + dependencies: + file-uri-to-path "1.0.0" + bintrees@1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/bintrees/-/bintrees-1.0.2.tgz#49f896d6e858a4a499df85c38fb399b9aff840f8" @@ -3261,6 +4224,20 @@ bootstrap@^5.2.3: resolved "https://registry.yarnpkg.com/bootstrap/-/bootstrap-5.3.3.tgz#de35e1a765c897ac940021900fcbb831602bac38" integrity sha512-8HLCdWgyoMguSO9o+aH+iuZ+aht+mzW0u3HIMzVu7Srrpv7EBBxTnrFlSCskwdY1+EOFQSm7uMJhNQHkdPcmjg== +bplist-creator@0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/bplist-creator/-/bplist-creator-0.1.0.tgz#018a2d1b587f769e379ef5519103730f8963ba1e" + integrity sha512-sXaHZicyEEmY86WyueLTQesbeoH/mquvarJaQNbjuOQO+7gbFcDEWqKmcWA4cOTLzFlfgvkiVxolk1k5bBIpmg== + dependencies: + stream-buffers "2.2.x" + +bplist-parser@0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/bplist-parser/-/bplist-parser-0.3.1.tgz#e1c90b2ca2a9f9474cc72f6862bbf3fee8341fd1" + integrity sha512-PyJxiNtA5T2PlLIeBot4lbp7rj4OadzjnMZD/G5zuBNt8ei/yCU7+wW0h2bag9vr8c+/WuRWmSxbqAl9hL1rBA== + dependencies: + big-integer "1.6.x" + brace-expansion@^1.1.7: version "1.1.11" resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" @@ -3274,7 +4251,23 @@ brace-expansion@^2.0.1: resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-2.0.1.tgz#1edc459e0f0c548486ecf9fc99f2221364b9a0ae" integrity sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA== dependencies: - balanced-match "^1.0.0" + balanced-match "^1.0.0" + +braces@^2.3.1: + version "2.3.2" + resolved "https://registry.yarnpkg.com/braces/-/braces-2.3.2.tgz#5979fd3f14cd531565e5fa2df1abfff1dfaee729" + integrity sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w== + dependencies: + arr-flatten "^1.1.0" + array-unique "^0.3.2" + extend-shallow "^2.0.1" + fill-range "^4.0.0" + isobject "^3.0.1" + repeat-element "^1.1.2" + snapdragon "^0.8.1" + snapdragon-node "^2.0.1" + split-string "^3.0.2" + to-regex "^3.0.1" braces@^3.0.3, braces@~3.0.2: version "3.0.3" @@ -3293,6 +4286,16 @@ browserslist@^4.24.0: node-releases "^2.0.18" update-browserslist-db "^1.1.1" +browserslist@^4.24.2: + version "4.24.3" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.24.3.tgz#5fc2725ca8fb3c1432e13dac278c7cc103e026d2" + integrity sha512-1CPmv8iobE2fyRMV97dAcMVegvvWKxmq94hkLiAkUGwKVTyDLw33K+ZxiFrREKmmps4rIw6grcCFCnTMSZ/YiA== + dependencies: + caniuse-lite "^1.0.30001688" + electron-to-chromium "^1.5.73" + node-releases "^2.0.19" + update-browserslist-db "^1.1.1" + bs-logger@^0.2.6: version "0.2.6" resolved "https://registry.yarnpkg.com/bs-logger/-/bs-logger-0.2.6.tgz#eb7d365307a72cf974cc6cda76b68354ad336bd8" @@ -3307,7 +4310,7 @@ bser@2.1.1: dependencies: node-int64 "^0.4.0" -buffer-crc32@~0.2.3: +buffer-crc32@^0.2.13, buffer-crc32@~0.2.3: version "0.2.13" resolved "https://registry.yarnpkg.com/buffer-crc32/-/buffer-crc32-0.2.13.tgz#0d333e3f00eac50aa1454abd30ef8c2a5d9a7242" integrity sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ== @@ -3368,11 +4371,34 @@ cacache@^18.0.0, cacache@^18.0.3: tar "^6.1.11" unique-filename "^3.0.0" +cache-base@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/cache-base/-/cache-base-1.0.1.tgz#0a7f46416831c8b662ee36fe4e7c59d76f666ab2" + integrity sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ== + dependencies: + collection-visit "^1.0.0" + component-emitter "^1.2.1" + get-value "^2.0.6" + has-value "^1.0.0" + isobject "^3.0.1" + set-value "^2.0.0" + to-object-path "^0.3.0" + union-value "^1.0.0" + unset-value "^1.0.0" + cachedir@^2.3.0: version "2.4.0" resolved "https://registry.yarnpkg.com/cachedir/-/cachedir-2.4.0.tgz#7fef9cf7367233d7c88068fe6e34ed0d355a610d" integrity sha512-9EtFOZR8g22CL7BWjJ9BUx1+A/djkofnyW3aOXZORNW2kxoUpx2h+uN2cOqwPmFhnpVmxg+KW2OjOSgChTEvsQ== +call-bind-apply-helpers@^1.0.0, call-bind-apply-helpers@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.1.tgz#32e5892e6361b29b0b545ba6f7763378daca2840" + integrity sha512-BhYE+WDaywFg2TBWYNXAE+8B1ATnThNBqXHP5nQu0jWJdVvY2hvkpyB3qOmtmDePiS5/BDQ8wASEWGMWRG148g== + dependencies: + es-errors "^1.3.0" + function-bind "^1.1.2" + call-bind@^1.0.2, call-bind@^1.0.5, call-bind@^1.0.6, call-bind@^1.0.7: version "1.0.7" resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.7.tgz#06016599c40c56498c18769d2730be242b6fa3b9" @@ -3384,6 +4410,43 @@ call-bind@^1.0.2, call-bind@^1.0.5, call-bind@^1.0.6, call-bind@^1.0.7: get-intrinsic "^1.2.4" set-function-length "^1.2.1" +call-bind@^1.0.8: + version "1.0.8" + resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.8.tgz#0736a9660f537e3388826f440d5ec45f744eaa4c" + integrity sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww== + dependencies: + call-bind-apply-helpers "^1.0.0" + es-define-property "^1.0.0" + get-intrinsic "^1.2.4" + set-function-length "^1.2.2" + +call-bound@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/call-bound/-/call-bound-1.0.3.tgz#41cfd032b593e39176a71533ab4f384aa04fd681" + integrity sha512-YTd+6wGlNlPxSuri7Y6X8tY2dmm12UMH66RpKMhiX6rsk5wXXnYgbUcOt8kiS31/AjfoTOvCsE+w8nZQLQnzHA== + dependencies: + call-bind-apply-helpers "^1.0.1" + get-intrinsic "^1.2.6" + +caller-callsite@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/caller-callsite/-/caller-callsite-2.0.0.tgz#847e0fce0a223750a9a027c54b33731ad3154134" + integrity sha512-JuG3qI4QOftFsZyOn1qq87fq5grLIyk1JYd5lJmdA+fG7aQ9pA/i3JIJGcO3q0MrRcHlOt1U+ZeHW8Dq9axALQ== + dependencies: + callsites "^2.0.0" + +caller-path@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/caller-path/-/caller-path-2.0.0.tgz#468f83044e369ab2010fac5f06ceee15bb2cb1f4" + integrity sha512-MCL3sf6nCSXOwCTzvPKhN18TU7AHTvdtam8DAogxcrJ8Rjfbbg7Lgng64H9Iy+vUV6VGFClN/TyxBkAebLRR4A== + dependencies: + caller-callsite "^2.0.0" + +callsites@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/callsites/-/callsites-2.0.0.tgz#06eb84f00eea413da86affefacbffb36093b3c50" + integrity sha512-ksWePWBloaWPxJYQ8TL0JHvtci6G5QTKwQ95RcWAa/lzoAKuAOflGdAK92hpHXjkwb8zLxoLNUoNYZgVsaJzvQ== + callsites@^3.0.0: version "3.1.0" resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" @@ -3398,7 +4461,7 @@ camelcase-keys@^6.2.2: map-obj "^4.0.0" quick-lru "^4.0.1" -camelcase@^5.3.1: +camelcase@^5.0.0, camelcase@^5.3.1: version "5.3.1" resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== @@ -3413,6 +4476,18 @@ caniuse-lite@^1.0.30001669: resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001676.tgz#fe133d41fe74af8f7cc93b8a714c3e86a86e6f04" integrity sha512-Qz6zwGCiPghQXGJvgQAem79esjitvJ+CxSbSQkW9H/UX5hg8XM88d4lp2W+MEQ81j+Hip58Il+jGVdazk1z9cw== +caniuse-lite@^1.0.30001688: + version "1.0.30001690" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001690.tgz#f2d15e3aaf8e18f76b2b8c1481abde063b8104c8" + integrity sha512-5ExiE3qQN6oF8Clf8ifIDcMRCRE/dMGcETG/XGMD8/XiXm6HXQgQTh1yZYLXXpSOsEUlJm1Xr7kGULZTuGtP/w== + +capture-exit@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/capture-exit/-/capture-exit-2.0.0.tgz#fb953bfaebeb781f62898239dabb426d08a509a4" + integrity sha512-PiT/hQmTonHhl/HFGN+Lx3JJUznrVYJ3+AQsnthneZbvW7x+f08Tk7yLJTLEOUvBTbduLeeBkxEaYXUOUrRq6g== + dependencies: + rsvp "^4.8.4" + caseless@~0.12.0: version "0.12.0" resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" @@ -3426,7 +4501,7 @@ chalk@4.1.0: ansi-styles "^4.1.0" supports-color "^7.1.0" -chalk@^2.4.1: +chalk@^2.0.0, chalk@^2.0.1, chalk@^2.4.1, chalk@^2.4.2: version "2.4.2" resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== @@ -3435,6 +4510,14 @@ chalk@^2.4.1: escape-string-regexp "^1.0.5" supports-color "^5.3.0" +chalk@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-3.0.0.tgz#3f73c2bf526591f574cc492c51e2456349f844e4" + integrity sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg== + dependencies: + ansi-styles "^4.1.0" + supports-color "^7.1.0" + chalk@^4.0.0, chalk@^4.0.2, chalk@^4.1.0, chalk@^4.1.1, chalk@^4.1.2: version "4.1.2" resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" @@ -3448,6 +4531,11 @@ char-regex@^1.0.2: resolved "https://registry.yarnpkg.com/char-regex/-/char-regex-1.0.2.tgz#d744358226217f981ed58f479b1d6bcc29545dcf" integrity sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw== +chardet@^0.4.0: + version "0.4.2" + resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.4.2.tgz#b5473b33dc97c424e5d98dc87d55d4d8a29c8bf2" + integrity sha512-j/Toj7f1z98Hh2cYo2BVr85EpIRWqUi7rtRSGxh/cqUjqrnJe9l9UE7IUGd2vQ2p+kSHLkSzObQPZPLUC6TQwg== + chardet@^0.7.0: version "0.7.0" resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.7.0.tgz#90094849f0937f2eedc2425d0d28a9e5f0cbad9e" @@ -3478,6 +4566,11 @@ chownr@^2.0.0: resolved "https://registry.yarnpkg.com/chownr/-/chownr-2.0.0.tgz#15bfbe53d2eab4cf70f18a8cd68ebe5b3cb1dece" integrity sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ== +ci-info@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-2.0.0.tgz#67a9e964be31a51e15e5010d58e6f12834002f46" + integrity sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ== + ci-info@^3.2.0: version "3.9.0" resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-3.9.0.tgz#4279a62028a7b1f262f3473fc9605f5e218c59b4" @@ -3493,6 +4586,16 @@ cjs-module-lexer@^1.0.0, cjs-module-lexer@^1.2.2: resolved "https://registry.yarnpkg.com/cjs-module-lexer/-/cjs-module-lexer-1.2.3.tgz#6c370ab19f8a3394e318fe682686ec0ac684d107" integrity sha512-0TNiGstbQmCFwt4akjjBg5pLRTSyj/PkWQ1ZoO2zntmg9yLqSRxwEa4iCfQLGjqhiqBfOJa7W/E8wfGrTDmlZQ== +class-utils@^0.3.5: + version "0.3.6" + resolved "https://registry.yarnpkg.com/class-utils/-/class-utils-0.3.6.tgz#f93369ae8b9a7ce02fd41faad0ca83033190c463" + integrity sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg== + dependencies: + arr-union "^3.1.0" + define-property "^0.2.5" + isobject "^3.0.0" + static-extend "^0.1.1" + classnames@^2.3.2: version "2.3.2" resolved "https://registry.yarnpkg.com/classnames/-/classnames-2.3.2.tgz#351d813bf0137fcc6a76a16b88208d2560a0d924" @@ -3510,11 +4613,23 @@ cli-cursor@3.1.0, cli-cursor@^3.1.0: dependencies: restore-cursor "^3.1.0" +cli-cursor@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-2.1.0.tgz#b35dac376479facc3e94747d41d0d0f5238ffcb5" + integrity sha512-8lgKz8LmCRYZZQDpRyT2m5rKJ08TnU4tR9FFFW2rxpxR1FzWi4PQ/NfyODchAatHaUgnSPVcx/R5w6NuTBzFiw== + dependencies: + restore-cursor "^2.0.0" + cli-spinners@2.6.1: version "2.6.1" resolved "https://registry.yarnpkg.com/cli-spinners/-/cli-spinners-2.6.1.tgz#adc954ebe281c37a6319bfa401e6dd2488ffb70d" integrity sha512-x/5fWmGMnbKQAaNwN+UZlV79qBLM9JFnJuJ03gIi5whrob0xV0ofNVHy9DhwGdsMJQc2OKv0oGmLzvaqvAVv+g== +cli-spinners@^2.0.0: + version "2.9.2" + resolved "https://registry.yarnpkg.com/cli-spinners/-/cli-spinners-2.9.2.tgz#1773a8f4b9c4d6ac31563df53b3fc1d79462fe41" + integrity sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg== + cli-spinners@^2.5.0: version "2.7.0" resolved "https://registry.yarnpkg.com/cli-spinners/-/cli-spinners-2.7.0.tgz#f815fd30b5f9eaac02db604c7a231ed7cb2f797a" @@ -3545,11 +4660,34 @@ cli-truncate@^3.1.0: slice-ansi "^5.0.0" string-width "^5.0.0" +cli-width@^2.0.0: + version "2.2.1" + resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-2.2.1.tgz#b0433d0b4e9c847ef18868a4ef16fd5fc8271c48" + integrity sha512-GRMWDxpOB6Dgk2E5Uo+3eEBvtOOlimMmpbFiKuLFnQzYDavtLFY3K5ona41jgN/WdRZtG7utuVSVTL4HbZHGkw== + cli-width@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-3.0.0.tgz#a2f48437a2caa9a22436e794bf071ec9e61cedf6" integrity sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw== +cliui@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-5.0.0.tgz#deefcfdb2e800784aa34f46fa08e06851c7bbbc5" + integrity sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA== + dependencies: + string-width "^3.1.0" + strip-ansi "^5.2.0" + wrap-ansi "^5.1.0" + +cliui@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-6.0.0.tgz#511d702c0c4e41ca156d7d0e96021f23e13225b1" + integrity sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ== + dependencies: + string-width "^4.2.0" + strip-ansi "^6.0.0" + wrap-ansi "^6.2.0" + cliui@^7.0.2: version "7.0.4" resolved "https://registry.yarnpkg.com/cliui/-/cliui-7.0.4.tgz#a0265ee655476fc807aea9df3df8df7783808b4f" @@ -3568,7 +4706,7 @@ cliui@^8.0.1: strip-ansi "^6.0.1" wrap-ansi "^7.0.0" -clone-deep@4.0.1: +clone-deep@4.0.1, clone-deep@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/clone-deep/-/clone-deep-4.0.1.tgz#c19fd9bdbbf85942b4fd979c84dcf7d5f07c2387" integrity sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ== @@ -3597,6 +4735,14 @@ collect-v8-coverage@^1.0.0: resolved "https://registry.yarnpkg.com/collect-v8-coverage/-/collect-v8-coverage-1.0.1.tgz#cc2c8e94fc18bbdffe64d6534570c8a673b27f59" integrity sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg== +collection-visit@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/collection-visit/-/collection-visit-1.0.0.tgz#4bc0373c164bc3291b4d368c829cf1a80a59dca0" + integrity sha512-lNkKvzEeMBBjUGHZ+q6z9pSJla0KWAQPvtzhEV9+iGyQYG+pBpl7xKDhxoNSOZH2hhv0v5k0y2yAM4o4SjoSkw== + dependencies: + map-visit "^1.0.0" + object-visit "^1.0.0" + color-convert@^1.9.0, color-convert@^1.9.3: version "1.9.3" resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" @@ -3629,7 +4775,7 @@ color-string@^1.6.0: color-name "^1.0.0" simple-swizzle "^0.2.2" -color-support@1.1.3, color-support@^1.1.2: +color-support@1.1.3, color-support@^1.1.2, color-support@^1.1.3: version "1.1.3" resolved "https://registry.yarnpkg.com/color-support/-/color-support-1.1.3.tgz#93834379a1cc9a0c61f82f52f0d04322251bd5a2" integrity sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg== @@ -3642,6 +4788,11 @@ color@^3.1.3: color-convert "^1.9.3" color-string "^1.6.0" +colorette@^1.0.7: + version "1.4.0" + resolved "https://registry.yarnpkg.com/colorette/-/colorette-1.4.0.tgz#5190fbb87276259a86ad700bff2c6d6faa3fca40" + integrity sha512-Y2oEozpomLn7Q3HFP7dpww7AtMJplbM9lGZP6RDfHqmbeRjiwRg4n6VM6j4KLmRke85uWEI7JqF17f3pqdRA0g== + colorette@^2.0.16, colorette@^2.0.19: version "2.0.20" resolved "https://registry.yarnpkg.com/colorette/-/colorette-2.0.20.tgz#9eb793e6833067f7235902fcd3b09917a000a95a" @@ -3670,12 +4821,17 @@ combined-stream@^1.0.8, combined-stream@~1.0.6: dependencies: delayed-stream "~1.0.0" +command-exists@^1.2.8: + version "1.2.9" + resolved "https://registry.yarnpkg.com/command-exists/-/command-exists-1.2.9.tgz#c50725af3808c8ab0260fd60b01fbfa25b954f69" + integrity sha512-LTQ/SGc+s0Xc0Fu5WaKnR0YiygZkm9eKFvyS+fRsU7/ZWFF8ykFM6Pc9aCVf1+xasOOZpO3BAVgVrKvsqKHV7w== + commander@^10.0.1: version "10.0.1" resolved "https://registry.yarnpkg.com/commander/-/commander-10.0.1.tgz#881ee46b4f77d1c1dccc5823433aa39b022cbe06" integrity sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug== -commander@^2.20.0: +commander@^2.19.0, commander@^2.20.0: version "2.20.3" resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== @@ -3700,6 +4856,11 @@ commander@~12.1.0: resolved "https://registry.yarnpkg.com/commander/-/commander-12.1.0.tgz#01423b36f501259fdaac4d0e4d60c96c991585d3" integrity sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA== +commander@~2.13.0: + version "2.13.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.13.0.tgz#6964bca67685df7c1f1430c584f07d7597885b9c" + integrity sha512-MVuS359B+YzaWqjCL/c+22gfryv+mCBPHAv3zyVI2GN8EY6IRP8VwtasXn8jyyhvvq84R4ImN1OKRtcbIasjYA== + comment-parser@1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/comment-parser/-/comment-parser-1.4.0.tgz#0f8c560f59698193854f12884c20c0e39a26d32c" @@ -3728,13 +4889,31 @@ compare-func@^2.0.0: array-ify "^1.0.0" dot-prop "^5.1.0" -compressible@~2.0.16: +component-emitter@^1.2.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.3.1.tgz#ef1d5796f7d93f135ee6fb684340b26403c97d17" + integrity sha512-T0+barUSQRTUQASh8bx02dl+DhF54GtIDY13Y3m9oWTklKbb3Wv974meRpeZ3lp1JpLVECWWNHC4vaG2XHXouQ== + +compressible@~2.0.16, compressible@~2.0.18: version "2.0.18" resolved "https://registry.yarnpkg.com/compressible/-/compressible-2.0.18.tgz#af53cca6b070d4c3c0750fbd77286a6d7cc46fba" integrity sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg== dependencies: mime-db ">= 1.43.0 < 2" +compression@^1.7.1: + version "1.7.5" + resolved "https://registry.yarnpkg.com/compression/-/compression-1.7.5.tgz#fdd256c0a642e39e314c478f6c2cd654edd74c93" + integrity sha512-bQJ0YRck5ak3LgtnpKkiabX5pNF7tMUh1BSy2ZBOTh0Dim0BUu6aPPwByIns6/A5Prh8PufSPerMDUklpzes2Q== + dependencies: + bytes "3.1.2" + compressible "~2.0.18" + debug "2.6.9" + negotiator "~0.6.4" + on-headers "~1.0.2" + safe-buffer "5.2.1" + vary "~1.1.2" + compression@^1.7.4: version "1.7.4" resolved "https://registry.yarnpkg.com/compression/-/compression-1.7.4.tgz#95523eff170ca57c29a0ca41e6fe131f41e5bb8f" @@ -3753,6 +4932,16 @@ concat-map@0.0.1: resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== +concat-stream@^1.6.0: + version "1.6.2" + resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.2.tgz#904bdf194cd3122fc675c77fc4ac3d4ff0fd1a34" + integrity sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw== + dependencies: + buffer-from "^1.0.0" + inherits "^2.0.3" + readable-stream "^2.2.2" + typedarray "^0.0.6" + concat-stream@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-2.0.0.tgz#414cf5af790a48c60ab9be4527d56d5e41133cb1" @@ -3763,6 +4952,16 @@ concat-stream@^2.0.0: readable-stream "^3.0.2" typedarray "^0.0.6" +connect@^3.6.5: + version "3.7.0" + resolved "https://registry.yarnpkg.com/connect/-/connect-3.7.0.tgz#5d49348910caa5e07a01800b030d0c35f20484f8" + integrity sha512-ZqRXc+tZukToSNmh5C2iWMSoV3X1YUcPbqEM4DkEG5tNQXrQUZCNVGGv3IuicnkMtPfGf3Xtp8WCXs295iQ1pQ== + dependencies: + debug "2.6.9" + finalhandler "1.1.2" + parseurl "~1.3.3" + utils-merge "1.0.1" + console-control-strings@^1.0.0, console-control-strings@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e" @@ -3886,6 +5085,23 @@ cookie@0.7.2: resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.7.2.tgz#556369c472a2ba910f2979891b526b3436237ed7" integrity sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w== +copy-descriptor@^0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d" + integrity sha512-XgZ0pFcakEUlbwQEVNg3+QAis1FyTL3Qel9FYy8pSkQqoG3PNoT0bOCQtOXcOkur21r2Eq2kI+IE+gsmAEVlYw== + +core-js-compat@^3.38.0: + version "3.39.0" + resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.39.0.tgz#b12dccb495f2601dc860bdbe7b4e3ffa8ba63f61" + integrity sha512-VgEUx3VwlExr5no0tXlBt+silBvhTryPwCXRI2Id1PN8WTKu7MreethvddqOubrYxkFdv/RnYrqlv1sFNAUelw== + dependencies: + browserslist "^4.24.2" + +core-js@^2.4.1: + version "2.6.12" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.6.12.tgz#d9333dfa7b065e347cc5682219d6f690859cc2ec" + integrity sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ== + core-util-is@1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" @@ -3906,6 +5122,16 @@ cosmiconfig@9.0.0: js-yaml "^4.1.0" parse-json "^5.2.0" +cosmiconfig@^5.0.5, cosmiconfig@^5.1.0: + version "5.2.1" + resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-5.2.1.tgz#040f726809c591e77a17c0a3626ca45b4f168b1a" + integrity sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA== + dependencies: + import-fresh "^2.0.0" + is-directory "^0.3.1" + js-yaml "^3.13.1" + parse-json "^4.0.0" + create-jest@^29.7.0: version "29.7.0" resolved "https://registry.yarnpkg.com/create-jest/-/create-jest-29.7.0.tgz#a355c5b3cb1e1af02ba177fe7afd7feee49a5320" @@ -3931,6 +5157,26 @@ cross-env@^7.0.3: dependencies: cross-spawn "^7.0.1" +cross-spawn@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-5.1.0.tgz#e8bd0efee58fcff6f8f94510a0a554bbfa235449" + integrity sha512-pTgQJ5KC0d2hcY8eyL1IzlBPYjTkyH72XRZPnLyKus2mBfNjQs3klqbJU2VILqZryAZUt9JOb3h/mWMy23/f5A== + dependencies: + lru-cache "^4.0.1" + shebang-command "^1.2.0" + which "^1.2.9" + +cross-spawn@^6.0.0: + version "6.0.6" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.6.tgz#30d0efa0712ddb7eb5a76e1e8721bffafa6b5d57" + integrity sha512-VqCUuhcd1iB+dsv8gxPttb5iZh/D0iubSP21g36KXdEuf6I5JiioesUVjpCdHV9MZRUfVFlvwtIUyPfxo5trtw== + dependencies: + nice-try "^1.0.4" + path-key "^2.0.1" + semver "^5.5.0" + shebang-command "^1.2.0" + which "^1.2.9" + cross-spawn@^6.0.5: version "6.0.5" resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4" @@ -4058,12 +5304,12 @@ dateformat@^3.0.3: resolved "https://registry.yarnpkg.com/dateformat/-/dateformat-3.0.3.tgz#a6e37499a4d9a9cf85ef5872044d62901c9889ae" integrity sha512-jyCETtSl3VMZMWeRo7iY1FL19ges1t55hMo5yaam4Jrsm5EPL89UQkoQRyiI+Yf4k8r2ZpdngkV8hr1lIdjb3Q== -dayjs@^1.10.4: +dayjs@^1.10.4, dayjs@^1.8.15: version "1.11.13" resolved "https://registry.yarnpkg.com/dayjs/-/dayjs-1.11.13.tgz#92430b0139055c3ebb60150aa13e860a4b5a366c" integrity sha512-oaMBel6gjolK862uaPQOVTA7q3TZhuSvuMQAAglQDOWYO9A91IrAOUJEyKVlqJlHE0vq5p5UXxzdPfMH/x6xNg== -debug@2.6.9: +debug@2.6.9, debug@^2.2.0, debug@^2.3.3: version "2.6.9" resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== @@ -4092,7 +5338,7 @@ decamelize-keys@^1.1.0: decamelize "^1.1.0" map-obj "^1.0.0" -decamelize@^1.1.0: +decamelize@^1.1.0, decamelize@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" integrity sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA== @@ -4102,6 +5348,11 @@ decimal.js@^10.4.2: resolved "https://registry.yarnpkg.com/decimal.js/-/decimal.js-10.4.3.tgz#1044092884d245d1b7f65725fa4ad4c6f781cc23" integrity sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA== +decode-uri-component@^0.2.0: + version "0.2.2" + resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.2.tgz#e69dbe25d37941171dd540e024c444cd5188e1e9" + integrity sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ== + dedent@1.5.3, dedent@^1.0.0: version "1.5.3" resolved "https://registry.yarnpkg.com/dedent/-/dedent-1.5.3.tgz#99aee19eb9bae55a67327717b6e848d0bf777e5a" @@ -4117,6 +5368,11 @@ deep-is@^0.1.3, deep-is@~0.1.3: resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831" integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== +deepmerge@^3.2.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-3.3.0.tgz#d3c47fd6f3a93d517b14426b0628a17b0125f5f7" + integrity sha512-GRQOafGHwMHpjPx9iCvTgpu9NojZ49q794EEL94JVEw6VaeA8XTUyBKvAkOOjBX9oJNiV6G3P+T+tihFjo2TqA== + deepmerge@^4.2.2: version "4.2.2" resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-4.2.2.tgz#44d2ea3679b8f4d4ffba33f03d865fc1e7bf4955" @@ -4129,7 +5385,7 @@ defaults@^1.0.3: dependencies: clone "^1.0.2" -define-data-property@^1.0.1, define-data-property@^1.1.2: +define-data-property@^1.0.1, define-data-property@^1.1.2, define-data-property@^1.1.4: version "1.1.4" resolved "https://registry.yarnpkg.com/define-data-property/-/define-data-property-1.1.4.tgz#894dc141bb7d3060ae4366f6a0107e68fbe48c5e" integrity sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A== @@ -4152,6 +5408,28 @@ define-properties@^1.1.3, define-properties@^1.1.4, define-properties@^1.2.0, de has-property-descriptors "^1.0.0" object-keys "^1.1.1" +define-property@^0.2.5: + version "0.2.5" + resolved "https://registry.yarnpkg.com/define-property/-/define-property-0.2.5.tgz#c35b1ef918ec3c990f9a5bc57be04aacec5c8116" + integrity sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA== + dependencies: + is-descriptor "^0.1.0" + +define-property@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/define-property/-/define-property-1.0.0.tgz#769ebaaf3f4a63aad3af9e8d304c9bbe79bfb0e6" + integrity sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA== + dependencies: + is-descriptor "^1.0.0" + +define-property@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/define-property/-/define-property-2.0.2.tgz#d459689e8d654ba77e02a817f8710d702cb16e9d" + integrity sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ== + dependencies: + is-descriptor "^1.0.2" + isobject "^3.0.1" + delayed-stream@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" @@ -4162,6 +5440,11 @@ delegates@^1.0.0: resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" integrity sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ== +denodeify@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/denodeify/-/denodeify-1.2.1.tgz#3a36287f5034e699e7577901052c2e6c94251631" + integrity sha512-KNTihKNmQENUZeKu5fzfpzRqR5S2VMp4gl9RFHiWzj9DfvYQPMJ6XHKNaQxaGCXwPk6y9yme3aUoaiAe+KX+vg== + depd@2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/depd/-/depd-2.0.0.tgz#b696163cc757560d09cf22cc8fad1571b79e76df" @@ -4342,6 +5625,15 @@ dottie@^2.0.6: resolved "https://registry.yarnpkg.com/dottie/-/dottie-2.0.6.tgz#34564ebfc6ec5e5772272d466424ad5b696484d4" integrity sha512-iGCHkfUc5kFekGiqhe8B/mdaurD+lakO9txNnTvKtA6PISrw86LgqHvRzWYPyoE2Ph5aMIrCw9/uko6XHTKCwA== +dunder-proto@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/dunder-proto/-/dunder-proto-1.0.1.tgz#d7ae667e1dc83482f8b70fd0f6eefc50da30f58a" + integrity sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A== + dependencies: + call-bind-apply-helpers "^1.0.1" + es-errors "^1.3.0" + gopd "^1.2.0" + duplexer@^0.1.1, duplexer@~0.1.1: version "0.1.2" resolved "https://registry.yarnpkg.com/duplexer/-/duplexer-0.1.2.tgz#3abe43aef3835f8ae077d136ddce0f276b0400e6" @@ -4384,11 +5676,21 @@ electron-to-chromium@^1.5.41: resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.5.50.tgz#d9ba818da7b2b5ef1f3dd32bce7046feb7e93234" integrity sha512-eMVObiUQ2LdgeO1F/ySTXsvqvxb6ZH2zPGaMYsWzRDdOddUa77tdmI0ltg+L16UpbWdhPmuF3wIQYyQq65WfZw== +electron-to-chromium@^1.5.73: + version "1.5.76" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.5.76.tgz#db20295c5061b68f07c8ea4dfcbd701485d94a3d" + integrity sha512-CjVQyG7n7Sr+eBXE86HIulnL5N8xZY1sgmOPGuq/F0Rr0FJq63lg0kEtOIDfZBk44FnDLf6FUJ+dsJcuiUDdDQ== + emittery@^0.13.1: version "0.13.1" resolved "https://registry.yarnpkg.com/emittery/-/emittery-0.13.1.tgz#c04b8c3457490e0847ae51fced3af52d338e3dad" integrity sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ== +emoji-regex@^7.0.1: + version "7.0.3" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-7.0.3.tgz#933a04052860c85e83c122479c4748a8e4c72156" + integrity sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA== + emoji-regex@^8.0.0: version "8.0.0" resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" @@ -4414,7 +5716,7 @@ encodeurl@~2.0.0: resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-2.0.0.tgz#7b8ea898077d7e409d3ac45474ea38eaf0857a58" integrity sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg== -encoding@^0.1.13: +encoding@^0.1.11, encoding@^0.1.13: version "0.1.13" resolved "https://registry.yarnpkg.com/encoding/-/encoding-0.1.13.tgz#56574afdd791f54a8e9b2785c0582a2d26210fa9" integrity sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A== @@ -4471,6 +5773,11 @@ envinfo@7.13.0: resolved "https://registry.yarnpkg.com/envinfo/-/envinfo-7.13.0.tgz#81fbb81e5da35d74e814941aeab7c325a606fb31" integrity sha512-cvcaMr7KqXVh4nyzGTVqTum+gAiL265x5jUWQIDLq//zOGbW+gSW/C+OWLleY/rs9Qole6AZLMXPbtIFQbqu+Q== +envinfo@^7.7.2: + version "7.14.0" + resolved "https://registry.yarnpkg.com/envinfo/-/envinfo-7.14.0.tgz#26dac5db54418f2a4c1159153a0b2ae980838aae" + integrity sha512-CO40UI41xDQzhLB1hWyqUKgFhs250pNcGbyGKe1l/e4FSaI/+YE4IMG76GDt0In67WLPACIITC+sOi08x4wIvg== + err-code@^2.0.2: version "2.0.3" resolved "https://registry.yarnpkg.com/err-code/-/err-code-2.0.3.tgz#23c2f3b756ffdfc608d30e27c9a941024807e7f9" @@ -4483,6 +5790,21 @@ error-ex@^1.3.1: dependencies: is-arrayish "^0.2.1" +error-stack-parser@^2.0.6: + version "2.1.4" + resolved "https://registry.yarnpkg.com/error-stack-parser/-/error-stack-parser-2.1.4.tgz#229cb01cdbfa84440bfa91876285b94680188286" + integrity sha512-Sk5V6wVazPhq5MhpO+AUxJn5x7XSXGl1R93Vn7i+zS15KDVxQijejNCrz8340/2bgLBjR9GtEG8ZVKONDjcqGQ== + dependencies: + stackframe "^1.3.4" + +errorhandler@^1.5.0: + version "1.5.1" + resolved "https://registry.yarnpkg.com/errorhandler/-/errorhandler-1.5.1.tgz#b9ba5d17cf90744cd1e851357a6e75bf806a9a91" + integrity sha512-rcOwbfvP1WTViVoUjcfZicVzjhjTuhSMntHh6mW3IrEiyE6mJyXvsToJUJGlGlw/2xU9P5whlWNGlIDVeCiT4A== + dependencies: + accepts "~1.3.7" + escape-html "~1.0.3" + es-abstract@^1.20.4, es-abstract@^1.22.1, es-abstract@^1.22.3: version "1.22.5" resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.22.5.tgz#1417df4e97cc55f09bf7e58d1e614bc61cb8df46" @@ -4542,6 +5864,11 @@ es-define-property@^1.0.0: dependencies: get-intrinsic "^1.2.4" +es-define-property@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/es-define-property/-/es-define-property-1.0.1.tgz#983eb2f9a6724e9303f61addf011c72e09e0b0fa" + integrity sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g== + es-errors@^1.0.0, es-errors@^1.2.1, es-errors@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/es-errors/-/es-errors-1.3.0.tgz#05f75a25dab98e4fb1dcd5e1472c0546d5057c8f" @@ -4567,6 +5894,13 @@ es-iterator-helpers@^1.0.12: iterator.prototype "^1.1.2" safe-array-concat "^1.0.1" +es-object-atoms@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/es-object-atoms/-/es-object-atoms-1.0.0.tgz#ddb55cd47ac2e240701260bc2a8e31ecb643d941" + integrity sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw== + dependencies: + es-errors "^1.3.0" + es-set-tostringtag@^2.0.1, es-set-tostringtag@^2.0.3: version "2.0.3" resolved "https://registry.yarnpkg.com/es-set-tostringtag/-/es-set-tostringtag-2.0.3.tgz#8bb60f0a440c2e4281962428438d58545af39777" @@ -4901,7 +6235,7 @@ event-stream@=3.3.4: stream-combiner "~0.0.4" through "~2.3.1" -event-target-shim@^5.0.0: +event-target-shim@^5.0.0, event-target-shim@^5.0.1: version "5.0.1" resolved "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz#5d4d3ebdf9583d63a5333ce2deb7480ab2b05789" integrity sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ== @@ -4911,11 +6245,21 @@ eventemitter2@6.4.7: resolved "https://registry.yarnpkg.com/eventemitter2/-/eventemitter2-6.4.7.tgz#a7f6c4d7abf28a14c1ef3442f21cb306a054271d" integrity sha512-tYUSVOGeQPKt/eC1ABfhHy5Xd96N3oIijJvN3O9+TsC28T5V9yX9oEfEK5faP0EFSNVOG97qtAS68GBrQB2hDg== +eventemitter3@^3.0.0: + version "3.1.2" + resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-3.1.2.tgz#2d3d48f9c346698fce83a85d7d664e98535df6e7" + integrity sha512-tvtQIeLVHjDkJYnzf2dgVMxfuSGJeM/7UCG17TT4EumTfNtF+0nebF/4zWOIkCreAbtNqhGEboB6BWrwqNaw4Q== + eventemitter3@^4.0.4: version "4.0.7" resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-4.0.7.tgz#2de9b68f6528d5644ef5c59526a1b4a07306169f" integrity sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw== +exec-sh@^0.3.2: + version "0.3.6" + resolved "https://registry.yarnpkg.com/exec-sh/-/exec-sh-0.3.6.tgz#ff264f9e325519a60cb5e273692943483cca63bc" + integrity sha512-nQn+hI3yp+oD0huYhKwvYI32+JFeq+XkNcD1GAo3Y/MjxsfVGmrrzrnzjWiNY6f+pUCP440fThsFh5gZrRAU/w== + execa@4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/execa/-/execa-4.1.0.tgz#4e5491ad1572f2f17a77d388c6c857135b22847a" @@ -4961,6 +6305,19 @@ execa@5.1.1, execa@^5.0.0: signal-exit "^3.0.3" strip-final-newline "^2.0.0" +execa@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/execa/-/execa-1.0.0.tgz#c6236a5bb4df6d6f15e88e7f017798216749ddd8" + integrity sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA== + dependencies: + cross-spawn "^6.0.0" + get-stream "^4.0.0" + is-stream "^1.1.0" + npm-run-path "^2.0.0" + p-finally "^1.0.0" + signal-exit "^3.0.0" + strip-eof "^1.0.0" + execa@^6.1.0: version "6.1.0" resolved "https://registry.yarnpkg.com/execa/-/execa-6.1.0.tgz#cea16dee211ff011246556388effa0818394fb20" @@ -4988,6 +6345,19 @@ exit@^0.1.2: resolved "https://registry.yarnpkg.com/exit/-/exit-0.1.2.tgz#0632638f8d877cc82107d30a0fff1a17cba1cd0c" integrity sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ== +expand-brackets@^2.1.4: + version "2.1.4" + resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-2.1.4.tgz#b77735e315ce30f6b6eff0f83b04151a22449622" + integrity sha512-w/ozOKR9Obk3qoWeY/WDi6MFta9AoMR+zud60mdnbniMcBxRuFJyDt2LdX/14A1UABeqk+Uk+LDfUpvoGKppZA== + dependencies: + debug "^2.3.3" + define-property "^0.2.5" + extend-shallow "^2.0.1" + posix-character-classes "^0.1.0" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.1" + expect@^29.0.0, expect@^29.7.0: version "29.7.0" resolved "https://registry.yarnpkg.com/expect/-/expect-29.7.0.tgz#578874590dcb3214514084c08115d8aee61e11bc" @@ -5041,11 +6411,42 @@ express@^4.18.2: utils-merge "1.0.1" vary "~1.1.2" +extend-shallow@^1.1.2: + version "1.1.4" + resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-1.1.4.tgz#19d6bf94dfc09d76ba711f39b872d21ff4dd9071" + integrity sha512-L7AGmkO6jhDkEBBGWlLtftA80Xq8DipnrRPr0pyi7GQLXkaq9JYA4xF4z6qnadIC6euiTDKco0cGSU9muw+WTw== + dependencies: + kind-of "^1.1.0" + +extend-shallow@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-2.0.1.tgz#51af7d614ad9a9f610ea1bafbb989d6b1c56890f" + integrity sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug== + dependencies: + is-extendable "^0.1.0" + +extend-shallow@^3.0.0, extend-shallow@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-3.0.2.tgz#26a71aaf073b39fb2127172746131c2704028db8" + integrity sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q== + dependencies: + assign-symbols "^1.0.0" + is-extendable "^1.0.1" + extend@~3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== +external-editor@^2.0.4: + version "2.2.0" + resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-2.2.0.tgz#045511cfd8d133f3846673d1047c154e214ad3d5" + integrity sha512-bSn6gvGxKt+b7+6TKEv1ZycHleA7aHhRHyAqJyp5pbUFuYYNIzpZnQDk7AsYckyWdEnTeAnay0aCy2aV6iTk9A== + dependencies: + chardet "^0.4.0" + iconv-lite "^0.4.17" + tmp "^0.0.33" + external-editor@^3.0.3: version "3.1.0" resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-3.1.0.tgz#cb03f740befae03ea4d283caed2741a83f335495" @@ -5055,6 +6456,20 @@ external-editor@^3.0.3: iconv-lite "^0.4.24" tmp "^0.0.33" +extglob@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/extglob/-/extglob-2.0.4.tgz#ad00fe4dc612a9232e8718711dc5cb5ab0285543" + integrity sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw== + dependencies: + array-unique "^0.3.2" + define-property "^1.0.0" + expand-brackets "^2.1.4" + extend-shallow "^2.0.1" + fragment-cache "^0.2.1" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.1" + extract-zip@2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/extract-zip/-/extract-zip-2.0.1.tgz#663dca56fe46df890d5f131ef4a06d22bb8ba13a" @@ -5076,6 +6491,16 @@ extsprintf@^1.2.0: resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.4.1.tgz#8d172c064867f235c0c84a596806d279bf4bcc07" integrity sha512-Wrk35e8ydCKDj/ArClo1VrPVmN8zph5V4AtHwIuHhvMXsKf73UT3BOD+azBIW+3wOJ4FhEH7zyaJCFvChjYvMA== +fancy-log@^1.3.2: + version "1.3.3" + resolved "https://registry.yarnpkg.com/fancy-log/-/fancy-log-1.3.3.tgz#dbc19154f558690150a23953a0adbd035be45fc7" + integrity sha512-k9oEhlyc0FrVh25qYuSELjr8oxsCoc4/LEZfg2iJJrfEk/tZL9bCoJE47gqAvI2m/AUjluCS4+3I0eTx8n3AEw== + dependencies: + ansi-gray "^0.1.1" + color-support "^1.1.3" + parse-node-version "^1.0.0" + time-stamp "^1.0.0" + fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: version "3.1.3" resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" @@ -5121,6 +6546,41 @@ fb-watchman@^2.0.0: dependencies: bser "2.1.1" +fbjs-css-vars@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/fbjs-css-vars/-/fbjs-css-vars-1.0.2.tgz#216551136ae02fe255932c3ec8775f18e2c078b8" + integrity sha512-b2XGFAFdWZWg0phtAWLHCk836A1Xann+I+Dgd3Gk64MHKZO44FfoD1KxyvbSh0qZsIoXQGGlVztIY+oitJPpRQ== + +fbjs-scripts@^1.1.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/fbjs-scripts/-/fbjs-scripts-1.2.0.tgz#069a0c0634242d10031c6460ef1fccefcdae8b27" + integrity sha512-5krZ8T0Bf8uky0abPoCLrfa7Orxd8UH4Qq8hRUF2RZYNMu+FmEOrBc7Ib3YVONmxTXTlLAvyrrdrVmksDb2OqQ== + dependencies: + "@babel/core" "^7.0.0" + ansi-colors "^1.0.1" + babel-preset-fbjs "^3.2.0" + core-js "^2.4.1" + cross-spawn "^5.1.0" + fancy-log "^1.3.2" + object-assign "^4.0.1" + plugin-error "^0.1.2" + semver "^5.1.0" + through2 "^2.0.0" + +fbjs@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fbjs/-/fbjs-1.0.0.tgz#52c215e0883a3c86af2a7a776ed51525ae8e0a5a" + integrity sha512-MUgcMEJaFhCaF1QtWGnmq9ZDRAzECTCRAF7O6UZIlAlkTs1SasiX9aP0Iw7wfD2mJ7wDTNfg2w7u5fSCwJk1OA== + dependencies: + core-js "^2.4.1" + fbjs-css-vars "^1.0.0" + isomorphic-fetch "^2.1.1" + loose-envify "^1.0.0" + object-assign "^4.1.0" + promise "^7.1.1" + setimmediate "^1.0.5" + ua-parser-js "^0.7.18" + fd-slicer@~1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/fd-slicer/-/fd-slicer-1.1.0.tgz#25c7c89cb1f9077f8891bbe61d8f390eae256f1e" @@ -5140,6 +6600,13 @@ figures@3.2.0, figures@^3.0.0, figures@^3.2.0: dependencies: escape-string-regexp "^1.0.5" +figures@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/figures/-/figures-2.0.0.tgz#3ab1a2d2a62c8bfb431a0c94cb797a2fce27c962" + integrity sha512-Oa2M9atig69ZkfwiApY8F2Yy+tzMbazyvqv21R0NsSC8floSOC09BbT1ITWAdoMGQvJ/aZnR1KMwdx9tvHnTNA== + dependencies: + escape-string-regexp "^1.0.5" + file-entry-cache@^6.0.1: version "6.0.1" resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-6.0.1.tgz#211b2dd9659cb0394b073e7323ac3c933d522027" @@ -5147,6 +6614,11 @@ file-entry-cache@^6.0.1: dependencies: flat-cache "^3.0.4" +file-uri-to-path@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz#553a7b8446ff6f684359c445f1e37a05dacc33dd" + integrity sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw== + filelist@^1.0.1: version "1.0.4" resolved "https://registry.yarnpkg.com/filelist/-/filelist-1.0.4.tgz#f78978a1e944775ff9e62e744424f215e58352b5" @@ -5172,6 +6644,16 @@ filing-cabinet@^4.1.6: tsconfig-paths "^4.2.0" typescript "^5.0.4" +fill-range@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-4.0.0.tgz#d544811d428f98eb06a63dc402d2403c328c38f7" + integrity sha512-VcpLTWqWDiTerugjj8e3+esbg+skS3M9e54UuR3iCeIDMXCLTsAH8hTSzDQU/X6/6t3eYkOKoZSef2PlU6U1XQ== + dependencies: + extend-shallow "^2.0.1" + is-number "^3.0.0" + repeat-string "^1.6.1" + to-regex-range "^2.1.0" + fill-range@^7.1.1: version "7.1.1" resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.1.1.tgz#44265d3cac07e3ea7dc247516380643754a05292" @@ -5179,6 +6661,19 @@ fill-range@^7.1.1: dependencies: to-regex-range "^5.0.1" +finalhandler@1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.1.2.tgz#b7e7d000ffd11938d0fdb053506f6ebabe9f587d" + integrity sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA== + dependencies: + debug "2.6.9" + encodeurl "~1.0.2" + escape-html "~1.0.3" + on-finished "~2.3.0" + parseurl "~1.3.3" + statuses "~1.5.0" + unpipe "~1.0.0" + finalhandler@1.3.1: version "1.3.1" resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.3.1.tgz#0c575f1d1d324ddd1da35ad7ece3df7d19088019" @@ -5192,6 +6687,15 @@ finalhandler@1.3.1: statuses "2.0.1" unpipe "~1.0.0" +find-cache-dir@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-2.1.0.tgz#8d0f94cd13fe43c6c7c261a0d86115ca918c05f7" + integrity sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ== + dependencies: + commondir "^1.0.1" + make-dir "^2.0.0" + pkg-dir "^3.0.0" + find-up@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/find-up/-/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7" @@ -5199,6 +6703,13 @@ find-up@^2.0.0: dependencies: locate-path "^2.0.0" +find-up@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-3.0.0.tgz#49169f1d7993430646da61ecc5ae355c21c97b73" + integrity sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg== + dependencies: + locate-path "^3.0.0" + find-up@^4.0.0, find-up@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/find-up/-/find-up-4.1.0.tgz#97afe7d6cdc0bc5928584b7c8d7b16e8a9aa5d19" @@ -5250,6 +6761,11 @@ for-each@^0.3.3: dependencies: is-callable "^1.1.3" +for-in@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80" + integrity sha512-7EwmXrOjyL+ChxMhmG5lnW9MPt1aIeZEwKhQzoBUdTV0N3zuwWDZYVJatDvZ2OyzPUvdIAZDsCetk3coyMfcnQ== + foreground-child@^3.1.0: version "3.1.1" resolved "https://registry.yarnpkg.com/foreground-child/-/foreground-child-3.1.1.tgz#1d173e776d75d2772fed08efe4a0de1ea1b12d0d" @@ -5277,6 +6793,13 @@ forwarded@0.2.0: resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.2.0.tgz#2269936428aad4c15c7ebe9779a84bf0b2a81811" integrity sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow== +fragment-cache@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/fragment-cache/-/fragment-cache-0.2.1.tgz#4290fad27f13e89be7f33799c6bc5a0abfff0d19" + integrity sha512-GMBAbW9antB8iZRHLoGw0b3HANt57diZYFO/HL1JGIC1MjKrdmhxvrJbupnVvpys0zsz7yBApXdQyfepKly2kA== + dependencies: + map-cache "^0.2.2" + fresh@0.5.2: version "0.5.2" resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" @@ -5299,6 +6822,15 @@ fs-constants@^1.0.0: resolved "https://registry.yarnpkg.com/fs-constants/-/fs-constants-1.0.0.tgz#6be0de9be998ce16af8afc24497b9ee9b7ccd9ad" integrity sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow== +fs-extra@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-1.0.0.tgz#cd3ce5f7e7cb6145883fcae3191e9877f8587950" + integrity sha512-VerQV6vEKuhDWD2HGOybV6v5I73syoc/cXAbKlgTC7M/oFVEtklWlp9QH2Ijw3IaWDOQcMkldSPa7zXy79Z/UQ== + dependencies: + graceful-fs "^4.1.2" + jsonfile "^2.1.0" + klaw "^1.0.0" + fs-extra@^11.2.0: version "11.2.0" resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-11.2.0.tgz#e70e17dfad64232287d01929399e0ea7c86b0e5b" @@ -5308,6 +6840,15 @@ fs-extra@^11.2.0: jsonfile "^6.0.1" universalify "^2.0.0" +fs-extra@^8.1.0: + version "8.1.0" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-8.1.0.tgz#49d43c45a88cd9677668cb7be1b46efdb8d2e1c0" + integrity sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g== + dependencies: + graceful-fs "^4.2.0" + jsonfile "^4.0.0" + universalify "^0.1.0" + fs-extra@^9.1.0: version "9.1.0" resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-9.1.0.tgz#5954460c764a8da2094ba3554bf839e6b9a7c86d" @@ -5337,6 +6878,14 @@ fs.realpath@^1.0.0: resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== +fsevents@^1.2.7: + version "1.2.13" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.2.13.tgz#f325cb0455592428bcf11b383370ef70e3bfcc38" + integrity sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw== + dependencies: + bindings "^1.5.0" + nan "^2.12.1" + fsevents@^2.3.2, fsevents@~2.3.2: version "2.3.2" resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a" @@ -5390,7 +6939,7 @@ get-amd-module-type@^5.0.1: ast-module-types "^5.0.0" node-source-walk "^6.0.1" -get-caller-file@^2.0.5: +get-caller-file@^2.0.1, get-caller-file@^2.0.5: version "2.0.5" resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== @@ -5406,6 +6955,22 @@ get-intrinsic@^1.1.1, get-intrinsic@^1.1.3, get-intrinsic@^1.2.1, get-intrinsic@ has-symbols "^1.0.3" hasown "^2.0.0" +get-intrinsic@^1.2.6: + version "1.2.6" + resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.2.6.tgz#43dd3dd0e7b49b82b2dfcad10dc824bf7fc265d5" + integrity sha512-qxsEs+9A+u85HhllWJJFicJfPDhRmjzoYdl64aMWW9yRIJmSyxdn8IEkuIM530/7T+lv0TIHd8L6Q/ra0tEoeA== + dependencies: + call-bind-apply-helpers "^1.0.1" + dunder-proto "^1.0.0" + es-define-property "^1.0.1" + es-errors "^1.3.0" + es-object-atoms "^1.0.0" + function-bind "^1.1.2" + gopd "^1.2.0" + has-symbols "^1.1.0" + hasown "^2.0.2" + math-intrinsics "^1.0.0" + get-own-enumerable-property-symbols@^3.0.0: version "3.0.2" resolved "https://registry.yarnpkg.com/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.2.tgz#b5fde77f22cbe35f390b4e089922c50bce6ef664" @@ -5441,6 +7006,13 @@ get-stream@6.0.0: resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-6.0.0.tgz#3e0012cb6827319da2706e601a1583e8629a6718" integrity sha512-A1B3Bh1UmL0bidM/YX2NsCOTnGJePL9rO/M+Mw3m9f2gUpfokS0hi5Eah0WSUEWZdZhIZtMjkIYS7mDfOqNHbg== +get-stream@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-4.1.0.tgz#c1b255575f3dc21d59bfc79cd3d2b46b1c3a54b5" + integrity sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w== + dependencies: + pump "^3.0.0" + get-stream@^5.0.0, get-stream@^5.1.0: version "5.2.0" resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-5.2.0.tgz#4966a1795ee5ace65e706c4b7beb71257d6e22d3" @@ -5462,6 +7034,11 @@ get-symbol-description@^1.0.2: es-errors "^1.3.0" get-intrinsic "^1.2.4" +get-value@^2.0.3, get-value@^2.0.6: + version "2.0.6" + resolved "https://registry.yarnpkg.com/get-value/-/get-value-2.0.6.tgz#dc15ca1c672387ca76bd37ac0a395ba2042a2c28" + integrity sha512-Ln0UQDlxH1BapMu3GPtf7CuYNwRZf2gwCuPqbyG6pB8WfmFpzqcy4xtAaAMUhnNqjMKTiCPZG2oMT3YSx8U2NA== + getos@^3.2.1: version "3.2.1" resolved "https://registry.yarnpkg.com/getos/-/getos-3.2.1.tgz#0134d1f4e00eb46144c5a9c0ac4dc087cbb27dc5" @@ -5646,7 +7223,12 @@ gopd@^1.0.1: dependencies: get-intrinsic "^1.1.3" -graceful-fs@4.2.11, graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.4, graceful-fs@^4.2.6, graceful-fs@^4.2.9: +gopd@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/gopd/-/gopd-1.2.0.tgz#89f56b8217bdbc8802bd299df6d7f1081d7e51a1" + integrity sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg== + +graceful-fs@4.2.11, graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.2, graceful-fs@^4.1.3, graceful-fs@^4.1.6, graceful-fs@^4.1.9, graceful-fs@^4.2.0, graceful-fs@^4.2.4, graceful-fs@^4.2.6, graceful-fs@^4.2.9: version "4.2.11" resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3" integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== @@ -5705,6 +7287,11 @@ has-symbols@^1.0.2, has-symbols@^1.0.3: resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.3.tgz#bb7b2c4349251dce87b125f7bdf874aa7c8b39f8" integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A== +has-symbols@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.1.0.tgz#fc9c6a783a084951d0b971fe1018de813707a338" + integrity sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ== + has-tostringtag@^1.0.0, has-tostringtag@^1.0.1, has-tostringtag@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/has-tostringtag/-/has-tostringtag-1.0.2.tgz#2cdc42d40bef2e5b4eeab7c01a73c54ce7ab5abc" @@ -5717,12 +7304,55 @@ has-unicode@2.0.1, has-unicode@^2.0.1: resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" integrity sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ== +has-value@^0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/has-value/-/has-value-0.3.1.tgz#7b1f58bada62ca827ec0a2078025654845995e1f" + integrity sha512-gpG936j8/MzaeID5Yif+577c17TxaDmhuyVgSwtnL/q8UUTySg8Mecb+8Cf1otgLoD7DDH75axp86ER7LFsf3Q== + dependencies: + get-value "^2.0.3" + has-values "^0.1.4" + isobject "^2.0.0" + +has-value@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-value/-/has-value-1.0.0.tgz#18b281da585b1c5c51def24c930ed29a0be6b177" + integrity sha512-IBXk4GTsLYdQ7Rvt+GRBrFSVEkmuOUy4re0Xjd9kJSUQpnTrWR4/y9RpfexN9vkAPMFuQoeWKwqzPozRTlasGw== + dependencies: + get-value "^2.0.6" + has-values "^1.0.0" + isobject "^3.0.0" + +has-values@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/has-values/-/has-values-0.1.4.tgz#6d61de95d91dfca9b9a02089ad384bff8f62b771" + integrity sha512-J8S0cEdWuQbqD9//tlZxiMuMNmxB8PlEwvYwuxsTmR1G5RXUePEX/SJn7aD0GMLieuZYSwNH0cQuJGwnYunXRQ== + +has-values@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-values/-/has-values-1.0.0.tgz#95b0b63fec2146619a6fe57fe75628d5a39efe4f" + integrity sha512-ODYZC64uqzmtfGMEAX/FvZiRyWLpAC3vYnNunURUnkGVTS+mI0smVsWaPydRBsE3g+ok7h960jChO8mFcWlHaQ== + dependencies: + is-number "^3.0.0" + kind-of "^4.0.0" + hasown@^2.0.0, hasown@^2.0.1, hasown@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/hasown/-/hasown-2.0.2.tgz#003eaf91be7adc372e84ec59dc37252cedb80003" integrity sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ== dependencies: - function-bind "^1.1.2" + function-bind "^1.1.2" + +hermes-engine@~0.5.0: + version "0.5.1" + resolved "https://registry.yarnpkg.com/hermes-engine/-/hermes-engine-0.5.1.tgz#601115e4b1e0a17d9aa91243b96277de4e926e09" + integrity sha512-hLwqh8dejHayjlpvZY40e1aDCDvyP98cWx/L5DhAjSJLH8g4z9Tp08D7y4+3vErDsncPOdf1bxm+zUWpx0/Fxg== + +hermes-profile-transformer@^0.0.6: + version "0.0.6" + resolved "https://registry.yarnpkg.com/hermes-profile-transformer/-/hermes-profile-transformer-0.0.6.tgz#bd0f5ecceda80dd0ddaae443469ab26fb38fc27b" + integrity sha512-cnN7bQUm65UWOy6cbGcCcZ3rpwW8Q/j4OP5aWRhEry4Z2t2aR1cjrbp0BS+KiBN0smvP1caBgAuxutvyvJILzQ== + dependencies: + source-map "^0.7.3" hoist-non-react-statics@^3.3.0, hoist-non-react-statics@^3.3.2: version "3.3.2" @@ -5840,7 +7470,7 @@ husky@^9.0.7: resolved "https://registry.yarnpkg.com/husky/-/husky-9.1.5.tgz#2b6edede53ee1adbbd3a3da490628a23f5243b83" integrity sha512-rowAVRUBfI0b4+niA4SJMhfQwc107VLkBUgEYYAOQAbqDCnra1nYh83hF/MDmhYs9t9n1E3DuKOrs2LYNC+0Ag== -iconv-lite@0.4.24, iconv-lite@^0.4.24: +iconv-lite@0.4.24, iconv-lite@^0.4.17, iconv-lite@^0.4.24: version "0.4.24" resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== @@ -5881,6 +7511,11 @@ ignore@~6.0.2: resolved "https://registry.yarnpkg.com/ignore/-/ignore-6.0.2.tgz#77cccb72a55796af1b6d2f9eb14fa326d24f4283" integrity sha512-InwqeHHN2XpumIkMvpl/DCJVrAHgCsG5+cn1XlnLWGwtZBm8QJfSusItfrwx81CTp5agNZqpKU2J/ccC5nGT4A== +image-size@^0.6.0: + version "0.6.3" + resolved "https://registry.yarnpkg.com/image-size/-/image-size-0.6.3.tgz#e7e5c65bb534bd7cdcedd6cb5166272a85f75fb2" + integrity sha512-47xSUiQioGaB96nqtp5/q55m0aBQSQdyIloMOc/x+QVTDZLNmXE892IIDrJ0hM1A5vcNUDD5tDffkSP5lCaIIA== + immer@^10.0.3: version "10.1.1" resolved "https://registry.yarnpkg.com/immer/-/immer-10.1.1.tgz#206f344ea372d8ea176891545ee53ccc062db7bc" @@ -5891,6 +7526,14 @@ immutable@^4.0.0: resolved "https://registry.yarnpkg.com/immutable/-/immutable-4.2.2.tgz#2da9ff4384a4330c36d4d1bc88e90f9e0b0ccd16" integrity sha512-fTMKDwtbvO5tldky9QZ2fMX7slR0mYpY5nbnFWYp0fOzDhHqhgIw9KoYgxLWsoNTS9ZHGauHj18DTyEw6BK3Og== +import-fresh@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-2.0.0.tgz#d81355c15612d386c61f9ddd3922d4304822a546" + integrity sha512-eZ5H8rcgYazHbKC3PG4ClHNykCSxtAhxSSEM+2mb+7evD2CKF5V7c0dNum7AdpDh0ZdICwZY9sRSn8f+KH96sg== + dependencies: + caller-path "^2.0.0" + resolve-from "^3.0.0" + import-fresh@^3.2.1, import-fresh@^3.3.0: version "3.3.0" resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b" @@ -5983,6 +7626,26 @@ init-package-json@6.0.3: validate-npm-package-license "^3.0.4" validate-npm-package-name "^5.0.0" +inquirer@^3.0.6: + version "3.3.0" + resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-3.3.0.tgz#9dd2f2ad765dcab1ff0443b491442a20ba227dc9" + integrity sha512-h+xtnyk4EwKvFWHrUYsWErEVR+igKtLdchu+o0Z1RL7VU/jVMFbYir2bp6bAj8efFNxWqHX0dIss6fJQ+/+qeQ== + dependencies: + ansi-escapes "^3.0.0" + chalk "^2.0.0" + cli-cursor "^2.1.0" + cli-width "^2.0.0" + external-editor "^2.0.4" + figures "^2.0.0" + lodash "^4.3.0" + mute-stream "0.0.7" + run-async "^2.2.0" + rx-lite "^4.0.8" + rx-lite-aggregates "^4.0.8" + string-width "^2.1.0" + strip-ansi "^4.0.0" + through "^2.3.6" + inquirer@^8.2.4: version "8.2.6" resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-8.2.6.tgz#733b74888195d8d400a67ac332011b5fae5ea562" @@ -6028,11 +7691,23 @@ ip-address@^9.0.5: jsbn "1.1.0" sprintf-js "^1.1.3" +ip@^1.1.5: + version "1.1.9" + resolved "https://registry.yarnpkg.com/ip/-/ip-1.1.9.tgz#8dfbcc99a754d07f425310b86a99546b1151e396" + integrity sha512-cyRxvOEpNHNtchU3Ln9KC/auJgup87llfQpQ+t5ghoC/UhL16SWzbueiCsdTnWmqAWl7LadfuwhlqmtOaqMHdQ== + ipaddr.js@1.9.1: version "1.9.1" resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.1.tgz#bff38543eeb8984825079ff3a2a8e6cbd46781b3" integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g== +is-accessor-descriptor@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-1.0.1.tgz#3223b10628354644b86260db29b3e693f5ceedd4" + integrity sha512-YBUanLI8Yoihw923YeFUS5fs0fF2f5TSFTNiYAAzhhDscDa3lEqYuz1pDOEP5KvX94I9ey3vsqjJcLVFVU+3QA== + dependencies: + hasown "^2.0.0" + is-arguments@^1.0.4: version "1.1.1" resolved "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz#15b3f88fda01f2a97fec84ca761a560f123efa9b" @@ -6088,6 +7763,11 @@ is-boolean-object@^1.1.0: call-bind "^1.0.2" has-tostringtag "^1.0.0" +is-buffer@^1.1.5: + version "1.1.6" + resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" + integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w== + is-builtin-module@^3.2.1: version "3.2.1" resolved "https://registry.yarnpkg.com/is-builtin-module/-/is-builtin-module-3.2.1.tgz#f03271717d8654cfcaf07ab0463faa3571581169" @@ -6107,6 +7787,13 @@ is-ci@3.0.1: dependencies: ci-info "^3.2.0" +is-ci@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-2.0.0.tgz#6bc6334181810e04b5c22b3d589fdca55026404c" + integrity sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w== + dependencies: + ci-info "^2.0.0" + is-core-module@^2.13.0, is-core-module@^2.13.1, is-core-module@^2.5.0, is-core-module@^2.9.0: version "2.15.1" resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.15.1.tgz#a7363a25bee942fefab0de13bf6aa372c82dcc37" @@ -6114,6 +7801,20 @@ is-core-module@^2.13.0, is-core-module@^2.13.1, is-core-module@^2.5.0, is-core-m dependencies: hasown "^2.0.2" +is-core-module@^2.16.0: + version "2.16.1" + resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.16.1.tgz#2a98801a849f43e2add644fbb6bc6229b19a4ef4" + integrity sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w== + dependencies: + hasown "^2.0.2" + +is-data-descriptor@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-1.0.1.tgz#2109164426166d32ea38c405c1e0945d9e6a4eeb" + integrity sha512-bc4NlCDiCr28U4aEsQ3Qs2491gVq4V8G7MQyws968ImqjKuYtTJXrl7Vq7jsN7Ly/C3xj5KWFrY7sHNeDkAzXw== + dependencies: + hasown "^2.0.0" + is-date-object@^1.0.1, is-date-object@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.5.tgz#0841d5536e724c25597bf6ea62e1bd38298df31f" @@ -6121,11 +7822,44 @@ is-date-object@^1.0.1, is-date-object@^1.0.5: dependencies: has-tostringtag "^1.0.0" +is-descriptor@^0.1.0: + version "0.1.7" + resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-0.1.7.tgz#2727eb61fd789dcd5bdf0ed4569f551d2fe3be33" + integrity sha512-C3grZTvObeN1xud4cRWl366OMXZTj0+HGyk4hvfpx4ZHt1Pb60ANSXqCK7pdOTeUQpRzECBSTphqvD7U+l22Eg== + dependencies: + is-accessor-descriptor "^1.0.1" + is-data-descriptor "^1.0.1" + +is-descriptor@^1.0.0, is-descriptor@^1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-1.0.3.tgz#92d27cb3cd311c4977a4db47df457234a13cb306" + integrity sha512-JCNNGbwWZEVaSPtS45mdtrneRWJFp07LLmykxeFV5F6oBvNF8vHSfJuJgoT472pSfk+Mf8VnlrspaFBHWM8JAw== + dependencies: + is-accessor-descriptor "^1.0.1" + is-data-descriptor "^1.0.1" + +is-directory@^0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/is-directory/-/is-directory-0.3.1.tgz#61339b6f2475fc772fd9c9d83f5c8575dc154ae1" + integrity sha512-yVChGzahRFvbkscn2MlwGismPO12i9+znNruC5gVEntG3qu0xQMzsGg/JFbrsqDOHtHFPci+V5aP5T9I+yeKqw== + is-docker@^2.0.0, is-docker@^2.1.1: version "2.2.1" resolved "https://registry.yarnpkg.com/is-docker/-/is-docker-2.2.1.tgz#33eeabe23cfe86f14bde4408a02c0cfb853acdaa" integrity sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ== +is-extendable@^0.1.0, is-extendable@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89" + integrity sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw== + +is-extendable@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-1.0.1.tgz#a7470f9e426733d81bd81e1155264e3a3507cab4" + integrity sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA== + dependencies: + is-plain-object "^2.0.4" + is-extglob@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" @@ -6138,6 +7872,11 @@ is-finalizationregistry@^1.0.2: dependencies: call-bind "^1.0.2" +is-fullwidth-code-point@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" + integrity sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w== + is-fullwidth-code-point@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" @@ -6207,6 +7946,13 @@ is-number-object@^1.0.4: dependencies: has-tostringtag "^1.0.0" +is-number@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-3.0.0.tgz#24fd6201a4782cf50561c810276afc7d12d71195" + integrity sha512-4cboCqIpliH+mAvFNegjZQ4kgKc3ZUhQVr3HvWbSh5q3WH2v82ct+T2Y1hdU5Gdtorx/cLifQjqCbL7bpznLTg== + dependencies: + kind-of "^3.0.2" + is-number@^7.0.0: version "7.0.0" resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" @@ -6232,7 +7978,7 @@ is-plain-obj@^1.0.0, is-plain-obj@^1.1.0: resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-1.1.0.tgz#71a50c8429dfca773c92a390a4a03b39fcd51d3e" integrity sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg== -is-plain-object@^2.0.4: +is-plain-object@^2.0.3, is-plain-object@^2.0.4: version "2.0.4" resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677" integrity sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og== @@ -6298,6 +8044,11 @@ is-stream@2.0.0: resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.0.tgz#bde9c32680d6fae04129d6ac9d921ce7815f78e3" integrity sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw== +is-stream@^1.0.1, is-stream@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" + integrity sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ== + is-stream@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.1.tgz#fac1e3d53b97ad5a9d0ae9cef2389f5810a5c077" @@ -6376,6 +8127,16 @@ is-weakset@^2.0.1: call-bind "^1.0.2" get-intrinsic "^1.1.1" +is-windows@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d" + integrity sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA== + +is-wsl@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-1.1.0.tgz#1f16e4aa22b04d1336b66188a66af3c600c3a66d" + integrity sha512-gfygJYZ2gLTDlmbWMI0CE2MwnFzSN/2SZfkMlItC4K/JBlsWVDB0bO6XhqcY13YXE7iMcAJnzTCJjPiTeJJ0Mw== + is-wsl@^2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-2.2.0.tgz#74a4c76e77ca9fd3f932f290c17ea326cd157271" @@ -6383,16 +8144,16 @@ is-wsl@^2.2.0: dependencies: is-docker "^2.0.0" +isarray@1.0.0, isarray@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" + integrity sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ== + isarray@^2.0.5: version "2.0.5" resolved "https://registry.yarnpkg.com/isarray/-/isarray-2.0.5.tgz#8af1e4c1221244cc62459faf38940d4e644a5723" integrity sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw== -isarray@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" - integrity sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ== - isexe@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" @@ -6403,11 +8164,26 @@ isexe@^3.1.1: resolved "https://registry.yarnpkg.com/isexe/-/isexe-3.1.1.tgz#4a407e2bd78ddfb14bea0c27c6f7072dde775f0d" integrity sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ== -isobject@^3.0.1: +isobject@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89" + integrity sha512-+OUdGJlgjOBZDfxnDjYYG6zp487z0JGNQq3cYQYg5f5hKR+syHMsaztzGeml/4kGG55CSpKSpWTY+jYGgsHLgA== + dependencies: + isarray "1.0.0" + +isobject@^3.0.0, isobject@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" integrity sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg== +isomorphic-fetch@^2.1.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/isomorphic-fetch/-/isomorphic-fetch-2.2.1.tgz#611ae1acf14f5e81f729507472819fe9733558a9" + integrity sha512-9c4TNAKYXM5PRyVcwUZrF3W09nQ+sO7+jydgs4ZGW9dhsLG2VOlISJABombdQqQRXCwuYG3sYV/puGf5rp0qmA== + dependencies: + node-fetch "^1.0.1" + whatwg-fetch ">=0.10.0" + isomorphic-fetch@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/isomorphic-fetch/-/isomorphic-fetch-3.0.0.tgz#0267b005049046d2421207215d45d6a262b8b8b4" @@ -6645,11 +8421,35 @@ jest-environment-node@^29.7.0: jest-mock "^29.7.0" jest-util "^29.7.0" +jest-get-type@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-24.9.0.tgz#1684a0c8a50f2e4901b6644ae861f579eed2ef0e" + integrity sha512-lUseMzAley4LhIcpSP9Jf+fTrQ4a1yHQwLNeeVa2cEmbCGeoZAtYPOIv8JaxLD/sUpKxetKGP+gsHl8f8TSj8Q== + jest-get-type@^29.6.3: version "29.6.3" resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-29.6.3.tgz#36f499fdcea197c1045a127319c0481723908fd1" integrity sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw== +jest-haste-map@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-24.9.0.tgz#b38a5d64274934e21fa417ae9a9fbeb77ceaac7d" + integrity sha512-kfVFmsuWui2Sj1Rp1AJ4D9HqJwE4uwTlS/vO+eRUaMmd54BFpli2XhMQnPC2k4cHFVbB2Q2C+jtI1AGLgEnCjQ== + dependencies: + "@jest/types" "^24.9.0" + anymatch "^2.0.0" + fb-watchman "^2.0.0" + graceful-fs "^4.1.15" + invariant "^2.2.4" + jest-serializer "^24.9.0" + jest-util "^24.9.0" + jest-worker "^24.9.0" + micromatch "^3.1.10" + sane "^4.0.3" + walker "^1.0.7" + optionalDependencies: + fsevents "^1.2.7" + jest-haste-map@^29.7.0: version "29.7.0" resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-29.7.0.tgz#3c2396524482f5a0506376e6c858c3bbcc17b104" @@ -6687,6 +8487,20 @@ jest-matcher-utils@^29.7.0: jest-get-type "^29.6.3" pretty-format "^29.7.0" +jest-message-util@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-24.9.0.tgz#527f54a1e380f5e202a8d1149b0ec872f43119e3" + integrity sha512-oCj8FiZ3U0hTP4aSui87P4L4jC37BtQwUMqk+zk/b11FR19BJDeZsZAvIHutWnmtw7r85UmR3CEWZ0HWU2mAlw== + dependencies: + "@babel/code-frame" "^7.0.0" + "@jest/test-result" "^24.9.0" + "@jest/types" "^24.9.0" + "@types/stack-utils" "^1.0.1" + chalk "^2.0.1" + micromatch "^3.1.10" + slash "^2.0.0" + stack-utils "^1.0.1" + jest-message-util@^29.7.0: version "29.7.0" resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-29.7.0.tgz#8bc392e204e95dfe7564abbe72a404e28e51f7f3" @@ -6702,6 +8516,13 @@ jest-message-util@^29.7.0: slash "^3.0.0" stack-utils "^2.0.3" +jest-mock@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-24.9.0.tgz#c22835541ee379b908673ad51087a2185c13f1c6" + integrity sha512-3BEYN5WbSq9wd+SyLDES7AHnjH9A/ROBwmz7l2y+ol+NtSFO8DYiEBzoO1CeFc9a8DYy10EO4dDFVv/wN3zl1w== + dependencies: + "@jest/types" "^24.9.0" + jest-mock@^29.7.0: version "29.7.0" resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-29.7.0.tgz#4e836cf60e99c6fcfabe9f99d017f3fdd50a6347" @@ -6799,6 +8620,11 @@ jest-runtime@^29.7.0: slash "^3.0.0" strip-bom "^4.0.0" +jest-serializer@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/jest-serializer/-/jest-serializer-24.9.0.tgz#e6d7d7ef96d31e8b9079a714754c5d5c58288e73" + integrity sha512-DxYipDr8OvfrKH3Kel6NdED3OXxjvxXZ1uIY2I9OFbGg+vUkkg7AGvi65qbhbWNPvDckXmzMPbK3u3HaDO49bQ== + jest-snapshot@^29.7.0: version "29.7.0" resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-29.7.0.tgz#c2c574c3f51865da1bb329036778a69bf88a6be5" @@ -6825,6 +8651,24 @@ jest-snapshot@^29.7.0: pretty-format "^29.7.0" semver "^7.5.3" +jest-util@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-24.9.0.tgz#7396814e48536d2e85a37de3e4c431d7cb140162" + integrity sha512-x+cZU8VRmOJxbA1K5oDBdxQmdq0OIdADarLxk0Mq+3XS4jgvhG/oKGWcIDCtPG0HgjxOYvF+ilPJQsAyXfbNOg== + dependencies: + "@jest/console" "^24.9.0" + "@jest/fake-timers" "^24.9.0" + "@jest/source-map" "^24.9.0" + "@jest/test-result" "^24.9.0" + "@jest/types" "^24.9.0" + callsites "^3.0.0" + chalk "^2.0.1" + graceful-fs "^4.1.15" + is-ci "^2.0.0" + mkdirp "^0.5.1" + slash "^2.0.0" + source-map "^0.6.0" + jest-util@^29.0.0, jest-util@^29.7.0: version "29.7.0" resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-29.7.0.tgz#23c2b62bfb22be82b44de98055802ff3710fc0bc" @@ -6837,6 +8681,18 @@ jest-util@^29.0.0, jest-util@^29.7.0: graceful-fs "^4.2.9" picomatch "^2.2.3" +jest-validate@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-24.9.0.tgz#0775c55360d173cd854e40180756d4ff52def8ab" + integrity sha512-HPIt6C5ACwiqSiwi+OfSSHbK8sG7akG8eATl+IPKaeIjtPOeBUd/g3J7DghugzxrGjI93qS/+RPKe1H6PqvhRQ== + dependencies: + "@jest/types" "^24.9.0" + camelcase "^5.3.1" + chalk "^2.0.1" + jest-get-type "^24.9.0" + leven "^3.1.0" + pretty-format "^24.9.0" + jest-validate@^29.7.0: version "29.7.0" resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-29.7.0.tgz#7bf705511c64da591d46b15fce41400d52147d9c" @@ -6863,6 +8719,14 @@ jest-watcher@^29.7.0: jest-util "^29.7.0" string-length "^4.0.1" +jest-worker@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-24.9.0.tgz#5dbfdb5b2d322e98567898238a9697bcce67b3e5" + integrity sha512-51PE4haMSXcHohnSMdM42anbvZANYTqMrr52tVKPqqsPJMzoP6FYYDVqahX/HrAoKEKz3uUPzSvKs9A3qR4iVw== + dependencies: + merge-stream "^2.0.0" + supports-color "^6.1.0" + jest-worker@^29.7.0: version "29.7.0" resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-29.7.0.tgz#acad073acbbaeb7262bd5389e1bcf43e10058d4a" @@ -6883,6 +8747,11 @@ jest@^29.3.1: import-local "^3.0.2" jest-cli "^29.7.0" +jetifier@^1.6.2: + version "1.6.8" + resolved "https://registry.yarnpkg.com/jetifier/-/jetifier-1.6.8.tgz#e88068697875cbda98c32472902c4d3756247798" + integrity sha512-3Zi16h6L5tXDRQJTb221cnRoVG9/9OvreLdLU2/ZjRv/GILL+2Cemt0IKvkowwkDpvouAU1DQPOJ7qaiHeIdrw== + joi@^17.13.3: version "17.13.3" resolved "https://registry.yarnpkg.com/joi/-/joi-17.13.3.tgz#0f5cc1169c999b30d344366d384b12d92558bcec" @@ -6924,6 +8793,11 @@ jsbn@~0.1.0: resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" integrity sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg== +jsc-android@^245459.0.0: + version "245459.0.0" + resolved "https://registry.yarnpkg.com/jsc-android/-/jsc-android-245459.0.0.tgz#e584258dd0b04c9159a27fb104cd5d491fd202c9" + integrity sha512-wkjURqwaB1daNkDi2OYYbsLnIdC/lUM2nPXQKRs5pqEU9chDg435bjvo+LSaHotDENygHQDHe+ntUkkw2gwMtg== + jsdoc-type-pratt-parser@~4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/jsdoc-type-pratt-parser/-/jsdoc-type-pratt-parser-4.0.0.tgz#136f0571a99c184d84ec84662c45c29ceff71114" @@ -6961,7 +8835,7 @@ jsdom@^20.0.0: ws "^8.11.0" xml-name-validator "^4.0.0" -jsesc@^3.0.2: +jsesc@^3.0.2, jsesc@~3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-3.0.2.tgz#bb8b09a6597ba426425f2e4a07245c3d00b9343e" integrity sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g== @@ -6996,6 +8870,17 @@ json-stable-stringify-without-jsonify@^1.0.1: resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" integrity sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw== +json-stable-stringify@^1.0.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/json-stable-stringify/-/json-stable-stringify-1.2.1.tgz#addb683c2b78014d0b78d704c2fcbdf0695a60e2" + integrity sha512-Lp6HbbBgosLmJbjx0pBLbgvx68FaFU1sdkmBuckmhhJ88kL13OA51CDtR2yJB50eCNMH9wRqtQNNiAqQH4YXnA== + dependencies: + call-bind "^1.0.8" + call-bound "^1.0.3" + isarray "^2.0.5" + jsonify "^0.0.1" + object-keys "^1.1.1" + json-stringify-nice@^1.1.4: version "1.1.4" resolved "https://registry.yarnpkg.com/json-stringify-nice/-/json-stringify-nice-1.1.4.tgz#2c937962b80181d3f317dd39aa323e14f5a60a67" @@ -7028,6 +8913,20 @@ jsonc-parser@~3.3.1: resolved "https://registry.yarnpkg.com/jsonc-parser/-/jsonc-parser-3.3.1.tgz#f2a524b4f7fd11e3d791e559977ad60b98b798b4" integrity sha512-HUgH65KyejrUFPvHFPbqOY0rsFip3Bo5wb4ngvdi1EpCYWUQDC5V+Y7mZws+DLkr4M//zQJoanu1SP+87Dv1oQ== +jsonfile@^2.1.0: + version "2.4.0" + resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-2.4.0.tgz#3736a2b428b87bbda0cc83b53fa3d633a35c2ae8" + integrity sha512-PKllAqbgLgxHaj8TElYymKCAgrASebJrWpTnEkOaTowt23VKXXN0sUeriJ+eh7y6ufb/CC5ap11pz71/cM0hUw== + optionalDependencies: + graceful-fs "^4.1.6" + +jsonfile@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-4.0.0.tgz#8771aae0799b64076b76640fca058f9c10e33ecb" + integrity sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg== + optionalDependencies: + graceful-fs "^4.1.6" + jsonfile@^6.0.1: version "6.1.0" resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-6.1.0.tgz#bc55b2634793c679ec6403094eb13698a6ec0aae" @@ -7037,6 +8936,11 @@ jsonfile@^6.0.1: optionalDependencies: graceful-fs "^4.1.6" +jsonify@^0.0.1, jsonify@~0.0.0: + version "0.0.1" + resolved "https://registry.yarnpkg.com/jsonify/-/jsonify-0.0.1.tgz#2aa3111dae3d34a0f151c63f3a45d995d9420978" + integrity sha512-2/Ki0GcmuqSrgFyelQq9M05y7PS0mEwuIzrf3f1fPqkVDVRvZrPZtVSMHxdgo8Aq0sxAOb/cr2aqqA3LeWHVPg== + jsonparse@^1.2.0, jsonparse@^1.3.1: version "1.3.1" resolved "https://registry.yarnpkg.com/jsonparse/-/jsonparse-1.3.1.tgz#3f4dae4a91fac315f71062f8521cc239f1366280" @@ -7108,11 +9012,37 @@ jws@^3.2.2: jwa "^1.4.1" safe-buffer "^5.0.1" +kind-of@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-1.1.0.tgz#140a3d2d41a36d2efcfa9377b62c24f8495a5c44" + integrity sha512-aUH6ElPnMGon2/YkxRIigV32MOpTVcoXQ1Oo8aYn40s+sJ3j+0gFZsT8HKDcxNy7Fi9zuquWtGaGAahOdv5p/g== + +kind-of@^3.0.2, kind-of@^3.0.3, kind-of@^3.2.0: + version "3.2.2" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64" + integrity sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ== + dependencies: + is-buffer "^1.1.5" + +kind-of@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-4.0.0.tgz#20813df3d712928b207378691a45066fae72dd57" + integrity sha512-24XsCxmEbRwEDbz/qz3stgin8TTzZ1ESR56OMCN0ujYg+vRutNSiOj9bHH9u85DKgXguraugV5sFuvbD4FW/hw== + dependencies: + is-buffer "^1.1.5" + kind-of@^6.0.2, kind-of@^6.0.3: version "6.0.3" resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd" integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw== +klaw@^1.0.0: + version "1.3.1" + resolved "https://registry.yarnpkg.com/klaw/-/klaw-1.3.1.tgz#4088433b46b3b1ba259d78785d8e96f73ba02439" + integrity sha512-TED5xi9gGQjGpNnvRWknrwAB1eL5GciPfVFOt3Vk1OJCVDQbzuSfrF3hkUQKlsgKrG1F+0t5W0m+Fje1jIt8rw== + optionalDependencies: + graceful-fs "^4.1.9" + kleur@^3.0.3: version "3.0.3" resolved "https://registry.yarnpkg.com/kleur/-/kleur-3.0.3.tgz#a79c9ecc86ee1ce3fa6206d1216c501f147fc07e" @@ -7362,6 +9292,14 @@ locate-path@^2.0.0: p-locate "^2.0.0" path-exists "^3.0.0" +locate-path@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-3.0.0.tgz#dbec3b3ab759758071b58fe59fc41871af21400e" + integrity sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A== + dependencies: + p-locate "^3.0.0" + path-exists "^3.0.0" + locate-path@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-5.0.0.tgz#1afba396afd676a6d42504d0a67a3a7eb9f62aa0" @@ -7381,6 +9319,11 @@ lodash.camelcase@^4.3.0: resolved "https://registry.yarnpkg.com/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz#b28aa6288a2b9fc651035c7711f65ab6190331a6" integrity sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA== +lodash.debounce@^4.0.8: + version "4.0.8" + resolved "https://registry.yarnpkg.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz#82d79bff30a67c4005ffd5e2515300ad9ca4d7af" + integrity sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow== + lodash.includes@^4.3.0: version "4.3.0" resolved "https://registry.yarnpkg.com/lodash.includes/-/lodash.includes-4.3.0.tgz#60bb98a87cb923c68ca1e51325483314849f553f" @@ -7431,11 +9374,23 @@ lodash.once@^4.0.0, lodash.once@^4.1.1: resolved "https://registry.yarnpkg.com/lodash.once/-/lodash.once-4.1.1.tgz#0dd3971213c7c56df880977d504c88fb471a97ac" integrity sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg== -lodash@^4.17.21: +lodash.throttle@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/lodash.throttle/-/lodash.throttle-4.1.1.tgz#c23e91b710242ac70c37f1e1cda9274cc39bf2f4" + integrity sha512-wIkUCfVKpVsWo3JSZlc+8MB5it+2AN5W8J7YVMST30UrvcQNZ1Okbj+rbVniijTWE6FGYy4XJq/rHkas8qJMLQ== + +lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.21, lodash@^4.3.0: version "4.17.21" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== +log-symbols@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-2.2.0.tgz#5740e1c5d6f0dfda4ad9323b5332107ef6b4c40a" + integrity sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg== + dependencies: + chalk "^2.0.1" + log-symbols@^4.0.0, log-symbols@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-4.1.0.tgz#3fbdbb95b4683ac9fc785111e792e558d4abd503" @@ -7465,6 +9420,15 @@ logform@^2.3.2, logform@^2.4.0: safe-stable-stringify "^2.3.1" triple-beam "^1.3.0" +logkitty@^0.7.1: + version "0.7.1" + resolved "https://registry.yarnpkg.com/logkitty/-/logkitty-0.7.1.tgz#8e8d62f4085a826e8d38987722570234e33c6aa7" + integrity sha512-/3ER20CTTbahrCrpYfPn7Xavv9diBROZpoXGVZDWMw4b/X4uuUwAC0ki85tgsdMRONURyIJbcOvS94QsUBYPbQ== + dependencies: + ansi-fragments "^0.2.1" + dayjs "^1.8.15" + yargs "^15.1.0" + long@^5.0.0: version "5.2.1" resolved "https://registry.yarnpkg.com/long/-/long-5.2.1.tgz#e27595d0083d103d2fa2c20c7699f8e0c92b897f" @@ -7487,6 +9451,14 @@ lru-cache@^11.0.0: resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-11.0.2.tgz#fbd8e7cf8211f5e7e5d91905c415a3f55755ca39" integrity sha512-123qHRfJBmo2jXDbo/a5YOQrJoHF/GNQTLzQ5+IdK5pWpceK17yRc6ozlWd25FxvGKQbIUs91fDFkXmDHTKcyA== +lru-cache@^4.0.1: + version "4.1.5" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.5.tgz#8bbe50ea85bed59bc9e33dcab8235ee9bcf443cd" + integrity sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g== + dependencies: + pseudomap "^1.0.2" + yallist "^2.1.2" + lru-cache@^5.1.1: version "5.1.1" resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920" @@ -7534,7 +9506,7 @@ make-dir@4.0.0: dependencies: semver "^7.5.3" -make-dir@^2.1.0: +make-dir@^2.0.0, make-dir@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-2.1.0.tgz#5f0310e18b8be898cc07009295a30ae41e91e6f5" integrity sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA== @@ -7579,6 +9551,11 @@ makeerror@1.0.12: dependencies: tmpl "1.0.5" +map-cache@^0.2.2: + version "0.2.2" + resolved "https://registry.yarnpkg.com/map-cache/-/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf" + integrity sha512-8y/eV9QQZCiyn1SprXSrCmqJN0yNRATe+PO8ztwqrvrbdRLA3eYJF0yaR0YayLWkMbsQSKWS9N2gPcGEc4UsZg== + map-obj@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-1.0.1.tgz#d933ceb9205d82bdcf4886f6742bdc2b4dea146d" @@ -7594,6 +9571,13 @@ map-stream@~0.1.0: resolved "https://registry.yarnpkg.com/map-stream/-/map-stream-0.1.0.tgz#e56aa94c4c8055a16404a0674b78f215f7c8e194" integrity sha512-CkYQrPYZfWnu/DAmVCpTSX/xHpKZ80eKh2lAkyA6AJTef6bW+6JpbQZN5rofum7da+SyN1bi5ctTm+lTfcCW3g== +map-visit@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/map-visit/-/map-visit-1.0.0.tgz#ecdca8f13144e660f1b5bd41f12f3479d98dfb8f" + integrity sha512-4y7uGv8bd2WdM9vpQsiQNo41Ln1NvhvDRuVt0k2JZQ+ezN2uaQes7lZeZ+QQUHOLQAtDaBJ+7wCbi+ab/KFs+w== + dependencies: + object-visit "^1.0.0" + markdown-it@13.0.1: version "13.0.1" resolved "https://registry.yarnpkg.com/markdown-it/-/markdown-it-13.0.1.tgz#c6ecc431cacf1a5da531423fc6a42807814af430" @@ -7654,6 +9638,11 @@ markdownlint@~0.35.0: markdown-it "14.1.0" markdownlint-micromark "0.1.10" +math-intrinsics@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/math-intrinsics/-/math-intrinsics-1.1.0.tgz#a0dd74be81e2aa5c2f27e65ce283605ee4e2b7f9" + integrity sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g== + mdurl@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/mdurl/-/mdurl-1.0.1.tgz#fe85b2ec75a59037f2adfec100fd6c601761152e" @@ -7696,6 +9685,13 @@ merge-descriptors@1.0.3: resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.3.tgz#d80319a65f3c7935351e5cfdac8f9318504dbed5" integrity sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ== +merge-stream@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-1.0.1.tgz#4041202d508a342ba00174008df0c251b8c135e1" + integrity sha512-e6RM36aegd4f+r8BZCcYXlO2P3H6xbUM6ktL2Xmf45GAOit9bI4z6/3VU7JwllVO1L7u0UDSg/EhzQ5lmMLolA== + dependencies: + readable-stream "^2.0.1" + merge-stream@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" @@ -7711,6 +9707,243 @@ methods@~1.1.2: resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" integrity sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w== +metro-babel-register@0.59.0: + version "0.59.0" + resolved "https://registry.yarnpkg.com/metro-babel-register/-/metro-babel-register-0.59.0.tgz#2bcff65641b36794cf083ba732fbc46cf870fb43" + integrity sha512-JtWc29erdsXO/V3loenXKw+aHUXgj7lt0QPaZKPpctLLy8kcEpI/8pfXXgVK9weXICCpCnYtYncIosAyzh0xjg== + dependencies: + "@babel/core" "^7.0.0" + "@babel/plugin-proposal-class-properties" "^7.0.0" + "@babel/plugin-proposal-nullish-coalescing-operator" "^7.0.0" + "@babel/plugin-proposal-optional-chaining" "^7.0.0" + "@babel/plugin-transform-flow-strip-types" "^7.0.0" + "@babel/plugin-transform-modules-commonjs" "^7.0.0" + "@babel/register" "^7.0.0" + escape-string-regexp "^1.0.5" + +metro-babel-transformer@0.59.0: + version "0.59.0" + resolved "https://registry.yarnpkg.com/metro-babel-transformer/-/metro-babel-transformer-0.59.0.tgz#dda99c75d831b00142c42c020c51c103b29f199d" + integrity sha512-fdZJl8rs54GVFXokxRdD7ZrQ1TJjxWzOi/xSP25VR3E8tbm3nBZqS+/ylu643qSr/IueABR+jrlqAyACwGEf6w== + dependencies: + "@babel/core" "^7.0.0" + metro-source-map "0.59.0" + +metro-cache@0.59.0: + version "0.59.0" + resolved "https://registry.yarnpkg.com/metro-cache/-/metro-cache-0.59.0.tgz#ef3c055f276933979b731455dc8317d7a66f0f2d" + integrity sha512-ryWNkSnpyADfRpHGb8BRhQ3+k8bdT/bsxMH2O0ntlZYZ188d8nnYWmxbRvFmEzToJxe/ol4uDw0tJFAaQsN8KA== + dependencies: + jest-serializer "^24.9.0" + metro-core "0.59.0" + mkdirp "^0.5.1" + rimraf "^2.5.4" + +metro-config@0.59.0, metro-config@^0.59.0: + version "0.59.0" + resolved "https://registry.yarnpkg.com/metro-config/-/metro-config-0.59.0.tgz#9844e388069321dd7403e49f0d495a81f9aa0fef" + integrity sha512-MDsknFG9vZ4Nb5VR6OUDmGHaWz6oZg/FtE3up1zVBKPVRTXE1Z+k7zypnPtMXjMh3WHs/Sy4+wU1xnceE/zdnA== + dependencies: + cosmiconfig "^5.0.5" + jest-validate "^24.9.0" + metro "0.59.0" + metro-cache "0.59.0" + metro-core "0.59.0" + +metro-core@0.59.0, metro-core@^0.59.0: + version "0.59.0" + resolved "https://registry.yarnpkg.com/metro-core/-/metro-core-0.59.0.tgz#958cde3fe5c8cd84a78e1899af801ad69e9c83b1" + integrity sha512-kb5LKvV5r2pqMEzGyTid8ai2mIjW13NMduQ8oBmfha7/EPTATcTQ//s+bkhAs1toQD8vqVvjAb0cPNjWQEmcmQ== + dependencies: + jest-haste-map "^24.9.0" + lodash.throttle "^4.1.1" + metro-resolver "0.59.0" + wordwrap "^1.0.0" + +metro-inspector-proxy@0.59.0: + version "0.59.0" + resolved "https://registry.yarnpkg.com/metro-inspector-proxy/-/metro-inspector-proxy-0.59.0.tgz#39d1390772d13767fc595be9a1a7074e2425cf8e" + integrity sha512-hPeAuQcofTOH0F+2GEZqWkvkVY1/skezSSlMocDQDaqds+Kw6JgdA7FlZXxnKmQ/jYrWUzff/pl8SUCDwuYthQ== + dependencies: + connect "^3.6.5" + debug "^2.2.0" + ws "^1.1.5" + yargs "^14.2.0" + +metro-minify-uglify@0.59.0: + version "0.59.0" + resolved "https://registry.yarnpkg.com/metro-minify-uglify/-/metro-minify-uglify-0.59.0.tgz#6491876308d878742f7b894d7fca4af356886dd5" + integrity sha512-7IzVgCVWZMymgZ/quieg/9v5EQ8QmZWAgDc86Zp9j0Vy6tQTjUn6jlU+YAKW3mfMEjMr6iIUzCD8YklX78tFAw== + dependencies: + uglify-es "^3.1.9" + +metro-react-native-babel-preset@0.59.0: + version "0.59.0" + resolved "https://registry.yarnpkg.com/metro-react-native-babel-preset/-/metro-react-native-babel-preset-0.59.0.tgz#20e020bc6ac9849e1477de1333d303ed42aba225" + integrity sha512-BoO6ncPfceIDReIH8pQ5tQptcGo5yRWQXJGVXfANbiKLq4tfgdZB1C1e2rMUJ6iypmeJU9dzl+EhPmIFKtgREg== + dependencies: + "@babel/plugin-proposal-class-properties" "^7.0.0" + "@babel/plugin-proposal-export-default-from" "^7.0.0" + "@babel/plugin-proposal-nullish-coalescing-operator" "^7.0.0" + "@babel/plugin-proposal-object-rest-spread" "^7.0.0" + "@babel/plugin-proposal-optional-catch-binding" "^7.0.0" + "@babel/plugin-proposal-optional-chaining" "^7.0.0" + "@babel/plugin-syntax-dynamic-import" "^7.0.0" + "@babel/plugin-syntax-export-default-from" "^7.0.0" + "@babel/plugin-syntax-flow" "^7.2.0" + "@babel/plugin-syntax-nullish-coalescing-operator" "^7.0.0" + "@babel/plugin-syntax-optional-chaining" "^7.0.0" + "@babel/plugin-transform-arrow-functions" "^7.0.0" + "@babel/plugin-transform-block-scoping" "^7.0.0" + "@babel/plugin-transform-classes" "^7.0.0" + "@babel/plugin-transform-computed-properties" "^7.0.0" + "@babel/plugin-transform-destructuring" "^7.0.0" + "@babel/plugin-transform-exponentiation-operator" "^7.0.0" + "@babel/plugin-transform-flow-strip-types" "^7.0.0" + "@babel/plugin-transform-for-of" "^7.0.0" + "@babel/plugin-transform-function-name" "^7.0.0" + "@babel/plugin-transform-literals" "^7.0.0" + "@babel/plugin-transform-modules-commonjs" "^7.0.0" + "@babel/plugin-transform-object-assign" "^7.0.0" + "@babel/plugin-transform-parameters" "^7.0.0" + "@babel/plugin-transform-react-display-name" "^7.0.0" + "@babel/plugin-transform-react-jsx" "^7.0.0" + "@babel/plugin-transform-react-jsx-self" "^7.0.0" + "@babel/plugin-transform-react-jsx-source" "^7.0.0" + "@babel/plugin-transform-regenerator" "^7.0.0" + "@babel/plugin-transform-runtime" "^7.0.0" + "@babel/plugin-transform-shorthand-properties" "^7.0.0" + "@babel/plugin-transform-spread" "^7.0.0" + "@babel/plugin-transform-sticky-regex" "^7.0.0" + "@babel/plugin-transform-template-literals" "^7.0.0" + "@babel/plugin-transform-typescript" "^7.5.0" + "@babel/plugin-transform-unicode-regex" "^7.0.0" + "@babel/template" "^7.0.0" + react-refresh "^0.4.0" + +metro-react-native-babel-transformer@0.59.0, metro-react-native-babel-transformer@^0.59.0: + version "0.59.0" + resolved "https://registry.yarnpkg.com/metro-react-native-babel-transformer/-/metro-react-native-babel-transformer-0.59.0.tgz#9b3dfd6ad35c6ef37fc4ce4d20a2eb67fabbb4be" + integrity sha512-1O3wrnMq4NcPQ1asEcl9lRDn/t+F1Oef6S9WaYVIKEhg9m/EQRGVrrTVP+R6B5Eeaj3+zNKbzM8Dx/NWy1hUbQ== + dependencies: + "@babel/core" "^7.0.0" + babel-preset-fbjs "^3.3.0" + metro-babel-transformer "0.59.0" + metro-react-native-babel-preset "0.59.0" + metro-source-map "0.59.0" + +metro-resolver@0.59.0, metro-resolver@^0.59.0: + version "0.59.0" + resolved "https://registry.yarnpkg.com/metro-resolver/-/metro-resolver-0.59.0.tgz#fbc9d7c95f094c52807877d0011feffb9e896fad" + integrity sha512-lbgiumnwoVosffEI96z0FGuq1ejTorHAj3QYUPmp5dFMfitRxLP7Wm/WP9l4ZZjIptxTExsJwuEff1SLRCPD9w== + dependencies: + absolute-path "^0.0.0" + +metro-source-map@0.59.0: + version "0.59.0" + resolved "https://registry.yarnpkg.com/metro-source-map/-/metro-source-map-0.59.0.tgz#e9beb9fc51bfb4e060f95820cf1508fc122d23f7" + integrity sha512-0w5CmCM+ybSqXIjqU4RiK40t4bvANL6lafabQ2GP2XD3vSwkLY+StWzCtsb4mPuyi9R/SgoLBel+ZOXHXAH0eQ== + dependencies: + "@babel/traverse" "^7.0.0" + "@babel/types" "^7.0.0" + invariant "^2.2.4" + metro-symbolicate "0.59.0" + ob1 "0.59.0" + source-map "^0.5.6" + vlq "^1.0.0" + +metro-symbolicate@0.59.0: + version "0.59.0" + resolved "https://registry.yarnpkg.com/metro-symbolicate/-/metro-symbolicate-0.59.0.tgz#fc7f93957a42b02c2bfc57ed1e8f393f5f636a54" + integrity sha512-asLaF2A7rndrToGFIknL13aiohwPJ95RKHf0NM3hP/nipiLDoMzXT6ZnQvBqDxkUKyP+51AI75DMtb+Wcyw4Bw== + dependencies: + invariant "^2.2.4" + metro-source-map "0.59.0" + source-map "^0.5.6" + through2 "^2.0.1" + vlq "^1.0.0" + +metro@0.59.0, metro@^0.59.0: + version "0.59.0" + resolved "https://registry.yarnpkg.com/metro/-/metro-0.59.0.tgz#64a87cd61357814a4f279518e0781b1eab5934b8" + integrity sha512-OpVgYXyuTvouusFZQJ/UYKEbwfLmialrSCUUTGTFaBor6UMUHZgXPYtK86LzesgMqRc8aiuTQVO78iKW2Iz3wg== + dependencies: + "@babel/code-frame" "^7.0.0" + "@babel/core" "^7.0.0" + "@babel/generator" "^7.5.0" + "@babel/parser" "^7.0.0" + "@babel/plugin-external-helpers" "^7.0.0" + "@babel/template" "^7.0.0" + "@babel/traverse" "^7.0.0" + "@babel/types" "^7.0.0" + absolute-path "^0.0.0" + async "^2.4.0" + babel-preset-fbjs "^3.3.0" + buffer-crc32 "^0.2.13" + chalk "^2.4.1" + ci-info "^2.0.0" + concat-stream "^1.6.0" + connect "^3.6.5" + debug "^2.2.0" + denodeify "^1.2.1" + error-stack-parser "^2.0.6" + eventemitter3 "^3.0.0" + fbjs "^1.0.0" + fs-extra "^1.0.0" + graceful-fs "^4.1.3" + image-size "^0.6.0" + invariant "^2.2.4" + jest-haste-map "^24.9.0" + jest-worker "^24.9.0" + json-stable-stringify "^1.0.1" + lodash.throttle "^4.1.1" + merge-stream "^1.0.1" + metro-babel-register "0.59.0" + metro-babel-transformer "0.59.0" + metro-cache "0.59.0" + metro-config "0.59.0" + metro-core "0.59.0" + metro-inspector-proxy "0.59.0" + metro-minify-uglify "0.59.0" + metro-react-native-babel-preset "0.59.0" + metro-resolver "0.59.0" + metro-source-map "0.59.0" + metro-symbolicate "0.59.0" + mime-types "2.1.11" + mkdirp "^0.5.1" + node-fetch "^2.2.0" + nullthrows "^1.1.1" + resolve "^1.5.0" + rimraf "^2.5.4" + serialize-error "^2.1.0" + source-map "^0.5.6" + strip-ansi "^4.0.0" + temp "0.8.3" + throat "^4.1.0" + wordwrap "^1.0.0" + ws "^1.1.5" + xpipe "^1.0.5" + yargs "^14.2.0" + +micromatch@^3.1.10, micromatch@^3.1.4: + version "3.1.10" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-3.1.10.tgz#70859bc95c9840952f359a068a3fc49f9ecfac23" + integrity sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg== + dependencies: + arr-diff "^4.0.0" + array-unique "^0.3.2" + braces "^2.3.1" + define-property "^2.0.2" + extend-shallow "^3.0.2" + extglob "^2.0.4" + fragment-cache "^0.2.1" + kind-of "^6.0.2" + nanomatch "^1.2.9" + object.pick "^1.3.0" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.2" + micromatch@^4.0.4, micromatch@^4.0.5: version "4.0.8" resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.8.tgz#d66fa18f3a47076789320b9b1af32bd86d9fa202" @@ -7724,6 +9957,18 @@ mime-db@1.52.0, "mime-db@>= 1.43.0 < 2": resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70" integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== +mime-db@~1.23.0: + version "1.23.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.23.0.tgz#a31b4070adaea27d732ea333740a64d0ec9a6659" + integrity sha512-lsX3UhcJITPHDXGOXSglBSPoI2UbcsWMmgX1VTaeXJ11TjjxOSE/DHrCl23zJk75odJc8MVpdZzWxdWt1Csx5Q== + +mime-types@2.1.11: + version "2.1.11" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.11.tgz#c259c471bda808a85d6cd193b430a5fae4473b3c" + integrity sha512-14dD2ItPaGFLVyhddUE/Rrtg+g7v8RmBLjN5Xsb3fJJLKunoZOw3I3bK6csjoJKjaNjcXo8xob9kHDyOpJfgpg== + dependencies: + mime-db "~1.23.0" + mime-types@^2.1.12, mime-types@~2.1.19, mime-types@~2.1.24, mime-types@~2.1.34: version "2.1.35" resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a" @@ -7736,6 +9981,16 @@ mime@1.6.0: resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== +mime@^2.4.1: + version "2.6.0" + resolved "https://registry.yarnpkg.com/mime/-/mime-2.6.0.tgz#a2a682a95cd4d0cb1d6257e28f83da7e35800367" + integrity sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg== + +mimic-fn@^1.0.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-1.2.0.tgz#820c86a39334640e99516928bd03fca88057d022" + integrity sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ== + mimic-fn@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" @@ -7809,7 +10064,7 @@ minimist-options@4.1.0: is-plain-obj "^1.1.0" kind-of "^6.0.3" -minimist@^1.2.0, minimist@^1.2.5, minimist@^1.2.6, minimist@^1.2.8: +minimist@^1.1.1, minimist@^1.2.0, minimist@^1.2.5, minimist@^1.2.6, minimist@^1.2.8: version "1.2.8" resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.8.tgz#c1a464e7693302e082a075cee0c057741ac4772c" integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== @@ -7883,6 +10138,21 @@ minizlib@^2.1.1, minizlib@^2.1.2: minipass "^3.0.0" yallist "^4.0.0" +mixin-deep@^1.2.0: + version "1.3.2" + resolved "https://registry.yarnpkg.com/mixin-deep/-/mixin-deep-1.3.2.tgz#1120b43dc359a785dce65b55b82e257ccf479566" + integrity sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA== + dependencies: + for-in "^1.0.2" + is-extendable "^1.0.1" + +mkdirp@^0.5.1: + version "0.5.6" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.6.tgz#7def03d2432dcae4ba1d611445c48396062255f6" + integrity sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw== + dependencies: + minimist "^1.2.6" + mkdirp@^1.0.3: version "1.0.4" resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e" @@ -7959,6 +10229,11 @@ multimatch@5.0.0: arrify "^2.0.1" minimatch "^3.0.4" +mute-stream@0.0.7: + version "0.0.7" + resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.7.tgz#3075ce93bc21b8fab43e1bc4da7e8115ed1e7bab" + integrity sha512-r65nCZhrbXXb6dXOACihYApHw2Q6pV0M3V0PSxd74N0+D8nzAdEAITq2oAjA1jVnKI+tGvEBUpqiMh0+rW6zDQ== + mute-stream@0.0.8: version "0.0.8" resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.8.tgz#1630c42b2251ff81e2a283de96a5497ea92e5e0d" @@ -7969,11 +10244,33 @@ mute-stream@^1.0.0: resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-1.0.0.tgz#e31bd9fe62f0aed23520aa4324ea6671531e013e" integrity sha512-avsJQhyd+680gKXyG/sQc0nXaC6rBkPOfyHYcFb9+hdkqQkR9bdnkJ0AMZhke0oesPqIO+mFFJ+IdBc7mst4IA== +nan@^2.12.1: + version "2.22.0" + resolved "https://registry.yarnpkg.com/nan/-/nan-2.22.0.tgz#31bc433fc33213c97bad36404bb68063de604de3" + integrity sha512-nbajikzWTMwsW+eSsNm3QwlOs7het9gGJU5dDZzRTQGk03vyBOauxgI4VakDzE0PtsGTmXPsXTbbjVhRwR5mpw== + nanoid@^3.3.7: version "3.3.7" resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.7.tgz#d0c301a691bc8d54efa0a2226ccf3fe2fd656bd8" integrity sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g== +nanomatch@^1.2.9: + version "1.2.13" + resolved "https://registry.yarnpkg.com/nanomatch/-/nanomatch-1.2.13.tgz#b87a8aa4fc0de8fe6be88895b38983ff265bd119" + integrity sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA== + dependencies: + arr-diff "^4.0.0" + array-unique "^0.3.2" + define-property "^2.0.2" + extend-shallow "^3.0.2" + fragment-cache "^0.2.1" + is-windows "^1.0.2" + kind-of "^6.0.2" + object.pick "^1.3.0" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.1" + natural-compare-lite@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/natural-compare-lite/-/natural-compare-lite-1.4.0.tgz#17b09581988979fddafe0201e931ba933c96cbb4" @@ -7989,7 +10286,7 @@ negotiator@0.6.3: resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.3.tgz#58e323a72fedc0d6f9cd4d31fe49f51479590ccd" integrity sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg== -negotiator@^0.6.3: +negotiator@^0.6.3, negotiator@~0.6.4: version "0.6.4" resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.4.tgz#777948e2452651c570b712dd01c23e262713fff7" integrity sha512-myRT3DiWPHqho5PrJaIRyaMv2kgYf0mUVgBNOYMuCH5Ki1yEiQaf/ZJuQ62nvpc44wL5WDbTX7yGJi1Neevw8w== @@ -8004,6 +10301,11 @@ nice-try@^1.0.4: resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366" integrity sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ== +nocache@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/nocache/-/nocache-2.1.0.tgz#120c9ffec43b5729b1d5de88cd71aa75a0ba491f" + integrity sha512-0L9FvHG3nfnnmaEQPjT9xhfN4ISk0A8/2j4M37Np4mcDesJjHgEUfgPhdCyZuFI954tjokaIj/A3NdpFNdEh4Q== + node-addon-api@^5.0.0: version "5.1.0" resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-5.1.0.tgz#49da1ca055e109a23d537e9de43c09cca21eb762" @@ -8016,6 +10318,21 @@ node-fetch@2.6.7: dependencies: whatwg-url "^5.0.0" +node-fetch@^1.0.1: + version "1.7.3" + resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-1.7.3.tgz#980f6f72d85211a5347c6b2bc18c5b84c3eb47ef" + integrity sha512-NhZ4CsKx7cYm2vSrBAr2PvFOe6sWDf0UYLRqA6svUYg7+/TSfVAu49jYC4BvQ4Sms9SZgdqGBgroqfDhJdTyKQ== + dependencies: + encoding "^0.1.11" + is-stream "^1.0.1" + +node-fetch@^2.2.0, node-fetch@^2.6.0: + version "2.7.0" + resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.7.0.tgz#d0f0fa6e3e2dc1d27efcd8ad99d550bda94d187d" + integrity sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A== + dependencies: + whatwg-url "^5.0.0" + node-fetch@^2.6.1, node-fetch@^2.6.7: version "2.6.8" resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.8.tgz#a68d30b162bc1d8fd71a367e81b997e1f4d4937e" @@ -8054,6 +10371,11 @@ node-releases@^2.0.18: resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.18.tgz#f010e8d35e2fe8d6b2944f03f70213ecedc4ca3f" integrity sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g== +node-releases@^2.0.19: + version "2.0.19" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.19.tgz#9e445a52950951ec4d177d843af370b411caf314" + integrity sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw== + node-source-walk@^6.0.0, node-source-walk@^6.0.1, node-source-walk@^6.0.2: version "6.0.2" resolved "https://registry.yarnpkg.com/node-source-walk/-/node-source-walk-6.0.2.tgz#ba81bc4bc0f6f05559b084bea10be84c3f87f211" @@ -8061,6 +10383,11 @@ node-source-walk@^6.0.0, node-source-walk@^6.0.1, node-source-walk@^6.0.2: dependencies: "@babel/parser" "^7.21.8" +node-stream-zip@^1.9.1: + version "1.15.0" + resolved "https://registry.yarnpkg.com/node-stream-zip/-/node-stream-zip-1.15.0.tgz#158adb88ed8004c6c49a396b50a6a5de3bca33ea" + integrity sha512-LN4fydt9TqhZhThkZIVQnF9cwjU3qmUH9h78Mx/K7d3VvfRqqwthLwJEUOEL0QPZ0XQmNN7be5Ggit5+4dq3Bw== + nodemon@^3.0.1: version "3.1.0" resolved "https://registry.yarnpkg.com/nodemon/-/nodemon-3.1.0.tgz#ff7394f2450eb6a5e96fe4180acd5176b29799c9" @@ -8120,6 +10447,13 @@ normalize-package-data@^6.0.0, normalize-package-data@^6.0.1: semver "^7.3.5" validate-npm-package-license "^3.0.4" +normalize-path@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9" + integrity sha512-3pKJwH184Xo/lnH6oyP1q2pMd7HcypqqmRs91/6/i2CGtWwIKGCkOOMTm/zXbgTEWHw1uNpNi/igc3ePOYHb6w== + dependencies: + remove-trailing-separator "^1.0.1" + normalize-path@^3.0.0, normalize-path@~3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" @@ -8210,6 +10544,13 @@ npm-run-all@^4.1.5: shell-quote "^1.6.1" string.prototype.padend "^3.0.0" +npm-run-path@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-2.0.2.tgz#35a9232dfa35d7067b4cb2ddf2357b1871536c5f" + integrity sha512-lJxZYlT4DW/bRUtFh1MQIWqmLwQfAxnqWG4HhEdjMlkrJYnJn0Jrr2u3mgxqaWsdiBc76TYkTG/mhrnYTuzfHw== + dependencies: + path-key "^2.0.0" + npm-run-path@^4.0.0, npm-run-path@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-4.0.1.tgz#b7ecd1e5ed53da8e37a55e1c2269e0b97ed748ea" @@ -8234,6 +10575,11 @@ npmlog@^5.0.1: gauge "^3.0.0" set-blocking "^2.0.0" +nullthrows@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/nullthrows/-/nullthrows-1.1.1.tgz#7818258843856ae971eae4208ad7d7eb19a431b1" + integrity sha512-2vPPEi+Z7WqML2jZYddDIfy5Dqb0r2fze2zTxNNknZaFpVHU3mFB3R+DWeJWGVx0ecvttSGlJTI+WG+8Z4cDWw== + nwsapi@^2.2.2: version "2.2.2" resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.2.2.tgz#e5418863e7905df67d51ec95938d67bf801f0bb0" @@ -8288,11 +10634,25 @@ nwsapi@^2.2.2: "@nx/nx-win32-arm64-msvc" "20.1.0" "@nx/nx-win32-x64-msvc" "20.1.0" -object-assign@^4.1.1: +ob1@0.59.0: + version "0.59.0" + resolved "https://registry.yarnpkg.com/ob1/-/ob1-0.59.0.tgz#ee103619ef5cb697f2866e3577da6f0ecd565a36" + integrity sha512-opXMTxyWJ9m68ZglCxwo0OPRESIC/iGmKFPXEXzMZqsVIrgoRXOHmoMDkQzz4y3irVjbyPJRAh5pI9fd0MJTFQ== + +object-assign@^4.0.1, object-assign@^4.1.0, object-assign@^4.1.1: version "4.1.1" resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg== +object-copy@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/object-copy/-/object-copy-0.1.0.tgz#7e7d858b781bd7c991a41ba975ed3812754e998c" + integrity sha512-79LYn6VAb63zgtmAteVOWo9Vdj71ZVBy3Pbse+VqxDpEP83XuujMrGqHIwAXJ5I/aM0zU7dIyIAhifVTPrNItQ== + dependencies: + copy-descriptor "^0.1.0" + define-property "^0.2.5" + kind-of "^3.0.3" + object-inspect@^1.12.2, object-inspect@^1.13.1: version "1.13.1" resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.13.1.tgz#b96c6109324ccfef6b12216a956ca4dc2ff94bc2" @@ -8303,6 +10663,13 @@ object-keys@^1.1.1: resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== +object-visit@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/object-visit/-/object-visit-1.0.1.tgz#f79c4493af0c5377b59fe39d395e41042dd045bb" + integrity sha512-GBaMwwAVK9qbQN3Scdo0OyvgPW7l3lnaVMj84uTOZlswkX0KpF6fyDBJhtTthf7pymztoN36/KEr1DyhF96zEA== + dependencies: + isobject "^3.0.0" + object.assign@^4.1.3, object.assign@^4.1.5: version "4.1.5" resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.5.tgz#3a833f9ab7fdb80fc9e8d2300c803d216d8fdbb0" @@ -8350,6 +10717,13 @@ object.hasown@^1.1.2: define-properties "^1.1.4" es-abstract "^1.20.4" +object.pick@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/object.pick/-/object.pick-1.3.0.tgz#87a10ac4c1694bd2e1cbf53591a66141fb5dd747" + integrity sha512-tqa/UMy/CCoYmj+H5qc07qvSL9dqcs/WZENZ1JbtWBlATP+iVOe778gE6MSijnyCnORzDuX6hU+LA4SZ09YjFQ== + dependencies: + isobject "^3.0.1" + object.values@^1.1.6, object.values@^1.1.7: version "1.1.7" resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.1.7.tgz#617ed13272e7e1071b43973aa1655d9291b8442a" @@ -8366,6 +10740,13 @@ on-finished@2.4.1: dependencies: ee-first "1.1.1" +on-finished@~2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947" + integrity sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww== + dependencies: + ee-first "1.1.1" + on-headers@~1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/on-headers/-/on-headers-1.0.2.tgz#772b0ae6aaa525c399e489adfad90c403eb3c28f" @@ -8385,6 +10766,13 @@ one-time@^1.0.0: dependencies: fn.name "1.x.x" +onetime@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/onetime/-/onetime-2.0.1.tgz#067428230fd67443b2794b22bba528b6867962d4" + integrity sha512-oyyPpiMaKARvvcgip+JV+7zci5L8D1W9RZIz2l1o08AM3pfspitVWnPt3mzHcBPp12oYMTy0pqrFs/C+m3EwsQ== + dependencies: + mimic-fn "^1.0.0" + onetime@^5.1.0, onetime@^5.1.2: version "5.1.2" resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e" @@ -8399,6 +10787,13 @@ onetime@^6.0.0: dependencies: mimic-fn "^4.0.0" +open@^6.2.0: + version "6.4.0" + resolved "https://registry.yarnpkg.com/open/-/open-6.4.0.tgz#5c13e96d0dc894686164f18965ecfe889ecfc8a9" + integrity sha512-IFenVPgF70fSm1keSd2iDBIDIBZkroLeuffXq+wKTzTJlBpesFWojV9lb8mzOfaAzM1sr7HQHuO0vtV0zYekGg== + dependencies: + is-wsl "^1.1.0" + open@^8.4.0: version "8.4.2" resolved "https://registry.yarnpkg.com/open/-/open-8.4.2.tgz#5b5ffe2a8f793dcd2aad73e550cb87b59cb084f9" @@ -8432,6 +10827,11 @@ optionator@^0.9.3: prelude-ls "^1.2.1" type-check "^0.4.0" +options@>=0.0.5: + version "0.0.6" + resolved "https://registry.yarnpkg.com/options/-/options-0.0.6.tgz#ec22d312806bb53e731773e7cdaefcf1c643128f" + integrity sha512-bOj3L1ypm++N+n7CEbbe473A414AB7z+amKYshRb//iuL3MpdDCLhPnw6aVTdKB9g5ZRVHIEp8eUln6L2NUStg== + ora@5.3.0: version "5.3.0" resolved "https://registry.yarnpkg.com/ora/-/ora-5.3.0.tgz#fb832899d3a1372fe71c8b2c534bbfe74961bb6f" @@ -8446,6 +10846,18 @@ ora@5.3.0: strip-ansi "^6.0.0" wcwidth "^1.0.1" +ora@^3.4.0: + version "3.4.0" + resolved "https://registry.yarnpkg.com/ora/-/ora-3.4.0.tgz#bf0752491059a3ef3ed4c85097531de9fdbcd318" + integrity sha512-eNwHudNbO1folBP3JsZ19v9azXWtQZjICdr3Q0TDPIaeBQ3mXLrh54wM+er0+hSp+dWKf+Z8KM58CYzEyIYxYg== + dependencies: + chalk "^2.4.2" + cli-cursor "^2.1.0" + cli-spinners "^2.0.0" + log-symbols "^2.2.0" + strip-ansi "^5.2.0" + wcwidth "^1.0.1" + ora@^5.4.1: version "5.4.1" resolved "https://registry.yarnpkg.com/ora/-/ora-5.4.1.tgz#1b2678426af4ac4a509008e5e4ac9e9959db9e18" @@ -8466,7 +10878,7 @@ os-browserify@^0.3.0: resolved "https://registry.yarnpkg.com/os-browserify/-/os-browserify-0.3.0.tgz#854373c7f5c2315914fc9bfc6bd8238fdda1ec27" integrity sha512-gjcpUc3clBf9+210TRaDWbf+rZZZEshZ+DlXMRCeAjp0xhTrnQsKHypIy1J3d5hKdUzj69t708EHtU8P6bUn0A== -os-tmpdir@~1.0.2: +os-tmpdir@^1.0.0, os-tmpdir@~1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" integrity sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g== @@ -8488,7 +10900,7 @@ p-limit@^1.1.0: dependencies: p-try "^1.0.0" -p-limit@^2.2.0: +p-limit@^2.0.0, p-limit@^2.2.0: version "2.3.0" resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1" integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w== @@ -8509,6 +10921,13 @@ p-locate@^2.0.0: dependencies: p-limit "^1.1.0" +p-locate@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-3.0.0.tgz#322d69a05c0264b25997d9f40cd8a891ab0064a4" + integrity sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ== + dependencies: + p-limit "^2.0.0" + p-locate@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-4.1.0.tgz#a3428bb7088b3a60292f66919278b7c297ad4f07" @@ -8644,6 +11063,11 @@ parse-ms@^2.1.0: resolved "https://registry.yarnpkg.com/parse-ms/-/parse-ms-2.1.0.tgz#348565a753d4391fa524029956b172cb7753097d" integrity sha512-kHt7kzLoS9VBZfUsiKjv43mr91ea+U05EyKkEtqp7vNbHxmaVuEqN7XxeEVnGrMtYOAxGrDElSi96K7EgO1zCA== +parse-node-version@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/parse-node-version/-/parse-node-version-1.0.1.tgz#e2b5dbede00e7fa9bc363607f53327e8b073189b" + integrity sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA== + parse-path@^7.0.0: version "7.0.0" resolved "https://registry.yarnpkg.com/parse-path/-/parse-path-7.0.0.tgz#605a2d58d0a749c8594405d8cc3a2bf76d16099b" @@ -8670,6 +11094,11 @@ parseurl@~1.3.3: resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4" integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ== +pascalcase@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/pascalcase/-/pascalcase-0.1.1.tgz#b363e55e8006ca6fe21784d2db22bd15d7917f14" + integrity sha512-XHXfu/yOQRy9vYOtUDVMN60OEJjW013GoObG1o+xwQTpB9eYJX/BjXMsdW13ZDPruFhYYn0AG22w0xgQMwl3Nw== + path-exists@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" @@ -8685,7 +11114,7 @@ path-is-absolute@^1.0.0: resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== -path-key@^2.0.1: +path-key@^2.0.0, path-key@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40" integrity sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw== @@ -8863,6 +11292,18 @@ pirates@^4.0.4: resolved "https://registry.yarnpkg.com/pirates/-/pirates-4.0.5.tgz#feec352ea5c3268fb23a37c702ab1699f35a5f3b" integrity sha512-8V9+HQPupnaXMA23c5hvl69zXvTwTzyAYasnkb0Tts4XvO4CliqONMOnvlq26rkhLC3nWDFBJf73LU1e1VZLaQ== +pirates@^4.0.6: + version "4.0.6" + resolved "https://registry.yarnpkg.com/pirates/-/pirates-4.0.6.tgz#3018ae32ecfcff6c29ba2267cbf21166ac1f36b9" + integrity sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg== + +pkg-dir@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-3.0.0.tgz#2749020f239ed990881b1f71210d51eb6523bea3" + integrity sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw== + dependencies: + find-up "^3.0.0" + pkg-dir@^4.2.0: version "4.2.0" resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-4.2.0.tgz#f099133df7ede422e81d1d8448270eeb3e4261f3" @@ -8870,11 +11311,36 @@ pkg-dir@^4.2.0: dependencies: find-up "^4.0.0" +plist@^3.0.1, plist@^3.0.5: + version "3.1.0" + resolved "https://registry.yarnpkg.com/plist/-/plist-3.1.0.tgz#797a516a93e62f5bde55e0b9cc9c967f860893c9" + integrity sha512-uysumyrvkUX0rX/dEVqt8gC3sTBzd4zoWfLeS29nb53imdaXVvLINYXTI2GNqzaMuvacNx4uJQ8+b3zXR0pkgQ== + dependencies: + "@xmldom/xmldom" "^0.8.8" + base64-js "^1.5.1" + xmlbuilder "^15.1.1" + +plugin-error@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/plugin-error/-/plugin-error-0.1.2.tgz#3b9bb3335ccf00f425e07437e19276967da47ace" + integrity sha512-WzZHcm4+GO34sjFMxQMqZbsz3xiNEgonCskQ9v+IroMmYgk/tas8dG+Hr2D6IbRPybZ12oWpzE/w3cGJ6FJzOw== + dependencies: + ansi-cyan "^0.1.1" + ansi-red "^0.1.1" + arr-diff "^1.0.1" + arr-union "^2.0.1" + extend-shallow "^1.1.2" + pluralize@^8.0.0: version "8.0.0" resolved "https://registry.yarnpkg.com/pluralize/-/pluralize-8.0.0.tgz#1a6fa16a38d12a1901e0320fa017051c539ce3b1" integrity sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA== +posix-character-classes@^0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab" + integrity sha512-xTgYBc3fuo7Yt7JbiuFxSYGToMoz8fLoE6TC9Wx1P/u+LfeThMOAqmuyECnlBaaJb+u1m9hHiXUEtwW4OzfUJg== + possible-typed-array-names@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz#89bb63c6fada2c3e90adc4a647beeeb39cc7bf8f" @@ -8973,6 +11439,26 @@ pretty-bytes@^5.6.0: resolved "https://registry.yarnpkg.com/pretty-bytes/-/pretty-bytes-5.6.0.tgz#356256f643804773c82f64723fe78c92c62beaeb" integrity sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg== +pretty-format@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-24.9.0.tgz#12fac31b37019a4eea3c11aa9a959eb7628aa7c9" + integrity sha512-00ZMZUiHaJrNfk33guavqgvfJS30sLYf0f8+Srklv0AMPodGGHcoHgksZ3OThYnIvOd+8yMCn0YiEOogjlgsnA== + dependencies: + "@jest/types" "^24.9.0" + ansi-regex "^4.0.0" + ansi-styles "^3.2.0" + react-is "^16.8.4" + +pretty-format@^25.1.0, pretty-format@^25.2.0: + version "25.5.0" + resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-25.5.0.tgz#7873c1d774f682c34b8d48b6743a2bf2ac55791a" + integrity sha512-kbo/kq2LQ/A/is0PQwsEHM7Ca6//bGPPvU6UnsdDRSKTWxT/ru/xb88v4BJf6a69H+uTytOEsTusT9ksd/1iWQ== + dependencies: + "@jest/types" "^25.5.0" + ansi-regex "^5.0.0" + ansi-styles "^4.0.0" + react-is "^16.12.0" + pretty-format@^29.0.0, pretty-format@^29.7.0: version "29.7.0" resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-29.7.0.tgz#ca42c758310f365bfa71a0bda0a807160b776812" @@ -9040,6 +11526,20 @@ promise-retry@^2.0.1: err-code "^2.0.2" retry "^0.12.0" +promise@^7.1.1: + version "7.3.1" + resolved "https://registry.yarnpkg.com/promise/-/promise-7.3.1.tgz#064b72602b18f90f29192b8b1bc418ffd1ebd3bf" + integrity sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg== + dependencies: + asap "~2.0.3" + +promise@^8.0.3: + version "8.3.0" + resolved "https://registry.yarnpkg.com/promise/-/promise-8.3.0.tgz#8cb333d1edeb61ef23869fbb8a4ea0279ab60e0a" + integrity sha512-rZPNPKTOYVNEEKFaq1HqTgOwZD+4/YHS5ukLzQCypkj+OkYx7iv0mA91lJlpPPZ8vMau3IIGj5Qlwrx+8iiSmg== + dependencies: + asap "~2.0.6" + prompts@^2.0.1: version "2.4.2" resolved "https://registry.yarnpkg.com/prompts/-/prompts-2.4.2.tgz#7b57e73b3a48029ad10ebd44f74b01722a4cb069" @@ -9120,6 +11620,11 @@ ps-tree@1.2.0: dependencies: event-stream "=3.3.4" +pseudomap@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3" + integrity sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ== + psl@^1.1.33: version "1.9.0" resolved "https://registry.yarnpkg.com/psl/-/psl-1.9.0.tgz#d0df2a137f00794565fcaf3b2c00cd09f8d5a5a7" @@ -9230,6 +11735,14 @@ react-bootstrap@^2.7.0: uncontrollable "^7.2.1" warning "^4.0.3" +react-devtools-core@^4.6.0: + version "4.28.5" + resolved "https://registry.yarnpkg.com/react-devtools-core/-/react-devtools-core-4.28.5.tgz#c8442b91f068cdf0c899c543907f7f27d79c2508" + integrity sha512-cq/o30z9W2Wb4rzBefjv5fBalHU0rJGZCHAkf/RHSBWSSYwh8PlQTqqOJmgIIbBtpj27T6FIPXeomIjZtCNVqA== + dependencies: + shell-quote "^1.6.1" + ws "^7" + react-dom@^18.2.0: version "18.2.0" resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-18.2.0.tgz#22aaf38708db2674ed9ada224ca4aa708d821e3d" @@ -9259,7 +11772,7 @@ react-hook-form@^8.0.0-alpha.4: resolved "https://registry.yarnpkg.com/react-hook-form/-/react-hook-form-8.0.0-alpha.4.tgz#b5c41db3ce4cc74c7190d10ff9bbe9e1c2c3536d" integrity sha512-r2PCeSdG+vguXNScBYx2nQoo8xXf34WCXTx5AR+sfcRRzLJ4DAUUghEIbg2KMS32RZ4Nl9678VilHLC4Jq0tFQ== -react-is@^16.13.1, react-is@^16.3.2, react-is@^16.7.0: +react-is@^16.12.0, react-is@^16.13.1, react-is@^16.3.2, react-is@^16.7.0, react-is@^16.8.4: version "16.13.1" resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4" integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== @@ -9274,6 +11787,39 @@ react-lifecycles-compat@^3.0.4: resolved "https://registry.yarnpkg.com/react-lifecycles-compat/-/react-lifecycles-compat-3.0.4.tgz#4f1a273afdfc8f3488a8c516bfda78f872352362" integrity sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA== +react-native@^0.63.0: + version "0.63.5" + resolved "https://registry.yarnpkg.com/react-native/-/react-native-0.63.5.tgz#2c0d5dca527fb69bb481e89b2c86068f2641b62d" + integrity sha512-unjHZOcHek2xxPkBbyqGO//2Z/AriKTwtDzGTT/ujGMRE3odDJk8wKtZregurQ9cpTUtu1Bj5R5bJv3gQIG5zw== + dependencies: + "@babel/runtime" "^7.0.0" + "@react-native-community/cli" "^4.10.0" + "@react-native-community/cli-platform-android" "^4.10.0" + "@react-native-community/cli-platform-ios" "^4.10.0" + abort-controller "^3.0.0" + anser "^1.4.9" + base64-js "^1.1.2" + event-target-shim "^5.0.1" + fbjs "^1.0.0" + fbjs-scripts "^1.1.0" + hermes-engine "~0.5.0" + invariant "^2.2.4" + jsc-android "^245459.0.0" + metro-babel-register "0.59.0" + metro-react-native-babel-transformer "0.59.0" + metro-source-map "0.59.0" + nullthrows "^1.1.1" + pretty-format "^24.9.0" + promise "^8.0.3" + prop-types "^15.7.2" + react-devtools-core "^4.6.0" + react-refresh "^0.4.0" + regenerator-runtime "^0.13.2" + scheduler "0.19.1" + stacktrace-parser "^0.1.3" + use-subscription "^1.0.0" + whatwg-fetch "^3.0.0" + react-redux@^8.0.5: version "8.1.3" resolved "https://registry.yarnpkg.com/react-redux/-/react-redux-8.1.3.tgz#4fdc0462d0acb59af29a13c27ffef6f49ab4df46" @@ -9291,6 +11837,11 @@ react-refresh@^0.14.2: resolved "https://registry.yarnpkg.com/react-refresh/-/react-refresh-0.14.2.tgz#3833da01ce32da470f1f936b9d477da5c7028bf9" integrity sha512-jCvmsr+1IUSMUyzOkRcvnVbX3ZYC6g9TDrDbFuFmRDq7PD4yaGbLKNQL6k2jnArV8hjYxh7hVhAZB6s9HDGpZA== +react-refresh@^0.4.0: + version "0.4.3" + resolved "https://registry.yarnpkg.com/react-refresh/-/react-refresh-0.4.3.tgz#966f1750c191672e76e16c2efa569150cc73ab53" + integrity sha512-Hwln1VNuGl/6bVwnd0Xdn1e84gT/8T9aYNL+HAKDArLCS7LWjwr7StE30IEYbIkx0Vi3vs+coQxe+SQDbGbbpA== + react-router-bootstrap@^0.26.2: version "0.26.2" resolved "https://registry.yarnpkg.com/react-router-bootstrap/-/react-router-bootstrap-0.26.2.tgz#255ffb662b77141624d89d97105ba4f93863e664" @@ -9323,6 +11874,14 @@ react-transition-group@^4.4.5: loose-envify "^1.4.0" prop-types "^15.6.2" +react@^17.0.0: + version "17.0.2" + resolved "https://registry.yarnpkg.com/react/-/react-17.0.2.tgz#d0b5cc516d29eb3eee383f75b62864cfb6800037" + integrity sha512-gnhPt75i/dq/z3/6q/0asP78D0u592D5L1pd7M8P+dck6Fu/jJeL6iVVK23fptSUZj8Vjf++7wXA8UNclGQcbA== + dependencies: + loose-envify "^1.1.0" + object-assign "^4.1.1" + react@^18.2.0: version "18.2.0" resolved "https://registry.yarnpkg.com/react/-/react-18.2.0.tgz#555bd98592883255fa00de14f1151a917b5d77d5" @@ -9386,16 +11945,7 @@ read@^3.0.1: dependencies: mute-stream "^1.0.0" -readable-stream@^3.0.0, readable-stream@^3.0.2, readable-stream@^3.1.1, readable-stream@^3.4.0, readable-stream@^3.6.0: - version "3.6.2" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.2.tgz#56a9b36ea965c00c5a93ef31eb111a0f11056967" - integrity sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA== - dependencies: - inherits "^2.0.3" - string_decoder "^1.1.1" - util-deprecate "^1.0.1" - -readable-stream@~2.3.6: +readable-stream@^2.0.1, readable-stream@^2.2.2, readable-stream@~2.3.6: version "2.3.8" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.8.tgz#91125e8042bba1b9887f49345f6277027ce8be9b" integrity sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA== @@ -9408,6 +11958,15 @@ readable-stream@~2.3.6: string_decoder "~1.1.1" util-deprecate "~1.0.1" +readable-stream@^3.0.0, readable-stream@^3.0.2, readable-stream@^3.1.1, readable-stream@^3.4.0, readable-stream@^3.6.0: + version "3.6.2" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.2.tgz#56a9b36ea965c00c5a93ef31eb111a0f11056967" + integrity sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA== + dependencies: + inherits "^2.0.3" + string_decoder "^1.1.1" + util-deprecate "^1.0.1" + readdirp@~3.6.0: version "3.6.0" resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7" @@ -9459,11 +12018,43 @@ reflect.getprototypeof@^1.0.4: globalthis "^1.0.3" which-builtin-type "^1.1.3" +regenerate-unicode-properties@^10.2.0: + version "10.2.0" + resolved "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-10.2.0.tgz#626e39df8c372338ea9b8028d1f99dc3fd9c3db0" + integrity sha512-DqHn3DwbmmPVzeKj9woBadqmXxLvQoQIwu7nopMc72ztvxVmVk2SBhSnx67zuye5TP+lJsb/TBQsjLKhnDf3MA== + dependencies: + regenerate "^1.4.2" + +regenerate@^1.4.2: + version "1.4.2" + resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.4.2.tgz#b9346d8827e8f5a32f7ba29637d398b69014848a" + integrity sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A== + +regenerator-runtime@^0.13.2: + version "0.13.11" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz#f6dca3e7ceec20590d07ada785636a90cdca17f9" + integrity sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg== + regenerator-runtime@^0.14.0: version "0.14.0" resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.14.0.tgz#5e19d68eb12d486f797e15a3c6a918f7cec5eb45" integrity sha512-srw17NI0TUWHuGa5CFGGmhfNIeja30WMBfbslPNhf6JrqQlLN5gcrvig1oqPxiVaXb0oW0XRKtH6Nngs5lKCIA== +regenerator-transform@^0.15.2: + version "0.15.2" + resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.15.2.tgz#5bbae58b522098ebdf09bca2f83838929001c7a4" + integrity sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg== + dependencies: + "@babel/runtime" "^7.8.4" + +regex-not@^1.0.0, regex-not@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/regex-not/-/regex-not-1.0.2.tgz#1f4ece27e00b0b65e0247a6810e6a85d83a5752c" + integrity sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A== + dependencies: + extend-shallow "^3.0.2" + safe-regex "^1.1.0" + regexp.prototype.flags@^1.4.3, regexp.prototype.flags@^1.5.2: version "1.5.2" resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.5.2.tgz#138f644a3350f981a858c44f6bb1a61ff59be334" @@ -9474,6 +12065,45 @@ regexp.prototype.flags@^1.4.3, regexp.prototype.flags@^1.5.2: es-errors "^1.3.0" set-function-name "^2.0.1" +regexpu-core@^6.2.0: + version "6.2.0" + resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-6.2.0.tgz#0e5190d79e542bf294955dccabae04d3c7d53826" + integrity sha512-H66BPQMrv+V16t8xtmq+UC0CBpiTBA60V8ibS1QVReIp8T1z8hwFxqcGzm9K6lgsN7sB5edVH8a+ze6Fqm4weA== + dependencies: + regenerate "^1.4.2" + regenerate-unicode-properties "^10.2.0" + regjsgen "^0.8.0" + regjsparser "^0.12.0" + unicode-match-property-ecmascript "^2.0.0" + unicode-match-property-value-ecmascript "^2.1.0" + +regjsgen@^0.8.0: + version "0.8.0" + resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.8.0.tgz#df23ff26e0c5b300a6470cad160a9d090c3a37ab" + integrity sha512-RvwtGe3d7LvWiDQXeQw8p5asZUmfU1G/l6WbUXeHta7Y2PEIvBTwH6E2EfmYUK8pxcxEdEmaomqyp0vZZ7C+3Q== + +regjsparser@^0.12.0: + version "0.12.0" + resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.12.0.tgz#0e846df6c6530586429377de56e0475583b088dc" + integrity sha512-cnE+y8bz4NhMjISKbgeVJtqNbtf5QpjZP+Bslo+UqkIt9QPnX9q095eiRRASJG1/tz6dlNr6Z5NsBiWYokp6EQ== + dependencies: + jsesc "~3.0.2" + +remove-trailing-separator@^1.0.1: + version "1.1.0" + resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz#c24bce2a283adad5bc3f58e0d48249b92379d8ef" + integrity sha512-/hS+Y0u3aOfIETiaiirUFwDBDzmXPvO+jAfKTitUngIPzdKc6Z0LoFjM/CK5PL4C+eKwHohlHAb6H0VFfmmUsw== + +repeat-element@^1.1.2: + version "1.1.4" + resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.4.tgz#be681520847ab58c7568ac75fbfad28ed42d39e9" + integrity sha512-LFiNfRcSu7KK3evMyYOuCzv3L10TW7yC1G2/+StMjK8Y6Vqd2MG7r/Qjw4ghtuCOjFvlnms/iMmLqpvW/ES/WQ== + +repeat-string@^1.6.1: + version "1.6.1" + resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" + integrity sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w== + request-progress@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/request-progress/-/request-progress-3.0.0.tgz#4ca754081c7fec63f505e4faa825aa06cd669dbe" @@ -9495,6 +12125,11 @@ require-in-the-middle@^7.1.1: module-details-from-path "^1.0.3" resolve "^1.22.1" +require-main-filename@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-2.0.0.tgz#d0b329ecc7cc0f61649f62215be69af54aa8989b" + integrity sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg== + requirejs-config-file@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/requirejs-config-file/-/requirejs-config-file-4.0.0.tgz#4244da5dd1f59874038cc1091d078d620abb6ebc" @@ -9535,11 +12170,21 @@ resolve-from@5.0.0, resolve-from@^5.0.0: resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-5.0.0.tgz#c35225843df8f776df21c57557bc087e9dfdfc69" integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw== +resolve-from@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-3.0.0.tgz#b22c7af7d9d6881bc8b6e653335eebcb0a188748" + integrity sha512-GnlH6vxLymXJNMBo7XP1fJIzBFbdYt49CuTwmB/6N53t+kMPRMFKz783LlQ4tv28XoQfMWinAJX6WCGf2IlaIw== + resolve-from@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== +resolve-url@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a" + integrity sha512-ZuF55hVUQaaczgOIwqWzkEcEidmlD/xl44x1UZnhOXcYuFN2S6+rcxpG+C1N3So0wvNI3DmJICUFfu2SxhBmvg== + resolve.exports@^2.0.0: version "2.0.2" resolved "https://registry.yarnpkg.com/resolve.exports/-/resolve.exports-2.0.2.tgz#f8c934b8e6a13f539e38b7098e2e36134f01e800" @@ -9554,6 +12199,15 @@ resolve@^1.10.0, resolve@^1.20.0, resolve@^1.22.1, resolve@^1.22.3, resolve@^1.2 path-parse "^1.0.7" supports-preserve-symlinks-flag "^1.0.0" +resolve@^1.14.2, resolve@^1.5.0: + version "1.22.10" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.10.tgz#b663e83ffb09bbf2386944736baae803029b8b39" + integrity sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w== + dependencies: + is-core-module "^2.16.0" + path-parse "^1.0.7" + supports-preserve-symlinks-flag "^1.0.0" + resolve@^2.0.0-next.4: version "2.0.0-next.4" resolved "https://registry.yarnpkg.com/resolve/-/resolve-2.0.0-next.4.tgz#3d37a113d6429f496ec4752d2a2e58efb1fd4660" @@ -9563,6 +12217,14 @@ resolve@^2.0.0-next.4: path-parse "^1.0.7" supports-preserve-symlinks-flag "^1.0.0" +restore-cursor@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-2.0.0.tgz#9f7ee287f82fd326d4fd162923d62129eee0dfaf" + integrity sha512-6IzJLuGi4+R14vwagDHX+JrXmPVtPpn4mffDJ1UdR7/Edm87fl6yi8mMBIVvFtJaNTUvjughmW4hwLhRG7gC1Q== + dependencies: + onetime "^2.0.0" + signal-exit "^3.0.2" + restore-cursor@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-3.1.0.tgz#39f67c54b3a7a58cea5236d95cf0034239631f7e" @@ -9571,6 +12233,11 @@ restore-cursor@^3.1.0: onetime "^5.1.0" signal-exit "^3.0.2" +ret@~0.1.10: + version "0.1.15" + resolved "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc" + integrity sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg== + retry-as-promised@^7.0.4: version "7.0.4" resolved "https://registry.yarnpkg.com/retry-as-promised/-/retry-as-promised-7.0.4.tgz#9df73adaeea08cb2948b9d34990549dc13d800a2" @@ -9591,6 +12258,13 @@ rfdc@^1.3.0: resolved "https://registry.yarnpkg.com/rfdc/-/rfdc-1.3.0.tgz#d0b7c441ab2720d05dc4cf26e01c89631d9da08b" integrity sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA== +rimraf@^2.5.4: + version "2.7.1" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec" + integrity sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w== + dependencies: + glob "^7.1.3" + rimraf@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" @@ -9613,6 +12287,11 @@ rimraf@^6.0.1: glob "^11.0.0" package-json-from-dist "^1.0.0" +rimraf@~2.2.6: + version "2.2.8" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.2.8.tgz#e439be2aaee327321952730f99a8929e4fc50582" + integrity sha512-R5KMKHnPAQaZMqLOsyuyUmcIjSeDm+73eoqQpaXA7AZ22BL+6C+1mcUscgOsNd8WVlJuvlgAPsegcx7pjlV0Dg== + rollup@^3.27.1: version "3.29.5" resolved "https://registry.yarnpkg.com/rollup/-/rollup-3.29.5.tgz#8a2e477a758b520fb78daf04bca4c522c1da8a54" @@ -9645,7 +12324,12 @@ rollup@^4.0.2: "@rollup/rollup-win32-x64-msvc" "4.23.0" fsevents "~2.3.2" -run-async@^2.4.0: +rsvp@^4.8.4: + version "4.8.5" + resolved "https://registry.yarnpkg.com/rsvp/-/rsvp-4.8.5.tgz#c8f155311d167f68f21e168df71ec5b083113734" + integrity sha512-nfMOlASu9OnRJo1mbEk2cz0D56a1MBNrJ7orjRZQG10XDyuvwksKbuXNp6qa+kbn839HwjwhBzhFmdsaEAfauA== + +run-async@^2.2.0, run-async@^2.4.0: version "2.4.1" resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.4.1.tgz#8440eccf99ea3e70bd409d49aab88e10c189a455" integrity sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ== @@ -9667,6 +12351,18 @@ run-parallel@^1.1.9: dependencies: queue-microtask "^1.2.2" +rx-lite-aggregates@^4.0.8: + version "4.0.8" + resolved "https://registry.yarnpkg.com/rx-lite-aggregates/-/rx-lite-aggregates-4.0.8.tgz#753b87a89a11c95467c4ac1626c4efc4e05c67be" + integrity sha512-3xPNZGW93oCjiO7PtKxRK6iOVYBWBvtf9QHDfU23Oc+dLIQmAV//UnyXV/yihv81VS/UqoQPk4NegS8EFi55Hg== + dependencies: + rx-lite "*" + +rx-lite@*, rx-lite@^4.0.8: + version "4.0.8" + resolved "https://registry.yarnpkg.com/rx-lite/-/rx-lite-4.0.8.tgz#0b1e11af8bc44836f04a6407e92da42467b79444" + integrity sha512-Cun9QucwK6MIrp3mry/Y7hqD1oFqTYLQ4pGxaHTjIdaFDWRGGLikqp6u8LcWJnzpoALg9hap+JGk8sFIUuEGNA== + rxjs@^7.5.1, rxjs@^7.5.5, rxjs@^7.5.7, rxjs@^7.8.1: version "7.8.1" resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-7.8.1.tgz#6f6f3d99ea8044291efd92e7c7fcf562c4057543" @@ -9703,6 +12399,13 @@ safe-regex-test@^1.0.3: es-errors "^1.3.0" is-regex "^1.1.4" +safe-regex@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/safe-regex/-/safe-regex-1.1.0.tgz#40a3669f3b077d1e943d44629e157dd48023bf2e" + integrity sha512-aJXcif4xnaNUzvUuC5gcb46oTS7zvg4jpMTnuqtrEPlR3vFr4pxtdTwaF1Qs3Enjn9HK+ZlwQui+a7z0SywIzg== + dependencies: + ret "~0.1.10" + safe-stable-stringify@^2.3.1: version "2.4.2" resolved "https://registry.yarnpkg.com/safe-stable-stringify/-/safe-stable-stringify-2.4.2.tgz#ec7b037768098bf65310d1d64370de0dc02353aa" @@ -9713,6 +12416,21 @@ safe-stable-stringify@^2.3.1: resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== +sane@^4.0.3: + version "4.1.0" + resolved "https://registry.yarnpkg.com/sane/-/sane-4.1.0.tgz#ed881fd922733a6c461bc189dc2b6c006f3ffded" + integrity sha512-hhbzAgTIX8O7SHfp2c8/kREfEn4qO/9q8C9beyY6+tvZ87EpoZ3i1RIEvp27YBswnNbY9mWd6paKVmKbAgLfZA== + dependencies: + "@cnakazawa/watch" "^1.0.3" + anymatch "^2.0.0" + capture-exit "^2.0.0" + exec-sh "^0.3.2" + execa "^1.0.0" + fb-watchman "^2.0.0" + micromatch "^3.1.4" + minimist "^1.1.1" + walker "~1.0.5" + sass-lookup@^5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/sass-lookup/-/sass-lookup-5.0.1.tgz#1f01d7ff21e09d8c9dcf8d05b3fca28f2f96e6ed" @@ -9729,6 +12447,11 @@ sass@^1.57.1: immutable "^4.0.0" source-map-js ">=0.6.2 <2.0.0" +sax@^1.2.4: + version "1.4.1" + resolved "https://registry.yarnpkg.com/sax/-/sax-1.4.1.tgz#44cc8988377f126304d3b3fc1010c733b929ef0f" + integrity sha512-+aWOz7yVScEGoKNd4PA10LZ8sk0A/z5+nXQG5giUO5rprX9jgYsTdov9qCchZiPIZezbZH+jRut8nPodFAX4Jg== + saxes@^6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/saxes/-/saxes-6.0.0.tgz#fe5b4a4768df4f14a201b1ba6a65c1f3d9988cc5" @@ -9736,6 +12459,14 @@ saxes@^6.0.0: dependencies: xmlchars "^2.2.0" +scheduler@0.19.1: + version "0.19.1" + resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.19.1.tgz#4f3e2ed2c1a7d65681f4c854fa8c5a1ccb40f196" + integrity sha512-n/zwRWRYSUj0/3g/otKDRPMh6qv2SYMWNq85IEa8iZyAv8od9zDYpGSnpBEjNgcMNq6Scbu5KfIPxNF72R/2EA== + dependencies: + loose-envify "^1.1.0" + object-assign "^4.1.1" + scheduler@^0.23.0: version "0.23.0" resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.23.0.tgz#ba8041afc3d30eb206a487b6b384002e4e61fdfe" @@ -9743,7 +12474,7 @@ scheduler@^0.23.0: dependencies: loose-envify "^1.1.0" -"semver@2 || 3 || 4 || 5", semver@^5.5.0, semver@^5.6.0: +"semver@2 || 3 || 4 || 5", semver@^5.1.0, semver@^5.5.0, semver@^5.6.0: version "5.7.2" resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.2.tgz#48d55db737c3287cd4835e17fa13feace1c41ef8" integrity sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g== @@ -9804,6 +12535,11 @@ sequelize@^6.32.1: validator "^13.9.0" wkx "^0.5.0" +serialize-error@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/serialize-error/-/serialize-error-2.1.0.tgz#50b679d5635cdf84667bdc8e59af4e5b81d5f60a" + integrity sha512-ghgmKt5o4Tly5yEG/UJp8qTd0AN7Xalw4XBtDEKP655B699qMEtra1WlXeE6WIvdEG481JvRxULKsInq/iNysw== + serialize-javascript@^6.0.1: version "6.0.2" resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-6.0.2.tgz#defa1e055c83bf6d59ea805d8da862254eb6a6c2" @@ -9811,7 +12547,7 @@ serialize-javascript@^6.0.1: dependencies: randombytes "^2.1.0" -serve-static@1.16.2, serve-static@^1.15.0: +serve-static@1.16.2, serve-static@^1.13.1, serve-static@^1.15.0: version "1.16.2" resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.16.2.tgz#b6a5343da47f6bdd2673848bf45754941e803296" integrity sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw== @@ -9838,6 +12574,18 @@ set-function-length@^1.2.1: gopd "^1.0.1" has-property-descriptors "^1.0.1" +set-function-length@^1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/set-function-length/-/set-function-length-1.2.2.tgz#aac72314198eaed975cf77b2c3b6b880695e5449" + integrity sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg== + dependencies: + define-data-property "^1.1.4" + es-errors "^1.3.0" + function-bind "^1.1.2" + get-intrinsic "^1.2.4" + gopd "^1.0.1" + has-property-descriptors "^1.0.2" + set-function-name@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/set-function-name/-/set-function-name-2.0.1.tgz#12ce38b7954310b9f61faa12701620a0c882793a" @@ -9847,6 +12595,21 @@ set-function-name@^2.0.1: functions-have-names "^1.2.3" has-property-descriptors "^1.0.0" +set-value@^2.0.0, set-value@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/set-value/-/set-value-2.0.1.tgz#a18d40530e6f07de4228c7defe4227af8cad005b" + integrity sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw== + dependencies: + extend-shallow "^2.0.1" + is-extendable "^0.1.1" + is-plain-object "^2.0.3" + split-string "^3.0.1" + +setimmediate@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285" + integrity sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA== + setprototypeof@1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.2.0.tgz#66c9a24a73f9fc28cbe66b09fed3d33dcaf1b424" @@ -9888,6 +12651,16 @@ shebang-regex@^3.0.0: resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== +shell-quote@1.6.1: + version "1.6.1" + resolved "https://registry.yarnpkg.com/shell-quote/-/shell-quote-1.6.1.tgz#f4781949cce402697127430ea3b3c5476f481767" + integrity sha512-V0iQEZ/uoem3NmD91rD8XiuozJnq9/ZJnbHVXHnWqP1ucAhS3yJ7sLIIzEi57wFFcK3oi3kFUC46uSyWr35mxg== + dependencies: + array-filter "~0.0.0" + array-map "~0.0.0" + array-reduce "~0.0.0" + jsonify "~0.0.0" + shell-quote@^1.6.1: version "1.7.4" resolved "https://registry.yarnpkg.com/shell-quote/-/shell-quote-1.7.4.tgz#33fe15dee71ab2a81fcbd3a52106c5cfb9fb75d8" @@ -9930,6 +12703,15 @@ sigstore@^2.2.0: "@sigstore/tuf" "^2.3.4" "@sigstore/verify" "^1.2.1" +simple-plist@^1.0.0: + version "1.3.1" + resolved "https://registry.yarnpkg.com/simple-plist/-/simple-plist-1.3.1.tgz#16e1d8f62c6c9b691b8383127663d834112fb017" + integrity sha512-iMSw5i0XseMnrhtIzRb7XpQEXepa9xhWxGUojHBL43SIpQuDQkh3Wpy67ZbDzZVr6EKxvwVChnVpdl8hEVLDiw== + dependencies: + bplist-creator "0.1.0" + bplist-parser "0.3.1" + plist "^3.0.5" + simple-swizzle@^0.2.2: version "0.2.2" resolved "https://registry.yarnpkg.com/simple-swizzle/-/simple-swizzle-0.2.2.tgz#a4da6b635ffcccca33f70d17cb92592de95e557a" @@ -9954,6 +12736,20 @@ slash@3.0.0, slash@^3.0.0: resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== +slash@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/slash/-/slash-2.0.0.tgz#de552851a1759df3a8f206535442f5ec4ddeab44" + integrity sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A== + +slice-ansi@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-2.1.0.tgz#cacd7693461a637a5788d92a7dd4fba068e81636" + integrity sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ== + dependencies: + ansi-styles "^3.2.0" + astral-regex "^1.0.0" + is-fullwidth-code-point "^2.0.0" + slice-ansi@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-3.0.0.tgz#31ddc10930a1b7e0b67b08c96c2f49b77a789787" @@ -9995,6 +12791,36 @@ smol-toml@~1.3.0: resolved "https://registry.yarnpkg.com/smol-toml/-/smol-toml-1.3.1.tgz#d9084a9e212142e3cab27ef4e2b8e8ba620bfe15" integrity sha512-tEYNll18pPKHroYSmLLrksq233j021G0giwW7P3D24jC54pQ5W5BXMsQ/Mvw1OJCmEYDgY+lrzT+3nNUtoNfXQ== +snapdragon-node@^2.0.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/snapdragon-node/-/snapdragon-node-2.1.1.tgz#6c175f86ff14bdb0724563e8f3c1b021a286853b" + integrity sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw== + dependencies: + define-property "^1.0.0" + isobject "^3.0.0" + snapdragon-util "^3.0.1" + +snapdragon-util@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/snapdragon-util/-/snapdragon-util-3.0.1.tgz#f956479486f2acd79700693f6f7b805e45ab56e2" + integrity sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ== + dependencies: + kind-of "^3.2.0" + +snapdragon@^0.8.1: + version "0.8.2" + resolved "https://registry.yarnpkg.com/snapdragon/-/snapdragon-0.8.2.tgz#64922e7c565b0e14204ba1aa7d6964278d25182d" + integrity sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg== + dependencies: + base "^0.11.1" + debug "^2.2.0" + define-property "^0.2.5" + extend-shallow "^2.0.1" + map-cache "^0.2.2" + source-map "^0.5.6" + source-map-resolve "^0.5.0" + use "^3.1.0" + socks-proxy-agent@^8.0.3: version "8.0.4" resolved "https://registry.yarnpkg.com/socks-proxy-agent/-/socks-proxy-agent-8.0.4.tgz#9071dca17af95f483300316f4b063578fa0db08c" @@ -10024,6 +12850,17 @@ sort-keys@^2.0.0: resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.2.0.tgz#16b809c162517b5b8c3e7dcd315a2a5c2612b2af" integrity sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg== +source-map-resolve@^0.5.0: + version "0.5.3" + resolved "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.5.3.tgz#190866bece7553e1f8f267a2ee82c606b5509a1a" + integrity sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw== + dependencies: + atob "^2.1.2" + decode-uri-component "^0.2.0" + resolve-url "^0.2.1" + source-map-url "^0.4.0" + urix "^0.1.0" + source-map-support@0.5.13: version "0.5.13" resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.13.tgz#31b24a9c2e73c2de85066c0feb7d44767ed52932" @@ -10032,7 +12869,7 @@ source-map-support@0.5.13: buffer-from "^1.0.0" source-map "^0.6.0" -source-map-support@~0.5.20: +source-map-support@^0.5.16, source-map-support@~0.5.20: version "0.5.21" resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.21.tgz#04fe7c7f9e1ed2d662233c28cb2b35b9f63f6e4f" integrity sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w== @@ -10040,11 +12877,26 @@ source-map-support@~0.5.20: buffer-from "^1.0.0" source-map "^0.6.0" +source-map-url@^0.4.0: + version "0.4.1" + resolved "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.4.1.tgz#0af66605a745a5a2f91cf1bbf8a7afbc283dec56" + integrity sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw== + +source-map@^0.5.6: + version "0.5.7" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" + integrity sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ== + source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.1: version "0.6.1" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== +source-map@^0.7.3: + version "0.7.4" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.7.4.tgz#a9bbe705c9d8846f4e08ff6765acf0f1b0898656" + integrity sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA== + spdx-correct@^3.0.0: version "3.1.1" resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.1.1.tgz#dece81ac9c1e6713e5f7d1b6f17d468fa53d89a9" @@ -10071,6 +12923,13 @@ spdx-license-ids@^3.0.0: resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.12.tgz#69077835abe2710b65f03969898b6637b505a779" integrity sha512-rr+VVSXtRhO4OHbXUiAF7xW3Bo9DuuF6C5jH+q/x15j2jniycgKbxU09Hr0WqlSLUs4i4ltHGXqTe7VHclYWyA== +split-string@^3.0.1, split-string@^3.0.2: + version "3.1.0" + resolved "https://registry.yarnpkg.com/split-string/-/split-string-3.1.0.tgz#7cb09dda3a86585705c64b39a6466038682e8fe2" + integrity sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw== + dependencies: + extend-shallow "^3.0.0" + split2@^3.2.2: version "3.2.2" resolved "https://registry.yarnpkg.com/split2/-/split2-3.2.2.tgz#bf2cf2a37d838312c249c89206fd7a17dd12365f" @@ -10134,6 +12993,13 @@ stack-trace@0.0.x: resolved "https://registry.yarnpkg.com/stack-trace/-/stack-trace-0.0.10.tgz#547c70b347e8d32b4e108ea1a2a159e5fdde19c0" integrity sha512-KGzahc7puUKkzyMt+IqAep+TVNbKP+k2Lmwhub39m1AsTSkaDutx56aDCo+HLDzf/D26BIHTJWNiTG1KAJiQCg== +stack-utils@^1.0.1: + version "1.0.5" + resolved "https://registry.yarnpkg.com/stack-utils/-/stack-utils-1.0.5.tgz#a19b0b01947e0029c8e451d5d61a498f5bb1471b" + integrity sha512-KZiTzuV3CnSnSvgMRrARVCj+Ht7rMbauGDK0LdVFRGyenwdylpajAp4Q0i6SX8rEmbTpMMf6ryq2gb8pPq2WgQ== + dependencies: + escape-string-regexp "^2.0.0" + stack-utils@^2.0.3: version "2.0.6" resolved "https://registry.yarnpkg.com/stack-utils/-/stack-utils-2.0.6.tgz#aaf0748169c02fc33c8232abccf933f54a1cc34f" @@ -10141,6 +13007,18 @@ stack-utils@^2.0.3: dependencies: escape-string-regexp "^2.0.0" +stackframe@^1.3.4: + version "1.3.4" + resolved "https://registry.yarnpkg.com/stackframe/-/stackframe-1.3.4.tgz#b881a004c8c149a5e8efef37d51b16e412943310" + integrity sha512-oeVtt7eWQS+Na6F//S4kJ2K2VbRlS9D43mAlMyVpVWovy9o+jfgH8O9agzANzaiLjclA0oYzUXEM4PurhSUChw== + +stacktrace-parser@^0.1.3: + version "0.1.10" + resolved "https://registry.yarnpkg.com/stacktrace-parser/-/stacktrace-parser-0.1.10.tgz#29fb0cae4e0d0b85155879402857a1639eb6051a" + integrity sha512-KJP1OCML99+8fhOHxwwzyWrlUuVX5GQ0ZpJTd1DFXhdkrvg1szxfHhawXUZ3g9TkXORQd4/WG68jMlQZ2p8wlg== + dependencies: + type-fest "^0.7.1" + start-server-and-test@^2.0.1: version "2.0.8" resolved "https://registry.yarnpkg.com/start-server-and-test/-/start-server-and-test-2.0.8.tgz#0423ed00a7c052c4e74ff6bb0b90878bbd1d7cd9" @@ -10155,11 +13033,29 @@ start-server-and-test@^2.0.1: ps-tree "1.2.0" wait-on "8.0.1" +static-extend@^0.1.1: + version "0.1.2" + resolved "https://registry.yarnpkg.com/static-extend/-/static-extend-0.1.2.tgz#60809c39cbff55337226fd5e0b520f341f1fb5c6" + integrity sha512-72E9+uLc27Mt718pMHt9VMNiAL4LMsmDbBva8mxWUCkT07fSzEGMYUCk0XWY6lp0j6RBAG4cJ3mWuZv2OE3s0g== + dependencies: + define-property "^0.2.5" + object-copy "^0.1.0" + statuses@2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/statuses/-/statuses-2.0.1.tgz#55cb000ccf1d48728bd23c685a063998cf1a1b63" integrity sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ== +statuses@~1.5.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c" + integrity sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA== + +stream-buffers@2.2.x: + version "2.2.0" + resolved "https://registry.yarnpkg.com/stream-buffers/-/stream-buffers-2.2.0.tgz#91d5f5130d1cef96dcfa7f726945188741d09ee4" + integrity sha512-uyQK/mx5QjHun80FLJTfaWE7JtwfRMKBLkMne6udYOmvH0CawotVa7TfgYHzAnpphn4+TweIx1QKMnRIbipmUg== + stream-combiner@~0.0.4: version "0.0.4" resolved "https://registry.yarnpkg.com/stream-combiner/-/stream-combiner-0.0.4.tgz#4d5e433c185261dde623ca3f44c586bcf5c4ad14" @@ -10196,6 +13092,23 @@ string-length@^4.0.1: is-fullwidth-code-point "^3.0.0" strip-ansi "^6.0.1" +string-width@^2.1.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" + integrity sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw== + dependencies: + is-fullwidth-code-point "^2.0.0" + strip-ansi "^4.0.0" + +string-width@^3.0.0, string-width@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-3.1.0.tgz#22767be21b62af1081574306f69ac51b62203961" + integrity sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w== + dependencies: + emoji-regex "^7.0.1" + is-fullwidth-code-point "^2.0.0" + strip-ansi "^5.1.0" + string-width@^5.0.0, string-width@^5.0.1, string-width@^5.1.2: version "5.1.2" resolved "https://registry.yarnpkg.com/string-width/-/string-width-5.1.2.tgz#14f8daec6d81e7221d2a357e668cab73bdbca794" @@ -10285,6 +13198,20 @@ stringify-object@^3.2.1: dependencies: ansi-regex "^5.0.1" +strip-ansi@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f" + integrity sha512-4XaJ2zQdCzROZDivEVIDPkcQn8LMFSa8kj8Gxb/Lnwzv9A8VctNZ+lfivC/sV3ivW8ElJTERXZoPBRrZKkNKow== + dependencies: + ansi-regex "^3.0.0" + +strip-ansi@^5.0.0, strip-ansi@^5.1.0, strip-ansi@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-5.2.0.tgz#8c9a536feb6afc962bdfa5b104a5091c1ad9c0ae" + integrity sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA== + dependencies: + ansi-regex "^4.1.0" + strip-ansi@^7.0.1: version "7.0.1" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-7.0.1.tgz#61740a08ce36b61e50e65653f07060d000975fb2" @@ -10302,6 +13229,11 @@ strip-bom@^4.0.0: resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-4.0.0.tgz#9c3505c1db45bcedca3d9cf7a16f5c5aa3901878" integrity sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w== +strip-eof@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf" + integrity sha512-7FCwGGmx8mD5xQd3RPUvnSpUXHM3BWuzjtpD4TXsfcZ9EL4azvVVUscFYwD9nx8Kh+uCBC00XBtAykoMHwTh8Q== + strip-final-newline@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz#89b852fb2fcbe936f6f4b3187afb0a12c1ab58ad" @@ -10345,6 +13277,11 @@ stylus-lookup@^5.0.1: dependencies: commander "^10.0.1" +sudo-prompt@^9.0.0: + version "9.2.1" + resolved "https://registry.yarnpkg.com/sudo-prompt/-/sudo-prompt-9.2.1.tgz#77efb84309c9ca489527a4e749f287e6bdd52afd" + integrity sha512-Mu7R0g4ig9TUuGSxJavny5Rv0egCEtpZRNMrZaYS1vxkiIxGiGUwoezU3LazIQ+KE04hTrTfNPgxU5gzi7F5Pw== + supports-color@^5.3.0, supports-color@^5.5.0: version "5.5.0" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" @@ -10352,6 +13289,13 @@ supports-color@^5.3.0, supports-color@^5.5.0: dependencies: has-flag "^3.0.0" +supports-color@^6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-6.1.0.tgz#0764abc69c63d5ac842dd4867e8d025e880df8f3" + integrity sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ== + dependencies: + has-flag "^3.0.0" + supports-color@^7.1.0: version "7.2.0" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" @@ -10424,6 +13368,14 @@ temp-dir@1.0.0: resolved "https://registry.yarnpkg.com/temp-dir/-/temp-dir-1.0.0.tgz#0a7c0ea26d3a39afa7e0ebea9c1fc0bc4daa011d" integrity sha512-xZFXEGbG7SNC3itwBzI3RYjq/cEhBkx2hJuKGIUOcEULmkQExXiHat2z/qkISYsuR+IKumhEfKKbV5qXmhICFQ== +temp@0.8.3: + version "0.8.3" + resolved "https://registry.yarnpkg.com/temp/-/temp-0.8.3.tgz#e0c6bc4d26b903124410e4fed81103014dfc1f59" + integrity sha512-jtnWJs6B1cZlHs9wPG7BrowKxZw/rf6+UpGAkr8AaYmiTyTO7zQlLoST8zx/8TcUPnZmeBoB+H8ARuHZaSijVw== + dependencies: + os-tmpdir "^1.0.0" + rimraf "~2.2.6" + terser@^5.17.4: version "5.31.3" resolved "https://registry.yarnpkg.com/terser/-/terser-5.31.3.tgz#b24b7beb46062f4653f049eea4f0cd165d0f0c38" @@ -10458,12 +13410,17 @@ text-table@^0.2.0: resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" integrity sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw== +throat@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/throat/-/throat-4.1.0.tgz#89037cbc92c56ab18926e6ba4cbb200e15672a6a" + integrity sha512-wCVxLDcFxw7ujDxaeJC6nfl2XfHJNYs8yUYJnvMgtPEFlttP9tHSfRUv2vBe6C4hkVFPWoP1P6ZccbYjmSEkKA== + throttleit@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/throttleit/-/throttleit-1.0.1.tgz#304ec51631c3b770c65c6c6f76938b384000f4d5" integrity sha512-vDZpf9Chs9mAdfY046mcPt8fg5QSZr37hEH4TXYBnDF+izxgrbRGUAAaBvIk/fJm9aOFCGFd1EsNg5AZCbnQCQ== -through2@^2.0.0: +through2@^2.0.0, through2@^2.0.1: version "2.0.5" resolved "https://registry.yarnpkg.com/through2/-/through2-2.0.5.tgz#01c1e39eb31d07cb7d03a96a70823260b23132cd" integrity sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ== @@ -10476,6 +13433,11 @@ through@2, "through@>=2.2.7 <3", through@^2.3.4, through@^2.3.6, through@^2.3.8, resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" integrity sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg== +time-stamp@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/time-stamp/-/time-stamp-1.1.0.tgz#764a5a11af50561921b133f3b44e618687e0f5c3" + integrity sha512-gLCeArryy2yNTRzTGKbZbloctj64jkZ57hj5zdraXue6aFgd6PmvVtEyiUU+hvU0v7q08oVv8r8ev0tRo6bvgw== + tmp@^0.0.33: version "0.0.33" resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9" @@ -10493,6 +13455,21 @@ tmpl@1.0.5: resolved "https://registry.yarnpkg.com/tmpl/-/tmpl-1.0.5.tgz#8683e0b902bb9c20c4f726e3c0b69f36518c07cc" integrity sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw== +to-object-path@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/to-object-path/-/to-object-path-0.3.0.tgz#297588b7b0e7e0ac08e04e672f85c1f4999e17af" + integrity sha512-9mWHdnGRuh3onocaHzukyvCZhzvr6tiflAy/JRFXcJX0TjgfWA9pk9t8CMbzmBE4Jfw58pXbkngtBtqYxzNEyg== + dependencies: + kind-of "^3.0.2" + +to-regex-range@^2.1.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-2.1.1.tgz#7c80c17b9dfebe599e27367e0d4dd5590141db38" + integrity sha512-ZZWNfCjUokXXDGXFpZehJIkZqq91BcULFq/Pi7M5i4JnxXdhMKAK682z8bCW3o8Hj1wuuzoKcW3DfVzaP6VuNg== + dependencies: + is-number "^3.0.0" + repeat-string "^1.6.1" + to-regex-range@^5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" @@ -10500,6 +13477,16 @@ to-regex-range@^5.0.1: dependencies: is-number "^7.0.0" +to-regex@^3.0.1, to-regex@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/to-regex/-/to-regex-3.0.2.tgz#13cfdd9b336552f30b51f33a8ae1b42a7a7599ce" + integrity sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw== + dependencies: + define-property "^2.0.2" + extend-shallow "^3.0.2" + regex-not "^1.0.2" + safe-regex "^1.1.0" + toidentifier@1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.1.tgz#3be34321a88a820ed1bd80dfaa33e479fbb8dd35" @@ -10702,6 +13689,11 @@ type-fest@^0.6.0: resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.6.0.tgz#8d2a2370d3df886eb5c90ada1c5bf6188acf838b" integrity sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg== +type-fest@^0.7.1: + version "0.7.1" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.7.1.tgz#8dda65feaf03ed78f0a3f9678f1869147f7c5c48" + integrity sha512-Ne2YiiGN8bmrmJJEuTWTLJR32nh/JdL1+PSicowtNb0WFpn59GK8/lfD61bVtzguz7b3PBt74nxpv/Pw5po5Rg== + type-fest@^0.8.1: version "0.8.1" resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.8.1.tgz#09e249ebde851d3b1e48d27c105444667f17b83d" @@ -10793,6 +13785,11 @@ typescript@^4.9.4: resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.9.4.tgz#a2a3d2756c079abda241d75f149df9d561091e78" integrity sha512-Uz+dTXYzxXXbsFpM86Wh3dKCxrQqUcVMxwU54orwlJjOpO3ao8L7j5lH+dWfTwgCwIuM9GQ2kvVotzYJMXTBZg== +ua-parser-js@^0.7.18: + version "0.7.40" + resolved "https://registry.yarnpkg.com/ua-parser-js/-/ua-parser-js-0.7.40.tgz#c87d83b7bb25822ecfa6397a0da5903934ea1562" + integrity sha512-us1E3K+3jJppDBa3Tl0L3MOJiGhe1C6P0+nIvQAFYbxlMAx0h81eOwLmU57xgqToduDDPx3y5QsdjPfDu+FgOQ== + ua-parser-js@^1.0.32: version "1.0.39" resolved "https://registry.yarnpkg.com/ua-parser-js/-/ua-parser-js-1.0.39.tgz#bfc07f361549bf249bd8f4589a4cccec18fd2018" @@ -10808,11 +13805,24 @@ uc.micro@^2.0.0, uc.micro@^2.1.0: resolved "https://registry.yarnpkg.com/uc.micro/-/uc.micro-2.1.0.tgz#f8d3f7d0ec4c3dea35a7e3c8efa4cb8b45c9e7ee" integrity sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A== +uglify-es@^3.1.9: + version "3.3.9" + resolved "https://registry.yarnpkg.com/uglify-es/-/uglify-es-3.3.9.tgz#0c1c4f0700bed8dbc124cdb304d2592ca203e677" + integrity sha512-r+MU0rfv4L/0eeW3xZrd16t4NZfK8Ld4SWVglYBb7ez5uXFWHuVRs6xCTrf1yirs9a4j4Y27nn7SRfO6v67XsQ== + dependencies: + commander "~2.13.0" + source-map "~0.6.1" + uglify-js@^3.1.4: version "3.19.3" resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.19.3.tgz#82315e9bbc6f2b25888858acd1fff8441035b77f" integrity sha512-v3Xu+yuwBXisp6QYTcH4UbH+xYJXqnq2m/LtQVWKWzYc1iehYnLixoQDN9FH6/j9/oybfd6W9Ghwkl8+UMKTKQ== +ultron@1.0.x: + version "1.0.2" + resolved "https://registry.yarnpkg.com/ultron/-/ultron-1.0.2.tgz#ace116ab557cd197386a4e88f4685378c8b2e4fa" + integrity sha512-QMpnpVtYaWEeY+MwKDN/UdKlE/LsFZXM5lO1u7GaZzNgmIbGixHEmVMIKT+vqYOALu3m5GYQy9kz4Xu4IVn7Ow== + unbox-primitive@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/unbox-primitive/-/unbox-primitive-1.0.2.tgz#29032021057d5e6cdbd08c5129c226dff8ed6f9e" @@ -10853,6 +13863,39 @@ undici-types@~5.25.1: resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-5.25.3.tgz#e044115914c85f0bcbb229f346ab739f064998c3" integrity sha512-Ga1jfYwRn7+cP9v8auvEXN1rX3sWqlayd4HP7OKk4mZWylEmu3KzXDUGrQUN6Ol7qo1gPvB2e5gX6udnyEPgdA== +unicode-canonical-property-names-ecmascript@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.1.tgz#cb3173fe47ca743e228216e4a3ddc4c84d628cc2" + integrity sha512-dA8WbNeb2a6oQzAQ55YlT5vQAWGV9WXOsi3SskE3bcCdM0P4SDd+24zS/OCacdRq5BkdsRj9q3Pg6YyQoxIGqg== + +unicode-match-property-ecmascript@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz#54fd16e0ecb167cf04cf1f756bdcc92eba7976c3" + integrity sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q== + dependencies: + unicode-canonical-property-names-ecmascript "^2.0.0" + unicode-property-aliases-ecmascript "^2.0.0" + +unicode-match-property-value-ecmascript@^2.1.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.2.0.tgz#a0401aee72714598f739b68b104e4fe3a0cb3c71" + integrity sha512-4IehN3V/+kkr5YeSSDDQG8QLqO26XpL2XP3GQtqwlT/QYSECAwFztxVHjlbh0+gjJ3XmNLS0zDsbgs9jWKExLg== + +unicode-property-aliases-ecmascript@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz#43d41e3be698bd493ef911077c9b131f827e8ccd" + integrity sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w== + +union-value@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/union-value/-/union-value-1.0.1.tgz#0b6fe7b835aecda61c6ea4d4f02c14221e109847" + integrity sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg== + dependencies: + arr-union "^3.1.0" + get-value "^2.0.6" + is-extendable "^0.1.1" + set-value "^2.0.1" + unique-filename@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/unique-filename/-/unique-filename-3.0.0.tgz#48ba7a5a16849f5080d26c760c86cf5cf05770ea" @@ -10872,6 +13915,11 @@ universal-user-agent@^6.0.0: resolved "https://registry.yarnpkg.com/universal-user-agent/-/universal-user-agent-6.0.1.tgz#15f20f55da3c930c57bddbf1734c6654d5fd35aa" integrity sha512-yCzhz6FN2wU1NiiQRogkTQszlQSlpWaw8SvVegAc+bDxbzHgh1vX8uIe8OYyMH6DwH+sdTJsgMl36+mSMdRJIQ== +universalify@^0.1.0: + version "0.1.2" + resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66" + integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg== + universalify@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.2.0.tgz#6451760566fa857534745ab1dde952d1b1761be0" @@ -10887,6 +13935,14 @@ unpipe@1.0.0, unpipe@~1.0.0: resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" integrity sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ== +unset-value@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/unset-value/-/unset-value-1.0.0.tgz#8376873f7d2335179ffb1e6fc3a8ed0dfc8ab559" + integrity sha512-PcA2tsuGSF9cnySLHTLSh2qrQiJ70mn+r+Glzxv2TWZblxsxCC52BDlZoPCsz7STd9pN7EZetkWZBAvk4cgZdQ== + dependencies: + has-value "^0.3.1" + isobject "^3.0.0" + untildify@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/untildify/-/untildify-4.0.0.tgz#2bc947b953652487e4600949fb091e3ae8cd919b" @@ -10912,6 +13968,11 @@ uri-js@^4.2.2: dependencies: punycode "^2.1.0" +urix@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/urix/-/urix-0.1.0.tgz#da937f7a62e21fec1fd18d49b35c2935067a6c72" + integrity sha512-Am1ousAhSLBeB9cG/7k7r2R0zj50uDRlZHPGbazid5s9rlF1F/QKYObEKSIunSjIOkJZqwRRLpvewjEkM7pSqg== + url-parse@^1.5.3: version "1.5.10" resolved "https://registry.yarnpkg.com/url-parse/-/url-parse-1.5.10.tgz#9d3c2f736c1d75dd3bd2be507dcc111f1e2ea9c1" @@ -10920,11 +13981,28 @@ url-parse@^1.5.3: querystringify "^2.1.1" requires-port "^1.0.0" +use-subscription@^1.0.0: + version "1.10.0" + resolved "https://registry.yarnpkg.com/use-subscription/-/use-subscription-1.10.0.tgz#ab4df8f39dcfa5c7739639535277045841b3b37b" + integrity sha512-ZRLhsMSjz01kBA8106zdzEjttJ20Rauscf0umwVRjaz8idRfoddOnAVH6VEBdu55eCq02L1g+j3NcleAar1aWw== + dependencies: + use-sync-external-store "^1.4.0" + use-sync-external-store@^1.0.0: version "1.2.0" resolved "https://registry.yarnpkg.com/use-sync-external-store/-/use-sync-external-store-1.2.0.tgz#7dbefd6ef3fe4e767a0cf5d7287aacfb5846928a" integrity sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA== +use-sync-external-store@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/use-sync-external-store/-/use-sync-external-store-1.4.0.tgz#adbc795d8eeb47029963016cefdf89dc799fcebc" + integrity sha512-9WXSPC5fMv61vaupRkCKCxsPxBocVnwakBEkMIHHpkTTg6icbJtg6jzgtLDm4bl3cSHAca52rYWih0k4K3PfHw== + +use@^3.1.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/use/-/use-3.1.1.tgz#d50c8cac79a19fbc20f2911f56eb973f4e10070f" + integrity sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ== + user-agent-data-types@^0.4.2: version "0.4.2" resolved "https://registry.yarnpkg.com/user-agent-data-types/-/user-agent-data-types-0.4.2.tgz#3bbd3662022c3fb9d0c2f7449b6cdd412a3f9e0d" @@ -10956,6 +14034,11 @@ uuid@^10.0.0: resolved "https://registry.yarnpkg.com/uuid/-/uuid-10.0.0.tgz#5a95aa454e6e002725c79055fd42aaba30ca6294" integrity sha512-8XkAphELsDnEGrDxUOHB3RGvXz6TeuYSGEZBOjtTtPm2lwhGBjLgOzLHB63IUWfBpNucQjND6d3AOudO+H3RWQ== +uuid@^3.3.2: + version "3.4.0" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.4.0.tgz#b23e4358afa8a202fe7a100af1f5f883f02007ee" + integrity sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A== + uuid@^8.3.2: version "8.3.2" resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2" @@ -11018,6 +14101,11 @@ vite@^4.3.9: optionalDependencies: fsevents "~2.3.2" +vlq@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/vlq/-/vlq-1.0.1.tgz#c003f6e7c0b4c1edd623fd6ee50bbc0d6a1de468" + integrity sha512-gQpnTgkubC6hQgdIcRdYGDSDc+SaujOdyesZQMv6JlfQee/9Mp0Qhnys6WxDWvQnL5WZdT7o2Ul187aSt0Rq+w== + w3c-xmlserializer@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/w3c-xmlserializer/-/w3c-xmlserializer-4.0.0.tgz#aebdc84920d806222936e3cdce408e32488a3073" @@ -11046,7 +14134,7 @@ walkdir@^0.4.1: resolved "https://registry.yarnpkg.com/walkdir/-/walkdir-0.4.1.tgz#dc119f83f4421df52e3061e514228a2db20afa39" integrity sha512-3eBwRyEln6E1MSzcxcVpQIhRG8Q1jLvEqRmCZqS3dsfXEDR/AhOF4d+jHg1qvDCpYaVRZjENPQyrVxAkQqxPgQ== -walker@^1.0.8: +walker@^1.0.7, walker@^1.0.8, walker@~1.0.5: version "1.0.8" resolved "https://registry.yarnpkg.com/walker/-/walker-1.0.8.tgz#bd498db477afe573dc04185f011d3ab8a8d7653f" integrity sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ== @@ -11103,6 +14191,11 @@ whatwg-encoding@^2.0.0: dependencies: iconv-lite "0.6.3" +whatwg-fetch@>=0.10.0, whatwg-fetch@^3.0.0: + version "3.6.20" + resolved "https://registry.yarnpkg.com/whatwg-fetch/-/whatwg-fetch-3.6.20.tgz#580ce6d791facec91d37c72890995a0b48d31c70" + integrity sha512-EqhiFU6daOA8kpjOWTL0olhVOF3i7OrFzSYiGsEMB8GcXS+RrzauAERX65xMeNWVqxA6HXH2m69Z9LaKKdisfg== + whatwg-fetch@^3.4.1: version "3.6.2" resolved "https://registry.yarnpkg.com/whatwg-fetch/-/whatwg-fetch-3.6.2.tgz#dced24f37f2624ed0281725d51d0e2e3fe677f8c" @@ -11168,6 +14261,11 @@ which-collection@^1.0.1: is-weakmap "^2.0.1" is-weakset "^2.0.1" +which-module@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.1.tgz#776b1fe35d90aebe99e8ac15eb24093389a4a409" + integrity sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ== + which-typed-array@^1.1.14, which-typed-array@^1.1.2, which-typed-array@^1.1.9: version "1.1.14" resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.14.tgz#1f78a111aee1e131ca66164d8bdc3ab062c95a06" @@ -11259,6 +14357,15 @@ wordwrap@^1.0.0: string-width "^4.1.0" strip-ansi "^6.0.0" +wrap-ansi@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-5.1.0.tgz#1fd1f67235d5b6d0fee781056001bfb694c03b09" + integrity sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q== + dependencies: + ansi-styles "^3.2.0" + string-width "^3.0.0" + strip-ansi "^5.0.0" + wrap-ansi@^6.0.1, wrap-ansi@^6.2.0: version "6.2.0" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-6.2.0.tgz#e9393ba07102e6c91a3b221478f0257cd2856e53" @@ -11328,31 +14435,79 @@ write-pkg@4.0.0: type-fest "^0.4.1" write-json-file "^3.2.0" +ws@^1.1.0, ws@^1.1.5: + version "1.1.5" + resolved "https://registry.yarnpkg.com/ws/-/ws-1.1.5.tgz#cbd9e6e75e09fc5d2c90015f21f0c40875e0dd51" + integrity sha512-o3KqipXNUdS7wpQzBHSe180lBGO60SoK0yVo3CYJgb2MkobuWuBX6dhkYP5ORCLd55y+SaflMOV5fqAB53ux4w== + dependencies: + options ">=0.0.5" + ultron "1.0.x" + +ws@^7: + version "7.5.10" + resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.10.tgz#58b5c20dc281633f6c19113f39b349bd8bd558d9" + integrity sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ== + ws@^8.11.0: version "8.17.1" resolved "https://registry.yarnpkg.com/ws/-/ws-8.17.1.tgz#9293da530bb548febc95371d90f9c878727d919b" integrity sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ== +xcode@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/xcode/-/xcode-2.1.0.tgz#bab64a7e954bb50ca8d19da7e09531c65a43ecfe" + integrity sha512-uCrmPITrqTEzhn0TtT57fJaNaw8YJs1aCzs+P/QqxsDbvPZSv7XMPPwXrKvHtD6pLjBM/NaVwraWJm8q83Y4iQ== + dependencies: + simple-plist "^1.0.0" + uuid "^3.3.2" + xml-name-validator@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/xml-name-validator/-/xml-name-validator-4.0.0.tgz#79a006e2e63149a8600f15430f0a4725d1524835" integrity sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw== +xmlbuilder@^15.1.1: + version "15.1.1" + resolved "https://registry.yarnpkg.com/xmlbuilder/-/xmlbuilder-15.1.1.tgz#9dcdce49eea66d8d10b42cae94a79c3c8d0c2ec5" + integrity sha512-yMqGBqtXyeN1e3TGYvgNgDVZ3j84W4cwkOXQswghol6APgZWaff9lnbvN7MHYJOiXsvGPXtjTYJEiC9J2wv9Eg== + xmlchars@^2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/xmlchars/-/xmlchars-2.2.0.tgz#060fe1bcb7f9c76fe2a17db86a9bc3ab894210cb" integrity sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw== +xmldoc@^1.1.2: + version "1.3.0" + resolved "https://registry.yarnpkg.com/xmldoc/-/xmldoc-1.3.0.tgz#7823225b096c74036347c9ec5924d06b6a3cebab" + integrity sha512-y7IRWW6PvEnYQZNZFMRLNJw+p3pezM4nKYPfr15g4OOW9i8VpeydycFuipE2297OvZnh3jSb2pxOt9QpkZUVng== + dependencies: + sax "^1.2.4" + +xpipe@^1.0.5: + version "1.0.8" + resolved "https://registry.yarnpkg.com/xpipe/-/xpipe-1.0.8.tgz#2e970c255cfa39592726fa3458e2465d3754767f" + integrity sha512-E2RGg3fUCxHGdbrM7FMOqHNhiiDRW/tgbftCd/K6w1ce4386QZvkgIq77EBsHdAOmNfQjtmIKwXp67Dy18s8Dg== + xtend@^4.0.0, xtend@~4.0.1: version "4.0.2" resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54" integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ== +y18n@^4.0.0: + version "4.0.3" + resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.3.tgz#b5f259c82cd6e336921efd7bfd8bf560de9eeedf" + integrity sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ== + y18n@^5.0.5: version "5.0.8" resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55" integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== +yallist@^2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52" + integrity sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A== + yallist@^3.0.2: version "3.1.1" resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" @@ -11373,6 +14528,22 @@ yargs-parser@21.1.1, yargs-parser@^21.1.1: resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-21.1.1.tgz#9096bceebf990d21bb31fa9516e0ede294a77d35" integrity sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw== +yargs-parser@^15.0.1: + version "15.0.3" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-15.0.3.tgz#316e263d5febe8b38eef61ac092b33dfcc9b1115" + integrity sha512-/MVEVjTXy/cGAjdtQf8dW3V9b97bPN7rNn8ETj6BmAQL7ibC7O1Q9SPJbGjgh3SlwoBNXMzj/ZGIj8mBgl12YA== + dependencies: + camelcase "^5.0.0" + decamelize "^1.2.0" + +yargs-parser@^18.1.2: + version "18.1.3" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-18.1.3.tgz#be68c4975c6b2abf469236b0c870362fab09a7b0" + integrity sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ== + dependencies: + camelcase "^5.0.0" + decamelize "^1.2.0" + yargs-parser@^20.2.2, yargs-parser@^20.2.3: version "20.2.9" resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.9.tgz#2eb7dc3b0289718fc295f362753845c41a0c94ee" @@ -11391,6 +14562,40 @@ yargs@17.7.2, yargs@^17.3.1, yargs@^17.6.2, yargs@^17.7.2: y18n "^5.0.5" yargs-parser "^21.1.1" +yargs@^14.2.0: + version "14.2.3" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-14.2.3.tgz#1a1c3edced1afb2a2fea33604bc6d1d8d688a414" + integrity sha512-ZbotRWhF+lkjijC/VhmOT9wSgyBQ7+zr13+YLkhfsSiTriYsMzkTUFP18pFhWwBeMa5gUc1MzbhrO6/VB7c9Xg== + dependencies: + cliui "^5.0.0" + decamelize "^1.2.0" + find-up "^3.0.0" + get-caller-file "^2.0.1" + require-directory "^2.1.1" + require-main-filename "^2.0.0" + set-blocking "^2.0.0" + string-width "^3.0.0" + which-module "^2.0.0" + y18n "^4.0.0" + yargs-parser "^15.0.1" + +yargs@^15.1.0: + version "15.4.1" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-15.4.1.tgz#0d87a16de01aee9d8bec2bfbf74f67851730f4f8" + integrity sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A== + dependencies: + cliui "^6.0.0" + decamelize "^1.2.0" + find-up "^4.1.0" + get-caller-file "^2.0.1" + require-directory "^2.1.1" + require-main-filename "^2.0.0" + set-blocking "^2.0.0" + string-width "^4.2.0" + which-module "^2.0.0" + y18n "^4.0.0" + yargs-parser "^18.1.2" + yargs@^16.2.0: version "16.2.0" resolved "https://registry.yarnpkg.com/yargs/-/yargs-16.2.0.tgz#1c82bf0f6b6a66eafce7ef30e376f49a12477f66" From ff9ec96d2cb76e6b0e9d3d02387eb7b3f42b8b77 Mon Sep 17 00:00:00 2001 From: Ilia Kurganskii Date: Thu, 2 Jan 2025 18:57:58 +0100 Subject: [PATCH 26/43] fix: fix build issue --- .../instrumentation-otel-axios/package.json | 1 + .../package.json | 1 + .../instrumentation-websocket/package.json | 1 + packages/core/package.json | 1 + packages/react-native-sdk/package.json | 1 + packages/react-native-tracing/package.json | 7 +- yarn.lock | 2921 +++++------------ 7 files changed, 863 insertions(+), 2070 deletions(-) diff --git a/experimental/instrumentation-otel-axios/package.json b/experimental/instrumentation-otel-axios/package.json index 6919846de..16a0d189d 100644 --- a/experimental/instrumentation-otel-axios/package.json +++ b/experimental/instrumentation-otel-axios/package.json @@ -14,6 +14,7 @@ "main": "./dist/cjs/index.js", "module": "./dist/esm/index.js", "types": "./dist/types/index.d.ts", + "react-native": "src/index", "scripts": { "test": "jest", "start": "yarn watch", diff --git a/experimental/instrumentation-otel-redux-saga/package.json b/experimental/instrumentation-otel-redux-saga/package.json index 07d0c048f..19c8025a2 100644 --- a/experimental/instrumentation-otel-redux-saga/package.json +++ b/experimental/instrumentation-otel-redux-saga/package.json @@ -14,6 +14,7 @@ "main": "./dist/cjs/index.js", "module": "./dist/esm/index.js", "types": "./dist/types/index.d.ts", + "react-native": "src/index", "scripts": { "test": "jest", "start": "yarn watch", diff --git a/experimental/instrumentation-websocket/package.json b/experimental/instrumentation-websocket/package.json index eafd8865f..b5a9bf226 100644 --- a/experimental/instrumentation-websocket/package.json +++ b/experimental/instrumentation-websocket/package.json @@ -14,6 +14,7 @@ "main": "./dist/cjs/index.js", "module": "./dist/esm/index.js", "types": "./dist/types/index.d.ts", + "react-native": "src/index", "scripts": { "test": "jest", "start": "yarn watch", diff --git a/packages/core/package.json b/packages/core/package.json index 3f96f0720..d2f788151 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -13,6 +13,7 @@ "license": "Apache-2.0", "author": "Grafana Labs", "homepage": "https://github.com/grafana/faro-web-sdk", + "react-native": "src/index", "sideEffects": false, "repository": { "type": "git", diff --git a/packages/react-native-sdk/package.json b/packages/react-native-sdk/package.json index 75a299207..4aa3e7f3e 100644 --- a/packages/react-native-sdk/package.json +++ b/packages/react-native-sdk/package.json @@ -23,6 +23,7 @@ "main": "./dist/cjs/index.js", "module": "./dist/esm/index.js", "types": "./dist/types/index.d.ts", + "react-native": "src/index", "files": [ ".browserslistrc", "dist", diff --git a/packages/react-native-tracing/package.json b/packages/react-native-tracing/package.json index 61c799c68..1eb084615 100644 --- a/packages/react-native-tracing/package.json +++ b/packages/react-native-tracing/package.json @@ -24,6 +24,7 @@ "main": "./dist/cjs/index.js", "module": "./dist/esm/index.js", "types": "./dist/types/index.d.ts", + "react-native": "src/index", "files": [ ".browserslistrc", "dist", @@ -72,11 +73,11 @@ "@types/react": "^17.0.0", "@types/react-native": "^0.63.0", "react": "^17.0.0", - "react-native": "^0.63.0" + "react-native": "^0.72.13" }, "peerDependencies": { - "react": "^16.8.0 || ^17.0.0", - "react-native": "^0.63.0" + "react": "*", + "react-native": "*" }, "publishConfig": { "access": "public" diff --git a/yarn.lock b/yarn.lock index 032a1f484..4ed7d4555 100644 --- a/yarn.lock +++ b/yarn.lock @@ -34,7 +34,7 @@ resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.26.2.tgz#278b6b13664557de95b8f35b90d96785850bb56e" integrity sha512-Z0WgzSEa+aUcdiJuCIqgujCshpMWgUpgOxXotrYPSA53hA3qopNaqcJpyr0hVb1FeWdnqFA35/fUtXgBK8srQg== -"@babel/core@^7.0.0", "@babel/core@^7.11.6", "@babel/core@^7.12.3", "@babel/core@^7.23.9", "@babel/core@^7.25.2": +"@babel/core@^7.11.6", "@babel/core@^7.12.3", "@babel/core@^7.13.16", "@babel/core@^7.20.0", "@babel/core@^7.23.9", "@babel/core@^7.25.2": version "7.26.0" resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.26.0.tgz#d78b6023cc8f3114ccf049eb219613f74a747b40" integrity sha512-i1SLeK+DzNnQ3LL/CswPCa/E5u4lh1k6IAEphON8F+cXt0t9euTshDru0q7/IqMa1PMPz5RnHuHscF8/ZJsStg== @@ -55,6 +55,17 @@ json5 "^2.2.3" semver "^6.3.1" +"@babel/generator@^7.20.0", "@babel/generator@^7.26.3": + version "7.26.3" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.26.3.tgz#ab8d4360544a425c90c248df7059881f4b2ce019" + integrity sha512-6FF/urZvD0sTeO7k6/B15pMLC4CHUv1426lzr3N01aHJTl046uCAh9LXW/fzeXXjPNCJ6iABW5XaWOsIZB93aQ== + dependencies: + "@babel/parser" "^7.26.3" + "@babel/types" "^7.26.3" + "@jridgewell/gen-mapping" "^0.3.5" + "@jridgewell/trace-mapping" "^0.3.25" + jsesc "^3.0.2" + "@babel/generator@^7.25.9", "@babel/generator@^7.26.0", "@babel/generator@^7.7.2": version "7.26.2" resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.26.2.tgz#87b75813bec87916210e5e01939a4c823d6bb74f" @@ -66,17 +77,6 @@ "@jridgewell/trace-mapping" "^0.3.25" jsesc "^3.0.2" -"@babel/generator@^7.26.3", "@babel/generator@^7.5.0": - version "7.26.3" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.26.3.tgz#ab8d4360544a425c90c248df7059881f4b2ce019" - integrity sha512-6FF/urZvD0sTeO7k6/B15pMLC4CHUv1426lzr3N01aHJTl046uCAh9LXW/fzeXXjPNCJ6iABW5XaWOsIZB93aQ== - dependencies: - "@babel/parser" "^7.26.3" - "@babel/types" "^7.26.3" - "@jridgewell/gen-mapping" "^0.3.5" - "@jridgewell/trace-mapping" "^0.3.25" - jsesc "^3.0.2" - "@babel/helper-annotate-as-pure@^7.25.9": version "7.25.9" resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.25.9.tgz#d8eac4d2dc0d7b6e11fa6e535332e0d3184f06b4" @@ -128,6 +128,13 @@ lodash.debounce "^4.0.8" resolve "^1.14.2" +"@babel/helper-environment-visitor@^7.18.9": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.24.7.tgz#4b31ba9551d1f90781ba83491dd59cf9b269f7d9" + integrity sha512-DoiN84+4Gnd0ncbBOM9AZENV4a5ZiL39HYMyZJGZ/AZEykHYdJw0wW3kdcsh9/Kn+BRXHLkkklZ51ecPKmI1CQ== + dependencies: + "@babel/types" "^7.24.7" + "@babel/helper-member-expression-to-functions@^7.25.9": version "7.25.9" resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.25.9.tgz#9dfffe46f727005a5ea29051ac835fb735e4c1a3" @@ -165,6 +172,15 @@ resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.25.9.tgz#9cbdd63a9443a2c92a725cca7ebca12cc8dd9f46" integrity sha512-kSMlyUVdWe25rEsRGviIgOWnoT/nfABVWlqt9N19/dIPWViAOW2s9wznP5tURbs/IDuNk4gPy3YdYRgH3uxhBw== +"@babel/helper-remap-async-to-generator@^7.18.9", "@babel/helper-remap-async-to-generator@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.25.9.tgz#e53956ab3d5b9fb88be04b3e2f31b523afd34b92" + integrity sha512-IZtukuUeBbhgOcaW2s06OXTzVNJR0ybm4W5xC1opWFFJMZbwRj5LCk+ByYH7WdZPZTt8KnFwA8pvjN2yqcPlgw== + dependencies: + "@babel/helper-annotate-as-pure" "^7.25.9" + "@babel/helper-wrap-function" "^7.25.9" + "@babel/traverse" "^7.25.9" + "@babel/helper-replace-supers@^7.25.9": version "7.25.9" resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.25.9.tgz#ba447224798c3da3f8713fc272b145e33da6a5c5" @@ -197,6 +213,15 @@ resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.25.9.tgz#86e45bd8a49ab7e03f276577f96179653d41da72" integrity sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw== +"@babel/helper-wrap-function@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.25.9.tgz#d99dfd595312e6c894bd7d237470025c85eea9d0" + integrity sha512-ETzz9UTjQSTmw39GboatdymDq4XIQbR8ySgVrylRhPOFpsd+JrKHIuF0de7GCWmem+T4uC5z7EZguod7Wj4A4g== + dependencies: + "@babel/template" "^7.25.9" + "@babel/traverse" "^7.25.9" + "@babel/types" "^7.25.9" + "@babel/helpers@^7.26.0": version "7.26.0" resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.26.0.tgz#30e621f1eba5aa45fe6f4868d2e9154d884119a4" @@ -205,13 +230,6 @@ "@babel/template" "^7.25.9" "@babel/types" "^7.26.0" -"@babel/parser@^7.0.0", "@babel/parser@^7.26.3": - version "7.26.3" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.26.3.tgz#8c51c5db6ddf08134af1ddbacf16aaab48bac234" - integrity sha512-WJ/CvmY8Mea8iDXo6a7RK2wbmJITT5fN3BEkRuFlxVyNx8jOKIIhmC4fSkTcPcf8JyavbBwIe6OpiCOBXt/IcA== - dependencies: - "@babel/types" "^7.26.3" - "@babel/parser@^7.1.0", "@babel/parser@^7.14.7", "@babel/parser@^7.20.7", "@babel/parser@^7.21.8", "@babel/parser@^7.23.9", "@babel/parser@^7.25.9", "@babel/parser@^7.26.0", "@babel/parser@^7.26.2": version "7.26.2" resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.26.2.tgz#fd7b6f487cfea09889557ef5d4eeb9ff9a5abd11" @@ -219,14 +237,24 @@ dependencies: "@babel/types" "^7.26.0" -"@babel/plugin-external-helpers@^7.0.0": - version "7.25.9" - resolved "https://registry.yarnpkg.com/@babel/plugin-external-helpers/-/plugin-external-helpers-7.25.9.tgz#60c43843746fe3bccd7cb52d07c0b8699c21e6d4" - integrity sha512-Ro9pBweUvdxKyKKmWsqYaloZrxc2V+bseyPI7mV5DqBNvyNeGFFX+rPqicuEyOssiFYfoGyMjOF8n3ZAGBOPtg== +"@babel/parser@^7.13.16", "@babel/parser@^7.20.0", "@babel/parser@^7.26.3": + version "7.26.3" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.26.3.tgz#8c51c5db6ddf08134af1ddbacf16aaab48bac234" + integrity sha512-WJ/CvmY8Mea8iDXo6a7RK2wbmJITT5fN3BEkRuFlxVyNx8jOKIIhmC4fSkTcPcf8JyavbBwIe6OpiCOBXt/IcA== dependencies: - "@babel/helper-plugin-utils" "^7.25.9" + "@babel/types" "^7.26.3" + +"@babel/plugin-proposal-async-generator-functions@^7.0.0": + version "7.20.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.20.7.tgz#bfb7276d2d573cb67ba379984a2334e262ba5326" + integrity sha512-xMbiLsn/8RK7Wq7VeVytytS2L6qE69bXPB10YCmMdDZbKF4okCqY74pI/jJQ/8U0b/F6NrT2+14b8/P9/3AMGA== + dependencies: + "@babel/helper-environment-visitor" "^7.18.9" + "@babel/helper-plugin-utils" "^7.20.2" + "@babel/helper-remap-async-to-generator" "^7.18.9" + "@babel/plugin-syntax-async-generators" "^7.8.4" -"@babel/plugin-proposal-class-properties@^7.0.0": +"@babel/plugin-proposal-class-properties@^7.0.0", "@babel/plugin-proposal-class-properties@^7.13.0", "@babel/plugin-proposal-class-properties@^7.18.0": version "7.18.6" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.18.6.tgz#b110f59741895f7ec21a6fff696ec46265c446a3" integrity sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ== @@ -241,7 +269,7 @@ dependencies: "@babel/helper-plugin-utils" "^7.25.9" -"@babel/plugin-proposal-nullish-coalescing-operator@^7.0.0": +"@babel/plugin-proposal-nullish-coalescing-operator@^7.13.8", "@babel/plugin-proposal-nullish-coalescing-operator@^7.18.0": version "7.18.6" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.18.6.tgz#fdd940a99a740e577d6c753ab6fbb43fdb9467e1" integrity sha512-wQxQzxYeJqHcfppzBDnm1yAY0jSRkUXR2z8RePZYrKwMKgMlE8+Z6LUno+bd6LvbGh8Gltvy74+9pIYkr+XkKA== @@ -249,7 +277,15 @@ "@babel/helper-plugin-utils" "^7.18.6" "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" -"@babel/plugin-proposal-object-rest-spread@^7.0.0": +"@babel/plugin-proposal-numeric-separator@^7.0.0": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.18.6.tgz#899b14fbafe87f053d2c5ff05b36029c62e13c75" + integrity sha512-ozlZFogPqoLm8WBr5Z8UckIoE4YQ5KESVcNudyXOR8uqIkliTEgJ3RoketfG6pmzLdeZF0H/wjE9/cCEitBl7Q== + dependencies: + "@babel/helper-plugin-utils" "^7.18.6" + "@babel/plugin-syntax-numeric-separator" "^7.10.4" + +"@babel/plugin-proposal-object-rest-spread@^7.0.0", "@babel/plugin-proposal-object-rest-spread@^7.20.0": version "7.20.7" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.20.7.tgz#aa662940ef425779c75534a5c41e9d936edc390a" integrity sha512-d2S98yCiLxDVmBmE8UjGcfPvNEUbA1U5q5WxaWFUGRzJSVAZqm5W6MbPct0jxnegUZ0niLeNX+IOzEs7wYg9Dg== @@ -268,7 +304,7 @@ "@babel/helper-plugin-utils" "^7.18.6" "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" -"@babel/plugin-proposal-optional-chaining@^7.0.0": +"@babel/plugin-proposal-optional-chaining@^7.13.12", "@babel/plugin-proposal-optional-chaining@^7.20.0": version "7.21.0" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.21.0.tgz#886f5c8978deb7d30f678b2e24346b287234d3ea" integrity sha512-p4zeefM72gpmEe2fkUr/OnOXpWEf8nAgk7ZYVqqfFiyIG7oFfVZcCrU64hWn5xp4tQ9LkV4bTIa5rD0KANpKNA== @@ -298,7 +334,7 @@ dependencies: "@babel/helper-plugin-utils" "^7.12.13" -"@babel/plugin-syntax-dynamic-import@^7.0.0": +"@babel/plugin-syntax-dynamic-import@^7.8.0": version "7.8.3" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz#62bf98b2da3cd21d626154fc96ee5b3cb68eacb3" integrity sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ== @@ -312,7 +348,7 @@ dependencies: "@babel/helper-plugin-utils" "^7.25.9" -"@babel/plugin-syntax-flow@^7.0.0", "@babel/plugin-syntax-flow@^7.2.0", "@babel/plugin-syntax-flow@^7.25.9": +"@babel/plugin-syntax-flow@^7.0.0", "@babel/plugin-syntax-flow@^7.12.1", "@babel/plugin-syntax-flow@^7.18.0", "@babel/plugin-syntax-flow@^7.25.9": version "7.26.0" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.26.0.tgz#96507595c21b45fccfc2bc758d5c45452e6164fa" integrity sha512-B+O2DnPc0iG+YXFqOxv2WNuNU97ToWjOomUQ78DouOENWUaM5sVrmet9mcomUGQFwpJd//gvUagXBSdzO1fRKg== @@ -361,7 +397,7 @@ dependencies: "@babel/helper-plugin-utils" "^7.8.0" -"@babel/plugin-syntax-numeric-separator@^7.8.3": +"@babel/plugin-syntax-numeric-separator@^7.10.4", "@babel/plugin-syntax-numeric-separator@^7.8.3": version "7.10.4" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz#b9b070b3e33570cd9fd07ba7fa91c0dd37b9af97" integrity sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug== @@ -417,6 +453,15 @@ dependencies: "@babel/helper-plugin-utils" "^7.25.9" +"@babel/plugin-transform-async-to-generator@^7.20.0": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.25.9.tgz#c80008dacae51482793e5a9c08b39a5be7e12d71" + integrity sha512-NT7Ejn7Z/LjUH0Gv5KsBCxh7BH3fbLTV0ptHvpeMvrt3cPThHfJfst9Wrb7S8EvJ7vRTFI7z+VAvFVEQn/m5zQ== + dependencies: + "@babel/helper-module-imports" "^7.25.9" + "@babel/helper-plugin-utils" "^7.25.9" + "@babel/helper-remap-async-to-generator" "^7.25.9" + "@babel/plugin-transform-block-scoped-functions@^7.0.0": version "7.25.9" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.25.9.tgz#5700691dbd7abb93de300ca7be94203764fce458" @@ -451,21 +496,14 @@ "@babel/helper-plugin-utils" "^7.25.9" "@babel/template" "^7.25.9" -"@babel/plugin-transform-destructuring@^7.0.0": +"@babel/plugin-transform-destructuring@^7.0.0", "@babel/plugin-transform-destructuring@^7.20.0": version "7.25.9" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.25.9.tgz#966ea2595c498224340883602d3cfd7a0c79cea1" integrity sha512-WkCGb/3ZxXepmMiX101nnGiU+1CAdut8oHyEOHxkKuS1qKpU2SMXE2uSvfz8PBuLd49V6LEsbtyPhWC7fnkgvQ== dependencies: "@babel/helper-plugin-utils" "^7.25.9" -"@babel/plugin-transform-exponentiation-operator@^7.0.0": - version "7.26.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.26.3.tgz#e29f01b6de302c7c2c794277a48f04a9ca7f03bc" - integrity sha512-7CAHcQ58z2chuXPWblnn1K6rLDnDWieghSOEmqQsrBenH0P9InCUtOJYD89pvngljmZlJcz3fcmgYsXFNGa1ZQ== - dependencies: - "@babel/helper-plugin-utils" "^7.25.9" - -"@babel/plugin-transform-flow-strip-types@^7.0.0": +"@babel/plugin-transform-flow-strip-types@^7.0.0", "@babel/plugin-transform-flow-strip-types@^7.20.0", "@babel/plugin-transform-flow-strip-types@^7.25.9": version "7.25.9" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.25.9.tgz#85879b42a8f5948fd6317069978e98f23ef8aec1" integrity sha512-/VVukELzPDdci7UUsWQaSkhgnjIWXnIyRpM02ldxaVoFK96c41So8JcKT3m0gYjyv7j5FNPGS5vfELrWalkbDA== @@ -504,7 +542,7 @@ dependencies: "@babel/helper-plugin-utils" "^7.25.9" -"@babel/plugin-transform-modules-commonjs@^7.0.0": +"@babel/plugin-transform-modules-commonjs@^7.0.0", "@babel/plugin-transform-modules-commonjs@^7.13.8", "@babel/plugin-transform-modules-commonjs@^7.25.9": version "7.26.3" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.26.3.tgz#8f011d44b20d02c3de44d8850d971d8497f981fb" integrity sha512-MgR55l4q9KddUDITEzEFYn5ZsGDXMSsU9E+kh7fjRXTIC3RHqfCo8RPRbyReYJh44HQ/yomFkqbOFohXvDCiIQ== @@ -512,11 +550,12 @@ "@babel/helper-module-transforms" "^7.26.0" "@babel/helper-plugin-utils" "^7.25.9" -"@babel/plugin-transform-object-assign@^7.0.0": +"@babel/plugin-transform-named-capturing-groups-regex@^7.0.0": version "7.25.9" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-assign/-/plugin-transform-object-assign-7.25.9.tgz#686203d53ee688d1642bf3a8c751dfb3981021c8" - integrity sha512-I/Vl1aQnPsrrn837oLbo+VQtkNcjuuiATqwmuweg4fTauwHHQoxyjmjjOVKyO8OaTxgqYTKW3LuQsykXjDf5Ag== + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.25.9.tgz#454990ae6cc22fd2a0fa60b3a2c6f63a38064e6a" + integrity sha512-oqB6WHdKTGl3q/ItQhpLSnWWOpjUJLsOCLVyeFgeTktkBSCiurvPOsyt93gibI9CmuKvTUEtWmG5VhZD+5T/KA== dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.25.9" "@babel/helper-plugin-utils" "^7.25.9" "@babel/plugin-transform-object-super@^7.0.0": @@ -573,14 +612,6 @@ "@babel/plugin-syntax-jsx" "^7.25.9" "@babel/types" "^7.25.9" -"@babel/plugin-transform-regenerator@^7.0.0": - version "7.25.9" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.25.9.tgz#03a8a4670d6cebae95305ac6defac81ece77740b" - integrity sha512-vwDcDNsgMPDGP0nMqzahDWE5/MLcX8sv96+wfX7as7LoF/kr97Bo/7fI00lXY4wUXYfVmwIIyG80fGZ1uvt2qg== - dependencies: - "@babel/helper-plugin-utils" "^7.25.9" - regenerator-transform "^0.15.2" - "@babel/plugin-transform-runtime@^7.0.0": version "7.25.9" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.25.9.tgz#62723ea3f5b31ffbe676da9d6dae17138ae580ea" @@ -622,7 +653,7 @@ dependencies: "@babel/helper-plugin-utils" "^7.25.9" -"@babel/plugin-transform-typescript@^7.5.0": +"@babel/plugin-transform-typescript@^7.25.9", "@babel/plugin-transform-typescript@^7.5.0": version "7.26.3" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.26.3.tgz#3d6add9c78735623317387ee26d5ada540eee3fd" integrity sha512-6+5hpdr6mETwSKjmJUdYw0EIkATiQhnELWlE3kJFBwSg/BGIVwVaVbX+gOXBCdc7Ln1RXZxyWGecIXhUfnl7oA== @@ -641,7 +672,27 @@ "@babel/helper-create-regexp-features-plugin" "^7.25.9" "@babel/helper-plugin-utils" "^7.25.9" -"@babel/register@^7.0.0": +"@babel/preset-flow@^7.13.13": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/preset-flow/-/preset-flow-7.25.9.tgz#ef8b5e7e3f24a42b3711e77fb14919b87dffed0a" + integrity sha512-EASHsAhE+SSlEzJ4bzfusnXSHiU+JfAYzj+jbw2vgQKgq5HrUr8qs+vgtiEL5dOH6sEweI+PNt2D7AqrDSHyqQ== + dependencies: + "@babel/helper-plugin-utils" "^7.25.9" + "@babel/helper-validator-option" "^7.25.9" + "@babel/plugin-transform-flow-strip-types" "^7.25.9" + +"@babel/preset-typescript@^7.13.0": + version "7.26.0" + resolved "https://registry.yarnpkg.com/@babel/preset-typescript/-/preset-typescript-7.26.0.tgz#4a570f1b8d104a242d923957ffa1eaff142a106d" + integrity sha512-NMk1IGZ5I/oHhoXEElcm+xUnL/szL6xflkFZmoEU9xj1qSJXpiS7rsspYo92B4DRCDvZn2erT5LdsCeXAKNCkg== + dependencies: + "@babel/helper-plugin-utils" "^7.25.9" + "@babel/helper-validator-option" "^7.25.9" + "@babel/plugin-syntax-jsx" "^7.25.9" + "@babel/plugin-transform-modules-commonjs" "^7.25.9" + "@babel/plugin-transform-typescript" "^7.25.9" + +"@babel/register@^7.13.16": version "7.25.9" resolved "https://registry.yarnpkg.com/@babel/register/-/register-7.25.9.tgz#1c465acf7dc983d70ccc318eb5b887ecb04f021b" integrity sha512-8D43jXtGsYmEeDvm4MWHYUpWf8iiXgWYx3fW7E7Wb7Oe6FWqJPl5K6TuFW0dOwNZzEE5rjlaSJYH9JjrUKJszA== @@ -652,7 +703,7 @@ pirates "^4.0.6" source-map-support "^0.5.16" -"@babel/runtime@^7.0.0", "@babel/runtime@^7.8.4": +"@babel/runtime@^7.0.0": version "7.26.0" resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.26.0.tgz#8600c2f595f277c60815256418b85356a65173c1" integrity sha512-FDSOghenHTiToteC/QRlv2q3DhPZ/oOXTBoirfWNx1Cx3TMVcGWQtMMmQcSvb/JjpNeGzx8Pq/b4fKEJuWm1sw== @@ -675,7 +726,7 @@ "@babel/parser" "^7.25.9" "@babel/types" "^7.25.9" -"@babel/traverse@^7.0.0": +"@babel/traverse@^7.20.0": version "7.26.4" resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.26.4.tgz#ac3a2a84b908dde6d463c3bfa2c5fdc1653574bd" integrity sha512-fH+b7Y4p3yqvApJALCPJcwb0/XaOSgtK4pzV6WVjPR5GLFQBRI7pfoX2V2iM48NXvX07NUxxm1Vw98YjqTcU5w== @@ -709,7 +760,7 @@ "@babel/helper-string-parser" "^7.25.9" "@babel/helper-validator-identifier" "^7.25.9" -"@babel/types@^7.26.3": +"@babel/types@^7.20.0", "@babel/types@^7.24.7", "@babel/types@^7.26.3": version "7.26.3" resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.26.3.tgz#37e79830f04c2b5687acc77db97fbc75fb81f3c0" integrity sha512-vN5p+1kl59GVKMvTHt55NzzmYVxprfJD+ql7U9NFIfKCBkYE55LYtS+WtPlaYOyzydrKI8Nezd+aZextrd+FMA== @@ -722,14 +773,6 @@ resolved "https://registry.yarnpkg.com/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz#75a2e8b51cb758a7553d6804a5932d7aace75c39" integrity sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw== -"@cnakazawa/watch@^1.0.3": - version "1.0.4" - resolved "https://registry.yarnpkg.com/@cnakazawa/watch/-/watch-1.0.4.tgz#f864ae85004d0fcab6f50be9141c4da368d1656a" - integrity sha512-v9kIhKwjeZThiWrLmj0y17CWoyddASLj9O2yvbZkbvw/N3rWOYy9zkV66ursAoVr0mV15bL8g0c4QZUE6cdDoQ== - dependencies: - exec-sh "^0.3.2" - minimist "^1.2.0" - "@colors/colors@1.5.0": version "1.5.0" resolved "https://registry.yarnpkg.com/@colors/colors/-/colors-1.5.0.tgz#bb504579c1cae923e6576a4f5da43d25f97bdbd9" @@ -992,43 +1035,11 @@ protobufjs "^7.2.4" yargs "^17.7.2" -"@hapi/address@2.x.x": - version "2.1.4" - resolved "https://registry.yarnpkg.com/@hapi/address/-/address-2.1.4.tgz#5d67ed43f3fd41a69d4b9ff7b56e7c0d1d0a81e5" - integrity sha512-QD1PhQk+s31P1ixsX0H0Suoupp3VMXzIVMSwobR3F3MSUO2YCV0B7xqLcUw/Bh8yuvd3LhpyqLQWTNcRmp6IdQ== - -"@hapi/bourne@1.x.x": - version "1.3.2" - resolved "https://registry.yarnpkg.com/@hapi/bourne/-/bourne-1.3.2.tgz#0a7095adea067243ce3283e1b56b8a8f453b242a" - integrity sha512-1dVNHT76Uu5N3eJNTYcvxee+jzX4Z9lfciqRRHCU27ihbUcYi+iSc2iml5Ke1LXe1SyJCLA0+14Jh4tXJgOppA== - -"@hapi/hoek@8.x.x", "@hapi/hoek@^8.3.0": - version "8.5.1" - resolved "https://registry.yarnpkg.com/@hapi/hoek/-/hoek-8.5.1.tgz#fde96064ca446dec8c55a8c2f130957b070c6e06" - integrity sha512-yN7kbciD87WzLGc5539Tn0sApjyiGHAJgKvG9W8C7O+6c7qmoQMfVs0W4bX17eqz6C78QJqqFrtgdK5EWf6Qow== - "@hapi/hoek@^9.0.0", "@hapi/hoek@^9.3.0": version "9.3.0" resolved "https://registry.yarnpkg.com/@hapi/hoek/-/hoek-9.3.0.tgz#8368869dcb735be2e7f5cb7647de78e167a251fb" integrity sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ== -"@hapi/joi@^15.0.3": - version "15.1.1" - resolved "https://registry.yarnpkg.com/@hapi/joi/-/joi-15.1.1.tgz#c675b8a71296f02833f8d6d243b34c57b8ce19d7" - integrity sha512-entf8ZMOK8sc+8YfeOlM8pCfg3b5+WZIKBfUaaJT8UsjAAPjartzxIYm3TIbjvA4u+u++KbcXD38k682nVHDAQ== - dependencies: - "@hapi/address" "2.x.x" - "@hapi/bourne" "1.x.x" - "@hapi/hoek" "8.x.x" - "@hapi/topo" "3.x.x" - -"@hapi/topo@3.x.x": - version "3.1.6" - resolved "https://registry.yarnpkg.com/@hapi/topo/-/topo-3.1.6.tgz#68d935fa3eae7fdd5ab0d7f953f3205d8b2bfc29" - integrity sha512-tAag0jEcjwH+P2quUfipd7liWCNX2F8NvYjQp2wtInsZxnMlypdw0FtAOLxtvvkO+GSRRbmNi8m/5y42PQJYCQ== - dependencies: - "@hapi/hoek" "^8.3.0" - "@hapi/topo@^5.1.0": version "5.1.0" resolved "https://registry.yarnpkg.com/@hapi/topo/-/topo-5.1.0.tgz#dc448e332c6c6e37a4dc02fd84ba8d44b9afb012" @@ -1093,15 +1104,6 @@ resolved "https://registry.yarnpkg.com/@istanbuljs/schema/-/schema-0.1.3.tgz#e45e384e4b8ec16bce2fd903af78450f6bf7ec98" integrity sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA== -"@jest/console@^24.9.0": - version "24.9.0" - resolved "https://registry.yarnpkg.com/@jest/console/-/console-24.9.0.tgz#79b1bc06fb74a8cfb01cbdedf945584b1b9707f0" - integrity sha512-Zuj6b8TnKXi3q4ymac8EQfc3ea/uhLeCGThFqXeC8H9/raaH8ARPUTdId+XyGd03Z4In0/VjD2OYFcBF09fNLQ== - dependencies: - "@jest/source-map" "^24.9.0" - chalk "^2.0.1" - slash "^2.0.0" - "@jest/console@^29.7.0": version "29.7.0" resolved "https://registry.yarnpkg.com/@jest/console/-/console-29.7.0.tgz#cd4822dbdb84529265c5a2bdb529a3c9cc950ffc" @@ -1148,6 +1150,13 @@ slash "^3.0.0" strip-ansi "^6.0.0" +"@jest/create-cache-key-function@^29.2.1": + version "29.7.0" + resolved "https://registry.yarnpkg.com/@jest/create-cache-key-function/-/create-cache-key-function-29.7.0.tgz#793be38148fab78e65f40ae30c36785f4ad859f0" + integrity sha512-4QqS3LY5PBmTRHj9sAg1HLoPzqAI0uOX6wI/TRqHIcOxlFidy6YEmCQJk6FSZjNLGCeubDMfmkWL+qaLKhSGQA== + dependencies: + "@jest/types" "^29.6.3" + "@jest/environment@^29.7.0": version "29.7.0" resolved "https://registry.yarnpkg.com/@jest/environment/-/environment-29.7.0.tgz#24d61f54ff1f786f3cd4073b4b94416383baf2a7" @@ -1173,15 +1182,6 @@ expect "^29.7.0" jest-snapshot "^29.7.0" -"@jest/fake-timers@^24.9.0": - version "24.9.0" - resolved "https://registry.yarnpkg.com/@jest/fake-timers/-/fake-timers-24.9.0.tgz#ba3e6bf0eecd09a636049896434d306636540c93" - integrity sha512-eWQcNa2YSwzXWIMC5KufBh3oWRIijrQFROsIqt6v/NS9Io/gknw1jsAC9c+ih/RQX4A3O7SeWAhQeN0goKhT9A== - dependencies: - "@jest/types" "^24.9.0" - jest-message-util "^24.9.0" - jest-mock "^24.9.0" - "@jest/fake-timers@^29.7.0": version "29.7.0" resolved "https://registry.yarnpkg.com/@jest/fake-timers/-/fake-timers-29.7.0.tgz#fd91bf1fffb16d7d0d24a426ab1a47a49881a565" @@ -1241,15 +1241,6 @@ dependencies: "@sinclair/typebox" "^0.27.8" -"@jest/source-map@^24.9.0": - version "24.9.0" - resolved "https://registry.yarnpkg.com/@jest/source-map/-/source-map-24.9.0.tgz#0e263a94430be4b41da683ccc1e6bffe2a191714" - integrity sha512-/Xw7xGlsZb4MJzNDgB7PW5crou5JqWiBQaz6xyPd3ArOg2nfn/PunV8+olXbbEZzNl591o5rWKE9BRDaFAuIBg== - dependencies: - callsites "^3.0.0" - graceful-fs "^4.1.15" - source-map "^0.6.0" - "@jest/source-map@^29.6.3": version "29.6.3" resolved "https://registry.yarnpkg.com/@jest/source-map/-/source-map-29.6.3.tgz#d90ba772095cf37a34a5eb9413f1b562a08554c4" @@ -1259,15 +1250,6 @@ callsites "^3.0.0" graceful-fs "^4.2.9" -"@jest/test-result@^24.9.0": - version "24.9.0" - resolved "https://registry.yarnpkg.com/@jest/test-result/-/test-result-24.9.0.tgz#11796e8aa9dbf88ea025757b3152595ad06ba0ca" - integrity sha512-XEFrHbBonBJ8dGp2JmF8kP/nQI/ImPpygKHwQ/SY+es59Z3L5PI4Qb9TQQMAEeYsThG1xF0k6tmG0tIKATNiiA== - dependencies: - "@jest/console" "^24.9.0" - "@jest/types" "^24.9.0" - "@types/istanbul-lib-coverage" "^2.0.0" - "@jest/test-result@^29.7.0": version "29.7.0" resolved "https://registry.yarnpkg.com/@jest/test-result/-/test-result-29.7.0.tgz#8db9a80aa1a097bb2262572686734baed9b1657c" @@ -1309,24 +1291,27 @@ slash "^3.0.0" write-file-atomic "^4.0.2" -"@jest/types@^24.9.0": - version "24.9.0" - resolved "https://registry.yarnpkg.com/@jest/types/-/types-24.9.0.tgz#63cb26cb7500d069e5a389441a7c6ab5e909fc59" - integrity sha512-XKK7ze1apu5JWQ5eZjHITP66AX+QsLlbaJRBGYr8pNzwcAE2JVkwnf0yqjHTsDRcjR0mujy/NmZMXw5kl+kGBw== +"@jest/types@^26.6.2": + version "26.6.2" + resolved "https://registry.yarnpkg.com/@jest/types/-/types-26.6.2.tgz#bef5a532030e1d88a2f5a6d933f84e97226ed48e" + integrity sha512-fC6QCp7Sc5sX6g8Tvbmj4XUTbyrik0akgRy03yjXbQaBWWNWGE7SGtJk98m0N8nzegD/7SggrUlivxo5ax4KWQ== dependencies: "@types/istanbul-lib-coverage" "^2.0.0" - "@types/istanbul-reports" "^1.1.1" - "@types/yargs" "^13.0.0" + "@types/istanbul-reports" "^3.0.0" + "@types/node" "*" + "@types/yargs" "^15.0.0" + chalk "^4.0.0" -"@jest/types@^25.5.0": - version "25.5.0" - resolved "https://registry.yarnpkg.com/@jest/types/-/types-25.5.0.tgz#4d6a4793f7b9599fc3680877b856a97dbccf2a9d" - integrity sha512-OXD0RgQ86Tu3MazKo8bnrkDRaDXXMGUqd+kTtLtK1Zb7CRzQcaSRPPPV37SvYTdevXEBVxe0HXylEjs8ibkmCw== +"@jest/types@^27.5.1": + version "27.5.1" + resolved "https://registry.yarnpkg.com/@jest/types/-/types-27.5.1.tgz#3c79ec4a8ba61c170bf937bcf9e98a9df175ec80" + integrity sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw== dependencies: "@types/istanbul-lib-coverage" "^2.0.0" - "@types/istanbul-reports" "^1.1.1" - "@types/yargs" "^15.0.0" - chalk "^3.0.0" + "@types/istanbul-reports" "^3.0.0" + "@types/node" "*" + "@types/yargs" "^16.0.0" + chalk "^4.0.0" "@jest/types@^29.6.3": version "29.6.3" @@ -2274,125 +2259,208 @@ dependencies: "@swc/helpers" "^0.5.0" -"@react-native-community/cli-debugger-ui@^4.13.1": - version "4.13.1" - resolved "https://registry.yarnpkg.com/@react-native-community/cli-debugger-ui/-/cli-debugger-ui-4.13.1.tgz#07de6d4dab80ec49231de1f1fbf658b4ad39b32c" - integrity sha512-UFnkg5RTq3s2X15fSkrWY9+5BKOFjihNSnJjTV2H5PtTUFbd55qnxxPw8CxSfK0bXb1IrSvCESprk2LEpqr5cg== +"@react-native-community/cli-clean@11.4.1": + version "11.4.1" + resolved "https://registry.yarnpkg.com/@react-native-community/cli-clean/-/cli-clean-11.4.1.tgz#0155a02e4158c8a61ba3d7a2b08f3ebebed81906" + integrity sha512-cwUbY3c70oBGv3FvQJWe2Qkq6m1+/dcEBonMDTYyH6i+6OrkzI4RkIGpWmbG1IS5JfE9ISUZkNL3946sxyWNkw== + dependencies: + "@react-native-community/cli-tools" "11.4.1" + chalk "^4.1.2" + execa "^5.0.0" + prompts "^2.4.0" + +"@react-native-community/cli-config@11.4.1": + version "11.4.1" + resolved "https://registry.yarnpkg.com/@react-native-community/cli-config/-/cli-config-11.4.1.tgz#c27f91d2753f0f803cc79bbf299f19648a5d5627" + integrity sha512-sLdv1HFVqu5xNpeaR1+std0t7FFZaobpmpR0lFCOzKV7H/l611qS2Vo8zssmMK+oQbCs5JsX3SFPciODeIlaWA== + dependencies: + "@react-native-community/cli-tools" "11.4.1" + chalk "^4.1.2" + cosmiconfig "^5.1.0" + deepmerge "^4.3.0" + glob "^7.1.3" + joi "^17.2.1" + +"@react-native-community/cli-debugger-ui@11.4.1": + version "11.4.1" + resolved "https://registry.yarnpkg.com/@react-native-community/cli-debugger-ui/-/cli-debugger-ui-11.4.1.tgz#783cc276e1360baf8235dc8c6ebbbce0fe01d944" + integrity sha512-+pgIjGNW5TrJF37XG3djIOzP+WNoPp67to/ggDhrshuYgpymfb9XpDVsURJugy0Sy3RViqb83kQNK765QzTIvw== dependencies: serve-static "^1.13.1" -"@react-native-community/cli-hermes@^4.13.0": - version "4.13.0" - resolved "https://registry.yarnpkg.com/@react-native-community/cli-hermes/-/cli-hermes-4.13.0.tgz#6243ed9c709dad5e523f1ccd7d21066b32f2899d" - integrity sha512-oG+w0Uby6rSGsUkJGLvMQctZ5eVRLLfhf84lLyz942OEDxFRa9U19YJxOe9FmgCKtotbYiM3P/XhK+SVCuerPQ== +"@react-native-community/cli-doctor@11.4.1": + version "11.4.1" + resolved "https://registry.yarnpkg.com/@react-native-community/cli-doctor/-/cli-doctor-11.4.1.tgz#516ef5932de3e12989695e7cb7aba82b81e7b2de" + integrity sha512-O6oPiRsl8pdkcyNktpzvJAXUqdocoY4jh7Tt7wA69B1JKCJA7aPCecwJgpUZb63ZYoxOtRtYM3BYQKzRMLIuUw== + dependencies: + "@react-native-community/cli-config" "11.4.1" + "@react-native-community/cli-platform-android" "11.4.1" + "@react-native-community/cli-platform-ios" "11.4.1" + "@react-native-community/cli-tools" "11.4.1" + chalk "^4.1.2" + command-exists "^1.2.8" + envinfo "^7.7.2" + execa "^5.0.0" + hermes-profile-transformer "^0.0.6" + node-stream-zip "^1.9.1" + ora "^5.4.1" + prompts "^2.4.0" + semver "^7.5.2" + strip-ansi "^5.2.0" + sudo-prompt "^9.0.0" + wcwidth "^1.0.1" + yaml "^2.2.1" + +"@react-native-community/cli-hermes@11.4.1": + version "11.4.1" + resolved "https://registry.yarnpkg.com/@react-native-community/cli-hermes/-/cli-hermes-11.4.1.tgz#abf487ae8ab53c66f6f1178bcd37ecbbbac9fb5c" + integrity sha512-1VAjwcmv+i9BJTMMVn5Grw7AcgURhTyfHVghJ1YgBE2euEJxPuqPKSxP54wBOQKnWUwsuDQAtQf+jPJoCxJSSA== dependencies: - "@react-native-community/cli-platform-android" "^4.13.0" - "@react-native-community/cli-tools" "^4.13.0" - chalk "^3.0.0" + "@react-native-community/cli-platform-android" "11.4.1" + "@react-native-community/cli-tools" "11.4.1" + chalk "^4.1.2" hermes-profile-transformer "^0.0.6" - ip "^1.1.5" -"@react-native-community/cli-platform-android@^4.10.0", "@react-native-community/cli-platform-android@^4.13.0": - version "4.13.0" - resolved "https://registry.yarnpkg.com/@react-native-community/cli-platform-android/-/cli-platform-android-4.13.0.tgz#922681ec82ee1aadd993598b814df1152118be02" - integrity sha512-3i8sX8GklEytUZwPnojuoFbCjIRzMugCdzDIdZ9UNmi/OhD4/8mLGO0dgXfT4sMWjZwu3qjy45sFfk2zOAgHbA== +"@react-native-community/cli-platform-android@11.4.1", "@react-native-community/cli-platform-android@^11.4.1": + version "11.4.1" + resolved "https://registry.yarnpkg.com/@react-native-community/cli-platform-android/-/cli-platform-android-11.4.1.tgz#ec5fc97e87834f2e33cb0d34dcef6c17b20f60fc" + integrity sha512-VMmXWIzk0Dq5RAd+HIEa3Oe7xl2jso7+gOr6E2HALF4A3fCKUjKZQ6iK2t6AfnY04zftvaiKw6zUXtrfl52AVQ== dependencies: - "@react-native-community/cli-tools" "^4.13.0" - chalk "^3.0.0" - execa "^1.0.0" - fs-extra "^8.1.0" + "@react-native-community/cli-tools" "11.4.1" + chalk "^4.1.2" + execa "^5.0.0" glob "^7.1.3" - jetifier "^1.6.2" - lodash "^4.17.15" logkitty "^0.7.1" - slash "^3.0.0" - xmldoc "^1.1.2" -"@react-native-community/cli-platform-ios@^4.10.0": - version "4.13.0" - resolved "https://registry.yarnpkg.com/@react-native-community/cli-platform-ios/-/cli-platform-ios-4.13.0.tgz#a738915c68cac86df54e578b59a1311ea62b1aef" - integrity sha512-6THlTu8zp62efkzimfGr3VIuQJ2514o+vScZERJCV1xgEi8XtV7mb/ZKt9o6Y9WGxKKkc0E0b/aVAtgy+L27CA== +"@react-native-community/cli-platform-ios@11.4.1", "@react-native-community/cli-platform-ios@^11.4.1": + version "11.4.1" + resolved "https://registry.yarnpkg.com/@react-native-community/cli-platform-ios/-/cli-platform-ios-11.4.1.tgz#12d72741273b684734d5ed021415b7f543a6f009" + integrity sha512-RPhwn+q3IY9MpWc9w/Qmzv03mo8sXdah2eSZcECgweqD5SHWtOoRCUt11zM8jASpAQ8Tm5Je7YE9bHvdwGl4hA== dependencies: - "@react-native-community/cli-tools" "^4.13.0" - chalk "^3.0.0" + "@react-native-community/cli-tools" "11.4.1" + chalk "^4.1.2" + execa "^5.0.0" + fast-xml-parser "^4.0.12" glob "^7.1.3" - js-yaml "^3.13.1" - lodash "^4.17.15" - plist "^3.0.1" - xcode "^2.0.0" + ora "^5.4.1" -"@react-native-community/cli-server-api@^4.13.1": - version "4.13.1" - resolved "https://registry.yarnpkg.com/@react-native-community/cli-server-api/-/cli-server-api-4.13.1.tgz#bee7ee9702afce848e9d6ca3dcd5669b99b125bd" - integrity sha512-vQzsFKD9CjHthA2ehTQX8c7uIzlI9A7ejaIow1I9RlEnLraPH2QqVDmzIdbdh5Od47UPbRzamCgAP8Bnqv3qwQ== +"@react-native-community/cli-plugin-metro@11.4.1": + version "11.4.1" + resolved "https://registry.yarnpkg.com/@react-native-community/cli-plugin-metro/-/cli-plugin-metro-11.4.1.tgz#8d51c59a9a720f99150d4153e757d5d1d1dabd22" + integrity sha512-JxbIqknYcQ5Z4rWROtu5LNakLfMiKoWcMoPqIrBLrV5ILm1XUJj1/8fATCcotZqV3yzB3SCJ3RrhKx7dQ3YELw== dependencies: - "@react-native-community/cli-debugger-ui" "^4.13.1" - "@react-native-community/cli-tools" "^4.13.0" + "@react-native-community/cli-server-api" "11.4.1" + "@react-native-community/cli-tools" "11.4.1" + chalk "^4.1.2" + execa "^5.0.0" + metro "^0.76.9" + metro-config "^0.76.9" + metro-core "^0.76.9" + metro-react-native-babel-transformer "^0.76.9" + metro-resolver "^0.76.9" + metro-runtime "^0.76.9" + readline "^1.3.0" + +"@react-native-community/cli-server-api@11.4.1": + version "11.4.1" + resolved "https://registry.yarnpkg.com/@react-native-community/cli-server-api/-/cli-server-api-11.4.1.tgz#3dda094c4ab2369db34fe991c320e3cd78f097b3" + integrity sha512-isxXE8X5x+C4kN90yilD08jaLWD34hfqTfn/Xbl1u/igtdTsCaQGvWe9eaFamrpWFWTpVtj6k+vYfy8AtYSiKA== + dependencies: + "@react-native-community/cli-debugger-ui" "11.4.1" + "@react-native-community/cli-tools" "11.4.1" compression "^1.7.1" connect "^3.6.5" - errorhandler "^1.5.0" - nocache "^2.1.0" - pretty-format "^25.1.0" + errorhandler "^1.5.1" + nocache "^3.0.1" + pretty-format "^26.6.2" serve-static "^1.13.1" - ws "^1.1.0" + ws "^7.5.1" -"@react-native-community/cli-tools@^4.13.0": - version "4.13.0" - resolved "https://registry.yarnpkg.com/@react-native-community/cli-tools/-/cli-tools-4.13.0.tgz#b406463d33af16cedc4305a9a9257ed32845cf1b" - integrity sha512-s4f489h5+EJksn4CfheLgv5PGOM0CDmK1UEBLw2t/ncWs3cW2VI7vXzndcd/WJHTv3GntJhXDcJMuL+Z2IAOgg== +"@react-native-community/cli-tools@11.4.1": + version "11.4.1" + resolved "https://registry.yarnpkg.com/@react-native-community/cli-tools/-/cli-tools-11.4.1.tgz#f6c69967e077b10cd8a884a83e53eb199dd9ee9f" + integrity sha512-GuQIuY/kCPfLeXB1aiPZ5HvF+e/wdO42AYuNEmT7FpH/0nAhdTxA9qjL8m3vatDD2/YK7WNOSVNsl2UBZuOISg== dependencies: - chalk "^3.0.0" - lodash "^4.17.15" + appdirsjs "^1.2.4" + chalk "^4.1.2" + find-up "^5.0.0" mime "^2.4.1" node-fetch "^2.6.0" open "^6.2.0" - shell-quote "1.6.1" - -"@react-native-community/cli-types@^4.10.1": - version "4.10.1" - resolved "https://registry.yarnpkg.com/@react-native-community/cli-types/-/cli-types-4.10.1.tgz#d68a2dcd1649d3b3774823c64e5e9ce55bfbe1c9" - integrity sha512-ael2f1onoPF3vF7YqHGWy7NnafzGu+yp88BbFbP0ydoCP2xGSUzmZVw0zakPTC040Id+JQ9WeFczujMkDy6jYQ== - -"@react-native-community/cli@^4.10.0": - version "4.14.0" - resolved "https://registry.yarnpkg.com/@react-native-community/cli/-/cli-4.14.0.tgz#bb106a98341bfa2db36060091ff90bfe82ea4f55" - integrity sha512-EYJKBuxFxAu/iwNUfwDq41FjORpvSh1wvQ3qsHjzcR5uaGlWEOJrd3uNJDuKBAS0TVvbEesLF9NEXipjyRVr4Q== - dependencies: - "@hapi/joi" "^15.0.3" - "@react-native-community/cli-debugger-ui" "^4.13.1" - "@react-native-community/cli-hermes" "^4.13.0" - "@react-native-community/cli-server-api" "^4.13.1" - "@react-native-community/cli-tools" "^4.13.0" - "@react-native-community/cli-types" "^4.10.1" - chalk "^3.0.0" - command-exists "^1.2.8" - commander "^2.19.0" - cosmiconfig "^5.1.0" - deepmerge "^3.2.0" - envinfo "^7.7.2" - execa "^1.0.0" + ora "^5.4.1" + semver "^7.5.2" + shell-quote "^1.7.3" + +"@react-native-community/cli-types@11.4.1": + version "11.4.1" + resolved "https://registry.yarnpkg.com/@react-native-community/cli-types/-/cli-types-11.4.1.tgz#3842dc37ba3b09f929b485bcbd8218de19349ac2" + integrity sha512-B3q9A5BCneLDSoK/iSJ06MNyBn1qTxjdJeOgeS3MiCxgJpPcxyn/Yrc6+h0Cu9T9sgWj/dmectQPYWxtZeo5VA== + dependencies: + joi "^17.2.1" + +"@react-native-community/cli@^11.4.1": + version "11.4.1" + resolved "https://registry.yarnpkg.com/@react-native-community/cli/-/cli-11.4.1.tgz#9a6346486622860dad721da406df70e29a45491f" + integrity sha512-NdAageVMtNhtvRsrq4NgJf5Ey2nA1CqmLvn7PhSawg+aIzMKmZuzWxGVwr9CoPGyjvNiqJlCWrLGR7NzOyi/sA== + dependencies: + "@react-native-community/cli-clean" "11.4.1" + "@react-native-community/cli-config" "11.4.1" + "@react-native-community/cli-debugger-ui" "11.4.1" + "@react-native-community/cli-doctor" "11.4.1" + "@react-native-community/cli-hermes" "11.4.1" + "@react-native-community/cli-plugin-metro" "11.4.1" + "@react-native-community/cli-server-api" "11.4.1" + "@react-native-community/cli-tools" "11.4.1" + "@react-native-community/cli-types" "11.4.1" + chalk "^4.1.2" + commander "^9.4.1" + execa "^5.0.0" find-up "^4.1.0" fs-extra "^8.1.0" - glob "^7.1.3" graceful-fs "^4.1.3" - inquirer "^3.0.6" - leven "^3.1.0" - lodash "^4.17.15" - metro "^0.59.0" - metro-config "^0.59.0" - metro-core "^0.59.0" - metro-react-native-babel-transformer "^0.59.0" - metro-resolver "^0.59.0" - minimist "^1.2.0" + prompts "^2.4.0" + semver "^7.5.2" + +"@react-native/assets-registry@^0.72.0": + version "0.72.0" + resolved "https://registry.yarnpkg.com/@react-native/assets-registry/-/assets-registry-0.72.0.tgz#c82a76a1d86ec0c3907be76f7faf97a32bbed05d" + integrity sha512-Im93xRJuHHxb1wniGhBMsxLwcfzdYreSZVQGDoMJgkd6+Iky61LInGEHnQCTN0fKNYF1Dvcofb4uMmE1RQHXHQ== + +"@react-native/codegen@^0.72.8": + version "0.72.8" + resolved "https://registry.yarnpkg.com/@react-native/codegen/-/codegen-0.72.8.tgz#0593f628e1310f430450a9479fbb4be35e7b63d6" + integrity sha512-jQCcBlXV7B7ap5VlHhwIPieYz89yiRgwd2FPUBu+unz+kcJ6pAiB2U8RdLDmyIs8fiWd+Vq1xxaWs4TR329/ng== + dependencies: + "@babel/parser" "^7.20.0" + flow-parser "^0.206.0" + glob "^7.1.1" + invariant "^2.2.4" + jscodeshift "^0.14.0" mkdirp "^0.5.1" - node-stream-zip "^1.9.1" - ora "^3.4.0" - pretty-format "^25.2.0" - semver "^6.3.0" - serve-static "^1.13.1" - strip-ansi "^5.2.0" - sudo-prompt "^9.0.0" - wcwidth "^1.0.1" + nullthrows "^1.1.1" + +"@react-native/gradle-plugin@^0.72.11": + version "0.72.11" + resolved "https://registry.yarnpkg.com/@react-native/gradle-plugin/-/gradle-plugin-0.72.11.tgz#c063ef12778706611de7a1e42b74b14d9405fb9f" + integrity sha512-P9iRnxiR2w7EHcZ0mJ+fmbPzMby77ZzV6y9sJI3lVLJzF7TLSdbwcQyD3lwMsiL+q5lKUHoZJS4sYmih+P2HXw== + +"@react-native/js-polyfills@^0.72.1": + version "0.72.1" + resolved "https://registry.yarnpkg.com/@react-native/js-polyfills/-/js-polyfills-0.72.1.tgz#905343ef0c51256f128256330fccbdb35b922291" + integrity sha512-cRPZh2rBswFnGt5X5EUEPs0r+pAsXxYsifv/fgy9ZLQokuT52bPH+9xjDR+7TafRua5CttGW83wP4TntRcWNDA== + +"@react-native/normalize-colors@<0.73.0", "@react-native/normalize-colors@^0.72.0": + version "0.72.0" + resolved "https://registry.yarnpkg.com/@react-native/normalize-colors/-/normalize-colors-0.72.0.tgz#14294b7ed3c1d92176d2a00df48456e8d7d62212" + integrity sha512-285lfdqSXaqKuBbbtP9qL2tDrfxdOFtIMvkKadtleRQkdOxx+uzGvFr82KHmc/sSiMtfXGp7JnFYWVh4sFl7Yw== + +"@react-native/virtualized-lists@^0.72.8": + version "0.72.8" + resolved "https://registry.yarnpkg.com/@react-native/virtualized-lists/-/virtualized-lists-0.72.8.tgz#a2c6a91ea0f1d40eb5a122fb063daedb92ed1dc3" + integrity sha512-J3Q4Bkuo99k7mu+jPS9gSUSgq+lLRSI/+ahXNwV92XgJ/8UgOTxu2LPwhJnBk/sQKxq7E8WkZBnBiozukQMqrw== + dependencies: + invariant "^2.2.4" + nullthrows "^1.1.1" "@redux-saga/core@^1.3.0": version "1.3.0" @@ -2928,14 +2996,6 @@ dependencies: "@types/istanbul-lib-coverage" "*" -"@types/istanbul-reports@^1.1.1": - version "1.1.2" - resolved "https://registry.yarnpkg.com/@types/istanbul-reports/-/istanbul-reports-1.1.2.tgz#e875cc689e47bce549ec81f3df5e6f6f11cfaeb2" - integrity sha512-P/W9yOX/3oPZSpaYOCQzGqgCQRXn0FFO/V8bWrCQs+wLmvVVxk6CRBXALEvNs9OHIatlnlFokfhuDo2ug01ciw== - dependencies: - "@types/istanbul-lib-coverage" "*" - "@types/istanbul-lib-report" "*" - "@types/istanbul-reports@^3.0.0": version "3.0.1" resolved "https://registry.yarnpkg.com/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz#9153fe98bba2bd565a63add9436d6f0d7f8468ff" @@ -3184,11 +3244,6 @@ resolved "https://registry.yarnpkg.com/@types/sizzle/-/sizzle-2.3.9.tgz#d4597dbd4618264c414d7429363e3f50acb66ea2" integrity sha512-xzLEyKB50yqCUPUJkIsrVvoWNfFUbIZI+RspLWt8u+tIW/BetMBZtgV2LY/2o+tYH8dRvQ+eoPf3NdhQCcLE2w== -"@types/stack-utils@^1.0.1": - version "1.0.1" - resolved "https://registry.yarnpkg.com/@types/stack-utils/-/stack-utils-1.0.1.tgz#0a851d3bd96498fa25c33ab7278ed3bd65f06c3e" - integrity sha512-l42BggppR6zLmpfU6fq9HEa2oGPEI8yrSPL3GITjfRInppYFahObbIQOQK3UGxEnyQpltZLaPe75046NOZQikw== - "@types/stack-utils@^2.0.0": version "2.0.1" resolved "https://registry.yarnpkg.com/@types/stack-utils/-/stack-utils-2.0.1.tgz#20f18294f797f2209b5f65c8e3b5c8e8261d127c" @@ -3224,13 +3279,6 @@ resolved "https://registry.yarnpkg.com/@types/yargs-parser/-/yargs-parser-21.0.0.tgz#0c60e537fa790f5f9472ed2776c2b71ec117351b" integrity sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA== -"@types/yargs@^13.0.0": - version "13.0.12" - resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-13.0.12.tgz#d895a88c703b78af0465a9de88aa92c61430b092" - integrity sha512-qCxJE1qgz2y0hA4pIxjBR+PelCH0U5CK1XJXFwCNqfmliatKp47UCXXE9Dyk1OXBDLvsCF57TqQEJaeLfDYEOQ== - dependencies: - "@types/yargs-parser" "*" - "@types/yargs@^15.0.0": version "15.0.19" resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-15.0.19.tgz#328fb89e46109ecbdb70c295d96ff2f46dfd01b9" @@ -3238,6 +3286,13 @@ dependencies: "@types/yargs-parser" "*" +"@types/yargs@^16.0.0": + version "16.0.9" + resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-16.0.9.tgz#ba506215e45f7707e6cbcaf386981155b7ab956e" + integrity sha512-tHhzvkFXZQeTECenFoRljLBYPZJ7jAVxqqtEI0qTLOmuultnFp4I9yKE17vTuhf7BkhCu7I4XuemPgikDVuYqA== + dependencies: + "@types/yargs-parser" "*" + "@types/yargs@^17.0.8": version "17.0.19" resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-17.0.19.tgz#8dbecdc9ab48bee0cb74f6e3327de3fa0d0c98ae" @@ -3402,11 +3457,6 @@ resolved "https://registry.npmjs.org/@web3-storage/multipart-parser/-/multipart-parser-1.0.0.tgz#6b69dc2a32a5b207ba43e556c25cc136a56659c4" integrity sha512-BEO6al7BYqcnfX15W2cnGR+Q566ACXAT9UQykORCWW80lmkpWsnEob6zJS1ZVBKsSJC8+7vJkHwlp+lXG1UCdw== -"@xmldom/xmldom@^0.8.8": - version "0.8.10" - resolved "https://registry.yarnpkg.com/@xmldom/xmldom/-/xmldom-0.8.10.tgz#a1337ca426aa61cef9fe15b5b28e340a72f6fa99" - integrity sha512-2WALfTl4xo2SkGCYRt6rDTFfk9R1czmBvUQy12gK2KuRKIpWEhcbbzy8EZXtz/jkRqHX8bFEc6FC1HjX4TUWYw== - "@yarnpkg/lockfile@^1.1.0": version "1.1.0" resolved "https://registry.yarnpkg.com/@yarnpkg/lockfile/-/lockfile-1.1.0.tgz#e77a97fbd345b76d83245edcd17d393b1b41fb31" @@ -3462,12 +3512,7 @@ abort-controller@^3.0.0: dependencies: event-target-shim "^5.0.0" -absolute-path@^0.0.0: - version "0.0.0" - resolved "https://registry.yarnpkg.com/absolute-path/-/absolute-path-0.0.0.tgz#a78762fbdadfb5297be99b15d35a785b2f095bf7" - integrity sha512-HQiug4c+/s3WOvEnDRxXVmNtSG5s2gJM9r19BTcqjp7BWcE48PB+Y2G6jE65kqI0LpsQeMZygt/b60Gi4KxGyA== - -accepts@~1.3.5, accepts@~1.3.7, accepts@~1.3.8: +accepts@^1.3.7, accepts@~1.3.5, accepts@~1.3.7, accepts@~1.3.8: version "1.3.8" resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.8.tgz#0bf0be125b67014adcb0b0921e62db7bffe16b2e" integrity sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw== @@ -3545,30 +3590,11 @@ anser@^1.4.9: resolved "https://registry.yarnpkg.com/anser/-/anser-1.4.10.tgz#befa3eddf282684bd03b63dcda3927aef8c2e35b" integrity sha512-hCv9AqTQ8ycjpSd3upOJd7vFwW1JaoYQ7tpham03GJ1ca8/65rqn0RpaWpItOAd6ylW9wAw6luXYPJIyPFVOww== -ansi-colors@^1.0.1: - version "1.1.0" - resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-1.1.0.tgz#6374b4dd5d4718ff3ce27a671a3b1cad077132a9" - integrity sha512-SFKX67auSNoVR38N3L+nvsPjOE0bybKTYbkf5tRvushrAPQ9V75huw0ZxBkKVeRU9kqH3d6HA4xTckbwZ4ixmA== - dependencies: - ansi-wrap "^0.1.0" - ansi-colors@^4.1.1: version "4.1.3" resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-4.1.3.tgz#37611340eb2243e70cc604cad35d63270d48781b" integrity sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw== -ansi-cyan@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/ansi-cyan/-/ansi-cyan-0.1.1.tgz#538ae528af8982f28ae30d86f2f17456d2609873" - integrity sha512-eCjan3AVo/SxZ0/MyIYRtkpxIu/H3xZN7URr1vXVrISxeyz8fUFz0FJziamK4sS8I+t35y4rHg1b2PklyBe/7A== - dependencies: - ansi-wrap "0.1.0" - -ansi-escapes@^3.0.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-3.2.0.tgz#8780b98ff9dbf5638152d1f1fe5c1d7b4442976b" - integrity sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ== - ansi-escapes@^4.2.1, ansi-escapes@^4.3.0: version "4.3.2" resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.3.2.tgz#6b2291d1db7d98b6521d5f1efa42d0f3a9feb65e" @@ -3585,26 +3611,7 @@ ansi-fragments@^0.2.1: slice-ansi "^2.0.0" strip-ansi "^5.0.0" -ansi-gray@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/ansi-gray/-/ansi-gray-0.1.1.tgz#2962cf54ec9792c48510a3deb524436861ef7251" - integrity sha512-HrgGIZUl8h2EHuZaU9hTR/cU5nhKxpVE1V6kdGsQ8e4zirElJ5fvtfc8N7Q1oq1aatO275i8pUFUCpNWCAnVWw== - dependencies: - ansi-wrap "0.1.0" - -ansi-red@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/ansi-red/-/ansi-red-0.1.1.tgz#8c638f9d1080800a353c9c28c8a81ca4705d946c" - integrity sha512-ewaIr5y+9CUTGFwZfpECUbFlGcC0GCw1oqR9RI6h1gQCd9Aj2GxSckCnPsVJnmfMZbwFYE+leZGASgkWl06Jow== - dependencies: - ansi-wrap "0.1.0" - -ansi-regex@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.1.tgz#123d6479e92ad45ad897d4054e3c7ca7db4944e1" - integrity sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw== - -ansi-regex@^4.0.0, ansi-regex@^4.1.0: +ansi-regex@^4.1.0: version "4.1.1" resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-4.1.1.tgz#164daac87ab2d6f6db3a29875e2d1766582dabed" integrity sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g== @@ -3643,24 +3650,11 @@ ansi-styles@^6.0.0, ansi-styles@^6.1.0: resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-6.2.1.tgz#0e62320cf99c21afff3b3012192546aacbfb05c5" integrity sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug== -ansi-wrap@0.1.0, ansi-wrap@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/ansi-wrap/-/ansi-wrap-0.1.0.tgz#a82250ddb0015e9a27ca82e82ea603bbfa45efaf" - integrity sha512-ZyznvL8k/FZeQHr2T6LzcJ/+vBApDnMNZvfVFy3At0knswWd6rJ3/0Hhmpu8oqa6C92npmozs890sX9Dl6q+Qw== - any-promise@^1.1.0: version "1.3.0" resolved "https://registry.yarnpkg.com/any-promise/-/any-promise-1.3.0.tgz#abc6afeedcea52e809cdc0376aed3ce39635d17f" integrity sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A== -anymatch@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-2.0.0.tgz#bcb24b4f37934d9aa7ac17b4adaf89e7c76ef2eb" - integrity sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw== - dependencies: - micromatch "^3.1.4" - normalize-path "^2.1.1" - anymatch@^3.0.3, anymatch@~3.1.2: version "3.1.3" resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.3.tgz#790c58b19ba1720a84205b57c618d5ad8524973e" @@ -3674,6 +3668,11 @@ app-module-path@^2.2.0: resolved "https://registry.yarnpkg.com/app-module-path/-/app-module-path-2.2.0.tgz#641aa55dfb7d6a6f0a8141c4b9c0aa50b6c24dd5" integrity sha512-gkco+qxENJV+8vFcDiiFhuoSvRXb2a/QPqpSoWhVz829VNJfOTnELbBmPmNKFxf3xdNnw4DWCkzkDaavcX/1YQ== +appdirsjs@^1.2.4: + version "1.2.7" + resolved "https://registry.yarnpkg.com/appdirsjs/-/appdirsjs-1.2.7.tgz#50b4b7948a26ba6090d4aede2ae2dc2b051be3b3" + integrity sha512-Quji6+8kLBC3NnBeo14nPDq0+2jUs5s3/xEye+udFHumHhRk4M7aAMXp/PBJqkKYGuuyR9M/6Dq7d2AViiGmhw== + aproba@2.0.0, "aproba@^1.0.3 || ^2.0.0": version "2.0.0" resolved "https://registry.yarnpkg.com/aproba/-/aproba-2.0.0.tgz#52520b8ae5b569215b354efc0caa3fe1e45a8adc" @@ -3719,34 +3718,6 @@ argparse@^2.0.1: resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== -arr-diff@^1.0.1: - version "1.1.0" - resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-1.1.0.tgz#687c32758163588fef7de7b36fabe495eb1a399a" - integrity sha512-OQwDZUqYaQwyyhDJHThmzId8daf4/RFNLaeh3AevmSeZ5Y7ug4Ga/yKc6l6kTZOBW781rCj103ZuTh8GAsB3+Q== - dependencies: - arr-flatten "^1.0.1" - array-slice "^0.2.3" - -arr-diff@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-4.0.0.tgz#d6461074febfec71e7e15235761a329a5dc7c520" - integrity sha512-YVIQ82gZPGBebQV/a8dar4AitzCQs0jjXwMPZllpXMaGjXPYVUawSxQrRsjhjupyVxEvbHgUmIhKVlND+j02kA== - -arr-flatten@^1.0.1, arr-flatten@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.1.0.tgz#36048bbff4e7b47e136644316c99669ea5ae91f1" - integrity sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg== - -arr-union@^2.0.1: - version "2.1.0" - resolved "https://registry.yarnpkg.com/arr-union/-/arr-union-2.1.0.tgz#20f9eab5ec70f5c7d215b1077b1c39161d292c7d" - integrity sha512-t5db90jq+qdgk8aFnxEkjqta0B/GHrM1pxzuuZz2zWsOXc5nKu3t+76s/PQBA8FTcM/ipspIH9jWG4OxCBc2eA== - -arr-union@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/arr-union/-/arr-union-3.1.0.tgz#e39b09aea9def866a8f206e288af63919bae39c4" - integrity sha512-sKpyeERZ02v1FeCZT8lrfJq5u6goHCtpTAzPwJYe7c8SPFOboNjNg1vz2L4VTn9T4PQxEx13TbXLmYUcS6Ug7Q== - array-buffer-byte-length@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/array-buffer-byte-length/-/array-buffer-byte-length-1.0.1.tgz#1e5583ec16763540a27ae52eed99ff899223568f" @@ -3760,11 +3731,6 @@ array-differ@^3.0.0: resolved "https://registry.yarnpkg.com/array-differ/-/array-differ-3.0.0.tgz#3cbb3d0f316810eafcc47624734237d6aee4ae6b" integrity sha512-THtfYS6KtME/yIAhKjZ2ul7XI96lQGHRputJQHO80LAWQnuGP4iCIN8vdMRboGbIEYBwU33q8Tch1os2+X0kMg== -array-filter@~0.0.0: - version "0.0.1" - resolved "https://registry.yarnpkg.com/array-filter/-/array-filter-0.0.1.tgz#7da8cf2e26628ed732803581fd21f67cacd2eeec" - integrity sha512-VW0FpCIhjZdarWjIz8Vpva7U95fl2Jn+b+mmFFMLn8PIVscOQcAgEznwUzTEuUHuqZqIxwzRlcaN/urTFFQoiw== - array-flatten@1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2" @@ -3786,31 +3752,11 @@ array-includes@^3.1.5, array-includes@^3.1.6, array-includes@^3.1.7: get-intrinsic "^1.2.1" is-string "^1.0.7" -array-map@~0.0.0: - version "0.0.1" - resolved "https://registry.yarnpkg.com/array-map/-/array-map-0.0.1.tgz#d1bf3cc8813a7daaa335e5c8eb21d9d06230c1a7" - integrity sha512-sxHIeJTGEsRC8/hYkZzdJNNPZ41EXHVys7pqMw1iwE/Kx8/hto0UbDuGQsSJ0ujPovj9qUZl6EOY/EiZ2g3d9Q== - -array-reduce@~0.0.0: - version "0.0.0" - resolved "https://registry.yarnpkg.com/array-reduce/-/array-reduce-0.0.0.tgz#173899d3ffd1c7d9383e4479525dbe278cab5f2b" - integrity sha512-8jR+StqaC636u7h3ye1co3lQRefgVVUQUhuAmRbDqIMeR2yuXzRvkCNQiQ5J/wbREmoBLNtp13dhaaVpZQDRUw== - -array-slice@^0.2.3: - version "0.2.3" - resolved "https://registry.yarnpkg.com/array-slice/-/array-slice-0.2.3.tgz#dd3cfb80ed7973a75117cdac69b0b99ec86186f5" - integrity sha512-rlVfZW/1Ph2SNySXwR9QYkChp8EkOEiTMO5Vwx60usw04i4nWemkm9RXmQqgkQFaLHsqLuADvjp6IfgL9l2M8Q== - array-union@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d" integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== -array-unique@^0.3.2: - version "0.3.2" - resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428" - integrity sha512-SleRWjh9JUud2wH1hPs9rZBZ33H6T9HOiL0uwGnGx9FpE6wKGyfWugmbkEOIs6qWrZhg0LWeLziLrEwQJhs5mQ== - array.prototype.filter@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/array.prototype.filter/-/array.prototype.filter-1.0.3.tgz#423771edeb417ff5914111fff4277ea0624c0d0e" @@ -3888,7 +3834,7 @@ arrify@^2.0.1: resolved "https://registry.yarnpkg.com/arrify/-/arrify-2.0.1.tgz#c9655e9331e0abcd588d2a7cad7e9956f66701fa" integrity sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug== -asap@~2.0.3, asap@~2.0.6: +asap@~2.0.6: version "2.0.6" resolved "https://registry.yarnpkg.com/asap/-/asap-2.0.6.tgz#e50347611d7e690943208bbdafebcbc2fb866d46" integrity sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA== @@ -3905,16 +3851,18 @@ assert-plus@1.0.0, assert-plus@^1.0.0: resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525" integrity sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw== -assign-symbols@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/assign-symbols/-/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367" - integrity sha512-Q+JC7Whu8HhmTdBph/Tq59IoRtoy6KAm5zzPv00WdujX82lbAL8K7WVjne7vdCsAmbF4AYaDOPyO3k0kl8qIrw== - ast-module-types@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/ast-module-types/-/ast-module-types-5.0.0.tgz#32b2b05c56067ff38e95df66f11d6afd6c9ba16b" integrity sha512-JvqziE0Wc0rXQfma0HZC/aY7URXHFuZV84fJRtP8u+lhp0JYCNd5wJzVXP45t0PH0Mej3ynlzvdyITYIu0G4LQ== +ast-types@0.15.2: + version "0.15.2" + resolved "https://registry.yarnpkg.com/ast-types/-/ast-types-0.15.2.tgz#39ae4809393c4b16df751ee563411423e85fb49d" + integrity sha512-c27loCv9QkZinsa5ProX751khO9DJl/AcB5c2KNtA6NRvHKS0PgLfcftz72KVq504vB0Gku5s2kUZzDBvQWvHg== + dependencies: + tslib "^2.0.1" + astral-regex@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-1.0.0.tgz#6c8c3fb827dd43ee3918f27b82782ab7658a6fd9" @@ -3925,14 +3873,12 @@ astral-regex@^2.0.0: resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-2.0.0.tgz#483143c567aeed4785759c0865786dc77d7d2e31" integrity sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ== -async@^2.4.0: - version "2.6.4" - resolved "https://registry.yarnpkg.com/async/-/async-2.6.4.tgz#706b7ff6084664cd7eae713f6f965433b5504221" - integrity sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA== - dependencies: - lodash "^4.17.14" +async-limiter@~1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/async-limiter/-/async-limiter-1.0.1.tgz#dd379e94f0db8310b08291f9d64c3209766617fd" + integrity sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ== -async@^3.2.0, async@^3.2.3: +async@^3.2.0, async@^3.2.2, async@^3.2.3: version "3.2.6" resolved "https://registry.yarnpkg.com/async/-/async-3.2.6.tgz#1b0728e14929d51b85b449b7f06e27c1145e38ce" integrity sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA== @@ -3954,11 +3900,6 @@ at-least-node@^1.0.0: resolved "https://registry.yarnpkg.com/at-least-node/-/at-least-node-1.0.0.tgz#602cd4b46e844ad4effc92a8011a3c46e0238dc2" integrity sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg== -atob@^2.1.2: - version "2.1.2" - resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9" - integrity sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg== - available-typed-arrays@^1.0.6, available-typed-arrays@^1.0.7: version "1.0.7" resolved "https://registry.yarnpkg.com/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz#a5cc375d6a03c2efc87a553f3e0b1522def14846" @@ -3985,6 +3926,11 @@ axios@^1.7.4, axios@^1.7.7: form-data "^4.0.0" proxy-from-env "^1.1.0" +babel-core@^7.0.0-bridge.0: + version "7.0.0-bridge.0" + resolved "https://registry.yarnpkg.com/babel-core/-/babel-core-7.0.0-bridge.0.tgz#95a492ddd90f9b4e9a4a1da14eb335b87b634ece" + integrity sha512-poPX9mZH/5CSanm50Q+1toVci6pv5KSRv/5TWCwtzQS5XEwn40BcCrgIeMFWP9CKKIniKXNxoIOnOq4VVlGXhg== + babel-jest@^29.7.0: version "29.7.0" resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-29.7.0.tgz#f4369919225b684c56085998ac63dbd05be020d5" @@ -4048,6 +3994,13 @@ babel-plugin-syntax-trailing-function-commas@^7.0.0-beta.0: resolved "https://registry.yarnpkg.com/babel-plugin-syntax-trailing-function-commas/-/babel-plugin-syntax-trailing-function-commas-7.0.0-beta.0.tgz#aa213c1435e2bffeb6fca842287ef534ad05d5cf" integrity sha512-Xj9XuRuz3nTSbaTXWv3itLOcxyF4oPD8douBBmj7U9BBC6nEBYfyOJYQMf/8PJAFotC62UY5dFfIGEPr7WswzQ== +babel-plugin-transform-flow-enums@^0.0.2: + version "0.0.2" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-flow-enums/-/babel-plugin-transform-flow-enums-0.0.2.tgz#d1d0cc9bdc799c850ca110d0ddc9f21b9ec3ef25" + integrity sha512-g4aaCrDDOsWjbm0PUUeVnkcVd6AKJsVc/MbnPhEotEpkeJQP6b8nzewohQi7+QS8UyPehOhGWn0nOwjvWpmMvQ== + dependencies: + "@babel/plugin-syntax-flow" "^7.12.1" + babel-preset-current-node-syntax@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz#b4399239b89b2a011f9ddbe3e4f401fc40cff73b" @@ -4066,7 +4019,7 @@ babel-preset-current-node-syntax@^1.0.0: "@babel/plugin-syntax-optional-chaining" "^7.8.3" "@babel/plugin-syntax-top-level-await" "^7.8.3" -babel-preset-fbjs@^3.2.0, babel-preset-fbjs@^3.3.0: +babel-preset-fbjs@^3.4.0: version "3.4.0" resolved "https://registry.yarnpkg.com/babel-preset-fbjs/-/babel-preset-fbjs-3.4.0.tgz#38a14e5a7a3b285a3f3a86552d650dca5cf6111c" integrity sha512-9ywCsCvo1ojrw0b+XYk7aFvTH6D9064t0RIL1rtMf3nsa02Xw41MS7sZw216Im35xj/UY0PDBQsa1brUDDF1Ow== @@ -4112,24 +4065,11 @@ balanced-match@^1.0.0: resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== -base64-js@^1.1.2, base64-js@^1.3.1, base64-js@^1.5.1: +base64-js@^1.1.2, base64-js@^1.3.1: version "1.5.1" resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== -base@^0.11.1: - version "0.11.2" - resolved "https://registry.yarnpkg.com/base/-/base-0.11.2.tgz#7bde5ced145b6d551a90db87f83c558b4eb48a8f" - integrity sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg== - dependencies: - cache-base "^1.0.1" - class-utils "^0.3.5" - component-emitter "^1.2.1" - define-property "^1.0.0" - isobject "^3.0.1" - mixin-deep "^1.2.0" - pascalcase "^0.1.1" - bcrypt-pbkdf@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz#a4301d389b6a43f9b67ff3ca11a3f6637e360e9e" @@ -4150,11 +4090,6 @@ before-after-hook@^2.2.0: resolved "https://registry.yarnpkg.com/before-after-hook/-/before-after-hook-2.2.3.tgz#c51e809c81a4e354084422b9b26bad88249c517c" integrity sha512-NzUnlZexiaH/46WDhANlyR2bXRopNg4F/zuSA3OpZnllCUgRaOF2znDioDWrmbNVsuZk6l9pMquQB38cfBZwkQ== -big-integer@1.6.x: - version "1.6.52" - resolved "https://registry.yarnpkg.com/big-integer/-/big-integer-1.6.52.tgz#60a887f3047614a8e1bffe5d7173490a97dc8c85" - integrity sha512-QxD8cf2eVqJOOz63z6JIN9BzvVs/dlySa5HGSBH5xtR8dPteIRQnBxxKqkNTiT6jbDTF6jAfrd4oMcND9RGbQg== - bin-links@^4.0.4: version "4.0.4" resolved "https://registry.yarnpkg.com/bin-links/-/bin-links-4.0.4.tgz#c3565832b8e287c85f109a02a17027d152a58a63" @@ -4170,13 +4105,6 @@ binary-extensions@^2.0.0: resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d" integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA== -bindings@^1.5.0: - version "1.5.0" - resolved "https://registry.yarnpkg.com/bindings/-/bindings-1.5.0.tgz#10353c9e945334bc0511a6d90b38fbc7c9c504df" - integrity sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ== - dependencies: - file-uri-to-path "1.0.0" - bintrees@1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/bintrees/-/bintrees-1.0.2.tgz#49f896d6e858a4a499df85c38fb399b9aff840f8" @@ -4224,20 +4152,6 @@ bootstrap@^5.2.3: resolved "https://registry.yarnpkg.com/bootstrap/-/bootstrap-5.3.3.tgz#de35e1a765c897ac940021900fcbb831602bac38" integrity sha512-8HLCdWgyoMguSO9o+aH+iuZ+aht+mzW0u3HIMzVu7Srrpv7EBBxTnrFlSCskwdY1+EOFQSm7uMJhNQHkdPcmjg== -bplist-creator@0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/bplist-creator/-/bplist-creator-0.1.0.tgz#018a2d1b587f769e379ef5519103730f8963ba1e" - integrity sha512-sXaHZicyEEmY86WyueLTQesbeoH/mquvarJaQNbjuOQO+7gbFcDEWqKmcWA4cOTLzFlfgvkiVxolk1k5bBIpmg== - dependencies: - stream-buffers "2.2.x" - -bplist-parser@0.3.1: - version "0.3.1" - resolved "https://registry.yarnpkg.com/bplist-parser/-/bplist-parser-0.3.1.tgz#e1c90b2ca2a9f9474cc72f6862bbf3fee8341fd1" - integrity sha512-PyJxiNtA5T2PlLIeBot4lbp7rj4OadzjnMZD/G5zuBNt8ei/yCU7+wW0h2bag9vr8c+/WuRWmSxbqAl9hL1rBA== - dependencies: - big-integer "1.6.x" - brace-expansion@^1.1.7: version "1.1.11" resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" @@ -4253,22 +4167,6 @@ brace-expansion@^2.0.1: dependencies: balanced-match "^1.0.0" -braces@^2.3.1: - version "2.3.2" - resolved "https://registry.yarnpkg.com/braces/-/braces-2.3.2.tgz#5979fd3f14cd531565e5fa2df1abfff1dfaee729" - integrity sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w== - dependencies: - arr-flatten "^1.1.0" - array-unique "^0.3.2" - extend-shallow "^2.0.1" - fill-range "^4.0.0" - isobject "^3.0.1" - repeat-element "^1.1.2" - snapdragon "^0.8.1" - snapdragon-node "^2.0.1" - split-string "^3.0.2" - to-regex "^3.0.1" - braces@^3.0.3, braces@~3.0.2: version "3.0.3" resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.3.tgz#490332f40919452272d55a8480adc0c441358789" @@ -4310,7 +4208,7 @@ bser@2.1.1: dependencies: node-int64 "^0.4.0" -buffer-crc32@^0.2.13, buffer-crc32@~0.2.3: +buffer-crc32@~0.2.3: version "0.2.13" resolved "https://registry.yarnpkg.com/buffer-crc32/-/buffer-crc32-0.2.13.tgz#0d333e3f00eac50aa1454abd30ef8c2a5d9a7242" integrity sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ== @@ -4371,34 +4269,11 @@ cacache@^18.0.0, cacache@^18.0.3: tar "^6.1.11" unique-filename "^3.0.0" -cache-base@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/cache-base/-/cache-base-1.0.1.tgz#0a7f46416831c8b662ee36fe4e7c59d76f666ab2" - integrity sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ== - dependencies: - collection-visit "^1.0.0" - component-emitter "^1.2.1" - get-value "^2.0.6" - has-value "^1.0.0" - isobject "^3.0.1" - set-value "^2.0.0" - to-object-path "^0.3.0" - union-value "^1.0.0" - unset-value "^1.0.0" - cachedir@^2.3.0: version "2.4.0" resolved "https://registry.yarnpkg.com/cachedir/-/cachedir-2.4.0.tgz#7fef9cf7367233d7c88068fe6e34ed0d355a610d" integrity sha512-9EtFOZR8g22CL7BWjJ9BUx1+A/djkofnyW3aOXZORNW2kxoUpx2h+uN2cOqwPmFhnpVmxg+KW2OjOSgChTEvsQ== -call-bind-apply-helpers@^1.0.0, call-bind-apply-helpers@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.1.tgz#32e5892e6361b29b0b545ba6f7763378daca2840" - integrity sha512-BhYE+WDaywFg2TBWYNXAE+8B1ATnThNBqXHP5nQu0jWJdVvY2hvkpyB3qOmtmDePiS5/BDQ8wASEWGMWRG148g== - dependencies: - es-errors "^1.3.0" - function-bind "^1.1.2" - call-bind@^1.0.2, call-bind@^1.0.5, call-bind@^1.0.6, call-bind@^1.0.7: version "1.0.7" resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.7.tgz#06016599c40c56498c18769d2730be242b6fa3b9" @@ -4410,24 +4285,6 @@ call-bind@^1.0.2, call-bind@^1.0.5, call-bind@^1.0.6, call-bind@^1.0.7: get-intrinsic "^1.2.4" set-function-length "^1.2.1" -call-bind@^1.0.8: - version "1.0.8" - resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.8.tgz#0736a9660f537e3388826f440d5ec45f744eaa4c" - integrity sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww== - dependencies: - call-bind-apply-helpers "^1.0.0" - es-define-property "^1.0.0" - get-intrinsic "^1.2.4" - set-function-length "^1.2.2" - -call-bound@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/call-bound/-/call-bound-1.0.3.tgz#41cfd032b593e39176a71533ab4f384aa04fd681" - integrity sha512-YTd+6wGlNlPxSuri7Y6X8tY2dmm12UMH66RpKMhiX6rsk5wXXnYgbUcOt8kiS31/AjfoTOvCsE+w8nZQLQnzHA== - dependencies: - call-bind-apply-helpers "^1.0.1" - get-intrinsic "^1.2.6" - caller-callsite@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/caller-callsite/-/caller-callsite-2.0.0.tgz#847e0fce0a223750a9a027c54b33731ad3154134" @@ -4481,13 +4338,6 @@ caniuse-lite@^1.0.30001688: resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001690.tgz#f2d15e3aaf8e18f76b2b8c1481abde063b8104c8" integrity sha512-5ExiE3qQN6oF8Clf8ifIDcMRCRE/dMGcETG/XGMD8/XiXm6HXQgQTh1yZYLXXpSOsEUlJm1Xr7kGULZTuGtP/w== -capture-exit@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/capture-exit/-/capture-exit-2.0.0.tgz#fb953bfaebeb781f62898239dabb426d08a509a4" - integrity sha512-PiT/hQmTonHhl/HFGN+Lx3JJUznrVYJ3+AQsnthneZbvW7x+f08Tk7yLJTLEOUvBTbduLeeBkxEaYXUOUrRq6g== - dependencies: - rsvp "^4.8.4" - caseless@~0.12.0: version "0.12.0" resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" @@ -4501,7 +4351,7 @@ chalk@4.1.0: ansi-styles "^4.1.0" supports-color "^7.1.0" -chalk@^2.0.0, chalk@^2.0.1, chalk@^2.4.1, chalk@^2.4.2: +chalk@^2.4.1: version "2.4.2" resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== @@ -4510,14 +4360,6 @@ chalk@^2.0.0, chalk@^2.0.1, chalk@^2.4.1, chalk@^2.4.2: escape-string-regexp "^1.0.5" supports-color "^5.3.0" -chalk@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-3.0.0.tgz#3f73c2bf526591f574cc492c51e2456349f844e4" - integrity sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg== - dependencies: - ansi-styles "^4.1.0" - supports-color "^7.1.0" - chalk@^4.0.0, chalk@^4.0.2, chalk@^4.1.0, chalk@^4.1.1, chalk@^4.1.2: version "4.1.2" resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" @@ -4531,11 +4373,6 @@ char-regex@^1.0.2: resolved "https://registry.yarnpkg.com/char-regex/-/char-regex-1.0.2.tgz#d744358226217f981ed58f479b1d6bcc29545dcf" integrity sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw== -chardet@^0.4.0: - version "0.4.2" - resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.4.2.tgz#b5473b33dc97c424e5d98dc87d55d4d8a29c8bf2" - integrity sha512-j/Toj7f1z98Hh2cYo2BVr85EpIRWqUi7rtRSGxh/cqUjqrnJe9l9UE7IUGd2vQ2p+kSHLkSzObQPZPLUC6TQwg== - chardet@^0.7.0: version "0.7.0" resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.7.0.tgz#90094849f0937f2eedc2425d0d28a9e5f0cbad9e" @@ -4586,16 +4423,6 @@ cjs-module-lexer@^1.0.0, cjs-module-lexer@^1.2.2: resolved "https://registry.yarnpkg.com/cjs-module-lexer/-/cjs-module-lexer-1.2.3.tgz#6c370ab19f8a3394e318fe682686ec0ac684d107" integrity sha512-0TNiGstbQmCFwt4akjjBg5pLRTSyj/PkWQ1ZoO2zntmg9yLqSRxwEa4iCfQLGjqhiqBfOJa7W/E8wfGrTDmlZQ== -class-utils@^0.3.5: - version "0.3.6" - resolved "https://registry.yarnpkg.com/class-utils/-/class-utils-0.3.6.tgz#f93369ae8b9a7ce02fd41faad0ca83033190c463" - integrity sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg== - dependencies: - arr-union "^3.1.0" - define-property "^0.2.5" - isobject "^3.0.0" - static-extend "^0.1.1" - classnames@^2.3.2: version "2.3.2" resolved "https://registry.yarnpkg.com/classnames/-/classnames-2.3.2.tgz#351d813bf0137fcc6a76a16b88208d2560a0d924" @@ -4613,23 +4440,11 @@ cli-cursor@3.1.0, cli-cursor@^3.1.0: dependencies: restore-cursor "^3.1.0" -cli-cursor@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-2.1.0.tgz#b35dac376479facc3e94747d41d0d0f5238ffcb5" - integrity sha512-8lgKz8LmCRYZZQDpRyT2m5rKJ08TnU4tR9FFFW2rxpxR1FzWi4PQ/NfyODchAatHaUgnSPVcx/R5w6NuTBzFiw== - dependencies: - restore-cursor "^2.0.0" - cli-spinners@2.6.1: version "2.6.1" resolved "https://registry.yarnpkg.com/cli-spinners/-/cli-spinners-2.6.1.tgz#adc954ebe281c37a6319bfa401e6dd2488ffb70d" integrity sha512-x/5fWmGMnbKQAaNwN+UZlV79qBLM9JFnJuJ03gIi5whrob0xV0ofNVHy9DhwGdsMJQc2OKv0oGmLzvaqvAVv+g== -cli-spinners@^2.0.0: - version "2.9.2" - resolved "https://registry.yarnpkg.com/cli-spinners/-/cli-spinners-2.9.2.tgz#1773a8f4b9c4d6ac31563df53b3fc1d79462fe41" - integrity sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg== - cli-spinners@^2.5.0: version "2.7.0" resolved "https://registry.yarnpkg.com/cli-spinners/-/cli-spinners-2.7.0.tgz#f815fd30b5f9eaac02db604c7a231ed7cb2f797a" @@ -4660,25 +4475,11 @@ cli-truncate@^3.1.0: slice-ansi "^5.0.0" string-width "^5.0.0" -cli-width@^2.0.0: - version "2.2.1" - resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-2.2.1.tgz#b0433d0b4e9c847ef18868a4ef16fd5fc8271c48" - integrity sha512-GRMWDxpOB6Dgk2E5Uo+3eEBvtOOlimMmpbFiKuLFnQzYDavtLFY3K5ona41jgN/WdRZtG7utuVSVTL4HbZHGkw== - cli-width@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-3.0.0.tgz#a2f48437a2caa9a22436e794bf071ec9e61cedf6" integrity sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw== -cliui@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/cliui/-/cliui-5.0.0.tgz#deefcfdb2e800784aa34f46fa08e06851c7bbbc5" - integrity sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA== - dependencies: - string-width "^3.1.0" - strip-ansi "^5.2.0" - wrap-ansi "^5.1.0" - cliui@^6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/cliui/-/cliui-6.0.0.tgz#511d702c0c4e41ca156d7d0e96021f23e13225b1" @@ -4735,14 +4536,6 @@ collect-v8-coverage@^1.0.0: resolved "https://registry.yarnpkg.com/collect-v8-coverage/-/collect-v8-coverage-1.0.1.tgz#cc2c8e94fc18bbdffe64d6534570c8a673b27f59" integrity sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg== -collection-visit@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/collection-visit/-/collection-visit-1.0.0.tgz#4bc0373c164bc3291b4d368c829cf1a80a59dca0" - integrity sha512-lNkKvzEeMBBjUGHZ+q6z9pSJla0KWAQPvtzhEV9+iGyQYG+pBpl7xKDhxoNSOZH2hhv0v5k0y2yAM4o4SjoSkw== - dependencies: - map-visit "^1.0.0" - object-visit "^1.0.0" - color-convert@^1.9.0, color-convert@^1.9.3: version "1.9.3" resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" @@ -4775,7 +4568,7 @@ color-string@^1.6.0: color-name "^1.0.0" simple-swizzle "^0.2.2" -color-support@1.1.3, color-support@^1.1.2, color-support@^1.1.3: +color-support@1.1.3, color-support@^1.1.2: version "1.1.3" resolved "https://registry.yarnpkg.com/color-support/-/color-support-1.1.3.tgz#93834379a1cc9a0c61f82f52f0d04322251bd5a2" integrity sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg== @@ -4831,7 +4624,7 @@ commander@^10.0.1: resolved "https://registry.yarnpkg.com/commander/-/commander-10.0.1.tgz#881ee46b4f77d1c1dccc5823433aa39b022cbe06" integrity sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug== -commander@^2.19.0, commander@^2.20.0: +commander@^2.20.0: version "2.20.3" resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== @@ -4889,11 +4682,6 @@ compare-func@^2.0.0: array-ify "^1.0.0" dot-prop "^5.1.0" -component-emitter@^1.2.1: - version "1.3.1" - resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.3.1.tgz#ef1d5796f7d93f135ee6fb684340b26403c97d17" - integrity sha512-T0+barUSQRTUQASh8bx02dl+DhF54GtIDY13Y3m9oWTklKbb3Wv974meRpeZ3lp1JpLVECWWNHC4vaG2XHXouQ== - compressible@~2.0.16, compressible@~2.0.18: version "2.0.18" resolved "https://registry.yarnpkg.com/compressible/-/compressible-2.0.18.tgz#af53cca6b070d4c3c0750fbd77286a6d7cc46fba" @@ -4932,16 +4720,6 @@ concat-map@0.0.1: resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== -concat-stream@^1.6.0: - version "1.6.2" - resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.2.tgz#904bdf194cd3122fc675c77fc4ac3d4ff0fd1a34" - integrity sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw== - dependencies: - buffer-from "^1.0.0" - inherits "^2.0.3" - readable-stream "^2.2.2" - typedarray "^0.0.6" - concat-stream@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-2.0.0.tgz#414cf5af790a48c60ab9be4527d56d5e41133cb1" @@ -5085,11 +4863,6 @@ cookie@0.7.2: resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.7.2.tgz#556369c472a2ba910f2979891b526b3436237ed7" integrity sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w== -copy-descriptor@^0.1.0: - version "0.1.1" - resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d" - integrity sha512-XgZ0pFcakEUlbwQEVNg3+QAis1FyTL3Qel9FYy8pSkQqoG3PNoT0bOCQtOXcOkur21r2Eq2kI+IE+gsmAEVlYw== - core-js-compat@^3.38.0: version "3.39.0" resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.39.0.tgz#b12dccb495f2601dc860bdbe7b4e3ffa8ba63f61" @@ -5097,11 +4870,6 @@ core-js-compat@^3.38.0: dependencies: browserslist "^4.24.2" -core-js@^2.4.1: - version "2.6.12" - resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.6.12.tgz#d9333dfa7b065e347cc5682219d6f690859cc2ec" - integrity sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ== - core-util-is@1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" @@ -5157,26 +4925,6 @@ cross-env@^7.0.3: dependencies: cross-spawn "^7.0.1" -cross-spawn@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-5.1.0.tgz#e8bd0efee58fcff6f8f94510a0a554bbfa235449" - integrity sha512-pTgQJ5KC0d2hcY8eyL1IzlBPYjTkyH72XRZPnLyKus2mBfNjQs3klqbJU2VILqZryAZUt9JOb3h/mWMy23/f5A== - dependencies: - lru-cache "^4.0.1" - shebang-command "^1.2.0" - which "^1.2.9" - -cross-spawn@^6.0.0: - version "6.0.6" - resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.6.tgz#30d0efa0712ddb7eb5a76e1e8721bffafa6b5d57" - integrity sha512-VqCUuhcd1iB+dsv8gxPttb5iZh/D0iubSP21g36KXdEuf6I5JiioesUVjpCdHV9MZRUfVFlvwtIUyPfxo5trtw== - dependencies: - nice-try "^1.0.4" - path-key "^2.0.1" - semver "^5.5.0" - shebang-command "^1.2.0" - which "^1.2.9" - cross-spawn@^6.0.5: version "6.0.5" resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4" @@ -5309,7 +5057,7 @@ dayjs@^1.10.4, dayjs@^1.8.15: resolved "https://registry.yarnpkg.com/dayjs/-/dayjs-1.11.13.tgz#92430b0139055c3ebb60150aa13e860a4b5a366c" integrity sha512-oaMBel6gjolK862uaPQOVTA7q3TZhuSvuMQAAglQDOWYO9A91IrAOUJEyKVlqJlHE0vq5p5UXxzdPfMH/x6xNg== -debug@2.6.9, debug@^2.2.0, debug@^2.3.3: +debug@2.6.9, debug@^2.2.0: version "2.6.9" resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== @@ -5348,11 +5096,6 @@ decimal.js@^10.4.2: resolved "https://registry.yarnpkg.com/decimal.js/-/decimal.js-10.4.3.tgz#1044092884d245d1b7f65725fa4ad4c6f781cc23" integrity sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA== -decode-uri-component@^0.2.0: - version "0.2.2" - resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.2.tgz#e69dbe25d37941171dd540e024c444cd5188e1e9" - integrity sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ== - dedent@1.5.3, dedent@^1.0.0: version "1.5.3" resolved "https://registry.yarnpkg.com/dedent/-/dedent-1.5.3.tgz#99aee19eb9bae55a67327717b6e848d0bf777e5a" @@ -5368,16 +5111,16 @@ deep-is@^0.1.3, deep-is@~0.1.3: resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831" integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== -deepmerge@^3.2.0: - version "3.3.0" - resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-3.3.0.tgz#d3c47fd6f3a93d517b14426b0628a17b0125f5f7" - integrity sha512-GRQOafGHwMHpjPx9iCvTgpu9NojZ49q794EEL94JVEw6VaeA8XTUyBKvAkOOjBX9oJNiV6G3P+T+tihFjo2TqA== - deepmerge@^4.2.2: version "4.2.2" resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-4.2.2.tgz#44d2ea3679b8f4d4ffba33f03d865fc1e7bf4955" integrity sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg== +deepmerge@^4.3.0: + version "4.3.1" + resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-4.3.1.tgz#44b5f2147cd3b00d4b56137685966f26fd25dd4a" + integrity sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A== + defaults@^1.0.3: version "1.0.4" resolved "https://registry.yarnpkg.com/defaults/-/defaults-1.0.4.tgz#b0b02062c1e2aa62ff5d9528f0f98baa90978d7a" @@ -5385,7 +5128,7 @@ defaults@^1.0.3: dependencies: clone "^1.0.2" -define-data-property@^1.0.1, define-data-property@^1.1.2, define-data-property@^1.1.4: +define-data-property@^1.0.1, define-data-property@^1.1.2: version "1.1.4" resolved "https://registry.yarnpkg.com/define-data-property/-/define-data-property-1.1.4.tgz#894dc141bb7d3060ae4366f6a0107e68fbe48c5e" integrity sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A== @@ -5408,28 +5151,6 @@ define-properties@^1.1.3, define-properties@^1.1.4, define-properties@^1.2.0, de has-property-descriptors "^1.0.0" object-keys "^1.1.1" -define-property@^0.2.5: - version "0.2.5" - resolved "https://registry.yarnpkg.com/define-property/-/define-property-0.2.5.tgz#c35b1ef918ec3c990f9a5bc57be04aacec5c8116" - integrity sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA== - dependencies: - is-descriptor "^0.1.0" - -define-property@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/define-property/-/define-property-1.0.0.tgz#769ebaaf3f4a63aad3af9e8d304c9bbe79bfb0e6" - integrity sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA== - dependencies: - is-descriptor "^1.0.0" - -define-property@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/define-property/-/define-property-2.0.2.tgz#d459689e8d654ba77e02a817f8710d702cb16e9d" - integrity sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ== - dependencies: - is-descriptor "^1.0.2" - isobject "^3.0.1" - delayed-stream@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" @@ -5460,6 +5181,15 @@ dependency-tree@^10.0.9: precinct "^11.0.5" typescript "^5.0.4" +deprecated-react-native-prop-types@^4.2.3: + version "4.2.3" + resolved "https://registry.yarnpkg.com/deprecated-react-native-prop-types/-/deprecated-react-native-prop-types-4.2.3.tgz#0ef845c1a80ef1636bd09060e4cdf70f9727e5ad" + integrity sha512-2rLTiMKidIFFYpIVM69UnQKngLqQfL6I11Ch8wGSBftS18FUXda+o2we2950X+1dmbgps28niI3qwyH4eX3Z1g== + dependencies: + "@react-native/normalize-colors" "<0.73.0" + invariant "^2.2.4" + prop-types "^15.8.1" + deprecation@^2.0.0: version "2.3.1" resolved "https://registry.yarnpkg.com/deprecation/-/deprecation-2.3.1.tgz#6368cbdb40abf3373b525ac87e4a260c3a700919" @@ -5625,15 +5355,6 @@ dottie@^2.0.6: resolved "https://registry.yarnpkg.com/dottie/-/dottie-2.0.6.tgz#34564ebfc6ec5e5772272d466424ad5b696484d4" integrity sha512-iGCHkfUc5kFekGiqhe8B/mdaurD+lakO9txNnTvKtA6PISrw86LgqHvRzWYPyoE2Ph5aMIrCw9/uko6XHTKCwA== -dunder-proto@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/dunder-proto/-/dunder-proto-1.0.1.tgz#d7ae667e1dc83482f8b70fd0f6eefc50da30f58a" - integrity sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A== - dependencies: - call-bind-apply-helpers "^1.0.1" - es-errors "^1.3.0" - gopd "^1.2.0" - duplexer@^0.1.1, duplexer@~0.1.1: version "0.1.2" resolved "https://registry.yarnpkg.com/duplexer/-/duplexer-0.1.2.tgz#3abe43aef3835f8ae077d136ddce0f276b0400e6" @@ -5686,11 +5407,6 @@ emittery@^0.13.1: resolved "https://registry.yarnpkg.com/emittery/-/emittery-0.13.1.tgz#c04b8c3457490e0847ae51fced3af52d338e3dad" integrity sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ== -emoji-regex@^7.0.1: - version "7.0.3" - resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-7.0.3.tgz#933a04052860c85e83c122479c4748a8e4c72156" - integrity sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA== - emoji-regex@^8.0.0: version "8.0.0" resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" @@ -5716,7 +5432,7 @@ encodeurl@~2.0.0: resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-2.0.0.tgz#7b8ea898077d7e409d3ac45474ea38eaf0857a58" integrity sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg== -encoding@^0.1.11, encoding@^0.1.13: +encoding@^0.1.13: version "0.1.13" resolved "https://registry.yarnpkg.com/encoding/-/encoding-0.1.13.tgz#56574afdd791f54a8e9b2785c0582a2d26210fa9" integrity sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A== @@ -5797,7 +5513,7 @@ error-stack-parser@^2.0.6: dependencies: stackframe "^1.3.4" -errorhandler@^1.5.0: +errorhandler@^1.5.1: version "1.5.1" resolved "https://registry.yarnpkg.com/errorhandler/-/errorhandler-1.5.1.tgz#b9ba5d17cf90744cd1e851357a6e75bf806a9a91" integrity sha512-rcOwbfvP1WTViVoUjcfZicVzjhjTuhSMntHh6mW3IrEiyE6mJyXvsToJUJGlGlw/2xU9P5whlWNGlIDVeCiT4A== @@ -5864,11 +5580,6 @@ es-define-property@^1.0.0: dependencies: get-intrinsic "^1.2.4" -es-define-property@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/es-define-property/-/es-define-property-1.0.1.tgz#983eb2f9a6724e9303f61addf011c72e09e0b0fa" - integrity sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g== - es-errors@^1.0.0, es-errors@^1.2.1, es-errors@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/es-errors/-/es-errors-1.3.0.tgz#05f75a25dab98e4fb1dcd5e1472c0546d5057c8f" @@ -5894,13 +5605,6 @@ es-iterator-helpers@^1.0.12: iterator.prototype "^1.1.2" safe-array-concat "^1.0.1" -es-object-atoms@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/es-object-atoms/-/es-object-atoms-1.0.0.tgz#ddb55cd47ac2e240701260bc2a8e31ecb643d941" - integrity sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw== - dependencies: - es-errors "^1.3.0" - es-set-tostringtag@^2.0.1, es-set-tostringtag@^2.0.3: version "2.0.3" resolved "https://registry.yarnpkg.com/es-set-tostringtag/-/es-set-tostringtag-2.0.3.tgz#8bb60f0a440c2e4281962428438d58545af39777" @@ -6178,7 +5882,7 @@ espree@^9.6.0, espree@^9.6.1: acorn-jsx "^5.3.2" eslint-visitor-keys "^3.4.1" -esprima@^4.0.0, esprima@^4.0.1: +esprima@^4.0.0, esprima@^4.0.1, esprima@~4.0.0: version "4.0.1" resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== @@ -6245,21 +5949,11 @@ eventemitter2@6.4.7: resolved "https://registry.yarnpkg.com/eventemitter2/-/eventemitter2-6.4.7.tgz#a7f6c4d7abf28a14c1ef3442f21cb306a054271d" integrity sha512-tYUSVOGeQPKt/eC1ABfhHy5Xd96N3oIijJvN3O9+TsC28T5V9yX9oEfEK5faP0EFSNVOG97qtAS68GBrQB2hDg== -eventemitter3@^3.0.0: - version "3.1.2" - resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-3.1.2.tgz#2d3d48f9c346698fce83a85d7d664e98535df6e7" - integrity sha512-tvtQIeLVHjDkJYnzf2dgVMxfuSGJeM/7UCG17TT4EumTfNtF+0nebF/4zWOIkCreAbtNqhGEboB6BWrwqNaw4Q== - eventemitter3@^4.0.4: version "4.0.7" resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-4.0.7.tgz#2de9b68f6528d5644ef5c59526a1b4a07306169f" integrity sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw== -exec-sh@^0.3.2: - version "0.3.6" - resolved "https://registry.yarnpkg.com/exec-sh/-/exec-sh-0.3.6.tgz#ff264f9e325519a60cb5e273692943483cca63bc" - integrity sha512-nQn+hI3yp+oD0huYhKwvYI32+JFeq+XkNcD1GAo3Y/MjxsfVGmrrzrnzjWiNY6f+pUCP440fThsFh5gZrRAU/w== - execa@4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/execa/-/execa-4.1.0.tgz#4e5491ad1572f2f17a77d388c6c857135b22847a" @@ -6305,19 +5999,6 @@ execa@5.1.1, execa@^5.0.0: signal-exit "^3.0.3" strip-final-newline "^2.0.0" -execa@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/execa/-/execa-1.0.0.tgz#c6236a5bb4df6d6f15e88e7f017798216749ddd8" - integrity sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA== - dependencies: - cross-spawn "^6.0.0" - get-stream "^4.0.0" - is-stream "^1.1.0" - npm-run-path "^2.0.0" - p-finally "^1.0.0" - signal-exit "^3.0.0" - strip-eof "^1.0.0" - execa@^6.1.0: version "6.1.0" resolved "https://registry.yarnpkg.com/execa/-/execa-6.1.0.tgz#cea16dee211ff011246556388effa0818394fb20" @@ -6345,19 +6026,6 @@ exit@^0.1.2: resolved "https://registry.yarnpkg.com/exit/-/exit-0.1.2.tgz#0632638f8d877cc82107d30a0fff1a17cba1cd0c" integrity sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ== -expand-brackets@^2.1.4: - version "2.1.4" - resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-2.1.4.tgz#b77735e315ce30f6b6eff0f83b04151a22449622" - integrity sha512-w/ozOKR9Obk3qoWeY/WDi6MFta9AoMR+zud60mdnbniMcBxRuFJyDt2LdX/14A1UABeqk+Uk+LDfUpvoGKppZA== - dependencies: - debug "^2.3.3" - define-property "^0.2.5" - extend-shallow "^2.0.1" - posix-character-classes "^0.1.0" - regex-not "^1.0.0" - snapdragon "^0.8.1" - to-regex "^3.0.1" - expect@^29.0.0, expect@^29.7.0: version "29.7.0" resolved "https://registry.yarnpkg.com/expect/-/expect-29.7.0.tgz#578874590dcb3214514084c08115d8aee61e11bc" @@ -6411,42 +6079,11 @@ express@^4.18.2: utils-merge "1.0.1" vary "~1.1.2" -extend-shallow@^1.1.2: - version "1.1.4" - resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-1.1.4.tgz#19d6bf94dfc09d76ba711f39b872d21ff4dd9071" - integrity sha512-L7AGmkO6jhDkEBBGWlLtftA80Xq8DipnrRPr0pyi7GQLXkaq9JYA4xF4z6qnadIC6euiTDKco0cGSU9muw+WTw== - dependencies: - kind-of "^1.1.0" - -extend-shallow@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-2.0.1.tgz#51af7d614ad9a9f610ea1bafbb989d6b1c56890f" - integrity sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug== - dependencies: - is-extendable "^0.1.0" - -extend-shallow@^3.0.0, extend-shallow@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-3.0.2.tgz#26a71aaf073b39fb2127172746131c2704028db8" - integrity sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q== - dependencies: - assign-symbols "^1.0.0" - is-extendable "^1.0.1" - extend@~3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== -external-editor@^2.0.4: - version "2.2.0" - resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-2.2.0.tgz#045511cfd8d133f3846673d1047c154e214ad3d5" - integrity sha512-bSn6gvGxKt+b7+6TKEv1ZycHleA7aHhRHyAqJyp5pbUFuYYNIzpZnQDk7AsYckyWdEnTeAnay0aCy2aV6iTk9A== - dependencies: - chardet "^0.4.0" - iconv-lite "^0.4.17" - tmp "^0.0.33" - external-editor@^3.0.3: version "3.1.0" resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-3.1.0.tgz#cb03f740befae03ea4d283caed2741a83f335495" @@ -6456,20 +6093,6 @@ external-editor@^3.0.3: iconv-lite "^0.4.24" tmp "^0.0.33" -extglob@^2.0.4: - version "2.0.4" - resolved "https://registry.yarnpkg.com/extglob/-/extglob-2.0.4.tgz#ad00fe4dc612a9232e8718711dc5cb5ab0285543" - integrity sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw== - dependencies: - array-unique "^0.3.2" - define-property "^1.0.0" - expand-brackets "^2.1.4" - extend-shallow "^2.0.1" - fragment-cache "^0.2.1" - regex-not "^1.0.0" - snapdragon "^0.8.1" - to-regex "^3.0.1" - extract-zip@2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/extract-zip/-/extract-zip-2.0.1.tgz#663dca56fe46df890d5f131ef4a06d22bb8ba13a" @@ -6491,16 +6114,6 @@ extsprintf@^1.2.0: resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.4.1.tgz#8d172c064867f235c0c84a596806d279bf4bcc07" integrity sha512-Wrk35e8ydCKDj/ArClo1VrPVmN8zph5V4AtHwIuHhvMXsKf73UT3BOD+azBIW+3wOJ4FhEH7zyaJCFvChjYvMA== -fancy-log@^1.3.2: - version "1.3.3" - resolved "https://registry.yarnpkg.com/fancy-log/-/fancy-log-1.3.3.tgz#dbc19154f558690150a23953a0adbd035be45fc7" - integrity sha512-k9oEhlyc0FrVh25qYuSELjr8oxsCoc4/LEZfg2iJJrfEk/tZL9bCoJE47gqAvI2m/AUjluCS4+3I0eTx8n3AEw== - dependencies: - ansi-gray "^0.1.1" - color-support "^1.1.3" - parse-node-version "^1.0.0" - time-stamp "^1.0.0" - fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: version "3.1.3" resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" @@ -6532,6 +6145,13 @@ fast-levenshtein@^2.0.6, fast-levenshtein@~2.0.6: resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw== +fast-xml-parser@^4.0.12: + version "4.5.1" + resolved "https://registry.yarnpkg.com/fast-xml-parser/-/fast-xml-parser-4.5.1.tgz#a7e665ff79b7919100a5202f23984b6150f9b31e" + integrity sha512-y655CeyUQ+jj7KBbYMc4FG01V8ZQqjN+gDYGJ50RtfsUB8iG9AmwmwoAgeKLJdmueKKMrH1RJ7yXHTSoczdv5w== + dependencies: + strnum "^1.0.5" + fastq@^1.6.0: version "1.15.0" resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.15.0.tgz#d04d07c6a2a68fe4599fea8d2e103a937fae6b3a" @@ -6546,41 +6166,6 @@ fb-watchman@^2.0.0: dependencies: bser "2.1.1" -fbjs-css-vars@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/fbjs-css-vars/-/fbjs-css-vars-1.0.2.tgz#216551136ae02fe255932c3ec8775f18e2c078b8" - integrity sha512-b2XGFAFdWZWg0phtAWLHCk836A1Xann+I+Dgd3Gk64MHKZO44FfoD1KxyvbSh0qZsIoXQGGlVztIY+oitJPpRQ== - -fbjs-scripts@^1.1.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/fbjs-scripts/-/fbjs-scripts-1.2.0.tgz#069a0c0634242d10031c6460ef1fccefcdae8b27" - integrity sha512-5krZ8T0Bf8uky0abPoCLrfa7Orxd8UH4Qq8hRUF2RZYNMu+FmEOrBc7Ib3YVONmxTXTlLAvyrrdrVmksDb2OqQ== - dependencies: - "@babel/core" "^7.0.0" - ansi-colors "^1.0.1" - babel-preset-fbjs "^3.2.0" - core-js "^2.4.1" - cross-spawn "^5.1.0" - fancy-log "^1.3.2" - object-assign "^4.0.1" - plugin-error "^0.1.2" - semver "^5.1.0" - through2 "^2.0.0" - -fbjs@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/fbjs/-/fbjs-1.0.0.tgz#52c215e0883a3c86af2a7a776ed51525ae8e0a5a" - integrity sha512-MUgcMEJaFhCaF1QtWGnmq9ZDRAzECTCRAF7O6UZIlAlkTs1SasiX9aP0Iw7wfD2mJ7wDTNfg2w7u5fSCwJk1OA== - dependencies: - core-js "^2.4.1" - fbjs-css-vars "^1.0.0" - isomorphic-fetch "^2.1.1" - loose-envify "^1.0.0" - object-assign "^4.1.0" - promise "^7.1.1" - setimmediate "^1.0.5" - ua-parser-js "^0.7.18" - fd-slicer@~1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/fd-slicer/-/fd-slicer-1.1.0.tgz#25c7c89cb1f9077f8891bbe61d8f390eae256f1e" @@ -6600,13 +6185,6 @@ figures@3.2.0, figures@^3.0.0, figures@^3.2.0: dependencies: escape-string-regexp "^1.0.5" -figures@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/figures/-/figures-2.0.0.tgz#3ab1a2d2a62c8bfb431a0c94cb797a2fce27c962" - integrity sha512-Oa2M9atig69ZkfwiApY8F2Yy+tzMbazyvqv21R0NsSC8floSOC09BbT1ITWAdoMGQvJ/aZnR1KMwdx9tvHnTNA== - dependencies: - escape-string-regexp "^1.0.5" - file-entry-cache@^6.0.1: version "6.0.1" resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-6.0.1.tgz#211b2dd9659cb0394b073e7323ac3c933d522027" @@ -6614,11 +6192,6 @@ file-entry-cache@^6.0.1: dependencies: flat-cache "^3.0.4" -file-uri-to-path@1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz#553a7b8446ff6f684359c445f1e37a05dacc33dd" - integrity sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw== - filelist@^1.0.1: version "1.0.4" resolved "https://registry.yarnpkg.com/filelist/-/filelist-1.0.4.tgz#f78978a1e944775ff9e62e744424f215e58352b5" @@ -6644,16 +6217,6 @@ filing-cabinet@^4.1.6: tsconfig-paths "^4.2.0" typescript "^5.0.4" -fill-range@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-4.0.0.tgz#d544811d428f98eb06a63dc402d2403c328c38f7" - integrity sha512-VcpLTWqWDiTerugjj8e3+esbg+skS3M9e54UuR3iCeIDMXCLTsAH8hTSzDQU/X6/6t3eYkOKoZSef2PlU6U1XQ== - dependencies: - extend-shallow "^2.0.1" - is-number "^3.0.0" - repeat-string "^1.6.1" - to-regex-range "^2.1.0" - fill-range@^7.1.1: version "7.1.1" resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.1.1.tgz#44265d3cac07e3ea7dc247516380643754a05292" @@ -6744,6 +6307,21 @@ flatted@^3.1.0: resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.2.7.tgz#609f39207cb614b89d0765b477cb2d437fbf9787" integrity sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ== +flow-enums-runtime@^0.0.5: + version "0.0.5" + resolved "https://registry.yarnpkg.com/flow-enums-runtime/-/flow-enums-runtime-0.0.5.tgz#95884bfcc82edaf27eef7e1dd09732331cfbafbc" + integrity sha512-PSZF9ZuaZD03sT9YaIs0FrGJ7lSUw7rHZIex+73UYVXg46eL/wxN5PaVcPJFudE2cJu5f0fezitV5aBkLHPUOQ== + +flow-parser@0.*: + version "0.257.1" + resolved "https://registry.yarnpkg.com/flow-parser/-/flow-parser-0.257.1.tgz#1d563688f5c0b5a573ce380a86aa1cc2c44c65df" + integrity sha512-7+KYDpAXyBPD/wODhbPYO6IGUx+WwtJcLLG/r3DvbNyxaDyuYaTBKbSqeCldWQzuFcj+MsOVx2bpkEwVPB9JRw== + +flow-parser@^0.206.0: + version "0.206.0" + resolved "https://registry.yarnpkg.com/flow-parser/-/flow-parser-0.206.0.tgz#f4f794f8026535278393308e01ea72f31000bfef" + integrity sha512-HVzoK3r6Vsg+lKvlIZzaWNBVai+FXTX1wdYhz/wVlH13tb/gOdLXmlTqy6odmTBhT5UoWUbq0k8263Qhr9d88w== + fn.name@1.x.x: version "1.1.0" resolved "https://registry.yarnpkg.com/fn.name/-/fn.name-1.1.0.tgz#26cad8017967aea8731bc42961d04a3d5988accc" @@ -6761,11 +6339,6 @@ for-each@^0.3.3: dependencies: is-callable "^1.1.3" -for-in@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80" - integrity sha512-7EwmXrOjyL+ChxMhmG5lnW9MPt1aIeZEwKhQzoBUdTV0N3zuwWDZYVJatDvZ2OyzPUvdIAZDsCetk3coyMfcnQ== - foreground-child@^3.1.0: version "3.1.1" resolved "https://registry.yarnpkg.com/foreground-child/-/foreground-child-3.1.1.tgz#1d173e776d75d2772fed08efe4a0de1ea1b12d0d" @@ -6793,13 +6366,6 @@ forwarded@0.2.0: resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.2.0.tgz#2269936428aad4c15c7ebe9779a84bf0b2a81811" integrity sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow== -fragment-cache@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/fragment-cache/-/fragment-cache-0.2.1.tgz#4290fad27f13e89be7f33799c6bc5a0abfff0d19" - integrity sha512-GMBAbW9antB8iZRHLoGw0b3HANt57diZYFO/HL1JGIC1MjKrdmhxvrJbupnVvpys0zsz7yBApXdQyfepKly2kA== - dependencies: - map-cache "^0.2.2" - fresh@0.5.2: version "0.5.2" resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" @@ -6822,15 +6388,6 @@ fs-constants@^1.0.0: resolved "https://registry.yarnpkg.com/fs-constants/-/fs-constants-1.0.0.tgz#6be0de9be998ce16af8afc24497b9ee9b7ccd9ad" integrity sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow== -fs-extra@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-1.0.0.tgz#cd3ce5f7e7cb6145883fcae3191e9877f8587950" - integrity sha512-VerQV6vEKuhDWD2HGOybV6v5I73syoc/cXAbKlgTC7M/oFVEtklWlp9QH2Ijw3IaWDOQcMkldSPa7zXy79Z/UQ== - dependencies: - graceful-fs "^4.1.2" - jsonfile "^2.1.0" - klaw "^1.0.0" - fs-extra@^11.2.0: version "11.2.0" resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-11.2.0.tgz#e70e17dfad64232287d01929399e0ea7c86b0e5b" @@ -6878,14 +6435,6 @@ fs.realpath@^1.0.0: resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== -fsevents@^1.2.7: - version "1.2.13" - resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.2.13.tgz#f325cb0455592428bcf11b383370ef70e3bfcc38" - integrity sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw== - dependencies: - bindings "^1.5.0" - nan "^2.12.1" - fsevents@^2.3.2, fsevents@~2.3.2: version "2.3.2" resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a" @@ -6955,22 +6504,6 @@ get-intrinsic@^1.1.1, get-intrinsic@^1.1.3, get-intrinsic@^1.2.1, get-intrinsic@ has-symbols "^1.0.3" hasown "^2.0.0" -get-intrinsic@^1.2.6: - version "1.2.6" - resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.2.6.tgz#43dd3dd0e7b49b82b2dfcad10dc824bf7fc265d5" - integrity sha512-qxsEs+9A+u85HhllWJJFicJfPDhRmjzoYdl64aMWW9yRIJmSyxdn8IEkuIM530/7T+lv0TIHd8L6Q/ra0tEoeA== - dependencies: - call-bind-apply-helpers "^1.0.1" - dunder-proto "^1.0.0" - es-define-property "^1.0.1" - es-errors "^1.3.0" - es-object-atoms "^1.0.0" - function-bind "^1.1.2" - gopd "^1.2.0" - has-symbols "^1.1.0" - hasown "^2.0.2" - math-intrinsics "^1.0.0" - get-own-enumerable-property-symbols@^3.0.0: version "3.0.2" resolved "https://registry.yarnpkg.com/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.2.tgz#b5fde77f22cbe35f390b4e089922c50bce6ef664" @@ -7006,13 +6539,6 @@ get-stream@6.0.0: resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-6.0.0.tgz#3e0012cb6827319da2706e601a1583e8629a6718" integrity sha512-A1B3Bh1UmL0bidM/YX2NsCOTnGJePL9rO/M+Mw3m9f2gUpfokS0hi5Eah0WSUEWZdZhIZtMjkIYS7mDfOqNHbg== -get-stream@^4.0.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-4.1.0.tgz#c1b255575f3dc21d59bfc79cd3d2b46b1c3a54b5" - integrity sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w== - dependencies: - pump "^3.0.0" - get-stream@^5.0.0, get-stream@^5.1.0: version "5.2.0" resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-5.2.0.tgz#4966a1795ee5ace65e706c4b7beb71257d6e22d3" @@ -7034,11 +6560,6 @@ get-symbol-description@^1.0.2: es-errors "^1.3.0" get-intrinsic "^1.2.4" -get-value@^2.0.3, get-value@^2.0.6: - version "2.0.6" - resolved "https://registry.yarnpkg.com/get-value/-/get-value-2.0.6.tgz#dc15ca1c672387ca76bd37ac0a395ba2042a2c28" - integrity sha512-Ln0UQDlxH1BapMu3GPtf7CuYNwRZf2gwCuPqbyG6pB8WfmFpzqcy4xtAaAMUhnNqjMKTiCPZG2oMT3YSx8U2NA== - getos@^3.2.1: version "3.2.1" resolved "https://registry.yarnpkg.com/getos/-/getos-3.2.1.tgz#0134d1f4e00eb46144c5a9c0ac4dc087cbb27dc5" @@ -7138,7 +6659,7 @@ glob@^11.0.0, glob@~11.0.0: package-json-from-dist "^1.0.0" path-scurry "^2.0.0" -glob@^7.1.3, glob@^7.1.4, glob@^7.2.3: +glob@^7.1.1, glob@^7.1.3, glob@^7.1.4, glob@^7.2.3: version "7.2.3" resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== @@ -7223,12 +6744,7 @@ gopd@^1.0.1: dependencies: get-intrinsic "^1.1.3" -gopd@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/gopd/-/gopd-1.2.0.tgz#89f56b8217bdbc8802bd299df6d7f1081d7e51a1" - integrity sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg== - -graceful-fs@4.2.11, graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.2, graceful-fs@^4.1.3, graceful-fs@^4.1.6, graceful-fs@^4.1.9, graceful-fs@^4.2.0, graceful-fs@^4.2.4, graceful-fs@^4.2.6, graceful-fs@^4.2.9: +graceful-fs@4.2.11, graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.2, graceful-fs@^4.1.3, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.4, graceful-fs@^4.2.6, graceful-fs@^4.2.9: version "4.2.11" resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3" integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== @@ -7287,11 +6803,6 @@ has-symbols@^1.0.2, has-symbols@^1.0.3: resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.3.tgz#bb7b2c4349251dce87b125f7bdf874aa7c8b39f8" integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A== -has-symbols@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.1.0.tgz#fc9c6a783a084951d0b971fe1018de813707a338" - integrity sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ== - has-tostringtag@^1.0.0, has-tostringtag@^1.0.1, has-tostringtag@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/has-tostringtag/-/has-tostringtag-1.0.2.tgz#2cdc42d40bef2e5b4eeab7c01a73c54ce7ab5abc" @@ -7304,37 +6815,6 @@ has-unicode@2.0.1, has-unicode@^2.0.1: resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" integrity sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ== -has-value@^0.3.1: - version "0.3.1" - resolved "https://registry.yarnpkg.com/has-value/-/has-value-0.3.1.tgz#7b1f58bada62ca827ec0a2078025654845995e1f" - integrity sha512-gpG936j8/MzaeID5Yif+577c17TxaDmhuyVgSwtnL/q8UUTySg8Mecb+8Cf1otgLoD7DDH75axp86ER7LFsf3Q== - dependencies: - get-value "^2.0.3" - has-values "^0.1.4" - isobject "^2.0.0" - -has-value@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/has-value/-/has-value-1.0.0.tgz#18b281da585b1c5c51def24c930ed29a0be6b177" - integrity sha512-IBXk4GTsLYdQ7Rvt+GRBrFSVEkmuOUy4re0Xjd9kJSUQpnTrWR4/y9RpfexN9vkAPMFuQoeWKwqzPozRTlasGw== - dependencies: - get-value "^2.0.6" - has-values "^1.0.0" - isobject "^3.0.0" - -has-values@^0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/has-values/-/has-values-0.1.4.tgz#6d61de95d91dfca9b9a02089ad384bff8f62b771" - integrity sha512-J8S0cEdWuQbqD9//tlZxiMuMNmxB8PlEwvYwuxsTmR1G5RXUePEX/SJn7aD0GMLieuZYSwNH0cQuJGwnYunXRQ== - -has-values@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/has-values/-/has-values-1.0.0.tgz#95b0b63fec2146619a6fe57fe75628d5a39efe4f" - integrity sha512-ODYZC64uqzmtfGMEAX/FvZiRyWLpAC3vYnNunURUnkGVTS+mI0smVsWaPydRBsE3g+ok7h960jChO8mFcWlHaQ== - dependencies: - is-number "^3.0.0" - kind-of "^4.0.0" - hasown@^2.0.0, hasown@^2.0.1, hasown@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/hasown/-/hasown-2.0.2.tgz#003eaf91be7adc372e84ec59dc37252cedb80003" @@ -7342,10 +6822,17 @@ hasown@^2.0.0, hasown@^2.0.1, hasown@^2.0.2: dependencies: function-bind "^1.1.2" -hermes-engine@~0.5.0: - version "0.5.1" - resolved "https://registry.yarnpkg.com/hermes-engine/-/hermes-engine-0.5.1.tgz#601115e4b1e0a17d9aa91243b96277de4e926e09" - integrity sha512-hLwqh8dejHayjlpvZY40e1aDCDvyP98cWx/L5DhAjSJLH8g4z9Tp08D7y4+3vErDsncPOdf1bxm+zUWpx0/Fxg== +hermes-estree@0.12.0: + version "0.12.0" + resolved "https://registry.yarnpkg.com/hermes-estree/-/hermes-estree-0.12.0.tgz#8a289f9aee854854422345e6995a48613bac2ca8" + integrity sha512-+e8xR6SCen0wyAKrMT3UD0ZCCLymKhRgjEB5sS28rKiFir/fXgLoeRilRUssFCILmGHb+OvHDUlhxs0+IEyvQw== + +hermes-parser@0.12.0: + version "0.12.0" + resolved "https://registry.yarnpkg.com/hermes-parser/-/hermes-parser-0.12.0.tgz#114dc26697cfb41a6302c215b859b74224383773" + integrity sha512-d4PHnwq6SnDLhYl3LHNHvOg7nQ6rcI7QVil418REYksv0Mh3cEkHDcuhGxNQ3vgnLSLl4QSvDrFCwQNYdpWlzw== + dependencies: + hermes-estree "0.12.0" hermes-profile-transformer@^0.0.6: version "0.0.6" @@ -7470,7 +6957,7 @@ husky@^9.0.7: resolved "https://registry.yarnpkg.com/husky/-/husky-9.1.5.tgz#2b6edede53ee1adbbd3a3da490628a23f5243b83" integrity sha512-rowAVRUBfI0b4+niA4SJMhfQwc107VLkBUgEYYAOQAbqDCnra1nYh83hF/MDmhYs9t9n1E3DuKOrs2LYNC+0Ag== -iconv-lite@0.4.24, iconv-lite@^0.4.17, iconv-lite@^0.4.24: +iconv-lite@0.4.24, iconv-lite@^0.4.24: version "0.4.24" resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== @@ -7511,10 +6998,12 @@ ignore@~6.0.2: resolved "https://registry.yarnpkg.com/ignore/-/ignore-6.0.2.tgz#77cccb72a55796af1b6d2f9eb14fa326d24f4283" integrity sha512-InwqeHHN2XpumIkMvpl/DCJVrAHgCsG5+cn1XlnLWGwtZBm8QJfSusItfrwx81CTp5agNZqpKU2J/ccC5nGT4A== -image-size@^0.6.0: - version "0.6.3" - resolved "https://registry.yarnpkg.com/image-size/-/image-size-0.6.3.tgz#e7e5c65bb534bd7cdcedd6cb5166272a85f75fb2" - integrity sha512-47xSUiQioGaB96nqtp5/q55m0aBQSQdyIloMOc/x+QVTDZLNmXE892IIDrJ0hM1A5vcNUDD5tDffkSP5lCaIIA== +image-size@^1.0.2: + version "1.2.0" + resolved "https://registry.yarnpkg.com/image-size/-/image-size-1.2.0.tgz#312af27a2ff4ff58595ad00b9344dd684c910df6" + integrity sha512-4S8fwbO6w3GeCVN6OPtA9I5IGKkcDMPcKndtUlpJuCwu7JLjtj7JZpwqLuyY2nrmQT3AWsCJLSKPsc2mPBSl3w== + dependencies: + queue "6.0.2" immer@^10.0.3: version "10.1.1" @@ -7626,26 +7115,6 @@ init-package-json@6.0.3: validate-npm-package-license "^3.0.4" validate-npm-package-name "^5.0.0" -inquirer@^3.0.6: - version "3.3.0" - resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-3.3.0.tgz#9dd2f2ad765dcab1ff0443b491442a20ba227dc9" - integrity sha512-h+xtnyk4EwKvFWHrUYsWErEVR+igKtLdchu+o0Z1RL7VU/jVMFbYir2bp6bAj8efFNxWqHX0dIss6fJQ+/+qeQ== - dependencies: - ansi-escapes "^3.0.0" - chalk "^2.0.0" - cli-cursor "^2.1.0" - cli-width "^2.0.0" - external-editor "^2.0.4" - figures "^2.0.0" - lodash "^4.3.0" - mute-stream "0.0.7" - run-async "^2.2.0" - rx-lite "^4.0.8" - rx-lite-aggregates "^4.0.8" - string-width "^2.1.0" - strip-ansi "^4.0.0" - through "^2.3.6" - inquirer@^8.2.4: version "8.2.6" resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-8.2.6.tgz#733b74888195d8d400a67ac332011b5fae5ea562" @@ -7691,23 +7160,11 @@ ip-address@^9.0.5: jsbn "1.1.0" sprintf-js "^1.1.3" -ip@^1.1.5: - version "1.1.9" - resolved "https://registry.yarnpkg.com/ip/-/ip-1.1.9.tgz#8dfbcc99a754d07f425310b86a99546b1151e396" - integrity sha512-cyRxvOEpNHNtchU3Ln9KC/auJgup87llfQpQ+t5ghoC/UhL16SWzbueiCsdTnWmqAWl7LadfuwhlqmtOaqMHdQ== - ipaddr.js@1.9.1: version "1.9.1" resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.1.tgz#bff38543eeb8984825079ff3a2a8e6cbd46781b3" integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g== -is-accessor-descriptor@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-1.0.1.tgz#3223b10628354644b86260db29b3e693f5ceedd4" - integrity sha512-YBUanLI8Yoihw923YeFUS5fs0fF2f5TSFTNiYAAzhhDscDa3lEqYuz1pDOEP5KvX94I9ey3vsqjJcLVFVU+3QA== - dependencies: - hasown "^2.0.0" - is-arguments@^1.0.4: version "1.1.1" resolved "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz#15b3f88fda01f2a97fec84ca761a560f123efa9b" @@ -7763,11 +7220,6 @@ is-boolean-object@^1.1.0: call-bind "^1.0.2" has-tostringtag "^1.0.0" -is-buffer@^1.1.5: - version "1.1.6" - resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" - integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w== - is-builtin-module@^3.2.1: version "3.2.1" resolved "https://registry.yarnpkg.com/is-builtin-module/-/is-builtin-module-3.2.1.tgz#f03271717d8654cfcaf07ab0463faa3571581169" @@ -7787,13 +7239,6 @@ is-ci@3.0.1: dependencies: ci-info "^3.2.0" -is-ci@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-2.0.0.tgz#6bc6334181810e04b5c22b3d589fdca55026404c" - integrity sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w== - dependencies: - ci-info "^2.0.0" - is-core-module@^2.13.0, is-core-module@^2.13.1, is-core-module@^2.5.0, is-core-module@^2.9.0: version "2.15.1" resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.15.1.tgz#a7363a25bee942fefab0de13bf6aa372c82dcc37" @@ -7808,13 +7253,6 @@ is-core-module@^2.16.0: dependencies: hasown "^2.0.2" -is-data-descriptor@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-1.0.1.tgz#2109164426166d32ea38c405c1e0945d9e6a4eeb" - integrity sha512-bc4NlCDiCr28U4aEsQ3Qs2491gVq4V8G7MQyws968ImqjKuYtTJXrl7Vq7jsN7Ly/C3xj5KWFrY7sHNeDkAzXw== - dependencies: - hasown "^2.0.0" - is-date-object@^1.0.1, is-date-object@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.5.tgz#0841d5536e724c25597bf6ea62e1bd38298df31f" @@ -7822,22 +7260,6 @@ is-date-object@^1.0.1, is-date-object@^1.0.5: dependencies: has-tostringtag "^1.0.0" -is-descriptor@^0.1.0: - version "0.1.7" - resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-0.1.7.tgz#2727eb61fd789dcd5bdf0ed4569f551d2fe3be33" - integrity sha512-C3grZTvObeN1xud4cRWl366OMXZTj0+HGyk4hvfpx4ZHt1Pb60ANSXqCK7pdOTeUQpRzECBSTphqvD7U+l22Eg== - dependencies: - is-accessor-descriptor "^1.0.1" - is-data-descriptor "^1.0.1" - -is-descriptor@^1.0.0, is-descriptor@^1.0.2: - version "1.0.3" - resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-1.0.3.tgz#92d27cb3cd311c4977a4db47df457234a13cb306" - integrity sha512-JCNNGbwWZEVaSPtS45mdtrneRWJFp07LLmykxeFV5F6oBvNF8vHSfJuJgoT472pSfk+Mf8VnlrspaFBHWM8JAw== - dependencies: - is-accessor-descriptor "^1.0.1" - is-data-descriptor "^1.0.1" - is-directory@^0.3.1: version "0.3.1" resolved "https://registry.yarnpkg.com/is-directory/-/is-directory-0.3.1.tgz#61339b6f2475fc772fd9c9d83f5c8575dc154ae1" @@ -7848,18 +7270,6 @@ is-docker@^2.0.0, is-docker@^2.1.1: resolved "https://registry.yarnpkg.com/is-docker/-/is-docker-2.2.1.tgz#33eeabe23cfe86f14bde4408a02c0cfb853acdaa" integrity sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ== -is-extendable@^0.1.0, is-extendable@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89" - integrity sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw== - -is-extendable@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-1.0.1.tgz#a7470f9e426733d81bd81e1155264e3a3507cab4" - integrity sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA== - dependencies: - is-plain-object "^2.0.4" - is-extglob@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" @@ -7946,13 +7356,6 @@ is-number-object@^1.0.4: dependencies: has-tostringtag "^1.0.0" -is-number@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/is-number/-/is-number-3.0.0.tgz#24fd6201a4782cf50561c810276afc7d12d71195" - integrity sha512-4cboCqIpliH+mAvFNegjZQ4kgKc3ZUhQVr3HvWbSh5q3WH2v82ct+T2Y1hdU5Gdtorx/cLifQjqCbL7bpznLTg== - dependencies: - kind-of "^3.0.2" - is-number@^7.0.0: version "7.0.0" resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" @@ -7978,7 +7381,7 @@ is-plain-obj@^1.0.0, is-plain-obj@^1.1.0: resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-1.1.0.tgz#71a50c8429dfca773c92a390a4a03b39fcd51d3e" integrity sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg== -is-plain-object@^2.0.3, is-plain-object@^2.0.4: +is-plain-object@^2.0.4: version "2.0.4" resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677" integrity sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og== @@ -8044,11 +7447,6 @@ is-stream@2.0.0: resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.0.tgz#bde9c32680d6fae04129d6ac9d921ce7815f78e3" integrity sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw== -is-stream@^1.0.1, is-stream@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" - integrity sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ== - is-stream@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.1.tgz#fac1e3d53b97ad5a9d0ae9cef2389f5810a5c077" @@ -8127,11 +7525,6 @@ is-weakset@^2.0.1: call-bind "^1.0.2" get-intrinsic "^1.1.1" -is-windows@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d" - integrity sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA== - is-wsl@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-1.1.0.tgz#1f16e4aa22b04d1336b66188a66af3c600c3a66d" @@ -8144,16 +7537,16 @@ is-wsl@^2.2.0: dependencies: is-docker "^2.0.0" -isarray@1.0.0, isarray@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" - integrity sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ== - isarray@^2.0.5: version "2.0.5" resolved "https://registry.yarnpkg.com/isarray/-/isarray-2.0.5.tgz#8af1e4c1221244cc62459faf38940d4e644a5723" integrity sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw== +isarray@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" + integrity sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ== + isexe@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" @@ -8164,26 +7557,11 @@ isexe@^3.1.1: resolved "https://registry.yarnpkg.com/isexe/-/isexe-3.1.1.tgz#4a407e2bd78ddfb14bea0c27c6f7072dde775f0d" integrity sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ== -isobject@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89" - integrity sha512-+OUdGJlgjOBZDfxnDjYYG6zp487z0JGNQq3cYQYg5f5hKR+syHMsaztzGeml/4kGG55CSpKSpWTY+jYGgsHLgA== - dependencies: - isarray "1.0.0" - -isobject@^3.0.0, isobject@^3.0.1: +isobject@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" integrity sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg== -isomorphic-fetch@^2.1.1: - version "2.2.1" - resolved "https://registry.yarnpkg.com/isomorphic-fetch/-/isomorphic-fetch-2.2.1.tgz#611ae1acf14f5e81f729507472819fe9733558a9" - integrity sha512-9c4TNAKYXM5PRyVcwUZrF3W09nQ+sO7+jydgs4ZGW9dhsLG2VOlISJABombdQqQRXCwuYG3sYV/puGf5rp0qmA== - dependencies: - node-fetch "^1.0.1" - whatwg-fetch ">=0.10.0" - isomorphic-fetch@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/isomorphic-fetch/-/isomorphic-fetch-3.0.0.tgz#0267b005049046d2421207215d45d6a262b8b8b4" @@ -8409,7 +7787,7 @@ jest-environment-jsdom@^29.3.1: jest-util "^29.7.0" jsdom "^20.0.0" -jest-environment-node@^29.7.0: +jest-environment-node@^29.2.1, jest-environment-node@^29.7.0: version "29.7.0" resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-29.7.0.tgz#0b93e111dda8ec120bc8300e6d1fb9576e164376" integrity sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw== @@ -8421,35 +7799,11 @@ jest-environment-node@^29.7.0: jest-mock "^29.7.0" jest-util "^29.7.0" -jest-get-type@^24.9.0: - version "24.9.0" - resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-24.9.0.tgz#1684a0c8a50f2e4901b6644ae861f579eed2ef0e" - integrity sha512-lUseMzAley4LhIcpSP9Jf+fTrQ4a1yHQwLNeeVa2cEmbCGeoZAtYPOIv8JaxLD/sUpKxetKGP+gsHl8f8TSj8Q== - jest-get-type@^29.6.3: version "29.6.3" resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-29.6.3.tgz#36f499fdcea197c1045a127319c0481723908fd1" integrity sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw== -jest-haste-map@^24.9.0: - version "24.9.0" - resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-24.9.0.tgz#b38a5d64274934e21fa417ae9a9fbeb77ceaac7d" - integrity sha512-kfVFmsuWui2Sj1Rp1AJ4D9HqJwE4uwTlS/vO+eRUaMmd54BFpli2XhMQnPC2k4cHFVbB2Q2C+jtI1AGLgEnCjQ== - dependencies: - "@jest/types" "^24.9.0" - anymatch "^2.0.0" - fb-watchman "^2.0.0" - graceful-fs "^4.1.15" - invariant "^2.2.4" - jest-serializer "^24.9.0" - jest-util "^24.9.0" - jest-worker "^24.9.0" - micromatch "^3.1.10" - sane "^4.0.3" - walker "^1.0.7" - optionalDependencies: - fsevents "^1.2.7" - jest-haste-map@^29.7.0: version "29.7.0" resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-29.7.0.tgz#3c2396524482f5a0506376e6c858c3bbcc17b104" @@ -8487,20 +7841,6 @@ jest-matcher-utils@^29.7.0: jest-get-type "^29.6.3" pretty-format "^29.7.0" -jest-message-util@^24.9.0: - version "24.9.0" - resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-24.9.0.tgz#527f54a1e380f5e202a8d1149b0ec872f43119e3" - integrity sha512-oCj8FiZ3U0hTP4aSui87P4L4jC37BtQwUMqk+zk/b11FR19BJDeZsZAvIHutWnmtw7r85UmR3CEWZ0HWU2mAlw== - dependencies: - "@babel/code-frame" "^7.0.0" - "@jest/test-result" "^24.9.0" - "@jest/types" "^24.9.0" - "@types/stack-utils" "^1.0.1" - chalk "^2.0.1" - micromatch "^3.1.10" - slash "^2.0.0" - stack-utils "^1.0.1" - jest-message-util@^29.7.0: version "29.7.0" resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-29.7.0.tgz#8bc392e204e95dfe7564abbe72a404e28e51f7f3" @@ -8516,13 +7856,6 @@ jest-message-util@^29.7.0: slash "^3.0.0" stack-utils "^2.0.3" -jest-mock@^24.9.0: - version "24.9.0" - resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-24.9.0.tgz#c22835541ee379b908673ad51087a2185c13f1c6" - integrity sha512-3BEYN5WbSq9wd+SyLDES7AHnjH9A/ROBwmz7l2y+ol+NtSFO8DYiEBzoO1CeFc9a8DYy10EO4dDFVv/wN3zl1w== - dependencies: - "@jest/types" "^24.9.0" - jest-mock@^29.7.0: version "29.7.0" resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-29.7.0.tgz#4e836cf60e99c6fcfabe9f99d017f3fdd50a6347" @@ -8537,6 +7870,11 @@ jest-pnp-resolver@^1.2.2: resolved "https://registry.yarnpkg.com/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz#930b1546164d4ad5937d5540e711d4d38d4cad2e" integrity sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w== +jest-regex-util@^27.0.6: + version "27.5.1" + resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-27.5.1.tgz#4da143f7e9fd1e542d4aa69617b38e4a78365b95" + integrity sha512-4bfKq2zie+x16okqDXjXn9ql2B0dScQu+vcwe4TvFVhkVyuWLqpZrZtXxLLWoXYgn0E87I6r6GRYHF7wFZBUvg== + jest-regex-util@^29.6.3: version "29.6.3" resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-29.6.3.tgz#4a556d9c776af68e1c5f48194f4d0327d24e8a52" @@ -8620,11 +7958,6 @@ jest-runtime@^29.7.0: slash "^3.0.0" strip-bom "^4.0.0" -jest-serializer@^24.9.0: - version "24.9.0" - resolved "https://registry.yarnpkg.com/jest-serializer/-/jest-serializer-24.9.0.tgz#e6d7d7ef96d31e8b9079a714754c5d5c58288e73" - integrity sha512-DxYipDr8OvfrKH3Kel6NdED3OXxjvxXZ1uIY2I9OFbGg+vUkkg7AGvi65qbhbWNPvDckXmzMPbK3u3HaDO49bQ== - jest-snapshot@^29.7.0: version "29.7.0" resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-29.7.0.tgz#c2c574c3f51865da1bb329036778a69bf88a6be5" @@ -8651,23 +7984,17 @@ jest-snapshot@^29.7.0: pretty-format "^29.7.0" semver "^7.5.3" -jest-util@^24.9.0: - version "24.9.0" - resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-24.9.0.tgz#7396814e48536d2e85a37de3e4c431d7cb140162" - integrity sha512-x+cZU8VRmOJxbA1K5oDBdxQmdq0OIdADarLxk0Mq+3XS4jgvhG/oKGWcIDCtPG0HgjxOYvF+ilPJQsAyXfbNOg== +jest-util@^27.2.0: + version "27.5.1" + resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-27.5.1.tgz#3ba9771e8e31a0b85da48fe0b0891fb86c01c2f9" + integrity sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw== dependencies: - "@jest/console" "^24.9.0" - "@jest/fake-timers" "^24.9.0" - "@jest/source-map" "^24.9.0" - "@jest/test-result" "^24.9.0" - "@jest/types" "^24.9.0" - callsites "^3.0.0" - chalk "^2.0.1" - graceful-fs "^4.1.15" - is-ci "^2.0.0" - mkdirp "^0.5.1" - slash "^2.0.0" - source-map "^0.6.0" + "@jest/types" "^27.5.1" + "@types/node" "*" + chalk "^4.0.0" + ci-info "^3.2.0" + graceful-fs "^4.2.9" + picomatch "^2.2.3" jest-util@^29.0.0, jest-util@^29.7.0: version "29.7.0" @@ -8681,19 +8008,7 @@ jest-util@^29.0.0, jest-util@^29.7.0: graceful-fs "^4.2.9" picomatch "^2.2.3" -jest-validate@^24.9.0: - version "24.9.0" - resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-24.9.0.tgz#0775c55360d173cd854e40180756d4ff52def8ab" - integrity sha512-HPIt6C5ACwiqSiwi+OfSSHbK8sG7akG8eATl+IPKaeIjtPOeBUd/g3J7DghugzxrGjI93qS/+RPKe1H6PqvhRQ== - dependencies: - "@jest/types" "^24.9.0" - camelcase "^5.3.1" - chalk "^2.0.1" - jest-get-type "^24.9.0" - leven "^3.1.0" - pretty-format "^24.9.0" - -jest-validate@^29.7.0: +jest-validate@^29.2.1, jest-validate@^29.7.0: version "29.7.0" resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-29.7.0.tgz#7bf705511c64da591d46b15fce41400d52147d9c" integrity sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw== @@ -8719,13 +8034,14 @@ jest-watcher@^29.7.0: jest-util "^29.7.0" string-length "^4.0.1" -jest-worker@^24.9.0: - version "24.9.0" - resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-24.9.0.tgz#5dbfdb5b2d322e98567898238a9697bcce67b3e5" - integrity sha512-51PE4haMSXcHohnSMdM42anbvZANYTqMrr52tVKPqqsPJMzoP6FYYDVqahX/HrAoKEKz3uUPzSvKs9A3qR4iVw== +jest-worker@^27.2.0: + version "27.5.1" + resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-27.5.1.tgz#8d146f0900e8973b106b6f73cc1e9a8cb86f8db0" + integrity sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg== dependencies: + "@types/node" "*" merge-stream "^2.0.0" - supports-color "^6.1.0" + supports-color "^8.0.0" jest-worker@^29.7.0: version "29.7.0" @@ -8747,12 +8063,7 @@ jest@^29.3.1: import-local "^3.0.2" jest-cli "^29.7.0" -jetifier@^1.6.2: - version "1.6.8" - resolved "https://registry.yarnpkg.com/jetifier/-/jetifier-1.6.8.tgz#e88068697875cbda98c32472902c4d3756247798" - integrity sha512-3Zi16h6L5tXDRQJTb221cnRoVG9/9OvreLdLU2/ZjRv/GILL+2Cemt0IKvkowwkDpvouAU1DQPOJ7qaiHeIdrw== - -joi@^17.13.3: +joi@^17.13.3, joi@^17.2.1: version "17.13.3" resolved "https://registry.yarnpkg.com/joi/-/joi-17.13.3.tgz#0f5cc1169c999b30d344366d384b12d92558bcec" integrity sha512-otDA4ldcIx+ZXsKHWmp0YizCweVRZG96J10b0FevjfuncLO1oX59THoAmHkNubYJ+9gWsYsp5k8v4ib6oDv1fA== @@ -8793,10 +8104,40 @@ jsbn@~0.1.0: resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" integrity sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg== -jsc-android@^245459.0.0: - version "245459.0.0" - resolved "https://registry.yarnpkg.com/jsc-android/-/jsc-android-245459.0.0.tgz#e584258dd0b04c9159a27fb104cd5d491fd202c9" - integrity sha512-wkjURqwaB1daNkDi2OYYbsLnIdC/lUM2nPXQKRs5pqEU9chDg435bjvo+LSaHotDENygHQDHe+ntUkkw2gwMtg== +jsc-android@^250231.0.0: + version "250231.0.0" + resolved "https://registry.yarnpkg.com/jsc-android/-/jsc-android-250231.0.0.tgz#91720f8df382a108872fa4b3f558f33ba5e95262" + integrity sha512-rS46PvsjYmdmuz1OAWXY/1kCYG7pnf1TBqeTiOJr1iDz7s5DLxxC9n/ZMknLDxzYzNVfI7R95MH10emSSG1Wuw== + +jsc-safe-url@^0.2.2: + version "0.2.4" + resolved "https://registry.yarnpkg.com/jsc-safe-url/-/jsc-safe-url-0.2.4.tgz#141c14fbb43791e88d5dc64e85a374575a83477a" + integrity sha512-0wM3YBWtYePOjfyXQH5MWQ8H7sdk5EXSwZvmSLKk2RboVQ2Bu239jycHDz5J/8Blf3K0Qnoy2b6xD+z10MFB+Q== + +jscodeshift@^0.14.0: + version "0.14.0" + resolved "https://registry.yarnpkg.com/jscodeshift/-/jscodeshift-0.14.0.tgz#7542e6715d6d2e8bde0b4e883f0ccea358b46881" + integrity sha512-7eCC1knD7bLUPuSCwXsMZUH51O8jIcoVyKtI6P0XM0IVzlGjckPy3FIwQlorzbN0Sg79oK+RlohN32Mqf/lrYA== + dependencies: + "@babel/core" "^7.13.16" + "@babel/parser" "^7.13.16" + "@babel/plugin-proposal-class-properties" "^7.13.0" + "@babel/plugin-proposal-nullish-coalescing-operator" "^7.13.8" + "@babel/plugin-proposal-optional-chaining" "^7.13.12" + "@babel/plugin-transform-modules-commonjs" "^7.13.8" + "@babel/preset-flow" "^7.13.13" + "@babel/preset-typescript" "^7.13.0" + "@babel/register" "^7.13.16" + babel-core "^7.0.0-bridge.0" + chalk "^4.1.2" + flow-parser "0.*" + graceful-fs "^4.2.4" + micromatch "^4.0.4" + neo-async "^2.5.0" + node-dir "^0.1.17" + recast "^0.21.0" + temp "^0.8.4" + write-file-atomic "^2.3.0" jsdoc-type-pratt-parser@~4.0.0: version "4.0.0" @@ -8870,17 +8211,6 @@ json-stable-stringify-without-jsonify@^1.0.1: resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" integrity sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw== -json-stable-stringify@^1.0.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/json-stable-stringify/-/json-stable-stringify-1.2.1.tgz#addb683c2b78014d0b78d704c2fcbdf0695a60e2" - integrity sha512-Lp6HbbBgosLmJbjx0pBLbgvx68FaFU1sdkmBuckmhhJ88kL13OA51CDtR2yJB50eCNMH9wRqtQNNiAqQH4YXnA== - dependencies: - call-bind "^1.0.8" - call-bound "^1.0.3" - isarray "^2.0.5" - jsonify "^0.0.1" - object-keys "^1.1.1" - json-stringify-nice@^1.1.4: version "1.1.4" resolved "https://registry.yarnpkg.com/json-stringify-nice/-/json-stringify-nice-1.1.4.tgz#2c937962b80181d3f317dd39aa323e14f5a60a67" @@ -8913,13 +8243,6 @@ jsonc-parser@~3.3.1: resolved "https://registry.yarnpkg.com/jsonc-parser/-/jsonc-parser-3.3.1.tgz#f2a524b4f7fd11e3d791e559977ad60b98b798b4" integrity sha512-HUgH65KyejrUFPvHFPbqOY0rsFip3Bo5wb4ngvdi1EpCYWUQDC5V+Y7mZws+DLkr4M//zQJoanu1SP+87Dv1oQ== -jsonfile@^2.1.0: - version "2.4.0" - resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-2.4.0.tgz#3736a2b428b87bbda0cc83b53fa3d633a35c2ae8" - integrity sha512-PKllAqbgLgxHaj8TElYymKCAgrASebJrWpTnEkOaTowt23VKXXN0sUeriJ+eh7y6ufb/CC5ap11pz71/cM0hUw== - optionalDependencies: - graceful-fs "^4.1.6" - jsonfile@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-4.0.0.tgz#8771aae0799b64076b76640fca058f9c10e33ecb" @@ -8936,11 +8259,6 @@ jsonfile@^6.0.1: optionalDependencies: graceful-fs "^4.1.6" -jsonify@^0.0.1, jsonify@~0.0.0: - version "0.0.1" - resolved "https://registry.yarnpkg.com/jsonify/-/jsonify-0.0.1.tgz#2aa3111dae3d34a0f151c63f3a45d995d9420978" - integrity sha512-2/Ki0GcmuqSrgFyelQq9M05y7PS0mEwuIzrf3f1fPqkVDVRvZrPZtVSMHxdgo8Aq0sxAOb/cr2aqqA3LeWHVPg== - jsonparse@^1.2.0, jsonparse@^1.3.1: version "1.3.1" resolved "https://registry.yarnpkg.com/jsonparse/-/jsonparse-1.3.1.tgz#3f4dae4a91fac315f71062f8521cc239f1366280" @@ -9012,37 +8330,11 @@ jws@^3.2.2: jwa "^1.4.1" safe-buffer "^5.0.1" -kind-of@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-1.1.0.tgz#140a3d2d41a36d2efcfa9377b62c24f8495a5c44" - integrity sha512-aUH6ElPnMGon2/YkxRIigV32MOpTVcoXQ1Oo8aYn40s+sJ3j+0gFZsT8HKDcxNy7Fi9zuquWtGaGAahOdv5p/g== - -kind-of@^3.0.2, kind-of@^3.0.3, kind-of@^3.2.0: - version "3.2.2" - resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64" - integrity sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ== - dependencies: - is-buffer "^1.1.5" - -kind-of@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-4.0.0.tgz#20813df3d712928b207378691a45066fae72dd57" - integrity sha512-24XsCxmEbRwEDbz/qz3stgin8TTzZ1ESR56OMCN0ujYg+vRutNSiOj9bHH9u85DKgXguraugV5sFuvbD4FW/hw== - dependencies: - is-buffer "^1.1.5" - kind-of@^6.0.2, kind-of@^6.0.3: version "6.0.3" resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd" integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw== -klaw@^1.0.0: - version "1.3.1" - resolved "https://registry.yarnpkg.com/klaw/-/klaw-1.3.1.tgz#4088433b46b3b1ba259d78785d8e96f73ba02439" - integrity sha512-TED5xi9gGQjGpNnvRWknrwAB1eL5GciPfVFOt3Vk1OJCVDQbzuSfrF3hkUQKlsgKrG1F+0t5W0m+Fje1jIt8rw== - optionalDependencies: - graceful-fs "^4.1.9" - kleur@^3.0.3: version "3.0.3" resolved "https://registry.yarnpkg.com/kleur/-/kleur-3.0.3.tgz#a79c9ecc86ee1ce3fa6206d1216c501f147fc07e" @@ -9379,18 +8671,11 @@ lodash.throttle@^4.1.1: resolved "https://registry.yarnpkg.com/lodash.throttle/-/lodash.throttle-4.1.1.tgz#c23e91b710242ac70c37f1e1cda9274cc39bf2f4" integrity sha512-wIkUCfVKpVsWo3JSZlc+8MB5it+2AN5W8J7YVMST30UrvcQNZ1Okbj+rbVniijTWE6FGYy4XJq/rHkas8qJMLQ== -lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.21, lodash@^4.3.0: +lodash@^4.17.21: version "4.17.21" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== -log-symbols@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-2.2.0.tgz#5740e1c5d6f0dfda4ad9323b5332107ef6b4c40a" - integrity sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg== - dependencies: - chalk "^2.0.1" - log-symbols@^4.0.0, log-symbols@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-4.1.0.tgz#3fbdbb95b4683ac9fc785111e792e558d4abd503" @@ -9451,14 +8736,6 @@ lru-cache@^11.0.0: resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-11.0.2.tgz#fbd8e7cf8211f5e7e5d91905c415a3f55755ca39" integrity sha512-123qHRfJBmo2jXDbo/a5YOQrJoHF/GNQTLzQ5+IdK5pWpceK17yRc6ozlWd25FxvGKQbIUs91fDFkXmDHTKcyA== -lru-cache@^4.0.1: - version "4.1.5" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.5.tgz#8bbe50ea85bed59bc9e33dcab8235ee9bcf443cd" - integrity sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g== - dependencies: - pseudomap "^1.0.2" - yallist "^2.1.2" - lru-cache@^5.1.1: version "5.1.1" resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920" @@ -9551,11 +8828,6 @@ makeerror@1.0.12: dependencies: tmpl "1.0.5" -map-cache@^0.2.2: - version "0.2.2" - resolved "https://registry.yarnpkg.com/map-cache/-/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf" - integrity sha512-8y/eV9QQZCiyn1SprXSrCmqJN0yNRATe+PO8ztwqrvrbdRLA3eYJF0yaR0YayLWkMbsQSKWS9N2gPcGEc4UsZg== - map-obj@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-1.0.1.tgz#d933ceb9205d82bdcf4886f6742bdc2b4dea146d" @@ -9571,13 +8843,6 @@ map-stream@~0.1.0: resolved "https://registry.yarnpkg.com/map-stream/-/map-stream-0.1.0.tgz#e56aa94c4c8055a16404a0674b78f215f7c8e194" integrity sha512-CkYQrPYZfWnu/DAmVCpTSX/xHpKZ80eKh2lAkyA6AJTef6bW+6JpbQZN5rofum7da+SyN1bi5ctTm+lTfcCW3g== -map-visit@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/map-visit/-/map-visit-1.0.0.tgz#ecdca8f13144e660f1b5bd41f12f3479d98dfb8f" - integrity sha512-4y7uGv8bd2WdM9vpQsiQNo41Ln1NvhvDRuVt0k2JZQ+ezN2uaQes7lZeZ+QQUHOLQAtDaBJ+7wCbi+ab/KFs+w== - dependencies: - object-visit "^1.0.0" - markdown-it@13.0.1: version "13.0.1" resolved "https://registry.yarnpkg.com/markdown-it/-/markdown-it-13.0.1.tgz#c6ecc431cacf1a5da531423fc6a42807814af430" @@ -9638,11 +8903,6 @@ markdownlint@~0.35.0: markdown-it "14.1.0" markdownlint-micromark "0.1.10" -math-intrinsics@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/math-intrinsics/-/math-intrinsics-1.1.0.tgz#a0dd74be81e2aa5c2f27e65ce283605ee4e2b7f9" - integrity sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g== - mdurl@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/mdurl/-/mdurl-1.0.1.tgz#fe85b2ec75a59037f2adfec100fd6c601761152e" @@ -9658,6 +8918,11 @@ media-typer@0.3.0: resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" integrity sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ== +memoize-one@^5.0.0: + version "5.2.1" + resolved "https://registry.yarnpkg.com/memoize-one/-/memoize-one-5.2.1.tgz#8337aa3c4335581839ec01c3d594090cebe8f00e" + integrity sha512-zYiwtZUcYyXKo/np96AGZAckk+FWWsUdJ3cHGGmld7+AhvcWmQyGCYUh1hc4Q/pkOhb65dQR/pqCyK0cOaHz4Q== + memorystream@^0.3.1: version "0.3.1" resolved "https://registry.yarnpkg.com/memorystream/-/memorystream-0.3.1.tgz#86d7090b30ce455d63fbae12dda51a47ddcaf9b2" @@ -9685,13 +8950,6 @@ merge-descriptors@1.0.3: resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.3.tgz#d80319a65f3c7935351e5cfdac8f9318504dbed5" integrity sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ== -merge-stream@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-1.0.1.tgz#4041202d508a342ba00174008df0c251b8c135e1" - integrity sha512-e6RM36aegd4f+r8BZCcYXlO2P3H6xbUM6ktL2Xmf45GAOit9bI4z6/3VU7JwllVO1L7u0UDSg/EhzQ5lmMLolA== - dependencies: - readable-stream "^2.0.1" - merge-stream@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" @@ -9707,242 +8965,271 @@ methods@~1.1.2: resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" integrity sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w== -metro-babel-register@0.59.0: - version "0.59.0" - resolved "https://registry.yarnpkg.com/metro-babel-register/-/metro-babel-register-0.59.0.tgz#2bcff65641b36794cf083ba732fbc46cf870fb43" - integrity sha512-JtWc29erdsXO/V3loenXKw+aHUXgj7lt0QPaZKPpctLLy8kcEpI/8pfXXgVK9weXICCpCnYtYncIosAyzh0xjg== +metro-babel-transformer@0.76.9: + version "0.76.9" + resolved "https://registry.yarnpkg.com/metro-babel-transformer/-/metro-babel-transformer-0.76.9.tgz#659ba481d471b5f748c31a8f9397094b629f50ec" + integrity sha512-dAnAmBqRdTwTPVn4W4JrowPolxD1MDbuU97u3MqtWZgVRvDpmr+Cqnn5oSxLQk3Uc+Zy3wkqVrB/zXNRlLDSAQ== dependencies: - "@babel/core" "^7.0.0" - "@babel/plugin-proposal-class-properties" "^7.0.0" - "@babel/plugin-proposal-nullish-coalescing-operator" "^7.0.0" - "@babel/plugin-proposal-optional-chaining" "^7.0.0" - "@babel/plugin-transform-flow-strip-types" "^7.0.0" - "@babel/plugin-transform-modules-commonjs" "^7.0.0" - "@babel/register" "^7.0.0" - escape-string-regexp "^1.0.5" + "@babel/core" "^7.20.0" + hermes-parser "0.12.0" + nullthrows "^1.1.1" -metro-babel-transformer@0.59.0: - version "0.59.0" - resolved "https://registry.yarnpkg.com/metro-babel-transformer/-/metro-babel-transformer-0.59.0.tgz#dda99c75d831b00142c42c020c51c103b29f199d" - integrity sha512-fdZJl8rs54GVFXokxRdD7ZrQ1TJjxWzOi/xSP25VR3E8tbm3nBZqS+/ylu643qSr/IueABR+jrlqAyACwGEf6w== - dependencies: - "@babel/core" "^7.0.0" - metro-source-map "0.59.0" +metro-cache-key@0.76.9: + version "0.76.9" + resolved "https://registry.yarnpkg.com/metro-cache-key/-/metro-cache-key-0.76.9.tgz#6f17f821d6f306fa9028b7e79445eb18387d03d9" + integrity sha512-ugJuYBLngHVh1t2Jj+uP9pSCQl7enzVXkuh6+N3l0FETfqjgOaSHlcnIhMPn6yueGsjmkiIfxQU4fyFVXRtSTw== -metro-cache@0.59.0: - version "0.59.0" - resolved "https://registry.yarnpkg.com/metro-cache/-/metro-cache-0.59.0.tgz#ef3c055f276933979b731455dc8317d7a66f0f2d" - integrity sha512-ryWNkSnpyADfRpHGb8BRhQ3+k8bdT/bsxMH2O0ntlZYZ188d8nnYWmxbRvFmEzToJxe/ol4uDw0tJFAaQsN8KA== +metro-cache@0.76.9: + version "0.76.9" + resolved "https://registry.yarnpkg.com/metro-cache/-/metro-cache-0.76.9.tgz#64326d7a8b470c3886a5e97d5e2a20acab20bc5f" + integrity sha512-W6QFEU5AJG1gH4Ltv8S2IvhmEhSDYnbPafyj5fGR3YLysdykj+olKv9B0V+YQXtcLGyY5CqpXLYUx595GdiKzA== dependencies: - jest-serializer "^24.9.0" - metro-core "0.59.0" - mkdirp "^0.5.1" - rimraf "^2.5.4" + metro-core "0.76.9" + rimraf "^3.0.2" -metro-config@0.59.0, metro-config@^0.59.0: - version "0.59.0" - resolved "https://registry.yarnpkg.com/metro-config/-/metro-config-0.59.0.tgz#9844e388069321dd7403e49f0d495a81f9aa0fef" - integrity sha512-MDsknFG9vZ4Nb5VR6OUDmGHaWz6oZg/FtE3up1zVBKPVRTXE1Z+k7zypnPtMXjMh3WHs/Sy4+wU1xnceE/zdnA== +metro-config@0.76.9, metro-config@^0.76.9: + version "0.76.9" + resolved "https://registry.yarnpkg.com/metro-config/-/metro-config-0.76.9.tgz#5e60aff9d8894c1ee6bbc5de23b7c8515a0b84a3" + integrity sha512-oYyJ16PY3rprsfoi80L+gDJhFJqsKI3Pob5LKQbJpvL+gGr8qfZe1eQzYp5Xxxk9DOHKBV1xD94NB8GdT/DA8Q== dependencies: + connect "^3.6.5" cosmiconfig "^5.0.5" - jest-validate "^24.9.0" - metro "0.59.0" - metro-cache "0.59.0" - metro-core "0.59.0" + jest-validate "^29.2.1" + metro "0.76.9" + metro-cache "0.76.9" + metro-core "0.76.9" + metro-runtime "0.76.9" -metro-core@0.59.0, metro-core@^0.59.0: - version "0.59.0" - resolved "https://registry.yarnpkg.com/metro-core/-/metro-core-0.59.0.tgz#958cde3fe5c8cd84a78e1899af801ad69e9c83b1" - integrity sha512-kb5LKvV5r2pqMEzGyTid8ai2mIjW13NMduQ8oBmfha7/EPTATcTQ//s+bkhAs1toQD8vqVvjAb0cPNjWQEmcmQ== +metro-core@0.76.9, metro-core@^0.76.9: + version "0.76.9" + resolved "https://registry.yarnpkg.com/metro-core/-/metro-core-0.76.9.tgz#5f55f0fbde41d28957e4f3bb187d32251403f00e" + integrity sha512-DSeEr43Wrd5Q7ySfRzYzDwfV89g2OZTQDf1s3exOcLjE5fb7awoLOkA2h46ZzN8NcmbbM0cuJy6hOwF073/yRQ== dependencies: - jest-haste-map "^24.9.0" lodash.throttle "^4.1.1" - metro-resolver "0.59.0" - wordwrap "^1.0.0" + metro-resolver "0.76.9" -metro-inspector-proxy@0.59.0: - version "0.59.0" - resolved "https://registry.yarnpkg.com/metro-inspector-proxy/-/metro-inspector-proxy-0.59.0.tgz#39d1390772d13767fc595be9a1a7074e2425cf8e" - integrity sha512-hPeAuQcofTOH0F+2GEZqWkvkVY1/skezSSlMocDQDaqds+Kw6JgdA7FlZXxnKmQ/jYrWUzff/pl8SUCDwuYthQ== +metro-file-map@0.76.9: + version "0.76.9" + resolved "https://registry.yarnpkg.com/metro-file-map/-/metro-file-map-0.76.9.tgz#dd3d76ec23fc0ba8cb7b3a3b8075bb09e0b5d378" + integrity sha512-7vJd8kksMDTO/0fbf3081bTrlw8SLiploeDf+vkkf0OwlrtDUWPOikfebp+MpZB2S61kamKjCNRfRkgrbPfSwg== + dependencies: + anymatch "^3.0.3" + debug "^2.2.0" + fb-watchman "^2.0.0" + graceful-fs "^4.2.4" + invariant "^2.2.4" + jest-regex-util "^27.0.6" + jest-util "^27.2.0" + jest-worker "^27.2.0" + micromatch "^4.0.4" + node-abort-controller "^3.1.1" + nullthrows "^1.1.1" + walker "^1.0.7" + optionalDependencies: + fsevents "^2.3.2" + +metro-inspector-proxy@0.76.9: + version "0.76.9" + resolved "https://registry.yarnpkg.com/metro-inspector-proxy/-/metro-inspector-proxy-0.76.9.tgz#0d333e64a7bc9d156d712265faa7b7ae88c775e8" + integrity sha512-idIiPkb8CYshc0WZmbzwmr4B1QwsQUbpDwBzHwxE1ni27FWKWhV9CD5p+qlXZHgfwJuMRfPN+tIaLSR8+vttYg== dependencies: connect "^3.6.5" debug "^2.2.0" - ws "^1.1.5" - yargs "^14.2.0" + node-fetch "^2.2.0" + ws "^7.5.1" + yargs "^17.6.2" -metro-minify-uglify@0.59.0: - version "0.59.0" - resolved "https://registry.yarnpkg.com/metro-minify-uglify/-/metro-minify-uglify-0.59.0.tgz#6491876308d878742f7b894d7fca4af356886dd5" - integrity sha512-7IzVgCVWZMymgZ/quieg/9v5EQ8QmZWAgDc86Zp9j0Vy6tQTjUn6jlU+YAKW3mfMEjMr6iIUzCD8YklX78tFAw== +metro-minify-terser@0.76.9: + version "0.76.9" + resolved "https://registry.yarnpkg.com/metro-minify-terser/-/metro-minify-terser-0.76.9.tgz#3f6271da74dd57179852118443b62cc8dc578aab" + integrity sha512-ju2nUXTKvh96vHPoGZH/INhSvRRKM14CbGAJXQ98+g8K5z1v3luYJ/7+dFQB202eVzJdTB2QMtBjI1jUUpooCg== + dependencies: + terser "^5.15.0" + +metro-minify-uglify@0.76.9: + version "0.76.9" + resolved "https://registry.yarnpkg.com/metro-minify-uglify/-/metro-minify-uglify-0.76.9.tgz#e88c30c27911c053e1ee20e12077f0f4cbb154f8" + integrity sha512-MXRrM3lFo62FPISlPfTqC6n9HTEI3RJjDU5SvpE7sJFfJKLx02xXQEltsL/wzvEqK+DhRQ5DEYACTwf5W4Z3yA== dependencies: uglify-es "^3.1.9" -metro-react-native-babel-preset@0.59.0: - version "0.59.0" - resolved "https://registry.yarnpkg.com/metro-react-native-babel-preset/-/metro-react-native-babel-preset-0.59.0.tgz#20e020bc6ac9849e1477de1333d303ed42aba225" - integrity sha512-BoO6ncPfceIDReIH8pQ5tQptcGo5yRWQXJGVXfANbiKLq4tfgdZB1C1e2rMUJ6iypmeJU9dzl+EhPmIFKtgREg== +metro-react-native-babel-preset@0.76.9: + version "0.76.9" + resolved "https://registry.yarnpkg.com/metro-react-native-babel-preset/-/metro-react-native-babel-preset-0.76.9.tgz#15868142122af14313429d7572c15cf01c16f077" + integrity sha512-eCBtW/UkJPDr6HlMgFEGF+964DZsUEF9RGeJdZLKWE7d/0nY3ABZ9ZAGxzu9efQ35EWRox5bDMXUGaOwUe5ikQ== dependencies: - "@babel/plugin-proposal-class-properties" "^7.0.0" + "@babel/core" "^7.20.0" + "@babel/plugin-proposal-async-generator-functions" "^7.0.0" + "@babel/plugin-proposal-class-properties" "^7.18.0" "@babel/plugin-proposal-export-default-from" "^7.0.0" - "@babel/plugin-proposal-nullish-coalescing-operator" "^7.0.0" - "@babel/plugin-proposal-object-rest-spread" "^7.0.0" + "@babel/plugin-proposal-nullish-coalescing-operator" "^7.18.0" + "@babel/plugin-proposal-numeric-separator" "^7.0.0" + "@babel/plugin-proposal-object-rest-spread" "^7.20.0" "@babel/plugin-proposal-optional-catch-binding" "^7.0.0" - "@babel/plugin-proposal-optional-chaining" "^7.0.0" - "@babel/plugin-syntax-dynamic-import" "^7.0.0" + "@babel/plugin-proposal-optional-chaining" "^7.20.0" + "@babel/plugin-syntax-dynamic-import" "^7.8.0" "@babel/plugin-syntax-export-default-from" "^7.0.0" - "@babel/plugin-syntax-flow" "^7.2.0" + "@babel/plugin-syntax-flow" "^7.18.0" "@babel/plugin-syntax-nullish-coalescing-operator" "^7.0.0" "@babel/plugin-syntax-optional-chaining" "^7.0.0" "@babel/plugin-transform-arrow-functions" "^7.0.0" + "@babel/plugin-transform-async-to-generator" "^7.20.0" "@babel/plugin-transform-block-scoping" "^7.0.0" "@babel/plugin-transform-classes" "^7.0.0" "@babel/plugin-transform-computed-properties" "^7.0.0" - "@babel/plugin-transform-destructuring" "^7.0.0" - "@babel/plugin-transform-exponentiation-operator" "^7.0.0" - "@babel/plugin-transform-flow-strip-types" "^7.0.0" - "@babel/plugin-transform-for-of" "^7.0.0" + "@babel/plugin-transform-destructuring" "^7.20.0" + "@babel/plugin-transform-flow-strip-types" "^7.20.0" "@babel/plugin-transform-function-name" "^7.0.0" "@babel/plugin-transform-literals" "^7.0.0" "@babel/plugin-transform-modules-commonjs" "^7.0.0" - "@babel/plugin-transform-object-assign" "^7.0.0" + "@babel/plugin-transform-named-capturing-groups-regex" "^7.0.0" "@babel/plugin-transform-parameters" "^7.0.0" "@babel/plugin-transform-react-display-name" "^7.0.0" "@babel/plugin-transform-react-jsx" "^7.0.0" "@babel/plugin-transform-react-jsx-self" "^7.0.0" "@babel/plugin-transform-react-jsx-source" "^7.0.0" - "@babel/plugin-transform-regenerator" "^7.0.0" "@babel/plugin-transform-runtime" "^7.0.0" "@babel/plugin-transform-shorthand-properties" "^7.0.0" "@babel/plugin-transform-spread" "^7.0.0" "@babel/plugin-transform-sticky-regex" "^7.0.0" - "@babel/plugin-transform-template-literals" "^7.0.0" "@babel/plugin-transform-typescript" "^7.5.0" "@babel/plugin-transform-unicode-regex" "^7.0.0" "@babel/template" "^7.0.0" + babel-plugin-transform-flow-enums "^0.0.2" react-refresh "^0.4.0" -metro-react-native-babel-transformer@0.59.0, metro-react-native-babel-transformer@^0.59.0: - version "0.59.0" - resolved "https://registry.yarnpkg.com/metro-react-native-babel-transformer/-/metro-react-native-babel-transformer-0.59.0.tgz#9b3dfd6ad35c6ef37fc4ce4d20a2eb67fabbb4be" - integrity sha512-1O3wrnMq4NcPQ1asEcl9lRDn/t+F1Oef6S9WaYVIKEhg9m/EQRGVrrTVP+R6B5Eeaj3+zNKbzM8Dx/NWy1hUbQ== +metro-react-native-babel-transformer@^0.76.9: + version "0.76.9" + resolved "https://registry.yarnpkg.com/metro-react-native-babel-transformer/-/metro-react-native-babel-transformer-0.76.9.tgz#464aab85669ed39f7a59f1fd993a05de9543b09e" + integrity sha512-xXzHcfngSIkbQj+U7i/anFkNL0q2QVarYSzr34CFkzKLa79Rp16B8ki7z9eVVqo9W3B4TBcTXl3BipgRoOoZSQ== dependencies: - "@babel/core" "^7.0.0" - babel-preset-fbjs "^3.3.0" - metro-babel-transformer "0.59.0" - metro-react-native-babel-preset "0.59.0" - metro-source-map "0.59.0" + "@babel/core" "^7.20.0" + babel-preset-fbjs "^3.4.0" + hermes-parser "0.12.0" + metro-react-native-babel-preset "0.76.9" + nullthrows "^1.1.1" -metro-resolver@0.59.0, metro-resolver@^0.59.0: - version "0.59.0" - resolved "https://registry.yarnpkg.com/metro-resolver/-/metro-resolver-0.59.0.tgz#fbc9d7c95f094c52807877d0011feffb9e896fad" - integrity sha512-lbgiumnwoVosffEI96z0FGuq1ejTorHAj3QYUPmp5dFMfitRxLP7Wm/WP9l4ZZjIptxTExsJwuEff1SLRCPD9w== +metro-resolver@0.76.9, metro-resolver@^0.76.9: + version "0.76.9" + resolved "https://registry.yarnpkg.com/metro-resolver/-/metro-resolver-0.76.9.tgz#79c244784b16ca56076bc1fc816d2ba74860e882" + integrity sha512-s86ipNRas9vNR5lChzzSheF7HoaQEmzxBLzwFA6/2YcGmUCowcoyPAfs1yPh4cjMw9F1T4KlMLaiwniGE7HCyw== + +metro-runtime@0.76.9, metro-runtime@^0.76.9: + version "0.76.9" + resolved "https://registry.yarnpkg.com/metro-runtime/-/metro-runtime-0.76.9.tgz#f8ebe150f8896ce1aef5d7f3a52844f8b4f721fb" + integrity sha512-/5vezDpGUtA0Fv6cJg0+i6wB+QeBbvLeaw9cTSG7L76liP0b91f8vOcYzGaUbHI8pznJCCTerxRzpQ8e3/NcDw== dependencies: - absolute-path "^0.0.0" + "@babel/runtime" "^7.0.0" + react-refresh "^0.4.0" -metro-source-map@0.59.0: - version "0.59.0" - resolved "https://registry.yarnpkg.com/metro-source-map/-/metro-source-map-0.59.0.tgz#e9beb9fc51bfb4e060f95820cf1508fc122d23f7" - integrity sha512-0w5CmCM+ybSqXIjqU4RiK40t4bvANL6lafabQ2GP2XD3vSwkLY+StWzCtsb4mPuyi9R/SgoLBel+ZOXHXAH0eQ== +metro-source-map@0.76.9, metro-source-map@^0.76.9: + version "0.76.9" + resolved "https://registry.yarnpkg.com/metro-source-map/-/metro-source-map-0.76.9.tgz#0f976ada836717f307427d3830aea52a2ca7ed5f" + integrity sha512-q5qsMlu8EFvsT46wUUh+ao+efDsicT30zmaPATNhq+PcTawDbDgnMuUD+FT0bvxxnisU2PWl91RdzKfNc2qPQA== dependencies: - "@babel/traverse" "^7.0.0" - "@babel/types" "^7.0.0" + "@babel/traverse" "^7.20.0" + "@babel/types" "^7.20.0" invariant "^2.2.4" - metro-symbolicate "0.59.0" - ob1 "0.59.0" + metro-symbolicate "0.76.9" + nullthrows "^1.1.1" + ob1 "0.76.9" source-map "^0.5.6" vlq "^1.0.0" -metro-symbolicate@0.59.0: - version "0.59.0" - resolved "https://registry.yarnpkg.com/metro-symbolicate/-/metro-symbolicate-0.59.0.tgz#fc7f93957a42b02c2bfc57ed1e8f393f5f636a54" - integrity sha512-asLaF2A7rndrToGFIknL13aiohwPJ95RKHf0NM3hP/nipiLDoMzXT6ZnQvBqDxkUKyP+51AI75DMtb+Wcyw4Bw== +metro-symbolicate@0.76.9: + version "0.76.9" + resolved "https://registry.yarnpkg.com/metro-symbolicate/-/metro-symbolicate-0.76.9.tgz#f1627ef6f73bb0c4d48c55684d3c87866a0b0920" + integrity sha512-Yyq6Ukj/IeWnGST09kRt0sBK8TwzGZWoU7YAcQlh14+AREH454Olx4wbFTpkkhUkV05CzNCvUuXQ0efFxhA1bw== dependencies: invariant "^2.2.4" - metro-source-map "0.59.0" + metro-source-map "0.76.9" + nullthrows "^1.1.1" source-map "^0.5.6" through2 "^2.0.1" vlq "^1.0.0" -metro@0.59.0, metro@^0.59.0: - version "0.59.0" - resolved "https://registry.yarnpkg.com/metro/-/metro-0.59.0.tgz#64a87cd61357814a4f279518e0781b1eab5934b8" - integrity sha512-OpVgYXyuTvouusFZQJ/UYKEbwfLmialrSCUUTGTFaBor6UMUHZgXPYtK86LzesgMqRc8aiuTQVO78iKW2Iz3wg== +metro-transform-plugins@0.76.9: + version "0.76.9" + resolved "https://registry.yarnpkg.com/metro-transform-plugins/-/metro-transform-plugins-0.76.9.tgz#73e34f2014d3df3c336a882b13e541bceb826d37" + integrity sha512-YEQeNlOCt92I7S9A3xbrfaDfwfgcxz9PpD/1eeop3c4cO3z3Q3otYuxw0WJ/rUIW8pZfOm5XCehd+1NRbWlAaw== + dependencies: + "@babel/core" "^7.20.0" + "@babel/generator" "^7.20.0" + "@babel/template" "^7.0.0" + "@babel/traverse" "^7.20.0" + nullthrows "^1.1.1" + +metro-transform-worker@0.76.9: + version "0.76.9" + resolved "https://registry.yarnpkg.com/metro-transform-worker/-/metro-transform-worker-0.76.9.tgz#281fad223f0447e1ff9cc44d6f7e33dfab9ab120" + integrity sha512-F69A0q0qFdJmP2Clqr6TpTSn4WTV9p5A28h5t9o+mB22ryXBZfUQ6BFBBW/6Wp2k/UtPH+oOsBfV9guiqm3d2Q== + dependencies: + "@babel/core" "^7.20.0" + "@babel/generator" "^7.20.0" + "@babel/parser" "^7.20.0" + "@babel/types" "^7.20.0" + babel-preset-fbjs "^3.4.0" + metro "0.76.9" + metro-babel-transformer "0.76.9" + metro-cache "0.76.9" + metro-cache-key "0.76.9" + metro-minify-terser "0.76.9" + metro-source-map "0.76.9" + metro-transform-plugins "0.76.9" + nullthrows "^1.1.1" + +metro@0.76.9, metro@^0.76.9: + version "0.76.9" + resolved "https://registry.yarnpkg.com/metro/-/metro-0.76.9.tgz#605fddf1a54d27762ddba2f636420ae2408862df" + integrity sha512-gcjcfs0l5qIPg0lc5P7pj0x7vPJ97tan+OnEjiYLbKjR1D7Oa78CE93YUPyymUPH6q7VzlzMm1UjT35waEkZUw== dependencies: "@babel/code-frame" "^7.0.0" - "@babel/core" "^7.0.0" - "@babel/generator" "^7.5.0" - "@babel/parser" "^7.0.0" - "@babel/plugin-external-helpers" "^7.0.0" + "@babel/core" "^7.20.0" + "@babel/generator" "^7.20.0" + "@babel/parser" "^7.20.0" "@babel/template" "^7.0.0" - "@babel/traverse" "^7.0.0" - "@babel/types" "^7.0.0" - absolute-path "^0.0.0" - async "^2.4.0" - babel-preset-fbjs "^3.3.0" - buffer-crc32 "^0.2.13" - chalk "^2.4.1" + "@babel/traverse" "^7.20.0" + "@babel/types" "^7.20.0" + accepts "^1.3.7" + async "^3.2.2" + chalk "^4.0.0" ci-info "^2.0.0" - concat-stream "^1.6.0" connect "^3.6.5" debug "^2.2.0" denodeify "^1.2.1" error-stack-parser "^2.0.6" - eventemitter3 "^3.0.0" - fbjs "^1.0.0" - fs-extra "^1.0.0" - graceful-fs "^4.1.3" - image-size "^0.6.0" + graceful-fs "^4.2.4" + hermes-parser "0.12.0" + image-size "^1.0.2" invariant "^2.2.4" - jest-haste-map "^24.9.0" - jest-worker "^24.9.0" - json-stable-stringify "^1.0.1" + jest-worker "^27.2.0" + jsc-safe-url "^0.2.2" lodash.throttle "^4.1.1" - merge-stream "^1.0.1" - metro-babel-register "0.59.0" - metro-babel-transformer "0.59.0" - metro-cache "0.59.0" - metro-config "0.59.0" - metro-core "0.59.0" - metro-inspector-proxy "0.59.0" - metro-minify-uglify "0.59.0" - metro-react-native-babel-preset "0.59.0" - metro-resolver "0.59.0" - metro-source-map "0.59.0" - metro-symbolicate "0.59.0" - mime-types "2.1.11" - mkdirp "^0.5.1" + metro-babel-transformer "0.76.9" + metro-cache "0.76.9" + metro-cache-key "0.76.9" + metro-config "0.76.9" + metro-core "0.76.9" + metro-file-map "0.76.9" + metro-inspector-proxy "0.76.9" + metro-minify-uglify "0.76.9" + metro-react-native-babel-preset "0.76.9" + metro-resolver "0.76.9" + metro-runtime "0.76.9" + metro-source-map "0.76.9" + metro-symbolicate "0.76.9" + metro-transform-plugins "0.76.9" + metro-transform-worker "0.76.9" + mime-types "^2.1.27" node-fetch "^2.2.0" nullthrows "^1.1.1" - resolve "^1.5.0" - rimraf "^2.5.4" + rimraf "^3.0.2" serialize-error "^2.1.0" source-map "^0.5.6" - strip-ansi "^4.0.0" - temp "0.8.3" - throat "^4.1.0" - wordwrap "^1.0.0" - ws "^1.1.5" - xpipe "^1.0.5" - yargs "^14.2.0" - -micromatch@^3.1.10, micromatch@^3.1.4: - version "3.1.10" - resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-3.1.10.tgz#70859bc95c9840952f359a068a3fc49f9ecfac23" - integrity sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg== - dependencies: - arr-diff "^4.0.0" - array-unique "^0.3.2" - braces "^2.3.1" - define-property "^2.0.2" - extend-shallow "^3.0.2" - extglob "^2.0.4" - fragment-cache "^0.2.1" - kind-of "^6.0.2" - nanomatch "^1.2.9" - object.pick "^1.3.0" - regex-not "^1.0.0" - snapdragon "^0.8.1" - to-regex "^3.0.2" + strip-ansi "^6.0.0" + throat "^5.0.0" + ws "^7.5.1" + yargs "^17.6.2" micromatch@^4.0.4, micromatch@^4.0.5: version "4.0.8" @@ -9957,19 +9244,7 @@ mime-db@1.52.0, "mime-db@>= 1.43.0 < 2": resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70" integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== -mime-db@~1.23.0: - version "1.23.0" - resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.23.0.tgz#a31b4070adaea27d732ea333740a64d0ec9a6659" - integrity sha512-lsX3UhcJITPHDXGOXSglBSPoI2UbcsWMmgX1VTaeXJ11TjjxOSE/DHrCl23zJk75odJc8MVpdZzWxdWt1Csx5Q== - -mime-types@2.1.11: - version "2.1.11" - resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.11.tgz#c259c471bda808a85d6cd193b430a5fae4473b3c" - integrity sha512-14dD2ItPaGFLVyhddUE/Rrtg+g7v8RmBLjN5Xsb3fJJLKunoZOw3I3bK6csjoJKjaNjcXo8xob9kHDyOpJfgpg== - dependencies: - mime-db "~1.23.0" - -mime-types@^2.1.12, mime-types@~2.1.19, mime-types@~2.1.24, mime-types@~2.1.34: +mime-types@^2.1.12, mime-types@^2.1.27, mime-types@~2.1.19, mime-types@~2.1.24, mime-types@~2.1.34: version "2.1.35" resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a" integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== @@ -9986,11 +9261,6 @@ mime@^2.4.1: resolved "https://registry.yarnpkg.com/mime/-/mime-2.6.0.tgz#a2a682a95cd4d0cb1d6257e28f83da7e35800367" integrity sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg== -mimic-fn@^1.0.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-1.2.0.tgz#820c86a39334640e99516928bd03fca88057d022" - integrity sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ== - mimic-fn@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" @@ -10027,7 +9297,7 @@ minimatch@^10.0.0, minimatch@~10.0.1: dependencies: brace-expansion "^2.0.1" -minimatch@^3.0.4, minimatch@^3.0.5, minimatch@^3.1.1, minimatch@^3.1.2: +minimatch@^3.0.2, minimatch@^3.0.4, minimatch@^3.0.5, minimatch@^3.1.1, minimatch@^3.1.2: version "3.1.2" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== @@ -10064,7 +9334,7 @@ minimist-options@4.1.0: is-plain-obj "^1.1.0" kind-of "^6.0.3" -minimist@^1.1.1, minimist@^1.2.0, minimist@^1.2.5, minimist@^1.2.6, minimist@^1.2.8: +minimist@^1.2.0, minimist@^1.2.5, minimist@^1.2.6, minimist@^1.2.8: version "1.2.8" resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.8.tgz#c1a464e7693302e082a075cee0c057741ac4772c" integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== @@ -10138,14 +9408,6 @@ minizlib@^2.1.1, minizlib@^2.1.2: minipass "^3.0.0" yallist "^4.0.0" -mixin-deep@^1.2.0: - version "1.3.2" - resolved "https://registry.yarnpkg.com/mixin-deep/-/mixin-deep-1.3.2.tgz#1120b43dc359a785dce65b55b82e257ccf479566" - integrity sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA== - dependencies: - for-in "^1.0.2" - is-extendable "^1.0.1" - mkdirp@^0.5.1: version "0.5.6" resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.6.tgz#7def03d2432dcae4ba1d611445c48396062255f6" @@ -10229,11 +9491,6 @@ multimatch@5.0.0: arrify "^2.0.1" minimatch "^3.0.4" -mute-stream@0.0.7: - version "0.0.7" - resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.7.tgz#3075ce93bc21b8fab43e1bc4da7e8115ed1e7bab" - integrity sha512-r65nCZhrbXXb6dXOACihYApHw2Q6pV0M3V0PSxd74N0+D8nzAdEAITq2oAjA1jVnKI+tGvEBUpqiMh0+rW6zDQ== - mute-stream@0.0.8: version "0.0.8" resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.8.tgz#1630c42b2251ff81e2a283de96a5497ea92e5e0d" @@ -10244,33 +9501,11 @@ mute-stream@^1.0.0: resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-1.0.0.tgz#e31bd9fe62f0aed23520aa4324ea6671531e013e" integrity sha512-avsJQhyd+680gKXyG/sQc0nXaC6rBkPOfyHYcFb9+hdkqQkR9bdnkJ0AMZhke0oesPqIO+mFFJ+IdBc7mst4IA== -nan@^2.12.1: - version "2.22.0" - resolved "https://registry.yarnpkg.com/nan/-/nan-2.22.0.tgz#31bc433fc33213c97bad36404bb68063de604de3" - integrity sha512-nbajikzWTMwsW+eSsNm3QwlOs7het9gGJU5dDZzRTQGk03vyBOauxgI4VakDzE0PtsGTmXPsXTbbjVhRwR5mpw== - nanoid@^3.3.7: version "3.3.7" resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.7.tgz#d0c301a691bc8d54efa0a2226ccf3fe2fd656bd8" integrity sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g== -nanomatch@^1.2.9: - version "1.2.13" - resolved "https://registry.yarnpkg.com/nanomatch/-/nanomatch-1.2.13.tgz#b87a8aa4fc0de8fe6be88895b38983ff265bd119" - integrity sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA== - dependencies: - arr-diff "^4.0.0" - array-unique "^0.3.2" - define-property "^2.0.2" - extend-shallow "^3.0.2" - fragment-cache "^0.2.1" - is-windows "^1.0.2" - kind-of "^6.0.2" - object.pick "^1.3.0" - regex-not "^1.0.0" - snapdragon "^0.8.1" - to-regex "^3.0.1" - natural-compare-lite@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/natural-compare-lite/-/natural-compare-lite-1.4.0.tgz#17b09581988979fddafe0201e931ba933c96cbb4" @@ -10291,7 +9526,7 @@ negotiator@^0.6.3, negotiator@~0.6.4: resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.4.tgz#777948e2452651c570b712dd01c23e262713fff7" integrity sha512-myRT3DiWPHqho5PrJaIRyaMv2kgYf0mUVgBNOYMuCH5Ki1yEiQaf/ZJuQ62nvpc44wL5WDbTX7yGJi1Neevw8w== -neo-async@^2.6.2: +neo-async@^2.5.0, neo-async@^2.6.2: version "2.6.2" resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.2.tgz#b4aafb93e3aeb2d8174ca53cf163ab7d7308305f" integrity sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw== @@ -10301,16 +9536,28 @@ nice-try@^1.0.4: resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366" integrity sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ== -nocache@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/nocache/-/nocache-2.1.0.tgz#120c9ffec43b5729b1d5de88cd71aa75a0ba491f" - integrity sha512-0L9FvHG3nfnnmaEQPjT9xhfN4ISk0A8/2j4M37Np4mcDesJjHgEUfgPhdCyZuFI954tjokaIj/A3NdpFNdEh4Q== +nocache@^3.0.1: + version "3.0.4" + resolved "https://registry.yarnpkg.com/nocache/-/nocache-3.0.4.tgz#5b37a56ec6e09fc7d401dceaed2eab40c8bfdf79" + integrity sha512-WDD0bdg9mbq6F4mRxEYcPWwfA1vxd0mrvKOyxI7Xj/atfRHVeutzuWByG//jfm4uPzp0y4Kj051EORCBSQMycw== + +node-abort-controller@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/node-abort-controller/-/node-abort-controller-3.1.1.tgz#a94377e964a9a37ac3976d848cb5c765833b8548" + integrity sha512-AGK2yQKIjRuqnc6VkX2Xj5d+QW8xZ87pa1UK6yA6ouUyuxfHuMP6umE5QK7UmTeOAymo+Zx1Fxiuw9rVx8taHQ== node-addon-api@^5.0.0: version "5.1.0" resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-5.1.0.tgz#49da1ca055e109a23d537e9de43c09cca21eb762" integrity sha512-eh0GgfEkpnoWDq+VY8OyvYhFEzBk6jIYbRKdIlyTiAXIVJ8PyBaKb0rp7oDtoddbdoHWhq8wwr+XZ81F1rpNdA== +node-dir@^0.1.17: + version "0.1.17" + resolved "https://registry.yarnpkg.com/node-dir/-/node-dir-0.1.17.tgz#5f5665d93351335caabef8f1c554516cf5f1e4e5" + integrity sha512-tmPX422rYgofd4epzrNoOXiE8XFZYOcCq1vD7MAXCDO+O+zndlA2ztdKKMa+EeuBG5tHETpr4ml4RGgpqDCCAg== + dependencies: + minimatch "^3.0.2" + node-fetch@2.6.7: version "2.6.7" resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.7.tgz#24de9fba827e3b4ae44dc8b20256a379160052ad" @@ -10318,14 +9565,6 @@ node-fetch@2.6.7: dependencies: whatwg-url "^5.0.0" -node-fetch@^1.0.1: - version "1.7.3" - resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-1.7.3.tgz#980f6f72d85211a5347c6b2bc18c5b84c3eb47ef" - integrity sha512-NhZ4CsKx7cYm2vSrBAr2PvFOe6sWDf0UYLRqA6svUYg7+/TSfVAu49jYC4BvQ4Sms9SZgdqGBgroqfDhJdTyKQ== - dependencies: - encoding "^0.1.11" - is-stream "^1.0.1" - node-fetch@^2.2.0, node-fetch@^2.6.0: version "2.7.0" resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.7.0.tgz#d0f0fa6e3e2dc1d27efcd8ad99d550bda94d187d" @@ -10447,13 +9686,6 @@ normalize-package-data@^6.0.0, normalize-package-data@^6.0.1: semver "^7.3.5" validate-npm-package-license "^3.0.4" -normalize-path@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9" - integrity sha512-3pKJwH184Xo/lnH6oyP1q2pMd7HcypqqmRs91/6/i2CGtWwIKGCkOOMTm/zXbgTEWHw1uNpNi/igc3ePOYHb6w== - dependencies: - remove-trailing-separator "^1.0.1" - normalize-path@^3.0.0, normalize-path@~3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" @@ -10544,13 +9776,6 @@ npm-run-all@^4.1.5: shell-quote "^1.6.1" string.prototype.padend "^3.0.0" -npm-run-path@^2.0.0: - version "2.0.2" - resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-2.0.2.tgz#35a9232dfa35d7067b4cb2ddf2357b1871536c5f" - integrity sha512-lJxZYlT4DW/bRUtFh1MQIWqmLwQfAxnqWG4HhEdjMlkrJYnJn0Jrr2u3mgxqaWsdiBc76TYkTG/mhrnYTuzfHw== - dependencies: - path-key "^2.0.0" - npm-run-path@^4.0.0, npm-run-path@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-4.0.1.tgz#b7ecd1e5ed53da8e37a55e1c2269e0b97ed748ea" @@ -10634,25 +9859,16 @@ nwsapi@^2.2.2: "@nx/nx-win32-arm64-msvc" "20.1.0" "@nx/nx-win32-x64-msvc" "20.1.0" -ob1@0.59.0: - version "0.59.0" - resolved "https://registry.yarnpkg.com/ob1/-/ob1-0.59.0.tgz#ee103619ef5cb697f2866e3577da6f0ecd565a36" - integrity sha512-opXMTxyWJ9m68ZglCxwo0OPRESIC/iGmKFPXEXzMZqsVIrgoRXOHmoMDkQzz4y3irVjbyPJRAh5pI9fd0MJTFQ== +ob1@0.76.9: + version "0.76.9" + resolved "https://registry.yarnpkg.com/ob1/-/ob1-0.76.9.tgz#a493e4b83a0fb39200de639804b5d06eed5599dc" + integrity sha512-g0I/OLnSxf6OrN3QjSew3bTDJCdbZoWxnh8adh1z36alwCuGF1dgDeRA25bTYSakrG5WULSaWJPOdgnf1O/oQw== -object-assign@^4.0.1, object-assign@^4.1.0, object-assign@^4.1.1: +object-assign@^4.1.1: version "4.1.1" resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg== -object-copy@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/object-copy/-/object-copy-0.1.0.tgz#7e7d858b781bd7c991a41ba975ed3812754e998c" - integrity sha512-79LYn6VAb63zgtmAteVOWo9Vdj71ZVBy3Pbse+VqxDpEP83XuujMrGqHIwAXJ5I/aM0zU7dIyIAhifVTPrNItQ== - dependencies: - copy-descriptor "^0.1.0" - define-property "^0.2.5" - kind-of "^3.0.3" - object-inspect@^1.12.2, object-inspect@^1.13.1: version "1.13.1" resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.13.1.tgz#b96c6109324ccfef6b12216a956ca4dc2ff94bc2" @@ -10663,13 +9879,6 @@ object-keys@^1.1.1: resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== -object-visit@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/object-visit/-/object-visit-1.0.1.tgz#f79c4493af0c5377b59fe39d395e41042dd045bb" - integrity sha512-GBaMwwAVK9qbQN3Scdo0OyvgPW7l3lnaVMj84uTOZlswkX0KpF6fyDBJhtTthf7pymztoN36/KEr1DyhF96zEA== - dependencies: - isobject "^3.0.0" - object.assign@^4.1.3, object.assign@^4.1.5: version "4.1.5" resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.5.tgz#3a833f9ab7fdb80fc9e8d2300c803d216d8fdbb0" @@ -10717,13 +9926,6 @@ object.hasown@^1.1.2: define-properties "^1.1.4" es-abstract "^1.20.4" -object.pick@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/object.pick/-/object.pick-1.3.0.tgz#87a10ac4c1694bd2e1cbf53591a66141fb5dd747" - integrity sha512-tqa/UMy/CCoYmj+H5qc07qvSL9dqcs/WZENZ1JbtWBlATP+iVOe778gE6MSijnyCnORzDuX6hU+LA4SZ09YjFQ== - dependencies: - isobject "^3.0.1" - object.values@^1.1.6, object.values@^1.1.7: version "1.1.7" resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.1.7.tgz#617ed13272e7e1071b43973aa1655d9291b8442a" @@ -10766,13 +9968,6 @@ one-time@^1.0.0: dependencies: fn.name "1.x.x" -onetime@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/onetime/-/onetime-2.0.1.tgz#067428230fd67443b2794b22bba528b6867962d4" - integrity sha512-oyyPpiMaKARvvcgip+JV+7zci5L8D1W9RZIz2l1o08AM3pfspitVWnPt3mzHcBPp12oYMTy0pqrFs/C+m3EwsQ== - dependencies: - mimic-fn "^1.0.0" - onetime@^5.1.0, onetime@^5.1.2: version "5.1.2" resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e" @@ -10827,11 +10022,6 @@ optionator@^0.9.3: prelude-ls "^1.2.1" type-check "^0.4.0" -options@>=0.0.5: - version "0.0.6" - resolved "https://registry.yarnpkg.com/options/-/options-0.0.6.tgz#ec22d312806bb53e731773e7cdaefcf1c643128f" - integrity sha512-bOj3L1ypm++N+n7CEbbe473A414AB7z+amKYshRb//iuL3MpdDCLhPnw6aVTdKB9g5ZRVHIEp8eUln6L2NUStg== - ora@5.3.0: version "5.3.0" resolved "https://registry.yarnpkg.com/ora/-/ora-5.3.0.tgz#fb832899d3a1372fe71c8b2c534bbfe74961bb6f" @@ -10846,18 +10036,6 @@ ora@5.3.0: strip-ansi "^6.0.0" wcwidth "^1.0.1" -ora@^3.4.0: - version "3.4.0" - resolved "https://registry.yarnpkg.com/ora/-/ora-3.4.0.tgz#bf0752491059a3ef3ed4c85097531de9fdbcd318" - integrity sha512-eNwHudNbO1folBP3JsZ19v9azXWtQZjICdr3Q0TDPIaeBQ3mXLrh54wM+er0+hSp+dWKf+Z8KM58CYzEyIYxYg== - dependencies: - chalk "^2.4.2" - cli-cursor "^2.1.0" - cli-spinners "^2.0.0" - log-symbols "^2.2.0" - strip-ansi "^5.2.0" - wcwidth "^1.0.1" - ora@^5.4.1: version "5.4.1" resolved "https://registry.yarnpkg.com/ora/-/ora-5.4.1.tgz#1b2678426af4ac4a509008e5e4ac9e9959db9e18" @@ -10878,7 +10056,7 @@ os-browserify@^0.3.0: resolved "https://registry.yarnpkg.com/os-browserify/-/os-browserify-0.3.0.tgz#854373c7f5c2315914fc9bfc6bd8238fdda1ec27" integrity sha512-gjcpUc3clBf9+210TRaDWbf+rZZZEshZ+DlXMRCeAjp0xhTrnQsKHypIy1J3d5hKdUzj69t708EHtU8P6bUn0A== -os-tmpdir@^1.0.0, os-tmpdir@~1.0.2: +os-tmpdir@~1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" integrity sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g== @@ -11063,11 +10241,6 @@ parse-ms@^2.1.0: resolved "https://registry.yarnpkg.com/parse-ms/-/parse-ms-2.1.0.tgz#348565a753d4391fa524029956b172cb7753097d" integrity sha512-kHt7kzLoS9VBZfUsiKjv43mr91ea+U05EyKkEtqp7vNbHxmaVuEqN7XxeEVnGrMtYOAxGrDElSi96K7EgO1zCA== -parse-node-version@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/parse-node-version/-/parse-node-version-1.0.1.tgz#e2b5dbede00e7fa9bc363607f53327e8b073189b" - integrity sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA== - parse-path@^7.0.0: version "7.0.0" resolved "https://registry.yarnpkg.com/parse-path/-/parse-path-7.0.0.tgz#605a2d58d0a749c8594405d8cc3a2bf76d16099b" @@ -11094,11 +10267,6 @@ parseurl@~1.3.3: resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4" integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ== -pascalcase@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/pascalcase/-/pascalcase-0.1.1.tgz#b363e55e8006ca6fe21784d2db22bd15d7917f14" - integrity sha512-XHXfu/yOQRy9vYOtUDVMN60OEJjW013GoObG1o+xwQTpB9eYJX/BjXMsdW13ZDPruFhYYn0AG22w0xgQMwl3Nw== - path-exists@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" @@ -11114,7 +10282,7 @@ path-is-absolute@^1.0.0: resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== -path-key@^2.0.0, path-key@^2.0.1: +path-key@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40" integrity sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw== @@ -11311,36 +10479,11 @@ pkg-dir@^4.2.0: dependencies: find-up "^4.0.0" -plist@^3.0.1, plist@^3.0.5: - version "3.1.0" - resolved "https://registry.yarnpkg.com/plist/-/plist-3.1.0.tgz#797a516a93e62f5bde55e0b9cc9c967f860893c9" - integrity sha512-uysumyrvkUX0rX/dEVqt8gC3sTBzd4zoWfLeS29nb53imdaXVvLINYXTI2GNqzaMuvacNx4uJQ8+b3zXR0pkgQ== - dependencies: - "@xmldom/xmldom" "^0.8.8" - base64-js "^1.5.1" - xmlbuilder "^15.1.1" - -plugin-error@^0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/plugin-error/-/plugin-error-0.1.2.tgz#3b9bb3335ccf00f425e07437e19276967da47ace" - integrity sha512-WzZHcm4+GO34sjFMxQMqZbsz3xiNEgonCskQ9v+IroMmYgk/tas8dG+Hr2D6IbRPybZ12oWpzE/w3cGJ6FJzOw== - dependencies: - ansi-cyan "^0.1.1" - ansi-red "^0.1.1" - arr-diff "^1.0.1" - arr-union "^2.0.1" - extend-shallow "^1.1.2" - pluralize@^8.0.0: version "8.0.0" resolved "https://registry.yarnpkg.com/pluralize/-/pluralize-8.0.0.tgz#1a6fa16a38d12a1901e0320fa017051c539ce3b1" integrity sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA== -posix-character-classes@^0.1.0: - version "0.1.1" - resolved "https://registry.yarnpkg.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab" - integrity sha512-xTgYBc3fuo7Yt7JbiuFxSYGToMoz8fLoE6TC9Wx1P/u+LfeThMOAqmuyECnlBaaJb+u1m9hHiXUEtwW4OzfUJg== - possible-typed-array-names@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz#89bb63c6fada2c3e90adc4a647beeeb39cc7bf8f" @@ -11439,25 +10582,15 @@ pretty-bytes@^5.6.0: resolved "https://registry.yarnpkg.com/pretty-bytes/-/pretty-bytes-5.6.0.tgz#356256f643804773c82f64723fe78c92c62beaeb" integrity sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg== -pretty-format@^24.9.0: - version "24.9.0" - resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-24.9.0.tgz#12fac31b37019a4eea3c11aa9a959eb7628aa7c9" - integrity sha512-00ZMZUiHaJrNfk33guavqgvfJS30sLYf0f8+Srklv0AMPodGGHcoHgksZ3OThYnIvOd+8yMCn0YiEOogjlgsnA== +pretty-format@^26.5.2, pretty-format@^26.6.2: + version "26.6.2" + resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-26.6.2.tgz#e35c2705f14cb7fe2fe94fa078345b444120fc93" + integrity sha512-7AeGuCYNGmycyQbCqd/3PWH4eOoX/OiCa0uphp57NVTeAGdJGaAliecxwBDHYQCIvrW7aDBZCYeNTP/WX69mkg== dependencies: - "@jest/types" "^24.9.0" - ansi-regex "^4.0.0" - ansi-styles "^3.2.0" - react-is "^16.8.4" - -pretty-format@^25.1.0, pretty-format@^25.2.0: - version "25.5.0" - resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-25.5.0.tgz#7873c1d774f682c34b8d48b6743a2bf2ac55791a" - integrity sha512-kbo/kq2LQ/A/is0PQwsEHM7Ca6//bGPPvU6UnsdDRSKTWxT/ru/xb88v4BJf6a69H+uTytOEsTusT9ksd/1iWQ== - dependencies: - "@jest/types" "^25.5.0" + "@jest/types" "^26.6.2" ansi-regex "^5.0.0" ansi-styles "^4.0.0" - react-is "^16.12.0" + react-is "^17.0.1" pretty-format@^29.0.0, pretty-format@^29.7.0: version "29.7.0" @@ -11526,21 +10659,14 @@ promise-retry@^2.0.1: err-code "^2.0.2" retry "^0.12.0" -promise@^7.1.1: - version "7.3.1" - resolved "https://registry.yarnpkg.com/promise/-/promise-7.3.1.tgz#064b72602b18f90f29192b8b1bc418ffd1ebd3bf" - integrity sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg== - dependencies: - asap "~2.0.3" - -promise@^8.0.3: +promise@^8.3.0: version "8.3.0" resolved "https://registry.yarnpkg.com/promise/-/promise-8.3.0.tgz#8cb333d1edeb61ef23869fbb8a4ea0279ab60e0a" integrity sha512-rZPNPKTOYVNEEKFaq1HqTgOwZD+4/YHS5ukLzQCypkj+OkYx7iv0mA91lJlpPPZ8vMau3IIGj5Qlwrx+8iiSmg== dependencies: asap "~2.0.6" -prompts@^2.0.1: +prompts@^2.0.1, prompts@^2.4.0: version "2.4.2" resolved "https://registry.yarnpkg.com/prompts/-/prompts-2.4.2.tgz#7b57e73b3a48029ad10ebd44f74b01722a4cb069" integrity sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q== @@ -11620,11 +10746,6 @@ ps-tree@1.2.0: dependencies: event-stream "=3.3.4" -pseudomap@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3" - integrity sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ== - psl@^1.1.33: version "1.9.0" resolved "https://registry.yarnpkg.com/psl/-/psl-1.9.0.tgz#d0df2a137f00794565fcaf3b2c00cd09f8d5a5a7" @@ -11675,6 +10796,13 @@ queue-microtask@^1.2.2: resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== +queue@6.0.2: + version "6.0.2" + resolved "https://registry.yarnpkg.com/queue/-/queue-6.0.2.tgz#b91525283e2315c7553d2efa18d83e76432fed65" + integrity sha512-iHZWu+q3IdFZFX36ro/lKBkSvfkztY5Y7HMiPlOUjhupPcG2JMfst2KKEpu5XndviX/3UhFbRngUPNKtgvtZiA== + dependencies: + inherits "~2.0.3" + quick-lru@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/quick-lru/-/quick-lru-4.0.1.tgz#5b8878f113a58217848c6482026c73e1ba57727f" @@ -11735,7 +10863,7 @@ react-bootstrap@^2.7.0: uncontrollable "^7.2.1" warning "^4.0.3" -react-devtools-core@^4.6.0: +react-devtools-core@^4.27.2: version "4.28.5" resolved "https://registry.yarnpkg.com/react-devtools-core/-/react-devtools-core-4.28.5.tgz#c8442b91f068cdf0c899c543907f7f27d79c2508" integrity sha512-cq/o30z9W2Wb4rzBefjv5fBalHU0rJGZCHAkf/RHSBWSSYwh8PlQTqqOJmgIIbBtpj27T6FIPXeomIjZtCNVqA== @@ -11772,11 +10900,21 @@ react-hook-form@^8.0.0-alpha.4: resolved "https://registry.yarnpkg.com/react-hook-form/-/react-hook-form-8.0.0-alpha.4.tgz#b5c41db3ce4cc74c7190d10ff9bbe9e1c2c3536d" integrity sha512-r2PCeSdG+vguXNScBYx2nQoo8xXf34WCXTx5AR+sfcRRzLJ4DAUUghEIbg2KMS32RZ4Nl9678VilHLC4Jq0tFQ== -react-is@^16.12.0, react-is@^16.13.1, react-is@^16.3.2, react-is@^16.7.0, react-is@^16.8.4: +"react-is@^16.12.0 || ^17.0.0 || ^18.0.0": + version "18.3.1" + resolved "https://registry.yarnpkg.com/react-is/-/react-is-18.3.1.tgz#e83557dc12eae63a99e003a46388b1dcbb44db7e" + integrity sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg== + +react-is@^16.13.1, react-is@^16.3.2, react-is@^16.7.0: version "16.13.1" resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4" integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== +react-is@^17.0.1: + version "17.0.2" + resolved "https://registry.yarnpkg.com/react-is/-/react-is-17.0.2.tgz#e691d4a8e9c789365655539ab372762b0efb54f0" + integrity sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w== + react-is@^18.0.0: version "18.2.0" resolved "https://registry.yarnpkg.com/react-is/-/react-is-18.2.0.tgz#199431eeaaa2e09f86427efbb4f1473edb47609b" @@ -11787,38 +10925,48 @@ react-lifecycles-compat@^3.0.4: resolved "https://registry.yarnpkg.com/react-lifecycles-compat/-/react-lifecycles-compat-3.0.4.tgz#4f1a273afdfc8f3488a8c516bfda78f872352362" integrity sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA== -react-native@^0.63.0: - version "0.63.5" - resolved "https://registry.yarnpkg.com/react-native/-/react-native-0.63.5.tgz#2c0d5dca527fb69bb481e89b2c86068f2641b62d" - integrity sha512-unjHZOcHek2xxPkBbyqGO//2Z/AriKTwtDzGTT/ujGMRE3odDJk8wKtZregurQ9cpTUtu1Bj5R5bJv3gQIG5zw== - dependencies: - "@babel/runtime" "^7.0.0" - "@react-native-community/cli" "^4.10.0" - "@react-native-community/cli-platform-android" "^4.10.0" - "@react-native-community/cli-platform-ios" "^4.10.0" +react-native@^0.72.13: + version "0.72.17" + resolved "https://registry.yarnpkg.com/react-native/-/react-native-0.72.17.tgz#54d6de38adf6e56fdde1a6b83ef9b138abae7384" + integrity sha512-k3dNe0XqoYCGGWTenbupWSj+ljW3GIfmYS5P4s3if4j0csx2YbenKgH1aJNWLp+UP7ONwfId6G+uBoUJfyMxXg== + dependencies: + "@jest/create-cache-key-function" "^29.2.1" + "@react-native-community/cli" "^11.4.1" + "@react-native-community/cli-platform-android" "^11.4.1" + "@react-native-community/cli-platform-ios" "^11.4.1" + "@react-native/assets-registry" "^0.72.0" + "@react-native/codegen" "^0.72.8" + "@react-native/gradle-plugin" "^0.72.11" + "@react-native/js-polyfills" "^0.72.1" + "@react-native/normalize-colors" "^0.72.0" + "@react-native/virtualized-lists" "^0.72.8" abort-controller "^3.0.0" anser "^1.4.9" + ansi-regex "^5.0.0" base64-js "^1.1.2" + deprecated-react-native-prop-types "^4.2.3" event-target-shim "^5.0.1" - fbjs "^1.0.0" - fbjs-scripts "^1.1.0" - hermes-engine "~0.5.0" + flow-enums-runtime "^0.0.5" invariant "^2.2.4" - jsc-android "^245459.0.0" - metro-babel-register "0.59.0" - metro-react-native-babel-transformer "0.59.0" - metro-source-map "0.59.0" + jest-environment-node "^29.2.1" + jsc-android "^250231.0.0" + memoize-one "^5.0.0" + metro-runtime "^0.76.9" + metro-source-map "^0.76.9" + mkdirp "^0.5.1" nullthrows "^1.1.1" - pretty-format "^24.9.0" - promise "^8.0.3" - prop-types "^15.7.2" - react-devtools-core "^4.6.0" + pretty-format "^26.5.2" + promise "^8.3.0" + react-devtools-core "^4.27.2" react-refresh "^0.4.0" + react-shallow-renderer "^16.15.0" regenerator-runtime "^0.13.2" - scheduler "0.19.1" - stacktrace-parser "^0.1.3" - use-subscription "^1.0.0" + scheduler "0.24.0-canary-efb381bbf-20230505" + stacktrace-parser "^0.1.10" + use-sync-external-store "^1.0.0" whatwg-fetch "^3.0.0" + ws "^6.2.2" + yargs "^17.6.2" react-redux@^8.0.5: version "8.1.3" @@ -11864,6 +11012,14 @@ react-router@6.23.0: dependencies: "@remix-run/router" "1.16.0" +react-shallow-renderer@^16.15.0: + version "16.15.0" + resolved "https://registry.yarnpkg.com/react-shallow-renderer/-/react-shallow-renderer-16.15.0.tgz#48fb2cf9b23d23cde96708fe5273a7d3446f4457" + integrity sha512-oScf2FqQ9LFVQgA73vr86xl2NaOIX73rh+YFqcOp68CWj56tSfgtGKrEbyhCj0rSijyG9M1CYprTh39fBi5hzA== + dependencies: + object-assign "^4.1.1" + react-is "^16.12.0 || ^17.0.0 || ^18.0.0" + react-transition-group@^4.4.5: version "4.4.5" resolved "https://registry.yarnpkg.com/react-transition-group/-/react-transition-group-4.4.5.tgz#e53d4e3f3344da8521489fbef8f2581d42becdd1" @@ -11945,7 +11101,16 @@ read@^3.0.1: dependencies: mute-stream "^1.0.0" -readable-stream@^2.0.1, readable-stream@^2.2.2, readable-stream@~2.3.6: +readable-stream@^3.0.0, readable-stream@^3.0.2, readable-stream@^3.1.1, readable-stream@^3.4.0, readable-stream@^3.6.0: + version "3.6.2" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.2.tgz#56a9b36ea965c00c5a93ef31eb111a0f11056967" + integrity sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA== + dependencies: + inherits "^2.0.3" + string_decoder "^1.1.1" + util-deprecate "^1.0.1" + +readable-stream@~2.3.6: version "2.3.8" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.8.tgz#91125e8042bba1b9887f49345f6277027ce8be9b" integrity sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA== @@ -11958,15 +11123,6 @@ readable-stream@^2.0.1, readable-stream@^2.2.2, readable-stream@~2.3.6: string_decoder "~1.1.1" util-deprecate "~1.0.1" -readable-stream@^3.0.0, readable-stream@^3.0.2, readable-stream@^3.1.1, readable-stream@^3.4.0, readable-stream@^3.6.0: - version "3.6.2" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.2.tgz#56a9b36ea965c00c5a93ef31eb111a0f11056967" - integrity sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA== - dependencies: - inherits "^2.0.3" - string_decoder "^1.1.1" - util-deprecate "^1.0.1" - readdirp@~3.6.0: version "3.6.0" resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7" @@ -11974,6 +11130,21 @@ readdirp@~3.6.0: dependencies: picomatch "^2.2.1" +readline@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/readline/-/readline-1.3.0.tgz#c580d77ef2cfc8752b132498060dc9793a7ac01c" + integrity sha512-k2d6ACCkiNYz222Fs/iNze30rRJ1iIicW7JuX/7/cozvih6YCkFZH+J6mAFDVgv0dRBaAyr4jDqC95R2y4IADg== + +recast@^0.21.0: + version "0.21.5" + resolved "https://registry.yarnpkg.com/recast/-/recast-0.21.5.tgz#e8cd22bb51bcd6130e54f87955d33a2b2e57b495" + integrity sha512-hjMmLaUXAm1hIuTqOdeYObMslq/q+Xff6QE3Y2P+uoHAg2nmVlLBps2hzh1UJDdMtDTMXOFewK6ky51JQIeECg== + dependencies: + ast-types "0.15.2" + esprima "~4.0.0" + source-map "~0.6.1" + tslib "^2.0.1" + redent@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/redent/-/redent-3.0.0.tgz#e557b7998316bb53c9f1f56fa626352c6963059f" @@ -12040,21 +11211,6 @@ regenerator-runtime@^0.14.0: resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.14.0.tgz#5e19d68eb12d486f797e15a3c6a918f7cec5eb45" integrity sha512-srw17NI0TUWHuGa5CFGGmhfNIeja30WMBfbslPNhf6JrqQlLN5gcrvig1oqPxiVaXb0oW0XRKtH6Nngs5lKCIA== -regenerator-transform@^0.15.2: - version "0.15.2" - resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.15.2.tgz#5bbae58b522098ebdf09bca2f83838929001c7a4" - integrity sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg== - dependencies: - "@babel/runtime" "^7.8.4" - -regex-not@^1.0.0, regex-not@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/regex-not/-/regex-not-1.0.2.tgz#1f4ece27e00b0b65e0247a6810e6a85d83a5752c" - integrity sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A== - dependencies: - extend-shallow "^3.0.2" - safe-regex "^1.1.0" - regexp.prototype.flags@^1.4.3, regexp.prototype.flags@^1.5.2: version "1.5.2" resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.5.2.tgz#138f644a3350f981a858c44f6bb1a61ff59be334" @@ -12089,21 +11245,6 @@ regjsparser@^0.12.0: dependencies: jsesc "~3.0.2" -remove-trailing-separator@^1.0.1: - version "1.1.0" - resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz#c24bce2a283adad5bc3f58e0d48249b92379d8ef" - integrity sha512-/hS+Y0u3aOfIETiaiirUFwDBDzmXPvO+jAfKTitUngIPzdKc6Z0LoFjM/CK5PL4C+eKwHohlHAb6H0VFfmmUsw== - -repeat-element@^1.1.2: - version "1.1.4" - resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.4.tgz#be681520847ab58c7568ac75fbfad28ed42d39e9" - integrity sha512-LFiNfRcSu7KK3evMyYOuCzv3L10TW7yC1G2/+StMjK8Y6Vqd2MG7r/Qjw4ghtuCOjFvlnms/iMmLqpvW/ES/WQ== - -repeat-string@^1.6.1: - version "1.6.1" - resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" - integrity sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w== - request-progress@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/request-progress/-/request-progress-3.0.0.tgz#4ca754081c7fec63f505e4faa825aa06cd669dbe" @@ -12180,11 +11321,6 @@ resolve-from@^4.0.0: resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== -resolve-url@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a" - integrity sha512-ZuF55hVUQaaczgOIwqWzkEcEidmlD/xl44x1UZnhOXcYuFN2S6+rcxpG+C1N3So0wvNI3DmJICUFfu2SxhBmvg== - resolve.exports@^2.0.0: version "2.0.2" resolved "https://registry.yarnpkg.com/resolve.exports/-/resolve.exports-2.0.2.tgz#f8c934b8e6a13f539e38b7098e2e36134f01e800" @@ -12199,7 +11335,7 @@ resolve@^1.10.0, resolve@^1.20.0, resolve@^1.22.1, resolve@^1.22.3, resolve@^1.2 path-parse "^1.0.7" supports-preserve-symlinks-flag "^1.0.0" -resolve@^1.14.2, resolve@^1.5.0: +resolve@^1.14.2: version "1.22.10" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.10.tgz#b663e83ffb09bbf2386944736baae803029b8b39" integrity sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w== @@ -12217,14 +11353,6 @@ resolve@^2.0.0-next.4: path-parse "^1.0.7" supports-preserve-symlinks-flag "^1.0.0" -restore-cursor@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-2.0.0.tgz#9f7ee287f82fd326d4fd162923d62129eee0dfaf" - integrity sha512-6IzJLuGi4+R14vwagDHX+JrXmPVtPpn4mffDJ1UdR7/Edm87fl6yi8mMBIVvFtJaNTUvjughmW4hwLhRG7gC1Q== - dependencies: - onetime "^2.0.0" - signal-exit "^3.0.2" - restore-cursor@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-3.1.0.tgz#39f67c54b3a7a58cea5236d95cf0034239631f7e" @@ -12233,11 +11361,6 @@ restore-cursor@^3.1.0: onetime "^5.1.0" signal-exit "^3.0.2" -ret@~0.1.10: - version "0.1.15" - resolved "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc" - integrity sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg== - retry-as-promised@^7.0.4: version "7.0.4" resolved "https://registry.yarnpkg.com/retry-as-promised/-/retry-as-promised-7.0.4.tgz#9df73adaeea08cb2948b9d34990549dc13d800a2" @@ -12258,13 +11381,6 @@ rfdc@^1.3.0: resolved "https://registry.yarnpkg.com/rfdc/-/rfdc-1.3.0.tgz#d0b7c441ab2720d05dc4cf26e01c89631d9da08b" integrity sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA== -rimraf@^2.5.4: - version "2.7.1" - resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec" - integrity sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w== - dependencies: - glob "^7.1.3" - rimraf@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" @@ -12287,10 +11403,12 @@ rimraf@^6.0.1: glob "^11.0.0" package-json-from-dist "^1.0.0" -rimraf@~2.2.6: - version "2.2.8" - resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.2.8.tgz#e439be2aaee327321952730f99a8929e4fc50582" - integrity sha512-R5KMKHnPAQaZMqLOsyuyUmcIjSeDm+73eoqQpaXA7AZ22BL+6C+1mcUscgOsNd8WVlJuvlgAPsegcx7pjlV0Dg== +rimraf@~2.6.2: + version "2.6.3" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.3.tgz#b2d104fe0d8fb27cf9e0a1cda8262dd3833c6cab" + integrity sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA== + dependencies: + glob "^7.1.3" rollup@^3.27.1: version "3.29.5" @@ -12324,12 +11442,7 @@ rollup@^4.0.2: "@rollup/rollup-win32-x64-msvc" "4.23.0" fsevents "~2.3.2" -rsvp@^4.8.4: - version "4.8.5" - resolved "https://registry.yarnpkg.com/rsvp/-/rsvp-4.8.5.tgz#c8f155311d167f68f21e168df71ec5b083113734" - integrity sha512-nfMOlASu9OnRJo1mbEk2cz0D56a1MBNrJ7orjRZQG10XDyuvwksKbuXNp6qa+kbn839HwjwhBzhFmdsaEAfauA== - -run-async@^2.2.0, run-async@^2.4.0: +run-async@^2.4.0: version "2.4.1" resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.4.1.tgz#8440eccf99ea3e70bd409d49aab88e10c189a455" integrity sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ== @@ -12351,18 +11464,6 @@ run-parallel@^1.1.9: dependencies: queue-microtask "^1.2.2" -rx-lite-aggregates@^4.0.8: - version "4.0.8" - resolved "https://registry.yarnpkg.com/rx-lite-aggregates/-/rx-lite-aggregates-4.0.8.tgz#753b87a89a11c95467c4ac1626c4efc4e05c67be" - integrity sha512-3xPNZGW93oCjiO7PtKxRK6iOVYBWBvtf9QHDfU23Oc+dLIQmAV//UnyXV/yihv81VS/UqoQPk4NegS8EFi55Hg== - dependencies: - rx-lite "*" - -rx-lite@*, rx-lite@^4.0.8: - version "4.0.8" - resolved "https://registry.yarnpkg.com/rx-lite/-/rx-lite-4.0.8.tgz#0b1e11af8bc44836f04a6407e92da42467b79444" - integrity sha512-Cun9QucwK6MIrp3mry/Y7hqD1oFqTYLQ4pGxaHTjIdaFDWRGGLikqp6u8LcWJnzpoALg9hap+JGk8sFIUuEGNA== - rxjs@^7.5.1, rxjs@^7.5.5, rxjs@^7.5.7, rxjs@^7.8.1: version "7.8.1" resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-7.8.1.tgz#6f6f3d99ea8044291efd92e7c7fcf562c4057543" @@ -12399,13 +11500,6 @@ safe-regex-test@^1.0.3: es-errors "^1.3.0" is-regex "^1.1.4" -safe-regex@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/safe-regex/-/safe-regex-1.1.0.tgz#40a3669f3b077d1e943d44629e157dd48023bf2e" - integrity sha512-aJXcif4xnaNUzvUuC5gcb46oTS7zvg4jpMTnuqtrEPlR3vFr4pxtdTwaF1Qs3Enjn9HK+ZlwQui+a7z0SywIzg== - dependencies: - ret "~0.1.10" - safe-stable-stringify@^2.3.1: version "2.4.2" resolved "https://registry.yarnpkg.com/safe-stable-stringify/-/safe-stable-stringify-2.4.2.tgz#ec7b037768098bf65310d1d64370de0dc02353aa" @@ -12416,21 +11510,6 @@ safe-stable-stringify@^2.3.1: resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== -sane@^4.0.3: - version "4.1.0" - resolved "https://registry.yarnpkg.com/sane/-/sane-4.1.0.tgz#ed881fd922733a6c461bc189dc2b6c006f3ffded" - integrity sha512-hhbzAgTIX8O7SHfp2c8/kREfEn4qO/9q8C9beyY6+tvZ87EpoZ3i1RIEvp27YBswnNbY9mWd6paKVmKbAgLfZA== - dependencies: - "@cnakazawa/watch" "^1.0.3" - anymatch "^2.0.0" - capture-exit "^2.0.0" - exec-sh "^0.3.2" - execa "^1.0.0" - fb-watchman "^2.0.0" - micromatch "^3.1.4" - minimist "^1.1.1" - walker "~1.0.5" - sass-lookup@^5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/sass-lookup/-/sass-lookup-5.0.1.tgz#1f01d7ff21e09d8c9dcf8d05b3fca28f2f96e6ed" @@ -12447,11 +11526,6 @@ sass@^1.57.1: immutable "^4.0.0" source-map-js ">=0.6.2 <2.0.0" -sax@^1.2.4: - version "1.4.1" - resolved "https://registry.yarnpkg.com/sax/-/sax-1.4.1.tgz#44cc8988377f126304d3b3fc1010c733b929ef0f" - integrity sha512-+aWOz7yVScEGoKNd4PA10LZ8sk0A/z5+nXQG5giUO5rprX9jgYsTdov9qCchZiPIZezbZH+jRut8nPodFAX4Jg== - saxes@^6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/saxes/-/saxes-6.0.0.tgz#fe5b4a4768df4f14a201b1ba6a65c1f3d9988cc5" @@ -12459,13 +11533,12 @@ saxes@^6.0.0: dependencies: xmlchars "^2.2.0" -scheduler@0.19.1: - version "0.19.1" - resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.19.1.tgz#4f3e2ed2c1a7d65681f4c854fa8c5a1ccb40f196" - integrity sha512-n/zwRWRYSUj0/3g/otKDRPMh6qv2SYMWNq85IEa8iZyAv8od9zDYpGSnpBEjNgcMNq6Scbu5KfIPxNF72R/2EA== +scheduler@0.24.0-canary-efb381bbf-20230505: + version "0.24.0-canary-efb381bbf-20230505" + resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.24.0-canary-efb381bbf-20230505.tgz#5dddc60e29f91cd7f8b983d7ce4a99c2202d178f" + integrity sha512-ABvovCDe/k9IluqSh4/ISoq8tIJnW8euVAWYt5j/bg6dRnqwQwiGO1F/V4AyK96NGF/FB04FhOUDuWj8IKfABA== dependencies: loose-envify "^1.1.0" - object-assign "^4.1.1" scheduler@^0.23.0: version "0.23.0" @@ -12474,7 +11547,7 @@ scheduler@^0.23.0: dependencies: loose-envify "^1.1.0" -"semver@2 || 3 || 4 || 5", semver@^5.1.0, semver@^5.5.0, semver@^5.6.0: +"semver@2 || 3 || 4 || 5", semver@^5.5.0, semver@^5.6.0: version "5.7.2" resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.2.tgz#48d55db737c3287cd4835e17fa13feace1c41ef8" integrity sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g== @@ -12574,18 +11647,6 @@ set-function-length@^1.2.1: gopd "^1.0.1" has-property-descriptors "^1.0.1" -set-function-length@^1.2.2: - version "1.2.2" - resolved "https://registry.yarnpkg.com/set-function-length/-/set-function-length-1.2.2.tgz#aac72314198eaed975cf77b2c3b6b880695e5449" - integrity sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg== - dependencies: - define-data-property "^1.1.4" - es-errors "^1.3.0" - function-bind "^1.1.2" - get-intrinsic "^1.2.4" - gopd "^1.0.1" - has-property-descriptors "^1.0.2" - set-function-name@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/set-function-name/-/set-function-name-2.0.1.tgz#12ce38b7954310b9f61faa12701620a0c882793a" @@ -12595,21 +11656,6 @@ set-function-name@^2.0.1: functions-have-names "^1.2.3" has-property-descriptors "^1.0.0" -set-value@^2.0.0, set-value@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/set-value/-/set-value-2.0.1.tgz#a18d40530e6f07de4228c7defe4227af8cad005b" - integrity sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw== - dependencies: - extend-shallow "^2.0.1" - is-extendable "^0.1.1" - is-plain-object "^2.0.3" - split-string "^3.0.1" - -setimmediate@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285" - integrity sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA== - setprototypeof@1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.2.0.tgz#66c9a24a73f9fc28cbe66b09fed3d33dcaf1b424" @@ -12651,21 +11697,16 @@ shebang-regex@^3.0.0: resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== -shell-quote@1.6.1: - version "1.6.1" - resolved "https://registry.yarnpkg.com/shell-quote/-/shell-quote-1.6.1.tgz#f4781949cce402697127430ea3b3c5476f481767" - integrity sha512-V0iQEZ/uoem3NmD91rD8XiuozJnq9/ZJnbHVXHnWqP1ucAhS3yJ7sLIIzEi57wFFcK3oi3kFUC46uSyWr35mxg== - dependencies: - array-filter "~0.0.0" - array-map "~0.0.0" - array-reduce "~0.0.0" - jsonify "~0.0.0" - shell-quote@^1.6.1: version "1.7.4" resolved "https://registry.yarnpkg.com/shell-quote/-/shell-quote-1.7.4.tgz#33fe15dee71ab2a81fcbd3a52106c5cfb9fb75d8" integrity sha512-8o/QEhSSRb1a5i7TFR0iM4G16Z0vYB2OQVs4G3aAFXjn3T6yEx8AZxy1PgDF7I00LZHYA3WxaSYIf5e5sAX8Rw== +shell-quote@^1.7.3: + version "1.8.2" + resolved "https://registry.yarnpkg.com/shell-quote/-/shell-quote-1.8.2.tgz#d2d83e057959d53ec261311e9e9b8f51dcb2934a" + integrity sha512-AzqKpGKjrj7EM6rKVQEPpB288oCfnrEIuyoT9cyF4nmGa7V8Zk6f7RRqYisX8X9m+Q7bd632aZW4ky7EhbQztA== + shimmer@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/shimmer/-/shimmer-1.2.1.tgz#610859f7de327b587efebf501fb43117f9aff337" @@ -12703,15 +11744,6 @@ sigstore@^2.2.0: "@sigstore/tuf" "^2.3.4" "@sigstore/verify" "^1.2.1" -simple-plist@^1.0.0: - version "1.3.1" - resolved "https://registry.yarnpkg.com/simple-plist/-/simple-plist-1.3.1.tgz#16e1d8f62c6c9b691b8383127663d834112fb017" - integrity sha512-iMSw5i0XseMnrhtIzRb7XpQEXepa9xhWxGUojHBL43SIpQuDQkh3Wpy67ZbDzZVr6EKxvwVChnVpdl8hEVLDiw== - dependencies: - bplist-creator "0.1.0" - bplist-parser "0.3.1" - plist "^3.0.5" - simple-swizzle@^0.2.2: version "0.2.2" resolved "https://registry.yarnpkg.com/simple-swizzle/-/simple-swizzle-0.2.2.tgz#a4da6b635ffcccca33f70d17cb92592de95e557a" @@ -12736,11 +11768,6 @@ slash@3.0.0, slash@^3.0.0: resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== -slash@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/slash/-/slash-2.0.0.tgz#de552851a1759df3a8f206535442f5ec4ddeab44" - integrity sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A== - slice-ansi@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-2.1.0.tgz#cacd7693461a637a5788d92a7dd4fba068e81636" @@ -12791,36 +11818,6 @@ smol-toml@~1.3.0: resolved "https://registry.yarnpkg.com/smol-toml/-/smol-toml-1.3.1.tgz#d9084a9e212142e3cab27ef4e2b8e8ba620bfe15" integrity sha512-tEYNll18pPKHroYSmLLrksq233j021G0giwW7P3D24jC54pQ5W5BXMsQ/Mvw1OJCmEYDgY+lrzT+3nNUtoNfXQ== -snapdragon-node@^2.0.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/snapdragon-node/-/snapdragon-node-2.1.1.tgz#6c175f86ff14bdb0724563e8f3c1b021a286853b" - integrity sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw== - dependencies: - define-property "^1.0.0" - isobject "^3.0.0" - snapdragon-util "^3.0.1" - -snapdragon-util@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/snapdragon-util/-/snapdragon-util-3.0.1.tgz#f956479486f2acd79700693f6f7b805e45ab56e2" - integrity sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ== - dependencies: - kind-of "^3.2.0" - -snapdragon@^0.8.1: - version "0.8.2" - resolved "https://registry.yarnpkg.com/snapdragon/-/snapdragon-0.8.2.tgz#64922e7c565b0e14204ba1aa7d6964278d25182d" - integrity sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg== - dependencies: - base "^0.11.1" - debug "^2.2.0" - define-property "^0.2.5" - extend-shallow "^2.0.1" - map-cache "^0.2.2" - source-map "^0.5.6" - source-map-resolve "^0.5.0" - use "^3.1.0" - socks-proxy-agent@^8.0.3: version "8.0.4" resolved "https://registry.yarnpkg.com/socks-proxy-agent/-/socks-proxy-agent-8.0.4.tgz#9071dca17af95f483300316f4b063578fa0db08c" @@ -12850,17 +11847,6 @@ sort-keys@^2.0.0: resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.2.0.tgz#16b809c162517b5b8c3e7dcd315a2a5c2612b2af" integrity sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg== -source-map-resolve@^0.5.0: - version "0.5.3" - resolved "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.5.3.tgz#190866bece7553e1f8f267a2ee82c606b5509a1a" - integrity sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw== - dependencies: - atob "^2.1.2" - decode-uri-component "^0.2.0" - resolve-url "^0.2.1" - source-map-url "^0.4.0" - urix "^0.1.0" - source-map-support@0.5.13: version "0.5.13" resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.13.tgz#31b24a9c2e73c2de85066c0feb7d44767ed52932" @@ -12877,11 +11863,6 @@ source-map-support@^0.5.16, source-map-support@~0.5.20: buffer-from "^1.0.0" source-map "^0.6.0" -source-map-url@^0.4.0: - version "0.4.1" - resolved "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.4.1.tgz#0af66605a745a5a2f91cf1bbf8a7afbc283dec56" - integrity sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw== - source-map@^0.5.6: version "0.5.7" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" @@ -12923,13 +11904,6 @@ spdx-license-ids@^3.0.0: resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.12.tgz#69077835abe2710b65f03969898b6637b505a779" integrity sha512-rr+VVSXtRhO4OHbXUiAF7xW3Bo9DuuF6C5jH+q/x15j2jniycgKbxU09Hr0WqlSLUs4i4ltHGXqTe7VHclYWyA== -split-string@^3.0.1, split-string@^3.0.2: - version "3.1.0" - resolved "https://registry.yarnpkg.com/split-string/-/split-string-3.1.0.tgz#7cb09dda3a86585705c64b39a6466038682e8fe2" - integrity sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw== - dependencies: - extend-shallow "^3.0.0" - split2@^3.2.2: version "3.2.2" resolved "https://registry.yarnpkg.com/split2/-/split2-3.2.2.tgz#bf2cf2a37d838312c249c89206fd7a17dd12365f" @@ -12993,13 +11967,6 @@ stack-trace@0.0.x: resolved "https://registry.yarnpkg.com/stack-trace/-/stack-trace-0.0.10.tgz#547c70b347e8d32b4e108ea1a2a159e5fdde19c0" integrity sha512-KGzahc7puUKkzyMt+IqAep+TVNbKP+k2Lmwhub39m1AsTSkaDutx56aDCo+HLDzf/D26BIHTJWNiTG1KAJiQCg== -stack-utils@^1.0.1: - version "1.0.5" - resolved "https://registry.yarnpkg.com/stack-utils/-/stack-utils-1.0.5.tgz#a19b0b01947e0029c8e451d5d61a498f5bb1471b" - integrity sha512-KZiTzuV3CnSnSvgMRrARVCj+Ht7rMbauGDK0LdVFRGyenwdylpajAp4Q0i6SX8rEmbTpMMf6ryq2gb8pPq2WgQ== - dependencies: - escape-string-regexp "^2.0.0" - stack-utils@^2.0.3: version "2.0.6" resolved "https://registry.yarnpkg.com/stack-utils/-/stack-utils-2.0.6.tgz#aaf0748169c02fc33c8232abccf933f54a1cc34f" @@ -13012,7 +11979,7 @@ stackframe@^1.3.4: resolved "https://registry.yarnpkg.com/stackframe/-/stackframe-1.3.4.tgz#b881a004c8c149a5e8efef37d51b16e412943310" integrity sha512-oeVtt7eWQS+Na6F//S4kJ2K2VbRlS9D43mAlMyVpVWovy9o+jfgH8O9agzANzaiLjclA0oYzUXEM4PurhSUChw== -stacktrace-parser@^0.1.3: +stacktrace-parser@^0.1.10: version "0.1.10" resolved "https://registry.yarnpkg.com/stacktrace-parser/-/stacktrace-parser-0.1.10.tgz#29fb0cae4e0d0b85155879402857a1639eb6051a" integrity sha512-KJP1OCML99+8fhOHxwwzyWrlUuVX5GQ0ZpJTd1DFXhdkrvg1szxfHhawXUZ3g9TkXORQd4/WG68jMlQZ2p8wlg== @@ -13033,14 +12000,6 @@ start-server-and-test@^2.0.1: ps-tree "1.2.0" wait-on "8.0.1" -static-extend@^0.1.1: - version "0.1.2" - resolved "https://registry.yarnpkg.com/static-extend/-/static-extend-0.1.2.tgz#60809c39cbff55337226fd5e0b520f341f1fb5c6" - integrity sha512-72E9+uLc27Mt718pMHt9VMNiAL4LMsmDbBva8mxWUCkT07fSzEGMYUCk0XWY6lp0j6RBAG4cJ3mWuZv2OE3s0g== - dependencies: - define-property "^0.2.5" - object-copy "^0.1.0" - statuses@2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/statuses/-/statuses-2.0.1.tgz#55cb000ccf1d48728bd23c685a063998cf1a1b63" @@ -13051,11 +12010,6 @@ statuses@~1.5.0: resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c" integrity sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA== -stream-buffers@2.2.x: - version "2.2.0" - resolved "https://registry.yarnpkg.com/stream-buffers/-/stream-buffers-2.2.0.tgz#91d5f5130d1cef96dcfa7f726945188741d09ee4" - integrity sha512-uyQK/mx5QjHun80FLJTfaWE7JtwfRMKBLkMne6udYOmvH0CawotVa7TfgYHzAnpphn4+TweIx1QKMnRIbipmUg== - stream-combiner@~0.0.4: version "0.0.4" resolved "https://registry.yarnpkg.com/stream-combiner/-/stream-combiner-0.0.4.tgz#4d5e433c185261dde623ca3f44c586bcf5c4ad14" @@ -13092,23 +12046,6 @@ string-length@^4.0.1: is-fullwidth-code-point "^3.0.0" strip-ansi "^6.0.1" -string-width@^2.1.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" - integrity sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw== - dependencies: - is-fullwidth-code-point "^2.0.0" - strip-ansi "^4.0.0" - -string-width@^3.0.0, string-width@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-3.1.0.tgz#22767be21b62af1081574306f69ac51b62203961" - integrity sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w== - dependencies: - emoji-regex "^7.0.1" - is-fullwidth-code-point "^2.0.0" - strip-ansi "^5.1.0" - string-width@^5.0.0, string-width@^5.0.1, string-width@^5.1.2: version "5.1.2" resolved "https://registry.yarnpkg.com/string-width/-/string-width-5.1.2.tgz#14f8daec6d81e7221d2a357e668cab73bdbca794" @@ -13198,14 +12135,7 @@ stringify-object@^3.2.1: dependencies: ansi-regex "^5.0.1" -strip-ansi@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f" - integrity sha512-4XaJ2zQdCzROZDivEVIDPkcQn8LMFSa8kj8Gxb/Lnwzv9A8VctNZ+lfivC/sV3ivW8ElJTERXZoPBRrZKkNKow== - dependencies: - ansi-regex "^3.0.0" - -strip-ansi@^5.0.0, strip-ansi@^5.1.0, strip-ansi@^5.2.0: +strip-ansi@^5.0.0, strip-ansi@^5.2.0: version "5.2.0" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-5.2.0.tgz#8c9a536feb6afc962bdfa5b104a5091c1ad9c0ae" integrity sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA== @@ -13229,11 +12159,6 @@ strip-bom@^4.0.0: resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-4.0.0.tgz#9c3505c1db45bcedca3d9cf7a16f5c5aa3901878" integrity sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w== -strip-eof@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf" - integrity sha512-7FCwGGmx8mD5xQd3RPUvnSpUXHM3BWuzjtpD4TXsfcZ9EL4azvVVUscFYwD9nx8Kh+uCBC00XBtAykoMHwTh8Q== - strip-final-newline@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz#89b852fb2fcbe936f6f4b3187afb0a12c1ab58ad" @@ -13261,6 +12186,11 @@ strip-json-comments@~2.0.1: resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" integrity sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ== +strnum@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/strnum/-/strnum-1.0.5.tgz#5c4e829fe15ad4ff0d20c3db5ac97b73c9b072db" + integrity sha512-J8bbNyKKXl5qYcR36TIO8W3mVGVHrmmxsd5PAItGkmyzwJvybiw2IVq5nqd0i4LSNSkB/sx9VHllbfFdr9k1JA== + strong-log-transformer@2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/strong-log-transformer/-/strong-log-transformer-2.1.0.tgz#0f5ed78d325e0421ac6f90f7f10e691d6ae3ae10" @@ -13289,13 +12219,6 @@ supports-color@^5.3.0, supports-color@^5.5.0: dependencies: has-flag "^3.0.0" -supports-color@^6.1.0: - version "6.1.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-6.1.0.tgz#0764abc69c63d5ac842dd4867e8d025e880df8f3" - integrity sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ== - dependencies: - has-flag "^3.0.0" - supports-color@^7.1.0: version "7.2.0" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" @@ -13368,13 +12291,22 @@ temp-dir@1.0.0: resolved "https://registry.yarnpkg.com/temp-dir/-/temp-dir-1.0.0.tgz#0a7c0ea26d3a39afa7e0ebea9c1fc0bc4daa011d" integrity sha512-xZFXEGbG7SNC3itwBzI3RYjq/cEhBkx2hJuKGIUOcEULmkQExXiHat2z/qkISYsuR+IKumhEfKKbV5qXmhICFQ== -temp@0.8.3: - version "0.8.3" - resolved "https://registry.yarnpkg.com/temp/-/temp-0.8.3.tgz#e0c6bc4d26b903124410e4fed81103014dfc1f59" - integrity sha512-jtnWJs6B1cZlHs9wPG7BrowKxZw/rf6+UpGAkr8AaYmiTyTO7zQlLoST8zx/8TcUPnZmeBoB+H8ARuHZaSijVw== +temp@^0.8.4: + version "0.8.4" + resolved "https://registry.yarnpkg.com/temp/-/temp-0.8.4.tgz#8c97a33a4770072e0a05f919396c7665a7dd59f2" + integrity sha512-s0ZZzd0BzYv5tLSptZooSjK8oj6C+c19p7Vqta9+6NPOf7r+fxq0cJe6/oN4LTC79sy5NY8ucOJNgwsKCSbfqg== + dependencies: + rimraf "~2.6.2" + +terser@^5.15.0: + version "5.37.0" + resolved "https://registry.yarnpkg.com/terser/-/terser-5.37.0.tgz#38aa66d1cfc43d0638fab54e43ff8a4f72a21ba3" + integrity sha512-B8wRRkmre4ERucLM/uXx4MOV5cbnOlVAqUst+1+iLKPI0dOgFO28f84ptoQt9HEI537PMzfYa/d+GEPKTRXmYA== dependencies: - os-tmpdir "^1.0.0" - rimraf "~2.2.6" + "@jridgewell/source-map" "^0.3.3" + acorn "^8.8.2" + commander "^2.20.0" + source-map-support "~0.5.20" terser@^5.17.4: version "5.31.3" @@ -13410,10 +12342,10 @@ text-table@^0.2.0: resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" integrity sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw== -throat@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/throat/-/throat-4.1.0.tgz#89037cbc92c56ab18926e6ba4cbb200e15672a6a" - integrity sha512-wCVxLDcFxw7ujDxaeJC6nfl2XfHJNYs8yUYJnvMgtPEFlttP9tHSfRUv2vBe6C4hkVFPWoP1P6ZccbYjmSEkKA== +throat@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/throat/-/throat-5.0.0.tgz#c5199235803aad18754a667d659b5e72ce16764b" + integrity sha512-fcwX4mndzpLQKBS1DVYhGAcYaYt7vsHNIvQV+WXMvnow5cgjPphq5CaayLaGsjRdSCKZFNGt7/GYAuXaNOiYCA== throttleit@^1.0.0: version "1.0.1" @@ -13433,11 +12365,6 @@ through@2, "through@>=2.2.7 <3", through@^2.3.4, through@^2.3.6, through@^2.3.8, resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" integrity sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg== -time-stamp@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/time-stamp/-/time-stamp-1.1.0.tgz#764a5a11af50561921b133f3b44e618687e0f5c3" - integrity sha512-gLCeArryy2yNTRzTGKbZbloctj64jkZ57hj5zdraXue6aFgd6PmvVtEyiUU+hvU0v7q08oVv8r8ev0tRo6bvgw== - tmp@^0.0.33: version "0.0.33" resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9" @@ -13455,21 +12382,6 @@ tmpl@1.0.5: resolved "https://registry.yarnpkg.com/tmpl/-/tmpl-1.0.5.tgz#8683e0b902bb9c20c4f726e3c0b69f36518c07cc" integrity sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw== -to-object-path@^0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/to-object-path/-/to-object-path-0.3.0.tgz#297588b7b0e7e0ac08e04e672f85c1f4999e17af" - integrity sha512-9mWHdnGRuh3onocaHzukyvCZhzvr6tiflAy/JRFXcJX0TjgfWA9pk9t8CMbzmBE4Jfw58pXbkngtBtqYxzNEyg== - dependencies: - kind-of "^3.0.2" - -to-regex-range@^2.1.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-2.1.1.tgz#7c80c17b9dfebe599e27367e0d4dd5590141db38" - integrity sha512-ZZWNfCjUokXXDGXFpZehJIkZqq91BcULFq/Pi7M5i4JnxXdhMKAK682z8bCW3o8Hj1wuuzoKcW3DfVzaP6VuNg== - dependencies: - is-number "^3.0.0" - repeat-string "^1.6.1" - to-regex-range@^5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" @@ -13477,16 +12389,6 @@ to-regex-range@^5.0.1: dependencies: is-number "^7.0.0" -to-regex@^3.0.1, to-regex@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/to-regex/-/to-regex-3.0.2.tgz#13cfdd9b336552f30b51f33a8ae1b42a7a7599ce" - integrity sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw== - dependencies: - define-property "^2.0.2" - extend-shallow "^3.0.2" - regex-not "^1.0.2" - safe-regex "^1.1.0" - toidentifier@1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.1.tgz#3be34321a88a820ed1bd80dfaa33e479fbb8dd35" @@ -13612,7 +12514,7 @@ tslib@^1.8.1: resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== -tslib@^2.1.0, tslib@^2.3.0, tslib@^2.4.0, tslib@^2.6.2: +tslib@^2.0.1, tslib@^2.1.0, tslib@^2.3.0, tslib@^2.4.0, tslib@^2.6.2: version "2.8.1" resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.8.1.tgz#612efe4ed235d567e8aba5f2a5fab70280ade83f" integrity sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w== @@ -13785,11 +12687,6 @@ typescript@^4.9.4: resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.9.4.tgz#a2a3d2756c079abda241d75f149df9d561091e78" integrity sha512-Uz+dTXYzxXXbsFpM86Wh3dKCxrQqUcVMxwU54orwlJjOpO3ao8L7j5lH+dWfTwgCwIuM9GQ2kvVotzYJMXTBZg== -ua-parser-js@^0.7.18: - version "0.7.40" - resolved "https://registry.yarnpkg.com/ua-parser-js/-/ua-parser-js-0.7.40.tgz#c87d83b7bb25822ecfa6397a0da5903934ea1562" - integrity sha512-us1E3K+3jJppDBa3Tl0L3MOJiGhe1C6P0+nIvQAFYbxlMAx0h81eOwLmU57xgqToduDDPx3y5QsdjPfDu+FgOQ== - ua-parser-js@^1.0.32: version "1.0.39" resolved "https://registry.yarnpkg.com/ua-parser-js/-/ua-parser-js-1.0.39.tgz#bfc07f361549bf249bd8f4589a4cccec18fd2018" @@ -13818,11 +12715,6 @@ uglify-js@^3.1.4: resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.19.3.tgz#82315e9bbc6f2b25888858acd1fff8441035b77f" integrity sha512-v3Xu+yuwBXisp6QYTcH4UbH+xYJXqnq2m/LtQVWKWzYc1iehYnLixoQDN9FH6/j9/oybfd6W9Ghwkl8+UMKTKQ== -ultron@1.0.x: - version "1.0.2" - resolved "https://registry.yarnpkg.com/ultron/-/ultron-1.0.2.tgz#ace116ab557cd197386a4e88f4685378c8b2e4fa" - integrity sha512-QMpnpVtYaWEeY+MwKDN/UdKlE/LsFZXM5lO1u7GaZzNgmIbGixHEmVMIKT+vqYOALu3m5GYQy9kz4Xu4IVn7Ow== - unbox-primitive@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/unbox-primitive/-/unbox-primitive-1.0.2.tgz#29032021057d5e6cdbd08c5129c226dff8ed6f9e" @@ -13886,16 +12778,6 @@ unicode-property-aliases-ecmascript@^2.0.0: resolved "https://registry.yarnpkg.com/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz#43d41e3be698bd493ef911077c9b131f827e8ccd" integrity sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w== -union-value@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/union-value/-/union-value-1.0.1.tgz#0b6fe7b835aecda61c6ea4d4f02c14221e109847" - integrity sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg== - dependencies: - arr-union "^3.1.0" - get-value "^2.0.6" - is-extendable "^0.1.1" - set-value "^2.0.1" - unique-filename@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/unique-filename/-/unique-filename-3.0.0.tgz#48ba7a5a16849f5080d26c760c86cf5cf05770ea" @@ -13935,14 +12817,6 @@ unpipe@1.0.0, unpipe@~1.0.0: resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" integrity sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ== -unset-value@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/unset-value/-/unset-value-1.0.0.tgz#8376873f7d2335179ffb1e6fc3a8ed0dfc8ab559" - integrity sha512-PcA2tsuGSF9cnySLHTLSh2qrQiJ70mn+r+Glzxv2TWZblxsxCC52BDlZoPCsz7STd9pN7EZetkWZBAvk4cgZdQ== - dependencies: - has-value "^0.3.1" - isobject "^3.0.0" - untildify@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/untildify/-/untildify-4.0.0.tgz#2bc947b953652487e4600949fb091e3ae8cd919b" @@ -13968,11 +12842,6 @@ uri-js@^4.2.2: dependencies: punycode "^2.1.0" -urix@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/urix/-/urix-0.1.0.tgz#da937f7a62e21fec1fd18d49b35c2935067a6c72" - integrity sha512-Am1ousAhSLBeB9cG/7k7r2R0zj50uDRlZHPGbazid5s9rlF1F/QKYObEKSIunSjIOkJZqwRRLpvewjEkM7pSqg== - url-parse@^1.5.3: version "1.5.10" resolved "https://registry.yarnpkg.com/url-parse/-/url-parse-1.5.10.tgz#9d3c2f736c1d75dd3bd2be507dcc111f1e2ea9c1" @@ -13981,28 +12850,11 @@ url-parse@^1.5.3: querystringify "^2.1.1" requires-port "^1.0.0" -use-subscription@^1.0.0: - version "1.10.0" - resolved "https://registry.yarnpkg.com/use-subscription/-/use-subscription-1.10.0.tgz#ab4df8f39dcfa5c7739639535277045841b3b37b" - integrity sha512-ZRLhsMSjz01kBA8106zdzEjttJ20Rauscf0umwVRjaz8idRfoddOnAVH6VEBdu55eCq02L1g+j3NcleAar1aWw== - dependencies: - use-sync-external-store "^1.4.0" - use-sync-external-store@^1.0.0: version "1.2.0" resolved "https://registry.yarnpkg.com/use-sync-external-store/-/use-sync-external-store-1.2.0.tgz#7dbefd6ef3fe4e767a0cf5d7287aacfb5846928a" integrity sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA== -use-sync-external-store@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/use-sync-external-store/-/use-sync-external-store-1.4.0.tgz#adbc795d8eeb47029963016cefdf89dc799fcebc" - integrity sha512-9WXSPC5fMv61vaupRkCKCxsPxBocVnwakBEkMIHHpkTTg6icbJtg6jzgtLDm4bl3cSHAca52rYWih0k4K3PfHw== - -use@^3.1.0: - version "3.1.1" - resolved "https://registry.yarnpkg.com/use/-/use-3.1.1.tgz#d50c8cac79a19fbc20f2911f56eb973f4e10070f" - integrity sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ== - user-agent-data-types@^0.4.2: version "0.4.2" resolved "https://registry.yarnpkg.com/user-agent-data-types/-/user-agent-data-types-0.4.2.tgz#3bbd3662022c3fb9d0c2f7449b6cdd412a3f9e0d" @@ -14034,11 +12886,6 @@ uuid@^10.0.0: resolved "https://registry.yarnpkg.com/uuid/-/uuid-10.0.0.tgz#5a95aa454e6e002725c79055fd42aaba30ca6294" integrity sha512-8XkAphELsDnEGrDxUOHB3RGvXz6TeuYSGEZBOjtTtPm2lwhGBjLgOzLHB63IUWfBpNucQjND6d3AOudO+H3RWQ== -uuid@^3.3.2: - version "3.4.0" - resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.4.0.tgz#b23e4358afa8a202fe7a100af1f5f883f02007ee" - integrity sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A== - uuid@^8.3.2: version "8.3.2" resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2" @@ -14134,7 +12981,7 @@ walkdir@^0.4.1: resolved "https://registry.yarnpkg.com/walkdir/-/walkdir-0.4.1.tgz#dc119f83f4421df52e3061e514228a2db20afa39" integrity sha512-3eBwRyEln6E1MSzcxcVpQIhRG8Q1jLvEqRmCZqS3dsfXEDR/AhOF4d+jHg1qvDCpYaVRZjENPQyrVxAkQqxPgQ== -walker@^1.0.7, walker@^1.0.8, walker@~1.0.5: +walker@^1.0.7, walker@^1.0.8: version "1.0.8" resolved "https://registry.yarnpkg.com/walker/-/walker-1.0.8.tgz#bd498db477afe573dc04185f011d3ab8a8d7653f" integrity sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ== @@ -14191,7 +13038,7 @@ whatwg-encoding@^2.0.0: dependencies: iconv-lite "0.6.3" -whatwg-fetch@>=0.10.0, whatwg-fetch@^3.0.0: +whatwg-fetch@^3.0.0: version "3.6.20" resolved "https://registry.yarnpkg.com/whatwg-fetch/-/whatwg-fetch-3.6.20.tgz#580ce6d791facec91d37c72890995a0b48d31c70" integrity sha512-EqhiFU6daOA8kpjOWTL0olhVOF3i7OrFzSYiGsEMB8GcXS+RrzauAERX65xMeNWVqxA6HXH2m69Z9LaKKdisfg== @@ -14357,15 +13204,6 @@ wordwrap@^1.0.0: string-width "^4.1.0" strip-ansi "^6.0.0" -wrap-ansi@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-5.1.0.tgz#1fd1f67235d5b6d0fee781056001bfb694c03b09" - integrity sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q== - dependencies: - ansi-styles "^3.2.0" - string-width "^3.0.0" - strip-ansi "^5.0.0" - wrap-ansi@^6.0.1, wrap-ansi@^6.2.0: version "6.2.0" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-6.2.0.tgz#e9393ba07102e6c91a3b221478f0257cd2856e53" @@ -14397,7 +13235,7 @@ write-file-atomic@5.0.1, write-file-atomic@^5.0.0: imurmurhash "^0.1.4" signal-exit "^4.0.1" -write-file-atomic@^2.4.2: +write-file-atomic@^2.3.0, write-file-atomic@^2.4.2: version "2.4.3" resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-2.4.3.tgz#1fd2e9ae1df3e75b8d8c367443c692d4ca81f481" integrity sha512-GaETH5wwsX+GcnzhPgKcKjJ6M2Cq3/iZp1WyY/X1CSqrW+jVNM9Y7D8EC2sM4ZG/V8wZlSniJnCKWPmBYAucRQ== @@ -14435,15 +13273,14 @@ write-pkg@4.0.0: type-fest "^0.4.1" write-json-file "^3.2.0" -ws@^1.1.0, ws@^1.1.5: - version "1.1.5" - resolved "https://registry.yarnpkg.com/ws/-/ws-1.1.5.tgz#cbd9e6e75e09fc5d2c90015f21f0c40875e0dd51" - integrity sha512-o3KqipXNUdS7wpQzBHSe180lBGO60SoK0yVo3CYJgb2MkobuWuBX6dhkYP5ORCLd55y+SaflMOV5fqAB53ux4w== +ws@^6.2.2: + version "6.2.3" + resolved "https://registry.yarnpkg.com/ws/-/ws-6.2.3.tgz#ccc96e4add5fd6fedbc491903075c85c5a11d9ee" + integrity sha512-jmTjYU0j60B+vHey6TfR3Z7RD61z/hmxBS3VMSGIrroOWXQEneK1zNuotOUrGyBHQj0yrpsLHPWtigEFd13ndA== dependencies: - options ">=0.0.5" - ultron "1.0.x" + async-limiter "~1.0.0" -ws@^7: +ws@^7, ws@^7.5.1: version "7.5.10" resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.10.tgz#58b5c20dc281633f6c19113f39b349bd8bd558d9" integrity sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ== @@ -14453,41 +13290,16 @@ ws@^8.11.0: resolved "https://registry.yarnpkg.com/ws/-/ws-8.17.1.tgz#9293da530bb548febc95371d90f9c878727d919b" integrity sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ== -xcode@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/xcode/-/xcode-2.1.0.tgz#bab64a7e954bb50ca8d19da7e09531c65a43ecfe" - integrity sha512-uCrmPITrqTEzhn0TtT57fJaNaw8YJs1aCzs+P/QqxsDbvPZSv7XMPPwXrKvHtD6pLjBM/NaVwraWJm8q83Y4iQ== - dependencies: - simple-plist "^1.0.0" - uuid "^3.3.2" - xml-name-validator@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/xml-name-validator/-/xml-name-validator-4.0.0.tgz#79a006e2e63149a8600f15430f0a4725d1524835" integrity sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw== -xmlbuilder@^15.1.1: - version "15.1.1" - resolved "https://registry.yarnpkg.com/xmlbuilder/-/xmlbuilder-15.1.1.tgz#9dcdce49eea66d8d10b42cae94a79c3c8d0c2ec5" - integrity sha512-yMqGBqtXyeN1e3TGYvgNgDVZ3j84W4cwkOXQswghol6APgZWaff9lnbvN7MHYJOiXsvGPXtjTYJEiC9J2wv9Eg== - xmlchars@^2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/xmlchars/-/xmlchars-2.2.0.tgz#060fe1bcb7f9c76fe2a17db86a9bc3ab894210cb" integrity sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw== -xmldoc@^1.1.2: - version "1.3.0" - resolved "https://registry.yarnpkg.com/xmldoc/-/xmldoc-1.3.0.tgz#7823225b096c74036347c9ec5924d06b6a3cebab" - integrity sha512-y7IRWW6PvEnYQZNZFMRLNJw+p3pezM4nKYPfr15g4OOW9i8VpeydycFuipE2297OvZnh3jSb2pxOt9QpkZUVng== - dependencies: - sax "^1.2.4" - -xpipe@^1.0.5: - version "1.0.8" - resolved "https://registry.yarnpkg.com/xpipe/-/xpipe-1.0.8.tgz#2e970c255cfa39592726fa3458e2465d3754767f" - integrity sha512-E2RGg3fUCxHGdbrM7FMOqHNhiiDRW/tgbftCd/K6w1ce4386QZvkgIq77EBsHdAOmNfQjtmIKwXp67Dy18s8Dg== - xtend@^4.0.0, xtend@~4.0.1: version "4.0.2" resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54" @@ -14503,11 +13315,6 @@ y18n@^5.0.5: resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55" integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== -yallist@^2.1.2: - version "2.1.2" - resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52" - integrity sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A== - yallist@^3.0.2: version "3.1.1" resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" @@ -14523,19 +13330,16 @@ yaml@^2.1.3: resolved "https://registry.yarnpkg.com/yaml/-/yaml-2.3.4.tgz#53fc1d514be80aabf386dc6001eb29bf3b7523b2" integrity sha512-8aAvwVUSHpfEqTQ4w/KMlf3HcRdt50E5ODIQJBw1fQ5RL34xabzxtUlzTXVqc4rkZsPbvrXKWnABCD7kWSmocA== +yaml@^2.2.1: + version "2.7.0" + resolved "https://registry.yarnpkg.com/yaml/-/yaml-2.7.0.tgz#aef9bb617a64c937a9a748803786ad8d3ffe1e98" + integrity sha512-+hSoy/QHluxmC9kCIJyL/uyFmLmc+e5CFR5Wa+bpIhIj85LVb9ZH2nVnqrHoSvKogwODv0ClqZkmiSSaIH5LTA== + yargs-parser@21.1.1, yargs-parser@^21.1.1: version "21.1.1" resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-21.1.1.tgz#9096bceebf990d21bb31fa9516e0ede294a77d35" integrity sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw== -yargs-parser@^15.0.1: - version "15.0.3" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-15.0.3.tgz#316e263d5febe8b38eef61ac092b33dfcc9b1115" - integrity sha512-/MVEVjTXy/cGAjdtQf8dW3V9b97bPN7rNn8ETj6BmAQL7ibC7O1Q9SPJbGjgh3SlwoBNXMzj/ZGIj8mBgl12YA== - dependencies: - camelcase "^5.0.0" - decamelize "^1.2.0" - yargs-parser@^18.1.2: version "18.1.3" resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-18.1.3.tgz#be68c4975c6b2abf469236b0c870362fab09a7b0" @@ -14562,23 +13366,6 @@ yargs@17.7.2, yargs@^17.3.1, yargs@^17.6.2, yargs@^17.7.2: y18n "^5.0.5" yargs-parser "^21.1.1" -yargs@^14.2.0: - version "14.2.3" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-14.2.3.tgz#1a1c3edced1afb2a2fea33604bc6d1d8d688a414" - integrity sha512-ZbotRWhF+lkjijC/VhmOT9wSgyBQ7+zr13+YLkhfsSiTriYsMzkTUFP18pFhWwBeMa5gUc1MzbhrO6/VB7c9Xg== - dependencies: - cliui "^5.0.0" - decamelize "^1.2.0" - find-up "^3.0.0" - get-caller-file "^2.0.1" - require-directory "^2.1.1" - require-main-filename "^2.0.0" - set-blocking "^2.0.0" - string-width "^3.0.0" - which-module "^2.0.0" - y18n "^4.0.0" - yargs-parser "^15.0.1" - yargs@^15.1.0: version "15.4.1" resolved "https://registry.yarnpkg.com/yargs/-/yargs-15.4.1.tgz#0d87a16de01aee9d8bec2bfbf74f67851730f4f8" From 8f5b153bc59844dfe15f3d6bbc2ff338cd88ac84 Mon Sep 17 00:00:00 2001 From: Ilia Kurganskii Date: Fri, 3 Jan 2025 09:39:48 +0100 Subject: [PATCH 27/43] Revert "fix: fix build issue" This reverts commit ff9ec96d2cb76e6b0e9d3d02387eb7b3f42b8b77. --- .../instrumentation-otel-axios/package.json | 1 - .../package.json | 1 - .../instrumentation-websocket/package.json | 1 - packages/core/package.json | 1 - packages/react-native-sdk/package.json | 1 - packages/react-native-tracing/package.json | 7 +- yarn.lock | 2921 ++++++++++++----- 7 files changed, 2070 insertions(+), 863 deletions(-) diff --git a/experimental/instrumentation-otel-axios/package.json b/experimental/instrumentation-otel-axios/package.json index 16a0d189d..6919846de 100644 --- a/experimental/instrumentation-otel-axios/package.json +++ b/experimental/instrumentation-otel-axios/package.json @@ -14,7 +14,6 @@ "main": "./dist/cjs/index.js", "module": "./dist/esm/index.js", "types": "./dist/types/index.d.ts", - "react-native": "src/index", "scripts": { "test": "jest", "start": "yarn watch", diff --git a/experimental/instrumentation-otel-redux-saga/package.json b/experimental/instrumentation-otel-redux-saga/package.json index 19c8025a2..07d0c048f 100644 --- a/experimental/instrumentation-otel-redux-saga/package.json +++ b/experimental/instrumentation-otel-redux-saga/package.json @@ -14,7 +14,6 @@ "main": "./dist/cjs/index.js", "module": "./dist/esm/index.js", "types": "./dist/types/index.d.ts", - "react-native": "src/index", "scripts": { "test": "jest", "start": "yarn watch", diff --git a/experimental/instrumentation-websocket/package.json b/experimental/instrumentation-websocket/package.json index b5a9bf226..eafd8865f 100644 --- a/experimental/instrumentation-websocket/package.json +++ b/experimental/instrumentation-websocket/package.json @@ -14,7 +14,6 @@ "main": "./dist/cjs/index.js", "module": "./dist/esm/index.js", "types": "./dist/types/index.d.ts", - "react-native": "src/index", "scripts": { "test": "jest", "start": "yarn watch", diff --git a/packages/core/package.json b/packages/core/package.json index d2f788151..3f96f0720 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -13,7 +13,6 @@ "license": "Apache-2.0", "author": "Grafana Labs", "homepage": "https://github.com/grafana/faro-web-sdk", - "react-native": "src/index", "sideEffects": false, "repository": { "type": "git", diff --git a/packages/react-native-sdk/package.json b/packages/react-native-sdk/package.json index 4aa3e7f3e..75a299207 100644 --- a/packages/react-native-sdk/package.json +++ b/packages/react-native-sdk/package.json @@ -23,7 +23,6 @@ "main": "./dist/cjs/index.js", "module": "./dist/esm/index.js", "types": "./dist/types/index.d.ts", - "react-native": "src/index", "files": [ ".browserslistrc", "dist", diff --git a/packages/react-native-tracing/package.json b/packages/react-native-tracing/package.json index 1eb084615..61c799c68 100644 --- a/packages/react-native-tracing/package.json +++ b/packages/react-native-tracing/package.json @@ -24,7 +24,6 @@ "main": "./dist/cjs/index.js", "module": "./dist/esm/index.js", "types": "./dist/types/index.d.ts", - "react-native": "src/index", "files": [ ".browserslistrc", "dist", @@ -73,11 +72,11 @@ "@types/react": "^17.0.0", "@types/react-native": "^0.63.0", "react": "^17.0.0", - "react-native": "^0.72.13" + "react-native": "^0.63.0" }, "peerDependencies": { - "react": "*", - "react-native": "*" + "react": "^16.8.0 || ^17.0.0", + "react-native": "^0.63.0" }, "publishConfig": { "access": "public" diff --git a/yarn.lock b/yarn.lock index 4ed7d4555..032a1f484 100644 --- a/yarn.lock +++ b/yarn.lock @@ -34,7 +34,7 @@ resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.26.2.tgz#278b6b13664557de95b8f35b90d96785850bb56e" integrity sha512-Z0WgzSEa+aUcdiJuCIqgujCshpMWgUpgOxXotrYPSA53hA3qopNaqcJpyr0hVb1FeWdnqFA35/fUtXgBK8srQg== -"@babel/core@^7.11.6", "@babel/core@^7.12.3", "@babel/core@^7.13.16", "@babel/core@^7.20.0", "@babel/core@^7.23.9", "@babel/core@^7.25.2": +"@babel/core@^7.0.0", "@babel/core@^7.11.6", "@babel/core@^7.12.3", "@babel/core@^7.23.9", "@babel/core@^7.25.2": version "7.26.0" resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.26.0.tgz#d78b6023cc8f3114ccf049eb219613f74a747b40" integrity sha512-i1SLeK+DzNnQ3LL/CswPCa/E5u4lh1k6IAEphON8F+cXt0t9euTshDru0q7/IqMa1PMPz5RnHuHscF8/ZJsStg== @@ -55,17 +55,6 @@ json5 "^2.2.3" semver "^6.3.1" -"@babel/generator@^7.20.0", "@babel/generator@^7.26.3": - version "7.26.3" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.26.3.tgz#ab8d4360544a425c90c248df7059881f4b2ce019" - integrity sha512-6FF/urZvD0sTeO7k6/B15pMLC4CHUv1426lzr3N01aHJTl046uCAh9LXW/fzeXXjPNCJ6iABW5XaWOsIZB93aQ== - dependencies: - "@babel/parser" "^7.26.3" - "@babel/types" "^7.26.3" - "@jridgewell/gen-mapping" "^0.3.5" - "@jridgewell/trace-mapping" "^0.3.25" - jsesc "^3.0.2" - "@babel/generator@^7.25.9", "@babel/generator@^7.26.0", "@babel/generator@^7.7.2": version "7.26.2" resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.26.2.tgz#87b75813bec87916210e5e01939a4c823d6bb74f" @@ -77,6 +66,17 @@ "@jridgewell/trace-mapping" "^0.3.25" jsesc "^3.0.2" +"@babel/generator@^7.26.3", "@babel/generator@^7.5.0": + version "7.26.3" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.26.3.tgz#ab8d4360544a425c90c248df7059881f4b2ce019" + integrity sha512-6FF/urZvD0sTeO7k6/B15pMLC4CHUv1426lzr3N01aHJTl046uCAh9LXW/fzeXXjPNCJ6iABW5XaWOsIZB93aQ== + dependencies: + "@babel/parser" "^7.26.3" + "@babel/types" "^7.26.3" + "@jridgewell/gen-mapping" "^0.3.5" + "@jridgewell/trace-mapping" "^0.3.25" + jsesc "^3.0.2" + "@babel/helper-annotate-as-pure@^7.25.9": version "7.25.9" resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.25.9.tgz#d8eac4d2dc0d7b6e11fa6e535332e0d3184f06b4" @@ -128,13 +128,6 @@ lodash.debounce "^4.0.8" resolve "^1.14.2" -"@babel/helper-environment-visitor@^7.18.9": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.24.7.tgz#4b31ba9551d1f90781ba83491dd59cf9b269f7d9" - integrity sha512-DoiN84+4Gnd0ncbBOM9AZENV4a5ZiL39HYMyZJGZ/AZEykHYdJw0wW3kdcsh9/Kn+BRXHLkkklZ51ecPKmI1CQ== - dependencies: - "@babel/types" "^7.24.7" - "@babel/helper-member-expression-to-functions@^7.25.9": version "7.25.9" resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.25.9.tgz#9dfffe46f727005a5ea29051ac835fb735e4c1a3" @@ -172,15 +165,6 @@ resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.25.9.tgz#9cbdd63a9443a2c92a725cca7ebca12cc8dd9f46" integrity sha512-kSMlyUVdWe25rEsRGviIgOWnoT/nfABVWlqt9N19/dIPWViAOW2s9wznP5tURbs/IDuNk4gPy3YdYRgH3uxhBw== -"@babel/helper-remap-async-to-generator@^7.18.9", "@babel/helper-remap-async-to-generator@^7.25.9": - version "7.25.9" - resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.25.9.tgz#e53956ab3d5b9fb88be04b3e2f31b523afd34b92" - integrity sha512-IZtukuUeBbhgOcaW2s06OXTzVNJR0ybm4W5xC1opWFFJMZbwRj5LCk+ByYH7WdZPZTt8KnFwA8pvjN2yqcPlgw== - dependencies: - "@babel/helper-annotate-as-pure" "^7.25.9" - "@babel/helper-wrap-function" "^7.25.9" - "@babel/traverse" "^7.25.9" - "@babel/helper-replace-supers@^7.25.9": version "7.25.9" resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.25.9.tgz#ba447224798c3da3f8713fc272b145e33da6a5c5" @@ -213,15 +197,6 @@ resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.25.9.tgz#86e45bd8a49ab7e03f276577f96179653d41da72" integrity sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw== -"@babel/helper-wrap-function@^7.25.9": - version "7.25.9" - resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.25.9.tgz#d99dfd595312e6c894bd7d237470025c85eea9d0" - integrity sha512-ETzz9UTjQSTmw39GboatdymDq4XIQbR8ySgVrylRhPOFpsd+JrKHIuF0de7GCWmem+T4uC5z7EZguod7Wj4A4g== - dependencies: - "@babel/template" "^7.25.9" - "@babel/traverse" "^7.25.9" - "@babel/types" "^7.25.9" - "@babel/helpers@^7.26.0": version "7.26.0" resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.26.0.tgz#30e621f1eba5aa45fe6f4868d2e9154d884119a4" @@ -230,6 +205,13 @@ "@babel/template" "^7.25.9" "@babel/types" "^7.26.0" +"@babel/parser@^7.0.0", "@babel/parser@^7.26.3": + version "7.26.3" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.26.3.tgz#8c51c5db6ddf08134af1ddbacf16aaab48bac234" + integrity sha512-WJ/CvmY8Mea8iDXo6a7RK2wbmJITT5fN3BEkRuFlxVyNx8jOKIIhmC4fSkTcPcf8JyavbBwIe6OpiCOBXt/IcA== + dependencies: + "@babel/types" "^7.26.3" + "@babel/parser@^7.1.0", "@babel/parser@^7.14.7", "@babel/parser@^7.20.7", "@babel/parser@^7.21.8", "@babel/parser@^7.23.9", "@babel/parser@^7.25.9", "@babel/parser@^7.26.0", "@babel/parser@^7.26.2": version "7.26.2" resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.26.2.tgz#fd7b6f487cfea09889557ef5d4eeb9ff9a5abd11" @@ -237,24 +219,14 @@ dependencies: "@babel/types" "^7.26.0" -"@babel/parser@^7.13.16", "@babel/parser@^7.20.0", "@babel/parser@^7.26.3": - version "7.26.3" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.26.3.tgz#8c51c5db6ddf08134af1ddbacf16aaab48bac234" - integrity sha512-WJ/CvmY8Mea8iDXo6a7RK2wbmJITT5fN3BEkRuFlxVyNx8jOKIIhmC4fSkTcPcf8JyavbBwIe6OpiCOBXt/IcA== - dependencies: - "@babel/types" "^7.26.3" - -"@babel/plugin-proposal-async-generator-functions@^7.0.0": - version "7.20.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.20.7.tgz#bfb7276d2d573cb67ba379984a2334e262ba5326" - integrity sha512-xMbiLsn/8RK7Wq7VeVytytS2L6qE69bXPB10YCmMdDZbKF4okCqY74pI/jJQ/8U0b/F6NrT2+14b8/P9/3AMGA== +"@babel/plugin-external-helpers@^7.0.0": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-external-helpers/-/plugin-external-helpers-7.25.9.tgz#60c43843746fe3bccd7cb52d07c0b8699c21e6d4" + integrity sha512-Ro9pBweUvdxKyKKmWsqYaloZrxc2V+bseyPI7mV5DqBNvyNeGFFX+rPqicuEyOssiFYfoGyMjOF8n3ZAGBOPtg== dependencies: - "@babel/helper-environment-visitor" "^7.18.9" - "@babel/helper-plugin-utils" "^7.20.2" - "@babel/helper-remap-async-to-generator" "^7.18.9" - "@babel/plugin-syntax-async-generators" "^7.8.4" + "@babel/helper-plugin-utils" "^7.25.9" -"@babel/plugin-proposal-class-properties@^7.0.0", "@babel/plugin-proposal-class-properties@^7.13.0", "@babel/plugin-proposal-class-properties@^7.18.0": +"@babel/plugin-proposal-class-properties@^7.0.0": version "7.18.6" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.18.6.tgz#b110f59741895f7ec21a6fff696ec46265c446a3" integrity sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ== @@ -269,7 +241,7 @@ dependencies: "@babel/helper-plugin-utils" "^7.25.9" -"@babel/plugin-proposal-nullish-coalescing-operator@^7.13.8", "@babel/plugin-proposal-nullish-coalescing-operator@^7.18.0": +"@babel/plugin-proposal-nullish-coalescing-operator@^7.0.0": version "7.18.6" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.18.6.tgz#fdd940a99a740e577d6c753ab6fbb43fdb9467e1" integrity sha512-wQxQzxYeJqHcfppzBDnm1yAY0jSRkUXR2z8RePZYrKwMKgMlE8+Z6LUno+bd6LvbGh8Gltvy74+9pIYkr+XkKA== @@ -277,15 +249,7 @@ "@babel/helper-plugin-utils" "^7.18.6" "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" -"@babel/plugin-proposal-numeric-separator@^7.0.0": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.18.6.tgz#899b14fbafe87f053d2c5ff05b36029c62e13c75" - integrity sha512-ozlZFogPqoLm8WBr5Z8UckIoE4YQ5KESVcNudyXOR8uqIkliTEgJ3RoketfG6pmzLdeZF0H/wjE9/cCEitBl7Q== - dependencies: - "@babel/helper-plugin-utils" "^7.18.6" - "@babel/plugin-syntax-numeric-separator" "^7.10.4" - -"@babel/plugin-proposal-object-rest-spread@^7.0.0", "@babel/plugin-proposal-object-rest-spread@^7.20.0": +"@babel/plugin-proposal-object-rest-spread@^7.0.0": version "7.20.7" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.20.7.tgz#aa662940ef425779c75534a5c41e9d936edc390a" integrity sha512-d2S98yCiLxDVmBmE8UjGcfPvNEUbA1U5q5WxaWFUGRzJSVAZqm5W6MbPct0jxnegUZ0niLeNX+IOzEs7wYg9Dg== @@ -304,7 +268,7 @@ "@babel/helper-plugin-utils" "^7.18.6" "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" -"@babel/plugin-proposal-optional-chaining@^7.13.12", "@babel/plugin-proposal-optional-chaining@^7.20.0": +"@babel/plugin-proposal-optional-chaining@^7.0.0": version "7.21.0" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.21.0.tgz#886f5c8978deb7d30f678b2e24346b287234d3ea" integrity sha512-p4zeefM72gpmEe2fkUr/OnOXpWEf8nAgk7ZYVqqfFiyIG7oFfVZcCrU64hWn5xp4tQ9LkV4bTIa5rD0KANpKNA== @@ -334,7 +298,7 @@ dependencies: "@babel/helper-plugin-utils" "^7.12.13" -"@babel/plugin-syntax-dynamic-import@^7.8.0": +"@babel/plugin-syntax-dynamic-import@^7.0.0": version "7.8.3" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz#62bf98b2da3cd21d626154fc96ee5b3cb68eacb3" integrity sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ== @@ -348,7 +312,7 @@ dependencies: "@babel/helper-plugin-utils" "^7.25.9" -"@babel/plugin-syntax-flow@^7.0.0", "@babel/plugin-syntax-flow@^7.12.1", "@babel/plugin-syntax-flow@^7.18.0", "@babel/plugin-syntax-flow@^7.25.9": +"@babel/plugin-syntax-flow@^7.0.0", "@babel/plugin-syntax-flow@^7.2.0", "@babel/plugin-syntax-flow@^7.25.9": version "7.26.0" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.26.0.tgz#96507595c21b45fccfc2bc758d5c45452e6164fa" integrity sha512-B+O2DnPc0iG+YXFqOxv2WNuNU97ToWjOomUQ78DouOENWUaM5sVrmet9mcomUGQFwpJd//gvUagXBSdzO1fRKg== @@ -397,7 +361,7 @@ dependencies: "@babel/helper-plugin-utils" "^7.8.0" -"@babel/plugin-syntax-numeric-separator@^7.10.4", "@babel/plugin-syntax-numeric-separator@^7.8.3": +"@babel/plugin-syntax-numeric-separator@^7.8.3": version "7.10.4" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz#b9b070b3e33570cd9fd07ba7fa91c0dd37b9af97" integrity sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug== @@ -453,15 +417,6 @@ dependencies: "@babel/helper-plugin-utils" "^7.25.9" -"@babel/plugin-transform-async-to-generator@^7.20.0": - version "7.25.9" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.25.9.tgz#c80008dacae51482793e5a9c08b39a5be7e12d71" - integrity sha512-NT7Ejn7Z/LjUH0Gv5KsBCxh7BH3fbLTV0ptHvpeMvrt3cPThHfJfst9Wrb7S8EvJ7vRTFI7z+VAvFVEQn/m5zQ== - dependencies: - "@babel/helper-module-imports" "^7.25.9" - "@babel/helper-plugin-utils" "^7.25.9" - "@babel/helper-remap-async-to-generator" "^7.25.9" - "@babel/plugin-transform-block-scoped-functions@^7.0.0": version "7.25.9" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.25.9.tgz#5700691dbd7abb93de300ca7be94203764fce458" @@ -496,14 +451,21 @@ "@babel/helper-plugin-utils" "^7.25.9" "@babel/template" "^7.25.9" -"@babel/plugin-transform-destructuring@^7.0.0", "@babel/plugin-transform-destructuring@^7.20.0": +"@babel/plugin-transform-destructuring@^7.0.0": version "7.25.9" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.25.9.tgz#966ea2595c498224340883602d3cfd7a0c79cea1" integrity sha512-WkCGb/3ZxXepmMiX101nnGiU+1CAdut8oHyEOHxkKuS1qKpU2SMXE2uSvfz8PBuLd49V6LEsbtyPhWC7fnkgvQ== dependencies: "@babel/helper-plugin-utils" "^7.25.9" -"@babel/plugin-transform-flow-strip-types@^7.0.0", "@babel/plugin-transform-flow-strip-types@^7.20.0", "@babel/plugin-transform-flow-strip-types@^7.25.9": +"@babel/plugin-transform-exponentiation-operator@^7.0.0": + version "7.26.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.26.3.tgz#e29f01b6de302c7c2c794277a48f04a9ca7f03bc" + integrity sha512-7CAHcQ58z2chuXPWblnn1K6rLDnDWieghSOEmqQsrBenH0P9InCUtOJYD89pvngljmZlJcz3fcmgYsXFNGa1ZQ== + dependencies: + "@babel/helper-plugin-utils" "^7.25.9" + +"@babel/plugin-transform-flow-strip-types@^7.0.0": version "7.25.9" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.25.9.tgz#85879b42a8f5948fd6317069978e98f23ef8aec1" integrity sha512-/VVukELzPDdci7UUsWQaSkhgnjIWXnIyRpM02ldxaVoFK96c41So8JcKT3m0gYjyv7j5FNPGS5vfELrWalkbDA== @@ -542,7 +504,7 @@ dependencies: "@babel/helper-plugin-utils" "^7.25.9" -"@babel/plugin-transform-modules-commonjs@^7.0.0", "@babel/plugin-transform-modules-commonjs@^7.13.8", "@babel/plugin-transform-modules-commonjs@^7.25.9": +"@babel/plugin-transform-modules-commonjs@^7.0.0": version "7.26.3" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.26.3.tgz#8f011d44b20d02c3de44d8850d971d8497f981fb" integrity sha512-MgR55l4q9KddUDITEzEFYn5ZsGDXMSsU9E+kh7fjRXTIC3RHqfCo8RPRbyReYJh44HQ/yomFkqbOFohXvDCiIQ== @@ -550,12 +512,11 @@ "@babel/helper-module-transforms" "^7.26.0" "@babel/helper-plugin-utils" "^7.25.9" -"@babel/plugin-transform-named-capturing-groups-regex@^7.0.0": +"@babel/plugin-transform-object-assign@^7.0.0": version "7.25.9" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.25.9.tgz#454990ae6cc22fd2a0fa60b3a2c6f63a38064e6a" - integrity sha512-oqB6WHdKTGl3q/ItQhpLSnWWOpjUJLsOCLVyeFgeTktkBSCiurvPOsyt93gibI9CmuKvTUEtWmG5VhZD+5T/KA== + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-assign/-/plugin-transform-object-assign-7.25.9.tgz#686203d53ee688d1642bf3a8c751dfb3981021c8" + integrity sha512-I/Vl1aQnPsrrn837oLbo+VQtkNcjuuiATqwmuweg4fTauwHHQoxyjmjjOVKyO8OaTxgqYTKW3LuQsykXjDf5Ag== dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.25.9" "@babel/helper-plugin-utils" "^7.25.9" "@babel/plugin-transform-object-super@^7.0.0": @@ -612,6 +573,14 @@ "@babel/plugin-syntax-jsx" "^7.25.9" "@babel/types" "^7.25.9" +"@babel/plugin-transform-regenerator@^7.0.0": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.25.9.tgz#03a8a4670d6cebae95305ac6defac81ece77740b" + integrity sha512-vwDcDNsgMPDGP0nMqzahDWE5/MLcX8sv96+wfX7as7LoF/kr97Bo/7fI00lXY4wUXYfVmwIIyG80fGZ1uvt2qg== + dependencies: + "@babel/helper-plugin-utils" "^7.25.9" + regenerator-transform "^0.15.2" + "@babel/plugin-transform-runtime@^7.0.0": version "7.25.9" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.25.9.tgz#62723ea3f5b31ffbe676da9d6dae17138ae580ea" @@ -653,7 +622,7 @@ dependencies: "@babel/helper-plugin-utils" "^7.25.9" -"@babel/plugin-transform-typescript@^7.25.9", "@babel/plugin-transform-typescript@^7.5.0": +"@babel/plugin-transform-typescript@^7.5.0": version "7.26.3" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.26.3.tgz#3d6add9c78735623317387ee26d5ada540eee3fd" integrity sha512-6+5hpdr6mETwSKjmJUdYw0EIkATiQhnELWlE3kJFBwSg/BGIVwVaVbX+gOXBCdc7Ln1RXZxyWGecIXhUfnl7oA== @@ -672,27 +641,7 @@ "@babel/helper-create-regexp-features-plugin" "^7.25.9" "@babel/helper-plugin-utils" "^7.25.9" -"@babel/preset-flow@^7.13.13": - version "7.25.9" - resolved "https://registry.yarnpkg.com/@babel/preset-flow/-/preset-flow-7.25.9.tgz#ef8b5e7e3f24a42b3711e77fb14919b87dffed0a" - integrity sha512-EASHsAhE+SSlEzJ4bzfusnXSHiU+JfAYzj+jbw2vgQKgq5HrUr8qs+vgtiEL5dOH6sEweI+PNt2D7AqrDSHyqQ== - dependencies: - "@babel/helper-plugin-utils" "^7.25.9" - "@babel/helper-validator-option" "^7.25.9" - "@babel/plugin-transform-flow-strip-types" "^7.25.9" - -"@babel/preset-typescript@^7.13.0": - version "7.26.0" - resolved "https://registry.yarnpkg.com/@babel/preset-typescript/-/preset-typescript-7.26.0.tgz#4a570f1b8d104a242d923957ffa1eaff142a106d" - integrity sha512-NMk1IGZ5I/oHhoXEElcm+xUnL/szL6xflkFZmoEU9xj1qSJXpiS7rsspYo92B4DRCDvZn2erT5LdsCeXAKNCkg== - dependencies: - "@babel/helper-plugin-utils" "^7.25.9" - "@babel/helper-validator-option" "^7.25.9" - "@babel/plugin-syntax-jsx" "^7.25.9" - "@babel/plugin-transform-modules-commonjs" "^7.25.9" - "@babel/plugin-transform-typescript" "^7.25.9" - -"@babel/register@^7.13.16": +"@babel/register@^7.0.0": version "7.25.9" resolved "https://registry.yarnpkg.com/@babel/register/-/register-7.25.9.tgz#1c465acf7dc983d70ccc318eb5b887ecb04f021b" integrity sha512-8D43jXtGsYmEeDvm4MWHYUpWf8iiXgWYx3fW7E7Wb7Oe6FWqJPl5K6TuFW0dOwNZzEE5rjlaSJYH9JjrUKJszA== @@ -703,7 +652,7 @@ pirates "^4.0.6" source-map-support "^0.5.16" -"@babel/runtime@^7.0.0": +"@babel/runtime@^7.0.0", "@babel/runtime@^7.8.4": version "7.26.0" resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.26.0.tgz#8600c2f595f277c60815256418b85356a65173c1" integrity sha512-FDSOghenHTiToteC/QRlv2q3DhPZ/oOXTBoirfWNx1Cx3TMVcGWQtMMmQcSvb/JjpNeGzx8Pq/b4fKEJuWm1sw== @@ -726,7 +675,7 @@ "@babel/parser" "^7.25.9" "@babel/types" "^7.25.9" -"@babel/traverse@^7.20.0": +"@babel/traverse@^7.0.0": version "7.26.4" resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.26.4.tgz#ac3a2a84b908dde6d463c3bfa2c5fdc1653574bd" integrity sha512-fH+b7Y4p3yqvApJALCPJcwb0/XaOSgtK4pzV6WVjPR5GLFQBRI7pfoX2V2iM48NXvX07NUxxm1Vw98YjqTcU5w== @@ -760,7 +709,7 @@ "@babel/helper-string-parser" "^7.25.9" "@babel/helper-validator-identifier" "^7.25.9" -"@babel/types@^7.20.0", "@babel/types@^7.24.7", "@babel/types@^7.26.3": +"@babel/types@^7.26.3": version "7.26.3" resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.26.3.tgz#37e79830f04c2b5687acc77db97fbc75fb81f3c0" integrity sha512-vN5p+1kl59GVKMvTHt55NzzmYVxprfJD+ql7U9NFIfKCBkYE55LYtS+WtPlaYOyzydrKI8Nezd+aZextrd+FMA== @@ -773,6 +722,14 @@ resolved "https://registry.yarnpkg.com/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz#75a2e8b51cb758a7553d6804a5932d7aace75c39" integrity sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw== +"@cnakazawa/watch@^1.0.3": + version "1.0.4" + resolved "https://registry.yarnpkg.com/@cnakazawa/watch/-/watch-1.0.4.tgz#f864ae85004d0fcab6f50be9141c4da368d1656a" + integrity sha512-v9kIhKwjeZThiWrLmj0y17CWoyddASLj9O2yvbZkbvw/N3rWOYy9zkV66ursAoVr0mV15bL8g0c4QZUE6cdDoQ== + dependencies: + exec-sh "^0.3.2" + minimist "^1.2.0" + "@colors/colors@1.5.0": version "1.5.0" resolved "https://registry.yarnpkg.com/@colors/colors/-/colors-1.5.0.tgz#bb504579c1cae923e6576a4f5da43d25f97bdbd9" @@ -1035,11 +992,43 @@ protobufjs "^7.2.4" yargs "^17.7.2" +"@hapi/address@2.x.x": + version "2.1.4" + resolved "https://registry.yarnpkg.com/@hapi/address/-/address-2.1.4.tgz#5d67ed43f3fd41a69d4b9ff7b56e7c0d1d0a81e5" + integrity sha512-QD1PhQk+s31P1ixsX0H0Suoupp3VMXzIVMSwobR3F3MSUO2YCV0B7xqLcUw/Bh8yuvd3LhpyqLQWTNcRmp6IdQ== + +"@hapi/bourne@1.x.x": + version "1.3.2" + resolved "https://registry.yarnpkg.com/@hapi/bourne/-/bourne-1.3.2.tgz#0a7095adea067243ce3283e1b56b8a8f453b242a" + integrity sha512-1dVNHT76Uu5N3eJNTYcvxee+jzX4Z9lfciqRRHCU27ihbUcYi+iSc2iml5Ke1LXe1SyJCLA0+14Jh4tXJgOppA== + +"@hapi/hoek@8.x.x", "@hapi/hoek@^8.3.0": + version "8.5.1" + resolved "https://registry.yarnpkg.com/@hapi/hoek/-/hoek-8.5.1.tgz#fde96064ca446dec8c55a8c2f130957b070c6e06" + integrity sha512-yN7kbciD87WzLGc5539Tn0sApjyiGHAJgKvG9W8C7O+6c7qmoQMfVs0W4bX17eqz6C78QJqqFrtgdK5EWf6Qow== + "@hapi/hoek@^9.0.0", "@hapi/hoek@^9.3.0": version "9.3.0" resolved "https://registry.yarnpkg.com/@hapi/hoek/-/hoek-9.3.0.tgz#8368869dcb735be2e7f5cb7647de78e167a251fb" integrity sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ== +"@hapi/joi@^15.0.3": + version "15.1.1" + resolved "https://registry.yarnpkg.com/@hapi/joi/-/joi-15.1.1.tgz#c675b8a71296f02833f8d6d243b34c57b8ce19d7" + integrity sha512-entf8ZMOK8sc+8YfeOlM8pCfg3b5+WZIKBfUaaJT8UsjAAPjartzxIYm3TIbjvA4u+u++KbcXD38k682nVHDAQ== + dependencies: + "@hapi/address" "2.x.x" + "@hapi/bourne" "1.x.x" + "@hapi/hoek" "8.x.x" + "@hapi/topo" "3.x.x" + +"@hapi/topo@3.x.x": + version "3.1.6" + resolved "https://registry.yarnpkg.com/@hapi/topo/-/topo-3.1.6.tgz#68d935fa3eae7fdd5ab0d7f953f3205d8b2bfc29" + integrity sha512-tAag0jEcjwH+P2quUfipd7liWCNX2F8NvYjQp2wtInsZxnMlypdw0FtAOLxtvvkO+GSRRbmNi8m/5y42PQJYCQ== + dependencies: + "@hapi/hoek" "^8.3.0" + "@hapi/topo@^5.1.0": version "5.1.0" resolved "https://registry.yarnpkg.com/@hapi/topo/-/topo-5.1.0.tgz#dc448e332c6c6e37a4dc02fd84ba8d44b9afb012" @@ -1104,6 +1093,15 @@ resolved "https://registry.yarnpkg.com/@istanbuljs/schema/-/schema-0.1.3.tgz#e45e384e4b8ec16bce2fd903af78450f6bf7ec98" integrity sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA== +"@jest/console@^24.9.0": + version "24.9.0" + resolved "https://registry.yarnpkg.com/@jest/console/-/console-24.9.0.tgz#79b1bc06fb74a8cfb01cbdedf945584b1b9707f0" + integrity sha512-Zuj6b8TnKXi3q4ymac8EQfc3ea/uhLeCGThFqXeC8H9/raaH8ARPUTdId+XyGd03Z4In0/VjD2OYFcBF09fNLQ== + dependencies: + "@jest/source-map" "^24.9.0" + chalk "^2.0.1" + slash "^2.0.0" + "@jest/console@^29.7.0": version "29.7.0" resolved "https://registry.yarnpkg.com/@jest/console/-/console-29.7.0.tgz#cd4822dbdb84529265c5a2bdb529a3c9cc950ffc" @@ -1150,13 +1148,6 @@ slash "^3.0.0" strip-ansi "^6.0.0" -"@jest/create-cache-key-function@^29.2.1": - version "29.7.0" - resolved "https://registry.yarnpkg.com/@jest/create-cache-key-function/-/create-cache-key-function-29.7.0.tgz#793be38148fab78e65f40ae30c36785f4ad859f0" - integrity sha512-4QqS3LY5PBmTRHj9sAg1HLoPzqAI0uOX6wI/TRqHIcOxlFidy6YEmCQJk6FSZjNLGCeubDMfmkWL+qaLKhSGQA== - dependencies: - "@jest/types" "^29.6.3" - "@jest/environment@^29.7.0": version "29.7.0" resolved "https://registry.yarnpkg.com/@jest/environment/-/environment-29.7.0.tgz#24d61f54ff1f786f3cd4073b4b94416383baf2a7" @@ -1182,6 +1173,15 @@ expect "^29.7.0" jest-snapshot "^29.7.0" +"@jest/fake-timers@^24.9.0": + version "24.9.0" + resolved "https://registry.yarnpkg.com/@jest/fake-timers/-/fake-timers-24.9.0.tgz#ba3e6bf0eecd09a636049896434d306636540c93" + integrity sha512-eWQcNa2YSwzXWIMC5KufBh3oWRIijrQFROsIqt6v/NS9Io/gknw1jsAC9c+ih/RQX4A3O7SeWAhQeN0goKhT9A== + dependencies: + "@jest/types" "^24.9.0" + jest-message-util "^24.9.0" + jest-mock "^24.9.0" + "@jest/fake-timers@^29.7.0": version "29.7.0" resolved "https://registry.yarnpkg.com/@jest/fake-timers/-/fake-timers-29.7.0.tgz#fd91bf1fffb16d7d0d24a426ab1a47a49881a565" @@ -1241,6 +1241,15 @@ dependencies: "@sinclair/typebox" "^0.27.8" +"@jest/source-map@^24.9.0": + version "24.9.0" + resolved "https://registry.yarnpkg.com/@jest/source-map/-/source-map-24.9.0.tgz#0e263a94430be4b41da683ccc1e6bffe2a191714" + integrity sha512-/Xw7xGlsZb4MJzNDgB7PW5crou5JqWiBQaz6xyPd3ArOg2nfn/PunV8+olXbbEZzNl591o5rWKE9BRDaFAuIBg== + dependencies: + callsites "^3.0.0" + graceful-fs "^4.1.15" + source-map "^0.6.0" + "@jest/source-map@^29.6.3": version "29.6.3" resolved "https://registry.yarnpkg.com/@jest/source-map/-/source-map-29.6.3.tgz#d90ba772095cf37a34a5eb9413f1b562a08554c4" @@ -1250,6 +1259,15 @@ callsites "^3.0.0" graceful-fs "^4.2.9" +"@jest/test-result@^24.9.0": + version "24.9.0" + resolved "https://registry.yarnpkg.com/@jest/test-result/-/test-result-24.9.0.tgz#11796e8aa9dbf88ea025757b3152595ad06ba0ca" + integrity sha512-XEFrHbBonBJ8dGp2JmF8kP/nQI/ImPpygKHwQ/SY+es59Z3L5PI4Qb9TQQMAEeYsThG1xF0k6tmG0tIKATNiiA== + dependencies: + "@jest/console" "^24.9.0" + "@jest/types" "^24.9.0" + "@types/istanbul-lib-coverage" "^2.0.0" + "@jest/test-result@^29.7.0": version "29.7.0" resolved "https://registry.yarnpkg.com/@jest/test-result/-/test-result-29.7.0.tgz#8db9a80aa1a097bb2262572686734baed9b1657c" @@ -1291,27 +1309,24 @@ slash "^3.0.0" write-file-atomic "^4.0.2" -"@jest/types@^26.6.2": - version "26.6.2" - resolved "https://registry.yarnpkg.com/@jest/types/-/types-26.6.2.tgz#bef5a532030e1d88a2f5a6d933f84e97226ed48e" - integrity sha512-fC6QCp7Sc5sX6g8Tvbmj4XUTbyrik0akgRy03yjXbQaBWWNWGE7SGtJk98m0N8nzegD/7SggrUlivxo5ax4KWQ== +"@jest/types@^24.9.0": + version "24.9.0" + resolved "https://registry.yarnpkg.com/@jest/types/-/types-24.9.0.tgz#63cb26cb7500d069e5a389441a7c6ab5e909fc59" + integrity sha512-XKK7ze1apu5JWQ5eZjHITP66AX+QsLlbaJRBGYr8pNzwcAE2JVkwnf0yqjHTsDRcjR0mujy/NmZMXw5kl+kGBw== dependencies: "@types/istanbul-lib-coverage" "^2.0.0" - "@types/istanbul-reports" "^3.0.0" - "@types/node" "*" - "@types/yargs" "^15.0.0" - chalk "^4.0.0" + "@types/istanbul-reports" "^1.1.1" + "@types/yargs" "^13.0.0" -"@jest/types@^27.5.1": - version "27.5.1" - resolved "https://registry.yarnpkg.com/@jest/types/-/types-27.5.1.tgz#3c79ec4a8ba61c170bf937bcf9e98a9df175ec80" - integrity sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw== +"@jest/types@^25.5.0": + version "25.5.0" + resolved "https://registry.yarnpkg.com/@jest/types/-/types-25.5.0.tgz#4d6a4793f7b9599fc3680877b856a97dbccf2a9d" + integrity sha512-OXD0RgQ86Tu3MazKo8bnrkDRaDXXMGUqd+kTtLtK1Zb7CRzQcaSRPPPV37SvYTdevXEBVxe0HXylEjs8ibkmCw== dependencies: "@types/istanbul-lib-coverage" "^2.0.0" - "@types/istanbul-reports" "^3.0.0" - "@types/node" "*" - "@types/yargs" "^16.0.0" - chalk "^4.0.0" + "@types/istanbul-reports" "^1.1.1" + "@types/yargs" "^15.0.0" + chalk "^3.0.0" "@jest/types@^29.6.3": version "29.6.3" @@ -2259,208 +2274,125 @@ dependencies: "@swc/helpers" "^0.5.0" -"@react-native-community/cli-clean@11.4.1": - version "11.4.1" - resolved "https://registry.yarnpkg.com/@react-native-community/cli-clean/-/cli-clean-11.4.1.tgz#0155a02e4158c8a61ba3d7a2b08f3ebebed81906" - integrity sha512-cwUbY3c70oBGv3FvQJWe2Qkq6m1+/dcEBonMDTYyH6i+6OrkzI4RkIGpWmbG1IS5JfE9ISUZkNL3946sxyWNkw== - dependencies: - "@react-native-community/cli-tools" "11.4.1" - chalk "^4.1.2" - execa "^5.0.0" - prompts "^2.4.0" - -"@react-native-community/cli-config@11.4.1": - version "11.4.1" - resolved "https://registry.yarnpkg.com/@react-native-community/cli-config/-/cli-config-11.4.1.tgz#c27f91d2753f0f803cc79bbf299f19648a5d5627" - integrity sha512-sLdv1HFVqu5xNpeaR1+std0t7FFZaobpmpR0lFCOzKV7H/l611qS2Vo8zssmMK+oQbCs5JsX3SFPciODeIlaWA== - dependencies: - "@react-native-community/cli-tools" "11.4.1" - chalk "^4.1.2" - cosmiconfig "^5.1.0" - deepmerge "^4.3.0" - glob "^7.1.3" - joi "^17.2.1" - -"@react-native-community/cli-debugger-ui@11.4.1": - version "11.4.1" - resolved "https://registry.yarnpkg.com/@react-native-community/cli-debugger-ui/-/cli-debugger-ui-11.4.1.tgz#783cc276e1360baf8235dc8c6ebbbce0fe01d944" - integrity sha512-+pgIjGNW5TrJF37XG3djIOzP+WNoPp67to/ggDhrshuYgpymfb9XpDVsURJugy0Sy3RViqb83kQNK765QzTIvw== +"@react-native-community/cli-debugger-ui@^4.13.1": + version "4.13.1" + resolved "https://registry.yarnpkg.com/@react-native-community/cli-debugger-ui/-/cli-debugger-ui-4.13.1.tgz#07de6d4dab80ec49231de1f1fbf658b4ad39b32c" + integrity sha512-UFnkg5RTq3s2X15fSkrWY9+5BKOFjihNSnJjTV2H5PtTUFbd55qnxxPw8CxSfK0bXb1IrSvCESprk2LEpqr5cg== dependencies: serve-static "^1.13.1" -"@react-native-community/cli-doctor@11.4.1": - version "11.4.1" - resolved "https://registry.yarnpkg.com/@react-native-community/cli-doctor/-/cli-doctor-11.4.1.tgz#516ef5932de3e12989695e7cb7aba82b81e7b2de" - integrity sha512-O6oPiRsl8pdkcyNktpzvJAXUqdocoY4jh7Tt7wA69B1JKCJA7aPCecwJgpUZb63ZYoxOtRtYM3BYQKzRMLIuUw== - dependencies: - "@react-native-community/cli-config" "11.4.1" - "@react-native-community/cli-platform-android" "11.4.1" - "@react-native-community/cli-platform-ios" "11.4.1" - "@react-native-community/cli-tools" "11.4.1" - chalk "^4.1.2" - command-exists "^1.2.8" - envinfo "^7.7.2" - execa "^5.0.0" - hermes-profile-transformer "^0.0.6" - node-stream-zip "^1.9.1" - ora "^5.4.1" - prompts "^2.4.0" - semver "^7.5.2" - strip-ansi "^5.2.0" - sudo-prompt "^9.0.0" - wcwidth "^1.0.1" - yaml "^2.2.1" - -"@react-native-community/cli-hermes@11.4.1": - version "11.4.1" - resolved "https://registry.yarnpkg.com/@react-native-community/cli-hermes/-/cli-hermes-11.4.1.tgz#abf487ae8ab53c66f6f1178bcd37ecbbbac9fb5c" - integrity sha512-1VAjwcmv+i9BJTMMVn5Grw7AcgURhTyfHVghJ1YgBE2euEJxPuqPKSxP54wBOQKnWUwsuDQAtQf+jPJoCxJSSA== +"@react-native-community/cli-hermes@^4.13.0": + version "4.13.0" + resolved "https://registry.yarnpkg.com/@react-native-community/cli-hermes/-/cli-hermes-4.13.0.tgz#6243ed9c709dad5e523f1ccd7d21066b32f2899d" + integrity sha512-oG+w0Uby6rSGsUkJGLvMQctZ5eVRLLfhf84lLyz942OEDxFRa9U19YJxOe9FmgCKtotbYiM3P/XhK+SVCuerPQ== dependencies: - "@react-native-community/cli-platform-android" "11.4.1" - "@react-native-community/cli-tools" "11.4.1" - chalk "^4.1.2" + "@react-native-community/cli-platform-android" "^4.13.0" + "@react-native-community/cli-tools" "^4.13.0" + chalk "^3.0.0" hermes-profile-transformer "^0.0.6" + ip "^1.1.5" -"@react-native-community/cli-platform-android@11.4.1", "@react-native-community/cli-platform-android@^11.4.1": - version "11.4.1" - resolved "https://registry.yarnpkg.com/@react-native-community/cli-platform-android/-/cli-platform-android-11.4.1.tgz#ec5fc97e87834f2e33cb0d34dcef6c17b20f60fc" - integrity sha512-VMmXWIzk0Dq5RAd+HIEa3Oe7xl2jso7+gOr6E2HALF4A3fCKUjKZQ6iK2t6AfnY04zftvaiKw6zUXtrfl52AVQ== +"@react-native-community/cli-platform-android@^4.10.0", "@react-native-community/cli-platform-android@^4.13.0": + version "4.13.0" + resolved "https://registry.yarnpkg.com/@react-native-community/cli-platform-android/-/cli-platform-android-4.13.0.tgz#922681ec82ee1aadd993598b814df1152118be02" + integrity sha512-3i8sX8GklEytUZwPnojuoFbCjIRzMugCdzDIdZ9UNmi/OhD4/8mLGO0dgXfT4sMWjZwu3qjy45sFfk2zOAgHbA== dependencies: - "@react-native-community/cli-tools" "11.4.1" - chalk "^4.1.2" - execa "^5.0.0" + "@react-native-community/cli-tools" "^4.13.0" + chalk "^3.0.0" + execa "^1.0.0" + fs-extra "^8.1.0" glob "^7.1.3" + jetifier "^1.6.2" + lodash "^4.17.15" logkitty "^0.7.1" + slash "^3.0.0" + xmldoc "^1.1.2" -"@react-native-community/cli-platform-ios@11.4.1", "@react-native-community/cli-platform-ios@^11.4.1": - version "11.4.1" - resolved "https://registry.yarnpkg.com/@react-native-community/cli-platform-ios/-/cli-platform-ios-11.4.1.tgz#12d72741273b684734d5ed021415b7f543a6f009" - integrity sha512-RPhwn+q3IY9MpWc9w/Qmzv03mo8sXdah2eSZcECgweqD5SHWtOoRCUt11zM8jASpAQ8Tm5Je7YE9bHvdwGl4hA== +"@react-native-community/cli-platform-ios@^4.10.0": + version "4.13.0" + resolved "https://registry.yarnpkg.com/@react-native-community/cli-platform-ios/-/cli-platform-ios-4.13.0.tgz#a738915c68cac86df54e578b59a1311ea62b1aef" + integrity sha512-6THlTu8zp62efkzimfGr3VIuQJ2514o+vScZERJCV1xgEi8XtV7mb/ZKt9o6Y9WGxKKkc0E0b/aVAtgy+L27CA== dependencies: - "@react-native-community/cli-tools" "11.4.1" - chalk "^4.1.2" - execa "^5.0.0" - fast-xml-parser "^4.0.12" + "@react-native-community/cli-tools" "^4.13.0" + chalk "^3.0.0" glob "^7.1.3" - ora "^5.4.1" + js-yaml "^3.13.1" + lodash "^4.17.15" + plist "^3.0.1" + xcode "^2.0.0" -"@react-native-community/cli-plugin-metro@11.4.1": - version "11.4.1" - resolved "https://registry.yarnpkg.com/@react-native-community/cli-plugin-metro/-/cli-plugin-metro-11.4.1.tgz#8d51c59a9a720f99150d4153e757d5d1d1dabd22" - integrity sha512-JxbIqknYcQ5Z4rWROtu5LNakLfMiKoWcMoPqIrBLrV5ILm1XUJj1/8fATCcotZqV3yzB3SCJ3RrhKx7dQ3YELw== +"@react-native-community/cli-server-api@^4.13.1": + version "4.13.1" + resolved "https://registry.yarnpkg.com/@react-native-community/cli-server-api/-/cli-server-api-4.13.1.tgz#bee7ee9702afce848e9d6ca3dcd5669b99b125bd" + integrity sha512-vQzsFKD9CjHthA2ehTQX8c7uIzlI9A7ejaIow1I9RlEnLraPH2QqVDmzIdbdh5Od47UPbRzamCgAP8Bnqv3qwQ== dependencies: - "@react-native-community/cli-server-api" "11.4.1" - "@react-native-community/cli-tools" "11.4.1" - chalk "^4.1.2" - execa "^5.0.0" - metro "^0.76.9" - metro-config "^0.76.9" - metro-core "^0.76.9" - metro-react-native-babel-transformer "^0.76.9" - metro-resolver "^0.76.9" - metro-runtime "^0.76.9" - readline "^1.3.0" - -"@react-native-community/cli-server-api@11.4.1": - version "11.4.1" - resolved "https://registry.yarnpkg.com/@react-native-community/cli-server-api/-/cli-server-api-11.4.1.tgz#3dda094c4ab2369db34fe991c320e3cd78f097b3" - integrity sha512-isxXE8X5x+C4kN90yilD08jaLWD34hfqTfn/Xbl1u/igtdTsCaQGvWe9eaFamrpWFWTpVtj6k+vYfy8AtYSiKA== - dependencies: - "@react-native-community/cli-debugger-ui" "11.4.1" - "@react-native-community/cli-tools" "11.4.1" + "@react-native-community/cli-debugger-ui" "^4.13.1" + "@react-native-community/cli-tools" "^4.13.0" compression "^1.7.1" connect "^3.6.5" - errorhandler "^1.5.1" - nocache "^3.0.1" - pretty-format "^26.6.2" + errorhandler "^1.5.0" + nocache "^2.1.0" + pretty-format "^25.1.0" serve-static "^1.13.1" - ws "^7.5.1" + ws "^1.1.0" -"@react-native-community/cli-tools@11.4.1": - version "11.4.1" - resolved "https://registry.yarnpkg.com/@react-native-community/cli-tools/-/cli-tools-11.4.1.tgz#f6c69967e077b10cd8a884a83e53eb199dd9ee9f" - integrity sha512-GuQIuY/kCPfLeXB1aiPZ5HvF+e/wdO42AYuNEmT7FpH/0nAhdTxA9qjL8m3vatDD2/YK7WNOSVNsl2UBZuOISg== +"@react-native-community/cli-tools@^4.13.0": + version "4.13.0" + resolved "https://registry.yarnpkg.com/@react-native-community/cli-tools/-/cli-tools-4.13.0.tgz#b406463d33af16cedc4305a9a9257ed32845cf1b" + integrity sha512-s4f489h5+EJksn4CfheLgv5PGOM0CDmK1UEBLw2t/ncWs3cW2VI7vXzndcd/WJHTv3GntJhXDcJMuL+Z2IAOgg== dependencies: - appdirsjs "^1.2.4" - chalk "^4.1.2" - find-up "^5.0.0" + chalk "^3.0.0" + lodash "^4.17.15" mime "^2.4.1" node-fetch "^2.6.0" open "^6.2.0" - ora "^5.4.1" - semver "^7.5.2" - shell-quote "^1.7.3" - -"@react-native-community/cli-types@11.4.1": - version "11.4.1" - resolved "https://registry.yarnpkg.com/@react-native-community/cli-types/-/cli-types-11.4.1.tgz#3842dc37ba3b09f929b485bcbd8218de19349ac2" - integrity sha512-B3q9A5BCneLDSoK/iSJ06MNyBn1qTxjdJeOgeS3MiCxgJpPcxyn/Yrc6+h0Cu9T9sgWj/dmectQPYWxtZeo5VA== - dependencies: - joi "^17.2.1" - -"@react-native-community/cli@^11.4.1": - version "11.4.1" - resolved "https://registry.yarnpkg.com/@react-native-community/cli/-/cli-11.4.1.tgz#9a6346486622860dad721da406df70e29a45491f" - integrity sha512-NdAageVMtNhtvRsrq4NgJf5Ey2nA1CqmLvn7PhSawg+aIzMKmZuzWxGVwr9CoPGyjvNiqJlCWrLGR7NzOyi/sA== - dependencies: - "@react-native-community/cli-clean" "11.4.1" - "@react-native-community/cli-config" "11.4.1" - "@react-native-community/cli-debugger-ui" "11.4.1" - "@react-native-community/cli-doctor" "11.4.1" - "@react-native-community/cli-hermes" "11.4.1" - "@react-native-community/cli-plugin-metro" "11.4.1" - "@react-native-community/cli-server-api" "11.4.1" - "@react-native-community/cli-tools" "11.4.1" - "@react-native-community/cli-types" "11.4.1" - chalk "^4.1.2" - commander "^9.4.1" - execa "^5.0.0" + shell-quote "1.6.1" + +"@react-native-community/cli-types@^4.10.1": + version "4.10.1" + resolved "https://registry.yarnpkg.com/@react-native-community/cli-types/-/cli-types-4.10.1.tgz#d68a2dcd1649d3b3774823c64e5e9ce55bfbe1c9" + integrity sha512-ael2f1onoPF3vF7YqHGWy7NnafzGu+yp88BbFbP0ydoCP2xGSUzmZVw0zakPTC040Id+JQ9WeFczujMkDy6jYQ== + +"@react-native-community/cli@^4.10.0": + version "4.14.0" + resolved "https://registry.yarnpkg.com/@react-native-community/cli/-/cli-4.14.0.tgz#bb106a98341bfa2db36060091ff90bfe82ea4f55" + integrity sha512-EYJKBuxFxAu/iwNUfwDq41FjORpvSh1wvQ3qsHjzcR5uaGlWEOJrd3uNJDuKBAS0TVvbEesLF9NEXipjyRVr4Q== + dependencies: + "@hapi/joi" "^15.0.3" + "@react-native-community/cli-debugger-ui" "^4.13.1" + "@react-native-community/cli-hermes" "^4.13.0" + "@react-native-community/cli-server-api" "^4.13.1" + "@react-native-community/cli-tools" "^4.13.0" + "@react-native-community/cli-types" "^4.10.1" + chalk "^3.0.0" + command-exists "^1.2.8" + commander "^2.19.0" + cosmiconfig "^5.1.0" + deepmerge "^3.2.0" + envinfo "^7.7.2" + execa "^1.0.0" find-up "^4.1.0" fs-extra "^8.1.0" + glob "^7.1.3" graceful-fs "^4.1.3" - prompts "^2.4.0" - semver "^7.5.2" - -"@react-native/assets-registry@^0.72.0": - version "0.72.0" - resolved "https://registry.yarnpkg.com/@react-native/assets-registry/-/assets-registry-0.72.0.tgz#c82a76a1d86ec0c3907be76f7faf97a32bbed05d" - integrity sha512-Im93xRJuHHxb1wniGhBMsxLwcfzdYreSZVQGDoMJgkd6+Iky61LInGEHnQCTN0fKNYF1Dvcofb4uMmE1RQHXHQ== - -"@react-native/codegen@^0.72.8": - version "0.72.8" - resolved "https://registry.yarnpkg.com/@react-native/codegen/-/codegen-0.72.8.tgz#0593f628e1310f430450a9479fbb4be35e7b63d6" - integrity sha512-jQCcBlXV7B7ap5VlHhwIPieYz89yiRgwd2FPUBu+unz+kcJ6pAiB2U8RdLDmyIs8fiWd+Vq1xxaWs4TR329/ng== - dependencies: - "@babel/parser" "^7.20.0" - flow-parser "^0.206.0" - glob "^7.1.1" - invariant "^2.2.4" - jscodeshift "^0.14.0" + inquirer "^3.0.6" + leven "^3.1.0" + lodash "^4.17.15" + metro "^0.59.0" + metro-config "^0.59.0" + metro-core "^0.59.0" + metro-react-native-babel-transformer "^0.59.0" + metro-resolver "^0.59.0" + minimist "^1.2.0" mkdirp "^0.5.1" - nullthrows "^1.1.1" - -"@react-native/gradle-plugin@^0.72.11": - version "0.72.11" - resolved "https://registry.yarnpkg.com/@react-native/gradle-plugin/-/gradle-plugin-0.72.11.tgz#c063ef12778706611de7a1e42b74b14d9405fb9f" - integrity sha512-P9iRnxiR2w7EHcZ0mJ+fmbPzMby77ZzV6y9sJI3lVLJzF7TLSdbwcQyD3lwMsiL+q5lKUHoZJS4sYmih+P2HXw== - -"@react-native/js-polyfills@^0.72.1": - version "0.72.1" - resolved "https://registry.yarnpkg.com/@react-native/js-polyfills/-/js-polyfills-0.72.1.tgz#905343ef0c51256f128256330fccbdb35b922291" - integrity sha512-cRPZh2rBswFnGt5X5EUEPs0r+pAsXxYsifv/fgy9ZLQokuT52bPH+9xjDR+7TafRua5CttGW83wP4TntRcWNDA== - -"@react-native/normalize-colors@<0.73.0", "@react-native/normalize-colors@^0.72.0": - version "0.72.0" - resolved "https://registry.yarnpkg.com/@react-native/normalize-colors/-/normalize-colors-0.72.0.tgz#14294b7ed3c1d92176d2a00df48456e8d7d62212" - integrity sha512-285lfdqSXaqKuBbbtP9qL2tDrfxdOFtIMvkKadtleRQkdOxx+uzGvFr82KHmc/sSiMtfXGp7JnFYWVh4sFl7Yw== - -"@react-native/virtualized-lists@^0.72.8": - version "0.72.8" - resolved "https://registry.yarnpkg.com/@react-native/virtualized-lists/-/virtualized-lists-0.72.8.tgz#a2c6a91ea0f1d40eb5a122fb063daedb92ed1dc3" - integrity sha512-J3Q4Bkuo99k7mu+jPS9gSUSgq+lLRSI/+ahXNwV92XgJ/8UgOTxu2LPwhJnBk/sQKxq7E8WkZBnBiozukQMqrw== - dependencies: - invariant "^2.2.4" - nullthrows "^1.1.1" + node-stream-zip "^1.9.1" + ora "^3.4.0" + pretty-format "^25.2.0" + semver "^6.3.0" + serve-static "^1.13.1" + strip-ansi "^5.2.0" + sudo-prompt "^9.0.0" + wcwidth "^1.0.1" "@redux-saga/core@^1.3.0": version "1.3.0" @@ -2996,6 +2928,14 @@ dependencies: "@types/istanbul-lib-coverage" "*" +"@types/istanbul-reports@^1.1.1": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@types/istanbul-reports/-/istanbul-reports-1.1.2.tgz#e875cc689e47bce549ec81f3df5e6f6f11cfaeb2" + integrity sha512-P/W9yOX/3oPZSpaYOCQzGqgCQRXn0FFO/V8bWrCQs+wLmvVVxk6CRBXALEvNs9OHIatlnlFokfhuDo2ug01ciw== + dependencies: + "@types/istanbul-lib-coverage" "*" + "@types/istanbul-lib-report" "*" + "@types/istanbul-reports@^3.0.0": version "3.0.1" resolved "https://registry.yarnpkg.com/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz#9153fe98bba2bd565a63add9436d6f0d7f8468ff" @@ -3244,6 +3184,11 @@ resolved "https://registry.yarnpkg.com/@types/sizzle/-/sizzle-2.3.9.tgz#d4597dbd4618264c414d7429363e3f50acb66ea2" integrity sha512-xzLEyKB50yqCUPUJkIsrVvoWNfFUbIZI+RspLWt8u+tIW/BetMBZtgV2LY/2o+tYH8dRvQ+eoPf3NdhQCcLE2w== +"@types/stack-utils@^1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@types/stack-utils/-/stack-utils-1.0.1.tgz#0a851d3bd96498fa25c33ab7278ed3bd65f06c3e" + integrity sha512-l42BggppR6zLmpfU6fq9HEa2oGPEI8yrSPL3GITjfRInppYFahObbIQOQK3UGxEnyQpltZLaPe75046NOZQikw== + "@types/stack-utils@^2.0.0": version "2.0.1" resolved "https://registry.yarnpkg.com/@types/stack-utils/-/stack-utils-2.0.1.tgz#20f18294f797f2209b5f65c8e3b5c8e8261d127c" @@ -3279,6 +3224,13 @@ resolved "https://registry.yarnpkg.com/@types/yargs-parser/-/yargs-parser-21.0.0.tgz#0c60e537fa790f5f9472ed2776c2b71ec117351b" integrity sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA== +"@types/yargs@^13.0.0": + version "13.0.12" + resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-13.0.12.tgz#d895a88c703b78af0465a9de88aa92c61430b092" + integrity sha512-qCxJE1qgz2y0hA4pIxjBR+PelCH0U5CK1XJXFwCNqfmliatKp47UCXXE9Dyk1OXBDLvsCF57TqQEJaeLfDYEOQ== + dependencies: + "@types/yargs-parser" "*" + "@types/yargs@^15.0.0": version "15.0.19" resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-15.0.19.tgz#328fb89e46109ecbdb70c295d96ff2f46dfd01b9" @@ -3286,13 +3238,6 @@ dependencies: "@types/yargs-parser" "*" -"@types/yargs@^16.0.0": - version "16.0.9" - resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-16.0.9.tgz#ba506215e45f7707e6cbcaf386981155b7ab956e" - integrity sha512-tHhzvkFXZQeTECenFoRljLBYPZJ7jAVxqqtEI0qTLOmuultnFp4I9yKE17vTuhf7BkhCu7I4XuemPgikDVuYqA== - dependencies: - "@types/yargs-parser" "*" - "@types/yargs@^17.0.8": version "17.0.19" resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-17.0.19.tgz#8dbecdc9ab48bee0cb74f6e3327de3fa0d0c98ae" @@ -3457,6 +3402,11 @@ resolved "https://registry.npmjs.org/@web3-storage/multipart-parser/-/multipart-parser-1.0.0.tgz#6b69dc2a32a5b207ba43e556c25cc136a56659c4" integrity sha512-BEO6al7BYqcnfX15W2cnGR+Q566ACXAT9UQykORCWW80lmkpWsnEob6zJS1ZVBKsSJC8+7vJkHwlp+lXG1UCdw== +"@xmldom/xmldom@^0.8.8": + version "0.8.10" + resolved "https://registry.yarnpkg.com/@xmldom/xmldom/-/xmldom-0.8.10.tgz#a1337ca426aa61cef9fe15b5b28e340a72f6fa99" + integrity sha512-2WALfTl4xo2SkGCYRt6rDTFfk9R1czmBvUQy12gK2KuRKIpWEhcbbzy8EZXtz/jkRqHX8bFEc6FC1HjX4TUWYw== + "@yarnpkg/lockfile@^1.1.0": version "1.1.0" resolved "https://registry.yarnpkg.com/@yarnpkg/lockfile/-/lockfile-1.1.0.tgz#e77a97fbd345b76d83245edcd17d393b1b41fb31" @@ -3512,7 +3462,12 @@ abort-controller@^3.0.0: dependencies: event-target-shim "^5.0.0" -accepts@^1.3.7, accepts@~1.3.5, accepts@~1.3.7, accepts@~1.3.8: +absolute-path@^0.0.0: + version "0.0.0" + resolved "https://registry.yarnpkg.com/absolute-path/-/absolute-path-0.0.0.tgz#a78762fbdadfb5297be99b15d35a785b2f095bf7" + integrity sha512-HQiug4c+/s3WOvEnDRxXVmNtSG5s2gJM9r19BTcqjp7BWcE48PB+Y2G6jE65kqI0LpsQeMZygt/b60Gi4KxGyA== + +accepts@~1.3.5, accepts@~1.3.7, accepts@~1.3.8: version "1.3.8" resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.8.tgz#0bf0be125b67014adcb0b0921e62db7bffe16b2e" integrity sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw== @@ -3590,11 +3545,30 @@ anser@^1.4.9: resolved "https://registry.yarnpkg.com/anser/-/anser-1.4.10.tgz#befa3eddf282684bd03b63dcda3927aef8c2e35b" integrity sha512-hCv9AqTQ8ycjpSd3upOJd7vFwW1JaoYQ7tpham03GJ1ca8/65rqn0RpaWpItOAd6ylW9wAw6luXYPJIyPFVOww== +ansi-colors@^1.0.1: + version "1.1.0" + resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-1.1.0.tgz#6374b4dd5d4718ff3ce27a671a3b1cad077132a9" + integrity sha512-SFKX67auSNoVR38N3L+nvsPjOE0bybKTYbkf5tRvushrAPQ9V75huw0ZxBkKVeRU9kqH3d6HA4xTckbwZ4ixmA== + dependencies: + ansi-wrap "^0.1.0" + ansi-colors@^4.1.1: version "4.1.3" resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-4.1.3.tgz#37611340eb2243e70cc604cad35d63270d48781b" integrity sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw== +ansi-cyan@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/ansi-cyan/-/ansi-cyan-0.1.1.tgz#538ae528af8982f28ae30d86f2f17456d2609873" + integrity sha512-eCjan3AVo/SxZ0/MyIYRtkpxIu/H3xZN7URr1vXVrISxeyz8fUFz0FJziamK4sS8I+t35y4rHg1b2PklyBe/7A== + dependencies: + ansi-wrap "0.1.0" + +ansi-escapes@^3.0.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-3.2.0.tgz#8780b98ff9dbf5638152d1f1fe5c1d7b4442976b" + integrity sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ== + ansi-escapes@^4.2.1, ansi-escapes@^4.3.0: version "4.3.2" resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.3.2.tgz#6b2291d1db7d98b6521d5f1efa42d0f3a9feb65e" @@ -3611,7 +3585,26 @@ ansi-fragments@^0.2.1: slice-ansi "^2.0.0" strip-ansi "^5.0.0" -ansi-regex@^4.1.0: +ansi-gray@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/ansi-gray/-/ansi-gray-0.1.1.tgz#2962cf54ec9792c48510a3deb524436861ef7251" + integrity sha512-HrgGIZUl8h2EHuZaU9hTR/cU5nhKxpVE1V6kdGsQ8e4zirElJ5fvtfc8N7Q1oq1aatO275i8pUFUCpNWCAnVWw== + dependencies: + ansi-wrap "0.1.0" + +ansi-red@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/ansi-red/-/ansi-red-0.1.1.tgz#8c638f9d1080800a353c9c28c8a81ca4705d946c" + integrity sha512-ewaIr5y+9CUTGFwZfpECUbFlGcC0GCw1oqR9RI6h1gQCd9Aj2GxSckCnPsVJnmfMZbwFYE+leZGASgkWl06Jow== + dependencies: + ansi-wrap "0.1.0" + +ansi-regex@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.1.tgz#123d6479e92ad45ad897d4054e3c7ca7db4944e1" + integrity sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw== + +ansi-regex@^4.0.0, ansi-regex@^4.1.0: version "4.1.1" resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-4.1.1.tgz#164daac87ab2d6f6db3a29875e2d1766582dabed" integrity sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g== @@ -3650,11 +3643,24 @@ ansi-styles@^6.0.0, ansi-styles@^6.1.0: resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-6.2.1.tgz#0e62320cf99c21afff3b3012192546aacbfb05c5" integrity sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug== +ansi-wrap@0.1.0, ansi-wrap@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/ansi-wrap/-/ansi-wrap-0.1.0.tgz#a82250ddb0015e9a27ca82e82ea603bbfa45efaf" + integrity sha512-ZyznvL8k/FZeQHr2T6LzcJ/+vBApDnMNZvfVFy3At0knswWd6rJ3/0Hhmpu8oqa6C92npmozs890sX9Dl6q+Qw== + any-promise@^1.1.0: version "1.3.0" resolved "https://registry.yarnpkg.com/any-promise/-/any-promise-1.3.0.tgz#abc6afeedcea52e809cdc0376aed3ce39635d17f" integrity sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A== +anymatch@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-2.0.0.tgz#bcb24b4f37934d9aa7ac17b4adaf89e7c76ef2eb" + integrity sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw== + dependencies: + micromatch "^3.1.4" + normalize-path "^2.1.1" + anymatch@^3.0.3, anymatch@~3.1.2: version "3.1.3" resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.3.tgz#790c58b19ba1720a84205b57c618d5ad8524973e" @@ -3668,11 +3674,6 @@ app-module-path@^2.2.0: resolved "https://registry.yarnpkg.com/app-module-path/-/app-module-path-2.2.0.tgz#641aa55dfb7d6a6f0a8141c4b9c0aa50b6c24dd5" integrity sha512-gkco+qxENJV+8vFcDiiFhuoSvRXb2a/QPqpSoWhVz829VNJfOTnELbBmPmNKFxf3xdNnw4DWCkzkDaavcX/1YQ== -appdirsjs@^1.2.4: - version "1.2.7" - resolved "https://registry.yarnpkg.com/appdirsjs/-/appdirsjs-1.2.7.tgz#50b4b7948a26ba6090d4aede2ae2dc2b051be3b3" - integrity sha512-Quji6+8kLBC3NnBeo14nPDq0+2jUs5s3/xEye+udFHumHhRk4M7aAMXp/PBJqkKYGuuyR9M/6Dq7d2AViiGmhw== - aproba@2.0.0, "aproba@^1.0.3 || ^2.0.0": version "2.0.0" resolved "https://registry.yarnpkg.com/aproba/-/aproba-2.0.0.tgz#52520b8ae5b569215b354efc0caa3fe1e45a8adc" @@ -3718,6 +3719,34 @@ argparse@^2.0.1: resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== +arr-diff@^1.0.1: + version "1.1.0" + resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-1.1.0.tgz#687c32758163588fef7de7b36fabe495eb1a399a" + integrity sha512-OQwDZUqYaQwyyhDJHThmzId8daf4/RFNLaeh3AevmSeZ5Y7ug4Ga/yKc6l6kTZOBW781rCj103ZuTh8GAsB3+Q== + dependencies: + arr-flatten "^1.0.1" + array-slice "^0.2.3" + +arr-diff@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-4.0.0.tgz#d6461074febfec71e7e15235761a329a5dc7c520" + integrity sha512-YVIQ82gZPGBebQV/a8dar4AitzCQs0jjXwMPZllpXMaGjXPYVUawSxQrRsjhjupyVxEvbHgUmIhKVlND+j02kA== + +arr-flatten@^1.0.1, arr-flatten@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.1.0.tgz#36048bbff4e7b47e136644316c99669ea5ae91f1" + integrity sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg== + +arr-union@^2.0.1: + version "2.1.0" + resolved "https://registry.yarnpkg.com/arr-union/-/arr-union-2.1.0.tgz#20f9eab5ec70f5c7d215b1077b1c39161d292c7d" + integrity sha512-t5db90jq+qdgk8aFnxEkjqta0B/GHrM1pxzuuZz2zWsOXc5nKu3t+76s/PQBA8FTcM/ipspIH9jWG4OxCBc2eA== + +arr-union@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/arr-union/-/arr-union-3.1.0.tgz#e39b09aea9def866a8f206e288af63919bae39c4" + integrity sha512-sKpyeERZ02v1FeCZT8lrfJq5u6goHCtpTAzPwJYe7c8SPFOboNjNg1vz2L4VTn9T4PQxEx13TbXLmYUcS6Ug7Q== + array-buffer-byte-length@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/array-buffer-byte-length/-/array-buffer-byte-length-1.0.1.tgz#1e5583ec16763540a27ae52eed99ff899223568f" @@ -3731,6 +3760,11 @@ array-differ@^3.0.0: resolved "https://registry.yarnpkg.com/array-differ/-/array-differ-3.0.0.tgz#3cbb3d0f316810eafcc47624734237d6aee4ae6b" integrity sha512-THtfYS6KtME/yIAhKjZ2ul7XI96lQGHRputJQHO80LAWQnuGP4iCIN8vdMRboGbIEYBwU33q8Tch1os2+X0kMg== +array-filter@~0.0.0: + version "0.0.1" + resolved "https://registry.yarnpkg.com/array-filter/-/array-filter-0.0.1.tgz#7da8cf2e26628ed732803581fd21f67cacd2eeec" + integrity sha512-VW0FpCIhjZdarWjIz8Vpva7U95fl2Jn+b+mmFFMLn8PIVscOQcAgEznwUzTEuUHuqZqIxwzRlcaN/urTFFQoiw== + array-flatten@1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2" @@ -3752,11 +3786,31 @@ array-includes@^3.1.5, array-includes@^3.1.6, array-includes@^3.1.7: get-intrinsic "^1.2.1" is-string "^1.0.7" +array-map@~0.0.0: + version "0.0.1" + resolved "https://registry.yarnpkg.com/array-map/-/array-map-0.0.1.tgz#d1bf3cc8813a7daaa335e5c8eb21d9d06230c1a7" + integrity sha512-sxHIeJTGEsRC8/hYkZzdJNNPZ41EXHVys7pqMw1iwE/Kx8/hto0UbDuGQsSJ0ujPovj9qUZl6EOY/EiZ2g3d9Q== + +array-reduce@~0.0.0: + version "0.0.0" + resolved "https://registry.yarnpkg.com/array-reduce/-/array-reduce-0.0.0.tgz#173899d3ffd1c7d9383e4479525dbe278cab5f2b" + integrity sha512-8jR+StqaC636u7h3ye1co3lQRefgVVUQUhuAmRbDqIMeR2yuXzRvkCNQiQ5J/wbREmoBLNtp13dhaaVpZQDRUw== + +array-slice@^0.2.3: + version "0.2.3" + resolved "https://registry.yarnpkg.com/array-slice/-/array-slice-0.2.3.tgz#dd3cfb80ed7973a75117cdac69b0b99ec86186f5" + integrity sha512-rlVfZW/1Ph2SNySXwR9QYkChp8EkOEiTMO5Vwx60usw04i4nWemkm9RXmQqgkQFaLHsqLuADvjp6IfgL9l2M8Q== + array-union@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d" integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== +array-unique@^0.3.2: + version "0.3.2" + resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428" + integrity sha512-SleRWjh9JUud2wH1hPs9rZBZ33H6T9HOiL0uwGnGx9FpE6wKGyfWugmbkEOIs6qWrZhg0LWeLziLrEwQJhs5mQ== + array.prototype.filter@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/array.prototype.filter/-/array.prototype.filter-1.0.3.tgz#423771edeb417ff5914111fff4277ea0624c0d0e" @@ -3834,7 +3888,7 @@ arrify@^2.0.1: resolved "https://registry.yarnpkg.com/arrify/-/arrify-2.0.1.tgz#c9655e9331e0abcd588d2a7cad7e9956f66701fa" integrity sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug== -asap@~2.0.6: +asap@~2.0.3, asap@~2.0.6: version "2.0.6" resolved "https://registry.yarnpkg.com/asap/-/asap-2.0.6.tgz#e50347611d7e690943208bbdafebcbc2fb866d46" integrity sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA== @@ -3851,18 +3905,16 @@ assert-plus@1.0.0, assert-plus@^1.0.0: resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525" integrity sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw== +assign-symbols@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/assign-symbols/-/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367" + integrity sha512-Q+JC7Whu8HhmTdBph/Tq59IoRtoy6KAm5zzPv00WdujX82lbAL8K7WVjne7vdCsAmbF4AYaDOPyO3k0kl8qIrw== + ast-module-types@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/ast-module-types/-/ast-module-types-5.0.0.tgz#32b2b05c56067ff38e95df66f11d6afd6c9ba16b" integrity sha512-JvqziE0Wc0rXQfma0HZC/aY7URXHFuZV84fJRtP8u+lhp0JYCNd5wJzVXP45t0PH0Mej3ynlzvdyITYIu0G4LQ== -ast-types@0.15.2: - version "0.15.2" - resolved "https://registry.yarnpkg.com/ast-types/-/ast-types-0.15.2.tgz#39ae4809393c4b16df751ee563411423e85fb49d" - integrity sha512-c27loCv9QkZinsa5ProX751khO9DJl/AcB5c2KNtA6NRvHKS0PgLfcftz72KVq504vB0Gku5s2kUZzDBvQWvHg== - dependencies: - tslib "^2.0.1" - astral-regex@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-1.0.0.tgz#6c8c3fb827dd43ee3918f27b82782ab7658a6fd9" @@ -3873,12 +3925,14 @@ astral-regex@^2.0.0: resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-2.0.0.tgz#483143c567aeed4785759c0865786dc77d7d2e31" integrity sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ== -async-limiter@~1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/async-limiter/-/async-limiter-1.0.1.tgz#dd379e94f0db8310b08291f9d64c3209766617fd" - integrity sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ== +async@^2.4.0: + version "2.6.4" + resolved "https://registry.yarnpkg.com/async/-/async-2.6.4.tgz#706b7ff6084664cd7eae713f6f965433b5504221" + integrity sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA== + dependencies: + lodash "^4.17.14" -async@^3.2.0, async@^3.2.2, async@^3.2.3: +async@^3.2.0, async@^3.2.3: version "3.2.6" resolved "https://registry.yarnpkg.com/async/-/async-3.2.6.tgz#1b0728e14929d51b85b449b7f06e27c1145e38ce" integrity sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA== @@ -3900,6 +3954,11 @@ at-least-node@^1.0.0: resolved "https://registry.yarnpkg.com/at-least-node/-/at-least-node-1.0.0.tgz#602cd4b46e844ad4effc92a8011a3c46e0238dc2" integrity sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg== +atob@^2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9" + integrity sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg== + available-typed-arrays@^1.0.6, available-typed-arrays@^1.0.7: version "1.0.7" resolved "https://registry.yarnpkg.com/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz#a5cc375d6a03c2efc87a553f3e0b1522def14846" @@ -3926,11 +3985,6 @@ axios@^1.7.4, axios@^1.7.7: form-data "^4.0.0" proxy-from-env "^1.1.0" -babel-core@^7.0.0-bridge.0: - version "7.0.0-bridge.0" - resolved "https://registry.yarnpkg.com/babel-core/-/babel-core-7.0.0-bridge.0.tgz#95a492ddd90f9b4e9a4a1da14eb335b87b634ece" - integrity sha512-poPX9mZH/5CSanm50Q+1toVci6pv5KSRv/5TWCwtzQS5XEwn40BcCrgIeMFWP9CKKIniKXNxoIOnOq4VVlGXhg== - babel-jest@^29.7.0: version "29.7.0" resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-29.7.0.tgz#f4369919225b684c56085998ac63dbd05be020d5" @@ -3994,13 +4048,6 @@ babel-plugin-syntax-trailing-function-commas@^7.0.0-beta.0: resolved "https://registry.yarnpkg.com/babel-plugin-syntax-trailing-function-commas/-/babel-plugin-syntax-trailing-function-commas-7.0.0-beta.0.tgz#aa213c1435e2bffeb6fca842287ef534ad05d5cf" integrity sha512-Xj9XuRuz3nTSbaTXWv3itLOcxyF4oPD8douBBmj7U9BBC6nEBYfyOJYQMf/8PJAFotC62UY5dFfIGEPr7WswzQ== -babel-plugin-transform-flow-enums@^0.0.2: - version "0.0.2" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-flow-enums/-/babel-plugin-transform-flow-enums-0.0.2.tgz#d1d0cc9bdc799c850ca110d0ddc9f21b9ec3ef25" - integrity sha512-g4aaCrDDOsWjbm0PUUeVnkcVd6AKJsVc/MbnPhEotEpkeJQP6b8nzewohQi7+QS8UyPehOhGWn0nOwjvWpmMvQ== - dependencies: - "@babel/plugin-syntax-flow" "^7.12.1" - babel-preset-current-node-syntax@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz#b4399239b89b2a011f9ddbe3e4f401fc40cff73b" @@ -4019,7 +4066,7 @@ babel-preset-current-node-syntax@^1.0.0: "@babel/plugin-syntax-optional-chaining" "^7.8.3" "@babel/plugin-syntax-top-level-await" "^7.8.3" -babel-preset-fbjs@^3.4.0: +babel-preset-fbjs@^3.2.0, babel-preset-fbjs@^3.3.0: version "3.4.0" resolved "https://registry.yarnpkg.com/babel-preset-fbjs/-/babel-preset-fbjs-3.4.0.tgz#38a14e5a7a3b285a3f3a86552d650dca5cf6111c" integrity sha512-9ywCsCvo1ojrw0b+XYk7aFvTH6D9064t0RIL1rtMf3nsa02Xw41MS7sZw216Im35xj/UY0PDBQsa1brUDDF1Ow== @@ -4065,11 +4112,24 @@ balanced-match@^1.0.0: resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== -base64-js@^1.1.2, base64-js@^1.3.1: +base64-js@^1.1.2, base64-js@^1.3.1, base64-js@^1.5.1: version "1.5.1" resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== +base@^0.11.1: + version "0.11.2" + resolved "https://registry.yarnpkg.com/base/-/base-0.11.2.tgz#7bde5ced145b6d551a90db87f83c558b4eb48a8f" + integrity sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg== + dependencies: + cache-base "^1.0.1" + class-utils "^0.3.5" + component-emitter "^1.2.1" + define-property "^1.0.0" + isobject "^3.0.1" + mixin-deep "^1.2.0" + pascalcase "^0.1.1" + bcrypt-pbkdf@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz#a4301d389b6a43f9b67ff3ca11a3f6637e360e9e" @@ -4090,6 +4150,11 @@ before-after-hook@^2.2.0: resolved "https://registry.yarnpkg.com/before-after-hook/-/before-after-hook-2.2.3.tgz#c51e809c81a4e354084422b9b26bad88249c517c" integrity sha512-NzUnlZexiaH/46WDhANlyR2bXRopNg4F/zuSA3OpZnllCUgRaOF2znDioDWrmbNVsuZk6l9pMquQB38cfBZwkQ== +big-integer@1.6.x: + version "1.6.52" + resolved "https://registry.yarnpkg.com/big-integer/-/big-integer-1.6.52.tgz#60a887f3047614a8e1bffe5d7173490a97dc8c85" + integrity sha512-QxD8cf2eVqJOOz63z6JIN9BzvVs/dlySa5HGSBH5xtR8dPteIRQnBxxKqkNTiT6jbDTF6jAfrd4oMcND9RGbQg== + bin-links@^4.0.4: version "4.0.4" resolved "https://registry.yarnpkg.com/bin-links/-/bin-links-4.0.4.tgz#c3565832b8e287c85f109a02a17027d152a58a63" @@ -4105,6 +4170,13 @@ binary-extensions@^2.0.0: resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d" integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA== +bindings@^1.5.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/bindings/-/bindings-1.5.0.tgz#10353c9e945334bc0511a6d90b38fbc7c9c504df" + integrity sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ== + dependencies: + file-uri-to-path "1.0.0" + bintrees@1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/bintrees/-/bintrees-1.0.2.tgz#49f896d6e858a4a499df85c38fb399b9aff840f8" @@ -4152,6 +4224,20 @@ bootstrap@^5.2.3: resolved "https://registry.yarnpkg.com/bootstrap/-/bootstrap-5.3.3.tgz#de35e1a765c897ac940021900fcbb831602bac38" integrity sha512-8HLCdWgyoMguSO9o+aH+iuZ+aht+mzW0u3HIMzVu7Srrpv7EBBxTnrFlSCskwdY1+EOFQSm7uMJhNQHkdPcmjg== +bplist-creator@0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/bplist-creator/-/bplist-creator-0.1.0.tgz#018a2d1b587f769e379ef5519103730f8963ba1e" + integrity sha512-sXaHZicyEEmY86WyueLTQesbeoH/mquvarJaQNbjuOQO+7gbFcDEWqKmcWA4cOTLzFlfgvkiVxolk1k5bBIpmg== + dependencies: + stream-buffers "2.2.x" + +bplist-parser@0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/bplist-parser/-/bplist-parser-0.3.1.tgz#e1c90b2ca2a9f9474cc72f6862bbf3fee8341fd1" + integrity sha512-PyJxiNtA5T2PlLIeBot4lbp7rj4OadzjnMZD/G5zuBNt8ei/yCU7+wW0h2bag9vr8c+/WuRWmSxbqAl9hL1rBA== + dependencies: + big-integer "1.6.x" + brace-expansion@^1.1.7: version "1.1.11" resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" @@ -4167,6 +4253,22 @@ brace-expansion@^2.0.1: dependencies: balanced-match "^1.0.0" +braces@^2.3.1: + version "2.3.2" + resolved "https://registry.yarnpkg.com/braces/-/braces-2.3.2.tgz#5979fd3f14cd531565e5fa2df1abfff1dfaee729" + integrity sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w== + dependencies: + arr-flatten "^1.1.0" + array-unique "^0.3.2" + extend-shallow "^2.0.1" + fill-range "^4.0.0" + isobject "^3.0.1" + repeat-element "^1.1.2" + snapdragon "^0.8.1" + snapdragon-node "^2.0.1" + split-string "^3.0.2" + to-regex "^3.0.1" + braces@^3.0.3, braces@~3.0.2: version "3.0.3" resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.3.tgz#490332f40919452272d55a8480adc0c441358789" @@ -4208,7 +4310,7 @@ bser@2.1.1: dependencies: node-int64 "^0.4.0" -buffer-crc32@~0.2.3: +buffer-crc32@^0.2.13, buffer-crc32@~0.2.3: version "0.2.13" resolved "https://registry.yarnpkg.com/buffer-crc32/-/buffer-crc32-0.2.13.tgz#0d333e3f00eac50aa1454abd30ef8c2a5d9a7242" integrity sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ== @@ -4269,11 +4371,34 @@ cacache@^18.0.0, cacache@^18.0.3: tar "^6.1.11" unique-filename "^3.0.0" +cache-base@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/cache-base/-/cache-base-1.0.1.tgz#0a7f46416831c8b662ee36fe4e7c59d76f666ab2" + integrity sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ== + dependencies: + collection-visit "^1.0.0" + component-emitter "^1.2.1" + get-value "^2.0.6" + has-value "^1.0.0" + isobject "^3.0.1" + set-value "^2.0.0" + to-object-path "^0.3.0" + union-value "^1.0.0" + unset-value "^1.0.0" + cachedir@^2.3.0: version "2.4.0" resolved "https://registry.yarnpkg.com/cachedir/-/cachedir-2.4.0.tgz#7fef9cf7367233d7c88068fe6e34ed0d355a610d" integrity sha512-9EtFOZR8g22CL7BWjJ9BUx1+A/djkofnyW3aOXZORNW2kxoUpx2h+uN2cOqwPmFhnpVmxg+KW2OjOSgChTEvsQ== +call-bind-apply-helpers@^1.0.0, call-bind-apply-helpers@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.1.tgz#32e5892e6361b29b0b545ba6f7763378daca2840" + integrity sha512-BhYE+WDaywFg2TBWYNXAE+8B1ATnThNBqXHP5nQu0jWJdVvY2hvkpyB3qOmtmDePiS5/BDQ8wASEWGMWRG148g== + dependencies: + es-errors "^1.3.0" + function-bind "^1.1.2" + call-bind@^1.0.2, call-bind@^1.0.5, call-bind@^1.0.6, call-bind@^1.0.7: version "1.0.7" resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.7.tgz#06016599c40c56498c18769d2730be242b6fa3b9" @@ -4285,6 +4410,24 @@ call-bind@^1.0.2, call-bind@^1.0.5, call-bind@^1.0.6, call-bind@^1.0.7: get-intrinsic "^1.2.4" set-function-length "^1.2.1" +call-bind@^1.0.8: + version "1.0.8" + resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.8.tgz#0736a9660f537e3388826f440d5ec45f744eaa4c" + integrity sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww== + dependencies: + call-bind-apply-helpers "^1.0.0" + es-define-property "^1.0.0" + get-intrinsic "^1.2.4" + set-function-length "^1.2.2" + +call-bound@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/call-bound/-/call-bound-1.0.3.tgz#41cfd032b593e39176a71533ab4f384aa04fd681" + integrity sha512-YTd+6wGlNlPxSuri7Y6X8tY2dmm12UMH66RpKMhiX6rsk5wXXnYgbUcOt8kiS31/AjfoTOvCsE+w8nZQLQnzHA== + dependencies: + call-bind-apply-helpers "^1.0.1" + get-intrinsic "^1.2.6" + caller-callsite@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/caller-callsite/-/caller-callsite-2.0.0.tgz#847e0fce0a223750a9a027c54b33731ad3154134" @@ -4338,6 +4481,13 @@ caniuse-lite@^1.0.30001688: resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001690.tgz#f2d15e3aaf8e18f76b2b8c1481abde063b8104c8" integrity sha512-5ExiE3qQN6oF8Clf8ifIDcMRCRE/dMGcETG/XGMD8/XiXm6HXQgQTh1yZYLXXpSOsEUlJm1Xr7kGULZTuGtP/w== +capture-exit@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/capture-exit/-/capture-exit-2.0.0.tgz#fb953bfaebeb781f62898239dabb426d08a509a4" + integrity sha512-PiT/hQmTonHhl/HFGN+Lx3JJUznrVYJ3+AQsnthneZbvW7x+f08Tk7yLJTLEOUvBTbduLeeBkxEaYXUOUrRq6g== + dependencies: + rsvp "^4.8.4" + caseless@~0.12.0: version "0.12.0" resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" @@ -4351,7 +4501,7 @@ chalk@4.1.0: ansi-styles "^4.1.0" supports-color "^7.1.0" -chalk@^2.4.1: +chalk@^2.0.0, chalk@^2.0.1, chalk@^2.4.1, chalk@^2.4.2: version "2.4.2" resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== @@ -4360,6 +4510,14 @@ chalk@^2.4.1: escape-string-regexp "^1.0.5" supports-color "^5.3.0" +chalk@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-3.0.0.tgz#3f73c2bf526591f574cc492c51e2456349f844e4" + integrity sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg== + dependencies: + ansi-styles "^4.1.0" + supports-color "^7.1.0" + chalk@^4.0.0, chalk@^4.0.2, chalk@^4.1.0, chalk@^4.1.1, chalk@^4.1.2: version "4.1.2" resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" @@ -4373,6 +4531,11 @@ char-regex@^1.0.2: resolved "https://registry.yarnpkg.com/char-regex/-/char-regex-1.0.2.tgz#d744358226217f981ed58f479b1d6bcc29545dcf" integrity sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw== +chardet@^0.4.0: + version "0.4.2" + resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.4.2.tgz#b5473b33dc97c424e5d98dc87d55d4d8a29c8bf2" + integrity sha512-j/Toj7f1z98Hh2cYo2BVr85EpIRWqUi7rtRSGxh/cqUjqrnJe9l9UE7IUGd2vQ2p+kSHLkSzObQPZPLUC6TQwg== + chardet@^0.7.0: version "0.7.0" resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.7.0.tgz#90094849f0937f2eedc2425d0d28a9e5f0cbad9e" @@ -4423,6 +4586,16 @@ cjs-module-lexer@^1.0.0, cjs-module-lexer@^1.2.2: resolved "https://registry.yarnpkg.com/cjs-module-lexer/-/cjs-module-lexer-1.2.3.tgz#6c370ab19f8a3394e318fe682686ec0ac684d107" integrity sha512-0TNiGstbQmCFwt4akjjBg5pLRTSyj/PkWQ1ZoO2zntmg9yLqSRxwEa4iCfQLGjqhiqBfOJa7W/E8wfGrTDmlZQ== +class-utils@^0.3.5: + version "0.3.6" + resolved "https://registry.yarnpkg.com/class-utils/-/class-utils-0.3.6.tgz#f93369ae8b9a7ce02fd41faad0ca83033190c463" + integrity sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg== + dependencies: + arr-union "^3.1.0" + define-property "^0.2.5" + isobject "^3.0.0" + static-extend "^0.1.1" + classnames@^2.3.2: version "2.3.2" resolved "https://registry.yarnpkg.com/classnames/-/classnames-2.3.2.tgz#351d813bf0137fcc6a76a16b88208d2560a0d924" @@ -4440,11 +4613,23 @@ cli-cursor@3.1.0, cli-cursor@^3.1.0: dependencies: restore-cursor "^3.1.0" +cli-cursor@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-2.1.0.tgz#b35dac376479facc3e94747d41d0d0f5238ffcb5" + integrity sha512-8lgKz8LmCRYZZQDpRyT2m5rKJ08TnU4tR9FFFW2rxpxR1FzWi4PQ/NfyODchAatHaUgnSPVcx/R5w6NuTBzFiw== + dependencies: + restore-cursor "^2.0.0" + cli-spinners@2.6.1: version "2.6.1" resolved "https://registry.yarnpkg.com/cli-spinners/-/cli-spinners-2.6.1.tgz#adc954ebe281c37a6319bfa401e6dd2488ffb70d" integrity sha512-x/5fWmGMnbKQAaNwN+UZlV79qBLM9JFnJuJ03gIi5whrob0xV0ofNVHy9DhwGdsMJQc2OKv0oGmLzvaqvAVv+g== +cli-spinners@^2.0.0: + version "2.9.2" + resolved "https://registry.yarnpkg.com/cli-spinners/-/cli-spinners-2.9.2.tgz#1773a8f4b9c4d6ac31563df53b3fc1d79462fe41" + integrity sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg== + cli-spinners@^2.5.0: version "2.7.0" resolved "https://registry.yarnpkg.com/cli-spinners/-/cli-spinners-2.7.0.tgz#f815fd30b5f9eaac02db604c7a231ed7cb2f797a" @@ -4475,11 +4660,25 @@ cli-truncate@^3.1.0: slice-ansi "^5.0.0" string-width "^5.0.0" +cli-width@^2.0.0: + version "2.2.1" + resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-2.2.1.tgz#b0433d0b4e9c847ef18868a4ef16fd5fc8271c48" + integrity sha512-GRMWDxpOB6Dgk2E5Uo+3eEBvtOOlimMmpbFiKuLFnQzYDavtLFY3K5ona41jgN/WdRZtG7utuVSVTL4HbZHGkw== + cli-width@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-3.0.0.tgz#a2f48437a2caa9a22436e794bf071ec9e61cedf6" integrity sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw== +cliui@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-5.0.0.tgz#deefcfdb2e800784aa34f46fa08e06851c7bbbc5" + integrity sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA== + dependencies: + string-width "^3.1.0" + strip-ansi "^5.2.0" + wrap-ansi "^5.1.0" + cliui@^6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/cliui/-/cliui-6.0.0.tgz#511d702c0c4e41ca156d7d0e96021f23e13225b1" @@ -4536,6 +4735,14 @@ collect-v8-coverage@^1.0.0: resolved "https://registry.yarnpkg.com/collect-v8-coverage/-/collect-v8-coverage-1.0.1.tgz#cc2c8e94fc18bbdffe64d6534570c8a673b27f59" integrity sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg== +collection-visit@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/collection-visit/-/collection-visit-1.0.0.tgz#4bc0373c164bc3291b4d368c829cf1a80a59dca0" + integrity sha512-lNkKvzEeMBBjUGHZ+q6z9pSJla0KWAQPvtzhEV9+iGyQYG+pBpl7xKDhxoNSOZH2hhv0v5k0y2yAM4o4SjoSkw== + dependencies: + map-visit "^1.0.0" + object-visit "^1.0.0" + color-convert@^1.9.0, color-convert@^1.9.3: version "1.9.3" resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" @@ -4568,7 +4775,7 @@ color-string@^1.6.0: color-name "^1.0.0" simple-swizzle "^0.2.2" -color-support@1.1.3, color-support@^1.1.2: +color-support@1.1.3, color-support@^1.1.2, color-support@^1.1.3: version "1.1.3" resolved "https://registry.yarnpkg.com/color-support/-/color-support-1.1.3.tgz#93834379a1cc9a0c61f82f52f0d04322251bd5a2" integrity sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg== @@ -4624,7 +4831,7 @@ commander@^10.0.1: resolved "https://registry.yarnpkg.com/commander/-/commander-10.0.1.tgz#881ee46b4f77d1c1dccc5823433aa39b022cbe06" integrity sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug== -commander@^2.20.0: +commander@^2.19.0, commander@^2.20.0: version "2.20.3" resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== @@ -4682,6 +4889,11 @@ compare-func@^2.0.0: array-ify "^1.0.0" dot-prop "^5.1.0" +component-emitter@^1.2.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.3.1.tgz#ef1d5796f7d93f135ee6fb684340b26403c97d17" + integrity sha512-T0+barUSQRTUQASh8bx02dl+DhF54GtIDY13Y3m9oWTklKbb3Wv974meRpeZ3lp1JpLVECWWNHC4vaG2XHXouQ== + compressible@~2.0.16, compressible@~2.0.18: version "2.0.18" resolved "https://registry.yarnpkg.com/compressible/-/compressible-2.0.18.tgz#af53cca6b070d4c3c0750fbd77286a6d7cc46fba" @@ -4720,6 +4932,16 @@ concat-map@0.0.1: resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== +concat-stream@^1.6.0: + version "1.6.2" + resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.2.tgz#904bdf194cd3122fc675c77fc4ac3d4ff0fd1a34" + integrity sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw== + dependencies: + buffer-from "^1.0.0" + inherits "^2.0.3" + readable-stream "^2.2.2" + typedarray "^0.0.6" + concat-stream@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-2.0.0.tgz#414cf5af790a48c60ab9be4527d56d5e41133cb1" @@ -4863,6 +5085,11 @@ cookie@0.7.2: resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.7.2.tgz#556369c472a2ba910f2979891b526b3436237ed7" integrity sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w== +copy-descriptor@^0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d" + integrity sha512-XgZ0pFcakEUlbwQEVNg3+QAis1FyTL3Qel9FYy8pSkQqoG3PNoT0bOCQtOXcOkur21r2Eq2kI+IE+gsmAEVlYw== + core-js-compat@^3.38.0: version "3.39.0" resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.39.0.tgz#b12dccb495f2601dc860bdbe7b4e3ffa8ba63f61" @@ -4870,6 +5097,11 @@ core-js-compat@^3.38.0: dependencies: browserslist "^4.24.2" +core-js@^2.4.1: + version "2.6.12" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.6.12.tgz#d9333dfa7b065e347cc5682219d6f690859cc2ec" + integrity sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ== + core-util-is@1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" @@ -4925,6 +5157,26 @@ cross-env@^7.0.3: dependencies: cross-spawn "^7.0.1" +cross-spawn@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-5.1.0.tgz#e8bd0efee58fcff6f8f94510a0a554bbfa235449" + integrity sha512-pTgQJ5KC0d2hcY8eyL1IzlBPYjTkyH72XRZPnLyKus2mBfNjQs3klqbJU2VILqZryAZUt9JOb3h/mWMy23/f5A== + dependencies: + lru-cache "^4.0.1" + shebang-command "^1.2.0" + which "^1.2.9" + +cross-spawn@^6.0.0: + version "6.0.6" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.6.tgz#30d0efa0712ddb7eb5a76e1e8721bffafa6b5d57" + integrity sha512-VqCUuhcd1iB+dsv8gxPttb5iZh/D0iubSP21g36KXdEuf6I5JiioesUVjpCdHV9MZRUfVFlvwtIUyPfxo5trtw== + dependencies: + nice-try "^1.0.4" + path-key "^2.0.1" + semver "^5.5.0" + shebang-command "^1.2.0" + which "^1.2.9" + cross-spawn@^6.0.5: version "6.0.5" resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4" @@ -5057,7 +5309,7 @@ dayjs@^1.10.4, dayjs@^1.8.15: resolved "https://registry.yarnpkg.com/dayjs/-/dayjs-1.11.13.tgz#92430b0139055c3ebb60150aa13e860a4b5a366c" integrity sha512-oaMBel6gjolK862uaPQOVTA7q3TZhuSvuMQAAglQDOWYO9A91IrAOUJEyKVlqJlHE0vq5p5UXxzdPfMH/x6xNg== -debug@2.6.9, debug@^2.2.0: +debug@2.6.9, debug@^2.2.0, debug@^2.3.3: version "2.6.9" resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== @@ -5096,6 +5348,11 @@ decimal.js@^10.4.2: resolved "https://registry.yarnpkg.com/decimal.js/-/decimal.js-10.4.3.tgz#1044092884d245d1b7f65725fa4ad4c6f781cc23" integrity sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA== +decode-uri-component@^0.2.0: + version "0.2.2" + resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.2.tgz#e69dbe25d37941171dd540e024c444cd5188e1e9" + integrity sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ== + dedent@1.5.3, dedent@^1.0.0: version "1.5.3" resolved "https://registry.yarnpkg.com/dedent/-/dedent-1.5.3.tgz#99aee19eb9bae55a67327717b6e848d0bf777e5a" @@ -5111,16 +5368,16 @@ deep-is@^0.1.3, deep-is@~0.1.3: resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831" integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== +deepmerge@^3.2.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-3.3.0.tgz#d3c47fd6f3a93d517b14426b0628a17b0125f5f7" + integrity sha512-GRQOafGHwMHpjPx9iCvTgpu9NojZ49q794EEL94JVEw6VaeA8XTUyBKvAkOOjBX9oJNiV6G3P+T+tihFjo2TqA== + deepmerge@^4.2.2: version "4.2.2" resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-4.2.2.tgz#44d2ea3679b8f4d4ffba33f03d865fc1e7bf4955" integrity sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg== -deepmerge@^4.3.0: - version "4.3.1" - resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-4.3.1.tgz#44b5f2147cd3b00d4b56137685966f26fd25dd4a" - integrity sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A== - defaults@^1.0.3: version "1.0.4" resolved "https://registry.yarnpkg.com/defaults/-/defaults-1.0.4.tgz#b0b02062c1e2aa62ff5d9528f0f98baa90978d7a" @@ -5128,7 +5385,7 @@ defaults@^1.0.3: dependencies: clone "^1.0.2" -define-data-property@^1.0.1, define-data-property@^1.1.2: +define-data-property@^1.0.1, define-data-property@^1.1.2, define-data-property@^1.1.4: version "1.1.4" resolved "https://registry.yarnpkg.com/define-data-property/-/define-data-property-1.1.4.tgz#894dc141bb7d3060ae4366f6a0107e68fbe48c5e" integrity sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A== @@ -5151,6 +5408,28 @@ define-properties@^1.1.3, define-properties@^1.1.4, define-properties@^1.2.0, de has-property-descriptors "^1.0.0" object-keys "^1.1.1" +define-property@^0.2.5: + version "0.2.5" + resolved "https://registry.yarnpkg.com/define-property/-/define-property-0.2.5.tgz#c35b1ef918ec3c990f9a5bc57be04aacec5c8116" + integrity sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA== + dependencies: + is-descriptor "^0.1.0" + +define-property@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/define-property/-/define-property-1.0.0.tgz#769ebaaf3f4a63aad3af9e8d304c9bbe79bfb0e6" + integrity sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA== + dependencies: + is-descriptor "^1.0.0" + +define-property@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/define-property/-/define-property-2.0.2.tgz#d459689e8d654ba77e02a817f8710d702cb16e9d" + integrity sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ== + dependencies: + is-descriptor "^1.0.2" + isobject "^3.0.1" + delayed-stream@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" @@ -5181,15 +5460,6 @@ dependency-tree@^10.0.9: precinct "^11.0.5" typescript "^5.0.4" -deprecated-react-native-prop-types@^4.2.3: - version "4.2.3" - resolved "https://registry.yarnpkg.com/deprecated-react-native-prop-types/-/deprecated-react-native-prop-types-4.2.3.tgz#0ef845c1a80ef1636bd09060e4cdf70f9727e5ad" - integrity sha512-2rLTiMKidIFFYpIVM69UnQKngLqQfL6I11Ch8wGSBftS18FUXda+o2we2950X+1dmbgps28niI3qwyH4eX3Z1g== - dependencies: - "@react-native/normalize-colors" "<0.73.0" - invariant "^2.2.4" - prop-types "^15.8.1" - deprecation@^2.0.0: version "2.3.1" resolved "https://registry.yarnpkg.com/deprecation/-/deprecation-2.3.1.tgz#6368cbdb40abf3373b525ac87e4a260c3a700919" @@ -5355,6 +5625,15 @@ dottie@^2.0.6: resolved "https://registry.yarnpkg.com/dottie/-/dottie-2.0.6.tgz#34564ebfc6ec5e5772272d466424ad5b696484d4" integrity sha512-iGCHkfUc5kFekGiqhe8B/mdaurD+lakO9txNnTvKtA6PISrw86LgqHvRzWYPyoE2Ph5aMIrCw9/uko6XHTKCwA== +dunder-proto@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/dunder-proto/-/dunder-proto-1.0.1.tgz#d7ae667e1dc83482f8b70fd0f6eefc50da30f58a" + integrity sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A== + dependencies: + call-bind-apply-helpers "^1.0.1" + es-errors "^1.3.0" + gopd "^1.2.0" + duplexer@^0.1.1, duplexer@~0.1.1: version "0.1.2" resolved "https://registry.yarnpkg.com/duplexer/-/duplexer-0.1.2.tgz#3abe43aef3835f8ae077d136ddce0f276b0400e6" @@ -5407,6 +5686,11 @@ emittery@^0.13.1: resolved "https://registry.yarnpkg.com/emittery/-/emittery-0.13.1.tgz#c04b8c3457490e0847ae51fced3af52d338e3dad" integrity sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ== +emoji-regex@^7.0.1: + version "7.0.3" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-7.0.3.tgz#933a04052860c85e83c122479c4748a8e4c72156" + integrity sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA== + emoji-regex@^8.0.0: version "8.0.0" resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" @@ -5432,7 +5716,7 @@ encodeurl@~2.0.0: resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-2.0.0.tgz#7b8ea898077d7e409d3ac45474ea38eaf0857a58" integrity sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg== -encoding@^0.1.13: +encoding@^0.1.11, encoding@^0.1.13: version "0.1.13" resolved "https://registry.yarnpkg.com/encoding/-/encoding-0.1.13.tgz#56574afdd791f54a8e9b2785c0582a2d26210fa9" integrity sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A== @@ -5513,7 +5797,7 @@ error-stack-parser@^2.0.6: dependencies: stackframe "^1.3.4" -errorhandler@^1.5.1: +errorhandler@^1.5.0: version "1.5.1" resolved "https://registry.yarnpkg.com/errorhandler/-/errorhandler-1.5.1.tgz#b9ba5d17cf90744cd1e851357a6e75bf806a9a91" integrity sha512-rcOwbfvP1WTViVoUjcfZicVzjhjTuhSMntHh6mW3IrEiyE6mJyXvsToJUJGlGlw/2xU9P5whlWNGlIDVeCiT4A== @@ -5580,6 +5864,11 @@ es-define-property@^1.0.0: dependencies: get-intrinsic "^1.2.4" +es-define-property@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/es-define-property/-/es-define-property-1.0.1.tgz#983eb2f9a6724e9303f61addf011c72e09e0b0fa" + integrity sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g== + es-errors@^1.0.0, es-errors@^1.2.1, es-errors@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/es-errors/-/es-errors-1.3.0.tgz#05f75a25dab98e4fb1dcd5e1472c0546d5057c8f" @@ -5605,6 +5894,13 @@ es-iterator-helpers@^1.0.12: iterator.prototype "^1.1.2" safe-array-concat "^1.0.1" +es-object-atoms@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/es-object-atoms/-/es-object-atoms-1.0.0.tgz#ddb55cd47ac2e240701260bc2a8e31ecb643d941" + integrity sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw== + dependencies: + es-errors "^1.3.0" + es-set-tostringtag@^2.0.1, es-set-tostringtag@^2.0.3: version "2.0.3" resolved "https://registry.yarnpkg.com/es-set-tostringtag/-/es-set-tostringtag-2.0.3.tgz#8bb60f0a440c2e4281962428438d58545af39777" @@ -5882,7 +6178,7 @@ espree@^9.6.0, espree@^9.6.1: acorn-jsx "^5.3.2" eslint-visitor-keys "^3.4.1" -esprima@^4.0.0, esprima@^4.0.1, esprima@~4.0.0: +esprima@^4.0.0, esprima@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== @@ -5949,11 +6245,21 @@ eventemitter2@6.4.7: resolved "https://registry.yarnpkg.com/eventemitter2/-/eventemitter2-6.4.7.tgz#a7f6c4d7abf28a14c1ef3442f21cb306a054271d" integrity sha512-tYUSVOGeQPKt/eC1ABfhHy5Xd96N3oIijJvN3O9+TsC28T5V9yX9oEfEK5faP0EFSNVOG97qtAS68GBrQB2hDg== +eventemitter3@^3.0.0: + version "3.1.2" + resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-3.1.2.tgz#2d3d48f9c346698fce83a85d7d664e98535df6e7" + integrity sha512-tvtQIeLVHjDkJYnzf2dgVMxfuSGJeM/7UCG17TT4EumTfNtF+0nebF/4zWOIkCreAbtNqhGEboB6BWrwqNaw4Q== + eventemitter3@^4.0.4: version "4.0.7" resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-4.0.7.tgz#2de9b68f6528d5644ef5c59526a1b4a07306169f" integrity sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw== +exec-sh@^0.3.2: + version "0.3.6" + resolved "https://registry.yarnpkg.com/exec-sh/-/exec-sh-0.3.6.tgz#ff264f9e325519a60cb5e273692943483cca63bc" + integrity sha512-nQn+hI3yp+oD0huYhKwvYI32+JFeq+XkNcD1GAo3Y/MjxsfVGmrrzrnzjWiNY6f+pUCP440fThsFh5gZrRAU/w== + execa@4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/execa/-/execa-4.1.0.tgz#4e5491ad1572f2f17a77d388c6c857135b22847a" @@ -5999,6 +6305,19 @@ execa@5.1.1, execa@^5.0.0: signal-exit "^3.0.3" strip-final-newline "^2.0.0" +execa@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/execa/-/execa-1.0.0.tgz#c6236a5bb4df6d6f15e88e7f017798216749ddd8" + integrity sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA== + dependencies: + cross-spawn "^6.0.0" + get-stream "^4.0.0" + is-stream "^1.1.0" + npm-run-path "^2.0.0" + p-finally "^1.0.0" + signal-exit "^3.0.0" + strip-eof "^1.0.0" + execa@^6.1.0: version "6.1.0" resolved "https://registry.yarnpkg.com/execa/-/execa-6.1.0.tgz#cea16dee211ff011246556388effa0818394fb20" @@ -6026,6 +6345,19 @@ exit@^0.1.2: resolved "https://registry.yarnpkg.com/exit/-/exit-0.1.2.tgz#0632638f8d877cc82107d30a0fff1a17cba1cd0c" integrity sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ== +expand-brackets@^2.1.4: + version "2.1.4" + resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-2.1.4.tgz#b77735e315ce30f6b6eff0f83b04151a22449622" + integrity sha512-w/ozOKR9Obk3qoWeY/WDi6MFta9AoMR+zud60mdnbniMcBxRuFJyDt2LdX/14A1UABeqk+Uk+LDfUpvoGKppZA== + dependencies: + debug "^2.3.3" + define-property "^0.2.5" + extend-shallow "^2.0.1" + posix-character-classes "^0.1.0" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.1" + expect@^29.0.0, expect@^29.7.0: version "29.7.0" resolved "https://registry.yarnpkg.com/expect/-/expect-29.7.0.tgz#578874590dcb3214514084c08115d8aee61e11bc" @@ -6079,11 +6411,42 @@ express@^4.18.2: utils-merge "1.0.1" vary "~1.1.2" +extend-shallow@^1.1.2: + version "1.1.4" + resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-1.1.4.tgz#19d6bf94dfc09d76ba711f39b872d21ff4dd9071" + integrity sha512-L7AGmkO6jhDkEBBGWlLtftA80Xq8DipnrRPr0pyi7GQLXkaq9JYA4xF4z6qnadIC6euiTDKco0cGSU9muw+WTw== + dependencies: + kind-of "^1.1.0" + +extend-shallow@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-2.0.1.tgz#51af7d614ad9a9f610ea1bafbb989d6b1c56890f" + integrity sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug== + dependencies: + is-extendable "^0.1.0" + +extend-shallow@^3.0.0, extend-shallow@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-3.0.2.tgz#26a71aaf073b39fb2127172746131c2704028db8" + integrity sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q== + dependencies: + assign-symbols "^1.0.0" + is-extendable "^1.0.1" + extend@~3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== +external-editor@^2.0.4: + version "2.2.0" + resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-2.2.0.tgz#045511cfd8d133f3846673d1047c154e214ad3d5" + integrity sha512-bSn6gvGxKt+b7+6TKEv1ZycHleA7aHhRHyAqJyp5pbUFuYYNIzpZnQDk7AsYckyWdEnTeAnay0aCy2aV6iTk9A== + dependencies: + chardet "^0.4.0" + iconv-lite "^0.4.17" + tmp "^0.0.33" + external-editor@^3.0.3: version "3.1.0" resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-3.1.0.tgz#cb03f740befae03ea4d283caed2741a83f335495" @@ -6093,6 +6456,20 @@ external-editor@^3.0.3: iconv-lite "^0.4.24" tmp "^0.0.33" +extglob@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/extglob/-/extglob-2.0.4.tgz#ad00fe4dc612a9232e8718711dc5cb5ab0285543" + integrity sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw== + dependencies: + array-unique "^0.3.2" + define-property "^1.0.0" + expand-brackets "^2.1.4" + extend-shallow "^2.0.1" + fragment-cache "^0.2.1" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.1" + extract-zip@2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/extract-zip/-/extract-zip-2.0.1.tgz#663dca56fe46df890d5f131ef4a06d22bb8ba13a" @@ -6114,6 +6491,16 @@ extsprintf@^1.2.0: resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.4.1.tgz#8d172c064867f235c0c84a596806d279bf4bcc07" integrity sha512-Wrk35e8ydCKDj/ArClo1VrPVmN8zph5V4AtHwIuHhvMXsKf73UT3BOD+azBIW+3wOJ4FhEH7zyaJCFvChjYvMA== +fancy-log@^1.3.2: + version "1.3.3" + resolved "https://registry.yarnpkg.com/fancy-log/-/fancy-log-1.3.3.tgz#dbc19154f558690150a23953a0adbd035be45fc7" + integrity sha512-k9oEhlyc0FrVh25qYuSELjr8oxsCoc4/LEZfg2iJJrfEk/tZL9bCoJE47gqAvI2m/AUjluCS4+3I0eTx8n3AEw== + dependencies: + ansi-gray "^0.1.1" + color-support "^1.1.3" + parse-node-version "^1.0.0" + time-stamp "^1.0.0" + fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: version "3.1.3" resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" @@ -6145,13 +6532,6 @@ fast-levenshtein@^2.0.6, fast-levenshtein@~2.0.6: resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw== -fast-xml-parser@^4.0.12: - version "4.5.1" - resolved "https://registry.yarnpkg.com/fast-xml-parser/-/fast-xml-parser-4.5.1.tgz#a7e665ff79b7919100a5202f23984b6150f9b31e" - integrity sha512-y655CeyUQ+jj7KBbYMc4FG01V8ZQqjN+gDYGJ50RtfsUB8iG9AmwmwoAgeKLJdmueKKMrH1RJ7yXHTSoczdv5w== - dependencies: - strnum "^1.0.5" - fastq@^1.6.0: version "1.15.0" resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.15.0.tgz#d04d07c6a2a68fe4599fea8d2e103a937fae6b3a" @@ -6166,6 +6546,41 @@ fb-watchman@^2.0.0: dependencies: bser "2.1.1" +fbjs-css-vars@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/fbjs-css-vars/-/fbjs-css-vars-1.0.2.tgz#216551136ae02fe255932c3ec8775f18e2c078b8" + integrity sha512-b2XGFAFdWZWg0phtAWLHCk836A1Xann+I+Dgd3Gk64MHKZO44FfoD1KxyvbSh0qZsIoXQGGlVztIY+oitJPpRQ== + +fbjs-scripts@^1.1.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/fbjs-scripts/-/fbjs-scripts-1.2.0.tgz#069a0c0634242d10031c6460ef1fccefcdae8b27" + integrity sha512-5krZ8T0Bf8uky0abPoCLrfa7Orxd8UH4Qq8hRUF2RZYNMu+FmEOrBc7Ib3YVONmxTXTlLAvyrrdrVmksDb2OqQ== + dependencies: + "@babel/core" "^7.0.0" + ansi-colors "^1.0.1" + babel-preset-fbjs "^3.2.0" + core-js "^2.4.1" + cross-spawn "^5.1.0" + fancy-log "^1.3.2" + object-assign "^4.0.1" + plugin-error "^0.1.2" + semver "^5.1.0" + through2 "^2.0.0" + +fbjs@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fbjs/-/fbjs-1.0.0.tgz#52c215e0883a3c86af2a7a776ed51525ae8e0a5a" + integrity sha512-MUgcMEJaFhCaF1QtWGnmq9ZDRAzECTCRAF7O6UZIlAlkTs1SasiX9aP0Iw7wfD2mJ7wDTNfg2w7u5fSCwJk1OA== + dependencies: + core-js "^2.4.1" + fbjs-css-vars "^1.0.0" + isomorphic-fetch "^2.1.1" + loose-envify "^1.0.0" + object-assign "^4.1.0" + promise "^7.1.1" + setimmediate "^1.0.5" + ua-parser-js "^0.7.18" + fd-slicer@~1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/fd-slicer/-/fd-slicer-1.1.0.tgz#25c7c89cb1f9077f8891bbe61d8f390eae256f1e" @@ -6185,6 +6600,13 @@ figures@3.2.0, figures@^3.0.0, figures@^3.2.0: dependencies: escape-string-regexp "^1.0.5" +figures@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/figures/-/figures-2.0.0.tgz#3ab1a2d2a62c8bfb431a0c94cb797a2fce27c962" + integrity sha512-Oa2M9atig69ZkfwiApY8F2Yy+tzMbazyvqv21R0NsSC8floSOC09BbT1ITWAdoMGQvJ/aZnR1KMwdx9tvHnTNA== + dependencies: + escape-string-regexp "^1.0.5" + file-entry-cache@^6.0.1: version "6.0.1" resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-6.0.1.tgz#211b2dd9659cb0394b073e7323ac3c933d522027" @@ -6192,6 +6614,11 @@ file-entry-cache@^6.0.1: dependencies: flat-cache "^3.0.4" +file-uri-to-path@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz#553a7b8446ff6f684359c445f1e37a05dacc33dd" + integrity sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw== + filelist@^1.0.1: version "1.0.4" resolved "https://registry.yarnpkg.com/filelist/-/filelist-1.0.4.tgz#f78978a1e944775ff9e62e744424f215e58352b5" @@ -6217,6 +6644,16 @@ filing-cabinet@^4.1.6: tsconfig-paths "^4.2.0" typescript "^5.0.4" +fill-range@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-4.0.0.tgz#d544811d428f98eb06a63dc402d2403c328c38f7" + integrity sha512-VcpLTWqWDiTerugjj8e3+esbg+skS3M9e54UuR3iCeIDMXCLTsAH8hTSzDQU/X6/6t3eYkOKoZSef2PlU6U1XQ== + dependencies: + extend-shallow "^2.0.1" + is-number "^3.0.0" + repeat-string "^1.6.1" + to-regex-range "^2.1.0" + fill-range@^7.1.1: version "7.1.1" resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.1.1.tgz#44265d3cac07e3ea7dc247516380643754a05292" @@ -6307,21 +6744,6 @@ flatted@^3.1.0: resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.2.7.tgz#609f39207cb614b89d0765b477cb2d437fbf9787" integrity sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ== -flow-enums-runtime@^0.0.5: - version "0.0.5" - resolved "https://registry.yarnpkg.com/flow-enums-runtime/-/flow-enums-runtime-0.0.5.tgz#95884bfcc82edaf27eef7e1dd09732331cfbafbc" - integrity sha512-PSZF9ZuaZD03sT9YaIs0FrGJ7lSUw7rHZIex+73UYVXg46eL/wxN5PaVcPJFudE2cJu5f0fezitV5aBkLHPUOQ== - -flow-parser@0.*: - version "0.257.1" - resolved "https://registry.yarnpkg.com/flow-parser/-/flow-parser-0.257.1.tgz#1d563688f5c0b5a573ce380a86aa1cc2c44c65df" - integrity sha512-7+KYDpAXyBPD/wODhbPYO6IGUx+WwtJcLLG/r3DvbNyxaDyuYaTBKbSqeCldWQzuFcj+MsOVx2bpkEwVPB9JRw== - -flow-parser@^0.206.0: - version "0.206.0" - resolved "https://registry.yarnpkg.com/flow-parser/-/flow-parser-0.206.0.tgz#f4f794f8026535278393308e01ea72f31000bfef" - integrity sha512-HVzoK3r6Vsg+lKvlIZzaWNBVai+FXTX1wdYhz/wVlH13tb/gOdLXmlTqy6odmTBhT5UoWUbq0k8263Qhr9d88w== - fn.name@1.x.x: version "1.1.0" resolved "https://registry.yarnpkg.com/fn.name/-/fn.name-1.1.0.tgz#26cad8017967aea8731bc42961d04a3d5988accc" @@ -6339,6 +6761,11 @@ for-each@^0.3.3: dependencies: is-callable "^1.1.3" +for-in@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80" + integrity sha512-7EwmXrOjyL+ChxMhmG5lnW9MPt1aIeZEwKhQzoBUdTV0N3zuwWDZYVJatDvZ2OyzPUvdIAZDsCetk3coyMfcnQ== + foreground-child@^3.1.0: version "3.1.1" resolved "https://registry.yarnpkg.com/foreground-child/-/foreground-child-3.1.1.tgz#1d173e776d75d2772fed08efe4a0de1ea1b12d0d" @@ -6366,6 +6793,13 @@ forwarded@0.2.0: resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.2.0.tgz#2269936428aad4c15c7ebe9779a84bf0b2a81811" integrity sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow== +fragment-cache@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/fragment-cache/-/fragment-cache-0.2.1.tgz#4290fad27f13e89be7f33799c6bc5a0abfff0d19" + integrity sha512-GMBAbW9antB8iZRHLoGw0b3HANt57diZYFO/HL1JGIC1MjKrdmhxvrJbupnVvpys0zsz7yBApXdQyfepKly2kA== + dependencies: + map-cache "^0.2.2" + fresh@0.5.2: version "0.5.2" resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" @@ -6388,6 +6822,15 @@ fs-constants@^1.0.0: resolved "https://registry.yarnpkg.com/fs-constants/-/fs-constants-1.0.0.tgz#6be0de9be998ce16af8afc24497b9ee9b7ccd9ad" integrity sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow== +fs-extra@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-1.0.0.tgz#cd3ce5f7e7cb6145883fcae3191e9877f8587950" + integrity sha512-VerQV6vEKuhDWD2HGOybV6v5I73syoc/cXAbKlgTC7M/oFVEtklWlp9QH2Ijw3IaWDOQcMkldSPa7zXy79Z/UQ== + dependencies: + graceful-fs "^4.1.2" + jsonfile "^2.1.0" + klaw "^1.0.0" + fs-extra@^11.2.0: version "11.2.0" resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-11.2.0.tgz#e70e17dfad64232287d01929399e0ea7c86b0e5b" @@ -6435,6 +6878,14 @@ fs.realpath@^1.0.0: resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== +fsevents@^1.2.7: + version "1.2.13" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.2.13.tgz#f325cb0455592428bcf11b383370ef70e3bfcc38" + integrity sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw== + dependencies: + bindings "^1.5.0" + nan "^2.12.1" + fsevents@^2.3.2, fsevents@~2.3.2: version "2.3.2" resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a" @@ -6504,6 +6955,22 @@ get-intrinsic@^1.1.1, get-intrinsic@^1.1.3, get-intrinsic@^1.2.1, get-intrinsic@ has-symbols "^1.0.3" hasown "^2.0.0" +get-intrinsic@^1.2.6: + version "1.2.6" + resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.2.6.tgz#43dd3dd0e7b49b82b2dfcad10dc824bf7fc265d5" + integrity sha512-qxsEs+9A+u85HhllWJJFicJfPDhRmjzoYdl64aMWW9yRIJmSyxdn8IEkuIM530/7T+lv0TIHd8L6Q/ra0tEoeA== + dependencies: + call-bind-apply-helpers "^1.0.1" + dunder-proto "^1.0.0" + es-define-property "^1.0.1" + es-errors "^1.3.0" + es-object-atoms "^1.0.0" + function-bind "^1.1.2" + gopd "^1.2.0" + has-symbols "^1.1.0" + hasown "^2.0.2" + math-intrinsics "^1.0.0" + get-own-enumerable-property-symbols@^3.0.0: version "3.0.2" resolved "https://registry.yarnpkg.com/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.2.tgz#b5fde77f22cbe35f390b4e089922c50bce6ef664" @@ -6539,6 +7006,13 @@ get-stream@6.0.0: resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-6.0.0.tgz#3e0012cb6827319da2706e601a1583e8629a6718" integrity sha512-A1B3Bh1UmL0bidM/YX2NsCOTnGJePL9rO/M+Mw3m9f2gUpfokS0hi5Eah0WSUEWZdZhIZtMjkIYS7mDfOqNHbg== +get-stream@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-4.1.0.tgz#c1b255575f3dc21d59bfc79cd3d2b46b1c3a54b5" + integrity sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w== + dependencies: + pump "^3.0.0" + get-stream@^5.0.0, get-stream@^5.1.0: version "5.2.0" resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-5.2.0.tgz#4966a1795ee5ace65e706c4b7beb71257d6e22d3" @@ -6560,6 +7034,11 @@ get-symbol-description@^1.0.2: es-errors "^1.3.0" get-intrinsic "^1.2.4" +get-value@^2.0.3, get-value@^2.0.6: + version "2.0.6" + resolved "https://registry.yarnpkg.com/get-value/-/get-value-2.0.6.tgz#dc15ca1c672387ca76bd37ac0a395ba2042a2c28" + integrity sha512-Ln0UQDlxH1BapMu3GPtf7CuYNwRZf2gwCuPqbyG6pB8WfmFpzqcy4xtAaAMUhnNqjMKTiCPZG2oMT3YSx8U2NA== + getos@^3.2.1: version "3.2.1" resolved "https://registry.yarnpkg.com/getos/-/getos-3.2.1.tgz#0134d1f4e00eb46144c5a9c0ac4dc087cbb27dc5" @@ -6659,7 +7138,7 @@ glob@^11.0.0, glob@~11.0.0: package-json-from-dist "^1.0.0" path-scurry "^2.0.0" -glob@^7.1.1, glob@^7.1.3, glob@^7.1.4, glob@^7.2.3: +glob@^7.1.3, glob@^7.1.4, glob@^7.2.3: version "7.2.3" resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== @@ -6744,7 +7223,12 @@ gopd@^1.0.1: dependencies: get-intrinsic "^1.1.3" -graceful-fs@4.2.11, graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.2, graceful-fs@^4.1.3, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.4, graceful-fs@^4.2.6, graceful-fs@^4.2.9: +gopd@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/gopd/-/gopd-1.2.0.tgz#89f56b8217bdbc8802bd299df6d7f1081d7e51a1" + integrity sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg== + +graceful-fs@4.2.11, graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.2, graceful-fs@^4.1.3, graceful-fs@^4.1.6, graceful-fs@^4.1.9, graceful-fs@^4.2.0, graceful-fs@^4.2.4, graceful-fs@^4.2.6, graceful-fs@^4.2.9: version "4.2.11" resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3" integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== @@ -6803,6 +7287,11 @@ has-symbols@^1.0.2, has-symbols@^1.0.3: resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.3.tgz#bb7b2c4349251dce87b125f7bdf874aa7c8b39f8" integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A== +has-symbols@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.1.0.tgz#fc9c6a783a084951d0b971fe1018de813707a338" + integrity sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ== + has-tostringtag@^1.0.0, has-tostringtag@^1.0.1, has-tostringtag@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/has-tostringtag/-/has-tostringtag-1.0.2.tgz#2cdc42d40bef2e5b4eeab7c01a73c54ce7ab5abc" @@ -6815,6 +7304,37 @@ has-unicode@2.0.1, has-unicode@^2.0.1: resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" integrity sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ== +has-value@^0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/has-value/-/has-value-0.3.1.tgz#7b1f58bada62ca827ec0a2078025654845995e1f" + integrity sha512-gpG936j8/MzaeID5Yif+577c17TxaDmhuyVgSwtnL/q8UUTySg8Mecb+8Cf1otgLoD7DDH75axp86ER7LFsf3Q== + dependencies: + get-value "^2.0.3" + has-values "^0.1.4" + isobject "^2.0.0" + +has-value@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-value/-/has-value-1.0.0.tgz#18b281da585b1c5c51def24c930ed29a0be6b177" + integrity sha512-IBXk4GTsLYdQ7Rvt+GRBrFSVEkmuOUy4re0Xjd9kJSUQpnTrWR4/y9RpfexN9vkAPMFuQoeWKwqzPozRTlasGw== + dependencies: + get-value "^2.0.6" + has-values "^1.0.0" + isobject "^3.0.0" + +has-values@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/has-values/-/has-values-0.1.4.tgz#6d61de95d91dfca9b9a02089ad384bff8f62b771" + integrity sha512-J8S0cEdWuQbqD9//tlZxiMuMNmxB8PlEwvYwuxsTmR1G5RXUePEX/SJn7aD0GMLieuZYSwNH0cQuJGwnYunXRQ== + +has-values@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-values/-/has-values-1.0.0.tgz#95b0b63fec2146619a6fe57fe75628d5a39efe4f" + integrity sha512-ODYZC64uqzmtfGMEAX/FvZiRyWLpAC3vYnNunURUnkGVTS+mI0smVsWaPydRBsE3g+ok7h960jChO8mFcWlHaQ== + dependencies: + is-number "^3.0.0" + kind-of "^4.0.0" + hasown@^2.0.0, hasown@^2.0.1, hasown@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/hasown/-/hasown-2.0.2.tgz#003eaf91be7adc372e84ec59dc37252cedb80003" @@ -6822,17 +7342,10 @@ hasown@^2.0.0, hasown@^2.0.1, hasown@^2.0.2: dependencies: function-bind "^1.1.2" -hermes-estree@0.12.0: - version "0.12.0" - resolved "https://registry.yarnpkg.com/hermes-estree/-/hermes-estree-0.12.0.tgz#8a289f9aee854854422345e6995a48613bac2ca8" - integrity sha512-+e8xR6SCen0wyAKrMT3UD0ZCCLymKhRgjEB5sS28rKiFir/fXgLoeRilRUssFCILmGHb+OvHDUlhxs0+IEyvQw== - -hermes-parser@0.12.0: - version "0.12.0" - resolved "https://registry.yarnpkg.com/hermes-parser/-/hermes-parser-0.12.0.tgz#114dc26697cfb41a6302c215b859b74224383773" - integrity sha512-d4PHnwq6SnDLhYl3LHNHvOg7nQ6rcI7QVil418REYksv0Mh3cEkHDcuhGxNQ3vgnLSLl4QSvDrFCwQNYdpWlzw== - dependencies: - hermes-estree "0.12.0" +hermes-engine@~0.5.0: + version "0.5.1" + resolved "https://registry.yarnpkg.com/hermes-engine/-/hermes-engine-0.5.1.tgz#601115e4b1e0a17d9aa91243b96277de4e926e09" + integrity sha512-hLwqh8dejHayjlpvZY40e1aDCDvyP98cWx/L5DhAjSJLH8g4z9Tp08D7y4+3vErDsncPOdf1bxm+zUWpx0/Fxg== hermes-profile-transformer@^0.0.6: version "0.0.6" @@ -6957,7 +7470,7 @@ husky@^9.0.7: resolved "https://registry.yarnpkg.com/husky/-/husky-9.1.5.tgz#2b6edede53ee1adbbd3a3da490628a23f5243b83" integrity sha512-rowAVRUBfI0b4+niA4SJMhfQwc107VLkBUgEYYAOQAbqDCnra1nYh83hF/MDmhYs9t9n1E3DuKOrs2LYNC+0Ag== -iconv-lite@0.4.24, iconv-lite@^0.4.24: +iconv-lite@0.4.24, iconv-lite@^0.4.17, iconv-lite@^0.4.24: version "0.4.24" resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== @@ -6998,12 +7511,10 @@ ignore@~6.0.2: resolved "https://registry.yarnpkg.com/ignore/-/ignore-6.0.2.tgz#77cccb72a55796af1b6d2f9eb14fa326d24f4283" integrity sha512-InwqeHHN2XpumIkMvpl/DCJVrAHgCsG5+cn1XlnLWGwtZBm8QJfSusItfrwx81CTp5agNZqpKU2J/ccC5nGT4A== -image-size@^1.0.2: - version "1.2.0" - resolved "https://registry.yarnpkg.com/image-size/-/image-size-1.2.0.tgz#312af27a2ff4ff58595ad00b9344dd684c910df6" - integrity sha512-4S8fwbO6w3GeCVN6OPtA9I5IGKkcDMPcKndtUlpJuCwu7JLjtj7JZpwqLuyY2nrmQT3AWsCJLSKPsc2mPBSl3w== - dependencies: - queue "6.0.2" +image-size@^0.6.0: + version "0.6.3" + resolved "https://registry.yarnpkg.com/image-size/-/image-size-0.6.3.tgz#e7e5c65bb534bd7cdcedd6cb5166272a85f75fb2" + integrity sha512-47xSUiQioGaB96nqtp5/q55m0aBQSQdyIloMOc/x+QVTDZLNmXE892IIDrJ0hM1A5vcNUDD5tDffkSP5lCaIIA== immer@^10.0.3: version "10.1.1" @@ -7115,6 +7626,26 @@ init-package-json@6.0.3: validate-npm-package-license "^3.0.4" validate-npm-package-name "^5.0.0" +inquirer@^3.0.6: + version "3.3.0" + resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-3.3.0.tgz#9dd2f2ad765dcab1ff0443b491442a20ba227dc9" + integrity sha512-h+xtnyk4EwKvFWHrUYsWErEVR+igKtLdchu+o0Z1RL7VU/jVMFbYir2bp6bAj8efFNxWqHX0dIss6fJQ+/+qeQ== + dependencies: + ansi-escapes "^3.0.0" + chalk "^2.0.0" + cli-cursor "^2.1.0" + cli-width "^2.0.0" + external-editor "^2.0.4" + figures "^2.0.0" + lodash "^4.3.0" + mute-stream "0.0.7" + run-async "^2.2.0" + rx-lite "^4.0.8" + rx-lite-aggregates "^4.0.8" + string-width "^2.1.0" + strip-ansi "^4.0.0" + through "^2.3.6" + inquirer@^8.2.4: version "8.2.6" resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-8.2.6.tgz#733b74888195d8d400a67ac332011b5fae5ea562" @@ -7160,11 +7691,23 @@ ip-address@^9.0.5: jsbn "1.1.0" sprintf-js "^1.1.3" +ip@^1.1.5: + version "1.1.9" + resolved "https://registry.yarnpkg.com/ip/-/ip-1.1.9.tgz#8dfbcc99a754d07f425310b86a99546b1151e396" + integrity sha512-cyRxvOEpNHNtchU3Ln9KC/auJgup87llfQpQ+t5ghoC/UhL16SWzbueiCsdTnWmqAWl7LadfuwhlqmtOaqMHdQ== + ipaddr.js@1.9.1: version "1.9.1" resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.1.tgz#bff38543eeb8984825079ff3a2a8e6cbd46781b3" integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g== +is-accessor-descriptor@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-1.0.1.tgz#3223b10628354644b86260db29b3e693f5ceedd4" + integrity sha512-YBUanLI8Yoihw923YeFUS5fs0fF2f5TSFTNiYAAzhhDscDa3lEqYuz1pDOEP5KvX94I9ey3vsqjJcLVFVU+3QA== + dependencies: + hasown "^2.0.0" + is-arguments@^1.0.4: version "1.1.1" resolved "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz#15b3f88fda01f2a97fec84ca761a560f123efa9b" @@ -7220,6 +7763,11 @@ is-boolean-object@^1.1.0: call-bind "^1.0.2" has-tostringtag "^1.0.0" +is-buffer@^1.1.5: + version "1.1.6" + resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" + integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w== + is-builtin-module@^3.2.1: version "3.2.1" resolved "https://registry.yarnpkg.com/is-builtin-module/-/is-builtin-module-3.2.1.tgz#f03271717d8654cfcaf07ab0463faa3571581169" @@ -7239,6 +7787,13 @@ is-ci@3.0.1: dependencies: ci-info "^3.2.0" +is-ci@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-2.0.0.tgz#6bc6334181810e04b5c22b3d589fdca55026404c" + integrity sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w== + dependencies: + ci-info "^2.0.0" + is-core-module@^2.13.0, is-core-module@^2.13.1, is-core-module@^2.5.0, is-core-module@^2.9.0: version "2.15.1" resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.15.1.tgz#a7363a25bee942fefab0de13bf6aa372c82dcc37" @@ -7253,6 +7808,13 @@ is-core-module@^2.16.0: dependencies: hasown "^2.0.2" +is-data-descriptor@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-1.0.1.tgz#2109164426166d32ea38c405c1e0945d9e6a4eeb" + integrity sha512-bc4NlCDiCr28U4aEsQ3Qs2491gVq4V8G7MQyws968ImqjKuYtTJXrl7Vq7jsN7Ly/C3xj5KWFrY7sHNeDkAzXw== + dependencies: + hasown "^2.0.0" + is-date-object@^1.0.1, is-date-object@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.5.tgz#0841d5536e724c25597bf6ea62e1bd38298df31f" @@ -7260,6 +7822,22 @@ is-date-object@^1.0.1, is-date-object@^1.0.5: dependencies: has-tostringtag "^1.0.0" +is-descriptor@^0.1.0: + version "0.1.7" + resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-0.1.7.tgz#2727eb61fd789dcd5bdf0ed4569f551d2fe3be33" + integrity sha512-C3grZTvObeN1xud4cRWl366OMXZTj0+HGyk4hvfpx4ZHt1Pb60ANSXqCK7pdOTeUQpRzECBSTphqvD7U+l22Eg== + dependencies: + is-accessor-descriptor "^1.0.1" + is-data-descriptor "^1.0.1" + +is-descriptor@^1.0.0, is-descriptor@^1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-1.0.3.tgz#92d27cb3cd311c4977a4db47df457234a13cb306" + integrity sha512-JCNNGbwWZEVaSPtS45mdtrneRWJFp07LLmykxeFV5F6oBvNF8vHSfJuJgoT472pSfk+Mf8VnlrspaFBHWM8JAw== + dependencies: + is-accessor-descriptor "^1.0.1" + is-data-descriptor "^1.0.1" + is-directory@^0.3.1: version "0.3.1" resolved "https://registry.yarnpkg.com/is-directory/-/is-directory-0.3.1.tgz#61339b6f2475fc772fd9c9d83f5c8575dc154ae1" @@ -7270,6 +7848,18 @@ is-docker@^2.0.0, is-docker@^2.1.1: resolved "https://registry.yarnpkg.com/is-docker/-/is-docker-2.2.1.tgz#33eeabe23cfe86f14bde4408a02c0cfb853acdaa" integrity sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ== +is-extendable@^0.1.0, is-extendable@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89" + integrity sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw== + +is-extendable@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-1.0.1.tgz#a7470f9e426733d81bd81e1155264e3a3507cab4" + integrity sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA== + dependencies: + is-plain-object "^2.0.4" + is-extglob@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" @@ -7356,6 +7946,13 @@ is-number-object@^1.0.4: dependencies: has-tostringtag "^1.0.0" +is-number@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-3.0.0.tgz#24fd6201a4782cf50561c810276afc7d12d71195" + integrity sha512-4cboCqIpliH+mAvFNegjZQ4kgKc3ZUhQVr3HvWbSh5q3WH2v82ct+T2Y1hdU5Gdtorx/cLifQjqCbL7bpznLTg== + dependencies: + kind-of "^3.0.2" + is-number@^7.0.0: version "7.0.0" resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" @@ -7381,7 +7978,7 @@ is-plain-obj@^1.0.0, is-plain-obj@^1.1.0: resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-1.1.0.tgz#71a50c8429dfca773c92a390a4a03b39fcd51d3e" integrity sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg== -is-plain-object@^2.0.4: +is-plain-object@^2.0.3, is-plain-object@^2.0.4: version "2.0.4" resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677" integrity sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og== @@ -7447,6 +8044,11 @@ is-stream@2.0.0: resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.0.tgz#bde9c32680d6fae04129d6ac9d921ce7815f78e3" integrity sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw== +is-stream@^1.0.1, is-stream@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" + integrity sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ== + is-stream@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.1.tgz#fac1e3d53b97ad5a9d0ae9cef2389f5810a5c077" @@ -7525,6 +8127,11 @@ is-weakset@^2.0.1: call-bind "^1.0.2" get-intrinsic "^1.1.1" +is-windows@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d" + integrity sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA== + is-wsl@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-1.1.0.tgz#1f16e4aa22b04d1336b66188a66af3c600c3a66d" @@ -7537,16 +8144,16 @@ is-wsl@^2.2.0: dependencies: is-docker "^2.0.0" +isarray@1.0.0, isarray@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" + integrity sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ== + isarray@^2.0.5: version "2.0.5" resolved "https://registry.yarnpkg.com/isarray/-/isarray-2.0.5.tgz#8af1e4c1221244cc62459faf38940d4e644a5723" integrity sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw== -isarray@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" - integrity sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ== - isexe@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" @@ -7557,11 +8164,26 @@ isexe@^3.1.1: resolved "https://registry.yarnpkg.com/isexe/-/isexe-3.1.1.tgz#4a407e2bd78ddfb14bea0c27c6f7072dde775f0d" integrity sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ== -isobject@^3.0.1: +isobject@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89" + integrity sha512-+OUdGJlgjOBZDfxnDjYYG6zp487z0JGNQq3cYQYg5f5hKR+syHMsaztzGeml/4kGG55CSpKSpWTY+jYGgsHLgA== + dependencies: + isarray "1.0.0" + +isobject@^3.0.0, isobject@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" integrity sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg== +isomorphic-fetch@^2.1.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/isomorphic-fetch/-/isomorphic-fetch-2.2.1.tgz#611ae1acf14f5e81f729507472819fe9733558a9" + integrity sha512-9c4TNAKYXM5PRyVcwUZrF3W09nQ+sO7+jydgs4ZGW9dhsLG2VOlISJABombdQqQRXCwuYG3sYV/puGf5rp0qmA== + dependencies: + node-fetch "^1.0.1" + whatwg-fetch ">=0.10.0" + isomorphic-fetch@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/isomorphic-fetch/-/isomorphic-fetch-3.0.0.tgz#0267b005049046d2421207215d45d6a262b8b8b4" @@ -7787,7 +8409,7 @@ jest-environment-jsdom@^29.3.1: jest-util "^29.7.0" jsdom "^20.0.0" -jest-environment-node@^29.2.1, jest-environment-node@^29.7.0: +jest-environment-node@^29.7.0: version "29.7.0" resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-29.7.0.tgz#0b93e111dda8ec120bc8300e6d1fb9576e164376" integrity sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw== @@ -7799,11 +8421,35 @@ jest-environment-node@^29.2.1, jest-environment-node@^29.7.0: jest-mock "^29.7.0" jest-util "^29.7.0" +jest-get-type@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-24.9.0.tgz#1684a0c8a50f2e4901b6644ae861f579eed2ef0e" + integrity sha512-lUseMzAley4LhIcpSP9Jf+fTrQ4a1yHQwLNeeVa2cEmbCGeoZAtYPOIv8JaxLD/sUpKxetKGP+gsHl8f8TSj8Q== + jest-get-type@^29.6.3: version "29.6.3" resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-29.6.3.tgz#36f499fdcea197c1045a127319c0481723908fd1" integrity sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw== +jest-haste-map@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-24.9.0.tgz#b38a5d64274934e21fa417ae9a9fbeb77ceaac7d" + integrity sha512-kfVFmsuWui2Sj1Rp1AJ4D9HqJwE4uwTlS/vO+eRUaMmd54BFpli2XhMQnPC2k4cHFVbB2Q2C+jtI1AGLgEnCjQ== + dependencies: + "@jest/types" "^24.9.0" + anymatch "^2.0.0" + fb-watchman "^2.0.0" + graceful-fs "^4.1.15" + invariant "^2.2.4" + jest-serializer "^24.9.0" + jest-util "^24.9.0" + jest-worker "^24.9.0" + micromatch "^3.1.10" + sane "^4.0.3" + walker "^1.0.7" + optionalDependencies: + fsevents "^1.2.7" + jest-haste-map@^29.7.0: version "29.7.0" resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-29.7.0.tgz#3c2396524482f5a0506376e6c858c3bbcc17b104" @@ -7841,6 +8487,20 @@ jest-matcher-utils@^29.7.0: jest-get-type "^29.6.3" pretty-format "^29.7.0" +jest-message-util@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-24.9.0.tgz#527f54a1e380f5e202a8d1149b0ec872f43119e3" + integrity sha512-oCj8FiZ3U0hTP4aSui87P4L4jC37BtQwUMqk+zk/b11FR19BJDeZsZAvIHutWnmtw7r85UmR3CEWZ0HWU2mAlw== + dependencies: + "@babel/code-frame" "^7.0.0" + "@jest/test-result" "^24.9.0" + "@jest/types" "^24.9.0" + "@types/stack-utils" "^1.0.1" + chalk "^2.0.1" + micromatch "^3.1.10" + slash "^2.0.0" + stack-utils "^1.0.1" + jest-message-util@^29.7.0: version "29.7.0" resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-29.7.0.tgz#8bc392e204e95dfe7564abbe72a404e28e51f7f3" @@ -7856,6 +8516,13 @@ jest-message-util@^29.7.0: slash "^3.0.0" stack-utils "^2.0.3" +jest-mock@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-24.9.0.tgz#c22835541ee379b908673ad51087a2185c13f1c6" + integrity sha512-3BEYN5WbSq9wd+SyLDES7AHnjH9A/ROBwmz7l2y+ol+NtSFO8DYiEBzoO1CeFc9a8DYy10EO4dDFVv/wN3zl1w== + dependencies: + "@jest/types" "^24.9.0" + jest-mock@^29.7.0: version "29.7.0" resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-29.7.0.tgz#4e836cf60e99c6fcfabe9f99d017f3fdd50a6347" @@ -7870,11 +8537,6 @@ jest-pnp-resolver@^1.2.2: resolved "https://registry.yarnpkg.com/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz#930b1546164d4ad5937d5540e711d4d38d4cad2e" integrity sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w== -jest-regex-util@^27.0.6: - version "27.5.1" - resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-27.5.1.tgz#4da143f7e9fd1e542d4aa69617b38e4a78365b95" - integrity sha512-4bfKq2zie+x16okqDXjXn9ql2B0dScQu+vcwe4TvFVhkVyuWLqpZrZtXxLLWoXYgn0E87I6r6GRYHF7wFZBUvg== - jest-regex-util@^29.6.3: version "29.6.3" resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-29.6.3.tgz#4a556d9c776af68e1c5f48194f4d0327d24e8a52" @@ -7958,6 +8620,11 @@ jest-runtime@^29.7.0: slash "^3.0.0" strip-bom "^4.0.0" +jest-serializer@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/jest-serializer/-/jest-serializer-24.9.0.tgz#e6d7d7ef96d31e8b9079a714754c5d5c58288e73" + integrity sha512-DxYipDr8OvfrKH3Kel6NdED3OXxjvxXZ1uIY2I9OFbGg+vUkkg7AGvi65qbhbWNPvDckXmzMPbK3u3HaDO49bQ== + jest-snapshot@^29.7.0: version "29.7.0" resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-29.7.0.tgz#c2c574c3f51865da1bb329036778a69bf88a6be5" @@ -7984,17 +8651,23 @@ jest-snapshot@^29.7.0: pretty-format "^29.7.0" semver "^7.5.3" -jest-util@^27.2.0: - version "27.5.1" - resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-27.5.1.tgz#3ba9771e8e31a0b85da48fe0b0891fb86c01c2f9" - integrity sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw== +jest-util@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-24.9.0.tgz#7396814e48536d2e85a37de3e4c431d7cb140162" + integrity sha512-x+cZU8VRmOJxbA1K5oDBdxQmdq0OIdADarLxk0Mq+3XS4jgvhG/oKGWcIDCtPG0HgjxOYvF+ilPJQsAyXfbNOg== dependencies: - "@jest/types" "^27.5.1" - "@types/node" "*" - chalk "^4.0.0" - ci-info "^3.2.0" - graceful-fs "^4.2.9" - picomatch "^2.2.3" + "@jest/console" "^24.9.0" + "@jest/fake-timers" "^24.9.0" + "@jest/source-map" "^24.9.0" + "@jest/test-result" "^24.9.0" + "@jest/types" "^24.9.0" + callsites "^3.0.0" + chalk "^2.0.1" + graceful-fs "^4.1.15" + is-ci "^2.0.0" + mkdirp "^0.5.1" + slash "^2.0.0" + source-map "^0.6.0" jest-util@^29.0.0, jest-util@^29.7.0: version "29.7.0" @@ -8008,7 +8681,19 @@ jest-util@^29.0.0, jest-util@^29.7.0: graceful-fs "^4.2.9" picomatch "^2.2.3" -jest-validate@^29.2.1, jest-validate@^29.7.0: +jest-validate@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-24.9.0.tgz#0775c55360d173cd854e40180756d4ff52def8ab" + integrity sha512-HPIt6C5ACwiqSiwi+OfSSHbK8sG7akG8eATl+IPKaeIjtPOeBUd/g3J7DghugzxrGjI93qS/+RPKe1H6PqvhRQ== + dependencies: + "@jest/types" "^24.9.0" + camelcase "^5.3.1" + chalk "^2.0.1" + jest-get-type "^24.9.0" + leven "^3.1.0" + pretty-format "^24.9.0" + +jest-validate@^29.7.0: version "29.7.0" resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-29.7.0.tgz#7bf705511c64da591d46b15fce41400d52147d9c" integrity sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw== @@ -8034,14 +8719,13 @@ jest-watcher@^29.7.0: jest-util "^29.7.0" string-length "^4.0.1" -jest-worker@^27.2.0: - version "27.5.1" - resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-27.5.1.tgz#8d146f0900e8973b106b6f73cc1e9a8cb86f8db0" - integrity sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg== +jest-worker@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-24.9.0.tgz#5dbfdb5b2d322e98567898238a9697bcce67b3e5" + integrity sha512-51PE4haMSXcHohnSMdM42anbvZANYTqMrr52tVKPqqsPJMzoP6FYYDVqahX/HrAoKEKz3uUPzSvKs9A3qR4iVw== dependencies: - "@types/node" "*" merge-stream "^2.0.0" - supports-color "^8.0.0" + supports-color "^6.1.0" jest-worker@^29.7.0: version "29.7.0" @@ -8063,7 +8747,12 @@ jest@^29.3.1: import-local "^3.0.2" jest-cli "^29.7.0" -joi@^17.13.3, joi@^17.2.1: +jetifier@^1.6.2: + version "1.6.8" + resolved "https://registry.yarnpkg.com/jetifier/-/jetifier-1.6.8.tgz#e88068697875cbda98c32472902c4d3756247798" + integrity sha512-3Zi16h6L5tXDRQJTb221cnRoVG9/9OvreLdLU2/ZjRv/GILL+2Cemt0IKvkowwkDpvouAU1DQPOJ7qaiHeIdrw== + +joi@^17.13.3: version "17.13.3" resolved "https://registry.yarnpkg.com/joi/-/joi-17.13.3.tgz#0f5cc1169c999b30d344366d384b12d92558bcec" integrity sha512-otDA4ldcIx+ZXsKHWmp0YizCweVRZG96J10b0FevjfuncLO1oX59THoAmHkNubYJ+9gWsYsp5k8v4ib6oDv1fA== @@ -8104,40 +8793,10 @@ jsbn@~0.1.0: resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" integrity sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg== -jsc-android@^250231.0.0: - version "250231.0.0" - resolved "https://registry.yarnpkg.com/jsc-android/-/jsc-android-250231.0.0.tgz#91720f8df382a108872fa4b3f558f33ba5e95262" - integrity sha512-rS46PvsjYmdmuz1OAWXY/1kCYG7pnf1TBqeTiOJr1iDz7s5DLxxC9n/ZMknLDxzYzNVfI7R95MH10emSSG1Wuw== - -jsc-safe-url@^0.2.2: - version "0.2.4" - resolved "https://registry.yarnpkg.com/jsc-safe-url/-/jsc-safe-url-0.2.4.tgz#141c14fbb43791e88d5dc64e85a374575a83477a" - integrity sha512-0wM3YBWtYePOjfyXQH5MWQ8H7sdk5EXSwZvmSLKk2RboVQ2Bu239jycHDz5J/8Blf3K0Qnoy2b6xD+z10MFB+Q== - -jscodeshift@^0.14.0: - version "0.14.0" - resolved "https://registry.yarnpkg.com/jscodeshift/-/jscodeshift-0.14.0.tgz#7542e6715d6d2e8bde0b4e883f0ccea358b46881" - integrity sha512-7eCC1knD7bLUPuSCwXsMZUH51O8jIcoVyKtI6P0XM0IVzlGjckPy3FIwQlorzbN0Sg79oK+RlohN32Mqf/lrYA== - dependencies: - "@babel/core" "^7.13.16" - "@babel/parser" "^7.13.16" - "@babel/plugin-proposal-class-properties" "^7.13.0" - "@babel/plugin-proposal-nullish-coalescing-operator" "^7.13.8" - "@babel/plugin-proposal-optional-chaining" "^7.13.12" - "@babel/plugin-transform-modules-commonjs" "^7.13.8" - "@babel/preset-flow" "^7.13.13" - "@babel/preset-typescript" "^7.13.0" - "@babel/register" "^7.13.16" - babel-core "^7.0.0-bridge.0" - chalk "^4.1.2" - flow-parser "0.*" - graceful-fs "^4.2.4" - micromatch "^4.0.4" - neo-async "^2.5.0" - node-dir "^0.1.17" - recast "^0.21.0" - temp "^0.8.4" - write-file-atomic "^2.3.0" +jsc-android@^245459.0.0: + version "245459.0.0" + resolved "https://registry.yarnpkg.com/jsc-android/-/jsc-android-245459.0.0.tgz#e584258dd0b04c9159a27fb104cd5d491fd202c9" + integrity sha512-wkjURqwaB1daNkDi2OYYbsLnIdC/lUM2nPXQKRs5pqEU9chDg435bjvo+LSaHotDENygHQDHe+ntUkkw2gwMtg== jsdoc-type-pratt-parser@~4.0.0: version "4.0.0" @@ -8211,6 +8870,17 @@ json-stable-stringify-without-jsonify@^1.0.1: resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" integrity sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw== +json-stable-stringify@^1.0.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/json-stable-stringify/-/json-stable-stringify-1.2.1.tgz#addb683c2b78014d0b78d704c2fcbdf0695a60e2" + integrity sha512-Lp6HbbBgosLmJbjx0pBLbgvx68FaFU1sdkmBuckmhhJ88kL13OA51CDtR2yJB50eCNMH9wRqtQNNiAqQH4YXnA== + dependencies: + call-bind "^1.0.8" + call-bound "^1.0.3" + isarray "^2.0.5" + jsonify "^0.0.1" + object-keys "^1.1.1" + json-stringify-nice@^1.1.4: version "1.1.4" resolved "https://registry.yarnpkg.com/json-stringify-nice/-/json-stringify-nice-1.1.4.tgz#2c937962b80181d3f317dd39aa323e14f5a60a67" @@ -8243,6 +8913,13 @@ jsonc-parser@~3.3.1: resolved "https://registry.yarnpkg.com/jsonc-parser/-/jsonc-parser-3.3.1.tgz#f2a524b4f7fd11e3d791e559977ad60b98b798b4" integrity sha512-HUgH65KyejrUFPvHFPbqOY0rsFip3Bo5wb4ngvdi1EpCYWUQDC5V+Y7mZws+DLkr4M//zQJoanu1SP+87Dv1oQ== +jsonfile@^2.1.0: + version "2.4.0" + resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-2.4.0.tgz#3736a2b428b87bbda0cc83b53fa3d633a35c2ae8" + integrity sha512-PKllAqbgLgxHaj8TElYymKCAgrASebJrWpTnEkOaTowt23VKXXN0sUeriJ+eh7y6ufb/CC5ap11pz71/cM0hUw== + optionalDependencies: + graceful-fs "^4.1.6" + jsonfile@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-4.0.0.tgz#8771aae0799b64076b76640fca058f9c10e33ecb" @@ -8259,6 +8936,11 @@ jsonfile@^6.0.1: optionalDependencies: graceful-fs "^4.1.6" +jsonify@^0.0.1, jsonify@~0.0.0: + version "0.0.1" + resolved "https://registry.yarnpkg.com/jsonify/-/jsonify-0.0.1.tgz#2aa3111dae3d34a0f151c63f3a45d995d9420978" + integrity sha512-2/Ki0GcmuqSrgFyelQq9M05y7PS0mEwuIzrf3f1fPqkVDVRvZrPZtVSMHxdgo8Aq0sxAOb/cr2aqqA3LeWHVPg== + jsonparse@^1.2.0, jsonparse@^1.3.1: version "1.3.1" resolved "https://registry.yarnpkg.com/jsonparse/-/jsonparse-1.3.1.tgz#3f4dae4a91fac315f71062f8521cc239f1366280" @@ -8330,11 +9012,37 @@ jws@^3.2.2: jwa "^1.4.1" safe-buffer "^5.0.1" +kind-of@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-1.1.0.tgz#140a3d2d41a36d2efcfa9377b62c24f8495a5c44" + integrity sha512-aUH6ElPnMGon2/YkxRIigV32MOpTVcoXQ1Oo8aYn40s+sJ3j+0gFZsT8HKDcxNy7Fi9zuquWtGaGAahOdv5p/g== + +kind-of@^3.0.2, kind-of@^3.0.3, kind-of@^3.2.0: + version "3.2.2" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64" + integrity sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ== + dependencies: + is-buffer "^1.1.5" + +kind-of@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-4.0.0.tgz#20813df3d712928b207378691a45066fae72dd57" + integrity sha512-24XsCxmEbRwEDbz/qz3stgin8TTzZ1ESR56OMCN0ujYg+vRutNSiOj9bHH9u85DKgXguraugV5sFuvbD4FW/hw== + dependencies: + is-buffer "^1.1.5" + kind-of@^6.0.2, kind-of@^6.0.3: version "6.0.3" resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd" integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw== +klaw@^1.0.0: + version "1.3.1" + resolved "https://registry.yarnpkg.com/klaw/-/klaw-1.3.1.tgz#4088433b46b3b1ba259d78785d8e96f73ba02439" + integrity sha512-TED5xi9gGQjGpNnvRWknrwAB1eL5GciPfVFOt3Vk1OJCVDQbzuSfrF3hkUQKlsgKrG1F+0t5W0m+Fje1jIt8rw== + optionalDependencies: + graceful-fs "^4.1.9" + kleur@^3.0.3: version "3.0.3" resolved "https://registry.yarnpkg.com/kleur/-/kleur-3.0.3.tgz#a79c9ecc86ee1ce3fa6206d1216c501f147fc07e" @@ -8671,11 +9379,18 @@ lodash.throttle@^4.1.1: resolved "https://registry.yarnpkg.com/lodash.throttle/-/lodash.throttle-4.1.1.tgz#c23e91b710242ac70c37f1e1cda9274cc39bf2f4" integrity sha512-wIkUCfVKpVsWo3JSZlc+8MB5it+2AN5W8J7YVMST30UrvcQNZ1Okbj+rbVniijTWE6FGYy4XJq/rHkas8qJMLQ== -lodash@^4.17.21: +lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.21, lodash@^4.3.0: version "4.17.21" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== +log-symbols@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-2.2.0.tgz#5740e1c5d6f0dfda4ad9323b5332107ef6b4c40a" + integrity sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg== + dependencies: + chalk "^2.0.1" + log-symbols@^4.0.0, log-symbols@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-4.1.0.tgz#3fbdbb95b4683ac9fc785111e792e558d4abd503" @@ -8736,6 +9451,14 @@ lru-cache@^11.0.0: resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-11.0.2.tgz#fbd8e7cf8211f5e7e5d91905c415a3f55755ca39" integrity sha512-123qHRfJBmo2jXDbo/a5YOQrJoHF/GNQTLzQ5+IdK5pWpceK17yRc6ozlWd25FxvGKQbIUs91fDFkXmDHTKcyA== +lru-cache@^4.0.1: + version "4.1.5" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.5.tgz#8bbe50ea85bed59bc9e33dcab8235ee9bcf443cd" + integrity sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g== + dependencies: + pseudomap "^1.0.2" + yallist "^2.1.2" + lru-cache@^5.1.1: version "5.1.1" resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920" @@ -8828,6 +9551,11 @@ makeerror@1.0.12: dependencies: tmpl "1.0.5" +map-cache@^0.2.2: + version "0.2.2" + resolved "https://registry.yarnpkg.com/map-cache/-/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf" + integrity sha512-8y/eV9QQZCiyn1SprXSrCmqJN0yNRATe+PO8ztwqrvrbdRLA3eYJF0yaR0YayLWkMbsQSKWS9N2gPcGEc4UsZg== + map-obj@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-1.0.1.tgz#d933ceb9205d82bdcf4886f6742bdc2b4dea146d" @@ -8843,6 +9571,13 @@ map-stream@~0.1.0: resolved "https://registry.yarnpkg.com/map-stream/-/map-stream-0.1.0.tgz#e56aa94c4c8055a16404a0674b78f215f7c8e194" integrity sha512-CkYQrPYZfWnu/DAmVCpTSX/xHpKZ80eKh2lAkyA6AJTef6bW+6JpbQZN5rofum7da+SyN1bi5ctTm+lTfcCW3g== +map-visit@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/map-visit/-/map-visit-1.0.0.tgz#ecdca8f13144e660f1b5bd41f12f3479d98dfb8f" + integrity sha512-4y7uGv8bd2WdM9vpQsiQNo41Ln1NvhvDRuVt0k2JZQ+ezN2uaQes7lZeZ+QQUHOLQAtDaBJ+7wCbi+ab/KFs+w== + dependencies: + object-visit "^1.0.0" + markdown-it@13.0.1: version "13.0.1" resolved "https://registry.yarnpkg.com/markdown-it/-/markdown-it-13.0.1.tgz#c6ecc431cacf1a5da531423fc6a42807814af430" @@ -8903,6 +9638,11 @@ markdownlint@~0.35.0: markdown-it "14.1.0" markdownlint-micromark "0.1.10" +math-intrinsics@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/math-intrinsics/-/math-intrinsics-1.1.0.tgz#a0dd74be81e2aa5c2f27e65ce283605ee4e2b7f9" + integrity sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g== + mdurl@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/mdurl/-/mdurl-1.0.1.tgz#fe85b2ec75a59037f2adfec100fd6c601761152e" @@ -8918,11 +9658,6 @@ media-typer@0.3.0: resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" integrity sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ== -memoize-one@^5.0.0: - version "5.2.1" - resolved "https://registry.yarnpkg.com/memoize-one/-/memoize-one-5.2.1.tgz#8337aa3c4335581839ec01c3d594090cebe8f00e" - integrity sha512-zYiwtZUcYyXKo/np96AGZAckk+FWWsUdJ3cHGGmld7+AhvcWmQyGCYUh1hc4Q/pkOhb65dQR/pqCyK0cOaHz4Q== - memorystream@^0.3.1: version "0.3.1" resolved "https://registry.yarnpkg.com/memorystream/-/memorystream-0.3.1.tgz#86d7090b30ce455d63fbae12dda51a47ddcaf9b2" @@ -8950,6 +9685,13 @@ merge-descriptors@1.0.3: resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.3.tgz#d80319a65f3c7935351e5cfdac8f9318504dbed5" integrity sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ== +merge-stream@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-1.0.1.tgz#4041202d508a342ba00174008df0c251b8c135e1" + integrity sha512-e6RM36aegd4f+r8BZCcYXlO2P3H6xbUM6ktL2Xmf45GAOit9bI4z6/3VU7JwllVO1L7u0UDSg/EhzQ5lmMLolA== + dependencies: + readable-stream "^2.0.1" + merge-stream@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" @@ -8965,271 +9707,242 @@ methods@~1.1.2: resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" integrity sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w== -metro-babel-transformer@0.76.9: - version "0.76.9" - resolved "https://registry.yarnpkg.com/metro-babel-transformer/-/metro-babel-transformer-0.76.9.tgz#659ba481d471b5f748c31a8f9397094b629f50ec" - integrity sha512-dAnAmBqRdTwTPVn4W4JrowPolxD1MDbuU97u3MqtWZgVRvDpmr+Cqnn5oSxLQk3Uc+Zy3wkqVrB/zXNRlLDSAQ== +metro-babel-register@0.59.0: + version "0.59.0" + resolved "https://registry.yarnpkg.com/metro-babel-register/-/metro-babel-register-0.59.0.tgz#2bcff65641b36794cf083ba732fbc46cf870fb43" + integrity sha512-JtWc29erdsXO/V3loenXKw+aHUXgj7lt0QPaZKPpctLLy8kcEpI/8pfXXgVK9weXICCpCnYtYncIosAyzh0xjg== dependencies: - "@babel/core" "^7.20.0" - hermes-parser "0.12.0" - nullthrows "^1.1.1" + "@babel/core" "^7.0.0" + "@babel/plugin-proposal-class-properties" "^7.0.0" + "@babel/plugin-proposal-nullish-coalescing-operator" "^7.0.0" + "@babel/plugin-proposal-optional-chaining" "^7.0.0" + "@babel/plugin-transform-flow-strip-types" "^7.0.0" + "@babel/plugin-transform-modules-commonjs" "^7.0.0" + "@babel/register" "^7.0.0" + escape-string-regexp "^1.0.5" -metro-cache-key@0.76.9: - version "0.76.9" - resolved "https://registry.yarnpkg.com/metro-cache-key/-/metro-cache-key-0.76.9.tgz#6f17f821d6f306fa9028b7e79445eb18387d03d9" - integrity sha512-ugJuYBLngHVh1t2Jj+uP9pSCQl7enzVXkuh6+N3l0FETfqjgOaSHlcnIhMPn6yueGsjmkiIfxQU4fyFVXRtSTw== +metro-babel-transformer@0.59.0: + version "0.59.0" + resolved "https://registry.yarnpkg.com/metro-babel-transformer/-/metro-babel-transformer-0.59.0.tgz#dda99c75d831b00142c42c020c51c103b29f199d" + integrity sha512-fdZJl8rs54GVFXokxRdD7ZrQ1TJjxWzOi/xSP25VR3E8tbm3nBZqS+/ylu643qSr/IueABR+jrlqAyACwGEf6w== + dependencies: + "@babel/core" "^7.0.0" + metro-source-map "0.59.0" -metro-cache@0.76.9: - version "0.76.9" - resolved "https://registry.yarnpkg.com/metro-cache/-/metro-cache-0.76.9.tgz#64326d7a8b470c3886a5e97d5e2a20acab20bc5f" - integrity sha512-W6QFEU5AJG1gH4Ltv8S2IvhmEhSDYnbPafyj5fGR3YLysdykj+olKv9B0V+YQXtcLGyY5CqpXLYUx595GdiKzA== +metro-cache@0.59.0: + version "0.59.0" + resolved "https://registry.yarnpkg.com/metro-cache/-/metro-cache-0.59.0.tgz#ef3c055f276933979b731455dc8317d7a66f0f2d" + integrity sha512-ryWNkSnpyADfRpHGb8BRhQ3+k8bdT/bsxMH2O0ntlZYZ188d8nnYWmxbRvFmEzToJxe/ol4uDw0tJFAaQsN8KA== dependencies: - metro-core "0.76.9" - rimraf "^3.0.2" + jest-serializer "^24.9.0" + metro-core "0.59.0" + mkdirp "^0.5.1" + rimraf "^2.5.4" -metro-config@0.76.9, metro-config@^0.76.9: - version "0.76.9" - resolved "https://registry.yarnpkg.com/metro-config/-/metro-config-0.76.9.tgz#5e60aff9d8894c1ee6bbc5de23b7c8515a0b84a3" - integrity sha512-oYyJ16PY3rprsfoi80L+gDJhFJqsKI3Pob5LKQbJpvL+gGr8qfZe1eQzYp5Xxxk9DOHKBV1xD94NB8GdT/DA8Q== +metro-config@0.59.0, metro-config@^0.59.0: + version "0.59.0" + resolved "https://registry.yarnpkg.com/metro-config/-/metro-config-0.59.0.tgz#9844e388069321dd7403e49f0d495a81f9aa0fef" + integrity sha512-MDsknFG9vZ4Nb5VR6OUDmGHaWz6oZg/FtE3up1zVBKPVRTXE1Z+k7zypnPtMXjMh3WHs/Sy4+wU1xnceE/zdnA== dependencies: - connect "^3.6.5" cosmiconfig "^5.0.5" - jest-validate "^29.2.1" - metro "0.76.9" - metro-cache "0.76.9" - metro-core "0.76.9" - metro-runtime "0.76.9" + jest-validate "^24.9.0" + metro "0.59.0" + metro-cache "0.59.0" + metro-core "0.59.0" -metro-core@0.76.9, metro-core@^0.76.9: - version "0.76.9" - resolved "https://registry.yarnpkg.com/metro-core/-/metro-core-0.76.9.tgz#5f55f0fbde41d28957e4f3bb187d32251403f00e" - integrity sha512-DSeEr43Wrd5Q7ySfRzYzDwfV89g2OZTQDf1s3exOcLjE5fb7awoLOkA2h46ZzN8NcmbbM0cuJy6hOwF073/yRQ== +metro-core@0.59.0, metro-core@^0.59.0: + version "0.59.0" + resolved "https://registry.yarnpkg.com/metro-core/-/metro-core-0.59.0.tgz#958cde3fe5c8cd84a78e1899af801ad69e9c83b1" + integrity sha512-kb5LKvV5r2pqMEzGyTid8ai2mIjW13NMduQ8oBmfha7/EPTATcTQ//s+bkhAs1toQD8vqVvjAb0cPNjWQEmcmQ== dependencies: + jest-haste-map "^24.9.0" lodash.throttle "^4.1.1" - metro-resolver "0.76.9" - -metro-file-map@0.76.9: - version "0.76.9" - resolved "https://registry.yarnpkg.com/metro-file-map/-/metro-file-map-0.76.9.tgz#dd3d76ec23fc0ba8cb7b3a3b8075bb09e0b5d378" - integrity sha512-7vJd8kksMDTO/0fbf3081bTrlw8SLiploeDf+vkkf0OwlrtDUWPOikfebp+MpZB2S61kamKjCNRfRkgrbPfSwg== - dependencies: - anymatch "^3.0.3" - debug "^2.2.0" - fb-watchman "^2.0.0" - graceful-fs "^4.2.4" - invariant "^2.2.4" - jest-regex-util "^27.0.6" - jest-util "^27.2.0" - jest-worker "^27.2.0" - micromatch "^4.0.4" - node-abort-controller "^3.1.1" - nullthrows "^1.1.1" - walker "^1.0.7" - optionalDependencies: - fsevents "^2.3.2" + metro-resolver "0.59.0" + wordwrap "^1.0.0" -metro-inspector-proxy@0.76.9: - version "0.76.9" - resolved "https://registry.yarnpkg.com/metro-inspector-proxy/-/metro-inspector-proxy-0.76.9.tgz#0d333e64a7bc9d156d712265faa7b7ae88c775e8" - integrity sha512-idIiPkb8CYshc0WZmbzwmr4B1QwsQUbpDwBzHwxE1ni27FWKWhV9CD5p+qlXZHgfwJuMRfPN+tIaLSR8+vttYg== +metro-inspector-proxy@0.59.0: + version "0.59.0" + resolved "https://registry.yarnpkg.com/metro-inspector-proxy/-/metro-inspector-proxy-0.59.0.tgz#39d1390772d13767fc595be9a1a7074e2425cf8e" + integrity sha512-hPeAuQcofTOH0F+2GEZqWkvkVY1/skezSSlMocDQDaqds+Kw6JgdA7FlZXxnKmQ/jYrWUzff/pl8SUCDwuYthQ== dependencies: connect "^3.6.5" debug "^2.2.0" - node-fetch "^2.2.0" - ws "^7.5.1" - yargs "^17.6.2" + ws "^1.1.5" + yargs "^14.2.0" -metro-minify-terser@0.76.9: - version "0.76.9" - resolved "https://registry.yarnpkg.com/metro-minify-terser/-/metro-minify-terser-0.76.9.tgz#3f6271da74dd57179852118443b62cc8dc578aab" - integrity sha512-ju2nUXTKvh96vHPoGZH/INhSvRRKM14CbGAJXQ98+g8K5z1v3luYJ/7+dFQB202eVzJdTB2QMtBjI1jUUpooCg== - dependencies: - terser "^5.15.0" - -metro-minify-uglify@0.76.9: - version "0.76.9" - resolved "https://registry.yarnpkg.com/metro-minify-uglify/-/metro-minify-uglify-0.76.9.tgz#e88c30c27911c053e1ee20e12077f0f4cbb154f8" - integrity sha512-MXRrM3lFo62FPISlPfTqC6n9HTEI3RJjDU5SvpE7sJFfJKLx02xXQEltsL/wzvEqK+DhRQ5DEYACTwf5W4Z3yA== +metro-minify-uglify@0.59.0: + version "0.59.0" + resolved "https://registry.yarnpkg.com/metro-minify-uglify/-/metro-minify-uglify-0.59.0.tgz#6491876308d878742f7b894d7fca4af356886dd5" + integrity sha512-7IzVgCVWZMymgZ/quieg/9v5EQ8QmZWAgDc86Zp9j0Vy6tQTjUn6jlU+YAKW3mfMEjMr6iIUzCD8YklX78tFAw== dependencies: uglify-es "^3.1.9" -metro-react-native-babel-preset@0.76.9: - version "0.76.9" - resolved "https://registry.yarnpkg.com/metro-react-native-babel-preset/-/metro-react-native-babel-preset-0.76.9.tgz#15868142122af14313429d7572c15cf01c16f077" - integrity sha512-eCBtW/UkJPDr6HlMgFEGF+964DZsUEF9RGeJdZLKWE7d/0nY3ABZ9ZAGxzu9efQ35EWRox5bDMXUGaOwUe5ikQ== +metro-react-native-babel-preset@0.59.0: + version "0.59.0" + resolved "https://registry.yarnpkg.com/metro-react-native-babel-preset/-/metro-react-native-babel-preset-0.59.0.tgz#20e020bc6ac9849e1477de1333d303ed42aba225" + integrity sha512-BoO6ncPfceIDReIH8pQ5tQptcGo5yRWQXJGVXfANbiKLq4tfgdZB1C1e2rMUJ6iypmeJU9dzl+EhPmIFKtgREg== dependencies: - "@babel/core" "^7.20.0" - "@babel/plugin-proposal-async-generator-functions" "^7.0.0" - "@babel/plugin-proposal-class-properties" "^7.18.0" + "@babel/plugin-proposal-class-properties" "^7.0.0" "@babel/plugin-proposal-export-default-from" "^7.0.0" - "@babel/plugin-proposal-nullish-coalescing-operator" "^7.18.0" - "@babel/plugin-proposal-numeric-separator" "^7.0.0" - "@babel/plugin-proposal-object-rest-spread" "^7.20.0" + "@babel/plugin-proposal-nullish-coalescing-operator" "^7.0.0" + "@babel/plugin-proposal-object-rest-spread" "^7.0.0" "@babel/plugin-proposal-optional-catch-binding" "^7.0.0" - "@babel/plugin-proposal-optional-chaining" "^7.20.0" - "@babel/plugin-syntax-dynamic-import" "^7.8.0" + "@babel/plugin-proposal-optional-chaining" "^7.0.0" + "@babel/plugin-syntax-dynamic-import" "^7.0.0" "@babel/plugin-syntax-export-default-from" "^7.0.0" - "@babel/plugin-syntax-flow" "^7.18.0" + "@babel/plugin-syntax-flow" "^7.2.0" "@babel/plugin-syntax-nullish-coalescing-operator" "^7.0.0" "@babel/plugin-syntax-optional-chaining" "^7.0.0" "@babel/plugin-transform-arrow-functions" "^7.0.0" - "@babel/plugin-transform-async-to-generator" "^7.20.0" "@babel/plugin-transform-block-scoping" "^7.0.0" "@babel/plugin-transform-classes" "^7.0.0" "@babel/plugin-transform-computed-properties" "^7.0.0" - "@babel/plugin-transform-destructuring" "^7.20.0" - "@babel/plugin-transform-flow-strip-types" "^7.20.0" + "@babel/plugin-transform-destructuring" "^7.0.0" + "@babel/plugin-transform-exponentiation-operator" "^7.0.0" + "@babel/plugin-transform-flow-strip-types" "^7.0.0" + "@babel/plugin-transform-for-of" "^7.0.0" "@babel/plugin-transform-function-name" "^7.0.0" "@babel/plugin-transform-literals" "^7.0.0" "@babel/plugin-transform-modules-commonjs" "^7.0.0" - "@babel/plugin-transform-named-capturing-groups-regex" "^7.0.0" + "@babel/plugin-transform-object-assign" "^7.0.0" "@babel/plugin-transform-parameters" "^7.0.0" "@babel/plugin-transform-react-display-name" "^7.0.0" "@babel/plugin-transform-react-jsx" "^7.0.0" "@babel/plugin-transform-react-jsx-self" "^7.0.0" "@babel/plugin-transform-react-jsx-source" "^7.0.0" + "@babel/plugin-transform-regenerator" "^7.0.0" "@babel/plugin-transform-runtime" "^7.0.0" "@babel/plugin-transform-shorthand-properties" "^7.0.0" "@babel/plugin-transform-spread" "^7.0.0" "@babel/plugin-transform-sticky-regex" "^7.0.0" + "@babel/plugin-transform-template-literals" "^7.0.0" "@babel/plugin-transform-typescript" "^7.5.0" "@babel/plugin-transform-unicode-regex" "^7.0.0" "@babel/template" "^7.0.0" - babel-plugin-transform-flow-enums "^0.0.2" react-refresh "^0.4.0" -metro-react-native-babel-transformer@^0.76.9: - version "0.76.9" - resolved "https://registry.yarnpkg.com/metro-react-native-babel-transformer/-/metro-react-native-babel-transformer-0.76.9.tgz#464aab85669ed39f7a59f1fd993a05de9543b09e" - integrity sha512-xXzHcfngSIkbQj+U7i/anFkNL0q2QVarYSzr34CFkzKLa79Rp16B8ki7z9eVVqo9W3B4TBcTXl3BipgRoOoZSQ== +metro-react-native-babel-transformer@0.59.0, metro-react-native-babel-transformer@^0.59.0: + version "0.59.0" + resolved "https://registry.yarnpkg.com/metro-react-native-babel-transformer/-/metro-react-native-babel-transformer-0.59.0.tgz#9b3dfd6ad35c6ef37fc4ce4d20a2eb67fabbb4be" + integrity sha512-1O3wrnMq4NcPQ1asEcl9lRDn/t+F1Oef6S9WaYVIKEhg9m/EQRGVrrTVP+R6B5Eeaj3+zNKbzM8Dx/NWy1hUbQ== dependencies: - "@babel/core" "^7.20.0" - babel-preset-fbjs "^3.4.0" - hermes-parser "0.12.0" - metro-react-native-babel-preset "0.76.9" - nullthrows "^1.1.1" + "@babel/core" "^7.0.0" + babel-preset-fbjs "^3.3.0" + metro-babel-transformer "0.59.0" + metro-react-native-babel-preset "0.59.0" + metro-source-map "0.59.0" -metro-resolver@0.76.9, metro-resolver@^0.76.9: - version "0.76.9" - resolved "https://registry.yarnpkg.com/metro-resolver/-/metro-resolver-0.76.9.tgz#79c244784b16ca56076bc1fc816d2ba74860e882" - integrity sha512-s86ipNRas9vNR5lChzzSheF7HoaQEmzxBLzwFA6/2YcGmUCowcoyPAfs1yPh4cjMw9F1T4KlMLaiwniGE7HCyw== - -metro-runtime@0.76.9, metro-runtime@^0.76.9: - version "0.76.9" - resolved "https://registry.yarnpkg.com/metro-runtime/-/metro-runtime-0.76.9.tgz#f8ebe150f8896ce1aef5d7f3a52844f8b4f721fb" - integrity sha512-/5vezDpGUtA0Fv6cJg0+i6wB+QeBbvLeaw9cTSG7L76liP0b91f8vOcYzGaUbHI8pznJCCTerxRzpQ8e3/NcDw== +metro-resolver@0.59.0, metro-resolver@^0.59.0: + version "0.59.0" + resolved "https://registry.yarnpkg.com/metro-resolver/-/metro-resolver-0.59.0.tgz#fbc9d7c95f094c52807877d0011feffb9e896fad" + integrity sha512-lbgiumnwoVosffEI96z0FGuq1ejTorHAj3QYUPmp5dFMfitRxLP7Wm/WP9l4ZZjIptxTExsJwuEff1SLRCPD9w== dependencies: - "@babel/runtime" "^7.0.0" - react-refresh "^0.4.0" + absolute-path "^0.0.0" -metro-source-map@0.76.9, metro-source-map@^0.76.9: - version "0.76.9" - resolved "https://registry.yarnpkg.com/metro-source-map/-/metro-source-map-0.76.9.tgz#0f976ada836717f307427d3830aea52a2ca7ed5f" - integrity sha512-q5qsMlu8EFvsT46wUUh+ao+efDsicT30zmaPATNhq+PcTawDbDgnMuUD+FT0bvxxnisU2PWl91RdzKfNc2qPQA== +metro-source-map@0.59.0: + version "0.59.0" + resolved "https://registry.yarnpkg.com/metro-source-map/-/metro-source-map-0.59.0.tgz#e9beb9fc51bfb4e060f95820cf1508fc122d23f7" + integrity sha512-0w5CmCM+ybSqXIjqU4RiK40t4bvANL6lafabQ2GP2XD3vSwkLY+StWzCtsb4mPuyi9R/SgoLBel+ZOXHXAH0eQ== dependencies: - "@babel/traverse" "^7.20.0" - "@babel/types" "^7.20.0" + "@babel/traverse" "^7.0.0" + "@babel/types" "^7.0.0" invariant "^2.2.4" - metro-symbolicate "0.76.9" - nullthrows "^1.1.1" - ob1 "0.76.9" + metro-symbolicate "0.59.0" + ob1 "0.59.0" source-map "^0.5.6" vlq "^1.0.0" -metro-symbolicate@0.76.9: - version "0.76.9" - resolved "https://registry.yarnpkg.com/metro-symbolicate/-/metro-symbolicate-0.76.9.tgz#f1627ef6f73bb0c4d48c55684d3c87866a0b0920" - integrity sha512-Yyq6Ukj/IeWnGST09kRt0sBK8TwzGZWoU7YAcQlh14+AREH454Olx4wbFTpkkhUkV05CzNCvUuXQ0efFxhA1bw== +metro-symbolicate@0.59.0: + version "0.59.0" + resolved "https://registry.yarnpkg.com/metro-symbolicate/-/metro-symbolicate-0.59.0.tgz#fc7f93957a42b02c2bfc57ed1e8f393f5f636a54" + integrity sha512-asLaF2A7rndrToGFIknL13aiohwPJ95RKHf0NM3hP/nipiLDoMzXT6ZnQvBqDxkUKyP+51AI75DMtb+Wcyw4Bw== dependencies: invariant "^2.2.4" - metro-source-map "0.76.9" - nullthrows "^1.1.1" + metro-source-map "0.59.0" source-map "^0.5.6" through2 "^2.0.1" vlq "^1.0.0" -metro-transform-plugins@0.76.9: - version "0.76.9" - resolved "https://registry.yarnpkg.com/metro-transform-plugins/-/metro-transform-plugins-0.76.9.tgz#73e34f2014d3df3c336a882b13e541bceb826d37" - integrity sha512-YEQeNlOCt92I7S9A3xbrfaDfwfgcxz9PpD/1eeop3c4cO3z3Q3otYuxw0WJ/rUIW8pZfOm5XCehd+1NRbWlAaw== - dependencies: - "@babel/core" "^7.20.0" - "@babel/generator" "^7.20.0" - "@babel/template" "^7.0.0" - "@babel/traverse" "^7.20.0" - nullthrows "^1.1.1" - -metro-transform-worker@0.76.9: - version "0.76.9" - resolved "https://registry.yarnpkg.com/metro-transform-worker/-/metro-transform-worker-0.76.9.tgz#281fad223f0447e1ff9cc44d6f7e33dfab9ab120" - integrity sha512-F69A0q0qFdJmP2Clqr6TpTSn4WTV9p5A28h5t9o+mB22ryXBZfUQ6BFBBW/6Wp2k/UtPH+oOsBfV9guiqm3d2Q== - dependencies: - "@babel/core" "^7.20.0" - "@babel/generator" "^7.20.0" - "@babel/parser" "^7.20.0" - "@babel/types" "^7.20.0" - babel-preset-fbjs "^3.4.0" - metro "0.76.9" - metro-babel-transformer "0.76.9" - metro-cache "0.76.9" - metro-cache-key "0.76.9" - metro-minify-terser "0.76.9" - metro-source-map "0.76.9" - metro-transform-plugins "0.76.9" - nullthrows "^1.1.1" - -metro@0.76.9, metro@^0.76.9: - version "0.76.9" - resolved "https://registry.yarnpkg.com/metro/-/metro-0.76.9.tgz#605fddf1a54d27762ddba2f636420ae2408862df" - integrity sha512-gcjcfs0l5qIPg0lc5P7pj0x7vPJ97tan+OnEjiYLbKjR1D7Oa78CE93YUPyymUPH6q7VzlzMm1UjT35waEkZUw== +metro@0.59.0, metro@^0.59.0: + version "0.59.0" + resolved "https://registry.yarnpkg.com/metro/-/metro-0.59.0.tgz#64a87cd61357814a4f279518e0781b1eab5934b8" + integrity sha512-OpVgYXyuTvouusFZQJ/UYKEbwfLmialrSCUUTGTFaBor6UMUHZgXPYtK86LzesgMqRc8aiuTQVO78iKW2Iz3wg== dependencies: "@babel/code-frame" "^7.0.0" - "@babel/core" "^7.20.0" - "@babel/generator" "^7.20.0" - "@babel/parser" "^7.20.0" + "@babel/core" "^7.0.0" + "@babel/generator" "^7.5.0" + "@babel/parser" "^7.0.0" + "@babel/plugin-external-helpers" "^7.0.0" "@babel/template" "^7.0.0" - "@babel/traverse" "^7.20.0" - "@babel/types" "^7.20.0" - accepts "^1.3.7" - async "^3.2.2" - chalk "^4.0.0" + "@babel/traverse" "^7.0.0" + "@babel/types" "^7.0.0" + absolute-path "^0.0.0" + async "^2.4.0" + babel-preset-fbjs "^3.3.0" + buffer-crc32 "^0.2.13" + chalk "^2.4.1" ci-info "^2.0.0" + concat-stream "^1.6.0" connect "^3.6.5" debug "^2.2.0" denodeify "^1.2.1" error-stack-parser "^2.0.6" - graceful-fs "^4.2.4" - hermes-parser "0.12.0" - image-size "^1.0.2" + eventemitter3 "^3.0.0" + fbjs "^1.0.0" + fs-extra "^1.0.0" + graceful-fs "^4.1.3" + image-size "^0.6.0" invariant "^2.2.4" - jest-worker "^27.2.0" - jsc-safe-url "^0.2.2" + jest-haste-map "^24.9.0" + jest-worker "^24.9.0" + json-stable-stringify "^1.0.1" lodash.throttle "^4.1.1" - metro-babel-transformer "0.76.9" - metro-cache "0.76.9" - metro-cache-key "0.76.9" - metro-config "0.76.9" - metro-core "0.76.9" - metro-file-map "0.76.9" - metro-inspector-proxy "0.76.9" - metro-minify-uglify "0.76.9" - metro-react-native-babel-preset "0.76.9" - metro-resolver "0.76.9" - metro-runtime "0.76.9" - metro-source-map "0.76.9" - metro-symbolicate "0.76.9" - metro-transform-plugins "0.76.9" - metro-transform-worker "0.76.9" - mime-types "^2.1.27" + merge-stream "^1.0.1" + metro-babel-register "0.59.0" + metro-babel-transformer "0.59.0" + metro-cache "0.59.0" + metro-config "0.59.0" + metro-core "0.59.0" + metro-inspector-proxy "0.59.0" + metro-minify-uglify "0.59.0" + metro-react-native-babel-preset "0.59.0" + metro-resolver "0.59.0" + metro-source-map "0.59.0" + metro-symbolicate "0.59.0" + mime-types "2.1.11" + mkdirp "^0.5.1" node-fetch "^2.2.0" nullthrows "^1.1.1" - rimraf "^3.0.2" + resolve "^1.5.0" + rimraf "^2.5.4" serialize-error "^2.1.0" source-map "^0.5.6" - strip-ansi "^6.0.0" - throat "^5.0.0" - ws "^7.5.1" - yargs "^17.6.2" + strip-ansi "^4.0.0" + temp "0.8.3" + throat "^4.1.0" + wordwrap "^1.0.0" + ws "^1.1.5" + xpipe "^1.0.5" + yargs "^14.2.0" + +micromatch@^3.1.10, micromatch@^3.1.4: + version "3.1.10" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-3.1.10.tgz#70859bc95c9840952f359a068a3fc49f9ecfac23" + integrity sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg== + dependencies: + arr-diff "^4.0.0" + array-unique "^0.3.2" + braces "^2.3.1" + define-property "^2.0.2" + extend-shallow "^3.0.2" + extglob "^2.0.4" + fragment-cache "^0.2.1" + kind-of "^6.0.2" + nanomatch "^1.2.9" + object.pick "^1.3.0" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.2" micromatch@^4.0.4, micromatch@^4.0.5: version "4.0.8" @@ -9244,7 +9957,19 @@ mime-db@1.52.0, "mime-db@>= 1.43.0 < 2": resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70" integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== -mime-types@^2.1.12, mime-types@^2.1.27, mime-types@~2.1.19, mime-types@~2.1.24, mime-types@~2.1.34: +mime-db@~1.23.0: + version "1.23.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.23.0.tgz#a31b4070adaea27d732ea333740a64d0ec9a6659" + integrity sha512-lsX3UhcJITPHDXGOXSglBSPoI2UbcsWMmgX1VTaeXJ11TjjxOSE/DHrCl23zJk75odJc8MVpdZzWxdWt1Csx5Q== + +mime-types@2.1.11: + version "2.1.11" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.11.tgz#c259c471bda808a85d6cd193b430a5fae4473b3c" + integrity sha512-14dD2ItPaGFLVyhddUE/Rrtg+g7v8RmBLjN5Xsb3fJJLKunoZOw3I3bK6csjoJKjaNjcXo8xob9kHDyOpJfgpg== + dependencies: + mime-db "~1.23.0" + +mime-types@^2.1.12, mime-types@~2.1.19, mime-types@~2.1.24, mime-types@~2.1.34: version "2.1.35" resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a" integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== @@ -9261,6 +9986,11 @@ mime@^2.4.1: resolved "https://registry.yarnpkg.com/mime/-/mime-2.6.0.tgz#a2a682a95cd4d0cb1d6257e28f83da7e35800367" integrity sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg== +mimic-fn@^1.0.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-1.2.0.tgz#820c86a39334640e99516928bd03fca88057d022" + integrity sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ== + mimic-fn@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" @@ -9297,7 +10027,7 @@ minimatch@^10.0.0, minimatch@~10.0.1: dependencies: brace-expansion "^2.0.1" -minimatch@^3.0.2, minimatch@^3.0.4, minimatch@^3.0.5, minimatch@^3.1.1, minimatch@^3.1.2: +minimatch@^3.0.4, minimatch@^3.0.5, minimatch@^3.1.1, minimatch@^3.1.2: version "3.1.2" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== @@ -9334,7 +10064,7 @@ minimist-options@4.1.0: is-plain-obj "^1.1.0" kind-of "^6.0.3" -minimist@^1.2.0, minimist@^1.2.5, minimist@^1.2.6, minimist@^1.2.8: +minimist@^1.1.1, minimist@^1.2.0, minimist@^1.2.5, minimist@^1.2.6, minimist@^1.2.8: version "1.2.8" resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.8.tgz#c1a464e7693302e082a075cee0c057741ac4772c" integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== @@ -9408,6 +10138,14 @@ minizlib@^2.1.1, minizlib@^2.1.2: minipass "^3.0.0" yallist "^4.0.0" +mixin-deep@^1.2.0: + version "1.3.2" + resolved "https://registry.yarnpkg.com/mixin-deep/-/mixin-deep-1.3.2.tgz#1120b43dc359a785dce65b55b82e257ccf479566" + integrity sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA== + dependencies: + for-in "^1.0.2" + is-extendable "^1.0.1" + mkdirp@^0.5.1: version "0.5.6" resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.6.tgz#7def03d2432dcae4ba1d611445c48396062255f6" @@ -9491,6 +10229,11 @@ multimatch@5.0.0: arrify "^2.0.1" minimatch "^3.0.4" +mute-stream@0.0.7: + version "0.0.7" + resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.7.tgz#3075ce93bc21b8fab43e1bc4da7e8115ed1e7bab" + integrity sha512-r65nCZhrbXXb6dXOACihYApHw2Q6pV0M3V0PSxd74N0+D8nzAdEAITq2oAjA1jVnKI+tGvEBUpqiMh0+rW6zDQ== + mute-stream@0.0.8: version "0.0.8" resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.8.tgz#1630c42b2251ff81e2a283de96a5497ea92e5e0d" @@ -9501,11 +10244,33 @@ mute-stream@^1.0.0: resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-1.0.0.tgz#e31bd9fe62f0aed23520aa4324ea6671531e013e" integrity sha512-avsJQhyd+680gKXyG/sQc0nXaC6rBkPOfyHYcFb9+hdkqQkR9bdnkJ0AMZhke0oesPqIO+mFFJ+IdBc7mst4IA== +nan@^2.12.1: + version "2.22.0" + resolved "https://registry.yarnpkg.com/nan/-/nan-2.22.0.tgz#31bc433fc33213c97bad36404bb68063de604de3" + integrity sha512-nbajikzWTMwsW+eSsNm3QwlOs7het9gGJU5dDZzRTQGk03vyBOauxgI4VakDzE0PtsGTmXPsXTbbjVhRwR5mpw== + nanoid@^3.3.7: version "3.3.7" resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.7.tgz#d0c301a691bc8d54efa0a2226ccf3fe2fd656bd8" integrity sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g== +nanomatch@^1.2.9: + version "1.2.13" + resolved "https://registry.yarnpkg.com/nanomatch/-/nanomatch-1.2.13.tgz#b87a8aa4fc0de8fe6be88895b38983ff265bd119" + integrity sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA== + dependencies: + arr-diff "^4.0.0" + array-unique "^0.3.2" + define-property "^2.0.2" + extend-shallow "^3.0.2" + fragment-cache "^0.2.1" + is-windows "^1.0.2" + kind-of "^6.0.2" + object.pick "^1.3.0" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.1" + natural-compare-lite@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/natural-compare-lite/-/natural-compare-lite-1.4.0.tgz#17b09581988979fddafe0201e931ba933c96cbb4" @@ -9526,7 +10291,7 @@ negotiator@^0.6.3, negotiator@~0.6.4: resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.4.tgz#777948e2452651c570b712dd01c23e262713fff7" integrity sha512-myRT3DiWPHqho5PrJaIRyaMv2kgYf0mUVgBNOYMuCH5Ki1yEiQaf/ZJuQ62nvpc44wL5WDbTX7yGJi1Neevw8w== -neo-async@^2.5.0, neo-async@^2.6.2: +neo-async@^2.6.2: version "2.6.2" resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.2.tgz#b4aafb93e3aeb2d8174ca53cf163ab7d7308305f" integrity sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw== @@ -9536,28 +10301,16 @@ nice-try@^1.0.4: resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366" integrity sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ== -nocache@^3.0.1: - version "3.0.4" - resolved "https://registry.yarnpkg.com/nocache/-/nocache-3.0.4.tgz#5b37a56ec6e09fc7d401dceaed2eab40c8bfdf79" - integrity sha512-WDD0bdg9mbq6F4mRxEYcPWwfA1vxd0mrvKOyxI7Xj/atfRHVeutzuWByG//jfm4uPzp0y4Kj051EORCBSQMycw== - -node-abort-controller@^3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/node-abort-controller/-/node-abort-controller-3.1.1.tgz#a94377e964a9a37ac3976d848cb5c765833b8548" - integrity sha512-AGK2yQKIjRuqnc6VkX2Xj5d+QW8xZ87pa1UK6yA6ouUyuxfHuMP6umE5QK7UmTeOAymo+Zx1Fxiuw9rVx8taHQ== +nocache@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/nocache/-/nocache-2.1.0.tgz#120c9ffec43b5729b1d5de88cd71aa75a0ba491f" + integrity sha512-0L9FvHG3nfnnmaEQPjT9xhfN4ISk0A8/2j4M37Np4mcDesJjHgEUfgPhdCyZuFI954tjokaIj/A3NdpFNdEh4Q== node-addon-api@^5.0.0: version "5.1.0" resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-5.1.0.tgz#49da1ca055e109a23d537e9de43c09cca21eb762" integrity sha512-eh0GgfEkpnoWDq+VY8OyvYhFEzBk6jIYbRKdIlyTiAXIVJ8PyBaKb0rp7oDtoddbdoHWhq8wwr+XZ81F1rpNdA== -node-dir@^0.1.17: - version "0.1.17" - resolved "https://registry.yarnpkg.com/node-dir/-/node-dir-0.1.17.tgz#5f5665d93351335caabef8f1c554516cf5f1e4e5" - integrity sha512-tmPX422rYgofd4epzrNoOXiE8XFZYOcCq1vD7MAXCDO+O+zndlA2ztdKKMa+EeuBG5tHETpr4ml4RGgpqDCCAg== - dependencies: - minimatch "^3.0.2" - node-fetch@2.6.7: version "2.6.7" resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.7.tgz#24de9fba827e3b4ae44dc8b20256a379160052ad" @@ -9565,6 +10318,14 @@ node-fetch@2.6.7: dependencies: whatwg-url "^5.0.0" +node-fetch@^1.0.1: + version "1.7.3" + resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-1.7.3.tgz#980f6f72d85211a5347c6b2bc18c5b84c3eb47ef" + integrity sha512-NhZ4CsKx7cYm2vSrBAr2PvFOe6sWDf0UYLRqA6svUYg7+/TSfVAu49jYC4BvQ4Sms9SZgdqGBgroqfDhJdTyKQ== + dependencies: + encoding "^0.1.11" + is-stream "^1.0.1" + node-fetch@^2.2.0, node-fetch@^2.6.0: version "2.7.0" resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.7.0.tgz#d0f0fa6e3e2dc1d27efcd8ad99d550bda94d187d" @@ -9686,6 +10447,13 @@ normalize-package-data@^6.0.0, normalize-package-data@^6.0.1: semver "^7.3.5" validate-npm-package-license "^3.0.4" +normalize-path@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9" + integrity sha512-3pKJwH184Xo/lnH6oyP1q2pMd7HcypqqmRs91/6/i2CGtWwIKGCkOOMTm/zXbgTEWHw1uNpNi/igc3ePOYHb6w== + dependencies: + remove-trailing-separator "^1.0.1" + normalize-path@^3.0.0, normalize-path@~3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" @@ -9776,6 +10544,13 @@ npm-run-all@^4.1.5: shell-quote "^1.6.1" string.prototype.padend "^3.0.0" +npm-run-path@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-2.0.2.tgz#35a9232dfa35d7067b4cb2ddf2357b1871536c5f" + integrity sha512-lJxZYlT4DW/bRUtFh1MQIWqmLwQfAxnqWG4HhEdjMlkrJYnJn0Jrr2u3mgxqaWsdiBc76TYkTG/mhrnYTuzfHw== + dependencies: + path-key "^2.0.0" + npm-run-path@^4.0.0, npm-run-path@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-4.0.1.tgz#b7ecd1e5ed53da8e37a55e1c2269e0b97ed748ea" @@ -9859,16 +10634,25 @@ nwsapi@^2.2.2: "@nx/nx-win32-arm64-msvc" "20.1.0" "@nx/nx-win32-x64-msvc" "20.1.0" -ob1@0.76.9: - version "0.76.9" - resolved "https://registry.yarnpkg.com/ob1/-/ob1-0.76.9.tgz#a493e4b83a0fb39200de639804b5d06eed5599dc" - integrity sha512-g0I/OLnSxf6OrN3QjSew3bTDJCdbZoWxnh8adh1z36alwCuGF1dgDeRA25bTYSakrG5WULSaWJPOdgnf1O/oQw== +ob1@0.59.0: + version "0.59.0" + resolved "https://registry.yarnpkg.com/ob1/-/ob1-0.59.0.tgz#ee103619ef5cb697f2866e3577da6f0ecd565a36" + integrity sha512-opXMTxyWJ9m68ZglCxwo0OPRESIC/iGmKFPXEXzMZqsVIrgoRXOHmoMDkQzz4y3irVjbyPJRAh5pI9fd0MJTFQ== -object-assign@^4.1.1: +object-assign@^4.0.1, object-assign@^4.1.0, object-assign@^4.1.1: version "4.1.1" resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg== +object-copy@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/object-copy/-/object-copy-0.1.0.tgz#7e7d858b781bd7c991a41ba975ed3812754e998c" + integrity sha512-79LYn6VAb63zgtmAteVOWo9Vdj71ZVBy3Pbse+VqxDpEP83XuujMrGqHIwAXJ5I/aM0zU7dIyIAhifVTPrNItQ== + dependencies: + copy-descriptor "^0.1.0" + define-property "^0.2.5" + kind-of "^3.0.3" + object-inspect@^1.12.2, object-inspect@^1.13.1: version "1.13.1" resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.13.1.tgz#b96c6109324ccfef6b12216a956ca4dc2ff94bc2" @@ -9879,6 +10663,13 @@ object-keys@^1.1.1: resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== +object-visit@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/object-visit/-/object-visit-1.0.1.tgz#f79c4493af0c5377b59fe39d395e41042dd045bb" + integrity sha512-GBaMwwAVK9qbQN3Scdo0OyvgPW7l3lnaVMj84uTOZlswkX0KpF6fyDBJhtTthf7pymztoN36/KEr1DyhF96zEA== + dependencies: + isobject "^3.0.0" + object.assign@^4.1.3, object.assign@^4.1.5: version "4.1.5" resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.5.tgz#3a833f9ab7fdb80fc9e8d2300c803d216d8fdbb0" @@ -9926,6 +10717,13 @@ object.hasown@^1.1.2: define-properties "^1.1.4" es-abstract "^1.20.4" +object.pick@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/object.pick/-/object.pick-1.3.0.tgz#87a10ac4c1694bd2e1cbf53591a66141fb5dd747" + integrity sha512-tqa/UMy/CCoYmj+H5qc07qvSL9dqcs/WZENZ1JbtWBlATP+iVOe778gE6MSijnyCnORzDuX6hU+LA4SZ09YjFQ== + dependencies: + isobject "^3.0.1" + object.values@^1.1.6, object.values@^1.1.7: version "1.1.7" resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.1.7.tgz#617ed13272e7e1071b43973aa1655d9291b8442a" @@ -9968,6 +10766,13 @@ one-time@^1.0.0: dependencies: fn.name "1.x.x" +onetime@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/onetime/-/onetime-2.0.1.tgz#067428230fd67443b2794b22bba528b6867962d4" + integrity sha512-oyyPpiMaKARvvcgip+JV+7zci5L8D1W9RZIz2l1o08AM3pfspitVWnPt3mzHcBPp12oYMTy0pqrFs/C+m3EwsQ== + dependencies: + mimic-fn "^1.0.0" + onetime@^5.1.0, onetime@^5.1.2: version "5.1.2" resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e" @@ -10022,6 +10827,11 @@ optionator@^0.9.3: prelude-ls "^1.2.1" type-check "^0.4.0" +options@>=0.0.5: + version "0.0.6" + resolved "https://registry.yarnpkg.com/options/-/options-0.0.6.tgz#ec22d312806bb53e731773e7cdaefcf1c643128f" + integrity sha512-bOj3L1ypm++N+n7CEbbe473A414AB7z+amKYshRb//iuL3MpdDCLhPnw6aVTdKB9g5ZRVHIEp8eUln6L2NUStg== + ora@5.3.0: version "5.3.0" resolved "https://registry.yarnpkg.com/ora/-/ora-5.3.0.tgz#fb832899d3a1372fe71c8b2c534bbfe74961bb6f" @@ -10036,6 +10846,18 @@ ora@5.3.0: strip-ansi "^6.0.0" wcwidth "^1.0.1" +ora@^3.4.0: + version "3.4.0" + resolved "https://registry.yarnpkg.com/ora/-/ora-3.4.0.tgz#bf0752491059a3ef3ed4c85097531de9fdbcd318" + integrity sha512-eNwHudNbO1folBP3JsZ19v9azXWtQZjICdr3Q0TDPIaeBQ3mXLrh54wM+er0+hSp+dWKf+Z8KM58CYzEyIYxYg== + dependencies: + chalk "^2.4.2" + cli-cursor "^2.1.0" + cli-spinners "^2.0.0" + log-symbols "^2.2.0" + strip-ansi "^5.2.0" + wcwidth "^1.0.1" + ora@^5.4.1: version "5.4.1" resolved "https://registry.yarnpkg.com/ora/-/ora-5.4.1.tgz#1b2678426af4ac4a509008e5e4ac9e9959db9e18" @@ -10056,7 +10878,7 @@ os-browserify@^0.3.0: resolved "https://registry.yarnpkg.com/os-browserify/-/os-browserify-0.3.0.tgz#854373c7f5c2315914fc9bfc6bd8238fdda1ec27" integrity sha512-gjcpUc3clBf9+210TRaDWbf+rZZZEshZ+DlXMRCeAjp0xhTrnQsKHypIy1J3d5hKdUzj69t708EHtU8P6bUn0A== -os-tmpdir@~1.0.2: +os-tmpdir@^1.0.0, os-tmpdir@~1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" integrity sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g== @@ -10241,6 +11063,11 @@ parse-ms@^2.1.0: resolved "https://registry.yarnpkg.com/parse-ms/-/parse-ms-2.1.0.tgz#348565a753d4391fa524029956b172cb7753097d" integrity sha512-kHt7kzLoS9VBZfUsiKjv43mr91ea+U05EyKkEtqp7vNbHxmaVuEqN7XxeEVnGrMtYOAxGrDElSi96K7EgO1zCA== +parse-node-version@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/parse-node-version/-/parse-node-version-1.0.1.tgz#e2b5dbede00e7fa9bc363607f53327e8b073189b" + integrity sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA== + parse-path@^7.0.0: version "7.0.0" resolved "https://registry.yarnpkg.com/parse-path/-/parse-path-7.0.0.tgz#605a2d58d0a749c8594405d8cc3a2bf76d16099b" @@ -10267,6 +11094,11 @@ parseurl@~1.3.3: resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4" integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ== +pascalcase@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/pascalcase/-/pascalcase-0.1.1.tgz#b363e55e8006ca6fe21784d2db22bd15d7917f14" + integrity sha512-XHXfu/yOQRy9vYOtUDVMN60OEJjW013GoObG1o+xwQTpB9eYJX/BjXMsdW13ZDPruFhYYn0AG22w0xgQMwl3Nw== + path-exists@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" @@ -10282,7 +11114,7 @@ path-is-absolute@^1.0.0: resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== -path-key@^2.0.1: +path-key@^2.0.0, path-key@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40" integrity sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw== @@ -10479,11 +11311,36 @@ pkg-dir@^4.2.0: dependencies: find-up "^4.0.0" +plist@^3.0.1, plist@^3.0.5: + version "3.1.0" + resolved "https://registry.yarnpkg.com/plist/-/plist-3.1.0.tgz#797a516a93e62f5bde55e0b9cc9c967f860893c9" + integrity sha512-uysumyrvkUX0rX/dEVqt8gC3sTBzd4zoWfLeS29nb53imdaXVvLINYXTI2GNqzaMuvacNx4uJQ8+b3zXR0pkgQ== + dependencies: + "@xmldom/xmldom" "^0.8.8" + base64-js "^1.5.1" + xmlbuilder "^15.1.1" + +plugin-error@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/plugin-error/-/plugin-error-0.1.2.tgz#3b9bb3335ccf00f425e07437e19276967da47ace" + integrity sha512-WzZHcm4+GO34sjFMxQMqZbsz3xiNEgonCskQ9v+IroMmYgk/tas8dG+Hr2D6IbRPybZ12oWpzE/w3cGJ6FJzOw== + dependencies: + ansi-cyan "^0.1.1" + ansi-red "^0.1.1" + arr-diff "^1.0.1" + arr-union "^2.0.1" + extend-shallow "^1.1.2" + pluralize@^8.0.0: version "8.0.0" resolved "https://registry.yarnpkg.com/pluralize/-/pluralize-8.0.0.tgz#1a6fa16a38d12a1901e0320fa017051c539ce3b1" integrity sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA== +posix-character-classes@^0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab" + integrity sha512-xTgYBc3fuo7Yt7JbiuFxSYGToMoz8fLoE6TC9Wx1P/u+LfeThMOAqmuyECnlBaaJb+u1m9hHiXUEtwW4OzfUJg== + possible-typed-array-names@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz#89bb63c6fada2c3e90adc4a647beeeb39cc7bf8f" @@ -10582,15 +11439,25 @@ pretty-bytes@^5.6.0: resolved "https://registry.yarnpkg.com/pretty-bytes/-/pretty-bytes-5.6.0.tgz#356256f643804773c82f64723fe78c92c62beaeb" integrity sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg== -pretty-format@^26.5.2, pretty-format@^26.6.2: - version "26.6.2" - resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-26.6.2.tgz#e35c2705f14cb7fe2fe94fa078345b444120fc93" - integrity sha512-7AeGuCYNGmycyQbCqd/3PWH4eOoX/OiCa0uphp57NVTeAGdJGaAliecxwBDHYQCIvrW7aDBZCYeNTP/WX69mkg== +pretty-format@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-24.9.0.tgz#12fac31b37019a4eea3c11aa9a959eb7628aa7c9" + integrity sha512-00ZMZUiHaJrNfk33guavqgvfJS30sLYf0f8+Srklv0AMPodGGHcoHgksZ3OThYnIvOd+8yMCn0YiEOogjlgsnA== dependencies: - "@jest/types" "^26.6.2" + "@jest/types" "^24.9.0" + ansi-regex "^4.0.0" + ansi-styles "^3.2.0" + react-is "^16.8.4" + +pretty-format@^25.1.0, pretty-format@^25.2.0: + version "25.5.0" + resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-25.5.0.tgz#7873c1d774f682c34b8d48b6743a2bf2ac55791a" + integrity sha512-kbo/kq2LQ/A/is0PQwsEHM7Ca6//bGPPvU6UnsdDRSKTWxT/ru/xb88v4BJf6a69H+uTytOEsTusT9ksd/1iWQ== + dependencies: + "@jest/types" "^25.5.0" ansi-regex "^5.0.0" ansi-styles "^4.0.0" - react-is "^17.0.1" + react-is "^16.12.0" pretty-format@^29.0.0, pretty-format@^29.7.0: version "29.7.0" @@ -10659,14 +11526,21 @@ promise-retry@^2.0.1: err-code "^2.0.2" retry "^0.12.0" -promise@^8.3.0: +promise@^7.1.1: + version "7.3.1" + resolved "https://registry.yarnpkg.com/promise/-/promise-7.3.1.tgz#064b72602b18f90f29192b8b1bc418ffd1ebd3bf" + integrity sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg== + dependencies: + asap "~2.0.3" + +promise@^8.0.3: version "8.3.0" resolved "https://registry.yarnpkg.com/promise/-/promise-8.3.0.tgz#8cb333d1edeb61ef23869fbb8a4ea0279ab60e0a" integrity sha512-rZPNPKTOYVNEEKFaq1HqTgOwZD+4/YHS5ukLzQCypkj+OkYx7iv0mA91lJlpPPZ8vMau3IIGj5Qlwrx+8iiSmg== dependencies: asap "~2.0.6" -prompts@^2.0.1, prompts@^2.4.0: +prompts@^2.0.1: version "2.4.2" resolved "https://registry.yarnpkg.com/prompts/-/prompts-2.4.2.tgz#7b57e73b3a48029ad10ebd44f74b01722a4cb069" integrity sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q== @@ -10746,6 +11620,11 @@ ps-tree@1.2.0: dependencies: event-stream "=3.3.4" +pseudomap@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3" + integrity sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ== + psl@^1.1.33: version "1.9.0" resolved "https://registry.yarnpkg.com/psl/-/psl-1.9.0.tgz#d0df2a137f00794565fcaf3b2c00cd09f8d5a5a7" @@ -10796,13 +11675,6 @@ queue-microtask@^1.2.2: resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== -queue@6.0.2: - version "6.0.2" - resolved "https://registry.yarnpkg.com/queue/-/queue-6.0.2.tgz#b91525283e2315c7553d2efa18d83e76432fed65" - integrity sha512-iHZWu+q3IdFZFX36ro/lKBkSvfkztY5Y7HMiPlOUjhupPcG2JMfst2KKEpu5XndviX/3UhFbRngUPNKtgvtZiA== - dependencies: - inherits "~2.0.3" - quick-lru@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/quick-lru/-/quick-lru-4.0.1.tgz#5b8878f113a58217848c6482026c73e1ba57727f" @@ -10863,7 +11735,7 @@ react-bootstrap@^2.7.0: uncontrollable "^7.2.1" warning "^4.0.3" -react-devtools-core@^4.27.2: +react-devtools-core@^4.6.0: version "4.28.5" resolved "https://registry.yarnpkg.com/react-devtools-core/-/react-devtools-core-4.28.5.tgz#c8442b91f068cdf0c899c543907f7f27d79c2508" integrity sha512-cq/o30z9W2Wb4rzBefjv5fBalHU0rJGZCHAkf/RHSBWSSYwh8PlQTqqOJmgIIbBtpj27T6FIPXeomIjZtCNVqA== @@ -10900,21 +11772,11 @@ react-hook-form@^8.0.0-alpha.4: resolved "https://registry.yarnpkg.com/react-hook-form/-/react-hook-form-8.0.0-alpha.4.tgz#b5c41db3ce4cc74c7190d10ff9bbe9e1c2c3536d" integrity sha512-r2PCeSdG+vguXNScBYx2nQoo8xXf34WCXTx5AR+sfcRRzLJ4DAUUghEIbg2KMS32RZ4Nl9678VilHLC4Jq0tFQ== -"react-is@^16.12.0 || ^17.0.0 || ^18.0.0": - version "18.3.1" - resolved "https://registry.yarnpkg.com/react-is/-/react-is-18.3.1.tgz#e83557dc12eae63a99e003a46388b1dcbb44db7e" - integrity sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg== - -react-is@^16.13.1, react-is@^16.3.2, react-is@^16.7.0: +react-is@^16.12.0, react-is@^16.13.1, react-is@^16.3.2, react-is@^16.7.0, react-is@^16.8.4: version "16.13.1" resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4" integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== -react-is@^17.0.1: - version "17.0.2" - resolved "https://registry.yarnpkg.com/react-is/-/react-is-17.0.2.tgz#e691d4a8e9c789365655539ab372762b0efb54f0" - integrity sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w== - react-is@^18.0.0: version "18.2.0" resolved "https://registry.yarnpkg.com/react-is/-/react-is-18.2.0.tgz#199431eeaaa2e09f86427efbb4f1473edb47609b" @@ -10925,48 +11787,38 @@ react-lifecycles-compat@^3.0.4: resolved "https://registry.yarnpkg.com/react-lifecycles-compat/-/react-lifecycles-compat-3.0.4.tgz#4f1a273afdfc8f3488a8c516bfda78f872352362" integrity sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA== -react-native@^0.72.13: - version "0.72.17" - resolved "https://registry.yarnpkg.com/react-native/-/react-native-0.72.17.tgz#54d6de38adf6e56fdde1a6b83ef9b138abae7384" - integrity sha512-k3dNe0XqoYCGGWTenbupWSj+ljW3GIfmYS5P4s3if4j0csx2YbenKgH1aJNWLp+UP7ONwfId6G+uBoUJfyMxXg== - dependencies: - "@jest/create-cache-key-function" "^29.2.1" - "@react-native-community/cli" "^11.4.1" - "@react-native-community/cli-platform-android" "^11.4.1" - "@react-native-community/cli-platform-ios" "^11.4.1" - "@react-native/assets-registry" "^0.72.0" - "@react-native/codegen" "^0.72.8" - "@react-native/gradle-plugin" "^0.72.11" - "@react-native/js-polyfills" "^0.72.1" - "@react-native/normalize-colors" "^0.72.0" - "@react-native/virtualized-lists" "^0.72.8" +react-native@^0.63.0: + version "0.63.5" + resolved "https://registry.yarnpkg.com/react-native/-/react-native-0.63.5.tgz#2c0d5dca527fb69bb481e89b2c86068f2641b62d" + integrity sha512-unjHZOcHek2xxPkBbyqGO//2Z/AriKTwtDzGTT/ujGMRE3odDJk8wKtZregurQ9cpTUtu1Bj5R5bJv3gQIG5zw== + dependencies: + "@babel/runtime" "^7.0.0" + "@react-native-community/cli" "^4.10.0" + "@react-native-community/cli-platform-android" "^4.10.0" + "@react-native-community/cli-platform-ios" "^4.10.0" abort-controller "^3.0.0" anser "^1.4.9" - ansi-regex "^5.0.0" base64-js "^1.1.2" - deprecated-react-native-prop-types "^4.2.3" event-target-shim "^5.0.1" - flow-enums-runtime "^0.0.5" + fbjs "^1.0.0" + fbjs-scripts "^1.1.0" + hermes-engine "~0.5.0" invariant "^2.2.4" - jest-environment-node "^29.2.1" - jsc-android "^250231.0.0" - memoize-one "^5.0.0" - metro-runtime "^0.76.9" - metro-source-map "^0.76.9" - mkdirp "^0.5.1" + jsc-android "^245459.0.0" + metro-babel-register "0.59.0" + metro-react-native-babel-transformer "0.59.0" + metro-source-map "0.59.0" nullthrows "^1.1.1" - pretty-format "^26.5.2" - promise "^8.3.0" - react-devtools-core "^4.27.2" + pretty-format "^24.9.0" + promise "^8.0.3" + prop-types "^15.7.2" + react-devtools-core "^4.6.0" react-refresh "^0.4.0" - react-shallow-renderer "^16.15.0" regenerator-runtime "^0.13.2" - scheduler "0.24.0-canary-efb381bbf-20230505" - stacktrace-parser "^0.1.10" - use-sync-external-store "^1.0.0" + scheduler "0.19.1" + stacktrace-parser "^0.1.3" + use-subscription "^1.0.0" whatwg-fetch "^3.0.0" - ws "^6.2.2" - yargs "^17.6.2" react-redux@^8.0.5: version "8.1.3" @@ -11012,14 +11864,6 @@ react-router@6.23.0: dependencies: "@remix-run/router" "1.16.0" -react-shallow-renderer@^16.15.0: - version "16.15.0" - resolved "https://registry.yarnpkg.com/react-shallow-renderer/-/react-shallow-renderer-16.15.0.tgz#48fb2cf9b23d23cde96708fe5273a7d3446f4457" - integrity sha512-oScf2FqQ9LFVQgA73vr86xl2NaOIX73rh+YFqcOp68CWj56tSfgtGKrEbyhCj0rSijyG9M1CYprTh39fBi5hzA== - dependencies: - object-assign "^4.1.1" - react-is "^16.12.0 || ^17.0.0 || ^18.0.0" - react-transition-group@^4.4.5: version "4.4.5" resolved "https://registry.yarnpkg.com/react-transition-group/-/react-transition-group-4.4.5.tgz#e53d4e3f3344da8521489fbef8f2581d42becdd1" @@ -11101,16 +11945,7 @@ read@^3.0.1: dependencies: mute-stream "^1.0.0" -readable-stream@^3.0.0, readable-stream@^3.0.2, readable-stream@^3.1.1, readable-stream@^3.4.0, readable-stream@^3.6.0: - version "3.6.2" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.2.tgz#56a9b36ea965c00c5a93ef31eb111a0f11056967" - integrity sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA== - dependencies: - inherits "^2.0.3" - string_decoder "^1.1.1" - util-deprecate "^1.0.1" - -readable-stream@~2.3.6: +readable-stream@^2.0.1, readable-stream@^2.2.2, readable-stream@~2.3.6: version "2.3.8" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.8.tgz#91125e8042bba1b9887f49345f6277027ce8be9b" integrity sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA== @@ -11123,6 +11958,15 @@ readable-stream@~2.3.6: string_decoder "~1.1.1" util-deprecate "~1.0.1" +readable-stream@^3.0.0, readable-stream@^3.0.2, readable-stream@^3.1.1, readable-stream@^3.4.0, readable-stream@^3.6.0: + version "3.6.2" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.2.tgz#56a9b36ea965c00c5a93ef31eb111a0f11056967" + integrity sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA== + dependencies: + inherits "^2.0.3" + string_decoder "^1.1.1" + util-deprecate "^1.0.1" + readdirp@~3.6.0: version "3.6.0" resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7" @@ -11130,21 +11974,6 @@ readdirp@~3.6.0: dependencies: picomatch "^2.2.1" -readline@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/readline/-/readline-1.3.0.tgz#c580d77ef2cfc8752b132498060dc9793a7ac01c" - integrity sha512-k2d6ACCkiNYz222Fs/iNze30rRJ1iIicW7JuX/7/cozvih6YCkFZH+J6mAFDVgv0dRBaAyr4jDqC95R2y4IADg== - -recast@^0.21.0: - version "0.21.5" - resolved "https://registry.yarnpkg.com/recast/-/recast-0.21.5.tgz#e8cd22bb51bcd6130e54f87955d33a2b2e57b495" - integrity sha512-hjMmLaUXAm1hIuTqOdeYObMslq/q+Xff6QE3Y2P+uoHAg2nmVlLBps2hzh1UJDdMtDTMXOFewK6ky51JQIeECg== - dependencies: - ast-types "0.15.2" - esprima "~4.0.0" - source-map "~0.6.1" - tslib "^2.0.1" - redent@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/redent/-/redent-3.0.0.tgz#e557b7998316bb53c9f1f56fa626352c6963059f" @@ -11211,6 +12040,21 @@ regenerator-runtime@^0.14.0: resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.14.0.tgz#5e19d68eb12d486f797e15a3c6a918f7cec5eb45" integrity sha512-srw17NI0TUWHuGa5CFGGmhfNIeja30WMBfbslPNhf6JrqQlLN5gcrvig1oqPxiVaXb0oW0XRKtH6Nngs5lKCIA== +regenerator-transform@^0.15.2: + version "0.15.2" + resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.15.2.tgz#5bbae58b522098ebdf09bca2f83838929001c7a4" + integrity sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg== + dependencies: + "@babel/runtime" "^7.8.4" + +regex-not@^1.0.0, regex-not@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/regex-not/-/regex-not-1.0.2.tgz#1f4ece27e00b0b65e0247a6810e6a85d83a5752c" + integrity sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A== + dependencies: + extend-shallow "^3.0.2" + safe-regex "^1.1.0" + regexp.prototype.flags@^1.4.3, regexp.prototype.flags@^1.5.2: version "1.5.2" resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.5.2.tgz#138f644a3350f981a858c44f6bb1a61ff59be334" @@ -11245,6 +12089,21 @@ regjsparser@^0.12.0: dependencies: jsesc "~3.0.2" +remove-trailing-separator@^1.0.1: + version "1.1.0" + resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz#c24bce2a283adad5bc3f58e0d48249b92379d8ef" + integrity sha512-/hS+Y0u3aOfIETiaiirUFwDBDzmXPvO+jAfKTitUngIPzdKc6Z0LoFjM/CK5PL4C+eKwHohlHAb6H0VFfmmUsw== + +repeat-element@^1.1.2: + version "1.1.4" + resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.4.tgz#be681520847ab58c7568ac75fbfad28ed42d39e9" + integrity sha512-LFiNfRcSu7KK3evMyYOuCzv3L10TW7yC1G2/+StMjK8Y6Vqd2MG7r/Qjw4ghtuCOjFvlnms/iMmLqpvW/ES/WQ== + +repeat-string@^1.6.1: + version "1.6.1" + resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" + integrity sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w== + request-progress@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/request-progress/-/request-progress-3.0.0.tgz#4ca754081c7fec63f505e4faa825aa06cd669dbe" @@ -11321,6 +12180,11 @@ resolve-from@^4.0.0: resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== +resolve-url@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a" + integrity sha512-ZuF55hVUQaaczgOIwqWzkEcEidmlD/xl44x1UZnhOXcYuFN2S6+rcxpG+C1N3So0wvNI3DmJICUFfu2SxhBmvg== + resolve.exports@^2.0.0: version "2.0.2" resolved "https://registry.yarnpkg.com/resolve.exports/-/resolve.exports-2.0.2.tgz#f8c934b8e6a13f539e38b7098e2e36134f01e800" @@ -11335,7 +12199,7 @@ resolve@^1.10.0, resolve@^1.20.0, resolve@^1.22.1, resolve@^1.22.3, resolve@^1.2 path-parse "^1.0.7" supports-preserve-symlinks-flag "^1.0.0" -resolve@^1.14.2: +resolve@^1.14.2, resolve@^1.5.0: version "1.22.10" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.10.tgz#b663e83ffb09bbf2386944736baae803029b8b39" integrity sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w== @@ -11353,6 +12217,14 @@ resolve@^2.0.0-next.4: path-parse "^1.0.7" supports-preserve-symlinks-flag "^1.0.0" +restore-cursor@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-2.0.0.tgz#9f7ee287f82fd326d4fd162923d62129eee0dfaf" + integrity sha512-6IzJLuGi4+R14vwagDHX+JrXmPVtPpn4mffDJ1UdR7/Edm87fl6yi8mMBIVvFtJaNTUvjughmW4hwLhRG7gC1Q== + dependencies: + onetime "^2.0.0" + signal-exit "^3.0.2" + restore-cursor@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-3.1.0.tgz#39f67c54b3a7a58cea5236d95cf0034239631f7e" @@ -11361,6 +12233,11 @@ restore-cursor@^3.1.0: onetime "^5.1.0" signal-exit "^3.0.2" +ret@~0.1.10: + version "0.1.15" + resolved "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc" + integrity sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg== + retry-as-promised@^7.0.4: version "7.0.4" resolved "https://registry.yarnpkg.com/retry-as-promised/-/retry-as-promised-7.0.4.tgz#9df73adaeea08cb2948b9d34990549dc13d800a2" @@ -11381,6 +12258,13 @@ rfdc@^1.3.0: resolved "https://registry.yarnpkg.com/rfdc/-/rfdc-1.3.0.tgz#d0b7c441ab2720d05dc4cf26e01c89631d9da08b" integrity sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA== +rimraf@^2.5.4: + version "2.7.1" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec" + integrity sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w== + dependencies: + glob "^7.1.3" + rimraf@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" @@ -11403,12 +12287,10 @@ rimraf@^6.0.1: glob "^11.0.0" package-json-from-dist "^1.0.0" -rimraf@~2.6.2: - version "2.6.3" - resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.3.tgz#b2d104fe0d8fb27cf9e0a1cda8262dd3833c6cab" - integrity sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA== - dependencies: - glob "^7.1.3" +rimraf@~2.2.6: + version "2.2.8" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.2.8.tgz#e439be2aaee327321952730f99a8929e4fc50582" + integrity sha512-R5KMKHnPAQaZMqLOsyuyUmcIjSeDm+73eoqQpaXA7AZ22BL+6C+1mcUscgOsNd8WVlJuvlgAPsegcx7pjlV0Dg== rollup@^3.27.1: version "3.29.5" @@ -11442,7 +12324,12 @@ rollup@^4.0.2: "@rollup/rollup-win32-x64-msvc" "4.23.0" fsevents "~2.3.2" -run-async@^2.4.0: +rsvp@^4.8.4: + version "4.8.5" + resolved "https://registry.yarnpkg.com/rsvp/-/rsvp-4.8.5.tgz#c8f155311d167f68f21e168df71ec5b083113734" + integrity sha512-nfMOlASu9OnRJo1mbEk2cz0D56a1MBNrJ7orjRZQG10XDyuvwksKbuXNp6qa+kbn839HwjwhBzhFmdsaEAfauA== + +run-async@^2.2.0, run-async@^2.4.0: version "2.4.1" resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.4.1.tgz#8440eccf99ea3e70bd409d49aab88e10c189a455" integrity sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ== @@ -11464,6 +12351,18 @@ run-parallel@^1.1.9: dependencies: queue-microtask "^1.2.2" +rx-lite-aggregates@^4.0.8: + version "4.0.8" + resolved "https://registry.yarnpkg.com/rx-lite-aggregates/-/rx-lite-aggregates-4.0.8.tgz#753b87a89a11c95467c4ac1626c4efc4e05c67be" + integrity sha512-3xPNZGW93oCjiO7PtKxRK6iOVYBWBvtf9QHDfU23Oc+dLIQmAV//UnyXV/yihv81VS/UqoQPk4NegS8EFi55Hg== + dependencies: + rx-lite "*" + +rx-lite@*, rx-lite@^4.0.8: + version "4.0.8" + resolved "https://registry.yarnpkg.com/rx-lite/-/rx-lite-4.0.8.tgz#0b1e11af8bc44836f04a6407e92da42467b79444" + integrity sha512-Cun9QucwK6MIrp3mry/Y7hqD1oFqTYLQ4pGxaHTjIdaFDWRGGLikqp6u8LcWJnzpoALg9hap+JGk8sFIUuEGNA== + rxjs@^7.5.1, rxjs@^7.5.5, rxjs@^7.5.7, rxjs@^7.8.1: version "7.8.1" resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-7.8.1.tgz#6f6f3d99ea8044291efd92e7c7fcf562c4057543" @@ -11500,6 +12399,13 @@ safe-regex-test@^1.0.3: es-errors "^1.3.0" is-regex "^1.1.4" +safe-regex@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/safe-regex/-/safe-regex-1.1.0.tgz#40a3669f3b077d1e943d44629e157dd48023bf2e" + integrity sha512-aJXcif4xnaNUzvUuC5gcb46oTS7zvg4jpMTnuqtrEPlR3vFr4pxtdTwaF1Qs3Enjn9HK+ZlwQui+a7z0SywIzg== + dependencies: + ret "~0.1.10" + safe-stable-stringify@^2.3.1: version "2.4.2" resolved "https://registry.yarnpkg.com/safe-stable-stringify/-/safe-stable-stringify-2.4.2.tgz#ec7b037768098bf65310d1d64370de0dc02353aa" @@ -11510,6 +12416,21 @@ safe-stable-stringify@^2.3.1: resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== +sane@^4.0.3: + version "4.1.0" + resolved "https://registry.yarnpkg.com/sane/-/sane-4.1.0.tgz#ed881fd922733a6c461bc189dc2b6c006f3ffded" + integrity sha512-hhbzAgTIX8O7SHfp2c8/kREfEn4qO/9q8C9beyY6+tvZ87EpoZ3i1RIEvp27YBswnNbY9mWd6paKVmKbAgLfZA== + dependencies: + "@cnakazawa/watch" "^1.0.3" + anymatch "^2.0.0" + capture-exit "^2.0.0" + exec-sh "^0.3.2" + execa "^1.0.0" + fb-watchman "^2.0.0" + micromatch "^3.1.4" + minimist "^1.1.1" + walker "~1.0.5" + sass-lookup@^5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/sass-lookup/-/sass-lookup-5.0.1.tgz#1f01d7ff21e09d8c9dcf8d05b3fca28f2f96e6ed" @@ -11526,6 +12447,11 @@ sass@^1.57.1: immutable "^4.0.0" source-map-js ">=0.6.2 <2.0.0" +sax@^1.2.4: + version "1.4.1" + resolved "https://registry.yarnpkg.com/sax/-/sax-1.4.1.tgz#44cc8988377f126304d3b3fc1010c733b929ef0f" + integrity sha512-+aWOz7yVScEGoKNd4PA10LZ8sk0A/z5+nXQG5giUO5rprX9jgYsTdov9qCchZiPIZezbZH+jRut8nPodFAX4Jg== + saxes@^6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/saxes/-/saxes-6.0.0.tgz#fe5b4a4768df4f14a201b1ba6a65c1f3d9988cc5" @@ -11533,12 +12459,13 @@ saxes@^6.0.0: dependencies: xmlchars "^2.2.0" -scheduler@0.24.0-canary-efb381bbf-20230505: - version "0.24.0-canary-efb381bbf-20230505" - resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.24.0-canary-efb381bbf-20230505.tgz#5dddc60e29f91cd7f8b983d7ce4a99c2202d178f" - integrity sha512-ABvovCDe/k9IluqSh4/ISoq8tIJnW8euVAWYt5j/bg6dRnqwQwiGO1F/V4AyK96NGF/FB04FhOUDuWj8IKfABA== +scheduler@0.19.1: + version "0.19.1" + resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.19.1.tgz#4f3e2ed2c1a7d65681f4c854fa8c5a1ccb40f196" + integrity sha512-n/zwRWRYSUj0/3g/otKDRPMh6qv2SYMWNq85IEa8iZyAv8od9zDYpGSnpBEjNgcMNq6Scbu5KfIPxNF72R/2EA== dependencies: loose-envify "^1.1.0" + object-assign "^4.1.1" scheduler@^0.23.0: version "0.23.0" @@ -11547,7 +12474,7 @@ scheduler@^0.23.0: dependencies: loose-envify "^1.1.0" -"semver@2 || 3 || 4 || 5", semver@^5.5.0, semver@^5.6.0: +"semver@2 || 3 || 4 || 5", semver@^5.1.0, semver@^5.5.0, semver@^5.6.0: version "5.7.2" resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.2.tgz#48d55db737c3287cd4835e17fa13feace1c41ef8" integrity sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g== @@ -11647,6 +12574,18 @@ set-function-length@^1.2.1: gopd "^1.0.1" has-property-descriptors "^1.0.1" +set-function-length@^1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/set-function-length/-/set-function-length-1.2.2.tgz#aac72314198eaed975cf77b2c3b6b880695e5449" + integrity sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg== + dependencies: + define-data-property "^1.1.4" + es-errors "^1.3.0" + function-bind "^1.1.2" + get-intrinsic "^1.2.4" + gopd "^1.0.1" + has-property-descriptors "^1.0.2" + set-function-name@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/set-function-name/-/set-function-name-2.0.1.tgz#12ce38b7954310b9f61faa12701620a0c882793a" @@ -11656,6 +12595,21 @@ set-function-name@^2.0.1: functions-have-names "^1.2.3" has-property-descriptors "^1.0.0" +set-value@^2.0.0, set-value@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/set-value/-/set-value-2.0.1.tgz#a18d40530e6f07de4228c7defe4227af8cad005b" + integrity sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw== + dependencies: + extend-shallow "^2.0.1" + is-extendable "^0.1.1" + is-plain-object "^2.0.3" + split-string "^3.0.1" + +setimmediate@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285" + integrity sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA== + setprototypeof@1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.2.0.tgz#66c9a24a73f9fc28cbe66b09fed3d33dcaf1b424" @@ -11697,16 +12651,21 @@ shebang-regex@^3.0.0: resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== +shell-quote@1.6.1: + version "1.6.1" + resolved "https://registry.yarnpkg.com/shell-quote/-/shell-quote-1.6.1.tgz#f4781949cce402697127430ea3b3c5476f481767" + integrity sha512-V0iQEZ/uoem3NmD91rD8XiuozJnq9/ZJnbHVXHnWqP1ucAhS3yJ7sLIIzEi57wFFcK3oi3kFUC46uSyWr35mxg== + dependencies: + array-filter "~0.0.0" + array-map "~0.0.0" + array-reduce "~0.0.0" + jsonify "~0.0.0" + shell-quote@^1.6.1: version "1.7.4" resolved "https://registry.yarnpkg.com/shell-quote/-/shell-quote-1.7.4.tgz#33fe15dee71ab2a81fcbd3a52106c5cfb9fb75d8" integrity sha512-8o/QEhSSRb1a5i7TFR0iM4G16Z0vYB2OQVs4G3aAFXjn3T6yEx8AZxy1PgDF7I00LZHYA3WxaSYIf5e5sAX8Rw== -shell-quote@^1.7.3: - version "1.8.2" - resolved "https://registry.yarnpkg.com/shell-quote/-/shell-quote-1.8.2.tgz#d2d83e057959d53ec261311e9e9b8f51dcb2934a" - integrity sha512-AzqKpGKjrj7EM6rKVQEPpB288oCfnrEIuyoT9cyF4nmGa7V8Zk6f7RRqYisX8X9m+Q7bd632aZW4ky7EhbQztA== - shimmer@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/shimmer/-/shimmer-1.2.1.tgz#610859f7de327b587efebf501fb43117f9aff337" @@ -11744,6 +12703,15 @@ sigstore@^2.2.0: "@sigstore/tuf" "^2.3.4" "@sigstore/verify" "^1.2.1" +simple-plist@^1.0.0: + version "1.3.1" + resolved "https://registry.yarnpkg.com/simple-plist/-/simple-plist-1.3.1.tgz#16e1d8f62c6c9b691b8383127663d834112fb017" + integrity sha512-iMSw5i0XseMnrhtIzRb7XpQEXepa9xhWxGUojHBL43SIpQuDQkh3Wpy67ZbDzZVr6EKxvwVChnVpdl8hEVLDiw== + dependencies: + bplist-creator "0.1.0" + bplist-parser "0.3.1" + plist "^3.0.5" + simple-swizzle@^0.2.2: version "0.2.2" resolved "https://registry.yarnpkg.com/simple-swizzle/-/simple-swizzle-0.2.2.tgz#a4da6b635ffcccca33f70d17cb92592de95e557a" @@ -11768,6 +12736,11 @@ slash@3.0.0, slash@^3.0.0: resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== +slash@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/slash/-/slash-2.0.0.tgz#de552851a1759df3a8f206535442f5ec4ddeab44" + integrity sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A== + slice-ansi@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-2.1.0.tgz#cacd7693461a637a5788d92a7dd4fba068e81636" @@ -11818,6 +12791,36 @@ smol-toml@~1.3.0: resolved "https://registry.yarnpkg.com/smol-toml/-/smol-toml-1.3.1.tgz#d9084a9e212142e3cab27ef4e2b8e8ba620bfe15" integrity sha512-tEYNll18pPKHroYSmLLrksq233j021G0giwW7P3D24jC54pQ5W5BXMsQ/Mvw1OJCmEYDgY+lrzT+3nNUtoNfXQ== +snapdragon-node@^2.0.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/snapdragon-node/-/snapdragon-node-2.1.1.tgz#6c175f86ff14bdb0724563e8f3c1b021a286853b" + integrity sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw== + dependencies: + define-property "^1.0.0" + isobject "^3.0.0" + snapdragon-util "^3.0.1" + +snapdragon-util@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/snapdragon-util/-/snapdragon-util-3.0.1.tgz#f956479486f2acd79700693f6f7b805e45ab56e2" + integrity sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ== + dependencies: + kind-of "^3.2.0" + +snapdragon@^0.8.1: + version "0.8.2" + resolved "https://registry.yarnpkg.com/snapdragon/-/snapdragon-0.8.2.tgz#64922e7c565b0e14204ba1aa7d6964278d25182d" + integrity sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg== + dependencies: + base "^0.11.1" + debug "^2.2.0" + define-property "^0.2.5" + extend-shallow "^2.0.1" + map-cache "^0.2.2" + source-map "^0.5.6" + source-map-resolve "^0.5.0" + use "^3.1.0" + socks-proxy-agent@^8.0.3: version "8.0.4" resolved "https://registry.yarnpkg.com/socks-proxy-agent/-/socks-proxy-agent-8.0.4.tgz#9071dca17af95f483300316f4b063578fa0db08c" @@ -11847,6 +12850,17 @@ sort-keys@^2.0.0: resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.2.0.tgz#16b809c162517b5b8c3e7dcd315a2a5c2612b2af" integrity sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg== +source-map-resolve@^0.5.0: + version "0.5.3" + resolved "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.5.3.tgz#190866bece7553e1f8f267a2ee82c606b5509a1a" + integrity sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw== + dependencies: + atob "^2.1.2" + decode-uri-component "^0.2.0" + resolve-url "^0.2.1" + source-map-url "^0.4.0" + urix "^0.1.0" + source-map-support@0.5.13: version "0.5.13" resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.13.tgz#31b24a9c2e73c2de85066c0feb7d44767ed52932" @@ -11863,6 +12877,11 @@ source-map-support@^0.5.16, source-map-support@~0.5.20: buffer-from "^1.0.0" source-map "^0.6.0" +source-map-url@^0.4.0: + version "0.4.1" + resolved "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.4.1.tgz#0af66605a745a5a2f91cf1bbf8a7afbc283dec56" + integrity sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw== + source-map@^0.5.6: version "0.5.7" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" @@ -11904,6 +12923,13 @@ spdx-license-ids@^3.0.0: resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.12.tgz#69077835abe2710b65f03969898b6637b505a779" integrity sha512-rr+VVSXtRhO4OHbXUiAF7xW3Bo9DuuF6C5jH+q/x15j2jniycgKbxU09Hr0WqlSLUs4i4ltHGXqTe7VHclYWyA== +split-string@^3.0.1, split-string@^3.0.2: + version "3.1.0" + resolved "https://registry.yarnpkg.com/split-string/-/split-string-3.1.0.tgz#7cb09dda3a86585705c64b39a6466038682e8fe2" + integrity sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw== + dependencies: + extend-shallow "^3.0.0" + split2@^3.2.2: version "3.2.2" resolved "https://registry.yarnpkg.com/split2/-/split2-3.2.2.tgz#bf2cf2a37d838312c249c89206fd7a17dd12365f" @@ -11967,6 +12993,13 @@ stack-trace@0.0.x: resolved "https://registry.yarnpkg.com/stack-trace/-/stack-trace-0.0.10.tgz#547c70b347e8d32b4e108ea1a2a159e5fdde19c0" integrity sha512-KGzahc7puUKkzyMt+IqAep+TVNbKP+k2Lmwhub39m1AsTSkaDutx56aDCo+HLDzf/D26BIHTJWNiTG1KAJiQCg== +stack-utils@^1.0.1: + version "1.0.5" + resolved "https://registry.yarnpkg.com/stack-utils/-/stack-utils-1.0.5.tgz#a19b0b01947e0029c8e451d5d61a498f5bb1471b" + integrity sha512-KZiTzuV3CnSnSvgMRrARVCj+Ht7rMbauGDK0LdVFRGyenwdylpajAp4Q0i6SX8rEmbTpMMf6ryq2gb8pPq2WgQ== + dependencies: + escape-string-regexp "^2.0.0" + stack-utils@^2.0.3: version "2.0.6" resolved "https://registry.yarnpkg.com/stack-utils/-/stack-utils-2.0.6.tgz#aaf0748169c02fc33c8232abccf933f54a1cc34f" @@ -11979,7 +13012,7 @@ stackframe@^1.3.4: resolved "https://registry.yarnpkg.com/stackframe/-/stackframe-1.3.4.tgz#b881a004c8c149a5e8efef37d51b16e412943310" integrity sha512-oeVtt7eWQS+Na6F//S4kJ2K2VbRlS9D43mAlMyVpVWovy9o+jfgH8O9agzANzaiLjclA0oYzUXEM4PurhSUChw== -stacktrace-parser@^0.1.10: +stacktrace-parser@^0.1.3: version "0.1.10" resolved "https://registry.yarnpkg.com/stacktrace-parser/-/stacktrace-parser-0.1.10.tgz#29fb0cae4e0d0b85155879402857a1639eb6051a" integrity sha512-KJP1OCML99+8fhOHxwwzyWrlUuVX5GQ0ZpJTd1DFXhdkrvg1szxfHhawXUZ3g9TkXORQd4/WG68jMlQZ2p8wlg== @@ -12000,6 +13033,14 @@ start-server-and-test@^2.0.1: ps-tree "1.2.0" wait-on "8.0.1" +static-extend@^0.1.1: + version "0.1.2" + resolved "https://registry.yarnpkg.com/static-extend/-/static-extend-0.1.2.tgz#60809c39cbff55337226fd5e0b520f341f1fb5c6" + integrity sha512-72E9+uLc27Mt718pMHt9VMNiAL4LMsmDbBva8mxWUCkT07fSzEGMYUCk0XWY6lp0j6RBAG4cJ3mWuZv2OE3s0g== + dependencies: + define-property "^0.2.5" + object-copy "^0.1.0" + statuses@2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/statuses/-/statuses-2.0.1.tgz#55cb000ccf1d48728bd23c685a063998cf1a1b63" @@ -12010,6 +13051,11 @@ statuses@~1.5.0: resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c" integrity sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA== +stream-buffers@2.2.x: + version "2.2.0" + resolved "https://registry.yarnpkg.com/stream-buffers/-/stream-buffers-2.2.0.tgz#91d5f5130d1cef96dcfa7f726945188741d09ee4" + integrity sha512-uyQK/mx5QjHun80FLJTfaWE7JtwfRMKBLkMne6udYOmvH0CawotVa7TfgYHzAnpphn4+TweIx1QKMnRIbipmUg== + stream-combiner@~0.0.4: version "0.0.4" resolved "https://registry.yarnpkg.com/stream-combiner/-/stream-combiner-0.0.4.tgz#4d5e433c185261dde623ca3f44c586bcf5c4ad14" @@ -12046,6 +13092,23 @@ string-length@^4.0.1: is-fullwidth-code-point "^3.0.0" strip-ansi "^6.0.1" +string-width@^2.1.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" + integrity sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw== + dependencies: + is-fullwidth-code-point "^2.0.0" + strip-ansi "^4.0.0" + +string-width@^3.0.0, string-width@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-3.1.0.tgz#22767be21b62af1081574306f69ac51b62203961" + integrity sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w== + dependencies: + emoji-regex "^7.0.1" + is-fullwidth-code-point "^2.0.0" + strip-ansi "^5.1.0" + string-width@^5.0.0, string-width@^5.0.1, string-width@^5.1.2: version "5.1.2" resolved "https://registry.yarnpkg.com/string-width/-/string-width-5.1.2.tgz#14f8daec6d81e7221d2a357e668cab73bdbca794" @@ -12135,7 +13198,14 @@ stringify-object@^3.2.1: dependencies: ansi-regex "^5.0.1" -strip-ansi@^5.0.0, strip-ansi@^5.2.0: +strip-ansi@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f" + integrity sha512-4XaJ2zQdCzROZDivEVIDPkcQn8LMFSa8kj8Gxb/Lnwzv9A8VctNZ+lfivC/sV3ivW8ElJTERXZoPBRrZKkNKow== + dependencies: + ansi-regex "^3.0.0" + +strip-ansi@^5.0.0, strip-ansi@^5.1.0, strip-ansi@^5.2.0: version "5.2.0" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-5.2.0.tgz#8c9a536feb6afc962bdfa5b104a5091c1ad9c0ae" integrity sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA== @@ -12159,6 +13229,11 @@ strip-bom@^4.0.0: resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-4.0.0.tgz#9c3505c1db45bcedca3d9cf7a16f5c5aa3901878" integrity sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w== +strip-eof@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf" + integrity sha512-7FCwGGmx8mD5xQd3RPUvnSpUXHM3BWuzjtpD4TXsfcZ9EL4azvVVUscFYwD9nx8Kh+uCBC00XBtAykoMHwTh8Q== + strip-final-newline@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz#89b852fb2fcbe936f6f4b3187afb0a12c1ab58ad" @@ -12186,11 +13261,6 @@ strip-json-comments@~2.0.1: resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" integrity sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ== -strnum@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/strnum/-/strnum-1.0.5.tgz#5c4e829fe15ad4ff0d20c3db5ac97b73c9b072db" - integrity sha512-J8bbNyKKXl5qYcR36TIO8W3mVGVHrmmxsd5PAItGkmyzwJvybiw2IVq5nqd0i4LSNSkB/sx9VHllbfFdr9k1JA== - strong-log-transformer@2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/strong-log-transformer/-/strong-log-transformer-2.1.0.tgz#0f5ed78d325e0421ac6f90f7f10e691d6ae3ae10" @@ -12219,6 +13289,13 @@ supports-color@^5.3.0, supports-color@^5.5.0: dependencies: has-flag "^3.0.0" +supports-color@^6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-6.1.0.tgz#0764abc69c63d5ac842dd4867e8d025e880df8f3" + integrity sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ== + dependencies: + has-flag "^3.0.0" + supports-color@^7.1.0: version "7.2.0" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" @@ -12291,22 +13368,13 @@ temp-dir@1.0.0: resolved "https://registry.yarnpkg.com/temp-dir/-/temp-dir-1.0.0.tgz#0a7c0ea26d3a39afa7e0ebea9c1fc0bc4daa011d" integrity sha512-xZFXEGbG7SNC3itwBzI3RYjq/cEhBkx2hJuKGIUOcEULmkQExXiHat2z/qkISYsuR+IKumhEfKKbV5qXmhICFQ== -temp@^0.8.4: - version "0.8.4" - resolved "https://registry.yarnpkg.com/temp/-/temp-0.8.4.tgz#8c97a33a4770072e0a05f919396c7665a7dd59f2" - integrity sha512-s0ZZzd0BzYv5tLSptZooSjK8oj6C+c19p7Vqta9+6NPOf7r+fxq0cJe6/oN4LTC79sy5NY8ucOJNgwsKCSbfqg== - dependencies: - rimraf "~2.6.2" - -terser@^5.15.0: - version "5.37.0" - resolved "https://registry.yarnpkg.com/terser/-/terser-5.37.0.tgz#38aa66d1cfc43d0638fab54e43ff8a4f72a21ba3" - integrity sha512-B8wRRkmre4ERucLM/uXx4MOV5cbnOlVAqUst+1+iLKPI0dOgFO28f84ptoQt9HEI537PMzfYa/d+GEPKTRXmYA== +temp@0.8.3: + version "0.8.3" + resolved "https://registry.yarnpkg.com/temp/-/temp-0.8.3.tgz#e0c6bc4d26b903124410e4fed81103014dfc1f59" + integrity sha512-jtnWJs6B1cZlHs9wPG7BrowKxZw/rf6+UpGAkr8AaYmiTyTO7zQlLoST8zx/8TcUPnZmeBoB+H8ARuHZaSijVw== dependencies: - "@jridgewell/source-map" "^0.3.3" - acorn "^8.8.2" - commander "^2.20.0" - source-map-support "~0.5.20" + os-tmpdir "^1.0.0" + rimraf "~2.2.6" terser@^5.17.4: version "5.31.3" @@ -12342,10 +13410,10 @@ text-table@^0.2.0: resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" integrity sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw== -throat@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/throat/-/throat-5.0.0.tgz#c5199235803aad18754a667d659b5e72ce16764b" - integrity sha512-fcwX4mndzpLQKBS1DVYhGAcYaYt7vsHNIvQV+WXMvnow5cgjPphq5CaayLaGsjRdSCKZFNGt7/GYAuXaNOiYCA== +throat@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/throat/-/throat-4.1.0.tgz#89037cbc92c56ab18926e6ba4cbb200e15672a6a" + integrity sha512-wCVxLDcFxw7ujDxaeJC6nfl2XfHJNYs8yUYJnvMgtPEFlttP9tHSfRUv2vBe6C4hkVFPWoP1P6ZccbYjmSEkKA== throttleit@^1.0.0: version "1.0.1" @@ -12365,6 +13433,11 @@ through@2, "through@>=2.2.7 <3", through@^2.3.4, through@^2.3.6, through@^2.3.8, resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" integrity sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg== +time-stamp@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/time-stamp/-/time-stamp-1.1.0.tgz#764a5a11af50561921b133f3b44e618687e0f5c3" + integrity sha512-gLCeArryy2yNTRzTGKbZbloctj64jkZ57hj5zdraXue6aFgd6PmvVtEyiUU+hvU0v7q08oVv8r8ev0tRo6bvgw== + tmp@^0.0.33: version "0.0.33" resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9" @@ -12382,6 +13455,21 @@ tmpl@1.0.5: resolved "https://registry.yarnpkg.com/tmpl/-/tmpl-1.0.5.tgz#8683e0b902bb9c20c4f726e3c0b69f36518c07cc" integrity sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw== +to-object-path@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/to-object-path/-/to-object-path-0.3.0.tgz#297588b7b0e7e0ac08e04e672f85c1f4999e17af" + integrity sha512-9mWHdnGRuh3onocaHzukyvCZhzvr6tiflAy/JRFXcJX0TjgfWA9pk9t8CMbzmBE4Jfw58pXbkngtBtqYxzNEyg== + dependencies: + kind-of "^3.0.2" + +to-regex-range@^2.1.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-2.1.1.tgz#7c80c17b9dfebe599e27367e0d4dd5590141db38" + integrity sha512-ZZWNfCjUokXXDGXFpZehJIkZqq91BcULFq/Pi7M5i4JnxXdhMKAK682z8bCW3o8Hj1wuuzoKcW3DfVzaP6VuNg== + dependencies: + is-number "^3.0.0" + repeat-string "^1.6.1" + to-regex-range@^5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" @@ -12389,6 +13477,16 @@ to-regex-range@^5.0.1: dependencies: is-number "^7.0.0" +to-regex@^3.0.1, to-regex@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/to-regex/-/to-regex-3.0.2.tgz#13cfdd9b336552f30b51f33a8ae1b42a7a7599ce" + integrity sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw== + dependencies: + define-property "^2.0.2" + extend-shallow "^3.0.2" + regex-not "^1.0.2" + safe-regex "^1.1.0" + toidentifier@1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.1.tgz#3be34321a88a820ed1bd80dfaa33e479fbb8dd35" @@ -12514,7 +13612,7 @@ tslib@^1.8.1: resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== -tslib@^2.0.1, tslib@^2.1.0, tslib@^2.3.0, tslib@^2.4.0, tslib@^2.6.2: +tslib@^2.1.0, tslib@^2.3.0, tslib@^2.4.0, tslib@^2.6.2: version "2.8.1" resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.8.1.tgz#612efe4ed235d567e8aba5f2a5fab70280ade83f" integrity sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w== @@ -12687,6 +13785,11 @@ typescript@^4.9.4: resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.9.4.tgz#a2a3d2756c079abda241d75f149df9d561091e78" integrity sha512-Uz+dTXYzxXXbsFpM86Wh3dKCxrQqUcVMxwU54orwlJjOpO3ao8L7j5lH+dWfTwgCwIuM9GQ2kvVotzYJMXTBZg== +ua-parser-js@^0.7.18: + version "0.7.40" + resolved "https://registry.yarnpkg.com/ua-parser-js/-/ua-parser-js-0.7.40.tgz#c87d83b7bb25822ecfa6397a0da5903934ea1562" + integrity sha512-us1E3K+3jJppDBa3Tl0L3MOJiGhe1C6P0+nIvQAFYbxlMAx0h81eOwLmU57xgqToduDDPx3y5QsdjPfDu+FgOQ== + ua-parser-js@^1.0.32: version "1.0.39" resolved "https://registry.yarnpkg.com/ua-parser-js/-/ua-parser-js-1.0.39.tgz#bfc07f361549bf249bd8f4589a4cccec18fd2018" @@ -12715,6 +13818,11 @@ uglify-js@^3.1.4: resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.19.3.tgz#82315e9bbc6f2b25888858acd1fff8441035b77f" integrity sha512-v3Xu+yuwBXisp6QYTcH4UbH+xYJXqnq2m/LtQVWKWzYc1iehYnLixoQDN9FH6/j9/oybfd6W9Ghwkl8+UMKTKQ== +ultron@1.0.x: + version "1.0.2" + resolved "https://registry.yarnpkg.com/ultron/-/ultron-1.0.2.tgz#ace116ab557cd197386a4e88f4685378c8b2e4fa" + integrity sha512-QMpnpVtYaWEeY+MwKDN/UdKlE/LsFZXM5lO1u7GaZzNgmIbGixHEmVMIKT+vqYOALu3m5GYQy9kz4Xu4IVn7Ow== + unbox-primitive@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/unbox-primitive/-/unbox-primitive-1.0.2.tgz#29032021057d5e6cdbd08c5129c226dff8ed6f9e" @@ -12778,6 +13886,16 @@ unicode-property-aliases-ecmascript@^2.0.0: resolved "https://registry.yarnpkg.com/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz#43d41e3be698bd493ef911077c9b131f827e8ccd" integrity sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w== +union-value@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/union-value/-/union-value-1.0.1.tgz#0b6fe7b835aecda61c6ea4d4f02c14221e109847" + integrity sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg== + dependencies: + arr-union "^3.1.0" + get-value "^2.0.6" + is-extendable "^0.1.1" + set-value "^2.0.1" + unique-filename@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/unique-filename/-/unique-filename-3.0.0.tgz#48ba7a5a16849f5080d26c760c86cf5cf05770ea" @@ -12817,6 +13935,14 @@ unpipe@1.0.0, unpipe@~1.0.0: resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" integrity sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ== +unset-value@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/unset-value/-/unset-value-1.0.0.tgz#8376873f7d2335179ffb1e6fc3a8ed0dfc8ab559" + integrity sha512-PcA2tsuGSF9cnySLHTLSh2qrQiJ70mn+r+Glzxv2TWZblxsxCC52BDlZoPCsz7STd9pN7EZetkWZBAvk4cgZdQ== + dependencies: + has-value "^0.3.1" + isobject "^3.0.0" + untildify@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/untildify/-/untildify-4.0.0.tgz#2bc947b953652487e4600949fb091e3ae8cd919b" @@ -12842,6 +13968,11 @@ uri-js@^4.2.2: dependencies: punycode "^2.1.0" +urix@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/urix/-/urix-0.1.0.tgz#da937f7a62e21fec1fd18d49b35c2935067a6c72" + integrity sha512-Am1ousAhSLBeB9cG/7k7r2R0zj50uDRlZHPGbazid5s9rlF1F/QKYObEKSIunSjIOkJZqwRRLpvewjEkM7pSqg== + url-parse@^1.5.3: version "1.5.10" resolved "https://registry.yarnpkg.com/url-parse/-/url-parse-1.5.10.tgz#9d3c2f736c1d75dd3bd2be507dcc111f1e2ea9c1" @@ -12850,11 +13981,28 @@ url-parse@^1.5.3: querystringify "^2.1.1" requires-port "^1.0.0" +use-subscription@^1.0.0: + version "1.10.0" + resolved "https://registry.yarnpkg.com/use-subscription/-/use-subscription-1.10.0.tgz#ab4df8f39dcfa5c7739639535277045841b3b37b" + integrity sha512-ZRLhsMSjz01kBA8106zdzEjttJ20Rauscf0umwVRjaz8idRfoddOnAVH6VEBdu55eCq02L1g+j3NcleAar1aWw== + dependencies: + use-sync-external-store "^1.4.0" + use-sync-external-store@^1.0.0: version "1.2.0" resolved "https://registry.yarnpkg.com/use-sync-external-store/-/use-sync-external-store-1.2.0.tgz#7dbefd6ef3fe4e767a0cf5d7287aacfb5846928a" integrity sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA== +use-sync-external-store@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/use-sync-external-store/-/use-sync-external-store-1.4.0.tgz#adbc795d8eeb47029963016cefdf89dc799fcebc" + integrity sha512-9WXSPC5fMv61vaupRkCKCxsPxBocVnwakBEkMIHHpkTTg6icbJtg6jzgtLDm4bl3cSHAca52rYWih0k4K3PfHw== + +use@^3.1.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/use/-/use-3.1.1.tgz#d50c8cac79a19fbc20f2911f56eb973f4e10070f" + integrity sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ== + user-agent-data-types@^0.4.2: version "0.4.2" resolved "https://registry.yarnpkg.com/user-agent-data-types/-/user-agent-data-types-0.4.2.tgz#3bbd3662022c3fb9d0c2f7449b6cdd412a3f9e0d" @@ -12886,6 +14034,11 @@ uuid@^10.0.0: resolved "https://registry.yarnpkg.com/uuid/-/uuid-10.0.0.tgz#5a95aa454e6e002725c79055fd42aaba30ca6294" integrity sha512-8XkAphELsDnEGrDxUOHB3RGvXz6TeuYSGEZBOjtTtPm2lwhGBjLgOzLHB63IUWfBpNucQjND6d3AOudO+H3RWQ== +uuid@^3.3.2: + version "3.4.0" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.4.0.tgz#b23e4358afa8a202fe7a100af1f5f883f02007ee" + integrity sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A== + uuid@^8.3.2: version "8.3.2" resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2" @@ -12981,7 +14134,7 @@ walkdir@^0.4.1: resolved "https://registry.yarnpkg.com/walkdir/-/walkdir-0.4.1.tgz#dc119f83f4421df52e3061e514228a2db20afa39" integrity sha512-3eBwRyEln6E1MSzcxcVpQIhRG8Q1jLvEqRmCZqS3dsfXEDR/AhOF4d+jHg1qvDCpYaVRZjENPQyrVxAkQqxPgQ== -walker@^1.0.7, walker@^1.0.8: +walker@^1.0.7, walker@^1.0.8, walker@~1.0.5: version "1.0.8" resolved "https://registry.yarnpkg.com/walker/-/walker-1.0.8.tgz#bd498db477afe573dc04185f011d3ab8a8d7653f" integrity sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ== @@ -13038,7 +14191,7 @@ whatwg-encoding@^2.0.0: dependencies: iconv-lite "0.6.3" -whatwg-fetch@^3.0.0: +whatwg-fetch@>=0.10.0, whatwg-fetch@^3.0.0: version "3.6.20" resolved "https://registry.yarnpkg.com/whatwg-fetch/-/whatwg-fetch-3.6.20.tgz#580ce6d791facec91d37c72890995a0b48d31c70" integrity sha512-EqhiFU6daOA8kpjOWTL0olhVOF3i7OrFzSYiGsEMB8GcXS+RrzauAERX65xMeNWVqxA6HXH2m69Z9LaKKdisfg== @@ -13204,6 +14357,15 @@ wordwrap@^1.0.0: string-width "^4.1.0" strip-ansi "^6.0.0" +wrap-ansi@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-5.1.0.tgz#1fd1f67235d5b6d0fee781056001bfb694c03b09" + integrity sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q== + dependencies: + ansi-styles "^3.2.0" + string-width "^3.0.0" + strip-ansi "^5.0.0" + wrap-ansi@^6.0.1, wrap-ansi@^6.2.0: version "6.2.0" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-6.2.0.tgz#e9393ba07102e6c91a3b221478f0257cd2856e53" @@ -13235,7 +14397,7 @@ write-file-atomic@5.0.1, write-file-atomic@^5.0.0: imurmurhash "^0.1.4" signal-exit "^4.0.1" -write-file-atomic@^2.3.0, write-file-atomic@^2.4.2: +write-file-atomic@^2.4.2: version "2.4.3" resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-2.4.3.tgz#1fd2e9ae1df3e75b8d8c367443c692d4ca81f481" integrity sha512-GaETH5wwsX+GcnzhPgKcKjJ6M2Cq3/iZp1WyY/X1CSqrW+jVNM9Y7D8EC2sM4ZG/V8wZlSniJnCKWPmBYAucRQ== @@ -13273,14 +14435,15 @@ write-pkg@4.0.0: type-fest "^0.4.1" write-json-file "^3.2.0" -ws@^6.2.2: - version "6.2.3" - resolved "https://registry.yarnpkg.com/ws/-/ws-6.2.3.tgz#ccc96e4add5fd6fedbc491903075c85c5a11d9ee" - integrity sha512-jmTjYU0j60B+vHey6TfR3Z7RD61z/hmxBS3VMSGIrroOWXQEneK1zNuotOUrGyBHQj0yrpsLHPWtigEFd13ndA== +ws@^1.1.0, ws@^1.1.5: + version "1.1.5" + resolved "https://registry.yarnpkg.com/ws/-/ws-1.1.5.tgz#cbd9e6e75e09fc5d2c90015f21f0c40875e0dd51" + integrity sha512-o3KqipXNUdS7wpQzBHSe180lBGO60SoK0yVo3CYJgb2MkobuWuBX6dhkYP5ORCLd55y+SaflMOV5fqAB53ux4w== dependencies: - async-limiter "~1.0.0" + options ">=0.0.5" + ultron "1.0.x" -ws@^7, ws@^7.5.1: +ws@^7: version "7.5.10" resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.10.tgz#58b5c20dc281633f6c19113f39b349bd8bd558d9" integrity sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ== @@ -13290,16 +14453,41 @@ ws@^8.11.0: resolved "https://registry.yarnpkg.com/ws/-/ws-8.17.1.tgz#9293da530bb548febc95371d90f9c878727d919b" integrity sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ== +xcode@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/xcode/-/xcode-2.1.0.tgz#bab64a7e954bb50ca8d19da7e09531c65a43ecfe" + integrity sha512-uCrmPITrqTEzhn0TtT57fJaNaw8YJs1aCzs+P/QqxsDbvPZSv7XMPPwXrKvHtD6pLjBM/NaVwraWJm8q83Y4iQ== + dependencies: + simple-plist "^1.0.0" + uuid "^3.3.2" + xml-name-validator@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/xml-name-validator/-/xml-name-validator-4.0.0.tgz#79a006e2e63149a8600f15430f0a4725d1524835" integrity sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw== +xmlbuilder@^15.1.1: + version "15.1.1" + resolved "https://registry.yarnpkg.com/xmlbuilder/-/xmlbuilder-15.1.1.tgz#9dcdce49eea66d8d10b42cae94a79c3c8d0c2ec5" + integrity sha512-yMqGBqtXyeN1e3TGYvgNgDVZ3j84W4cwkOXQswghol6APgZWaff9lnbvN7MHYJOiXsvGPXtjTYJEiC9J2wv9Eg== + xmlchars@^2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/xmlchars/-/xmlchars-2.2.0.tgz#060fe1bcb7f9c76fe2a17db86a9bc3ab894210cb" integrity sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw== +xmldoc@^1.1.2: + version "1.3.0" + resolved "https://registry.yarnpkg.com/xmldoc/-/xmldoc-1.3.0.tgz#7823225b096c74036347c9ec5924d06b6a3cebab" + integrity sha512-y7IRWW6PvEnYQZNZFMRLNJw+p3pezM4nKYPfr15g4OOW9i8VpeydycFuipE2297OvZnh3jSb2pxOt9QpkZUVng== + dependencies: + sax "^1.2.4" + +xpipe@^1.0.5: + version "1.0.8" + resolved "https://registry.yarnpkg.com/xpipe/-/xpipe-1.0.8.tgz#2e970c255cfa39592726fa3458e2465d3754767f" + integrity sha512-E2RGg3fUCxHGdbrM7FMOqHNhiiDRW/tgbftCd/K6w1ce4386QZvkgIq77EBsHdAOmNfQjtmIKwXp67Dy18s8Dg== + xtend@^4.0.0, xtend@~4.0.1: version "4.0.2" resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54" @@ -13315,6 +14503,11 @@ y18n@^5.0.5: resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55" integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== +yallist@^2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52" + integrity sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A== + yallist@^3.0.2: version "3.1.1" resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" @@ -13330,16 +14523,19 @@ yaml@^2.1.3: resolved "https://registry.yarnpkg.com/yaml/-/yaml-2.3.4.tgz#53fc1d514be80aabf386dc6001eb29bf3b7523b2" integrity sha512-8aAvwVUSHpfEqTQ4w/KMlf3HcRdt50E5ODIQJBw1fQ5RL34xabzxtUlzTXVqc4rkZsPbvrXKWnABCD7kWSmocA== -yaml@^2.2.1: - version "2.7.0" - resolved "https://registry.yarnpkg.com/yaml/-/yaml-2.7.0.tgz#aef9bb617a64c937a9a748803786ad8d3ffe1e98" - integrity sha512-+hSoy/QHluxmC9kCIJyL/uyFmLmc+e5CFR5Wa+bpIhIj85LVb9ZH2nVnqrHoSvKogwODv0ClqZkmiSSaIH5LTA== - yargs-parser@21.1.1, yargs-parser@^21.1.1: version "21.1.1" resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-21.1.1.tgz#9096bceebf990d21bb31fa9516e0ede294a77d35" integrity sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw== +yargs-parser@^15.0.1: + version "15.0.3" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-15.0.3.tgz#316e263d5febe8b38eef61ac092b33dfcc9b1115" + integrity sha512-/MVEVjTXy/cGAjdtQf8dW3V9b97bPN7rNn8ETj6BmAQL7ibC7O1Q9SPJbGjgh3SlwoBNXMzj/ZGIj8mBgl12YA== + dependencies: + camelcase "^5.0.0" + decamelize "^1.2.0" + yargs-parser@^18.1.2: version "18.1.3" resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-18.1.3.tgz#be68c4975c6b2abf469236b0c870362fab09a7b0" @@ -13366,6 +14562,23 @@ yargs@17.7.2, yargs@^17.3.1, yargs@^17.6.2, yargs@^17.7.2: y18n "^5.0.5" yargs-parser "^21.1.1" +yargs@^14.2.0: + version "14.2.3" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-14.2.3.tgz#1a1c3edced1afb2a2fea33604bc6d1d8d688a414" + integrity sha512-ZbotRWhF+lkjijC/VhmOT9wSgyBQ7+zr13+YLkhfsSiTriYsMzkTUFP18pFhWwBeMa5gUc1MzbhrO6/VB7c9Xg== + dependencies: + cliui "^5.0.0" + decamelize "^1.2.0" + find-up "^3.0.0" + get-caller-file "^2.0.1" + require-directory "^2.1.1" + require-main-filename "^2.0.0" + set-blocking "^2.0.0" + string-width "^3.0.0" + which-module "^2.0.0" + y18n "^4.0.0" + yargs-parser "^15.0.1" + yargs@^15.1.0: version "15.4.1" resolved "https://registry.yarnpkg.com/yargs/-/yargs-15.4.1.tgz#0d87a16de01aee9d8bec2bfbf74f67851730f4f8" From 56b84169a39acc196ba3a7f6375a14898f00413e Mon Sep 17 00:00:00 2001 From: Lucas Bento Date: Sat, 4 Jan 2025 16:58:51 +0100 Subject: [PATCH 28/43] refactor: change from milliseconds to seconds --- packages/react-native-tracing/ios/NativeInstrumentation.swift | 4 ++-- packages/react-native-tracing/src/wrapHOC.tsx | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/react-native-tracing/ios/NativeInstrumentation.swift b/packages/react-native-tracing/ios/NativeInstrumentation.swift index 607ee5de4..3312212cb 100644 --- a/packages/react-native-tracing/ios/NativeInstrumentation.swift +++ b/packages/react-native-tracing/ios/NativeInstrumentation.swift @@ -9,7 +9,7 @@ public class NativeInstrumentation: NSObject, RCTBridgeModule { @objc public static func initializeNativeInstrumentation() { NativeInstrumentation.cachedMetrics = nil - NativeInstrumentation.startTime = Date().timeIntervalSince1970 * 1000 + NativeInstrumentation.startTime = Date().timeIntervalSince1970 } override init() { @@ -38,7 +38,7 @@ public class NativeInstrumentation: NSObject, RCTBridgeModule { return } - let endTime = Date().timeIntervalSince1970 * 1000 + let endTime = Date().timeIntervalSince1970 let duration = endTime - startTime let metrics: [String: Double] = [ diff --git a/packages/react-native-tracing/src/wrapHOC.tsx b/packages/react-native-tracing/src/wrapHOC.tsx index 09a25d577..ae0fd9f61 100644 --- a/packages/react-native-tracing/src/wrapHOC.tsx +++ b/packages/react-native-tracing/src/wrapHOC.tsx @@ -17,7 +17,7 @@ const measureStartupTime = async (): Promise => { api.pushMeasurement({ type: 'app_startup_time', values: { - startup_duration_ms: metrics.startupDuration, + startup_duration: metrics.startupDuration, }, }); } catch (error) { From 0f6e372d63776a1603608e19fa50294e485855c1 Mon Sep 17 00:00:00 2001 From: Lucas Bento Date: Sun, 5 Jan 2025 14:04:02 +0100 Subject: [PATCH 29/43] refactor: change from milliseconds to seconds --- .../NativeInstrumentationModule.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/react-native-tracing/android/src/main/java/com/grafana/nativeinstrumentation/NativeInstrumentationModule.java b/packages/react-native-tracing/android/src/main/java/com/grafana/nativeinstrumentation/NativeInstrumentationModule.java index adf68f246..a60ca35a8 100644 --- a/packages/react-native-tracing/android/src/main/java/com/grafana/nativeinstrumentation/NativeInstrumentationModule.java +++ b/packages/react-native-tracing/android/src/main/java/com/grafana/nativeinstrumentation/NativeInstrumentationModule.java @@ -63,17 +63,17 @@ public void getStartupTime(Promise promise) { } long endTime = System.currentTimeMillis(); - long duration = endTime - startTime; + double duration = (endTime - startTime) / 1000.0; android.util.Log.d(NAME, String.format( - "Calculating metrics - Start: %d, End: %d, Duration: %d ms", + "Calculating metrics - Start: %d, End: %d, Duration: %f seconds", startTime, endTime, duration )); WritableMap params = Arguments.createMap(); - params.putDouble("startStartupTime", startTime.doubleValue()); + params.putDouble("startStartupTime", (double) startTime); params.putDouble("endStartupTime", (double) endTime); - params.putDouble("startupDuration", (double) duration); + params.putDouble("startupDuration", duration); cachedMetrics = params; android.util.Log.d(NAME, "Metrics cached and being returned"); From f5060fc53985670a231b9d0ab945a1aee2d6ce51 Mon Sep 17 00:00:00 2001 From: Lucas Bento Date: Mon, 6 Jan 2025 11:57:21 +0100 Subject: [PATCH 30/43] fix: use correct values for `browser` meta --- packages/core/src/utils/is.ts | 7 +- packages/react-native-sdk/package.json | 5 + .../src/metas/browser/meta.ts | 54 +- rollup.config.base.js | 54 +- tsconfig.base.json | 1 - yarn.lock | 1036 ++++++++++++++++- 6 files changed, 1054 insertions(+), 103 deletions(-) diff --git a/packages/core/src/utils/is.ts b/packages/core/src/utils/is.ts index 48e81f30c..c313c4147 100644 --- a/packages/core/src/utils/is.ts +++ b/packages/core/src/utils/is.ts @@ -67,8 +67,5 @@ export const isMapDefined = typeof Map !== 'undefined'; export const isMap = ((value) => isMapDefined && isInstanceOf(value, Map)) as IsFnHelper>; -export const isSyntheticEvent = ((value) => - isObject(value) && - 'nativeEvent' in value && - 'preventDefault' in value && - 'stopPropagation' in value) as IsFnHelper; +export const isSyntheticEvent = (value: unknown) => + isObject(value) && 'nativeEvent' in value && 'preventDefault' in value && 'stopPropagation' in value; diff --git a/packages/react-native-sdk/package.json b/packages/react-native-sdk/package.json index 75a299207..02033bf63 100644 --- a/packages/react-native-sdk/package.json +++ b/packages/react-native-sdk/package.json @@ -53,13 +53,18 @@ }, "dependencies": { "@grafana/faro-core": "^1.12.2", + "react-native-device-info": "^14.0.2", "ua-parser-js": "^1.0.32", "web-vitals": "^4.0.1" }, "devDependencies": { "@types/ua-parser-js": "^0.7.36", + "react-native": "0.72.6", "user-agent-data-types": "^0.4.2" }, + "peerDependencies": { + "react-native": ">=0.70.0" + }, "publishConfig": { "access": "public" } diff --git a/packages/react-native-sdk/src/metas/browser/meta.ts b/packages/react-native-sdk/src/metas/browser/meta.ts index da65f09ea..b08c2d016 100644 --- a/packages/react-native-sdk/src/metas/browser/meta.ts +++ b/packages/react-native-sdk/src/metas/browser/meta.ts @@ -1,41 +1,21 @@ -import { UAParser } from 'ua-parser-js'; +// eslint-disable-next-line import/namespace +import { Dimensions, Platform } from 'react-native'; +import { getBrand, getModel, getReadableVersion, getSystemVersion } from 'react-native-device-info'; -import { unknownString } from '@grafana/faro-core'; -import type { Meta, MetaBrowser, MetaItem } from '@grafana/faro-core'; +import { Meta, MetaItem } from '@grafana/faro-core'; -export const browserMeta: MetaItem> = () => { - const parser = new UAParser(); - const { name, version } = parser.getBrowser(); - const { name: osName, version: osVersion } = parser.getOS(); - const userAgent = parser.getUA(); - const language = navigator.language; - const mobile = navigator.userAgent.includes('Mobi'); - const brands = getBrands(); +const { width, height } = Dimensions.get('window'); - return { - browser: { - name: name ?? unknownString, - version: version ?? unknownString, - os: `${osName ?? unknownString} ${osVersion ?? unknownString}`, - userAgent: userAgent ?? unknownString, - language: language ?? unknownString, - mobile, - brands: brands ?? unknownString, - viewportWidth: `${window.innerWidth}`, - viewportHeight: `${window.innerHeight}`, +export const browserMeta: MetaItem> = () => ({ + browser: { + name: Platform.OS, + version: getReadableVersion(), + os: getSystemVersion(), + mobile: true, + userAgent: `${Platform.OS}/${getSystemVersion()} (${getBrand()} ${getModel()})`, + windowSize: { + width, + height, }, - }; - - function getBrands(): MetaBrowser['brands'] | undefined { - if (!name || !version) { - return undefined; - } - - if ('userAgentData' in navigator && navigator.userAgentData) { - // userAgentData in experimental (only Chrome supports it) thus TS does not ship the respective type declarations - return (navigator as any).userAgentData.brands; - } - - return undefined; - } -}; + }, +}); diff --git a/rollup.config.base.js b/rollup.config.base.js index 6280b48f4..ea65ae4b8 100644 --- a/rollup.config.base.js +++ b/rollup.config.base.js @@ -87,40 +87,72 @@ const modules = { bundleName: 'faro-instrumentation-otel-redux-saga', globalName: 'GrafanaFaroInstrumentationOtelReduxSaga', externals: [], - } + }, }; exports.getRollupConfigBase = (moduleName) => { const module = modules[moduleName]; - return { + const isReactNative = moduleName.startsWith('rn'); + + const baseConfig = { input: './src/index.ts', output: { file: `./dist/bundle/${module.bundleName}.iife.js`, format: 'iife', - globals: module.externals.reduce( - (acc, external) => ({ - ...acc, - [modules[external].name]: modules[external].globalName, - }), - {} - ), + globals: { + 'react-native': 'ReactNative', + react: 'React', + ...module.externals.reduce( + (acc, external) => ({ + ...acc, + [modules[external].name]: modules[external].globalName, + }), + {} + ), + }, name: module.globalName, }, - external: module.externals.map((external) => modules[external].name), + external: ['react-native', 'react', ...module.externals.map((external) => modules[external].name)], plugins: [ resolve({ browser: true, + preferBuiltins: false, + extensions: ['.js', '.jsx', '.ts', '.tsx', '.json'], + moduleDirectories: ['node_modules'], + }), + commonjs({ + ignore: isReactNative ? ['react-native'] : [], + requireReturnsDefault: 'auto', + transformMixedEsModules: true, + exclude: isReactNative ? ['node_modules/react-native/**'] : [], }), - commonjs(), typescript({ cacheDir: '../../.cache/rollup', inlineSources: false, outputToFilesystem: true, sourceMap: false, tsconfig: './tsconfig.esm.json', + exclude: ['node_modules/**'], }), terser(), ], }; + + if (isReactNative) { + baseConfig.onwarn = (warning, warn) => { + // Suppress certain warnings for React Native + if (warning.code === 'CIRCULAR_DEPENDENCY') { + return; + } + + if (warning.code === 'THIS_IS_UNDEFINED') { + return; + } + + warn(warning); + }; + } + + return baseConfig; }; diff --git a/tsconfig.base.json b/tsconfig.base.json index 969935675..48897f3dd 100644 --- a/tsconfig.base.json +++ b/tsconfig.base.json @@ -7,7 +7,6 @@ "esModuleInterop": true, "experimentalDecorators": true, "forceConsistentCasingInFileNames": true, - "importsNotUsedAsValues": "error", "incremental": true, "inlineSources": true, "isolatedModules": true, diff --git a/yarn.lock b/yarn.lock index 032a1f484..29d855ce1 100644 --- a/yarn.lock +++ b/yarn.lock @@ -34,7 +34,7 @@ resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.26.2.tgz#278b6b13664557de95b8f35b90d96785850bb56e" integrity sha512-Z0WgzSEa+aUcdiJuCIqgujCshpMWgUpgOxXotrYPSA53hA3qopNaqcJpyr0hVb1FeWdnqFA35/fUtXgBK8srQg== -"@babel/core@^7.0.0", "@babel/core@^7.11.6", "@babel/core@^7.12.3", "@babel/core@^7.23.9", "@babel/core@^7.25.2": +"@babel/core@^7.0.0", "@babel/core@^7.11.6", "@babel/core@^7.12.3", "@babel/core@^7.13.16", "@babel/core@^7.20.0", "@babel/core@^7.23.9", "@babel/core@^7.25.2": version "7.26.0" resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.26.0.tgz#d78b6023cc8f3114ccf049eb219613f74a747b40" integrity sha512-i1SLeK+DzNnQ3LL/CswPCa/E5u4lh1k6IAEphON8F+cXt0t9euTshDru0q7/IqMa1PMPz5RnHuHscF8/ZJsStg== @@ -55,6 +55,17 @@ json5 "^2.2.3" semver "^6.3.1" +"@babel/generator@^7.20.0", "@babel/generator@^7.26.3", "@babel/generator@^7.5.0": + version "7.26.3" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.26.3.tgz#ab8d4360544a425c90c248df7059881f4b2ce019" + integrity sha512-6FF/urZvD0sTeO7k6/B15pMLC4CHUv1426lzr3N01aHJTl046uCAh9LXW/fzeXXjPNCJ6iABW5XaWOsIZB93aQ== + dependencies: + "@babel/parser" "^7.26.3" + "@babel/types" "^7.26.3" + "@jridgewell/gen-mapping" "^0.3.5" + "@jridgewell/trace-mapping" "^0.3.25" + jsesc "^3.0.2" + "@babel/generator@^7.25.9", "@babel/generator@^7.26.0", "@babel/generator@^7.7.2": version "7.26.2" resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.26.2.tgz#87b75813bec87916210e5e01939a4c823d6bb74f" @@ -66,17 +77,6 @@ "@jridgewell/trace-mapping" "^0.3.25" jsesc "^3.0.2" -"@babel/generator@^7.26.3", "@babel/generator@^7.5.0": - version "7.26.3" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.26.3.tgz#ab8d4360544a425c90c248df7059881f4b2ce019" - integrity sha512-6FF/urZvD0sTeO7k6/B15pMLC4CHUv1426lzr3N01aHJTl046uCAh9LXW/fzeXXjPNCJ6iABW5XaWOsIZB93aQ== - dependencies: - "@babel/parser" "^7.26.3" - "@babel/types" "^7.26.3" - "@jridgewell/gen-mapping" "^0.3.5" - "@jridgewell/trace-mapping" "^0.3.25" - jsesc "^3.0.2" - "@babel/helper-annotate-as-pure@^7.25.9": version "7.25.9" resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.25.9.tgz#d8eac4d2dc0d7b6e11fa6e535332e0d3184f06b4" @@ -128,6 +128,13 @@ lodash.debounce "^4.0.8" resolve "^1.14.2" +"@babel/helper-environment-visitor@^7.18.9": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.24.7.tgz#4b31ba9551d1f90781ba83491dd59cf9b269f7d9" + integrity sha512-DoiN84+4Gnd0ncbBOM9AZENV4a5ZiL39HYMyZJGZ/AZEykHYdJw0wW3kdcsh9/Kn+BRXHLkkklZ51ecPKmI1CQ== + dependencies: + "@babel/types" "^7.24.7" + "@babel/helper-member-expression-to-functions@^7.25.9": version "7.25.9" resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.25.9.tgz#9dfffe46f727005a5ea29051ac835fb735e4c1a3" @@ -165,6 +172,15 @@ resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.25.9.tgz#9cbdd63a9443a2c92a725cca7ebca12cc8dd9f46" integrity sha512-kSMlyUVdWe25rEsRGviIgOWnoT/nfABVWlqt9N19/dIPWViAOW2s9wznP5tURbs/IDuNk4gPy3YdYRgH3uxhBw== +"@babel/helper-remap-async-to-generator@^7.18.9", "@babel/helper-remap-async-to-generator@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.25.9.tgz#e53956ab3d5b9fb88be04b3e2f31b523afd34b92" + integrity sha512-IZtukuUeBbhgOcaW2s06OXTzVNJR0ybm4W5xC1opWFFJMZbwRj5LCk+ByYH7WdZPZTt8KnFwA8pvjN2yqcPlgw== + dependencies: + "@babel/helper-annotate-as-pure" "^7.25.9" + "@babel/helper-wrap-function" "^7.25.9" + "@babel/traverse" "^7.25.9" + "@babel/helper-replace-supers@^7.25.9": version "7.25.9" resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.25.9.tgz#ba447224798c3da3f8713fc272b145e33da6a5c5" @@ -197,6 +213,15 @@ resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.25.9.tgz#86e45bd8a49ab7e03f276577f96179653d41da72" integrity sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw== +"@babel/helper-wrap-function@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.25.9.tgz#d99dfd595312e6c894bd7d237470025c85eea9d0" + integrity sha512-ETzz9UTjQSTmw39GboatdymDq4XIQbR8ySgVrylRhPOFpsd+JrKHIuF0de7GCWmem+T4uC5z7EZguod7Wj4A4g== + dependencies: + "@babel/template" "^7.25.9" + "@babel/traverse" "^7.25.9" + "@babel/types" "^7.25.9" + "@babel/helpers@^7.26.0": version "7.26.0" resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.26.0.tgz#30e621f1eba5aa45fe6f4868d2e9154d884119a4" @@ -205,7 +230,7 @@ "@babel/template" "^7.25.9" "@babel/types" "^7.26.0" -"@babel/parser@^7.0.0", "@babel/parser@^7.26.3": +"@babel/parser@^7.0.0", "@babel/parser@^7.13.16", "@babel/parser@^7.20.0", "@babel/parser@^7.26.3": version "7.26.3" resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.26.3.tgz#8c51c5db6ddf08134af1ddbacf16aaab48bac234" integrity sha512-WJ/CvmY8Mea8iDXo6a7RK2wbmJITT5fN3BEkRuFlxVyNx8jOKIIhmC4fSkTcPcf8JyavbBwIe6OpiCOBXt/IcA== @@ -226,7 +251,17 @@ dependencies: "@babel/helper-plugin-utils" "^7.25.9" -"@babel/plugin-proposal-class-properties@^7.0.0": +"@babel/plugin-proposal-async-generator-functions@^7.0.0": + version "7.20.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.20.7.tgz#bfb7276d2d573cb67ba379984a2334e262ba5326" + integrity sha512-xMbiLsn/8RK7Wq7VeVytytS2L6qE69bXPB10YCmMdDZbKF4okCqY74pI/jJQ/8U0b/F6NrT2+14b8/P9/3AMGA== + dependencies: + "@babel/helper-environment-visitor" "^7.18.9" + "@babel/helper-plugin-utils" "^7.20.2" + "@babel/helper-remap-async-to-generator" "^7.18.9" + "@babel/plugin-syntax-async-generators" "^7.8.4" + +"@babel/plugin-proposal-class-properties@^7.0.0", "@babel/plugin-proposal-class-properties@^7.13.0", "@babel/plugin-proposal-class-properties@^7.18.0": version "7.18.6" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.18.6.tgz#b110f59741895f7ec21a6fff696ec46265c446a3" integrity sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ== @@ -241,7 +276,7 @@ dependencies: "@babel/helper-plugin-utils" "^7.25.9" -"@babel/plugin-proposal-nullish-coalescing-operator@^7.0.0": +"@babel/plugin-proposal-nullish-coalescing-operator@^7.0.0", "@babel/plugin-proposal-nullish-coalescing-operator@^7.13.8", "@babel/plugin-proposal-nullish-coalescing-operator@^7.18.0": version "7.18.6" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.18.6.tgz#fdd940a99a740e577d6c753ab6fbb43fdb9467e1" integrity sha512-wQxQzxYeJqHcfppzBDnm1yAY0jSRkUXR2z8RePZYrKwMKgMlE8+Z6LUno+bd6LvbGh8Gltvy74+9pIYkr+XkKA== @@ -249,7 +284,15 @@ "@babel/helper-plugin-utils" "^7.18.6" "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" -"@babel/plugin-proposal-object-rest-spread@^7.0.0": +"@babel/plugin-proposal-numeric-separator@^7.0.0": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.18.6.tgz#899b14fbafe87f053d2c5ff05b36029c62e13c75" + integrity sha512-ozlZFogPqoLm8WBr5Z8UckIoE4YQ5KESVcNudyXOR8uqIkliTEgJ3RoketfG6pmzLdeZF0H/wjE9/cCEitBl7Q== + dependencies: + "@babel/helper-plugin-utils" "^7.18.6" + "@babel/plugin-syntax-numeric-separator" "^7.10.4" + +"@babel/plugin-proposal-object-rest-spread@^7.0.0", "@babel/plugin-proposal-object-rest-spread@^7.20.0": version "7.20.7" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.20.7.tgz#aa662940ef425779c75534a5c41e9d936edc390a" integrity sha512-d2S98yCiLxDVmBmE8UjGcfPvNEUbA1U5q5WxaWFUGRzJSVAZqm5W6MbPct0jxnegUZ0niLeNX+IOzEs7wYg9Dg== @@ -268,7 +311,7 @@ "@babel/helper-plugin-utils" "^7.18.6" "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" -"@babel/plugin-proposal-optional-chaining@^7.0.0": +"@babel/plugin-proposal-optional-chaining@^7.0.0", "@babel/plugin-proposal-optional-chaining@^7.13.12", "@babel/plugin-proposal-optional-chaining@^7.20.0": version "7.21.0" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.21.0.tgz#886f5c8978deb7d30f678b2e24346b287234d3ea" integrity sha512-p4zeefM72gpmEe2fkUr/OnOXpWEf8nAgk7ZYVqqfFiyIG7oFfVZcCrU64hWn5xp4tQ9LkV4bTIa5rD0KANpKNA== @@ -298,7 +341,7 @@ dependencies: "@babel/helper-plugin-utils" "^7.12.13" -"@babel/plugin-syntax-dynamic-import@^7.0.0": +"@babel/plugin-syntax-dynamic-import@^7.0.0", "@babel/plugin-syntax-dynamic-import@^7.8.0": version "7.8.3" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz#62bf98b2da3cd21d626154fc96ee5b3cb68eacb3" integrity sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ== @@ -312,7 +355,7 @@ dependencies: "@babel/helper-plugin-utils" "^7.25.9" -"@babel/plugin-syntax-flow@^7.0.0", "@babel/plugin-syntax-flow@^7.2.0", "@babel/plugin-syntax-flow@^7.25.9": +"@babel/plugin-syntax-flow@^7.0.0", "@babel/plugin-syntax-flow@^7.12.1", "@babel/plugin-syntax-flow@^7.18.0", "@babel/plugin-syntax-flow@^7.2.0", "@babel/plugin-syntax-flow@^7.25.9": version "7.26.0" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.26.0.tgz#96507595c21b45fccfc2bc758d5c45452e6164fa" integrity sha512-B+O2DnPc0iG+YXFqOxv2WNuNU97ToWjOomUQ78DouOENWUaM5sVrmet9mcomUGQFwpJd//gvUagXBSdzO1fRKg== @@ -361,7 +404,7 @@ dependencies: "@babel/helper-plugin-utils" "^7.8.0" -"@babel/plugin-syntax-numeric-separator@^7.8.3": +"@babel/plugin-syntax-numeric-separator@^7.10.4", "@babel/plugin-syntax-numeric-separator@^7.8.3": version "7.10.4" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz#b9b070b3e33570cd9fd07ba7fa91c0dd37b9af97" integrity sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug== @@ -417,6 +460,15 @@ dependencies: "@babel/helper-plugin-utils" "^7.25.9" +"@babel/plugin-transform-async-to-generator@^7.20.0": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.25.9.tgz#c80008dacae51482793e5a9c08b39a5be7e12d71" + integrity sha512-NT7Ejn7Z/LjUH0Gv5KsBCxh7BH3fbLTV0ptHvpeMvrt3cPThHfJfst9Wrb7S8EvJ7vRTFI7z+VAvFVEQn/m5zQ== + dependencies: + "@babel/helper-module-imports" "^7.25.9" + "@babel/helper-plugin-utils" "^7.25.9" + "@babel/helper-remap-async-to-generator" "^7.25.9" + "@babel/plugin-transform-block-scoped-functions@^7.0.0": version "7.25.9" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.25.9.tgz#5700691dbd7abb93de300ca7be94203764fce458" @@ -451,7 +503,7 @@ "@babel/helper-plugin-utils" "^7.25.9" "@babel/template" "^7.25.9" -"@babel/plugin-transform-destructuring@^7.0.0": +"@babel/plugin-transform-destructuring@^7.0.0", "@babel/plugin-transform-destructuring@^7.20.0": version "7.25.9" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.25.9.tgz#966ea2595c498224340883602d3cfd7a0c79cea1" integrity sha512-WkCGb/3ZxXepmMiX101nnGiU+1CAdut8oHyEOHxkKuS1qKpU2SMXE2uSvfz8PBuLd49V6LEsbtyPhWC7fnkgvQ== @@ -465,7 +517,7 @@ dependencies: "@babel/helper-plugin-utils" "^7.25.9" -"@babel/plugin-transform-flow-strip-types@^7.0.0": +"@babel/plugin-transform-flow-strip-types@^7.0.0", "@babel/plugin-transform-flow-strip-types@^7.20.0", "@babel/plugin-transform-flow-strip-types@^7.25.9": version "7.25.9" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.25.9.tgz#85879b42a8f5948fd6317069978e98f23ef8aec1" integrity sha512-/VVukELzPDdci7UUsWQaSkhgnjIWXnIyRpM02ldxaVoFK96c41So8JcKT3m0gYjyv7j5FNPGS5vfELrWalkbDA== @@ -504,7 +556,7 @@ dependencies: "@babel/helper-plugin-utils" "^7.25.9" -"@babel/plugin-transform-modules-commonjs@^7.0.0": +"@babel/plugin-transform-modules-commonjs@^7.0.0", "@babel/plugin-transform-modules-commonjs@^7.13.8", "@babel/plugin-transform-modules-commonjs@^7.25.9": version "7.26.3" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.26.3.tgz#8f011d44b20d02c3de44d8850d971d8497f981fb" integrity sha512-MgR55l4q9KddUDITEzEFYn5ZsGDXMSsU9E+kh7fjRXTIC3RHqfCo8RPRbyReYJh44HQ/yomFkqbOFohXvDCiIQ== @@ -512,6 +564,14 @@ "@babel/helper-module-transforms" "^7.26.0" "@babel/helper-plugin-utils" "^7.25.9" +"@babel/plugin-transform-named-capturing-groups-regex@^7.0.0": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.25.9.tgz#454990ae6cc22fd2a0fa60b3a2c6f63a38064e6a" + integrity sha512-oqB6WHdKTGl3q/ItQhpLSnWWOpjUJLsOCLVyeFgeTktkBSCiurvPOsyt93gibI9CmuKvTUEtWmG5VhZD+5T/KA== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.25.9" + "@babel/helper-plugin-utils" "^7.25.9" + "@babel/plugin-transform-object-assign@^7.0.0": version "7.25.9" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-assign/-/plugin-transform-object-assign-7.25.9.tgz#686203d53ee688d1642bf3a8c751dfb3981021c8" @@ -622,7 +682,7 @@ dependencies: "@babel/helper-plugin-utils" "^7.25.9" -"@babel/plugin-transform-typescript@^7.5.0": +"@babel/plugin-transform-typescript@^7.25.9", "@babel/plugin-transform-typescript@^7.5.0": version "7.26.3" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.26.3.tgz#3d6add9c78735623317387ee26d5ada540eee3fd" integrity sha512-6+5hpdr6mETwSKjmJUdYw0EIkATiQhnELWlE3kJFBwSg/BGIVwVaVbX+gOXBCdc7Ln1RXZxyWGecIXhUfnl7oA== @@ -641,7 +701,27 @@ "@babel/helper-create-regexp-features-plugin" "^7.25.9" "@babel/helper-plugin-utils" "^7.25.9" -"@babel/register@^7.0.0": +"@babel/preset-flow@^7.13.13": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/preset-flow/-/preset-flow-7.25.9.tgz#ef8b5e7e3f24a42b3711e77fb14919b87dffed0a" + integrity sha512-EASHsAhE+SSlEzJ4bzfusnXSHiU+JfAYzj+jbw2vgQKgq5HrUr8qs+vgtiEL5dOH6sEweI+PNt2D7AqrDSHyqQ== + dependencies: + "@babel/helper-plugin-utils" "^7.25.9" + "@babel/helper-validator-option" "^7.25.9" + "@babel/plugin-transform-flow-strip-types" "^7.25.9" + +"@babel/preset-typescript@^7.13.0": + version "7.26.0" + resolved "https://registry.yarnpkg.com/@babel/preset-typescript/-/preset-typescript-7.26.0.tgz#4a570f1b8d104a242d923957ffa1eaff142a106d" + integrity sha512-NMk1IGZ5I/oHhoXEElcm+xUnL/szL6xflkFZmoEU9xj1qSJXpiS7rsspYo92B4DRCDvZn2erT5LdsCeXAKNCkg== + dependencies: + "@babel/helper-plugin-utils" "^7.25.9" + "@babel/helper-validator-option" "^7.25.9" + "@babel/plugin-syntax-jsx" "^7.25.9" + "@babel/plugin-transform-modules-commonjs" "^7.25.9" + "@babel/plugin-transform-typescript" "^7.25.9" + +"@babel/register@^7.0.0", "@babel/register@^7.13.16": version "7.25.9" resolved "https://registry.yarnpkg.com/@babel/register/-/register-7.25.9.tgz#1c465acf7dc983d70ccc318eb5b887ecb04f021b" integrity sha512-8D43jXtGsYmEeDvm4MWHYUpWf8iiXgWYx3fW7E7Wb7Oe6FWqJPl5K6TuFW0dOwNZzEE5rjlaSJYH9JjrUKJszA== @@ -675,7 +755,7 @@ "@babel/parser" "^7.25.9" "@babel/types" "^7.25.9" -"@babel/traverse@^7.0.0": +"@babel/traverse@^7.0.0", "@babel/traverse@^7.20.0": version "7.26.4" resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.26.4.tgz#ac3a2a84b908dde6d463c3bfa2c5fdc1653574bd" integrity sha512-fH+b7Y4p3yqvApJALCPJcwb0/XaOSgtK4pzV6WVjPR5GLFQBRI7pfoX2V2iM48NXvX07NUxxm1Vw98YjqTcU5w== @@ -709,7 +789,7 @@ "@babel/helper-string-parser" "^7.25.9" "@babel/helper-validator-identifier" "^7.25.9" -"@babel/types@^7.26.3": +"@babel/types@^7.20.0", "@babel/types@^7.24.7", "@babel/types@^7.26.3": version "7.26.3" resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.26.3.tgz#37e79830f04c2b5687acc77db97fbc75fb81f3c0" integrity sha512-vN5p+1kl59GVKMvTHt55NzzmYVxprfJD+ql7U9NFIfKCBkYE55LYtS+WtPlaYOyzydrKI8Nezd+aZextrd+FMA== @@ -1148,6 +1228,13 @@ slash "^3.0.0" strip-ansi "^6.0.0" +"@jest/create-cache-key-function@^29.2.1": + version "29.7.0" + resolved "https://registry.yarnpkg.com/@jest/create-cache-key-function/-/create-cache-key-function-29.7.0.tgz#793be38148fab78e65f40ae30c36785f4ad859f0" + integrity sha512-4QqS3LY5PBmTRHj9sAg1HLoPzqAI0uOX6wI/TRqHIcOxlFidy6YEmCQJk6FSZjNLGCeubDMfmkWL+qaLKhSGQA== + dependencies: + "@jest/types" "^29.6.3" + "@jest/environment@^29.7.0": version "29.7.0" resolved "https://registry.yarnpkg.com/@jest/environment/-/environment-29.7.0.tgz#24d61f54ff1f786f3cd4073b4b94416383baf2a7" @@ -1328,6 +1415,28 @@ "@types/yargs" "^15.0.0" chalk "^3.0.0" +"@jest/types@^26.6.2": + version "26.6.2" + resolved "https://registry.yarnpkg.com/@jest/types/-/types-26.6.2.tgz#bef5a532030e1d88a2f5a6d933f84e97226ed48e" + integrity sha512-fC6QCp7Sc5sX6g8Tvbmj4XUTbyrik0akgRy03yjXbQaBWWNWGE7SGtJk98m0N8nzegD/7SggrUlivxo5ax4KWQ== + dependencies: + "@types/istanbul-lib-coverage" "^2.0.0" + "@types/istanbul-reports" "^3.0.0" + "@types/node" "*" + "@types/yargs" "^15.0.0" + chalk "^4.0.0" + +"@jest/types@^27.5.1": + version "27.5.1" + resolved "https://registry.yarnpkg.com/@jest/types/-/types-27.5.1.tgz#3c79ec4a8ba61c170bf937bcf9e98a9df175ec80" + integrity sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw== + dependencies: + "@types/istanbul-lib-coverage" "^2.0.0" + "@types/istanbul-reports" "^3.0.0" + "@types/node" "*" + "@types/yargs" "^16.0.0" + chalk "^4.0.0" + "@jest/types@^29.6.3": version "29.6.3" resolved "https://registry.yarnpkg.com/@jest/types/-/types-29.6.3.tgz#1131f8cf634e7e84c5e77bab12f052af585fba59" @@ -2274,6 +2383,35 @@ dependencies: "@swc/helpers" "^0.5.0" +"@react-native-community/cli-clean@11.3.7": + version "11.3.7" + resolved "https://registry.yarnpkg.com/@react-native-community/cli-clean/-/cli-clean-11.3.7.tgz#cb4c2f225f78593412c2d191b55b8570f409a48f" + integrity sha512-twtsv54ohcRyWVzPXL3F9VHGb4Qhn3slqqRs3wEuRzjR7cTmV2TIO2b1VhaqF4HlCgNd+cGuirvLtK2JJyaxMg== + dependencies: + "@react-native-community/cli-tools" "11.3.7" + chalk "^4.1.2" + execa "^5.0.0" + prompts "^2.4.0" + +"@react-native-community/cli-config@11.3.7": + version "11.3.7" + resolved "https://registry.yarnpkg.com/@react-native-community/cli-config/-/cli-config-11.3.7.tgz#4ce95548252ecb094b576369abebf9867c95d277" + integrity sha512-FDBLku9xskS+bx0YFJFLCmUJhEZ4/MMSC9qPYOGBollWYdgE7k/TWI0IeYFmMALAnbCdKQAYP5N29N55Tad8lg== + dependencies: + "@react-native-community/cli-tools" "11.3.7" + chalk "^4.1.2" + cosmiconfig "^5.1.0" + deepmerge "^4.3.0" + glob "^7.1.3" + joi "^17.2.1" + +"@react-native-community/cli-debugger-ui@11.3.7": + version "11.3.7" + resolved "https://registry.yarnpkg.com/@react-native-community/cli-debugger-ui/-/cli-debugger-ui-11.3.7.tgz#2147b73313af8de3c9b396406d5d344b904cf2bb" + integrity sha512-aVmKuPKHZENR8SrflkMurZqeyLwbKieHdOvaZCh1Nn/0UC5CxWcyST2DB2XQboZwsvr3/WXKJkSUO+SZ1J9qTQ== + dependencies: + serve-static "^1.13.1" + "@react-native-community/cli-debugger-ui@^4.13.1": version "4.13.1" resolved "https://registry.yarnpkg.com/@react-native-community/cli-debugger-ui/-/cli-debugger-ui-4.13.1.tgz#07de6d4dab80ec49231de1f1fbf658b4ad39b32c" @@ -2281,6 +2419,41 @@ dependencies: serve-static "^1.13.1" +"@react-native-community/cli-doctor@11.3.7": + version "11.3.7" + resolved "https://registry.yarnpkg.com/@react-native-community/cli-doctor/-/cli-doctor-11.3.7.tgz#7d5f5b1aea78134bba713fa97795986345ff1344" + integrity sha512-YEHUqWISOHnsl5+NM14KHelKh68Sr5/HeEZvvNdIcvcKtZic3FU7Xd1WcbNdo3gCq5JvzGFfufx02Tabh5zmrg== + dependencies: + "@react-native-community/cli-config" "11.3.7" + "@react-native-community/cli-platform-android" "11.3.7" + "@react-native-community/cli-platform-ios" "11.3.7" + "@react-native-community/cli-tools" "11.3.7" + chalk "^4.1.2" + command-exists "^1.2.8" + envinfo "^7.7.2" + execa "^5.0.0" + hermes-profile-transformer "^0.0.6" + ip "^1.1.5" + node-stream-zip "^1.9.1" + ora "^5.4.1" + prompts "^2.4.0" + semver "^7.5.2" + strip-ansi "^5.2.0" + sudo-prompt "^9.0.0" + wcwidth "^1.0.1" + yaml "^2.2.1" + +"@react-native-community/cli-hermes@11.3.7": + version "11.3.7" + resolved "https://registry.yarnpkg.com/@react-native-community/cli-hermes/-/cli-hermes-11.3.7.tgz#091e730a1f8bace6c3729e8744bad6141002e0e8" + integrity sha512-chkKd8n/xeZkinRvtH6QcYA8rjNOKU3S3Lw/3Psxgx+hAYV0Gyk95qJHTalx7iu+PwjOOqqvCkJo5jCkYLkoqw== + dependencies: + "@react-native-community/cli-platform-android" "11.3.7" + "@react-native-community/cli-tools" "11.3.7" + chalk "^4.1.2" + hermes-profile-transformer "^0.0.6" + ip "^1.1.5" + "@react-native-community/cli-hermes@^4.13.0": version "4.13.0" resolved "https://registry.yarnpkg.com/@react-native-community/cli-hermes/-/cli-hermes-4.13.0.tgz#6243ed9c709dad5e523f1ccd7d21066b32f2899d" @@ -2292,6 +2465,17 @@ hermes-profile-transformer "^0.0.6" ip "^1.1.5" +"@react-native-community/cli-platform-android@11.3.7": + version "11.3.7" + resolved "https://registry.yarnpkg.com/@react-native-community/cli-platform-android/-/cli-platform-android-11.3.7.tgz#7845bc48258b6bb55df208a23b3690647f113995" + integrity sha512-WGtXI/Rm178UQb8bu1TAeFC/RJvYGnbHpULXvE20GkmeJ1HIrMjkagyk6kkY3Ej25JAP2R878gv+TJ/XiRhaEg== + dependencies: + "@react-native-community/cli-tools" "11.3.7" + chalk "^4.1.2" + execa "^5.0.0" + glob "^7.1.3" + logkitty "^0.7.1" + "@react-native-community/cli-platform-android@^4.10.0", "@react-native-community/cli-platform-android@^4.13.0": version "4.13.0" resolved "https://registry.yarnpkg.com/@react-native-community/cli-platform-android/-/cli-platform-android-4.13.0.tgz#922681ec82ee1aadd993598b814df1152118be02" @@ -2308,6 +2492,18 @@ slash "^3.0.0" xmldoc "^1.1.2" +"@react-native-community/cli-platform-ios@11.3.7": + version "11.3.7" + resolved "https://registry.yarnpkg.com/@react-native-community/cli-platform-ios/-/cli-platform-ios-11.3.7.tgz#87478f907634713b7236c77870446a5ca1f35ff1" + integrity sha512-Z/8rseBput49EldX7MogvN6zJlWzZ/4M97s2P+zjS09ZoBU7I0eOKLi0N9wx+95FNBvGQQ/0P62bB9UaFQH2jw== + dependencies: + "@react-native-community/cli-tools" "11.3.7" + chalk "^4.1.2" + execa "^5.0.0" + fast-xml-parser "^4.0.12" + glob "^7.1.3" + ora "^5.4.1" + "@react-native-community/cli-platform-ios@^4.10.0": version "4.13.0" resolved "https://registry.yarnpkg.com/@react-native-community/cli-platform-ios/-/cli-platform-ios-4.13.0.tgz#a738915c68cac86df54e578b59a1311ea62b1aef" @@ -2321,6 +2517,38 @@ plist "^3.0.1" xcode "^2.0.0" +"@react-native-community/cli-plugin-metro@11.3.7": + version "11.3.7" + resolved "https://registry.yarnpkg.com/@react-native-community/cli-plugin-metro/-/cli-plugin-metro-11.3.7.tgz#2e8a9deb30b40495c5c1347a1837a824400fa00f" + integrity sha512-0WhgoBVGF1f9jXcuagQmtxpwpfP+2LbLZH4qMyo6OtYLWLG13n2uRep+8tdGzfNzl1bIuUTeE9yZSAdnf9LfYQ== + dependencies: + "@react-native-community/cli-server-api" "11.3.7" + "@react-native-community/cli-tools" "11.3.7" + chalk "^4.1.2" + execa "^5.0.0" + metro "0.76.8" + metro-config "0.76.8" + metro-core "0.76.8" + metro-react-native-babel-transformer "0.76.8" + metro-resolver "0.76.8" + metro-runtime "0.76.8" + readline "^1.3.0" + +"@react-native-community/cli-server-api@11.3.7": + version "11.3.7" + resolved "https://registry.yarnpkg.com/@react-native-community/cli-server-api/-/cli-server-api-11.3.7.tgz#2cce54b3331c9c51b9067129c297ab2e9a142216" + integrity sha512-yoFyGdvR3HxCnU6i9vFqKmmSqFzCbnFSnJ29a+5dppgPRetN+d//O8ard/YHqHzToFnXutAFf2neONn23qcJAg== + dependencies: + "@react-native-community/cli-debugger-ui" "11.3.7" + "@react-native-community/cli-tools" "11.3.7" + compression "^1.7.1" + connect "^3.6.5" + errorhandler "^1.5.1" + nocache "^3.0.1" + pretty-format "^26.6.2" + serve-static "^1.13.1" + ws "^7.5.1" + "@react-native-community/cli-server-api@^4.13.1": version "4.13.1" resolved "https://registry.yarnpkg.com/@react-native-community/cli-server-api/-/cli-server-api-4.13.1.tgz#bee7ee9702afce848e9d6ca3dcd5669b99b125bd" @@ -2336,6 +2564,21 @@ serve-static "^1.13.1" ws "^1.1.0" +"@react-native-community/cli-tools@11.3.7": + version "11.3.7" + resolved "https://registry.yarnpkg.com/@react-native-community/cli-tools/-/cli-tools-11.3.7.tgz#37aa7efc7b4a1b7077d541f1d7bb11a2ab7b6ff2" + integrity sha512-peyhP4TV6Ps1hk+MBHTFaIR1eI3u+OfGBvr5r0wPwo3FAJvldRinMgcB/TcCcOBXVORu7ba1XYjkubPeYcqAyA== + dependencies: + appdirsjs "^1.2.4" + chalk "^4.1.2" + find-up "^5.0.0" + mime "^2.4.1" + node-fetch "^2.6.0" + open "^6.2.0" + ora "^5.4.1" + semver "^7.5.2" + shell-quote "^1.7.3" + "@react-native-community/cli-tools@^4.13.0": version "4.13.0" resolved "https://registry.yarnpkg.com/@react-native-community/cli-tools/-/cli-tools-4.13.0.tgz#b406463d33af16cedc4305a9a9257ed32845cf1b" @@ -2348,11 +2591,41 @@ open "^6.2.0" shell-quote "1.6.1" +"@react-native-community/cli-types@11.3.7": + version "11.3.7" + resolved "https://registry.yarnpkg.com/@react-native-community/cli-types/-/cli-types-11.3.7.tgz#12fe7cff3da08bd27e11116531b2e001939854b9" + integrity sha512-OhSr/TiDQkXjL5YOs8+hvGSB+HltLn5ZI0+A3DCiMsjUgTTsYh+Z63OtyMpNjrdCEFcg0MpfdU2uxstCS6Dc5g== + dependencies: + joi "^17.2.1" + "@react-native-community/cli-types@^4.10.1": version "4.10.1" resolved "https://registry.yarnpkg.com/@react-native-community/cli-types/-/cli-types-4.10.1.tgz#d68a2dcd1649d3b3774823c64e5e9ce55bfbe1c9" integrity sha512-ael2f1onoPF3vF7YqHGWy7NnafzGu+yp88BbFbP0ydoCP2xGSUzmZVw0zakPTC040Id+JQ9WeFczujMkDy6jYQ== +"@react-native-community/cli@11.3.7": + version "11.3.7" + resolved "https://registry.yarnpkg.com/@react-native-community/cli/-/cli-11.3.7.tgz#564c0054269d8385fa9d301750b2e56dbb5c0cc9" + integrity sha512-Ou8eDlF+yh2rzXeCTpMPYJ2fuqsusNOhmpYPYNQJQ2h6PvaF30kPomflgRILems+EBBuggRtcT+I+1YH4o/q6w== + dependencies: + "@react-native-community/cli-clean" "11.3.7" + "@react-native-community/cli-config" "11.3.7" + "@react-native-community/cli-debugger-ui" "11.3.7" + "@react-native-community/cli-doctor" "11.3.7" + "@react-native-community/cli-hermes" "11.3.7" + "@react-native-community/cli-plugin-metro" "11.3.7" + "@react-native-community/cli-server-api" "11.3.7" + "@react-native-community/cli-tools" "11.3.7" + "@react-native-community/cli-types" "11.3.7" + chalk "^4.1.2" + commander "^9.4.1" + execa "^5.0.0" + find-up "^4.1.0" + fs-extra "^8.1.0" + graceful-fs "^4.1.3" + prompts "^2.4.0" + semver "^7.5.2" + "@react-native-community/cli@^4.10.0": version "4.14.0" resolved "https://registry.yarnpkg.com/@react-native-community/cli/-/cli-4.14.0.tgz#bb106a98341bfa2db36060091ff90bfe82ea4f55" @@ -2394,6 +2667,52 @@ sudo-prompt "^9.0.0" wcwidth "^1.0.1" +"@react-native/assets-registry@^0.72.0": + version "0.72.0" + resolved "https://registry.yarnpkg.com/@react-native/assets-registry/-/assets-registry-0.72.0.tgz#c82a76a1d86ec0c3907be76f7faf97a32bbed05d" + integrity sha512-Im93xRJuHHxb1wniGhBMsxLwcfzdYreSZVQGDoMJgkd6+Iky61LInGEHnQCTN0fKNYF1Dvcofb4uMmE1RQHXHQ== + +"@react-native/codegen@^0.72.7": + version "0.72.8" + resolved "https://registry.yarnpkg.com/@react-native/codegen/-/codegen-0.72.8.tgz#0593f628e1310f430450a9479fbb4be35e7b63d6" + integrity sha512-jQCcBlXV7B7ap5VlHhwIPieYz89yiRgwd2FPUBu+unz+kcJ6pAiB2U8RdLDmyIs8fiWd+Vq1xxaWs4TR329/ng== + dependencies: + "@babel/parser" "^7.20.0" + flow-parser "^0.206.0" + glob "^7.1.1" + invariant "^2.2.4" + jscodeshift "^0.14.0" + mkdirp "^0.5.1" + nullthrows "^1.1.1" + +"@react-native/gradle-plugin@^0.72.11": + version "0.72.11" + resolved "https://registry.yarnpkg.com/@react-native/gradle-plugin/-/gradle-plugin-0.72.11.tgz#c063ef12778706611de7a1e42b74b14d9405fb9f" + integrity sha512-P9iRnxiR2w7EHcZ0mJ+fmbPzMby77ZzV6y9sJI3lVLJzF7TLSdbwcQyD3lwMsiL+q5lKUHoZJS4sYmih+P2HXw== + +"@react-native/js-polyfills@^0.72.1": + version "0.72.1" + resolved "https://registry.yarnpkg.com/@react-native/js-polyfills/-/js-polyfills-0.72.1.tgz#905343ef0c51256f128256330fccbdb35b922291" + integrity sha512-cRPZh2rBswFnGt5X5EUEPs0r+pAsXxYsifv/fgy9ZLQokuT52bPH+9xjDR+7TafRua5CttGW83wP4TntRcWNDA== + +"@react-native/normalize-colors@*": + version "0.76.5" + resolved "https://registry.yarnpkg.com/@react-native/normalize-colors/-/normalize-colors-0.76.5.tgz#a33560736311aefcf1d3cb594597befe81a9a53c" + integrity sha512-6QRLEok1r55gLqj+94mEWUENuU5A6wsr2OoXpyq/CgQ7THWowbHtru/kRGRr6o3AQXrVnZheR60JNgFcpNYIug== + +"@react-native/normalize-colors@^0.72.0": + version "0.72.0" + resolved "https://registry.yarnpkg.com/@react-native/normalize-colors/-/normalize-colors-0.72.0.tgz#14294b7ed3c1d92176d2a00df48456e8d7d62212" + integrity sha512-285lfdqSXaqKuBbbtP9qL2tDrfxdOFtIMvkKadtleRQkdOxx+uzGvFr82KHmc/sSiMtfXGp7JnFYWVh4sFl7Yw== + +"@react-native/virtualized-lists@^0.72.8": + version "0.72.8" + resolved "https://registry.yarnpkg.com/@react-native/virtualized-lists/-/virtualized-lists-0.72.8.tgz#a2c6a91ea0f1d40eb5a122fb063daedb92ed1dc3" + integrity sha512-J3Q4Bkuo99k7mu+jPS9gSUSgq+lLRSI/+ahXNwV92XgJ/8UgOTxu2LPwhJnBk/sQKxq7E8WkZBnBiozukQMqrw== + dependencies: + invariant "^2.2.4" + nullthrows "^1.1.1" + "@redux-saga/core@^1.3.0": version "1.3.0" resolved "https://registry.yarnpkg.com/@redux-saga/core/-/core-1.3.0.tgz#2ce08b73d407fc6ea9e7f7d83d2e97d981a3a8b8" @@ -3238,6 +3557,13 @@ dependencies: "@types/yargs-parser" "*" +"@types/yargs@^16.0.0": + version "16.0.9" + resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-16.0.9.tgz#ba506215e45f7707e6cbcaf386981155b7ab956e" + integrity sha512-tHhzvkFXZQeTECenFoRljLBYPZJ7jAVxqqtEI0qTLOmuultnFp4I9yKE17vTuhf7BkhCu7I4XuemPgikDVuYqA== + dependencies: + "@types/yargs-parser" "*" + "@types/yargs@^17.0.8": version "17.0.19" resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-17.0.19.tgz#8dbecdc9ab48bee0cb74f6e3327de3fa0d0c98ae" @@ -3467,7 +3793,7 @@ absolute-path@^0.0.0: resolved "https://registry.yarnpkg.com/absolute-path/-/absolute-path-0.0.0.tgz#a78762fbdadfb5297be99b15d35a785b2f095bf7" integrity sha512-HQiug4c+/s3WOvEnDRxXVmNtSG5s2gJM9r19BTcqjp7BWcE48PB+Y2G6jE65kqI0LpsQeMZygt/b60Gi4KxGyA== -accepts@~1.3.5, accepts@~1.3.7, accepts@~1.3.8: +accepts@^1.3.7, accepts@~1.3.5, accepts@~1.3.7, accepts@~1.3.8: version "1.3.8" resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.8.tgz#0bf0be125b67014adcb0b0921e62db7bffe16b2e" integrity sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw== @@ -3674,6 +4000,11 @@ app-module-path@^2.2.0: resolved "https://registry.yarnpkg.com/app-module-path/-/app-module-path-2.2.0.tgz#641aa55dfb7d6a6f0a8141c4b9c0aa50b6c24dd5" integrity sha512-gkco+qxENJV+8vFcDiiFhuoSvRXb2a/QPqpSoWhVz829VNJfOTnELbBmPmNKFxf3xdNnw4DWCkzkDaavcX/1YQ== +appdirsjs@^1.2.4: + version "1.2.7" + resolved "https://registry.yarnpkg.com/appdirsjs/-/appdirsjs-1.2.7.tgz#50b4b7948a26ba6090d4aede2ae2dc2b051be3b3" + integrity sha512-Quji6+8kLBC3NnBeo14nPDq0+2jUs5s3/xEye+udFHumHhRk4M7aAMXp/PBJqkKYGuuyR9M/6Dq7d2AViiGmhw== + aproba@2.0.0, "aproba@^1.0.3 || ^2.0.0": version "2.0.0" resolved "https://registry.yarnpkg.com/aproba/-/aproba-2.0.0.tgz#52520b8ae5b569215b354efc0caa3fe1e45a8adc" @@ -3915,6 +4246,13 @@ ast-module-types@^5.0.0: resolved "https://registry.yarnpkg.com/ast-module-types/-/ast-module-types-5.0.0.tgz#32b2b05c56067ff38e95df66f11d6afd6c9ba16b" integrity sha512-JvqziE0Wc0rXQfma0HZC/aY7URXHFuZV84fJRtP8u+lhp0JYCNd5wJzVXP45t0PH0Mej3ynlzvdyITYIu0G4LQ== +ast-types@0.15.2: + version "0.15.2" + resolved "https://registry.yarnpkg.com/ast-types/-/ast-types-0.15.2.tgz#39ae4809393c4b16df751ee563411423e85fb49d" + integrity sha512-c27loCv9QkZinsa5ProX751khO9DJl/AcB5c2KNtA6NRvHKS0PgLfcftz72KVq504vB0Gku5s2kUZzDBvQWvHg== + dependencies: + tslib "^2.0.1" + astral-regex@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-1.0.0.tgz#6c8c3fb827dd43ee3918f27b82782ab7658a6fd9" @@ -3925,6 +4263,11 @@ astral-regex@^2.0.0: resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-2.0.0.tgz#483143c567aeed4785759c0865786dc77d7d2e31" integrity sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ== +async-limiter@~1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/async-limiter/-/async-limiter-1.0.1.tgz#dd379e94f0db8310b08291f9d64c3209766617fd" + integrity sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ== + async@^2.4.0: version "2.6.4" resolved "https://registry.yarnpkg.com/async/-/async-2.6.4.tgz#706b7ff6084664cd7eae713f6f965433b5504221" @@ -3932,7 +4275,7 @@ async@^2.4.0: dependencies: lodash "^4.17.14" -async@^3.2.0, async@^3.2.3: +async@^3.2.0, async@^3.2.2, async@^3.2.3: version "3.2.6" resolved "https://registry.yarnpkg.com/async/-/async-3.2.6.tgz#1b0728e14929d51b85b449b7f06e27c1145e38ce" integrity sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA== @@ -3985,6 +4328,11 @@ axios@^1.7.4, axios@^1.7.7: form-data "^4.0.0" proxy-from-env "^1.1.0" +babel-core@^7.0.0-bridge.0: + version "7.0.0-bridge.0" + resolved "https://registry.yarnpkg.com/babel-core/-/babel-core-7.0.0-bridge.0.tgz#95a492ddd90f9b4e9a4a1da14eb335b87b634ece" + integrity sha512-poPX9mZH/5CSanm50Q+1toVci6pv5KSRv/5TWCwtzQS5XEwn40BcCrgIeMFWP9CKKIniKXNxoIOnOq4VVlGXhg== + babel-jest@^29.7.0: version "29.7.0" resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-29.7.0.tgz#f4369919225b684c56085998ac63dbd05be020d5" @@ -4048,6 +4396,13 @@ babel-plugin-syntax-trailing-function-commas@^7.0.0-beta.0: resolved "https://registry.yarnpkg.com/babel-plugin-syntax-trailing-function-commas/-/babel-plugin-syntax-trailing-function-commas-7.0.0-beta.0.tgz#aa213c1435e2bffeb6fca842287ef534ad05d5cf" integrity sha512-Xj9XuRuz3nTSbaTXWv3itLOcxyF4oPD8douBBmj7U9BBC6nEBYfyOJYQMf/8PJAFotC62UY5dFfIGEPr7WswzQ== +babel-plugin-transform-flow-enums@^0.0.2: + version "0.0.2" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-flow-enums/-/babel-plugin-transform-flow-enums-0.0.2.tgz#d1d0cc9bdc799c850ca110d0ddc9f21b9ec3ef25" + integrity sha512-g4aaCrDDOsWjbm0PUUeVnkcVd6AKJsVc/MbnPhEotEpkeJQP6b8nzewohQi7+QS8UyPehOhGWn0nOwjvWpmMvQ== + dependencies: + "@babel/plugin-syntax-flow" "^7.12.1" + babel-preset-current-node-syntax@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz#b4399239b89b2a011f9ddbe3e4f401fc40cff73b" @@ -4066,7 +4421,7 @@ babel-preset-current-node-syntax@^1.0.0: "@babel/plugin-syntax-optional-chaining" "^7.8.3" "@babel/plugin-syntax-top-level-await" "^7.8.3" -babel-preset-fbjs@^3.2.0, babel-preset-fbjs@^3.3.0: +babel-preset-fbjs@^3.2.0, babel-preset-fbjs@^3.3.0, babel-preset-fbjs@^3.4.0: version "3.4.0" resolved "https://registry.yarnpkg.com/babel-preset-fbjs/-/babel-preset-fbjs-3.4.0.tgz#38a14e5a7a3b285a3f3a86552d650dca5cf6111c" integrity sha512-9ywCsCvo1ojrw0b+XYk7aFvTH6D9064t0RIL1rtMf3nsa02Xw41MS7sZw216Im35xj/UY0PDBQsa1brUDDF1Ow== @@ -5378,6 +5733,11 @@ deepmerge@^4.2.2: resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-4.2.2.tgz#44d2ea3679b8f4d4ffba33f03d865fc1e7bf4955" integrity sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg== +deepmerge@^4.3.0: + version "4.3.1" + resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-4.3.1.tgz#44b5f2147cd3b00d4b56137685966f26fd25dd4a" + integrity sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A== + defaults@^1.0.3: version "1.0.4" resolved "https://registry.yarnpkg.com/defaults/-/defaults-1.0.4.tgz#b0b02062c1e2aa62ff5d9528f0f98baa90978d7a" @@ -5460,6 +5820,15 @@ dependency-tree@^10.0.9: precinct "^11.0.5" typescript "^5.0.4" +deprecated-react-native-prop-types@4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/deprecated-react-native-prop-types/-/deprecated-react-native-prop-types-4.1.0.tgz#8ed03a64c21b7fbdd2d000957b6838d4f38d2c66" + integrity sha512-WfepZHmRbbdTvhcolb8aOKEvQdcmTMn5tKLbqbXmkBvjFjRVWAYqsXk/DBsV8TZxws8SdGHLuHaJrHSQUPRdfw== + dependencies: + "@react-native/normalize-colors" "*" + invariant "*" + prop-types "*" + deprecation@^2.0.0: version "2.3.1" resolved "https://registry.yarnpkg.com/deprecation/-/deprecation-2.3.1.tgz#6368cbdb40abf3373b525ac87e4a260c3a700919" @@ -5797,7 +6166,7 @@ error-stack-parser@^2.0.6: dependencies: stackframe "^1.3.4" -errorhandler@^1.5.0: +errorhandler@^1.5.0, errorhandler@^1.5.1: version "1.5.1" resolved "https://registry.yarnpkg.com/errorhandler/-/errorhandler-1.5.1.tgz#b9ba5d17cf90744cd1e851357a6e75bf806a9a91" integrity sha512-rcOwbfvP1WTViVoUjcfZicVzjhjTuhSMntHh6mW3IrEiyE6mJyXvsToJUJGlGlw/2xU9P5whlWNGlIDVeCiT4A== @@ -6178,7 +6547,7 @@ espree@^9.6.0, espree@^9.6.1: acorn-jsx "^5.3.2" eslint-visitor-keys "^3.4.1" -esprima@^4.0.0, esprima@^4.0.1: +esprima@^4.0.0, esprima@^4.0.1, esprima@~4.0.0: version "4.0.1" resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== @@ -6532,6 +6901,13 @@ fast-levenshtein@^2.0.6, fast-levenshtein@~2.0.6: resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw== +fast-xml-parser@^4.0.12: + version "4.5.1" + resolved "https://registry.yarnpkg.com/fast-xml-parser/-/fast-xml-parser-4.5.1.tgz#a7e665ff79b7919100a5202f23984b6150f9b31e" + integrity sha512-y655CeyUQ+jj7KBbYMc4FG01V8ZQqjN+gDYGJ50RtfsUB8iG9AmwmwoAgeKLJdmueKKMrH1RJ7yXHTSoczdv5w== + dependencies: + strnum "^1.0.5" + fastq@^1.6.0: version "1.15.0" resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.15.0.tgz#d04d07c6a2a68fe4599fea8d2e103a937fae6b3a" @@ -6744,6 +7120,21 @@ flatted@^3.1.0: resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.2.7.tgz#609f39207cb614b89d0765b477cb2d437fbf9787" integrity sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ== +flow-enums-runtime@^0.0.5: + version "0.0.5" + resolved "https://registry.yarnpkg.com/flow-enums-runtime/-/flow-enums-runtime-0.0.5.tgz#95884bfcc82edaf27eef7e1dd09732331cfbafbc" + integrity sha512-PSZF9ZuaZD03sT9YaIs0FrGJ7lSUw7rHZIex+73UYVXg46eL/wxN5PaVcPJFudE2cJu5f0fezitV5aBkLHPUOQ== + +flow-parser@0.*: + version "0.258.0" + resolved "https://registry.yarnpkg.com/flow-parser/-/flow-parser-0.258.0.tgz#63175ba97cfb6f5e8b6204463d25d14ec552abf5" + integrity sha512-/f3ui3WaPTRUtqnWaGzf/f352hn4VhqGOiuSVkgaW6SbHNp5EwdDoh6BF3zB9A6kcWhCpg/0x0A3aXU+KXugAA== + +flow-parser@^0.206.0: + version "0.206.0" + resolved "https://registry.yarnpkg.com/flow-parser/-/flow-parser-0.206.0.tgz#f4f794f8026535278393308e01ea72f31000bfef" + integrity sha512-HVzoK3r6Vsg+lKvlIZzaWNBVai+FXTX1wdYhz/wVlH13tb/gOdLXmlTqy6odmTBhT5UoWUbq0k8263Qhr9d88w== + fn.name@1.x.x: version "1.1.0" resolved "https://registry.yarnpkg.com/fn.name/-/fn.name-1.1.0.tgz#26cad8017967aea8731bc42961d04a3d5988accc" @@ -7138,7 +7529,7 @@ glob@^11.0.0, glob@~11.0.0: package-json-from-dist "^1.0.0" path-scurry "^2.0.0" -glob@^7.1.3, glob@^7.1.4, glob@^7.2.3: +glob@^7.1.1, glob@^7.1.3, glob@^7.1.4, glob@^7.2.3: version "7.2.3" resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== @@ -7347,6 +7738,18 @@ hermes-engine@~0.5.0: resolved "https://registry.yarnpkg.com/hermes-engine/-/hermes-engine-0.5.1.tgz#601115e4b1e0a17d9aa91243b96277de4e926e09" integrity sha512-hLwqh8dejHayjlpvZY40e1aDCDvyP98cWx/L5DhAjSJLH8g4z9Tp08D7y4+3vErDsncPOdf1bxm+zUWpx0/Fxg== +hermes-estree@0.12.0: + version "0.12.0" + resolved "https://registry.yarnpkg.com/hermes-estree/-/hermes-estree-0.12.0.tgz#8a289f9aee854854422345e6995a48613bac2ca8" + integrity sha512-+e8xR6SCen0wyAKrMT3UD0ZCCLymKhRgjEB5sS28rKiFir/fXgLoeRilRUssFCILmGHb+OvHDUlhxs0+IEyvQw== + +hermes-parser@0.12.0: + version "0.12.0" + resolved "https://registry.yarnpkg.com/hermes-parser/-/hermes-parser-0.12.0.tgz#114dc26697cfb41a6302c215b859b74224383773" + integrity sha512-d4PHnwq6SnDLhYl3LHNHvOg7nQ6rcI7QVil418REYksv0Mh3cEkHDcuhGxNQ3vgnLSLl4QSvDrFCwQNYdpWlzw== + dependencies: + hermes-estree "0.12.0" + hermes-profile-transformer@^0.0.6: version "0.0.6" resolved "https://registry.yarnpkg.com/hermes-profile-transformer/-/hermes-profile-transformer-0.0.6.tgz#bd0f5ecceda80dd0ddaae443469ab26fb38fc27b" @@ -7516,6 +7919,13 @@ image-size@^0.6.0: resolved "https://registry.yarnpkg.com/image-size/-/image-size-0.6.3.tgz#e7e5c65bb534bd7cdcedd6cb5166272a85f75fb2" integrity sha512-47xSUiQioGaB96nqtp5/q55m0aBQSQdyIloMOc/x+QVTDZLNmXE892IIDrJ0hM1A5vcNUDD5tDffkSP5lCaIIA== +image-size@^1.0.2: + version "1.2.0" + resolved "https://registry.yarnpkg.com/image-size/-/image-size-1.2.0.tgz#312af27a2ff4ff58595ad00b9344dd684c910df6" + integrity sha512-4S8fwbO6w3GeCVN6OPtA9I5IGKkcDMPcKndtUlpJuCwu7JLjtj7JZpwqLuyY2nrmQT3AWsCJLSKPsc2mPBSl3w== + dependencies: + queue "6.0.2" + immer@^10.0.3: version "10.1.1" resolved "https://registry.yarnpkg.com/immer/-/immer-10.1.1.tgz#206f344ea372d8ea176891545ee53ccc062db7bc" @@ -7676,7 +8086,7 @@ internal-slot@^1.0.3, internal-slot@^1.0.5, internal-slot@^1.0.7: hasown "^2.0.0" side-channel "^1.0.4" -invariant@^2.2.4: +invariant@*, invariant@^2.2.4: version "2.2.4" resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.4.tgz#610f3c92c9359ce1db616e538008d23ff35158e6" integrity sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA== @@ -8409,7 +8819,7 @@ jest-environment-jsdom@^29.3.1: jest-util "^29.7.0" jsdom "^20.0.0" -jest-environment-node@^29.7.0: +jest-environment-node@^29.2.1, jest-environment-node@^29.7.0: version "29.7.0" resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-29.7.0.tgz#0b93e111dda8ec120bc8300e6d1fb9576e164376" integrity sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw== @@ -8537,6 +8947,11 @@ jest-pnp-resolver@^1.2.2: resolved "https://registry.yarnpkg.com/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz#930b1546164d4ad5937d5540e711d4d38d4cad2e" integrity sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w== +jest-regex-util@^27.0.6: + version "27.5.1" + resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-27.5.1.tgz#4da143f7e9fd1e542d4aa69617b38e4a78365b95" + integrity sha512-4bfKq2zie+x16okqDXjXn9ql2B0dScQu+vcwe4TvFVhkVyuWLqpZrZtXxLLWoXYgn0E87I6r6GRYHF7wFZBUvg== + jest-regex-util@^29.6.3: version "29.6.3" resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-29.6.3.tgz#4a556d9c776af68e1c5f48194f4d0327d24e8a52" @@ -8669,6 +9084,18 @@ jest-util@^24.9.0: slash "^2.0.0" source-map "^0.6.0" +jest-util@^27.2.0: + version "27.5.1" + resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-27.5.1.tgz#3ba9771e8e31a0b85da48fe0b0891fb86c01c2f9" + integrity sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw== + dependencies: + "@jest/types" "^27.5.1" + "@types/node" "*" + chalk "^4.0.0" + ci-info "^3.2.0" + graceful-fs "^4.2.9" + picomatch "^2.2.3" + jest-util@^29.0.0, jest-util@^29.7.0: version "29.7.0" resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-29.7.0.tgz#23c2b62bfb22be82b44de98055802ff3710fc0bc" @@ -8693,7 +9120,7 @@ jest-validate@^24.9.0: leven "^3.1.0" pretty-format "^24.9.0" -jest-validate@^29.7.0: +jest-validate@^29.2.1, jest-validate@^29.7.0: version "29.7.0" resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-29.7.0.tgz#7bf705511c64da591d46b15fce41400d52147d9c" integrity sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw== @@ -8727,6 +9154,15 @@ jest-worker@^24.9.0: merge-stream "^2.0.0" supports-color "^6.1.0" +jest-worker@^27.2.0: + version "27.5.1" + resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-27.5.1.tgz#8d146f0900e8973b106b6f73cc1e9a8cb86f8db0" + integrity sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg== + dependencies: + "@types/node" "*" + merge-stream "^2.0.0" + supports-color "^8.0.0" + jest-worker@^29.7.0: version "29.7.0" resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-29.7.0.tgz#acad073acbbaeb7262bd5389e1bcf43e10058d4a" @@ -8752,7 +9188,7 @@ jetifier@^1.6.2: resolved "https://registry.yarnpkg.com/jetifier/-/jetifier-1.6.8.tgz#e88068697875cbda98c32472902c4d3756247798" integrity sha512-3Zi16h6L5tXDRQJTb221cnRoVG9/9OvreLdLU2/ZjRv/GILL+2Cemt0IKvkowwkDpvouAU1DQPOJ7qaiHeIdrw== -joi@^17.13.3: +joi@^17.13.3, joi@^17.2.1: version "17.13.3" resolved "https://registry.yarnpkg.com/joi/-/joi-17.13.3.tgz#0f5cc1169c999b30d344366d384b12d92558bcec" integrity sha512-otDA4ldcIx+ZXsKHWmp0YizCweVRZG96J10b0FevjfuncLO1oX59THoAmHkNubYJ+9gWsYsp5k8v4ib6oDv1fA== @@ -8798,6 +9234,41 @@ jsc-android@^245459.0.0: resolved "https://registry.yarnpkg.com/jsc-android/-/jsc-android-245459.0.0.tgz#e584258dd0b04c9159a27fb104cd5d491fd202c9" integrity sha512-wkjURqwaB1daNkDi2OYYbsLnIdC/lUM2nPXQKRs5pqEU9chDg435bjvo+LSaHotDENygHQDHe+ntUkkw2gwMtg== +jsc-android@^250231.0.0: + version "250231.0.0" + resolved "https://registry.yarnpkg.com/jsc-android/-/jsc-android-250231.0.0.tgz#91720f8df382a108872fa4b3f558f33ba5e95262" + integrity sha512-rS46PvsjYmdmuz1OAWXY/1kCYG7pnf1TBqeTiOJr1iDz7s5DLxxC9n/ZMknLDxzYzNVfI7R95MH10emSSG1Wuw== + +jsc-safe-url@^0.2.2: + version "0.2.4" + resolved "https://registry.yarnpkg.com/jsc-safe-url/-/jsc-safe-url-0.2.4.tgz#141c14fbb43791e88d5dc64e85a374575a83477a" + integrity sha512-0wM3YBWtYePOjfyXQH5MWQ8H7sdk5EXSwZvmSLKk2RboVQ2Bu239jycHDz5J/8Blf3K0Qnoy2b6xD+z10MFB+Q== + +jscodeshift@^0.14.0: + version "0.14.0" + resolved "https://registry.yarnpkg.com/jscodeshift/-/jscodeshift-0.14.0.tgz#7542e6715d6d2e8bde0b4e883f0ccea358b46881" + integrity sha512-7eCC1knD7bLUPuSCwXsMZUH51O8jIcoVyKtI6P0XM0IVzlGjckPy3FIwQlorzbN0Sg79oK+RlohN32Mqf/lrYA== + dependencies: + "@babel/core" "^7.13.16" + "@babel/parser" "^7.13.16" + "@babel/plugin-proposal-class-properties" "^7.13.0" + "@babel/plugin-proposal-nullish-coalescing-operator" "^7.13.8" + "@babel/plugin-proposal-optional-chaining" "^7.13.12" + "@babel/plugin-transform-modules-commonjs" "^7.13.8" + "@babel/preset-flow" "^7.13.13" + "@babel/preset-typescript" "^7.13.0" + "@babel/register" "^7.13.16" + babel-core "^7.0.0-bridge.0" + chalk "^4.1.2" + flow-parser "0.*" + graceful-fs "^4.2.4" + micromatch "^4.0.4" + neo-async "^2.5.0" + node-dir "^0.1.17" + recast "^0.21.0" + temp "^0.8.4" + write-file-atomic "^2.3.0" + jsdoc-type-pratt-parser@~4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/jsdoc-type-pratt-parser/-/jsdoc-type-pratt-parser-4.0.0.tgz#136f0571a99c184d84ec84662c45c29ceff71114" @@ -9658,6 +10129,11 @@ media-typer@0.3.0: resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" integrity sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ== +memoize-one@^5.0.0: + version "5.2.1" + resolved "https://registry.yarnpkg.com/memoize-one/-/memoize-one-5.2.1.tgz#8337aa3c4335581839ec01c3d594090cebe8f00e" + integrity sha512-zYiwtZUcYyXKo/np96AGZAckk+FWWsUdJ3cHGGmld7+AhvcWmQyGCYUh1hc4Q/pkOhb65dQR/pqCyK0cOaHz4Q== + memorystream@^0.3.1: version "0.3.1" resolved "https://registry.yarnpkg.com/memorystream/-/memorystream-0.3.1.tgz#86d7090b30ce455d63fbae12dda51a47ddcaf9b2" @@ -9729,6 +10205,20 @@ metro-babel-transformer@0.59.0: "@babel/core" "^7.0.0" metro-source-map "0.59.0" +metro-babel-transformer@0.76.8: + version "0.76.8" + resolved "https://registry.yarnpkg.com/metro-babel-transformer/-/metro-babel-transformer-0.76.8.tgz#5efd1027353b36b73706164ef09c290dceac096a" + integrity sha512-Hh6PW34Ug/nShlBGxkwQJSgPGAzSJ9FwQXhUImkzdsDgVu6zj5bx258J8cJVSandjNoQ8nbaHK6CaHlnbZKbyA== + dependencies: + "@babel/core" "^7.20.0" + hermes-parser "0.12.0" + nullthrows "^1.1.1" + +metro-cache-key@0.76.8: + version "0.76.8" + resolved "https://registry.yarnpkg.com/metro-cache-key/-/metro-cache-key-0.76.8.tgz#8a0a5e991c06f56fcc584acadacb313c312bdc16" + integrity sha512-buKQ5xentPig9G6T37Ww/R/bC+/V1MA5xU/D8zjnhlelsrPG6w6LtHUS61ID3zZcMZqYaELWk5UIadIdDsaaLw== + metro-cache@0.59.0: version "0.59.0" resolved "https://registry.yarnpkg.com/metro-cache/-/metro-cache-0.59.0.tgz#ef3c055f276933979b731455dc8317d7a66f0f2d" @@ -9739,6 +10229,14 @@ metro-cache@0.59.0: mkdirp "^0.5.1" rimraf "^2.5.4" +metro-cache@0.76.8: + version "0.76.8" + resolved "https://registry.yarnpkg.com/metro-cache/-/metro-cache-0.76.8.tgz#296c1c189db2053b89735a8f33dbe82575f53661" + integrity sha512-QBJSJIVNH7Hc/Yo6br/U/qQDUpiUdRgZ2ZBJmvAbmAKp2XDzsapnMwK/3BGj8JNWJF7OLrqrYHsRsukSbUBpvQ== + dependencies: + metro-core "0.76.8" + rimraf "^3.0.2" + metro-config@0.59.0, metro-config@^0.59.0: version "0.59.0" resolved "https://registry.yarnpkg.com/metro-config/-/metro-config-0.59.0.tgz#9844e388069321dd7403e49f0d495a81f9aa0fef" @@ -9750,6 +10248,19 @@ metro-config@0.59.0, metro-config@^0.59.0: metro-cache "0.59.0" metro-core "0.59.0" +metro-config@0.76.8: + version "0.76.8" + resolved "https://registry.yarnpkg.com/metro-config/-/metro-config-0.76.8.tgz#20bd5397fcc6096f98d2a813a7cecb38b8af062d" + integrity sha512-SL1lfKB0qGHALcAk2zBqVgQZpazDYvYFGwCK1ikz0S6Y/CM2i2/HwuZN31kpX6z3mqjv/6KvlzaKoTb1otuSAA== + dependencies: + connect "^3.6.5" + cosmiconfig "^5.0.5" + jest-validate "^29.2.1" + metro "0.76.8" + metro-cache "0.76.8" + metro-core "0.76.8" + metro-runtime "0.76.8" + metro-core@0.59.0, metro-core@^0.59.0: version "0.59.0" resolved "https://registry.yarnpkg.com/metro-core/-/metro-core-0.59.0.tgz#958cde3fe5c8cd84a78e1899af801ad69e9c83b1" @@ -9760,6 +10271,34 @@ metro-core@0.59.0, metro-core@^0.59.0: metro-resolver "0.59.0" wordwrap "^1.0.0" +metro-core@0.76.8: + version "0.76.8" + resolved "https://registry.yarnpkg.com/metro-core/-/metro-core-0.76.8.tgz#917c8157c63406cb223522835abb8e7c6291dcad" + integrity sha512-sl2QLFI3d1b1XUUGxwzw/KbaXXU/bvFYrSKz6Sg19AdYGWFyzsgZ1VISRIDf+HWm4R/TJXluhWMEkEtZuqi3qA== + dependencies: + lodash.throttle "^4.1.1" + metro-resolver "0.76.8" + +metro-file-map@0.76.8: + version "0.76.8" + resolved "https://registry.yarnpkg.com/metro-file-map/-/metro-file-map-0.76.8.tgz#a1db1185b6c316904ba6b53d628e5d1323991d79" + integrity sha512-A/xP1YNEVwO1SUV9/YYo6/Y1MmzhL4ZnVgcJC3VmHp/BYVOXVStzgVbWv2wILe56IIMkfXU+jpXrGKKYhFyHVw== + dependencies: + anymatch "^3.0.3" + debug "^2.2.0" + fb-watchman "^2.0.0" + graceful-fs "^4.2.4" + invariant "^2.2.4" + jest-regex-util "^27.0.6" + jest-util "^27.2.0" + jest-worker "^27.2.0" + micromatch "^4.0.4" + node-abort-controller "^3.1.1" + nullthrows "^1.1.1" + walker "^1.0.7" + optionalDependencies: + fsevents "^2.3.2" + metro-inspector-proxy@0.59.0: version "0.59.0" resolved "https://registry.yarnpkg.com/metro-inspector-proxy/-/metro-inspector-proxy-0.59.0.tgz#39d1390772d13767fc595be9a1a7074e2425cf8e" @@ -9770,6 +10309,24 @@ metro-inspector-proxy@0.59.0: ws "^1.1.5" yargs "^14.2.0" +metro-inspector-proxy@0.76.8: + version "0.76.8" + resolved "https://registry.yarnpkg.com/metro-inspector-proxy/-/metro-inspector-proxy-0.76.8.tgz#6b8678a7461b0b42f913a7881cc9319b4d3cddff" + integrity sha512-Us5o5UEd4Smgn1+TfHX4LvVPoWVo9VsVMn4Ldbk0g5CQx3Gu0ygc/ei2AKPGTwsOZmKxJeACj7yMH2kgxQP/iw== + dependencies: + connect "^3.6.5" + debug "^2.2.0" + node-fetch "^2.2.0" + ws "^7.5.1" + yargs "^17.6.2" + +metro-minify-terser@0.76.8: + version "0.76.8" + resolved "https://registry.yarnpkg.com/metro-minify-terser/-/metro-minify-terser-0.76.8.tgz#915ab4d1419257fc6a0b9fa15827b83fe69814bf" + integrity sha512-Orbvg18qXHCrSj1KbaeSDVYRy/gkro2PC7Fy2tDSH1c9RB4aH8tuMOIXnKJE+1SXxBtjWmQ5Yirwkth2DyyEZA== + dependencies: + terser "^5.15.0" + metro-minify-uglify@0.59.0: version "0.59.0" resolved "https://registry.yarnpkg.com/metro-minify-uglify/-/metro-minify-uglify-0.59.0.tgz#6491876308d878742f7b894d7fca4af356886dd5" @@ -9777,6 +10334,13 @@ metro-minify-uglify@0.59.0: dependencies: uglify-es "^3.1.9" +metro-minify-uglify@0.76.8: + version "0.76.8" + resolved "https://registry.yarnpkg.com/metro-minify-uglify/-/metro-minify-uglify-0.76.8.tgz#74745045ea2dd29f8783db483b2fce58385ba695" + integrity sha512-6l8/bEvtVaTSuhG1FqS0+Mc8lZ3Bl4RI8SeRIifVLC21eeSDp4CEBUWSGjpFyUDfi6R5dXzYaFnSgMNyfxADiQ== + dependencies: + uglify-es "^3.1.9" + metro-react-native-babel-preset@0.59.0: version "0.59.0" resolved "https://registry.yarnpkg.com/metro-react-native-babel-preset/-/metro-react-native-babel-preset-0.59.0.tgz#20e020bc6ac9849e1477de1333d303ed42aba225" @@ -9821,6 +10385,51 @@ metro-react-native-babel-preset@0.59.0: "@babel/template" "^7.0.0" react-refresh "^0.4.0" +metro-react-native-babel-preset@0.76.8: + version "0.76.8" + resolved "https://registry.yarnpkg.com/metro-react-native-babel-preset/-/metro-react-native-babel-preset-0.76.8.tgz#7476efae14363cbdfeeec403b4f01d7348e6c048" + integrity sha512-Ptza08GgqzxEdK8apYsjTx2S8WDUlS2ilBlu9DR1CUcHmg4g3kOkFylZroogVAUKtpYQNYwAvdsjmrSdDNtiAg== + dependencies: + "@babel/core" "^7.20.0" + "@babel/plugin-proposal-async-generator-functions" "^7.0.0" + "@babel/plugin-proposal-class-properties" "^7.18.0" + "@babel/plugin-proposal-export-default-from" "^7.0.0" + "@babel/plugin-proposal-nullish-coalescing-operator" "^7.18.0" + "@babel/plugin-proposal-numeric-separator" "^7.0.0" + "@babel/plugin-proposal-object-rest-spread" "^7.20.0" + "@babel/plugin-proposal-optional-catch-binding" "^7.0.0" + "@babel/plugin-proposal-optional-chaining" "^7.20.0" + "@babel/plugin-syntax-dynamic-import" "^7.8.0" + "@babel/plugin-syntax-export-default-from" "^7.0.0" + "@babel/plugin-syntax-flow" "^7.18.0" + "@babel/plugin-syntax-nullish-coalescing-operator" "^7.0.0" + "@babel/plugin-syntax-optional-chaining" "^7.0.0" + "@babel/plugin-transform-arrow-functions" "^7.0.0" + "@babel/plugin-transform-async-to-generator" "^7.20.0" + "@babel/plugin-transform-block-scoping" "^7.0.0" + "@babel/plugin-transform-classes" "^7.0.0" + "@babel/plugin-transform-computed-properties" "^7.0.0" + "@babel/plugin-transform-destructuring" "^7.20.0" + "@babel/plugin-transform-flow-strip-types" "^7.20.0" + "@babel/plugin-transform-function-name" "^7.0.0" + "@babel/plugin-transform-literals" "^7.0.0" + "@babel/plugin-transform-modules-commonjs" "^7.0.0" + "@babel/plugin-transform-named-capturing-groups-regex" "^7.0.0" + "@babel/plugin-transform-parameters" "^7.0.0" + "@babel/plugin-transform-react-display-name" "^7.0.0" + "@babel/plugin-transform-react-jsx" "^7.0.0" + "@babel/plugin-transform-react-jsx-self" "^7.0.0" + "@babel/plugin-transform-react-jsx-source" "^7.0.0" + "@babel/plugin-transform-runtime" "^7.0.0" + "@babel/plugin-transform-shorthand-properties" "^7.0.0" + "@babel/plugin-transform-spread" "^7.0.0" + "@babel/plugin-transform-sticky-regex" "^7.0.0" + "@babel/plugin-transform-typescript" "^7.5.0" + "@babel/plugin-transform-unicode-regex" "^7.0.0" + "@babel/template" "^7.0.0" + babel-plugin-transform-flow-enums "^0.0.2" + react-refresh "^0.4.0" + metro-react-native-babel-transformer@0.59.0, metro-react-native-babel-transformer@^0.59.0: version "0.59.0" resolved "https://registry.yarnpkg.com/metro-react-native-babel-transformer/-/metro-react-native-babel-transformer-0.59.0.tgz#9b3dfd6ad35c6ef37fc4ce4d20a2eb67fabbb4be" @@ -9832,6 +10441,17 @@ metro-react-native-babel-transformer@0.59.0, metro-react-native-babel-transforme metro-react-native-babel-preset "0.59.0" metro-source-map "0.59.0" +metro-react-native-babel-transformer@0.76.8: + version "0.76.8" + resolved "https://registry.yarnpkg.com/metro-react-native-babel-transformer/-/metro-react-native-babel-transformer-0.76.8.tgz#c3a98e1f4cd5faf1e21eba8e004b94a90c4db69b" + integrity sha512-3h+LfS1WG1PAzhq8QF0kfXjxuXetbY/lgz8vYMQhgrMMp17WM1DNJD0gjx8tOGYbpbBC1qesJ45KMS4o5TA73A== + dependencies: + "@babel/core" "^7.20.0" + babel-preset-fbjs "^3.4.0" + hermes-parser "0.12.0" + metro-react-native-babel-preset "0.76.8" + nullthrows "^1.1.1" + metro-resolver@0.59.0, metro-resolver@^0.59.0: version "0.59.0" resolved "https://registry.yarnpkg.com/metro-resolver/-/metro-resolver-0.59.0.tgz#fbc9d7c95f094c52807877d0011feffb9e896fad" @@ -9839,6 +10459,19 @@ metro-resolver@0.59.0, metro-resolver@^0.59.0: dependencies: absolute-path "^0.0.0" +metro-resolver@0.76.8: + version "0.76.8" + resolved "https://registry.yarnpkg.com/metro-resolver/-/metro-resolver-0.76.8.tgz#0862755b9b84e26853978322464fb37c6fdad76d" + integrity sha512-KccOqc10vrzS7ZhG2NSnL2dh3uVydarB7nOhjreQ7C4zyWuiW9XpLC4h47KtGQv3Rnv/NDLJYeDqaJ4/+140HQ== + +metro-runtime@0.76.8: + version "0.76.8" + resolved "https://registry.yarnpkg.com/metro-runtime/-/metro-runtime-0.76.8.tgz#74b2d301a2be5f3bbde91b8f1312106f8ffe50c3" + integrity sha512-XKahvB+iuYJSCr3QqCpROli4B4zASAYpkK+j3a0CJmokxCDNbgyI4Fp88uIL6rNaZfN0Mv35S0b99SdFXIfHjg== + dependencies: + "@babel/runtime" "^7.0.0" + react-refresh "^0.4.0" + metro-source-map@0.59.0: version "0.59.0" resolved "https://registry.yarnpkg.com/metro-source-map/-/metro-source-map-0.59.0.tgz#e9beb9fc51bfb4e060f95820cf1508fc122d23f7" @@ -9852,6 +10485,20 @@ metro-source-map@0.59.0: source-map "^0.5.6" vlq "^1.0.0" +metro-source-map@0.76.8: + version "0.76.8" + resolved "https://registry.yarnpkg.com/metro-source-map/-/metro-source-map-0.76.8.tgz#f085800152a6ba0b41ca26833874d31ec36c5a53" + integrity sha512-Hh0ncPsHPVf6wXQSqJqB3K9Zbudht4aUtNpNXYXSxH+pteWqGAXnjtPsRAnCsCWl38wL0jYF0rJDdMajUI3BDw== + dependencies: + "@babel/traverse" "^7.20.0" + "@babel/types" "^7.20.0" + invariant "^2.2.4" + metro-symbolicate "0.76.8" + nullthrows "^1.1.1" + ob1 "0.76.8" + source-map "^0.5.6" + vlq "^1.0.0" + metro-symbolicate@0.59.0: version "0.59.0" resolved "https://registry.yarnpkg.com/metro-symbolicate/-/metro-symbolicate-0.59.0.tgz#fc7f93957a42b02c2bfc57ed1e8f393f5f636a54" @@ -9863,6 +10510,47 @@ metro-symbolicate@0.59.0: through2 "^2.0.1" vlq "^1.0.0" +metro-symbolicate@0.76.8: + version "0.76.8" + resolved "https://registry.yarnpkg.com/metro-symbolicate/-/metro-symbolicate-0.76.8.tgz#f102ac1a306d51597ecc8fdf961c0a88bddbca03" + integrity sha512-LrRL3uy2VkzrIXVlxoPtqb40J6Bf1mlPNmUQewipc3qfKKFgtPHBackqDy1YL0njDsWopCKcfGtFYLn0PTUn3w== + dependencies: + invariant "^2.2.4" + metro-source-map "0.76.8" + nullthrows "^1.1.1" + source-map "^0.5.6" + through2 "^2.0.1" + vlq "^1.0.0" + +metro-transform-plugins@0.76.8: + version "0.76.8" + resolved "https://registry.yarnpkg.com/metro-transform-plugins/-/metro-transform-plugins-0.76.8.tgz#d77c28a6547a8e3b72250f740fcfbd7f5408f8ba" + integrity sha512-PlkGTQNqS51Bx4vuufSQCdSn2R2rt7korzngo+b5GCkeX5pjinPjnO2kNhQ8l+5bO0iUD/WZ9nsM2PGGKIkWFA== + dependencies: + "@babel/core" "^7.20.0" + "@babel/generator" "^7.20.0" + "@babel/template" "^7.0.0" + "@babel/traverse" "^7.20.0" + nullthrows "^1.1.1" + +metro-transform-worker@0.76.8: + version "0.76.8" + resolved "https://registry.yarnpkg.com/metro-transform-worker/-/metro-transform-worker-0.76.8.tgz#b9012a196cee205170d0c899b8b175b9305acdea" + integrity sha512-mE1fxVAnJKmwwJyDtThildxxos9+DGs9+vTrx2ktSFMEVTtXS/bIv2W6hux1pqivqAfyJpTeACXHk5u2DgGvIQ== + dependencies: + "@babel/core" "^7.20.0" + "@babel/generator" "^7.20.0" + "@babel/parser" "^7.20.0" + "@babel/types" "^7.20.0" + babel-preset-fbjs "^3.4.0" + metro "0.76.8" + metro-babel-transformer "0.76.8" + metro-cache "0.76.8" + metro-cache-key "0.76.8" + metro-source-map "0.76.8" + metro-transform-plugins "0.76.8" + nullthrows "^1.1.1" + metro@0.59.0, metro@^0.59.0: version "0.59.0" resolved "https://registry.yarnpkg.com/metro/-/metro-0.59.0.tgz#64a87cd61357814a4f279518e0781b1eab5934b8" @@ -9925,6 +10613,60 @@ metro@0.59.0, metro@^0.59.0: xpipe "^1.0.5" yargs "^14.2.0" +metro@0.76.8: + version "0.76.8" + resolved "https://registry.yarnpkg.com/metro/-/metro-0.76.8.tgz#ba526808b99977ca3f9ac5a7432fd02a340d13a6" + integrity sha512-oQA3gLzrrYv3qKtuWArMgHPbHu8odZOD9AoavrqSFllkPgOtmkBvNNDLCELqv5SjBfqjISNffypg+5UGG3y0pg== + dependencies: + "@babel/code-frame" "^7.0.0" + "@babel/core" "^7.20.0" + "@babel/generator" "^7.20.0" + "@babel/parser" "^7.20.0" + "@babel/template" "^7.0.0" + "@babel/traverse" "^7.20.0" + "@babel/types" "^7.20.0" + accepts "^1.3.7" + async "^3.2.2" + chalk "^4.0.0" + ci-info "^2.0.0" + connect "^3.6.5" + debug "^2.2.0" + denodeify "^1.2.1" + error-stack-parser "^2.0.6" + graceful-fs "^4.2.4" + hermes-parser "0.12.0" + image-size "^1.0.2" + invariant "^2.2.4" + jest-worker "^27.2.0" + jsc-safe-url "^0.2.2" + lodash.throttle "^4.1.1" + metro-babel-transformer "0.76.8" + metro-cache "0.76.8" + metro-cache-key "0.76.8" + metro-config "0.76.8" + metro-core "0.76.8" + metro-file-map "0.76.8" + metro-inspector-proxy "0.76.8" + metro-minify-terser "0.76.8" + metro-minify-uglify "0.76.8" + metro-react-native-babel-preset "0.76.8" + metro-resolver "0.76.8" + metro-runtime "0.76.8" + metro-source-map "0.76.8" + metro-symbolicate "0.76.8" + metro-transform-plugins "0.76.8" + metro-transform-worker "0.76.8" + mime-types "^2.1.27" + node-fetch "^2.2.0" + nullthrows "^1.1.1" + rimraf "^3.0.2" + serialize-error "^2.1.0" + source-map "^0.5.6" + strip-ansi "^6.0.0" + throat "^5.0.0" + ws "^7.5.1" + yargs "^17.6.2" + micromatch@^3.1.10, micromatch@^3.1.4: version "3.1.10" resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-3.1.10.tgz#70859bc95c9840952f359a068a3fc49f9ecfac23" @@ -9969,7 +10711,7 @@ mime-types@2.1.11: dependencies: mime-db "~1.23.0" -mime-types@^2.1.12, mime-types@~2.1.19, mime-types@~2.1.24, mime-types@~2.1.34: +mime-types@^2.1.12, mime-types@^2.1.27, mime-types@~2.1.19, mime-types@~2.1.24, mime-types@~2.1.34: version "2.1.35" resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a" integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== @@ -10027,7 +10769,7 @@ minimatch@^10.0.0, minimatch@~10.0.1: dependencies: brace-expansion "^2.0.1" -minimatch@^3.0.4, minimatch@^3.0.5, minimatch@^3.1.1, minimatch@^3.1.2: +minimatch@^3.0.2, minimatch@^3.0.4, minimatch@^3.0.5, minimatch@^3.1.1, minimatch@^3.1.2: version "3.1.2" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== @@ -10291,7 +11033,7 @@ negotiator@^0.6.3, negotiator@~0.6.4: resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.4.tgz#777948e2452651c570b712dd01c23e262713fff7" integrity sha512-myRT3DiWPHqho5PrJaIRyaMv2kgYf0mUVgBNOYMuCH5Ki1yEiQaf/ZJuQ62nvpc44wL5WDbTX7yGJi1Neevw8w== -neo-async@^2.6.2: +neo-async@^2.5.0, neo-async@^2.6.2: version "2.6.2" resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.2.tgz#b4aafb93e3aeb2d8174ca53cf163ab7d7308305f" integrity sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw== @@ -10306,11 +11048,28 @@ nocache@^2.1.0: resolved "https://registry.yarnpkg.com/nocache/-/nocache-2.1.0.tgz#120c9ffec43b5729b1d5de88cd71aa75a0ba491f" integrity sha512-0L9FvHG3nfnnmaEQPjT9xhfN4ISk0A8/2j4M37Np4mcDesJjHgEUfgPhdCyZuFI954tjokaIj/A3NdpFNdEh4Q== +nocache@^3.0.1: + version "3.0.4" + resolved "https://registry.yarnpkg.com/nocache/-/nocache-3.0.4.tgz#5b37a56ec6e09fc7d401dceaed2eab40c8bfdf79" + integrity sha512-WDD0bdg9mbq6F4mRxEYcPWwfA1vxd0mrvKOyxI7Xj/atfRHVeutzuWByG//jfm4uPzp0y4Kj051EORCBSQMycw== + +node-abort-controller@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/node-abort-controller/-/node-abort-controller-3.1.1.tgz#a94377e964a9a37ac3976d848cb5c765833b8548" + integrity sha512-AGK2yQKIjRuqnc6VkX2Xj5d+QW8xZ87pa1UK6yA6ouUyuxfHuMP6umE5QK7UmTeOAymo+Zx1Fxiuw9rVx8taHQ== + node-addon-api@^5.0.0: version "5.1.0" resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-5.1.0.tgz#49da1ca055e109a23d537e9de43c09cca21eb762" integrity sha512-eh0GgfEkpnoWDq+VY8OyvYhFEzBk6jIYbRKdIlyTiAXIVJ8PyBaKb0rp7oDtoddbdoHWhq8wwr+XZ81F1rpNdA== +node-dir@^0.1.17: + version "0.1.17" + resolved "https://registry.yarnpkg.com/node-dir/-/node-dir-0.1.17.tgz#5f5665d93351335caabef8f1c554516cf5f1e4e5" + integrity sha512-tmPX422rYgofd4epzrNoOXiE8XFZYOcCq1vD7MAXCDO+O+zndlA2ztdKKMa+EeuBG5tHETpr4ml4RGgpqDCCAg== + dependencies: + minimatch "^3.0.2" + node-fetch@2.6.7: version "2.6.7" resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.7.tgz#24de9fba827e3b4ae44dc8b20256a379160052ad" @@ -10639,6 +11398,11 @@ ob1@0.59.0: resolved "https://registry.yarnpkg.com/ob1/-/ob1-0.59.0.tgz#ee103619ef5cb697f2866e3577da6f0ecd565a36" integrity sha512-opXMTxyWJ9m68ZglCxwo0OPRESIC/iGmKFPXEXzMZqsVIrgoRXOHmoMDkQzz4y3irVjbyPJRAh5pI9fd0MJTFQ== +ob1@0.76.8: + version "0.76.8" + resolved "https://registry.yarnpkg.com/ob1/-/ob1-0.76.8.tgz#ac4c459465b1c0e2c29aaa527e09fc463d3ffec8" + integrity sha512-dlBkJJV5M/msj9KYA9upc+nUWVwuOFFTbu28X6kZeGwcuW+JxaHSBZ70SYQnk5M+j5JbNLR6yKHmgW4M5E7X5g== + object-assign@^4.0.1, object-assign@^4.1.0, object-assign@^4.1.1: version "4.1.1" resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" @@ -11459,6 +12223,16 @@ pretty-format@^25.1.0, pretty-format@^25.2.0: ansi-styles "^4.0.0" react-is "^16.12.0" +pretty-format@^26.5.2, pretty-format@^26.6.2: + version "26.6.2" + resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-26.6.2.tgz#e35c2705f14cb7fe2fe94fa078345b444120fc93" + integrity sha512-7AeGuCYNGmycyQbCqd/3PWH4eOoX/OiCa0uphp57NVTeAGdJGaAliecxwBDHYQCIvrW7aDBZCYeNTP/WX69mkg== + dependencies: + "@jest/types" "^26.6.2" + ansi-regex "^5.0.0" + ansi-styles "^4.0.0" + react-is "^17.0.1" + pretty-format@^29.0.0, pretty-format@^29.7.0: version "29.7.0" resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-29.7.0.tgz#ca42c758310f365bfa71a0bda0a807160b776812" @@ -11533,14 +12307,14 @@ promise@^7.1.1: dependencies: asap "~2.0.3" -promise@^8.0.3: +promise@^8.0.3, promise@^8.3.0: version "8.3.0" resolved "https://registry.yarnpkg.com/promise/-/promise-8.3.0.tgz#8cb333d1edeb61ef23869fbb8a4ea0279ab60e0a" integrity sha512-rZPNPKTOYVNEEKFaq1HqTgOwZD+4/YHS5ukLzQCypkj+OkYx7iv0mA91lJlpPPZ8vMau3IIGj5Qlwrx+8iiSmg== dependencies: asap "~2.0.6" -prompts@^2.0.1: +prompts@^2.0.1, prompts@^2.4.0: version "2.4.2" resolved "https://registry.yarnpkg.com/prompts/-/prompts-2.4.2.tgz#7b57e73b3a48029ad10ebd44f74b01722a4cb069" integrity sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q== @@ -11563,7 +12337,7 @@ prop-types-extra@^1.1.0: react-is "^16.3.2" warning "^4.0.0" -prop-types@^15.6.2, prop-types@^15.7.2, prop-types@^15.8.1: +prop-types@*, prop-types@^15.6.2, prop-types@^15.7.2, prop-types@^15.8.1: version "15.8.1" resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.8.1.tgz#67d87bf1a694f48435cf332c24af10214a3140b5" integrity sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg== @@ -11675,6 +12449,13 @@ queue-microtask@^1.2.2: resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== +queue@6.0.2: + version "6.0.2" + resolved "https://registry.yarnpkg.com/queue/-/queue-6.0.2.tgz#b91525283e2315c7553d2efa18d83e76432fed65" + integrity sha512-iHZWu+q3IdFZFX36ro/lKBkSvfkztY5Y7HMiPlOUjhupPcG2JMfst2KKEpu5XndviX/3UhFbRngUPNKtgvtZiA== + dependencies: + inherits "~2.0.3" + quick-lru@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/quick-lru/-/quick-lru-4.0.1.tgz#5b8878f113a58217848c6482026c73e1ba57727f" @@ -11735,7 +12516,7 @@ react-bootstrap@^2.7.0: uncontrollable "^7.2.1" warning "^4.0.3" -react-devtools-core@^4.6.0: +react-devtools-core@^4.27.2, react-devtools-core@^4.6.0: version "4.28.5" resolved "https://registry.yarnpkg.com/react-devtools-core/-/react-devtools-core-4.28.5.tgz#c8442b91f068cdf0c899c543907f7f27d79c2508" integrity sha512-cq/o30z9W2Wb4rzBefjv5fBalHU0rJGZCHAkf/RHSBWSSYwh8PlQTqqOJmgIIbBtpj27T6FIPXeomIjZtCNVqA== @@ -11777,6 +12558,16 @@ react-is@^16.12.0, react-is@^16.13.1, react-is@^16.3.2, react-is@^16.7.0, react- resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4" integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== +"react-is@^16.12.0 || ^17.0.0 || ^18.0.0": + version "18.3.1" + resolved "https://registry.yarnpkg.com/react-is/-/react-is-18.3.1.tgz#e83557dc12eae63a99e003a46388b1dcbb44db7e" + integrity sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg== + +react-is@^17.0.1: + version "17.0.2" + resolved "https://registry.yarnpkg.com/react-is/-/react-is-17.0.2.tgz#e691d4a8e9c789365655539ab372762b0efb54f0" + integrity sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w== + react-is@^18.0.0: version "18.2.0" resolved "https://registry.yarnpkg.com/react-is/-/react-is-18.2.0.tgz#199431eeaaa2e09f86427efbb4f1473edb47609b" @@ -11787,6 +12578,53 @@ react-lifecycles-compat@^3.0.4: resolved "https://registry.yarnpkg.com/react-lifecycles-compat/-/react-lifecycles-compat-3.0.4.tgz#4f1a273afdfc8f3488a8c516bfda78f872352362" integrity sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA== +react-native-device-info@^14.0.2: + version "14.0.2" + resolved "https://registry.yarnpkg.com/react-native-device-info/-/react-native-device-info-14.0.2.tgz#cb583e283eba4e54f56c9c548dae89a96ccf39ab" + integrity sha512-W1oqu4dC4uLKT/Z4uimRP6birJprWjhMP/AwV9hxGSZ5K3wJ/yb34aQ22sd6HmegQHfT2PmkFs3mj+4uXLE1YQ== + +react-native@0.72.6: + version "0.72.6" + resolved "https://registry.yarnpkg.com/react-native/-/react-native-0.72.6.tgz#9f8d090694907e2f83af22e115cc0e4a3d5fa626" + integrity sha512-RafPY2gM7mcrFySS8TL8x+TIO3q7oAlHpzEmC7Im6pmXni6n1AuufGaVh0Narbr1daxstw7yW7T9BKW5dpVc2A== + dependencies: + "@jest/create-cache-key-function" "^29.2.1" + "@react-native-community/cli" "11.3.7" + "@react-native-community/cli-platform-android" "11.3.7" + "@react-native-community/cli-platform-ios" "11.3.7" + "@react-native/assets-registry" "^0.72.0" + "@react-native/codegen" "^0.72.7" + "@react-native/gradle-plugin" "^0.72.11" + "@react-native/js-polyfills" "^0.72.1" + "@react-native/normalize-colors" "^0.72.0" + "@react-native/virtualized-lists" "^0.72.8" + abort-controller "^3.0.0" + anser "^1.4.9" + base64-js "^1.1.2" + deprecated-react-native-prop-types "4.1.0" + event-target-shim "^5.0.1" + flow-enums-runtime "^0.0.5" + invariant "^2.2.4" + jest-environment-node "^29.2.1" + jsc-android "^250231.0.0" + memoize-one "^5.0.0" + metro-runtime "0.76.8" + metro-source-map "0.76.8" + mkdirp "^0.5.1" + nullthrows "^1.1.1" + pretty-format "^26.5.2" + promise "^8.3.0" + react-devtools-core "^4.27.2" + react-refresh "^0.4.0" + react-shallow-renderer "^16.15.0" + regenerator-runtime "^0.13.2" + scheduler "0.24.0-canary-efb381bbf-20230505" + stacktrace-parser "^0.1.10" + use-sync-external-store "^1.0.0" + whatwg-fetch "^3.0.0" + ws "^6.2.2" + yargs "^17.6.2" + react-native@^0.63.0: version "0.63.5" resolved "https://registry.yarnpkg.com/react-native/-/react-native-0.63.5.tgz#2c0d5dca527fb69bb481e89b2c86068f2641b62d" @@ -11864,6 +12702,14 @@ react-router@6.23.0: dependencies: "@remix-run/router" "1.16.0" +react-shallow-renderer@^16.15.0: + version "16.15.0" + resolved "https://registry.yarnpkg.com/react-shallow-renderer/-/react-shallow-renderer-16.15.0.tgz#48fb2cf9b23d23cde96708fe5273a7d3446f4457" + integrity sha512-oScf2FqQ9LFVQgA73vr86xl2NaOIX73rh+YFqcOp68CWj56tSfgtGKrEbyhCj0rSijyG9M1CYprTh39fBi5hzA== + dependencies: + object-assign "^4.1.1" + react-is "^16.12.0 || ^17.0.0 || ^18.0.0" + react-transition-group@^4.4.5: version "4.4.5" resolved "https://registry.yarnpkg.com/react-transition-group/-/react-transition-group-4.4.5.tgz#e53d4e3f3344da8521489fbef8f2581d42becdd1" @@ -11974,6 +12820,21 @@ readdirp@~3.6.0: dependencies: picomatch "^2.2.1" +readline@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/readline/-/readline-1.3.0.tgz#c580d77ef2cfc8752b132498060dc9793a7ac01c" + integrity sha512-k2d6ACCkiNYz222Fs/iNze30rRJ1iIicW7JuX/7/cozvih6YCkFZH+J6mAFDVgv0dRBaAyr4jDqC95R2y4IADg== + +recast@^0.21.0: + version "0.21.5" + resolved "https://registry.yarnpkg.com/recast/-/recast-0.21.5.tgz#e8cd22bb51bcd6130e54f87955d33a2b2e57b495" + integrity sha512-hjMmLaUXAm1hIuTqOdeYObMslq/q+Xff6QE3Y2P+uoHAg2nmVlLBps2hzh1UJDdMtDTMXOFewK6ky51JQIeECg== + dependencies: + ast-types "0.15.2" + esprima "~4.0.0" + source-map "~0.6.1" + tslib "^2.0.1" + redent@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/redent/-/redent-3.0.0.tgz#e557b7998316bb53c9f1f56fa626352c6963059f" @@ -12292,6 +13153,13 @@ rimraf@~2.2.6: resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.2.8.tgz#e439be2aaee327321952730f99a8929e4fc50582" integrity sha512-R5KMKHnPAQaZMqLOsyuyUmcIjSeDm+73eoqQpaXA7AZ22BL+6C+1mcUscgOsNd8WVlJuvlgAPsegcx7pjlV0Dg== +rimraf@~2.6.2: + version "2.6.3" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.3.tgz#b2d104fe0d8fb27cf9e0a1cda8262dd3833c6cab" + integrity sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA== + dependencies: + glob "^7.1.3" + rollup@^3.27.1: version "3.29.5" resolved "https://registry.yarnpkg.com/rollup/-/rollup-3.29.5.tgz#8a2e477a758b520fb78daf04bca4c522c1da8a54" @@ -12467,6 +13335,13 @@ scheduler@0.19.1: loose-envify "^1.1.0" object-assign "^4.1.1" +scheduler@0.24.0-canary-efb381bbf-20230505: + version "0.24.0-canary-efb381bbf-20230505" + resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.24.0-canary-efb381bbf-20230505.tgz#5dddc60e29f91cd7f8b983d7ce4a99c2202d178f" + integrity sha512-ABvovCDe/k9IluqSh4/ISoq8tIJnW8euVAWYt5j/bg6dRnqwQwiGO1F/V4AyK96NGF/FB04FhOUDuWj8IKfABA== + dependencies: + loose-envify "^1.1.0" + scheduler@^0.23.0: version "0.23.0" resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.23.0.tgz#ba8041afc3d30eb206a487b6b384002e4e61fdfe" @@ -12666,6 +13541,11 @@ shell-quote@^1.6.1: resolved "https://registry.yarnpkg.com/shell-quote/-/shell-quote-1.7.4.tgz#33fe15dee71ab2a81fcbd3a52106c5cfb9fb75d8" integrity sha512-8o/QEhSSRb1a5i7TFR0iM4G16Z0vYB2OQVs4G3aAFXjn3T6yEx8AZxy1PgDF7I00LZHYA3WxaSYIf5e5sAX8Rw== +shell-quote@^1.7.3: + version "1.8.2" + resolved "https://registry.yarnpkg.com/shell-quote/-/shell-quote-1.8.2.tgz#d2d83e057959d53ec261311e9e9b8f51dcb2934a" + integrity sha512-AzqKpGKjrj7EM6rKVQEPpB288oCfnrEIuyoT9cyF4nmGa7V8Zk6f7RRqYisX8X9m+Q7bd632aZW4ky7EhbQztA== + shimmer@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/shimmer/-/shimmer-1.2.1.tgz#610859f7de327b587efebf501fb43117f9aff337" @@ -13012,7 +13892,7 @@ stackframe@^1.3.4: resolved "https://registry.yarnpkg.com/stackframe/-/stackframe-1.3.4.tgz#b881a004c8c149a5e8efef37d51b16e412943310" integrity sha512-oeVtt7eWQS+Na6F//S4kJ2K2VbRlS9D43mAlMyVpVWovy9o+jfgH8O9agzANzaiLjclA0oYzUXEM4PurhSUChw== -stacktrace-parser@^0.1.3: +stacktrace-parser@^0.1.10, stacktrace-parser@^0.1.3: version "0.1.10" resolved "https://registry.yarnpkg.com/stacktrace-parser/-/stacktrace-parser-0.1.10.tgz#29fb0cae4e0d0b85155879402857a1639eb6051a" integrity sha512-KJP1OCML99+8fhOHxwwzyWrlUuVX5GQ0ZpJTd1DFXhdkrvg1szxfHhawXUZ3g9TkXORQd4/WG68jMlQZ2p8wlg== @@ -13261,6 +14141,11 @@ strip-json-comments@~2.0.1: resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" integrity sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ== +strnum@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/strnum/-/strnum-1.0.5.tgz#5c4e829fe15ad4ff0d20c3db5ac97b73c9b072db" + integrity sha512-J8bbNyKKXl5qYcR36TIO8W3mVGVHrmmxsd5PAItGkmyzwJvybiw2IVq5nqd0i4LSNSkB/sx9VHllbfFdr9k1JA== + strong-log-transformer@2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/strong-log-transformer/-/strong-log-transformer-2.1.0.tgz#0f5ed78d325e0421ac6f90f7f10e691d6ae3ae10" @@ -13376,6 +14261,23 @@ temp@0.8.3: os-tmpdir "^1.0.0" rimraf "~2.2.6" +temp@^0.8.4: + version "0.8.4" + resolved "https://registry.yarnpkg.com/temp/-/temp-0.8.4.tgz#8c97a33a4770072e0a05f919396c7665a7dd59f2" + integrity sha512-s0ZZzd0BzYv5tLSptZooSjK8oj6C+c19p7Vqta9+6NPOf7r+fxq0cJe6/oN4LTC79sy5NY8ucOJNgwsKCSbfqg== + dependencies: + rimraf "~2.6.2" + +terser@^5.15.0: + version "5.37.0" + resolved "https://registry.yarnpkg.com/terser/-/terser-5.37.0.tgz#38aa66d1cfc43d0638fab54e43ff8a4f72a21ba3" + integrity sha512-B8wRRkmre4ERucLM/uXx4MOV5cbnOlVAqUst+1+iLKPI0dOgFO28f84ptoQt9HEI537PMzfYa/d+GEPKTRXmYA== + dependencies: + "@jridgewell/source-map" "^0.3.3" + acorn "^8.8.2" + commander "^2.20.0" + source-map-support "~0.5.20" + terser@^5.17.4: version "5.31.3" resolved "https://registry.yarnpkg.com/terser/-/terser-5.31.3.tgz#b24b7beb46062f4653f049eea4f0cd165d0f0c38" @@ -13415,6 +14317,11 @@ throat@^4.1.0: resolved "https://registry.yarnpkg.com/throat/-/throat-4.1.0.tgz#89037cbc92c56ab18926e6ba4cbb200e15672a6a" integrity sha512-wCVxLDcFxw7ujDxaeJC6nfl2XfHJNYs8yUYJnvMgtPEFlttP9tHSfRUv2vBe6C4hkVFPWoP1P6ZccbYjmSEkKA== +throat@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/throat/-/throat-5.0.0.tgz#c5199235803aad18754a667d659b5e72ce16764b" + integrity sha512-fcwX4mndzpLQKBS1DVYhGAcYaYt7vsHNIvQV+WXMvnow5cgjPphq5CaayLaGsjRdSCKZFNGt7/GYAuXaNOiYCA== + throttleit@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/throttleit/-/throttleit-1.0.1.tgz#304ec51631c3b770c65c6c6f76938b384000f4d5" @@ -13438,6 +14345,18 @@ time-stamp@^1.0.0: resolved "https://registry.yarnpkg.com/time-stamp/-/time-stamp-1.1.0.tgz#764a5a11af50561921b133f3b44e618687e0f5c3" integrity sha512-gLCeArryy2yNTRzTGKbZbloctj64jkZ57hj5zdraXue6aFgd6PmvVtEyiUU+hvU0v7q08oVv8r8ev0tRo6bvgw== +tldts-core@^6.1.70: + version "6.1.70" + resolved "https://registry.yarnpkg.com/tldts-core/-/tldts-core-6.1.70.tgz#a954e93237ece2e1705b438600793c86a25f8c00" + integrity sha512-RNnIXDB1FD4T9cpQRErEqw6ZpjLlGdMOitdV+0xtbsnwr4YFka1zpc7D4KD+aAn8oSG5JyFrdasZTE04qDE9Yg== + +tldts@^6.1.32: + version "6.1.70" + resolved "https://registry.yarnpkg.com/tldts/-/tldts-6.1.70.tgz#b571e5645ab9dc6f289453115d52602b8a384cfe" + integrity sha512-/W1YVgYVJd9ZDjey5NXadNh0mJXkiUMUue9Zebd0vpdo1sU+H4zFFTaJ1RKD4N6KFoHfcXy6l+Vu7bh+bdWCzA== + dependencies: + tldts-core "^6.1.70" + tmp@^0.0.33: version "0.0.33" resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9" @@ -13502,7 +14421,7 @@ touch@^3.1.0: resolved "https://registry.yarnpkg.com/touch/-/touch-3.1.1.tgz#097a23d7b161476435e5c1344a95c0f75b4a5694" integrity sha512-r0eojU4bI8MnHr8c5bNo7lJDdI2qXlWWJk6a9EAFG7vbhTjElYhBVS3/miuE0uOuoLdb8Mc/rVfsmm6eo5o9GA== -tough-cookie@^4.1.2, tough-cookie@^4.1.3, tough-cookie@^5.0.0: +tough-cookie@^4.1.2: version "4.1.4" resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-4.1.4.tgz#945f1461b45b5a8c76821c33ea49c3ac192c1b36" integrity sha512-Loo5UUvLD9ScZ6jh8beX1T6sO1w2/MpCRpEP7V280GKMVUQ0Jzar2U3UJPsrdbziLEMMhu3Ujnq//rhiFuIeag== @@ -13512,6 +14431,13 @@ tough-cookie@^4.1.2, tough-cookie@^4.1.3, tough-cookie@^5.0.0: universalify "^0.2.0" url-parse "^1.5.3" +tough-cookie@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-5.0.0.tgz#6b6518e2b5c070cf742d872ee0f4f92d69eac1af" + integrity sha512-FRKsF7cz96xIIeMZ82ehjC3xW2E+O2+v11udrDYewUbszngYhsGa8z6YUMMzO9QJZzzyd0nGGXnML/TReX6W8Q== + dependencies: + tldts "^6.1.32" + tr46@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/tr46/-/tr46-3.0.0.tgz#555c4e297a950617e8eeddef633c87d4d9d6cbf9" @@ -13612,7 +14538,7 @@ tslib@^1.8.1: resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== -tslib@^2.1.0, tslib@^2.3.0, tslib@^2.4.0, tslib@^2.6.2: +tslib@^2.0.1, tslib@^2.1.0, tslib@^2.3.0, tslib@^2.4.0, tslib@^2.6.2: version "2.8.1" resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.8.1.tgz#612efe4ed235d567e8aba5f2a5fab70280ade83f" integrity sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w== @@ -14397,7 +15323,7 @@ write-file-atomic@5.0.1, write-file-atomic@^5.0.0: imurmurhash "^0.1.4" signal-exit "^4.0.1" -write-file-atomic@^2.4.2: +write-file-atomic@^2.3.0, write-file-atomic@^2.4.2: version "2.4.3" resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-2.4.3.tgz#1fd2e9ae1df3e75b8d8c367443c692d4ca81f481" integrity sha512-GaETH5wwsX+GcnzhPgKcKjJ6M2Cq3/iZp1WyY/X1CSqrW+jVNM9Y7D8EC2sM4ZG/V8wZlSniJnCKWPmBYAucRQ== @@ -14443,7 +15369,14 @@ ws@^1.1.0, ws@^1.1.5: options ">=0.0.5" ultron "1.0.x" -ws@^7: +ws@^6.2.2: + version "6.2.3" + resolved "https://registry.yarnpkg.com/ws/-/ws-6.2.3.tgz#ccc96e4add5fd6fedbc491903075c85c5a11d9ee" + integrity sha512-jmTjYU0j60B+vHey6TfR3Z7RD61z/hmxBS3VMSGIrroOWXQEneK1zNuotOUrGyBHQj0yrpsLHPWtigEFd13ndA== + dependencies: + async-limiter "~1.0.0" + +ws@^7, ws@^7.5.1: version "7.5.10" resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.10.tgz#58b5c20dc281633f6c19113f39b349bd8bd558d9" integrity sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ== @@ -14523,6 +15456,11 @@ yaml@^2.1.3: resolved "https://registry.yarnpkg.com/yaml/-/yaml-2.3.4.tgz#53fc1d514be80aabf386dc6001eb29bf3b7523b2" integrity sha512-8aAvwVUSHpfEqTQ4w/KMlf3HcRdt50E5ODIQJBw1fQ5RL34xabzxtUlzTXVqc4rkZsPbvrXKWnABCD7kWSmocA== +yaml@^2.2.1: + version "2.7.0" + resolved "https://registry.yarnpkg.com/yaml/-/yaml-2.7.0.tgz#aef9bb617a64c937a9a748803786ad8d3ffe1e98" + integrity sha512-+hSoy/QHluxmC9kCIJyL/uyFmLmc+e5CFR5Wa+bpIhIj85LVb9ZH2nVnqrHoSvKogwODv0ClqZkmiSSaIH5LTA== + yargs-parser@21.1.1, yargs-parser@^21.1.1: version "21.1.1" resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-21.1.1.tgz#9096bceebf990d21bb31fa9516e0ede294a77d35" From 24d38950bbc2cec9987dca4755bbd638f5ea1a9d Mon Sep 17 00:00:00 2001 From: Lucas Bento Date: Mon, 6 Jan 2025 13:21:49 +0100 Subject: [PATCH 31/43] refactor: remove unneeded param --- packages/react-native-sdk/src/metas/browser/meta.ts | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/packages/react-native-sdk/src/metas/browser/meta.ts b/packages/react-native-sdk/src/metas/browser/meta.ts index b08c2d016..d7fd08f61 100644 --- a/packages/react-native-sdk/src/metas/browser/meta.ts +++ b/packages/react-native-sdk/src/metas/browser/meta.ts @@ -1,6 +1,6 @@ // eslint-disable-next-line import/namespace import { Dimensions, Platform } from 'react-native'; -import { getBrand, getModel, getReadableVersion, getSystemVersion } from 'react-native-device-info'; +import { getBrand, getModel, getSystemVersion } from 'react-native-device-info'; import { Meta, MetaItem } from '@grafana/faro-core'; @@ -9,7 +9,6 @@ const { width, height } = Dimensions.get('window'); export const browserMeta: MetaItem> = () => ({ browser: { name: Platform.OS, - version: getReadableVersion(), os: getSystemVersion(), mobile: true, userAgent: `${Platform.OS}/${getSystemVersion()} (${getBrand()} ${getModel()})`, From c66f2cf65ba6bbeee9d7f4a9e115e470c7c686bd Mon Sep 17 00:00:00 2001 From: Marco Caldera Date: Tue, 7 Jan 2025 12:22:40 +0100 Subject: [PATCH 32/43] fix: logger --- packages/react-native-tracing/src/react-navigation/index.ts | 1 + .../react-navigation/registerFaroReactNavigationContainer.ts | 4 ++-- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/packages/react-native-tracing/src/react-navigation/index.ts b/packages/react-native-tracing/src/react-navigation/index.ts index 385af2b32..8f98d719f 100644 --- a/packages/react-native-tracing/src/react-navigation/index.ts +++ b/packages/react-native-tracing/src/react-navigation/index.ts @@ -1,2 +1,3 @@ export { initializeReactNavigationInstrumentation } from './initialize'; export { ReactNavigationIntegration } from './instrumentation'; +export type { NavigationContainerRef } from './types'; diff --git a/packages/react-native-tracing/src/react-navigation/registerFaroReactNavigationContainer.ts b/packages/react-native-tracing/src/react-navigation/registerFaroReactNavigationContainer.ts index 04fdd3d5f..75374f4c9 100644 --- a/packages/react-native-tracing/src/react-navigation/registerFaroReactNavigationContainer.ts +++ b/packages/react-native-tracing/src/react-navigation/registerFaroReactNavigationContainer.ts @@ -13,14 +13,14 @@ export function registerFaroReactNavigationContainer(navigationContainerRef: Nav const navigationContainer = navigationContainerRef.current; if (!navigationContainer) { - internalLogger.warn('Received invalid navigation container ref'); + internalLogger.error('Received invalid navigation container ref'); return; } const otel = api.getOTEL(); if (!otel) { - internalLogger.warn('OpenTelemetry not initialized'); + internalLogger.error('OpenTelemetry not initialized'); return; } From 8d9b5e8552044bcdd62cb89a2fa9f70becee4d38 Mon Sep 17 00:00:00 2001 From: Lucas Bento Date: Tue, 7 Jan 2025 15:42:58 +0100 Subject: [PATCH 33/43] refactor: switch `console.error` to `console.warn` --- packages/react-native-tracing/src/wrapHOC.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/react-native-tracing/src/wrapHOC.tsx b/packages/react-native-tracing/src/wrapHOC.tsx index ae0fd9f61..073ca0fd7 100644 --- a/packages/react-native-tracing/src/wrapHOC.tsx +++ b/packages/react-native-tracing/src/wrapHOC.tsx @@ -21,7 +21,7 @@ const measureStartupTime = async (): Promise => { }, }); } catch (error) { - console.error('[NativeInstrumentation] Failed to measure startup time:', error); + console.warn('[NativeInstrumentation] Failed to measure startup time:', error); } }; From d74230a5aa092d8f4bb507d19722ad519941f7fa Mon Sep 17 00:00:00 2001 From: Lucas Bento Date: Tue, 7 Jan 2025 16:46:22 +0100 Subject: [PATCH 34/43] refactor: move import from `faro-web-sdk` --- packages/react-native-tracing/src/react-navigation/handlers.ts | 2 +- .../src/react-navigation/instrumentation.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/react-native-tracing/src/react-navigation/handlers.ts b/packages/react-native-tracing/src/react-navigation/handlers.ts index ed4955bab..1b8de6de4 100644 --- a/packages/react-native-tracing/src/react-navigation/handlers.ts +++ b/packages/react-native-tracing/src/react-navigation/handlers.ts @@ -1,6 +1,6 @@ import { SpanStatusCode, Tracer } from '@opentelemetry/api'; -import { EVENT_ROUTE_CHANGE } from '@grafana/faro-web-sdk'; +import { EVENT_ROUTE_CHANGE } from '@grafana/faro-core'; import { api, internalLogger } from './dependencies'; import { NavigationContainer, NavigationState, ROUTE_CHANGE_TIMEOUT_MS, SPAN_ATTRIBUTES, SPAN_NAME } from './types'; diff --git a/packages/react-native-tracing/src/react-navigation/instrumentation.ts b/packages/react-native-tracing/src/react-navigation/instrumentation.ts index 857f1c20d..78fcf2d54 100644 --- a/packages/react-native-tracing/src/react-navigation/instrumentation.ts +++ b/packages/react-native-tracing/src/react-navigation/instrumentation.ts @@ -1,4 +1,4 @@ -import { BaseInstrumentation, VERSION } from '@grafana/faro-web-sdk'; +import { BaseInstrumentation, VERSION } from '@grafana/faro-core'; import { setDependencies } from './dependencies'; import { metaPage } from './metaPage'; From fd9a13576003dad865fcc93cb493844a8644a09f Mon Sep 17 00:00:00 2001 From: Marco Caldera Date: Mon, 13 Jan 2025 16:02:53 +0100 Subject: [PATCH 35/43] fix: writable map --- .../NativeInstrumentationModule.java | 40 ++++++++++++++----- 1 file changed, 30 insertions(+), 10 deletions(-) diff --git a/packages/react-native-tracing/android/src/main/java/com/grafana/nativeinstrumentation/NativeInstrumentationModule.java b/packages/react-native-tracing/android/src/main/java/com/grafana/nativeinstrumentation/NativeInstrumentationModule.java index a60ca35a8..944930784 100644 --- a/packages/react-native-tracing/android/src/main/java/com/grafana/nativeinstrumentation/NativeInstrumentationModule.java +++ b/packages/react-native-tracing/android/src/main/java/com/grafana/nativeinstrumentation/NativeInstrumentationModule.java @@ -16,7 +16,10 @@ public class NativeInstrumentationModule extends ReactContextBaseJavaModule implements RCTEventEmitter { public static final String NAME = "NativeInstrumentation"; private static Long startTime = null; - private static WritableMap cachedMetrics = null; + + private static Double cachedStartStartupTime = null; + private static Double cachedEndStartupTime = null; + private static Double cachedStartupDuration = null; static { ReactMarker.addListener((name, tag, instanceKey) -> { @@ -41,11 +44,30 @@ public String getName() { public static void initializeNativeInstrumentation() { android.util.Log.d(NAME, "Initializing native instrumentation..."); - cachedMetrics = null; + cachedStartStartupTime = null; + cachedEndStartupTime = null; + cachedStartupDuration = null; startTime = System.currentTimeMillis(); android.util.Log.d(NAME, String.format("Initialized with start time: %d (previous metrics cleared)", startTime)); } + /** + * Creates a fresh WritableMap with startup metrics. + * Note: Each WritableMap can only be consumed once when passed through the React Native bridge. + * This method ensures we always create a new instance for each request. + * + * Each map can be consumed once by the JS side (i.e., going through the bridge). + * + * @return A new WritableMap instance containing the startup metrics + */ + private WritableMap createStartupMetricsMap(double startStartupTime, double endStartupTime, double startupDuration) { + WritableMap params = Arguments.createMap(); + params.putDouble("startStartupTime", startStartupTime); + params.putDouble("endStartupTime", endStartupTime); + params.putDouble("startupDuration", startupDuration); + return params; + } + @ReactMethod public void getStartupTime(Promise promise) { android.util.Log.d(NAME, "Getting startup time..."); @@ -56,9 +78,9 @@ public void getStartupTime(Promise promise) { return; } - if (cachedMetrics != null) { + if (cachedStartupDuration != null) { android.util.Log.d(NAME, "Returning cached metrics"); - promise.resolve(cachedMetrics); + promise.resolve(createStartupMetricsMap(cachedStartStartupTime, cachedEndStartupTime, cachedStartupDuration)); return; } @@ -70,14 +92,12 @@ public void getStartupTime(Promise promise) { startTime, endTime, duration )); - WritableMap params = Arguments.createMap(); - params.putDouble("startStartupTime", (double) startTime); - params.putDouble("endStartupTime", (double) endTime); - params.putDouble("startupDuration", duration); + cachedStartStartupTime = (double) startTime; + cachedEndStartupTime = (double) endTime; + cachedStartupDuration = duration; - cachedMetrics = params; android.util.Log.d(NAME, "Metrics cached and being returned"); - promise.resolve(params); + promise.resolve(createStartupMetricsMap(cachedStartStartupTime, cachedEndStartupTime, cachedStartupDuration)); } @ReactMethod From db2eead9d775fa6f41bd5ea5597387759ac8e103 Mon Sep 17 00:00:00 2001 From: Lucas Bento Date: Thu, 30 Jan 2025 11:02:54 +0100 Subject: [PATCH 36/43] refactor: add a better way to measure startup time --- .../NativeInstrumentationModule.java | 98 ++++++++----------- .../NativeInstrumentationPackage.java | 3 - .../ios/NativeInstrumentation.h | 3 +- .../ios/NativeInstrumentation.m | 5 +- .../ios/NativeInstrumentation.swift | 87 ++++++++++------ packages/react-native-tracing/src/wrapHOC.tsx | 26 +++-- 6 files changed, 123 insertions(+), 99 deletions(-) diff --git a/packages/react-native-tracing/android/src/main/java/com/grafana/nativeinstrumentation/NativeInstrumentationModule.java b/packages/react-native-tracing/android/src/main/java/com/grafana/nativeinstrumentation/NativeInstrumentationModule.java index 944930784..c3c591fa6 100644 --- a/packages/react-native-tracing/android/src/main/java/com/grafana/nativeinstrumentation/NativeInstrumentationModule.java +++ b/packages/react-native-tracing/android/src/main/java/com/grafana/nativeinstrumentation/NativeInstrumentationModule.java @@ -11,30 +11,34 @@ import com.facebook.react.bridge.ReactMarker; import com.facebook.react.bridge.ReactMarkerConstants; import com.facebook.react.uimanager.events.RCTEventEmitter; +import android.os.Process; +import android.os.SystemClock; +import java.math.BigInteger; +import android.util.Log; @ReactModule(name = NativeInstrumentationModule.NAME) public class NativeInstrumentationModule extends ReactContextBaseJavaModule implements RCTEventEmitter { public static final String NAME = "NativeInstrumentation"; - private static Long startTime = null; - - private static Double cachedStartStartupTime = null; - private static Double cachedEndStartupTime = null; - private static Double cachedStartupDuration = null; + private static boolean hasAppRestarted = false; + private static int bundleLoadCounter = 0; static { ReactMarker.addListener((name, tag, instanceKey) -> { - long currentTime = System.currentTimeMillis(); - if (name == ReactMarkerConstants.PRE_RUN_JS_BUNDLE_START) { - android.util.Log.d(NAME, String.format("JS bundle load started at: %d", currentTime)); - initializeNativeInstrumentation(); + if (!hasAppRestarted) { + if (bundleLoadCounter > 0) { + hasAppRestarted = true; + } + bundleLoadCounter++; + } + Log.d(NAME, String.format("JS bundle downloaded, hasAppRestarted: %b", hasAppRestarted)); } }); } public NativeInstrumentationModule(ReactApplicationContext reactContext) { super(reactContext); - android.util.Log.d(NAME, "Module constructor called"); + Log.d(NAME, "Module constructor called"); } @Override @@ -42,62 +46,42 @@ public String getName() { return NAME; } - public static void initializeNativeInstrumentation() { - android.util.Log.d(NAME, "Initializing native instrumentation..."); - cachedStartStartupTime = null; - cachedEndStartupTime = null; - cachedStartupDuration = null; - startTime = System.currentTimeMillis(); - android.util.Log.d(NAME, String.format("Initialized with start time: %d (previous metrics cleared)", startTime)); - } + @ReactMethod(isBlockingSynchronousMethod = true) + public double getStartupTimeSync() throws Exception { + try { + long currentTime = System.currentTimeMillis(); + long processStartTime = Process.getStartUptimeMillis(); + long currentUptime = SystemClock.uptimeMillis(); - /** - * Creates a fresh WritableMap with startup metrics. - * Note: Each WritableMap can only be consumed once when passed through the React Native bridge. - * This method ensures we always create a new instance for each request. - * - * Each map can be consumed once by the JS side (i.e., going through the bridge). - * - * @return A new WritableMap instance containing the startup metrics - */ - private WritableMap createStartupMetricsMap(double startStartupTime, double endStartupTime, double startupDuration) { - WritableMap params = Arguments.createMap(); - params.putDouble("startStartupTime", startStartupTime); - params.putDouble("endStartupTime", endStartupTime); - params.putDouble("startupDuration", startupDuration); - return params; - } + long startupTime = currentTime - currentUptime + processStartTime; - @ReactMethod - public void getStartupTime(Promise promise) { - android.util.Log.d(NAME, "Getting startup time..."); + return BigInteger.valueOf(startupTime).doubleValue(); + } catch (Exception e) { + Log.e(NAME, "Error calculating startup time", e); - if (startTime == null) { - android.util.Log.e(NAME, "Error: Start time was not initialized"); - promise.reject("NO_START_TIME", "[NativeInstrumentation] Start time was not initialized"); - return; + throw e; } + } - if (cachedStartupDuration != null) { - android.util.Log.d(NAME, "Returning cached metrics"); - promise.resolve(createStartupMetricsMap(cachedStartStartupTime, cachedEndStartupTime, cachedStartupDuration)); - return; - } + @ReactMethod + public void getStartupTime(Promise promise) { + Log.d(NAME, "Getting startup time..."); + try { + WritableMap response = Arguments.createMap(); - long endTime = System.currentTimeMillis(); - double duration = (endTime - startTime) / 1000.0; + double startupTime = getStartupTimeSync(); - android.util.Log.d(NAME, String.format( - "Calculating metrics - Start: %d, End: %d, Duration: %f seconds", - startTime, endTime, duration - )); + response.putDouble("startupTime", startupTime); - cachedStartStartupTime = (double) startTime; - cachedEndStartupTime = (double) endTime; - cachedStartupDuration = duration; + promise.resolve(response); + } catch (Exception e) { + promise.reject("STARTUP_TIME_ERROR", "Failed to get startup time: " + e.getMessage(), e); + } + } - android.util.Log.d(NAME, "Metrics cached and being returned"); - promise.resolve(createStartupMetricsMap(cachedStartStartupTime, cachedEndStartupTime, cachedStartupDuration)); + @ReactMethod + public void getHasAppRestarted(Promise promise) { + promise.resolve(hasAppRestarted); } @ReactMethod diff --git a/packages/react-native-tracing/android/src/main/java/com/grafana/nativeinstrumentation/NativeInstrumentationPackage.java b/packages/react-native-tracing/android/src/main/java/com/grafana/nativeinstrumentation/NativeInstrumentationPackage.java index 9a0f3a8c4..bd06455d5 100644 --- a/packages/react-native-tracing/android/src/main/java/com/grafana/nativeinstrumentation/NativeInstrumentationPackage.java +++ b/packages/react-native-tracing/android/src/main/java/com/grafana/nativeinstrumentation/NativeInstrumentationPackage.java @@ -12,16 +12,13 @@ public class NativeInstrumentationPackage implements ReactPackage { @Override public List createViewManagers(ReactApplicationContext reactContext) { - android.util.Log.d("NativeInstrumentation", "Creating view managers (none needed)"); return Collections.emptyList(); } @Override public List createNativeModules(ReactApplicationContext reactContext) { - android.util.Log.d("NativeInstrumentation", "Creating native modules"); List modules = new ArrayList<>(); modules.add(new NativeInstrumentationModule(reactContext)); - android.util.Log.d("NativeInstrumentation", "Native instrumentation module added to modules list"); return modules; } } \ No newline at end of file diff --git a/packages/react-native-tracing/ios/NativeInstrumentation.h b/packages/react-native-tracing/ios/NativeInstrumentation.h index c38cd82f1..bc53dabdb 100644 --- a/packages/react-native-tracing/ios/NativeInstrumentation.h +++ b/packages/react-native-tracing/ios/NativeInstrumentation.h @@ -7,7 +7,8 @@ NS_ASSUME_NONNULL_BEGIN - (void)getStartupTime:(RCTPromiseResolveBlock)resolve rejecter:(RCTPromiseRejectBlock)reject; -+ (void)initializeNativeInstrumentation; +- (void)getHasAppRestarted:(RCTPromiseResolveBlock)resolve + rejecter:(RCTPromiseRejectBlock)reject; @end diff --git a/packages/react-native-tracing/ios/NativeInstrumentation.m b/packages/react-native-tracing/ios/NativeInstrumentation.m index cc86f4fe2..e1c89b1ed 100644 --- a/packages/react-native-tracing/ios/NativeInstrumentation.m +++ b/packages/react-native-tracing/ios/NativeInstrumentation.m @@ -4,5 +4,8 @@ @interface RCT_EXTERN_REMAP_MODULE(NativeInstrumentation, NativeInstrumentation, RCT_EXTERN_METHOD(getStartupTime:(RCTPromiseResolveBlock)resolve rejecter:(RCTPromiseRejectBlock)reject) + +RCT_EXTERN_METHOD(getHasAppRestarted:(RCTPromiseResolveBlock)resolve + rejecter:(RCTPromiseRejectBlock)reject) -@end \ No newline at end of file +@end diff --git a/packages/react-native-tracing/ios/NativeInstrumentation.swift b/packages/react-native-tracing/ios/NativeInstrumentation.swift index 3312212cb..c125a7b3f 100644 --- a/packages/react-native-tracing/ios/NativeInstrumentation.swift +++ b/packages/react-native-tracing/ios/NativeInstrumentation.swift @@ -3,18 +3,7 @@ import React @objc(NativeInstrumentation) public class NativeInstrumentation: NSObject, RCTBridgeModule { - private static var startTime: TimeInterval? - private static var cachedMetrics: [String: Double]? - - @objc - public static func initializeNativeInstrumentation() { - NativeInstrumentation.cachedMetrics = nil - NativeInstrumentation.startTime = Date().timeIntervalSince1970 - } - - override init() { - super.init() - } + private static var hasAppRestarted: Bool = false @objc public static func requiresMainQueueSetup() -> Bool { @@ -26,28 +15,68 @@ public class NativeInstrumentation: NSObject, RCTBridgeModule { return "NativeInstrumentation" } - @objc - public func getStartupTime(_ resolve: @escaping RCTPromiseResolveBlock, rejecter reject: @escaping RCTPromiseRejectBlock) { - guard let startTime = NativeInstrumentation.startTime else { - reject("NO_START_TIME", "[NativeInstrumentation] Start time was not initialized", nil) + override init() { + super.init() + NotificationCenter.default.addObserver( + self, + selector: #selector(handleBundleLoadStart(_:)), + name: NSNotification.Name("RCTJavaScriptWillStartLoadingNotification"), + object: nil + ) + } + + @objc private func handleBundleLoadStart(_ notification: Notification) { + print("[NativeInstrumentation] Bundle load started") + + if NativeInstrumentation.hasAppRestarted { + print("[NativeInstrumentation] Skipping bundle load start as app has been restarted") return } + + print("[NativeInstrumentation] App has been restarted"); + NativeInstrumentation.hasAppRestarted = true + } + + @objc + public func getStartupTime(_ resolve: @escaping RCTPromiseResolveBlock, rejecter reject: @escaping RCTPromiseRejectBlock) { + print("[NativeInstrumentation] Getting startup time...") - if let metrics = NativeInstrumentation.cachedMetrics { - resolve(metrics) - return - } + var mib = [CTL_KERN, KERN_PROC, KERN_PROC_PID, getpid()] + var size = MemoryLayout.size + var kp = kinfo_proc() - let endTime = Date().timeIntervalSince1970 - let duration = endTime - startTime + let result = mib.withUnsafeMutableBytes { mibBytes in + withUnsafeMutablePointer(to: &size) { sizeBytes in + withUnsafeMutablePointer(to: &kp) { kpBytes in + sysctl(mibBytes.baseAddress?.assumingMemoryBound(to: Int32.self), 4, + kpBytes, + sizeBytes, + nil, 0) + } + } + } - let metrics: [String: Double] = [ - "startStartupTime": startTime, - "endStartupTime": endTime, - "startupDuration": duration - ] + let startTimeMs: Int64 + if result == 0 { + let startTime = kp.kp_proc.p_un.__p_starttime + startTimeMs = Int64(startTime.tv_sec) * 1000 + Int64(startTime.tv_usec) / 1000 + print("[NativeInstrumentation] Successfully got process start time: \(startTimeMs)ms") + } else { + startTimeMs = Int64(Date().timeIntervalSince1970 * 1000) + print("[NativeInstrumentation] Warning: Failed to get process start time, falling back to current time: \(startTimeMs)ms") + } - NativeInstrumentation.cachedMetrics = metrics - resolve(metrics) + let response = ["startupTime": startTimeMs] + print("[NativeInstrumentation] Resolving with response: \(response)") + resolve(response) + } + + @objc + public func getHasAppRestarted(_ resolve: @escaping RCTPromiseResolveBlock, rejecter reject: @escaping RCTPromiseRejectBlock) { + resolve(NativeInstrumentation.hasAppRestarted) + } + + deinit { + NotificationCenter.default.removeObserver(self) } } diff --git a/packages/react-native-tracing/src/wrapHOC.tsx b/packages/react-native-tracing/src/wrapHOC.tsx index 073ca0fd7..6cd5b1056 100644 --- a/packages/react-native-tracing/src/wrapHOC.tsx +++ b/packages/react-native-tracing/src/wrapHOC.tsx @@ -1,26 +1,35 @@ import React, { useEffect } from 'react'; +// @ts-ignore +// eslint-disable-next-line import/namespace +import { Alert, NativeModules } from 'react-native'; import { api } from './dependencies'; interface StartupMetrics { - startStartupTime: number; - endStartupTime: number; - startupDuration: number; + startupTime: number; } -// TODO(@lucasbento): figure out where to best place this function const measureStartupTime = async (): Promise => { try { - const metrics: StartupMetrics = - await require('react-native')['NativeModules']['NativeInstrumentation'].getStartupTime(); + const hasAppRestarted = await NativeModules['NativeInstrumentation'].getHasAppRestarted(); + + if (hasAppRestarted) { + return; + } + + const metrics: StartupMetrics = await NativeModules['NativeInstrumentation'].getStartupTime(); + + const currentTime = Date.now(); + const startupDuration = currentTime - metrics.startupTime; api.pushMeasurement({ type: 'app_startup_time', values: { - startup_duration: metrics.startupDuration, + startup_duration: startupDuration, }, + timestamp: new Date().toISOString(), }); - } catch (error) { + } catch (error: unknown) { console.warn('[NativeInstrumentation] Failed to measure startup time:', error); } }; @@ -31,6 +40,7 @@ export function wrap

(WrappedComponent: React.ComponentType

) measureStartupTime(); }, []); + // @ts-ignore return ; }; } From 761df19f623888e9a9c6a9bc8128130c9b4c20eb Mon Sep 17 00:00:00 2001 From: Lucas Bento Date: Thu, 30 Jan 2025 12:21:33 +0100 Subject: [PATCH 37/43] refactor: remove logs --- .../NativeInstrumentationModule.java | 4 ---- .../react-native-tracing/ios/NativeInstrumentation.swift | 9 --------- 2 files changed, 13 deletions(-) diff --git a/packages/react-native-tracing/android/src/main/java/com/grafana/nativeinstrumentation/NativeInstrumentationModule.java b/packages/react-native-tracing/android/src/main/java/com/grafana/nativeinstrumentation/NativeInstrumentationModule.java index c3c591fa6..0b5459aed 100644 --- a/packages/react-native-tracing/android/src/main/java/com/grafana/nativeinstrumentation/NativeInstrumentationModule.java +++ b/packages/react-native-tracing/android/src/main/java/com/grafana/nativeinstrumentation/NativeInstrumentationModule.java @@ -18,7 +18,6 @@ @ReactModule(name = NativeInstrumentationModule.NAME) public class NativeInstrumentationModule extends ReactContextBaseJavaModule implements RCTEventEmitter { - public static final String NAME = "NativeInstrumentation"; private static boolean hasAppRestarted = false; private static int bundleLoadCounter = 0; @@ -31,14 +30,12 @@ public class NativeInstrumentationModule extends ReactContextBaseJavaModule impl } bundleLoadCounter++; } - Log.d(NAME, String.format("JS bundle downloaded, hasAppRestarted: %b", hasAppRestarted)); } }); } public NativeInstrumentationModule(ReactApplicationContext reactContext) { super(reactContext); - Log.d(NAME, "Module constructor called"); } @Override @@ -65,7 +62,6 @@ public double getStartupTimeSync() throws Exception { @ReactMethod public void getStartupTime(Promise promise) { - Log.d(NAME, "Getting startup time..."); try { WritableMap response = Arguments.createMap(); diff --git a/packages/react-native-tracing/ios/NativeInstrumentation.swift b/packages/react-native-tracing/ios/NativeInstrumentation.swift index c125a7b3f..941aec503 100644 --- a/packages/react-native-tracing/ios/NativeInstrumentation.swift +++ b/packages/react-native-tracing/ios/NativeInstrumentation.swift @@ -26,21 +26,15 @@ public class NativeInstrumentation: NSObject, RCTBridgeModule { } @objc private func handleBundleLoadStart(_ notification: Notification) { - print("[NativeInstrumentation] Bundle load started") - if NativeInstrumentation.hasAppRestarted { - print("[NativeInstrumentation] Skipping bundle load start as app has been restarted") return } - print("[NativeInstrumentation] App has been restarted"); NativeInstrumentation.hasAppRestarted = true } @objc public func getStartupTime(_ resolve: @escaping RCTPromiseResolveBlock, rejecter reject: @escaping RCTPromiseRejectBlock) { - print("[NativeInstrumentation] Getting startup time...") - var mib = [CTL_KERN, KERN_PROC, KERN_PROC_PID, getpid()] var size = MemoryLayout.size var kp = kinfo_proc() @@ -60,14 +54,11 @@ public class NativeInstrumentation: NSObject, RCTBridgeModule { if result == 0 { let startTime = kp.kp_proc.p_un.__p_starttime startTimeMs = Int64(startTime.tv_sec) * 1000 + Int64(startTime.tv_usec) / 1000 - print("[NativeInstrumentation] Successfully got process start time: \(startTimeMs)ms") } else { startTimeMs = Int64(Date().timeIntervalSince1970 * 1000) - print("[NativeInstrumentation] Warning: Failed to get process start time, falling back to current time: \(startTimeMs)ms") } let response = ["startupTime": startTimeMs] - print("[NativeInstrumentation] Resolving with response: \(response)") resolve(response) } From 8438b12f8536afbd0ad399fa82f6e7b4866a6dbc Mon Sep 17 00:00:00 2001 From: Lucas Bento Date: Thu, 30 Jan 2025 15:43:13 +0100 Subject: [PATCH 38/43] refactor: add missing `do-catch` --- .../ios/NativeInstrumentation.swift | 50 +++++++++++-------- 1 file changed, 28 insertions(+), 22 deletions(-) diff --git a/packages/react-native-tracing/ios/NativeInstrumentation.swift b/packages/react-native-tracing/ios/NativeInstrumentation.swift index 941aec503..906487f75 100644 --- a/packages/react-native-tracing/ios/NativeInstrumentation.swift +++ b/packages/react-native-tracing/ios/NativeInstrumentation.swift @@ -35,31 +35,37 @@ public class NativeInstrumentation: NSObject, RCTBridgeModule { @objc public func getStartupTime(_ resolve: @escaping RCTPromiseResolveBlock, rejecter reject: @escaping RCTPromiseRejectBlock) { - var mib = [CTL_KERN, KERN_PROC, KERN_PROC_PID, getpid()] - var size = MemoryLayout.size - var kp = kinfo_proc() - - let result = mib.withUnsafeMutableBytes { mibBytes in - withUnsafeMutablePointer(to: &size) { sizeBytes in - withUnsafeMutablePointer(to: &kp) { kpBytes in - sysctl(mibBytes.baseAddress?.assumingMemoryBound(to: Int32.self), 4, - kpBytes, - sizeBytes, - nil, 0) + do { + var mib = [CTL_KERN, KERN_PROC, KERN_PROC_PID, getpid()] + var size = MemoryLayout.size + var kp = kinfo_proc() + + let result = mib.withUnsafeMutableBytes { mibBytes in + withUnsafeMutablePointer(to: &size) { sizeBytes in + withUnsafeMutablePointer(to: &kp) { kpBytes in + sysctl(mibBytes.baseAddress?.assumingMemoryBound(to: Int32.self), 4, + kpBytes, + sizeBytes, + nil, 0) + } } } + + let startTimeMs: Int64 + if result == 0 { + let startTime = kp.kp_proc.p_un.__p_starttime + startTimeMs = Int64(startTime.tv_sec) * 1000 + Int64(startTime.tv_usec) / 1000 + } else { + throw NSError(domain: "NativeInstrumentation", + code: Int(result), + userInfo: [NSLocalizedDescriptionKey: "Failed to get process info"]) + } + + let response = ["startupTime": startTimeMs] + resolve(response) + } catch { + reject("STARTUP_TIME_ERROR", "Failed to get startup time: \(error.localizedDescription)", error) } - - let startTimeMs: Int64 - if result == 0 { - let startTime = kp.kp_proc.p_un.__p_starttime - startTimeMs = Int64(startTime.tv_sec) * 1000 + Int64(startTime.tv_usec) / 1000 - } else { - startTimeMs = Int64(Date().timeIntervalSince1970 * 1000) - } - - let response = ["startupTime": startTimeMs] - resolve(response) } @objc From a72bdc05e57608268cee6343072a27e36d51100f Mon Sep 17 00:00:00 2001 From: Lucas Bento Date: Fri, 31 Jan 2025 10:00:43 +0100 Subject: [PATCH 39/43] refactor: add missing name variable for logs --- .../nativeinstrumentation/NativeInstrumentationModule.java | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/react-native-tracing/android/src/main/java/com/grafana/nativeinstrumentation/NativeInstrumentationModule.java b/packages/react-native-tracing/android/src/main/java/com/grafana/nativeinstrumentation/NativeInstrumentationModule.java index 0b5459aed..5b22db2c8 100644 --- a/packages/react-native-tracing/android/src/main/java/com/grafana/nativeinstrumentation/NativeInstrumentationModule.java +++ b/packages/react-native-tracing/android/src/main/java/com/grafana/nativeinstrumentation/NativeInstrumentationModule.java @@ -18,6 +18,7 @@ @ReactModule(name = NativeInstrumentationModule.NAME) public class NativeInstrumentationModule extends ReactContextBaseJavaModule implements RCTEventEmitter { + public static final String NAME = "NativeInstrumentation"; private static boolean hasAppRestarted = false; private static int bundleLoadCounter = 0; From 5e7262a60b65a8fd0c8c1b6c66df2daa04e5fb4f Mon Sep 17 00:00:00 2001 From: Lucas Bento Date: Thu, 6 Feb 2025 12:10:00 +0100 Subject: [PATCH 40/43] feat: add `whiteListedURLs` to web-socket instrumentation config --- .../instrumentation-websocket/src/instrumentation.ts | 8 ++++++-- experimental/instrumentation-websocket/src/types.ts | 1 + 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/experimental/instrumentation-websocket/src/instrumentation.ts b/experimental/instrumentation-websocket/src/instrumentation.ts index d4861baaf..68275e985 100644 --- a/experimental/instrumentation-websocket/src/instrumentation.ts +++ b/experimental/instrumentation-websocket/src/instrumentation.ts @@ -17,6 +17,7 @@ export class WebSocketInstrumentation> extends Instr private messageTransform: MessageTransform; private sendTransform: MessageTransform; + private whiteListedURLs: string[]; private pendingRequests = new Map(); @@ -25,6 +26,7 @@ export class WebSocketInstrumentation> extends Instr this.messageTransform = options.messageTransform ?? this.defaultTransform; this.sendTransform = options.sendTransform ?? this.defaultTransform; + this.whiteListedURLs = options.whiteListedURLs ?? []; } protected init() { @@ -88,8 +90,10 @@ export class WebSocketInstrumentation> extends Instr constructor(url: string, protocols?: string | string[]) { super(url, protocols); - if (isLocalhost(url)) { - console.log('Skipping WebSocket instrumentation for localhost:', url); + const isURLWhitelistEmpty = self.whiteListedURLs.length === 0; + + if (isLocalhost(url) || (!isURLWhitelistEmpty && !self.whiteListedURLs.includes(url))) { + console.log('Skipping WebSocket instrumentation for non-whitelisted URL:', url); return; } diff --git a/experimental/instrumentation-websocket/src/types.ts b/experimental/instrumentation-websocket/src/types.ts index 9d54e38ac..a26f7df92 100644 --- a/experimental/instrumentation-websocket/src/types.ts +++ b/experimental/instrumentation-websocket/src/types.ts @@ -7,6 +7,7 @@ export type MessageTransform> = ( export interface WebSocketInstrumentationConfig> { messageTransform?: MessageTransform; sendTransform?: MessageTransform; + whiteListedURLs?: string[]; } export interface PendingRequest { From 2aa268868fee7684df3f90ed8b14719304d4f6c9 Mon Sep 17 00:00:00 2001 From: Lucas Bento Date: Fri, 7 Feb 2025 11:09:52 +0100 Subject: [PATCH 41/43] refactor: initialize `whiteListedURLs` with empty array --- experimental/instrumentation-websocket/src/instrumentation.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/experimental/instrumentation-websocket/src/instrumentation.ts b/experimental/instrumentation-websocket/src/instrumentation.ts index 68275e985..3be766b9b 100644 --- a/experimental/instrumentation-websocket/src/instrumentation.ts +++ b/experimental/instrumentation-websocket/src/instrumentation.ts @@ -17,7 +17,7 @@ export class WebSocketInstrumentation> extends Instr private messageTransform: MessageTransform; private sendTransform: MessageTransform; - private whiteListedURLs: string[]; + private whiteListedURLs: string[] = []; private pendingRequests = new Map(); From 1a2882ec4f0c56e7b6ba7e5d82bad6de4c29d0df Mon Sep 17 00:00:00 2001 From: Ilia Kurganskii Date: Fri, 7 Feb 2025 12:44:01 +0100 Subject: [PATCH 42/43] feat: add support for persistent sessions (#5) --- packages/react-native-sdk/package.json | 4 +- .../src/config/getWebInstrumentations.ts | 8 - packages/react-native-sdk/src/index.ts | 2 - .../src/instrumentations/index.ts | 12 - .../src/instrumentations/performance/index.ts | 1 - .../performance/instrumentation.test.ts | 152 ---------- .../performance/instrumentation.ts | 33 --- .../performance/navigation.test.ts | 172 ------------ .../performance/navigation.ts | 57 ---- .../performance/performanceConstants.ts | 2 - .../performance/performanceUtils.test.ts | 204 -------------- .../performance/performanceUtils.ts | 200 ------------- .../performance/performanceUtilsTestData.ts | 87 ------ .../performance/resource.test.ts | 162 ----------- .../instrumentations/performance/resource.ts | 57 ---- .../src/instrumentations/performance/types.ts | 49 ---- .../session/instrumentation.ts | 14 +- .../PersistentSessionsManager.ts | 27 +- .../sessionManager/VolatileSessionManager.ts | 10 +- .../sessionManager/sessionManagerUtils.ts | 19 +- .../src/instrumentations/webVitals/index.ts | 1 - .../webVitals/instrumentation.test.ts | 44 --- .../webVitals/instrumentation.ts | 22 -- .../webVitals/webVitalsBasic.test.ts | 42 --- .../webVitals/webVitalsBasic.ts | 30 -- .../webVitalsWithAttribution.test.ts | 263 ------------------ .../webVitals/webVitalsWithAttribution.ts | 170 ----------- .../src/utils/asyncStorage.ts | 16 ++ packages/react-native-sdk/src/utils/index.ts | 6 +- .../react-native-sdk/src/utils/webStorage.ts | 86 ------ yarn.lock | 37 ++- 31 files changed, 64 insertions(+), 1925 deletions(-) delete mode 100644 packages/react-native-sdk/src/instrumentations/performance/index.ts delete mode 100644 packages/react-native-sdk/src/instrumentations/performance/instrumentation.test.ts delete mode 100644 packages/react-native-sdk/src/instrumentations/performance/instrumentation.ts delete mode 100644 packages/react-native-sdk/src/instrumentations/performance/navigation.test.ts delete mode 100644 packages/react-native-sdk/src/instrumentations/performance/navigation.ts delete mode 100644 packages/react-native-sdk/src/instrumentations/performance/performanceConstants.ts delete mode 100644 packages/react-native-sdk/src/instrumentations/performance/performanceUtils.test.ts delete mode 100644 packages/react-native-sdk/src/instrumentations/performance/performanceUtils.ts delete mode 100644 packages/react-native-sdk/src/instrumentations/performance/performanceUtilsTestData.ts delete mode 100644 packages/react-native-sdk/src/instrumentations/performance/resource.test.ts delete mode 100644 packages/react-native-sdk/src/instrumentations/performance/resource.ts delete mode 100644 packages/react-native-sdk/src/instrumentations/performance/types.ts delete mode 100644 packages/react-native-sdk/src/instrumentations/webVitals/index.ts delete mode 100644 packages/react-native-sdk/src/instrumentations/webVitals/instrumentation.test.ts delete mode 100644 packages/react-native-sdk/src/instrumentations/webVitals/instrumentation.ts delete mode 100644 packages/react-native-sdk/src/instrumentations/webVitals/webVitalsBasic.test.ts delete mode 100644 packages/react-native-sdk/src/instrumentations/webVitals/webVitalsBasic.ts delete mode 100644 packages/react-native-sdk/src/instrumentations/webVitals/webVitalsWithAttribution.test.ts delete mode 100644 packages/react-native-sdk/src/instrumentations/webVitals/webVitalsWithAttribution.ts create mode 100644 packages/react-native-sdk/src/utils/asyncStorage.ts delete mode 100644 packages/react-native-sdk/src/utils/webStorage.ts diff --git a/packages/react-native-sdk/package.json b/packages/react-native-sdk/package.json index 02033bf63..e763b1cab 100644 --- a/packages/react-native-sdk/package.json +++ b/packages/react-native-sdk/package.json @@ -60,10 +60,12 @@ "devDependencies": { "@types/ua-parser-js": "^0.7.36", "react-native": "0.72.6", + "@react-native-async-storage/async-storage": "1.15.5", "user-agent-data-types": "^0.4.2" }, "peerDependencies": { - "react-native": ">=0.70.0" + "react-native": ">=0.70.0", + "@react-native-async-storage/async-storage": ">= 1.15.5" }, "publishConfig": { "access": "public" diff --git a/packages/react-native-sdk/src/config/getWebInstrumentations.ts b/packages/react-native-sdk/src/config/getWebInstrumentations.ts index 7284cebdf..9f73ef9f5 100644 --- a/packages/react-native-sdk/src/config/getWebInstrumentations.ts +++ b/packages/react-native-sdk/src/config/getWebInstrumentations.ts @@ -3,10 +3,8 @@ import type { Instrumentation } from '@grafana/faro-core'; import { ConsoleInstrumentation, ErrorsInstrumentation, - PerformanceInstrumentation, SessionInstrumentation, ViewInstrumentation, - WebVitalsInstrumentation, } from '../instrumentations'; import type { GetWebInstrumentationsOptions } from './types'; @@ -14,16 +12,10 @@ import type { GetWebInstrumentationsOptions } from './types'; export function getWebInstrumentations(options: GetWebInstrumentationsOptions = {}): Instrumentation[] { const instrumentations: Instrumentation[] = [ new ErrorsInstrumentation(), - new WebVitalsInstrumentation(), new SessionInstrumentation(), new ViewInstrumentation(), ]; - if (options.enablePerformanceInstrumentation !== false) { - // unshift to ensure that initialization starts before the other instrumentations - instrumentations.unshift(new PerformanceInstrumentation()); - } - if (options.captureConsole !== false) { instrumentations.push( new ConsoleInstrumentation({ diff --git a/packages/react-native-sdk/src/index.ts b/packages/react-native-sdk/src/index.ts index bc4374b8d..9c46fa036 100644 --- a/packages/react-native-sdk/src/index.ts +++ b/packages/react-native-sdk/src/index.ts @@ -13,9 +13,7 @@ export { getStackFramesFromError, parseStacktrace, ViewInstrumentation, - WebVitalsInstrumentation, SessionInstrumentation, - PerformanceInstrumentation, } from './instrumentations'; export type { ConsoleInstrumentationOptions, ErrorEvent, ExtendedPromiseRejectionEvent } from './instrumentations'; diff --git a/packages/react-native-sdk/src/instrumentations/index.ts b/packages/react-native-sdk/src/instrumentations/index.ts index c5206d789..bc1a8441f 100644 --- a/packages/react-native-sdk/src/instrumentations/index.ts +++ b/packages/react-native-sdk/src/instrumentations/index.ts @@ -14,16 +14,4 @@ export type { ErrorEvent, ExtendedPromiseRejectionEvent } from './errors'; export { ViewInstrumentation } from './view'; -export { WebVitalsInstrumentation } from './webVitals'; -export { - PersistentSessionsManager, - VolatileSessionsManager, - MAX_SESSION_PERSISTENCE_TIME, - MAX_SESSION_PERSISTENCE_TIME_BUFFER, - SESSION_EXPIRATION_TIME, - SESSION_INACTIVITY_TIME, - STORAGE_KEY, -} from './session'; - -export { PerformanceInstrumentation } from './performance'; diff --git a/packages/react-native-sdk/src/instrumentations/performance/index.ts b/packages/react-native-sdk/src/instrumentations/performance/index.ts deleted file mode 100644 index 2ff437d05..000000000 --- a/packages/react-native-sdk/src/instrumentations/performance/index.ts +++ /dev/null @@ -1 +0,0 @@ -export { PerformanceInstrumentation } from './instrumentation'; diff --git a/packages/react-native-sdk/src/instrumentations/performance/instrumentation.test.ts b/packages/react-native-sdk/src/instrumentations/performance/instrumentation.test.ts deleted file mode 100644 index 810c53ea2..000000000 --- a/packages/react-native-sdk/src/instrumentations/performance/instrumentation.test.ts +++ /dev/null @@ -1,152 +0,0 @@ -import { initializeFaro } from '@grafana/faro-core'; -import type { EventEvent, TransportItem } from '@grafana/faro-core'; -import { mockConfig, mockInternalLogger, MockTransport } from '@grafana/faro-core/src/testUtils'; - -import { FetchTransport } from '../../transports'; - -import { PerformanceInstrumentation } from './instrumentation'; -import * as navigationModule from './navigation'; -import * as performanceUtilsModule from './performanceUtils'; -import { - analyticsEntry1, - analyticsEntry2, - performanceNavigationEntry, - performanceResourceEntry, -} from './performanceUtilsTestData'; -import * as resourceModule from './resource'; -import type { FaroNavigationItem } from './types'; - -class MockPerformanceObserver { - constructor(private cb: PerformanceObserverCallback) {} - - disconnect = jest.fn(); - - observe() { - this.cb( - { - getEntries() { - return [ - { - name: performanceNavigationEntry.name, - toJSON: () => ({ - ...performanceNavigationEntry, - }), - }, - { - name: performanceResourceEntry.name, - toJSON: () => ({ - ...performanceResourceEntry, - }), - }, - { - name: analyticsEntry1.name, - toJSON: () => ({ - ...analyticsEntry1, - }), - }, - { - name: analyticsEntry2.name, - toJSON: () => ({ - ...analyticsEntry2, - }), - }, - ]; - }, - } as any, - {} as PerformanceObserver - ); - } -} - -const originalPerformanceObserver = (global as any).PerformanceObserver; - -(global as any).PerformanceObserver = MockPerformanceObserver; - -describe('Performance Instrumentation', () => { - afterEach(() => { - jest.clearAllMocks(); - jest.restoreAllMocks(); - }); - - afterAll(() => { - (global as any).PerformanceObserver = originalPerformanceObserver; - }); - - it('Stops initialization if performance observer is not supported', () => { - jest.spyOn(performanceUtilsModule, 'performanceObserverSupported').mockReturnValueOnce(false); - - const mockOnDocumentReady = jest.fn(); - jest.spyOn(performanceUtilsModule, 'onDocumentReady').mockImplementationOnce(mockOnDocumentReady); - - const performance = new PerformanceInstrumentation(); - - const mockDebug = jest.fn(); - performance.internalLogger = { ...mockInternalLogger, debug: mockDebug }; - - performance.initialize(); - - expect(mockDebug).toHaveBeenCalledTimes(1); - expect(mockOnDocumentReady).not.toHaveBeenCalled(); - }); - - it('Starts the performance observers', async () => { - const mockOnDocumentReady = jest.fn(); - jest.spyOn(performanceUtilsModule, 'onDocumentReady').mockImplementation((handleReady) => { - mockOnDocumentReady(); - handleReady(); - }); - - const mockObserveResourceTimings = jest.fn(); - jest.spyOn(resourceModule, 'observeResourceTimings').mockImplementationOnce(mockObserveResourceTimings); - - const mockObserveAndGetNavigationTimings = jest.fn(); - jest.spyOn(navigationModule, 'getNavigationTimings').mockImplementationOnce(() => { - mockObserveAndGetNavigationTimings(); - return Promise.resolve({ faroNavigationId: '123' } as FaroNavigationItem); - }); - - const config = mockConfig({ - instrumentations: [new PerformanceInstrumentation()], - }); - - initializeFaro(config); - - expect(mockOnDocumentReady).toHaveBeenCalledTimes(1); - expect(await mockObserveAndGetNavigationTimings).toHaveBeenCalledTimes(1); - - expect(mockObserveResourceTimings).toHaveBeenCalledTimes(1); - expect(mockObserveResourceTimings).toHaveBeenCalledWith('123', expect.anything(), expect.anything()); - }); - - it('Excludes entries which match the global ignoreUrls ', async () => { - const mockObserveAndGetNavigationTimings = jest.fn(); - jest.spyOn(navigationModule, 'getNavigationTimings').mockImplementationOnce(() => { - mockObserveAndGetNavigationTimings(); - return Promise.resolve({ faroNavigationId: '123' } as FaroNavigationItem); - }); - - const fetchTransport = new FetchTransport({ url: 'abc' }); - const config = mockConfig({ - transports: [fetchTransport], - instrumentations: [new PerformanceInstrumentation()], - ignoreUrls: [/.*foo-analytics/, /.*.analytics.com/, 'http://example.com/awesome-image'], - trackResources: true, - }); - - const faro = initializeFaro(config); - - const mockTransport = new MockTransport( - faro.transports.transports.flatMap((transport) => transport.getIgnoreUrls()) - ); - - faro.transports.add(mockTransport); - faro.transports.remove(fetchTransport); - - expect(await mockObserveAndGetNavigationTimings).toHaveBeenCalledTimes(1); - - expect(mockTransport.items.length).toBe(1); - - const item = mockTransport.items[0] as TransportItem; - expect(item.payload.attributes?.['name']).toBe('http://example.com'); - }); -}); diff --git a/packages/react-native-sdk/src/instrumentations/performance/instrumentation.ts b/packages/react-native-sdk/src/instrumentations/performance/instrumentation.ts deleted file mode 100644 index e5d78dfcf..000000000 --- a/packages/react-native-sdk/src/instrumentations/performance/instrumentation.ts +++ /dev/null @@ -1,33 +0,0 @@ -import { BaseInstrumentation, VERSION } from '@grafana/faro-core'; -import type { Patterns } from '@grafana/faro-core'; - -import { getNavigationTimings } from './navigation'; -import { onDocumentReady, performanceObserverSupported } from './performanceUtils'; -import { observeResourceTimings } from './resource'; - -export class PerformanceInstrumentation extends BaseInstrumentation { - readonly name = '@grafana/faro-web-sdk:instrumentation-performance'; - readonly version = VERSION; - - initialize() { - if (!performanceObserverSupported()) { - this.logDebug('performance observer not supported. Disable performance instrumentation.'); - return; - } - - onDocumentReady(async () => { - const pushEvent = this.api.pushEvent; - const ignoredUrls = this.getIgnoreUrls(); - - const { faroNavigationId } = await getNavigationTimings(pushEvent, ignoredUrls); - - if (faroNavigationId != null) { - observeResourceTimings(faroNavigationId, pushEvent, ignoredUrls); - } - }); - } - - private getIgnoreUrls(): Patterns { - return this.transports.transports?.flatMap((transport) => transport.getIgnoreUrls()); - } -} diff --git a/packages/react-native-sdk/src/instrumentations/performance/navigation.test.ts b/packages/react-native-sdk/src/instrumentations/performance/navigation.test.ts deleted file mode 100644 index fbde6d74e..000000000 --- a/packages/react-native-sdk/src/instrumentations/performance/navigation.test.ts +++ /dev/null @@ -1,172 +0,0 @@ -import * as faroCoreModule from '@grafana/faro-core'; - -import * as webStorageModule from '../../utils/webStorage'; -import { webStorageType } from '../../utils/webStorage'; -import { NAVIGATION_ID_STORAGE_KEY } from '../instrumentationConstants'; - -import { getNavigationTimings } from './navigation'; -import * as performanceUtilsModule from './performanceUtils'; -import { createFaroNavigationTiming, createFaroResourceTiming } from './performanceUtils'; -import { performanceNavigationEntry, performanceResourceEntry } from './performanceUtilsTestData'; - -describe('Navigation observer', () => { - const originalTimeOrigin = performance.timeOrigin; - const mockTimeOriginValue = 1722437937; - Object.defineProperty(performance, 'timeOrigin', { - value: mockTimeOriginValue, - configurable: true, - }); - - class MockPerformanceObserver { - constructor(private cb: PerformanceObserverCallback) {} - - disconnect = jest.fn(); - - observe() { - this.cb( - { - getEntries() { - return [ - { - name: performanceNavigationEntry.name, - toJSON: () => ({ - ...performanceNavigationEntry, - }), - }, - { - name: performanceResourceEntry.name, - toJSON: () => ({ - ...performanceResourceEntry, - }), - }, - ]; - }, - } as any, - {} as PerformanceObserver - ); - } - } - - const originalPerformanceObserver = (global as any).PerformanceObserver; - - (global as any).PerformanceObserver = MockPerformanceObserver; - - beforeEach(() => { - jest.clearAllMocks(); - }); - - afterAll(() => { - jest.restoreAllMocks(); - - (global as any).PerformanceObserver = originalPerformanceObserver; - - Object.defineProperty(performance, 'timeOrigin', { - value: originalTimeOrigin, - configurable: true, - }); - }); - - it('Ignores entries where name matches ignoredUrls entry', () => { - const mockPushEvent = jest.fn(); - - const mockEntryUrlIsIgnored = jest.fn(() => true); - jest.spyOn(performanceUtilsModule, 'entryUrlIsIgnored').mockImplementationOnce(mockEntryUrlIsIgnored); - - const ignoredUrls = ['http://example.com']; - getNavigationTimings(mockPushEvent, ignoredUrls); - - expect(mockEntryUrlIsIgnored).toBeCalledTimes(1); - expect(mockEntryUrlIsIgnored).toBeCalledWith(ignoredUrls, performanceNavigationEntry.name); - - expect(mockPushEvent).not.toHaveBeenCalled(); - }); - - it('Builds entry for first navigation', () => { - const mockPushEvent = jest.fn(); - jest.spyOn(performanceUtilsModule, 'entryUrlIsIgnored').mockReturnValueOnce(false); - - const mockNavigationId = '123'; - jest.spyOn(faroCoreModule, 'genShortID').mockReturnValueOnce(mockNavigationId); - - getNavigationTimings(mockPushEvent, ['']); - - expect(mockPushEvent).toHaveBeenCalledTimes(1); - expect(mockPushEvent).toHaveBeenCalledWith( - 'faro.performance.navigation', - { - ...createFaroResourceTiming(performanceNavigationEntry), - ...createFaroNavigationTiming(performanceNavigationEntry), - faroNavigationId: mockNavigationId, - faroPreviousNavigationId: faroCoreModule.unknownString, - }, - undefined, - { - spanContext: { traceId: '0af7651916cd43dd8448eb211c80319c', spanId: 'b7ad6b7169203331' }, - timestampOverwriteMs: mockTimeOriginValue, - } - ); - }); - - it('Captures Server-Timings for w3c trace context', () => { - const mockPushEvent = jest.fn(); - jest.spyOn(performanceUtilsModule, 'entryUrlIsIgnored').mockReturnValueOnce(false); - - const mockNavigationId = '123'; - jest.spyOn(faroCoreModule, 'genShortID').mockReturnValueOnce(mockNavigationId); - - getNavigationTimings(mockPushEvent, ['']); - - expect(mockPushEvent).toHaveBeenCalledTimes(1); - expect(mockPushEvent).toHaveBeenNthCalledWith(1, expect.anything(), expect.anything(), undefined, { - spanContext: { traceId: '0af7651916cd43dd8448eb211c80319c', spanId: 'b7ad6b7169203331' }, - timestampOverwriteMs: mockTimeOriginValue, - }); - }); - - it('Builds entry for subsequent navigation', () => { - const mockPushEvent = jest.fn(); - jest.spyOn(performanceUtilsModule, 'entryUrlIsIgnored').mockReturnValueOnce(false); - - const mockNewNavigationId = '456'; - jest.spyOn(faroCoreModule, 'genShortID').mockReturnValueOnce(mockNewNavigationId); - - const mockPreviousNavigationId = '123'; - jest.spyOn(webStorageModule, 'getItem').mockReturnValueOnce(mockPreviousNavigationId); - - getNavigationTimings(mockPushEvent, ['']); - - expect(mockPushEvent).toHaveBeenCalledTimes(1); - expect(mockPushEvent).toHaveBeenCalledWith( - 'faro.performance.navigation', - { - ...createFaroResourceTiming(performanceNavigationEntry), - ...createFaroNavigationTiming(performanceNavigationEntry), - faroNavigationId: mockNewNavigationId, - faroPreviousNavigationId: mockPreviousNavigationId, - }, - undefined, - { - spanContext: { traceId: '0af7651916cd43dd8448eb211c80319c', spanId: 'b7ad6b7169203331' }, - timestampOverwriteMs: mockTimeOriginValue, - } - ); - }); - - it('Stores navigationId in sessionStorage', () => { - const mockPushEvent = jest.fn(); - jest.spyOn(performanceUtilsModule, 'entryUrlIsIgnored').mockReturnValueOnce(false); - - const mockNewNavigationId = '456'; - jest.spyOn(faroCoreModule, 'genShortID').mockReturnValueOnce(mockNewNavigationId); - - jest.spyOn(webStorageModule, 'getItem').mockReturnValueOnce(null); - - const mockSetItem = jest.fn(); - jest.spyOn(webStorageModule, 'setItem').mockImplementationOnce(mockSetItem); - - getNavigationTimings(mockPushEvent, ['']); - - expect(mockSetItem).toHaveBeenCalledTimes(1); - expect(mockSetItem).toHaveBeenCalledWith(NAVIGATION_ID_STORAGE_KEY, mockNewNavigationId, webStorageType.session); - }); -}); diff --git a/packages/react-native-sdk/src/instrumentations/performance/navigation.ts b/packages/react-native-sdk/src/instrumentations/performance/navigation.ts deleted file mode 100644 index fde969af5..000000000 --- a/packages/react-native-sdk/src/instrumentations/performance/navigation.ts +++ /dev/null @@ -1,57 +0,0 @@ -import { genShortID, unknownString } from '@grafana/faro-core'; -import type { EventsAPI, PushEventOptions } from '@grafana/faro-core'; - -import { getItem, setItem, webStorageType } from '../../utils'; -import { NAVIGATION_ID_STORAGE_KEY } from '../instrumentationConstants'; - -import { NAVIGATION_ENTRY } from './performanceConstants'; -import { createFaroNavigationTiming, entryUrlIsIgnored, getSpanContextFromServerTiming } from './performanceUtils'; -import type { FaroNavigationItem } from './types'; - -type SpanContext = PushEventOptions['spanContext']; - -export function getNavigationTimings( - pushEvent: EventsAPI['pushEvent'], - ignoredUrls: Array -): Promise { - let faroNavigationEntryResolve: (value: FaroNavigationItem) => void; - const faroNavigationEntryPromise = new Promise((resolve) => { - faroNavigationEntryResolve = resolve; - }); - - const observer = new PerformanceObserver((observedEntries) => { - const [navigationEntryRaw] = observedEntries.getEntries(); - - if (navigationEntryRaw == null || entryUrlIsIgnored(ignoredUrls, navigationEntryRaw.name)) { - return; - } - - const navEntryJson = navigationEntryRaw.toJSON(); - - let spanContext: SpanContext = getSpanContextFromServerTiming(navEntryJson?.serverTiming); - - const faroPreviousNavigationId = getItem(NAVIGATION_ID_STORAGE_KEY, webStorageType.session) ?? unknownString; - - const faroNavigationEntry: FaroNavigationItem = { - ...createFaroNavigationTiming(navEntryJson), - faroNavigationId: genShortID(), - faroPreviousNavigationId, - }; - - setItem(NAVIGATION_ID_STORAGE_KEY, faroNavigationEntry.faroNavigationId, webStorageType.session); - - pushEvent('faro.performance.navigation', faroNavigationEntry, undefined, { - spanContext, - timestampOverwriteMs: performance.timeOrigin + navEntryJson.startTime, - }); - - faroNavigationEntryResolve(faroNavigationEntry); - }); - - observer.observe({ - type: NAVIGATION_ENTRY, - buffered: true, - }); - - return faroNavigationEntryPromise; -} diff --git a/packages/react-native-sdk/src/instrumentations/performance/performanceConstants.ts b/packages/react-native-sdk/src/instrumentations/performance/performanceConstants.ts deleted file mode 100644 index 051df201c..000000000 --- a/packages/react-native-sdk/src/instrumentations/performance/performanceConstants.ts +++ /dev/null @@ -1,2 +0,0 @@ -export const NAVIGATION_ENTRY = 'navigation'; -export const RESOURCE_ENTRY = 'resource'; diff --git a/packages/react-native-sdk/src/instrumentations/performance/performanceUtils.test.ts b/packages/react-native-sdk/src/instrumentations/performance/performanceUtils.test.ts deleted file mode 100644 index c593cdde5..000000000 --- a/packages/react-native-sdk/src/instrumentations/performance/performanceUtils.test.ts +++ /dev/null @@ -1,204 +0,0 @@ -import { - createFaroNavigationTiming, - createFaroResourceTiming, - getSpanContextFromServerTiming, - includePerformanceEntry, -} from './performanceUtils'; -import { performanceNavigationEntry, performanceResourceEntry } from './performanceUtilsTestData'; -import type { FaroNavigationTiming, FaroResourceTiming } from './types'; - -Object.defineProperty(window, 'performance', { - configurable: true, - value: { - timeOrigin: 0, - timing: { - domLoading: 542, - }, - }, - writable: true, -}); - -describe('performanceUtils', () => { - it(`calculates navigation timing`, () => { - const faroNavigationTiming = createFaroNavigationTiming(performanceNavigationEntry); - expect(faroNavigationTiming).toStrictEqual({ - visibilityState: 'visible', - duration: '2700', - pageLoadTime: '2441', - documentParsingTime: '705', - domProcessingTime: '1431', - onLoadTime: '22', - domContentLoadHandlerTime: '3', - ttfb: '542', - type: 'navigate', - - name: 'http://example.com', - tcpHandshakeTime: '53', - dnsLookupTime: '139', - tlsNegotiationTime: '33', - redirectTime: '1', - requestTime: '109', - responseTime: '0', - responseStatus: '200', - fetchTime: '305', - serviceWorkerTime: '237', - decodedBodySize: '530675', - encodedBodySize: '126111', - cacheHitStatus: 'fullLoad', - renderBlockingStatus: 'unknown', - protocol: 'h2', - initiatorType: 'navigation', - } as FaroNavigationTiming); - }); - - it(`calculates resource timings`, () => { - const faroResourceTiming = createFaroResourceTiming(performanceResourceEntry); - expect(faroResourceTiming).toStrictEqual({ - name: 'http://example.com/awesome-image', - duration: '370', - tcpHandshakeTime: '0', - dnsLookupTime: '0', - tlsNegotiationTime: '11', - redirectTime: '0', - requestTime: '359', - responseTime: '0', - responseStatus: '200', - fetchTime: '370', - serviceWorkerTime: '778', - decodedBodySize: '10526', - encodedBodySize: '10526', - cacheHitStatus: 'fullLoad', - renderBlockingStatus: 'unknown', - protocol: 'h2', - initiatorType: 'img', - ttfb: '359', - visibilityState: 'visible', - } as FaroResourceTiming); - }); - - it(`calculates cacheHitStatus`, () => { - expect(createFaroResourceTiming({ transferSize: 0 } as any).cacheHitStatus).toBe('fullLoad'); - expect(createFaroResourceTiming({ transferSize: 1 } as any).cacheHitStatus).toBe('fullLoad'); - - expect(createFaroResourceTiming({ transferSize: 0, decodedBodySize: 1 } as any).cacheHitStatus).toBe('cache'); - - expect(createFaroResourceTiming({ transferSize: 1, encodedBodySize: 0 } as any).cacheHitStatus).toBe('fullLoad'); - expect(createFaroResourceTiming({ transferSize: 1, encodedBodySize: 1 } as any).cacheHitStatus).toBe('fullLoad'); - expect(createFaroResourceTiming({ transferSize: 1, encodedBodySize: 2 } as any).cacheHitStatus).toBe( - 'conditionalFetch' - ); - - // For browsers supporting the responseStatus property - expect( - createFaroResourceTiming({ transferSize: 1, encodedBodySize: 1, responseStatus: 200 } as any).cacheHitStatus - ).toBe('fullLoad'); - expect( - createFaroResourceTiming({ transferSize: 1, encodedBodySize: 1, responseStatus: 304 } as any).cacheHitStatus - ).toBe('conditionalFetch'); - }); - - it(`Sets renderBlockingStatus`, () => { - // For browsers supporting the responseStatus property - expect(createFaroResourceTiming({ renderBlockingStatus: 'blocking' } as any).renderBlockingStatus).toBe('blocking'); - - // For browsers which do not support the responseStatus property - expect(createFaroResourceTiming({} as any).renderBlockingStatus).toBe('unknown'); - }); - - it(`Sets documentParsingTime to "unknown" in case it is not supported by a certain browser`, () => { - Object.defineProperty(window, 'performance', { - configurable: true, - value: { - timeOrigin: 0, - }, - writable: true, - }); - - const faroNavigationTiming = createFaroNavigationTiming(performanceNavigationEntry); - expect(faroNavigationTiming.documentParsingTime).toBe('unknown'); - }); - - it('Returns true for configured entries ', () => { - const initiatorTypes = ['css', 'fetch', 'xmlhttprequest', 'link', 'script']; - - const entries = initiatorTypes.map((initiatorType) => ({ ...performanceResourceEntry, initiatorType })); - - const matchByValue = includePerformanceEntry(entries[0]!, { initiatorType: 'css' }); - expect(matchByValue).toBe(true); - - const matchByMultiValues1 = includePerformanceEntry(entries[1]!, { - initiatorType: ['fetch', 'xmlhttprequest', 'link'], - }); - expect(matchByMultiValues1).toBe(true); - - const matchByMultiValues2 = includePerformanceEntry(entries[2]!, { - initiatorType: ['fetch', 'xmlhttprequest', 1], - }); - expect(matchByMultiValues2).toBe(true); - }); - - it('Returns true if entries are undefined or empty object', () => { - const initiatorTypes = ['css', 'fetch', 'xmlhttprequest', 'link', 'script']; - - const entries = initiatorTypes.map((initiatorType) => ({ ...performanceResourceEntry, initiatorType })); - - const matchedEntriesUndefined = entries.map((entry) => includePerformanceEntry(entry, undefined)); - expect(matchedEntriesUndefined.every((e) => Boolean(e))).toBe(true); - - const matchedEntriesEmptyObject = entries.map((entry) => includePerformanceEntry(entry, {})); - expect(matchedEntriesEmptyObject.every((e) => Boolean(e))).toBe(true); - }); - - it('Returns false if key or value does not match', () => { - const initiatorTypes = ['css', 'fetch', 'xmlhttprequest', 'link', 'script']; - - const entries = initiatorTypes.map((initiatorType) => ({ ...performanceResourceEntry, initiatorType })); - - const noMatchByValue = includePerformanceEntry(entries[0]!, { initiatorType: 'NO_MATCHING_VALUE' }); - expect(noMatchByValue).toBe(false); - - const noMatchingProperty = includePerformanceEntry(entries[1]!, { initiatorTypeABC: 'abc' }); - expect(noMatchingProperty).toBe(false); - - const matchByMultiValues1 = includePerformanceEntry(entries[1]!, { - initiatorType: ['NOfetch', 'NOxmlhttprequest', 'link'], - }); - expect(matchByMultiValues1).toBe(false); - }); - - it('Can extract a span context if server returns a traceId and spanId', () => { - const serverTimings: PerformanceServerTiming[] = [ - { - name: 'traceparent', - description: '00-0af7651916cd43dd8448eb211c80319c-b7ad6b7169203331-01', - duration: 0, - toJSON(): any {}, - }, - ]; - - const spanContext = getSpanContextFromServerTiming(serverTimings); - expect(spanContext).toStrictEqual({ traceId: '0af7651916cd43dd8448eb211c80319c', spanId: 'b7ad6b7169203331' }); - }); - - it('Ignores incoming traceparent server-timings if they are not conformant to w3c trace-context', () => { - const serverTimings: PerformanceServerTiming[] = [ - { - name: 'traceparent', - description: '00-1234-5678-01-02', - duration: 0, - toJSON(): any {}, - }, - ]; - - const spanContext = getSpanContextFromServerTiming(serverTimings); - expect(spanContext).toBeUndefined(); - - const emptyServerTimings: PerformanceServerTiming[] = []; - const spanContextEmpty = getSpanContextFromServerTiming(emptyServerTimings); - expect(spanContextEmpty).toBeUndefined(); - - const undefinedServerTimings = undefined; - const spanContextUndefined = getSpanContextFromServerTiming(undefinedServerTimings); - expect(spanContextUndefined).toBeUndefined(); - }); -}); diff --git a/packages/react-native-sdk/src/instrumentations/performance/performanceUtils.ts b/packages/react-native-sdk/src/instrumentations/performance/performanceUtils.ts deleted file mode 100644 index 447778ed9..000000000 --- a/packages/react-native-sdk/src/instrumentations/performance/performanceUtils.ts +++ /dev/null @@ -1,200 +0,0 @@ -import { isArray, type PushEventOptions, unknownString } from '@grafana/faro-core'; - -import type { CacheType, FaroNavigationTiming, FaroResourceTiming } from './types'; - -const w3cTraceparentFormat = /^00-[a-f0-9]{32}-[a-f0-9]{16}-[0-9]{1,2}$/; - -type SpanContext = PushEventOptions['spanContext']; - -// Extract traceparent from serverTiming, if present -export function getSpanContextFromServerTiming(serverTimings: PerformanceServerTiming[] = []): SpanContext | undefined { - for (const serverEntry of serverTimings) { - if (serverEntry.name === 'traceparent') { - if (!w3cTraceparentFormat.test(serverEntry.description)) { - continue; - } - - const [, traceId, spanId] = serverEntry.description.split('-'); - if (traceId != null && spanId != null) { - return { traceId, spanId }; - } - - break; - } - } - - return undefined; -} - -export function performanceObserverSupported(): boolean { - return 'PerformanceObserver' in window; -} - -export function entryUrlIsIgnored(ignoredUrls: Array = [], entryName: string): boolean { - return ignoredUrls.some((url) => url && entryName.match(url) != null); -} - -export function onDocumentReady(handleReady: () => void) { - if (document.readyState === 'complete') { - handleReady(); - } else { - const readyStateCompleteHandler = () => { - if (document.readyState === 'complete') { - handleReady(); - document.removeEventListener('readystatechange', readyStateCompleteHandler); - } - }; - - document.addEventListener('readystatechange', readyStateCompleteHandler); - } -} - -type PerformanceEntryAllowProperties = Record | string | number>; - -export function includePerformanceEntry( - performanceEntryJSON: Record, - allowProps: PerformanceEntryAllowProperties = {} -): boolean { - for (const [allowPropKey, allowPropValue] of Object.entries(allowProps)) { - const perfEntryPropVal = performanceEntryJSON[allowPropKey]; - - if (perfEntryPropVal == null) { - return false; - } - - if (isArray(allowPropValue)) { - return allowPropValue.includes(perfEntryPropVal); - } - - return perfEntryPropVal === allowPropValue; - } - - // empty object allows all - return true; -} - -export function createFaroResourceTiming(resourceEntryRaw: PerformanceResourceTiming): FaroResourceTiming { - const { - connectEnd, - connectStart, - decodedBodySize, - domainLookupEnd, - domainLookupStart, - duration, - encodedBodySize, - fetchStart, - initiatorType, - name, - nextHopProtocol, - redirectEnd, - redirectStart, - // @ts-expect-error the renderBlockingStatus property is not available in all browsers - renderBlockingStatus: rbs, - requestStart, - responseEnd, - responseStart, - // @ts-expect-error the renderBlockingStatus property is not available in all browsers - responseStatus, - secureConnectionStart, - transferSize, - workerStart, - } = resourceEntryRaw; - - return { - name: name, - duration: toFaroPerformanceTimingString(duration), - tcpHandshakeTime: toFaroPerformanceTimingString(connectEnd - connectStart), - dnsLookupTime: toFaroPerformanceTimingString(domainLookupEnd - domainLookupStart), - tlsNegotiationTime: toFaroPerformanceTimingString(requestStart - secureConnectionStart), - responseStatus: toFaroPerformanceTimingString(responseStatus), - redirectTime: toFaroPerformanceTimingString(redirectEnd - redirectStart), - requestTime: toFaroPerformanceTimingString(responseStart - requestStart), - responseTime: toFaroPerformanceTimingString(responseEnd - responseStart), - fetchTime: toFaroPerformanceTimingString(responseEnd - fetchStart), - serviceWorkerTime: toFaroPerformanceTimingString(fetchStart - workerStart), - decodedBodySize: toFaroPerformanceTimingString(decodedBodySize), - encodedBodySize: toFaroPerformanceTimingString(encodedBodySize), - cacheHitStatus: getCacheType(), - renderBlockingStatus: toFaroPerformanceTimingString(rbs) as FaroResourceTiming['renderBlockingStatus'], - protocol: nextHopProtocol, - initiatorType: initiatorType, - visibilityState: document.visibilityState, - ttfb: toFaroPerformanceTimingString(responseStart - requestStart), - - // TODO: add in future iteration, ideally after nested objects are supported by the collector. - // serverTiming: resourceEntryRaw.serverTiming, - }; - - function getCacheType(): CacheType { - let cacheType: CacheType = 'fullLoad'; - if (transferSize === 0) { - if (decodedBodySize > 0) { - cacheType = 'cache'; - } - } else { - if (responseStatus != null) { - if (responseStatus === 304) { - cacheType = 'conditionalFetch'; - } - } else if (encodedBodySize > 0 && transferSize < encodedBodySize) { - cacheType = 'conditionalFetch'; - } - } - return cacheType; - } -} - -export function createFaroNavigationTiming(navigationEntryRaw: PerformanceNavigationTiming): FaroNavigationTiming { - const { - activationStart, - domComplete, - domContentLoadedEventEnd, - domContentLoadedEventStart, - domInteractive, - fetchStart, - loadEventEnd, - loadEventStart, - responseStart, - type, - } = navigationEntryRaw; - - const parserStart = getDocumentParsingTime(); - - return { - ...createFaroResourceTiming(navigationEntryRaw), - pageLoadTime: toFaroPerformanceTimingString(domComplete - fetchStart), - documentParsingTime: toFaroPerformanceTimingString(parserStart ? domInteractive - parserStart : null), - domProcessingTime: toFaroPerformanceTimingString(domComplete - domInteractive), - domContentLoadHandlerTime: toFaroPerformanceTimingString(domContentLoadedEventEnd - domContentLoadedEventStart), - onLoadTime: toFaroPerformanceTimingString(loadEventEnd - loadEventStart), - - // For navigation entries we can calculate the TTFB based on activationStart. We overwrite the TTFB value coming with the resource entry. - // For more accuracy on prerendered pages page we calculate relative top the activationStart instead of the start of the navigation. - // clamp to 0 if activationStart occurs after first byte is received. - ttfb: toFaroPerformanceTimingString(Math.max(responseStart - (activationStart ?? 0), 0)), - type: type, - }; -} - -function getDocumentParsingTime(): number | null { - if (performance.timing?.domLoading != null) { - // the browser is about to start parsing the first received bytes of the HTML document. - // This property is deprecated but there isn't a really good alternative atm. - // For now we stick with domLoading and keep researching a better alternative. - return performance.timing.domLoading - performance.timeOrigin; - } - - return null; -} - -function toFaroPerformanceTimingString(v: unknown): string { - if (v == null) { - return unknownString; - } - - if (typeof v === 'number') { - return Math.round(v).toString(); - } - - return v.toString(); -} diff --git a/packages/react-native-sdk/src/instrumentations/performance/performanceUtilsTestData.ts b/packages/react-native-sdk/src/instrumentations/performance/performanceUtilsTestData.ts deleted file mode 100644 index 74219ac90..000000000 --- a/packages/react-native-sdk/src/instrumentations/performance/performanceUtilsTestData.ts +++ /dev/null @@ -1,87 +0,0 @@ -// the values of this timings are contrived for testing.They do not necessarily reflect reality. -export const performanceNavigationEntry = { - name: 'http://example.com', - entryType: 'navigation', - startTime: 0, - duration: 2700, - initiatorType: 'navigation', - nextHopProtocol: 'h2', - workerStart: 0, - redirectStart: 1, - redirectEnd: 2, - fetchStart: 237, - domainLookupStart: 241, - domainLookupEnd: 380, - connectStart: 380, - connectEnd: 433, - secureConnectionStart: 400, - requestStart: 433, - responseStart: 542, - responseStatus: 200, - responseEnd: 542, - transferSize: 127601, - encodedBodySize: 126111, - decodedBodySize: 530675, - serverTiming: [ - { - name: 'traceparent', - duration: 0, - description: '00-0af7651916cd43dd8448eb211c80319c-b7ad6b7169203331-01', - }, - ], - unloadEventStart: 0, - unloadEventEnd: 0, - domInteractive: 1247, - domContentLoadedEventStart: 1247, - domContentLoadedEventEnd: 1250, - domComplete: 2678, - loadEventStart: 2678, - loadEventEnd: 2700, - type: 'navigate', - redirectCount: 0, -} as unknown as PerformanceNavigationTiming; - -export const performanceResourceEntry = { - name: 'http://example.com/awesome-image', - entryType: 'resource', - startTime: 778, - duration: 370, - initiatorType: 'img', - nextHopProtocol: 'h2', - workerStart: 0, - redirectStart: 0, - redirectEnd: 0, - fetchStart: 778, - domainLookupStart: 778, - domainLookupEnd: 778, - connectStart: 778, - connectEnd: 778, - secureConnectionStart: 778, - requestStart: 789, - responseStart: 1148, - responseStatus: '200', - responseEnd: 1148, - transferSize: 11459, - encodedBodySize: 10526, - decodedBodySize: 10526, - serverTiming: [ - { - name: 'traceparent', - duration: 0, - description: '00-0af7651916cd43dd8448eb211c80319c-b7ad6b7169203331-01', - }, - { - name: 'foo', - duration: 0, - description: 'bar', - }, - ], -} as unknown as PerformanceResourceTiming; - -export const analyticsEntry1 = { - name: 'http://example.com/foo-analytics', -} as unknown as PerformanceResourceTiming; - -export const analyticsEntry2 = { - name: 'http://analytics.com/beacon', -} as unknown as PerformanceResourceTiming; diff --git a/packages/react-native-sdk/src/instrumentations/performance/resource.test.ts b/packages/react-native-sdk/src/instrumentations/performance/resource.test.ts deleted file mode 100644 index 83e191531..000000000 --- a/packages/react-native-sdk/src/instrumentations/performance/resource.test.ts +++ /dev/null @@ -1,162 +0,0 @@ -import * as faroCoreModule from '@grafana/faro-core'; -import { initializeFaro } from '@grafana/faro-core'; -import { mockConfig } from '@grafana/faro-core/src/testUtils'; - -import * as performanceUtilsModule from './performanceUtils'; -import { createFaroResourceTiming } from './performanceUtils'; -import { performanceResourceEntry } from './performanceUtilsTestData'; -import { observeResourceTimings } from './resource'; - -describe('Resource observer', () => { - const originalTimeOrigin = performance.timeOrigin; - const mockTimeOriginValue = 1000; - Object.defineProperty(performance, 'timeOrigin', { - value: mockTimeOriginValue, - configurable: true, - }); - - class MockPerformanceObserver { - constructor(private cb: PerformanceObserverCallback) {} - - disconnect = jest.fn(); - - observe() { - this.cb( - { - getEntries() { - return [ - { - name: performanceResourceEntry.name, - toJSON: () => ({ - ...performanceResourceEntry, - }), - }, - { - name: 'resource_fetch', - toJSON: () => ({ - ...performanceResourceEntry, - initiatorType: 'fetch', - name: 'resource_fetch', - }), - }, - { - name: 'resource_xmlhttprequest', - toJSON: () => ({ - ...performanceResourceEntry, - initiatorType: 'xmlhttprequest', - name: 'resource_xmlhttprequest', - }), - }, - ]; - }, - } as any, - {} as PerformanceObserver - ); - } - } - - const originalPerformanceObserver = (global as any).PerformanceObserver; - - (global as any).PerformanceObserver = MockPerformanceObserver; - - beforeEach(() => { - jest.clearAllMocks(); - }); - - afterAll(() => { - jest.restoreAllMocks(); - - (global as any).PerformanceObserver = originalPerformanceObserver; - - Object.defineProperty(performance, 'timeOrigin', { - value: originalTimeOrigin, - configurable: true, - }); - }); - - it('Ignores entries where name matches ignoredUrls entry', () => { - const mockPushEvent = jest.fn(); - - const mockEntryUrlIsIgnored = jest.fn(() => true); - jest.spyOn(performanceUtilsModule, 'entryUrlIsIgnored').mockImplementationOnce(mockEntryUrlIsIgnored); - - initializeFaro(mockConfig({ trackResources: true })); - - const ignoredUrls = ['http://example.com']; - observeResourceTimings('123', mockPushEvent, ignoredUrls); - - expect(mockEntryUrlIsIgnored).toBeCalledTimes(1); - expect(mockEntryUrlIsIgnored).toBeCalledWith(ignoredUrls, performanceResourceEntry.name); - - expect(mockPushEvent).not.toHaveBeenCalled(); - }); - - it('Builds entry for first resource', () => { - const mockPushEvent = jest.fn(); - jest.spyOn(performanceUtilsModule, 'entryUrlIsIgnored').mockReturnValueOnce(false); - - const mockResourceId = 'abc'; - jest.spyOn(faroCoreModule, 'genShortID').mockReturnValueOnce(mockResourceId); - - initializeFaro(mockConfig({ trackResources: true })); - - const mockNavigationId = '123'; - observeResourceTimings(mockNavigationId, mockPushEvent, ['']); - - expect(mockPushEvent).toHaveBeenCalledTimes(3); - - expect(mockPushEvent).toHaveBeenNthCalledWith( - 1, - 'faro.performance.resource', - { - ...createFaroResourceTiming(performanceResourceEntry), - faroNavigationId: mockNavigationId, - faroResourceId: mockResourceId, - }, - undefined, - { - spanContext: { traceId: '0af7651916cd43dd8448eb211c80319c', spanId: 'b7ad6b7169203331' }, - timestampOverwriteMs: mockTimeOriginValue + performanceResourceEntry.startTime, - } - ); - }); - - it('Tracks default resource entries if trackResource is unset', () => { - const mockPushEvent = jest.fn(); - jest.spyOn(performanceUtilsModule, 'entryUrlIsIgnored').mockReturnValueOnce(false); - - const trackResourcesNotSetConfig = mockConfig({}); - initializeFaro(trackResourcesNotSetConfig); - - const mockNavigationId = '123'; - observeResourceTimings(mockNavigationId, mockPushEvent, ['']); - - expect(mockPushEvent).toHaveBeenCalledTimes(2); - }); - - it('Tracks all resource entries if trackResource is set to true', () => { - const mockPushEvent = jest.fn(); - jest.spyOn(performanceUtilsModule, 'entryUrlIsIgnored').mockReturnValueOnce(false); - - const trackAllResourcesConfig = mockConfig({ trackResources: true }); - initializeFaro(trackAllResourcesConfig); - - const mockNavigationId = '123'; - observeResourceTimings(mockNavigationId, mockPushEvent, ['']); - - expect(mockPushEvent).toHaveBeenCalledTimes(3); - }); - - it('Does not track any resource entries if trackResource is set to false', () => { - const mockPushEvent = jest.fn(); - jest.spyOn(performanceUtilsModule, 'entryUrlIsIgnored').mockReturnValueOnce(false); - - const trackAllResourcesConfig = mockConfig({ trackResources: false }); - initializeFaro(trackAllResourcesConfig); - - const mockNavigationId = '123'; - observeResourceTimings(mockNavigationId, mockPushEvent, ['']); - - expect(mockPushEvent).toHaveBeenCalledTimes(0); - }); -}); diff --git a/packages/react-native-sdk/src/instrumentations/performance/resource.ts b/packages/react-native-sdk/src/instrumentations/performance/resource.ts deleted file mode 100644 index 6a9b88aaf..000000000 --- a/packages/react-native-sdk/src/instrumentations/performance/resource.ts +++ /dev/null @@ -1,57 +0,0 @@ -import { faro, genShortID } from '@grafana/faro-core'; -import type { EventsAPI, PushEventOptions } from '@grafana/faro-core'; - -import { RESOURCE_ENTRY } from './performanceConstants'; -import { - createFaroResourceTiming, - entryUrlIsIgnored, - getSpanContextFromServerTiming, - includePerformanceEntry, -} from './performanceUtils'; - -type SpanContext = PushEventOptions['spanContext']; - -const DEFAULT_TRACK_RESOURCES = { initiatorType: ['xmlhttprequest', 'fetch'] }; - -export function observeResourceTimings( - faroNavigationId: string, - pushEvent: EventsAPI['pushEvent'], - ignoredUrls: Array -) { - const trackResources = faro.config.trackResources; - - const observer = new PerformanceObserver((observedEntries) => { - const entries = observedEntries.getEntries(); - - for (const resourceEntryRaw of entries) { - if (entryUrlIsIgnored(ignoredUrls, resourceEntryRaw.name)) { - return; - } - - const resourceEntryJson = resourceEntryRaw.toJSON(); - - let spanContext: SpanContext = getSpanContextFromServerTiming(resourceEntryJson?.serverTiming); - - if ( - (trackResources == null && includePerformanceEntry(resourceEntryJson, DEFAULT_TRACK_RESOURCES)) || - trackResources - ) { - const faroResourceEntry = { - ...createFaroResourceTiming(resourceEntryJson), - faroNavigationId, - faroResourceId: genShortID(), - }; - - pushEvent('faro.performance.resource', faroResourceEntry, undefined, { - spanContext, - timestampOverwriteMs: performance.timeOrigin + resourceEntryJson.startTime, - }); - } - } - }); - - observer.observe({ - type: RESOURCE_ENTRY, - buffered: true, - }); -} diff --git a/packages/react-native-sdk/src/instrumentations/performance/types.ts b/packages/react-native-sdk/src/instrumentations/performance/types.ts deleted file mode 100644 index 9c53e15c9..000000000 --- a/packages/react-native-sdk/src/instrumentations/performance/types.ts +++ /dev/null @@ -1,49 +0,0 @@ -import type { unknownString } from '@grafana/faro-core'; - -export type FaroNavigationTiming = Readonly< - { - duration: string; - documentParsingTime: string; - domProcessingTime: string; - pageLoadTime: string; - domContentLoadHandlerTime: string; - onLoadTime: string; - type: NavigationTimingType; - } & FaroResourceTiming ->; - -export type FaroResourceTiming = Readonly<{ - name: string; - duration: string; - protocol: string; - tcpHandshakeTime: string; - dnsLookupTime: string; - tlsNegotiationTime: string; - responseStatus: string; - redirectTime: string; - requestTime: string; - fetchTime: string; - responseTime: string; - serviceWorkerTime: string; - decodedBodySize: string; - encodedBodySize: string; - cacheHitStatus: 'cache' | 'conditionalFetch' | 'fullLoad'; - renderBlockingStatus: 'blocking' | 'non-blocking' | typeof unknownString; - initiatorType: string; - // serverTiming: PerformanceServerTiming[]; - visibilityState: DocumentVisibilityState; - ttfb: string; -}>; - -export type FaroNavigationItem = { - faroNavigationId: string; - faroPreviousNavigationId: string; -} & FaroNavigationTiming & - FaroResourceTiming; - -export type FaroResourceItem = { - faroNavigationId: string; - faroResourceId: string; -} & FaroResourceTiming; - -export type CacheType = 'cache' | 'conditionalFetch' | 'fullLoad'; diff --git a/packages/react-native-sdk/src/instrumentations/session/instrumentation.ts b/packages/react-native-sdk/src/instrumentations/session/instrumentation.ts index 33a27c68c..48b190e74 100644 --- a/packages/react-native-sdk/src/instrumentations/session/instrumentation.ts +++ b/packages/react-native-sdk/src/instrumentations/session/instrumentation.ts @@ -45,14 +45,14 @@ export class SessionInstrumentation extends BaseInstrumentation { } } - private createInitialSession( + private async createInitialSession( SessionManager: SessionManager, sessionsConfig: Required['sessionTracking'] - ): { + ): Promise<{ initialSession: FaroUserSession; lifecycleType: LifecycleType; - } { - let userSession: FaroUserSession | null = SessionManager.fetchUserSession(); + }> { + let userSession: FaroUserSession | null = await SessionManager.fetchUserSession(); if (sessionsConfig.persistent && sessionsConfig.maxSessionPersistenceTime && userSession) { const now = dateNow(); @@ -134,7 +134,7 @@ export class SessionInstrumentation extends BaseInstrumentation { }); } - initialize() { + async initialize() { this.logDebug('init session instrumentation'); const sessionTrackingConfig = this.config.sessionTracking; @@ -144,9 +144,9 @@ export class SessionInstrumentation extends BaseInstrumentation { this.registerBeforeSendHook(SessionManager); - const { initialSession, lifecycleType } = this.createInitialSession(SessionManager, sessionTrackingConfig); + const { initialSession, lifecycleType } = await this.createInitialSession(SessionManager, sessionTrackingConfig); - SessionManager.storeUserSession(initialSession); + await SessionManager.storeUserSession(initialSession); const initialSessionMeta = initialSession.sessionMeta; diff --git a/packages/react-native-sdk/src/instrumentations/session/sessionManager/PersistentSessionsManager.ts b/packages/react-native-sdk/src/instrumentations/session/sessionManager/PersistentSessionsManager.ts index 6f0355442..dfae8577f 100644 --- a/packages/react-native-sdk/src/instrumentations/session/sessionManager/PersistentSessionsManager.ts +++ b/packages/react-native-sdk/src/instrumentations/session/sessionManager/PersistentSessionsManager.ts @@ -2,7 +2,7 @@ import { faro } from '@grafana/faro-core'; import type { Meta } from '@grafana/faro-core'; import { stringifyExternalJson, throttle } from '../../../utils'; -import { getItem, removeItem, setItem, webStorageType } from '../../../utils/webStorage'; +import { getItem, removeItem, setItem } from '../../../utils/asyncStorage'; import { isSampled } from './sampling'; import { STORAGE_KEY, STORAGE_UPDATE_DELAY } from './sessionConstants'; @@ -10,7 +10,6 @@ import { addSessionMetadataToNextSession, createUserSessionObject, getUserSessio import type { FaroUserSession } from './types'; export class PersistentSessionsManager { - private static storageTypeLocal = webStorageType.local; private updateUserSession: ReturnType; constructor() { @@ -22,16 +21,16 @@ export class PersistentSessionsManager { this.init(); } - static removeUserSession() { - removeItem(STORAGE_KEY, PersistentSessionsManager.storageTypeLocal); + static async removeUserSession() { + await removeItem(STORAGE_KEY); } - static storeUserSession(session: FaroUserSession): void { - setItem(STORAGE_KEY, stringifyExternalJson(session), PersistentSessionsManager.storageTypeLocal); + static async storeUserSession(session: FaroUserSession): Promise { + await setItem(STORAGE_KEY, stringifyExternalJson(session)); } - static fetchUserSession(): FaroUserSession | null { - const storedSession = getItem(STORAGE_KEY, PersistentSessionsManager.storageTypeLocal); + static async fetchUserSession(): Promise { + const storedSession = await getItem(STORAGE_KEY); if (storedSession) { return JSON.parse(storedSession) as FaroUserSession; @@ -43,16 +42,10 @@ export class PersistentSessionsManager { updateSession = throttle(() => this.updateUserSession(), STORAGE_UPDATE_DELAY); private init(): void { - document.addEventListener('visibilitychange', () => { - if (document.visibilityState === 'visible') { - this.updateSession(); - } - }); - // Users can call the setSession() method, so we need to sync this with the local storage session - faro.metas.addListener(function syncSessionIfChangedExternally(meta: Meta) { + faro.metas.addListener(async function syncSessionIfChangedExternally(meta: Meta) { const session = meta.session; - const sessionFromLocalStorage = PersistentSessionsManager.fetchUserSession(); + const sessionFromLocalStorage = await PersistentSessionsManager.fetchUserSession(); if (session && session.id !== sessionFromLocalStorage?.sessionId) { const userSession = addSessionMetadataToNextSession( @@ -60,7 +53,7 @@ export class PersistentSessionsManager { sessionFromLocalStorage ); - PersistentSessionsManager.storeUserSession(userSession); + await PersistentSessionsManager.storeUserSession(userSession); faro.api.setSession(userSession.sessionMeta); } }); diff --git a/packages/react-native-sdk/src/instrumentations/session/sessionManager/VolatileSessionManager.ts b/packages/react-native-sdk/src/instrumentations/session/sessionManager/VolatileSessionManager.ts index 5707fa332..d60508f2c 100644 --- a/packages/react-native-sdk/src/instrumentations/session/sessionManager/VolatileSessionManager.ts +++ b/packages/react-native-sdk/src/instrumentations/session/sessionManager/VolatileSessionManager.ts @@ -25,11 +25,11 @@ export class VolatileSessionsManager { this.storedSession = null; } - static storeUserSession(session: FaroUserSession): void { + static async storeUserSession(session: FaroUserSession): Promise { this.storedSession = stringifyExternalJson(session) } - static fetchUserSession(): FaroUserSession | null { + static async fetchUserSession(): Promise { if (this.storedSession) { return JSON.parse(this.storedSession) as FaroUserSession; } @@ -41,9 +41,9 @@ export class VolatileSessionsManager { private init(): void { // Users can call the setSession() method, so we need to sync this with the local storage session - faro.metas.addListener(function syncSessionIfChangedExternally(meta: Meta) { + faro.metas.addListener(async function syncSessionIfChangedExternally(meta: Meta) { const session = meta.session; - const sessionFromSessionStorage = VolatileSessionsManager.fetchUserSession(); + const sessionFromSessionStorage = await VolatileSessionsManager.fetchUserSession(); if (session && session.id !== sessionFromSessionStorage?.sessionId) { const userSession = addSessionMetadataToNextSession( @@ -51,7 +51,7 @@ export class VolatileSessionsManager { sessionFromSessionStorage ); - VolatileSessionsManager.storeUserSession(userSession); + await VolatileSessionsManager.storeUserSession(userSession); faro.api.setSession(userSession.sessionMeta); } }); diff --git a/packages/react-native-sdk/src/instrumentations/session/sessionManager/sessionManagerUtils.ts b/packages/react-native-sdk/src/instrumentations/session/sessionManager/sessionManagerUtils.ts index c125045c5..7cd9d96f9 100644 --- a/packages/react-native-sdk/src/instrumentations/session/sessionManager/sessionManagerUtils.ts +++ b/packages/react-native-sdk/src/instrumentations/session/sessionManager/sessionManagerUtils.ts @@ -1,7 +1,5 @@ import { dateNow, faro, genShortID } from '@grafana/faro-core'; -import { isLocalStorageAvailable, isSessionStorageAvailable } from '../../../utils'; - import { isSampled } from './sampling'; import { SESSION_EXPIRATION_TIME, SESSION_INACTIVITY_TIME } from './sessionConstants'; import type { FaroUserSession } from './types'; @@ -52,8 +50,8 @@ export function isUserSessionValid(session: FaroUserSession | null): boolean { } type GetUserSessionUpdaterParams = { - storeUserSession: (session: FaroUserSession) => void; - fetchUserSession: () => FaroUserSession | null; + storeUserSession: (session: FaroUserSession) => Promise; + fetchUserSession: () => Promise; }; type UpdateSessionParams = { forceSessionExtend: boolean }; @@ -62,29 +60,24 @@ export function getUserSessionUpdater({ fetchUserSession, storeUserSession, }: GetUserSessionUpdaterParams): (options?: UpdateSessionParams) => void { - return function updateSession({ forceSessionExtend } = { forceSessionExtend: false }): void { + return async function updateSession({ forceSessionExtend } = { forceSessionExtend: false }): Promise { if (!fetchUserSession || !storeUserSession) { return; } const sessionTrackingConfig = faro.config.sessionTracking; - const isPersistentSessions = sessionTrackingConfig?.persistent; - - if ((isPersistentSessions && !isLocalStorageAvailable) || (!isPersistentSessions && !isSessionStorageAvailable)) { - return; - } - const sessionFromStorage = fetchUserSession(); + const sessionFromStorage = await fetchUserSession(); if (forceSessionExtend === false && isUserSessionValid(sessionFromStorage)) { - storeUserSession({ ...sessionFromStorage!, lastActivity: dateNow() }); + await storeUserSession({ ...sessionFromStorage!, lastActivity: dateNow() }); } else { let newSession = addSessionMetadataToNextSession( createUserSessionObject({ isSampled: isSampled() }), sessionFromStorage ); - storeUserSession(newSession); + await storeUserSession(newSession); faro.api?.setSession(newSession.sessionMeta); sessionTrackingConfig?.onSessionChange?.(sessionFromStorage?.sessionMeta ?? null, newSession.sessionMeta!); diff --git a/packages/react-native-sdk/src/instrumentations/webVitals/index.ts b/packages/react-native-sdk/src/instrumentations/webVitals/index.ts deleted file mode 100644 index 7e752289f..000000000 --- a/packages/react-native-sdk/src/instrumentations/webVitals/index.ts +++ /dev/null @@ -1 +0,0 @@ -export { WebVitalsInstrumentation } from './instrumentation'; diff --git a/packages/react-native-sdk/src/instrumentations/webVitals/instrumentation.test.ts b/packages/react-native-sdk/src/instrumentations/webVitals/instrumentation.test.ts deleted file mode 100644 index c56010313..000000000 --- a/packages/react-native-sdk/src/instrumentations/webVitals/instrumentation.test.ts +++ /dev/null @@ -1,44 +0,0 @@ -import { initializeFaro } from '@grafana/faro-core'; -import { mockConfig, MockTransport } from '@grafana/faro-core/src/testUtils'; - -import { WebVitalsInstrumentation } from './instrumentation'; -import { WebVitalsBasic } from './webVitalsBasic'; -import { WebVitalsWithAttribution } from './webVitalsWithAttribution'; - -jest.mock('./webVitalsWithAttribution'); -jest.mock('./webVitalsBasic'); - -describe('WebVitals Instrumentation', () => { - beforeEach(() => { - jest.clearAllMocks(); - }); - - it('load WebVitalsBasic by default', () => { - const transport = new MockTransport(); - - initializeFaro( - mockConfig({ - transports: [transport], - instrumentations: [new WebVitalsInstrumentation()], - }) - ); - - expect(WebVitalsBasic).toHaveBeenCalledTimes(1); - expect(WebVitalsWithAttribution).toHaveBeenCalledTimes(0); - }); - - it('load WebVitalsWithAttribution when trackWebVitalAttribution is true', () => { - const transport = new MockTransport(); - - initializeFaro( - mockConfig({ - trackWebVitalsAttribution: true, - transports: [transport], - instrumentations: [new WebVitalsInstrumentation()], - }) - ); - - expect(WebVitalsBasic).toHaveBeenCalledTimes(0); - expect(WebVitalsWithAttribution).toHaveBeenCalledTimes(1); - }); -}); diff --git a/packages/react-native-sdk/src/instrumentations/webVitals/instrumentation.ts b/packages/react-native-sdk/src/instrumentations/webVitals/instrumentation.ts deleted file mode 100644 index b4e1fc5a8..000000000 --- a/packages/react-native-sdk/src/instrumentations/webVitals/instrumentation.ts +++ /dev/null @@ -1,22 +0,0 @@ -import { BaseInstrumentation, VERSION } from '@grafana/faro-core'; - -import { WebVitalsBasic } from './webVitalsBasic'; -import { WebVitalsWithAttribution } from './webVitalsWithAttribution'; - -export class WebVitalsInstrumentation extends BaseInstrumentation { - readonly name = '@grafana/faro-web-sdk:instrumentation-web-vitals'; - readonly version = VERSION; - - initialize(): void { - this.logDebug('Initializing'); - const webVitals = this.intializeWebVitalsInstrumentation(); - webVitals.initialize(); - } - - private intializeWebVitalsInstrumentation() { - if (this.config.trackWebVitalsAttribution) { - return new WebVitalsWithAttribution(this.api.pushMeasurement); - } - return new WebVitalsBasic(this.api.pushMeasurement); - } -} diff --git a/packages/react-native-sdk/src/instrumentations/webVitals/webVitalsBasic.test.ts b/packages/react-native-sdk/src/instrumentations/webVitals/webVitalsBasic.test.ts deleted file mode 100644 index 5dba94784..000000000 --- a/packages/react-native-sdk/src/instrumentations/webVitals/webVitalsBasic.test.ts +++ /dev/null @@ -1,42 +0,0 @@ -import type { Metric } from 'web-vitals'; - -import { WebVitalsBasic } from './webVitalsBasic'; - -jest.mock('web-vitals', () => { - type MetricName = Metric['name']; - - function createMetric(name: MetricName): Metric { - return { - name, - value: 0.1, - rating: 'good', - delta: 0.1, - id: 'id', - entries: [], - navigationType: 'navigate', - }; - } - - return { - onCLS: (cb: (metric: Metric) => void) => cb(createMetric('CLS')), - onFCP: (cb: (metric: Metric) => void) => cb(createMetric('FCP')), - onFID: (cb: (metric: Metric) => void) => cb(createMetric('FID')), - onLCP: (cb: (metric: Metric) => void) => cb(createMetric('LCP')), - onTTFB: (cb: (metric: Metric) => void) => cb(createMetric('TTFB')), - onINP: (cb: (metric: Metric) => void) => cb(createMetric('INP')), - }; -}); - -describe('WebVitalsBasicInstrumentation', () => { - it.each(['cls', 'fcp', 'fid', 'inp', 'lcp', 'ttfb'])('send %p metrics correctly', (metric) => { - const pushMeasurement = jest.fn(); - new WebVitalsBasic(pushMeasurement).initialize(); - - expect(pushMeasurement).toHaveBeenCalledWith({ - type: 'web-vitals', - values: { - [metric]: 0.1, - }, - }); - }); -}); diff --git a/packages/react-native-sdk/src/instrumentations/webVitals/webVitalsBasic.ts b/packages/react-native-sdk/src/instrumentations/webVitals/webVitalsBasic.ts deleted file mode 100644 index 82b0764bf..000000000 --- a/packages/react-native-sdk/src/instrumentations/webVitals/webVitalsBasic.ts +++ /dev/null @@ -1,30 +0,0 @@ -import { onCLS, onFCP, onFID, onINP, onLCP, onTTFB } from 'web-vitals'; - -import type { MeasurementsAPI } from '@grafana/faro-core'; - -export class WebVitalsBasic { - static mapping = { - cls: onCLS, - fcp: onFCP, - fid: onFID, - inp: onINP, - lcp: onLCP, - ttfb: onTTFB, - }; - - constructor(private pushMeasurement: MeasurementsAPI['pushMeasurement']) {} - - initialize(): void { - Object.entries(WebVitalsBasic.mapping).forEach(([indicator, executor]) => { - executor((metric) => { - this.pushMeasurement({ - type: 'web-vitals', - - values: { - [indicator]: metric.value, - }, - }); - }); - }); - } -} diff --git a/packages/react-native-sdk/src/instrumentations/webVitals/webVitalsWithAttribution.test.ts b/packages/react-native-sdk/src/instrumentations/webVitals/webVitalsWithAttribution.test.ts deleted file mode 100644 index 3f18dd89e..000000000 --- a/packages/react-native-sdk/src/instrumentations/webVitals/webVitalsWithAttribution.test.ts +++ /dev/null @@ -1,263 +0,0 @@ -import type { MetricWithAttribution } from 'web-vitals/attribution'; - -import { WebVitalsWithAttribution } from './webVitalsWithAttribution'; - -jest.mock('web-vitals/attribution', () => { - type MetricName = MetricWithAttribution['name']; - type MetricAttribution = MetricWithAttribution['attribution']; - - function createMetric(name: MetricName, attribution: MetricAttribution): MetricWithAttribution { - return { - name, - value: 0.1, - rating: 'good', - delta: 0.1, - id: 'id', - entries: [], - navigationType: 'navigate', - attribution, - } as MetricWithAttribution; - } - - return { - onCLS: (cb: (metric: MetricWithAttribution) => void) => { - cb( - createMetric('CLS', { - largestShiftValue: 0.1, - largestShiftTime: 0.1, - largestShiftTarget: 'target', - loadState: 'loading', - }) - ); - }, - onFCP: (cb: (metric: MetricWithAttribution) => void) => { - cb( - createMetric('FCP', { - firstByteToFCP: 0.1, - timeToFirstByte: 0.1, - loadState: 'loading', - }) - ); - }, - onFID: (cb: (metric: MetricWithAttribution) => void) => { - cb( - createMetric('FID', { - eventTime: 0.1, - eventTarget: 'target', - eventType: 'type', - loadState: 'loading', - }) - ); - }, - onLCP: (cb: (metric: MetricWithAttribution) => void) => { - cb( - createMetric('LCP', { - elementRenderDelay: 0.1, - resourceLoadDelay: 0.1, - resourceLoadDuration: 0.1, - timeToFirstByte: 0.1, - element: 'element', - }) - ); - }, - onTTFB: (cb: (metric: MetricWithAttribution) => void) => { - cb( - createMetric('TTFB', { - dnsDuration: 0.1, - connectionDuration: 0.1, - requestDuration: 0.1, - waitingDuration: 0.1, - cacheDuration: 0.1, - }) - ); - }, - onINP: (cb: (metric: MetricWithAttribution) => void) => { - cb( - createMetric('INP', { - eventTime: 0.1, - interactionTarget: 'target', - interactionType: 'pointer', - loadState: 'loading', - interactionTime: 0.1, - }) - ); - }, - }; -}); - -describe('WebVitalsWithAttributionInstrumentation', () => { - it('send cls metrics correctly', () => { - const pushMeasurement = jest.fn(); - new WebVitalsWithAttribution(pushMeasurement).initialize(); - - const values = { - cls: 0.1, - largest_shift_value: 0.1, - largest_shift_time: 0.1, - delta: 0.1, - }; - - const context = { - navigation_entry_id: 'unknown', - navigation_type: 'navigate', - id: 'id', - largest_shift_target: 'target', - load_state: 'loading', - rating: 'good', - }; - - expect(pushMeasurement).toHaveBeenCalledWith( - { - type: 'web-vitals', - values, - }, - { context } - ); - }); - - it('send fcp metrics correctly', () => { - const pushMeasurement = jest.fn(); - new WebVitalsWithAttribution(pushMeasurement).initialize(); - - const values = { - fcp: 0.1, - delta: 0.1, - first_byte_to_fcp: 0.1, - time_to_first_byte: 0.1, - }; - - const context = { - id: 'id', - navigation_entry_id: 'unknown', - navigation_type: 'navigate', - rating: 'good', - load_state: 'loading', - }; - - expect(pushMeasurement).toHaveBeenCalledWith( - { - type: 'web-vitals', - values, - }, - { context } - ); - }); - - it('send fid metrics correctly', () => { - const pushMeasurement = jest.fn(); - new WebVitalsWithAttribution(pushMeasurement).initialize(); - - const values = { - fid: 0.1, - delta: 0.1, - event_time: 0.1, - }; - - const context = { - id: 'id', - navigation_entry_id: 'unknown', - navigation_type: 'navigate', - rating: 'good', - event_target: 'target', - event_type: 'type', - load_state: 'loading', - }; - - expect(pushMeasurement).toHaveBeenCalledWith( - { - type: 'web-vitals', - values, - }, - { context } - ); - }); - - it('send inp metrics correctly', () => { - const pushMeasurement = jest.fn(); - new WebVitalsWithAttribution(pushMeasurement).initialize(); - - const values = { - inp: 0.1, - delta: 0.1, - interaction_time: 0.1, - }; - - const context = { - id: 'id', - navigation_entry_id: 'unknown', - navigation_type: 'navigate', - rating: 'good', - interaction_target: 'target', - interaction_type: 'pointer', - load_state: 'loading', - }; - - expect(pushMeasurement).toHaveBeenCalledWith( - { - type: 'web-vitals', - values, - }, - { context } - ); - }); - - it('send lcp metrics correctly', () => { - const pushMeasurement = jest.fn(); - new WebVitalsWithAttribution(pushMeasurement).initialize(); - - const values = { - lcp: 0.1, - delta: 0.1, - element_render_delay: 0.1, - resource_load_delay: 0.1, - resource_load_duration: 0.1, - time_to_first_byte: 0.1, - }; - - const context = { - id: 'id', - navigation_entry_id: 'unknown', - navigation_type: 'navigate', - rating: 'good', - element: 'element', - }; - - expect(pushMeasurement).toHaveBeenCalledWith( - { - type: 'web-vitals', - values, - }, - { context } - ); - }); - - it('send ttfb metrics correctly', () => { - const pushMeasurement = jest.fn(); - new WebVitalsWithAttribution(pushMeasurement).initialize(); - - const values = { - ttfb: 0.1, - delta: 0.1, - cache_duration: 0.1, - dns_duration: 0.1, - connection_duration: 0.1, - request_duration: 0.1, - waiting_duration: 0.1, - }; - - const context = { - rating: 'good', - id: 'id', - navigation_entry_id: 'unknown', - navigation_type: 'navigate', - }; - - expect(pushMeasurement).toHaveBeenCalledWith( - { - type: 'web-vitals', - values, - }, - { context } - ); - }); -}); diff --git a/packages/react-native-sdk/src/instrumentations/webVitals/webVitalsWithAttribution.ts b/packages/react-native-sdk/src/instrumentations/webVitals/webVitalsWithAttribution.ts deleted file mode 100644 index 8ab04f577..000000000 --- a/packages/react-native-sdk/src/instrumentations/webVitals/webVitalsWithAttribution.ts +++ /dev/null @@ -1,170 +0,0 @@ -import { onCLS, onFCP, onFID, onINP, onLCP, onTTFB } from 'web-vitals/attribution'; -import type { Metric } from 'web-vitals/attribution'; - -import { unknownString } from '@grafana/faro-core'; -import type { MeasurementEvent, MeasurementsAPI, PushMeasurementOptions } from '@grafana/faro-core'; - -import { getItem, webStorageType } from '../../utils'; -import { NAVIGATION_ID_STORAGE_KEY } from '../instrumentationConstants'; - -type Values = MeasurementEvent['values']; -type Context = Required['context']; - -// duplicate keys saved in variables to save bundle size -// refs: https://github.com/grafana/faro-web-sdk/pull/595#discussion_r1615833968 -const loadStateKey = 'load_state'; -const timeToFirstByteKey = 'time_to_first_byte'; - -export class WebVitalsWithAttribution { - constructor(private corePushMeasurement: MeasurementsAPI['pushMeasurement']) {} - - initialize(): void { - this.measureCLS(); - this.measureFCP(); - this.measureFID(); - this.measureINP(); - this.measureLCP(); - this.measureTTFB(); - } - - private measureCLS(): void { - onCLS((metric) => { - const { loadState, largestShiftValue, largestShiftTime, largestShiftTarget } = metric.attribution; - - const values = this.buildInitialValues(metric); - this.addIfPresent(values, 'largest_shift_value', largestShiftValue); - this.addIfPresent(values, 'largest_shift_time', largestShiftTime); - - const context = this.buildInitialContext(metric); - this.addIfPresent(context, loadStateKey, loadState); - this.addIfPresent(context, 'largest_shift_target', largestShiftTarget); - - this.pushMeasurement(values, context); - }); - } - - private measureFCP(): void { - onFCP((metric) => { - const { firstByteToFCP, timeToFirstByte, loadState } = metric.attribution; - - const values = this.buildInitialValues(metric); - this.addIfPresent(values, 'first_byte_to_fcp', firstByteToFCP); - this.addIfPresent(values, timeToFirstByteKey, timeToFirstByte); - - const context = this.buildInitialContext(metric); - this.addIfPresent(context, loadStateKey, loadState); - - this.pushMeasurement(values, context); - }); - } - - private measureFID(): void { - onFID((metric) => { - const { eventTime, eventTarget, eventType, loadState } = metric.attribution; - - const values = this.buildInitialValues(metric); - this.addIfPresent(values, 'event_time', eventTime); - - const context = this.buildInitialContext(metric); - this.addIfPresent(context, 'event_target', eventTarget); - this.addIfPresent(context, 'event_type', eventType); - this.addIfPresent(context, loadStateKey, loadState); - - this.pushMeasurement(values, context); - }); - } - - private measureINP(): void { - onINP((metric) => { - const { - interactionTime, - presentationDelay, - inputDelay, - processingDuration, - nextPaintTime, - loadState, - interactionTarget, - interactionType, - } = metric.attribution; - - const values = this.buildInitialValues(metric); - this.addIfPresent(values, 'interaction_time', interactionTime); - this.addIfPresent(values, 'presentation_delay', presentationDelay); - this.addIfPresent(values, 'input_delay', inputDelay); - this.addIfPresent(values, 'processing_duration', processingDuration); - this.addIfPresent(values, 'next_paint_time', nextPaintTime); - - const context = this.buildInitialContext(metric); - this.addIfPresent(context, loadStateKey, loadState); - this.addIfPresent(context, 'interaction_target', interactionTarget); - this.addIfPresent(context, 'interaction_type', interactionType); - - this.pushMeasurement(values, context); - }); - } - - private measureLCP(): void { - onLCP((metric) => { - const { elementRenderDelay, resourceLoadDelay, resourceLoadDuration, timeToFirstByte, element } = - metric.attribution; - - const values = this.buildInitialValues(metric); - this.addIfPresent(values, 'element_render_delay', elementRenderDelay); - this.addIfPresent(values, 'resource_load_delay', resourceLoadDelay); - this.addIfPresent(values, 'resource_load_duration', resourceLoadDuration); - this.addIfPresent(values, timeToFirstByteKey, timeToFirstByte); - - const context = this.buildInitialContext(metric); - this.addIfPresent(context, 'element', element); - - this.pushMeasurement(values, context); - }); - } - - private measureTTFB(): void { - onTTFB((metric) => { - const { dnsDuration, connectionDuration, requestDuration, waitingDuration, cacheDuration } = metric.attribution; - - const values = this.buildInitialValues(metric); - this.addIfPresent(values, 'dns_duration', dnsDuration); - this.addIfPresent(values, 'connection_duration', connectionDuration); - this.addIfPresent(values, 'request_duration', requestDuration); - this.addIfPresent(values, 'waiting_duration', waitingDuration); - this.addIfPresent(values, 'cache_duration', cacheDuration); - - const context = this.buildInitialContext(metric); - - this.pushMeasurement(values, context); - }); - } - - private buildInitialValues(metric: Metric): Values { - const indicator = metric.name.toLowerCase(); - return { - [indicator]: metric.value, - delta: metric.delta, - }; - } - - private buildInitialContext(metric: Metric): Context { - const navigationEntryId = getItem(NAVIGATION_ID_STORAGE_KEY, webStorageType.session) ?? unknownString; - - return { - id: metric.id, - rating: metric.rating, - navigation_type: metric.navigationType, - navigation_entry_id: navigationEntryId, - }; - } - - private pushMeasurement(values: Values, context: Context): void { - const type = 'web-vitals'; - this.corePushMeasurement({ type, values }, { context }); - } - - private addIfPresent(source: Values | Context, key: string, metric?: number | string): void { - if (metric) { - source[key] = metric; - } - } -} diff --git a/packages/react-native-sdk/src/utils/asyncStorage.ts b/packages/react-native-sdk/src/utils/asyncStorage.ts new file mode 100644 index 000000000..8fbca13d7 --- /dev/null +++ b/packages/react-native-sdk/src/utils/asyncStorage.ts @@ -0,0 +1,16 @@ +import AsyncStorage from '@react-native-async-storage/async-storage'; + + +export async function getItem(key: string): Promise { + return AsyncStorage.getItem(key); +} + +export async function setItem(key: string, value: string): Promise { + await AsyncStorage.setItem(key, value); +} + +export async function removeItem(key: string): Promise { + await AsyncStorage.removeItem(key); +} + + diff --git a/packages/react-native-sdk/src/utils/index.ts b/packages/react-native-sdk/src/utils/index.ts index 1a6f89fd2..9ec912798 100644 --- a/packages/react-native-sdk/src/utils/index.ts +++ b/packages/react-native-sdk/src/utils/index.ts @@ -1,12 +1,8 @@ export { - isLocalStorageAvailable, - isSessionStorageAvailable, - webStorageType, getItem, - isWebStorageAvailable, removeItem, setItem, -} from './webStorage'; +} from './asyncStorage'; export { throttle } from './throttle'; diff --git a/packages/react-native-sdk/src/utils/webStorage.ts b/packages/react-native-sdk/src/utils/webStorage.ts deleted file mode 100644 index 948549b10..000000000 --- a/packages/react-native-sdk/src/utils/webStorage.ts +++ /dev/null @@ -1,86 +0,0 @@ -import { faro } from '@grafana/faro-core'; - -export const webStorageType = { - session: 'sessionStorage', - local: 'localStorage', -} as const; - -type StorageMechanism = (typeof webStorageType)[keyof typeof webStorageType]; - -// TODO: remove default storage type from all function - -/** - * Check if selected web storage mechanism is available. - * @param type storage mechanism to test availability for. - * @returns - */ -export function isWebStorageAvailable(type: StorageMechanism): boolean { - try { - let storage; - storage = window[type]; - - const testItem = '__faro_storage_test__'; - storage.setItem(testItem, testItem); - storage.removeItem(testItem); - return true; - } catch (error) { - // the above can throw - faro.internalLogger?.info(`Web storage of type ${type} is not available. Reason: ${error}`); - return false; - } -} - -/** - * Get item from SessionStorage or LocalStorage. - * @param key: the item key. - * @param webStorageMechanism: wether the item shall be received form local storage or session storage. Defaults to local storage. - */ -export function getItem(key: string, webStorageMechanism: StorageMechanism): string | null { - if (isWebStorageTypeAvailable(webStorageMechanism)) { - return window[webStorageMechanism].getItem(key); - } - - return null; -} - -/** - * Store item in SessionStorage or LocalStorage. - * @param key: the item key. - * @param value: the item data. - * @param webStorageMechanism: wether the item shall be received form local storage or session storage. Defaults to local storage. - */ -export function setItem(key: string, value: string, webStorageMechanism: StorageMechanism): void { - if (isWebStorageTypeAvailable(webStorageMechanism)) { - try { - window[webStorageMechanism].setItem(key, value); - } catch (error) { - // do nothing - } - } -} - -/** - * Remove item from SessionStorage or LocalStorage. - * @param key: the item key. - * @param webStorageMechanism: wether the item shall be received form local storage or session storage. Defaults to local storage. - */ -export function removeItem(key: string, webStorageMechanism: StorageMechanism): void { - if (isWebStorageTypeAvailable(webStorageMechanism)) { - window[webStorageMechanism].removeItem(key); - } -} - -export const isLocalStorageAvailable = isWebStorageAvailable(webStorageType.local); -export const isSessionStorageAvailable = isWebStorageAvailable(webStorageType.session); - -function isWebStorageTypeAvailable(webStorageMechanism: StorageMechanism) { - if (webStorageMechanism === webStorageType.local) { - return isLocalStorageAvailable; - } - - if (webStorageMechanism === webStorageType.session) { - return isSessionStorageAvailable; - } - - return false; -} diff --git a/yarn.lock b/yarn.lock index 29d855ce1..1f2999689 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2383,6 +2383,13 @@ dependencies: "@swc/helpers" "^0.5.0" +"@react-native-async-storage/async-storage@1.15.5": + version "1.15.5" + resolved "https://registry.yarnpkg.com/@react-native-async-storage/async-storage/-/async-storage-1.15.5.tgz#0d221a5ef1cd7a6494a42fcaad43136d68379afb" + integrity sha512-4AYehLH39B9a8UXCMf3ieOK+G61wGMP72ikx6/XSMA0DUnvx0PgaeaT2Wyt06kTrDTy8edewKnbrbeqwaM50TQ== + dependencies: + deep-assign "^3.0.0" + "@react-native-community/cli-clean@11.3.7": version "11.3.7" resolved "https://registry.yarnpkg.com/@react-native-community/cli-clean/-/cli-clean-11.3.7.tgz#cb4c2f225f78593412c2d191b55b8570f409a48f" @@ -5713,6 +5720,13 @@ dedent@1.5.3, dedent@^1.0.0: resolved "https://registry.yarnpkg.com/dedent/-/dedent-1.5.3.tgz#99aee19eb9bae55a67327717b6e848d0bf777e5a" integrity sha512-NHQtfOOW68WD8lgypbLA5oT+Bt0xXJhiYvoR6SmmNXZfpzOGXwdKWmcwG8N7PwVVWV3eF/68nmD9BaJSsTBhyQ== +deep-assign@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/deep-assign/-/deep-assign-3.0.0.tgz#c8e4c4d401cba25550a2f0f486a2e75bc5f219a2" + integrity sha512-YX2i9XjJ7h5q/aQ/IM9PEwEnDqETAIYbggmdDB3HLTlSgo1CxPsj6pvhPG68rq6SVE0+p+6Ywsm5fTYNrYtBWw== + dependencies: + is-obj "^1.0.0" + deep-extend@^0.6.0: version "0.6.0" resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac" @@ -8368,7 +8382,7 @@ is-number@^7.0.0: resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== -is-obj@^1.0.1: +is-obj@^1.0.0, is-obj@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-1.0.1.tgz#3e4729ac1f5fde025cd7d83a896dab9f4f67db0f" integrity sha512-l4RyHgRqGN4Y3+9JHVrNqO+tN0rV5My76uW5/nuO4K1b6vw5G8d/cmFjP9tRfEsdhZNt0IFdZuK/c2Vr4Nb+Qg== @@ -14345,18 +14359,6 @@ time-stamp@^1.0.0: resolved "https://registry.yarnpkg.com/time-stamp/-/time-stamp-1.1.0.tgz#764a5a11af50561921b133f3b44e618687e0f5c3" integrity sha512-gLCeArryy2yNTRzTGKbZbloctj64jkZ57hj5zdraXue6aFgd6PmvVtEyiUU+hvU0v7q08oVv8r8ev0tRo6bvgw== -tldts-core@^6.1.70: - version "6.1.70" - resolved "https://registry.yarnpkg.com/tldts-core/-/tldts-core-6.1.70.tgz#a954e93237ece2e1705b438600793c86a25f8c00" - integrity sha512-RNnIXDB1FD4T9cpQRErEqw6ZpjLlGdMOitdV+0xtbsnwr4YFka1zpc7D4KD+aAn8oSG5JyFrdasZTE04qDE9Yg== - -tldts@^6.1.32: - version "6.1.70" - resolved "https://registry.yarnpkg.com/tldts/-/tldts-6.1.70.tgz#b571e5645ab9dc6f289453115d52602b8a384cfe" - integrity sha512-/W1YVgYVJd9ZDjey5NXadNh0mJXkiUMUue9Zebd0vpdo1sU+H4zFFTaJ1RKD4N6KFoHfcXy6l+Vu7bh+bdWCzA== - dependencies: - tldts-core "^6.1.70" - tmp@^0.0.33: version "0.0.33" resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9" @@ -14421,7 +14423,7 @@ touch@^3.1.0: resolved "https://registry.yarnpkg.com/touch/-/touch-3.1.1.tgz#097a23d7b161476435e5c1344a95c0f75b4a5694" integrity sha512-r0eojU4bI8MnHr8c5bNo7lJDdI2qXlWWJk6a9EAFG7vbhTjElYhBVS3/miuE0uOuoLdb8Mc/rVfsmm6eo5o9GA== -tough-cookie@^4.1.2: +tough-cookie@^4.1.2, tough-cookie@^4.1.3, tough-cookie@^5.0.0: version "4.1.4" resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-4.1.4.tgz#945f1461b45b5a8c76821c33ea49c3ac192c1b36" integrity sha512-Loo5UUvLD9ScZ6jh8beX1T6sO1w2/MpCRpEP7V280GKMVUQ0Jzar2U3UJPsrdbziLEMMhu3Ujnq//rhiFuIeag== @@ -14431,13 +14433,6 @@ tough-cookie@^4.1.2: universalify "^0.2.0" url-parse "^1.5.3" -tough-cookie@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-5.0.0.tgz#6b6518e2b5c070cf742d872ee0f4f92d69eac1af" - integrity sha512-FRKsF7cz96xIIeMZ82ehjC3xW2E+O2+v11udrDYewUbszngYhsGa8z6YUMMzO9QJZzzyd0nGGXnML/TReX6W8Q== - dependencies: - tldts "^6.1.32" - tr46@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/tr46/-/tr46-3.0.0.tgz#555c4e297a950617e8eeddef633c87d4d9d6cbf9" From 185d655c6d97ea82f24f513de7559479a71755a2 Mon Sep 17 00:00:00 2001 From: Lucas Bento Date: Mon, 10 Feb 2025 14:40:41 +0100 Subject: [PATCH 43/43] refactor: change startup duration to submit as seconds --- packages/react-native-tracing/src/wrapHOC.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/react-native-tracing/src/wrapHOC.tsx b/packages/react-native-tracing/src/wrapHOC.tsx index 6cd5b1056..a1b781858 100644 --- a/packages/react-native-tracing/src/wrapHOC.tsx +++ b/packages/react-native-tracing/src/wrapHOC.tsx @@ -20,12 +20,12 @@ const measureStartupTime = async (): Promise => { const metrics: StartupMetrics = await NativeModules['NativeInstrumentation'].getStartupTime(); const currentTime = Date.now(); - const startupDuration = currentTime - metrics.startupTime; + const startupDurationMs = currentTime - metrics.startupTime; api.pushMeasurement({ type: 'app_startup_time', values: { - startup_duration: startupDuration, + startup_duration: startupDurationMs / 1000, }, timestamp: new Date().toISOString(), });