@boon4681/giri 0.0.1 → 0.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/cli.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/loader/_es5.ts","../src/cli.ts","../src/app.ts","../src/loader/loader.ts","../src/config/schema.ts","../src/routes.ts","../src/types.ts","../src/validation.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","../src/logger.ts"],"sourcesContent":["const _ = '';\r\nexport default _;","#!/usr/bin/env node\nimport { spawn } from 'node:child_process';\nimport { existsSync } from 'node:fs';\nimport { appendFile, mkdir, readFile, writeFile } from 'node:fs/promises';\nimport { join, resolve } from 'node:path';\nimport * as prompts from '@clack/prompts';\nimport { buildGiriApp } from './app';\nimport { load } from './loader/loader';\nimport { createWatchUpdater, syncProject } from './generator';\nimport { loadLifecycle, runInit } from './lifecycle';\nimport { log, muted } from './logger';\nimport type { Services, GiriConfig, GiriFetchHandler, GiriServer } from './types';\n\ninterface ParsedFlags {\n port?: number;\n hostname?: string;\n watch: boolean;\n}\n\ntype PackageManager = 'npm' | 'yarn' | 'pnpm' | 'bun';\n\ninterface AdapterChoice {\n value: string;\n label: string;\n hint: string;\n available: boolean;\n /** Import line added to `giri.config.ts`. */\n importLine: string;\n /** The adapter expression placed in `defineConfig({ adapter: … })`. */\n expr: string;\n /** Runtime deps this backend needs, installed alongside the framework. */\n deps: string[];\n}\n\nconst ADAPTERS: AdapterChoice[] = [\n {\n value: 'hono',\n label: 'Hono',\n hint: 'recommended, ships today',\n available: true,\n importLine: 'import { hono } from \"@boon4681/giri/adapters/hono\";',\n expr: 'hono()',\n deps: ['hono', '@hono/node-server'],\n }\n];\n\ninterface InitFlags {\n adapter?: string;\n packageManager?: PackageManager;\n /** undefined = ask; true/false = forced by --install / --no-install. */\n install?: boolean;\n /** Non-interactive: take defaults (Hono, detected PM, install). */\n yes: boolean;\n}\n\nfunction help(): void {\n console.log(`giri\n\nUsage:\n giri init [--adapter hono] [--pm npm|yarn|pnpm|bun] [--no-install] [-y]\n giri sync\n giri serve [--port 3000] [--host 127.0.0.1] [--no-watch]\n giri build\n`);\n}\n\nfunction parseInitFlags(args: string[]): InitFlags {\n const flags: InitFlags = { yes: false };\n const managers: PackageManager[] = ['npm', 'yarn', 'pnpm', 'bun'];\n\n for (let index = 0; index < args.length; index += 1) {\n const arg = args[index];\n if (arg === '--adapter' || arg === '-a') {\n flags.adapter = args[++index];\n } else if (arg === '--pm' || arg === '--package-manager') {\n const value = args[++index];\n if (!managers.includes(value as PackageManager)) {\n throw new Error(`Unknown package manager: ${value} (expected ${managers.join(', ')})`);\n }\n flags.packageManager = value as PackageManager;\n } else if (arg === '--install') {\n flags.install = true;\n } else if (arg === '--no-install') {\n flags.install = false;\n } else if (arg === '-y' || arg === '--yes') {\n flags.yes = true;\n } else {\n throw new Error(`Unknown option: ${arg}`);\n }\n }\n\n return flags;\n}\n\nfunction parseFlags(args: string[]): ParsedFlags {\n const flags: ParsedFlags = { watch: true };\n\n for (let index = 0; index < args.length; index += 1) {\n const arg = args[index];\n if (arg === '--port' || arg === '-p') {\n flags.port = Number(args[++index]);\n } else if (arg === '--host' || arg === '--hostname') {\n flags.hostname = args[++index];\n } else if (arg === '--no-watch') {\n flags.watch = false;\n } else {\n throw new Error(`Unknown option: ${arg}`);\n }\n }\n\n return flags;\n}\n\nasync function ensureGitignore(cwd: string): Promise<void> {\n const file = join(cwd, '.gitignore');\n const entry = '.giri';\n if (!existsSync(file)) {\n await writeFile(file, `${entry}\\n`);\n return;\n }\n\n const content = await readFile(file, 'utf8');\n if (!content.split(/\\r?\\n/).includes(entry)) {\n await appendFile(file, `${content.endsWith('\\n') ? '' : '\\n'}${entry}\\n`);\n }\n}\n\nasync function ensureTsConfig(cwd: string): Promise<void> {\n const file = join(cwd, 'tsconfig.json');\n if (existsSync(file)) {\n return;\n }\n\n await writeFile(\n file,\n `${JSON.stringify(\n {\n extends: './.giri/tsconfig.json',\n compilerOptions: {\n target: 'ES2022',\n lib: ['ES2022', 'DOM'],\n module: 'NodeNext',\n moduleResolution: 'NodeNext',\n strict: true,\n esModuleInterop: true,\n forceConsistentCasingInFileNames: true,\n skipLibCheck: true,\n types: ['node'],\n },\n },\n null,\n 2,\n )}\\n`,\n );\n}\n\n/** Guess the package manager from the user agent npm/yarn/pnpm/bun set when invoking the CLI. */\nfunction detectPackageManager(): PackageManager {\n const ua = process.env.npm_config_user_agent ?? '';\n if (ua.startsWith('yarn')) return 'yarn';\n if (ua.startsWith('pnpm')) return 'pnpm';\n if (ua.startsWith('bun')) return 'bun';\n return 'npm';\n}\n\nfunction installArgs(pm: PackageManager, deps: string[], dev: boolean): string[] {\n if (pm === 'npm') return ['install', ...(dev ? ['--save-dev'] : []), ...deps];\n if (pm === 'bun') return ['add', ...(dev ? ['--dev'] : []), ...deps];\n return ['add', ...(dev ? ['--dev'] : []), ...deps]; // yarn, pnpm\n}\n\n/** Run a package-manager command, streaming its output. On Windows the binaries are `.cmd` shims. */\nfunction runCommand(cmd: string, args: string[], cwd: string): Promise<void> {\n return new Promise((resolvePromise, reject) => {\n const child = spawn(cmd, args, { cwd, stdio: 'inherit', shell: process.platform === 'win32' });\n child.on('error', reject);\n child.on('close', (code) => {\n if (code === 0) {\n resolvePromise();\n } else {\n reject(new Error(`${cmd} ${args.join(' ')} exited with code ${code}`));\n }\n });\n });\n}\n\nfunction configSource(adapter: AdapterChoice): string {\n return [\n 'import { defineConfig } from \"@boon4681/giri\";',\n adapter.importLine,\n '',\n 'export default defineConfig({',\n ` adapter: ${adapter.expr},`,\n '});',\n '',\n ].join('\\n');\n}\n\n/** Prompt for the adapter (or take the default in non-interactive mode). Null = the user cancelled. */\nasync function selectAdapter(interactive: boolean): Promise<AdapterChoice | null> {\n if (!interactive || ADAPTERS.length === 1) {\n return ADAPTERS[0];\n }\n\n const picked = await prompts.select({\n message: 'Which backend adapter?',\n initialValue: 'hono',\n options: ADAPTERS.map((adapter) => ({\n value: adapter.value,\n label: adapter.label,\n hint: adapter.hint,\n })),\n });\n if (prompts.isCancel(picked)) {\n return null;\n }\n return ADAPTERS.find((adapter) => adapter.value === picked) ?? null;\n}\n\nasync function initProject(cwd: string, flags: InitFlags): Promise<void> {\n const interactive = Boolean(process.stdout.isTTY) && !flags.yes;\n prompts.intro('giri init');\n\n let adapter: AdapterChoice | null;\n if (flags.adapter) {\n adapter = ADAPTERS.find((choice) => choice.value === flags.adapter) ?? null;\n if (!adapter) {\n prompts.cancel(`Unknown adapter \"${flags.adapter}\". Available: ${ADAPTERS.map((a) => a.value).join(', ')}.`);\n return;\n }\n } else {\n adapter = await selectAdapter(interactive);\n if (!adapter) {\n prompts.cancel('Cancelled.');\n return;\n }\n }\n\n if (!adapter.available) {\n prompts.cancel(`The ${adapter.label} adapter isn't available yet — only Hono ships today.`);\n return;\n }\n\n const configPath = join(cwd, 'giri.config.ts');\n if (!existsSync(configPath)) {\n await writeFile(configPath, configSource(adapter));\n }\n\n const routePath = join(cwd, 'src', 'routes', '+get.ts');\n if (!existsSync(routePath)) {\n await mkdir(join(cwd, 'src', 'routes'), { recursive: true });\n await writeFile(\n routePath,\n [\n 'import type { Handle } from \"@boon4681/giri\";',\n '',\n 'export const handle: Handle = (c) => c.json({ ok: true });',\n '',\n ].join('\\n'),\n );\n }\n\n await ensureGitignore(cwd);\n await ensureTsConfig(cwd);\n prompts.log.success(`scaffolded a ${adapter.label} project`);\n\n const pm = flags.packageManager ?? detectPackageManager();\n let install = flags.install;\n if (install === undefined) {\n if (!interactive) {\n install = flags.yes;\n } else {\n const answer = await prompts.confirm({ message: `Install dependencies with ${pm}?` });\n if (prompts.isCancel(answer)) {\n prompts.cancel('Cancelled — files written, skipped install.');\n return;\n }\n install = answer;\n }\n }\n\n const deps = ['@boon4681/giri', ...adapter.deps, 'zod'];\n const devDeps = ['typescript', '@types/node'];\n\n if (install) {\n try {\n prompts.log.step(`Installing ${deps.join(', ')}`);\n await runCommand(pm, installArgs(pm, deps, false), cwd);\n prompts.log.step(`Installing dev deps ${devDeps.join(', ')}`);\n await runCommand(pm, installArgs(pm, devDeps, true), cwd);\n } catch (error) {\n prompts.log.error(error instanceof Error ? error.message : String(error));\n prompts.outro(`Install failed — run \\`${pm} ${installArgs(pm, deps, false).join(' ')}\\` yourself, then \\`giri serve\\`.`);\n return;\n }\n prompts.outro('Ready. Run `giri serve` to start the dev server.');\n return;\n }\n\n prompts.outro(\n `Next:\\n ${pm} ${installArgs(pm, deps, false).join(' ')}\\n ${pm} ${installArgs(pm, devDeps, true).join(' ')}\\n giri serve`,\n );\n}\n\nfunction displayHost(address: string): string {\n if (!address || address === '::' || address === '0.0.0.0') {\n return 'localhost';\n }\n return address.includes(':') ? `[${address}]` : address;\n}\n\nasync function serveProject(config: GiriConfig, flags: ParsedFlags): Promise<void> {\n const initial = await syncProject(config);\n log.success(\n `synced ${initial.routes.length} route${initial.routes.length === 1 ? '' : 's'} ${muted(`at ${initial.paths.outDir}`)}`,\n 'sync',\n );\n\n // Run the optional src/main.ts `init()` once, before serving. It owns long-lived\n // services (DB pools, etc.) that must survive watch rebuilds\n const lifecycle = await loadLifecycle();\n const services: Services = await runInit(lifecycle);\n\n let current = await buildGiriApp(config, { services });\n\n const port = flags.port ?? config.server?.port ?? 3000;\n const hostname = flags.hostname ?? config.server?.hostname;\n\n if (flags.watch) {\n // Watch the whole `src/`, not just `src/routes`: a route's imports (auth.ts, db.ts, …)\n // and `main.ts` live here, and editing them must rebuild too.\n const srcDir = resolve(current.paths.routesDir, '..');\n if (existsSync(srcDir)) {\n let timer: NodeJS.Timeout | undefined;\n let syncing = false;\n const changed = new Set<string>();\n const { watch } = await import('node:fs');\n const updater = createWatchUpdater(config, initial);\n const hmrCount = new Map<string, number>();\n const bump = (key: string): number => {\n const next = (hmrCount.get(key) ?? 0) + 1;\n hmrCount.set(key, next);\n return next;\n };\n\n // Drain queued changes, applying each through the incremental updater (it falls back\n // to a full sync for structural changes). Serialized so two drains never overlap;\n // changes arriving mid-drain are picked up by the loop or the trailing re-check.\n const flush = async (): Promise<void> => {\n if (syncing) {\n return;\n }\n syncing = true;\n try {\n while (changed.size > 0) {\n const batch = [...changed];\n changed.clear();\n for (const name of batch) {\n const outcome = await updater.apply(name || null);\n const rel = name ? `src/${name.replace(/\\\\/g, '/')}` : 'src';\n log.change(outcome === 'full' ? 'sync' : 'update', rel, bump(rel));\n }\n current = await buildGiriApp(config, { services });\n }\n } catch (error) {\n log.error(error instanceof Error ? error.message : String(error), 'watch');\n } finally {\n syncing = false;\n }\n if (changed.size > 0) {\n void flush();\n }\n };\n\n watch(srcDir, { recursive: true }, (_event, filename) => {\n changed.add(filename ? filename.toString() : '');\n clearTimeout(timer);\n timer = setTimeout(() => void flush(), 150);\n });\n }\n }\n\n const handler: GiriFetchHandler = (request) => config.adapter.fetch(current.app, request);\n\n const server = config.adapter.serve(handler, { port, hostname }, (info) => {\n log.ready(`http://${displayHost(info.address)}:${info.port}`);\n });\n\n registerShutdown(server, lifecycle, services);\n}\n\nfunction registerShutdown(\n server: GiriServer,\n lifecycle: { teardown?: (services: Services) => void | Promise<void> },\n services: Services,\n): void {\n let shuttingDown = false;\n const shutdown = async (): Promise<void> => {\n if (shuttingDown) {\n return;\n }\n shuttingDown = true;\n try {\n await server.close();\n if (lifecycle.teardown) {\n await lifecycle.teardown(services);\n }\n } catch (error) {\n log.error(error instanceof Error ? error.message : String(error));\n process.exitCode = 1;\n } finally {\n process.exit(process.exitCode ?? 0);\n }\n };\n\n process.once('SIGINT', () => void shutdown());\n process.once('SIGTERM', () => void shutdown());\n}\n\nasync function main(): Promise<void> {\n const [command = 'help', ...args] = process.argv.slice(2);\n const cwd = resolve(process.cwd());\n\n if (command === 'help' || command === '--help' || command === '-h') {\n help();\n return;\n }\n\n if (command === 'init') {\n await initProject(cwd, parseInitFlags(args));\n return;\n }\n\n if (command === 'build') {\n log.warn('build is planned, but is currently a no-op', 'build');\n return;\n }\n\n const config = await load();\n\n if (command === 'sync') {\n const result = await syncProject(config);\n log.success(\n `synced ${result.routes.length} route${result.routes.length === 1 ? '' : 's'} ${muted(`at ${result.paths.outDir}`)}`,\n 'sync',\n );\n return;\n }\n\n if (command === 'serve') {\n await serveProject(config, parseFlags(args));\n return;\n }\n\n throw new Error(`Unknown command: ${command}`);\n}\n\nmain().catch((error) => {\n log.error(error instanceof Error ? error.message : String(error));\n process.exitCode = 1;\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","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 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 { 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","/**\n * A tiny, dependency-free logger styled after Vite's dev output:\n * `HH:MM:SS [giri] (scope) message`. Colors auto-disable for non-TTY output, `NO_COLOR`,\n * or `TERM=dumb`, so piped/CI logs stay clean.\n */\n\nconst noColor =\n !process.stdout.isTTY ||\n process.env.NO_COLOR !== undefined ||\n process.env.TERM === 'dumb' ||\n process.env.FORCE_COLOR === '0';\n\nfunction paint(open: number, close: number): (text: string) => string {\n return (text) => (noColor ? text : `\\x1b[${open}m${text}\\x1b[${close}m`);\n}\n\nexport const color = {\n dim: paint(2, 22),\n bold: paint(1, 22),\n red: paint(31, 39),\n green: paint(32, 39),\n yellow: paint(33, 39),\n blue: paint(34, 39),\n magenta: paint(35, 39),\n cyan: paint(36, 39),\n gray: paint(90, 39),\n};\n\n/** Green for paths/values, like Vite highlights updated files. */\nexport const highlight = (text: string): string => color.green(text);\n/** Dim for secondary details (counts, durations). */\nexport const muted = (text: string): string => color.dim(text);\n\nfunction timestamp(): string {\n const now = new Date();\n const pad = (n: number): string => String(n).padStart(2, '0');\n return `${pad(now.getHours())}:${pad(now.getMinutes())}:${pad(now.getSeconds())}`;\n}\n\nconst TAG = 'giri';\n\nfunction line(tag: string, message: string, scope?: string): string {\n const parts = [color.gray(timestamp()), tag];\n if (scope) {\n parts.push(color.dim(`(${scope})`));\n }\n parts.push(message);\n return parts.join(' ');\n}\n\nconst tag = {\n info: color.bold(color.cyan(`[${TAG}]`)),\n warn: color.bold(color.yellow(`[${TAG}]`)),\n error: color.bold(color.red(`[${TAG}]`)),\n};\n\nexport const log = {\n info(message: string, scope?: string): void {\n console.log(line(tag.info, message, scope));\n },\n success(message: string, scope?: string): void {\n console.log(line(tag.info, color.green(message), scope));\n },\n warn(message: string, scope?: string): void {\n console.warn(line(tag.warn, color.yellow(message), scope));\n },\n error(message: string, scope?: string): void {\n console.error(line(tag.error, color.red(message), scope));\n },\n ready(url: string): void {\n console.log(line(tag.info, `${color.green('ready')} on ${color.cyan(url)}`));\n },\n change(verb: string, path: string, count?: number): void {\n const suffix = count && count > 1 ? ` ${color.dim(`(x${count})`)}` : '';\n console.log(line(tag.info, `${color.green(verb)} ${highlight(path)}${suffix}`, 'watch'));\n },\n};\n"],"mappings":"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","names":["import_node_fs","import_promises","import_node_path","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","import_node_path","import_node_fs","import_node_path","import_node_path","import_node_fs","import_node_path","MAIN_EXTENSIONS","tag","log","log"]}
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/cli.ts","../src/app.ts","../src/loader/loader.ts","../src/config/schema.ts","../src/routes.ts","../src/types.ts","../src/validation.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","../src/logger.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","#!/usr/bin/env node\nimport { spawn } from 'node:child_process';\nimport { existsSync } from 'node:fs';\nimport { appendFile, mkdir, readFile, writeFile } from 'node:fs/promises';\nimport { join, resolve } from 'node:path';\nimport * as prompts from '@clack/prompts';\nimport { buildGiriApp } from './app';\nimport { load } from './loader/loader';\nimport { createWatchUpdater, syncProject } from './generator';\nimport { loadLifecycle, runInit } from './lifecycle';\nimport { log, muted } from './logger';\nimport type { Services, GiriConfig, GiriFetchHandler, GiriServer } from './types';\n\ninterface ParsedFlags {\n port?: number;\n hostname?: string;\n watch: boolean;\n}\n\ntype PackageManager = 'npm' | 'yarn' | 'pnpm' | 'bun';\n\ninterface AdapterChoice {\n value: string;\n label: string;\n hint: string;\n available: boolean;\n /** Import line added to `giri.config.ts`. */\n importLine: string;\n /** The adapter expression placed in `defineConfig({ adapter: … })`. */\n expr: string;\n /** Runtime deps this backend needs, installed alongside the framework. */\n deps: string[];\n}\n\nconst ADAPTERS: AdapterChoice[] = [\n {\n value: 'hono',\n label: 'Hono',\n hint: 'recommended, ships today',\n available: true,\n importLine: 'import { hono } from \"@boon4681/giri/adapters/hono\";',\n expr: 'hono()',\n deps: ['hono', '@hono/node-server'],\n }\n];\n\ninterface InitFlags {\n adapter?: string;\n packageManager?: PackageManager;\n /** undefined = ask; true/false = forced by --install / --no-install. */\n install?: boolean;\n /** Non-interactive: take defaults (Hono, detected PM, install). */\n yes: boolean;\n}\n\nfunction help(): void {\n console.log(`giri\n\nUsage:\n giri init [--adapter hono] [--pm npm|yarn|pnpm|bun] [--no-install] [-y]\n giri sync\n giri serve [--port 3000] [--host 127.0.0.1] [--no-watch]\n giri build\n`);\n}\n\nfunction parseInitFlags(args: string[]): InitFlags {\n const flags: InitFlags = { yes: false };\n const managers: PackageManager[] = ['npm', 'yarn', 'pnpm', 'bun'];\n\n for (let index = 0; index < args.length; index += 1) {\n const arg = args[index];\n if (arg === '--adapter' || arg === '-a') {\n flags.adapter = args[++index];\n } else if (arg === '--pm' || arg === '--package-manager') {\n const value = args[++index];\n if (!managers.includes(value as PackageManager)) {\n throw new Error(`Unknown package manager: ${value} (expected ${managers.join(', ')})`);\n }\n flags.packageManager = value as PackageManager;\n } else if (arg === '--install') {\n flags.install = true;\n } else if (arg === '--no-install') {\n flags.install = false;\n } else if (arg === '-y' || arg === '--yes') {\n flags.yes = true;\n } else {\n throw new Error(`Unknown option: ${arg}`);\n }\n }\n\n return flags;\n}\n\nfunction parseFlags(args: string[]): ParsedFlags {\n const flags: ParsedFlags = { watch: true };\n\n for (let index = 0; index < args.length; index += 1) {\n const arg = args[index];\n if (arg === '--port' || arg === '-p') {\n flags.port = Number(args[++index]);\n } else if (arg === '--host' || arg === '--hostname') {\n flags.hostname = args[++index];\n } else if (arg === '--no-watch') {\n flags.watch = false;\n } else {\n throw new Error(`Unknown option: ${arg}`);\n }\n }\n\n return flags;\n}\n\nasync function ensureGitignore(cwd: string): Promise<void> {\n const file = join(cwd, '.gitignore');\n const entry = '.giri';\n if (!existsSync(file)) {\n await writeFile(file, `${entry}\\n`);\n return;\n }\n\n const content = await readFile(file, 'utf8');\n if (!content.split(/\\r?\\n/).includes(entry)) {\n await appendFile(file, `${content.endsWith('\\n') ? '' : '\\n'}${entry}\\n`);\n }\n}\n\nasync function ensureTsConfig(cwd: string): Promise<void> {\n const file = join(cwd, 'tsconfig.json');\n if (existsSync(file)) {\n return;\n }\n\n await writeFile(\n file,\n `${JSON.stringify(\n {\n extends: './.giri/tsconfig.json',\n compilerOptions: {\n target: 'ES2022',\n lib: ['ES2022', 'DOM'],\n module: 'NodeNext',\n moduleResolution: 'NodeNext',\n strict: true,\n esModuleInterop: true,\n forceConsistentCasingInFileNames: true,\n skipLibCheck: true,\n types: ['node'],\n },\n },\n null,\n 2,\n )}\\n`,\n );\n}\n\nasync function missingDeps(cwd: string, candidates: string[]): Promise<string[]> {\n let pkg: Record<string, unknown> = {};\n try {\n pkg = JSON.parse(await readFile(join(cwd, 'package.json'), 'utf8')) as Record<string, unknown>;\n } catch {\n // No/!valid package.json — treat everything as missing (init already guards this case).\n }\n\n const present = new Set<string>();\n for (const field of ['dependencies', 'devDependencies', 'peerDependencies', 'optionalDependencies']) {\n const map = pkg[field];\n if (map && typeof map === 'object') {\n for (const name of Object.keys(map as Record<string, unknown>)) {\n present.add(name);\n }\n }\n }\n\n return candidates.filter((name) => !present.has(name));\n}\n\n/** Guess the package manager from the user agent npm/yarn/pnpm/bun set when invoking the CLI. */\nfunction detectPackageManager(): PackageManager {\n const ua = process.env.npm_config_user_agent ?? '';\n if (ua.startsWith('yarn')) return 'yarn';\n if (ua.startsWith('pnpm')) return 'pnpm';\n if (ua.startsWith('bun')) return 'bun';\n return 'npm';\n}\n\nfunction installArgs(pm: PackageManager, deps: string[], dev: boolean): string[] {\n if (pm === 'npm') return ['install', ...(dev ? ['--save-dev'] : []), ...deps];\n if (pm === 'bun') return ['add', ...(dev ? ['--dev'] : []), ...deps];\n return ['add', ...(dev ? ['--dev'] : []), ...deps]; // yarn, pnpm\n}\n\n/** Run a package-manager command, streaming its output. On Windows the binaries are `.cmd` shims. */\nfunction runCommand(cmd: string, args: string[], cwd: string): Promise<void> {\n return new Promise((resolvePromise, reject) => {\n const child = spawn(cmd, args, { cwd, stdio: 'inherit', shell: process.platform === 'win32' });\n child.on('error', reject);\n child.on('close', (code) => {\n if (code === 0) {\n resolvePromise();\n } else {\n reject(new Error(`${cmd} ${args.join(' ')} exited with code ${code}`));\n }\n });\n });\n}\n\nfunction configSource(adapter: AdapterChoice): string {\n return [\n 'import { defineConfig } from \"@boon4681/giri\";',\n adapter.importLine,\n '',\n 'export default defineConfig({',\n ` adapter: ${adapter.expr},`,\n '});',\n '',\n ].join('\\n');\n}\n\n/** Prompt for the adapter (or take the default in non-interactive mode). Null = the user cancelled. */\nasync function selectAdapter(interactive: boolean): Promise<AdapterChoice | null> {\n if (!interactive || ADAPTERS.length === 1) {\n return ADAPTERS[0];\n }\n\n const picked = await prompts.select({\n message: 'Which backend adapter?',\n initialValue: 'hono',\n options: ADAPTERS.map((adapter) => ({\n value: adapter.value,\n label: adapter.label,\n hint: adapter.hint,\n })),\n });\n if (prompts.isCancel(picked)) {\n return null;\n }\n return ADAPTERS.find((adapter) => adapter.value === picked) ?? null;\n}\n\nasync function initProject(cwd: string, flags: InitFlags): Promise<void> {\n if (!existsSync(join(cwd, 'package.json'))) {\n throw new Error(\n 'No package.json found. Run `giri init` inside an existing project - set one up first ' +\n '(e.g. `npm init -y` and install typescript), then re-run.',\n );\n }\n\n const interactive = Boolean(process.stdout.isTTY) && !flags.yes;\n prompts.intro('giri init');\n\n let adapter: AdapterChoice | null;\n if (flags.adapter) {\n adapter = ADAPTERS.find((choice) => choice.value === flags.adapter) ?? null;\n if (!adapter) {\n prompts.cancel(`Unknown adapter \"${flags.adapter}\". Available: ${ADAPTERS.map((a) => a.value).join(', ')}.`);\n return;\n }\n } else {\n adapter = await selectAdapter(interactive);\n if (!adapter) {\n prompts.cancel('Cancelled.');\n return;\n }\n }\n\n if (!adapter.available) {\n prompts.cancel(`The ${adapter.label} adapter isn't available yet - only Hono ships today.`);\n return;\n }\n\n const configPath = join(cwd, 'giri.config.ts');\n if (!existsSync(configPath)) {\n await writeFile(configPath, configSource(adapter));\n }\n\n const routePath = join(cwd, 'src', 'routes', '+get.ts');\n if (!existsSync(routePath)) {\n await mkdir(join(cwd, 'src', 'routes'), { recursive: true });\n await writeFile(\n routePath,\n [\n 'import type { Handle } from \"@boon4681/giri\";',\n '',\n 'export const handle: Handle = (c) => c.json({ ok: true });',\n '',\n ].join('\\n'),\n );\n }\n\n await ensureGitignore(cwd);\n await ensureTsConfig(cwd);\n prompts.log.success(`scaffolded a ${adapter.label} project`);\n\n const pm = flags.packageManager ?? detectPackageManager();\n const deps = await missingDeps(cwd, ['@boon4681/giri', ...adapter.deps, 'zod']);\n const devDeps = await missingDeps(cwd, ['typescript', '@types/node']);\n\n if (deps.length === 0 && devDeps.length === 0) {\n prompts.outro('All dependencies already present. Run `giri serve` to start the dev server.');\n return;\n }\n\n const planLines = [\n ...(deps.length ? [` ${pm} ${installArgs(pm, deps, false).join(' ')}`] : []),\n ...(devDeps.length ? [` ${pm} ${installArgs(pm, devDeps, true).join(' ')}`] : []),\n ];\n\n let install = flags.install;\n if (install === undefined) {\n if (!interactive) {\n install = flags.yes;\n } else {\n const answer = await prompts.confirm({ message: `Install dependencies with ${pm}?` });\n if (prompts.isCancel(answer)) {\n prompts.cancel('Cancelled - files written, skipped install.');\n return;\n }\n install = answer;\n }\n }\n\n if (install) {\n try {\n if (deps.length) {\n prompts.log.step(`Installing ${deps.join(', ')}`);\n await runCommand(pm, installArgs(pm, deps, false), cwd);\n }\n if (devDeps.length) {\n prompts.log.step(`Installing dev deps ${devDeps.join(', ')}`);\n await runCommand(pm, installArgs(pm, devDeps, true), cwd);\n }\n } catch (error) {\n prompts.log.error(error instanceof Error ? error.message : String(error));\n prompts.outro(`Install failed - run these yourself, then \\`giri serve\\`:\\n${planLines.join('\\n')}`);\n return;\n }\n prompts.outro('Ready. Run `giri serve` to start the dev server.');\n return;\n }\n\n prompts.outro(`Next:\\n${planLines.join('\\n')}\\n giri serve`);\n}\n\nfunction displayHost(address: string): string {\n if (!address || address === '::' || address === '0.0.0.0') {\n return 'localhost';\n }\n return address.includes(':') ? `[${address}]` : address;\n}\n\nasync function serveProject(config: GiriConfig, flags: ParsedFlags): Promise<void> {\n const initial = await syncProject(config);\n log.success(\n `synced ${initial.routes.length} route${initial.routes.length === 1 ? '' : 's'} ${muted(`at ${initial.paths.outDir}`)}`,\n 'sync',\n );\n\n // Run the optional src/main.ts `init()` once, before serving. It owns long-lived\n // services (DB pools, etc.) that must survive watch rebuilds\n const lifecycle = await loadLifecycle();\n const services: Services = await runInit(lifecycle);\n\n let current = await buildGiriApp(config, { services });\n\n const port = flags.port ?? config.server?.port ?? 3000;\n const hostname = flags.hostname ?? config.server?.hostname;\n\n if (flags.watch) {\n // Watch the whole `src/`, not just `src/routes`: a route's imports (auth.ts, db.ts, …)\n // and `main.ts` live here, and editing them must rebuild too.\n const srcDir = resolve(current.paths.routesDir, '..');\n if (existsSync(srcDir)) {\n let timer: NodeJS.Timeout | undefined;\n let syncing = false;\n const changed = new Set<string>();\n const { watch } = await import('node:fs');\n const updater = createWatchUpdater(config, initial);\n const hmrCount = new Map<string, number>();\n const bump = (key: string): number => {\n const next = (hmrCount.get(key) ?? 0) + 1;\n hmrCount.set(key, next);\n return next;\n };\n\n // Drain queued changes, applying each through the incremental updater (it falls back\n // to a full sync for structural changes). Serialized so two drains never overlap;\n // changes arriving mid-drain are picked up by the loop or the trailing re-check.\n const flush = async (): Promise<void> => {\n if (syncing) {\n return;\n }\n syncing = true;\n try {\n while (changed.size > 0) {\n const batch = [...changed];\n changed.clear();\n for (const name of batch) {\n const outcome = await updater.apply(name || null);\n const rel = name ? `src/${name.replace(/\\\\/g, '/')}` : 'src';\n log.change(outcome === 'full' ? 'sync' : 'update', rel, bump(rel));\n }\n current = await buildGiriApp(config, { services });\n }\n } catch (error) {\n log.error(error instanceof Error ? error.message : String(error), 'watch');\n } finally {\n syncing = false;\n }\n if (changed.size > 0) {\n void flush();\n }\n };\n\n watch(srcDir, { recursive: true }, (_event, filename) => {\n changed.add(filename ? filename.toString() : '');\n clearTimeout(timer);\n timer = setTimeout(() => void flush(), 150);\n });\n }\n }\n\n const handler: GiriFetchHandler = (request) => config.adapter.fetch(current.app, request);\n\n const server = config.adapter.serve(handler, { port, hostname }, (info) => {\n log.ready(`http://${displayHost(info.address)}:${info.port}`);\n });\n\n registerShutdown(server, lifecycle, services);\n}\n\nfunction registerShutdown(\n server: GiriServer,\n lifecycle: { teardown?: (services: Services) => void | Promise<void> },\n services: Services,\n): void {\n let shuttingDown = false;\n const shutdown = async (): Promise<void> => {\n if (shuttingDown) {\n return;\n }\n shuttingDown = true;\n try {\n await server.close();\n if (lifecycle.teardown) {\n await lifecycle.teardown(services);\n }\n } catch (error) {\n log.error(error instanceof Error ? error.message : String(error));\n process.exitCode = 1;\n } finally {\n process.exit(process.exitCode ?? 0);\n }\n };\n\n process.once('SIGINT', () => void shutdown());\n process.once('SIGTERM', () => void shutdown());\n}\n\nasync function main(): Promise<void> {\n const [command = 'help', ...args] = process.argv.slice(2);\n const cwd = resolve(process.cwd());\n\n if (command === 'help' || command === '--help' || command === '-h') {\n help();\n return;\n }\n\n if (command === 'init') {\n await initProject(cwd, parseInitFlags(args));\n return;\n }\n\n if (command === 'build') {\n log.warn('build is planned, but is currently a no-op', 'build');\n return;\n }\n\n const config = await load();\n\n if (command === 'sync') {\n const result = await syncProject(config);\n log.success(\n `synced ${result.routes.length} route${result.routes.length === 1 ? '' : 's'} ${muted(`at ${result.paths.outDir}`)}`,\n 'sync',\n );\n return;\n }\n\n if (command === 'serve') {\n await serveProject(config, parseFlags(args));\n return;\n }\n\n throw new Error(`Unknown command: ${command}`);\n}\n\nmain().catch((error) => {\n log.error(error instanceof Error ? error.message : String(error));\n process.exitCode = 1;\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","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;\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}\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 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 { 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 { 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 { 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 { 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 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","/**\n * A tiny, dependency-free logger styled after Vite's dev output:\n * `HH:MM:SS [giri] (scope) message`. Colors auto-disable for non-TTY output, `NO_COLOR`,\n * or `TERM=dumb`, so piped/CI logs stay clean.\n */\n\nconst noColor =\n !process.stdout.isTTY ||\n process.env.NO_COLOR !== undefined ||\n process.env.TERM === 'dumb' ||\n process.env.FORCE_COLOR === '0';\n\nfunction paint(open: number, close: number): (text: string) => string {\n return (text) => (noColor ? text : `\\x1b[${open}m${text}\\x1b[${close}m`);\n}\n\nexport const color = {\n dim: paint(2, 22),\n bold: paint(1, 22),\n red: paint(31, 39),\n green: paint(32, 39),\n yellow: paint(33, 39),\n blue: paint(34, 39),\n magenta: paint(35, 39),\n cyan: paint(36, 39),\n gray: paint(90, 39),\n};\n\n/** Green for paths/values, like Vite highlights updated files. */\nexport const highlight = (text: string): string => color.green(text);\n/** Dim for secondary details (counts, durations). */\nexport const muted = (text: string): string => color.dim(text);\n\nfunction timestamp(): string {\n const now = new Date();\n const pad = (n: number): string => String(n).padStart(2, '0');\n return `${pad(now.getHours())}:${pad(now.getMinutes())}:${pad(now.getSeconds())}`;\n}\n\nconst TAG = 'giri';\n\nfunction line(tag: string, message: string, scope?: string): string {\n const parts = [color.gray(timestamp()), tag];\n if (scope) {\n parts.push(color.dim(`(${scope})`));\n }\n parts.push(message);\n return parts.join(' ');\n}\n\nconst tag = {\n info: color.bold(color.cyan(`[${TAG}]`)),\n warn: color.bold(color.yellow(`[${TAG}]`)),\n error: color.bold(color.red(`[${TAG}]`)),\n};\n\nexport const log = {\n info(message: string, scope?: string): void {\n console.log(line(tag.info, message, scope));\n },\n success(message: string, scope?: string): void {\n console.log(line(tag.info, color.green(message), scope));\n },\n warn(message: string, scope?: string): void {\n console.warn(line(tag.warn, color.yellow(message), scope));\n },\n error(message: string, scope?: string): void {\n console.error(line(tag.error, color.red(message), scope));\n },\n ready(url: string): void {\n console.log(line(tag.info, `${color.green('ready')} on ${color.cyan(url)}`));\n },\n change(verb: string, path: string, count?: number): void {\n const suffix = count && count > 1 ? ` ${color.dim(`(x${count})`)}` : '';\n console.log(line(tag.info, `${color.green(verb)} ${highlight(path)}${suffix}`, 'watch'));\n },\n};\n"],"mappings":"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","names":["ts","ts","import_typescript","ts","import_typescript","import_node_fs","import_promises","import_node_path","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","createSchemaProgram","extractRouteResponses","import_node_fs","import_node_path","MAIN_EXTENSIONS","tag","log","log"]}