{"version":3,"sources":["../src/theme/server.ts"],"sourcesContent":["import { getCurrentRequestOrNull } from \"../server/request\";\nimport { _setFarmThemeServerSnapshotResolver } from \"./bridge\";\nimport { resolveFarmThemeConfig } from \"./config\";\nimport type {\n  FarmThemeConfig,\n  FarmThemePreference,\n  FarmThemeSnapshot,\n  ResolvedFarmThemeConfig,\n} from \"./types\";\n\nlet defaultThemeConfig = resolveFarmThemeConfig(undefined);\n\nexport function _setDefaultFarmThemeConfig(\n  config: FarmThemeConfig | ResolvedFarmThemeConfig | false | undefined,\n  basePath = \"/\",\n): void {\n  defaultThemeConfig = resolveFarmThemeConfig(config, basePath);\n}\n\n// The theme preference is cosmetic, so a missing request context must never\n// crash a render: without a request to read the cookie from, the configured\n// default applies. Runtimes with partial AsyncLocalStorage support (for\n// example StackBlitz WebContainers) can lose the store mid-render, and a\n// thrown error here would also take down the error page itself.\nexport function getTheme(request: Request | null = getCurrentRequestOrNull()): FarmThemePreference {\n  if (!request) return defaultThemeConfig.default;\n  return readFarmThemePreference(request, defaultThemeConfig);\n}\n\nexport function getThemeSnapshot(\n  request: Request | null = getCurrentRequestOrNull(),\n): FarmThemeSnapshot {\n  const theme = request\n    ? readFarmThemePreference(request, defaultThemeConfig)\n    : defaultThemeConfig.default;\n  return {\n    theme,\n    resolvedTheme: theme === \"system\" ? undefined : theme,\n    mounted: false,\n  };\n}\n\nexport function readFarmThemePreference(\n  request: Request,\n  config: ResolvedFarmThemeConfig,\n): FarmThemePreference {\n  if (!config.enabled) return config.default;\n  const stored = readCookie(request.headers.get(\"cookie\"), config.storageKey);\n  return isFarmThemePreference(stored) ? stored : config.default;\n}\n\nfunction readCookie(cookieHeader: string | null, name: string): string | undefined {\n  if (!cookieHeader) return undefined;\n  for (const entry of cookieHeader.split(\";\")) {\n    const separator = entry.indexOf(\"=\");\n    if (separator < 0) continue;\n    const key = decodeCookieValue(entry.slice(0, separator).trim());\n    if (key !== name) continue;\n    return decodeCookieValue(entry.slice(separator + 1).trim());\n  }\n  return undefined;\n}\n\nfunction decodeCookieValue(value: string): string {\n  try {\n    return decodeURIComponent(value);\n  } catch {\n    return value;\n  }\n}\n\nfunction isFarmThemePreference(value: unknown): value is FarmThemePreference {\n  return value === \"light\" || value === \"dark\" || value === \"system\";\n}\n\n_setFarmThemeServerSnapshotResolver(() => {\n  try {\n    return getThemeSnapshot();\n  } catch {\n    const theme = defaultThemeConfig.default;\n    return {\n      theme,\n      resolvedTheme: theme === \"system\" ? undefined : theme,\n      mounted: false,\n    };\n  }\n});\n"],"mappings":";;;;;;;;;;;;;;AAUA,IAAI,qBAAqB,uBAAuB,MAAS;AAElD,SAAS,2BACd,QACA,WAAW,KACL;AACN,uBAAqB,uBAAuB,QAAQ,QAAQ;AAC9D;AALgB;AAYT,SAAS,SAAS,UAA0B,wBAAwB,GAAwB;AACjG,MAAI,CAAC,QAAS,QAAO,mBAAmB;AACxC,SAAO,wBAAwB,SAAS,kBAAkB;AAC5D;AAHgB;AAKT,SAAS,iBACd,UAA0B,wBAAwB,GAC/B;AACnB,QAAM,QAAQ,UACV,wBAAwB,SAAS,kBAAkB,IACnD,mBAAmB;AACvB,SAAO;AAAA,IACL;AAAA,IACA,eAAe,UAAU,WAAW,SAAY;AAAA,IAChD,SAAS;AAAA,EACX;AACF;AAXgB;AAaT,SAAS,wBACd,SACA,QACqB;AACrB,MAAI,CAAC,OAAO,QAAS,QAAO,OAAO;AACnC,QAAM,SAAS,WAAW,QAAQ,QAAQ,IAAI,QAAQ,GAAG,OAAO,UAAU;AAC1E,SAAO,sBAAsB,MAAM,IAAI,SAAS,OAAO;AACzD;AAPgB;AAShB,SAAS,WAAW,cAA6B,MAAkC;AACjF,MAAI,CAAC,aAAc,QAAO;AAC1B,aAAW,SAAS,aAAa,MAAM,GAAG,GAAG;AAC3C,UAAM,YAAY,MAAM,QAAQ,GAAG;AACnC,QAAI,YAAY,EAAG;AACnB,UAAM,MAAM,kBAAkB,MAAM,MAAM,GAAG,SAAS,EAAE,KAAK,CAAC;AAC9D,QAAI,QAAQ,KAAM;AAClB,WAAO,kBAAkB,MAAM,MAAM,YAAY,CAAC,EAAE,KAAK,CAAC;AAAA,EAC5D;AACA,SAAO;AACT;AAVS;AAYT,SAAS,kBAAkB,OAAuB;AAChD,MAAI;AACF,WAAO,mBAAmB,KAAK;AAAA,EACjC,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AANS;AAQT,SAAS,sBAAsB,OAA8C;AAC3E,SAAO,UAAU,WAAW,UAAU,UAAU,UAAU;AAC5D;AAFS;AAIT,oCAAoC,MAAM;AACxC,MAAI;AACF,WAAO,iBAAiB;AAAA,EAC1B,QAAQ;AACN,UAAM,QAAQ,mBAAmB;AACjC,WAAO;AAAA,MACL;AAAA,MACA,eAAe,UAAU,WAAW,SAAY;AAAA,MAChD,SAAS;AAAA,IACX;AAAA,EACF;AACF,CAAC;","names":[]}