@boon4681/giri 0.0.1 → 0.0.2-alpha-1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +19 -17
- package/dist/adapters/hono.d.ts +26 -3
- package/dist/adapters/hono.js +99 -7
- package/dist/adapters/hono.js.map +1 -1
- package/dist/cli.js +1197 -1119
- package/dist/cli.js.map +1 -1
- package/dist/index.d.ts +10 -3
- package/dist/index.js +1368 -1285
- package/dist/index.js.map +1 -1
- package/dist/{types-BrUMxh5u.d.ts → types-C4J1_iLZ.d.ts} +24 -3
- package/dist/validators/valibot.d.ts +1 -1
- package/dist/validators/valibot.js.map +1 -1
- package/dist/validators/zod.d.ts +1 -1
- package/dist/validators/zod.js.map +1 -1
- package/package.json +1 -1
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/loader/_es5.ts","../src/index.ts","../src/types.ts","../src/context.ts","../src/validation.ts","../src/app.ts","../src/loader/loader.ts","../src/config/schema.ts","../src/routes.ts","../src/generator/sync.ts","../src/generator/app-types.ts","../src/generator/util.ts","../src/generator/manifest.ts","../src/generator/openapi.ts","../src/generator/param-types.ts","../src/generator/inputs.ts","../src/generator/route-meta.ts","../src/generator/route-types.ts","../src/generator/schema/program.ts","../src/generator/schema/responses.ts","../src/generator/schema/json-schema.ts","../src/generator/tsconfig.ts","../src/generator/watch.ts","../src/loader/module-loader.ts","../src/lifecycle.ts"],"sourcesContent":["const _ = '';\r\nexport default _;","import type { GiriConfig } from './types';\n\nexport {\n composeMiddleware,\n createContext,\n createTypedResponse,\n defineMiddleware,\n isTypedResponse,\n stack,\n toResponse,\n typedResponseToResponse,\n} from './context';\nexport {\n defineBodySchema,\n defineInputSchema,\n isGiriBodySchema,\n isGiriInputSchema,\n prepareRequestInput,\n} from './validation';\nexport { buildGiriApp, resolveGiriPaths } from './app';\nexport { scanRoutes } from './routes';\nexport { syncProject } from './generator';\nexport { loadLifecycle, runInit } from './lifecycle';\nexport type { GiriLifecycle } from './lifecycle';\nexport type {\n BodyContentType,\n Context,\n GiriAdapter,\n GiriBodySchema,\n GiriConfig,\n GiriFetchHandler,\n GiriInputSchema,\n GiriPaths,\n GiriRequest,\n GiriRouteRegistration,\n GiriServeOptions,\n GiriServer,\n GiriServerInfo,\n Handle,\n HandlerResponse,\n HttpMethod,\n Infer,\n InferStackVars,\n InputValidationResult,\n JsonSchema,\n MergeStack,\n Middleware,\n MiddlewareVarsOf,\n MiddlewareOpenApi,\n MiddlewareOptions,\n Next,\n RouteInput,\n RouteInputOf,\n RouteOpenApi,\n RouteOpenApiConfig,\n SecurityRequirement,\n Services,\n StatusCode,\n TypedResponse,\n ValidatedInput,\n ValidBody,\n ValidQuery,\n VarsOf,\n} from './types';\n\nexport function defineConfig<App>(config: GiriConfig<App>): GiriConfig<App> {\n return config;\n}\n","export type HttpMethod = 'GET' | 'POST' | 'PUT' | 'PATCH' | 'DELETE' | 'OPTIONS' | 'HEAD';\n\nexport type StatusCode = number;\n\nexport type ResponseFormat = 'json' | 'text';\n\nexport const typedResponseBrand: unique symbol = Symbol.for('giri.typed-response') as never;\n\nexport interface TypedResponse<\n T,\n S extends StatusCode = StatusCode,\n F extends ResponseFormat = ResponseFormat,\n> {\n readonly [typedResponseBrand]: {\n data: T;\n status: S;\n format: F;\n };\n readonly data: T;\n readonly status: S;\n readonly format: F;\n readonly headers?: HeadersInit;\n}\n\nexport type HandlerResponse = Response | TypedResponse<unknown, StatusCode, ResponseFormat>;\n\nexport interface ValidatedInput {\n /**\n * The validated request body. For a single declared content-type it's that schema's\n * output; for several it's a discriminated union `{ type; data }` (see `ValidBody`).\n */\n body?: unknown;\n query?: unknown;\n}\n\nexport interface GiriRequest<Input extends ValidatedInput = ValidatedInput> {\n raw: Request;\n url: URL;\n method: string;\n header(name: string): string | null;\n json<T = unknown>(): Promise<T>;\n text(): Promise<string>;\n arrayBuffer(): Promise<ArrayBuffer>;\n formData(): Promise<FormData>;\n valid<K extends keyof Input & ('body' | 'query')>(key: K): Input[K];\n}\n\ndeclare global {\n /**\n * Global registration surface for app-wide types. `giri sync` augments\n * `Giri.Register[\"app\"]` from `src/main.ts` `init()` return type so `c.app` is\n * typed without per-route generics (the registration pattern).\n */\n namespace Giri {\n interface Register {}\n }\n}\n\n/**\n * The app-wide services container, the type of `c.app`. `giri sync` infers it from\n * `src/main.ts`'s `init()` return type (via the global `Giri.Register` augmentation);\n * until then it falls back to an open record. Leave `init` unannotated (its return is\n * the source of truth) and annotate `teardown`'s parameter with this:\n *\n * ```ts\n * export const init = () => ({ db }); // inferred\n * export const teardown = (services: Services) => services.db.close();\n * ```\n */\nexport type Services = Giri.Register extends { app: infer A }\n ? A\n : Record<string, unknown>;\n\nexport interface Context<\n Params extends Record<string, string> = Record<string, string>,\n Input extends ValidatedInput = ValidatedInput,\n Vars extends Record<string, unknown> = {},\n> {\n params: Params;\n /** App-wide services from `src/main.ts`'s `init()`, seeded into every request. */\n app: Services;\n req: GiriRequest<Input>;\n // Context vars (`c.set`/`c.get`). Keys declared by middleware (`Vars`) are typed;\n // any other key stays open (`unknown`) so untracked keys still work.\n set<K extends keyof Vars & string>(key: K, value: Vars[K]): void;\n set<K extends string>(key: K, value: unknown): void;\n get<K extends keyof Vars & string>(key: K): Vars[K];\n get<V = unknown>(key: string): V;\n json<T, S extends StatusCode = 200>(\n data: T,\n status?: S,\n headers?: HeadersInit,\n ): TypedResponse<T, S, 'json'>;\n text<S extends StatusCode = 200>(\n text: string,\n status?: S,\n headers?: HeadersInit,\n ): TypedResponse<string, S, 'text'>;\n}\n\nexport type Handle<\n Params extends Record<string, string> = Record<string, string>,\n Input extends ValidatedInput = ValidatedInput,\n Vars extends Record<string, unknown> = {},\n> = (c: Context<Params, Input, Vars>) => HandlerResponse | Promise<HandlerResponse>;\n\nexport type Next = () => Promise<HandlerResponse | void>;\n\n/** An OpenAPI security requirement, e.g. `{ bearerAuth: [] }`. */\nexport type SecurityRequirement = Record<string, string[]>;\n\nexport interface MiddlewareOpenApi {\n /** Security requirements this middleware enforces */\n security?: SecurityRequirement[];\n /** Optional scheme definitions, merged into `components.securitySchemes` so the doc is self-contained. */\n securitySchemes?: Record<string, unknown>;\n [key: string]: unknown;\n}\n\nexport interface MiddlewareOptions {\n openapi?: MiddlewareOpenApi;\n}\n\nexport interface Middleware<\n Params extends Record<string, string> = Record<string, string>,\n Input extends ValidatedInput = ValidatedInput,\n Vars extends Record<string, unknown> = {},\n> {\n (c: Context<Params, Input, Vars>, next: Next): HandlerResponse | void | Promise<HandlerResponse | void>;\n openapi?: MiddlewareOpenApi;\n}\n\n/** The context vars a middleware injects (its `Vars` type parameter). */\nexport type VarsOf<M> = M extends Middleware<Record<string, string>, ValidatedInput, infer V>\n ? V\n : {};\n\n/** Intersect the injected vars of a tuple of middleware (built with `stack(...)`). */\nexport type MergeStack<T> = T extends readonly [infer Head, ...infer Rest]\n ? VarsOf<Head> & MergeStack<Rest>\n : {};\n\n/**\n * Merge the vars from a middleware stack export. A plain `Middleware[]` (not a `stack(...)` tuple)\n */\nexport type InferStackVars<T> = T extends readonly [unknown, ...unknown[]] ? MergeStack<T> : {};\n\n/**\n * The vars injected by a module own `middleware` export (a `stack(...)`). Used by the\n * generated per-method handle so a verb file's own `export const middleware` types\n * `c.get`/`c.set`, on top of the folder's `+shared.ts` chain.\n */\nexport type MiddlewareVarsOf<M> = M extends { middleware: infer Stack }\n ? InferStackVars<Stack>\n : {};\n\n/** A JSON Schema object (JSON Schema 2020-12 / OpenAPI 3.1 dialect). */\nexport type JsonSchema = Record<string, unknown>;\n\nexport const inputSchemaBrand: unique symbol = Symbol.for('giri.input-schema') as never;\n\nexport type InputValidationResult<Output = unknown> =\n | { ok: true; value: Output }\n | { ok: false; issues: unknown };\n\n/**\n * A input schema every wrapper form (`body`/`query`) export takes. A vendor\n * adapter (`@boon4681/giri/validators/zod`, `@boon4681/giri/validators/valibot`, …) returns one; build a\n * custom one with `defineInputSchema`. giri core depends only on this interface, never\n * on a validator library. `validate` is the runtime check; `toJsonSchema` feeds OpenAPI.\n */\nexport interface GiriInputSchema<Output = unknown> {\n readonly [inputSchemaBrand]: true;\n validate(value: unknown): InputValidationResult<Output> | Promise<InputValidationResult<Output>>;\n toJsonSchema(): JsonSchema;\n}\n\n/** Extract the validated output type of a giri input schema: `Infer<typeof body>`. */\nexport type Infer<T> = T extends GiriInputSchema<infer Output> ? Output : never;\n\nexport type BodyContentType = 'json' | 'form' | 'urlencoded' | 'text';\n\nexport const bodySchemaBrand: unique symbol = Symbol.for('giri.body-schema') as never;\n\n/**\n * A request body declared as a set of accepted content-types wrapped form `body`\n * takes (`zod.body({ json, form })`). One key means that encoding only; several mean the\n * endpoint accepts any of them, dispatched at runtime on the request `Content-Type`.\n * Each entry is a plain `GiriInputSchema`, so `validate`/`toJsonSchema` work per content-type.\n */\nexport interface GiriBodySchema<\n Outputs extends Partial<Record<BodyContentType, unknown>> = Partial<Record<BodyContentType, unknown>>,\n> {\n readonly [bodySchemaBrand]: true;\n readonly contents: { [K in keyof Outputs & BodyContentType]: GiriInputSchema<Outputs[K]> };\n}\n\n/** True when `T` is a union of more than one member. */\ntype IsUnion<T, U = T> = T extends unknown ? ([U] extends [T] ? false : true) : never;\n\n/**\n * The validated body a handler receives. A single declared content-type yields that\n * schema's output directly; several yield a discriminated union keyed by content-type.\n */\nexport type ValidBody<B> = B extends GiriBodySchema<infer Outputs>\n ? IsUnion<keyof Outputs> extends true\n ? { [K in keyof Outputs]: { type: K; data: Outputs[K] } }[keyof Outputs]\n : Outputs[keyof Outputs]\n : never;\n\n/** The validated query a handler receives. */\nexport type ValidQuery<Q> = Q extends GiriInputSchema<infer Output> ? Output : never;\n\n/** Drop keys whose value resolved to `never` (an input the route didn't declare). */\ntype PruneNever<T> = { [K in keyof T as [T[K]] extends [never] ? never : K]: T[K] };\n\n/**\n * Derive a route's `ValidatedInput` from a module's `body`/`query` exports. The generated\n * per-method `$types` handle (`POST`, `GET`, …) uses this so handlers infer `c.req.valid`\n * with no manual generic.\n */\nexport type RouteInputOf<M> = PruneNever<{\n body: M extends { body: infer B } ? ValidBody<B> : never;\n query: M extends { query: infer Q } ? ValidQuery<Q> : never;\n}>;\n\nexport interface RouteInput {\n body?: GiriBodySchema;\n query?: GiriInputSchema;\n}\n\nexport interface RouteOpenApi {\n /** Omit this route from the generated `openapi.json` (it still serves normally). */\n hidden?: boolean;\n // Room to grow: summary, description, tags, deprecated, operationId, …\n}\n\nexport type RouteOpenApiConfig = RouteOpenApi | boolean;\n\nexport interface GiriRouteRegistration {\n method: HttpMethod;\n path: string;\n handle: Handle;\n middleware: Middleware[];\n input?: RouteInput;\n /** App-wide services to seed onto `c.app` (same instance for every route). */\n services?: Services;\n}\n\nexport type GiriFetchHandler = (req: Request) => Response | Promise<Response>;\n\nexport interface GiriServeOptions {\n port: number;\n hostname?: string;\n}\n\nexport interface GiriServerInfo {\n address: string;\n port: number;\n}\n\nexport interface GiriServer {\n close(): void | Promise<void>;\n}\n\nexport interface GiriAdapter<App> {\n name?: string;\n createApp(): App;\n register(app: App, route: GiriRouteRegistration): void;\n fetch(app: App, req: Request): Promise<Response>;\n /**\n * Bind the configured backend's runtime to a port and start serving.\n * giri core stays runtime-agnostic: it hands the adapter a request handler\n * (so hot-reload keeps working) and the adapter owns the actual server.\n */\n serve(\n handler: GiriFetchHandler,\n options: GiriServeOptions,\n onListen?: (info: GiriServerInfo) => void,\n ): GiriServer;\n}\n\nexport interface GiriConfig<App = unknown> {\n adapter: GiriAdapter<App>;\n alias?: Record<string, string | string[]>;\n outDir?: string;\n server?: {\n port?: number;\n hostname?: string;\n };\n errorSchema?: unknown;\n}\n\nexport interface GiriPaths {\n cwd: string;\n routesDir: string;\n outDir: string;\n}\n","import {\n type Services,\n type Context,\n type HandlerResponse,\n type Middleware,\n type MiddlewareOptions,\n type ResponseFormat,\n type StatusCode,\n type TypedResponse,\n type ValidatedInput,\n typedResponseBrand,\n} from './types';\n\nconst BODYLESS_STATUS = new Set([101, 103, 204, 205, 304]);\n\nexport interface CreateContextOptions<\n Params extends Record<string, string> = Record<string, string>,\n Input extends ValidatedInput = ValidatedInput,\n> {\n request: Request;\n params?: Params;\n validated?: Input;\n app?: Services;\n}\n\nexport function createTypedResponse<\n T,\n S extends StatusCode,\n F extends ResponseFormat,\n>(data: T, status: S, format: F, headers?: HeadersInit): TypedResponse<T, S, F> {\n return {\n [typedResponseBrand]: { data, status, format },\n data,\n status,\n format,\n headers,\n };\n}\n\nexport function isTypedResponse(value: unknown): value is TypedResponse<unknown> {\n return Boolean(value && typeof value === 'object' && typedResponseBrand in value);\n}\n\nexport function createContext<\n Params extends Record<string, string> = Record<string, string>,\n Input extends ValidatedInput = ValidatedInput,\n>(options: CreateContextOptions<Params, Input>): Context<Params, Input> {\n const url = new URL(options.request.url);\n const store = new Map<string, unknown>();\n const validated = options.validated ?? ({} as Input);\n\n return {\n params: options.params ?? ({} as Params),\n app: options.app ?? ({} as Services),\n req: {\n raw: options.request,\n url,\n method: options.request.method,\n header: (name) => options.request.headers.get(name),\n json: <T = unknown>() => options.request.json() as Promise<T>,\n text: () => options.request.text(),\n arrayBuffer: () => options.request.arrayBuffer(),\n formData: () => options.request.formData(),\n valid: (key) => {\n if (!(key in validated)) {\n throw new Error(`No validated ${String(key)} data is available for this route.`);\n }\n return validated[key];\n },\n },\n set: (key: string, value: unknown) => {\n store.set(key, value);\n },\n get: (key: string) => store.get(key) as never,\n json: (data, status = 200 as never, headers) =>\n createTypedResponse(data, status, 'json', headers),\n text: (text, status = 200 as never, headers) =>\n createTypedResponse(text, status, 'text', headers),\n };\n}\n\nexport function typedResponseToResponse(response: TypedResponse<unknown>): Response {\n const headers = new Headers(response.headers);\n\n if (response.format === 'json' && !headers.has('content-type')) {\n headers.set('content-type', 'application/json; charset=utf-8');\n }\n\n if (response.format === 'text' && !headers.has('content-type')) {\n headers.set('content-type', 'text/plain; charset=utf-8');\n }\n\n const body = BODYLESS_STATUS.has(response.status)\n ? null\n : response.format === 'json'\n ? JSON.stringify(response.data)\n : String(response.data);\n\n return new Response(body, {\n status: response.status,\n headers,\n });\n}\n\nexport function toResponse(response: HandlerResponse): Response {\n return isTypedResponse(response) ? typedResponseToResponse(response) : response;\n}\n\nexport async function composeMiddleware(\n middleware: Middleware[],\n handle: (c: Context) => HandlerResponse | Promise<HandlerResponse>,\n context: Context,\n): Promise<HandlerResponse> {\n let index = -1;\n let result: HandlerResponse | undefined;\n\n const dispatch = async (i: number): Promise<HandlerResponse | void> => {\n if (i <= index) {\n throw new Error('next() called multiple times in giri middleware.');\n }\n index = i;\n\n if (i === middleware.length) {\n result = await handle(context);\n return result;\n }\n\n const returned = await middleware[i](context, () => dispatch(i + 1));\n if (returned !== undefined) {\n result = returned;\n return returned;\n }\n return result;\n };\n\n await dispatch(0);\n\n if (result === undefined) {\n throw new Error('Route completed without returning a response.');\n }\n\n return result;\n}\n\ntype AnyMiddleware<Vars extends Record<string, unknown>> = Middleware<\n Record<string, string>,\n ValidatedInput,\n Vars\n>;\n\nexport function defineMiddleware<Vars extends Record<string, unknown> = {}>(\n middleware: AnyMiddleware<Vars>,\n): AnyMiddleware<Vars>;\nexport function defineMiddleware<Vars extends Record<string, unknown> = {}>(\n options: MiddlewareOptions,\n middleware: AnyMiddleware<Vars>,\n): AnyMiddleware<Vars>;\nexport function defineMiddleware(\n optionsOrMiddleware: MiddlewareOptions | Middleware,\n maybeMiddleware?: Middleware,\n): Middleware {\n if (typeof optionsOrMiddleware === 'function') {\n return optionsOrMiddleware;\n }\n\n if (!maybeMiddleware) {\n throw new Error('defineMiddleware(options, middleware) requires a middleware function.');\n }\n\n maybeMiddleware.openapi = optionsOrMiddleware.openapi;\n return maybeMiddleware;\n}\n\n/**\n * Group middleware into an ordered stack, preserving each element's type as a tuple so\n * the injected context vars (`defineMiddleware<Vars>` / `Middleware<…, Vars>`) propagate\n * to downstream handlers. Use it for `+shared.ts` and verb `middleware` exports:\n * `export const middleware = stack(auth, requireAdmin)`.\n */\n// `Vars` is contravariant (it sits in the `c` parameter), so the constraint must leave it\n// open (`any`) otherwise a middleware that injects vars isn't assignable to the element type.\nexport function stack<T extends Middleware<Record<string, string>, ValidatedInput, any>[]>(...middleware: T): T {\n return middleware;\n}\n","import {\n type BodyContentType,\n type GiriBodySchema,\n type GiriInputSchema,\n type InputValidationResult,\n type RouteInput,\n type TypedResponse,\n type ValidatedInput,\n bodySchemaBrand,\n inputSchemaBrand,\n} from './types';\nimport { createTypedResponse } from './context';\n\ninterface PreparedInput {\n ok: true;\n validated: ValidatedInput;\n}\n\ninterface FailedInput {\n ok: false;\n response: TypedResponse<{ message: string; issues: unknown }, 400 | 415, 'json'>;\n}\n\nexport type PreparedRequestInput = PreparedInput | FailedInput;\n\n/**\n * Build a giri input schema from a `validate` + `toJsonSchema` pair. Vendor adapters use\n * this; you can call it directly to make a custom validator. The brand is a global symbol,\n * so a hand-rolled `{ [Symbol.for(\"giri.input-schema\")]: true, validate, toJsonSchema }` works too.\n */\nexport function defineInputSchema<Output>(\n schema: Omit<GiriInputSchema<Output>, typeof inputSchemaBrand>,\n): GiriInputSchema<Output> {\n return { [inputSchemaBrand]: true, ...schema };\n}\n\nexport function isGiriInputSchema(value: unknown): value is GiriInputSchema {\n return Boolean(\n value &&\n typeof value === 'object' &&\n (value as Record<symbol, unknown>)[inputSchemaBrand] === true,\n );\n}\n\n/**\n * Build a giri body schema from per-content-type input schemas. Validator adapters use this `zod.body({ json, form })`\n */\nexport function defineBodySchema<Outputs extends Partial<Record<BodyContentType, unknown>>>(\n contents: GiriBodySchema<Outputs>['contents'],\n): GiriBodySchema<Outputs> {\n return { [bodySchemaBrand]: true, contents };\n}\n\nexport function isGiriBodySchema(value: unknown): value is GiriBodySchema {\n return Boolean(\n value &&\n typeof value === 'object' &&\n (value as Record<symbol, unknown>)[bodySchemaBrand] === true,\n );\n}\n\nconst MIME_TO_CONTENT_TYPE: Record<string, BodyContentType> = {\n 'application/json': 'json',\n 'multipart/form-data': 'form',\n 'application/x-www-form-urlencoded': 'urlencoded',\n 'text/plain': 'text',\n};\n\nfunction contentTypeFromHeader(header: string | null): BodyContentType | undefined {\n if (!header) {\n return undefined;\n }\n const mime = header.split(';', 1)[0].trim().toLowerCase();\n return MIME_TO_CONTENT_TYPE[mime];\n}\n\n/** Flatten a `FormData` into a plain object, collapsing repeated fields into arrays. */\nfunction formDataObject(form: FormData): Record<string, unknown> {\n const result: Record<string, unknown> = {};\n form.forEach((value, key) => {\n const current = result[key];\n if (current === undefined) {\n result[key] = value;\n } else if (Array.isArray(current)) {\n current.push(value);\n } else {\n result[key] = [current, value];\n }\n });\n return result;\n}\n\nasync function readRawBody(request: Request, contentType: BodyContentType): Promise<unknown> {\n const cloned = request.clone();\n if (contentType === 'json') {\n return cloned.json();\n }\n if (contentType === 'text') {\n return cloned.text();\n }\n return formDataObject(await cloned.formData());\n}\n\nfunction queryObject(url: URL): Record<string, string | string[]> {\n const result: Record<string, string | string[]> = {};\n for (const [key, value] of url.searchParams) {\n const current = result[key];\n if (current === undefined) {\n result[key] = value;\n } else if (Array.isArray(current)) {\n current.push(value);\n } else {\n result[key] = [current, value];\n }\n }\n return result;\n}\n\nasync function runValidation(\n schema: GiriInputSchema,\n value: unknown,\n label: string,\n): Promise<InputValidationResult> {\n if (!isGiriInputSchema(schema)) {\n throw new Error(\n `giri: ${label} schema must be wrapped with a validator, e.g. \\`export const ${label} = zod(...)\\` from @boon4681/giri/validators/zod.`,\n );\n }\n return schema.validate(value);\n}\n\nexport async function prepareRequestInput(request: Request, input?: RouteInput): Promise<PreparedRequestInput> {\n const validated: ValidatedInput = {};\n\n if (input?.query) {\n const query = queryObject(new URL(request.url));\n const result = await runValidation(input.query, query, 'query');\n if (!result.ok) {\n return {\n ok: false,\n response: createTypedResponse(\n { message: 'Invalid query parameters.', issues: result.issues },\n 400,\n 'json',\n ),\n };\n }\n validated.query = result.value;\n }\n\n if (input?.body) {\n const contents = input.body.contents as Record<BodyContentType, GiriInputSchema>;\n const declared = Object.keys(contents) as BodyContentType[];\n const requested = contentTypeFromHeader(request.headers.get('content-type'));\n // Pick the schema matching the request's content-type; fall back to JSON when the\n // header is missing/unrecognized but JSON is on offer (so header-less posts still work).\n const chosen: BodyContentType | undefined =\n requested && contents[requested] ? requested : contents.json ? 'json' : undefined;\n\n if (!chosen) {\n return {\n ok: false,\n response: createTypedResponse(\n { message: 'Unsupported media type.', issues: { accepted: declared } },\n 415,\n 'json',\n ),\n };\n }\n\n let rawBody: unknown;\n try {\n rawBody = await readRawBody(request, chosen);\n } catch (error) {\n return {\n ok: false,\n response: createTypedResponse(\n { message: 'Invalid request body.', issues: error },\n 400,\n 'json',\n ),\n };\n }\n\n const result = await runValidation(contents[chosen], rawBody, 'body');\n if (!result.ok) {\n return {\n ok: false,\n response: createTypedResponse(\n { message: 'Invalid request body.', issues: result.issues },\n 400,\n 'json',\n ),\n };\n }\n\n validated.body = declared.length > 1 ? { type: chosen, data: result.value } : result.value;\n }\n\n return { ok: true, validated };\n}\n","import Module from 'node:module';\nimport { isAbsolute, join, resolve } from 'node:path';\nimport { safeRegister } from './loader/loader';\nimport { scanRoutes, type ScannedRoute } from './routes';\nimport type { GiriBodySchema, GiriConfig, GiriInputSchema, GiriPaths, Handle, Middleware, RouteInput, Services } from './types';\nimport { isGiriBodySchema, isGiriInputSchema } from './validation';\n\nexport interface BuildGiriAppOptions {\n cwd?: string;\n services?: Services;\n}\n\nexport interface BuiltGiriApp<App> {\n app: App;\n routes: ScannedRoute[];\n paths: GiriPaths;\n}\n\ninterface RouteModule {\n handle?: Handle;\n middleware?: Middleware | Middleware[];\n body?: unknown;\n query?: unknown;\n config?: {\n skipInherited?: boolean;\n };\n}\n\nfunction loadModule(file: string): unknown {\n const resolved = require.resolve(file);\n delete require.cache[resolved];\n return require(resolved);\n}\n\nfunction interopDefault(value: unknown): unknown {\n if (value && typeof value === 'object' && 'default' in value) {\n return (value as { default: unknown }).default;\n }\n return value;\n}\n\nfunction normalizeMiddleware(value: unknown, file: string): Middleware[] {\n const exported = interopDefault(value);\n if (exported === undefined) {\n return [];\n }\n if (typeof exported === 'function') {\n return [exported as Middleware];\n }\n if (Array.isArray(exported)) {\n for (const middleware of exported) {\n if (typeof middleware !== 'function') {\n throw new Error(`Middleware export in ${file} must contain only functions.`);\n }\n }\n return exported as Middleware[];\n }\n throw new Error(`Middleware export in ${file} must be a function or an array of functions.`);\n}\n\nfunction assertBodySchema(value: unknown, file: string): asserts value is GiriBodySchema {\n if (!isGiriBodySchema(value)) {\n throw new Error(\n `${file}: \"body\" must be wrapped with a validator, e.g. \\`export const body = zod.body({ json: ... })\\` from @boon4681/giri/validators/zod.`,\n );\n }\n}\n\nfunction assertQuerySchema(value: unknown, file: string): asserts value is GiriInputSchema {\n if (!isGiriInputSchema(value)) {\n throw new Error(\n `${file}: \"query\" must be wrapped with a validator, e.g. \\`export const query = zod.query(...)\\` from @boon4681/giri/validators/zod.`,\n );\n }\n}\n\nfunction routeInput(routeModule: RouteModule, file: string): RouteInput | undefined {\n const input: RouteInput = {};\n if (routeModule.body !== undefined) {\n assertBodySchema(routeModule.body, file);\n input.body = routeModule.body;\n }\n if (routeModule.query !== undefined) {\n assertQuerySchema(routeModule.query, file);\n input.query = routeModule.query;\n }\n return input.body || input.query ? input : undefined;\n}\n\nfunction aliasValues(value: string | string[]): string[] {\n return Array.isArray(value) ? value : [value];\n}\n\nfunction resolveAliasTarget(cwd: string, target: string, capture = ''): string {\n const replaced = target.includes('*') ? target.replaceAll('*', capture) : target;\n return isAbsolute(replaced) ? replaced : resolve(cwd, replaced);\n}\n\nfunction matchAlias(request: string, key: string): string | undefined {\n if (key.includes('*')) {\n const [prefix, suffix = ''] = key.split('*');\n if (request.startsWith(prefix) && request.endsWith(suffix)) {\n return request.slice(prefix.length, request.length - suffix.length);\n }\n return undefined;\n }\n\n if (request === key) {\n return '';\n }\n\n const prefix = `${key}/`;\n if (request.startsWith(prefix)) {\n return request.slice(prefix.length);\n }\n\n return undefined;\n}\n\nfunction resolveAliasRequest(\n request: string,\n alias: GiriConfig['alias'],\n cwd: string,\n): string | undefined {\n for (const [key, value] of Object.entries(alias ?? {})) {\n const capture = matchAlias(request, key);\n if (capture === undefined) {\n continue;\n }\n\n const [target] = aliasValues(value);\n if (!target) {\n continue;\n }\n\n return resolveAliasTarget(cwd, target, capture);\n }\n\n return undefined;\n}\n\nexport function registerAliasResolver(alias: GiriConfig['alias'], cwd: string): () => void {\n if (!alias || Object.keys(alias).length === 0) {\n return () => { };\n }\n\n const moduleWithResolver = Module as typeof Module & {\n _resolveFilename: (request: string, parent: unknown, isMain: boolean, options: unknown) => string;\n };\n const originalResolveFilename = moduleWithResolver._resolveFilename;\n\n moduleWithResolver._resolveFilename = function resolveWithGiriAlias(\n request,\n parent,\n isMain,\n options,\n ) {\n return originalResolveFilename.call(\n this,\n resolveAliasRequest(request, alias, cwd) ?? request,\n parent,\n isMain,\n options,\n );\n };\n\n return () => {\n moduleWithResolver._resolveFilename = originalResolveFilename;\n };\n}\n\nconst GIRI_ALIAS_PREFIX = '$giri/';\nlet giriOutDir: string | undefined;\nlet giriResolverInstalled = false;\n\n/**\n * Install a process-lifetime resolver for the internal `$giri/*` alias\n */\nexport function ensureGiriAliasResolver(outDir: string): void {\n giriOutDir = outDir;\n if (giriResolverInstalled) {\n return;\n }\n giriResolverInstalled = true;\n\n const moduleWithResolver = Module as typeof Module & {\n _resolveFilename: (request: string, parent: unknown, isMain: boolean, options: unknown) => string;\n };\n const originalResolveFilename = moduleWithResolver._resolveFilename;\n\n moduleWithResolver._resolveFilename = function resolveWithGiriInternalAlias(\n request,\n parent,\n isMain,\n options,\n ) {\n const mapped =\n typeof request === 'string' && request.startsWith(GIRI_ALIAS_PREFIX) && giriOutDir\n ? join(giriOutDir, request.slice(GIRI_ALIAS_PREFIX.length))\n : request;\n return originalResolveFilename.call(this, mapped, parent, isMain, options);\n };\n}\n\nexport function resolveGiriPaths(config: Pick<GiriConfig, 'outDir'>, cwd = process.cwd()): GiriPaths {\n return {\n cwd: resolve(cwd),\n routesDir: resolve(cwd, 'src/routes'),\n outDir: resolve(cwd, config.outDir ?? '.giri'),\n };\n}\n\nexport async function buildGiriApp<App>(\n config: GiriConfig<App>,\n options: BuildGiriAppOptions = {},\n): Promise<BuiltGiriApp<App>> {\n const paths = resolveGiriPaths(config, options.cwd);\n const routes = await scanRoutes(paths.routesDir);\n const app = config.adapter.createApp();\n // Install the persistent `$giri` resolver BEFORE esbuild-register: it patches\n // `_resolveFilename` too, and its unregister() restores whatever it captured\n ensureGiriAliasResolver(paths.outDir);\n const { unregister } = await safeRegister();\n const unregisterAliasResolver = registerAliasResolver(config.alias, paths.cwd);\n\n try {\n for (const route of routes) {\n const routeModule = loadModule(route.file) as RouteModule;\n if (typeof routeModule.handle !== 'function') {\n throw new Error(`${route.file} must export a named handle function.`);\n }\n\n const folderMiddleware = routeModule.config?.skipInherited\n ? []\n : route.sharedFiles.flatMap((file) =>\n normalizeMiddleware((loadModule(file) as { middleware?: unknown }).middleware, file),\n );\n const verbMiddleware = normalizeMiddleware(routeModule.middleware, route.file);\n\n config.adapter.register(app, {\n method: route.method,\n path: route.path,\n handle: routeModule.handle,\n middleware: [...folderMiddleware, ...verbMiddleware],\n input: routeInput(routeModule, route.file),\n services: options.services,\n });\n }\n } finally {\n unregisterAliasResolver();\n unregister();\n }\n\n return { app, routes, paths };\n}\n","import { cancel, log, spinner } from '@clack/prompts';\nimport { existsSync } from 'node:fs';\nimport { join, resolve, sep } from 'node:path';\nimport { exit } from 'node:process';\nimport { configSchema } from '../config/schema';\nimport { Value } from \"@sinclair/typebox/value\"\nimport { Static } from '@sinclair/typebox';\n\nconst assertES5 = async (unregister: () => void) => {\n try {\n require('./_es5.ts');\n } catch (e: any) {\n if ('errors' in e && Array.isArray(e.errors) && e.errors.length > 0) {\n const es5Error = (e.errors as any[]).filter((it) => it.text?.includes(`(\"es5\") is not supported yet`)).length > 0;\n if (es5Error) {\n log.error(\n `Please change compilerOptions.target from 'es5' to 'es6' or above in your tsconfig.json`\n );\n exit(1);\n }\n }\n log.error(e);\n exit(1);\n }\n};\n\nexport const safeRegister = async () => {\n const { register } = await import('esbuild-register/dist/node');\n let res: { unregister: () => void };\n try {\n res = register({\n format: 'cjs',\n loader: 'ts',\n });\n } catch {\n // tsx fallback\n res = {\n unregister: () => { },\n };\n }\n\n // has to be outside try catch to be able to run with tsx\n await assertES5(res.unregister);\n return res;\n}\n\nexport const load = async () => {\n const defaultTsConfigExists = existsSync(resolve('giri.config.ts'));\n const defaultJsConfigExists = existsSync(resolve('giri.config.js'));\n const defaultConfigPath = defaultTsConfigExists ? 'giri.config.ts' : defaultJsConfigExists ? 'giri.config.js' : undefined\n if (!defaultConfigPath) {\n log.error(\"Config file not found.\")\n exit(1)\n }\n\n const path: string = resolve(defaultConfigPath);\n if (!existsSync(path)) {\n log.error(`${path} file does not exist`);\n exit(1)\n }\n\n const { unregister } = await safeRegister();\n const required = require(`${path}`);\n const content = required.default ?? required;\n unregister();\n\n // get response and then check by each dialect independently\n const res = Value.Check(configSchema, content);\n if (!res) {\n for (const error of [...Value.Errors(configSchema, content)]) {\n log.error(error.message)\n }\n exit(1)\n }\n return content as Static<typeof configSchema>\n}\n","import { Static, Type } from \"@sinclair/typebox\";\n\nexport const configSchema = Type.Object({\n adapter: Type.Any(),\n alias: Type.Optional(Type.Record(\n Type.String(),\n Type.Union([Type.String(), Type.Array(Type.String())]),\n )),\n outDir: Type.Optional(Type.String()),\n server: Type.Optional(Type.Object({\n port: Type.Optional(Type.Number()),\n hostname: Type.Optional(Type.String()),\n }, { additionalProperties: false })),\n errorSchema: Type.Optional(Type.Any()),\n}, { additionalProperties: false })","import { existsSync } from 'node:fs';\nimport { readdir } from 'node:fs/promises';\nimport { basename, dirname, join, relative, sep } from 'node:path';\nimport { glob } from 'tinyglobby';\nimport type { HttpMethod } from './types';\n\nconst METHOD_ORDER: HttpMethod[] = ['GET', 'POST', 'PUT', 'PATCH', 'DELETE', 'OPTIONS', 'HEAD'];\nconst METHOD_FROM_FILE = new Map<string, HttpMethod>(\n METHOD_ORDER.map((method) => [`+${method.toLowerCase()}`, method]),\n);\n\nexport interface RouteParam {\n name: string;\n catchAll: boolean;\n}\n\nexport interface ScannedRoute {\n method: HttpMethod;\n path: string;\n file: string;\n routeDir: string;\n routeSegments: string[];\n params: RouteParam[];\n /** The `+shared.ts` chain folder-cascading config. */\n sharedFiles: string[];\n}\n\nfunction normalizeSlashes(path: string): string {\n return path.split(sep).join('/');\n}\n\nfunction isRouteSourceFile(fileName: string): boolean {\n return /\\.(?:[cm]?[jt]s|[jt]sx)$/.test(fileName) && !fileName.endsWith('.d.ts');\n}\n\nfunction methodFromFile(fileName: string): HttpMethod | undefined {\n if (!isRouteSourceFile(fileName)) {\n return undefined;\n }\n const stem = fileName.replace(/\\.(?:[cm]?[jt]s|[jt]sx)$/, '').toLowerCase();\n return METHOD_FROM_FILE.get(stem);\n}\n\nfunction sharedFileIn(dir: string): string | undefined {\n for (const ext of ['ts', 'tsx', 'js', 'jsx', 'mjs', 'cjs', 'mts', 'cts']) {\n const file = join(dir, `+shared.${ext}`);\n if (existsSync(file)) {\n return file;\n }\n }\n return undefined;\n}\n\nfunction physicalRouteSegments(routesDir: string, routeDir: string): string[] {\n const rel = relative(routesDir, routeDir);\n if (!rel) {\n return [];\n }\n return normalizeSlashes(rel).split('/').filter(Boolean);\n}\n\nfunction urlSegment(segment: string): { value?: string; param?: RouteParam } {\n if (/^\\(.+\\)$/.test(segment)) {\n return {};\n }\n\n const catchAll = /^\\[\\.\\.\\.(.+)\\]$/.exec(segment);\n if (catchAll) {\n const name = catchAll[1];\n return {\n value: `:${name}{.*}`,\n param: { name, catchAll: true },\n };\n }\n\n const param = /^\\[(.+)\\]$/.exec(segment);\n if (param) {\n const name = param[1];\n return {\n value: `:${name}`,\n param: { name, catchAll: false },\n };\n }\n\n return { value: segment };\n}\n\nexport function pathFromSegments(segments: string[]): { path: string; params: RouteParam[] } {\n const pathSegments: string[] = [];\n const params: RouteParam[] = [];\n\n for (const segment of segments) {\n const converted = urlSegment(segment);\n if (converted.value) {\n pathSegments.push(converted.value);\n }\n if (converted.param) {\n params.push(converted.param);\n }\n }\n\n return {\n path: pathSegments.length > 0 ? `/${pathSegments.join('/')}` : '/',\n params,\n };\n}\n\n/**\n * Every directory under `routesDir` (including itself), so `$types` can be generated for a\n * folder the moment it's created\n */\nexport async function scanRouteFolders(routesDir: string): Promise<string[]> {\n if (!existsSync(routesDir)) {\n return [];\n }\n const folders = [routesDir];\n const walk = async (dir: string): Promise<void> => {\n for (const entry of await readdir(dir, { withFileTypes: true })) {\n if (entry.isDirectory() && entry.name !== 'node_modules') {\n const full = join(dir, entry.name);\n folders.push(full);\n await walk(full);\n }\n }\n };\n await walk(routesDir);\n return folders;\n}\n\n/** Folder-derived params for any directory under `routesDir` (used for middleware `$types`). */\nexport function routeParamsForDir(routesDir: string, dir: string): RouteParam[] {\n return pathFromSegments(physicalRouteSegments(routesDir, dir)).params;\n}\n\n/** The ordered `+shared.ts` chain that applies to a directory. */\nexport function sharedFilesForDir(routesDir: string, dir: string): string[] {\n const segments = physicalRouteSegments(routesDir, dir);\n const dirs = [routesDir];\n\n let current = routesDir;\n for (const segment of segments) {\n current = join(current, segment);\n dirs.push(current);\n }\n\n return dirs.map(sharedFileIn).filter((file): file is string => Boolean(file));\n}\n\nexport async function scanRoutes(routesDir: string): Promise<ScannedRoute[]> {\n if (!existsSync(routesDir)) {\n return [];\n }\n\n const files = await glob('**/+*.{ts,tsx,js,jsx,mjs,cjs,mts,cts}', {\n cwd: routesDir,\n absolute: true,\n onlyFiles: true,\n });\n\n const routes: ScannedRoute[] = [];\n\n for (const file of files) {\n const method = methodFromFile(basename(file));\n if (!method) {\n continue;\n }\n\n const routeDir = dirname(file);\n const routeSegments = physicalRouteSegments(routesDir, routeDir);\n const { path, params } = pathFromSegments(routeSegments);\n\n routes.push({\n method,\n path,\n file,\n routeDir,\n routeSegments,\n params,\n sharedFiles: sharedFilesForDir(routesDir, routeDir),\n });\n }\n\n return routes.sort((left, right) => {\n const pathOrder = left.path.localeCompare(right.path);\n if (pathOrder !== 0) {\n return pathOrder;\n }\n return METHOD_ORDER.indexOf(left.method) - METHOD_ORDER.indexOf(right.method);\n });\n}\n","import { existsSync } from 'node:fs';\nimport { mkdir } from 'node:fs/promises';\nimport { join } from 'node:path';\nimport { resolveGiriPaths } from '../app';\nimport {\n routeParamsForDir,\n scanRouteFolders,\n scanRoutes,\n sharedFilesForDir,\n type ScannedRoute,\n} from '../routes';\nimport type { GiriConfig, GiriPaths, HttpMethod } from '../types';\nimport { writeAppTypes } from './app-types';\nimport type { RouteInputSchemas } from './inputs';\nimport { writeManifest } from './manifest';\nimport { writeOpenApi } from './openapi';\nimport { writeParamTypes, type TypeFolder } from './param-types';\nimport { extractRouteMeta, type RouteSecurity } from './route-meta';\nimport { writeRouteTypes } from './route-types';\nimport { createSchemaProgram, extractRouteResponses, type RouteResponses } from './schema';\nimport { writeTsConfig } from './tsconfig';\nimport { assertSafeOutDir, pruneDir, slash, typeFilePath } from './util';\n\n/** A `$types.d.ts` for every folder under `routes/` even empty/new ones. */\nasync function typeFolders(paths: GiriPaths, routes: ScannedRoute[]): Promise<TypeFolder[]> {\n // `scanRoutes` (tinyglobby) yields forward-slash paths while `scanRouteFolders` yields\n // native-separator paths, so key the map on a slash-normalized dir to match either form.\n const verbsByDir = new Map<string, { method: HttpMethod; file: string }[]>();\n for (const route of routes) {\n const key = slash(route.routeDir);\n const list = verbsByDir.get(key) ?? [];\n list.push({ method: route.method, file: route.file });\n verbsByDir.set(key, list);\n }\n\n const dirs = await scanRouteFolders(paths.routesDir);\n return dirs.map((dir) => ({\n dir,\n params: routeParamsForDir(paths.routesDir, dir),\n sharedFiles: sharedFilesForDir(paths.routesDir, dir),\n verbs: verbsByDir.get(slash(dir)) ?? [],\n }));\n}\n\n/** The per-route metadata maps feeding `manifest.json` / `openapi.json`. */\nexport interface SyncData {\n responsesByFile: Map<string, RouteResponses>;\n inputsByFile: Map<string, RouteInputSchemas>;\n securityByFile: Map<string, RouteSecurity>;\n hiddenFiles: Set<string>;\n}\n\nexport interface SyncResult {\n paths: GiriPaths;\n routes: ScannedRoute[];\n folders: TypeFolder[];\n /** Aggregated route metadata, so a watcher can update one route and re-serialize. */\n data: SyncData;\n}\n\n/**\n * Walk each route's `handle` return type into per-status JSON Schema. Best-effort: a\n * broken project (or missing TypeScript) must not break `sync`, so failures yield an\n * empty map and the manifest simply omits `responses`.\n */\nfunction extractResponses(paths: GiriPaths, routes: ScannedRoute[]): Map<string, RouteResponses> {\n const byFile = new Map<string, RouteResponses>();\n if (routes.length === 0) {\n return byFile;\n }\n\n try {\n const files = [...new Set(routes.map((route) => route.file))];\n // Include the generated global app.d.ts so `c.app` resolves to its real type.\n const appTypes = join(paths.outDir, 'types', 'app.d.ts');\n const program = createSchemaProgram(\n paths,\n existsSync(appTypes) ? [...files, appTypes] : files,\n );\n for (const file of files) {\n byFile.set(file, extractRouteResponses(program, file));\n }\n } catch (error) {\n console.warn(`giri: skipped response schema generation (${(error as Error).message}).`);\n }\n\n return byFile;\n}\n\ninterface RuntimeMeta {\n inputsByFile: Map<string, RouteInputSchemas>;\n securityByFile: Map<string, RouteSecurity>;\n hiddenFiles: Set<string>;\n}\n\n/** Load route modules once to derive input schemas, middleware security, and openapi visibility. */\nasync function extractMeta(\n config: Pick<GiriConfig, 'alias'>,\n paths: GiriPaths,\n routes: ScannedRoute[],\n): Promise<RuntimeMeta> {\n const inputsByFile = new Map<string, RouteInputSchemas>();\n const securityByFile = new Map<string, RouteSecurity>();\n const hiddenFiles = new Set<string>();\n if (routes.length === 0) {\n return { inputsByFile, securityByFile, hiddenFiles };\n }\n\n try {\n const meta = await extractRouteMeta(config, paths, routes);\n for (const [file, entry] of meta) {\n if (entry.input) {\n inputsByFile.set(file, entry.input);\n }\n if (entry.security) {\n securityByFile.set(file, entry.security);\n }\n if (entry.hidden) {\n hiddenFiles.add(file);\n }\n }\n } catch (error) {\n console.warn(`giri: skipped input/security generation (${(error as Error).message}).`);\n }\n\n return { inputsByFile, securityByFile, hiddenFiles };\n}\n\n/**\n * Scan `routes/` and (re)generate the whole `.giri/` payload. Each artifact has its own\n * module under `src/generator/`. Files are overwritten **in place** (no upfront wipe), so\n * the editor never sees `tsconfig`/`$types` vanish during a slow regeneration; orphaned\n * files from removed routes are pruned at the end.\n */\nexport async function syncProject<App>(\n config: Pick<GiriConfig<App>, 'alias' | 'outDir'>,\n options: { cwd?: string } = {},\n): Promise<SyncResult> {\n const paths = resolveGiriPaths(config, options.cwd);\n assertSafeOutDir(paths);\n const routes = await scanRoutes(paths.routesDir);\n const folders = await typeFolders(paths, routes);\n\n await mkdir(paths.outDir, { recursive: true });\n await writeParamTypes(paths, folders);\n await writeRouteTypes(paths, routes);\n await writeAppTypes(paths);\n await writeTsConfig(paths, config);\n\n // Response schemas need the generated tsconfig + $types to resolve, so extract last.\n const responsesByFile = extractResponses(paths, routes);\n const { inputsByFile, securityByFile, hiddenFiles } = await extractMeta(config, paths, routes);\n const data: SyncData = { responsesByFile, inputsByFile, securityByFile, hiddenFiles };\n await writeManifest(paths, routes, data);\n await writeOpenApi(paths, routes, data);\n\n await pruneDir(\n paths.outDir,\n new Set([\n join(paths.outDir, 'tsconfig.json'),\n join(paths.outDir, 'manifest.json'),\n join(paths.outDir, 'openapi.json'),\n join(paths.outDir, 'routes.d.ts'),\n join(paths.outDir, 'types', 'app.d.ts'),\n ...folders.map((folder) => typeFilePath(paths, folder.dir)),\n ]),\n );\n\n return { paths, routes, folders, data };\n}\n","import { existsSync } from 'node:fs';\nimport { join, relative } from 'node:path';\nimport type { GiriPaths } from '../types';\nimport { GENERATED_HEADER, slash, writeGenerated } from './util';\n\nconst MAIN_EXTENSIONS = ['ts', 'tsx', 'mts', 'cts', 'js', 'jsx', 'mjs', 'cjs'];\n\nfunction findMainFile(cwd: string): string | undefined {\n for (const ext of MAIN_EXTENSIONS) {\n const file = join(cwd, 'src', `main.${ext}`);\n if (existsSync(file)) {\n return file;\n }\n }\n return undefined;\n}\n\nfunction moduleSpecifier(fromDir: string, target: string): string {\n let path = slash(relative(fromDir, target)).replace(/\\.(?:[cm]?[jt]sx?)$/, '');\n if (!path.startsWith('.')) {\n path = `./${path}`;\n }\n return path;\n}\n\nexport async function writeAppTypes(paths: GiriPaths): Promise<void> {\n const file = join(paths.outDir, 'types', 'app.d.ts');\n const mainFile = findMainFile(paths.cwd);\n\n if (!mainFile) {\n await writeGenerated(file, [GENERATED_HEADER, 'export {};', ''].join('\\n'));\n return;\n }\n\n const spec = moduleSpecifier(join(paths.outDir, 'types'), mainFile);\n await writeGenerated(\n file,\n [\n GENERATED_HEADER,\n 'declare global {',\n ' namespace Giri {',\n ' interface Register {',\n ` app: typeof import(${JSON.stringify(spec)}) extends {`,\n ' init: (...args: any[]) => infer R;',\n ' }',\n ' ? Awaited<R>',\n ' : Record<string, unknown>;',\n ' }',\n ' }',\n '}',\n 'export {};',\n '',\n ].join('\\n'),\n );\n}\n","import { existsSync } from 'node:fs';\nimport { mkdir, readdir, rm, rmdir, writeFile } from 'node:fs/promises';\nimport { dirname, join, relative, sep } from 'node:path';\nimport type { GiriPaths } from '../types';\n\nexport const GENERATED_HEADER = '// Generated by giri sync. Do not edit.';\n\nexport function slash(path: string): string {\n return path.split(sep).join('/');\n}\n\nexport function importPath(fromFile: string, toFile: string): string {\n let path = slash(relative(dirname(fromFile), toFile)).replace(/\\.d\\.ts$/, '');\n if (!path.startsWith('.')) {\n path = `./${path}`;\n }\n return path;\n}\n\nexport function relativeConfigPath(fromDir: string, toPath: string): string {\n let path = slash(relative(fromDir, toPath));\n if (!path.startsWith('.')) {\n path = `./${path}`;\n }\n return path;\n}\n\n/** A relative ESM module specifier from `fromDir` to a source file (extension stripped). */\nexport function moduleSpecifier(fromDir: string, target: string): string {\n let path = slash(relative(fromDir, target)).replace(/\\.(?:[cm]?[jt]sx?)$/, '');\n if (!path.startsWith('.')) {\n path = `./${path}`;\n }\n return path;\n}\n\nexport function typeFilePath(paths: GiriPaths, routeDir: string): string {\n // Mirror the folder's source directory (relative to the project root) under\n // `<outDir>/types/`. Combined with `rootDirs: [\"..\", \"./types\"]`, this lets a file's\n const sourceDir = relative(paths.cwd, routeDir);\n return join(paths.outDir, 'types', sourceDir, '$types.d.ts');\n}\n\nexport function assertSafeOutDir(paths: GiriPaths): void {\n const rel = relative(paths.cwd, paths.outDir);\n if (!rel || rel.startsWith('..') || rel.includes(`..${sep}`)) {\n throw new Error(`Refusing to sync outside the project root: ${paths.outDir}`);\n }\n}\n\nconst writeCache = new Map<string, string>();\n\n/** Write a generated file, skipping the write when its content is unchanged and still on disk. */\nexport async function writeGenerated(path: string, content: string): Promise<void> {\n if (writeCache.get(path) === content && existsSync(path)) {\n return;\n }\n await mkdir(dirname(path), { recursive: true });\n await writeFile(path, content);\n writeCache.set(path, content);\n}\n\nexport async function writeJson(path: string, value: unknown): Promise<void> {\n await writeGenerated(path, `${JSON.stringify(value, null, 2)}\\n`);\n}\n\n/**\n * Remove generated files no longer in `keep`, plus any directories left empty. Lets sync\n * overwrite in place (no upfront wipe), so the editor never sees `tsconfig`/`$types`\n * disappear during a slow regeneration.\n */\nexport async function pruneDir(dir: string, keep: Set<string>): Promise<void> {\n let entries;\n try {\n entries = await readdir(dir, { withFileTypes: true });\n } catch {\n return;\n }\n for (const entry of entries) {\n const full = join(dir, entry.name);\n if (entry.isDirectory()) {\n await pruneDir(full, keep);\n await rmdir(full).catch(() => {}); // succeeds only if now empty\n } else if (!keep.has(full)) {\n await rm(full, { force: true });\n writeCache.delete(full); // a recreated file with identical content must write again\n }\n }\n}\n","import { join, relative } from 'node:path';\nimport type { ScannedRoute } from '../routes';\nimport type { GiriPaths } from '../types';\nimport type { RouteInputSchemas } from './inputs';\nimport type { RouteSecurity } from './route-meta';\nimport type { RouteResponses } from './schema';\nimport { slash, typeFilePath, writeJson } from './util';\n\nexport interface ManifestData {\n responsesByFile?: Map<string, RouteResponses>;\n inputsByFile?: Map<string, RouteInputSchemas>;\n securityByFile?: Map<string, RouteSecurity>;\n hiddenFiles?: Set<string>;\n}\n\n/** Emits `manifest.json`: the machine-readable route table consumed by tooling. */\nexport async function writeManifest(\n paths: GiriPaths,\n routes: ScannedRoute[],\n data: ManifestData = {},\n): Promise<void> {\n const manifest = {\n version: 1,\n routes: routes.map((route) => {\n const responses = data.responsesByFile?.get(route.file);\n const input = data.inputsByFile?.get(route.file);\n const security = data.securityByFile?.get(route.file);\n return {\n method: route.method,\n path: route.path,\n file: slash(relative(paths.cwd, route.file)),\n params: route.params,\n shared: route.sharedFiles.map((file) => slash(relative(paths.cwd, file))),\n types: slash(relative(paths.cwd, typeFilePath(paths, route.routeDir))),\n ...(data.hiddenFiles?.has(route.file) ? { hidden: true } : {}),\n ...(input ? { input } : {}),\n ...(security && security.security.length > 0 ? { security: security.security } : {}),\n responses: responses?.responses ?? [],\n ...(responses && Object.keys(responses.$defs).length > 0\n ? { $defs: responses.$defs }\n : {}),\n };\n }),\n };\n\n await writeJson(join(paths.outDir, 'manifest.json'), manifest);\n}\n","import { existsSync, readFileSync } from 'node:fs';\nimport { join } from 'node:path';\nimport type { OpenAPIV3_1 } from 'openapi-types';\nimport type { ScannedRoute } from '../routes';\nimport type { GiriPaths } from '../types';\nimport type { RouteInputSchemas } from './inputs';\nimport type { RouteSecurity } from './route-meta';\nimport type { JSONSchema, ResponseSchema, RouteResponses } from './schema';\nimport { writeJson } from './util';\n\nexport interface OpenApiData {\n responsesByFile?: Map<string, RouteResponses>;\n inputsByFile?: Map<string, RouteInputSchemas>;\n securityByFile?: Map<string, RouteSecurity>;\n hiddenFiles?: Set<string>;\n}\n\ntype JsonObject = Record<string, unknown>;\n\nconst REASON: Record<number, string> = {\n 200: 'OK',\n 201: 'Created',\n 202: 'Accepted',\n 204: 'No Content',\n 400: 'Bad Request',\n 401: 'Unauthorized',\n 403: 'Forbidden',\n 404: 'Not Found',\n 409: 'Conflict',\n 422: 'Unprocessable Entity',\n 500: 'Internal Server Error',\n};\n\nfunction toOpenApiPath(path: string): string {\n return path.replace(/:([A-Za-z0-9_]+)(?:\\{[^}]*\\})?/g, '{$1}');\n}\n\n/** Rewrite walker-local `#/$defs/X` refs to the document-level `#/components/schemas/X`. */\nfunction rewriteRefs(value: unknown): unknown {\n if (Array.isArray(value)) {\n return value.map(rewriteRefs);\n }\n if (value && typeof value === 'object') {\n const out: JsonObject = {};\n for (const [key, child] of Object.entries(value)) {\n if (key === '$ref' && typeof child === 'string' && child.startsWith('#/$defs/')) {\n out.$ref = child.replace('#/$defs/', '#/components/schemas/');\n } else {\n out[key] = rewriteRefs(child);\n }\n }\n return out;\n }\n return value;\n}\n\nfunction mediaTypeFor(format: 'json' | 'text'): string {\n return format === 'text' ? 'text/plain' : 'application/json';\n}\n\nconst BODY_MEDIA_TYPE: Record<string, string> = {\n json: 'application/json',\n form: 'multipart/form-data',\n urlencoded: 'application/x-www-form-urlencoded',\n text: 'text/plain',\n};\n\nfunction buildResponses(responses: ResponseSchema[]): JsonObject {\n if (responses.length === 0) {\n return { default: { description: 'Response' } };\n }\n\n const out: JsonObject = {};\n for (const response of responses) {\n const key = response.status === 'default' ? 'default' : String(response.status);\n const description =\n (typeof response.status === 'number' && REASON[response.status]) || 'Response';\n out[key] = {\n description,\n content: { [mediaTypeFor(response.format)]: { schema: rewriteRefs(response.schema) } },\n };\n }\n return out;\n}\n\nfunction pathParameters(route: ScannedRoute): JsonObject[] {\n const seen = new Set<string>();\n const params: JsonObject[] = [];\n for (const param of route.params) {\n if (seen.has(param.name)) {\n continue;\n }\n seen.add(param.name);\n params.push({ name: param.name, in: 'path', required: true, schema: { type: 'string' } });\n }\n return params;\n}\n\nfunction queryParameters(query: JSONSchema | undefined): JsonObject[] {\n if (!query || query.type !== 'object' || typeof query.properties !== 'object') {\n return [];\n }\n const properties = query.properties as Record<string, JSONSchema>;\n const required = Array.isArray(query.required) ? (query.required as string[]) : [];\n return Object.entries(properties).map(([name, schema]) => ({\n name,\n in: 'query',\n required: required.includes(name),\n schema: rewriteRefs(schema),\n }));\n}\n\nfunction readProjectInfo(cwd: string): { title: string; version: string } {\n const file = join(cwd, 'package.json');\n if (existsSync(file)) {\n try {\n const pkg = JSON.parse(readFileSync(file, 'utf8')) as { name?: string; version?: string };\n return { title: pkg.name ?? 'giri API', version: pkg.version ?? '0.0.0' };\n } catch {\n // fall through to defaults\n }\n }\n return { title: 'giri API', version: '0.0.0' };\n}\n\n/** Assemble an OpenAPI 3.1 document from the scanned routes + generated schemas. */\nexport function buildOpenApiDocument(\n paths: GiriPaths,\n routes: ScannedRoute[],\n data: OpenApiData = {},\n): OpenAPIV3_1.Document {\n const documentPaths: JsonObject = {};\n const schemas: JsonObject = {};\n const securitySchemes: JsonObject = {};\n\n for (const route of routes) {\n if (data.hiddenFiles?.has(route.file)) {\n continue; // excluded from the doc via `openapi`/`+shared.ts`\n }\n const responses = data.responsesByFile?.get(route.file);\n const input = data.inputsByFile?.get(route.file);\n const security = data.securityByFile?.get(route.file);\n\n for (const [name, schema] of Object.entries(responses?.$defs ?? {})) {\n schemas[name] = rewriteRefs(schema);\n }\n\n const operation: JsonObject = { responses: buildResponses(responses?.responses ?? []) };\n\n const parameters = [...pathParameters(route), ...queryParameters(input?.query)];\n if (parameters.length > 0) {\n operation.parameters = parameters;\n }\n if (input?.body) {\n const content: JsonObject = {};\n for (const [contentType, schema] of Object.entries(input.body)) {\n content[BODY_MEDIA_TYPE[contentType] ?? contentType] = {\n schema: rewriteRefs(schema),\n };\n }\n if (Object.keys(content).length > 0) {\n operation.requestBody = { required: true, content };\n }\n }\n if (security && security.security.length > 0) {\n operation.security = security.security;\n }\n if (security) {\n Object.assign(securitySchemes, security.securitySchemes);\n }\n\n const openApiPath = toOpenApiPath(route.path);\n const pathItem = (documentPaths[openApiPath] as JsonObject) ?? {};\n pathItem[route.method.toLowerCase()] = operation;\n documentPaths[openApiPath] = pathItem;\n }\n\n const document: JsonObject = {\n openapi: '3.1.0',\n info: readProjectInfo(paths.cwd),\n paths: documentPaths,\n };\n const components: JsonObject = {};\n if (Object.keys(schemas).length > 0) {\n components.schemas = schemas;\n }\n if (Object.keys(securitySchemes).length > 0) {\n components.securitySchemes = securitySchemes;\n }\n if (Object.keys(components).length > 0) {\n document.components = components;\n }\n return document as unknown as OpenAPIV3_1.Document;\n}\n\n/** Emit `.giri/openapi.json`. */\nexport async function writeOpenApi(\n paths: GiriPaths,\n routes: ScannedRoute[],\n data: OpenApiData = {},\n): Promise<void> {\n await writeJson(join(paths.outDir, 'openapi.json'), buildOpenApiDocument(paths, routes, data));\n}\n","import { dirname } from 'node:path';\nimport type { RouteParam } from '../routes';\nimport type { GiriPaths, HttpMethod } from '../types';\nimport { GENERATED_HEADER, moduleSpecifier, typeFilePath, writeGenerated } from './util';\n\nexport interface TypeFolder {\n dir: string;\n params: RouteParam[];\n /** The `+shared.ts` chain whose injected vars apply here. */\n sharedFiles: string[];\n /** The verb files (`+get.ts`, `+post.ts`, …) in this folder, one method-named handle each. */\n verbs: { method: HttpMethod; file: string }[];\n}\n\nfunction paramsType(params: RouteParam[]): string {\n if (params.length === 0) {\n return '{}';\n }\n\n const unique = new Map<string, RouteParam>();\n for (const param of params) {\n unique.set(param.name, param);\n }\n\n const fields = [...unique.values()]\n .map((param) => ` ${JSON.stringify(param.name)}: string;`)\n .join('\\n');\n return `{\\n${fields}\\n}`;\n}\n\n/** Merge the injected vars of the folder's `+shared.ts` middleware chain */\nfunction varsType(typesDir: string, sharedFiles: string[]): string {\n if (sharedFiles.length === 0) {\n return '{}';\n }\n return sharedFiles\n .map((file) => {\n const spec = JSON.stringify(moduleSpecifier(typesDir, file));\n return `(typeof import(${spec}) extends { middleware: infer M } ? import(\"@boon4681/giri\").InferStackVars<M> : {})`;\n })\n .join('\\n & ');\n}\n\nfunction methodExports(typesDir: string, verbs: TypeFolder['verbs']): string[] {\n return verbs.map(({ method, file }) => {\n const spec = JSON.stringify(moduleSpecifier(typesDir, file));\n const input = `import(\"@boon4681/giri\").RouteInputOf<typeof import(${spec})>`;\n const vars = `Vars & import(\"@boon4681/giri\").MiddlewareVarsOf<typeof import(${spec})>`;\n return `export type ${method} = import(\"@boon4681/giri\").Handle<Params, ${input}, ${vars}>;`;\n });\n}\n\nexport async function writeParamTypes(paths: GiriPaths, folders: TypeFolder[]): Promise<void> {\n for (const { dir, params, sharedFiles, verbs } of folders) {\n const file = typeFilePath(paths, dir);\n const typesDir = dirname(file);\n const lines = [\n GENERATED_HEADER,\n `export type Params = ${paramsType(params)};`,\n 'export type RouteParams = Params;',\n `type Vars = ${varsType(typesDir, sharedFiles)};`,\n 'export type Middleware<Injects extends Record<string, unknown> = {}> =',\n ' import(\"@boon4681/giri\").Middleware<Params, import(\"@boon4681/giri\").ValidatedInput, Injects>;',\n 'export type Handle<Input extends import(\"@boon4681/giri\").ValidatedInput = import(\"@boon4681/giri\").ValidatedInput> =',\n ' import(\"@boon4681/giri\").Handle<Params, Input, Vars>;',\n ];\n if (verbs.length > 0) {\n lines.push(...methodExports(typesDir, verbs));\n }\n lines.push('');\n await writeGenerated(file, lines.join('\\n'));\n }\n}\n","import { isGiriBodySchema, isGiriInputSchema } from '../validation';\nimport type { BodyContentType } from '../types';\nimport type { JSONSchema } from './schema';\n\nexport interface RouteInputSchemas {\n /** JSON Schema per declared body content-type (`json`, `form`, …). */\n body?: Partial<Record<BodyContentType, JSONSchema>>;\n query?: JSONSchema;\n}\n\nfunction sanitize(schema: JSONSchema): JSONSchema {\n // `$schema` is meaningful standalone but noise once embedded in OpenAPI.\n const { $schema, ...rest } = schema;\n void $schema;\n return rest;\n}\n\n/**\n * Convert a declared input to JSON Schema by asking the wrapper.\n */\nexport function inputToJsonSchema(schema: unknown): JSONSchema | undefined {\n if (!isGiriInputSchema(schema)) {\n return undefined;\n }\n return sanitize(schema.toJsonSchema());\n}\n\n/**\n * Convert a declared body (`zod.body({ json, form })`) to a JSON Schema per content-type.\n * Returns `undefined` when the value isn't a giri body schema or carries no schemas.\n */\nexport function bodyToJsonSchemas(\n value: unknown,\n): Partial<Record<BodyContentType, JSONSchema>> | undefined {\n if (!isGiriBodySchema(value)) {\n return undefined;\n }\n const out: Partial<Record<BodyContentType, JSONSchema>> = {};\n for (const [contentType, schema] of Object.entries(value.contents)) {\n const json = inputToJsonSchema(schema);\n if (json) {\n out[contentType as BodyContentType] = json;\n }\n }\n return Object.keys(out).length > 0 ? out : undefined;\n}\n","import { registerAliasResolver } from '../app';\nimport { safeRegister } from '../loader/loader';\nimport type { ScannedRoute } from '../routes';\nimport type { GiriConfig, GiriPaths, Middleware, SecurityRequirement } from '../types';\nimport { bodyToJsonSchemas, inputToJsonSchema, type RouteInputSchemas } from './inputs';\n\nexport interface RouteSecurity {\n /** Operation-level `security` requirements, e.g. `[{ bearerAuth: [] }]`. */\n security: SecurityRequirement[];\n /** Scheme definitions to merge into `components.securitySchemes`. */\n securitySchemes: Record<string, unknown>;\n}\n\nexport interface RouteMeta {\n input?: RouteInputSchemas;\n security?: RouteSecurity;\n /** Excluded from `openapi.json` (via `openapi`/`+shared.ts` resolution). */\n hidden?: boolean;\n}\n\nfunction loadModule(file: string): Record<string, unknown> {\n const resolved = require.resolve(file);\n delete require.cache[resolved];\n return require(resolved) as Record<string, unknown>;\n}\n\nfunction interopDefault(value: unknown): unknown {\n if (value && typeof value === 'object' && 'default' in value) {\n return (value as { default: unknown }).default;\n }\n return value;\n}\n\nfunction middlewareFunctions(value: unknown): Middleware[] {\n const exported = interopDefault(value);\n if (typeof exported === 'function') {\n return [exported as Middleware];\n }\n if (Array.isArray(exported)) {\n return exported.filter((fn): fn is Middleware => typeof fn === 'function');\n }\n return [];\n}\n\nfunction readInput(routeModule: Record<string, unknown>): RouteInputSchemas | undefined {\n const input: RouteInputSchemas = {};\n const body = bodyToJsonSchemas(routeModule.body);\n const query = inputToJsonSchema(routeModule.query);\n if (body) {\n input.body = body;\n }\n if (query) {\n input.query = query;\n }\n return input.body || input.query ? input : undefined;\n}\n\nfunction hiddenFrom(value: unknown): boolean | undefined {\n if (value === false) {\n return true;\n }\n if (value === true) {\n return false;\n }\n if (value && typeof value === 'object' && 'hidden' in value) {\n return Boolean((value as { hidden?: unknown }).hidden);\n }\n return undefined; // no opinion\n}\n\nfunction collectHidden(\n route: ScannedRoute,\n routeModule: Record<string, unknown>,\n loadShared: (file: string) => Record<string, unknown>,\n): boolean {\n let hidden = false;\n for (const file of route.sharedFiles) {\n const opinion = hiddenFrom(loadShared(file).openapi);\n if (opinion !== undefined) {\n hidden = opinion;\n }\n }\n const verb = hiddenFrom(routeModule.openapi);\n return verb ?? hidden;\n}\n\nfunction collectSecurity(\n route: ScannedRoute,\n routeModule: Record<string, unknown>,\n loadShared: (file: string) => Record<string, unknown>,\n): RouteSecurity | undefined {\n const skipInherited = Boolean(\n (routeModule.config as { skipInherited?: boolean } | undefined)?.skipInherited,\n );\n\n const middleware: Middleware[] = [];\n if (!skipInherited) {\n for (const file of route.sharedFiles) {\n middleware.push(...middlewareFunctions(loadShared(file).middleware));\n }\n }\n middleware.push(...middlewareFunctions(routeModule.middleware));\n\n const security: SecurityRequirement[] = [];\n const securitySchemes: Record<string, unknown> = {};\n for (const fn of middleware) {\n const openapi = fn.openapi;\n if (openapi?.security) {\n for (const requirement of openapi.security) {\n if (!security.some((seen) => JSON.stringify(seen) === JSON.stringify(requirement))) {\n security.push(requirement);\n }\n }\n }\n if (openapi?.securitySchemes) {\n Object.assign(securitySchemes, openapi.securitySchemes);\n }\n }\n\n return security.length > 0 || Object.keys(securitySchemes).length > 0\n ? { security, securitySchemes }\n : undefined;\n}\n\n/**\n * Load each route module once (with import aliases active) to derive runtime metadata:\n * input JSON Schemas from `body`/`query`, and OpenAPI `security` from the middleware\n * actually applied to the route (folder chain + verb, honoring `skipInherited`).\n */\nexport async function extractRouteMeta(\n config: Pick<GiriConfig, 'alias'>,\n paths: GiriPaths,\n routes: ScannedRoute[],\n): Promise<Map<string, RouteMeta>> {\n const byFile = new Map<string, RouteMeta>();\n const { unregister } = await safeRegister();\n const unregisterAlias = registerAliasResolver(config.alias, paths.cwd);\n const sharedCache = new Map<string, Record<string, unknown>>();\n const loadShared = (file: string): Record<string, unknown> => {\n if (!sharedCache.has(file)) {\n try {\n sharedCache.set(file, loadModule(file));\n } catch {\n sharedCache.set(file, {});\n }\n }\n return sharedCache.get(file)!;\n };\n\n try {\n for (const route of routes) {\n try {\n const routeModule = loadModule(route.file);\n const meta: RouteMeta = {};\n const input = readInput(routeModule);\n const security = collectSecurity(route, routeModule, loadShared);\n const hidden = collectHidden(route, routeModule, loadShared);\n if (input) {\n meta.input = input;\n }\n if (security) {\n meta.security = security;\n }\n if (hidden) {\n meta.hidden = true;\n }\n if (meta.input || meta.security || meta.hidden) {\n byFile.set(route.file, meta);\n }\n } catch {\n // A route that fails to load just contributes no metadata.\n }\n }\n } finally {\n unregisterAlias();\n unregister();\n }\n\n return byFile;\n}\n","import { join } from 'node:path';\nimport type { ScannedRoute } from '../routes';\nimport type { GiriPaths } from '../types';\nimport { GENERATED_HEADER, importPath, typeFilePath, writeGenerated } from './util';\n\n/** Emits `routes.d.ts`: a `RouteParams` map keyed by `\"METHOD path\"` for the whole app. */\nexport async function writeRouteTypes(paths: GiriPaths, routes: ScannedRoute[]): Promise<void> {\n const file = join(paths.outDir, 'routes.d.ts');\n const lines = [\n GENERATED_HEADER,\n 'export interface RouteParams {',\n ];\n\n for (const route of routes) {\n const typeFile = typeFilePath(paths, route.routeDir);\n lines.push(\n ` ${JSON.stringify(`${route.method} ${route.path}`)}: import(${JSON.stringify(\n importPath(file, typeFile),\n )}).Params;`,\n );\n }\n\n lines.push('}', '');\n await writeGenerated(file, lines.join('\\n'));\n}\n","import ts from 'typescript';\nimport type { GiriPaths } from '../../types';\n\nconst DEFAULT_OPTIONS: ts.CompilerOptions = {\n target: ts.ScriptTarget.ES2022,\n module: ts.ModuleKind.NodeNext,\n moduleResolution: ts.ModuleResolutionKind.NodeNext,\n strict: true,\n skipLibCheck: true,\n noEmit: true,\n};\n\n/**\n * Build a `ts.Program` rooted at the given route files, using the project's own\n * `tsconfig.json` (so `paths`, `rootDirs`, and the user's TS settings apply). The\n * walker reads types from this program; nothing is emitted.\n */\nexport function createSchemaProgram(paths: GiriPaths, routeFiles: string[]): ts.Program {\n let options: ts.CompilerOptions = { ...DEFAULT_OPTIONS };\n\n const configPath = ts.findConfigFile(paths.cwd, ts.sys.fileExists, 'tsconfig.json');\n if (configPath) {\n const parsed = ts.getParsedCommandLineOfConfigFile(configPath, {}, {\n ...ts.sys,\n onUnRecoverableConfigFileDiagnostic: () => {},\n });\n if (parsed) {\n options = { ...parsed.options, noEmit: true };\n }\n }\n\n return ts.createProgram(routeFiles, options);\n}\n","import ts from 'typescript';\nimport { createWalkContext, walkType, type JSONSchema } from './json-schema';\n\nexport interface ResponseSchema {\n /** Numeric HTTP status, or 'default' when the handler returns a non-literal status. */\n status: number | 'default';\n format: 'json' | 'text';\n schema: JSONSchema;\n}\n\nexport interface RouteResponses {\n responses: ResponseSchema[];\n /** Statuses/returns the walker could not turn into a schema (e.g. a raw `Response`). */\n opaque: boolean;\n warnings: string[];\n $defs: Record<string, JSONSchema>;\n}\n\nfunction findHandleFunction(\n source: ts.SourceFile,\n): ts.ArrowFunction | ts.FunctionExpression | ts.FunctionDeclaration | undefined {\n let found: ts.ArrowFunction | ts.FunctionExpression | ts.FunctionDeclaration | undefined;\n\n const isExported = (node: ts.Node): boolean =>\n ts.canHaveModifiers(node) &&\n (ts.getModifiers(node)?.some((m) => m.kind === ts.SyntaxKind.ExportKeyword) ?? false);\n\n for (const statement of source.statements) {\n if (ts.isFunctionDeclaration(statement) && statement.name?.text === 'handle' && isExported(statement)) {\n found = statement;\n }\n if (ts.isVariableStatement(statement) && isExported(statement)) {\n for (const declaration of statement.declarationList.declarations) {\n if (\n ts.isIdentifier(declaration.name) &&\n declaration.name.text === 'handle' &&\n declaration.initializer &&\n (ts.isArrowFunction(declaration.initializer) ||\n ts.isFunctionExpression(declaration.initializer))\n ) {\n found = declaration.initializer;\n }\n }\n }\n }\n\n return found;\n}\n\nfunction collectReturnExpressions(\n fn: ts.ArrowFunction | ts.FunctionExpression | ts.FunctionDeclaration,\n): ts.Expression[] {\n if (ts.isArrowFunction(fn) && !ts.isBlock(fn.body)) {\n return [fn.body];\n }\n if (!fn.body) {\n return [];\n }\n\n const expressions: ts.Expression[] = [];\n const visit = (node: ts.Node): void => {\n if (ts.isFunctionDeclaration(node) || ts.isFunctionExpression(node) || ts.isArrowFunction(node)) {\n return;\n }\n if (ts.isReturnStatement(node) && node.expression) {\n expressions.push(node.expression);\n }\n ts.forEachChild(node, visit);\n };\n ts.forEachChild(fn.body, visit);\n return expressions;\n}\n\ninterface ResponseHit {\n status: number | 'default';\n format: 'json' | 'text';\n data: ts.Type;\n}\n\nfunction propertyType(\n checker: ts.TypeChecker,\n type: ts.Type,\n name: string,\n location: ts.Node,\n): ts.Type | undefined {\n const symbol = checker.getPropertyOfType(type, name);\n return symbol ? checker.getTypeOfSymbolAtLocation(symbol, location) : undefined;\n}\n\nfunction isTypedResponse(checker: ts.TypeChecker, type: ts.Type): boolean {\n return Boolean(\n checker.getPropertyOfType(type, 'data') &&\n checker.getPropertyOfType(type, 'status') &&\n checker.getPropertyOfType(type, 'format'),\n );\n}\n\n/**\n * Read a `c.json(data, status?)` / `c.text(data, status?)` call directly. Reading the\n * status from the argument (default 200) sidesteps contextual typing: a `: Handle`\n * annotation otherwise widens an omitted status from its `= 200` default down to\n * `StatusCode`. Data still comes from the argument's own type.\n */\nfunction readFromCall(checker: ts.TypeChecker, expression: ts.Expression): ResponseHit | undefined {\n if (!ts.isCallExpression(expression) || !ts.isPropertyAccessExpression(expression.expression)) {\n return undefined;\n }\n const method = expression.expression.name.text;\n if (method !== 'json' && method !== 'text') {\n return undefined;\n }\n if (!isTypedResponse(checker, checker.getTypeAtLocation(expression))) {\n return undefined;\n }\n\n const [dataArg, statusArg] = expression.arguments;\n if (!dataArg) {\n return undefined;\n }\n\n let status: number | 'default' = 200;\n if (statusArg) {\n const statusType = checker.getTypeAtLocation(statusArg);\n status = statusType.isNumberLiteral() ? statusType.value : 'default';\n }\n\n return { status, format: method === 'text' ? 'text' : 'json', data: checker.getTypeAtLocation(dataArg) };\n}\n\n/** Fallback for non-`c.json` returns: read `{ data, status, format }` off the type itself. */\nfunction readFromType(checker: ts.TypeChecker, type: ts.Type, location: ts.Node): ResponseHit | undefined {\n const dataType = propertyType(checker, type, 'data', location);\n const statusType = propertyType(checker, type, 'status', location);\n const formatType = propertyType(checker, type, 'format', location);\n if (!dataType || !statusType || !formatType) {\n return undefined;\n }\n\n const status = statusType.isNumberLiteral() ? statusType.value : 'default';\n const format = formatType.isStringLiteral() && formatType.value === 'text' ? 'text' : 'json';\n return { status, format, data: dataType };\n}\n\nfunction constituents(type: ts.Type): ts.Type[] {\n return type.isUnion() ? type.types : [type];\n}\n\n/**\n * Extract per-status response schemas for a route's `handle` export by typing each of\n * its return expressions and unwrapping giri's `TypedResponse<data, status, format>`.\n */\nexport function extractRouteResponses(program: ts.Program, file: string): RouteResponses {\n const result: RouteResponses = { responses: [], opaque: false, warnings: [], $defs: {} };\n const source = program.getSourceFile(file);\n if (!source) {\n return result;\n }\n\n const checker = program.getTypeChecker();\n const fn = findHandleFunction(source);\n if (!fn) {\n return result;\n }\n\n const ctx = createWalkContext(checker, fn);\n const byStatus = new Map<number | 'default', { format: 'json' | 'text'; schemas: JSONSchema[] }>();\n\n const record = (hit: ResponseHit): void => {\n const schema = walkType(hit.data, ctx);\n const bucket = byStatus.get(hit.status) ?? { format: hit.format, schemas: [] };\n bucket.schemas.push(schema);\n byStatus.set(hit.status, bucket);\n };\n\n for (const expression of collectReturnExpressions(fn)) {\n const fromCall = readFromCall(checker, expression);\n if (fromCall) {\n record(fromCall);\n continue;\n }\n\n let matched = false;\n for (const member of constituents(checker.getTypeAtLocation(expression))) {\n const hit = readFromType(checker, member, expression);\n if (hit) {\n record(hit);\n matched = true;\n }\n }\n if (!matched) {\n result.opaque = true;\n }\n }\n\n for (const [status, { format, schemas }] of byStatus) {\n const schema = schemas.length === 1 ? schemas[0] : { anyOf: schemas };\n result.responses.push({ status, format, schema });\n }\n result.responses.sort((a, b) => Number(a.status) - Number(b.status));\n result.warnings = ctx.warnings;\n result.$defs = ctx.defs;\n return result;\n}\n","import ts from 'typescript';\n\nexport type JSONSchema = Record<string, unknown>;\n\nexport interface WalkContext {\n checker: ts.TypeChecker;\n /** Node used to resolve property types in context. */\n location: ts.Node;\n /** Shared `$defs` bucket for recursive types. */\n defs: Record<string, JSONSchema>;\n /** Type ids currently being walked, mapped to their `$defs` name (cycle guard). */\n inProgress: Map<number, string>;\n /** `$defs` names that were referenced via `$ref` (i.e. proved recursive). */\n usedDefs: Set<string>;\n /** Non-fatal notes (e.g. bigint serialization caveats). */\n warnings: string[];\n}\n\nexport function createWalkContext(checker: ts.TypeChecker, location: ts.Node): WalkContext {\n return {\n checker,\n location,\n defs: {},\n inProgress: new Map(),\n usedDefs: new Set(),\n warnings: [],\n };\n}\n\nfunction typeId(type: ts.Type): number {\n return (type as ts.Type & { id: number }).id;\n}\n\nfunction intrinsicName(type: ts.Type): string | undefined {\n return (type as ts.Type & { intrinsicName?: string }).intrinsicName;\n}\n\nfunction isDateType(type: ts.Type): boolean {\n const symbol = type.getSymbol() ?? type.aliasSymbol;\n return symbol?.getName() === 'Date';\n}\n\nfunction literalValuesOf(types: ts.Type[]): unknown[] | undefined {\n const values: unknown[] = [];\n for (const member of types) {\n if (member.isStringLiteral() || member.isNumberLiteral()) {\n values.push(member.value);\n } else if (member.flags & ts.TypeFlags.BooleanLiteral) {\n values.push(intrinsicName(member) === 'true');\n } else {\n return undefined;\n }\n }\n return values;\n}\n\nfunction walkUnion(type: ts.UnionType, ctx: WalkContext): JSONSchema {\n const flag = (ts.TypeFlags.Undefined | ts.TypeFlags.Void | ts.TypeFlags.Never);\n const members = type.types.filter((member) => !(member.flags & flag));\n\n if (members.length === 1) {\n return walkType(members[0], ctx);\n }\n\n const enumValues = literalValuesOf(members);\n if (enumValues) {\n return { enum: enumValues };\n }\n\n return { anyOf: members.map((member) => walkType(member, ctx)) };\n}\n\nfunction buildObjectSchema(type: ts.Type, ctx: WalkContext): JSONSchema {\n const { checker } = ctx;\n\n const indexInfo =\n checker.getIndexInfoOfType(type, ts.IndexKind.String) ??\n checker.getIndexInfoOfType(type, ts.IndexKind.Number);\n\n const properties: Record<string, JSONSchema> = {};\n const required: string[] = [];\n\n for (const symbol of checker.getPropertiesOfType(type)) {\n const name = symbol.getName();\n const propType = checker.getTypeOfSymbolAtLocation(symbol, ctx.location);\n const optional =\n Boolean(symbol.getFlags() & ts.SymbolFlags.Optional) ||\n Boolean(propType.flags & ts.TypeFlags.Union &&\n (propType as ts.UnionType).types.some((t) => t.flags & ts.TypeFlags.Undefined));\n\n properties[name] = walkType(propType, ctx);\n if (!optional) {\n required.push(name);\n }\n }\n\n const schema: JSONSchema = { type: 'object' };\n if (Object.keys(properties).length > 0) {\n schema.properties = properties;\n }\n if (required.length > 0) {\n schema.required = required;\n }\n if (indexInfo) {\n schema.additionalProperties = walkType(indexInfo.type, ctx);\n } else if (Object.keys(properties).length > 0) {\n schema.additionalProperties = false;\n }\n return schema;\n}\n\nfunction defName(type: ts.Type): string {\n const symbol = type.getSymbol() ?? type.aliasSymbol;\n const name = symbol?.getName();\n if (name && name !== '__type' && name !== '__object') {\n return name;\n }\n return `Anonymous${typeId(type)}`;\n}\n\nfunction walkObject(type: ts.Type, ctx: WalkContext): JSONSchema {\n const { checker } = ctx;\n\n if (isDateType(type)) {\n return { type: 'string', format: 'date-time' };\n }\n if (checker.isArrayType(type)) {\n const [element] = checker.getTypeArguments(type as ts.TypeReference);\n return { type: 'array', items: element ? walkType(element, ctx) : {} };\n }\n if (checker.isTupleType(type)) {\n const elements = checker.getTypeArguments(type as ts.TypeReference);\n return { type: 'array', items: elements.map((element) => walkType(element, ctx)) };\n }\n\n const id = typeId(type);\n const existing = ctx.inProgress.get(id);\n if (existing) {\n ctx.usedDefs.add(existing);\n return { $ref: `#/$defs/${existing}` };\n }\n\n const name = defName(type);\n ctx.inProgress.set(id, name);\n const schema = buildObjectSchema(type, ctx);\n ctx.inProgress.delete(id);\n\n if (ctx.usedDefs.has(name)) {\n ctx.defs[name] = schema;\n return { $ref: `#/$defs/${name}` };\n }\n return schema;\n}\n\n/** Translate a TypeScript type into the JSON Schema that `JSON.stringify` would produce. */\nexport function walkType(type: ts.Type, ctx: WalkContext): JSONSchema {\n const flags = type.flags;\n\n if (flags & (ts.TypeFlags.Any | ts.TypeFlags.Unknown)) {\n return {};\n }\n if (flags & ts.TypeFlags.Null) {\n return { type: 'null' };\n }\n if (flags & (ts.TypeFlags.Undefined | ts.TypeFlags.Void)) {\n return {};\n }\n if (flags & (ts.TypeFlags.BigInt | ts.TypeFlags.BigIntLiteral)) {\n ctx.warnings.push('bigint is not JSON-serializable (JSON.stringify throws); documented as string.');\n return { type: 'string' };\n }\n if (type.isStringLiteral()) {\n return { type: 'string', const: type.value };\n }\n if (type.isNumberLiteral()) {\n return { type: 'number', const: type.value };\n }\n if (flags & ts.TypeFlags.BooleanLiteral) {\n return { type: 'boolean', const: intrinsicName(type) === 'true' };\n }\n if (flags & ts.TypeFlags.String) {\n return { type: 'string' };\n }\n if (flags & ts.TypeFlags.Number) {\n return { type: 'number' };\n }\n if (flags & ts.TypeFlags.Boolean) {\n return { type: 'boolean' };\n }\n if (type.isUnion()) {\n return walkUnion(type, ctx);\n }\n if (flags & ts.TypeFlags.Object || type.isIntersection()) {\n return walkObject(type, ctx);\n }\n\n return {};\n}\n","import { join, resolve } from 'node:path';\nimport type { GiriConfig, GiriPaths } from '../types';\nimport { relativeConfigPath, writeJson } from './util';\n\nfunction normalizeAlias(alias: GiriConfig['alias'], paths: GiriPaths): Record<string, string[]> {\n const result: Record<string, string[]> = {};\n for (const [key, value] of Object.entries(alias ?? {})) {\n const targets = Array.isArray(value) ? value : [value];\n // Alias values are written relative to the project root (the same base the\n // runtime resolver in app.ts uses), but the generated tsconfig lives in\n // outDir, so re-base each target onto outDir to keep them relative.\n result[key] = targets.map((target) =>\n relativeConfigPath(paths.outDir, resolve(paths.cwd, target)),\n );\n }\n return result;\n}\n\n/** Emits the `.giri/tsconfig.json` the project extends: rootDirs merge, aliases, plugin. */\nexport async function writeTsConfig(paths: GiriPaths, config: Pick<GiriConfig, 'alias'>): Promise<void> {\n const file = join(paths.outDir, 'tsconfig.json');\n await writeJson(file, {\n compilerOptions: {\n rootDirs: [\n '..',\n './types',\n ],\n paths: {\n // The tsconfig lives in outDir, so `$giri/*` maps to its own folder.\n '$giri/*': ['./*'],\n ...normalizeAlias(config.alias, paths),\n },\n plugins: [\n {\n name: '@boon4681/giri/tsc',\n },\n ],\n },\n include: [\n relativeConfigPath(paths.outDir, join(paths.cwd, 'src')),\n relativeConfigPath(paths.outDir, join(paths.cwd, 'giri.config.ts')),\n './types/**/*.d.ts',\n ],\n });\n}\n","import { existsSync } from 'node:fs';\nimport { dirname, join, resolve } from 'node:path';\nimport { buildModuleGraph, collectDependents, purgeModules, purgeProjectModules } from '../loader/module-loader';\nimport type { ScannedRoute } from '../routes';\nimport type { GiriConfig } from '../types';\nimport { writeManifest } from './manifest';\nimport { writeOpenApi } from './openapi';\nimport { extractRouteMeta } from './route-meta';\nimport { createSchemaProgram, extractRouteResponses } from './schema';\nimport { syncProject, type SyncResult } from './sync';\nimport { slash } from './util';\n\nexport type ChangeOutcome = 'incremental' | 'full';\n\nexport interface WatchUpdater {\n /** Apply one watch event; returns whether it was handled incrementally or fell back to full. */\n apply(filename: string | null): Promise<ChangeOutcome>;\n}\n\nexport function createWatchUpdater(\n config: Pick<GiriConfig, 'alias' | 'outDir'>,\n initial: SyncResult,\n): WatchUpdater {\n const paths = initial.paths;\n let routes = initial.routes;\n const data = initial.data;\n\n const fullResync = async (): Promise<ChangeOutcome> => {\n purgeProjectModules(paths.cwd);\n const result = await syncProject(config, { cwd: paths.cwd });\n routes = result.routes;\n data.responsesByFile = result.data.responsesByFile;\n data.inputsByFile = result.data.inputsByFile;\n data.securityByFile = result.data.securityByFile;\n data.hiddenFiles = result.data.hiddenFiles;\n return 'full';\n };\n\n /** Recompute just one route's response/input/security/visibility metadata in place. */\n const reextractRoute = async (route: ScannedRoute): Promise<void> => {\n const key = route.file;\n try {\n const appTypes = join(paths.outDir, 'types', 'app.d.ts');\n const program = createSchemaProgram(paths, existsSync(appTypes) ? [key, appTypes] : [key]);\n data.responsesByFile.set(key, extractRouteResponses(program, key));\n } catch {\n // keep the previous response schema on failure (e.g. mid-save / type error)\n }\n try {\n const meta = await extractRouteMeta(config, paths, [route]);\n const entry = meta.get(key);\n data.inputsByFile.delete(key);\n data.securityByFile.delete(key);\n data.hiddenFiles.delete(key);\n if (entry?.input) {\n data.inputsByFile.set(key, entry.input);\n }\n if (entry?.security) {\n data.securityByFile.set(key, entry.security);\n }\n if (entry?.hidden) {\n data.hiddenFiles.add(key);\n }\n } catch {\n // keep previous metadata on failure\n }\n };\n\n return {\n async apply(filename) {\n if (!filename) {\n return fullResync();\n }\n // Filenames arrive relative to the watched `src/` (the parent of routes).\n const abs = resolve(dirname(paths.routesDir), filename);\n const file = slash(abs);\n if (!existsSync(abs)) {\n return fullResync();\n }\n\n const graph = buildModuleGraph(paths.cwd);\n const isRoute = routes.some((candidate) => slash(candidate.file) === file);\n\n if (!graph.nodes.has(file) && !isRoute) {\n return fullResync();\n }\n\n const dependents = collectDependents(graph, file);\n const affected = routes.filter((route) =>\n dependents.has(slash(route.file)) ||\n route.sharedFiles.some((shared) => dependents.has(slash(shared))),\n );\n purgeModules(dependents);\n for (const route of affected) {\n await reextractRoute(route);\n }\n await writeManifest(paths, routes, data);\n await writeOpenApi(paths, routes, data);\n return 'incremental';\n },\n };\n}\n","/**\n * Unproven method on (other javascript runtime) to build do module-graph by using NodeJS `require.cache`: each module records\n * its `children` and reflects the *previous* build\n */\nimport { join, resolve, sep } from 'node:path';\n\nexport interface ModuleGraph {\n importers: Map<string, Set<string>>;\n nodes: Set<string>;\n}\n\nconst toSlash = (path: string): string => path.split(sep).join('/');\n\nconst isProjectModule = (id: string, root: string): boolean => {\n return id.startsWith(root) && !id.includes(`${sep}node_modules${sep}`) && !id.includes(`${sep}.giri${sep}`);\n}\n\nexport const buildModuleGraph = (cwd: string): ModuleGraph => {\n const root = resolve(cwd) + sep;\n const importers = new Map<string, Set<string>>();\n const nodes = new Set<string>();\n for (const id of Object.keys(require.cache)) {\n if (!isProjectModule(id, root)) {\n continue;\n }\n const mod = require.cache[id];\n if (!mod) {\n continue;\n }\n nodes.add(toSlash(id));\n for (const child of mod.children) {\n if (!isProjectModule(child.id, root)) {\n continue;\n }\n nodes.add(toSlash(child.id));\n const dep = toSlash(child.id);\n let set = importers.get(dep);\n if (!set) {\n set = new Set();\n importers.set(dep, set);\n }\n set.add(toSlash(id));\n }\n }\n return { importers, nodes };\n};\n\nexport const collectDependents = (graph: ModuleGraph, start: string): Set<string> => {\n const out = new Set<string>([start]);\n const stack = [start];\n while (stack.length > 0) {\n const current = stack.pop()!;\n for (const importer of graph.importers.get(current) ?? []) {\n if (!out.has(importer)) {\n out.add(importer);\n stack.push(importer);\n }\n }\n }\n return out;\n};\n\nexport const purgeModules = (files: Set<string>): void => {\n for (const id of Object.keys(require.cache)) {\n if (files.has(toSlash(id))) {\n delete require.cache[id];\n }\n }\n};\n\n/**\n * Drop every cached module under the project root (skipping `node_modules` and `.giri`).\n */\nexport const purgeProjectModules = (cwd: string): void => {\n const root = resolve(cwd) + sep;\n for (const id of Object.keys(require.cache)) {\n if (isProjectModule(id, root)) {\n delete require.cache[id];\n }\n }\n};","import { existsSync } from 'node:fs';\nimport { join, resolve } from 'node:path';\nimport { safeRegister } from './loader/loader';\nimport type { Services } from './types';\n\nconst MAIN_EXTENSIONS = ['ts', 'tsx', 'mts', 'cts', 'js', 'jsx', 'mjs', 'cjs'];\n\nexport interface GiriLifecycle {\n /** Absolute path to the resolved `src/main.ts`, if one exists. */\n file?: string;\n /** Runtime startup: build the app's service container, awaited before serving. */\n init?: () => Services | Promise<Services>;\n /** Graceful shutdown: receives the container from `init`, run on process exit. */\n teardown?: (services: Services) => void | Promise<void>;\n}\n\nfunction resolveMainFile(cwd: string): string | undefined {\n for (const ext of MAIN_EXTENSIONS) {\n const file = join(cwd, 'src', `main.${ext}`);\n if (existsSync(file)) {\n return file;\n }\n }\n return undefined;\n}\n\n/**\n * Load the optional `src/main.ts` lifecycle module. Absent file ⇒ empty lifecycle\n * (serve immediately). `init`/`teardown` are validated to be functions if present.\n */\nexport async function loadLifecycle(cwd = process.cwd()): Promise<GiriLifecycle> {\n const file = resolveMainFile(resolve(cwd));\n if (!file) {\n return {};\n }\n\n const { unregister } = await safeRegister();\n try {\n const resolved = require.resolve(file);\n delete require.cache[resolved];\n const loaded = require(resolved) as Partial<GiriLifecycle>;\n\n const lifecycle: GiriLifecycle = { file };\n if (loaded.init !== undefined) {\n if (typeof loaded.init !== 'function') {\n throw new Error(`${file}: \"init\" must be a function.`);\n }\n lifecycle.init = loaded.init;\n }\n if (loaded.teardown !== undefined) {\n if (typeof loaded.teardown !== 'function') {\n throw new Error(`${file}: \"teardown\" must be a function.`);\n }\n lifecycle.teardown = loaded.teardown;\n }\n return lifecycle;\n } finally {\n unregister();\n }\n}\n\n/** Run `init()` once and normalize its result into a service container. */\nexport async function runInit(lifecycle: GiriLifecycle): Promise<Services> {\n if (!lifecycle.init) {\n return {} as Services;\n }\n const services = await lifecycle.init();\n return (services ?? {}) as Services;\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA,IAAM,GACC;AADP;AAAA;AAAA;AAAA,IAAM,IAAI;AACV,IAAO,cAAQ;AAAA;AAAA;;;ACDf;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACMO,IAAM,qBAAoC,uBAAO,IAAI,qBAAqB;AAyJ1E,IAAM,mBAAkC,uBAAO,IAAI,mBAAmB;AAuBtE,IAAM,kBAAiC,uBAAO,IAAI,kBAAkB;;;ACzK3E,IAAM,kBAAkB,oBAAI,IAAI,CAAC,KAAK,KAAK,KAAK,KAAK,GAAG,CAAC;AAYlD,SAAS,oBAId,MAAS,QAAW,QAAW,SAA+C;AAC5E,SAAO;AAAA,IACH,CAAC,kBAAkB,GAAG,EAAE,MAAM,QAAQ,OAAO;AAAA,IAC7C;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACJ;AACJ;AAEO,SAAS,gBAAgB,OAAiD;AAC7E,SAAO,QAAQ,SAAS,OAAO,UAAU,YAAY,sBAAsB,KAAK;AACpF;AAEO,SAAS,cAGd,SAAsE;AACpE,QAAM,MAAM,IAAI,IAAI,QAAQ,QAAQ,GAAG;AACvC,QAAM,QAAQ,oBAAI,IAAqB;AACvC,QAAM,YAAY,QAAQ,aAAc,CAAC;AAEzC,SAAO;AAAA,IACH,QAAQ,QAAQ,UAAW,CAAC;AAAA,IAC5B,KAAK,QAAQ,OAAQ,CAAC;AAAA,IACtB,KAAK;AAAA,MACD,KAAK,QAAQ;AAAA,MACb;AAAA,MACA,QAAQ,QAAQ,QAAQ;AAAA,MACxB,QAAQ,CAAC,SAAS,QAAQ,QAAQ,QAAQ,IAAI,IAAI;AAAA,MAClD,MAAM,MAAmB,QAAQ,QAAQ,KAAK;AAAA,MAC9C,MAAM,MAAM,QAAQ,QAAQ,KAAK;AAAA,MACjC,aAAa,MAAM,QAAQ,QAAQ,YAAY;AAAA,MAC/C,UAAU,MAAM,QAAQ,QAAQ,SAAS;AAAA,MACzC,OAAO,CAAC,QAAQ;AACZ,YAAI,EAAE,OAAO,YAAY;AACrB,gBAAM,IAAI,MAAM,gBAAgB,OAAO,GAAG,CAAC,oCAAoC;AAAA,QACnF;AACA,eAAO,UAAU,GAAG;AAAA,MACxB;AAAA,IACJ;AAAA,IACA,KAAK,CAAC,KAAa,UAAmB;AAClC,YAAM,IAAI,KAAK,KAAK;AAAA,IACxB;AAAA,IACA,KAAK,CAAC,QAAgB,MAAM,IAAI,GAAG;AAAA,IACnC,MAAM,CAAC,MAAM,SAAS,KAAc,YAChC,oBAAoB,MAAM,QAAQ,QAAQ,OAAO;AAAA,IACrD,MAAM,CAAC,MAAM,SAAS,KAAc,YAChC,oBAAoB,MAAM,QAAQ,QAAQ,OAAO;AAAA,EACzD;AACJ;AAEO,SAAS,wBAAwB,UAA4C;AAChF,QAAM,UAAU,IAAI,QAAQ,SAAS,OAAO;AAE5C,MAAI,SAAS,WAAW,UAAU,CAAC,QAAQ,IAAI,cAAc,GAAG;AAC5D,YAAQ,IAAI,gBAAgB,iCAAiC;AAAA,EACjE;AAEA,MAAI,SAAS,WAAW,UAAU,CAAC,QAAQ,IAAI,cAAc,GAAG;AAC5D,YAAQ,IAAI,gBAAgB,2BAA2B;AAAA,EAC3D;AAEA,QAAM,OAAO,gBAAgB,IAAI,SAAS,MAAM,IAC1C,OACA,SAAS,WAAW,SAChB,KAAK,UAAU,SAAS,IAAI,IAC5B,OAAO,SAAS,IAAI;AAE9B,SAAO,IAAI,SAAS,MAAM;AAAA,IACtB,QAAQ,SAAS;AAAA,IACjB;AAAA,EACJ,CAAC;AACL;AAEO,SAAS,WAAW,UAAqC;AAC5D,SAAO,gBAAgB,QAAQ,IAAI,wBAAwB,QAAQ,IAAI;AAC3E;AAEA,eAAsB,kBAClB,YACA,QACA,SACwB;AACxB,MAAI,QAAQ;AACZ,MAAI;AAEJ,QAAM,WAAW,OAAO,MAA+C;AACnE,QAAI,KAAK,OAAO;AACZ,YAAM,IAAI,MAAM,kDAAkD;AAAA,IACtE;AACA,YAAQ;AAER,QAAI,MAAM,WAAW,QAAQ;AACzB,eAAS,MAAM,OAAO,OAAO;AAC7B,aAAO;AAAA,IACX;AAEA,UAAM,WAAW,MAAM,WAAW,CAAC,EAAE,SAAS,MAAM,SAAS,IAAI,CAAC,CAAC;AACnE,QAAI,aAAa,QAAW;AACxB,eAAS;AACT,aAAO;AAAA,IACX;AACA,WAAO;AAAA,EACX;AAEA,QAAM,SAAS,CAAC;AAEhB,MAAI,WAAW,QAAW;AACtB,UAAM,IAAI,MAAM,+CAA+C;AAAA,EACnE;AAEA,SAAO;AACX;AAeO,SAAS,iBACZ,qBACA,iBACU;AACV,MAAI,OAAO,wBAAwB,YAAY;AAC3C,WAAO;AAAA,EACX;AAEA,MAAI,CAAC,iBAAiB;AAClB,UAAM,IAAI,MAAM,uEAAuE;AAAA,EAC3F;AAEA,kBAAgB,UAAU,oBAAoB;AAC9C,SAAO;AACX;AAUO,SAAS,SAA8E,YAAkB;AAC5G,SAAO;AACX;;;ACzJO,SAAS,kBACZ,QACuB;AACvB,SAAO,EAAE,CAAC,gBAAgB,GAAG,MAAM,GAAG,OAAO;AACjD;AAEO,SAAS,kBAAkB,OAA0C;AACxE,SAAO;AAAA,IACH,SACI,OAAO,UAAU,YAChB,MAAkC,gBAAgB,MAAM;AAAA,EACjE;AACJ;AAKO,SAAS,iBACZ,UACuB;AACvB,SAAO,EAAE,CAAC,eAAe,GAAG,MAAM,SAAS;AAC/C;AAEO,SAAS,iBAAiB,OAAyC;AACtE,SAAO;AAAA,IACH,SACI,OAAO,UAAU,YAChB,MAAkC,eAAe,MAAM;AAAA,EAChE;AACJ;AAEA,IAAM,uBAAwD;AAAA,EAC1D,oBAAoB;AAAA,EACpB,uBAAuB;AAAA,EACvB,qCAAqC;AAAA,EACrC,cAAc;AAClB;AAEA,SAAS,sBAAsB,QAAoD;AAC/E,MAAI,CAAC,QAAQ;AACT,WAAO;AAAA,EACX;AACA,QAAM,OAAO,OAAO,MAAM,KAAK,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,YAAY;AACxD,SAAO,qBAAqB,IAAI;AACpC;AAGA,SAAS,eAAe,MAAyC;AAC7D,QAAM,SAAkC,CAAC;AACzC,OAAK,QAAQ,CAAC,OAAO,QAAQ;AACzB,UAAM,UAAU,OAAO,GAAG;AAC1B,QAAI,YAAY,QAAW;AACvB,aAAO,GAAG,IAAI;AAAA,IAClB,WAAW,MAAM,QAAQ,OAAO,GAAG;AAC/B,cAAQ,KAAK,KAAK;AAAA,IACtB,OAAO;AACH,aAAO,GAAG,IAAI,CAAC,SAAS,KAAK;AAAA,IACjC;AAAA,EACJ,CAAC;AACD,SAAO;AACX;AAEA,eAAe,YAAY,SAAkB,aAAgD;AACzF,QAAM,SAAS,QAAQ,MAAM;AAC7B,MAAI,gBAAgB,QAAQ;AACxB,WAAO,OAAO,KAAK;AAAA,EACvB;AACA,MAAI,gBAAgB,QAAQ;AACxB,WAAO,OAAO,KAAK;AAAA,EACvB;AACA,SAAO,eAAe,MAAM,OAAO,SAAS,CAAC;AACjD;AAEA,SAAS,YAAY,KAA6C;AAC9D,QAAM,SAA4C,CAAC;AACnD,aAAW,CAAC,KAAK,KAAK,KAAK,IAAI,cAAc;AACzC,UAAM,UAAU,OAAO,GAAG;AAC1B,QAAI,YAAY,QAAW;AACvB,aAAO,GAAG,IAAI;AAAA,IAClB,WAAW,MAAM,QAAQ,OAAO,GAAG;AAC/B,cAAQ,KAAK,KAAK;AAAA,IACtB,OAAO;AACH,aAAO,GAAG,IAAI,CAAC,SAAS,KAAK;AAAA,IACjC;AAAA,EACJ;AACA,SAAO;AACX;AAEA,eAAe,cACX,QACA,OACA,OAC8B;AAC9B,MAAI,CAAC,kBAAkB,MAAM,GAAG;AAC5B,UAAM,IAAI;AAAA,MACN,SAAS,KAAK,iEAAiE,KAAK;AAAA,IACxF;AAAA,EACJ;AACA,SAAO,OAAO,SAAS,KAAK;AAChC;AAEA,eAAsB,oBAAoB,SAAkB,OAAmD;AAC3G,QAAM,YAA4B,CAAC;AAEnC,MAAI,OAAO,OAAO;AACd,UAAM,QAAQ,YAAY,IAAI,IAAI,QAAQ,GAAG,CAAC;AAC9C,UAAM,SAAS,MAAM,cAAc,MAAM,OAAO,OAAO,OAAO;AAC9D,QAAI,CAAC,OAAO,IAAI;AACZ,aAAO;AAAA,QACH,IAAI;AAAA,QACJ,UAAU;AAAA,UACN,EAAE,SAAS,6BAA6B,QAAQ,OAAO,OAAO;AAAA,UAC9D;AAAA,UACA;AAAA,QACJ;AAAA,MACJ;AAAA,IACJ;AACA,cAAU,QAAQ,OAAO;AAAA,EAC7B;AAEA,MAAI,OAAO,MAAM;AACb,UAAM,WAAW,MAAM,KAAK;AAC5B,UAAM,WAAW,OAAO,KAAK,QAAQ;AACrC,UAAM,YAAY,sBAAsB,QAAQ,QAAQ,IAAI,cAAc,CAAC;AAG3E,UAAM,SACF,aAAa,SAAS,SAAS,IAAI,YAAY,SAAS,OAAO,SAAS;AAE5E,QAAI,CAAC,QAAQ;AACT,aAAO;AAAA,QACH,IAAI;AAAA,QACJ,UAAU;AAAA,UACN,EAAE,SAAS,2BAA2B,QAAQ,EAAE,UAAU,SAAS,EAAE;AAAA,UACrE;AAAA,UACA;AAAA,QACJ;AAAA,MACJ;AAAA,IACJ;AAEA,QAAI;AACJ,QAAI;AACA,gBAAU,MAAM,YAAY,SAAS,MAAM;AAAA,IAC/C,SAAS,OAAO;AACZ,aAAO;AAAA,QACH,IAAI;AAAA,QACJ,UAAU;AAAA,UACN,EAAE,SAAS,yBAAyB,QAAQ,MAAM;AAAA,UAClD;AAAA,UACA;AAAA,QACJ;AAAA,MACJ;AAAA,IACJ;AAEA,UAAM,SAAS,MAAM,cAAc,SAAS,MAAM,GAAG,SAAS,MAAM;AACpE,QAAI,CAAC,OAAO,IAAI;AACZ,aAAO;AAAA,QACH,IAAI;AAAA,QACJ,UAAU;AAAA,UACN,EAAE,SAAS,yBAAyB,QAAQ,OAAO,OAAO;AAAA,UAC1D;AAAA,UACA;AAAA,QACJ;AAAA,MACJ;AAAA,IACJ;AAEA,cAAU,OAAO,SAAS,SAAS,IAAI,EAAE,MAAM,QAAQ,MAAM,OAAO,MAAM,IAAI,OAAO;AAAA,EACzF;AAEA,SAAO,EAAE,IAAI,MAAM,UAAU;AACjC;;;ACxMA,yBAAmB;AACnB,IAAAA,oBAA0C;;;ACD1C,qBAAqC;AACrC,qBAA2B;AAC3B,uBAAmC;AACnC,0BAAqB;;;ACHrB,qBAA6B;AAEtB,IAAM,eAAe,oBAAK,OAAO;AAAA,EACpC,SAAS,oBAAK,IAAI;AAAA,EAClB,OAAO,oBAAK,SAAS,oBAAK;AAAA,IACtB,oBAAK,OAAO;AAAA,IACZ,oBAAK,MAAM,CAAC,oBAAK,OAAO,GAAG,oBAAK,MAAM,oBAAK,OAAO,CAAC,CAAC,CAAC;AAAA,EACzD,CAAC;AAAA,EACD,QAAQ,oBAAK,SAAS,oBAAK,OAAO,CAAC;AAAA,EACnC,QAAQ,oBAAK,SAAS,oBAAK,OAAO;AAAA,IAC9B,MAAM,oBAAK,SAAS,oBAAK,OAAO,CAAC;AAAA,IACjC,UAAU,oBAAK,SAAS,oBAAK,OAAO,CAAC;AAAA,EACzC,GAAG,EAAE,sBAAsB,MAAM,CAAC,CAAC;AAAA,EACnC,aAAa,oBAAK,SAAS,oBAAK,IAAI,CAAC;AACzC,GAAG,EAAE,sBAAsB,MAAM,CAAC;;;ADTlC,mBAAsB;AAGtB,IAAM,YAAY,OAAO,eAA2B;AAChD,MAAI;AACA;AAAA,EACJ,SAAS,GAAQ;AACb,QAAI,YAAY,KAAK,MAAM,QAAQ,EAAE,MAAM,KAAK,EAAE,OAAO,SAAS,GAAG;AACjE,YAAM,WAAY,EAAE,OAAiB,OAAO,CAAC,OAAO,GAAG,MAAM,SAAS,8BAA8B,CAAC,EAAE,SAAS;AAChH,UAAI,UAAU;AACV,2BAAI;AAAA,UACA;AAAA,QACJ;AACA,sCAAK,CAAC;AAAA,MACV;AAAA,IACJ;AACA,uBAAI,MAAM,CAAC;AACX,kCAAK,CAAC;AAAA,EACV;AACJ;AAEO,IAAM,eAAe,YAAY;AACpC,QAAM,EAAE,SAAS,IAAI,MAAM,OAAO,4BAA4B;AAC9D,MAAI;AACJ,MAAI;AACA,UAAM,SAAS;AAAA,MACX,QAAQ;AAAA,MACR,QAAQ;AAAA,IACZ,CAAC;AAAA,EACL,QAAQ;AAEJ,UAAM;AAAA,MACF,YAAY,MAAM;AAAA,MAAE;AAAA,IACxB;AAAA,EACJ;AAGA,QAAM,UAAU,IAAI,UAAU;AAC9B,SAAO;AACX;;;AE5CA,IAAAC,kBAA2B;AAC3B,sBAAwB;AACxB,IAAAC,oBAAuD;AACvD,wBAAqB;AAGrB,IAAM,eAA6B,CAAC,OAAO,QAAQ,OAAO,SAAS,UAAU,WAAW,MAAM;AAC9F,IAAM,mBAAmB,IAAI;AAAA,EACzB,aAAa,IAAI,CAAC,WAAW,CAAC,IAAI,OAAO,YAAY,CAAC,IAAI,MAAM,CAAC;AACrE;AAkBA,SAAS,iBAAiB,MAAsB;AAC5C,SAAO,KAAK,MAAM,qBAAG,EAAE,KAAK,GAAG;AACnC;AAEA,SAAS,kBAAkB,UAA2B;AAClD,SAAO,2BAA2B,KAAK,QAAQ,KAAK,CAAC,SAAS,SAAS,OAAO;AAClF;AAEA,SAAS,eAAe,UAA0C;AAC9D,MAAI,CAAC,kBAAkB,QAAQ,GAAG;AAC9B,WAAO;AAAA,EACX;AACA,QAAM,OAAO,SAAS,QAAQ,4BAA4B,EAAE,EAAE,YAAY;AAC1E,SAAO,iBAAiB,IAAI,IAAI;AACpC;AAEA,SAAS,aAAa,KAAiC;AACnD,aAAW,OAAO,CAAC,MAAM,OAAO,MAAM,OAAO,OAAO,OAAO,OAAO,KAAK,GAAG;AACtE,UAAM,WAAO,wBAAK,KAAK,WAAW,GAAG,EAAE;AACvC,YAAI,4BAAW,IAAI,GAAG;AAClB,aAAO;AAAA,IACX;AAAA,EACJ;AACA,SAAO;AACX;AAEA,SAAS,sBAAsB,WAAmB,UAA4B;AAC1E,QAAM,UAAM,4BAAS,WAAW,QAAQ;AACxC,MAAI,CAAC,KAAK;AACN,WAAO,CAAC;AAAA,EACZ;AACA,SAAO,iBAAiB,GAAG,EAAE,MAAM,GAAG,EAAE,OAAO,OAAO;AAC1D;AAEA,SAAS,WAAW,SAAyD;AACzE,MAAI,WAAW,KAAK,OAAO,GAAG;AAC1B,WAAO,CAAC;AAAA,EACZ;AAEA,QAAM,WAAW,mBAAmB,KAAK,OAAO;AAChD,MAAI,UAAU;AACV,UAAM,OAAO,SAAS,CAAC;AACvB,WAAO;AAAA,MACH,OAAO,IAAI,IAAI;AAAA,MACf,OAAO,EAAE,MAAM,UAAU,KAAK;AAAA,IAClC;AAAA,EACJ;AAEA,QAAM,QAAQ,aAAa,KAAK,OAAO;AACvC,MAAI,OAAO;AACP,UAAM,OAAO,MAAM,CAAC;AACpB,WAAO;AAAA,MACH,OAAO,IAAI,IAAI;AAAA,MACf,OAAO,EAAE,MAAM,UAAU,MAAM;AAAA,IACnC;AAAA,EACJ;AAEA,SAAO,EAAE,OAAO,QAAQ;AAC5B;AAEO,SAAS,iBAAiB,UAA4D;AACzF,QAAM,eAAyB,CAAC;AAChC,QAAM,SAAuB,CAAC;AAE9B,aAAW,WAAW,UAAU;AAC5B,UAAM,YAAY,WAAW,OAAO;AACpC,QAAI,UAAU,OAAO;AACjB,mBAAa,KAAK,UAAU,KAAK;AAAA,IACrC;AACA,QAAI,UAAU,OAAO;AACjB,aAAO,KAAK,UAAU,KAAK;AAAA,IAC/B;AAAA,EACJ;AAEA,SAAO;AAAA,IACH,MAAM,aAAa,SAAS,IAAI,IAAI,aAAa,KAAK,GAAG,CAAC,KAAK;AAAA,IAC/D;AAAA,EACJ;AACJ;AAMA,eAAsB,iBAAiB,WAAsC;AACzE,MAAI,KAAC,4BAAW,SAAS,GAAG;AACxB,WAAO,CAAC;AAAA,EACZ;AACA,QAAM,UAAU,CAAC,SAAS;AAC1B,QAAM,OAAO,OAAO,QAA+B;AAC/C,eAAW,SAAS,UAAM,yBAAQ,KAAK,EAAE,eAAe,KAAK,CAAC,GAAG;AAC7D,UAAI,MAAM,YAAY,KAAK,MAAM,SAAS,gBAAgB;AACtD,cAAM,WAAO,wBAAK,KAAK,MAAM,IAAI;AACjC,gBAAQ,KAAK,IAAI;AACjB,cAAM,KAAK,IAAI;AAAA,MACnB;AAAA,IACJ;AAAA,EACJ;AACA,QAAM,KAAK,SAAS;AACpB,SAAO;AACX;AAGO,SAAS,kBAAkB,WAAmB,KAA2B;AAC5E,SAAO,iBAAiB,sBAAsB,WAAW,GAAG,CAAC,EAAE;AACnE;AAGO,SAAS,kBAAkB,WAAmB,KAAuB;AACxE,QAAM,WAAW,sBAAsB,WAAW,GAAG;AACrD,QAAM,OAAO,CAAC,SAAS;AAEvB,MAAI,UAAU;AACd,aAAW,WAAW,UAAU;AAC5B,kBAAU,wBAAK,SAAS,OAAO;AAC/B,SAAK,KAAK,OAAO;AAAA,EACrB;AAEA,SAAO,KAAK,IAAI,YAAY,EAAE,OAAO,CAAC,SAAyB,QAAQ,IAAI,CAAC;AAChF;AAEA,eAAsB,WAAW,WAA4C;AACzE,MAAI,KAAC,4BAAW,SAAS,GAAG;AACxB,WAAO,CAAC;AAAA,EACZ;AAEA,QAAM,QAAQ,UAAM,wBAAK,yCAAyC;AAAA,IAC9D,KAAK;AAAA,IACL,UAAU;AAAA,IACV,WAAW;AAAA,EACf,CAAC;AAED,QAAM,SAAyB,CAAC;AAEhC,aAAW,QAAQ,OAAO;AACtB,UAAM,SAAS,mBAAe,4BAAS,IAAI,CAAC;AAC5C,QAAI,CAAC,QAAQ;AACT;AAAA,IACJ;AAEA,UAAM,eAAW,2BAAQ,IAAI;AAC7B,UAAM,gBAAgB,sBAAsB,WAAW,QAAQ;AAC/D,UAAM,EAAE,MAAM,OAAO,IAAI,iBAAiB,aAAa;AAEvD,WAAO,KAAK;AAAA,MACR;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,aAAa,kBAAkB,WAAW,QAAQ;AAAA,IACtD,CAAC;AAAA,EACL;AAEA,SAAO,OAAO,KAAK,CAAC,MAAM,UAAU;AAChC,UAAM,YAAY,KAAK,KAAK,cAAc,MAAM,IAAI;AACpD,QAAI,cAAc,GAAG;AACjB,aAAO;AAAA,IACX;AACA,WAAO,aAAa,QAAQ,KAAK,MAAM,IAAI,aAAa,QAAQ,MAAM,MAAM;AAAA,EAChF,CAAC;AACL;;;AHjKA,SAAS,WAAW,MAAuB;AACvC,QAAM,WAAW,QAAQ,QAAQ,IAAI;AACrC,SAAO,QAAQ,MAAM,QAAQ;AAC7B,SAAO,QAAQ,QAAQ;AAC3B;AAEA,SAAS,eAAe,OAAyB;AAC7C,MAAI,SAAS,OAAO,UAAU,YAAY,aAAa,OAAO;AAC1D,WAAQ,MAA+B;AAAA,EAC3C;AACA,SAAO;AACX;AAEA,SAAS,oBAAoB,OAAgB,MAA4B;AACrE,QAAM,WAAW,eAAe,KAAK;AACrC,MAAI,aAAa,QAAW;AACxB,WAAO,CAAC;AAAA,EACZ;AACA,MAAI,OAAO,aAAa,YAAY;AAChC,WAAO,CAAC,QAAsB;AAAA,EAClC;AACA,MAAI,MAAM,QAAQ,QAAQ,GAAG;AACzB,eAAW,cAAc,UAAU;AAC/B,UAAI,OAAO,eAAe,YAAY;AAClC,cAAM,IAAI,MAAM,wBAAwB,IAAI,+BAA+B;AAAA,MAC/E;AAAA,IACJ;AACA,WAAO;AAAA,EACX;AACA,QAAM,IAAI,MAAM,wBAAwB,IAAI,+CAA+C;AAC/F;AAEA,SAAS,iBAAiB,OAAgB,MAA+C;AACrF,MAAI,CAAC,iBAAiB,KAAK,GAAG;AAC1B,UAAM,IAAI;AAAA,MACN,GAAG,IAAI;AAAA,IACX;AAAA,EACJ;AACJ;AAEA,SAAS,kBAAkB,OAAgB,MAAgD;AACvF,MAAI,CAAC,kBAAkB,KAAK,GAAG;AAC3B,UAAM,IAAI;AAAA,MACN,GAAG,IAAI;AAAA,IACX;AAAA,EACJ;AACJ;AAEA,SAAS,WAAW,aAA0B,MAAsC;AAChF,QAAM,QAAoB,CAAC;AAC3B,MAAI,YAAY,SAAS,QAAW;AAChC,qBAAiB,YAAY,MAAM,IAAI;AACvC,UAAM,OAAO,YAAY;AAAA,EAC7B;AACA,MAAI,YAAY,UAAU,QAAW;AACjC,sBAAkB,YAAY,OAAO,IAAI;AACzC,UAAM,QAAQ,YAAY;AAAA,EAC9B;AACA,SAAO,MAAM,QAAQ,MAAM,QAAQ,QAAQ;AAC/C;AAEA,SAAS,YAAY,OAAoC;AACrD,SAAO,MAAM,QAAQ,KAAK,IAAI,QAAQ,CAAC,KAAK;AAChD;AAEA,SAAS,mBAAmB,KAAa,QAAgB,UAAU,IAAY;AAC3E,QAAM,WAAW,OAAO,SAAS,GAAG,IAAI,OAAO,WAAW,KAAK,OAAO,IAAI;AAC1E,aAAO,8BAAW,QAAQ,IAAI,eAAW,2BAAQ,KAAK,QAAQ;AAClE;AAEA,SAAS,WAAW,SAAiB,KAAiC;AAClE,MAAI,IAAI,SAAS,GAAG,GAAG;AACnB,UAAM,CAACC,SAAQ,SAAS,EAAE,IAAI,IAAI,MAAM,GAAG;AAC3C,QAAI,QAAQ,WAAWA,OAAM,KAAK,QAAQ,SAAS,MAAM,GAAG;AACxD,aAAO,QAAQ,MAAMA,QAAO,QAAQ,QAAQ,SAAS,OAAO,MAAM;AAAA,IACtE;AACA,WAAO;AAAA,EACX;AAEA,MAAI,YAAY,KAAK;AACjB,WAAO;AAAA,EACX;AAEA,QAAM,SAAS,GAAG,GAAG;AACrB,MAAI,QAAQ,WAAW,MAAM,GAAG;AAC5B,WAAO,QAAQ,MAAM,OAAO,MAAM;AAAA,EACtC;AAEA,SAAO;AACX;AAEA,SAAS,oBACL,SACA,OACA,KACkB;AAClB,aAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,SAAS,CAAC,CAAC,GAAG;AACpD,UAAM,UAAU,WAAW,SAAS,GAAG;AACvC,QAAI,YAAY,QAAW;AACvB;AAAA,IACJ;AAEA,UAAM,CAAC,MAAM,IAAI,YAAY,KAAK;AAClC,QAAI,CAAC,QAAQ;AACT;AAAA,IACJ;AAEA,WAAO,mBAAmB,KAAK,QAAQ,OAAO;AAAA,EAClD;AAEA,SAAO;AACX;AAEO,SAAS,sBAAsB,OAA4B,KAAyB;AACvF,MAAI,CAAC,SAAS,OAAO,KAAK,KAAK,EAAE,WAAW,GAAG;AAC3C,WAAO,MAAM;AAAA,IAAE;AAAA,EACnB;AAEA,QAAM,qBAAqB,mBAAAC;AAG3B,QAAM,0BAA0B,mBAAmB;AAEnD,qBAAmB,mBAAmB,SAAS,qBAC3C,SACA,QACA,QACA,SACF;AACE,WAAO,wBAAwB;AAAA,MAC3B;AAAA,MACA,oBAAoB,SAAS,OAAO,GAAG,KAAK;AAAA,MAC5C;AAAA,MACA;AAAA,MACA;AAAA,IACJ;AAAA,EACJ;AAEA,SAAO,MAAM;AACT,uBAAmB,mBAAmB;AAAA,EAC1C;AACJ;AAEA,IAAM,oBAAoB;AAC1B,IAAI;AACJ,IAAI,wBAAwB;AAKrB,SAAS,wBAAwB,QAAsB;AAC1D,eAAa;AACb,MAAI,uBAAuB;AACvB;AAAA,EACJ;AACA,0BAAwB;AAExB,QAAM,qBAAqB,mBAAAA;AAG3B,QAAM,0BAA0B,mBAAmB;AAEnD,qBAAmB,mBAAmB,SAAS,6BAC3C,SACA,QACA,QACA,SACF;AACE,UAAM,SACF,OAAO,YAAY,YAAY,QAAQ,WAAW,iBAAiB,KAAK,iBAClE,wBAAK,YAAY,QAAQ,MAAM,kBAAkB,MAAM,CAAC,IACxD;AACV,WAAO,wBAAwB,KAAK,MAAM,QAAQ,QAAQ,QAAQ,OAAO;AAAA,EAC7E;AACJ;AAEO,SAAS,iBAAiB,QAAoC,MAAM,QAAQ,IAAI,GAAc;AACjG,SAAO;AAAA,IACH,SAAK,2BAAQ,GAAG;AAAA,IAChB,eAAW,2BAAQ,KAAK,YAAY;AAAA,IACpC,YAAQ,2BAAQ,KAAK,OAAO,UAAU,OAAO;AAAA,EACjD;AACJ;AAEA,eAAsB,aAClB,QACA,UAA+B,CAAC,GACN;AAC1B,QAAM,QAAQ,iBAAiB,QAAQ,QAAQ,GAAG;AAClD,QAAM,SAAS,MAAM,WAAW,MAAM,SAAS;AAC/C,QAAM,MAAM,OAAO,QAAQ,UAAU;AAGrC,0BAAwB,MAAM,MAAM;AACpC,QAAM,EAAE,WAAW,IAAI,MAAM,aAAa;AAC1C,QAAM,0BAA0B,sBAAsB,OAAO,OAAO,MAAM,GAAG;AAE7E,MAAI;AACA,eAAW,SAAS,QAAQ;AACxB,YAAM,cAAc,WAAW,MAAM,IAAI;AACzC,UAAI,OAAO,YAAY,WAAW,YAAY;AAC1C,cAAM,IAAI,MAAM,GAAG,MAAM,IAAI,uCAAuC;AAAA,MACxE;AAEA,YAAM,mBAAmB,YAAY,QAAQ,gBACvC,CAAC,IACD,MAAM,YAAY;AAAA,QAAQ,CAAC,SACzB,oBAAqB,WAAW,IAAI,EAA+B,YAAY,IAAI;AAAA,MACvF;AACJ,YAAM,iBAAiB,oBAAoB,YAAY,YAAY,MAAM,IAAI;AAE7E,aAAO,QAAQ,SAAS,KAAK;AAAA,QACzB,QAAQ,MAAM;AAAA,QACd,MAAM,MAAM;AAAA,QACZ,QAAQ,YAAY;AAAA,QACpB,YAAY,CAAC,GAAG,kBAAkB,GAAG,cAAc;AAAA,QACnD,OAAO,WAAW,aAAa,MAAM,IAAI;AAAA,QACzC,UAAU,QAAQ;AAAA,MACtB,CAAC;AAAA,IACL;AAAA,EACJ,UAAE;AACE,4BAAwB;AACxB,eAAW;AAAA,EACf;AAEA,SAAO,EAAE,KAAK,QAAQ,MAAM;AAChC;;;AI9PA,IAAAC,kBAA2B;AAC3B,IAAAC,mBAAsB;AACtB,IAAAC,qBAAqB;;;ACFrB,IAAAC,kBAA2B;AAC3B,IAAAC,oBAA+B;;;ACD/B,IAAAC,kBAA2B;AAC3B,IAAAC,mBAAqD;AACrD,IAAAC,oBAA6C;AAGtC,IAAM,mBAAmB;AAEzB,SAAS,MAAM,MAAsB;AACxC,SAAO,KAAK,MAAM,qBAAG,EAAE,KAAK,GAAG;AACnC;AAEO,SAAS,WAAW,UAAkB,QAAwB;AACjE,MAAI,OAAO,UAAM,gCAAS,2BAAQ,QAAQ,GAAG,MAAM,CAAC,EAAE,QAAQ,YAAY,EAAE;AAC5E,MAAI,CAAC,KAAK,WAAW,GAAG,GAAG;AACvB,WAAO,KAAK,IAAI;AAAA,EACpB;AACA,SAAO;AACX;AAEO,SAAS,mBAAmB,SAAiB,QAAwB;AACxE,MAAI,OAAO,UAAM,4BAAS,SAAS,MAAM,CAAC;AAC1C,MAAI,CAAC,KAAK,WAAW,GAAG,GAAG;AACvB,WAAO,KAAK,IAAI;AAAA,EACpB;AACA,SAAO;AACX;AAGO,SAAS,gBAAgB,SAAiB,QAAwB;AACrE,MAAI,OAAO,UAAM,4BAAS,SAAS,MAAM,CAAC,EAAE,QAAQ,uBAAuB,EAAE;AAC7E,MAAI,CAAC,KAAK,WAAW,GAAG,GAAG;AACvB,WAAO,KAAK,IAAI;AAAA,EACpB;AACA,SAAO;AACX;AAEO,SAAS,aAAa,OAAkB,UAA0B;AAGrE,QAAM,gBAAY,4BAAS,MAAM,KAAK,QAAQ;AAC9C,aAAO,wBAAK,MAAM,QAAQ,SAAS,WAAW,aAAa;AAC/D;AAEO,SAAS,iBAAiB,OAAwB;AACrD,QAAM,UAAM,4BAAS,MAAM,KAAK,MAAM,MAAM;AAC5C,MAAI,CAAC,OAAO,IAAI,WAAW,IAAI,KAAK,IAAI,SAAS,KAAK,qBAAG,EAAE,GAAG;AAC1D,UAAM,IAAI,MAAM,8CAA8C,MAAM,MAAM,EAAE;AAAA,EAChF;AACJ;AAEA,IAAM,aAAa,oBAAI,IAAoB;AAG3C,eAAsB,eAAe,MAAc,SAAgC;AAC/E,MAAI,WAAW,IAAI,IAAI,MAAM,eAAW,4BAAW,IAAI,GAAG;AACtD;AAAA,EACJ;AACA,YAAM,4BAAM,2BAAQ,IAAI,GAAG,EAAE,WAAW,KAAK,CAAC;AAC9C,YAAM,4BAAU,MAAM,OAAO;AAC7B,aAAW,IAAI,MAAM,OAAO;AAChC;AAEA,eAAsB,UAAU,MAAc,OAA+B;AACzE,QAAM,eAAe,MAAM,GAAG,KAAK,UAAU,OAAO,MAAM,CAAC,CAAC;AAAA,CAAI;AACpE;AAOA,eAAsB,SAAS,KAAa,MAAkC;AAC1E,MAAI;AACJ,MAAI;AACA,cAAU,UAAM,0BAAQ,KAAK,EAAE,eAAe,KAAK,CAAC;AAAA,EACxD,QAAQ;AACJ;AAAA,EACJ;AACA,aAAW,SAAS,SAAS;AACzB,UAAM,WAAO,wBAAK,KAAK,MAAM,IAAI;AACjC,QAAI,MAAM,YAAY,GAAG;AACrB,YAAM,SAAS,MAAM,IAAI;AACzB,gBAAM,wBAAM,IAAI,EAAE,MAAM,MAAM;AAAA,MAAC,CAAC;AAAA,IACpC,WAAW,CAAC,KAAK,IAAI,IAAI,GAAG;AACxB,gBAAM,qBAAG,MAAM,EAAE,OAAO,KAAK,CAAC;AAC9B,iBAAW,OAAO,IAAI;AAAA,IAC1B;AAAA,EACJ;AACJ;;;ADnFA,IAAM,kBAAkB,CAAC,MAAM,OAAO,OAAO,OAAO,MAAM,OAAO,OAAO,KAAK;AAE7E,SAAS,aAAa,KAAiC;AACnD,aAAW,OAAO,iBAAiB;AAC/B,UAAM,WAAO,wBAAK,KAAK,OAAO,QAAQ,GAAG,EAAE;AAC3C,YAAI,4BAAW,IAAI,GAAG;AAClB,aAAO;AAAA,IACX;AAAA,EACJ;AACA,SAAO;AACX;AAEA,SAASC,iBAAgB,SAAiB,QAAwB;AAC9D,MAAI,OAAO,UAAM,4BAAS,SAAS,MAAM,CAAC,EAAE,QAAQ,uBAAuB,EAAE;AAC7E,MAAI,CAAC,KAAK,WAAW,GAAG,GAAG;AACvB,WAAO,KAAK,IAAI;AAAA,EACpB;AACA,SAAO;AACX;AAEA,eAAsB,cAAc,OAAiC;AACjE,QAAM,WAAO,wBAAK,MAAM,QAAQ,SAAS,UAAU;AACnD,QAAM,WAAW,aAAa,MAAM,GAAG;AAEvC,MAAI,CAAC,UAAU;AACX,UAAM,eAAe,MAAM,CAAC,kBAAkB,cAAc,EAAE,EAAE,KAAK,IAAI,CAAC;AAC1E;AAAA,EACJ;AAEA,QAAM,OAAOA,qBAAgB,wBAAK,MAAM,QAAQ,OAAO,GAAG,QAAQ;AAClE,QAAM;AAAA,IACF;AAAA,IACA;AAAA,MACI;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,4BAA4B,KAAK,UAAU,IAAI,CAAC;AAAA,MAChD;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACJ,EAAE,KAAK,IAAI;AAAA,EACf;AACJ;;;AEtDA,IAAAC,oBAA+B;AAgB/B,eAAsB,cAClB,OACA,QACA,OAAqB,CAAC,GACT;AACb,QAAM,WAAW;AAAA,IACb,SAAS;AAAA,IACT,QAAQ,OAAO,IAAI,CAAC,UAAU;AAC1B,YAAM,YAAY,KAAK,iBAAiB,IAAI,MAAM,IAAI;AACtD,YAAM,QAAQ,KAAK,cAAc,IAAI,MAAM,IAAI;AAC/C,YAAM,WAAW,KAAK,gBAAgB,IAAI,MAAM,IAAI;AACpD,aAAO;AAAA,QACH,QAAQ,MAAM;AAAA,QACd,MAAM,MAAM;AAAA,QACZ,MAAM,UAAM,4BAAS,MAAM,KAAK,MAAM,IAAI,CAAC;AAAA,QAC3C,QAAQ,MAAM;AAAA,QACd,QAAQ,MAAM,YAAY,IAAI,CAAC,SAAS,UAAM,4BAAS,MAAM,KAAK,IAAI,CAAC,CAAC;AAAA,QACxE,OAAO,UAAM,4BAAS,MAAM,KAAK,aAAa,OAAO,MAAM,QAAQ,CAAC,CAAC;AAAA,QACrE,GAAI,KAAK,aAAa,IAAI,MAAM,IAAI,IAAI,EAAE,QAAQ,KAAK,IAAI,CAAC;AAAA,QAC5D,GAAI,QAAQ,EAAE,MAAM,IAAI,CAAC;AAAA,QACzB,GAAI,YAAY,SAAS,SAAS,SAAS,IAAI,EAAE,UAAU,SAAS,SAAS,IAAI,CAAC;AAAA,QAClF,WAAW,WAAW,aAAa,CAAC;AAAA,QACpC,GAAI,aAAa,OAAO,KAAK,UAAU,KAAK,EAAE,SAAS,IACjD,EAAE,OAAO,UAAU,MAAM,IACzB,CAAC;AAAA,MACX;AAAA,IACJ,CAAC;AAAA,EACL;AAEA,QAAM,cAAU,wBAAK,MAAM,QAAQ,eAAe,GAAG,QAAQ;AACjE;;;AC9CA,IAAAC,kBAAyC;AACzC,IAAAC,oBAAqB;AAkBrB,IAAM,SAAiC;AAAA,EACnC,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AACT;AAEA,SAAS,cAAc,MAAsB;AACzC,SAAO,KAAK,QAAQ,mCAAmC,MAAM;AACjE;AAGA,SAAS,YAAY,OAAyB;AAC1C,MAAI,MAAM,QAAQ,KAAK,GAAG;AACtB,WAAO,MAAM,IAAI,WAAW;AAAA,EAChC;AACA,MAAI,SAAS,OAAO,UAAU,UAAU;AACpC,UAAM,MAAkB,CAAC;AACzB,eAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,KAAK,GAAG;AAC9C,UAAI,QAAQ,UAAU,OAAO,UAAU,YAAY,MAAM,WAAW,UAAU,GAAG;AAC7E,YAAI,OAAO,MAAM,QAAQ,YAAY,uBAAuB;AAAA,MAChE,OAAO;AACH,YAAI,GAAG,IAAI,YAAY,KAAK;AAAA,MAChC;AAAA,IACJ;AACA,WAAO;AAAA,EACX;AACA,SAAO;AACX;AAEA,SAAS,aAAa,QAAiC;AACnD,SAAO,WAAW,SAAS,eAAe;AAC9C;AAEA,IAAM,kBAA0C;AAAA,EAC5C,MAAM;AAAA,EACN,MAAM;AAAA,EACN,YAAY;AAAA,EACZ,MAAM;AACV;AAEA,SAAS,eAAe,WAAyC;AAC7D,MAAI,UAAU,WAAW,GAAG;AACxB,WAAO,EAAE,SAAS,EAAE,aAAa,WAAW,EAAE;AAAA,EAClD;AAEA,QAAM,MAAkB,CAAC;AACzB,aAAW,YAAY,WAAW;AAC9B,UAAM,MAAM,SAAS,WAAW,YAAY,YAAY,OAAO,SAAS,MAAM;AAC9E,UAAM,cACD,OAAO,SAAS,WAAW,YAAY,OAAO,SAAS,MAAM,KAAM;AACxE,QAAI,GAAG,IAAI;AAAA,MACP;AAAA,MACA,SAAS,EAAE,CAAC,aAAa,SAAS,MAAM,CAAC,GAAG,EAAE,QAAQ,YAAY,SAAS,MAAM,EAAE,EAAE;AAAA,IACzF;AAAA,EACJ;AACA,SAAO;AACX;AAEA,SAAS,eAAe,OAAmC;AACvD,QAAM,OAAO,oBAAI,IAAY;AAC7B,QAAM,SAAuB,CAAC;AAC9B,aAAW,SAAS,MAAM,QAAQ;AAC9B,QAAI,KAAK,IAAI,MAAM,IAAI,GAAG;AACtB;AAAA,IACJ;AACA,SAAK,IAAI,MAAM,IAAI;AACnB,WAAO,KAAK,EAAE,MAAM,MAAM,MAAM,IAAI,QAAQ,UAAU,MAAM,QAAQ,EAAE,MAAM,SAAS,EAAE,CAAC;AAAA,EAC5F;AACA,SAAO;AACX;AAEA,SAAS,gBAAgB,OAA6C;AAClE,MAAI,CAAC,SAAS,MAAM,SAAS,YAAY,OAAO,MAAM,eAAe,UAAU;AAC3E,WAAO,CAAC;AAAA,EACZ;AACA,QAAM,aAAa,MAAM;AACzB,QAAM,WAAW,MAAM,QAAQ,MAAM,QAAQ,IAAK,MAAM,WAAwB,CAAC;AACjF,SAAO,OAAO,QAAQ,UAAU,EAAE,IAAI,CAAC,CAAC,MAAM,MAAM,OAAO;AAAA,IACvD;AAAA,IACA,IAAI;AAAA,IACJ,UAAU,SAAS,SAAS,IAAI;AAAA,IAChC,QAAQ,YAAY,MAAM;AAAA,EAC9B,EAAE;AACN;AAEA,SAAS,gBAAgB,KAAiD;AACtE,QAAM,WAAO,wBAAK,KAAK,cAAc;AACrC,UAAI,4BAAW,IAAI,GAAG;AAClB,QAAI;AACA,YAAM,MAAM,KAAK,UAAM,8BAAa,MAAM,MAAM,CAAC;AACjD,aAAO,EAAE,OAAO,IAAI,QAAQ,YAAY,SAAS,IAAI,WAAW,QAAQ;AAAA,IAC5E,QAAQ;AAAA,IAER;AAAA,EACJ;AACA,SAAO,EAAE,OAAO,YAAY,SAAS,QAAQ;AACjD;AAGO,SAAS,qBACZ,OACA,QACA,OAAoB,CAAC,GACD;AACpB,QAAM,gBAA4B,CAAC;AACnC,QAAM,UAAsB,CAAC;AAC7B,QAAM,kBAA8B,CAAC;AAErC,aAAW,SAAS,QAAQ;AACxB,QAAI,KAAK,aAAa,IAAI,MAAM,IAAI,GAAG;AACnC;AAAA,IACJ;AACA,UAAM,YAAY,KAAK,iBAAiB,IAAI,MAAM,IAAI;AACtD,UAAM,QAAQ,KAAK,cAAc,IAAI,MAAM,IAAI;AAC/C,UAAM,WAAW,KAAK,gBAAgB,IAAI,MAAM,IAAI;AAEpD,eAAW,CAAC,MAAM,MAAM,KAAK,OAAO,QAAQ,WAAW,SAAS,CAAC,CAAC,GAAG;AACjE,cAAQ,IAAI,IAAI,YAAY,MAAM;AAAA,IACtC;AAEA,UAAM,YAAwB,EAAE,WAAW,eAAe,WAAW,aAAa,CAAC,CAAC,EAAE;AAEtF,UAAM,aAAa,CAAC,GAAG,eAAe,KAAK,GAAG,GAAG,gBAAgB,OAAO,KAAK,CAAC;AAC9E,QAAI,WAAW,SAAS,GAAG;AACvB,gBAAU,aAAa;AAAA,IAC3B;AACA,QAAI,OAAO,MAAM;AACb,YAAM,UAAsB,CAAC;AAC7B,iBAAW,CAAC,aAAa,MAAM,KAAK,OAAO,QAAQ,MAAM,IAAI,GAAG;AAC5D,gBAAQ,gBAAgB,WAAW,KAAK,WAAW,IAAI;AAAA,UACnD,QAAQ,YAAY,MAAM;AAAA,QAC9B;AAAA,MACJ;AACA,UAAI,OAAO,KAAK,OAAO,EAAE,SAAS,GAAG;AACjC,kBAAU,cAAc,EAAE,UAAU,MAAM,QAAQ;AAAA,MACtD;AAAA,IACJ;AACA,QAAI,YAAY,SAAS,SAAS,SAAS,GAAG;AAC1C,gBAAU,WAAW,SAAS;AAAA,IAClC;AACA,QAAI,UAAU;AACV,aAAO,OAAO,iBAAiB,SAAS,eAAe;AAAA,IAC3D;AAEA,UAAM,cAAc,cAAc,MAAM,IAAI;AAC5C,UAAM,WAAY,cAAc,WAAW,KAAoB,CAAC;AAChE,aAAS,MAAM,OAAO,YAAY,CAAC,IAAI;AACvC,kBAAc,WAAW,IAAI;AAAA,EACjC;AAEA,QAAM,WAAuB;AAAA,IACzB,SAAS;AAAA,IACT,MAAM,gBAAgB,MAAM,GAAG;AAAA,IAC/B,OAAO;AAAA,EACX;AACA,QAAM,aAAyB,CAAC;AAChC,MAAI,OAAO,KAAK,OAAO,EAAE,SAAS,GAAG;AACjC,eAAW,UAAU;AAAA,EACzB;AACA,MAAI,OAAO,KAAK,eAAe,EAAE,SAAS,GAAG;AACzC,eAAW,kBAAkB;AAAA,EACjC;AACA,MAAI,OAAO,KAAK,UAAU,EAAE,SAAS,GAAG;AACpC,aAAS,aAAa;AAAA,EAC1B;AACA,SAAO;AACX;AAGA,eAAsB,aAClB,OACA,QACA,OAAoB,CAAC,GACR;AACb,QAAM,cAAU,wBAAK,MAAM,QAAQ,cAAc,GAAG,qBAAqB,OAAO,QAAQ,IAAI,CAAC;AACjG;;;AC1MA,IAAAC,oBAAwB;AAcxB,SAAS,WAAW,QAA8B;AAC9C,MAAI,OAAO,WAAW,GAAG;AACrB,WAAO;AAAA,EACX;AAEA,QAAM,SAAS,oBAAI,IAAwB;AAC3C,aAAW,SAAS,QAAQ;AACxB,WAAO,IAAI,MAAM,MAAM,KAAK;AAAA,EAChC;AAEA,QAAM,SAAS,CAAC,GAAG,OAAO,OAAO,CAAC,EAC7B,IAAI,CAAC,UAAU,KAAK,KAAK,UAAU,MAAM,IAAI,CAAC,WAAW,EACzD,KAAK,IAAI;AACd,SAAO;AAAA,EAAM,MAAM;AAAA;AACvB;AAGA,SAAS,SAAS,UAAkB,aAA+B;AAC/D,MAAI,YAAY,WAAW,GAAG;AAC1B,WAAO;AAAA,EACX;AACA,SAAO,YACF,IAAI,CAAC,SAAS;AACX,UAAM,OAAO,KAAK,UAAU,gBAAgB,UAAU,IAAI,CAAC;AAC3D,WAAO,kBAAkB,IAAI;AAAA,EACjC,CAAC,EACA,KAAK,UAAU;AACxB;AAEA,SAAS,cAAc,UAAkB,OAAsC;AAC3E,SAAO,MAAM,IAAI,CAAC,EAAE,QAAQ,KAAK,MAAM;AACnC,UAAM,OAAO,KAAK,UAAU,gBAAgB,UAAU,IAAI,CAAC;AAC3D,UAAM,QAAQ,uDAAuD,IAAI;AACzE,UAAM,OAAO,kEAAkE,IAAI;AACnF,WAAO,eAAe,MAAM,8CAA8C,KAAK,KAAK,IAAI;AAAA,EAC5F,CAAC;AACL;AAEA,eAAsB,gBAAgB,OAAkB,SAAsC;AAC1F,aAAW,EAAE,KAAK,QAAQ,aAAa,MAAM,KAAK,SAAS;AACvD,UAAM,OAAO,aAAa,OAAO,GAAG;AACpC,UAAM,eAAW,2BAAQ,IAAI;AAC7B,UAAM,QAAQ;AAAA,MACV;AAAA,MACA,wBAAwB,WAAW,MAAM,CAAC;AAAA,MAC1C;AAAA,MACA,eAAe,SAAS,UAAU,WAAW,CAAC;AAAA,MAC9C;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACJ;AACA,QAAI,MAAM,SAAS,GAAG;AAClB,YAAM,KAAK,GAAG,cAAc,UAAU,KAAK,CAAC;AAAA,IAChD;AACA,UAAM,KAAK,EAAE;AACb,UAAM,eAAe,MAAM,MAAM,KAAK,IAAI,CAAC;AAAA,EAC/C;AACJ;;;AC9DA,SAAS,SAAS,QAAgC;AAE9C,QAAM,EAAE,SAAS,GAAG,KAAK,IAAI;AAC7B,OAAK;AACL,SAAO;AACX;AAKO,SAAS,kBAAkB,QAAyC;AACvE,MAAI,CAAC,kBAAkB,MAAM,GAAG;AAC5B,WAAO;AAAA,EACX;AACA,SAAO,SAAS,OAAO,aAAa,CAAC;AACzC;AAMO,SAAS,kBACZ,OACwD;AACxD,MAAI,CAAC,iBAAiB,KAAK,GAAG;AAC1B,WAAO;AAAA,EACX;AACA,QAAM,MAAoD,CAAC;AAC3D,aAAW,CAAC,aAAa,MAAM,KAAK,OAAO,QAAQ,MAAM,QAAQ,GAAG;AAChE,UAAM,OAAO,kBAAkB,MAAM;AACrC,QAAI,MAAM;AACN,UAAI,WAA8B,IAAI;AAAA,IAC1C;AAAA,EACJ;AACA,SAAO,OAAO,KAAK,GAAG,EAAE,SAAS,IAAI,MAAM;AAC/C;;;ACzBA,SAASC,YAAW,MAAuC;AACvD,QAAM,WAAW,QAAQ,QAAQ,IAAI;AACrC,SAAO,QAAQ,MAAM,QAAQ;AAC7B,SAAO,QAAQ,QAAQ;AAC3B;AAEA,SAASC,gBAAe,OAAyB;AAC7C,MAAI,SAAS,OAAO,UAAU,YAAY,aAAa,OAAO;AAC1D,WAAQ,MAA+B;AAAA,EAC3C;AACA,SAAO;AACX;AAEA,SAAS,oBAAoB,OAA8B;AACvD,QAAM,WAAWA,gBAAe,KAAK;AACrC,MAAI,OAAO,aAAa,YAAY;AAChC,WAAO,CAAC,QAAsB;AAAA,EAClC;AACA,MAAI,MAAM,QAAQ,QAAQ,GAAG;AACzB,WAAO,SAAS,OAAO,CAAC,OAAyB,OAAO,OAAO,UAAU;AAAA,EAC7E;AACA,SAAO,CAAC;AACZ;AAEA,SAAS,UAAU,aAAqE;AACpF,QAAM,QAA2B,CAAC;AAClC,QAAM,OAAO,kBAAkB,YAAY,IAAI;AAC/C,QAAM,QAAQ,kBAAkB,YAAY,KAAK;AACjD,MAAI,MAAM;AACN,UAAM,OAAO;AAAA,EACjB;AACA,MAAI,OAAO;AACP,UAAM,QAAQ;AAAA,EAClB;AACA,SAAO,MAAM,QAAQ,MAAM,QAAQ,QAAQ;AAC/C;AAEA,SAAS,WAAW,OAAqC;AACrD,MAAI,UAAU,OAAO;AACjB,WAAO;AAAA,EACX;AACA,MAAI,UAAU,MAAM;AAChB,WAAO;AAAA,EACX;AACA,MAAI,SAAS,OAAO,UAAU,YAAY,YAAY,OAAO;AACzD,WAAO,QAAS,MAA+B,MAAM;AAAA,EACzD;AACA,SAAO;AACX;AAEA,SAAS,cACL,OACA,aACA,YACO;AACP,MAAI,SAAS;AACb,aAAW,QAAQ,MAAM,aAAa;AAClC,UAAM,UAAU,WAAW,WAAW,IAAI,EAAE,OAAO;AACnD,QAAI,YAAY,QAAW;AACvB,eAAS;AAAA,IACb;AAAA,EACJ;AACA,QAAM,OAAO,WAAW,YAAY,OAAO;AAC3C,SAAO,QAAQ;AACnB;AAEA,SAAS,gBACL,OACA,aACA,YACyB;AACzB,QAAM,gBAAgB;AAAA,IACjB,YAAY,QAAoD;AAAA,EACrE;AAEA,QAAM,aAA2B,CAAC;AAClC,MAAI,CAAC,eAAe;AAChB,eAAW,QAAQ,MAAM,aAAa;AAClC,iBAAW,KAAK,GAAG,oBAAoB,WAAW,IAAI,EAAE,UAAU,CAAC;AAAA,IACvE;AAAA,EACJ;AACA,aAAW,KAAK,GAAG,oBAAoB,YAAY,UAAU,CAAC;AAE9D,QAAM,WAAkC,CAAC;AACzC,QAAM,kBAA2C,CAAC;AAClD,aAAW,MAAM,YAAY;AACzB,UAAM,UAAU,GAAG;AACnB,QAAI,SAAS,UAAU;AACnB,iBAAW,eAAe,QAAQ,UAAU;AACxC,YAAI,CAAC,SAAS,KAAK,CAAC,SAAS,KAAK,UAAU,IAAI,MAAM,KAAK,UAAU,WAAW,CAAC,GAAG;AAChF,mBAAS,KAAK,WAAW;AAAA,QAC7B;AAAA,MACJ;AAAA,IACJ;AACA,QAAI,SAAS,iBAAiB;AAC1B,aAAO,OAAO,iBAAiB,QAAQ,eAAe;AAAA,IAC1D;AAAA,EACJ;AAEA,SAAO,SAAS,SAAS,KAAK,OAAO,KAAK,eAAe,EAAE,SAAS,IAC9D,EAAE,UAAU,gBAAgB,IAC5B;AACV;AAOA,eAAsB,iBAClB,QACA,OACA,QAC+B;AAC/B,QAAM,SAAS,oBAAI,IAAuB;AAC1C,QAAM,EAAE,WAAW,IAAI,MAAM,aAAa;AAC1C,QAAM,kBAAkB,sBAAsB,OAAO,OAAO,MAAM,GAAG;AACrE,QAAM,cAAc,oBAAI,IAAqC;AAC7D,QAAM,aAAa,CAAC,SAA0C;AAC1D,QAAI,CAAC,YAAY,IAAI,IAAI,GAAG;AACxB,UAAI;AACA,oBAAY,IAAI,MAAMD,YAAW,IAAI,CAAC;AAAA,MAC1C,QAAQ;AACJ,oBAAY,IAAI,MAAM,CAAC,CAAC;AAAA,MAC5B;AAAA,IACJ;AACA,WAAO,YAAY,IAAI,IAAI;AAAA,EAC/B;AAEA,MAAI;AACA,eAAW,SAAS,QAAQ;AACxB,UAAI;AACA,cAAM,cAAcA,YAAW,MAAM,IAAI;AACzC,cAAM,OAAkB,CAAC;AACzB,cAAM,QAAQ,UAAU,WAAW;AACnC,cAAM,WAAW,gBAAgB,OAAO,aAAa,UAAU;AAC/D,cAAM,SAAS,cAAc,OAAO,aAAa,UAAU;AAC3D,YAAI,OAAO;AACP,eAAK,QAAQ;AAAA,QACjB;AACA,YAAI,UAAU;AACV,eAAK,WAAW;AAAA,QACpB;AACA,YAAI,QAAQ;AACR,eAAK,SAAS;AAAA,QAClB;AACA,YAAI,KAAK,SAAS,KAAK,YAAY,KAAK,QAAQ;AAC5C,iBAAO,IAAI,MAAM,MAAM,IAAI;AAAA,QAC/B;AAAA,MACJ,QAAQ;AAAA,MAER;AAAA,IACJ;AAAA,EACJ,UAAE;AACE,oBAAgB;AAChB,eAAW;AAAA,EACf;AAEA,SAAO;AACX;;;ACnLA,IAAAE,oBAAqB;AAMrB,eAAsB,gBAAgB,OAAkB,QAAuC;AAC3F,QAAM,WAAO,wBAAK,MAAM,QAAQ,aAAa;AAC7C,QAAM,QAAQ;AAAA,IACV;AAAA,IACA;AAAA,EACJ;AAEA,aAAW,SAAS,QAAQ;AACxB,UAAM,WAAW,aAAa,OAAO,MAAM,QAAQ;AACnD,UAAM;AAAA,MACF,KAAK,KAAK,UAAU,GAAG,MAAM,MAAM,IAAI,MAAM,IAAI,EAAE,CAAC,YAAY,KAAK;AAAA,QACjE,WAAW,MAAM,QAAQ;AAAA,MAC7B,CAAC;AAAA,IACL;AAAA,EACJ;AAEA,QAAM,KAAK,KAAK,EAAE;AAClB,QAAM,eAAe,MAAM,MAAM,KAAK,IAAI,CAAC;AAC/C;;;ACxBA,wBAAe;AAGf,IAAM,kBAAsC;AAAA,EACxC,QAAQ,kBAAAC,QAAG,aAAa;AAAA,EACxB,QAAQ,kBAAAA,QAAG,WAAW;AAAA,EACtB,kBAAkB,kBAAAA,QAAG,qBAAqB;AAAA,EAC1C,QAAQ;AAAA,EACR,cAAc;AAAA,EACd,QAAQ;AACZ;AAOO,SAAS,oBAAoB,OAAkB,YAAkC;AACpF,MAAI,UAA8B,EAAE,GAAG,gBAAgB;AAEvD,QAAM,aAAa,kBAAAA,QAAG,eAAe,MAAM,KAAK,kBAAAA,QAAG,IAAI,YAAY,eAAe;AAClF,MAAI,YAAY;AACZ,UAAM,SAAS,kBAAAA,QAAG,iCAAiC,YAAY,CAAC,GAAG;AAAA,MAC/D,GAAG,kBAAAA,QAAG;AAAA,MACN,qCAAqC,MAAM;AAAA,MAAC;AAAA,IAChD,CAAC;AACD,QAAI,QAAQ;AACR,gBAAU,EAAE,GAAG,OAAO,SAAS,QAAQ,KAAK;AAAA,IAChD;AAAA,EACJ;AAEA,SAAO,kBAAAA,QAAG,cAAc,YAAY,OAAO;AAC/C;;;AChCA,IAAAC,qBAAe;;;ACAf,IAAAC,qBAAe;AAkBR,SAAS,kBAAkB,SAAyB,UAAgC;AACvF,SAAO;AAAA,IACH;AAAA,IACA;AAAA,IACA,MAAM,CAAC;AAAA,IACP,YAAY,oBAAI,IAAI;AAAA,IACpB,UAAU,oBAAI,IAAI;AAAA,IAClB,UAAU,CAAC;AAAA,EACf;AACJ;AAEA,SAAS,OAAO,MAAuB;AACnC,SAAQ,KAAkC;AAC9C;AAEA,SAAS,cAAc,MAAmC;AACtD,SAAQ,KAA8C;AAC1D;AAEA,SAAS,WAAW,MAAwB;AACxC,QAAM,SAAS,KAAK,UAAU,KAAK,KAAK;AACxC,SAAO,QAAQ,QAAQ,MAAM;AACjC;AAEA,SAAS,gBAAgB,OAAyC;AAC9D,QAAM,SAAoB,CAAC;AAC3B,aAAW,UAAU,OAAO;AACxB,QAAI,OAAO,gBAAgB,KAAK,OAAO,gBAAgB,GAAG;AACtD,aAAO,KAAK,OAAO,KAAK;AAAA,IAC5B,WAAW,OAAO,QAAQ,mBAAAC,QAAG,UAAU,gBAAgB;AACnD,aAAO,KAAK,cAAc,MAAM,MAAM,MAAM;AAAA,IAChD,OAAO;AACH,aAAO;AAAA,IACX;AAAA,EACJ;AACA,SAAO;AACX;AAEA,SAAS,UAAU,MAAoB,KAA8B;AACjE,QAAM,OAAQ,mBAAAA,QAAG,UAAU,YAAY,mBAAAA,QAAG,UAAU,OAAO,mBAAAA,QAAG,UAAU;AACxE,QAAM,UAAU,KAAK,MAAM,OAAO,CAAC,WAAW,EAAE,OAAO,QAAQ,KAAK;AAEpE,MAAI,QAAQ,WAAW,GAAG;AACtB,WAAO,SAAS,QAAQ,CAAC,GAAG,GAAG;AAAA,EACnC;AAEA,QAAM,aAAa,gBAAgB,OAAO;AAC1C,MAAI,YAAY;AACZ,WAAO,EAAE,MAAM,WAAW;AAAA,EAC9B;AAEA,SAAO,EAAE,OAAO,QAAQ,IAAI,CAAC,WAAW,SAAS,QAAQ,GAAG,CAAC,EAAE;AACnE;AAEA,SAAS,kBAAkB,MAAe,KAA8B;AACpE,QAAM,EAAE,QAAQ,IAAI;AAEpB,QAAM,YACF,QAAQ,mBAAmB,MAAM,mBAAAA,QAAG,UAAU,MAAM,KACpD,QAAQ,mBAAmB,MAAM,mBAAAA,QAAG,UAAU,MAAM;AAExD,QAAM,aAAyC,CAAC;AAChD,QAAM,WAAqB,CAAC;AAE5B,aAAW,UAAU,QAAQ,oBAAoB,IAAI,GAAG;AACpD,UAAM,OAAO,OAAO,QAAQ;AAC5B,UAAM,WAAW,QAAQ,0BAA0B,QAAQ,IAAI,QAAQ;AACvE,UAAM,WACF,QAAQ,OAAO,SAAS,IAAI,mBAAAA,QAAG,YAAY,QAAQ,KACnD,QAAQ,SAAS,QAAQ,mBAAAA,QAAG,UAAU,SACjC,SAA0B,MAAM,KAAK,CAAC,MAAM,EAAE,QAAQ,mBAAAA,QAAG,UAAU,SAAS,CAAC;AAEtF,eAAW,IAAI,IAAI,SAAS,UAAU,GAAG;AACzC,QAAI,CAAC,UAAU;AACX,eAAS,KAAK,IAAI;AAAA,IACtB;AAAA,EACJ;AAEA,QAAM,SAAqB,EAAE,MAAM,SAAS;AAC5C,MAAI,OAAO,KAAK,UAAU,EAAE,SAAS,GAAG;AACpC,WAAO,aAAa;AAAA,EACxB;AACA,MAAI,SAAS,SAAS,GAAG;AACrB,WAAO,WAAW;AAAA,EACtB;AACA,MAAI,WAAW;AACX,WAAO,uBAAuB,SAAS,UAAU,MAAM,GAAG;AAAA,EAC9D,WAAW,OAAO,KAAK,UAAU,EAAE,SAAS,GAAG;AAC3C,WAAO,uBAAuB;AAAA,EAClC;AACA,SAAO;AACX;AAEA,SAAS,QAAQ,MAAuB;AACpC,QAAM,SAAS,KAAK,UAAU,KAAK,KAAK;AACxC,QAAM,OAAO,QAAQ,QAAQ;AAC7B,MAAI,QAAQ,SAAS,YAAY,SAAS,YAAY;AAClD,WAAO;AAAA,EACX;AACA,SAAO,YAAY,OAAO,IAAI,CAAC;AACnC;AAEA,SAAS,WAAW,MAAe,KAA8B;AAC7D,QAAM,EAAE,QAAQ,IAAI;AAEpB,MAAI,WAAW,IAAI,GAAG;AAClB,WAAO,EAAE,MAAM,UAAU,QAAQ,YAAY;AAAA,EACjD;AACA,MAAI,QAAQ,YAAY,IAAI,GAAG;AAC3B,UAAM,CAAC,OAAO,IAAI,QAAQ,iBAAiB,IAAwB;AACnE,WAAO,EAAE,MAAM,SAAS,OAAO,UAAU,SAAS,SAAS,GAAG,IAAI,CAAC,EAAE;AAAA,EACzE;AACA,MAAI,QAAQ,YAAY,IAAI,GAAG;AAC3B,UAAM,WAAW,QAAQ,iBAAiB,IAAwB;AAClE,WAAO,EAAE,MAAM,SAAS,OAAO,SAAS,IAAI,CAAC,YAAY,SAAS,SAAS,GAAG,CAAC,EAAE;AAAA,EACrF;AAEA,QAAM,KAAK,OAAO,IAAI;AACtB,QAAM,WAAW,IAAI,WAAW,IAAI,EAAE;AACtC,MAAI,UAAU;AACV,QAAI,SAAS,IAAI,QAAQ;AACzB,WAAO,EAAE,MAAM,WAAW,QAAQ,GAAG;AAAA,EACzC;AAEA,QAAM,OAAO,QAAQ,IAAI;AACzB,MAAI,WAAW,IAAI,IAAI,IAAI;AAC3B,QAAM,SAAS,kBAAkB,MAAM,GAAG;AAC1C,MAAI,WAAW,OAAO,EAAE;AAExB,MAAI,IAAI,SAAS,IAAI,IAAI,GAAG;AACxB,QAAI,KAAK,IAAI,IAAI;AACjB,WAAO,EAAE,MAAM,WAAW,IAAI,GAAG;AAAA,EACrC;AACA,SAAO;AACX;AAGO,SAAS,SAAS,MAAe,KAA8B;AAClE,QAAM,QAAQ,KAAK;AAEnB,MAAI,SAAS,mBAAAA,QAAG,UAAU,MAAM,mBAAAA,QAAG,UAAU,UAAU;AACnD,WAAO,CAAC;AAAA,EACZ;AACA,MAAI,QAAQ,mBAAAA,QAAG,UAAU,MAAM;AAC3B,WAAO,EAAE,MAAM,OAAO;AAAA,EAC1B;AACA,MAAI,SAAS,mBAAAA,QAAG,UAAU,YAAY,mBAAAA,QAAG,UAAU,OAAO;AACtD,WAAO,CAAC;AAAA,EACZ;AACA,MAAI,SAAS,mBAAAA,QAAG,UAAU,SAAS,mBAAAA,QAAG,UAAU,gBAAgB;AAC5D,QAAI,SAAS,KAAK,gFAAgF;AAClG,WAAO,EAAE,MAAM,SAAS;AAAA,EAC5B;AACA,MAAI,KAAK,gBAAgB,GAAG;AACxB,WAAO,EAAE,MAAM,UAAU,OAAO,KAAK,MAAM;AAAA,EAC/C;AACA,MAAI,KAAK,gBAAgB,GAAG;AACxB,WAAO,EAAE,MAAM,UAAU,OAAO,KAAK,MAAM;AAAA,EAC/C;AACA,MAAI,QAAQ,mBAAAA,QAAG,UAAU,gBAAgB;AACrC,WAAO,EAAE,MAAM,WAAW,OAAO,cAAc,IAAI,MAAM,OAAO;AAAA,EACpE;AACA,MAAI,QAAQ,mBAAAA,QAAG,UAAU,QAAQ;AAC7B,WAAO,EAAE,MAAM,SAAS;AAAA,EAC5B;AACA,MAAI,QAAQ,mBAAAA,QAAG,UAAU,QAAQ;AAC7B,WAAO,EAAE,MAAM,SAAS;AAAA,EAC5B;AACA,MAAI,QAAQ,mBAAAA,QAAG,UAAU,SAAS;AAC9B,WAAO,EAAE,MAAM,UAAU;AAAA,EAC7B;AACA,MAAI,KAAK,QAAQ,GAAG;AAChB,WAAO,UAAU,MAAM,GAAG;AAAA,EAC9B;AACA,MAAI,QAAQ,mBAAAA,QAAG,UAAU,UAAU,KAAK,eAAe,GAAG;AACtD,WAAO,WAAW,MAAM,GAAG;AAAA,EAC/B;AAEA,SAAO,CAAC;AACZ;;;ADnLA,SAAS,mBACL,QAC6E;AAC7E,MAAI;AAEJ,QAAM,aAAa,CAAC,SAChB,mBAAAC,QAAG,iBAAiB,IAAI,MACvB,mBAAAA,QAAG,aAAa,IAAI,GAAG,KAAK,CAAC,MAAM,EAAE,SAAS,mBAAAA,QAAG,WAAW,aAAa,KAAK;AAEnF,aAAW,aAAa,OAAO,YAAY;AACvC,QAAI,mBAAAA,QAAG,sBAAsB,SAAS,KAAK,UAAU,MAAM,SAAS,YAAY,WAAW,SAAS,GAAG;AACnG,cAAQ;AAAA,IACZ;AACA,QAAI,mBAAAA,QAAG,oBAAoB,SAAS,KAAK,WAAW,SAAS,GAAG;AAC5D,iBAAW,eAAe,UAAU,gBAAgB,cAAc;AAC9D,YACI,mBAAAA,QAAG,aAAa,YAAY,IAAI,KAChC,YAAY,KAAK,SAAS,YAC1B,YAAY,gBACX,mBAAAA,QAAG,gBAAgB,YAAY,WAAW,KACvC,mBAAAA,QAAG,qBAAqB,YAAY,WAAW,IACrD;AACE,kBAAQ,YAAY;AAAA,QACxB;AAAA,MACJ;AAAA,IACJ;AAAA,EACJ;AAEA,SAAO;AACX;AAEA,SAAS,yBACL,IACe;AACf,MAAI,mBAAAA,QAAG,gBAAgB,EAAE,KAAK,CAAC,mBAAAA,QAAG,QAAQ,GAAG,IAAI,GAAG;AAChD,WAAO,CAAC,GAAG,IAAI;AAAA,EACnB;AACA,MAAI,CAAC,GAAG,MAAM;AACV,WAAO,CAAC;AAAA,EACZ;AAEA,QAAM,cAA+B,CAAC;AACtC,QAAM,QAAQ,CAAC,SAAwB;AACnC,QAAI,mBAAAA,QAAG,sBAAsB,IAAI,KAAK,mBAAAA,QAAG,qBAAqB,IAAI,KAAK,mBAAAA,QAAG,gBAAgB,IAAI,GAAG;AAC7F;AAAA,IACJ;AACA,QAAI,mBAAAA,QAAG,kBAAkB,IAAI,KAAK,KAAK,YAAY;AAC/C,kBAAY,KAAK,KAAK,UAAU;AAAA,IACpC;AACA,uBAAAA,QAAG,aAAa,MAAM,KAAK;AAAA,EAC/B;AACA,qBAAAA,QAAG,aAAa,GAAG,MAAM,KAAK;AAC9B,SAAO;AACX;AAQA,SAAS,aACL,SACA,MACA,MACA,UACmB;AACnB,QAAM,SAAS,QAAQ,kBAAkB,MAAM,IAAI;AACnD,SAAO,SAAS,QAAQ,0BAA0B,QAAQ,QAAQ,IAAI;AAC1E;AAEA,SAASC,iBAAgB,SAAyB,MAAwB;AACtE,SAAO;AAAA,IACH,QAAQ,kBAAkB,MAAM,MAAM,KACtC,QAAQ,kBAAkB,MAAM,QAAQ,KACxC,QAAQ,kBAAkB,MAAM,QAAQ;AAAA,EAC5C;AACJ;AAQA,SAAS,aAAa,SAAyB,YAAoD;AAC/F,MAAI,CAAC,mBAAAD,QAAG,iBAAiB,UAAU,KAAK,CAAC,mBAAAA,QAAG,2BAA2B,WAAW,UAAU,GAAG;AAC3F,WAAO;AAAA,EACX;AACA,QAAM,SAAS,WAAW,WAAW,KAAK;AAC1C,MAAI,WAAW,UAAU,WAAW,QAAQ;AACxC,WAAO;AAAA,EACX;AACA,MAAI,CAACC,iBAAgB,SAAS,QAAQ,kBAAkB,UAAU,CAAC,GAAG;AAClE,WAAO;AAAA,EACX;AAEA,QAAM,CAAC,SAAS,SAAS,IAAI,WAAW;AACxC,MAAI,CAAC,SAAS;AACV,WAAO;AAAA,EACX;AAEA,MAAI,SAA6B;AACjC,MAAI,WAAW;AACX,UAAM,aAAa,QAAQ,kBAAkB,SAAS;AACtD,aAAS,WAAW,gBAAgB,IAAI,WAAW,QAAQ;AAAA,EAC/D;AAEA,SAAO,EAAE,QAAQ,QAAQ,WAAW,SAAS,SAAS,QAAQ,MAAM,QAAQ,kBAAkB,OAAO,EAAE;AAC3G;AAGA,SAAS,aAAa,SAAyB,MAAe,UAA4C;AACtG,QAAM,WAAW,aAAa,SAAS,MAAM,QAAQ,QAAQ;AAC7D,QAAM,aAAa,aAAa,SAAS,MAAM,UAAU,QAAQ;AACjE,QAAM,aAAa,aAAa,SAAS,MAAM,UAAU,QAAQ;AACjE,MAAI,CAAC,YAAY,CAAC,cAAc,CAAC,YAAY;AACzC,WAAO;AAAA,EACX;AAEA,QAAM,SAAS,WAAW,gBAAgB,IAAI,WAAW,QAAQ;AACjE,QAAM,SAAS,WAAW,gBAAgB,KAAK,WAAW,UAAU,SAAS,SAAS;AACtF,SAAO,EAAE,QAAQ,QAAQ,MAAM,SAAS;AAC5C;AAEA,SAAS,aAAa,MAA0B;AAC5C,SAAO,KAAK,QAAQ,IAAI,KAAK,QAAQ,CAAC,IAAI;AAC9C;AAMO,SAAS,sBAAsB,SAAqB,MAA8B;AACrF,QAAM,SAAyB,EAAE,WAAW,CAAC,GAAG,QAAQ,OAAO,UAAU,CAAC,GAAG,OAAO,CAAC,EAAE;AACvF,QAAM,SAAS,QAAQ,cAAc,IAAI;AACzC,MAAI,CAAC,QAAQ;AACT,WAAO;AAAA,EACX;AAEA,QAAM,UAAU,QAAQ,eAAe;AACvC,QAAM,KAAK,mBAAmB,MAAM;AACpC,MAAI,CAAC,IAAI;AACL,WAAO;AAAA,EACX;AAEA,QAAM,MAAM,kBAAkB,SAAS,EAAE;AACzC,QAAM,WAAW,oBAAI,IAA4E;AAEjG,QAAM,SAAS,CAAC,QAA2B;AACvC,UAAM,SAAS,SAAS,IAAI,MAAM,GAAG;AACrC,UAAM,SAAS,SAAS,IAAI,IAAI,MAAM,KAAK,EAAE,QAAQ,IAAI,QAAQ,SAAS,CAAC,EAAE;AAC7E,WAAO,QAAQ,KAAK,MAAM;AAC1B,aAAS,IAAI,IAAI,QAAQ,MAAM;AAAA,EACnC;AAEA,aAAW,cAAc,yBAAyB,EAAE,GAAG;AACnD,UAAM,WAAW,aAAa,SAAS,UAAU;AACjD,QAAI,UAAU;AACV,aAAO,QAAQ;AACf;AAAA,IACJ;AAEA,QAAI,UAAU;AACd,eAAW,UAAU,aAAa,QAAQ,kBAAkB,UAAU,CAAC,GAAG;AACtE,YAAM,MAAM,aAAa,SAAS,QAAQ,UAAU;AACpD,UAAI,KAAK;AACL,eAAO,GAAG;AACV,kBAAU;AAAA,MACd;AAAA,IACJ;AACA,QAAI,CAAC,SAAS;AACV,aAAO,SAAS;AAAA,IACpB;AAAA,EACJ;AAEA,aAAW,CAAC,QAAQ,EAAE,QAAQ,QAAQ,CAAC,KAAK,UAAU;AAClD,UAAM,SAAS,QAAQ,WAAW,IAAI,QAAQ,CAAC,IAAI,EAAE,OAAO,QAAQ;AACpE,WAAO,UAAU,KAAK,EAAE,QAAQ,QAAQ,OAAO,CAAC;AAAA,EACpD;AACA,SAAO,UAAU,KAAK,CAAC,GAAG,MAAM,OAAO,EAAE,MAAM,IAAI,OAAO,EAAE,MAAM,CAAC;AACnE,SAAO,WAAW,IAAI;AACtB,SAAO,QAAQ,IAAI;AACnB,SAAO;AACX;;;AE1MA,IAAAC,qBAA8B;AAI9B,SAAS,eAAe,OAA4B,OAA4C;AAC5F,QAAM,SAAmC,CAAC;AAC1C,aAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,SAAS,CAAC,CAAC,GAAG;AACpD,UAAM,UAAU,MAAM,QAAQ,KAAK,IAAI,QAAQ,CAAC,KAAK;AAIrD,WAAO,GAAG,IAAI,QAAQ;AAAA,MAAI,CAAC,WACvB,mBAAmB,MAAM,YAAQ,4BAAQ,MAAM,KAAK,MAAM,CAAC;AAAA,IAC/D;AAAA,EACJ;AACA,SAAO;AACX;AAGA,eAAsB,cAAc,OAAkB,QAAkD;AACpG,QAAM,WAAO,yBAAK,MAAM,QAAQ,eAAe;AAC/C,QAAM,UAAU,MAAM;AAAA,IAClB,iBAAiB;AAAA,MACb,UAAU;AAAA,QACN;AAAA,QACA;AAAA,MACJ;AAAA,MACA,OAAO;AAAA;AAAA,QAEH,WAAW,CAAC,KAAK;AAAA,QACjB,GAAG,eAAe,OAAO,OAAO,KAAK;AAAA,MACzC;AAAA,MACA,SAAS;AAAA,QACL;AAAA,UACI,MAAM;AAAA,QACV;AAAA,MACJ;AAAA,IACJ;AAAA,IACA,SAAS;AAAA,MACL,mBAAmB,MAAM,YAAQ,yBAAK,MAAM,KAAK,KAAK,CAAC;AAAA,MACvD,mBAAmB,MAAM,YAAQ,yBAAK,MAAM,KAAK,gBAAgB,CAAC;AAAA,MAClE;AAAA,IACJ;AAAA,EACJ,CAAC;AACL;;;AZpBA,eAAe,YAAY,OAAkB,QAA+C;AAGxF,QAAM,aAAa,oBAAI,IAAoD;AAC3E,aAAW,SAAS,QAAQ;AACxB,UAAM,MAAM,MAAM,MAAM,QAAQ;AAChC,UAAM,OAAO,WAAW,IAAI,GAAG,KAAK,CAAC;AACrC,SAAK,KAAK,EAAE,QAAQ,MAAM,QAAQ,MAAM,MAAM,KAAK,CAAC;AACpD,eAAW,IAAI,KAAK,IAAI;AAAA,EAC5B;AAEA,QAAM,OAAO,MAAM,iBAAiB,MAAM,SAAS;AACnD,SAAO,KAAK,IAAI,CAAC,SAAS;AAAA,IACtB;AAAA,IACA,QAAQ,kBAAkB,MAAM,WAAW,GAAG;AAAA,IAC9C,aAAa,kBAAkB,MAAM,WAAW,GAAG;AAAA,IACnD,OAAO,WAAW,IAAI,MAAM,GAAG,CAAC,KAAK,CAAC;AAAA,EAC1C,EAAE;AACN;AAuBA,SAAS,iBAAiB,OAAkB,QAAqD;AAC7F,QAAM,SAAS,oBAAI,IAA4B;AAC/C,MAAI,OAAO,WAAW,GAAG;AACrB,WAAO;AAAA,EACX;AAEA,MAAI;AACA,UAAM,QAAQ,CAAC,GAAG,IAAI,IAAI,OAAO,IAAI,CAAC,UAAU,MAAM,IAAI,CAAC,CAAC;AAE5D,UAAM,eAAW,yBAAK,MAAM,QAAQ,SAAS,UAAU;AACvD,UAAM,UAAU;AAAA,MACZ;AAAA,UACA,4BAAW,QAAQ,IAAI,CAAC,GAAG,OAAO,QAAQ,IAAI;AAAA,IAClD;AACA,eAAW,QAAQ,OAAO;AACtB,aAAO,IAAI,MAAM,sBAAsB,SAAS,IAAI,CAAC;AAAA,IACzD;AAAA,EACJ,SAAS,OAAO;AACZ,YAAQ,KAAK,6CAA8C,MAAgB,OAAO,IAAI;AAAA,EAC1F;AAEA,SAAO;AACX;AASA,eAAe,YACX,QACA,OACA,QACoB;AACpB,QAAM,eAAe,oBAAI,IAA+B;AACxD,QAAM,iBAAiB,oBAAI,IAA2B;AACtD,QAAM,cAAc,oBAAI,IAAY;AACpC,MAAI,OAAO,WAAW,GAAG;AACrB,WAAO,EAAE,cAAc,gBAAgB,YAAY;AAAA,EACvD;AAEA,MAAI;AACA,UAAM,OAAO,MAAM,iBAAiB,QAAQ,OAAO,MAAM;AACzD,eAAW,CAAC,MAAM,KAAK,KAAK,MAAM;AAC9B,UAAI,MAAM,OAAO;AACb,qBAAa,IAAI,MAAM,MAAM,KAAK;AAAA,MACtC;AACA,UAAI,MAAM,UAAU;AAChB,uBAAe,IAAI,MAAM,MAAM,QAAQ;AAAA,MAC3C;AACA,UAAI,MAAM,QAAQ;AACd,oBAAY,IAAI,IAAI;AAAA,MACxB;AAAA,IACJ;AAAA,EACJ,SAAS,OAAO;AACZ,YAAQ,KAAK,4CAA6C,MAAgB,OAAO,IAAI;AAAA,EACzF;AAEA,SAAO,EAAE,cAAc,gBAAgB,YAAY;AACvD;AAQA,eAAsB,YAClB,QACA,UAA4B,CAAC,GACV;AACnB,QAAM,QAAQ,iBAAiB,QAAQ,QAAQ,GAAG;AAClD,mBAAiB,KAAK;AACtB,QAAM,SAAS,MAAM,WAAW,MAAM,SAAS;AAC/C,QAAM,UAAU,MAAM,YAAY,OAAO,MAAM;AAE/C,YAAM,wBAAM,MAAM,QAAQ,EAAE,WAAW,KAAK,CAAC;AAC7C,QAAM,gBAAgB,OAAO,OAAO;AACpC,QAAM,gBAAgB,OAAO,MAAM;AACnC,QAAM,cAAc,KAAK;AACzB,QAAM,cAAc,OAAO,MAAM;AAGjC,QAAM,kBAAkB,iBAAiB,OAAO,MAAM;AACtD,QAAM,EAAE,cAAc,gBAAgB,YAAY,IAAI,MAAM,YAAY,QAAQ,OAAO,MAAM;AAC7F,QAAM,OAAiB,EAAE,iBAAiB,cAAc,gBAAgB,YAAY;AACpF,QAAM,cAAc,OAAO,QAAQ,IAAI;AACvC,QAAM,aAAa,OAAO,QAAQ,IAAI;AAEtC,QAAM;AAAA,IACF,MAAM;AAAA,IACN,oBAAI,IAAI;AAAA,UACJ,yBAAK,MAAM,QAAQ,eAAe;AAAA,UAClC,yBAAK,MAAM,QAAQ,eAAe;AAAA,UAClC,yBAAK,MAAM,QAAQ,cAAc;AAAA,UACjC,yBAAK,MAAM,QAAQ,aAAa;AAAA,UAChC,yBAAK,MAAM,QAAQ,SAAS,UAAU;AAAA,MACtC,GAAG,QAAQ,IAAI,CAAC,WAAW,aAAa,OAAO,OAAO,GAAG,CAAC;AAAA,IAC9D,CAAC;AAAA,EACL;AAEA,SAAO,EAAE,OAAO,QAAQ,SAAS,KAAK;AAC1C;;;AazKA,IAAAC,kBAA2B;AAC3B,IAAAC,qBAAuC;;;ACGvC,IAAAC,qBAAmC;;;ACJnC,IAAAC,kBAA2B;AAC3B,IAAAC,qBAA8B;AAI9B,IAAMC,mBAAkB,CAAC,MAAM,OAAO,OAAO,OAAO,MAAM,OAAO,OAAO,KAAK;AAW7E,SAAS,gBAAgB,KAAiC;AACtD,aAAW,OAAOA,kBAAiB;AAC/B,UAAM,WAAO,yBAAK,KAAK,OAAO,QAAQ,GAAG,EAAE;AAC3C,YAAI,4BAAW,IAAI,GAAG;AAClB,aAAO;AAAA,IACX;AAAA,EACJ;AACA,SAAO;AACX;AAMA,eAAsB,cAAc,MAAM,QAAQ,IAAI,GAA2B;AAC7E,QAAM,OAAO,oBAAgB,4BAAQ,GAAG,CAAC;AACzC,MAAI,CAAC,MAAM;AACP,WAAO,CAAC;AAAA,EACZ;AAEA,QAAM,EAAE,WAAW,IAAI,MAAM,aAAa;AAC1C,MAAI;AACA,UAAM,WAAW,QAAQ,QAAQ,IAAI;AACrC,WAAO,QAAQ,MAAM,QAAQ;AAC7B,UAAM,SAAS,QAAQ,QAAQ;AAE/B,UAAM,YAA2B,EAAE,KAAK;AACxC,QAAI,OAAO,SAAS,QAAW;AAC3B,UAAI,OAAO,OAAO,SAAS,YAAY;AACnC,cAAM,IAAI,MAAM,GAAG,IAAI,8BAA8B;AAAA,MACzD;AACA,gBAAU,OAAO,OAAO;AAAA,IAC5B;AACA,QAAI,OAAO,aAAa,QAAW;AAC/B,UAAI,OAAO,OAAO,aAAa,YAAY;AACvC,cAAM,IAAI,MAAM,GAAG,IAAI,kCAAkC;AAAA,MAC7D;AACA,gBAAU,WAAW,OAAO;AAAA,IAChC;AACA,WAAO;AAAA,EACX,UAAE;AACE,eAAW;AAAA,EACf;AACJ;AAGA,eAAsB,QAAQ,WAA6C;AACvE,MAAI,CAAC,UAAU,MAAM;AACjB,WAAO,CAAC;AAAA,EACZ;AACA,QAAM,WAAW,MAAM,UAAU,KAAK;AACtC,SAAQ,YAAY,CAAC;AACzB;;;AvBHO,SAAS,aAAkB,QAA0C;AACxE,SAAO;AACX;","names":["import_node_path","import_node_fs","import_node_path","prefix","Module","import_node_fs","import_promises","import_node_path","import_node_fs","import_node_path","import_node_fs","import_promises","import_node_path","moduleSpecifier","import_node_path","import_node_fs","import_node_path","import_node_path","loadModule","interopDefault","import_node_path","ts","import_typescript","import_typescript","ts","ts","isTypedResponse","import_node_path","import_node_fs","import_node_path","import_node_path","import_node_fs","import_node_path","MAIN_EXTENSIONS"]}
|
|
1
|
+
{"version":3,"sources":["../src/loader/_es5.ts","../src/generator/schema/program.ts","../src/generator/schema/json-schema.ts","../src/generator/schema/responses.ts","../src/generator/schema/index.ts","../src/index.ts","../src/types.ts","../src/context.ts","../src/validation.ts","../src/app.ts","../src/loader/loader.ts","../src/config/schema.ts","../src/routes.ts","../src/generator/sync.ts","../src/generator/app-types.ts","../src/generator/util.ts","../src/generator/manifest.ts","../src/generator/openapi.ts","../src/generator/param-types.ts","../src/generator/inputs.ts","../src/generator/route-meta.ts","../src/generator/route-types.ts","../src/generator/tsconfig.ts","../src/generator/watch.ts","../src/loader/module-loader.ts","../src/lifecycle.ts"],"sourcesContent":["const _ = '';\r\nexport default _;","import ts from 'typescript';\nimport type { GiriPaths } from '../../types';\n\nconst DEFAULT_OPTIONS: ts.CompilerOptions = {\n target: ts.ScriptTarget.ES2022,\n module: ts.ModuleKind.NodeNext,\n moduleResolution: ts.ModuleResolutionKind.NodeNext,\n strict: true,\n skipLibCheck: true,\n noEmit: true,\n};\n\n/**\n * Build a `ts.Program` rooted at the given route files, using the project's own\n * `tsconfig.json` (so `paths`, `rootDirs`, and the user's TS settings apply). The\n * walker reads types from this program; nothing is emitted.\n */\nexport function createSchemaProgram(paths: GiriPaths, routeFiles: string[]): ts.Program {\n let options: ts.CompilerOptions = { ...DEFAULT_OPTIONS };\n\n const configPath = ts.findConfigFile(paths.cwd, ts.sys.fileExists, 'tsconfig.json');\n if (configPath) {\n const parsed = ts.getParsedCommandLineOfConfigFile(configPath, {}, {\n ...ts.sys,\n onUnRecoverableConfigFileDiagnostic: () => {},\n });\n if (parsed) {\n options = { ...parsed.options, noEmit: true };\n }\n }\n\n return ts.createProgram(routeFiles, options);\n}\n","import ts from 'typescript';\n\nexport type JSONSchema = Record<string, unknown>;\n\nexport interface WalkContext {\n checker: ts.TypeChecker;\n /** Node used to resolve property types in context. */\n location: ts.Node;\n /** Shared `$defs` bucket for recursive types. */\n defs: Record<string, JSONSchema>;\n /** Type ids currently being walked, mapped to their `$defs` name (cycle guard). */\n inProgress: Map<number, string>;\n /** `$defs` names that were referenced via `$ref` (i.e. proved recursive). */\n usedDefs: Set<string>;\n /** Non-fatal notes (e.g. bigint serialization caveats). */\n warnings: string[];\n}\n\nexport function createWalkContext(checker: ts.TypeChecker, location: ts.Node): WalkContext {\n return {\n checker,\n location,\n defs: {},\n inProgress: new Map(),\n usedDefs: new Set(),\n warnings: [],\n };\n}\n\nfunction typeId(type: ts.Type): number {\n return (type as ts.Type & { id: number }).id;\n}\n\nfunction intrinsicName(type: ts.Type): string | undefined {\n return (type as ts.Type & { intrinsicName?: string }).intrinsicName;\n}\n\nfunction isDateType(type: ts.Type): boolean {\n const symbol = type.getSymbol() ?? type.aliasSymbol;\n return symbol?.getName() === 'Date';\n}\n\nfunction literalValuesOf(types: ts.Type[]): unknown[] | undefined {\n const values: unknown[] = [];\n for (const member of types) {\n if (member.isStringLiteral() || member.isNumberLiteral()) {\n values.push(member.value);\n } else if (member.flags & ts.TypeFlags.BooleanLiteral) {\n values.push(intrinsicName(member) === 'true');\n } else {\n return undefined;\n }\n }\n return values;\n}\n\nfunction walkUnion(type: ts.UnionType, ctx: WalkContext): JSONSchema {\n const flag = (ts.TypeFlags.Undefined | ts.TypeFlags.Void | ts.TypeFlags.Never);\n const members = type.types.filter((member) => !(member.flags & flag));\n\n if (members.length === 1) {\n return walkType(members[0], ctx);\n }\n\n const enumValues = literalValuesOf(members);\n if (enumValues) {\n return { enum: enumValues };\n }\n\n return { anyOf: members.map((member) => walkType(member, ctx)) };\n}\n\nfunction buildObjectSchema(type: ts.Type, ctx: WalkContext): JSONSchema {\n const { checker } = ctx;\n\n const indexInfo =\n checker.getIndexInfoOfType(type, ts.IndexKind.String) ??\n checker.getIndexInfoOfType(type, ts.IndexKind.Number);\n\n const properties: Record<string, JSONSchema> = {};\n const required: string[] = [];\n\n for (const symbol of checker.getPropertiesOfType(type)) {\n const name = symbol.getName();\n const propType = checker.getTypeOfSymbolAtLocation(symbol, ctx.location);\n const optional =\n Boolean(symbol.getFlags() & ts.SymbolFlags.Optional) ||\n Boolean(propType.flags & ts.TypeFlags.Union &&\n (propType as ts.UnionType).types.some((t) => t.flags & ts.TypeFlags.Undefined));\n\n properties[name] = walkType(propType, ctx);\n if (!optional) {\n required.push(name);\n }\n }\n\n const schema: JSONSchema = { type: 'object' };\n if (Object.keys(properties).length > 0) {\n schema.properties = properties;\n }\n if (required.length > 0) {\n schema.required = required;\n }\n if (indexInfo) {\n schema.additionalProperties = walkType(indexInfo.type, ctx);\n } else if (Object.keys(properties).length > 0) {\n schema.additionalProperties = false;\n }\n return schema;\n}\n\nfunction defName(type: ts.Type): string {\n const symbol = type.getSymbol() ?? type.aliasSymbol;\n const name = symbol?.getName();\n if (name && name !== '__type' && name !== '__object') {\n return name;\n }\n return `Anonymous${typeId(type)}`;\n}\n\nfunction walkObject(type: ts.Type, ctx: WalkContext): JSONSchema {\n const { checker } = ctx;\n\n if (isDateType(type)) {\n return { type: 'string', format: 'date-time' };\n }\n if (checker.isArrayType(type)) {\n const [element] = checker.getTypeArguments(type as ts.TypeReference);\n return { type: 'array', items: element ? walkType(element, ctx) : {} };\n }\n if (checker.isTupleType(type)) {\n const elements = checker.getTypeArguments(type as ts.TypeReference);\n return { type: 'array', items: elements.map((element) => walkType(element, ctx)) };\n }\n\n const id = typeId(type);\n const existing = ctx.inProgress.get(id);\n if (existing) {\n ctx.usedDefs.add(existing);\n return { $ref: `#/$defs/${existing}` };\n }\n\n const name = defName(type);\n ctx.inProgress.set(id, name);\n const schema = buildObjectSchema(type, ctx);\n ctx.inProgress.delete(id);\n\n if (ctx.usedDefs.has(name)) {\n ctx.defs[name] = schema;\n return { $ref: `#/$defs/${name}` };\n }\n return schema;\n}\n\n/** Translate a TypeScript type into the JSON Schema that `JSON.stringify` would produce. */\nexport function walkType(type: ts.Type, ctx: WalkContext): JSONSchema {\n const flags = type.flags;\n\n if (flags & (ts.TypeFlags.Any | ts.TypeFlags.Unknown)) {\n return {};\n }\n if (flags & ts.TypeFlags.Null) {\n return { type: 'null' };\n }\n if (flags & (ts.TypeFlags.Undefined | ts.TypeFlags.Void)) {\n return {};\n }\n if (flags & (ts.TypeFlags.BigInt | ts.TypeFlags.BigIntLiteral)) {\n ctx.warnings.push('bigint is not JSON-serializable (JSON.stringify throws); documented as string.');\n return { type: 'string' };\n }\n if (type.isStringLiteral()) {\n return { type: 'string', const: type.value };\n }\n if (type.isNumberLiteral()) {\n return { type: 'number', const: type.value };\n }\n if (flags & ts.TypeFlags.BooleanLiteral) {\n return { type: 'boolean', const: intrinsicName(type) === 'true' };\n }\n if (flags & ts.TypeFlags.String) {\n return { type: 'string' };\n }\n if (flags & ts.TypeFlags.Number) {\n return { type: 'number' };\n }\n if (flags & ts.TypeFlags.Boolean) {\n return { type: 'boolean' };\n }\n if (type.isUnion()) {\n return walkUnion(type, ctx);\n }\n if (flags & ts.TypeFlags.Object || type.isIntersection()) {\n return walkObject(type, ctx);\n }\n\n return {};\n}\n","import ts from 'typescript';\nimport { createWalkContext, walkType, type JSONSchema } from './json-schema';\n\nexport interface ResponseSchema {\n /** Numeric HTTP status, or 'default' when the handler returns a non-literal status. */\n status: number | 'default';\n format: 'json' | 'text';\n schema: JSONSchema;\n}\n\nexport interface RouteResponses {\n responses: ResponseSchema[];\n /** Statuses/returns the walker could not turn into a schema (e.g. a raw `Response`). */\n opaque: boolean;\n warnings: string[];\n $defs: Record<string, JSONSchema>;\n}\n\nfunction findHandleFunction(\n source: ts.SourceFile,\n): ts.ArrowFunction | ts.FunctionExpression | ts.FunctionDeclaration | undefined {\n let found: ts.ArrowFunction | ts.FunctionExpression | ts.FunctionDeclaration | undefined;\n\n const isExported = (node: ts.Node): boolean =>\n ts.canHaveModifiers(node) &&\n (ts.getModifiers(node)?.some((m) => m.kind === ts.SyntaxKind.ExportKeyword) ?? false);\n\n for (const statement of source.statements) {\n if (ts.isFunctionDeclaration(statement) && statement.name?.text === 'handle' && isExported(statement)) {\n found = statement;\n }\n if (ts.isVariableStatement(statement) && isExported(statement)) {\n for (const declaration of statement.declarationList.declarations) {\n if (\n ts.isIdentifier(declaration.name) &&\n declaration.name.text === 'handle' &&\n declaration.initializer &&\n (ts.isArrowFunction(declaration.initializer) ||\n ts.isFunctionExpression(declaration.initializer))\n ) {\n found = declaration.initializer;\n }\n }\n }\n }\n\n return found;\n}\n\nfunction collectReturnExpressions(\n fn: ts.ArrowFunction | ts.FunctionExpression | ts.FunctionDeclaration,\n): ts.Expression[] {\n if (ts.isArrowFunction(fn) && !ts.isBlock(fn.body)) {\n return [fn.body];\n }\n if (!fn.body) {\n return [];\n }\n\n const expressions: ts.Expression[] = [];\n const visit = (node: ts.Node): void => {\n if (ts.isFunctionDeclaration(node) || ts.isFunctionExpression(node) || ts.isArrowFunction(node)) {\n return;\n }\n if (ts.isReturnStatement(node) && node.expression) {\n expressions.push(node.expression);\n }\n ts.forEachChild(node, visit);\n };\n ts.forEachChild(fn.body, visit);\n return expressions;\n}\n\ninterface ResponseHit {\n status: number | 'default';\n format: 'json' | 'text';\n data: ts.Type;\n}\n\nfunction propertyType(\n checker: ts.TypeChecker,\n type: ts.Type,\n name: string,\n location: ts.Node,\n): ts.Type | undefined {\n const symbol = checker.getPropertyOfType(type, name);\n return symbol ? checker.getTypeOfSymbolAtLocation(symbol, location) : undefined;\n}\n\nfunction isTypedResponse(checker: ts.TypeChecker, type: ts.Type): boolean {\n return Boolean(\n checker.getPropertyOfType(type, 'data') &&\n checker.getPropertyOfType(type, 'status') &&\n checker.getPropertyOfType(type, 'format'),\n );\n}\n\n/**\n * Read a `c.json(data, status?)` / `c.text(data, status?)` call directly. Reading the\n * status from the argument (default 200) sidesteps contextual typing: a `: Handle`\n * annotation otherwise widens an omitted status from its `= 200` default down to\n * `StatusCode`. Data still comes from the argument's own type.\n */\nfunction readFromCall(checker: ts.TypeChecker, expression: ts.Expression): ResponseHit | undefined {\n if (!ts.isCallExpression(expression) || !ts.isPropertyAccessExpression(expression.expression)) {\n return undefined;\n }\n const method = expression.expression.name.text;\n if (method !== 'json' && method !== 'text') {\n return undefined;\n }\n if (!isTypedResponse(checker, checker.getTypeAtLocation(expression))) {\n return undefined;\n }\n\n const [dataArg, statusArg] = expression.arguments;\n if (!dataArg) {\n return undefined;\n }\n\n let status: number | 'default' = 200;\n if (statusArg) {\n const statusType = checker.getTypeAtLocation(statusArg);\n status = statusType.isNumberLiteral() ? statusType.value : 'default';\n }\n\n return { status, format: method === 'text' ? 'text' : 'json', data: checker.getTypeAtLocation(dataArg) };\n}\n\n/** Fallback for non-`c.json` returns: read `{ data, status, format }` off the type itself. */\nfunction readFromType(checker: ts.TypeChecker, type: ts.Type, location: ts.Node): ResponseHit | undefined {\n const dataType = propertyType(checker, type, 'data', location);\n const statusType = propertyType(checker, type, 'status', location);\n const formatType = propertyType(checker, type, 'format', location);\n if (!dataType || !statusType || !formatType) {\n return undefined;\n }\n\n const status = statusType.isNumberLiteral() ? statusType.value : 'default';\n const format = formatType.isStringLiteral() && formatType.value === 'text' ? 'text' : 'json';\n return { status, format, data: dataType };\n}\n\nfunction constituents(type: ts.Type): ts.Type[] {\n return type.isUnion() ? type.types : [type];\n}\n\n/**\n * Extract per-status response schemas for a route's `handle` export by typing each of\n * its return expressions and unwrapping giri's `TypedResponse<data, status, format>`.\n */\nexport function extractRouteResponses(program: ts.Program, file: string): RouteResponses {\n const result: RouteResponses = { responses: [], opaque: false, warnings: [], $defs: {} };\n const source = program.getSourceFile(file);\n if (!source) {\n return result;\n }\n\n const checker = program.getTypeChecker();\n const fn = findHandleFunction(source);\n if (!fn) {\n return result;\n }\n\n const ctx = createWalkContext(checker, fn);\n const byStatus = new Map<number | 'default', { format: 'json' | 'text'; schemas: JSONSchema[] }>();\n\n const record = (hit: ResponseHit): void => {\n const schema = walkType(hit.data, ctx);\n const bucket = byStatus.get(hit.status) ?? { format: hit.format, schemas: [] };\n bucket.schemas.push(schema);\n byStatus.set(hit.status, bucket);\n };\n\n for (const expression of collectReturnExpressions(fn)) {\n const fromCall = readFromCall(checker, expression);\n if (fromCall) {\n record(fromCall);\n continue;\n }\n\n let matched = false;\n for (const member of constituents(checker.getTypeAtLocation(expression))) {\n const hit = readFromType(checker, member, expression);\n if (hit) {\n record(hit);\n matched = true;\n }\n }\n if (!matched) {\n result.opaque = true;\n }\n }\n\n for (const [status, { format, schemas }] of byStatus) {\n const schema = schemas.length === 1 ? schemas[0] : { anyOf: schemas };\n result.responses.push({ status, format, schema });\n }\n result.responses.sort((a, b) => Number(a.status) - Number(b.status));\n result.warnings = ctx.warnings;\n result.$defs = ctx.defs;\n return result;\n}\n","export { createSchemaProgram } from './program';\nexport { extractRouteResponses } from './responses';\nexport type { ResponseSchema, RouteResponses } from './responses';\nexport { walkType, createWalkContext } from './json-schema';\nexport type { JSONSchema, WalkContext } from './json-schema';\n","import type { GiriConfig } from './types';\n\nexport {\n composeMiddleware,\n createContext,\n createTypedResponse,\n defineMiddleware,\n isTypedResponse,\n stack,\n toResponse,\n typedResponseToResponse,\n} from './context';\nexport {\n defineBodySchema,\n defineInputSchema,\n isGiriBodySchema,\n isGiriInputSchema,\n prepareRequestInput,\n} from './validation';\nexport { buildGiriApp, resolveGiriPaths } from './app';\nexport { scanRoutes } from './routes';\nexport { syncProject } from './generator';\nexport { loadLifecycle, runInit } from './lifecycle';\nexport type { GiriLifecycle } from './lifecycle';\nexport type {\n BodyContentType,\n Context,\n GiriAdapter,\n GiriBodySchema,\n GiriConfig,\n GiriFetchHandler,\n GiriInputSchema,\n GiriPaths,\n GiriRequest,\n GiriRouteRegistration,\n GiriServeOptions,\n GiriServer,\n GiriServerInfo,\n Handle,\n HandlerResponse,\n HttpMethod,\n Infer,\n InferStackVars,\n InputValidationResult,\n JsonSchema,\n MergeStack,\n Middleware,\n MiddlewareVarsOf,\n MiddlewareOpenApi,\n MiddlewareOptions,\n Next,\n RouteInput,\n RouteInputOf,\n RouteOpenApi,\n RouteOpenApiConfig,\n SecurityRequirement,\n Services,\n StatusCode,\n TypedResponse,\n ValidatedInput,\n ValidBody,\n ValidQuery,\n VarsOf,\n} from './types';\n\nexport function defineConfig<App>(config: GiriConfig<App>): GiriConfig<App> {\n return config;\n}\n","export type HttpMethod = 'GET' | 'POST' | 'PUT' | 'PATCH' | 'DELETE' | 'OPTIONS' | 'HEAD';\n\nexport type StatusCode = number;\n\nexport type ResponseFormat = 'json' | 'text' | 'html';\n\nexport const typedResponseBrand: unique symbol = Symbol.for('giri.typed-response') as never;\nexport const nativeContextBrand: unique symbol = Symbol.for('giri.native-context') as never;\n\nexport interface TypedResponse<\n T,\n S extends StatusCode = StatusCode,\n F extends ResponseFormat = ResponseFormat,\n> {\n readonly [typedResponseBrand]: {\n data: T;\n status: S;\n format: F;\n };\n readonly data: T;\n readonly status: S;\n readonly format: F;\n readonly headers?: HeadersInit;\n}\n\nexport type HandlerResponse = Response | TypedResponse<unknown, StatusCode, ResponseFormat>;\n\nexport interface ValidatedInput {\n /**\n * The validated request body. For a single declared content-type it's that schema's\n * output; for several it's a discriminated union `{ type; data }` (see `ValidBody`).\n */\n body?: unknown;\n query?: unknown;\n}\n\nexport interface GiriRequest<Input extends ValidatedInput = ValidatedInput> {\n raw: Request;\n url: URL;\n method: string;\n header(name: string): string | null;\n json<T = unknown>(): Promise<T>;\n text(): Promise<string>;\n arrayBuffer(): Promise<ArrayBuffer>;\n formData(): Promise<FormData>;\n valid<K extends keyof Input & ('body' | 'query')>(key: K): Input[K];\n}\n\ndeclare global {\n /**\n * Global registration surface for app-wide types. `giri sync` augments\n * `Giri.Register[\"app\"]` from `src/main.ts` `init()` return type so `c.app` is\n * typed without per-route generics (the registration pattern).\n */\n namespace Giri {\n interface Register {}\n }\n}\n\n/**\n * The app-wide services container, the type of `c.app`. `giri sync` infers it from\n * `src/main.ts`'s `init()` return type (via the global `Giri.Register` augmentation);\n * until then it falls back to an open record. Leave `init` unannotated (its return is\n * the source of truth) and annotate `teardown`'s parameter with this:\n *\n * ```ts\n * export const init = () => ({ db }); // inferred\n * export const teardown = (services: Services) => services.db.close();\n * ```\n */\nexport type Services = Giri.Register extends { app: infer A }\n ? A\n : Record<string, unknown>;\n\nexport interface Context<\n Params extends Record<string, string> = Record<string, string>,\n Input extends ValidatedInput = ValidatedInput,\n Vars extends Record<string, unknown> = {},\n> {\n params: Params;\n /** App-wide services from `src/main.ts`'s `init()`, seeded into every request. */\n app: Services;\n req: GiriRequest<Input>;\n // Context vars (`c.set`/`c.get`). Keys declared by middleware (`Vars`) are typed;\n // any other key stays open (`unknown`) so untracked keys still work.\n set<K extends keyof Vars & string>(key: K, value: Vars[K]): void;\n set<K extends string>(key: K, value: unknown): void;\n get<K extends keyof Vars & string>(key: K): Vars[K];\n get<V = unknown>(key: string): V;\n json<T, S extends StatusCode = 200>(\n data: T,\n status?: S,\n headers?: HeadersInit,\n ): TypedResponse<T, S, 'json'>;\n text<S extends StatusCode = 200>(\n text: string,\n status?: S,\n headers?: HeadersInit,\n ): TypedResponse<string, S, 'text'>;\n /** An HTML response (`text/html`). Like `text`, the body is a string. */\n html<S extends StatusCode = 200>(\n html: string,\n status?: S,\n headers?: HeadersInit,\n ): TypedResponse<string, S, 'html'>;\n /** A raw-body response - string, stream, buffer, FormData, … (not documented in OpenAPI). */\n body(data: BodyInit | null, status?: StatusCode, headers?: HeadersInit): Response;\n /** Alias of `body`, mirroring Hono's `c.newResponse`. */\n newResponse(data: BodyInit | null, status?: StatusCode, headers?: HeadersInit): Response;\n /** A redirect (defaults to 302) with the `Location` header set. */\n redirect(location: string, status?: StatusCode): Response;\n /** A 404 Not Found response. */\n notFound(): Response;\n /**\n * Set a response header applied to whatever this handler returns. Pass `{ append: true }` to add\n * another value (e.g. `Set-Cookie`); omit `value` to delete. Mirrors Hono's `c.header`.\n */\n header(name: string, value?: string, options?: { append?: boolean }): void;\n /** Default status for `body`/`redirect`, and for `json`/`text`/`html` when no status arg is given. */\n status(code: StatusCode): void;\n}\n\nexport type Handle<\n Params extends Record<string, string> = Record<string, string>,\n Input extends ValidatedInput = ValidatedInput,\n Vars extends Record<string, unknown> = {},\n> = (c: Context<Params, Input, Vars>) => HandlerResponse | Promise<HandlerResponse>;\n\nexport type Next = () => Promise<HandlerResponse | void>;\n\n/** An OpenAPI security requirement, e.g. `{ bearerAuth: [] }`. */\nexport type SecurityRequirement = Record<string, string[]>;\n\nexport interface MiddlewareOpenApi {\n /** Security requirements this middleware enforces */\n security?: SecurityRequirement[];\n /** Optional scheme definitions, merged into `components.securitySchemes` so the doc is self-contained. */\n securitySchemes?: Record<string, unknown>;\n [key: string]: unknown;\n}\n\nexport interface MiddlewareOptions {\n openapi?: MiddlewareOpenApi;\n}\n\nexport interface Middleware<\n Params extends Record<string, string> = Record<string, string>,\n Input extends ValidatedInput = ValidatedInput,\n Vars extends Record<string, unknown> = {},\n> {\n (c: Context<Params, Input, Vars>, next: Next): HandlerResponse | void | Promise<HandlerResponse | void>;\n openapi?: MiddlewareOpenApi;\n}\n\n/** The context vars a middleware injects (its `Vars` type parameter). */\nexport type VarsOf<M> = M extends Middleware<Record<string, string>, ValidatedInput, infer V>\n ? V\n : {};\n\n/** Intersect the injected vars of a tuple of middleware (built with `stack(...)`). */\nexport type MergeStack<T> = T extends readonly [infer Head, ...infer Rest]\n ? VarsOf<Head> & MergeStack<Rest>\n : {};\n\n/**\n * Merge the injected vars of a `middleware` export. A `stack(...)` tuple is merged element-wise;\n * a single bare middleware (`export const middleware = fromHono(...)`) contributes its own vars; a\n * plain `Middleware[]` (not a `stack(...)` tuple) contributes nothing - its element types are lost.\n */\nexport type InferStackVars<T> = T extends readonly [unknown, ...unknown[]]\n ? MergeStack<T>\n : T extends Middleware<Record<string, string>, ValidatedInput, any>\n ? VarsOf<T>\n : {};\n\n/**\n * The vars injected by a module own `middleware` export (a `stack(...)`). Used by the\n * generated per-method handle so a verb file's own `export const middleware` types\n * `c.get`/`c.set`, on top of the folder's `+shared.ts` chain.\n */\nexport type MiddlewareVarsOf<M> = M extends { middleware: infer Stack }\n ? InferStackVars<Stack>\n : {};\n\n/** A JSON Schema object (JSON Schema 2020-12 / OpenAPI 3.1 dialect). */\nexport type JsonSchema = Record<string, unknown>;\n\nexport const inputSchemaBrand: unique symbol = Symbol.for('giri.input-schema') as never;\n\nexport type InputValidationResult<Output = unknown> =\n | { ok: true; value: Output }\n | { ok: false; issues: unknown };\n\n/**\n * A input schema every wrapper form (`body`/`query`) export takes. A vendor\n * adapter (`@boon4681/giri/validators/zod`, `@boon4681/giri/validators/valibot`, …) returns one; build a\n * custom one with `defineInputSchema`. giri core depends only on this interface, never\n * on a validator library. `validate` is the runtime check; `toJsonSchema` feeds OpenAPI.\n */\nexport interface GiriInputSchema<Output = unknown> {\n readonly [inputSchemaBrand]: true;\n validate(value: unknown): InputValidationResult<Output> | Promise<InputValidationResult<Output>>;\n toJsonSchema(): JsonSchema;\n}\n\n/** Extract the validated output type of a giri input schema: `Infer<typeof body>`. */\nexport type Infer<T> = T extends GiriInputSchema<infer Output> ? Output : never;\n\nexport type BodyContentType = 'json' | 'form' | 'urlencoded' | 'text';\n\nexport const bodySchemaBrand: unique symbol = Symbol.for('giri.body-schema') as never;\n\n/**\n * A request body declared as a set of accepted content-types wrapped form `body`\n * takes (`zod.body({ json, form })`). One key means that encoding only; several mean the\n * endpoint accepts any of them, dispatched at runtime on the request `Content-Type`.\n * Each entry is a plain `GiriInputSchema`, so `validate`/`toJsonSchema` work per content-type.\n */\nexport interface GiriBodySchema<\n Outputs extends Partial<Record<BodyContentType, unknown>> = Partial<Record<BodyContentType, unknown>>,\n> {\n readonly [bodySchemaBrand]: true;\n readonly contents: { [K in keyof Outputs & BodyContentType]: GiriInputSchema<Outputs[K]> };\n}\n\n/** True when `T` is a union of more than one member. */\ntype IsUnion<T, U = T> = T extends unknown ? ([U] extends [T] ? false : true) : never;\n\n/**\n * The validated body a handler receives. A single declared content-type yields that\n * schema's output directly; several yield a discriminated union keyed by content-type.\n */\nexport type ValidBody<B> = B extends GiriBodySchema<infer Outputs>\n ? IsUnion<keyof Outputs> extends true\n ? { [K in keyof Outputs]: { type: K; data: Outputs[K] } }[keyof Outputs]\n : Outputs[keyof Outputs]\n : never;\n\n/** The validated query a handler receives. */\nexport type ValidQuery<Q> = Q extends GiriInputSchema<infer Output> ? Output : never;\n\n/** Drop keys whose value resolved to `never` (an input the route didn't declare). */\ntype PruneNever<T> = { [K in keyof T as [T[K]] extends [never] ? never : K]: T[K] };\n\n/**\n * Derive a route's `ValidatedInput` from a module's `body`/`query` exports. The generated\n * per-method `$types` handle (`POST`, `GET`, …) uses this so handlers infer `c.req.valid`\n * with no manual generic.\n */\nexport type RouteInputOf<M> = PruneNever<{\n body: M extends { body: infer B } ? ValidBody<B> : never;\n query: M extends { query: infer Q } ? ValidQuery<Q> : never;\n}>;\n\nexport interface RouteInput {\n body?: GiriBodySchema;\n query?: GiriInputSchema;\n}\n\nexport interface RouteOpenApi {\n /** Omit this route from the generated `openapi.json` (it still serves normally). */\n hidden?: boolean;\n // Room to grow: summary, description, tags, deprecated, operationId, …\n}\n\nexport type RouteOpenApiConfig = RouteOpenApi | boolean;\n\nexport interface GiriRouteRegistration {\n method: HttpMethod;\n path: string;\n handle: Handle;\n middleware: Middleware[];\n input?: RouteInput;\n /** App-wide services to seed onto `c.app` (same instance for every route). */\n services?: Services;\n}\n\nexport type GiriFetchHandler = (req: Request) => Response | Promise<Response>;\n\nexport interface GiriServeOptions {\n port: number;\n hostname?: string;\n}\n\nexport interface GiriServerInfo {\n address: string;\n port: number;\n}\n\nexport interface GiriServer {\n close(): void | Promise<void>;\n}\n\nexport interface GiriAdapter<App> {\n name?: string;\n createApp(): App;\n register(app: App, route: GiriRouteRegistration): void;\n fetch(app: App, req: Request): Promise<Response>;\n /**\n * Bind the configured backend's runtime to a port and start serving.\n * giri core stays runtime-agnostic: it hands the adapter a request handler\n * (so hot-reload keeps working) and the adapter owns the actual server.\n */\n serve(\n handler: GiriFetchHandler,\n options: GiriServeOptions,\n onListen?: (info: GiriServerInfo) => void,\n ): GiriServer;\n}\n\nexport interface GiriConfig<App = unknown> {\n adapter: GiriAdapter<App>;\n alias?: Record<string, string | string[]>;\n outDir?: string;\n server?: {\n port?: number;\n hostname?: string;\n };\n errorSchema?: unknown;\n}\n\nexport interface GiriPaths {\n cwd: string;\n routesDir: string;\n outDir: string;\n}\n","import {\n type Services,\n type Context,\n type HandlerResponse,\n type Middleware,\n type MiddlewareOptions,\n type ResponseFormat,\n type StatusCode,\n type TypedResponse,\n type ValidatedInput,\n nativeContextBrand,\n typedResponseBrand,\n} from './types';\n\nconst BODYLESS_STATUS = new Set([101, 103, 204, 205, 304]);\n\n/** Imperative response state set via `c.header()` / `c.status()`, merged in `toResponse`. */\ninterface PendingResponse {\n headers: Headers;\n status?: StatusCode;\n}\n\nconst pendingResponseBrand: unique symbol = Symbol('giri.pending-response');\n\nfunction getPending(context: Context): PendingResponse | undefined {\n return (context as unknown as Record<symbol, PendingResponse | undefined>)[pendingResponseBrand];\n}\n\nexport interface CreateContextOptions<\n Params extends Record<string, string> = Record<string, string>,\n Input extends ValidatedInput = ValidatedInput,\n> {\n request: Request;\n params?: Params;\n validated?: Input;\n app?: Services;\n /** The adapter's native per-request context, stashed for backend-specific bridges. */\n native?: unknown;\n}\n\nexport function createTypedResponse<\n T,\n S extends StatusCode,\n F extends ResponseFormat,\n>(data: T, status: S, format: F, headers?: HeadersInit): TypedResponse<T, S, F> {\n return {\n [typedResponseBrand]: { data, status, format },\n data,\n status,\n format,\n headers,\n };\n}\n\nexport function isTypedResponse(value: unknown): value is TypedResponse<unknown> {\n return Boolean(value && typeof value === 'object' && typedResponseBrand in value);\n}\n\nexport function createContext<\n Params extends Record<string, string> = Record<string, string>,\n Input extends ValidatedInput = ValidatedInput,\n>(options: CreateContextOptions<Params, Input>): Context<Params, Input> {\n const url = new URL(options.request.url);\n const store = new Map<string, unknown>();\n const validated = options.validated ?? ({} as Input);\n\n // Headers/status set imperatively via c.header()/c.status(); merged into the final response.\n const pending: PendingResponse = { headers: new Headers() };\n const defaultStatus = (): StatusCode => pending.status ?? 200;\n\n const context: Context<Params, Input> = {\n params: options.params ?? ({} as Params),\n app: options.app ?? ({} as Services),\n req: {\n raw: options.request,\n url,\n method: options.request.method,\n header: (name) => options.request.headers.get(name),\n json: <T = unknown>() => options.request.json() as Promise<T>,\n text: () => options.request.text(),\n arrayBuffer: () => options.request.arrayBuffer(),\n formData: () => options.request.formData(),\n valid: (key) => {\n if (!(key in validated)) {\n throw new Error(`No validated ${String(key)} data is available for this route.`);\n }\n return validated[key];\n },\n },\n set: (key: string, value: unknown) => {\n store.set(key, value);\n },\n get: (key: string) => store.get(key) as never,\n json: (data, status, headers) =>\n createTypedResponse(data, (status ?? defaultStatus()) as never, 'json', headers),\n text: (text, status, headers) =>\n createTypedResponse(text, (status ?? defaultStatus()) as never, 'text', headers),\n html: (html, status, headers) =>\n createTypedResponse(html, (status ?? defaultStatus()) as never, 'html', headers),\n body: (data, status, headers) =>\n new Response(data, { status: status ?? defaultStatus(), headers }),\n newResponse: (data, status, headers) =>\n new Response(data, { status: status ?? defaultStatus(), headers }),\n redirect: (location, status) =>\n new Response(null, { status: status ?? 302, headers: { Location: location } }),\n notFound: () => new Response('404 Not Found', { status: 404 }),\n header: (name, value, options) => {\n if (value === undefined) {\n pending.headers.delete(name);\n } else if (options?.append) {\n pending.headers.append(name, value);\n } else {\n pending.headers.set(name, value);\n }\n },\n status: (code) => {\n pending.status = code;\n },\n };\n\n (context as unknown as Record<symbol, unknown>)[nativeContextBrand] = options.native;\n (context as unknown as Record<symbol, unknown>)[pendingResponseBrand] = pending;\n\n return context;\n}\n\nexport function typedResponseToResponse(response: TypedResponse<unknown>): Response {\n const headers = new Headers(response.headers);\n\n if (response.format === 'json' && !headers.has('content-type')) {\n headers.set('content-type', 'application/json; charset=utf-8');\n }\n\n if (response.format === 'text' && !headers.has('content-type')) {\n headers.set('content-type', 'text/plain; charset=utf-8');\n }\n\n if (response.format === 'html' && !headers.has('content-type')) {\n headers.set('content-type', 'text/html; charset=utf-8');\n }\n\n const body = BODYLESS_STATUS.has(response.status)\n ? null\n : response.format === 'json'\n ? JSON.stringify(response.data)\n : String(response.data);\n\n return new Response(body, {\n status: response.status,\n headers,\n });\n}\n\n/**\n * Convert a handler's return value to a real `Response`, then merge any headers set imperatively via\n * `c.header()` (the response's own headers win; pending ones fill the gaps). Pass the `context` so\n * those imperative headers are applied; without it the response is returned unchanged.\n */\nexport function toResponse(response: HandlerResponse, context?: Context): Response {\n const base = isTypedResponse(response) ? typedResponseToResponse(response) : response;\n const pending = context ? getPending(context) : undefined;\n if (!pending) {\n return base;\n }\n\n let hasPending = false;\n pending.headers.forEach(() => {\n hasPending = true;\n });\n if (!hasPending) {\n return base;\n }\n\n const headers = new Headers(base.headers);\n pending.headers.forEach((value, key) => {\n if (!headers.has(key)) {\n headers.set(key, value);\n }\n });\n return new Response(base.body, { status: base.status, statusText: base.statusText, headers });\n}\n\nexport async function composeMiddleware(\n middleware: Middleware[],\n handle: (c: Context) => HandlerResponse | Promise<HandlerResponse>,\n context: Context,\n): Promise<HandlerResponse> {\n let index = -1;\n let result: HandlerResponse | undefined;\n\n const dispatch = async (i: number): Promise<HandlerResponse | void> => {\n if (i <= index) {\n throw new Error('next() called multiple times in giri middleware.');\n }\n index = i;\n\n if (i === middleware.length) {\n result = await handle(context);\n return result;\n }\n\n const returned = await middleware[i](context, () => dispatch(i + 1));\n if (returned !== undefined) {\n result = returned;\n return returned;\n }\n return result;\n };\n\n await dispatch(0);\n\n if (result === undefined) {\n throw new Error('Route completed without returning a response.');\n }\n\n return result;\n}\n\ntype AnyMiddleware<Vars extends Record<string, unknown>> = Middleware<\n Record<string, string>,\n ValidatedInput,\n Vars\n>;\n\nexport function defineMiddleware<Vars extends Record<string, unknown> = {}>(\n middleware: AnyMiddleware<Vars>,\n): AnyMiddleware<Vars>;\nexport function defineMiddleware<Vars extends Record<string, unknown> = {}>(\n options: MiddlewareOptions,\n middleware: AnyMiddleware<Vars>,\n): AnyMiddleware<Vars>;\nexport function defineMiddleware(\n optionsOrMiddleware: MiddlewareOptions | Middleware,\n maybeMiddleware?: Middleware,\n): Middleware {\n if (typeof optionsOrMiddleware === 'function') {\n return optionsOrMiddleware;\n }\n\n if (!maybeMiddleware) {\n throw new Error('defineMiddleware(options, middleware) requires a middleware function.');\n }\n\n maybeMiddleware.openapi = optionsOrMiddleware.openapi;\n return maybeMiddleware;\n}\n\n/**\n * Group middleware into an ordered stack, preserving each element's type as a tuple so\n * the injected context vars (`defineMiddleware<Vars>` / `Middleware<…, Vars>`) propagate\n * to downstream handlers. Use it for `+shared.ts` and verb `middleware` exports:\n * `export const middleware = stack(auth, requireAdmin)`.\n */\n// `Vars` is contravariant (it sits in the `c` parameter), so the constraint must leave it\n// open (`any`) otherwise a middleware that injects vars isn't assignable to the element type.\nexport function stack<T extends Middleware<Record<string, string>, ValidatedInput, any>[]>(...middleware: T): T {\n return middleware;\n}\n","import {\n type BodyContentType,\n type GiriBodySchema,\n type GiriInputSchema,\n type InputValidationResult,\n type RouteInput,\n type TypedResponse,\n type ValidatedInput,\n bodySchemaBrand,\n inputSchemaBrand,\n} from './types';\nimport { createTypedResponse } from './context';\n\ninterface PreparedInput {\n ok: true;\n validated: ValidatedInput;\n}\n\ninterface FailedInput {\n ok: false;\n response: TypedResponse<{ message: string; issues: unknown }, 400 | 415, 'json'>;\n}\n\nexport type PreparedRequestInput = PreparedInput | FailedInput;\n\n/**\n * Build a giri input schema from a `validate` + `toJsonSchema` pair. Vendor adapters use\n * this; you can call it directly to make a custom validator. The brand is a global symbol,\n * so a hand-rolled `{ [Symbol.for(\"giri.input-schema\")]: true, validate, toJsonSchema }` works too.\n */\nexport function defineInputSchema<Output>(\n schema: Omit<GiriInputSchema<Output>, typeof inputSchemaBrand>,\n): GiriInputSchema<Output> {\n return { [inputSchemaBrand]: true, ...schema };\n}\n\nexport function isGiriInputSchema(value: unknown): value is GiriInputSchema {\n return Boolean(\n value &&\n typeof value === 'object' &&\n (value as Record<symbol, unknown>)[inputSchemaBrand] === true,\n );\n}\n\n/**\n * Build a giri body schema from per-content-type input schemas. Validator adapters use this `zod.body({ json, form })`\n */\nexport function defineBodySchema<Outputs extends Partial<Record<BodyContentType, unknown>>>(\n contents: GiriBodySchema<Outputs>['contents'],\n): GiriBodySchema<Outputs> {\n return { [bodySchemaBrand]: true, contents };\n}\n\nexport function isGiriBodySchema(value: unknown): value is GiriBodySchema {\n return Boolean(\n value &&\n typeof value === 'object' &&\n (value as Record<symbol, unknown>)[bodySchemaBrand] === true,\n );\n}\n\nconst MIME_TO_CONTENT_TYPE: Record<string, BodyContentType> = {\n 'application/json': 'json',\n 'multipart/form-data': 'form',\n 'application/x-www-form-urlencoded': 'urlencoded',\n 'text/plain': 'text',\n};\n\nfunction contentTypeFromHeader(header: string | null): BodyContentType | undefined {\n if (!header) {\n return undefined;\n }\n const mime = header.split(';', 1)[0].trim().toLowerCase();\n return MIME_TO_CONTENT_TYPE[mime];\n}\n\n/** Flatten a `FormData` into a plain object, collapsing repeated fields into arrays. */\nfunction formDataObject(form: FormData): Record<string, unknown> {\n const result: Record<string, unknown> = {};\n form.forEach((value, key) => {\n const current = result[key];\n if (current === undefined) {\n result[key] = value;\n } else if (Array.isArray(current)) {\n current.push(value);\n } else {\n result[key] = [current, value];\n }\n });\n return result;\n}\n\nasync function readRawBody(request: Request, contentType: BodyContentType): Promise<unknown> {\n const cloned = request.clone();\n if (contentType === 'json') {\n return cloned.json();\n }\n if (contentType === 'text') {\n return cloned.text();\n }\n return formDataObject(await cloned.formData());\n}\n\nfunction queryObject(url: URL): Record<string, string | string[]> {\n const result: Record<string, string | string[]> = {};\n for (const [key, value] of url.searchParams) {\n const current = result[key];\n if (current === undefined) {\n result[key] = value;\n } else if (Array.isArray(current)) {\n current.push(value);\n } else {\n result[key] = [current, value];\n }\n }\n return result;\n}\n\nasync function runValidation(\n schema: GiriInputSchema,\n value: unknown,\n label: string,\n): Promise<InputValidationResult> {\n if (!isGiriInputSchema(schema)) {\n throw new Error(\n `giri: ${label} schema must be wrapped with a validator, e.g. \\`export const ${label} = zod(...)\\` from @boon4681/giri/validators/zod.`,\n );\n }\n return schema.validate(value);\n}\n\nexport async function prepareRequestInput(request: Request, input?: RouteInput): Promise<PreparedRequestInput> {\n const validated: ValidatedInput = {};\n\n if (input?.query) {\n const query = queryObject(new URL(request.url));\n const result = await runValidation(input.query, query, 'query');\n if (!result.ok) {\n return {\n ok: false,\n response: createTypedResponse(\n { message: 'Invalid query parameters.', issues: result.issues },\n 400,\n 'json',\n ),\n };\n }\n validated.query = result.value;\n }\n\n if (input?.body) {\n const contents = input.body.contents as Record<BodyContentType, GiriInputSchema>;\n const declared = Object.keys(contents) as BodyContentType[];\n const requested = contentTypeFromHeader(request.headers.get('content-type'));\n // Pick the schema matching the request's content-type; fall back to JSON when the\n // header is missing/unrecognized but JSON is on offer (so header-less posts still work).\n const chosen: BodyContentType | undefined =\n requested && contents[requested] ? requested : contents.json ? 'json' : undefined;\n\n if (!chosen) {\n return {\n ok: false,\n response: createTypedResponse(\n { message: 'Unsupported media type.', issues: { accepted: declared } },\n 415,\n 'json',\n ),\n };\n }\n\n let rawBody: unknown;\n try {\n rawBody = await readRawBody(request, chosen);\n } catch (error) {\n return {\n ok: false,\n response: createTypedResponse(\n { message: 'Invalid request body.', issues: error },\n 400,\n 'json',\n ),\n };\n }\n\n const result = await runValidation(contents[chosen], rawBody, 'body');\n if (!result.ok) {\n return {\n ok: false,\n response: createTypedResponse(\n { message: 'Invalid request body.', issues: result.issues },\n 400,\n 'json',\n ),\n };\n }\n\n validated.body = declared.length > 1 ? { type: chosen, data: result.value } : result.value;\n }\n\n return { ok: true, validated };\n}\n","import Module from 'node:module';\nimport { isAbsolute, join, resolve } from 'node:path';\nimport { safeRegister } from './loader/loader';\nimport { scanRoutes, type ScannedRoute } from './routes';\nimport type { GiriBodySchema, GiriConfig, GiriInputSchema, GiriPaths, Handle, Middleware, RouteInput, Services } from './types';\nimport { isGiriBodySchema, isGiriInputSchema } from './validation';\n\nexport interface BuildGiriAppOptions {\n cwd?: string;\n services?: Services;\n}\n\nexport interface BuiltGiriApp<App> {\n app: App;\n routes: ScannedRoute[];\n paths: GiriPaths;\n}\n\ninterface RouteModule {\n handle?: Handle;\n middleware?: Middleware | Middleware[];\n body?: unknown;\n query?: unknown;\n config?: {\n skipInherited?: boolean;\n };\n}\n\nfunction loadModule(file: string): unknown {\n const resolved = require.resolve(file);\n delete require.cache[resolved];\n return require(resolved);\n}\n\nfunction interopDefault(value: unknown): unknown {\n if (value && typeof value === 'object' && 'default' in value) {\n return (value as { default: unknown }).default;\n }\n return value;\n}\n\nfunction normalizeMiddleware(value: unknown, file: string): Middleware[] {\n const exported = interopDefault(value);\n if (exported === undefined) {\n return [];\n }\n if (typeof exported === 'function') {\n return [exported as Middleware];\n }\n if (Array.isArray(exported)) {\n for (const middleware of exported) {\n if (typeof middleware !== 'function') {\n throw new Error(`Middleware export in ${file} must contain only functions.`);\n }\n }\n return exported as Middleware[];\n }\n throw new Error(`Middleware export in ${file} must be a function or an array of functions.`);\n}\n\nfunction assertBodySchema(value: unknown, file: string): asserts value is GiriBodySchema {\n if (!isGiriBodySchema(value)) {\n throw new Error(\n `${file}: \"body\" must be wrapped with a validator, e.g. \\`export const body = zod.body({ json: ... })\\` from @boon4681/giri/validators/zod.`,\n );\n }\n}\n\nfunction assertQuerySchema(value: unknown, file: string): asserts value is GiriInputSchema {\n if (!isGiriInputSchema(value)) {\n throw new Error(\n `${file}: \"query\" must be wrapped with a validator, e.g. \\`export const query = zod.query(...)\\` from @boon4681/giri/validators/zod.`,\n );\n }\n}\n\nfunction routeInput(routeModule: RouteModule, file: string): RouteInput | undefined {\n const input: RouteInput = {};\n if (routeModule.body !== undefined) {\n assertBodySchema(routeModule.body, file);\n input.body = routeModule.body;\n }\n if (routeModule.query !== undefined) {\n assertQuerySchema(routeModule.query, file);\n input.query = routeModule.query;\n }\n return input.body || input.query ? input : undefined;\n}\n\nfunction aliasValues(value: string | string[]): string[] {\n return Array.isArray(value) ? value : [value];\n}\n\nfunction resolveAliasTarget(cwd: string, target: string, capture = ''): string {\n const replaced = target.includes('*') ? target.replaceAll('*', capture) : target;\n return isAbsolute(replaced) ? replaced : resolve(cwd, replaced);\n}\n\nfunction matchAlias(request: string, key: string): string | undefined {\n if (key.includes('*')) {\n const [prefix, suffix = ''] = key.split('*');\n if (request.startsWith(prefix) && request.endsWith(suffix)) {\n return request.slice(prefix.length, request.length - suffix.length);\n }\n return undefined;\n }\n\n if (request === key) {\n return '';\n }\n\n const prefix = `${key}/`;\n if (request.startsWith(prefix)) {\n return request.slice(prefix.length);\n }\n\n return undefined;\n}\n\nfunction resolveAliasRequest(\n request: string,\n alias: GiriConfig['alias'],\n cwd: string,\n): string | undefined {\n for (const [key, value] of Object.entries(alias ?? {})) {\n const capture = matchAlias(request, key);\n if (capture === undefined) {\n continue;\n }\n\n const [target] = aliasValues(value);\n if (!target) {\n continue;\n }\n\n return resolveAliasTarget(cwd, target, capture);\n }\n\n return undefined;\n}\n\nexport function registerAliasResolver(alias: GiriConfig['alias'], cwd: string): () => void {\n if (!alias || Object.keys(alias).length === 0) {\n return () => { };\n }\n\n const moduleWithResolver = Module as typeof Module & {\n _resolveFilename: (request: string, parent: unknown, isMain: boolean, options: unknown) => string;\n };\n const originalResolveFilename = moduleWithResolver._resolveFilename;\n\n moduleWithResolver._resolveFilename = function resolveWithGiriAlias(\n request,\n parent,\n isMain,\n options,\n ) {\n return originalResolveFilename.call(\n this,\n resolveAliasRequest(request, alias, cwd) ?? request,\n parent,\n isMain,\n options,\n );\n };\n\n return () => {\n moduleWithResolver._resolveFilename = originalResolveFilename;\n };\n}\n\nconst GIRI_ALIAS_PREFIX = '$giri/';\nlet giriOutDir: string | undefined;\nlet giriResolverInstalled = false;\n\n/**\n * Install a process-lifetime resolver for the internal `$giri/*` alias\n */\nexport function ensureGiriAliasResolver(outDir: string): void {\n giriOutDir = outDir;\n if (giriResolverInstalled) {\n return;\n }\n giriResolverInstalled = true;\n\n const moduleWithResolver = Module as typeof Module & {\n _resolveFilename: (request: string, parent: unknown, isMain: boolean, options: unknown) => string;\n };\n const originalResolveFilename = moduleWithResolver._resolveFilename;\n\n moduleWithResolver._resolveFilename = function resolveWithGiriInternalAlias(\n request,\n parent,\n isMain,\n options,\n ) {\n const mapped =\n typeof request === 'string' && request.startsWith(GIRI_ALIAS_PREFIX) && giriOutDir\n ? join(giriOutDir, request.slice(GIRI_ALIAS_PREFIX.length))\n : request;\n return originalResolveFilename.call(this, mapped, parent, isMain, options);\n };\n}\n\nexport function resolveGiriPaths(config: Pick<GiriConfig, 'outDir'>, cwd = process.cwd()): GiriPaths {\n return {\n cwd: resolve(cwd),\n routesDir: resolve(cwd, 'src/routes'),\n outDir: resolve(cwd, config.outDir ?? '.giri'),\n };\n}\n\nexport async function buildGiriApp<App>(\n config: GiriConfig<App>,\n options: BuildGiriAppOptions = {},\n): Promise<BuiltGiriApp<App>> {\n const paths = resolveGiriPaths(config, options.cwd);\n const routes = await scanRoutes(paths.routesDir);\n const app = config.adapter.createApp();\n // Install the persistent `$giri` resolver BEFORE esbuild-register: it patches\n // `_resolveFilename` too, and its unregister() restores whatever it captured\n ensureGiriAliasResolver(paths.outDir);\n const { unregister } = await safeRegister();\n const unregisterAliasResolver = registerAliasResolver(config.alias, paths.cwd);\n\n try {\n for (const route of routes) {\n const routeModule = loadModule(route.file) as RouteModule;\n if (typeof routeModule.handle !== 'function') {\n throw new Error(`${route.file} must export a named handle function.`);\n }\n\n const folderMiddleware = routeModule.config?.skipInherited\n ? []\n : route.sharedFiles.flatMap((file) =>\n normalizeMiddleware((loadModule(file) as { middleware?: unknown }).middleware, file),\n );\n const verbMiddleware = normalizeMiddleware(routeModule.middleware, route.file);\n\n config.adapter.register(app, {\n method: route.method,\n path: route.path,\n handle: routeModule.handle,\n middleware: [...folderMiddleware, ...verbMiddleware],\n input: routeInput(routeModule, route.file),\n services: options.services,\n });\n }\n } finally {\n unregisterAliasResolver();\n unregister();\n }\n\n return { app, routes, paths };\n}\n","import { cancel, log, spinner } from '@clack/prompts';\nimport { existsSync } from 'node:fs';\nimport { join, resolve, sep } from 'node:path';\nimport { exit } from 'node:process';\nimport { configSchema } from '../config/schema';\nimport { Value } from \"@sinclair/typebox/value\"\nimport { Static } from '@sinclair/typebox';\n\nconst assertES5 = async (unregister: () => void) => {\n try {\n require('./_es5.ts');\n } catch (e: any) {\n if ('errors' in e && Array.isArray(e.errors) && e.errors.length > 0) {\n const es5Error = (e.errors as any[]).filter((it) => it.text?.includes(`(\"es5\") is not supported yet`)).length > 0;\n if (es5Error) {\n log.error(\n `Please change compilerOptions.target from 'es5' to 'es6' or above in your tsconfig.json`\n );\n exit(1);\n }\n }\n log.error(e);\n exit(1);\n }\n};\n\nexport const safeRegister = async () => {\n const { register } = await import('esbuild-register/dist/node');\n let res: { unregister: () => void };\n try {\n res = register({\n format: 'cjs',\n loader: 'ts',\n });\n } catch {\n // tsx fallback\n res = {\n unregister: () => { },\n };\n }\n\n // has to be outside try catch to be able to run with tsx\n await assertES5(res.unregister);\n return res;\n}\n\nexport const load = async () => {\n const defaultTsConfigExists = existsSync(resolve('giri.config.ts'));\n const defaultJsConfigExists = existsSync(resolve('giri.config.js'));\n const defaultConfigPath = defaultTsConfigExists ? 'giri.config.ts' : defaultJsConfigExists ? 'giri.config.js' : undefined\n if (!defaultConfigPath) {\n log.error(\"Config file not found.\")\n exit(1)\n }\n\n const path: string = resolve(defaultConfigPath);\n if (!existsSync(path)) {\n log.error(`${path} file does not exist`);\n exit(1)\n }\n\n const { unregister } = await safeRegister();\n const required = require(`${path}`);\n const content = required.default ?? required;\n unregister();\n\n // get response and then check by each dialect independently\n const res = Value.Check(configSchema, content);\n if (!res) {\n for (const error of [...Value.Errors(configSchema, content)]) {\n log.error(error.message)\n }\n exit(1)\n }\n return content as Static<typeof configSchema>\n}\n","import { Static, Type } from \"@sinclair/typebox\";\n\nexport const configSchema = Type.Object({\n adapter: Type.Any(),\n alias: Type.Optional(Type.Record(\n Type.String(),\n Type.Union([Type.String(), Type.Array(Type.String())]),\n )),\n outDir: Type.Optional(Type.String()),\n server: Type.Optional(Type.Object({\n port: Type.Optional(Type.Number()),\n hostname: Type.Optional(Type.String()),\n }, { additionalProperties: false })),\n errorSchema: Type.Optional(Type.Any()),\n}, { additionalProperties: false })","import { existsSync } from 'node:fs';\nimport { readdir } from 'node:fs/promises';\nimport { basename, dirname, join, relative, sep } from 'node:path';\nimport { glob } from 'tinyglobby';\nimport type { HttpMethod } from './types';\n\nconst METHOD_ORDER: HttpMethod[] = ['GET', 'POST', 'PUT', 'PATCH', 'DELETE', 'OPTIONS', 'HEAD'];\nconst METHOD_FROM_FILE = new Map<string, HttpMethod>(\n METHOD_ORDER.map((method) => [`+${method.toLowerCase()}`, method]),\n);\n\nexport interface RouteParam {\n name: string;\n catchAll: boolean;\n}\n\nexport interface ScannedRoute {\n method: HttpMethod;\n path: string;\n file: string;\n routeDir: string;\n routeSegments: string[];\n params: RouteParam[];\n /** The `+shared.ts` chain folder-cascading config. */\n sharedFiles: string[];\n}\n\nfunction normalizeSlashes(path: string): string {\n return path.split(sep).join('/');\n}\n\nfunction isRouteSourceFile(fileName: string): boolean {\n return /\\.(?:[cm]?[jt]s|[jt]sx)$/.test(fileName) && !fileName.endsWith('.d.ts');\n}\n\nfunction methodFromFile(fileName: string): HttpMethod | undefined {\n if (!isRouteSourceFile(fileName)) {\n return undefined;\n }\n const stem = fileName.replace(/\\.(?:[cm]?[jt]s|[jt]sx)$/, '').toLowerCase();\n return METHOD_FROM_FILE.get(stem);\n}\n\nfunction sharedFileIn(dir: string): string | undefined {\n for (const ext of ['ts', 'tsx', 'js', 'jsx', 'mjs', 'cjs', 'mts', 'cts']) {\n const file = join(dir, `+shared.${ext}`);\n if (existsSync(file)) {\n return file;\n }\n }\n return undefined;\n}\n\nfunction physicalRouteSegments(routesDir: string, routeDir: string): string[] {\n const rel = relative(routesDir, routeDir);\n if (!rel) {\n return [];\n }\n return normalizeSlashes(rel).split('/').filter(Boolean);\n}\n\nfunction urlSegment(segment: string): { value?: string; param?: RouteParam } {\n if (/^\\(.+\\)$/.test(segment)) {\n return {};\n }\n\n const catchAll = /^\\[\\.\\.\\.(.+)\\]$/.exec(segment);\n if (catchAll) {\n const name = catchAll[1];\n return {\n value: `:${name}{.*}`,\n param: { name, catchAll: true },\n };\n }\n\n const param = /^\\[(.+)\\]$/.exec(segment);\n if (param) {\n const name = param[1];\n return {\n value: `:${name}`,\n param: { name, catchAll: false },\n };\n }\n\n return { value: segment };\n}\n\nexport function pathFromSegments(segments: string[]): { path: string; params: RouteParam[] } {\n const pathSegments: string[] = [];\n const params: RouteParam[] = [];\n\n for (const segment of segments) {\n const converted = urlSegment(segment);\n if (converted.value) {\n pathSegments.push(converted.value);\n }\n if (converted.param) {\n params.push(converted.param);\n }\n }\n\n return {\n path: pathSegments.length > 0 ? `/${pathSegments.join('/')}` : '/',\n params,\n };\n}\n\n/**\n * Every directory under `routesDir` (including itself), so `$types` can be generated for a\n * folder the moment it's created\n */\nexport async function scanRouteFolders(routesDir: string): Promise<string[]> {\n if (!existsSync(routesDir)) {\n return [];\n }\n const folders = [routesDir];\n const walk = async (dir: string): Promise<void> => {\n for (const entry of await readdir(dir, { withFileTypes: true })) {\n if (entry.isDirectory() && entry.name !== 'node_modules') {\n const full = join(dir, entry.name);\n folders.push(full);\n await walk(full);\n }\n }\n };\n await walk(routesDir);\n return folders;\n}\n\n/** Folder-derived params for any directory under `routesDir` (used for middleware `$types`). */\nexport function routeParamsForDir(routesDir: string, dir: string): RouteParam[] {\n return pathFromSegments(physicalRouteSegments(routesDir, dir)).params;\n}\n\n/** The ordered `+shared.ts` chain that applies to a directory. */\nexport function sharedFilesForDir(routesDir: string, dir: string): string[] {\n const segments = physicalRouteSegments(routesDir, dir);\n const dirs = [routesDir];\n\n let current = routesDir;\n for (const segment of segments) {\n current = join(current, segment);\n dirs.push(current);\n }\n\n return dirs.map(sharedFileIn).filter((file): file is string => Boolean(file));\n}\n\nexport async function scanRoutes(routesDir: string): Promise<ScannedRoute[]> {\n if (!existsSync(routesDir)) {\n return [];\n }\n\n const files = await glob('**/+*.{ts,tsx,js,jsx,mjs,cjs,mts,cts}', {\n cwd: routesDir,\n absolute: true,\n onlyFiles: true,\n });\n\n const routes: ScannedRoute[] = [];\n\n for (const file of files) {\n const method = methodFromFile(basename(file));\n if (!method) {\n continue;\n }\n\n const routeDir = dirname(file);\n const routeSegments = physicalRouteSegments(routesDir, routeDir);\n const { path, params } = pathFromSegments(routeSegments);\n\n routes.push({\n method,\n path,\n file,\n routeDir,\n routeSegments,\n params,\n sharedFiles: sharedFilesForDir(routesDir, routeDir),\n });\n }\n\n return routes.sort((left, right) => {\n const pathOrder = left.path.localeCompare(right.path);\n if (pathOrder !== 0) {\n return pathOrder;\n }\n return METHOD_ORDER.indexOf(left.method) - METHOD_ORDER.indexOf(right.method);\n });\n}\n","import { existsSync } from 'node:fs';\nimport { mkdir } from 'node:fs/promises';\nimport { join } from 'node:path';\nimport { resolveGiriPaths } from '../app';\nimport {\n routeParamsForDir,\n scanRouteFolders,\n scanRoutes,\n sharedFilesForDir,\n type ScannedRoute,\n} from '../routes';\nimport type { GiriConfig, GiriPaths, HttpMethod } from '../types';\nimport { writeAppTypes } from './app-types';\nimport type { RouteInputSchemas } from './inputs';\nimport { writeManifest } from './manifest';\nimport { writeOpenApi } from './openapi';\nimport { writeParamTypes, type TypeFolder } from './param-types';\nimport { extractRouteMeta, type RouteSecurity } from './route-meta';\nimport { writeRouteTypes } from './route-types';\nimport type { RouteResponses } from './schema';\nimport { writeTsConfig } from './tsconfig';\nimport { assertSafeOutDir, pruneDir, slash, typeFilePath } from './util';\n\n/** A `$types.d.ts` for every folder under `routes/` even empty/new ones. */\nasync function typeFolders(paths: GiriPaths, routes: ScannedRoute[]): Promise<TypeFolder[]> {\n // `scanRoutes` (tinyglobby) yields forward-slash paths while `scanRouteFolders` yields\n // native-separator paths, so key the map on a slash-normalized dir to match either form.\n const verbsByDir = new Map<string, { method: HttpMethod; file: string }[]>();\n for (const route of routes) {\n const key = slash(route.routeDir);\n const list = verbsByDir.get(key) ?? [];\n list.push({ method: route.method, file: route.file });\n verbsByDir.set(key, list);\n }\n\n const dirs = await scanRouteFolders(paths.routesDir);\n return dirs.map((dir) => ({\n dir,\n params: routeParamsForDir(paths.routesDir, dir),\n sharedFiles: sharedFilesForDir(paths.routesDir, dir),\n verbs: verbsByDir.get(slash(dir)) ?? [],\n }));\n}\n\n/** The per-route metadata maps feeding `manifest.json` / `openapi.json`. */\nexport interface SyncData {\n responsesByFile: Map<string, RouteResponses>;\n inputsByFile: Map<string, RouteInputSchemas>;\n securityByFile: Map<string, RouteSecurity>;\n hiddenFiles: Set<string>;\n}\n\nexport interface SyncResult {\n paths: GiriPaths;\n routes: ScannedRoute[];\n folders: TypeFolder[];\n /** Aggregated route metadata, so a watcher can update one route and re-serialize. */\n data: SyncData;\n}\n\n/**\n * Walk each route's `handle` return type into per-status JSON Schema. Best-effort: a\n * broken project (or missing TypeScript) must not break `sync`, so failures yield an\n * empty map and the manifest simply omits `responses`.\n */\nasync function extractResponses(paths: GiriPaths, routes: ScannedRoute[]): Promise<Map<string, RouteResponses>> {\n const byFile = new Map<string, RouteResponses>();\n if (routes.length === 0) {\n return byFile;\n }\n\n try {\n const { createSchemaProgram, extractRouteResponses } = await import('./schema/index.js');\n const files = [...new Set(routes.map((route) => route.file))];\n // Include the generated global app.d.ts so `c.app` resolves to its real type.\n const appTypes = join(paths.outDir, 'types', 'app.d.ts');\n const program = createSchemaProgram(\n paths,\n existsSync(appTypes) ? [...files, appTypes] : files,\n );\n for (const file of files) {\n byFile.set(file, extractRouteResponses(program, file));\n }\n } catch (error) {\n console.warn(`giri: skipped response schema generation (${(error as Error).message}).`);\n }\n\n return byFile;\n}\n\ninterface RuntimeMeta {\n inputsByFile: Map<string, RouteInputSchemas>;\n securityByFile: Map<string, RouteSecurity>;\n hiddenFiles: Set<string>;\n}\n\n/** Load route modules once to derive input schemas, middleware security, and openapi visibility. */\nasync function extractMeta(\n config: Pick<GiriConfig, 'alias'>,\n paths: GiriPaths,\n routes: ScannedRoute[],\n): Promise<RuntimeMeta> {\n const inputsByFile = new Map<string, RouteInputSchemas>();\n const securityByFile = new Map<string, RouteSecurity>();\n const hiddenFiles = new Set<string>();\n if (routes.length === 0) {\n return { inputsByFile, securityByFile, hiddenFiles };\n }\n\n try {\n const meta = await extractRouteMeta(config, paths, routes);\n for (const [file, entry] of meta) {\n if (entry.input) {\n inputsByFile.set(file, entry.input);\n }\n if (entry.security) {\n securityByFile.set(file, entry.security);\n }\n if (entry.hidden) {\n hiddenFiles.add(file);\n }\n }\n } catch (error) {\n console.warn(`giri: skipped input/security generation (${(error as Error).message}).`);\n }\n\n return { inputsByFile, securityByFile, hiddenFiles };\n}\n\n/**\n * Scan `routes/` and (re)generate the whole `.giri/` payload. Each artifact has its own\n * module under `src/generator/`. Files are overwritten **in place** (no upfront wipe), so\n * the editor never sees `tsconfig`/`$types` vanish during a slow regeneration; orphaned\n * files from removed routes are pruned at the end.\n */\nexport async function syncProject<App>(\n config: Pick<GiriConfig<App>, 'alias' | 'outDir'>,\n options: { cwd?: string } = {},\n): Promise<SyncResult> {\n const paths = resolveGiriPaths(config, options.cwd);\n assertSafeOutDir(paths);\n const routes = await scanRoutes(paths.routesDir);\n const folders = await typeFolders(paths, routes);\n\n await mkdir(paths.outDir, { recursive: true });\n await writeParamTypes(paths, folders);\n await writeRouteTypes(paths, routes);\n await writeAppTypes(paths);\n await writeTsConfig(paths, config);\n\n // Response schemas need the generated tsconfig + $types to resolve, so extract last.\n const responsesByFile = await extractResponses(paths, routes);\n const { inputsByFile, securityByFile, hiddenFiles } = await extractMeta(config, paths, routes);\n const data: SyncData = { responsesByFile, inputsByFile, securityByFile, hiddenFiles };\n await writeManifest(paths, routes, data);\n await writeOpenApi(paths, routes, data);\n\n await pruneDir(\n paths.outDir,\n new Set([\n join(paths.outDir, 'tsconfig.json'),\n join(paths.outDir, 'manifest.json'),\n join(paths.outDir, 'openapi.json'),\n join(paths.outDir, 'routes.d.ts'),\n join(paths.outDir, 'types', 'app.d.ts'),\n ...folders.map((folder) => typeFilePath(paths, folder.dir)),\n ]),\n );\n\n return { paths, routes, folders, data };\n}\n","import { existsSync } from 'node:fs';\nimport { join, relative } from 'node:path';\nimport type { GiriPaths } from '../types';\nimport { GENERATED_HEADER, slash, writeGenerated } from './util';\n\nconst MAIN_EXTENSIONS = ['ts', 'tsx', 'mts', 'cts', 'js', 'jsx', 'mjs', 'cjs'];\n\nfunction findMainFile(cwd: string): string | undefined {\n for (const ext of MAIN_EXTENSIONS) {\n const file = join(cwd, 'src', `main.${ext}`);\n if (existsSync(file)) {\n return file;\n }\n }\n return undefined;\n}\n\nfunction moduleSpecifier(fromDir: string, target: string): string {\n let path = slash(relative(fromDir, target)).replace(/\\.(?:[cm]?[jt]sx?)$/, '');\n if (!path.startsWith('.')) {\n path = `./${path}`;\n }\n return path;\n}\n\nexport async function writeAppTypes(paths: GiriPaths): Promise<void> {\n const file = join(paths.outDir, 'types', 'app.d.ts');\n const mainFile = findMainFile(paths.cwd);\n\n if (!mainFile) {\n await writeGenerated(file, [GENERATED_HEADER, 'export {};', ''].join('\\n'));\n return;\n }\n\n const spec = moduleSpecifier(join(paths.outDir, 'types'), mainFile);\n await writeGenerated(\n file,\n [\n GENERATED_HEADER,\n 'declare global {',\n ' namespace Giri {',\n ' interface Register {',\n ` app: typeof import(${JSON.stringify(spec)}) extends {`,\n ' init: (...args: any[]) => infer R;',\n ' }',\n ' ? Awaited<R>',\n ' : Record<string, unknown>;',\n ' }',\n ' }',\n '}',\n 'export {};',\n '',\n ].join('\\n'),\n );\n}\n","import { existsSync } from 'node:fs';\nimport { mkdir, readdir, rm, rmdir, writeFile } from 'node:fs/promises';\nimport { dirname, join, relative, sep } from 'node:path';\nimport type { GiriPaths } from '../types';\n\nexport const GENERATED_HEADER = '// Generated by giri sync. Do not edit.';\n\nexport function slash(path: string): string {\n return path.split(sep).join('/');\n}\n\nexport function importPath(fromFile: string, toFile: string): string {\n let path = slash(relative(dirname(fromFile), toFile)).replace(/\\.d\\.ts$/, '');\n if (!path.startsWith('.')) {\n path = `./${path}`;\n }\n return path;\n}\n\nexport function relativeConfigPath(fromDir: string, toPath: string): string {\n let path = slash(relative(fromDir, toPath));\n if (!path.startsWith('.')) {\n path = `./${path}`;\n }\n return path;\n}\n\n/** A relative ESM module specifier from `fromDir` to a source file (extension stripped). */\nexport function moduleSpecifier(fromDir: string, target: string): string {\n let path = slash(relative(fromDir, target)).replace(/\\.(?:[cm]?[jt]sx?)$/, '');\n if (!path.startsWith('.')) {\n path = `./${path}`;\n }\n return path;\n}\n\nexport function typeFilePath(paths: GiriPaths, routeDir: string): string {\n // Mirror the folder's source directory (relative to the project root) under\n // `<outDir>/types/`. Combined with `rootDirs: [\"..\", \"./types\"]`, this lets a file's\n const sourceDir = relative(paths.cwd, routeDir);\n return join(paths.outDir, 'types', sourceDir, '$types.d.ts');\n}\n\nexport function assertSafeOutDir(paths: GiriPaths): void {\n const rel = relative(paths.cwd, paths.outDir);\n if (!rel || rel.startsWith('..') || rel.includes(`..${sep}`)) {\n throw new Error(`Refusing to sync outside the project root: ${paths.outDir}`);\n }\n}\n\nconst writeCache = new Map<string, string>();\n\n/** Write a generated file, skipping the write when its content is unchanged and still on disk. */\nexport async function writeGenerated(path: string, content: string): Promise<void> {\n if (writeCache.get(path) === content && existsSync(path)) {\n return;\n }\n await mkdir(dirname(path), { recursive: true });\n await writeFile(path, content);\n writeCache.set(path, content);\n}\n\nexport async function writeJson(path: string, value: unknown): Promise<void> {\n await writeGenerated(path, `${JSON.stringify(value, null, 2)}\\n`);\n}\n\n/**\n * Remove generated files no longer in `keep`, plus any directories left empty. Lets sync\n * overwrite in place (no upfront wipe), so the editor never sees `tsconfig`/`$types`\n * disappear during a slow regeneration.\n */\nexport async function pruneDir(dir: string, keep: Set<string>): Promise<void> {\n let entries;\n try {\n entries = await readdir(dir, { withFileTypes: true });\n } catch {\n return;\n }\n for (const entry of entries) {\n const full = join(dir, entry.name);\n if (entry.isDirectory()) {\n await pruneDir(full, keep);\n await rmdir(full).catch(() => {}); // succeeds only if now empty\n } else if (!keep.has(full)) {\n await rm(full, { force: true });\n writeCache.delete(full); // a recreated file with identical content must write again\n }\n }\n}\n","import { join, relative } from 'node:path';\nimport type { ScannedRoute } from '../routes';\nimport type { GiriPaths } from '../types';\nimport type { RouteInputSchemas } from './inputs';\nimport type { RouteSecurity } from './route-meta';\nimport type { RouteResponses } from './schema';\nimport { slash, typeFilePath, writeJson } from './util';\n\nexport interface ManifestData {\n responsesByFile?: Map<string, RouteResponses>;\n inputsByFile?: Map<string, RouteInputSchemas>;\n securityByFile?: Map<string, RouteSecurity>;\n hiddenFiles?: Set<string>;\n}\n\n/** Emits `manifest.json`: the machine-readable route table consumed by tooling. */\nexport async function writeManifest(\n paths: GiriPaths,\n routes: ScannedRoute[],\n data: ManifestData = {},\n): Promise<void> {\n const manifest = {\n version: 1,\n routes: routes.map((route) => {\n const responses = data.responsesByFile?.get(route.file);\n const input = data.inputsByFile?.get(route.file);\n const security = data.securityByFile?.get(route.file);\n return {\n method: route.method,\n path: route.path,\n file: slash(relative(paths.cwd, route.file)),\n params: route.params,\n shared: route.sharedFiles.map((file) => slash(relative(paths.cwd, file))),\n types: slash(relative(paths.cwd, typeFilePath(paths, route.routeDir))),\n ...(data.hiddenFiles?.has(route.file) ? { hidden: true } : {}),\n ...(input ? { input } : {}),\n ...(security && security.security.length > 0 ? { security: security.security } : {}),\n responses: responses?.responses ?? [],\n ...(responses && Object.keys(responses.$defs).length > 0\n ? { $defs: responses.$defs }\n : {}),\n };\n }),\n };\n\n await writeJson(join(paths.outDir, 'manifest.json'), manifest);\n}\n","import { existsSync, readFileSync } from 'node:fs';\nimport { join } from 'node:path';\nimport type { OpenAPIV3_1 } from 'openapi-types';\nimport type { ScannedRoute } from '../routes';\nimport type { GiriPaths } from '../types';\nimport type { RouteInputSchemas } from './inputs';\nimport type { RouteSecurity } from './route-meta';\nimport type { JSONSchema, ResponseSchema, RouteResponses } from './schema';\nimport { writeJson } from './util';\n\nexport interface OpenApiData {\n responsesByFile?: Map<string, RouteResponses>;\n inputsByFile?: Map<string, RouteInputSchemas>;\n securityByFile?: Map<string, RouteSecurity>;\n hiddenFiles?: Set<string>;\n}\n\ntype JsonObject = Record<string, unknown>;\n\nconst REASON: Record<number, string> = {\n 200: 'OK',\n 201: 'Created',\n 202: 'Accepted',\n 204: 'No Content',\n 400: 'Bad Request',\n 401: 'Unauthorized',\n 403: 'Forbidden',\n 404: 'Not Found',\n 409: 'Conflict',\n 422: 'Unprocessable Entity',\n 500: 'Internal Server Error',\n};\n\nfunction toOpenApiPath(path: string): string {\n return path.replace(/:([A-Za-z0-9_]+)(?:\\{[^}]*\\})?/g, '{$1}');\n}\n\n/** Rewrite walker-local `#/$defs/X` refs to the document-level `#/components/schemas/X`. */\nfunction rewriteRefs(value: unknown): unknown {\n if (Array.isArray(value)) {\n return value.map(rewriteRefs);\n }\n if (value && typeof value === 'object') {\n const out: JsonObject = {};\n for (const [key, child] of Object.entries(value)) {\n if (key === '$ref' && typeof child === 'string' && child.startsWith('#/$defs/')) {\n out.$ref = child.replace('#/$defs/', '#/components/schemas/');\n } else {\n out[key] = rewriteRefs(child);\n }\n }\n return out;\n }\n return value;\n}\n\nfunction mediaTypeFor(format: 'json' | 'text'): string {\n return format === 'text' ? 'text/plain' : 'application/json';\n}\n\nconst BODY_MEDIA_TYPE: Record<string, string> = {\n json: 'application/json',\n form: 'multipart/form-data',\n urlencoded: 'application/x-www-form-urlencoded',\n text: 'text/plain',\n};\n\nfunction buildResponses(responses: ResponseSchema[]): JsonObject {\n if (responses.length === 0) {\n return { default: { description: 'Response' } };\n }\n\n const out: JsonObject = {};\n for (const response of responses) {\n const key = response.status === 'default' ? 'default' : String(response.status);\n const description =\n (typeof response.status === 'number' && REASON[response.status]) || 'Response';\n out[key] = {\n description,\n content: { [mediaTypeFor(response.format)]: { schema: rewriteRefs(response.schema) } },\n };\n }\n return out;\n}\n\nfunction pathParameters(route: ScannedRoute): JsonObject[] {\n const seen = new Set<string>();\n const params: JsonObject[] = [];\n for (const param of route.params) {\n if (seen.has(param.name)) {\n continue;\n }\n seen.add(param.name);\n params.push({ name: param.name, in: 'path', required: true, schema: { type: 'string' } });\n }\n return params;\n}\n\nfunction queryParameters(query: JSONSchema | undefined): JsonObject[] {\n if (!query || query.type !== 'object' || typeof query.properties !== 'object') {\n return [];\n }\n const properties = query.properties as Record<string, JSONSchema>;\n const required = Array.isArray(query.required) ? (query.required as string[]) : [];\n return Object.entries(properties).map(([name, schema]) => ({\n name,\n in: 'query',\n required: required.includes(name),\n schema: rewriteRefs(schema),\n }));\n}\n\nfunction readProjectInfo(cwd: string): { title: string; version: string } {\n const file = join(cwd, 'package.json');\n if (existsSync(file)) {\n try {\n const pkg = JSON.parse(readFileSync(file, 'utf8')) as { name?: string; version?: string };\n return { title: pkg.name ?? 'giri API', version: pkg.version ?? '0.0.0' };\n } catch {\n // fall through to defaults\n }\n }\n return { title: 'giri API', version: '0.0.0' };\n}\n\n/** Assemble an OpenAPI 3.1 document from the scanned routes + generated schemas. */\nexport function buildOpenApiDocument(\n paths: GiriPaths,\n routes: ScannedRoute[],\n data: OpenApiData = {},\n): OpenAPIV3_1.Document {\n const documentPaths: JsonObject = {};\n const schemas: JsonObject = {};\n const securitySchemes: JsonObject = {};\n\n for (const route of routes) {\n if (data.hiddenFiles?.has(route.file)) {\n continue; // excluded from the doc via `openapi`/`+shared.ts`\n }\n const responses = data.responsesByFile?.get(route.file);\n const input = data.inputsByFile?.get(route.file);\n const security = data.securityByFile?.get(route.file);\n\n for (const [name, schema] of Object.entries(responses?.$defs ?? {})) {\n schemas[name] = rewriteRefs(schema);\n }\n\n const operation: JsonObject = { responses: buildResponses(responses?.responses ?? []) };\n\n const parameters = [...pathParameters(route), ...queryParameters(input?.query)];\n if (parameters.length > 0) {\n operation.parameters = parameters;\n }\n if (input?.body) {\n const content: JsonObject = {};\n for (const [contentType, schema] of Object.entries(input.body)) {\n content[BODY_MEDIA_TYPE[contentType] ?? contentType] = {\n schema: rewriteRefs(schema),\n };\n }\n if (Object.keys(content).length > 0) {\n operation.requestBody = { required: true, content };\n }\n }\n if (security && security.security.length > 0) {\n operation.security = security.security;\n }\n if (security) {\n Object.assign(securitySchemes, security.securitySchemes);\n }\n\n const openApiPath = toOpenApiPath(route.path);\n const pathItem = (documentPaths[openApiPath] as JsonObject) ?? {};\n pathItem[route.method.toLowerCase()] = operation;\n documentPaths[openApiPath] = pathItem;\n }\n\n const document: JsonObject = {\n openapi: '3.1.0',\n info: readProjectInfo(paths.cwd),\n paths: documentPaths,\n };\n const components: JsonObject = {};\n if (Object.keys(schemas).length > 0) {\n components.schemas = schemas;\n }\n if (Object.keys(securitySchemes).length > 0) {\n components.securitySchemes = securitySchemes;\n }\n if (Object.keys(components).length > 0) {\n document.components = components;\n }\n return document as unknown as OpenAPIV3_1.Document;\n}\n\n/** Emit `.giri/openapi.json`. */\nexport async function writeOpenApi(\n paths: GiriPaths,\n routes: ScannedRoute[],\n data: OpenApiData = {},\n): Promise<void> {\n await writeJson(join(paths.outDir, 'openapi.json'), buildOpenApiDocument(paths, routes, data));\n}\n","import { dirname } from 'node:path';\nimport type { RouteParam } from '../routes';\nimport type { GiriPaths, HttpMethod } from '../types';\nimport { GENERATED_HEADER, moduleSpecifier, typeFilePath, writeGenerated } from './util';\n\nexport interface TypeFolder {\n dir: string;\n params: RouteParam[];\n /** The `+shared.ts` chain whose injected vars apply here. */\n sharedFiles: string[];\n /** The verb files (`+get.ts`, `+post.ts`, …) in this folder, one method-named handle each. */\n verbs: { method: HttpMethod; file: string }[];\n}\n\nfunction paramsType(params: RouteParam[]): string {\n if (params.length === 0) {\n return '{}';\n }\n\n const unique = new Map<string, RouteParam>();\n for (const param of params) {\n unique.set(param.name, param);\n }\n\n const fields = [...unique.values()]\n .map((param) => ` ${JSON.stringify(param.name)}: string;`)\n .join('\\n');\n return `{\\n${fields}\\n}`;\n}\n\n/** Merge the injected vars of the folder's `+shared.ts` middleware chain */\nfunction varsType(typesDir: string, sharedFiles: string[]): string {\n if (sharedFiles.length === 0) {\n return '{}';\n }\n return sharedFiles\n .map((file) => {\n const spec = JSON.stringify(moduleSpecifier(typesDir, file));\n return `(typeof import(${spec}) extends { middleware: infer M } ? import(\"@boon4681/giri\").InferStackVars<M> : {})`;\n })\n .join('\\n & ');\n}\n\nfunction methodExports(typesDir: string, verbs: TypeFolder['verbs']): string[] {\n return verbs.map(({ method, file }) => {\n const spec = JSON.stringify(moduleSpecifier(typesDir, file));\n const input = `import(\"@boon4681/giri\").RouteInputOf<typeof import(${spec})>`;\n const vars = `Vars & import(\"@boon4681/giri\").MiddlewareVarsOf<typeof import(${spec})>`;\n return `export type ${method} = import(\"@boon4681/giri\").Handle<Params, ${input}, ${vars}>;`;\n });\n}\n\nexport async function writeParamTypes(paths: GiriPaths, folders: TypeFolder[]): Promise<void> {\n for (const { dir, params, sharedFiles, verbs } of folders) {\n const file = typeFilePath(paths, dir);\n const typesDir = dirname(file);\n const lines = [\n GENERATED_HEADER,\n `export type Params = ${paramsType(params)};`,\n 'export type RouteParams = Params;',\n `type Vars = ${varsType(typesDir, sharedFiles)};`,\n 'export type Middleware<Injects extends Record<string, unknown> = {}> =',\n ' import(\"@boon4681/giri\").Middleware<Params, import(\"@boon4681/giri\").ValidatedInput, Injects>;',\n 'export type Handle<Input extends import(\"@boon4681/giri\").ValidatedInput = import(\"@boon4681/giri\").ValidatedInput> =',\n ' import(\"@boon4681/giri\").Handle<Params, Input, Vars>;',\n ];\n if (verbs.length > 0) {\n lines.push(...methodExports(typesDir, verbs));\n }\n lines.push('');\n await writeGenerated(file, lines.join('\\n'));\n }\n}\n","import { isGiriBodySchema, isGiriInputSchema } from '../validation';\nimport type { BodyContentType } from '../types';\nimport type { JSONSchema } from './schema';\n\nexport interface RouteInputSchemas {\n /** JSON Schema per declared body content-type (`json`, `form`, …). */\n body?: Partial<Record<BodyContentType, JSONSchema>>;\n query?: JSONSchema;\n}\n\nfunction sanitize(schema: JSONSchema): JSONSchema {\n // `$schema` is meaningful standalone but noise once embedded in OpenAPI.\n const { $schema, ...rest } = schema;\n void $schema;\n return rest;\n}\n\n/**\n * Convert a declared input to JSON Schema by asking the wrapper.\n */\nexport function inputToJsonSchema(schema: unknown): JSONSchema | undefined {\n if (!isGiriInputSchema(schema)) {\n return undefined;\n }\n return sanitize(schema.toJsonSchema());\n}\n\n/**\n * Convert a declared body (`zod.body({ json, form })`) to a JSON Schema per content-type.\n * Returns `undefined` when the value isn't a giri body schema or carries no schemas.\n */\nexport function bodyToJsonSchemas(\n value: unknown,\n): Partial<Record<BodyContentType, JSONSchema>> | undefined {\n if (!isGiriBodySchema(value)) {\n return undefined;\n }\n const out: Partial<Record<BodyContentType, JSONSchema>> = {};\n for (const [contentType, schema] of Object.entries(value.contents)) {\n const json = inputToJsonSchema(schema);\n if (json) {\n out[contentType as BodyContentType] = json;\n }\n }\n return Object.keys(out).length > 0 ? out : undefined;\n}\n","import { registerAliasResolver } from '../app';\nimport { safeRegister } from '../loader/loader';\nimport type { ScannedRoute } from '../routes';\nimport type { GiriConfig, GiriPaths, Middleware, SecurityRequirement } from '../types';\nimport { bodyToJsonSchemas, inputToJsonSchema, type RouteInputSchemas } from './inputs';\n\nexport interface RouteSecurity {\n /** Operation-level `security` requirements, e.g. `[{ bearerAuth: [] }]`. */\n security: SecurityRequirement[];\n /** Scheme definitions to merge into `components.securitySchemes`. */\n securitySchemes: Record<string, unknown>;\n}\n\nexport interface RouteMeta {\n input?: RouteInputSchemas;\n security?: RouteSecurity;\n /** Excluded from `openapi.json` (via `openapi`/`+shared.ts` resolution). */\n hidden?: boolean;\n}\n\nfunction loadModule(file: string): Record<string, unknown> {\n const resolved = require.resolve(file);\n delete require.cache[resolved];\n return require(resolved) as Record<string, unknown>;\n}\n\nfunction interopDefault(value: unknown): unknown {\n if (value && typeof value === 'object' && 'default' in value) {\n return (value as { default: unknown }).default;\n }\n return value;\n}\n\nfunction middlewareFunctions(value: unknown): Middleware[] {\n const exported = interopDefault(value);\n if (typeof exported === 'function') {\n return [exported as Middleware];\n }\n if (Array.isArray(exported)) {\n return exported.filter((fn): fn is Middleware => typeof fn === 'function');\n }\n return [];\n}\n\nfunction readInput(routeModule: Record<string, unknown>): RouteInputSchemas | undefined {\n const input: RouteInputSchemas = {};\n const body = bodyToJsonSchemas(routeModule.body);\n const query = inputToJsonSchema(routeModule.query);\n if (body) {\n input.body = body;\n }\n if (query) {\n input.query = query;\n }\n return input.body || input.query ? input : undefined;\n}\n\nfunction hiddenFrom(value: unknown): boolean | undefined {\n if (value === false) {\n return true;\n }\n if (value === true) {\n return false;\n }\n if (value && typeof value === 'object' && 'hidden' in value) {\n return Boolean((value as { hidden?: unknown }).hidden);\n }\n return undefined; // no opinion\n}\n\nfunction collectHidden(\n route: ScannedRoute,\n routeModule: Record<string, unknown>,\n loadShared: (file: string) => Record<string, unknown>,\n): boolean {\n let hidden = false;\n for (const file of route.sharedFiles) {\n const opinion = hiddenFrom(loadShared(file).openapi);\n if (opinion !== undefined) {\n hidden = opinion;\n }\n }\n const verb = hiddenFrom(routeModule.openapi);\n return verb ?? hidden;\n}\n\nfunction collectSecurity(\n route: ScannedRoute,\n routeModule: Record<string, unknown>,\n loadShared: (file: string) => Record<string, unknown>,\n): RouteSecurity | undefined {\n const skipInherited = Boolean(\n (routeModule.config as { skipInherited?: boolean } | undefined)?.skipInherited,\n );\n\n const middleware: Middleware[] = [];\n if (!skipInherited) {\n for (const file of route.sharedFiles) {\n middleware.push(...middlewareFunctions(loadShared(file).middleware));\n }\n }\n middleware.push(...middlewareFunctions(routeModule.middleware));\n\n const security: SecurityRequirement[] = [];\n const securitySchemes: Record<string, unknown> = {};\n for (const fn of middleware) {\n const openapi = fn.openapi;\n if (openapi?.security) {\n for (const requirement of openapi.security) {\n if (!security.some((seen) => JSON.stringify(seen) === JSON.stringify(requirement))) {\n security.push(requirement);\n }\n }\n }\n if (openapi?.securitySchemes) {\n Object.assign(securitySchemes, openapi.securitySchemes);\n }\n }\n\n return security.length > 0 || Object.keys(securitySchemes).length > 0\n ? { security, securitySchemes }\n : undefined;\n}\n\n/**\n * Load each route module once (with import aliases active) to derive runtime metadata:\n * input JSON Schemas from `body`/`query`, and OpenAPI `security` from the middleware\n * actually applied to the route (folder chain + verb, honoring `skipInherited`).\n */\nexport async function extractRouteMeta(\n config: Pick<GiriConfig, 'alias'>,\n paths: GiriPaths,\n routes: ScannedRoute[],\n): Promise<Map<string, RouteMeta>> {\n const byFile = new Map<string, RouteMeta>();\n const { unregister } = await safeRegister();\n const unregisterAlias = registerAliasResolver(config.alias, paths.cwd);\n const sharedCache = new Map<string, Record<string, unknown>>();\n const loadShared = (file: string): Record<string, unknown> => {\n if (!sharedCache.has(file)) {\n try {\n sharedCache.set(file, loadModule(file));\n } catch {\n sharedCache.set(file, {});\n }\n }\n return sharedCache.get(file)!;\n };\n\n try {\n for (const route of routes) {\n try {\n const routeModule = loadModule(route.file);\n const meta: RouteMeta = {};\n const input = readInput(routeModule);\n const security = collectSecurity(route, routeModule, loadShared);\n const hidden = collectHidden(route, routeModule, loadShared);\n if (input) {\n meta.input = input;\n }\n if (security) {\n meta.security = security;\n }\n if (hidden) {\n meta.hidden = true;\n }\n if (meta.input || meta.security || meta.hidden) {\n byFile.set(route.file, meta);\n }\n } catch {\n // A route that fails to load just contributes no metadata.\n }\n }\n } finally {\n unregisterAlias();\n unregister();\n }\n\n return byFile;\n}\n","import { join } from 'node:path';\nimport type { ScannedRoute } from '../routes';\nimport type { GiriPaths } from '../types';\nimport { GENERATED_HEADER, importPath, typeFilePath, writeGenerated } from './util';\n\n/** Emits `routes.d.ts`: a `RouteParams` map keyed by `\"METHOD path\"` for the whole app. */\nexport async function writeRouteTypes(paths: GiriPaths, routes: ScannedRoute[]): Promise<void> {\n const file = join(paths.outDir, 'routes.d.ts');\n const lines = [\n GENERATED_HEADER,\n 'export interface RouteParams {',\n ];\n\n for (const route of routes) {\n const typeFile = typeFilePath(paths, route.routeDir);\n lines.push(\n ` ${JSON.stringify(`${route.method} ${route.path}`)}: import(${JSON.stringify(\n importPath(file, typeFile),\n )}).Params;`,\n );\n }\n\n lines.push('}', '');\n await writeGenerated(file, lines.join('\\n'));\n}\n","import { join, resolve } from 'node:path';\nimport type { GiriConfig, GiriPaths } from '../types';\nimport { relativeConfigPath, writeJson } from './util';\n\nfunction normalizeAlias(alias: GiriConfig['alias'], paths: GiriPaths): Record<string, string[]> {\n const result: Record<string, string[]> = {};\n for (const [key, value] of Object.entries(alias ?? {})) {\n const targets = Array.isArray(value) ? value : [value];\n // Alias values are written relative to the project root (the same base the\n // runtime resolver in app.ts uses), but the generated tsconfig lives in\n // outDir, so re-base each target onto outDir to keep them relative.\n result[key] = targets.map((target) =>\n relativeConfigPath(paths.outDir, resolve(paths.cwd, target)),\n );\n }\n return result;\n}\n\n/** Emits the `.giri/tsconfig.json` the project extends: rootDirs merge, aliases, plugin. */\nexport async function writeTsConfig(paths: GiriPaths, config: Pick<GiriConfig, 'alias'>): Promise<void> {\n const file = join(paths.outDir, 'tsconfig.json');\n await writeJson(file, {\n compilerOptions: {\n rootDirs: [\n '..',\n './types',\n ],\n paths: {\n // The tsconfig lives in outDir, so `$giri/*` maps to its own folder.\n '$giri/*': ['./*'],\n ...normalizeAlias(config.alias, paths),\n },\n plugins: [\n {\n name: '@boon4681/giri/tsc',\n },\n ],\n },\n include: [\n relativeConfigPath(paths.outDir, join(paths.cwd, 'src')),\n relativeConfigPath(paths.outDir, join(paths.cwd, 'giri.config.ts')),\n './types/**/*.d.ts',\n ],\n });\n}\n","import { existsSync } from 'node:fs';\nimport { dirname, join, resolve } from 'node:path';\nimport {\n buildModuleGraph,\n collectDependents,\n purgeGeneratedModules,\n purgeModules,\n purgeProjectModules,\n} from '../loader/module-loader';\nimport type { ScannedRoute } from '../routes';\nimport type { GiriConfig } from '../types';\nimport { writeManifest } from './manifest';\nimport { writeOpenApi } from './openapi';\nimport { extractRouteMeta } from './route-meta';\nimport { syncProject, type SyncResult } from './sync';\nimport { slash } from './util';\n\nexport type ChangeOutcome = 'incremental' | 'full';\n\nexport interface WatchUpdater {\n /** Apply one watch event; returns whether it was handled incrementally or fell back to full. */\n apply(filename: string | null): Promise<ChangeOutcome>;\n}\n\nexport function createWatchUpdater(\n config: Pick<GiriConfig, 'alias' | 'outDir'>,\n initial: SyncResult,\n): WatchUpdater {\n const paths = initial.paths;\n let routes = initial.routes;\n const data = initial.data;\n\n const fullResync = async (): Promise<ChangeOutcome> => {\n purgeProjectModules(paths.cwd);\n const result = await syncProject(config, { cwd: paths.cwd });\n routes = result.routes;\n data.responsesByFile = result.data.responsesByFile;\n data.inputsByFile = result.data.inputsByFile;\n data.securityByFile = result.data.securityByFile;\n data.hiddenFiles = result.data.hiddenFiles;\n purgeGeneratedModules(paths.outDir);\n return 'full';\n };\n\n /** Recompute just one route's response/input/security/visibility metadata in place. */\n const reextractRoute = async (route: ScannedRoute): Promise<void> => {\n const key = route.file;\n try {\n const { createSchemaProgram, extractRouteResponses } = await import('./schema/index.js');\n const appTypes = join(paths.outDir, 'types', 'app.d.ts');\n const program = createSchemaProgram(paths, existsSync(appTypes) ? [key, appTypes] : [key]);\n data.responsesByFile.set(key, extractRouteResponses(program, key));\n } catch {\n // keep the previous response schema on failure (e.g. mid-save / type error)\n }\n try {\n const meta = await extractRouteMeta(config, paths, [route]);\n const entry = meta.get(key);\n data.inputsByFile.delete(key);\n data.securityByFile.delete(key);\n data.hiddenFiles.delete(key);\n if (entry?.input) {\n data.inputsByFile.set(key, entry.input);\n }\n if (entry?.security) {\n data.securityByFile.set(key, entry.security);\n }\n if (entry?.hidden) {\n data.hiddenFiles.add(key);\n }\n } catch {\n // keep previous metadata on failure\n }\n };\n\n return {\n async apply(filename) {\n if (!filename) {\n return fullResync();\n }\n // Filenames arrive relative to the watched `src/` (the parent of routes).\n const abs = resolve(dirname(paths.routesDir), filename);\n const file = slash(abs);\n if (!existsSync(abs)) {\n return fullResync();\n }\n\n const graph = buildModuleGraph(paths.cwd);\n const isRoute = routes.some((candidate) => slash(candidate.file) === file);\n\n if (!graph.nodes.has(file) && !isRoute) {\n return fullResync();\n }\n\n const dependents = collectDependents(graph, file);\n const affected = routes.filter((route) =>\n dependents.has(slash(route.file)) ||\n route.sharedFiles.some((shared) => dependents.has(slash(shared))),\n );\n purgeModules(dependents);\n for (const route of affected) {\n await reextractRoute(route);\n }\n await writeManifest(paths, routes, data);\n await writeOpenApi(paths, routes, data);\n purgeGeneratedModules(paths.outDir);\n return 'incremental';\n },\n };\n}\n","/**\n * Unproven method on (other javascript runtime) to build do module-graph by using NodeJS `require.cache`: each module records\n * its `children` and reflects the *previous* build\n */\nimport { join, resolve, sep } from 'node:path';\n\nexport interface ModuleGraph {\n importers: Map<string, Set<string>>;\n nodes: Set<string>;\n}\n\nconst toSlash = (path: string): string => path.split(sep).join('/');\n\nconst isProjectModule = (id: string, root: string): boolean => {\n return id.startsWith(root) && !id.includes(`${sep}node_modules${sep}`) && !id.includes(`${sep}.giri${sep}`);\n}\n\nexport const buildModuleGraph = (cwd: string): ModuleGraph => {\n const root = resolve(cwd) + sep;\n const importers = new Map<string, Set<string>>();\n const nodes = new Set<string>();\n for (const id of Object.keys(require.cache)) {\n if (!isProjectModule(id, root)) {\n continue;\n }\n const mod = require.cache[id];\n if (!mod) {\n continue;\n }\n nodes.add(toSlash(id));\n for (const child of mod.children) {\n if (!isProjectModule(child.id, root)) {\n continue;\n }\n nodes.add(toSlash(child.id));\n const dep = toSlash(child.id);\n let set = importers.get(dep);\n if (!set) {\n set = new Set();\n importers.set(dep, set);\n }\n set.add(toSlash(id));\n }\n }\n return { importers, nodes };\n};\n\nexport const collectDependents = (graph: ModuleGraph, start: string): Set<string> => {\n const out = new Set<string>([start]);\n const stack = [start];\n while (stack.length > 0) {\n const current = stack.pop()!;\n for (const importer of graph.importers.get(current) ?? []) {\n if (!out.has(importer)) {\n out.add(importer);\n stack.push(importer);\n }\n }\n }\n return out;\n};\n\nexport const purgeModules = (files: Set<string>): void => {\n for (const id of Object.keys(require.cache)) {\n if (files.has(toSlash(id))) {\n delete require.cache[id];\n }\n }\n};\n\n/**\n * Drop every cached module under the project root (skipping `node_modules` and `.giri`).\n */\nexport const purgeProjectModules = (cwd: string): void => {\n const root = resolve(cwd) + sep;\n for (const id of Object.keys(require.cache)) {\n if (isProjectModule(id, root)) {\n delete require.cache[id];\n }\n }\n};\n\nexport const purgeGeneratedModules = (outDir: string): void => {\n const root = resolve(outDir) + sep;\n for (const id of Object.keys(require.cache)) {\n if (resolve(id).startsWith(root)) {\n delete require.cache[id];\n }\n }\n};","import { existsSync } from 'node:fs';\nimport { join, resolve } from 'node:path';\nimport { safeRegister } from './loader/loader';\nimport type { Services } from './types';\n\nconst MAIN_EXTENSIONS = ['ts', 'tsx', 'mts', 'cts', 'js', 'jsx', 'mjs', 'cjs'];\n\nexport interface GiriLifecycle {\n /** Absolute path to the resolved `src/main.ts`, if one exists. */\n file?: string;\n /** Runtime startup: build the app's service container, awaited before serving. */\n init?: () => Services | Promise<Services>;\n /** Graceful shutdown: receives the container from `init`, run on process exit. */\n teardown?: (services: Services) => void | Promise<void>;\n}\n\nfunction resolveMainFile(cwd: string): string | undefined {\n for (const ext of MAIN_EXTENSIONS) {\n const file = join(cwd, 'src', `main.${ext}`);\n if (existsSync(file)) {\n return file;\n }\n }\n return undefined;\n}\n\n/**\n * Load the optional `src/main.ts` lifecycle module. Absent file ⇒ empty lifecycle\n * (serve immediately). `init`/`teardown` are validated to be functions if present.\n */\nexport async function loadLifecycle(cwd = process.cwd()): Promise<GiriLifecycle> {\n const file = resolveMainFile(resolve(cwd));\n if (!file) {\n return {};\n }\n\n const { unregister } = await safeRegister();\n try {\n const resolved = require.resolve(file);\n delete require.cache[resolved];\n const loaded = require(resolved) as Partial<GiriLifecycle>;\n\n const lifecycle: GiriLifecycle = { file };\n if (loaded.init !== undefined) {\n if (typeof loaded.init !== 'function') {\n throw new Error(`${file}: \"init\" must be a function.`);\n }\n lifecycle.init = loaded.init;\n }\n if (loaded.teardown !== undefined) {\n if (typeof loaded.teardown !== 'function') {\n throw new Error(`${file}: \"teardown\" must be a function.`);\n }\n lifecycle.teardown = loaded.teardown;\n }\n return lifecycle;\n } finally {\n unregister();\n }\n}\n\n/** Run `init()` once and normalize its result into a service container. */\nexport async function runInit(lifecycle: GiriLifecycle): Promise<Services> {\n if (!lifecycle.init) {\n return {} as Services;\n }\n const services = await lifecycle.init();\n return (services ?? {}) as Services;\n}\n"],"mappings":"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","names":["ts","ts","import_typescript","ts","isTypedResponse","import_typescript","options","import_node_path","import_node_fs","import_node_path","prefix","Module","import_node_fs","import_promises","import_node_path","import_node_fs","import_node_path","import_node_fs","import_promises","import_node_path","moduleSpecifier","import_node_path","import_node_fs","import_node_path","import_node_path","loadModule","interopDefault","import_node_path","import_node_path","createSchemaProgram","extractRouteResponses","import_node_fs","import_node_path","import_node_path","import_node_fs","import_node_path","MAIN_EXTENSIONS"]}
|