From fe6c9db2cd1883d34c070db288fce4a5533efe65 Mon Sep 17 00:00:00 2001 From: Alisa Bayanova Date: Wed, 22 Nov 2023 16:57:18 +0100 Subject: [PATCH 1/8] feat(packages/sui-polyfills): add FlatMap polyfill --- packages/sui-polyfills/src/index.js | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/sui-polyfills/src/index.js b/packages/sui-polyfills/src/index.js index daacb103f..8335d733d 100644 --- a/packages/sui-polyfills/src/index.js +++ b/packages/sui-polyfills/src/index.js @@ -2,6 +2,7 @@ require('core-js/features/array/fill') require('core-js/features/array/find-index') require('core-js/features/array/find') require('core-js/features/array/flat') +require('core-js/features/array/flat-map') require('core-js/features/array/from') require('core-js/features/array/includes') require('core-js/features/array/is-array') From 1b1b4c971188fcdaa4d3868db3c60a6a2c9c641a Mon Sep 17 00:00:00 2001 From: sui-bot Date: Thu, 23 Nov 2023 07:33:22 +0000 Subject: [PATCH 2/8] release(packages/sui-polyfills): v1.19.0 [skip ci] --- packages/sui-polyfills/CHANGELOG.md | 9 +++++++++ packages/sui-polyfills/package.json | 2 +- 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/packages/sui-polyfills/CHANGELOG.md b/packages/sui-polyfills/CHANGELOG.md index 50212879c..2d93f56af 100644 --- a/packages/sui-polyfills/CHANGELOG.md +++ b/packages/sui-polyfills/CHANGELOG.md @@ -1,5 +1,14 @@ # CHANGELOG +# 1.19.0 (2023-11-23) + + +### Features + +* **packages/sui-polyfills:** add FlatMap polyfill ([fe6c9db](https://github.com/SUI-Components/sui/commit/fe6c9db2cd1883d34c070db288fce4a5533efe65)) + + + # 1.18.0 (2023-05-04) diff --git a/packages/sui-polyfills/package.json b/packages/sui-polyfills/package.json index 0543f3193..f048b0d30 100644 --- a/packages/sui-polyfills/package.json +++ b/packages/sui-polyfills/package.json @@ -1,6 +1,6 @@ { "name": "@s-ui/polyfills", - "version": "1.18.0", + "version": "1.19.0", "description": "Common polyfills for your project", "main": "src/index.js", "scripts": {}, From 3ddbd34428e23b7b384780c21d6a84e58ef44fb3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9s=20Alvarez?= Date: Thu, 23 Nov 2023 15:50:07 +0100 Subject: [PATCH 3/8] feat(packages/sui-react-web-vitals): add sub inp metrics to cwv --- packages/sui-react-web-vitals/src/index.js | 143 +++++++++++---------- 1 file changed, 77 insertions(+), 66 deletions(-) diff --git a/packages/sui-react-web-vitals/src/index.js b/packages/sui-react-web-vitals/src/index.js index 0fe2d5c93..62012af9e 100644 --- a/packages/sui-react-web-vitals/src/index.js +++ b/packages/sui-react-web-vitals/src/index.js @@ -16,6 +16,12 @@ export const METRICS = { TTFB: 'TTFB' } +const INP_METRICS = { + ID: 'ID', + PT: 'PT', + PD: 'PD' +} + // https://github.com/GoogleChrome/web-vitals#metric const RATING = { GOOD: 'good', @@ -23,21 +29,7 @@ const RATING = { POOR: 'poor' } -const DEFAULT_METRICS_REPORTING_ALL_CHANGES = [ - METRICS.CLS, - METRICS.FID, - METRICS.INP, - METRICS.LCP -] - -const DEFAULT_CWV_THRESHOLDS = { - [METRICS.CLS]: 100, - [METRICS.FCP]: 1800, - [METRICS.FID]: 100, - [METRICS.INP]: 200, - [METRICS.LCP]: 2500, - [METRICS.TTFB]: 800 -} +const DEFAULT_METRICS_REPORTING_ALL_CHANGES = [METRICS.CLS, METRICS.FID, METRICS.INP, METRICS.LCP] export const DEVICE_TYPES = { DESKTOP: 'desktop', @@ -45,26 +37,13 @@ export const DEVICE_TYPES = { MOBILE: 'mobile' } -const getNormalizedPathname = pathname => { - return pathname.replace(/[^a-z0-9]/gi, '') -} - -const getPathname = route => { - return route?.path || route?.regexp?.toString() -} - -const getHasPathOnRoute = route => { - return Boolean(route?.path) -} - export default function WebVitalsReporter({ children, deviceType, metrics = Object.values(METRICS), metricsAllChanges = DEFAULT_METRICS_REPORTING_ALL_CHANGES, onReport, - pathnames, - thresholds = DEFAULT_CWV_THRESHOLDS + allowed = [] }) { const {logger, browser} = useContext(SUIContext) const router = useRouter() @@ -81,6 +60,10 @@ export default function WebVitalsReporter({ return route?.id } + const getPathname = route => { + return route?.path || route?.regexp?.toString().replace(/[^a-z0-9]/gi, '') + } + const getDeviceType = () => { return deviceType || browser?.deviceType } @@ -96,44 +79,49 @@ export default function WebVitalsReporter({ } } + const computeINPMetrics = entry => { + const presentationTime = Math.max(entry.processingEnd + 4, entry.startTime + entry.duration) + + return { + [INP_METRICS.ID]: Math.round(entry.processingStart - entry.startTime, 0), + [INP_METRICS.PT]: Math.round(entry.processingEnd - entry.processingStart, 0), + [INP_METRICS.PD]: Math.round(presentationTime - entry.processingEnd, 0) + } + } + const handleAllChanges = ({attribution, name, rating, value}) => { const amount = name === METRICS.CLS ? value * 1000 : value const pathname = getPathname(route) - const hasPathOnRoute = getHasPathOnRoute(route) - const isExcluded = - !pathname || (Array.isArray(pathnames) && !pathnames.includes(pathname)) + const isAllowed = allowed.includes(pathname) - if (isExcluded || !logger?.cwv || rating === RATING.GOOD) return + if (!isAllowed || !logger?.cwv || rating === RATING.GOOD) return const target = getTarget({name, attribution}) logger.cwv({ name: `cwv.${name.toLowerCase()}`, amount, - path: hasPathOnRoute ? pathname : getNormalizedPathname(pathname), + path: pathname, target, loadState: attribution.loadState, - ...(attribution.eventType && {eventType: attribution.eventType}), - visibilityState: document.visibilityState + ...(attribution.eventType && {eventType: attribution.eventType}) }) } - const handleChange = ({name, value}) => { + const handleChange = ({name, value, entries}) => { const onReport = onReportRef.current const pathname = getPathname(route) - const hasPathOnRoute = getHasPathOnRoute(route) const routeid = getRouteid() const type = getDeviceType() - const isExcluded = - !pathname || (Array.isArray(pathnames) && !pathnames.includes(pathname)) + const isAllowed = allowed.includes(pathname) || allowed.includes(routeid) - if (isExcluded) return + if (!isAllowed) return if (onReport) { onReport({ name, amount: value, - pathname: hasPathOnRoute ? pathname : getNormalizedPathname(pathname), + pathname, routeid, type }) @@ -143,6 +131,29 @@ export default function WebVitalsReporter({ if (!logger?.distribution) return const amount = name === METRICS.CLS ? value * 1000 : value + const tags = [ + ...(routeid + ? [ + { + key: 'routeid', + value: routeid + } + ] + : [ + { + key: 'pathname', + value: pathname + } + ]), + ...(type + ? [ + { + key: 'type', + value: type + } + ] + : []) + ] logger.distribution({ name: 'cwv', @@ -152,34 +163,34 @@ export default function WebVitalsReporter({ key: 'name', value: name.toLowerCase() }, - { - key: 'pathname', - value: hasPathOnRoute ? pathname : getNormalizedPathname(pathname) - }, - ...(routeid - ? [ - { - key: 'routeid', - value: routeid - } - ] - : []), - ...(type - ? [ - { - key: 'type', - value: type - } - ] - : []) + ...tags ] }) + + if (name === METRICS.INP) { + entries.forEach(entry => { + const metrics = computeINPMetrics(entry) + + Object.keys(metrics).forEach(name => { + logger.distribution({ + name: 'cwv', + amount: metrics[name], + tags: [ + { + key: 'name', + value: name.toLowerCase() + }, + ...tags + ] + }) + }) + }) + } } metrics.forEach(metric => { reporter[`on${metric}`](handleChange) - if (metricsAllChanges.includes(metric)) - reporter[`on${metric}`](handleAllChanges, {reportAllChanges: true}) + if (metricsAllChanges.includes(metric)) reporter[`on${metric}`](handleAllChanges, {reportAllChanges: true}) }) }) @@ -208,9 +219,9 @@ WebVitalsReporter.propTypes = { */ onReport: PropTypes.func, /** - * An optional array of pathnames that you want to track + * An optional array of pathnames or route ids that you want to track */ - pathnames: PropTypes.arrayOf(PropTypes.string), + allowed: PropTypes.arrayOf(PropTypes.string), /** * An object with METRICS as keys and thresholds as values * Thresholds by default are those above which Google considers the page as "needs improvement" From 1bd4347296bfebb1e7b48e6ee3c59d7a88e2c58d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9s=20Alvarez?= Date: Thu, 23 Nov 2023 17:13:12 +0100 Subject: [PATCH 4/8] feat(packages/sui-react-web-vitals): update test and props --- packages/sui-react-web-vitals/src/index.js | 21 +- .../test/browser/indexSpec.js | 281 ++++++++++++++++++ 2 files changed, 291 insertions(+), 11 deletions(-) create mode 100644 packages/sui-react-web-vitals/test/browser/indexSpec.js diff --git a/packages/sui-react-web-vitals/src/index.js b/packages/sui-react-web-vitals/src/index.js index 62012af9e..e4775ad57 100644 --- a/packages/sui-react-web-vitals/src/index.js +++ b/packages/sui-react-web-vitals/src/index.js @@ -1,7 +1,7 @@ import {useContext, useEffect, useRef} from 'react' import PropTypes from 'prop-types' -import * as reporter from 'web-vitals/attribution' +import * as cwv from 'web-vitals/attribution' import SUIContext from '@s-ui/react-context' import useMount from '@s-ui/react-hooks/lib/useMount/index.js' @@ -38,7 +38,8 @@ export const DEVICE_TYPES = { } export default function WebVitalsReporter({ - children, + reporter = cwv, + children = null, deviceType, metrics = Object.values(METRICS), metricsAllChanges = DEFAULT_METRICS_REPORTING_ALL_CHANGES, @@ -123,7 +124,8 @@ export default function WebVitalsReporter({ amount: value, pathname, routeid, - type + type, + entries }) return } @@ -190,7 +192,10 @@ export default function WebVitalsReporter({ metrics.forEach(metric => { reporter[`on${metric}`](handleChange) - if (metricsAllChanges.includes(metric)) reporter[`on${metric}`](handleAllChanges, {reportAllChanges: true}) + + if (metricsAllChanges.includes(metric)) { + reporter[`on${metric}`](handleAllChanges, {reportAllChanges: true}) + } }) }) @@ -221,11 +226,5 @@ WebVitalsReporter.propTypes = { /** * An optional array of pathnames or route ids that you want to track */ - allowed: PropTypes.arrayOf(PropTypes.string), - /** - * An object with METRICS as keys and thresholds as values - * Thresholds by default are those above which Google considers the page as "needs improvement" - * Lower thresholds could be set for fine-tuning, higher thresholds could be set for less noise when reporting all changes - */ - thresholds: PropTypes.object + allowed: PropTypes.arrayOf(PropTypes.string) } diff --git a/packages/sui-react-web-vitals/test/browser/indexSpec.js b/packages/sui-react-web-vitals/test/browser/indexSpec.js new file mode 100644 index 000000000..ee2ad7e93 --- /dev/null +++ b/packages/sui-react-web-vitals/test/browser/indexSpec.js @@ -0,0 +1,281 @@ +import {expect} from 'chai' +import sinon from 'sinon' + +import {render as wrap, screen, waitFor} from '@testing-library/react' + +import SUIContext from '@s-ui/react-context' +import {Route, Router} from '@s-ui/react-router' +import createMemoryHistory from '@s-ui/react-router/lib/createMemoryHistory.js' + +import WebVitalsReporter, {METRICS} from '../../src/index.js' + +const render = (children, options = {}) => { + const {logger, browser, routeId} = options + + const props = wrap( + + {children}} + /> + + ) + + return {...props, ...options} +} + +describe('WebVitalsReporter', () => { + it('should render content', async () => { + render( + +

