From 2275d3451eb59150589d1a0d93e9523136be8ac1 Mon Sep 17 00:00:00 2001 From: saltyaom Date: Tue, 22 Nov 2022 18:05:55 +0700 Subject: [PATCH] :tada: feat: exp.51 just right slow --- CHANGELOG.md | 4 ++ README.md | 8 +-- bun.lockb | Bin 46439 -> 46080 bytes package.json | 10 +-- src/index.ts | 151 +++++++++++++++++++++++---------------------- test/index.test.ts | 10 +-- 6 files changed, 96 insertions(+), 87 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index a88774d..1de1ad5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,7 @@ +# 0.0.0-experimental.2 - 22 Nov 2022 +Change: +- Support for KingWorld 0.0.0-experimental.51 + # 0.0.0-experimental.1 - 12 Nov 2022 Improvement: - Auto infers path params if schema is presented diff --git a/README.md b/README.md index e4add1c..c276db9 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,5 @@ # @kingworldjs/swagger -A plugin for [kingworld](https://github.com/saltyaom/kingworld) that auto-generate Swagger page. +A plugin for [kingworld](https://github.com/saltyaom/kingworld) to auto-generate Swagger page. ## Installation ```bash @@ -8,8 +8,8 @@ bun add @kingworldjs/swagger ## Example ```typescript -import KingWorld from 'kingworld' -import swagger from '@kingworldjs/swagger' +import { KingWorld } from 'kingworld' +import { swagger } from '@kingworldjs/swagger' const app = new KingWorld() .use(swagger) @@ -67,4 +67,4 @@ Determine if Swagger should exclude static files. ## exclude @default [] -Paths to exclude from Swagger endpoint +Paths to exclude from the Swagger endpoint diff --git a/bun.lockb b/bun.lockb index 0e255c587331ca94bd3e33a1e52f8c4b7234d307..0d9bdeaadeaf558771543e61cca4c97616768499 100755 GIT binary patch delta 7029 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 diff --git a/package.json b/package.json index 5dbc5b5..9224c26 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "@kingworldjs/swagger", - "version": "0.0.0-experimental.1", - "description": "A plugin for kingworld that auto-generate Swagger page", + "version": "0.0.0-experimental.2", + "description": "A plugin for kingworld to auto-generate Swagger page", "author": { "name": "saltyAom", "url": "https://github.com/SaltyAom", @@ -32,7 +32,7 @@ "release": "npm run build && npm run test && npm publish --access public" }, "peerDependencies": { - "kingworld": ">= 0.0.0-experimental.41" + "kingworld": ">= 0.0.0-experimental.51" }, "devDependencies": { "@swc/cli": "^0.1.57", @@ -41,13 +41,13 @@ "@types/swagger-ui-dist": "^3.30.1", "bun-types": "^0.2.2", "eslint": "^8.26.0", - "kingworld": "^0.0.0-experimental.41", + "kingworld": "^0.0.0-experimental.51", "nodemon": "^2.0.20", "openapi-types": "^12.0.2", "typescript": "^4.8.4" }, "dependencies": { - "@kingworldjs/static": "0.0.0-experimental.1", + "@kingworldjs/static": "0.0.0-experimental.2", "swagger-ui-dist": "^4.15.5" } } diff --git a/src/index.ts b/src/index.ts index e14fac0..5084d7a 100644 --- a/src/index.ts +++ b/src/index.ts @@ -81,54 +81,55 @@ const filterPaths = ( * * @see https://github.com/saltyaom/kingworld-swagger */ -export const swagger = ( - app: KingWorld, - { - swagger = {}, - excludeStaticFile = true, - path = '/swagger', - exclude = [] - }: { - /** - * Customize Swagger config, refers to Swagger 2.0 config - * - * @see https://swagger.io/specification/v2/ - */ - swagger?: Partial - /** - * Determine if Swagger should exclude static files. - * - * @default true - */ - excludeStaticFile?: boolean - /** - * The endpoint to expose Swagger - * - * @default '/swagger' - */ - path?: string - /** - * Paths to exclude from Swagger endpoint - * - * @default [] - */ - exclude?: string | RegExp | (string | RegExp)[] - } = { - swagger: {}, - excludeStaticFile: true, - path: '/swagger', - exclude: [] - } -) => - app - .get(path, (context) => { - context.set.redirect = `${path}/static/index.html` - }) - .get( - `${path}/static/swagger-initializer.js`, - ({ store }) => - new Response( - `window.onload = function() { +export const swagger = + ( + { + swagger = {}, + excludeStaticFile = true, + path = '/swagger', + exclude = [] + }: { + /** + * Customize Swagger config, refers to Swagger 2.0 config + * + * @see https://swagger.io/specification/v2/ + */ + swagger?: Partial + /** + * Determine if Swagger should exclude static files. + * + * @default true + */ + excludeStaticFile?: boolean + /** + * The endpoint to expose Swagger + * + * @default '/swagger' + */ + path?: string + /** + * Paths to exclude from Swagger endpoint + * + * @default [] + */ + exclude?: string | RegExp | (string | RegExp)[] + } = { + swagger: {}, + excludeStaticFile: true, + path: '/swagger', + exclude: [] + } + ) => + (app: KingWorld) => + app + .get(path, (context) => { + context.set.redirect = `${path}/static/index.html` + }) + .get( + `${path}/static/swagger-initializer.js`, + ({ store }) => + new Response( + `window.onload = function() { window.ui = SwaggerUIBundle({ url: "${path}/json", dom_id: '#swagger-ui', @@ -143,33 +144,35 @@ export const swagger = ( layout: "StandaloneLayout" }); };`, - { - headers: { - 'content-type': 'text/javascript;charset=utf-8' + { + headers: { + 'content-type': 'text/javascript;charset=utf-8' + } } + ) + ) + .get(`${path}/json`, (context) => ({ + ...{ + ...defaultConfig, + ...swagger, + info: { + title: 'KingWorld Documentation', + description: 'Developement documentation', + version: '0.0.0', + ...swagger.info } - ) - ) - .get(`${path}/json`, (context) => ({ - ...{ - ...defaultConfig, - ...swagger, - info: { - title: 'KingWorld Documentation', - description: 'Developement documentation', - version: '0.0.0', - ...swagger.info - } - }, - // @ts-ignore - paths: filterPaths(context.store[SCHEMA], { - excludeStaticFile, - exclude: Array.isArray(exclude) ? exclude : [exclude] - }) - })) - .use(staticPlugin, { - prefix: `${path}/static`, - path: getAbsoluteFSPath() - }) + }, + // @ts-ignore + paths: filterPaths(context.store[SCHEMA], { + excludeStaticFile, + exclude: Array.isArray(exclude) ? exclude : [exclude] + }) + })) + .use( + staticPlugin({ + prefix: `${path}/static`, + path: getAbsoluteFSPath() + }) + ) export default swagger diff --git a/test/index.test.ts b/test/index.test.ts index ca10729..dc707be 100644 --- a/test/index.test.ts +++ b/test/index.test.ts @@ -8,16 +8,18 @@ const req = (path: string) => new Request(path) describe('Swagger', () => { it('redirect to Swagger page', async () => { - const app = new KingWorld().use(swagger) + const app = new KingWorld().use(swagger()) const res = await app.handle(req('/swagger')) expect(res.status).toBe(302) }) it('use custom path', async () => { - const app = new KingWorld().use(swagger, { - path: '/v2/swagger' - }) + const app = new KingWorld().use( + swagger({ + path: '/v2/swagger' + }) + ) const res = await app.handle(req('/v2/swagger')) expect(res.status).toBe(302)