npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2024 – Pkg Stats / Ryan Hefner

openapi-modifier

v0.0.38

Published

OpenAPI описывающий бекендное API далеко не всегда идеальное: содержит ошибки, неточности или какие-то особенности ломают другие инструменты, например, кодогенерацию или генерацию типов.

Downloads

278

Readme

openapi-modifier

OpenAPI описывающий бекендное API далеко не всегда идеальное: содержит ошибки, неточности или какие-то особенности ломают другие инструменты, например, кодогенерацию или генерацию типов.

Данный инструмент предназначен для облегчения работы с OpenAPI - для легкой модификации OpenAPI спецификации и удобного описания/документации изменений для истории/пояснений.

Частые кейсы применения:

При помощи правила можно убрать из сущности поле, и сгенерировать типизацию без нее, и если запустить проверку типизации в проекте TS поможет найти все места использования.

{
    "rule": "patch-schemas"
}
  • Бекендер просит проверить используется ли параметр в какой-то ручке
  • Бекендер создает задачу перестать пользоваться endpoint'ом
  • Бекендер написал новое API в разработке но его нет в документации
  • Бекендер просит больше не использовать какой-то параметр в endpoint'е
  • Не валидное OpenAPI (Например, бекендеры использовали не существующий тип int)
  • Нужно оставить знания по модификации (коллеге важно знать почему какое-то поле заблокировано)
  • Нужно наблюдать за изменениями API и вовремя корректировать конфиг (убрали использование ручки)
  • Убирать deprecated поля

[!IMPORTANT]
Поддерживает OpenAPI 3.1, 3.0. Мы не проверяли поддержку OpenAPI 2, так как формат является устаревшим и рекомендуем мигрировать вашу документацию на OpenAPI 3.0.

Демонстрация использования

Например имеем входной файл спецификации/документации api от бекенд разработчиков. Например, скачен через curl cli из github.

Пишем файл конфигурации, описывающий все что нужно поменять в исходной спецификации/документации с пояснительными комментариями:

