An open API service indexing awesome lists of open source software.

https://github.com/itwillwork/openapi-modifier

This package allows you to automate the process of modifying OpenAPI specifications by applying a set of predefined rules
https://github.com/itwillwork/openapi-modifier

Last synced: 23 days ago
JSON representation

This package allows you to automate the process of modifying OpenAPI specifications by applying a set of predefined rules

Awesome Lists containing this project

README

          

[πŸ‡ΊπŸ‡Έ English](./README.md) | [πŸ‡·πŸ‡Ί Русский](./README-ru.md) | [πŸ‡¨πŸ‡³ δΈ­ζ–‡](./README-zh.md)

# OpenAPI Modifier

Π˜Π½ΡΡ‚Ρ€ΡƒΠΌΠ΅Π½Ρ‚ для ΠΌΠΎΠ΄ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΠΈ OpenAPI спСцификаций с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ настраиваСмых ΠΏΡ€Π°Π²ΠΈΠ».

Π­Ρ‚ΠΎΡ‚ ΠΏΠ°ΠΊΠ΅Ρ‚ позволяСт Π°Π²Ρ‚ΠΎΠΌΠ°Ρ‚ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ процСсс измСнСния OpenAPI спСцификаций, примСняя ΠΊ Π½ΠΈΠΌ Π½Π°Π±ΠΎΡ€ ΠΏΡ€Π΅Π΄ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹Ρ… ΠΏΡ€Π°Π²ΠΈΠ».

## ΠžΡΠ½ΠΎΠ²Π½Ρ‹Π΅ возмоТности

- ΠœΠΎΠ΄ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΡ OpenAPI спСцификаций Π² Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π°Ρ… YAML ΠΈ JSON
- Гибкая систСма ΠΏΡ€Π°Π²ΠΈΠ» для измСнСния спСцификаций
- ΠŸΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° ΠΊΠ°ΠΊ CLI, Ρ‚Π°ΠΊ ΠΈ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎΠ³ΠΎ использования c ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠΎΠΉ TypeScript

> [!IMPORTANT]
> ΠŸΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ OpenAPI 3.1, 3.0. ΠœΡ‹ Π½Π΅ провСряли ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΡƒ OpenAPI 2, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ являСтся ΡƒΡΡ‚Π°Ρ€Π΅Π²ΡˆΠΈΠΌ ΠΈ Ρ€Π΅ΠΊΠΎΠΌΠ΅Π½Π΄ΡƒΠ΅ΠΌ ΠΌΠΈΠ³Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π²Π°ΡˆΡƒ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΡŽ Π½Π° OpenAPI 3.0.

## ΠœΠΎΡ‚ΠΈΠ²Π°Ρ†ΠΈΡ ΠΈ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρ‹ использования

OpenAPI ΠΎΠΏΠΈΡΡ‹Π²Π°ΡŽΡ‰ΠΈΠΉ Π±Π΅ΠΊΠ΅Π½Π΄Π½ΠΎΠ΅ API Π΄Π°Π»Π΅ΠΊΠΎ Π½Π΅ всСгда идСальноС: содСрТит ошибки, нСточности ΠΈΠ»ΠΈ ΠΊΠ°ΠΊΠΈΠ΅-Ρ‚ΠΎ особСнности Π»ΠΎΠΌΠ°ΡŽΡ‚ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ инструмСнты, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΊΠΎΠ΄ΠΎΠ³Π΅Π½Π΅Ρ€Π°Ρ†ΠΈΡŽ ΠΈΠ»ΠΈ Π³Π΅Π½Π΅Ρ€Π°Ρ†ΠΈΡŽ Ρ‚ΠΈΠΏΠΎΠ².

Π₯Ρ€Π°Π½ΠΈΡ‚ΡŒ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΎΠ± измСнСния Π² Π΄Π΅ΠΊΠ»Π°Ρ€Π°Ρ‚ΠΈΠ²Π½ΠΎΠΌ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π΅, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π±Ρ‹Π» понятСнт контСкст ΠΈ Π°ΠΊΡ‚ΡƒΠ°Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ измСнСния, особСнно ΠΏΠΎΠ»Π΅Π·Π½ΠΎ Π² ΠΊΡ€ΡƒΠΏΠ½Ρ‹Ρ… ΠΊΠΎΠΌΠΌΠ°Π½Π΄Π°Ρ….

Π”Ρ€ΡƒΠ³ΠΈΠ΅ случаи примСнСния

### Π”Ρ€ΡƒΠ³ΠΈΠ΅ случаи примСнСния:

- Π‘Π΅ΠΊΠ΅Π½Π΄Π΅Ρ€ просит ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Π»ΠΈ ΠΏΠΎΠ»Π΅ Π² ΠΊΠ°ΠΊΠΎΠΉ-Ρ‚ΠΎ сущности;
- Π‘Π΅ΠΊΠ΅Π½Π΄Π΅Ρ€ просит ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Π»ΠΈ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ Π² ΠΊΠ°ΠΊΠΎΠΉ-Ρ‚ΠΎ Ρ€ΡƒΡ‡ΠΊΠ΅;
- Π‘Π΅ΠΊΠ΅Π½Π΄Π΅Ρ€ создаСт Π·Π°Π΄Π°Ρ‡Ρƒ ΠΏΠ΅Ρ€Π΅ΡΡ‚Π°Ρ‚ΡŒ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ endpoint'ΠΎΠΌ;
- Π‘Π΅ΠΊΠ΅Π½Π΄Π΅Ρ€ написал Π½ΠΎΠ²ΠΎΠ΅ API Π² Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ΅, Π½ΠΎ Π΅Π³ΠΎ Π½Π΅Ρ‚ Π² Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ;
- Π‘Π΅ΠΊΠ΅Π½Π΄Π΅Ρ€ просит большС Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΊΠ°ΠΊΠΎΠΉ-Ρ‚ΠΎ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ Π² endpoint'Π΅;
- НС Π²Π°Π»ΠΈΠ΄Π½ΠΎΠ΅ OpenAPI (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, использовали Π½Π΅ ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΉ Ρ‚ΠΈΠΏ int);
- НуТно ΠΎΡΡ‚Π°Π²ΠΈΡ‚ΡŒ знания ΠΏΠΎ ΠΌΠΎΠ΄ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΠΈ (ΠΊΠΎΠ»Π»Π΅Π³Π΅ Π²Π°ΠΆΠ½ΠΎ Π·Π½Π°Ρ‚ΡŒ ΠΏΠΎΡ‡Π΅ΠΌΡƒ ΠΊΠ°ΠΊΠΎΠ΅-Ρ‚ΠΎ ΠΏΠΎΠ»Π΅ Π·Π°Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Π½ΠΎ);
- НуТно Π½Π°Π±Π»ΡŽΠ΄Π°Ρ‚ΡŒ Π·Π° измСнСниями API ΠΈ воврСмя ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΊΠΎΠ½Ρ„ΠΈΠ³ (ΡƒΠ±Ρ€Π°Π»ΠΈ использованиС Ρ€ΡƒΡ‡ΠΊΠΈ);
- Π£Π±ΠΈΡ€Π°Ρ‚ΡŒ deprecated поля ΠΈΠ· openapi (Ρ‡Ρ‚ΠΎΠ±Ρ‹ воврСмя Π·Π°ΠΌΠ΅Ρ‡Π°Ρ‚ΡŒ возмоТности api ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π±ΡƒΠ΄ΡƒΡ‚ ΡƒΠ΄Π°Π»Π΅Π½Ρ‹);

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

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

НапримСр ΠΈΠΌΠ΅Π΅ΠΌ [Π²Ρ…ΠΎΠ΄Π½ΠΎΠΉ Ρ„Π°ΠΉΠ» спСцификации/Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ api](./examples/example-cli-generate-api-types/input/openapi.yaml) ΠΎΡ‚ Π±Π΅ΠΊΠ΅Π½Π΄ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΎΠ². НапримСр, [скачСн Ρ‡Π΅Ρ€Π΅Π· curl cli ΠΈΠ· github](./examples/example-cli-generate-api-types/package.json#L11).

ПишСм [Ρ„Π°ΠΉΠ» ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ](./examples/example-cli-generate-api-types/openapi-modifier.config.ts), ΠΎΠΏΠΈΡΡ‹Π²Π°ΡŽΡ‰ΠΈΠΉ всС Ρ‡Ρ‚ΠΎ Π½ΡƒΠΆΠ½ΠΎ ΠΏΠΎΠΌΠ΅Π½ΡΡ‚ΡŒ Π² исходной спСцификации/Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ с ΠΏΠΎΡΡΠ½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌΠΈ коммСнтариями:

```ts
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](./examples/example-cli-generate-api-types/package.json#L7), измСняСм исходный Ρ„Π°ΠΉΠ» спСцификации/Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ ΠΈ получаСтся [модифицированная спСцификация/докумСнтация](./examples/example-cli-generate-api-types/output/openapi.yaml).

Π”Π°Π»Π΅Π΅ ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ, ΠΊ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρƒ cli [dtsgenerator](https://github.com/horiuchi/dtsgenerator), Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΠ΅ΠΌ ΠΈΠ· ΠΌΠΎΠ΄ΠΈΡ„ΠΈΡ†ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠΉ спСцификации/Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈ [Ρ„Π°ΠΉΠ» Ρ‚ΠΈΠΏΠΈΠ·Π°Ρ†ΠΈΠΈ для api](./examples/example-cli-generate-api-types/output/generated-api-types.d.ts), ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ ΡƒΠΆΠ΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ Π² ΠΊΠΎΠ΄Π΅ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°.

[ΠŸΠΎΠ»Π½Ρ‹ΠΉ ΠΊΠΎΠ΄ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°](./examples/example-cli-generate-api-types)

## Установка

```bash
npm install --save-dev openapi-modifier
```

## ИспользованиС

### CLI Ρ‡Π΅Ρ€Π΅Π· NPX

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

[ΠŸΡ€ΠΈΠΌΠ΅Ρ€ использования ΠΊΠ°ΠΊ CLI Ρ‡Π΅Ρ€Π΅Π· NPX](./examples/example-cli-simple-npx/package.json#L6)

CLI ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹:

| ΠžΠΏΡ†ΠΈΡ | ОписаниС | ΠŸΡ€ΠΈΠΌΠ΅Ρ€ | Π”Π΅Ρ„ΠΎΠ»Ρ‚Π½ΠΎΠ΅ |
| -------- | -------------------------------------------------------------------------------------------------------- | ---------------------------- |----------------------------------------------|
| `input` | [**ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ**] Π²Ρ…ΠΎΠ΄Π½ΠΎΠΉ Ρ„Π°ΠΉΠ», спСцифиакция/докумСнтация Π² Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π΅ openapi | `input/openapi.yml` | |
| `output` | [**ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ**] Π²Ρ‹Ρ…ΠΎΠ΄Π½ΠΎΠΉ Ρ„Π°ΠΉΠ», спСцифиакция/докумСнтация Π² Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π΅ opeanpi | `output/openapi.yml` | |
| `config` | ΠΏΡƒΡ‚ΡŒ Π΄ΠΎ Ρ„Π°ΠΉΠ»Π° ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ. Π”Π΅Ρ‚Π°Π»ΡŒΠ½ΠΎΠ΅ описаниС ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ [см. Π½ΠΈΠΆΠ΅](#custom_anchor_config_parameters) | `openapi-modifier.config.js` | `openapi-modifier.config.(js\ts\json\yaml\yml)` |

ΠŸΠΎΠ΄Ρ€ΠΎΠ±Π½Π΅Π΅ ΠΏΡ€ΠΎ Ρ„Π°ΠΉΠ» ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ [см. Π½ΠΈΠΆΠ΅](#custom_anchor_config_parameters)

Если ΠΏΡƒΡ‚ΡŒ Π΄ΠΎ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ Π½Π΅ ΡƒΠΊΠ°Π·Π°Π½, ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ ΠΏΠΎ-ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ бСрСтся ΠΈΠ· Ρ„Π°ΠΉΠ»Π° `openapi-modifier.config.js` ΠΎΡ‚Π½ΠΎΡΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΠΈ запуска.

МоТно ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΠΈ Π² слСд. Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΡΡ…: `.ts`, `.js`, `.yaml`, `.yml`, `.json`.

### CLI

```shell
npm i --save-dev openapi-modifier

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

[ΠŸΡ€ΠΈΠΌΠ΅Ρ€ использования ΠΊΠ°ΠΊ CLI](./examples/example-cli-openapi-yaml/package.json#L7)

CLI ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹:

| ΠžΠΏΡ†ΠΈΡ | ОписаниС | ΠŸΡ€ΠΈΠΌΠ΅Ρ€ | Π”Π΅Ρ„ΠΎΠ»Ρ‚Π½ΠΎΠ΅ |
| -------- | -------------------------------------------------------------------------------------------------------- | ---------------------------- |----------------------------------------------|
| `input` | [**ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ**] Π²Ρ…ΠΎΠ΄Π½ΠΎΠΉ Ρ„Π°ΠΉΠ», спСцифиакция/докумСнтация Π² Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π΅ openapi | `input/openapi.yml` | |
| `output` | [**ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ**] Π²Ρ‹Ρ…ΠΎΠ΄Π½ΠΎΠΉ Ρ„Π°ΠΉΠ», спСцифиакция/докумСнтация Π² Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π΅ opeanpi | `output/openapi.yml` | |
| `config` | ΠΏΡƒΡ‚ΡŒ Π΄ΠΎ Ρ„Π°ΠΉΠ»Π° ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ. Π”Π΅Ρ‚Π°Π»ΡŒΠ½ΠΎΠ΅ описаниС ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ [см. Π½ΠΈΠΆΠ΅](#custom_anchor_config_parameters) | `openapi-modifier.config.js` | `openapi-modifier.config.(js\ts\json\yaml\yml)` |

ΠŸΠΎΠ΄Ρ€ΠΎΠ±Π½Π΅Π΅ ΠΏΡ€ΠΎ Ρ„Π°ΠΉΠ» ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ [см. Π½ΠΈΠΆΠ΅](#custom_anchor_config_parameters)

Если ΠΏΡƒΡ‚ΡŒ Π΄ΠΎ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ Π½Π΅ ΡƒΠΊΠ°Π·Π°Π½, ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ ΠΏΠΎ-ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ бСрСтся ΠΈΠ· Ρ„Π°ΠΉΠ»Π° `openapi-modifier.config.js` ΠΎΡ‚Π½ΠΎΡΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΠΈ запуска.

МоТно ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΠΈ Π² слСд. Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΡΡ…: `.ts`, `.js`, `.yaml`, `.yml`, `.json`.

### ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎΠ΅ использованиС

```typescript
import { openapiModifier } from 'openapi-modifier';

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

process.exit(0);
} catch (error) {
console.error(error);
process.exit(1);
}
})();
```

[ΠŸΡ€ΠΈΠΌΠ΅Ρ€ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎΠ³ΠΎ использования](./examples/example-package-openapi-yaml/generate.ts)

## ΠšΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡ

Π‘ΠΎΠ·Π΄Π°ΠΉΡ‚Π΅ Ρ„Π°ΠΉΠ» ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, `openapi-modifier.config.js` ΠΈΠ»ΠΈ `openapi-modifier.config.ts`) со ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΉ структурой:

```javascript
module.exports = {
// (ΠΎΠΏΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎ) Настройки Π»ΠΎΠ³Π³Π΅Ρ€Π°
logger: {
verbose: true, // Π’ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½ΠΎΠ΅ Π»ΠΎΠ³ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅
minLevel: 0 // ΠœΠΈΠ½ΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΉ ΡƒΡ€ΠΎΠ²Π΅Π½ΡŒ логирования: 0 - trace, 1 - debug, 2 - info, 3 - warn, 4 - error
},
// ΠŸΡƒΡ‚ΡŒ ΠΊ Π²Ρ…ΠΎΠ΄Π½ΠΎΠΌΡƒ Ρ„Π°ΠΉΠ»Ρƒ OpenAPI спСцификации
input: './openapi.yaml',
// ΠŸΡƒΡ‚ΡŒ ΠΊ Π²Ρ‹Ρ…ΠΎΠ΄Π½ΠΎΠΌΡƒ Ρ„Π°ΠΉΠ»Ρƒ
output: './modified-openapi.yaml',
// ΠšΠΎΠ½Π²Π΅ΠΉΠ΅Ρ€ ΠΏΡ€Π°Π²ΠΈΠ» для примСнСния (см. Π΄Π°Π»Π΅Π΅ всС доступныС ΠΏΡ€Π°Π²ΠΈΠ»Π° с ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°ΠΌΠΈ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΉ)
pipeline: [
{
rule: "change-content-type",
disabled: false, // (ΠΎΠΏΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎ) ΠžΡ‚ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ
config: {
map: {
"*/*": "application/json"
}
}
}
// Π”Ρ€ΡƒΠ³ΠΈΠ΅ ΠΏΡ€Π°Π²ΠΈΠ»Π°...
]
}
```

> [!IMPORTANT]
> Благодаря Ρ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ ΠΏΡ€Π°Π²ΠΈΠ»Π° Π²Ρ‹ΡΡ‚Ρ€Π°ΠΈΠ²Π°ΡŽΡ‚ΡΡ Π² ΠΊΠΎΠ½Π²Π΅ΠΉΠ΅Ρ€, Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅:
> - Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ этапом Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅Π³ΠΎ этапа, Ρ‚Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ выстраивая ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹Ρ… ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ;
> - ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΡ€Π°Π²ΠΈΠ»Π° Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎΠ΅ число Ρ€Π°Π· ΠΈ Π² Π½ΡƒΠΆΠ½ΠΎΠΉ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ;

## ДоступныС ΠΏΡ€Π°Π²ΠΈΠ»Π°

| ΠŸΡ€Π°Π²ΠΈΠ»ΠΎ | ΠšΡ€Π°Ρ‚ΠΊΠΎΠ΅ описаниС |
|------------------------------------------------------------------| ---- |
| [change-content-type](./src/rules/change-content-type/README-ru.md) | Π˜Π·ΠΌΠ΅Π½ΡΠ΅Ρ‚ Ρ‚ΠΈΠΏΡ‹ ΠΊΠΎΠ½Ρ‚Π΅Π½Ρ‚Π° (content-type) Π² OpenAPI спСцификации Π² соотвСтствии со словарСм Π·Π°ΠΌΠ΅Π½ |
| [change-endpoints-basepath](./src/rules/change-endpoints-basepath/README-ru.md) | Π˜Π·ΠΌΠ΅Π½ΡΠ΅Ρ‚ Π±Π°Π·ΠΎΠ²Ρ‹Π΅ ΠΏΡƒΡ‚ΠΈ (basepath) эндпоинтов Π² соотвСтствии со словарСм Π·Π°ΠΌΠ΅Π½ |
| [filter-by-content-type](./src/rules/filter-by-content-type/README-ru.md) | ΠŸΡ€Π°Π²ΠΈΠ»ΠΎ позволяСт Ρ„ΠΈΠ»ΡŒΡ‚Ρ€ΠΎΠ²Π°Ρ‚ΡŒ Ρ‚ΠΈΠΏΡ‹ содСрТимого (content-type) Π² OpenAPI спСцификации. Π‘ Π΅Π³ΠΎ ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΌΠΎΠΆΠ½ΠΎ явно ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ, ΠΊΠ°ΠΊΠΈΠ΅ Ρ‚ΠΈΠΏΡ‹ содСрТимого Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π±Ρ‹Ρ‚ΡŒ сохранСны ΠΈΠ»ΠΈ ΡƒΠ΄Π°Π»Π΅Π½Ρ‹ ΠΈΠ· спСцификации. ΠŸΡ€Π°Π²ΠΈΠ»ΠΎ примСняСтся ΠΊΠΎ всСм ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π°ΠΌ API, Π²ΠΊΠ»ΡŽΡ‡Π°Ρ запросы, ΠΎΡ‚Π²Π΅Ρ‚Ρ‹ ΠΈ ΠΎΠ±Ρ‰ΠΈΠ΅ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρ‹. |
| [filter-endpoints](./src/rules/filter-endpoints/README-ru.md) | ΠŸΡ€Π°Π²ΠΈΠ»ΠΎ позволяСт Ρ„ΠΈΠ»ΡŒΡ‚Ρ€ΠΎΠ²Π°Ρ‚ΡŒ эндпоинты Π² OpenAPI спСцификации Π½Π° основС ΠΈΡ… ΠΏΡƒΡ‚Π΅ΠΉ ΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ². Π‘ Π΅Π³ΠΎ ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΌΠΎΠΆΠ½ΠΎ явно ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ, ΠΊΠ°ΠΊΠΈΠ΅ эндпоинты Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π±Ρ‹Ρ‚ΡŒ сохранСны ΠΈΠ»ΠΈ ΡƒΠ΄Π°Π»Π΅Π½Ρ‹ ΠΈΠ· спСцификации. ΠŸΡ€Π°Π²ΠΈΠ»ΠΎ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ ΠΊΠ°ΠΊ Ρ‚ΠΎΡ‡Π½ΠΎΠ΅ соотвСтствиС, Ρ‚Π°ΠΊ ΠΈ Ρ„ΠΈΠ»ΡŒΡ‚Ρ€Π°Ρ†ΠΈΡŽ ΠΏΠΎ рСгулярным выраТСниям. |
| [merge-openapi-spec](./src/rules/merge-openapi-spec/README-ru.md) | ΠžΠ±ΡŠΠ΅Π΄ΠΈΠ½ΡΠ΅Ρ‚ Π΄Π²Π° OpenAPI спСцификации Π² ΠΎΠ΄Π½Ρƒ. ΠŸΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ‚ ΠΎΠ±ΡŠΠ΅Π΄ΠΈΠ½ΠΈΡ‚ΡŒ Ρ‚Π΅ΠΊΡƒΡ‰ΡƒΡŽ ΡΠΏΠ΅Ρ†ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΡŽ с Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠΉ спСцификациСй ΠΈΠ· ΡƒΠΊΠ°Π·Π°Π½Π½ΠΎΠ³ΠΎ Ρ„Π°ΠΉΠ»Π°. ΠŸΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ Ρ€Π°Π±ΠΎΡ‚Ρƒ с Ρ„Π°ΠΉΠ»Π°ΠΌΠΈ Π² Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π°Ρ… JSON ΠΈ YAML. |
| [patch-component-schema](./src/rules/patch-component-schema/README-ru.md) | ΠŸΡ€Π°Π²ΠΈΠ»ΠΎ позволяСт ΠΌΠΎΠ΄ΠΈΡ„ΠΈΡ†ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ схСму ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π° Π² OpenAPI спСцификации. |
| [patch-endpoint-parameter-schema](./src/rules/patch-endpoint-parameter-schema/README-ru.md) | ΠŸΡ€Π°Π²ΠΈΠ»ΠΎ позволяСт ΠΌΠΎΠ΄ΠΈΡ„ΠΈΡ†ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ схСму ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² эндпоинтов Π² OpenAPI спСцификации. |
| [patch-endpoint-request-body-schema](./src/rules/patch-endpoint-request-body-schema/README-ru.md) | ΠŸΡ€Π°Π²ΠΈΠ»ΠΎ для измСнСния схСмы request body Π² OpenAPI спСцификации. ΠŸΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ‚ ΠΌΠΎΠ΄ΠΈΡ„ΠΈΡ†ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ схСму запроса для ΡƒΠΊΠ°Π·Π°Π½Π½ΠΎΠ³ΠΎ эндпоинта. |
| [patch-endpoint-response-schema](./src/rules/patch-endpoint-response-schema/README-ru.md) | ΠŸΡ€Π°Π²ΠΈΠ»ΠΎ позволяСт ΠΌΠΎΠ΄ΠΈΡ„ΠΈΡ†ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ схСму ΠΎΡ‚Π²Π΅Ρ‚Π° (response schema) для эндпоинтов Π² OpenAPI спСцификации. |
| [patch-endpoint-schema](./src/rules/patch-endpoint-schema/README-ru.md) | ΠŸΡ€Π°Π²ΠΈΠ»ΠΎ позволяСт ΠΌΠΎΠ΄ΠΈΡ„ΠΈΡ†ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ схСму эндпоинта Ρ†Π΅Π»ΠΈΠΊΠΎΠΌ Π² OpenAPI спСцификации. Π’ ΠΎΡ‚Π»ΠΈΡ‡ΠΈΠ΅ ΠΎΡ‚ Π΄Ρ€ΡƒΠ³ΠΈΡ… ΠΏΡ€Π°Π²ΠΈΠ» ΠΏΠ°Ρ‚Ρ‡ΠΈΠ½Π³Π°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‚ с ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹ΠΌΠΈ частями эндпоинта (ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹, Ρ‚Π΅Π»ΠΎ запроса, ΠΎΡ‚Π²Π΅Ρ‚Ρ‹), это ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΠ·ΠΌΠ΅Π½ΡΡ‚ΡŒ всю структуру эндпоинта, Π²ΠΊΠ»ΡŽΡ‡Π°Ρ всС Π΅Π³ΠΎ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρ‹. |
| [remove-deprecated](./src/rules/remove-deprecated/README-ru.md) | ΠŸΡ€Π°Π²ΠΈΠ»ΠΎ позволяСт ΡƒΠ΄Π°Π»ΠΈΡ‚ΡŒ ΡƒΡΡ‚Π°Ρ€Π΅Π²ΡˆΠΈΠ΅ (deprecated) элСмСнты ΠΈΠ· OpenAPI спСцификации. Оно ΠΌΠΎΠΆΠ΅Ρ‚ ΡƒΠ΄Π°Π»ΡΡ‚ΡŒ ΡƒΡΡ‚Π°Ρ€Π΅Π²ΡˆΠΈΠ΅ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρ‹, эндпоинты, ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ ΠΈ свойства, ΠΏΡ€ΠΈ этом прСдоставляя Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΠΈΠ³Π½ΠΎΡ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹Π΅ элСмСнты ΠΈ ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Ρ‚ΡŒ описания удаляСмых элСмСнтов. |
| [remove-max-items](./src/rules/remove-max-items/README-ru.md) | УдаляСт свойство `maxItems` ΠΈΠ· всСх схСм Π² OpenAPI спСцификации. |
| [remove-min-items](./src/rules/remove-min-items/README-ru.md) | УдаляСт свойство `minItems` ΠΈΠ· всСх схСм Π² OpenAPI спСцификации. |
| [remove-operation-id](./src/rules/remove-operation-id/README-ru.md) | УдаляСт operationId ΠΈΠ· всСх ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ Π² OpenAPI спСцификации, ΠΊΡ€ΠΎΠΌΠ΅ Ρ‚Π΅Ρ…, Ρ‡Ρ‚ΠΎ ΡƒΠΊΠ°Π·Π°Π½Ρ‹ Π² спискС игнорирования |
| [remove-parameter](./src/rules/remove-parameter/README-ru.md) | УдаляСт ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ ΠΈΠ· эндпоинта Π² OpenAPI спСцификации |
| [remove-unused-components](./src/rules/remove-unused-components/README-ru.md) | УдаляСт Π½Π΅ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Π΅ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρ‹ ΠΈΠ· OpenAPI спСцификации. ΠŸΡ€Π°Π²ΠΈΠ»ΠΎ Π°Π½Π°Π»ΠΈΠ·ΠΈΡ€ΡƒΠ΅Ρ‚ всС ссылки Π½Π° ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρ‹ Π² Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π΅ ΠΈ удаляСт Ρ‚Π΅, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½ΠΈΠ³Π΄Π΅ Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ. |

## ΠšΡ€Π°Ρ‚ΠΊΠΈΠ΅ описания ΠΏΡ€Π°Π²ΠΈΠ»

### change-content-type

Π˜Π·ΠΌΠ΅Π½ΡΠ΅Ρ‚ Ρ‚ΠΈΠΏΡ‹ ΠΊΠΎΠ½Ρ‚Π΅Π½Ρ‚Π° (content-type) Π² OpenAPI спСцификации Π² соотвСтствии со словарСм Π·Π°ΠΌΠ΅Π½

#### Config

| ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ | ОписаниС | ΠŸΡ€ΠΈΠΌΠ΅Ρ€ | Випизация | Π”Π΅Ρ„ΠΎΠ»Ρ‚Π½ΠΎΠ΅ |
|----------|-----------------------------------|----------------------------|------------------------|-----------|
| `map` | [**ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ**] Π‘Π»ΠΎΠ²Π°Ρ€ΡŒ Π·Π°ΠΌΠ΅Π½Ρ‹ Ρ‚ΠΈΠΏΠΎΠ² ΠΊΠΎΠ½Ρ‚Π΅Π½Ρ‚Π° | `{"*/*": "application/json"}` | `Record` | `{}` |

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ:

```js
module.exports = {
pipeline: [
// ... other rules
{
rule: "change-content-type",
config: {
map: {
"*/*": "application/json" // замСняСм всС Ρ‚ΠΈΠΏΡ‹ ΠΊΠΎΠ½Ρ‚Π΅Π½Ρ‚Π° Π½Π° application/json
}
},
}
// ... other rules
]
}
```

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ Π±ΠΎΠ»Π΅Π΅ Π΄Π΅Ρ‚Π°Π»ΡŒΠ½ΠΎΠΉ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ:

```js
module.exports = {
pipeline: [
// ... other rules
{
rule: "change-content-type",
config: {
map: {
"application/xml": "application/json", // замСняСм application/xml на application/json
"text/plain": "application/json", // замСняСм text/plain на application/json
"*/*": "application/json" // замСняСм всС ΠΎΡΡ‚Π°Π»ΡŒΠ½Ρ‹Π΅ Ρ‚ΠΈΠΏΡ‹ ΠΊΠΎΠ½Ρ‚Π΅Π½Ρ‚Π° Π½Π° application/json
}
},
}
// ... other rules
]
}
```

[ΠŸΠΎΠ΄Ρ€Π±ΠΎΠ½Π΅Π΅ ΠΏΡ€ΠΎ ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ change-content-type](./src/rules/change-content-type/README-ru.md)

----------------------

### change-endpoints-basepath

Π˜Π·ΠΌΠ΅Π½ΡΠ΅Ρ‚ Π±Π°Π·ΠΎΠ²Ρ‹Π΅ ΠΏΡƒΡ‚ΠΈ (basepath) эндпоинтов Π² соотвСтствии со словарСм Π·Π°ΠΌΠ΅Π½

#### Config

| ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ | ОписаниС | ΠŸΡ€ΠΈΠΌΠ΅Ρ€ | Випизация | Π”Π΅Ρ„ΠΎΠ»Ρ‚Π½ΠΎΠ΅ |
|-----------------------------|-----------------------------------------------------------------------|----------------------|--------------------------|-----------|
| `map` | [**ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ**] Π‘Π»ΠΎΠ²Π°Ρ€ΡŒ Π·Π°ΠΌΠ΅Π½Ρ‹ ΠΏΡƒΡ‚Π΅ΠΉ | `{"/api/v1": "/v1"}` | `Record` | `{}` |
| `ignoreOperationCollisions` | Π˜Π³Π½ΠΎΡ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π²ΠΎΠ·Π½ΠΈΠΊΠ°ΡŽΡ‰ΠΈΠ΅ ΠΊΠΎΠ»Π»ΠΈΠ·ΠΈΠΈ endpoint'ΠΎΠ² послС примСнСния Π·Π°ΠΌΠ΅Π½Ρ‹ | `true` | `boolean` | `false` |

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ:

```js
module.exports = {
pipeline: [
// ... other rules
{
rule: "change-endpoints-basepath",
config: {
map: {
'/public/api': '', // удаляСм прСфикс /public/api ΠΈΠ· всСх ΠΏΡƒΡ‚Π΅ΠΉ
},
},
}
// ... other rules
]
}
```

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ Π±ΠΎΠ»Π΅Π΅ Π΄Π΅Ρ‚Π°Π»ΡŒΠ½ΠΎΠΉ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ:

```js
module.exports = {
pipeline: [
// ... other rules
{
rule: "change-endpoints-basepath",
config: {
map: {
'/public/v1/service/api': '/api', // замСняСм прСфикс /public/v1/service/api Π½Π° /api
},
ignoreOperationCollisions: false, // Π½Π΅ ΠΈΠ³Π½ΠΎΡ€ΠΈΡ€ΡƒΠ΅ΠΌ ΠΊΠΎΠ½Ρ„Π»ΠΈΠΊΡ‚Ρ‹ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ ΠΏΡ€ΠΈ Π·Π°ΠΌΠ΅Π½Π΅ ΠΏΡƒΡ‚Π΅ΠΉ
},
}
// ... other rules
]
}
```

[ΠŸΠΎΠ΄Ρ€Π±ΠΎΠ½Π΅Π΅ ΠΏΡ€ΠΎ ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ change-endpoints-basepath](./src/rules/change-endpoints-basepath/README-ru.md)

----------------------

### filter-by-content-type

ΠŸΡ€Π°Π²ΠΈΠ»ΠΎ позволяСт Ρ„ΠΈΠ»ΡŒΡ‚Ρ€ΠΎΠ²Π°Ρ‚ΡŒ Ρ‚ΠΈΠΏΡ‹ содСрТимого (content-type) Π² OpenAPI спСцификации. Π‘ Π΅Π³ΠΎ ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΌΠΎΠΆΠ½ΠΎ явно ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ, ΠΊΠ°ΠΊΠΈΠ΅ Ρ‚ΠΈΠΏΡ‹ содСрТимого Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π±Ρ‹Ρ‚ΡŒ сохранСны ΠΈΠ»ΠΈ ΡƒΠ΄Π°Π»Π΅Π½Ρ‹ ΠΈΠ· спСцификации. ΠŸΡ€Π°Π²ΠΈΠ»ΠΎ примСняСтся ΠΊΠΎ всСм ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π°ΠΌ API, Π²ΠΊΠ»ΡŽΡ‡Π°Ρ запросы, ΠΎΡ‚Π²Π΅Ρ‚Ρ‹ ΠΈ ΠΎΠ±Ρ‰ΠΈΠ΅ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρ‹.

#### Config

| ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ | ОписаниС | ΠŸΡ€ΠΈΠΌΠ΅Ρ€ | Випизация | Π”Π΅Ρ„ΠΎΠ»Ρ‚Π½ΠΎΠ΅ |
|------------|------------------------------------------------------|------------------------|-----------------|--------|
| `enabled` | [**ΠΎΠΏΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½Ρ‹ΠΉ**] Бписок Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½Π½Ρ‹Ρ… content-type. Если Π½Π΅ ΡƒΠΊΠ°Π·Π°Π½, ΡΠΎΡ…Ρ€Π°Π½ΡΡŽΡ‚ΡΡ всС Ρ‚ΠΈΠΏΡ‹, Π½Π΅ ΡƒΠΊΠ°Π·Π°Π½Π½Ρ‹Π΅ Π² `disabled` | `['application/json']` | `Array` | |
| `disabled` | [**ΠΎΠΏΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½Ρ‹ΠΉ**] Бписок Π·Π°ΠΏΡ€Π΅Ρ‰Π΅Π½Π½Ρ‹Ρ… content-type | `['multipart/form-data']` | `Array` | |

ΠŸΡ€ΠΈΠΌΠ΅Ρ€Ρ‹ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΉ:

```js
module.exports = {
pipeline: [
// ... other rules
{
rule: "filter-by-content-type",
config: {
enabled: ['application/json'], // ΠΎΡΡ‚Π°Π²ΠΈΡ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ content-type application/json, ΡƒΠ΄Π°Π»ΠΈΡ‚ΡŒ всС ΠΎΡΡ‚Π°Π»ΡŒΠ½Ρ‹Π΅
}
}
// ... other rules
]
}
```

ΠΈΠ»ΠΈ

```js
module.exports = {
pipeline: [
// ... other rules
{
rule: "filter-by-content-type",
config: {
disabled: ['multipart/form-data'], // ΡƒΠ΄Π°Π»ΠΈΡ‚ΡŒ content-type multipart/form-data, ΠΎΡΡ‚Π°Π²ΠΈΡ‚ΡŒ всС ΠΎΡΡ‚Π°Π»ΡŒΠ½Ρ‹Π΅
}
}
// ... other rules
]
}
```

> [!IMPORTANT]
> 1. Если ΡƒΠΊΠ°Π·Π°Π½Ρ‹ ΠΎΠ±Π° ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° `enabled` ΠΈ `disabled`, сначала примСняСтся Ρ„ΠΈΠ»ΡŒΡ‚Ρ€ `enabled`, Π·Π°Ρ‚Π΅ΠΌ `disabled`
> 2. ΠŸΡ€Π°Π²ΠΈΠ»ΠΎ Π²Ρ‹Π²ΠΎΠ΄ΠΈΡ‚ прСдупрСТдСния для content-type, ΡƒΠΊΠ°Π·Π°Π½Π½Ρ‹Ρ… Π² ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ, Π½ΠΎ Π½Π΅ Π½Π°ΠΉΠ΄Π΅Π½Π½Ρ‹Ρ… Π² спСцификации

[ΠŸΠΎΠ΄Ρ€Π±ΠΎΠ½Π΅Π΅ ΠΏΡ€ΠΎ ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ filter-by-content-type](./src/rules/filter-by-content-type/README-ru.md)

----------------------

### filter-endpoints

ΠŸΡ€Π°Π²ΠΈΠ»ΠΎ позволяСт Ρ„ΠΈΠ»ΡŒΡ‚Ρ€ΠΎΠ²Π°Ρ‚ΡŒ эндпоинты Π² OpenAPI спСцификации Π½Π° основС ΠΈΡ… ΠΏΡƒΡ‚Π΅ΠΉ ΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ². Π‘ Π΅Π³ΠΎ ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΌΠΎΠΆΠ½ΠΎ явно ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ, ΠΊΠ°ΠΊΠΈΠ΅ эндпоинты Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π±Ρ‹Ρ‚ΡŒ сохранСны ΠΈΠ»ΠΈ ΡƒΠ΄Π°Π»Π΅Π½Ρ‹ ΠΈΠ· спСцификации. ΠŸΡ€Π°Π²ΠΈΠ»ΠΎ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ ΠΊΠ°ΠΊ Ρ‚ΠΎΡ‡Π½ΠΎΠ΅ соотвСтствиС, Ρ‚Π°ΠΊ ΠΈ Ρ„ΠΈΠ»ΡŒΡ‚Ρ€Π°Ρ†ΠΈΡŽ ΠΏΠΎ рСгулярным выраТСниям.

#### Config

> [!IMPORTANT]
> ΠŸΡ€Π°Π²ΠΈΠ»ΠΎ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Π»ΠΈΠ±ΠΎ Π² Ρ€Π΅ΠΆΠΈΠΌΠ΅ enabled - Ρ„ΠΈΠ»ΡŒΡ‚Ρ€Π°Ρ†ΠΈΠΈ endpoint'ΠΎΠ² ΠΈΠ· спСцификации (ΠΊΠΎΠ³Π΄Π° ΡƒΠΊΠ°Π·Π°Π½ Π² ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ Π»ΠΈΠ±ΠΎ `enabled`, Π»ΠΈΠ±ΠΎ `enabledPathRegExp`), Π»ΠΈΠ±ΠΎ Π² disabled - ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ endpoint'ΠΎΠ² ΠΈΠ· спСцификации (ΠΊΠΎΠ³Π΄Π° ΡƒΠΊΠ°Π·Π°Π½ Π² ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ Π»ΠΈΠ±ΠΎ `disabled`, Π»ΠΈΠ±ΠΎ `disabledPathRegExp`)

| ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ | ОписаниС | ΠŸΡ€ΠΈΠΌΠ΅Ρ€ | Випизация | Π”Π΅Ρ„ΠΎΠ»Ρ‚Π½ΠΎΠ΅ |
|-------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|-----------------------|-----------------|-----------------|
| `enabled` | Бписок эндпоинтов, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½ΡƒΠΆΠ½ΠΎ ΠΎΡΡ‚Π°Π²ΠΈΡ‚ΡŒ | `[{"method": "GET", "path": "/pets"}]` | `Array` | - |
| `enabledPathRegExp` | Бписок рСгулярных Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ для ΠΏΡƒΡ‚Π΅ΠΉ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½ΡƒΠΆΠ½ΠΎ ΠΎΡΡ‚Π°Π²ΠΈΡ‚ΡŒ | `[/^\/api\/v1/]` | `Array` | - |
| `disabled` | Бписок эндпоинтов, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½ΡƒΠΆΠ½ΠΎ ΠΈΡΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ | `[{"method": "POST", "path": "/pets"}]` | `Array` | - |
| `disabledPathRegExp` | Бписок рСгулярных Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ для ΠΏΡƒΡ‚Π΅ΠΉ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½ΡƒΠΆΠ½ΠΎ ΠΈΡΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ | `[/^\/internal/]` | `Array` | - |
| `printIgnoredEndpoints` | Π’Ρ‹Π²ΠΎΠ΄ΠΈΡ‚ΡŒ Π»ΠΈ Π² Π»ΠΎΠ³ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΎΠ± ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½Π½Ρ‹Ρ… эндпоинтах | `true` | `boolean` | `false` |

ΠŸΡ€ΠΈΠΌΠ΅Ρ€Ρ‹ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΉ:

```js
module.exports = {
pipeline: [
// ... other rules
{
rule: "filter-endpoints",
config: {
enabled: [
'GET /foo/ping' // оставляСм Ρ‚ΠΎΠ»ΡŒΠΊΠΎ эндпоинт GET /foo/ping, всС ΠΎΡΡ‚Π°Π»ΡŒΠ½Ρ‹Π΅ Π±ΡƒΠ΄ΡƒΡ‚ ΡƒΠ΄Π°Π»Π΅Π½Ρ‹
],
},
}
// ... other rules
]
}
```

ΠΈΠ»ΠΈ

```js
module.exports = {
pipeline: [
// ... other rules
{
rule: "filter-endpoints",
config: {
enabledPathRegExp: [
/\/public/ // оставляСм всС эндпоинты, ΠΏΡƒΡ‚ΡŒ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… содСрТит /public
],
},
}
// ... other rules
]
}
```

ΠΈΠ»ΠΈ

```js
module.exports = {
pipeline: [
// ... other rules
{
rule: "filter-endpoints",
config: {
disabled: [
'GET /foo/ping' // удаляСм эндпоинт GET /foo/ping, всС ΠΎΡΡ‚Π°Π»ΡŒΠ½Ρ‹Π΅ ΠΎΡΡ‚Π°ΡŽΡ‚ΡΡ
],
},
}
// ... other rules
]
}
```

ΠΈΠ»ΠΈ

```js
module.exports = {
pipeline: [
// ... other rules
{
rule: "filter-endpoints",
config: {
disabledPathRegExp: [
/\/internal/ // удаляСм всС эндпоинты, ΠΏΡƒΡ‚ΡŒ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… содСрТит /internal
],
printIgnoredEndpoints: true, // Π²Ρ‹Π²ΠΎΠ΄ΠΈΠΌ Π² консоль ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΎΠ± ΡƒΠ΄Π°Π»Π΅Π½Π½Ρ‹Ρ… эндпоинтах
},
}
// ... other rules
]
}
```

[ΠŸΠΎΠ΄Ρ€Π±ΠΎΠ½Π΅Π΅ ΠΏΡ€ΠΎ ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ filter-endpoints](./src/rules/filter-endpoints/README-ru.md)

----------------------

### merge-openapi-spec

ΠžΠ±ΡŠΠ΅Π΄ΠΈΠ½ΡΠ΅Ρ‚ Π΄Π²Π° OpenAPI спСцификации Π² ΠΎΠ΄Π½Ρƒ. ΠŸΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ‚ ΠΎΠ±ΡŠΠ΅Π΄ΠΈΠ½ΠΈΡ‚ΡŒ Ρ‚Π΅ΠΊΡƒΡ‰ΡƒΡŽ ΡΠΏΠ΅Ρ†ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΡŽ с Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠΉ спСцификациСй ΠΈΠ· ΡƒΠΊΠ°Π·Π°Π½Π½ΠΎΠ³ΠΎ Ρ„Π°ΠΉΠ»Π°. ΠŸΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ Ρ€Π°Π±ΠΎΡ‚Ρƒ с Ρ„Π°ΠΉΠ»Π°ΠΌΠΈ Π² Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π°Ρ… JSON ΠΈ YAML.

#### Config

| ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ | ОписаниС | ΠŸΡ€ΠΈΠΌΠ΅Ρ€ | Випизация | Π”Π΅Ρ„ΠΎΠ»Ρ‚Π½ΠΎΠ΅ |
|-----------------------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|----------------------------------------------|----------|-----------|
| `path` | [**ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ**] ΠŸΡƒΡ‚ΡŒ Π΄ΠΎ OpenAPI ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΏΠΎΠ΄Π»ΠΈΡ‚ΡŒ Π² Ρ‚Π΅ΠΊΡƒΡ‰ΡƒΡŽ ΡΠΏΠ΅Ρ†ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΡŽ. ΠŸΡƒΡ‚ΡŒ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΎΡ‚Π½ΠΎΡΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ (ΠΎΡ‚Π½ΠΎΡΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ располоТСния package.json), Π»ΠΈΠ±ΠΎ Π°Π±ΡΠΎΠ»ΡŽΡ‚Π½Ρ‹ΠΉ (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π½Ρ‹ΠΉ Ρ‡Π΅Ρ€Π΅Π· `__dirname` ΠΎΡ‚Π½ΠΎΡΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ нахоТдСния ΠΊΠΎΠ½Ρ„ΠΈΠ³Π°). ΠŸΡ€ΠΈΠΌΠ΅Π½ΠΈΠΌΡ‹ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Ρ‹: `*.json`, `*.yml`, `*.yaml`. | `temp-openapi-specs/new-list-endpoints.yaml` | `string` | |
| `ignoreOperationCollisions` | ΠŸΡ€ΠΈ слиянии Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… спСцификаций ΠΌΠΎΠ³ΡƒΡ‚ ΠΏΡ€ΠΎΠΈΡΡ…ΠΎΠ΄ΠΈΡ‚ΡŒ ΠΊΠΎΠ½Ρ„Π»ΠΈΠΊΡ‚Ρ‹, ΠΊΠΎΠ³Π΄Π° Π΅ΡΡ‚ΡŒ ΠΈΠ½Π΄Π΅Π½Ρ‚ΠΈΡ‡Π½Ρ‹Π΅ endpoint'Ρ‹. По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ, инструмСнт Π·Π°ΠΏΡ€Π΅Ρ‰Π°Π΅Ρ‚ Π²Π»ΠΈΡ‚ΠΈΠ΅ Ссли находятся ΠΊΠΎΠ»Π»ΠΈΠ·ΠΈΠΈ, для прСдотвращСния Π½Π΅ ΠΏΡ€Π΅Π΄Π²ΠΈΠ΄Π΅Π½Π½Ρ‹Ρ… ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ Π² исходной спСцификации. Π”Π°Π½Π½ΠΎΠΉ настройкой ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€ΠΎΠΈΠ³Π½ΠΎΡ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΊΠΎΠ½Ρ„Π»ΠΈΠΊΡ‚Ρ‹ ΠΈ всС Ρ€Π°Π²Π½ΠΎ ΡΠ»ΠΈΡ‚ΡŒ спСцификации. | `true` | `boolean` | `false` |
| `ignoreComponentCollisions` | ΠŸΡ€ΠΈ слиянии Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… спСцификаций ΠΌΠΎΠ³ΡƒΡ‚ ΠΏΡ€ΠΎΠΈΡΡ…ΠΎΠ΄ΠΈΡ‚ΡŒ ΠΊΠΎΠ½Ρ„Π»ΠΈΠΊΡ‚Ρ‹, ΠΊΠΎΠ³Π΄Π° Π΅ΡΡ‚ΡŒ ΠΈΠ½Π΄Π΅Π½Ρ‚ΠΈΡ‡Π½Ρ‹Π΅ ΠΎΠ±Ρ‰ΠΈΠ΅ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρ‹ спСцификаций. По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ, инструмСнт Π·Π°ΠΏΡ€Π΅Ρ‰Π°Π΅Ρ‚ Π²Π»ΠΈΡ‚ΠΈΠ΅ Ссли ΠΊΠΎΠ»Π»ΠΈΠ·ΠΈΠΈ находятся, для прСдотвращСния Π½Π΅ ΠΏΡ€Π΅Π΄Π²ΠΈΠ΄Π΅Π½Π½Ρ‹Ρ… ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ Π² исходной спСцификации. Π”Π°Π½Π½ΠΎΠΉ настройкой ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€ΠΎΠΈΠ³Π½ΠΎΡ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΊΠΎΠ½Ρ„Π»ΠΈΠΊΡ‚Ρ‹ ΠΈ всС Ρ€Π°Π²Π½ΠΎ ΡΠ»ΠΈΡ‚ΡŒ спСцификации. | `true` | `boolean` | `false` |

> [!IMPORTANT]
> **Если Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΎΠ±ΡŠΠ΅Π΄ΠΈΠ½ΠΈΡ‚ΡŒ нСсколько спСцификаций**, Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ нСсколько Ρ€Π°Π· Π΄Π°Π½Π½ΠΎΠ΅ ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ Π² ΠΎΠ±Ρ‰Π΅ΠΌ ΠΏΠ°ΠΉΠ»Π°ΠΉΠ½Π΅ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€Ρ‹ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΉ:

```js
module.exports = {
pipeline: [
// ... other rules
{
rule: "merge-openapi-spec",
config: {
path: 'temp-openapi-specs/new-list-endpoints.yaml', // ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅ΠΌ ΠΏΡƒΡ‚ΡŒ ΠΊ Ρ„Π°ΠΉΠ»Ρƒ спСцификации для слияния
},
}
// ... other rules
]
}
```

ΠΈΠ»ΠΈ

```js
module.exports = {
pipeline: [
// ... other rules
{
rule: "merge-openapi-spec",
config: {
path: __dirname + '../temp-openapi-specs/new-list-endpoints.json', // ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅ΠΌ Π°Π±ΡΠΎΠ»ΡŽΡ‚Π½Ρ‹ΠΉ ΠΏΡƒΡ‚ΡŒ ΠΊ Ρ„Π°ΠΉΠ»Ρƒ спСцификации
ignoreOperationCollisions: true, // ΠΈΠ³Π½ΠΎΡ€ΠΈΡ€ΡƒΠ΅ΠΌ ΠΊΠΎΠ½Ρ„Π»ΠΈΠΊΡ‚Ρ‹ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ ΠΏΡ€ΠΈ слиянии
ignoreComponentCollisions: true, // ΠΈΠ³Π½ΠΎΡ€ΠΈΡ€ΡƒΠ΅ΠΌ ΠΊΠΎΠ½Ρ„Π»ΠΈΠΊΡ‚Ρ‹ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠ² ΠΏΡ€ΠΈ слиянии
},
}
// ... other rules
]
}
```

[ΠŸΠΎΠ΄Ρ€Π±ΠΎΠ½Π΅Π΅ ΠΏΡ€ΠΎ ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ merge-openapi-spec](./src/rules/merge-openapi-spec/README-ru.md)

----------------------

### patch-component-schema

ΠŸΡ€Π°Π²ΠΈΠ»ΠΎ позволяСт ΠΌΠΎΠ΄ΠΈΡ„ΠΈΡ†ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ схСму ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π° Π² OpenAPI спСцификации.

#### Config

| ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ | ОписаниС | ΠŸΡ€ΠΈΠΌΠ΅Ρ€ | Випизация | Π”Π΅Ρ„ΠΎΠ»Ρ‚Π½ΠΎΠ΅ |
| -------- |------------------------------------------------------------------------------------------|------------------------------------------------------------------------------|-------------------------------------------|------------------------------------------|
| `descriptor` | [**ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ**] ОписаниС ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π° для ΠΌΠΎΠ΄ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΠΈ. [ΠŸΠΎΠ΄Ρ€ΠΎΠ±Π½Π΅Π΅ ΠΏΡ€ΠΎ различия ΠΌΠ΅ΠΆΠ΄Ρƒ простым ΠΈ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½Ρ‹ΠΌ дСскриптором ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π° с ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ†ΠΈΠ΅ΠΉ](./docs/descriptor-ru.md) | `"Pet.name"` ΠΈΠ»ΠΈ `{"componentName": "Pet", "correction": "properties.name"}` | `string \ { componentName: string; correction: string }` | - |
| `patchMethod` | ΠœΠ΅Ρ‚ΠΎΠ΄ примСнСния ΠΏΠ°Ρ‚Ρ‡Π°. [ΠŸΠΎΠ΄Ρ€ΠΎΠ±Π½Π΅Π΅ ΠΏΡ€ΠΎ различия ΠΌΠ΅ΠΆΠ΄Ρƒ ΠΌΠ΅Ρ‚ΠΎΠ΄Π°ΠΌΠΈ merge ΠΈ deepmerge](./docs/merge-vs-deepmerge-ru.md) | `"merge"` | `"merge" \ "deepmerge"` | `"merge"` |
| `schemaDiff` | [**ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ**] Π‘Ρ…Π΅ΠΌΠ° для ΠΏΠ°Ρ‚Ρ‡Π°. [ΠŸΠΎΠ΄Ρ€ΠΎΠ±Π½Ρ‹Π΅ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρ‹ спСцификаций для OpenAPI](./docs/schema-diff-ru.md) | `{"type": "string", "description": "New description"}` | `OpenAPISchema` | - |

> [!IMPORTANT]
> Вонкости задачния ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° `descriptor`:
> - Π½Π΅ прСдусмотрСн ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ ΠΏΠΎ $ref'Π°ΠΌ. ΠŸΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚ Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ Π½Π΅ ΠΏΡ€Π΅Π΄Π½Π°ΠΌΠ΅Ρ€Π΅Π½Π½ΠΎΠ΅ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ Π² ΠΎΠ±Ρ‰ΠΈΡ… ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π°Ρ…, ΠΈ Ρ‚Π΅ΠΌ самым ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ Π½Π΅ ΠΎΠΆΠΈΠ΄Π°Π½Π½ΠΎΠ΅ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ Π² Π΄Ρ€ΡƒΠ³ΠΎΠΌ мСстС спСцификации. Π’ Ρ‚Π°ΠΊΠΎΠΌ случаС Π»ΡƒΡ‡ΡˆΠ΅ ΠΌΠΎΠ΄ΠΈΡ„ΠΈΡ†ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π½Π°ΠΏΡ€ΡΠΌΡƒΡŽ Ρ‚Ρƒ ΡΡƒΡ‰Π½ΠΎΡΡ‚ΡŒ Π½Π° ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ ссылаСтся $ref;
> - Ссли Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌ ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ ΠΏΠΎ элСмСнтам массива - Π½ΡƒΠΆΠ½ΠΎ Π΄ΠΎΡƒΡ‚ΠΎΡ‡Π½Π΅Π½ΠΈΠ΅ Π² `descriptor` (соотвтСствСнно `[]`), Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, `TestSchemaDTO[].test`
> - Ссли Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌ ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ ΠΏΠΎ oneOf, allOf, anyOf Π½ΡƒΠΆΠ½ΠΎ Π΄ΠΎΡƒΡ‚ΠΎΡ‡Π½Π΅Π½ΠΈΠ΅ Π² `descriptor` (соотвтСствСнно `oneOf[{number}]`, `allOf[{number}]` ΠΈΠ»ΠΈ `anyOf[{number}]`), Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, `TestObjectDTO.oneOf[1].TestSchemaDTO`, `TestObjectDTO.allOf[1].TestSchemaDTO` ΠΈΠ»ΠΈ `TestObjectDTO.anyOf[1].TestSchemaDTO`;

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ:

```js
module.exports = {
pipeline: [
// ... other rules
{
rule: "patch-component-schema",
config: {
descriptor: 'TestDTO', // ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅ΠΌ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π½ΡƒΠΆΠ½ΠΎ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ
schemaDiff: {
type: 'string', // мСняСм Ρ‚ΠΈΠΏ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π° Π½Π° string
},
},
}
// ... other rules
]
}
```

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ Π±ΠΎΠ»Π΅Π΅ Π΄Π΅Ρ‚Π°Π»ΡŒΠ½ΠΎΠΉ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ:

```js
module.exports = {
pipeline: [
// ... other rules
{
rule: "patch-component-schema",
config: {
descriptor: 'TestObjectDTO.oneOf[0].TestArraySchemaDTO[]', // ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅ΠΌ ΠΏΡƒΡ‚ΡŒ ΠΊ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρƒ Π² слоТной структурС
schemaDiff: {
type: 'string', // мСняСм Ρ‚ΠΈΠΏ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π° Π½Π° string
enum: ['foo', 'bar'], // добавляСм enum ΠΊ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρƒ
},
patchMethod: 'deepmerge', // ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ ΠΌΠ΅Ρ‚ΠΎΠ΄ deepmerge для Π³Π»ΡƒΠ±ΠΎΠΊΠΎΠ³ΠΎ слияния ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ
},
}
// ... other rules
]
}
```

[ΠŸΠΎΠ΄Ρ€Π±ΠΎΠ½Π΅Π΅ ΠΏΡ€ΠΎ ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ patch-component-schema](./src/rules/patch-component-schema/README-ru.md)

----------------------

### patch-endpoint-parameter-schema

ΠŸΡ€Π°Π²ΠΈΠ»ΠΎ позволяСт ΠΌΠΎΠ΄ΠΈΡ„ΠΈΡ†ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ схСму ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² эндпоинтов Π² OpenAPI спСцификации.

#### Config

| ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ | ОписаниС | ΠŸΡ€ΠΈΠΌΠ΅Ρ€ | Випизация | Π”Π΅Ρ„ΠΎΠ»Ρ‚Π½ΠΎΠ΅ |
|-----------------------|------------------------------------------------------------------------------------------------------------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------|-------------------------------------------------------------------------------------|--------------|
| `endpointDescriptor` | [**ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ**] Π£ΠΊΠ°Π·Π°Π½ΠΈΠ΅ Π² ΠΊΠ°ΠΊΠΎΠΌ endpoint Π½ΡƒΠΆΠ½ΠΎ ΠΏΠΎΠΌΠ΅Π½ΡΡ‚ΡŒ схСму ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° запроса. | `'GET /api/list'` | `string \ { path: string; method: string }` | |
| `parameterDescriptor` | [**ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ**] Π£ΠΊΠ°Π·Π°Π½ΠΈΠ΅ ΠΊΠ°ΠΊΠΎΠΉ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ запроса, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ссылаСтся `endpointDescriptor`, Π½ΡƒΠΆΠ½ΠΎ ΠΏΠΎΠΌΠ΅Π½ΡΡ‚ΡŒ. | `'TestSchemaDTO'`, `'TestSchemaDTO.test'`, `'TestSchemaDTO[].testField'`, `'TestObjectDTO.oneOf[1]'`, `'TestObjectDTO.allOf[1]'` ΠΈΠ»ΠΈ `'TestObjectDTO.anyOf[1].testField'` | `string` | |
| `schemaDiff` | ИзмСнСния для схСмы ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° [ΠŸΠΎΠ΄Ρ€ΠΎΠ±Π½Ρ‹Π΅ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρ‹ спСцификаций для OpenAPI](./docs/schema-diff-ru.md) | `{type: "number"}` | `OpenAPISchema` | |
| `objectDiff` | ИзмСнСния для самого ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° | `{ required: true }` | `{name?: string; in?: 'query' / 'header' / 'path' / 'cookie'; required?: boolean;}` | |
| `patchMethod` | ΠœΠ΅Ρ‚ΠΎΠ΄ примСнСния ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ, ΡƒΠΊΠ°Π·Π°Π½Π½Ρ‹Ρ… Π² `objectDiff` ΠΈ `schemaDiff`. [ΠŸΠΎΠ΄Ρ€ΠΎΠ±Π½Π΅Π΅ ΠΏΡ€ΠΎ различия ΠΌΠ΅ΠΆΠ΄Ρƒ ΠΌΠ΅Ρ‚ΠΎΠ΄Π°ΠΌΠΈ merge ΠΈ deepmerge](./docs/merge-vs-deepmerge-ru.md) | `"merge"` | `"merge" \ "deepmerge"` | `"merge"` |

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ:

```js
module.exports = {
pipeline: [
// ... other rules
{
rule: "patch-endpoint-parameter-schema",
config: {
endpointDescriptor: 'GET /api/list', // ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅ΠΌ эндпоинт, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π½ΡƒΠΆΠ½ΠΎ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ
parameterDescriptor: {
name: 'test', // ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅ΠΌ имя ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°
in: 'query', // ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅ΠΌ, Ρ‡Ρ‚ΠΎ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ находится Π² query
},
schemaDiff: {
enum: ['foo', 'bar'], // добавляСм enum ΠΊ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρƒ
}
},
}
// ... other rules
]
}
```

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ Π±ΠΎΠ»Π΅Π΅ Π΄Π΅Ρ‚Π°Π»ΡŒΠ½ΠΎΠΉ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ:

```js
module.exports = {
pipeline: [
// ... other rules
{
rule: "patch-endpoint-parameter-schema",
config: {
endpointDescriptor: 'GET /api/list', // ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅ΠΌ эндпоинт, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π½ΡƒΠΆΠ½ΠΎ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ
parameterDescriptor: {
name: 'test', // ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅ΠΌ имя ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°
in: 'query', // ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅ΠΌ, Ρ‡Ρ‚ΠΎ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ находится Π² query
},
schemaDiff: {
type: 'string', // мСняСм Ρ‚ΠΈΠΏ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° Π½Π° string
enum: ['foo', 'bar'], // добавляСм enum ΠΊ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρƒ
},
objectDiff: {
name: 'newTest',
in: 'query',
required: true, // Π΄Π΅Π»Π°Π΅ΠΌ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌ
},
patchMethod: 'deepmerge' // ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ ΠΌΠ΅Ρ‚ΠΎΠ΄ deepmerge для Π³Π»ΡƒΠ±ΠΎΠΊΠΎΠ³ΠΎ слияния ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ
},
}
// ... other rules
]
}
```

[ΠŸΠΎΠ΄Ρ€Π±ΠΎΠ½Π΅Π΅ ΠΏΡ€ΠΎ ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ patch-endpoint-parameter-schema](./src/rules/patch-endpoint-parameter-schema/README-ru.md)

----------------------

### patch-endpoint-request-body-schema

ΠŸΡ€Π°Π²ΠΈΠ»ΠΎ для измСнСния схСмы request body Π² OpenAPI спСцификации. ΠŸΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ‚ ΠΌΠΎΠ΄ΠΈΡ„ΠΈΡ†ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ схСму запроса для ΡƒΠΊΠ°Π·Π°Π½Π½ΠΎΠ³ΠΎ эндпоинта.

#### Config

| ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ | ОписаниС | ΠŸΡ€ΠΈΠΌΠ΅Ρ€ | Випизация | Π”Π΅Ρ„ΠΎΠ»Ρ‚Π½ΠΎΠ΅ |
|-----------------------------|---------------------------------------------------------------------------------------------------------------------------------------------------------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------|----------------|-----------|
| `endpointDescriptor` | [**ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ**] Π£ΠΊΠ°Π·Π°Π½ΠΈΠ΅ Π² ΠΊΠ°ΠΊΠΎΠΌ endpoint Π½ΡƒΠΆΠ½ΠΎ ΠΏΠΎΠΌΠ΅Π½ΡΡ‚ΡŒ схСму ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° запроса. | `'GET /api/list'` | `string \ { path: string; method: string }` | |
| `contentType` | Π£ΠΊΠ°Π·Π°Π½ΠΈΠ΅ ΠΊ ΠΊΠ°ΠΊΠΎΠΌΡƒ Ρ‚ΠΈΠΏΡƒ запросов (content-type) endpoint'Π° Π½ΡƒΠΆΠ½ΠΎ ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΡ‚ΡŒ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅. ΠŸΡ€ΠΈ отсутствии значСния, Π±ΡƒΠ΄ΡƒΡ‚ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½Ρ‹ всС Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Ρ‹ Ρ‚ΠΈΠΏΠΎΠ² запросов. | `'application/json'` | `string` | |
| `correction` | ΠŸΡƒΡ‚ΡŒ ΠΊ полю Π² схСмС для ΠΌΠΎΠ΄ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΠΈ | `"name"` | `string` | - |
| `schemaDiff` | [**ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ**] ИзмСнСния для примСнСния ΠΊ схСмС. [ΠŸΠΎΠ΄Ρ€ΠΎΠ±Π½Ρ‹Π΅ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρ‹ спСцификаций для OpenAPI](./docs/schema-diff-ru.md) | `{type: "number"}` | `OpenAPISchema` | |
| `patchMethod` | ΠœΠ΅Ρ‚ΠΎΠ΄ примСнСния ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ [ΠŸΠΎΠ΄Ρ€ΠΎΠ±Π½Π΅Π΅ ΠΏΡ€ΠΎ различия ΠΌΠ΅ΠΆΠ΄Ρƒ ΠΌΠ΅Ρ‚ΠΎΠ΄Π°ΠΌΠΈ merge ΠΈ deepmerge](./docs/merge-vs-deepmerge-ru.md) | `"merge"` | `"merge" \ "deepmerge"` | `"merge"` |

ΠŸΡ€ΠΈΠΌΠ΅Ρ€Ρ‹ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΉ:

```js
module.exports = {
pipeline: [
// ... other rules
{
rule: "patch-endpoint-request-body-schema",
config: {
endpointDescriptor: 'POST /api/order', // ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅ΠΌ эндпоинт, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π½ΡƒΠΆΠ½ΠΎ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ
correction: "status", // ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅ΠΌ ΠΏΡƒΡ‚ΡŒ ΠΊ полю status Π² Ρ‚Π΅Π»Π΅ запроса
schemaDiff: {
enum: ['foo', 'bar'], // добавляСм enum к полю status
},
},
}
// ... other rules
]
}
```

ΠΈΠ»ΠΈ

```js
module.exports = {
pipeline: [
// ... other rules
{
rule: "patch-endpoint-request-body-schema",
config: {
endpointDescriptor: 'POST /api/order', // ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅ΠΌ эндпоинт, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π½ΡƒΠΆΠ½ΠΎ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ
contentType: "application/json", // ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅ΠΌ Ρ‚ΠΈΠΏ ΠΊΠΎΠ½Ρ‚Π΅Π½Ρ‚Π°, для ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ примСняСм измСнСния
schemaDiff: {
properties: {
testField: {
type: 'number', // мСняСм Ρ‚ΠΈΠΏ поля testField Π½Π° number
},
},
},
patchMethod: "deepmerge" // ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ ΠΌΠ΅Ρ‚ΠΎΠ΄ deepmerge для Π³Π»ΡƒΠ±ΠΎΠΊΠΎΠ³ΠΎ слияния ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ
},
}
// ... other rules
]
}
```

ΠΈΠ»ΠΈ

```js
module.exports = {
pipeline: [
// ... other rules
{
rule: "patch-endpoint-request-body-schema",
config: {
endpointDescriptor: 'POST /api/orders',
correction: '[].status',
schemaDiff: {
enum: ['foo', 'bar'],
},
patchMethod: "deepmerge"
},
}
// ... other rules
]
}
```

[ΠŸΠΎΠ΄Ρ€Π±ΠΎΠ½Π΅Π΅ ΠΏΡ€ΠΎ ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ patch-endpoint-request-body-schema](./src/rules/patch-endpoint-request-body-schema/README-ru.md)

----------------------

### patch-endpoint-response-schema

ΠŸΡ€Π°Π²ΠΈΠ»ΠΎ позволяСт ΠΌΠΎΠ΄ΠΈΡ„ΠΈΡ†ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ схСму ΠΎΡ‚Π²Π΅Ρ‚Π° (response schema) для эндпоинтов Π² OpenAPI спСцификации.

#### Config

| ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ | ОписаниС | ΠŸΡ€ΠΈΠΌΠ΅Ρ€ | Випизация | Π”Π΅Ρ„ΠΎΠ»Ρ‚Π½ΠΎΠ΅ |
|-------------------------|-----------------------------------------------------------------------------------------------------------------------------------------------------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------|-----------------|-----------|
| `endpointDescriptor` | [**ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ**] Π£ΠΊΠ°Π·Π°Π½ΠΈΠ΅ Π² ΠΊΠ°ΠΊΠΎΠΌ endpoint Π½ΡƒΠΆΠ½ΠΎ ΠΏΠΎΠΌΠ΅Π½ΡΡ‚ΡŒ схСму ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° запроса. | `'GET /api/list'` | `string \ { path: string; method: string }` | |
| `correction` | ΠŸΡƒΡ‚ΡŒ ΠΊ свойству схСмы для ΠΌΠΎΠ΄ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΠΈ | `"status"` | `string` | - |
| `code` | Π£ΠΊΠ°Π·Π°Π½ΠΈΠ΅ ΠΊ ΠΊΠ°ΠΊΠΎΠΌΡƒ статус ΠΊΠΎΠ΄Ρƒ ΠΎΡ‚Π²Π΅Ρ‚Π° Π½ΡƒΠΆΠ½ΠΎ ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΡ‚ΡŒ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅. ΠŸΡ€ΠΈ отсутствии значСния, Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ ΠΊ ΠΏΠ΅Ρ€Π²ΠΎΠΌΡƒ 2xx ΠΎΡ‚Π²Π΅Ρ‚Ρƒ. | `200` | `number` | |
| `contentType` | Π£ΠΊΠ°Π·Π°Π½ΠΈΠ΅ ΠΊ ΠΊΠ°ΠΊΠΎΠΌΡƒ Ρ‚ΠΈΠΏΡƒ ΠΎΡ‚Π²Π΅Ρ‚Π° (content-type) endpoint Π½ΡƒΠΆΠ½ΠΎ ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΡ‚ΡŒ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅. ΠŸΡ€ΠΈ отсутствии значСния, Π±ΡƒΠ΄ΡƒΡ‚ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½Ρ‹ всС Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Ρ‹ Ρ‚ΠΈΠΏΠΎΠ² ΠΎΡ‚Π²Π΅Ρ‚ΠΎΠ². | `'application/json'` | `string` | |
| `schemaDiff` | [**ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ**] НСобходимоС ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ Π² Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π΅ OpenAPI. [ΠŸΠΎΠ΄Ρ€ΠΎΠ±Π½Ρ‹Π΅ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρ‹ спСцификаций для OpenAPI](./docs/schema-diff-ru.md) | `{type: "number"}` | `OpenAPISchema` | |
| `patchMethod` | ΠœΠ΅Ρ‚ΠΎΠ΄ примСнСния ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ [ΠŸΠΎΠ΄Ρ€ΠΎΠ±Π½Π΅Π΅ ΠΏΡ€ΠΎ различия ΠΌΠ΅ΠΆΠ΄Ρƒ ΠΌΠ΅Ρ‚ΠΎΠ΄Π°ΠΌΠΈ merge ΠΈ deepmerge](./docs/merge-vs-deepmerge-ru.md) | `"merge"` | `"merge" \ "deepmerge"` | `"merge"` |

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ:

```js
module.exports = {
pipeline: [
// ... other rules
{
rule: "patch-endpoint-response-schema",
config: {
endpointDescriptor: 'GET /api/list', // ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅ΠΌ эндпоинт, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π½ΡƒΠΆΠ½ΠΎ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ
correction: '[].status', // ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅ΠΌ ΠΏΡƒΡ‚ΡŒ ΠΊ полю status Π² массивС ΠΎΡ‚Π²Π΅Ρ‚Π°
schemaDiff: {
enum: ['foo', 'bar'], // добавляСм enum к полю status
},
},
}
// ... other rules
]
}
```

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ Π±ΠΎΠ»Π΅Π΅ Π΄Π΅Ρ‚Π°Π»ΡŒΠ½ΠΎΠΉ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ:

```js
module.exports = {
pipeline: [
// ... other rules
{
rule: "patch-endpoint-response-schema",
config: {
endpointDescriptor: 'GET /api/list', // ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅ΠΌ эндпоинт, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π½ΡƒΠΆΠ½ΠΎ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ
correction: '[].status', // ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅ΠΌ ΠΏΡƒΡ‚ΡŒ ΠΊ полю status Π² массивС ΠΎΡ‚Π²Π΅Ρ‚Π°
code: 200, // ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅ΠΌ ΠΊΠΎΠ΄ ΠΎΡ‚Π²Π΅Ρ‚Π°, для ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ примСняСм измСнСния
contentType: 'application/json', // ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅ΠΌ Ρ‚ΠΈΠΏ ΠΊΠΎΠ½Ρ‚Π΅Π½Ρ‚Π°, для ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ примСняСм измСнСния
schemaDiff: {
enum: ['foo', 'bar'], // добавляСм enum к полю status
},
patchMethod: 'deepmerge' // ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ ΠΌΠ΅Ρ‚ΠΎΠ΄ deepmerge для Π³Π»ΡƒΠ±ΠΎΠΊΠΎΠ³ΠΎ слияния ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ
},
}
// ... other rules
]
}
```

[ΠŸΠΎΠ΄Ρ€Π±ΠΎΠ½Π΅Π΅ ΠΏΡ€ΠΎ ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ patch-endpoint-response-schema](./src/rules/patch-endpoint-response-schema/README-ru.md)

----------------------

### patch-endpoint-schema

ΠŸΡ€Π°Π²ΠΈΠ»ΠΎ позволяСт ΠΌΠΎΠ΄ΠΈΡ„ΠΈΡ†ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ схСму эндпоинта Ρ†Π΅Π»ΠΈΠΊΠΎΠΌ Π² OpenAPI спСцификации. Π’ ΠΎΡ‚Π»ΠΈΡ‡ΠΈΠ΅ ΠΎΡ‚ Π΄Ρ€ΡƒΠ³ΠΈΡ… ΠΏΡ€Π°Π²ΠΈΠ» ΠΏΠ°Ρ‚Ρ‡ΠΈΠ½Π³Π°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‚ с ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹ΠΌΠΈ частями эндпоинта (ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹, Ρ‚Π΅Π»ΠΎ запроса, ΠΎΡ‚Π²Π΅Ρ‚Ρ‹), это ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΠ·ΠΌΠ΅Π½ΡΡ‚ΡŒ всю структуру эндпоинта, Π²ΠΊΠ»ΡŽΡ‡Π°Ρ всС Π΅Π³ΠΎ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρ‹.

#### Config

| ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ | ОписаниС | ΠŸΡ€ΠΈΠΌΠ΅Ρ€ | Випизация | Π”Π΅Ρ„ΠΎΠ»Ρ‚Π½ΠΎΠ΅ |
|--------------------------------|--------------------------------------------------------|---------|------------|---------------|
| `endpointDescriptor` | [**ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ**] ОписаниС эндпоинта для ΠΏΠ°Ρ‚Ρ‡ΠΈΠ½Π³Π° | `{ path: "/pets", method: "get" }` | `{ path: string, method: string }` | - |
| `endpointDescriptorCorrection` | ΠŸΡƒΡ‚ΡŒ ΠΊ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎΠΌΡƒ полю Π² схСмС эндпоинта для ΠΏΠ°Ρ‚Ρ‡ΠΈΠ½Π³Π° | `"responses.200.content.application/json.schema"` | `string` | - |
| `schemaDiff` | [**ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ**] НСобходимоС ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ Π² Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π΅ OpenAPI. [ΠŸΠΎΠ΄Ρ€ΠΎΠ±Π½Ρ‹Π΅ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρ‹ спСцификаций для OpenAPI](./docs/schema-diff-ru.md) | `{ type: "object", properties: { ... } }` | `OpenAPISchema` | - |
| `patchMethod` | ΠœΠ΅Ρ‚ΠΎΠ΄ примСнСния ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ [ΠŸΠΎΠ΄Ρ€ΠΎΠ±Π½Π΅Π΅ ΠΏΡ€ΠΎ различия ΠΌΠ΅ΠΆΠ΄Ρƒ ΠΌΠ΅Ρ‚ΠΎΠ΄Π°ΠΌΠΈ merge ΠΈ deepmerge](./docs/merge-vs-deepmerge-ru.md) | `"merge"` | `"merge" \ "deepmerge"` | `"merge"` |

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ:

```js
module.exports = {
pipeline: [
{
rule: "patch-endpoint-schema",
config: {
endpointDescriptor: "GET /pets", // ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅ΠΌ эндпоинт, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π½ΡƒΠΆΠ½ΠΎ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ
patchMethod: "merge", // ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ ΠΌΠ΅Ρ‚ΠΎΠ΄ merge для примСнСния ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ
schemaDiff: {
"security": [ // добавляСм ΡΠ΅ΠΊΡ†ΠΈΡŽ security ΠΊ схСмС
{
"bearerAuth": []
}
]
}
}
}
]
}
```

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ Π±ΠΎΠ»Π΅Π΅ Π΄Π΅Ρ‚Π°Π»ΡŒΠ½ΠΎΠΉ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ:

```js
module.exports = {
pipeline: [
{
rule: "patch-endpoint-schema",
config: {
patchMethod: 'merge',
endpointDescriptor: "GET /pets",
endpointDescriptorCorrection: 'responses.200.content.*/*.schema',
schemaDiff: {
enum: ['3', '4'],
},
}
}
]
}
```

[ΠŸΠΎΠ΄Ρ€Π±ΠΎΠ½Π΅Π΅ ΠΏΡ€ΠΎ ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ patch-endpoint-schema](./src/rules/patch-endpoint-schema/README-ru.md)

----------------------

### remove-deprecated

ΠŸΡ€Π°Π²ΠΈΠ»ΠΎ позволяСт ΡƒΠ΄Π°Π»ΠΈΡ‚ΡŒ ΡƒΡΡ‚Π°Ρ€Π΅Π²ΡˆΠΈΠ΅ (deprecated) элСмСнты ΠΈΠ· OpenAPI спСцификации. Оно ΠΌΠΎΠΆΠ΅Ρ‚ ΡƒΠ΄Π°Π»ΡΡ‚ΡŒ ΡƒΡΡ‚Π°Ρ€Π΅Π²ΡˆΠΈΠ΅ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρ‹, эндпоинты, ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ ΠΈ свойства, ΠΏΡ€ΠΈ этом прСдоставляя Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΠΈΠ³Π½ΠΎΡ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹Π΅ элСмСнты ΠΈ ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Ρ‚ΡŒ описания удаляСмых элСмСнтов.

#### Config

| ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ | ОписаниС | ΠŸΡ€ΠΈΠΌΠ΅Ρ€ | Випизация | Π”Π΅Ρ„ΠΎΠ»Ρ‚Π½ΠΎΠ΅ |
|----------|-------------------------------------------------------------------------------------------------------------------------|---------|-----------|-----------|
| `ignoreComponents` | [**ΠΎΠΏΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½Ρ‹ΠΉ**] Бписок ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠ², ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½Π΅ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π±Ρ‹Ρ‚ΡŒ ΡƒΠ΄Π°Π»Π΅Π½Ρ‹, Π΄Π°ΠΆΠ΅ Ссли ΠΎΠ½ΠΈ ΠΏΠΎΠΌΠ΅Ρ‡Π΅Π½Ρ‹ ΠΊΠ°ΠΊ ΡƒΡΡ‚Π°Ρ€Π΅Π²ΡˆΠΈΠ΅ | `[{"componentName": "Pet"}]` | `Array<{ componentName: string }>` | `[]` |
| `ignoreEndpoints` | [**ΠΎΠΏΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½Ρ‹ΠΉ**] Бписок эндпоинтов, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½Π΅ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π±Ρ‹Ρ‚ΡŒ ΡƒΠ΄Π°Π»Π΅Π½Ρ‹, Π΄Π°ΠΆΠ΅ Ссли ΠΎΠ½ΠΈ ΠΏΠΎΠΌΠ΅Ρ‡Π΅Π½Ρ‹ ΠΊΠ°ΠΊ ΡƒΡΡ‚Π°Ρ€Π΅Π²ΡˆΠΈΠ΅ | `["GET /pets"]` | `Array` | `[]` |
| `ignoreEndpointParameters` | [**ΠΎΠΏΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½Ρ‹ΠΉ**] Бписок ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² эндпоинтов, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½Π΅ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π±Ρ‹Ρ‚ΡŒ ΡƒΠ΄Π°Π»Π΅Π½Ρ‹, Π΄Π°ΠΆΠ΅ Ссли ΠΎΠ½ΠΈ ΠΏΠΎΠΌΠ΅Ρ‡Π΅Π½Ρ‹ ΠΊΠ°ΠΊ ΡƒΡΡ‚Π°Ρ€Π΅Π²ΡˆΠΈΠ΅ | `[{"path": "/pets", "method": "get", "name": "limit", "in": "query"}]` | `Array<{ path: string; method: string; name: string; in: "query" \ "path" \ "header" \ "cookie" }>` | `[]` |
| `showDeprecatedDescriptions` | [**ΠΎΠΏΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½Ρ‹ΠΉ**] ΠŸΠΎΠΊΠ°Π·Ρ‹Π²Π°Ρ‚ΡŒ Π»ΠΈ описания удаляСмых ΡƒΡΡ‚Π°Ρ€Π΅Π²ΡˆΠΈΡ… элСмСнтов Π² Π»ΠΎΠ³Π°Ρ…, ΠΏΠΎΠ»Π΅Π·Π½ΠΎ для пояснСния, Ρ‡Ρ‚ΠΎ Π½ΡƒΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ вмСсто Π½ΠΈΡ… | `true` | `boolean` | `false` |

> [!IMPORTANT]
> Π£Ρ‡ΠΈΡ‚Ρ‹Π²Π°ΡŽΡ‚ΡΡ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π»ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹Π΅ $ref'Ρ‹ Ρ„Π°ΠΉΠ»Π°, Π²ΠΈΠ΄Π°: `#/...`

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ:

```js
module.exports = {
pipeline: [
{
rule: "remove-deprecated",
config: {},
}
]
}
```

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ Π±ΠΎΠ»Π΅Π΅ Π΄Π΅Ρ‚Π°Π»ΡŒΠ½ΠΎΠΉ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ:

```js
module.exports = {
pipeline: [
{
rule: "remove-deprecated",
config: {
ignoreComponents: [
{ componentName: "Pet" } // сохраняСм ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ Pet Π΄Π°ΠΆΠ΅ Ссли ΠΎΠ½ ΠΏΠΎΠΌΠ΅Ρ‡Π΅Π½ ΠΊΠ°ΠΊ ΡƒΡΡ‚Π°Ρ€Π΅Π²ΡˆΠΈΠΉ
],
ignoreEndpoints: [
{ path: "/pets", method: "get" } // сохраняСм GET /pets Π΄Π°ΠΆΠ΅ Ссли ΠΎΠ½ ΠΏΠΎΠΌΠ΅Ρ‡Π΅Π½ ΠΊΠ°ΠΊ ΡƒΡΡ‚Π°Ρ€Π΅Π²ΡˆΠΈΠΉ
],
ignoreEndpointParameters: [
{ path: "/pets", method: "get", name: "limit", in: "query" } // сохраняСм ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ limit Π² GET /pets Π΄Π°ΠΆΠ΅ Ссли ΠΎΠ½ ΠΏΠΎΠΌΠ΅Ρ‡Π΅Π½ ΠΊΠ°ΠΊ ΡƒΡΡ‚Π°Ρ€Π΅Π²ΡˆΠΈΠΉ
],
showDeprecatedDescriptions: true // Π²Ρ‹Π²ΠΎΠ΄ΠΈΠΌ Π² консоль описания ΡƒΠ΄Π°Π»Π΅Π½Π½Ρ‹Ρ… ΡƒΡΡ‚Π°Ρ€Π΅Π²ΡˆΠΈΡ… элСмСнтов
},
}
]
}
```

[ΠŸΠΎΠ΄Ρ€Π±ΠΎΠ½Π΅Π΅ ΠΏΡ€ΠΎ ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ remove-deprecated](./src/rules/remove-deprecated/README-ru.md)

----------------------

### remove-max-items

УдаляСт свойство `maxItems` ΠΈΠ· всСх схСм Π² OpenAPI спСцификации.

#### Config

| ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ | ОписаниС | ΠŸΡ€ΠΈΠΌΠ΅Ρ€ | Випизация | Π”Π΅Ρ„ΠΎΠ»Ρ‚Π½ΠΎΠ΅ |
| -------- |-----------------------------------|----------------------------|------------------------|-----------|
| `showUnusedWarning` | [**ΠΎΠΏΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½Ρ‹ΠΉ**] ΠŸΠΎΠΊΠ°Π·Ρ‹Π²Π°Ρ‚ΡŒ ΠΏΡ€Π΅Π΄ΡƒΠΏΡ€Π΅ΠΆΠ΄Π΅Π½ΠΈΠ΅, Ссли Π½Π΅ Π½Π°ΠΉΠ΄Π΅Π½ΠΎ схСм с maxItems | `true` | `boolean` | `false` |

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ:

```js
module.exports = {
pipeline: [
// ... other rules
{
rule: "remove-max-items",
config: {} // ΡƒΠ΄Π°Π»ΠΈΡ‚ΡŒ свойство maxItems ΠΈΠ· всСх схСм, Π½Π΅ ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Ρ‚ΡŒ прСдупрСТдСния
}
// ... other rules
]
}
```

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ Π±ΠΎΠ»Π΅Π΅ Π΄Π΅Ρ‚Π°Π»ΡŒΠ½ΠΎΠΉ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ:

```js
module.exports = {
pipeline: [
// ... other rules
{
rule: "remove-max-items",
config: {
showUnusedWarning: true // ΠΏΠΎΠΊΠ°Π·Π°Ρ‚ΡŒ ΠΏΡ€Π΅Π΄ΡƒΠΏΡ€Π΅ΠΆΠ΄Π΅Π½ΠΈΠ΅, Ссли Π² спСцификации Π½Π΅ Π½Π°ΠΉΠ΄Π΅Π½Ρ‹ схСмы с maxItems
}
}
// ... other rules
]
}
```

[ΠŸΠΎΠ΄Ρ€Π±ΠΎΠ½Π΅Π΅ ΠΏΡ€ΠΎ ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ remove-max-items](./src/rules/remove-max-items/README-ru.md)

----------------------

### remove-min-items

УдаляСт свойство `minItems` ΠΈΠ· всСх схСм Π² OpenAPI спСцификации.

#### Config

| ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ | ОписаниС | ΠŸΡ€ΠΈΠΌΠ΅Ρ€ | Випизация | Π”Π΅Ρ„ΠΎΠ»Ρ‚Π½ΠΎΠ΅ |
| -------- |-----------------------------------|----------------------------|------------------------|-----------|
| `showUnusedWarning` | [**ΠΎΠΏΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½Ρ‹ΠΉ**] ΠŸΠΎΠΊΠ°Π·Ρ‹Π²Π°Ρ‚ΡŒ ΠΏΡ€Π΅Π΄ΡƒΠΏΡ€Π΅ΠΆΠ΄Π΅Π½ΠΈΠ΅, Ссли Π½Π΅ Π½Π°ΠΉΠ΄Π΅Π½ΠΎ схСм с `minItems` | `true` | `boolean` | `false` |

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ:

```js
module.exports = {
pipeline: [
// ... other rules
{
rule: "remove-min-items",
config: {} // ΡƒΠ΄Π°Π»ΠΈΡ‚ΡŒ свойство minItems ΠΈΠ· всСх схСм, Π½Π΅ ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Ρ‚ΡŒ прСдупрСТдСния
}
// ... other rules
]
}
```

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ Π±ΠΎΠ»Π΅Π΅ Π΄Π΅Ρ‚Π°Π»ΡŒΠ½ΠΎΠΉ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ:

```js
module.exports = {
pipeline: [
// ... other rules
{
rule: "remove-min-items",
config: {
showUnusedWarning: true // ΠΏΠΎΠΊΠ°Π·Π°Ρ‚ΡŒ ΠΏΡ€Π΅Π΄ΡƒΠΏΡ€Π΅ΠΆΠ΄Π΅Π½ΠΈΠ΅, Ссли Π² спСцификации Π½Π΅ Π½Π°ΠΉΠ΄Π΅Π½Ρ‹ схСмы с minItems
}
}
// ... other rules
]
}
```

[ΠŸΠΎΠ΄Ρ€Π±ΠΎΠ½Π΅Π΅ ΠΏΡ€ΠΎ ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ remove-min-items](./src/rules/remove-min-items/README-ru.md)

----------------------

### remove-operation-id

УдаляСт operationId ΠΈΠ· всСх ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ Π² OpenAPI спСцификации, ΠΊΡ€ΠΎΠΌΠ΅ Ρ‚Π΅Ρ…, Ρ‡Ρ‚ΠΎ ΡƒΠΊΠ°Π·Π°Π½Ρ‹ Π² спискС игнорирования

#### Config

| ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ | ОписаниС | ΠŸΡ€ΠΈΠΌΠ΅Ρ€ | Випизация | Π”Π΅Ρ„ΠΎΠ»Ρ‚Π½ΠΎΠ΅ |
| -------- |-----------------------------------|----------------------------|------------------------|-----------|
| `ignore` | [**ΠΎΠΏΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½Ρ‹ΠΉ**] Бписок operationId для игнорирования | `["getPets", "createPet"]` | `string[]` | `[]` |

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ:

```js
module.exports = {
pipeline: [
// ... other rules
{
rule: "remove-operation-id",
config: {} // ΡƒΠ΄Π°Π»ΠΈΡ‚ΡŒ всС Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Ρ‹ operationId ΠΈΠ· эндпоинтов
}
// ... other rules
]
}
```

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ Π±ΠΎΠ»Π΅Π΅ Π΄Π΅Ρ‚Π°Π»ΡŒΠ½ΠΎΠΉ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ:

```js
module.exports = {
pipeline: [
// ... other rules
{
rule: "remove-operation-id",
config: {
ignore: ["getPets", "createPet"], // ΡΠΎΡ…Ρ€Π°Π½ΠΈΡ‚ΡŒ operationId для этого эндпоинта
},
}
// ... other rules
]
}
```

[ΠŸΠΎΠ΄Ρ€Π±ΠΎΠ½Π΅Π΅ ΠΏΡ€ΠΎ ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ remove-operation-id](./src/rules/remove-operation-id/README-ru.md)

----------------------

### remove-parameter

УдаляСт ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ ΠΈΠ· эндпоинта Π² OpenAPI спСцификации

#### Config

| ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ | ОписаниС | ΠŸΡ€ΠΈΠΌΠ΅Ρ€ | Випизация | Π”Π΅Ρ„ΠΎΠ»Ρ‚Π½ΠΎΠ΅ |
| -------- |-------------------------------------------------------------------------------------------------------------------------------------------|----------------------------|------------------------|-----------|
| `endpointDescriptor` | [**ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ**] ОписаниС эндпоинта, ΠΈΠ· ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ Π½ΡƒΠΆΠ½ΠΎ ΡƒΠ΄Π°Π»ΠΈΡ‚ΡŒ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ | `"GET /pets"` | `string \ { path: string; method: string }` | - |
| `parameterDescriptor` | [**ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ**] ОписаниС ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π½ΡƒΠΆΠ½ΠΎ ΡƒΠ΄Π°Π»ΠΈΡ‚ΡŒ. Π’ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ `in` ΠΌΠΎΠΆΠ½ΠΎ ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ: `"query"`, `"path"`, `"header"`, `"cookie"`. | `{"name": "petId", "in": "path"}` | `{ name: string; in: "query" \ "path" \ "header" \ "cookie" }` | - |

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ:

```js
module.exports = {
pipeline: [
// ... other rules
{
rule: "remove-parameter",
config: {
endpointDescriptor: "GET /pets/{petId}", // ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ ΠΊΠΎΠ½Π΅Ρ‡Π½ΡƒΡŽ Ρ‚ΠΎΡ‡ΠΊΡƒ, ΠΈΠ· ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ Π½ΡƒΠΆΠ½ΠΎ ΡƒΠ΄Π°Π»ΠΈΡ‚ΡŒ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€
parameterDescriptor: {
name: "version", // ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ имя удаляСмого ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°
in: "query" // ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ мСстополоТСниС ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° (ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ запроса)
}
},
}
// ... other rules
]
}
```

[ΠŸΠΎΠ΄Ρ€Π±ΠΎΠ½Π΅Π΅ ΠΏΡ€ΠΎ ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ remove-parameter](./src/rules/remove-parameter/README-ru.md)

----------------------

### remove-unused-components

УдаляСт Π½Π΅ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Π΅ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρ‹ ΠΈΠ· OpenAPI спСцификации. ΠŸΡ€Π°Π²ΠΈΠ»ΠΎ Π°Π½Π°Π»ΠΈΠ·ΠΈΡ€ΡƒΠ΅Ρ‚ всС ссылки Π½Π° ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρ‹ Π² Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π΅ ΠΈ удаляСт Ρ‚Π΅, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½ΠΈΠ³Π΄Π΅ Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ.

#### Config

| ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ | ОписаниС | ΠŸΡ€ΠΈΠΌΠ΅Ρ€ | Випизация | Π”Π΅Ρ„ΠΎΠ»Ρ‚Π½ΠΎΠ΅ |
| -------- |-----------------------------------|-------------------|------------------------|-----------|
| `ignore` | [**ΠΎΠΏΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½Ρ‹ΠΉ**] Бписок ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠ² ΠΈΠ»ΠΈ рСгулярных Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½ΡƒΠΆΠ½ΠΎ ΠΈΠ³Π½ΠΎΡ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΡ€ΠΈ ΡƒΠ΄Π°Π»Π΅Π½ΠΈΠΈ | `["NotFoundDTO", "/^Error.*/"]` | `Array` | `[]` |
| `printDeletedComponents` | [**ΠΎΠΏΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½Ρ‹ΠΉ**] Если true, Ρ‚ΠΎ Π² консоль Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π²Π΅Π΄Π΅Π½ список ΡƒΠ΄Π°Π»Π΅Π½Π½Ρ‹Ρ… ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠ² | `true` | `boolean` | `false` |

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ:

```js
module.exports = {
pipeline: [
// ... other rules
{
rule: "remove-unused-components",
config: {},
}
// ... other rules
]
}
```

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ Π±ΠΎΠ»Π΅Π΅ Π΄Π΅Ρ‚Π°Π»ΡŒΠ½ΠΎΠΉ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ:

```js
module.exports = {
pipeline: [
// ... other rules
{
rule: "remove-unused-components",
config: {
ignore: [
"NotFoundDTO",
/^Error.*/, // ΠΈΠ³Π½ΠΎΡ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ всС ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρ‹, Π½Π°Ρ‡ΠΈΠ½Π°ΡŽΡ‰ΠΈΠ΅ΡΡ с Error
/.*Response$/ // ΠΈΠ³Π½ΠΎΡ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ всС ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρ‹, Π·Π°ΠΊΠ°Π½Ρ‡ΠΈΠ²Π°ΡŽΡ‰ΠΈΠ΅ΡΡ Π½Π° Response
],
printDeletedComponents: true // Π²Ρ‹Π²ΠΎΠ΄ΠΈΡ‚ΡŒ список ΡƒΠ΄Π°Π»Π΅Π½Π½Ρ‹Ρ… ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠ² Π² консоль
},
}
// ... other rules
]
}
```

[ΠŸΠΎΠ΄Ρ€Π±ΠΎΠ½Π΅Π΅ ΠΏΡ€ΠΎ ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ remove-unused-components](./src/rules/remove-unused-components/README-ru.md)

## FAQ

- **Π§Π΅ΠΌ опасны ΠΌΠΎΠ΄ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΠΈ ΠΏΠΎ ссылкам $ref?** ΠŸΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ Π·Π½Π°Ρ‡ΠΈΡ‚ Ρ‡Ρ‚ΠΎ $ref ссылаСтся Π½Π° ΠΎΠ±Ρ‰ΡƒΡŽ Ρ‡Π°ΡΡ‚ΡŒ схСмы, ΠΈ Π΅Π΅ модификация, Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Ρ‚ ΠΊ нСявному измСнСнию Π² Π΄Ρ€ΡƒΠ³ΠΎΠΌ мСстС спСцификации, Π³Π΄Π΅ ΠΏΠ΅Ρ€Π΅ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ $ref, ΠΈ Ρ‚Π°ΠΊΡƒΡŽ Π±Π°Π³Ρƒ Π±ΡƒΠ΄Π΅Ρ‚ ΠΊΡ€Π°ΠΉΠ½Π΅ слоТно ΠΎΡ‚Π»ΠΎΠ²ΠΈΡ‚ΡŒ.

## AI инструмСнты

- [DeepWiki докумСнтация](https://deepwiki.com/itwillwork/openapi-modifier)
- [Context7 докумСнтация для LLM ΠΌΠΎΠ΄Π΅Π»Π΅ΠΉ ΠΈ AI Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΎΡ€ΠΎΠ² ΠΊΠΎΠ΄Π°](https://context7.com/itwillwork/openapi-modifier)

## ΠŸΡ€ΠΈΠΌΠ΅Ρ€Ρ‹ использования

Π’ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΠΈ `examples` Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π½Π°ΠΉΡ‚ΠΈ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Π΅ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρ‹ использования ΠΏΠ°ΠΊΠ΅Ρ‚Π°:

- [example-cli-generate-api-types](./examples/example-cli-generate-api-types) - ΠŸΡ€ΠΈΠΌΠ΅Ρ€ Π³Π΅Π½Π΅Ρ€Π°Ρ†ΠΈΠΈ Ρ‚ΠΈΠΏΠΎΠ² API с использованиСм CLI
- [example-cli-openapi-json](./examples/example-cli-openapi-json) - ΠŸΡ€ΠΈΠΌΠ΅Ρ€ Ρ€Π°Π±ΠΎΡ‚Ρ‹ с JSON Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ΠΎΠΌ OpenAPI Ρ‡Π΅Ρ€Π΅Π· CLI
- [example-cli-openapi-yaml](./examples/example-cli-openapi-yaml) - ΠŸΡ€ΠΈΠΌΠ΅Ρ€ Ρ€Π°Π±ΠΎΡ‚Ρ‹ с YAML Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ΠΎΠΌ OpenAPI Ρ‡Π΅Ρ€Π΅Π· CLI
- [example-cli-openapi-yaml-to-json](./examples/example-cli-openapi-yaml-to-json) - ΠŸΡ€ΠΈΠΌΠ΅Ρ€ ΠΊΠΎΠ½Π²Π΅Ρ€Ρ‚Π°Ρ†ΠΈΠΈ YAML Π² JSON Ρ„ΠΎΡ€ΠΌΠ°Ρ‚
- [example-cli-simple-generate-api-types](./examples/example-cli-simple-generate-api-types) - ΠŸΡ€ΠΎΡΡ‚ΠΎΠΉ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Π³Π΅Π½Π΅Ρ€Π°Ρ†ΠΈΠΈ Ρ‚ΠΈΠΏΠΎΠ² API
- [example-cli-simple-json-config](./examples/example-cli-simple-json-config) - ΠŸΡ€ΠΈΠΌΠ΅Ρ€ использования JSON ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ
- [example-cli-simple-npx](./examples/example-cli-simple-npx) - ΠŸΡ€ΠΈΠΌΠ΅Ρ€ использования Ρ‡Π΅Ρ€Π΅Π· npx
- [example-package-openapi-yaml](./examples/example-package-openapi-yaml) - ΠŸΡ€ΠΈΠΌΠ΅Ρ€ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎΠ³ΠΎ использования ΠΏΠ°ΠΊΠ΅Ρ‚Π°

ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ содСрТит:
- Π’Ρ…ΠΎΠ΄Π½Ρ‹Π΅ Ρ„Π°ΠΉΠ»Ρ‹ OpenAPI спСцификации
- ΠšΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΎΠ½Π½Ρ‹Π΅ Ρ„Π°ΠΉΠ»Ρ‹
- Π‘ΠΊΡ€ΠΈΠΏΡ‚Ρ‹ для запуска
- Π Π΅Π·ΡƒΠ»ΡŒΡ‚ΠΈΡ€ΡƒΡŽΡ‰ΠΈΠ΅ Ρ„Π°ΠΉΠ»Ρ‹

## Π”ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ ΠΏΠΎΠ»Π΅Π·Π½Ρ‹Π΅ ссылки

- [Π”ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ Π½ΠΎΠ²ΠΎΠ³ΠΎ ΠΏΡ€Π°Π²ΠΈΠ»Π°](./docs/contributing-ru.md)
- [Различия ΠΌΠ΅ΠΆΠ΄Ρƒ простым ΠΈ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½Ρ‹ΠΌ дСскриптором ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π° с ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ†ΠΈΠ΅ΠΉ](./docs/descriptor-ru.md)
- [Различия ΠΌΠ΅ΠΆΠ΄Ρƒ ΠΌΠ΅Ρ‚ΠΎΠ΄Π°ΠΌΠΈ merge ΠΈ deepmerge](./docs/merge-vs-deepmerge-ru.md)
- [ΠŸΡ€ΠΈΠΌΠ΅Ρ€Ρ‹ спСцификаций для OpenAPI](./docs/schema-diff-ru.md)
- [Simple Text File Modifier](./docs/simple-text-file-modifier-ru.md)