next-openapi-gen 0.7.2 → 0.7.3

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.
@@ -2,9 +2,8 @@ import * as t from "@babel/types";
2
2
  import fs from "fs";
3
3
  import path from "path";
4
4
  import traverse from "@babel/traverse";
5
- import { parse } from "@babel/parser";
6
5
  import { SchemaProcessor } from "./schema-processor.js";
7
- import { capitalize, extractJSDocComments, extractPathParameters, getOperationId, } from "./utils.js";
6
+ import { capitalize, extractJSDocComments, parseTypeScriptFile, extractPathParameters, getOperationId, } from "./utils.js";
8
7
  import { logger } from "./logger.js";
9
8
  const HTTP_METHODS = ["GET", "POST", "PUT", "PATCH", "DELETE"];
10
9
  const MUTATION_HTTP_METHODS = ["PATCH", "POST", "PUT"];
@@ -118,10 +117,7 @@ export class RouteProcessor {
118
117
  if (this.processFileTracker[filePath])
119
118
  return;
120
119
  const content = fs.readFileSync(filePath, "utf-8");
121
- const ast = parse(content, {
122
- sourceType: "module",
123
- plugins: ["typescript", "decorators-legacy"],
124
- });
120
+ const ast = parseTypeScriptFile(content);
125
121
  traverse.default(ast, {
126
122
  ExportNamedDeclaration: (path) => {
127
123
  const declaration = path.node.declaration;
@@ -1,8 +1,8 @@
1
1
  import fs from "fs";
2
2
  import path from "path";
3
- import { parse } from "@babel/parser";
4
3
  import traverse from "@babel/traverse";
5
4
  import * as t from "@babel/types";
5
+ import { parseTypeScriptFile } from "./utils.js";
6
6
  import { ZodSchemaConverter } from "./zod-converter.js";
7
7
  import { logger } from "./logger.js";
8
8
  export class SchemaProcessor {
@@ -167,10 +167,14 @@ export class SchemaProcessor {
167
167
  const enumValues = this.processEnum(typeNode);
168
168
  return enumValues;
169
169
  }
170
- if (t.isTSTypeLiteral(typeNode) || t.isTSInterfaceBody(typeNode) || t.isTSInterfaceDeclaration(typeNode)) {
170
+ if (t.isTSTypeLiteral(typeNode) ||
171
+ t.isTSInterfaceBody(typeNode) ||
172
+ t.isTSInterfaceDeclaration(typeNode)) {
171
173
  const properties = {};
172
174
  // Handle interface extends clause
173
- if (t.isTSInterfaceDeclaration(typeNode) && typeNode.extends && typeNode.extends.length > 0) {
175
+ if (t.isTSInterfaceDeclaration(typeNode) &&
176
+ typeNode.extends &&
177
+ typeNode.extends.length > 0) {
174
178
  typeNode.extends.forEach((extendedType) => {
175
179
  const extendedSchema = this.resolveTSNodeType(extendedType);
176
180
  if (extendedSchema.properties) {
@@ -179,7 +183,9 @@ export class SchemaProcessor {
179
183
  });
180
184
  }
181
185
  // Get members from interface declaration body or direct members
182
- const members = t.isTSInterfaceDeclaration(typeNode) ? typeNode.body.body : typeNode.members;
186
+ const members = t.isTSInterfaceDeclaration(typeNode)
187
+ ? typeNode.body.body
188
+ : typeNode.members;
183
189
  if (members) {
184
190
  (members || []).forEach((member) => {
185
191
  if (t.isTSPropertySignature(member) && t.isIdentifier(member.key)) {
@@ -270,9 +276,9 @@ export class SchemaProcessor {
270
276
  if (t.isIdentifier(node.expression)) {
271
277
  // Convert to TSTypeReference-like structure for processing
272
278
  const syntheticNode = {
273
- type: 'TSTypeReference',
279
+ type: "TSTypeReference",
274
280
  typeName: node.expression,
275
- typeParameters: node.typeParameters
281
+ typeParameters: node.typeParameters,
276
282
  };
277
283
  return this.resolveTSNodeType(syntheticNode);
278
284
  }
@@ -322,13 +328,14 @@ export class SchemaProcessor {
322
328
  const properties = {};
323
329
  const keyNames = this.extractKeysFromLiteralType(keysParam);
324
330
  if (typeName === "Pick") {
325
- keyNames.forEach(key => {
331
+ keyNames.forEach((key) => {
326
332
  if (baseType.properties[key]) {
327
333
  properties[key] = baseType.properties[key];
328
334
  }
329
335
  });
330
336
  }
331
- else { // Omit
337
+ else {
338
+ // Omit
332
339
  Object.entries(baseType.properties).forEach(([key, value]) => {
333
340
  if (!keyNames.includes(key)) {
334
341
  properties[key] = value;
@@ -460,10 +467,7 @@ export class SchemaProcessor {
460
467
  try {
461
468
  // Recognizes different elements of TS like variable, type, interface, enum
462
469
  const content = fs.readFileSync(filePath, "utf-8");
463
- const ast = parse(content, {
464
- sourceType: "module",
465
- plugins: ["typescript", "decorators-legacy"],
466
- });
470
+ const ast = parseTypeScriptFile(content);
467
471
  this.collectTypeDefinitions(ast, schemaName);
468
472
  // Reset the set of processed types before each schema processing
469
473
  this.processingTypes.clear();
package/dist/lib/utils.js CHANGED
@@ -1,3 +1,4 @@
1
+ import { parse } from "@babel/parser";
1
2
  export function capitalize(string) {
2
3
  return string.charAt(0).toUpperCase() + string.slice(1);
3
4
  }
@@ -208,3 +209,22 @@ export function getOperationId(routePath, method) {
208
209
  const operation = routePath.replaceAll(/\//g, "-").replace(/^-/, "");
209
210
  return `${method}-${operation}`;
210
211
  }
212
+ /**
213
+ * Common Babel parser configuration for TypeScript files with JSX support
214
+ */
215
+ const DEFAULT_PARSER_OPTIONS = {
216
+ sourceType: "module",
217
+ plugins: ["typescript", "jsx", "decorators-legacy"],
218
+ };
219
+ /**
220
+ * Parse TypeScript/TSX file content with the standard configuration
221
+ * @param content - File content to parse
222
+ * @param options - Optional parser options to override defaults
223
+ * @returns Parsed AST
224
+ */
225
+ export function parseTypeScriptFile(content, options) {
226
+ return parse(content, {
227
+ ...DEFAULT_PARSER_OPTIONS,
228
+ ...options,
229
+ });
230
+ }
@@ -1,8 +1,8 @@
1
1
  import fs from "fs";
2
2
  import path from "path";
3
- import { parse } from "@babel/parser";
4
3
  import traverse from "@babel/traverse";
5
4
  import * as t from "@babel/types";
5
+ import { parseTypeScriptFile } from "./utils.js";
6
6
  import { logger } from "./logger.js";
7
7
  /**
8
8
  * Class for converting Zod schemas to OpenAPI specifications
@@ -146,10 +146,7 @@ export class ZodSchemaConverter {
146
146
  return;
147
147
  }
148
148
  // Parse the file
149
- const ast = parse(content, {
150
- sourceType: "module",
151
- plugins: ["typescript", "decorators-legacy"],
152
- });
149
+ const ast = parseTypeScriptFile(content);
153
150
  // Create a map to store imported modules
154
151
  const importedModules = {};
155
152
  // Look for all exported Zod schemas
@@ -459,10 +456,7 @@ export class ZodSchemaConverter {
459
456
  processAllSchemasInFile(filePath) {
460
457
  try {
461
458
  const content = fs.readFileSync(filePath, "utf-8");
462
- const ast = parse(content, {
463
- sourceType: "module",
464
- plugins: ["typescript", "decorators-legacy"],
465
- });
459
+ const ast = parseTypeScriptFile(content);
466
460
  traverse.default(ast, {
467
461
  ExportNamedDeclaration: (path) => {
468
462
  if (t.isVariableDeclaration(path.node.declaration)) {
@@ -1343,10 +1337,7 @@ export class ZodSchemaConverter {
1343
1337
  scanFileForTypeMappings(filePath) {
1344
1338
  try {
1345
1339
  const content = fs.readFileSync(filePath, "utf-8");
1346
- const ast = parse(content, {
1347
- sourceType: "module",
1348
- plugins: ["typescript", "decorators-legacy"],
1349
- });
1340
+ const ast = parseTypeScriptFile(content);
1350
1341
  traverse.default(ast, {
1351
1342
  TSTypeAliasDeclaration: (path) => {
1352
1343
  if (t.isIdentifier(path.node.id)) {
@@ -1413,10 +1404,7 @@ export class ZodSchemaConverter {
1413
1404
  preprocessAllSchemasInFile(filePath) {
1414
1405
  try {
1415
1406
  const content = fs.readFileSync(filePath, "utf-8");
1416
- const ast = parse(content, {
1417
- sourceType: "module",
1418
- plugins: ["typescript", "decorators-legacy"],
1419
- });
1407
+ const ast = parseTypeScriptFile(content);
1420
1408
  // Collect all exported Zod schemas
1421
1409
  traverse.default(ast, {
1422
1410
  ExportNamedDeclaration: (path) => {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "next-openapi-gen",
3
- "version": "0.7.2",
3
+ "version": "0.7.3",
4
4
  "description": "Automatically generate OpenAPI 3.0 documentation from Next.js projects, with support for Zod schemas and TypeScript types.",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",