@hono-di/swagger 0.0.6 → 0.0.7
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/index.cjs +0 -2
- package/dist/index.js +0 -2
- package/package.json +2 -2
- package/dist/index.cjs.map +0 -1
- package/dist/index.js.map +0 -1
package/dist/index.cjs
CHANGED
package/dist/index.js
CHANGED
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@hono-di/swagger",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.7",
|
|
4
4
|
"description": "OpenAPI (Swagger) module for Hono-DI",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.cjs",
|
|
@@ -21,7 +21,7 @@
|
|
|
21
21
|
"test": "bun test"
|
|
22
22
|
},
|
|
23
23
|
"dependencies": {
|
|
24
|
-
"@hono-di/core": "0.0.
|
|
24
|
+
"@hono-di/core": "0.0.7",
|
|
25
25
|
"reflect-metadata": "^0.2.2"
|
|
26
26
|
},
|
|
27
27
|
"peerDependencies": {
|
package/dist/index.cjs.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/document-builder.ts","../src/decorators.ts","../src/explorers/api-scanner.ts","../src/swagger-module.ts"],"names":["METADATA_KEYS"],"mappings":"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","file":"index.cjs","sourcesContent":["export class DocumentBuilder {\n private readonly document: any = {\n openapi: '3.0.0',\n info: {\n title: '',\n description: '',\n version: '1.0.0',\n contact: {},\n },\n tags: [],\n servers: [],\n paths: {},\n components: {\n securitySchemes: {},\n },\n };\n\n setTitle(title: string): this {\n this.document.info.title = title;\n return this;\n }\n\n setDescription(description: string): this {\n this.document.info.description = description;\n return this;\n }\n\n setVersion(version: string): this {\n this.document.info.version = version;\n return this;\n }\n\n setContact(name: string, url: string, email: string): this {\n this.document.info.contact = { name, url, email };\n return this;\n }\n\n addServer(url: string, description?: string): this {\n this.document.servers.push({ url, description });\n return this;\n }\n\n addTag(name: string, description?: string): this {\n this.document.tags.push({ name, description });\n return this;\n }\n\n addBearerAuth(options: any = {}, name = 'bearer'): this {\n this.document.components.securitySchemes[name] = {\n type: 'http',\n scheme: 'bearer',\n bearerFormat: 'JWT',\n ...options,\n };\n return this;\n }\n\n build(): any {\n return this.document;\n }\n}\n","import 'reflect-metadata';\n\nexport const DECORATORS_PREFIX = 'swagger';\nexport const DECORATORS = {\n API_TAGS: `${DECORATORS_PREFIX}/apiTags`,\n API_OPERATION: `${DECORATORS_PREFIX}/apiOperation`,\n API_RESPONSE: `${DECORATORS_PREFIX}/apiResponse`,\n API_PARAM: `${DECORATORS_PREFIX}/apiParam`,\n API_BODY: `${DECORATORS_PREFIX}/apiBody`,\n API_PROPERTY: `${DECORATORS_PREFIX}/apiProperty`,\n};\n\nexport function ApiTags(...tags: string[]): ClassDecorator {\n return (target: any) => {\n Reflect.defineMetadata(DECORATORS.API_TAGS, tags, target);\n };\n}\n\nexport function ApiOperation(options: { summary?: string; description?: string; deprecated?: boolean }): MethodDecorator {\n return (target: any, propertyKey: string | symbol, descriptor: PropertyDescriptor) => {\n Reflect.defineMetadata(DECORATORS.API_OPERATION, options, descriptor.value);\n return descriptor;\n };\n}\n\nexport function ApiResponse(options: { status: number; description: string; type?: any }): MethodDecorator {\n return (target: any, propertyKey: string | symbol, descriptor: PropertyDescriptor) => {\n const responses = Reflect.getMetadata(DECORATORS.API_RESPONSE, descriptor.value) || {};\n responses[options.status] = options;\n Reflect.defineMetadata(DECORATORS.API_RESPONSE, responses, descriptor.value);\n return descriptor;\n };\n}\n\nexport function ApiProperty(options: { description?: string; type?: any; required?: boolean; example?: any } = {}): PropertyDecorator {\n return (target: any, propertyKey: string | symbol) => {\n const properties = Reflect.getMetadata(DECORATORS.API_PROPERTY, target.constructor) || [];\n properties.push({ key: propertyKey, ...options });\n Reflect.defineMetadata(DECORATORS.API_PROPERTY, properties, target.constructor);\n };\n}\n","import { Container, METADATA_KEYS, RequestMethod } from '@hono-di/core';\nimport { DECORATORS } from '../decorators';\nimport { SwaggerDocument } from '../interfaces';\n\nexport class SwaggerScanner {\n constructor(private readonly container: Container) { }\n\n scan(document: SwaggerDocument): SwaggerDocument {\n const modules = this.container.getModules();\n\n modules.forEach((module) => {\n module.controllers.forEach((wrapper) => {\n this.scanController(wrapper.metatype, document);\n });\n });\n\n return document;\n }\n\n private scanController(controller: any, document: SwaggerDocument) {\n if (!controller) return;\n\n const { prefix } = Reflect.getMetadata(METADATA_KEYS.CONTROLLER, controller) || { prefix: '' };\n const routes = Reflect.getMetadata(METADATA_KEYS.ROUTES, controller) || [];\n const apiTags = Reflect.getMetadata(DECORATORS.API_TAGS, controller) || [];\n\n // Add tags to document\n apiTags.forEach((tag: string) => {\n if (!document.tags.find(t => t.name === tag)) {\n document.tags.push({ name: tag });\n }\n });\n\n routes.forEach((route: any) => {\n const method = route.requestMethod;\n const path = this.normalizePath(prefix, route.path);\n const descriptor = Object.getOwnPropertyDescriptor(controller.prototype, route.methodName);\n const handler = descriptor?.value;\n\n if (!handler) return;\n\n const operation = this.createOperation(handler, apiTags);\n\n if (!document.paths[path]) {\n document.paths[path] = {};\n }\n document.paths[path][method] = operation;\n });\n }\n\n private createOperation(handler: any, controllerTags: string[]) {\n const apiOperation = Reflect.getMetadata(DECORATORS.API_OPERATION, handler) || {};\n const apiResponses = Reflect.getMetadata(DECORATORS.API_RESPONSE, handler) || {};\n\n const responses: Record<string, any> = {};\n Object.keys(apiResponses).forEach(status => {\n responses[status] = {\n description: apiResponses[status].description,\n };\n });\n\n // Default response if none provided\n if (Object.keys(responses).length === 0) {\n responses['200'] = { description: 'Successful operation' };\n }\n\n return {\n summary: apiOperation.summary || '',\n description: apiOperation.description || '',\n tags: controllerTags,\n responses,\n // TODO: Add parameters and request body scanning\n };\n }\n\n private normalizePath(prefix: string, path: string): string {\n const cleanPrefix = prefix ? prefix.replace(/^\\/+/, '').replace(/\\/+$/, '') : '';\n const cleanPath = path ? path.replace(/^\\/+/, '').replace(/\\/+$/, '') : '';\n let result = '';\n if (cleanPrefix) result += `/${cleanPrefix}`;\n if (cleanPath) result += `/${cleanPath}`;\n return (result || '/').replace(/:([^\\/]+)/g, '{$1}'); // Convert :param to {param}\n }\n}\n","import { HonoDiApplication } from '@hono-di/core';\nimport { DocumentBuilder } from './document-builder';\nimport { SwaggerDocument, SwaggerCustomOptions } from './interfaces';\nimport { SwaggerScanner } from './explorers/api-scanner';\n\nexport class SwaggerModule {\n static createDocument(app: HonoDiApplication, config: SwaggerDocument): SwaggerDocument {\n const container = app.getContainer();\n const scanner = new SwaggerScanner(container);\n const document = config;\n return scanner.scan(document);\n }\n\n static setup(path: string, app: HonoDiApplication, document: SwaggerDocument, options?: SwaggerCustomOptions) {\n const httpAdapter = app.getHttpAdapter();\n\n // Serve Swagger JSON\n httpAdapter.get(`${path}-json`, (c: any) => c.json(document));\n\n // Serve Swagger UI\n httpAdapter.get(path, (c: any) => {\n const html = `\n <!DOCTYPE html>\n <html lang=\"en\">\n <head>\n <meta charset=\"UTF-8\">\n <title>${document.info.title}</title>\n <link rel=\"stylesheet\" type=\"text/css\" href=\"https://unpkg.com/swagger-ui-dist@5/swagger-ui.css\" />\n <style>\n html { box-sizing: border-box; overflow: -moz-scrollbars-vertical; overflow-y: scroll; }\n *, *:before, *:after { box-sizing: inherit; }\n body { margin: 0; background: #fafafa; }\n </style>\n </head>\n <body>\n <div id=\"swagger-ui\"></div>\n <script src=\"https://unpkg.com/swagger-ui-dist@5/swagger-ui-bundle.js\" charset=\"UTF-8\"> </script>\n <script src=\"https://unpkg.com/swagger-ui-dist@5/swagger-ui-standalone-preset.js\" charset=\"UTF-8\"> </script>\n <script>\n window.onload = function() {\n const ui = SwaggerUIBundle({\n spec: ${JSON.stringify(document)},\n dom_id: '#swagger-ui',\n deepLinking: true,\n presets: [\n SwaggerUIBundle.presets.apis,\n SwaggerUIStandalonePreset\n ],\n plugins: [\n SwaggerUIBundle.plugins.DownloadUrl\n ],\n layout: \"StandaloneLayout\"\n });\n window.ui = ui;\n };\n </script>\n </body>\n </html>`;\n return c.html(html);\n });\n }\n}\n"]}
|
package/dist/index.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/document-builder.ts","../src/decorators.ts","../src/explorers/api-scanner.ts","../src/swagger-module.ts"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["export class DocumentBuilder {\n private readonly document: any = {\n openapi: '3.0.0',\n info: {\n title: '',\n description: '',\n version: '1.0.0',\n contact: {},\n },\n tags: [],\n servers: [],\n paths: {},\n components: {\n securitySchemes: {},\n },\n };\n\n setTitle(title: string): this {\n this.document.info.title = title;\n return this;\n }\n\n setDescription(description: string): this {\n this.document.info.description = description;\n return this;\n }\n\n setVersion(version: string): this {\n this.document.info.version = version;\n return this;\n }\n\n setContact(name: string, url: string, email: string): this {\n this.document.info.contact = { name, url, email };\n return this;\n }\n\n addServer(url: string, description?: string): this {\n this.document.servers.push({ url, description });\n return this;\n }\n\n addTag(name: string, description?: string): this {\n this.document.tags.push({ name, description });\n return this;\n }\n\n addBearerAuth(options: any = {}, name = 'bearer'): this {\n this.document.components.securitySchemes[name] = {\n type: 'http',\n scheme: 'bearer',\n bearerFormat: 'JWT',\n ...options,\n };\n return this;\n }\n\n build(): any {\n return this.document;\n }\n}\n","import 'reflect-metadata';\n\nexport const DECORATORS_PREFIX = 'swagger';\nexport const DECORATORS = {\n API_TAGS: `${DECORATORS_PREFIX}/apiTags`,\n API_OPERATION: `${DECORATORS_PREFIX}/apiOperation`,\n API_RESPONSE: `${DECORATORS_PREFIX}/apiResponse`,\n API_PARAM: `${DECORATORS_PREFIX}/apiParam`,\n API_BODY: `${DECORATORS_PREFIX}/apiBody`,\n API_PROPERTY: `${DECORATORS_PREFIX}/apiProperty`,\n};\n\nexport function ApiTags(...tags: string[]): ClassDecorator {\n return (target: any) => {\n Reflect.defineMetadata(DECORATORS.API_TAGS, tags, target);\n };\n}\n\nexport function ApiOperation(options: { summary?: string; description?: string; deprecated?: boolean }): MethodDecorator {\n return (target: any, propertyKey: string | symbol, descriptor: PropertyDescriptor) => {\n Reflect.defineMetadata(DECORATORS.API_OPERATION, options, descriptor.value);\n return descriptor;\n };\n}\n\nexport function ApiResponse(options: { status: number; description: string; type?: any }): MethodDecorator {\n return (target: any, propertyKey: string | symbol, descriptor: PropertyDescriptor) => {\n const responses = Reflect.getMetadata(DECORATORS.API_RESPONSE, descriptor.value) || {};\n responses[options.status] = options;\n Reflect.defineMetadata(DECORATORS.API_RESPONSE, responses, descriptor.value);\n return descriptor;\n };\n}\n\nexport function ApiProperty(options: { description?: string; type?: any; required?: boolean; example?: any } = {}): PropertyDecorator {\n return (target: any, propertyKey: string | symbol) => {\n const properties = Reflect.getMetadata(DECORATORS.API_PROPERTY, target.constructor) || [];\n properties.push({ key: propertyKey, ...options });\n Reflect.defineMetadata(DECORATORS.API_PROPERTY, properties, target.constructor);\n };\n}\n","import { Container, METADATA_KEYS, RequestMethod } from '@hono-di/core';\nimport { DECORATORS } from '../decorators';\nimport { SwaggerDocument } from '../interfaces';\n\nexport class SwaggerScanner {\n constructor(private readonly container: Container) { }\n\n scan(document: SwaggerDocument): SwaggerDocument {\n const modules = this.container.getModules();\n\n modules.forEach((module) => {\n module.controllers.forEach((wrapper) => {\n this.scanController(wrapper.metatype, document);\n });\n });\n\n return document;\n }\n\n private scanController(controller: any, document: SwaggerDocument) {\n if (!controller) return;\n\n const { prefix } = Reflect.getMetadata(METADATA_KEYS.CONTROLLER, controller) || { prefix: '' };\n const routes = Reflect.getMetadata(METADATA_KEYS.ROUTES, controller) || [];\n const apiTags = Reflect.getMetadata(DECORATORS.API_TAGS, controller) || [];\n\n // Add tags to document\n apiTags.forEach((tag: string) => {\n if (!document.tags.find(t => t.name === tag)) {\n document.tags.push({ name: tag });\n }\n });\n\n routes.forEach((route: any) => {\n const method = route.requestMethod;\n const path = this.normalizePath(prefix, route.path);\n const descriptor = Object.getOwnPropertyDescriptor(controller.prototype, route.methodName);\n const handler = descriptor?.value;\n\n if (!handler) return;\n\n const operation = this.createOperation(handler, apiTags);\n\n if (!document.paths[path]) {\n document.paths[path] = {};\n }\n document.paths[path][method] = operation;\n });\n }\n\n private createOperation(handler: any, controllerTags: string[]) {\n const apiOperation = Reflect.getMetadata(DECORATORS.API_OPERATION, handler) || {};\n const apiResponses = Reflect.getMetadata(DECORATORS.API_RESPONSE, handler) || {};\n\n const responses: Record<string, any> = {};\n Object.keys(apiResponses).forEach(status => {\n responses[status] = {\n description: apiResponses[status].description,\n };\n });\n\n // Default response if none provided\n if (Object.keys(responses).length === 0) {\n responses['200'] = { description: 'Successful operation' };\n }\n\n return {\n summary: apiOperation.summary || '',\n description: apiOperation.description || '',\n tags: controllerTags,\n responses,\n // TODO: Add parameters and request body scanning\n };\n }\n\n private normalizePath(prefix: string, path: string): string {\n const cleanPrefix = prefix ? prefix.replace(/^\\/+/, '').replace(/\\/+$/, '') : '';\n const cleanPath = path ? path.replace(/^\\/+/, '').replace(/\\/+$/, '') : '';\n let result = '';\n if (cleanPrefix) result += `/${cleanPrefix}`;\n if (cleanPath) result += `/${cleanPath}`;\n return (result || '/').replace(/:([^\\/]+)/g, '{$1}'); // Convert :param to {param}\n }\n}\n","import { HonoDiApplication } from '@hono-di/core';\nimport { DocumentBuilder } from './document-builder';\nimport { SwaggerDocument, SwaggerCustomOptions } from './interfaces';\nimport { SwaggerScanner } from './explorers/api-scanner';\n\nexport class SwaggerModule {\n static createDocument(app: HonoDiApplication, config: SwaggerDocument): SwaggerDocument {\n const container = app.getContainer();\n const scanner = new SwaggerScanner(container);\n const document = config;\n return scanner.scan(document);\n }\n\n static setup(path: string, app: HonoDiApplication, document: SwaggerDocument, options?: SwaggerCustomOptions) {\n const httpAdapter = app.getHttpAdapter();\n\n // Serve Swagger JSON\n httpAdapter.get(`${path}-json`, (c: any) => c.json(document));\n\n // Serve Swagger UI\n httpAdapter.get(path, (c: any) => {\n const html = `\n <!DOCTYPE html>\n <html lang=\"en\">\n <head>\n <meta charset=\"UTF-8\">\n <title>${document.info.title}</title>\n <link rel=\"stylesheet\" type=\"text/css\" href=\"https://unpkg.com/swagger-ui-dist@5/swagger-ui.css\" />\n <style>\n html { box-sizing: border-box; overflow: -moz-scrollbars-vertical; overflow-y: scroll; }\n *, *:before, *:after { box-sizing: inherit; }\n body { margin: 0; background: #fafafa; }\n </style>\n </head>\n <body>\n <div id=\"swagger-ui\"></div>\n <script src=\"https://unpkg.com/swagger-ui-dist@5/swagger-ui-bundle.js\" charset=\"UTF-8\"> </script>\n <script src=\"https://unpkg.com/swagger-ui-dist@5/swagger-ui-standalone-preset.js\" charset=\"UTF-8\"> </script>\n <script>\n window.onload = function() {\n const ui = SwaggerUIBundle({\n spec: ${JSON.stringify(document)},\n dom_id: '#swagger-ui',\n deepLinking: true,\n presets: [\n SwaggerUIBundle.presets.apis,\n SwaggerUIStandalonePreset\n ],\n plugins: [\n SwaggerUIBundle.plugins.DownloadUrl\n ],\n layout: \"StandaloneLayout\"\n });\n window.ui = ui;\n };\n </script>\n </body>\n </html>`;\n return c.html(html);\n });\n }\n}\n"]}
|