node.js - Publicar um Projeto TypeScript no NPM sem o código-fonte
Problema: Eu construí uma biblioteca que possui muitos arquivos .ts em pastas estruturadas. Agora eu quero publicar esta biblioteca, mas não quero compartilhar o código-fonte (arquivos TypeScript).
Tentativa: Quando eu executo o comando tsc, ele gera um arquivo .js correspondente a cada arquivo .ts. Quando eu mantenho declaration: true no meu arquivo tsconfig.json, então o tsc também gera um arquivo .d.ts para cada arquivo .ts.
Desafio: Todos os meus arquivos .js são gerados estruturalmente como esperado, mas os .d.ts também estão sendo gerados em local paralelo ao arquivo .js. Agora o desafio é: dessa forma, como qualquer consumidor desta biblioteca irá importar os tipos, já que todos estão espalhados em diferentes pastas, pois não há um único arquivo .d.ts gerado pelo tsc
Eu vejo muitos módulos no NPM (como https://github.com/winstonjs/winston) que publicam um único arquivo index.d.ts, e o consumidor os importa para usar e aproveitar a vantagem do TypeScript.
Atualmente, a estrutura do meu projeto parece como abaixo:
- my-project-root-directory
- src
- demo
- main.ts
- sample.ts
-lib
- constants
- some_constant_file1.ts
- models
- some_model_file1.ts
- some_model_file2.ts
- util
- some_util_file.ts
- dist
- demo
- main.js
- main.d.ts
- sample.js
- sample.d.ts
-lib
- constants
- some_constant_file1.js
- some_constant_file1.d.ts
- models
- some_model_file1.js
- some_model_file1.d.ts
- some_model_file2.js
- some_model_file2.d.ts
- util
- some_util_file.js
- some_util_file.d.ts
- logs
- package.json
- tsconfig.json
Obviamente não há um arquivo index.d.ts, como posso obter um único arquivo? A abordagem de um único arquivo .d.ts é a maneira correta? Ou estou indo na direção errada?
Eu já vi muitas respostas no StackOverflow e tutoriais no YouTube, todos eles mostrando um exemplo simples que tem apenas um único arquivo index.ts e o arquivo index.d.ts correspondente a ele. Mas não consigo encontrar uma forma perfeita que resolva meu objetivo.
Obrigado por ler minha pergunta, qualquer ajuda é bem-vinda.
Resposta #1
Aqui está como eu seguiria:
- Crie um arquivo
index.tsem cada pasta que exporte tipos que sejam significativos para os consumidores da biblioteca. Por exemplo:src/lib/constants/index.ts,src/lib/models/index.ts, ... Cada um dos arquivosindex.tsexporta todos os tipos TypeScript que existem em sua pasta, além de todos os arquivosindex.tsde suas subpastas. - Crie um arquivo central
src/index.tsque exporte tudo de todas as subpastassrc/.... - No seu
package.json, adicione uma entradatypes: "dist/index.d.ts". - No seu arquivo
.npmignore, adicione uma entradasrc/.
Com essa abordagem, você tem todas as suas importações referenciadas em um único arquivo central dist/index.d.ts, portanto os consumidores da sua biblioteca não precisam importar tipos de diferentes locais dentro do seu pacote. Além disso, você não distribui fontes TypeScript de forma alguma.
Aqui está como a estrutura do seu diretório pode acabar ficando. Eu excluí a pasta dist, mas um arquivo index.js e index.d.ts será gerado em cada pasta, assim:
- my-project-root-directory
- src
- index.ts
- demo
- main.ts
- sample.ts
-lib
- constants
- some_constant_file1.ts
- index.ts
- models
- some_model_file1.ts
- some_model_file2.ts
- index.ts
- util
- some_util_file.ts
- index.ts
- logs
- package.json
- tsconfig.json
Seu arquivo src/lib/constants/index.ts poderia, por exemplo, parecer com isto:
export * from './some_constant_file1.ts'
Seu arquivo src/lib/index.ts:
export * from './constants';
export * from './models';
export * from './util';
Seu arquivo src/index.ts:
export * from './lib';
