zeti-framework-backend 0.3.2 → 0.3.4

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.
@@ -290,6 +290,7 @@ async function generateSwagger(registry, config, options) {
290
290
  for (const [name, schema] of Object.entries(namedSchemas)) {
291
291
  componentsSchemas[name] = zodToJsonSchema(schema);
292
292
  }
293
+ console.log("[Swagger Generator] Servers config:", config.servers);
293
294
  return {
294
295
  openapi: "3.0.3",
295
296
  info: {
@@ -321,4 +322,4 @@ export {
321
322
  isMultipleFileSchema,
322
323
  generateSwagger
323
324
  };
324
- //# sourceMappingURL=chunk-TTILJJ3O.js.map
325
+ //# sourceMappingURL=chunk-LP6KXLQS.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/swagger/zod-converter.ts","../src/utils/zod-file.ts","../src/swagger/generator.ts"],"sourcesContent":["import { z, ZodTypeAny, ZodObject, ZodString, ZodNumber, ZodBoolean, ZodArray, ZodOptional, ZodNullable, ZodEnum, ZodUnion, ZodEffects, ZodDefault, ZodLiteral, ZodDate } from 'zod';\n\n/**\n * Extrai o tipo base de um schema Zod, removendo wrappers como ZodEffects, ZodOptional, etc.\n */\nfunction unwrapZodType(schema: ZodTypeAny): ZodTypeAny {\n if (schema instanceof ZodEffects) {\n const innerSchema = schema._def.schema;\n if (innerSchema) {\n return unwrapZodType(innerSchema);\n }\n }\n if (schema instanceof ZodOptional) {\n return unwrapZodType(schema._def.innerType);\n }\n if (schema instanceof ZodNullable) {\n return unwrapZodType(schema._def.innerType);\n }\n if (schema instanceof ZodDefault) {\n return unwrapZodType(schema._def.innerType);\n }\n return schema;\n}\n\n/**\n * Verifica se um schema é opcional em algum nível da cadeia de wrappers.\n */\nfunction checkIsOptional(schema: ZodTypeAny): boolean {\n if (schema instanceof ZodOptional) {\n return true;\n }\n if (schema instanceof ZodDefault) {\n return true; // ZodDefault implica em opcional (tem valor padrão)\n }\n if (schema instanceof ZodEffects) {\n const innerSchema = schema._def.schema;\n if (innerSchema) {\n return checkIsOptional(innerSchema);\n }\n }\n return false;\n}\n\nexport function zodToJsonSchema(schema: ZodTypeAny): any {\n // ZodEffects (preprocess, refine, transform) - pega o tipo interno\n if (schema instanceof ZodEffects) {\n // O tipo interno está em schema._def.schema\n const innerSchema = schema._def.schema;\n if (innerSchema) {\n return zodToJsonSchema(innerSchema);\n }\n // Fallback: tenta detectar pelo typeName do inner\n return { type: 'string' };\n }\n \n // ZodDefault - pega o tipo interno\n if (schema instanceof ZodDefault) {\n return zodToJsonSchema(schema._def.innerType);\n }\n \n if (schema instanceof ZodString) {\n return { type: 'string' };\n }\n if (schema instanceof ZodNumber) {\n return { type: 'number' };\n }\n if (schema instanceof ZodBoolean) {\n return { type: 'boolean' };\n }\n if (schema instanceof ZodDate) {\n return { type: 'string', format: 'date-time' };\n }\n if (schema instanceof ZodLiteral) {\n const value = schema._def.value;\n const type = typeof value === 'number' ? 'number' : typeof value === 'boolean' ? 'boolean' : 'string';\n return { type, enum: [value] };\n }\n if (schema instanceof ZodArray) {\n return { type: 'array', items: zodToJsonSchema(schema._def.type) };\n }\n if (schema instanceof ZodOptional) {\n return zodToJsonSchema(schema._def.innerType);\n }\n if (schema instanceof ZodNullable) {\n return { ...zodToJsonSchema(schema._def.innerType), nullable: true };\n }\n if (schema instanceof ZodEnum) {\n return { type: 'string', enum: schema._def.values };\n }\n if (schema instanceof ZodUnion) {\n const options = schema._def.options.map((option: ZodTypeAny) => {\n return zodToJsonSchema(option);\n });\n return { oneOf: options };\n }\n if (schema instanceof ZodObject) {\n const shape = schema.shape;\n const properties: Record<string, any> = {};\n const required: string[] = [];\n\n for (const [key, value] of Object.entries(shape)) {\n properties[key] = zodToJsonSchema(value as ZodTypeAny);\n // Verifica se é opcional verificando se existe ZodOptional em algum nível\n const isOptional = checkIsOptional(value as ZodTypeAny);\n if (!isOptional) {\n required.push(key);\n }\n }\n\n return {\n type: 'object',\n properties,\n ...(required.length > 0 ? { required } : {}),\n };\n }\n\n // Fallback: tenta detectar pelo _def.typeName\n const typeName = (schema as any)?._def?.typeName;\n if (typeName === 'ZodString') return { type: 'string' };\n if (typeName === 'ZodNumber') return { type: 'number' };\n if (typeName === 'ZodBoolean') return { type: 'boolean' };\n\n return { type: 'string' };\n}\n","import { z } from 'zod';\r\n\r\n/**\r\n * Symbol usado para identificar schemas de arquivo\r\n */\r\nexport const FILE_SCHEMA_SYMBOL = Symbol.for('zeti:file-schema');\r\n\r\n/**\r\n * Cria um schema Zod para upload de arquivo\r\n * \r\n * @example\r\n * ```typescript\r\n * app.post(\"/upload\", {\r\n * middleware: {\r\n * schema: (zod) => ({\r\n * formData: zod.object({\r\n * file: zFile(),\r\n * avatar: zFile(\"Foto de perfil\"),\r\n * documents: zFiles(\"Documentos PDF\"),\r\n * }),\r\n * }),\r\n * },\r\n * route: async ({ formData }) => {\r\n * const file = formData.file as File;\r\n * // ...\r\n * },\r\n * });\r\n * ```\r\n */\r\nexport function zFile(description?: string) {\r\n const schema = z.any().describe(description || 'File upload');\r\n // Marca o schema como arquivo usando metadata\r\n (schema as any)._def[FILE_SCHEMA_SYMBOL] = true;\r\n (schema as any)._def.isFile = true;\r\n return schema;\r\n}\r\n\r\n/**\r\n * Cria um schema Zod para upload de múltiplos arquivos\r\n */\r\nexport function zFiles(description?: string) {\r\n const schema = z.array(z.any()).describe(description || 'Multiple file upload');\r\n // Marca o schema como array de arquivos\r\n (schema as any)._def[FILE_SCHEMA_SYMBOL] = true;\r\n (schema as any)._def.isFile = true;\r\n (schema as any)._def.isMultiple = true;\r\n return schema;\r\n}\r\n\r\n/**\r\n * Verifica se um schema Zod é um schema de arquivo\r\n */\r\nexport function isFileSchema(schema: z.ZodTypeAny): boolean {\r\n return (schema as any)?._def?.[FILE_SCHEMA_SYMBOL] === true || \r\n (schema as any)?._def?.isFile === true;\r\n}\r\n\r\n/**\r\n * Verifica se um schema Zod é um schema de múltiplos arquivos\r\n */\r\nexport function isMultipleFileSchema(schema: z.ZodTypeAny): boolean {\r\n return isFileSchema(schema) && (schema as any)?._def?.isMultiple === true;\r\n}\r\n","import type { SwaggerRegistry } from './registry';\r\nimport type { ZetiSwaggerConfig } from '../types/config';\r\nimport { zodToJsonSchema } from './zod-converter';\r\nimport type { ZodTypeAny, ZodObject } from 'zod';\r\nimport { isFileSchema, isMultipleFileSchema } from '../utils/zod-file';\r\n\r\nfunction extractPathParams(path: string): string[] {\r\n const matches = path.match(/:([^/]+)/g);\r\n return matches ? matches.map((m) => m.slice(1)) : [];\r\n}\r\n\r\nfunction pathToOpenAPI(path: string): string {\r\n return path.replace(/:([^/]+)/g, '{$1}');\r\n}\r\n\r\nfunction extractTag(path: string): string {\r\n const parts = path.split('/').filter(Boolean);\r\n return parts[0] || 'default';\r\n}\r\n\r\nexport interface SwaggerGeneratorOptions {\r\n loadGeneratedSchemas?: () => Promise<{\r\n routeResponseSchemas?: Record<string, Record<string, { schema: ZodTypeAny; ref: string | null }>>;\r\n namedSchemas?: Record<string, ZodTypeAny>;\r\n }>;\r\n}\r\n\r\nexport async function generateSwagger(\r\n registry: SwaggerRegistry,\r\n config: ZetiSwaggerConfig,\r\n options?: SwaggerGeneratorOptions\r\n): Promise<object> {\r\n const routes = registry.getAll();\r\n const paths: Record<string, any> = {};\r\n \r\n // Try to load generated schemas\r\n let routeResponseSchemas: Record<string, Record<string, { schema: ZodTypeAny; ref: string | null }>> = {};\r\n let namedSchemas: Record<string, ZodTypeAny> = {};\r\n \r\n if (options?.loadGeneratedSchemas) {\r\n try {\r\n const schemas = await options.loadGeneratedSchemas();\r\n if (schemas.routeResponseSchemas) {\r\n routeResponseSchemas = schemas.routeResponseSchemas;\r\n }\r\n if (schemas.namedSchemas) {\r\n namedSchemas = schemas.namedSchemas;\r\n }\r\n } catch {\r\n // File doesn't exist yet (first build) - ignore\r\n }\r\n }\r\n\r\n for (const route of routes) {\r\n const openApiPath = pathToOpenAPI(route.path);\r\n const pathParams = extractPathParams(route.path);\r\n const tag = route.tags?.[0] || extractTag(route.path);\r\n\r\n if (!paths[openApiPath]) {\r\n paths[openApiPath] = {};\r\n }\r\n\r\n // Try to get response schema: 1) from generated types, 2) from manual schema, 3) fallback\r\n const generated = routeResponseSchemas[route.path]?.[route.method];\r\n let responseJsonSchema: any;\r\n \r\n if (generated?.ref) {\r\n // Use $ref to reference named schema\r\n responseJsonSchema = { $ref: `#/components/schemas/${generated.ref}` };\r\n } else if (generated?.schema) {\r\n responseJsonSchema = zodToJsonSchema(generated.schema);\r\n } else if (route.responseSchema) {\r\n responseJsonSchema = zodToJsonSchema(route.responseSchema);\r\n } else {\r\n responseJsonSchema = { type: 'object' };\r\n }\r\n\r\n const operation: any = {\r\n tags: route.tags || [tag],\r\n summary: route.summary || `${route.method.toUpperCase()} ${route.path}`,\r\n description: route.description,\r\n parameters: [],\r\n responses: {\r\n '200': {\r\n description: 'Successful response',\r\n content: {\r\n 'application/json': {\r\n schema: responseJsonSchema,\r\n },\r\n },\r\n },\r\n },\r\n };\r\n\r\n // Adiciona headers globais configurados\r\n if (config.globalHeaders?.length) {\r\n for (const header of config.globalHeaders) {\r\n operation.parameters.push({\r\n name: header.name,\r\n in: 'header',\r\n required: header.required ?? false,\r\n schema: { type: 'string' },\r\n description: header.description || `Header ${header.name}`,\r\n ...(header.example ? { example: header.example } : {}),\r\n });\r\n }\r\n }\r\n\r\n for (const param of pathParams) {\r\n operation.parameters.push({\r\n name: param,\r\n in: 'path',\r\n required: true,\r\n schema: { type: 'string' },\r\n });\r\n }\r\n\r\n if (route.querySchema) {\r\n const queryJsonSchema = zodToJsonSchema(route.querySchema);\r\n if (queryJsonSchema.properties) {\r\n for (const [name, schema] of Object.entries(queryJsonSchema.properties)) {\r\n operation.parameters.push({\r\n name,\r\n in: 'query',\r\n required: queryJsonSchema.required?.includes(name) || false,\r\n schema,\r\n });\r\n }\r\n }\r\n }\r\n\r\n if (route.formDataSchema && ['post', 'put', 'patch'].includes(route.method)) {\r\n const formDataJsonSchema = zodToJsonSchema(route.formDataSchema);\r\n \r\n // Detecta campos de arquivo e ajusta o schema para OpenAPI\r\n const properties: Record<string, any> = { ...(formDataJsonSchema.properties || {}) };\r\n const required: string[] = formDataJsonSchema.required || [];\r\n \r\n // Verifica cada campo do schema original para detectar arquivos\r\n const originalSchema = route.formDataSchema as ZodObject<any>;\r\n if (originalSchema && typeof originalSchema === 'object' && 'shape' in originalSchema) {\r\n const shape = (originalSchema as any).shape || {};\r\n \r\n for (const [key, fieldSchema] of Object.entries(shape)) {\r\n const zodField = fieldSchema as ZodTypeAny;\r\n \r\n // Verifica se é um schema de arquivo usando nosso helper\r\n if (isFileSchema(zodField)) {\r\n const isMultiple = isMultipleFileSchema(zodField);\r\n const description = zodField.description || 'File upload';\r\n \r\n if (isMultiple) {\r\n properties[key] = {\r\n type: 'array',\r\n items: {\r\n type: 'string',\r\n format: 'binary',\r\n },\r\n description,\r\n };\r\n } else {\r\n properties[key] = {\r\n type: 'string',\r\n format: 'binary',\r\n description,\r\n };\r\n }\r\n }\r\n }\r\n }\r\n \r\n // Fallback: detecta por descrição ou tipo\r\n for (const [key, prop] of Object.entries(properties)) {\r\n const propObj = prop as any;\r\n // Se ainda não foi convertido e tem descrição indicando arquivo\r\n if (propObj.format !== 'binary') {\r\n if (propObj.description?.toLowerCase().includes('file') || \r\n propObj.description?.toLowerCase().includes('arquivo') ||\r\n propObj.description?.toLowerCase().includes('upload')) {\r\n properties[key] = {\r\n type: 'string',\r\n format: 'binary',\r\n description: propObj.description || 'File upload',\r\n };\r\n }\r\n }\r\n }\r\n \r\n operation.requestBody = {\r\n required: true,\r\n content: {\r\n 'multipart/form-data': {\r\n schema: {\r\n type: 'object',\r\n properties,\r\n ...(required.length > 0 ? { required } : {}),\r\n },\r\n },\r\n },\r\n };\r\n } else if (route.bodySchema && ['post', 'put', 'patch'].includes(route.method)) {\r\n const bodySchema = zodToJsonSchema(route.bodySchema);\r\n operation.requestBody = {\r\n required: true,\r\n content: {\r\n 'application/json': {\r\n schema: bodySchema,\r\n },\r\n },\r\n };\r\n }\r\n\r\n if (route.auth) {\r\n operation.security = [{ bearerAuth: [] }];\r\n operation.responses['401'] = { description: 'Unauthorized' };\r\n }\r\n\r\n if (route.claims?.length) {\r\n operation.responses['403'] = {\r\n description: `Forbidden - requires claims: ${route.claims.join(', ')}`,\r\n };\r\n }\r\n\r\n if (route.roles?.length) {\r\n operation.responses['403'] = {\r\n description: `Forbidden - requires roles: ${route.roles.join(', ')}`,\r\n };\r\n }\r\n\r\n paths[openApiPath][route.method] = operation;\r\n }\r\n\r\n // Build components.schemas from namedSchemas\r\n const componentsSchemas: Record<string, any> = {};\r\n for (const [name, schema] of Object.entries(namedSchemas)) {\r\n componentsSchemas[name] = zodToJsonSchema(schema);\r\n }\r\n\r\n console.log('[Swagger Generator] Servers config:', config.servers);\r\n \r\n return {\r\n openapi: '3.0.3',\r\n info: {\r\n title: config.title,\r\n version: config.version,\r\n description: 'Auto-generated API documentation',\r\n },\r\n servers: config.servers,\r\n paths,\r\n components: {\r\n ...(Object.keys(componentsSchemas).length > 0 ? { schemas: componentsSchemas } : {}),\r\n securitySchemes: {\r\n bearerAuth: {\r\n type: 'http',\r\n scheme: 'bearer',\r\n bearerFormat: 'JWT',\r\n },\r\n },\r\n },\r\n };\r\n}\r\n"],"mappings":"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","names":["z"]}
@@ -1,8 +1,8 @@
1
1
  import {
2
2
  generateSwagger
3
- } from "./chunk-TTILJJ3O.js";
3
+ } from "./chunk-LP6KXLQS.js";
4
4
  import "./chunk-7D4SUZUM.js";
5
5
  export {
6
6
  generateSwagger
7
7
  };
8
- //# sourceMappingURL=generator-KC24DE6M.js.map
8
+ //# sourceMappingURL=generator-BPQXOPGT.js.map
package/dist/index.js CHANGED
@@ -25,7 +25,7 @@ import {
25
25
  isMultipleFileSchema,
26
26
  zFile,
27
27
  zFiles
28
- } from "./chunk-TTILJJ3O.js";
28
+ } from "./chunk-LP6KXLQS.js";
29
29
  import {
30
30
  __commonJS,
31
31
  __require,
@@ -10239,7 +10239,7 @@ function createZetiApp(options) {
10239
10239
  let cachedSchemas = null;
10240
10240
  honoApp.get(uiPath, swaggerUI({ url: docPath }));
10241
10241
  honoApp.get(docPath, async (c) => {
10242
- const { generateSwagger: generateSwagger2 } = await import("./generator-KC24DE6M.js");
10242
+ const { generateSwagger: generateSwagger2 } = await import("./generator-BPQXOPGT.js");
10243
10243
  const loadGeneratedSchemas = async () => {
10244
10244
  if (cachedSchemas) {
10245
10245
  return cachedSchemas;
@@ -11243,6 +11243,8 @@ function defineZetiConfig(config, options) {
11243
11243
  ...config.swagger,
11244
11244
  servers: config.swagger.servers || swaggerDefaults.servers
11245
11245
  };
11246
+ console.log("[defineZetiConfig] Swagger servers:", swagger.servers);
11247
+ console.log("[defineZetiConfig] Config swagger servers:", config.swagger.servers);
11246
11248
  const cors2 = {
11247
11249
  ...DEFAULT_CORS,
11248
11250
  ...config.cors