{"version":3,"sources":["../src/templates.ts","../src/utils/env.ts","../src/utils/routes.ts","../src/utils/options.ts","../src/utils/process.ts"],"names":["loginTemplate","setupTemplate","stylesContent","getEnvValue","key","envKey","getEnvArray","value","route","getEnvNumber","getEnvBoolean","mergeWithEnv","defaults","enabled","cookieMaxAge","password","jwtSecret","loginPath","siteName","protectedRoutes","publicRoutes","redirectUrl","normalizePath","path","createRegexFromPattern","pattern","regexPattern","err","isRouteMatch","patterns","normalizedPath","regex","isMatch","isProtectedRoute","options","normalizeRoute","DEFAULT_OPTIONS","mergeOptions","defaultOptions","envOptions","userOptions","combinedPublicRoutes","combinedProtectedRoutes","mergedOptions","renderSetupTemplate","variables","html","renderLoginTemplate","templateVars","handleStagingProcess","context","staticPrefix","cssRoute","callbacks","_a","_b","url","method","cookies","originalUrl","setupHtml","secretKey","token","SignJWT","jwtVerify"],"mappings":"qCAEO,IAAMA,CAAgB,CAAA,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,OAAA,CAAA,CAChBC,CAAgB,CAAA,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,OAAA,CAAA,CAChBC,CAAgB,CAAA,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAA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","file":"index.mjs","sourcesContent":["// This file is auto-generated. Do not edit.\n/* eslint-disable */\nexport const loginTemplate = \"<!DOCTYPE html>\\n<html lang=\\\"en\\\">\\n  <head>\\n    <meta charset=\\\"UTF-8\\\">\\n    <meta name=\\\"viewport\\\" content=\\\"width=device-width, initial-scale=1.0\\\">\\n    <title>{{siteName}}</title>\\n    <link rel=\\\"preconnect\\\" href=\\\"https://fonts.googleapis.com\\\">\\n    <link rel=\\\"preconnect\\\" href=\\\"https://fonts.gstatic.com\\\" crossorigin>\\n    <link href=\\\"https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600&display=swap\\\" rel=\\\"stylesheet\\\">\\n    <link href=\\\"{{cssPath}}\\\" rel=\\\"stylesheet\\\">\\n  </head>\\n  <body>\\n    <div class=\\\"container\\\">\\n      <div class=\\\"header\\\">\\n        <h1 class=\\\"title\\\">{{siteName}}</h1>\\n        <p class=\\\"description\\\">Please enter the password to continue</p>\\n      </div>\\n      {{errorHtml}}\\n      <form method=\\\"POST\\\" action=\\\"{{loginPath}}\\\">\\n        <div class=\\\"input-group\\\">\\n          <label for=\\\"password\\\" class=\\\"input-label\\\">Password</label>\\n          <input \\n            type=\\\"password\\\" \\n            id=\\\"password\\\"\\n            name=\\\"password\\\" \\n            class=\\\"input{{errorClass}}\\\"\\n            placeholder=\\\"Enter password\\\" \\n            required\\n            autocomplete=\\\"current-password\\\"\\n          >\\n        </div>\\n        <button type=\\\"submit\\\" class=\\\"button\\\">\\n          Continue\\n          <span class=\\\"button-arrow\\\">→</span>\\n        </button>\\n      </form>\\n    </div>\\n  </body>\\n</html>\";\nexport const setupTemplate = \"<!DOCTYPE html>\\n<html lang=\\\"en\\\">\\n  <head>\\n    <meta charset=\\\"UTF-8\\\">\\n    <meta name=\\\"viewport\\\" content=\\\"width=device-width, initial-scale=1.0\\\">\\n    <title>{{pageTitle}}</title>\\n    <link rel=\\\"preconnect\\\" href=\\\"https://fonts.googleapis.com\\\">\\n    <link rel=\\\"preconnect\\\" href=\\\"https://fonts.gstatic.com\\\" crossorigin>\\n    <link href=\\\"https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600&display=swap\\\" rel=\\\"stylesheet\\\">\\n    <link href=\\\"{{cssPath}}\\\" rel=\\\"stylesheet\\\">\\n  </head>\\n  <body>\\n    <div class=\\\"container\\\">\\n      <div class=\\\"header\\\">\\n        <h1 class=\\\"title\\\">{{title}}</h1>\\n        <p class=\\\"description\\\">{{description}}</p>\\n      </div>\\n      \\n      <div class=\\\"alert\\\">\\n        <p>{{alertText}}</p>\\n      </div>\\n\\n      <div class=\\\"code\\\">\\n        <div class=\\\"code-comment\\\"># {{setupMethod1Label}}:</div>\\n        {{setupMethod1}}<br><br>\\n        <div class=\\\"code-comment\\\"># {{setupMethod2Label}}:</div>\\n        {{setupMethod2}}\\n      </div>\\n\\n      <p class=\\\"text-center\\\">\\n        {{footerText}}\\n      </p>\\n    </div>\\n  </body>\\n</html>\";\nexport const stylesContent = \":root {\\n  --background: #ffffff;\\n  --foreground: #000000;\\n  --muted: #fafafa;\\n  --muted-foreground: #737373;\\n  --border: #e5e5e5;\\n  --input: #e5e5e5;\\n  --primary: #000000;\\n  --primary-foreground: #ffffff;\\n  --radius: 0.5rem;\\n  --code-bg: #171717;\\n  --code-fg: #ffffff;\\n  \\n  --error: #dc2626;\\n  --error-foreground: #fef2f2;\\n  --error-border: #fee2e2;\\n  --error-shadow: rgb(220 38 38 / 100%);\\n}\\n\\n@media (prefers-color-scheme: dark) {\\n  :root {\\n    --background: #000000;\\n    --foreground: #ffffff;\\n    --muted: #171717;\\n    --muted-foreground: #a3a3a3;\\n    --border: #262626;\\n    --input: #262626;\\n    --primary: #ffffff;\\n    --primary-foreground: #000000;\\n    --code-bg: #171717;\\n    --code-fg: #ffffff;\\n    \\n    --error: #fca5a5;\\n    --error-foreground: #450a0a;\\n    --error-border: #7f1d1d;\\n    --error-shadow: rgb(252 165 165 / 100%);\\n  }\\n}\\n\\n* {\\n  margin: 0;\\n  padding: 0;\\n  box-sizing: border-box;\\n}\\n\\nbody {\\n  font-family: 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell, sans-serif;\\n  background: var(--background);\\n  color: var(--foreground);\\n  min-height: 100vh;\\n  display: flex;\\n  align-items: center;\\n  justify-content: center;\\n  padding: 1rem;\\n  line-height: 1.5;\\n}\\n\\n.container {\\n  width: 100%;\\n  max-width: 400px;\\n  padding: 2.5rem;\\n  background: var(--background);\\n  border: 1px solid var(--border);\\n  border-radius: var(--radius);\\n  box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);\\n}\\n\\n.header {\\n  text-align: center;\\n  margin-bottom: 2rem;\\n}\\n\\n.title {\\n  font-size: 1.5rem;\\n  font-weight: 600;\\n  margin-bottom: 0.5rem;\\n}\\n\\n.description {\\n  color: var(--muted-foreground);\\n  font-size: 0.875rem;\\n}\\n\\n.alert {\\n  padding: 1rem;\\n  border: 1px solid var(--border);\\n  border-radius: var(--radius);\\n  margin: 1.5rem 0;\\n  font-size: 0.875rem;\\n}\\n\\n.alert p {\\n  margin-bottom: 0.5rem;\\n}\\n\\n.alert p:last-child {\\n  margin-bottom: 0;\\n}\\n\\n.code {\\n  background: var(--code-bg);\\n  color: var(--code-fg);\\n  padding: 1rem;\\n  border-radius: var(--radius);\\n  font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, \\\"Liberation Mono\\\", \\\"Courier New\\\", monospace;\\n  font-size: 0.875rem;\\n  line-height: 1.5;\\n  overflow-x: auto;\\n  margin: 1rem 0;\\n}\\n\\n.code-comment {\\n  color: var(--muted-foreground);\\n  margin-bottom: 0.5rem;\\n}\\n\\n.code-line {\\n  display: block;\\n  min-height: 1rem;\\n}\\n\\n.code-indent {\\n  display: inline-block;\\n  width: 1rem;\\n}\\n\\n.text-center {\\n  text-align: center;\\n  font-size: 0.875rem;\\n  color: var(--muted-foreground);\\n  margin-top: 1.5rem;\\n}\\n\\n/* Form specific styles */\\nform {\\n  display: flex;\\n  flex-direction: column;\\n  gap: 1rem;\\n}\\n\\n.input-group {\\n  display: flex;\\n  flex-direction: column;\\n  gap: 0.5rem;\\n}\\n\\n.input-label {\\n  font-size: 0.875rem;\\n  font-weight: 500;\\n}\\n\\n.input {\\n  padding: 0.75rem 1rem;\\n  background: var(--background);\\n  border: 1px solid var(--input);\\n  border-radius: var(--radius);\\n  font-size: 0.875rem;\\n  color: var(--foreground);\\n  transition: border-color 0.2s;\\n}\\n\\n.input:focus {\\n  outline: none;\\n  border-color: var(--primary);\\n  box-shadow: 0 0 0 1px var(--primary);\\n}\\n\\n.button {\\n  padding: 0.75rem 1rem;\\n  background: var(--primary);\\n  color: var(--primary-foreground);\\n  border: none;\\n  border-radius: var(--radius);\\n  font-size: 0.875rem;\\n  font-weight: 500;\\n  cursor: pointer;\\n  transition: opacity 0.2s;\\n  display: inline-flex;\\n  align-items: center;\\n  justify-content: center;\\n  gap: 0.5rem;\\n}\\n\\n.button:hover {\\n  opacity: 0.9;\\n}\\n\\n.button-arrow {\\n  display: inline-block;\\n  transition: transform 0.2s ease;\\n  margin-left: 2px;\\n}\\n\\n.button:hover .button-arrow {\\n  transform: translateX(4px);\\n}\\n\\n@media (max-width: 640px) {\\n  .container {\\n    padding: 1.5rem;\\n  }\\n}\\n\\n.error-message {\\n  background: var(--error-foreground);\\n  border: 1px solid var(--error-border);\\n  color: var(--error);\\n  padding: 0.75rem 1rem;\\n  border-radius: var(--radius);\\n  margin-bottom: 1rem;\\n  font-size: 0.875rem;\\n  display: flex;\\n  align-items: center;\\n  gap: 0.5rem;\\n}\\n\\n.input-error {\\n  border-color: var(--error);\\n}\\n\\n.input-error:focus {\\n  border-color: var(--error);\\n  box-shadow: 0 0 0 1px var(--error-shadow);\\n}\";\n","import { StagingOptions } from \"../types\";\nimport { DEFAULT_OPTIONS } from \"./options\";\n\nexport const getEnvValue = (key: string): string | undefined => {\n  const envKey = `STAGING_${key.toUpperCase()}`;\n  return process.env[envKey];\n};\n\nexport const getEnvArray = (key: string): string[] => {\n  const value = getEnvValue(key);\n  return value ? value.split(\",\").map((route) => route.trim()) : [];\n};\n\nexport const getEnvNumber = (key: string): number | undefined => {\n  const value = getEnvValue(key);\n  return value ? parseInt(value, 10) : undefined;\n};\n\nexport const getEnvBoolean = (key: string): boolean | undefined => {\n  const value = getEnvValue(key);\n  return value ? value === \"true\" : undefined;\n};\n\nexport const mergeWithEnv = (\n  defaults: typeof DEFAULT_OPTIONS,\n): StagingOptions => {\n  const enabled = getEnvBoolean(\"ENABLED\");\n  const cookieMaxAge = getEnvNumber(\"COOKIE_MAX_AGE\");\n  const password = getEnvValue(\"PASSWORD\");\n  const jwtSecret = getEnvValue(\"JWT_SECRET\");\n  const loginPath = getEnvValue(\"LOGIN_PATH\");\n  const siteName = getEnvValue(\"SITE_NAME\");\n  const protectedRoutes = getEnvArray(\"PROTECTED_ROUTES\");\n  const publicRoutes = getEnvArray(\"PUBLIC_ROUTES\");\n  const redirectUrl = getEnvValue(\"REDIRECT_URL\");\n\n  if (process.env.DEBUG) {\n    console.log(\"Staging Environment Configuration:\", {\n      enabled,\n      password: password ? \"[SET]\" : \"[NOT SET]\",\n      jwtSecret: jwtSecret ? \"[SET]\" : \"[NOT SET]\",\n      loginPath,\n      siteName,\n      protectedRoutes,\n      publicRoutes,\n      redirectUrl,\n    });\n  }\n\n  return {\n    enabled: enabled ?? defaults.enabled,\n    cookieMaxAge: cookieMaxAge ?? defaults.cookieMaxAge,\n    password,\n    jwtSecret,\n    loginPath: loginPath ?? defaults.loginPath,\n    siteName: siteName ?? defaults.siteName,\n    protectedRoutes,\n    publicRoutes,\n    redirectUrl: redirectUrl ?? defaults.redirectUrl,\n  };\n};\n","import { StagingOptions } from \"../types\";\n\nexport const normalizePath = (path: string): string => {\n  return \"/\" + path.replace(/^\\/+|\\/+$/g, \"\");\n};\n\nexport const createRegexFromPattern = (pattern: string): RegExp => {\n  try {\n    pattern = normalizePath(pattern);\n\n    if (!/[*?{}()\\[\\]\\\\]/.test(pattern)) {\n      return new RegExp(`^${pattern}$`);\n    }\n\n    let regexPattern = pattern\n      .replace(/[.+^${}()|[\\]\\\\]/g, \"\\\\$&\")\n      .replace(/\\*\\*/g, \".*\")\n      .replace(/\\*/g, \"[^/]*\")\n      .replace(/\\?/g, \"[^/]\");\n\n    if (regexPattern.endsWith(\".*\")) {\n      regexPattern = regexPattern.slice(0, -2) + \"(?:/.*)?\";\n    }\n\n    return new RegExp(`^${regexPattern}$`);\n  } catch (err) {\n    console.error(\"Error creating regex from pattern:\", pattern, err);\n    return new RegExp(\"^$\");\n  }\n};\n\nexport const isRouteMatch = (path: string, patterns: string[]): boolean => {\n  const normalizedPath = normalizePath(path);\n\n  return patterns.some((pattern) => {\n    try {\n      const regex = createRegexFromPattern(pattern);\n      const isMatch = regex.test(normalizedPath);\n\n      if (process.env.DEBUG) {\n        console.log(\n          `Testing path: ${normalizedPath} against pattern: ${pattern} (${regex}) = ${isMatch}`,\n        );\n      }\n\n      return isMatch;\n    } catch (err) {\n      console.error(\"Error matching route:\", path, pattern, err);\n      return false;\n    }\n  });\n};\n\nexport const isProtectedRoute = (\n  path: string,\n  options: Required<StagingOptions>,\n): boolean => {\n  const normalizedPath = normalizePath(path);\n\n  if (normalizedPath === options.loginPath) {\n    return false;\n  }\n\n  if (isRouteMatch(normalizedPath, options.publicRoutes)) {\n    return false;\n  }\n\n  if (options.protectedRoutes.length > 0) {\n    return isRouteMatch(normalizedPath, options.protectedRoutes);\n  }\n\n  return true;\n};\n\nexport const normalizeRoute = (route: string): string => {\n  if (route.endsWith(\"/\")) {\n    return route + \"**\";\n  }\n  if (route.includes(\"/api/\")) {\n    return route.endsWith(\"*\") ? route : route + \"/*\";\n  }\n  return route;\n};\n","// packages/staging/src/utils/options.ts\nimport { StagingOptions } from \"../types\";\nimport { normalizeRoute } from \"./routes\";\n\nexport const DEFAULT_OPTIONS = {\n  enabled: true,\n  cookieMaxAge: 7 * 24 * 60 * 60 * 1000, // 7 days\n  loginPath: \"/protected\" as string,\n  siteName: \"Protected Page\" as string,\n  protectedRoutes: [] as string[],\n  publicRoutes: [\"/favicon.ico\", \"/robots.txt\", \"/sitemap.xml\"] as string[],\n  redirectUrl: \"/\",\n  jwtSecret: \"unset\" as string,\n} as const;\n\nexport const mergeOptions = (\n  defaultOptions: Partial<StagingOptions>,\n  envOptions: Partial<StagingOptions>,\n  userOptions: Partial<StagingOptions>,\n): Required<StagingOptions> => {\n  if (process.env.DEBUG) {\n    console.log(\"Merging options:\", {\n      envPassword: envOptions.password ? \"[SET]\" : \"[NOT SET]\",\n      userPassword: userOptions.password ? \"[SET]\" : \"[NOT SET]\",\n    });\n  }\n\n  const combinedPublicRoutes = [\n    ...(DEFAULT_OPTIONS.publicRoutes || []),\n    ...(defaultOptions.publicRoutes || []),\n    ...(envOptions.publicRoutes || []),\n    ...(userOptions.publicRoutes || []),\n  ].map(normalizeRoute);\n\n  const combinedProtectedRoutes = [\n    ...(DEFAULT_OPTIONS.protectedRoutes || []),\n    ...(defaultOptions.protectedRoutes || []),\n    ...(envOptions.protectedRoutes || []),\n    ...(userOptions.protectedRoutes || []),\n  ].map(normalizeRoute);\n\n  // Password handling - prioritize user options over env options\n  const password = userOptions.password || envOptions.password || \"\";\n\n  // JWT Secret handling\n  const jwtSecret =\n    userOptions.jwtSecret ||\n    envOptions.jwtSecret ||\n    defaultOptions.jwtSecret ||\n    DEFAULT_OPTIONS.jwtSecret;\n\n  // Merge all options, with proper priority\n  const mergedOptions = {\n    ...DEFAULT_OPTIONS,\n    ...defaultOptions,\n    ...envOptions,\n    ...userOptions,\n    publicRoutes: combinedPublicRoutes,\n    protectedRoutes: combinedProtectedRoutes,\n    password, // Use our explicitly handled password\n    jwtSecret, // Use our explicitly handled JWT secret\n  };\n\n  if (process.env.DEBUG) {\n    console.log(\"Final merged options:\", {\n      ...mergedOptions,\n      password: mergedOptions.password ? \"[SET]\" : \"[NOT SET]\",\n      jwtSecret: mergedOptions.jwtSecret !== \"unset\" ? \"[SET]\" : \"[NOT SET]\",\n    });\n  }\n\n  return mergedOptions;\n};\n","// packages/staging/src/utils/process.ts\nimport { SignJWT, jwtVerify } from \"jose\";\n\nimport { loginTemplate, setupTemplate, stylesContent } from \"../templates\";\nimport { isProtectedRoute } from \"./routes\";\nimport { StagingOptions } from \"../types\";\n\nexport interface SessionData {\n  returnTo?: string;\n  [key: string]: any;\n}\n\nexport interface StagingContext {\n  url: string;\n  method: string;\n  password?: string;\n  cookies: Record<string, string>;\n  originalUrl?: string;\n  session?: SessionData;\n}\n\nexport interface CookieOptions {\n  maxAge?: number;\n  path?: string;\n  httpOnly?: boolean;\n  secure?: boolean;\n  sameSite?: \"lax\" | \"strict\" | \"none\";\n}\n\nexport interface StagingCallbacks<ResponseType> {\n  // Response handlers\n  sendHtml: (html: string, statusCode: number) => ResponseType;\n  sendCss: (css: string) => ResponseType;\n  redirect: (url: string) => ResponseType | Promise<ResponseType>;\n\n  // Cookie management\n  setCookie: (\n    name: string,\n    value: string,\n    options: CookieOptions,\n  ) => ResponseType;\n  clearCookie: (name: string) => ResponseType;\n\n  // Session management\n  setSessionValue?: (key: string, value: string) => ResponseType;\n  clearSessionValue?: (key: string) => ResponseType;\n\n  // Continue to next middleware\n  next: () => ResponseType;\n}\n\nexport interface StagingProcessOptions<ResponseType> {\n  context: StagingContext;\n  options: Required<StagingOptions>;\n  staticPrefix: string;\n  cssRoute: string;\n  callbacks: StagingCallbacks<ResponseType>;\n}\n\nexport interface SetupTemplateVariables {\n  pageTitle: string;\n  title: string;\n  description: string;\n  alertText: string;\n  setupMethod1Label: string;\n  setupMethod1: string;\n  setupMethod2Label: string;\n  setupMethod2: string;\n  footerText: string;\n  cssPath: string;\n}\n\nfunction renderSetupTemplate(variables: SetupTemplateVariables): string {\n  let html = setupTemplate;\n  Object.entries(variables).forEach(([key, value]) => {\n    html = html.replace(new RegExp(`{{${key}}}`, \"g\"), value);\n  });\n  return html;\n}\n\nfunction renderLoginTemplate(variables: {\n  siteName: string;\n  loginPath: string;\n  cssPath: string;\n  error?: string;\n}): string {\n  const templateVars = {\n    siteName: variables.siteName,\n    loginPath: variables.loginPath,\n    cssPath: variables.cssPath,\n    errorHtml: variables.error\n      ? `<div class=\"error-message\">${variables.error}</div>`\n      : \"\",\n    errorClass: variables.error ? \" input-error\" : \"\",\n  };\n\n  let html = loginTemplate;\n\n  Object.entries(templateVars).forEach(([key, value]) => {\n    html = html.replace(new RegExp(`{{${key}}}`, \"g\"), value || \"\");\n  });\n\n  return html;\n}\n\nexport async function handleStagingProcess<ResponseType>({\n  context,\n  options,\n  staticPrefix,\n  cssRoute,\n  callbacks,\n}: StagingProcessOptions<ResponseType>): Promise<ResponseType> {\n  const { url, method, cookies, originalUrl = \"/\" } = context;\n\n  // Skip if staging is disabled\n  if (!options.enabled) {\n    return callbacks.next();\n  }\n\n  if (process.env.DEBUG) {\n    console.log(\"Incoming request path:\", url);\n  }\n\n  // Serve CSS file\n  if (url === cssRoute) {\n    return callbacks.sendCss(stylesContent);\n  }\n\n  // Skip auth check for static assets\n  if (url.startsWith(staticPrefix)) {\n    return callbacks.next();\n  }\n\n  // Verify JWT Secret is set\n  if (!options.jwtSecret || options.jwtSecret === \"unset\") {\n    const setupHtml = renderSetupTemplate({\n      pageTitle: \"Setup Required\",\n      title: \"Setup Required\",\n      description: \"JWT Secret not configured\",\n      alertText:\n        \"To protect your routes, you need to set up a JWT secret for token encryption. You can do this in two ways:\",\n      setupMethod1Label: \"Using environment variable\",\n      setupMethod1: \"STAGING_JWT_SECRET=your-secret\",\n      setupMethod2Label: \"Or when initializing the middleware\",\n      setupMethod2: \"staging({\\n  jwtSecret: 'your-secret'\\n})\",\n      footerText: \"Please set up the JWT secret and restart your application.\",\n      cssPath: cssRoute,\n    });\n    return callbacks.sendHtml(setupHtml, 500);\n  }\n\n  // If no password is set, show setup instructions\n  if (!options.password) {\n    const setupHtml = renderSetupTemplate({\n      pageTitle: \"Setup Required\",\n      title: \"Setup Required\",\n      description: \"Password not configured\",\n      alertText:\n        \"To protect your routes, you need to set up a password. You can do this in two ways:\",\n      setupMethod1Label: \"Using environment variable\",\n      setupMethod1: \"STAGING_PASSWORD=your-password\",\n      setupMethod2Label: \"Or when initializing the middleware\",\n      setupMethod2: \"staging({\\n  password: 'your-password'\\n})\",\n      footerText: \"Please set up the password and restart your application.\",\n      cssPath: cssRoute,\n    });\n    return callbacks.sendHtml(setupHtml, 500);\n  }\n\n  if (url === options.loginPath) {\n    if (method === \"POST\") {\n      if (context.password === options.password) {\n        // Convert jwtSecret to Uint8Array for jose\n        const secretKey = new TextEncoder().encode(options.jwtSecret);\n        // Generate JWT token\n        const token = await new SignJWT({})\n          .setProtectedHeader({ alg: \"HS256\" })\n          .setIssuedAt()\n          .setExpirationTime(\"7d\")\n          .sign(secretKey);\n\n        // Set auth cookie\n        await callbacks.setCookie(\"staging\", token, {\n          maxAge: options.cookieMaxAge,\n          path: \"/\",\n          httpOnly: true,\n          secure: process.env.NODE_ENV === \"production\",\n          sameSite: \"lax\",\n        });\n\n        // Get redirect URL from session or default\n        let redirectUrl = options.redirectUrl;\n        if (context.session?.returnTo) {\n          redirectUrl = context.session.returnTo;\n          callbacks.clearSessionValue?.(\"returnTo\");\n        } else {\n          redirectUrl = originalUrl;\n        }\n        return callbacks.redirect(redirectUrl);\n      }\n      // Invalid password\n      const html = renderLoginTemplate({\n        siteName: options.siteName,\n        loginPath: options.loginPath,\n        cssPath: cssRoute,\n        error: \"Invalid password. Please try again.\",\n      });\n      return callbacks.sendHtml(html, 401);\n    }\n\n    // GET request - show login form\n    const html = renderLoginTemplate({\n      siteName: options.siteName,\n      loginPath: options.loginPath,\n      cssPath: cssRoute,\n    });\n    return callbacks.sendHtml(html, 200);\n  }\n\n  // Check if route should be protected\n  if (!isProtectedRoute(url, options)) {\n    if (process.env.DEBUG) {\n      console.log(\"Route is not protected, allowing access:\", url);\n    }\n    return callbacks.next();\n  }\n\n  // Verify JWT token\n  const token = cookies.staging;\n  if (token) {\n    try {\n      const secretKey = new TextEncoder().encode(options.jwtSecret);\n      await jwtVerify(token, secretKey);\n      return callbacks.next();\n    } catch (err) {\n      if (process.env.DEBUG) {\n        console.log(\"Invalid token, clearing cookie\");\n      }\n      await callbacks.clearCookie(\"staging\");\n    }\n  }\n\n  // Store return URL\n  if (callbacks.setSessionValue) {\n    await callbacks.setSessionValue(\"returnTo\", originalUrl);\n  }\n\n  // Show login form with 401 status\n  const html = renderLoginTemplate({\n    siteName: options.siteName,\n    loginPath: options.loginPath,\n    cssPath: cssRoute,\n  });\n  return callbacks.sendHtml(html, 200);\n}\n"]}