`@rollup/plugin-typescript` should error on TypeScript import of missing `.json` file (bundled with a different name by `@rollup/plugin-json`)

Abierto
#2,008 0 comentarios 0 reacciones 0 asignados Ver en GitHub

Nadie ha tomado este issue todavía.

Evaluación

Dificultad
4/5
Tiempo estimado
3-5 días
Aptitud para principiantes
55/100
Tipo de issue
Nueva funcionalidad
Claridad
Bastante claro
Estado de actividad
Tranquilo
Stack tecnológico
javascript, rollup, typescript

Línea de trabajo

Start with the reproduction in rollup.config.js and src/index.ts, then inspect the emitted dist/index.d.ts and dist/data.json.js. Run the listed tsc and rollup commands to reproduce the unresolved declaration import; done means the plugin detects relative declaration imports that do not match emitted files and reports the problem before publication.

Escrito por el modelo de indexación a partir del texto del issue.

Descripción

  • Rollup Plugin Name: @rollup/plugin-typescript
  • Rollup Plugin Version: 12.3.0
Feature Use Case

Careless use of @rollup/plugin-typescript and @rollup/plugin-json together results in broken TypeScript declarations, in a way that’s difficult to detect until after the package is published. A real example of this regression happening twice in the same package:

Here’s a minimal reproducible example:

package.json, tsconfig.json, src/data.json

package.json

{
  "name": "rollup-typescript-json-test",
  "version": "0.0.0",
  "private": true,
  "type": "module",
  "main": "dist/index.js",
  "types": "dist/index.d.ts",
  "devDependencies": {
    "@rollup/plugin-json": "^6.1.0",
    "@rollup/plugin-typescript": "^12.3.0",
    "rollup": "^4.61.1",
    "typescript": "^6.0.3"
  }
}

tsconfig.json

{
  "compilerOptions": {
    "declaration": true,
    "module": "nodenext",
    "noEmit": true,
    "outDir": "dist",
    "rootDir": "src"
  }
}

src/data.json

[0, 1, 2]

rollup.config.js

import json from "@rollup/plugin-json";
import typescript from "@rollup/plugin-typescript";

export default {
  input: "src/index.ts",
  plugins: [json(), typescript({ rootDir: "src" })],
  output: { dir: "dist", preserveModules: true },
};

src/index.ts

import data from "./data.json" with { type: "json" };

export { data };

It passes tsc and seemingly builds cleanly with rollup -c, but the resulting type declarations are broken in a way that’s difficult to notice until after publication.

$ npm i
$ npx tsc
$ npx rollup -c

src/index.ts → dist...
created dist in 315ms
$ npx tsc --ignoreConfig --noEmit --module nodenext dist/index.d.ts
dist/index.d.ts:1:18 - error TS2307: Cannot find module './data.json' or its corresponding type declarations.

1 import data from "./data.json";
                   ~~~~~~~~~~~~~


Found 1 error in dist/index.d.ts:1

$ npx tsc --ignoreConfig --noEmit dist/index.d.ts
dist/index.d.ts:1:18 - error TS7016: Could not find a declaration file for module './data.json'. '/home/anders/zulip/test/plugin-typescript-dts-json-repro/dist/data.json.js' implicitly has an 'any' type.

1 import data from "./data.json";
                   ~~~~~~~~~~~~~


Found 1 error in dist/index.d.ts:1
dist/data.json.js, dist/index.d.ts, dist/index.js

dist/data.json.js

var data = [
	0,
	1,
	2
];

export { data as default };

dist/index.d.ts

import data from "./data.json";
export { data };

dist/index.js

export { default as data } from './data.json.js';

The emitted declarations point to a nonexistent dist/data.json. The problem is that @rollup/plugin-json has emitted dist/data.json.js rather than dist/data.json, but TypeScript has no way to know this and couldn’t use dist/data.json.js even if it knew.

One way to discover this problem is using @arethetypeswrong/cli:

$ npx @arethetypeswrong/cli --pack .

rollup-typescript-json-test v0.0.0

Build tools:
- typescript@^6.0.3
- rollup@^4.61.1
- @rollup/plugin-typescript@^12.3.0

⚠️ A require call resolved to an ESM JavaScript file, which is an error in Node and some bundlers. CommonJS consumers will need to use a dynamic import. https://github.com/arethetypeswrong/arethetypeswrong.github.io/blob/main/docs/problems/CJSResolvesToESM.md

🥴 Import found in a type declaration file failed to resolve. Either this indicates that runtime resolution errors will occur, or (more likely) the types misrepresent the contents of the JavaScript files. Use -f json to see the imports that failed to resolve. https://github.com/arethetypeswrong/arethetypeswrong.github.io/blob/main/docs/problems/InternalResolutionError.md


┌───────────────────┬───────────────────────────────┐
│                   │ "rollup-typescript-json-test" │
├───────────────────┼───────────────────────────────┤
│ node10            │ 🟢                            │
├───────────────────┼───────────────────────────────┤
│ node16 (from CJS) │ ⚠️ ESM (dynamic import only)  │
│                   │ 🥴 Internal resolution error  │
├───────────────────┼───────────────────────────────┤
│ node16 (from ESM) │ 🥴 Internal resolution error  │
├───────────────────┼───────────────────────────────┤
│ bundler           │ 🟢                            │
└───────────────────┴───────────────────────────────┘

But @arethetypeswrong/cli isn’t used nearly as widely as it should be, so it would be better if @rollup/plugin-typescript could somehow detect this problem before it happens.

Feature Proposal

@rollup/plugin-typescript could try to resolve relative imports and re-exports within the emitted declarations against the set of emitted files, and complain if any are missing.

Lenguaje dominante
JavaScript
Estrellas
3.8k
Forks
635
Métricas de merge de PR
Sin PR fusionados en 30 d

Guía de contribución

Abrir la guía de contribución

Primeros pasos

  1. Lee el issue completo y luego la guía de contribución del proyecto.
  2. Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
  3. Haz un fork del repositorio y trabaja en una rama.
  4. Abre un pull request que haga referencia al número del issue.

Más de rollup/plugins

Todos los issues de rollup/plugins

Issues similares

Más issues de JavaScript

Recibe los nuevos issues en tu correo

Un resumen breve de issues de GitHub para principiantes.