From 6c76072b19b67b0b1a9ea757f10b9c3880ed6059 Mon Sep 17 00:00:00 2001 From: delangle Date: Thu, 4 Jun 2026 07:58:53 +0200 Subject: [PATCH] [scheduler] Track bundle size of scheduler packages The bundle size CI step (`upload-size-snapshot`) was running but did not include any scheduler entrypoints, so `@mui/x-scheduler` and `@mui/x-scheduler-premium` were never measured. - Expose the package root (`.`) export for both packages so they can be tracked like the other public packages (data grid, charts, pickers, tree view). The build already auto-generated a root entry from `src/index.ts`; this makes it an explicit, declared public entrypoint. - Add the scheduler packages to the bundle-size-checker config. Component entrypoints are discovered from each package's `exports` field via `findComponentsFromExports` (the existing `findComponents` helper only matches PascalCase build folders and so can't pick up the scheduler's kebab-case sub-path exports), so new views are tracked automatically. Co-Authored-By: Claude Opus 4.8 --- packages/x-scheduler-premium/package.json | 1 + packages/x-scheduler-premium/src/index.ts | 4 +-- packages/x-scheduler/package.json | 1 + packages/x-scheduler/src/index.ts | 4 +-- .../bundle-size-checker.config.mjs | 27 +++++++++++++++++++ 5 files changed, 33 insertions(+), 4 deletions(-) diff --git a/packages/x-scheduler-premium/package.json b/packages/x-scheduler-premium/package.json index 63310664d248b..9642a8b3e738e 100644 --- a/packages/x-scheduler-premium/package.json +++ b/packages/x-scheduler-premium/package.json @@ -9,6 +9,7 @@ }, "homepage": "https://mui.com/x/react-scheduler/", "exports": { + ".": "./src/index.ts", "./agenda-view-premium": "./src/agenda-view-premium/index.ts", "./day-view-premium": "./src/day-view-premium/index.ts", "./event-calendar-premium": "./src/event-calendar-premium/index.ts", diff --git a/packages/x-scheduler-premium/src/index.ts b/packages/x-scheduler-premium/src/index.ts index d7b21b4c1bdf0..48ec055e4ba21 100644 --- a/packages/x-scheduler-premium/src/index.ts +++ b/packages/x-scheduler-premium/src/index.ts @@ -1,5 +1,5 @@ -// This file is used by the docs tooling to discover exported components. -// The package's public API uses sub-path exports defined in package.json. +// This file is the package's root entrypoint (the `.` export in package.json) +// and is also used by the docs tooling to discover exported components. export * from './agenda-view-premium'; export * from './day-view-premium'; export * from './event-calendar-premium'; diff --git a/packages/x-scheduler/package.json b/packages/x-scheduler/package.json index d669bf1af275e..21fc91e2fc615 100644 --- a/packages/x-scheduler/package.json +++ b/packages/x-scheduler/package.json @@ -13,6 +13,7 @@ "url": "https://opencollective.com/mui-org" }, "exports": { + ".": "./src/index.ts", "./agenda-view": "./src/agenda-view/index.ts", "./day-view": "./src/day-view/index.ts", "./event-calendar": "./src/event-calendar/index.ts", diff --git a/packages/x-scheduler/src/index.ts b/packages/x-scheduler/src/index.ts index b088e125e1c10..85bd520feb0c6 100644 --- a/packages/x-scheduler/src/index.ts +++ b/packages/x-scheduler/src/index.ts @@ -1,5 +1,5 @@ -// This file is used by the docs tooling to discover exported components. -// The package's public API uses sub-path exports defined in package.json. +// This file is the package's root entrypoint (the `.` export in package.json) +// and is also used by the docs tooling to discover exported components. export * from './agenda-view'; export * from './day-view'; export * from './event-calendar'; diff --git a/test/bundle-size/bundle-size-checker.config.mjs b/test/bundle-size/bundle-size-checker.config.mjs index fe4e498685dfb..0ab79b618092d 100644 --- a/test/bundle-size/bundle-size-checker.config.mjs +++ b/test/bundle-size/bundle-size-checker.config.mjs @@ -3,6 +3,7 @@ * * This file determines which packages and components will have their bundle sizes measured. */ +import fs from 'fs'; import path from 'path'; import { globby } from 'globby'; import { defineConfig } from '@mui/internal-bundle-size-checker'; @@ -20,6 +21,28 @@ async function findComponents(packageFolder, packageName) { return pkgComponents; } +// Sub-path exports that aren't renderable components and therefore shouldn't be +// tracked individually for bundle size (types, locales, augmentations, internals). +const NON_COMPONENT_EXPORTS = new Set(['models', 'locales', 'theme-augmentation', 'internals']); + +/** + * Lists the component entrypoints of a package from its `exports` field. + * + * Unlike `findComponents`, which scans the build output for PascalCase component + * folders, this reads the explicit kebab-case sub-path exports used by the + * scheduler packages, so newly added views are tracked automatically without + * hardcoding them here. + */ +function findComponentsFromExports(packageFolder, packageName) { + const pkgJsonPath = path.join(rootDir, `packages/${packageFolder}/package.json`); + const { exports: pkgExports } = JSON.parse(fs.readFileSync(pkgJsonPath, 'utf8')); + return Object.keys(pkgExports) + .filter((key) => key.startsWith('./')) + .map((key) => key.slice(2)) + .filter((name) => !NON_COMPONENT_EXPORTS.has(name) && !name.startsWith('use-')) + .map((name) => `${packageName}/${name}`); +} + /** * Generates the entrypoints configuration by scanning the project structure. */ @@ -71,6 +94,10 @@ export default defineConfig(async () => { ...treeViewComponents, '@mui/x-tree-view-pro', ...treeViewProComponents, + '@mui/x-scheduler', + ...findComponentsFromExports('x-scheduler', '@mui/x-scheduler'), + '@mui/x-scheduler-premium', + ...findComponentsFromExports('x-scheduler-premium', '@mui/x-scheduler-premium'), '@mui/x-license', '@mui/x-license/internals', ],