Rollup-plugin-typescript2: Resolva o alias do caminho nos arquivos de declaração (d.ts)

Criado em 1 jan. 2020  ·  16Comentários  ·  Fonte: ezolenko/rollup-plugin-typescript2

Ao aplicar um alias de caminho a um projeto de texto digitado, o caminho é resolvido nos arquivos javascript emitidos, mas não nos arquivos de declaração.

A equipe do TypeScript declarou explicitamente que a resolução do caminho não é algo que será incluído no compilador (nunca) e é o domínio de utilitários como rollup / webpack.

Versões

  • datilografado: 3.7.4
  • acúmulo: 1.27.14
  • rollup-plugin-typescript2: 0.25.3

No projeto a seguir, coloquei o alias de ~/* em ./src/* . Permitindo importações usando caminhos absolutos do diretório base.

https://github.com/alshdavid-sandbox/rollup-typescript-library

npm install && make
cat dist/a/index.d.ts | grep "~"

cat deve imprimir nada, mas atualmente imprime

import { B } from '~/b';

Isso ilustra que não estamos aplicando a resolução de caminho aos arquivos de declaração.

bug controversial enhancement help wanted

Comentários muito úteis

Sim, estou conseguindo isso usando ttsc também. Não consegui fazer com que os transformadores funcionassem diretamente com rollup-plugin-typescript2 transformers options, então optei por usar ttsc

Minha configuração de rollup se parece com:

import typescript from 'rollup-plugin-typescript2'

export default {
  input: `src/index.ts`,
  preserveModules: true,
  output: {
    format: 'esm',
    dir: './dist'
  },
  external: [],
  watch: {
    include: 'src/**',
  },
  plugins: [
    typescript({ 
      typescript: require('ttypescript'),
      tsconfigDefaults: {
        compilerOptions: {
          plugins: [
            { "transform": "typescript-transform-paths" },
            { "transform": "typescript-transform-paths", "afterDeclarations": true }
          ]
        }
      }
    }),
  ],
}

Todos 16 comentários

De acordo com as pessoas datilografadas, você está usando ao contrário:

Nossa opinião geral sobre isso é que você deve escrever o caminho de importação que funciona em tempo de execução e definir seus sinalizadores de TS para satisfazer a etapa de resolução do módulo do compilador, em vez de escrever a importação que funciona fora da caixa para TS e, em seguida, tentar para ter alguma outra etapa "consertar" os caminhos para o que funciona em tempo de execução.

https://github.com/microsoft/TypeScript/issues/15479

Atualmente, este plugin não posta o processamento ou mesmo analisa as declarações de tipo, uma vez que são emitidas pelo script.

Pode ser possível fazer algo um pouco melhor do que pesquisar / substituir, mas para resolver isso em geral, vamos basicamente precisar reimplementar o rollup para declarações de tipo (a menos que eles já tenham adicionado a API de serviço de linguagem para gerar declarações agrupadas enquanto eu não estava olhando)

Obrigado pela resposta. Existe um gancho de "pós-emissão" que é executado nos modos de observação e construção que poderia ser usado para anexar uma pesquisa / substituição de etapa de pós-processamento grosseira?

Os arquivos d.ts são emitidos diretamente no pipeline de rollup (quando a opção useTsconfigDeclarationDir: false é usada), portanto, você pode fazer um plug-in de rollup que os transforma.

Eles são emitidos quando o pacote é escrito, então você pode ter que usar generateBundle hook em vez de transform .

Se isso não funcionar. Posso adicionar um gancho de pré-gravação ao próprio rpt2.

Encontre o mesmo problema, encontrei uma solução aqui
atualmente usando ttsc com typescript-transform-paths para gerar arquivos de declaração após o rollup emitidos arquivos ts, meio que redundantes, mas funciona ...

Sim, estou conseguindo isso usando ttsc também. Não consegui fazer com que os transformadores funcionassem diretamente com rollup-plugin-typescript2 transformers options, então optei por usar ttsc

Minha configuração de rollup se parece com:

import typescript from 'rollup-plugin-typescript2'

export default {
  input: `src/index.ts`,
  preserveModules: true,
  output: {
    format: 'esm',
    dir: './dist'
  },
  external: [],
  watch: {
    include: 'src/**',
  },
  plugins: [
    typescript({ 
      typescript: require('ttypescript'),
      tsconfigDefaults: {
        compilerOptions: {
          plugins: [
            { "transform": "typescript-transform-paths" },
            { "transform": "typescript-transform-paths", "afterDeclarations": true }
          ]
        }
      }
    }),
  ],
}

Obrigado cara @alshdavid ! Você salvou minha vida! Ontem tive o mesmo problema e usando typescript-transform-paths resolvi! Obrigado 💪

// webpack.config.js
module: {
    rules: [
      {
        test: /\.(ts|tsx)$/,
        use: [
          {
            loader: require.resolve('ts-loader'),
            options: {
              compiler: 'ttypescript',
            },
          },
          {
            loader: require.resolve('react-docgen-typescript-loader'),
          },
        ],
        exclude: /(node_modules)/,
      },
    ],
  },
// tsconfig.json
compilerOptions: {
  "plugins": [
     { "transform": "typescript-transform-paths" },
     { "transform": "typescript-transform-paths", "afterDeclarations": true }
   ]
}

esta solução funcionou para mim no passado, mas estou encontrando muitas situações agora em que recebo um erro como este:

UnhandledPromiseRejectionWarning: TypeError: Não é possível ler a propriedade 'texto' de indefinido

se eu deixar de usar aliases (e esses plug-ins), funcionará sem problemas. Alguém mais tem esse problema?

esta solução funcionou para mim no passado, mas estou encontrando muitas situações agora em que recebo um erro como este:

UnhandledPromiseRejectionWarning: TypeError: Não é possível ler a propriedade 'texto' de indefinido

se eu deixar de usar aliases (e esses plug-ins), funcionará sem problemas. Alguém mais tem esse problema?

Eu tenho o mesmo erro

esta solução funcionou para mim no passado, mas estou encontrando muitas situações agora em que recebo um erro como este:

UnhandledPromiseRejectionWarning: TypeError: Não é possível ler a propriedade 'texto' de indefinido

se eu deixar de usar aliases (e esses plug-ins), funcionará sem problemas. Alguém mais tem esse problema?

Olá, estou apresentando o mesmo problema, mas em um contexto diferente: estou usando o rollup para agrupar uma biblioteca de componentes escrita com Vue e Typescript. Este é o arquivo rollup.config.js :

import path from "path";

import alias from "@rollup/plugin-alias";
import cleaner from "rollup-plugin-cleaner";
import css from "rollup-plugin-css-only";
import scss from "rollup-plugin-scss";
import typescript from "rollup-plugin-typescript2";
import vue from "rollup-plugin-vue";

export default [
  {
    input: "./src/index.ts",
    preserveModules: true,
    output: {
      format: "esm",
      dist: "./dist"
    },
    plugins: [
      cleaner({ targets: ["dist/"] }),
      alias({
        resolve: [".ts", ".vue"],
        entries: { "@/": path.resolve(__dirname, "./src/") }
      }),
      css({ output: "dist/bundle.css" }),
      scss(),
      typescript({
        typescript: require("ttypescript"),
        tsconfigDefaults: {
          compilerOptions: {
            plugins: [
              { transform: "typescript-transform-paths" },
              {
                transform: "typescript-transform-paths",
                afterDeclarations: true
              }
            ]
          }
        }
      }),
      vue({ css: false })
    ]
  }
];

Eu já uso o comando ttsc --emitDeclarationOnly após o rollup --config one, a fim de resolver aliases, mas .vue.d.ts arquivos gerados pelo rollup não são processados ​​(é claro).

O mesmo problema com ttypescript e typescript-transofrm-paths , não funcionou: desapontado. Ao executar o build:

[!] (plugin rpt2) TypeError: Cannot read property 'text' of undefined

Mas usando @zerollup/ts-transform-paths e ttypescript funciona 🎉

Há uma configuração incrível aqui: https://www.npmjs.com/package/@zerollup/ts -transform-path # setup-for-rollup-plugin-typescript2

_rollup.config.js_

import ttypescript from 'ttypescript'
import tsPlugin from 'rollup-plugin-typescript2'

export default {
    input: 'src/lib.ts',
    output: [{ file : 'dist/lib.js', name : 'mylib', format : 'iife', sourcemap : true }],
    plugins: [
        tsPlugin({
            typescript: ttypescript
        })
    ]
}

_tsconfig.json_

{
    "compilerOptions": {
        "baseUrl": ".",
        "paths": {
            "my-lib/*": ["src/*"]
        },
        "plugins": [
            {
                "transform": "@zerollup/ts-transform-paths",
                "exclude": ["*"]
            }
        ]
    }
}

Excelente! Resolvi de forma diferente, mas não tem relação com esse plugin. Eu removi o caminho de transformação de typescript e ttypescript e deixei o plugin atual como está (typescript ()). Usei tsc-alias após o rollup para resolver o problema. Ele substitui até mesmo arquivos vue porque processa arquivos .d.ts após sua geração.

Usei tsc-alias após o rollup para resolver o problema. Ele substitui até mesmo arquivos vue porque processa arquivos .d.ts após sua geração.

@mantlebee Você se importa de postar um exemplo de sua tsconfig.json , bem como sua configuração de rollup?

Mas usando @zerollup/ts-transform-paths e ttypescript funciona 🎉

@luanorlandi ts-transform-path funciona em tempo de execução? Provavelmente não é uma boa ideia para código de biblioteca.

Usei tsc-alias após o rollup para resolver o problema. Ele substitui até mesmo arquivos vue porque processa arquivos .d.ts após sua geração.

@mantlebee Você se importa de postar um exemplo de sua tsconfig.json , bem como sua configuração de rollup?

Propriedades importantes são declaration , declarationDir e outDir

// tsconfig.json
{
  "compilerOptions": {
    "target": "esnext",
    "module": "esnext",
    "strict": true,
    "jsx": "preserve",
    "importHelpers": true,
    "moduleResolution": "node",
    "experimentalDecorators": true,
    "esModuleInterop": true,
    "allowSyntheticDefaultImports": true,
    "sourceMap": true,
    "declaration": true,
    "declarationDir": "dist/src",
    "baseUrl": ".",
    "outDir": "dist/src",
    "types": [
      "webpack-env",
      "jest"
    ],
    "paths": {
      "@/*": [
        "src/*"
      ]
    },
    "lib": [
      "esnext",
      "dom",
      "dom.iterable",
      "scripthost"
    ]
  },
  "include": [
    "src/**/*.ts",
    "src/**/*.tsx",
    "src/**/*.vue",
    "tests/**/*.ts",
    "tests/**/*.tsx"
  ],
  "exclude": [
    "node_modules"
  ]
}

