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.
Files changed (44) hide show
  1. package/README.md +7 -8
  2. package/dist/analysis/openapi-analyzer.d.ts +0 -4
  3. package/dist/cli.cjs +1 -1
  4. package/dist/cli.js +1 -1
  5. package/dist/context.d.ts +3 -3
  6. package/dist/index.cjs +38 -39
  7. package/dist/index.cjs.map +1 -1
  8. package/dist/index.js +38 -39
  9. package/dist/index.js.map +1 -1
  10. package/dist/{openapi-analyzer-BtIaHIfe.js → openapi-analyzer-D7y6Qa38.js} +31 -34
  11. package/dist/openapi-analyzer-D7y6Qa38.js.map +1 -0
  12. package/dist/{openapi-analyzer-D9YB3IkV.cjs → openapi-analyzer-z-7AoFRC.cjs} +31 -34
  13. package/dist/openapi-analyzer-z-7AoFRC.cjs.map +1 -0
  14. package/dist/plugins/scalar.d.ts +2 -2
  15. package/dist/server-adapter-BWrEJbKL.js.map +1 -1
  16. package/dist/server-adapter-fVKP60e0.cjs.map +1 -1
  17. package/dist/shokupan.d.ts +6 -5
  18. package/dist/types.d.ts +2 -1
  19. package/package.json +1 -1
  20. package/dist/benchmarking/advanced-cases/elysia.d.ts +0 -1
  21. package/dist/benchmarking/advanced-cases/express.d.ts +0 -1
  22. package/dist/benchmarking/advanced-cases/fastify.d.ts +0 -1
  23. package/dist/benchmarking/advanced-cases/hapi.d.ts +0 -1
  24. package/dist/benchmarking/advanced-cases/hono.d.ts +0 -1
  25. package/dist/benchmarking/advanced-cases/koa.d.ts +0 -1
  26. package/dist/benchmarking/advanced-cases/nest.d.ts +0 -1
  27. package/dist/benchmarking/advanced-cases/shokupan.d.ts +0 -1
  28. package/dist/benchmarking/advanced-data.d.ts +0 -33
  29. package/dist/benchmarking/advanced-runner.d.ts +0 -1
  30. package/dist/benchmarking/advanced-worker.d.ts +0 -0
  31. package/dist/benchmarking/cases/elysia.d.ts +0 -1
  32. package/dist/benchmarking/cases/express.d.ts +0 -1
  33. package/dist/benchmarking/cases/fastify.d.ts +0 -1
  34. package/dist/benchmarking/cases/hapi.d.ts +0 -1
  35. package/dist/benchmarking/cases/hono.d.ts +0 -1
  36. package/dist/benchmarking/cases/koa.d.ts +0 -1
  37. package/dist/benchmarking/cases/nest.d.ts +0 -1
  38. package/dist/benchmarking/cases/shokupan.d.ts +0 -1
  39. package/dist/benchmarking/data.d.ts +0 -15
  40. package/dist/benchmarking/quick_bench.d.ts +0 -1
  41. package/dist/benchmarking/runner.d.ts +0 -1
  42. package/dist/benchmarking/worker.d.ts +0 -0
  43. package/dist/openapi-analyzer-BtIaHIfe.js.map +0 -1
  44. 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-BtIaHIfe.js";
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-BtIaHIfe.js");
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
- try {
2075
- const timestamp = Date.now();
2076
- const key = `${timestamp}-${handler.name || "anonymous"}-${Math.random().toString(36).substring(7)}`;
2077
- await datastore.set("middleware_tracking", key, {
2078
- name: handler.name || "anonymous",
2079
- path: ctx.path,
2080
- timestamp,
2081
- duration,
2082
- file,
2083
- line,
2084
- error: error ? String(error) : void 0,
2085
- metadata: {
2086
- isBuiltin: handler.isBuiltin,
2087
- pluginName: handler.pluginName
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
- const ttl = config.middlewareTrackingTTL ?? 864e5;
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
- } catch (datastoreError) {
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://${server.hostname}:${server.port}`);
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?.applicationConfig.hooks?.beforeValidate) {
3261
- await ctx.app.applicationConfig.hooks.beforeValidate(ctx, dataToValidate);
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?.applicationConfig.hooks?.afterValidate) {
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.applicationConfig.hooks.afterValidate(ctx, validatedData);
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) {