@navios/openapi-fastify 1.0.0-alpha.2 → 1.0.0-alpha.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.
- package/CHANGELOG.md +18 -0
- package/dist/src/openapi-fastify.plugin.d.mts +3 -2
- package/dist/src/openapi-fastify.plugin.d.mts.map +1 -1
- package/dist/tsconfig.lib.tsbuildinfo +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/lib/index.cjs +3 -2
- package/lib/index.cjs.map +1 -1
- package/lib/index.d.cts +3 -2
- package/lib/index.d.cts.map +1 -1
- package/lib/index.d.mts +3 -2
- package/lib/index.d.mts.map +1 -1
- package/lib/index.mjs +3 -2
- package/lib/index.mjs.map +1 -1
- package/package.json +7 -7
- package/src/openapi-fastify.plugin.mts +11 -8
package/lib/index.cjs
CHANGED
|
@@ -89,9 +89,10 @@ let zod = require("zod");
|
|
|
89
89
|
*/ var OpenApiFastifyPlugin = class {
|
|
90
90
|
name = "openapi-fastify";
|
|
91
91
|
async register(context, options) {
|
|
92
|
-
const fastify = context.
|
|
92
|
+
const fastify = context.adapter.getServer();
|
|
93
|
+
const globalPrefix = context.adapter.getGlobalPrefix();
|
|
93
94
|
const parsedOptions = fastifyOpenApiPluginOptionsSchema.parse(options);
|
|
94
|
-
const documentWithServers = applyGlobalPrefix((await context.container.get(_navios_openapi.OpenApiGeneratorService)).generate(context.modules, options),
|
|
95
|
+
const documentWithServers = applyGlobalPrefix((await context.container.get(_navios_openapi.OpenApiGeneratorService)).generate(context.modules, options), globalPrefix, options);
|
|
95
96
|
const jsonPath = parsedOptions.jsonPath;
|
|
96
97
|
fastify.get(jsonPath, async (_request, reply) => {
|
|
97
98
|
return reply.send(documentWithServers);
|
package/lib/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs","names":["z","scalarThemeSchema","enum","scalarMetaDataSchema","object","title","string","optional","description","ogDescription","ogTitle","ogImage","twitterCard","scalarOptionsSchema","theme","favicon","logo","hideDownloadButton","boolean","hideSearch","customCss","metaData","cdn","fastifyOpenApiPluginOptionsSchema","jsonPath","default","yamlPath","docsPath","scalar","disableScalar","disableYaml","applyGlobalPrefix","document","globalPrefix","options","servers","length","url","description","OpenApiGeneratorService","getHtmlDocument","stringify","yamlStringify","fastifyOpenApiPluginOptionsSchema","applyGlobalPrefix","OpenApiFastifyPlugin","name","register","context","options","fastify","server","parsedOptions","parse","generator","container","get","document","generate","modules","documentWithServers","globalPrefix","jsonPath","_request","reply","send","disableYaml","yamlPath","type","disableScalar","docsPath","scalarOptions","scalar","html","generateScalarHtml","specUrl","url","theme","favicon","customCss","hideDownloadButton","hideSearch","metaData","cdn","pageTitle","title","defineOpenApiPlugin","plugin"],"sources":["../src/schemas/openapi-fastify-options.schema.mts","../src/utils/apply-global-prefix.util.mts","../src/openapi-fastify.plugin.mts"],"sourcesContent":["import { z } from 'zod'\n\n/**\n * Zod schema for Scalar UI theme options\n */\nexport const scalarThemeSchema = z.enum([\n 'default',\n 'alternate',\n 'moon',\n 'purple',\n 'solarized',\n 'bluePlanet',\n 'saturn',\n 'kepler',\n 'mars',\n 'deepSpace',\n 'laserwave',\n 'elysiajs',\n 'fastify',\n 'none',\n])\n\n/**\n * Zod schema for Scalar UI metadata\n */\nexport const scalarMetaDataSchema = z\n .object({\n title: z.string().optional(),\n description: z.string().optional(),\n ogDescription: z.string().optional(),\n ogTitle: z.string().optional(),\n ogImage: z.string().optional(),\n twitterCard: z.string().optional(),\n })\n .optional()\n\n/**\n * Zod schema for Scalar UI configuration options\n */\nexport const scalarOptionsSchema = z.object({\n /**\n * Theme for Scalar UI\n * @default 'default'\n */\n theme: scalarThemeSchema.optional(),\n\n /**\n * Custom favicon URL\n */\n favicon: z.string().optional(),\n\n /**\n * Custom logo URL\n */\n logo: z.string().optional(),\n\n /**\n * Hide the \"Download OpenAPI Spec\" button\n * @default false\n */\n hideDownloadButton: z.boolean().optional(),\n\n /**\n * Hide the \"Search\" input\n * @default false\n */\n hideSearch: z.boolean().optional(),\n\n /**\n * Custom CSS to inject\n */\n customCss: z.string().optional(),\n\n /**\n * Meta data for the HTML page\n */\n metaData: scalarMetaDataSchema,\n\n /**\n * CDN URL for Scalar API Reference\n * @default 'https://cdn.jsdelivr.net/npm/@scalar/api-reference'\n */\n cdn: z.string().optional(),\n})\n\n/**\n * Zod schema for Fastify OpenAPI plugin options\n */\nexport const fastifyOpenApiPluginOptionsSchema = z.object({\n /**\n * Path to serve OpenAPI JSON\n * @default '/openapi.json'\n */\n jsonPath: z.string().optional().default('/openapi.json'),\n\n /**\n * Path to serve OpenAPI YAML\n * @default '/openapi.yaml'\n */\n yamlPath: z.string().optional().default('/openapi.yaml'),\n\n /**\n * Path to serve Scalar UI\n * @default '/docs'\n */\n docsPath: z.string().optional().default('/docs'),\n\n /**\n * Scalar UI configuration\n */\n scalar: scalarOptionsSchema.optional(),\n\n /**\n * Disable Scalar UI (only serve JSON/YAML)\n * @default false\n */\n disableScalar: z.boolean().optional().default(false),\n\n /**\n * Disable YAML endpoint\n * @default true\n */\n disableYaml: z.boolean().optional().default(true),\n})\n\nexport type ScalarTheme = z.infer<typeof scalarThemeSchema>\nexport type ScalarMetaData = z.infer<typeof scalarMetaDataSchema>\nexport type ScalarOptions = z.infer<typeof scalarOptionsSchema>\nexport type FastifyOpenApiPluginOptionsBase = z.infer<typeof fastifyOpenApiPluginOptionsSchema>\n","import type { OpenApiGeneratorOptions } from '@navios/openapi'\n\n/**\n * OpenAPI document shape (minimal interface for typing)\n */\nexport interface OpenAPIDocument {\n openapi: string\n info: {\n title: string\n version: string\n }\n paths?: Record<string, unknown>\n servers?: Array<{\n url: string\n description?: string\n }>\n}\n\n/**\n * Applies global prefix to OpenAPI servers if needed.\n *\n * @param document - The OpenAPI document to modify\n * @param globalPrefix - The global route prefix (e.g., '/api/v1')\n * @param options - Plugin options that may contain server configuration\n * @returns The document with servers array updated if applicable\n */\nexport function applyGlobalPrefix<T extends OpenAPIDocument>(\n document: T,\n globalPrefix: string,\n options: OpenApiGeneratorOptions,\n): T {\n // If servers are already defined, don't modify\n if (options.servers && options.servers.length > 0) {\n return document\n }\n\n // If no global prefix, return as-is\n if (!globalPrefix) {\n return document\n }\n\n // Add a default server with the global prefix\n return {\n ...document,\n servers: [\n {\n url: globalPrefix,\n description: 'API with global prefix',\n },\n ],\n }\n}\n","import type {\n NaviosPlugin,\n PluginContext,\n PluginDefinition,\n} from '@navios/core'\nimport type { OpenApiGeneratorOptions } from '@navios/openapi'\nimport type { FastifyInstance } from 'fastify'\n\nimport { OpenApiGeneratorService } from '@navios/openapi'\n\nimport { getHtmlDocument } from '@scalar/core/libs/html-rendering'\nimport { stringify as yamlStringify } from 'yaml'\n\nimport type {\n FastifyOpenApiPluginOptionsBase,\n ScalarOptions,\n ScalarTheme,\n} from './schemas/index.mjs'\n\nimport { fastifyOpenApiPluginOptionsSchema } from './schemas/index.mjs'\nimport { applyGlobalPrefix } from './utils/index.mjs'\n\n/**\n * Combined options for the Fastify OpenAPI plugin.\n * Extends OpenApiGeneratorOptions with Fastify-specific settings.\n */\nexport interface FastifyOpenApiPluginOptions\n extends OpenApiGeneratorOptions, Partial<FastifyOpenApiPluginOptionsBase> {}\n\n/**\n * Class-based OpenAPI Fastify plugin that integrates with Navios plugin system.\n *\n * This plugin:\n * - Scans all registered modules for endpoints\n * - Generates an OpenAPI 3.1 document\n * - Serves the document as JSON and optionally YAML\n * - Provides Scalar UI for interactive documentation\n */\nexport class OpenApiFastifyPlugin implements NaviosPlugin<FastifyOpenApiPluginOptions> {\n readonly name = 'openapi-fastify'\n\n async register(\n context: PluginContext,\n options: FastifyOpenApiPluginOptions,\n ): Promise<void> {\n const fastify = context.server as FastifyInstance\n\n // Parse and validate options with defaults\n const parsedOptions = fastifyOpenApiPluginOptionsSchema.parse(options)\n\n // Get the generator service from the container\n const generator = await context.container.get(OpenApiGeneratorService)\n\n // Generate OpenAPI document from discovered endpoints\n const document = generator.generate(context.modules, options)\n\n // Apply global prefix to servers if not already set\n const documentWithServers = applyGlobalPrefix(\n document,\n context.globalPrefix,\n options,\n )\n\n // Register JSON endpoint\n const jsonPath = parsedOptions.jsonPath\n fastify.get(jsonPath, async (_request, reply) => {\n return reply.send(documentWithServers)\n })\n\n // Register YAML endpoint (disabled by default)\n if (!parsedOptions.disableYaml) {\n const yamlPath = parsedOptions.yamlPath\n fastify.get(yamlPath, async (_request, reply) => {\n reply.type('text/yaml')\n return reply.send(yamlStringify(documentWithServers))\n })\n }\n\n // Register Scalar UI (unless disabled)\n if (!parsedOptions.disableScalar) {\n const docsPath = parsedOptions.docsPath\n const scalarOptions = options.scalar ?? {}\n\n // Generate HTML document using @scalar/core\n const html = this.generateScalarHtml(jsonPath, scalarOptions)\n\n fastify.get(docsPath, async (_request, reply) => {\n reply.type('text/html')\n return reply.send(html)\n })\n }\n }\n\n /**\n * Generates the Scalar API Reference HTML document.\n *\n * @param specUrl - URL to the OpenAPI JSON specification\n * @param options - Scalar UI configuration options\n * @returns Complete HTML document string\n */\n private generateScalarHtml(specUrl: string, options: ScalarOptions): string {\n return getHtmlDocument({\n url: specUrl,\n theme: options.theme ?? 'default',\n favicon: options.favicon,\n customCss: options.customCss,\n hideDownloadButton: options.hideDownloadButton,\n hideSearch: options.hideSearch,\n metaData: options.metaData,\n cdn: options.cdn,\n pageTitle: options.metaData?.title ?? 'API Reference',\n })\n }\n}\n\n/**\n * Creates a plugin definition for the OpenAPI Fastify plugin.\n *\n * @param options - Plugin configuration options\n * @returns Plugin definition to pass to `app.usePlugin()`\n *\n * @example\n * ```typescript\n * import { NaviosFactory } from '@navios/core'\n * import { defineFastifyEnvironment } from '@navios/adapter-fastify'\n * import { defineOpenApiPlugin } from '@navios/openapi-fastify'\n *\n * const app = await NaviosFactory.create(AppModule, {\n * adapter: defineFastifyEnvironment(),\n * })\n *\n * app.usePlugin(defineOpenApiPlugin({\n * info: {\n * title: 'My API',\n * version: '1.0.0',\n * description: 'API documentation',\n * },\n * servers: [\n * { url: 'http://localhost:3000', description: 'Development' },\n * ],\n * securitySchemes: {\n * bearerAuth: {\n * type: 'http',\n * scheme: 'bearer',\n * bearerFormat: 'JWT',\n * },\n * },\n * scalar: {\n * theme: 'purple',\n * },\n * }))\n *\n * await app.listen({ port: 3000 })\n * // API docs available at http://localhost:3000/docs\n * ```\n */\nexport function defineOpenApiPlugin(\n options: FastifyOpenApiPluginOptions,\n): PluginDefinition<FastifyOpenApiPluginOptions> {\n return {\n plugin: new OpenApiFastifyPlugin(),\n options,\n }\n}\n\n// Re-export types for convenience\nexport type { ScalarOptions, ScalarTheme }\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.cjs","names":["z","scalarThemeSchema","enum","scalarMetaDataSchema","object","title","string","optional","description","ogDescription","ogTitle","ogImage","twitterCard","scalarOptionsSchema","theme","favicon","logo","hideDownloadButton","boolean","hideSearch","customCss","metaData","cdn","fastifyOpenApiPluginOptionsSchema","jsonPath","default","yamlPath","docsPath","scalar","disableScalar","disableYaml","applyGlobalPrefix","document","globalPrefix","options","servers","length","url","description","OpenApiGeneratorService","getHtmlDocument","stringify","yamlStringify","fastifyOpenApiPluginOptionsSchema","applyGlobalPrefix","OpenApiFastifyPlugin","name","register","context","options","fastify","adapter","getServer","globalPrefix","getGlobalPrefix","parsedOptions","parse","generator","container","get","document","generate","modules","documentWithServers","jsonPath","_request","reply","send","disableYaml","yamlPath","type","disableScalar","docsPath","scalarOptions","scalar","html","generateScalarHtml","specUrl","url","theme","favicon","customCss","hideDownloadButton","hideSearch","metaData","cdn","pageTitle","title","defineOpenApiPlugin","plugin"],"sources":["../src/schemas/openapi-fastify-options.schema.mts","../src/utils/apply-global-prefix.util.mts","../src/openapi-fastify.plugin.mts"],"sourcesContent":["import { z } from 'zod'\n\n/**\n * Zod schema for Scalar UI theme options\n */\nexport const scalarThemeSchema = z.enum([\n 'default',\n 'alternate',\n 'moon',\n 'purple',\n 'solarized',\n 'bluePlanet',\n 'saturn',\n 'kepler',\n 'mars',\n 'deepSpace',\n 'laserwave',\n 'elysiajs',\n 'fastify',\n 'none',\n])\n\n/**\n * Zod schema for Scalar UI metadata\n */\nexport const scalarMetaDataSchema = z\n .object({\n title: z.string().optional(),\n description: z.string().optional(),\n ogDescription: z.string().optional(),\n ogTitle: z.string().optional(),\n ogImage: z.string().optional(),\n twitterCard: z.string().optional(),\n })\n .optional()\n\n/**\n * Zod schema for Scalar UI configuration options\n */\nexport const scalarOptionsSchema = z.object({\n /**\n * Theme for Scalar UI\n * @default 'default'\n */\n theme: scalarThemeSchema.optional(),\n\n /**\n * Custom favicon URL\n */\n favicon: z.string().optional(),\n\n /**\n * Custom logo URL\n */\n logo: z.string().optional(),\n\n /**\n * Hide the \"Download OpenAPI Spec\" button\n * @default false\n */\n hideDownloadButton: z.boolean().optional(),\n\n /**\n * Hide the \"Search\" input\n * @default false\n */\n hideSearch: z.boolean().optional(),\n\n /**\n * Custom CSS to inject\n */\n customCss: z.string().optional(),\n\n /**\n * Meta data for the HTML page\n */\n metaData: scalarMetaDataSchema,\n\n /**\n * CDN URL for Scalar API Reference\n * @default 'https://cdn.jsdelivr.net/npm/@scalar/api-reference'\n */\n cdn: z.string().optional(),\n})\n\n/**\n * Zod schema for Fastify OpenAPI plugin options\n */\nexport const fastifyOpenApiPluginOptionsSchema = z.object({\n /**\n * Path to serve OpenAPI JSON\n * @default '/openapi.json'\n */\n jsonPath: z.string().optional().default('/openapi.json'),\n\n /**\n * Path to serve OpenAPI YAML\n * @default '/openapi.yaml'\n */\n yamlPath: z.string().optional().default('/openapi.yaml'),\n\n /**\n * Path to serve Scalar UI\n * @default '/docs'\n */\n docsPath: z.string().optional().default('/docs'),\n\n /**\n * Scalar UI configuration\n */\n scalar: scalarOptionsSchema.optional(),\n\n /**\n * Disable Scalar UI (only serve JSON/YAML)\n * @default false\n */\n disableScalar: z.boolean().optional().default(false),\n\n /**\n * Disable YAML endpoint\n * @default true\n */\n disableYaml: z.boolean().optional().default(true),\n})\n\nexport type ScalarTheme = z.infer<typeof scalarThemeSchema>\nexport type ScalarMetaData = z.infer<typeof scalarMetaDataSchema>\nexport type ScalarOptions = z.infer<typeof scalarOptionsSchema>\nexport type FastifyOpenApiPluginOptionsBase = z.infer<typeof fastifyOpenApiPluginOptionsSchema>\n","import type { OpenApiGeneratorOptions } from '@navios/openapi'\n\n/**\n * OpenAPI document shape (minimal interface for typing)\n */\nexport interface OpenAPIDocument {\n openapi: string\n info: {\n title: string\n version: string\n }\n paths?: Record<string, unknown>\n servers?: Array<{\n url: string\n description?: string\n }>\n}\n\n/**\n * Applies global prefix to OpenAPI servers if needed.\n *\n * @param document - The OpenAPI document to modify\n * @param globalPrefix - The global route prefix (e.g., '/api/v1')\n * @param options - Plugin options that may contain server configuration\n * @returns The document with servers array updated if applicable\n */\nexport function applyGlobalPrefix<T extends OpenAPIDocument>(\n document: T,\n globalPrefix: string,\n options: OpenApiGeneratorOptions,\n): T {\n // If servers are already defined, don't modify\n if (options.servers && options.servers.length > 0) {\n return document\n }\n\n // If no global prefix, return as-is\n if (!globalPrefix) {\n return document\n }\n\n // Add a default server with the global prefix\n return {\n ...document,\n servers: [\n {\n url: globalPrefix,\n description: 'API with global prefix',\n },\n ],\n }\n}\n","import type {\n NaviosPlugin,\n PluginContext,\n PluginDefinition,\n} from '@navios/core'\nimport type { OpenApiGeneratorOptions } from '@navios/openapi'\nimport type { FastifyReply, FastifyRequest } from 'fastify'\n\nimport type { FastifyApplicationServiceInterface } from '@navios/adapter-fastify'\n\nimport { OpenApiGeneratorService } from '@navios/openapi'\n\nimport { getHtmlDocument } from '@scalar/core/libs/html-rendering'\nimport { stringify as yamlStringify } from 'yaml'\n\nimport type {\n FastifyOpenApiPluginOptionsBase,\n ScalarOptions,\n ScalarTheme,\n} from './schemas/index.mjs'\n\nimport { fastifyOpenApiPluginOptionsSchema } from './schemas/index.mjs'\nimport { applyGlobalPrefix } from './utils/index.mjs'\n\n/**\n * Combined options for the Fastify OpenAPI plugin.\n * Extends OpenApiGeneratorOptions with Fastify-specific settings.\n */\nexport interface FastifyOpenApiPluginOptions\n extends OpenApiGeneratorOptions, Partial<FastifyOpenApiPluginOptionsBase> {}\n\n/**\n * Class-based OpenAPI Fastify plugin that integrates with Navios plugin system.\n *\n * This plugin:\n * - Scans all registered modules for endpoints\n * - Generates an OpenAPI 3.1 document\n * - Serves the document as JSON and optionally YAML\n * - Provides Scalar UI for interactive documentation\n */\nexport class OpenApiFastifyPlugin implements NaviosPlugin<FastifyOpenApiPluginOptions, FastifyApplicationServiceInterface> {\n readonly name = 'openapi-fastify'\n\n async register(\n context: PluginContext<FastifyApplicationServiceInterface>,\n options: FastifyOpenApiPluginOptions,\n ): Promise<void> {\n const fastify = context.adapter.getServer()\n const globalPrefix = context.adapter.getGlobalPrefix()\n\n // Parse and validate options with defaults\n const parsedOptions = fastifyOpenApiPluginOptionsSchema.parse(options)\n\n // Get the generator service from the container\n const generator = await context.container.get(OpenApiGeneratorService)\n\n // Generate OpenAPI document from discovered endpoints\n const document = generator.generate(context.modules, options)\n\n // Apply global prefix to servers if not already set\n const documentWithServers = applyGlobalPrefix(\n document,\n globalPrefix,\n options,\n )\n\n // Register JSON endpoint\n const jsonPath = parsedOptions.jsonPath\n fastify.get(jsonPath, async (_request: FastifyRequest, reply: FastifyReply) => {\n return reply.send(documentWithServers)\n })\n\n // Register YAML endpoint (disabled by default)\n if (!parsedOptions.disableYaml) {\n const yamlPath = parsedOptions.yamlPath\n fastify.get(yamlPath, async (_request: FastifyRequest, reply: FastifyReply) => {\n reply.type('text/yaml')\n return reply.send(yamlStringify(documentWithServers))\n })\n }\n\n // Register Scalar UI (unless disabled)\n if (!parsedOptions.disableScalar) {\n const docsPath = parsedOptions.docsPath\n const scalarOptions = options.scalar ?? {}\n\n // Generate HTML document using @scalar/core\n const html = this.generateScalarHtml(jsonPath, scalarOptions)\n\n fastify.get(docsPath, async (_request: FastifyRequest, reply: FastifyReply) => {\n reply.type('text/html')\n return reply.send(html)\n })\n }\n }\n\n /**\n * Generates the Scalar API Reference HTML document.\n *\n * @param specUrl - URL to the OpenAPI JSON specification\n * @param options - Scalar UI configuration options\n * @returns Complete HTML document string\n */\n private generateScalarHtml(specUrl: string, options: ScalarOptions): string {\n return getHtmlDocument({\n url: specUrl,\n theme: options.theme ?? 'default',\n favicon: options.favicon,\n customCss: options.customCss,\n hideDownloadButton: options.hideDownloadButton,\n hideSearch: options.hideSearch,\n metaData: options.metaData,\n cdn: options.cdn,\n pageTitle: options.metaData?.title ?? 'API Reference',\n })\n }\n}\n\n/**\n * Creates a plugin definition for the OpenAPI Fastify plugin.\n *\n * @param options - Plugin configuration options\n * @returns Plugin definition to pass to `app.usePlugin()`\n *\n * @example\n * ```typescript\n * import { NaviosFactory } from '@navios/core'\n * import { defineFastifyEnvironment } from '@navios/adapter-fastify'\n * import { defineOpenApiPlugin } from '@navios/openapi-fastify'\n *\n * const app = await NaviosFactory.create(AppModule, {\n * adapter: defineFastifyEnvironment(),\n * })\n *\n * app.usePlugin(defineOpenApiPlugin({\n * info: {\n * title: 'My API',\n * version: '1.0.0',\n * description: 'API documentation',\n * },\n * servers: [\n * { url: 'http://localhost:3000', description: 'Development' },\n * ],\n * securitySchemes: {\n * bearerAuth: {\n * type: 'http',\n * scheme: 'bearer',\n * bearerFormat: 'JWT',\n * },\n * },\n * scalar: {\n * theme: 'purple',\n * },\n * }))\n *\n * await app.listen({ port: 3000 })\n * // API docs available at http://localhost:3000/docs\n * ```\n */\nexport function defineOpenApiPlugin(\n options: FastifyOpenApiPluginOptions,\n): PluginDefinition<FastifyOpenApiPluginOptions> {\n return {\n plugin: new OpenApiFastifyPlugin(),\n options,\n }\n}\n\n// Re-export types for convenience\nexport type { ScalarOptions, ScalarTheme }\n"],"mappings":"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"}
|
package/lib/index.d.cts
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { NaviosPlugin, PluginContext, PluginDefinition } from "@navios/core";
|
|
2
2
|
import { ApiDeprecated, ApiDeprecatedOptions, ApiExclude, ApiOperation, ApiOperationOptions, ApiSecurity, ApiSecurityRequirement, ApiStream, ApiStreamOptions, ApiSummary, ApiTag, ApiTagOptions, OpenApiEndpointMetadata, OpenApiGeneratorOptions, OpenApiGeneratorOptions as OpenApiGeneratorOptions$1 } from "@navios/openapi";
|
|
3
|
+
import { FastifyApplicationServiceInterface } from "@navios/adapter-fastify";
|
|
3
4
|
import { z } from "zod";
|
|
4
5
|
|
|
5
6
|
//#region src/schemas/openapi-fastify-options.schema.d.mts
|
|
@@ -129,9 +130,9 @@ interface FastifyOpenApiPluginOptions extends OpenApiGeneratorOptions$1, Partial
|
|
|
129
130
|
* - Serves the document as JSON and optionally YAML
|
|
130
131
|
* - Provides Scalar UI for interactive documentation
|
|
131
132
|
*/
|
|
132
|
-
declare class OpenApiFastifyPlugin implements NaviosPlugin<FastifyOpenApiPluginOptions> {
|
|
133
|
+
declare class OpenApiFastifyPlugin implements NaviosPlugin<FastifyOpenApiPluginOptions, FastifyApplicationServiceInterface> {
|
|
133
134
|
readonly name = "openapi-fastify";
|
|
134
|
-
register(context: PluginContext
|
|
135
|
+
register(context: PluginContext<FastifyApplicationServiceInterface>, options: FastifyOpenApiPluginOptions): Promise<void>;
|
|
135
136
|
/**
|
|
136
137
|
* Generates the Scalar API Reference HTML document.
|
|
137
138
|
*
|
package/lib/index.d.cts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.cts","names":[],"sources":["../src/schemas/openapi-fastify-options.schema.mts","../src/openapi-fastify.plugin.mts","../src/utils/apply-global-prefix.util.mts"],"sourcesContent":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.d.cts","names":[],"sources":["../src/schemas/openapi-fastify-options.schema.mts","../src/openapi-fastify.plugin.mts","../src/utils/apply-global-prefix.util.mts"],"sourcesContent":[],"mappings":";;;;;;;;;cAKa,mBAAiB,CAAA,CAAA;;EAAjB,SAAA,EAAA,WAeX;EAKW,IAAA,EAAA,MAAA;;;;;;;;;;;;;;;;AAAoB,cAApB,oBAAoB,EAAA,CAAA,CAAA,WAAA,CAAA,CAAA,CAAA,SAAA,CAAA;EAcpB,KAAA,eAAA,YA4CX,CAAA;;;;;;;;;;cA5CW,qBAAmB,CAAA,CAAA;;;;;;;;;;;;;;;;;;;;;EAAA,SAAA,eAAA,YAAA,CAAA;EAAA,QAAA,eAAA,YAAA,CAAA;IAiDnB,KAAA,eAAA,YAmCX,CAAA;;;;;;;;;;;;cAnCW,mCAAiC,CAAA,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAAA,WAAA,cAAA,cAAA,aAAA,CAAA,CAAA;CAAA,eAAA,CAAA;AAqClC,KAAA,WAAA,GAAc,CAAA,CAAE,KAAa,CAAA,OAAA,iBAAR,CAAA;AAGrB,KADA,aAAA,GAAgB,CAAA,CAAE,KAClB,CAAA,OAD+B,mBACkB,CAAA;KAAjD,+BAAA,GAAkC,CAAA,CAAE,aAAa;;;;;AA3H7D;AAoBA;UCGiB,2BAAA,SACP,2BAAyB,QAAQ;;;;;;;;;;cAW9B,oBAAA,YAAgC,aAAa,6BAA6B;;EDftD,QAAA,CAAA,OAAA,ECmBpB,aDnBoB,CCmBN,kCDnBM,CAAA,EAAA,OAAA,ECoBpB,2BDpBoB,CAAA,ECqB5B,ODrB4B,CAAA,IAAA,CAAA;EAAA;;AAcjC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAiDA;;;;;;;;;;;;;;;iBCuEgB,mBAAA,UACL,8BACR,iBAAiB;;;;;;UC5JH,eAAA;;EFAJ,IAAA,EAAA;IAoBA,KAAA,EAAA,MAAA;;;UEdH;YACE;;;;;;;;;;;;;AF2BC,iBEbG,iBFyDd,CAAA,UEzD0C,eFyD1C,CAAA,CAAA,QAAA,EExDU,CFwDV,EAAA,YAAA,EAAA,MAAA,EAAA,OAAA,EEtDS,yBFsDT,CAAA,EErDC,CFqDD"}
|
package/lib/index.d.mts
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { ApiDeprecated, ApiDeprecatedOptions, ApiExclude, ApiOperation, ApiOperationOptions, ApiSecurity, ApiSecurityRequirement, ApiStream, ApiStreamOptions, ApiSummary, ApiTag, ApiTagOptions, OpenApiEndpointMetadata, OpenApiGeneratorOptions, OpenApiGeneratorOptions as OpenApiGeneratorOptions$1 } from "@navios/openapi";
|
|
2
2
|
import { z } from "zod";
|
|
3
3
|
import { NaviosPlugin, PluginContext, PluginDefinition } from "@navios/core";
|
|
4
|
+
import { FastifyApplicationServiceInterface } from "@navios/adapter-fastify";
|
|
4
5
|
|
|
5
6
|
//#region src/schemas/openapi-fastify-options.schema.d.mts
|
|
6
7
|
/**
|
|
@@ -129,9 +130,9 @@ interface FastifyOpenApiPluginOptions extends OpenApiGeneratorOptions$1, Partial
|
|
|
129
130
|
* - Serves the document as JSON and optionally YAML
|
|
130
131
|
* - Provides Scalar UI for interactive documentation
|
|
131
132
|
*/
|
|
132
|
-
declare class OpenApiFastifyPlugin implements NaviosPlugin<FastifyOpenApiPluginOptions> {
|
|
133
|
+
declare class OpenApiFastifyPlugin implements NaviosPlugin<FastifyOpenApiPluginOptions, FastifyApplicationServiceInterface> {
|
|
133
134
|
readonly name = "openapi-fastify";
|
|
134
|
-
register(context: PluginContext
|
|
135
|
+
register(context: PluginContext<FastifyApplicationServiceInterface>, options: FastifyOpenApiPluginOptions): Promise<void>;
|
|
135
136
|
/**
|
|
136
137
|
* Generates the Scalar API Reference HTML document.
|
|
137
138
|
*
|
package/lib/index.d.mts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.mts","names":[],"sources":["../src/schemas/openapi-fastify-options.schema.mts","../src/openapi-fastify.plugin.mts","../src/utils/apply-global-prefix.util.mts"],"sourcesContent":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.d.mts","names":[],"sources":["../src/schemas/openapi-fastify-options.schema.mts","../src/openapi-fastify.plugin.mts","../src/utils/apply-global-prefix.util.mts"],"sourcesContent":[],"mappings":";;;;;;;;;cAKa,mBAAiB,CAAA,CAAA;;EAAjB,SAAA,EAAA,WAeX;EAKW,IAAA,EAAA,MAAA;;;;;;;;;;;;;;;;AAAoB,cAApB,oBAAoB,EAAA,CAAA,CAAA,WAAA,CAAA,CAAA,CAAA,SAAA,CAAA;EAcpB,KAAA,eAAA,YA4CX,CAAA;;;;;;;;;;cA5CW,qBAAmB,CAAA,CAAA;;;;;;;;;;;;;;;;;;;;;EAAA,SAAA,eAAA,YAAA,CAAA;EAAA,QAAA,eAAA,YAAA,CAAA;IAiDnB,KAAA,eAAA,YAmCX,CAAA;;;;;;;;;;;;cAnCW,mCAAiC,CAAA,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAAA,WAAA,cAAA,cAAA,aAAA,CAAA,CAAA;CAAA,eAAA,CAAA;AAqClC,KAAA,WAAA,GAAc,CAAA,CAAE,KAAa,CAAA,OAAA,iBAAR,CAAA;AAGrB,KADA,aAAA,GAAgB,CAAA,CAAE,KAClB,CAAA,OAD+B,mBACkB,CAAA;KAAjD,+BAAA,GAAkC,CAAA,CAAE,aAAa;;;;;AA3H7D;AAoBA;UCGiB,2BAAA,SACP,2BAAyB,QAAQ;;;;;;;;;;cAW9B,oBAAA,YAAgC,aAAa,6BAA6B;;EDftD,QAAA,CAAA,OAAA,ECmBpB,aDnBoB,CCmBN,kCDnBM,CAAA,EAAA,OAAA,ECoBpB,2BDpBoB,CAAA,ECqB5B,ODrB4B,CAAA,IAAA,CAAA;EAAA;;AAcjC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAiDA;;;;;;;;;;;;;;;iBCuEgB,mBAAA,UACL,8BACR,iBAAiB;;;;;;UC5JH,eAAA;;EFAJ,IAAA,EAAA;IAoBA,KAAA,EAAA,MAAA;;;UEdH;YACE;;;;;;;;;;;;;AF2BC,iBEbG,iBFyDd,CAAA,UEzD0C,eFyD1C,CAAA,CAAA,QAAA,EExDU,CFwDV,EAAA,YAAA,EAAA,MAAA,EAAA,OAAA,EEtDS,yBFsDT,CAAA,EErDC,CFqDD"}
|
package/lib/index.mjs
CHANGED
|
@@ -89,9 +89,10 @@ import { z } from "zod";
|
|
|
89
89
|
*/ var OpenApiFastifyPlugin = class {
|
|
90
90
|
name = "openapi-fastify";
|
|
91
91
|
async register(context, options) {
|
|
92
|
-
const fastify = context.
|
|
92
|
+
const fastify = context.adapter.getServer();
|
|
93
|
+
const globalPrefix = context.adapter.getGlobalPrefix();
|
|
93
94
|
const parsedOptions = fastifyOpenApiPluginOptionsSchema.parse(options);
|
|
94
|
-
const documentWithServers = applyGlobalPrefix((await context.container.get(OpenApiGeneratorService)).generate(context.modules, options),
|
|
95
|
+
const documentWithServers = applyGlobalPrefix((await context.container.get(OpenApiGeneratorService)).generate(context.modules, options), globalPrefix, options);
|
|
95
96
|
const jsonPath = parsedOptions.jsonPath;
|
|
96
97
|
fastify.get(jsonPath, async (_request, reply) => {
|
|
97
98
|
return reply.send(documentWithServers);
|
package/lib/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.mjs","names":["z","scalarThemeSchema","enum","scalarMetaDataSchema","object","title","string","optional","description","ogDescription","ogTitle","ogImage","twitterCard","scalarOptionsSchema","theme","favicon","logo","hideDownloadButton","boolean","hideSearch","customCss","metaData","cdn","fastifyOpenApiPluginOptionsSchema","jsonPath","default","yamlPath","docsPath","scalar","disableScalar","disableYaml","applyGlobalPrefix","document","globalPrefix","options","servers","length","url","description","OpenApiGeneratorService","getHtmlDocument","stringify","yamlStringify","fastifyOpenApiPluginOptionsSchema","applyGlobalPrefix","OpenApiFastifyPlugin","name","register","context","options","fastify","server","parsedOptions","parse","generator","container","get","document","generate","modules","documentWithServers","globalPrefix","jsonPath","_request","reply","send","disableYaml","yamlPath","type","disableScalar","docsPath","scalarOptions","scalar","html","generateScalarHtml","specUrl","url","theme","favicon","customCss","hideDownloadButton","hideSearch","metaData","cdn","pageTitle","title","defineOpenApiPlugin","plugin"],"sources":["../src/schemas/openapi-fastify-options.schema.mts","../src/utils/apply-global-prefix.util.mts","../src/openapi-fastify.plugin.mts"],"sourcesContent":["import { z } from 'zod'\n\n/**\n * Zod schema for Scalar UI theme options\n */\nexport const scalarThemeSchema = z.enum([\n 'default',\n 'alternate',\n 'moon',\n 'purple',\n 'solarized',\n 'bluePlanet',\n 'saturn',\n 'kepler',\n 'mars',\n 'deepSpace',\n 'laserwave',\n 'elysiajs',\n 'fastify',\n 'none',\n])\n\n/**\n * Zod schema for Scalar UI metadata\n */\nexport const scalarMetaDataSchema = z\n .object({\n title: z.string().optional(),\n description: z.string().optional(),\n ogDescription: z.string().optional(),\n ogTitle: z.string().optional(),\n ogImage: z.string().optional(),\n twitterCard: z.string().optional(),\n })\n .optional()\n\n/**\n * Zod schema for Scalar UI configuration options\n */\nexport const scalarOptionsSchema = z.object({\n /**\n * Theme for Scalar UI\n * @default 'default'\n */\n theme: scalarThemeSchema.optional(),\n\n /**\n * Custom favicon URL\n */\n favicon: z.string().optional(),\n\n /**\n * Custom logo URL\n */\n logo: z.string().optional(),\n\n /**\n * Hide the \"Download OpenAPI Spec\" button\n * @default false\n */\n hideDownloadButton: z.boolean().optional(),\n\n /**\n * Hide the \"Search\" input\n * @default false\n */\n hideSearch: z.boolean().optional(),\n\n /**\n * Custom CSS to inject\n */\n customCss: z.string().optional(),\n\n /**\n * Meta data for the HTML page\n */\n metaData: scalarMetaDataSchema,\n\n /**\n * CDN URL for Scalar API Reference\n * @default 'https://cdn.jsdelivr.net/npm/@scalar/api-reference'\n */\n cdn: z.string().optional(),\n})\n\n/**\n * Zod schema for Fastify OpenAPI plugin options\n */\nexport const fastifyOpenApiPluginOptionsSchema = z.object({\n /**\n * Path to serve OpenAPI JSON\n * @default '/openapi.json'\n */\n jsonPath: z.string().optional().default('/openapi.json'),\n\n /**\n * Path to serve OpenAPI YAML\n * @default '/openapi.yaml'\n */\n yamlPath: z.string().optional().default('/openapi.yaml'),\n\n /**\n * Path to serve Scalar UI\n * @default '/docs'\n */\n docsPath: z.string().optional().default('/docs'),\n\n /**\n * Scalar UI configuration\n */\n scalar: scalarOptionsSchema.optional(),\n\n /**\n * Disable Scalar UI (only serve JSON/YAML)\n * @default false\n */\n disableScalar: z.boolean().optional().default(false),\n\n /**\n * Disable YAML endpoint\n * @default true\n */\n disableYaml: z.boolean().optional().default(true),\n})\n\nexport type ScalarTheme = z.infer<typeof scalarThemeSchema>\nexport type ScalarMetaData = z.infer<typeof scalarMetaDataSchema>\nexport type ScalarOptions = z.infer<typeof scalarOptionsSchema>\nexport type FastifyOpenApiPluginOptionsBase = z.infer<typeof fastifyOpenApiPluginOptionsSchema>\n","import type { OpenApiGeneratorOptions } from '@navios/openapi'\n\n/**\n * OpenAPI document shape (minimal interface for typing)\n */\nexport interface OpenAPIDocument {\n openapi: string\n info: {\n title: string\n version: string\n }\n paths?: Record<string, unknown>\n servers?: Array<{\n url: string\n description?: string\n }>\n}\n\n/**\n * Applies global prefix to OpenAPI servers if needed.\n *\n * @param document - The OpenAPI document to modify\n * @param globalPrefix - The global route prefix (e.g., '/api/v1')\n * @param options - Plugin options that may contain server configuration\n * @returns The document with servers array updated if applicable\n */\nexport function applyGlobalPrefix<T extends OpenAPIDocument>(\n document: T,\n globalPrefix: string,\n options: OpenApiGeneratorOptions,\n): T {\n // If servers are already defined, don't modify\n if (options.servers && options.servers.length > 0) {\n return document\n }\n\n // If no global prefix, return as-is\n if (!globalPrefix) {\n return document\n }\n\n // Add a default server with the global prefix\n return {\n ...document,\n servers: [\n {\n url: globalPrefix,\n description: 'API with global prefix',\n },\n ],\n }\n}\n","import type {\n NaviosPlugin,\n PluginContext,\n PluginDefinition,\n} from '@navios/core'\nimport type { OpenApiGeneratorOptions } from '@navios/openapi'\nimport type { FastifyInstance } from 'fastify'\n\nimport { OpenApiGeneratorService } from '@navios/openapi'\n\nimport { getHtmlDocument } from '@scalar/core/libs/html-rendering'\nimport { stringify as yamlStringify } from 'yaml'\n\nimport type {\n FastifyOpenApiPluginOptionsBase,\n ScalarOptions,\n ScalarTheme,\n} from './schemas/index.mjs'\n\nimport { fastifyOpenApiPluginOptionsSchema } from './schemas/index.mjs'\nimport { applyGlobalPrefix } from './utils/index.mjs'\n\n/**\n * Combined options for the Fastify OpenAPI plugin.\n * Extends OpenApiGeneratorOptions with Fastify-specific settings.\n */\nexport interface FastifyOpenApiPluginOptions\n extends OpenApiGeneratorOptions, Partial<FastifyOpenApiPluginOptionsBase> {}\n\n/**\n * Class-based OpenAPI Fastify plugin that integrates with Navios plugin system.\n *\n * This plugin:\n * - Scans all registered modules for endpoints\n * - Generates an OpenAPI 3.1 document\n * - Serves the document as JSON and optionally YAML\n * - Provides Scalar UI for interactive documentation\n */\nexport class OpenApiFastifyPlugin implements NaviosPlugin<FastifyOpenApiPluginOptions> {\n readonly name = 'openapi-fastify'\n\n async register(\n context: PluginContext,\n options: FastifyOpenApiPluginOptions,\n ): Promise<void> {\n const fastify = context.server as FastifyInstance\n\n // Parse and validate options with defaults\n const parsedOptions = fastifyOpenApiPluginOptionsSchema.parse(options)\n\n // Get the generator service from the container\n const generator = await context.container.get(OpenApiGeneratorService)\n\n // Generate OpenAPI document from discovered endpoints\n const document = generator.generate(context.modules, options)\n\n // Apply global prefix to servers if not already set\n const documentWithServers = applyGlobalPrefix(\n document,\n context.globalPrefix,\n options,\n )\n\n // Register JSON endpoint\n const jsonPath = parsedOptions.jsonPath\n fastify.get(jsonPath, async (_request, reply) => {\n return reply.send(documentWithServers)\n })\n\n // Register YAML endpoint (disabled by default)\n if (!parsedOptions.disableYaml) {\n const yamlPath = parsedOptions.yamlPath\n fastify.get(yamlPath, async (_request, reply) => {\n reply.type('text/yaml')\n return reply.send(yamlStringify(documentWithServers))\n })\n }\n\n // Register Scalar UI (unless disabled)\n if (!parsedOptions.disableScalar) {\n const docsPath = parsedOptions.docsPath\n const scalarOptions = options.scalar ?? {}\n\n // Generate HTML document using @scalar/core\n const html = this.generateScalarHtml(jsonPath, scalarOptions)\n\n fastify.get(docsPath, async (_request, reply) => {\n reply.type('text/html')\n return reply.send(html)\n })\n }\n }\n\n /**\n * Generates the Scalar API Reference HTML document.\n *\n * @param specUrl - URL to the OpenAPI JSON specification\n * @param options - Scalar UI configuration options\n * @returns Complete HTML document string\n */\n private generateScalarHtml(specUrl: string, options: ScalarOptions): string {\n return getHtmlDocument({\n url: specUrl,\n theme: options.theme ?? 'default',\n favicon: options.favicon,\n customCss: options.customCss,\n hideDownloadButton: options.hideDownloadButton,\n hideSearch: options.hideSearch,\n metaData: options.metaData,\n cdn: options.cdn,\n pageTitle: options.metaData?.title ?? 'API Reference',\n })\n }\n}\n\n/**\n * Creates a plugin definition for the OpenAPI Fastify plugin.\n *\n * @param options - Plugin configuration options\n * @returns Plugin definition to pass to `app.usePlugin()`\n *\n * @example\n * ```typescript\n * import { NaviosFactory } from '@navios/core'\n * import { defineFastifyEnvironment } from '@navios/adapter-fastify'\n * import { defineOpenApiPlugin } from '@navios/openapi-fastify'\n *\n * const app = await NaviosFactory.create(AppModule, {\n * adapter: defineFastifyEnvironment(),\n * })\n *\n * app.usePlugin(defineOpenApiPlugin({\n * info: {\n * title: 'My API',\n * version: '1.0.0',\n * description: 'API documentation',\n * },\n * servers: [\n * { url: 'http://localhost:3000', description: 'Development' },\n * ],\n * securitySchemes: {\n * bearerAuth: {\n * type: 'http',\n * scheme: 'bearer',\n * bearerFormat: 'JWT',\n * },\n * },\n * scalar: {\n * theme: 'purple',\n * },\n * }))\n *\n * await app.listen({ port: 3000 })\n * // API docs available at http://localhost:3000/docs\n * ```\n */\nexport function defineOpenApiPlugin(\n options: FastifyOpenApiPluginOptions,\n): PluginDefinition<FastifyOpenApiPluginOptions> {\n return {\n plugin: new OpenApiFastifyPlugin(),\n options,\n }\n}\n\n// Re-export types for convenience\nexport type { ScalarOptions, ScalarTheme }\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.mjs","names":["z","scalarThemeSchema","enum","scalarMetaDataSchema","object","title","string","optional","description","ogDescription","ogTitle","ogImage","twitterCard","scalarOptionsSchema","theme","favicon","logo","hideDownloadButton","boolean","hideSearch","customCss","metaData","cdn","fastifyOpenApiPluginOptionsSchema","jsonPath","default","yamlPath","docsPath","scalar","disableScalar","disableYaml","applyGlobalPrefix","document","globalPrefix","options","servers","length","url","description","OpenApiGeneratorService","getHtmlDocument","stringify","yamlStringify","fastifyOpenApiPluginOptionsSchema","applyGlobalPrefix","OpenApiFastifyPlugin","name","register","context","options","fastify","adapter","getServer","globalPrefix","getGlobalPrefix","parsedOptions","parse","generator","container","get","document","generate","modules","documentWithServers","jsonPath","_request","reply","send","disableYaml","yamlPath","type","disableScalar","docsPath","scalarOptions","scalar","html","generateScalarHtml","specUrl","url","theme","favicon","customCss","hideDownloadButton","hideSearch","metaData","cdn","pageTitle","title","defineOpenApiPlugin","plugin"],"sources":["../src/schemas/openapi-fastify-options.schema.mts","../src/utils/apply-global-prefix.util.mts","../src/openapi-fastify.plugin.mts"],"sourcesContent":["import { z } from 'zod'\n\n/**\n * Zod schema for Scalar UI theme options\n */\nexport const scalarThemeSchema = z.enum([\n 'default',\n 'alternate',\n 'moon',\n 'purple',\n 'solarized',\n 'bluePlanet',\n 'saturn',\n 'kepler',\n 'mars',\n 'deepSpace',\n 'laserwave',\n 'elysiajs',\n 'fastify',\n 'none',\n])\n\n/**\n * Zod schema for Scalar UI metadata\n */\nexport const scalarMetaDataSchema = z\n .object({\n title: z.string().optional(),\n description: z.string().optional(),\n ogDescription: z.string().optional(),\n ogTitle: z.string().optional(),\n ogImage: z.string().optional(),\n twitterCard: z.string().optional(),\n })\n .optional()\n\n/**\n * Zod schema for Scalar UI configuration options\n */\nexport const scalarOptionsSchema = z.object({\n /**\n * Theme for Scalar UI\n * @default 'default'\n */\n theme: scalarThemeSchema.optional(),\n\n /**\n * Custom favicon URL\n */\n favicon: z.string().optional(),\n\n /**\n * Custom logo URL\n */\n logo: z.string().optional(),\n\n /**\n * Hide the \"Download OpenAPI Spec\" button\n * @default false\n */\n hideDownloadButton: z.boolean().optional(),\n\n /**\n * Hide the \"Search\" input\n * @default false\n */\n hideSearch: z.boolean().optional(),\n\n /**\n * Custom CSS to inject\n */\n customCss: z.string().optional(),\n\n /**\n * Meta data for the HTML page\n */\n metaData: scalarMetaDataSchema,\n\n /**\n * CDN URL for Scalar API Reference\n * @default 'https://cdn.jsdelivr.net/npm/@scalar/api-reference'\n */\n cdn: z.string().optional(),\n})\n\n/**\n * Zod schema for Fastify OpenAPI plugin options\n */\nexport const fastifyOpenApiPluginOptionsSchema = z.object({\n /**\n * Path to serve OpenAPI JSON\n * @default '/openapi.json'\n */\n jsonPath: z.string().optional().default('/openapi.json'),\n\n /**\n * Path to serve OpenAPI YAML\n * @default '/openapi.yaml'\n */\n yamlPath: z.string().optional().default('/openapi.yaml'),\n\n /**\n * Path to serve Scalar UI\n * @default '/docs'\n */\n docsPath: z.string().optional().default('/docs'),\n\n /**\n * Scalar UI configuration\n */\n scalar: scalarOptionsSchema.optional(),\n\n /**\n * Disable Scalar UI (only serve JSON/YAML)\n * @default false\n */\n disableScalar: z.boolean().optional().default(false),\n\n /**\n * Disable YAML endpoint\n * @default true\n */\n disableYaml: z.boolean().optional().default(true),\n})\n\nexport type ScalarTheme = z.infer<typeof scalarThemeSchema>\nexport type ScalarMetaData = z.infer<typeof scalarMetaDataSchema>\nexport type ScalarOptions = z.infer<typeof scalarOptionsSchema>\nexport type FastifyOpenApiPluginOptionsBase = z.infer<typeof fastifyOpenApiPluginOptionsSchema>\n","import type { OpenApiGeneratorOptions } from '@navios/openapi'\n\n/**\n * OpenAPI document shape (minimal interface for typing)\n */\nexport interface OpenAPIDocument {\n openapi: string\n info: {\n title: string\n version: string\n }\n paths?: Record<string, unknown>\n servers?: Array<{\n url: string\n description?: string\n }>\n}\n\n/**\n * Applies global prefix to OpenAPI servers if needed.\n *\n * @param document - The OpenAPI document to modify\n * @param globalPrefix - The global route prefix (e.g., '/api/v1')\n * @param options - Plugin options that may contain server configuration\n * @returns The document with servers array updated if applicable\n */\nexport function applyGlobalPrefix<T extends OpenAPIDocument>(\n document: T,\n globalPrefix: string,\n options: OpenApiGeneratorOptions,\n): T {\n // If servers are already defined, don't modify\n if (options.servers && options.servers.length > 0) {\n return document\n }\n\n // If no global prefix, return as-is\n if (!globalPrefix) {\n return document\n }\n\n // Add a default server with the global prefix\n return {\n ...document,\n servers: [\n {\n url: globalPrefix,\n description: 'API with global prefix',\n },\n ],\n }\n}\n","import type {\n NaviosPlugin,\n PluginContext,\n PluginDefinition,\n} from '@navios/core'\nimport type { OpenApiGeneratorOptions } from '@navios/openapi'\nimport type { FastifyReply, FastifyRequest } from 'fastify'\n\nimport type { FastifyApplicationServiceInterface } from '@navios/adapter-fastify'\n\nimport { OpenApiGeneratorService } from '@navios/openapi'\n\nimport { getHtmlDocument } from '@scalar/core/libs/html-rendering'\nimport { stringify as yamlStringify } from 'yaml'\n\nimport type {\n FastifyOpenApiPluginOptionsBase,\n ScalarOptions,\n ScalarTheme,\n} from './schemas/index.mjs'\n\nimport { fastifyOpenApiPluginOptionsSchema } from './schemas/index.mjs'\nimport { applyGlobalPrefix } from './utils/index.mjs'\n\n/**\n * Combined options for the Fastify OpenAPI plugin.\n * Extends OpenApiGeneratorOptions with Fastify-specific settings.\n */\nexport interface FastifyOpenApiPluginOptions\n extends OpenApiGeneratorOptions, Partial<FastifyOpenApiPluginOptionsBase> {}\n\n/**\n * Class-based OpenAPI Fastify plugin that integrates with Navios plugin system.\n *\n * This plugin:\n * - Scans all registered modules for endpoints\n * - Generates an OpenAPI 3.1 document\n * - Serves the document as JSON and optionally YAML\n * - Provides Scalar UI for interactive documentation\n */\nexport class OpenApiFastifyPlugin implements NaviosPlugin<FastifyOpenApiPluginOptions, FastifyApplicationServiceInterface> {\n readonly name = 'openapi-fastify'\n\n async register(\n context: PluginContext<FastifyApplicationServiceInterface>,\n options: FastifyOpenApiPluginOptions,\n ): Promise<void> {\n const fastify = context.adapter.getServer()\n const globalPrefix = context.adapter.getGlobalPrefix()\n\n // Parse and validate options with defaults\n const parsedOptions = fastifyOpenApiPluginOptionsSchema.parse(options)\n\n // Get the generator service from the container\n const generator = await context.container.get(OpenApiGeneratorService)\n\n // Generate OpenAPI document from discovered endpoints\n const document = generator.generate(context.modules, options)\n\n // Apply global prefix to servers if not already set\n const documentWithServers = applyGlobalPrefix(\n document,\n globalPrefix,\n options,\n )\n\n // Register JSON endpoint\n const jsonPath = parsedOptions.jsonPath\n fastify.get(jsonPath, async (_request: FastifyRequest, reply: FastifyReply) => {\n return reply.send(documentWithServers)\n })\n\n // Register YAML endpoint (disabled by default)\n if (!parsedOptions.disableYaml) {\n const yamlPath = parsedOptions.yamlPath\n fastify.get(yamlPath, async (_request: FastifyRequest, reply: FastifyReply) => {\n reply.type('text/yaml')\n return reply.send(yamlStringify(documentWithServers))\n })\n }\n\n // Register Scalar UI (unless disabled)\n if (!parsedOptions.disableScalar) {\n const docsPath = parsedOptions.docsPath\n const scalarOptions = options.scalar ?? {}\n\n // Generate HTML document using @scalar/core\n const html = this.generateScalarHtml(jsonPath, scalarOptions)\n\n fastify.get(docsPath, async (_request: FastifyRequest, reply: FastifyReply) => {\n reply.type('text/html')\n return reply.send(html)\n })\n }\n }\n\n /**\n * Generates the Scalar API Reference HTML document.\n *\n * @param specUrl - URL to the OpenAPI JSON specification\n * @param options - Scalar UI configuration options\n * @returns Complete HTML document string\n */\n private generateScalarHtml(specUrl: string, options: ScalarOptions): string {\n return getHtmlDocument({\n url: specUrl,\n theme: options.theme ?? 'default',\n favicon: options.favicon,\n customCss: options.customCss,\n hideDownloadButton: options.hideDownloadButton,\n hideSearch: options.hideSearch,\n metaData: options.metaData,\n cdn: options.cdn,\n pageTitle: options.metaData?.title ?? 'API Reference',\n })\n }\n}\n\n/**\n * Creates a plugin definition for the OpenAPI Fastify plugin.\n *\n * @param options - Plugin configuration options\n * @returns Plugin definition to pass to `app.usePlugin()`\n *\n * @example\n * ```typescript\n * import { NaviosFactory } from '@navios/core'\n * import { defineFastifyEnvironment } from '@navios/adapter-fastify'\n * import { defineOpenApiPlugin } from '@navios/openapi-fastify'\n *\n * const app = await NaviosFactory.create(AppModule, {\n * adapter: defineFastifyEnvironment(),\n * })\n *\n * app.usePlugin(defineOpenApiPlugin({\n * info: {\n * title: 'My API',\n * version: '1.0.0',\n * description: 'API documentation',\n * },\n * servers: [\n * { url: 'http://localhost:3000', description: 'Development' },\n * ],\n * securitySchemes: {\n * bearerAuth: {\n * type: 'http',\n * scheme: 'bearer',\n * bearerFormat: 'JWT',\n * },\n * },\n * scalar: {\n * theme: 'purple',\n * },\n * }))\n *\n * await app.listen({ port: 3000 })\n * // API docs available at http://localhost:3000/docs\n * ```\n */\nexport function defineOpenApiPlugin(\n options: FastifyOpenApiPluginOptions,\n): PluginDefinition<FastifyOpenApiPluginOptions> {\n return {\n plugin: new OpenApiFastifyPlugin(),\n options,\n }\n}\n\n// Re-export types for convenience\nexport type { ScalarOptions, ScalarTheme }\n"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@navios/openapi-fastify",
|
|
3
|
-
"version": "1.0.0-alpha.
|
|
3
|
+
"version": "1.0.0-alpha.4",
|
|
4
4
|
"author": {
|
|
5
5
|
"name": "Oleksandr Hanzha",
|
|
6
6
|
"email": "alex@granted.name"
|
|
@@ -12,9 +12,9 @@
|
|
|
12
12
|
},
|
|
13
13
|
"license": "MIT",
|
|
14
14
|
"peerDependencies": {
|
|
15
|
-
"@navios/adapter-fastify": "^1.0.0-alpha.
|
|
16
|
-
"@navios/core": "^1.0.0-alpha.
|
|
17
|
-
"@navios/openapi": "^1.0.0-alpha.
|
|
15
|
+
"@navios/adapter-fastify": "^1.0.0-alpha.4",
|
|
16
|
+
"@navios/core": "^1.0.0-alpha.4",
|
|
17
|
+
"@navios/openapi": "^1.0.0-alpha.4",
|
|
18
18
|
"fastify": "^5.0.0",
|
|
19
19
|
"zod": "^3.25.0 || ^4.0.0"
|
|
20
20
|
},
|
|
@@ -34,9 +34,9 @@
|
|
|
34
34
|
}
|
|
35
35
|
},
|
|
36
36
|
"devDependencies": {
|
|
37
|
-
"@navios/adapter-fastify": "^1.0.0-alpha.
|
|
38
|
-
"@navios/core": "^1.0.0-alpha.
|
|
39
|
-
"@navios/openapi": "^1.0.0-alpha.
|
|
37
|
+
"@navios/adapter-fastify": "^1.0.0-alpha.4",
|
|
38
|
+
"@navios/core": "^1.0.0-alpha.4",
|
|
39
|
+
"@navios/openapi": "^1.0.0-alpha.4",
|
|
40
40
|
"fastify": "^5.6.2",
|
|
41
41
|
"typescript": "^5.9.3",
|
|
42
42
|
"zod": "^4.2.1"
|
|
@@ -4,7 +4,9 @@ import type {
|
|
|
4
4
|
PluginDefinition,
|
|
5
5
|
} from '@navios/core'
|
|
6
6
|
import type { OpenApiGeneratorOptions } from '@navios/openapi'
|
|
7
|
-
import type {
|
|
7
|
+
import type { FastifyReply, FastifyRequest } from 'fastify'
|
|
8
|
+
|
|
9
|
+
import type { FastifyApplicationServiceInterface } from '@navios/adapter-fastify'
|
|
8
10
|
|
|
9
11
|
import { OpenApiGeneratorService } from '@navios/openapi'
|
|
10
12
|
|
|
@@ -36,14 +38,15 @@ export interface FastifyOpenApiPluginOptions
|
|
|
36
38
|
* - Serves the document as JSON and optionally YAML
|
|
37
39
|
* - Provides Scalar UI for interactive documentation
|
|
38
40
|
*/
|
|
39
|
-
export class OpenApiFastifyPlugin implements NaviosPlugin<FastifyOpenApiPluginOptions> {
|
|
41
|
+
export class OpenApiFastifyPlugin implements NaviosPlugin<FastifyOpenApiPluginOptions, FastifyApplicationServiceInterface> {
|
|
40
42
|
readonly name = 'openapi-fastify'
|
|
41
43
|
|
|
42
44
|
async register(
|
|
43
|
-
context: PluginContext
|
|
45
|
+
context: PluginContext<FastifyApplicationServiceInterface>,
|
|
44
46
|
options: FastifyOpenApiPluginOptions,
|
|
45
47
|
): Promise<void> {
|
|
46
|
-
const fastify = context.
|
|
48
|
+
const fastify = context.adapter.getServer()
|
|
49
|
+
const globalPrefix = context.adapter.getGlobalPrefix()
|
|
47
50
|
|
|
48
51
|
// Parse and validate options with defaults
|
|
49
52
|
const parsedOptions = fastifyOpenApiPluginOptionsSchema.parse(options)
|
|
@@ -57,20 +60,20 @@ export class OpenApiFastifyPlugin implements NaviosPlugin<FastifyOpenApiPluginOp
|
|
|
57
60
|
// Apply global prefix to servers if not already set
|
|
58
61
|
const documentWithServers = applyGlobalPrefix(
|
|
59
62
|
document,
|
|
60
|
-
|
|
63
|
+
globalPrefix,
|
|
61
64
|
options,
|
|
62
65
|
)
|
|
63
66
|
|
|
64
67
|
// Register JSON endpoint
|
|
65
68
|
const jsonPath = parsedOptions.jsonPath
|
|
66
|
-
fastify.get(jsonPath, async (_request, reply) => {
|
|
69
|
+
fastify.get(jsonPath, async (_request: FastifyRequest, reply: FastifyReply) => {
|
|
67
70
|
return reply.send(documentWithServers)
|
|
68
71
|
})
|
|
69
72
|
|
|
70
73
|
// Register YAML endpoint (disabled by default)
|
|
71
74
|
if (!parsedOptions.disableYaml) {
|
|
72
75
|
const yamlPath = parsedOptions.yamlPath
|
|
73
|
-
fastify.get(yamlPath, async (_request, reply) => {
|
|
76
|
+
fastify.get(yamlPath, async (_request: FastifyRequest, reply: FastifyReply) => {
|
|
74
77
|
reply.type('text/yaml')
|
|
75
78
|
return reply.send(yamlStringify(documentWithServers))
|
|
76
79
|
})
|
|
@@ -84,7 +87,7 @@ export class OpenApiFastifyPlugin implements NaviosPlugin<FastifyOpenApiPluginOp
|
|
|
84
87
|
// Generate HTML document using @scalar/core
|
|
85
88
|
const html = this.generateScalarHtml(jsonPath, scalarOptions)
|
|
86
89
|
|
|
87
|
-
fastify.get(docsPath, async (_request, reply) => {
|
|
90
|
+
fastify.get(docsPath, async (_request: FastifyRequest, reply: FastifyReply) => {
|
|
88
91
|
reply.type('text/html')
|
|
89
92
|
return reply.send(html)
|
|
90
93
|
})
|