jszy-swagger-doc-generator 1.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.
- package/OpenAPI.md +298 -0
- package/README.md +193 -0
- package/__tests__/index.test.ts +152 -0
- package/dist/cli.d.ts +2 -0
- package/dist/cli.js +154 -0
- package/dist/cli.js.map +1 -0
- package/dist/index.d.ts +137 -0
- package/dist/index.js +489 -0
- package/dist/index.js.map +1 -0
- package/package.json +54 -0
- package/src/cli.ts +122 -0
- package/src/index.ts +584 -0
- package/tsconfig.json +23 -0
package/dist/cli.js
ADDED
|
@@ -0,0 +1,154 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
"use strict";
|
|
3
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
4
|
+
if (k2 === undefined) k2 = k;
|
|
5
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
6
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
7
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
8
|
+
}
|
|
9
|
+
Object.defineProperty(o, k2, desc);
|
|
10
|
+
}) : (function(o, m, k, k2) {
|
|
11
|
+
if (k2 === undefined) k2 = k;
|
|
12
|
+
o[k2] = m[k];
|
|
13
|
+
}));
|
|
14
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
15
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
16
|
+
}) : function(o, v) {
|
|
17
|
+
o["default"] = v;
|
|
18
|
+
});
|
|
19
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
20
|
+
var ownKeys = function(o) {
|
|
21
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
22
|
+
var ar = [];
|
|
23
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
24
|
+
return ar;
|
|
25
|
+
};
|
|
26
|
+
return ownKeys(o);
|
|
27
|
+
};
|
|
28
|
+
return function (mod) {
|
|
29
|
+
if (mod && mod.__esModule) return mod;
|
|
30
|
+
var result = {};
|
|
31
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
32
|
+
__setModuleDefault(result, mod);
|
|
33
|
+
return result;
|
|
34
|
+
};
|
|
35
|
+
})();
|
|
36
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
37
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
38
|
+
};
|
|
39
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
40
|
+
const index_1 = require("./index");
|
|
41
|
+
const yargs_1 = __importDefault(require("yargs"));
|
|
42
|
+
const helpers_1 = require("yargs/helpers");
|
|
43
|
+
const fs = __importStar(require("fs"));
|
|
44
|
+
const argv = (0, yargs_1.default)((0, helpers_1.hideBin)(process.argv))
|
|
45
|
+
.usage('Usage: $0 [options]')
|
|
46
|
+
.option('url', {
|
|
47
|
+
alias: 'u',
|
|
48
|
+
describe: 'URL to the Swagger JSON file',
|
|
49
|
+
type: 'string'
|
|
50
|
+
})
|
|
51
|
+
.option('input', {
|
|
52
|
+
alias: 'i',
|
|
53
|
+
describe: 'Path to the local Swagger JSON file',
|
|
54
|
+
type: 'string'
|
|
55
|
+
})
|
|
56
|
+
.option('output', {
|
|
57
|
+
alias: 'o',
|
|
58
|
+
describe: 'Output path for the generated documentation (default: ./generated/docs/api-documentation.md)',
|
|
59
|
+
type: 'string',
|
|
60
|
+
default: './generated/docs/api-documentation.md'
|
|
61
|
+
})
|
|
62
|
+
.option('generate-types', {
|
|
63
|
+
describe: 'Generate TypeScript type definitions',
|
|
64
|
+
type: 'boolean',
|
|
65
|
+
default: false
|
|
66
|
+
})
|
|
67
|
+
.option('generate-hooks', {
|
|
68
|
+
describe: 'Generate React hooks',
|
|
69
|
+
type: 'boolean',
|
|
70
|
+
default: false
|
|
71
|
+
})
|
|
72
|
+
.option('types-output', {
|
|
73
|
+
describe: 'Output directory for TypeScript types (default: ./generated/types)',
|
|
74
|
+
type: 'string',
|
|
75
|
+
default: './generated/types'
|
|
76
|
+
})
|
|
77
|
+
.option('hooks-output', {
|
|
78
|
+
describe: 'Output directory for React hooks (default: ./generated/hooks)',
|
|
79
|
+
type: 'string',
|
|
80
|
+
default: './generated/hooks'
|
|
81
|
+
})
|
|
82
|
+
.check((argv) => {
|
|
83
|
+
if (!argv.url && !argv.input) {
|
|
84
|
+
throw new Error('Either --url or --input must be provided');
|
|
85
|
+
}
|
|
86
|
+
if (argv.url && argv.input) {
|
|
87
|
+
throw new Error('Only one of --url or --input can be provided');
|
|
88
|
+
}
|
|
89
|
+
return true;
|
|
90
|
+
})
|
|
91
|
+
.help()
|
|
92
|
+
.parseSync();
|
|
93
|
+
async function run() {
|
|
94
|
+
try {
|
|
95
|
+
// Create the generated directory if it doesn't exist
|
|
96
|
+
const generatedDir = './generated';
|
|
97
|
+
if (!fs.existsSync(generatedDir)) {
|
|
98
|
+
fs.mkdirSync(generatedDir, { recursive: true });
|
|
99
|
+
console.log(`Created directory: ${generatedDir}`);
|
|
100
|
+
}
|
|
101
|
+
const generator = new index_1.SwaggerDocGenerator();
|
|
102
|
+
let swaggerDoc;
|
|
103
|
+
if (argv.url) {
|
|
104
|
+
console.log(`Fetching Swagger JSON from: ${argv.url}`);
|
|
105
|
+
swaggerDoc = await generator.fetchSwaggerJSON(argv.url);
|
|
106
|
+
}
|
|
107
|
+
else if (argv.input) {
|
|
108
|
+
console.log(`Loading Swagger JSON from: ${argv.input}`);
|
|
109
|
+
if (!fs.existsSync(argv.input)) {
|
|
110
|
+
throw new Error(`Input file does not exist: ${argv.input}`);
|
|
111
|
+
}
|
|
112
|
+
swaggerDoc = generator.loadSwaggerFromFile(argv.input);
|
|
113
|
+
}
|
|
114
|
+
// This shouldn't happen due to the validation check, but TypeScript doesn't know that
|
|
115
|
+
if (!swaggerDoc) {
|
|
116
|
+
throw new Error('No swagger document loaded');
|
|
117
|
+
}
|
|
118
|
+
// Check if we need to generate types
|
|
119
|
+
if (argv.generateTypes) {
|
|
120
|
+
console.log('Generating TypeScript type definitions...');
|
|
121
|
+
const types = generator.generateTypeDefinitions(swaggerDoc);
|
|
122
|
+
const typesOutputPath = argv.typesOutput.endsWith('.ts') ? argv.typesOutput :
|
|
123
|
+
`${argv.typesOutput}/${swaggerDoc.info.title.replace(/\s+/g, '_')}_types.ts`;
|
|
124
|
+
generator.saveTypesToFile(types, typesOutputPath);
|
|
125
|
+
console.log(`Type definitions generated successfully at: ${typesOutputPath}`);
|
|
126
|
+
}
|
|
127
|
+
// Check if we need to generate hooks
|
|
128
|
+
if (argv.generateHooks) {
|
|
129
|
+
console.log('Generating React hooks...');
|
|
130
|
+
const hooksByTag = generator.generateReactHooks(swaggerDoc);
|
|
131
|
+
generator.saveHooksByTag(hooksByTag, argv.hooksOutput);
|
|
132
|
+
console.log(`React hooks generated successfully in: ${argv.hooksOutput}/`);
|
|
133
|
+
}
|
|
134
|
+
// Generate documentation if not generating types or hooks (for backward compatibility)
|
|
135
|
+
if (!argv.generateTypes && !argv.generateHooks) {
|
|
136
|
+
console.log('Generating documentation...');
|
|
137
|
+
const documentation = generator.generateDocumentation(swaggerDoc);
|
|
138
|
+
generator.saveDocumentationToFile(documentation, argv.output);
|
|
139
|
+
console.log(`Documentation generated successfully at: ${argv.output}`);
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
catch (error) {
|
|
143
|
+
if (error instanceof Error) {
|
|
144
|
+
console.error('Error:', error.message);
|
|
145
|
+
}
|
|
146
|
+
else {
|
|
147
|
+
console.error('Error:', String(error));
|
|
148
|
+
}
|
|
149
|
+
process.exit(1);
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
// Run the CLI
|
|
153
|
+
run();
|
|
154
|
+
//# sourceMappingURL=cli.js.map
|
package/dist/cli.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
export interface SwaggerDoc {
|
|
2
|
+
swagger?: string;
|
|
3
|
+
openapi?: string;
|
|
4
|
+
info: {
|
|
5
|
+
title: string;
|
|
6
|
+
version: string;
|
|
7
|
+
description?: string;
|
|
8
|
+
};
|
|
9
|
+
paths: {
|
|
10
|
+
[key: string]: {
|
|
11
|
+
[method: string]: {
|
|
12
|
+
summary?: string;
|
|
13
|
+
description?: string;
|
|
14
|
+
tags?: string[];
|
|
15
|
+
operationId?: string;
|
|
16
|
+
parameters?: Array<{
|
|
17
|
+
name: string;
|
|
18
|
+
in: string;
|
|
19
|
+
description?: string;
|
|
20
|
+
required?: boolean;
|
|
21
|
+
schema?: {
|
|
22
|
+
type?: string;
|
|
23
|
+
format?: string;
|
|
24
|
+
enum?: string[];
|
|
25
|
+
$ref?: string;
|
|
26
|
+
items?: any;
|
|
27
|
+
[key: string]: any;
|
|
28
|
+
};
|
|
29
|
+
}>;
|
|
30
|
+
requestBody?: {
|
|
31
|
+
content: {
|
|
32
|
+
[contentType: string]: {
|
|
33
|
+
schema: any;
|
|
34
|
+
example?: any;
|
|
35
|
+
};
|
|
36
|
+
};
|
|
37
|
+
};
|
|
38
|
+
responses: {
|
|
39
|
+
[statusCode: string]: {
|
|
40
|
+
description: string;
|
|
41
|
+
content?: {
|
|
42
|
+
[contentType: string]: {
|
|
43
|
+
schema: any;
|
|
44
|
+
example?: any;
|
|
45
|
+
};
|
|
46
|
+
};
|
|
47
|
+
};
|
|
48
|
+
};
|
|
49
|
+
};
|
|
50
|
+
};
|
|
51
|
+
};
|
|
52
|
+
components?: {
|
|
53
|
+
schemas: {
|
|
54
|
+
[key: string]: any;
|
|
55
|
+
};
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
export interface Parameter {
|
|
59
|
+
name: string;
|
|
60
|
+
in: string;
|
|
61
|
+
description?: string;
|
|
62
|
+
required?: boolean;
|
|
63
|
+
schema?: {
|
|
64
|
+
type?: string;
|
|
65
|
+
format?: string;
|
|
66
|
+
enum?: string[];
|
|
67
|
+
$ref?: string;
|
|
68
|
+
items?: any;
|
|
69
|
+
[key: string]: any;
|
|
70
|
+
};
|
|
71
|
+
}
|
|
72
|
+
export declare class SwaggerDocGenerator {
|
|
73
|
+
/**
|
|
74
|
+
* Fetches the Swagger/OpenAPI JSON from a given URL
|
|
75
|
+
*/
|
|
76
|
+
fetchSwaggerJSON(url: string): Promise<SwaggerDoc>;
|
|
77
|
+
/**
|
|
78
|
+
* Loads Swagger JSON from a local file
|
|
79
|
+
*/
|
|
80
|
+
loadSwaggerFromFile(filePath: string): SwaggerDoc;
|
|
81
|
+
/**
|
|
82
|
+
* Generates frontend documentation from the Swagger doc
|
|
83
|
+
*/
|
|
84
|
+
generateDocumentation(swaggerDoc: SwaggerDoc): string;
|
|
85
|
+
/**
|
|
86
|
+
* Generates TypeScript type definitions from the schemas in Swagger doc
|
|
87
|
+
*/
|
|
88
|
+
generateTypeDefinitions(swaggerDoc: SwaggerDoc): string;
|
|
89
|
+
/**
|
|
90
|
+
* Generates a single TypeScript type definition
|
|
91
|
+
*/
|
|
92
|
+
generateSingleTypeDefinition(typeName: string, schema: any, allSchemas: {
|
|
93
|
+
[key: string]: any;
|
|
94
|
+
}): string;
|
|
95
|
+
/**
|
|
96
|
+
* Generates React hooks from the paths in Swagger doc
|
|
97
|
+
*/
|
|
98
|
+
generateReactHooks(swaggerDoc: SwaggerDoc): Map<string, string>;
|
|
99
|
+
/**
|
|
100
|
+
* Generates header content for a specific tag
|
|
101
|
+
*/
|
|
102
|
+
generateHeaderForTag(tag: string): string;
|
|
103
|
+
/**
|
|
104
|
+
* Generates a parameter interface for an API endpoint
|
|
105
|
+
*/
|
|
106
|
+
generateParamInterface(path: string, method: string, endpointInfo: any, schemas: {
|
|
107
|
+
[key: string]: any;
|
|
108
|
+
}): string;
|
|
109
|
+
/**
|
|
110
|
+
* Generates a single React hook for an API endpoint with unique parameter interface
|
|
111
|
+
*/
|
|
112
|
+
generateSingleHookWithUniqueName(path: string, method: string, endpointInfo: any, schemas: {
|
|
113
|
+
[key: string]: any;
|
|
114
|
+
}): string;
|
|
115
|
+
/**
|
|
116
|
+
* Generates a single React hook for an API endpoint
|
|
117
|
+
*/
|
|
118
|
+
generateSingleHook(path: string, method: string, endpointInfo: any, schemas: {
|
|
119
|
+
[key: string]: any;
|
|
120
|
+
}): string;
|
|
121
|
+
/**
|
|
122
|
+
* Generate operation ID from path and method if not provided
|
|
123
|
+
*/
|
|
124
|
+
generateOperationId(path: string, method: string): string;
|
|
125
|
+
/**
|
|
126
|
+
* Saves the generated documentation to a file
|
|
127
|
+
*/
|
|
128
|
+
saveDocumentationToFile(documentation: string, outputPath: string): void;
|
|
129
|
+
/**
|
|
130
|
+
* Saves the generated TypeScript types to a file
|
|
131
|
+
*/
|
|
132
|
+
saveTypesToFile(types: string, outputPath: string): void;
|
|
133
|
+
/**
|
|
134
|
+
* Saves the generated React hooks to files organized by tag
|
|
135
|
+
*/
|
|
136
|
+
saveHooksByTag(hooksByTag: Map<string, string>, outputDir: string): void;
|
|
137
|
+
}
|