Arquivo rollup.config.js simples

import path from "path";

import alias from "@rollup/plugin-alias";
import cleaner from "rollup-plugin-cleaner";
import scss from "rollup-plugin-scss";
import typescript from "rollup-plugin-typescript2";
import vue from "rollup-plugin-vue";

export default [
  {
    input: "src/index.ts",
    output: {
      format: "esm",
      file: "dist/elegere-ui.js"
    },
    plugins: [
      cleaner({ targets: ["dist/"] }),
      alias({
        resolve: [".ts", ".vue"],
        entries: { "@/": path.resolve(__dirname, "src/") }
      }),
      scss(),
      typescript({
        useTsconfigDeclarationDir: true
      }),
      vue()
      //{ css: false }
    ]
  }
];

Então eu coloco tudo no comando prepublishOnly (só porque é útil para mim)

"prepublishOnly": "npm run rollup && tsc-alias && npm run docs"

O TSC-ALIAS fará a substituição dentro da pasta dist/src ; Eu escolhi colocar tudo dentro disso porque ts-alias substituirá aliases pensando estar dentro da pasta src.

Não é uma conclusão ideal, mas funciona. Vou verificar a solução de @luanorlandi o mais

Claro, todas as outras lib devem ser configuradas para evitar a pasta dist/src , como jest

Mas usando @zerollup/ts-transform-paths e ttypescript funciona 🎉

@luanorlandi ts-transform-path funciona em tempo de execução? Provavelmente não é uma boa ideia para código de biblioteca.

Acho que não, o transformador é apenas para a etapa de construção, como a biblioteca o descreve:

_... tsconfig baseUrl + alias de caminhos reescrevendo em pacotes e arquivos de declaração. Todos eles serão reescritos para relativos nos arquivos js transpilados e nos arquivos d.ts._

https://www.npmjs.com/package/@zerollup/ts -transform-path

Esta página foi útil?
0 / 5 - 0 avaliações