Title

+
+ ) + + await screen.findByRole('heading', {name: 'Title'}) + }) + + it('should track cwv using logger callback', async () => { + const reporter = { + onINP: fn => { + fn({name: 'TTFB', value: 10}) + } + } + const onReport = sinon.spy() + + render() + + await waitFor(() => [expect(onReport.calledWithMatch({name: 'TTFB', amount: 10, pathname: '/'})).to.be.true]) + }) + + it('should track cwv using logger callback with route id', async () => { + const reporter = { + onINP: fn => { + fn({name: 'TTFB', value: 10}) + } + } + const onReport = sinon.spy() + const routeId = 'home' + + render(, { + routeId + }) + + await waitFor(() => [ + expect(onReport.calledWithMatch({name: 'TTFB', amount: 10, pathname: '/', routeid: routeId})).to.be.true + ]) + }) + + it('should track cwv using logger with browser', async () => { + const reporter = { + onINP: fn => { + fn({name: 'TTFB', value: 10}) + } + } + const onReport = sinon.spy() + const deviceType = 'mobile' + + render( + + ) + + await waitFor(() => [ + expect(onReport.calledWithMatch({name: 'TTFB', amount: 10, pathname: '/', type: deviceType})).to.be.true + ]) + }) + + it('should track cwv using logger with browser in context', async () => { + const reporter = { + onINP: fn => { + fn({name: 'TTFB', value: 10}) + } + } + const onReport = sinon.spy() + const deviceType = 'mobile' + const browser = {deviceType} + + render(, { + browser + }) + + await waitFor(() => [ + expect(onReport.calledWithMatch({name: 'TTFB', amount: 10, pathname: '/', type: deviceType})).to.be.true + ]) + }) + + it('should track cwv using logger distribution', async () => { + const logger = { + distribution: sinon.spy() + } + const reporter = { + onTTFB: fn => { + fn({name: 'TTFB', value: 10}) + } + } + + render(, {logger}) + + await waitFor(() => [ + expect( + logger.distribution.calledWith({ + name: 'cwv', + amount: 10, + tags: [ + {key: 'name', value: 'ttfb'}, + {key: 'pathname', value: '/'} + ] + }) + ).to.be.true + ]) + }) + + it('should track cwv using logger distribution with route id', async () => { + const logger = { + distribution: sinon.spy() + } + const reporter = { + onTTFB: fn => { + fn({name: 'TTFB', value: 10}) + } + } + const routeId = 'home' + + render(, {logger, routeId}) + + await waitFor(() => [ + expect( + logger.distribution.calledWith({ + name: 'cwv', + amount: 10, + tags: [ + {key: 'name', value: 'ttfb'}, + {key: 'routeid', value: routeId} + ] + }) + ).to.be.true + ]) + }) + + it('should track cwv using logger distribution with browser', async () => { + const logger = { + distribution: sinon.spy() + } + const reporter = { + onTTFB: fn => { + fn({name: 'TTFB', value: 10}) + } + } + const deviceType = 'mobile' + + render(, { + logger + }) + + await waitFor(() => [ + expect( + logger.distribution.calledWith({ + name: 'cwv', + amount: 10, + tags: [ + {key: 'name', value: 'ttfb'}, + {key: 'pathname', value: '/'}, + {key: 'type', value: deviceType} + ] + }) + ).to.be.true + ]) + }) + + it('should track cwv using logger distribution with browser in context', async () => { + const logger = { + distribution: sinon.spy() + } + const reporter = { + onTTFB: fn => { + fn({name: 'TTFB', value: 10}) + } + } + const deviceType = 'mobile' + const browser = {deviceType} + + render(, {logger, browser}) + + await waitFor(() => [ + expect( + logger.distribution.calledWith({ + name: 'cwv', + amount: 10, + tags: [ + {key: 'name', value: 'ttfb'}, + {key: 'pathname', value: '/'}, + {key: 'type', value: deviceType} + ] + }) + ).to.be.true + ]) + }) + + it('should track inp using logger distribution', async () => { + const logger = { + distribution: sinon.spy() + } + + const reporter = { + onINP: fn => { + fn({name: 'INP', value: 104, entries: [{startTime: 0, processingStart: 50, processingEnd: 100, duration: 5}]}) + } + } + + render(, {logger}) + + await waitFor(() => [ + expect( + logger.distribution.calledWith({ + name: 'cwv', + amount: 104, + tags: [ + {key: 'name', value: 'inp'}, + {key: 'pathname', value: '/'} + ] + }) + ).to.be.true, + expect( + logger.distribution.calledWith({ + name: 'cwv', + amount: 50, + tags: [ + {key: 'name', value: 'id'}, + {key: 'pathname', value: '/'} + ] + }) + ).to.be.true, + expect( + logger.distribution.calledWith({ + name: 'cwv', + amount: 50, + tags: [ + {key: 'name', value: 'pt'}, + {key: 'pathname', value: '/'} + ] + }) + ).to.be.true, + expect( + logger.distribution.calledWith({ + name: 'cwv', + amount: 4, + tags: [ + {key: 'name', value: 'pd'}, + {key: 'pathname', value: '/'} + ] + }) + ).to.be.true + ]) + }) +}) From 55f1eaf0c2779522fef4e1421c02197aa32909d4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9s=20Alvarez?= Date: Fri, 24 Nov 2023 09:11:25 +0100 Subject: [PATCH 5/8] feat(packages/sui-react-web-vitals): minor updates --- packages/sui-react-web-vitals/src/index.js | 1 + packages/sui-react-web-vitals/test/browser/indexSpec.js | 8 ++++---- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/packages/sui-react-web-vitals/src/index.js b/packages/sui-react-web-vitals/src/index.js index e4775ad57..f391c2e88 100644 --- a/packages/sui-react-web-vitals/src/index.js +++ b/packages/sui-react-web-vitals/src/index.js @@ -105,6 +105,7 @@ export default function WebVitalsReporter({ path: pathname, target, loadState: attribution.loadState, + visibilityState: document.visibilityState, ...(attribution.eventType && {eventType: attribution.eventType}) }) } diff --git a/packages/sui-react-web-vitals/test/browser/indexSpec.js b/packages/sui-react-web-vitals/test/browser/indexSpec.js index ee2ad7e93..bf6260950 100644 --- a/packages/sui-react-web-vitals/test/browser/indexSpec.js +++ b/packages/sui-react-web-vitals/test/browser/indexSpec.js @@ -36,7 +36,7 @@ describe('WebVitalsReporter', () => { await screen.findByRole('heading', {name: 'Title'}) }) - it('should track cwv using logger callback', async () => { + it('should track cwv using callback', async () => { const reporter = { onINP: fn => { fn({name: 'TTFB', value: 10}) @@ -49,7 +49,7 @@ describe('WebVitalsReporter', () => { await waitFor(() => [expect(onReport.calledWithMatch({name: 'TTFB', amount: 10, pathname: '/'})).to.be.true]) }) - it('should track cwv using logger callback with route id', async () => { + it('should track cwv using callback with route id', async () => { const reporter = { onINP: fn => { fn({name: 'TTFB', value: 10}) @@ -67,7 +67,7 @@ describe('WebVitalsReporter', () => { ]) }) - it('should track cwv using logger with browser', async () => { + it('should track cwv using callback with browser', async () => { const reporter = { onINP: fn => { fn({name: 'TTFB', value: 10}) @@ -91,7 +91,7 @@ describe('WebVitalsReporter', () => { ]) }) - it('should track cwv using logger with browser in context', async () => { + it('should track cwv using callback with browser in context', async () => { const reporter = { onINP: fn => { fn({name: 'TTFB', value: 10}) From 3aaee12327952c0fa6919a424fb36c4ac2d344c8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9s=20Alvarez?= Date: Fri, 24 Nov 2023 09:12:42 +0100 Subject: [PATCH 6/8] feat(packages/sui-react-web-vitals): add presentationTime comment --- packages/sui-react-web-vitals/src/index.js | 3 +++ 1 file changed, 3 insertions(+) diff --git a/packages/sui-react-web-vitals/src/index.js b/packages/sui-react-web-vitals/src/index.js index f391c2e88..aa1ee42ea 100644 --- a/packages/sui-react-web-vitals/src/index.js +++ b/packages/sui-react-web-vitals/src/index.js @@ -81,6 +81,9 @@ export default function WebVitalsReporter({ } const computeINPMetrics = entry => { + // RenderTime is an estimate because duration is rounded and may get rounded down. + // In rare cases, it can be less than processingEnd and that breaks performance.measure(). + // Let's ensure it's at least 4ms in those cases so you can barely see it. const presentationTime = Math.max(entry.processingEnd + 4, entry.startTime + entry.duration) return { From 52bd64d4aea798efe2ed8b46d645ef96258c2063 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9s=20Alvarez?= Date: Mon, 27 Nov 2023 11:09:41 +0100 Subject: [PATCH 7/8] feat(packages/sui-react-web-vitals): update doc BREAKING CHANGES: pathname for allowed --- packages/sui-react-web-vitals/README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/sui-react-web-vitals/README.md b/packages/sui-react-web-vitals/README.md index a88eb1b7f..e5c25da29 100644 --- a/packages/sui-react-web-vitals/README.md +++ b/packages/sui-react-web-vitals/README.md @@ -139,16 +139,16 @@ export default function App() { } ``` -#### Allowed pathnames +#### Allowed routes -Use `pathnames` prop if you only want to track a set of pathnames +Use `allowed` prop if you only want to track a set of pathnames or route ids ```jsx import WebVitalsReporter from '@s-ui/react-web-vitals' export default function App() { return ( - +
) From 859a260c787212ecb0f226db2073ed257ad805b9 Mon Sep 17 00:00:00 2001 From: sui-bot Date: Mon, 27 Nov 2023 10:19:25 +0000 Subject: [PATCH 8/8] release(packages/sui-react-web-vitals): v2.0.0 [skip ci] --- packages/sui-react-web-vitals/CHANGELOG.md | 13 +++++++++++++ packages/sui-react-web-vitals/package.json | 2 +- 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/packages/sui-react-web-vitals/CHANGELOG.md b/packages/sui-react-web-vitals/CHANGELOG.md index 49cfbdcfe..edf86e311 100644 --- a/packages/sui-react-web-vitals/CHANGELOG.md +++ b/packages/sui-react-web-vitals/CHANGELOG.md @@ -1,5 +1,18 @@ # CHANGELOG +# 2.0.0 (2023-11-27) + + +### Features + +* **packages/sui-react-web-vitals:** add presentationTime comment ([3aaee12](https://github.com/SUI-Components/sui/commit/3aaee12327952c0fa6919a424fb36c4ac2d344c8)) +* **packages/sui-react-web-vitals:** add sub inp metrics to cwv ([3ddbd34](https://github.com/SUI-Components/sui/commit/3ddbd34428e23b7b384780c21d6a84e58ef44fb3)) +* **packages/sui-react-web-vitals:** minor updates ([55f1eaf](https://github.com/SUI-Components/sui/commit/55f1eaf0c2779522fef4e1421c02197aa32909d4)) +* **packages/sui-react-web-vitals:** update doc ([52bd64d](https://github.com/SUI-Components/sui/commit/52bd64d4aea798efe2ed8b46d645ef96258c2063)) +* **packages/sui-react-web-vitals:** update test and props ([1bd4347](https://github.com/SUI-Components/sui/commit/1bd4347296bfebb1e7b48e6ee3c59d7a88e2c58d)) + + + # 1.12.0 (2023-11-07) diff --git a/packages/sui-react-web-vitals/package.json b/packages/sui-react-web-vitals/package.json index 204975318..e34bd5288 100644 --- a/packages/sui-react-web-vitals/package.json +++ b/packages/sui-react-web-vitals/package.json @@ -1,6 +1,6 @@ { "name": "@s-ui/react-web-vitals", - "version": "1.12.0", + "version": "2.0.0", "description": "", "type": "module", "main": "lib/index.js",