{"version":3,"file":"index.mjs","names":[],"sources":["../../src/sveltekit/index.ts"],"sourcesContent":["import type { RequestLogger } from '../types'\nimport { createMiddlewareLogger, type BaseMxllogOptions } from '../shared/middleware'\nimport { extractSafeHeaders } from '../shared/headers'\nimport { createLoggerStorage } from '../shared/storage'\nimport { resolveMxllogError, extractErrorStatus, serializeMxllogErrorResponse } from '../nitro'\nimport { MxllogError } from '../error'\n\nconst { storage, useLogger } = createLoggerStorage(\n  'handle context. Make sure mxllog() handle is added to your hooks.server.ts.',\n)\n\nexport type MxllogSvelteKitOptions = BaseMxllogOptions\n\nexport { useLogger }\n\n/**\n * SvelteKit `Handle` function signature — avoids a hard dependency on `@sveltejs/kit`.\n */\ntype SvelteKitHandle = (input: {\n  event: { request: Request; url: URL; locals: Record<string, any> }\n  resolve: (event: any) => Promise<Response>\n}) => Promise<Response>\n\n/**\n * SvelteKit `HandleServerError` signature — avoids a hard dependency on `@sveltejs/kit`.\n */\ntype SvelteKitHandleServerError = (input: {\n  error: unknown\n  event: { request: Request; url: URL; locals: Record<string, any> }\n  status: number\n  message: string\n}) => MaybePromise<void | AppError>\n\ntype MaybePromise<T> = T | Promise<T>\n\n/** Minimal SvelteKit `App.Error` shape */\ninterface AppError {\n  message: string\n  [key: string]: unknown\n}\n\n/**\n * Create an mxllog handle hook for SvelteKit.\n *\n * Add it to your `src/hooks.server.ts` using SvelteKit's `sequence` helper\n * or as the sole handle export.\n *\n * @example\n * ```ts\n * // src/hooks.server.ts\n * import { initLogger } from '@safaricom-mxl/log'\n * import { mxllog } from '@safaricom-mxl/log/sveltekit'\n * import { createAxiomDrain } from '@safaricom-mxl/log/axiom'\n *\n * initLogger({ env: { service: 'my-sveltekit-app' } })\n *\n * export const handle = mxllog({\n *   drain: createAxiomDrain(),\n *   enrich: (ctx) => {\n *     ctx.event.region = process.env.FLY_REGION\n *   },\n * })\n * ```\n *\n * @example\n * ```ts\n * // Compose with other hooks using sequence\n * import { sequence } from '@sveltejs/kit/hooks'\n * import { mxllog } from '@safaricom-mxl/log/sveltekit'\n *\n * export const handle = sequence(mxllog(), yourOtherHook)\n * ```\n */\nexport function mxllog(options: MxllogSvelteKitOptions = {}): SvelteKitHandle {\n  return async ({ event, resolve }) => {\n    const { logger, finish, skipped } = createMiddlewareLogger({\n      method: event.request.method,\n      path: event.url.pathname,\n      requestId: event.request.headers.get('x-request-id') || crypto.randomUUID(),\n      headers: extractSafeHeaders(event.request.headers),\n      ...options,\n    })\n\n    if (skipped) {\n      return await resolve(event)\n    }\n\n    event.locals.log = logger\n\n    return storage.run(logger, async () => {\n      try {\n        const response = await resolve(event)\n\n        // SvelteKit catches route errors internally and returns 500.\n        // If handleError already logged an MxllogError with a specific status,\n        // return a structured JSON response instead of SvelteKit's generic 500.\n        const ctx = logger.getContext()\n        const errorData = ctx.error as { name?: string; status?: number; message?: string; data?: unknown } | undefined\n        if (response.status >= 500 && errorData?.name === 'MxllogError' && errorData.status) {\n          const { status } = errorData\n          await finish({ status })\n          const body = serializeMxllogErrorResponse(errorData as MxllogError, event.url.pathname)\n          return new Response(JSON.stringify(body), {\n            status,\n            headers: { 'content-type': 'application/json' },\n          })\n        }\n\n        await finish({ status: response.status })\n        return response\n      } catch (error) {\n        await finish({ error: error as Error })\n\n        // Return structured JSON for MxllogError (like NextJS withMxllog / Nuxt errorHandler)\n        if (error instanceof MxllogError) {\n          const status = error.status ?? 500\n          const body = serializeMxllogErrorResponse(error, event.url.pathname)\n          return new Response(JSON.stringify(body), {\n            status,\n            headers: { 'content-type': 'application/json' },\n          })\n        }\n\n        throw error\n      }\n    })\n  }\n}\n\n/**\n * Create an mxllog error handler for SvelteKit.\n *\n * Logs unhandled errors via `event.locals.log` (if available) and returns\n * structured error responses for `MxllogError` instances. For non-mxllog errors,\n * returns a generic error response with sanitized messages in production.\n *\n * @example\n * ```ts\n * // src/hooks.server.ts\n * import { mxllog, mxllogHandleError } from '@safaricom-mxl/log/sveltekit'\n *\n * export const handle = mxllog()\n * export const handleError = mxllogHandleError()\n * ```\n */\nexport function mxllogHandleError(): SvelteKitHandleServerError {\n  return ({ error, event, status, message }) => {\n    const logger = event.locals.log as RequestLogger | undefined\n\n    if (logger && error instanceof Error) {\n      logger.error(error)\n    }\n\n    const mxllogError = error instanceof Error ? resolveMxllogError(error) : null\n\n    if (mxllogError) {\n      const errorStatus = extractErrorStatus(mxllogError)\n      const response = serializeMxllogErrorResponse(mxllogError, event.url.pathname)\n      return {\n        message: response.message as string,\n        status: errorStatus,\n        why: (response.data as { why?: string })?.why,\n        fix: (response.data as { fix?: string })?.fix,\n        link: (response.data as { link?: string })?.link,\n      } as AppError\n    }\n\n    return { message, status } as AppError\n  }\n}\n\n/**\n * Create both `handle` and `handleError` hooks in a single call.\n *\n * This is the recommended setup for SvelteKit — it returns both hooks\n * pre-configured and ready to export from `hooks.server.ts`.\n *\n * @example\n * ```ts\n * // src/hooks.server.ts\n * import { initLogger } from '@safaricom-mxl/log'\n * import { createMxllogHooks } from '@safaricom-mxl/log/sveltekit'\n * import { createAxiomDrain } from '@safaricom-mxl/log/axiom'\n *\n * initLogger({ env: { service: 'my-app' } })\n *\n * export const { handle, handleError } = createMxllogHooks({\n *   drain: createAxiomDrain(),\n *   enrich: (ctx) => {\n *     ctx.event.region = process.env.FLY_REGION\n *   },\n * })\n * ```\n *\n * @example\n * ```ts\n * // Compose with other hooks using sequence\n * import { sequence } from '@sveltejs/kit/hooks'\n * import { createMxllogHooks } from '@safaricom-mxl/log/sveltekit'\n *\n * const mxllogHooks = createMxllogHooks()\n *\n * export const handle = sequence(mxllogHooks.handle, yourOtherHook)\n * export const handleError = mxllogHooks.handleError\n * ```\n */\nexport function createMxllogHooks(options: MxllogSvelteKitOptions = {}) {\n  return {\n    handle: mxllog(options),\n    handleError: mxllogHandleError(),\n  }\n}\n"],"mappings":";;;;;;AAOA,MAAM,EAAE,SAAS,cAAc,oBAC7B,8EACD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAgED,SAAgB,OAAO,UAAkC,EAAE,EAAmB;AAC5E,QAAO,OAAO,EAAE,OAAO,cAAc;EACnC,MAAM,EAAE,QAAQ,QAAQ,YAAY,uBAAuB;GACzD,QAAQ,MAAM,QAAQ;GACtB,MAAM,MAAM,IAAI;GAChB,WAAW,MAAM,QAAQ,QAAQ,IAAI,eAAe,IAAI,OAAO,YAAY;GAC3E,SAAS,mBAAmB,MAAM,QAAQ,QAAQ;GAClD,GAAG;GACJ,CAAC;AAEF,MAAI,QACF,QAAO,MAAM,QAAQ,MAAM;AAG7B,QAAM,OAAO,MAAM;AAEnB,SAAO,QAAQ,IAAI,QAAQ,YAAY;AACrC,OAAI;IACF,MAAM,WAAW,MAAM,QAAQ,MAAM;IAMrC,MAAM,YADM,OAAO,YAAY,CACT;AACtB,QAAI,SAAS,UAAU,OAAO,WAAW,SAAS,iBAAiB,UAAU,QAAQ;KACnF,MAAM,EAAE,WAAW;AACnB,WAAM,OAAO,EAAE,QAAQ,CAAC;KACxB,MAAM,OAAO,6BAA6B,WAA0B,MAAM,IAAI,SAAS;AACvF,YAAO,IAAI,SAAS,KAAK,UAAU,KAAK,EAAE;MACxC;MACA,SAAS,EAAE,gBAAgB,oBAAoB;MAChD,CAAC;;AAGJ,UAAM,OAAO,EAAE,QAAQ,SAAS,QAAQ,CAAC;AACzC,WAAO;YACA,OAAO;AACd,UAAM,OAAO,EAAS,OAAgB,CAAC;AAGvC,QAAI,iBAAiB,aAAa;KAChC,MAAM,SAAS,MAAM,UAAU;KAC/B,MAAM,OAAO,6BAA6B,OAAO,MAAM,IAAI,SAAS;AACpE,YAAO,IAAI,SAAS,KAAK,UAAU,KAAK,EAAE;MACxC;MACA,SAAS,EAAE,gBAAgB,oBAAoB;MAChD,CAAC;;AAGJ,UAAM;;IAER;;;;;;;;;;;;;;;;;;;AAoBN,SAAgB,oBAAgD;AAC9D,SAAQ,EAAE,OAAO,OAAO,QAAQ,cAAc;EAC5C,MAAM,SAAS,MAAM,OAAO;AAE5B,MAAI,UAAU,iBAAiB,MAC7B,QAAO,MAAM,MAAM;EAGrB,MAAM,cAAc,iBAAiB,QAAQ,mBAAmB,MAAM,GAAG;AAEzE,MAAI,aAAa;GACf,MAAM,cAAc,mBAAmB,YAAY;GACnD,MAAM,WAAW,6BAA6B,aAAa,MAAM,IAAI,SAAS;AAC9E,UAAO;IACL,SAAS,SAAS;IAClB,QAAQ;IACR,KAAM,SAAS,MAA2B;IAC1C,KAAM,SAAS,MAA2B;IAC1C,MAAO,SAAS,MAA4B;IAC7C;;AAGH,SAAO;GAAE;GAAS;GAAQ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAuC9B,SAAgB,kBAAkB,UAAkC,EAAE,EAAE;AACtE,QAAO;EACL,QAAQ,OAAO,QAAQ;EACvB,aAAa,mBAAmB;EACjC"}