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.
- package/README.md +3 -0
- package/README.rus.md +3 -0
- package/dist/cli/analyzeDiff/__tests__/analyzeDiff.cli.test.js +9 -0
- package/dist/cli/analyzeDiff/__tests__/analyzeDiffRenameAndInvalidRegex.test.js +9 -0
- package/dist/cli/analyzeDiff/__tests__/analyzeDiffTypeCoercion.test.js +9 -0
- package/dist/cli/analyzeUsage/analyzeUsage.d.ts +4 -0
- package/dist/cli/analyzeUsage/analyzeUsage.d.ts.map +1 -0
- package/dist/cli/analyzeUsage/analyzeUsage.js +62 -0
- package/dist/cli/analyzeUsage/core/Analyzer.d.ts +9 -0
- package/dist/cli/analyzeUsage/core/Analyzer.d.ts.map +1 -0
- package/dist/cli/analyzeUsage/core/Analyzer.js +29 -0
- package/dist/cli/analyzeUsage/core/ProjectContext.d.ts +10 -0
- package/dist/cli/analyzeUsage/core/ProjectContext.d.ts.map +1 -0
- package/dist/cli/analyzeUsage/core/ProjectContext.js +63 -0
- package/dist/cli/analyzeUsage/core/Scanner.d.ts +15 -0
- package/dist/cli/analyzeUsage/core/Scanner.d.ts.map +1 -0
- package/dist/cli/analyzeUsage/core/Scanner.js +115 -0
- package/dist/cli/analyzeUsage/rules/ClientRule.d.ts +6 -0
- package/dist/cli/analyzeUsage/rules/ClientRule.d.ts.map +1 -0
- package/dist/cli/analyzeUsage/rules/ClientRule.js +78 -0
- package/dist/cli/analyzeUsage/rules/CoverageRule.d.ts +7 -0
- package/dist/cli/analyzeUsage/rules/CoverageRule.d.ts.map +1 -0
- package/dist/cli/analyzeUsage/rules/CoverageRule.js +63 -0
- package/dist/cli/analyzeUsage/rules/DiagnosticsRule.d.ts +6 -0
- package/dist/cli/analyzeUsage/rules/DiagnosticsRule.d.ts.map +1 -0
- package/dist/cli/analyzeUsage/rules/DiagnosticsRule.js +60 -0
- package/dist/cli/analyzeUsage/rules/ImportRule.d.ts +6 -0
- package/dist/cli/analyzeUsage/rules/ImportRule.d.ts.map +1 -0
- package/dist/cli/analyzeUsage/rules/ImportRule.js +52 -0
- package/dist/cli/analyzeUsage/rules/ModelRule.d.ts +6 -0
- package/dist/cli/analyzeUsage/rules/ModelRule.d.ts.map +1 -0
- package/dist/cli/analyzeUsage/rules/ModelRule.js +38 -0
- package/dist/cli/analyzeUsage/rules/SchemaRule.d.ts +6 -0
- package/dist/cli/analyzeUsage/rules/SchemaRule.d.ts.map +1 -0
- package/dist/cli/analyzeUsage/rules/SchemaRule.js +48 -0
- package/dist/cli/analyzeUsage/rules/ServiceRule.d.ts +7 -0
- package/dist/cli/analyzeUsage/rules/ServiceRule.d.ts.map +1 -0
- package/dist/cli/analyzeUsage/rules/ServiceRule.js +92 -0
- package/dist/cli/analyzeUsage/types.d.ts +52 -0
- package/dist/cli/analyzeUsage/types.d.ts.map +1 -0
- package/dist/cli/analyzeUsage/types.js +2 -0
- package/dist/cli/analyzeUsage/utils/fuzzy.d.ts +5 -0
- package/dist/cli/analyzeUsage/utils/fuzzy.d.ts.map +1 -0
- package/dist/cli/analyzeUsage/utils/fuzzy.js +38 -0
- package/dist/cli/analyzeUsage/utils/report.d.ts +16 -0
- package/dist/cli/analyzeUsage/utils/report.d.ts.map +1 -0
- package/dist/cli/analyzeUsage/utils/report.js +85 -0
- package/dist/cli/checkAndUpdateConfig/__tests__/checkConfig.test.d.ts +2 -0
- package/dist/cli/checkAndUpdateConfig/__tests__/checkConfig.test.d.ts.map +1 -0
- package/dist/cli/checkAndUpdateConfig/__tests__/checkConfig.test.js +53 -0
- package/dist/cli/checkAndUpdateConfig/__tests__/updateConfig.test.d.ts +2 -0
- package/dist/cli/checkAndUpdateConfig/__tests__/updateConfig.test.d.ts.map +1 -0
- package/dist/cli/checkAndUpdateConfig/__tests__/updateConfig.test.js +52 -0
- package/dist/cli/checkAndUpdateConfig/checkConfig.d.ts +2 -1
- package/dist/cli/checkAndUpdateConfig/checkConfig.d.ts.map +1 -1
- package/dist/cli/checkAndUpdateConfig/checkConfig.js +8 -4
- package/dist/cli/checkAndUpdateConfig/updateConfig.d.ts +2 -1
- package/dist/cli/checkAndUpdateConfig/updateConfig.d.ts.map +1 -1
- package/dist/cli/checkAndUpdateConfig/updateConfig.js +6 -3
- package/dist/cli/checkAndUpdateConfig/utils/__tests__/prepareConfigData.test.d.ts +2 -0
- package/dist/cli/checkAndUpdateConfig/utils/__tests__/prepareConfigData.test.d.ts.map +1 -0
- package/dist/cli/checkAndUpdateConfig/utils/__tests__/prepareConfigData.test.js +20 -0
- package/dist/cli/checkAndUpdateConfig/utils/__tests__/removeDefaultConfigValues.test.d.ts +2 -0
- package/dist/cli/checkAndUpdateConfig/utils/__tests__/removeDefaultConfigValues.test.d.ts.map +1 -0
- package/dist/cli/checkAndUpdateConfig/utils/__tests__/removeDefaultConfigValues.test.js +35 -0
- package/dist/cli/checkAndUpdateConfig/utils/__tests__/validateAndMigrateConfigData.test.d.ts +2 -0
- package/dist/cli/checkAndUpdateConfig/utils/__tests__/validateAndMigrateConfigData.test.d.ts.map +1 -0
- package/dist/cli/checkAndUpdateConfig/utils/__tests__/validateAndMigrateConfigData.test.js +59 -0
- package/dist/cli/checkAndUpdateConfig/utils/validateAndMigrateConfigData.d.ts.map +1 -1
- package/dist/cli/checkAndUpdateConfig/utils/validateAndMigrateConfigData.js +19 -1
- package/dist/cli/generateOpenApiClient/__tests__/generateOpenApiClient.strict.test.js +18 -9
- package/dist/cli/generateOpenApiClient/generateOpenApiClient.d.ts +2 -5
- package/dist/cli/generateOpenApiClient/generateOpenApiClient.d.ts.map +1 -1
- package/dist/cli/generateOpenApiClient/generateOpenApiClient.js +12 -16
- package/dist/cli/index.js +41 -7
- package/dist/cli/initOpenApiConfig/__tests__/init.test.d.ts +2 -0
- package/dist/cli/initOpenApiConfig/__tests__/init.test.d.ts.map +1 -0
- package/dist/cli/initOpenApiConfig/__tests__/init.test.js +20 -0
- package/dist/cli/initOpenApiConfig/__tests__/initConfig.test.d.ts +2 -0
- package/dist/cli/initOpenApiConfig/__tests__/initConfig.test.d.ts.map +1 -0
- package/dist/cli/initOpenApiConfig/__tests__/initConfig.test.js +49 -0
- package/dist/cli/initOpenApiConfig/init.d.ts +2 -1
- package/dist/cli/initOpenApiConfig/init.d.ts.map +1 -1
- package/dist/cli/initOpenApiConfig/init.js +3 -1
- package/dist/cli/initOpenApiConfig/utils/__tests__/buildConfig.test.d.ts +2 -0
- package/dist/cli/initOpenApiConfig/utils/__tests__/buildConfig.test.d.ts.map +1 -0
- package/dist/cli/initOpenApiConfig/utils/__tests__/buildConfig.test.js +99 -0
- package/dist/cli/initOpenApiConfig/utils/__tests__/findSpecFiles.test.d.ts +2 -0
- package/dist/cli/initOpenApiConfig/utils/__tests__/findSpecFiles.test.d.ts.map +1 -0
- package/dist/cli/initOpenApiConfig/utils/__tests__/findSpecFiles.test.js +45 -0
- package/dist/cli/initOpenApiConfig/utils/__tests__/validateSpecFiles.test.d.ts +2 -0
- package/dist/cli/initOpenApiConfig/utils/__tests__/validateSpecFiles.test.d.ts.map +1 -0
- package/dist/cli/initOpenApiConfig/utils/__tests__/validateSpecFiles.test.js +61 -0
- package/dist/cli/previewChanges/previewChanges.d.ts +2 -1
- package/dist/cli/previewChanges/previewChanges.d.ts.map +1 -1
- package/dist/cli/previewChanges/previewChanges.js +6 -6
- package/dist/cli/previewChanges/utils/__tests__/compareFiles.test.d.ts +2 -0
- package/dist/cli/previewChanges/utils/__tests__/compareFiles.test.d.ts.map +1 -0
- package/dist/cli/previewChanges/utils/__tests__/compareFiles.test.js +52 -0
- package/dist/cli/previewChanges/utils/__tests__/isDirectoryEmpty.test.d.ts +2 -0
- package/dist/cli/previewChanges/utils/__tests__/isDirectoryEmpty.test.d.ts.map +1 -0
- package/dist/cli/previewChanges/utils/__tests__/isDirectoryEmpty.test.js +43 -0
- package/dist/cli/previewChanges/utils/__tests__/readDirectoryRecursive.test.d.ts +2 -0
- package/dist/cli/previewChanges/utils/__tests__/readDirectoryRecursive.test.d.ts.map +1 -0
- package/dist/cli/previewChanges/utils/__tests__/readDirectoryRecursive.test.js +32 -0
- package/dist/cli/previewChanges/utils/__tests__/updateOutputPaths.test.d.ts +2 -0
- package/dist/cli/previewChanges/utils/__tests__/updateOutputPaths.test.d.ts.map +1 -0
- package/dist/cli/previewChanges/utils/__tests__/updateOutputPaths.test.js +68 -0
- package/dist/cli/schemas/__tests__/checkConfigAndUpdate.test.d.ts +2 -0
- package/dist/cli/schemas/__tests__/checkConfigAndUpdate.test.d.ts.map +1 -0
- package/dist/cli/schemas/__tests__/checkConfigAndUpdate.test.js +36 -0
- package/dist/cli/schemas/__tests__/generateOptionsSchema.test.d.ts +2 -0
- package/dist/cli/schemas/__tests__/generateOptionsSchema.test.d.ts.map +1 -0
- package/dist/cli/schemas/__tests__/generateOptionsSchema.test.js +59 -0
- package/dist/cli/schemas/__tests__/initOptionsSchema.test.d.ts +2 -0
- package/dist/cli/schemas/__tests__/initOptionsSchema.test.d.ts.map +1 -0
- package/dist/cli/schemas/__tests__/initOptionsSchema.test.js +43 -0
- package/dist/cli/schemas/__tests__/previewChangesSchema.test.d.ts +2 -0
- package/dist/cli/schemas/__tests__/previewChangesSchema.test.d.ts.map +1 -0
- package/dist/cli/schemas/__tests__/previewChangesSchema.test.js +31 -0
- package/dist/cli/schemas/analyzeUsage.d.ts +13 -0
- package/dist/cli/schemas/analyzeUsage.d.ts.map +1 -0
- package/dist/cli/schemas/analyzeUsage.js +38 -0
- package/dist/cli/schemas/generate.d.ts +7 -0
- package/dist/cli/schemas/generate.d.ts.map +1 -1
- package/dist/cli/schemas/generate.js +4 -0
- package/dist/cli/schemas/index.d.ts +2 -2
- package/dist/cli/schemas/index.d.ts.map +1 -1
- package/dist/cli/schemas/index.js +1 -1
- package/dist/cli/types.d.ts +6 -0
- package/dist/cli/types.d.ts.map +1 -0
- package/dist/cli/types.js +2 -0
- package/dist/common/Consts.d.ts +1 -0
- package/dist/common/Consts.d.ts.map +1 -1
- package/dist/common/Consts.js +6 -1
- package/dist/common/Logger.js +2 -2
- package/dist/common/LoggerMessages.d.ts +59 -12
- package/dist/common/LoggerMessages.d.ts.map +1 -1
- package/dist/common/LoggerMessages.js +62 -15
- package/dist/common/VersionedSchema/AllVersionedSchemas/UnifiedOptionsSchemaV5.d.ts +7 -0
- package/dist/common/VersionedSchema/AllVersionedSchemas/UnifiedOptionsSchemaV5.d.ts.map +1 -1
- package/dist/common/VersionedSchema/AllVersionedSchemas/UnifiedOptionsSchemaV5.js +5 -1
- package/dist/common/VersionedSchema/AllVersionedSchemas/UnifiedVersionedSchemas.d.ts +14 -0
- package/dist/common/VersionedSchema/AllVersionedSchemas/UnifiedVersionedSchemas.d.ts.map +1 -1
- package/dist/common/VersionedSchema/Utils/__mocks__/compatibilityCases.d.ts.map +1 -1
- package/dist/common/VersionedSchema/Utils/__mocks__/compatibilityCases.js +6 -1
- package/dist/common/VersionedSchema/Utils/migrateDataToLatestSchemaVersion.d.ts.map +1 -1
- package/dist/common/VersionedSchema/Utils/migrateDataToLatestSchemaVersion.js +1 -1
- package/dist/core/OpenApiClient.d.ts +12 -1
- package/dist/core/OpenApiClient.d.ts.map +1 -1
- package/dist/core/OpenApiClient.js +192 -10
- package/dist/core/WriteClient.d.ts +11 -0
- package/dist/core/WriteClient.d.ts.map +1 -1
- package/dist/core/WriteClient.js +23 -2
- package/dist/core/plugins/getBuiltinPlugins.d.ts.map +1 -1
- package/dist/core/plugins/loadGeneratorPlugins.d.ts.map +1 -1
- package/dist/core/plugins/loadGeneratorPlugins.js +1 -1
- package/dist/core/types/shared/Client.model.d.ts +1 -1
- package/dist/core/types/shared/Client.model.d.ts.map +1 -1
- package/dist/core/types/shared/Model.model.d.ts +1 -1
- package/dist/core/types/shared/Model.model.d.ts.map +1 -1
- package/dist/core/utils/GenerationCache.d.ts +18 -0
- package/dist/core/utils/GenerationCache.d.ts.map +1 -0
- package/dist/core/utils/GenerationCache.js +41 -0
- package/dist/core/utils/__tests__/GenerationCache.test.d.ts +2 -0
- package/dist/core/utils/__tests__/GenerationCache.test.d.ts.map +1 -0
- package/dist/core/utils/__tests__/GenerationCache.test.js +37 -0
- package/dist/core/utils/__tests__/loadDiffReport.test.d.ts +2 -0
- package/dist/core/utils/__tests__/loadDiffReport.test.d.ts.map +1 -0
- package/dist/core/utils/__tests__/loadDiffReport.test.js +97 -0
- package/dist/core/utils/__tests__/prepareDtoModels.test.js +95 -0
- package/dist/core/utils/__tests__/templateRendering.test.d.ts +2 -0
- package/dist/core/utils/__tests__/templateRendering.test.d.ts.map +1 -0
- package/dist/core/utils/__tests__/templateRendering.test.js +119 -0
- package/dist/core/utils/__tests__/writeFileIfChanged.test.d.ts +2 -0
- package/dist/core/utils/__tests__/writeFileIfChanged.test.d.ts.map +1 -0
- package/dist/core/utils/__tests__/writeFileIfChanged.test.js +30 -0
- package/dist/core/utils/loadDiffReport.d.ts.map +1 -1
- package/dist/core/utils/loadDiffReport.js +5 -4
- package/dist/core/utils/precompileTemplates.js +3 -2
- package/dist/core/utils/prepareDtoModels.d.ts.map +1 -1
- package/dist/core/utils/prepareDtoModels.js +1 -7
- package/dist/core/utils/writeClientCore.d.ts.map +1 -1
- package/dist/core/utils/writeClientCore.js +18 -16
- package/dist/core/utils/writeClientCoreIndex.d.ts.map +1 -1
- package/dist/core/utils/writeClientCoreIndex.js +14 -4
- package/dist/core/utils/writeClientExecutor.d.ts.map +1 -1
- package/dist/core/utils/writeClientExecutor.js +4 -4
- package/dist/core/utils/writeClientFullIndex.js +4 -4
- package/dist/core/utils/writeClientModels.d.ts.map +1 -1
- package/dist/core/utils/writeClientModels.js +10 -10
- package/dist/core/utils/writeClientModelsIndex.d.ts +1 -1
- package/dist/core/utils/writeClientModelsIndex.d.ts.map +1 -1
- package/dist/core/utils/writeClientModelsIndex.js +14 -4
- package/dist/core/utils/writeClientSchemas.d.ts.map +1 -1
- package/dist/core/utils/writeClientSchemas.js +7 -7
- package/dist/core/utils/writeClientSchemasIndex.d.ts.map +1 -1
- package/dist/core/utils/writeClientSchemasIndex.js +14 -4
- package/dist/core/utils/writeClientServices.d.ts.map +1 -1
- package/dist/core/utils/writeClientServices.js +6 -6
- package/dist/core/utils/writeClientServicesIndex.d.ts.map +1 -1
- package/dist/core/utils/writeClientServicesIndex.js +14 -4
- package/dist/core/utils/writeClientSimpleIndex.js +4 -4
- package/dist/core/utils/writeFileIfChanged.d.ts +3 -0
- package/dist/core/utils/writeFileIfChanged.d.ts.map +1 -0
- package/dist/core/utils/writeFileIfChanged.js +22 -0
- package/dist/test/helpers/silenceLoggers.d.ts +11 -0
- package/dist/test/helpers/silenceLoggers.d.ts.map +1 -0
- package/dist/test/helpers/silenceLoggers.js +88 -0
- package/package.json +4 -4
package/dist/cli/index.js
CHANGED
|
@@ -16,6 +16,7 @@ const HttpClient_enum_1 = require("../core/types/enums/HttpClient.enum");
|
|
|
16
16
|
const ModelsMode_enum_1 = require("../core/types/enums/ModelsMode.enum");
|
|
17
17
|
const ValidationLibrary_enum_1 = require("../core/types/enums/ValidationLibrary.enum");
|
|
18
18
|
const analyzeDiff_1 = require("./analyzeDiff/analyzeDiff");
|
|
19
|
+
const analyzeUsage_1 = require("./analyzeUsage/analyzeUsage");
|
|
19
20
|
const checkConfig_1 = require("./checkAndUpdateConfig/checkConfig");
|
|
20
21
|
const updateConfig_1 = require("./checkAndUpdateConfig/updateConfig");
|
|
21
22
|
const generateOpenApiClient_1 = require("./generateOpenApiClient/generateOpenApiClient");
|
|
@@ -31,6 +32,12 @@ const updateNotifier = new UpdateNotifier_1.UpdateNotifier({
|
|
|
31
32
|
packageVersion: APP_VERSION,
|
|
32
33
|
});
|
|
33
34
|
const program = new commander_1.Command();
|
|
35
|
+
const finishCommand = (result) => {
|
|
36
|
+
if (!result || !result.success) {
|
|
37
|
+
process.exit(1);
|
|
38
|
+
}
|
|
39
|
+
process.exit(0);
|
|
40
|
+
};
|
|
34
41
|
program.version(APP_VERSION).name(APP_NAME).description(APP_DESCRIPTION).addHelpText('before', (0, utils_1.getCLIName)(APP_NAME));
|
|
35
42
|
/**
|
|
36
43
|
* generate - Команда для генерации кода на основе OpenAPI спецификации
|
|
@@ -71,11 +78,16 @@ program
|
|
|
71
78
|
.addOption(new commander_1.Option('--emptySchemaStrategy <value>', 'How to handle empty generated schemas').choices([...Object.values(EmptySchemaStrategy_enum_1.EmptySchemaStrategy)]).default(EmptySchemaStrategy_enum_1.EmptySchemaStrategy.KEEP))
|
|
72
79
|
.option('--useProjectPrettier', 'Use project Prettier config for formatting generated code (default: false)')
|
|
73
80
|
.option('--useEslintFix', 'Run ESLint --fix on generated files after writing (default: false)')
|
|
81
|
+
.option('--cache', 'Enable generation cache (default: disabled)')
|
|
82
|
+
.option('--cachePath <value>', 'Path to generation cache file relative to output directory (default: .openapi-codegen-cache.json)')
|
|
83
|
+
.addOption(new commander_1.Option('--cacheStrategy <value>', 'Cache strategy').choices(['content', 'entity']).default('entity'))
|
|
84
|
+
.option('--cacheDebug', 'Show cache hit/miss debug logs (default: false)')
|
|
74
85
|
.hook('preAction', async () => {
|
|
75
86
|
await updateNotifier.checkAndNotify();
|
|
76
87
|
})
|
|
77
88
|
.action(async (options) => {
|
|
78
|
-
await (0, generateOpenApiClient_1.generateOpenApiClient)(options);
|
|
89
|
+
const result = await (0, generateOpenApiClient_1.generateOpenApiClient)(options);
|
|
90
|
+
finishCommand(result);
|
|
79
91
|
});
|
|
80
92
|
/**
|
|
81
93
|
* check - Команда для проверки конфигурационного файла
|
|
@@ -89,7 +101,8 @@ program
|
|
|
89
101
|
await updateNotifier.checkAndNotify();
|
|
90
102
|
})
|
|
91
103
|
.action(async (options) => {
|
|
92
|
-
await (0, checkConfig_1.checkConfig)(options);
|
|
104
|
+
const result = await (0, checkConfig_1.checkConfig)(options);
|
|
105
|
+
finishCommand(result);
|
|
93
106
|
});
|
|
94
107
|
/**
|
|
95
108
|
* update - Команда для обновления конфигурационного файла
|
|
@@ -103,7 +116,8 @@ program
|
|
|
103
116
|
await updateNotifier.checkAndNotify();
|
|
104
117
|
})
|
|
105
118
|
.action(async (options) => {
|
|
106
|
-
await (0, updateConfig_1.updateConfig)(options);
|
|
119
|
+
const result = await (0, updateConfig_1.updateConfig)(options);
|
|
120
|
+
finishCommand(result);
|
|
107
121
|
});
|
|
108
122
|
/**
|
|
109
123
|
* init - Команда для инициализации конфигурационного файла
|
|
@@ -121,7 +135,8 @@ program
|
|
|
121
135
|
await updateNotifier.checkAndNotify();
|
|
122
136
|
})
|
|
123
137
|
.action(async (options) => {
|
|
124
|
-
await (0, init_1.init)(options);
|
|
138
|
+
const result = await (0, init_1.init)(options);
|
|
139
|
+
finishCommand(result);
|
|
125
140
|
});
|
|
126
141
|
/**
|
|
127
142
|
* preview-changes - Команда для предпросмотра изменений перед генерацией
|
|
@@ -138,7 +153,8 @@ program
|
|
|
138
153
|
await updateNotifier.checkAndNotify();
|
|
139
154
|
})
|
|
140
155
|
.action(async (options) => {
|
|
141
|
-
await (0, previewChanges_1.previewChanges)(options);
|
|
156
|
+
const result = await (0, previewChanges_1.previewChanges)(options);
|
|
157
|
+
finishCommand(result);
|
|
142
158
|
});
|
|
143
159
|
/**
|
|
144
160
|
* analyze-diff - Команда для анализа изменений между двумя версиями OpenAPI спецификации
|
|
@@ -180,8 +196,26 @@ program
|
|
|
180
196
|
})
|
|
181
197
|
.action(async (options) => {
|
|
182
198
|
const result = await (0, analyzeDiff_1.analyzeDiff)(options);
|
|
183
|
-
|
|
184
|
-
|
|
199
|
+
finishCommand(result);
|
|
200
|
+
});
|
|
201
|
+
/**
|
|
202
|
+
* analyze-usage - Команда для анализа использования generated API в consumer-проекте
|
|
203
|
+
*/
|
|
204
|
+
program
|
|
205
|
+
.command('analyze-usage')
|
|
206
|
+
.description('Analyzes generated API usage in a TypeScript consumer project and produces usage reports')
|
|
207
|
+
.addHelpText('before', (0, utils_1.getCLIName)(APP_NAME))
|
|
208
|
+
.option('-s, --sourcePath <value>', 'Path to generated API file')
|
|
209
|
+
.option('-p, --projectPath <value>', 'Root of your React/TS project')
|
|
210
|
+
.option('-t, --tsconfigPath <value>', 'Optional path to tsconfig.json')
|
|
211
|
+
.option('-o, --output <value>', 'Output report filename', 'api-report.json')
|
|
212
|
+
.option('-c, --check', 'CI mode (exit code 1 when errors are found)')
|
|
213
|
+
.hook('preAction', async () => {
|
|
214
|
+
await updateNotifier.checkAndNotify();
|
|
215
|
+
})
|
|
216
|
+
.action(async (options) => {
|
|
217
|
+
const result = await (0, analyzeUsage_1.analyzeUsage)(options);
|
|
218
|
+
finishCommand(result);
|
|
185
219
|
});
|
|
186
220
|
program.exitOverride();
|
|
187
221
|
program.showSuggestionAfterError(false);
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"init.test.d.ts","sourceRoot":"","sources":["../../../../src/cli/initOpenApiConfig/__tests__/init.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,20 @@
|
|
|
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 Consts_1 = require("../../../common/Consts");
|
|
9
|
+
const init_1 = require("../init");
|
|
10
|
+
(0, node_test_1.describe)('@unit: init', () => {
|
|
11
|
+
(0, node_test_1.test)('returns failure when options fail schema validation', async () => {
|
|
12
|
+
const shutdownMock = node_test_1.mock.method(Consts_1.APP_LOGGER, 'shutdownLoggerAsync', async () => undefined);
|
|
13
|
+
const errorMock = node_test_1.mock.method(Consts_1.APP_LOGGER, 'error', () => undefined);
|
|
14
|
+
const result = await (0, init_1.init)({ specsDir: 123 });
|
|
15
|
+
node_assert_1.default.strictEqual(result.success, false);
|
|
16
|
+
node_assert_1.default.ok(result.error);
|
|
17
|
+
shutdownMock.mock.restore();
|
|
18
|
+
errorMock.mock.restore();
|
|
19
|
+
});
|
|
20
|
+
});
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"initConfig.test.d.ts","sourceRoot":"","sources":["../../../../src/cli/initOpenApiConfig/__tests__/initConfig.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,49 @@
|
|
|
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 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 Consts_1 = require("../../../common/Consts");
|
|
12
|
+
const silenceLoggers_1 = require("../../../test/helpers/silenceLoggers");
|
|
13
|
+
const initConfig_1 = require("../initConfig");
|
|
14
|
+
const registerHandlebarTemplates_1 = require("../utils/registerHandlebarTemplates");
|
|
15
|
+
(0, node_test_1.describe)('@unit: initConfig', () => {
|
|
16
|
+
(0, node_test_1.test)('leaves existing config unchanged in non-interactive mode', async () => {
|
|
17
|
+
const dir = await (0, promises_1.mkdtemp)((0, node_path_1.join)((0, node_os_1.tmpdir)(), 'init-config-'));
|
|
18
|
+
const configPath = (0, node_path_1.join)(dir, 'openapi.config.json');
|
|
19
|
+
await (0, promises_1.writeFile)(configPath, '{"input":"./x.json","output":"./out"}', 'utf8');
|
|
20
|
+
const warnMock = node_test_1.mock.method(Consts_1.APP_LOGGER, 'warn', () => undefined);
|
|
21
|
+
const infoMock = node_test_1.mock.method(Consts_1.APP_LOGGER, 'info', () => undefined);
|
|
22
|
+
const templates = (0, registerHandlebarTemplates_1.registerHandlebarTemplates)();
|
|
23
|
+
await (0, initConfig_1.initConfig)({
|
|
24
|
+
openapiConfig: configPath,
|
|
25
|
+
specsDir: dir,
|
|
26
|
+
templates,
|
|
27
|
+
useInteractiveMode: false,
|
|
28
|
+
});
|
|
29
|
+
node_assert_1.default.strictEqual(warnMock.mock.callCount(), 1);
|
|
30
|
+
node_assert_1.default.strictEqual(infoMock.mock.callCount(), 1);
|
|
31
|
+
warnMock.mock.restore();
|
|
32
|
+
infoMock.mock.restore();
|
|
33
|
+
});
|
|
34
|
+
(0, node_test_1.test)('writes example config when no specs are found', async (t) => {
|
|
35
|
+
(0, silenceLoggers_1.silenceAppLogger)(t);
|
|
36
|
+
const dir = await (0, promises_1.mkdtemp)((0, node_path_1.join)((0, node_os_1.tmpdir)(), 'init-config-'));
|
|
37
|
+
const configPath = (0, node_path_1.join)(dir, 'new-openapi.config.json');
|
|
38
|
+
const templates = (0, registerHandlebarTemplates_1.registerHandlebarTemplates)();
|
|
39
|
+
await (0, initConfig_1.initConfig)({
|
|
40
|
+
openapiConfig: configPath,
|
|
41
|
+
specsDir: (0, node_path_1.join)(dir, 'empty-specs'),
|
|
42
|
+
templates,
|
|
43
|
+
useInteractiveMode: false,
|
|
44
|
+
});
|
|
45
|
+
const written = await (0, promises_1.readFile)(configPath, 'utf8');
|
|
46
|
+
node_assert_1.default.match(written, /"input"/);
|
|
47
|
+
node_assert_1.default.match(written, /"output"/);
|
|
48
|
+
});
|
|
49
|
+
});
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { OptionValues } from 'commander';
|
|
2
|
+
import { CLICommandResult } from '../types';
|
|
2
3
|
/**
|
|
3
4
|
* Фнукция изначальной настройки файлов конфигурации для последующего запуска генератора
|
|
4
5
|
*/
|
|
5
|
-
export declare function init(options: OptionValues): Promise<
|
|
6
|
+
export declare function init(options: OptionValues): Promise<CLICommandResult>;
|
|
6
7
|
//# sourceMappingURL=init.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../../src/cli/initOpenApiConfig/init.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../../src/cli/initOpenApiConfig/init.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AAOzC,OAAO,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC;AAK5C;;GAEG;AACH,wBAAsB,IAAI,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,gBAAgB,CAAC,CA2D3E"}
|
|
@@ -17,7 +17,7 @@ async function init(options) {
|
|
|
17
17
|
if (!validationResult.success) {
|
|
18
18
|
Consts_1.APP_LOGGER.error(LoggerMessages_1.LOGGER_MESSAGES.ERROR.GENERIC(validationResult.errors.join('\n')));
|
|
19
19
|
await Consts_1.APP_LOGGER.shutdownLoggerAsync();
|
|
20
|
-
|
|
20
|
+
return { success: false, error: validationResult.errors.join('\n') };
|
|
21
21
|
}
|
|
22
22
|
const validatedOptions = validationResult.data;
|
|
23
23
|
const templates = (0, registerHandlebarTemplates_1.registerHandlebarTemplates)();
|
|
@@ -63,4 +63,6 @@ async function init(options) {
|
|
|
63
63
|
useInteractiveMode: validatedOptions.useInteractiveMode,
|
|
64
64
|
});
|
|
65
65
|
}
|
|
66
|
+
await Consts_1.APP_LOGGER.shutdownLoggerAsync();
|
|
67
|
+
return { success: true };
|
|
66
68
|
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"buildConfig.test.d.ts","sourceRoot":"","sources":["../../../../../src/cli/initOpenApiConfig/utils/__tests__/buildConfig.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,99 @@
|
|
|
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 Consts_1 = require("../../../../common/Consts");
|
|
9
|
+
const buildConfig_1 = require("../buildConfig");
|
|
10
|
+
const createMockSpec = (relativePath = './test/spec.yml') => ({
|
|
11
|
+
relativePath,
|
|
12
|
+
path: '',
|
|
13
|
+
});
|
|
14
|
+
(0, node_test_1.describe)('@unit: buildConfig', () => {
|
|
15
|
+
(0, node_test_1.test)('creates items array for multiple specs in multi-option mode', async () => {
|
|
16
|
+
const validatedSpecs = [
|
|
17
|
+
createMockSpec('./api/v1.yml'),
|
|
18
|
+
createMockSpec('./api/v2.yml'),
|
|
19
|
+
];
|
|
20
|
+
const result = await (0, buildConfig_1.buildConfig)(validatedSpecs, true);
|
|
21
|
+
node_assert_1.default.strictEqual(result.items?.length, 2);
|
|
22
|
+
node_assert_1.default.strictEqual(result.items?.[0].input, './api/v1.yml');
|
|
23
|
+
node_assert_1.default.strictEqual(result.items?.[1].input, './api/v2.yml');
|
|
24
|
+
node_assert_1.default.strictEqual(result.items?.[0].output, Consts_1.DEFAULT_OUTPUT_API_DIR);
|
|
25
|
+
node_assert_1.default.strictEqual(result.items?.[1].output, Consts_1.DEFAULT_OUTPUT_API_DIR);
|
|
26
|
+
});
|
|
27
|
+
(0, node_test_1.test)('includes per-item request when perSpecRequest is enabled', async () => {
|
|
28
|
+
const validatedSpecs = [createMockSpec()];
|
|
29
|
+
const customRequest = './custom/request.ts';
|
|
30
|
+
const result = await (0, buildConfig_1.buildConfig)(validatedSpecs, true, customRequest, true);
|
|
31
|
+
node_assert_1.default.strictEqual(result.items?.[0].request, customRequest);
|
|
32
|
+
node_assert_1.default.strictEqual(result.request, undefined);
|
|
33
|
+
});
|
|
34
|
+
(0, node_test_1.test)('includes root request when perSpecRequest is disabled', async () => {
|
|
35
|
+
const validatedSpecs = [createMockSpec()];
|
|
36
|
+
const customRequest = './custom/request.ts';
|
|
37
|
+
const result = await (0, buildConfig_1.buildConfig)(validatedSpecs, true, customRequest, false);
|
|
38
|
+
node_assert_1.default.strictEqual(result.items?.[0].request, undefined);
|
|
39
|
+
node_assert_1.default.strictEqual(result.request, customRequest);
|
|
40
|
+
});
|
|
41
|
+
(0, node_test_1.test)('sets default values from COMMON_DEFAULT_OPTIONS_VALUES in multi mode', async () => {
|
|
42
|
+
const result = await (0, buildConfig_1.buildConfig)([createMockSpec()], true);
|
|
43
|
+
node_assert_1.default.strictEqual(result.httpClient, Consts_1.COMMON_DEFAULT_OPTIONS_VALUES.httpClient);
|
|
44
|
+
node_assert_1.default.strictEqual(result.sortByRequired, Consts_1.COMMON_DEFAULT_OPTIONS_VALUES.sortByRequired);
|
|
45
|
+
node_assert_1.default.strictEqual(result.enumPrefix, Consts_1.COMMON_DEFAULT_OPTIONS_VALUES.enumPrefix);
|
|
46
|
+
node_assert_1.default.strictEqual(result.excludeCoreServiceFiles, Consts_1.COMMON_DEFAULT_OPTIONS_VALUES.excludeCoreServiceFiles);
|
|
47
|
+
node_assert_1.default.strictEqual(result.interfacePrefix, Consts_1.COMMON_DEFAULT_OPTIONS_VALUES.interfacePrefix);
|
|
48
|
+
node_assert_1.default.strictEqual(result.typePrefix, Consts_1.COMMON_DEFAULT_OPTIONS_VALUES.typePrefix);
|
|
49
|
+
node_assert_1.default.strictEqual(result.useCancelableRequest, Consts_1.COMMON_DEFAULT_OPTIONS_VALUES.useCancelableRequest);
|
|
50
|
+
node_assert_1.default.strictEqual(result.useOptions, Consts_1.COMMON_DEFAULT_OPTIONS_VALUES.useOptions);
|
|
51
|
+
node_assert_1.default.strictEqual(result.useSeparatedIndexes, Consts_1.COMMON_DEFAULT_OPTIONS_VALUES.useSeparatedIndexes);
|
|
52
|
+
node_assert_1.default.strictEqual(result.useUnionTypes, Consts_1.COMMON_DEFAULT_OPTIONS_VALUES.useUnionTypes);
|
|
53
|
+
node_assert_1.default.strictEqual(result.modelsMode, Consts_1.COMMON_DEFAULT_OPTIONS_VALUES.modelsMode);
|
|
54
|
+
node_assert_1.default.strictEqual(result.useHistory, Consts_1.COMMON_DEFAULT_OPTIONS_VALUES.useHistory);
|
|
55
|
+
node_assert_1.default.strictEqual(result.diffReport, Consts_1.COMMON_DEFAULT_OPTIONS_VALUES.diffReport);
|
|
56
|
+
});
|
|
57
|
+
(0, node_test_1.test)('uses first spec for flat config', async () => {
|
|
58
|
+
const validatedSpecs = [
|
|
59
|
+
createMockSpec('./api/v1.yml'),
|
|
60
|
+
createMockSpec('./api/v2.yml'),
|
|
61
|
+
];
|
|
62
|
+
const result = await (0, buildConfig_1.buildConfig)(validatedSpecs, false);
|
|
63
|
+
node_assert_1.default.strictEqual(result.input, './api/v1.yml');
|
|
64
|
+
node_assert_1.default.strictEqual(result.output, Consts_1.DEFAULT_OUTPUT_API_DIR);
|
|
65
|
+
});
|
|
66
|
+
(0, node_test_1.test)('throws when no validated specs in flat mode', async () => {
|
|
67
|
+
await node_assert_1.default.rejects(() => (0, buildConfig_1.buildConfig)([], false), /No validated spec files found/);
|
|
68
|
+
});
|
|
69
|
+
(0, node_test_1.test)('includes request in flat mode', async () => {
|
|
70
|
+
const customRequest = './custom/request.ts';
|
|
71
|
+
const result = await (0, buildConfig_1.buildConfig)([createMockSpec()], false, customRequest);
|
|
72
|
+
node_assert_1.default.strictEqual(result.request, customRequest);
|
|
73
|
+
});
|
|
74
|
+
});
|
|
75
|
+
(0, node_test_1.describe)('@unit: buildExampleConfig', () => {
|
|
76
|
+
(0, node_test_1.test)('creates multi-option example with placeholder spec path', () => {
|
|
77
|
+
const result = (0, buildConfig_1.buildExampleConfig)(true);
|
|
78
|
+
node_assert_1.default.strictEqual(result.items?.length, 1);
|
|
79
|
+
node_assert_1.default.strictEqual(result.items?.[0].input, './openapi/spec.yml');
|
|
80
|
+
node_assert_1.default.strictEqual(result.items?.[0].output, Consts_1.DEFAULT_OUTPUT_API_DIR);
|
|
81
|
+
});
|
|
82
|
+
(0, node_test_1.test)('creates flat example with placeholder spec path', () => {
|
|
83
|
+
const result = (0, buildConfig_1.buildExampleConfig)(false);
|
|
84
|
+
node_assert_1.default.strictEqual(result.input, './openapi/spec.yml');
|
|
85
|
+
node_assert_1.default.strictEqual(result.output, Consts_1.DEFAULT_OUTPUT_API_DIR);
|
|
86
|
+
});
|
|
87
|
+
(0, node_test_1.test)('includes root request for multi-option when not perSpecRequest', () => {
|
|
88
|
+
const customRequest = './custom/request.ts';
|
|
89
|
+
const result = (0, buildConfig_1.buildExampleConfig)(true, customRequest, false);
|
|
90
|
+
node_assert_1.default.strictEqual(result.request, customRequest);
|
|
91
|
+
node_assert_1.default.strictEqual(result.items?.[0].request, undefined);
|
|
92
|
+
});
|
|
93
|
+
(0, node_test_1.test)('includes per-item request when perSpecRequest is true', () => {
|
|
94
|
+
const customRequest = './custom/request.ts';
|
|
95
|
+
const result = (0, buildConfig_1.buildExampleConfig)(true, customRequest, true);
|
|
96
|
+
node_assert_1.default.strictEqual(result.request, undefined);
|
|
97
|
+
node_assert_1.default.strictEqual(result.items?.[0].request, customRequest);
|
|
98
|
+
});
|
|
99
|
+
});
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"findSpecFiles.test.d.ts","sourceRoot":"","sources":["../../../../../src/cli/initOpenApiConfig/utils/__tests__/findSpecFiles.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,45 @@
|
|
|
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 findSpecFiles_1 = require("../findSpecFiles");
|
|
11
|
+
const createTempDir = (t, prefix) => {
|
|
12
|
+
const root = node_path_1.default.join(__dirname, 'generated');
|
|
13
|
+
node_fs_1.default.mkdirSync(root, { recursive: true });
|
|
14
|
+
const tempDir = node_fs_1.default.mkdtempSync(node_path_1.default.join(root, prefix));
|
|
15
|
+
t.after(() => {
|
|
16
|
+
node_fs_1.default.rmSync(tempDir, { recursive: true, force: true });
|
|
17
|
+
});
|
|
18
|
+
return tempDir;
|
|
19
|
+
};
|
|
20
|
+
(0, node_test_1.describe)('@unit: findSpecFiles', () => {
|
|
21
|
+
(0, node_test_1.test)('returns spec files with supported extensions', async (t) => {
|
|
22
|
+
const dir = createTempDir(t, 'find-specs-');
|
|
23
|
+
node_fs_1.default.writeFileSync(node_path_1.default.join(dir, 'api.json'), '{}');
|
|
24
|
+
node_fs_1.default.writeFileSync(node_path_1.default.join(dir, 'api.yml'), 'openapi: 3.0.0');
|
|
25
|
+
node_fs_1.default.writeFileSync(node_path_1.default.join(dir, 'api.yaml'), 'openapi: 3.0.0');
|
|
26
|
+
node_fs_1.default.writeFileSync(node_path_1.default.join(dir, 'readme.txt'), 'skip');
|
|
27
|
+
const files = await (0, findSpecFiles_1.findSpecFiles)(dir);
|
|
28
|
+
node_assert_1.default.strictEqual(files.length, 3);
|
|
29
|
+
node_assert_1.default.ok(files.every(file => /\.(json|ya?ml)$/i.test(file)));
|
|
30
|
+
});
|
|
31
|
+
(0, node_test_1.test)('throws when directory does not exist', async () => {
|
|
32
|
+
await node_assert_1.default.rejects(() => (0, findSpecFiles_1.findSpecFiles)(node_path_1.default.join(__dirname, 'missing-dir-never-exists')), /Directory does not exist/);
|
|
33
|
+
});
|
|
34
|
+
(0, node_test_1.test)('throws when path is not a directory', async (t) => {
|
|
35
|
+
const dir = createTempDir(t, 'find-specs-file-');
|
|
36
|
+
const filePath = node_path_1.default.join(dir, 'not-a-dir.json');
|
|
37
|
+
node_fs_1.default.writeFileSync(filePath, '{}');
|
|
38
|
+
await node_assert_1.default.rejects(() => (0, findSpecFiles_1.findSpecFiles)(filePath), /Path is not a directory/);
|
|
39
|
+
});
|
|
40
|
+
(0, node_test_1.test)('returns empty array for directory without specs', async (t) => {
|
|
41
|
+
const dir = createTempDir(t, 'find-specs-empty-');
|
|
42
|
+
const files = await (0, findSpecFiles_1.findSpecFiles)(dir);
|
|
43
|
+
node_assert_1.default.deepStrictEqual(files, []);
|
|
44
|
+
});
|
|
45
|
+
});
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validateSpecFiles.test.d.ts","sourceRoot":"","sources":["../../../../../src/cli/initOpenApiConfig/utils/__tests__/validateSpecFiles.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,61 @@
|
|
|
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 silenceLoggers_1 = require("../../../../test/helpers/silenceLoggers");
|
|
11
|
+
const validateSpecFile_1 = require("../validateSpecFile");
|
|
12
|
+
const validateSpecFiles_1 = require("../validateSpecFiles");
|
|
13
|
+
const minimalOpenApi = {
|
|
14
|
+
openapi: '3.0.3',
|
|
15
|
+
info: { title: 'Test API', version: '1.0.0' },
|
|
16
|
+
paths: {},
|
|
17
|
+
};
|
|
18
|
+
const createSpecFile = (t, content) => {
|
|
19
|
+
const root = node_path_1.default.join(__dirname, 'generated');
|
|
20
|
+
node_fs_1.default.mkdirSync(root, { recursive: true });
|
|
21
|
+
const dir = node_fs_1.default.mkdtempSync(node_path_1.default.join(root, 'spec-'));
|
|
22
|
+
const filePath = node_path_1.default.join(dir, 'spec.json');
|
|
23
|
+
node_fs_1.default.writeFileSync(filePath, JSON.stringify(content), 'utf-8');
|
|
24
|
+
t.after(() => {
|
|
25
|
+
node_fs_1.default.rmSync(dir, { recursive: true, force: true });
|
|
26
|
+
});
|
|
27
|
+
return filePath;
|
|
28
|
+
};
|
|
29
|
+
(0, node_test_1.describe)('@unit: validateSpecFiles', () => {
|
|
30
|
+
let restoreAppLogger;
|
|
31
|
+
(0, node_test_1.beforeEach)(() => {
|
|
32
|
+
restoreAppLogger = (0, silenceLoggers_1.installSilenceAppLogger)();
|
|
33
|
+
});
|
|
34
|
+
(0, node_test_1.afterEach)(() => {
|
|
35
|
+
restoreAppLogger?.();
|
|
36
|
+
restoreAppLogger = undefined;
|
|
37
|
+
});
|
|
38
|
+
(0, node_test_1.test)('validateSpecFile returns true for valid OpenAPI spec', async (t) => {
|
|
39
|
+
const specPath = createSpecFile(t, minimalOpenApi);
|
|
40
|
+
const isValid = await (0, validateSpecFile_1.validateSpecFile)(specPath);
|
|
41
|
+
node_assert_1.default.strictEqual(isValid, true);
|
|
42
|
+
});
|
|
43
|
+
(0, node_test_1.test)('validateSpecFile returns false for invalid file', async (t) => {
|
|
44
|
+
const specPath = createSpecFile(t, { not: 'openapi' });
|
|
45
|
+
const isValid = await (0, validateSpecFile_1.validateSpecFile)(specPath);
|
|
46
|
+
node_assert_1.default.strictEqual(isValid, false);
|
|
47
|
+
});
|
|
48
|
+
(0, node_test_1.test)('validateSpecFiles returns only valid specs with relative paths', async (t) => {
|
|
49
|
+
const validPath = createSpecFile(t, minimalOpenApi);
|
|
50
|
+
const invalidPath = createSpecFile(t, { invalid: true });
|
|
51
|
+
const validated = await (0, validateSpecFiles_1.validateSpecFiles)([validPath, invalidPath]);
|
|
52
|
+
node_assert_1.default.strictEqual(validated.length, 1);
|
|
53
|
+
node_assert_1.default.strictEqual(validated[0].path, validPath);
|
|
54
|
+
node_assert_1.default.ok(validated[0].relativePath.endsWith('spec.json'));
|
|
55
|
+
});
|
|
56
|
+
(0, node_test_1.test)('validateSpecFiles returns empty array when all files invalid', async (t) => {
|
|
57
|
+
const invalidPath = createSpecFile(t, { invalid: true });
|
|
58
|
+
const validated = await (0, validateSpecFiles_1.validateSpecFiles)([invalidPath]);
|
|
59
|
+
node_assert_1.default.deepStrictEqual(validated, []);
|
|
60
|
+
});
|
|
61
|
+
});
|
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
import { OptionValues } from 'commander';
|
|
2
|
+
import { CLICommandResult } from '../types';
|
|
2
3
|
/**
|
|
3
4
|
* Основная функция для предпросмотра изменений
|
|
4
5
|
*
|
|
5
6
|
* TODO: Добавить проверку опций команды перед выполнением
|
|
6
7
|
*/
|
|
7
|
-
export declare function previewChanges(options: OptionValues): Promise<
|
|
8
|
+
export declare function previewChanges(options: OptionValues): Promise<CLICommandResult>;
|
|
8
9
|
//# sourceMappingURL=previewChanges.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"previewChanges.d.ts","sourceRoot":"","sources":["../../../src/cli/previewChanges/previewChanges.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"previewChanges.d.ts","sourceRoot":"","sources":["../../../src/cli/previewChanges/previewChanges.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AAiBzC,OAAO,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC;AAoG5C;;;;GAIG;AACH,wBAAsB,cAAc,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAoNrF"}
|
|
@@ -134,7 +134,7 @@ async function previewChanges(options) {
|
|
|
134
134
|
message: LoggerMessages_1.LOGGER_MESSAGES.ERROR.GENERIC(validationResult.errors.join('\n')),
|
|
135
135
|
});
|
|
136
136
|
await Consts_1.APP_LOGGER.shutdownLoggerAsync();
|
|
137
|
-
|
|
137
|
+
return { success: false, error: validationResult.errors.join('\n') };
|
|
138
138
|
}
|
|
139
139
|
const { openapiConfig, generatedDir, previewDir, diffDir } = validationResult.data;
|
|
140
140
|
const resolvedGeneratedDir = (0, pathHelpers_1.resolveHelper)(process.cwd(), generatedDir || '');
|
|
@@ -147,7 +147,7 @@ async function previewChanges(options) {
|
|
|
147
147
|
message: LoggerMessages_1.LOGGER_MESSAGES.PREVIEW.GENERATED_DIR_EMPTY(generatedDir || ''),
|
|
148
148
|
});
|
|
149
149
|
await Consts_1.APP_LOGGER.shutdownLoggerAsync();
|
|
150
|
-
|
|
150
|
+
return { success: false, error: LoggerMessages_1.LOGGER_MESSAGES.PREVIEW.GENERATED_DIR_EMPTY(generatedDir || '') };
|
|
151
151
|
}
|
|
152
152
|
// 2. Загрузка конфигурации
|
|
153
153
|
const configData = (0, loadConfigIfExists_1.loadConfigIfExists)(openapiConfig);
|
|
@@ -157,7 +157,7 @@ async function previewChanges(options) {
|
|
|
157
157
|
message: LoggerMessages_1.LOGGER_MESSAGES.CONFIG.FILE_MISSING,
|
|
158
158
|
});
|
|
159
159
|
await Consts_1.APP_LOGGER.shutdownLoggerAsync();
|
|
160
|
-
|
|
160
|
+
return { success: false, error: LoggerMessages_1.LOGGER_MESSAGES.CONFIG.FILE_MISSING };
|
|
161
161
|
}
|
|
162
162
|
if (Array.isArray(configData)) {
|
|
163
163
|
Consts_1.APP_LOGGER.warn(LoggerMessages_1.LOGGER_MESSAGES.CONFIG.ARRAY_DEPRECATED);
|
|
@@ -176,7 +176,7 @@ async function previewChanges(options) {
|
|
|
176
176
|
message: LoggerMessages_1.LOGGER_MESSAGES.CONFIG.CONVERSION_FAILED,
|
|
177
177
|
});
|
|
178
178
|
await Consts_1.APP_LOGGER.shutdownLoggerAsync();
|
|
179
|
-
|
|
179
|
+
return { success: false, error: LoggerMessages_1.LOGGER_MESSAGES.CONFIG.CONVERSION_FAILED };
|
|
180
180
|
}
|
|
181
181
|
// 3. Подготовка и создание временной директории preview
|
|
182
182
|
await fileSystemHelpers_1.fileSystemHelpers.rmdir(resolvedPreviewDir);
|
|
@@ -295,7 +295,7 @@ async function previewChanges(options) {
|
|
|
295
295
|
}
|
|
296
296
|
await Consts_1.APP_LOGGER.shutdownLoggerAsync();
|
|
297
297
|
if (exitCode !== 0) {
|
|
298
|
-
|
|
298
|
+
return { success: false };
|
|
299
299
|
}
|
|
300
|
-
|
|
300
|
+
return { success: true };
|
|
301
301
|
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"compareFiles.test.d.ts","sourceRoot":"","sources":["../../../../../src/cli/previewChanges/utils/__tests__/compareFiles.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,52 @@
|
|
|
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 compareFiles_1 = require("../compareFiles");
|
|
11
|
+
const formatDiff_1 = require("../formatDiff");
|
|
12
|
+
const createTempDir = (t, prefix) => {
|
|
13
|
+
const root = node_path_1.default.join(__dirname, 'generated');
|
|
14
|
+
node_fs_1.default.mkdirSync(root, { recursive: true });
|
|
15
|
+
const tempDir = node_fs_1.default.mkdtempSync(node_path_1.default.join(root, prefix));
|
|
16
|
+
t.after(() => {
|
|
17
|
+
node_fs_1.default.rmSync(tempDir, { recursive: true, force: true });
|
|
18
|
+
});
|
|
19
|
+
return tempDir;
|
|
20
|
+
};
|
|
21
|
+
(0, node_test_1.describe)('@unit: compareFiles and formatDiff', () => {
|
|
22
|
+
(0, node_test_1.test)('compareFiles returns null when files are identical', async (t) => {
|
|
23
|
+
const dir = createTempDir(t, 'compare-same-');
|
|
24
|
+
const filePath = node_path_1.default.join(dir, 'same.ts');
|
|
25
|
+
node_fs_1.default.writeFileSync(filePath, 'line1\nline2\n', 'utf-8');
|
|
26
|
+
const diff = await (0, compareFiles_1.compareFiles)(filePath, filePath);
|
|
27
|
+
node_assert_1.default.strictEqual(diff, null);
|
|
28
|
+
});
|
|
29
|
+
(0, node_test_1.test)('compareFiles returns diff when content changed', async (t) => {
|
|
30
|
+
const dir = createTempDir(t, 'compare-diff-');
|
|
31
|
+
const oldPath = node_path_1.default.join(dir, 'old.ts');
|
|
32
|
+
const newPath = node_path_1.default.join(dir, 'new.ts');
|
|
33
|
+
node_fs_1.default.writeFileSync(oldPath, 'alpha\n', 'utf-8');
|
|
34
|
+
node_fs_1.default.writeFileSync(newPath, 'beta\n', 'utf-8');
|
|
35
|
+
const fileDiff = await (0, compareFiles_1.compareFiles)(oldPath, newPath);
|
|
36
|
+
node_assert_1.default.ok(fileDiff);
|
|
37
|
+
node_assert_1.default.ok(fileDiff.some(part => part.added || part.removed));
|
|
38
|
+
});
|
|
39
|
+
(0, node_test_1.test)('formatDiff renders added, removed, and modified statuses', () => {
|
|
40
|
+
const added = (0, formatDiff_1.formatDiff)('new.ts', 'added');
|
|
41
|
+
node_assert_1.default.match(added, /new file/i);
|
|
42
|
+
const removed = (0, formatDiff_1.formatDiff)('old.ts', 'removed');
|
|
43
|
+
node_assert_1.default.match(removed, /deleted/i);
|
|
44
|
+
const modified = (0, formatDiff_1.formatDiff)('changed.ts', 'modified', [
|
|
45
|
+
{ value: 'old\n', removed: true, added: false, count: 0 },
|
|
46
|
+
{ value: 'new\n', removed: false, added: true, count: 0 },
|
|
47
|
+
]);
|
|
48
|
+
node_assert_1.default.match(modified, /```diff/);
|
|
49
|
+
node_assert_1.default.match(modified, /\+\s*new/);
|
|
50
|
+
node_assert_1.default.match(modified, /-\s*old/);
|
|
51
|
+
});
|
|
52
|
+
});
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"isDirectoryEmpty.test.d.ts","sourceRoot":"","sources":["../../../../../src/cli/previewChanges/utils/__tests__/isDirectoryEmpty.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,43 @@
|
|
|
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 isDirectoryEmpty_1 = require("../isDirectoryEmpty");
|
|
11
|
+
const createTempDir = (t, prefix) => {
|
|
12
|
+
const root = node_path_1.default.join(__dirname, 'generated');
|
|
13
|
+
node_fs_1.default.mkdirSync(root, { recursive: true });
|
|
14
|
+
const tempDir = node_fs_1.default.mkdtempSync(node_path_1.default.join(root, prefix));
|
|
15
|
+
t.after(() => {
|
|
16
|
+
node_fs_1.default.rmSync(tempDir, { recursive: true, force: true });
|
|
17
|
+
});
|
|
18
|
+
return tempDir;
|
|
19
|
+
};
|
|
20
|
+
(0, node_test_1.describe)('@unit: isDirectoryEmpty', () => {
|
|
21
|
+
(0, node_test_1.test)('returns true for missing directory', async () => {
|
|
22
|
+
const result = await (0, isDirectoryEmpty_1.isDirectoryEmpty)(node_path_1.default.join(__dirname, 'missing-dir-never-exists'));
|
|
23
|
+
node_assert_1.default.strictEqual(result, true);
|
|
24
|
+
});
|
|
25
|
+
(0, node_test_1.test)('returns true for empty directory', async (t) => {
|
|
26
|
+
const dir = createTempDir(t, 'empty-dir-');
|
|
27
|
+
const result = await (0, isDirectoryEmpty_1.isDirectoryEmpty)(dir);
|
|
28
|
+
node_assert_1.default.strictEqual(result, true);
|
|
29
|
+
});
|
|
30
|
+
(0, node_test_1.test)('returns false for directory with entries', async (t) => {
|
|
31
|
+
const dir = createTempDir(t, 'nonempty-dir-');
|
|
32
|
+
node_fs_1.default.writeFileSync(node_path_1.default.join(dir, 'file.txt'), 'content');
|
|
33
|
+
const result = await (0, isDirectoryEmpty_1.isDirectoryEmpty)(dir);
|
|
34
|
+
node_assert_1.default.strictEqual(result, false);
|
|
35
|
+
});
|
|
36
|
+
(0, node_test_1.test)('returns true when path is a file', async (t) => {
|
|
37
|
+
const dir = createTempDir(t, 'file-path-');
|
|
38
|
+
const filePath = node_path_1.default.join(dir, 'not-dir.txt');
|
|
39
|
+
node_fs_1.default.writeFileSync(filePath, 'x');
|
|
40
|
+
const result = await (0, isDirectoryEmpty_1.isDirectoryEmpty)(filePath);
|
|
41
|
+
node_assert_1.default.strictEqual(result, true);
|
|
42
|
+
});
|
|
43
|
+
});
|