@access-dlsu/leapify 0.260507.5 → 0.260524.2

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.
Files changed (135) hide show
  1. package/dist/app.d.ts.map +1 -1
  2. package/dist/chunk-64MMUYMK.cjs +167 -0
  3. package/dist/chunk-64MMUYMK.cjs.map +1 -0
  4. package/dist/chunk-AKCERDGP.js +161 -0
  5. package/dist/chunk-AKCERDGP.js.map +1 -0
  6. package/dist/client/index.cjs +60 -841
  7. package/dist/client/index.cjs.map +1 -1
  8. package/dist/client/index.d.ts +3 -8
  9. package/dist/client/index.d.ts.map +1 -1
  10. package/dist/client/index.js +58 -839
  11. package/dist/client/index.js.map +1 -1
  12. package/dist/client/turnstile.d.ts +25 -0
  13. package/dist/client/turnstile.d.ts.map +1 -0
  14. package/dist/client/types.d.ts +2 -15
  15. package/dist/client/types.d.ts.map +1 -1
  16. package/dist/db/migrate.d.ts.map +1 -1
  17. package/dist/db/schema/classes.d.ts +0 -19
  18. package/dist/db/schema/classes.d.ts.map +1 -1
  19. package/dist/db/schema/site-config.d.ts +0 -83
  20. package/dist/db/schema/site-config.d.ts.map +1 -1
  21. package/dist/index.cjs +666 -38320
  22. package/dist/index.cjs.map +1 -1
  23. package/dist/index.d.ts +3 -5
  24. package/dist/index.d.ts.map +1 -1
  25. package/dist/index.js +519 -38166
  26. package/dist/index.js.map +1 -1
  27. package/dist/lib/middleware/cors.d.ts.map +1 -1
  28. package/dist/lib/middleware/rate-limit.d.ts.map +1 -1
  29. package/dist/lib/middleware/referer-guard.d.ts.map +1 -1
  30. package/dist/lib/middleware/turnstile-challenge.cjs +29 -0
  31. package/dist/lib/middleware/turnstile-challenge.cjs.map +1 -0
  32. package/dist/lib/middleware/turnstile-challenge.d.ts +45 -0
  33. package/dist/lib/middleware/turnstile-challenge.d.ts.map +1 -0
  34. package/dist/lib/middleware/turnstile-challenge.js +4 -0
  35. package/dist/lib/middleware/turnstile-challenge.js.map +1 -0
  36. package/dist/queues/jobs.d.ts +0 -5
  37. package/dist/queues/jobs.d.ts.map +1 -1
  38. package/dist/routes/classes.d.ts.map +1 -1
  39. package/dist/routes/faqs.d.ts.map +1 -1
  40. package/dist/routes/site-config.d.ts.map +1 -1
  41. package/dist/routes/themes.d.ts.map +1 -1
  42. package/dist/routes/uploads.d.ts.map +1 -1
  43. package/dist/types.d.ts +5 -26
  44. package/dist/types.d.ts.map +1 -1
  45. package/dist/worker-handler.d.ts +1 -0
  46. package/dist/worker-handler.d.ts.map +1 -1
  47. package/dist/worker.js +684 -64365
  48. package/dist/worker.js.map +1 -1
  49. package/package.json +11 -9
  50. package/dist/bun-sqlite-dialect-na--YwnN-NIYANHVJ.cjs +0 -162
  51. package/dist/bun-sqlite-dialect-na--YwnN-NIYANHVJ.cjs.map +0 -1
  52. package/dist/bun-sqlite-dialect-na--YwnN-XVQNOKSL.js +0 -160
  53. package/dist/bun-sqlite-dialect-na--YwnN-XVQNOKSL.js.map +0 -1
  54. package/dist/chunk-4DPT2KQR.cjs +0 -467
  55. package/dist/chunk-4DPT2KQR.cjs.map +0 -1
  56. package/dist/chunk-5JKLV7IE.cjs +0 -2962
  57. package/dist/chunk-5JKLV7IE.cjs.map +0 -1
  58. package/dist/chunk-5OQD5ALM.cjs +0 -76
  59. package/dist/chunk-5OQD5ALM.cjs.map +0 -1
  60. package/dist/chunk-5YYVBPAE.js +0 -2301
  61. package/dist/chunk-5YYVBPAE.js.map +0 -1
  62. package/dist/chunk-6MMWL46O.cjs +0 -7170
  63. package/dist/chunk-6MMWL46O.cjs.map +0 -1
  64. package/dist/chunk-EGRHWZRV.js +0 -3
  65. package/dist/chunk-EGRHWZRV.js.map +0 -1
  66. package/dist/chunk-EMMSS5I5.cjs +0 -37
  67. package/dist/chunk-EMMSS5I5.cjs.map +0 -1
  68. package/dist/chunk-FUCJEA2S.js +0 -6196
  69. package/dist/chunk-FUCJEA2S.js.map +0 -1
  70. package/dist/chunk-G3PMV62Z.js +0 -33
  71. package/dist/chunk-G3PMV62Z.js.map +0 -1
  72. package/dist/chunk-GNRL67OU.js +0 -2949
  73. package/dist/chunk-GNRL67OU.js.map +0 -1
  74. package/dist/chunk-HHNEB7YR.js +0 -8
  75. package/dist/chunk-HHNEB7YR.js.map +0 -1
  76. package/dist/chunk-IQEWVHLM.js +0 -889
  77. package/dist/chunk-IQEWVHLM.js.map +0 -1
  78. package/dist/chunk-JIZPYG6H.js +0 -72
  79. package/dist/chunk-JIZPYG6H.js.map +0 -1
  80. package/dist/chunk-JPVIXCF5.cjs +0 -10
  81. package/dist/chunk-JPVIXCF5.cjs.map +0 -1
  82. package/dist/chunk-JQSZJWBN.cjs +0 -3075
  83. package/dist/chunk-JQSZJWBN.cjs.map +0 -1
  84. package/dist/chunk-LVKPYSXI.cjs +0 -2312
  85. package/dist/chunk-LVKPYSXI.cjs.map +0 -1
  86. package/dist/chunk-MNEW2V4T.js +0 -447
  87. package/dist/chunk-MNEW2V4T.js.map +0 -1
  88. package/dist/chunk-MY37YE52.js +0 -3034
  89. package/dist/chunk-MY37YE52.js.map +0 -1
  90. package/dist/chunk-NKIQRCOM.cjs +0 -4
  91. package/dist/chunk-NKIQRCOM.cjs.map +0 -1
  92. package/dist/chunk-OK6RVPEH.cjs +0 -6200
  93. package/dist/chunk-OK6RVPEH.cjs.map +0 -1
  94. package/dist/chunk-OZ6HZKR5.js +0 -228
  95. package/dist/chunk-OZ6HZKR5.js.map +0 -1
  96. package/dist/chunk-RFP2X2FA.cjs +0 -903
  97. package/dist/chunk-RFP2X2FA.cjs.map +0 -1
  98. package/dist/chunk-S5DBMZVP.cjs +0 -234
  99. package/dist/chunk-S5DBMZVP.cjs.map +0 -1
  100. package/dist/chunk-XJSWMHDL.js +0 -7142
  101. package/dist/chunk-XJSWMHDL.js.map +0 -1
  102. package/dist/client/pow.d.ts +0 -28
  103. package/dist/client/pow.d.ts.map +0 -1
  104. package/dist/cron/lifecycle-check.d.ts +0 -10
  105. package/dist/cron/lifecycle-check.d.ts.map +0 -1
  106. package/dist/d1-sqlite-dialect-C2B7YsIT-6TVV7EJ5.js +0 -122
  107. package/dist/d1-sqlite-dialect-C2B7YsIT-6TVV7EJ5.js.map +0 -1
  108. package/dist/d1-sqlite-dialect-C2B7YsIT-PE74FLHQ.cjs +0 -124
  109. package/dist/d1-sqlite-dialect-C2B7YsIT-PE74FLHQ.cjs.map +0 -1
  110. package/dist/dist-DZHA5VYX.cjs +0 -260
  111. package/dist/dist-DZHA5VYX.cjs.map +0 -1
  112. package/dist/dist-RRQUBLLO.js +0 -258
  113. package/dist/dist-RRQUBLLO.js.map +0 -1
  114. package/dist/kysely-adapter-C76KJVG7.js +0 -10
  115. package/dist/kysely-adapter-C76KJVG7.js.map +0 -1
  116. package/dist/kysely-adapter-TGY4UUP5.cjs +0 -27
  117. package/dist/kysely-adapter-TGY4UUP5.cjs.map +0 -1
  118. package/dist/lib/middleware/pow-challenge.cjs +0 -29
  119. package/dist/lib/middleware/pow-challenge.cjs.map +0 -1
  120. package/dist/lib/middleware/pow-challenge.d.ts +0 -58
  121. package/dist/lib/middleware/pow-challenge.d.ts.map +0 -1
  122. package/dist/lib/middleware/pow-challenge.js +0 -4
  123. package/dist/lib/middleware/pow-challenge.js.map +0 -1
  124. package/dist/node-sqlite-dialect-B3H37T3R.cjs +0 -162
  125. package/dist/node-sqlite-dialect-B3H37T3R.cjs.map +0 -1
  126. package/dist/node-sqlite-dialect-GDP7ZE54.js +0 -160
  127. package/dist/node-sqlite-dialect-GDP7ZE54.js.map +0 -1
  128. package/dist/routes/contentful-sync.d.ts +0 -4
  129. package/dist/routes/contentful-sync.d.ts.map +0 -1
  130. package/dist/services/contentful-management.d.ts +0 -38
  131. package/dist/services/contentful-management.d.ts.map +0 -1
  132. package/dist/services/contentful.d.ts +0 -97
  133. package/dist/services/contentful.d.ts.map +0 -1
  134. package/dist/services/snapshot.d.ts +0 -95
  135. package/dist/services/snapshot.d.ts.map +0 -1
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../node_modules/better-auth/dist/package.mjs","../node_modules/better-auth/dist/version.mjs","../node_modules/better-auth/dist/utils/wildcard.mjs","../node_modules/better-auth/dist/utils/url.mjs","../node_modules/defu/dist/defu.mjs","../node_modules/@better-fetch/fetch/src/error.ts","../node_modules/@better-fetch/fetch/src/plugins.ts","../node_modules/@better-fetch/fetch/src/retry.ts","../node_modules/@better-fetch/fetch/src/auth.ts","../node_modules/@better-fetch/fetch/src/utils.ts","../node_modules/@better-fetch/fetch/src/create-fetch/schema.ts","../node_modules/@better-fetch/fetch/src/create-fetch/index.ts","../node_modules/@better-fetch/fetch/src/url.ts","../node_modules/@better-fetch/fetch/src/fetch.ts"],"names":["BetterAuthError","env","url","_a","getURL","clearTimeout","parser"],"mappings":"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","file":"chunk-RFP2X2FA.cjs","sourcesContent":["//#region package.json\nvar version = \"1.6.9\";\n//#endregion\nexport { version };\n","import { version } from \"./package.mjs\";\n//#region src/version.ts\nconst PACKAGE_VERSION = version;\n//#endregion\nexport { PACKAGE_VERSION };\n","//#region src/utils/wildcard.ts\n/**\n* Escapes a character if it has a special meaning in regular expressions\n* and returns the character as is if it doesn't\n*/\nfunction escapeRegExpChar(char) {\n\tif (char === \"-\" || char === \"^\" || char === \"$\" || char === \"+\" || char === \".\" || char === \"(\" || char === \")\" || char === \"|\" || char === \"[\" || char === \"]\" || char === \"{\" || char === \"}\" || char === \"*\" || char === \"?\" || char === \"\\\\\") return `\\\\${char}`;\n\telse return char;\n}\n/**\n* Escapes all characters in a given string that have a special meaning in regular expressions\n*/\nfunction escapeRegExpString(str) {\n\tlet result = \"\";\n\tfor (let i = 0; i < str.length; i++) result += escapeRegExpChar(str[i]);\n\treturn result;\n}\n/**\n* Transforms one or more glob patterns into a RegExp pattern\n*/\nfunction transform(pattern, separator = true) {\n\tif (Array.isArray(pattern)) return `(?:${pattern.map((p) => `^${transform(p, separator)}$`).join(\"|\")})`;\n\tlet separatorSplitter = \"\";\n\tlet separatorMatcher = \"\";\n\tlet wildcard = \".\";\n\tif (separator === true) {\n\t\tseparatorSplitter = \"/\";\n\t\tseparatorMatcher = \"[/\\\\\\\\]\";\n\t\twildcard = \"[^/\\\\\\\\]\";\n\t} else if (separator) {\n\t\tseparatorSplitter = separator;\n\t\tseparatorMatcher = escapeRegExpString(separatorSplitter);\n\t\tif (separatorMatcher.length > 1) {\n\t\t\tseparatorMatcher = `(?:${separatorMatcher})`;\n\t\t\twildcard = `((?!${separatorMatcher}).)`;\n\t\t} else wildcard = `[^${separatorMatcher}]`;\n\t}\n\tconst requiredSeparator = separator ? `${separatorMatcher}+?` : \"\";\n\tconst optionalSeparator = separator ? `${separatorMatcher}*?` : \"\";\n\tconst segments = separator ? pattern.split(separatorSplitter) : [pattern];\n\tlet result = \"\";\n\tfor (let s = 0; s < segments.length; s++) {\n\t\tconst segment = segments[s];\n\t\tconst nextSegment = segments[s + 1];\n\t\tlet currentSeparator = \"\";\n\t\tif (!segment && s > 0) continue;\n\t\tif (separator) if (s === segments.length - 1) currentSeparator = optionalSeparator;\n\t\telse if (nextSegment !== \"**\") currentSeparator = requiredSeparator;\n\t\telse currentSeparator = \"\";\n\t\tif (separator && segment === \"**\") {\n\t\t\tif (currentSeparator) {\n\t\t\t\tresult += s === 0 ? \"\" : currentSeparator;\n\t\t\t\tresult += `(?:${wildcard}*?${currentSeparator})*?`;\n\t\t\t}\n\t\t\tcontinue;\n\t\t}\n\t\tfor (let c = 0; c < segment.length; c++) {\n\t\t\tconst char = segment[c];\n\t\t\tif (char === \"\\\\\") {\n\t\t\t\tif (c < segment.length - 1) {\n\t\t\t\t\tresult += escapeRegExpChar(segment[c + 1]);\n\t\t\t\t\tc++;\n\t\t\t\t}\n\t\t\t} else if (char === \"?\") result += wildcard;\n\t\t\telse if (char === \"*\") result += `${wildcard}*?`;\n\t\t\telse result += escapeRegExpChar(char);\n\t\t}\n\t\tresult += currentSeparator;\n\t}\n\treturn result;\n}\nfunction isMatch(regexp, sample) {\n\tif (typeof sample !== \"string\") throw new TypeError(`Sample must be a string, but ${typeof sample} given`);\n\treturn regexp.test(sample);\n}\n/**\n* Compiles one or more glob patterns into a RegExp and returns an isMatch function.\n* The isMatch function takes a sample string as its only argument and returns `true`\n* if the string matches the pattern(s).\n*\n* ```js\n* wildcardMatch('src/*.js')('src/index.js') //=> true\n* ```\n*\n* ```js\n* const isMatch = wildcardMatch('*.example.com', '.')\n* isMatch('foo.example.com') //=> true\n* isMatch('foo.bar.com') //=> false\n* ```\n*/\nfunction wildcardMatch(pattern, options) {\n\tif (typeof pattern !== \"string\" && !Array.isArray(pattern)) throw new TypeError(`The first argument must be a single pattern string or an array of patterns, but ${typeof pattern} given`);\n\tif (typeof options === \"string\" || typeof options === \"boolean\") options = { separator: options };\n\tif (arguments.length === 2 && !(typeof options === \"undefined\" || typeof options === \"object\" && options !== null && !Array.isArray(options))) throw new TypeError(`The second argument must be an options object or a string/boolean separator, but ${typeof options} given`);\n\toptions = options || {};\n\tif (options.separator === \"\\\\\") throw new Error(\"\\\\ is not a valid separator because it is used for escaping. Try setting the separator to `true` instead\");\n\tconst regexpPattern = transform(pattern, options.separator);\n\tconst regexp = new RegExp(`^${regexpPattern}$`, options.flags);\n\tconst fn = isMatch.bind(null, regexp);\n\tfn.options = options;\n\tfn.pattern = pattern;\n\tfn.regexp = regexp;\n\treturn fn;\n}\n//#endregion\nexport { wildcardMatch };\n","import { wildcardMatch } from \"./wildcard.mjs\";\nimport { env } from \"@better-auth/core/env\";\nimport { BetterAuthError } from \"@better-auth/core/error\";\n//#region src/utils/url.ts\n/**\n* Minimal loopback check for dev scheme inference only. Reachable from\n* `client/config.ts` via `getBaseURL`, so we MUST NOT import the full\n* `@better-auth/core/utils/host` classifier here: its `utils/ip` dependency\n* on zod would leak into the client bundle (see `e2e/smoke/test/vite.spec.ts`).\n*\n* Server-side SSRF/loopback checks (oauth redirect matching, trusted-origin\n* resolution, electron fetch gate) continue to use the authoritative\n* `isLoopbackHost` from `@better-auth/core/utils/host`. This helper's only\n* job is picking `http` vs `https` for dev ergonomics.\n*/\nfunction isLoopbackForDevScheme(host) {\n\tconst hostname = host.replace(/:\\d+$/, \"\").replace(/^\\[|\\]$/g, \"\").toLowerCase();\n\treturn hostname === \"localhost\" || hostname.endsWith(\".localhost\") || hostname === \"::1\" || hostname.startsWith(\"127.\");\n}\nfunction checkHasPath(url) {\n\ttry {\n\t\treturn (new URL(url).pathname.replace(/\\/+$/, \"\") || \"/\") !== \"/\";\n\t} catch {\n\t\tthrow new BetterAuthError(`Invalid base URL: ${url}. Please provide a valid base URL.`);\n\t}\n}\nfunction assertHasProtocol(url) {\n\ttry {\n\t\tconst parsedUrl = new URL(url);\n\t\tif (parsedUrl.protocol !== \"http:\" && parsedUrl.protocol !== \"https:\") throw new BetterAuthError(`Invalid base URL: ${url}. URL must include 'http://' or 'https://'`);\n\t} catch (error) {\n\t\tif (error instanceof BetterAuthError) throw error;\n\t\tthrow new BetterAuthError(`Invalid base URL: ${url}. Please provide a valid base URL.`, { cause: error });\n\t}\n}\nfunction withPath(url, path = \"/api/auth\") {\n\tassertHasProtocol(url);\n\tif (checkHasPath(url)) return url;\n\tconst trimmedUrl = url.replace(/\\/+$/, \"\");\n\tif (!path || path === \"/\") return trimmedUrl;\n\tpath = path.startsWith(\"/\") ? path : `/${path}`;\n\treturn `${trimmedUrl}${path}`;\n}\nfunction validateProxyHeader(header, type) {\n\tif (!header || header.trim() === \"\") return false;\n\tif (type === \"proto\") return header === \"http\" || header === \"https\";\n\tif (type === \"host\") {\n\t\tif ([\n\t\t\t/\\.\\./,\n\t\t\t/\\0/,\n\t\t\t/[\\s]/,\n\t\t\t/^[.]/,\n\t\t\t/[<>'\"]/,\n\t\t\t/javascript:/i,\n\t\t\t/file:/i,\n\t\t\t/data:/i\n\t\t].some((pattern) => pattern.test(header))) return false;\n\t\treturn /^[a-zA-Z0-9]([a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(\\.[a-zA-Z0-9]([a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*(:[0-9]{1,5})?$/.test(header) || /^(\\d{1,3}\\.){3}\\d{1,3}(:[0-9]{1,5})?$/.test(header) || /^\\[[0-9a-fA-F:]+\\](:[0-9]{1,5})?$/.test(header) || /^localhost(:[0-9]{1,5})?$/i.test(header);\n\t}\n\treturn false;\n}\nfunction getBaseURL(url, path, request, loadEnv, trustedProxyHeaders) {\n\tif (url) return withPath(url, path);\n\tif (loadEnv !== false) {\n\t\tconst fromEnv = env.BETTER_AUTH_URL || env.NEXT_PUBLIC_BETTER_AUTH_URL || env.PUBLIC_BETTER_AUTH_URL || env.NUXT_PUBLIC_BETTER_AUTH_URL || env.NUXT_PUBLIC_AUTH_URL || (env.BASE_URL !== \"/\" ? env.BASE_URL : void 0);\n\t\tif (fromEnv) return withPath(fromEnv, path);\n\t}\n\tconst fromRequest = request?.headers.get(\"x-forwarded-host\");\n\tconst fromRequestProto = request?.headers.get(\"x-forwarded-proto\");\n\tif (fromRequest && fromRequestProto && trustedProxyHeaders) {\n\t\tif (validateProxyHeader(fromRequestProto, \"proto\") && validateProxyHeader(fromRequest, \"host\")) try {\n\t\t\treturn withPath(`${fromRequestProto}://${fromRequest}`, path);\n\t\t} catch (_error) {}\n\t}\n\tif (request) {\n\t\tconst url = getOrigin(request.url);\n\t\tif (!url) throw new BetterAuthError(\"Could not get origin from request. Please provide a valid base URL.\");\n\t\treturn withPath(url, path);\n\t}\n\tif (typeof window !== \"undefined\" && window.location) return withPath(window.location.origin, path);\n}\nfunction getOrigin(url) {\n\ttry {\n\t\tconst parsedUrl = new URL(url);\n\t\treturn parsedUrl.origin === \"null\" ? null : parsedUrl.origin;\n\t} catch {\n\t\treturn null;\n\t}\n}\nfunction getProtocol(url) {\n\ttry {\n\t\treturn new URL(url).protocol;\n\t} catch {\n\t\treturn null;\n\t}\n}\nfunction getHost(url) {\n\ttry {\n\t\treturn new URL(url).host;\n\t} catch {\n\t\treturn null;\n\t}\n}\n/**\n* Checks if the baseURL config is a dynamic config object\n*/\nfunction isDynamicBaseURLConfig(config) {\n\treturn typeof config === \"object\" && config !== null && \"allowedHosts\" in config && Array.isArray(config.allowedHosts);\n}\n/**\n* Check if a value is a `Request`\n* - `instanceof`: works for native Request instances\n* - `toString`: handles where instanceof check fails but the object is still a\n* valid Request (e.g. cross-realm, polyfills). Paired with a shape check so\n* an object that only spoofs `Symbol.toStringTag` without the real shape is\n* rejected before downstream code tries to read `.headers` / `.url`.\n*\n* @param value The value to check\n* @returns `true` if the value is a Request instance\n*/\nfunction isRequestLike(value) {\n\tif (value instanceof Request) return true;\n\tif (typeof value !== \"object\" || value === null || Object.prototype.toString.call(value) !== \"[object Request]\") return false;\n\tconst v = value;\n\treturn typeof v.url === \"string\" && typeof v.headers === \"object\" && v.headers !== null && typeof v.headers.get === \"function\";\n}\n/**\n* Extracts the host from a `Request` or `Headers`.\n* Honors `x-forwarded-host` only when `trustedProxyHeaders` is enabled,\n* then falls back to the `host` header and finally the request URL.\n*/\nfunction getHostFromSource(source, trustedProxyHeaders) {\n\tconst headers = isRequestLike(source) ? source.headers : source;\n\tif (trustedProxyHeaders) {\n\t\tconst forwardedHost = headers.get(\"x-forwarded-host\");\n\t\tif (forwardedHost && validateProxyHeader(forwardedHost, \"host\")) return forwardedHost;\n\t}\n\tconst host = headers.get(\"host\");\n\tif (host && validateProxyHeader(host, \"host\")) return host;\n\tif (isRequestLike(source)) try {\n\t\treturn new URL(source.url).host;\n\t} catch {\n\t\treturn null;\n\t}\n\treturn null;\n}\n/**\n* Extracts the protocol from a `Request` or `Headers`.\n* Honors `x-forwarded-proto` only when `trustedProxyHeaders` is enabled,\n* then falls back to the request URL, then to \"https\".\n*/\nfunction getProtocolFromSource(source, configProtocol, trustedProxyHeaders) {\n\tif (configProtocol === \"http\" || configProtocol === \"https\") return configProtocol;\n\tconst headers = isRequestLike(source) ? source.headers : source;\n\tif (trustedProxyHeaders) {\n\t\tconst forwardedProto = headers.get(\"x-forwarded-proto\");\n\t\tif (forwardedProto && validateProxyHeader(forwardedProto, \"proto\")) return forwardedProto;\n\t}\n\tif (isRequestLike(source)) try {\n\t\tconst url = new URL(source.url);\n\t\tif (url.protocol === \"http:\" || url.protocol === \"https:\") return url.protocol.slice(0, -1);\n\t} catch {}\n\tconst host = getHostFromSource(source, trustedProxyHeaders);\n\tif (host && isLoopbackForDevScheme(host)) return \"http\";\n\treturn \"https\";\n}\n/**\n* Matches a hostname against a host pattern.\n* Supports wildcard patterns like `*.vercel.app` or `preview-*.myapp.com`.\n*\n* @param host The hostname to test (e.g., \"myapp.com\", \"preview-123.vercel.app\")\n* @param pattern The host pattern (e.g., \"myapp.com\", \"*.vercel.app\")\n* @returns {boolean} true if the host matches the pattern, false otherwise.\n*\n* @example\n* ```ts\n* matchesHostPattern(\"myapp.com\", \"myapp.com\") // true\n* matchesHostPattern(\"preview-123.vercel.app\", \"*.vercel.app\") // true\n* matchesHostPattern(\"preview-123.myapp.com\", \"preview-*.myapp.com\") // true\n* matchesHostPattern(\"evil.com\", \"myapp.com\") // false\n* ```\n*/\nconst matchesHostPattern = (host, pattern) => {\n\tif (!host || !pattern) return false;\n\tconst normalizedHost = host.replace(/^https?:\\/\\//, \"\").split(\"/\")[0].toLowerCase();\n\tconst normalizedPattern = pattern.replace(/^https?:\\/\\//, \"\").split(\"/\")[0].toLowerCase();\n\tif (normalizedPattern.includes(\"*\") || normalizedPattern.includes(\"?\")) return wildcardMatch(normalizedPattern)(normalizedHost);\n\treturn normalizedHost.toLowerCase() === normalizedPattern.toLowerCase();\n};\n/**\n* Resolves the base URL from a dynamic config based on the incoming request.\n* Validates the derived host against the allowedHosts allowlist.\n*\n* @param config The dynamic base URL config\n* @param request The incoming request\n* @param basePath The base path to append\n* @returns The resolved base URL with path\n* @throws BetterAuthError if host is not in allowedHosts and no fallback is set\n*/\nfunction resolveDynamicBaseURL(config, source, basePath, trustedProxyHeaders) {\n\tconst host = getHostFromSource(source, trustedProxyHeaders);\n\tif (!host) {\n\t\tif (config.fallback) return withPath(config.fallback, basePath);\n\t\tthrow new BetterAuthError(\"Could not determine host from request headers. Please provide a fallback URL in your baseURL config.\");\n\t}\n\tif (config.allowedHosts.some((pattern) => matchesHostPattern(host, pattern))) return withPath(`${getProtocolFromSource(source, config.protocol, trustedProxyHeaders)}://${host}`, basePath);\n\tif (config.fallback) return withPath(config.fallback, basePath);\n\tthrow new BetterAuthError(`Host \"${host}\" is not in the allowed hosts list. Allowed hosts: ${config.allowedHosts.join(\", \")}. Add this host to your allowedHosts config or provide a fallback URL.`);\n}\n/**\n* Resolves the base URL from any config type (static string or dynamic object).\n* This is the main entry point for base URL resolution.\n*\n* @param config The base URL config (string or object)\n* @param basePath The base path to append\n* @param request Optional request for dynamic resolution\n* @param loadEnv Whether to load from environment variables\n* @param trustedProxyHeaders Whether to trust proxy headers (for legacy behavior)\n* @returns The resolved base URL with path\n*/\nfunction resolveBaseURL(config, basePath, source, loadEnv, trustedProxyHeaders) {\n\tif (isDynamicBaseURLConfig(config)) {\n\t\tif (source) return resolveDynamicBaseURL(config, source, basePath, trustedProxyHeaders);\n\t\tif (config.fallback) return withPath(config.fallback, basePath);\n\t\treturn getBaseURL(void 0, basePath, void 0, loadEnv, trustedProxyHeaders);\n\t}\n\tconst request = isRequestLike(source) ? source : void 0;\n\tif (typeof config === \"string\") return getBaseURL(config, basePath, request, loadEnv, trustedProxyHeaders);\n\treturn getBaseURL(void 0, basePath, request, loadEnv, trustedProxyHeaders);\n}\n//#endregion\nexport { getBaseURL, getHost, getHostFromSource, getOrigin, getProtocol, getProtocolFromSource, isDynamicBaseURLConfig, isRequestLike, matchesHostPattern, resolveBaseURL, resolveDynamicBaseURL };\n","function isPlainObject(value) {\n if (value === null || typeof value !== \"object\") {\n return false;\n }\n const prototype = Object.getPrototypeOf(value);\n if (prototype !== null && prototype !== Object.prototype && Object.getPrototypeOf(prototype) !== null) {\n return false;\n }\n if (Symbol.iterator in value) {\n return false;\n }\n if (Symbol.toStringTag in value) {\n return Object.prototype.toString.call(value) === \"[object Module]\";\n }\n return true;\n}\n\nfunction _defu(baseObject, defaults, namespace = \".\", merger) {\n if (!isPlainObject(defaults)) {\n return _defu(baseObject, {}, namespace, merger);\n }\n const object = { ...defaults };\n for (const key of Object.keys(baseObject)) {\n if (key === \"__proto__\" || key === \"constructor\") {\n continue;\n }\n const value = baseObject[key];\n if (value === null || value === void 0) {\n continue;\n }\n if (merger && merger(object, key, value, namespace)) {\n continue;\n }\n if (Array.isArray(value) && Array.isArray(object[key])) {\n object[key] = [...value, ...object[key]];\n } else if (isPlainObject(value) && isPlainObject(object[key])) {\n object[key] = _defu(\n value,\n object[key],\n (namespace ? `${namespace}.` : \"\") + key.toString(),\n merger\n );\n } else {\n object[key] = value;\n }\n }\n return object;\n}\nfunction createDefu(merger) {\n return (...arguments_) => (\n // eslint-disable-next-line unicorn/no-array-reduce\n arguments_.reduce((p, c) => _defu(p, c, \"\", merger), {})\n );\n}\nconst defu = createDefu();\nconst defuFn = createDefu((object, key, currentValue) => {\n if (object[key] !== void 0 && typeof currentValue === \"function\") {\n object[key] = currentValue(object[key]);\n return true;\n }\n});\nconst defuArrayFn = createDefu((object, key, currentValue) => {\n if (Array.isArray(object[key]) && typeof currentValue === \"function\") {\n object[key] = currentValue(object[key]);\n return true;\n }\n});\n\nexport { createDefu, defu as default, defu, defuArrayFn, defuFn };\n","export class BetterFetchError extends Error {\n\tconstructor(\n\t\tpublic status: number,\n\t\tpublic statusText: string,\n\t\tpublic error: any,\n\t) {\n\t\tsuper(statusText || status.toString(), {\n\t\t\tcause: error,\n\t\t});\n\t\tError.captureStackTrace(this, this.constructor);\n\t}\n}\n","import type { StandardSchemaV1 } from \"./standard-schema\";\nimport type { Schema } from \"./create-fetch\";\nimport type { BetterFetchError } from \"./error\";\nimport type { BetterFetchOption } from \"./types\";\n\nexport type RequestContext<T extends Record<string, any> = any> = {\n\turl: URL | string;\n\theaders: Headers;\n\tbody: any;\n\tmethod: string;\n\tsignal: AbortSignal;\n} & BetterFetchOption<any, any, any, T>;\nexport type ResponseContext = {\n\tresponse: Response;\n\trequest: RequestContext;\n};\nexport type SuccessContext<Res = any> = {\n\tdata: Res;\n\tresponse: Response;\n\trequest: RequestContext;\n};\nexport type ErrorContext = {\n\tresponse: Response;\n\trequest: RequestContext;\n\terror: BetterFetchError & Record<string, any>;\n};\nexport interface FetchHooks<Res = any> {\n\t/**\n\t * a callback function that will be called when a\n\t * request is made.\n\t *\n\t * The returned context object will be reassigned to\n\t * the original request context.\n\t */\n\tonRequest?: <T extends Record<string, any>>(\n\t\tcontext: RequestContext<T>,\n\t) => Promise<RequestContext | void> | RequestContext | void;\n\t/**\n\t * a callback function that will be called when\n\t * response is received. This will be called before\n\t * the response is parsed and returned.\n\t *\n\t * The returned response will be reassigned to the\n\t * original response if it's changed.\n\t */\n\tonResponse?: (\n\t\tcontext: ResponseContext,\n\t) =>\n\t\t| Promise<Response | void | ResponseContext>\n\t\t| Response\n\t\t| ResponseContext\n\t\t| void;\n\t/**\n\t * a callback function that will be called when a\n\t * response is successful.\n\t */\n\tonSuccess?: (context: SuccessContext<Res>) => Promise<void> | void;\n\t/**\n\t * a callback function that will be called when an\n\t * error occurs.\n\t */\n\tonError?: (context: ErrorContext) => Promise<void> | void;\n\t/**\n\t * a callback function that will be called when a\n\t * request is retried.\n\t */\n\tonRetry?: (response: ResponseContext) => Promise<void> | void;\n\t/**\n\t * Options for the hooks\n\t */\n\thookOptions?: {\n\t\t/**\n\t\t * Clone the response\n\t\t * @see https://developer.mozilla.org/en-US/docs/Web/API/Response/clone\n\t\t */\n\t\tcloneResponse?: boolean;\n\t};\n}\n\n/**\n * A plugin that returns an id and hooks\n */\nexport type BetterFetchPlugin<\n\tExtraOptions extends Record<string, any> = Record<string, any>,\n> = {\n\t/**\n\t * A unique id for the plugin\n\t */\n\tid: string;\n\t/**\n\t * A name for the plugin\n\t */\n\tname: string;\n\t/**\n\t * A description for the plugin\n\t */\n\tdescription?: string;\n\t/**\n\t * A version for the plugin\n\t */\n\tversion?: string;\n\t/**\n\t * Hooks for the plugin\n\t */\n\thooks?: FetchHooks;\n\t/**\n\t * A function that will be called when the plugin is\n\t * initialized. This will be called before the any\n\t * of the other internal functions.\n\t *\n\t * The returned options will be merged with the\n\t * original options.\n\t */\n\tinit?: (\n\t\turl: string,\n\t\toptions?: BetterFetchOption & ExtraOptions,\n\t) =>\n\t\t| Promise<{\n\t\t\t\turl: string;\n\t\t\t\toptions?: BetterFetchOption;\n\t\t }>\n\t\t| {\n\t\t\t\turl: string;\n\t\t\t\toptions?: BetterFetchOption;\n\t\t };\n\t/**\n\t * A schema for the plugin\n\t */\n\tschema?: Schema;\n\t/**\n\t * Additional options that can be passed to the plugin\n\t *\n\t * @deprecated Use type inference through direct typescript instead\n\t * ```ts\n\t * const plugin = {\n\t *\n\t * } satisfies BetterFetchPlugin<{\n\t * myCustomOptions: string;\n\t * }>\n\t * ```\n\t */\n\tgetOptions?: () => StandardSchemaV1;\n};\n\nexport const initializePlugins = async (\n\turl: string,\n\toptions?: BetterFetchOption,\n) => {\n\tlet opts = options || {};\n\tconst hooks: {\n\t\tonRequest: Array<FetchHooks[\"onRequest\"]>;\n\t\tonResponse: Array<FetchHooks[\"onResponse\"]>;\n\t\tonSuccess: Array<FetchHooks[\"onSuccess\"]>;\n\t\tonError: Array<FetchHooks[\"onError\"]>;\n\t\tonRetry: Array<FetchHooks[\"onRetry\"]>;\n\t} = {\n\t\tonRequest: [options?.onRequest],\n\t\tonResponse: [options?.onResponse],\n\t\tonSuccess: [options?.onSuccess],\n\t\tonError: [options?.onError],\n\t\tonRetry: [options?.onRetry],\n\t};\n\tif (!options || !options?.plugins) {\n\t\treturn {\n\t\t\turl,\n\t\t\toptions: opts,\n\t\t\thooks,\n\t\t};\n\t}\n\tfor (const plugin of options?.plugins || []) {\n\t\tif (plugin.init) {\n\t\t\tconst pluginRes = await plugin.init?.(url.toString(), options);\n\t\t\topts = pluginRes.options || opts;\n\t\t\turl = pluginRes.url;\n\t\t}\n\t\thooks.onRequest.push(plugin.hooks?.onRequest);\n\t\thooks.onResponse.push(plugin.hooks?.onResponse);\n\t\thooks.onSuccess.push(plugin.hooks?.onSuccess);\n\t\thooks.onError.push(plugin.hooks?.onError);\n\t\thooks.onRetry.push(plugin.hooks?.onRetry);\n\t}\n\n\treturn {\n\t\turl,\n\t\toptions: opts,\n\t\thooks,\n\t};\n};\n","export type RetryCondition = (\n\tresponse: Response | null,\n) => boolean | Promise<boolean>;\n\nexport type LinearRetry = {\n\ttype: \"linear\";\n\tattempts: number;\n\tdelay: number;\n\tshouldRetry?: RetryCondition;\n};\n\nexport type ExponentialRetry = {\n\ttype: \"exponential\";\n\tattempts: number;\n\tbaseDelay: number;\n\tmaxDelay: number;\n\tshouldRetry?: RetryCondition;\n};\n\nexport type RetryOptions = LinearRetry | ExponentialRetry | number;\n\nexport interface RetryStrategy {\n\tshouldAttemptRetry(\n\t\tattempt: number,\n\t\tresponse: Response | null,\n\t): Promise<boolean>;\n\tgetDelay(attempt: number): number;\n}\n\nclass LinearRetryStrategy implements RetryStrategy {\n\tconstructor(private options: LinearRetry) {}\n\n\tshouldAttemptRetry(\n\t\tattempt: number,\n\t\tresponse: Response | null,\n\t): Promise<boolean> {\n\t\tif (this.options.shouldRetry) {\n\t\t\treturn Promise.resolve(\n\t\t\t\tattempt < this.options.attempts && this.options.shouldRetry(response),\n\t\t\t);\n\t\t}\n\t\treturn Promise.resolve(attempt < this.options.attempts);\n\t}\n\n\tgetDelay(): number {\n\t\treturn this.options.delay;\n\t}\n}\n\nclass ExponentialRetryStrategy implements RetryStrategy {\n\tconstructor(private options: ExponentialRetry) {}\n\n\tshouldAttemptRetry(\n\t\tattempt: number,\n\t\tresponse: Response | null,\n\t): Promise<boolean> {\n\t\tif (this.options.shouldRetry) {\n\t\t\treturn Promise.resolve(\n\t\t\t\tattempt < this.options.attempts && this.options.shouldRetry(response),\n\t\t\t);\n\t\t}\n\t\treturn Promise.resolve(attempt < this.options.attempts);\n\t}\n\n\tgetDelay(attempt: number): number {\n\t\tconst delay = Math.min(\n\t\t\tthis.options.maxDelay,\n\t\t\tthis.options.baseDelay * 2 ** attempt,\n\t\t);\n\t\treturn delay;\n\t}\n}\n\nexport function createRetryStrategy(options: RetryOptions): RetryStrategy {\n\tif (typeof options === \"number\") {\n\t\treturn new LinearRetryStrategy({\n\t\t\ttype: \"linear\",\n\t\t\tattempts: options,\n\t\t\tdelay: 1000,\n\t\t});\n\t}\n\n\tswitch (options.type) {\n\t\tcase \"linear\":\n\t\t\treturn new LinearRetryStrategy(options);\n\t\tcase \"exponential\":\n\t\t\treturn new ExponentialRetryStrategy(options);\n\t\tdefault:\n\t\t\tthrow new Error(\"Invalid retry strategy\");\n\t}\n}\n","import type { BetterFetchOption } from \"./types\";\n\nexport type typeOrTypeReturning<T> = T | (() => T);\n/**\n * Bearer token authentication\n *\n * the value of `token` will be added to a header as\n * `auth: Bearer token`,\n */\nexport type Bearer = {\n\ttype: \"Bearer\";\n\ttoken: typeOrTypeReturning<string | undefined | Promise<string | undefined>>;\n};\n\n/**\n * Basic auth\n */\nexport type Basic = {\n\ttype: \"Basic\";\n\tusername: typeOrTypeReturning<string | undefined>;\n\tpassword: typeOrTypeReturning<string | undefined>;\n};\n\n/**\n * Custom auth\n *\n * @param prefix - prefix of the header\n * @param value - value of the header\n *\n * @example\n * ```ts\n * {\n * type: \"Custom\",\n * prefix: \"Token\",\n * value: \"token\"\n * }\n * ```\n */\nexport type Custom = {\n\ttype: \"Custom\";\n\tprefix: typeOrTypeReturning<string | undefined>;\n\tvalue: typeOrTypeReturning<string | undefined>;\n};\n\nexport type Auth = Bearer | Basic | Custom;\n\nexport const getAuthHeader = async (options?: BetterFetchOption) => {\n\tconst headers: Record<string, string> = {};\n\tconst getValue = async (\n\t\tvalue: typeOrTypeReturning<\n\t\t\tstring | undefined | Promise<string | undefined>\n\t\t>,\n\t) => (typeof value === \"function\" ? await value() : value);\n\tif (options?.auth) {\n\t\tif (options.auth.type === \"Bearer\") {\n\t\t\tconst token = await getValue(options.auth.token);\n\t\t\tif (!token) {\n\t\t\t\treturn headers;\n\t\t\t}\n\t\t\theaders[\"authorization\"] = `Bearer ${token}`;\n\t\t} else if (options.auth.type === \"Basic\") {\n\t\t\tconst [username, password] = await Promise.all([\n\t\t\t\tgetValue(options.auth.username),\n\t\t\t\tgetValue(options.auth.password),\n\t\t\t]);\n\t\t\tif (!username || !password) {\n\t\t\t\treturn headers;\n\t\t\t}\n\t\t\theaders[\"authorization\"] = `Basic ${btoa(`${username}:${password}`)}`;\n\t\t} else if (options.auth.type === \"Custom\") {\n\t\t\tconst [prefix, value] = await Promise.all([\n\t\t\t\tgetValue(options.auth.prefix),\n\t\t\t\tgetValue(options.auth.value),\n\t\t\t]);\n\t\t\tif (!value) {\n\t\t\t\treturn headers;\n\t\t\t}\n\t\t\theaders[\"authorization\"] = `${prefix ?? \"\"} ${value}`;\n\t\t}\n\t}\n\treturn headers;\n};\n","import type { StandardSchemaV1 } from \"./standard-schema\";\nimport { getAuthHeader } from \"./auth\";\nimport { methods } from \"./create-fetch\";\nimport type { BetterFetchOption, FetchEsque } from \"./types\";\n\nconst JSON_RE = /^application\\/(?:[\\w!#$%&*.^`~-]*\\+)?json(;.+)?$/i;\n\nexport type ResponseType = \"json\" | \"text\" | \"blob\";\nexport function detectResponseType(request: Response): ResponseType {\n\tconst _contentType = request.headers.get(\"content-type\");\n\tconst textTypes = new Set([\n\t\t\"image/svg\",\n\t\t\"application/xml\",\n\t\t\"application/xhtml\",\n\t\t\"application/html\",\n\t]);\n\tif (!_contentType) {\n\t\treturn \"json\";\n\t}\n\tconst contentType = _contentType.split(\";\").shift() || \"\";\n\tif (JSON_RE.test(contentType)) {\n\t\treturn \"json\";\n\t}\n\tif (textTypes.has(contentType) || contentType.startsWith(\"text/\")) {\n\t\treturn \"text\";\n\t}\n\treturn \"blob\";\n}\n\nexport function isJSONParsable(value: any) {\n\ttry {\n\t\tJSON.parse(value);\n\t\treturn true;\n\t} catch (error) {\n\t\treturn false;\n\t}\n}\n\n//https://github.com/unjs/ofetch/blob/main/src/utils.ts\nexport function isJSONSerializable(value: any) {\n\tif (value === undefined) {\n\t\treturn false;\n\t}\n\tconst t = typeof value;\n\tif (t === \"string\" || t === \"number\" || t === \"boolean\" || t === null) {\n\t\treturn true;\n\t}\n\tif (t !== \"object\") {\n\t\treturn false;\n\t}\n\tif (Array.isArray(value)) {\n\t\treturn true;\n\t}\n\tif (value.buffer) {\n\t\treturn false;\n\t}\n\treturn (\n\t\t(value.constructor && value.constructor.name === \"Object\") ||\n\t\ttypeof value.toJSON === \"function\"\n\t);\n}\n\nexport function jsonParse(text: string) {\n\ttry {\n\t\treturn JSON.parse(text);\n\t} catch (error) {\n\t\treturn text;\n\t}\n}\n\nexport function isFunction(value: any): value is () => any {\n\treturn typeof value === \"function\";\n}\n\nexport function getFetch(options?: BetterFetchOption): FetchEsque {\n\tif (options?.customFetchImpl) {\n\t\treturn options.customFetchImpl;\n\t}\n\tif (typeof globalThis !== \"undefined\" && isFunction(globalThis.fetch)) {\n\t\treturn globalThis.fetch;\n\t}\n\tif (typeof window !== \"undefined\" && isFunction(window.fetch)) {\n\t\treturn window.fetch;\n\t}\n\tthrow new Error(\"No fetch implementation found\");\n}\n\nexport function isPayloadMethod(method?: string) {\n\tif (!method) {\n\t\treturn false;\n\t}\n\tconst payloadMethod = [\"POST\", \"PUT\", \"PATCH\", \"DELETE\"];\n\treturn payloadMethod.includes(method.toUpperCase());\n}\n\nexport function isRouteMethod(method?: string) {\n\tconst routeMethod = [\"GET\", \"POST\", \"PUT\", \"PATCH\", \"DELETE\"];\n\tif (!method) {\n\t\treturn false;\n\t}\n\treturn routeMethod.includes(method.toUpperCase());\n}\n\nexport async function getHeaders(opts?: BetterFetchOption) {\n\tconst headers = new Headers(opts?.headers);\n\tconst authHeader = await getAuthHeader(opts);\n\tfor (const [key, value] of Object.entries(authHeader || {})) {\n\t\theaders.set(key, value);\n\t}\n\tif (!headers.has(\"content-type\")) {\n\t\tconst t = detectContentType(opts?.body);\n\t\tif (t) {\n\t\t\theaders.set(\"content-type\", t);\n\t\t}\n\t}\n\n\treturn headers;\n}\n\nexport function getURL(url: string, options?: BetterFetchOption) {\n\tif (url.startsWith(\"@\")) {\n\t\tconst m = url.toString().split(\"@\")[1].split(\"/\")[0];\n\t\tif (methods.includes(m)) {\n\t\t\turl = url.replace(`@${m}/`, \"/\");\n\t\t}\n\t}\n\tlet _url: string | URL;\n\ttry {\n\t\tif (url.startsWith(\"http\")) {\n\t\t\t_url = url;\n\t\t} else {\n\t\t\tlet baseURL = options?.baseURL;\n\t\t\tif (baseURL && !baseURL?.endsWith(\"/\")) {\n\t\t\t\tbaseURL = baseURL + \"/\";\n\t\t\t}\n\t\t\tif (url.startsWith(\"/\")) {\n\t\t\t\t_url = new URL(url.substring(1), baseURL);\n\t\t\t} else {\n\t\t\t\t_url = new URL(url, options?.baseURL);\n\t\t\t}\n\t\t}\n\t} catch (e) {\n\t\tif (e instanceof TypeError) {\n\t\t\tif (!options?.baseURL) {\n\t\t\t\tthrow TypeError(\n\t\t\t\t\t`Invalid URL ${url}. Are you passing in a relative url but not setting the baseURL?`,\n\t\t\t\t);\n\t\t\t}\n\t\t\tthrow TypeError(\n\t\t\t\t`Invalid URL ${url}. Please validate that you are passing the correct input.`,\n\t\t\t);\n\t\t}\n\t\tthrow e;\n\t}\n\n\t/**\n\t * Dynamic Parameters.\n\t */\n\tif (options?.params) {\n\t\tif (Array.isArray(options?.params)) {\n\t\t\tconst params = options?.params\n\t\t\t\t? Array.isArray(options.params)\n\t\t\t\t\t? `/${options.params.join(\"/\")}`\n\t\t\t\t\t: `/${Object.values(options.params).join(\"/\")}`\n\t\t\t\t: \"\";\n\t\t\t_url = _url.toString().split(\"/:\")[0];\n\t\t\t_url = `${_url.toString()}${params}`;\n\t\t} else {\n\t\t\tfor (const [key, value] of Object.entries(options?.params)) {\n\t\t\t\t_url = _url.toString().replace(`:${key}`, String(value));\n\t\t\t}\n\t\t}\n\t}\n\tconst __url = new URL(_url);\n\t/**\n\t * Query Parameters\n\t */\n\tconst queryParams = options?.query;\n\tif (queryParams) {\n\t\tfor (const [key, value] of Object.entries(queryParams)) {\n\t\t\t__url.searchParams.append(key, String(value));\n\t\t}\n\t}\n\treturn __url;\n}\n\nexport function detectContentType(body: any) {\n\tif (isJSONSerializable(body)) {\n\t\treturn \"application/json\";\n\t}\n\n\treturn null;\n}\n\nexport function getBody(options?: BetterFetchOption) {\n\tif (!options?.body) {\n\t\treturn null;\n\t}\n\tconst headers = new Headers(options?.headers);\n\tif (isJSONSerializable(options.body) && !headers.has(\"content-type\")) {\n\t\tfor (const [key, value] of Object.entries(options?.body)) {\n\t\t\tif (value instanceof Date) {\n\t\t\t\toptions.body[key] = value.toISOString();\n\t\t\t}\n\t\t}\n\t\treturn JSON.stringify(options.body);\n\t}\n\n\tif (\n\t\theaders.has(\"content-type\") &&\n\t\theaders.get(\"content-type\") === \"application/x-www-form-urlencoded\"\n\t) {\n\t\tif (isJSONSerializable(options.body)) {\n\t\t\treturn new URLSearchParams(options.body).toString();\n\t\t}\n\t\treturn options.body;\n\t}\n\n\treturn options.body;\n}\n\nexport function getMethod(url: string, options?: BetterFetchOption) {\n\tif (options?.method) {\n\t\treturn options.method.toUpperCase();\n\t}\n\tif (url.startsWith(\"@\")) {\n\t\tconst pMethod = url.split(\"@\")[1]?.split(\"/\")[0];\n\t\tif (!methods.includes(pMethod)) {\n\t\t\treturn options?.body ? \"POST\" : \"GET\";\n\t\t}\n\t\treturn pMethod.toUpperCase();\n\t}\n\treturn options?.body ? \"POST\" : \"GET\";\n}\n\nexport function getTimeout(\n\toptions?: BetterFetchOption,\n\tcontroller?: AbortController,\n) {\n\tlet abortTimeout: ReturnType<typeof setTimeout> | undefined;\n\tif (!options?.signal && options?.timeout) {\n\t\tabortTimeout = setTimeout(() => controller?.abort(), options?.timeout);\n\t}\n\treturn {\n\t\tabortTimeout,\n\t\tclearTimeout: () => {\n\t\t\tif (abortTimeout) {\n\t\t\t\tclearTimeout(abortTimeout);\n\t\t\t}\n\t\t},\n\t};\n}\n\nexport function bodyParser(data: any, responseType: ResponseType) {\n\tif (responseType === \"json\") {\n\t\treturn JSON.parse(data);\n\t}\n\treturn data;\n}\n\nexport class ValidationError extends Error {\n\tpublic readonly issues: ReadonlyArray<StandardSchemaV1.Issue>;\n\n\tconstructor(issues: ReadonlyArray<StandardSchemaV1.Issue>, message?: string) {\n\t\t// Default message fallback in case one isn't supplied.\n\t\tsuper(message || JSON.stringify(issues, null, 2));\n\t\tthis.issues = issues;\n\n\t\t// Set the prototype explicitly to ensure that instanceof works correctly.\n\t\tObject.setPrototypeOf(this, ValidationError.prototype);\n\t}\n}\n\nexport async function parseStandardSchema<TSchema extends StandardSchemaV1>(\n\tschema: TSchema,\n\tinput: StandardSchemaV1.InferInput<TSchema>,\n): Promise<StandardSchemaV1.InferOutput<TSchema>> {\n\tconst result = await schema[\"~standard\"].validate(input);\n\n\tif (result.issues) {\n\t\tthrow new ValidationError(result.issues);\n\t}\n\treturn result.value;\n}\n","import type { StandardSchemaV1 } from \"../standard-schema\";\nimport type { StringLiteralUnion } from \"../type-utils\";\n\nexport type FetchSchema = {\n\tinput?: StandardSchemaV1;\n\toutput?: StandardSchemaV1;\n\tquery?: StandardSchemaV1;\n\tparams?: StandardSchemaV1<Record<string, unknown>> | undefined;\n\tmethod?: Methods;\n};\n\nexport type Methods = \"get\" | \"post\" | \"put\" | \"patch\" | \"delete\";\n\nexport const methods = [\"get\", \"post\", \"put\", \"patch\", \"delete\"];\n\ntype RouteKey = StringLiteralUnion<`@${Methods}/`>;\n\nexport type FetchSchemaRoutes = {\n\t[key in RouteKey]?: FetchSchema;\n};\n\nexport const createSchema = <\n\tF extends FetchSchemaRoutes,\n\tS extends SchemaConfig,\n>(\n\tschema: F,\n\tconfig?: S,\n) => {\n\treturn {\n\t\tschema: schema as F,\n\t\tconfig: config as S,\n\t};\n};\n\nexport type SchemaConfig = {\n\tstrict?: boolean;\n\t/**\n\t * A prefix that will be prepended when it's\n\t * calling the schema.\n\t *\n\t * NOTE: Make sure to handle converting\n\t * the prefix to the baseURL in the init\n\t * function if you you are defining for a\n\t * plugin.\n\t */\n\tprefix?: \"\" | (string & Record<never, never>);\n\t/**\n\t * The base url of the schema. By default it's the baseURL of the fetch instance.\n\t */\n\tbaseURL?: \"\" | (string & Record<never, never>);\n};\n\nexport type Schema = {\n\tschema: FetchSchemaRoutes;\n\tconfig: SchemaConfig;\n};\n","import { betterFetch } from \"../fetch\";\nimport { BetterFetchPlugin } from \"../plugins\";\nimport type { BetterFetchOption } from \"../types\";\nimport { parseStandardSchema } from \"../utils\";\nimport type { BetterFetch, CreateFetchOption } from \"./types\";\n\nexport const applySchemaPlugin = (config: CreateFetchOption) =>\n\t({\n\t\tid: \"apply-schema\",\n\t\tname: \"Apply Schema\",\n\t\tversion: \"1.0.0\",\n\t\tasync init(url, options) {\n\t\t\tconst schema =\n\t\t\t\tconfig.plugins?.find((plugin) =>\n\t\t\t\t\tplugin.schema?.config\n\t\t\t\t\t\t? url.startsWith(plugin.schema.config.baseURL || \"\") ||\n\t\t\t\t\t\t\turl.startsWith(plugin.schema.config.prefix || \"\")\n\t\t\t\t\t\t: false,\n\t\t\t\t)?.schema || config.schema;\n\t\t\tif (schema) {\n\t\t\t\tlet urlKey = url;\n\t\t\t\tif (schema.config?.prefix) {\n\t\t\t\t\tif (urlKey.startsWith(schema.config.prefix)) {\n\t\t\t\t\t\turlKey = urlKey.replace(schema.config.prefix, \"\");\n\t\t\t\t\t\tif (schema.config.baseURL) {\n\t\t\t\t\t\t\turl = url.replace(schema.config.prefix, schema.config.baseURL);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (schema.config?.baseURL) {\n\t\t\t\t\tif (urlKey.startsWith(schema.config.baseURL)) {\n\t\t\t\t\t\turlKey = urlKey.replace(schema.config.baseURL, \"\");\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tconst keySchema = schema.schema[urlKey];\n\t\t\t\tif (keySchema) {\n\t\t\t\t\tlet opts = {\n\t\t\t\t\t\t...options,\n\t\t\t\t\t\tmethod: keySchema.method,\n\t\t\t\t\t\toutput: keySchema.output,\n\t\t\t\t\t};\n\t\t\t\t\tif (!options?.disableValidation) {\n\t\t\t\t\t\topts = {\n\t\t\t\t\t\t\t...opts,\n\t\t\t\t\t\t\tbody: keySchema.input\n\t\t\t\t\t\t\t\t? await parseStandardSchema(keySchema.input, options?.body)\n\t\t\t\t\t\t\t\t: options?.body,\n\t\t\t\t\t\t\tparams: keySchema.params\n\t\t\t\t\t\t\t\t? await parseStandardSchema(keySchema.params, options?.params)\n\t\t\t\t\t\t\t\t: options?.params,\n\t\t\t\t\t\t\tquery: keySchema.query\n\t\t\t\t\t\t\t\t? await parseStandardSchema(keySchema.query, options?.query)\n\t\t\t\t\t\t\t\t: options?.query,\n\t\t\t\t\t\t};\n\t\t\t\t\t}\n\t\t\t\t\treturn {\n\t\t\t\t\t\turl,\n\t\t\t\t\t\toptions: opts,\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn {\n\t\t\t\turl,\n\t\t\t\toptions,\n\t\t\t};\n\t\t},\n\t}) satisfies BetterFetchPlugin;\n\nexport const createFetch = <Option extends CreateFetchOption>(\n\tconfig?: Option,\n) => {\n\tasync function $fetch(url: string, options?: BetterFetchOption) {\n\t\tconst opts = {\n\t\t\t...config,\n\t\t\t...options,\n\t\t\tplugins: [...(config?.plugins || []), applySchemaPlugin(config || {}), ...(options?.plugins || [])],\n\t\t} as BetterFetchOption;\n\n\t\tif (config?.catchAllError) {\n\t\t\ttry {\n\t\t\t\treturn await betterFetch(url, opts);\n\t\t\t} catch (error) {\n\t\t\t\treturn {\n\t\t\t\t\tdata: null,\n\t\t\t\t\terror: {\n\t\t\t\t\t\tstatus: 500,\n\t\t\t\t\t\tstatusText: \"Fetch Error\",\n\t\t\t\t\t\tmessage:\n\t\t\t\t\t\t\t\"Fetch related error. Captured by catchAllError option. See error property for more details.\",\n\t\t\t\t\t\terror,\n\t\t\t\t\t},\n\t\t\t\t};\n\t\t\t}\n\t\t}\n\t\treturn await betterFetch(url, opts);\n\t}\n\treturn $fetch as BetterFetch<Option>;\n};\n\nexport * from \"./schema\";\nexport * from \"./types\";\n","import { methods } from \"./create-fetch\";\nimport type { BetterFetchOption } from \"./types\";\n\n/**\n * Normalize URL\n */\nexport function getURL(url: string, option?: BetterFetchOption) {\n\tconst { baseURL, params, query } = option || {\n\t\tquery: {},\n\t\tparams: {},\n\t\tbaseURL: \"\",\n\t};\n\tlet basePath = url.startsWith(\"http\")\n\t\t? url.split(\"/\").slice(0, 3).join(\"/\")\n\t\t: baseURL || \"\";\n\n\t/**\n\t * Remove method modifiers\n\t */\n\tif (url.startsWith(\"@\")) {\n\t\tconst m = url.toString().split(\"@\")[1].split(\"/\")[0];\n\t\tif (methods.includes(m)) {\n\t\t\turl = url.replace(`@${m}/`, \"/\");\n\t\t}\n\t}\n\n\tif (!basePath.endsWith(\"/\")) basePath += \"/\";\n\tlet [path, urlQuery] = url.replace(basePath, \"\").split(\"?\");\n\tconst queryParams = new URLSearchParams(urlQuery);\n\tfor (const [key, value] of Object.entries(query || {})) {\n\t\tif (value == null) continue;\n\t\tlet serializedValue;\n\t\tif (typeof value === \"string\") {\n\t\t\tserializedValue = value;\n\t\t} else if (Array.isArray(value)) {\n\t\t\tfor (const val of value) {\n\t\t\t\tqueryParams.append(key, val);\n\t\t\t}\n\t\t\tcontinue;\n\t\t} else {\n\t\t\tserializedValue = JSON.stringify(value);\n\t\t}\n\t\tqueryParams.set(key, serializedValue);\n\t}\n\tif (params) {\n\t\tif (Array.isArray(params)) {\n\t\t\tconst paramPaths = path.split(\"/\").filter((p) => p.startsWith(\":\"));\n\t\t\tfor (const [index, key] of paramPaths.entries()) {\n\t\t\t\tconst value = params[index];\n\t\t\t\tpath = path.replace(key, value);\n\t\t\t}\n\t\t} else {\n\t\t\tfor (const [key, value] of Object.entries(params)) {\n\t\t\t\tpath = path.replace(`:${key}`, String(value));\n\t\t\t}\n\t\t}\n\t}\n\n\tpath = path.split(\"/\").map(encodeURIComponent).join(\"/\");\n\tif (path.startsWith(\"/\")) path = path.slice(1);\n\tlet queryParamString = queryParams.toString();\n\tqueryParamString =\n\t\tqueryParamString.length > 0\n\t\t\t? `?${queryParamString}`.replace(/\\+/g, \"%20\")\n\t\t\t: \"\";\n\tif (!basePath.startsWith(\"http\")) {\n\t\treturn `${basePath}${path}${queryParamString}`;\n\t}\n\tconst _url = new URL(`${path}${queryParamString}`, basePath);\n\treturn _url;\n}\n","import { BetterFetchError } from \"./error\";\nimport { initializePlugins } from \"./plugins\";\nimport { createRetryStrategy } from \"./retry\";\nimport type { StandardSchemaV1 } from \"./standard-schema\";\nimport type { BetterFetchOption, BetterFetchResponse } from \"./types\";\nimport { getURL } from \"./url\";\nimport {\n\tdetectResponseType,\n\tgetBody,\n\tgetFetch,\n\tgetHeaders,\n\tgetMethod,\n\tgetTimeout,\n\tisJSONParsable,\n\tjsonParse,\n\tparseStandardSchema,\n} from \"./utils\";\n\nexport const betterFetch = async <\n\tTRes extends Option[\"output\"] extends StandardSchemaV1\n\t\t? StandardSchemaV1.InferOutput<Option[\"output\"]>\n\t\t: unknown,\n\tTErr = unknown,\n\tOption extends BetterFetchOption = BetterFetchOption<any, any, any, TRes>,\n>(\n\turl: string,\n\toptions?: Option,\n): Promise<\n\tBetterFetchResponse<\n\t\tTRes,\n\t\tTErr,\n\t\tOption[\"throw\"] extends true ? true : TErr extends false ? true : false\n\t>\n> => {\n\tconst {\n\t\thooks,\n\t\turl: __url,\n\t\toptions: opts,\n\t} = await initializePlugins(url, options);\n\tconst fetch = getFetch(opts);\n\tconst controller = new AbortController();\n\tconst signal = opts.signal ?? controller.signal;\n\tconst _url = getURL(__url, opts);\n\tconst body = getBody(opts);\n\tconst headers = await getHeaders(opts);\n\tconst method = getMethod(__url, opts);\n\tlet context = {\n\t\t...opts,\n\t\turl: _url,\n\t\theaders,\n\t\tbody,\n\t\tmethod,\n\t\tsignal,\n\t};\n\t/**\n\t * Run all on request hooks\n\t */\n\tfor (const onRequest of hooks.onRequest) {\n\t\tif (onRequest) {\n\t\t\tconst res = await onRequest(context);\n\t\t\tif (typeof res === \"object\" && res !== null) {\n\t\t\t\tcontext = res;\n\t\t\t}\n\t\t}\n\t}\n\tif (\n\t\t(\"pipeTo\" in context && typeof context.pipeTo === \"function\") ||\n\t\ttypeof options?.body?.pipe === \"function\"\n\t) {\n\t\tif (!(\"duplex\" in context)) {\n\t\t\tcontext.duplex = \"half\";\n\t\t}\n\t}\n\n\tconst { clearTimeout } = getTimeout(opts, controller);\n\tlet response = await fetch(context.url, context);\n\tclearTimeout();\n\n\tconst responseContext = {\n\t\tresponse,\n\t\trequest: context,\n\t};\n\n\tfor (const onResponse of hooks.onResponse) {\n\t\tif (onResponse) {\n\t\t\tconst r = await onResponse({\n\t\t\t\t...responseContext,\n\t\t\t\tresponse: options?.hookOptions?.cloneResponse\n\t\t\t\t\t? response.clone()\n\t\t\t\t\t: response,\n\t\t\t});\n\t\t\tif (r instanceof Response) {\n\t\t\t\tresponse = r;\n\t\t\t} else if (typeof r === \"object\" && r !== null) {\n\t\t\t\tresponse = r.response;\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * OK Branch\n\t */\n\tif (response.ok) {\n\t\tconst hasBody = context.method !== \"HEAD\";\n\t\tif (!hasBody) {\n\t\t\treturn {\n\t\t\t\tdata: \"\" as any,\n\t\t\t\terror: null,\n\t\t\t} as any;\n\t\t}\n\t\tconst responseType = detectResponseType(response);\n\t\tconst successContext = {\n\t\t\tdata: null as any,\n\t\t\tresponse,\n\t\t\trequest: context,\n\t\t};\n\t\tif (responseType === \"json\" || responseType === \"text\") {\n\t\t\tconst text = await response.text();\n\t\t\tconst parser = context.jsonParser ?? jsonParse;\n\t\t\tsuccessContext.data = await parser(text);\n\t\t} else {\n\t\t\tsuccessContext.data = await response[responseType]();\n\t\t}\n\n\t\t/**\n\t\t * Parse the data if the output schema is defined\n\t\t */\n\t\tif (context?.output) {\n\t\t\tif (context.output && !context.disableValidation) {\n\t\t\t\tsuccessContext.data = await parseStandardSchema(\n\t\t\t\t\tcontext.output as StandardSchemaV1,\n\t\t\t\t\tsuccessContext.data,\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\n\t\tfor (const onSuccess of hooks.onSuccess) {\n\t\t\tif (onSuccess) {\n\t\t\t\tawait onSuccess({\n\t\t\t\t\t...successContext,\n\t\t\t\t\tresponse: options?.hookOptions?.cloneResponse\n\t\t\t\t\t\t? response.clone()\n\t\t\t\t\t\t: response,\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\tif (options?.throw) {\n\t\t\treturn successContext.data;\n\t\t}\n\n\t\treturn {\n\t\t\tdata: successContext.data,\n\t\t\terror: null,\n\t\t} as any;\n\t}\n\tconst parser = options?.jsonParser ?? jsonParse;\n\tconst responseText = await response.text();\n\tconst isJSONResponse = isJSONParsable(responseText);\n\tconst errorObject = isJSONResponse ? await parser(responseText) : null;\n\t/**\n\t * Error Branch\n\t */\n\tconst errorContext = {\n\t\tresponse,\n\t\tresponseText,\n\t\trequest: context,\n\t\terror: {\n\t\t\t...errorObject,\n\t\t\tstatus: response.status,\n\t\t\tstatusText: response.statusText,\n\t\t},\n\t};\n\tfor (const onError of hooks.onError) {\n\t\tif (onError) {\n\t\t\tawait onError({\n\t\t\t\t...errorContext,\n\t\t\t\tresponse: options?.hookOptions?.cloneResponse\n\t\t\t\t\t? response.clone()\n\t\t\t\t\t: response,\n\t\t\t});\n\t\t}\n\t}\n\n\tif (options?.retry) {\n\t\tconst retryStrategy = createRetryStrategy(options.retry);\n\t\tconst _retryAttempt = options.retryAttempt ?? 0;\n\t\tif (await retryStrategy.shouldAttemptRetry(_retryAttempt, response)) {\n\t\t\tfor (const onRetry of hooks.onRetry) {\n\t\t\t\tif (onRetry) {\n\t\t\t\t\tawait onRetry(responseContext);\n\t\t\t\t}\n\t\t\t}\n\t\t\tconst delay = retryStrategy.getDelay(_retryAttempt);\n\t\t\tawait new Promise((resolve) => setTimeout(resolve, delay));\n\t\t\treturn await betterFetch(url, {\n\t\t\t\t...options,\n\t\t\t\tretryAttempt: _retryAttempt + 1,\n\t\t\t});\n\t\t}\n\t}\n\n\tif (options?.throw) {\n\t\tthrow new BetterFetchError(\n\t\t\tresponse.status,\n\t\t\tresponse.statusText,\n\t\t\tisJSONResponse ? errorObject : responseText,\n\t\t);\n\t}\n\treturn {\n\t\tdata: null,\n\t\terror: {\n\t\t\t...errorObject,\n\t\t\tstatus: response.status,\n\t\t\tstatusText: response.statusText,\n\t\t},\n\t} as any;\n};\n"]}
@@ -1,234 +0,0 @@
1
- 'use strict';
2
-
3
- var factory = require('hono/factory');
4
-
5
- // src/lib/middleware/pow-challenge.ts
6
- var POW_PATH = "/.well-known/leapify/pow";
7
- var POW_VERIFY_PATH = `${POW_PATH}/verify`;
8
- var POW_COOKIE_NAME = "leapify-pow";
9
- var CHALLENGE_KV_PREFIX = "pow:challenge:";
10
- var DEFAULT_POW_DIFFICULTY = 4;
11
- var CHALLENGE_TTL_SEC = 120;
12
- var COOKIE_MAX_AGE_SEC = 3600;
13
- var EXEMPT_PATHS = [
14
- "/health",
15
- "/internal",
16
- "/api/auth",
17
- "/api/uploads/images",
18
- "/api/classes",
19
- "/api/faqs",
20
- "/api/config"
21
- ];
22
- function base64urlEncode(bytes) {
23
- let binary = "";
24
- for (const byte of bytes) {
25
- binary += String.fromCharCode(byte);
26
- }
27
- return btoa(binary).replace(/\+/g, "-").replace(/\//g, "_").replace(/=+$/, "");
28
- }
29
- function base64urlDecode(str) {
30
- const padded = str.replace(/-/g, "+").replace(/_/g, "/");
31
- const binary = atob(padded);
32
- const bytes = new Uint8Array(new ArrayBuffer(binary.length));
33
- for (let i = 0; i < binary.length; i++) {
34
- bytes[i] = binary.charCodeAt(i);
35
- }
36
- return bytes;
37
- }
38
- async function generateChallengeId() {
39
- const bytes = crypto.getRandomValues(new Uint8Array(16));
40
- return base64urlEncode(bytes);
41
- }
42
- async function importHmacKey(secret) {
43
- return crypto.subtle.importKey(
44
- "raw",
45
- new TextEncoder().encode(secret),
46
- { name: "HMAC", hash: "SHA-256" },
47
- false,
48
- ["sign", "verify"]
49
- );
50
- }
51
- async function signCookie(secret, ip) {
52
- const ts = Date.now();
53
- const nonce = base64urlEncode(crypto.getRandomValues(new Uint8Array(8)));
54
- const payload = `${ip}:${ts}:${nonce}`;
55
- const key = await importHmacKey(secret);
56
- const sig = await crypto.subtle.sign(
57
- "HMAC",
58
- key,
59
- new TextEncoder().encode(payload)
60
- );
61
- const sigB64 = base64urlEncode(new Uint8Array(sig));
62
- return `${base64urlEncode(new TextEncoder().encode(payload))}.${sigB64}`;
63
- }
64
- async function validateCookie(secret, cookie, ip) {
65
- try {
66
- const [payloadB64, sigB64] = cookie.split(".");
67
- if (!payloadB64 || !sigB64) return false;
68
- const payloadBytes = base64urlDecode(payloadB64);
69
- const sigBytes = base64urlDecode(sigB64);
70
- const key = await importHmacKey(secret);
71
- const valid = await crypto.subtle.verify(
72
- "HMAC",
73
- key,
74
- sigBytes,
75
- payloadBytes
76
- );
77
- if (!valid) return false;
78
- const payload = new TextDecoder().decode(payloadBytes);
79
- const [cookieIp, tsStr] = payload.split(":");
80
- if (cookieIp !== ip) return false;
81
- const ts = parseInt(tsStr, 10);
82
- if (isNaN(ts) || Date.now() - ts > COOKIE_MAX_AGE_SEC * 1e3) return false;
83
- return true;
84
- } catch {
85
- return false;
86
- }
87
- }
88
- function getClientIp(c) {
89
- return c.req.header("CF-Connecting-IP") ?? c.req.header("X-Real-IP") ?? c.req.header("X-Forwarded-For")?.split(",")[0]?.trim() ?? "unknown";
90
- }
91
- function getDifficulty(env) {
92
- const raw = env.POW_DIFFICULTY;
93
- if (!raw) return DEFAULT_POW_DIFFICULTY;
94
- const parsed = parseInt(raw, 10);
95
- return isNaN(parsed) ? DEFAULT_POW_DIFFICULTY : Math.max(1, Math.min(parsed, 8));
96
- }
97
- function challengePageHtml(challengeId, difficulty, originalUrl) {
98
- return `<!DOCTYPE html>
99
- <html>
100
- <head>
101
- <meta charset="utf-8">
102
- <meta name="viewport" content="width=device-width, initial-scale=1">
103
- <title>Verifying your browser</title>
104
- <style>
105
- * { margin: 0; padding: 0; box-sizing: border-box; }
106
- body { font-family: system-ui, -apple-system, sans-serif; display: flex; justify-content: center; align-items: center; min-height: 100vh; background: #f5f5f5; color: #333; }
107
- .card { background: #fff; border-radius: 12px; padding: 2rem; box-shadow: 0 2px 12px rgba(0,0,0,0.08); text-align: center; max-width: 400px; }
108
- .spinner { width: 40px; height: 40px; border: 3px solid #e0e0e0; border-top-color: #333; border-radius: 50%; animation: spin 0.8s linear infinite; margin: 0 auto 1rem; }
109
- @keyframes spin { to { transform: rotate(360deg); } }
110
- h1 { font-size: 1.1rem; font-weight: 600; margin-bottom: 0.5rem; }
111
- p { font-size: 0.9rem; color: #666; }
112
- </style>
113
- </head>
114
- <body>
115
- <div class="card">
116
- <div class="spinner"></div>
117
- <h1>Verifying your browser</h1>
118
- <p>This should only take a moment&hellip;</p>
119
- </div>
120
- <script>
121
- (async () => {
122
- const challengeId = ${JSON.stringify(challengeId)};
123
- const difficulty = ${difficulty};
124
- const prefix = '0'.repeat(Math.ceil(difficulty / 4));
125
- let nonce = 0;
126
- const t0 = performance.now();
127
- while (true) {
128
- const input = challengeId + ':' + nonce;
129
- const hash = await crypto.subtle.digest('SHA-256', new TextEncoder().encode(input));
130
- const hex = Array.from(new Uint8Array(hash)).map(b => b.toString(16).padStart(2, '0')).join('');
131
- if (hex.startsWith(prefix)) {
132
- const elapsed = performance.now() - t0;
133
- const res = await fetch(${JSON.stringify(POW_VERIFY_PATH)}, {
134
- method: 'POST',
135
- headers: { 'Content-Type': 'application/json' },
136
- body: JSON.stringify({ id: challengeId, nonce, elapsed, redir: ${JSON.stringify(originalUrl)} }),
137
- });
138
- const data = await res.json();
139
- if (data.redirect) window.location.href = data.redirect;
140
- else window.location.reload();
141
- break;
142
- }
143
- nonce++;
144
- }
145
- })();
146
- </script>
147
- </body>
148
- </html>`;
149
- }
150
- async function handlePowVerify(c) {
151
- const body = await c.req.json();
152
- const { id, nonce, redir } = body;
153
- if (!id || typeof nonce !== "number") {
154
- return c.json(
155
- {
156
- error: {
157
- code: "VALIDATION_ERROR",
158
- message: "Missing challenge id or nonce"
159
- }
160
- },
161
- 422
162
- );
163
- }
164
- const challenge = await c.env.KV.get(`${CHALLENGE_KV_PREFIX}${id}`);
165
- if (!challenge) {
166
- return c.json(
167
- { error: { code: "NOT_FOUND", message: "Challenge expired or invalid" } },
168
- 404
169
- );
170
- }
171
- const { difficulty } = JSON.parse(challenge);
172
- const input = new TextEncoder().encode(`${id}:${nonce}`);
173
- const hash = await crypto.subtle.digest("SHA-256", input);
174
- const hex = Array.from(new Uint8Array(hash)).map((b) => b.toString(16).padStart(2, "0")).join("");
175
- const requiredPrefix = "0".repeat(Math.ceil(difficulty / 4));
176
- if (!hex.startsWith(requiredPrefix)) {
177
- return c.json(
178
- { error: { code: "VALIDATION_ERROR", message: "Invalid proof of work" } },
179
- 422
180
- );
181
- }
182
- await c.env.KV.delete(`${CHALLENGE_KV_PREFIX}${id}`);
183
- const secret = c.env.INTERNAL_API_SECRET;
184
- const ip = getClientIp(c);
185
- const token = await signCookie(secret, ip);
186
- const isSecure = c.req.raw.url.startsWith("https") || c.req.header("x-forwarded-proto") === "https";
187
- c.header(
188
- "Set-Cookie",
189
- `${POW_COOKIE_NAME}=${token}; Path=/; Max-Age=${COOKIE_MAX_AGE_SEC}; ${isSecure ? "Secure; " : ""}HttpOnly; SameSite=Lax`
190
- );
191
- return c.json({ redirect: redir || "/" });
192
- }
193
- function createPowChallengeMiddleware() {
194
- return factory.createMiddleware(async (c, next) => {
195
- if (c.req.path === POW_VERIFY_PATH) return next();
196
- const normalizedPath = c.req.path.toLowerCase().replace(/\/$/, "");
197
- const isExempt = EXEMPT_PATHS.some((p) => {
198
- const ep = p.toLowerCase().replace(/\/$/, "");
199
- return normalizedPath === ep || normalizedPath.startsWith(ep + "/");
200
- });
201
- console.log(`[pow] path=${c.req.path} normalized=${normalizedPath} exempt=${isExempt}`);
202
- if (isExempt) return next();
203
- if (c.req.method === "OPTIONS") return next();
204
- if (c.req.header("Authorization")) return next();
205
- const cookieHeader = c.req.header("Cookie") ?? "";
206
- const cookieMatch = cookieHeader.match(
207
- new RegExp(`${POW_COOKIE_NAME}=([^;]+)`)
208
- );
209
- if (cookieMatch) {
210
- const secret = c.env.INTERNAL_API_SECRET;
211
- const ip = getClientIp(c);
212
- const valid = await validateCookie(secret, cookieMatch[1], ip);
213
- if (valid) return next();
214
- }
215
- const difficulty = getDifficulty(c.env);
216
- const challengeId = await generateChallengeId();
217
- await c.env.KV.put(
218
- `${CHALLENGE_KV_PREFIX}${challengeId}`,
219
- JSON.stringify({ difficulty, createdAt: Date.now() }),
220
- { expirationTtl: CHALLENGE_TTL_SEC }
221
- );
222
- const originalUrl = c.req.path + (c.req.query("?") ? c.req.query("?") : "");
223
- const html = challengePageHtml(challengeId, difficulty, originalUrl);
224
- return c.html(html, 200);
225
- });
226
- }
227
-
228
- exports.POW_COOKIE_NAME = POW_COOKIE_NAME;
229
- exports.POW_PATH = POW_PATH;
230
- exports.POW_VERIFY_PATH = POW_VERIFY_PATH;
231
- exports.createPowChallengeMiddleware = createPowChallengeMiddleware;
232
- exports.handlePowVerify = handlePowVerify;
233
- //# sourceMappingURL=chunk-S5DBMZVP.cjs.map
234
- //# sourceMappingURL=chunk-S5DBMZVP.cjs.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/lib/middleware/pow-challenge.ts"],"names":["createMiddleware"],"mappings":"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","file":"chunk-S5DBMZVP.cjs","sourcesContent":["/**\r\n * Proof-of-Work Challenge Middleware (ADR-006, Layer 7).\r\n *\r\n * Anubis-inspired PoW challenge, implemented natively as Hono middleware.\r\n * Requires browsers to solve a SHA-256 PoW puzzle before accessing API endpoints.\r\n * After solving, a signed cookie is issued so subsequent requests bypass the challenge.\r\n *\r\n * Flow:\r\n * 1. Request arrives → no valid PoW cookie → serve challenge HTML page\r\n * 2. Browser runs JS PoW (find nonce where SHA-256(challengeId:nonce) meets difficulty)\r\n * 3. Client POSTs solution to /.well-known/leapify/pow/verify\r\n * 4. Server validates → sets signed cookie → redirects back to original URL\r\n * 5. Subsequent requests include cookie → pass through immediately\r\n *\r\n * Signing key: INTERNAL_API_SECRET (reused — same HMAC purpose as internal route auth)\r\n * Difficulty: POW_DIFFICULTY env var or DEFAULT_POW_DIFFICULTY (leading zero bits)\r\n */\r\n\r\nimport { createMiddleware } from 'hono/factory'\r\nimport type { Context } from 'hono'\r\nimport type { LeapifyBindings } from '../../types'\r\n\r\n// ─── Constants ──────────────────────────────────────────────────────────────────\r\n\r\n/** Base path for PoW challenge routes */\r\nexport const POW_PATH = '/.well-known/leapify/pow'\r\n\r\n/** Challenge verification endpoint */\r\nexport const POW_VERIFY_PATH = `${POW_PATH}/verify`\r\n\r\n/** Cookie name for PoW auth token */\r\nexport const POW_COOKIE_NAME = 'leapify-pow'\r\n\r\n/** KV key prefix for stored challenges */\r\nconst CHALLENGE_KV_PREFIX = 'pow:challenge:'\r\n\r\n/** Default difficulty (leading zero bits required in SHA-256 hash) */\r\nconst DEFAULT_POW_DIFFICULTY = 4\r\n\r\n/** Challenge expiration time in seconds */\r\nconst CHALLENGE_TTL_SEC = 120\r\n\r\n/** Cookie expiration time in seconds (1 hour) */\r\nconst COOKIE_MAX_AGE_SEC = 3600\r\n\r\n/** Paths exempt from PoW challenge */\r\nconst EXEMPT_PATHS = [\r\n \"/health\",\r\n \"/internal\",\r\n \"/api/auth\",\r\n \"/api/uploads/images\",\r\n \"/api/classes\",\r\n \"/api/faqs\",\r\n \"/api/config\",\r\n];\r\n\r\n// ─── Base64url Utilities ────────────────────────────────────────────────────────\r\n\r\nfunction base64urlEncode(bytes: Uint8Array): string {\r\n let binary = ''\r\n for (const byte of bytes) {\r\n binary += String.fromCharCode(byte)\r\n }\r\n return btoa(binary).replace(/\\+/g, '-').replace(/\\//g, '_').replace(/=+$/, '')\r\n}\r\n\r\nfunction base64urlDecode(str: string): Uint8Array<ArrayBuffer> {\r\n const padded = str.replace(/-/g, '+').replace(/_/g, '/')\r\n const binary = atob(padded)\r\n const bytes = new Uint8Array(new ArrayBuffer(binary.length))\r\n for (let i = 0; i < binary.length; i++) {\r\n bytes[i] = binary.charCodeAt(i)\r\n }\r\n return bytes\r\n}\r\n\r\n// ─── Crypto Helpers ─────────────────────────────────────────────────────────────\r\n\r\nasync function generateChallengeId(): Promise<string> {\r\n const bytes = crypto.getRandomValues(new Uint8Array(16))\r\n return base64urlEncode(bytes)\r\n}\r\n\r\nasync function importHmacKey(secret: string): Promise<CryptoKey> {\r\n return crypto.subtle.importKey(\r\n 'raw',\r\n new TextEncoder().encode(secret),\r\n { name: 'HMAC', hash: 'SHA-256' },\r\n false,\r\n ['sign', 'verify']\r\n )\r\n}\r\n\r\nasync function signCookie(secret: string, ip: string): Promise<string> {\r\n const ts = Date.now()\r\n const nonce = base64urlEncode(crypto.getRandomValues(new Uint8Array(8)))\r\n const payload = `${ip}:${ts}:${nonce}`\r\n const key = await importHmacKey(secret)\r\n const sig = await crypto.subtle.sign(\r\n 'HMAC',\r\n key,\r\n new TextEncoder().encode(payload)\r\n )\r\n const sigB64 = base64urlEncode(new Uint8Array(sig))\r\n return `${base64urlEncode(new TextEncoder().encode(payload))}.${sigB64}`\r\n}\r\n\r\nasync function validateCookie(\r\n secret: string,\r\n cookie: string,\r\n ip: string\r\n): Promise<boolean> {\r\n try {\r\n const [payloadB64, sigB64] = cookie.split('.')\r\n if (!payloadB64 || !sigB64) return false\r\n\r\n const payloadBytes = base64urlDecode(payloadB64)\r\n const sigBytes = base64urlDecode(sigB64)\r\n\r\n // Verify HMAC signature\r\n const key = await importHmacKey(secret)\r\n const valid = await crypto.subtle.verify(\r\n 'HMAC',\r\n key,\r\n sigBytes,\r\n payloadBytes\r\n )\r\n if (!valid) return false\r\n\r\n // Parse payload: ip:ts:nonce\r\n const payload = new TextDecoder().decode(payloadBytes)\r\n const [cookieIp, tsStr] = payload.split(':')\r\n\r\n // Verify IP matches (prevent cookie sharing)\r\n if (cookieIp !== ip) return false\r\n\r\n // Verify not expired\r\n const ts = parseInt(tsStr, 10)\r\n if (isNaN(ts) || Date.now() - ts > COOKIE_MAX_AGE_SEC * 1000) return false\r\n\r\n return true\r\n } catch {\r\n return false\r\n }\r\n}\r\n\r\nfunction getClientIp(c: Context<{ Bindings: LeapifyBindings }>): string {\r\n return (\r\n c.req.header('CF-Connecting-IP') ??\r\n c.req.header('X-Real-IP') ??\r\n c.req.header('X-Forwarded-For')?.split(',')[0]?.trim() ??\r\n 'unknown'\r\n )\r\n}\r\n\r\nfunction getDifficulty(env: LeapifyBindings): number {\r\n const raw = env.POW_DIFFICULTY\r\n if (!raw) return DEFAULT_POW_DIFFICULTY\r\n const parsed = parseInt(raw, 10)\r\n return isNaN(parsed)\r\n ? DEFAULT_POW_DIFFICULTY\r\n : Math.max(1, Math.min(parsed, 8))\r\n}\r\n\r\n// ─── Challenge Page HTML ────────────────────────────────────────────────────────\r\n\r\nfunction challengePageHtml(\r\n challengeId: string,\r\n difficulty: number,\r\n originalUrl: string\r\n): string {\r\n return `<!DOCTYPE html>\r\n<html>\r\n<head>\r\n <meta charset=\"utf-8\">\r\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\r\n <title>Verifying your browser</title>\r\n <style>\r\n * { margin: 0; padding: 0; box-sizing: border-box; }\r\n body { font-family: system-ui, -apple-system, sans-serif; display: flex; justify-content: center; align-items: center; min-height: 100vh; background: #f5f5f5; color: #333; }\r\n .card { background: #fff; border-radius: 12px; padding: 2rem; box-shadow: 0 2px 12px rgba(0,0,0,0.08); text-align: center; max-width: 400px; }\r\n .spinner { width: 40px; height: 40px; border: 3px solid #e0e0e0; border-top-color: #333; border-radius: 50%; animation: spin 0.8s linear infinite; margin: 0 auto 1rem; }\r\n @keyframes spin { to { transform: rotate(360deg); } }\r\n h1 { font-size: 1.1rem; font-weight: 600; margin-bottom: 0.5rem; }\r\n p { font-size: 0.9rem; color: #666; }\r\n </style>\r\n</head>\r\n<body>\r\n <div class=\"card\">\r\n <div class=\"spinner\"></div>\r\n <h1>Verifying your browser</h1>\r\n <p>This should only take a moment&hellip;</p>\r\n </div>\r\n <script>\r\n (async () => {\r\n const challengeId = ${JSON.stringify(challengeId)};\r\n const difficulty = ${difficulty};\r\n const prefix = '0'.repeat(Math.ceil(difficulty / 4));\r\n let nonce = 0;\r\n const t0 = performance.now();\r\n while (true) {\r\n const input = challengeId + ':' + nonce;\r\n const hash = await crypto.subtle.digest('SHA-256', new TextEncoder().encode(input));\r\n const hex = Array.from(new Uint8Array(hash)).map(b => b.toString(16).padStart(2, '0')).join('');\r\n if (hex.startsWith(prefix)) {\r\n const elapsed = performance.now() - t0;\r\n const res = await fetch(${JSON.stringify(POW_VERIFY_PATH)}, {\r\n method: 'POST',\r\n headers: { 'Content-Type': 'application/json' },\r\n body: JSON.stringify({ id: challengeId, nonce, elapsed, redir: ${JSON.stringify(originalUrl)} }),\r\n });\r\n const data = await res.json();\r\n if (data.redirect) window.location.href = data.redirect;\r\n else window.location.reload();\r\n break;\r\n }\r\n nonce++;\r\n }\r\n })();\r\n </script>\r\n</body>\r\n</html>`\r\n}\r\n\r\n// ─── Verify Handler ─────────────────────────────────────────────────────────────\r\n\r\n/**\r\n * POST /.well-known/leapify/pow/verify\r\n *\r\n * Validates a completed PoW challenge and issues a signed cookie.\r\n * Exported for mounting in app.ts.\r\n */\r\nexport async function handlePowVerify(\r\n c: Context<{ Bindings: LeapifyBindings }>\r\n) {\r\n const body = await c.req.json<{\r\n id?: string\r\n nonce?: number\r\n elapsed?: number\r\n redir?: string\r\n }>()\r\n\r\n const { id, nonce, redir } = body\r\n\r\n if (!id || typeof nonce !== 'number') {\r\n return c.json(\r\n {\r\n error: {\r\n code: 'VALIDATION_ERROR',\r\n message: 'Missing challenge id or nonce'\r\n }\r\n },\r\n 422\r\n )\r\n }\r\n\r\n // Retrieve challenge from KV\r\n const challenge = await c.env.KV.get(`${CHALLENGE_KV_PREFIX}${id}`)\r\n if (!challenge) {\r\n return c.json(\r\n { error: { code: 'NOT_FOUND', message: 'Challenge expired or invalid' } },\r\n 404\r\n )\r\n }\r\n\r\n const { difficulty } = JSON.parse(challenge)\r\n\r\n // Verify PoW: SHA-256(challengeId:nonce) must have required leading zeros\r\n const input = new TextEncoder().encode(`${id}:${nonce}`)\r\n const hash = await crypto.subtle.digest('SHA-256', input)\r\n const hex = Array.from(new Uint8Array(hash))\r\n .map((b) => b.toString(16).padStart(2, '0'))\r\n .join('')\r\n\r\n const requiredPrefix = '0'.repeat(Math.ceil(difficulty / 4))\r\n if (!hex.startsWith(requiredPrefix)) {\r\n return c.json(\r\n { error: { code: 'VALIDATION_ERROR', message: 'Invalid proof of work' } },\r\n 422\r\n )\r\n }\r\n\r\n // Invalidate challenge (single-use)\r\n await c.env.KV.delete(`${CHALLENGE_KV_PREFIX}${id}`)\r\n\r\n // Issue signed cookie\r\n const secret = c.env.INTERNAL_API_SECRET\r\n const ip = getClientIp(c)\r\n const token = await signCookie(secret, ip)\r\n\r\n const isSecure = c.req.raw.url.startsWith(\"https\") || c.req.header(\"x-forwarded-proto\") === \"https\";\r\n c.header(\r\n \"Set-Cookie\",\r\n `${POW_COOKIE_NAME}=${token}; Path=/; Max-Age=${COOKIE_MAX_AGE_SEC}; ${\r\n isSecure ? \"Secure; \" : \"\"\r\n }HttpOnly; SameSite=Lax`,\r\n );\r\n\r\n return c.json({ redirect: redir || '/' })\r\n}\r\n\r\n// ─── Main Middleware ─────────────────────────────────────────────────────────────\r\n\r\n/**\r\n * PoW challenge middleware.\r\n *\r\n * Mount AFTER cors, BEFORE everything else:\r\n * app.use('*', createCorsMiddleware(...))\r\n * app.use('*', createPowChallengeMiddleware()) ← here\r\n * app.use('*', createRefererGuard(...))\r\n */\r\nexport function createPowChallengeMiddleware() {\r\n return createMiddleware<{ Bindings: LeapifyBindings }>(async (c, next) => {\r\n // Always pass through the verify endpoint itself\r\n if (c.req.path === POW_VERIFY_PATH) return next()\r\n\r\n const normalizedPath = c.req.path.toLowerCase().replace(/\\/$/, \"\");\r\n const isExempt = EXEMPT_PATHS.some((p) => {\r\n const ep = p.toLowerCase().replace(/\\/$/, \"\");\r\n return normalizedPath === ep || normalizedPath.startsWith(ep + \"/\");\r\n });\r\n console.log(`[pow] path=${c.req.path} normalized=${normalizedPath} exempt=${isExempt}`);\r\n if (isExempt) return next();\r\n\r\n // Skip for OPTIONS requests (preflights should never be challenged)\r\n if (c.req.method === 'OPTIONS') return next()\r\n\r\n // Skip if client has a valid Authorization header (Firebase JWT — auth middleware will handle)\r\n if (c.req.header('Authorization')) return next()\r\n\r\n // Check for valid PoW cookie\r\n const cookieHeader = c.req.header('Cookie') ?? ''\r\n const cookieMatch = cookieHeader.match(\r\n new RegExp(`${POW_COOKIE_NAME}=([^;]+)`)\r\n )\r\n if (cookieMatch) {\r\n const secret = c.env.INTERNAL_API_SECRET\r\n const ip = getClientIp(c)\r\n const valid = await validateCookie(secret, cookieMatch[1], ip)\r\n if (valid) return next()\r\n }\r\n\r\n // ── Issue challenge ──────────────────────────────────────────────────────\r\n\r\n const difficulty = getDifficulty(c.env)\r\n const challengeId = await generateChallengeId()\r\n\r\n // Store challenge in KV with TTL\r\n await c.env.KV.put(\r\n `${CHALLENGE_KV_PREFIX}${challengeId}`,\r\n JSON.stringify({ difficulty, createdAt: Date.now() }),\r\n { expirationTtl: CHALLENGE_TTL_SEC }\r\n )\r\n\r\n // Serve challenge page\r\n const originalUrl = c.req.path + (c.req.query('?') ? c.req.query('?') : '')\r\n const html = challengePageHtml(challengeId, difficulty, originalUrl)\r\n\r\n return c.html(html, 200)\r\n })\r\n}\r\n"]}