swaggular 0.1.0

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 (85) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +66 -0
  3. package/dist/app/get-parse-args.js +48 -0
  4. package/dist/app/parse-variables.js +24 -0
  5. package/dist/builders/build-comments.js +25 -0
  6. package/dist/cli/args.d.ts +2 -0
  7. package/dist/cli/args.js +48 -0
  8. package/dist/cli/variables.d.ts +2 -0
  9. package/dist/cli/variables.js +23 -0
  10. package/dist/core/state/interface-state.d.ts +17 -0
  11. package/dist/core/state/interface-state.js +21 -0
  12. package/dist/core/state/service-state.d.ts +9 -0
  13. package/dist/core/state/service-state.js +18 -0
  14. package/dist/core/state/swagger-state.d.ts +14 -0
  15. package/dist/core/state/swagger-state.js +36 -0
  16. package/dist/examples/services/get.example.js +1 -0
  17. package/dist/generators/generate-comments.js +40 -0
  18. package/dist/generators/generate-interface.js +219 -0
  19. package/dist/generators/generate-service.js +302 -0
  20. package/dist/index.d.ts +2 -0
  21. package/dist/index.js +45 -0
  22. package/dist/models/file-content.js +2 -0
  23. package/dist/models/grouped-paths.js +2 -0
  24. package/dist/models/interface-data.js +2 -0
  25. package/dist/models/parsed-args.js +2 -0
  26. package/dist/models/service-data.js +2 -0
  27. package/dist/models/types.js +29 -0
  28. package/dist/parsers/path-grouper.d.ts +17 -0
  29. package/dist/parsers/path-grouper.js +207 -0
  30. package/dist/parsers/swagger-parser.d.ts +4 -0
  31. package/dist/parsers/swagger-parser.js +53 -0
  32. package/dist/renderers/generate-comments.d.ts +3 -0
  33. package/dist/renderers/generate-comments.js +40 -0
  34. package/dist/renderers/generate-interface.d.ts +12 -0
  35. package/dist/renderers/generate-interface.js +209 -0
  36. package/dist/renderers/generate-service.d.ts +9 -0
  37. package/dist/renderers/generate-service.js +178 -0
  38. package/dist/stores/interface-data-store.js +62 -0
  39. package/dist/stores/services-store.js +18 -0
  40. package/dist/stores/swagger-store.js +324 -0
  41. package/dist/templates/angular-template.js +23 -0
  42. package/dist/templates/paged-request-template.js +22 -0
  43. package/dist/templates/paged-result-template.js +13 -0
  44. package/dist/templates/services/angular-template.d.ts +15 -0
  45. package/dist/templates/services/angular-template.js +24 -0
  46. package/dist/templates/services/http-params-handler.d.ts +2 -0
  47. package/dist/templates/services/http-params-handler.js +12 -0
  48. package/dist/templates/types/extends-from-types.d.ts +3 -0
  49. package/dist/templates/types/extends-from-types.js +72 -0
  50. package/dist/templates/types/generic-types.d.ts +4 -0
  51. package/dist/templates/types/generic-types.js +72 -0
  52. package/dist/translators/add-import-to-interface.js +21 -0
  53. package/dist/translators/generate-interfaces.js +134 -0
  54. package/dist/translators/generate-services.js +192 -0
  55. package/dist/translators/join-with-templates.js +16 -0
  56. package/dist/translators/splitPaths.js +8 -0
  57. package/dist/types/file-content.d.ts +6 -0
  58. package/dist/types/file-content.js +2 -0
  59. package/dist/types/grouped-paths.d.ts +7 -0
  60. package/dist/types/grouped-paths.js +2 -0
  61. package/dist/types/interface-data.d.ts +13 -0
  62. package/dist/types/interface-data.js +2 -0
  63. package/dist/types/parsed-args.d.ts +9 -0
  64. package/dist/types/parsed-args.js +2 -0
  65. package/dist/types/service-data.d.ts +21 -0
  66. package/dist/types/service-data.js +2 -0
  67. package/dist/types/types.d.ts +23 -0
  68. package/dist/types/types.js +29 -0
  69. package/dist/utils/build-types.d.ts +2 -0
  70. package/dist/utils/build-types.js +66 -0
  71. package/dist/utils/create-file.d.ts +7 -0
  72. package/dist/utils/create-file.js +74 -0
  73. package/dist/utils/generate-imports.js +33 -0
  74. package/dist/utils/grouping-paths.js +68 -0
  75. package/dist/utils/method-builders.js +77 -0
  76. package/dist/utils/object-utils.d.ts +1 -0
  77. package/dist/utils/object-utils.js +11 -0
  78. package/dist/utils/path-utils.d.ts +7 -0
  79. package/dist/utils/path-utils.js +61 -0
  80. package/dist/utils/string-utils.d.ts +13 -0
  81. package/dist/utils/string-utils.js +47 -0
  82. package/dist/utils/to-case.js +47 -0
  83. package/dist/utils/type-guard.d.ts +5 -0
  84. package/dist/utils/type-guard.js +35 -0
  85. package/package.json +64 -0
