feat(premium-analytics): port widgets-toolkit package from next-woocommerce-analytics#49422
Conversation
|
Are you an Automattician? Please test your changes on all WordPress.com environments to help mitigate accidental explosions.
Interested in more tips and information?
|
|
Thank you for your PR! When contributing to Jetpack, we have a few suggestions that can help us test and review your patch:
This comment will be updated as you work on your PR and make changes. If you think that some of those checks are not needed for your PR, please explain why you think so. Thanks for cooperation 🤖 Follow this PR Review Process:
If you have questions about anything, reach out in #jetpack-developers for guidance! |
Code Coverage SummaryThis PR did not change code coverage! That could be good or bad, depending on the situation. Everything covered before, and still is? Great! Nothing was covered before? Not so great. 🤷 |
…' into wooa7s-1319-base-all-deps
d6cef40 to
d3aac19
Compare
…d ciab-admin packages
…eact-native peer issue
d165255 to
01f7aa9
Compare
…e-widgets-toolkit-package-into-analytics # Conflicts: # pnpm-lock.yaml # projects/packages/premium-analytics/eslint.config.mjs # projects/packages/premium-analytics/package.json # projects/packages/premium-analytics/packages/data/README.md # projects/packages/premium-analytics/packages/data/package.json # projects/packages/premium-analytics/packages/data/src/api/report-bookings-fetch/report-bookings-fetch.ts # projects/packages/premium-analytics/packages/data/src/api/report-conversion-rate-fetch/report-conversion-rate-fetch.ts # projects/packages/premium-analytics/packages/data/src/api/report-coupons-by-date-fetch/report-coupons-by-date-fetch.ts # projects/packages/premium-analytics/packages/data/src/api/report-coupons-fetch/report-coupons-fetch.ts # projects/packages/premium-analytics/packages/data/src/api/report-customers-by-date-fetch/report-customers-by-date-fetch.ts # projects/packages/premium-analytics/packages/data/src/api/report-customers-fetch/report-customers-fetch.ts # projects/packages/premium-analytics/packages/data/src/api/report-orders-fetch/report-orders-fetch.ts # projects/packages/premium-analytics/packages/data/src/api/report-products-fetch/report-products-fetch.ts # projects/packages/premium-analytics/packages/data/src/api/report-visitors-by-location-fetch/report-visitors-by-location-fetch.ts # projects/packages/premium-analytics/packages/data/src/api/report-visitors-fetch/report-visitors-fetch.ts # projects/packages/premium-analytics/packages/data/src/defaults/reports.ts # projects/packages/premium-analytics/packages/data/src/hooks/use-product-images.ts # projects/packages/premium-analytics/packages/data/src/hooks/use-report-bookings.ts # projects/packages/premium-analytics/packages/data/src/hooks/use-report-conversion-rate.ts # projects/packages/premium-analytics/packages/data/src/hooks/use-report-coupons-by-date.ts # projects/packages/premium-analytics/packages/data/src/hooks/use-report-coupons.ts # projects/packages/premium-analytics/packages/data/src/hooks/use-report-customers-by-date.ts # projects/packages/premium-analytics/packages/data/src/hooks/use-report-customers.ts # projects/packages/premium-analytics/packages/data/src/hooks/use-report-order-attribution.ts # projects/packages/premium-analytics/packages/data/src/hooks/use-report-orders.ts # projects/packages/premium-analytics/packages/data/src/hooks/use-report-products.ts # projects/packages/premium-analytics/packages/data/src/hooks/use-report-visitors-by-location.ts # projects/packages/premium-analytics/packages/data/src/hooks/use-report-visitors.ts # projects/packages/premium-analytics/packages/data/src/prefetch/prefetch-report.ts # projects/packages/premium-analytics/packages/data/src/processing/bookings/index.ts # projects/packages/premium-analytics/packages/data/src/processing/conversion-rate/index.ts # projects/packages/premium-analytics/packages/data/src/processing/coupons-by-date/index.ts # projects/packages/premium-analytics/packages/data/src/processing/coupons/index.ts # projects/packages/premium-analytics/packages/data/src/processing/customers-by-date/index.ts # projects/packages/premium-analytics/packages/data/src/processing/customers/index.ts # projects/packages/premium-analytics/packages/data/src/processing/order-attribution/sanitize-order-attribution-summary-response.ts # projects/packages/premium-analytics/packages/data/src/processing/orders-by-product-type/index.ts # projects/packages/premium-analytics/packages/data/src/processing/orders/index.ts # projects/packages/premium-analytics/packages/data/src/processing/products/index.ts # projects/packages/premium-analytics/packages/data/src/processing/visitors-by-location/index.ts # projects/packages/premium-analytics/packages/data/src/processing/visitors/index.ts # projects/packages/premium-analytics/packages/data/src/providers/global-error-context.tsx # projects/packages/premium-analytics/packages/data/src/providers/query-client-provider.tsx # projects/packages/premium-analytics/packages/data/src/queries/report-bookings-query.ts # projects/packages/premium-analytics/packages/data/src/queries/report-conversion-rate-query.ts # projects/packages/premium-analytics/packages/data/src/queries/report-coupons-by-date-query.ts # projects/packages/premium-analytics/packages/data/src/queries/report-coupons-query.ts # projects/packages/premium-analytics/packages/data/src/queries/report-customers-by-date-query.ts # projects/packages/premium-analytics/packages/data/src/queries/report-customers-query.ts # projects/packages/premium-analytics/packages/data/src/queries/report-order-attribution-summary-query.ts # projects/packages/premium-analytics/packages/data/src/queries/report-orders-query.ts # projects/packages/premium-analytics/packages/data/src/queries/report-products-query.ts # projects/packages/premium-analytics/packages/data/src/queries/report-sessions-by-device-query.ts # projects/packages/premium-analytics/packages/data/src/queries/report-visitors-by-location-query.ts # projects/packages/premium-analytics/packages/data/src/queries/report-visitors-query.ts # projects/packages/premium-analytics/packages/data/src/utils/__tests__/compute-date-range-from-preset.test.ts # projects/packages/premium-analytics/packages/data/src/utils/date.ts # projects/packages/premium-analytics/packages/data/src/utils/ensure-core-settings.ts # projects/packages/premium-analytics/packages/data/src/utils/interval.ts # projects/packages/premium-analytics/packages/data/src/utils/parsing.ts # projects/packages/premium-analytics/packages/data/src/utils/search.ts # projects/packages/premium-analytics/packages/routing/README.md # projects/packages/premium-analytics/packages/routing/src/hooks/use-staged-search/README.md # projects/packages/premium-analytics/packages/routing/src/hooks/use-staged-search/use-staged-search.tsx # projects/packages/premium-analytics/packages/routing/src/search/comparison/derive-comparison-range.ts # projects/packages/premium-analytics/packages/routing/src/search/date-range/date-range.ts # projects/packages/premium-analytics/packages/ui/package.json # projects/packages/premium-analytics/packages/ui/src/date-comparison-dropdown/date-comparison-dropdown.scss # projects/packages/premium-analytics/packages/ui/src/date-range-popover/date-range-filter.scss # projects/packages/premium-analytics/tests/jest.config.cjs
…widgets-toolkit stories
Proposed changes
The final leaf in M2 — Shared Packages Integration: port
@next-woo-analytics/widgets-toolkitinto@automattic/jetpack-premium-analyticsas the internalwidgets-toolkitpackage. This is the layer the dashboard actually renders — 19 widget components (orders, bookings, visitors, conversion, coupons, devices, locations, leaderboards…), the chart wrappers they're built from (bar, donut, semi-circle, comparative line, leaderboard, legend, tooltip), the widget-settings fields (ReportParamsField,MetricsField), and the data-shaping helpers + hooks underneath. First ported package using CSS modules (*.module.scss).Commits
Reviewed most easily commit-by-commit — the verbatim copy is isolated first, so every later diff shows exactly what the monorepo port changed.
7953f05cba38707ec512397f668d7b36147f2411284a65ccf3b42183f6c9c19f282486d874acb81109e6f079af01f7aa92e3fe781e20f6c21892f949Monorepo adaptations
name: @next-woo-analytics/widgets-toolkitname: @automattic/jetpack-premium-analytics-widgets-toolkit@jetpack-premium-analytics/widgets-toolkit(tsconfig path alias), separate from thename:field@next-woo-analytics/{datetime,data,routing,icons},@wc-analytics/formatters,@next-woo-analytics/components@jetpack-premium-analytics/{datetime,data,routing,icons,formatters,ui}@automattic/chartsfrom npm (^1.0.0)@automattic/charts: workspace:*projects/js-packages/charts, currently 1.5.0);workspace:*matches the existing@automattic/number-formatterswiring. Its./style.cssand./visx/legendsubpath exports are both used and resolveimport type { DataFormControlProps } from '@ciab/dataviews'(2 files)@wordpress/dataviews14.3.0@ciab/dataviewsis an unpublished fork of@wordpress/dataviews; the published package exports a compatibleDataFormControlProps(Tier 1 per the integration audit guidelines). Pinned to 14.3.0 — the version the monorepo already resolves elsewhere; 15+/16 pulls@wordpress/components35 whose@emotion/nativedemands an unmetreact-nativepeer under the repo's strict peer-deps policyimport { EmptyState } from '@automattic/design-system'(1 file)EmptyStatefrom@wordpress/uidesign-systemis unpublished; itsEmptyStateis derived from@wordpress/ui's — same compound API (Root/Description), and@wordpress/uiis already a parent depimport { WidgetLoadingOverlay } from '@automattic/dashboard'(15 files)src/components/widget-loading-overlay/dashboard(CIAB Admin) is unpublished. Stand-in modeled on Gutenberg's dashboard widget chromeLoadingOverlay(Stack+Spinner), with aTODOto swap back when availableimport type { WidgetErrorConfig } from '@automattic/dashboard'(2 files)src/types.tssetErrorcontract ({ message, action? } | true | null) thatuseWidgetErrorconstructsimport { useColorPreference } from '@automattic/admin-toolkit'(1 file)src/hooks/use-color-preference.tsadmin-toolkitis unpublished. There's no interface-theme preference here yet, so the stand-in always reports'default'→ the standardWOO_COLORSpalette;TODOto wire a real preferenceimport { getStoreInfo } from '@woocommerce-next/data'(2 files)src/helpers/store-info.ts@woocommerce-next/datais unpublished. OnlylaunchedDateis consumed, feedinggetDefaultPreset( launchedDate? )whose param is optional — the stand-in returns{}and behavior falls back to the default preset;TODOto source from boot/localized settings@tanstack/react-routerindependencies--wpds-font-*,--wpds-color-bg-interactive-neutraltokens--wpds-typography-*,--wpds-color-bg-interactive-neutral-weak@wordpress/theme0.13.0 renamed the typography tokens and splitbg-interactive-neutralinto-weak/-strong; wp-build's design-token validation hard-errors on the old CIAB names'woocommerce-analytics'text domain'jetpack-premium-analytics'tsconfig.jsonincludes: [packages/**/*]+ path alias; mirrors all prior ports*version specs@wordpress/components 33.1.0,compose 7.46.0,dataviews 14.3.0,route 0.12.0,theme 0.13.0,ui 0.13.0,clsx 2.1.1,date-fns 4.1.0)Parent-level wiring (
projects/packages/premium-analytics/):package.json: adds the three runtime deps not already wired by earlier ports —@automattic/charts(workspace),@wordpress/dataviews14.3.0,@wordpress/theme0.13.0 (only itsFontSizetype is used). Everything else the package imports (@wordpress/{components,compose,icons,i18n,route,ui},clsx,date-fns,react) was already present. The leaf isn't a pnpm workspace member, so the parent's deps are the load-bearing ones; nolink:dep is added yet — nothing importswidgets-toolkit(same as all prior ports).eslint.config.mjs(temporary): extends the ui-style override topackages/widgets-toolkit/**(JSDoc softening +react/jsx-no-bind), and additionally keeps three upstream patterns as-is: intentionalanyescapes in test fixtures / the router search record,__experimental*imports from@wordpress/components(ToggleGroupControl,Grid— no stable equivalents yet), and raw/dynamic DS token names required by the@automattic/chartstheme contract. Tracked for follow-up alongside the other ports.Build / CSS modules
pnpm build(wp-build) transpiles every internal package;widgets-toolkittranspiles cleanly. This is the first ported package using CSS modules —@wordpress/build0.14.0 handles*.module.scssnatively (esbuild plugin → sass →postcss-modules), emitting hashed class names (e.g.styles.overlay→_72f4bedab…__overlay) with the compiled CSS inlined as a runtime style injection, the same mechanism as plain SCSS in the ui port. Like all prior ports, the package is a library (not a build target), so it only lands inbuild/once a route imports it; the per-package transpile confirms JS and styles compile.The package's three jest suites (helpers + chart utils, 24 tests) are picked up by the parent's
pnpm testand pass.Storybook
The package now ships Storybook stories (13 component stories + 9 widget stories), discovered by the shared Jetpack Storybook (
projects/js-packages/storybook) —projects/packages/premium-analytics/packagesis already registered there, so no shared-config change was needed.Because the shared Storybook config is off-limits, the provider/data wiring lives entirely inside the package, in
src/stories/:withChartThemedecorator that supplies the@automattic/chartsGlobalChartsProvider(the same themeWidgetRootprovides in the app).WidgetRootvia a localwithWidgetRootdecorator —WidgetRootprovides the report-params context,GlobalChartsProvider, and the react-query client.src/stories/mocks/and served through a local@wordpress/api-fetchmiddleware (register-report-mocks.ts, registered idempotently whenwithWidgetRootloads). It intercepts only the analytics report endpoints (/wc/v3/woocommerce-analytics/proxy/reports/*) and returns generated data, so every widget story renders real charts instead of empty/loading chrome.Verified in Storybook: all 22 stories render (the geo map's external
gstatic.comCSS is CORS-blocked in Storybook, but the chart + data still render).What's intentionally not here
@automattic/dashboard/@automattic/design-system/@automattic/admin-toolkit/@ciab/dataviews/@woocommerce-next/data— all five are unpublished CIAB Admin / next-admin internals. Replaced by two Tier-1 swaps (@wordpress/dataviews,@wordpress/uiEmptyState) and four small documented local stand-ins (overlay component, error-config type, color-preference hook, store-info getter), each with aTODOfor when the real packages become available.@tanstack/react-router— declared upstream, imported nowhere.link:dependency on the parent — deferred to the first consumer (mirrors all prior ports).eslint.config.mjscomments.Does this pull request change what data or activity we track or use?
No.
Testing instructions
Requires Node 24 (repo
engineStrict).To browse the stories:
Screen.Recording.2026-06-10.at.9.48.04.PM.mov
Related to WOOA7S-1319.