ts-openapi-codegen 2.1.0-beta.5 → 2.1.0-beta.7

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 (210) hide show
  1. package/README.md +3 -0
  2. package/README.rus.md +3 -0
  3. package/dist/cli/analyzeDiff/__tests__/analyzeDiff.cli.test.js +9 -0
  4. package/dist/cli/analyzeDiff/__tests__/analyzeDiffRenameAndInvalidRegex.test.js +9 -0
  5. package/dist/cli/analyzeDiff/__tests__/analyzeDiffTypeCoercion.test.js +9 -0
  6. package/dist/cli/analyzeUsage/analyzeUsage.d.ts +4 -0
  7. package/dist/cli/analyzeUsage/analyzeUsage.d.ts.map +1 -0
  8. package/dist/cli/analyzeUsage/analyzeUsage.js +62 -0
  9. package/dist/cli/analyzeUsage/core/Analyzer.d.ts +9 -0
  10. package/dist/cli/analyzeUsage/core/Analyzer.d.ts.map +1 -0
  11. package/dist/cli/analyzeUsage/core/Analyzer.js +29 -0
  12. package/dist/cli/analyzeUsage/core/ProjectContext.d.ts +10 -0
  13. package/dist/cli/analyzeUsage/core/ProjectContext.d.ts.map +1 -0
  14. package/dist/cli/analyzeUsage/core/ProjectContext.js +63 -0
  15. package/dist/cli/analyzeUsage/core/Scanner.d.ts +15 -0
  16. package/dist/cli/analyzeUsage/core/Scanner.d.ts.map +1 -0
  17. package/dist/cli/analyzeUsage/core/Scanner.js +115 -0
  18. package/dist/cli/analyzeUsage/rules/ClientRule.d.ts +6 -0
  19. package/dist/cli/analyzeUsage/rules/ClientRule.d.ts.map +1 -0
  20. package/dist/cli/analyzeUsage/rules/ClientRule.js +78 -0
  21. package/dist/cli/analyzeUsage/rules/CoverageRule.d.ts +7 -0
  22. package/dist/cli/analyzeUsage/rules/CoverageRule.d.ts.map +1 -0
  23. package/dist/cli/analyzeUsage/rules/CoverageRule.js +63 -0
  24. package/dist/cli/analyzeUsage/rules/DiagnosticsRule.d.ts +6 -0
  25. package/dist/cli/analyzeUsage/rules/DiagnosticsRule.d.ts.map +1 -0
  26. package/dist/cli/analyzeUsage/rules/DiagnosticsRule.js +60 -0
  27. package/dist/cli/analyzeUsage/rules/ImportRule.d.ts +6 -0
  28. package/dist/cli/analyzeUsage/rules/ImportRule.d.ts.map +1 -0
  29. package/dist/cli/analyzeUsage/rules/ImportRule.js +52 -0
  30. package/dist/cli/analyzeUsage/rules/ModelRule.d.ts +6 -0
  31. package/dist/cli/analyzeUsage/rules/ModelRule.d.ts.map +1 -0
  32. package/dist/cli/analyzeUsage/rules/ModelRule.js +38 -0
  33. package/dist/cli/analyzeUsage/rules/SchemaRule.d.ts +6 -0
  34. package/dist/cli/analyzeUsage/rules/SchemaRule.d.ts.map +1 -0
  35. package/dist/cli/analyzeUsage/rules/SchemaRule.js +48 -0
  36. package/dist/cli/analyzeUsage/rules/ServiceRule.d.ts +7 -0
  37. package/dist/cli/analyzeUsage/rules/ServiceRule.d.ts.map +1 -0
  38. package/dist/cli/analyzeUsage/rules/ServiceRule.js +92 -0
  39. package/dist/cli/analyzeUsage/types.d.ts +52 -0
  40. package/dist/cli/analyzeUsage/types.d.ts.map +1 -0
  41. package/dist/cli/analyzeUsage/types.js +2 -0
  42. package/dist/cli/analyzeUsage/utils/fuzzy.d.ts +5 -0
  43. package/dist/cli/analyzeUsage/utils/fuzzy.d.ts.map +1 -0
  44. package/dist/cli/analyzeUsage/utils/fuzzy.js +38 -0
  45. package/dist/cli/analyzeUsage/utils/report.d.ts +16 -0
  46. package/dist/cli/analyzeUsage/utils/report.d.ts.map +1 -0
  47. package/dist/cli/analyzeUsage/utils/report.js +85 -0
  48. package/dist/cli/checkAndUpdateConfig/__tests__/checkConfig.test.d.ts +2 -0
  49. package/dist/cli/checkAndUpdateConfig/__tests__/checkConfig.test.d.ts.map +1 -0
  50. package/dist/cli/checkAndUpdateConfig/__tests__/checkConfig.test.js +53 -0
  51. package/dist/cli/checkAndUpdateConfig/__tests__/updateConfig.test.d.ts +2 -0
  52. package/dist/cli/checkAndUpdateConfig/__tests__/updateConfig.test.d.ts.map +1 -0
  53. package/dist/cli/checkAndUpdateConfig/__tests__/updateConfig.test.js +52 -0
  54. package/dist/cli/checkAndUpdateConfig/checkConfig.d.ts +2 -1
  55. package/dist/cli/checkAndUpdateConfig/checkConfig.d.ts.map +1 -1
  56. package/dist/cli/checkAndUpdateConfig/checkConfig.js +8 -4
  57. package/dist/cli/checkAndUpdateConfig/updateConfig.d.ts +2 -1
  58. package/dist/cli/checkAndUpdateConfig/updateConfig.d.ts.map +1 -1
  59. package/dist/cli/checkAndUpdateConfig/updateConfig.js +6 -3
  60. package/dist/cli/checkAndUpdateConfig/utils/__tests__/prepareConfigData.test.d.ts +2 -0
  61. package/dist/cli/checkAndUpdateConfig/utils/__tests__/prepareConfigData.test.d.ts.map +1 -0
  62. package/dist/cli/checkAndUpdateConfig/utils/__tests__/prepareConfigData.test.js +20 -0
  63. package/dist/cli/checkAndUpdateConfig/utils/__tests__/removeDefaultConfigValues.test.d.ts +2 -0
  64. package/dist/cli/checkAndUpdateConfig/utils/__tests__/removeDefaultConfigValues.test.d.ts.map +1 -0
  65. package/dist/cli/checkAndUpdateConfig/utils/__tests__/removeDefaultConfigValues.test.js +35 -0
  66. package/dist/cli/checkAndUpdateConfig/utils/__tests__/validateAndMigrateConfigData.test.d.ts +2 -0
  67. package/dist/cli/checkAndUpdateConfig/utils/__tests__/validateAndMigrateConfigData.test.d.ts.map +1 -0
  68. package/dist/cli/checkAndUpdateConfig/utils/__tests__/validateAndMigrateConfigData.test.js +59 -0
  69. package/dist/cli/checkAndUpdateConfig/utils/validateAndMigrateConfigData.d.ts.map +1 -1
  70. package/dist/cli/checkAndUpdateConfig/utils/validateAndMigrateConfigData.js +19 -1
  71. package/dist/cli/generateOpenApiClient/__tests__/generateOpenApiClient.strict.test.js +18 -9
  72. package/dist/cli/generateOpenApiClient/generateOpenApiClient.d.ts +2 -5
  73. package/dist/cli/generateOpenApiClient/generateOpenApiClient.d.ts.map +1 -1
  74. package/dist/cli/generateOpenApiClient/generateOpenApiClient.js +12 -16
  75. package/dist/cli/index.js +41 -7
  76. package/dist/cli/initOpenApiConfig/__tests__/init.test.d.ts +2 -0
  77. package/dist/cli/initOpenApiConfig/__tests__/init.test.d.ts.map +1 -0
  78. package/dist/cli/initOpenApiConfig/__tests__/init.test.js +20 -0
  79. package/dist/cli/initOpenApiConfig/__tests__/initConfig.test.d.ts +2 -0
  80. package/dist/cli/initOpenApiConfig/__tests__/initConfig.test.d.ts.map +1 -0
  81. package/dist/cli/initOpenApiConfig/__tests__/initConfig.test.js +49 -0
  82. package/dist/cli/initOpenApiConfig/init.d.ts +2 -1
  83. package/dist/cli/initOpenApiConfig/init.d.ts.map +1 -1
  84. package/dist/cli/initOpenApiConfig/init.js +3 -1
  85. package/dist/cli/initOpenApiConfig/utils/__tests__/buildConfig.test.d.ts +2 -0
  86. package/dist/cli/initOpenApiConfig/utils/__tests__/buildConfig.test.d.ts.map +1 -0
  87. package/dist/cli/initOpenApiConfig/utils/__tests__/buildConfig.test.js +99 -0
  88. package/dist/cli/initOpenApiConfig/utils/__tests__/findSpecFiles.test.d.ts +2 -0
  89. package/dist/cli/initOpenApiConfig/utils/__tests__/findSpecFiles.test.d.ts.map +1 -0
  90. package/dist/cli/initOpenApiConfig/utils/__tests__/findSpecFiles.test.js +45 -0
  91. package/dist/cli/initOpenApiConfig/utils/__tests__/validateSpecFiles.test.d.ts +2 -0
  92. package/dist/cli/initOpenApiConfig/utils/__tests__/validateSpecFiles.test.d.ts.map +1 -0
  93. package/dist/cli/initOpenApiConfig/utils/__tests__/validateSpecFiles.test.js +61 -0
  94. package/dist/cli/previewChanges/previewChanges.d.ts +2 -1
  95. package/dist/cli/previewChanges/previewChanges.d.ts.map +1 -1
  96. package/dist/cli/previewChanges/previewChanges.js +6 -6
  97. package/dist/cli/previewChanges/utils/__tests__/compareFiles.test.d.ts +2 -0
  98. package/dist/cli/previewChanges/utils/__tests__/compareFiles.test.d.ts.map +1 -0
  99. package/dist/cli/previewChanges/utils/__tests__/compareFiles.test.js +52 -0
  100. package/dist/cli/previewChanges/utils/__tests__/isDirectoryEmpty.test.d.ts +2 -0
  101. package/dist/cli/previewChanges/utils/__tests__/isDirectoryEmpty.test.d.ts.map +1 -0
  102. package/dist/cli/previewChanges/utils/__tests__/isDirectoryEmpty.test.js +43 -0
  103. package/dist/cli/previewChanges/utils/__tests__/readDirectoryRecursive.test.d.ts +2 -0
  104. package/dist/cli/previewChanges/utils/__tests__/readDirectoryRecursive.test.d.ts.map +1 -0
  105. package/dist/cli/previewChanges/utils/__tests__/readDirectoryRecursive.test.js +32 -0
  106. package/dist/cli/previewChanges/utils/__tests__/updateOutputPaths.test.d.ts +2 -0
  107. package/dist/cli/previewChanges/utils/__tests__/updateOutputPaths.test.d.ts.map +1 -0
  108. package/dist/cli/previewChanges/utils/__tests__/updateOutputPaths.test.js +68 -0
  109. package/dist/cli/schemas/__tests__/checkConfigAndUpdate.test.d.ts +2 -0
  110. package/dist/cli/schemas/__tests__/checkConfigAndUpdate.test.d.ts.map +1 -0
  111. package/dist/cli/schemas/__tests__/checkConfigAndUpdate.test.js +36 -0
  112. package/dist/cli/schemas/__tests__/generateOptionsSchema.test.d.ts +2 -0
  113. package/dist/cli/schemas/__tests__/generateOptionsSchema.test.d.ts.map +1 -0
  114. package/dist/cli/schemas/__tests__/generateOptionsSchema.test.js +59 -0
  115. package/dist/cli/schemas/__tests__/initOptionsSchema.test.d.ts +2 -0
  116. package/dist/cli/schemas/__tests__/initOptionsSchema.test.d.ts.map +1 -0
  117. package/dist/cli/schemas/__tests__/initOptionsSchema.test.js +43 -0
  118. package/dist/cli/schemas/__tests__/previewChangesSchema.test.d.ts +2 -0
  119. package/dist/cli/schemas/__tests__/previewChangesSchema.test.d.ts.map +1 -0
  120. package/dist/cli/schemas/__tests__/previewChangesSchema.test.js +31 -0
  121. package/dist/cli/schemas/analyzeUsage.d.ts +13 -0
  122. package/dist/cli/schemas/analyzeUsage.d.ts.map +1 -0
  123. package/dist/cli/schemas/analyzeUsage.js +38 -0
  124. package/dist/cli/schemas/generate.d.ts +7 -0
  125. package/dist/cli/schemas/generate.d.ts.map +1 -1
  126. package/dist/cli/schemas/generate.js +4 -0
  127. package/dist/cli/schemas/index.d.ts +2 -2
  128. package/dist/cli/schemas/index.d.ts.map +1 -1
  129. package/dist/cli/schemas/index.js +1 -1
  130. package/dist/cli/types.d.ts +6 -0
  131. package/dist/cli/types.d.ts.map +1 -0
  132. package/dist/cli/types.js +2 -0
  133. package/dist/common/Consts.d.ts +1 -0
  134. package/dist/common/Consts.d.ts.map +1 -1
  135. package/dist/common/Consts.js +6 -1
  136. package/dist/common/Logger.js +2 -2
  137. package/dist/common/LoggerMessages.d.ts +59 -12
  138. package/dist/common/LoggerMessages.d.ts.map +1 -1
  139. package/dist/common/LoggerMessages.js +62 -15
  140. package/dist/common/VersionedSchema/AllVersionedSchemas/UnifiedOptionsSchemaV5.d.ts +7 -0
  141. package/dist/common/VersionedSchema/AllVersionedSchemas/UnifiedOptionsSchemaV5.d.ts.map +1 -1
  142. package/dist/common/VersionedSchema/AllVersionedSchemas/UnifiedOptionsSchemaV5.js +5 -1
  143. package/dist/common/VersionedSchema/AllVersionedSchemas/UnifiedVersionedSchemas.d.ts +14 -0
  144. package/dist/common/VersionedSchema/AllVersionedSchemas/UnifiedVersionedSchemas.d.ts.map +1 -1
  145. package/dist/common/VersionedSchema/Utils/__mocks__/compatibilityCases.d.ts.map +1 -1
  146. package/dist/common/VersionedSchema/Utils/__mocks__/compatibilityCases.js +6 -1
  147. package/dist/common/VersionedSchema/Utils/migrateDataToLatestSchemaVersion.d.ts.map +1 -1
  148. package/dist/common/VersionedSchema/Utils/migrateDataToLatestSchemaVersion.js +1 -1
  149. package/dist/core/OpenApiClient.d.ts +12 -1
  150. package/dist/core/OpenApiClient.d.ts.map +1 -1
  151. package/dist/core/OpenApiClient.js +192 -10
  152. package/dist/core/WriteClient.d.ts +11 -0
  153. package/dist/core/WriteClient.d.ts.map +1 -1
  154. package/dist/core/WriteClient.js +23 -2
  155. package/dist/core/plugins/getBuiltinPlugins.d.ts.map +1 -1
  156. package/dist/core/plugins/loadGeneratorPlugins.d.ts.map +1 -1
  157. package/dist/core/plugins/loadGeneratorPlugins.js +1 -1
  158. package/dist/core/types/shared/Client.model.d.ts +1 -1
  159. package/dist/core/types/shared/Client.model.d.ts.map +1 -1
  160. package/dist/core/types/shared/Model.model.d.ts +1 -1
  161. package/dist/core/types/shared/Model.model.d.ts.map +1 -1
  162. package/dist/core/utils/GenerationCache.d.ts +18 -0
  163. package/dist/core/utils/GenerationCache.d.ts.map +1 -0
  164. package/dist/core/utils/GenerationCache.js +41 -0
  165. package/dist/core/utils/__tests__/GenerationCache.test.d.ts +2 -0
  166. package/dist/core/utils/__tests__/GenerationCache.test.d.ts.map +1 -0
  167. package/dist/core/utils/__tests__/GenerationCache.test.js +37 -0
  168. package/dist/core/utils/__tests__/loadDiffReport.test.d.ts +2 -0
  169. package/dist/core/utils/__tests__/loadDiffReport.test.d.ts.map +1 -0
  170. package/dist/core/utils/__tests__/loadDiffReport.test.js +97 -0
  171. package/dist/core/utils/__tests__/prepareDtoModels.test.js +95 -0
  172. package/dist/core/utils/__tests__/templateRendering.test.d.ts +2 -0
  173. package/dist/core/utils/__tests__/templateRendering.test.d.ts.map +1 -0
  174. package/dist/core/utils/__tests__/templateRendering.test.js +119 -0
  175. package/dist/core/utils/__tests__/writeFileIfChanged.test.d.ts +2 -0
  176. package/dist/core/utils/__tests__/writeFileIfChanged.test.d.ts.map +1 -0
  177. package/dist/core/utils/__tests__/writeFileIfChanged.test.js +30 -0
  178. package/dist/core/utils/loadDiffReport.d.ts.map +1 -1
  179. package/dist/core/utils/loadDiffReport.js +5 -4
  180. package/dist/core/utils/precompileTemplates.js +3 -2
  181. package/dist/core/utils/prepareDtoModels.d.ts.map +1 -1
  182. package/dist/core/utils/prepareDtoModels.js +1 -7
  183. package/dist/core/utils/writeClientCore.d.ts.map +1 -1
  184. package/dist/core/utils/writeClientCore.js +18 -16
  185. package/dist/core/utils/writeClientCoreIndex.d.ts.map +1 -1
  186. package/dist/core/utils/writeClientCoreIndex.js +14 -4
  187. package/dist/core/utils/writeClientExecutor.d.ts.map +1 -1
  188. package/dist/core/utils/writeClientExecutor.js +4 -4
  189. package/dist/core/utils/writeClientFullIndex.js +4 -4
  190. package/dist/core/utils/writeClientModels.d.ts.map +1 -1
  191. package/dist/core/utils/writeClientModels.js +10 -10
  192. package/dist/core/utils/writeClientModelsIndex.d.ts +1 -1
  193. package/dist/core/utils/writeClientModelsIndex.d.ts.map +1 -1
  194. package/dist/core/utils/writeClientModelsIndex.js +14 -4
  195. package/dist/core/utils/writeClientSchemas.d.ts.map +1 -1
  196. package/dist/core/utils/writeClientSchemas.js +7 -7
  197. package/dist/core/utils/writeClientSchemasIndex.d.ts.map +1 -1
  198. package/dist/core/utils/writeClientSchemasIndex.js +14 -4
  199. package/dist/core/utils/writeClientServices.d.ts.map +1 -1
  200. package/dist/core/utils/writeClientServices.js +6 -6
  201. package/dist/core/utils/writeClientServicesIndex.d.ts.map +1 -1
  202. package/dist/core/utils/writeClientServicesIndex.js +14 -4
  203. package/dist/core/utils/writeClientSimpleIndex.js +4 -4
  204. package/dist/core/utils/writeFileIfChanged.d.ts +3 -0
  205. package/dist/core/utils/writeFileIfChanged.d.ts.map +1 -0
  206. package/dist/core/utils/writeFileIfChanged.js +22 -0
  207. package/dist/test/helpers/silenceLoggers.d.ts +11 -0
  208. package/dist/test/helpers/silenceLoggers.d.ts.map +1 -0
  209. package/dist/test/helpers/silenceLoggers.js +88 -0
  210. package/package.json +4 -4
@@ -21,11 +21,14 @@ const writeClientSchemasIndex_1 = require("./utils/writeClientSchemasIndex");
21
21
  const writeClientServices_1 = require("./utils/writeClientServices");
22
22
  const writeClientServicesIndex_1 = require("./utils/writeClientServicesIndex");
23
23
  const writeClientSimpleIndex_1 = require("./utils/writeClientSimpleIndex");
24
+ const writeFileIfChanged_1 = require("./utils/writeFileIfChanged");
24
25
  /**
25
26
  * The client which is writing all items and keep the parameters to write index file
26
27
  */
27
28
  class WriteClient {
28
29
  config = new Map();
30
+ expectedOutputFiles = new Set();
31
+ writeStats = { written: 0, unchanged: 0 };
29
32
  _logger;
30
33
  constructor(logger) {
31
34
  this._logger =
@@ -158,8 +161,8 @@ class WriteClient {
158
161
  await fileSystemHelpers_1.fileSystemHelpers.mkdir(outputPaths.outputModels);
159
162
  const shouldInlineDtoCore = modelsMode === ModelsMode_enum_1.ModelsMode.CLASSES && excludeCoreServiceFiles;
160
163
  if (shouldInlineDtoCore) {
161
- await fileSystemHelpers_1.fileSystemHelpers.writeFile((0, pathHelpers_1.resolveHelper)(outputPaths.outputModels, 'BaseDto.ts'), templates.core.baseDto({}));
162
- await fileSystemHelpers_1.fileSystemHelpers.writeFile((0, pathHelpers_1.resolveHelper)(outputPaths.outputModels, 'dtoUtils.ts'), templates.core.dtoUtils({}));
164
+ await this.writeOutputFile((0, pathHelpers_1.resolveHelper)(outputPaths.outputModels, 'BaseDto.ts'), templates.core.baseDto({}));
165
+ await this.writeOutputFile((0, pathHelpers_1.resolveHelper)(outputPaths.outputModels, 'dtoUtils.ts'), templates.core.dtoUtils({}));
163
166
  }
164
167
  await this.writeClientModels({
165
168
  models: client.models,
@@ -218,6 +221,24 @@ class WriteClient {
218
221
  get logger() {
219
222
  return this._logger;
220
223
  }
224
+ async writeOutputFile(filePath, content) {
225
+ this.expectedOutputFiles.add((0, pathHelpers_1.resolveHelper)(process.cwd(), filePath));
226
+ const result = await (0, writeFileIfChanged_1.writeFileIfChanged)(filePath, content);
227
+ this.writeStats[result] += 1;
228
+ return result;
229
+ }
230
+ registerOutputFile(filePath) {
231
+ this.expectedOutputFiles.add((0, pathHelpers_1.resolveHelper)(process.cwd(), filePath));
232
+ }
233
+ getExpectedOutputFiles() {
234
+ return this.expectedOutputFiles;
235
+ }
236
+ getExpectedOutputFilesArray() {
237
+ return Array.from(this.expectedOutputFiles);
238
+ }
239
+ getWriteStats() {
240
+ return { ...this.writeStats };
241
+ }
221
242
  buildSimpleClientIndexMap() {
222
243
  const result = new Map();
223
244
  for (const [key, value] of this.config.entries()) {
@@ -1 +1 @@
1
- {"version":3,"file":"getBuiltinPlugins.d.ts","sourceRoot":"","sources":["../../../src/core/plugins/getBuiltinPlugins.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,sBAAsB,EAAE,MAAM,yBAAyB,CAAC;AAGjE;;GAEG;AACH,wBAAgB,iBAAiB,IAAI,sBAAsB,EAAE,CAE5D"}
1
+ {"version":3,"file":"getBuiltinPlugins.d.ts","sourceRoot":"","sources":["../../../src/core/plugins/getBuiltinPlugins.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,sBAAsB,EAAE,MAAM,yBAAyB,CAAC;AAEjE;;GAEG;AACH,wBAAgB,iBAAiB,IAAI,sBAAsB,EAAE,CAE5D"}
@@ -1 +1 @@
1
- {"version":3,"file":"loadGeneratorPlugins.d.ts","sourceRoot":"","sources":["../../../src/core/plugins/loadGeneratorPlugins.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,sBAAsB,EAAE,MAAM,yBAAyB,CAAC;AAiDjE;;GAEG;AACH,wBAAsB,oBAAoB,CAAC,WAAW,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,sBAAsB,EAAE,CAAC,CAcnG"}
1
+ {"version":3,"file":"loadGeneratorPlugins.d.ts","sourceRoot":"","sources":["../../../src/core/plugins/loadGeneratorPlugins.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,sBAAsB,EAAE,MAAM,yBAAyB,CAAC;AAgDjE;;GAEG;AACH,wBAAsB,oBAAoB,CAAC,WAAW,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,sBAAsB,EAAE,CAAC,CAcnG"}
@@ -34,9 +34,9 @@ var __importStar = (this && this.__importStar) || (function () {
34
34
  })();
35
35
  Object.defineProperty(exports, "__esModule", { value: true });
36
36
  exports.loadGeneratorPlugins = loadGeneratorPlugins;
37
+ const node_url_1 = require("node:url");
37
38
  const pathHelpers_1 = require("../../common/utils/pathHelpers");
38
39
  const getBuiltinPlugins_1 = require("./getBuiltinPlugins");
39
- const node_url_1 = require("node:url");
40
40
  /**
41
41
  * Type guard for runtime plugin objects.
42
42
  */
@@ -1,5 +1,5 @@
1
- import type { Model } from './Model.model';
2
1
  import type { MiracleEntry } from './Miracle.model';
2
+ import type { Model } from './Model.model';
3
3
  import type { Service } from './Service.model';
4
4
  export interface Client {
5
5
  version: string;
@@ -1 +1 @@
1
- {"version":3,"file":"Client.model.d.ts","sourceRoot":"","sources":["../../../../src/core/types/shared/Client.model.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AAC3C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AACpD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;AAE/C,MAAM,WAAW,MAAM;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,KAAK,EAAE,CAAC;IAChB,QAAQ,EAAE,OAAO,EAAE,CAAC;IACpB,QAAQ,CAAC,EAAE,YAAY,EAAE,CAAC;CAC7B"}
1
+ {"version":3,"file":"Client.model.d.ts","sourceRoot":"","sources":["../../../../src/core/types/shared/Client.model.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AACpD,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AAC3C,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;AAE/C,MAAM,WAAW,MAAM;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,KAAK,EAAE,CAAC;IAChB,QAAQ,EAAE,OAAO,EAAE,CAAC;IACpB,QAAQ,CAAC,EAAE,YAAY,EAAE,CAAC;CAC7B"}
@@ -1,5 +1,5 @@
1
- import type { Enum } from './Enum.model';
2
1
  import type { DiffInfo } from './DiffInfo.model';
2
+ import type { Enum } from './Enum.model';
3
3
  import { Import } from './Import.model';
4
4
  import type { Schema } from './Schema.model';
5
5
  export interface Model extends Schema {
@@ -1 +1 @@
1
- {"version":3,"file":"Model.model.d.ts","sourceRoot":"","sources":["../../../../src/core/types/shared/Model.model.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,cAAc,CAAC;AACzC,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AACxC,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AAE7C,MAAM,WAAW,KAAM,SAAQ,MAAM;IACjC,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,WAAW,GAAG,SAAS,GAAG,MAAM,GAAG,OAAO,GAAG,YAAY,GAAG,WAAW,GAAG,QAAQ,GAAG,QAAQ,GAAG,QAAQ,CAAC;IACjH,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,IAAI,EAAE,KAAK,GAAG,IAAI,CAAC;IACnB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,IAAI,EAAE,IAAI,EAAE,CAAC;IACb,KAAK,EAAE,KAAK,EAAE,CAAC;IACf,UAAU,EAAE,KAAK,EAAE,CAAC;IACpB,eAAe,CAAC,EAAE,KAAK,EAAE,CAAC;IAC1B,IAAI,CAAC,EAAE,QAAQ,CAAC;IAChB,cAAc,CAAC,EAAE,QAAQ,EAAE,CAAC;IAC5B,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC;IAC5B,UAAU,CAAC,EAAE;QACT,OAAO,EAAE,MAAM,CAAC;QAChB,OAAO,EAAE,MAAM,CAAC;QAChB,MAAM,EAAE,MAAM,CAAC;QACf,UAAU,CAAC,EAAE,MAAM,CAAC;KACvB,EAAE,CAAC;IACJ,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,OAAO,CAAC;CACzB"}
1
+ {"version":3,"file":"Model.model.d.ts","sourceRoot":"","sources":["../../../../src/core/types/shared/Model.model.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,cAAc,CAAC;AACzC,OAAO,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AACxC,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AAE7C,MAAM,WAAW,KAAM,SAAQ,MAAM;IACjC,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,WAAW,GAAG,SAAS,GAAG,MAAM,GAAG,OAAO,GAAG,YAAY,GAAG,WAAW,GAAG,QAAQ,GAAG,QAAQ,GAAG,QAAQ,CAAC;IACjH,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,IAAI,EAAE,KAAK,GAAG,IAAI,CAAC;IACnB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,IAAI,EAAE,IAAI,EAAE,CAAC;IACb,KAAK,EAAE,KAAK,EAAE,CAAC;IACf,UAAU,EAAE,KAAK,EAAE,CAAC;IACpB,eAAe,CAAC,EAAE,KAAK,EAAE,CAAC;IAC1B,IAAI,CAAC,EAAE,QAAQ,CAAC;IAChB,cAAc,CAAC,EAAE,QAAQ,EAAE,CAAC;IAC5B,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC;IAC5B,UAAU,CAAC,EAAE;QACT,OAAO,EAAE,MAAM,CAAC;QAChB,OAAO,EAAE,MAAM,CAAC;QAChB,MAAM,EAAE,MAAM,CAAC;QACf,UAAU,CAAC,EAAE,MAAM,CAAC;KACvB,EAAE,CAAC;IACJ,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,OAAO,CAAC;CACzB"}
@@ -0,0 +1,18 @@
1
+ type CacheEntry = {
2
+ key: string;
3
+ fingerprint: string;
4
+ files: string[];
5
+ updatedAt: number;
6
+ };
7
+ export declare class GenerationCache {
8
+ private readonly cachePath;
9
+ private data;
10
+ constructor(cachePath: string);
11
+ static hash(value: string): string;
12
+ load(): Promise<void>;
13
+ get(key: string): CacheEntry | undefined;
14
+ set(entry: CacheEntry): void;
15
+ save(): Promise<void>;
16
+ }
17
+ export type { CacheEntry };
18
+ //# sourceMappingURL=GenerationCache.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"GenerationCache.d.ts","sourceRoot":"","sources":["../../../src/core/utils/GenerationCache.ts"],"names":[],"mappings":"AAMA,KAAK,UAAU,GAAG;IACd,GAAG,EAAE,MAAM,CAAC;IACZ,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;CACrB,CAAC;AASF,qBAAa,eAAe;IACxB,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IACnC,OAAO,CAAC,IAAI,CAA8D;gBAE9D,SAAS,EAAE,MAAM;IAI7B,MAAM,CAAC,IAAI,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM;IAI5B,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAc3B,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,UAAU,GAAG,SAAS;IAIxC,GAAG,CAAC,KAAK,EAAE,UAAU,GAAG,IAAI;IAItB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;CAI9B;AAED,YAAY,EAAE,UAAU,EAAE,CAAC"}
@@ -0,0 +1,41 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.GenerationCache = void 0;
4
+ const crypto_1 = require("crypto");
5
+ const path_1 = require("path");
6
+ const fileSystemHelpers_1 = require("../../common/utils/fileSystemHelpers");
7
+ const pathHelpers_1 = require("../../common/utils/pathHelpers");
8
+ const CURRENT_CACHE_VERSION = 1;
9
+ class GenerationCache {
10
+ cachePath;
11
+ data = { version: CURRENT_CACHE_VERSION, entries: {} };
12
+ constructor(cachePath) {
13
+ this.cachePath = (0, pathHelpers_1.resolveHelper)(process.cwd(), cachePath);
14
+ }
15
+ static hash(value) {
16
+ return (0, crypto_1.createHash)('sha256').update(value).digest('hex');
17
+ }
18
+ async load() {
19
+ const exists = await fileSystemHelpers_1.fileSystemHelpers.exists(this.cachePath);
20
+ if (!exists) {
21
+ return;
22
+ }
23
+ const raw = await fileSystemHelpers_1.fileSystemHelpers.readFile(this.cachePath, 'utf8');
24
+ const parsed = JSON.parse(raw);
25
+ if (!parsed || parsed.version !== CURRENT_CACHE_VERSION || !parsed.entries) {
26
+ return;
27
+ }
28
+ this.data = parsed;
29
+ }
30
+ get(key) {
31
+ return this.data.entries[key];
32
+ }
33
+ set(entry) {
34
+ this.data.entries[entry.key] = entry;
35
+ }
36
+ async save() {
37
+ await fileSystemHelpers_1.fileSystemHelpers.mkdir((0, path_1.dirname)(this.cachePath));
38
+ await fileSystemHelpers_1.fileSystemHelpers.writeFile(this.cachePath, JSON.stringify(this.data, null, 2));
39
+ }
40
+ }
41
+ exports.GenerationCache = GenerationCache;
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=GenerationCache.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"GenerationCache.test.d.ts","sourceRoot":"","sources":["../../../../src/core/utils/__tests__/GenerationCache.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,37 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const strict_1 = __importDefault(require("node:assert/strict"));
7
+ const node_fs_1 = __importDefault(require("node:fs"));
8
+ const node_os_1 = __importDefault(require("node:os"));
9
+ const node_path_1 = __importDefault(require("node:path"));
10
+ const node_test_1 = require("node:test");
11
+ const GenerationCache_1 = require("../GenerationCache");
12
+ (0, node_test_1.describe)('@unit: GenerationCache', () => {
13
+ (0, node_test_1.test)('saves and loads entries', async () => {
14
+ const tmpDir = node_fs_1.default.mkdtempSync(node_path_1.default.join(node_os_1.default.tmpdir(), 'openapi-codegen-cache-'));
15
+ try {
16
+ const reportPath = node_path_1.default.join(tmpDir, 'report.json');
17
+ const cacheA = new GenerationCache_1.GenerationCache(reportPath);
18
+ await cacheA.load();
19
+ cacheA.set({
20
+ key: 'k1',
21
+ fingerprint: 'f1',
22
+ files: ['/tmp/a.ts'],
23
+ updatedAt: Date.now(),
24
+ });
25
+ await cacheA.save();
26
+ const cacheB = new GenerationCache_1.GenerationCache(reportPath);
27
+ await cacheB.load();
28
+ const entry = cacheB.get('k1');
29
+ strict_1.default.ok(entry);
30
+ strict_1.default.equal(entry?.fingerprint, 'f1');
31
+ strict_1.default.deepEqual(entry?.files, ['/tmp/a.ts']);
32
+ }
33
+ finally {
34
+ node_fs_1.default.rmSync(tmpDir, { recursive: true, force: true });
35
+ }
36
+ });
37
+ });
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=loadDiffReport.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loadDiffReport.test.d.ts","sourceRoot":"","sources":["../../../../src/core/utils/__tests__/loadDiffReport.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,97 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const node_assert_1 = __importDefault(require("node:assert"));
7
+ const node_fs_1 = __importDefault(require("node:fs"));
8
+ const node_path_1 = __importDefault(require("node:path"));
9
+ const node_test_1 = require("node:test");
10
+ const Enums_1 = require("../../../common/Enums");
11
+ const Logger_1 = require("../../../common/Logger");
12
+ const loadDiffReport_1 = require("../loadDiffReport");
13
+ const createTempDir = (t, prefix) => {
14
+ const root = node_path_1.default.join(__dirname, 'generated');
15
+ node_fs_1.default.mkdirSync(root, { recursive: true });
16
+ const tempDir = node_fs_1.default.mkdtempSync(node_path_1.default.join(root, prefix));
17
+ t.after(() => {
18
+ node_fs_1.default.rmSync(tempDir, { recursive: true, force: true });
19
+ });
20
+ return tempDir;
21
+ };
22
+ const createLogger = () => new Logger_1.Logger({
23
+ instanceId: 'load-diff-report-test',
24
+ level: Enums_1.ELogLevel.ERROR,
25
+ logOutput: Enums_1.ELogOutput.CONSOLE,
26
+ disableColors: true,
27
+ });
28
+ (0, node_test_1.describe)('@unit: loadDiffReport', () => {
29
+ (0, node_test_1.test)('returns null when history and diffReport path are disabled', () => {
30
+ const result = (0, loadDiffReport_1.loadDiffReport)({
31
+ useHistory: false,
32
+ logger: createLogger(),
33
+ });
34
+ node_assert_1.default.strictEqual(result, null);
35
+ });
36
+ (0, node_test_1.test)('returns null when report file is missing', () => {
37
+ const result = (0, loadDiffReport_1.loadDiffReport)({
38
+ useHistory: true,
39
+ diffReport: node_path_1.default.join(__dirname, 'missing-report.json'),
40
+ logger: createLogger(),
41
+ });
42
+ node_assert_1.default.strictEqual(result, null);
43
+ });
44
+ (0, node_test_1.test)('loads report with diff entries', async (t) => {
45
+ const dir = createTempDir(t, 'diff-report-');
46
+ const reportPath = node_path_1.default.join(dir, 'report.json');
47
+ const report = {
48
+ diff: {
49
+ all: [{ action: 'changed', path: '$.info.version', severity: 'info', from: '1', to: '2' }],
50
+ },
51
+ };
52
+ node_fs_1.default.writeFileSync(reportPath, JSON.stringify(report), 'utf-8');
53
+ const loaded = (0, loadDiffReport_1.loadDiffReport)({
54
+ diffReport: reportPath,
55
+ logger: createLogger(),
56
+ });
57
+ node_assert_1.default.ok(loaded);
58
+ node_assert_1.default.strictEqual(loaded?.diff?.all?.length, 1);
59
+ });
60
+ (0, node_test_1.test)('returns null for empty report without diff or miracles', async (t) => {
61
+ const dir = createTempDir(t, 'diff-report-empty-');
62
+ const reportPath = node_path_1.default.join(dir, 'empty.json');
63
+ node_fs_1.default.writeFileSync(reportPath, JSON.stringify({ diff: { all: [] }, miracles: [] }), 'utf-8');
64
+ const loaded = (0, loadDiffReport_1.loadDiffReport)({
65
+ diffReport: reportPath,
66
+ logger: createLogger(),
67
+ });
68
+ node_assert_1.default.strictEqual(loaded, null);
69
+ });
70
+ (0, node_test_1.test)('returns null when report is older than input spec', async (t) => {
71
+ const dir = createTempDir(t, 'diff-report-stale-');
72
+ const reportPath = node_path_1.default.join(dir, 'report.json');
73
+ const inputPath = node_path_1.default.join(dir, 'spec.json');
74
+ node_fs_1.default.writeFileSync(reportPath, JSON.stringify({
75
+ diff: { all: [{ action: 'changed', path: '$.info.version', severity: 'info' }] },
76
+ }), 'utf-8');
77
+ const past = Date.now() - 60_000;
78
+ node_fs_1.default.utimesSync(reportPath, past / 1000, past / 1000);
79
+ node_fs_1.default.writeFileSync(inputPath, '{"openapi":"3.0.0"}', 'utf-8');
80
+ const loaded = (0, loadDiffReport_1.loadDiffReport)({
81
+ diffReport: reportPath,
82
+ inputPath,
83
+ logger: createLogger(),
84
+ });
85
+ node_assert_1.default.strictEqual(loaded, null);
86
+ });
87
+ (0, node_test_1.test)('returns null when report JSON is invalid', async (t) => {
88
+ const dir = createTempDir(t, 'diff-report-broken-');
89
+ const reportPath = node_path_1.default.join(dir, 'broken.json');
90
+ node_fs_1.default.writeFileSync(reportPath, '{ not-json', 'utf-8');
91
+ const loaded = (0, loadDiffReport_1.loadDiffReport)({
92
+ diffReport: reportPath,
93
+ logger: createLogger(),
94
+ });
95
+ node_assert_1.default.strictEqual(loaded, null);
96
+ });
97
+ });
@@ -113,4 +113,99 @@ const createInterfaceModel = (name, properties) => ({
113
113
  node_assert_1.default.strictEqual(preparedUser?.dtoGetters?.[0].oldName, 'oldName');
114
114
  node_assert_1.default.strictEqual(preparedUser?.dtoGetters?.[0].newName, 'fullName');
115
115
  });
116
+ (0, node_test_1.test)('resolves one-of and dictionary property types', () => {
117
+ const tag = createPrimitiveModel('tag', 'string');
118
+ const tagRef = {
119
+ ...createPrimitiveModel('value', 'string'),
120
+ export: 'reference',
121
+ type: 'string',
122
+ isRequired: true,
123
+ };
124
+ const oneOfProp = {
125
+ ...createPrimitiveModel('payload', 'string | number'),
126
+ export: 'one-of',
127
+ properties: [createPrimitiveModel('a', 'string'), createPrimitiveModel('b', 'number')],
128
+ isRequired: true,
129
+ };
130
+ const dictProp = {
131
+ ...createPrimitiveModel('tags', 'Record<string, string>'),
132
+ export: 'dictionary',
133
+ link: tagRef,
134
+ isRequired: false,
135
+ };
136
+ const container = createInterfaceModel('IContainer', [oneOfProp, dictProp]);
137
+ const client = {
138
+ version: '1.0.0',
139
+ server: 'http://localhost',
140
+ models: [container, tag],
141
+ services: [],
142
+ };
143
+ const prepared = (0, prepareDtoModels_1.prepareDtoModels)(client);
144
+ const preparedContainer = prepared.models.find(model => model.name === 'IContainer');
145
+ const preparedOneOf = preparedContainer?.properties.find(prop => prop.name === 'payload');
146
+ const preparedDict = preparedContainer?.properties.find(prop => prop.name === 'tags');
147
+ node_assert_1.default.ok(preparedOneOf?.dtoType?.includes('|'));
148
+ node_assert_1.default.match(preparedDict?.dtoType ?? '', /Record<string, string>/);
149
+ });
150
+ (0, node_test_1.test)('resolves enum property types in dtoType', () => {
151
+ const statusEnum = {
152
+ ...createPrimitiveModel('Status', 'string'),
153
+ export: 'enum',
154
+ enum: [
155
+ { name: 'Active', value: "'active'", type: 'string', description: null },
156
+ { name: 'Inactive', value: "'inactive'", type: 'string', description: null },
157
+ ],
158
+ };
159
+ const statusProp = {
160
+ ...createPrimitiveModel('status', 'string'),
161
+ export: 'enum',
162
+ enum: statusEnum.enum,
163
+ isRequired: true,
164
+ };
165
+ const model = createInterfaceModel('IUser', [statusProp]);
166
+ const client = {
167
+ version: '1.0.0',
168
+ server: 'http://localhost',
169
+ models: [model, statusEnum],
170
+ services: [],
171
+ };
172
+ const prepared = (0, prepareDtoModels_1.prepareDtoModels)(client);
173
+ const property = prepared.models[0]?.properties[0];
174
+ node_assert_1.default.match(property?.dtoType ?? '', /active/);
175
+ node_assert_1.default.match(property?.dtoType ?? '', /inactive/);
176
+ });
177
+ (0, node_test_1.test)('uses optional toJSON for non-required reference properties', () => {
178
+ const profile = createInterfaceModel('IProfile', [createPrimitiveModel('bio', 'string')]);
179
+ const profileRef = {
180
+ ...createPrimitiveModel('profile', 'IProfile'),
181
+ export: 'reference',
182
+ type: 'IProfile',
183
+ isRequired: false,
184
+ };
185
+ const user = createInterfaceModel('IUser', [profileRef]);
186
+ const client = {
187
+ version: '1.0.0',
188
+ server: 'http://localhost',
189
+ models: [user, profile],
190
+ services: [],
191
+ };
192
+ const prepared = (0, prepareDtoModels_1.prepareDtoModels)(client);
193
+ const property = prepared.models.find(m => m.name === 'IUser')?.properties[0];
194
+ node_assert_1.default.match(property?.dtoInit ?? '', /\? new IProfileDto/);
195
+ node_assert_1.default.match(property?.dtoToJSON ?? '', /\? this.profile.toJSON/);
196
+ });
197
+ (0, node_test_1.test)('uses bracket accessor for quoted property names', () => {
198
+ const quotedProp = createPrimitiveModel("'weird-name'", 'string');
199
+ const model = createInterfaceModel('IQuoted', [quotedProp]);
200
+ const client = {
201
+ version: '1.0.0',
202
+ server: 'http://localhost',
203
+ models: [model],
204
+ services: [],
205
+ };
206
+ const prepared = (0, prepareDtoModels_1.prepareDtoModels)(client);
207
+ const property = prepared.models[0]?.properties[0];
208
+ node_assert_1.default.strictEqual(property?.dtoInit, "data['weird-name']");
209
+ node_assert_1.default.strictEqual(property?.dtoTarget, "['weird-name']");
210
+ });
116
211
  });
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=templateRendering.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"templateRendering.test.d.ts","sourceRoot":"","sources":["../../../../src/core/utils/__tests__/templateRendering.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,119 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const node_assert_1 = __importDefault(require("node:assert"));
7
+ const node_test_1 = require("node:test");
8
+ const HttpClient_enum_1 = require("../../types/enums/HttpClient.enum");
9
+ const ModelsMode_enum_1 = require("../../types/enums/ModelsMode.enum");
10
+ const ValidationLibrary_enum_1 = require("../../types/enums/ValidationLibrary.enum");
11
+ const registerHandlebarTemplates_1 = require("../registerHandlebarTemplates");
12
+ const requestContext = {
13
+ httpClient: HttpClient_enum_1.HttpClient.FETCH,
14
+ server: 'https://api.example.com',
15
+ version: '1.0.0',
16
+ useCancelableRequest: false,
17
+ useSeparatedIndexes: false,
18
+ };
19
+ const schemaModel = {
20
+ name: 'UserSchema',
21
+ alias: '',
22
+ path: 'schemas',
23
+ export: 'interface',
24
+ type: 'UserSchema',
25
+ base: 'UserSchema',
26
+ template: null,
27
+ link: null,
28
+ description: null,
29
+ isDefinition: true,
30
+ isReadOnly: false,
31
+ isRequired: false,
32
+ isNullable: false,
33
+ imports: [],
34
+ enum: [],
35
+ enums: [],
36
+ properties: [
37
+ {
38
+ name: 'id',
39
+ alias: '',
40
+ path: 'schemas',
41
+ export: 'generic',
42
+ type: 'string',
43
+ base: 'string',
44
+ template: null,
45
+ link: null,
46
+ description: null,
47
+ isDefinition: false,
48
+ isReadOnly: false,
49
+ isRequired: true,
50
+ isNullable: false,
51
+ imports: [],
52
+ enum: [],
53
+ enums: [],
54
+ properties: [],
55
+ },
56
+ ],
57
+ };
58
+ const exportClientContext = {
59
+ outputCore: './generated/core',
60
+ useCustomRequest: false,
61
+ services: [],
62
+ };
63
+ const exportModelsContext = {
64
+ models: [schemaModel],
65
+ httpClient: HttpClient_enum_1.HttpClient.FETCH,
66
+ useUnionTypes: false,
67
+ useOptions: false,
68
+ outputCore: '../core',
69
+ modelsMode: ModelsMode_enum_1.ModelsMode.CLASSES,
70
+ };
71
+ (0, node_test_1.describe)('@unit: templateRendering', () => {
72
+ for (const httpClient of Object.values(HttpClient_enum_1.HttpClient)) {
73
+ for (const useCancelableRequest of [false, true]) {
74
+ (0, node_test_1.test)(`renders request template for ${httpClient} (cancelable=${useCancelableRequest})`, () => {
75
+ const templates = (0, registerHandlebarTemplates_1.registerHandlebarTemplates)({
76
+ httpClient,
77
+ useOptions: false,
78
+ useUnionTypes: false,
79
+ validationLibrary: ValidationLibrary_enum_1.ValidationLibrary.NONE,
80
+ });
81
+ const output = templates.core.request({
82
+ ...requestContext,
83
+ httpClient,
84
+ useCancelableRequest,
85
+ });
86
+ node_assert_1.default.ok(output.length > 100);
87
+ node_assert_1.default.match(output, /function request/i);
88
+ });
89
+ }
90
+ }
91
+ (0, node_test_1.test)('renders exportClient and exportModels templates', () => {
92
+ const templates = (0, registerHandlebarTemplates_1.registerHandlebarTemplates)({
93
+ httpClient: HttpClient_enum_1.HttpClient.FETCH,
94
+ useOptions: false,
95
+ useUnionTypes: false,
96
+ validationLibrary: ValidationLibrary_enum_1.ValidationLibrary.NONE,
97
+ });
98
+ const clientOutput = templates.exports.client(exportClientContext);
99
+ const modelsOutput = templates.exports.models(exportModelsContext);
100
+ node_assert_1.default.match(clientOutput, /createClient|RequestExecutor/i);
101
+ node_assert_1.default.match(modelsOutput, /BaseDto|fromArray/);
102
+ });
103
+ (0, node_test_1.test)('renders schema export with validation library context', () => {
104
+ const templates = (0, registerHandlebarTemplates_1.registerHandlebarTemplates)({
105
+ httpClient: HttpClient_enum_1.HttpClient.FETCH,
106
+ useOptions: false,
107
+ useUnionTypes: false,
108
+ validationLibrary: ValidationLibrary_enum_1.ValidationLibrary.ZOD,
109
+ });
110
+ const output = templates.exports.schema({
111
+ ...schemaModel,
112
+ httpClient: HttpClient_enum_1.HttpClient.FETCH,
113
+ useUnionTypes: false,
114
+ validationLibrary: ValidationLibrary_enum_1.ValidationLibrary.ZOD,
115
+ });
116
+ node_assert_1.default.ok(output.length > 20);
117
+ node_assert_1.default.match(output, /UserSchema/i);
118
+ });
119
+ });
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=writeFileIfChanged.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"writeFileIfChanged.test.d.ts","sourceRoot":"","sources":["../../../../src/core/utils/__tests__/writeFileIfChanged.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,30 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const strict_1 = __importDefault(require("node:assert/strict"));
7
+ const promises_1 = require("node:fs/promises");
8
+ const node_os_1 = require("node:os");
9
+ const node_path_1 = require("node:path");
10
+ const node_test_1 = require("node:test");
11
+ const writeFileIfChanged_1 = require("../writeFileIfChanged");
12
+ (0, node_test_1.describe)('@unit: writeFileIfChanged', () => {
13
+ (0, node_test_1.test)('writes new file and skips unchanged content', async () => {
14
+ const dir = await (0, promises_1.mkdtemp)((0, node_path_1.join)((0, node_os_1.tmpdir)(), 'openapi-codegen-'));
15
+ const file = (0, node_path_1.join)(dir, 'index.ts');
16
+ try {
17
+ const firstResult = await (0, writeFileIfChanged_1.writeFileIfChanged)(file, 'export const a = 1;\n');
18
+ const secondResult = await (0, writeFileIfChanged_1.writeFileIfChanged)(file, 'export const a = 1;\n');
19
+ const thirdResult = await (0, writeFileIfChanged_1.writeFileIfChanged)(file, 'export const a = 2;\n');
20
+ const content = await (0, promises_1.readFile)(file, 'utf8');
21
+ strict_1.default.equal(firstResult, 'written');
22
+ strict_1.default.equal(secondResult, 'unchanged');
23
+ strict_1.default.equal(thirdResult, 'written');
24
+ strict_1.default.equal(content, 'export const a = 2;\n');
25
+ }
26
+ finally {
27
+ await (0, promises_1.rm)(dir, { recursive: true, force: true });
28
+ }
29
+ });
30
+ });
@@ -1 +1 @@
1
- {"version":3,"file":"loadDiffReport.d.ts","sourceRoot":"","sources":["../../../src/core/utils/loadDiffReport.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAClD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,gCAAgC,CAAC;AAC/D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAC;AAElE,MAAM,WAAW,eAAgB,SAAQ,QAAQ;IAC7C,MAAM,EAAE,QAAQ,CAAC,QAAQ,CAAC,CAAC;CAC9B;AAED,MAAM,WAAW,UAAU;IACvB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE;QACP,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,UAAU,CAAC,EAAE,MAAM,CAAC;KACvB,CAAC;IACF,KAAK,CAAC,EAAE;QACJ,YAAY,CAAC,EAAE,MAAM,CAAC;QACtB,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,OAAO,CAAC,EAAE,MAAM,CAAC;KACpB,CAAC;IACF,IAAI,CAAC,EAAE;QACH,QAAQ,CAAC,EAAE,eAAe,EAAE,CAAC;QAC7B,QAAQ,CAAC,EAAE,eAAe,EAAE,CAAC;QAC7B,IAAI,CAAC,EAAE,eAAe,EAAE,CAAC;QACzB,GAAG,CAAC,EAAE,eAAe,EAAE,CAAC;KAC3B,CAAC;IACF,QAAQ,CAAC,EAAE,YAAY,EAAE,CAAC;CAC7B;AAED,KAAK,oBAAoB,GAAG;IACxB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;CAClB,CAAC;AAaF,eAAO,MAAM,cAAc,GAAI,+CAA+C,oBAAoB,KAAG,UAAU,GAAG,IA8BjH,CAAC"}
1
+ {"version":3,"file":"loadDiffReport.d.ts","sourceRoot":"","sources":["../../../src/core/utils/loadDiffReport.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAElD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,gCAAgC,CAAC;AAC/D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAC;AAElE,MAAM,WAAW,eAAgB,SAAQ,QAAQ;IAC7C,MAAM,EAAE,QAAQ,CAAC,QAAQ,CAAC,CAAC;CAC9B;AAED,MAAM,WAAW,UAAU;IACvB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE;QACP,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,UAAU,CAAC,EAAE,MAAM,CAAC;KACvB,CAAC;IACF,KAAK,CAAC,EAAE;QACJ,YAAY,CAAC,EAAE,MAAM,CAAC;QACtB,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,OAAO,CAAC,EAAE,MAAM,CAAC;KACpB,CAAC;IACF,IAAI,CAAC,EAAE;QACH,QAAQ,CAAC,EAAE,eAAe,EAAE,CAAC;QAC7B,QAAQ,CAAC,EAAE,eAAe,EAAE,CAAC;QAC7B,IAAI,CAAC,EAAE,eAAe,EAAE,CAAC;QACzB,GAAG,CAAC,EAAE,eAAe,EAAE,CAAC;KAC3B,CAAC;IACF,QAAQ,CAAC,EAAE,YAAY,EAAE,CAAC;CAC7B;AAED,KAAK,oBAAoB,GAAG;IACxB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;CAClB,CAAC;AAaF,eAAO,MAAM,cAAc,GAAI,+CAA+C,oBAAoB,KAAG,UAAU,GAAG,IA8BjH,CAAC"}
@@ -6,6 +6,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
6
6
  exports.loadDiffReport = void 0;
7
7
  const fs_1 = __importDefault(require("fs"));
8
8
  const Consts_1 = require("../../common/Consts");
9
+ const LoggerMessages_1 = require("../../common/LoggerMessages");
9
10
  const isFreshEnough = (reportPath, inputPath) => {
10
11
  if (!inputPath)
11
12
  return true;
@@ -24,11 +25,11 @@ const loadDiffReport = ({ useHistory, diffReport, inputPath, logger }) => {
24
25
  return null;
25
26
  const reportPath = diffReport || Consts_1.DEFAULT_ANALYZE_DIFF_REPORT_PATH;
26
27
  if (!fs_1.default.existsSync(reportPath)) {
27
- logger.info(`[openapi-codegen] Diff report not found at "${reportPath}". Skipping history annotations.`);
28
+ logger.info(LoggerMessages_1.LOGGER_MESSAGES.DIFF_REPORT.NOT_FOUND(reportPath));
28
29
  return null;
29
30
  }
30
31
  if (!isFreshEnough(reportPath, inputPath)) {
31
- logger.warn(`[openapi-codegen] Diff report "${reportPath}" is older than the input spec. Skipping history annotations.`);
32
+ logger.warn(LoggerMessages_1.LOGGER_MESSAGES.DIFF_REPORT.STALE(reportPath));
32
33
  return null;
33
34
  }
34
35
  try {
@@ -37,14 +38,14 @@ const loadDiffReport = ({ useHistory, diffReport, inputPath, logger }) => {
37
38
  const hasDiffEntries = !!parsed?.diff?.all?.length;
38
39
  const hasMiracles = !!parsed?.miracles?.length;
39
40
  if (!hasDiffEntries && !hasMiracles) {
40
- logger.info(`[openapi-codegen] Diff report "${reportPath}" has no entries. Skipping history annotations.`);
41
+ logger.info(LoggerMessages_1.LOGGER_MESSAGES.DIFF_REPORT.EMPTY(reportPath));
41
42
  return null;
42
43
  }
43
44
  return parsed;
44
45
  }
45
46
  catch (error) {
46
47
  const message = error instanceof Error ? error.message : String(error);
47
- logger.warn(`[openapi-codegen] Failed to read diff report "${reportPath}": ${message}`);
48
+ logger.warn(LoggerMessages_1.LOGGER_MESSAGES.DIFF_REPORT.READ_FAILED(reportPath, message));
48
49
  return null;
49
50
  }
50
51
  };