shokupan 0.4.5 → 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 +1 -1
- 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 +36 -38
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +36 -38
- 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/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
|
};
|
|
@@ -3472,8 +3474,7 @@ class ScalarPlugin extends ShokupanRouter {
|
|
|
3472
3474
|
|
|
3473
3475
|
<body>
|
|
3474
3476
|
<div id="app"></div>
|
|
3475
|
-
|
|
3476
|
-
<script src="<%= it.path %>scalar.js"><\/script>
|
|
3477
|
+
<script src="https://cdn.jsdelivr.net/npm/@scalar/api-reference"><\/script>
|
|
3477
3478
|
<script>
|
|
3478
3479
|
Scalar.createApiReference('#app', [{ ...<%~ JSON.stringify(it.config.baseDocument) %>,
|
|
3479
3480
|
url: "<%= it.path %>openapi.json",
|
|
@@ -3484,9 +3485,6 @@ class ScalarPlugin extends ShokupanRouter {
|
|
|
3484
3485
|
|
|
3485
3486
|
</html>`, { path, config: this.pluginOptions }));
|
|
3486
3487
|
});
|
|
3487
|
-
this.get("/scalar.js", (ctx) => {
|
|
3488
|
-
return ctx.file(__dirname + "/../../node_modules/@scalar/api-reference/dist/browser/standalone.js");
|
|
3489
|
-
});
|
|
3490
3488
|
this.get("/openapi.json", async (ctx) => {
|
|
3491
3489
|
let spec;
|
|
3492
3490
|
if (this.root.openApiSpec) {
|