const config: ConfigT = {
    pipeline: [
        // JIRA-10207 - new feature API for epic JIRA-232
        {
            rule: 'merge-openapi-spec',
            config: {
                path: 'input/feature-openapi-JIRA-232.yaml',
            },
        },

        // ...

        // JIRA-10212 - wrong docs, waiting JIRABACKEND-8752
        {
            rule: 'patch-schemas',
            config: [
                {
                    descriptor: {
                        type: 'component-schema',
                        componentName: 'Pet',
                    },
                    patchMethod: 'merge',
                    schemaDiff: {
                        properties: {
                            id: {
                                type: 'string',
                                format: 'uuid',
                            },
                        },
                    },
                },
            ],
        },

        // ...

        // JIRA-11236 - removed deprecated endpoint, waiting JIRABACKEND-3641
        {
            rule: 'filter-endpoints',
            config: {
                disabled: [
                    {
                        path: '/v1/pets/{petId}',
                        method: 'delete',
                    },
                ],
            },
        },

        // ...
}

Далее при помощи этого файла конфигурации и cli openapi-modifier, изменяем исходный файл спецификации/документации и получается модифицированная спецификация/документация.

Далее при помощи, к примеру cli dtsgenerator, генерируем из модифицированной спецификации/документаци файл типизации для api, которую уже используем в коде проекта.

Полный код примера

Использование как CLI

При помощи npx

npx openapi-modifier --input=input/openapi.yml --output=output/openapi.yml --config=openapi-modifier.config.js

на примере использования

или при помощи npm

npm i --save-dev openapi-modifier

openapi-modifier --input=input/openapi.yml --output=output/openapi.yml --config=openapi-modifier.config.js

на примере использования

Параметры:

| Опция | Описание | Пример | Дефолтное | | -------- | -------------------------------------------------------------------------------------------------------- | ---------------------------- |----------------------------------------------| | input | [обязательный] входной файл, специфиакция/документация в формате openapi | input/openapi.yml | | | output | [обязательный] выходной файл, специфиакция/документация в формате opeanpi | output/openapi.yml | | | config | путь до файла конфигурации. Детальное описание конфигурации см. ниже | openapi-modifier.config.js | openapi-modifier.config.(js\ts\json\yaml\yml) |

Демонстрация на примере использования

Пример файлов конфигурации

Можно использовать конфиги в след. расширениях: .ts, .js, .yaml, .yml, .json.

Если путь до конфигурации не указан, конфигурации по-умолчанию берется из файла openapi-modifier.config.js относительно директории запуска.

Пример конфигурации в .ts. Наример, назовем файл openapi-modifier.config.ts.

import type { ConfigT } from 'openapi-modifier';

const config: ConfigT = {
  input: './input/openapi.yaml',
  output: './output/openapi.yaml',
  rules: [
    // ... more rules
    {
      name: 'remove-operation-id',
      disabled: true,
    },
    // ... more rules
  ],
};

export default config;

Пример конфигурации в .js

module.exports = {
  input: './input/openapi.yaml',
  output: './output/openapi.yaml',
  rules: [
    {
      name: 'remove-operation-id',
      disabled: true,
    },
    // ...
  ],
};

Параметры конфигурации

Параметры:

| Опция | Описание | Дефолтное | | ----------------- | ------------------------------------------------------------------------------------------------------------------------------------------------ | ----------------------------------------------------------------- | | logger.minLevel | [обязательный] входной файл, специфиакция/документация в формате openapi | | | input | [обязательный] выходной файл, специфиакция/документация в формате opeanpi | | | output | [обязательный] выходной файл, специфиакция/документация в формате opeanpi | | | pipeline | последовательность применяемых правил модификации к входному файлу. Детальное описание конфигурации см. ниже | ./openapi-modifier.config.js или ./openapi-modifier.config.ts |

Простой пример конфигурации, например файл openapi-modifier.config.json:

{
  "pipeline": [
    {
      "rule": "remove-operation-id"
    }
  ]
}

Пример использования

Использование как npm пакет/модуль

import { openapiModifier } from 'openapi-modifier';

// ...

await openapiModifier({
  input: 'input/openapi.yml',
  output: 'output/openapi.yml',
  pipeline: [
    // ... more rules
    {
      rule: 'remove-operation-id',
      config: {
        ignore: [],
      },
    },
    // ... more rules
  ],
});

Демонстрация на примере использования

или используя отдельный файл конфигурации

import { openapiModifier } from 'openapi-modifier';

// ...

await openapiModifier({
  input: 'input/openapi.yml',
  output: 'output/openapi.yml',
  config: 'openapi-modifier.config.ts',
});

Существующие правила

Добавление нового правила

Необходимо в папку src/rules добавить папку с именем вновь созданного правила с 6 файлами:

  • index.ts - основной файл с логикой правила - должны быть экспортированы: processor (дефолтный экспорт) и configSchema (именованный экспорт)
  • index.test.ts - тесты на правило покрывающие все поля конфигурации и примеры их использования
  • /docs/_description.md - файл с описанием правила
  • /docs/_motivation.md - файл с описанием мотивации создания правила с примерами (в каких случаях на практике может быть полезно)
  • /docs/_config.md - файл с описанием конфигурации для правила

Для вывода подробных логов необходимых для отладки см. пункт "Отладка".

Все названия правил должны начинаться с обозначения действия.

Отладка

Внутри используется для детального логирования npm-пакет - debug

Для вывода всех debug логов:

DEBUG=openapi-modifier:* openapi-modifier

Для вывода debug логов по правилу, например по правилу remove-operation-id:

DEBUG=openapi-modifier:rule:remove-operation-id openapi-modifier

TODO описание параметра verbose

Примеры использования

Наиболее приближенный к реальному использованию пример в нем отражено:

Его конфиг:

Полный код примера

Другие примеры:

  • Использование как npm пакет в скриптах

FAQ

  • Чем опасны модификации по ссылкам $ref? Потому что значит что $ref ссылается на общую часть схемы, и ее модификация, возможно, приведет к неявному изменению в другом месте спецификации, где переиспользуется $ref, и такую багу будет крайне сложно отловить.

Полезные ссылки

Больше примеров как можно использовать openapi:

simple-text-file-modifier

Подробная документация по cli simple-text-file-modifier

TODO

  • причесать README.md правил - 13 штук
  • причесать главный README.md
  • в readme каждого правила добавить ссылку "Назад" (в конец и начало доки)
  • проверить ссылки из ошибок на github (якори проверить) и в message factory заменить их
  • разделить документацию на ru/en