microsoft / microsoft/TypeScript

Proposal: Export multiple, runtime-specific declaration files

Aberta
#63,641 0 comentários 3 reações 0 responsáveis Ver no GitHub

Ninguém assumiu esta issue ainda.

Needs Proposal Suggestion
Linguagem predominante
Go
Estrelas
111k
Forks
14.3k
Merge médio
2d 4h
PRs com merge (30d)
132

Descrição

🔍 Search Terms

export "multiple declaration file" "node bun deno" "custom conditions"

✅ Viability Checklist
⭐ Suggestion

The feature request is to, as a library publisher, have capabilities to export multiple declaration files for each supported runtime/platform.

Consumers also need capabilities to choose which declaration file should be used by their compilation process.

With the proliferation of JavaScript Runtimes other than Node.js such as Bun, Deno, Bare and Cloudflare Workers, libraries will tend to be more and more agnostic or “multi-runtime”.

Each platform has slightly different Type dependencies, they may have different names, is also possible that they may have different ways to be imported.

Suggestions for exporting multiple versions:

Using the package.json's exports:

{
  "name": "my-package",
  "version": "1.0.0",
  "exports": {
    ".": {
      "types": {
        "bun": "./index.bun.d.ts",
        "deno": "./index.deno.d.ts",
        "default": "./index.d.ts" // node.js typings
      },  
      "default": "./index.js"
    }
  }
}

Similar alternative using imports as in https://nodejs.org/api/packages.html#subpath-imports:

{
  "name": "my-package",
  "version": "1.0.0",
  "exports": {
    ".": {
      "types": "./index.d.ts" // which would import '#types'
      "default": "./index.js"
    }
  },
  "imports": {
    "#types": {
      "bun": "./index.bun.d.ts",
      "deno": "./index.deno.d.ts",
      "node": "./index.node.d.ts"
    }
  }
}

Alternative that reuses typesVersions, but using custom conditions as keys:

{
  "name": "package-name",
  "version": "1.0.0",
  "types": "./index.d.ts",
  "typesVersions": {
    "bun": { "index.d.ts": ["index.bun.d.ts"] },
    "deno": { "index.d.ts": ["index.deno.d.ts"] },
  }
}

Suggestions for consuming a specific version:

My first suggestion is to reuse the types option feature to also trigger the proposed conditional mechanism defined at package.json.

{
  "compilerOptions": {
    "types": ["deno"]
  }
}

Another alternative is to use reuse the custom conditions feature to also trigger the proposed conditional mechanism:

{
  "compilerOptions": {
    "customConditions": ["deno"]
  }
}
📃 Motivating Example

A practical example is: https://github.com/mafintosh/streamx/pull/123, streamx supports Node.js and Bare Runtime, and here are two versions of the same library that I'd like to expose both:

https://github.com/yassernasc/streamx/blob/17526106a3bd11fd177f9ce62250c19577f4ab64/index.bare.d.ts

https://github.com/yassernasc/streamx/blob/17526106a3bd11fd177f9ce62250c19577f4ab64/index.node.d.ts

💻 Use Cases
  1. What do you want to use this for?

As a library publisher, I want consumers to have realistic typings whenever is the supported runtime consuming the library.

  1. What shortcomings exist with current approaches?

I have not found a direct solution to the problem.

  1. What workarounds are you using in the meantime?

I've been writing a minimal runtime.d.ts declaration file that defines a minimal subset that all covered runtimes implement. This approach duplicates preexisting typings from the runtimes typings, however, the runtime.d.ts file tends to be unmaintained and outdated in the long run, plus, adds unwanted noise to the repositories.

Guia de contribuição

Abrir o guia de contribuição

Primeiros passos

  1. Leia a issue inteira e depois o guia de contribuição do projeto.
  2. Comente na issue dizendo que vai assumir — evita que duas pessoas façam o mesmo trabalho.
  3. Faça um fork do repositório e trabalhe em uma branch.
  4. Abra um pull request que referencie o número da issue.

Direção de pesquisa

Comece revisando os exemplos de exports, imports e typesVersions do package.json, juntamente com as opções compilerOptions e customConditions nomeadas na issue. Compare os caminhos propostos para seleção de arquivos de declaração e o exemplo motivador do streamx. A tarefa estará concluída quando houver um design definido e um plano de implementação para publicar e consumir declarações específicas do runtime.

Escrita pelo modelo de indexação a partir do texto da issue.

Avaliação

Stack de tecnologia
javascript, typescript
Domínio
developer-experience, tooling
Tipo de issue
Funcionalidade
Dificuldade
5/5
Tempo estimado
Mais de uma semana
Status de atividade
Pouca atividade
Clareza
Razoavelmente clara
Facilidade para iniciantes
35/100

Receba novas issues na sua caixa de entrada

Um resumo curto de issues do GitHub para quem está começando.