From 9ac5fa03c60df0b717bdbb75d6857e234ced474b Mon Sep 17 00:00:00 2001 From: dswbx Date: Thu, 14 Aug 2025 10:05:15 +0200 Subject: [PATCH] optimized performance --- app/__test__/app/mcp/mcp.auth.test.ts | 6 ++--- app/__test__/app/mcp/mcp.base.test.ts | 9 ++++--- app/__test__/app/mcp/mcp.data.test.ts | 7 +++--- app/__test__/app/mcp/mcp.media.test.ts | 5 ++-- app/__test__/app/mcp/mcp.server.test.ts | 26 ++++++++++++++------- app/__test__/app/mcp/mcp.system.test.ts | 8 +++---- app/__test__/data/specs/Entity.spec.ts | 4 ---- app/__test__/debug/jsonv-resolution.test.ts | 24 +++++++++++++++++++ app/__test__/helper.ts | 2 +- app/__test__/modules/module-test-suite.ts | 3 +-- app/build.cli.ts | 23 ++++++++++++++++-- app/build.ts | 2 ++ app/package.json | 2 +- app/src/App.ts | 9 +++++-- app/src/cli/commands/mcp/mcp.ts | 3 +-- app/src/core/object/SchemaObject.ts | 2 +- app/src/core/test/utils.ts | 15 ++++++------ app/src/core/utils/file.ts | 4 ++-- app/src/core/utils/index.ts | 1 + app/src/core/utils/schema/index.ts | 1 + app/src/core/utils/schema/secret.ts | 6 ++--- app/src/index.ts | 1 + app/src/modules/Module.ts | 3 +-- app/src/modules/ModuleManager.ts | 12 ++++++++-- app/src/modules/mcp/system-mcp.ts | 7 ++---- app/src/modules/server/SystemController.ts | 9 ++++--- app/vite.dev.ts | 2 +- bun.lock | 4 ++-- 28 files changed, 134 insertions(+), 66 deletions(-) create mode 100644 app/__test__/debug/jsonv-resolution.test.ts diff --git a/app/__test__/app/mcp/mcp.auth.test.ts b/app/__test__/app/mcp/mcp.auth.test.ts index 9213b90..ea02274 100644 --- a/app/__test__/app/mcp/mcp.auth.test.ts +++ b/app/__test__/app/mcp/mcp.auth.test.ts @@ -1,7 +1,7 @@ import { describe, test, expect, beforeEach, beforeAll, afterAll } from "bun:test"; import { type App, createApp, createMcpToolCaller } from "core/test/utils"; -import { getSystemMcp } from "modules/mcp/system-mcp"; import { disableConsoleLog, enableConsoleLog } from "core/utils"; +import type { McpServer } from "bknd/utils"; beforeAll(disableConsoleLog); afterAll(enableConsoleLog); @@ -26,7 +26,7 @@ afterAll(enableConsoleLog); */ describe("mcp auth", async () => { let app: App; - let server: ReturnType; + let server: McpServer; beforeEach(async () => { app = createApp({ initialConfig: { @@ -44,7 +44,7 @@ describe("mcp auth", async () => { }, }); await app.build(); - server = getSystemMcp(app); + server = app.mcp!; server.setLogLevel("error"); server.onNotification((message) => { console.dir(message, { depth: null }); diff --git a/app/__test__/app/mcp/mcp.base.test.ts b/app/__test__/app/mcp/mcp.base.test.ts index 34816e9..df8bdeb 100644 --- a/app/__test__/app/mcp/mcp.base.test.ts +++ b/app/__test__/app/mcp/mcp.base.test.ts @@ -1,6 +1,5 @@ import { describe, it, expect } from "bun:test"; import { createApp } from "core/test/utils"; -import { getSystemMcp } from "modules/mcp/system-mcp"; import { registries } from "index"; import { StorageLocalAdapter } from "adapter/node/storage/StorageLocalAdapter"; @@ -22,11 +21,15 @@ describe("mcp", () => { }, }, }, + server: { + mcp: { + enabled: true, + }, + }, }, }); await app.build(); - const server = getSystemMcp(app); - expect(server.tools.length).toBeGreaterThan(0); + expect(app.mcp?.tools.length).toBeGreaterThan(0); }); }); diff --git a/app/__test__/app/mcp/mcp.data.test.ts b/app/__test__/app/mcp/mcp.data.test.ts index a29c764..69b5106 100644 --- a/app/__test__/app/mcp/mcp.data.test.ts +++ b/app/__test__/app/mcp/mcp.data.test.ts @@ -1,7 +1,7 @@ import { describe, test, expect, beforeEach, beforeAll, afterAll } from "bun:test"; import { type App, createApp, createMcpToolCaller } from "core/test/utils"; import { getSystemMcp } from "modules/mcp/system-mcp"; -import { pickKeys } from "bknd/utils"; +import { pickKeys, type McpServer } from "bknd/utils"; import { entity, text } from "bknd"; import { disableConsoleLog, enableConsoleLog } from "core/utils"; @@ -37,8 +37,9 @@ afterAll(enableConsoleLog); */ describe("mcp data", async () => { let app: App; - let server: ReturnType; + let server: McpServer; beforeEach(async () => { + const time = performance.now(); app = createApp({ initialConfig: { server: { @@ -49,7 +50,7 @@ describe("mcp data", async () => { }, }); await app.build(); - server = getSystemMcp(app); + server = app.mcp!; server.setLogLevel("error"); server.onNotification((message) => { console.dir(message, { depth: null }); diff --git a/app/__test__/app/mcp/mcp.media.test.ts b/app/__test__/app/mcp/mcp.media.test.ts index 4300ac8..c10e8bb 100644 --- a/app/__test__/app/mcp/mcp.media.test.ts +++ b/app/__test__/app/mcp/mcp.media.test.ts @@ -4,6 +4,7 @@ import { getSystemMcp } from "modules/mcp/system-mcp"; import { registries } from "index"; import { StorageLocalAdapter } from "adapter/node/storage/StorageLocalAdapter"; import { disableConsoleLog, enableConsoleLog } from "core/utils"; +import type { McpServer } from "bknd/utils"; beforeAll(disableConsoleLog); afterAll(enableConsoleLog); @@ -16,7 +17,7 @@ afterAll(enableConsoleLog); */ describe("mcp media", async () => { let app: App; - let server: ReturnType; + let server: McpServer; beforeEach(async () => { registries.media.register("local", StorageLocalAdapter); app = createApp({ @@ -38,7 +39,7 @@ describe("mcp media", async () => { }, }); await app.build(); - server = getSystemMcp(app); + server = app.mcp!; server.setLogLevel("error"); server.onNotification((message) => { console.dir(message, { depth: null }); diff --git a/app/__test__/app/mcp/mcp.server.test.ts b/app/__test__/app/mcp/mcp.server.test.ts index 29113fd..3ada557 100644 --- a/app/__test__/app/mcp/mcp.server.test.ts +++ b/app/__test__/app/mcp/mcp.server.test.ts @@ -1,6 +1,6 @@ -import { describe, test, expect, beforeAll, mock } from "bun:test"; +import { describe, test, expect, beforeAll, mock, beforeEach, afterAll } from "bun:test"; import { type App, createApp, createMcpToolCaller } from "core/test/utils"; -import { getSystemMcp } from "modules/mcp/system-mcp"; +import type { McpServer } from "bknd/utils"; /** * - [x] config_server_get @@ -8,7 +8,7 @@ import { getSystemMcp } from "modules/mcp/system-mcp"; */ describe("mcp system", async () => { let app: App; - let server: ReturnType; + let server: McpServer; beforeAll(async () => { app = createApp({ initialConfig: { @@ -20,23 +20,33 @@ describe("mcp system", async () => { }, }); await app.build(); - server = getSystemMcp(app); + server = app.mcp!; }); const tool = createMcpToolCaller(); test("config_server_get", async () => { const result = await tool(server, "config_server_get", {}); - expect(result).toEqual({ + expect(JSON.parse(JSON.stringify(result))).toEqual({ path: "", secrets: false, partial: false, - value: app.toJSON().server, + value: JSON.parse(JSON.stringify(app.toJSON().server)), + }); + }); + + test("config_server_get2", async () => { + const result = await tool(server, "config_server_get", {}); + expect(JSON.parse(JSON.stringify(result))).toEqual({ + path: "", + secrets: false, + partial: false, + value: JSON.parse(JSON.stringify(app.toJSON().server)), }); }); test("config_server_update", async () => { - const original = app.toJSON().server; + const original = JSON.parse(JSON.stringify(app.toJSON().server)); const result = await tool(server, "config_server_update", { value: { cors: { @@ -46,7 +56,7 @@ describe("mcp system", async () => { return_config: true, }); - expect(result).toEqual({ + expect(JSON.parse(JSON.stringify(result))).toEqual({ success: true, module: "server", config: { diff --git a/app/__test__/app/mcp/mcp.system.test.ts b/app/__test__/app/mcp/mcp.system.test.ts index 60be89b..6b08628 100644 --- a/app/__test__/app/mcp/mcp.system.test.ts +++ b/app/__test__/app/mcp/mcp.system.test.ts @@ -1,9 +1,7 @@ import { AppEvents } from "App"; import { describe, test, expect, beforeAll, mock } from "bun:test"; import { type App, createApp, createMcpToolCaller } from "core/test/utils"; -import { getSystemMcp } from "modules/mcp/system-mcp"; -import { inspect } from "node:util"; -inspect.defaultOptions.depth = 10; +import type { McpServer } from "bknd/utils"; /** * - [x] system_config @@ -13,7 +11,7 @@ inspect.defaultOptions.depth = 10; */ describe("mcp system", async () => { let app: App; - let server: ReturnType; + let server: McpServer; beforeAll(async () => { app = createApp({ initialConfig: { @@ -25,7 +23,7 @@ describe("mcp system", async () => { }, }); await app.build(); - server = getSystemMcp(app); + server = app.mcp!; }); const tool = createMcpToolCaller(); diff --git a/app/__test__/data/specs/Entity.spec.ts b/app/__test__/data/specs/Entity.spec.ts index 064db2d..220b688 100644 --- a/app/__test__/data/specs/Entity.spec.ts +++ b/app/__test__/data/specs/Entity.spec.ts @@ -47,8 +47,4 @@ describe("[data] Entity", async () => { entity.addField(field); expect(entity.getField("new_field")).toBe(field); }); - - test.only("types", async () => { - console.log(entity.toTypes()); - }); }); diff --git a/app/__test__/debug/jsonv-resolution.test.ts b/app/__test__/debug/jsonv-resolution.test.ts new file mode 100644 index 0000000..64b60e4 --- /dev/null +++ b/app/__test__/debug/jsonv-resolution.test.ts @@ -0,0 +1,24 @@ +import { describe, it, expect } from "bun:test"; +import * as sDirect from "jsonv-ts"; +import { s as sFromBknd } from "bknd/utils"; + +describe("jsonv-ts resolution", () => { + it("should resolve to a single instance", () => { + const sameNamespace = sDirect === (sFromBknd as unknown as typeof sDirect); + // If this fails, two instances are being loaded via different specifiers/paths + expect(sameNamespace).toBe(true); + }); + + it("should resolve specifiers to a single package path", async () => { + const base = await import.meta.resolve("jsonv-ts"); + const hono = await import.meta.resolve("jsonv-ts/hono"); + const mcp = await import.meta.resolve("jsonv-ts/mcp"); + expect(typeof base).toBe("string"); + expect(typeof hono).toBe("string"); + expect(typeof mcp).toBe("string"); + // They can be different files (subpath exports), but they should share the same package root + const pkgRoot = (p: string) => p.slice(0, p.lastIndexOf("jsonv-ts") + "jsonv-ts".length); + expect(pkgRoot(base)).toBe(pkgRoot(hono)); + expect(pkgRoot(base)).toBe(pkgRoot(mcp)); + }); +}); diff --git a/app/__test__/helper.ts b/app/__test__/helper.ts index 1760d32..2579a88 100644 --- a/app/__test__/helper.ts +++ b/app/__test__/helper.ts @@ -5,7 +5,7 @@ import { format as sqlFormat } from "sql-formatter"; import type { em as protoEm } from "../src/data/prototype"; import { writeFile } from "node:fs/promises"; import { join } from "node:path"; -import { slugify } from "core/utils/strings"; +import { slugify } from "bknd/utils"; import { type Connection, SqliteLocalConnection } from "data/connection"; import { EntityManager } from "data/entities/EntityManager"; diff --git a/app/__test__/modules/module-test-suite.ts b/app/__test__/modules/module-test-suite.ts index 01f597e..1f19f4e 100644 --- a/app/__test__/modules/module-test-suite.ts +++ b/app/__test__/modules/module-test-suite.ts @@ -2,13 +2,12 @@ import { beforeEach, describe, expect, it } from "bun:test"; import { Hono } from "hono"; import { Guard } from "auth/authorize/Guard"; -import { DebugLogger } from "core/utils/DebugLogger"; import { EventManager } from "core/events"; import { EntityManager } from "data/entities/EntityManager"; import { Module, type ModuleBuildContext } from "modules/Module"; import { getDummyConnection } from "../helper"; import { ModuleHelper } from "modules/ModuleHelper"; -import { McpServer } from "bknd/utils"; +import { DebugLogger, McpServer } from "bknd/utils"; export function makeCtx(overrides?: Partial): ModuleBuildContext { const { dummyConnection } = getDummyConnection(); diff --git a/app/build.cli.ts b/app/build.cli.ts index e874813..ff20803 100644 --- a/app/build.cli.ts +++ b/app/build.cli.ts @@ -1,13 +1,32 @@ import pkg from "./package.json" with { type: "json" }; import c from "picocolors"; -import { formatNumber } from "core/utils"; +import { formatNumber } from "bknd/utils"; +import * as esbuild from "esbuild"; + +if (process.env.DEBUG) { + await esbuild.build({ + entryPoints: ["./src/cli/index.ts"], + outdir: "./dist/cli", + platform: "node", + minify: false, + format: "esm", + bundle: true, + external: ["jsonv-ts", "jsonv-ts/*"], + define: { + __isDev: "0", + __version: JSON.stringify(pkg.version), + }, + }); + process.exit(0); +} const result = await Bun.build({ entrypoints: ["./src/cli/index.ts"], target: "node", outdir: "./dist/cli", env: "PUBLIC_*", - minify: true, + minify: false, + external: ["jsonv-ts", "jsonv-ts/*"], define: { __isDev: "0", __version: JSON.stringify(pkg.version), diff --git a/app/build.ts b/app/build.ts index 998132c..7586c66 100644 --- a/app/build.ts +++ b/app/build.ts @@ -69,6 +69,8 @@ const external = [ "@libsql/client", "bknd", /^bknd\/.*/, + "jsonv-ts", + /^jsonv-ts\/.*/, ] as const; /** diff --git a/app/package.json b/app/package.json index 9a894ef..798928a 100644 --- a/app/package.json +++ b/app/package.json @@ -65,7 +65,7 @@ "hono": "4.8.3", "json-schema-library": "10.0.0-rc7", "json-schema-to-ts": "^3.1.1", - "jsonv-ts": "^0.7.5", + "jsonv-ts": "^0.8.0", "kysely": "0.27.6", "lodash-es": "^4.17.21", "oauth4webapi": "^2.11.1", diff --git a/app/src/App.ts b/app/src/App.ts index 7133e6d..718ab54 100644 --- a/app/src/App.ts +++ b/app/src/App.ts @@ -96,6 +96,7 @@ export class App program diff --git a/app/src/core/object/SchemaObject.ts b/app/src/core/object/SchemaObject.ts index 23470a3..cf40bcf 100644 --- a/app/src/core/object/SchemaObject.ts +++ b/app/src/core/object/SchemaObject.ts @@ -27,7 +27,7 @@ export class SchemaObject { ) { this._default = deepFreeze(_schema.template({}, { withOptional: true }) as any); this._value = deepFreeze( - parse(_schema, structuredClone(initial ?? {}), { + parse(_schema, initial ?? {}, { withDefaults: true, //withExtendedDefaults: true, forceParse: this.isForceParse(), diff --git a/app/src/core/test/utils.ts b/app/src/core/test/utils.ts index 3eb4a39..c7971e2 100644 --- a/app/src/core/test/utils.ts +++ b/app/src/core/test/utils.ts @@ -1,19 +1,20 @@ -import { createApp as createAppInternal, type CreateAppConfig } from "App"; -import { bunSqlite } from "adapter/bun/connection/BunSqliteConnection"; -import { Connection } from "data/connection/Connection"; -import type { getSystemMcp } from "modules/mcp/system-mcp"; +import { Connection, createApp as createAppInternal, type CreateAppConfig } from "bknd"; +import { bunSqlite } from "bknd/adapter/bun"; +import type { McpServer } from "bknd/utils"; -export { App } from "App"; +export { App } from "bknd"; export function createApp({ connection, ...config }: CreateAppConfig = {}) { return createAppInternal({ ...config, - connection: Connection.isConnection(connection) ? connection : bunSqlite(connection as any), + connection: Connection.isConnection(connection) + ? connection + : (bunSqlite(connection as any) as any), }); } export function createMcpToolCaller() { - return async (server: ReturnType, name: string, args: any, raw?: any) => { + return async (server: McpServer, name: string, args: any, raw?: any) => { const res = await server.handle( { jsonrpc: "2.0", diff --git a/app/src/core/utils/file.ts b/app/src/core/utils/file.ts index ea5eb2b..8e812cf 100644 --- a/app/src/core/utils/file.ts +++ b/app/src/core/utils/file.ts @@ -1,7 +1,7 @@ import { extension, guess, isMimeType } from "media/storage/mime-types-tiny"; -import { randomString } from "core/utils/strings"; +import { randomString } from "./strings"; import type { Context } from "hono"; -import { invariant } from "core/utils/runtime"; +import { invariant } from "./runtime"; import { $console } from "./console"; export function getContentName(request: Request): string | undefined; diff --git a/app/src/core/utils/index.ts b/app/src/core/utils/index.ts index 30321ed..163a148 100644 --- a/app/src/core/utils/index.ts +++ b/app/src/core/utils/index.ts @@ -14,3 +14,4 @@ export * from "./test"; export * from "./runtime"; export * from "./numbers"; export * from "./schema"; +export { DebugLogger } from "./DebugLogger"; diff --git a/app/src/core/utils/schema/index.ts b/app/src/core/utils/schema/index.ts index ebf585b..bf8b417 100644 --- a/app/src/core/utils/schema/index.ts +++ b/app/src/core/utils/schema/index.ts @@ -10,6 +10,7 @@ export { mcpTool, mcpResource, getMcpServer, + stdioTransport, type ToolAnnotation, type ToolHandlerCtx, } from "jsonv-ts/mcp"; diff --git a/app/src/core/utils/schema/secret.ts b/app/src/core/utils/schema/secret.ts index 7eae592..0df68d3 100644 --- a/app/src/core/utils/schema/secret.ts +++ b/app/src/core/utils/schema/secret.ts @@ -1,6 +1,6 @@ -import { StringSchema, type IStringOptions } from "jsonv-ts"; +import { s } from "bknd/utils"; -export class SecretSchema extends StringSchema {} +export class SecretSchema extends s.StringSchema {} -export const secret = (o?: O): SecretSchema & O => +export const secret = (o?: O): SecretSchema & O => new SecretSchema(o) as any; diff --git a/app/src/index.ts b/app/src/index.ts index cb9ba5d..bd6515f 100644 --- a/app/src/index.ts +++ b/app/src/index.ts @@ -35,6 +35,7 @@ export type { BkndConfig } from "bknd/adapter"; export * as middlewares from "modules/middlewares"; export { registries } from "modules/registries"; +export { getSystemMcp } from "modules/mcp/system-mcp"; /** * Core diff --git a/app/src/modules/Module.ts b/app/src/modules/Module.ts index f4b610d..f402e04 100644 --- a/app/src/modules/Module.ts +++ b/app/src/modules/Module.ts @@ -6,9 +6,8 @@ import type { Hono } from "hono"; import type { ServerEnv } from "modules/Controller"; import type { ModuleHelper } from "./ModuleHelper"; import { SchemaObject } from "core/object/SchemaObject"; -import type { DebugLogger } from "core/utils/DebugLogger"; import type { Guard } from "auth/authorize/Guard"; -import type { McpServer } from "bknd/utils"; +import type { McpServer, DebugLogger } from "bknd/utils"; type PartialRec = { [P in keyof T]?: PartialRec }; diff --git a/app/src/modules/ModuleManager.ts b/app/src/modules/ModuleManager.ts index 0201639..660902a 100644 --- a/app/src/modules/ModuleManager.ts +++ b/app/src/modules/ModuleManager.ts @@ -1,8 +1,16 @@ -import { mark, stripMark, $console, s, objectEach, transformObject, McpServer } from "bknd/utils"; +import { + mark, + stripMark, + $console, + s, + objectEach, + transformObject, + McpServer, + DebugLogger, +} from "bknd/utils"; import { Guard } from "auth/authorize/Guard"; import { env } from "core/env"; import { BkndError } from "core/errors"; -import { DebugLogger } from "core/utils/DebugLogger"; import { EventManager, Event } from "core/events"; import * as $diff from "core/object/diff"; import type { Connection } from "data/connection"; diff --git a/app/src/modules/mcp/system-mcp.ts b/app/src/modules/mcp/system-mcp.ts index f8308e0..c1ab148 100644 --- a/app/src/modules/mcp/system-mcp.ts +++ b/app/src/modules/mcp/system-mcp.ts @@ -8,12 +8,9 @@ export function getSystemMcp(app: App) { const appConfig = app.modules.configs(); const { version, ...appSchema } = app.getSchema(); - const schema = s.strictObject(appSchema); - - const nodes = [...schema.walk({ data: appConfig })].filter( - (n) => isObject(n.schema) && mcpSchemaSymbol in n.schema, - ) as s.Node[]; + const result = [...schema.walk({ maxDepth: 3 })]; + const nodes = result.filter((n) => mcpSchemaSymbol in n.schema) as s.Node[]; const tools = [ // tools from hono routes ...middlewareServer.tools, diff --git a/app/src/modules/server/SystemController.ts b/app/src/modules/server/SystemController.ts index f5b024c..7660232 100644 --- a/app/src/modules/server/SystemController.ts +++ b/app/src/modules/server/SystemController.ts @@ -16,6 +16,7 @@ import { mcpTool, mcp as mcpMiddleware, isNode, + type McpServer, } from "bknd/utils"; import type { Context, Hono } from "hono"; import { Controller } from "modules/Controller"; @@ -47,6 +48,8 @@ export type SchemaResponse = { }; export class SystemController extends Controller { + _mcpServer: McpServer | null = null; + constructor(private readonly app: App) { super(); } @@ -64,8 +67,8 @@ export class SystemController extends Controller { this.registerMcp(); - const mcpServer = getSystemMcp(app); - mcpServer.onNotification((message) => { + this._mcpServer = getSystemMcp(app); + this._mcpServer.onNotification((message) => { if (message.method === "notification/message") { const consoleMap = { emergency: "error", @@ -87,7 +90,7 @@ export class SystemController extends Controller { app.server.use( mcpMiddleware({ - server: mcpServer, + server: this._mcpServer, sessionsEnabled: true, debug: { logLevel: "debug", diff --git a/app/vite.dev.ts b/app/vite.dev.ts index 1274d21..66036d9 100644 --- a/app/vite.dev.ts +++ b/app/vite.dev.ts @@ -7,7 +7,7 @@ import type { Connection } from "./src/data/connection/Connection"; import { __bknd } from "modules/ModuleManager"; import { nodeSqlite } from "./src/adapter/node/connection/NodeSqliteConnection"; import { libsql } from "./src/data/connection/sqlite/libsql/LibsqlConnection"; -import { $console } from "core/utils"; +import { $console } from "bknd/utils"; import { createClient } from "@libsql/client"; registries.media.register("local", StorageLocalAdapter); diff --git a/bun.lock b/bun.lock index 6152514..d94cc32 100644 --- a/bun.lock +++ b/bun.lock @@ -35,7 +35,7 @@ "hono": "4.8.3", "json-schema-library": "10.0.0-rc7", "json-schema-to-ts": "^3.1.1", - "jsonv-ts": "^0.7.5", + "jsonv-ts": "^0.8.0", "kysely": "0.27.6", "lodash-es": "^4.17.21", "oauth4webapi": "^2.11.1", @@ -2516,7 +2516,7 @@ "jsonpointer": ["jsonpointer@5.0.1", "", {}, "sha512-p/nXbhSEcu3pZRdkW1OfJhpsVtW1gd4Wa1fnQc9YLiTfAjn0312eMKimbdIQzuZl9aa9xUGaRlP9T/CJE/ditQ=="], - "jsonv-ts": ["jsonv-ts@0.7.5", "", { "optionalDependencies": { "hono": "*" }, "peerDependencies": { "typescript": "^5.0.0" } }, "sha512-/FXLINo/mbMLVFD4zjNRFfWe5D9oBsc2H9Fy/KLgmdGdhgUo9T/xbVteGWBVQSPg+P2hPdbVgaKFWgvDPk4qVw=="], + "jsonv-ts": ["jsonv-ts@0.8.0", "", { "optionalDependencies": { "hono": "*" }, "peerDependencies": { "typescript": "^5.0.0" } }, "sha512-OS0QnkpmyqoFbK+qh7Rk+XAc+TCpWnOW1j9hJWJ1e0Lz1yGOExpa7ghokI4gUjKOwUXNq1eN7vUs+WUTzX2+gA=="], "jsonwebtoken": ["jsonwebtoken@9.0.2", "", { "dependencies": { "jws": "^3.2.2", "lodash.includes": "^4.3.0", "lodash.isboolean": "^3.0.3", "lodash.isinteger": "^4.0.4", "lodash.isnumber": "^3.0.3", "lodash.isplainobject": "^4.0.6", "lodash.isstring": "^4.0.1", "lodash.once": "^4.0.0", "ms": "^2.1.1", "semver": "^7.5.4" } }, "sha512-PRp66vJ865SSqOlgqS8hujT5U4AOgMfhrwYIuIhfKaoSCZcirrmASQr8CX7cUg+RMih+hgznrjp99o+W4pJLHQ=="],