@dudousxd/nestjs-inertia 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +139 -0
- package/LICENSE +21 -0
- package/README.md +317 -0
- package/dist/index.cjs +2314 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.ts +461 -0
- package/dist/index.js +2265 -0
- package/dist/index.js.map +1 -0
- package/package.json +120 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/errors/exceptions.ts","../src/shell/handlebars.adapter.ts","../src/shell/ejs.adapter.ts","../src/shell/pug.adapter.ts","../src/shell/liquid.adapter.ts","../src/middleware/fastify-method-spoof.middleware.ts","../src/interceptor/error-bag.interceptor.ts","../src/interceptor/redirect.interceptor.ts","../src/tokens.ts","../src/middleware/method-spoof.middleware.ts","../src/index.ts","../src/decorator/inertia.decorator.ts","../src/markers.ts","../src/decorator/use-inertia.decorator.ts","../src/interceptor/render.interceptor.ts","../src/service.ts","../src/helpers/nullify-undefined.ts","../src/helpers/set-nested.ts","../src/module.ts","../src/asset/version.provider.ts","../src/interceptor/scope-switcher.interceptor.ts","../src/adapter/express.ts","../src/adapter/fastify.ts","../src/middleware/express.middleware.ts","../src/helpers/suppress-post-send-writes.ts","../src/middleware/fastify.middleware.ts","../src/shell/file-shell.renderer.ts","../src/shell/directives.ts","../src/shell/serialize-page.ts","../src/shell/template-engine.registry.ts","../src/shell/shell.ts","../src/ssr/ssr-loader.service.ts","../src/csrf/csrf-cookie.interceptor.ts","../src/csrf/csrf-token.ts","../src/csrf/csrf.guard.ts"],"sourcesContent":["export class InvalidInertiaConfigException extends Error {\n constructor(message: string) {\n super(`[nestjs-inertia] Invalid config: ${message}`);\n this.name = 'InvalidInertiaConfigException';\n }\n}\n\nexport class InertiaServiceNotAvailableException extends Error {\n constructor() {\n super(\n '[nestjs-inertia] req.inertia is not defined — middleware did not run. Ensure InertiaModule is imported and the middleware applies to this route.',\n );\n this.name = 'InertiaServiceNotAvailableException';\n }\n}\n\nexport class UnsupportedRootViewExtensionException extends Error {\n constructor(extension: string) {\n super(\n `[nestjs-inertia] rootView extension \"${extension}\" is not supported. Supported extensions: .html, .htm, .hbs, .handlebars, .ejs, .pug, .liquid, .liquidjs. Or pass a (ctx) => string function for full control.`,\n );\n this.name = 'UnsupportedRootViewExtensionException';\n }\n}\n\nexport class MissingTemplateEngineDepException extends Error {\n constructor(engine: string, packageName: string) {\n super(\n `[nestjs-inertia] Template engine \"${engine}\" requires \"${packageName}\" as a peer dependency. Install with: pnpm add ${packageName}`,\n );\n this.name = 'MissingTemplateEngineDepException';\n }\n}\n\nexport class MissingCookieDepException extends Error {\n constructor(platform: 'express' | 'fastify') {\n const dep = platform === 'express' ? 'cookie-parser' : '@fastify/cookie';\n super(\n `[nestjs-inertia] CSRF requires \"${dep}\" as a peer dependency for ${platform}. Install with: pnpm add ${dep}`,\n );\n this.name = 'MissingCookieDepException';\n }\n}\n\nimport { ForbiddenException } from '@nestjs/common';\n\nexport class InvalidCsrfTokenException extends ForbiddenException {\n constructor() {\n super('[nestjs-inertia] CSRF token is missing or invalid.');\n }\n}\n","import { createRequire } from 'node:module';\nimport { MissingTemplateEngineDepException } from '../errors/exceptions.js';\nimport type { TemplateEngineAdapter } from './template-engine.adapter.js';\n\nconst require = createRequire(import.meta.url);\n\nfunction loadHandlebars(): { compile: (src: string) => (locals: unknown) => string } {\n try {\n return require('handlebars');\n } catch {\n throw new MissingTemplateEngineDepException('Handlebars', 'handlebars');\n }\n}\n\nexport const handlebarsAdapter: TemplateEngineAdapter = {\n extension: '.hbs',\n packageName: 'handlebars',\n compile(templateSource: string) {\n const hbs = loadHandlebars();\n const compiled = hbs.compile(templateSource);\n return (locals) => compiled(locals);\n },\n};\n","import { createRequire } from 'node:module';\nimport { MissingTemplateEngineDepException } from '../errors/exceptions.js';\nimport type { TemplateEngineAdapter } from './template-engine.adapter.js';\n\nconst require = createRequire(import.meta.url);\n\nfunction loadEjs(): { compile: (src: string, opts?: unknown) => (locals: unknown) => string } {\n try {\n return require('ejs');\n } catch {\n throw new MissingTemplateEngineDepException('EJS', 'ejs');\n }\n}\n\nexport const ejsAdapter: TemplateEngineAdapter = {\n extension: '.ejs',\n packageName: 'ejs',\n compile(templateSource: string, absPath: string) {\n const ejs = loadEjs();\n const compiled = ejs.compile(templateSource, { filename: absPath, async: false });\n return (locals) => compiled(locals);\n },\n};\n","import { createRequire } from 'node:module';\nimport { MissingTemplateEngineDepException } from '../errors/exceptions.js';\nimport type { TemplateEngineAdapter } from './template-engine.adapter.js';\n\nconst require = createRequire(import.meta.url);\n\nfunction loadPug(): { compile: (src: string, opts?: unknown) => (locals: unknown) => string } {\n try {\n return require('pug');\n } catch {\n throw new MissingTemplateEngineDepException('Pug', 'pug');\n }\n}\n\nexport const pugAdapter: TemplateEngineAdapter = {\n extension: '.pug',\n packageName: 'pug',\n compile(templateSource: string, absPath: string) {\n const pug = loadPug();\n const compiled = pug.compile(templateSource, { filename: absPath });\n return (locals) => compiled(locals);\n },\n};\n","import { createRequire } from 'node:module';\nimport { MissingTemplateEngineDepException } from '../errors/exceptions.js';\nimport type { TemplateEngineAdapter } from './template-engine.adapter.js';\n\nconst require = createRequire(import.meta.url);\n\ntype LiquidCtor = new (\n opts?: unknown,\n) => { parseAndRender: (src: string, locals: unknown) => Promise<string> };\n\nfunction loadLiquid(): LiquidCtor {\n try {\n const mod = require('liquidjs');\n return mod.Liquid as LiquidCtor;\n } catch {\n throw new MissingTemplateEngineDepException('Liquid', 'liquidjs');\n }\n}\n\nexport const liquidAdapter: TemplateEngineAdapter = {\n extension: '.liquid',\n packageName: 'liquidjs',\n compile(templateSource: string) {\n const Liquid = loadLiquid();\n const engine = new Liquid({ outputEscape: 'escape' });\n return async (locals) => engine.parseAndRender(templateSource, locals);\n },\n};\n","import type { InertiaModuleOptions } from '../types.js';\n\nconst ALLOWED = new Set(['PUT', 'PATCH', 'DELETE']);\n\ninterface FastifyHookApp {\n addHook: (event: string, handler: (req: unknown, reply: unknown) => Promise<void> | void) => void;\n}\n\nexport function registerFastifyMethodSpoof(\n app: FastifyHookApp,\n options: InertiaModuleOptions,\n): void {\n // methodSpoofing defaults to false (opt-in); skip unless explicitly enabled\n if (options.methodSpoofing !== true) return;\n app.addHook('preHandler', async (req: unknown) => {\n const r = req as {\n method: string;\n headers: Record<string, string>;\n body?: { _method?: unknown };\n };\n if (r.method !== 'POST') return;\n const contentType = (r.headers['content-type'] ?? '').toString().toLowerCase();\n if (!contentType.startsWith('multipart/')) return;\n const spoofed = String(r.body?._method ?? '').toUpperCase();\n if (ALLOWED.has(spoofed)) {\n (r as { method: string }).method = spoofed;\n if (r.body && typeof r.body === 'object') {\n r.body._method = undefined;\n }\n }\n });\n}\n","import {\n type CallHandler,\n type ExecutionContext,\n Injectable,\n type NestInterceptor,\n} from '@nestjs/common';\nimport type { Observable } from 'rxjs';\nimport { map } from 'rxjs/operators';\n\n@Injectable()\nexport class ErrorBagInterceptor implements NestInterceptor {\n intercept(context: ExecutionContext, next: CallHandler): Observable<unknown> {\n const req = context.switchToHttp().getRequest<{ header(n: string): string | undefined }>();\n const bag = req.header('X-Inertia-Error-Bag');\n if (!bag) return next.handle();\n return next.handle().pipe(\n map((value) => {\n if (typeof value !== 'object' || value === null) return value;\n const v = value as Record<string, unknown>;\n if (v.errors === undefined) return value;\n return { ...v, errors: { [bag]: v.errors } };\n }),\n );\n }\n}\n","import {\n type CallHandler,\n type ExecutionContext,\n Inject,\n Injectable,\n type NestInterceptor,\n} from '@nestjs/common';\nimport type { Observable } from 'rxjs';\nimport { tap } from 'rxjs/operators';\nimport { INERTIA_MODULE_OPTIONS } from '../tokens.js';\nimport type { InertiaModuleOptions } from '../types.js';\n\nconst SAFE_METHODS = new Set(['PUT', 'PATCH', 'DELETE']);\n\ntype RedirectFn = (url: string) => void;\ntype RedirectFnWithStatus = (status: number, url: string) => void;\n\n/** Works for both Express (req.header(n)) and raw Fastify (req.headers[n]) */\nfunction getHeader(req: unknown, name: string): string | undefined {\n const r = req as {\n header?: (n: string) => string | undefined;\n headers?: Record<string, string | string[] | undefined>;\n };\n if (typeof r.header === 'function') return r.header(name);\n const v = r.headers?.[name.toLowerCase()];\n return Array.isArray(v) ? v[0] : v;\n}\n\n@Injectable()\nexport class RedirectInterceptor implements NestInterceptor {\n constructor(@Inject(INERTIA_MODULE_OPTIONS) private readonly options: InertiaModuleOptions) {}\n\n intercept(context: ExecutionContext, next: CallHandler): Observable<unknown> {\n if (this.options.autoUpgrade303 === false) return next.handle();\n\n const req = context.switchToHttp().getRequest<unknown>();\n const res = context\n .switchToHttp()\n .getResponse<{ statusCode: number; redirect?: RedirectFn & RedirectFnWithStatus }>();\n const method = (req as { method: string }).method;\n\n if (SAFE_METHODS.has(method) && getHeader(req, 'X-Inertia')) {\n // Patch res.redirect (Express: redirect(status, url)) BEFORE the handler runs.\n if (typeof res.redirect === 'function') {\n const originalRedirect = res.redirect.bind(res) as RedirectFn & RedirectFnWithStatus;\n res.redirect = function patchedRedirect(statusOrUrl: number | string, url?: string): void {\n if (typeof statusOrUrl === 'number' && statusOrUrl === 302) {\n originalRedirect(303, url!);\n } else if (typeof statusOrUrl === 'string') {\n // redirect(url) — Express defaults to 302; upgrade to 303\n originalRedirect(303, statusOrUrl);\n } else {\n originalRedirect(statusOrUrl as number, url!);\n }\n } as RedirectFn & RedirectFnWithStatus;\n }\n\n // Patch reply.code (Fastify) so handlers using reply.code(302) get upgraded too.\n const resAny = res as unknown as { code?: (n: number) => unknown };\n if (typeof resAny.code === 'function') {\n const originalCode = resAny.code.bind(res) as (n: number) => unknown;\n resAny.code = function patchedCode(n: number) {\n return originalCode(n === 302 ? 303 : n);\n };\n }\n }\n\n // Also handle handlers that set res.statusCode = 302 directly (without calling res.redirect).\n return next.handle().pipe(\n tap(() => {\n if (res.statusCode === 302 && SAFE_METHODS.has(method) && getHeader(req, 'X-Inertia')) {\n res.statusCode = 303;\n }\n }),\n );\n }\n}\n","export const INERTIA_MODULE_OPTIONS = Symbol('INERTIA_MODULE_OPTIONS');\nexport const INERTIA_FEATURE_OPTIONS = Symbol('INERTIA_FEATURE_OPTIONS');\nexport const INERTIA_MANIFEST = Symbol('INERTIA_MANIFEST');\nexport const INERTIA_ASSET_VERSION = Symbol('INERTIA_ASSET_VERSION');\nexport const INERTIA_DEFAULT_SCOPE = 'default';\n\nexport type InertiaScope = string;\n\nconst RESERVED_SCOPES = new Set(['default']);\n\n/**\n * Module-local symbol cache. Keys are `${kind}:${scope}` strings.\n * Using a module-local Map instead of Symbol.for() prevents external\n * code that knows the string key from hijacking the symbol, and avoids\n * collisions with other packages that might use the same global registry key.\n *\n * For multi-root apps where scope names must be unique across roots, pass\n * a `rootId` to `featureToken(kind, scope, rootId)` to guarantee isolation.\n */\nconst _featureTokenCache = new Map<string, symbol>();\n\nexport function featureToken(\n kind: 'OPTIONS' | 'MANIFEST' | 'ASSET_VERSION' | 'SHELL_RENDERER' | 'SSR_LOADER',\n scope: string,\n rootId?: string,\n): symbol {\n const key = rootId ? `${kind}:${scope}:${rootId}` : `${kind}:${scope}`;\n const cached = _featureTokenCache.get(key);\n if (cached) return cached;\n const sym = Symbol(`INERTIA_FEATURE_${kind}:${scope}${rootId ? `:${rootId}` : ''}`);\n _featureTokenCache.set(key, sym);\n return sym;\n}\n\nexport function assertScopeNotReserved(scope: string): void {\n if (RESERVED_SCOPES.has(scope)) {\n throw new Error(\n `[nestjs-inertia] Scope \"${scope}\" is reserved. Use forRoot() for the default scope.`,\n );\n }\n}\n","import { Inject, Injectable, type NestMiddleware } from '@nestjs/common';\nimport type { NextFunction, Request, Response } from 'express';\nimport { INERTIA_MODULE_OPTIONS } from '../tokens.js';\nimport type { InertiaModuleOptions } from '../types.js';\n\nconst ALLOWED = new Set(['PUT', 'PATCH', 'DELETE']);\n\n@Injectable()\nexport class MethodSpoofMiddleware implements NestMiddleware {\n constructor(@Inject(INERTIA_MODULE_OPTIONS) private readonly options: InertiaModuleOptions) {}\n\n use(req: Request & { body?: Record<string, unknown> }, _res: Response, next: NextFunction): void {\n // methodSpoofing defaults to false (opt-in); skip unless explicitly enabled\n // biome-ignore lint/correctness/noVoidTypeReturn: NextFunction() returns void; early-return guard pattern\n if (this.options.methodSpoofing !== true) return next();\n // biome-ignore lint/correctness/noVoidTypeReturn: NextFunction() returns void; early-return guard pattern\n if (req.method !== 'POST') return next();\n const contentType = (req.headers['content-type'] ?? '').toString().toLowerCase();\n // biome-ignore lint/correctness/noVoidTypeReturn: NextFunction() returns void; early-return guard pattern\n if (!contentType.startsWith('multipart/')) return next();\n const spoofed = String(req.body?._method ?? '').toUpperCase();\n if (ALLOWED.has(spoofed)) {\n (req as unknown as { method: string }).method = spoofed;\n if (req.body && typeof req.body === 'object') {\n req.body._method = undefined;\n }\n }\n next();\n }\n}\n","export const VERSION = '1.0.0';\nexport { ErrorBagInterceptor } from './interceptor/error-bag.interceptor.js';\nexport { RedirectInterceptor } from './interceptor/redirect.interceptor.js';\nexport { MethodSpoofMiddleware } from './middleware/method-spoof.middleware.js';\nexport type { FlashStore, FlashErrors } from './flash/flash-store.js';\nexport {\n InvalidInertiaConfigException,\n InertiaServiceNotAvailableException,\n UnsupportedRootViewExtensionException,\n MissingTemplateEngineDepException,\n MissingCookieDepException,\n InvalidCsrfTokenException,\n} from './errors/exceptions.js';\nexport { Inertia } from './markers.js';\nexport { UseInertia, INERTIA_USE_SCOPE } from './decorator/use-inertia.decorator.js';\nexport { featureToken } from './tokens.js';\nexport type { InertiaRegistry, RegistryRoutes } from './types/registry.js';\nexport { INERTIA_RENDER_COMPONENT } from './decorator/inertia.decorator.js';\nexport { InertiaRenderInterceptor } from './interceptor/render.interceptor.js';\nexport type { ShellRenderer } from './shell/shell.js';\nexport { InertiaService } from './service.js';\nexport { InertiaModule } from './module.js';\nexport {\n INERTIA_MODULE_OPTIONS,\n INERTIA_FEATURE_OPTIONS,\n INERTIA_MANIFEST,\n INERTIA_ASSET_VERSION,\n INERTIA_DEFAULT_SCOPE,\n} from './tokens.js';\nexport type {\n PageObject,\n SsrResult,\n Props,\n SharedFactory,\n SharedInput,\n ShellRenderCtx,\n RootView,\n RootViewFn,\n ViteOptions,\n SsrOptions,\n CodegenOptions,\n InertiaModuleOptions,\n InertiaFeatureOptions,\n InertiaOptionsFactory,\n InertiaModuleAsyncOptions,\n InertiaFeatureAsyncOptions,\n} from './types.js';\n\nexport { CsrfCookieInterceptor, rotateCsrfToken } from './csrf/csrf-cookie.interceptor.js';\nexport type { CsrfCookieOptions } from './csrf/csrf-cookie.interceptor.js';\nexport { CsrfGuard } from './csrf/csrf.guard.js';\nexport type { CsrfGuardOptions } from './csrf/csrf.guard.js';\nexport { generateCsrfToken, verifyCsrfToken, timingSafeEqualSafe } from './csrf/csrf-token.js';\n\ndeclare global {\n namespace Express {\n interface Request {\n inertia: import('./service.js').InertiaService;\n }\n }\n}\n","import { SetMetadata } from '@nestjs/common';\n\nexport const INERTIA_RENDER_COMPONENT = Symbol('INERTIA_RENDER_COMPONENT');\n\nexport function createInertiaDecorator(component: string): MethodDecorator {\n return SetMetadata(INERTIA_RENDER_COMPONENT, component);\n}\n","import { createInertiaDecorator } from './decorator/inertia.decorator.js';\n\nconst MARKER = Symbol('inertia.marker');\n\nexport type MarkerKind = 'always' | 'optional' | 'defer' | 'merge' | 'once';\n\nexport interface Marker<T = unknown> {\n [MARKER]: true;\n kind: MarkerKind;\n value: () => T | Promise<T>;\n meta: Record<string, unknown>;\n}\n\nfunction make<T>(\n kind: MarkerKind,\n value: () => T | Promise<T>,\n meta: Record<string, unknown> = {},\n): Marker<T> {\n return { [MARKER]: true, kind, value, meta };\n}\n\n// Inertia(component) acts as a decorator AND retains namespace methods.\nfunction inertiaDecorator(component: string): MethodDecorator {\n return createInertiaDecorator(component);\n}\n\n// Marker helpers (preserved from before)\nfunction always<T>(fn: () => T | Promise<T>): Marker<T> {\n return make('always', fn);\n}\nfunction optional<T>(fn: () => T | Promise<T>): Marker<T> {\n return make('optional', fn);\n}\n\nlet _lazyWarned = false;\n/**\n * @deprecated Use `Inertia.optional()` instead. `Inertia.lazy()` is a deprecated alias\n * kept for v1/v2 backward compatibility and will be removed in a future major version.\n */\nfunction lazy<T>(fn: () => T | Promise<T>): Marker<T> {\n if (!_lazyWarned) {\n _lazyWarned = true;\n console.warn(\n '[nestjs-inertia] Inertia.lazy() is deprecated and will be removed in a future version. ' +\n 'Use Inertia.optional() instead (Inertia v3).',\n );\n }\n return optional(fn);\n}\nfunction defer<T>(fn: () => T | Promise<T>, group = 'default'): Marker<T> {\n return make('defer', fn, { group });\n}\nfunction once<T>(fn: () => T | Promise<T>): Marker<T> {\n return make('once', fn);\n}\nfunction merge<T>(\n fn: () => T | Promise<T>,\n opts?: { matchOn?: string; deep?: boolean },\n): Marker<T> {\n const meta: Record<string, unknown> = { deep: opts?.deep ?? false };\n if (opts?.matchOn !== undefined) meta.matchOn = opts.matchOn;\n return make('merge', fn, meta);\n}\n\n// Attach namespace methods to the function via Object.assign\ntype InertiaFn = typeof inertiaDecorator & {\n always: typeof always;\n optional: typeof optional;\n lazy: typeof lazy;\n defer: typeof defer;\n once: typeof once;\n merge: typeof merge;\n};\nconst Inertia = Object.assign(inertiaDecorator, {\n always,\n optional,\n lazy,\n defer,\n once,\n merge,\n}) as InertiaFn;\n\nexport { Inertia };\n\nexport function isMarker(value: unknown): value is Marker {\n return (\n typeof value === 'object' &&\n value !== null &&\n (value as Record<symbol, unknown>)[MARKER] === true\n );\n}\n\nexport function getMarkerKind(marker: Marker): MarkerKind {\n return marker.kind;\n}\n\nexport function getMarkerValue<T>(marker: Marker<T>): () => T | Promise<T> {\n return marker.value;\n}\n\nexport function getMarkerMeta(marker: Marker): Record<string, unknown> {\n return marker.meta;\n}\n\n/** @internal — resets the once-per-process lazy deprecation flag (for tests only) */\nexport function _resetLazyDeprecationWarning(): void {\n _lazyWarned = false;\n}\n","import { SetMetadata } from '@nestjs/common';\n\nexport const INERTIA_USE_SCOPE = 'INERTIA_USE_SCOPE';\n\nexport function UseInertia(scope: string): ClassDecorator & MethodDecorator {\n return SetMetadata(INERTIA_USE_SCOPE, scope);\n}\n","import {\n type CallHandler,\n type ExecutionContext,\n Inject,\n Injectable,\n type NestInterceptor,\n} from '@nestjs/common';\nimport { Reflector } from '@nestjs/core';\nimport { EMPTY, type Observable, from, of } from 'rxjs';\nimport { switchMap } from 'rxjs/operators';\nimport { INERTIA_RENDER_COMPONENT } from '../decorator/inertia.decorator.js';\nimport { InertiaServiceNotAvailableException } from '../errors/exceptions.js';\nimport type { InertiaService } from '../service.js';\nimport type { Props } from '../types.js';\n\n@Injectable()\nexport class InertiaRenderInterceptor implements NestInterceptor {\n constructor(@Inject(Reflector) private readonly reflector: Reflector) {}\n\n intercept(context: ExecutionContext, next: CallHandler): Observable<unknown> {\n const component = this.reflector.get<string | undefined>(\n INERTIA_RENDER_COMPONENT,\n context.getHandler(),\n );\n if (!component) {\n return next.handle();\n }\n\n const req = context.switchToHttp().getRequest<{ inertia?: InertiaService }>();\n const res = context.switchToHttp().getResponse<{ headersSent: boolean }>();\n\n return next.handle().pipe(\n switchMap((returnValue) => {\n if (res.headersSent) {\n return of(undefined); // handler already called req.inertia.render() manually\n }\n if (!req.inertia) {\n throw new InertiaServiceNotAvailableException();\n }\n const props = (returnValue ?? {}) as Props;\n return from(req.inertia.render(component, props)).pipe(switchMap(() => of(undefined)));\n }),\n );\n }\n}\n","import { Logger } from '@nestjs/common';\nimport type { InertiaRequest, InertiaResponse } from './adapter/adapter.js';\n\n/**\n * Validates a redirect URL to prevent open-redirect attacks.\n * Only relative URLs (starting with `/`) or same-origin absolute URLs are\n * permitted. Absolute URLs to other hosts throw an error.\n */\nfunction validateLocationUrl(url: string): string {\n // Relative URLs are always safe\n if (url.startsWith('/')) return url;\n // Attempt to parse as absolute URL\n try {\n const parsed = new URL(url);\n // Allow only http/https schemes (no javascript: etc.)\n if (parsed.protocol !== 'http:' && parsed.protocol !== 'https:') {\n throw new Error(`[nestjs-inertia] location() rejected unsafe URL scheme: ${url}`);\n }\n // Same-origin check: if called on the server, we don't have the request origin,\n // so we reject all absolute URLs to external hosts.\n throw new Error(\n `[nestjs-inertia] location() rejected absolute URL to external host: ${url}. Use a relative path (e.g. \"/dashboard\") instead.`,\n );\n } catch (err) {\n if (err instanceof TypeError) {\n // URL() threw — not a valid absolute URL; treat as relative\n return url;\n }\n throw err;\n }\n}\nimport type { Manifest } from './asset/version.provider.js';\nimport type { FlashStore } from './flash/flash-store.js';\nimport { nullifyUndefined } from './helpers/nullify-undefined.js';\nimport { unpackDotKeys } from './helpers/set-nested.js';\nimport { type Marker, getMarkerKind, getMarkerMeta, getMarkerValue, isMarker } from './markers.js';\nimport type { PageObject, Props, SharedInput, ShellRenderCtx } from './types.js';\n\n/** Sentinel to indicate a prop should be omitted from the output. */\nconst OMIT = Symbol('inertia.omit');\n\n/** Returns true if the value contains any `always()` markers at any nesting depth. */\nfunction containsAlwaysMarker(value: unknown): boolean {\n if (isMarker(value)) {\n return getMarkerKind(value as Marker) === 'always';\n }\n if (Array.isArray(value)) {\n return value.some(containsAlwaysMarker);\n }\n if (typeof value === 'object' && value !== null) {\n return Object.values(value as Record<string, unknown>).some(containsAlwaysMarker);\n }\n return false;\n}\n\n/**\n * Recursively resolve a nested plain object, walking all keys and resolving markers.\n *\n * @param obj The object whose keys should be walked\n * @param topKey The top-level prop key (used to build full dot-paths for deferredProps)\n * @param subKeep Relative sub-path keep list (null = include all non-optional markers)\n * e.g. if top-level keep=[\"user.avatar\"], subKeep=[\"avatar\"] for the \"user\" object\n * @param deferredProps Mutable deferred props map\n */\nasync function resolveNestedObjectValue(\n obj: Record<string, unknown>,\n topKey: string,\n subKeep: string[] | null,\n deferredProps: Record<string, string[]>,\n): Promise<Record<string, unknown>> {\n const out: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(obj)) {\n // Build relative dotPath for this child (relative to topKey)\n // Full path = topKey + \".\" + k but we store sub-paths relative to topKey\n const resolved = await resolveNestedValueInner(v, k, topKey, subKeep, deferredProps);\n if (resolved !== OMIT) out[k] = resolved;\n }\n return out;\n}\n\n/**\n * Inner recursive resolver. Works on arbitrary values (markers, objects, arrays, scalars).\n *\n * @param value Value to resolve\n * @param relPath Path relative to topKey (e.g. \"profile.avatar\" for user.profile.avatar)\n * @param topKey Top-level prop key\n * @param subKeep Sub-path keep list relative to topKey (null = no filter)\n * @param deferredProps Mutable deferred props map\n */\nasync function resolveNestedValueInner(\n value: unknown,\n relPath: string,\n topKey: string,\n subKeep: string[] | null,\n deferredProps: Record<string, string[]>,\n): Promise<unknown | typeof OMIT> {\n if (isMarker(value)) {\n return resolveMarker(value as Marker, relPath, topKey, subKeep, deferredProps);\n }\n\n if (Array.isArray(value)) {\n const out: unknown[] = [];\n for (const item of value) {\n const resolved = await resolveNestedValueInner(item, relPath, topKey, subKeep, deferredProps);\n if (resolved !== OMIT) out.push(resolved);\n }\n return out;\n }\n\n if (typeof value === 'object' && value !== null) {\n const obj = value as Record<string, unknown>;\n const out: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(obj)) {\n const childPath = `${relPath}.${k}`;\n const resolved = await resolveNestedValueInner(v, childPath, topKey, subKeep, deferredProps);\n if (resolved !== OMIT) out[k] = resolved;\n }\n return out;\n }\n\n // Scalar value: apply sub-path filter if active\n if (subKeep !== null) {\n // Include scalars only if their relPath is explicitly listed OR is a prefix of a listed path\n const included = subKeep.some((k) => k === relPath || k.startsWith(`${relPath}.`));\n if (!included) return OMIT;\n }\n\n return value;\n}\n\nasync function resolveMarker(\n marker: Marker,\n relPath: string,\n topKey: string,\n subKeep: string[] | null,\n deferredProps: Record<string, string[]>,\n): Promise<unknown | typeof OMIT> {\n const kind = getMarkerKind(marker);\n // Full dot-path (as it would appear in X-Inertia-Partial-Data)\n const fullPath = `${topKey}.${relPath}`;\n\n if (kind === 'always') {\n return getMarkerValue(marker)();\n }\n\n if (kind === 'optional') {\n // subKeep === null: full reload — omit optional\n // subKeep !== null: partial reload — include only if relPath is listed\n if (subKeep?.includes(relPath)) {\n return getMarkerValue(marker)();\n }\n return OMIT;\n }\n\n if (kind === 'once') {\n // once() at nested level: resolve on full reload (subKeep === null), omit on partial\n if (subKeep === null) {\n return getMarkerValue(marker)();\n }\n return OMIT;\n }\n\n if (kind === 'defer') {\n if (subKeep !== null) {\n // Partial reload: resolve only if listed\n if (subKeep.includes(relPath)) return getMarkerValue(marker)();\n return OMIT;\n }\n // Full reload: register as deferred using full dot-path\n const meta = getMarkerMeta(marker) as { group: string };\n const group = meta.group;\n const existing = deferredProps[group];\n if (existing) existing.push(fullPath);\n else deferredProps[group] = [fullPath];\n return OMIT;\n }\n\n if (kind === 'merge') {\n // merge() at nested level: resolve (merge metadata only applies at top-level)\n if (subKeep !== null && !subKeep.includes(relPath)) return OMIT;\n return getMarkerValue(marker)();\n }\n\n return OMIT;\n}\n\nexport interface SsrModule {\n render(page: PageObject): Promise<{ head: string[]; body: string }>;\n}\n\nexport interface SsrLoader {\n load(): Promise<SsrModule | null>;\n}\n\nexport interface InertiaServiceDeps {\n assetVersion: string;\n manifest: Manifest | null;\n ssrLoader: SsrLoader;\n rootViewRender: (ctx: ShellRenderCtx) => Promise<string>;\n moduleShare: SharedInput | undefined;\n featureShare: SharedInput | undefined;\n historyEncryptionDefault?: boolean;\n flashStore: FlashStore | undefined;\n}\n\nexport class InertiaService {\n private readonly logger = new Logger(InertiaService.name);\n private shared: SharedInput[] = [];\n private encryptHistoryFlag: boolean | undefined;\n private clearHistoryFlag = false;\n\n constructor(\n private readonly req: InertiaRequest,\n private readonly res: InertiaResponse,\n private readonly deps: InertiaServiceDeps,\n ) {}\n\n share(input: SharedInput): this {\n this.shared.push(input);\n return this;\n }\n\n /**\n * Perform an Inertia redirect. For Inertia XHR requests, issues a 409 with\n * `X-Inertia-Location`; for plain browser visits, issues a 302 redirect.\n *\n * Only relative URLs (starting with `/`) or same-origin absolute URLs are\n * accepted. Absolute URLs pointing to a different host are rejected to prevent\n * open-redirect vulnerabilities.\n *\n * @param url Relative path (e.g. `/dashboard`) or same-origin absolute URL.\n * @throws Error when `url` is an absolute URL pointing to a different origin.\n */\n location(url: string): void {\n const safeUrl = validateLocationUrl(url);\n if (this.req.header('X-Inertia')) {\n this.res.status(409).setHeader('X-Inertia-Location', safeUrl).end();\n } else {\n this.res.status(302).setHeader('Location', safeUrl).end();\n }\n }\n\n encryptHistory(value = true): this {\n this.encryptHistoryFlag = value;\n return this;\n }\n\n clearHistory(): this {\n this.clearHistoryFlag = true;\n return this;\n }\n\n private async resolveShared(): Promise<Props> {\n const sources: SharedInput[] = [];\n if (this.deps.moduleShare !== undefined) sources.push(this.deps.moduleShare);\n if (this.deps.featureShare !== undefined) sources.push(this.deps.featureShare);\n sources.push(...this.shared);\n\n const out: Props = {};\n for (const s of sources) {\n const resolved = typeof s === 'function' ? await s(this.req) : s;\n Object.assign(out, resolved);\n }\n return out;\n }\n\n async render(component: string, props: Props = {}): Promise<void> {\n // Version mismatch check (short-circuit before any factory resolution)\n const clientVersion = this.req.header('X-Inertia-Version');\n if (\n this.req.method === 'GET' &&\n this.req.header('X-Inertia') &&\n clientVersion !== undefined &&\n clientVersion !== this.deps.assetVersion\n ) {\n this.res.status(409).setHeader('X-Inertia-Location', this.req.originalUrl).end();\n return;\n }\n\n // Auto-resolve errors from FlashStore if configured and not provided in props\n if (this.deps.flashStore && props.errors === undefined) {\n try {\n const flashed = await this.deps.flashStore.read(this.req.raw);\n if (flashed && Object.keys(flashed).length > 0) {\n this.share({ errors: flashed });\n }\n } catch (err) {\n // Log the failure so developers can debug flash store issues,\n // but don't crash the request — errors stay {}\n this.logger.warn(\n `FlashStore.read() threw: ${err instanceof Error ? err.message : String(err)}`,\n );\n }\n }\n\n const sharedProps = await this.resolveShared();\n const rawProps: Props = { ...sharedProps, ...props };\n if (rawProps.errors === undefined) rawProps.errors = {};\n\n const partialComponent = this.req.header('X-Inertia-Partial-Component');\n const isPartial = partialComponent === component;\n const partialDataHeader = this.req.header('X-Inertia-Partial-Data');\n const keepList =\n isPartial && partialDataHeader ? partialDataHeader.split(',').filter(Boolean) : null;\n const keep = keepList && keepList.length > 0 ? keepList : null;\n\n const resetHeader = this.req.header('X-Inertia-Reset');\n const resetKeys = (resetHeader ?? '').split(',').filter(Boolean);\n\n const resetOnceHeader = this.req.header('X-Inertia-Reset-Once');\n const resetOnceKeys = (resetOnceHeader ?? '').split(',').filter(Boolean);\n\n const exceptHeader = this.req.header('X-Inertia-Partial-Except');\n const exceptKeys = isPartial ? (exceptHeader ?? '').split(',').filter(Boolean) : [];\n\n const finalProps: Props = {};\n const deferredProps: Record<string, string[]> = {};\n const mergeProps: string[] = [];\n const deepMergeProps: string[] = [];\n const matchPropsOn: Record<string, string> = {};\n\n for (const [key, value] of Object.entries(rawProps)) {\n if (exceptKeys.includes(key) && key !== 'errors') continue;\n if (isMarker(value)) {\n const kind = getMarkerKind(value);\n if (kind === 'always') {\n finalProps[key] = await getMarkerValue(value)();\n continue;\n }\n if (kind === 'optional') {\n if (keep?.includes(key)) {\n finalProps[key] = await getMarkerValue(value)();\n }\n continue;\n }\n if (kind === 'once') {\n // Initial visit (no partial) OR explicit reset-once for this key\n if (!keep || resetOnceKeys.includes(key)) {\n finalProps[key] = await getMarkerValue(value)();\n }\n continue;\n }\n if (kind === 'defer') {\n if (keep) {\n if (keep.includes(key)) finalProps[key] = await getMarkerValue(value)();\n continue;\n }\n const meta = getMarkerMeta(value) as { group: string };\n const group = meta.group;\n const existing = deferredProps[group];\n if (existing) existing.push(key);\n else deferredProps[group] = [key];\n continue;\n }\n if (kind === 'merge') {\n const meta = getMarkerMeta(value) as { matchOn?: string; deep?: boolean };\n if (keep && !keep.includes(key) && key !== 'errors') continue;\n const resolved = await getMarkerValue(value)();\n finalProps[key] = resolved;\n // Suppress merge metadata if key is in X-Inertia-Reset\n if (!resetKeys.includes(key)) {\n if (meta.deep) deepMergeProps.push(key);\n else mergeProps.push(key);\n }\n if (meta.matchOn !== undefined) matchPropsOn[key] = meta.matchOn;\n continue;\n }\n }\n\n // Non-marker branch: filter by top-level key OR dot-path prefix, then resolve\n // A key passes if:\n // (a) no partial filter (keep is null), OR\n // (b) errors key (always included), OR\n // (c) exact match in keep list, OR\n // (d) a keep entry is a dot-path starting with this key (e.g. keep=[\"user.avatar\"] passes key=\"user\")\n // (e) value contains a nested always() marker (always() must resolve regardless of partial filter)\n const hasNestedKeepPath = keep?.some((k) => k.startsWith(`${key}.`)) ?? false;\n const hasNestedAlways = keep ? containsAlwaysMarker(value) : false;\n if (keep && !keep.includes(key) && key !== 'errors' && !hasNestedKeepPath && !hasNestedAlways)\n continue;\n\n let resolved: unknown = value;\n if (typeof value === 'function') {\n resolved = await (value as () => unknown | Promise<unknown>)();\n }\n\n // v3: recursively resolve nested markers inside plain objects/arrays.\n // Build a \"sub-keep\" list: for paths like \"user.avatar\", when processing key=\"user\",\n // pass \"avatar\" as the sub-path so the nested resolver knows what to include.\n // null means \"include everything (no filter)\", [] would mean include nothing.\n let nestedKeep: string[] | null = null;\n if (keep !== null) {\n if (keep.includes(key)) {\n // Exact match: include all children (null = unfiltered)\n nestedKeep = null;\n } else {\n // Only dot-path sub-entries are in keep; filter children accordingly\n nestedKeep = keep\n .filter((k) => k.startsWith(`${key}.`))\n .map((k) => k.slice(key.length + 1));\n }\n }\n\n if (typeof resolved === 'object' && resolved !== null && !Array.isArray(resolved)) {\n // Walk nested object for markers\n resolved = await resolveNestedObjectValue(\n resolved as Record<string, unknown>,\n key,\n nestedKeep,\n deferredProps,\n );\n }\n\n finalProps[key] = resolved;\n }\n\n // Dot-notation unpacking (top-level keys with '.')\n const unpackedProps = unpackDotKeys(finalProps);\n\n // undefined → null wire conversion\n const wireProps = nullifyUndefined(unpackedProps);\n\n const page: PageObject = {\n component,\n props: wireProps,\n url: this.req.originalUrl,\n version: this.deps.assetVersion,\n };\n if (Object.keys(deferredProps).length > 0) page.deferredProps = deferredProps;\n if (mergeProps.length > 0) page.mergeProps = mergeProps;\n if (deepMergeProps.length > 0) page.deepMergeProps = deepMergeProps;\n if (Object.keys(matchPropsOn).length > 0) page.matchPropsOn = matchPropsOn;\n // v3: only emit encryptHistory / clearHistory when truthy\n const encryptHistory =\n this.encryptHistoryFlag !== undefined\n ? this.encryptHistoryFlag\n : (this.deps.historyEncryptionDefault ?? false);\n if (encryptHistory) page.encryptHistory = true;\n if (this.clearHistoryFlag) page.clearHistory = true;\n\n if (this.req.header('X-Inertia')) {\n this.res.setHeader('X-Inertia', 'true').setHeader('Vary', 'X-Inertia').json(page);\n return;\n }\n\n const ssrModule = await this.deps.ssrLoader.load();\n const ssr = ssrModule ? await ssrModule.render(page) : null;\n const html = await this.deps.rootViewRender({\n page,\n ssr,\n manifest: this.deps.manifest,\n assetVersion: this.deps.assetVersion,\n ctx: { req: this.req.raw, res: this.res.raw },\n });\n this.res.setHeader('Vary', 'X-Inertia').html(html);\n }\n}\n","import type { Props } from '../types.js';\n\nexport function nullifyUndefined(props: Props): Props {\n const out: Props = {};\n for (const [k, v] of Object.entries(props)) {\n out[k] = v === undefined ? null : v;\n }\n return out;\n}\n","import type { Props } from '../types.js';\n\n/** Keys that, if used as property names, would allow prototype-pollution attacks. */\nconst FORBIDDEN_KEYS = new Set(['__proto__', 'prototype', 'constructor']);\n\nfunction assertSafeKey(key: string): void {\n if (FORBIDDEN_KEYS.has(key)) {\n throw new Error(`[nestjs-inertia] Disallowed property key in nested path: \"${key}\"`);\n }\n}\n\nexport function setNested(target: Record<string, unknown>, path: string[], value: unknown): void {\n if (path.length === 0) return;\n let cur: Record<string, unknown> = target;\n for (let i = 0; i < path.length - 1; i++) {\n const key = path[i]!;\n assertSafeKey(key);\n const existing = cur[key];\n if (existing === undefined) {\n cur[key] = {};\n } else if (typeof existing !== 'object' || existing === null || Array.isArray(existing)) {\n throw new Error(\n `[nestjs-inertia] dot-notation conflict at key \"${path.slice(0, i + 1).join('.')}\": expected object, got ${Array.isArray(existing) ? 'array' : typeof existing}`,\n );\n }\n cur = cur[key] as Record<string, unknown>;\n }\n const finalKey = path[path.length - 1]!;\n assertSafeKey(finalKey);\n cur[finalKey] = value;\n}\n\nexport function unpackDotKeys(props: Props): Props {\n const out: Props = {};\n // First pass: detect non-dot keys that would conflict with parent paths\n const dotKeysParents = new Set<string>();\n for (const key of Object.keys(props)) {\n if (key.includes('.')) {\n dotKeysParents.add(key.split('.')[0]!);\n }\n }\n for (const parent of dotKeysParents) {\n if (\n props[parent] !== undefined &&\n (typeof props[parent] !== 'object' || props[parent] === null || Array.isArray(props[parent]))\n ) {\n throw new Error(\n `[nestjs-inertia] dot-notation conflict at key \"${parent}\": exists as scalar AND as parent of a dot key`,\n );\n }\n }\n // Second pass: write\n for (const [key, value] of Object.entries(props)) {\n if (key.includes('.')) {\n setNested(out, key.split('.'), value);\n } else {\n out[key] = value;\n }\n }\n return out;\n}\n","import {\n type DynamicModule,\n Inject,\n Logger,\n type MiddlewareConsumer,\n Module,\n type NestModule,\n type OnApplicationBootstrap,\n type OnApplicationShutdown,\n type Provider,\n RequestMethod,\n} from '@nestjs/common';\nimport { APP_INTERCEPTOR, HttpAdapterHost } from '@nestjs/core';\nimport {\n assetVersionProvider,\n computeAssetVersion,\n loadManifest,\n manifestProvider,\n} from './asset/version.provider.js';\nimport type { Manifest } from './asset/version.provider.js';\nimport { InvalidInertiaConfigException } from './errors/exceptions.js';\nimport { RedirectInterceptor } from './interceptor/redirect.interceptor.js';\nimport { InertiaRenderInterceptor } from './interceptor/render.interceptor.js';\nimport { InertiaScopeSwitcherInterceptor } from './interceptor/scope-switcher.interceptor.js';\nimport { InertiaMiddleware } from './middleware/express.middleware.js';\nimport { registerFastifyInertia } from './middleware/fastify.middleware.js';\nimport { MethodSpoofMiddleware } from './middleware/method-spoof.middleware.js';\nimport { FileBasedShellRenderer } from './shell/file-shell.renderer.js';\nimport { DefaultShellRenderer } from './shell/shell.js';\nimport type { ShellRenderer } from './shell/shell.js';\nimport { SsrLoaderService } from './ssr/ssr-loader.service.js';\nimport {\n INERTIA_ASSET_VERSION,\n INERTIA_MANIFEST,\n INERTIA_MODULE_OPTIONS,\n assertScopeNotReserved,\n featureToken,\n} from './tokens.js';\nimport type {\n InertiaFeatureAsyncOptions,\n InertiaFeatureOptions,\n InertiaModuleAsyncOptions,\n InertiaModuleOptions,\n InertiaOptionsFactory,\n RootViewFn,\n ShellRenderCtx,\n} from './types.js';\n\n/** Minimal interface matching `Watcher` from `@dudousxd/nestjs-inertia-codegen`. */\ninterface CodegenWatcher {\n close(): Promise<void>;\n}\n\n/** Minimal interface matching the codegen module's public API used here. */\ninterface CodegenModule {\n loadConfig(cwd?: string): Promise<unknown>;\n watch(config: unknown): Promise<CodegenWatcher>;\n}\n\n@Module({})\nexport class InertiaModule implements NestModule, OnApplicationBootstrap, OnApplicationShutdown {\n /**\n * Shared provider set for both `forRoot` and `forRootAsync`.\n * Does NOT include the options provider(s) — callers prepend those themselves.\n */\n private static buildModuleProviders(): Provider[] {\n const shellProvider: Provider = {\n provide: 'INERTIA_SHELL_RENDERER',\n inject: [INERTIA_MODULE_OPTIONS],\n useFactory: (opts: InertiaModuleOptions): ShellRenderer => {\n const rv = opts.rootView;\n if (typeof rv === 'function') {\n const fn = rv as RootViewFn;\n return { render: async (ctx: ShellRenderCtx) => fn(ctx) };\n }\n if (typeof rv === 'string') {\n return new FileBasedShellRenderer(rv);\n }\n return new DefaultShellRenderer();\n },\n };\n\n const ssrProvider: Provider = {\n provide: 'INERTIA_SSR_LOADER',\n useClass: SsrLoaderService,\n };\n\n return [\n manifestProvider,\n assetVersionProvider,\n shellProvider,\n ssrProvider,\n InertiaMiddleware,\n MethodSpoofMiddleware,\n {\n provide: APP_INTERCEPTOR,\n useClass: InertiaScopeSwitcherInterceptor,\n },\n {\n provide: APP_INTERCEPTOR,\n useClass: InertiaRenderInterceptor,\n },\n {\n provide: APP_INTERCEPTOR,\n useClass: RedirectInterceptor,\n },\n ];\n }\n\n private static readonly moduleExports = [\n INERTIA_MODULE_OPTIONS,\n INERTIA_MANIFEST,\n INERTIA_ASSET_VERSION,\n 'INERTIA_SHELL_RENDERER',\n 'INERTIA_SSR_LOADER',\n InertiaMiddleware,\n ] as const;\n\n static forRoot(options: InertiaModuleOptions = {}): DynamicModule {\n const optionsProvider: Provider = {\n provide: INERTIA_MODULE_OPTIONS,\n useValue: options,\n };\n\n return {\n module: InertiaModule,\n global: true,\n providers: [optionsProvider, ...InertiaModule.buildModuleProviders()],\n exports: [...InertiaModule.moduleExports],\n };\n }\n\n static forRootAsync(asyncOptions: InertiaModuleAsyncOptions): DynamicModule {\n InertiaModule.validateAsyncOptions(asyncOptions);\n\n const optionsProviders: Provider[] = InertiaModule.createAsyncOptionsProviders(asyncOptions);\n\n // Register inject tokens as providers so NestJS can resolve them within this module\n const injectProviders: Provider[] = (asyncOptions.inject ?? [])\n .filter((token): token is new (...args: unknown[]) => unknown => typeof token === 'function')\n .map((token) => token as unknown as Provider);\n\n return {\n module: InertiaModule,\n global: true,\n imports: (asyncOptions.imports as DynamicModule['imports'] | undefined) ?? [],\n providers: [...injectProviders, ...optionsProviders, ...InertiaModule.buildModuleProviders()],\n exports: [...InertiaModule.moduleExports],\n };\n }\n\n static forFeature(options: InertiaFeatureOptions): DynamicModule {\n assertScopeNotReserved(options.scope);\n const optionsProvider: Provider = {\n provide: featureToken('OPTIONS', options.scope),\n useValue: options,\n };\n return {\n module: InertiaModule,\n global: true,\n providers: [optionsProvider, ...InertiaModule.createFeatureProviders(options.scope)],\n exports: [\n featureToken('OPTIONS', options.scope),\n featureToken('MANIFEST', options.scope),\n featureToken('ASSET_VERSION', options.scope),\n featureToken('SHELL_RENDERER', options.scope),\n featureToken('SSR_LOADER', options.scope),\n ],\n };\n }\n\n static forFeatureAsync(asyncOptions: InertiaFeatureAsyncOptions): DynamicModule {\n assertScopeNotReserved(asyncOptions.scope);\n\n const has = (k: 'useFactory' | 'useClass' | 'useExisting'): boolean =>\n asyncOptions[k] !== undefined;\n const declared = [has('useFactory'), has('useClass'), has('useExisting')].filter(\n Boolean,\n ).length;\n if (declared === 0) {\n throw new InvalidInertiaConfigException(\n 'forFeatureAsync requires one of: useFactory, useClass, useExisting',\n );\n }\n if (declared > 1) {\n throw new InvalidInertiaConfigException(\n 'forFeatureAsync accepts exactly one of: useFactory, useClass, useExisting (got multiple)',\n );\n }\n\n const scope = asyncOptions.scope;\n const optionsToken = featureToken('OPTIONS', scope);\n\n // Re-register inject tokens as providers within this module so NestJS can resolve them\n const injectProviders: Provider[] = (asyncOptions.inject ?? [])\n .filter((token): token is new (...args: unknown[]) => unknown => typeof token === 'function')\n .map((token) => token as unknown as Provider);\n\n let optionsProviders: Provider[];\n if (asyncOptions.useFactory) {\n optionsProviders = [\n {\n provide: optionsToken,\n useFactory: async (...args: unknown[]) => {\n const opts = await asyncOptions.useFactory!(...args);\n return { ...opts, scope };\n },\n inject: (asyncOptions.inject ?? []) as never[],\n },\n ];\n } else if (asyncOptions.useClass) {\n optionsProviders = [\n asyncOptions.useClass as unknown as Provider,\n {\n provide: optionsToken,\n useFactory: async (factory: { createInertiaOptions: () => unknown }) => ({\n ...((await factory.createInertiaOptions()) as object),\n scope,\n }),\n inject: [asyncOptions.useClass] as never[],\n },\n ];\n } else if (asyncOptions.useExisting) {\n optionsProviders = [\n {\n provide: optionsToken,\n useFactory: async (factory: { createInertiaOptions: () => unknown }) => ({\n ...((await factory.createInertiaOptions()) as object),\n scope,\n }),\n inject: [asyncOptions.useExisting] as never[],\n },\n ];\n } else {\n // unreachable — validation above ensures exactly one strategy\n optionsProviders = [];\n }\n\n return {\n module: InertiaModule,\n global: true,\n imports: (asyncOptions.imports as DynamicModule['imports'] | undefined) ?? [],\n providers: [\n ...injectProviders,\n ...optionsProviders,\n ...InertiaModule.createFeatureProviders(scope),\n ],\n exports: [\n optionsToken,\n featureToken('MANIFEST', scope),\n featureToken('ASSET_VERSION', scope),\n featureToken('SHELL_RENDERER', scope),\n featureToken('SSR_LOADER', scope),\n ],\n };\n }\n\n private static createFeatureProviders(scope: string): Provider[] {\n return [\n {\n provide: featureToken('MANIFEST', scope),\n inject: [featureToken('OPTIONS', scope)],\n useFactory: (opts: InertiaFeatureOptions) => {\n if (process.env.NODE_ENV !== 'production') return null;\n return loadManifest(opts.vite?.manifestPath ?? 'dist/inertia/client/.vite/manifest.json');\n },\n },\n {\n provide: featureToken('ASSET_VERSION', scope),\n inject: [featureToken('MANIFEST', scope), featureToken('OPTIONS', scope)],\n useFactory: async (\n manifest: Manifest | null,\n opts: InertiaFeatureOptions,\n ): Promise<string> => {\n if (opts.version !== undefined) {\n return typeof opts.version === 'function' ? await opts.version() : opts.version;\n }\n return computeAssetVersion(manifest);\n },\n },\n {\n provide: featureToken('SHELL_RENDERER', scope),\n inject: [featureToken('OPTIONS', scope)],\n useFactory: (opts: InertiaFeatureOptions): ShellRenderer => {\n const rv = opts.rootView;\n if (typeof rv === 'function') {\n const fn = rv as RootViewFn;\n return { render: async (ctx: ShellRenderCtx) => fn(ctx) };\n }\n if (typeof rv === 'string') {\n return new FileBasedShellRenderer(rv);\n }\n return new DefaultShellRenderer();\n },\n },\n {\n provide: featureToken('SSR_LOADER', scope),\n inject: [featureToken('OPTIONS', scope)],\n useFactory: (opts: InertiaFeatureOptions) => new SsrLoaderService(opts as never),\n },\n ];\n }\n\n private static validateAsyncOptions(asyncOptions: InertiaModuleAsyncOptions): void {\n const has = (k: keyof InertiaModuleAsyncOptions): boolean => asyncOptions[k] !== undefined;\n const declared = [has('useFactory'), has('useClass'), has('useExisting')].filter(\n Boolean,\n ).length;\n if (declared === 0) {\n throw new InvalidInertiaConfigException(\n 'forRootAsync requires one of: useFactory, useClass, useExisting',\n );\n }\n if (declared > 1) {\n throw new InvalidInertiaConfigException(\n 'forRootAsync accepts exactly one of: useFactory, useClass, useExisting (got multiple)',\n );\n }\n }\n\n private static createAsyncOptionsProviders(asyncOptions: InertiaModuleAsyncOptions): Provider[] {\n if (asyncOptions.useFactory) {\n return [\n {\n provide: INERTIA_MODULE_OPTIONS,\n useFactory: asyncOptions.useFactory,\n inject: (asyncOptions.inject ?? []) as never[],\n },\n ];\n }\n if (asyncOptions.useClass) {\n return [\n asyncOptions.useClass as unknown as Provider,\n {\n provide: INERTIA_MODULE_OPTIONS,\n useFactory: async (factory: InertiaOptionsFactory) => factory.createInertiaOptions(),\n inject: [asyncOptions.useClass] as never[],\n },\n ];\n }\n // useExisting: register the class as a provider so NestJS can resolve it within this module,\n // then use useFactory to call createInertiaOptions() on it (mirrors the useExisting intent).\n return [\n asyncOptions.useExisting! as unknown as Provider,\n {\n provide: INERTIA_MODULE_OPTIONS,\n useFactory: async (factory: InertiaOptionsFactory) => factory.createInertiaOptions(),\n inject: [asyncOptions.useExisting!] as never[],\n },\n ];\n }\n\n private readonly logger = new Logger(InertiaModule.name);\n private codegenWatcher: CodegenWatcher | null = null;\n\n constructor(\n @Inject(HttpAdapterHost) private readonly httpAdapterHost: HttpAdapterHost,\n @Inject(INERTIA_MODULE_OPTIONS) private readonly options: InertiaModuleOptions,\n @Inject(INERTIA_ASSET_VERSION) private readonly assetVersion: string,\n @Inject(INERTIA_MANIFEST) private readonly manifest: Manifest | null,\n @Inject('INERTIA_SHELL_RENDERER') private readonly shellRenderer: ShellRenderer,\n @Inject('INERTIA_SSR_LOADER') private readonly ssrLoader: { load: () => Promise<never> },\n ) {}\n\n /**\n * Test seam: override in a subclass or via `Object.defineProperty` to inject a stub\n * codegen module without touching NestJS DI. Production callers never touch this.\n *\n * @internal\n */\n protected _resolveCodegenModule(): Promise<CodegenModule> {\n // Use a computed specifier so bundlers (esbuild/Vite) skip static analysis.\n // eslint-disable-next-line @typescript-eslint/no-implied-eval, no-new-func\n const dynamicImport = new Function('s', 'return import(s)') as (\n s: string\n ) => Promise<unknown>;\n return dynamicImport('@dudousxd/nestjs-inertia-codegen') as Promise<CodegenModule>;\n }\n\n async onApplicationBootstrap(): Promise<void> {\n // ── Fastify wiring (unchanged) ──────────────────────────────────────────────\n const adapter = this.httpAdapterHost.httpAdapter;\n if (adapter) {\n const platform = adapter.getType();\n if (platform === 'fastify') {\n const fastifyApp = adapter.getInstance() as unknown as Parameters<\n typeof registerFastifyInertia\n >[0];\n registerFastifyInertia(fastifyApp, () => ({\n assetVersion: this.assetVersion,\n manifest: this.manifest,\n ssrLoader: this.ssrLoader,\n rootViewRender: (ctx) => this.shellRenderer.render(ctx),\n moduleShare: this.options.share,\n featureShare: undefined,\n historyEncryptionDefault: this.options.historyEncryption?.default ?? false,\n flashStore: this.options.flashStore,\n }));\n // Phase 21: also register method spoof\n const { registerFastifyMethodSpoof } = await import(\n './middleware/fastify-method-spoof.middleware.js'\n );\n registerFastifyMethodSpoof(\n fastifyApp as Parameters<typeof registerFastifyMethodSpoof>[0],\n this.options,\n );\n }\n }\n\n // ── Codegen auto-bootstrap ──────────────────────────────────────────────────\n await this._startCodegenWatcher();\n }\n\n /**\n * Auto-starts the codegen file watcher in dev mode.\n *\n * Rules (all must pass for the watcher to start):\n * 1. `process.env.NODE_ENV !== 'production'`\n * 2. `options.codegen?.enabled !== false`\n * 3. `@dudousxd/nestjs-inertia-codegen` is resolvable (peer-optional)\n * 4. A `nestjs-inertia.config.ts` (or equivalent) is present in `process.cwd()`\n *\n * If the CLI watcher already holds the lock file, the codegen package returns a\n * no-op watcher — no conflict occurs.\n *\n * This method NEVER throws; any unexpected error is logged as a warning.\n */\n private async _startCodegenWatcher(): Promise<void> {\n try {\n // 1. Skip in production\n if (process.env.NODE_ENV === 'production') return;\n\n // 2. Honor kill-switch env var (in addition to options.codegen.enabled === false)\n if (process.env.NESTJS_INERTIA_DISABLE_AUTO_CODEGEN === '1') return;\n\n // 3. Skip if explicitly disabled\n if (this.options.codegen?.enabled === false) return;\n\n // 4. Lazy-import the codegen package (peer-optional — do not fail if missing).\n // _resolveCodegenModule() uses a cast to prevent TS from resolving the module\n // at compile time. Override it in tests via subclass to inject a stub.\n let codegen: CodegenModule;\n try {\n codegen = await this._resolveCodegenModule();\n } catch (err: unknown) {\n // Package not installed — log warn so devs can debug unexpected import failures\n const message = err instanceof Error ? err.message : String(err);\n this.logger.warn(\n `Codegen auto-watch: failed to import @dudousxd/nestjs-inertia-codegen: ${message}`,\n );\n return;\n }\n\n // 5. Load config — skip if no config file present, warn on other failures\n let config: unknown;\n try {\n config = await codegen.loadConfig(process.cwd());\n } catch (err: unknown) {\n const message = err instanceof Error ? err.message : String(err);\n this.logger.warn(`Codegen auto-watch: failed to load config: ${message}`);\n return;\n }\n\n // 6. Start the watcher (lock-file mechanism ensures a second watcher is a no-op)\n this.codegenWatcher = await codegen.watch(config);\n this.logger.log('Codegen auto-watch started (dev mode).');\n } catch (err: unknown) {\n const message = err instanceof Error ? err.message : String(err);\n this.logger.warn(\n `Codegen auto-watch failed to start: ${message}. Install @dudousxd/nestjs-inertia-codegen and add nestjs-inertia.config.ts to enable auto-watch, or set codegen: { enabled: false } to suppress this warning.`,\n );\n }\n }\n\n async onApplicationShutdown(): Promise<void> {\n await this.codegenWatcher?.close();\n this.codegenWatcher = null;\n }\n\n configure(consumer: MiddlewareConsumer): void {\n const adapter = this.httpAdapterHost.httpAdapter;\n if (!adapter || adapter.getType() === 'express') {\n consumer\n .apply(MethodSpoofMiddleware)\n .forRoutes({ path: '{*path}', method: RequestMethod.ALL });\n consumer.apply(InertiaMiddleware).forRoutes({ path: '{*path}', method: RequestMethod.ALL });\n }\n // Fastify wiring happens in onApplicationBootstrap\n }\n}\n","import { createHash, randomUUID } from 'node:crypto';\nimport { readFileSync } from 'node:fs';\nimport { isAbsolute, resolve } from 'node:path';\nimport type { Provider } from '@nestjs/common';\nimport { INERTIA_ASSET_VERSION, INERTIA_MANIFEST, INERTIA_MODULE_OPTIONS } from '../tokens.js';\nimport type { InertiaModuleOptions } from '../types.js';\n\nexport interface ManifestEntry {\n file: string;\n css?: string[];\n imports?: string[];\n}\nexport type Manifest = Record<string, ManifestEntry>;\n\nconst DEFAULT_MANIFEST_PATH = 'dist/inertia/client/.vite/manifest.json';\n\n/**\n * Validates that a parsed manifest has the expected Vite manifest shape.\n * Each entry must be a non-null object with a string `file` property.\n * Throws with a clear error if any entry is malformed.\n */\nfunction assertManifestShape(parsed: unknown, path: string): Manifest {\n if (typeof parsed !== 'object' || parsed === null || Array.isArray(parsed)) {\n throw new Error(\n `Vite manifest at ${path} has unexpected shape: expected a JSON object, got ${Array.isArray(parsed) ? 'array' : typeof parsed}`,\n );\n }\n for (const [key, entry] of Object.entries(parsed as Record<string, unknown>)) {\n if (typeof entry !== 'object' || entry === null || Array.isArray(entry)) {\n throw new Error(\n `Vite manifest at ${path} has unexpected shape: entry \"${key}\" is not an object`,\n );\n }\n const e = entry as Record<string, unknown>;\n if (typeof e.file !== 'string') {\n throw new Error(\n `Vite manifest at ${path} has unexpected shape: entry \"${key}\" is missing required string field \"file\"`,\n );\n }\n }\n return parsed as Manifest;\n}\n\nexport function loadManifest(path: string): Manifest | null {\n try {\n const abs = isAbsolute(path) ? path : resolve(process.cwd(), path);\n const raw = readFileSync(abs, 'utf8');\n const parsed = JSON.parse(raw) as unknown;\n return assertManifestShape(parsed, abs);\n } catch (err) {\n // Propagate shape validation errors — they indicate a misconfigured build\n if (err instanceof Error && err.message.includes('Vite manifest at')) {\n throw err;\n }\n return null;\n }\n}\n\nexport function computeAssetVersion(manifest: Manifest | null): string {\n if (manifest) {\n return createHash('sha1').update(JSON.stringify(manifest)).digest('hex').slice(0, 32);\n }\n return randomUUID().replace(/-/g, '');\n}\n\nexport const manifestProvider: Provider = {\n provide: INERTIA_MANIFEST,\n inject: [INERTIA_MODULE_OPTIONS],\n useFactory: (opts: InertiaModuleOptions): Manifest | null => {\n if (process.env.NODE_ENV !== 'production') return null;\n const path = opts.vite?.manifestPath ?? DEFAULT_MANIFEST_PATH;\n return loadManifest(path);\n },\n};\n\nexport const assetVersionProvider: Provider = {\n provide: INERTIA_ASSET_VERSION,\n inject: [INERTIA_MANIFEST, INERTIA_MODULE_OPTIONS],\n useFactory: async (manifest: Manifest | null, opts: InertiaModuleOptions): Promise<string> => {\n if (opts.version !== undefined) {\n return typeof opts.version === 'function' ? await opts.version() : opts.version;\n }\n return computeAssetVersion(manifest);\n },\n};\n","import {\n type CallHandler,\n type ExecutionContext,\n Inject,\n Injectable,\n type NestInterceptor,\n} from '@nestjs/common';\nimport { HttpAdapterHost, ModuleRef, Reflector } from '@nestjs/core';\nimport type { Observable } from 'rxjs';\nimport { expressAdapter } from '../adapter/express.js';\nimport { fastifyAdapter } from '../adapter/fastify.js';\nimport type { Manifest } from '../asset/version.provider.js';\nimport { INERTIA_USE_SCOPE } from '../decorator/use-inertia.decorator.js';\nimport { InertiaService, type InertiaServiceDeps } from '../service.js';\nimport type { ShellRenderer } from '../shell/shell.js';\nimport { featureToken } from '../tokens.js';\nimport type { InertiaModuleOptions } from '../types.js';\n\n@Injectable()\nexport class InertiaScopeSwitcherInterceptor implements NestInterceptor {\n constructor(\n @Inject(Reflector) private readonly reflector: Reflector,\n @Inject(ModuleRef) private readonly moduleRef: ModuleRef,\n @Inject(HttpAdapterHost) private readonly httpAdapterHost: HttpAdapterHost,\n ) {}\n\n intercept(ctx: ExecutionContext, next: CallHandler): Observable<unknown> {\n const scope = this.reflector.getAllAndOverride<string>(INERTIA_USE_SCOPE, [\n ctx.getHandler(),\n ctx.getClass(),\n ]);\n if (scope && scope !== 'default') {\n const opts = this.moduleRef.get<InertiaModuleOptions>(featureToken('OPTIONS', scope), {\n strict: false,\n });\n const manifest = this.moduleRef.get<Manifest | null>(featureToken('MANIFEST', scope), {\n strict: false,\n });\n const assetVersion = this.moduleRef.get<string>(featureToken('ASSET_VERSION', scope), {\n strict: false,\n });\n const shellRenderer = this.moduleRef.get<ShellRenderer>(\n featureToken('SHELL_RENDERER', scope),\n { strict: false },\n );\n const ssrLoader = this.moduleRef.get<{ load: () => Promise<never> }>(\n featureToken('SSR_LOADER', scope),\n { strict: false },\n );\n\n const req = ctx.switchToHttp().getRequest();\n const res = ctx.switchToHttp().getResponse();\n const deps: InertiaServiceDeps = {\n assetVersion,\n manifest,\n ssrLoader,\n rootViewRender: (c) => shellRenderer.render(c),\n moduleShare: (opts as { share?: unknown }).share as InertiaModuleOptions['share'],\n featureShare: undefined,\n historyEncryptionDefault:\n (opts as { historyEncryption?: { default?: boolean } }).historyEncryption?.default ??\n false,\n flashStore: (opts as { flashStore?: InertiaModuleOptions['flashStore'] }).flashStore,\n };\n const platform = this.httpAdapterHost.httpAdapter?.getType();\n const adapter = platform === 'fastify' ? fastifyAdapter : expressAdapter;\n\n req.inertia = new InertiaService(adapter.adaptRequest(req), adapter.adaptResponse(res), deps);\n }\n return next.handle();\n }\n}\n","import type { InertiaRequest, InertiaResponse, RequestAdapter } from './adapter.js';\n\ntype ExpressReq = {\n method: string;\n originalUrl: string;\n url: string;\n headers: Record<string, string | string[] | undefined>;\n body?: unknown;\n query?: Record<string, unknown>;\n header?: (name: string) => string | undefined;\n};\n\ntype ExpressRes = {\n statusCode: number;\n headersSent: boolean;\n status(code: number): ExpressRes;\n setHeader(name: string, value: string): ExpressRes;\n getHeader(name: string): string | string[] | number | undefined;\n json(body: unknown): ExpressRes;\n send(body: string): ExpressRes;\n end(): void;\n type(t: string): ExpressRes;\n};\n\nexport const expressAdapter: RequestAdapter = {\n adaptRequest(raw): InertiaRequest {\n const r = raw as ExpressReq;\n const req: InertiaRequest = {\n method: r.method,\n originalUrl: r.originalUrl,\n url: r.url,\n header(name) {\n if (typeof r.header === 'function') return r.header(name);\n const v = r.headers[name.toLowerCase()];\n return Array.isArray(v) ? v[0] : v;\n },\n raw,\n };\n if (r.body !== undefined) req.body = r.body;\n if (r.query !== undefined) req.query = r.query;\n return req;\n },\n adaptResponse(raw): InertiaResponse {\n const r = raw as ExpressRes;\n const wrapper: InertiaResponse = {\n get statusCode() {\n return r.statusCode;\n },\n get headersSent() {\n return r.headersSent;\n },\n status(code) {\n r.status(code);\n return wrapper;\n },\n setHeader(name, value) {\n r.setHeader(name, value);\n return wrapper;\n },\n getHeader(name) {\n return r.getHeader(name);\n },\n json(body) {\n r.json(body);\n },\n html(body) {\n r.setHeader('Content-Type', 'text/html; charset=utf-8');\n r.send(body);\n },\n end() {\n r.end();\n },\n raw,\n };\n return wrapper;\n },\n};\n","import type { InertiaRequest, InertiaResponse, RequestAdapter } from './adapter.js';\n\ntype FastifyReq = {\n method: string;\n url: string;\n headers: Record<string, string | string[] | undefined>;\n body?: unknown;\n query?: Record<string, unknown>;\n raw?: { originalUrl?: string };\n};\n\ntype FastifyReply = {\n statusCode: number;\n sent: boolean;\n status(code: number): FastifyReply;\n code(code: number): FastifyReply;\n header(name: string, value: string): FastifyReply;\n getHeader(name: string): string | string[] | number | undefined;\n send(body: unknown): FastifyReply;\n type(t: string): FastifyReply;\n};\n\nexport const fastifyAdapter: RequestAdapter = {\n adaptRequest(raw): InertiaRequest {\n const r = raw as FastifyReq;\n const req: InertiaRequest = {\n method: r.method,\n originalUrl: r.raw?.originalUrl ?? r.url,\n url: r.url,\n header(name) {\n const v = r.headers[name.toLowerCase()];\n return Array.isArray(v) ? v[0] : v;\n },\n raw,\n };\n if (r.body !== undefined) req.body = r.body;\n if (r.query !== undefined) req.query = r.query;\n return req;\n },\n adaptResponse(raw): InertiaResponse {\n const r = raw as FastifyReply;\n const wrapper: InertiaResponse = {\n get statusCode() {\n return r.statusCode;\n },\n get headersSent() {\n return r.sent;\n },\n status(code) {\n r.code(code);\n return wrapper;\n },\n setHeader(name, value) {\n r.header(name, value);\n return wrapper;\n },\n getHeader(name) {\n return r.getHeader(name);\n },\n json(body) {\n r.send(body);\n },\n html(body) {\n r.header('Content-Type', 'text/html; charset=utf-8');\n r.send(body);\n },\n end() {\n r.send('');\n },\n raw,\n };\n return wrapper;\n },\n};\n","import { Inject, Injectable, type NestMiddleware } from '@nestjs/common';\nimport type { NextFunction, Request, Response } from 'express';\nimport { expressAdapter } from '../adapter/express.js';\nimport type { Manifest } from '../asset/version.provider.js';\nimport { suppressPostSendWrites } from '../helpers/suppress-post-send-writes.js';\nimport { InertiaService } from '../service.js';\nimport type { SsrLoader } from '../service.js';\nimport type { ShellRenderer } from '../shell/shell.js';\nimport { INERTIA_ASSET_VERSION, INERTIA_MANIFEST, INERTIA_MODULE_OPTIONS } from '../tokens.js';\nimport type { InertiaModuleOptions } from '../types.js';\n\n@Injectable()\nexport class InertiaMiddleware implements NestMiddleware {\n constructor(\n @Inject(INERTIA_ASSET_VERSION) private readonly assetVersion: string,\n @Inject(INERTIA_MANIFEST) private readonly manifest: Manifest | null,\n @Inject(INERTIA_MODULE_OPTIONS) private readonly options: InertiaModuleOptions,\n @Inject('INERTIA_SHELL_RENDERER') private readonly shellRenderer: ShellRenderer,\n @Inject('INERTIA_SSR_LOADER') private readonly ssrLoader: SsrLoader,\n ) {}\n\n use(req: Request, res: Response, next: NextFunction): void {\n const adaptedReq = expressAdapter.adaptRequest(req);\n const adaptedRes = expressAdapter.adaptResponse(res);\n\n (req as Request & { inertia?: InertiaService }).inertia = new InertiaService(\n adaptedReq,\n adaptedRes,\n {\n assetVersion: this.assetVersion,\n manifest: this.manifest,\n ssrLoader: this.ssrLoader,\n rootViewRender: (ctx) => this.shellRenderer.render(ctx),\n moduleShare: this.options.share,\n featureShare: undefined,\n historyEncryptionDefault: this.options.historyEncryption?.default ?? false,\n flashStore: this.options.flashStore,\n },\n );\n\n suppressPostSendWrites(res as unknown as Parameters<typeof suppressPostSendWrites>[0]);\n next();\n }\n}\n","type Anyfn = (...args: unknown[]) => unknown;\n\ntype Patchable = {\n headersSent: boolean;\n status: Anyfn;\n json: Anyfn;\n send: Anyfn;\n header: Anyfn;\n setHeader: Anyfn;\n end: Anyfn;\n};\n\nconst KEYS = ['status', 'json', 'send', 'header', 'setHeader', 'end'] as const;\n\nexport function suppressPostSendWrites(res: Patchable): void {\n for (const key of KEYS) {\n const original = (res[key] as Anyfn).bind(res);\n (res as unknown as Record<string, Anyfn>)[key] = (...args: unknown[]) =>\n res.headersSent ? res : original(...args);\n }\n}\n","import { fastifyAdapter } from '../adapter/fastify.js';\nimport type { InertiaServiceDeps } from '../service.js';\nimport { InertiaService } from '../service.js';\n\ninterface FastifyApp {\n decorateRequest: (key: string, value: unknown) => void;\n addHook: (event: string, handler: (req: unknown, reply: unknown) => Promise<void> | void) => void;\n}\n\nexport function registerFastifyInertia(\n app: FastifyApp,\n depsFactory: () => InertiaServiceDeps,\n): void {\n // Guard against double-registration when forRoot + forFeature both call onApplicationBootstrap\n const appAsAny = app as unknown as { _inertiaRegistered?: boolean };\n if (appAsAny._inertiaRegistered) return;\n appAsAny._inertiaRegistered = true;\n\n app.decorateRequest('inertia', null);\n app.addHook('onRequest', async (req: unknown, reply: unknown) => {\n const adaptedReq = fastifyAdapter.adaptRequest(req);\n const adaptedRes = fastifyAdapter.adaptResponse(reply);\n (req as unknown as { inertia: InertiaService }).inertia = new InertiaService(\n adaptedReq,\n adaptedRes,\n depsFactory(),\n );\n });\n}\n","import { readFileSync } from 'node:fs';\nimport { extname, isAbsolute, resolve } from 'node:path';\nimport type { Manifest } from '../asset/version.provider.js';\nimport { UnsupportedRootViewExtensionException } from '../errors/exceptions.js';\nimport type { ShellRenderCtx } from '../types.js';\nimport { processDirectives } from './directives.js';\nimport { serializePageData } from './serialize-page.js';\nimport type { ShellRenderer } from './shell.js';\nimport type { TemplateEngineAdapter } from './template-engine.adapter.js';\nimport { resolveTemplateEngine } from './template-engine.registry.js';\n\nconst PLAIN_HTML = new Set(['.html', '.htm']);\nconst TEMPLATE_EXTENSIONS = new Set([\n '.hbs',\n '.handlebars',\n '.ejs',\n '.pug',\n '.liquid',\n '.liquidjs',\n]);\n\nexport class FileBasedShellRenderer implements ShellRenderer {\n private cachedTemplate: string | null = null;\n private engineRenderer: ((locals: Record<string, unknown>) => string | Promise<string>) | null =\n null;\n private adapterPromise: Promise<TemplateEngineAdapter> | null = null;\n private readonly absPath: string;\n private readonly ext: string;\n\n constructor(rootViewPath: string) {\n const ext = extname(rootViewPath).toLowerCase();\n if (!PLAIN_HTML.has(ext) && !TEMPLATE_EXTENSIONS.has(ext)) {\n throw new UnsupportedRootViewExtensionException(ext);\n }\n this.ext = ext;\n this.absPath = isAbsolute(rootViewPath) ? rootViewPath : resolve(process.cwd(), rootViewPath);\n }\n\n async render(ctx: ShellRenderCtx): Promise<string> {\n if (this.cachedTemplate === null) {\n this.cachedTemplate = readFileSync(this.absPath, 'utf8');\n }\n\n const pageJson = serializePageData(ctx.page);\n const ssrHead = ctx.ssr?.head.join('\\n') ?? '';\n const ssrBody = ctx.ssr?.body ?? null;\n const isDev = process.env.NODE_ENV !== 'production';\n const manifest = ctx.manifest as Manifest | null;\n\n if (PLAIN_HTML.has(this.ext)) {\n return processDirectives(this.cachedTemplate, {\n pageJson,\n ssrHead,\n ssrBody,\n manifest,\n isDev,\n });\n }\n\n // Template engine path\n if (this.adapterPromise === null) {\n this.adapterPromise = resolveTemplateEngine(this.ext);\n }\n if (this.engineRenderer === null) {\n const adapter = await this.adapterPromise;\n this.engineRenderer = adapter.compile(this.cachedTemplate, this.absPath);\n }\n\n const inertiaHtml =\n ssrBody ??\n `<div id=\"app\"></div>\\n<script id=\"inertia-page\" type=\"application/json\">${pageJson}</script>`;\n const directiveCtx = { pageJson, ssrHead, ssrBody, manifest, isDev };\n const locals: Record<string, unknown> = {\n page: ctx.page,\n inertia: inertiaHtml,\n inertiaHead: ssrHead,\n vite: (entry: string) => processDirectives(`@vite('${entry}')`, directiveCtx),\n viteRefresh: processDirectives('@viteRefresh', directiveCtx),\n asset: (p: string) => processDirectives(`@asset('${p}')`, directiveCtx),\n };\n\n let output = await this.engineRenderer(locals);\n // Run directive parser on output too — supports devs who mix template syntax with @inertia\n output = processDirectives(output, directiveCtx);\n return output;\n }\n}\n","import type { Manifest } from '../asset/version.provider.js';\n\nexport interface DirectiveContext {\n pageJson: string;\n ssrHead: string;\n ssrBody: string | null;\n manifest: Manifest | null;\n isDev: boolean;\n}\n\nconst VITE_REFRESH_PREAMBLE = `<script type=\"module\">\nimport RefreshRuntime from \"/@react-refresh\"\nRefreshRuntime.injectIntoGlobalHook(window)\nwindow.$RefreshReg$ = () => {}\nwindow.$RefreshSig$ = () => (type) => type\nwindow.__vite_plugin_react_preamble_installed__ = true\n</script>`;\n\nexport function processDirectives(template: string, ctx: DirectiveContext): string {\n let out = template;\n\n // @inertiaHead FIRST (more specific — prevents @inertia from consuming the 'H')\n out = out.replace(/@inertiaHead\\b/g, () => ctx.ssrHead);\n\n // @inertia (no args) — lookahead ensures we don't match inside @inertiaHead (already consumed)\n out = out.replace(/@inertia(?![a-zA-Z(])/g, () => {\n if (ctx.ssrBody) return ctx.ssrBody;\n return `<div id=\"app\"></div>\\n<script id=\"inertia-page\" type=\"application/json\">${ctx.pageJson}</script>`;\n });\n\n // @viteRefresh (no args)\n out = out.replace(/@viteRefresh\\b/g, () => (ctx.isDev ? VITE_REFRESH_PREAMBLE : ''));\n\n // @vite('entry')\n out = out.replace(/@vite\\(\\s*['\"]([^'\"]+)['\"]\\s*\\)/g, (_full, entry: string) => {\n if (ctx.isDev) {\n return `<script type=\"module\" src=\"/@vite/client\"></script>\\n<script type=\"module\" src=\"/${entry}\"></script>`;\n }\n const entryRecord = ctx.manifest?.[entry];\n if (!entryRecord) {\n throw new Error(`[nestjs-inertia] manifest entry not found for \"${entry}\"`);\n }\n const scriptTag = `<script type=\"module\" src=\"/${entryRecord.file}\"></script>`;\n const cssTags = (entryRecord.css ?? [])\n .map((href) => `<link rel=\"stylesheet\" href=\"/${href}\" />`)\n .join('\\n');\n return [scriptTag, cssTags].filter(Boolean).join('\\n');\n });\n\n // @asset('path')\n out = out.replace(/@asset\\(\\s*['\"]([^'\"]+)['\"]\\s*\\)/g, (_full, path: string) => {\n if (ctx.isDev) return `/${path}`;\n const entry = ctx.manifest?.[path];\n return entry ? `/${entry.file}` : `/${path}`;\n });\n\n return out;\n}\n","/**\n * Serialize a page object for safe inclusion inside a <script type=\"application/json\"> tag.\n * Escapes characters that could break out of the script element:\n * - `<` -> \\u003c (prevents `</script>` injection)\n * - `>` -> \\u003e (defense in depth)\n * - `&` -> \\u0026 (HTML entity context)\n * - U+2028 -> \\u2028 (legacy JS string terminators)\n * - U+2029 -> \\u2029 (legacy JS string terminators)\n */\n\nconst LS = '\\u2028';\nconst PS = '\\u2029';\n// Build the regex using a RegExp constructor so esbuild handles it fine across encodings\nconst UNSAFE_CHARS = new RegExp(`[<>&${LS}${PS}]`, 'g');\n\nexport function serializePageData(page: unknown): string {\n return JSON.stringify(page).replace(UNSAFE_CHARS, (c: string) => {\n switch (c) {\n case '<':\n return '\\\\u003c';\n case '>':\n return '\\\\u003e';\n case '&':\n return '\\\\u0026';\n case LS:\n return '\\\\u2028';\n case PS:\n return '\\\\u2029';\n default:\n return c;\n }\n });\n}\n","import { UnsupportedRootViewExtensionException } from '../errors/exceptions.js';\nimport type { TemplateEngineAdapter } from './template-engine.adapter.js';\n\ntype Loader = () => Promise<TemplateEngineAdapter>;\n\nconst registry: Record<string, Loader> = {\n '.hbs': () => import('./handlebars.adapter.js').then((m) => m.handlebarsAdapter),\n '.handlebars': () => import('./handlebars.adapter.js').then((m) => m.handlebarsAdapter),\n '.ejs': () => import('./ejs.adapter.js').then((m) => m.ejsAdapter),\n '.pug': () => import('./pug.adapter.js').then((m) => m.pugAdapter),\n '.liquid': () => import('./liquid.adapter.js').then((m) => m.liquidAdapter),\n '.liquidjs': () => import('./liquid.adapter.js').then((m) => m.liquidAdapter),\n};\n\nexport async function resolveTemplateEngine(extension: string): Promise<TemplateEngineAdapter> {\n const loader = registry[extension.toLowerCase()];\n if (!loader) {\n throw new UnsupportedRootViewExtensionException(extension);\n }\n return loader();\n}\n","import type { ShellRenderCtx } from '../types.js';\nimport { serializePageData } from './serialize-page.js';\n\nexport interface ShellRenderer {\n render(ctx: ShellRenderCtx): Promise<string>;\n}\n\nexport class DefaultShellRenderer implements ShellRenderer {\n async render(ctx: ShellRenderCtx): Promise<string> {\n const pageJson = serializePageData(ctx.page);\n return `<!doctype html>\n<html lang=\"en\">\n <head>\n <meta charset=\"utf-8\" />\n <title>Inertia</title>\n </head>\n <body>\n <div id=\"app\"></div>\n <script id=\"inertia-page\" type=\"application/json\">${pageJson}</script>\n </body>\n</html>`;\n }\n}\n","import { readFileSync } from 'node:fs';\nimport { resolve } from 'node:path';\nimport { pathToFileURL } from 'node:url';\nimport { Inject, Injectable, Logger } from '@nestjs/common';\nimport { INERTIA_MODULE_OPTIONS } from '../tokens.js';\nimport type { InertiaModuleOptions, PageObject } from '../types.js';\n\nexport interface SsrModule {\n render(page: PageObject): Promise<{ head: string[]; body: string }>;\n}\n\n/** Returns true when running inside vitest. */\nfunction isVitest(): boolean {\n return process.env.VITEST === 'true' || process.env.NODE_ENV === 'test';\n}\n\n@Injectable()\nexport class SsrLoaderService {\n private readonly logger = new Logger(SsrLoaderService.name);\n private cached: SsrModule | null = null;\n private failed = false;\n\n constructor(@Inject(INERTIA_MODULE_OPTIONS) private readonly opts: InertiaModuleOptions) {}\n\n async load(): Promise<SsrModule | null> {\n if (!this.opts.ssr?.enabled) return null;\n if (this.cached) return this.cached;\n if (this.failed) return null;\n try {\n const bundlePath = resolve(\n process.cwd(),\n this.opts.ssr.bundlePath ?? 'dist/inertia/ssr/ssr.mjs',\n );\n\n let mod: { default?: SsrModule; render?: SsrModule['render'] };\n\n if (isVitest()) {\n // vitest 3's vite-node intercepts `await import(filePath)` even with\n // @vite-ignore, masking real fs errors with \"Cannot find module imported\n // from <source>\". Read the bundle off disk and import via a data: URL —\n // the module is inlined so the resolver has nothing to look up.\n // The bundle is loaded once then cached on `this.cached`, so the readFile\n // cost is one-shot.\n const code = readFileSync(bundlePath, 'utf8');\n const dataUrl = `data:text/javascript;base64,${Buffer.from(code, 'utf8').toString('base64')}`;\n mod = (await import(/* @vite-ignore */ dataUrl)) as {\n default?: SsrModule;\n render?: SsrModule['render'];\n };\n } else {\n // Production / non-vitest: use a file:// URL so Node resolves the bundle\n // path directly without going through any bundler resolver.\n const fileUrl = pathToFileURL(bundlePath).href;\n mod = (await import(/* @vite-ignore */ fileUrl)) as {\n default?: SsrModule;\n render?: SsrModule['render'];\n };\n }\n\n // Bundle may export default or named `render`\n if (mod.default && typeof mod.default.render === 'function') {\n this.cached = mod.default;\n } else if (typeof mod.render === 'function') {\n this.cached = { render: mod.render };\n } else {\n if (this.opts.ssr.throwOnError)\n throw new Error('SSR bundle exports neither default nor render()');\n this.failed = true;\n this.logger.warn('SSR bundle missing required exports; falling back to CSR.');\n return null;\n }\n return this.cached;\n } catch (err) {\n this.failed = true;\n if (this.opts.ssr.throwOnError) throw err;\n this.logger.warn(`SSR bundle not loaded, falling back to CSR: ${(err as Error).message}`);\n return null;\n }\n }\n}\n","import {\n type CallHandler,\n type ExecutionContext,\n Injectable,\n type NestInterceptor,\n} from '@nestjs/common';\nimport type { Observable } from 'rxjs';\nimport { generateCsrfToken, verifyCsrfToken } from './csrf-token.js';\n\ntype CookieResponse = {\n cookie?: (name: string, value: string, opts?: unknown) => unknown;\n setCookie?: (name: string, value: string, opts?: unknown) => unknown;\n};\n\nfunction writeCsrfCookie(\n res: CookieResponse,\n cookieName: string,\n token: string,\n cookieOpts: Record<string, unknown>,\n): void {\n if (typeof res.cookie === 'function') {\n res.cookie(cookieName, token, cookieOpts);\n } else if (typeof res.setCookie === 'function') {\n res.setCookie(cookieName, token, cookieOpts);\n }\n}\n\n/**\n * Force-issue a new CSRF token on the next response, discarding the existing\n * one. Call this when the session principal changes (e.g. after issuing a new\n * session) to prevent token fixation attacks.\n *\n * If you need to invalidate prior tokens (e.g., after session principal change),\n * configure `tokenContext` to return a session-bound value (session ID, nonce) —\n * old tokens fail verification when that value changes.\n *\n * @example\n * ```ts\n * rotateCsrfToken(res, { secret: this.csrfSecret });\n * ```\n */\nexport function rotateCsrfToken(\n res: CookieResponse,\n options: Pick<CsrfCookieOptions, 'secret' | 'cookieName' | 'httpOnly' | 'sameSite' | 'secure'>,\n context?: string,\n): void {\n const cookieName = options.cookieName ?? 'XSRF-TOKEN';\n const token = generateCsrfToken(options.secret, context);\n const cookieOpts = {\n httpOnly: options.httpOnly ?? false,\n sameSite: options.sameSite ?? 'lax',\n secure: options.secure ?? process.env.NODE_ENV === 'production',\n path: '/',\n };\n writeCsrfCookie(res, cookieName, token, cookieOpts);\n}\n\nexport interface CsrfCookieOptions {\n secret: string;\n cookieName?: string;\n headerName?: string;\n sameSite?: 'lax' | 'strict' | 'none';\n httpOnly?: boolean;\n secure?: boolean;\n /**\n * Optional function to extract a session-bound context value from the request.\n * When provided, the HMAC payload includes this value so that tokens become\n * invalid when the context changes (e.g. after a session principal change).\n * Typical values: session ID, session nonce.\n *\n * @example\n * ```ts\n * tokenContext: (req) => req.session?.id ?? ''\n * ```\n */\n tokenContext?: (req: unknown) => string;\n}\n\n@Injectable()\nexport class CsrfCookieInterceptor implements NestInterceptor {\n private readonly cookieName: string;\n\n constructor(private readonly options: CsrfCookieOptions) {\n this.cookieName = options.cookieName ?? 'XSRF-TOKEN';\n }\n\n intercept(context: ExecutionContext, next: CallHandler): Observable<unknown> {\n const req = context.switchToHttp().getRequest<{ cookies?: Record<string, string> }>();\n const res = context.switchToHttp().getResponse<CookieResponse>();\n\n const ctx = this.options.tokenContext ? this.options.tokenContext(req) : undefined;\n const existing = req.cookies?.[this.cookieName];\n if (!existing || !verifyCsrfToken(existing, this.options.secret, ctx)) {\n rotateCsrfToken(res, this.options, ctx);\n }\n return next.handle();\n }\n}\n","import { createHmac, randomBytes, timingSafeEqual } from 'node:crypto';\n\n/**\n * Generates a CSRF token.\n *\n * @param secret The HMAC secret.\n * @param context Optional session-bound context value (e.g. session ID or nonce).\n * When provided, the context is included in the HMAC payload so that\n * tokens become invalid when the context changes (e.g. after a session\n * principal change). Token format: `<raw>.<context-hex>.<sig>`\n * Without context, format is: `<raw>.<sig>`\n */\nexport function generateCsrfToken(secret: string, context?: string): string {\n const raw = randomBytes(32).toString('base64url');\n if (context !== undefined && context !== '') {\n const ctx = Buffer.from(context).toString('hex');\n const sig = createHmac('sha256', secret).update(`${raw}:${context}`).digest('base64url');\n return `${raw}.${ctx}.${sig}`;\n }\n const sig = createHmac('sha256', secret).update(raw).digest('base64url');\n return `${raw}.${sig}`;\n}\n\n/**\n * Constant-time buffer comparison that returns `false` for length mismatches\n * rather than throwing, avoiding a timing oracle on length.\n */\nexport function timingSafeEqualSafe(a: Buffer, b: Buffer): boolean {\n if (a.byteLength !== b.byteLength) return false;\n return timingSafeEqual(a, b);\n}\n\n/**\n * Verifies a CSRF token.\n *\n * @param token The token string (from cookie or header).\n * @param secret The HMAC secret.\n * @param context Optional session-bound context value. Must match the context\n * used when the token was generated. If the context has changed\n * (e.g. new session), the old token will fail verification.\n */\nexport function verifyCsrfToken(token: string, secret: string, context?: string): boolean {\n if (typeof token !== 'string') return false;\n\n const parts = token.split('.');\n\n // Token with context: raw.ctx-hex.sig (exactly 3 parts)\n if (parts.length === 3) {\n const [raw, ctxHex, sig] = parts;\n if (!raw || !ctxHex || !sig) return false;\n // Decode the stored context from hex\n let storedContext: string;\n try {\n storedContext = Buffer.from(ctxHex, 'hex').toString();\n } catch {\n return false;\n }\n // If caller supplies a context, it must match the stored context\n if (context !== undefined && context !== '' && storedContext !== context) return false;\n // If no context supplied by caller, we still verify using the stored context\n const expectedContext = context !== undefined && context !== '' ? context : storedContext;\n const expected = createHmac('sha256', secret)\n .update(`${raw}:${expectedContext}`)\n .digest('base64url');\n return timingSafeEqualSafe(Buffer.from(sig), Buffer.from(expected));\n }\n\n // Token without context: raw.sig (exactly 2 parts, no further dots)\n if (parts.length === 2) {\n const [raw, sig] = parts;\n if (!raw || !sig) return false;\n // If context is expected but token has no context part, reject\n if (context !== undefined && context !== '') return false;\n const expected = createHmac('sha256', secret).update(raw).digest('base64url');\n return timingSafeEqualSafe(Buffer.from(sig), Buffer.from(expected));\n }\n\n return false;\n}\n","import { type CanActivate, type ExecutionContext, Injectable } from '@nestjs/common';\nimport { InvalidCsrfTokenException } from '../errors/exceptions.js';\nimport { timingSafeEqualSafe, verifyCsrfToken } from './csrf-token.js';\n\nexport interface CsrfGuardOptions {\n secret: string;\n cookieName?: string;\n headerName?: string;\n /**\n * Optional function to extract a session-bound context value from the request.\n * Must match the `tokenContext` used in `CsrfCookieInterceptor` for the same app.\n */\n tokenContext?: (req: unknown) => string;\n}\n\nconst SAFE = new Set(['GET', 'HEAD', 'OPTIONS']);\n\n@Injectable()\nexport class CsrfGuard implements CanActivate {\n private readonly cookieName: string;\n private readonly headerName: string;\n\n constructor(private readonly options: CsrfGuardOptions) {\n this.cookieName = options.cookieName ?? 'XSRF-TOKEN';\n this.headerName = (options.headerName ?? 'X-XSRF-TOKEN').toLowerCase();\n }\n\n canActivate(ctx: ExecutionContext): boolean {\n const req = ctx.switchToHttp().getRequest<{\n method: string;\n cookies?: Record<string, string>;\n headers: Record<string, string | string[] | undefined>;\n }>();\n if (SAFE.has(req.method)) return true;\n\n const cookieToken = req.cookies?.[this.cookieName];\n const headerRaw = req.headers[this.headerName];\n const headerToken = Array.isArray(headerRaw) ? headerRaw[0] : headerRaw;\n\n if (!cookieToken || !headerToken) throw new InvalidCsrfTokenException();\n // Use constant-time comparison to avoid timing oracle on cookie vs header\n if (!timingSafeEqualSafe(Buffer.from(cookieToken), Buffer.from(headerToken))) {\n throw new InvalidCsrfTokenException();\n }\n const context = this.options.tokenContext ? this.options.tokenContext(req) : undefined;\n if (!verifyCsrfToken(cookieToken, this.options.secret, context))\n throw new InvalidCsrfTokenException();\n\n return true;\n }\n}\n"],"mappings":"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","names":["ForbiddenException","InvalidInertiaConfigException","InertiaServiceNotAvailableException","UnsupportedRootViewExtensionException","MissingTemplateEngineDepException","MissingCookieDepException","InvalidCsrfTokenException","Error","message","name","extension","engine","packageName","platform","dep","createRequire","loadHandlebars","require","MissingTemplateEngineDepException","handlebarsAdapter","url","extension","packageName","compile","templateSource","hbs","compiled","locals","createRequire","loadEjs","require","MissingTemplateEngineDepException","ejsAdapter","url","extension","packageName","compile","templateSource","absPath","ejs","compiled","filename","async","locals","createRequire","loadPug","require","MissingTemplateEngineDepException","pugAdapter","url","extension","packageName","compile","templateSource","absPath","pug","compiled","filename","locals","createRequire","loadLiquid","mod","require","Liquid","MissingTemplateEngineDepException","liquidAdapter","url","extension","packageName","compile","templateSource","engine","outputEscape","locals","parseAndRender","registerFastifyMethodSpoof","app","options","methodSpoofing","addHook","req","r","method","contentType","headers","toString","toLowerCase","startsWith","spoofed","String","body","_method","toUpperCase","ALLOWED","has","undefined","Set","Injectable","map","ErrorBagInterceptor","intercept","context","next","req","switchToHttp","getRequest","bag","header","handle","pipe","map","value","v","errors","undefined","Inject","Injectable","tap","INERTIA_MODULE_OPTIONS","Symbol","INERTIA_FEATURE_OPTIONS","INERTIA_MANIFEST","INERTIA_ASSET_VERSION","INERTIA_DEFAULT_SCOPE","RESERVED_SCOPES","Set","_featureTokenCache","Map","featureToken","kind","scope","rootId","key","cached","get","sym","set","assertScopeNotReserved","has","Error","SAFE_METHODS","Set","getHeader","req","name","r","header","v","headers","toLowerCase","Array","isArray","RedirectInterceptor","options","intercept","context","next","autoUpgrade303","handle","switchToHttp","getRequest","res","getResponse","method","has","redirect","originalRedirect","bind","patchedRedirect","statusOrUrl","url","resAny","code","originalCode","patchedCode","n","pipe","tap","statusCode","Inject","Injectable","ALLOWED","Set","MethodSpoofMiddleware","options","use","req","_res","next","methodSpoofing","method","contentType","headers","toString","toLowerCase","startsWith","spoofed","String","body","_method","toUpperCase","has","undefined","SetMetadata","INERTIA_RENDER_COMPONENT","Symbol","createInertiaDecorator","component","SetMetadata","MARKER","Symbol","make","kind","value","meta","inertiaDecorator","component","createInertiaDecorator","always","fn","optional","_lazyWarned","lazy","console","warn","defer","group","once","merge","opts","deep","matchOn","undefined","Inertia","Object","assign","isMarker","value","MARKER","getMarkerKind","marker","kind","getMarkerValue","getMarkerMeta","meta","SetMetadata","INERTIA_USE_SCOPE","UseInertia","scope","SetMetadata","Inject","Injectable","Reflector","from","of","switchMap","InertiaRenderInterceptor","reflector","intercept","context","next","component","get","INERTIA_RENDER_COMPONENT","getHandler","handle","req","switchToHttp","getRequest","res","getResponse","pipe","switchMap","returnValue","headersSent","of","undefined","inertia","InertiaServiceNotAvailableException","props","from","render","Logger","nullifyUndefined","props","out","k","v","Object","entries","undefined","FORBIDDEN_KEYS","Set","assertSafeKey","key","has","Error","setNested","target","path","value","length","cur","i","existing","undefined","Array","isArray","slice","join","finalKey","unpackDotKeys","props","out","dotKeysParents","Object","keys","includes","add","split","parent","entries","validateLocationUrl","url","startsWith","parsed","URL","protocol","Error","err","TypeError","OMIT","Symbol","containsAlwaysMarker","value","isMarker","getMarkerKind","Array","isArray","some","Object","values","resolveNestedObjectValue","obj","topKey","subKeep","deferredProps","out","k","v","entries","resolved","resolveNestedValueInner","relPath","resolveMarker","item","push","childPath","included","marker","kind","fullPath","getMarkerValue","includes","meta","getMarkerMeta","group","existing","InertiaService","logger","Logger","name","shared","encryptHistoryFlag","clearHistoryFlag","req","res","deps","share","input","location","safeUrl","header","status","setHeader","end","encryptHistory","clearHistory","resolveShared","sources","moduleShare","undefined","featureShare","s","assign","render","component","props","clientVersion","method","assetVersion","originalUrl","flashStore","errors","flashed","read","raw","keys","length","warn","message","String","sharedProps","rawProps","partialComponent","isPartial","partialDataHeader","keepList","split","filter","Boolean","keep","resetHeader","resetKeys","resetOnceHeader","resetOnceKeys","exceptHeader","exceptKeys","finalProps","mergeProps","deepMergeProps","matchPropsOn","key","deep","matchOn","hasNestedKeepPath","hasNestedAlways","nestedKeep","map","slice","unpackedProps","unpackDotKeys","wireProps","nullifyUndefined","page","version","historyEncryptionDefault","json","ssrModule","ssrLoader","load","ssr","html","rootViewRender","manifest","ctx","Inject","Logger","Module","RequestMethod","APP_INTERCEPTOR","HttpAdapterHost","createHash","randomUUID","readFileSync","isAbsolute","resolve","DEFAULT_MANIFEST_PATH","assertManifestShape","parsed","path","Array","isArray","Error","key","entry","Object","entries","e","file","loadManifest","abs","isAbsolute","resolve","process","cwd","raw","readFileSync","JSON","parse","err","message","includes","computeAssetVersion","manifest","createHash","update","stringify","digest","slice","randomUUID","replace","manifestProvider","provide","INERTIA_MANIFEST","inject","INERTIA_MODULE_OPTIONS","useFactory","opts","env","NODE_ENV","vite","manifestPath","assetVersionProvider","INERTIA_ASSET_VERSION","version","undefined","Inject","Injectable","HttpAdapterHost","ModuleRef","Reflector","expressAdapter","adaptRequest","raw","r","req","method","originalUrl","url","header","name","v","headers","toLowerCase","Array","isArray","body","undefined","query","adaptResponse","wrapper","statusCode","headersSent","status","code","setHeader","value","getHeader","json","html","send","end","fastifyAdapter","adaptRequest","raw","r","req","method","originalUrl","url","header","name","v","headers","toLowerCase","Array","isArray","body","undefined","query","adaptResponse","wrapper","statusCode","headersSent","sent","status","code","setHeader","value","getHeader","json","send","html","end","InertiaScopeSwitcherInterceptor","reflector","moduleRef","httpAdapterHost","intercept","ctx","next","scope","getAllAndOverride","INERTIA_USE_SCOPE","getHandler","getClass","opts","get","featureToken","strict","manifest","assetVersion","shellRenderer","ssrLoader","req","switchToHttp","getRequest","res","getResponse","deps","rootViewRender","c","render","moduleShare","share","featureShare","undefined","historyEncryptionDefault","historyEncryption","default","flashStore","platform","httpAdapter","getType","adapter","fastifyAdapter","expressAdapter","inertia","InertiaService","adaptRequest","adaptResponse","handle","Inject","Injectable","KEYS","suppressPostSendWrites","res","key","original","bind","args","headersSent","InertiaMiddleware","assetVersion","manifest","options","shellRenderer","ssrLoader","use","req","res","next","adaptedReq","expressAdapter","adaptRequest","adaptedRes","adaptResponse","inertia","InertiaService","rootViewRender","ctx","render","moduleShare","share","featureShare","undefined","historyEncryptionDefault","historyEncryption","default","flashStore","suppressPostSendWrites","registerFastifyInertia","app","depsFactory","appAsAny","_inertiaRegistered","decorateRequest","addHook","req","reply","adaptedReq","fastifyAdapter","adaptRequest","adaptedRes","adaptResponse","inertia","InertiaService","readFileSync","extname","isAbsolute","resolve","VITE_REFRESH_PREAMBLE","processDirectives","template","ctx","out","replace","ssrHead","ssrBody","pageJson","isDev","_full","entry","entryRecord","manifest","Error","scriptTag","file","cssTags","css","map","href","join","filter","Boolean","path","LS","PS","UNSAFE_CHARS","RegExp","serializePageData","page","JSON","stringify","replace","c","registry","then","m","handlebarsAdapter","ejsAdapter","pugAdapter","liquidAdapter","resolveTemplateEngine","extension","loader","toLowerCase","UnsupportedRootViewExtensionException","PLAIN_HTML","Set","TEMPLATE_EXTENSIONS","FileBasedShellRenderer","cachedTemplate","engineRenderer","adapterPromise","absPath","ext","rootViewPath","extname","toLowerCase","has","UnsupportedRootViewExtensionException","isAbsolute","resolve","process","cwd","render","ctx","readFileSync","pageJson","serializePageData","page","ssrHead","ssr","head","join","ssrBody","body","isDev","env","NODE_ENV","manifest","processDirectives","resolveTemplateEngine","adapter","compile","inertiaHtml","directiveCtx","locals","inertia","inertiaHead","vite","entry","viteRefresh","asset","p","output","DefaultShellRenderer","render","ctx","pageJson","serializePageData","page","readFileSync","resolve","pathToFileURL","Inject","Injectable","Logger","isVitest","process","env","VITEST","NODE_ENV","SsrLoaderService","logger","Logger","name","cached","failed","opts","load","ssr","enabled","bundlePath","resolve","cwd","mod","code","readFileSync","dataUrl","Buffer","from","toString","fileUrl","pathToFileURL","href","default","render","throwOnError","Error","warn","err","message","InertiaModule","buildModuleProviders","shellProvider","provide","inject","INERTIA_MODULE_OPTIONS","useFactory","opts","rv","rootView","fn","render","ctx","FileBasedShellRenderer","DefaultShellRenderer","ssrProvider","useClass","SsrLoaderService","manifestProvider","assetVersionProvider","InertiaMiddleware","MethodSpoofMiddleware","APP_INTERCEPTOR","InertiaScopeSwitcherInterceptor","InertiaRenderInterceptor","RedirectInterceptor","moduleExports","INERTIA_MANIFEST","INERTIA_ASSET_VERSION","forRoot","options","optionsProvider","useValue","module","global","providers","exports","forRootAsync","asyncOptions","validateAsyncOptions","optionsProviders","createAsyncOptionsProviders","injectProviders","filter","token","map","imports","forFeature","assertScopeNotReserved","scope","featureToken","createFeatureProviders","forFeatureAsync","has","k","undefined","declared","Boolean","length","InvalidInertiaConfigException","optionsToken","args","factory","createInertiaOptions","useExisting","process","env","NODE_ENV","loadManifest","vite","manifestPath","manifest","version","computeAssetVersion","logger","Logger","name","codegenWatcher","httpAdapterHost","assetVersion","shellRenderer","ssrLoader","_resolveCodegenModule","dynamicImport","Function","onApplicationBootstrap","adapter","httpAdapter","platform","getType","fastifyApp","getInstance","registerFastifyInertia","rootViewRender","moduleShare","share","featureShare","historyEncryptionDefault","historyEncryption","default","flashStore","registerFastifyMethodSpoof","_startCodegenWatcher","NESTJS_INERTIA_DISABLE_AUTO_CODEGEN","codegen","enabled","err","message","Error","String","warn","config","loadConfig","cwd","watch","log","onApplicationShutdown","close","configure","consumer","apply","forRoutes","path","method","RequestMethod","ALL","Injectable","createHmac","randomBytes","timingSafeEqual","generateCsrfToken","secret","context","raw","randomBytes","toString","undefined","ctx","Buffer","from","sig","createHmac","update","digest","timingSafeEqualSafe","a","b","byteLength","timingSafeEqual","verifyCsrfToken","token","parts","split","length","ctxHex","storedContext","expectedContext","expected","writeCsrfCookie","res","cookieName","token","cookieOpts","cookie","setCookie","rotateCsrfToken","options","context","generateCsrfToken","secret","httpOnly","sameSite","secure","process","env","NODE_ENV","path","CsrfCookieInterceptor","intercept","next","req","switchToHttp","getRequest","getResponse","ctx","tokenContext","undefined","existing","cookies","verifyCsrfToken","handle","Injectable","SAFE","Set","CsrfGuard","cookieName","headerName","options","toLowerCase","canActivate","ctx","req","switchToHttp","getRequest","has","method","cookieToken","cookies","headerRaw","headers","headerToken","Array","isArray","InvalidCsrfTokenException","timingSafeEqualSafe","Buffer","from","context","tokenContext","undefined","verifyCsrfToken","secret","VERSION"]}
|
package/package.json
ADDED
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@dudousxd/nestjs-inertia",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"description": "Inertia.js adapter for NestJS — core protocol and module.",
|
|
5
|
+
"license": "MIT",
|
|
6
|
+
"repository": {
|
|
7
|
+
"type": "git",
|
|
8
|
+
"url": "git+https://github.com/DavideCarvalho/nestjs-inertia.git",
|
|
9
|
+
"directory": "packages/core"
|
|
10
|
+
},
|
|
11
|
+
"author": "Davi Carvalho <davi@goflip.ai>",
|
|
12
|
+
"type": "module",
|
|
13
|
+
"main": "./dist/index.cjs",
|
|
14
|
+
"module": "./dist/index.js",
|
|
15
|
+
"types": "./dist/index.d.ts",
|
|
16
|
+
"exports": {
|
|
17
|
+
".": {
|
|
18
|
+
"types": "./dist/index.d.ts",
|
|
19
|
+
"import": "./dist/index.js",
|
|
20
|
+
"require": "./dist/index.cjs"
|
|
21
|
+
}
|
|
22
|
+
},
|
|
23
|
+
"files": [
|
|
24
|
+
"dist/",
|
|
25
|
+
"README.md",
|
|
26
|
+
"CHANGELOG.md"
|
|
27
|
+
],
|
|
28
|
+
"peerDependencies": {
|
|
29
|
+
"@fastify/cookie": ">=9.0.0",
|
|
30
|
+
"@nestjs/common": ">=10.0.0",
|
|
31
|
+
"@nestjs/core": ">=10.0.0",
|
|
32
|
+
"@nestjs/platform-fastify": ">=10.0.0",
|
|
33
|
+
"@types/express": ">=4.0.0",
|
|
34
|
+
"cookie-parser": ">=1.4.0",
|
|
35
|
+
"ejs": ">=3.1.0",
|
|
36
|
+
"express": ">=4.0.0",
|
|
37
|
+
"fastify": ">=4.0.0",
|
|
38
|
+
"handlebars": ">=4.7.0",
|
|
39
|
+
"liquidjs": ">=10.0.0",
|
|
40
|
+
"pug": ">=3.0.0",
|
|
41
|
+
"reflect-metadata": ">=0.1.13",
|
|
42
|
+
"rxjs": ">=7.0.0"
|
|
43
|
+
},
|
|
44
|
+
"peerDependenciesMeta": {
|
|
45
|
+
"@fastify/cookie": {
|
|
46
|
+
"optional": true
|
|
47
|
+
},
|
|
48
|
+
"@nestjs/platform-fastify": {
|
|
49
|
+
"optional": true
|
|
50
|
+
},
|
|
51
|
+
"@types/express": {
|
|
52
|
+
"optional": true
|
|
53
|
+
},
|
|
54
|
+
"cookie-parser": {
|
|
55
|
+
"optional": true
|
|
56
|
+
},
|
|
57
|
+
"ejs": {
|
|
58
|
+
"optional": true
|
|
59
|
+
},
|
|
60
|
+
"express": {
|
|
61
|
+
"optional": true
|
|
62
|
+
},
|
|
63
|
+
"fastify": {
|
|
64
|
+
"optional": true
|
|
65
|
+
},
|
|
66
|
+
"handlebars": {
|
|
67
|
+
"optional": true
|
|
68
|
+
},
|
|
69
|
+
"liquidjs": {
|
|
70
|
+
"optional": true
|
|
71
|
+
},
|
|
72
|
+
"pug": {
|
|
73
|
+
"optional": true
|
|
74
|
+
}
|
|
75
|
+
},
|
|
76
|
+
"devDependencies": {
|
|
77
|
+
"@fastify/cookie": "^9.3.1",
|
|
78
|
+
"@nestjs/common": "^11.0.0",
|
|
79
|
+
"@nestjs/core": "^11.0.0",
|
|
80
|
+
"@nestjs/platform-express": "^11.0.0",
|
|
81
|
+
"@nestjs/platform-fastify": "^11.0.0",
|
|
82
|
+
"@nestjs/testing": "^11.0.0",
|
|
83
|
+
"@types/cookie-parser": "^1.4.7",
|
|
84
|
+
"@types/ejs": "^3.1.5",
|
|
85
|
+
"@types/express": "^4.17.21",
|
|
86
|
+
"@types/node": "^20.0.0",
|
|
87
|
+
"@types/pug": "^2.0.10",
|
|
88
|
+
"@types/supertest": "^6.0.2",
|
|
89
|
+
"cookie-parser": "^1.4.6",
|
|
90
|
+
"ejs": "^3.1.10",
|
|
91
|
+
"express": "^4.19.2",
|
|
92
|
+
"fastify": "^5.8.5",
|
|
93
|
+
"handlebars": "^4.7.8",
|
|
94
|
+
"liquidjs": "^10.16.0",
|
|
95
|
+
"pug": "^3.0.3",
|
|
96
|
+
"reflect-metadata": "^0.2.2",
|
|
97
|
+
"rxjs": "^7.8.1",
|
|
98
|
+
"supertest": "^7.0.0",
|
|
99
|
+
"typescript": "^5.4.0",
|
|
100
|
+
"vitest": "^3.0.0"
|
|
101
|
+
},
|
|
102
|
+
"engines": {
|
|
103
|
+
"node": ">=20"
|
|
104
|
+
},
|
|
105
|
+
"keywords": [
|
|
106
|
+
"nestjs",
|
|
107
|
+
"inertia",
|
|
108
|
+
"inertia.js",
|
|
109
|
+
"ssr",
|
|
110
|
+
"react",
|
|
111
|
+
"vue",
|
|
112
|
+
"svelte"
|
|
113
|
+
],
|
|
114
|
+
"scripts": {
|
|
115
|
+
"build": "tsup",
|
|
116
|
+
"test": "vitest run",
|
|
117
|
+
"test:watch": "vitest",
|
|
118
|
+
"typecheck": "tsc --noEmit -p tsconfig.json"
|
|
119
|
+
}
|
|
120
|
+
}
|