Используете ли вы кодогенерацию в проектах на Node.js?

Ответ

Да, я использую кодогенерацию для автоматизации рутинных задач и обеспечения консистентности кода. В моих Node.js проектах это особенно полезно для:

  • Генерации типизированных клиентов API из спецификаций OpenAPI/Swagger с помощью инструментов вроде openapi-typescript-codegen.
  • Создания TypeScript-типов для GraphQL с использованием graphql-code-generator на основе схемы.
  • Генерации кода для работы с БД, например, Prisma Client от Prisma ORM, который создает полностью типизированный запросник на основе схемы данных.

Я также настраиваю собственные генераторы для шаблонных структур проекта, например, для создания новых модулей с контроллерами, сервисами и тестами. Для этого удобно использовать plop.js:

// plopfile.js
export default function (plop) {
  plop.setGenerator('service', {
    description: 'Generate a new service module',
    prompts: [
      {
        type: 'input',
        name: 'name',
        message: 'Service name (e.g., user, payment):'
      }
    ],
    actions: [
      {
        type: 'add',
        path: 'src/services/{{kebabCase name}}.service.ts',
        templateFile: 'plop-templates/service.hbs'
      },
      {
        type: 'add',
        path: 'src/services/__tests__/{{kebabCase name}}.service.test.ts',
        templateFile: 'plop-templates/service.test.hbs'
      }
    ]
  });
}

Ключевой принцип — применять кодогенерацию там, где она устраняет повторяющуюся работу и снижает вероятность человеческой ошибки, но при этом не создает "магию", затрудняющую отладку и понимание кодовой базы.

Ответ 18+ 🔞

А, ну про кодогенерацию спросил! Да, конечно, пользуюсь, ёпта, иначе ж с ума сойти можно от этой рутины. Это ж как в том анекдоте: зачем делать руками, если можно заставить железную обезьяну это делать, пока ты кофе пьешь?

Вот смотри, в моих Node.js проектах это просто палочка-выручалочка, ядрёна вошь. Особенно когда нужно:

  • Нагенерировать типизированных клиентов для API из этих ваших OpenAPI-спецификаций. Беру openapi-typescript-codegen, и он мне выдает готовый клиент с типами. Сиди и не парься, не надо вручную каждый эндпоинт оборачивать — волнение ебать, как удобно.
  • Создать TypeScript-типы для GraphQL. Тут graphql-code-generator рулит, пизда рулю. Кинул ему на вход схему, а он тебе на выходе — все интерфейсы, запросы, мутации. Красота, а не работа.
  • Сгенерировать код для работы с базой. Ну, тут Prisma ORM — король, бля. Написал схему данных, а он тебе Prisma Client выдает — полностью типизированный запросник. Никаких "ой, а тут опечатка в названии поля" — всё проверит компилятор.

Но это, понимаешь, готовые инструменты. А бывает, что проект свой, особенный, и нужны свои шаблонные штуки. Ну, например, чтобы не копипастить каждый раз структуру нового модуля с контроллером, сервисом и тестами. Для этого я plop.js юзаю — хитрая жопа, но удобная. Настраиваешь раз, а потом как попросит — он тебе всё по шаблону нарисует.

Вот, смотри, примерный конфиг, чтобы понятно было:

// plopfile.js
export default function (plop) {
  plop.setGenerator('service', {
    description: 'Generate a new service module',
    prompts: [
      {
        type: 'input',
        name: 'name',
        message: 'Service name (e.g., user, payment):'
      }
    ],
    actions: [
      {
        type: 'add',
        path: 'src/services/{{kebabCase name}}.service.ts',
        templateFile: 'plop-templates/service.hbs'
      },
      {
        type: 'add',
        path: 'src/services/__tests__/{{kebabCase name}}.service.test.ts',
        templateFile: 'plop-templates/service.test.hbs'
      }
    ]
  });
}

Запустил, ввел имя, и всё — два файла на нужных местах лежат, с базовой структурой. Экономия времени — просто овердохуища.

Но главный принцип, чувак, который я для себя вывел: генерация — это чтобы рутину убивать и ошибки человеческие сокращать, а не чтобы наколдовать какую-то нечитаемую магию. Потому что если твой сгенерированный код потом невозможно отладить или понять, как он работает, то это уже не инструмент, а манда с ушами. Доверия к такому коду — ноль ебать. Генератор должен быть помощником, а не чёрным ящиком, из-за которого потом вся команда голову ломает.