shokupan 0.4.4 → 0.5.0
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/README.md +7 -8
- package/dist/analysis/openapi-analyzer.d.ts +0 -4
- package/dist/cli.cjs +1 -1
- package/dist/cli.js +1 -1
- package/dist/context.d.ts +3 -3
- package/dist/index.cjs +38 -39
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +38 -39
- package/dist/index.js.map +1 -1
- package/dist/{openapi-analyzer-BtIaHIfe.js → openapi-analyzer-D7y6Qa38.js} +31 -34
- package/dist/openapi-analyzer-D7y6Qa38.js.map +1 -0
- package/dist/{openapi-analyzer-D9YB3IkV.cjs → openapi-analyzer-z-7AoFRC.cjs} +31 -34
- package/dist/openapi-analyzer-z-7AoFRC.cjs.map +1 -0
- package/dist/plugins/scalar.d.ts +2 -2
- package/dist/server-adapter-BWrEJbKL.js.map +1 -1
- package/dist/server-adapter-fVKP60e0.cjs.map +1 -1
- package/dist/shokupan.d.ts +6 -5
- package/dist/types.d.ts +2 -1
- package/package.json +1 -1
- package/dist/benchmarking/advanced-cases/elysia.d.ts +0 -1
- package/dist/benchmarking/advanced-cases/express.d.ts +0 -1
- package/dist/benchmarking/advanced-cases/fastify.d.ts +0 -1
- package/dist/benchmarking/advanced-cases/hapi.d.ts +0 -1
- package/dist/benchmarking/advanced-cases/hono.d.ts +0 -1
- package/dist/benchmarking/advanced-cases/koa.d.ts +0 -1
- package/dist/benchmarking/advanced-cases/nest.d.ts +0 -1
- package/dist/benchmarking/advanced-cases/shokupan.d.ts +0 -1
- package/dist/benchmarking/advanced-data.d.ts +0 -33
- package/dist/benchmarking/advanced-runner.d.ts +0 -1
- package/dist/benchmarking/advanced-worker.d.ts +0 -0
- package/dist/benchmarking/cases/elysia.d.ts +0 -1
- package/dist/benchmarking/cases/express.d.ts +0 -1
- package/dist/benchmarking/cases/fastify.d.ts +0 -1
- package/dist/benchmarking/cases/hapi.d.ts +0 -1
- package/dist/benchmarking/cases/hono.d.ts +0 -1
- package/dist/benchmarking/cases/koa.d.ts +0 -1
- package/dist/benchmarking/cases/nest.d.ts +0 -1
- package/dist/benchmarking/cases/shokupan.d.ts +0 -1
- package/dist/benchmarking/data.d.ts +0 -15
- package/dist/benchmarking/quick_bench.d.ts +0 -1
- package/dist/benchmarking/runner.d.ts +0 -1
- package/dist/benchmarking/worker.d.ts +0 -0
- package/dist/openapi-analyzer-BtIaHIfe.js.map +0 -1
- package/dist/openapi-analyzer-D9YB3IkV.cjs.map +0 -1
package/dist/index.js
CHANGED
|
@@ -14,7 +14,7 @@ import Ajv from "ajv";
|
|
|
14
14
|
import addFormats from "ajv-formats";
|
|
15
15
|
import { plainToInstance } from "class-transformer";
|
|
16
16
|
import { validateOrReject } from "class-validator";
|
|
17
|
-
import { OpenAPIAnalyzer } from "./openapi-analyzer-
|
|
17
|
+
import { OpenAPIAnalyzer } from "./openapi-analyzer-D7y6Qa38.js";
|
|
18
18
|
import { randomUUID, createHmac } from "crypto";
|
|
19
19
|
import { EventEmitter } from "events";
|
|
20
20
|
class ShokupanResponse {
|
|
@@ -858,7 +858,7 @@ async function generateOpenApi(rootRouter, options = {}) {
|
|
|
858
858
|
const defaultTagName = options.defaultTag || "Application";
|
|
859
859
|
let astRoutes = [];
|
|
860
860
|
try {
|
|
861
|
-
const { OpenAPIAnalyzer: OpenAPIAnalyzer2 } = await import("./openapi-analyzer-
|
|
861
|
+
const { OpenAPIAnalyzer: OpenAPIAnalyzer2 } = await import("./openapi-analyzer-D7y6Qa38.js");
|
|
862
862
|
const analyzer = new OpenAPIAnalyzer2(process.cwd());
|
|
863
863
|
const { applications } = await analyzer.analyze();
|
|
864
864
|
const appMap = /* @__PURE__ */ new Map();
|
|
@@ -2071,34 +2071,36 @@ class ShokupanRouter {
|
|
|
2071
2071
|
if (ctx.app?.applicationConfig.enableMiddlewareTracking) {
|
|
2072
2072
|
const duration = performance.now() - startTime;
|
|
2073
2073
|
const config = ctx.app.applicationConfig;
|
|
2074
|
-
|
|
2075
|
-
|
|
2076
|
-
|
|
2077
|
-
|
|
2078
|
-
|
|
2079
|
-
|
|
2080
|
-
|
|
2081
|
-
|
|
2082
|
-
|
|
2083
|
-
|
|
2084
|
-
|
|
2085
|
-
|
|
2086
|
-
|
|
2087
|
-
|
|
2074
|
+
Promise.resolve().then(async () => {
|
|
2075
|
+
try {
|
|
2076
|
+
const timestamp = Date.now();
|
|
2077
|
+
const key = `${timestamp}-${handler.name || "anonymous"}-${Math.random().toString(36).substring(7)}`;
|
|
2078
|
+
await datastore.set("middleware_tracking", key, {
|
|
2079
|
+
name: handler.name || "anonymous",
|
|
2080
|
+
path: ctx.path,
|
|
2081
|
+
timestamp,
|
|
2082
|
+
duration,
|
|
2083
|
+
file,
|
|
2084
|
+
line,
|
|
2085
|
+
error: error ? String(error) : void 0,
|
|
2086
|
+
metadata: {
|
|
2087
|
+
isBuiltin: handler.isBuiltin,
|
|
2088
|
+
pluginName: handler.pluginName
|
|
2089
|
+
}
|
|
2090
|
+
});
|
|
2091
|
+
const ttl = config.middlewareTrackingTTL ?? 864e5;
|
|
2092
|
+
const maxCapacity = config.middlewareTrackingMaxCapacity ?? 1e4;
|
|
2093
|
+
const cutoff = Date.now() - ttl;
|
|
2094
|
+
await datastore.query(`DELETE middleware_tracking WHERE timestamp < ${cutoff}`);
|
|
2095
|
+
const results = await datastore.query("SELECT count() FROM middleware_tracking GROUP ALL");
|
|
2096
|
+
if (results && results[0] && results[0].count > maxCapacity) {
|
|
2097
|
+
const toDelete = results[0].count - maxCapacity;
|
|
2098
|
+
await datastore.query(`DELETE middleware_tracking ORDER BY timestamp ASC LIMIT ${toDelete}`);
|
|
2088
2099
|
}
|
|
2089
|
-
})
|
|
2090
|
-
|
|
2091
|
-
const maxCapacity = config.middlewareTrackingMaxCapacity ?? 1e4;
|
|
2092
|
-
const cutoff = Date.now() - ttl;
|
|
2093
|
-
await datastore.query(`DELETE middleware_tracking WHERE timestamp < ${cutoff}`);
|
|
2094
|
-
const results = await datastore.query("SELECT count() FROM middleware_tracking GROUP ALL");
|
|
2095
|
-
if (results && results[0] && results[0].count > maxCapacity) {
|
|
2096
|
-
const toDelete = results[0].count - maxCapacity;
|
|
2097
|
-
await datastore.query(`DELETE middleware_tracking ORDER BY timestamp ASC LIMIT ${toDelete}`);
|
|
2100
|
+
} catch (datastoreError) {
|
|
2101
|
+
console.error("Failed to store middleware tracking:", datastoreError);
|
|
2098
2102
|
}
|
|
2099
|
-
}
|
|
2100
|
-
console.error("Failed to store middleware tracking:", datastoreError);
|
|
2101
|
-
}
|
|
2103
|
+
});
|
|
2102
2104
|
}
|
|
2103
2105
|
}
|
|
2104
2106
|
};
|
|
@@ -2451,7 +2453,7 @@ class Shokupan extends ShokupanRouter {
|
|
|
2451
2453
|
factory = createHttpServer();
|
|
2452
2454
|
}
|
|
2453
2455
|
const server = factory ? await factory(serveOptions) : Bun.serve(serveOptions);
|
|
2454
|
-
console.log(`Shokupan server listening on http://${
|
|
2456
|
+
console.log(`Shokupan server listening on http://${serveOptions.hostname}:${serveOptions.port}`);
|
|
2455
2457
|
return server;
|
|
2456
2458
|
}
|
|
2457
2459
|
[$dispatch](req) {
|
|
@@ -3257,8 +3259,8 @@ function validate(config) {
|
|
|
3257
3259
|
body = await safelyGetBody(ctx);
|
|
3258
3260
|
dataToValidate.body = body;
|
|
3259
3261
|
}
|
|
3260
|
-
if (ctx.app?.
|
|
3261
|
-
await ctx.app.
|
|
3262
|
+
if (ctx.app?.hasHook("beforeValidate")) {
|
|
3263
|
+
await ctx.app.executeHook("beforeValidate", ctx, dataToValidate);
|
|
3262
3264
|
}
|
|
3263
3265
|
if (validators.params) {
|
|
3264
3266
|
ctx.params = await validators.params(ctx.params);
|
|
@@ -3283,12 +3285,12 @@ function validate(config) {
|
|
|
3283
3285
|
});
|
|
3284
3286
|
ctx.body = validBody;
|
|
3285
3287
|
}
|
|
3286
|
-
if (ctx.app?.
|
|
3288
|
+
if (ctx.app?.hasHook("afterValidate")) {
|
|
3287
3289
|
const validatedData = { ...dataToValidate };
|
|
3288
3290
|
if (config.params) validatedData.params = ctx.params;
|
|
3289
3291
|
if (config.query) validatedData.query = validQuery;
|
|
3290
3292
|
if (config.body) validatedData.body = validBody;
|
|
3291
|
-
await ctx.app
|
|
3293
|
+
await ctx.app?.executeHook("afterValidate", ctx, validatedData);
|
|
3292
3294
|
}
|
|
3293
3295
|
return next();
|
|
3294
3296
|
};
|
|
@@ -3452,7 +3454,8 @@ function enableOpenApiValidation(app) {
|
|
|
3452
3454
|
}
|
|
3453
3455
|
const eta = new Eta();
|
|
3454
3456
|
class ScalarPlugin extends ShokupanRouter {
|
|
3455
|
-
constructor(pluginOptions) {
|
|
3457
|
+
constructor(pluginOptions = {}) {
|
|
3458
|
+
pluginOptions.config ??= {};
|
|
3456
3459
|
super();
|
|
3457
3460
|
this.pluginOptions = pluginOptions;
|
|
3458
3461
|
this.init();
|
|
@@ -3471,8 +3474,7 @@ class ScalarPlugin extends ShokupanRouter {
|
|
|
3471
3474
|
|
|
3472
3475
|
<body>
|
|
3473
3476
|
<div id="app"></div>
|
|
3474
|
-
|
|
3475
|
-
<script src="<%= it.path %>scalar.js"><\/script>
|
|
3477
|
+
<script src="https://cdn.jsdelivr.net/npm/@scalar/api-reference"><\/script>
|
|
3476
3478
|
<script>
|
|
3477
3479
|
Scalar.createApiReference('#app', [{ ...<%~ JSON.stringify(it.config.baseDocument) %>,
|
|
3478
3480
|
url: "<%= it.path %>openapi.json",
|
|
@@ -3483,9 +3485,6 @@ class ScalarPlugin extends ShokupanRouter {
|
|
|
3483
3485
|
|
|
3484
3486
|
</html>`, { path, config: this.pluginOptions }));
|
|
3485
3487
|
});
|
|
3486
|
-
this.get("/scalar.js", (ctx) => {
|
|
3487
|
-
return ctx.file(__dirname + "/../../node_modules/@scalar/api-reference/dist/browser/standalone.js");
|
|
3488
|
-
});
|
|
3489
3488
|
this.get("/openapi.json", async (ctx) => {
|
|
3490
3489
|
let spec;
|
|
3491
3490
|
if (this.root.openApiSpec) {
|