@theokit/http 0.4.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 (38) hide show
  1. package/README.md +172 -0
  2. package/dist/app.d.ts +67 -0
  3. package/dist/app.js +11 -0
  4. package/dist/app.js.map +1 -0
  5. package/dist/chunk-34KOKJ5M.js +71 -0
  6. package/dist/chunk-34KOKJ5M.js.map +1 -0
  7. package/dist/chunk-3PGQVQWG.js +276 -0
  8. package/dist/chunk-3PGQVQWG.js.map +1 -0
  9. package/dist/chunk-7QVYU63E.js +7 -0
  10. package/dist/chunk-7QVYU63E.js.map +1 -0
  11. package/dist/chunk-HLW7YKZE.js +99 -0
  12. package/dist/chunk-HLW7YKZE.js.map +1 -0
  13. package/dist/chunk-LKNI6QEP.js +20 -0
  14. package/dist/chunk-LKNI6QEP.js.map +1 -0
  15. package/dist/chunk-LWCNTZN6.js +87 -0
  16. package/dist/chunk-LWCNTZN6.js.map +1 -0
  17. package/dist/chunk-SMWUPP2C.js +125 -0
  18. package/dist/chunk-SMWUPP2C.js.map +1 -0
  19. package/dist/chunk-TBMGRXH5.js +477 -0
  20. package/dist/chunk-TBMGRXH5.js.map +1 -0
  21. package/dist/chunk-U46H4CGF.js +34 -0
  22. package/dist/chunk-U46H4CGF.js.map +1 -0
  23. package/dist/exception-filter-chain-BCSQ3MZ2.js +10 -0
  24. package/dist/exception-filter-chain-BCSQ3MZ2.js.map +1 -0
  25. package/dist/index.d.ts +1047 -0
  26. package/dist/index.js +761 -0
  27. package/dist/index.js.map +1 -0
  28. package/dist/interceptor-chain-6S3PUV7J.js +9 -0
  29. package/dist/interceptor-chain-6S3PUV7J.js.map +1 -0
  30. package/dist/middleware-consumer-ljxK1fU_.d.ts +58 -0
  31. package/dist/runtime-node.d.ts +21 -0
  32. package/dist/runtime-node.js +12 -0
  33. package/dist/runtime-node.js.map +1 -0
  34. package/dist/theokit-plugin.d.ts +65 -0
  35. package/dist/theokit-plugin.js +432 -0
  36. package/dist/theokit-plugin.js.map +1 -0
  37. package/dist/types-CGthbcon.d.ts +19 -0
  38. package/package.json +58 -0
