{"version":3,"sources":["../src/navigation-errors.ts"],"sourcesContent":["export type FarmRedirectStatus = 301 | 302 | 303 | 307 | 308;\n\nexport interface FarmRedirectSignal {\n  url: string;\n  status: FarmRedirectStatus;\n}\n\nconst REDIRECT_ERROR_CODE = \"FARM_REDIRECT\";\nconst NOT_FOUND_ERROR_CODE = \"FARM_NOT_FOUND\";\nconst REDIRECT_ERROR_SYMBOL = Symbol.for(\"farm.navigation.redirect\");\nconst NOT_FOUND_ERROR_SYMBOL = Symbol.for(\"farm.navigation.notFound\");\n\ntype FarmNavigationError = Error & {\n  digest: string;\n  [REDIRECT_ERROR_SYMBOL]?: FarmRedirectSignal;\n  [NOT_FOUND_ERROR_SYMBOL]?: true;\n};\n\nexport function redirect(url: string, status: FarmRedirectStatus = 307): never {\n  throw createRedirectError(url, status);\n}\n\nexport function permanentRedirect(url: string): never {\n  redirect(url, 308);\n}\n\nexport function notFound(): never {\n  const error = new Error(NOT_FOUND_ERROR_CODE) as FarmNavigationError;\n  error.digest = NOT_FOUND_ERROR_CODE;\n  error[NOT_FOUND_ERROR_SYMBOL] = true;\n  throw error;\n}\n\nexport function isFarmRedirectError(error: unknown): boolean {\n  return Boolean(getFarmRedirectError(error));\n}\n\nexport function getFarmRedirectError(error: unknown): FarmRedirectSignal | null {\n  if (!error || typeof error !== \"object\") return null;\n  const candidate = error as Partial<FarmNavigationError>;\n  if (candidate[REDIRECT_ERROR_SYMBOL]) {\n    return candidate[REDIRECT_ERROR_SYMBOL] as FarmRedirectSignal;\n  }\n\n  if (\n    typeof candidate.digest === \"string\" &&\n    candidate.digest.startsWith(`${REDIRECT_ERROR_CODE};`)\n  ) {\n    const [, status, ...urlParts] = candidate.digest.split(\";\");\n    const parsedStatus = Number(status);\n    if (isFarmRedirectStatus(parsedStatus)) {\n      return {\n        status: parsedStatus,\n        url: urlParts.join(\";\"),\n      };\n    }\n  }\n\n  return null;\n}\n\nexport function isFarmNotFoundError(error: unknown): boolean {\n  if (!error || typeof error !== \"object\") return false;\n  const candidate = error as Partial<FarmNavigationError>;\n  return Boolean(candidate[NOT_FOUND_ERROR_SYMBOL] || candidate.digest === NOT_FOUND_ERROR_CODE);\n}\n\nfunction createRedirectError(url: string, status: FarmRedirectStatus): FarmNavigationError {\n  const error = new Error(`${REDIRECT_ERROR_CODE};${status};${url}`) as FarmNavigationError;\n  error.digest = `${REDIRECT_ERROR_CODE};${status};${url}`;\n  error[REDIRECT_ERROR_SYMBOL] = { url, status };\n  return error;\n}\n\nexport function isFarmRedirectStatus(status: unknown): status is FarmRedirectStatus {\n  return status === 301 || status === 302 || status === 303 || status === 307 || status === 308;\n}\n"],"mappings":";;;;;AAOA,IAAM,sBAAsB;AAC5B,IAAM,uBAAuB;AAC7B,IAAM,wBAAwB,uBAAO,IAAI,0BAA0B;AACnE,IAAM,yBAAyB,uBAAO,IAAI,0BAA0B;AAQ7D,SAAS,SAAS,KAAa,SAA6B,KAAY;AAC7E,QAAM,oBAAoB,KAAK,MAAM;AACvC;AAFgB;AAIT,SAAS,kBAAkB,KAAoB;AACpD,WAAS,KAAK,GAAG;AACnB;AAFgB;AAIT,SAAS,WAAkB;AAChC,QAAM,QAAQ,IAAI,MAAM,oBAAoB;AAC5C,QAAM,SAAS;AACf,QAAM,sBAAsB,IAAI;AAChC,QAAM;AACR;AALgB;AAOT,SAAS,oBAAoB,OAAyB;AAC3D,SAAO,QAAQ,qBAAqB,KAAK,CAAC;AAC5C;AAFgB;AAIT,SAAS,qBAAqB,OAA2C;AAC9E,MAAI,CAAC,SAAS,OAAO,UAAU,SAAU,QAAO;AAChD,QAAM,YAAY;AAClB,MAAI,UAAU,qBAAqB,GAAG;AACpC,WAAO,UAAU,qBAAqB;AAAA,EACxC;AAEA,MACE,OAAO,UAAU,WAAW,YAC5B,UAAU,OAAO,WAAW,GAAG,mBAAmB,GAAG,GACrD;AACA,UAAM,CAAC,EAAE,QAAQ,GAAG,QAAQ,IAAI,UAAU,OAAO,MAAM,GAAG;AAC1D,UAAM,eAAe,OAAO,MAAM;AAClC,QAAI,qBAAqB,YAAY,GAAG;AACtC,aAAO;AAAA,QACL,QAAQ;AAAA,QACR,KAAK,SAAS,KAAK,GAAG;AAAA,MACxB;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AACT;AAtBgB;AAwBT,SAAS,oBAAoB,OAAyB;AAC3D,MAAI,CAAC,SAAS,OAAO,UAAU,SAAU,QAAO;AAChD,QAAM,YAAY;AAClB,SAAO,QAAQ,UAAU,sBAAsB,KAAK,UAAU,WAAW,oBAAoB;AAC/F;AAJgB;AAMhB,SAAS,oBAAoB,KAAa,QAAiD;AACzF,QAAM,QAAQ,IAAI,MAAM,GAAG,mBAAmB,IAAI,MAAM,IAAI,GAAG,EAAE;AACjE,QAAM,SAAS,GAAG,mBAAmB,IAAI,MAAM,IAAI,GAAG;AACtD,QAAM,qBAAqB,IAAI,EAAE,KAAK,OAAO;AAC7C,SAAO;AACT;AALS;AAOF,SAAS,qBAAqB,QAA+C;AAClF,SAAO,WAAW,OAAO,WAAW,OAAO,WAAW,OAAO,WAAW,OAAO,WAAW;AAC5F;AAFgB;","names":[]}