@theokit/http 1.0.0 → 1.1.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/dist/action-encryption.d.ts +32 -0
- package/dist/action-encryption.js +69 -0
- package/dist/action-encryption.js.map +1 -0
- package/dist/app.d.ts +69 -2
- package/dist/app.js +5 -5
- package/dist/app.js.map +1 -1
- package/dist/{chunk-DRCRGDA3.js → chunk-7INGPMC7.js} +26 -21
- package/dist/chunk-7INGPMC7.js.map +1 -0
- package/dist/{chunk-KPC7AIVC.js → chunk-AJOJXZRY.js} +2 -2
- package/dist/chunk-AJOJXZRY.js.map +1 -0
- package/dist/{chunk-HLW7YKZE.js → chunk-BSS3KPGY.js} +2 -2
- package/dist/chunk-BSS3KPGY.js.map +1 -0
- package/dist/{chunk-OBHHOS6E.js → chunk-DI7KNIMB.js} +4 -4
- package/dist/chunk-DI7KNIMB.js.map +1 -0
- package/dist/{chunk-CMPP4ULU.js → chunk-HC47QXZV.js} +4 -4
- package/dist/chunk-HC47QXZV.js.map +1 -0
- package/dist/{chunk-MQAJWR3K.js → chunk-JP4J23TV.js} +2 -2
- package/dist/chunk-JP4J23TV.js.map +1 -0
- package/dist/{chunk-ELCXHPAD.js → chunk-PBV6ZO2V.js} +3 -3
- package/dist/chunk-PBV6ZO2V.js.map +1 -0
- package/dist/{chunk-JQMJK47T.js → chunk-X7Q5HPLK.js} +15 -15
- package/dist/chunk-X7Q5HPLK.js.map +1 -0
- package/dist/{chunk-7QVYU63E.js → chunk-Z4QWC7IK.js} +1 -1
- package/dist/chunk-Z4QWC7IK.js.map +1 -0
- package/dist/css-resource.d.ts +28 -0
- package/dist/css-resource.js +22 -0
- package/dist/css-resource.js.map +1 -0
- package/dist/exception-filter-chain-AS6BB5PF.js +10 -0
- package/dist/exception-filter-chain-AS6BB5PF.js.map +1 -0
- package/dist/index.js +15 -15
- package/dist/index.js.map +1 -1
- package/dist/interceptor-chain-KMBBSUB5.js +9 -0
- package/dist/interceptor-chain-KMBBSUB5.js.map +1 -0
- package/dist/runtime-node.js +2 -2
- package/dist/runtime-node.js.map +1 -1
- package/dist/server-inserted-html.d.ts +35 -0
- package/dist/server-inserted-html.js +37 -0
- package/dist/server-inserted-html.js.map +1 -0
- package/dist/theokit-plugin.js +12 -12
- package/dist/theokit-plugin.js.map +1 -1
- package/package.json +16 -9
- package/dist/chunk-7QVYU63E.js.map +0 -1
- package/dist/chunk-CMPP4ULU.js.map +0 -1
- package/dist/chunk-DRCRGDA3.js.map +0 -1
- package/dist/chunk-ELCXHPAD.js.map +0 -1
- package/dist/chunk-HLW7YKZE.js.map +0 -1
- package/dist/chunk-JQMJK47T.js.map +0 -1
- package/dist/chunk-KPC7AIVC.js.map +0 -1
- package/dist/chunk-MQAJWR3K.js.map +0 -1
- package/dist/chunk-OBHHOS6E.js.map +0 -1
- package/dist/exception-filter-chain-V2MFO4WV.js +0 -10
- package/dist/exception-filter-chain-V2MFO4WV.js.map +0 -1
- package/dist/interceptor-chain-ELSL6KZT.js +0 -9
- package/dist/interceptor-chain-ELSL6KZT.js.map +0 -1
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CSS Resource Injection — render CSS as <link> or <style> tags.
|
|
3
|
+
*
|
|
4
|
+
* Inspired by Next.js render-css-resource.tsx (app-render/).
|
|
5
|
+
* Supports React 19 precedence attribute for resource ordering.
|
|
6
|
+
*/
|
|
7
|
+
/** Describes a CSS resource — either external (href) or inline (content). */
|
|
8
|
+
interface CssResource {
|
|
9
|
+
/** External CSS URL. */
|
|
10
|
+
href?: string;
|
|
11
|
+
/** Inline CSS content. */
|
|
12
|
+
content?: string;
|
|
13
|
+
/** React 19 precedence attribute for resource ordering. */
|
|
14
|
+
precedence?: string;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Render a CSS resource as an HTML string.
|
|
18
|
+
*
|
|
19
|
+
* - External CSS (href) → `<link rel="stylesheet" href="..." precedence="...">`
|
|
20
|
+
* - Inline CSS (content) → `<style precedence="...">content</style>`
|
|
21
|
+
* - Dev mode appends `?v=<timestamp>` to external hrefs for cache busting.
|
|
22
|
+
*
|
|
23
|
+
* @returns HTML string for the CSS resource, or empty string if neither
|
|
24
|
+
* href nor content is provided.
|
|
25
|
+
*/
|
|
26
|
+
declare function renderCssResource(resource: CssResource, isDev?: boolean): string;
|
|
27
|
+
|
|
28
|
+
export { type CssResource, renderCssResource };
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import {
|
|
2
|
+
__name
|
|
3
|
+
} from "./chunk-Z4QWC7IK.js";
|
|
4
|
+
|
|
5
|
+
// src/css-resource.ts
|
|
6
|
+
function renderCssResource(resource, isDev) {
|
|
7
|
+
if (resource.href) {
|
|
8
|
+
const href = isDev ? `${resource.href}?v=${Date.now()}` : resource.href;
|
|
9
|
+
const precedenceAttr = resource.precedence ? ` precedence="${resource.precedence}"` : "";
|
|
10
|
+
return `<link rel="stylesheet" href="${href}"${precedenceAttr}>`;
|
|
11
|
+
}
|
|
12
|
+
if (resource.content) {
|
|
13
|
+
const precedenceAttr = resource.precedence ? ` precedence="${resource.precedence}"` : "";
|
|
14
|
+
return `<style${precedenceAttr}>${resource.content}</style>`;
|
|
15
|
+
}
|
|
16
|
+
return "";
|
|
17
|
+
}
|
|
18
|
+
__name(renderCssResource, "renderCssResource");
|
|
19
|
+
export {
|
|
20
|
+
renderCssResource
|
|
21
|
+
};
|
|
22
|
+
//# sourceMappingURL=css-resource.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/css-resource.ts"],"mappings":";;;;;AA8BO,SAASA,kBAAkBC,UAAuBC,OAAe;AACtE,MAAID,SAASE,MAAM;AACjB,UAAMA,OAAOD,QAAQ,GAAGD,SAASE,IAAI,MAAMC,KAAKC,IAAG,CAAA,KAAOJ,SAASE;AACnE,UAAMG,iBAAiBL,SAASM,aAAa,gBAAgBN,SAASM,UAAU,MAAM;AACtF,WAAO,gCAAgCJ,IAAAA,IAAQG,cAAAA;EACjD;AAEA,MAAIL,SAASO,SAAS;AACpB,UAAMF,iBAAiBL,SAASM,aAAa,gBAAgBN,SAASM,UAAU,MAAM;AACtF,WAAO,SAASD,cAAAA,IAAkBL,SAASO,OAAO;EACpD;AAEA,SAAO;AACT;AAbgBR;","names":["renderCssResource","resource","isDev","href","Date","now","precedenceAttr","precedence","content"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":[],"mappings":"","names":[]}
|
package/dist/index.js
CHANGED
|
@@ -7,7 +7,7 @@ import {
|
|
|
7
7
|
renderToStream,
|
|
8
8
|
streamToResponse,
|
|
9
9
|
tryGetRequestContext
|
|
10
|
-
} from "./chunk-
|
|
10
|
+
} from "./chunk-7INGPMC7.js";
|
|
11
11
|
import {
|
|
12
12
|
MiddlewareConsumerImpl,
|
|
13
13
|
isControllerClass,
|
|
@@ -16,23 +16,17 @@ import {
|
|
|
16
16
|
middlewareMatchesPath,
|
|
17
17
|
runMiddleware,
|
|
18
18
|
transformControllerSource
|
|
19
|
-
} from "./chunk-
|
|
19
|
+
} from "./chunk-DI7KNIMB.js";
|
|
20
|
+
import {
|
|
21
|
+
runExceptionFilters
|
|
22
|
+
} from "./chunk-HC47QXZV.js";
|
|
20
23
|
import {
|
|
21
24
|
HttpDecoratorsConfigError,
|
|
22
25
|
createExecutionContext,
|
|
23
26
|
joinPath,
|
|
24
27
|
resolveDtoSchema,
|
|
25
28
|
walkControllerMetadata
|
|
26
|
-
} from "./chunk-
|
|
27
|
-
import {
|
|
28
|
-
createNodeAdapter
|
|
29
|
-
} from "./chunk-HLW7YKZE.js";
|
|
30
|
-
import {
|
|
31
|
-
runInterceptors
|
|
32
|
-
} from "./chunk-ELCXHPAD.js";
|
|
33
|
-
import {
|
|
34
|
-
runExceptionFilters
|
|
35
|
-
} from "./chunk-CMPP4ULU.js";
|
|
29
|
+
} from "./chunk-X7Q5HPLK.js";
|
|
36
30
|
import {
|
|
37
31
|
BadGatewayException,
|
|
38
32
|
BadRequestException,
|
|
@@ -70,13 +64,19 @@ import {
|
|
|
70
64
|
UnsupportedMediaTypeException,
|
|
71
65
|
getMeta,
|
|
72
66
|
setMeta
|
|
73
|
-
} from "./chunk-
|
|
67
|
+
} from "./chunk-AJOJXZRY.js";
|
|
68
|
+
import {
|
|
69
|
+
createNodeAdapter
|
|
70
|
+
} from "./chunk-BSS3KPGY.js";
|
|
71
|
+
import {
|
|
72
|
+
runInterceptors
|
|
73
|
+
} from "./chunk-PBV6ZO2V.js";
|
|
74
74
|
import {
|
|
75
75
|
resolveOrNew
|
|
76
|
-
} from "./chunk-
|
|
76
|
+
} from "./chunk-JP4J23TV.js";
|
|
77
77
|
import {
|
|
78
78
|
__name
|
|
79
|
-
} from "./chunk-
|
|
79
|
+
} from "./chunk-Z4QWC7IK.js";
|
|
80
80
|
|
|
81
81
|
// src/decorators/controller.ts
|
|
82
82
|
function inferPrefix(className) {
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/decorators/controller.ts","../src/decorators/methods.ts","../src/decorators/params.ts","../src/decorators/expose.ts","../src/decorators/response.ts","../src/decorators/middleware.ts","../src/decorators/set-metadata.ts","../src/decorators/throttle.ts","../src/bridge/register-controllers.ts","../src/bridge/create-server.ts","../src/typed-client.ts","../src/contract.ts","../src/error-digest.ts","../src/component-tree.ts","../src/cache-signal.ts"],"sourcesContent":["import { setMeta, CONTROLLER_PREFIX } from '../metadata/index.js'\n\nexport interface ControllerOptions {\n host?: string\n}\n\nexport interface ControllerMeta {\n prefix: string\n host?: string\n}\n\n/**\n * Infer route prefix from class name (Rails-style convention naming).\n *\n * UsersController → api/users\n * TasksController → api/tasks\n * AuthController → api/auth\n * HealthCheckController → api/health-check\n *\n * Strips \"Controller\" suffix, converts PascalCase to kebab-case,\n * prepends \"api/\".\n */\nfunction inferPrefix(className: string): string {\n const stripped = className.replace(/Controller$/, '')\n const kebab = stripped\n .replace(/([a-z0-9])([A-Z])/g, '$1-$2')\n .replace(/([A-Z])([A-Z][a-z])/g, '$1-$2')\n .toLowerCase()\n return `api/${kebab}`\n}\n\n/**\n * Class decorator that declares a route-prefix scope.\n *\n * Convention over configuration:\n * @Controller() → prefix inferred from class name\n * @Controller('api/users') → explicit prefix\n *\n * @example\n * ```ts\n * // Convention: UsersController → /api/users (zero config)\n * @Controller()\n * class UsersController { ... }\n *\n * // Explicit: override when convention doesn't fit\n * @Controller('api/v2/users')\n * class UsersController { ... }\n * ```\n */\nexport function Controller(prefix?: string, opts?: ControllerOptions): ClassDecorator\nexport function Controller(opts?: ControllerOptions): ClassDecorator\nexport function Controller(\n prefixOrOpts?: string | ControllerOptions,\n maybeOpts?: ControllerOptions,\n): ClassDecorator {\n return (target) => {\n let prefix: string\n let opts: ControllerOptions\n\n if (typeof prefixOrOpts === 'string') {\n prefix = prefixOrOpts\n opts = maybeOpts ?? {}\n } else {\n // Convention naming: infer from class name\n prefix = inferPrefix(target.name)\n opts = prefixOrOpts ?? {}\n }\n\n setMeta<ControllerMeta>(CONTROLLER_PREFIX, target, {\n prefix,\n host: opts.host,\n })\n }\n}\n","import { setMeta, getMeta, ROUTE_METHODS } from '../metadata/index.js'\n\nexport type HttpVerb = 'GET' | 'POST' | 'PUT' | 'PATCH' | 'DELETE' | 'OPTIONS' | 'HEAD' | 'ALL'\n\nexport interface RouteMethodEntry {\n verb: HttpVerb\n path: string\n propertyKey: string | symbol\n}\n\nfunction makeVerbDecorator(verb: HttpVerb) {\n return function (path = ''): MethodDecorator {\n return (target, propertyKey) => {\n const existing = getMeta<RouteMethodEntry[]>(ROUTE_METHODS, target.constructor) ?? []\n existing.push({ verb, path, propertyKey })\n setMeta(ROUTE_METHODS, target.constructor, existing)\n }\n }\n}\n\nexport const Get = makeVerbDecorator('GET')\nexport const Post = makeVerbDecorator('POST')\nexport const Put = makeVerbDecorator('PUT')\nexport const Patch = makeVerbDecorator('PATCH')\nexport const Delete = makeVerbDecorator('DELETE')\nexport const Options = makeVerbDecorator('OPTIONS')\nexport const Head = makeVerbDecorator('HEAD')\nexport const All = makeVerbDecorator('ALL')\n","import type { z } from 'zod'\n\nimport { setMeta, getMeta, ROUTE_PARAMS } from '../metadata/index.js'\n\nexport type ParamSource =\n | 'req'\n | 'res'\n | 'body'\n | 'param'\n | 'query'\n | 'headers'\n | 'session'\n | 'ip'\n | 'host'\n\nexport interface ParamEntry {\n source: ParamSource\n key?: string\n index: number\n passthrough?: boolean\n /** Explicit Zod schema — when set, bypasses design:paramtypes + DTO resolution.\n * Preferred path: `@Body(zMySchema)` works without emitDecoratorMetadata. */\n schema?: z.ZodType\n}\n\n/** Detect whether a value is a Zod schema (has `.safeParse()` method). */\nfunction isZodSchema(v: unknown): v is z.ZodType {\n return (\n v !== null &&\n v !== undefined &&\n typeof v === 'object' &&\n typeof (v as Record<string, unknown>).safeParse === 'function'\n )\n}\n\nfunction makeParamDecorator(source: ParamSource) {\n /**\n * Overloaded parameter decorator:\n * - `@Body()` / `@Param()` / `@Query()` — whole-object extraction\n * - `@Body('key')` / `@Param('key')` — named-field extraction\n * - `@Body(zodSchema)` — whole-object with explicit Zod validation\n * (works WITHOUT emitDecoratorMetadata — TheoKit \"Zod is SSoT\" alignment)\n */\n return function (keyOrSchema?: string | z.ZodType): ParameterDecorator {\n return (target, propertyKey, parameterIndex) => {\n if (propertyKey === undefined) return\n const map =\n getMeta<Map<string | symbol, ParamEntry[]>>(ROUTE_PARAMS, target.constructor) ?? new Map()\n const entries = map.get(propertyKey) ?? []\n\n const entry: ParamEntry = { source, index: parameterIndex }\n if (typeof keyOrSchema === 'string') {\n entry.key = keyOrSchema\n } else if (isZodSchema(keyOrSchema)) {\n entry.schema = keyOrSchema\n }\n\n entries.push(entry)\n map.set(propertyKey, entries)\n setMeta(ROUTE_PARAMS, target.constructor, map)\n }\n }\n}\n\nexport const Req = makeParamDecorator('req')\nexport const Body = makeParamDecorator('body')\nexport const Param = makeParamDecorator('param')\nexport const Query = makeParamDecorator('query')\nexport const Headers = makeParamDecorator('headers')\nexport const Session = makeParamDecorator('session')\nexport const Ip = makeParamDecorator('ip')\nexport const HostParam = makeParamDecorator('host')\n\nexport function Res(opts?: { passthrough?: boolean }): ParameterDecorator {\n return (target, propertyKey, parameterIndex) => {\n if (propertyKey === undefined) return\n const map =\n getMeta<Map<string | symbol, ParamEntry[]>>(ROUTE_PARAMS, target.constructor) ?? new Map()\n const entries = map.get(propertyKey) ?? []\n entries.push({\n source: 'res',\n index: parameterIndex,\n passthrough: opts?.passthrough,\n })\n map.set(propertyKey, entries)\n setMeta(ROUTE_PARAMS, target.constructor, map)\n }\n}\n","import { setMeta, getMeta, EXPOSE_AGENT } from '../metadata/index.js'\n\n/**\n * M47 (ADR-M47-1) — `@Expose(agent, opts?)` binds a SEPARATELY-BUILT agent (a pure `agent()…build()` from\n * `agents/<name>.ts`) to a controller PROPERTY, making the exposure (route, auth via `@UseGuards`, streaming)\n * visible in one code review. It mirrors the #122 verb decorators (`@Post`) — storing metadata via the same\n * `Symbol.for()` seam — but records the agent instead of an HTTP verb, so the controller walker turns the\n * property into an agent-serving route (`POST <prefix>/<property>`) delegated to the ONE runtime\n * (`mountAgent`), never a JSON handler. It is a new AUTHORING surface over the existing runtime, not a\n * parallel runtime (G2). CSRF is enforced once at the controller-dispatch boundary. Interceptors do NOT run\n * for agent routes (the dispatcher delegates straight to `mountAgent`); guards DO (G5). The served path is\n * the controller prefix + property name — keep it equal to the agent's convention route (`/api/agents/<name>`\n * for a property named `<name>` under `@Controller('api/agents')`) so the generated `useAgent(handle)` path\n * lines up.\n */\n\n/**\n * Per-binding options for an exposed agent. Reserved for forward-compat — no options are wired yet.\n *\n * Two candidate fields were removed before shipping (M47 review): `path` (a route override) would let the\n * served URL diverge from the generated handle's path — the codegen derives the handle from the agent's\n * convention route (`/api/agents/<name>`), so an overridden route would make `useAgent(handle)` hit the\n * wrong URL. And `csrf` was a no-op — CSRF is enforced exactly once at the controller-dispatch boundary\n * regardless. Both return only when they can be wired end-to-end (codegen reads `@Expose` metadata / a\n * per-route CSRF opt-out threads through the dispatcher). Until then, `@Expose(agent)` is the shape, and the\n * exposure's path MUST be the convention route — put `@Expose` on a property named after the agent under\n * `@Controller('api/agents')` (e.g. `chat` for `agents/chat.ts` → `/api/agents/chat`).\n */\nexport type ExposeOptions = Record<string, never>\n\n/** Metadata recorded per `@Expose`-decorated controller member. */\nexport interface ExposeEntry {\n /** The separately-built agent module bound to this member. */\n agent: unknown\n /** The per-binding options (defaulted to `{}`). */\n opts: ExposeOptions\n /** The controller member the binding is attached to. */\n propertyKey: string | symbol\n}\n\n/**\n * Bind an agent to a controller PROPERTY. Accumulates one {@link ExposeEntry} per member under the\n * `EXPOSE_AGENT` metadata key on the controller constructor — the same accumulation shape `@Post` uses for\n * `ROUTE_METHODS`, so `walkControllerMetadata` reads both alongside each other. Typed as `PropertyDecorator`\n * (the exposure is declared as a property, e.g. `@Expose(chatAgent) chat!: typeof chatAgent`); the agent's\n * behavior lives in its own `agents/<name>.ts`, never in a controller method body.\n */\nexport function Expose(agent: unknown, opts: ExposeOptions = {}): PropertyDecorator {\n return (target: object, propertyKey: string | symbol) => {\n const existing = getMeta<ExposeEntry[]>(EXPOSE_AGENT, target.constructor) ?? []\n existing.push({ agent, opts, propertyKey })\n setMeta(EXPOSE_AGENT, target.constructor, existing)\n }\n}\n","import { setMeta, getMeta, ROUTE_STATUS, ROUTE_HEADERS, ROUTE_REDIRECT } from '../metadata/index.js'\n\nexport function HttpCode(status: number): MethodDecorator {\n return (target, propertyKey) => {\n setMeta(ROUTE_STATUS, target.constructor, status, propertyKey as string)\n }\n}\n\nexport function Header(name: string, value: string): MethodDecorator {\n return (target, propertyKey) => {\n const existing =\n getMeta<[string, string][]>(ROUTE_HEADERS, target.constructor, propertyKey) ?? []\n existing.push([name, value])\n setMeta(ROUTE_HEADERS, target.constructor, existing, propertyKey as string)\n }\n}\n\nexport interface RedirectMeta {\n url: string\n status: number\n}\n\nexport function Redirect(url: string, status = 302): MethodDecorator {\n return (target, propertyKey) => {\n setMeta<RedirectMeta>(ROUTE_REDIRECT, target.constructor, { url, status }, propertyKey)\n }\n}\n","import {\n setMeta,\n getMeta,\n USE_GUARDS,\n USE_INTERCEPTORS,\n USE_FILTERS,\n CATCH_EXCEPTIONS,\n} from '../metadata/index.js'\n\nexport function UseGuards(\n ...guards: Function[]\n): ClassDecorator & MethodDecorator & PropertyDecorator {\n // M47 — also a PropertyDecorator so per-agent guards attach to an `@Expose` property (visible auth). The\n // runtime already keys guards by propertyKey; only the type is widened (back-compat — strictly permissive).\n return (target: object, propertyKey?: string | symbol) => {\n const actualTarget = propertyKey ? target.constructor : target\n const existing = getMeta<Function[]>(USE_GUARDS, actualTarget, propertyKey) ?? []\n setMeta(USE_GUARDS, actualTarget, [...existing, ...guards], propertyKey)\n }\n}\n\nexport function UseInterceptors(...interceptors: Function[]): ClassDecorator & MethodDecorator {\n return (target: object, propertyKey?: string | symbol) => {\n const actualTarget = propertyKey ? target.constructor : target\n const existing = getMeta<Function[]>(USE_INTERCEPTORS, actualTarget, propertyKey) ?? []\n setMeta(USE_INTERCEPTORS, actualTarget, [...existing, ...interceptors], propertyKey)\n }\n}\n\nexport function UseFilters(...filters: Function[]): ClassDecorator & MethodDecorator {\n return (target: object, propertyKey?: string | symbol) => {\n const actualTarget = propertyKey ? target.constructor : target\n const existing = getMeta<Function[]>(USE_FILTERS, actualTarget, propertyKey) ?? []\n setMeta(USE_FILTERS, actualTarget, [...existing, ...filters], propertyKey)\n }\n}\n\n/** @Catch(ExceptionType, ...) — marks which exception types an ExceptionFilter handles.\n * Empty args = catch-all filter. */\nexport function Catch(...exceptions: Function[]): ClassDecorator {\n return (target: object) => {\n setMeta(CATCH_EXCEPTIONS, target, exceptions)\n }\n}\n","/**\n * @SetMetadata + Reflector — NestJS-style custom metadata for guards.\n *\n * Enables role-based auth pattern:\n * const Roles = createDecorator<string[]>()\n * @Roles(['admin']) → guard reads via reflector.get(Roles, handler)\n */\nimport 'reflect-metadata'\n\n/** Unique key type for type-safe metadata decorators. */\nexport type MetadataKey<T> = symbol & { __type?: T }\n\n/**\n * Create a typed decorator that attaches metadata to a handler or class.\n * NestJS equivalent: `Reflector.createDecorator<T>()`.\n *\n * @example\n * ```ts\n * const Roles = createDecorator<string[]>()\n *\n * @Controller('cats')\n * class CatsController {\n * @Post()\n * @Roles(['admin'])\n * create() { ... }\n * }\n * ```\n */\n/** Monotonic counter for unique decorator keys — deterministic, no randomness. */\nlet decoratorKeyCounter = 0\n\nexport function createDecorator<T>(): (value: T) => MethodDecorator & ClassDecorator {\n const key = Symbol.for(`theokit:custom:${++decoratorKeyCounter}`) as MetadataKey<T>\n\n const decorator = (value: T): MethodDecorator & ClassDecorator => {\n return (target: object, propertyKey?: string | symbol) => {\n const metaTarget = propertyKey !== undefined ? target.constructor : target\n Reflect.defineMetadata(key, value, metaTarget, propertyKey as string)\n }\n }\n\n // Attach the key so Reflector can read it\n ;(decorator as unknown as { key: MetadataKey<T> }).key = key\n return decorator\n}\n\n/**\n * Low-level @SetMetadata decorator — attaches arbitrary metadata.\n * NestJS equivalent: `@SetMetadata(key, value)`.\n *\n * Prefer `createDecorator<T>()` for type-safe metadata.\n */\nexport function SetMetadata<T>(\n metaKey: string | symbol,\n value: T,\n): MethodDecorator & ClassDecorator {\n return (target: object, propertyKey?: string | symbol) => {\n const metaTarget = propertyKey !== undefined ? target.constructor : target\n Reflect.defineMetadata(metaKey, value, metaTarget, propertyKey as string)\n }\n}\n\n/**\n * Reflector — reads metadata set by createDecorator or @SetMetadata.\n * NestJS-compatible Reflector with getAllAndOverride/getAllAndMerge.\n * HTTP-only per ADR D1.\n */\nexport class Reflector {\n /**\n * Read metadata set by a typed decorator created via createDecorator<T>().\n *\n * @example\n * ```ts\n * const Roles = createDecorator<string[]>()\n * const reflector = new Reflector()\n * const roles = reflector.get(Roles, handlerFn) // string[] | undefined\n * ```\n */\n get<T>(\n decorator: (value: T) => MethodDecorator & ClassDecorator,\n target: Function,\n propertyKey?: string | symbol,\n ): T | undefined {\n const key = (decorator as { key?: MetadataKey<T> }).key\n if (!key) return undefined\n if (propertyKey !== undefined) {\n return Reflect.getMetadata(key, target, propertyKey) as T | undefined\n }\n return Reflect.getMetadata(key, target) as T | undefined\n }\n\n /**\n * Read metadata set by @SetMetadata(key, value).\n */\n getByKey<T>(\n key: string | symbol,\n target: Function,\n propertyKey?: string | symbol,\n ): T | undefined {\n if (propertyKey !== undefined) {\n return Reflect.getMetadata(key, target, propertyKey) as T | undefined\n }\n return Reflect.getMetadata(key, target) as T | undefined\n }\n\n /**\n * Read metadata checking method-level first, then class-level.\n * Returns the first non-undefined value found.\n *\n * NestJS equivalent: `reflector.getAllAndOverride(ROLES_KEY, [context.getHandler(), context.getClass()])`\n *\n * @example\n * ```ts\n * const Roles = createDecorator<string[]>()\n * // In a guard:\n * const roles = reflector.getAllAndOverride(Roles, context.getClass(), context.getMethodName())\n * // Checks method-level @Roles first, falls back to class-level @Roles\n * ```\n */\n getAllAndOverride<T>(\n decorator: (value: T) => MethodDecorator & ClassDecorator,\n target: Function,\n propertyKey?: string | symbol,\n ): T | undefined {\n if (propertyKey !== undefined) {\n const methodLevel = this.get(decorator, target, propertyKey)\n if (methodLevel !== undefined) return methodLevel\n }\n return this.get(decorator, target)\n }\n\n /**\n * Read metadata checking method-level first, then class-level, by raw key.\n * Returns the first non-undefined value found.\n */\n getAllAndOverrideByKey<T>(\n key: string | symbol,\n target: Function,\n propertyKey?: string | symbol,\n ): T | undefined {\n if (propertyKey !== undefined) {\n const methodLevel = this.getByKey<T>(key, target, propertyKey)\n if (methodLevel !== undefined) return methodLevel\n }\n return this.getByKey<T>(key, target)\n }\n\n /**\n * Read metadata from both method-level and class-level, merging arrays.\n * Returns all found values as a flat array.\n *\n * NestJS equivalent: `reflector.getAllAndMerge(ROLES_KEY, [context.getHandler(), context.getClass()])`\n *\n * @example\n * ```ts\n * const Tags = createDecorator<string[]>()\n *\n * @Tags(['api'])\n * @Controller('cats')\n * class CatsCtrl {\n * @Tags(['read'])\n * @Get()\n * findAll() {}\n * }\n *\n * reflector.getAllAndMerge(Tags, CatsCtrl, 'findAll')\n * // → ['read', 'api'] (method + class merged)\n * ```\n */\n getAllAndMerge<T>(\n decorator: (value: T) => MethodDecorator & ClassDecorator,\n target: Function,\n propertyKey?: string | symbol,\n ): T extends (infer U)[] ? U[] : T[] {\n const result: unknown[] = []\n if (propertyKey !== undefined) {\n const methodLevel = this.get(decorator, target, propertyKey)\n if (methodLevel !== undefined) {\n if (Array.isArray(methodLevel)) result.push(...methodLevel)\n else result.push(methodLevel)\n }\n }\n const classLevel = this.get(decorator, target)\n if (classLevel !== undefined) {\n if (Array.isArray(classLevel)) result.push(...classLevel)\n else result.push(classLevel)\n }\n return result as T extends (infer U)[] ? U[] : T[]\n }\n}\n","/**\n * @Throttle() + @SkipThrottle() — NestJS-style rate limiting decorators.\n *\n * Thin bridge over @theokit/plugin-rate-limit. These decorators store\n * metadata that the rate-limit plugin reads at request time to override\n * or skip the global throttle config per route/controller.\n *\n * Usage:\n * ```ts\n * @Controller('api/tasks')\n * @Throttle({ limit: 100, ttl: 60_000 }) // 100 req/min for all routes\n * class TasksController {\n * @Get()\n * @SkipThrottle() // no rate limit on this route\n * health() { return { ok: true } }\n *\n * @Post()\n * @Throttle({ limit: 5, ttl: 60_000 }) // stricter: 5 req/min\n * create(@Body(schema) body) { ... }\n * }\n * ```\n */\nimport { setMeta, getMeta } from '../metadata/index.js'\n\nconst THROTTLE_KEY = Symbol.for('theokit:http-decorators:throttle')\nconst SKIP_THROTTLE_KEY = Symbol.for('theokit:http-decorators:skip-throttle')\n\nexport interface ThrottleOptions {\n /** Maximum requests within the TTL window. */\n limit: number\n /** Time-to-live in milliseconds. */\n ttl: number\n /** Optional throttle set name (for multiple throttler definitions). */\n name?: string\n}\n\n/**\n * Override the global rate limit for a controller or specific route.\n * NestJS equivalent: `@Throttle({ default: { limit, ttl } })`.\n */\nexport function Throttle(options: ThrottleOptions): ClassDecorator & MethodDecorator {\n return (target: object, propertyKey?: string | symbol) => {\n const actualTarget = propertyKey !== undefined ? target.constructor : target\n setMeta(THROTTLE_KEY, actualTarget, options, propertyKey)\n }\n}\n\n/**\n * Skip rate limiting for a controller or specific route.\n * NestJS equivalent: `@SkipThrottle()`.\n *\n * @param skip — defaults to `true`. Pass `false` to re-enable on a\n * specific route inside a skipped controller.\n */\nexport function SkipThrottle(skip = true): ClassDecorator & MethodDecorator {\n return (target: object, propertyKey?: string | symbol) => {\n const actualTarget = propertyKey !== undefined ? target.constructor : target\n setMeta(SKIP_THROTTLE_KEY, actualTarget, skip, propertyKey)\n }\n}\n\n/**\n * Read throttle metadata for a given class or method.\n * Used by the rate-limit plugin to resolve per-route overrides.\n */\nexport function getThrottleOptions(\n target: Function,\n propertyKey?: string | symbol,\n): ThrottleOptions | undefined {\n return getMeta<ThrottleOptions>(THROTTLE_KEY, target, propertyKey)\n}\n\n/**\n * Check if throttling is skipped for a given class or method.\n */\nexport function isThrottleSkipped(target: Function, propertyKey?: string | symbol): boolean {\n return getMeta<boolean>(SKIP_THROTTLE_KEY, target, propertyKey) ?? false\n}\n","import type { HttpVerb } from '../decorators/methods.js'\n\nimport { walkControllerMetadata, type WalkResult } from './walk-metadata.js'\n\nexport interface RouteRegistration {\n verb: HttpVerb\n fullPath: string\n walkResult: WalkResult\n}\n\n/**\n * Low-level API: walks decorator metadata per controller class and returns\n * structured route descriptors. Used internally by the Vite plugin (ADR D7)\n * and available to advanced consumers who don't use Vite.\n *\n * EC-5: deduplicates by class reference; warns on duplicates.\n */\nexport function registerControllers(controllers: Function[]): RouteRegistration[] {\n const seen = new Set<Function>()\n const unique: Function[] = []\n for (const Ctor of controllers) {\n if (seen.has(Ctor)) {\n console.warn(\n `[@theokit/http] Controller ${Ctor.name} registered multiple times — dropping duplicate`,\n )\n continue\n }\n seen.add(Ctor)\n unique.push(Ctor)\n }\n return unique.flatMap((Ctor) => {\n const walks = walkControllerMetadata(Ctor)\n return walks.map((w) => ({\n verb: w.verb,\n fullPath: w.fullPath,\n walkResult: w,\n }))\n })\n}\n","/* eslint-disable security/detect-non-literal-regexp --\n * Route patterns like /cats/:id are converted to regex at startup —\n * NOT from user HTTP input. The patterns come from decorator metadata\n * authored by the developer. No injection vector.\n */\nimport 'reflect-metadata'\n\nimport type { ExposeOptions } from '../decorators/expose.js'\nimport type { ParamEntry } from '../decorators/params.js'\nimport { ForbiddenException } from '../exceptions/http-exception.js'\n\nimport { resolveOrNew, type DiContainer } from './di-resolve.js'\nexport type { DiContainer } from './di-resolve.js'\nimport { runExceptionFilters } from './exception-filter-chain.js'\nimport {\n createExecutionContext,\n type CanActivate,\n type ExecutionContext,\n} from './execution-context.js'\nimport { runInterceptors } from './interceptor-chain.js'\nimport {\n MiddlewareConsumerImpl,\n runMiddleware,\n type ResolvedMiddleware,\n} from './middleware-consumer.js'\nimport { createNodeAdapter } from './runtime/node.js'\nimport { walkControllerMetadata, type WalkResult } from './walk-metadata.js'\n\n/**\n * M47 — serves an `@Expose`-bound agent route. http is agent-runtime agnostic (G1/G2): it invokes this\n * injected callback (theo supplies a `mountAgent`-backed impl) instead of calling a controller method.\n */\nexport type ServeAgent = (\n agent: unknown,\n request: Request,\n opts: ExposeOptions,\n) => Promise<Response>\n\nexport interface CreateDecoratorServerOptions {\n controllers: Function[]\n container?: DiContainer\n configure?: (consumer: MiddlewareConsumerImpl) => void\n /** M47 — required when any controller `@Expose`-binds an agent; serves the agent route. */\n serveAgent?: ServeAgent\n}\n\n/**\n * A pure Web-Standard controller handler: callable as `(request) => Response | null`\n * plus a non-executing `matches(method, pathname)` route probe (so a host can gate\n * — e.g. CSRF — before dispatch runs a handler).\n */\nexport interface DecoratorHandler {\n (request: Request): Promise<Response | null>\n /** True when a controller route owns `method` + `pathname` (no handler executed). */\n matches(method: string, pathname: string): boolean\n}\n\n/**\n * Build a pure Web-Standard request handler from decorated controller classes,\n * WITHOUT binding a network listener. Returns a {@link DecoratorHandler} whose\n * call returns `null` when no controller route matched — the caller decides the\n * miss (a standalone server answers 404; a host middleware falls through to its\n * own routing). This is the reusable dispatch seam consumed by the framework's\n * controller dispatch (#122) so it never re-implements match/bind/validate.\n */\nexport function createDecoratorHandler(\n controllersOrOpts: Function[] | CreateDecoratorServerOptions,\n): DecoratorHandler {\n const { controllers, container, configure, serveAgent } = Array.isArray(controllersOrOpts)\n ? {\n controllers: controllersOrOpts,\n container: undefined,\n configure: undefined,\n serveAgent: undefined,\n }\n : controllersOrOpts\n\n // Collect middleware\n const middlewareConsumer = new MiddlewareConsumerImpl(container)\n if (configure) configure(middlewareConsumer)\n const middlewareEntries = middlewareConsumer.getEntries()\n\n // Dedupe controllers (EC-5)\n const seen = new Set<Function>()\n const unique: Function[] = []\n for (const Ctor of controllers) {\n if (seen.has(Ctor)) continue\n seen.add(Ctor)\n unique.push(Ctor)\n }\n\n // Walk metadata\n const routes: { walk: WalkResult; instance: object }[] = []\n for (const Ctor of unique) {\n const instance = resolveOrNew(Ctor, container)\n const walks = walkControllerMetadata(Ctor)\n for (const w of walks) {\n routes.push({ walk: w, instance })\n }\n }\n\n // Sort: static routes first\n routes.sort((a, b) => {\n const aP = a.walk.fullPath.includes(':')\n const bP = b.walk.fullPath.includes(':')\n if (aP !== bP) return aP ? 1 : -1\n return 0\n })\n\n const handler = ((request: Request) =>\n handleRequest(routes, request, container, middlewareEntries, serveAgent)) as DecoratorHandler\n handler.matches = (method: string, pathname: string): boolean =>\n findRoute(routes, method.toUpperCase(), pathname) !== null\n return handler\n}\n\n/**\n * Creates a real HTTP server from decorated controller classes.\n * Uses Web Standard Request/Response internally; Node adapter at the boundary.\n */\nexport function createDecoratorServer(\n controllersOrOpts: Function[] | CreateDecoratorServerOptions,\n) {\n const handle = createDecoratorHandler(controllersOrOpts)\n // Standalone server: a no-match (handler returns null) becomes a 404.\n const adapter = createNodeAdapter()\n return adapter.createServer(async (request: Request) => {\n const res = await handle(request)\n if (res) return res\n const { pathname } = new URL(request.url)\n return jsonResponse(404, {\n error: {\n code: 'NOT_FOUND',\n message: `No route for ${request.method.toUpperCase()} ${pathname}`,\n },\n })\n })\n}\n\n// ─── Web Standard request handler ────────────────────────────\n\nasync function handleRequest(\n routes: { walk: WalkResult; instance: object }[],\n request: Request,\n container?: DiContainer,\n middlewareEntries: ResolvedMiddleware[] = [],\n serveAgent?: ServeAgent,\n): Promise<Response | null> {\n const url = new URL(request.url)\n const method = request.method.toUpperCase()\n const pathname = url.pathname\n\n const match = findRoute(routes, method, pathname)\n // null = no controller route matched; the caller owns the miss (404 or fall-through).\n if (!match) return null\n\n const { walk, instance, params } = match\n\n try {\n // Middleware\n const mwResponse = await runMiddleware(middlewareEntries, request, pathname)\n if (mwResponse) return mwResponse\n\n // Guards\n const ctx = createExecutionContext(request, instance.constructor, walk.propertyKey)\n const guardResponse = await runGuards(walk.guards, ctx, container)\n if (guardResponse) return guardResponse\n\n // M47 — an @Expose-bound route is served by the injected agent runtime (mountAgent, via theo), AFTER\n // guards (auth applies to agents — G5) and NEVER as a JSON controller method. http stays agnostic.\n if (walk.agent) {\n if (!serveAgent) {\n return jsonResponse(500, {\n error: {\n code: 'AGENT_SERVER_NOT_WIRED',\n message:\n `Controller route ${String(walk.propertyKey)} is @Expose-bound but no serveAgent was ` +\n `provided to createDecoratorHandler. The framework must wire serveAgent (mountAgent).`,\n },\n })\n }\n return await serveAgent(walk.agent.module, request, walk.agent.opts)\n }\n\n // Body\n const body = await resolveBody(method, request, walk)\n if (body instanceof Response) return body // validation error response\n\n // Build args\n const args = buildArgs(walk.paramEntries, {\n request,\n body,\n params,\n query: Object.fromEntries(url.searchParams),\n })\n\n // Redirect\n if (walk.redirect) {\n return new Response(null, {\n status: walk.redirect.status,\n headers: { location: walk.redirect.url },\n })\n }\n\n const handlerFn = (instance as Record<string | symbol, Function>)[walk.propertyKey]\n\n // Interceptors wrap handler\n const result = await runInterceptors(\n walk.interceptors,\n () => handlerFn.apply(instance, args) as Promise<unknown>,\n request,\n container,\n )\n\n // A handler may return a Web `Response` directly (Set-Cookie, custom status /\n // headers) — parity with file-based `route()`. Pass it through untouched\n // instead of JSON-stringifying it into `{}`.\n if (result instanceof Response) return result\n\n return buildResponse(result, walk, method)\n } catch (err) {\n return runExceptionFilters(err, walk.filters, request, container)\n }\n}\n\n// ─── Guards (return Response on rejection, null on pass) ─────\n\nasync function runGuards(\n guards: Function[],\n context: ExecutionContext,\n container?: DiContainer,\n): Promise<Response | null> {\n for (const GuardCtor of guards) {\n const guard = resolveOrNew(GuardCtor, container) as CanActivate\n const allowed = await guard.canActivate(context)\n if (!allowed) {\n const ex = new ForbiddenException('Forbidden resource')\n return jsonResponse(ex.statusCode, ex.toJSON())\n }\n }\n return null\n}\n\n// ─── Body resolution ─────────────────────────────────────────\n\nasync function resolveBody(method: string, request: Request, walk: WalkResult): Promise<unknown> {\n if (!['POST', 'PUT', 'PATCH'].includes(method)) return undefined\n\n let body: unknown\n try {\n const text = await request.text()\n body = text ? JSON.parse(text) : undefined\n } catch {\n body = undefined\n }\n\n if (walk.bodySchema && body !== undefined) {\n const result = walk.bodySchema.safeParse(body)\n if (!result.success) {\n return jsonResponse(422, { error: { code: 'VALIDATION_ERROR', issues: result.error.issues } })\n }\n body = result.data\n }\n return body\n}\n\n// ─── Response builder ────────────────────────────────────────\n\nfunction buildResponse(result: unknown, walk: WalkResult, method: string): Response {\n const status = walk.status ?? (method === 'POST' ? 201 : 200)\n const headers: Record<string, string> = { 'content-type': 'application/json' }\n for (const [name, value] of walk.headers) {\n headers[name.toLowerCase()] = value\n }\n\n if (result === undefined || result === null) {\n return new Response(null, { status: status === 200 ? 204 : status, headers })\n }\n\n if (typeof result === 'string') {\n headers['content-type'] = 'text/plain'\n return new Response(result, { status, headers })\n }\n\n return new Response(JSON.stringify(result), { status, headers })\n}\n\nfunction jsonResponse(status: number, body: unknown): Response {\n return new Response(JSON.stringify(body), {\n status,\n headers: { 'content-type': 'application/json' },\n })\n}\n\n// ─── Route matching ──────────────────────────────────────────\n\ninterface RouteMatch {\n walk: WalkResult\n instance: object\n params: Record<string, string>\n}\n\nfunction findRoute(\n routes: { walk: WalkResult; instance: object }[],\n method: string,\n pathname: string,\n): RouteMatch | null {\n for (const { walk, instance } of routes) {\n if (walk.verb !== 'ALL' && walk.verb !== method) continue\n const params = matchPath(walk.fullPath, pathname)\n if (params !== null) return { walk, instance, params }\n }\n return null\n}\n\nfunction matchPath(pattern: string, pathname: string): Record<string, string> | null {\n const paramNames: string[] = []\n const regexStr = pattern.replace(/:(\\w+)/g, (_m, name: string) => {\n paramNames.push(name)\n return '([^/]+)'\n })\n const match = new RegExp(`^${regexStr}$`).exec(pathname)\n if (!match) return null\n const params: Record<string, string> = {}\n paramNames.forEach((name, i) => {\n params[name] = match[i + 1]\n })\n return params\n}\n\n// ─── Argument builder ────────────────────────────────────────\n\ninterface ArgContext {\n request: Request\n body: unknown\n params: Record<string, string>\n query: Record<string, string>\n}\n\nfunction buildArgs(paramEntries: ParamEntry[], ctx: ArgContext): unknown[] {\n if (paramEntries.length === 0) return []\n const maxIndex = Math.max(...paramEntries.map((p) => p.index))\n const args: unknown[] = Array.from({ length: maxIndex + 1 }, () => undefined)\n for (const p of paramEntries) {\n switch (p.source) {\n case 'req':\n args[p.index] = ctx.request\n break\n case 'body':\n args[p.index] = p.key ? (ctx.body as Record<string, unknown>)[p.key] : ctx.body\n break\n case 'param':\n args[p.index] = p.key ? ctx.params[p.key] : ctx.params\n break\n case 'query':\n args[p.index] = p.key ? ctx.query[p.key] : ctx.query\n break\n case 'headers':\n args[p.index] = p.key\n ? ctx.request.headers.get(p.key.toLowerCase())\n : Object.fromEntries(ctx.request.headers.entries())\n break\n case 'ip':\n args[p.index] = ctx.request.headers.get('x-forwarded-for') ?? '127.0.0.1'\n break\n case 'session':\n args[p.index] = undefined\n break\n default:\n args[p.index] = undefined\n }\n }\n return args\n}\n","/**\n * Typed Client — end-to-end type inference from route contracts.\n *\n * Zero codegen, zero runtime overhead on types. The developer defines\n * a route map using `contract()`, and `createTypedClient<T>()` infers\n * request body + response types automatically.\n */\nimport type { z } from 'zod'\n\n// ── Route Map types ──\n\nexport interface RouteDefinition {\n body?: z.ZodType\n params?: Record<string, 'string' | 'number'>\n query?: Record<string, 'string' | 'number' | 'boolean'>\n response: unknown\n}\n\nexport type RouteMap = Record<string, RouteDefinition>\n\n// ── Type extraction ──\n\ntype InferBody<D> = D extends { body: z.ZodType } ? z.infer<D['body']> : never\ntype InferResponse<D> = D extends { response: infer R } ? R : unknown\n\n// ── Client interface (simplified — works with strict DTS) ──\n\nexport interface TypedClient<M extends RouteMap> {\n get<P extends string>(\n path: P,\n opts?: { query?: Record<string, string>; headers?: Record<string, string> },\n ): Promise<InferResponse<M[`GET ${P}`]>>\n\n post<P extends string>(\n path: P,\n body?: InferBody<M[`POST ${P}`]>,\n opts?: { headers?: Record<string, string> },\n ): Promise<InferResponse<M[`POST ${P}`]>>\n\n put<P extends string>(\n path: P,\n body?: InferBody<M[`PUT ${P}`]>,\n opts?: { headers?: Record<string, string> },\n ): Promise<InferResponse<M[`PUT ${P}`]>>\n\n delete<P extends string>(\n path: P,\n opts?: { headers?: Record<string, string> },\n ): Promise<InferResponse<M[`DELETE ${P}`]>>\n}\n\n// ── Client factory ──\n\nexport function createTypedClient<M extends RouteMap>(\n baseUrl: string,\n defaultHeaders?: Record<string, string>,\n): TypedClient<M> {\n async function request(\n method: string,\n path: string,\n body?: unknown,\n opts?: { headers?: Record<string, string>; query?: Record<string, string> },\n ) {\n const url = new URL(path, baseUrl)\n if (opts?.query) {\n for (const [k, v] of Object.entries(opts.query)) url.searchParams.set(k, v)\n }\n const headers: Record<string, string> = { ...defaultHeaders, ...opts?.headers }\n if (body !== undefined) headers['content-type'] = 'application/json'\n\n const res = await fetch(url.toString(), {\n method,\n headers,\n body: body !== undefined ? JSON.stringify(body) : undefined,\n })\n\n if (!res.ok) {\n const error = await res.json().catch(() => ({ message: res.statusText }))\n throw new TypedClientError(res.status, error as Record<string, unknown>)\n }\n\n if (res.status === 204) return undefined\n return res.json()\n }\n\n return {\n get: (path: string, opts?: Record<string, unknown>) => request('GET', path, undefined, opts),\n post: (path: string, body?: unknown, opts?: Record<string, unknown>) =>\n request('POST', path, body, opts),\n put: (path: string, body?: unknown, opts?: Record<string, unknown>) =>\n request('PUT', path, body, opts),\n delete: (path: string, opts?: Record<string, unknown>) =>\n request('DELETE', path, undefined, opts),\n } as TypedClient<M>\n}\n\nexport class TypedClientError extends Error {\n constructor(\n public readonly status: number,\n public readonly body: Record<string, unknown>,\n ) {\n super(`HTTP ${status}: ${JSON.stringify(body)}`)\n this.name = 'TypedClientError'\n }\n}\n","/**\n * Route Contract — type-level bridge between @Controller and TypedClient.\n *\n * The developer defines a contract object mapping routes to their types.\n * This object is the single source of truth for both server validation\n * and client type inference.\n *\n * @example\n * ```ts\n * // server/contracts.ts — shared between server and client\n * import { z } from 'zod'\n * import { contract } from '@theokit/http'\n *\n * export const zCreateTask = z.object({\n * title: z.string().min(3),\n * priority: z.enum(['low', 'medium', 'high']).default('medium'),\n * })\n *\n * export interface Task { id: number; title: string; priority: string; done: boolean }\n *\n * export const routes = contract({\n * 'GET /api/tasks': { response: [] as Task[] },\n * 'GET /api/tasks/:id': { response: {} as Task },\n * 'POST /api/tasks': { body: zCreateTask, response: {} as Task },\n * 'PUT /api/tasks/:id': { body: z.object({ done: z.boolean() }), response: {} as Task },\n * 'DELETE /api/tasks/:id': { response: undefined as void },\n * })\n * export type AppRoutes = typeof routes\n * ```\n *\n * The `contract()` function is identity at runtime (zero overhead) but\n * enforces the RouteMap type at the type level, enabling full inference.\n */\nimport type { RouteMap } from './typed-client.js'\n\n/**\n * Identity function that enforces RouteMap type constraint.\n * Zero runtime overhead — exists only for type inference.\n */\nexport function contract<T extends RouteMap>(routes: T): T {\n return routes\n}\n","/**\n * Error digestion — converts any thrown value into a stable hash + context.\n *\n * Inspired by Next.js `create-error-handler.tsx`. Produces a deterministic\n * digest ID suitable for logging and client-safe error references without\n * leaking stack traces in production.\n *\n * Uses djb2 hash (sync, no crypto dependency) per ADR D3.\n */\n\nimport { HttpException } from './exceptions/http-exception.js'\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport interface ErrorContext {\n route?: string\n phase?: 'guard' | 'interceptor' | 'handler' | 'filter' | 'agent'\n source?: string\n}\n\nexport interface DigestedError {\n digest: string\n message: string\n status: number\n context: ErrorContext\n stack?: string\n}\n\n// ---------------------------------------------------------------------------\n// djb2 hash — deterministic, sync, no crypto dependency\n// ---------------------------------------------------------------------------\n\nfunction djb2(input: string): string {\n let hash = 5381\n for (let i = 0; i < input.length; i++) {\n // hash * 33 + charCode — classic djb2\n hash = ((hash << 5) + hash + input.charCodeAt(i)) | 0\n }\n // Convert to unsigned 32-bit hex\n return (hash >>> 0).toString(16)\n}\n\n// ---------------------------------------------------------------------------\n// Core\n// ---------------------------------------------------------------------------\n\n/**\n * Converts any thrown value into a structured {@link DigestedError}.\n *\n * - Sync (never async) — safe to call inside catch blocks.\n * - Stack trace stripped when `process.env.NODE_ENV === 'production'`.\n * - Preserves {@link HttpException} status codes.\n * - Handles non-Error throws (string, number, object).\n */\nexport function digestError(err: unknown, context: ErrorContext = {}): DigestedError {\n const message = extractMessage(err)\n const status = extractStatus(err)\n const rawStack = extractStack(err)\n\n const digest = djb2(message)\n\n const isProduction = process.env.NODE_ENV === 'production'\n\n return {\n digest,\n message,\n status,\n context,\n ...(rawStack && !isProduction ? { stack: rawStack } : {}),\n }\n}\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nfunction extractMessage(err: unknown): string {\n if (err instanceof Error) {\n return err.message\n }\n if (typeof err === 'string') {\n return err\n }\n if (typeof err === 'number') {\n return String(err)\n }\n // object / null / undefined / symbol / bigint\n try {\n return JSON.stringify(err)\n } catch {\n return 'Unknown error'\n }\n}\n\nfunction extractStatus(err: unknown): number {\n if (err instanceof HttpException) {\n return err.statusCode\n }\n return 500\n}\n\nfunction extractStack(err: unknown): string | undefined {\n if (err instanceof Error) {\n return err.stack\n }\n return undefined\n}\n","/**\n * Component tree composition — recursive wrapping of file-convention\n * components (layout, page, loading, error, not-found) into a React\n * element tree with Suspense and error boundaries.\n *\n * Inspired by Next.js `create-component-tree.tsx`.\n *\n * React is loaded via dynamic `import('react')` because it is an\n * optional peerDep of @theokit/http (EC-2).\n */\n\nimport type * as ReactTypes from 'react'\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport interface RouteTree {\n layout?: ReactTypes.ComponentType<{ children: ReactTypes.ReactNode }>\n page?: ReactTypes.ComponentType\n loading?: ReactTypes.ComponentType\n error?: ReactTypes.ComponentType\n notFound?: ReactTypes.ComponentType\n children?: Record<string, RouteTree>\n}\n\n// ---------------------------------------------------------------------------\n// Error boundary — minimal class component wrapping error.tsx\n// ---------------------------------------------------------------------------\n\n/**\n * Creates an ErrorBoundary class component using the provided React module.\n * Must be a class component — React has no hook-based error boundary API.\n */\nfunction createErrorBoundary(\n React: typeof ReactTypes,\n FallbackComponent: ReactTypes.ComponentType,\n): ReactTypes.ComponentType<{ children: ReactTypes.ReactNode }> {\n return class ErrorBoundary extends React.Component<\n { children: ReactTypes.ReactNode },\n { hasError: boolean }\n > {\n constructor(props: { children: ReactTypes.ReactNode }) {\n super(props)\n this.state = { hasError: false }\n }\n\n static getDerivedStateFromError(): { hasError: boolean } {\n return { hasError: true }\n }\n\n render(): ReactTypes.ReactElement | null {\n if (this.state.hasError) {\n return React.createElement(FallbackComponent)\n }\n return React.createElement(React.Fragment, null, this.props.children)\n }\n }\n}\n\n// ---------------------------------------------------------------------------\n// Core\n// ---------------------------------------------------------------------------\n\n/**\n * Composes a {@link RouteTree} into a nested React element tree.\n *\n * Wrapping order (outermost → innermost):\n * layout → ErrorBoundary(error) → Suspense(loading) → page\n *\n * Returns `null` when no `page` component is found in the tree.\n *\n * @param tree - The route tree describing file conventions found.\n * @returns A React element or `null`.\n */\nexport async function composeComponentTree(\n tree: RouteTree,\n): Promise<ReactTypes.ReactElement | null> {\n // Dynamic import — React is optional peerDep\n const React = await import('react')\n\n return composeNode(React, tree)\n}\n\nfunction composeNode(React: typeof ReactTypes, node: RouteTree): ReactTypes.ReactElement | null {\n const { layout: Layout, page: Page, loading: Loading, error: ErrorFallback } = node\n\n // No page → nothing to render\n if (!Page) {\n return null\n }\n\n // Start with the page element\n let element: ReactTypes.ReactElement = React.createElement(Page)\n\n // Wrap with Suspense if loading component exists\n if (Loading) {\n element = React.createElement(\n React.Suspense,\n { fallback: React.createElement(Loading) },\n element,\n )\n }\n\n // Wrap with error boundary if error component exists\n if (ErrorFallback) {\n const Boundary = createErrorBoundary(React, ErrorFallback)\n element = React.createElement(Boundary, null, element)\n }\n\n // Wrap with layout if it exists\n if (Layout) {\n element = React.createElement(Layout, null, element)\n }\n\n return element\n}\n","/**\n * Cache revalidation signals — runtime-agnostic intent layer.\n *\n * Controllers/agents call `revalidateTag('tasks')` or `revalidatePath('/api/tasks')`\n * to signal that cached data is stale. The signals are collected in the request\n * context and consumed by the cache engine (when present).\n *\n * In standalone @theokit/http (no full theokit framework), signals are stored\n * but not executed — no cache engine is wired. When theokit is present, the\n * cache engine reads signals from the request context after the handler completes.\n *\n * Inspired by Next.js cache-signal.ts + revalidateTag/revalidatePath API.\n */\nimport { tryGetRequestContext } from './request-context.js'\n\nexport interface RevalidationSignal {\n kind: 'tag' | 'path'\n value: string\n timestamp: number\n}\n\n/**\n * Signal that a cache tag should be revalidated.\n *\n * Safe to call from any request handler (controller, agent, action).\n * Signals are accumulated per-request and consumed by the cache engine.\n *\n * @example\n * ```typescript\n * import { revalidateTag } from '@theokit/http'\n *\n * @Post()\n * async createTask(@Body(schema) body) {\n * const task = await db.tasks.create(body)\n * revalidateTag('tasks') // invalidate cached task lists\n * return task\n * }\n * ```\n */\nexport function revalidateTag(tag: string): void {\n collectSignal({ kind: 'tag', value: tag, timestamp: Date.now() })\n}\n\n/**\n * Signal that a cached path should be revalidated.\n *\n * @example\n * ```typescript\n * import { revalidatePath } from '@theokit/http'\n *\n * @Delete(':id')\n * async removeTask(@Param('id') id: string) {\n * await db.tasks.delete(id)\n * revalidatePath('/api/tasks')\n * }\n * ```\n */\nexport function revalidatePath(path: string): void {\n collectSignal({ kind: 'path', value: path, timestamp: Date.now() })\n}\n\n/**\n * Get all revalidation signals collected during the current request.\n * Called by the cache engine after the handler completes.\n */\nexport function getRevalidationSignals(): RevalidationSignal[] {\n const ctx = tryGetRequestContext()\n if (!ctx) return []\n return (\n (ctx as unknown as { _revalidationSignals?: RevalidationSignal[] })._revalidationSignals ?? []\n )\n}\n\n// ── Internal ──\n\nfunction collectSignal(signal: RevalidationSignal): void {\n const ctx = tryGetRequestContext()\n if (!ctx) {\n console.warn(\n '[theokit] revalidateTag/revalidatePath called outside a request context. Signal ignored.',\n )\n return\n }\n const extended = ctx as unknown as { _revalidationSignals?: RevalidationSignal[] }\n extended._revalidationSignals ??= []\n extended._revalidationSignals.push(signal)\n}\n"],"mappings":"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","names":["inferPrefix","className","stripped","replace","kebab","toLowerCase","Controller","prefixOrOpts","maybeOpts","target","prefix","opts","name","setMeta","CONTROLLER_PREFIX","host","makeVerbDecorator","verb","path","target","propertyKey","existing","getMeta","ROUTE_METHODS","push","setMeta","Get","Post","Put","Patch","Delete","Options","Head","All","isZodSchema","v","undefined","safeParse","makeParamDecorator","source","keyOrSchema","target","propertyKey","parameterIndex","map","getMeta","ROUTE_PARAMS","Map","entries","get","entry","index","key","schema","push","set","setMeta","Req","Body","Param","Query","Headers","Session","Ip","HostParam","Res","opts","passthrough","Expose","agent","opts","target","propertyKey","existing","getMeta","EXPOSE_AGENT","push","setMeta","HttpCode","status","target","propertyKey","setMeta","ROUTE_STATUS","Header","name","value","existing","getMeta","ROUTE_HEADERS","push","Redirect","url","ROUTE_REDIRECT","UseGuards","guards","target","propertyKey","actualTarget","existing","getMeta","USE_GUARDS","setMeta","UseInterceptors","interceptors","USE_INTERCEPTORS","UseFilters","filters","USE_FILTERS","Catch","exceptions","CATCH_EXCEPTIONS","decoratorKeyCounter","createDecorator","key","Symbol","for","decorator","value","target","propertyKey","metaTarget","undefined","Reflect","defineMetadata","SetMetadata","metaKey","Reflector","get","getMetadata","getByKey","getAllAndOverride","methodLevel","getAllAndOverrideByKey","getAllAndMerge","result","Array","isArray","push","classLevel","THROTTLE_KEY","Symbol","for","SKIP_THROTTLE_KEY","Throttle","options","target","propertyKey","actualTarget","undefined","setMeta","SkipThrottle","skip","getThrottleOptions","getMeta","isThrottleSkipped","registerControllers","controllers","seen","Set","unique","Ctor","has","console","warn","name","add","push","flatMap","walks","walkControllerMetadata","map","w","verb","fullPath","walkResult","createDecoratorHandler","controllersOrOpts","controllers","container","configure","serveAgent","Array","isArray","undefined","middlewareConsumer","MiddlewareConsumerImpl","middlewareEntries","getEntries","seen","Set","unique","Ctor","has","add","push","routes","instance","resolveOrNew","walks","walkControllerMetadata","w","walk","sort","a","b","aP","fullPath","includes","bP","handler","request","handleRequest","matches","method","pathname","findRoute","toUpperCase","createDecoratorServer","handle","adapter","createNodeAdapter","createServer","res","URL","url","jsonResponse","error","code","message","match","params","mwResponse","runMiddleware","ctx","createExecutionContext","propertyKey","guardResponse","runGuards","guards","agent","String","module","opts","body","resolveBody","Response","args","buildArgs","paramEntries","query","Object","fromEntries","searchParams","redirect","status","headers","location","handlerFn","result","runInterceptors","interceptors","apply","buildResponse","err","runExceptionFilters","filters","context","GuardCtor","guard","allowed","canActivate","ex","ForbiddenException","statusCode","toJSON","text","JSON","parse","bodySchema","safeParse","success","issues","data","name","value","toLowerCase","stringify","verb","matchPath","pattern","paramNames","regexStr","replace","_m","RegExp","exec","forEach","i","length","maxIndex","Math","max","map","p","index","from","source","key","get","entries","createTypedClient","baseUrl","defaultHeaders","request","method","path","body","opts","url","URL","query","k","v","Object","entries","searchParams","set","headers","undefined","res","fetch","toString","JSON","stringify","ok","error","json","catch","message","statusText","TypedClientError","status","get","post","put","delete","Error","name","contract","routes","djb2","input","hash","i","length","charCodeAt","toString","digestError","err","context","message","extractMessage","status","extractStatus","rawStack","extractStack","digest","isProduction","process","env","NODE_ENV","stack","Error","String","JSON","stringify","HttpException","statusCode","undefined","createErrorBoundary","React","FallbackComponent","ErrorBoundary","Component","props","state","hasError","getDerivedStateFromError","render","createElement","Fragment","children","composeComponentTree","tree","composeNode","node","layout","Layout","page","Page","loading","Loading","error","ErrorFallback","element","Suspense","fallback","Boundary","revalidateTag","tag","collectSignal","kind","value","timestamp","Date","now","revalidatePath","path","getRevalidationSignals","ctx","tryGetRequestContext","_revalidationSignals","signal","console","warn","extended","push"]}
|
|
1
|
+
{"version":3,"sources":["../src/decorators/controller.ts","../src/decorators/methods.ts","../src/decorators/params.ts","../src/decorators/expose.ts","../src/decorators/response.ts","../src/decorators/middleware.ts","../src/decorators/set-metadata.ts","../src/decorators/throttle.ts","../src/bridge/register-controllers.ts","../src/bridge/create-server.ts","../src/typed-client.ts","../src/contract.ts","../src/error-digest.ts","../src/component-tree.ts","../src/cache-signal.ts"],"mappings":"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","names":["inferPrefix","className","stripped","replace","kebab","toLowerCase","Controller","prefixOrOpts","maybeOpts","target","prefix","opts","name","setMeta","CONTROLLER_PREFIX","host","makeVerbDecorator","verb","path","target","propertyKey","existing","getMeta","ROUTE_METHODS","push","setMeta","Get","Post","Put","Patch","Delete","Options","Head","All","isZodSchema","v","undefined","safeParse","makeParamDecorator","source","keyOrSchema","target","propertyKey","parameterIndex","map","getMeta","ROUTE_PARAMS","Map","entries","get","entry","index","key","schema","push","set","setMeta","Req","Body","Param","Query","Headers","Session","Ip","HostParam","Res","opts","passthrough","Expose","agent","opts","target","propertyKey","existing","getMeta","EXPOSE_AGENT","push","setMeta","HttpCode","status","target","propertyKey","setMeta","ROUTE_STATUS","Header","name","value","existing","getMeta","ROUTE_HEADERS","push","Redirect","url","ROUTE_REDIRECT","UseGuards","guards","target","propertyKey","actualTarget","existing","getMeta","USE_GUARDS","setMeta","UseInterceptors","interceptors","USE_INTERCEPTORS","UseFilters","filters","USE_FILTERS","Catch","exceptions","CATCH_EXCEPTIONS","decoratorKeyCounter","createDecorator","key","Symbol","for","decorator","value","target","propertyKey","metaTarget","undefined","Reflect","defineMetadata","SetMetadata","metaKey","Reflector","get","getMetadata","getByKey","getAllAndOverride","methodLevel","getAllAndOverrideByKey","getAllAndMerge","result","Array","isArray","push","classLevel","THROTTLE_KEY","Symbol","for","SKIP_THROTTLE_KEY","Throttle","options","target","propertyKey","actualTarget","undefined","setMeta","SkipThrottle","skip","getThrottleOptions","getMeta","isThrottleSkipped","registerControllers","controllers","seen","Set","unique","Ctor","has","console","warn","name","add","push","flatMap","walks","walkControllerMetadata","map","w","verb","fullPath","walkResult","createDecoratorHandler","controllersOrOpts","controllers","container","configure","serveAgent","Array","isArray","undefined","middlewareConsumer","MiddlewareConsumerImpl","middlewareEntries","getEntries","seen","Set","unique","Ctor","has","add","push","routes","instance","resolveOrNew","walks","walkControllerMetadata","w","walk","sort","a","b","aP","fullPath","includes","bP","handler","request","handleRequest","matches","method","pathname","findRoute","toUpperCase","createDecoratorServer","handle","adapter","createNodeAdapter","createServer","res","URL","url","jsonResponse","error","code","message","match","params","mwResponse","runMiddleware","ctx","createExecutionContext","propertyKey","guardResponse","runGuards","guards","agent","String","module","opts","body","resolveBody","Response","args","buildArgs","paramEntries","query","Object","fromEntries","searchParams","redirect","status","headers","location","handlerFn","result","runInterceptors","interceptors","apply","buildResponse","err","runExceptionFilters","filters","context","GuardCtor","guard","allowed","canActivate","ex","ForbiddenException","statusCode","toJSON","text","JSON","parse","bodySchema","safeParse","success","issues","data","name","value","toLowerCase","stringify","verb","matchPath","pattern","paramNames","regexStr","replace","_m","RegExp","exec","forEach","i","length","maxIndex","Math","max","map","p","index","from","source","key","get","entries","createTypedClient","baseUrl","defaultHeaders","request","method","path","body","opts","url","URL","query","k","v","Object","entries","searchParams","set","headers","undefined","res","fetch","toString","JSON","stringify","ok","error","json","catch","message","statusText","TypedClientError","status","get","post","put","delete","Error","name","contract","routes","djb2","input","hash","i","length","charCodeAt","toString","digestError","err","context","message","extractMessage","status","extractStatus","rawStack","extractStack","digest","isProduction","process","env","NODE_ENV","stack","Error","String","JSON","stringify","HttpException","statusCode","undefined","createErrorBoundary","React","FallbackComponent","ErrorBoundary","Component","props","state","hasError","getDerivedStateFromError","render","createElement","Fragment","children","composeComponentTree","tree","composeNode","node","layout","Layout","page","Page","loading","Loading","error","ErrorFallback","element","Suspense","fallback","Boundary","revalidateTag","tag","collectSignal","kind","value","timestamp","Date","now","revalidatePath","path","getRevalidationSignals","ctx","tryGetRequestContext","_revalidationSignals","signal","console","warn","extended","push"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":[],"mappings":"","names":[]}
|
package/dist/runtime-node.js
CHANGED
package/dist/runtime-node.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":[],"
|
|
1
|
+
{"version":3,"sources":[],"mappings":"","names":[]}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Server-Inserted HTML — late-stage HTML injection.
|
|
3
|
+
*
|
|
4
|
+
* Inspired by Next.js make-get-server-inserted-html.tsx (app-render/).
|
|
5
|
+
* Stateful closure pattern that allows adding HTML chunks during SSR
|
|
6
|
+
* (polyfills, traces, analytics) and flushing them once.
|
|
7
|
+
*
|
|
8
|
+
* Chunks are deduped by id — adding the same id twice replaces the content.
|
|
9
|
+
* flush() returns all pending chunks and marks them as flushed so they
|
|
10
|
+
* are not returned again on subsequent calls.
|
|
11
|
+
*/
|
|
12
|
+
/** Interface for managing server-inserted HTML chunks. */
|
|
13
|
+
interface ServerInsertedHTML {
|
|
14
|
+
/** Add an HTML chunk with a dedup key. Adding the same id replaces content. */
|
|
15
|
+
add(id: string, html: string): void;
|
|
16
|
+
/** Return all pending (unflushed) chunks and mark them as flushed. */
|
|
17
|
+
flush(): string[];
|
|
18
|
+
/** Clear all state — both pending and flushed. */
|
|
19
|
+
reset(): void;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Create a new ServerInsertedHTML manager.
|
|
23
|
+
*
|
|
24
|
+
* @example
|
|
25
|
+
* ```typescript
|
|
26
|
+
* const inserted = createServerInsertedHTML()
|
|
27
|
+
* inserted.add('polyfill', '<script src="/polyfill.js"></script>')
|
|
28
|
+
* inserted.add('trace', '<meta name="trace-id" content="abc123">')
|
|
29
|
+
* const chunks = inserted.flush() // returns both chunks
|
|
30
|
+
* const empty = inserted.flush() // returns [] (already flushed)
|
|
31
|
+
* ```
|
|
32
|
+
*/
|
|
33
|
+
declare function createServerInsertedHTML(): ServerInsertedHTML;
|
|
34
|
+
|
|
35
|
+
export { type ServerInsertedHTML, createServerInsertedHTML };
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import {
|
|
2
|
+
__name
|
|
3
|
+
} from "./chunk-Z4QWC7IK.js";
|
|
4
|
+
|
|
5
|
+
// src/server-inserted-html.ts
|
|
6
|
+
function createServerInsertedHTML() {
|
|
7
|
+
const pending = /* @__PURE__ */ new Map();
|
|
8
|
+
const flushed = /* @__PURE__ */ new Set();
|
|
9
|
+
return {
|
|
10
|
+
add(id, html) {
|
|
11
|
+
pending.set(id, html);
|
|
12
|
+
flushed.delete(id);
|
|
13
|
+
},
|
|
14
|
+
flush() {
|
|
15
|
+
const chunks = [];
|
|
16
|
+
for (const [id, html] of pending) {
|
|
17
|
+
if (!flushed.has(id)) {
|
|
18
|
+
chunks.push(html);
|
|
19
|
+
flushed.add(id);
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
for (const id of flushed) {
|
|
23
|
+
pending.delete(id);
|
|
24
|
+
}
|
|
25
|
+
return chunks;
|
|
26
|
+
},
|
|
27
|
+
reset() {
|
|
28
|
+
pending.clear();
|
|
29
|
+
flushed.clear();
|
|
30
|
+
}
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
__name(createServerInsertedHTML, "createServerInsertedHTML");
|
|
34
|
+
export {
|
|
35
|
+
createServerInsertedHTML
|
|
36
|
+
};
|
|
37
|
+
//# sourceMappingURL=server-inserted-html.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/server-inserted-html.ts"],"mappings":";;;;;AAqCO,SAASA,2BAAAA;AACd,QAAMC,UAAU,oBAAIC,IAAAA;AACpB,QAAMC,UAAU,oBAAIC,IAAAA;AAEpB,SAAO;IACLC,IAAIC,IAAYC,MAAY;AAC1BN,cAAQO,IAAIF,IAAIC,IAAAA;AAEhBJ,cAAQM,OAAOH,EAAAA;IACjB;IAEAI,QAAAA;AACE,YAAMC,SAAmB,CAAA;AACzB,iBAAW,CAACL,IAAIC,IAAAA,KAASN,SAAS;AAChC,YAAI,CAACE,QAAQS,IAAIN,EAAAA,GAAK;AACpBK,iBAAOE,KAAKN,IAAAA;AACZJ,kBAAQE,IAAIC,EAAAA;QACd;MACF;AAEA,iBAAWA,MAAMH,SAAS;AACxBF,gBAAQQ,OAAOH,EAAAA;MACjB;AACA,aAAOK;IACT;IAEAG,QAAAA;AACEb,cAAQc,MAAK;AACbZ,cAAQY,MAAK;IACf;EACF;AACF;AA/BgBf;","names":["createServerInsertedHTML","pending","Map","flushed","Set","add","id","html","set","delete","flush","chunks","has","push","reset","clear"]}
|
package/dist/theokit-plugin.js
CHANGED
|
@@ -2,30 +2,30 @@ import {
|
|
|
2
2
|
MiddlewareConsumerImpl,
|
|
3
3
|
loadControllersFromGlob,
|
|
4
4
|
runMiddleware
|
|
5
|
-
} from "./chunk-
|
|
5
|
+
} from "./chunk-DI7KNIMB.js";
|
|
6
|
+
import {
|
|
7
|
+
runExceptionFilters
|
|
8
|
+
} from "./chunk-HC47QXZV.js";
|
|
6
9
|
import {
|
|
7
10
|
createExecutionContext,
|
|
8
11
|
walkControllerMetadata
|
|
9
|
-
} from "./chunk-
|
|
12
|
+
} from "./chunk-X7Q5HPLK.js";
|
|
13
|
+
import {
|
|
14
|
+
ForbiddenException
|
|
15
|
+
} from "./chunk-AJOJXZRY.js";
|
|
10
16
|
import {
|
|
11
17
|
nodeIncomingToRequest,
|
|
12
18
|
writeResponseToNode
|
|
13
|
-
} from "./chunk-
|
|
19
|
+
} from "./chunk-BSS3KPGY.js";
|
|
14
20
|
import {
|
|
15
21
|
runInterceptors
|
|
16
|
-
} from "./chunk-
|
|
17
|
-
import {
|
|
18
|
-
runExceptionFilters
|
|
19
|
-
} from "./chunk-CMPP4ULU.js";
|
|
20
|
-
import {
|
|
21
|
-
ForbiddenException
|
|
22
|
-
} from "./chunk-KPC7AIVC.js";
|
|
22
|
+
} from "./chunk-PBV6ZO2V.js";
|
|
23
23
|
import {
|
|
24
24
|
resolveOrNew
|
|
25
|
-
} from "./chunk-
|
|
25
|
+
} from "./chunk-JP4J23TV.js";
|
|
26
26
|
import {
|
|
27
27
|
__name
|
|
28
|
-
} from "./chunk-
|
|
28
|
+
} from "./chunk-Z4QWC7IK.js";
|
|
29
29
|
|
|
30
30
|
// src/theokit-plugin.ts
|
|
31
31
|
import "reflect-metadata";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/theokit-plugin.ts"],"sourcesContent":["/* eslint-disable security/detect-non-literal-regexp */\n/**\n * TheoKit integration plugin for @theokit/http.\n *\n * Two modes:\n *\n * **Mode 1 — controllersGlob (RECOMMENDED):**\n * Controllers are discovered by glob pattern and loaded via @swc/core at\n * first request. This bypasses the esbuild parameter-decorator limitation\n * because controller files are never imported through tsx/esbuild.\n *\n * ```ts\n * // theo.config.ts — NO controller import needed\n * import { defineConfig } from 'theokit/server'\n * import { httpDecoratorsPlugin } from '@theokit/http/theokit-plugin'\n *\n * export default defineConfig({\n * plugins: [\n * httpDecoratorsPlugin({\n * controllersGlob: 'server/controllers/**\\/*.controller.ts'\n * })\n * ]\n * })\n * ```\n *\n * **Mode 2 — direct controllers array (tests, pre-compiled):**\n * Pass controller classes directly. Only works when the transpiler\n * supports parameter decorators (e.g., SWC in Vitest, or manual\n * Reflect.defineMetadata in tests).\n *\n * ```ts\n * httpDecoratorsPlugin({ controllers: [CatsController] })\n * ```\n */\nimport 'reflect-metadata'\n\nimport { resolveOrNew, type DiContainer } from './bridge/di-resolve.js'\nimport { runExceptionFilters } from './bridge/exception-filter-chain.js'\nimport { createExecutionContext, type CanActivate, type ExecutionContext } from './bridge/execution-context.js'\nimport { runInterceptors } from './bridge/interceptor-chain.js'\nimport {\n MiddlewareConsumerImpl,\n runMiddleware,\n type ResolvedMiddleware,\n} from './bridge/middleware-consumer.js'\nimport { nodeIncomingToRequest, writeResponseToNode } from './bridge/runtime/node.js'\nimport { loadControllersFromGlob } from './bridge/swc-loader.js'\nimport { walkControllerMetadata, type WalkResult } from './bridge/walk-metadata.js'\nimport type { ParamEntry } from './decorators/params.js'\nimport { ForbiddenException } from './exceptions/http-exception.js'\n\nexport interface HttpDecoratorsPluginOptions {\n /** Direct controller class references (Mode 2 — tests, pre-compiled). */\n controllers?: Function[]\n /** Glob pattern relative to project root (Mode 1 — RECOMMENDED).\n * Example: 'server/controllers/**\\/*.controller.ts'\n * Requires @swc/core as devDependency. */\n controllersGlob?: string\n /** Optional DI container (e.g., @theokit/di Container). */\n container?: DiContainer\n /** NestJS-style middleware configuration callback. */\n configure?: (consumer: MiddlewareConsumerImpl) => void\n}\n\ninterface RouteEntry {\n walk: WalkResult\n instance: object\n regex: RegExp\n paramNames: string[]\n}\n\n/**\n * TheoKit plugin that mounts decorated controllers into the `theokit dev`\n * / `theokit start` request pipeline via the `onRequest` hook.\n *\n * Returns a plain `{ name, register }` object compatible with\n * `TheoPlugin` from `theokit/server` (Pattern D6 — we don't import the\n * type to avoid adding theokit as a compile-time dep; the structural\n * shape is sufficient).\n */\nexport function httpDecoratorsPlugin(opts: HttpDecoratorsPluginOptions) {\n const routes: RouteEntry[] = []\n let initialized = false\n let initPromise: Promise<void> | null = null\n\n // Collect middleware via configure() callback (NestJS pattern)\n const middlewareConsumer = new MiddlewareConsumerImpl(opts.container)\n if (opts.configure) opts.configure(middlewareConsumer)\n const middlewareEntries = middlewareConsumer.getEntries()\n\n // Mode 2: Direct class references — initialize eagerly\n if (opts.controllers && opts.controllers.length > 0) {\n buildRouteTable(routes, opts.controllers, opts.container)\n initialized = true\n }\n\n // Mode 1: controllersGlob — defer initialization to first request\n if (opts.controllersGlob && !initialized) {\n const glob = opts.controllersGlob\n initPromise = (async () => {\n // Resolve root from process.cwd() — the TheoKit project root\n const rootDir = process.cwd()\n const controllers = await loadControllersFromGlob(rootDir, glob)\n buildRouteTable(routes, controllers, opts.container)\n initialized = true\n console.log(\n `[@theokit/http] Loaded ${controllers.length} controller(s) ` +\n `with ${routes.length} route(s) via SWC.`,\n )\n })()\n }\n\n return {\n name: '@theokit/http',\n register(app: {\n addHook: (\n name: string,\n fn: (ctx: Record<string, unknown>) => Promise<void>,\n ) => void\n }) {\n app.addHook('onRequest', async (pluginCtx) => {\n if (initPromise && !initialized) await initPromise\n\n // Convert Node types → Web Standard at the boundary\n const _nodeHttp = await import('node:http')\n const request = nodeIncomingToRequest(pluginCtx.request as InstanceType<typeof _nodeHttp.IncomingMessage>)\n const response = await handleDecoratorRoute(routes, request, opts.container, middlewareEntries)\n if (response) {\n await writeResponseToNode(response, pluginCtx.response as InstanceType<typeof _nodeHttp.ServerResponse>)\n }\n // null = not our route, fall through to TheoKit scanner\n })\n },\n }\n}\n\n// ─── Route table builder ─────────────────────────────────\n\nfunction buildRouteTable(\n routes: RouteEntry[],\n controllers: Function[],\n container?: DiContainer,\n): void {\n // Dedupe controllers (EC-5)\n const seen = new Set<Function>()\n const unique: Function[] = []\n for (const Ctor of controllers) {\n if (seen.has(Ctor)) continue\n seen.add(Ctor)\n unique.push(Ctor)\n }\n\n for (const Ctor of unique) {\n const instance = resolveOrNew(Ctor, container)\n const walks = walkControllerMetadata(Ctor)\n for (const w of walks) {\n const { regex, paramNames } = compilePattern(w.fullPath)\n routes.push({ walk: w, instance, regex, paramNames })\n }\n }\n\n // Sort: static routes first, parameterized last (prevents /cats/:id matching \"admin\")\n routes.sort((a, b) => {\n const aHasParam = a.walk.fullPath.includes(':')\n const bHasParam = b.walk.fullPath.includes(':')\n if (aHasParam !== bHasParam) return aHasParam ? 1 : -1\n return 0\n })\n}\n\n// ─── Request handler (extracted for complexity budget) ──\n\n/** Returns Response if handled, null if not our route. */\nasync function handleDecoratorRoute(\n routes: RouteEntry[],\n request: Request,\n container?: DiContainer,\n mwEntries: ResolvedMiddleware[] = [],\n): Promise<Response | null> {\n const url = new URL(request.url)\n const method = request.method.toUpperCase()\n const match = findMatch(routes, method, url.pathname)\n if (!match) return null\n\n const { entry, params } = match\n const { walk, instance } = entry\n\n try {\n const mwResponse = await runMiddleware(mwEntries, request, url.pathname)\n if (mwResponse) return mwResponse\n\n const ctx = createExecutionContext(request, instance.constructor, walk.propertyKey)\n const guardResponse = await runGuards(walk.guards, ctx, container)\n if (guardResponse) return guardResponse\n\n const body = await resolveBody(method, request, walk)\n if (body instanceof Response) return body\n\n const args = buildArgs(walk.paramEntries, {\n request,\n body,\n params,\n query: Object.fromEntries(url.searchParams),\n })\n\n if (walk.redirect) {\n return new Response(null, { status: walk.redirect.status, headers: { location: walk.redirect.url } })\n }\n\n const handlerFn = (instance as Record<string | symbol, Function>)[walk.propertyKey]\n const result = await runInterceptors(\n walk.interceptors,\n () => handlerFn.apply(instance, args) as Promise<unknown>,\n request,\n container,\n )\n\n return buildResponse(result, walk, method)\n } catch (err) {\n return runExceptionFilters(err, walk.filters, request, container)\n }\n}\n\nasync function runGuards(\n guards: Function[],\n context: ExecutionContext,\n container?: DiContainer,\n): Promise<Response | null> {\n for (const GuardCtor of guards) {\n const guard = resolveOrNew(GuardCtor, container) as CanActivate\n if (!(await guard.canActivate(context))) {\n const ex = new ForbiddenException('Forbidden resource')\n return jsonResponse(ex.statusCode, ex.toJSON())\n }\n }\n return null\n}\n\nasync function resolveBody(method: string, request: Request, walk: WalkResult): Promise<unknown> {\n if (!['POST', 'PUT', 'PATCH'].includes(method)) return undefined\n let body: unknown\n try {\n const text = await request.text()\n body = text ? JSON.parse(text) : undefined\n } catch { body = undefined }\n if (walk.bodySchema && body !== undefined) {\n const result = walk.bodySchema.safeParse(body)\n if (!result.success) {\n return jsonResponse(422, { error: { code: 'VALIDATION_ERROR', issues: result.error.issues } })\n }\n body = result.data\n }\n return body\n}\n\nfunction buildResponse(result: unknown, walk: WalkResult, method: string): Response {\n const status = walk.status ?? (method === 'POST' ? 201 : 200)\n const headers: Record<string, string> = { 'content-type': 'application/json' }\n for (const [n, v] of walk.headers) headers[n.toLowerCase()] = v\n if (result === undefined || result === null) {\n return new Response(null, { status: status === 200 ? 204 : status, headers })\n }\n if (typeof result === 'string') {\n headers['content-type'] = 'text/plain'\n return new Response(result, { status, headers })\n }\n return new Response(JSON.stringify(result), { status, headers })\n}\n\nfunction jsonResponse(status: number, body: unknown): Response {\n return new Response(JSON.stringify(body), { status, headers: { 'content-type': 'application/json' } })\n}\n\nfunction findMatch(\n routes: RouteEntry[],\n method: string,\n pathname: string,\n): { entry: RouteEntry; params: Record<string, string> } | null {\n for (const entry of routes) {\n if (entry.walk.verb !== 'ALL' && entry.walk.verb !== method) continue\n const match = pathname.match(entry.regex)\n if (!match) continue\n const params: Record<string, string> = {}\n entry.paramNames.forEach((name, i) => {\n params[name] = match[i + 1]\n })\n return { entry, params }\n }\n return null\n}\n\nfunction compilePattern(pattern: string): { regex: RegExp; paramNames: string[] } {\n const paramNames: string[] = []\n const regexStr = pattern.replace(/:(\\w+)/g, (_m, name: string) => {\n paramNames.push(name)\n return '([^/]+)'\n })\n return { regex: new RegExp(`^${regexStr}$`), paramNames }\n}\n\ninterface ArgContext {\n request: Request\n body: unknown\n params: Record<string, string>\n query: Record<string, string>\n}\n\nfunction buildArgs(paramEntries: ParamEntry[], ctx: ArgContext): unknown[] {\n if (paramEntries.length === 0) return []\n const maxIndex = Math.max(...paramEntries.map((p) => p.index))\n const args: unknown[] = Array.from({ length: maxIndex + 1 }, () => undefined)\n for (const p of paramEntries) {\n switch (p.source) {\n case 'req':\n args[p.index] = ctx.request\n break\n case 'body':\n args[p.index] = p.key ? (ctx.body as Record<string, unknown>)[p.key] : ctx.body\n break\n case 'param':\n args[p.index] = p.key ? ctx.params[p.key] : ctx.params\n break\n case 'query':\n args[p.index] = p.key ? ctx.query[p.key] : ctx.query\n break\n case 'headers':\n args[p.index] = p.key ? ctx.request.headers.get(p.key.toLowerCase()) : Object.fromEntries(ctx.request.headers.entries())\n break\n case 'ip':\n args[p.index] = ctx.request.headers.get('x-forwarded-for') ?? '127.0.0.1'\n break\n default:\n args[p.index] = undefined\n }\n }\n return args\n}\n\n// resolveOrNew imported from ./bridge/di-resolve.ts (DRY — EC-3)\n"],"mappings":"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","names":["httpDecoratorsPlugin","opts","routes","initialized","initPromise","middlewareConsumer","MiddlewareConsumerImpl","container","configure","middlewareEntries","getEntries","controllers","length","buildRouteTable","controllersGlob","glob","rootDir","process","cwd","loadControllersFromGlob","console","log","name","register","app","addHook","pluginCtx","_nodeHttp","request","nodeIncomingToRequest","response","handleDecoratorRoute","writeResponseToNode","seen","Set","unique","Ctor","has","add","push","instance","resolveOrNew","walks","walkControllerMetadata","w","regex","paramNames","compilePattern","fullPath","walk","sort","a","b","aHasParam","includes","bHasParam","mwEntries","url","URL","method","toUpperCase","match","findMatch","pathname","entry","params","mwResponse","runMiddleware","ctx","createExecutionContext","propertyKey","guardResponse","runGuards","guards","body","resolveBody","Response","args","buildArgs","paramEntries","query","Object","fromEntries","searchParams","redirect","status","headers","location","handlerFn","result","runInterceptors","interceptors","apply","buildResponse","err","runExceptionFilters","filters","context","GuardCtor","guard","canActivate","ex","ForbiddenException","jsonResponse","statusCode","toJSON","undefined","text","JSON","parse","bodySchema","safeParse","success","error","code","issues","data","n","v","toLowerCase","stringify","verb","forEach","i","pattern","regexStr","replace","_m","RegExp","maxIndex","Math","max","map","p","index","Array","from","source","key","get","entries"]}
|
|
1
|
+
{"version":3,"sources":["../src/theokit-plugin.ts"],"mappings":"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","names":["httpDecoratorsPlugin","opts","routes","initialized","initPromise","middlewareConsumer","MiddlewareConsumerImpl","container","configure","middlewareEntries","getEntries","controllers","length","buildRouteTable","controllersGlob","glob","rootDir","process","cwd","loadControllersFromGlob","console","log","name","register","app","addHook","pluginCtx","_nodeHttp","request","nodeIncomingToRequest","response","handleDecoratorRoute","writeResponseToNode","seen","Set","unique","Ctor","has","add","push","instance","resolveOrNew","walks","walkControllerMetadata","w","regex","paramNames","compilePattern","fullPath","walk","sort","a","b","aHasParam","includes","bHasParam","mwEntries","url","URL","method","toUpperCase","match","findMatch","pathname","entry","params","mwResponse","runMiddleware","ctx","createExecutionContext","propertyKey","guardResponse","runGuards","guards","body","resolveBody","Response","args","buildArgs","paramEntries","query","Object","fromEntries","searchParams","redirect","status","headers","location","handlerFn","result","runInterceptors","interceptors","apply","buildResponse","err","runExceptionFilters","filters","context","GuardCtor","guard","canActivate","ex","ForbiddenException","jsonResponse","statusCode","toJSON","undefined","text","JSON","parse","bodySchema","safeParse","success","error","code","issues","data","n","v","toLowerCase","stringify","verb","forEach","i","pattern","regexStr","replace","_m","RegExp","maxIndex","Math","max","map","p","index","Array","from","source","key","get","entries"]}
|