Skip to content

chore: replay metrics #1

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Closed
wants to merge 114 commits into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
114 commits
Select commit Hold shift + click to select a range
6cfd730
feat(core): Add `replay_event` type for events (#6481)
mydea Jan 5, 2023
55d708f
feat(core): Add `addIntegration` method to client (#6651)
mydea Jan 5, 2023
0f9a3df
feat(node): Check for invalid url in node transport (#6623)
Naddiseo Jan 5, 2023
92e951f
build: Update @typescript-eslint packages & fix resulting linting iss…
mydea Jan 5, 2023
0def7bc
ref(vue): Use `string.repeat()` (#6663)
mydea Jan 5, 2023
afb3700
feat(integrations): Add HTTPClient integration (#6500)
onurtemizkan Jan 5, 2023
c65597f
ref(nextjs): Remove `instrumentSever` (#6592)
Jan 5, 2023
46a4c3c
ref(nextjs): Simplify `isBuild` logic (#6594)
Jan 5, 2023
8291249
feat(transport): Return result through Transport send (#6626)
timfish Jan 5, 2023
7408b0a
feat(replay): Remove `replayType` from tags and into `replay_event` (…
billyvg Jan 6, 2023
eef9ba6
build(deps): bump json5 in /packages/node/test/manual/webpack-domain
dependabot[bot] Jan 4, 2023
5a0a1f9
build(deps): bump json5 from 1.0.1 to 1.0.2 in /packages/replay/demo
dependabot[bot] Jan 4, 2023
2fbd835
Revert "fix(replay): Generate uuids for replay events (#6650)" (#6668)
Lms24 Jan 9, 2023
012ff34
fix(replay): Fix ts errors with `replay_type` (#6681)
billyvg Jan 9, 2023
41dad55
fix(nextjs): Don't write to `res.end` to fix `next export` (#6682)
Jan 9, 2023
e5422c1
fix(nextjs): Don't wrap `res.json` and `res.send` (#6674)
Jan 9, 2023
1b4d9da
ref(replay): Add jsdoc to all replay modules (#6654)
mydea Jan 9, 2023
7316b85
fix(nextjs): Exclude SDK from Edge runtime bundles (#6683)
Jan 9, 2023
f052394
ref(angular) Add error-like objects handling (#6446)
theofidry Jan 9, 2023
57c7e7b
feat(node): Add `LocalVariables` integration to capture local variabl…
timfish Jan 9, 2023
0adaff4
meta: Update changelog for 7.30.0 (#6693)
Jan 9, 2023
9f06d48
feat(tests): Inject `@sentry/integrations` bundles to Playwright temp…
onurtemizkan Jan 9, 2023
c8c972b
fix(ci): Update package lists before downloading playwright deps (#6694)
Jan 10, 2023
10a80d5
ci: Fix CI failing on master (#6703)
Jan 10, 2023
19ec8c8
release: 7.30.0
getsentry-bot Jan 10, 2023
009cfd7
Merge branch 'release/7.30.0'
Jan 10, 2023
5938288
ci: Add `fail-fast: false` to playwright tests (#6712)
Jan 10, 2023
f140888
ref(nextjs): Use bundling instead of proxying to wrap pages and API r…
Jan 10, 2023
9bd6296
fix(remix): Make remix SDK type exports isomorphic (#6715)
Jan 10, 2023
e332ae1
feat(types): Add Trace Context type (#6714)
AbhiPrasad Jan 10, 2023
59b0bf6
fix(nextjs): Make Next.js types isomorphic (#6707)
Jan 10, 2023
e26e835
test: Cache Playwright deps (#6716)
AbhiPrasad Jan 10, 2023
aadd855
fix(otel): Set trace context via Otel Span instead of Sentry span (#6…
AbhiPrasad Jan 11, 2023
95ba49a
build: Update Lerna to v6 and use Nx caching for builds (#6555)
mydea Jan 11, 2023
277264e
ref(replay): Remove `clearSession` from replay API (#6704)
mydea Jan 11, 2023
318b750
ref(nextjs): Completely deprecate `isBuild()` and `IS_BUILD` (#6727)
Jan 11, 2023
5a1339e
chore: Run yarn deduplicate (#6728)
AbhiPrasad Jan 11, 2023
1cf0ae0
test(replay): Streamline replay test naming & modules (#6656)
mydea Jan 11, 2023
6fe893d
fix(otel): Prevent baggage from being overwritten (#6709)
AbhiPrasad Jan 11, 2023
8f299b6
build: Improve nx caching strategy (#6731)
mydea Jan 11, 2023
23dbd45
ci: Use nx cache from master by default (#6732)
mydea Jan 11, 2023
b250f9f
fix(replay): Fix `checkoutEveryNms` (#6722)
billyvg Jan 11, 2023
9ec436b
ref(replay): Allow `timestamp` to be passed as an argument to `sendRe…
billyvg Jan 11, 2023
2aa4e94
build: Add `@typescript-eslint/consistent-type-imports` rule (#6662)
mydea Jan 11, 2023
770a33d
feat(replay): Change `addEvent` to be async (#6695)
billyvg Jan 11, 2023
ef83db6
feat(replay): Track pending events in `EventBuffer` (#6699)
billyvg Jan 11, 2023
476f51b
ref(replay): Remove circular `@sentry/browser` peerDependency (#6736)
mydea Jan 12, 2023
90cfe00
build: Turn unused vars from TS error into eslint error (#6747)
Jan 12, 2023
7c8844f
chore(utils): Adjust JSDoc of rate limit functions (#6748)
Lms24 Jan 12, 2023
f432d09
ref(replay): Mark all methods & properties as public/private (#6734)
mydea Jan 12, 2023
2e281ad
test(replay): Add basic replay integration tests (#6735)
mydea Jan 12, 2023
24cbc4c
test: Adjust long task integration test ui span check (#6754)
AbhiPrasad Jan 12, 2023
b921631
ref(replay): Pause recording when replay requests are rate-limited (#…
Lms24 Jan 12, 2023
92b9373
feat(nextjs): Add Edge Runtime SDK (#6752)
Jan 12, 2023
9e3390d
feat(nextjs): Add optional options argument to `withSentryConfig` as …
roggenkemper Jan 12, 2023
f22366d
feat(nextjs): Use Edge SDK for Edge bundles (#6753)
Jan 12, 2023
93b8ec5
ref(replay): Extract `sendReplay` functionality into functions (#6751)
mydea Jan 13, 2023
2662401
ref: Replace `string.substr` with `string.slice` (#6760)
mydea Jan 13, 2023
f1afb1f
test(nextjs): Add NextJS client-side E2E tests (#6669)
onurtemizkan Jan 13, 2023
6fda61a
chore: replay metrics collection - initial script setup
vaind Dec 21, 2022
b333fbe
chore: replay metrics LCP collection
vaind Dec 22, 2022
a65e18c
cls vital collection
vaind Dec 22, 2022
be39bc5
replay: fid metric
vaind Dec 22, 2022
d57e56c
replay metrics - cpu stats
vaind Dec 22, 2022
cda998c
metrics memory profiler
vaind Dec 22, 2022
bcac89c
replay metrics - refactor scenarios
vaind Dec 22, 2022
68300fc
chore: formatting
vaind Dec 28, 2022
628a877
chore: refactoring
vaind Dec 28, 2022
9f37006
define test cases for metrics collection
vaind Dec 28, 2022
2c4aa3c
refactor: split up data collection
vaind Dec 29, 2022
945845e
write collected metrics to file
vaind Dec 29, 2022
b0ec7e6
add metrics processing script
vaind Dec 29, 2022
d3f93d8
metrics: reading json result file
vaind Dec 29, 2022
67a6dd8
replay matrics: jank test app copy
vaind Dec 29, 2022
c019cc6
fix JSON serialization
vaind Dec 29, 2022
5658c6c
yank-test scenario
vaind Dec 29, 2022
64f446f
collect jank test-app metrics with sentry included
vaind Dec 30, 2022
601d67a
feat: analyze collected metrics
vaind Dec 30, 2022
0df3970
metrics: ci configs, git & github utils (wip)
vaind Jan 2, 2023
468f6b2
ci: collect sdk metrics
vaind Jan 2, 2023
f7873b3
metrics collection timeout
vaind Jan 2, 2023
4df8bce
fix metrics collection on linux
vaind Jan 2, 2023
e38bbcc
await artifacts download
vaind Jan 2, 2023
49b4131
fix gh authentication
vaind Jan 2, 2023
940c072
metrics: add PR comment
vaind Jan 3, 2023
c8a71b7
improve pr comment
vaind Jan 3, 2023
78c6a94
metrics: switch from puppeteer to playwright
vaind Jan 3, 2023
cef616c
fix PR commenting
vaind Jan 3, 2023
9ee3943
first self-review
vaind Jan 3, 2023
6133883
fixes
vaind Jan 3, 2023
d4d7f3b
chore - metrics linter issues
vaind Jan 4, 2023
416ac54
more linter fixes
vaind Jan 4, 2023
d8297ec
metrics: improve PR comment contents
vaind Jan 4, 2023
6397225
metrics: improve comment
vaind Jan 4, 2023
2bfaa58
metrics: check stddev when collecting results
vaind Jan 4, 2023
432591e
metrics: filter outliers
vaind Jan 4, 2023
686a313
metrics: fix CPU usage collection
vaind Jan 5, 2023
743221a
tune cpu usage
vaind Jan 5, 2023
cedef00
perf sampler error handling
vaind Jan 5, 2023
7d1b2b4
metrics collection timeout issues
vaind Jan 5, 2023
ec925ab
metrics: fail on error logs
vaind Jan 5, 2023
be830af
move metrics CI job to build.yaml to get the full build cache
vaind Jan 5, 2023
4d0a36c
tune metrics collection
vaind Jan 5, 2023
3afa90b
ci metrics collection issues
vaind Jan 6, 2023
e713fab
tune CI metrics configs
vaind Jan 6, 2023
2078d63
more CI tuning
vaind Jan 6, 2023
0f2d1ac
docs
vaind Jan 6, 2023
d9b8244
show increase as ratio too
vaind Jan 6, 2023
b772b3e
fix: don't post PR comments on forks
vaind Jan 9, 2023
c3fcad9
feat: separate metrics measurements for sentry and sentry+replay
vaind Jan 11, 2023
bedeecf
fix and improve metrics analyzer console output
vaind Jan 12, 2023
77fa886
review changes
vaind Jan 13, 2023
ef05d06
metrics collector: improve close/dispose error handling
vaind Jan 13, 2023
355c4dc
collect metrics only if `ci-overhead-measurements` label is set on a PR
vaind Jan 13, 2023
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
120 changes: 114 additions & 6 deletions .github/workflows/build.yml
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,15 @@ env:

BUILD_CACHE_KEY: ${{ github.event.inputs.commit || github.sha }}

# GH will use the first restore-key it finds that matches
# So it will start by looking for one from the same branch, else take the newest one it can find elsewhere
# We want to prefer the cache from the current master branch, if we don't find any on the current branch
NX_CACHE_RESTORE_KEYS: |
nx-Linux-${{ github.ref }}-${{ github.event.inputs.commit || github.sha }}
nx-Linux-${{ github.ref }}
nx-Linux-refs/heads/master
nx-Linux

jobs:
job_get_metadata:
name: Get Metadata
Expand Down Expand Up @@ -120,6 +129,11 @@ jobs:
changed_browser: ${{ steps.changed.outputs.browser }}
changed_browser_integration: ${{ steps.changed.outputs.browser_integration }}
changed_any_code: ${{ steps.changed.outputs.any_code }}
# Note: These next three have to be checked as strings ('true'/'false')!
is_master: ${{ github.ref == 'refs/heads/master' }}
is_release: ${{ startsWith(github.ref, 'refs/heads/release/') }}
force_skip_cache:
${{ github.event_name == 'pull_request' && contains(github.event.pull_request.labels.*.name, 'ci-skip-cache') }}

job_install_deps:
name: Install Dependencies
Expand All @@ -139,14 +153,19 @@ jobs:
- name: Compute dependency cache key
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 == ''
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 }}
Expand All @@ -168,12 +187,31 @@ jobs:
with:
path: ${{ env.CACHED_DEPENDENCY_PATHS }}
key: ${{ needs.job_install_deps.outputs.dependency_cache_key }}

- name: Check build cache
uses: actions/cache@v3
id: cache_built_packages
if: needs.job_get_metadata.outputs.force_skip_cache == 'false'
with:
path: ${{ env.CACHED_BUILD_PATHS }}
key: ${{ env.BUILD_CACHE_KEY }}

- name: NX cache
uses: actions/cache@v3
# Disable cache when:
# - on master
# - on release branches
# - when PR has `ci-skip-cache` label
if: |
needs.job_get_metadata.outputs.is_release == 'false' &&
needs.job_get_metadata.outputs.force_skip_cache == 'false'
with:
path: node_modules/.cache/nx
key: nx-Linux-${{ github.ref }}-${{ env.HEAD_COMMIT }}
# On master branch, we want to _store_ the cache (so it can be used by other branches), but never _restore_ from it
restore-keys:
${{needs.job_get_metadata.outputs.is_master == 'false' && env.NX_CACHE_RESTORE_KEYS || 'nx-never-restore'}}

- name: Build packages
# Under normal circumstances, using the git SHA as a cache key, there shouldn't ever be a cache hit on the built
# packages, and so `yarn build` should always run. This `if` check is therefore only there for testing CI issues
Expand Down Expand Up @@ -232,7 +270,7 @@ jobs:
timeout-minutes: 15
runs-on: ubuntu-20.04
# Size Check will error out outside of the context of a PR
if: github.event_name == 'pull_request' || github.ref == 'refs/heads/master'
if: github.event_name == 'pull_request' || needs.job_get_metadata.outputs.is_master == 'true'
steps:
- name: Check out current commit (${{ needs.job_get_metadata.outputs.commit_label }})
uses: actions/checkout@v3
Expand All @@ -258,7 +296,7 @@ jobs:
- name: Check bundle sizes
uses: getsentry/size-limit-action@v5
# Don't run size check on release branches - at that point, we're already committed
if: ${{ !startsWith(github.ref, 'refs/heads/release/') }}
if: needs.job_get_metadata.outputs.is_release == 'false'
with:
github_token: ${{ secrets.GITHUB_TOKEN }}
skip_step: build
Expand Down Expand Up @@ -320,7 +358,7 @@ jobs:
needs: [job_get_metadata, job_build]
runs-on: ubuntu-20.04
# Build artifacts are only needed for releasing workflow.
if: startsWith(github.ref, 'refs/heads/release/')
if: needs.job_get_metadata.outputs.is_release == 'true'
steps:
- name: Check out current commit (${{ needs.job_get_metadata.outputs.commit_label }})
uses: actions/checkout@v3
Expand All @@ -339,7 +377,7 @@ jobs:
path: ${{ env.CACHED_BUILD_PATHS }}
key: ${{ env.BUILD_CACHE_KEY }}
- name: Pack
run: yarn build:npm
run: yarn build:tarball
- name: Archive artifacts
uses: actions/upload-artifact@v3.1.1
with:
Expand Down Expand Up @@ -505,6 +543,7 @@ jobs:
if: needs.job_get_metadata.outputs.changed_browser_integration == 'true' || github.event_name != 'pull_request'
runs-on: ubuntu-20.04
strategy:
fail-fast: false
matrix:
bundle:
- esm
Expand Down Expand Up @@ -540,13 +579,34 @@ jobs:
with:
path: ${{ env.CACHED_BUILD_PATHS }}
key: ${{ env.BUILD_CACHE_KEY }}
- name: Get npm cache directory
id: npm-cache-dir
run: |
echo "::set-output name=dir::$(npm config get cache)"
- name: Get Playwright version
id: playwright-version
run: |
echo "::set-output name=version::$(node -p "require('@playwright/test/package.json').version")"
- uses: actions/cache@v3
name: Check if Playwright browser is cached
id: playwright-cache
with:
path: ${{ steps.npm-cache-dir.outputs.dir }}
key: ${{ runner.os }}-Playwright-${{steps.playwright-version.outputs.version}}
- name: Install Playwright browser if not cached
if: steps.playwright-cache.outputs.cache-hit != 'true'
run: npx playwright install --with-deps
env:
PLAYWRIGHT_BROWSERS_PATH: ${{steps.npm-cache-dir.outputs.dir}}
- name: Install OS dependencies of Playwright if cache hit
if: steps.playwright-cache.outputs.cache-hit == 'true'
run: npx playwright install-deps
- name: Run Playwright tests
env:
PW_BUNDLE: ${{ matrix.bundle }}
PW_TRACING_ONLY: ${{ matrix.tracing_only }}
run: |
cd packages/integration-tests
yarn run playwright install-deps webkit
yarn test:ci

job_browser_integration_tests:
Expand Down Expand Up @@ -755,3 +815,51 @@ jobs:
if: contains(needs.*.result, 'failure')
run: |
echo "One of the dependent jobs have failed. You may need to re-run it." && exit 1

replay_metrics:
name: Replay Metrics
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')
steps:
- name: Check out current commit (${{ needs.job_get_metadata.outputs.commit_label }})
uses: actions/checkout@v3
with:
ref: ${{ env.HEAD_COMMIT }}
- name: Set up Node
uses: volta-cli/action@v4
- name: Check dependency cache
uses: actions/cache@v3
with:
path: ${{ env.CACHED_DEPENDENCY_PATHS }}
key: ${{ needs.job_build.outputs.dependency_cache_key }}
- name: Check build cache
uses: actions/cache@v3
with:
path: ${{ env.CACHED_BUILD_PATHS }}
key: ${{ env.BUILD_CACHE_KEY }}

- name: Setup
run: yarn install
working-directory: packages/replay/metrics

- name: Collect
run: yarn ci:collect
working-directory: packages/replay/metrics

- name: Process
id: process
run: yarn ci:process
working-directory: packages/replay/metrics
# Don't run on forks - the PR comment cannot be added.
if: github.event_name != 'pull_request' || github.event.pull_request.head.repo.full_name == github.repository
env:
GITHUB_TOKEN: ${{ github.token }}

- name: Upload results
uses: actions/upload-artifact@v3
if: github.event_name != 'pull_request' || github.event.pull_request.head.repo.full_name == github.repository
with:
name: ${{ steps.process.outputs.artifactName }}
path: ${{ steps.process.outputs.artifactPath }}
2 changes: 1 addition & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -47,4 +47,4 @@ tmp.js

# eslint
.eslintcache
eslintcache/*
**/eslintcache/*
2 changes: 1 addition & 1 deletion .size-limit.js
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,7 @@ module.exports = [
},
{
name: '@sentry/nextjs Client - Webpack (gzipped + minified)',
path: 'packages/nextjs/build/esm/index.client.js',
path: 'packages/nextjs/build/esm/client/index.js',
import: '{ init }',
gzip: true,
limit: '57 KB',
Expand Down
16 changes: 16 additions & 0 deletions .vscode/launch.json
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,22 @@
"internalConsoleOptions": "openOnSessionStart",
"outputCapture": "std"
},
{
"type": "node",
"name": "Debug replay metrics collection script",
"request": "launch",
"cwd": "${workspaceFolder}/packages/replay/metrics/",
"program": "${workspaceFolder}/packages/replay/metrics/configs/dev/collect.ts",
"preLaunchTask": "Build Replay metrics script",
},
{
"type": "node",
"name": "Debug replay metrics processing script",
"request": "launch",
"cwd": "${workspaceFolder}/packages/replay/metrics/",
"program": "${workspaceFolder}/packages/replay/metrics/configs/dev/process.ts",
"preLaunchTask": "Build Replay metrics script",
},
// Run rollup using the config file which is in the currently active tab.
{
"name": "Debug rollup (config from open file)",
Expand Down
8 changes: 7 additions & 1 deletion .vscode/tasks.json
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,13 @@
"type": "npm",
"script": "predebug",
"path": "packages/nextjs/test/integration/",
"detail": "Link the SDK (if not already linked) and build test app"
"detail": "Link the SDK (if not already linked) and build test app",
},
{
"label": "Build Replay metrics script",
"type": "npm",
"script": "build",
"path": "packages/replay/metrics",
}
]
}
20 changes: 20 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,26 @@

- "You miss 100 percent of the chances you don't take. — Wayne Gretzky" — Michael Scott

## 7.30.0

- feat(core): Add `addIntegration` method to client (#6651)
- feat(core): Add `replay_event` type for events (#6481)
- feat(gatsby): Support Gatsby v5 (#6635)
- feat(integrations): Add HTTPClient integration (#6500)
- feat(node): Add `LocalVariables` integration to capture local variables to stack frames (#6478)
- feat(node): Check for invalid url in node transport (#6623)
- feat(replay): Remove `replayType` from tags and into `replay_event` (#6658)
- feat(transport): Return result through Transport send (#6626)
- fix(nextjs): Don't wrap `res.json` and `res.send` (#6674)
- fix(nextjs): Don't write to `res.end` to fix `next export` (#6682)
- fix(nextjs): Exclude SDK from Edge runtime bundles (#6683)
- fix(replay): Allow Replay to be used in Electron renderers with nodeIntegration enabled (#6644)
- fix(utils): Ignore stack frames over 1kb (#6627)
- ref(angular) Add error-like objects handling (#6446)
- ref(nextjs): Remove `instrumentSever` (#6592)

Work in this release contributed by @rjoonas, @Naddiseo, and @theofidry. Thank you for your contributions!

## 7.29.0

This update includes a change to the `@sentry/nextjs` SDK that may increase response times of requests in applications
Expand Down
4 changes: 2 additions & 2 deletions docs/event-sending.md
Original file line number Diff line number Diff line change
Expand Up @@ -77,8 +77,8 @@ This document gives an outline for how event sending works, and which which plac
## Replay (WIP)

* `replay.sendReplayRequest()`
* `createPayload()`
* `getReplayEvent()`
* `createRecordingData()`
* `prepareReplayEvent()`
* `client._prepareEvent()` (see baseclient)
* `baseclient._applyClientOptions()`
* `baseclient._applyIntegrationsMetadata()`
Expand Down
2 changes: 1 addition & 1 deletion docs/new-sdk-release-checklist.md
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ This page serves as a checklist of what to do when releasing a new SDK for the f
- [ ] Make sure that the `LICENSE` file exists and has the correct license (We default to the `MIT` license)
- [ ] Also check, that the same license is mentioned in `package.json`

- [ ] Make sure that the tarball (`yarn build:npm`) has all the necessary contents
- [ ] Make sure that the tarball (`yarn build:tarball`) has all the necessary contents

For basic SDKs, this means that the tarball has at least these files:

Expand Down
6 changes: 3 additions & 3 deletions lerna.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{
"lerna": "3.4.0",
"version": "7.29.0",
"packages": "packages/*",
"$schema": "node_modules/lerna/schemas/lerna-schema.json",
"version": "7.30.0",
"packages": ["packages/*"],
"npmClient": "yarn",
"useWorkspaces": true
}
Loading