From dfab5d732f028b0475663f5a945ede85e6ffc5c3 Mon Sep 17 00:00:00 2001 From: Martin Hochel Date: Wed, 26 Aug 2026 10:00:57 +0200 Subject: [PATCH] fix: normalize v9 peer dependencies (#36559) Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- .github/workflows/pr.yml | 1 + ...-f5fbc283-8af7-439c-ab67-1ae1812d3609.json | 7 + ...-6b834c53-0002-4662-9608-abcd2e57e29f.json | 7 + ...-47016221-dd77-4342-9e26-596f685e9791.json | 7 + ...-815cc4bf-093b-439c-8bf5-67ec353e4a24.json | 7 + ...-e8de6782-14f3-4846-a69d-1d1c103f85f9.json | 7 + ...-e8e50831-03dd-4005-af30-5882d203be97.json | 7 + ...-ed921271-69d8-4a49-9994-9906029d3db7.json | 7 + ...-c5ff67d8-3e3c-49c5-a8f4-8da21af030aa.json | 7 + ...-9911881f-4094-4530-b026-70de0edacf05.json | 7 + ...-161a52ab-f970-457a-9b94-510b92c09ef6.json | 7 + ...-3b303453-cab2-4482-98fb-6b9207684004.json | 7 + ...-f1560a48-425b-4068-8fd8-ac2d127df2e2.json | 7 + ...-8f0d86e5-d848-4c12-988c-93497851769e.json | 7 + ...-194b508c-81a0-4476-8b9f-e6d44a3577be.json | 7 + ...-b18c6640-06b2-48af-8e30-55c72525c44a.json | 7 + ...-8404163f-5057-4c9a-8dbd-53068773c92c.json | 7 + ...-d995ca0d-3b46-4adb-b1f5-e7d060318c0e.json | 7 + ...-f8ef8024-4b0a-4e18-92e6-9f1add6b3656.json | 7 + ...-cdf7576b-9649-4bcb-aac5-5bf78c5f0b08.json | 7 + ...-a6e04818-a73a-4afe-8110-3e488f04c4e1.json | 7 + ...-9b3fedf5-8a69-4e4b-963f-4dda841882e1.json | 7 + ...-c7c1615e-b453-4679-bdd4-477058338ad6.json | 7 + ...-31876e9f-a742-4338-a622-de5ab66cb1af.json | 7 + ...-42074f33-420a-4743-9ca6-6b5f6d53100f.json | 7 + ...-67b35f45-9067-468f-b7af-0475a6655517.json | 7 + ...-ed59c75b-69f5-497b-8037-6f0c73bf4a32.json | 7 + ...-b8b12d73-67d0-4fce-8e3e-b094cc08b8af.json | 7 + ...-de52210c-b6ad-4467-a039-2fe7170e39a0.json | 7 + ...-81976a7e-de72-4567-9cf2-14ef20b47d23.json | 7 + ...-7f5626fc-f8e1-4e58-9a3b-93b89efdc9b5.json | 7 + ...-04f71f76-d074-4861-a54c-23a2910c221a.json | 7 + ...-01056834-d048-4b21-a081-fd67aaf8fd86.json | 7 + ...-7b332c08-d173-4b8d-8075-893f6ea909d1.json | 7 + ...-f5b61c71-539e-4784-a120-cb2c8aee0f76.json | 7 + ...-1efd184e-18d8-437a-b3fa-eead17412ed3.json | 7 + ...-6f7564eb-0b36-4392-94fe-665d623bd789.json | 7 + ...-c50c8034-feed-439d-a88f-0e16de50462b.json | 7 + ...-8f5a7690-9be4-46e9-ace7-94a159e676ae.json | 7 + ...-47ee4237-13e1-4967-b12b-58df4b967255.json | 7 + ...-821fff2e-c247-4ea2-8b4f-e539b9071158.json | 7 + ...-8415ea04-5866-43db-9366-a04de3a5545e.json | 7 + ...-672739dd-cc0f-4ca1-90ea-5d0e49b74a0f.json | 7 + ...-8577fe8b-e878-4c48-83c3-967dd4ab91bd.json | 7 + ...-c3a43ff0-24e1-4ff4-a669-3ed12e3a6400.json | 7 + ...-1bf5e5bd-40a0-48f4-a3a9-9c80e4ddd909.json | 7 + ...-c704b8a9-46ad-4695-ac51-dad4193c924d.json | 7 + ...-14c6cc2d-653c-4af1-ab22-b7d6e18be365.json | 7 + ...-38fb6b5c-ca52-4426-83d4-696a92fcaddc.json | 7 + ...-0b4fe366-abed-429b-865b-09ee3e5387a8.json | 7 + ...-d9dc71fd-0114-41c1-b457-e93c4a73731c.json | 7 + ...-dd8cfb16-b865-4a4c-aa37-e814c73ea800.json | 7 + ...-7a9b8b85-a90c-4863-bf28-f3b3cf01677b.json | 7 + ...-0738ede0-38e3-478f-b91e-f8172e314536.json | 7 + ...-2711ae2d-e5a9-45bb-9ad1-6bd82d1bff39.json | 7 + ...-26570b93-cc3e-4d6d-ad3b-a58cd27c965c.json | 7 + ...-7a846876-d663-403b-ab06-f884d84b66bb.json | 7 + ...-04e61d41-7b68-4e10-b1ab-b2b854dc3995.json | 7 + ...-00c069ed-91c3-4a84-b0b1-86c4bc106a13.json | 7 + ...-8d7db78b-4765-4f74-8d3f-75419c083262.json | 7 + ...-bf6bd820-5f10-4f0a-9b4d-4c494f194561.json | 7 + ...-e9a9729e-4ffd-47fb-9e09-e5897e6c7057.json | 7 + ...-e85ee204-7e82-47df-9908-c5cecdb94d63.json | 7 + ...-d3135c79-0ae9-4458-be0c-748003ab5c13.json | 7 + ...-a0291350-8bc7-4f89-969c-2c320bc99017.json | 7 + ...-56d3cbaf-451d-4cd9-884c-1b84e6018939.json | 7 + ...-4481861f-d9b1-4e91-b3e9-43d1ffc14203.json | 7 + ...-d53b0eac-9813-4e14-b85f-7ec30c24e44e.json | 7 + ...-7f05836f-7755-4521-8307-f12819a5e531.json | 7 + ...-b0cde57a-f5f1-4ac8-bf45-bf265b839fc9.json | 7 + ...-ac92166e-954e-4cd4-872f-3bca0167c252.json | 7 + ...-e5395385-c15f-4aa5-a19a-84b6d5ca14f4.json | 7 + ...-d3a45fab-cbe8-4207-956b-41cfbcbe92ce.json | 7 + ...-1d763b45-b904-47b0-8c7e-f1913615d37d.json | 7 + ...-6edcabb9-7b8e-4f0a-bd3e-4644c682e984.json | 7 + ...-30c34404-dee2-4737-b6fe-69fcb16e5ec9.json | 7 + ...-0030f645-2670-45b6-82f4-139b3fd4e2df.json | 7 + ...-78a2739c-07f2-4ac8-840f-53a7dc62c7a0.json | 7 + .../library/package.json | 4 +- .../deprecated/react-alert/package.json | 9 +- .../deprecated/react-infobutton/package.json | 9 +- .../deprecated/react-virtualizer/package.json | 6 +- .../package.json | 4 +- .../global-context/package.json | 9 +- .../react-accordion/library/package.json | 9 +- .../react-aria/library/package.json | 9 +- .../react-avatar/library/package.json | 9 +- .../react-badge/library/package.json | 9 +- .../react-breadcrumb/library/package.json | 9 +- .../react-button/library/package.json | 9 +- .../library/package.json | 9 +- .../react-card/library/package.json | 9 +- .../react-carousel/library/package.json | 9 +- .../react-checkbox/library/package.json | 9 +- .../react-color-picker/library/package.json | 9 +- .../react-colorpicker-compat/package.json | 4 +- .../react-combobox/library/package.json | 6 +- .../react-components/package.json | 9 +- .../react-conformance-griffel/package.json | 7 +- .../react-context-selector/package.json | 7 +- .../library/package.json | 9 +- .../react-dialog/library/package.json | 9 +- .../react-divider/library/package.json | 9 +- .../react-drawer/library/package.json | 9 +- .../react-field/library/package.json | 9 +- .../library/package.json | 9 +- .../react-icons-compat/library/package.json | 9 +- .../react-image/library/package.json | 9 +- .../react-infolabel/library/package.json | 9 +- .../react-input/library/package.json | 9 +- .../react-jsx-runtime/package.json | 5 + .../react-label/library/package.json | 9 +- .../react-link/library/package.json | 9 +- .../react-list/library/package.json | 9 +- .../library/package.json | 9 +- .../react-menu/library/package.json | 9 +- .../react-message-bar/library/package.json | 9 +- .../library/package.json | 9 +- .../library/package.json | 9 +- .../library/package.json | 9 +- .../react-motion/library/package.json | 9 +- .../react-nav/library/package.json | 9 +- .../react-overflow/library/package.json | 9 +- .../react-persona/library/package.json | 9 +- .../react-popover/library/package.json | 9 +- .../react-portal-compat-context/package.json | 5 + .../react-portal-compat/package.json | 5 + .../react-portal/library/package.json | 6 +- .../react-positioning/library/package.json | 11 +- .../react-progress/library/package.json | 9 +- .../react-provider/library/package.json | 9 +- .../react-radio/library/package.json | 9 +- .../react-rating/library/package.json | 9 +- .../react-search/library/package.json | 9 +- .../react-select/library/package.json | 9 +- .../library/package.json | 5 + .../react-skeleton/library/package.json | 9 +- .../react-slider/library/package.json | 9 +- .../react-spinbutton/library/package.json | 9 +- .../react-spinner/library/package.json | 9 +- .../react-storybook-addon/package.json | 7 +- .../react-swatch-picker/library/package.json | 9 +- .../react-switch/library/package.json | 9 +- .../react-table/library/package.json | 9 +- .../react-tabs/library/package.json | 9 +- .../react-tabster/package.json | 9 +- .../react-tag-picker/library/package.json | 6 +- .../react-tags/library/package.json | 9 +- .../library/package.json | 11 +- .../react-text/library/package.json | 9 +- .../react-textarea/library/package.json | 9 +- .../library/package.json | 9 +- .../react-toast/library/package.json | 9 +- .../react-toolbar/library/package.json | 9 +- .../react-tooltip/library/package.json | 9 +- .../react-tree/library/package.json | 6 +- .../library/package.json | 4 +- .../react-utilities/package.json | 5 + .../react-components/recipes/package.json | 4 +- .../theme-designer/package.json | 4 +- tools/workspace-plugin/generators.json | 5 + .../react-library/files/package.json__tmpl__ | 9 +- .../verify-peer-dependencies/README.md | 163 ++++ .../verify-peer-dependencies/index.spec.ts | 533 +++++++++++ .../verify-peer-dependencies/index.ts | 859 ++++++++++++++++++ .../verify-peer-dependencies/schema.json | 34 + .../verify-peer-dependencies/schema.ts | 31 + tools/workspace-plugin/src/types.ts | 1 + yarn.lock | 393 ++++---- 169 files changed, 2863 insertions(+), 376 deletions(-) create mode 100644 change/@fluentui-eslint-plugin-react-components-f5fbc283-8af7-439c-ab67-1ae1812d3609.json create mode 100644 change/@fluentui-global-context-6b834c53-0002-4662-9608-abcd2e57e29f.json create mode 100644 change/@fluentui-react-accordion-47016221-dd77-4342-9e26-596f685e9791.json create mode 100644 change/@fluentui-react-alert-815cc4bf-093b-439c-8bf5-67ec353e4a24.json create mode 100644 change/@fluentui-react-aria-e8de6782-14f3-4846-a69d-1d1c103f85f9.json create mode 100644 change/@fluentui-react-avatar-e8e50831-03dd-4005-af30-5882d203be97.json create mode 100644 change/@fluentui-react-badge-ed921271-69d8-4a49-9994-9906029d3db7.json create mode 100644 change/@fluentui-react-breadcrumb-c5ff67d8-3e3c-49c5-a8f4-8da21af030aa.json create mode 100644 change/@fluentui-react-button-9911881f-4094-4530-b026-70de0edacf05.json create mode 100644 change/@fluentui-react-calendar-compat-161a52ab-f970-457a-9b94-510b92c09ef6.json create mode 100644 change/@fluentui-react-card-3b303453-cab2-4482-98fb-6b9207684004.json create mode 100644 change/@fluentui-react-carousel-f1560a48-425b-4068-8fd8-ac2d127df2e2.json create mode 100644 change/@fluentui-react-checkbox-8f0d86e5-d848-4c12-988c-93497851769e.json create mode 100644 change/@fluentui-react-color-picker-194b508c-81a0-4476-8b9f-e6d44a3577be.json create mode 100644 change/@fluentui-react-combobox-b18c6640-06b2-48af-8e30-55c72525c44a.json create mode 100644 change/@fluentui-react-components-8404163f-5057-4c9a-8dbd-53068773c92c.json create mode 100644 change/@fluentui-react-conformance-griffel-d995ca0d-3b46-4adb-b1f5-e7d060318c0e.json create mode 100644 change/@fluentui-react-context-selector-f8ef8024-4b0a-4e18-92e6-9f1add6b3656.json create mode 100644 change/@fluentui-react-datepicker-compat-cdf7576b-9649-4bcb-aac5-5bf78c5f0b08.json create mode 100644 change/@fluentui-react-dialog-a6e04818-a73a-4afe-8110-3e488f04c4e1.json create mode 100644 change/@fluentui-react-divider-9b3fedf5-8a69-4e4b-963f-4dda841882e1.json create mode 100644 change/@fluentui-react-drawer-c7c1615e-b453-4679-bdd4-477058338ad6.json create mode 100644 change/@fluentui-react-field-31876e9f-a742-4338-a622-de5ab66cb1af.json create mode 100644 change/@fluentui-react-headless-components-preview-42074f33-420a-4743-9ca6-6b5f6d53100f.json create mode 100644 change/@fluentui-react-icons-compat-67b35f45-9067-468f-b7af-0475a6655517.json create mode 100644 change/@fluentui-react-image-ed59c75b-69f5-497b-8037-6f0c73bf4a32.json create mode 100644 change/@fluentui-react-infobutton-b8b12d73-67d0-4fce-8e3e-b094cc08b8af.json create mode 100644 change/@fluentui-react-infolabel-de52210c-b6ad-4467-a039-2fe7170e39a0.json create mode 100644 change/@fluentui-react-input-81976a7e-de72-4567-9cf2-14ef20b47d23.json create mode 100644 change/@fluentui-react-jsx-runtime-7f5626fc-f8e1-4e58-9a3b-93b89efdc9b5.json create mode 100644 change/@fluentui-react-label-04f71f76-d074-4861-a54c-23a2910c221a.json create mode 100644 change/@fluentui-react-link-01056834-d048-4b21-a081-fd67aaf8fd86.json create mode 100644 change/@fluentui-react-list-7b332c08-d173-4b8d-8075-893f6ea909d1.json create mode 100644 change/@fluentui-react-menu-f5b61c71-539e-4784-a120-cb2c8aee0f76.json create mode 100644 change/@fluentui-react-menu-grid-preview-1efd184e-18d8-437a-b3fa-eead17412ed3.json create mode 100644 change/@fluentui-react-message-bar-6f7564eb-0b36-4392-94fe-665d623bd789.json create mode 100644 change/@fluentui-react-migration-v0-v9-c50c8034-feed-439d-a88f-0e16de50462b.json create mode 100644 change/@fluentui-react-migration-v8-v9-8f5a7690-9be4-46e9-ace7-94a159e676ae.json create mode 100644 change/@fluentui-react-motion-47ee4237-13e1-4967-b12b-58df4b967255.json create mode 100644 change/@fluentui-react-motion-components-preview-821fff2e-c247-4ea2-8b4f-e539b9071158.json create mode 100644 change/@fluentui-react-nav-8415ea04-5866-43db-9366-a04de3a5545e.json create mode 100644 change/@fluentui-react-overflow-672739dd-cc0f-4ca1-90ea-5d0e49b74a0f.json create mode 100644 change/@fluentui-react-persona-8577fe8b-e878-4c48-83c3-967dd4ab91bd.json create mode 100644 change/@fluentui-react-popover-c3a43ff0-24e1-4ff4-a669-3ed12e3a6400.json create mode 100644 change/@fluentui-react-portal-1bf5e5bd-40a0-48f4-a3a9-9c80e4ddd909.json create mode 100644 change/@fluentui-react-portal-compat-c704b8a9-46ad-4695-ac51-dad4193c924d.json create mode 100644 change/@fluentui-react-portal-compat-context-14c6cc2d-653c-4af1-ab22-b7d6e18be365.json create mode 100644 change/@fluentui-react-positioning-38fb6b5c-ca52-4426-83d4-696a92fcaddc.json create mode 100644 change/@fluentui-react-progress-0b4fe366-abed-429b-865b-09ee3e5387a8.json create mode 100644 change/@fluentui-react-provider-d9dc71fd-0114-41c1-b457-e93c4a73731c.json create mode 100644 change/@fluentui-react-radio-dd8cfb16-b865-4a4c-aa37-e814c73ea800.json create mode 100644 change/@fluentui-react-rating-7a9b8b85-a90c-4863-bf28-f3b3cf01677b.json create mode 100644 change/@fluentui-react-search-0738ede0-38e3-478f-b91e-f8172e314536.json create mode 100644 change/@fluentui-react-select-2711ae2d-e5a9-45bb-9ad1-6bd82d1bff39.json create mode 100644 change/@fluentui-react-shared-contexts-26570b93-cc3e-4d6d-ad3b-a58cd27c965c.json create mode 100644 change/@fluentui-react-skeleton-7a846876-d663-403b-ab06-f884d84b66bb.json create mode 100644 change/@fluentui-react-slider-04e61d41-7b68-4e10-b1ab-b2b854dc3995.json create mode 100644 change/@fluentui-react-spinbutton-00c069ed-91c3-4a84-b0b1-86c4bc106a13.json create mode 100644 change/@fluentui-react-spinner-8d7db78b-4765-4f74-8d3f-75419c083262.json create mode 100644 change/@fluentui-react-storybook-addon-bf6bd820-5f10-4f0a-9b4d-4c494f194561.json create mode 100644 change/@fluentui-react-swatch-picker-e9a9729e-4ffd-47fb-9e09-e5897e6c7057.json create mode 100644 change/@fluentui-react-switch-e85ee204-7e82-47df-9908-c5cecdb94d63.json create mode 100644 change/@fluentui-react-table-d3135c79-0ae9-4458-be0c-748003ab5c13.json create mode 100644 change/@fluentui-react-tabs-a0291350-8bc7-4f89-969c-2c320bc99017.json create mode 100644 change/@fluentui-react-tabster-56d3cbaf-451d-4cd9-884c-1b84e6018939.json create mode 100644 change/@fluentui-react-tag-picker-4481861f-d9b1-4e91-b3e9-43d1ffc14203.json create mode 100644 change/@fluentui-react-tags-d53b0eac-9813-4e14-b85f-7ec30c24e44e.json create mode 100644 change/@fluentui-react-teaching-popover-7f05836f-7755-4521-8307-f12819a5e531.json create mode 100644 change/@fluentui-react-text-b0cde57a-f5f1-4ac8-bf45-bf265b839fc9.json create mode 100644 change/@fluentui-react-textarea-ac92166e-954e-4cd4-872f-3bca0167c252.json create mode 100644 change/@fluentui-react-timepicker-compat-e5395385-c15f-4aa5-a19a-84b6d5ca14f4.json create mode 100644 change/@fluentui-react-toast-d3a45fab-cbe8-4207-956b-41cfbcbe92ce.json create mode 100644 change/@fluentui-react-toolbar-1d763b45-b904-47b0-8c7e-f1913615d37d.json create mode 100644 change/@fluentui-react-tooltip-6edcabb9-7b8e-4f0a-bd3e-4644c682e984.json create mode 100644 change/@fluentui-react-tree-30c34404-dee2-4737-b6fe-69fcb16e5ec9.json create mode 100644 change/@fluentui-react-utilities-0030f645-2670-45b6-82f4-139b3fd4e2df.json create mode 100644 change/@fluentui-react-virtualizer-78a2739c-07f2-4ac8-840f-53a7dc62c7a0.json create mode 100644 tools/workspace-plugin/src/generators/verify-peer-dependencies/README.md create mode 100644 tools/workspace-plugin/src/generators/verify-peer-dependencies/index.spec.ts create mode 100644 tools/workspace-plugin/src/generators/verify-peer-dependencies/index.ts create mode 100644 tools/workspace-plugin/src/generators/verify-peer-dependencies/schema.json create mode 100644 tools/workspace-plugin/src/generators/verify-peer-dependencies/schema.ts diff --git a/.github/workflows/pr.yml b/.github/workflows/pr.yml index 300a003ca35d2e..0328489fb09821 100644 --- a/.github/workflows/pr.yml +++ b/.github/workflows/pr.yml @@ -54,6 +54,7 @@ jobs: yarn nx sync:check yarn nx g @fluentui/workspace-plugin:tsconfig-base-all --verify yarn nx g @fluentui/workspace-plugin:normalize-package-dependencies --verify + yarn nx g @fluentui/workspace-plugin:verify-peer-dependencies --tag=vNext - name: Type-check just.config.ts files run: | diff --git a/change/@fluentui-eslint-plugin-react-components-f5fbc283-8af7-439c-ab67-1ae1812d3609.json b/change/@fluentui-eslint-plugin-react-components-f5fbc283-8af7-439c-ab67-1ae1812d3609.json new file mode 100644 index 00000000000000..fb4cb438abaf27 --- /dev/null +++ b/change/@fluentui-eslint-plugin-react-components-f5fbc283-8af7-439c-ab67-1ae1812d3609.json @@ -0,0 +1,7 @@ +{ + "type": "patch", + "comment": "fix: narrow eslint and typescript peer ranges to what @typescript-eslint/utils supports", + "packageName": "@fluentui/eslint-plugin-react-components", + "email": "martinhochel@microsoft.com", + "dependentChangeType": "patch" +} diff --git a/change/@fluentui-global-context-6b834c53-0002-4662-9608-abcd2e57e29f.json b/change/@fluentui-global-context-6b834c53-0002-4662-9608-abcd2e57e29f.json new file mode 100644 index 00000000000000..048c3b531ed6f5 --- /dev/null +++ b/change/@fluentui-global-context-6b834c53-0002-4662-9608-abcd2e57e29f.json @@ -0,0 +1,7 @@ +{ + "type": "prerelease", + "comment": "fix: remove unused react-dom and @types/react-dom peer dependencies, mark @types/react as optional", + "packageName": "@fluentui/global-context", + "email": "martinhochel@microsoft.com", + "dependentChangeType": "patch" +} diff --git a/change/@fluentui-react-accordion-47016221-dd77-4342-9e26-596f685e9791.json b/change/@fluentui-react-accordion-47016221-dd77-4342-9e26-596f685e9791.json new file mode 100644 index 00000000000000..e961f29c95d6a3 --- /dev/null +++ b/change/@fluentui-react-accordion-47016221-dd77-4342-9e26-596f685e9791.json @@ -0,0 +1,7 @@ +{ + "type": "patch", + "comment": "fix: remove unused react-dom and @types/react-dom peer dependencies, mark @types/react as optional", + "packageName": "@fluentui/react-accordion", + "email": "martinhochel@microsoft.com", + "dependentChangeType": "patch" +} diff --git a/change/@fluentui-react-alert-815cc4bf-093b-439c-8bf5-67ec353e4a24.json b/change/@fluentui-react-alert-815cc4bf-093b-439c-8bf5-67ec353e4a24.json new file mode 100644 index 00000000000000..dd5f9764b559eb --- /dev/null +++ b/change/@fluentui-react-alert-815cc4bf-093b-439c-8bf5-67ec353e4a24.json @@ -0,0 +1,7 @@ +{ + "type": "prerelease", + "comment": "fix: remove unused react-dom and @types/react-dom peer dependencies, mark @types/react as optional", + "packageName": "@fluentui/react-alert", + "email": "martinhochel@microsoft.com", + "dependentChangeType": "patch" +} diff --git a/change/@fluentui-react-aria-e8de6782-14f3-4846-a69d-1d1c103f85f9.json b/change/@fluentui-react-aria-e8de6782-14f3-4846-a69d-1d1c103f85f9.json new file mode 100644 index 00000000000000..3f7b8b16fdd419 --- /dev/null +++ b/change/@fluentui-react-aria-e8de6782-14f3-4846-a69d-1d1c103f85f9.json @@ -0,0 +1,7 @@ +{ + "type": "patch", + "comment": "fix: remove unused react-dom and @types/react-dom peer dependencies, mark @types/react as optional", + "packageName": "@fluentui/react-aria", + "email": "martinhochel@microsoft.com", + "dependentChangeType": "patch" +} diff --git a/change/@fluentui-react-avatar-e8e50831-03dd-4005-af30-5882d203be97.json b/change/@fluentui-react-avatar-e8e50831-03dd-4005-af30-5882d203be97.json new file mode 100644 index 00000000000000..87d76640ccbc79 --- /dev/null +++ b/change/@fluentui-react-avatar-e8e50831-03dd-4005-af30-5882d203be97.json @@ -0,0 +1,7 @@ +{ + "type": "patch", + "comment": "fix: remove unused react-dom and @types/react-dom peer dependencies, mark @types/react as optional", + "packageName": "@fluentui/react-avatar", + "email": "martinhochel@microsoft.com", + "dependentChangeType": "patch" +} diff --git a/change/@fluentui-react-badge-ed921271-69d8-4a49-9994-9906029d3db7.json b/change/@fluentui-react-badge-ed921271-69d8-4a49-9994-9906029d3db7.json new file mode 100644 index 00000000000000..585ea0bd86fa16 --- /dev/null +++ b/change/@fluentui-react-badge-ed921271-69d8-4a49-9994-9906029d3db7.json @@ -0,0 +1,7 @@ +{ + "type": "patch", + "comment": "fix: remove unused react-dom and @types/react-dom peer dependencies, mark @types/react as optional", + "packageName": "@fluentui/react-badge", + "email": "martinhochel@microsoft.com", + "dependentChangeType": "patch" +} diff --git a/change/@fluentui-react-breadcrumb-c5ff67d8-3e3c-49c5-a8f4-8da21af030aa.json b/change/@fluentui-react-breadcrumb-c5ff67d8-3e3c-49c5-a8f4-8da21af030aa.json new file mode 100644 index 00000000000000..9cff00876569ab --- /dev/null +++ b/change/@fluentui-react-breadcrumb-c5ff67d8-3e3c-49c5-a8f4-8da21af030aa.json @@ -0,0 +1,7 @@ +{ + "type": "patch", + "comment": "fix: remove unused react-dom and @types/react-dom peer dependencies, mark @types/react as optional", + "packageName": "@fluentui/react-breadcrumb", + "email": "martinhochel@microsoft.com", + "dependentChangeType": "patch" +} diff --git a/change/@fluentui-react-button-9911881f-4094-4530-b026-70de0edacf05.json b/change/@fluentui-react-button-9911881f-4094-4530-b026-70de0edacf05.json new file mode 100644 index 00000000000000..ff260683ab1b30 --- /dev/null +++ b/change/@fluentui-react-button-9911881f-4094-4530-b026-70de0edacf05.json @@ -0,0 +1,7 @@ +{ + "type": "patch", + "comment": "fix: remove unused react-dom and @types/react-dom peer dependencies, mark @types/react as optional", + "packageName": "@fluentui/react-button", + "email": "martinhochel@microsoft.com", + "dependentChangeType": "patch" +} diff --git a/change/@fluentui-react-calendar-compat-161a52ab-f970-457a-9b94-510b92c09ef6.json b/change/@fluentui-react-calendar-compat-161a52ab-f970-457a-9b94-510b92c09ef6.json new file mode 100644 index 00000000000000..68b95fa017bce8 --- /dev/null +++ b/change/@fluentui-react-calendar-compat-161a52ab-f970-457a-9b94-510b92c09ef6.json @@ -0,0 +1,7 @@ +{ + "type": "patch", + "comment": "fix: remove unused react-dom and @types/react-dom peer dependencies, mark @types/react as optional", + "packageName": "@fluentui/react-calendar-compat", + "email": "martinhochel@microsoft.com", + "dependentChangeType": "patch" +} diff --git a/change/@fluentui-react-card-3b303453-cab2-4482-98fb-6b9207684004.json b/change/@fluentui-react-card-3b303453-cab2-4482-98fb-6b9207684004.json new file mode 100644 index 00000000000000..15f78884141db0 --- /dev/null +++ b/change/@fluentui-react-card-3b303453-cab2-4482-98fb-6b9207684004.json @@ -0,0 +1,7 @@ +{ + "type": "patch", + "comment": "fix: remove unused react-dom and @types/react-dom peer dependencies, mark @types/react as optional", + "packageName": "@fluentui/react-card", + "email": "martinhochel@microsoft.com", + "dependentChangeType": "patch" +} diff --git a/change/@fluentui-react-carousel-f1560a48-425b-4068-8fd8-ac2d127df2e2.json b/change/@fluentui-react-carousel-f1560a48-425b-4068-8fd8-ac2d127df2e2.json new file mode 100644 index 00000000000000..3cb76cc6f3fca9 --- /dev/null +++ b/change/@fluentui-react-carousel-f1560a48-425b-4068-8fd8-ac2d127df2e2.json @@ -0,0 +1,7 @@ +{ + "type": "patch", + "comment": "fix: remove unused react-dom and @types/react-dom peer dependencies, mark @types/react as optional", + "packageName": "@fluentui/react-carousel", + "email": "martinhochel@microsoft.com", + "dependentChangeType": "patch" +} diff --git a/change/@fluentui-react-checkbox-8f0d86e5-d848-4c12-988c-93497851769e.json b/change/@fluentui-react-checkbox-8f0d86e5-d848-4c12-988c-93497851769e.json new file mode 100644 index 00000000000000..fb1707b9229a98 --- /dev/null +++ b/change/@fluentui-react-checkbox-8f0d86e5-d848-4c12-988c-93497851769e.json @@ -0,0 +1,7 @@ +{ + "type": "patch", + "comment": "fix: remove unused react-dom and @types/react-dom peer dependencies, mark @types/react as optional", + "packageName": "@fluentui/react-checkbox", + "email": "martinhochel@microsoft.com", + "dependentChangeType": "patch" +} diff --git a/change/@fluentui-react-color-picker-194b508c-81a0-4476-8b9f-e6d44a3577be.json b/change/@fluentui-react-color-picker-194b508c-81a0-4476-8b9f-e6d44a3577be.json new file mode 100644 index 00000000000000..3b4ce03426d443 --- /dev/null +++ b/change/@fluentui-react-color-picker-194b508c-81a0-4476-8b9f-e6d44a3577be.json @@ -0,0 +1,7 @@ +{ + "type": "patch", + "comment": "fix: remove unused react-dom and @types/react-dom peer dependencies, mark @types/react as optional", + "packageName": "@fluentui/react-color-picker", + "email": "martinhochel@microsoft.com", + "dependentChangeType": "patch" +} diff --git a/change/@fluentui-react-combobox-b18c6640-06b2-48af-8e30-55c72525c44a.json b/change/@fluentui-react-combobox-b18c6640-06b2-48af-8e30-55c72525c44a.json new file mode 100644 index 00000000000000..cc77dc98e921a8 --- /dev/null +++ b/change/@fluentui-react-combobox-b18c6640-06b2-48af-8e30-55c72525c44a.json @@ -0,0 +1,7 @@ +{ + "type": "patch", + "comment": "fix: remove unused @types/react-dom peer dependency, mark @types/react as optional", + "packageName": "@fluentui/react-combobox", + "email": "martinhochel@microsoft.com", + "dependentChangeType": "patch" +} diff --git a/change/@fluentui-react-components-8404163f-5057-4c9a-8dbd-53068773c92c.json b/change/@fluentui-react-components-8404163f-5057-4c9a-8dbd-53068773c92c.json new file mode 100644 index 00000000000000..9064beca9bba10 --- /dev/null +++ b/change/@fluentui-react-components-8404163f-5057-4c9a-8dbd-53068773c92c.json @@ -0,0 +1,7 @@ +{ + "type": "patch", + "comment": "fix: remove unused react-dom and @types/react-dom peer dependencies, mark @types/react as optional", + "packageName": "@fluentui/react-components", + "email": "martinhochel@microsoft.com", + "dependentChangeType": "patch" +} diff --git a/change/@fluentui-react-conformance-griffel-d995ca0d-3b46-4adb-b1f5-e7d060318c0e.json b/change/@fluentui-react-conformance-griffel-d995ca0d-3b46-4adb-b1f5-e7d060318c0e.json new file mode 100644 index 00000000000000..d275a7a27c8d21 --- /dev/null +++ b/change/@fluentui-react-conformance-griffel-d995ca0d-3b46-4adb-b1f5-e7d060318c0e.json @@ -0,0 +1,7 @@ +{ + "type": "patch", + "comment": "fix: declare react-dom peer dependency (used at runtime), remove unused @types/react-dom, mark @types/react as optional", + "packageName": "@fluentui/react-conformance-griffel", + "email": "martinhochel@microsoft.com", + "dependentChangeType": "patch" +} diff --git a/change/@fluentui-react-context-selector-f8ef8024-4b0a-4e18-92e6-9f1add6b3656.json b/change/@fluentui-react-context-selector-f8ef8024-4b0a-4e18-92e6-9f1add6b3656.json new file mode 100644 index 00000000000000..706c8086cb00df --- /dev/null +++ b/change/@fluentui-react-context-selector-f8ef8024-4b0a-4e18-92e6-9f1add6b3656.json @@ -0,0 +1,7 @@ +{ + "type": "patch", + "comment": "fix: remove unused react-dom and @types/react-dom peer dependencies, mark @types/react as optional", + "packageName": "@fluentui/react-context-selector", + "email": "martinhochel@microsoft.com", + "dependentChangeType": "patch" +} diff --git a/change/@fluentui-react-datepicker-compat-cdf7576b-9649-4bcb-aac5-5bf78c5f0b08.json b/change/@fluentui-react-datepicker-compat-cdf7576b-9649-4bcb-aac5-5bf78c5f0b08.json new file mode 100644 index 00000000000000..260f2fa1bf36ca --- /dev/null +++ b/change/@fluentui-react-datepicker-compat-cdf7576b-9649-4bcb-aac5-5bf78c5f0b08.json @@ -0,0 +1,7 @@ +{ + "type": "patch", + "comment": "fix: remove unused react-dom and @types/react-dom peer dependencies, mark @types/react as optional", + "packageName": "@fluentui/react-datepicker-compat", + "email": "martinhochel@microsoft.com", + "dependentChangeType": "patch" +} diff --git a/change/@fluentui-react-dialog-a6e04818-a73a-4afe-8110-3e488f04c4e1.json b/change/@fluentui-react-dialog-a6e04818-a73a-4afe-8110-3e488f04c4e1.json new file mode 100644 index 00000000000000..9a44d443600e9e --- /dev/null +++ b/change/@fluentui-react-dialog-a6e04818-a73a-4afe-8110-3e488f04c4e1.json @@ -0,0 +1,7 @@ +{ + "type": "patch", + "comment": "fix: remove unused react-dom and @types/react-dom peer dependencies, mark @types/react as optional", + "packageName": "@fluentui/react-dialog", + "email": "martinhochel@microsoft.com", + "dependentChangeType": "patch" +} diff --git a/change/@fluentui-react-divider-9b3fedf5-8a69-4e4b-963f-4dda841882e1.json b/change/@fluentui-react-divider-9b3fedf5-8a69-4e4b-963f-4dda841882e1.json new file mode 100644 index 00000000000000..d2dd323860c42c --- /dev/null +++ b/change/@fluentui-react-divider-9b3fedf5-8a69-4e4b-963f-4dda841882e1.json @@ -0,0 +1,7 @@ +{ + "type": "patch", + "comment": "fix: remove unused react-dom and @types/react-dom peer dependencies, mark @types/react as optional", + "packageName": "@fluentui/react-divider", + "email": "martinhochel@microsoft.com", + "dependentChangeType": "patch" +} diff --git a/change/@fluentui-react-drawer-c7c1615e-b453-4679-bdd4-477058338ad6.json b/change/@fluentui-react-drawer-c7c1615e-b453-4679-bdd4-477058338ad6.json new file mode 100644 index 00000000000000..241ac1ba56ca38 --- /dev/null +++ b/change/@fluentui-react-drawer-c7c1615e-b453-4679-bdd4-477058338ad6.json @@ -0,0 +1,7 @@ +{ + "type": "patch", + "comment": "fix: remove unused react-dom and @types/react-dom peer dependencies, mark @types/react as optional", + "packageName": "@fluentui/react-drawer", + "email": "martinhochel@microsoft.com", + "dependentChangeType": "patch" +} diff --git a/change/@fluentui-react-field-31876e9f-a742-4338-a622-de5ab66cb1af.json b/change/@fluentui-react-field-31876e9f-a742-4338-a622-de5ab66cb1af.json new file mode 100644 index 00000000000000..58b79c3cd4fb25 --- /dev/null +++ b/change/@fluentui-react-field-31876e9f-a742-4338-a622-de5ab66cb1af.json @@ -0,0 +1,7 @@ +{ + "type": "patch", + "comment": "fix: remove unused react-dom and @types/react-dom peer dependencies, mark @types/react as optional", + "packageName": "@fluentui/react-field", + "email": "martinhochel@microsoft.com", + "dependentChangeType": "patch" +} diff --git a/change/@fluentui-react-headless-components-preview-42074f33-420a-4743-9ca6-6b5f6d53100f.json b/change/@fluentui-react-headless-components-preview-42074f33-420a-4743-9ca6-6b5f6d53100f.json new file mode 100644 index 00000000000000..128bc84489936e --- /dev/null +++ b/change/@fluentui-react-headless-components-preview-42074f33-420a-4743-9ca6-6b5f6d53100f.json @@ -0,0 +1,7 @@ +{ + "type": "patch", + "comment": "fix: remove unused react-dom and @types/react-dom peer dependencies, mark @types/react as optional", + "packageName": "@fluentui/react-headless-components-preview", + "email": "martinhochel@microsoft.com", + "dependentChangeType": "patch" +} diff --git a/change/@fluentui-react-icons-compat-67b35f45-9067-468f-b7af-0475a6655517.json b/change/@fluentui-react-icons-compat-67b35f45-9067-468f-b7af-0475a6655517.json new file mode 100644 index 00000000000000..72158eb50aa250 --- /dev/null +++ b/change/@fluentui-react-icons-compat-67b35f45-9067-468f-b7af-0475a6655517.json @@ -0,0 +1,7 @@ +{ + "type": "patch", + "comment": "fix: remove unused react-dom and @types/react-dom peer dependencies, mark @types/react as optional", + "packageName": "@fluentui/react-icons-compat", + "email": "martinhochel@microsoft.com", + "dependentChangeType": "patch" +} diff --git a/change/@fluentui-react-image-ed59c75b-69f5-497b-8037-6f0c73bf4a32.json b/change/@fluentui-react-image-ed59c75b-69f5-497b-8037-6f0c73bf4a32.json new file mode 100644 index 00000000000000..eb00d413ab09a8 --- /dev/null +++ b/change/@fluentui-react-image-ed59c75b-69f5-497b-8037-6f0c73bf4a32.json @@ -0,0 +1,7 @@ +{ + "type": "patch", + "comment": "fix: remove unused react-dom and @types/react-dom peer dependencies, mark @types/react as optional", + "packageName": "@fluentui/react-image", + "email": "martinhochel@microsoft.com", + "dependentChangeType": "patch" +} diff --git a/change/@fluentui-react-infobutton-b8b12d73-67d0-4fce-8e3e-b094cc08b8af.json b/change/@fluentui-react-infobutton-b8b12d73-67d0-4fce-8e3e-b094cc08b8af.json new file mode 100644 index 00000000000000..374efa30e7575b --- /dev/null +++ b/change/@fluentui-react-infobutton-b8b12d73-67d0-4fce-8e3e-b094cc08b8af.json @@ -0,0 +1,7 @@ +{ + "type": "prerelease", + "comment": "fix: remove unused react-dom and @types/react-dom peer dependencies, mark @types/react as optional", + "packageName": "@fluentui/react-infobutton", + "email": "martinhochel@microsoft.com", + "dependentChangeType": "patch" +} diff --git a/change/@fluentui-react-infolabel-de52210c-b6ad-4467-a039-2fe7170e39a0.json b/change/@fluentui-react-infolabel-de52210c-b6ad-4467-a039-2fe7170e39a0.json new file mode 100644 index 00000000000000..54ea6d60e05640 --- /dev/null +++ b/change/@fluentui-react-infolabel-de52210c-b6ad-4467-a039-2fe7170e39a0.json @@ -0,0 +1,7 @@ +{ + "type": "patch", + "comment": "fix: remove unused react-dom and @types/react-dom peer dependencies, mark @types/react as optional", + "packageName": "@fluentui/react-infolabel", + "email": "martinhochel@microsoft.com", + "dependentChangeType": "patch" +} diff --git a/change/@fluentui-react-input-81976a7e-de72-4567-9cf2-14ef20b47d23.json b/change/@fluentui-react-input-81976a7e-de72-4567-9cf2-14ef20b47d23.json new file mode 100644 index 00000000000000..e83c79855a8099 --- /dev/null +++ b/change/@fluentui-react-input-81976a7e-de72-4567-9cf2-14ef20b47d23.json @@ -0,0 +1,7 @@ +{ + "type": "patch", + "comment": "fix: remove unused react-dom and @types/react-dom peer dependencies, mark @types/react as optional", + "packageName": "@fluentui/react-input", + "email": "martinhochel@microsoft.com", + "dependentChangeType": "patch" +} diff --git a/change/@fluentui-react-jsx-runtime-7f5626fc-f8e1-4e58-9a3b-93b89efdc9b5.json b/change/@fluentui-react-jsx-runtime-7f5626fc-f8e1-4e58-9a3b-93b89efdc9b5.json new file mode 100644 index 00000000000000..8a42755c2f62a6 --- /dev/null +++ b/change/@fluentui-react-jsx-runtime-7f5626fc-f8e1-4e58-9a3b-93b89efdc9b5.json @@ -0,0 +1,7 @@ +{ + "type": "patch", + "comment": "chore: mark @types/react peer dependency as optional", + "packageName": "@fluentui/react-jsx-runtime", + "email": "martinhochel@microsoft.com", + "dependentChangeType": "patch" +} diff --git a/change/@fluentui-react-label-04f71f76-d074-4861-a54c-23a2910c221a.json b/change/@fluentui-react-label-04f71f76-d074-4861-a54c-23a2910c221a.json new file mode 100644 index 00000000000000..d9b7861abbdb79 --- /dev/null +++ b/change/@fluentui-react-label-04f71f76-d074-4861-a54c-23a2910c221a.json @@ -0,0 +1,7 @@ +{ + "type": "patch", + "comment": "fix: remove unused react-dom and @types/react-dom peer dependencies, mark @types/react as optional", + "packageName": "@fluentui/react-label", + "email": "martinhochel@microsoft.com", + "dependentChangeType": "patch" +} diff --git a/change/@fluentui-react-link-01056834-d048-4b21-a081-fd67aaf8fd86.json b/change/@fluentui-react-link-01056834-d048-4b21-a081-fd67aaf8fd86.json new file mode 100644 index 00000000000000..b5c28032712ca2 --- /dev/null +++ b/change/@fluentui-react-link-01056834-d048-4b21-a081-fd67aaf8fd86.json @@ -0,0 +1,7 @@ +{ + "type": "patch", + "comment": "fix: remove unused react-dom and @types/react-dom peer dependencies, mark @types/react as optional", + "packageName": "@fluentui/react-link", + "email": "martinhochel@microsoft.com", + "dependentChangeType": "patch" +} diff --git a/change/@fluentui-react-list-7b332c08-d173-4b8d-8075-893f6ea909d1.json b/change/@fluentui-react-list-7b332c08-d173-4b8d-8075-893f6ea909d1.json new file mode 100644 index 00000000000000..8c8481a9dfc3cc --- /dev/null +++ b/change/@fluentui-react-list-7b332c08-d173-4b8d-8075-893f6ea909d1.json @@ -0,0 +1,7 @@ +{ + "type": "patch", + "comment": "fix: remove unused react-dom and @types/react-dom peer dependencies, mark @types/react as optional", + "packageName": "@fluentui/react-list", + "email": "martinhochel@microsoft.com", + "dependentChangeType": "patch" +} diff --git a/change/@fluentui-react-menu-f5b61c71-539e-4784-a120-cb2c8aee0f76.json b/change/@fluentui-react-menu-f5b61c71-539e-4784-a120-cb2c8aee0f76.json new file mode 100644 index 00000000000000..9d5732871418af --- /dev/null +++ b/change/@fluentui-react-menu-f5b61c71-539e-4784-a120-cb2c8aee0f76.json @@ -0,0 +1,7 @@ +{ + "type": "patch", + "comment": "fix: remove unused react-dom and @types/react-dom peer dependencies, mark @types/react as optional", + "packageName": "@fluentui/react-menu", + "email": "martinhochel@microsoft.com", + "dependentChangeType": "patch" +} diff --git a/change/@fluentui-react-menu-grid-preview-1efd184e-18d8-437a-b3fa-eead17412ed3.json b/change/@fluentui-react-menu-grid-preview-1efd184e-18d8-437a-b3fa-eead17412ed3.json new file mode 100644 index 00000000000000..9397a4d6239dc1 --- /dev/null +++ b/change/@fluentui-react-menu-grid-preview-1efd184e-18d8-437a-b3fa-eead17412ed3.json @@ -0,0 +1,7 @@ +{ + "type": "patch", + "comment": "fix: remove unused react-dom and @types/react-dom peer dependencies, mark @types/react as optional", + "packageName": "@fluentui/react-menu-grid-preview", + "email": "martinhochel@microsoft.com", + "dependentChangeType": "patch" +} diff --git a/change/@fluentui-react-message-bar-6f7564eb-0b36-4392-94fe-665d623bd789.json b/change/@fluentui-react-message-bar-6f7564eb-0b36-4392-94fe-665d623bd789.json new file mode 100644 index 00000000000000..305ae9bdb05d48 --- /dev/null +++ b/change/@fluentui-react-message-bar-6f7564eb-0b36-4392-94fe-665d623bd789.json @@ -0,0 +1,7 @@ +{ + "type": "patch", + "comment": "fix: remove unused react-dom and @types/react-dom peer dependencies, mark @types/react as optional", + "packageName": "@fluentui/react-message-bar", + "email": "martinhochel@microsoft.com", + "dependentChangeType": "patch" +} diff --git a/change/@fluentui-react-migration-v0-v9-c50c8034-feed-439d-a88f-0e16de50462b.json b/change/@fluentui-react-migration-v0-v9-c50c8034-feed-439d-a88f-0e16de50462b.json new file mode 100644 index 00000000000000..96fb0001938e8d --- /dev/null +++ b/change/@fluentui-react-migration-v0-v9-c50c8034-feed-439d-a88f-0e16de50462b.json @@ -0,0 +1,7 @@ +{ + "type": "patch", + "comment": "fix: remove unused react-dom and @types/react-dom peer dependencies, mark @types/react as optional", + "packageName": "@fluentui/react-migration-v0-v9", + "email": "martinhochel@microsoft.com", + "dependentChangeType": "patch" +} diff --git a/change/@fluentui-react-migration-v8-v9-8f5a7690-9be4-46e9-ace7-94a159e676ae.json b/change/@fluentui-react-migration-v8-v9-8f5a7690-9be4-46e9-ace7-94a159e676ae.json new file mode 100644 index 00000000000000..ad8990085014a3 --- /dev/null +++ b/change/@fluentui-react-migration-v8-v9-8f5a7690-9be4-46e9-ace7-94a159e676ae.json @@ -0,0 +1,7 @@ +{ + "type": "patch", + "comment": "fix: remove unused react-dom and @types/react-dom peer dependencies, mark @types/react as optional", + "packageName": "@fluentui/react-migration-v8-v9", + "email": "martinhochel@microsoft.com", + "dependentChangeType": "patch" +} diff --git a/change/@fluentui-react-motion-47ee4237-13e1-4967-b12b-58df4b967255.json b/change/@fluentui-react-motion-47ee4237-13e1-4967-b12b-58df4b967255.json new file mode 100644 index 00000000000000..ebba9100295e02 --- /dev/null +++ b/change/@fluentui-react-motion-47ee4237-13e1-4967-b12b-58df4b967255.json @@ -0,0 +1,7 @@ +{ + "type": "patch", + "comment": "fix: remove unused react-dom and @types/react-dom peer dependencies, mark @types/react as optional", + "packageName": "@fluentui/react-motion", + "email": "martinhochel@microsoft.com", + "dependentChangeType": "patch" +} diff --git a/change/@fluentui-react-motion-components-preview-821fff2e-c247-4ea2-8b4f-e539b9071158.json b/change/@fluentui-react-motion-components-preview-821fff2e-c247-4ea2-8b4f-e539b9071158.json new file mode 100644 index 00000000000000..a02c683ea0a287 --- /dev/null +++ b/change/@fluentui-react-motion-components-preview-821fff2e-c247-4ea2-8b4f-e539b9071158.json @@ -0,0 +1,7 @@ +{ + "type": "patch", + "comment": "fix: remove unused react-dom and @types/react-dom peer dependencies, mark @types/react as optional", + "packageName": "@fluentui/react-motion-components-preview", + "email": "martinhochel@microsoft.com", + "dependentChangeType": "patch" +} diff --git a/change/@fluentui-react-nav-8415ea04-5866-43db-9366-a04de3a5545e.json b/change/@fluentui-react-nav-8415ea04-5866-43db-9366-a04de3a5545e.json new file mode 100644 index 00000000000000..f764110ab79c49 --- /dev/null +++ b/change/@fluentui-react-nav-8415ea04-5866-43db-9366-a04de3a5545e.json @@ -0,0 +1,7 @@ +{ + "type": "patch", + "comment": "fix: remove unused react-dom and @types/react-dom peer dependencies, mark @types/react as optional", + "packageName": "@fluentui/react-nav", + "email": "martinhochel@microsoft.com", + "dependentChangeType": "patch" +} diff --git a/change/@fluentui-react-overflow-672739dd-cc0f-4ca1-90ea-5d0e49b74a0f.json b/change/@fluentui-react-overflow-672739dd-cc0f-4ca1-90ea-5d0e49b74a0f.json new file mode 100644 index 00000000000000..6ae9ef2f11b38a --- /dev/null +++ b/change/@fluentui-react-overflow-672739dd-cc0f-4ca1-90ea-5d0e49b74a0f.json @@ -0,0 +1,7 @@ +{ + "type": "patch", + "comment": "fix: remove unused react-dom and @types/react-dom peer dependencies, mark @types/react as optional", + "packageName": "@fluentui/react-overflow", + "email": "martinhochel@microsoft.com", + "dependentChangeType": "patch" +} diff --git a/change/@fluentui-react-persona-8577fe8b-e878-4c48-83c3-967dd4ab91bd.json b/change/@fluentui-react-persona-8577fe8b-e878-4c48-83c3-967dd4ab91bd.json new file mode 100644 index 00000000000000..511cadae3fc7dd --- /dev/null +++ b/change/@fluentui-react-persona-8577fe8b-e878-4c48-83c3-967dd4ab91bd.json @@ -0,0 +1,7 @@ +{ + "type": "patch", + "comment": "fix: remove unused react-dom and @types/react-dom peer dependencies, mark @types/react as optional", + "packageName": "@fluentui/react-persona", + "email": "martinhochel@microsoft.com", + "dependentChangeType": "patch" +} diff --git a/change/@fluentui-react-popover-c3a43ff0-24e1-4ff4-a669-3ed12e3a6400.json b/change/@fluentui-react-popover-c3a43ff0-24e1-4ff4-a669-3ed12e3a6400.json new file mode 100644 index 00000000000000..099e9af24dced3 --- /dev/null +++ b/change/@fluentui-react-popover-c3a43ff0-24e1-4ff4-a669-3ed12e3a6400.json @@ -0,0 +1,7 @@ +{ + "type": "patch", + "comment": "fix: remove unused react-dom and @types/react-dom peer dependencies, mark @types/react as optional", + "packageName": "@fluentui/react-popover", + "email": "martinhochel@microsoft.com", + "dependentChangeType": "patch" +} diff --git a/change/@fluentui-react-portal-1bf5e5bd-40a0-48f4-a3a9-9c80e4ddd909.json b/change/@fluentui-react-portal-1bf5e5bd-40a0-48f4-a3a9-9c80e4ddd909.json new file mode 100644 index 00000000000000..5425c3c8030a29 --- /dev/null +++ b/change/@fluentui-react-portal-1bf5e5bd-40a0-48f4-a3a9-9c80e4ddd909.json @@ -0,0 +1,7 @@ +{ + "type": "patch", + "comment": "fix: remove unused @types/react-dom peer dependency, mark @types/react as optional", + "packageName": "@fluentui/react-portal", + "email": "martinhochel@microsoft.com", + "dependentChangeType": "patch" +} diff --git a/change/@fluentui-react-portal-compat-c704b8a9-46ad-4695-ac51-dad4193c924d.json b/change/@fluentui-react-portal-compat-c704b8a9-46ad-4695-ac51-dad4193c924d.json new file mode 100644 index 00000000000000..0d53b1bdb195fc --- /dev/null +++ b/change/@fluentui-react-portal-compat-c704b8a9-46ad-4695-ac51-dad4193c924d.json @@ -0,0 +1,7 @@ +{ + "type": "patch", + "comment": "chore: mark @types/react peer dependency as optional", + "packageName": "@fluentui/react-portal-compat", + "email": "martinhochel@microsoft.com", + "dependentChangeType": "patch" +} diff --git a/change/@fluentui-react-portal-compat-context-14c6cc2d-653c-4af1-ab22-b7d6e18be365.json b/change/@fluentui-react-portal-compat-context-14c6cc2d-653c-4af1-ab22-b7d6e18be365.json new file mode 100644 index 00000000000000..b934d10b1f8586 --- /dev/null +++ b/change/@fluentui-react-portal-compat-context-14c6cc2d-653c-4af1-ab22-b7d6e18be365.json @@ -0,0 +1,7 @@ +{ + "type": "patch", + "comment": "chore: mark @types/react peer dependency as optional", + "packageName": "@fluentui/react-portal-compat-context", + "email": "martinhochel@microsoft.com", + "dependentChangeType": "patch" +} diff --git a/change/@fluentui-react-positioning-38fb6b5c-ca52-4426-83d4-696a92fcaddc.json b/change/@fluentui-react-positioning-38fb6b5c-ca52-4426-83d4-696a92fcaddc.json new file mode 100644 index 00000000000000..82ca6d021a33d7 --- /dev/null +++ b/change/@fluentui-react-positioning-38fb6b5c-ca52-4426-83d4-696a92fcaddc.json @@ -0,0 +1,7 @@ +{ + "type": "patch", + "comment": "fix: remove unused react-dom and @types/react-dom peer dependencies, mark @types/react as optional, require use-sync-external-store ^1.4.0 for react 19 support", + "packageName": "@fluentui/react-positioning", + "email": "martinhochel@microsoft.com", + "dependentChangeType": "patch" +} diff --git a/change/@fluentui-react-progress-0b4fe366-abed-429b-865b-09ee3e5387a8.json b/change/@fluentui-react-progress-0b4fe366-abed-429b-865b-09ee3e5387a8.json new file mode 100644 index 00000000000000..e8ca8144f1a83d --- /dev/null +++ b/change/@fluentui-react-progress-0b4fe366-abed-429b-865b-09ee3e5387a8.json @@ -0,0 +1,7 @@ +{ + "type": "patch", + "comment": "fix: remove unused react-dom and @types/react-dom peer dependencies, mark @types/react as optional", + "packageName": "@fluentui/react-progress", + "email": "martinhochel@microsoft.com", + "dependentChangeType": "patch" +} diff --git a/change/@fluentui-react-provider-d9dc71fd-0114-41c1-b457-e93c4a73731c.json b/change/@fluentui-react-provider-d9dc71fd-0114-41c1-b457-e93c4a73731c.json new file mode 100644 index 00000000000000..948efb32202ac0 --- /dev/null +++ b/change/@fluentui-react-provider-d9dc71fd-0114-41c1-b457-e93c4a73731c.json @@ -0,0 +1,7 @@ +{ + "type": "patch", + "comment": "fix: remove unused react-dom and @types/react-dom peer dependencies, mark @types/react as optional", + "packageName": "@fluentui/react-provider", + "email": "martinhochel@microsoft.com", + "dependentChangeType": "patch" +} diff --git a/change/@fluentui-react-radio-dd8cfb16-b865-4a4c-aa37-e814c73ea800.json b/change/@fluentui-react-radio-dd8cfb16-b865-4a4c-aa37-e814c73ea800.json new file mode 100644 index 00000000000000..e443d3dfb6f827 --- /dev/null +++ b/change/@fluentui-react-radio-dd8cfb16-b865-4a4c-aa37-e814c73ea800.json @@ -0,0 +1,7 @@ +{ + "type": "patch", + "comment": "fix: remove unused react-dom and @types/react-dom peer dependencies, mark @types/react as optional", + "packageName": "@fluentui/react-radio", + "email": "martinhochel@microsoft.com", + "dependentChangeType": "patch" +} diff --git a/change/@fluentui-react-rating-7a9b8b85-a90c-4863-bf28-f3b3cf01677b.json b/change/@fluentui-react-rating-7a9b8b85-a90c-4863-bf28-f3b3cf01677b.json new file mode 100644 index 00000000000000..53d4987592a58e --- /dev/null +++ b/change/@fluentui-react-rating-7a9b8b85-a90c-4863-bf28-f3b3cf01677b.json @@ -0,0 +1,7 @@ +{ + "type": "patch", + "comment": "fix: remove unused react-dom and @types/react-dom peer dependencies, mark @types/react as optional", + "packageName": "@fluentui/react-rating", + "email": "martinhochel@microsoft.com", + "dependentChangeType": "patch" +} diff --git a/change/@fluentui-react-search-0738ede0-38e3-478f-b91e-f8172e314536.json b/change/@fluentui-react-search-0738ede0-38e3-478f-b91e-f8172e314536.json new file mode 100644 index 00000000000000..22b81bd0250dfc --- /dev/null +++ b/change/@fluentui-react-search-0738ede0-38e3-478f-b91e-f8172e314536.json @@ -0,0 +1,7 @@ +{ + "type": "patch", + "comment": "fix: remove unused react-dom and @types/react-dom peer dependencies, mark @types/react as optional", + "packageName": "@fluentui/react-search", + "email": "martinhochel@microsoft.com", + "dependentChangeType": "patch" +} diff --git a/change/@fluentui-react-select-2711ae2d-e5a9-45bb-9ad1-6bd82d1bff39.json b/change/@fluentui-react-select-2711ae2d-e5a9-45bb-9ad1-6bd82d1bff39.json new file mode 100644 index 00000000000000..28954752438131 --- /dev/null +++ b/change/@fluentui-react-select-2711ae2d-e5a9-45bb-9ad1-6bd82d1bff39.json @@ -0,0 +1,7 @@ +{ + "type": "patch", + "comment": "fix: remove unused react-dom and @types/react-dom peer dependencies, mark @types/react as optional", + "packageName": "@fluentui/react-select", + "email": "martinhochel@microsoft.com", + "dependentChangeType": "patch" +} diff --git a/change/@fluentui-react-shared-contexts-26570b93-cc3e-4d6d-ad3b-a58cd27c965c.json b/change/@fluentui-react-shared-contexts-26570b93-cc3e-4d6d-ad3b-a58cd27c965c.json new file mode 100644 index 00000000000000..e36498106d22ef --- /dev/null +++ b/change/@fluentui-react-shared-contexts-26570b93-cc3e-4d6d-ad3b-a58cd27c965c.json @@ -0,0 +1,7 @@ +{ + "type": "patch", + "comment": "chore: mark @types/react peer dependency as optional", + "packageName": "@fluentui/react-shared-contexts", + "email": "martinhochel@microsoft.com", + "dependentChangeType": "patch" +} diff --git a/change/@fluentui-react-skeleton-7a846876-d663-403b-ab06-f884d84b66bb.json b/change/@fluentui-react-skeleton-7a846876-d663-403b-ab06-f884d84b66bb.json new file mode 100644 index 00000000000000..a106eceb3c814f --- /dev/null +++ b/change/@fluentui-react-skeleton-7a846876-d663-403b-ab06-f884d84b66bb.json @@ -0,0 +1,7 @@ +{ + "type": "patch", + "comment": "fix: remove unused react-dom and @types/react-dom peer dependencies, mark @types/react as optional", + "packageName": "@fluentui/react-skeleton", + "email": "martinhochel@microsoft.com", + "dependentChangeType": "patch" +} diff --git a/change/@fluentui-react-slider-04e61d41-7b68-4e10-b1ab-b2b854dc3995.json b/change/@fluentui-react-slider-04e61d41-7b68-4e10-b1ab-b2b854dc3995.json new file mode 100644 index 00000000000000..35cfae67d6e379 --- /dev/null +++ b/change/@fluentui-react-slider-04e61d41-7b68-4e10-b1ab-b2b854dc3995.json @@ -0,0 +1,7 @@ +{ + "type": "patch", + "comment": "fix: remove unused react-dom and @types/react-dom peer dependencies, mark @types/react as optional", + "packageName": "@fluentui/react-slider", + "email": "martinhochel@microsoft.com", + "dependentChangeType": "patch" +} diff --git a/change/@fluentui-react-spinbutton-00c069ed-91c3-4a84-b0b1-86c4bc106a13.json b/change/@fluentui-react-spinbutton-00c069ed-91c3-4a84-b0b1-86c4bc106a13.json new file mode 100644 index 00000000000000..1d2c779ea78b69 --- /dev/null +++ b/change/@fluentui-react-spinbutton-00c069ed-91c3-4a84-b0b1-86c4bc106a13.json @@ -0,0 +1,7 @@ +{ + "type": "patch", + "comment": "fix: remove unused react-dom and @types/react-dom peer dependencies, mark @types/react as optional", + "packageName": "@fluentui/react-spinbutton", + "email": "martinhochel@microsoft.com", + "dependentChangeType": "patch" +} diff --git a/change/@fluentui-react-spinner-8d7db78b-4765-4f74-8d3f-75419c083262.json b/change/@fluentui-react-spinner-8d7db78b-4765-4f74-8d3f-75419c083262.json new file mode 100644 index 00000000000000..3ae0d721d9a62f --- /dev/null +++ b/change/@fluentui-react-spinner-8d7db78b-4765-4f74-8d3f-75419c083262.json @@ -0,0 +1,7 @@ +{ + "type": "patch", + "comment": "fix: remove unused react-dom and @types/react-dom peer dependencies, mark @types/react as optional", + "packageName": "@fluentui/react-spinner", + "email": "martinhochel@microsoft.com", + "dependentChangeType": "patch" +} diff --git a/change/@fluentui-react-storybook-addon-bf6bd820-5f10-4f0a-9b4d-4c494f194561.json b/change/@fluentui-react-storybook-addon-bf6bd820-5f10-4f0a-9b4d-4c494f194561.json new file mode 100644 index 00000000000000..eeb77a901bd57e --- /dev/null +++ b/change/@fluentui-react-storybook-addon-bf6bd820-5f10-4f0a-9b4d-4c494f194561.json @@ -0,0 +1,7 @@ +{ + "type": "patch", + "comment": "fix: remove unused react-dom and @types/react-dom peer dependencies, mark @types/react as optional", + "packageName": "@fluentui/react-storybook-addon", + "email": "martinhochel@microsoft.com", + "dependentChangeType": "patch" +} diff --git a/change/@fluentui-react-swatch-picker-e9a9729e-4ffd-47fb-9e09-e5897e6c7057.json b/change/@fluentui-react-swatch-picker-e9a9729e-4ffd-47fb-9e09-e5897e6c7057.json new file mode 100644 index 00000000000000..a25b6cb2e14a1a --- /dev/null +++ b/change/@fluentui-react-swatch-picker-e9a9729e-4ffd-47fb-9e09-e5897e6c7057.json @@ -0,0 +1,7 @@ +{ + "type": "patch", + "comment": "fix: remove unused react-dom and @types/react-dom peer dependencies, mark @types/react as optional", + "packageName": "@fluentui/react-swatch-picker", + "email": "martinhochel@microsoft.com", + "dependentChangeType": "patch" +} diff --git a/change/@fluentui-react-switch-e85ee204-7e82-47df-9908-c5cecdb94d63.json b/change/@fluentui-react-switch-e85ee204-7e82-47df-9908-c5cecdb94d63.json new file mode 100644 index 00000000000000..da8e71776f6e83 --- /dev/null +++ b/change/@fluentui-react-switch-e85ee204-7e82-47df-9908-c5cecdb94d63.json @@ -0,0 +1,7 @@ +{ + "type": "patch", + "comment": "fix: remove unused react-dom and @types/react-dom peer dependencies, mark @types/react as optional", + "packageName": "@fluentui/react-switch", + "email": "martinhochel@microsoft.com", + "dependentChangeType": "patch" +} diff --git a/change/@fluentui-react-table-d3135c79-0ae9-4458-be0c-748003ab5c13.json b/change/@fluentui-react-table-d3135c79-0ae9-4458-be0c-748003ab5c13.json new file mode 100644 index 00000000000000..ab15ec95b3ade9 --- /dev/null +++ b/change/@fluentui-react-table-d3135c79-0ae9-4458-be0c-748003ab5c13.json @@ -0,0 +1,7 @@ +{ + "type": "patch", + "comment": "fix: remove unused react-dom and @types/react-dom peer dependencies, mark @types/react as optional", + "packageName": "@fluentui/react-table", + "email": "martinhochel@microsoft.com", + "dependentChangeType": "patch" +} diff --git a/change/@fluentui-react-tabs-a0291350-8bc7-4f89-969c-2c320bc99017.json b/change/@fluentui-react-tabs-a0291350-8bc7-4f89-969c-2c320bc99017.json new file mode 100644 index 00000000000000..770bb276890a7f --- /dev/null +++ b/change/@fluentui-react-tabs-a0291350-8bc7-4f89-969c-2c320bc99017.json @@ -0,0 +1,7 @@ +{ + "type": "patch", + "comment": "fix: remove unused react-dom and @types/react-dom peer dependencies, mark @types/react as optional", + "packageName": "@fluentui/react-tabs", + "email": "martinhochel@microsoft.com", + "dependentChangeType": "patch" +} diff --git a/change/@fluentui-react-tabster-56d3cbaf-451d-4cd9-884c-1b84e6018939.json b/change/@fluentui-react-tabster-56d3cbaf-451d-4cd9-884c-1b84e6018939.json new file mode 100644 index 00000000000000..9f844cc720b35f --- /dev/null +++ b/change/@fluentui-react-tabster-56d3cbaf-451d-4cd9-884c-1b84e6018939.json @@ -0,0 +1,7 @@ +{ + "type": "patch", + "comment": "fix: remove unused react-dom and @types/react-dom peer dependencies, mark @types/react as optional", + "packageName": "@fluentui/react-tabster", + "email": "martinhochel@microsoft.com", + "dependentChangeType": "patch" +} diff --git a/change/@fluentui-react-tag-picker-4481861f-d9b1-4e91-b3e9-43d1ffc14203.json b/change/@fluentui-react-tag-picker-4481861f-d9b1-4e91-b3e9-43d1ffc14203.json new file mode 100644 index 00000000000000..5cccac6cea018f --- /dev/null +++ b/change/@fluentui-react-tag-picker-4481861f-d9b1-4e91-b3e9-43d1ffc14203.json @@ -0,0 +1,7 @@ +{ + "type": "patch", + "comment": "fix: remove unused @types/react-dom peer dependency, mark @types/react as optional", + "packageName": "@fluentui/react-tag-picker", + "email": "martinhochel@microsoft.com", + "dependentChangeType": "patch" +} diff --git a/change/@fluentui-react-tags-d53b0eac-9813-4e14-b85f-7ec30c24e44e.json b/change/@fluentui-react-tags-d53b0eac-9813-4e14-b85f-7ec30c24e44e.json new file mode 100644 index 00000000000000..16ccac246cb972 --- /dev/null +++ b/change/@fluentui-react-tags-d53b0eac-9813-4e14-b85f-7ec30c24e44e.json @@ -0,0 +1,7 @@ +{ + "type": "patch", + "comment": "fix: remove unused react-dom and @types/react-dom peer dependencies, mark @types/react as optional", + "packageName": "@fluentui/react-tags", + "email": "martinhochel@microsoft.com", + "dependentChangeType": "patch" +} diff --git a/change/@fluentui-react-teaching-popover-7f05836f-7755-4521-8307-f12819a5e531.json b/change/@fluentui-react-teaching-popover-7f05836f-7755-4521-8307-f12819a5e531.json new file mode 100644 index 00000000000000..1e804cb6ca3fb2 --- /dev/null +++ b/change/@fluentui-react-teaching-popover-7f05836f-7755-4521-8307-f12819a5e531.json @@ -0,0 +1,7 @@ +{ + "type": "patch", + "comment": "fix: remove unused react-dom and @types/react-dom peer dependencies, mark @types/react as optional, require use-sync-external-store ^1.4.0 for react 19 support", + "packageName": "@fluentui/react-teaching-popover", + "email": "martinhochel@microsoft.com", + "dependentChangeType": "patch" +} diff --git a/change/@fluentui-react-text-b0cde57a-f5f1-4ac8-bf45-bf265b839fc9.json b/change/@fluentui-react-text-b0cde57a-f5f1-4ac8-bf45-bf265b839fc9.json new file mode 100644 index 00000000000000..614a1f370f8940 --- /dev/null +++ b/change/@fluentui-react-text-b0cde57a-f5f1-4ac8-bf45-bf265b839fc9.json @@ -0,0 +1,7 @@ +{ + "type": "patch", + "comment": "fix: remove unused react-dom and @types/react-dom peer dependencies, mark @types/react as optional", + "packageName": "@fluentui/react-text", + "email": "martinhochel@microsoft.com", + "dependentChangeType": "patch" +} diff --git a/change/@fluentui-react-textarea-ac92166e-954e-4cd4-872f-3bca0167c252.json b/change/@fluentui-react-textarea-ac92166e-954e-4cd4-872f-3bca0167c252.json new file mode 100644 index 00000000000000..4c1628e7c7baa0 --- /dev/null +++ b/change/@fluentui-react-textarea-ac92166e-954e-4cd4-872f-3bca0167c252.json @@ -0,0 +1,7 @@ +{ + "type": "patch", + "comment": "fix: remove unused react-dom and @types/react-dom peer dependencies, mark @types/react as optional", + "packageName": "@fluentui/react-textarea", + "email": "martinhochel@microsoft.com", + "dependentChangeType": "patch" +} diff --git a/change/@fluentui-react-timepicker-compat-e5395385-c15f-4aa5-a19a-84b6d5ca14f4.json b/change/@fluentui-react-timepicker-compat-e5395385-c15f-4aa5-a19a-84b6d5ca14f4.json new file mode 100644 index 00000000000000..8dd05e2249e9ee --- /dev/null +++ b/change/@fluentui-react-timepicker-compat-e5395385-c15f-4aa5-a19a-84b6d5ca14f4.json @@ -0,0 +1,7 @@ +{ + "type": "patch", + "comment": "fix: remove unused react-dom and @types/react-dom peer dependencies, mark @types/react as optional", + "packageName": "@fluentui/react-timepicker-compat", + "email": "martinhochel@microsoft.com", + "dependentChangeType": "patch" +} diff --git a/change/@fluentui-react-toast-d3a45fab-cbe8-4207-956b-41cfbcbe92ce.json b/change/@fluentui-react-toast-d3a45fab-cbe8-4207-956b-41cfbcbe92ce.json new file mode 100644 index 00000000000000..21194430d59201 --- /dev/null +++ b/change/@fluentui-react-toast-d3a45fab-cbe8-4207-956b-41cfbcbe92ce.json @@ -0,0 +1,7 @@ +{ + "type": "patch", + "comment": "fix: remove unused react-dom and @types/react-dom peer dependencies, mark @types/react as optional", + "packageName": "@fluentui/react-toast", + "email": "martinhochel@microsoft.com", + "dependentChangeType": "patch" +} diff --git a/change/@fluentui-react-toolbar-1d763b45-b904-47b0-8c7e-f1913615d37d.json b/change/@fluentui-react-toolbar-1d763b45-b904-47b0-8c7e-f1913615d37d.json new file mode 100644 index 00000000000000..adfe6953625002 --- /dev/null +++ b/change/@fluentui-react-toolbar-1d763b45-b904-47b0-8c7e-f1913615d37d.json @@ -0,0 +1,7 @@ +{ + "type": "patch", + "comment": "fix: remove unused react-dom and @types/react-dom peer dependencies, mark @types/react as optional", + "packageName": "@fluentui/react-toolbar", + "email": "martinhochel@microsoft.com", + "dependentChangeType": "patch" +} diff --git a/change/@fluentui-react-tooltip-6edcabb9-7b8e-4f0a-bd3e-4644c682e984.json b/change/@fluentui-react-tooltip-6edcabb9-7b8e-4f0a-bd3e-4644c682e984.json new file mode 100644 index 00000000000000..97b9edf8243d5e --- /dev/null +++ b/change/@fluentui-react-tooltip-6edcabb9-7b8e-4f0a-bd3e-4644c682e984.json @@ -0,0 +1,7 @@ +{ + "type": "patch", + "comment": "fix: remove unused react-dom and @types/react-dom peer dependencies, mark @types/react as optional", + "packageName": "@fluentui/react-tooltip", + "email": "martinhochel@microsoft.com", + "dependentChangeType": "patch" +} diff --git a/change/@fluentui-react-tree-30c34404-dee2-4737-b6fe-69fcb16e5ec9.json b/change/@fluentui-react-tree-30c34404-dee2-4737-b6fe-69fcb16e5ec9.json new file mode 100644 index 00000000000000..ac8107047eb79e --- /dev/null +++ b/change/@fluentui-react-tree-30c34404-dee2-4737-b6fe-69fcb16e5ec9.json @@ -0,0 +1,7 @@ +{ + "type": "patch", + "comment": "fix: remove unused @types/react-dom peer dependency, mark @types/react as optional", + "packageName": "@fluentui/react-tree", + "email": "martinhochel@microsoft.com", + "dependentChangeType": "patch" +} diff --git a/change/@fluentui-react-utilities-0030f645-2670-45b6-82f4-139b3fd4e2df.json b/change/@fluentui-react-utilities-0030f645-2670-45b6-82f4-139b3fd4e2df.json new file mode 100644 index 00000000000000..0751088b31a001 --- /dev/null +++ b/change/@fluentui-react-utilities-0030f645-2670-45b6-82f4-139b3fd4e2df.json @@ -0,0 +1,7 @@ +{ + "type": "patch", + "comment": "chore: mark @types/react peer dependency as optional", + "packageName": "@fluentui/react-utilities", + "email": "martinhochel@microsoft.com", + "dependentChangeType": "patch" +} diff --git a/change/@fluentui-react-virtualizer-78a2739c-07f2-4ac8-840f-53a7dc62c7a0.json b/change/@fluentui-react-virtualizer-78a2739c-07f2-4ac8-840f-53a7dc62c7a0.json new file mode 100644 index 00000000000000..bd61b9f2cff319 --- /dev/null +++ b/change/@fluentui-react-virtualizer-78a2739c-07f2-4ac8-840f-53a7dc62c7a0.json @@ -0,0 +1,7 @@ +{ + "type": "prerelease", + "comment": "fix: remove unused @types/react-dom peer dependency, mark @types/react as optional", + "packageName": "@fluentui/react-virtualizer", + "email": "martinhochel@microsoft.com", + "dependentChangeType": "patch" +} diff --git a/packages/react-components/component-selector-preview/library/package.json b/packages/react-components/component-selector-preview/library/package.json index f79b9efd0c71b9..4d9ef4c69807c7 100644 --- a/packages/react-components/component-selector-preview/library/package.json +++ b/packages/react-components/component-selector-preview/library/package.json @@ -29,9 +29,7 @@ }, "peerDependencies": { "@types/react": ">=16.14.0 <20.0.0", - "@types/react-dom": ">=16.9.0 <20.0.0", - "react": ">=16.14.0 <20.0.0", - "react-dom": ">=16.14.0 <20.0.0" + "react": ">=16.14.0 <20.0.0" }, "exports": { ".": { diff --git a/packages/react-components/deprecated/react-alert/package.json b/packages/react-components/deprecated/react-alert/package.json index d09a9ec35abd28..94ba61e13e917e 100644 --- a/packages/react-components/deprecated/react-alert/package.json +++ b/packages/react-components/deprecated/react-alert/package.json @@ -24,9 +24,12 @@ }, "peerDependencies": { "@types/react": ">=16.14.0 <20.0.0", - "@types/react-dom": ">=16.9.0 <20.0.0", - "react": ">=16.14.0 <20.0.0", - "react-dom": ">=16.14.0 <20.0.0" + "react": ">=16.14.0 <20.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } }, "beachball": { "disallowedChangeTypes": [ diff --git a/packages/react-components/deprecated/react-infobutton/package.json b/packages/react-components/deprecated/react-infobutton/package.json index 8381d4bd945d97..2459b68a620c8e 100644 --- a/packages/react-components/deprecated/react-infobutton/package.json +++ b/packages/react-components/deprecated/react-infobutton/package.json @@ -24,9 +24,12 @@ }, "peerDependencies": { "@types/react": ">=16.14.0 <20.0.0", - "@types/react-dom": ">=16.9.0 <20.0.0", - "react": ">=16.14.0 <20.0.0", - "react-dom": ">=16.14.0 <20.0.0" + "react": ">=16.14.0 <20.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } }, "beachball": { "disallowedChangeTypes": [ diff --git a/packages/react-components/deprecated/react-virtualizer/package.json b/packages/react-components/deprecated/react-virtualizer/package.json index 9199ab2c48d0e1..4f0dc251c33fca 100644 --- a/packages/react-components/deprecated/react-virtualizer/package.json +++ b/packages/react-components/deprecated/react-virtualizer/package.json @@ -20,10 +20,14 @@ }, "peerDependencies": { "@types/react": ">=16.14.0 <20.0.0", - "@types/react-dom": ">=16.9.0 <20.0.0", "react": ">=16.14.0 <20.0.0", "react-dom": ">=16.14.0 <20.0.0" }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + }, "beachball": { "disallowedChangeTypes": [ "major", diff --git a/packages/react-components/eslint-plugin-react-components/package.json b/packages/react-components/eslint-plugin-react-components/package.json index 6c345a658af969..fe6f11e9c70f65 100644 --- a/packages/react-components/eslint-plugin-react-components/package.json +++ b/packages/react-components/eslint-plugin-react-components/package.json @@ -18,8 +18,8 @@ "@typescript-eslint/utils": "^8.46.2" }, "peerDependencies": { - "eslint": ">= 8.0.0", - "typescript": ">= 5.0.0", + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=5.0.0 <6.0.0", "typescript-eslint": ">= 8.46.2" }, "exports": { diff --git a/packages/react-components/global-context/package.json b/packages/react-components/global-context/package.json index 9a58b7509e0c89..b9759fbc3e4dd0 100644 --- a/packages/react-components/global-context/package.json +++ b/packages/react-components/global-context/package.json @@ -18,9 +18,12 @@ }, "peerDependencies": { "@types/react": ">=16.14.0 <20.0.0", - "@types/react-dom": ">=16.9.0 <20.0.0", - "react": ">=16.14.0 <20.0.0", - "react-dom": ">=16.14.0 <20.0.0" + "react": ">=16.14.0 <20.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } }, "beachball": { "disallowedChangeTypes": [ diff --git a/packages/react-components/react-accordion/library/package.json b/packages/react-components/react-accordion/library/package.json index ba736c1b3b9871..6ff7e5cab7ae13 100644 --- a/packages/react-components/react-accordion/library/package.json +++ b/packages/react-components/react-accordion/library/package.json @@ -27,9 +27,12 @@ }, "peerDependencies": { "@types/react": ">=16.14.0 <20.0.0", - "@types/react-dom": ">=16.9.0 <20.0.0", - "react": ">=16.14.0 <20.0.0", - "react-dom": ">=16.14.0 <20.0.0" + "react": ">=16.14.0 <20.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } }, "beachball": { "disallowedChangeTypes": [ diff --git a/packages/react-components/react-aria/library/package.json b/packages/react-components/react-aria/library/package.json index cfe2692de030e8..fbadd78e8c0df7 100644 --- a/packages/react-components/react-aria/library/package.json +++ b/packages/react-components/react-aria/library/package.json @@ -21,9 +21,12 @@ }, "peerDependencies": { "@types/react": ">=16.14.0 <20.0.0", - "@types/react-dom": ">=16.9.0 <20.0.0", - "react": ">=16.14.0 <20.0.0", - "react-dom": ">=16.14.0 <20.0.0" + "react": ">=16.14.0 <20.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } }, "beachball": { "disallowedChangeTypes": [ diff --git a/packages/react-components/react-avatar/library/package.json b/packages/react-components/react-avatar/library/package.json index 2519a14ef56908..eb5bfc5fe75b0e 100644 --- a/packages/react-components/react-avatar/library/package.json +++ b/packages/react-components/react-avatar/library/package.json @@ -30,9 +30,12 @@ }, "peerDependencies": { "@types/react": ">=16.14.0 <20.0.0", - "@types/react-dom": ">=16.9.0 <20.0.0", - "react": ">=16.14.0 <20.0.0", - "react-dom": ">=16.14.0 <20.0.0" + "react": ">=16.14.0 <20.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } }, "beachball": { "disallowedChangeTypes": [ diff --git a/packages/react-components/react-badge/library/package.json b/packages/react-components/react-badge/library/package.json index ded562870818b0..0e52905c63f71a 100644 --- a/packages/react-components/react-badge/library/package.json +++ b/packages/react-components/react-badge/library/package.json @@ -22,9 +22,12 @@ }, "peerDependencies": { "@types/react": ">=16.14.0 <20.0.0", - "@types/react-dom": ">=16.9.0 <20.0.0", - "react": ">=16.14.0 <20.0.0", - "react-dom": ">=16.14.0 <20.0.0" + "react": ">=16.14.0 <20.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } }, "beachball": { "disallowedChangeTypes": [ diff --git a/packages/react-components/react-breadcrumb/library/package.json b/packages/react-components/react-breadcrumb/library/package.json index 9cd5100234538a..550afd9e3e393d 100644 --- a/packages/react-components/react-breadcrumb/library/package.json +++ b/packages/react-components/react-breadcrumb/library/package.json @@ -26,9 +26,12 @@ }, "peerDependencies": { "@types/react": ">=16.14.0 <20.0.0", - "@types/react-dom": ">=16.9.0 <20.0.0", - "react": ">=16.14.0 <20.0.0", - "react-dom": ">=16.14.0 <20.0.0" + "react": ">=16.14.0 <20.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } }, "beachball": { "disallowedChangeTypes": [ diff --git a/packages/react-components/react-button/library/package.json b/packages/react-components/react-button/library/package.json index 33897dbf995c3a..9153949a17abfb 100644 --- a/packages/react-components/react-button/library/package.json +++ b/packages/react-components/react-button/library/package.json @@ -25,9 +25,12 @@ }, "peerDependencies": { "@types/react": ">=16.14.0 <20.0.0", - "@types/react-dom": ">=16.9.0 <20.0.0", - "react": ">=16.14.0 <20.0.0", - "react-dom": ">=16.14.0 <20.0.0" + "react": ">=16.14.0 <20.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } }, "beachball": { "disallowedChangeTypes": [ diff --git a/packages/react-components/react-calendar-compat/library/package.json b/packages/react-components/react-calendar-compat/library/package.json index 6b65ef20d4f884..934ba8162e26b5 100644 --- a/packages/react-components/react-calendar-compat/library/package.json +++ b/packages/react-components/react-calendar-compat/library/package.json @@ -26,9 +26,12 @@ }, "peerDependencies": { "@types/react": ">=16.14.0 <20.0.0", - "@types/react-dom": ">=16.9.0 <20.0.0", - "react": ">=16.14.0 <20.0.0", - "react-dom": ">=16.14.0 <20.0.0" + "react": ">=16.14.0 <20.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } }, "exports": { ".": { diff --git a/packages/react-components/react-card/library/package.json b/packages/react-components/react-card/library/package.json index 7997983cdace3f..f3fb92d42437fe 100644 --- a/packages/react-components/react-card/library/package.json +++ b/packages/react-components/react-card/library/package.json @@ -24,9 +24,12 @@ }, "peerDependencies": { "@types/react": ">=16.14.0 <20.0.0", - "@types/react-dom": ">=16.9.0 <20.0.0", - "react": ">=16.14.0 <20.0.0", - "react-dom": ">=16.14.0 <20.0.0" + "react": ">=16.14.0 <20.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } }, "beachball": { "disallowedChangeTypes": [ diff --git a/packages/react-components/react-carousel/library/package.json b/packages/react-components/react-carousel/library/package.json index 5ac404c3065008..e28556ef9f97a3 100644 --- a/packages/react-components/react-carousel/library/package.json +++ b/packages/react-components/react-carousel/library/package.json @@ -37,9 +37,12 @@ }, "peerDependencies": { "@types/react": ">=16.14.0 <20.0.0", - "@types/react-dom": ">=16.9.0 <20.0.0", - "react": ">=16.14.0 <20.0.0", - "react-dom": ">=16.14.0 <20.0.0" + "react": ">=16.14.0 <20.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } }, "exports": { ".": { diff --git a/packages/react-components/react-checkbox/library/package.json b/packages/react-components/react-checkbox/library/package.json index 5262497704f9c0..931300270f026d 100644 --- a/packages/react-components/react-checkbox/library/package.json +++ b/packages/react-components/react-checkbox/library/package.json @@ -25,9 +25,12 @@ }, "peerDependencies": { "@types/react": ">=16.14.0 <20.0.0", - "@types/react-dom": ">=16.9.0 <20.0.0", - "react": ">=16.14.0 <20.0.0", - "react-dom": ">=16.14.0 <20.0.0" + "react": ">=16.14.0 <20.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } }, "beachball": { "disallowedChangeTypes": [ diff --git a/packages/react-components/react-color-picker/library/package.json b/packages/react-components/react-color-picker/library/package.json index 438e4293387a7d..74a5c34a13cc6f 100644 --- a/packages/react-components/react-color-picker/library/package.json +++ b/packages/react-components/react-color-picker/library/package.json @@ -30,9 +30,12 @@ }, "peerDependencies": { "@types/react": ">=16.14.0 <20.0.0", - "@types/react-dom": ">=16.9.0 <20.0.0", - "react": ">=16.14.0 <20.0.0", - "react-dom": ">=16.14.0 <20.0.0" + "react": ">=16.14.0 <20.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } }, "exports": { ".": { diff --git a/packages/react-components/react-colorpicker-compat/package.json b/packages/react-components/react-colorpicker-compat/package.json index 0f2bf22c6b1dcf..2d7c2d60505f6b 100644 --- a/packages/react-components/react-colorpicker-compat/package.json +++ b/packages/react-components/react-colorpicker-compat/package.json @@ -21,9 +21,7 @@ }, "peerDependencies": { "@types/react": ">=16.14.0 <20.0.0", - "@types/react-dom": ">=16.9.0 <20.0.0", - "react": ">=16.14.0 <20.0.0", - "react-dom": ">=16.14.0 <20.0.0" + "react": ">=16.14.0 <20.0.0" }, "beachball": { "disallowedChangeTypes": [ diff --git a/packages/react-components/react-combobox/library/package.json b/packages/react-components/react-combobox/library/package.json index d41e082582c001..78e08e3ee4c18a 100644 --- a/packages/react-components/react-combobox/library/package.json +++ b/packages/react-components/react-combobox/library/package.json @@ -29,10 +29,14 @@ }, "peerDependencies": { "@types/react": ">=16.14.0 <20.0.0", - "@types/react-dom": ">=16.9.0 <20.0.0", "react": ">=16.14.0 <20.0.0", "react-dom": ">=16.14.0 <20.0.0" }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + }, "beachball": { "disallowedChangeTypes": [ "major", diff --git a/packages/react-components/react-components/package.json b/packages/react-components/react-components/package.json index f3dc8bf6bd1860..4a6b3284c4346f 100644 --- a/packages/react-components/react-components/package.json +++ b/packages/react-components/react-components/package.json @@ -77,9 +77,12 @@ }, "peerDependencies": { "@types/react": ">=16.14.0 <20.0.0", - "@types/react-dom": ">=16.9.0 <20.0.0", - "react": ">=16.14.0 <20.0.0", - "react-dom": ">=16.14.0 <20.0.0" + "react": ">=16.14.0 <20.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } }, "beachball": { "disallowedChangeTypes": [ diff --git a/packages/react-components/react-conformance-griffel/package.json b/packages/react-components/react-conformance-griffel/package.json index f4ab6391918a6c..51530c47b89985 100644 --- a/packages/react-components/react-conformance-griffel/package.json +++ b/packages/react-components/react-conformance-griffel/package.json @@ -12,9 +12,14 @@ "peerDependencies": { "@fluentui/react-conformance": "^0.20.1", "@types/react": ">=16.14.0 <20.0.0", - "@types/react-dom": ">=16.9.0 <20.0.0", + "react-dom": ">=16.14.0 <20.0.0", "typescript": "^4.3.0" }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + }, "dependencies": { "@griffel/react": "^1.5.32", "@swc/helpers": "^0.5.1" diff --git a/packages/react-components/react-context-selector/package.json b/packages/react-components/react-context-selector/package.json index bd0e12f9fbb091..1ce209062c6371 100644 --- a/packages/react-components/react-context-selector/package.json +++ b/packages/react-components/react-context-selector/package.json @@ -20,11 +20,14 @@ }, "peerDependencies": { "@types/react": ">=16.14.0 <20.0.0", - "@types/react-dom": ">=16.9.0 <20.0.0", "react": ">=16.14.0 <20.0.0", - "react-dom": ">=16.14.0 <20.0.0", "scheduler": ">=0.19.0" }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + }, "beachball": { "disallowedChangeTypes": [ "major", diff --git a/packages/react-components/react-datepicker-compat/library/package.json b/packages/react-components/react-datepicker-compat/library/package.json index daf56cb74852f5..7965ab4262961f 100644 --- a/packages/react-components/react-datepicker-compat/library/package.json +++ b/packages/react-components/react-datepicker-compat/library/package.json @@ -30,9 +30,12 @@ }, "peerDependencies": { "@types/react": ">=16.14.0 <20.0.0", - "@types/react-dom": ">=16.9.0 <20.0.0", - "react": ">=16.14.0 <20.0.0", - "react-dom": ">=16.14.0 <20.0.0" + "react": ">=16.14.0 <20.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } }, "beachball": { "disallowedChangeTypes": [ diff --git a/packages/react-components/react-dialog/library/package.json b/packages/react-components/react-dialog/library/package.json index b2db774c656fef..d01258eb9faa55 100644 --- a/packages/react-components/react-dialog/library/package.json +++ b/packages/react-components/react-dialog/library/package.json @@ -29,9 +29,12 @@ }, "peerDependencies": { "@types/react": ">=16.14.0 <20.0.0", - "@types/react-dom": ">=16.9.0 <20.0.0", - "react": ">=16.14.0 <20.0.0", - "react-dom": ">=16.14.0 <20.0.0" + "react": ">=16.14.0 <20.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } }, "beachball": { "disallowedChangeTypes": [ diff --git a/packages/react-components/react-divider/library/package.json b/packages/react-components/react-divider/library/package.json index 49d6fb12d7fdbd..2e5b316a683e45 100644 --- a/packages/react-components/react-divider/library/package.json +++ b/packages/react-components/react-divider/library/package.json @@ -21,9 +21,12 @@ }, "peerDependencies": { "@types/react": ">=16.14.0 <20.0.0", - "@types/react-dom": ">=16.9.0 <20.0.0", - "react": ">=16.14.0 <20.0.0", - "react-dom": ">=16.14.0 <20.0.0" + "react": ">=16.14.0 <20.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } }, "beachball": { "disallowedChangeTypes": [ diff --git a/packages/react-components/react-drawer/library/package.json b/packages/react-components/react-drawer/library/package.json index b0f67108dd3959..0454ef5eb763ed 100644 --- a/packages/react-components/react-drawer/library/package.json +++ b/packages/react-components/react-drawer/library/package.json @@ -26,9 +26,12 @@ }, "peerDependencies": { "@types/react": ">=16.14.0 <20.0.0", - "@types/react-dom": ">=16.9.0 <20.0.0", - "react": ">=16.14.0 <20.0.0", - "react-dom": ">=16.14.0 <20.0.0" + "react": ">=16.14.0 <20.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } }, "beachball": { "disallowedChangeTypes": [ diff --git a/packages/react-components/react-field/library/package.json b/packages/react-components/react-field/library/package.json index b26554c33ca1a0..f6e13355224d81 100644 --- a/packages/react-components/react-field/library/package.json +++ b/packages/react-components/react-field/library/package.json @@ -24,9 +24,12 @@ }, "peerDependencies": { "@types/react": ">=16.14.0 <20.0.0", - "@types/react-dom": ">=16.9.0 <20.0.0", - "react": ">=16.14.0 <20.0.0", - "react-dom": ">=16.14.0 <20.0.0" + "react": ">=16.14.0 <20.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } }, "beachball": { "disallowedChangeTypes": [ diff --git a/packages/react-components/react-headless-components-preview/library/package.json b/packages/react-components/react-headless-components-preview/library/package.json index 840f14dc56700e..e018b354f85569 100644 --- a/packages/react-components/react-headless-components-preview/library/package.json +++ b/packages/react-components/react-headless-components-preview/library/package.json @@ -74,9 +74,12 @@ }, "peerDependencies": { "@types/react": ">=16.14.0 <20.0.0", - "@types/react-dom": ">=16.9.0 <20.0.0", - "react": ">=16.14.0 <20.0.0", - "react-dom": ">=16.14.0 <20.0.0" + "react": ">=16.14.0 <20.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } }, "exports": { ".": { diff --git a/packages/react-components/react-icons-compat/library/package.json b/packages/react-components/react-icons-compat/library/package.json index b157e8cfcc0a63..5fe1e7e9a8e242 100644 --- a/packages/react-components/react-icons-compat/library/package.json +++ b/packages/react-components/react-icons-compat/library/package.json @@ -28,9 +28,12 @@ }, "peerDependencies": { "@types/react": ">=16.14.0 <20.0.0", - "@types/react-dom": ">=16.9.0 <20.0.0", - "react": ">=16.14.0 <20.0.0", - "react-dom": ">=16.14.0 <20.0.0" + "react": ">=16.14.0 <20.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } }, "exports": { ".": { diff --git a/packages/react-components/react-image/library/package.json b/packages/react-components/react-image/library/package.json index 74c52da517f7b3..dd4a4cc6b601bb 100644 --- a/packages/react-components/react-image/library/package.json +++ b/packages/react-components/react-image/library/package.json @@ -21,9 +21,12 @@ }, "peerDependencies": { "@types/react": ">=16.14.0 <20.0.0", - "@types/react-dom": ">=16.9.0 <20.0.0", - "react": ">=16.14.0 <20.0.0", - "react-dom": ">=16.14.0 <20.0.0" + "react": ">=16.14.0 <20.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } }, "beachball": { "disallowedChangeTypes": [ diff --git a/packages/react-components/react-infolabel/library/package.json b/packages/react-components/react-infolabel/library/package.json index 99d3b340dfb6c1..2149c670277a7e 100644 --- a/packages/react-components/react-infolabel/library/package.json +++ b/packages/react-components/react-infolabel/library/package.json @@ -25,9 +25,12 @@ }, "peerDependencies": { "@types/react": ">=16.14.0 <20.0.0", - "@types/react-dom": ">=16.9.0 <20.0.0", - "react": ">=16.14.0 <20.0.0", - "react-dom": ">=16.14.0 <20.0.0" + "react": ">=16.14.0 <20.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } }, "exports": { ".": { diff --git a/packages/react-components/react-input/library/package.json b/packages/react-components/react-input/library/package.json index 9a3f3fd4c1041a..5b0cc2aefccd41 100644 --- a/packages/react-components/react-input/library/package.json +++ b/packages/react-components/react-input/library/package.json @@ -22,9 +22,12 @@ }, "peerDependencies": { "@types/react": ">=16.14.0 <20.0.0", - "@types/react-dom": ">=16.9.0 <20.0.0", - "react": ">=16.14.0 <20.0.0", - "react-dom": ">=16.14.0 <20.0.0" + "react": ">=16.14.0 <20.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } }, "beachball": { "disallowedChangeTypes": [ diff --git a/packages/react-components/react-jsx-runtime/package.json b/packages/react-components/react-jsx-runtime/package.json index eb4576d6b46a2d..25e62f44c684a8 100644 --- a/packages/react-components/react-jsx-runtime/package.json +++ b/packages/react-components/react-jsx-runtime/package.json @@ -19,6 +19,11 @@ "@types/react": ">=16.14.0 <20.0.0", "react": ">=16.14.0 <20.0.0" }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + }, "beachball": { "disallowedChangeTypes": [ "major", diff --git a/packages/react-components/react-label/library/package.json b/packages/react-components/react-label/library/package.json index 3c93336fdb2a24..09070476621609 100644 --- a/packages/react-components/react-label/library/package.json +++ b/packages/react-components/react-label/library/package.json @@ -21,9 +21,12 @@ }, "peerDependencies": { "@types/react": ">=16.14.0 <20.0.0", - "@types/react-dom": ">=16.9.0 <20.0.0", - "react": ">=16.14.0 <20.0.0", - "react-dom": ">=16.14.0 <20.0.0" + "react": ">=16.14.0 <20.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } }, "beachball": { "disallowedChangeTypes": [ diff --git a/packages/react-components/react-link/library/package.json b/packages/react-components/react-link/library/package.json index 80176c951bdb02..f37611b147afb3 100644 --- a/packages/react-components/react-link/library/package.json +++ b/packages/react-components/react-link/library/package.json @@ -23,9 +23,12 @@ }, "peerDependencies": { "@types/react": ">=16.14.0 <20.0.0", - "@types/react-dom": ">=16.9.0 <20.0.0", - "react": ">=16.14.0 <20.0.0", - "react-dom": ">=16.14.0 <20.0.0" + "react": ">=16.14.0 <20.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } }, "beachball": { "disallowedChangeTypes": [ diff --git a/packages/react-components/react-list/library/package.json b/packages/react-components/react-list/library/package.json index 50bfb2d22e8e5e..660c291e262897 100644 --- a/packages/react-components/react-list/library/package.json +++ b/packages/react-components/react-list/library/package.json @@ -32,9 +32,12 @@ }, "peerDependencies": { "@types/react": ">=16.14.0 <20.0.0", - "@types/react-dom": ">=16.9.0 <20.0.0", - "react": ">=16.14.0 <20.0.0", - "react-dom": ">=16.14.0 <20.0.0" + "react": ">=16.14.0 <20.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } }, "exports": { ".": { diff --git a/packages/react-components/react-menu-grid-preview/library/package.json b/packages/react-components/react-menu-grid-preview/library/package.json index a32a060605f34c..5d572321e74839 100644 --- a/packages/react-components/react-menu-grid-preview/library/package.json +++ b/packages/react-components/react-menu-grid-preview/library/package.json @@ -33,9 +33,12 @@ }, "peerDependencies": { "@types/react": ">=16.14.0 <20.0.0", - "@types/react-dom": ">=16.9.0 <20.0.0", - "react": ">=16.14.0 <20.0.0", - "react-dom": ">=16.14.0 <20.0.0" + "react": ">=16.14.0 <20.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } }, "exports": { ".": { diff --git a/packages/react-components/react-menu/library/package.json b/packages/react-components/react-menu/library/package.json index 0f5fd32dc200ed..ae211c4dccc62d 100644 --- a/packages/react-components/react-menu/library/package.json +++ b/packages/react-components/react-menu/library/package.json @@ -30,9 +30,12 @@ }, "peerDependencies": { "@types/react": ">=16.14.0 <20.0.0", - "@types/react-dom": ">=16.9.0 <20.0.0", - "react": ">=16.14.0 <20.0.0", - "react-dom": ">=16.14.0 <20.0.0" + "react": ">=16.14.0 <20.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } }, "beachball": { "disallowedChangeTypes": [ diff --git a/packages/react-components/react-message-bar/library/package.json b/packages/react-components/react-message-bar/library/package.json index 09fb08c1eb0741..8c268e70f4d838 100644 --- a/packages/react-components/react-message-bar/library/package.json +++ b/packages/react-components/react-message-bar/library/package.json @@ -26,9 +26,12 @@ }, "peerDependencies": { "@types/react": ">=16.14.0 <20.0.0", - "@types/react-dom": ">=16.9.0 <20.0.0", - "react": ">=16.14.0 <20.0.0", - "react-dom": ">=16.14.0 <20.0.0" + "react": ">=16.14.0 <20.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } }, "exports": { ".": { diff --git a/packages/react-components/react-migration-v0-v9/library/package.json b/packages/react-components/react-migration-v0-v9/library/package.json index 9aa6bc4d0303fe..1b4df6a53d38d9 100644 --- a/packages/react-components/react-migration-v0-v9/library/package.json +++ b/packages/react-components/react-migration-v0-v9/library/package.json @@ -27,9 +27,12 @@ "peerDependencies": { "@fluentui/react-northstar": "^0.66.5", "@types/react": ">=16.14.0 <20.0.0", - "@types/react-dom": ">=16.9.0 <20.0.0", - "react": ">=16.14.0 <20.0.0", - "react-dom": ">=16.14.0 <20.0.0" + "react": ">=16.14.0 <20.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } }, "beachball": { "disallowedChangeTypes": [ diff --git a/packages/react-components/react-migration-v8-v9/library/package.json b/packages/react-components/react-migration-v8-v9/library/package.json index 510ae6678e1b8c..7bf88a1889c3f9 100644 --- a/packages/react-components/react-migration-v8-v9/library/package.json +++ b/packages/react-components/react-migration-v8-v9/library/package.json @@ -23,9 +23,12 @@ }, "peerDependencies": { "@types/react": ">=16.14.0 <20.0.0", - "@types/react-dom": ">=16.9.0 <20.0.0", - "react": ">=16.14.0 <20.0.0", - "react-dom": ">=16.14.0 <20.0.0" + "react": ">=16.14.0 <20.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } }, "beachball": { "disallowedChangeTypes": [ diff --git a/packages/react-components/react-motion-components-preview/library/package.json b/packages/react-components/react-motion-components-preview/library/package.json index a17ecc9ac36387..119d7a2399e8f7 100644 --- a/packages/react-components/react-motion-components-preview/library/package.json +++ b/packages/react-components/react-motion-components-preview/library/package.json @@ -25,9 +25,12 @@ }, "peerDependencies": { "@types/react": ">=16.14.0 <20.0.0", - "@types/react-dom": ">=16.9.0 <20.0.0", - "react": ">=16.14.0 <20.0.0", - "react-dom": ">=16.14.0 <20.0.0" + "react": ">=16.14.0 <20.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } }, "exports": { ".": { diff --git a/packages/react-components/react-motion/library/package.json b/packages/react-components/react-motion/library/package.json index 6d54320e2d6fe6..55d575318bdcd9 100644 --- a/packages/react-components/react-motion/library/package.json +++ b/packages/react-components/react-motion/library/package.json @@ -25,9 +25,12 @@ }, "peerDependencies": { "@types/react": ">=16.14.0 <20.0.0", - "@types/react-dom": ">=16.9.0 <20.0.0", - "react": ">=16.14.0 <20.0.0", - "react-dom": ">=16.14.0 <20.0.0" + "react": ">=16.14.0 <20.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } }, "exports": { ".": { diff --git a/packages/react-components/react-nav/library/package.json b/packages/react-components/react-nav/library/package.json index aba9d5c91c6a57..92647a17bfd1b2 100644 --- a/packages/react-components/react-nav/library/package.json +++ b/packages/react-components/react-nav/library/package.json @@ -31,9 +31,12 @@ }, "peerDependencies": { "@types/react": ">=16.14.0 <20.0.0", - "@types/react-dom": ">=16.9.0 <20.0.0", - "react": ">=16.14.0 <20.0.0", - "react-dom": ">=16.14.0 <20.0.0" + "react": ">=16.14.0 <20.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } }, "exports": { ".": { diff --git a/packages/react-components/react-overflow/library/package.json b/packages/react-components/react-overflow/library/package.json index ee9a29fc3b89be..72dbec29866bb8 100644 --- a/packages/react-components/react-overflow/library/package.json +++ b/packages/react-components/react-overflow/library/package.json @@ -21,9 +21,12 @@ }, "peerDependencies": { "@types/react": ">=16.14.0 <20.0.0", - "@types/react-dom": ">=16.9.0 <20.0.0", - "react": ">=16.14.0 <20.0.0", - "react-dom": ">=16.14.0 <20.0.0" + "react": ">=16.14.0 <20.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } }, "beachball": { "disallowedChangeTypes": [ diff --git a/packages/react-components/react-persona/library/package.json b/packages/react-components/react-persona/library/package.json index b23f99233089ba..e936d9c7be6975 100644 --- a/packages/react-components/react-persona/library/package.json +++ b/packages/react-components/react-persona/library/package.json @@ -23,9 +23,12 @@ }, "peerDependencies": { "@types/react": ">=16.14.0 <20.0.0", - "@types/react-dom": ">=16.9.0 <20.0.0", - "react": ">=16.14.0 <20.0.0", - "react-dom": ">=16.14.0 <20.0.0" + "react": ">=16.14.0 <20.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } }, "beachball": { "disallowedChangeTypes": [ diff --git a/packages/react-components/react-popover/library/package.json b/packages/react-components/react-popover/library/package.json index f83652103f951e..b26916d7efbfe3 100644 --- a/packages/react-components/react-popover/library/package.json +++ b/packages/react-components/react-popover/library/package.json @@ -29,9 +29,12 @@ }, "peerDependencies": { "@types/react": ">=16.14.0 <20.0.0", - "@types/react-dom": ">=16.9.0 <20.0.0", - "react": ">=16.14.0 <20.0.0", - "react-dom": ">=16.14.0 <20.0.0" + "react": ">=16.14.0 <20.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } }, "beachball": { "disallowedChangeTypes": [ diff --git a/packages/react-components/react-portal-compat-context/package.json b/packages/react-components/react-portal-compat-context/package.json index 0dba52b525aba5..4231e1adc403f5 100644 --- a/packages/react-components/react-portal-compat-context/package.json +++ b/packages/react-components/react-portal-compat-context/package.json @@ -18,6 +18,11 @@ "@types/react": ">=16.14.0 <20.0.0", "react": ">=16.14.0 <20.0.0" }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + }, "beachball": { "disallowedChangeTypes": [ "major", diff --git a/packages/react-components/react-portal-compat/package.json b/packages/react-components/react-portal-compat/package.json index 7a7f9da45d79c9..8f62af6fb740b0 100644 --- a/packages/react-components/react-portal-compat/package.json +++ b/packages/react-components/react-portal-compat/package.json @@ -21,6 +21,11 @@ "@types/react": ">=16.14.0 <20.0.0", "react": ">=16.14.0 <20.0.0" }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + }, "beachball": { "disallowedChangeTypes": [ "major", diff --git a/packages/react-components/react-portal/library/package.json b/packages/react-components/react-portal/library/package.json index a18530e3dde0eb..a66b0f3e96a00d 100644 --- a/packages/react-components/react-portal/library/package.json +++ b/packages/react-components/react-portal/library/package.json @@ -20,10 +20,14 @@ }, "peerDependencies": { "@types/react": ">=16.14.0 <20.0.0", - "@types/react-dom": ">=16.9.0 <20.0.0", "react": ">=16.14.0 <20.0.0", "react-dom": ">=16.14.0 <20.0.0" }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + }, "beachball": { "disallowedChangeTypes": [ "major", diff --git a/packages/react-components/react-positioning/library/package.json b/packages/react-components/react-positioning/library/package.json index d1e7b5e9be0220..68a3a1967cbbbc 100644 --- a/packages/react-components/react-positioning/library/package.json +++ b/packages/react-components/react-positioning/library/package.json @@ -19,13 +19,16 @@ "@fluentui/react-utilities": "^9.26.6", "@griffel/react": "^1.5.32", "@swc/helpers": "^0.5.1", - "use-sync-external-store": "^1.2.0" + "use-sync-external-store": "^1.4.0" }, "peerDependencies": { "@types/react": ">=16.14.0 <20.0.0", - "@types/react-dom": ">=16.9.0 <20.0.0", - "react": ">=16.14.0 <20.0.0", - "react-dom": ">=16.14.0 <20.0.0" + "react": ">=16.14.0 <20.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } }, "beachball": { "disallowedChangeTypes": [ diff --git a/packages/react-components/react-progress/library/package.json b/packages/react-components/react-progress/library/package.json index 579a59a456641c..be7d562f88ede0 100644 --- a/packages/react-components/react-progress/library/package.json +++ b/packages/react-components/react-progress/library/package.json @@ -23,9 +23,12 @@ }, "peerDependencies": { "@types/react": ">=16.14.0 <20.0.0", - "@types/react-dom": ">=16.9.0 <20.0.0", - "react": ">=16.14.0 <20.0.0", - "react-dom": ">=16.14.0 <20.0.0" + "react": ">=16.14.0 <20.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } }, "beachball": { "disallowedChangeTypes": [ diff --git a/packages/react-components/react-provider/library/package.json b/packages/react-components/react-provider/library/package.json index cae202e3906e3d..e81c20b86baf6b 100644 --- a/packages/react-components/react-provider/library/package.json +++ b/packages/react-components/react-provider/library/package.json @@ -24,9 +24,12 @@ }, "peerDependencies": { "@types/react": ">=16.14.0 <20.0.0", - "@types/react-dom": ">=16.9.0 <20.0.0", - "react": ">=16.14.0 <20.0.0", - "react-dom": ">=16.14.0 <20.0.0" + "react": ">=16.14.0 <20.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } }, "beachball": { "disallowedChangeTypes": [ diff --git a/packages/react-components/react-radio/library/package.json b/packages/react-components/react-radio/library/package.json index d5582fc178a89d..6bf4d95ec10752 100644 --- a/packages/react-components/react-radio/library/package.json +++ b/packages/react-components/react-radio/library/package.json @@ -24,9 +24,12 @@ }, "peerDependencies": { "@types/react": ">=16.14.0 <20.0.0", - "@types/react-dom": ">=16.9.0 <20.0.0", - "react": ">=16.14.0 <20.0.0", - "react-dom": ">=16.14.0 <20.0.0" + "react": ">=16.14.0 <20.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } }, "beachball": { "disallowedChangeTypes": [ diff --git a/packages/react-components/react-rating/library/package.json b/packages/react-components/react-rating/library/package.json index b19d06a9956334..2c5cbc1f16ac43 100644 --- a/packages/react-components/react-rating/library/package.json +++ b/packages/react-components/react-rating/library/package.json @@ -23,9 +23,12 @@ }, "peerDependencies": { "@types/react": ">=16.14.0 <20.0.0", - "@types/react-dom": ">=16.9.0 <20.0.0", - "react": ">=16.14.0 <20.0.0", - "react-dom": ">=16.14.0 <20.0.0" + "react": ">=16.14.0 <20.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } }, "exports": { ".": { diff --git a/packages/react-components/react-search/library/package.json b/packages/react-components/react-search/library/package.json index 2861c94c1f5372..dbf63d10f598c9 100644 --- a/packages/react-components/react-search/library/package.json +++ b/packages/react-components/react-search/library/package.json @@ -23,9 +23,12 @@ }, "peerDependencies": { "@types/react": ">=16.14.0 <20.0.0", - "@types/react-dom": ">=16.9.0 <20.0.0", - "react": ">=16.14.0 <20.0.0", - "react-dom": ">=16.14.0 <20.0.0" + "react": ">=16.14.0 <20.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } }, "beachball": { "disallowedChangeTypes": [ diff --git a/packages/react-components/react-select/library/package.json b/packages/react-components/react-select/library/package.json index c3e0c883411cc5..92e05d97d24252 100644 --- a/packages/react-components/react-select/library/package.json +++ b/packages/react-components/react-select/library/package.json @@ -23,9 +23,12 @@ }, "peerDependencies": { "@types/react": ">=16.14.0 <20.0.0", - "@types/react-dom": ">=16.9.0 <20.0.0", - "react": ">=16.14.0 <20.0.0", - "react-dom": ">=16.14.0 <20.0.0" + "react": ">=16.14.0 <20.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } }, "beachball": { "disallowedChangeTypes": [ diff --git a/packages/react-components/react-shared-contexts/library/package.json b/packages/react-components/react-shared-contexts/library/package.json index 6474325aa1f70d..e2e21b81891b60 100644 --- a/packages/react-components/react-shared-contexts/library/package.json +++ b/packages/react-components/react-shared-contexts/library/package.json @@ -19,6 +19,11 @@ "@types/react": ">=16.14.0 <20.0.0", "react": ">=16.14.0 <20.0.0" }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + }, "beachball": { "disallowedChangeTypes": [ "major", diff --git a/packages/react-components/react-skeleton/library/package.json b/packages/react-components/react-skeleton/library/package.json index 44dae2da218f41..73efc5b76e2ea3 100644 --- a/packages/react-components/react-skeleton/library/package.json +++ b/packages/react-components/react-skeleton/library/package.json @@ -22,9 +22,12 @@ }, "peerDependencies": { "@types/react": ">=16.14.0 <20.0.0", - "@types/react-dom": ">=16.9.0 <20.0.0", - "react": ">=16.14.0 <20.0.0", - "react-dom": ">=16.14.0 <20.0.0" + "react": ">=16.14.0 <20.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } }, "beachball": { "disallowedChangeTypes": [ diff --git a/packages/react-components/react-slider/library/package.json b/packages/react-components/react-slider/library/package.json index 3f2b22bd962409..ee79f50c9eac95 100644 --- a/packages/react-components/react-slider/library/package.json +++ b/packages/react-components/react-slider/library/package.json @@ -23,9 +23,12 @@ }, "peerDependencies": { "@types/react": ">=16.14.0 <20.0.0", - "@types/react-dom": ">=16.9.0 <20.0.0", - "react": ">=16.14.0 <20.0.0", - "react-dom": ">=16.14.0 <20.0.0" + "react": ">=16.14.0 <20.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } }, "beachball": { "disallowedChangeTypes": [ diff --git a/packages/react-components/react-spinbutton/library/package.json b/packages/react-components/react-spinbutton/library/package.json index 7d1ac4e843b68d..9a3af1b7552797 100644 --- a/packages/react-components/react-spinbutton/library/package.json +++ b/packages/react-components/react-spinbutton/library/package.json @@ -24,9 +24,12 @@ }, "peerDependencies": { "@types/react": ">=16.14.0 <20.0.0", - "@types/react-dom": ">=16.9.0 <20.0.0", - "react": ">=16.14.0 <20.0.0", - "react-dom": ">=16.14.0 <20.0.0" + "react": ">=16.14.0 <20.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } }, "beachball": { "disallowedChangeTypes": [ diff --git a/packages/react-components/react-spinner/library/package.json b/packages/react-components/react-spinner/library/package.json index 7832fcf9cebfab..40552c32725e78 100644 --- a/packages/react-components/react-spinner/library/package.json +++ b/packages/react-components/react-spinner/library/package.json @@ -22,9 +22,12 @@ }, "peerDependencies": { "@types/react": ">=16.14.0 <20.0.0", - "@types/react-dom": ">=16.9.0 <20.0.0", - "react": ">=16.14.0 <20.0.0", - "react-dom": ">=16.14.0 <20.0.0" + "react": ">=16.14.0 <20.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } }, "beachball": { "disallowedChangeTypes": [ diff --git a/packages/react-components/react-storybook-addon/package.json b/packages/react-components/react-storybook-addon/package.json index 86c818b4483994..58b5b0a9ad9ca6 100644 --- a/packages/react-components/react-storybook-addon/package.json +++ b/packages/react-components/react-storybook-addon/package.json @@ -33,11 +33,14 @@ "@storybook/icons": "^1.3.2", "@storybook/react-webpack5": "^9.1.17", "@types/react": ">=16.14.0 <20.0.0", - "@types/react-dom": ">=16.9.0 <20.0.0", "react": ">=16.14.0 <20.0.0", - "react-dom": ">=16.14.0 <20.0.0", "storybook": "^9.1.17" }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + }, "beachball": { "disallowedChangeTypes": [ "major", diff --git a/packages/react-components/react-swatch-picker/library/package.json b/packages/react-components/react-swatch-picker/library/package.json index 4f822478834db8..a619c6c6743ec3 100644 --- a/packages/react-components/react-swatch-picker/library/package.json +++ b/packages/react-components/react-swatch-picker/library/package.json @@ -25,9 +25,12 @@ }, "peerDependencies": { "@types/react": ">=16.14.0 <20.0.0", - "@types/react-dom": ">=16.9.0 <20.0.0", - "react": ">=16.14.0 <20.0.0", - "react-dom": ">=16.14.0 <20.0.0" + "react": ">=16.14.0 <20.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } }, "exports": { ".": { diff --git a/packages/react-components/react-switch/library/package.json b/packages/react-components/react-switch/library/package.json index a7191c3b8d9bc8..86ae8de6bbfa87 100644 --- a/packages/react-components/react-switch/library/package.json +++ b/packages/react-components/react-switch/library/package.json @@ -25,9 +25,12 @@ }, "peerDependencies": { "@types/react": ">=16.14.0 <20.0.0", - "@types/react-dom": ">=16.9.0 <20.0.0", - "react": ">=16.14.0 <20.0.0", - "react-dom": ">=16.14.0 <20.0.0" + "react": ">=16.14.0 <20.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } }, "beachball": { "disallowedChangeTypes": [ diff --git a/packages/react-components/react-table/library/package.json b/packages/react-components/react-table/library/package.json index 1d7b881599a35c..c6e0ec1a0449ff 100644 --- a/packages/react-components/react-table/library/package.json +++ b/packages/react-components/react-table/library/package.json @@ -29,9 +29,12 @@ }, "peerDependencies": { "@types/react": ">=16.14.0 <20.0.0", - "@types/react-dom": ">=16.9.0 <20.0.0", - "react": ">=16.14.0 <20.0.0", - "react-dom": ">=16.14.0 <20.0.0" + "react": ">=16.14.0 <20.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } }, "beachball": { "disallowedChangeTypes": [ diff --git a/packages/react-components/react-tabs/library/package.json b/packages/react-components/react-tabs/library/package.json index dfe50c9e5753df..a9735a8fb96105 100644 --- a/packages/react-components/react-tabs/library/package.json +++ b/packages/react-components/react-tabs/library/package.json @@ -23,9 +23,12 @@ }, "peerDependencies": { "@types/react": ">=16.14.0 <20.0.0", - "@types/react-dom": ">=16.9.0 <20.0.0", - "react": ">=16.14.0 <20.0.0", - "react-dom": ">=16.14.0 <20.0.0" + "react": ">=16.14.0 <20.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } }, "beachball": { "disallowedChangeTypes": [ diff --git a/packages/react-components/react-tabster/package.json b/packages/react-components/react-tabster/package.json index 884f5b853b38b4..db75ddc17819f5 100644 --- a/packages/react-components/react-tabster/package.json +++ b/packages/react-components/react-tabster/package.json @@ -22,9 +22,12 @@ }, "peerDependencies": { "@types/react": ">=16.14.0 <20.0.0", - "@types/react-dom": ">=16.9.0 <20.0.0", - "react": ">=16.14.0 <20.0.0", - "react-dom": ">=16.14.0 <20.0.0" + "react": ">=16.14.0 <20.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } }, "beachball": { "disallowedChangeTypes": [ diff --git a/packages/react-components/react-tag-picker/library/package.json b/packages/react-components/react-tag-picker/library/package.json index f96afc0ed0a644..4cd9b18a5fdbe0 100644 --- a/packages/react-components/react-tag-picker/library/package.json +++ b/packages/react-components/react-tag-picker/library/package.json @@ -38,10 +38,14 @@ }, "peerDependencies": { "@types/react": ">=16.14.0 <20.0.0", - "@types/react-dom": ">=16.9.0 <20.0.0", "react": ">=16.14.0 <20.0.0", "react-dom": ">=16.14.0 <20.0.0" }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + }, "exports": { ".": { "import": { diff --git a/packages/react-components/react-tags/library/package.json b/packages/react-components/react-tags/library/package.json index 9658f931b6ec64..182491ba93fc2d 100644 --- a/packages/react-components/react-tags/library/package.json +++ b/packages/react-components/react-tags/library/package.json @@ -26,9 +26,12 @@ }, "peerDependencies": { "@types/react": ">=16.14.0 <20.0.0", - "@types/react-dom": ">=16.9.0 <20.0.0", - "react": ">=16.14.0 <20.0.0", - "react-dom": ">=16.14.0 <20.0.0" + "react": ">=16.14.0 <20.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } }, "beachball": { "disallowedChangeTypes": [ diff --git a/packages/react-components/react-teaching-popover/library/package.json b/packages/react-components/react-teaching-popover/library/package.json index e04e405963be78..f392cb1498d380 100644 --- a/packages/react-components/react-teaching-popover/library/package.json +++ b/packages/react-components/react-teaching-popover/library/package.json @@ -31,13 +31,16 @@ "@fluentui/react-utilities": "^9.26.6", "@griffel/react": "^1.5.32", "@swc/helpers": "^0.5.1", - "use-sync-external-store": "^1.2.0" + "use-sync-external-store": "^1.4.0" }, "peerDependencies": { "@types/react": ">=16.14.0 <20.0.0", - "@types/react-dom": ">=16.9.0 <20.0.0", - "react": ">=16.14.0 <20.0.0", - "react-dom": ">=16.14.0 <20.0.0" + "react": ">=16.14.0 <20.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } }, "exports": { ".": { diff --git a/packages/react-components/react-text/library/package.json b/packages/react-components/react-text/library/package.json index ca1f44c3db4ef5..3bfe7c5bf1fde6 100644 --- a/packages/react-components/react-text/library/package.json +++ b/packages/react-components/react-text/library/package.json @@ -22,9 +22,12 @@ }, "peerDependencies": { "@types/react": ">=16.14.0 <20.0.0", - "@types/react-dom": ">=16.9.0 <20.0.0", - "react": ">=16.14.0 <20.0.0", - "react-dom": ">=16.14.0 <20.0.0" + "react": ">=16.14.0 <20.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } }, "beachball": { "disallowedChangeTypes": [ diff --git a/packages/react-components/react-textarea/library/package.json b/packages/react-components/react-textarea/library/package.json index 456198c392484e..483dea9e48dc85 100644 --- a/packages/react-components/react-textarea/library/package.json +++ b/packages/react-components/react-textarea/library/package.json @@ -22,9 +22,12 @@ }, "peerDependencies": { "@types/react": ">=16.14.0 <20.0.0", - "@types/react-dom": ">=16.9.0 <20.0.0", - "react": ">=16.14.0 <20.0.0", - "react-dom": ">=16.14.0 <20.0.0" + "react": ">=16.14.0 <20.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } }, "beachball": { "disallowedChangeTypes": [ diff --git a/packages/react-components/react-timepicker-compat/library/package.json b/packages/react-components/react-timepicker-compat/library/package.json index 064b80f654e570..149f5fac689ae7 100644 --- a/packages/react-components/react-timepicker-compat/library/package.json +++ b/packages/react-components/react-timepicker-compat/library/package.json @@ -31,9 +31,12 @@ }, "peerDependencies": { "@types/react": ">=16.14.0 <20.0.0", - "@types/react-dom": ">=16.9.0 <20.0.0", - "react": ">=16.14.0 <20.0.0", - "react-dom": ">=16.14.0 <20.0.0" + "react": ">=16.14.0 <20.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } }, "exports": { ".": { diff --git a/packages/react-components/react-toast/library/package.json b/packages/react-components/react-toast/library/package.json index b65cc691a48fa3..d4e8ad734e5c3d 100644 --- a/packages/react-components/react-toast/library/package.json +++ b/packages/react-components/react-toast/library/package.json @@ -28,9 +28,12 @@ }, "peerDependencies": { "@types/react": ">=16.14.0 <20.0.0", - "@types/react-dom": ">=16.9.0 <20.0.0", - "react": ">=16.14.0 <20.0.0", - "react-dom": ">=16.14.0 <20.0.0" + "react": ">=16.14.0 <20.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } }, "beachball": { "disallowedChangeTypes": [ diff --git a/packages/react-components/react-toolbar/library/package.json b/packages/react-components/react-toolbar/library/package.json index afbf5a75ecbf89..a63e74594513dc 100644 --- a/packages/react-components/react-toolbar/library/package.json +++ b/packages/react-components/react-toolbar/library/package.json @@ -26,9 +26,12 @@ }, "peerDependencies": { "@types/react": ">=16.14.0 <20.0.0", - "@types/react-dom": ">=16.9.0 <20.0.0", - "react": ">=16.14.0 <20.0.0", - "react-dom": ">=16.14.0 <20.0.0" + "react": ">=16.14.0 <20.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } }, "beachball": { "disallowedChangeTypes": [ diff --git a/packages/react-components/react-tooltip/library/package.json b/packages/react-components/react-tooltip/library/package.json index 8c1447cd1c51b1..809c603ad9f2a1 100644 --- a/packages/react-components/react-tooltip/library/package.json +++ b/packages/react-components/react-tooltip/library/package.json @@ -25,9 +25,12 @@ }, "peerDependencies": { "@types/react": ">=16.14.0 <20.0.0", - "@types/react-dom": ">=16.9.0 <20.0.0", - "react": ">=16.14.0 <20.0.0", - "react-dom": ">=16.14.0 <20.0.0" + "react": ">=16.14.0 <20.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } }, "beachball": { "disallowedChangeTypes": [ diff --git a/packages/react-components/react-tree/library/package.json b/packages/react-components/react-tree/library/package.json index 0e5e63023bf4c3..c9297aceb2d79b 100644 --- a/packages/react-components/react-tree/library/package.json +++ b/packages/react-components/react-tree/library/package.json @@ -32,10 +32,14 @@ }, "peerDependencies": { "@types/react": ">=16.14.0 <20.0.0", - "@types/react-dom": ">=16.9.0 <20.0.0", "react": ">=16.14.0 <20.0.0", "react-dom": ">=16.14.0 <20.0.0" }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + }, "exports": { ".": { "import": { diff --git a/packages/react-components/react-utilities-compat/library/package.json b/packages/react-components/react-utilities-compat/library/package.json index 4aaa60ea083715..d097e54b09a1ad 100644 --- a/packages/react-components/react-utilities-compat/library/package.json +++ b/packages/react-components/react-utilities-compat/library/package.json @@ -29,9 +29,7 @@ }, "peerDependencies": { "@types/react": ">=16.14.0 <20.0.0", - "@types/react-dom": ">=16.9.0 <20.0.0", - "react": ">=16.8.0 <20.0.0", - "react-dom": ">=16.14.0 <20.0.0" + "react": ">=16.8.0 <20.0.0" }, "exports": { ".": { diff --git a/packages/react-components/react-utilities/package.json b/packages/react-components/react-utilities/package.json index 54d774a7432795..c722bcfa794849 100644 --- a/packages/react-components/react-utilities/package.json +++ b/packages/react-components/react-utilities/package.json @@ -20,6 +20,11 @@ "@types/react": ">=16.14.0 <20.0.0", "react": ">=16.14.0 <20.0.0" }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + }, "beachball": { "disallowedChangeTypes": [ "major", diff --git a/packages/react-components/recipes/package.json b/packages/react-components/recipes/package.json index a83ff2ba9d10af..1ccaa08060cc6b 100644 --- a/packages/react-components/recipes/package.json +++ b/packages/react-components/recipes/package.json @@ -29,9 +29,7 @@ }, "peerDependencies": { "@types/react": ">=16.14.0 <20.0.0", - "@types/react-dom": ">=16.9.0 <20.0.0", - "react": ">=16.14.0 <20.0.0", - "react-dom": ">=16.14.0 <20.0.0" + "react": ">=16.14.0 <20.0.0" }, "exports": { ".": { diff --git a/packages/react-components/theme-designer/package.json b/packages/react-components/theme-designer/package.json index fdf91b2d960f2f..86d352403de621 100644 --- a/packages/react-components/theme-designer/package.json +++ b/packages/react-components/theme-designer/package.json @@ -26,9 +26,7 @@ }, "peerDependencies": { "@types/react": ">=16.14.0 <20.0.0", - "@types/react-dom": ">=16.9.0 <20.0.0", - "react": ">=16.14.0 <20.0.0", - "react-dom": ">=16.14.0 <20.0.0" + "react": ">=16.14.0 <20.0.0" }, "beachball": { "disallowedChangeTypes": [ diff --git a/tools/workspace-plugin/generators.json b/tools/workspace-plugin/generators.json index ebac3a2495f5d6..1fd7ad0cb2956f 100644 --- a/tools/workspace-plugin/generators.json +++ b/tools/workspace-plugin/generators.json @@ -70,6 +70,11 @@ "schema": "./src/generators/normalize-package-dependencies/schema.json", "description": "Normalizes all projects dependencies within package.json (used on CI)" }, + "verify-peer-dependencies": { + "implementation": "./src/generators/verify-peer-dependencies/index.ts", + "schema": "./src/generators/verify-peer-dependencies/schema.json", + "description": "Verifies peer dependency forwarding chains and peer metadata across all projects (used on CI)" + }, "version-bump": { "implementation": "./src/generators/version-bump/index.ts", "schema": "./src/generators/version-bump/schema.json", diff --git a/tools/workspace-plugin/src/generators/react-library/files/package.json__tmpl__ b/tools/workspace-plugin/src/generators/react-library/files/package.json__tmpl__ index c9cbe18d3f40e0..9cd6636a123d1a 100644 --- a/tools/workspace-plugin/src/generators/react-library/files/package.json__tmpl__ +++ b/tools/workspace-plugin/src/generators/react-library/files/package.json__tmpl__ @@ -30,9 +30,12 @@ }, "peerDependencies": { "@types/react": ">=16.14.0 <20.0.0", - "@types/react-dom": ">=16.9.0 <20.0.0", - "react": ">=16.14.0 <20.0.0", - "react-dom": ">=16.14.0 <20.0.0" + "react": ">=16.14.0 <20.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } }, "exports": { ".": { diff --git a/tools/workspace-plugin/src/generators/verify-peer-dependencies/README.md b/tools/workspace-plugin/src/generators/verify-peer-dependencies/README.md new file mode 100644 index 00000000000000..e4fed86fddbf3a --- /dev/null +++ b/tools/workspace-plugin/src/generators/verify-peer-dependencies/README.md @@ -0,0 +1,163 @@ +# verify-peer-dependencies + +Workspace Generator that validates peer dependency **forwarding chains** and peer metadata across all projects. + +A peer dependency is a promise about what the _consumer_ must provide. This generator checks that the +promises we make are internally consistent and satisfiable. + +### How peers resolve, by installer + +| Installer | Resolution | +| ------------------------------------------------ | ---------------------------------------------------------------------------------------------------------- | +| npm / yarn classic (hoisted) | `require` walks up the directory tree; the nearest ancestor providing the peer wins | +| pnpm, midgard-yarn-strict (isolated, [RFC 0042]) | peer metadata is propagated up the graph automatically, stopping at a real dependency or a local workspace | +| Yarn PnP strict | no ancestor walk — every package in the chain must declare the peer itself | + +Only the last one requires a package to re-declare its dependencies' peers, which is why +`missing-peer-forward` is **opt-in**: Fluent UI targets hoisted and isolated installs, so peer +forwarding is not maintained for Yarn PnP strict. Note this applies to _which package provides_ a peer. The other +checks are about _which versions_ a peer range accepts, which is version math and therefore +installer-independent - they stay on by default. Declaring peers a package never imports is not free: the peer set is +part of a package's virtual instance key, so it forks the virtual store on a dimension the package does not +care about, and it asks consumers to satisfy a module that is never loaded. + +[RFC 0042]: https://github.com/npm/rfcs/blob/main/accepted/0042-isolated-mode.md + + + +- [Usage](#usage) +- [Checks](#checks) +- [Options](#options) + + + +## Usage + +```sh +yarn nx g @fluentui/workspace-plugin:verify-peer-dependencies +``` + +Verify a single project: + +```sh +yarn nx g @fluentui/workspace-plugin:verify-peer-dependencies react-dialog +``` + +Verify everything tagged `vNext`, which is what CI runs on every PR: + +```sh +yarn nx g @fluentui/workspace-plugin:verify-peer-dependencies --tag=vNext +``` + +Fix every missing forward automatically: + +```sh +yarn nx g @fluentui/workspace-plugin:verify-peer-dependencies --fix +``` + +Use nx's global `--verbose` flag (or `NX_VERBOSE_LOGGING=true`) to see exactly what was checked and +what was skipped - useful when a clean result looks suspicious, since "nothing to report" and +"nothing verified" otherwise look identical. Output goes through `logger.verbose`, so nx gates it: + +```sh +yarn nx g @fluentui/workspace-plugin:verify-peer-dependencies react-portal --verbose +``` + +``` +scope + checks incompatible-peer-range, invalid-peer-range, orphaned-peer-meta + packages 1 verified, 255 skipped (127 private, 128 outside --project) + +@fluentui/react-portal packages/react-components/react-portal/library/package.json + declares @types/react, react, react-dom + react '>=16.8.0 <20.0.0' required by @griffel/react -> satisfied by peer '>=16.14.0 <20.0.0' + +totals + 4 peer requirement(s) checked across 1 package(s) + skipped: 3 optional, 0 provided as own dependency, 0 outside --peers +``` + +Scope the run to a single peer while paying down existing debt: + +```sh +yarn nx g @fluentui/workspace-plugin:verify-peer-dependencies --peers=react-dom,scheduler +``` + +## Checks + +| Check | Default | Description | +| ------------------------- | ------- | ---------------------------------------------------------------------------------------------------------------------------- | +| `incompatible-peer-range` | on | The range we advertise accepts versions one of our own dependencies rejects (e.g. `>=16.8.0` onto `>=16.14.0`) | +| `invalid-peer-range` | on | A peer range is not a valid semver range | +| `orphaned-peer-meta` | on | A `peerDependenciesMeta` entry has no matching `peerDependencies` entry | +| `missing-peer-forward` | off | A dependency requires a non-optional peer that this package neither declares as a peer nor owns outright | +| `unverified-peer-range` | off | A range was only checked against the installed copy, while the declared dependency range permits older, uninspected versions | + +Use `--checks=all` to include the opt-in checks, or pass an explicit comma separated list. + +### On `unverified-peer-range` + +Peer ranges are validated against the dependency manifest this workspace has installed. A consumer +resolving the same declared range may legally get an older version with a narrower peer range, so a +passing range check is only as strong as the gap between the declared floor and the installed +version. This check reports that gap, without needing network access. + +Both peer bugs found while building this tool had exactly that shape - `@typescript-eslint/utils` +(`^8.46.2` declared, `8.57.1` installed) and `use-sync-external-store` (`^1.2.0` declared, `1.6.0` +installed). Closing the gap means raising the dependency floor to the version whose peer range you +actually rely on. + +It is opt-in because it reports a limit on what can be verified offline rather than a defect, and +closing it is a judgement call rather than a mechanical fix. + +Resolution rules applied: + +- **Only publishable packages are verified.** A private package is never installed by a consumer, so it has + no peer contract to honour, and it satisfies its own dependencies' peers from `devDependencies` at install + time. Private packages are still read, because publishable packages depend on them. +- A peer is satisfied by `dependencies` (terminates the chain) or by `peerDependencies` (forwards it). + `devDependencies` never satisfy a published contract. +- Peers marked `peerDependenciesMeta..optional` are exempt from forwarding, since they may be + absent. Their version constraint still applies when the peer **is** declared. +- Only `missing-peer-forward` is auto-fixable, so `--fix` enables it even though it is not a default + check. Everything else reports a conflict that needs a human decision. + +> [!IMPORTANT] +> Only mark a peer `optional` when the package can genuinely run without it. `optional` silences the +> install warning but does **not** make the import resolvable — so for a peer that is actually imported it +> converts a loud install-time warning into a silent runtime crash. It is appropriate for types-only peers +> such as `@types/react`, and inappropriate for runtime peers such as `react`, `react-dom` or `scheduler`. + +## Options + +#### `project` + +Comma separated list of projects to verify, accepting either the nx project name (`react-dialog`) or the +package name (`@fluentui/react-dialog`). Defaults to every publishable project. An unknown name is an +error rather than a silent pass. + +#### `tag` + +Comma separated list of nx project tags to verify, e.g. `vNext`. Defaults to every tag. An unknown +tag is an error rather than a silent pass. CI verifies `vNext` on every PR. + +#### `checks` + +Comma separated list of checks to run, or `all`. Defaults to every check except `missing-peer-forward`. + +#### `fix` + +Add every missing forwarded peer to the offending `package.json`, using the range required by the +dependency. When several dependencies require different ranges the narrowest one is used; if no range +contains all the others the conflict is reported instead of guessed. + +Forwarding cascades, so this runs to a fixpoint: adding a peer to one package creates the same +requirement for its dependents. + +> [!NOTE] > `--fix` never throws, even when violations remain that it cannot fix automatically. Throwing from a +> generator makes nx discard the whole tree, which would silently drop the fixes it just applied. Re-run +> without `--fix` to get a failing exit code. + +#### `peers` + +Comma separated list of peer names to check. Defaults to all. diff --git a/tools/workspace-plugin/src/generators/verify-peer-dependencies/index.spec.ts b/tools/workspace-plugin/src/generators/verify-peer-dependencies/index.spec.ts new file mode 100644 index 00000000000000..14d288b0f07747 --- /dev/null +++ b/tools/workspace-plugin/src/generators/verify-peer-dependencies/index.spec.ts @@ -0,0 +1,533 @@ +import { createTreeWithEmptyWorkspace } from '@nx/devkit/testing'; +import { Tree, addProjectConfiguration, readJson, writeJson } from '@nx/devkit'; + +import generator from './index'; +import { PackageJson } from '../../types'; + +describe('verify-peer-dependencies generator', () => { + let tree: Tree; + + beforeEach(() => { + tree = createTreeWithEmptyWorkspace(); + jest.spyOn(console, 'log').mockImplementation(() => undefined); + jest.spyOn(console, 'info').mockImplementation(() => undefined); + jest.spyOn(console, 'warn').mockImplementation(() => undefined); + }); + + afterEach(() => { + jest.restoreAllMocks(); + }); + + describe('missing-peer-forward (opt-in)', () => { + const checks = 'missing-peer-forward'; + + it('should fail when a package does not forward a peer required by its dependency', async () => { + setupPackage(tree, 'react-portal', { peerDependencies: { 'react-dom': '>=16.14.0 <20.0.0' } }); + setupPackage(tree, 'react-dialog', { dependencies: { '@proj/react-portal': '*' } }); + + await expect(generator(tree, { checks: 'missing-peer-forward' })).rejects.toThrow( + 'peer dependency violations found (1)', + ); + }); + + it('should pass when the peer is forwarded', async () => { + setupPackage(tree, 'react-portal', { peerDependencies: { 'react-dom': '>=16.14.0 <20.0.0' } }); + setupPackage(tree, 'react-dialog', { + dependencies: { '@proj/react-portal': '*' }, + peerDependencies: { 'react-dom': '>=16.14.0 <20.0.0' }, + }); + + await expect(generator(tree, { checks })).resolves.toBeUndefined(); + }); + + it('should pass when the peer is provided as a hard dependency, terminating the chain', async () => { + setupPackage(tree, 'react-portal', { peerDependencies: { 'react-dom': '>=16.14.0 <20.0.0' } }); + setupPackage(tree, 'app', { + dependencies: { '@proj/react-portal': '*', 'react-dom': '18.3.1' }, + }); + + await expect(generator(tree, { checks })).resolves.toBeUndefined(); + }); + + it('should ignore optional peers', async () => { + setupPackage(tree, 'react-portal', { + peerDependencies: { 'react-dom': '>=16.14.0 <20.0.0' }, + peerDependenciesMeta: { 'react-dom': { optional: true } }, + }); + setupPackage(tree, 'react-dialog', { dependencies: { '@proj/react-portal': '*' } }); + + await expect(generator(tree, { checks })).resolves.toBeUndefined(); + }); + + it('should not verify private packages', async () => { + setupPackage(tree, 'react-portal', { peerDependencies: { 'react-dom': '>=16.14.0 <20.0.0' } }); + setupPackage(tree, 'private-app', { + private: true, + dependencies: { '@proj/react-portal': '*' }, + }); + + await expect(generator(tree, { checks })).resolves.toBeUndefined(); + }); + + it('should reject devDependencies for publishable packages', async () => { + setupPackage(tree, 'react-portal', { peerDependencies: { 'react-dom': '>=16.14.0 <20.0.0' } }); + setupPackage(tree, 'react-dialog', { + dependencies: { '@proj/react-portal': '*' }, + devDependencies: { 'react-dom': '18.3.1' }, + }); + + await expect(generator(tree, { checks })).rejects.toThrow('peer dependency violations found (1)'); + }); + }); + + describe('--project filter', () => { + it('should only verify the requested project', async () => { + setupPackage(tree, 'react-portal', { peerDependencies: { 'react-dom': '>=16.14.0 <20.0.0' } }); + setupPackage(tree, 'react-dialog', { dependencies: { '@proj/react-portal': '*' } }); + setupPackage(tree, 'react-menu', { dependencies: { '@proj/react-portal': '*' } }); + + await expect(generator(tree, { checks: 'all', project: 'react-dialog' })).rejects.toThrow( + 'peer dependency violations found (1)', + ); + }); + + it('should accept a package name as well as a project name', async () => { + setupPackage(tree, 'react-portal', { peerDependencies: { 'react-dom': '>=16.14.0 <20.0.0' } }); + setupPackage(tree, 'react-dialog', { dependencies: { '@proj/react-portal': '*' } }); + + await expect(generator(tree, { checks: 'all', project: '@proj/react-dialog' })).rejects.toThrow( + 'peer dependency violations found (1)', + ); + }); + + it('should pass when the scoped project is clean even though others are not', async () => { + setupPackage(tree, 'react-portal', { peerDependencies: { 'react-dom': '>=16.14.0 <20.0.0' } }); + setupPackage(tree, 'react-dialog', { dependencies: { '@proj/react-portal': '*' } }); + setupPackage(tree, 'react-menu', { + dependencies: { '@proj/react-portal': '*' }, + peerDependencies: { 'react-dom': '>=16.14.0 <20.0.0' }, + }); + + await expect(generator(tree, { checks: 'all', project: 'react-menu' })).resolves.toBeUndefined(); + }); + + it('should throw on an unknown project rather than silently verifying nothing', async () => { + setupPackage(tree, 'react-portal', { peerDependencies: { 'react-dom': '>=16.14.0 <20.0.0' } }); + + await expect(generator(tree, { checks: 'all', project: 'does-not-exist' })).rejects.toThrow( + 'Unknown project(s): does-not-exist', + ); + }); + }); + + describe('incompatible-peer-range', () => { + it('should detect a range unbounded below', async () => { + // `*` contributes no lower comparator, so probing only comparator versions would miss that + // it permits everything beneath the required floor + setupPackage(tree, 'react-portal', { peerDependencies: { react: '>=16.14.0 <20.0.0' } }); + setupPackage(tree, 'react-dialog', { + dependencies: { '@proj/react-portal': '*' }, + peerDependencies: { react: '*' }, + }); + + await expect(generator(tree)).rejects.toThrow('peer dependency violations found (1)'); + }); + + it('should detect an upper-bounded range that is still unbounded below', async () => { + setupPackage(tree, 'react-portal', { peerDependencies: { react: '>=16.14.0 <20.0.0' } }); + setupPackage(tree, 'react-dialog', { + dependencies: { '@proj/react-portal': '*' }, + peerDependencies: { react: '<20.0.0' }, + }); + + await expect(generator(tree)).rejects.toThrow('peer dependency violations found (1)'); + }); + + it('should validate the range of an optional peer that this package declares', async () => { + // optional means the peer may be absent, not that its version constraint disappears + setupPackage(tree, 'react-portal', { + peerDependencies: { 'react-dom': '^18.0.0' }, + peerDependenciesMeta: { 'react-dom': { optional: true } }, + }); + setupPackage(tree, 'react-dialog', { + dependencies: { '@proj/react-portal': '*' }, + peerDependencies: { 'react-dom': '^19.0.0' }, + }); + + await expect(generator(tree)).rejects.toThrow('peer dependency violations found (1)'); + }); + + it('should still not require forwarding of an optional peer', async () => { + setupPackage(tree, 'react-portal', { + peerDependencies: { 'react-dom': '^18.0.0' }, + peerDependenciesMeta: { 'react-dom': { optional: true } }, + }); + setupPackage(tree, 'react-dialog', { dependencies: { '@proj/react-portal': '*' } }); + + await expect(generator(tree, { checks: 'all' })).resolves.toBeUndefined(); + }); + + it('should fail when the forwarded range is wider than what the dependency supports', async () => { + setupPackage(tree, 'react-portal', { peerDependencies: { react: '>=16.14.0 <20.0.0' } }); + setupPackage(tree, 'react-dialog', { + dependencies: { '@proj/react-portal': '*' }, + peerDependencies: { react: '>=16.8.0 <20.0.0' }, + }); + + await expect(generator(tree)).rejects.toThrow('peer dependency violations found (1)'); + }); + + it('should pass when the forwarded range is narrower than what the dependency supports', async () => { + setupPackage(tree, 'react-portal', { peerDependencies: { react: '>=16.8.0 <20.0.0' } }); + setupPackage(tree, 'react-dialog', { + dependencies: { '@proj/react-portal': '*' }, + peerDependencies: { react: '>=16.14.0 <20.0.0' }, + }); + + await expect(generator(tree)).resolves.toBeUndefined(); + }); + + it('should treat a union of carets as its combined range', async () => { + // `^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0` is exactly `>=16.8.0 <20.0.0`. + // semver.subset() reports this as a violation because it compares against each + // comparator set in isolation. + setupPackage(tree, 'use-sync-external-store-like', { + peerDependencies: { react: '^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0' }, + }); + setupPackage(tree, 'react-positioning', { + dependencies: { '@proj/use-sync-external-store-like': '*' }, + peerDependencies: { react: '>=16.14.0 <20.0.0' }, + }); + + await expect(generator(tree)).resolves.toBeUndefined(); + }); + + it('should still detect a union of carets that stops short of the declared range', async () => { + // missing `^19.0.0`, so react 19 is promised but unsupported + setupPackage(tree, 'use-sync-external-store-like', { + peerDependencies: { react: '^16.8.0 || ^17.0.0 || ^18.0.0' }, + }); + setupPackage(tree, 'react-positioning', { + dependencies: { '@proj/use-sync-external-store-like': '*' }, + peerDependencies: { react: '>=16.14.0 <20.0.0' }, + }); + + await expect(generator(tree)).rejects.toThrow('peer dependency violations found (1)'); + }); + + it('should detect an exclusive lower bound that escapes the required range', async () => { + setupPackage(tree, 'react-portal', { peerDependencies: { react: '>=16.15.0' } }); + setupPackage(tree, 'react-dialog', { + dependencies: { '@proj/react-portal': '*' }, + peerDependencies: { react: '>16.14.0' }, + }); + + await expect(generator(tree)).rejects.toThrow('peer dependency violations found (1)'); + }); + }); + + describe('manifest validation', () => { + it('should fail on an invalid semver range', async () => { + setupPackage(tree, 'react-one', { peerDependencies: { react: 'not-a-range' } }); + + await expect(generator(tree)).rejects.toThrow('peer dependency violations found (1)'); + }); + + it('should fail on peerDependenciesMeta without a matching peerDependencies entry', async () => { + setupPackage(tree, 'react-one', { + peerDependencies: { react: '>=16.14.0 <20.0.0' }, + peerDependenciesMeta: { 'react-dom': { optional: true } }, + }); + + await expect(generator(tree)).rejects.toThrow('peer dependency violations found (1)'); + }); + }); + + describe('--peers filter', () => { + it('should only check the requested peers', async () => { + setupPackage(tree, 'react-portal', { + peerDependencies: { 'react-dom': '>=16.14.0 <20.0.0', scheduler: '>=0.19.0' }, + }); + setupPackage(tree, 'react-dialog', { dependencies: { '@proj/react-portal': '*' } }); + + await expect(generator(tree, { checks: 'all', peers: 'scheduler' })).rejects.toThrow( + 'peer dependency violations found (1)', + ); + }); + }); + + describe('--tag filter', () => { + it('should only verify projects carrying the tag', async () => { + setupPackage(tree, 'react-portal', { peerDependencies: { 'react-dom': '>=16.14.0 <20.0.0' } }, ['vNext']); + setupPackage(tree, 'react-dialog', { dependencies: { '@proj/react-portal': '*' } }, ['vNext']); + setupPackage(tree, 'legacy-thing', { dependencies: { '@proj/react-portal': '*' } }, ['v8']); + + await expect(generator(tree, { checks: 'all', tag: 'vNext' })).rejects.toThrow( + 'peer dependency violations found (1)', + ); + }); + + it('should pass when every violation sits outside the tag', async () => { + setupPackage(tree, 'react-portal', { peerDependencies: { 'react-dom': '>=16.14.0 <20.0.0' } }, ['vNext']); + setupPackage(tree, 'legacy-thing', { dependencies: { '@proj/react-portal': '*' } }, ['v8']); + + await expect(generator(tree, { checks: 'all', tag: 'vNext' })).resolves.toBeUndefined(); + }); + + it('should throw on an unknown tag rather than silently verifying nothing', async () => { + setupPackage(tree, 'react-portal', { peerDependencies: { 'react-dom': '>=16.14.0 <20.0.0' } }, ['vNext']); + + await expect(generator(tree, { checks: 'all', tag: 'nope' })).rejects.toThrow('Unknown tag(s): nope'); + }); + }); + + describe('optional peer metadata', () => { + it('should not require forwarding of a peer marked optional by the dependency', async () => { + setupPackage(tree, 'react-utilities', { + peerDependencies: { '@types/react': '>=16.14.0 <20.0.0', react: '>=16.14.0 <20.0.0' }, + peerDependenciesMeta: { '@types/react': { optional: true } }, + }); + setupPackage(tree, 'react-button', { + dependencies: { '@proj/react-utilities': '*' }, + peerDependencies: { react: '>=16.14.0 <20.0.0' }, + }); + + await expect(generator(tree)).resolves.toBeUndefined(); + }); + }); + + describe('default checks', () => { + it('should not report missing-peer-forward by default', async () => { + // hoisted and isolated-mode installers resolve the peer from the nearest ancestor that + // provides it, so forwarding is only required under Yarn PnP strict + setupPackage(tree, 'react-portal', { peerDependencies: { 'react-dom': '>=16.14.0 <20.0.0' } }); + setupPackage(tree, 'react-dialog', { dependencies: { '@proj/react-portal': '*' } }); + + await expect(generator(tree)).resolves.toBeUndefined(); + }); + + it('should still report the installer-independent checks by default', async () => { + setupPackage(tree, 'react-one', { peerDependencies: { react: 'not-a-range' } }); + + await expect(generator(tree)).rejects.toThrow('peer dependency violations found (1)'); + }); + + it('should report missing-peer-forward when explicitly requested', async () => { + setupPackage(tree, 'react-portal', { peerDependencies: { 'react-dom': '>=16.14.0 <20.0.0' } }); + setupPackage(tree, 'react-dialog', { dependencies: { '@proj/react-portal': '*' } }); + + await expect(generator(tree, { checks: 'all' })).rejects.toThrow('peer dependency violations found (1)'); + }); + + it('should throw on an unknown check', async () => { + setupPackage(tree, 'react-one', {}); + + await expect(generator(tree, { checks: 'nonsense' })).rejects.toThrow('Unknown check(s): nonsense'); + }); + }); + + describe('--verbose', () => { + // nx strips `--verbose` from the generator schema but sets NX_VERBOSE_LOGGING, which is what + // logger.verbose is gated on + beforeEach(() => { + process.env.NX_VERBOSE_LOGGING = 'true'; + }); + + afterEach(() => { + delete process.env.NX_VERBOSE_LOGGING; + }); + + it('should report what was verified and what was skipped', async () => { + setupPackage(tree, 'react-portal', { peerDependencies: { react: '>=16.14.0 <20.0.0' } }); + setupPackage(tree, 'react-dialog', { + dependencies: { '@proj/react-portal': '*' }, + peerDependencies: { react: '>=16.14.0 <20.0.0' }, + }); + setupPackage(tree, 'private-app', { private: true, dependencies: { '@proj/react-portal': '*' } }); + + const log = jest.spyOn(console, 'log').mockImplementation(() => undefined); + + await expect(generator(tree)).resolves.toBeUndefined(); + + const output = log.mock.calls.flat().join('\n'); + + expect(output).toContain('scope'); + expect(output).toContain('skipped'); + expect(output).toContain('private'); + expect(output).toContain('@proj/react-dialog'); + expect(output).toContain('required by @proj/react-portal'); + expect(output).toContain('peer requirement(s) checked'); + }); + + it('should not change the outcome', async () => { + setupPackage(tree, 'react-one', { peerDependencies: { react: 'not-a-range' } }); + + await expect(generator(tree)).rejects.toThrow('peer dependency violations found (1)'); + }); + + it('should stay silent without NX_VERBOSE_LOGGING', async () => { + delete process.env.NX_VERBOSE_LOGGING; + setupPackage(tree, 'react-portal', { peerDependencies: { react: '>=16.14.0 <20.0.0' } }); + + const log = jest.spyOn(console, 'log').mockImplementation(() => undefined); + + await generator(tree); + + expect(log.mock.calls.flat().join('\n')).not.toContain('peer requirement(s) checked'); + }); + }); + + describe('unverified-peer-range', () => { + it('should be off by default', async () => { + setupPackage(tree, 'react-one', { + dependencies: { 'external-dep': '^1.0.0' }, + peerDependencies: { react: '>=16.14.0 <20.0.0' }, + }); + writeJson(tree, 'node_modules/external-dep/package.json', { + name: 'external-dep', + version: '1.5.0', + peerDependencies: { react: '>=16.14.0 <20.0.0' }, + }); + + await expect(generator(tree)).resolves.toBeUndefined(); + }); + + it('should report when the declared range permits a version that was not inspected', async () => { + setupPackage(tree, 'react-one', { + dependencies: { 'external-dep': '^1.0.0' }, + peerDependencies: { react: '>=16.14.0 <20.0.0' }, + }); + writeJson(tree, 'node_modules/external-dep/package.json', { + name: 'external-dep', + version: '1.5.0', + peerDependencies: { react: '>=16.14.0 <20.0.0' }, + }); + + await expect(generator(tree, { checks: 'unverified-peer-range' })).rejects.toThrow( + 'peer dependency violations found (1)', + ); + }); + + it('should stay silent when the declared floor is the inspected version', async () => { + setupPackage(tree, 'react-one', { + dependencies: { 'external-dep': '1.5.0' }, + peerDependencies: { react: '>=16.14.0 <20.0.0' }, + }); + writeJson(tree, 'node_modules/external-dep/package.json', { + name: 'external-dep', + version: '1.5.0', + peerDependencies: { react: '>=16.14.0 <20.0.0' }, + }); + + await expect(generator(tree, { checks: 'unverified-peer-range' })).resolves.toBeUndefined(); + }); + + it('should not apply to workspace dependencies', async () => { + setupPackage(tree, 'react-portal', { peerDependencies: { react: '>=16.14.0 <20.0.0' } }); + setupPackage(tree, 'react-dialog', { + dependencies: { '@proj/react-portal': '^9.0.0' }, + peerDependencies: { react: '>=16.14.0 <20.0.0' }, + }); + + await expect(generator(tree, { checks: 'unverified-peer-range' })).resolves.toBeUndefined(); + }); + }); + + describe('--fix', () => { + it('should enable missing-peer-forward even though it is not a default check', async () => { + setupPackage(tree, 'react-portal', { peerDependencies: { 'react-dom': '>=16.14.0 <20.0.0' } }); + const { readPackageJson } = setupPackage(tree, 'react-dialog', { + dependencies: { '@proj/react-portal': '*' }, + }); + + await generator(tree, { fix: true }); + + expect(readPackageJson().peerDependencies).toEqual({ 'react-dom': '>=16.14.0 <20.0.0' }); + }); + it('should add the missing peer using the range required by the dependency', async () => { + setupPackage(tree, 'react-portal', { peerDependencies: { 'react-dom': '>=16.14.0 <20.0.0' } }); + const { readPackageJson } = setupPackage(tree, 'react-dialog', { + dependencies: { '@proj/react-portal': '*' }, + peerDependencies: { react: '>=16.14.0 <20.0.0' }, + }); + + await generator(tree, { checks: 'all', fix: true }); + + expect(readPackageJson().peerDependencies).toEqual({ + react: '>=16.14.0 <20.0.0', + 'react-dom': '>=16.14.0 <20.0.0', + }); + }); + + it('should pick the narrowest range when dependencies disagree', async () => { + setupPackage(tree, 'react-portal', { peerDependencies: { 'react-dom': '>=16.8.0 <20.0.0' } }); + setupPackage(tree, 'react-combobox', { peerDependencies: { 'react-dom': '>=16.14.0 <20.0.0' } }); + const { readPackageJson } = setupPackage(tree, 'react-dialog', { + dependencies: { '@proj/react-portal': '*', '@proj/react-combobox': '*' }, + }); + + await generator(tree, { checks: 'all', fix: true }); + + expect(readPackageJson().peerDependencies).toEqual({ 'react-dom': '>=16.14.0 <20.0.0' }); + }); + + it('should be idempotent', async () => { + setupPackage(tree, 'react-portal', { peerDependencies: { 'react-dom': '>=16.14.0 <20.0.0' } }); + setupPackage(tree, 'react-dialog', { dependencies: { '@proj/react-portal': '*' } }); + + await generator(tree, { checks: 'all', fix: true }); + await expect(generator(tree, { checks: 'all' })).resolves.toBeUndefined(); + }); + + it('should persist fixes even when unfixable violations remain', async () => { + // an incompatible range cannot be auto-fixed; the missing forward still must be written + setupPackage(tree, 'react-portal', { + peerDependencies: { 'react-dom': '>=16.14.0 <20.0.0', react: '>=16.14.0 <20.0.0' }, + }); + const { readPackageJson } = setupPackage(tree, 'react-dialog', { + dependencies: { '@proj/react-portal': '*' }, + peerDependencies: { react: '>=16.8.0 <20.0.0' }, + }); + + await expect(generator(tree, { checks: 'all', fix: true })).resolves.toBeUndefined(); + + expect(readPackageJson().peerDependencies).toEqual({ + react: '>=16.8.0 <20.0.0', + 'react-dom': '>=16.14.0 <20.0.0', + }); + }); + + it('should resolve a cascading chain in a single run', async () => { + // scheduler originates in the leaf and has to reach the top of the chain + setupPackage(tree, 'react-context-selector', { peerDependencies: { scheduler: '>=0.19.0' } }); + setupPackage(tree, 'react-menu', { dependencies: { '@proj/react-context-selector': '*' } }); + setupPackage(tree, 'react-dialog', { dependencies: { '@proj/react-menu': '*' } }); + const { readPackageJson } = setupPackage(tree, 'react-components', { + dependencies: { '@proj/react-dialog': '*' }, + }); + + await generator(tree, { checks: 'all', fix: true }); + + expect(readPackageJson().peerDependencies).toEqual({ scheduler: '>=0.19.0' }); + await expect(generator(tree, { checks: 'all' })).resolves.toBeUndefined(); + }); + }); +}); + +function setupPackage(tree: Tree, name: string, packageJson: Partial, tags: string[] = []) { + const root = `packages/${name}`; + + addProjectConfiguration(tree, name, { root, projectType: 'library', tags }); + + const packageJsonPath = `${root}/package.json`; + + writeJson>(tree, packageJsonPath, { + name: `@proj/${name}`, + version: '9.0.0', + ...packageJson, + }); + + return { + readPackageJson: () => readJson(tree, packageJsonPath), + }; +} diff --git a/tools/workspace-plugin/src/generators/verify-peer-dependencies/index.ts b/tools/workspace-plugin/src/generators/verify-peer-dependencies/index.ts new file mode 100644 index 00000000000000..e1ae6f1ac0d2d9 --- /dev/null +++ b/tools/workspace-plugin/src/generators/verify-peer-dependencies/index.ts @@ -0,0 +1,859 @@ +import { Tree, formatFiles, getProjects, joinPathFragments, logger, readJson, updateJson } from '@nx/devkit'; +import chalk from 'chalk'; +import semver from 'semver'; + +import type { PackageJson } from '../../types'; +import { PeerDependencyCheck, VerifyPeerDependenciesGeneratorSchema } from './schema'; + +type ViolationKind = PeerDependencyCheck; + +const ALL_CHECKS: ViolationKind[] = [ + 'missing-peer-forward', + 'incompatible-peer-range', + 'invalid-peer-range', + 'orphaned-peer-meta', + 'unverified-peer-range', +]; + +/** + * `missing-peer-forward` is opt-in. Hoisted (npm/yarn classic) and isolated-mode installers + * (pnpm, midgard-yarn-strict) resolve a peer from the nearest ancestor that provides it, and + * isolated mode additionally propagates peer metadata up the graph on its own, so re-declaring a + * dependency's peer is a no-op there. It is only required under Yarn PnP strict resolution, and + * declaring peers a package never imports actively costs something: the peer set is part of a + * package's virtual instance key, and consumers are asked to satisfy a module that is never loaded. + */ +/** + * `unverified-peer-range` is opt-in for a different reason: it reports a gap in what we are able + * to verify offline rather than a defect, and closing it means either raising a dependency floor + * or accepting the risk - both judgement calls rather than mechanical fixes. + */ +const OPT_IN_CHECKS: ViolationKind[] = ['missing-peer-forward', 'unverified-peer-range']; + +const DEFAULT_CHECKS: ViolationKind[] = ALL_CHECKS.filter(check => !OPT_IN_CHECKS.includes(check)); + +interface Violation { + kind: ViolationKind; + /** package that owns the problem */ + packageName: string; + packageJsonPath: string; + /** the peer dependency name */ + peer: string; + /** dependency that requires the peer (missing-peer-forward / incompatible-peer-range only) */ + requiredBy?: string; + /** range required by `requiredBy` */ + requiredRange?: string; + /** range currently declared by `packageName` */ + declaredRange?: string; + /** version of `requiredBy` whose manifest was actually consulted */ + inspectedVersion?: string; + /** lowest version the dependency range permits, when it differs from `inspectedVersion` */ + lowestPermittedVersion?: string; +} + +/** + * Records what the run actually looked at. Without it a clean result is ambiguous: nothing to + * report and nothing verified look identical. + */ +interface Trace { + skipped: Array<{ packageName: string; reason: string }>; + verified: Array<{ + packageName: string; + packageJsonPath: string; + declared: string[]; + requirements: Array<{ peer: string; requiredBy: string; requiredRange: string; verdict: string }>; + }>; + /** dependency name -> packages that depend on it */ + unresolved: Map>; + skippedRequirements: { optional: number; filtered: number; ownDependency: number }; +} + +function createTrace(): Trace { + return { + skipped: [], + verified: [], + unresolved: new Map(), + skippedRequirements: { optional: 0, filtered: 0, ownDependency: 0 }, + }; +} + +interface PackageEntry { + packageJson: PackageJson; + packageJsonPath: string; + /** nx project name, absent for the workspace root package.json */ + projectName?: string; + /** nx project tags, e.g. `vNext` / `v8` */ + tags: string[]; + /** published to npm - only publishable packages carry a peer contract worth verifying */ + publishable: boolean; +} + +/** + * Ranges that carry no semver meaning for a published consumer, so they are skipped + * during compatibility math. + */ +/** + * Protocol ranges carry no semver meaning, so version math cannot say anything about them. + * `*` is deliberately not listed: it is a valid semver range, and as a peer range it is a real + * (maximally broad) claim that should be validated like any other. + */ +const NON_SEMVER_RANGE = /^(workspace:|portal:|link:|file:|npm:|patch:)/; + +/** + * Forwarding cascades - adding a peer to a package creates the same requirement for its + * dependents - so `--fix` runs to a fixpoint. The bound only guards against a pathological + * graph; in practice this settles in a handful of passes. + */ +const MAX_FIX_PASSES = 20; + +/** + * `--verbose` is an nx global flag: nx strips it from the generator schema but sets + * `NX_VERBOSE_LOGGING`, which is exactly what `logger.verbose` is gated on. Tracing is therefore + * built whenever that env var is set, and `logger.verbose` decides whether it is printed. + */ +function isVerbose() { + return process.env.NX_VERBOSE_LOGGING === 'true'; +} + +export default async function (tree: Tree, schema: VerifyPeerDependenciesGeneratorSchema = {}) { + const verbose = isVerbose(); + const peerFilter = toFilter(schema.peers); + const projectFilter = toFilter(schema.project); + const tagFilter = toFilter(schema.tag); + // `--fix` can only repair missing-peer-forward, which is not a default check, so a bare + // `--fix` would otherwise collect nothing and silently change nothing. + const checks = resolveChecks(schema.checks, { fix: Boolean(schema.fix) }); + + if (projectFilter || tagFilter) { + assertFiltersMatch({ packages: readWorkspacePackages(tree), projectFilter, tagFilter }); + } + + const verify = (trace: Trace | null = null) => { + const packages = readWorkspacePackages(tree); + + return { + packages, + violations: collectViolations(tree, { packages, peerFilter, projectFilter, tagFilter, checks, trace }), + }; + }; + + if (schema.fix) { + let fixedCount = 0; + + for (let pass = 0; pass < MAX_FIX_PASSES; pass++) { + const { packages, violations } = verify(); + const fixed = applyFixes(tree, { packages, violations }); + + if (fixed.size === 0) { + break; + } + + fixedCount += fixed.size; + } + + await formatFiles(tree); + + const trace = verbose ? createTrace() : null; + const { violations } = verify(trace); + + if (trace) { + reportTrace(trace, checks); + } + + report(violations, { fixedCount, throwOnViolations: false }); + + return; + } + + const trace = verbose ? createTrace() : null; + const { violations } = verify(trace); + + if (trace) { + reportTrace(trace, checks); + } + + report(violations, { fixedCount: 0, throwOnViolations: true }); +} + +const FIXABLE_CHECKS: ViolationKind[] = ['missing-peer-forward']; + +function resolveChecks(value: string | undefined, options: { fix: boolean } = { fix: false }): Set { + if (!value) { + return new Set(options.fix ? [...DEFAULT_CHECKS, ...FIXABLE_CHECKS] : DEFAULT_CHECKS); + } + + const requested = value + .split(',') + .map(item => item.trim()) + .filter(Boolean); + + if (requested.includes('all')) { + return new Set(ALL_CHECKS); + } + + const unknown = requested.filter(check => !ALL_CHECKS.includes(check as ViolationKind)); + + if (unknown.length > 0) { + throw new Error(`Unknown check(s): ${unknown.join(', ')}. Known checks: ${ALL_CHECKS.join(', ')}, all`); + } + + const resolved = new Set(requested as ViolationKind[]); + + if (options.fix) { + FIXABLE_CHECKS.forEach(check => resolved.add(check)); + } + + return resolved; +} + +function toFilter(value: string | undefined) { + if (!value) { + return null; + } + + const values = value + .split(',') + .map(item => item.trim()) + .filter(Boolean); + + return values.length > 0 ? new Set(values) : null; +} + +/** + * A project name that matches nothing would silently verify nothing, which reads as a pass. + */ +function assertFiltersMatch(options: { + packages: Map; + projectFilter: Set | null; + tagFilter: Set | null; +}) { + const { packages, projectFilter, tagFilter } = options; + const knownProjects = new Set(); + const knownTags = new Set(); + + for (const [packageName, entry] of packages) { + knownProjects.add(packageName); + + if (entry.projectName) { + knownProjects.add(entry.projectName); + } + + entry.tags.forEach(tag => knownTags.add(tag)); + } + + const unknownProjects = [...(projectFilter ?? [])].filter(name => !knownProjects.has(name)); + + if (unknownProjects.length > 0) { + throw new Error(`Unknown project(s): ${unknownProjects.join(', ')}`); + } + + const unknownTags = [...(tagFilter ?? [])].filter(tag => !knownTags.has(tag)); + + if (unknownTags.length > 0) { + throw new Error(`Unknown tag(s): ${unknownTags.join(', ')}`); + } +} + +function readWorkspacePackages(tree: Tree) { + const packages = new Map(); + + const register = (packageJsonPath: string, options: { projectName?: string; tags?: string[] } = {}) => { + if (!tree.exists(packageJsonPath)) { + return; + } + + const packageJson = readJson(tree, packageJsonPath); + + if (!packageJson.name) { + return; + } + + packages.set(packageJson.name, { + packageJson, + packageJsonPath, + projectName: options.projectName, + tags: options.tags ?? [], + publishable: !packageJson.private, + }); + }; + + getProjects(tree).forEach((project, projectName) => + register(joinPathFragments(project.root, 'package.json'), { projectName, tags: project.tags ?? [] }), + ); + register('package.json'); + + return packages; +} + +/** + * Peers of a dependency. Workspace packages are read from the tree, everything else from + * the installed node_modules copy. A dependency that cannot be resolved is skipped rather + * than reported, so the generator stays usable before `yarn install`. + */ +function getDependencyManifest( + tree: Tree, + options: { packages: Map; dependencyName: string }, +): { manifest: PackageJson; isWorkspace: boolean } | null { + const { packages, dependencyName } = options; + const workspacePackage = packages.get(dependencyName); + + if (workspacePackage) { + return { manifest: workspacePackage.packageJson, isWorkspace: true }; + } + + const externalPackageJsonPath = `node_modules/${dependencyName}/package.json`; + + return tree.exists(externalPackageJsonPath) + ? { manifest: readJson(tree, externalPackageJsonPath), isWorkspace: false } + : null; +} + +/** + * The manifest we can read offline is whichever version this workspace happens to have installed. + * A consumer resolving the same declared range may legally get an older version with a narrower + * peer range, so a range check against the installed copy is only as strong as the gap between + * the two. + */ +function getUnverifiedFloor(options: { declaredDependencyRange: string; inspectedVersion: string }) { + const { declaredDependencyRange, inspectedVersion } = options; + + if (NON_SEMVER_RANGE.test(declaredDependencyRange) || semver.validRange(declaredDependencyRange) === null) { + return null; + } + + const lowest = semver.minVersion(declaredDependencyRange); + + if (!lowest || !semver.valid(inspectedVersion) || lowest.version === inspectedVersion) { + return null; + } + + return lowest.version; +} + +function collectViolations( + tree: Tree, + options: { + packages: Map; + peerFilter: Set | null; + projectFilter: Set | null; + tagFilter: Set | null; + checks: Set; + trace: Trace | null; + }, +) { + const { packages, peerFilter, projectFilter, tagFilter, checks, trace } = options; + const violations: Violation[] = []; + const isChecked = (peer: string) => !peerFilter || peerFilter.has(peer); + + for (const [packageName, entry] of packages) { + const skipReason = getSkipReason({ packageName, entry, projectFilter, tagFilter }); + + if (skipReason) { + trace?.skipped.push({ packageName, reason: skipReason }); + continue; + } + + const { packageJson, packageJsonPath } = entry; + const traced: Trace['verified'][number] = { + packageName, + packageJsonPath, + declared: Object.keys(packageJson.peerDependencies ?? {}), + requirements: [], + }; + trace?.verified.push(traced); + + violations.push(...getManifestViolations({ packageName, packageJsonPath, packageJson, isChecked, checks })); + + for (const [dependencyName, declaredDependencyRange] of Object.entries(packageJson.dependencies ?? {})) { + const resolvedDependency = getDependencyManifest(tree, { packages, dependencyName }); + + if (!resolvedDependency) { + if (trace) { + const dependents = trace.unresolved.get(dependencyName) ?? new Set(); + dependents.add(packageName); + trace.unresolved.set(dependencyName, dependents); + } + + continue; + } + + const dependencyManifest = resolvedDependency.manifest; + const unverifiedFloor = resolvedDependency.isWorkspace + ? null + : getUnverifiedFloor({ declaredDependencyRange, inspectedVersion: dependencyManifest.version }); + + for (const [peer, requiredRange] of Object.entries(dependencyManifest.peerDependencies ?? {})) { + if (!isChecked(peer)) { + if (trace) { + trace.skippedRequirements.filtered++; + } + + continue; + } + + // `optional` means the peer may be absent, not that its version constraint disappears. + // When this package does declare the peer, the range still has to be compatible. + const isOptional = Boolean(dependencyManifest.peerDependenciesMeta?.[peer]?.optional); + const declaredRange = packageJson.peerDependencies?.[peer]; + + if (isOptional && !declaredRange) { + if (trace) { + trace.skippedRequirements.optional++; + } + + continue; + } + + // `dependencies` terminates the chain, `peerDependencies` forwards it. `devDependencies` + // are never installed for consumers, so they cannot satisfy a published contract. + if (packageJson.dependencies?.[peer]) { + if (trace) { + trace.skippedRequirements.ownDependency++; + } + + continue; + } + + traced.requirements.push({ + peer, + requiredBy: dependencyName, + requiredRange, + verdict: !declaredRange + ? 'not declared' + : isRangeCompatible(declaredRange, requiredRange) + ? `satisfied by peer '${declaredRange}'` + : `INCOMPATIBLE with peer '${declaredRange}'`, + }); + + if (!declaredRange) { + if (checks.has('missing-peer-forward')) { + violations.push({ + kind: 'missing-peer-forward', + packageName, + packageJsonPath, + peer, + requiredBy: dependencyName, + requiredRange, + }); + } + + continue; + } + + if (checks.has('incompatible-peer-range') && !isRangeCompatible(declaredRange, requiredRange)) { + violations.push({ + kind: 'incompatible-peer-range', + packageName, + packageJsonPath, + peer, + requiredBy: dependencyName, + requiredRange, + declaredRange, + inspectedVersion: dependencyManifest.version, + }); + + continue; + } + + // The range check above only proves compatibility with the installed copy. + if (checks.has('unverified-peer-range') && unverifiedFloor) { + violations.push({ + kind: 'unverified-peer-range', + packageName, + packageJsonPath, + peer, + requiredBy: dependencyName, + requiredRange, + declaredRange, + inspectedVersion: dependencyManifest.version, + lowestPermittedVersion: unverifiedFloor, + }); + } + } + } + } + + return violations; +} + +/** + * Only publishable packages are verified: a private package is never installed by a consumer, + * so it has no peer contract to honour and satisfies its own dependencies' peers from + * devDependencies at install time. + */ +function getSkipReason(options: { + packageName: string; + entry: PackageEntry; + projectFilter: Set | null; + tagFilter: Set | null; +}): string | null { + const { packageName, entry, projectFilter, tagFilter } = options; + + if (!entry.publishable) { + return 'private'; + } + + if (tagFilter && !entry.tags.some(tag => tagFilter.has(tag))) { + return 'outside --tag'; + } + + if ( + projectFilter && + !(projectFilter.has(packageName) || (entry.projectName && projectFilter.has(entry.projectName))) + ) { + return 'outside --project'; + } + + return null; +} + +function getManifestViolations(options: { + packageName: string; + packageJsonPath: string; + packageJson: PackageJson; + isChecked: (peer: string) => boolean; + checks: Set; +}) { + const { packageName, packageJsonPath, packageJson, isChecked, checks } = options; + const violations: Violation[] = []; + const peerDependencies = packageJson.peerDependencies ?? {}; + + for (const [peer, range] of Object.entries(peerDependencies)) { + if (!isChecked(peer) || NON_SEMVER_RANGE.test(range)) { + continue; + } + + if (checks.has('invalid-peer-range') && semver.validRange(range) === null) { + violations.push({ kind: 'invalid-peer-range', packageName, packageJsonPath, peer, declaredRange: range }); + } + } + + for (const peer of Object.keys(packageJson.peerDependenciesMeta ?? {})) { + if (checks.has('orphaned-peer-meta') && isChecked(peer) && !peerDependencies[peer]) { + violations.push({ kind: 'orphaned-peer-meta', packageName, packageJsonPath, peer }); + } + } + + return violations; +} + +/** + * Boundary versions of every comparator in a range, i.e. the points where membership can flip. + */ +function getRangeBoundaries(range: string) { + const boundaries = new Set(); + + try { + for (const comparators of new semver.Range(range).set) { + for (const comparator of comparators) { + const version = comparator.semver?.version; + + if (version) { + boundaries.add(version); + } + } + } + } catch { + return []; + } + + return [...boundaries]; +} + +/** + * `semver.subset` reports a false negative when the dominant range is a union of carets such + * as `^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0`: it tests containment against each comparator + * set individually rather than against their union, so a range spanning several carets looks + * unsupported even though the union covers it. + * + * Probing boundaries is union-safe and deterministic. Both ranges are unions of intervals whose + * endpoints are comparator versions, so whenever `sub` is not contained in `dom` a witness + * version exists at - or immediately above - one of those endpoints. + */ +function isSubset(sub: string, dom: string) { + const probes = new Set(); + + // Comparator versions alone miss ranges that are unbounded below - `*` and `<20.0.0` contribute + // no lower boundary, so nothing would probe beneath the dominant range's floor. + const lowest = semver.minVersion(sub); + + if (lowest) { + probes.add(lowest.version); + } + + for (const range of [sub, dom]) { + for (const boundary of getRangeBoundaries(range)) { + probes.add(boundary); + + const justAbove = semver.inc(boundary, 'patch'); + + if (justAbove) { + probes.add(justAbove); + } + } + } + + for (const probe of probes) { + if (semver.satisfies(probe, sub) && !semver.satisfies(probe, dom)) { + return false; + } + } + + return true; +} + +/** + * A peer range is a promise to consumers: "install any version in here and I work". It is only + * honest when every version it accepts is also accepted by our own dependencies, otherwise a + * consumer can follow the contract exactly and still end up with a version one of our + * dependencies rejects. + * + * Unlike `missing-peer-forward` this is installer-independent - it is version math, not + * resolution mechanics. + */ +function isRangeCompatible(declaredRange: string, requiredRange: string) { + if (NON_SEMVER_RANGE.test(declaredRange) || NON_SEMVER_RANGE.test(requiredRange)) { + return true; + } + + if (semver.validRange(declaredRange) === null || semver.validRange(requiredRange) === null) { + return true; + } + + return isSubset(declaredRange, requiredRange); +} + +function applyFixes(tree: Tree, options: { packages: Map; violations: Violation[] }) { + const { packages, violations } = options; + const fixed = new Set(); + const fixable = violations.filter(violation => violation.kind === 'missing-peer-forward'); + const byPackage = new Map(); + + for (const violation of fixable) { + byPackage.set(violation.packageName, (byPackage.get(violation.packageName) ?? []).concat(violation)); + } + + for (const [packageName, packageViolations] of byPackage) { + const entry = packages.get(packageName); + + if (!entry) { + continue; + } + + const resolved = new Map(); + + for (const [peer, peerViolations] of groupBy(packageViolations, violation => violation.peer)) { + const range = getNarrowestRange(peerViolations.map(violation => violation.requiredRange!)); + + if (range === null) { + logger.warn( + `[${packageName}] cannot auto-fix '${peer}': dependencies require mutually exclusive ranges ` + + `(${peerViolations.map(violation => violation.requiredRange).join(', ')}). Resolve manually.`, + ); + continue; + } + + resolved.set(peer, range); + peerViolations.forEach(violation => fixed.add(violation)); + } + + if (resolved.size === 0) { + continue; + } + + updateJson(tree, entry.packageJsonPath, json => { + const peerDependencies = { ...(json.peerDependencies ?? {}) }; + + for (const [peer, range] of resolved) { + peerDependencies[peer] = range; + } + + json.peerDependencies = sortKeys(peerDependencies); + + return json; + }); + } + + return fixed; +} + +/** + * Picks the range that every other candidate contains, so the forwarded range never + * promises more than the strictest dependency allows. Returns `null` when no candidate + * dominates - that needs a human. + */ +function getNarrowestRange(ranges: string[]) { + const unique = [...new Set(ranges)]; + + if (unique.length === 1) { + return unique[0]; + } + + return ( + unique.find(candidate => + unique.every(other => + semver.validRange(candidate) && semver.validRange(other) ? isSubset(candidate, other) : candidate === other, + ), + ) ?? null + ); +} + +function groupBy(items: T[], getKey: (item: T) => string) { + const result = new Map(); + + for (const item of items) { + const key = getKey(item); + result.set(key, (result.get(key) ?? []).concat(item)); + } + + return result; +} + +function sortKeys(record: Record) { + return Object.fromEntries(Object.entries(record).sort(([a], [b]) => a.localeCompare(b))); +} + +function reportTrace(trace: Trace, checks: Set) { + const requirementCount = trace.verified.reduce((total, entry) => total + entry.requirements.length, 0); + const skippedByReason = groupBy(trace.skipped, item => item.reason); + + logger.verbose(chalk.bold('\nscope')); + logger.verbose(` checks ${[...checks].join(', ')}`); + logger.verbose( + ` packages ${trace.verified.length} verified, ${trace.skipped.length} skipped` + + (trace.skipped.length + ? chalk.grey(` (${[...skippedByReason].map(([reason, items]) => `${items.length} ${reason}`).join(', ')})`) + : ''), + ); + + for (const entry of trace.verified) { + logger.verbose(''); + logger.verbose(chalk.bold(entry.packageName) + chalk.grey(` ${entry.packageJsonPath}`)); + logger.verbose( + ` declares ${entry.declared.length ? entry.declared.join(', ') : chalk.grey('(no peer dependencies)')}`, + ); + + if (entry.requirements.length === 0) { + logger.verbose(chalk.grey(' no peer requirements from dependencies')); + continue; + } + + for (const requirement of entry.requirements) { + const verdict = requirement.verdict.startsWith('INCOMPATIBLE') + ? chalk.red(requirement.verdict) + : requirement.verdict === 'not declared' + ? chalk.yellow(requirement.verdict) + : chalk.green(requirement.verdict); + + logger.verbose( + ` ${requirement.peer} ${chalk.grey( + `'${requirement.requiredRange}' required by ${requirement.requiredBy}`, + )} -> ${verdict}`, + ); + } + } + + if (trace.unresolved.size > 0) { + logger.verbose(chalk.bold('\nunresolved dependencies') + chalk.grey(' (not installed, peers unknown - skipped)')); + + for (const [dependencyName, dependents] of [...trace.unresolved].sort()) { + logger.verbose(chalk.grey(` ${dependencyName} (required by ${dependents.size} package(s))`)); + } + } + + const { optional, filtered, ownDependency } = trace.skippedRequirements; + + logger.verbose(chalk.bold('\ntotals')); + logger.verbose(` ${requirementCount} peer requirement(s) checked across ${trace.verified.length} package(s)`); + logger.verbose( + chalk.grey( + ` skipped: ${optional} optional, ${ownDependency} provided as own dependency, ${filtered} outside --peers`, + ), + ); +} + +const VIOLATION_DESCRIPTIONS: Record = { + 'missing-peer-forward': + 'under Yarn PnP strict a package must re-declare every non-optional peer its dependencies require', + 'incompatible-peer-range': 'the range we advertise to consumers accepts versions one of our own dependencies rejects', + 'invalid-peer-range': 'peer dependency range is not a valid semver range', + 'orphaned-peer-meta': 'peerDependenciesMeta entry has no matching peerDependencies entry', + 'unverified-peer-range': + 'the range was only checked against the installed copy; the declared dependency range permits older versions that were not inspected', +}; + +function report(violations: Violation[], options: { fixedCount: number; throwOnViolations: boolean }) { + if (options.fixedCount > 0) { + logger.info(chalk.green(`✔ fixed ${options.fixedCount} missing peer dependency forward(s)`)); + } + + if (violations.length === 0) { + logger.info(chalk.green('✔ no peer dependency violations found')); + return; + } + + for (const [kind, kindViolations] of groupBy(violations, violation => violation.kind)) { + logger.log(''); + logger.log(chalk.red.bold(`${kind} (${kindViolations.length})`)); + logger.log(chalk.grey(` ${VIOLATION_DESCRIPTIONS[kind as ViolationKind]}`)); + + for (const violation of [...kindViolations].sort((a, b) => a.packageName.localeCompare(b.packageName))) { + logger.log(chalk.red(` ✘ ${violation.packageName}`) + chalk.grey(` (${violation.packageJsonPath})`)); + + switch (violation.kind) { + case 'missing-peer-forward': + logger.log( + ` must declare peerDependencies['${violation.peer}'] ` + + chalk.grey(`- required by ${violation.requiredBy} as '${violation.requiredRange}'`), + ); + break; + case 'incompatible-peer-range': + logger.log( + ` declares '${violation.peer}': '${violation.declaredRange}' ` + + chalk.grey( + `but ${violation.requiredBy}@${violation.inspectedVersion ?? 'workspace'} requires '${ + violation.requiredRange + }'`, + ), + ); + break; + case 'invalid-peer-range': + logger.log(` '${violation.peer}': '${violation.declaredRange}' is not a valid semver range`); + break; + case 'unverified-peer-range': + logger.log( + ` '${violation.peer}': '${violation.declaredRange}' checked against ${violation.requiredBy}@${violation.inspectedVersion} ` + + chalk.grey( + `but the declared range also permits ${violation.requiredBy}@${violation.lowestPermittedVersion}`, + ), + ); + break; + case 'orphaned-peer-meta': + logger.log(` peerDependenciesMeta['${violation.peer}'] has no peerDependencies['${violation.peer}']`); + break; + } + } + } + + logger.log(''); + + // Only missing-peer-forward is auto-fixable; promising `--fix` for anything else sends people + // to a command that cannot help them. + if (violations.some(violation => FIXABLE_CHECKS.includes(violation.kind))) { + logger.info(`🛠️ FIX: run 'nx g @fluentui/workspace-plugin:verify-peer-dependencies --fix'`); + } else { + logger.info(`🛠️ These violations need a manual decision - '--fix' cannot resolve them.`); + } + + // Throwing from a generator makes nx discard the whole tree, so in --fix mode the applied + // fixes must be allowed to flush. Re-run in verify mode to get a failing exit code. + if (!options.throwOnViolations) { + logger.warn( + chalk.yellow(`${violations.length} violation(s) could not be fixed automatically and need manual attention`), + ); + + return; + } + + throw new Error(`peer dependency violations found (${violations.length})`); +} diff --git a/tools/workspace-plugin/src/generators/verify-peer-dependencies/schema.json b/tools/workspace-plugin/src/generators/verify-peer-dependencies/schema.json new file mode 100644 index 00000000000000..8df4e96cfc2e67 --- /dev/null +++ b/tools/workspace-plugin/src/generators/verify-peer-dependencies/schema.json @@ -0,0 +1,34 @@ +{ + "$schema": "http://json-schema.org/schema", + "cli": "nx", + "id": "verify-peer-dependencies", + "type": "object", + "properties": { + "project": { + "type": "string", + "description": "Comma separated list of projects to verify. Defaults to every publishable project.", + "x-dropdown": "projects", + "$default": { + "$source": "argv", + "index": 0 + } + }, + "tag": { + "type": "string", + "description": "Comma separated list of nx project tags to verify, e.g. `vNext`. Defaults to every tag." + }, + "checks": { + "type": "string", + "description": "Comma separated list of checks to run. Defaults to every check except `missing-peer-forward`, which only matters under Yarn PnP strict resolution." + }, + "fix": { + "type": "boolean", + "description": "Automatically add every missing forwarded peer dependency to the offending package.json" + }, + "peers": { + "type": "string", + "description": "Comma separated list of peer dependency names to check. Defaults to all." + } + }, + "required": [] +} diff --git a/tools/workspace-plugin/src/generators/verify-peer-dependencies/schema.ts b/tools/workspace-plugin/src/generators/verify-peer-dependencies/schema.ts new file mode 100644 index 00000000000000..932e27adb1891d --- /dev/null +++ b/tools/workspace-plugin/src/generators/verify-peer-dependencies/schema.ts @@ -0,0 +1,31 @@ +export type PeerDependencyCheck = + | 'missing-peer-forward' + | 'incompatible-peer-range' + | 'invalid-peer-range' + | 'orphaned-peer-meta' + | 'unverified-peer-range'; + +export interface VerifyPeerDependenciesGeneratorSchema { + /** + * Comma separated list of projects to verify. Defaults to every publishable project. + */ + project?: string; + /** + * Comma separated list of nx project tags to verify, e.g. `vNext`. Defaults to every tag. + */ + tag?: string; + /** + * Comma separated list of checks to run. Defaults to every check except `missing-peer-forward`, + * which only matters under Yarn PnP strict resolution. + */ + checks?: string; + /** + * Automatically add every missing forwarded peer dependency to the offending package.json. + * Without this flag the generator only reports violations and fails. + */ + fix?: boolean; + /** + * Comma separated list of peer dependency names to check. Defaults to all. + */ + peers?: string; +} diff --git a/tools/workspace-plugin/src/types.ts b/tools/workspace-plugin/src/types.ts index f0a334a5cbaf9e..c796c181dbd63a 100644 --- a/tools/workspace-plugin/src/types.ts +++ b/tools/workspace-plugin/src/types.ts @@ -52,6 +52,7 @@ export interface PackageJson { dependencies?: Record; devDependencies?: Record; peerDependencies?: Record; + peerDependenciesMeta?: Record; exports?: Record< string, | string diff --git a/yarn.lock b/yarn.lock index af34215affd35d..bc2a2274150b38 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2675,9 +2675,7 @@ __metadata: "@swc/helpers": "npm:^0.5.1" peerDependencies: "@types/react": ">=16.14.0 <20.0.0" - "@types/react-dom": ">=16.9.0 <20.0.0" react: ">=16.14.0 <20.0.0" - react-dom: ">=16.14.0 <20.0.0" languageName: unknown linkType: soft @@ -2723,8 +2721,8 @@ __metadata: "@typescript-eslint/utils": "npm:^8.46.2" eslint-plugin-eslint-plugin: "npm:6.4.0" peerDependencies: - eslint: ">= 8.0.0" - typescript: ">= 5.0.0" + eslint: ^8.57.0 || ^9.0.0 + typescript: ">=5.0.0 <6.0.0" typescript-eslint: ">= 8.46.2" languageName: unknown linkType: soft @@ -3130,9 +3128,10 @@ __metadata: "@swc/helpers": "npm:^0.5.1" peerDependencies: "@types/react": ">=16.14.0 <20.0.0" - "@types/react-dom": ">=16.9.0 <20.0.0" react: ">=16.14.0 <20.0.0" - react-dom: ">=16.14.0 <20.0.0" + peerDependenciesMeta: + "@types/react": + optional: true languageName: unknown linkType: soft @@ -3353,9 +3352,10 @@ __metadata: "@swc/helpers": "npm:^0.5.1" peerDependencies: "@types/react": ">=16.14.0 <20.0.0" - "@types/react-dom": ">=16.9.0 <20.0.0" react: ">=16.14.0 <20.0.0" - react-dom: ">=16.14.0 <20.0.0" + peerDependenciesMeta: + "@types/react": + optional: true languageName: unknown linkType: soft @@ -3374,9 +3374,10 @@ __metadata: "@swc/helpers": "npm:^0.5.1" peerDependencies: "@types/react": ">=16.14.0 <20.0.0" - "@types/react-dom": ">=16.9.0 <20.0.0" react: ">=16.14.0 <20.0.0" - react-dom: ">=16.14.0 <20.0.0" + peerDependenciesMeta: + "@types/react": + optional: true languageName: unknown linkType: soft @@ -3398,9 +3399,10 @@ __metadata: "@swc/helpers": "npm:^0.5.1" peerDependencies: "@types/react": ">=16.14.0 <20.0.0" - "@types/react-dom": ">=16.9.0 <20.0.0" react: ">=16.14.0 <20.0.0" - react-dom: ">=16.14.0 <20.0.0" + peerDependenciesMeta: + "@types/react": + optional: true languageName: unknown linkType: soft @@ -3429,9 +3431,10 @@ __metadata: es6-weak-map: "npm:^2.0.2" peerDependencies: "@types/react": ">=16.14.0 <20.0.0" - "@types/react-dom": ">=16.9.0 <20.0.0" react: ">=16.14.0 <20.0.0" - react-dom: ">=16.14.0 <20.0.0" + peerDependenciesMeta: + "@types/react": + optional: true languageName: unknown linkType: soft @@ -3454,9 +3457,10 @@ __metadata: "@swc/helpers": "npm:^0.5.1" peerDependencies: "@types/react": ">=16.14.0 <20.0.0" - "@types/react-dom": ">=16.9.0 <20.0.0" react: ">=16.14.0 <20.0.0" - react-dom: ">=16.14.0 <20.0.0" + peerDependenciesMeta: + "@types/react": + optional: true languageName: unknown linkType: soft @@ -3508,9 +3512,10 @@ __metadata: "@swc/helpers": "npm:^0.5.1" peerDependencies: "@types/react": ">=16.14.0 <20.0.0" - "@types/react-dom": ">=16.9.0 <20.0.0" react: ">=16.14.0 <20.0.0" - react-dom: ">=16.14.0 <20.0.0" + peerDependenciesMeta: + "@types/react": + optional: true languageName: unknown linkType: soft @@ -3536,9 +3541,10 @@ __metadata: "@swc/helpers": "npm:^0.5.1" peerDependencies: "@types/react": ">=16.14.0 <20.0.0" - "@types/react-dom": ">=16.9.0 <20.0.0" react: ">=16.14.0 <20.0.0" - react-dom: ">=16.14.0 <20.0.0" + peerDependenciesMeta: + "@types/react": + optional: true languageName: unknown linkType: soft @@ -3565,9 +3571,10 @@ __metadata: "@swc/helpers": "npm:^0.5.1" peerDependencies: "@types/react": ">=16.14.0 <20.0.0" - "@types/react-dom": ">=16.9.0 <20.0.0" react: ">=16.14.0 <20.0.0" - react-dom: ">=16.14.0 <20.0.0" + peerDependenciesMeta: + "@types/react": + optional: true languageName: unknown linkType: soft @@ -3592,9 +3599,10 @@ __metadata: "@swc/helpers": "npm:^0.5.1" peerDependencies: "@types/react": ">=16.14.0 <20.0.0" - "@types/react-dom": ">=16.9.0 <20.0.0" react: ">=16.14.0 <20.0.0" - react-dom: ">=16.14.0 <20.0.0" + peerDependenciesMeta: + "@types/react": + optional: true languageName: unknown linkType: soft @@ -3642,9 +3650,10 @@ __metadata: embla-carousel-fade: "npm:^8.5.1" peerDependencies: "@types/react": ">=16.14.0 <20.0.0" - "@types/react-dom": ">=16.9.0 <20.0.0" react: ">=16.14.0 <20.0.0" - react-dom: ">=16.14.0 <20.0.0" + peerDependenciesMeta: + "@types/react": + optional: true languageName: unknown linkType: soft @@ -3767,9 +3776,10 @@ __metadata: "@swc/helpers": "npm:^0.5.1" peerDependencies: "@types/react": ">=16.14.0 <20.0.0" - "@types/react-dom": ">=16.9.0 <20.0.0" react: ">=16.14.0 <20.0.0" - react-dom: ">=16.14.0 <20.0.0" + peerDependenciesMeta: + "@types/react": + optional: true languageName: unknown linkType: soft @@ -3793,9 +3803,10 @@ __metadata: "@swc/helpers": "npm:^0.5.1" peerDependencies: "@types/react": ">=16.14.0 <20.0.0" - "@types/react-dom": ">=16.9.0 <20.0.0" react: ">=16.14.0 <20.0.0" - react-dom: ">=16.14.0 <20.0.0" + peerDependenciesMeta: + "@types/react": + optional: true languageName: unknown linkType: soft @@ -3810,9 +3821,7 @@ __metadata: "@swc/helpers": "npm:^0.5.1" peerDependencies: "@types/react": ">=16.14.0 <20.0.0" - "@types/react-dom": ">=16.9.0 <20.0.0" react: ">=16.14.0 <20.0.0" - react-dom: ">=16.14.0 <20.0.0" languageName: unknown linkType: soft @@ -3842,9 +3851,11 @@ __metadata: "@swc/helpers": "npm:^0.5.1" peerDependencies: "@types/react": ">=16.14.0 <20.0.0" - "@types/react-dom": ">=16.9.0 <20.0.0" react: ">=16.14.0 <20.0.0" react-dom: ">=16.14.0 <20.0.0" + peerDependenciesMeta: + "@types/react": + optional: true languageName: unknown linkType: soft @@ -3969,9 +3980,10 @@ __metadata: "@swc/helpers": "npm:^0.5.1" peerDependencies: "@types/react": ">=16.14.0 <20.0.0" - "@types/react-dom": ">=16.9.0 <20.0.0" react: ">=16.14.0 <20.0.0" - react-dom: ">=16.14.0 <20.0.0" + peerDependenciesMeta: + "@types/react": + optional: true languageName: unknown linkType: soft @@ -3984,8 +3996,11 @@ __metadata: peerDependencies: "@fluentui/react-conformance": ^0.20.1 "@types/react": ">=16.14.0 <20.0.0" - "@types/react-dom": ">=16.9.0 <20.0.0" + react-dom: ">=16.14.0 <20.0.0" typescript: ^4.3.0 + peerDependenciesMeta: + "@types/react": + optional: true languageName: unknown linkType: soft @@ -4018,10 +4033,11 @@ __metadata: "@swc/helpers": "npm:^0.5.1" peerDependencies: "@types/react": ">=16.14.0 <20.0.0" - "@types/react-dom": ">=16.9.0 <20.0.0" react: ">=16.14.0 <20.0.0" - react-dom: ">=16.14.0 <20.0.0" scheduler: ">=0.19.0" + peerDependenciesMeta: + "@types/react": + optional: true languageName: unknown linkType: soft @@ -4067,9 +4083,10 @@ __metadata: "@swc/helpers": "npm:^0.5.1" peerDependencies: "@types/react": ">=16.14.0 <20.0.0" - "@types/react-dom": ">=16.9.0 <20.0.0" react: ">=16.14.0 <20.0.0" - react-dom: ">=16.14.0 <20.0.0" + peerDependenciesMeta: + "@types/react": + optional: true languageName: unknown linkType: soft @@ -4099,9 +4116,10 @@ __metadata: "@swc/helpers": "npm:^0.5.1" peerDependencies: "@types/react": ">=16.14.0 <20.0.0" - "@types/react-dom": ">=16.9.0 <20.0.0" react: ">=16.14.0 <20.0.0" - react-dom: ">=16.14.0 <20.0.0" + peerDependenciesMeta: + "@types/react": + optional: true languageName: unknown linkType: soft @@ -4123,9 +4141,10 @@ __metadata: "@swc/helpers": "npm:^0.5.1" peerDependencies: "@types/react": ">=16.14.0 <20.0.0" - "@types/react-dom": ">=16.9.0 <20.0.0" react: ">=16.14.0 <20.0.0" - react-dom: ">=16.14.0 <20.0.0" + peerDependenciesMeta: + "@types/react": + optional: true languageName: unknown linkType: soft @@ -4180,9 +4199,10 @@ __metadata: "@swc/helpers": "npm:^0.5.1" peerDependencies: "@types/react": ">=16.14.0 <20.0.0" - "@types/react-dom": ">=16.9.0 <20.0.0" react: ">=16.14.0 <20.0.0" - react-dom: ">=16.14.0 <20.0.0" + peerDependenciesMeta: + "@types/react": + optional: true languageName: unknown linkType: soft @@ -4275,9 +4295,10 @@ __metadata: "@swc/helpers": "npm:^0.5.1" peerDependencies: "@types/react": ">=16.14.0 <20.0.0" - "@types/react-dom": ">=16.9.0 <20.0.0" react: ">=16.14.0 <20.0.0" - react-dom: ">=16.14.0 <20.0.0" + peerDependenciesMeta: + "@types/react": + optional: true languageName: unknown linkType: soft @@ -4376,9 +4397,10 @@ __metadata: "@swc/helpers": "npm:^0.5.1" peerDependencies: "@types/react": ">=16.14.0 <20.0.0" - "@types/react-dom": ">=16.9.0 <20.0.0" react: ">=16.14.0 <20.0.0" - react-dom: ">=16.14.0 <20.0.0" + peerDependenciesMeta: + "@types/react": + optional: true languageName: unknown linkType: soft @@ -4429,9 +4451,10 @@ __metadata: "@swc/helpers": "npm:^0.5.1" peerDependencies: "@types/react": ">=16.14.0 <20.0.0" - "@types/react-dom": ">=16.9.0 <20.0.0" react: ">=16.14.0 <20.0.0" - react-dom: ">=16.14.0 <20.0.0" + peerDependenciesMeta: + "@types/react": + optional: true languageName: unknown linkType: soft @@ -4510,9 +4533,10 @@ __metadata: "@swc/helpers": "npm:^0.5.1" peerDependencies: "@types/react": ">=16.14.0 <20.0.0" - "@types/react-dom": ">=16.9.0 <20.0.0" react: ">=16.14.0 <20.0.0" - react-dom: ">=16.14.0 <20.0.0" + peerDependenciesMeta: + "@types/react": + optional: true languageName: unknown linkType: soft @@ -4531,9 +4555,10 @@ __metadata: "@swc/helpers": "npm:^0.5.1" peerDependencies: "@types/react": ">=16.14.0 <20.0.0" - "@types/react-dom": ">=16.9.0 <20.0.0" react: ">=16.14.0 <20.0.0" - react-dom: ">=16.14.0 <20.0.0" + peerDependenciesMeta: + "@types/react": + optional: true languageName: unknown linkType: soft @@ -4559,9 +4584,10 @@ __metadata: "@swc/helpers": "npm:^0.5.1" peerDependencies: "@types/react": ">=16.14.0 <20.0.0" - "@types/react-dom": ">=16.9.0 <20.0.0" react: ">=16.14.0 <20.0.0" - react-dom: ">=16.14.0 <20.0.0" + peerDependenciesMeta: + "@types/react": + optional: true languageName: unknown linkType: soft @@ -4584,9 +4610,10 @@ __metadata: "@swc/helpers": "npm:^0.5.1" peerDependencies: "@types/react": ">=16.14.0 <20.0.0" - "@types/react-dom": ">=16.9.0 <20.0.0" react: ">=16.14.0 <20.0.0" - react-dom: ">=16.14.0 <20.0.0" + peerDependenciesMeta: + "@types/react": + optional: true languageName: unknown linkType: soft @@ -4611,6 +4638,9 @@ __metadata: peerDependencies: "@types/react": ">=16.14.0 <20.0.0" react: ">=16.14.0 <20.0.0" + peerDependenciesMeta: + "@types/react": + optional: true languageName: unknown linkType: soft @@ -4632,9 +4662,10 @@ __metadata: "@swc/helpers": "npm:^0.5.1" peerDependencies: "@types/react": ">=16.14.0 <20.0.0" - "@types/react-dom": ">=16.9.0 <20.0.0" react: ">=16.14.0 <20.0.0" - react-dom: ">=16.14.0 <20.0.0" + peerDependenciesMeta: + "@types/react": + optional: true languageName: unknown linkType: soft @@ -4658,9 +4689,10 @@ __metadata: "@swc/helpers": "npm:^0.5.1" peerDependencies: "@types/react": ">=16.14.0 <20.0.0" - "@types/react-dom": ">=16.9.0 <20.0.0" react: ">=16.14.0 <20.0.0" - react-dom: ">=16.14.0 <20.0.0" + peerDependenciesMeta: + "@types/react": + optional: true languageName: unknown linkType: soft @@ -4686,9 +4718,10 @@ __metadata: "@swc/helpers": "npm:^0.5.1" peerDependencies: "@types/react": ">=16.14.0 <20.0.0" - "@types/react-dom": ">=16.9.0 <20.0.0" react: ">=16.14.0 <20.0.0" - react-dom: ">=16.14.0 <20.0.0" + peerDependenciesMeta: + "@types/react": + optional: true languageName: unknown linkType: soft @@ -4715,9 +4748,10 @@ __metadata: "@swc/helpers": "npm:^0.5.1" peerDependencies: "@types/react": ">=16.14.0 <20.0.0" - "@types/react-dom": ">=16.9.0 <20.0.0" react: ">=16.14.0 <20.0.0" - react-dom: ">=16.14.0 <20.0.0" + peerDependenciesMeta: + "@types/react": + optional: true languageName: unknown linkType: soft @@ -4748,9 +4782,10 @@ __metadata: "@swc/helpers": "npm:^0.5.1" peerDependencies: "@types/react": ">=16.14.0 <20.0.0" - "@types/react-dom": ">=16.9.0 <20.0.0" react: ">=16.14.0 <20.0.0" - react-dom: ">=16.14.0 <20.0.0" + peerDependenciesMeta: + "@types/react": + optional: true languageName: unknown linkType: soft @@ -4777,9 +4812,10 @@ __metadata: "@swc/helpers": "npm:^0.5.1" peerDependencies: "@types/react": ">=16.14.0 <20.0.0" - "@types/react-dom": ">=16.9.0 <20.0.0" react: ">=16.14.0 <20.0.0" - react-dom: ">=16.14.0 <20.0.0" + peerDependenciesMeta: + "@types/react": + optional: true languageName: unknown linkType: soft @@ -4807,9 +4843,10 @@ __metadata: peerDependencies: "@fluentui/react-northstar": ^0.66.5 "@types/react": ">=16.14.0 <20.0.0" - "@types/react-dom": ">=16.9.0 <20.0.0" react: ">=16.14.0 <20.0.0" - react-dom: ">=16.14.0 <20.0.0" + peerDependenciesMeta: + "@types/react": + optional: true languageName: unknown linkType: soft @@ -4833,9 +4870,10 @@ __metadata: "@swc/helpers": "npm:^0.5.1" peerDependencies: "@types/react": ">=16.14.0 <20.0.0" - "@types/react-dom": ">=16.9.0 <20.0.0" react: ">=16.14.0 <20.0.0" - react-dom: ">=16.14.0 <20.0.0" + peerDependenciesMeta: + "@types/react": + optional: true languageName: unknown linkType: soft @@ -4883,9 +4921,10 @@ __metadata: "@swc/helpers": "npm:^0.5.1" peerDependencies: "@types/react": ">=16.14.0 <20.0.0" - "@types/react-dom": ">=16.9.0 <20.0.0" react: ">=16.14.0 <20.0.0" - react-dom: ">=16.14.0 <20.0.0" + peerDependenciesMeta: + "@types/react": + optional: true languageName: unknown linkType: soft @@ -4904,9 +4943,10 @@ __metadata: "@swc/helpers": "npm:^0.5.1" peerDependencies: "@types/react": ">=16.14.0 <20.0.0" - "@types/react-dom": ">=16.9.0 <20.0.0" react: ">=16.14.0 <20.0.0" - react-dom: ">=16.14.0 <20.0.0" + peerDependenciesMeta: + "@types/react": + optional: true languageName: unknown linkType: soft @@ -4938,9 +4978,10 @@ __metadata: "@swc/helpers": "npm:^0.5.1" peerDependencies: "@types/react": ">=16.14.0 <20.0.0" - "@types/react-dom": ">=16.9.0 <20.0.0" react: ">=16.14.0 <20.0.0" - react-dom: ">=16.14.0 <20.0.0" + peerDependenciesMeta: + "@types/react": + optional: true languageName: unknown linkType: soft @@ -5033,9 +5074,10 @@ __metadata: "@swc/helpers": "npm:^0.5.1" peerDependencies: "@types/react": ">=16.14.0 <20.0.0" - "@types/react-dom": ">=16.9.0 <20.0.0" react: ">=16.14.0 <20.0.0" - react-dom: ">=16.14.0 <20.0.0" + peerDependenciesMeta: + "@types/react": + optional: true languageName: unknown linkType: soft @@ -5059,9 +5101,10 @@ __metadata: "@swc/helpers": "npm:^0.5.1" peerDependencies: "@types/react": ">=16.14.0 <20.0.0" - "@types/react-dom": ">=16.9.0 <20.0.0" react: ">=16.14.0 <20.0.0" - react-dom: ">=16.14.0 <20.0.0" + peerDependenciesMeta: + "@types/react": + optional: true languageName: unknown linkType: soft @@ -5091,9 +5134,10 @@ __metadata: "@swc/helpers": "npm:^0.5.1" peerDependencies: "@types/react": ">=16.14.0 <20.0.0" - "@types/react-dom": ">=16.9.0 <20.0.0" react: ">=16.14.0 <20.0.0" - react-dom: ">=16.14.0 <20.0.0" + peerDependenciesMeta: + "@types/react": + optional: true languageName: unknown linkType: soft @@ -5105,6 +5149,9 @@ __metadata: peerDependencies: "@types/react": ">=16.14.0 <20.0.0" react: ">=16.14.0 <20.0.0" + peerDependenciesMeta: + "@types/react": + optional: true languageName: unknown linkType: soft @@ -5119,6 +5166,9 @@ __metadata: "@fluentui/react-components": ^9.74.7 "@types/react": ">=16.14.0 <20.0.0" react: ">=16.14.0 <20.0.0" + peerDependenciesMeta: + "@types/react": + optional: true languageName: unknown linkType: soft @@ -5139,9 +5189,11 @@ __metadata: "@swc/helpers": "npm:^0.5.1" peerDependencies: "@types/react": ">=16.14.0 <20.0.0" - "@types/react-dom": ">=16.9.0 <20.0.0" react: ">=16.14.0 <20.0.0" react-dom: ">=16.14.0 <20.0.0" + peerDependenciesMeta: + "@types/react": + optional: true languageName: unknown linkType: soft @@ -5162,12 +5214,13 @@ __metadata: "@fluentui/react-utilities": "npm:^9.26.6" "@griffel/react": "npm:^1.5.32" "@swc/helpers": "npm:^0.5.1" - use-sync-external-store: "npm:^1.2.0" + use-sync-external-store: "npm:^1.4.0" peerDependencies: "@types/react": ">=16.14.0 <20.0.0" - "@types/react-dom": ">=16.9.0 <20.0.0" react: ">=16.14.0 <20.0.0" - react-dom: ">=16.14.0 <20.0.0" + peerDependenciesMeta: + "@types/react": + optional: true languageName: unknown linkType: soft @@ -5191,9 +5244,10 @@ __metadata: "@swc/helpers": "npm:^0.5.1" peerDependencies: "@types/react": ">=16.14.0 <20.0.0" - "@types/react-dom": ">=16.9.0 <20.0.0" react: ">=16.14.0 <20.0.0" - react-dom: ">=16.14.0 <20.0.0" + peerDependenciesMeta: + "@types/react": + optional: true languageName: unknown linkType: soft @@ -5229,9 +5283,10 @@ __metadata: "@swc/helpers": "npm:^0.5.1" peerDependencies: "@types/react": ">=16.14.0 <20.0.0" - "@types/react-dom": ">=16.9.0 <20.0.0" react: ">=16.14.0 <20.0.0" - react-dom: ">=16.14.0 <20.0.0" + peerDependenciesMeta: + "@types/react": + optional: true languageName: unknown linkType: soft @@ -5256,9 +5311,10 @@ __metadata: "@swc/helpers": "npm:^0.5.1" peerDependencies: "@types/react": ">=16.14.0 <20.0.0" - "@types/react-dom": ">=16.9.0 <20.0.0" react: ">=16.14.0 <20.0.0" - react-dom: ">=16.14.0 <20.0.0" + peerDependenciesMeta: + "@types/react": + optional: true languageName: unknown linkType: soft @@ -5282,9 +5338,10 @@ __metadata: "@swc/helpers": "npm:^0.5.1" peerDependencies: "@types/react": ">=16.14.0 <20.0.0" - "@types/react-dom": ">=16.9.0 <20.0.0" react: ">=16.14.0 <20.0.0" - react-dom: ">=16.14.0 <20.0.0" + peerDependenciesMeta: + "@types/react": + optional: true languageName: unknown linkType: soft @@ -5308,9 +5365,10 @@ __metadata: "@swc/helpers": "npm:^0.5.1" peerDependencies: "@types/react": ">=16.14.0 <20.0.0" - "@types/react-dom": ">=16.9.0 <20.0.0" react: ">=16.14.0 <20.0.0" - react-dom: ">=16.14.0 <20.0.0" + peerDependenciesMeta: + "@types/react": + optional: true languageName: unknown linkType: soft @@ -5334,9 +5392,10 @@ __metadata: "@swc/helpers": "npm:^0.5.1" peerDependencies: "@types/react": ">=16.14.0 <20.0.0" - "@types/react-dom": ">=16.9.0 <20.0.0" react: ">=16.14.0 <20.0.0" - react-dom: ">=16.14.0 <20.0.0" + peerDependenciesMeta: + "@types/react": + optional: true languageName: unknown linkType: soft @@ -5355,6 +5414,9 @@ __metadata: peerDependencies: "@types/react": ">=16.14.0 <20.0.0" react: ">=16.14.0 <20.0.0" + peerDependenciesMeta: + "@types/react": + optional: true languageName: unknown linkType: soft @@ -5377,9 +5439,10 @@ __metadata: "@swc/helpers": "npm:^0.5.1" peerDependencies: "@types/react": ">=16.14.0 <20.0.0" - "@types/react-dom": ">=16.9.0 <20.0.0" react: ">=16.14.0 <20.0.0" - react-dom: ">=16.14.0 <20.0.0" + peerDependenciesMeta: + "@types/react": + optional: true languageName: unknown linkType: soft @@ -5403,9 +5466,10 @@ __metadata: "@swc/helpers": "npm:^0.5.1" peerDependencies: "@types/react": ">=16.14.0 <20.0.0" - "@types/react-dom": ">=16.9.0 <20.0.0" react: ">=16.14.0 <20.0.0" - react-dom: ">=16.14.0 <20.0.0" + peerDependenciesMeta: + "@types/react": + optional: true languageName: unknown linkType: soft @@ -5430,9 +5494,10 @@ __metadata: "@swc/helpers": "npm:^0.5.1" peerDependencies: "@types/react": ">=16.14.0 <20.0.0" - "@types/react-dom": ">=16.9.0 <20.0.0" react: ">=16.14.0 <20.0.0" - react-dom: ">=16.14.0 <20.0.0" + peerDependenciesMeta: + "@types/react": + optional: true languageName: unknown linkType: soft @@ -5455,9 +5520,10 @@ __metadata: "@swc/helpers": "npm:^0.5.1" peerDependencies: "@types/react": ">=16.14.0 <20.0.0" - "@types/react-dom": ">=16.9.0 <20.0.0" react: ">=16.14.0 <20.0.0" - react-dom: ">=16.14.0 <20.0.0" + peerDependenciesMeta: + "@types/react": + optional: true languageName: unknown linkType: soft @@ -5500,10 +5566,11 @@ __metadata: "@storybook/icons": ^1.3.2 "@storybook/react-webpack5": ^9.1.17 "@types/react": ">=16.14.0 <20.0.0" - "@types/react-dom": ">=16.9.0 <20.0.0" react: ">=16.14.0 <20.0.0" - react-dom: ">=16.14.0 <20.0.0" storybook: ^9.1.17 + peerDependenciesMeta: + "@types/react": + optional: true languageName: unknown linkType: soft @@ -5529,9 +5596,10 @@ __metadata: "@swc/helpers": "npm:^0.5.1" peerDependencies: "@types/react": ">=16.14.0 <20.0.0" - "@types/react-dom": ">=16.9.0 <20.0.0" react: ">=16.14.0 <20.0.0" - react-dom: ">=16.14.0 <20.0.0" + peerDependenciesMeta: + "@types/react": + optional: true languageName: unknown linkType: soft @@ -5557,9 +5625,10 @@ __metadata: "@swc/helpers": "npm:^0.5.1" peerDependencies: "@types/react": ">=16.14.0 <20.0.0" - "@types/react-dom": ">=16.9.0 <20.0.0" react: ">=16.14.0 <20.0.0" - react-dom: ">=16.14.0 <20.0.0" + peerDependenciesMeta: + "@types/react": + optional: true languageName: unknown linkType: soft @@ -5589,9 +5658,10 @@ __metadata: "@swc/helpers": "npm:^0.5.1" peerDependencies: "@types/react": ">=16.14.0 <20.0.0" - "@types/react-dom": ">=16.9.0 <20.0.0" react: ">=16.14.0 <20.0.0" - react-dom: ">=16.14.0 <20.0.0" + peerDependenciesMeta: + "@types/react": + optional: true languageName: unknown linkType: soft @@ -5615,9 +5685,10 @@ __metadata: "@swc/helpers": "npm:^0.5.1" peerDependencies: "@types/react": ">=16.14.0 <20.0.0" - "@types/react-dom": ">=16.9.0 <20.0.0" react: ">=16.14.0 <20.0.0" - react-dom: ">=16.14.0 <20.0.0" + peerDependenciesMeta: + "@types/react": + optional: true languageName: unknown linkType: soft @@ -5634,9 +5705,10 @@ __metadata: tabster: "npm:^8.8.0" peerDependencies: "@types/react": ">=16.14.0 <20.0.0" - "@types/react-dom": ">=16.9.0 <20.0.0" react: ">=16.14.0 <20.0.0" - react-dom: ">=16.14.0 <20.0.0" + peerDependenciesMeta: + "@types/react": + optional: true languageName: unknown linkType: soft @@ -5668,9 +5740,11 @@ __metadata: "@swc/helpers": "npm:^0.5.1" peerDependencies: "@types/react": ">=16.14.0 <20.0.0" - "@types/react-dom": ">=16.9.0 <20.0.0" react: ">=16.14.0 <20.0.0" react-dom: ">=16.14.0 <20.0.0" + peerDependenciesMeta: + "@types/react": + optional: true languageName: unknown linkType: soft @@ -5697,9 +5771,10 @@ __metadata: "@swc/helpers": "npm:^0.5.1" peerDependencies: "@types/react": ">=16.14.0 <20.0.0" - "@types/react-dom": ">=16.9.0 <20.0.0" react: ">=16.14.0 <20.0.0" - react-dom: ">=16.14.0 <20.0.0" + peerDependenciesMeta: + "@types/react": + optional: true languageName: unknown linkType: soft @@ -5726,12 +5801,13 @@ __metadata: "@fluentui/scripts-cypress": "npm:*" "@griffel/react": "npm:^1.5.32" "@swc/helpers": "npm:^0.5.1" - use-sync-external-store: "npm:^1.2.0" + use-sync-external-store: "npm:^1.4.0" peerDependencies: "@types/react": ">=16.14.0 <20.0.0" - "@types/react-dom": ">=16.9.0 <20.0.0" react: ">=16.14.0 <20.0.0" - react-dom: ">=16.14.0 <20.0.0" + peerDependenciesMeta: + "@types/react": + optional: true languageName: unknown linkType: soft @@ -5753,9 +5829,10 @@ __metadata: "@swc/helpers": "npm:^0.5.1" peerDependencies: "@types/react": ">=16.14.0 <20.0.0" - "@types/react-dom": ">=16.9.0 <20.0.0" react: ">=16.14.0 <20.0.0" - react-dom: ">=16.14.0 <20.0.0" + peerDependenciesMeta: + "@types/react": + optional: true languageName: unknown linkType: soft @@ -5778,9 +5855,10 @@ __metadata: "@swc/helpers": "npm:^0.5.1" peerDependencies: "@types/react": ">=16.14.0 <20.0.0" - "@types/react-dom": ">=16.9.0 <20.0.0" react: ">=16.14.0 <20.0.0" - react-dom: ">=16.14.0 <20.0.0" + peerDependenciesMeta: + "@types/react": + optional: true languageName: unknown linkType: soft @@ -5828,9 +5906,10 @@ __metadata: "@swc/helpers": "npm:^0.5.1" peerDependencies: "@types/react": ">=16.14.0 <20.0.0" - "@types/react-dom": ">=16.9.0 <20.0.0" react: ">=16.14.0 <20.0.0" - react-dom: ">=16.14.0 <20.0.0" + peerDependenciesMeta: + "@types/react": + optional: true languageName: unknown linkType: soft @@ -5859,9 +5938,10 @@ __metadata: "@swc/helpers": "npm:^0.5.1" peerDependencies: "@types/react": ">=16.14.0 <20.0.0" - "@types/react-dom": ">=16.9.0 <20.0.0" react: ">=16.14.0 <20.0.0" - react-dom: ">=16.14.0 <20.0.0" + peerDependenciesMeta: + "@types/react": + optional: true languageName: unknown linkType: soft @@ -5888,9 +5968,10 @@ __metadata: "@swc/helpers": "npm:^0.5.1" peerDependencies: "@types/react": ">=16.14.0 <20.0.0" - "@types/react-dom": ">=16.9.0 <20.0.0" react: ">=16.14.0 <20.0.0" - react-dom: ">=16.14.0 <20.0.0" + peerDependenciesMeta: + "@types/react": + optional: true languageName: unknown linkType: soft @@ -5916,9 +5997,10 @@ __metadata: "@swc/helpers": "npm:^0.5.1" peerDependencies: "@types/react": ">=16.14.0 <20.0.0" - "@types/react-dom": ">=16.9.0 <20.0.0" react: ">=16.14.0 <20.0.0" - react-dom: ">=16.14.0 <20.0.0" + peerDependenciesMeta: + "@types/react": + optional: true languageName: unknown linkType: soft @@ -5951,9 +6033,11 @@ __metadata: "@swc/helpers": "npm:^0.5.1" peerDependencies: "@types/react": ">=16.14.0 <20.0.0" - "@types/react-dom": ">=16.9.0 <20.0.0" react: ">=16.14.0 <20.0.0" react-dom: ">=16.14.0 <20.0.0" + peerDependenciesMeta: + "@types/react": + optional: true languageName: unknown linkType: soft @@ -5975,9 +6059,7 @@ __metadata: "@swc/helpers": "npm:^0.5.1" peerDependencies: "@types/react": ">=16.14.0 <20.0.0" - "@types/react-dom": ">=16.9.0 <20.0.0" react: ">=16.8.0 <20.0.0" - react-dom: ">=16.14.0 <20.0.0" languageName: unknown linkType: soft @@ -5991,6 +6073,9 @@ __metadata: peerDependencies: "@types/react": ">=16.14.0 <20.0.0" react: ">=16.14.0 <20.0.0" + peerDependenciesMeta: + "@types/react": + optional: true languageName: unknown linkType: soft @@ -6005,9 +6090,11 @@ __metadata: "@swc/helpers": "npm:^0.5.1" peerDependencies: "@types/react": ">=16.14.0 <20.0.0" - "@types/react-dom": ">=16.9.0 <20.0.0" react: ">=16.14.0 <20.0.0" react-dom: ">=16.14.0 <20.0.0" + peerDependenciesMeta: + "@types/react": + optional: true languageName: unknown linkType: soft @@ -6063,9 +6150,7 @@ __metadata: "@swc/helpers": "npm:^0.5.1" peerDependencies: "@types/react": ">=16.14.0 <20.0.0" - "@types/react-dom": ">=16.9.0 <20.0.0" react: ">=16.14.0 <20.0.0" - react-dom: ">=16.14.0 <20.0.0" languageName: unknown linkType: soft @@ -6391,9 +6476,7 @@ __metadata: dedent: "npm:^1.2.0" peerDependencies: "@types/react": ">=16.14.0 <20.0.0" - "@types/react-dom": ">=16.9.0 <20.0.0" react: ">=16.14.0 <20.0.0" - react-dom: ">=16.14.0 <20.0.0" languageName: unknown linkType: soft @@ -31851,12 +31934,12 @@ __metadata: languageName: node linkType: hard -"use-sync-external-store@npm:^1.2.0": - version: 1.2.2 - resolution: "use-sync-external-store@npm:1.2.2" +"use-sync-external-store@npm:^1.4.0": + version: 1.6.0 + resolution: "use-sync-external-store@npm:1.6.0" peerDependencies: - react: ^16.8.0 || ^17.0.0 || ^18.0.0 - checksum: 10c0/23b1597c10adf15b26ade9e8c318d8cc0abc9ec0ab5fc7ca7338da92e89c2536abd150a5891bf076836c352fdfa104fc7231fb48f806fd9960e0cbe03601abaf + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + checksum: 10c0/35e1179f872a53227bdf8a827f7911da4c37c0f4091c29b76b1e32473d1670ebe7bcd880b808b7549ba9a5605c233350f800ffab963ee4a4ee346ee983b6019b languageName: node linkType: hard