Skip to content

Barrel export * from sub-files breaks named imports under Rolldown (Vite 8 / Storybook 10.4+) #949

Description

@zorrodg

Describe the bug

@solid-primitives/event-listener@2.4.5 re-exports all symbols from its barrel via:

// dist/index.js
export * from "./eventListener.js";
export * from "./eventListenerMap.js";
export * from "./components.js";
export * from "./eventListenerStack.js";
export * from "./callbackWrappers.js";
export * from "./types.js";

Downstream consumers (e.g. @kobalte/utils) do named imports from the barrel:

// @kobalte/utils/dist/index.js
import { createEventListener } from "@solid-primitives/event-listener";
export { createEventListener } from "@solid-primitives/event-listener";

This works fine with Vite 7 / Storybook 10.4.0 (Rollup handles export * resolution at link time), but breaks under Vite 8 / Storybook 10.4.6+ (Rolldown) with:

[MISSING_EXPORT] Error: "createEventListener" is not exported by
"@solid-primitives/event-listener/dist/index.js".

   ╭─[ @kobalte/utils/dist/index.js:2:10 ]
   │
 2 │ import { createEventListener } from "@solid-primitives/event-listener";
   │          ─────────┬────────
   │                    ╰────────── Missing export
───╯

Rolldown's static analysis does not follow export * for named-export resolution.

Environment

  • @solid-primitives/event-listener@2.4.5
  • Vite 8.1.0 (production bundler: Rolldown 1.1.3)
  • Storybook 10.4.6 (uses Vite 8 production bundler)
  • @kobalte/utils@0.9.1 (consumer that triggers the failure)

Workaround

Patch the barrel to add direct named exports alongside the export * re-exports:

export * from "./eventListener.js";
// ...
export { createEventListener, createEventSignal, makeEventListener, eventListener } from "./eventListener.js";
export { createEventListenerMap } from "./eventListenerMap.js";

This is a packaging-side fix (re-export barrels should also expose direct named bindings for bundlers that can't follow export *).

Expected

The barrel's export * re-exports should not break named imports in downstream consumers under Vite 8 / Rolldown. Either:

  1. The barrel re-exports should be statically resolvable (Rolldown should follow export * for named-export resolution at link time), or
  2. The barrel should expose both the export * and direct named exports so consumers' named imports work regardless of the bundler's static-analysis behavior.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions