Skip to content

types: export = in index.d.ts contradicts exports.import in package.json #625

@SisyphusZheng

Description

@SisyphusZheng

Problem

TypeScript 6.0 (shipped in Deno v2.8.3) changed export = in ESM context from a warning (TS1203) to a hard error (TS1192). This causes deno check to fail on @prefresh/vite.

Root Cause

@prefresh/vite's package.json declares ESM support via exports.import:

{
  "exports": {
    ".": {
      "types": "./index.d.ts",
      "import": "./src/index.js",
      "require": "./src/index.js"
    }
  }
}

But index.d.ts uses CJS syntax:

declare const prefreshPlugin: (options?: Options) => Plugin;
export = prefreshPlugin;  // CJS, not ESM export default

With moduleResolution: NodeNext, TS 6.0 sees exports.import -> treats the .d.ts as ESM -> export = in ESM -> TS1192 error.

Reproduce

Reproducible against stock tsc with NodeNext resolution:

tsc --moduleResolution NodeNext --module NodeNext test.ts

Where test.ts contains import prefresh from "@prefresh/vite".

Suggested Fix

Option A: Change export = prefreshPlugin to export default prefreshPlugin (v3.0.0 is already migrating toward ESM)

Option B: Remove the exports.import condition

Impact

Breaks type checking for all Deno v2.8.3+ users of Fresh (uses @prefresh/vite as a dependency). Fresh is temporarily working around with @ts-ignore.

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