@@ -0,0 +1,99 @@
1
+ import {
2
+ __name
3
+ } from "./chunk-7QVYU63E.js";
4
+
5
+ // src/bridge/runtime/node.ts
6
+ import { createServer } from "http";
7
+ import { Readable } from "stream";
8
+ function nodeIncomingToRequest(nodeReq) {
9
+ const proto = nodeReq.headers["x-forwarded-proto"] ?? "http";
10
+ const host = nodeReq.headers.host ?? "localhost";
11
+ const url = `${proto}://${host}${nodeReq.url ?? "/"}`;
12
+ const method = nodeReq.method ?? "GET";
13
+ const headers = new Headers();
14
+ for (const [key, value] of Object.entries(nodeReq.headers)) {
15
+ if (value !== void 0) {
16
+ if (Array.isArray(value)) {
17
+ for (const v of value) headers.append(key, v);
18
+ } else {
19
+ headers.set(key, value);
20
+ }
21
+ }
22
+ }
23
+ const hasBody = method !== "GET" && method !== "HEAD" && method !== "OPTIONS";
24
+ const body = hasBody ? Readable.toWeb(nodeReq) : void 0;
25
+ return new Request(url, {
26
+ method,
27
+ headers,
28
+ body,
29
+ // @ts-expect-error — duplex is required for streaming bodies in Node 18+
30
+ duplex: hasBody ? "half" : void 0
31
+ });
32
+ }
33
+ __name(nodeIncomingToRequest, "nodeIncomingToRequest");
34
+ async function writeResponseToNode(response, nodeRes) {
35
+ nodeRes.writeHead(response.status, Object.fromEntries(response.headers.entries()));
36
+ if (!response.body) {
37
+ nodeRes.end();
38
+ return;
39
+ }
40
+ const reader = response.body.getReader();
41
+ try {
42
+ while (true) {
43
+ const { done, value } = await reader.read();
44
+ if (done) break;
45
+ if (nodeRes.destroyed) break;
46
+ nodeRes.write(value);
47
+ }
48
+ } finally {
49
+ reader.releaseLock();
50
+ if (!nodeRes.destroyed) nodeRes.end();
51
+ }
52
+ }
53
+ __name(writeResponseToNode, "writeResponseToNode");
54
+ function createNodeAdapter() {
55
+ return {
56
+ createServer(handler) {
57
+ const server = createServer((nodeReq, nodeRes) => {
58
+ void (async () => {
59
+ try {
60
+ const request = nodeIncomingToRequest(nodeReq);
61
+ const response = await handler(request);
62
+ await writeResponseToNode(response, nodeRes);
63
+ } catch (err) {
64
+ if (!nodeRes.destroyed) {
65
+ nodeRes.writeHead(500, {
66
+ "content-type": "application/json"
67
+ });
68
+ nodeRes.end(JSON.stringify({
69
+ error: {
70
+ code: "INTERNAL_SERVER_ERROR",
71
+ message: err instanceof Error ? err.message : "Unknown error"
72
+ }
73
+ }));
74
+ }
75
+ }
76
+ })();
77
+ });
78
+ return {
79
+ listen: /* @__PURE__ */ __name((port, cb) => server.listen(port, cb), "listen"),
80
+ close: /* @__PURE__ */ __name((cb) => server.close(cb), "close"),
81
+ address: /* @__PURE__ */ __name(() => {
82
+ const addr = server.address();
83
+ if (typeof addr === "string" || addr === null) return null;
84
+ return {
85
+ port: addr.port
86
+ };
87
+ }, "address")
88
+ };
89
+ }
90
+ };
91
+ }
92
+ __name(createNodeAdapter, "createNodeAdapter");
93
+
94
+ export {
95
+ nodeIncomingToRequest,
96
+ writeResponseToNode,
97
+ createNodeAdapter
98
+ };
99
+ //# sourceMappingURL=chunk-HLW7YKZE.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/bridge/runtime/node.ts"],"sourcesContent":["/**\n * Node.js runtime adapter — converts IncomingMessage/ServerResponse ↔ Request/Response.\n *\n * Per ADR D460: node:http types live ONLY in this adapter file.\n * The rest of the pipeline operates on Web Standard Request/Response.\n *\n * EC-1: Body converted via Readable.toWeb() for streaming (no full buffering).\n */\nimport { createServer, type IncomingMessage, type ServerResponse } from 'node:http'\nimport { Readable } from 'node:stream'\n\nimport type { RuntimeAdapter } from './types.js'\n\n/** Convert Node.js IncomingMessage to Web Standard Request. */\nexport function nodeIncomingToRequest(nodeReq: IncomingMessage): Request {\n const proto = nodeReq.headers['x-forwarded-proto'] ?? 'http'\n const host = nodeReq.headers.host ?? 'localhost'\n const url = `${proto}://${host}${nodeReq.url ?? \"/\"}` // eslint-disable-line @typescript-eslint/restrict-template-expressions -- proto/host are string|string[]\n const method = nodeReq.method ?? 'GET'\n\n const headers = new Headers()\n for (const [key, value] of Object.entries(nodeReq.headers)) {\n if (value !== undefined) {\n if (Array.isArray(value)) {\n for (const v of value) headers.append(key, v)\n } else {\n headers.set(key, value)\n }\n }\n }\n\n // EC-1: Streaming body via Readable.toWeb() — no full buffering\n const hasBody = method !== 'GET' && method !== 'HEAD' && method !== 'OPTIONS'\n const body = hasBody ? Readable.toWeb(nodeReq) as ReadableStream : undefined\n\n return new Request(url, {\n method,\n headers,\n body,\n // @ts-expect-error — duplex is required for streaming bodies in Node 18+\n duplex: hasBody ? 'half' : undefined,\n })\n}\n\n/** Write Web Standard Response to Node.js ServerResponse. */\nexport async function writeResponseToNode(response: Response, nodeRes: ServerResponse): Promise<void> {\n nodeRes.writeHead(response.status, Object.fromEntries(response.headers.entries()))\n\n if (!response.body) {\n nodeRes.end()\n return\n }\n\n const reader = response.body.getReader()\n try {\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- intentional infinite loop with break\n while (true) {\n const { done, value } = await reader.read()\n if (done) break\n if (nodeRes.destroyed) break\n nodeRes.write(value)\n }\n } finally {\n reader.releaseLock()\n if (!nodeRes.destroyed) nodeRes.end()\n }\n}\n\n/** Create a Node.js HTTP server that delegates to a Web Standard handler. */\nexport function createNodeAdapter(): RuntimeAdapter {\n return {\n createServer(handler) {\n const server = createServer((nodeReq, nodeRes) => {\n void (async () => {\n try {\n const request = nodeIncomingToRequest(nodeReq)\n const response = await handler(request)\n await writeResponseToNode(response, nodeRes)\n } catch (err) {\n if (!nodeRes.destroyed) {\n nodeRes.writeHead(500, { 'content-type': 'application/json' })\n nodeRes.end(JSON.stringify({\n error: { code: 'INTERNAL_SERVER_ERROR', message: err instanceof Error ? err.message : 'Unknown error' },\n }))\n }\n }\n })()\n })\n\n return {\n listen: (port: number, cb?: () => void) => server.listen(port, cb),\n close: (cb?: () => void) => server.close(cb),\n address: () => {\n const addr = server.address()\n if (typeof addr === 'string' || addr === null) return null\n return { port: addr.port }\n },\n }\n },\n }\n}\n"],"mappings":";;;;;AAQA,SAASA,oBAA+D;AACxE,SAASC,gBAAgB;AAKlB,SAASC,sBAAsBC,SAAwB;AAC5D,QAAMC,QAAQD,QAAQE,QAAQ,mBAAA,KAAwB;AACtD,QAAMC,OAAOH,QAAQE,QAAQC,QAAQ;AACrC,QAAMC,MAAM,GAAGH,KAAAA,MAAWE,IAAAA,GAAOH,QAAQI,OAAO,GAAA;AAChD,QAAMC,SAASL,QAAQK,UAAU;AAEjC,QAAMH,UAAU,IAAII,QAAAA;AACpB,aAAW,CAACC,KAAKC,KAAAA,KAAUC,OAAOC,QAAQV,QAAQE,OAAO,GAAG;AAC1D,QAAIM,UAAUG,QAAW;AACvB,UAAIC,MAAMC,QAAQL,KAAAA,GAAQ;AACxB,mBAAWM,KAAKN,MAAON,SAAQa,OAAOR,KAAKO,CAAAA;MAC7C,OAAO;AACLZ,gBAAQc,IAAIT,KAAKC,KAAAA;MACnB;IACF;EACF;AAGA,QAAMS,UAAUZ,WAAW,SAASA,WAAW,UAAUA,WAAW;AACpE,QAAMa,OAAOD,UAAUE,SAASC,MAAMpB,OAAAA,IAA6BW;AAEnE,SAAO,IAAIU,QAAQjB,KAAK;IACtBC;IACAH;IACAgB;;IAEAI,QAAQL,UAAU,SAASN;EAC7B,CAAA;AACF;AA5BgBZ;AA+BhB,eAAsBwB,oBAAoBC,UAAoBC,SAAuB;AACnFA,UAAQC,UAAUF,SAASG,QAAQlB,OAAOmB,YAAYJ,SAAStB,QAAQQ,QAAO,CAAA,CAAA;AAE9E,MAAI,CAACc,SAASN,MAAM;AAClBO,YAAQI,IAAG;AACX;EACF;AAEA,QAAMC,SAASN,SAASN,KAAKa,UAAS;AACtC,MAAI;AAEF,WAAO,MAAM;AACX,YAAM,EAAEC,MAAMxB,MAAK,IAAK,MAAMsB,OAAOG,KAAI;AACzC,UAAID,KAAM;AACV,UAAIP,QAAQS,UAAW;AACvBT,cAAQU,MAAM3B,KAAAA;IAChB;EACF,UAAA;AACEsB,WAAOM,YAAW;AAClB,QAAI,CAACX,QAAQS,UAAWT,SAAQI,IAAG;EACrC;AACF;AArBsBN;AAwBf,SAASc,oBAAAA;AACd,SAAO;IACLC,aAAaC,SAAO;AAClB,YAAMC,SAASF,aAAa,CAACtC,SAASyB,YAAAA;AACpC,cAAM,YAAA;AACN,cAAI;AACF,kBAAMgB,UAAU1C,sBAAsBC,OAAAA;AACtC,kBAAMwB,WAAW,MAAMe,QAAQE,OAAAA;AAC/B,kBAAMlB,oBAAoBC,UAAUC,OAAAA;UACtC,SAASiB,KAAK;AACZ,gBAAI,CAACjB,QAAQS,WAAW;AACtBT,sBAAQC,UAAU,KAAK;gBAAE,gBAAgB;cAAmB,CAAA;AAC5DD,sBAAQI,IAAIc,KAAKC,UAAU;gBACzBC,OAAO;kBAAEC,MAAM;kBAAyBC,SAASL,eAAeM,QAAQN,IAAIK,UAAU;gBAAgB;cACxG,CAAA,CAAA;YACF;UACF;QACA,GAAA;MACF,CAAA;AAEA,aAAO;QACLE,QAAQ,wBAACC,MAAcC,OAAoBX,OAAOS,OAAOC,MAAMC,EAAAA,GAAvD;QACRC,OAAO,wBAACD,OAAoBX,OAAOY,MAAMD,EAAAA,GAAlC;QACPE,SAAS,6BAAA;AACP,gBAAMC,OAAOd,OAAOa,QAAO;AAC3B,cAAI,OAAOC,SAAS,YAAYA,SAAS,KAAM,QAAO;AACtD,iBAAO;YAAEJ,MAAMI,KAAKJ;UAAK;QAC3B,GAJS;MAKX;IACF;EACF;AACF;AA/BgBb;","names":["createServer","Readable","nodeIncomingToRequest","nodeReq","proto","headers","host","url","method","Headers","key","value","Object","entries","undefined","Array","isArray","v","append","set","hasBody","body","Readable","toWeb","Request","duplex","writeResponseToNode","response","nodeRes","writeHead","status","fromEntries","end","reader","getReader","done","read","destroyed","write","releaseLock","createNodeAdapter","createServer","handler","server","request","err","JSON","stringify","error","code","message","Error","listen","port","cb","close","address","addr"]}
@@ -0,0 +1,20 @@
1
+ import {
2
+ __name
3
+ } from "./chunk-7QVYU63E.js";
4
+
5
+ // src/bridge/di-resolve.ts
6
+ function resolveOrNew(Ctor, container) {
7
+ if (container) {
8
+ try {
9
+ return container.resolve(Ctor);
10
+ } catch {
11
+ }
12
+ }
13
+ return new Ctor();
14
+ }
15
+ __name(resolveOrNew, "resolveOrNew");
16
+
17
+ export {
18
+ resolveOrNew
19
+ };
20
+ //# sourceMappingURL=chunk-LKNI6QEP.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/bridge/di-resolve.ts"],"sourcesContent":["/**\n * Shared DI resolution helper for guards, interceptors, and middleware.\n * Extracted to avoid DRY violation (EC-3) — was duplicated in create-server.ts\n * and theokit-plugin.ts.\n */\n\n/** DI container interface — structural match for @theokit/di Container. */\nexport interface DiContainer {\n resolve<T>(token: Function): T\n}\n\n/**\n * Resolve a class via DI container if provided; otherwise fall back to bare `new`.\n * Guards, interceptors, and middleware classes all use this pattern.\n */\nexport function resolveOrNew(Ctor: Function, container?: DiContainer): object {\n if (container) {\n try {\n return container.resolve(Ctor)\n } catch {\n // MissingInjectableError or similar — fall back to bare new\n }\n }\n return new (Ctor as new () => object)()\n}\n"],"mappings":";;;;;AAeO,SAASA,aAAaC,MAAgBC,WAAuB;AAClE,MAAIA,WAAW;AACb,QAAI;AACF,aAAOA,UAAUC,QAAQF,IAAAA;IAC3B,QAAQ;IAER;EACF;AACA,SAAO,IAAKA,KAAAA;AACd;AATgBD;","names":["resolveOrNew","Ctor","container","resolve"]}
@@ -0,0 +1,87 @@
1
+ import {
2
+ resolveOrNew
3
+ } from "./chunk-LKNI6QEP.js";
4
+ import {
5
+ __name
6
+ } from "./chunk-7QVYU63E.js";
7
+
8
+ // src/bridge/middleware-consumer.ts
9
+ var MiddlewareConsumerImpl = class {
10
+ static {
11
+ __name(this, "MiddlewareConsumerImpl");
12
+ }
13
+ entries = [];
14
+ container;
15
+ constructor(container) {
16
+ this.container = container;
17
+ }
18
+ apply(...middleware) {
19
+ const resolved = middleware.map((m) => this.resolveMiddleware(m));
20
+ const excludePatterns = [];
21
+ const proxy = {
22
+ exclude: /* @__PURE__ */ __name((...routes) => {
23
+ for (const r of routes) excludePatterns.push(typeof r === "string" ? r : r.path);
24
+ return proxy;
25
+ }, "exclude"),
26
+ forRoutes: /* @__PURE__ */ __name((...routes) => {
27
+ const routePatterns = routes.map((r) => typeof r === "string" ? r : r.path);
28
+ for (const handler of resolved) {
29
+ this.entries.push({
30
+ handler,
31
+ routePatterns: [
32
+ ...routePatterns
33
+ ],
34
+ excludePatterns: [
35
+ ...excludePatterns
36
+ ]
37
+ });
38
+ }
39
+ return this;
40
+ }, "forRoutes")
41
+ };
42
+ return proxy;
43
+ }
44
+ getEntries() {
45
+ return this.entries;
46
+ }
47
+ resolveMiddleware(m) {
48
+ if (typeof m === "function" && !m.prototype?.use) {
49
+ return m;
50
+ }
51
+ const instance = resolveOrNew(m, this.container);
52
+ return (request, next) => instance.use(request, next);
53
+ }
54
+ };
55
+ function middlewareMatchesPath(entry, requestPath) {
56
+ for (const pattern of entry.excludePatterns) {
57
+ if (pathMatches(requestPath, pattern)) return false;
58
+ }
59
+ for (const pattern of entry.routePatterns) {
60
+ if (pathMatches(requestPath, pattern)) return true;
61
+ }
62
+ return false;
63
+ }
64
+ __name(middlewareMatchesPath, "middlewareMatchesPath");
65
+ function pathMatches(requestPath, pattern) {
66
+ if (pattern === "*") return true;
67
+ const normPath = ("/" + requestPath).replace(/\/+/g, "/").replace(/\/$/, "");
68
+ const normPattern = ("/" + pattern).replace(/\/+/g, "/").replace(/\/$/, "");
69
+ return normPath === normPattern || normPath.startsWith(normPattern + "/");
70
+ }
71
+ __name(pathMatches, "pathMatches");
72
+ async function runMiddleware(entries, request, requestPath) {
73
+ for (const entry of entries) {
74
+ if (!middlewareMatchesPath(entry, requestPath)) continue;
75
+ const response = await entry.handler(request, () => Promise.resolve(null));
76
+ if (response) return response;
77
+ }
78
+ return null;
79
+ }
80
+ __name(runMiddleware, "runMiddleware");
81
+
82
+ export {
83
+ MiddlewareConsumerImpl,
84
+ middlewareMatchesPath,
85
+ runMiddleware
86
+ };
87
+ //# sourceMappingURL=chunk-LWCNTZN6.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/bridge/middleware-consumer.ts"],"sourcesContent":["/**\n * NestJS-style Middleware support — Web Standard Request/Response.\n *\n * Middleware runs BEFORE guards: middleware → guards → interceptors → handler\n *\n * Supports class middleware (NestMiddleware) and functional middleware.\n * Returns a Response to short-circuit, or null to continue.\n */\nimport { resolveOrNew, type DiContainer } from './di-resolve.js'\n\n/** NestJS-compatible middleware interface — Web Standard. */\nexport interface NestMiddleware {\n use(\n request: Request,\n next: () => Promise<Response | null>,\n ): Response | null | Promise<Response | null>\n}\n\n/** Functional middleware. */\nexport type MiddlewareFn = (\n request: Request,\n next: () => Promise<Response | null>,\n) => Response | null | Promise<Response | null>\n\nexport interface ResolvedMiddleware {\n handler: MiddlewareFn\n routePatterns: string[]\n excludePatterns: string[]\n}\n\nexport type RouteInfo = string | { path: string; method?: string }\n\nexport interface MiddlewareConfigProxy {\n forRoutes(...routes: RouteInfo[]): MiddlewareConsumerImpl\n exclude(...routes: RouteInfo[]): MiddlewareConfigProxy\n}\n\nexport class MiddlewareConsumerImpl {\n private entries: ResolvedMiddleware[] = []\n private container?: DiContainer\n\n constructor(container?: DiContainer) {\n this.container = container\n }\n\n apply(...middleware: (Function | MiddlewareFn)[]): MiddlewareConfigProxy {\n const resolved = middleware.map((m) => this.resolveMiddleware(m))\n const excludePatterns: string[] = []\n\n const proxy: MiddlewareConfigProxy = {\n exclude: (...routes: RouteInfo[]) => {\n for (const r of routes) excludePatterns.push(typeof r === 'string' ? r : r.path)\n return proxy\n },\n forRoutes: (...routes: RouteInfo[]) => {\n const routePatterns = routes.map((r) => (typeof r === 'string' ? r : r.path))\n for (const handler of resolved) {\n this.entries.push({ handler, routePatterns: [...routePatterns], excludePatterns: [...excludePatterns] })\n }\n return this\n },\n }\n return proxy\n }\n\n getEntries(): ResolvedMiddleware[] {\n return this.entries\n }\n\n private resolveMiddleware(m: Function | MiddlewareFn): MiddlewareFn {\n if (typeof m === 'function' && !m.prototype?.use) {\n return m as MiddlewareFn\n }\n const instance = resolveOrNew(m, this.container) as NestMiddleware\n return (request, next) => instance.use(request, next)\n }\n}\n\nexport function middlewareMatchesPath(entry: ResolvedMiddleware, requestPath: string): boolean {\n for (const pattern of entry.excludePatterns) {\n if (pathMatches(requestPath, pattern)) return false\n }\n for (const pattern of entry.routePatterns) {\n if (pathMatches(requestPath, pattern)) return true\n }\n return false\n}\n\nfunction pathMatches(requestPath: string, pattern: string): boolean {\n if (pattern === '*') return true\n const normPath = ('/' + requestPath).replace(/\\/+/g, '/').replace(/\\/$/, '')\n const normPattern = ('/' + pattern).replace(/\\/+/g, '/').replace(/\\/$/, '')\n return normPath === normPattern || normPath.startsWith(normPattern + '/')\n}\n\n/**\n * Run all matching middleware. Returns a Response if any short-circuited, null otherwise.\n */\nexport async function runMiddleware(\n entries: ResolvedMiddleware[],\n request: Request,\n requestPath: string,\n): Promise<Response | null> {\n for (const entry of entries) {\n if (!middlewareMatchesPath(entry, requestPath)) continue\n const response = await entry.handler(request, () => Promise.resolve(null))\n if (response) return response // short-circuit\n }\n return null\n}\n"],"mappings":";;;;;;;;AAqCO,IAAMA,yBAAN,MAAMA;EArCb,OAqCaA;;;EACHC,UAAgC,CAAA;EAChCC;EAER,YAAYA,WAAyB;AACnC,SAAKA,YAAYA;EACnB;EAEAC,SAASC,YAAgE;AACvE,UAAMC,WAAWD,WAAWE,IAAI,CAACC,MAAM,KAAKC,kBAAkBD,CAAAA,CAAAA;AAC9D,UAAME,kBAA4B,CAAA;AAElC,UAAMC,QAA+B;MACnCC,SAAS,2BAAIC,WAAAA;AACX,mBAAWC,KAAKD,OAAQH,iBAAgBK,KAAK,OAAOD,MAAM,WAAWA,IAAIA,EAAEE,IAAI;AAC/E,eAAOL;MACT,GAHS;MAITM,WAAW,2BAAIJ,WAAAA;AACb,cAAMK,gBAAgBL,OAAON,IAAI,CAACO,MAAO,OAAOA,MAAM,WAAWA,IAAIA,EAAEE,IAAI;AAC3E,mBAAWG,WAAWb,UAAU;AAC9B,eAAKJ,QAAQa,KAAK;YAAEI;YAASD,eAAe;iBAAIA;;YAAgBR,iBAAiB;iBAAIA;;UAAiB,CAAA;QACxG;AACA,eAAO;MACT,GANW;IAOb;AACA,WAAOC;EACT;EAEAS,aAAmC;AACjC,WAAO,KAAKlB;EACd;EAEQO,kBAAkBD,GAA0C;AAClE,QAAI,OAAOA,MAAM,cAAc,CAACA,EAAEa,WAAWC,KAAK;AAChD,aAAOd;IACT;AACA,UAAMe,WAAWC,aAAahB,GAAG,KAAKL,SAAS;AAC/C,WAAO,CAACsB,SAASC,SAASH,SAASD,IAAIG,SAASC,IAAAA;EAClD;AACF;AAEO,SAASC,sBAAsBC,OAA2BC,aAAmB;AAClF,aAAWC,WAAWF,MAAMlB,iBAAiB;AAC3C,QAAIqB,YAAYF,aAAaC,OAAAA,EAAU,QAAO;EAChD;AACA,aAAWA,WAAWF,MAAMV,eAAe;AACzC,QAAIa,YAAYF,aAAaC,OAAAA,EAAU,QAAO;EAChD;AACA,SAAO;AACT;AARgBH;AAUhB,SAASI,YAAYF,aAAqBC,SAAe;AACvD,MAAIA,YAAY,IAAK,QAAO;AAC5B,QAAME,YAAY,MAAMH,aAAaI,QAAQ,QAAQ,GAAA,EAAKA,QAAQ,OAAO,EAAA;AACzE,QAAMC,eAAe,MAAMJ,SAASG,QAAQ,QAAQ,GAAA,EAAKA,QAAQ,OAAO,EAAA;AACxE,SAAOD,aAAaE,eAAeF,SAASG,WAAWD,cAAc,GAAA;AACvE;AALSH;AAUT,eAAsBK,cACpBlC,SACAuB,SACAI,aAAmB;AAEnB,aAAWD,SAAS1B,SAAS;AAC3B,QAAI,CAACyB,sBAAsBC,OAAOC,WAAAA,EAAc;AAChD,UAAMQ,WAAW,MAAMT,MAAMT,QAAQM,SAAS,MAAMa,QAAQC,QAAQ,IAAA,CAAA;AACpE,QAAIF,SAAU,QAAOA;EACvB;AACA,SAAO;AACT;AAXsBD;","names":["MiddlewareConsumerImpl","entries","container","apply","middleware","resolved","map","m","resolveMiddleware","excludePatterns","proxy","exclude","routes","r","push","path","forRoutes","routePatterns","handler","getEntries","prototype","use","instance","resolveOrNew","request","next","middlewareMatchesPath","entry","requestPath","pattern","pathMatches","normPath","replace","normPattern","startsWith","runMiddleware","response","Promise","resolve"]}
@@ -0,0 +1,125 @@
1
+ import {
2
+ CONTROLLER_PREFIX,
3
+ ROUTE_HEADERS,
4
+ ROUTE_METHODS,
5
+ ROUTE_PARAMS,
6
+ ROUTE_REDIRECT,
7
+ ROUTE_STATUS,
8
+ USE_FILTERS,
9
+ USE_GUARDS,
10
+ USE_INTERCEPTORS,
11
+ getMeta
12
+ } from "./chunk-3PGQVQWG.js";
13
+ import {
14
+ __name
15
+ } from "./chunk-7QVYU63E.js";
16
+
17
+ // src/bridge/execution-context.ts
18
+ function createExecutionContext(request, controllerClass, methodName) {
19
+ const url = new URL(request.url);
20
+ return {
21
+ getRequest: /* @__PURE__ */ __name(() => request, "getRequest"),
22
+ getUrl: /* @__PURE__ */ __name(() => url, "getUrl"),
23
+ getClass: /* @__PURE__ */ __name(() => controllerClass, "getClass"),
24
+ getMethodName: /* @__PURE__ */ __name(() => methodName, "getMethodName")
25
+ };
26
+ }
27
+ __name(createExecutionContext, "createExecutionContext");
28
+
29
+ // src/bridge/dto-zod.ts
30
+ function resolveDtoSchema(dtoClass) {
31
+ if (typeof dtoClass !== "function") return void 0;
32
+ const maybe = dtoClass.schema;
33
+ if (maybe !== null && maybe !== void 0 && typeof maybe.safeParse === "function") {
34
+ return maybe;
35
+ }
36
+ return void 0;
37
+ }
38
+ __name(resolveDtoSchema, "resolveDtoSchema");
39
+
40
+ // src/bridge/errors.ts
41
+ var HttpDecoratorsConfigError = class extends Error {
42
+ static {
43
+ __name(this, "HttpDecoratorsConfigError");
44
+ }
45
+ name = "HttpDecoratorsConfigError";
46
+ constructor(message) {
47
+ super(message);
48
+ }
49
+ };
50
+
51
+ // src/bridge/walk-metadata.ts
52
+ import "reflect-metadata";
53
+ function joinPath(prefix, path) {
54
+ return ("/" + prefix + "/" + path).replace(/\/+/g, "/").replace(/\/$/, "") || "/";
55
+ }
56
+ __name(joinPath, "joinPath");
57
+ function resolveBodySchema(paramEntries, ControllerClass, propertyKey) {
58
+ const bodyParam = paramEntries.find((p) => p.source === "body" && !p.key);
59
+ if (!bodyParam) return void 0;
60
+ if (bodyParam.schema) return bodyParam.schema;
61
+ const paramTypes = Reflect.getMetadata("design:paramtypes", ControllerClass.prototype, propertyKey) ?? [];
62
+ if (paramTypes.length > 0) {
63
+ return resolveDtoSchema(paramTypes[bodyParam.index]);
64
+ }
65
+ console.warn(`[@theokit/http] method ${String(propertyKey)} on ${ControllerClass.name}: @Body() without explicit schema and emitDecoratorMetadata is not active. Body will be passed raw (no validation). Fix: use @Body(zodSchema) for validation without metadata emission.`);
66
+ return void 0;
67
+ }
68
+ __name(resolveBodySchema, "resolveBodySchema");
69
+ var walkCache = /* @__PURE__ */ new WeakMap();
70
+ function walkControllerMetadata(ControllerClass) {
71
+ const cached = walkCache.get(ControllerClass);
72
+ if (cached) return cached;
73
+ const controllerMeta = getMeta(CONTROLLER_PREFIX, ControllerClass);
74
+ if (!controllerMeta) {
75
+ throw new HttpDecoratorsConfigError(`Controller class ${ControllerClass.name} is missing @Controller() decorator. Add @Controller('prefix') to the class declaration.`);
76
+ }
77
+ const { prefix, host } = controllerMeta;
78
+ if (host) {
79
+ console.warn(`[@theokit/http] @Controller host '${host}' captured but enforcement deferred to v0.2.0`);
80
+ }
81
+ const methods = getMeta(ROUTE_METHODS, ControllerClass) ?? [];
82
+ const paramsMap = getMeta(ROUTE_PARAMS, ControllerClass) ?? /* @__PURE__ */ new Map();
83
+ const classGuards = getMeta(USE_GUARDS, ControllerClass) ?? [];
84
+ const classInterceptors = getMeta(USE_INTERCEPTORS, ControllerClass) ?? [];
85
+ const classFilters = getMeta(USE_FILTERS, ControllerClass) ?? [];
86
+ const result = methods.map((m) => {
87
+ const paramEntries = paramsMap.get(m.propertyKey) ?? [];
88
+ const bodySchema = resolveBodySchema(paramEntries, ControllerClass, m.propertyKey);
89
+ const methodGuards = getMeta(USE_GUARDS, ControllerClass, m.propertyKey) ?? [];
90
+ const methodInterceptors = getMeta(USE_INTERCEPTORS, ControllerClass, m.propertyKey) ?? [];
91
+ return {
92
+ verb: m.verb,
93
+ fullPath: joinPath(prefix, m.path),
94
+ propertyKey: m.propertyKey,
95
+ bodySchema,
96
+ paramEntries: [
97
+ ...paramEntries
98
+ ].sort((a, b) => a.index - b.index),
99
+ status: getMeta(ROUTE_STATUS, ControllerClass, m.propertyKey),
100
+ headers: getMeta(ROUTE_HEADERS, ControllerClass, m.propertyKey) ?? [],
101
+ redirect: getMeta(ROUTE_REDIRECT, ControllerClass, m.propertyKey),
102
+ guards: [
103
+ ...classGuards,
104
+ ...methodGuards
105
+ ],
106
+ interceptors: [
107
+ ...classInterceptors,
108
+ ...methodInterceptors
109
+ ],
110
+ filters: getMeta(USE_FILTERS, ControllerClass, m.propertyKey) ?? classFilters
111
+ };
112
+ });
113
+ walkCache.set(ControllerClass, result);
114
+ return result;
115
+ }
116
+ __name(walkControllerMetadata, "walkControllerMetadata");
117
+
118
+ export {
119
+ createExecutionContext,
120
+ resolveDtoSchema,
121
+ HttpDecoratorsConfigError,
122
+ joinPath,
123
+ walkControllerMetadata
124
+ };
125
+ //# sourceMappingURL=chunk-SMWUPP2C.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/bridge/execution-context.ts","../src/bridge/dto-zod.ts","../src/bridge/errors.ts","../src/bridge/walk-metadata.ts"],"sourcesContent":["/**\n * ExecutionContext — Web Standard Request-based context passed to guards.\n *\n * Per ADR D460: the pipeline operates on Web Standard Request/Response.\n * node:http types live ONLY in the runtime adapter (runtime/node.ts).\n *\n * Guards access request headers via request.headers.get('x-role'),\n * NOT via req.headers['x-role'].\n */\n\n/**\n * Execution context available in guards during request processing.\n * Uses Web Standard Request (works on Node, Bun, Deno, CF Workers).\n */\nexport interface ExecutionContext {\n /** The Web Standard Request object. */\n getRequest(): Request\n /** Parsed URL (convenience — avoids re-parsing). */\n getUrl(): URL\n /** The controller class constructor. */\n getClass(): Function\n /** The handler method name (property key on the controller). */\n getMethodName(): string | symbol\n}\n\n/**\n * Interface for guard classes (bound via @UseGuards).\n *\n * @example\n * ```ts\n * class RolesGuard implements CanActivate {\n * canActivate(context: ExecutionContext): boolean {\n * const request = context.getRequest()\n * const role = request.headers.get('x-role')\n * return role === 'admin'\n * }\n * }\n * ```\n */\nexport interface CanActivate {\n canActivate(context: ExecutionContext): boolean | Promise<boolean>\n}\n\n/** Create an ExecutionContext from a Web Standard Request. */\nexport function createExecutionContext(\n request: Request,\n controllerClass: Function,\n methodName: string | symbol,\n): ExecutionContext {\n const url = new URL(request.url)\n return {\n getRequest: () => request,\n getUrl: () => url,\n getClass: () => controllerClass,\n getMethodName: () => methodName,\n }\n}\n","import type { ZodTypeAny } from 'zod'\n\n/**\n * Resolves a Zod schema from a DTO class via the `static schema` convention (Pattern D2).\n * Returns undefined when the class doesn't carry a compatible schema.\n */\nexport function resolveDtoSchema(dtoClass: unknown): ZodTypeAny | undefined {\n if (typeof dtoClass !== 'function') return undefined\n const maybe = (dtoClass as unknown as Record<string, unknown>).schema\n if (\n maybe !== null &&\n maybe !== undefined &&\n typeof (maybe as Record<string, unknown>).safeParse === 'function'\n ) {\n return maybe as ZodTypeAny\n }\n return undefined\n}\n","/**\n * Configuration error thrown by the bridge when decorator setup is incomplete.\n * Carries actionable messages pointing consumers to the migration guide.\n */\nexport class HttpDecoratorsConfigError extends Error {\n override readonly name = 'HttpDecoratorsConfigError'\n\n constructor(message: string) {\n super(message)\n }\n}\n","import 'reflect-metadata'\nimport type { ZodTypeAny } from 'zod'\n\nimport type { ControllerMeta } from '../decorators/controller.js'\nimport type { RouteMethodEntry, HttpVerb } from '../decorators/methods.js'\nimport type { ParamEntry } from '../decorators/params.js'\nimport type { RedirectMeta } from '../decorators/response.js'\nimport {\n getMeta,\n CONTROLLER_PREFIX,\n ROUTE_METHODS,\n ROUTE_PARAMS,\n ROUTE_STATUS,\n ROUTE_HEADERS,\n ROUTE_REDIRECT,\n USE_GUARDS,\n USE_INTERCEPTORS,\n USE_FILTERS,\n} from '../metadata/index.js'\n\nimport { resolveDtoSchema } from './dto-zod.js'\nimport { HttpDecoratorsConfigError } from './errors.js'\n\nexport interface WalkResult {\n verb: HttpVerb\n fullPath: string\n propertyKey: string | symbol\n bodySchema?: ZodTypeAny\n querySchema?: ZodTypeAny\n paramsSchema?: ZodTypeAny\n paramEntries: ParamEntry[]\n status?: number\n headers: [string, string][]\n redirect?: RedirectMeta\n guards: Function[]\n interceptors: Function[]\n filters: Function[]\n}\n\n/**\n * Normalize a joined path: strip doubles, trim trailing, ensure leading.\n * (EC-3)\n */\nexport function joinPath(prefix: string, path: string): string {\n return ('/' + prefix + '/' + path).replace(/\\/+/g, '/').replace(/\\/$/, '') || '/'\n}\n\n/**\n * Resolve the Zod body schema for a method's @Body() param entry.\n *\n * Priority: explicit @Body(zodSchema) > design:paramtypes + DTO static schema.\n * EC-4 relaxed: warns (not throws) when paramtypes missing — @Body(zodSchema) is the fix.\n */\nfunction resolveBodySchema(\n paramEntries: ParamEntry[],\n ControllerClass: Function,\n propertyKey: string | symbol,\n): ZodTypeAny | undefined {\n const bodyParam = paramEntries.find((p) => p.source === 'body' && !p.key)\n if (!bodyParam) return undefined\n\n // Priority 1: explicit Zod schema from @Body(zodSchema)\n if (bodyParam.schema) return bodyParam.schema\n\n // Priority 2: design:paramtypes + DTO static schema (requires emitDecoratorMetadata)\n const paramTypes: Function[] =\n Reflect.getMetadata('design:paramtypes', ControllerClass.prototype, propertyKey) ?? []\n if (paramTypes.length > 0) {\n return resolveDtoSchema(paramTypes[bodyParam.index])\n }\n\n // EC-4 relaxed: warn when @Body() has no schema and no paramtypes\n console.warn(\n `[@theokit/http] method ${String(propertyKey)} on ` +\n `${ControllerClass.name}: @Body() without explicit schema and ` +\n `emitDecoratorMetadata is not active. Body will be passed raw (no validation). ` +\n `Fix: use @Body(zodSchema) for validation without metadata emission.`,\n )\n return undefined\n}\n\n/** WeakMap cache — metadata is immutable; walk once, reuse forever. */\nconst walkCache = new WeakMap<Function, WalkResult[]>()\n\n/**\n * Walk all decorator metadata on a controller class and produce\n * a structured list of route descriptors. Memoized per class via WeakMap.\n */\nexport function walkControllerMetadata(ControllerClass: Function): WalkResult[] {\n const cached = walkCache.get(ControllerClass)\n if (cached) return cached\n // EC-2: throw when @Controller decorator is missing\n const controllerMeta = getMeta<ControllerMeta>(CONTROLLER_PREFIX, ControllerClass)\n if (!controllerMeta) {\n throw new HttpDecoratorsConfigError(\n `Controller class ${ControllerClass.name} is missing @Controller() decorator. ` +\n `Add @Controller('prefix') to the class declaration.`,\n )\n }\n const { prefix, host } = controllerMeta\n\n // Q4: host captured but enforcement deferred to v0.2.0\n if (host) {\n console.warn(\n `[@theokit/http] @Controller host '${host}' captured but enforcement deferred to v0.2.0`,\n )\n }\n\n const methods = getMeta<RouteMethodEntry[]>(ROUTE_METHODS, ControllerClass) ?? []\n const paramsMap =\n getMeta<Map<string | symbol, ParamEntry[]>>(ROUTE_PARAMS, ControllerClass) ?? new Map()\n\n // Class-level guards/interceptors\n const classGuards = getMeta<Function[]>(USE_GUARDS, ControllerClass) ?? []\n const classInterceptors = getMeta<Function[]>(USE_INTERCEPTORS, ControllerClass) ?? []\n const classFilters = getMeta<Function[]>(USE_FILTERS, ControllerClass) ?? []\n\n const result = methods.map((m) => {\n const paramEntries = paramsMap.get(m.propertyKey) ?? []\n const bodySchema = resolveBodySchema(paramEntries, ControllerClass, m.propertyKey)\n\n // Method-level guards/interceptors (composed: class FIRST per NestJS convention — EC-9)\n const methodGuards = getMeta<Function[]>(USE_GUARDS, ControllerClass, m.propertyKey) ?? []\n const methodInterceptors =\n getMeta<Function[]>(USE_INTERCEPTORS, ControllerClass, m.propertyKey) ?? []\n\n return {\n verb: m.verb,\n fullPath: joinPath(prefix, m.path),\n propertyKey: m.propertyKey,\n bodySchema,\n paramEntries: [...paramEntries].sort((a, b) => a.index - b.index),\n status: getMeta<number>(ROUTE_STATUS, ControllerClass, m.propertyKey),\n headers: getMeta<[string, string][]>(ROUTE_HEADERS, ControllerClass, m.propertyKey) ?? [],\n redirect: getMeta<RedirectMeta>(ROUTE_REDIRECT, ControllerClass, m.propertyKey),\n guards: [...classGuards, ...methodGuards],\n interceptors: [...classInterceptors, ...methodInterceptors],\n filters: getMeta<Function[]>(USE_FILTERS, ControllerClass, m.propertyKey) ?? classFilters,\n }\n })\n\n walkCache.set(ControllerClass, result)\n return result\n}\n"],"mappings":"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","names":["createExecutionContext","request","controllerClass","methodName","url","URL","getRequest","getUrl","getClass","getMethodName","resolveDtoSchema","dtoClass","undefined","maybe","schema","safeParse","HttpDecoratorsConfigError","Error","name","message","joinPath","prefix","path","replace","resolveBodySchema","paramEntries","ControllerClass","propertyKey","bodyParam","find","p","source","key","undefined","schema","paramTypes","Reflect","getMetadata","prototype","length","resolveDtoSchema","index","console","warn","String","name","walkCache","WeakMap","walkControllerMetadata","cached","get","controllerMeta","getMeta","CONTROLLER_PREFIX","HttpDecoratorsConfigError","host","methods","ROUTE_METHODS","paramsMap","ROUTE_PARAMS","Map","classGuards","USE_GUARDS","classInterceptors","USE_INTERCEPTORS","classFilters","USE_FILTERS","result","map","m","bodySchema","methodGuards","methodInterceptors","verb","fullPath","sort","a","b","status","ROUTE_STATUS","headers","ROUTE_HEADERS","redirect","ROUTE_REDIRECT","guards","interceptors","filters","set"]}