ts-openapi-codegen 2.1.0-beta.4 → 2.1.0-beta.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (166) hide show
  1. package/README.md +11 -957
  2. package/README.rus.md +11 -957
  3. package/dist/cli/checkAndUpdateConfig/__tests__/checkConfig.test.d.ts +2 -0
  4. package/dist/cli/checkAndUpdateConfig/__tests__/checkConfig.test.d.ts.map +1 -0
  5. package/dist/cli/checkAndUpdateConfig/__tests__/checkConfig.test.js +63 -0
  6. package/dist/cli/checkAndUpdateConfig/__tests__/updateConfig.test.d.ts +2 -0
  7. package/dist/cli/checkAndUpdateConfig/__tests__/updateConfig.test.d.ts.map +1 -0
  8. package/dist/cli/checkAndUpdateConfig/__tests__/updateConfig.test.js +62 -0
  9. package/dist/cli/checkAndUpdateConfig/utils/__tests__/prepareConfigData.test.d.ts +2 -0
  10. package/dist/cli/checkAndUpdateConfig/utils/__tests__/prepareConfigData.test.d.ts.map +1 -0
  11. package/dist/cli/checkAndUpdateConfig/utils/__tests__/prepareConfigData.test.js +20 -0
  12. package/dist/cli/checkAndUpdateConfig/utils/__tests__/removeDefaultConfigValues.test.d.ts +2 -0
  13. package/dist/cli/checkAndUpdateConfig/utils/__tests__/removeDefaultConfigValues.test.d.ts.map +1 -0
  14. package/dist/cli/checkAndUpdateConfig/utils/__tests__/removeDefaultConfigValues.test.js +35 -0
  15. package/dist/cli/checkAndUpdateConfig/utils/__tests__/validateAndMigrateConfigData.test.d.ts +2 -0
  16. package/dist/cli/checkAndUpdateConfig/utils/__tests__/validateAndMigrateConfigData.test.d.ts.map +1 -0
  17. package/dist/cli/checkAndUpdateConfig/utils/__tests__/validateAndMigrateConfigData.test.js +59 -0
  18. package/dist/cli/index.js +2 -0
  19. package/dist/cli/initOpenApiConfig/__tests__/init.test.d.ts +2 -0
  20. package/dist/cli/initOpenApiConfig/__tests__/init.test.d.ts.map +1 -0
  21. package/dist/cli/initOpenApiConfig/__tests__/init.test.js +30 -0
  22. package/dist/cli/initOpenApiConfig/__tests__/initConfig.test.d.ts +2 -0
  23. package/dist/cli/initOpenApiConfig/__tests__/initConfig.test.d.ts.map +1 -0
  24. package/dist/cli/initOpenApiConfig/__tests__/initConfig.test.js +47 -0
  25. package/dist/cli/initOpenApiConfig/init.d.ts.map +1 -1
  26. package/dist/cli/initOpenApiConfig/init.js +2 -0
  27. package/dist/cli/initOpenApiConfig/initCustomRequest.d.ts +1 -0
  28. package/dist/cli/initOpenApiConfig/initCustomRequest.d.ts.map +1 -1
  29. package/dist/cli/initOpenApiConfig/initCustomRequest.js +2 -1
  30. package/dist/cli/initOpenApiConfig/utils/__tests__/buildConfig.test.d.ts +2 -0
  31. package/dist/cli/initOpenApiConfig/utils/__tests__/buildConfig.test.d.ts.map +1 -0
  32. package/dist/cli/initOpenApiConfig/utils/__tests__/buildConfig.test.js +99 -0
  33. package/dist/cli/initOpenApiConfig/utils/__tests__/findSpecFiles.test.d.ts +2 -0
  34. package/dist/cli/initOpenApiConfig/utils/__tests__/findSpecFiles.test.d.ts.map +1 -0
  35. package/dist/cli/initOpenApiConfig/utils/__tests__/findSpecFiles.test.js +45 -0
  36. package/dist/cli/initOpenApiConfig/utils/__tests__/validateSpecFiles.test.d.ts +2 -0
  37. package/dist/cli/initOpenApiConfig/utils/__tests__/validateSpecFiles.test.d.ts.map +1 -0
  38. package/dist/cli/initOpenApiConfig/utils/__tests__/validateSpecFiles.test.js +52 -0
  39. package/dist/cli/initOpenApiConfig/utils/buildConfig.d.ts.map +1 -1
  40. package/dist/cli/initOpenApiConfig/utils/buildConfig.js +4 -0
  41. package/dist/cli/previewChanges/utils/__tests__/compareFiles.test.d.ts +2 -0
  42. package/dist/cli/previewChanges/utils/__tests__/compareFiles.test.d.ts.map +1 -0
  43. package/dist/cli/previewChanges/utils/__tests__/compareFiles.test.js +52 -0
  44. package/dist/cli/previewChanges/utils/__tests__/isDirectoryEmpty.test.d.ts +2 -0
  45. package/dist/cli/previewChanges/utils/__tests__/isDirectoryEmpty.test.d.ts.map +1 -0
  46. package/dist/cli/previewChanges/utils/__tests__/isDirectoryEmpty.test.js +43 -0
  47. package/dist/cli/previewChanges/utils/__tests__/readDirectoryRecursive.test.d.ts +2 -0
  48. package/dist/cli/previewChanges/utils/__tests__/readDirectoryRecursive.test.d.ts.map +1 -0
  49. package/dist/cli/previewChanges/utils/__tests__/readDirectoryRecursive.test.js +32 -0
  50. package/dist/cli/previewChanges/utils/__tests__/updateOutputPaths.test.d.ts +2 -0
  51. package/dist/cli/previewChanges/utils/__tests__/updateOutputPaths.test.d.ts.map +1 -0
  52. package/dist/cli/previewChanges/utils/__tests__/updateOutputPaths.test.js +68 -0
  53. package/dist/cli/schemas/__tests__/checkConfigAndUpdate.test.d.ts +2 -0
  54. package/dist/cli/schemas/__tests__/checkConfigAndUpdate.test.d.ts.map +1 -0
  55. package/dist/cli/schemas/__tests__/checkConfigAndUpdate.test.js +36 -0
  56. package/dist/cli/schemas/__tests__/generateOptionsSchema.test.d.ts +2 -0
  57. package/dist/cli/schemas/__tests__/generateOptionsSchema.test.d.ts.map +1 -0
  58. package/dist/cli/schemas/__tests__/generateOptionsSchema.test.js +59 -0
  59. package/dist/cli/schemas/__tests__/initOptionsSchema.test.d.ts +2 -0
  60. package/dist/cli/schemas/__tests__/initOptionsSchema.test.d.ts.map +1 -0
  61. package/dist/cli/schemas/__tests__/initOptionsSchema.test.js +43 -0
  62. package/dist/cli/schemas/__tests__/previewChangesSchema.test.d.ts +2 -0
  63. package/dist/cli/schemas/__tests__/previewChangesSchema.test.d.ts.map +1 -0
  64. package/dist/cli/schemas/__tests__/previewChangesSchema.test.js +31 -0
  65. package/dist/cli/schemas/init.d.ts +1 -0
  66. package/dist/cli/schemas/init.d.ts.map +1 -1
  67. package/dist/cli/schemas/init.js +1 -0
  68. package/dist/common/Consts.d.ts.map +1 -1
  69. package/dist/common/Consts.js +1 -0
  70. package/dist/common/VersionedSchema/AllVersionedSchemas/UnifiedBase.d.ts +1 -0
  71. package/dist/common/VersionedSchema/AllVersionedSchemas/UnifiedBase.d.ts.map +1 -1
  72. package/dist/common/VersionedSchema/AllVersionedSchemas/UnifiedOptionsSchemaV1.d.ts +2 -0
  73. package/dist/common/VersionedSchema/AllVersionedSchemas/UnifiedOptionsSchemaV1.d.ts.map +1 -1
  74. package/dist/common/VersionedSchema/AllVersionedSchemas/UnifiedOptionsSchemaV2.d.ts +2 -0
  75. package/dist/common/VersionedSchema/AllVersionedSchemas/UnifiedOptionsSchemaV2.d.ts.map +1 -1
  76. package/dist/common/VersionedSchema/AllVersionedSchemas/UnifiedOptionsSchemaV3.d.ts +2 -0
  77. package/dist/common/VersionedSchema/AllVersionedSchemas/UnifiedOptionsSchemaV3.d.ts.map +1 -1
  78. package/dist/common/VersionedSchema/AllVersionedSchemas/UnifiedOptionsSchemaV4.d.ts +2 -0
  79. package/dist/common/VersionedSchema/AllVersionedSchemas/UnifiedOptionsSchemaV4.d.ts.map +1 -1
  80. package/dist/common/VersionedSchema/AllVersionedSchemas/UnifiedOptionsSchemaV5.d.ts +2 -0
  81. package/dist/common/VersionedSchema/AllVersionedSchemas/UnifiedOptionsSchemaV5.d.ts.map +1 -1
  82. package/dist/common/VersionedSchema/AllVersionedSchemas/UnifiedVersionedSchemas.d.ts +11 -0
  83. package/dist/common/VersionedSchema/AllVersionedSchemas/UnifiedVersionedSchemas.d.ts.map +1 -1
  84. package/dist/common/VersionedSchema/CommonSchemas.d.ts +2 -0
  85. package/dist/common/VersionedSchema/CommonSchemas.d.ts.map +1 -1
  86. package/dist/common/VersionedSchema/CommonSchemas.js +1 -0
  87. package/dist/common/VersionedSchema/MultiOptionsVersioned/MultiOptionsMigrationPlan.d.ts.map +1 -1
  88. package/dist/common/VersionedSchema/MultiOptionsVersioned/MultiOptionsMigrationPlan.js +1 -0
  89. package/dist/common/VersionedSchema/MultiOptionsVersioned/MultiOptionsSchemaV3.d.ts +1 -0
  90. package/dist/common/VersionedSchema/MultiOptionsVersioned/MultiOptionsSchemaV3.d.ts.map +1 -1
  91. package/dist/common/VersionedSchema/MultiOptionsVersioned/MultiOptionsSchemaV4.d.ts +1 -0
  92. package/dist/common/VersionedSchema/MultiOptionsVersioned/MultiOptionsSchemaV4.d.ts.map +1 -1
  93. package/dist/common/VersionedSchema/MultiOptionsVersioned/MultiOptionsSchemaV5.d.ts +1 -0
  94. package/dist/common/VersionedSchema/MultiOptionsVersioned/MultiOptionsSchemaV5.d.ts.map +1 -1
  95. package/dist/common/VersionedSchema/OptionsVersioned/OptionsMigrationPlans.d.ts.map +1 -1
  96. package/dist/common/VersionedSchema/OptionsVersioned/OptionsMigrationPlans.js +1 -0
  97. package/dist/common/VersionedSchema/OptionsVersioned/OptionsSchemaV3.d.ts +1 -0
  98. package/dist/common/VersionedSchema/OptionsVersioned/OptionsSchemaV3.d.ts.map +1 -1
  99. package/dist/common/VersionedSchema/OptionsVersioned/OptionsSchemaV4.d.ts +1 -0
  100. package/dist/common/VersionedSchema/OptionsVersioned/OptionsSchemaV4.d.ts.map +1 -1
  101. package/dist/common/VersionedSchema/Utils/__mocks__/compatibilityCases.d.ts.map +1 -1
  102. package/dist/common/VersionedSchema/Utils/__mocks__/compatibilityCases.js +8 -2
  103. package/dist/common/utils/__tests__/convertArrayToObject.test.js +3 -0
  104. package/dist/common/utils/convertArrayToObject.d.ts.map +1 -1
  105. package/dist/common/utils/convertArrayToObject.js +2 -0
  106. package/dist/core/OpenApiClient.d.ts.map +1 -1
  107. package/dist/core/OpenApiClient.js +6 -1
  108. package/dist/core/WriteClient.d.ts +3 -1
  109. package/dist/core/WriteClient.d.ts.map +1 -1
  110. package/dist/core/WriteClient.js +3 -2
  111. package/dist/core/utils/GenerationCache.d.ts +18 -0
  112. package/dist/core/utils/GenerationCache.d.ts.map +1 -0
  113. package/dist/core/utils/GenerationCache.js +41 -0
  114. package/dist/core/utils/__tests__/GenerationCache.test.d.ts +2 -0
  115. package/dist/core/utils/__tests__/GenerationCache.test.d.ts.map +1 -0
  116. package/dist/core/utils/__tests__/GenerationCache.test.js +37 -0
  117. package/dist/core/utils/__tests__/loadDiffReport.test.d.ts +2 -0
  118. package/dist/core/utils/__tests__/loadDiffReport.test.d.ts.map +1 -0
  119. package/dist/core/utils/__tests__/loadDiffReport.test.js +97 -0
  120. package/dist/core/utils/__tests__/templateRendering.test.d.ts +2 -0
  121. package/dist/core/utils/__tests__/templateRendering.test.d.ts.map +1 -0
  122. package/dist/core/utils/__tests__/templateRendering.test.js +119 -0
  123. package/dist/core/utils/__tests__/writeClientServices.test.js +1 -0
  124. package/dist/core/utils/__tests__/writeFileIfChanged.test.d.ts +2 -0
  125. package/dist/core/utils/__tests__/writeFileIfChanged.test.d.ts.map +1 -0
  126. package/dist/core/utils/__tests__/writeFileIfChanged.test.js +30 -0
  127. package/dist/core/utils/writeClientCore.d.ts +2 -0
  128. package/dist/core/utils/writeClientCore.d.ts.map +1 -1
  129. package/dist/core/utils/writeClientCore.js +5 -4
  130. package/dist/core/utils/writeClientServices.d.ts +2 -0
  131. package/dist/core/utils/writeClientServices.d.ts.map +1 -1
  132. package/dist/core/utils/writeClientServices.js +2 -1
  133. package/dist/core/utils/writeFileIfChanged.d.ts +3 -0
  134. package/dist/core/utils/writeFileIfChanged.d.ts.map +1 -0
  135. package/dist/core/utils/writeFileIfChanged.js +22 -0
  136. package/dist/templatesCompiled/cli/customRequest.d.ts +6 -2
  137. package/dist/templatesCompiled/cli/customRequest.d.ts.map +1 -1
  138. package/dist/templatesCompiled/cli/customRequest.js +28 -8
  139. package/dist/templatesCompiled/cli/customRequestExecutor.d.ts +3 -0
  140. package/dist/templatesCompiled/cli/customRequestExecutor.d.ts.map +1 -1
  141. package/dist/templatesCompiled/cli/customRequestExecutor.js +28 -5
  142. package/dist/templatesCompiled/client/core/axios/request.d.ts +6 -2
  143. package/dist/templatesCompiled/client/core/axios/request.d.ts.map +1 -1
  144. package/dist/templatesCompiled/client/core/axios/request.js +22 -2
  145. package/dist/templatesCompiled/client/core/executor/createExecutorAdapter.d.ts +5 -2
  146. package/dist/templatesCompiled/client/core/executor/createExecutorAdapter.d.ts.map +1 -1
  147. package/dist/templatesCompiled/client/core/executor/createExecutorAdapter.js +42 -12
  148. package/dist/templatesCompiled/client/core/executor/requestExecutor.d.ts +2 -0
  149. package/dist/templatesCompiled/client/core/executor/requestExecutor.d.ts.map +1 -1
  150. package/dist/templatesCompiled/client/core/executor/requestExecutor.js +11 -3
  151. package/dist/templatesCompiled/client/core/fetch/request.d.ts +6 -2
  152. package/dist/templatesCompiled/client/core/fetch/request.d.ts.map +1 -1
  153. package/dist/templatesCompiled/client/core/fetch/request.js +22 -2
  154. package/dist/templatesCompiled/client/core/interceptors/withInterceptors.d.ts +2 -0
  155. package/dist/templatesCompiled/client/core/interceptors/withInterceptors.d.ts.map +1 -1
  156. package/dist/templatesCompiled/client/core/interceptors/withInterceptors.js +11 -3
  157. package/dist/templatesCompiled/client/core/node/request.d.ts +6 -2
  158. package/dist/templatesCompiled/client/core/node/request.d.ts.map +1 -1
  159. package/dist/templatesCompiled/client/core/node/request.js +22 -2
  160. package/dist/templatesCompiled/client/core/xhr/request.d.ts +6 -2
  161. package/dist/templatesCompiled/client/core/xhr/request.d.ts.map +1 -1
  162. package/dist/templatesCompiled/client/core/xhr/request.js +22 -2
  163. package/dist/templatesCompiled/client/exportService.d.ts +11 -9
  164. package/dist/templatesCompiled/client/exportService.d.ts.map +1 -1
  165. package/dist/templatesCompiled/client/exportService.js +82 -64
  166. package/package.json +1 -2
