diff --git a/.github/ISSUE_TEMPLATE/bug.yml b/.github/ISSUE_TEMPLATE/bug.yml index 0ade53b42423..0a4706833d3f 100644 --- a/.github/ISSUE_TEMPLATE/bug.yml +++ b/.github/ISSUE_TEMPLATE/bug.yml @@ -25,7 +25,9 @@ body: - type: dropdown id: package attributes: - label: Which package are you using? + label: + Which SDK are you using? If you use the CDN bundles, please specify the exact bundle (e.g. + `bundle.tracing.min.js`) in your SDK setup. options: - '@sentry/angular' - '@sentry/browser' @@ -40,6 +42,8 @@ body: - '@sentry/svelte' - '@sentry/vue' - '@sentry/wasm' + - Sentry Browser CDN bundle + - Sentry Browser Loader validations: required: true - type: input diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index e7a02ee0cd69..90a9657b0938 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -164,18 +164,14 @@ jobs: id: compute_lockfile_hash run: echo "hash=${{ hashFiles('yarn.lock') }}" >> "$GITHUB_OUTPUT" - # When the `ci-skip-cache` label is added to a PR, we always want to skip dependency cache - name: Check dependency cache uses: actions/cache@v3 id: cache_dependencies - if: needs.job_get_metadata.outputs.force_skip_cache == 'false' with: path: ${{ env.CACHED_DEPENDENCY_PATHS }} key: ${{ steps.compute_lockfile_hash.outputs.hash }} - name: Install dependencies - if: - steps.cache_dependencies.outputs.cache-hit == '' || needs.job_get_metadata.outputs.force_skip_cache == 'true' run: yarn install --ignore-engines --frozen-lockfile outputs: dependency_cache_key: ${{ steps.compute_lockfile_hash.outputs.hash }} @@ -802,7 +798,9 @@ jobs: needs: [job_get_metadata, job_build] runs-on: ubuntu-20.04 timeout-minutes: 30 - if: contains(github.event.pull_request.labels.*.name, 'ci-overhead-measurements') + if: | + contains(github.event.pull_request.labels.*.name, 'ci-overhead-measurements') || + needs.job_get_metadata.outputs.is_develop == 'true' steps: - name: Check out current commit (${{ needs.job_get_metadata.outputs.commit_label }}) uses: actions/checkout@v3 diff --git a/.github/workflows/clear-cache.yml b/.github/workflows/clear-cache.yml new file mode 100644 index 000000000000..40f7141764c3 --- /dev/null +++ b/.github/workflows/clear-cache.yml @@ -0,0 +1,11 @@ +name: Clear all GHA caches +on: + workflow_dispatch: + +jobs: + clear-caches: + name: Delete all caches + runs-on: ubuntu-20.04 + steps: + - name: Clear caches + uses: easimon/wipe-cache@v2 diff --git a/.github/workflows/gitflow-sync-master.yml b/.github/workflows/gitflow-sync-master.yml index 27b5433dab24..6582bbede98a 100644 --- a/.github/workflows/gitflow-sync-master.yml +++ b/.github/workflows/gitflow-sync-master.yml @@ -1,10 +1,10 @@ name: Gitflow - Sync develop into master on: - push: - pull_request: - - types: [closed] - - branches: - - 'develop' + pull_request: + types: + - closed + branches: + - develop env: MAIN_BRANCH: master diff --git a/.size-limit.js b/.size-limit.js index 461de7995ad1..edc8a5466235 100644 --- a/.size-limit.js +++ b/.size-limit.js @@ -84,4 +84,10 @@ module.exports = [ gzip: true, limit: '80 KB', }, + { + name: '@sentry/browser + @sentry/replay - ES6 CDN Bundle (gzipped + minified)', + path: 'packages/browser/build/bundles/bundle.replay.min.js', + gzip: true, + limit: '80 KB', + }, ]; diff --git a/.yarnrc b/.yarnrc index a5f45e052b44..d81643fe43f1 100644 --- a/.yarnrc +++ b/.yarnrc @@ -1,3 +1 @@ -workspaces-experimental true -env: - NODE_OPTIONS --stack-trace-limit=10000 +env: NODE_OPTIONS --stack-trace-limit=10000 diff --git a/CHANGELOG.md b/CHANGELOG.md index 31c1423f968c..7a55ffeb1979 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,18 @@ - "You miss 100 percent of the chances you don't take. — Wayne Gretzky" — Michael Scott +## 7.37.0 + +- feat: Add source map debug ids (#7068) +- feat(browser): Add IndexedDb offline transport store (#6983) +- feat(nextjs): Add auto-wrapping for server components (#6953) +- feat(replay): Improve rrweb error ignoring (#7087 & #7094) +- feat(replay): Send client_report when replay sending fails (#7093) +- fix(node): `LocalVariables`, Improve frame matching for ESM (#7049) +- fix(node): Add lru cache to http integration span map (#7064) + +Work in this release contributed by @JamesHenry. Thank you for your contribution! + ## 7.36.0 This Release re-introduces the accidentally removed but still deprecated `maskInputOptions` option for Session Replay. diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index a7cd962e3020..9fd0522d8062 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -16,11 +16,10 @@ To run the test suite and our code linter, node.js and yarn are required. [`node` download](https://nodejs.org/download) [`yarn` download](https://yarnpkg.com/en/docs/install) -`sentry-javascript` is a monorepo containing several packages, and we use `lerna` to manage them. To get started, install all dependencies, use `lerna` to bootstrap the workspace, and then perform an initial build, so TypeScript can read all of the linked type definitions. +`sentry-javascript` is a monorepo containing several packages, and we use `lerna` to manage them. To get started, install all dependencies, and then perform an initial build, so TypeScript can read all of the linked type definitions. ``` $ yarn -$ yarn lerna bootstrap $ yarn build ``` diff --git a/lerna.json b/lerna.json index bf81b8a46981..2c4575ac63df 100644 --- a/lerna.json +++ b/lerna.json @@ -1,9 +1,6 @@ { "$schema": "node_modules/lerna/schemas/lerna-schema.json", "version": "7.36.0", - "packages": [ - "packages/*" - ], "npmClient": "yarn", "useWorkspaces": true } diff --git a/nx.json b/nx.json index 78d931f5ae31..1020417113c4 100644 --- a/nx.json +++ b/nx.json @@ -6,28 +6,28 @@ "cacheableOperations": [ "build:bundle", "build:transpile", - "build:types" + "build:types", + "lint:eslint" ] } } }, "namedInputs": { + "default": ["{projectRoot}/**/*", "sharedGlobals"], "sharedGlobals": [ "{workspaceRoot}/*.js", - "{workspaceRoot}/*.json", - "{workspaceRoot}/yarn.lock" + "{workspaceRoot}/*.json" ], - "default": [ - "{projectRoot}/**/*", - "sharedGlobals", + "production": [ + "default", "!{projectRoot}/test/**/*", "!{projectRoot}/**/*.md" ] }, "targetDefaults": { "build:bundle": { + "inputs": ["production", "^production"], "dependsOn": [ - "^build:transpile", "build:transpile" ], "outputs": [ @@ -35,15 +35,15 @@ ] }, "build:tarball": { + "inputs": ["production", "^production"], "dependsOn": [ - "^build:transpile", "build:transpile", - "^build:types", "build:types" ], "outputs": [] }, "build:transpile": { + "inputs": ["production", "^production"], "dependsOn": [ "^build:transpile:uncached", "^build:transpile", @@ -56,6 +56,7 @@ ] }, "build:types": { + "inputs": ["production", "^production"], "dependsOn": [ "^build:types" ], @@ -63,21 +64,10 @@ "{projectRoot}/build/types", "{projectRoot}/build/npm/types" ] - } - }, - "targets": { - "@sentry/serverless": { - "build:bundle": { - "dependsOn": [ - "^build:transpile", - "build:transpile", - "^build:types", - "build:types" - ], - "outputs": [ - "{projectRoot}/build/aws" - ] - } + }, + "lint:eslint": { + "inputs": ["default"], + "outputs": [] } } } diff --git a/package.json b/package.json index c63448d7a220..41acc28a1c37 100644 --- a/package.json +++ b/package.json @@ -3,7 +3,7 @@ "scripts": { "build": "node ./scripts/verify-packages-versions.js && run-s build:types build:transpile build:bundle", "build:bundle": "lerna run build:bundle", - "build:dev": "run-s build:types build:transpile", + "build:dev": "lerna run build:types,build:transpile", "build:dev:filter": "lerna run build:dev --include-filtered-dependencies --include-filtered-dependents --scope", "build:transpile": "lerna run build:transpile", "build:types": "lerna run build:types", @@ -85,7 +85,7 @@ "jsdom": "^19.0.0", "karma-browserstack-launcher": "^1.5.1", "karma-firefox-launcher": "^1.1.0", - "lerna": "^6.0.3", + "lerna": "6.5.0-alpha.2", "madge": "4.0.2", "magic-string": "^0.27.0", "mocha": "^6.1.4", diff --git a/packages/angular/package.json b/packages/angular/package.json index 2fb426d42e08..f2808dd545ef 100644 --- a/packages/angular/package.json +++ b/packages/angular/package.json @@ -54,7 +54,7 @@ "fix:eslint": "eslint . --format stylish --fix", "fix:prettier": "prettier --write \"{src,test,scripts}/**/**.ts\"", "lint": "run-s lint:prettier lint:eslint", - "lint:eslint": "eslint . --cache --cache-location '../../eslintcache/' --format stylish", + "lint:eslint": "eslint . --format stylish", "lint:prettier": "prettier --check \"{src,test,scripts}/**/**.ts\"", "test": "yarn test:unit", "test:unit": "jest", diff --git a/packages/browser/package.json b/packages/browser/package.json index cbbc58d458da..f4a15f3f5579 100644 --- a/packages/browser/package.json +++ b/packages/browser/package.json @@ -27,6 +27,7 @@ "btoa": "^1.2.1", "chai": "^4.1.2", "chokidar": "^3.0.2", + "fake-indexeddb": "^4.0.1", "karma": "^6.3.16", "karma-chai": "^0.1.0", "karma-chrome-launcher": "^2.2.0", @@ -61,7 +62,7 @@ "fix:eslint": "eslint . --format stylish --fix", "fix:prettier": "prettier --write \"{src,test,scripts}/**/**.ts\"", "lint": "run-s lint:prettier lint:eslint", - "lint:eslint": "eslint . --cache --cache-location '../../eslintcache/' --format stylish", + "lint:eslint": "eslint . --format stylish", "lint:prettier": "prettier --check \"{src,test,scripts}/**/**.ts\"", "size:check": "run-p size:check:es5 size:check:es6", "size:check:es5": "cat build/bundles/bundle.min.js | gzip -9 | wc -c | awk '{$1=$1/1024; print \"ES5: \",$1,\"kB\";}'", diff --git a/packages/browser/rollup.bundle.config.js b/packages/browser/rollup.bundle.config.js index 23f9bb474c94..e063a9bd4ab0 100644 --- a/packages/browser/rollup.bundle.config.js +++ b/packages/browser/rollup.bundle.config.js @@ -14,4 +14,16 @@ const builds = []; builds.push(...makeBundleConfigVariants(baseBundleConfig)); }); +// Full bundle incl. replay only available for es6 +const replayBaseBundleConfig = makeBaseBundleConfig({ + bundleType: 'standalone', + entrypoints: ['src/index.ts'], + jsVersion: 'es6', + licenseTitle: '@sentry/browser & @sentry/replay', + outputFileBase: () => 'bundles/bundle.replay', + includeReplay: true, +}); + +builds.push(...makeBundleConfigVariants(replayBaseBundleConfig)); + export default builds; diff --git a/packages/browser/src/index.ts b/packages/browser/src/index.ts index 8185cbc6259e..381055dcbef0 100644 --- a/packages/browser/src/index.ts +++ b/packages/browser/src/index.ts @@ -21,10 +21,14 @@ const INTEGRATIONS = { export { INTEGRATIONS as Integrations }; // DO NOT DELETE THESE COMMENTS! -// We want to exclude Replay from CDN bundles, so we remove the block below with our -// excludeReplay Rollup plugin when generating bundles. Everything between -// ROLLUP_EXCLUDE_FROM_BUNDLES_BEGIN and _END__ is removed for bundles. +// We want to exclude Replay/Offline from CDN bundles, so we remove the block below with our +// makeExcludeBlockPlugin Rollup plugin when generating bundles. Everything between +// ROLLUP_EXCLUDE_*_FROM_BUNDLES_BEGIN and _END__ is removed for bundles. -// __ROLLUP_EXCLUDE_FROM_BUNDLES_BEGIN__ +// __ROLLUP_EXCLUDE_REPLAY_FROM_BUNDLES_BEGIN__ export { Replay } from '@sentry/replay'; -// __ROLLUP_EXCLUDE_FROM_BUNDLES_END__ +// __ROLLUP_EXCLUDE_REPLAY_FROM_BUNDLES_END__ + +// __ROLLUP_EXCLUDE_OFFLINE_FROM_BUNDLES_BEGIN__ +export { makeBrowserOfflineTransport } from './transports/offline'; +// __ROLLUP_EXCLUDE_OFFLINE_FROM_BUNDLES_END__ diff --git a/packages/browser/src/transports/offline.ts b/packages/browser/src/transports/offline.ts new file mode 100644 index 000000000000..9bb3e5dbfe2e --- /dev/null +++ b/packages/browser/src/transports/offline.ts @@ -0,0 +1,158 @@ +import type { OfflineStore, OfflineTransportOptions } from '@sentry/core'; +import { makeOfflineTransport } from '@sentry/core'; +import type { Envelope, InternalBaseTransportOptions, Transport } from '@sentry/types'; +import type { TextDecoderInternal } from '@sentry/utils'; +import { parseEnvelope, serializeEnvelope } from '@sentry/utils'; + +// 'Store', 'promisifyRequest' and 'createStore' were originally copied from the 'idb-keyval' package before being +// modified and simplified: https://github.com/jakearchibald/idb-keyval +// +// At commit: 0420a704fd6cbb4225429c536b1f61112d012fca +// Original licence: + +// Copyright 2016, Jake Archibald +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +type Store = (callback: (store: IDBObjectStore) => T | PromiseLike) => Promise; + +function promisifyRequest(request: IDBRequest | IDBTransaction): Promise { + return new Promise((resolve, reject) => { + // @ts-ignore - file size hacks + request.oncomplete = request.onsuccess = () => resolve(request.result); + // @ts-ignore - file size hacks + request.onabort = request.onerror = () => reject(request.error); + }); +} + +/** Create or open an IndexedDb store */ +export function createStore(dbName: string, storeName: string): Store { + const request = indexedDB.open(dbName); + request.onupgradeneeded = () => request.result.createObjectStore(storeName); + const dbp = promisifyRequest(request); + + return callback => dbp.then(db => callback(db.transaction(storeName, 'readwrite').objectStore(storeName))); +} + +function keys(store: IDBObjectStore): Promise { + return promisifyRequest(store.getAllKeys() as IDBRequest); +} + +/** Insert into the store */ +export function insert(store: Store, value: Uint8Array | string, maxQueueSize: number): Promise { + return store(store => { + return keys(store).then(keys => { + if (keys.length >= maxQueueSize) { + return; + } + + // We insert with an incremented key so that the entries are popped in order + store.put(value, Math.max(...keys, 0) + 1); + return promisifyRequest(store.transaction); + }); + }); +} + +/** Pop the oldest value from the store */ +export function pop(store: Store): Promise { + return store(store => { + return keys(store).then(keys => { + if (keys.length === 0) { + return undefined; + } + + return promisifyRequest(store.get(keys[0])).then(value => { + store.delete(keys[0]); + return promisifyRequest(store.transaction).then(() => value); + }); + }); + }); +} + +interface BrowserOfflineTransportOptions extends OfflineTransportOptions { + /** + * Name of indexedDb database to store envelopes in + * Default: 'sentry-offline' + */ + dbName?: string; + /** + * Name of indexedDb object store to store envelopes in + * Default: 'queue' + */ + storeName?: string; + /** + * Maximum number of envelopes to store + * Default: 30 + */ + maxQueueSize?: number; + /** + * Only required for testing on node.js + * @ignore + */ + textDecoder?: TextDecoderInternal; +} + +function createIndexedDbStore(options: BrowserOfflineTransportOptions): OfflineStore { + let store: Store | undefined; + + // Lazily create the store only when it's needed + function getStore(): Store { + if (store == undefined) { + store = createStore(options.dbName || 'sentry-offline', options.storeName || 'queue'); + } + + return store; + } + + return { + insert: async (env: Envelope) => { + try { + const serialized = await serializeEnvelope(env, options.textEncoder); + await insert(getStore(), serialized, options.maxQueueSize || 30); + } catch (_) { + // + } + }, + pop: async () => { + try { + const deserialized = await pop(getStore()); + if (deserialized) { + return parseEnvelope( + deserialized, + options.textEncoder || new TextEncoder(), + options.textDecoder || new TextDecoder(), + ); + } + } catch (_) { + // + } + + return undefined; + }, + }; +} + +function makeIndexedDbOfflineTransport( + createTransport: (options: T) => Transport, +): (options: T & BrowserOfflineTransportOptions) => Transport { + return options => createTransport({ ...options, createStore: createIndexedDbStore }); +} + +/** + * Creates a transport that uses IndexedDb to store events when offline. + */ +export function makeBrowserOfflineTransport( + createTransport: (options: T) => Transport, +): (options: T & BrowserOfflineTransportOptions) => Transport { + return makeIndexedDbOfflineTransport(makeOfflineTransport(createTransport)); +} diff --git a/packages/browser/test/unit/transports/offline.test.ts b/packages/browser/test/unit/transports/offline.test.ts new file mode 100644 index 000000000000..b224df725bc6 --- /dev/null +++ b/packages/browser/test/unit/transports/offline.test.ts @@ -0,0 +1,111 @@ +import 'fake-indexeddb/auto'; + +import { createTransport } from '@sentry/core'; +import type { + EventEnvelope, + EventItem, + InternalBaseTransportOptions, + TransportMakeRequestResponse, +} from '@sentry/types'; +import { createEnvelope } from '@sentry/utils'; +import { TextDecoder, TextEncoder } from 'util'; + +import { MIN_DELAY } from '../../../../core/src/transports/offline'; +import { createStore, insert, makeBrowserOfflineTransport, pop } from '../../../src/transports/offline'; + +function deleteDatabase(name: string): Promise { + return new Promise((resolve, reject) => { + const request = indexedDB.deleteDatabase(name); + request.onsuccess = () => resolve(); + request.onerror = () => reject(request.error); + }); +} + +const ERROR_ENVELOPE = createEnvelope({ event_id: 'aa3ff046696b4bc6b609ce6d28fde9e2', sent_at: '123' }, [ + [{ type: 'event' }, { event_id: 'aa3ff046696b4bc6b609ce6d28fde9e2' }] as EventItem, +]); + +const transportOptions = { + recordDroppedEvent: () => undefined, // noop + textEncoder: new TextEncoder(), + textDecoder: new TextDecoder(), +}; + +type MockResult = T | Error; + +export const createTestTransport = (...sendResults: MockResult[]) => { + let sendCount = 0; + + return { + getSendCount: () => sendCount, + baseTransport: (options: InternalBaseTransportOptions) => + createTransport(options, () => { + return new Promise((resolve, reject) => { + const next = sendResults.shift(); + + if (next instanceof Error) { + reject(next); + } else { + sendCount += 1; + resolve(next as TransportMakeRequestResponse | undefined); + } + }); + }), + }; +}; + +function delay(ms: number): Promise { + return new Promise(resolve => setTimeout(resolve, ms)); +} + +describe('makeOfflineTransport', () => { + beforeAll(async () => { + await deleteDatabase('sentry'); + }); + + it('indexedDb wrappers insert and pop', async () => { + const store = createStore('test', 'test'); + const found = await pop(store); + expect(found).toBeUndefined(); + + await insert(store, 'test1', 30); + await insert(store, new Uint8Array([1, 2, 3, 4, 5]), 30); + + const found2 = await pop(store); + expect(found2).toEqual('test1'); + const found3 = await pop(store); + expect(found3).toEqual(new Uint8Array([1, 2, 3, 4, 5])); + + const found4 = await pop(store); + expect(found4).toBeUndefined(); + }); + + it('Queues and retries envelope if wrapped transport throws error', async () => { + const { getSendCount, baseTransport } = createTestTransport(new Error(), { statusCode: 200 }, { statusCode: 200 }); + let queuedCount = 0; + const transport = makeBrowserOfflineTransport(baseTransport)({ + ...transportOptions, + shouldStore: () => { + queuedCount += 1; + return true; + }, + }); + const result = await transport.send(ERROR_ENVELOPE); + + expect(result).toEqual({}); + + await delay(MIN_DELAY * 2); + + expect(getSendCount()).toEqual(0); + expect(queuedCount).toEqual(1); + + // Sending again will retry the queued envelope too + const result2 = await transport.send(ERROR_ENVELOPE); + expect(result2).toEqual({ statusCode: 200 }); + + await delay(MIN_DELAY * 2); + + expect(queuedCount).toEqual(1); + expect(getSendCount()).toEqual(2); + }); +}); diff --git a/packages/core/package.json b/packages/core/package.json index 3047af60baad..7901aef9d7bc 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -36,7 +36,7 @@ "fix:eslint": "eslint . --format stylish --fix", "fix:prettier": "prettier --write \"{src,test,scripts}/**/**.ts\"", "lint": "run-s lint:prettier lint:eslint", - "lint:eslint": "eslint . --cache --cache-location '../../eslintcache/' --format stylish", + "lint:eslint": "eslint . --format stylish", "lint:prettier": "prettier --check \"{src,test,scripts}/**/**.ts\"", "test": "jest", "test:watch": "jest --watch", diff --git a/packages/core/test/lib/transports/offline.test.ts b/packages/core/test/lib/transports/offline.test.ts index 33fc465d2bcd..ad38f0363279 100644 --- a/packages/core/test/lib/transports/offline.test.ts +++ b/packages/core/test/lib/transports/offline.test.ts @@ -18,7 +18,7 @@ import { TextEncoder } from 'util'; import { createTransport } from '../../../src'; import type { CreateOfflineStore, OfflineTransportOptions } from '../../../src/transports/offline'; -import { makeOfflineTransport, MIN_DELAY, START_DELAY } from '../../../src/transports/offline'; +import { makeOfflineTransport, START_DELAY } from '../../../src/transports/offline'; const ERROR_ENVELOPE = createEnvelope({ event_id: 'aa3ff046696b4bc6b609ce6d28fde9e2', sent_at: '123' }, [ [{ type: 'event' }, { event_id: 'aa3ff046696b4bc6b609ce6d28fde9e2' }] as EventItem, @@ -115,8 +115,19 @@ function createTestStore(...popResults: MockResult[]): { }; } -function delay(ms: number): Promise { - return new Promise(resolve => setTimeout(resolve, ms)); +function waitUntil(fn: () => boolean, timeout: number): Promise { + return new Promise(resolve => { + let runtime = 0; + + const interval = setInterval(() => { + runtime += 100; + + if (fn() || runtime >= timeout) { + clearTimeout(interval); + resolve(); + } + }, 100); + }); } describe('makeOfflineTransport', () => { @@ -138,7 +149,7 @@ describe('makeOfflineTransport', () => { expect(queuedCount).toEqual(0); expect(getSendCount()).toEqual(1); - await delay(MIN_DELAY * 2); + await waitUntil(() => getCalls().length == 1, 1_000); // After a successful send, the store should be checked expect(getCalls()).toEqual(['pop']); @@ -152,7 +163,7 @@ describe('makeOfflineTransport', () => { expect(result).toEqual({ statusCode: 200 }); - await delay(MIN_DELAY * 3); + await waitUntil(() => getCalls().length == 2, 1_000); expect(getSendCount()).toEqual(2); // After a successful send from the store, the store should be checked again to ensure it's empty @@ -175,7 +186,7 @@ describe('makeOfflineTransport', () => { expect(result).toEqual({}); - await delay(MIN_DELAY * 2); + await waitUntil(() => getCalls().length === 1, 1_000); expect(getSendCount()).toEqual(0); expect(queuedCount).toEqual(1); @@ -198,7 +209,7 @@ describe('makeOfflineTransport', () => { expect(result).toEqual({ statusCode: 500 }); - await delay(MIN_DELAY * 2); + await waitUntil(() => getSendCount() === 1, 1_000); expect(getSendCount()).toEqual(1); expect(queuedCount).toEqual(0); @@ -215,7 +226,7 @@ describe('makeOfflineTransport', () => { expect(result).toEqual({}); expect(getCalls()).toEqual(['add']); - await delay(START_DELAY + 1_000); + await waitUntil(() => getCalls().length === 3 && getSendCount() === 1, START_DELAY * 2); expect(getSendCount()).toEqual(1); expect(getCalls()).toEqual(['add', 'pop', 'pop']); @@ -235,7 +246,7 @@ describe('makeOfflineTransport', () => { flushAtStartup: true, }); - await delay(START_DELAY + 1_000); + await waitUntil(() => getCalls().length === 3 && getSendCount() === 2, START_DELAY * 2); expect(getSendCount()).toEqual(2); expect(getCalls()).toEqual(['pop', 'pop', 'pop']); @@ -277,40 +288,44 @@ describe('makeOfflineTransport', () => { expect(getCalls()).toEqual([]); }); - it('Follows the Retry-After header', async () => { - const { getCalls, store } = createTestStore(ERROR_ENVELOPE); - const { getSendCount, baseTransport } = createTestTransport( - { + it( + 'Follows the Retry-After header', + async () => { + const { getCalls, store } = createTestStore(ERROR_ENVELOPE); + const { getSendCount, baseTransport } = createTestTransport( + { + statusCode: 429, + headers: { 'x-sentry-rate-limits': '', 'retry-after': '3' }, + }, + { statusCode: 200 }, + ); + + let queuedCount = 0; + const transport = makeOfflineTransport(baseTransport)({ + ...transportOptions, + createStore: store, + shouldStore: () => { + queuedCount += 1; + return true; + }, + }); + const result = await transport.send(ERROR_ENVELOPE); + + expect(result).toEqual({ statusCode: 429, headers: { 'x-sentry-rate-limits': '', 'retry-after': '3' }, - }, - { statusCode: 200 }, - ); - - let queuedCount = 0; - const transport = makeOfflineTransport(baseTransport)({ - ...transportOptions, - createStore: store, - shouldStore: () => { - queuedCount += 1; - return true; - }, - }); - const result = await transport.send(ERROR_ENVELOPE); - - expect(result).toEqual({ - statusCode: 429, - headers: { 'x-sentry-rate-limits': '', 'retry-after': '3' }, - }); + }); - await delay(MIN_DELAY * 2); + await waitUntil(() => getSendCount() === 1, 500); - expect(getSendCount()).toEqual(1); + expect(getSendCount()).toEqual(1); - await delay(4_000); + await waitUntil(() => getCalls().length === 2, START_DELAY * 2); - expect(getSendCount()).toEqual(2); - expect(queuedCount).toEqual(0); - expect(getCalls()).toEqual(['pop', 'pop']); - }, 7_000); + expect(getSendCount()).toEqual(2); + expect(queuedCount).toEqual(0); + expect(getCalls()).toEqual(['pop', 'pop']); + }, + START_DELAY * 3, + ); }); diff --git a/packages/e2e-tests/package.json b/packages/e2e-tests/package.json index b1bda68963b3..62ea861ec356 100644 --- a/packages/e2e-tests/package.json +++ b/packages/e2e-tests/package.json @@ -11,7 +11,7 @@ "fix:eslint": "eslint . --format stylish --fix", "fix:prettier": "prettier --config ../../.prettierrc.json --write . ", "lint": "run-s lint:prettier lint:eslint", - "lint:eslint": "eslint . --cache --cache-location '../../eslintcache/' --format stylish", + "lint:eslint": "eslint . --format stylish", "lint:prettier": "prettier --config ../../.prettierrc.json --check .", "test:e2e": "run-s test:validate-configuration test:validate-test-app-setups test:run", "test:run": "ts-node run.ts", diff --git a/packages/ember/package.json b/packages/ember/package.json index e6c2f0883d7e..e75e32cb5089 100644 --- a/packages/ember/package.json +++ b/packages/ember/package.json @@ -21,7 +21,7 @@ "clean": "yarn rimraf sentry-ember-*.tgz dist tmp build .node_modules.ember-try package.json.ember-try", "lint": "run-p lint:js lint:hbs lint:ts", "lint:hbs": "ember-template-lint .", - "lint:js": "eslint . --cache --cache-location '../../eslintcache/'", + "lint:js": "eslint .", "lint:ts": "tsc", "start": "ember serve", "test": "ember test", diff --git a/packages/eslint-plugin-sdk/package.json b/packages/eslint-plugin-sdk/package.json index af4ab801a5a0..60df36fffec5 100644 --- a/packages/eslint-plugin-sdk/package.json +++ b/packages/eslint-plugin-sdk/package.json @@ -30,7 +30,7 @@ "fix:eslint": "eslint . --format stylish --fix", "fix:prettier": "prettier --write \"{src,test}/**/*.js\"", "lint": "run-s lint:prettier lint:eslint", - "lint:eslint": "eslint . --cache --cache-location '../../eslintcache/' --format stylish", + "lint:eslint": "eslint . --format stylish", "lint:prettier": "prettier --check \"{src,test}/**/*.js\"", "test": "mocha test --recursive", "build:tarball": "npm pack", diff --git a/packages/gatsby/package.json b/packages/gatsby/package.json index 59e53539342b..529e263d5217 100644 --- a/packages/gatsby/package.json +++ b/packages/gatsby/package.json @@ -52,7 +52,7 @@ "fix:eslint": "eslint . --format stylish --fix", "fix:prettier": "prettier --write \"{src,test,scripts}/**/**.ts\"", "lint": "run-s lint:prettier lint:eslint", - "lint:eslint": "eslint . --cache --cache-location '../../eslintcache/' --format stylish", + "lint:eslint": "eslint . --format stylish", "lint:prettier": "prettier --check \"{src,test,scripts}/**/**.ts\"", "test": "yarn ts-node scripts/pretest.ts && yarn jest", "test:watch": "yarn ts-node scripts/pretest.ts && yarn jest --watch" diff --git a/packages/hub/package.json b/packages/hub/package.json index 5f9bea252c94..be59ded8b298 100644 --- a/packages/hub/package.json +++ b/packages/hub/package.json @@ -37,7 +37,7 @@ "fix:eslint": "eslint . --format stylish --fix", "fix:prettier": "prettier --write \"{src,test,scripts}/**/**.ts\"", "lint": "run-s lint:prettier lint:eslint", - "lint:eslint": "eslint . --cache --cache-location '../../eslintcache/' --format stylish", + "lint:eslint": "eslint . --format stylish", "lint:prettier": "prettier --check \"{src,test,scripts}/**/**.ts\"", "test": "jest", "test:watch": "jest --watch" diff --git a/packages/integration-tests/package.json b/packages/integration-tests/package.json index 54826d45f04b..3b443f0a32e8 100644 --- a/packages/integration-tests/package.json +++ b/packages/integration-tests/package.json @@ -11,7 +11,7 @@ "clean": "rimraf -g suites/**/dist", "install-browsers": "playwright install --with-deps", "lint": "run-s lint:prettier lint:eslint", - "lint:eslint": "eslint . --cache --cache-location '../../eslintcache/' --format stylish", + "lint:eslint": "eslint . --format stylish", "lint:prettier": "prettier --check \"{suites,utils}/**/*.ts\"", "fix": "run-s fix:eslint fix:prettier", "fix:eslint": "eslint . --format stylish --fix", @@ -32,6 +32,7 @@ "@playwright/test": "^1.29.2", "babel-loader": "^8.2.2", "html-webpack-plugin": "^5.5.0", + "pako": "^2.1.0", "playwright": "^1.29.2", "typescript": "^4.5.2", "webpack": "^5.52.0" diff --git a/packages/integration-tests/playwright.config.ts b/packages/integration-tests/playwright.config.ts index 5abc8602ed31..0b1a4e15bfee 100644 --- a/packages/integration-tests/playwright.config.ts +++ b/packages/integration-tests/playwright.config.ts @@ -1,7 +1,7 @@ import type { PlaywrightTestConfig } from '@playwright/test'; const config: PlaywrightTestConfig = { - retries: 2, + retries: 0, workers: 3, }; export default config; diff --git a/packages/integration-tests/suites/replay/compression/init.js b/packages/integration-tests/suites/replay/compression/init.js new file mode 100644 index 000000000000..f20e4054e34f --- /dev/null +++ b/packages/integration-tests/suites/replay/compression/init.js @@ -0,0 +1,18 @@ +import * as Sentry from '@sentry/browser'; +import { Replay } from '@sentry/replay'; + +window.Sentry = Sentry; +window.Replay = new Replay({ + flushMinDelay: 500, + flushMaxDelay: 500, + useCompression: true, +}); + +Sentry.init({ + dsn: 'https://public@dsn.ingest.sentry.io/1337', + sampleRate: 0, + replaysSessionSampleRate: 1.0, + replaysOnErrorSampleRate: 0.0, + + integrations: [window.Replay], +}); diff --git a/packages/integration-tests/suites/replay/compression/subject.js b/packages/integration-tests/suites/replay/compression/subject.js new file mode 100644 index 000000000000..7aa69584f070 --- /dev/null +++ b/packages/integration-tests/suites/replay/compression/subject.js @@ -0,0 +1,6 @@ +document.getElementById('go-background').addEventListener('click', () => { + Object.defineProperty(document, 'hidden', { value: true, writable: true }); + const ev = document.createEvent('Event'); + ev.initEvent('visibilitychange'); + document.dispatchEvent(ev); +}); diff --git a/packages/integration-tests/suites/replay/compression/template.html b/packages/integration-tests/suites/replay/compression/template.html new file mode 100644 index 000000000000..31cfc73ec3c3 --- /dev/null +++ b/packages/integration-tests/suites/replay/compression/template.html @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/packages/integration-tests/suites/replay/compression/test.ts b/packages/integration-tests/suites/replay/compression/test.ts new file mode 100644 index 000000000000..e92d7f2dde40 --- /dev/null +++ b/packages/integration-tests/suites/replay/compression/test.ts @@ -0,0 +1,38 @@ +import { expect } from '@playwright/test'; + +import { sentryTest } from '../../../utils/fixtures'; +import { getExpectedReplayEvent } from '../../../utils/replayEventTemplates'; +import { getFullRecordingSnapshots, getReplayEvent, waitForReplayRequest } from '../../../utils/replayHelpers'; + +sentryTest('replay recording should be compressed by default', async ({ getLocalTestPath, page }) => { + // Replay bundles are es6 only + if (process.env.PW_BUNDLE && process.env.PW_BUNDLE.startsWith('bundle_es5')) { + sentryTest.skip(); + } + + const reqPromise0 = waitForReplayRequest(page, 0); + + await page.route('https://dsn.ingest.sentry.io/**/*', route => { + return route.fulfill({ + status: 200, + contentType: 'application/json', + body: JSON.stringify({ id: 'test-id' }), + }); + }); + + const url = await getLocalTestPath({ testDir: __dirname }); + + await page.goto(url); + const replayEvent0 = getReplayEvent(await reqPromise0); + expect(replayEvent0).toEqual(getExpectedReplayEvent()); + + const snapshots = getFullRecordingSnapshots(await reqPromise0); + expect(snapshots.length).toEqual(1); + + const stringifiedSnapshot = JSON.stringify(snapshots[0]); + expect(stringifiedSnapshot).toContain('"tagName":"body"'); + expect(stringifiedSnapshot).toContain('"tagName":"html"'); + expect(stringifiedSnapshot).toContain('"tagName":"button"'); + expect(stringifiedSnapshot).toContain('"textContent":"*** ***"'); + expect(stringifiedSnapshot).toContain('"id":"go-background"'); +}); diff --git a/packages/integration-tests/suites/replay/customEvents/init.js b/packages/integration-tests/suites/replay/customEvents/init.js new file mode 100644 index 000000000000..f02e43c7235c --- /dev/null +++ b/packages/integration-tests/suites/replay/customEvents/init.js @@ -0,0 +1,18 @@ +import * as Sentry from '@sentry/browser'; +import { Replay } from '@sentry/replay'; + +window.Sentry = Sentry; +window.Replay = new Replay({ + flushMinDelay: 500, + flushMaxDelay: 500, + useCompression: false, +}); + +Sentry.init({ + dsn: 'https://public@dsn.ingest.sentry.io/1337', + sampleRate: 0, + replaysSessionSampleRate: 1.0, + replaysOnErrorSampleRate: 0.0, + + integrations: [window.Replay], +}); diff --git a/packages/integration-tests/suites/replay/customEvents/subject.js b/packages/integration-tests/suites/replay/customEvents/subject.js new file mode 100644 index 000000000000..7aa69584f070 --- /dev/null +++ b/packages/integration-tests/suites/replay/customEvents/subject.js @@ -0,0 +1,6 @@ +document.getElementById('go-background').addEventListener('click', () => { + Object.defineProperty(document, 'hidden', { value: true, writable: true }); + const ev = document.createEvent('Event'); + ev.initEvent('visibilitychange'); + document.dispatchEvent(ev); +}); diff --git a/packages/integration-tests/suites/replay/customEvents/template.html b/packages/integration-tests/suites/replay/customEvents/template.html new file mode 100644 index 000000000000..31cfc73ec3c3 --- /dev/null +++ b/packages/integration-tests/suites/replay/customEvents/template.html @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/packages/integration-tests/suites/replay/customEvents/test.ts b/packages/integration-tests/suites/replay/customEvents/test.ts new file mode 100644 index 000000000000..ac900cfe0961 --- /dev/null +++ b/packages/integration-tests/suites/replay/customEvents/test.ts @@ -0,0 +1,107 @@ +import { expect } from '@playwright/test'; + +import { sentryTest } from '../../../utils/fixtures'; +import { + expectedClickBreadcrumb, + expectedFCPPerformanceSpan, + expectedFPPerformanceSpan, + expectedLCPPerformanceSpan, + expectedMemoryPerformanceSpan, + expectedNavigationPerformanceSpan, + getExpectedReplayEvent, +} from '../../../utils/replayEventTemplates'; +import { getCustomRecordingEvents, getReplayEvent, waitForReplayRequest } from '../../../utils/replayHelpers'; + +sentryTest( + 'replay recording should contain default performance spans', + async ({ getLocalTestPath, page, browserName }) => { + // Replay bundles are es6 only and most performance entries are only available in chromium + if ((process.env.PW_BUNDLE && process.env.PW_BUNDLE.startsWith('bundle_es5')) || browserName !== 'chromium') { + sentryTest.skip(); + } + + const reqPromise0 = waitForReplayRequest(page, 0); + const reqPromise1 = waitForReplayRequest(page, 1); + + await page.route('https://dsn.ingest.sentry.io/**/*', route => { + return route.fulfill({ + status: 200, + contentType: 'application/json', + body: JSON.stringify({ id: 'test-id' }), + }); + }); + + const url = await getLocalTestPath({ testDir: __dirname }); + + await page.goto(url); + const replayEvent0 = getReplayEvent(await reqPromise0); + const { performanceSpans: performanceSpans0 } = getCustomRecordingEvents(await reqPromise0); + + expect(replayEvent0).toEqual(getExpectedReplayEvent({ segment_id: 0 })); + + await page.click('button'); + + const replayEvent1 = getReplayEvent(await reqPromise1); + const { performanceSpans: performanceSpans1 } = getCustomRecordingEvents(await reqPromise1); + + expect(replayEvent1).toEqual( + getExpectedReplayEvent({ segment_id: 1, urls: [], replay_start_timestamp: undefined }), + ); + + // We can't guarantee the order of the performance spans, or in which of the two segments they are sent + // So to avoid flakes, we collect them all and check that they are all there + const collectedPerformanceSpans = [...performanceSpans0, ...performanceSpans1]; + + expect(collectedPerformanceSpans).toEqual( + expect.arrayContaining([ + expectedNavigationPerformanceSpan, + expectedLCPPerformanceSpan, + expectedFPPerformanceSpan, + expectedFCPPerformanceSpan, + expectedMemoryPerformanceSpan, // two memory spans - once per flush + expectedMemoryPerformanceSpan, + ]), + ); + }, +); + +sentryTest( + 'replay recording should contain a click breadcrumb when a button is clicked', + async ({ getLocalTestPath, page }) => { + // Replay bundles are es6 only + if (process.env.PW_BUNDLE && process.env.PW_BUNDLE.startsWith('bundle_es5')) { + sentryTest.skip(); + } + + const reqPromise0 = waitForReplayRequest(page, 0); + const reqPromise1 = waitForReplayRequest(page, 1); + + await page.route('https://dsn.ingest.sentry.io/**/*', route => { + return route.fulfill({ + status: 200, + contentType: 'application/json', + body: JSON.stringify({ id: 'test-id' }), + }); + }); + + const url = await getLocalTestPath({ testDir: __dirname }); + + await page.goto(url); + const replayEvent0 = getReplayEvent(await reqPromise0); + const { breadcrumbs: breadcrumbs0 } = getCustomRecordingEvents(await reqPromise0); + + expect(replayEvent0).toEqual(getExpectedReplayEvent({ segment_id: 0 })); + expect(breadcrumbs0.length).toEqual(0); + + await page.click('button'); + + const replayEvent1 = getReplayEvent(await reqPromise1); + const { breadcrumbs: breadcrumbs1 } = getCustomRecordingEvents(await reqPromise1); + + expect(replayEvent1).toEqual( + getExpectedReplayEvent({ segment_id: 1, urls: [], replay_start_timestamp: undefined }), + ); + + expect(breadcrumbs1).toEqual([expectedClickBreadcrumb]); + }, +); diff --git a/packages/integration-tests/suites/tracing/browsertracing/backgroundtab-pageload/subject.js b/packages/integration-tests/suites/tracing/browsertracing/backgroundtab-pageload/subject.js index 7aa69584f070..b657f38ac009 100644 --- a/packages/integration-tests/suites/tracing/browsertracing/backgroundtab-pageload/subject.js +++ b/packages/integration-tests/suites/tracing/browsertracing/backgroundtab-pageload/subject.js @@ -1,6 +1,8 @@ document.getElementById('go-background').addEventListener('click', () => { - Object.defineProperty(document, 'hidden', { value: true, writable: true }); - const ev = document.createEvent('Event'); - ev.initEvent('visibilitychange'); - document.dispatchEvent(ev); + setTimeout(() => { + Object.defineProperty(document, 'hidden', { value: true, writable: true }); + const ev = document.createEvent('Event'); + ev.initEvent('visibilitychange'); + document.dispatchEvent(ev); + }, 250); }); diff --git a/packages/integration-tests/suites/tracing/browsertracing/backgroundtab-pageload/test.ts b/packages/integration-tests/suites/tracing/browsertracing/backgroundtab-pageload/test.ts index 690e6e857409..8df4f0369041 100644 --- a/packages/integration-tests/suites/tracing/browsertracing/backgroundtab-pageload/test.ts +++ b/packages/integration-tests/suites/tracing/browsertracing/backgroundtab-pageload/test.ts @@ -9,9 +9,11 @@ sentryTest('should finish pageload transaction when the page goes background', a await page.goto(url); - void page.click('#go-background'); + const pageloadTransactionPromise = getFirstSentryEnvelopeRequest(page); - const pageloadTransaction = await getFirstSentryEnvelopeRequest(page); + await page.click('#go-background'); + + const pageloadTransaction = await pageloadTransactionPromise; expect(pageloadTransaction.contexts?.trace?.op).toBe('pageload'); expect(pageloadTransaction.contexts?.trace?.status).toBe('cancelled'); diff --git a/packages/integration-tests/suites/tracing/metrics/web-vitals-cls/test.ts b/packages/integration-tests/suites/tracing/metrics/web-vitals-cls/test.ts index 41bf941f10d3..a445cc967147 100644 --- a/packages/integration-tests/suites/tracing/metrics/web-vitals-cls/test.ts +++ b/packages/integration-tests/suites/tracing/metrics/web-vitals-cls/test.ts @@ -18,7 +18,11 @@ sentryTest('should capture a "GOOD" CLS vital with its source(s).', async ({ get expect(eventData.measurements).toBeDefined(); expect(eventData.measurements?.cls?.value).toBeDefined(); - expect(eventData.measurements?.cls?.value).toBeCloseTo(0.05); + + // Flakey value dependent on timings -> we check for a range + expect(eventData.measurements?.cls?.value).toBeGreaterThan(0.03); + expect(eventData.measurements?.cls?.value).toBeLessThan(0.07); + expect(eventData.tags?.['cls.source.1']).toBe('body > div#content > p#partial'); }); @@ -28,7 +32,11 @@ sentryTest('should capture a "MEH" CLS vital with its source(s).', async ({ getL expect(eventData.measurements).toBeDefined(); expect(eventData.measurements?.cls?.value).toBeDefined(); - expect(eventData.measurements?.cls?.value).toBeCloseTo(0.21); + + // Flakey value dependent on timings -> we check for a range + expect(eventData.measurements?.cls?.value).toBeGreaterThan(0.18); + expect(eventData.measurements?.cls?.value).toBeLessThan(0.23); + expect(eventData.tags?.['cls.source.1']).toBe('body > div#content > p'); }); @@ -38,11 +46,8 @@ sentryTest('should capture a "POOR" CLS vital with its source(s).', async ({ get expect(eventData.measurements).toBeDefined(); expect(eventData.measurements?.cls?.value).toBeDefined(); - // This test in particular seems to be flaky, such that the received value is frequently within 0.006 rather than the - // 0.005 that `toBeCloseTo()` requires. While it's true that each test is retried twice if it fails, in the flaky - // cases all three attempts always seem to come up with the exact same slightly-too-far-away number. Rather than ramp - // down `toBeCloseTo()`'s precision (which would make it accept anything between 0.30 and 0.40), we can just do the - // check manually. + + // Flakey value dependent on timings -> we check for a range expect(eventData.measurements?.cls?.value).toBeGreaterThan(0.34); expect(eventData.measurements?.cls?.value).toBeLessThan(0.36); expect(eventData.tags?.['cls.source.1']).toBe('body > div#content > p'); diff --git a/packages/integration-tests/suites/transport/offline/init.js b/packages/integration-tests/suites/transport/offline/init.js new file mode 100644 index 000000000000..a69f8a32b32a --- /dev/null +++ b/packages/integration-tests/suites/transport/offline/init.js @@ -0,0 +1,8 @@ +import * as Sentry from '@sentry/browser'; + +window.Sentry = Sentry; + +Sentry.init({ + dsn: 'https://public@dsn.ingest.sentry.io/1337', + transport: Sentry.makeBrowserOfflineTransport(Sentry.makeFetchTransport), +}); diff --git a/packages/integration-tests/suites/transport/offline/queued/subject.js b/packages/integration-tests/suites/transport/offline/queued/subject.js new file mode 100644 index 000000000000..9075d7bac69a --- /dev/null +++ b/packages/integration-tests/suites/transport/offline/queued/subject.js @@ -0,0 +1,3 @@ +setTimeout(() => { + Sentry.captureMessage(`foo ${Math.random()}`); +}, 500); diff --git a/packages/integration-tests/suites/transport/offline/queued/test.ts b/packages/integration-tests/suites/transport/offline/queued/test.ts new file mode 100644 index 000000000000..61020eceb79b --- /dev/null +++ b/packages/integration-tests/suites/transport/offline/queued/test.ts @@ -0,0 +1,51 @@ +import { expect } from '@playwright/test'; +import type { Event } from '@sentry/types'; + +import { sentryTest } from '../../../../utils/fixtures'; +import { getMultipleSentryEnvelopeRequests } from '../../../../utils/helpers'; + +function delay(ms: number) { + return new Promise(resolve => setTimeout(resolve, ms)); +} + +sentryTest('should queue and retry events when they fail to send', async ({ getLocalTestPath, page }) => { + // makeBrowserOfflineTransport is not included in any CDN bundles + if (process.env.PW_BUNDLE && process.env.PW_BUNDLE.startsWith('bundle_')) { + sentryTest.skip(); + } + + const url = await getLocalTestPath({ testDir: __dirname }); + + // This would be the obvious way to test offline support but it doesn't appear to work! + // await context.setOffline(true); + + let abortedCount = 0; + + // Abort all envelope requests so the event gets queued + await page.route(/ingest\.sentry\.io/, route => { + abortedCount += 1; + return route.abort(); + }); + await page.goto(url); + await delay(1_000); + await page.unroute(/ingest\.sentry\.io/); + + expect(abortedCount).toBe(1); + + // The previous event should now be queued + + // This will force the page to be reloaded and a new event to be sent + const eventData = await getMultipleSentryEnvelopeRequests(page, 3, { url, timeout: 10_000 }); + + // Filter out any client reports + const events = eventData.filter(e => !('discarded_events' in e)) as Event[]; + + expect(events).toHaveLength(2); + + // The next two events will be message events starting with 'foo' + expect(events[0].message?.startsWith('foo')); + expect(events[1].message?.startsWith('foo')); + + // But because these are two different events, they should have different random numbers in the message + expect(events[0].message !== events[1].message); +}); diff --git a/packages/integration-tests/utils/helpers.ts b/packages/integration-tests/utils/helpers.ts index 443e3e0e57af..5fb2aafff3e1 100644 --- a/packages/integration-tests/utils/helpers.ts +++ b/packages/integration-tests/utils/helpers.ts @@ -17,8 +17,8 @@ export const envelopeParser = (request: Request | null): unknown[] => { }); }; -export const envelopeRequestParser = (request: Request | null): Event => { - return envelopeParser(request)[2] as Event; +export const envelopeRequestParser = (request: Request | null, envelopeIndex = 2): Event => { + return envelopeParser(request)[envelopeIndex] as Event; }; export const envelopeHeaderRequestParser = (request: Request | null): EventEnvelopeHeaders => { diff --git a/packages/integration-tests/utils/replayEventTemplates.ts b/packages/integration-tests/utils/replayEventTemplates.ts new file mode 100644 index 000000000000..6a86ef8f45c7 --- /dev/null +++ b/packages/integration-tests/utils/replayEventTemplates.ts @@ -0,0 +1,124 @@ +/* eslint-disable @typescript-eslint/explicit-function-return-type */ +import { expect } from '@playwright/test'; +import { SDK_VERSION } from '@sentry/browser'; +import type { ReplayEvent } from '@sentry/types'; + +const DEFAULT_REPLAY_EVENT = { + type: 'replay_event', + timestamp: expect.any(Number), + error_ids: [], + trace_ids: [], + urls: [expect.stringContaining('/dist/index.html')], + replay_id: expect.stringMatching(/\w{32}/), + replay_start_timestamp: expect.any(Number), + segment_id: 0, + replay_type: 'session', + event_id: expect.stringMatching(/\w{32}/), + environment: 'production', + sdk: { + integrations: [ + 'InboundFilters', + 'FunctionToString', + 'TryCatch', + 'Breadcrumbs', + 'GlobalHandlers', + 'LinkedErrors', + 'Dedupe', + 'HttpContext', + 'Replay', + ], + version: SDK_VERSION, + name: 'sentry.javascript.browser', + }, + sdkProcessingMetadata: {}, + request: { + url: expect.stringContaining('/dist/index.html'), + headers: { + 'User-Agent': expect.stringContaining(''), + }, + }, + platform: 'javascript', + contexts: { replay: { session_sample_rate: 1, error_sample_rate: 0 } }, +}; + +/** + * Creates a ReplayEvent object with the default values merged with the customExpectedReplayEvent. + * This is useful for testing multi-segment replays to not repeat most of the properties that don't change + * throughout the replay segments. + * + * Note: The benfit of this approach over expect.objectContaining is that, + * we'll catch if properties we expect to stay the same actually change. + * + * @param customExpectedReplayEvent overwrite the default values with custom values (e.g. segment_id) + */ +export function getExpectedReplayEvent(customExpectedReplayEvent: Partial & Record = {}) { + return { + ...DEFAULT_REPLAY_EVENT, + ...customExpectedReplayEvent, + }; +} + +/* This is how we expect different kinds of navigation performance span to look: */ + +export const expectedNavigationPerformanceSpan = { + op: 'navigation.navigate', + description: '', + startTimestamp: expect.any(Number), + endTimestamp: expect.any(Number), + data: { + duration: expect.any(Number), + size: expect.any(Number), + }, +}; + +export const expectedMemoryPerformanceSpan = { + op: 'memory', + description: 'memory', + startTimestamp: expect.any(Number), + endTimestamp: expect.any(Number), + data: { + memory: { + jsHeapSizeLimit: expect.any(Number), + totalJSHeapSize: expect.any(Number), + usedJSHeapSize: expect.any(Number), + }, + }, +}; + +export const expectedLCPPerformanceSpan = { + op: 'largest-contentful-paint', + description: 'largest-contentful-paint', + startTimestamp: expect.any(Number), + endTimestamp: expect.any(Number), + data: { + duration: expect.any(Number), + nodeId: expect.any(Number), + size: expect.any(Number), + }, +}; + +export const expectedFCPPerformanceSpan = { + op: 'paint', + description: 'first-contentful-paint', + startTimestamp: expect.any(Number), + endTimestamp: expect.any(Number), +}; + +export const expectedFPPerformanceSpan = { + op: 'paint', + description: 'first-paint', + startTimestamp: expect.any(Number), + endTimestamp: expect.any(Number), +}; + +/* Breadcrumbs */ + +export const expectedClickBreadcrumb = { + timestamp: expect.any(Number), + type: 'default', + category: 'ui.click', + message: expect.any(String), + data: { + nodeId: expect.any(Number), + }, +}; diff --git a/packages/integration-tests/utils/replayHelpers.ts b/packages/integration-tests/utils/replayHelpers.ts index 601285c266b9..b133ee1a3fe7 100644 --- a/packages/integration-tests/utils/replayHelpers.ts +++ b/packages/integration-tests/utils/replayHelpers.ts @@ -1,9 +1,30 @@ -import type { ReplayContainer } from '@sentry/replay/build/npm/types/types'; -import type { Event, ReplayEvent } from '@sentry/types'; +import type { RecordingEvent, ReplayContainer } from '@sentry/replay/build/npm/types/types'; +import type { Breadcrumb, Event, ReplayEvent } from '@sentry/types'; +import pako from 'pako'; import type { Page, Request } from 'playwright'; import { envelopeRequestParser } from './helpers'; +type CustomRecordingEvent = { tag: string; payload: Record }; +type PerformanceSpan = { + op: string; + description: string; + startTimestamp: number; + endTimestamp: number; + data: Record; +}; + +export type RecordingSnapshot = { + node: SnapshotNode; + initialOffset: number; +}; + +type SnapshotNode = { + type: number; + id: number; + childNodes: SnapshotNode[]; +}; + /** * Waits for a replay request to be sent by the page and returns it. * @@ -56,3 +77,103 @@ export async function getReplaySnapshot(page: Page): Promise { } export const REPLAY_DEFAULT_FLUSH_MAX_DELAY = 5_000; + +export function getReplayEvent(replayRequest: Request): ReplayEvent { + const event = envelopeRequestParser(replayRequest); + if (!isReplayEvent(event)) { + throw new Error('Request is not a replay event'); + } + return event; +} + +/** + * Takes an uncompressed replay request and returns the custom recording events, + * i.e. the events we emit as type 5 rrweb events + * + * @param replayRequest + * @returns an object containing the replay breadcrumbs and performance spans + */ +export function getCustomRecordingEvents(replayRequest: Request): { + breadcrumbs: Breadcrumb[]; + performanceSpans: PerformanceSpan[]; +} { + const recordingEvents = getDecompressedRecordingEvents(replayRequest); + + const breadcrumbs = getReplayBreadcrumbs(recordingEvents); + const performanceSpans = getReplayPerformanceSpans(recordingEvents); + return { breadcrumbs, performanceSpans }; +} + +function getAllCustomRrwebRecordingEvents(recordingEvents: RecordingEvent[]): CustomRecordingEvent[] { + return recordingEvents.filter(event => event.type === 5).map(event => event.data as CustomRecordingEvent); +} + +function getReplayBreadcrumbs(recordingEvents: RecordingEvent[], category?: string): Breadcrumb[] { + return getAllCustomRrwebRecordingEvents(recordingEvents) + .filter(data => data.tag === 'breadcrumb') + .map(data => data.payload) + .filter(payload => !category || payload.category === category); +} + +function getReplayPerformanceSpans(recordingEvents: RecordingEvent[]): PerformanceSpan[] { + return getAllCustomRrwebRecordingEvents(recordingEvents) + .filter(data => data.tag === 'performanceSpan') + .map(data => data.payload) as PerformanceSpan[]; +} + +export function getFullRecordingSnapshots(replayRequest: Request): RecordingSnapshot[] { + const events = getDecompressedRecordingEvents(replayRequest) as RecordingEvent[]; + return events.filter(event => event.type === 2).map(event => event.data as RecordingSnapshot); +} + +function getDecompressedRecordingEvents(replayRequest: Request): RecordingEvent[] { + return replayEnvelopeRequestParser(replayRequest, 5) as RecordingEvent[]; +} + +/** + * Copy of the envelopeParser from ./helpers.ts, but with the ability + * to decompress zlib-compressed envelope payloads which we need to inspect for replay recordings. + * This parser can handle uncompressed as well as compressed replay recordings. + */ +const replayEnvelopeRequestParser = (request: Request | null, envelopeIndex = 2): Event => { + const envelope = replayEnvelopeParser(request); + return envelope[envelopeIndex] as Event; +}; + +const replayEnvelopeParser = (request: Request | null): unknown[] => { + // https://develop.sentry.dev/sdk/envelopes/ + const envelopeBytes = request?.postDataBuffer() || ''; + + // first, we convert the bugger to string to split and go through the uncompressed lines + const envelopeString = envelopeBytes.toString(); + + const lines = envelopeString.split('\n').map(line => { + try { + return JSON.parse(line); + } catch (error) { + // If we fail to parse a line, we _might_ have found a compressed payload, + // so let's check if this is actually the case. + // This is quite hacky but we can't go through `line` because the prior operations + // seem to have altered its binary content. Hence, we take the raw envelope and + // look up the place where the zlib compression header(0x78 0x9c) starts + for (let i = 0; i < envelopeBytes.length; i++) { + if (envelopeBytes[i] === 0x78 && envelopeBytes[i + 1] === 0x9c) { + try { + // We found a zlib-compressed payload - let's decompress it + const payload = envelopeBytes.slice(i); + // now we return the decompressed payload as JSON + const decompressedPayload = pako.inflate(payload as unknown as Uint8Array, { to: 'string' }); + return JSON.parse(decompressedPayload); + } catch { + // Let's log that something went wrong + return line; + } + } + } + + return line; + } + }); + + return lines; +}; diff --git a/packages/integrations/package.json b/packages/integrations/package.json index 2172d3df83b6..2507bee50f53 100644 --- a/packages/integrations/package.json +++ b/packages/integrations/package.json @@ -41,7 +41,7 @@ "fix:eslint": "eslint . --format stylish --fix", "fix:prettier": "prettier --write \"{src,test,scripts}/**/**.ts\"", "lint": "run-s lint:prettier lint:eslint", - "lint:eslint": "eslint . --cache --cache-location '../../eslintcache/' --format stylish", + "lint:eslint": "eslint . --format stylish", "lint:prettier": "prettier --check \"{src,test,scripts}/**/**.ts\"", "test": "jest", "test:watch": "jest --watch" diff --git a/packages/nextjs/package.json b/packages/nextjs/package.json index cac557050820..36b13a70abf0 100644 --- a/packages/nextjs/package.json +++ b/packages/nextjs/package.json @@ -61,7 +61,7 @@ "fix:eslint": "eslint . --format stylish --fix", "fix:prettier": "prettier --write \"{src,test,scripts}/**/**.ts\"", "lint": "run-s lint:prettier lint:eslint", - "lint:eslint": "eslint . --cache --cache-location '../../eslintcache/' --format stylish", + "lint:eslint": "eslint . --format stylish", "lint:prettier": "prettier --check \"{src,test,scripts}/**/**.ts\"", "test": "yarn test:unit", "test:all": "run-s test:unit test:integration test:build", diff --git a/packages/nextjs/rollup.npm.config.js b/packages/nextjs/rollup.npm.config.js index 9d560679b5ce..63f420f466ad 100644 --- a/packages/nextjs/rollup.npm.config.js +++ b/packages/nextjs/rollup.npm.config.js @@ -11,7 +11,7 @@ export default [ 'src/client/index.ts', 'src/server/index.ts', 'src/edge/index.ts', - 'src/config/webpack.ts', + 'src/config/index.ts', ], // prevent this internal nextjs code from ending up in our built package (this doesn't happen automatially because @@ -25,6 +25,7 @@ export default [ 'src/config/templates/pageWrapperTemplate.ts', 'src/config/templates/apiWrapperTemplate.ts', 'src/config/templates/middlewareWrapperTemplate.ts', + 'src/config/templates/serverComponentWrapperTemplate.ts', ], packageSpecificConfig: { diff --git a/packages/nextjs/src/client/index.ts b/packages/nextjs/src/client/index.ts index fbd9e1eaefba..8537c15cb963 100644 --- a/packages/nextjs/src/client/index.ts +++ b/packages/nextjs/src/client/index.ts @@ -114,3 +114,5 @@ export { withSentryServerSideErrorGetInitialProps, wrapErrorGetInitialPropsWithSentry, } from './wrapErrorGetInitialPropsWithSentry'; + +export { wrapAppDirComponentWithSentry } from './wrapAppDirComponentWithSentry'; diff --git a/packages/nextjs/src/client/wrapAppDirComponentWithSentry.ts b/packages/nextjs/src/client/wrapAppDirComponentWithSentry.ts new file mode 100644 index 000000000000..767f2beb5be7 --- /dev/null +++ b/packages/nextjs/src/client/wrapAppDirComponentWithSentry.ts @@ -0,0 +1,7 @@ +/** + * Currently just a pass-through to provide isomorphism for the client. May be used in the future to add instrumentation + * for client components. + */ +export function wrapAppDirComponentWithSentry(wrappingTarget: any): any { + return wrappingTarget; +} diff --git a/packages/nextjs/src/config/loaders/wrappingLoader.ts b/packages/nextjs/src/config/loaders/wrappingLoader.ts index 1e7aac4b7c8a..eba33dfb7ac3 100644 --- a/packages/nextjs/src/config/loaders/wrappingLoader.ts +++ b/packages/nextjs/src/config/loaders/wrappingLoader.ts @@ -15,6 +15,14 @@ const pageWrapperTemplateCode = fs.readFileSync(pageWrapperTemplatePath, { encod const middlewareWrapperTemplatePath = path.resolve(__dirname, '..', 'templates', 'middlewareWrapperTemplate.js'); const middlewareWrapperTemplateCode = fs.readFileSync(middlewareWrapperTemplatePath, { encoding: 'utf8' }); +const serverComponentWrapperTemplatePath = path.resolve( + __dirname, + '..', + 'templates', + 'serverComponentWrapperTemplate.js', +); +const serverComponentWrapperTemplateCode = fs.readFileSync(serverComponentWrapperTemplatePath, { encoding: 'utf8' }); + // Just a simple placeholder to make referencing module consistent const SENTRY_WRAPPER_MODULE_NAME = 'sentry-wrapper-module'; @@ -23,8 +31,10 @@ const WRAPPING_TARGET_MODULE_NAME = '__SENTRY_WRAPPING_TARGET_FILE__.cjs'; type LoaderOptions = { pagesDir: string; + appDir: string; pageExtensionRegex: string; excludeServerRoutes: Array; + wrappingTargetKind: 'page' | 'api-route' | 'middleware' | 'page-server-component'; }; /** @@ -36,52 +46,91 @@ export default function wrappingLoader( this: LoaderThis, userCode: string, userModuleSourceMap: any, -): void | string { +): void { // We know one or the other will be defined, depending on the version of webpack being used const { pagesDir, + appDir, pageExtensionRegex, excludeServerRoutes = [], + wrappingTargetKind, } = 'getOptions' in this ? this.getOptions() : this.query; this.async(); - // Get the parameterized route name from this page's filepath - const parameterizedRoute = path - // Get the path of the file insde of the pages directory - .relative(pagesDir, this.resourcePath) - // Add a slash at the beginning - .replace(/(.*)/, '/$1') - // Pull off the file extension - .replace(new RegExp(`\\.(${pageExtensionRegex})`), '') - // Any page file named `index` corresponds to root of the directory its in, URL-wise, so turn `/xyz/index` into - // just `/xyz` - .replace(/\/index$/, '') - // In case all of the above have left us with an empty string (which will happen if we're dealing with the - // homepage), sub back in the root route - .replace(/^$/, '/'); - - // Skip explicitly-ignored pages - if (stringMatchesSomePattern(parameterizedRoute, excludeServerRoutes, true)) { - this.callback(null, userCode, userModuleSourceMap); - return; - } + let templateCode: string; - const middlewareJsPath = path.join(pagesDir, '..', 'middleware.js'); - const middlewareTsPath = path.join(pagesDir, '..', 'middleware.ts'); + if (wrappingTargetKind === 'page' || wrappingTargetKind === 'api-route') { + // Get the parameterized route name from this page's filepath + const parameterizedPagesRoute = path.posix + .normalize( + path + // Get the path of the file insde of the pages directory + .relative(pagesDir, this.resourcePath), + ) + // Add a slash at the beginning + .replace(/(.*)/, '/$1') + // Pull off the file extension + .replace(new RegExp(`\\.(${pageExtensionRegex})`), '') + // Any page file named `index` corresponds to root of the directory its in, URL-wise, so turn `/xyz/index` into + // just `/xyz` + .replace(/\/index$/, '') + // In case all of the above have left us with an empty string (which will happen if we're dealing with the + // homepage), sub back in the root route + .replace(/^$/, '/'); - let templateCode: string; - if (parameterizedRoute.startsWith('/api')) { - templateCode = apiWrapperTemplateCode; - } else if (this.resourcePath === middlewareJsPath || this.resourcePath === middlewareTsPath) { + // Skip explicitly-ignored pages + if (stringMatchesSomePattern(parameterizedPagesRoute, excludeServerRoutes, true)) { + this.callback(null, userCode, userModuleSourceMap); + return; + } + + if (wrappingTargetKind === 'page') { + templateCode = pageWrapperTemplateCode; + } else if (wrappingTargetKind === 'api-route') { + templateCode = apiWrapperTemplateCode; + } else { + throw new Error(`Invariant: Could not get template code of unknown kind "${wrappingTargetKind}"`); + } + + // Inject the route and the path to the file we're wrapping into the template + templateCode = templateCode.replace(/__ROUTE__/g, parameterizedPagesRoute.replace(/\\/g, '\\\\')); + } else if (wrappingTargetKind === 'page-server-component') { + // Get the parameterized route name from this page's filepath + const parameterizedPagesRoute = path.posix + .normalize(path.relative(appDir, this.resourcePath)) + // Add a slash at the beginning + .replace(/(.*)/, '/$1') + // Pull off the file name + .replace(/\/page\.(js|jsx|tsx)$/, '') + // Remove routing groups: https://beta.nextjs.org/docs/routing/defining-routes#example-creating-multiple-root-layouts + .replace(/\/(\(.*?\)\/)+/g, '/') + // In case all of the above have left us with an empty string (which will happen if we're dealing with the + // homepage), sub back in the root route + .replace(/^$/, '/'); + + // Skip explicitly-ignored pages + if (stringMatchesSomePattern(parameterizedPagesRoute, excludeServerRoutes, true)) { + this.callback(null, userCode, userModuleSourceMap); + return; + } + + // The following string is what Next.js injects in order to mark client components: + // https://github.com/vercel/next.js/blob/295f9da393f7d5a49b0c2e15a2f46448dbdc3895/packages/next/build/analysis/get-page-static-info.ts#L37 + // https://github.com/vercel/next.js/blob/a1c15d84d906a8adf1667332a3f0732be615afa0/packages/next-swc/crates/core/src/react_server_components.rs#L247 + // We do not want to wrap client components + if (userCode.includes('/* __next_internal_client_entry_do_not_use__ */')) { + this.callback(null, userCode, userModuleSourceMap); + return; + } + + templateCode = serverComponentWrapperTemplateCode; + } else if (wrappingTargetKind === 'middleware') { templateCode = middlewareWrapperTemplateCode; } else { - templateCode = pageWrapperTemplateCode; + throw new Error(`Invariant: Could not get template code of unknown kind "${wrappingTargetKind}"`); } - // Inject the route and the path to the file we're wrapping into the template - templateCode = templateCode.replace(/__ROUTE__/g, parameterizedRoute.replace(/\\/g, '\\\\')); - // Replace the import path of the wrapping target in the template with a path that the `wrapUserCode` function will understand. templateCode = templateCode.replace(/__SENTRY_WRAPPING_TARGET_FILE__/g, WRAPPING_TARGET_MODULE_NAME); @@ -97,7 +146,6 @@ export default function wrappingLoader( `[@sentry/nextjs] Could not instrument ${this.resourcePath}. An error occurred while auto-wrapping:\n${err}`, ); this.callback(null, userCode, userModuleSourceMap); - return; }); } diff --git a/packages/nextjs/src/config/templates/serverComponentWrapperTemplate.ts b/packages/nextjs/src/config/templates/serverComponentWrapperTemplate.ts new file mode 100644 index 000000000000..4ba89238aad8 --- /dev/null +++ b/packages/nextjs/src/config/templates/serverComponentWrapperTemplate.ts @@ -0,0 +1,36 @@ +/* + * This file is a template for the code which will be substituted when our webpack loader handles non-API files in the + * `pages/` directory. + * + * We use `__SENTRY_WRAPPING_TARGET_FILE__` as a placeholder for the path to the file being wrapped. Because it's not a real package, + * this causes both TS and ESLint to complain, hence the pragma comments below. + */ + +// @ts-ignore See above +// eslint-disable-next-line import/no-unresolved +import * as wrapee from '__SENTRY_WRAPPING_TARGET_FILE__'; +// eslint-disable-next-line import/no-extraneous-dependencies +import * as Sentry from '@sentry/nextjs'; + +type ServerComponentModule = { + default: unknown; +}; + +const serverComponentModule = wrapee as ServerComponentModule; + +const serverComponent = serverComponentModule.default; + +let wrappedServerComponent; +if (typeof serverComponent === 'function') { + wrappedServerComponent = Sentry.wrapAppDirComponentWithSentry(serverComponent); +} else { + wrappedServerComponent = serverComponent; +} + +// Re-export anything exported by the page module we're wrapping. When processing this code, Rollup is smart enough to +// not include anything whose name matchs something we've explicitly exported above. +// @ts-ignore See above +// eslint-disable-next-line import/no-unresolved +export * from '__SENTRY_WRAPPING_TARGET_FILE__'; + +export default wrappedServerComponent; diff --git a/packages/nextjs/src/config/types.ts b/packages/nextjs/src/config/types.ts index dd7a18f2f821..721b6d2ffb58 100644 --- a/packages/nextjs/src/config/types.ts +++ b/packages/nextjs/src/config/types.ts @@ -106,9 +106,14 @@ export type UserSentryOptions = { */ autoInstrumentMiddleware?: boolean; + /** + * Automatically instrument components in the `app` directory with error monitoring. Defaults to `true`. + */ + autoInstrumentAppDirectory?: boolean; + /** * Exclude certain serverside API routes or pages from being instrumented with Sentry. This option takes an array of - * strings or regular expressions. + * strings or regular expressions. This options also affects pages in the `app` directory. * * NOTE: Pages should be specified as routes (`/animals` or `/api/animals/[animalType]/habitat`), not filepaths * (`pages/animals/index.js` or `.\src\pages\api\animals\[animalType]\habitat.tsx`), and strings must be be a full, diff --git a/packages/nextjs/src/config/webpack.ts b/packages/nextjs/src/config/webpack.ts index 918d98f74cb4..46a6c9e5ec72 100644 --- a/packages/nextjs/src/config/webpack.ts +++ b/packages/nextjs/src/config/webpack.ts @@ -86,59 +86,128 @@ export function constructWebpackConfigFunction( ], }); - if (isServer && userSentryOptions.autoInstrumentServerFunctions !== false) { - let pagesDirPath: string; - if (fs.existsSync(path.join(projectDir, 'pages')) && fs.lstatSync(path.join(projectDir, 'pages')).isDirectory()) { - pagesDirPath = path.join(projectDir, 'pages'); + let pagesDirPath: string; + let appDirPath: string; + if (fs.existsSync(path.join(projectDir, 'pages')) && fs.lstatSync(path.join(projectDir, 'pages')).isDirectory()) { + pagesDirPath = path.join(projectDir, 'pages'); + appDirPath = path.join(projectDir, 'app'); + } else { + pagesDirPath = path.join(projectDir, 'src', 'pages'); + appDirPath = path.join(projectDir, 'src', 'app'); + } + + const apiRoutesPath = path.join(pagesDirPath, 'api'); + + const middlewareJsPath = path.join(pagesDirPath, '..', 'middleware.js'); + const middlewareTsPath = path.join(pagesDirPath, '..', 'middleware.ts'); + + // Default page extensions per https://github.com/vercel/next.js/blob/f1dbc9260d48c7995f6c52f8fbcc65f08e627992/packages/next/server/config-shared.ts#L161 + const pageExtensions = userNextConfig.pageExtensions || ['tsx', 'ts', 'jsx', 'js']; + const dotPrefixedPageExtensions = pageExtensions.map(ext => `.${ext}`); + const pageExtensionRegex = pageExtensions.map(escapeStringForRegex).join('|'); + + const staticWrappingLoaderOptions = { + appDir: appDirPath, + pagesDir: pagesDirPath, + pageExtensionRegex, + excludeServerRoutes: userSentryOptions.excludeServerRoutes, + }; + + const normalizeLoaderResourcePath = (resourcePath: string): string => { + // `resourcePath` may be an absolute path or a path relative to the context of the webpack config + let absoluteResourcePath: string; + if (path.isAbsolute(resourcePath)) { + absoluteResourcePath = resourcePath; } else { - pagesDirPath = path.join(projectDir, 'src', 'pages'); + absoluteResourcePath = path.join(projectDir, resourcePath); } - const middlewareJsPath = path.join(pagesDirPath, '..', 'middleware.js'); - const middlewareTsPath = path.join(pagesDirPath, '..', 'middleware.ts'); + return path.normalize(absoluteResourcePath); + }; - // Default page extensions per https://github.com/vercel/next.js/blob/f1dbc9260d48c7995f6c52f8fbcc65f08e627992/packages/next/server/config-shared.ts#L161 - const pageExtensions = userNextConfig.pageExtensions || ['tsx', 'ts', 'jsx', 'js']; - const dotPrefixedPageExtensions = pageExtensions.map(ext => `.${ext}`); - const pageExtensionRegex = pageExtensions.map(escapeStringForRegex).join('|'); + if (isServer && userSentryOptions.autoInstrumentServerFunctions !== false) { + // It is very important that we insert our loaders at the beginning of the array because we expect any sort of transformations/transpilations (e.g. TS -> JS) to already have happened. - // It is very important that we insert our loader at the beginning of the array because we expect any sort of transformations/transpilations (e.g. TS -> JS) to already have happened. + // Wrap pages newConfig.module.rules.unshift({ test: resourcePath => { - // We generally want to apply the loader to all API routes, pages and to the middleware file. - - // `resourcePath` may be an absolute path or a path relative to the context of the webpack config - let absoluteResourcePath: string; - if (path.isAbsolute(resourcePath)) { - absoluteResourcePath = resourcePath; - } else { - absoluteResourcePath = path.join(projectDir, resourcePath); - } - const normalizedAbsoluteResourcePath = path.normalize(absoluteResourcePath); - - if ( - // Match everything inside pages/ with the appropriate file extension + const normalizedAbsoluteResourcePath = normalizeLoaderResourcePath(resourcePath); + return ( normalizedAbsoluteResourcePath.startsWith(pagesDirPath) && + !normalizedAbsoluteResourcePath.startsWith(apiRoutesPath) && dotPrefixedPageExtensions.some(ext => normalizedAbsoluteResourcePath.endsWith(ext)) - ) { - return true; - } else if ( - // Match middleware.js and middleware.ts - normalizedAbsoluteResourcePath === middlewareJsPath || - normalizedAbsoluteResourcePath === middlewareTsPath - ) { - return userSentryOptions.autoInstrumentMiddleware ?? true; - } else { - return false; - } + ); + }, + use: [ + { + loader: path.resolve(__dirname, 'loaders', 'wrappingLoader.js'), + options: { + ...staticWrappingLoaderOptions, + wrappingTargetKind: 'page', + }, + }, + ], + }); + + // Wrap api routes + newConfig.module.rules.unshift({ + test: resourcePath => { + const normalizedAbsoluteResourcePath = normalizeLoaderResourcePath(resourcePath); + return ( + normalizedAbsoluteResourcePath.startsWith(apiRoutesPath) && + dotPrefixedPageExtensions.some(ext => normalizedAbsoluteResourcePath.endsWith(ext)) + ); + }, + use: [ + { + loader: path.resolve(__dirname, 'loaders', 'wrappingLoader.js'), + options: { + ...staticWrappingLoaderOptions, + wrappingTargetKind: 'api-route', + }, + }, + ], + }); + + // Wrap middleware + newConfig.module.rules.unshift({ + test: resourcePath => { + const normalizedAbsoluteResourcePath = normalizeLoaderResourcePath(resourcePath); + return ( + normalizedAbsoluteResourcePath === middlewareJsPath || normalizedAbsoluteResourcePath === middlewareTsPath + ); + }, + use: [ + { + loader: path.resolve(__dirname, 'loaders', 'wrappingLoader.js'), + options: { + ...staticWrappingLoaderOptions, + wrappingTargetKind: 'middleware', + }, + }, + ], + }); + } + + if (isServer && userSentryOptions.autoInstrumentAppDirectory !== false) { + // Wrap page server components + newConfig.module.rules.unshift({ + test: resourcePath => { + const normalizedAbsoluteResourcePath = normalizeLoaderResourcePath(resourcePath); + + // ".js, .jsx, or .tsx file extensions can be used for Pages" + // https://beta.nextjs.org/docs/routing/pages-and-layouts#pages:~:text=.js%2C%20.jsx%2C%20or%20.tsx%20file%20extensions%20can%20be%20used%20for%20Pages. + return ( + normalizedAbsoluteResourcePath.startsWith(appDirPath) && + !!normalizedAbsoluteResourcePath.match(/[\\/]page\.(js|jsx|tsx)$/) + ); }, use: [ { loader: path.resolve(__dirname, 'loaders', 'wrappingLoader.js'), options: { - pagesDir: pagesDirPath, - pageExtensionRegex, - excludeServerRoutes: userSentryOptions.excludeServerRoutes, + ...staticWrappingLoaderOptions, + wrappingTargetKind: 'page-server-component', }, }, ], diff --git a/packages/nextjs/src/edge/index.ts b/packages/nextjs/src/edge/index.ts index 712b0f61a81f..9bfd7046474f 100644 --- a/packages/nextjs/src/edge/index.ts +++ b/packages/nextjs/src/edge/index.ts @@ -139,3 +139,5 @@ export { } from './wrapApiHandlerWithSentry'; export { wrapMiddlewareWithSentry } from './wrapMiddlewareWithSentry'; + +export { wrapAppDirComponentWithSentry } from './wrapAppDirComponentWithSentry'; diff --git a/packages/nextjs/src/edge/wrapAppDirComponentWithSentry.ts b/packages/nextjs/src/edge/wrapAppDirComponentWithSentry.ts new file mode 100644 index 000000000000..116df75a4caa --- /dev/null +++ b/packages/nextjs/src/edge/wrapAppDirComponentWithSentry.ts @@ -0,0 +1,32 @@ +import { captureException } from '@sentry/core'; + +/** + * Wraps an `app` directory server component with Sentry error instrumentation. + */ +export function wrapAppDirComponentWithSentry any>(appDirComponent: F): F { + // Even though users may define server components as async functions, for the client bundles + // Next.js will turn them into synchronous functions and it will transform any`await`s into instances of the`use` + // hook. 🤯 + return new Proxy(appDirComponent, { + apply: (originalFunction, thisArg, args) => { + let maybePromiseResult; + + try { + maybePromiseResult = originalFunction.apply(thisArg, args); + } catch (e) { + captureException(e); + throw e; + } + + if (typeof maybePromiseResult === 'object' && maybePromiseResult !== null && 'then' in maybePromiseResult) { + // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access + return maybePromiseResult.then(null, (e: Error) => { + captureException(e); + throw e; + }); + } else { + return maybePromiseResult; + } + }, + }); +} diff --git a/packages/nextjs/src/index.types.ts b/packages/nextjs/src/index.types.ts index 58c8ac33da29..aca9f9d48211 100644 --- a/packages/nextjs/src/index.types.ts +++ b/packages/nextjs/src/index.types.ts @@ -125,3 +125,8 @@ export declare function wrapErrorGetInitialPropsWithSentry any>( getInitialProps: F, ): (...args: Parameters) => ReturnType extends Promise ? ReturnType : Promise>; + +/** + * Wraps an `app` directory component with Sentry error instrumentation. (Currently only reports errors for server components) + */ +export declare function wrapAppDirComponentWithSentry any>(WrappingTarget: F): F; diff --git a/packages/nextjs/src/server/index.ts b/packages/nextjs/src/server/index.ts index 94404082b09a..9afdedd9ae91 100644 --- a/packages/nextjs/src/server/index.ts +++ b/packages/nextjs/src/server/index.ts @@ -219,3 +219,5 @@ export { withSentryAPI, wrapApiHandlerWithSentry, } from './wrapApiHandlerWithSentry'; + +export { wrapAppDirComponentWithSentry } from './wrapAppDirComponentWithSentry'; diff --git a/packages/nextjs/src/server/wrapAppDirComponentWithSentry.ts b/packages/nextjs/src/server/wrapAppDirComponentWithSentry.ts new file mode 100644 index 000000000000..116df75a4caa --- /dev/null +++ b/packages/nextjs/src/server/wrapAppDirComponentWithSentry.ts @@ -0,0 +1,32 @@ +import { captureException } from '@sentry/core'; + +/** + * Wraps an `app` directory server component with Sentry error instrumentation. + */ +export function wrapAppDirComponentWithSentry any>(appDirComponent: F): F { + // Even though users may define server components as async functions, for the client bundles + // Next.js will turn them into synchronous functions and it will transform any`await`s into instances of the`use` + // hook. 🤯 + return new Proxy(appDirComponent, { + apply: (originalFunction, thisArg, args) => { + let maybePromiseResult; + + try { + maybePromiseResult = originalFunction.apply(thisArg, args); + } catch (e) { + captureException(e); + throw e; + } + + if (typeof maybePromiseResult === 'object' && maybePromiseResult !== null && 'then' in maybePromiseResult) { + // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access + return maybePromiseResult.then(null, (e: Error) => { + captureException(e); + throw e; + }); + } else { + return maybePromiseResult; + } + }, + }); +} diff --git a/packages/nextjs/test/config/loaders.test.ts b/packages/nextjs/test/config/loaders.test.ts index 714d3388782c..9c56f97e5b3b 100644 --- a/packages/nextjs/test/config/loaders.test.ts +++ b/packages/nextjs/test/config/loaders.test.ts @@ -1,6 +1,7 @@ // mock helper functions not tested directly in this file import './mocks'; +import type { ModuleRuleUseProperty, WebpackModuleRule } from '../../src/config/types'; import { clientBuildContext, clientWebpackConfig, @@ -38,6 +39,29 @@ declare global { } } +function applyRuleToResource(rule: WebpackModuleRule, resourcePath: string): ModuleRuleUseProperty[] { + const applications = []; + + let shouldApply: boolean = false; + if (typeof rule.test === 'function') { + shouldApply = rule.test(resourcePath); + } else if (rule.test instanceof RegExp) { + shouldApply = !!resourcePath.match(rule.test); + } else if (rule.test) { + shouldApply = resourcePath === rule.test; + } + + if (shouldApply) { + if (Array.isArray(rule.use)) { + applications.push(...rule.use); + } else if (rule.use) { + applications.push(rule.use); + } + } + + return applications; +} + describe('webpack loaders', () => { describe('server loaders', () => { it('adds server `valueInjection` loader to server config', async () => { @@ -60,6 +84,128 @@ describe('webpack loaders', () => { ], }); }); + + it.each([ + { + resourcePath: '/Users/Maisey/projects/squirrelChasingSimulator/src/pages/testPage.tsx', + expectedWrappingTargetKind: 'page', + }, + { + resourcePath: './src/pages/testPage.tsx', + expectedWrappingTargetKind: 'page', + }, + { + resourcePath: './pages/testPage.tsx', + expectedWrappingTargetKind: undefined, + }, + { + resourcePath: '../src/pages/testPage.tsx', + expectedWrappingTargetKind: undefined, + }, + { + resourcePath: '/Users/Maisey/projects/squirrelChasingSimulator/src/pages/nested/testPage.ts', + expectedWrappingTargetKind: 'page', + }, + { + resourcePath: '/Users/Maisey/projects/squirrelChasingSimulator/src/pages/nested/testPage.js', + expectedWrappingTargetKind: 'page', + }, + { + resourcePath: '/Users/Maisey/projects/squirrelChasingSimulator/src/pages/[nested]/[testPage].js', + expectedWrappingTargetKind: 'page', + }, + { + resourcePath: '/Users/Maisey/projects/squirrelChasingSimulator/src/pages/[...testPage].js', + expectedWrappingTargetKind: 'page', + }, + { + resourcePath: '/Users/Maisey/projects/squirrelChasingSimulator/src/middleware.js', + expectedWrappingTargetKind: 'middleware', + }, + { + resourcePath: './src/middleware.js', + expectedWrappingTargetKind: 'middleware', + }, + { + resourcePath: './middleware.js', + expectedWrappingTargetKind: undefined, + }, + { + resourcePath: '/Users/Maisey/projects/squirrelChasingSimulator/src/middleware.ts', + expectedWrappingTargetKind: 'middleware', + }, + { + resourcePath: '/Users/Maisey/projects/squirrelChasingSimulator/src/middleware.tsx', + expectedWrappingTargetKind: undefined, + }, + { + resourcePath: '/Users/Maisey/projects/squirrelChasingSimulator/src/pages/api/testApiRoute.ts', + expectedWrappingTargetKind: 'api-route', + }, + { + resourcePath: './src/pages/api/testApiRoute.ts', + expectedWrappingTargetKind: 'api-route', + }, + { + resourcePath: '/Users/Maisey/projects/squirrelChasingSimulator/src/pages/api/nested/testApiRoute.js', + expectedWrappingTargetKind: 'api-route', + }, + { + resourcePath: '/Users/Maisey/projects/squirrelChasingSimulator/src/app/page.js', + expectedWrappingTargetKind: 'page-server-component', + }, + { + resourcePath: '/Users/Maisey/projects/squirrelChasingSimulator/src/app/nested/page.js', + expectedWrappingTargetKind: 'page-server-component', + }, + { + resourcePath: '/Users/Maisey/projects/squirrelChasingSimulator/src/app/nested/page.ts', // ts is not a valid file ending for pages in the app dir + expectedWrappingTargetKind: undefined, + }, + { + resourcePath: '/Users/Maisey/projects/squirrelChasingSimulator/src/app/(group)/nested/page.tsx', + expectedWrappingTargetKind: 'page-server-component', + }, + { + resourcePath: '/Users/Maisey/projects/squirrelChasingSimulator/src/app/(group)/nested/loading.ts', + expectedWrappingTargetKind: undefined, + }, + { + resourcePath: '/Users/Maisey/projects/squirrelChasingSimulator/src/app/layout.js', + expectedWrappingTargetKind: undefined, + }, + ])( + 'should apply the right wrappingTargetKind with wrapping loader ($resourcePath)', + async ({ resourcePath, expectedWrappingTargetKind }) => { + const finalWebpackConfig = await materializeFinalWebpackConfig({ + exportedNextConfig, + incomingWebpackConfig: serverWebpackConfig, + incomingWebpackBuildContext: serverBuildContext, + }); + + const loaderApplications: ModuleRuleUseProperty[] = []; + finalWebpackConfig.module.rules.forEach(rule => { + loaderApplications.push(...applyRuleToResource(rule, resourcePath)); + }); + + if (expectedWrappingTargetKind) { + expect(loaderApplications).toContainEqual( + expect.objectContaining({ + loader: expect.stringMatching(/wrappingLoader\.js$/), + options: expect.objectContaining({ + wrappingTargetKind: expectedWrappingTargetKind, + }), + }), + ); + } else { + expect(loaderApplications).not.toContainEqual( + expect.objectContaining({ + loader: expect.stringMatching(/wrappingLoader\.js$/), + }), + ); + } + }, + ); }); describe('client loaders', () => { diff --git a/packages/node-integration-tests/package.json b/packages/node-integration-tests/package.json index 3d35a34ff957..341ba1fa84be 100644 --- a/packages/node-integration-tests/package.json +++ b/packages/node-integration-tests/package.json @@ -10,7 +10,7 @@ "clean": "rimraf -g **/node_modules", "prisma:init": "(cd suites/tracing/prisma-orm && ts-node ./setup.ts)", "lint": "run-s lint:prettier lint:eslint", - "lint:eslint": "eslint . --cache --cache-location '../../eslintcache/' --format stylish", + "lint:eslint": "eslint . --format stylish", "lint:prettier": "prettier --check \"{suites,utils}/**/*.ts\"", "fix": "run-s fix:eslint fix:prettier", "fix:eslint": "eslint . --format stylish --fix", diff --git a/packages/node-integration-tests/suites/public-api/LocalVariables/local-variables-caught.mjs b/packages/node-integration-tests/suites/public-api/LocalVariables/local-variables-caught.mjs new file mode 100644 index 000000000000..175ff0702d30 --- /dev/null +++ b/packages/node-integration-tests/suites/public-api/LocalVariables/local-variables-caught.mjs @@ -0,0 +1,36 @@ +/* eslint-disable no-unused-vars */ +import * as Sentry from '@sentry/node'; + +Sentry.init({ + dsn: 'https://public@dsn.ingest.sentry.io/1337', + includeLocalVariables: true, + integrations: [new Sentry.Integrations.LocalVariables({ captureAllExceptions: true })], + beforeSend: event => { + // eslint-disable-next-line no-console + console.log(JSON.stringify(event)); + }, +}); + +class Some { + two(name) { + throw new Error('Enough!'); + } +} + +function one(name) { + const arr = [1, '2', null]; + const obj = { + name, + num: 5, + }; + + const ty = new Some(); + + ty.two(name); +} + +try { + one('some name'); +} catch (e) { + Sentry.captureException(e); +} diff --git a/packages/node-integration-tests/suites/public-api/LocalVariables/test.ts b/packages/node-integration-tests/suites/public-api/LocalVariables/test.ts index 649f7cc9ba06..aae488d50475 100644 --- a/packages/node-integration-tests/suites/public-api/LocalVariables/test.ts +++ b/packages/node-integration-tests/suites/public-api/LocalVariables/test.ts @@ -1,7 +1,12 @@ import type { Event } from '@sentry/node'; +import { parseSemver } from '@sentry/utils'; import * as childProcess from 'child_process'; import * as path from 'path'; +const nodeMajor = parseSemver(process.version.slice(1)).major || 1; + +const testIf = (condition: boolean, t: jest.It) => (condition ? t : t.skip); + describe('LocalVariables integration', () => { test('Should not include local variables by default', done => { expect.assertions(2); @@ -52,6 +57,34 @@ describe('LocalVariables integration', () => { }); }); + testIf(nodeMajor > 10, test)('Should include local variables with ESM', done => { + expect.assertions(4); + + const testScriptPath = path.resolve(__dirname, 'local-variables-caught.mjs'); + + childProcess.exec(`node ${testScriptPath}`, { encoding: 'utf8' }, (_, stdout) => { + const event = JSON.parse(stdout) as Event; + + const frames = event.exception?.values?.[0].stacktrace?.frames || []; + const lastFrame = frames[frames.length - 1]; + + expect(lastFrame.function).toBe('Some.two'); + expect(lastFrame.vars).toEqual({ name: 'some name' }); + + const penultimateFrame = frames[frames.length - 2]; + + expect(penultimateFrame.function).toBe('one'); + expect(penultimateFrame.vars).toEqual({ + name: 'some name', + arr: [1, '2', null], + obj: { name: 'some name', num: 5 }, + ty: '', + }); + + done(); + }); + }); + test('Includes local variables for caught exceptions when enabled', done => { expect.assertions(4); diff --git a/packages/node/package.json b/packages/node/package.json index 67c019c37d8a..73084862b8a0 100644 --- a/packages/node/package.json +++ b/packages/node/package.json @@ -48,7 +48,7 @@ "fix:eslint": "eslint . --format stylish --fix", "fix:prettier": "prettier --write \"{src,test,scripts}/**/**.ts\"", "lint": "run-s lint:prettier lint:eslint", - "lint:eslint": "eslint . --cache --cache-location '../../eslintcache/' --format stylish", + "lint:eslint": "eslint . --format stylish", "lint:prettier": "prettier --check \"{src,test,scripts}/**/**.ts\"", "test": "run-s test:jest test:express test:webpack test:release-health", "test:express": "node test/manual/express-scope-separation/start.js", diff --git a/packages/node/src/integrations/http.ts b/packages/node/src/integrations/http.ts index 867c6ad9df24..d3d0711fb158 100644 --- a/packages/node/src/integrations/http.ts +++ b/packages/node/src/integrations/http.ts @@ -10,6 +10,7 @@ import { } from '@sentry/utils'; import type * as http from 'http'; import type * as https from 'https'; +import { LRUMap } from 'lru_map'; import type { NodeClient } from '../client'; import type { RequestMethod, RequestMethodArgs } from './utils/http'; @@ -138,7 +139,7 @@ function _createWrappedRequestMethodFactory( tracingOptions: TracingOptions | undefined, ): WrappedRequestMethodFactory { // We're caching results so we don't have to recompute regexp every time we create a request. - const createSpanUrlMap: Record = {}; + const createSpanUrlMap = new LRUMap(100); const headersUrlMap: Record = {}; const shouldCreateSpan = (url: string): boolean => { @@ -146,13 +147,14 @@ function _createWrappedRequestMethodFactory( return true; } - if (createSpanUrlMap[url]) { - return createSpanUrlMap[url]; + const cachedDecision = createSpanUrlMap.get(url); + if (cachedDecision !== undefined) { + return cachedDecision; } - createSpanUrlMap[url] = tracingOptions.shouldCreateSpanForRequest(url); - - return createSpanUrlMap[url]; + const decision = tracingOptions.shouldCreateSpanForRequest(url); + createSpanUrlMap.set(url, decision); + return decision; }; const shouldAttachTraceData = (url: string): boolean => { diff --git a/packages/node/src/integrations/localvariables.ts b/packages/node/src/integrations/localvariables.ts index ac23e67af910..2423cfa30c70 100644 --- a/packages/node/src/integrations/localvariables.ts +++ b/packages/node/src/integrations/localvariables.ts @@ -237,7 +237,8 @@ export class LocalVariables implements Integration { const framePromises = callFrames.map(async ({ scopeChain, functionName, this: obj }) => { const localScope = scopeChain.find(scope => scope.type === 'local'); - const fn = obj.className === 'global' ? functionName : `${obj.className}.${functionName}`; + // obj.className is undefined in ESM modules + const fn = obj.className === 'global' || !obj.className ? functionName : `${obj.className}.${functionName}`; if (localScope?.object.objectId === undefined) { return { function: fn }; diff --git a/packages/opentelemetry-node/package.json b/packages/opentelemetry-node/package.json index 439e7ad50035..ffa291ba7296 100644 --- a/packages/opentelemetry-node/package.json +++ b/packages/opentelemetry-node/package.json @@ -51,7 +51,7 @@ "fix:eslint": "eslint . --format stylish --fix", "fix:prettier": "prettier --write \"{src,test,scripts}/**/**.ts\"", "lint": "run-s lint:prettier lint:eslint", - "lint:eslint": "eslint . --cache --cache-location '../../eslintcache/' --format stylish", + "lint:eslint": "eslint . --format stylish", "lint:prettier": "prettier --check \"{src,test,scripts}/**/**.ts\"", "test": "yarn test:jest", "test:jest": "jest", diff --git a/packages/react/package.json b/packages/react/package.json index ddfd960b1d2a..aca0040a2be1 100644 --- a/packages/react/package.json +++ b/packages/react/package.json @@ -66,7 +66,7 @@ "fix:eslint": "eslint . --format stylish --fix", "fix:prettier": "prettier --write \"{src,test,scripts}/**/**.ts\"", "lint": "run-s lint:prettier lint:eslint", - "lint:eslint": "eslint . --cache --cache-location '../../eslintcache/' --format stylish", + "lint:eslint": "eslint . --format stylish", "lint:prettier": "prettier --check \"{src,test,scripts}/**/**.ts\"", "test": "jest", "test:watch": "jest --watch" diff --git a/packages/remix/package.json b/packages/remix/package.json index e699b5224c92..4f6a2a698bee 100644 --- a/packages/remix/package.json +++ b/packages/remix/package.json @@ -59,7 +59,7 @@ "fix:eslint": "eslint . --format stylish --fix", "fix:prettier": "prettier --write \"{src,test,scripts}/**/**.ts\"", "lint": "run-s lint:prettier lint:eslint", - "lint:eslint": "eslint . --cache --cache-location '../../eslintcache/' --format stylish", + "lint:eslint": "eslint . --format stylish", "lint:prettier": "prettier --check \"{src,test,scripts}/**/**.ts\"", "test": "yarn test:unit", "test:integration": "run-s test:integration:clean test:integration:prepare test:integration:client test:integration:server", diff --git a/packages/replay/README.md b/packages/replay/README.md index c65700a1389c..a5cc8c8e2ef4 100644 --- a/packages/replay/README.md +++ b/packages/replay/README.md @@ -101,33 +101,14 @@ replay.stop(); // Stop recording ## Loading Replay as a CDN Bundle -As an alternative to the NPM package, you can load the Replay integration bundle from our CDN. +As an alternative to the NPM package, you can use Replay as a CDN bundle. +Please refer to the [Session Replay installation guide](https://docs.sentry.io/platforms/javascript/session-replay/#install) for CDN bundle instructions. -```js -// Browser SDK bundle - - -// Add Sentry.Integrations.Replay to your Sentry.init call -Sentry.init({ - // This sets the sample rate to be 10%. You may want this to be 100% while - // in development and sample at a lower rate in production - replaysSessionSampleRate: 0.1, - - // If the entire session is not sampled, use the below sample rate to sample - // sessions when an error occurs. - replaysOnErrorSampleRate: 1.0, - - dsn: '__DSN__', - integrations: [new Sentry.Integrations.Replay()], -}); -``` - -The Replay initilialization [configuration](#configuration) options are identical to the options of the NPM package. - -Alternatively, you can also load the Replay integration separately from other bundles: +
+Deprecated Replay integration bundle +Installing the replay integration as a secondary integration bundle to the SDK bundle was deprecated in favour of +complete CDN bundles that already contain the replay integration. No need to keep two bundles in sync anymore. +The `replay.(min.)js` bundle will be removed in v8 of the JS SDKs. ```html ``` - -Please visit our [CDN bundle docs](https://docs.sentry.io/platforms/javascript/install/cdn/#available-bundles) to get the correct `integrity` checksums for your version. -Note that the two bundle versions always have to match. +
## Sessions diff --git a/packages/replay/package.json b/packages/replay/package.json index 435523ea15c8..153e0e78c4cd 100644 --- a/packages/replay/package.json +++ b/packages/replay/package.json @@ -27,7 +27,7 @@ "fix:eslint": "eslint . --format stylish --fix", "fix:prettier": "prettier --write \"{src,test,scripts,worker}/**/*.ts\"", "lint": "run-s lint:prettier lint:eslint", - "lint:eslint": "eslint . --cache --cache-location '../../eslintcache/' --format stylish", + "lint:eslint": "eslint . --format stylish", "lint:prettier": "prettier --check \"{src,test,scripts,worker}/**/*.ts\"", "test": "jest", "test:watch": "jest --watch", @@ -46,7 +46,7 @@ "homepage": "https://docs.sentry.io/platforms/javascript/session-replay/", "devDependencies": { "@babel/core": "^7.17.5", - "@sentry-internal/rrweb": "1.100.2", + "@sentry-internal/rrweb": "1.101.2", "@types/pako": "^2.0.0", "jsdom-worker": "^0.2.1", "pako": "^2.0.4", diff --git a/packages/replay/src/coreHandlers/handleGlobalEvent.ts b/packages/replay/src/coreHandlers/handleGlobalEvent.ts index 4bdb3e5c1a54..35ecba8c43e3 100644 --- a/packages/replay/src/coreHandlers/handleGlobalEvent.ts +++ b/packages/replay/src/coreHandlers/handleGlobalEvent.ts @@ -1,5 +1,5 @@ import { addBreadcrumb } from '@sentry/core'; -import type { Event } from '@sentry/types'; +import type { Event, EventHint } from '@sentry/types'; import { logger } from '@sentry/utils'; import { REPLAY_EVENT_NAME, UNABLE_TO_SEND_REPLAY } from '../constants'; @@ -9,8 +9,8 @@ import { isRrwebError } from '../util/isRrwebError'; /** * Returns a listener to be added to `addGlobalEventProcessor(listener)`. */ -export function handleGlobalEventListener(replay: ReplayContainer): (event: Event) => Event | null { - return (event: Event) => { +export function handleGlobalEventListener(replay: ReplayContainer): (event: Event, hint: EventHint) => Event | null { + return (event: Event, hint: EventHint) => { // Do not apply replayId to the root event if (event.type === REPLAY_EVENT_NAME) { // Replays have separate set of breadcrumbs, do not include breadcrumbs @@ -21,7 +21,7 @@ export function handleGlobalEventListener(replay: ReplayContainer): (event: Even // Unless `captureExceptions` is enabled, we want to ignore errors coming from rrweb // As there can be a bunch of stuff going wrong in internals there, that we don't want to bubble up to users - if (isRrwebError(event) && !replay.getOptions()._experiments.captureExceptions) { + if (isRrwebError(event, hint) && !replay.getOptions()._experiments.captureExceptions) { __DEBUG_BUILD__ && logger.log('[Replay] Ignoring error from rrweb internals', event); return null; } diff --git a/packages/replay/src/replay.ts b/packages/replay/src/replay.ts index bb66d0fa28fd..c162a26cd5da 100644 --- a/packages/replay/src/replay.ts +++ b/packages/replay/src/replay.ts @@ -1,6 +1,6 @@ /* eslint-disable max-lines */ // TODO: We might want to split this file up import { EventType, record } from '@sentry-internal/rrweb'; -import { captureException } from '@sentry/core'; +import { captureException, getCurrentHub } from '@sentry/core'; import type { Breadcrumb, ReplayRecordingMode } from '@sentry/types'; import { logger } from '@sentry/utils'; @@ -807,9 +807,16 @@ export class ReplayContainer implements ReplayContainerInterface { } catch (err) { this._handleException(err); - // This means we retried 3 times, and all of them failed + // This means we retried 3 times and all of them failed, + // or we ran into a problem we don't want to retry, like rate limiting. // In this case, we want to completely stop the replay - otherwise, we may get inconsistent segments this.stop(); + + const client = getCurrentHub().getClient(); + + if (client) { + client.recordDroppedEvent('send_error', 'replay'); + } } } diff --git a/packages/replay/src/util/addEvent.ts b/packages/replay/src/util/addEvent.ts index cb66d0c7822c..e243ce11b56b 100644 --- a/packages/replay/src/util/addEvent.ts +++ b/packages/replay/src/util/addEvent.ts @@ -1,3 +1,4 @@ +import { getCurrentHub } from '@sentry/core'; import { logger } from '@sentry/utils'; import { SESSION_IDLE_DURATION } from '../constants'; @@ -46,5 +47,11 @@ export async function addEvent( } catch (error) { __DEBUG_BUILD__ && logger.error(error); replay.stop(); + + const client = getCurrentHub().getClient(); + + if (client) { + client.recordDroppedEvent('internal_sdk_error', 'replay'); + } } } diff --git a/packages/replay/src/util/isRrwebError.ts b/packages/replay/src/util/isRrwebError.ts index 24f612185b87..a8d097e73af9 100644 --- a/packages/replay/src/util/isRrwebError.ts +++ b/packages/replay/src/util/isRrwebError.ts @@ -1,13 +1,18 @@ -import type { Event } from '@sentry/types'; +import type { Event, EventHint } from '@sentry/types'; /** * Returns true if we think the given event is an error originating inside of rrweb. */ -export function isRrwebError(event: Event): boolean { +export function isRrwebError(event: Event, hint: EventHint): boolean { if (event.type || !event.exception || !event.exception.values || !event.exception.values.length) { return false; } + // @ts-ignore this may be set by rrweb when it finds errors + if (hint.originalException && hint.originalException.__rrweb__) { + return true; + } + // Check if any exception originates from rrweb return event.exception.values.some(exception => { if (!exception.stacktrace || !exception.stacktrace.frames || !exception.stacktrace.frames.length) { diff --git a/packages/replay/test/integration/coreHandlers/handleGlobalEvent.test.ts b/packages/replay/test/integration/coreHandlers/handleGlobalEvent.test.ts index a59dfe838051..1bce8c11572a 100644 --- a/packages/replay/test/integration/coreHandlers/handleGlobalEvent.test.ts +++ b/packages/replay/test/integration/coreHandlers/handleGlobalEvent.test.ts @@ -40,26 +40,32 @@ describe('Integration | coreHandlers | handleGlobalEvent', () => { }; // @ts-ignore replay event type - expect(handleGlobalEventListener(replay)(replayEvent)).toEqual({ + expect(handleGlobalEventListener(replay)(replayEvent, {})).toEqual({ type: REPLAY_EVENT_NAME, }); }); it('does not delete breadcrumbs from error and transaction events', () => { expect( - handleGlobalEventListener(replay)({ - breadcrumbs: [{ type: 'fakecrumb' }], - }), + handleGlobalEventListener(replay)( + { + breadcrumbs: [{ type: 'fakecrumb' }], + }, + {}, + ), ).toEqual( expect.objectContaining({ breadcrumbs: [{ type: 'fakecrumb' }], }), ); expect( - handleGlobalEventListener(replay)({ - type: 'transaction', - breadcrumbs: [{ type: 'fakecrumb' }], - }), + handleGlobalEventListener(replay)( + { + type: 'transaction', + breadcrumbs: [{ type: 'fakecrumb' }], + }, + {}, + ), ).toEqual( expect.objectContaining({ breadcrumbs: [{ type: 'fakecrumb' }], @@ -76,7 +82,7 @@ describe('Integration | coreHandlers | handleGlobalEvent', () => { tags: expect.not.objectContaining({ replayId: expect.anything() }), }), ); - expect(handleGlobalEventListener(replay)(error)).toEqual( + expect(handleGlobalEventListener(replay)(error, {})).toEqual( expect.objectContaining({ tags: expect.objectContaining({ replayId: expect.any(String) }), }), @@ -102,9 +108,9 @@ describe('Integration | coreHandlers | handleGlobalEvent', () => { const client = getCurrentHub().getClient()!; - handleGlobalEventListener(replay)(error1); - handleGlobalEventListener(replay)(error2); - handleGlobalEventListener(replay)(error3); + handleGlobalEventListener(replay)(error1, {}); + handleGlobalEventListener(replay)(error2, {}); + handleGlobalEventListener(replay)(error3, {}); client.recordDroppedEvent('before_send', 'error', { event_id: 'err2' }); @@ -125,7 +131,7 @@ describe('Integration | coreHandlers | handleGlobalEvent', () => { tags: expect.objectContaining({ replayId: expect.any(String) }), }), ); - expect(handleGlobalEventListener(replay)(error)).toEqual( + expect(handleGlobalEventListener(replay)(error, {})).toEqual( expect.objectContaining({ tags: expect.objectContaining({ replayId: expect.any(String) }), }), @@ -166,7 +172,7 @@ describe('Integration | coreHandlers | handleGlobalEvent', () => { event_id: 'ff1616b1e13744c6964281349aecc82a', }; - expect(handleGlobalEventListener(replay)(errorEvent)).toEqual(errorEvent); + expect(handleGlobalEventListener(replay)(errorEvent, {})).toEqual(errorEvent); }); it('skips rrweb internal errors', () => { @@ -204,7 +210,87 @@ describe('Integration | coreHandlers | handleGlobalEvent', () => { event_id: 'ff1616b1e13744c6964281349aecc82a', }; - expect(handleGlobalEventListener(replay)(errorEvent)).toEqual(null); + expect(handleGlobalEventListener(replay)(errorEvent, {})).toEqual(null); + }); + + it('skips exception with __rrweb__ set', () => { + const errorEvent: Event = { + exception: { + values: [ + { + type: 'TypeError', + value: "Cannot read properties of undefined (reading 'contains')", + stacktrace: { + frames: [ + { + filename: 'scrambled.js', + function: 'MutationBuffer.processMutations', + in_app: true, + lineno: 101, + colno: 23, + }, + { + filename: '', + function: 'Array.forEach', + in_app: true, + }, + ], + }, + mechanism: { + type: 'generic', + handled: true, + }, + }, + ], + }, + level: 'error', + event_id: 'ff1616b1e13744c6964281349aecc82a', + }; + + const originalException = new window.Error('some exception'); + // @ts-ignore this could be set by rrweb + originalException.__rrweb__ = true; + + expect(handleGlobalEventListener(replay)(errorEvent, { originalException })).toEqual(null); + }); + + it('handles string exceptions', () => { + const errorEvent: Event = { + exception: { + values: [ + { + type: 'TypeError', + value: "Cannot read properties of undefined (reading 'contains')", + stacktrace: { + frames: [ + { + filename: 'scrambled.js', + function: 'MutationBuffer.processMutations', + in_app: true, + lineno: 101, + colno: 23, + }, + { + filename: '', + function: 'Array.forEach', + in_app: true, + }, + ], + }, + mechanism: { + type: 'generic', + handled: true, + }, + }, + ], + }, + level: 'error', + event_id: 'ff1616b1e13744c6964281349aecc82a', + }; + + const originalException = 'some string exception'; + + expect(handleGlobalEventListener(replay)(errorEvent, { originalException })).toEqual(errorEvent); }); it('does not skip rrweb internal errors with _experiments.captureExceptions', () => { @@ -244,7 +330,7 @@ describe('Integration | coreHandlers | handleGlobalEvent', () => { replay.getOptions()._experiments = { captureExceptions: true }; - expect(handleGlobalEventListener(replay)(errorEvent)).toEqual(errorEvent); + expect(handleGlobalEventListener(replay)(errorEvent, {})).toEqual(errorEvent); }); it('does not skip non-rrweb errors when no stacktrace exists', () => { @@ -268,7 +354,7 @@ describe('Integration | coreHandlers | handleGlobalEvent', () => { event_id: 'ff1616b1e13744c6964281349aecc82a', }; - expect(handleGlobalEventListener(replay)(errorEvent)).toEqual(errorEvent); + expect(handleGlobalEventListener(replay)(errorEvent, {})).toEqual(errorEvent); }); it('does not skip non-rrweb errors when no exception', () => { @@ -278,6 +364,6 @@ describe('Integration | coreHandlers | handleGlobalEvent', () => { event_id: 'ff1616b1e13744c6964281349aecc82a', }; - expect(handleGlobalEventListener(replay)(errorEvent)).toEqual(errorEvent); + expect(handleGlobalEventListener(replay)(errorEvent, {})).toEqual(errorEvent); }); }); diff --git a/packages/serverless/package.json b/packages/serverless/package.json index c86450a58a97..8fbd5e14c971 100644 --- a/packages/serverless/package.json +++ b/packages/serverless/package.json @@ -54,7 +54,7 @@ "fix:eslint": "eslint . --format stylish --fix", "fix:prettier": "prettier --write \"{src,test,scripts}/**/**.ts\"", "lint": "run-s lint:prettier lint:eslint", - "lint:eslint": "eslint . --cache --cache-location '../../eslintcache/' --format stylish", + "lint:eslint": "eslint . --format stylish", "lint:prettier": "prettier --check \"{src,test,scripts}/**/**.ts\"", "test": "jest", "test:watch": "jest --watch" @@ -62,5 +62,18 @@ "volta": { "extends": "../../package.json" }, - "sideEffects": false + "sideEffects": false, + "nx": { + "targets": { + "build:bundle": { + "dependsOn": [ + "build:transpile", + "build:types" + ], + "outputs": [ + "{projectRoot}/build/aws" + ] + } + } + } } diff --git a/packages/svelte/package.json b/packages/svelte/package.json index 01b23a0ac765..eb2225a4c58e 100644 --- a/packages/svelte/package.json +++ b/packages/svelte/package.json @@ -46,7 +46,7 @@ "fix:eslint": "eslint . --format stylish --fix", "fix:prettier": "prettier --write \"{src,test,scripts}/**/**.ts\"", "lint": "run-s lint:prettier lint:eslint", - "lint:eslint": "eslint . --cache --cache-location '../../eslintcache/' --format stylish", + "lint:eslint": "eslint . --format stylish", "lint:prettier": "prettier --check \"{src,test,scripts}/**/**.ts\"", "test": "jest", "test:watch": "jest --watch" diff --git a/packages/tracing/package.json b/packages/tracing/package.json index 8f98d4c1094d..1b4480b9a3a0 100644 --- a/packages/tracing/package.json +++ b/packages/tracing/package.json @@ -43,7 +43,7 @@ "fix:eslint": "eslint . --format stylish --fix", "fix:prettier": "prettier --write \"{src,test,scripts}/**/**.ts\"", "lint": "run-s lint:prettier lint:eslint", - "lint:eslint": "eslint . --cache --cache-location '../../eslintcache/' --format stylish", + "lint:eslint": "eslint . --format stylish", "lint:prettier": "prettier --check \"{src,test,scripts}/**/**.ts\"", "test": "jest", "test:watch": "jest --watch" diff --git a/packages/tracing/rollup.bundle.config.js b/packages/tracing/rollup.bundle.config.js index b4ac04aa8e76..a0c5bc6cd421 100644 --- a/packages/tracing/rollup.bundle.config.js +++ b/packages/tracing/rollup.bundle.config.js @@ -14,7 +14,7 @@ const builds = []; builds.push(...makeBundleConfigVariants(baseBundleConfig)); }); -// Full bundle incl. replay only avaialable for es6 +// Full bundle incl. replay only available for es6 const replayBaseBundleConfig = makeBaseBundleConfig({ bundleType: 'standalone', entrypoints: ['src/index.bundle.replay.ts'], diff --git a/packages/types/package.json b/packages/types/package.json index 60acd8082353..81f6c7dffe9b 100644 --- a/packages/types/package.json +++ b/packages/types/package.json @@ -27,7 +27,7 @@ "build:tarball": "ts-node ../../scripts/prepack.ts && npm pack ./build", "clean": "rimraf build sentry-types-*.tgz", "lint": "run-s lint:prettier lint:eslint", - "lint:eslint": "eslint . --cache --cache-location '../../eslintcache/' --format stylish", + "lint:eslint": "eslint . --format stylish", "lint:prettier": "prettier --check \"{src,test,scripts}/**/**.ts\"", "fix": "run-s fix:eslint fix:prettier", "fix:eslint": "eslint . --format stylish --fix", diff --git a/packages/types/src/clientreport.ts b/packages/types/src/clientreport.ts index 7b4e181d1102..b6ab1766e68c 100644 --- a/packages/types/src/clientreport.ts +++ b/packages/types/src/clientreport.ts @@ -6,7 +6,9 @@ export type EventDropReason = | 'network_error' | 'queue_overflow' | 'ratelimit_backoff' - | 'sample_rate'; + | 'sample_rate' + | 'send_error' + | 'internal_sdk_error'; export type Outcome = { reason: EventDropReason; diff --git a/packages/types/src/stackframe.ts b/packages/types/src/stackframe.ts index 7b8fa40a8a23..7a8058a1792c 100644 --- a/packages/types/src/stackframe.ts +++ b/packages/types/src/stackframe.ts @@ -14,4 +14,5 @@ export interface StackFrame { instruction_addr?: string; addr_mode?: string; vars?: { [key: string]: any }; + debug_id?: string; } diff --git a/packages/utils/package.json b/packages/utils/package.json index 8dbae0d3f2d5..bd930145d6c2 100644 --- a/packages/utils/package.json +++ b/packages/utils/package.json @@ -41,7 +41,7 @@ "fix:eslint": "eslint . --format stylish --fix", "fix:prettier": "prettier --write \"{src,test,scripts}/**/**.ts\"", "lint": "run-s lint:prettier lint:eslint", - "lint:eslint": "eslint . --cache --cache-location '../../eslintcache/' --format stylish", + "lint:eslint": "eslint . --format stylish", "lint:prettier": "prettier --check \"{src,test,scripts}/**/**.ts\"", "test": "jest", "test:watch": "jest --watch", diff --git a/packages/utils/src/envelope.ts b/packages/utils/src/envelope.ts index 2699b00918f4..b72f905fcbd4 100644 --- a/packages/utils/src/envelope.ts +++ b/packages/utils/src/envelope.ts @@ -115,7 +115,7 @@ function concatBuffers(buffers: Uint8Array[]): Uint8Array { return merged; } -interface TextDecoderInternal { +export interface TextDecoderInternal { decode(input?: Uint8Array): string; } diff --git a/packages/utils/src/stacktrace.ts b/packages/utils/src/stacktrace.ts index 3f9b5cf475b4..8af1c6f0d1b0 100644 --- a/packages/utils/src/stacktrace.ts +++ b/packages/utils/src/stacktrace.ts @@ -1,7 +1,14 @@ import type { StackFrame, StackLineParser, StackLineParserFn, StackParser } from '@sentry/types'; +import { GLOBAL_OBJ } from './worldwide'; + const STACKTRACE_LIMIT = 50; +type DebugIdFilename = string; +type DebugId = string; + +const debugIdParserCache = new Map>(); + /** * Creates a stack parser with the supplied line parsers * @@ -15,6 +22,28 @@ export function createStackParser(...parsers: StackLineParser[]): StackParser { return (stack: string, skipFirst: number = 0): StackFrame[] => { const frames: StackFrame[] = []; + for (const parser of sortedParsers) { + let debugIdCache = debugIdParserCache.get(parser); + if (!debugIdCache) { + debugIdCache = new Map(); + debugIdParserCache.set(parser, debugIdCache); + } + + const debugIdMap = GLOBAL_OBJ._sentryDebugIds; + + if (debugIdMap) { + Object.keys(debugIdMap).forEach(debugIdStackTrace => { + debugIdStackTrace.split('\n').forEach(line => { + const frame = parser(line); + if (frame && frame.filename) { + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + debugIdCache!.set(frame.filename, debugIdMap[debugIdStackTrace]); + } + }); + }); + } + } + for (const line of stack.split('\n').slice(skipFirst)) { // Ignore lines over 1kb as they are unlikely to be stack frames. // Many of the regular expressions use backtracking which results in run time that increases exponentially with @@ -32,6 +61,14 @@ export function createStackParser(...parsers: StackLineParser[]): StackParser { const frame = parser(cleanedLine); if (frame) { + const debugIdCache = debugIdParserCache.get(parser); + if (debugIdCache && frame.filename) { + const cachedDebugId = debugIdCache.get(frame.filename); + if (cachedDebugId) { + frame.debug_id = cachedDebugId; + } + } + frames.push(frame); break; } diff --git a/packages/utils/src/worldwide.ts b/packages/utils/src/worldwide.ts index 4cc141cc3d65..028eba2ac774 100644 --- a/packages/utils/src/worldwide.ts +++ b/packages/utils/src/worldwide.ts @@ -29,6 +29,7 @@ export interface InternalGlobal { id?: string; }; SENTRY_SDK_SOURCE?: SdkSource; + _sentryDebugIds?: Record; __SENTRY__: { globalEventProcessors: any; hub: any; diff --git a/packages/utils/test/stacktrace.test.ts b/packages/utils/test/stacktrace.test.ts index 61b44de34366..a2438c687bc4 100644 --- a/packages/utils/test/stacktrace.test.ts +++ b/packages/utils/test/stacktrace.test.ts @@ -1,4 +1,5 @@ -import { stripSentryFramesAndReverse } from '../src/stacktrace'; +import { createStackParser, stripSentryFramesAndReverse } from '../src/stacktrace'; +import { GLOBAL_OBJ } from '../src/worldwide'; describe('Stacktrace', () => { describe('stripSentryFramesAndReverse()', () => { @@ -68,3 +69,41 @@ describe('Stacktrace', () => { }); }); }); + +describe('Stack parsers created with createStackParser', () => { + afterEach(() => { + GLOBAL_OBJ._sentryDebugIds = undefined; + }); + + it('put debug ids onto individual frames', () => { + GLOBAL_OBJ._sentryDebugIds = { + 'filename1.js\nfilename1.js': 'aaaaaaaa-aaaa-4aaa-aaaa-aaaaaaaaaa', + 'filename2.js\nfilename2.js': 'bbbbbbbb-bbbb-4bbb-bbbb-bbbbbbbbbb', + }; + + const fakeErrorStack = 'filename1.js\nfilename2.js\nfilename1.js\nfilename3.js'; + const stackParser = createStackParser([0, line => ({ filename: line })]); + + const result = stackParser(fakeErrorStack); + + expect(result[0]).toStrictEqual({ filename: 'filename3.js', function: '?' }); + + expect(result[1]).toStrictEqual({ + filename: 'filename1.js', + function: '?', + debug_id: 'aaaaaaaa-aaaa-4aaa-aaaa-aaaaaaaaaa', + }); + + expect(result[2]).toStrictEqual({ + filename: 'filename2.js', + function: '?', + debug_id: 'bbbbbbbb-bbbb-4bbb-bbbb-bbbbbbbbbb', + }); + + expect(result[3]).toStrictEqual({ + filename: 'filename1.js', + function: '?', + debug_id: 'aaaaaaaa-aaaa-4aaa-aaaa-aaaaaaaaaa', + }); + }); +}); diff --git a/packages/vue/package.json b/packages/vue/package.json index 38c4f518892d..bf1d313d1a72 100644 --- a/packages/vue/package.json +++ b/packages/vue/package.json @@ -46,7 +46,7 @@ "fix:eslint": "eslint . --format stylish --fix", "fix:prettier": "prettier --write \"{src,test,scripts}/**/**.ts\"", "lint": "run-s lint:prettier lint:eslint", - "lint:eslint": "eslint . --cache --cache-location '../../eslintcache/' --format stylish", + "lint:eslint": "eslint . --format stylish", "lint:prettier": "prettier --check \"{src,test,scripts}/**/**.ts\"", "test": "jest", "test:watch": "jest --watch" diff --git a/packages/wasm/package.json b/packages/wasm/package.json index 874b9a4eac54..4bfa98b05cf9 100644 --- a/packages/wasm/package.json +++ b/packages/wasm/package.json @@ -23,11 +23,10 @@ }, "devDependencies": { "@types/jest-environment-puppeteer": "^4.4.0", - "@types/puppeteer": "^5.4.0", "cross-env": "^7.0.3", "express": "^4.17.1", "jest-puppeteer": "^4.4.0", - "puppeteer": "^5.5.0" + "puppeteer": "18.2.1" }, "scripts": { "build": "run-p build:transpile build:bundle build:types", @@ -47,7 +46,7 @@ "fix:eslint": "eslint . --format stylish --fix", "fix:prettier": "prettier --write \"{src,test,scripts}/**/**.ts\"", "lint": "run-s lint:prettier lint:eslint", - "lint:eslint": "eslint . --cache --cache-location '../../eslintcache/' --format stylish", + "lint:eslint": "eslint . --format stylish", "lint:prettier": "prettier --check \"{src,test,scripts}/**/**.ts\"", "test": "node test/scripts/ensure-bundles.js && cross-env PORT=1337 jest", "test:watch": "jest --watch" diff --git a/rollup/bundleHelpers.js b/rollup/bundleHelpers.js index 43a5f26563d9..ffc9b1c796d0 100644 --- a/rollup/bundleHelpers.js +++ b/rollup/bundleHelpers.js @@ -16,7 +16,7 @@ import { makeSucrasePlugin, makeTerserPlugin, makeTSPlugin, - makeExcludeReplayPlugin, + makeExcludeBlockPlugin, makeSetSDKSourcePlugin, } from './plugins/index.js'; import { mergePlugins } from './utils'; @@ -24,8 +24,16 @@ import { mergePlugins } from './utils'; const BUNDLE_VARIANTS = ['.js', '.min.js', '.debug.min.js']; export function makeBaseBundleConfig(options) { - const { bundleType, entrypoints, jsVersion, licenseTitle, outputFileBase, packageSpecificConfig, includeReplay } = - options; + const { + bundleType, + entrypoints, + jsVersion, + licenseTitle, + outputFileBase, + packageSpecificConfig, + includeReplay, + includeOffline, + } = options; const nodeResolvePlugin = makeNodeResolvePlugin(); const sucrasePlugin = makeSucrasePlugin(); @@ -33,7 +41,8 @@ export function makeBaseBundleConfig(options) { const markAsBrowserBuildPlugin = makeBrowserBuildPlugin(true); const licensePlugin = makeLicensePlugin(licenseTitle); const tsPlugin = makeTSPlugin(jsVersion.toLowerCase()); - const excludeReplayPlugin = makeExcludeReplayPlugin(); + const excludeReplayPlugin = makeExcludeBlockPlugin('REPLAY'); + const excludeOfflineTransport = makeExcludeBlockPlugin('OFFLINE'); // The `commonjs` plugin is the `esModuleInterop` of the bundling world. When used with `transformMixedEsModules`, it // will include all dependencies, imported or required, in the final bundle. (Without it, CJS modules aren't included @@ -54,6 +63,10 @@ export function makeBaseBundleConfig(options) { standAloneBundleConfig.plugins.push(excludeReplayPlugin); } + if (!includeOffline) { + standAloneBundleConfig.plugins.push(excludeOfflineTransport); + } + // used by `@sentry/integrations` and `@sentry/wasm` (bundles which need to be combined with a stand-alone SDK bundle) const addOnBundleConfig = { // These output settings are designed to mimic an IIFE. We don't use Rollup's `iife` format because we don't want to diff --git a/rollup/plugins/bundlePlugins.js b/rollup/plugins/bundlePlugins.js index 7e48452e3d33..be91a495fc1e 100644 --- a/rollup/plugins/bundlePlugins.js +++ b/rollup/plugins/bundlePlugins.js @@ -187,8 +187,12 @@ export function makeTSPlugin(jsVersion) { * from the browser and browser+tracing bundles. * If we need to add more such guards in the future, we might want to refactor this into a more generic plugin. */ -export function makeExcludeReplayPlugin() { - const replacementRegex = /\/\/ __ROLLUP_EXCLUDE_FROM_BUNDLES_BEGIN__(.|\n)*__ROLLUP_EXCLUDE_FROM_BUNDLES_END__/m; +export function makeExcludeBlockPlugin(type) { + const replacementRegex = new RegExp( + `\\/\\/ __ROLLUP_EXCLUDE_${type}_FROM_BUNDLES_BEGIN__(.|\n)*__ROLLUP_EXCLUDE_${type}_FROM_BUNDLES_END__`, + 'm', + ); + const browserIndexFilePath = path.resolve(__dirname, '../../packages/browser/src/index.ts'); const plugin = { diff --git a/yarn.lock b/yarn.lock index b49a1981ca0e..b7d694549c51 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2274,172 +2274,21 @@ merge-source-map "^1.1.0" schema-utils "^2.7.0" -"@lerna/add@6.1.0": - version "6.1.0" - resolved "https://registry.yarnpkg.com/@lerna/add/-/add-6.1.0.tgz#0f09495c5e1af4c4f316344af34b6d1a91b15b19" - integrity sha512-f2cAeS1mE/p7QvSRn5TCgdUXw6QVbu8PeRxaTOxTThhTdJIWdXZfY00QjAsU6jw1PdYXK1qGUSwWOPkdR16mBg== - dependencies: - "@lerna/bootstrap" "6.1.0" - "@lerna/command" "6.1.0" - "@lerna/filter-options" "6.1.0" - "@lerna/npm-conf" "6.1.0" - "@lerna/validation-error" "6.1.0" - dedent "^0.7.0" - npm-package-arg "8.1.1" - p-map "^4.0.0" - pacote "^13.6.1" - semver "^7.3.4" - -"@lerna/bootstrap@6.1.0": - version "6.1.0" - resolved "https://registry.yarnpkg.com/@lerna/bootstrap/-/bootstrap-6.1.0.tgz#81738f32cd431814c9943dfffe28752587d90830" - integrity sha512-aDxKqgxexVj/Z0B1aPu7P1iPbPqhk1FPkl/iayCmPlkAh90pYEH0uVytGzi1hFB5iXEfG7Pa6azGQywUodx/1g== - dependencies: - "@lerna/command" "6.1.0" - "@lerna/filter-options" "6.1.0" - "@lerna/has-npm-version" "6.1.0" - "@lerna/npm-install" "6.1.0" - "@lerna/package-graph" "6.1.0" - "@lerna/pulse-till-done" "6.1.0" - "@lerna/rimraf-dir" "6.1.0" - "@lerna/run-lifecycle" "6.1.0" - "@lerna/run-topologically" "6.1.0" - "@lerna/symlink-binary" "6.1.0" - "@lerna/symlink-dependencies" "6.1.0" - "@lerna/validation-error" "6.1.0" - "@npmcli/arborist" "5.3.0" - dedent "^0.7.0" - get-port "^5.1.1" - multimatch "^5.0.0" - npm-package-arg "8.1.1" - npmlog "^6.0.2" - p-map "^4.0.0" - p-map-series "^2.1.0" - p-waterfall "^2.1.1" - semver "^7.3.4" - -"@lerna/changed@6.1.0": - version "6.1.0" - resolved "https://registry.yarnpkg.com/@lerna/changed/-/changed-6.1.0.tgz#4fa480cbb0e7106ea9dad30d315e953975118d06" - integrity sha512-p7C2tf1scmvoUC1Osck/XIKVKXAQ8m8neL8/rfgKSYsvUVjsOB1LbF5HH1VUZntE6S4OxkRxUQGkAHVf5xrGqw== - dependencies: - "@lerna/collect-updates" "6.1.0" - "@lerna/command" "6.1.0" - "@lerna/listable" "6.1.0" - "@lerna/output" "6.1.0" - -"@lerna/check-working-tree@6.1.0": - version "6.1.0" - resolved "https://registry.yarnpkg.com/@lerna/check-working-tree/-/check-working-tree-6.1.0.tgz#b8970fd27a26449b12456d5d0ece60477aa54e15" - integrity sha512-hSciDmRqsNPevMhAD+SYbnhjatdb7UUu9W8vTyGtUXkrq2xtRZU0vAOgqovV8meirRkbC41pZePYKqyQtF0y3w== - dependencies: - "@lerna/collect-uncommitted" "6.1.0" - "@lerna/describe-ref" "6.1.0" - "@lerna/validation-error" "6.1.0" - -"@lerna/child-process@6.1.0": - version "6.1.0" - resolved "https://registry.yarnpkg.com/@lerna/child-process/-/child-process-6.1.0.tgz#6361f7945cd5b36e983f819de3cd91c315707302" - integrity sha512-jhr3sCFeps6Y15SCrWEPvqE64i+QLOTSh+OzxlziCBf7ZEUu7sF0yA4n5bAqw8j43yCKhhjkf/ZLYxZe+pnl3Q== +"@lerna/child-process@6.5.0-alpha.2": + version "6.5.0-alpha.2" + resolved "https://registry.npmjs.org/@lerna/child-process/-/child-process-6.5.0-alpha.2.tgz#5ef9cc6c8e521fbb9f18b3031ca3e789345e7b56" + integrity sha512-lzRKVaI5J5p7CihAVSHaEN7uAMZScNNRwy2hoz6w+lM5vKiMmrc93yl3zjUo0BeyqB1i1b3ntUMMIX6UWGjvuA== dependencies: chalk "^4.1.0" execa "^5.0.0" strong-log-transformer "^2.1.0" -"@lerna/clean@6.1.0": - version "6.1.0" - resolved "https://registry.yarnpkg.com/@lerna/clean/-/clean-6.1.0.tgz#1114fd90ad82438123726e2493d3550e73abebbc" - integrity sha512-LRK2hiNUiBhPe5tmJiefOVpkaX2Yob0rp15IFNIbuteRWUJg0oERFQo62WvnxwElfzKSOhr8OGuEq/vN4bMrRA== - dependencies: - "@lerna/command" "6.1.0" - "@lerna/filter-options" "6.1.0" - "@lerna/prompt" "6.1.0" - "@lerna/pulse-till-done" "6.1.0" - "@lerna/rimraf-dir" "6.1.0" - p-map "^4.0.0" - p-map-series "^2.1.0" - p-waterfall "^2.1.1" - -"@lerna/cli@6.1.0": - version "6.1.0" - resolved "https://registry.yarnpkg.com/@lerna/cli/-/cli-6.1.0.tgz#41214331fa4c1ea5f41125befdd81b009fe12640" - integrity sha512-p4G/OSPIrHiNkEl8bXrQdFOh4ORAZp2+ljvbXmAxpdf2qmopaUdr+bZYtIAxd+Z42SxRnDNz9IEyR0kOsARRQQ== - dependencies: - "@lerna/global-options" "6.1.0" - dedent "^0.7.0" - npmlog "^6.0.2" - yargs "^16.2.0" - -"@lerna/collect-uncommitted@6.1.0": - version "6.1.0" - resolved "https://registry.yarnpkg.com/@lerna/collect-uncommitted/-/collect-uncommitted-6.1.0.tgz#b6ffd7adda24d73b70304210967d3518caa3529d" - integrity sha512-VvWvqDZG+OiF4PwV4Ro695r3+8ty4w+11Bnq8tbsbu5gq8qZiam8Fkc/TQLuNNqP0SPi4qmMPaIzWvSze3SmDg== - dependencies: - "@lerna/child-process" "6.1.0" - chalk "^4.1.0" - npmlog "^6.0.2" - -"@lerna/collect-updates@6.1.0": - version "6.1.0" - resolved "https://registry.yarnpkg.com/@lerna/collect-updates/-/collect-updates-6.1.0.tgz#75fcc0733b5a9ac318a6484b890aa4061b7859c2" - integrity sha512-dgH7kgstwCXFctylQ4cxuCmhwSIE6VJZfHdh2bOaLuncs6ATMErKWN/mVuFHuUWEqPDRyy5Ky40Cu9S40nUq5w== - dependencies: - "@lerna/child-process" "6.1.0" - "@lerna/describe-ref" "6.1.0" - minimatch "^3.0.4" - npmlog "^6.0.2" - slash "^3.0.0" - -"@lerna/command@6.1.0": - version "6.1.0" - resolved "https://registry.yarnpkg.com/@lerna/command/-/command-6.1.0.tgz#bcb12516f2c181822b3b5be46c18eadc9b61e885" - integrity sha512-OnMqBDaEBY0C8v9CXIWFbGGKgsiUtZrnKVvQRbupMSZDKMpVGWIUd3X98Is9j9MAmk1ynhBMWE9Fwai5ML/mcA== - dependencies: - "@lerna/child-process" "6.1.0" - "@lerna/package-graph" "6.1.0" - "@lerna/project" "6.1.0" - "@lerna/validation-error" "6.1.0" - "@lerna/write-log-file" "6.1.0" - clone-deep "^4.0.1" - dedent "^0.7.0" - execa "^5.0.0" - is-ci "^2.0.0" - npmlog "^6.0.2" - -"@lerna/conventional-commits@6.1.0": - version "6.1.0" - resolved "https://registry.yarnpkg.com/@lerna/conventional-commits/-/conventional-commits-6.1.0.tgz#1157bb66d84d48880dc5c5026d743cedf0f47094" - integrity sha512-Tipo3cVr8mNVca4btzrCIzct59ZJWERT8/ZCZ/TQWuI4huUJZs6LRofLtB0xsGJAVZ7Vz2WRXAeH4XYgeUxutQ== - dependencies: - "@lerna/validation-error" "6.1.0" - conventional-changelog-angular "^5.0.12" - conventional-changelog-core "^4.2.4" - conventional-recommended-bump "^6.1.0" - fs-extra "^9.1.0" - get-stream "^6.0.0" - npm-package-arg "8.1.1" - npmlog "^6.0.2" - pify "^5.0.0" - semver "^7.3.4" - -"@lerna/create-symlink@6.1.0": - version "6.1.0" - resolved "https://registry.yarnpkg.com/@lerna/create-symlink/-/create-symlink-6.1.0.tgz#d4260831f5d10abc0c70f0a8f39bea91db87e640" - integrity sha512-ulMa5OUJEwEWBHSgCUNGxrcsJllq1YMYWqhufvIigmMPJ0Zv3TV1Hha5i2MsqLJAakxtW0pNuwdutkUTtUdgxQ== - dependencies: - cmd-shim "^5.0.0" - fs-extra "^9.1.0" - npmlog "^6.0.2" - -"@lerna/create@6.1.0": - version "6.1.0" - resolved "https://registry.yarnpkg.com/@lerna/create/-/create-6.1.0.tgz#cde219da46a7c5062c558366b4ffce2134f13845" - integrity sha512-ZqlknXu0L29cV5mcfNgBLl+1RbKTWmNk8mj545zgXc7qQDgmrY+EVvrs8Cirey8C7bBpVkzP7Brzze0MSoB4rQ== +"@lerna/create@6.5.0-alpha.2": + version "6.5.0-alpha.2" + resolved "https://registry.npmjs.org/@lerna/create/-/create-6.5.0-alpha.2.tgz#8b4f681e049356a924056358ebd0b485519061d8" + integrity sha512-LSUv6/2yvU13odiZYpLsy3FQ39oyCinf+puFZ6waYMbVb0LBikbtNZ2YP4rAwyN91PRp5vTwtwqbls47NdHOvg== dependencies: - "@lerna/child-process" "6.1.0" - "@lerna/command" "6.1.0" - "@lerna/npm-conf" "6.1.0" - "@lerna/validation-error" "6.1.0" + "@lerna/child-process" "6.5.0-alpha.2" dedent "^0.7.0" fs-extra "^9.1.0" init-package-json "^3.0.2" @@ -2453,511 +2302,6 @@ validate-npm-package-name "^4.0.0" yargs-parser "20.2.4" -"@lerna/describe-ref@6.1.0": - version "6.1.0" - resolved "https://registry.yarnpkg.com/@lerna/describe-ref/-/describe-ref-6.1.0.tgz#60f0b8297b912aa5fe5e6ab8ef6c4127813681a7" - integrity sha512-0RQAYnxBaMz1SrEb/rhfR+8VeZx5tvCNYKRee5oXIDZdQ2c6/EPyrKCp3WcqiuOWY50SfGOVfxJEcxpK8Y3FNA== - dependencies: - "@lerna/child-process" "6.1.0" - npmlog "^6.0.2" - -"@lerna/diff@6.1.0": - version "6.1.0" - resolved "https://registry.yarnpkg.com/@lerna/diff/-/diff-6.1.0.tgz#bfa9bc35894d88a33fa0a3a5787082dea45d8cb2" - integrity sha512-GhP+jPDbcp9QcAMSAjFn4lzM8MKpLR1yt5jll+zUD831U1sL0I5t8HUosFroe5MoRNffEL/jHuI3SbC3jjqWjQ== - dependencies: - "@lerna/child-process" "6.1.0" - "@lerna/command" "6.1.0" - "@lerna/validation-error" "6.1.0" - npmlog "^6.0.2" - -"@lerna/exec@6.1.0": - version "6.1.0" - resolved "https://registry.yarnpkg.com/@lerna/exec/-/exec-6.1.0.tgz#a2d165576471ff61e33c49952d40a5dbc36fc78f" - integrity sha512-Ej6WlPHXLF6hZHsfD+J/dxeuTrnc0HIfIXR1DU//msHW5RNCdi9+I7StwreCAQH/dLEsdBjPg5chNmuj2JLQRg== - dependencies: - "@lerna/child-process" "6.1.0" - "@lerna/command" "6.1.0" - "@lerna/filter-options" "6.1.0" - "@lerna/profiler" "6.1.0" - "@lerna/run-topologically" "6.1.0" - "@lerna/validation-error" "6.1.0" - p-map "^4.0.0" - -"@lerna/filter-options@6.1.0": - version "6.1.0" - resolved "https://registry.yarnpkg.com/@lerna/filter-options/-/filter-options-6.1.0.tgz#f4ee65d0db0273ce490ce6c72c9dbb1d23268ca6" - integrity sha512-kPf92Z7uLsR6MUiXnyXWebaUWArLa15wLfpfTwIp5H3MNk1lTbuG7QnrxE7OxQj+ozFmBvXeV9fuwfLsYTfmOw== - dependencies: - "@lerna/collect-updates" "6.1.0" - "@lerna/filter-packages" "6.1.0" - dedent "^0.7.0" - npmlog "^6.0.2" - -"@lerna/filter-packages@6.1.0": - version "6.1.0" - resolved "https://registry.yarnpkg.com/@lerna/filter-packages/-/filter-packages-6.1.0.tgz#1ddac63a6ffdf5f058d206be5adfb39ad7aaf4f9" - integrity sha512-zW2avsZHs/ITE/37AEMhegGVHjiD0rgNk9bguNDfz6zaPa90UaW6PWDH6Tf4ThPRlbkl2Go48N3bFYHYSJKbcw== - dependencies: - "@lerna/validation-error" "6.1.0" - multimatch "^5.0.0" - npmlog "^6.0.2" - -"@lerna/get-npm-exec-opts@6.1.0": - version "6.1.0" - resolved "https://registry.yarnpkg.com/@lerna/get-npm-exec-opts/-/get-npm-exec-opts-6.1.0.tgz#22351e2ebc4adbef21ca4b86187278e15e4cb38a" - integrity sha512-10Pdf+W0z7RT34o0SWlf+WVzz2/WbnTIJ1tQqXvXx6soj2L/xGLhOPvhJiKNtl4WlvUiO/zQ91yb83ESP4TZaA== - dependencies: - npmlog "^6.0.2" - -"@lerna/get-packed@6.1.0": - version "6.1.0" - resolved "https://registry.yarnpkg.com/@lerna/get-packed/-/get-packed-6.1.0.tgz#b6d1c1dd1e068212e784b8dfc2e5fe64741ea8db" - integrity sha512-lg0wPpV0wPekcD0mebJp619hMxsOgbZDOH5AkL/bCR217391eha0iPhQ0dU/G0Smd2vv6Cg443+J5QdI4LGRTg== - dependencies: - fs-extra "^9.1.0" - ssri "^9.0.1" - tar "^6.1.0" - -"@lerna/github-client@6.1.0": - version "6.1.0" - resolved "https://registry.yarnpkg.com/@lerna/github-client/-/github-client-6.1.0.tgz#cd33743e4529a0b822ae6716cb4b981e1d8ffe8f" - integrity sha512-+/4PtDgsjt0VRRZtOCN2Piyu0asU/16gSZZy/opVb8dlT44lTrH/ZghrJLE4tSL8Nuv688kx0kSgbUG8BY54jQ== - dependencies: - "@lerna/child-process" "6.1.0" - "@octokit/plugin-enterprise-rest" "^6.0.1" - "@octokit/rest" "^19.0.3" - git-url-parse "^13.1.0" - npmlog "^6.0.2" - -"@lerna/gitlab-client@6.1.0": - version "6.1.0" - resolved "https://registry.yarnpkg.com/@lerna/gitlab-client/-/gitlab-client-6.1.0.tgz#bbcbf80d937e5980798ac1e0edd1f769101057d8" - integrity sha512-fUI/ppXzxJafN9ceSl+FDgsYvu3iTsO6UW0WTD63pS32CfM+PiCryLQHzuc4RkyVW8WQH3aCR/GbaKCqbu52bw== - dependencies: - node-fetch "^2.6.1" - npmlog "^6.0.2" - -"@lerna/global-options@6.1.0": - version "6.1.0" - resolved "https://registry.yarnpkg.com/@lerna/global-options/-/global-options-6.1.0.tgz#268e1de924369102e47babd9288086764ec6f9e6" - integrity sha512-1OyJ/N1XJh3ZAy8S20c6th9C4yBm/k3bRIdC+z0XxpDaHwfNt8mT9kUIDt6AIFCUvVKjSwnIsMHwhzXqBnwYSA== - -"@lerna/has-npm-version@6.1.0": - version "6.1.0" - resolved "https://registry.yarnpkg.com/@lerna/has-npm-version/-/has-npm-version-6.1.0.tgz#a5d960213d1a7ca5374eb3c551a17b322b9a9e62" - integrity sha512-up5PVuP6BmKQ5/UgH/t2c5B1q4HhjwW3/bqbNayX6V0qNz8OijnMYvEUbxFk8fOdeN41qVnhAk0Tb5kbdtYh2A== - dependencies: - "@lerna/child-process" "6.1.0" - semver "^7.3.4" - -"@lerna/import@6.1.0": - version "6.1.0" - resolved "https://registry.yarnpkg.com/@lerna/import/-/import-6.1.0.tgz#1c64281e3431c43c9cd140b66a6a51427afe7095" - integrity sha512-xsBhiKLUavATR32dAFL+WFY0yuab0hsM1eztKtRKk4wy7lSyxRfA5EIUcNCsLXx2xaDOKoMncCTXgNcpeYuqcQ== - dependencies: - "@lerna/child-process" "6.1.0" - "@lerna/command" "6.1.0" - "@lerna/prompt" "6.1.0" - "@lerna/pulse-till-done" "6.1.0" - "@lerna/validation-error" "6.1.0" - dedent "^0.7.0" - fs-extra "^9.1.0" - p-map-series "^2.1.0" - -"@lerna/info@6.1.0": - version "6.1.0" - resolved "https://registry.yarnpkg.com/@lerna/info/-/info-6.1.0.tgz#a5d66a9c1f18398dc020a6f6073c399013081587" - integrity sha512-CsrWdW/Wyb4kcvHSnrsm7KYWFvjUNItu+ryeyWBZJtWYQOv45jNmWix6j2L4/w1+mMlWMjsfLmBscg82UBrF5w== - dependencies: - "@lerna/command" "6.1.0" - "@lerna/output" "6.1.0" - envinfo "^7.7.4" - -"@lerna/init@6.1.0": - version "6.1.0" - resolved "https://registry.yarnpkg.com/@lerna/init/-/init-6.1.0.tgz#b178775693b9c38c0f3fe3300eeb574cf76e0297" - integrity sha512-z8oUeVjn+FQYAtepAw6G47cGodLyBAyNoEjO3IsJjQLWE1yH3r83L2sjyD/EckgR3o2VTEzrKo4ArhxLp2mNmg== - dependencies: - "@lerna/child-process" "6.1.0" - "@lerna/command" "6.1.0" - "@lerna/project" "6.1.0" - fs-extra "^9.1.0" - p-map "^4.0.0" - write-json-file "^4.3.0" - -"@lerna/link@6.1.0": - version "6.1.0" - resolved "https://registry.yarnpkg.com/@lerna/link/-/link-6.1.0.tgz#f6f0cfd0b02aecdeb304ce614e4e4e89fe0a3ad5" - integrity sha512-7OD2lYNQHl6Kl1KYmplt8KoWjVHdiaqpYqwD38AwcB09YN58nGmo4aJgC12Fdx8DSNjkumgM0ROg/JOjMCTIzQ== - dependencies: - "@lerna/command" "6.1.0" - "@lerna/package-graph" "6.1.0" - "@lerna/symlink-dependencies" "6.1.0" - "@lerna/validation-error" "6.1.0" - p-map "^4.0.0" - slash "^3.0.0" - -"@lerna/list@6.1.0": - version "6.1.0" - resolved "https://registry.yarnpkg.com/@lerna/list/-/list-6.1.0.tgz#a7625bceb5224c4bf1154e715c07ea29f9698bac" - integrity sha512-7/g2hjizkvVnBGpVm+qC7lUFGhZ/0GIMUbGQwnE6yXDGm8yP9aEcNVkU4JGrDWW+uIklf9oodnMHaLXd/FJe6Q== - dependencies: - "@lerna/command" "6.1.0" - "@lerna/filter-options" "6.1.0" - "@lerna/listable" "6.1.0" - "@lerna/output" "6.1.0" - -"@lerna/listable@6.1.0": - version "6.1.0" - resolved "https://registry.yarnpkg.com/@lerna/listable/-/listable-6.1.0.tgz#2510045fde7bc568b18172a5d24372a719bb5c4c" - integrity sha512-3KZ9lQ9AtNfGNH/mYJYaMKCiF2EQvLLBGYkWHeIzIs6foegcZNXe0Cyv3LNXuo5WslMNr5RT4wIgy3BOoAxdtg== - dependencies: - "@lerna/query-graph" "6.1.0" - chalk "^4.1.0" - columnify "^1.6.0" - -"@lerna/log-packed@6.1.0": - version "6.1.0" - resolved "https://registry.yarnpkg.com/@lerna/log-packed/-/log-packed-6.1.0.tgz#18ae946e8b7881f2fc5b973cc6682cc599b1759b" - integrity sha512-Sq2HZJAcPuoNeEHeIutcPYQCyWBxLyVGvEhgsP3xTe6XkBGQCG8piCp9wX+sc2zT+idPdpI6qLqdh85yYIMMhA== - dependencies: - byte-size "^7.0.0" - columnify "^1.6.0" - has-unicode "^2.0.1" - npmlog "^6.0.2" - -"@lerna/npm-conf@6.1.0": - version "6.1.0" - resolved "https://registry.yarnpkg.com/@lerna/npm-conf/-/npm-conf-6.1.0.tgz#79697260c9d14ffb9d892927f37fcde75b89ec58" - integrity sha512-+RD3mmJe9XSQj7Diibs0+UafAHPcrFCd29ODpDI+tzYl4MmYZblfrlL6mbSCiVYCZQneQ8Uku3P0r+DlbYBaFw== - dependencies: - config-chain "^1.1.12" - pify "^5.0.0" - -"@lerna/npm-dist-tag@6.1.0": - version "6.1.0" - resolved "https://registry.yarnpkg.com/@lerna/npm-dist-tag/-/npm-dist-tag-6.1.0.tgz#29f843aa628687a29dc3a9b905dd3002db7a3820" - integrity sha512-1zo+Yww/lvWJWZnEXpke9dZSb5poDzhUM/pQNqAQYSlbZ96o18SuCR6TEi5isMPiw63Aq1MMzbUqttQfJ11EOA== - dependencies: - "@lerna/otplease" "6.1.0" - npm-package-arg "8.1.1" - npm-registry-fetch "^13.3.0" - npmlog "^6.0.2" - -"@lerna/npm-install@6.1.0": - version "6.1.0" - resolved "https://registry.yarnpkg.com/@lerna/npm-install/-/npm-install-6.1.0.tgz#b75d1f152540a144bd6c81586a9f6010ed7f3046" - integrity sha512-1SHmOHZA1YJuUctLQBRjA2+yMp+UNYdOBsFb3xUVT7MjWnd1Zl0toT3jxGu96RNErD9JKkk/cGo/Aq+DU3s9pg== - dependencies: - "@lerna/child-process" "6.1.0" - "@lerna/get-npm-exec-opts" "6.1.0" - fs-extra "^9.1.0" - npm-package-arg "8.1.1" - npmlog "^6.0.2" - signal-exit "^3.0.3" - write-pkg "^4.0.0" - -"@lerna/npm-publish@6.1.0": - version "6.1.0" - resolved "https://registry.yarnpkg.com/@lerna/npm-publish/-/npm-publish-6.1.0.tgz#8fe561e639e6a06380354271aeca7cbc39acf7dd" - integrity sha512-N0LdR1ImZQw1r4cYaKtVbBhBPtj4Zu9NbvygzizEP5HuTfxZmE1Ans3w93Kks9VTXZXob8twNbXnzBwzTyEpEA== - dependencies: - "@lerna/otplease" "6.1.0" - "@lerna/run-lifecycle" "6.1.0" - fs-extra "^9.1.0" - libnpmpublish "^6.0.4" - npm-package-arg "8.1.1" - npmlog "^6.0.2" - pify "^5.0.0" - read-package-json "^5.0.1" - -"@lerna/npm-run-script@6.1.0": - version "6.1.0" - resolved "https://registry.yarnpkg.com/@lerna/npm-run-script/-/npm-run-script-6.1.0.tgz#bc5bd414ee9696168d88d8ce78f8e8b715967100" - integrity sha512-7p13mvdxdY5+VqWvvtMsMDeyCRs0PrrTmSHRO+FKuLQuGhBvUo05vevcMEOQNDvEvl/tXPrOVbeGCiGubYTCLg== - dependencies: - "@lerna/child-process" "6.1.0" - "@lerna/get-npm-exec-opts" "6.1.0" - npmlog "^6.0.2" - -"@lerna/otplease@6.1.0": - version "6.1.0" - resolved "https://registry.yarnpkg.com/@lerna/otplease/-/otplease-6.1.0.tgz#d25dbe2d867215b69f06de12ab4ff559d83d1d01" - integrity sha512-gqSE6IbaD4IeNJePkaDLaFLoGp0Ceu35sn7z0AHAOoHiQGGorOmvM+h1Md3xZZRSXQmY9LyJVhG5eRa38SoG4g== - dependencies: - "@lerna/prompt" "6.1.0" - -"@lerna/output@6.1.0": - version "6.1.0" - resolved "https://registry.yarnpkg.com/@lerna/output/-/output-6.1.0.tgz#d470146c6ee8ee063fd416081c1ca64fb132c4d8" - integrity sha512-mgCIzLKIuroytXuxjTB689ERtpfgyNXW0rMv9WHOa6ufQc+QJPjh3L4jVsOA0l+/OxZyi97PUXotduNj+0cbnA== - dependencies: - npmlog "^6.0.2" - -"@lerna/pack-directory@6.1.0": - version "6.1.0" - resolved "https://registry.yarnpkg.com/@lerna/pack-directory/-/pack-directory-6.1.0.tgz#3252ba7250d826b9922238c775abf5004e7580c4" - integrity sha512-Xsixqm2nkGXs9hvq08ClbGpRlCYnlBV4TwSrLttIDL712RlyXoPe2maJzTUqo9OXBbOumFSahUEInCMT2OS05g== - dependencies: - "@lerna/get-packed" "6.1.0" - "@lerna/package" "6.1.0" - "@lerna/run-lifecycle" "6.1.0" - "@lerna/temp-write" "6.1.0" - npm-packlist "^5.1.1" - npmlog "^6.0.2" - tar "^6.1.0" - -"@lerna/package-graph@6.1.0": - version "6.1.0" - resolved "https://registry.yarnpkg.com/@lerna/package-graph/-/package-graph-6.1.0.tgz#2373617605f48f53b5fa9d13188838b6c09022b0" - integrity sha512-yGyxd/eHTDjkpnBbDhTV0hwKF+i01qZc+6/ko65wOsh8xtgqpQeE6mtdgbvsLKcuMcIQ7PDy1ntyIv9phg14gQ== - dependencies: - "@lerna/prerelease-id-from-version" "6.1.0" - "@lerna/validation-error" "6.1.0" - npm-package-arg "8.1.1" - npmlog "^6.0.2" - semver "^7.3.4" - -"@lerna/package@6.1.0": - version "6.1.0" - resolved "https://registry.yarnpkg.com/@lerna/package/-/package-6.1.0.tgz#e9e33876c0509a86c1b676045b19fd3f7f1c77e2" - integrity sha512-PyNFtdH2IcLasp/nyMDshmeXotriOSlhbeFIxhdl1XuGj5v1so3utMSOrJMO5kzZJQg5zyx8qQoxL+WH/hkrVQ== - dependencies: - load-json-file "^6.2.0" - npm-package-arg "8.1.1" - write-pkg "^4.0.0" - -"@lerna/prerelease-id-from-version@6.1.0": - version "6.1.0" - resolved "https://registry.yarnpkg.com/@lerna/prerelease-id-from-version/-/prerelease-id-from-version-6.1.0.tgz#4ee5beeef4e81d77001e94ec5613c140b6615616" - integrity sha512-ngC4I6evvZztB6aOaSDEnhUgRTlqX3TyBXwWwLGTOXCPaCQBTPaLNokhmRdJ+ZVdZ4iHFbzEDSL07ubZrYUcmQ== - dependencies: - semver "^7.3.4" - -"@lerna/profiler@6.1.0": - version "6.1.0" - resolved "https://registry.yarnpkg.com/@lerna/profiler/-/profiler-6.1.0.tgz#aae2249f1a39c79db72a548ce50bf32f86a0f3a5" - integrity sha512-WFDQNpuqPqMJLg8llvrBHF8Ib5Asgp23lMeNUe89T62NUX6gkjVBTYdjsduxM0tZH6Pa0GAGaQcha97P6fxfdQ== - dependencies: - fs-extra "^9.1.0" - npmlog "^6.0.2" - upath "^2.0.1" - -"@lerna/project@6.1.0": - version "6.1.0" - resolved "https://registry.yarnpkg.com/@lerna/project/-/project-6.1.0.tgz#605afe28fb15d8b8b890fafe0ec1da2700964056" - integrity sha512-EOkfjjrTM16c3GUxGqcfYD2stV35p9mBEmkF41NPmyjfbzjol/irDF1r6Q7BsQSRsdClMJRCeZ168xdSxC2X0A== - dependencies: - "@lerna/package" "6.1.0" - "@lerna/validation-error" "6.1.0" - cosmiconfig "^7.0.0" - dedent "^0.7.0" - dot-prop "^6.0.1" - glob-parent "^5.1.1" - globby "^11.0.2" - js-yaml "^4.1.0" - load-json-file "^6.2.0" - npmlog "^6.0.2" - p-map "^4.0.0" - resolve-from "^5.0.0" - write-json-file "^4.3.0" - -"@lerna/prompt@6.1.0": - version "6.1.0" - resolved "https://registry.yarnpkg.com/@lerna/prompt/-/prompt-6.1.0.tgz#98e228220428d33620822f77e39f592ce29c776c" - integrity sha512-981J/C53TZ2l2mFVlWJN7zynSzf5GEHKvKQa12Td9iknhASZOuwTAWb6eq46246Ant6W5tWwb0NSPu3I5qtcrA== - dependencies: - inquirer "^8.2.4" - npmlog "^6.0.2" - -"@lerna/publish@6.1.0": - version "6.1.0" - resolved "https://registry.yarnpkg.com/@lerna/publish/-/publish-6.1.0.tgz#9d62c327bc3541a0430951d726b39a2fb17b7925" - integrity sha512-XtvuydtU0IptbAapLRgoN1AZj/WJR+e3UKnx9BQ1Dwc+Fpg2oqPxR/vi+6hxAsr95pdQ5CnWBdgS+dg2wEUJ7Q== - dependencies: - "@lerna/check-working-tree" "6.1.0" - "@lerna/child-process" "6.1.0" - "@lerna/collect-updates" "6.1.0" - "@lerna/command" "6.1.0" - "@lerna/describe-ref" "6.1.0" - "@lerna/log-packed" "6.1.0" - "@lerna/npm-conf" "6.1.0" - "@lerna/npm-dist-tag" "6.1.0" - "@lerna/npm-publish" "6.1.0" - "@lerna/otplease" "6.1.0" - "@lerna/output" "6.1.0" - "@lerna/pack-directory" "6.1.0" - "@lerna/prerelease-id-from-version" "6.1.0" - "@lerna/prompt" "6.1.0" - "@lerna/pulse-till-done" "6.1.0" - "@lerna/run-lifecycle" "6.1.0" - "@lerna/run-topologically" "6.1.0" - "@lerna/validation-error" "6.1.0" - "@lerna/version" "6.1.0" - fs-extra "^9.1.0" - libnpmaccess "^6.0.3" - npm-package-arg "8.1.1" - npm-registry-fetch "^13.3.0" - npmlog "^6.0.2" - p-map "^4.0.0" - p-pipe "^3.1.0" - pacote "^13.6.1" - semver "^7.3.4" - -"@lerna/pulse-till-done@6.1.0": - version "6.1.0" - resolved "https://registry.yarnpkg.com/@lerna/pulse-till-done/-/pulse-till-done-6.1.0.tgz#df0112a9a5b8547b53d18742ce21104eb360d731" - integrity sha512-a2RVT82E4R9nVXtehzp2TQL6iXp0QfEM3bu8tBAR/SfI1A9ggZWQhuuUqtRyhhVCajdQDOo7rS0UG7R5JzK58w== - dependencies: - npmlog "^6.0.2" - -"@lerna/query-graph@6.1.0": - version "6.1.0" - resolved "https://registry.yarnpkg.com/@lerna/query-graph/-/query-graph-6.1.0.tgz#e78c47c78d4691231fc379570e036bc2753cf6fa" - integrity sha512-YkyCc+6aR7GlCOcZXEKPcl5o5L2v+0YUNs59JrfAS0mctFosZ/2tP7pkdu2SI4qXIi5D0PMNsh/0fRni56znsQ== - dependencies: - "@lerna/package-graph" "6.1.0" - -"@lerna/resolve-symlink@6.1.0": - version "6.1.0" - resolved "https://registry.yarnpkg.com/@lerna/resolve-symlink/-/resolve-symlink-6.1.0.tgz#5a8686b99c838bc6e869930e5b5fd582607ebbe7" - integrity sha512-8ILO+h5fsE0q8MSLfdL+MT1GEsNhAB1fDyMkSsYgLRCsssN/cViZbffpclZyT/EfAhpyKfBCHZ0CmT1ZGofU1A== - dependencies: - fs-extra "^9.1.0" - npmlog "^6.0.2" - read-cmd-shim "^3.0.0" - -"@lerna/rimraf-dir@6.1.0": - version "6.1.0" - resolved "https://registry.yarnpkg.com/@lerna/rimraf-dir/-/rimraf-dir-6.1.0.tgz#75559585d5921563eff0e206bb9ec8ab0cc967c6" - integrity sha512-J9YeGHkCCeAIzsnKURYeGECBexiIii6HA+Bbd+rAgoKPsNCOj6ql4+qJE8Jbd7fQEFNDPQeBCYvM7JcdMc0WSA== - dependencies: - "@lerna/child-process" "6.1.0" - npmlog "^6.0.2" - path-exists "^4.0.0" - rimraf "^3.0.2" - -"@lerna/run-lifecycle@6.1.0": - version "6.1.0" - resolved "https://registry.yarnpkg.com/@lerna/run-lifecycle/-/run-lifecycle-6.1.0.tgz#e1fa6cd300842ef1d688af77648fed05ec2d5345" - integrity sha512-GbTdKxL+hWHEPgyBEKtqY9Nf+jFlt6YLtP5VjEVc5SdLkm+FeRquar9/YcZVUbzr3c+NJwWNgVjHuePfowdpUA== - dependencies: - "@lerna/npm-conf" "6.1.0" - "@npmcli/run-script" "^4.1.7" - npmlog "^6.0.2" - p-queue "^6.6.2" - -"@lerna/run-topologically@6.1.0": - version "6.1.0" - resolved "https://registry.yarnpkg.com/@lerna/run-topologically/-/run-topologically-6.1.0.tgz#8f1a428b5d4b800bced178edabfa2262b328572f" - integrity sha512-kpTaSBKdKjtf61be8Z1e7TIaMt/aksfxswQtpFxEuKDsPsdHfR8htSkADO4d/3SZFtmcAHIHNCQj9CaNj4O4Xw== - dependencies: - "@lerna/query-graph" "6.1.0" - p-queue "^6.6.2" - -"@lerna/run@6.1.0": - version "6.1.0" - resolved "https://registry.yarnpkg.com/@lerna/run/-/run-6.1.0.tgz#efaea1acc78cb7fc73b4906be70002e118628d64" - integrity sha512-vlEEKPcTloiob6EK7gxrjEdB6fQQ/LNfWhSJCGxJlvNVbrMpoWIu0Kpp20b0nE+lzX7rRJ4seWr7Wdo/Fjub4Q== - dependencies: - "@lerna/command" "6.1.0" - "@lerna/filter-options" "6.1.0" - "@lerna/npm-run-script" "6.1.0" - "@lerna/output" "6.1.0" - "@lerna/profiler" "6.1.0" - "@lerna/run-topologically" "6.1.0" - "@lerna/timer" "6.1.0" - "@lerna/validation-error" "6.1.0" - fs-extra "^9.1.0" - p-map "^4.0.0" - -"@lerna/symlink-binary@6.1.0": - version "6.1.0" - resolved "https://registry.yarnpkg.com/@lerna/symlink-binary/-/symlink-binary-6.1.0.tgz#7d476499b86ae5fcb853c510603cff9a27acf105" - integrity sha512-DaiRNZk/dvomNxgEaTW145PyL7vIGP7rvnfXV2FO+rjX8UUSNUOjmVmHlYfs64gV9Eqx/dLfQClIbKcwYMD83A== - dependencies: - "@lerna/create-symlink" "6.1.0" - "@lerna/package" "6.1.0" - fs-extra "^9.1.0" - p-map "^4.0.0" - -"@lerna/symlink-dependencies@6.1.0": - version "6.1.0" - resolved "https://registry.yarnpkg.com/@lerna/symlink-dependencies/-/symlink-dependencies-6.1.0.tgz#f44d33e043fed21a366c4ced2cbde8fa8be0c5fc" - integrity sha512-hrTvtY1Ek+fLA4JjXsKsvwPjuJD0rwB/+K4WY57t00owj//BpCsJ37w3kkkS7f/PcW/5uRjCuHcY67LOEwsRxw== - dependencies: - "@lerna/create-symlink" "6.1.0" - "@lerna/resolve-symlink" "6.1.0" - "@lerna/symlink-binary" "6.1.0" - fs-extra "^9.1.0" - p-map "^4.0.0" - p-map-series "^2.1.0" - -"@lerna/temp-write@6.1.0": - version "6.1.0" - resolved "https://registry.yarnpkg.com/@lerna/temp-write/-/temp-write-6.1.0.tgz#a5d532090dd7b2d4f8965fbb475376aae06b9242" - integrity sha512-ZcQl88H9HbQ/TeWUOVt+vDYwptm7kwprGvj9KkZXr9S5Bn6SiKRQOeydCCfCrQT+9Q3dm7QZXV6rWzLsACcAlQ== - dependencies: - graceful-fs "^4.1.15" - is-stream "^2.0.0" - make-dir "^3.0.0" - temp-dir "^1.0.0" - uuid "^8.3.2" - -"@lerna/timer@6.1.0": - version "6.1.0" - resolved "https://registry.yarnpkg.com/@lerna/timer/-/timer-6.1.0.tgz#245b02c05b2dec6d2aed2da8a0962cf0343d83d5" - integrity sha512-du+NQ9q7uO4d2nVU4AD2DSPuAZqUapA/bZKuVpFVxvY9Qhzb8dQKLsFISe4A9TjyoNAk8ZeWK0aBc/6N+Qer9A== - -"@lerna/validation-error@6.1.0": - version "6.1.0" - resolved "https://registry.yarnpkg.com/@lerna/validation-error/-/validation-error-6.1.0.tgz#03bd46f6219b6db7c4420528d5aaf047f92693e3" - integrity sha512-q0c3XCi5OpyTr8AcfbisS6e3svZaJF/riCvBDqRMaQUT4A8QOPzB4fVF3/+J2u54nidBuTlIk0JZu9aOdWTUkQ== - dependencies: - npmlog "^6.0.2" - -"@lerna/version@6.1.0": - version "6.1.0" - resolved "https://registry.yarnpkg.com/@lerna/version/-/version-6.1.0.tgz#44d8649e978df9d6a14d97c9d7631a7dcd4a9cbf" - integrity sha512-RUxVFdzHt0739lRNMrAbo6HWcFrcyG7atM1pn+Eo61fUoA5R/9N4bCk4m9xUGkJ/mOcROjuwAGe+wT1uOs58Bg== - dependencies: - "@lerna/check-working-tree" "6.1.0" - "@lerna/child-process" "6.1.0" - "@lerna/collect-updates" "6.1.0" - "@lerna/command" "6.1.0" - "@lerna/conventional-commits" "6.1.0" - "@lerna/github-client" "6.1.0" - "@lerna/gitlab-client" "6.1.0" - "@lerna/output" "6.1.0" - "@lerna/prerelease-id-from-version" "6.1.0" - "@lerna/prompt" "6.1.0" - "@lerna/run-lifecycle" "6.1.0" - "@lerna/run-topologically" "6.1.0" - "@lerna/temp-write" "6.1.0" - "@lerna/validation-error" "6.1.0" - "@nrwl/devkit" ">=14.8.6 < 16" - chalk "^4.1.0" - dedent "^0.7.0" - load-json-file "^6.2.0" - minimatch "^3.0.4" - npmlog "^6.0.2" - p-map "^4.0.0" - p-pipe "^3.1.0" - p-reduce "^2.1.0" - p-waterfall "^2.1.1" - semver "^7.3.4" - slash "^3.0.0" - write-json-file "^4.3.0" - -"@lerna/write-log-file@6.1.0": - version "6.1.0" - resolved "https://registry.yarnpkg.com/@lerna/write-log-file/-/write-log-file-6.1.0.tgz#b811cffd2ea2b3be6239a756c64dac9a3795707a" - integrity sha512-09omu2w4NCt8mJH/X9ZMuToQQ3xu/KpC7EU4yDl2Qy8nxKf8HiG8Oe+YYNprngmkdsq60F5eUZvoiFDZ5JeGIg== - dependencies: - npmlog "^6.0.2" - write-file-atomic "^4.0.1" - "@lint-todo/utils@^13.0.3": version "13.0.3" resolved "https://registry.yarnpkg.com/@lint-todo/utils/-/utils-13.0.3.tgz#ca222f38738b43eb43384d56e7292ba9cab3e891" @@ -3172,7 +2516,18 @@ dependencies: infer-owner "^1.0.4" -"@npmcli/run-script@^4.1.0", "@npmcli/run-script@^4.1.3", "@npmcli/run-script@^4.1.7": +"@npmcli/run-script@4.1.7": + version "4.1.7" + resolved "https://registry.npmjs.org/@npmcli/run-script/-/run-script-4.1.7.tgz#b1a2f57568eb738e45e9ea3123fb054b400a86f7" + integrity sha512-WXr/MyM4tpKA4BotB81NccGAv8B48lNH0gRoILucbcAhTQXLCoi6HflMV3KdXubIqvP9SuLsFn68Z7r4jl+ppw== + dependencies: + "@npmcli/node-gyp" "^2.0.0" + "@npmcli/promise-spawn" "^3.0.0" + node-gyp "^9.0.0" + read-package-json-fast "^2.0.3" + which "^2.0.2" + +"@npmcli/run-script@^4.1.0", "@npmcli/run-script@^4.1.3": version "4.2.1" resolved "https://registry.yarnpkg.com/@npmcli/run-script/-/run-script-4.2.1.tgz#c07c5c71bc1c70a5f2a06b0d4da976641609b946" integrity sha512-7dqywvVudPSrRCW5nTHpHgeWnbBtz8cFkOuKrecm6ih+oO9ciydhWt6OF7HlqupRRmB8Q/gECVdB9LMfToJbRg== @@ -3183,17 +2538,17 @@ read-package-json-fast "^2.0.3" which "^2.0.2" -"@nrwl/cli@15.2.1": - version "15.2.1" - resolved "https://registry.yarnpkg.com/@nrwl/cli/-/cli-15.2.1.tgz#9de75e20429315bf42516504601a785141fa6e8d" - integrity sha512-ufBJ5o3WCixdp6/TPkpn4rH3QBFJcqCMG1d14A/SvAkEnXu3vWlj3E+4GXf3CK+sGNjjf3ZGoNm7OFV+/Ml4GA== +"@nrwl/cli@15.6.3": + version "15.6.3" + resolved "https://registry.npmjs.org/@nrwl/cli/-/cli-15.6.3.tgz#999531d6efb30afc39373bdcbd7e78254a3a3fd3" + integrity sha512-K4E0spofThZXMnhA6R8hkUTdfqmwSnUE2+DlD5Y3jqsvKTAgwF5U41IFkEouFZCf+dWjy0RA20bWoX48EVFtmQ== dependencies: - nx "15.2.1" + nx "15.6.3" -"@nrwl/devkit@>=14.8.6 < 16": - version "15.2.1" - resolved "https://registry.yarnpkg.com/@nrwl/devkit/-/devkit-15.2.1.tgz#3907ee18d4bcb9ab36fc950c48c9cb0466ff8ab8" - integrity sha512-si6DK0sjtr6Ln+7hh9QD50KqxnOxuP20xJ0fxMVafT/Lz/qtxuCPw9lwJWVagMHWw3pQAtN6lbkWiLOwj8+YPA== +"@nrwl/devkit@>=15.5.2 < 16": + version "15.6.3" + resolved "https://registry.npmjs.org/@nrwl/devkit/-/devkit-15.6.3.tgz#e4e96c53ba3304786a49034286c8511534b2b194" + integrity sha512-/JDvdzNxUM+C1PCZPCrvmFx+OfywqZdOq1GS9QR8C0VctTLG4D/SGSFD88O1SAdcbH/f1mMiBGfEYZYd23fghQ== dependencies: "@phenomnomnominal/tsquery" "4.1.1" ejs "^3.1.7" @@ -3201,12 +2556,12 @@ semver "7.3.4" tslib "^2.3.0" -"@nrwl/tao@15.2.1": - version "15.2.1" - resolved "https://registry.yarnpkg.com/@nrwl/tao/-/tao-15.2.1.tgz#da6a6813eaedcb907b3917d06e4d5bbc4501dbaf" - integrity sha512-6ApglWKORasLhtjlJmqo2co/UexSSiD7mWVxT2886oKG2Y/T/5RnPFNhJgGnKJIURCNMxiSKhq7GAA+CE9zRZg== +"@nrwl/tao@15.6.3": + version "15.6.3" + resolved "https://registry.npmjs.org/@nrwl/tao/-/tao-15.6.3.tgz#b24e11345375dea96bc386c60b9b1102a7584932" + integrity sha512-bDZbPIbU5Mf2BvX0q8GjPxrm1WkYyfW+gp7mLuuJth2sEpZiCr47mSwuGko/y4CKXvIX46VQcAS0pKQMKugXsg== dependencies: - nx "15.2.1" + nx "15.6.3" "@octokit/auth-token@^3.0.0": version "3.0.2" @@ -3215,16 +2570,16 @@ dependencies: "@octokit/types" "^8.0.0" -"@octokit/core@^4.1.0": - version "4.1.0" - resolved "https://registry.yarnpkg.com/@octokit/core/-/core-4.1.0.tgz#b6b03a478f1716de92b3f4ec4fd64d05ba5a9251" - integrity sha512-Czz/59VefU+kKDy+ZfDwtOIYIkFjExOKf+HA92aiTZJ6EfWpFzYQWw0l54ji8bVmyhc+mGaLUbSUmXazG7z5OQ== +"@octokit/core@^4.0.0": + version "4.2.0" + resolved "https://registry.npmjs.org/@octokit/core/-/core-4.2.0.tgz#8c253ba9605aca605bc46187c34fcccae6a96648" + integrity sha512-AgvDRUg3COpR82P7PBdGZF/NNqGmtMq2NiPqeSsDIeCfYFOZ9gddqWNQHnFdEUf+YwOj4aZYmJnlPp7OXmDIDg== dependencies: "@octokit/auth-token" "^3.0.0" "@octokit/graphql" "^5.0.0" "@octokit/request" "^6.0.0" "@octokit/request-error" "^3.0.0" - "@octokit/types" "^8.0.0" + "@octokit/types" "^9.0.0" before-after-hook "^2.2.0" universal-user-agent "^6.0.0" @@ -3246,34 +2601,44 @@ "@octokit/types" "^8.0.0" universal-user-agent "^6.0.0" +"@octokit/openapi-types@^12.11.0": + version "12.11.0" + resolved "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-12.11.0.tgz#da5638d64f2b919bca89ce6602d059f1b52d3ef0" + integrity sha512-VsXyi8peyRq9PqIz/tpqiL2w3w80OgVMwBHltTml3LmVvXiphgeqmY9mvBw9Wu7e0QWk/fqD37ux8yP5uVekyQ== + "@octokit/openapi-types@^14.0.0": version "14.0.0" resolved "https://registry.yarnpkg.com/@octokit/openapi-types/-/openapi-types-14.0.0.tgz#949c5019028c93f189abbc2fb42f333290f7134a" integrity sha512-HNWisMYlR8VCnNurDU6os2ikx0s0VyEjDYHNS/h4cgb8DeOxQ0n72HyinUtdDVxJhFy3FWLGl0DJhfEWk3P5Iw== -"@octokit/plugin-enterprise-rest@^6.0.1": +"@octokit/openapi-types@^16.0.0": + version "16.0.0" + resolved "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-16.0.0.tgz#d92838a6cd9fb4639ca875ddb3437f1045cc625e" + integrity sha512-JbFWOqTJVLHZSUUoF4FzAZKYtqdxWu9Z5m2QQnOyEa04fOFljvyh7D3GYKbfuaSWisqehImiVIMG4eyJeP5VEA== + +"@octokit/plugin-enterprise-rest@6.0.1": version "6.0.1" - resolved "https://registry.yarnpkg.com/@octokit/plugin-enterprise-rest/-/plugin-enterprise-rest-6.0.1.tgz#e07896739618dab8da7d4077c658003775f95437" + resolved "https://registry.npmjs.org/@octokit/plugin-enterprise-rest/-/plugin-enterprise-rest-6.0.1.tgz#e07896739618dab8da7d4077c658003775f95437" integrity sha512-93uGjlhUD+iNg1iWhUENAtJata6w5nE+V4urXOAlIXdco6xNZtUSfYY8dzp3Udy74aqO/B5UZL80x/YMa5PKRw== -"@octokit/plugin-paginate-rest@^5.0.0": - version "5.0.1" - resolved "https://registry.yarnpkg.com/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-5.0.1.tgz#93d7e74f1f69d68ba554fa6b888c2a9cf1f99a83" - integrity sha512-7A+rEkS70pH36Z6JivSlR7Zqepz3KVucEFVDnSrgHXzG7WLAzYwcHZbKdfTXHwuTHbkT1vKvz7dHl1+HNf6Qyw== +"@octokit/plugin-paginate-rest@^3.0.0": + version "3.1.0" + resolved "https://registry.npmjs.org/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-3.1.0.tgz#86f8be759ce2d6d7c879a31490fd2f7410b731f0" + integrity sha512-+cfc40pMzWcLkoDcLb1KXqjX0jTGYXjKuQdFQDc6UAknISJHnZTiBqld6HDwRJvD4DsouDKrWXNbNV0lE/3AXA== dependencies: - "@octokit/types" "^8.0.0" + "@octokit/types" "^6.41.0" "@octokit/plugin-request-log@^1.0.4": version "1.0.4" resolved "https://registry.yarnpkg.com/@octokit/plugin-request-log/-/plugin-request-log-1.0.4.tgz#5e50ed7083a613816b1e4a28aeec5fb7f1462e85" integrity sha512-mLUsMkgP7K/cnFEw07kWqXGF5LKrOkD+lhCrKvPHXWDywAwuDUeDwWBpc69XK3pNX0uKiVt8g5z96PJ6z9xCFA== -"@octokit/plugin-rest-endpoint-methods@^6.7.0": - version "6.7.0" - resolved "https://registry.yarnpkg.com/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-6.7.0.tgz#2f6f17f25b6babbc8b41d2bb0a95a8839672ce7c" - integrity sha512-orxQ0fAHA7IpYhG2flD2AygztPlGYNAdlzYz8yrD8NDgelPfOYoRPROfEyIe035PlxvbYrgkfUZIhSBKju/Cvw== +"@octokit/plugin-rest-endpoint-methods@^6.0.0": + version "6.8.1" + resolved "https://registry.npmjs.org/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-6.8.1.tgz#97391fda88949eb15f68dc291957ccbe1d3e8ad1" + integrity sha512-QrlaTm8Lyc/TbU7BL/8bO49vp+RZ6W3McxxmmQTgYxf2sWkO8ZKuj4dLhPNJD6VCUW1hetCmeIM0m6FTVpDiEg== dependencies: - "@octokit/types" "^8.0.0" + "@octokit/types" "^8.1.1" deprecation "^2.3.1" "@octokit/request-error@^3.0.0": @@ -3297,15 +2662,22 @@ node-fetch "^2.6.7" universal-user-agent "^6.0.0" -"@octokit/rest@^19.0.3": - version "19.0.5" - resolved "https://registry.yarnpkg.com/@octokit/rest/-/rest-19.0.5.tgz#4dbde8ae69b27dca04b5f1d8119d282575818f6c" - integrity sha512-+4qdrUFq2lk7Va+Qff3ofREQWGBeoTKNqlJO+FGjFP35ZahP+nBenhZiGdu8USSgmq4Ky3IJ/i4u0xbLqHaeow== +"@octokit/rest@19.0.3": + version "19.0.3" + resolved "https://registry.npmjs.org/@octokit/rest/-/rest-19.0.3.tgz#b9a4e8dc8d53e030d611c053153ee6045f080f02" + integrity sha512-5arkTsnnRT7/sbI4fqgSJ35KiFaN7zQm0uQiQtivNQLI8RQx8EHwJCajcTUwmaCMNDg7tdCvqAnc7uvHHPxrtQ== dependencies: - "@octokit/core" "^4.1.0" - "@octokit/plugin-paginate-rest" "^5.0.0" + "@octokit/core" "^4.0.0" + "@octokit/plugin-paginate-rest" "^3.0.0" "@octokit/plugin-request-log" "^1.0.4" - "@octokit/plugin-rest-endpoint-methods" "^6.7.0" + "@octokit/plugin-rest-endpoint-methods" "^6.0.0" + +"@octokit/types@^6.41.0": + version "6.41.0" + resolved "https://registry.npmjs.org/@octokit/types/-/types-6.41.0.tgz#e58ef78d78596d2fb7df9c6259802464b5f84a04" + integrity sha512-eJ2jbzjdijiL3B4PrSQaSjuF2sPEQPVCPzBvTHJD9Nz+9dw2SGH4K4xeQJ77YfTq5bRQ+bD8wT11JbeDPmxmGg== + dependencies: + "@octokit/openapi-types" "^12.11.0" "@octokit/types@^8.0.0": version "8.0.0" @@ -3314,6 +2686,20 @@ dependencies: "@octokit/openapi-types" "^14.0.0" +"@octokit/types@^8.1.1": + version "8.2.1" + resolved "https://registry.npmjs.org/@octokit/types/-/types-8.2.1.tgz#a6de091ae68b5541f8d4fcf9a12e32836d4648aa" + integrity sha512-8oWMUji8be66q2B9PmEIUyQm00VPDPun07umUWSaCwxmeaquFBro4Hcc3ruVoDo3zkQyZBlRvhIMEYS3pBhanw== + dependencies: + "@octokit/openapi-types" "^14.0.0" + +"@octokit/types@^9.0.0": + version "9.0.0" + resolved "https://registry.npmjs.org/@octokit/types/-/types-9.0.0.tgz#6050db04ddf4188ec92d60e4da1a2ce0633ff635" + integrity sha512-LUewfj94xCMH2rbD5YJ+6AQ4AVjFYTgpp6rboWM5T7N3IsIF65SBEOVcYMGAEzO/kKNiNaW4LoWtoThOhH06gw== + dependencies: + "@octokit/openapi-types" "^16.0.0" + "@opentelemetry/api@0.14.0": version "0.14.0" resolved "https://registry.yarnpkg.com/@opentelemetry/api/-/api-0.14.0.tgz#4e17d8d2f1da72b19374efa7b6526aa001267cae" @@ -3753,17 +3139,17 @@ semver "7.3.2" semver-intersect "1.4.0" -"@sentry-internal/rrweb-snapshot@1.100.2": - version "1.100.2" - resolved "https://registry.yarnpkg.com/@sentry-internal/rrweb-snapshot/-/rrweb-snapshot-1.100.2.tgz#982b239d67872da5eb31d7d466815d4a05680450" - integrity sha512-6EvrPBPTlSD21lhDX20gxN3hnU4xj5hMLO5K4F0B1kPNVKXs1Mtf1nbpHYoIyU/67fZKmRuw/qlCjZykecXXBQ== +"@sentry-internal/rrweb-snapshot@1.101.2": + version "1.101.2" + resolved "https://registry.yarnpkg.com/@sentry-internal/rrweb-snapshot/-/rrweb-snapshot-1.101.2.tgz#cf73629374812f110ab7271f9da65f1afc6c08c3" + integrity sha512-wbc/lQ4ta7zXZGFU3sFfTz8PVcfOTeI2H2l2bo4BehZiQEEDTrqhGSFe5Nzq6Noi38CZyPT0kweGI4fUk1u0KQ== -"@sentry-internal/rrweb@1.100.2": - version "1.100.2" - resolved "https://registry.yarnpkg.com/@sentry-internal/rrweb/-/rrweb-1.100.2.tgz#3403161925d0e4778d58033ba93766b6d261736a" - integrity sha512-MtB2fpmc7XHCwS6JdjAEJsKO/0C/VmFxI1I4o+qIjWHOEpOF1nBYZ/RSE1BadEwgGjWlU8Hp0eWUBvSBDTF8sg== +"@sentry-internal/rrweb@1.101.2": + version "1.101.2" + resolved "https://registry.yarnpkg.com/@sentry-internal/rrweb/-/rrweb-1.101.2.tgz#65e5d80745e1c01c2f66031fb807b36837283944" + integrity sha512-IaDgoo9kxnwC6xn25yLU0ymKLVBAWGEH90iMdweTC7Izhza6k4oTy01t4/wy7ORCnfCeHZYJ4gkNJJyi4J1XHQ== dependencies: - "@sentry-internal/rrweb-snapshot" "1.100.2" + "@sentry-internal/rrweb-snapshot" "1.101.2" "@types/css-font-loading-module" "0.0.7" "@xstate/fsm" "^1.4.0" base64-arraybuffer "^1.0.1" @@ -4624,7 +4010,7 @@ resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.3.tgz#2ab0d5da2e5815f94b0b9d4b95d1e5f243ab2ca7" integrity sha512-KfRL3PuHmqQLOG+2tGpRO26Ctg+Cq1E01D2DMriKEATHgWLfeNDmq9e29Q9WIky0dQ3NPkd1mzYH8Lm936Z9qw== -"@types/puppeteer@*", "@types/puppeteer@^5.4.0": +"@types/puppeteer@*": version "5.4.3" resolved "https://registry.yarnpkg.com/@types/puppeteer/-/puppeteer-5.4.3.tgz#cdca84aa7751d77448d8a477dbfa0af1f11485f2" integrity sha512-3nE8YgR9DIsgttLW+eJf6mnXxq8Ge+27m5SU3knWmrlfl6+KOG0Bf9f7Ua7K+C4BnaTMAh3/UpySqdAYvrsvjg== @@ -4850,9 +4236,9 @@ "@types/yargs-parser" "*" "@types/yauzl@^2.9.1": - version "2.9.1" - resolved "https://registry.yarnpkg.com/@types/yauzl/-/yauzl-2.9.1.tgz#d10f69f9f522eef3cf98e30afb684a1e1ec923af" - integrity sha512-A1b8SU4D10uoPjwb0lnHmmu8wZhR9d+9o2PKBQT2jU5YPTKsxac6M2qGAdY7VcL+dHHhARVUDmeg0rOrcd9EjA== + version "2.10.0" + resolved "https://registry.yarnpkg.com/@types/yauzl/-/yauzl-2.10.0.tgz#b3248295276cf8c6f153ebe6a9aba0c988cb2599" + integrity sha512-Cn6WYCm0tXv8p6k+A8PvbDG763EDpBoTzHdA+Q/MF6H3sapGjCm9NzoaJncJS9tUKSuCoDs9XHxYYsQDgxR6kw== dependencies: "@types/node" "*" @@ -7084,6 +6470,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-arraybuffer-es6@^0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/base64-arraybuffer-es6/-/base64-arraybuffer-es6-0.7.0.tgz#dbe1e6c87b1bf1ca2875904461a7de40f21abc86" + integrity sha512-ESyU/U1CFZDJUdr+neHRhNozeCv72Y7Vm0m1DCbjX3KBjT6eYocvAJlSk6+8+HkVwXlT1FNxhGW6q3UKAlCvvw== + base64-arraybuffer@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/base64-arraybuffer/-/base64-arraybuffer-1.0.2.tgz#1c37589a7c4b0746e34bd1feb951da2df01c1bdc" @@ -8038,10 +7429,10 @@ builtins@^5.0.0: dependencies: semver "^7.0.0" -byte-size@^7.0.0: - version "7.0.1" - resolved "https://registry.yarnpkg.com/byte-size/-/byte-size-7.0.1.tgz#b1daf3386de7ab9d706b941a748dbfc71130dee3" - integrity sha512-crQdqyCwhokxwV1UyDzLZanhkugAgft7vt0qbbdt60C6Zf3CAiGmtUCylbtYwrU6loOUw3euGrNtW1J651ot1A== +byte-size@7.0.0: + version "7.0.0" + resolved "https://registry.npmjs.org/byte-size/-/byte-size-7.0.0.tgz#36528cd1ca87d39bd9abd51f5715dc93b6ceb032" + integrity sha512-NNiBxKgxybMBtWdmvx7ZITJi4ZG+CYUgwOSZTfqB1qogkRHrhbQE/R2r5Fh94X+InN5MCYz6SvB/ejHMj/HbsQ== bytes@1: version "1.0.0" @@ -8647,6 +8038,15 @@ cliui@^8.0.1: strip-ansi "^6.0.1" wrap-ansi "^7.0.0" +clone-deep@4.0.1: + version "4.0.1" + resolved "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz#c19fd9bdbbf85942b4fd979c84dcf7d5f07c2387" + integrity sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ== + dependencies: + is-plain-object "^2.0.4" + kind-of "^6.0.2" + shallow-clone "^3.0.0" + clone-deep@^0.2.4: version "0.2.4" resolved "https://registry.yarnpkg.com/clone-deep/-/clone-deep-0.2.4.tgz#4e73dd09e9fb971cc38670c5dced9c1896481cc6" @@ -8658,15 +8058,6 @@ clone-deep@^0.2.4: lazy-cache "^1.0.3" shallow-clone "^0.1.2" -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== - dependencies: - is-plain-object "^2.0.4" - kind-of "^6.0.2" - shallow-clone "^3.0.0" - clone-response@1.0.2, clone-response@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/clone-response/-/clone-response-1.0.2.tgz#d1dc973920314df67fbeb94223b4ee350239e96b" @@ -8684,7 +8075,7 @@ clone@^2.1.2: resolved "https://registry.yarnpkg.com/clone/-/clone-2.1.2.tgz#1b7f4b9f591f1e8f83670401600345a02887435f" integrity sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18= -cmd-shim@^5.0.0: +cmd-shim@5.0.0, cmd-shim@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/cmd-shim/-/cmd-shim-5.0.0.tgz#8d0aaa1a6b0708630694c4dbde070ed94c707724" integrity sha512-qkCtZ59BidfEwHltnJwkyVZn+XQojdAySM1D1gSeh11Z4pW1Kpolkyo53L5noc0nrxmIvyFwTmJRo4xs7FFLPw== @@ -8794,9 +8185,9 @@ colors@1.4.0, colors@^1.4.0: resolved "https://registry.yarnpkg.com/colors/-/colors-1.4.0.tgz#c50491479d4c1bdaed2c9ced32cf7c7dc2360f78" integrity sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA== -columnify@^1.6.0: +columnify@1.6.0: version "1.6.0" - resolved "https://registry.yarnpkg.com/columnify/-/columnify-1.6.0.tgz#6989531713c9008bb29735e61e37acf5bd553cf3" + resolved "https://registry.npmjs.org/columnify/-/columnify-1.6.0.tgz#6989531713c9008bb29735e61e37acf5bd553cf3" integrity sha512-lomjuFZKfM6MSAnV9aCZC9sc0qGbmZdfygNv+nCpqVkSKdCxCklLtd16O0EILGkImHw9ZpHkAnHaB+8Zxq5W6Q== dependencies: strip-ansi "^6.0.1" @@ -8951,10 +8342,10 @@ concat-stream@^2.0.0: readable-stream "^3.0.2" typedarray "^0.0.6" -config-chain@^1.1.12: - version "1.1.13" - resolved "https://registry.yarnpkg.com/config-chain/-/config-chain-1.1.13.tgz#fad0795aa6a6cdaff9ed1b68e9dff94372c232f4" - integrity sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ== +config-chain@1.1.12: + version "1.1.12" + resolved "https://registry.npmjs.org/config-chain/-/config-chain-1.1.12.tgz#0fde8d091200eb5e808caf25fe618c02f48e4efa" + integrity sha512-a1eOIcu8+7lUInge4Rpf/n4Krkf3Dd9lqhljRzII1/Zno/kRtUWnznPO3jOKBmTEktkt3fkxisUcivoj0ebzoA== dependencies: ini "^1.3.4" proto-list "~1.2.1" @@ -9041,17 +8432,17 @@ continuable-cache@^0.3.1: resolved "https://registry.yarnpkg.com/continuable-cache/-/continuable-cache-0.3.1.tgz#bd727a7faed77e71ff3985ac93351a912733ad0f" integrity sha1-vXJ6f67XfnH/OYWskzUakSczrQ8= -conventional-changelog-angular@^5.0.12: - version "5.0.13" - resolved "https://registry.yarnpkg.com/conventional-changelog-angular/-/conventional-changelog-angular-5.0.13.tgz#896885d63b914a70d4934b59d2fe7bde1832b28c" - integrity sha512-i/gipMxs7s8L/QeuavPF2hLnJgH6pEZAttySB6aiQLWcX3puWDL3ACVmvBhJGxnAy52Qc15ua26BufY6KpmrVA== +conventional-changelog-angular@5.0.12: + version "5.0.12" + resolved "https://registry.npmjs.org/conventional-changelog-angular/-/conventional-changelog-angular-5.0.12.tgz#c979b8b921cbfe26402eb3da5bbfda02d865a2b9" + integrity sha512-5GLsbnkR/7A89RyHLvvoExbiGbd9xKdKqDTrArnPbOqBqG/2wIosu0fHwpeIRI8Tl94MhVNBXcLJZl92ZQ5USw== dependencies: compare-func "^2.0.0" q "^1.5.1" -conventional-changelog-core@^4.2.4: +conventional-changelog-core@4.2.4: version "4.2.4" - resolved "https://registry.yarnpkg.com/conventional-changelog-core/-/conventional-changelog-core-4.2.4.tgz#e50d047e8ebacf63fac3dc67bf918177001e1e9f" + resolved "https://registry.npmjs.org/conventional-changelog-core/-/conventional-changelog-core-4.2.4.tgz#e50d047e8ebacf63fac3dc67bf918177001e1e9f" integrity sha512-gDVS+zVJHE2v4SLc6B0sLsPiloR0ygU7HaDW14aNJE1v4SlqJPILPl/aJC7YdtRE4CybBf8gDwObBvKha8Xlyg== dependencies: add-stream "^1.0.0" @@ -9109,9 +8500,9 @@ conventional-commits-parser@^3.2.0: split2 "^3.0.0" through2 "^4.0.0" -conventional-recommended-bump@^6.1.0: +conventional-recommended-bump@6.1.0: version "6.1.0" - resolved "https://registry.yarnpkg.com/conventional-recommended-bump/-/conventional-recommended-bump-6.1.0.tgz#cfa623285d1de554012f2ffde70d9c8a22231f55" + resolved "https://registry.npmjs.org/conventional-recommended-bump/-/conventional-recommended-bump-6.1.0.tgz#cfa623285d1de554012f2ffde70d9c8a22231f55" integrity sha512-uiApbSiNGM/kkdL9GTOLAqC4hbptObFo4wW2QRyHsKciGAfQuLU1ShZ1BIVI/+K2BE/W1AWYQMCXAsv4dyKPaw== dependencies: concat-stream "^2.0.0" @@ -9248,6 +8639,17 @@ cors@^2.8.5, cors@~2.8.5: object-assign "^4" vary "^1" +cosmiconfig@7.0.0: + version "7.0.0" + resolved "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.0.0.tgz#ef9b44d773959cae63ddecd122de23853b60f8d3" + integrity sha512-pondGvTuVYDk++upghXJabWzL6Kxu6f26ljFw64Swq9v6sQPUL3EUlVDV56diOjpCayKihL6hVe8exIACU4XcA== + dependencies: + "@types/parse-json" "^4.0.0" + import-fresh "^3.2.1" + parse-json "^5.0.0" + path-type "^4.0.0" + yaml "^1.10.0" + cosmiconfig@^5.0.0: version "5.2.1" resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-5.2.1.tgz#040f726809c591e77a17c0a3626ca45b4f168b1a" @@ -9258,17 +8660,6 @@ cosmiconfig@^5.0.0: js-yaml "^3.13.1" parse-json "^4.0.0" -cosmiconfig@^7.0.0: - version "7.1.0" - resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-7.1.0.tgz#1443b9afa596b670082ea46cbd8f6a62b84635f6" - integrity sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA== - dependencies: - "@types/parse-json" "^4.0.0" - import-fresh "^3.2.1" - parse-json "^5.0.0" - path-type "^4.0.0" - yaml "^1.10.0" - create-ecdh@^4.0.0: version "4.0.4" resolved "https://registry.yarnpkg.com/create-ecdh/-/create-ecdh-4.0.4.tgz#d6e7f4bffa66736085a0762fd3a632684dabcc4e" @@ -9328,6 +8719,13 @@ cross-env@^7.0.3: dependencies: cross-spawn "^7.0.1" +cross-fetch@3.1.5: + version "3.1.5" + resolved "https://registry.yarnpkg.com/cross-fetch/-/cross-fetch-3.1.5.tgz#e1389f44d9e7ba767907f7af8454787952ab534f" + integrity sha512-lvb1SBsI0Z7GDwmuid+mU3kWVBwTVUbe7S0H52yaaAdQOXq2YktTCZdlAcNKFzE6QtRz0snpw9bNiPeOIkkQvw== + dependencies: + node-fetch "2.6.7" + cross-spawn@^6.0.0, cross-spawn@^6.0.5: version "6.0.5" resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4" @@ -9764,7 +9162,7 @@ debug@3.2.6: dependencies: ms "^2.1.1" -debug@4, debug@^4.0.0, debug@^4.0.1, debug@^4.1.0, debug@^4.1.1, debug@^4.2.0, debug@^4.3.1, debug@^4.3.2, debug@^4.3.3, debug@^4.3.4, debug@~4.3.1, debug@~4.3.2: +debug@4, debug@4.3.4, debug@^4.0.0, debug@^4.0.1, debug@^4.1.0, debug@^4.1.1, debug@^4.2.0, debug@^4.3.1, debug@^4.3.2, debug@^4.3.3, debug@^4.3.4, debug@~4.3.1, debug@~4.3.2: version "4.3.4" resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== @@ -9827,7 +9225,7 @@ decompress-response@^3.3.0: dependencies: mimic-response "^1.0.0" -dedent@^0.7.0: +dedent@0.7.0, dedent@^0.7.0: version "0.7.0" resolved "https://registry.yarnpkg.com/dedent/-/dedent-0.7.0.tgz#2495ddbaf6eb874abb0e1be9df22d2e5a544326c" integrity sha1-JJXduvbrh0q7Dhvp3yLS5aVEMmw= @@ -10112,10 +9510,10 @@ detective-typescript@^7.0.0: node-source-walk "^4.2.0" typescript "^3.9.7" -devtools-protocol@0.0.818844: - version "0.0.818844" - resolved "https://registry.yarnpkg.com/devtools-protocol/-/devtools-protocol-0.0.818844.tgz#d1947278ec85b53e4c8ca598f607a28fa785ba9e" - integrity sha512-AD1hi7iVJ8OD0aMLQU5VK0XH9LDlA1+BcPIgrAxPfaibx2DbWucuyOhc4oyQCbnvDDO68nN6/LcKfqTP343Jjg== +devtools-protocol@0.0.1045489: + version "0.0.1045489" + resolved "https://registry.yarnpkg.com/devtools-protocol/-/devtools-protocol-0.0.1045489.tgz#f959ad560b05acd72d55644bc3fb8168a83abf28" + integrity sha512-D+PTmWulkuQW4D1NTiCRCFxF7pQPn0hgp4YyX4wAQ6xYXKOadSWPR3ENGDQ47MW/Ewc9v2rpC/UEEGahgBYpSQ== dezalgo@^1.0.0: version "1.0.3" @@ -10267,6 +9665,13 @@ domelementtype@^2.0.1, domelementtype@^2.2.0: resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-2.2.0.tgz#9a0b6c2782ed6a1c7323d42267183df9bd8b1d57" integrity sha512-DtBMo82pv1dFtUmHyr48beiuq792Sxohr+8Hm9zoxklYPfa6n0Z3Byjj2IV7bmr2IyqClnqEQhfgHJJ5QF0R5A== +domexception@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/domexception/-/domexception-1.0.1.tgz#937442644ca6a31261ef36e3ec677fe805582c90" + integrity sha512-raigMkn7CJNNo6Ihro1fzG7wr3fHuYVytzquZKX5n0yizGsTcYgzdIUwj1X9pK0VvjeihV+XiclP+DjwbsSKug== + dependencies: + webidl-conversions "^4.0.2" + domexception@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/domexception/-/domexception-2.0.1.tgz#fb44aefba793e1574b0af6aed2801d057529f304" @@ -10313,6 +9718,13 @@ dot-case@^3.0.4: no-case "^3.0.4" tslib "^2.0.3" +dot-prop@6.0.1: + version "6.0.1" + resolved "https://registry.npmjs.org/dot-prop/-/dot-prop-6.0.1.tgz#fc26b3cf142b9e59b74dbd39ed66ce620c681083" + integrity sha512-tE7ztYzXHIeyvc7N+hR3oi7FIbf/NIjVP9hmAt3yMXzrQ072/fpjGLx2GxNxGxUl5V73MEqYzioOMoVhGMJ5cA== + dependencies: + is-obj "^2.0.0" + dot-prop@^5.1.0, dot-prop@^5.2.0: version "5.3.0" resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-5.3.0.tgz#90ccce708cd9cd82cc4dc8c3ddd9abdd55b20e88" @@ -10320,13 +9732,6 @@ dot-prop@^5.1.0, dot-prop@^5.2.0: dependencies: is-obj "^2.0.0" -dot-prop@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-6.0.1.tgz#fc26b3cf142b9e59b74dbd39ed66ce620c681083" - integrity sha512-tE7ztYzXHIeyvc7N+hR3oi7FIbf/NIjVP9hmAt3yMXzrQ072/fpjGLx2GxNxGxUl5V73MEqYzioOMoVhGMJ5cA== - dependencies: - is-obj "^2.0.0" - dotenv@16.0.3: version "16.0.3" resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-16.0.3.tgz#115aec42bac5053db3c456db30cc243a5a836a07" @@ -11769,6 +11174,21 @@ exec-sh@^0.3.2, exec-sh@^0.3.4: 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@5.0.0: + version "5.0.0" + resolved "https://registry.npmjs.org/execa/-/execa-5.0.0.tgz#4029b0007998a841fbd1032e5f4de86a3c1e3376" + integrity sha512-ov6w/2LCiuyO4RLYGdpFGjkcs0wMTgGE8PrkTHikeUy5iJekXyPIKUjifk5CsE0pt7sMCrMZ3YNqoCj6idQOnQ== + dependencies: + cross-spawn "^7.0.3" + get-stream "^6.0.0" + human-signals "^2.1.0" + is-stream "^2.0.0" + merge-stream "^2.0.0" + npm-run-path "^4.0.1" + onetime "^5.1.2" + 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" @@ -11971,7 +11391,7 @@ extract-stack@^2.0.0: resolved "https://registry.yarnpkg.com/extract-stack/-/extract-stack-2.0.0.tgz#11367bc865bfcd9bc0db3123e5edb57786f11f9b" integrity sha512-AEo4zm+TenK7zQorGK1f9mJ8L14hnTDi2ZQPR+Mub1NX8zimka1mXpV5LpH8x9HoUmFSHZCfLHqWvp0Y4FxxzQ== -extract-zip@^2.0.0: +extract-zip@2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/extract-zip/-/extract-zip-2.0.1.tgz#663dca56fe46df890d5f131ef4a06d22bb8ba13a" integrity sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg== @@ -11992,6 +11412,13 @@ extsprintf@^1.2.0: resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.4.0.tgz#e2689f8f356fad62cca65a3a91c5df5f9551692f" integrity sha1-4mifjzVvrWLMplo6kcXfX5VRaS8= +fake-indexeddb@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/fake-indexeddb/-/fake-indexeddb-4.0.1.tgz#09bb2468e21d0832b2177e894765fb109edac8fb" + integrity sha512-hFRyPmvEZILYgdcLBxVdHLik4Tj3gDTu/g7s9ZDOiU3sTNiGx+vEu1ri/AMsFJUZ/1sdRbAVrEcKndh3sViBcA== + dependencies: + realistic-structured-clone "^3.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" @@ -12585,6 +12012,16 @@ fs-extra@4.0.2: jsonfile "^4.0.0" universalify "^0.1.0" +fs-extra@9.1.0, fs-extra@^9.0.0, fs-extra@^9.0.1, fs-extra@^9.1.0: + version "9.1.0" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-9.1.0.tgz#5954460c764a8da2094ba3554bf839e6b9a7c86d" + integrity sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ== + dependencies: + at-least-node "^1.0.0" + graceful-fs "^4.2.0" + jsonfile "^6.0.1" + universalify "^2.0.0" + fs-extra@^0.24.0: version "0.24.0" resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-0.24.0.tgz#d4e4342a96675cb7846633a6099249332b539952" @@ -12604,6 +12041,15 @@ fs-extra@^10.0.0, fs-extra@^10.1.0: jsonfile "^6.0.1" universalify "^2.0.0" +fs-extra@^11.1.0: + version "11.1.0" + resolved "https://registry.npmjs.org/fs-extra/-/fs-extra-11.1.0.tgz#5784b102104433bb0e090f48bfc4a30742c357ed" + integrity sha512-0rcTq621PD5jM/e0a3EJoGC/1TC5ZBCERW82LQuwfGnCa1V8w7dpYH1yNu+SLb6E5dkeCBzKEyLGlFrnr+dUyw== + dependencies: + graceful-fs "^4.2.0" + jsonfile "^6.0.1" + universalify "^2.0.0" + fs-extra@^4.0.2, fs-extra@^4.0.3: version "4.0.3" resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-4.0.3.tgz#0d852122e5bc5beb453fb028e9c0c9bf36340c94" @@ -12640,16 +12086,6 @@ fs-extra@^8.0.0, fs-extra@^8.0.1, fs-extra@^8.1.0: jsonfile "^4.0.0" universalify "^0.1.0" -fs-extra@^9.0.0, fs-extra@^9.0.1, fs-extra@^9.1.0: - version "9.1.0" - resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-9.1.0.tgz#5954460c764a8da2094ba3554bf839e6b9a7c86d" - integrity sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ== - dependencies: - at-least-node "^1.0.0" - graceful-fs "^4.2.0" - jsonfile "^6.0.1" - universalify "^2.0.0" - fs-merger@^3.2.1: version "3.2.1" resolved "https://registry.yarnpkg.com/fs-merger/-/fs-merger-3.2.1.tgz#a225b11ae530426138294b8fbb19e82e3d4e0b3b" @@ -12881,9 +12317,9 @@ get-pkg-repo@^4.0.0: through2 "^2.0.0" yargs "^16.2.0" -get-port@^5.1.1: +get-port@5.1.1, get-port@^5.1.1: version "5.1.1" - resolved "https://registry.yarnpkg.com/get-port/-/get-port-5.1.1.tgz#0469ed07563479de6efb986baf053dcd7d4e3193" + resolved "https://registry.npmjs.org/get-port/-/get-port-5.1.1.tgz#0469ed07563479de6efb986baf053dcd7d4e3193" integrity sha512-g/Q1aTSDOxFpchXC4i8ZWvxA1lnPqx/JHqcpIw0/LX9T8x/GBbi6YnlN5nhaKIFkT8oFsscUKgDJYxfwfS6QsQ== get-stdin@^4.0.1: @@ -12906,6 +12342,11 @@ get-stream@3.0.0, get-stream@^3.0.0: resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-3.0.0.tgz#8e943d1358dc37555054ecbe2edb05aa174ede14" integrity sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ= +get-stream@6.0.0, get-stream@^6.0.0: + version "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, get-stream@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-4.1.0.tgz#c1b255575f3dc21d59bfc79cd3d2b46b1c3a54b5" @@ -12920,11 +12361,6 @@ get-stream@^5.0.0, get-stream@^5.1.0: dependencies: pump "^3.0.0" -get-stream@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-6.0.0.tgz#3e0012cb6827319da2706e601a1583e8629a6718" - integrity sha512-A1B3Bh1UmL0bidM/YX2NsCOTnGJePL9rO/M+Mw3m9f2gUpfokS0hi5Eah0WSUEWZdZhIZtMjkIYS7mDfOqNHbg== - get-symbol-description@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/get-symbol-description/-/get-symbol-description-1.0.0.tgz#7fdb81c900101fbd564dd5f1a30af5aadc1e58d6" @@ -12990,9 +12426,9 @@ git-up@^7.0.0: is-ssh "^1.4.0" parse-url "^8.1.0" -git-url-parse@^13.1.0: +git-url-parse@13.1.0: version "13.1.0" - resolved "https://registry.yarnpkg.com/git-url-parse/-/git-url-parse-13.1.0.tgz#07e136b5baa08d59fabdf0e33170de425adf07b4" + resolved "https://registry.npmjs.org/git-url-parse/-/git-url-parse-13.1.0.tgz#07e136b5baa08d59fabdf0e33170de425adf07b4" integrity sha512-5FvPJP/70WkIprlUZ33bm4UAaFdjcLkJLpWft1BeZKqwR0uhhNGoKwlUaPtVb4LxCSQ++erHapRak9kWGj+FCA== dependencies: git-up "^7.0.0" @@ -13004,6 +12440,13 @@ gitconfiglocal@^1.0.0: dependencies: ini "^1.3.2" +glob-parent@5.1.2, glob-parent@^5.1.1, glob-parent@^5.1.2, glob-parent@~5.1.0, glob-parent@~5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" + integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== + dependencies: + is-glob "^4.0.1" + glob-parent@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-3.1.0.tgz#9e6af6299d8d3bd2bd40430832bd113df906c5ae" @@ -13012,13 +12455,6 @@ glob-parent@^3.1.0: is-glob "^3.1.0" path-dirname "^1.0.0" -glob-parent@^5.1.1, glob-parent@^5.1.2, glob-parent@~5.1.0, glob-parent@~5.1.2: - version "5.1.2" - resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" - integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== - dependencies: - is-glob "^4.0.1" - glob-to-regexp@^0.4.1: version "0.4.1" resolved "https://registry.yarnpkg.com/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz#c75297087c851b9a578bd217dd59a92f59fe546e" @@ -13187,9 +12623,9 @@ globby@10.0.0: merge2 "^1.2.3" slash "^3.0.0" -globby@^11.0.1, globby@^11.0.2, globby@^11.0.3, globby@^11.1.0: +globby@11.1.0, globby@^11.0.1, globby@^11.0.2, globby@^11.0.3, globby@^11.1.0: version "11.1.0" - resolved "https://registry.yarnpkg.com/globby/-/globby-11.1.0.tgz#bd4be98bb042f83d796f7e3811991fbe82a0d34b" + resolved "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz#bd4be98bb042f83d796f7e3811991fbe82a0d34b" integrity sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g== dependencies: array-union "^2.1.0" @@ -13327,7 +12763,7 @@ got@^9.6.0: to-readable-stream "^1.0.0" url-parse-lax "^3.0.0" -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: +graceful-fs@4.2.10, 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.10" resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.10.tgz#147d3a006da4ca3ce14728c7aefc287c367d7a6c" integrity sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA== @@ -13487,7 +12923,7 @@ has-tostringtag@^1.0.0: dependencies: has-symbols "^1.0.2" -has-unicode@^2.0.0, has-unicode@^2.0.1: +has-unicode@2.0.1, has-unicode@^2.0.0, has-unicode@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" integrity sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk= @@ -13923,6 +13359,14 @@ https-browserify@1.0.0, https-browserify@^1.0.0: resolved "https://registry.yarnpkg.com/https-browserify/-/https-browserify-1.0.0.tgz#ec06c10e0a34c0f2faf199f7fd7fc78fffd03c73" integrity sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM= +https-proxy-agent@5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz#c59ef224a04fe8b754f3db0063a25ea30d0005d6" + integrity sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA== + dependencies: + agent-base "6" + debug "4" + https-proxy-agent@^2.2.1, https-proxy-agent@^2.2.3: version "2.2.4" resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-2.2.4.tgz#4ee7a737abd92678a293d9b34a1af4d0d08c787b" @@ -14175,7 +13619,7 @@ ini@^1.3.2, ini@^1.3.4, ini@~1.3.0: resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.8.tgz#a29da425b48806f34767a4efce397269af28432c" integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew== -init-package-json@^3.0.2: +init-package-json@3.0.2, init-package-json@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/init-package-json/-/init-package-json-3.0.2.tgz#f5bc9bac93f2bdc005778bc2271be642fecfcd69" integrity sha512-YhlQPEjNFqlGdzrBfDNRLhvoSgX7iQRgSxgsNknRQ9ITXFT7UMfVMWhBTOh2Y+25lRnGrv5Xz8yZwQ3ACR6T3A== @@ -14411,9 +13855,9 @@ is-callable@^1.1.3, is-callable@^1.1.4, is-callable@^1.2.7: resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.7.tgz#3bc2a85ea742d9e36205dcacdd72ca1fdc51b055" integrity sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA== -is-ci@^2.0.0: +is-ci@2.0.0, is-ci@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-2.0.0.tgz#6bc6334181810e04b5c22b3d589fdca55026404c" + resolved "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz#6bc6334181810e04b5c22b3d589fdca55026404c" integrity sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w== dependencies: ci-info "^2.0.0" @@ -14742,16 +14186,16 @@ is-stream-ended@^0.1.4: resolved "https://registry.yarnpkg.com/is-stream-ended/-/is-stream-ended-0.1.4.tgz#f50224e95e06bce0e356d440a4827cd35b267eda" integrity sha512-xj0XPvmr7bQFTvirqnFr50o0hQIh6ZItDqloxt5aJrR4NQsYeSsyFQERYGCAzfindAcnKjINnwEEgLx4IqVzQw== +is-stream@2.0.0, is-stream@^2.0.0: + version "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 sha1-EtSj3U5o4Lec6428hBc66A2RykQ= -is-stream@^2.0.0: - version "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-string@^1.0.5, is-string@^1.0.7: version "1.0.7" resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.0.7.tgz#0dd12bf2006f255bb58f695110eff7491eebc0fd" @@ -15838,6 +15282,11 @@ json5@^1.0.1: dependencies: minimist "^1.2.0" +json5@^2.2.2: + version "2.2.3" + resolved "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz#78cd6f1a19bdc12b73db5ad0c61efd66c1e29283" + integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg== + jsonc-parser@2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/jsonc-parser/-/jsonc-parser-2.3.0.tgz#7c7fc988ee1486d35734faaaa866fadb00fa91ee" @@ -16217,34 +15666,87 @@ leek@0.0.24: lodash.assign "^3.2.0" rsvp "^3.0.21" -lerna@^6.0.3: - version "6.1.0" - resolved "https://registry.yarnpkg.com/lerna/-/lerna-6.1.0.tgz#693145393ec22fd3ca98d817deab2246c1e2b107" - integrity sha512-3qAjIj8dgBwHtCAiLbq4VU/C1V9D1tvTLm2owZubdGAN72aB5TxuCu2mcw+yeEorOcXuR9YWx7EXIkAf+G0N2w== - dependencies: - "@lerna/add" "6.1.0" - "@lerna/bootstrap" "6.1.0" - "@lerna/changed" "6.1.0" - "@lerna/clean" "6.1.0" - "@lerna/cli" "6.1.0" - "@lerna/command" "6.1.0" - "@lerna/create" "6.1.0" - "@lerna/diff" "6.1.0" - "@lerna/exec" "6.1.0" - "@lerna/import" "6.1.0" - "@lerna/info" "6.1.0" - "@lerna/init" "6.1.0" - "@lerna/link" "6.1.0" - "@lerna/list" "6.1.0" - "@lerna/publish" "6.1.0" - "@lerna/run" "6.1.0" - "@lerna/version" "6.1.0" - "@nrwl/devkit" ">=14.8.6 < 16" +lerna@6.5.0-alpha.2: + version "6.5.0-alpha.2" + resolved "https://registry.npmjs.org/lerna/-/lerna-6.5.0-alpha.2.tgz#d7f2f338d7f681feea606ec851795a06d008b282" + integrity sha512-RTLl8XreCn05ja47EYvs2OOz89IZrKw0/DpSkavw/wC0jDoXosjqUNNcdYaEIAYafD3w5k9We2/GtpIIyBftOQ== + dependencies: + "@lerna/child-process" "6.5.0-alpha.2" + "@lerna/create" "6.5.0-alpha.2" + "@npmcli/arborist" "5.3.0" + "@npmcli/run-script" "4.1.7" + "@nrwl/devkit" ">=15.5.2 < 16" + "@octokit/plugin-enterprise-rest" "6.0.1" + "@octokit/rest" "19.0.3" + byte-size "7.0.0" + chalk "4.1.0" + clone-deep "4.0.1" + cmd-shim "5.0.0" + columnify "1.6.0" + config-chain "1.1.12" + conventional-changelog-angular "5.0.12" + conventional-changelog-core "4.2.4" + conventional-recommended-bump "6.1.0" + cosmiconfig "7.0.0" + dedent "0.7.0" + dot-prop "6.0.1" + envinfo "^7.7.4" + execa "5.0.0" + fs-extra "9.1.0" + get-port "5.1.1" + get-stream "6.0.0" + git-url-parse "13.1.0" + glob-parent "5.1.2" + globby "11.1.0" + graceful-fs "4.2.10" + has-unicode "2.0.1" import-local "^3.0.2" + init-package-json "3.0.2" inquirer "^8.2.4" + is-ci "2.0.0" + is-stream "2.0.0" + libnpmaccess "6.0.3" + libnpmpublish "6.0.4" + load-json-file "6.2.0" + make-dir "3.1.0" + minimatch "3.0.5" + multimatch "5.0.0" + node-fetch "2.6.7" + npm-package-arg "8.1.1" + npm-packlist "5.1.1" + npm-registry-fetch "13.3.0" npmlog "^6.0.2" - nx ">=14.8.6 < 16" + nx ">=15.5.2 < 16" + p-map "4.0.0" + p-map-series "2.1.0" + p-pipe "3.1.0" + p-queue "6.6.2" + p-reduce "2.1.0" + p-waterfall "2.1.1" + pacote "13.6.1" + path-exists "4.0.0" + pify "5.0.0" + read-cmd-shim "3.0.0" + read-package-json "5.0.1" + resolve-from "5.0.0" + rimraf "^3.0.2" + semver "7.3.4" + signal-exit "3.0.7" + slash "3.0.0" + ssri "9.0.1" + strong-log-transformer "2.1.0" + tar "6.1.11" + temp-dir "1.0.0" typescript "^3 || ^4" + upath "^2.0.1" + uuid "8.3.2" + validate-npm-package-license "3.0.4" + validate-npm-package-name "4.0.0" + write-file-atomic "4.0.1" + write-json-file "4.3.0" + write-pkg "4.0.0" + yargs "16.2.0" + yargs-parser "20.2.4" less-loader@6.2.0: version "6.2.0" @@ -16300,20 +15802,20 @@ levn@~0.3.0: prelude-ls "~1.1.2" type-check "~0.3.2" -libnpmaccess@^6.0.3: - version "6.0.4" - resolved "https://registry.yarnpkg.com/libnpmaccess/-/libnpmaccess-6.0.4.tgz#2dd158bd8a071817e2207d3b201d37cf1ad6ae6b" - integrity sha512-qZ3wcfIyUoW0+qSFkMBovcTrSGJ3ZeyvpR7d5N9pEYv/kXs8sHP2wiqEIXBKLFrZlmM0kR0RJD7mtfLngtlLag== +libnpmaccess@6.0.3: + version "6.0.3" + resolved "https://registry.npmjs.org/libnpmaccess/-/libnpmaccess-6.0.3.tgz#473cc3e4aadb2bc713419d92e45d23b070d8cded" + integrity sha512-4tkfUZprwvih2VUZYMozL7EMKgQ5q9VW2NtRyxWtQWlkLTAWHRklcAvBN49CVqEkhUw7vTX2fNgB5LzgUucgYg== dependencies: aproba "^2.0.0" minipass "^3.1.1" npm-package-arg "^9.0.1" npm-registry-fetch "^13.0.0" -libnpmpublish@^6.0.4: - version "6.0.5" - resolved "https://registry.yarnpkg.com/libnpmpublish/-/libnpmpublish-6.0.5.tgz#5a894f3de2e267d62f86be2a508e362599b5a4b1" - integrity sha512-LUR08JKSviZiqrYTDfywvtnsnxr+tOvBU0BF8H+9frt7HMvc6Qn6F8Ubm72g5hDTHbq8qupKfDvDAln2TVPvFg== +libnpmpublish@6.0.4: + version "6.0.4" + resolved "https://registry.npmjs.org/libnpmpublish/-/libnpmpublish-6.0.4.tgz#adb41ec6b0c307d6f603746a4d929dcefb8f1a0b" + integrity sha512-lvAEYW8mB8QblL6Q/PI/wMzKNvIrF7Kpujf/4fGS/32a2i3jzUXi04TNyIBcK6dQJ34IgywfaKGh+Jq4HYPFmg== dependencies: normalize-package-data "^4.0.0" npm-package-arg "^9.0.1" @@ -16354,6 +15856,11 @@ lines-and-columns@^1.1.6: resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.1.6.tgz#1c00c743b433cd0a4e80758f7b64a57440d9ff00" integrity sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA= +lines-and-columns@~2.0.3: + version "2.0.3" + resolved "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-2.0.3.tgz#b2f0badedb556b747020ab8ea7f0373e22efac1b" + integrity sha512-cNOjgCnLB+FnvWWtyRTzmB3POJ+cXxTA81LoW7u8JdmhfXzriropYwpjShnz1QLLWsQwY7nIxoDmcPTwphDK9w== + linkify-it@^2.0.0: version "2.2.0" resolved "https://registry.yarnpkg.com/linkify-it/-/linkify-it-2.2.0.tgz#e3b54697e78bf915c70a38acd78fd09e0058b1cf" @@ -16373,6 +15880,16 @@ livereload-js@^3.3.1: resolved "https://registry.yarnpkg.com/livereload-js/-/livereload-js-3.3.2.tgz#c88b009c6e466b15b91faa26fd7c99d620e12651" integrity sha512-w677WnINxFkuixAoUEXOStewzLYGI76XVag+0JWMMEyjJQKs0ibWZMxkTlB96Lm3EjZ7IeOxVziBEbtxVQqQZA== +load-json-file@6.2.0: + version "6.2.0" + resolved "https://registry.npmjs.org/load-json-file/-/load-json-file-6.2.0.tgz#5c7770b42cafa97074ca2848707c61662f4251a1" + integrity sha512-gUD/epcRms75Cw8RT1pUdHugZYM5ce64ucs2GEISABwkRsOQr0q2wm/MV2TKThycIe5e0ytRweW2RZxclogCdQ== + dependencies: + graceful-fs "^4.1.15" + parse-json "^5.0.0" + strip-bom "^4.0.0" + type-fest "^0.6.0" + load-json-file@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-1.1.0.tgz#956905708d58b4bab4c2261b04f59f31c99374c0" @@ -16404,16 +15921,6 @@ load-json-file@^4.0.0: pify "^3.0.0" strip-bom "^3.0.0" -load-json-file@^6.2.0: - version "6.2.0" - resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-6.2.0.tgz#5c7770b42cafa97074ca2848707c61662f4251a1" - integrity sha512-gUD/epcRms75Cw8RT1pUdHugZYM5ce64ucs2GEISABwkRsOQr0q2wm/MV2TKThycIe5e0ytRweW2RZxclogCdQ== - dependencies: - graceful-fs "^4.1.15" - parse-json "^5.0.0" - strip-bom "^4.0.0" - type-fest "^0.6.0" - loader-runner@^2.4.0: version "2.4.0" resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-2.4.0.tgz#ed47066bfe534d7e84c4c7b9998c2a75607d9357" @@ -16909,6 +16416,13 @@ magic-string@^0.27.0: dependencies: "@jridgewell/sourcemap-codec" "^1.4.13" +make-dir@3.1.0, make-dir@^3.0.0, make-dir@^3.0.2, make-dir@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-3.1.0.tgz#415e967046b3a7f1d185277d84aa58203726a13f" + integrity sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw== + dependencies: + semver "^6.0.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" @@ -16917,13 +16431,6 @@ make-dir@^2.0.0, make-dir@^2.1.0: pify "^4.0.1" semver "^5.6.0" -make-dir@^3.0.0, make-dir@^3.0.2, make-dir@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-3.1.0.tgz#415e967046b3a7f1d185277d84aa58203726a13f" - integrity sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw== - dependencies: - semver "^6.0.0" - make-error@1.x, make-error@^1.1.1: version "1.3.6" resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.6.tgz#2eb2e37ea9b67c4891f684a1394799af484cf7a2" @@ -17681,9 +17188,9 @@ multicast-dns@^6.0.1: dns-packet "^1.3.1" thunky "^1.0.2" -multimatch@^5.0.0: +multimatch@5.0.0: version "5.0.0" - resolved "https://registry.yarnpkg.com/multimatch/-/multimatch-5.0.0.tgz#932b800963cea7a31a033328fa1e0c3a1874dbe6" + resolved "https://registry.npmjs.org/multimatch/-/multimatch-5.0.0.tgz#932b800963cea7a31a033328fa1e0c3a1874dbe6" integrity sha512-ypMKuglUrZUD99Tk2bUQ+xNQj43lPEfAeX2o9cTteAmShXy2VHDJpuwu1o0xqoKCt9jLVAvwyFKdLTPXKAfJyA== dependencies: "@types/minimatch" "^3.0.3" @@ -17957,6 +17464,13 @@ node-fetch@2.6.1: resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.1.tgz#045bd323631f76ed2e2b55573394416b639a0052" integrity sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw== +node-fetch@2.6.7, node-fetch@^2.2.0, node-fetch@^2.3.0, node-fetch@^2.6.0, node-fetch@^2.6.1, node-fetch@^2.6.7: + version "2.6.7" + resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.7.tgz#24de9fba827e3b4ae44dc8b20256a379160052ad" + integrity sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ== + 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" @@ -17965,13 +17479,6 @@ node-fetch@^1.0.1: encoding "^0.1.11" is-stream "^1.0.1" -node-fetch@^2.2.0, node-fetch@^2.3.0, node-fetch@^2.6.0, node-fetch@^2.6.1, node-fetch@^2.6.7: - version "2.6.7" - resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.7.tgz#24de9fba827e3b4ae44dc8b20256a379160052ad" - integrity sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ== - dependencies: - whatwg-url "^5.0.0" - node-forge@^0.10.0: version "0.10.0" resolved "https://registry.yarnpkg.com/node-forge/-/node-forge-0.10.0.tgz#32dea2afb3e9926f02ee5ce8794902691a676bf3" @@ -18212,6 +17719,13 @@ npm-bundled@^1.0.1, npm-bundled@^1.1.1: dependencies: npm-normalize-package-bin "^1.0.1" +npm-bundled@^1.1.2: + version "1.1.2" + resolved "https://registry.npmjs.org/npm-bundled/-/npm-bundled-1.1.2.tgz#944c78789bd739035b70baa2ca5cc32b8d860bc1" + integrity sha512-x5DHup0SuyQcmL3s7Rx/YQ8sbw/Hzg0rj48eN0dV7hf5cmQq5PXIeioroH3raV1QC1yh3uTYuMThvEQF3iKgGQ== + dependencies: + npm-normalize-package-bin "^1.0.1" + npm-bundled@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/npm-bundled/-/npm-bundled-2.0.1.tgz#94113f7eb342cd7a67de1e789f896b04d2c600f4" @@ -18290,6 +17804,16 @@ npm-package-arg@^9.0.0, npm-package-arg@^9.0.1, npm-package-arg@^9.1.0: semver "^7.3.5" validate-npm-package-name "^4.0.0" +npm-packlist@5.1.1: + version "5.1.1" + resolved "https://registry.npmjs.org/npm-packlist/-/npm-packlist-5.1.1.tgz#79bcaf22a26b6c30aa4dd66b976d69cc286800e0" + integrity sha512-UfpSvQ5YKwctmodvPPkK6Fwk603aoVsf8AEbmVKAEECrfvL8SSe1A2YIwrJ6xmTHAITKPwwZsWo7WwEbNk0kxw== + dependencies: + glob "^8.0.1" + ignore-walk "^5.0.1" + npm-bundled "^1.1.2" + npm-normalize-package-bin "^1.0.1" + npm-packlist@^1.1.12: version "1.4.8" resolved "https://registry.yarnpkg.com/npm-packlist/-/npm-packlist-1.4.8.tgz#56ee6cc135b9f98ad3d51c1c95da22bbb9b2ef3e" @@ -18309,7 +17833,7 @@ npm-packlist@^2.1.4: npm-bundled "^1.1.1" npm-normalize-package-bin "^1.0.1" -npm-packlist@^5.1.0, npm-packlist@^5.1.1: +npm-packlist@^5.1.0: version "5.1.3" resolved "https://registry.yarnpkg.com/npm-packlist/-/npm-packlist-5.1.3.tgz#69d253e6fd664b9058b85005905012e00e69274b" integrity sha512-263/0NGrn32YFYi4J533qzrQ/krmmrWwhKkzwTuM4f/07ug51odoaNjUexxO4vxlzURHcmYMH1QjvHjsNDKLVg== @@ -18347,7 +17871,20 @@ npm-pick-manifest@^7.0.0: npm-package-arg "^9.0.0" semver "^7.3.5" -npm-registry-fetch@^13.0.0, npm-registry-fetch@^13.0.1, npm-registry-fetch@^13.3.0: +npm-registry-fetch@13.3.0: + version "13.3.0" + resolved "https://registry.npmjs.org/npm-registry-fetch/-/npm-registry-fetch-13.3.0.tgz#0ce10fa4a699a1e70685ecf41bbfb4150d74231b" + integrity sha512-10LJQ/1+VhKrZjIuY9I/+gQTvumqqlgnsCufoXETHAPFTS3+M+Z5CFhZRDHGavmJ6rOye3UvNga88vl8n1r6gg== + dependencies: + make-fetch-happen "^10.0.6" + minipass "^3.1.6" + minipass-fetch "^2.0.3" + minipass-json-stream "^1.0.1" + minizlib "^2.1.2" + npm-package-arg "^9.0.1" + proc-log "^2.0.0" + +npm-registry-fetch@^13.0.0, npm-registry-fetch@^13.0.1: version "13.3.1" resolved "https://registry.yarnpkg.com/npm-registry-fetch/-/npm-registry-fetch-13.3.1.tgz#bb078b5fa6c52774116ae501ba1af2a33166af7e" integrity sha512-eukJPi++DKRTjSBRcDZSDDsGqRK3ehbxfFUcgaRd0Yp6kRwOwh2WVn0r+8rMB4nnuzvAk6rQVzl6K5CkYOmnvw== @@ -18463,20 +18000,19 @@ nwsapi@^2.2.0: resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.2.0.tgz#204879a9e3d068ff2a55139c2c772780681a38b7" integrity sha512-h2AatdwYH+JHiZpv7pt/gSX1XoRGb7L/qSIeuqA6GwYoF9w1vP1cw42TO0aI2pNyshRK5893hNSl+1//vHK7hQ== -nx@15.2.1, "nx@>=14.8.6 < 16": - version "15.2.1" - resolved "https://registry.yarnpkg.com/nx/-/nx-15.2.1.tgz#d51962c24180383d9af1880f57f29312c8311da7" - integrity sha512-vVeT5D02cDDiSmS3P2Bos/waYQa3m0yl/rouzsKpusVSmzAQGQbKXhxPb4WnNIj8Iz/8KjFeBM/RZO021BtGNg== +nx@15.6.3, "nx@>=15.5.2 < 16": + version "15.6.3" + resolved "https://registry.npmjs.org/nx/-/nx-15.6.3.tgz#900087bce38c6e5975660c23ebd41ead1bf54f98" + integrity sha512-3t0A0GPLNen1yPAyE+VGZ3nkAzZYb5nfXtAcx8SHBlKq4u42yBY3khBmP1y4Og3jhIwFIj7J7Npeh8ZKrthmYQ== dependencies: - "@nrwl/cli" "15.2.1" - "@nrwl/tao" "15.2.1" + "@nrwl/cli" "15.6.3" + "@nrwl/tao" "15.6.3" "@parcel/watcher" "2.0.4" "@yarnpkg/lockfile" "^1.1.0" "@yarnpkg/parsers" "^3.0.0-rc.18" "@zkochan/js-yaml" "0.0.6" axios "^1.0.0" - chalk "4.1.0" - chokidar "^3.5.1" + chalk "^4.1.0" cli-cursor "3.1.0" cli-spinners "2.6.1" cliui "^7.0.2" @@ -18485,11 +18021,12 @@ nx@15.2.1, "nx@>=14.8.6 < 16": fast-glob "3.2.7" figures "3.2.0" flat "^5.0.2" - fs-extra "^10.1.0" + fs-extra "^11.1.0" glob "7.1.4" ignore "^5.0.4" js-yaml "4.1.0" jsonc-parser "3.2.0" + lines-and-columns "~2.0.3" minimatch "3.0.5" npm-run-path "^4.0.1" open "^8.4.0" @@ -18498,7 +18035,7 @@ nx@15.2.1, "nx@>=14.8.6 < 16": strong-log-transformer "^2.1.0" tar-stream "~2.2.0" tmp "~0.2.1" - tsconfig-paths "^3.9.0" + tsconfig-paths "^4.1.2" tslib "^2.3.0" v8-compile-cache "2.3.0" yargs "^17.6.2" @@ -18908,37 +18445,37 @@ p-locate@^6.0.0: dependencies: p-limit "^4.0.0" -p-map-series@^2.1.0: +p-map-series@2.1.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/p-map-series/-/p-map-series-2.1.0.tgz#7560d4c452d9da0c07e692fdbfe6e2c81a2a91f2" + resolved "https://registry.npmjs.org/p-map-series/-/p-map-series-2.1.0.tgz#7560d4c452d9da0c07e692fdbfe6e2c81a2a91f2" integrity sha512-RpYIIK1zXSNEOdwxcfe7FdvGcs7+y5n8rifMhMNWvaxRNMPINJHF5GDeuVxWqnfrcHPSCnp7Oo5yNXHId9Av2Q== -p-map@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/p-map/-/p-map-2.1.0.tgz#310928feef9c9ecc65b68b17693018a665cea175" - integrity sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw== - -p-map@^4.0.0: +p-map@4.0.0, p-map@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/p-map/-/p-map-4.0.0.tgz#bb2f95a5eda2ec168ec9274e06a747c3e2904d2b" integrity sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ== dependencies: aggregate-error "^3.0.0" -p-pipe@^3.1.0: +p-map@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/p-map/-/p-map-2.1.0.tgz#310928feef9c9ecc65b68b17693018a665cea175" + integrity sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw== + +p-pipe@3.1.0: version "3.1.0" - resolved "https://registry.yarnpkg.com/p-pipe/-/p-pipe-3.1.0.tgz#48b57c922aa2e1af6a6404cb7c6bf0eb9cc8e60e" + resolved "https://registry.npmjs.org/p-pipe/-/p-pipe-3.1.0.tgz#48b57c922aa2e1af6a6404cb7c6bf0eb9cc8e60e" integrity sha512-08pj8ATpzMR0Y80x50yJHn37NF6vjrqHutASaX5LiH5npS9XPvrUmscd9MF5R4fuYRHOxQR1FfMIlF7AzwoPqw== -p-queue@^6.6.2: +p-queue@6.6.2: version "6.6.2" - resolved "https://registry.yarnpkg.com/p-queue/-/p-queue-6.6.2.tgz#2068a9dcf8e67dd0ec3e7a2bcb76810faa85e426" + resolved "https://registry.npmjs.org/p-queue/-/p-queue-6.6.2.tgz#2068a9dcf8e67dd0ec3e7a2bcb76810faa85e426" integrity sha512-RwFpb72c/BhQLEXIZ5K2e+AhgNVmIejGlTgiB9MzZ0e93GRvqZ7uSi0dvRF7/XIXDeNkra2fNHBxTyPDGySpjQ== dependencies: eventemitter3 "^4.0.4" p-timeout "^3.2.0" -p-reduce@^2.0.0, p-reduce@^2.1.0: +p-reduce@2.1.0, p-reduce@^2.0.0, p-reduce@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/p-reduce/-/p-reduce-2.1.0.tgz#09408da49507c6c274faa31f28df334bc712b64a" integrity sha512-2USApvnsutq8uoxZBGbbWM0JIYLiEMJ9RlaN7fAzVNb9OZN0SHjjTTfIcb667XynS5Y1VhwDJVDa72TnPzAYWw== @@ -18974,9 +18511,9 @@ p-try@^2.0.0: resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== -p-waterfall@^2.1.1: +p-waterfall@2.1.1: version "2.1.1" - resolved "https://registry.yarnpkg.com/p-waterfall/-/p-waterfall-2.1.1.tgz#63153a774f472ccdc4eb281cdb2967fcf158b2ee" + resolved "https://registry.npmjs.org/p-waterfall/-/p-waterfall-2.1.1.tgz#63153a774f472ccdc4eb281cdb2967fcf158b2ee" integrity sha512-RRTnDb2TBG/epPRI2yYXsimO0v3BXC8Yd3ogr1545IaqKK17VGhbWVeGGN+XfCm/08OK8635nH31c8bATkHuSw== dependencies: p-reduce "^2.0.0" @@ -19001,6 +18538,33 @@ packet-reader@1.0.0: resolved "https://registry.yarnpkg.com/packet-reader/-/packet-reader-1.0.0.tgz#9238e5480dedabacfe1fe3f2771063f164157d74" integrity sha512-HAKu/fG3HpHFO0AA8WE8q2g+gBJaZ9MG7fcKk+IJPLTGAD6Psw4443l+9DGRbOIh3/aXr7Phy0TjilYivJo5XQ== +pacote@13.6.1: + version "13.6.1" + resolved "https://registry.npmjs.org/pacote/-/pacote-13.6.1.tgz#ac6cbd9032b4c16e5c1e0c60138dfe44e4cc589d" + integrity sha512-L+2BI1ougAPsFjXRyBhcKmfT016NscRFLv6Pz5EiNf1CCFJFU0pSKKQwsZTyAQB+sTuUL4TyFyp6J1Ork3dOqw== + dependencies: + "@npmcli/git" "^3.0.0" + "@npmcli/installed-package-contents" "^1.0.7" + "@npmcli/promise-spawn" "^3.0.0" + "@npmcli/run-script" "^4.1.0" + cacache "^16.0.0" + chownr "^2.0.0" + fs-minipass "^2.1.0" + infer-owner "^1.0.4" + minipass "^3.1.6" + mkdirp "^1.0.4" + npm-package-arg "^9.0.0" + npm-packlist "^5.1.0" + npm-pick-manifest "^7.0.0" + npm-registry-fetch "^13.0.1" + proc-log "^2.0.0" + promise-retry "^2.0.1" + read-package-json "^5.0.0" + read-package-json-fast "^2.0.3" + rimraf "^3.0.2" + ssri "^9.0.0" + tar "^6.1.11" + pacote@9.5.12: version "9.5.12" resolved "https://registry.yarnpkg.com/pacote/-/pacote-9.5.12.tgz#1e11dd7a8d736bcc36b375a9804d41bb0377bf66" @@ -19071,7 +18635,7 @@ pad@^3.2.0: dependencies: wcwidth "^1.0.1" -pako@^2.0.4: +pako@^2.0.4, pako@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/pako/-/pako-2.1.0.tgz#266cc37f98c7d883545d11335c00fbd4062c9a86" integrity sha512-w+eufiZ1WuJYgPXbV/PO3NCMEc3xqylkKHzp8bxp1uW4qaSNQUkwmLLEc3kKsfz8lpV1F8Ht3U1Cm+9Srog2ug== @@ -19224,6 +18788,11 @@ path-dirname@^1.0.0: resolved "https://registry.yarnpkg.com/path-dirname/-/path-dirname-1.0.2.tgz#cc33d24d525e099a5388c0336c6e32b9160609e0" integrity sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA= +path-exists@4.0.0, path-exists@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" + integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== + path-exists@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-2.1.0.tgz#0feb6c64f0fc518d9a754dd5efb62c7022761f4b" @@ -19236,11 +18805,6 @@ path-exists@^3.0.0: resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" integrity sha1-zg6+ql94yxiSXqfYENe1mwEP1RU= -path-exists@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" - integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== - path-exists@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-5.0.0.tgz#a6aad9489200b21fab31e49cf09277e5116fb9e7" @@ -19451,6 +19015,11 @@ pidtree@^0.3.0: resolved "https://registry.yarnpkg.com/pidtree/-/pidtree-0.3.1.tgz#ef09ac2cc0533df1f3250ccf2c4d366b0d12114a" integrity sha512-qQbW94hLHEqCg7nhby4yRC7G2+jYHY4Rguc2bjw7Uug4GIJuu1tvf2uHaZv5Q8zdt+WKJ6qK1FOI6amaWUo5FA== +pify@5.0.0, pify@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/pify/-/pify-5.0.0.tgz#1f5eca3f5e87ebec28cc6d54a0e4aaf00acc127f" + integrity sha512-eW/gHNMlxdSP6dmG6uJip6FXN0EQBwm2clYYd8Wul42Cwu/DK8HEftzsapcNdYe2MfLiIwZqsDk2RDEsTE79hA== + pify@^2.0.0, pify@^2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" @@ -19466,11 +19035,6 @@ pify@^4.0.1: resolved "https://registry.yarnpkg.com/pify/-/pify-4.0.1.tgz#4b2cd25c50d598735c50292224fd8c6df41e3231" integrity sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g== -pify@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/pify/-/pify-5.0.0.tgz#1f5eca3f5e87ebec28cc6d54a0e4aaf00acc127f" - integrity sha512-eW/gHNMlxdSP6dmG6uJip6FXN0EQBwm2clYYd8Wul42Cwu/DK8HEftzsapcNdYe2MfLiIwZqsDk2RDEsTE79hA== - pinkie-promise@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/pinkie-promise/-/pinkie-promise-2.0.1.tgz#2135d6dfa7a358c069ac9b178776288228450ffa" @@ -20133,7 +19697,7 @@ process@0.11.10, process@^0.11.10: resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182" integrity sha1-czIwDoQBYb2j5podHZGn1LwW8YI= -progress@^2.0.0, progress@^2.0.1, progress@^2.0.3: +progress@2.0.3, progress@^2.0.0, progress@^2.0.3: version "2.0.3" resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.3.tgz#7e8cf8d8f5b8f239c1bc68beb4eb78567d572ef8" integrity sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA== @@ -20284,7 +19848,7 @@ proxy-addr@~2.0.7: forwarded "0.2.0" ipaddr.js "1.9.1" -proxy-from-env@^1.0.0, proxy-from-env@^1.1.0: +proxy-from-env@1.1.0, proxy-from-env@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/proxy-from-env/-/proxy-from-env-1.1.0.tgz#e102f16ca355424865755d2c9e8ea4f24d58c3e2" integrity sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg== @@ -20370,23 +19934,31 @@ pupa@^2.1.1: dependencies: escape-goat "^2.0.0" -puppeteer@^5.5.0: - version "5.5.0" - resolved "https://registry.yarnpkg.com/puppeteer/-/puppeteer-5.5.0.tgz#331a7edd212ca06b4a556156435f58cbae08af00" - integrity sha512-OM8ZvTXAhfgFA7wBIIGlPQzvyEETzDjeRa4mZRCRHxYL+GNH5WAuYUQdja3rpWZvkX/JKqmuVgbsxDNsDFjMEg== +puppeteer-core@18.2.1: + version "18.2.1" + resolved "https://registry.yarnpkg.com/puppeteer-core/-/puppeteer-core-18.2.1.tgz#9b7827bb2bf478bb615e2c21425e4659555dc1fe" + integrity sha512-MRtTAZfQTluz3U2oU/X2VqVWPcR1+94nbA2V6ZrSZRVEwLqZ8eclZ551qGFQD/vD2PYqHJwWOW/fpC721uznVw== + dependencies: + cross-fetch "3.1.5" + debug "4.3.4" + devtools-protocol "0.0.1045489" + extract-zip "2.0.1" + https-proxy-agent "5.0.1" + proxy-from-env "1.1.0" + rimraf "3.0.2" + tar-fs "2.1.1" + unbzip2-stream "1.4.3" + ws "8.9.0" + +puppeteer@18.2.1: + version "18.2.1" + resolved "https://registry.yarnpkg.com/puppeteer/-/puppeteer-18.2.1.tgz#08967cd423efe511ee4c6e3a5c882ffaf2e6bbf3" + integrity sha512-7+UhmYa7wxPh2oMRwA++k8UGVDxh3YdWFB52r9C3tM81T6BU7cuusUSxImz0GEYSOYUKk/YzIhkQ6+vc0gHbxQ== dependencies: - debug "^4.1.0" - devtools-protocol "0.0.818844" - extract-zip "^2.0.0" - https-proxy-agent "^4.0.0" - node-fetch "^2.6.1" - pkg-dir "^4.2.0" - progress "^2.0.1" - proxy-from-env "^1.0.0" - rimraf "^3.0.2" - tar-fs "^2.0.0" - unbzip2-stream "^1.3.3" - ws "^7.2.3" + https-proxy-agent "5.0.1" + progress "2.0.3" + proxy-from-env "1.1.0" + puppeteer-core "18.2.1" q@^1.1.2, q@^1.5.1, q@~1.5.0: version "1.5.1" @@ -20660,6 +20232,11 @@ read-cache@^1.0.0: dependencies: pify "^2.3.0" +read-cmd-shim@3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/read-cmd-shim/-/read-cmd-shim-3.0.0.tgz#62b8c638225c61e6cc607f8f4b779f3b8238f155" + integrity sha512-KQDVjGqhZk92PPNRj9ZEXEuqg8bUobSKRw+q0YQ3TKI5xkce7bUJobL4Z/OtiEbAAv70yEpYIXp4iQ9L8oPVog== + read-cmd-shim@^3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/read-cmd-shim/-/read-cmd-shim-3.0.1.tgz#868c235ec59d1de2db69e11aec885bc095aea087" @@ -20673,6 +20250,16 @@ read-package-json-fast@^2.0.2, read-package-json-fast@^2.0.3: json-parse-even-better-errors "^2.3.0" npm-normalize-package-bin "^1.0.1" +read-package-json@5.0.1: + version "5.0.1" + resolved "https://registry.npmjs.org/read-package-json/-/read-package-json-5.0.1.tgz#1ed685d95ce258954596b13e2e0e76c7d0ab4c26" + integrity sha512-MALHuNgYWdGW3gKzuNMuYtcSSZbGQm94fAp16xt8VsYTLBjUSc55bLMKe6gzpWue0Tfi6CBgwCSdDAqutGDhMg== + dependencies: + glob "^8.0.1" + json-parse-even-better-errors "^2.3.1" + normalize-package-data "^4.0.0" + npm-normalize-package-bin "^1.0.1" + read-package-json@^2.0.0: version "2.1.2" resolved "https://registry.yarnpkg.com/read-package-json/-/read-package-json-2.1.2.tgz#6992b2b66c7177259feb8eaac73c3acd28b9222a" @@ -20683,7 +20270,7 @@ read-package-json@^2.0.0: normalize-package-data "^2.0.0" npm-normalize-package-bin "^1.0.0" -read-package-json@^5.0.0, read-package-json@^5.0.1: +read-package-json@^5.0.0: version "5.0.2" resolved "https://registry.yarnpkg.com/read-package-json/-/read-package-json-5.0.2.tgz#b8779ccfd169f523b67208a89cc912e3f663f3fa" integrity sha512-BSzugrt4kQ/Z0krro8zhTwV1Kd79ue25IhNN/VtHFy1mG/6Tluyi+msc0UpwaoQzxSHa28mntAjIZY6kEgfR9Q== @@ -20860,6 +20447,15 @@ readdirp@~3.6.0: dependencies: picomatch "^2.2.1" +realistic-structured-clone@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/realistic-structured-clone/-/realistic-structured-clone-3.0.0.tgz#7b518049ce2dad41ac32b421cd297075b00e3e35" + integrity sha512-rOjh4nuWkAqf9PWu6JVpOWD4ndI+JHfgiZeMmujYcPi+fvILUu7g6l26TC1K5aBIp34nV+jE1cDO75EKOfHC5Q== + dependencies: + domexception "^1.0.1" + typeson "^6.1.0" + typeson-registry "^1.0.0-alpha.20" + realpath-native@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/realpath-native/-/realpath-native-1.1.0.tgz#2003294fea23fb0672f2476ebe22fcf498a2d65c" @@ -21256,6 +20852,11 @@ resolve-dir@^1.0.0, resolve-dir@^1.0.1: expand-tilde "^2.0.0" global-modules "^1.0.0" +resolve-from@5.0.0, resolve-from@^5.0.0: + version "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" @@ -21266,11 +20867,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-from@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-5.0.0.tgz#c35225843df8f776df21c57557bc087e9dfdfc69" - integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw== - resolve-package-path@^1.0.11, resolve-package-path@^1.2.6: version "1.2.7" resolved "https://registry.yarnpkg.com/resolve-package-path/-/resolve-package-path-1.2.7.tgz#2a7bc37ad96865e239330e3102c31322847e652e" @@ -22022,7 +21618,7 @@ side-channel@^1.0.4: get-intrinsic "^1.0.2" object-inspect "^1.9.0" -signal-exit@^3.0.0, signal-exit@^3.0.2, signal-exit@^3.0.3, signal-exit@^3.0.7: +signal-exit@3.0.7, signal-exit@^3.0.0, signal-exit@^3.0.2, signal-exit@^3.0.3, signal-exit@^3.0.7: version "3.0.7" resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== @@ -22104,6 +21700,11 @@ skip-regex@^1.0.2: resolved "https://registry.yarnpkg.com/skip-regex/-/skip-regex-1.0.2.tgz#ac655d77e7c771ac2b9f37585fea37bff56ad65b" integrity sha512-pEjMUbwJ5Pl/6Vn6FsamXHXItJXSRftcibixDmNCWbWhic0hzHrwkMZo0IZ7fMRH9KxcWDFSkzhccB4285PutA== +slash@3.0.0, slash@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" + integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== + slash@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/slash/-/slash-1.0.0.tgz#c41f2f6c39fc16d1cd17ad4b5d896114ae470d55" @@ -22114,11 +21715,6 @@ slash@^2.0.0: resolved "https://registry.yarnpkg.com/slash/-/slash-2.0.0.tgz#de552851a1759df3a8f206535442f5ec4ddeab44" integrity sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A== -slash@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" - integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== - slash@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/slash/-/slash-4.0.0.tgz#2422372176c4c6c5addb5e2ada885af984b396a7" @@ -22600,6 +22196,13 @@ sshpk@^1.7.0: safer-buffer "^2.0.2" tweetnacl "~0.14.0" +ssri@9.0.1, ssri@^9.0.0: + version "9.0.1" + resolved "https://registry.yarnpkg.com/ssri/-/ssri-9.0.1.tgz#544d4c357a8d7b71a19700074b6883fcb4eae057" + integrity sha512-o57Wcn66jMQvfHG1FlYbWeZWW/dHZhJXjpIcTfXldXEk5nz5lStPo3mK0OJQfGR3RbZUlbISexbljkJzuEj/8Q== + dependencies: + minipass "^3.1.1" + ssri@^6.0.0, ssri@^6.0.1: version "6.0.2" resolved "https://registry.yarnpkg.com/ssri/-/ssri-6.0.2.tgz#157939134f20464e7301ddba3e90ffa8f7728ac5" @@ -22614,13 +22217,6 @@ ssri@^8.0.0, ssri@^8.0.1: dependencies: minipass "^3.1.1" -ssri@^9.0.0, ssri@^9.0.1: - version "9.0.1" - resolved "https://registry.yarnpkg.com/ssri/-/ssri-9.0.1.tgz#544d4c357a8d7b71a19700074b6883fcb4eae057" - integrity sha512-o57Wcn66jMQvfHG1FlYbWeZWW/dHZhJXjpIcTfXldXEk5nz5lStPo3mK0OJQfGR3RbZUlbISexbljkJzuEj/8Q== - dependencies: - minipass "^3.1.1" - stable@^0.1.8: version "0.1.8" resolved "https://registry.yarnpkg.com/stable/-/stable-0.1.8.tgz#836eb3c8382fe2936feaf544631017ce7d47a3cf" @@ -22981,7 +22577,7 @@ strip-json-comments@^3.1.0, strip-json-comments@^3.1.1: resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== -strong-log-transformer@^2.1.0: +strong-log-transformer@2.1.0, 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" integrity sha512-B3Hgul+z0L9a236FAUC9iZsL+nVHgoCJnqCbN588DjYxvGXaXaaFbfmQ/JhvKjZwsOukuR72XbHv71Qkug0HxA== @@ -23256,7 +22852,7 @@ tapable@^2.0.0, tapable@^2.1.1, tapable@^2.2.0: resolved "https://registry.yarnpkg.com/tapable/-/tapable-2.2.1.tgz#1967a73ef4060a82f12ab96af86d52fdb76eeca0" integrity sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ== -tar-fs@^2.0.0: +tar-fs@2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/tar-fs/-/tar-fs-2.1.1.tgz#489a15ab85f1f0befabb370b7de4f9eb5cbe8784" integrity sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng== @@ -23277,6 +22873,18 @@ tar-stream@^2.1.4, tar-stream@~2.2.0: inherits "^2.0.3" readable-stream "^3.1.1" +tar@6.1.11: + version "6.1.11" + resolved "https://registry.npmjs.org/tar/-/tar-6.1.11.tgz#6760a38f003afa1b2ffd0ffe9e9abbd0eab3d621" + integrity sha512-an/KZQzQUkZCkuoAA64hM92X0Urb6VpRhAFllDzz44U2mcD5scmT3zBc4VgVpkugF580+DQn8eAFSyoQt0tznA== + dependencies: + chownr "^2.0.0" + fs-minipass "^2.0.0" + minipass "^3.0.0" + minizlib "^2.1.1" + mkdirp "^1.0.3" + yallist "^4.0.0" + tar@^4.4.10: version "4.4.19" resolved "https://registry.yarnpkg.com/tar/-/tar-4.4.19.tgz#2e4d7263df26f2b914dee10c825ab132123742f3" @@ -23290,7 +22898,7 @@ tar@^4.4.10: safe-buffer "^5.2.1" yallist "^3.1.1" -tar@^6.0.2, tar@^6.1.0, tar@^6.1.11, tar@^6.1.2: +tar@^6.0.2, tar@^6.1.11, tar@^6.1.2: version "6.1.12" resolved "https://registry.yarnpkg.com/tar/-/tar-6.1.12.tgz#3b742fb05669b55671fb769ab67a7791ea1a62e6" integrity sha512-jU4TdemS31uABHd+Lt5WEYJuzn+TJTCBLljvIAHZOz6M9Os5pJ4dD+vRFLxPa/n3T0iEFzpi+0x1UfuDZYbRMw== @@ -23324,10 +22932,10 @@ teeny-request@^7.0.0: stream-events "^1.0.5" uuid "^8.0.0" -temp-dir@^1.0.0: +temp-dir@1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/temp-dir/-/temp-dir-1.0.0.tgz#0a7c0ea26d3a39afa7e0ebea9c1fc0bc4daa011d" - integrity sha1-CnwOom06Oa+n4OvqnB/AvE2qAR0= + resolved "https://registry.npmjs.org/temp-dir/-/temp-dir-1.0.0.tgz#0a7c0ea26d3a39afa7e0ebea9c1fc0bc4daa011d" + integrity sha512-xZFXEGbG7SNC3itwBzI3RYjq/cEhBkx2hJuKGIUOcEULmkQExXiHat2z/qkISYsuR+IKumhEfKKbV5qXmhICFQ== temp-fs@^0.9.9: version "0.9.9" @@ -23739,6 +23347,13 @@ tr46@^2.0.2: dependencies: punycode "^2.1.1" +tr46@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/tr46/-/tr46-2.1.0.tgz#fa87aa81ca5d5941da8cbf1f9b749dc969a4e240" + integrity sha512-15Ih7phfcdP5YxqiB+iDtLoaTz4Nd35+IiAv0kQ5FNKHzXgdWqPoTIqEDDJmXceQt4JZk6lVPT8lnDlPpGDppw== + dependencies: + punycode "^2.1.1" + tr46@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/tr46/-/tr46-3.0.0.tgz#555c4e297a950617e8eeddef633c87d4d9d6cbf9" @@ -23859,6 +23474,15 @@ tsconfig-paths@^3.9.0: minimist "^1.2.0" strip-bom "^3.0.0" +tsconfig-paths@^4.1.2: + version "4.1.2" + resolved "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-4.1.2.tgz#4819f861eef82e6da52fb4af1e8c930a39ed979a" + integrity sha512-uhxiMgnXQp1IR622dUXI+9Ehnws7i/y6xvpZB9IbUVOPy0muvdvgXeZOn88UcGPiT98Vp3rJPTa8bFoalZ3Qhw== + dependencies: + json5 "^2.2.2" + minimist "^1.2.6" + strip-bom "^3.0.0" + tslib@2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.0.1.tgz#410eb0d113e5b6356490eec749603725b021b43e" @@ -24055,6 +23679,20 @@ typescript@~4.5.2: resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.5.5.tgz#d8c953832d28924a9e3d37c73d729c846c5896f3" integrity sha512-TCTIul70LyWe6IJWT8QSYeA54WQe8EjQFU4wY52Fasj5UKx88LNYKCgBEHcOMOrFF1rKGbD8v/xcNWVUq9SymA== +typeson-registry@^1.0.0-alpha.20: + version "1.0.0-alpha.39" + resolved "https://registry.yarnpkg.com/typeson-registry/-/typeson-registry-1.0.0-alpha.39.tgz#9e0f5aabd5eebfcffd65a796487541196f4b1211" + integrity sha512-NeGDEquhw+yfwNhguLPcZ9Oj0fzbADiX4R0WxvoY8nGhy98IbzQy1sezjoEFWOywOboj/DWehI+/aUlRVrJnnw== + dependencies: + base64-arraybuffer-es6 "^0.7.0" + typeson "^6.0.0" + whatwg-url "^8.4.0" + +typeson@^6.0.0, typeson@^6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/typeson/-/typeson-6.1.0.tgz#5b2a53705a5f58ff4d6f82f965917cabd0d7448b" + integrity sha512-6FTtyGr8ldU0pfbvW/eOZrEtEkczHRUtduBnA90Jh9kMPCiFNnXIon3vF41N0S4tV1HHQt4Hk1j4srpESziCaA== + ua-parser-js@^0.7.18, ua-parser-js@^0.7.30: version "0.7.33" resolved "https://registry.yarnpkg.com/ua-parser-js/-/ua-parser-js-0.7.33.tgz#1d04acb4ccef9293df6f70f2c3d22f3030d8b532" @@ -24080,7 +23718,7 @@ unbox-primitive@^1.0.2: has-symbols "^1.0.3" which-boxed-primitive "^1.0.2" -unbzip2-stream@^1.3.3: +unbzip2-stream@1.4.3: version "1.4.3" resolved "https://registry.yarnpkg.com/unbzip2-stream/-/unbzip2-stream-1.4.3.tgz#b0da04c4371311df771cdc215e87f2130991ace7" integrity sha512-mlExGW4w71ebDJviH16lQLtZS32VKqsSfk80GCfUlwT/4/hNRFsoscrF/c++9xinkMzECL1uL9DDwXqFWkruPg== @@ -24446,16 +24084,16 @@ uuid@8.3.0: resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.0.tgz#ab738085ca22dc9a8c92725e459b1d507df5d6ea" integrity sha512-fX6Z5o4m6XsXBdli9g7DtWgAx+osMsRRZFKma1mIUsLCz6vRvv+pz5VNbyu9UEDzpMWulZfvpgb/cmDXVulYFQ== +uuid@8.3.2, uuid@^8.0.0, uuid@^8.3.1, uuid@^8.3.2: + version "8.3.2" + resolved "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2" + integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== + uuid@^3.0.0, uuid@^3.3.2, uuid@^3.4.0: version "3.4.0" resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.4.0.tgz#b23e4358afa8a202fe7a100af1f5f883f02007ee" integrity sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A== -uuid@^8.0.0, uuid@^8.3.1, uuid@^8.3.2: - version "8.3.2" - resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2" - integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== - v8-compile-cache-lib@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz#6336e8d71965cb3d35a1bbb7868445a7c05264bf" @@ -24475,7 +24113,7 @@ v8-to-istanbul@^8.1.0: convert-source-map "^1.6.0" source-map "^0.7.3" -validate-npm-package-license@^3.0.1, validate-npm-package-license@^3.0.4: +validate-npm-package-license@3.0.4, validate-npm-package-license@^3.0.1, validate-npm-package-license@^3.0.4: version "3.0.4" resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz#fc91f6b9c7ba15c857f4cb2c5defeec39d4f410a" integrity sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew== @@ -24483,6 +24121,13 @@ validate-npm-package-license@^3.0.1, validate-npm-package-license@^3.0.4: spdx-correct "^3.0.0" spdx-expression-parse "^3.0.0" +validate-npm-package-name@4.0.0, validate-npm-package-name@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/validate-npm-package-name/-/validate-npm-package-name-4.0.0.tgz#fe8f1c50ac20afdb86f177da85b3600f0ac0d747" + integrity sha512-mzR0L8ZDktZjpX4OB46KT+56MAhl4EIazWP/+G/HPGuvfdaqg4YsCdtOm6U9+LOFyYDoh4dpnpxZRB9MQQns5Q== + dependencies: + builtins "^5.0.0" + validate-npm-package-name@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/validate-npm-package-name/-/validate-npm-package-name-3.0.0.tgz#5fa912d81eb7d0c74afc140de7317f0ca7df437e" @@ -24490,13 +24135,6 @@ validate-npm-package-name@^3.0.0: dependencies: builtins "^1.0.3" -validate-npm-package-name@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/validate-npm-package-name/-/validate-npm-package-name-4.0.0.tgz#fe8f1c50ac20afdb86f177da85b3600f0ac0d747" - integrity sha512-mzR0L8ZDktZjpX4OB46KT+56MAhl4EIazWP/+G/HPGuvfdaqg4YsCdtOm6U9+LOFyYDoh4dpnpxZRB9MQQns5Q== - dependencies: - builtins "^5.0.0" - validate-peer-dependencies@^1.1.0: version "1.2.0" resolved "https://registry.yarnpkg.com/validate-peer-dependencies/-/validate-peer-dependencies-1.2.0.tgz#22aab93c514f4fda457d36c80685e8b1160d2036" @@ -25067,6 +24705,15 @@ whatwg-url@^8.0.0, whatwg-url@^8.5.0: tr46 "^2.0.2" webidl-conversions "^6.1.0" +whatwg-url@^8.4.0: + version "8.7.0" + resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-8.7.0.tgz#656a78e510ff8f3937bc0bcbe9f5c0ac35941b77" + integrity sha512-gAojqb/m9Q8a5IV96E3fHJM70AzCkgt4uXYX2O7EmuyOnLrViCQlsEBmF9UQIu3/aeAIp2U17rtbpZWNntQqdg== + dependencies: + lodash "^4.7.0" + tr46 "^2.1.0" + webidl-conversions "^6.1.0" + when@~3.6.x: version "3.6.4" resolved "https://registry.yarnpkg.com/when/-/when-3.6.4.tgz#473b517ec159e2b85005497a13983f095412e34e" @@ -25225,6 +24872,14 @@ write-file-atomic@2.4.1: imurmurhash "^0.1.4" signal-exit "^3.0.2" +write-file-atomic@4.0.1: + version "4.0.1" + resolved "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.1.tgz#9faa33a964c1c85ff6f849b80b42a88c2c537c8f" + integrity sha512-nSKUxgAbyioruk6hU87QzVbY279oYT6uiwgDoujth2ju4mJ+TZau7SQBhtbTmUyuNYTuXnSyRn66FV0+eCgcrQ== + dependencies: + imurmurhash "^0.1.4" + signal-exit "^3.0.7" + 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" @@ -25244,7 +24899,7 @@ write-file-atomic@^3.0.0: signal-exit "^3.0.2" typedarray-to-buffer "^3.1.5" -write-file-atomic@^4.0.0, write-file-atomic@^4.0.1: +write-file-atomic@^4.0.0: version "4.0.2" resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-4.0.2.tgz#a9df01ae5b77858a027fd2e80768ee433555fcfd" integrity sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg== @@ -25252,6 +24907,18 @@ write-file-atomic@^4.0.0, write-file-atomic@^4.0.1: imurmurhash "^0.1.4" signal-exit "^3.0.7" +write-json-file@4.3.0: + version "4.3.0" + resolved "https://registry.npmjs.org/write-json-file/-/write-json-file-4.3.0.tgz#908493d6fd23225344af324016e4ca8f702dd12d" + integrity sha512-PxiShnxf0IlnQuMYOPPhPkhExoCQuTUNPOa/2JWCYTmBquU9njyyDuwRKN26IZBlp4yn1nt+Agh2HOOBl+55HQ== + dependencies: + detect-indent "^6.0.0" + graceful-fs "^4.1.15" + is-plain-obj "^2.0.0" + make-dir "^3.0.0" + sort-keys "^4.0.0" + write-file-atomic "^3.0.0" + write-json-file@^3.2.0: version "3.2.0" resolved "https://registry.yarnpkg.com/write-json-file/-/write-json-file-3.2.0.tgz#65bbdc9ecd8a1458e15952770ccbadfcff5fe62a" @@ -25264,27 +24931,20 @@ write-json-file@^3.2.0: sort-keys "^2.0.0" write-file-atomic "^2.4.2" -write-json-file@^4.3.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/write-json-file/-/write-json-file-4.3.0.tgz#908493d6fd23225344af324016e4ca8f702dd12d" - integrity sha512-PxiShnxf0IlnQuMYOPPhPkhExoCQuTUNPOa/2JWCYTmBquU9njyyDuwRKN26IZBlp4yn1nt+Agh2HOOBl+55HQ== - dependencies: - detect-indent "^6.0.0" - graceful-fs "^4.1.15" - is-plain-obj "^2.0.0" - make-dir "^3.0.0" - sort-keys "^4.0.0" - write-file-atomic "^3.0.0" - -write-pkg@^4.0.0: +write-pkg@4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/write-pkg/-/write-pkg-4.0.0.tgz#675cc04ef6c11faacbbc7771b24c0abbf2a20039" + resolved "https://registry.npmjs.org/write-pkg/-/write-pkg-4.0.0.tgz#675cc04ef6c11faacbbc7771b24c0abbf2a20039" integrity sha512-v2UQ+50TNf2rNHJ8NyWttfm/EJUBWMJcx6ZTYZr6Qp52uuegWw/lBkCtCbnYZEmPRNL61m+u67dAmGxo+HTULA== dependencies: sort-keys "^2.0.0" type-fest "^0.4.1" write-json-file "^3.2.0" +ws@8.9.0: + version "8.9.0" + resolved "https://registry.yarnpkg.com/ws/-/ws-8.9.0.tgz#2a994bb67144be1b53fe2d23c53c028adeb7f45e" + integrity sha512-Ja7nszREasGaYUYCI2k4lCKIRTt+y7XuqVoHR44YpI49TtryyqbqvDMn5eqfW7e6HzTukDRIsXqzVHScqRcafg== + ws@^6.2.1: version "6.2.2" resolved "https://registry.yarnpkg.com/ws/-/ws-6.2.2.tgz#dd5cdbd57a9979916097652d78f1cc5faea0c32e" @@ -25292,7 +24952,7 @@ ws@^6.2.1: dependencies: async-limiter "~1.0.0" -ws@^7.2.3, ws@^7.3.1, ws@^7.4.6: +ws@^7.3.1, ws@^7.4.6: version "7.5.6" resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.6.tgz#e59fc509fb15ddfb65487ee9765c5a51dec5fe7b" integrity sha512-6GLgCqo2cy2A2rjCNFlxQS6ZljG/coZfZXclldI8FB/1G3CCI36Zd8xy2HrFVACi8tfk5XrgLQEk+P0Tnz9UcA== @@ -25454,6 +25114,19 @@ yargs@13.3.2, yargs@^13.3.0, yargs@^13.3.2: y18n "^4.0.0" yargs-parser "^13.1.2" +yargs@16.2.0, yargs@^16.1.1, yargs@^16.2.0: + version "16.2.0" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-16.2.0.tgz#1c82bf0f6b6a66eafce7ef30e376f49a12477f66" + integrity sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw== + dependencies: + cliui "^7.0.2" + escalade "^3.1.1" + get-caller-file "^2.0.5" + require-directory "^2.1.1" + string-width "^4.2.0" + y18n "^5.0.5" + yargs-parser "^20.2.2" + yargs@^15.0.2: version "15.4.1" resolved "https://registry.yarnpkg.com/yargs/-/yargs-15.4.1.tgz#0d87a16de01aee9d8bec2bfbf74f67851730f4f8" @@ -25471,19 +25144,6 @@ yargs@^15.0.2: y18n "^4.0.0" yargs-parser "^18.1.2" -yargs@^16.1.1, yargs@^16.2.0: - version "16.2.0" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-16.2.0.tgz#1c82bf0f6b6a66eafce7ef30e376f49a12477f66" - integrity sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw== - dependencies: - cliui "^7.0.2" - escalade "^3.1.1" - get-caller-file "^2.0.5" - require-directory "^2.1.1" - string-width "^4.2.0" - y18n "^5.0.5" - yargs-parser "^20.2.2" - yargs@^17.5.1, yargs@^17.6.0, yargs@^17.6.2: version "17.6.2" resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.6.2.tgz#2e23f2944e976339a1ee00f18c77fedee8332541"