Skip to content

fix(design-system): externalizar @mui/* y @emotion/* por prefijo (1.4.1, crash MUI >= 9.1) - #20

Merged
donchelo merged 1 commit into
mainfrom
fix/design-system-externalizar-mui
Oct 30, 2026
Merged

donchelo merged 1 commit into
mainfrom
fix/design-system-externalizar-mui

Conversation

@donchelo

Copy link
Copy Markdown
Contributor

Qué hace

Parche @ai4u/design-system 1.4.1: corrige el crash con @mui/material >= 9.1 externalizando MUI/Emotion/React por prefijo.

Alcance: afecta al paquete compartido, es decir a los 34 consumidores del design-system, en todos los tenants. No cambia API, tokens, breakpoints, textos, colores ni peer deps.

Causa raíz

packages/design-system/vite.config.ts (rollupOptions.external) externalizaba @mui/material, @mui/icons-material, @emotion/* solo por nombre exacto. Los subpaths (@mui/material/styles x14, @mui/material/CssBaseline, @mui/icons-material/<X> x~20, @emotion/*) se bundleaban en dist/index.js con el @mui/styled-engine de la versión instalada al compilar. El tag sistemaDiseno#v1.4.0 empotró styled-engine 9.0.0 (sin theme.motion); el TouchRipple de MUI >= 9.1 lee theme.motion.reducedMotion y revienta.

Fix

  • external: /^@mui\//, /^@emotion\//, react, react-dom, react/jsx-runtime, react-router-dom, react-helmet-async.
  • dist/ reconstruido y commiteado.
  • scripts/verify-externals.mjs + npm run verify-externals + paso en ci.yml tras el Build: falla si dist/ bundlea código de MUI/Emotion/React o importa algo fuera de los externals. Sin navegador ni dependencias.
  • Versión 1.4.1, packages/design-system/CHANGELOG.md nuevo (con nota retroactiva de 1.4.0), docs corregidas (README raíz y CLAUDE.md decían "por el minificador": no era eso).

Evidencia (smoke con react-dom/client + jsdom: ThemeProvider + Button del DS, mousedown/mouseup; proyecto fuera del repo, React 18)

dist MUI 9.0.1 MUI 9.2.0 MUI 9.5.0
tag v1.4.0 (antes) OK CRASH reading 'reducedMotion' CRASH igual
main previo (sin externalizar) OK OK OK
este PR (1.4.1) OK OK OK
  • Nota honesta: el dist de main previo no crashea en el smoke, pero sigue bundleando MUI (frágil, atado a la versión de compilación); el crash reproducido es el del tag publicado.
  • Tamaño: dist/index.js 447 437 -> 288 021 bytes; dist/index.cjs 281 886 -> 173 642. dist/styles/*.css se siguen copiando.
  • verify-externals falla contra el dist de main previo y contra el tag 1.4.0, y pasa con el nuevo (36 imports @mui/* externos, 0 bundleado).
  • Determinismo: dos builds seguidos dan los mismos SHA-256 en 197 archivos de dist/.
  • Como el CI: npm ci && npm run type-check && npm test && npm run build OK (161 tests de platform/etc.), git diff --quiet -- packages/*/dist limpio.

NO verificado

  • Smoke solo sobre el build ESM (index.js), no el .cjs; solo React 18 y MUI 9.0.1/9.2.0/9.5.0 (no 9.1.x ni 8/6, pese a peer >=6).
  • No se probó en un consumidor real ni en navegador; no se probó Next/SSR.
  • El CI remoto no corrió aún (se verificó solo local; mismo dist entre mi máquina y el runner es esperable pero no demostrado).
  • design-system sigue sin script test (los 7 tests jest no corren); fuera de alcance.

Qué NO se hizo

  • 1.5.0 visual (MUI_BREAKPOINTS, textos >= 12px, buttonSm >= 44px, etc.).
  • Bump a los 34 consumidores.

Pasos humanos tras el merge

  1. Publicar tag design-system-v1.4.1 con scripts/release.sh (no reutilizar 1.4.0).
  2. Después, bump a los 34 consumidores (respetando el presupuesto de Actions).

🤖 Generated with Claude Code

https://claude.ai/code/session_015nTgTv7S3gQwaoNFw5fZeG

El crash con @mui/material >= 9.1 ("Cannot read properties of undefined
(reading 'reducedMotion')") venia de que vite.config.ts externalizaba
@mui/material y @mui/icons-material solo por nombre exacto: los subpaths
(@mui/material/styles, @mui/icons-material/<X>, @emotion/*) quedaban
bundleados en dist/, incluido @mui/styled-engine de la version instalada al
compilar. Ahora external usa /^@mui\//, /^@emotion\//, react, react-dom,
react/jsx-runtime, react-router-dom y react-helmet-async.

- dist/index.js 447437 -> 288021 bytes; dist/index.cjs 281886 -> 173642.
- scripts/verify-externals.mjs + npm run verify-externals + paso en ci.yml.
- Version 1.4.1, CHANGELOG.md nuevo, docs corregidas (no era el minificador).

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_015nTgTv7S3gQwaoNFw5fZeG
@donchelo
donchelo marked this pull request as ready for review October 30, 2026 17:53
@donchelo
donchelo merged commit dba28d7 into main Oct 30, 2026
1 check passed
@donchelo
donchelo deleted the fix/design-system-externalizar-mui branch October 30, 2026 17:53
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant