ts-openapi-codegen 2.0.0-beta.3 → 2.0.0-beta.5

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 (95) hide show
  1. package/dist/cli/{generate/runGenerateOpenApi.d.ts → generateOpenApiClient/generateOpenApiClient.d.ts} +2 -2
  2. package/dist/cli/generateOpenApiClient/generateOpenApiClient.d.ts.map +1 -0
  3. package/dist/cli/{generate/runGenerateOpenApi.js → generateOpenApiClient/generateOpenApiClient.js} +2 -2
  4. package/dist/cli/index.js +26 -6
  5. package/dist/cli/initOpenApiConfig/Types.d.ts +5 -0
  6. package/dist/cli/initOpenApiConfig/Types.d.ts.map +1 -1
  7. package/dist/cli/initOpenApiConfig/init.d.ts +6 -0
  8. package/dist/cli/initOpenApiConfig/init.d.ts.map +1 -0
  9. package/dist/cli/initOpenApiConfig/init.js +61 -0
  10. package/dist/cli/initOpenApiConfig/initConfig.d.ts +11 -0
  11. package/dist/cli/initOpenApiConfig/initConfig.d.ts.map +1 -0
  12. package/dist/cli/initOpenApiConfig/initConfig.js +102 -0
  13. package/dist/cli/initOpenApiConfig/initCustomRequest.d.ts +3 -0
  14. package/dist/cli/initOpenApiConfig/initCustomRequest.d.ts.map +1 -0
  15. package/dist/cli/initOpenApiConfig/initCustomRequest.js +23 -0
  16. package/dist/cli/initOpenApiConfig/utils/buildConfig.d.ts +21 -0
  17. package/dist/cli/initOpenApiConfig/utils/buildConfig.d.ts.map +1 -0
  18. package/dist/cli/initOpenApiConfig/utils/buildConfig.js +107 -0
  19. package/dist/cli/initOpenApiConfig/utils/findSpecFiles.d.ts +8 -0
  20. package/dist/cli/initOpenApiConfig/utils/findSpecFiles.d.ts.map +1 -0
  21. package/dist/cli/initOpenApiConfig/utils/findSpecFiles.js +40 -0
  22. package/dist/cli/initOpenApiConfig/utils/registerHandlebarTemplates.d.ts +3 -0
  23. package/dist/cli/initOpenApiConfig/utils/registerHandlebarTemplates.d.ts.map +1 -0
  24. package/dist/cli/initOpenApiConfig/utils/registerHandlebarTemplates.js +53 -0
  25. package/dist/cli/initOpenApiConfig/utils/validateSpecFile.d.ts +7 -0
  26. package/dist/cli/initOpenApiConfig/utils/validateSpecFile.d.ts.map +1 -0
  27. package/dist/cli/initOpenApiConfig/utils/validateSpecFile.js +23 -0
  28. package/dist/cli/initOpenApiConfig/utils/validateSpecFiles.d.ts +11 -0
  29. package/dist/cli/initOpenApiConfig/utils/validateSpecFiles.d.ts.map +1 -0
  30. package/dist/cli/initOpenApiConfig/utils/validateSpecFiles.js +24 -0
  31. package/dist/cli/initOpenApiConfig/utils/writeConfigFile.d.ts +11 -0
  32. package/dist/cli/initOpenApiConfig/utils/writeConfigFile.d.ts.map +1 -0
  33. package/dist/cli/initOpenApiConfig/utils/writeConfigFile.js +31 -0
  34. package/dist/cli/previewChanges/previewChanges.d.ts +8 -0
  35. package/dist/cli/previewChanges/previewChanges.d.ts.map +1 -0
  36. package/dist/cli/previewChanges/previewChanges.js +182 -0
  37. package/dist/cli/previewChanges/utils/compareFiles.d.ts +6 -0
  38. package/dist/cli/previewChanges/utils/compareFiles.d.ts.map +1 -0
  39. package/dist/cli/previewChanges/utils/compareFiles.js +50 -0
  40. package/dist/cli/previewChanges/utils/formatDiff.d.ts +6 -0
  41. package/dist/cli/previewChanges/utils/formatDiff.d.ts.map +1 -0
  42. package/dist/cli/previewChanges/utils/formatDiff.js +30 -0
  43. package/dist/cli/previewChanges/utils/isDirectoryEmpty.d.ts +5 -0
  44. package/dist/cli/previewChanges/utils/isDirectoryEmpty.d.ts.map +1 -0
  45. package/dist/cli/previewChanges/utils/isDirectoryEmpty.js +17 -0
  46. package/dist/cli/previewChanges/utils/readDirectoryRecursive.d.ts +5 -0
  47. package/dist/cli/previewChanges/utils/readDirectoryRecursive.d.ts.map +1 -0
  48. package/dist/cli/previewChanges/utils/readDirectoryRecursive.js +28 -0
  49. package/dist/cli/previewChanges/utils/updateOutputPaths.d.ts +10 -0
  50. package/dist/cli/previewChanges/utils/updateOutputPaths.d.ts.map +1 -0
  51. package/dist/cli/previewChanges/utils/updateOutputPaths.js +106 -0
  52. package/dist/cli/schemas/init.d.ts +4 -2
  53. package/dist/cli/schemas/init.d.ts.map +1 -1
  54. package/dist/cli/schemas/init.js +5 -2
  55. package/dist/common/Consts.d.ts +3 -0
  56. package/dist/common/Consts.d.ts.map +1 -1
  57. package/dist/common/Consts.js +4 -1
  58. package/dist/common/VersionedSchema/AllVersionedSchemas/UnifiedOptionsSchemaV1.d.ts.map +1 -1
  59. package/dist/common/VersionedSchema/AllVersionedSchemas/UnifiedOptionsSchemaV1.js +5 -6
  60. package/dist/common/VersionedSchema/AllVersionedSchemas/UnifiedOptionsSchemaV2.d.ts.map +1 -1
  61. package/dist/common/VersionedSchema/AllVersionedSchemas/UnifiedOptionsSchemaV2.js +5 -6
  62. package/dist/common/utils/fileSystemHelpers.d.ts +3 -1
  63. package/dist/common/utils/fileSystemHelpers.d.ts.map +1 -1
  64. package/dist/common/utils/fileSystemHelpers.js +3 -0
  65. package/dist/core/__tests__/WriteClient.test.js +0 -4
  66. package/dist/core/utils/__mocks__/templates.d.ts.map +1 -1
  67. package/dist/core/utils/__mocks__/templates.js +0 -4
  68. package/dist/core/utils/__tests__/registerHandlebarTemplates.test.js +2 -0
  69. package/dist/core/utils/__tests__/resolveRefToImportPath.test.js +9 -0
  70. package/dist/core/utils/registerHandlebarTemplates.d.ts +1 -5
  71. package/dist/core/utils/registerHandlebarTemplates.d.ts.map +1 -1
  72. package/dist/core/utils/registerHandlebarTemplates.js +9 -10
  73. package/dist/core/utils/resolveRefToImportPath.d.ts.map +1 -1
  74. package/dist/core/utils/resolveRefToImportPath.js +13 -7
  75. package/dist/core/utils/writeClientSchemas.d.ts.map +1 -1
  76. package/dist/core/utils/writeClientSchemas.js +22 -31
  77. package/dist/templatesCompiled/cli/customRequest.d.ts +11 -0
  78. package/dist/templatesCompiled/cli/customRequest.d.ts.map +1 -0
  79. package/dist/templatesCompiled/cli/customRequest.js +27 -0
  80. package/dist/templatesCompiled/cli/customRequestExecutor.d.ts +11 -0
  81. package/dist/templatesCompiled/cli/customRequestExecutor.d.ts.map +1 -0
  82. package/dist/templatesCompiled/cli/customRequestExecutor.js +27 -0
  83. package/dist/templatesCompiled/cli/openApiConfig.d.ts +2 -1
  84. package/dist/templatesCompiled/cli/openApiConfig.d.ts.map +1 -1
  85. package/dist/templatesCompiled/cli/openApiConfig.js +76 -4
  86. package/dist/templatesCompiled/client/core/request-executor.js +1 -1
  87. package/dist/templatesCompiled/client/partials/parameters.js +1 -1
  88. package/dist/templatesCompiled/client/partials/serviceOption.d.ts +1 -4
  89. package/dist/templatesCompiled/client/partials/serviceOption.d.ts.map +1 -1
  90. package/dist/templatesCompiled/client/partials/serviceOption.js +28 -48
  91. package/package.json +2 -1
  92. package/dist/cli/generate/runGenerateOpenApi.d.ts.map +0 -1
  93. package/dist/cli/initOpenApiConfig/runInitOpenapiConfig.d.ts +0 -3
  94. package/dist/cli/initOpenApiConfig/runInitOpenapiConfig.d.ts.map +0 -1
  95. package/dist/cli/initOpenApiConfig/runInitOpenapiConfig.js +0 -70
