googleapis / googleapis/google-api-nodejs-client

Any option for ESM support in current release?

Abierto
#3,397 1 comentario 3 reacciones 0 asignados Ver en GitHub

Nadie ha tomado este issue todavía.

priority: p3 type: question
Lenguaje dominante
TypeScript
Estrellas
12.3k
Forks
2k
Merge medio
1 d 9 h
PR fusionados (30 d)
24

Descripción

I'm attempting to port a node TypeScript project to use the ESM support in newer versions of node and [TypeScript](https://www.typescriptlang.org/tsconfig#module).

TypeScript has muddied the water historically by supporting ESM style import/export syntax but still emitting CommonJS format modules for the node ecosystem. Moving things forward means increased consciousness of output format, understanding the format of libraries and falling back to [dynamic imports](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/import) when needed to pull in things that are only still available as CommonJS.

The only dependency that I'm running into a wall with for this project is `@googleapis/sheets`. It's written in TypeScript, but published as CommonJS with types bundled. That worked when my code was also CommonJS under the hood, but I can't figure out an equivalent way to reference what I need from it in ESM TypeScript.

Attached is an [example project](https://github.com/googleapis/google-api-nodejs-client/files/13532286/googleapis-esm.zip) showing various approaches. Note the `"type": "module"` in _package.json_ and the `"module": "NodeNext"` in _tsconfig.json_. The intent is to write TypeScript in ESM format, emit verbatim ESM and pull in CommonJS where necessary via `import()`.
- `base.mts` - A base class to force other modules to integrate with something in explicitly ESM format.
- `classic.ts` - How we would have used the sheets API historically. But this fails when we try to pull in base because using sheets forces us to CommonJS under the hood so we can't use pure ESM directly. `TS1479: The current file is a CommonJS module whose imports will produce  require  calls; however, the referenced file is an ECMAScript module and cannot be imported with  require . Consider writing a dynamic  import(  ./base.mjs )' call instead.`
- `commonjs.cts` - The same scenario/problem as classic, just using CommonJS explicitly instead of TypeScript's sugared import/export syntax.
- `esm.mts` - An explicitly ESM module. This compiles because it's only dependent on sheets at the type level, and that all gets stripped out in the build. I'm not sure if it would work with more substantial integration since it would be producing ESM style imports for a CommonJS module which wouldn't resolve at runtime.
- `implicit.ts` - An implicitly ESM module because the package is ESM and because of the tsconfig. It's trying to use dynamic import but runs into problems because things like interfaces aren't part of the build structure and the classes can only be referenced with `typeof`.

I see #3335 and #3337 to improve ESM support, but I'm interested in any workaround I'm overlooking with the _current_ version that would make this usable in an ESM project. At this point sandboxing it as `.cts` and converting all the ESM imports it needs to dynamic imports seems most equivalent, but it's non-trivial because all of those then have to be dealt with as async.

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.

Línea de trabajo

Empieza reproduciendo el comportamiento informado con el proyecto de ejemplo adjunto, especialmente base.mts, classic.ts, commonjs.cts, esm.mts e implicit.ts, utilizando la configuración de package.json y tsconfig.json descrita. Lee las issues #3335 y #3337 junto con la reproducción; el trabajo estará completo cuando los proyectos ESM actuales tengan una forma documentada y verificada de usar @googleapis/sheets, o cuando el soporte necesario esté claramente delimitado.

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

Evaluación

Stack tecnológico
node.js, typescript
Área
api
Tipo de issue
Nueva funcionalidad
Dificultad
5/5
Tiempo estimado
Más de una semana
Estado de actividad
Estancado
Claridad
Necesita aclaración
Aptitud para principiantes
25/100

Recibe los nuevos issues en tu correo

Un resumen breve de issues de GitHub para principiantes.