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
    No fields configured for issues without a type.

    Projects

    Status

    Todo

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions