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
- Host: GitHub
- URL: https://github.com/itwillwork/openapi-modifier
- Owner: itwillwork
- Created: 2023-12-30T10:45:38.000Z (about 2 years ago)
- Default Branch: main
- Last Pushed: 2026-01-28T12:07:53.000Z (about 2 months ago)
- Last Synced: 2026-01-29T01:10:55.146Z (about 2 months ago)
- Language: TypeScript
- Homepage:
- Size: 1.17 MB
- Stars: 0
- Watchers: 1
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README-ru.md
- Contributing: docs/contributing-ru.md
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)