Skip to content

Native Metro transformer crashes on Expo's @expo/log-box CSS modules with Specifier deserialization error #293

@HaukeSchnau

Description

@HaukeSchnau

Native Metro transformer crashes on Expo's @expo/log-box CSS modules with failed to deserialize; expected an object-like struct named Specifier

Summary

I hit a crash in react-native-css while following the Nativewind v5 setup on a fresh Expo 55 app.

The failure is triggered when Expo's own @expo/log-box CSS modules are sent through the native react-native-css Metro transformer. A direct compile of @expo/log-box/src/overlay/Overlay.module.css reproduces the same error outside Metro.

I do not think this is the same issue as CSS @property support. That appears to be covered separately by PR #284. This issue seems to be about react-native-css trying to compile framework-owned CSS that should be left to Expo's normal CSS handling.

Environment

  • expo: ~55.0.5
  • react-native: 0.83.2
  • nativewind: ^5.0.0-preview.2
  • react-native-css: ^3.0.4
  • package manager: bun
  • Node: v25.7.0

Minimal reproduction

Published repro repo:

Fast repro:

bun install
bun run repro:logbox

Current output:

Compiling node_modules/@expo/log-box/src/overlay/Overlay.module.css with react-native-css...
Error: failed to deserialize; expected an object-like struct named Specifier, found ()

The reproduction app itself uses the simple documented Nativewind Metro setup:

const { getDefaultConfig } = require("expo/metro-config");
const { withNativewind } = require("nativewind/metro");

module.exports = withNativewind(getDefaultConfig(__dirname));

Additional context

Expo's @expo/log-box package appears to own its CSS handling already:

  • it ships CSS modules under @expo/log-box/src/overlay/*.module.css
  • it has its own metro.config.js
  • it has a dedicated shadowDomCssTransformer.js

Because react-native-css replaces Metro's transformer globally, these Expo overlay files end up going through the native CSS compile path instead.

Expected behavior

react-native-css should not try to compile Expo log-box CSS modules with the native compiler on iOS/Android. Those files should be passed through Expo's default CSS handling so Nativewind can coexist with Expo's error overlay.

Actual behavior

The native CSS compiler crashes with:

Error: failed to deserialize; expected an object-like struct named Specifier, found ()

Proposed direction

A small Metro-level bypass for node_modules/@expo/log-box/**/*.css seems like the safest fix:

  • keep normal native compilation for app CSS and Nativewind input
  • skip native compilation for Expo's log-box CSS
  • delegate those files to the default Expo transformer

I have a local patch sketch for this if that direction sounds acceptable.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions