Como escrever plugins TypeScript para Babel e ESLint

Os plugins TypeScript para Babel e ESLint permitem que os desenvolvedores estendam e personalizem o comportamento dessas ferramentas para atender às necessidades específicas do projeto. Babel é um compilador JavaScript popular, e ESLint é um linter amplamente usado para garantir a qualidade do código. Escrever plugins personalizados pode agilizar os fluxos de trabalho de desenvolvimento e impor padrões de codificação em projetos TypeScript.

Etapa 1: Escrevendo um plugin TypeScript personalizado para Babel

Para criar um plugin Babel para TypeScript, siga estas etapas:

1.1 Instalar dependências necessárias

Comece instalando o Babel e as dependências necessárias para construir um plugin:

npm install --save-dev @babel/core @babel/preset-typescript @babel/plugin-syntax-typescript

1.2 Crie a estrutura do plugin

Em seguida, crie a estrutura para seu plugin Babel:

  • src/index.ts - O ponto de entrada para o plugin

1.3 Implementar o plugin Babel

Escreva o plugin exportando uma função que o Babel usará para transformar o código. Aqui está um plugin de exemplo que transforma tipos TypeScript:

import { types as t, NodePath } from '@babel/core';

export default function myTypeScriptPlugin() {
  return {
    visitor: {
      TSTypeAliasDeclaration(path: NodePath<t.TSTypeAliasDeclaration>) {
        // Example: log each TypeScript type alias declaration
        console.log(path.node.id.name);
      },
    },
  };
}

Este plugin registra cada alias de tipo TypeScript encontrado durante a compilação.

1.4 Use o plugin no Babel

Para usar o plugin, configure o Babel adicionando-o ao seu .babelrc ou babel.config.js:

{
  "presets": ["@babel/preset-typescript"],
  "plugins": ["./path-to-your-plugin"]
}

Etapa 2: Escrevendo um plugin TypeScript personalizado para ESLint

Agora, vamos criar um plugin TypeScript personalizado para ESLint. Isso pode ser útil para impor regras de linting específicas do projeto.

2.1 Instalar dependências necessárias

Primeiro, instale o ESLint e seus plugins relacionados ao TypeScript:

npm install --save-dev eslint @typescript-eslint/parser @typescript-eslint/eslint-plugin

2.2 Crie uma regra ESLint personalizada

Neste exemplo, criaremos uma regra ESLint personalizada que impõe uma convenção de nomenclatura para interfaces TypeScript:

import { TSESTree } from "@typescript-eslint/types";
import { Rule } from "eslint";

const rule: Rule.RuleModule = {
  meta: {
    type: "suggestion",
    docs: {
      description: "Enforce interface names to start with I",
      category: "Stylistic Issues",
    },
    schema: [], // no options
  },
  create(context) {
    return {
      TSInterfaceDeclaration(node: TSESTree.TSInterfaceDeclaration) {
        if (!/^I[A-Z]/.test(node.id.name)) {
          context.report({
            node,
            message: "Interface name '{{ name }}' should start with 'I'.",
            data: { name: node.id.name },
          });
        }
      },
    };
  },
};

export default rule;

2.3 Integrar a regra personalizada

Depois que a regra for escrita, você pode integrá-la à sua configuração ESLint:

{
  "parser": "@typescript-eslint/parser",
  "plugins": ["@typescript-eslint"],
  "rules": {
    "my-custom-rule": "error"
  }
}

Etapa 3: Testando e depurando plugins

Após escrever seus plugins Babel e ESLint, é essencial testá-los. Crie um arquivo TypeScript com os padrões relevantes e execute Babel ou ESLint para ver se os plugins funcionam conforme o esperado.

Para testar o plugin Babel, execute:

npx babel src --out-dir lib --extensions .ts

Para testar o plugin ESLint, execute:

npx eslint src --ext .ts

Conclusão

Criar plugins TypeScript personalizados para Babel e ESLint permite controle refinado sobre o processo de compilação e linting da sua base de código. Seguindo essas etapas, você pode estender ambas as ferramentas para atender às necessidades específicas do seu projeto e melhorar a experiência geral do desenvolvedor.