@@ -3,5 +3,5 @@ import { OptionValues } from 'commander';
3
3
  * Запускает генерацию OpenAPI клиента
4
4
  * Поддерживает как конфиг-файл, так и параметры из CLI
5
5
  */
6
- export declare function runGenerateOpenApi(options: OptionValues): Promise<void>;
7
- //# sourceMappingURL=runGenerateOpenApi.d.ts.map
6
+ export declare function generateOpenApiClient(options: OptionValues): Promise<void>;
7
+ //# sourceMappingURL=generateOpenApiClient.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generateOpenApiClient.d.ts","sourceRoot":"","sources":["../../../src/cli/generateOpenApiClient/generateOpenApiClient.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AAgBzC;;;GAGG;AACH,wBAAsB,qBAAqB,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CA8DhF"}
@@ -33,7 +33,7 @@ var __importStar = (this && this.__importStar) || (function () {
33
33
  };
34
34
  })();
35
35
  Object.defineProperty(exports, "__esModule", { value: true });
36
- exports.runGenerateOpenApi = runGenerateOpenApi;
36
+ exports.generateOpenApiClient = generateOpenApiClient;
37
37
  const Consts_1 = require("../../common/Consts");
38
38
  const defaultOptions_1 = require("../../common/defaultOptions");
39
39
  const Enums_1 = require("../../common/Enums");
@@ -50,7 +50,7 @@ const validation_1 = require("../validation");
50
50
  * Запускает генерацию OpenAPI клиента
51
51
  * Поддерживает как конфиг-файл, так и параметры из CLI
52
52
  */
