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/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
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAEA,mCAA0D;AAC1D,kDAA0B;AAC1B,2CAAwC;AACxC,uCAAyB;AAEzB,MAAM,IAAI,GAAG,IAAA,eAAK,EAAC,IAAA,iBAAO,EAAC,OAAO,CAAC,IAAI,CAAC,CAAC;KACtC,KAAK,CAAC,qBAAqB,CAAC;KAC5B,MAAM,CAAC,KAAK,EAAE;IACb,KAAK,EAAE,GAAG;IACV,QAAQ,EAAE,8BAA8B;IACxC,IAAI,EAAE,QAAQ;CACf,CAAC;KACD,MAAM,CAAC,OAAO,EAAE;IACf,KAAK,EAAE,GAAG;IACV,QAAQ,EAAE,qCAAqC;IAC/C,IAAI,EAAE,QAAQ;CACf,CAAC;KACD,MAAM,CAAC,QAAQ,EAAE;IAChB,KAAK,EAAE,GAAG;IACV,QAAQ,EAAE,8FAA8F;IACxG,IAAI,EAAE,QAAQ;IACd,OAAO,EAAE,uCAAuC;CACjD,CAAC;KACD,MAAM,CAAC,gBAAgB,EAAE;IACxB,QAAQ,EAAE,sCAAsC;IAChD,IAAI,EAAE,SAAS;IACf,OAAO,EAAE,KAAK;CACf,CAAC;KACD,MAAM,CAAC,gBAAgB,EAAE;IACxB,QAAQ,EAAE,sBAAsB;IAChC,IAAI,EAAE,SAAS;IACf,OAAO,EAAE,KAAK;CACf,CAAC;KACD,MAAM,CAAC,cAAc,EAAE;IACtB,QAAQ,EAAE,oEAAoE;IAC9E,IAAI,EAAE,QAAQ;IACd,OAAO,EAAE,mBAAmB;CAC7B,CAAC;KACD,MAAM,CAAC,cAAc,EAAE;IACtB,QAAQ,EAAE,+DAA+D;IACzE,IAAI,EAAE,QAAQ;IACd,OAAO,EAAE,mBAAmB;CAC7B,CAAC;KACD,KAAK,CAAC,CAAC,IAAI,EAAE,EAAE;IACd,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;QAC7B,MAAM,IAAI,KAAK,CAAC,0CAA0C,CAAC,CAAC;IAC9D,CAAC;IACD,IAAI,IAAI,CAAC,GAAG,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;QAC3B,MAAM,IAAI,KAAK,CAAC,8CAA8C,CAAC,CAAC;IAClE,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC,CAAC;KACD,IAAI,EAAE;KACN,SAAS,EAAE,CAAC;AAEf,KAAK,UAAU,GAAG;IAChB,IAAI,CAAC;QACH,qDAAqD;QACrD,MAAM,YAAY,GAAG,aAAa,CAAC;QACnC,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;YACjC,EAAE,CAAC,SAAS,CAAC,YAAY,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YAChD,OAAO,CAAC,GAAG,CAAC,sBAAsB,YAAY,EAAE,CAAC,CAAC;QACpD,CAAC;QAED,MAAM,SAAS,GAAG,IAAI,2BAAmB,EAAE,CAAC;QAC5C,IAAI,UAAkC,CAAC;QAEvC,IAAI,IAAI,CAAC,GAAG,EAAE,CAAC;YACb,OAAO,CAAC,GAAG,CAAC,+BAA+B,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;YACvD,UAAU,GAAG,MAAM,SAAS,CAAC,gBAAgB,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAC1D,CAAC;aAAM,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;YACtB,OAAO,CAAC,GAAG,CAAC,8BAA8B,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC;YACxD,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;gBAC/B,MAAM,IAAI,KAAK,CAAC,8BAA8B,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC;YAC9D,CAAC;YACD,UAAU,GAAG,SAAS,CAAC,mBAAmB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACzD,CAAC;QAED,sFAAsF;QACtF,IAAI,CAAC,UAAU,EAAE,CAAC;YAChB,MAAM,IAAI,KAAK,CAAC,4BAA4B,CAAC,CAAC;QAChD,CAAC;QAED,qCAAqC;QACrC,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC;YACvB,OAAO,CAAC,GAAG,CAAC,2CAA2C,CAAC,CAAC;YACzD,MAAM,KAAK,GAAG,SAAS,CAAC,uBAAuB,CAAC,UAAU,CAAC,CAAC;YAC5D,MAAM,eAAe,GAAG,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;gBACrD,GAAG,IAAI,CAAC,WAAW,IAAI,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,WAAW,CAAC;YACrG,SAAS,CAAC,eAAe,CAAC,KAAK,EAAE,eAAe,CAAC,CAAC;YAClD,OAAO,CAAC,GAAG,CAAC,+CAA+C,eAAe,EAAE,CAAC,CAAC;QAChF,CAAC;QAED,qCAAqC;QACrC,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC;YACvB,OAAO,CAAC,GAAG,CAAC,2BAA2B,CAAC,CAAC;YACzC,MAAM,UAAU,GAAG,SAAS,CAAC,kBAAkB,CAAC,UAAU,CAAC,CAAC;YAC5D,SAAS,CAAC,cAAc,CAAC,UAAU,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;YACvD,OAAO,CAAC,GAAG,CAAC,0CAA0C,IAAI,CAAC,WAAW,GAAG,CAAC,CAAC;QAC7E,CAAC;QAED,uFAAuF;QACvF,IAAI,CAAC,IAAI,CAAC,aAAa,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC;YAC/C,OAAO,CAAC,GAAG,CAAC,6BAA6B,CAAC,CAAC;YAC3C,MAAM,aAAa,GAAG,SAAS,CAAC,qBAAqB,CAAC,UAAU,CAAC,CAAC;YAClE,SAAS,CAAC,uBAAuB,CAAC,aAAa,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;YAC9D,OAAO,CAAC,GAAG,CAAC,4CAA4C,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;QACzE,CAAC;IACH,CAAC;IAAC,OAAO,KAAc,EAAE,CAAC;QACxB,IAAI,KAAK,YAAY,KAAK,EAAE,CAAC;YAC3B,OAAO,CAAC,KAAK,CAAC,QAAQ,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;QACzC,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,KAAK,CAAC,QAAQ,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;QACzC,CAAC;QACD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC;AAED,cAAc;AACd,GAAG,EAAE,CAAC"}
@@ -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
+ }