@@ -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
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.SwaggerParser = void 0;
37
+ const fs = __importStar(require("fs"));
38
+ const path = __importStar(require("path"));
39
+ const path_grouper_1 = require("./path-grouper");
40
+ const swagger_state_1 = require("../core/state/swagger-state");
41
+ class SwaggerParser {
42
+ static parse(filePath, options = { mode: 'tags' }) {
43
+ const absolutePath = path.resolve(filePath);
44
+ const content = fs.readFileSync(absolutePath, { encoding: 'utf8' });
45
+ const swagger = JSON.parse(content);
46
+ if (!swagger)
47
+ return;
48
+ const pathsGroupedByScope = path_grouper_1.PathGrouper.groupPaths(swagger.paths, options);
49
+ swagger_state_1.swaggerState.setSwagger(swagger);
50
+ swagger_state_1.swaggerState.setPathsGroupedByScope(pathsGroupedByScope);
51
+ }
52
+ }
53
+ exports.SwaggerParser = SwaggerParser;
@@ -0,0 +1,3 @@
1
+ import { ServiceDataParameter } from '../types/service-data';
2
+ export declare function generateInterfaceComments(param: any): string;
3
+ export declare function generateServiceComments(summary: string, responseType?: string, parameters?: ServiceDataParameter[]): string;
@@ -0,0 +1,40 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.generateInterfaceComments = generateInterfaceComments;
4
+ exports.generateServiceComments = generateServiceComments;
5
+ function generateInterfaceComments(param) {
6
+ const comments = [];
7
+ if (param.format !== undefined) {
8
+ comments.push(`format: ${param.format}`);
9
+ }
10
+ if (param.minLength !== undefined) {
11
+ comments.push(`minLength: ${param.minLength}`);
12
+ }
13
+ if (param.maxLength !== undefined) {
14
+ comments.push(`maxLength: ${param.maxLength}`);
15
+ }
16
+ if (param.minimum !== undefined) {
17
+ comments.push(`minimum: ${param.minimum}`);
18
+ }
19
+ if (param.maximum !== undefined) {
20
+ comments.push(`maximum: ${param.maximum}`);
21
+ }
22
+ if (comments.length > 0) {
23
+ return ` /**\n * ${comments.join('\n * ')}\n */`;
24
+ }
25
+ return '';
26
+ }
27
+ function generateServiceComments(summary, responseType, parameters) {
28
+ const summarySplited = [];
29
+ for (let i = 0; i < summary.length; i += 100) {
30
+ summarySplited.push(summary.slice(i, i + 100));
31
+ }
32
+ const comments = summarySplited;
33
+ if (parameters && parameters.length > 0) {
34
+ comments.push(`${parameters.map((p) => `@param ${p.name} : ${p.type}`).join('\n')}`);
35
+ }
36
+ if (responseType) {
37
+ comments.push(`@returns Observable<${responseType}>`);
38
+ }
39
+ return `\t/**\n${comments.map((c) => `\t* ${c}\n`).join('')}\n */`;
40
+ }
@@ -0,0 +1,12 @@
1
+ import { OpenAPIV3 } from 'openapi-types';
2
+ import { FileContent } from '../types/file-content';
3
+ import { GroupedPath } from '../types/grouped-paths';
4
+ import { InterfaceData, InterfaceDataProperty } from '../types/interface-data';
5
+ export declare function parametersToIProperties(parameters: (OpenAPIV3.ParameterObject | OpenAPIV3.ReferenceObject)[]): InterfaceDataProperty[];
6
+ export declare function propertiesToIProperties(properties: Record<string, OpenAPIV3.ReferenceObject | OpenAPIV3.SchemaObject>): InterfaceDataProperty[];
7
+ export declare function generateInterfaces(): void;
8
+ export declare function generateWithParameters(): void;
9
+ export declare function computeParametersName(method: string, innerPath: string, groupedPath: GroupedPath): string;
10
+ export declare function generateComponentsSchemas(): void;
11
+ export declare function generateInterfacesFiles(locations?: Record<string, string[]>): FileContent[];
12
+ export declare function generateContent(interfaceData: InterfaceData, deep?: number): string;
@@ -0,0 +1,209 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.parametersToIProperties = parametersToIProperties;
4
+ exports.propertiesToIProperties = propertiesToIProperties;
5
+ exports.generateInterfaces = generateInterfaces;
6
+ exports.generateWithParameters = generateWithParameters;
7
+ exports.computeParametersName = computeParametersName;
8
+ exports.generateComponentsSchemas = generateComponentsSchemas;
9
+ exports.generateInterfacesFiles = generateInterfacesFiles;
10
+ exports.generateContent = generateContent;
11
+ const interface_state_1 = require("../core/state/interface-state");
12
+ const swagger_state_1 = require("../core/state/swagger-state");
13
+ const extends_from_types_1 = require("../templates/types/extends-from-types");
14
+ const generic_types_1 = require("../templates/types/generic-types");
15
+ const build_types_1 = require("../utils/build-types");
16
+ const object_utils_1 = require("../utils/object-utils");
17
+ const path_utils_1 = require("../utils/path-utils");
18
+ const string_utils_1 = require("../utils/string-utils");
19
+ const type_guard_1 = require("../utils/type-guard");
20
+ const generate_comments_1 = require("./generate-comments");
21
+ function parametersToIProperties(parameters) {
22
+ const properties = [];
23
+ for (const param of parameters) {
24
+ if ((0, type_guard_1.isReference)(param)) {
25
+ const ref = param.$ref.split('/').pop();
26
+ properties.push({
27
+ name: (0, string_utils_1.lowerFirst)(ref),
28
+ type: ref,
29
+ optional: false,
30
+ comments: '',
31
+ });
32
+ continue;
33
+ }
34
+ if (param.in !== 'query')
35
+ continue;
36
+ const tsType = (0, build_types_1.switchTypeJson)(param.schema);
37
+ properties.push({
38
+ name: (0, string_utils_1.lowerFirst)(param.name),
39
+ type: tsType,
40
+ optional: !param.required,
41
+ comments: (0, generate_comments_1.generateInterfaceComments)(param.schema),
42
+ });
43
+ }
44
+ return properties;
45
+ }
46
+ function propertiesToIProperties(properties) {
47
+ const interfaceDataProperties = [];
48
+ for (const [name, property] of Object.entries(properties)) {
49
+ if ((0, type_guard_1.isReference)(property)) {
50
+ const ref = property.$ref.split('/').pop();
51
+ interfaceDataProperties.push({
52
+ name,
53
+ type: ref,
54
+ optional: false,
55
+ comments: '',
56
+ });
57
+ continue;
58
+ }
59
+ interfaceDataProperties.push({
60
+ name,
61
+ type: (0, build_types_1.switchTypeJson)(property),
62
+ optional: property.nullable ?? false,
63
+ comments: (0, generate_comments_1.generateInterfaceComments)(property),
64
+ });
65
+ }
66
+ return interfaceDataProperties;
67
+ }
68
+ function generateInterfaces() {
69
+ generateComponentsSchemas();
70
+ generateWithParameters();
71
+ }
72
+ function generateWithParameters() {
73
+ const paths = swagger_state_1.swaggerState.getPaths();
74
+ const groupedPaths = swagger_state_1.swaggerState.getPathsGroupedByScope();
75
+ if (!paths || !groupedPaths)
76
+ return;
77
+ const interfacesData = [];
78
+ for (const groupedPath of Object.values(groupedPaths)) {
79
+ for (const innerPath of groupedPath.paths) {
80
+ const pathInfo = paths[innerPath];
81
+ if (!pathInfo)
82
+ continue;
83
+ const methods = (0, object_utils_1.removeFalsyValues)({
84
+ get: pathInfo.get,
85
+ post: pathInfo.post,
86
+ put: pathInfo.put,
87
+ delete: pathInfo.delete,
88
+ patch: pathInfo.patch,
89
+ });
90
+ for (const [httpMethod, pathData] of Object.entries(methods)) {
91
+ if (!pathData?.parameters)
92
+ continue;
93
+ const parameters = pathData.parameters;
94
+ const properties = parametersToIProperties(parameters);
95
+ if (properties.length === 0)
96
+ continue;
97
+ const interfaceName = computeParametersName(httpMethod, innerPath, groupedPath);
98
+ const interData = {
99
+ name: interfaceName,
100
+ type: 'interface',
101
+ imports: properties.filter((p) => !(0, type_guard_1.isNativeType)(p.type)).map((p) => p.type),
102
+ properties,
103
+ };
104
+ const generic = (0, generic_types_1.isGenericType)(interData);
105
+ if (generic)
106
+ continue;
107
+ const interDataWithExtendsFrom = (0, extends_from_types_1.computeExtendsFromType)(interData);
108
+ interfacesData.push(interDataWithExtendsFrom);
109
+ }
110
+ }
111
+ }
112
+ interface_state_1.interfaceState.addInterfaces(interfacesData);
113
+ }
114
+ function computeParametersName(method, innerPath, groupedPath) {
115
+ const dict = {
116
+ get: '',
117
+ post: 'Create',
118
+ put: 'Update',
119
+ delete: 'Delete',
120
+ patch: 'Patch',
121
+ };
122
+ const name = dict[method];
123
+ const extra = (0, string_utils_1.kebabToPascalCase)((0, path_utils_1.removeVariablesFromPath)((0, path_utils_1.getExtraSegments)(innerPath, (0, path_utils_1.createBaseUrl)(groupedPath.baseSegments)).join('')));
124
+ return name + groupedPath.groupName + (0, string_utils_1.upFirst)(extra) + 'Params';
125
+ }
126
+ function generateComponentsSchemas() {
127
+ const schemas = swagger_state_1.swaggerState.getSchemas();
128
+ if (!schemas)
129
+ return;
130
+ const interfaces = [];
131
+ for (const [key, value] of Object.entries(schemas)) {
132
+ if ((0, type_guard_1.isReference)(value))
133
+ continue;
134
+ if (!value.properties) {
135
+ if (value.enum) {
136
+ const interData = {
137
+ name: key,
138
+ type: 'enum',
139
+ imports: [],
140
+ properties: value.enum.map((e) => {
141
+ return {
142
+ name: e,
143
+ type: e,
144
+ optional: false,
145
+ comments: '',
146
+ };
147
+ }),
148
+ };
149
+ interfaces.push(interData);
150
+ }
151
+ continue;
152
+ }
153
+ const properties = propertiesToIProperties(value.properties);
154
+ const interData = {
155
+ name: key,
156
+ type: 'interface',
157
+ imports: properties.filter((p) => !(0, type_guard_1.isNativeType)(p.type)).map((p) => p.type),
158
+ properties,
159
+ };
160
+ const generic = (0, generic_types_1.isGenericType)(interData);
161
+ if (generic) {
162
+ continue;
163
+ }
164
+ const interDataWithExtendsFrom = (0, extends_from_types_1.computeExtendsFromType)(interData);
165
+ interfaces.push(interDataWithExtendsFrom);
166
+ }
167
+ interface_state_1.interfaceState.addInterfaces(interfaces);
168
+ }
169
+ function generateInterfacesFiles(locations) {
170
+ const interfacesData = [
171
+ ...generic_types_1.genericTypesData,
172
+ ...extends_from_types_1.extendsFromTypes,
173
+ ...Array.from(Object.values(interface_state_1.interfaceState.generatedInterfaces)),
174
+ ];
175
+ const filesContent = [];
176
+ for (const [key, value] of Object.entries(interfacesData)) {
177
+ const location = [value.type === 'enum' ? 'enums' : 'dtos', ...(locations?.[key] ?? [])];
178
+ const content = generateContent(value, location.length);
179
+ const extraName = value.type === 'enum' ? 'enum' : 'dto';
180
+ filesContent.push({
181
+ location: location,
182
+ content,
183
+ extension: 'ts',
184
+ name: (0, string_utils_1.toKebabCase)(value.name) + `.${extraName}`,
185
+ });
186
+ }
187
+ return filesContent;
188
+ }
189
+ function generateContent(interfaceData, deep = 0) {
190
+ const imports = [...interfaceData.imports];
191
+ const importsTemplate = imports.length > 0
192
+ ? `import { ${imports.join(', ')} } from "${'../'.repeat(deep)}models";`
193
+ : '';
194
+ if (interfaceData.type === 'interface') {
195
+ const content = `${importsTemplate}\n\nexport interface ${interfaceData.name} ${interfaceData.extendsFrom && interfaceData.extendsFrom.length > 0 ? `extends ${interfaceData.extendsFrom.join(', ')}` : ''} {
196
+ ${interfaceData.properties
197
+ .map((p) => `${p.comments}\n\t${(0, string_utils_1.lowerFirst)(p.name)}${p.optional ? '?' : ''}: ${p.type};`)
198
+ .join('\n')}
199
+ }`;
200
+ return content;
201
+ }
202
+ if (interfaceData.type === 'enum') {
203
+ const content = `export enum ${interfaceData.name} {
204
+ ${interfaceData.properties.map((p) => `${p.comments}\n\t${p.name} = '${p.type}',`).join('\n')}
205
+ }`;
206
+ return content;
207
+ }
208
+ return '';
209
+ }
@@ -0,0 +1,9 @@
1
+ import { FileContent } from '../types/file-content';
2
+ import { GroupedPath } from '../types/grouped-paths';
3
+ import { ServiceDataMethod } from '../types/service-data';
4
+ /**
5
+ * Pick the paths grouped by scope and generate services for them.
6
+ */
7
+ export declare function generateServices(): void;
8
+ export declare function generateServiceFiles(locations?: Record<string, string[]>): FileContent[];
9
+ export declare function buildMethods(groupedPath: GroupedPath): ServiceDataMethod[];
@@ -0,0 +1,178 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.generateServices = generateServices;
4
+ exports.generateServiceFiles = generateServiceFiles;
5
+ exports.buildMethods = buildMethods;
6
+ const service_state_1 = require("../core/state/service-state");
7
+ const swagger_state_1 = require("../core/state/swagger-state");
8
+ const angular_template_1 = require("../templates/services/angular-template");
9
+ const build_types_1 = require("../utils/build-types");
10
+ const path_utils_1 = require("../utils/path-utils");
11
+ const string_utils_1 = require("../utils/string-utils");
12
+ const type_guard_1 = require("../utils/type-guard");
13
+ const generate_comments_1 = require("./generate-comments");
14
+ const object_utils_1 = require("../utils/object-utils");
15
+ /**
16
+ * Pick the paths grouped by scope and generate services for them.
17
+ */
18
+ function generateServices() {
19
+ const servicesData = [];
20
+ const groupedPaths = swagger_state_1.swaggerState.getPathsGroupedByScope();
21
+ const paths = swagger_state_1.swaggerState.getPaths();
22
+ if (!groupedPaths || !paths)
23
+ return;
24
+ for (const [key, value] of Object.entries(groupedPaths)) {
25
+ const serviceMethods = buildMethods(value);
26
+ const imports = new Set();
27
+ serviceMethods.forEach((method) => {
28
+ if (!(0, type_guard_1.isNativeType)(method.responseType)) {
29
+ imports.add(method.responseType);
30
+ }
31
+ method.parameters.forEach((param) => {
32
+ if (!(0, type_guard_1.isNativeType)(param.type)) {
33
+ imports.add(param.type);
34
+ }
35
+ });
36
+ });
37
+ const serviceData = {
38
+ name: key,
39
+ imports: Array.from(imports),
40
+ baseUrl: value.baseUrl,
41
+ methods: serviceMethods,
42
+ };
43
+ servicesData.push(serviceData);
44
+ }
45
+ service_state_1.serviceState.addServices(servicesData);
46
+ }
47
+ function generateServiceFiles(locations) {
48
+ const services = Object.values(service_state_1.serviceState.services);
49
+ const filesContent = [];
50
+ for (const service of services) {
51
+ const location = ['services', ...(locations?.[service.name] ?? [])];
52
+ const methods = service.methods
53
+ .map((method) => {
54
+ return buildMethodTemplate(method);
55
+ })
56
+ .join('\n\n');
57
+ const templateParams = {
58
+ name: service.name,
59
+ baseUrl: service.baseUrl,
60
+ methods: methods,
61
+ imports: service.imports.join(', '),
62
+ hasHttpParamsHandler: service.methods.some((m) => m.parameters.some((p) => p.in === 'query')),
63
+ };
64
+ const content = (0, angular_template_1.angularTemplate)(templateParams);
65
+ filesContent.push({
66
+ location: location,
67
+ content,
68
+ extension: 'ts',
69
+ name: (0, string_utils_1.toKebabCase)(service.name) + '.service',
70
+ });
71
+ }
72
+ return filesContent;
73
+ }
74
+ function buildMethods(groupedPath) {
75
+ const methods = [];
76
+ const pathData = swagger_state_1.swaggerState.getPaths();
77
+ const usedNames = [];
78
+ for (const path of groupedPath.paths) {
79
+ if (!pathData || !pathData[path])
80
+ continue;
81
+ const pathItem = pathItemToMethods(pathData[path]);
82
+ for (const [method, operation] of Object.entries(pathItem)) {
83
+ const name = buildMethodName(method, path, groupedPath, usedNames);
84
+ usedNames.push(name);
85
+ const parameters = buildParameters(operation.parameters ?? []);
86
+ const responseType = buildResponseType(operation.responses);
87
+ methods.push({
88
+ name,
89
+ path: (0, path_utils_1.removeVariablesFromPath)((0, path_utils_1.getExtraSegments)(path, (0, path_utils_1.createBaseUrl)(groupedPath.baseSegments)).join('')),
90
+ method: method,
91
+ parameters,
92
+ responseType,
93
+ comments: (0, generate_comments_1.generateServiceComments)(operation.summary ?? '', responseType, parameters),
94
+ });
95
+ }
96
+ }
97
+ return methods;
98
+ }
99
+ function pathItemToMethods(pathItem) {
100
+ return (0, object_utils_1.removeFalsyValues)({
101
+ get: pathItem.get,
102
+ post: pathItem.post,
103
+ put: pathItem.put,
104
+ delete: pathItem.delete,
105
+ patch: pathItem.patch,
106
+ });
107
+ }
108
+ function buildMethodName(method, path, groupedPath, usedNames) {
109
+ const dict = {
110
+ get: 'get',
111
+ post: 'create',
112
+ put: 'update',
113
+ delete: 'delete',
114
+ patch: 'patch',
115
+ };
116
+ const prefix = dict[method];
117
+ const extra = (0, string_utils_1.kebabToPascalCase)((0, path_utils_1.removeVariablesFromPath)((0, path_utils_1.getExtraSegments)(path, (0, path_utils_1.createBaseUrl)(groupedPath.baseSegments)).join('')));
118
+ let name = prefix + (0, string_utils_1.upFirst)(extra);
119
+ if (usedNames.includes(name)) {
120
+ name += (0, string_utils_1.upFirst)(method);
121
+ }
122
+ return name;
123
+ }
124
+ function buildParameters(parameters) {
125
+ const results = [];
126
+ for (const param of parameters) {
127
+ if ((0, type_guard_1.isReference)(param)) {
128
+ const ref = param.$ref.split('/').pop();
129
+ results.push({
130
+ name: (0, string_utils_1.lowerFirst)(ref),
131
+ in: 'query',
132
+ required: true,
133
+ type: ref,
134
+ });
135
+ continue;
136
+ }
137
+ results.push({
138
+ name: (0, string_utils_1.lowerFirst)(param.name),
139
+ in: param.in,
140
+ required: param.required ?? false,
141
+ type: (0, build_types_1.switchTypeJson)(param.schema),
142
+ });
143
+ }
144
+ // Check for body (simplified)
145
+ // In a real implementation we would look at requestBody
146
+ return results;
147
+ }
148
+ function buildResponseType(responses) {
149
+ const success = responses['200'] || responses['201'] || responses['default'];
150
+ if (!success)
151
+ return 'any';
152
+ if ((0, type_guard_1.isReference)(success))
153
+ return success.$ref.split('/').pop();
154
+ const content = success.content?.['application/json'];
155
+ if (!content || !content.schema)
156
+ return 'any';
157
+ return (0, build_types_1.switchTypeJson)(content.schema);
158
+ }
159
+ function buildMethodTemplate(method) {
160
+ const params = method.parameters
161
+ .map((p) => `${p.name}${p.required ? '' : '?'}: ${p.type}`)
162
+ .join(', ');
163
+ const path = method.path
164
+ .split('/')
165
+ .map((s) => ((0, path_utils_1.isVariable)(s) ? `\${${s.replace(/[{}]/g, '')}}` : s))
166
+ .join('/');
167
+ const queryParams = method.parameters.filter((p) => p.in === 'query');
168
+ const bodyParam = method.parameters.find((p) => p.in === 'body');
169
+ let options = '';
170
+ if (queryParams.length > 0) {
171
+ options = `, { params: HttpHelper.toHttpParams({ ${queryParams.map((p) => p.name).join(', ')} }) }`;
172
+ }
173
+ const httpCall = `this.http.${method.method}<${method.responseType}>(this.baseUrl + \`${path}\`${bodyParam ? `, ${bodyParam.name}` : ['post', 'put', 'patch'].includes(method.method) ? ', {}' : ''}${options})`;
174
+ return `${method.comments}
175
+ ${method.name}(${params}): Observable<${method.responseType}> {
176
+ return ${httpCall};
177
+ }`;
178
+ }
@@ -0,0 +1,62 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.interfaceDataStore = void 0;
4
+ class InterfaceDataStore {
5
+ genericInterfaces = {};
6
+ baseInterfaces = {};
7
+ generatedInterfaces = {};
8
+ generatedEnums = {};
9
+ componentsSchemas = {};
10
+ constructor() { }
11
+ setComponentsSchemas(componentsSchemas) {
12
+ this.componentsSchemas = componentsSchemas;
13
+ }
14
+ getComponentsSchema(name) {
15
+ return this.componentsSchemas[name];
16
+ }
17
+ exists(name) {
18
+ return (this.genericInterfaces[name] !== undefined ||
19
+ this.baseInterfaces[name] !== undefined ||
20
+ this.generatedInterfaces[name] !== undefined ||
21
+ this.generatedEnums[name] !== undefined);
22
+ }
23
+ addInterfaces(interfacesData) {
24
+ for (const inter of interfacesData) {
25
+ this.generatedInterfaces[inter.name] = inter;
26
+ }
27
+ }
28
+ computeExtendsFrom(properties) {
29
+ if (properties.length === 0)
30
+ return { extendsFrom: undefined, properties: [] };
31
+ const currentPropertiesNames = new Set(properties.map((p) => p.name));
32
+ for (const [name, schema] of Object.entries(this.baseInterfaces)) {
33
+ if (schema.properties.length !== properties.length)
34
+ continue;
35
+ const required = schema.properties
36
+ .filter((p) => !p.optional)
37
+ .map((p) => p.name);
38
+ if (required.some((r) => !currentPropertiesNames.has(r))) {
39
+ continue;
40
+ }
41
+ const optional = schema.properties
42
+ .filter((p) => p.optional)
43
+ .map((p) => p.name);
44
+ const remainingProperties = properties
45
+ .filter((p) => !required.includes(p.name))
46
+ .filter((p) => !optional.includes(p.name));
47
+ if (remainingProperties.length === 0 &&
48
+ schema.properties.some((p) => p.type === "generic")) {
49
+ return {
50
+ extendsFrom: name,
51
+ properties: [],
52
+ };
53
+ }
54
+ return {
55
+ extendsFrom: name,
56
+ properties: remainingProperties,
57
+ };
58
+ }
59
+ return { extendsFrom: undefined, properties };
60
+ }
61
+ }
62
+ exports.interfaceDataStore = new InterfaceDataStore();
@@ -0,0 +1,18 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.serviceStore = void 0;
4
+ class ServiceStore {
5
+ services = {};
6
+ addService(name, content) {
7
+ this.services[name] = content;
8
+ }
9
+ addServices(services) {
10
+ services.forEach((service) => {
11
+ this.services[service.name] = service;
12
+ });
13
+ }
14
+ getService(name) {
15
+ return this.services[name];
16
+ }
17
+ }
18
+ exports.serviceStore = new ServiceStore();