53
- async function runGenerateOpenApi(options) {
53
+ async function generateOpenApiClient(options) {
54
54
  const { openapiConfig, ...clientOptions } = options;
55
55
  try {
56
56
  // Валидация опций через Zod
package/dist/cli/index.js CHANGED
@@ -14,9 +14,9 @@ const HttpClient_enum_1 = require("../core/types/enums/HttpClient.enum");
14
14
  const ValidationLibrary_enum_1 = require("../core/types/enums/ValidationLibrary.enum");
15
15
  const checkConfig_1 = require("./checkAndUpdateConfig/checkConfig");
16
16
  const updateConfig_1 = require("./checkAndUpdateConfig/updateConfig");
17
- const runGenerateOpenApi_1 = require("./generate/runGenerateOpenApi");
18
- const Enums_2 = require("./initOpenApiConfig/Enums");
19
- const runInitOpenapiConfig_1 = require("./initOpenApiConfig/runInitOpenapiConfig");
17
+ const generateOpenApiClient_1 = require("./generateOpenApiClient/generateOpenApiClient");
18
+ const init_1 = require("./initOpenApiConfig/init");
19
+ const previewChanges_1 = require("./previewChanges/previewChanges");
20
20
  const utils_1 = require("./utils");
21
21
  const packageDetails = JSON.parse(fs_1.default.readFileSync((0, pathHelpers_1.joinHelper)(__dirname, '../../package.json'), 'utf-8'));
22
22
  const APP_NAME = packageDetails.name || 'ts-openapi-codegen-cli';
@@ -61,7 +61,7 @@ program
61
61
  await updateNotifier.checkAndNotify();
62
62
  })
63
63
  .action(async (options) => {
64
- await (0, runGenerateOpenApi_1.runGenerateOpenApi)(options);
64
+ await (0, generateOpenApiClient_1.generateOpenApiClient)(options);
65
65
  });
66
66
  /**
67
67
  * check - Команда для проверки конфигурационного файла
@@ -99,12 +99,32 @@ program
99
99
  .description('Generates a configuration file template for a set of single or multiple options')
100
100
  .addHelpText('before', (0, utils_1.getCLIName)(APP_NAME))
101
101
  .option('-ocn, --openapi-config <value>', 'The path to the configuration file, listing the options', Consts_1.DEFAULT_OPENAPI_CONFIG_FILENAME)
102
- .addOption(new commander_1.Option('-t, --type <type>', 'A variant of the set of options for running the client generator (default: "OPTION")').choices([...Object.values(Enums_2.EOptionType)]).default(Enums_2.EOptionType.OPTION))
102
+ .option('-sd, --specs-dir <value>', 'Путь до директории с файлами спецификации', './openapi')
103
+ .option('--request <value>', 'Path to custom request file')
104
+ .option('--useCancelableRequest', 'Use cancelled promise as returned data type in request (default: false)')
105
+ .option('--useInteractiveMode', 'Использовать интерактивный режим команды. В терминале будут задаваться вопросы (default: false)')
106
+ .hook('preAction', async () => {
107
+ await updateNotifier.checkAndNotify();
108
+ })
109
+ .action(async (options) => {
110
+ await (0, init_1.init)(options);
111
+ });
112
+ /**
113
+ * preview-changes - Команда для предпросмотра изменений перед генерацией
114
+ */
115
+ program
116
+ .command('preview-changes')
117
+ .description('Preview changes that will be made to generated code before applying them')
118
+ .addHelpText('before', (0, utils_1.getCLIName)(APP_NAME))
119
+ .option('-ocn, --openapi-config <value>', 'The path to the configuration file, listing the options', Consts_1.DEFAULT_OPENAPI_CONFIG_FILENAME)
120
+ .option('-gd, --generated-dir <value>', 'Directory with previously generated code (default: "generated")', './generated')
121
+ .option('-pd, --preview-dir <value>', 'Temporary directory for preview generation (default: "generated-preview")', './generated-preview')
122
+ .option('-dd, --diff-dir <value>', 'Directory to save diff files (default: "generated-diff")', './generated-diff')
103
123
  .hook('preAction', async () => {
104
124
  await updateNotifier.checkAndNotify();
105
125
  })
106
126
  .action(async (options) => {
107
- await (0, runInitOpenapiConfig_1.runInitOpenapiConfig)(options);
127
+ await (0, previewChanges_1.previewChanges)(options);
108
128
  });
109
129
  program.exitOverride();
110
130
  // TODO: Включить позже!
@@ -3,4 +3,9 @@ export type TInitOpenApiConfigParams = {
3
3
  type: EOptionType;
4
4
  openapiConfig?: string;
5
5
  };
6
+ export type CLITemplates = {
7
+ config: Handlebars.TemplateDelegate;
8
+ request: Handlebars.TemplateDelegate;
9
+ requestExecutor: Handlebars.TemplateDelegate;
10
+ };
6
11
  //# sourceMappingURL=Types.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"Types.d.ts","sourceRoot":"","sources":["../../../src/cli/initOpenApiConfig/Types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAEtC,MAAM,MAAM,wBAAwB,GAAG;IACnC,IAAI,EAAE,WAAW,CAAC;IAClB,aAAa,CAAC,EAAE,MAAM,CAAC;CAC1B,CAAA"}
1
+ {"version":3,"file":"Types.d.ts","sourceRoot":"","sources":["../../../src/cli/initOpenApiConfig/Types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAEtC,MAAM,MAAM,wBAAwB,GAAG;IACnC,IAAI,EAAE,WAAW,CAAC;IAClB,aAAa,CAAC,EAAE,MAAM,CAAC;CAC1B,CAAA;AAED,MAAM,MAAM,YAAY,GAAG;IACvB,MAAM,EAAE,UAAU,CAAC,gBAAgB,CAAC;IACpC,OAAO,EAAE,UAAU,CAAC,gBAAgB,CAAC;IACrC,eAAe,EAAE,UAAU,CAAC,gBAAgB,CAAC;CAChD,CAAC"}
@@ -0,0 +1,6 @@
1
+ import { OptionValues } from 'commander';
2
+ /**
3
+ * Фнукция изначальной настройки файлов конфигурации для последующего запуска генератора
4
+ */
5
+ export declare function init(options: OptionValues): Promise<void>;
6
+ //# sourceMappingURL=init.d.ts.map
@@ -0,0 +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;AAUzC;;GAEG;AACH,wBAAsB,IAAI,CAAC,OAAO,EAAE,YAAY,iBAmD/C"}
@@ -0,0 +1,61 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.init = init;
4
+ const Consts_1 = require("../../common/Consts");
5
+ const confirmDialog_1 = require("../interactive/confirmDialog");
6
+ const schemas_1 = require("../schemas");
7
+ const validation_1 = require("../validation");
8
+ const initConfig_1 = require("./initConfig");
9
+ const initCustomRequest_1 = require("./initCustomRequest");
10
+ const registerHandlebarTemplates_1 = require("./utils/registerHandlebarTemplates");
11
+ /**
12
+ * Фнукция изначальной настройки файлов конфигурации для последующего запуска генератора
13
+ */
14
+ async function init(options) {
15
+ let validatedOptions;
16
+ try {
17
+ // Валидация опций через Zod
18
+ const validationResult = (0, validation_1.validateCLIOptions)(schemas_1.initOptionsSchema, options);
19
+ if (!validationResult.success) {
20
+ Consts_1.APP_LOGGER.error(validationResult.error);
21
+ process.exit(1);
22
+ }
23
+ validatedOptions = validationResult.data;
24
+ }
25
+ catch (error) {
26
+ Consts_1.APP_LOGGER.error(error.message);
27
+ process.exit(1);
28
+ }
29
+ const templates = (0, registerHandlebarTemplates_1.registerHandlebarTemplates)();
30
+ if (validatedOptions.useInteractiveMode) {
31
+ const shouldInitConfig = await (0, confirmDialog_1.confirmDialog)({
32
+ message: 'Желаете сформировать конфигурационный файл для быстрого запуска генератора?',
33
+ initial: false,
34
+ });
35
+ if (shouldInitConfig) {
36
+ // TODO: генерация по шаблону!
37
+ await (0, initConfig_1.initConfig)({
38
+ openapiConfig: validatedOptions.openapiConfig,
39
+ request: validatedOptions.request,
40
+ specsDir: validatedOptions.specsDir,
41
+ templates,
42
+ });
43
+ }
44
+ const shouldInitCustomRequest = await (0, confirmDialog_1.confirmDialog)({
45
+ message: 'Желаете сформировать файл с пользовательским вариантом обработки запросов?',
46
+ initial: false,
47
+ });
48
+ if (shouldInitCustomRequest) {
49
+ await (0, initCustomRequest_1.initCustomRequest)(templates, validatedOptions?.useCancelableRequest);
50
+ }
51
+ }
52
+ else {
53
+ await (0, initConfig_1.initConfig)({
54
+ openapiConfig: validatedOptions.openapiConfig,
55
+ request: validatedOptions.request,
56
+ specsDir: validatedOptions.specsDir,
57
+ templates,
58
+ });
59
+ await (0, initCustomRequest_1.initCustomRequest)(templates, validatedOptions?.useCancelableRequest);
60
+ }
61
+ }
@@ -0,0 +1,11 @@
1
+ import { InitOptions } from '../schemas';
2
+ import { CLITemplates } from './Types';
3
+ type InitConfigParams = Pick<InitOptions, 'openapiConfig' | 'specsDir' | 'request'> & {
4
+ templates: CLITemplates;
5
+ };
6
+ /**
7
+ * Инициализирует файл конфигурации OpenAPI
8
+ */
9
+ export declare function initConfig(params: InitConfigParams): Promise<void>;
10
+ export {};
11
+ //# sourceMappingURL=initConfig.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"initConfig.d.ts","sourceRoot":"","sources":["../../../src/cli/initOpenApiConfig/initConfig.ts"],"names":[],"mappings":"AAQA,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AACzC,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAMvC,KAAK,gBAAgB,GAAG,IAAI,CAAC,WAAW,EAAE,eAAe,GAAG,UAAU,GAAG,SAAS,CAAC,GAAG;IAClF,SAAS,EAAE,YAAY,CAAC;CAC3B,CAAA;AAED;;GAEG;AACH,wBAAsB,UAAU,CAAC,MAAM,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CAoGxE"}
@@ -0,0 +1,102 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.initConfig = initConfig;
4
+ const Consts_1 = require("../../common/Consts");
5
+ const fileSystemHelpers_1 = require("../../common/utils/fileSystemHelpers");
6
+ const pathHelpers_1 = require("../../common/utils/pathHelpers");
7
+ const confirmDialog_1 = require("../interactive/confirmDialog");
8
+ const constants_1 = require("../interactive/constants");
9
+ const selectDialog_1 = require("../interactive/selectDialog");
10
+ const types_1 = require("../interactive/types");
11
+ const buildConfig_1 = require("./utils/buildConfig");
12
+ const findSpecFiles_1 = require("./utils/findSpecFiles");
13
+ const validateSpecFiles_1 = require("./utils/validateSpecFiles");
14
+ const writeConfigFile_1 = require("./utils/writeConfigFile");
15
+ /**
16
+ * Инициализирует файл конфигурации OpenAPI
17
+ */
18
+ async function initConfig(params) {
19
+ const configPath = (0, pathHelpers_1.resolveHelper)(process.cwd(), params.openapiConfig);
20
+ const configExists = await fileSystemHelpers_1.fileSystemHelpers.exists(configPath);
21
+ // Шаг 3: Проверка существования файла конфигурации
22
+ if (configExists) {
23
+ const shouldRegenerate = await (0, confirmDialog_1.confirmDialog)({
24
+ message: 'Configuration file already exists. Do you want to regenerate it?',
25
+ initial: false,
26
+ });
27
+ if (!shouldRegenerate) {
28
+ Consts_1.APP_LOGGER.info('Configuration file left unchanged.');
29
+ return;
30
+ }
31
+ }
32
+ const currentSpecsDir = params.specsDir;
33
+ // Шаг 4: Формирование файла конфигурации
34
+ // Поиск файлов спецификаций
35
+ let specFiles = [];
36
+ try {
37
+ specFiles = await (0, findSpecFiles_1.findSpecFiles)(currentSpecsDir);
38
+ }
39
+ catch (error) {
40
+ Consts_1.APP_LOGGER.warn(`Error finding spec files: ${error instanceof Error ? error.message : String(error)}`);
41
+ }
42
+ if (specFiles.length === 0) {
43
+ Consts_1.APP_LOGGER.warn(`No spec files found in directory: ${currentSpecsDir}`);
44
+ }
45
+ // Валидация файлов
46
+ const validatedSpecs = await (0, validateSpecFiles_1.validateSpecFiles)(specFiles);
47
+ let config;
48
+ let useMultiOption = false;
49
+ let customRequest;
50
+ let perSpecRequest = false;
51
+ if (validatedSpecs.length > 0) {
52
+ // Если найдены валидные спецификации, спрашиваем о типе конфигурации
53
+ useMultiOption = validatedSpecs.length > 1;
54
+ // Спрашиваем про пользовательскую реализацию request
55
+ const hasCustomRequest = await (0, confirmDialog_1.confirmDialog)({
56
+ message: 'Do you want to use a custom request implementation?',
57
+ initial: false,
58
+ });
59
+ if (hasCustomRequest) {
60
+ if (useMultiOption) {
61
+ perSpecRequest = await (0, confirmDialog_1.confirmDialog)({
62
+ message: 'Will each specification have its own request?',
63
+ initial: false,
64
+ });
65
+ }
66
+ customRequest = params.request;
67
+ }
68
+ config = await (0, buildConfig_1.buildConfig)(validatedSpecs, useMultiOption, customRequest, perSpecRequest);
69
+ }
70
+ else {
71
+ // Если валидных спецификаций нет, предлагаем создать пример
72
+ Consts_1.APP_LOGGER.warn('No valid OpenAPI specification files found.');
73
+ const action = await (0, selectDialog_1.selectDialog)({
74
+ message: 'What would you like to do?',
75
+ choices: constants_1.OPEN_API_CONFIG_SELECT_OPTIONS,
76
+ initial: 0,
77
+ });
78
+ if (action === types_1.EConfigType.NONE) {
79
+ Consts_1.APP_LOGGER.info('Configuration file generation cancelled.');
80
+ return;
81
+ }
82
+ useMultiOption = action === types_1.EConfigType.MULTI;
83
+ // Спрашиваем про пользовательскую реализацию request
84
+ const hasCustomRequest = await (0, confirmDialog_1.confirmDialog)({
85
+ message: 'Do you want to use a custom request implementation?',
86
+ initial: false,
87
+ });
88
+ if (hasCustomRequest) {
89
+ if (useMultiOption) {
90
+ perSpecRequest = await (0, confirmDialog_1.confirmDialog)({
91
+ message: 'Will each specification have its own request?',
92
+ initial: false,
93
+ });
94
+ }
95
+ customRequest = './custom-request.ts';
96
+ }
97
+ // Создаем пример конфигурации
98
+ config = (0, buildConfig_1.buildExampleConfig)(useMultiOption, customRequest, perSpecRequest);
99
+ }
100
+ // Записываем конфигурацию на диск
101
+ await (0, writeConfigFile_1.writeConfigFile)(params.openapiConfig, config, params.templates);
102
+ }
@@ -0,0 +1,3 @@
1
+ import { CLITemplates } from './Types';
2
+ export declare function initCustomRequest(templates: CLITemplates, useCancelableRequest?: boolean): Promise<void>;
3
+ //# sourceMappingURL=initCustomRequest.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"initCustomRequest.d.ts","sourceRoot":"","sources":["../../../src/cli/initOpenApiConfig/initCustomRequest.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAEvC,wBAAsB,iBAAiB,CAAC,SAAS,EAAE,YAAY,EAAE,oBAAoB,CAAC,EAAE,OAAO,iBAkB9F"}
@@ -0,0 +1,23 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.initCustomRequest = initCustomRequest;
4
+ const fileSystemHelpers_1 = require("../../common/utils/fileSystemHelpers");
5
+ const format_1 = require("../../common/utils/format");
6
+ const pathHelpers_1 = require("../../common/utils/pathHelpers");
7
+ const confirmDialog_1 = require("../interactive/confirmDialog");
8
+ async function initCustomRequest(templates, useCancelableRequest) {
9
+ // TODO: Подумать над правильной постановкой вопроса!
10
+ const shouldRequestExecutor = await (0, confirmDialog_1.confirmDialog)({
11
+ message: 'Желаете сформировать пользовательский обработчик request в новом формате?',
12
+ initial: false,
13
+ });
14
+ const artifacts = {
15
+ useCancelableRequest,
16
+ };
17
+ const customRequestPath = './src/custom/request.ts';
18
+ const file = (0, pathHelpers_1.resolveHelper)(process.cwd(), customRequestPath);
19
+ const templateResult = shouldRequestExecutor ? templates.requestExecutor(artifacts) : templates.request(artifacts);
20
+ const formattedValue = await (0, format_1.format)(templateResult);
21
+ await fileSystemHelpers_1.fileSystemHelpers.writeFile(file, formattedValue);
22
+ return;
23
+ }
@@ -0,0 +1,21 @@
1
+ import { TRawOptions } from '../../../common/TRawOptions';
2
+ import { ValidatedSpec } from './validateSpecFiles';
3
+ /**
4
+ * Формирует конфигурацию на основе валидированных спецификаций
5
+ * @param validatedSpecs - Массив валидированных спецификаций
6
+ * @param useMultiOption - Использовать множественный формат (items)
7
+ * @param customRequest - Путь к кастомной реализации request (опционально)
8
+ * @param perSpecRequest - Использовать отдельный request для каждой спецификации (только для MULTI)
9
+ * @returns Объект конфигурации
10
+ * @throws {Error} Если нет валидированных спецификаций для плоского формата
11
+ */
12
+ export declare function buildConfig(validatedSpecs: ValidatedSpec[], useMultiOption: boolean, customRequest?: string, perSpecRequest?: boolean): Promise<TRawOptions>;
13
+ /**
14
+ * Создает пример конфигурации, когда нет валидированных спецификаций
15
+ * @param useMultiOption - Использовать множественный формат (items)
16
+ * @param customRequest - Путь к кастомной реализации request (опционально)
17
+ * @param perSpecRequest - Использовать отдельный request для каждой спецификации (только для MULTI)
18
+ * @returns Объект конфигурации-примера
19
+ */
20
+ export declare function buildExampleConfig(useMultiOption: boolean, customRequest?: string, perSpecRequest?: boolean): TRawOptions;
21
+ //# sourceMappingURL=buildConfig.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"buildConfig.d.ts","sourceRoot":"","sources":["../../../../src/cli/initOpenApiConfig/utils/buildConfig.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,6BAA6B,CAAC;AAC1D,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAEpD;;;;;;;;GAQG;AACH,wBAAsB,WAAW,CAAC,cAAc,EAAE,aAAa,EAAE,EAAE,cAAc,EAAE,OAAO,EAAE,aAAa,CAAC,EAAE,MAAM,EAAE,cAAc,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,WAAW,CAAC,CA8ClK;AAED;;;;;;GAMG;AACH,wBAAgB,kBAAkB,CAAC,cAAc,EAAE,OAAO,EAAE,aAAa,CAAC,EAAE,MAAM,EAAE,cAAc,CAAC,EAAE,OAAO,GAAG,WAAW,CAuCzH"}
@@ -0,0 +1,107 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.buildConfig = buildConfig;
4
+ exports.buildExampleConfig = buildExampleConfig;
5
+ const Consts_1 = require("../../../common/Consts");
6
+ /**
7
+ * Формирует конфигурацию на основе валидированных спецификаций
8
+ * @param validatedSpecs - Массив валидированных спецификаций
9
+ * @param useMultiOption - Использовать множественный формат (items)
10
+ * @param customRequest - Путь к кастомной реализации request (опционально)
11
+ * @param perSpecRequest - Использовать отдельный request для каждой спецификации (только для MULTI)
12
+ * @returns Объект конфигурации
13
+ * @throws {Error} Если нет валидированных спецификаций для плоского формата
14
+ */
15
+ async function buildConfig(validatedSpecs, useMultiOption, customRequest, perSpecRequest) {
16
+ if (useMultiOption) {
17
+ const items = validatedSpecs.map(spec => ({
18
+ input: spec.relativePath,
19
+ output: Consts_1.DEFAULT_OUTPUT_API_DIR,
20
+ ...(perSpecRequest && customRequest ? { request: customRequest } : {}),
21
+ }));
22
+ return {
23
+ items,
24
+ httpClient: Consts_1.COMMON_DEFAULT_OPTIONS_VALUES.httpClient,
25
+ sortByRequired: Consts_1.COMMON_DEFAULT_OPTIONS_VALUES.sortByRequired,
26
+ enumPrefix: Consts_1.COMMON_DEFAULT_OPTIONS_VALUES.enumPrefix,
27
+ excludeCoreServiceFiles: Consts_1.COMMON_DEFAULT_OPTIONS_VALUES.excludeCoreServiceFiles,
28
+ interfacePrefix: Consts_1.COMMON_DEFAULT_OPTIONS_VALUES.interfacePrefix,
29
+ typePrefix: Consts_1.COMMON_DEFAULT_OPTIONS_VALUES.typePrefix,
30
+ useCancelableRequest: Consts_1.COMMON_DEFAULT_OPTIONS_VALUES.useCancelableRequest,
31
+ useOptions: Consts_1.COMMON_DEFAULT_OPTIONS_VALUES.useOptions,
32
+ useSeparatedIndexes: Consts_1.COMMON_DEFAULT_OPTIONS_VALUES.useSeparatedIndexes,
33
+ useUnionTypes: Consts_1.COMMON_DEFAULT_OPTIONS_VALUES.useUnionTypes,
34
+ ...(!perSpecRequest && customRequest ? { request: customRequest } : {}),
35
+ };
36
+ }
37
+ else {
38
+ if (validatedSpecs.length === 0) {
39
+ throw new Error('No validated spec files found');
40
+ }
41
+ // Для плоского варианта используем первую спецификацию
42
+ const firstSpec = validatedSpecs[0];
43
+ return {
44
+ input: firstSpec.relativePath,
45
+ output: Consts_1.DEFAULT_OUTPUT_API_DIR,
46
+ httpClient: Consts_1.COMMON_DEFAULT_OPTIONS_VALUES.httpClient,
47
+ sortByRequired: Consts_1.COMMON_DEFAULT_OPTIONS_VALUES.sortByRequired,
48
+ enumPrefix: Consts_1.COMMON_DEFAULT_OPTIONS_VALUES.enumPrefix,
49
+ excludeCoreServiceFiles: Consts_1.COMMON_DEFAULT_OPTIONS_VALUES.excludeCoreServiceFiles,
50
+ interfacePrefix: Consts_1.COMMON_DEFAULT_OPTIONS_VALUES.interfacePrefix,
51
+ typePrefix: Consts_1.COMMON_DEFAULT_OPTIONS_VALUES.typePrefix,
52
+ useCancelableRequest: Consts_1.COMMON_DEFAULT_OPTIONS_VALUES.useCancelableRequest,
53
+ useOptions: Consts_1.COMMON_DEFAULT_OPTIONS_VALUES.useOptions,
54
+ useSeparatedIndexes: Consts_1.COMMON_DEFAULT_OPTIONS_VALUES.useSeparatedIndexes,
55
+ useUnionTypes: Consts_1.COMMON_DEFAULT_OPTIONS_VALUES.useUnionTypes,
56
+ ...(customRequest ? { request: customRequest } : {}),
57
+ };
58
+ }
59
+ }
60
+ /**
61
+ * Создает пример конфигурации, когда нет валидированных спецификаций
62
+ * @param useMultiOption - Использовать множественный формат (items)
63
+ * @param customRequest - Путь к кастомной реализации request (опционально)
64
+ * @param perSpecRequest - Использовать отдельный request для каждой спецификации (только для MULTI)
65
+ * @returns Объект конфигурации-примера
66
+ */
67
+ function buildExampleConfig(useMultiOption, customRequest, perSpecRequest) {
68
+ if (useMultiOption) {
69
+ return {
70
+ items: [
71
+ {
72
+ input: './openapi/spec.yml',
73
+ output: Consts_1.DEFAULT_OUTPUT_API_DIR,
74
+ ...(perSpecRequest && customRequest ? { request: customRequest } : {}),
75
+ },
76
+ ],
77
+ httpClient: Consts_1.COMMON_DEFAULT_OPTIONS_VALUES.httpClient,
78
+ sortByRequired: Consts_1.COMMON_DEFAULT_OPTIONS_VALUES.sortByRequired,
79
+ enumPrefix: Consts_1.COMMON_DEFAULT_OPTIONS_VALUES.enumPrefix,
80
+ excludeCoreServiceFiles: Consts_1.COMMON_DEFAULT_OPTIONS_VALUES.excludeCoreServiceFiles,
81
+ interfacePrefix: Consts_1.COMMON_DEFAULT_OPTIONS_VALUES.interfacePrefix,
82
+ typePrefix: Consts_1.COMMON_DEFAULT_OPTIONS_VALUES.typePrefix,
83
+ useCancelableRequest: Consts_1.COMMON_DEFAULT_OPTIONS_VALUES.useCancelableRequest,
84
+ useOptions: Consts_1.COMMON_DEFAULT_OPTIONS_VALUES.useOptions,
85
+ useSeparatedIndexes: Consts_1.COMMON_DEFAULT_OPTIONS_VALUES.useSeparatedIndexes,
86
+ useUnionTypes: Consts_1.COMMON_DEFAULT_OPTIONS_VALUES.useUnionTypes,
87
+ ...(!perSpecRequest && customRequest ? { request: customRequest } : {}),
88
+ };
89
+ }
90
+ else {
91
+ return {
92
+ input: './openapi/spec.yml',
93
+ output: Consts_1.DEFAULT_OUTPUT_API_DIR,
94
+ httpClient: Consts_1.COMMON_DEFAULT_OPTIONS_VALUES.httpClient,
95
+ sortByRequired: Consts_1.COMMON_DEFAULT_OPTIONS_VALUES.sortByRequired,
96
+ enumPrefix: Consts_1.COMMON_DEFAULT_OPTIONS_VALUES.enumPrefix,
97
+ excludeCoreServiceFiles: Consts_1.COMMON_DEFAULT_OPTIONS_VALUES.excludeCoreServiceFiles,
98
+ interfacePrefix: Consts_1.COMMON_DEFAULT_OPTIONS_VALUES.interfacePrefix,
99
+ typePrefix: Consts_1.COMMON_DEFAULT_OPTIONS_VALUES.typePrefix,
100
+ useCancelableRequest: Consts_1.COMMON_DEFAULT_OPTIONS_VALUES.useCancelableRequest,
101
+ useOptions: Consts_1.COMMON_DEFAULT_OPTIONS_VALUES.useOptions,
102
+ useSeparatedIndexes: Consts_1.COMMON_DEFAULT_OPTIONS_VALUES.useSeparatedIndexes,
103
+ useUnionTypes: Consts_1.COMMON_DEFAULT_OPTIONS_VALUES.useUnionTypes,
104
+ ...(customRequest ? { request: customRequest } : {}),
105
+ };
106
+ }
107
+ }
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Находит все файлы спецификаций в директории
3
+ * @param specsDir - Путь к директории со спецификациями
4
+ * @returns Массив путей к файлам спецификаций
5
+ * @throws {Error} Если директория не существует или не является директорией
6
+ */
7
+ export declare function findSpecFiles(specsDir: string): Promise<string[]>;
8
+ //# sourceMappingURL=findSpecFiles.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"findSpecFiles.d.ts","sourceRoot":"","sources":["../../../../src/cli/initOpenApiConfig/utils/findSpecFiles.ts"],"names":[],"mappings":"AAOA;;;;;GAKG;AACH,wBAAsB,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CA6BvE"}
@@ -0,0 +1,40 @@
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
+ exports.findSpecFiles = findSpecFiles;
7
+ const path_1 = __importDefault(require("path"));
8
+ const fileSystemHelpers_1 = require("../../../common/utils/fileSystemHelpers");
9
+ const pathHelpers_1 = require("../../../common/utils/pathHelpers");
10
+ const SPEC_EXTENSIONS = ['.json', '.yaml', '.yml'];
11
+ /**
12
+ * Находит все файлы спецификаций в директории
13
+ * @param specsDir - Путь к директории со спецификациями
14
+ * @returns Массив путей к файлам спецификаций
15
+ * @throws {Error} Если директория не существует или не является директорией
16
+ */
17
+ async function findSpecFiles(specsDir) {
18
+ const resolvedDir = (0, pathHelpers_1.resolveHelper)(process.cwd(), specsDir);
19
+ const dirExists = await fileSystemHelpers_1.fileSystemHelpers.exists(resolvedDir);
20
+ if (!dirExists) {
21
+ throw new Error(`Directory does not exist: ${specsDir}`);
22
+ }
23
+ const isDir = fileSystemHelpers_1.fileSystemHelpers.isDirectory(resolvedDir);
24
+ if (!isDir) {
25
+ throw new Error(`Path is not a directory: ${specsDir}`);
26
+ }
27
+ const files = await fileSystemHelpers_1.fileSystemHelpers.readdir(resolvedDir);
28
+ const specFiles = [];
29
+ for (const file of files) {
30
+ const filePath = (0, pathHelpers_1.joinHelper)(resolvedDir, file);
31
+ const isFile = fileSystemHelpers_1.fileSystemHelpers.isPathToFile(filePath);
32
+ if (isFile) {
33
+ const ext = path_1.default.extname(file).toLowerCase();
34
+ if (SPEC_EXTENSIONS.includes(ext)) {
35
+ specFiles.push(filePath);
36
+ }
37
+ }
38
+ }
39
+ return specFiles;
40
+ }
@@ -0,0 +1,3 @@
1
+ import { CLITemplates } from '../Types';
2
+ export declare function registerHandlebarTemplates(): CLITemplates;
3
+ //# sourceMappingURL=registerHandlebarTemplates.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registerHandlebarTemplates.d.ts","sourceRoot":"","sources":["../../../../src/cli/initOpenApiConfig/utils/registerHandlebarTemplates.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAGxC,wBAAgB,0BAA0B,IAAI,YAAY,CAUzD"}
@@ -0,0 +1,53 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ var __importDefault = (this && this.__importDefault) || function (mod) {
36
+ return (mod && mod.__esModule) ? mod : { "default": mod };
37
+ };
38
+ Object.defineProperty(exports, "__esModule", { value: true });
39
+ exports.registerHandlebarTemplates = registerHandlebarTemplates;
40
+ const Handlebars = __importStar(require("handlebars/runtime"));
41
+ const customRequest_1 = __importDefault(require("../../../templatesCompiled/cli/customRequest"));
42
+ const customRequestExecutor_1 = __importDefault(require("../../../templatesCompiled/cli/customRequestExecutor"));
43
+ const openApiConfig_1 = __importDefault(require("../../../templatesCompiled/cli/openApiConfig"));
44
+ const header_1 = __importDefault(require("../../../templatesCompiled/client/partials/header"));
45
+ function registerHandlebarTemplates() {
46
+ const templates = {
47
+ config: Handlebars.template(openApiConfig_1.default),
48
+ request: Handlebars.template(customRequest_1.default),
49
+ requestExecutor: Handlebars.template(customRequestExecutor_1.default),
50
+ };
51
+ Handlebars.registerPartial('header', Handlebars.template(header_1.default));
52
+ return templates;
53
+ }
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Валидирует файл спецификации через SwaggerParser
3
+ * @param filePath - Путь к файлу спецификации
4
+ * @returns true, если файл валиден, false в противном случае
5
+ */
6
+ export declare function validateSpecFile(filePath: string): Promise<boolean>;
7
+ //# sourceMappingURL=validateSpecFile.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validateSpecFile.d.ts","sourceRoot":"","sources":["../../../../src/cli/initOpenApiConfig/utils/validateSpecFile.ts"],"names":[],"mappings":"AAIA;;;;GAIG;AACH,wBAAsB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAQzE"}
@@ -0,0 +1,23 @@
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
+ exports.validateSpecFile = validateSpecFile;
7
+ const swagger_parser_1 = __importDefault(require("@apidevtools/swagger-parser"));
8
+ const Consts_1 = require("../../../common/Consts");
9
+ /**
10
+ * Валидирует файл спецификации через SwaggerParser
11
+ * @param filePath - Путь к файлу спецификации
12
+ * @returns true, если файл валиден, false в противном случае
13
+ */
14
+ async function validateSpecFile(filePath) {
15
+ try {
16
+ await swagger_parser_1.default.validate(filePath);
17
+ return true;
18
+ }
19
+ catch {
20
+ Consts_1.APP_LOGGER.warn(`Skipping invalid spec file: ${filePath}`);
21
+ return false;
22
+ }
23
+ }
@@ -0,0 +1,11 @@
1
+ export interface ValidatedSpec {
2
+ path: string;
3
+ relativePath: string;
4
+ }
5
+ /**
6
+ * Валидирует все файлы спецификаций
7
+ * @param specFiles - Массив путей к файлам спецификаций
8
+ * @returns Массив валидированных спецификаций с относительными путями
9
+ */
10
+ export declare function validateSpecFiles(specFiles: string[]): Promise<ValidatedSpec[]>;
11
+ //# sourceMappingURL=validateSpecFiles.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validateSpecFiles.d.ts","sourceRoot":"","sources":["../../../../src/cli/initOpenApiConfig/utils/validateSpecFiles.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,aAAa;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,YAAY,EAAE,MAAM,CAAC;CACxB;AAED;;;;GAIG;AACH,wBAAsB,iBAAiB,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC,CAerF"}