package/README.rus.md CHANGED
@@ -14,7 +14,6 @@
14
14
  ![lines-image]
15
15
  ![Minimum node.js version](https://badgen.net/npm/node/next)
16
16
 
17
-
18
17
  > Node.js библиотека, которая генерирует клиенты Typescript на основе спецификации OpenAPI.
19
18
 
20
19
  ## Почему?
@@ -31,969 +30,24 @@
31
30
  - Поддерживает strict-диагностику OpenAPI с JSON-отчетом (`--strict-openapi`, `--report-file`)
32
31
  - Поддерживает плагины генератора (`plugins`), включая встроенный `x-typescript-type`
33
32
  - Поддерживает генерацию бинарных request/response (`format: binary` -> `Blob`)
33
+ - Поддерживает opt-in кэш генерации и инкрементальную запись (`--cache`, `--cachePath`, `--cacheStrategy`, `--cacheDebug`)
34
34
 
35
35
  ## Установка
36
36
 
37
- ```
38
- npm install ts-openapi-codegen --save-dev
39
- ```
40
-
41
- ## Использование
42
-
43
- CLI инструмент поддерживает шесть команд: `generate`, `check-config`, `update-config`, `init`, `preview-changes` и `analyze-diff`.
44
-
45
- ### Команда: `generate`
46
-
47
- Генерирует TypeScript клиент на основе спецификаций OpenAPI.
48
-
49
- **Базовое использование:**
50
- ```bash
51
- openapi generate --input ./spec.json --output ./dist
52
- ```
53
-
54
- **Все доступные опции:**
55
-
56
- | Опция | Короткая | Тип | По умолчанию | Описание |
57
- |-------|----------|-----|--------------|----------|
58
- | `--input` | `-i` | string | - | Спецификация OpenAPI (путь, URL или строковое содержимое) - **обязательно** |
59
- | `--output` | `-o` | string | - | Выходная директория - **обязательно** |
60
- | `--openapi-config` | `-ocn` | string | `openapi.config.json` | Путь к файлу конфигурации |
61
- | `--outputCore` | `-oc` | string | `{output}` | Выходная директория для core файлов |
62
- | `--outputServices` | `-os` | string | `{output}` | Выходная директория для сервисов |
63
- | `--outputModels` | `-om` | string | `{output}` | Выходная директория для моделей |
64
- | `--outputSchemas` | `-osm` | string | `{output}` | Выходная директория для схем |
65
- | `--httpClient` | `-c` | string | `fetch` | HTTP клиент для генерации: `fetch`, `xhr`, `node`, или `axios` |
66
- | `--useOptions` | - | boolean | `false` | Использовать опции вместо аргументов |
67
- | `--useUnionTypes` | - | boolean | `false` | Использовать union типы вместо enums |
68
- | `--excludeCoreServiceFiles` | - | boolean | `false` | Исключить генерацию core и сервисных файлов |
69
- | `--request` | - | string | - | Путь к пользовательскому файлу запросов |
70
- | `--customExecutorPath` | - | string | - | Путь к пользовательскому модулю `createExecutorAdapter` |
71
- | `--interfacePrefix` | - | string | `I` | Префикс для интерфейсов моделей |
72
- | `--enumPrefix` | - | string | `E` | Префикс для enum моделей |
73
- | `--typePrefix` | - | string | `T` | Префикс для type моделей |
74
- | `--useCancelableRequest` | - | boolean | `false` | Использовать отменяемый promise как тип возврата |
75
- | `--sortByRequired` | `-s` | boolean | `false` | Использовать расширенную стратегию сортировки для аргументов функций |
76
- | `--useSeparatedIndexes` | - | boolean | `false` | Использовать отдельные index файлы для core, models, schemas и services |
77
- | `--strict-openapi` | - | boolean | `false` | Включить строгую диагностику OpenAPI и завершать генерацию при strict-ошибках |
78
- | `--report-file` | - | string | `./openapi-report.json` | Путь к JSON-файлу strict-отчета по диагностике OpenAPI |
79
- | `--logLevel` | `-l` | string | `error` | Уровень логирования: `info`, `warn`, или `error` |
80
- | `--logTarget` | `-t` | string | `console` | Цель логирования: `console` или `file` |
81
- | `--validationLibrary` | - | string | `none` | Библиотека валидации для генерации схем: `none`, `zod`, `joi`, `yup`, или `jsonschema` |
82
- | `--emptySchemaStrategy` | - | string | `keep` | Стратегия для пустых схем: `keep`, `semantic`, или `skip` |
83
- | `--modelsMode` | - | string | `interfaces` | Режим генерации моделей: `interfaces` или `classes` |
84
- | `--useHistory` | - | boolean | `false` | Применять diff-отчёт при генерации |
85
- | `--diffReport` | - | string | `./openapi-diff-report.json` | Путь к diff-отчёту |
86
- | `--useProjectPrettier` | - | boolean | `false` | Форматировать сгенерированный код конфигом Prettier проекта |
87
- | `--useEslintFix` | - | boolean | `false` | Запускать ESLint `--fix` для сгенерированных файлов после записи (нужен `eslint` в проекте) |
88
-
89
- **Примеры:**
90
- ```bash
91
- # Базовая генерация
92
- openapi generate --input ./spec.json --output ./dist
93
-
94
- # С пользовательским HTTP клиентом
95
- openapi generate --input ./spec.json --output ./dist --httpClient axios
96
-
97
- # С файлом конфигурации
98
- openapi generate --openapi-config ./my-config.json
99
-
100
- # Со всеми опциями через CLI
101
- openapi generate \
102
- --input ./spec.json \
103
- --output ./dist \
104
- --httpClient fetch \
105
- --useOptions \
106
- --useUnionTypes \
107
- --logLevel info
108
- ```
109
-
110
- ### Команда: `check-config`
111
-
112
- Проверяет структуру и значения файла конфигурации.
113
-
114
- **Использование:**
115
- ```bash
116
- openapi check-config
117
- openapi check-config --openapi-config ./custom-config.json
118
- ```
119
-
120
- **Опции:**
121
- - `--openapi-config` / `-ocn` - Путь к файлу конфигурации (по умолчанию: `openapi.config.json`)
122
-
123
- ### Команда: `update-config`
124
-
125
- Обновляет файл конфигурации до последней поддерживаемой версии схемы.
126
-
127
- **Использование:**
128
37
  ```bash
129
- openapi update-config
130
- openapi update-config --openapi-config ./custom-config.json
131
- ```
132
-
133
- **Опции:**
134
- - `--openapi-config` / `-ocn` - Путь к файлу конфигурации (по умолчанию: `openapi.config.json`)
135
-
136
- ### Команда: `init`
137
-
138
- Генерирует шаблон файла конфигурации.
139
-
140
- **Использование:**
141
- ```bash
142
- # Генерация шаблона с настройками по умолчанию
143
- openapi init
144
-
145
- # Пользовательское имя файла конфигурации
146
- openapi init --openapi-config ./my-config.json
147
-
148
- # Явно указать директорию со спецификациями OpenAPI
149
- openapi init --specs-dir ./openapi
150
- ```
151
-
152
- **Опции:**
153
- - `--openapi-config` / `-ocn` - Путь к выходному файлу конфигурации (по умолчанию: `openapi.config.json`)
154
- - `--specs-dir` / `-sd` - Директория с файлами OpenAPI спецификаций (по умолчанию: `./openapi`)
155
- - `--request` - Путь к пользовательскому request-файлу
156
- - `--useCancelableRequest` - Включить генерацию cancelable request
157
- - `--useInteractiveMode` - Включить интерактивный режим настройки
158
-
159
- ### Команда: `preview-changes`
160
-
161
- Показывает различия между уже сгенерированным кодом и новым результатом генерации без перезаписи текущей директории generated-кода.
162
-
163
- **Использование:**
164
- ```bash
165
- openapi preview-changes
166
- openapi preview-changes --openapi-config ./custom-config.json
167
- ```
168
-
169
- **Опции:**
170
- - `--openapi-config` / `-ocn` - Путь к файлу конфигурации (по умолчанию: `openapi.config.json`)
171
- - `--generated-dir` / `-gd` - Директория с текущим generated-кодом (по умолчанию: `./generated`)
172
- - `--preview-dir` / `-pd` - Временная директория для preview-генерации (по умолчанию: `./.ts-openapi-codegen-preview-changes`)
173
- - `--diff-dir` / `-dd` - Директория для diff-отчетов (по умолчанию: `./.ts-openapi-codegen-diff-changes`)
174
-
175
- ### Команда: `analyze-diff`
176
-
177
- Анализирует изменения между двумя версиями OpenAPI и формирует JSON‑отчет.
178
-
179
- **Использование:**
180
- ```bash
181
- openapi analyze-diff --input ./openapi/current.yaml --compare-with ./openapi/previous.yaml --output-report ./openapi-diff-report.json
182
- openapi analyze-diff --input ./openapi/spec.yaml --git HEAD~1
183
- ```
184
-
185
- **Опции:**
186
- - `--input` / `-i` - Путь к текущей спецификации OpenAPI (обязательно)
187
- - `--compare-with` - Путь к предыдущей спецификации
188
- - `--git` - Git ref для чтения предыдущей версии спецификации (например, `HEAD~1`)
189
- - `--output-report` - Путь для сохранения diff‑отчёта (по умолчанию: `./openapi-diff-report.json`)
190
-
191
- #### Miracles и подтверждение
192
-
193
- В diff‑отчёте может быть раздел `miracles` с обнаруженными переименованиями/коэрсингом типов. В генерации применяются только подтверждённые записи.
194
-
195
- **Как подтверждать чудеса:**
196
- 1. Запустите `analyze-diff` и откройте отчёт (по умолчанию: `./openapi-diff-report.json`).
197
- 2. Найдите нужную запись в `miracles`.
198
- 3. Измените `"status": "auto-generated"` на `"status": "confirmed"` и закоммитьте отчёт.
199
-
200
- Пример (фрагмент):
201
- ```json
202
- {
203
- "miracles": [
204
- {
205
- "oldPath": "$.components.schemas.User.properties.user_name",
206
- "newPath": "$.components.schemas.User.properties.userName",
207
- "type": "RENAME",
208
- "confidence": 0.85,
209
- "status": "confirmed"
210
- }
211
- ]
212
- }
213
- ```
214
-
215
- ### Файл конфигурации
216
-
217
- Вместо передачи всех опций через CLI, вы можете использовать файл конфигурации. Создайте `openapi.config.json` в корне вашего проекта:
218
-
219
- **Формат с одним набором опций:**
220
- ```json
221
- {
222
- "input": "./spec.json",
223
- "output": "./dist",
224
- "client": "fetch",
225
- "useOptions": false,
226
- "useUnionTypes": false,
227
- "excludeCoreServiceFiles": false,
228
- "interfacePrefix": "I",
229
- "enumPrefix": "E",
230
- "typePrefix": "T",
231
- "useCancelableRequest": false,
232
- "sortByRequired": false,
233
- "useSeparatedIndexes": false,
234
- "request": "./custom-request.ts",
235
- "customExecutorPath": "./custom/createExecutorAdapter.ts",
236
- "modelsMode": "interfaces",
237
- "useHistory": false,
238
- "diffReport": "./openapi-diff-report.json",
239
- "models": {
240
- "mode": "interfaces"
241
- },
242
- "analyze": {
243
- "useHistory": false,
244
- "reportPath": "./openapi-diff-report.json"
245
- },
246
- "miracles": {
247
- "enabled": true,
248
- "confidence": 1,
249
- "types": ["RENAME", "TYPE_COERCION"]
250
- },
251
- "plugins": ["./plugins/custom-type.plugin.cjs"],
252
- "customExecutorPath": "./custom/createExecutorAdapter.ts"
253
- }
254
- ```
255
-
256
- **Формат с несколькими наборами опций (с общим блоком):**
257
- ```json
258
- {
259
- "output": "./dist",
260
- "client": "fetch",
261
- "excludeCoreServiceFiles": true,
262
- "items": [
263
- {
264
- "input": "./first.yml"
265
- },
266
- {
267
- "input": "./second.yml",
268
- "output": "./dist-v2"
269
- }
270
- ]
271
- }
272
- ```
273
-
274
- **Формат массива (несколько конфигураций):**
275
- ```json
276
- [
277
- {
278
- "input": "./first.yml",
279
- "output": "./dist",
280
- "client": "xhr"
281
- },
282
- {
283
- "input": "./second.yml",
284
- "output": "./dist",
285
- "client": "fetch"
286
- }
287
- ]
288
- ```
289
-
290
- | Имя | Тип | По умолчанию | Описание |
291
- |-----|-----|--------------|----------|
292
- | `input` | string | - | Путь/URL спецификации OpenAPI (обязательно для items) |
293
- | `output` | string | - | Выходная директория (обязательно) |
294
- | `outputCore` | string | `{output}` | Выходная директория для core файлов |
295
- | `outputServices` | string | `{output}` | Выходная директория для сервисов |
296
- | `outputModels` | string | `{output}` | Выходная директория для моделей |
297
- | `outputSchemas` | string | `{output}` | Выходная директория для схем |
298
- | `client` | string | `fetch` | HTTP клиент: `fetch`, `xhr`, `node`, или `axios` |
299
- | `useOptions` | boolean | `false` | Использовать опции вместо аргументов |
300
- | `useUnionTypes` | boolean | `false` | Использовать union типы вместо enums |
301
- | `excludeCoreServiceFiles` | boolean | `false` | Исключить генерацию core и сервисных файлов |
302
- | `request` | string | - | Путь к пользовательскому файлу запросов |
303
- | `plugins` | string[] | `[]` | Пути к плагинам генератора |
304
- | `customExecutorPath` | string | - | Путь к пользовательскому модулю `createExecutorAdapter` |
305
- | `interfacePrefix` | string | `I` | Префикс для интерфейсов моделей |
306
- | `enumPrefix` | string | `E` | Префикс для enum моделей |
307
- | `typePrefix` | string | `T` | Префикс для type моделей |
308
- | `useCancelableRequest` | boolean | `false` | Использовать отменяемый promise как тип возврата |
309
- | `sortByRequired` | boolean | `false` | Расширенная стратегия сортировки для аргументов |
310
- | `useSeparatedIndexes` | boolean | `false` | Использовать отдельные index файлы |
311
- | `strictOpenapi` | boolean | `false` | Включить строгую диагностику OpenAPI и падать на strict-ошибках |
312
- | `reportFile` | string | `./openapi-report.json` | Путь к JSON-файлу strict-отчета по диагностике OpenAPI |
313
- | `items` | array | - | Массив конфигураций (для формата multi-options) |
314
- | `validationLibrary` | string | `none` | Библиотека валидации для генерации схем: `none`, `zod`, `joi`, `yup`, или `jsonschema` |
315
- | `emptySchemaStrategy` | string | `keep` | Стратегия для пустых схем: `keep`, `semantic`, или `skip` |
316
- | `modelsMode` | string | `interfaces` | Режим генерации моделей: `interfaces` или `classes` |
317
- | `useHistory` | boolean | `false` | Применять diff‑отчёт при генерации |
318
- | `diffReport` | string | `./openapi-diff-report.json` | Путь к diff‑отчёту |
319
- | `models` | object | - | Секция конфигурации моделей (например, `mode`) |
320
- | `analyze` | object | - | Секция анализа (например, reportPath, useHistory, ignore) |
321
- | `miracles` | object | - | Секция чудес (enabled, confidence, types) |
322
-
323
- **Примечание:** Вы можете использовать команду `init` для генерации шаблона файла конфигурации.
324
-
325
- ### Плагины
326
-
327
- Плагины генератора позволяют переопределять маппинг типов схем (например через `x-typescript-type`) и расширять поведение генерации.
328
-
329
- - Ключ конфигурации: `plugins` (массив путей к модулям)
330
- - Поддерживаемые форматы модулей: CJS, ESM и TS (если рантайм поддерживает импорт TS)
331
- - Подробная документация: [docs/plugins.md](./docs/plugins.md)
332
-
333
- ## Примеры
334
-
335
- ### Использование CLI команд
336
-
337
- **Базовая генерация:**
338
- ```bash
339
- openapi generate --input ./spec.json --output ./dist
340
- ```
341
-
342
- **С файлом конфигурации:**
343
- ```bash
344
- # Сначала создайте файл конфигурации
345
- openapi init
346
-
347
- # Затем выполните генерацию
348
- openapi generate
349
- ```
350
-
351
- **С DTO моделями (режим classes):**
352
- ```bash
353
- openapi generate --input ./spec.json --output ./dist --modelsMode classes
354
- ```
355
-
356
- **Сгенерировать diff‑отчёт:**
357
- ```bash
358
- openapi analyze-diff --input ./openapi/current.yaml --compare-with ./openapi/previous.yaml --output-report ./openapi-diff-report.json
359
- ```
360
-
361
- **Проверка конфигурации:**
362
- ```bash
363
- openapi check-config
364
- openapi update-config
365
- ```
366
-
367
- **Предпросмотр изменений перед применением:**
368
- ```bash
369
- openapi preview-changes
370
- ```
371
-
372
- ### Использование NPX
373
-
374
- ```bash
375
- npx ts-openapi-codegen generate --input ./spec.json --output ./dist
376
- ```
377
-
378
- ### Использование скриптов в package.json
379
-
380
- **package.json**
381
- ```json
382
- {
383
- "scripts": {
384
- "generate": "openapi generate --input ./spec.json --output ./dist",
385
- "generate:config": "openapi generate",
386
- "check-config": "openapi check-config",
387
- "update-config": "openapi update-config",
388
- "init-config": "openapi init",
389
- "preview-changes": "openapi preview-changes"
390
- }
391
- }
392
- ```
393
-
394
- ### Node.js API
395
-
396
- ```javascript
397
- const OpenAPI = require('ts-openapi-codegen');
398
-
399
- OpenAPI.generate({
400
- input: './spec.json',
401
- output: './dist'
402
- });
403
-
404
- // Или передав содержимое спецификации напрямую 🚀
405
- OpenAPI.generate({
406
- input: require('./spec.json'),
407
- output: './dist'
408
- });
409
- ```
410
-
411
-
412
- ## Возможности
413
-
414
- ### HTTP Клиенты
415
-
416
- Генератор поддерживает несколько HTTP клиентов:
417
- - **fetch** (по умолчанию) - Browser Fetch API
418
- - **xhr** - XMLHttpRequest
419
- - **node** - Node.js совместимый клиент, использующий `node-fetch`
420
- - **axios** - Axios HTTP клиент
421
-
422
- Выберите клиент используя опцию `--httpClient` или свойство `client` в файле конфигурации.
423
-
424
- ### Стиль аргументов vs. Стиль объектов `--useOptions`
425
- В JavaScript или TypeScript нет [именованных параметров](https://en.wikipedia.org/wiki/Named_parameter), поэтому
426
- мы предлагаем флаг `--useOptions` для генерации кода в двух разных стилях.
427
-
428
- **Стиль аргументов:**
429
- ```typescript
430
- function createUser(name: string, password: string, type?: string, address?: string) {
431
- // ...
432
- }
433
-
434
- // Использование
435
- createUser('Jack', '123456', undefined, 'NY US');
436
- ```
437
-
438
- **Стиль объектов:**
439
- ```typescript
440
- function createUser({ name, password, type, address }: {
441
- name: string,
442
- password: string,
443
- type?: string
444
- address?: string
445
- }) {
446
- // ...
447
- }
448
-
449
- // Использование
450
- createUser({
451
- name: 'Jack',
452
- password: '123456',
453
- address: 'NY US'
454
- });
455
- ```
456
-
457
- ### Enums vs. Union Types `--useUnionTypes`
458
- Спецификация OpenAPI позволяет определять [enums](https://swagger.io/docs/specification/data-models/enums/) внутри
459
- модели данных. По умолчанию мы конвертируем эти определения enums в [TypeScript enums](https://www.typescriptlang.org/docs/handbook/enums.html).
460
- Однако эти enums объединяются внутри namespace модели, что не поддерживается Babel, [см. документацию](https://babeljs.io/docs/en/babel-plugin-transform-typescript#impartial-namespace-support).
461
- Поскольку мы также хотим поддерживать проекты, использующие Babel [@babel/plugin-transform-typescript](https://babeljs.io/docs/en/babel-plugin-transform-typescript),
462
- мы предлагаем флаг `--useUnionTypes` для генерации [union типов](https://www.typescriptlang.org/docs/handbook/unions-and-intersections.html#union-types)
463
- вместо традиционных enums. Разницу можно увидеть ниже:
464
-
465
- **Enums:**
466
- ```typescript
467
- // Модель
468
- export interface Order {
469
- id?: number;
470
- quantity?: number;
471
- status?: Order.status;
472
- }
473
-
474
- export namespace Order {
475
- export enum status {
476
- PLACED = 'placed',
477
- APPROVED = 'approved',
478
- DELIVERED = 'delivered',
479
- }
480
- }
481
-
482
- // Использование
483
- const order: Order = {
484
- id: 1,
485
- quantity: 40,
486
- status: Order.status.PLACED
487
- }
488
- ```
489
-
490
- **Union Types:**
491
- ```typescript
492
- // Модель
493
- export interface Order {
494
- id?: number;
495
- quantity?: number;
496
- status?: 'placed' | 'approved' | 'delivered';
497
- }
498
-
499
- // Использование
500
- const order: Order = {
501
- id: 1,
502
- quantity: 40,
503
- status: 'placed'
504
- }
505
- ```
506
-
507
- ### Схемы проверки `--validationLibrary`
508
- По умолчанию генератор OpenAPI экспортирует только интерфейсы для ваших моделей. Эти интерфейсы помогут вам во время
509
- разработки, но не будут доступны в JavaScript во время выполнения. Однако OpenAPI позволяет определять свойства,
510
- которые могут быть полезны во время выполнения, например: `maxLength` строки или `pattern` для сопоставления и т.д.
511
-
512
- Параметр `--validationLibrary` позволяет генерировать схемы валидации времени выполнения с использованием популярных библиотек валидации:
513
- - **none** (по умолчанию) - Схемы валидации не генерируются
514
- - **zod** - Генерация схем валидации Zod
515
- - **joi** - Генерация схем валидации Joi
516
- - **yup** - Генерация схем валидации Yup
517
- - **jsonschema** - Генерация схем валидации JSON Schema
518
-
519
- Если включен `--useHistory` и в diff‑отчёте есть смена типа, валидаторы будут пытаться выполнять коэрсинг:
520
- - **Zod** использует `z.coerce.*`
521
- - **Joi** использует `Joi.alternatives().try(...)`
522
- - **Yup** использует `.transform(...)`
523
- - **JSON Schema (AJV)** включает `coerceTypes`
524
-
525
- ### Режим моделей `--modelsMode`
526
-
527
- По умолчанию модели генерируются как интерфейсы/типы. При `--modelsMode classes` генератор создаёт:
528
- - `*Raw` интерфейсы (JSON‑формат API)
529
- - `*Dto` классы с геттерами, дефолтами, рекурсивными конструкторами и `toJSON()`
530
-
531
- Вывод консолидируется в один файл `models.ts`, а `BaseDto`/`dtoUtils` добавляются в `core`.
532
-
533
- Допустим, у нас есть следующая модель:
534
-
535
- ```json
536
- {
537
- "MyModel": {
538
- "required": [
539
- "key",
540
- "name"
541
- ],
542
- "type": "object",
543
- "properties": {
544
- "key": {
545
- "maxLength": 64,
546
- "pattern": "^[a-zA-Z0-9_]*$",
547
- "type": "string"
548
- },
549
- "name": {
550
- "maxLength": 255,
551
- "type": "string"
552
- },
553
- "enabled": {
554
- "type": "boolean",
555
- "readOnly": true
556
- },
557
- "modified": {
558
- "type": "string",
559
- "format": "date-time",
560
- "readOnly": true
561
- }
562
- }
563
- }
564
- }
565
- ```
566
-
567
- **С Zod (`--validationLibrary zod`):**
568
-
569
- ```ts
570
- import { z } from 'zod';
571
-
572
- export const MyModelSchema = z.object({
573
- key: z.string().max(64).regex(/^[a-zA-Z0-9_]*$/),
574
- name: z.string().max(255),
575
- enabled: z.boolean().readonly().optional(),
576
- modified: z.string().datetime().readonly().optional(),
577
- });
578
-
579
- export type MyModel = z.infer<typeof MyModelSchema>;
580
-
581
- export function validateMyModel(data: unknown): MyModel {
582
- return MyModelSchema.parse(data);
583
- }
584
-
585
- export function safeValidateMyModel(data: unknown): { success: true; data: MyModel } | { success: false; error: z.ZodError } {
586
- const result = MyModelSchema.safeParse(data);
587
- if (result.success) {
588
- return { success: true, data: result.data };
589
- }
590
- return { success: false, error: result.error };
591
- }
592
- ```
593
-
594
- **С Joi (`--validationLibrary joi`):**
595
-
596
- ```ts
597
- import Joi from 'joi';
598
-
599
- export const MyModelSchema = Joi.object({
600
- key: Joi.string().max(64).pattern(/^[a-zA-Z0-9_]*$/).required(),
601
- name: Joi.string().max(255).required(),
602
- enabled: Joi.boolean().readonly(),
603
- modified: Joi.string().isoDate().readonly(),
604
- });
605
- ```
606
-
607
- **С Yup (`--validationLibrary yup`):**
608
-
609
- ```ts
610
- import * as yup from 'yup';
611
-
612
- export const MyModelSchema = yup.object({
613
- key: yup.string().max(64).matches(/^[a-zA-Z0-9_]*$/).required(),
614
- name: yup.string().max(255).required(),
615
- enabled: yup.boolean().readonly(),
616
- modified: yup.string().datetime().readonly(),
617
- });
618
- ```
619
-
620
- **С JSON Schema (`--validationLibrary jsonschema`):**
621
-
622
- ```ts
623
- export const MyModelSchema = {
624
- type: 'object',
625
- required: ['key', 'name'],
626
- properties: {
627
- key: {
628
- type: 'string',
629
- maxLength: 64,
630
- pattern: '^[a-zA-Z0-9_]*$',
631
- },
632
- name: {
633
- type: 'string',
634
- maxLength: 255,
635
- },
636
- enabled: {
637
- type: 'boolean',
638
- readOnly: true,
639
- },
640
- modified: {
641
- type: 'string',
642
- format: 'date-time',
643
- readOnly: true,
644
- },
645
- },
646
- };
647
- ```
648
-
649
- Эти схемы валидации могут быть использованы для генерации форм, валидации ввода и проверки типов во время выполнения в вашем приложении.
650
-
651
- ### Отменяемый promise `--useCancelableRequest`
652
- По умолчанию генератор OpenAPI генерирует сервисы для доступа к API, которые используют неотменяемые запросы. Поэтому мы добавили возможность переключить генератор на генерацию отменяемых API запросов. Для этого используйте флаг `--useCancelableRequest`.
653
- Пример отменяемого запроса будет выглядеть так:
654
-
655
- ```typescript
656
- export function request<T>(config: TOpenAPIConfig, options: ApiRequestOptions): CancelablePromise<T> {
657
- return new CancelablePromise(async(resolve, reject, onCancel) => {
658
- const url = `${config.BASE}${options.path}`.replace('{api-version}', config.VERSION);
659
- try {
660
- if (!onCancel.isCancelled) {
661
- const response = await sendRequest(options, url, config, onCancel);
662
- const responseBody = await getResponseBody(response);
663
- const responseHeader = getResponseHeader(response, options.responseHeader);
664
- const result: ApiResult = {
665
- url,
666
- ok: response.ok,
667
- status: response.status,
668
- statusText: response.statusText,
669
- body: responseHeader || responseBody,
670
- };
671
-
672
- catchErrors(options, result);
673
- resolve(result.body);
674
- }
675
- } catch (e) {
676
- reject(e);
677
- }
678
- });
679
- }
680
- ```
681
-
682
- ### RequestExecutor
683
-
684
- Начиная с версии **2.0.0**, сгенерированные сервисы используют интерфейс `RequestExecutor`
685
- вместо прямых вызовов core-функции `request`.
686
-
687
- `RequestExecutor` — это единая точка интеграции HTTP-логики, отвечающая за выполнение запросов
688
- и расширение поведения клиента. Он позволяет:
689
- - использовать любой транспорт (fetch / axios / xhr / custom);
690
- - централизованно обрабатывать запросы, ответы и ошибки;
691
- - расширять поведение клиента без изменения сгенерированных сервисов.
692
-
693
- #### Interceptors
694
-
695
- `RequestExecutor` поддерживает **interceptors**, которые позволяют внедрять дополнительную
696
- логику на разных этапах жизненного цикла запроса:
697
-
698
- - `onRequest` — модификация запроса перед отправкой (headers, auth, логирование);
699
- - `onResponse` — обработка успешных ответов;
700
- - `onError` — централизованная обработка ошибок.
701
-
702
- Interceptors применяются на уровне executor’а и автоматически используются всеми
703
- сгенерированными сервисами.
704
-
705
- ```ts
706
- import { createClient } from './generated';
707
-
708
- const client = createClient({
709
- interceptors: {
710
- onRequest: [
711
- (config) => ({
712
- ...config,
713
- headers: {
714
- ...config.headers,
715
- Authorization: 'Bearer token',
716
- },
717
- }),
718
- ],
719
- onError: [
720
- (error) => {
721
- console.error(error);
722
- throw error;
723
- },
724
- ],
725
- },
726
- });
727
- ```
728
-
729
- #### Пользовательская реализация RequestExecutor с interceptors
730
-
731
- Пользовательский `RequestExecutor` может быть использован вместе с interceptors.
732
- В этом случае executor отвечает только за транспорт и выполнение запроса,
733
- а interceptors — за расширяемую бизнес-логику (авторизация, логирование, обработка ошибок).
734
-
735
- ```ts
736
- import type { RequestExecutor, RequestConfig } from './generated/core/executor/requestExecutor';
737
- import { withInterceptors } from './generated/core/interceptors/withInterceptors';
738
- import { SimpleService } from './generated/services/SimpleService';
739
-
740
- interface MyCustomOptions {
741
- timeout?: number;
742
- }
743
-
744
- const baseExecutor: RequestExecutor<MyCustomOptions> = {
745
- async request<T>(config: RequestConfig, options?: MyCustomOptions): Promise<T> {
746
- const response = await fetch(config.url, {
747
- method: config.method,
748
- headers: config.headers,
749
- body: config.body ? JSON.stringify(config.body) : undefined,
750
- signal: options?.timeout
751
- ? AbortSignal.timeout(options.timeout)
752
- : undefined,
753
- });
754
-
755
- if (!response.ok) {
756
- throw new Error(`Request failed: ${response.status}`);
757
- }
758
-
759
- return response.json();
760
- },
761
- };
762
-
763
- // Оборачиваем executor interceptors
764
- const executor = withInterceptors(baseExecutor, {
765
- onRequest: [
766
- (config) => ({
767
- ...config,
768
- headers: {
769
- ...config.headers,
770
- Authorization: 'Bearer token',
771
- },
772
- }),
773
- ],
774
- onError: [
775
- (error) => {
776
- console.error(error);
777
- throw error;
778
- },
779
- ],
780
- });
781
-
782
- const service = new SimpleService(executor);
783
- await service.getCallWithoutParametersAndResponse({ timeout: 5000 });
784
- ```
785
-
786
- #### Использование сгенерированного `createClient` с `customExecutorPath` и `executorFactory`
787
-
788
- Если в конфигурации генерации задан `customExecutorPath`, в `createClient.ts` будет импортирован ваш
789
- пользовательский `createExecutorAdapter`, и он станет базовым executor по умолчанию.
790
-
791
- Дополнительно в runtime можно передать `executorFactory`, чтобы обернуть/расширить этот базовый executor
792
- (retry, tracing, metrics и т.д.) без изменения сгенерированных сервисов.
793
-
794
- ```ts
795
- import { createClient } from './generated';
796
-
797
- const client = createClient({
798
- executorFactory: ({ openApiConfig, createDefaultExecutor }) => {
799
- const baseExecutor = createDefaultExecutor();
800
-
801
- return {
802
- async request<TResponse>(config, options) {
803
- console.debug('Request to', openApiConfig.BASE, config.path);
804
- return baseExecutor.request<TResponse>(config, options);
805
- },
806
- };
807
- },
808
- });
809
- ```
810
-
811
- ### Стратегия сортировки аргументов функций `--sortByRequired`
812
- По умолчанию генератор OpenAPI сортирует параметры сервисных функций согласно упрощенной схеме. Если вам нужна более строгая опция сортировки, используйте флаг `--sortByRequired`. Упрощенная опция сортировки похожа на ту, что использовалась в версии 0.2.3 генератора OpenAPI. Этот флаг позволяет обновиться до новой версии генератора, если вы "застряли" на версии 0.2.3.
813
-
814
- ### Отдельные index файлы `--useSeparatedIndexes`
815
- По умолчанию генератор создает один index файл, который экспортирует весь сгенерированный код. С флагом `--useSeparatedIndexes` вы можете генерировать отдельные index файлы для core, models, schemas и services, что может помочь с лучшей организацией кода и tree-shaking.
816
-
817
- ### Enum с пользовательскими именами и описаниями
818
- Вы можете использовать `x-enum-varnames` и `x-enum-descriptions` в вашей спецификации для генерации enum с пользовательскими именами и описаниями.
819
- Это еще не в официальной [спецификации](https://github.com/OAI/OpenAPI-Specification/issues/681). Но это поддерживаемое расширение,
820
- которое может помочь разработчикам использовать более осмысленные перечислители.
821
- ```json
822
- {
823
- "EnumWithStrings": {
824
- "description": "This is a simple enum with strings",
825
- "enum": [
826
- 0,
827
- 1,
828
- 2
829
- ],
830
- "x-enum-varnames": [
831
- "Success",
832
- "Warning",
833
- "Error"
834
- ],
835
- "x-enum-descriptions": [
836
- "Used when the status of something is successful",
837
- "Used when the status of something has a warning",
838
- "Used when the status of something has an error"
839
- ]
840
- }
841
- }
842
- ```
843
-
844
- Сгенерированный код:
845
- ```typescript
846
- enum EnumWithStrings {
847
- /*
848
- * Used when the status of something is successful
849
- */
850
- Success = 0,
851
- /*
852
- * Used when the status of something has a warning
853
- */
854
- Waring = 1,
855
- /*
856
- * Used when the status of something has an error
857
- */
858
- Error = 2,
859
- }
860
- ```
861
-
862
-
863
- ### Nullable в OpenAPI v2
864
- В спецификации OpenAPI v3 вы можете создавать свойства, которые могут быть NULL, указав `nullable: true` в вашей схеме.
865
- Однако спецификация v2 не позволяет этого делать. Вы можете использовать неофициальный `x-nullable` в вашей спецификации
866
- для генерации nullable свойств в OpenApi v2.
867
-
868
- ```json
869
- {
870
- "ModelWithNullableString": {
871
- "required": ["requiredProp"],
872
- "description": "This is a model with one string property",
873
- "type": "object",
874
- "properties": {
875
- "prop": {
876
- "description": "This is a simple string property",
877
- "type": "string",
878
- "x-nullable": true
879
- },
880
- "requiredProp": {
881
- "description": "This is a simple string property",
882
- "type": "string",
883
- "x-nullable": true
884
- }
885
- }
886
- }
887
- }
888
- ```
889
-
890
- Сгенерированный код:
891
- ```typescript
892
- interface ModelWithNullableString {
893
- prop?: string | null,
894
- requiredProp: string | null,
895
- }
896
- ```
897
-
898
-
899
- ### Авторизация
900
- Генератор OpenAPI поддерживает авторизацию Bearer Token. Для включения отправки
901
- токенов в каждом запросе вы можете установить токен используя глобальную конфигурацию OpenAPI:
902
-
903
- ```typescript
904
- import { OpenAPI } from './generated';
905
-
906
- OpenAPI.TOKEN = 'some-bearer-token';
907
- ```
908
-
909
- Альтернативно, мы также поддерживаем асинхронный метод, который предоставляет токен для каждого запроса.
910
- Вы можете просто назначить этот метод тому же свойству `TOKEN` в глобальном объекте OpenAPI.
911
-
912
- ```typescript
913
- import { OpenAPI } from './generated';
914
-
915
- const getToken = async () => {
916
- // Какой-то код, который запрашивает токен...
917
- return 'SOME_TOKEN';
918
- }
919
-
920
- OpenAPI.TOKEN = getToken;
921
- ```
922
-
923
- ### Ссылки
924
-
925
- Локальные ссылки на определения схем (начинающиеся с `#/definitions/schemas/`)
926
- будут преобразованы в ссылки на типы к эквивалентному сгенерированному типу верхнего уровня.
927
-
928
- Генератор OpenAPI также поддерживает внешние ссылки, что позволяет разбить
929
- ваш openapi.yml на несколько подфайлов или включить сторонние схемы
930
- как часть ваших типов, чтобы обеспечить возможность генерации TypeScript для всего.
931
-
932
- Внешние ссылки могут быть:
933
- * *относительными ссылками* - ссылки на другие файлы в том же расположении, например
934
- `{ $ref: 'schemas/customer.yml' }`
935
- * *удаленными ссылками* - полностью квалифицированные ссылки на другое удаленное расположение
936
- например `{ $ref: 'https://myexampledomain.com/schemas/customer_schema.yml' }`
937
-
938
- Для удаленных ссылок поддерживаются как файлы (когда файл находится в текущей файловой системе),
939
- так и http(s) URL.
940
-
941
- Внешние ссылки также могут содержать внутренние пути во внешней схеме (например,
942
- `schemas/collection.yml#/definitions/schemas/Customer`) и обратные ссылки на
943
- базовый файл openapi или между файлами (так что вы можете ссылаться на другую
944
- схему в главном файле как тип свойства объекта или массива, например).
945
-
946
- При запуске файл OpenAPI или Swagger с внешними ссылками будет "собран",
947
- так что все внешние ссылки и обратные ссылки будут разрешены (но локальные
948
- ссылки сохранены).
949
-
950
- FAQ
951
- ===
952
-
953
- ### Поддержка Babel
954
- Если вы используете enums внутри ваших моделей / определений, то эти enums по умолчанию находятся внутри namespace с тем же именем,
955
- что и ваша модель. Это называется объединением объявлений. Однако [@babel/plugin-transform-typescript](https://babeljs.io/docs/en/babel-plugin-transform-typescript)
956
- не поддерживает эти namespace, поэтому если вы используете babel в вашем проекте, пожалуйста используйте флаг `--useUnionTypes`
957
- для генерации union типов вместо традиционных enums. Больше информации можно найти здесь: [Enums vs. Union Types](#enums-vs-union-types---useuniontypes).
958
-
959
- **Примечание:** Если вы используете Babel 7 и Typescript 3.8 (или выше), то вы должны включить `onlyRemoveTypeImports` для
960
- игнорирования любых импортов 'type only', см. https://babeljs.io/docs/en/babel-preset-typescript#onlyremovetypeimports для большей информации
961
-
962
- ```javascript
963
- module.exports = {
964
- presets: [
965
- ['@babel/preset-typescript', {
966
- onlyRemoveTypeImports: true,
967
- }],
968
- ],
969
- };
970
- ```
971
-
972
-
973
- ### Поддержка Node.js
974
- По умолчанию эта библиотека будет генерировать клиент, совместимый с (браузерным) [fetch API](https://developer.mozilla.org/en-US/docs/Web/API/Fetch_API),
975
- однако этот клиент не будет работать в среде Node.js. Если вы хотите сгенерировать клиент, совместимый с Node.js, то
976
- вы можете указать `--httpClient node` в вызове openapi:
977
-
978
- `openapi generate --input ./spec.json --output ./dist --httpClient node`
979
-
980
- Это сгенерирует клиент, который использует [`node-fetch`](https://www.npmjs.com/package/node-fetch) внутри. Однако,
981
- для компиляции и запуска этого клиента вам нужно установить зависимости `node-fetch`:
982
-
983
- ```
984
- npm install @types/node-fetch --save-dev
985
- npm install node-fetch --save-dev
986
- npm install form-data --save-dev
38
+ npm install ts-openapi-codegen --save-dev
987
39
  ```
988
40
 
989
- Для компиляции проекта и разрешения импортов вам нужно включить `allowSyntheticDefaultImports`
990
- в вашем файле `tsconfig.json`.
41
+ ## Документация
991
42
 
992
- ```json
993
- {
994
- "allowSyntheticDefaultImports": true
995
- }
996
- ```
43
+ - [Использование](docs/ru/usage.md)
44
+ - [Файл конфигурации](docs/ru/configuration.md)
45
+ - [Примеры](docs/ru/examples.md)
46
+ - [Возможности](docs/ru/features.md)
47
+ - [Плагины](docs/ru/plugins.md)
48
+ - [Plugin API v2 (RFC)](docs/ru/plugin-api-v2.md)
49
+ - [English README](README.md)
50
+ - [English docs](docs/en/usage.md)
997
51
 
998
52
  [npm-url]: https://www.npmjs.com/package/ts-openapi-codegen
999
53
  [npm-image]: https://img.shields.io/npm/v/ts-openapi-codegen.svg