@stackframe/stack-shared 2.8.11 → 2.8.16

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 (252) hide show
  1. package/CHANGELOG.md +26 -0
  2. package/dist/config/format.js +2 -2
  3. package/dist/config/{schema.d.cts → schema.d.mts} +3 -3
  4. package/dist/config/schema.js +4 -4
  5. package/dist/config/schema.js.map +1 -1
  6. package/dist/{crud.d.cts → crud.d.mts} +1 -1
  7. package/dist/crud.js +2 -2
  8. package/dist/esm/config/format.js +2 -2
  9. package/dist/esm/config/schema.js +4 -4
  10. package/dist/esm/config/schema.js.map +1 -1
  11. package/dist/esm/crud.js +2 -2
  12. package/dist/esm/helpers/password.js +1 -1
  13. package/dist/esm/helpers/production-mode.js +2 -2
  14. package/dist/esm/hooks/use-async-callback.js +1 -1
  15. package/dist/esm/hooks/use-async-external-store.js +1 -1
  16. package/dist/esm/hooks/use-hash.js +1 -1
  17. package/dist/esm/hooks/use-strict-memo.js +1 -1
  18. package/dist/esm/index.js +4 -4
  19. package/dist/esm/index.js.map +1 -1
  20. package/dist/esm/interface/{adminInterface.js → admin-interface.js} +3 -3
  21. package/dist/esm/interface/admin-interface.js.map +1 -0
  22. package/dist/esm/interface/{clientInterface.js → client-interface.js} +58 -862
  23. package/dist/esm/interface/client-interface.js.map +1 -0
  24. package/dist/esm/interface/crud/contact-channels.js +2 -2
  25. package/dist/esm/interface/crud/current-user.js +4 -4
  26. package/dist/esm/interface/crud/email-templates.js +2 -2
  27. package/dist/esm/interface/crud/emails.js +3 -3
  28. package/dist/esm/interface/crud/internal-api-keys.js +2 -2
  29. package/dist/esm/interface/crud/oauth.js +2 -2
  30. package/dist/esm/interface/crud/project-api-keys.js +23 -18
  31. package/dist/esm/interface/crud/project-api-keys.js.map +1 -1
  32. package/dist/esm/interface/crud/project-permissions.js +3 -3
  33. package/dist/esm/interface/crud/projects.js +6 -5
  34. package/dist/esm/interface/crud/projects.js.map +1 -1
  35. package/dist/esm/interface/crud/sessions.js +3 -3
  36. package/dist/esm/interface/crud/svix-token.js +2 -2
  37. package/dist/esm/interface/crud/team-invitation-details.js +3 -3
  38. package/dist/esm/interface/crud/team-invitation.js +3 -3
  39. package/dist/esm/interface/crud/team-member-profiles.js +4 -4
  40. package/dist/esm/interface/crud/team-memberships.js +2 -2
  41. package/dist/esm/interface/crud/team-permissions.js +3 -3
  42. package/dist/esm/interface/crud/teams.js +3 -3
  43. package/dist/esm/interface/crud/users.js +3 -3
  44. package/dist/esm/interface/{serverInterface.js → server-interface.js} +36 -10
  45. package/dist/esm/interface/server-interface.js.map +1 -0
  46. package/dist/esm/interface/webhooks.js +4 -4
  47. package/dist/esm/known-errors.js +31 -4
  48. package/dist/esm/known-errors.js.map +1 -1
  49. package/dist/esm/schema-fields.js +13 -11
  50. package/dist/esm/schema-fields.js.map +1 -1
  51. package/dist/esm/sessions.js +2 -2
  52. package/dist/esm/utils/api-keys.js +3 -3
  53. package/dist/esm/utils/arrays.js +1 -1
  54. package/dist/esm/utils/bytes.js +4 -27
  55. package/dist/esm/utils/bytes.js.map +1 -1
  56. package/dist/esm/utils/caches.js +4 -4
  57. package/dist/esm/utils/crypto.js +3 -3
  58. package/dist/esm/utils/dates.js +1 -1
  59. package/dist/esm/utils/env.js +2 -2
  60. package/dist/esm/utils/errors.js +7 -3
  61. package/dist/esm/utils/errors.js.map +1 -1
  62. package/dist/esm/utils/geo.js +1 -1
  63. package/dist/esm/utils/hashes.js +2 -2
  64. package/dist/esm/utils/hashes.js.map +1 -1
  65. package/dist/esm/utils/html.js +1 -1
  66. package/dist/esm/utils/http.js +1 -1
  67. package/dist/esm/utils/json.js +1 -1
  68. package/dist/esm/utils/jwt.js +4 -4
  69. package/dist/esm/utils/maps.js +1 -1
  70. package/dist/esm/utils/node-http.js +1 -1
  71. package/dist/esm/utils/objects.js +3 -3
  72. package/dist/esm/utils/promises.js +6 -6
  73. package/dist/esm/utils/promises.js.map +1 -1
  74. package/dist/esm/utils/proxies.js +1 -1
  75. package/dist/esm/utils/react.js +3 -3
  76. package/dist/esm/utils/results.js +2 -2
  77. package/dist/esm/utils/stores.js +4 -4
  78. package/dist/esm/utils/strings.js +6 -3
  79. package/dist/esm/utils/strings.js.map +1 -1
  80. package/dist/esm/utils/strings.nicify.test.js +1 -1
  81. package/dist/esm/utils/unicode.js +1 -1
  82. package/dist/esm/utils/urls.js +2 -2
  83. package/dist/esm/utils/uuids.js +1 -1
  84. package/dist/helpers/password.d.mts +11 -0
  85. package/dist/helpers/password.js +1 -1
  86. package/dist/helpers/{production-mode.d.cts → production-mode.d.mts} +3 -3
  87. package/dist/helpers/production-mode.js +2 -2
  88. package/dist/hooks/use-async-callback.js +2 -2
  89. package/dist/hooks/{use-async-external-store.d.cts → use-async-external-store.d.mts} +1 -1
  90. package/dist/hooks/use-async-external-store.js +1 -1
  91. package/dist/hooks/use-hash.js +1 -1
  92. package/dist/hooks/use-strict-memo.js +1 -1
  93. package/dist/index.d.mts +30 -0
  94. package/dist/index.d.ts +3 -3
  95. package/dist/index.js +7 -7
  96. package/dist/index.js.map +1 -1
  97. package/dist/interface/{adminInterface.d.cts → admin-interface.d.mts} +26 -26
  98. package/dist/interface/{adminInterface.d.ts → admin-interface.d.ts} +2 -2
  99. package/dist/interface/{adminInterface.js → admin-interface.js} +7 -7
  100. package/dist/interface/admin-interface.js.map +1 -0
  101. package/dist/interface/{clientInterface.d.cts → client-interface.d.mts} +23 -18
  102. package/dist/interface/{clientInterface.d.ts → client-interface.d.ts} +5 -0
  103. package/dist/interface/{clientInterface.js → client-interface.js} +71 -867
  104. package/dist/interface/client-interface.js.map +1 -0
  105. package/dist/interface/crud/{contact-channels.d.cts → contact-channels.d.mts} +2 -2
  106. package/dist/interface/crud/contact-channels.js +2 -2
  107. package/dist/interface/crud/{current-user.d.cts → current-user.d.mts} +2 -2
  108. package/dist/interface/crud/current-user.js +4 -4
  109. package/dist/interface/crud/{email-templates.d.cts → email-templates.d.mts} +2 -2
  110. package/dist/interface/crud/email-templates.js +2 -2
  111. package/dist/interface/crud/{emails.d.cts → emails.d.mts} +2 -2
  112. package/dist/interface/crud/emails.js +3 -3
  113. package/dist/interface/crud/{internal-api-keys.d.cts → internal-api-keys.d.mts} +2 -2
  114. package/dist/interface/crud/internal-api-keys.js +2 -2
  115. package/dist/interface/crud/{oauth.d.cts → oauth.d.mts} +2 -2
  116. package/dist/interface/crud/oauth.js +2 -2
  117. package/dist/interface/crud/{project-api-keys.d.cts → project-api-keys.d.mts} +14 -4
  118. package/dist/interface/crud/project-api-keys.d.ts +12 -2
  119. package/dist/interface/crud/project-api-keys.js +23 -18
  120. package/dist/interface/crud/project-api-keys.js.map +1 -1
  121. package/dist/interface/crud/{project-permissions.d.cts → project-permissions.d.mts} +2 -2
  122. package/dist/interface/crud/project-permissions.js +3 -3
  123. package/dist/interface/crud/{projects.d.cts → projects.d.mts} +9 -9
  124. package/dist/interface/crud/projects.d.ts +7 -7
  125. package/dist/interface/crud/projects.js +6 -5
  126. package/dist/interface/crud/projects.js.map +1 -1
  127. package/dist/interface/crud/{sessions.d.cts → sessions.d.mts} +2 -2
  128. package/dist/interface/crud/sessions.js +3 -3
  129. package/dist/interface/crud/{svix-token.d.cts → svix-token.d.mts} +2 -2
  130. package/dist/interface/crud/svix-token.js +2 -2
  131. package/dist/interface/crud/{team-invitation-details.d.cts → team-invitation-details.d.mts} +2 -2
  132. package/dist/interface/crud/team-invitation-details.js +3 -3
  133. package/dist/interface/crud/{team-invitation.d.cts → team-invitation.d.mts} +2 -2
  134. package/dist/interface/crud/team-invitation.js +3 -3
  135. package/dist/interface/crud/{team-member-profiles.d.cts → team-member-profiles.d.mts} +2 -2
  136. package/dist/interface/crud/team-member-profiles.js +4 -4
  137. package/dist/interface/crud/{team-memberships.d.cts → team-memberships.d.mts} +2 -2
  138. package/dist/interface/crud/team-memberships.js +2 -2
  139. package/dist/interface/crud/{team-permissions.d.cts → team-permissions.d.mts} +2 -2
  140. package/dist/interface/crud/team-permissions.js +3 -3
  141. package/dist/interface/crud/{teams.d.cts → teams.d.mts} +2 -2
  142. package/dist/interface/crud/teams.js +3 -3
  143. package/dist/interface/crud/{users.d.cts → users.d.mts} +2 -2
  144. package/dist/interface/crud/users.js +3 -3
  145. package/dist/interface/{serverInterface.d.cts → server-interface.d.mts} +23 -21
  146. package/dist/interface/{serverInterface.d.ts → server-interface.d.ts} +3 -1
  147. package/dist/interface/{serverInterface.js → server-interface.js} +40 -14
  148. package/dist/interface/server-interface.js.map +1 -0
  149. package/dist/interface/webhooks.js +4 -4
  150. package/dist/{known-errors.d.cts → known-errors.d.mts} +11 -3
  151. package/dist/known-errors.d.ts +8 -0
  152. package/dist/known-errors.js +31 -4
  153. package/dist/known-errors.js.map +1 -1
  154. package/dist/{schema-fields.d.cts → schema-fields.d.mts} +2 -1
  155. package/dist/schema-fields.d.ts +2 -1
  156. package/dist/schema-fields.js +15 -12
  157. package/dist/schema-fields.js.map +1 -1
  158. package/dist/sessions.js +3 -3
  159. package/dist/utils/api-keys.js +4 -4
  160. package/dist/utils/arrays.js +1 -1
  161. package/dist/utils/bytes.js +4 -27
  162. package/dist/utils/bytes.js.map +1 -1
  163. package/dist/utils/{caches.d.cts → caches.d.mts} +2 -2
  164. package/dist/utils/caches.js +4 -4
  165. package/dist/utils/crypto.js +3 -3
  166. package/dist/utils/dates.js +1 -1
  167. package/dist/utils/env.js +2 -2
  168. package/dist/utils/{errors.d.cts → errors.d.mts} +4 -2
  169. package/dist/utils/errors.d.ts +2 -0
  170. package/dist/utils/errors.js +7 -3
  171. package/dist/utils/errors.js.map +1 -1
  172. package/dist/utils/fs.js +2 -2
  173. package/dist/utils/geo.js +1 -1
  174. package/dist/utils/hashes.js +7 -7
  175. package/dist/utils/hashes.js.map +1 -1
  176. package/dist/utils/html.js +1 -1
  177. package/dist/utils/http.js +1 -1
  178. package/dist/utils/ips.js +1 -1
  179. package/dist/utils/{json.d.cts → json.d.mts} +1 -1
  180. package/dist/utils/json.js +1 -1
  181. package/dist/utils/jwt.js +7 -7
  182. package/dist/utils/maps.js +1 -1
  183. package/dist/utils/node-http.js +1 -1
  184. package/dist/utils/objects.js +3 -3
  185. package/dist/utils/{promises.d.cts → promises.d.mts} +1 -1
  186. package/dist/utils/promises.js +6 -6
  187. package/dist/utils/promises.js.map +1 -1
  188. package/dist/utils/proxies.js +1 -1
  189. package/dist/utils/react.js +4 -4
  190. package/dist/utils/results.js +2 -2
  191. package/dist/utils/{stores.d.cts → stores.d.mts} +3 -3
  192. package/dist/utils/stores.js +4 -4
  193. package/dist/utils/strings.js +6 -3
  194. package/dist/utils/strings.js.map +1 -1
  195. package/dist/utils/strings.nicify.test.js +1 -1
  196. package/dist/utils/unicode.js +1 -1
  197. package/dist/utils/urls.js +2 -2
  198. package/dist/utils/uuids.js +1 -1
  199. package/package.json +9 -6
  200. package/dist/esm/interface/adminInterface.js.map +0 -1
  201. package/dist/esm/interface/clientInterface.js.map +0 -1
  202. package/dist/esm/interface/serverInterface.js.map +0 -1
  203. package/dist/helpers/password.d.cts +0 -11
  204. package/dist/index.d.cts +0 -30
  205. package/dist/interface/adminInterface.js.map +0 -1
  206. package/dist/interface/clientInterface.js.map +0 -1
  207. package/dist/interface/serverInterface.js.map +0 -1
  208. /package/dist/config/{format.d.cts → format.d.mts} +0 -0
  209. /package/dist/{global.d.d.cts → global.d.d.mts} +0 -0
  210. /package/dist/hooks/{use-async-callback.d.cts → use-async-callback.d.mts} +0 -0
  211. /package/dist/hooks/{use-hash.d.cts → use-hash.d.mts} +0 -0
  212. /package/dist/hooks/{use-strict-memo.d.cts → use-strict-memo.d.mts} +0 -0
  213. /package/dist/interface/{webhooks.d.cts → webhooks.d.mts} +0 -0
  214. /package/dist/{sessions.d.cts → sessions.d.mts} +0 -0
  215. /package/dist/utils/{api-keys.d.cts → api-keys.d.mts} +0 -0
  216. /package/dist/utils/{arrays.d.cts → arrays.d.mts} +0 -0
  217. /package/dist/utils/{base64.d.cts → base64.d.mts} +0 -0
  218. /package/dist/utils/{booleans.d.cts → booleans.d.mts} +0 -0
  219. /package/dist/utils/{browser-compat.d.cts → browser-compat.d.mts} +0 -0
  220. /package/dist/utils/{bytes.d.cts → bytes.d.mts} +0 -0
  221. /package/dist/utils/{compile-time.d.cts → compile-time.d.mts} +0 -0
  222. /package/dist/utils/{crypto.d.cts → crypto.d.mts} +0 -0
  223. /package/dist/utils/{dates.d.cts → dates.d.mts} +0 -0
  224. /package/dist/utils/{dom.d.cts → dom.d.mts} +0 -0
  225. /package/dist/utils/{env.d.cts → env.d.mts} +0 -0
  226. /package/dist/utils/{fs.d.cts → fs.d.mts} +0 -0
  227. /package/dist/utils/{functions.d.cts → functions.d.mts} +0 -0
  228. /package/dist/utils/{geo.d.cts → geo.d.mts} +0 -0
  229. /package/dist/utils/{globals.d.cts → globals.d.mts} +0 -0
  230. /package/dist/utils/{hashes.d.cts → hashes.d.mts} +0 -0
  231. /package/dist/utils/{html.d.cts → html.d.mts} +0 -0
  232. /package/dist/utils/{http.d.cts → http.d.mts} +0 -0
  233. /package/dist/utils/{ips.d.cts → ips.d.mts} +0 -0
  234. /package/dist/utils/{jwt.d.cts → jwt.d.mts} +0 -0
  235. /package/dist/utils/{locks.d.cts → locks.d.mts} +0 -0
  236. /package/dist/utils/{maps.d.cts → maps.d.mts} +0 -0
  237. /package/dist/utils/{math.d.cts → math.d.mts} +0 -0
  238. /package/dist/utils/{node-http.d.cts → node-http.d.mts} +0 -0
  239. /package/dist/utils/{numbers.d.cts → numbers.d.mts} +0 -0
  240. /package/dist/utils/{oauth.d.cts → oauth.d.mts} +0 -0
  241. /package/dist/utils/{objects.d.cts → objects.d.mts} +0 -0
  242. /package/dist/utils/{passkey.d.cts → passkey.d.mts} +0 -0
  243. /package/dist/utils/{proxies.d.cts → proxies.d.mts} +0 -0
  244. /package/dist/utils/{react.d.cts → react.d.mts} +0 -0
  245. /package/dist/utils/{results.d.cts → results.d.mts} +0 -0
  246. /package/dist/utils/{sentry.d.cts → sentry.d.mts} +0 -0
  247. /package/dist/utils/{strings.d.cts → strings.d.mts} +0 -0
  248. /package/dist/utils/{strings.nicify.test.d.cts → strings.nicify.test.d.mts} +0 -0
  249. /package/dist/utils/{types.d.cts → types.d.mts} +0 -0
  250. /package/dist/utils/{unicode.d.cts → unicode.d.mts} +0 -0
  251. /package/dist/utils/{urls.d.cts → urls.d.mts} +0 -0
  252. /package/dist/utils/{uuids.d.cts → uuids.d.mts} +0 -0
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/schema-fields.ts"],"sourcesContent":["import * as yup from \"yup\";\nimport { KnownErrors } from \".\";\nimport { isBase64 } from \"./utils/bytes\";\nimport { StackAssertionError, throwErr } from \"./utils/errors\";\nimport { decodeBasicAuthorizationHeader } from \"./utils/http\";\nimport { allProviders } from \"./utils/oauth\";\nimport { deepPlainClone, omit } from \"./utils/objects\";\nimport { isValidUrl } from \"./utils/urls\";\nimport { isUuid } from \"./utils/uuids\";\n\ndeclare module \"yup\" {\n // eslint-disable-next-line @typescript-eslint/consistent-type-definitions\n interface StringSchema<TType, TContext, TDefault, TFlags> {\n nonEmpty(message?: string): StringSchema<TType, TContext, TDefault, TFlags>,\n empty(): StringSchema<TType, TContext, TDefault, TFlags>,\n }\n\n // eslint-disable-next-line @typescript-eslint/consistent-type-definitions\n interface Schema<TType, TContext, TDefault, TFlags> {\n getNested<K extends keyof NonNullable<TType>>(path: K): yup.Schema<NonNullable<TType>[K], TContext, TDefault, TFlags>,\n\n // the default types for concat kinda suck, so let's fix that\n concat<U extends yup.AnySchema>(schema: U): yup.Schema<Omit<NonNullable<TType>, keyof yup.InferType<U>> & yup.InferType<U> | (TType & (null | undefined)), TContext, TDefault, TFlags>,\n }\n}\n\n// eslint-disable-next-line no-restricted-syntax\nyup.addMethod(yup.string, \"nonEmpty\", function (message?: string) {\n return this.test(\n \"non-empty\",\n message ?? (({ path }) => `${path} must not be empty`),\n (value) => {\n return value !== \"\";\n }\n );\n});\n\nyup.addMethod(yup.Schema, \"getNested\", function (path: any) {\n if (!path.match(/^[a-zA-Z_][a-zA-Z0-9_]*$/)) throw new StackAssertionError(`yupSchema.getNested can currently only be used with alphanumeric keys. Fix this in the future. Provided key: ${path}`);\n return yup.reach(this, path) as any;\n});\n\nexport async function yupValidate<S extends yup.ISchema<any>>(\n schema: S,\n obj: unknown,\n options?: yup.ValidateOptions & { currentUserId?: string | null }\n): Promise<yup.InferType<S>> {\n try {\n return await schema.validate(obj, {\n ...omit(options ?? {}, ['currentUserId']),\n context: {\n ...options?.context,\n stackAllowUserIdMe: options?.currentUserId !== undefined,\n },\n });\n } catch (error) {\n if (error instanceof ReplaceFieldWithOwnUserId) {\n const currentUserId = options?.currentUserId;\n if (!currentUserId) throw new KnownErrors.CannotGetOwnUserWithoutUser();\n\n // parse yup path\n let pathRemaining = error.path;\n const fieldPath = [];\n while (pathRemaining.length > 0) {\n if (pathRemaining.startsWith(\"[\")) {\n const index = pathRemaining.indexOf(\"]\");\n if (index < 0) throw new StackAssertionError(\"Invalid path\");\n fieldPath.push(JSON.parse(pathRemaining.slice(1, index)));\n pathRemaining = pathRemaining.slice(index + 1);\n } else {\n let dotIndex = pathRemaining.indexOf(\".\");\n if (dotIndex === -1) dotIndex = pathRemaining.length;\n fieldPath.push(pathRemaining.slice(0, dotIndex));\n pathRemaining = pathRemaining.slice(dotIndex + 1);\n }\n }\n\n const newObj = deepPlainClone(obj);\n let it = newObj;\n for (const field of fieldPath.slice(0, -1)) {\n if (!Object.prototype.hasOwnProperty.call(it, field)) {\n throw new StackAssertionError(`Segment ${field} of path ${error.path} not found in object`);\n }\n it = (it as any)[field];\n }\n (it as any)[fieldPath[fieldPath.length - 1]] = currentUserId;\n\n return await yupValidate(schema, newObj, options);\n }\n throw error;\n }\n}\n\nconst _idDescription = (identify: string) => `The unique identifier of the ${identify}`;\nconst _displayNameDescription = (identify: string) => `Human-readable ${identify} display name. This is not a unique identifier.`;\nconst _clientMetaDataDescription = (identify: string) => `Client metadata. Used as a data store, accessible from the client side. Do not store information that should not be exposed to the client.`;\nconst _clientReadOnlyMetaDataDescription = (identify: string) => `Client read-only, server-writable metadata. Used as a data store, accessible from the client side. Do not store information that should not be exposed to the client. The client can read this data, but cannot modify it. This is useful for things like subscription status.`;\nconst _profileImageUrlDescription = (identify: string) => `URL of the profile image for ${identify}. Can be a Base64 encoded image. Must be smaller than 100KB. Please compress and crop to a square before passing in.`;\nconst _serverMetaDataDescription = (identify: string) => `Server metadata. Used as a data store, only accessible from the server side. You can store secret information related to the ${identify} here.`;\nconst _atMillisDescription = (identify: string) => `(the number of milliseconds since epoch, January 1, 1970, UTC)`;\nconst _createdAtMillisDescription = (identify: string) => `The time the ${identify} was created ${_atMillisDescription(identify)}`;\nconst _signedUpAtMillisDescription = `The time the user signed up ${_atMillisDescription}`;\nconst _lastActiveAtMillisDescription = `The time the user was last active ${_atMillisDescription}`;\n\n\ndeclare const StackAdaptSentinel: unique symbol;\nexport type StackAdaptSentinel = typeof StackAdaptSentinel;\n\n// Built-in replacements\nexport function yupString<A extends string, B extends yup.Maybe<yup.AnyObject> = yup.AnyObject>(...args: Parameters<typeof yup.string<A, B>>) {\n // eslint-disable-next-line no-restricted-syntax\n return yup.string(...args);\n}\nexport function yupNumber<A extends number, B extends yup.Maybe<yup.AnyObject> = yup.AnyObject>(...args: Parameters<typeof yup.number<A, B>>) {\n // eslint-disable-next-line no-restricted-syntax\n return yup.number(...args);\n}\nexport function yupBoolean<A extends boolean, B extends yup.Maybe<yup.AnyObject> = yup.AnyObject>(...args: Parameters<typeof yup.boolean<A, B>>) {\n // eslint-disable-next-line no-restricted-syntax\n return yup.boolean(...args);\n}\n/**\n * @deprecated, use number of milliseconds since epoch instead\n */\nexport function yupDate<A extends Date, B extends yup.Maybe<yup.AnyObject> = yup.AnyObject>(...args: Parameters<typeof yup.date<A, B>>) {\n // eslint-disable-next-line no-restricted-syntax\n return yup.date(...args);\n}\nexport function yupMixed<A extends {}>(...args: Parameters<typeof yup.mixed<A>>) {\n // eslint-disable-next-line no-restricted-syntax\n return yup.mixed(...args);\n}\nexport function yupArray<A extends yup.Maybe<yup.AnyObject> = yup.AnyObject, B = any>(...args: Parameters<typeof yup.array<A, B>>) {\n // eslint-disable-next-line no-restricted-syntax\n return yup.array(...args);\n}\nexport function yupTuple<T extends [unknown, ...unknown[]]>(...args: Parameters<typeof yup.tuple<T>>) {\n // eslint-disable-next-line no-restricted-syntax\n return yup.tuple<T>(...args);\n}\nexport function yupObject<A extends yup.Maybe<yup.AnyObject>, B extends yup.ObjectShape>(...args: Parameters<typeof yup.object<A, B>>) {\n // eslint-disable-next-line no-restricted-syntax\n const object = yup.object(...args).test(\n 'no-unknown-object-properties',\n ({ path }) => `${path} contains unknown properties`,\n (value: any, context) => {\n if (context.options.context?.noUnknownPathPrefixes?.some((prefix: string) => context.path.startsWith(prefix))) {\n if (context.schema.spec.noUnknown !== false) {\n const availableKeys = new Set(Object.keys(context.schema.fields));\n const unknownKeys = Object.keys(value ?? {}).filter(key => !availableKeys.has(key));\n if (unknownKeys.length > 0) {\n // TODO \"did you mean XYZ\"\n return context.createError({\n message: `${context.path || \"Object\"} contains unknown properties: ${unknownKeys.join(', ')}`,\n path: context.path,\n params: { unknownKeys, availableKeys },\n });\n }\n }\n }\n return true;\n },\n );\n\n // we don't want to update the type of `object` to have a default flag\n return object.default(undefined) as any as typeof object;\n}\n\nexport function yupNever(): yup.MixedSchema<never> {\n return yupMixed().test('never', 'This value should never be reached', () => false) as any;\n}\n\nexport function yupUnion<T extends yup.ISchema<any>[]>(...args: T): yup.MixedSchema<yup.InferType<T[number]>> {\n if (args.length === 0) throw new Error('yupUnion must have at least one schema');\n\n const [first] = args;\n const firstDesc = first.describe();\n for (const schema of args) {\n const desc = schema.describe();\n if (desc.type !== firstDesc.type) throw new StackAssertionError(`yupUnion must have schemas of the same type (got: ${firstDesc.type} and ${desc.type})`, { first, schema, firstDesc, desc });\n }\n\n return yupMixed().test('is-one-of', 'Invalid value', async (value, context) => {\n const errors = [];\n for (const schema of args) {\n try {\n await yupValidate(schema, value, context.options);\n return true;\n } catch (e) {\n errors.push(e);\n }\n }\n return context.createError({\n message: `${context.path} is not matched by any of the provided schemas:\\n${errors.map((e: any, i) => '\\tSchema ' + i + \": \\n\\t\\t\" + e.errors.join('\\n\\t\\t')).join('\\n')}`,\n path: context.path,\n });\n });\n}\n\nexport function yupRecord<K extends yup.StringSchema, T extends yup.AnySchema>(\n keySchema: K,\n valueSchema: T,\n): yup.MixedSchema<Record<string, yup.InferType<T>>> {\n return yupObject().unknown(true).test(\n 'record',\n '${path} must be a record of valid values',\n async function (value: unknown, context: yup.TestContext) {\n if (value == null) return true;\n const { path, createError } = this as any;\n if (typeof value !== 'object') {\n return createError({ message: `${path} must be an object` });\n }\n\n // Validate each property using the provided valueSchema\n for (const key of Object.keys(value)) {\n // Validate the key\n await yupValidate(keySchema, key, context.options);\n\n // Validate the value\n try {\n await yupValidate(valueSchema, (value as Record<string, unknown>)[key], {\n ...context.options,\n context: {\n ...context.options.context,\n path: path ? `${path}.${key}` : key,\n },\n });\n } catch (e: any) {\n return createError({\n path: path ? `${path}.${key}` : key,\n message: e.message,\n });\n }\n }\n\n return true;\n },\n ) as any;\n}\n\nexport function ensureObjectSchema<T extends yup.AnyObject>(schema: yup.Schema<T>): yup.ObjectSchema<T> & typeof schema {\n if (!(schema instanceof yup.ObjectSchema)) throw new StackAssertionError(`assertObjectSchema: schema is not an ObjectSchema: ${schema.describe().type}`);\n return schema as any;\n}\n\n// Common\nexport const adaptSchema = yupMixed<StackAdaptSentinel>();\n/**\n * Yup's URL schema does not recognize some URLs (including `http://localhost`) as a valid URL. This schema is a workaround for that.\n */\nexport const urlSchema = yupString().test({\n name: 'no-spaces',\n message: (params) => `${params.path} contains spaces`,\n test: (value) => value == null || !value.includes(' ')\n}).test({\n name: 'url',\n message: (params) => `${params.path} is not a valid URL`,\n test: (value) => value == null || isValidUrl(value)\n});\nexport const jsonSchema = yupMixed().nullable().defined().transform((value) => JSON.parse(JSON.stringify(value)));\nexport const jsonStringSchema = yupString().test(\"json\", (params) => `${params.path} is not valid JSON`, (value) => {\n if (value == null) return true;\n try {\n JSON.parse(value);\n return true;\n } catch (error) {\n return false;\n }\n});\nexport const jsonStringOrEmptySchema = yupString().test(\"json\", (params) => `${params.path} is not valid JSON`, (value) => {\n if (!value) return true;\n try {\n JSON.parse(value);\n return true;\n } catch (error) {\n return false;\n }\n});\nexport const base64Schema = yupString().test(\"is-base64\", (params) => `${params.path} is not valid base64`, (value) => {\n if (value == null) return true;\n return isBase64(value);\n});\nexport const passwordSchema = yupString().max(70);\n\n/**\n * A stricter email schema that does some additional checks for UX input. (Some emails are allowed by the spec, for\n * example `test@localhost` or `abc@gmail`, but almost certainly a user input error.)\n *\n * Note that some users in the DB have an email that doesn't match this regex, so most of the time you should use\n * `emailSchema` instead until we do the DB migration.\n */\n// eslint-disable-next-line no-restricted-syntax\nexport const strictEmailSchema = (message: string | undefined) => yupString().email(message).matches(/^[^.]+(\\.[^.]+)*@.*\\.[^.][^.]+$/, message);\n// eslint-disable-next-line no-restricted-syntax\nexport const emailSchema = yupString().email();\n\nundefined?.test('strictEmailSchema', ({ expect }) => {\n const validEmails = [\n \"a@example.com\",\n \"abc@example.com\",\n \"a.b@example.com\",\n \"throwaway.mail+token@example.com\",\n \"email-alt-dash@demo-mail.com\",\n \"test-account@weird-domain.net\",\n \"%!~&+{}=|`#@domain.test\",\n \"admin@a.longtldexample\",\n ];\n for (const email of validEmails) {\n expect(strictEmailSchema(undefined).validateSync(email)).toBe(email);\n }\n const invalidEmails = [\n \"test@localhost\",\n \"test@gmail\",\n \"test@gmail.com.a\",\n \"test@gmail.a\",\n \"test.@example.com\",\n \"test..test@example.com\",\n \".test@example.com\",\n ];\n for (const email of invalidEmails) {\n expect(() => strictEmailSchema(undefined).validateSync(email)).toThrow();\n }\n});\n\n// Request auth\nexport const clientOrHigherAuthTypeSchema = yupString().oneOf(['client', 'server', 'admin']).defined();\nexport const serverOrHigherAuthTypeSchema = yupString().oneOf(['server', 'admin']).defined();\nexport const adminAuthTypeSchema = yupString().oneOf(['admin']).defined();\n\n// Projects\nexport const projectIdSchema = yupString().test((v) => v === undefined || v === \"internal\" || isUuid(v)).meta({ openapiField: { description: _idDescription('project'), exampleValue: 'e0b52f4d-dece-408c-af49-d23061bb0f8d' } });\nexport const projectDisplayNameSchema = yupString().meta({ openapiField: { description: _displayNameDescription('project'), exampleValue: 'MyMusic' } });\nexport const projectDescriptionSchema = yupString().nullable().meta({ openapiField: { description: 'A human readable description of the project', exampleValue: 'A music streaming service' } });\nexport const projectCreatedAtMillisSchema = yupNumber().meta({ openapiField: { description: _createdAtMillisDescription('project'), exampleValue: 1630000000000 } });\nexport const projectUserCountSchema = yupNumber().meta({ openapiField: { description: 'The number of users in this project', exampleValue: 10 } });\nexport const projectIsProductionModeSchema = yupBoolean().meta({ openapiField: { description: 'Whether the project is in production mode', exampleValue: true } });\n// Project config\nexport const projectConfigIdSchema = yupString().meta({ openapiField: { description: _idDescription('project config'), exampleValue: 'd09201f0-54f5-40bd-89ff-6d1815ddad24' } });\nexport const projectAllowLocalhostSchema = yupBoolean().meta({ openapiField: { description: 'Whether localhost is allowed as a domain for this project. Should only be allowed in development mode', exampleValue: true } });\nexport const projectCreateTeamOnSignUpSchema = yupBoolean().meta({ openapiField: { description: 'Whether a team should be created for each user that signs up', exampleValue: true } });\nexport const projectMagicLinkEnabledSchema = yupBoolean().meta({ openapiField: { description: 'Whether magic link authentication is enabled for this project', exampleValue: true } });\nexport const projectPasskeyEnabledSchema = yupBoolean().meta({ openapiField: { description: 'Whether passkey authentication is enabled for this project', exampleValue: true } });\nexport const projectClientTeamCreationEnabledSchema = yupBoolean().meta({ openapiField: { description: 'Whether client users can create teams', exampleValue: true } });\nexport const projectClientUserDeletionEnabledSchema = yupBoolean().meta({ openapiField: { description: 'Whether client users can delete their own account from the client', exampleValue: true } });\nexport const projectSignUpEnabledSchema = yupBoolean().meta({ openapiField: { description: 'Whether users can sign up new accounts, or whether they are only allowed to sign in to existing accounts. Regardless of this option, the server API can always create new users with the `POST /users` endpoint.', exampleValue: true } });\nexport const projectCredentialEnabledSchema = yupBoolean().meta({ openapiField: { description: 'Whether email password authentication is enabled for this project', exampleValue: true } });\n// Project OAuth config\nexport const oauthIdSchema = yupString().oneOf(allProviders).meta({ openapiField: { description: `OAuth provider ID, one of ${allProviders.map(x => `\\`${x}\\``).join(', ')}`, exampleValue: 'google' } });\nexport const oauthEnabledSchema = yupBoolean().meta({ openapiField: { description: 'Whether the OAuth provider is enabled. If an provider is first enabled, then disabled, it will be shown in the list but with enabled=false', exampleValue: true } });\nexport const oauthTypeSchema = yupString().oneOf(['shared', 'standard']).meta({ openapiField: { description: 'OAuth provider type, one of shared, standard. \"shared\" uses Stack shared OAuth keys and it is only meant for development. \"standard\" uses your own OAuth keys and will show your logo and company name when signing in with the provider.', exampleValue: 'standard' } });\nexport const oauthClientIdSchema = yupString().meta({ openapiField: { description: 'OAuth client ID. Needs to be specified when using type=\"standard\"', exampleValue: 'google-oauth-client-id' } });\nexport const oauthClientSecretSchema = yupString().meta({ openapiField: { description: 'OAuth client secret. Needs to be specified when using type=\"standard\"', exampleValue: 'google-oauth-client-secret' } });\nexport const oauthFacebookConfigIdSchema = yupString().meta({ openapiField: { description: 'The configuration id for Facebook business login (for things like ads and marketing). This is only required if you are using the standard OAuth with Facebook and you are using Facebook business login.' } });\nexport const oauthMicrosoftTenantIdSchema = yupString().meta({ openapiField: { description: 'The Microsoft tenant id for Microsoft directory. This is only required if you are using the standard OAuth with Microsoft and you have an Azure AD tenant.' } });\nexport const oauthAccountMergeStrategySchema = yupString().oneOf(['link_method', 'raise_error', 'allow_duplicates']).meta({ openapiField: { description: 'Determines how to handle OAuth logins that match an existing user by email. `link_method` adds the OAuth method to the existing user. `raise_error` rejects the login with an error. `allow_duplicates` creates a new user.', exampleValue: 'link_method' } });\n// Project email config\nexport const emailTypeSchema = yupString().oneOf(['shared', 'standard']).meta({ openapiField: { description: 'Email provider type, one of shared, standard. \"shared\" uses Stack shared email provider and it is only meant for development. \"standard\" uses your own email server and will have your email address as the sender.', exampleValue: 'standard' } });\nexport const emailSenderNameSchema = yupString().meta({ openapiField: { description: 'Email sender name. Needs to be specified when using type=\"standard\"', exampleValue: 'Stack' } });\nexport const emailHostSchema = yupString().meta({ openapiField: { description: 'Email host. Needs to be specified when using type=\"standard\"', exampleValue: 'smtp.your-domain.com' } });\nexport const emailPortSchema = yupNumber().min(0).max(65535).meta({ openapiField: { description: 'Email port. Needs to be specified when using type=\"standard\"', exampleValue: 587 } });\nexport const emailUsernameSchema = yupString().meta({ openapiField: { description: 'Email username. Needs to be specified when using type=\"standard\"', exampleValue: 'smtp-email' } });\nexport const emailSenderEmailSchema = emailSchema.meta({ openapiField: { description: 'Email sender email. Needs to be specified when using type=\"standard\"', exampleValue: 'example@your-domain.com' } });\nexport const emailPasswordSchema = passwordSchema.meta({ openapiField: { description: 'Email password. Needs to be specified when using type=\"standard\"', exampleValue: 'your-email-password' } });\n// Project domain config\nexport const handlerPathSchema = yupString().test('is-handler-path', 'Handler path must start with /', (value) => value?.startsWith('/')).meta({ openapiField: { description: 'Handler path. If you did not setup a custom handler path, it should be \"/handler\" by default. It needs to start with /', exampleValue: '/handler' } });\n\n// Users\nexport class ReplaceFieldWithOwnUserId extends Error {\n constructor(public readonly path: string) {\n super(`This error should be caught by whoever validated the schema, and the field in the path '${path}' should be replaced with the current user's id. This is a workaround to yup not providing access to the context inside the transform function.`);\n }\n}\nconst userIdMeSentinelUuid = \"cad564fd-f81b-43f4-b390-98abf3fcc17e\";\nexport const userIdOrMeSchema = yupString().uuid().transform(v => {\n if (v === \"me\") return userIdMeSentinelUuid;\n else return v;\n}).test((v, context) => {\n if (!(\"stackAllowUserIdMe\" in (context.options.context ?? {}))) throw new StackAssertionError('userIdOrMeSchema is not allowed in this context. Make sure you\\'re using yupValidate from schema-fields.ts to validate, instead of schema.validate(...).');\n if (!context.options.context?.stackAllowUserIdMe) throw new StackAssertionError('userIdOrMeSchema is not allowed in this context. Make sure you\\'re passing in the currentUserId option in yupValidate.');\n if (v === userIdMeSentinelUuid) throw new ReplaceFieldWithOwnUserId(context.path);\n return true;\n}).meta({ openapiField: { description: 'The ID of the user, or the special value `me` for the currently authenticated user', exampleValue: '3241a285-8329-4d69-8f3d-316e08cf140c' } });\nexport const userIdSchema = yupString().uuid().meta({ openapiField: { description: _idDescription('user'), exampleValue: '3241a285-8329-4d69-8f3d-316e08cf140c' } });\nexport const primaryEmailSchema = emailSchema.meta({ openapiField: { description: 'Primary email', exampleValue: 'johndoe@example.com' } });\nexport const primaryEmailAuthEnabledSchema = yupBoolean().meta({ openapiField: { description: 'Whether the primary email is used for authentication. If this is set to `false`, the user will not be able to sign in with the primary email with password or OTP', exampleValue: true } });\nexport const primaryEmailVerifiedSchema = yupBoolean().meta({ openapiField: { description: 'Whether the primary email has been verified to belong to this user', exampleValue: true } });\nexport const userDisplayNameSchema = yupString().nullable().meta({ openapiField: { description: _displayNameDescription('user'), exampleValue: 'John Doe' } });\nexport const selectedTeamIdSchema = yupString().uuid().meta({ openapiField: { description: 'ID of the team currently selected by the user', exampleValue: 'team-id' } });\nexport const profileImageUrlSchema = urlSchema.max(1000000).meta({ openapiField: { description: _profileImageUrlDescription('user'), exampleValue: 'https://example.com/image.jpg' } });\nexport const signedUpAtMillisSchema = yupNumber().meta({ openapiField: { description: _signedUpAtMillisDescription, exampleValue: 1630000000000 } });\nexport const userClientMetadataSchema = jsonSchema.meta({ openapiField: { description: _clientMetaDataDescription('user'), exampleValue: { key: 'value' } } });\nexport const userClientReadOnlyMetadataSchema = jsonSchema.meta({ openapiField: { description: _clientReadOnlyMetaDataDescription('user'), exampleValue: { key: 'value' } } });\nexport const userServerMetadataSchema = jsonSchema.meta({ openapiField: { description: _serverMetaDataDescription('user'), exampleValue: { key: 'value' } } });\nexport const userOAuthProviderSchema = yupObject({\n id: yupString().defined(),\n type: yupString().oneOf(allProviders).defined(),\n provider_user_id: yupString().defined(),\n});\nexport const userLastActiveAtMillisSchema = yupNumber().nullable().meta({ openapiField: { description: _lastActiveAtMillisDescription, exampleValue: 1630000000000 } });\nexport const userPasskeyAuthEnabledSchema = yupBoolean().meta({ openapiField: { hidden: true, description: 'Whether the user has passkeys enabled', exampleValue: false } });\nexport const userOtpAuthEnabledSchema = yupBoolean().meta({ openapiField: { hidden: true, description: 'Whether the user has OTP/magic link enabled. ', exampleValue: true } });\nexport const userOtpAuthEnabledMutationSchema = yupBoolean().meta({ openapiField: { hidden: true, description: 'Whether the user has OTP/magic link enabled. Note that only accounts with verified emails can sign-in with OTP.', exampleValue: true } });\nexport const userHasPasswordSchema = yupBoolean().meta({ openapiField: { hidden: true, description: 'Whether the user has a password set. If the user does not have a password set, they will not be able to sign in with email/password.', exampleValue: true } });\nexport const userPasswordMutationSchema = passwordSchema.nullable().meta({ openapiField: { description: 'Sets the user\\'s password. Doing so revokes all current sessions.', exampleValue: 'my-new-password' } }).max(70);\nexport const userPasswordHashMutationSchema = yupString()\n .nonEmpty()\n .meta({ openapiField: { description: 'If `password` is not given, sets the user\\'s password hash to the given string in Modular Crypt Format (ex.: `$2a$10$VIhIOofSMqGdGlL4wzE//e.77dAQGqNtF/1dT7bqCrVtQuInWy2qi`). Doing so revokes all current sessions.' } }); // we don't set an exampleValue here because it's exclusive with the password field and having both would break the generated example\nexport const userTotpSecretMutationSchema = base64Schema.nullable().meta({ openapiField: { description: 'Enables 2FA and sets a TOTP secret for the user. Set to null to disable 2FA.', exampleValue: 'dG90cC1zZWNyZXQ=' } });\n\n// Auth\nexport const signInEmailSchema = strictEmailSchema(undefined).meta({ openapiField: { description: 'The email to sign in with.', exampleValue: 'johndoe@example.com' } });\nexport const emailOtpSignInCallbackUrlSchema = urlSchema.meta({ openapiField: { description: 'The base callback URL to construct the magic link from. A query parameter `code` with the verification code will be appended to it. The page should then make a request to the `/auth/otp/sign-in` endpoint.', exampleValue: 'https://example.com/handler/magic-link-callback' } });\nexport const emailVerificationCallbackUrlSchema = urlSchema.meta({ openapiField: { description: 'The base callback URL to construct a verification link for the verification e-mail. A query parameter `code` with the verification code will be appended to it. The page should then make a request to the `/contact-channels/verify` endpoint.', exampleValue: 'https://example.com/handler/email-verification' } });\nexport const accessTokenResponseSchema = yupString().meta({ openapiField: { description: 'Short-lived access token that can be used to authenticate the user', exampleValue: 'eyJhmMiJB2TO...diI4QT' } });\nexport const refreshTokenResponseSchema = yupString().meta({ openapiField: { description: 'Long-lived refresh token that can be used to obtain a new access token', exampleValue: 'i8ns3aq2...14y' } });\nexport const signInResponseSchema = yupObject({\n refresh_token: refreshTokenResponseSchema.defined(),\n access_token: accessTokenResponseSchema.defined(),\n is_new_user: yupBoolean().meta({ openapiField: { description: 'Whether the user is a new user', exampleValue: true } }).defined(),\n user_id: userIdSchema.defined(),\n});\n\n// Permissions\nexport const teamSystemPermissions = [\n '$update_team',\n '$delete_team',\n '$read_members',\n '$remove_members',\n '$invite_members',\n '$manage_api_keys',\n] as const;\nexport const permissionDefinitionIdSchema = yupString()\n .matches(/^\\$?[a-z0-9_:]+$/, 'Only lowercase letters, numbers, \":\", \"_\" and optional \"$\" at the beginning are allowed')\n .test('is-system-permission', 'System permissions must start with a dollar sign', (value, ctx) => {\n if (!value) return true;\n if (value.startsWith('$') && !teamSystemPermissions.includes(value as any)) {\n return ctx.createError({ message: 'Invalid system permission' });\n }\n return true;\n })\n .meta({ openapiField: { description: `The permission ID used to uniquely identify a permission. Can either be a custom permission with lowercase letters, numbers, \\`:\\`, and \\`_\\` characters, or one of the system permissions: ${teamSystemPermissions.map(x => `\\`${x}\\``).join(', ')}`, exampleValue: 'read_secret_info' } });\nexport const customPermissionDefinitionIdSchema = yupString()\n .matches(/^[a-z0-9_:]+$/, 'Only lowercase letters, numbers, \":\", \"_\" are allowed')\n .meta({ openapiField: { description: 'The permission ID used to uniquely identify a permission. Can only contain lowercase letters, numbers, \":\", and \"_\" characters', exampleValue: 'read_secret_info' } });\nexport const teamPermissionDescriptionSchema = yupString().meta({ openapiField: { description: 'A human-readable description of the permission', exampleValue: 'Read secret information' } });\nexport const containedPermissionIdsSchema = yupArray(permissionDefinitionIdSchema.defined()).meta({ openapiField: { description: 'The IDs of the permissions that are contained in this permission', exampleValue: ['read_public_info'] } });\n\n// Teams\nexport const teamIdSchema = yupString().uuid().meta({ openapiField: { description: _idDescription('team'), exampleValue: 'ad962777-8244-496a-b6a2-e0c6a449c79e' } });\nexport const teamDisplayNameSchema = yupString().meta({ openapiField: { description: _displayNameDescription('team'), exampleValue: 'My Team' } });\nexport const teamProfileImageUrlSchema = urlSchema.max(1000000).meta({ openapiField: { description: _profileImageUrlDescription('team'), exampleValue: 'https://example.com/image.jpg' } });\nexport const teamClientMetadataSchema = jsonSchema.meta({ openapiField: { description: _clientMetaDataDescription('team'), exampleValue: { key: 'value' } } });\nexport const teamClientReadOnlyMetadataSchema = jsonSchema.meta({ openapiField: { description: _clientReadOnlyMetaDataDescription('team'), exampleValue: { key: 'value' } } });\nexport const teamServerMetadataSchema = jsonSchema.meta({ openapiField: { description: _serverMetaDataDescription('team'), exampleValue: { key: 'value' } } });\nexport const teamCreatedAtMillisSchema = yupNumber().meta({ openapiField: { description: _createdAtMillisDescription('team'), exampleValue: 1630000000000 } });\nexport const teamInvitationEmailSchema = emailSchema.meta({ openapiField: { description: 'The email of the user to invite.', exampleValue: 'johndoe@example.com' } });\nexport const teamInvitationCallbackUrlSchema = urlSchema.meta({ openapiField: { description: 'The base callback URL to construct an invite link with. A query parameter `code` with the verification code will be appended to it. The page should then make a request to the `/team-invitations/accept` endpoint.', exampleValue: 'https://example.com/handler/team-invitation' } });\nexport const teamCreatorUserIdSchema = userIdOrMeSchema.meta({ openapiField: { description: 'The ID of the creator of the team. If not specified, the user will not be added to the team. Can be either \"me\" or the ID of the user. Only used on the client side.', exampleValue: 'me' } });\n\n// Team member profiles\nexport const teamMemberDisplayNameSchema = yupString().meta({ openapiField: { description: _displayNameDescription('team member') + ' Note that this is separate from the display_name of the user.', exampleValue: 'John Doe' } });\nexport const teamMemberProfileImageUrlSchema = urlSchema.max(1000000).meta({ openapiField: { description: _profileImageUrlDescription('team member'), exampleValue: 'https://example.com/image.jpg' } });\n\n// Contact channels\nexport const contactChannelIdSchema = yupString().uuid().meta({ openapiField: { description: _idDescription('contact channel'), exampleValue: 'b3d396b8-c574-4c80-97b3-50031675ceb2' } });\nexport const contactChannelTypeSchema = yupString().oneOf(['email']).meta({ openapiField: { description: `The type of the contact channel. Currently only \"email\" is supported.`, exampleValue: 'email' } });\nexport const contactChannelValueSchema = yupString().when('type', {\n is: 'email',\n then: (schema) => schema.email(),\n}).meta({ openapiField: { description: 'The value of the contact channel. For email, this should be a valid email address.', exampleValue: 'johndoe@example.com' } });\nexport const contactChannelUsedForAuthSchema = yupBoolean().meta({ openapiField: { description: 'Whether the contact channel is used for authentication. If this is set to `true`, the user will be able to sign in with the contact channel with password or OTP.', exampleValue: true } });\nexport const contactChannelIsVerifiedSchema = yupBoolean().meta({ openapiField: { description: 'Whether the contact channel has been verified. If this is set to `true`, the contact channel has been verified to belong to the user.', exampleValue: true } });\nexport const contactChannelIsPrimarySchema = yupBoolean().meta({ openapiField: { description: 'Whether the contact channel is the primary contact channel. If this is set to `true`, it will be used for authentication and notifications by default.', exampleValue: true } });\n\n// Headers\nexport const basicAuthorizationHeaderSchema = yupString().test('is-basic-authorization-header', 'Authorization header must be in the format \"Basic <base64>\"', (value) => {\n if (!value) return true;\n return decodeBasicAuthorizationHeader(value) !== null;\n});\n\n// Neon integration\nexport const neonAuthorizationHeaderSchema = basicAuthorizationHeaderSchema.test('is-neon-authorization-header', 'Invalid client_id:client_secret values; did you use the correct values for the Neon integration?', (value) => {\n if (!value) return true;\n const [clientId, clientSecret] = decodeBasicAuthorizationHeader(value) ?? throwErr(`Neon authz header invalid? This should've been validated by basicAuthorizationHeaderSchema: ${value}`);\n for (const neonClientConfig of JSON.parse(process.env.STACK_NEON_INTEGRATION_CLIENTS_CONFIG || '[]')) {\n if (clientId === neonClientConfig.client_id && clientSecret === neonClientConfig.client_secret) return true;\n }\n return false;\n});\n\n// Utils\nexport function yupDefinedWhen<S extends yup.AnyObject>(\n schema: S,\n triggers: Record<string, any>,\n): S {\n const entries = Object.entries(triggers);\n return schema.when(entries.map(([key]) => key), {\n is: (...values: any[]) => entries.every(([key, value], index) => value === values[index]),\n then: (schema: S) => schema.defined(),\n otherwise: (schema: S) => schema.optional()\n });\n}\n\nexport function yupDefinedAndNonEmptyWhen<S extends yup.StringSchema>(\n schema: S,\n triggers: Record<string, any>,\n): S {\n const entries = Object.entries(triggers);\n return schema.when(entries.map(([key]) => key), {\n is: (...values: any[]) => entries.every(([key, value], index) => value === values[index]),\n then: (schema: S) => schema.defined().nonEmpty(),\n otherwise: (schema: S) => schema.optional()\n });\n}\n"],"mappings":"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","names":["object","schema"]}
1
+ {"version":3,"sources":["../src/schema-fields.ts"],"sourcesContent":["import * as yup from \"yup\";\nimport { KnownErrors } from \".\";\nimport { isBase64 } from \"./utils/bytes\";\nimport { StackAssertionError, throwErr } from \"./utils/errors\";\nimport { decodeBasicAuthorizationHeader } from \"./utils/http\";\nimport { allProviders } from \"./utils/oauth\";\nimport { deepPlainClone, omit } from \"./utils/objects\";\nimport { isValidUrl } from \"./utils/urls\";\nimport { isUuid } from \"./utils/uuids\";\n\ndeclare module \"yup\" {\n // eslint-disable-next-line @typescript-eslint/consistent-type-definitions\n interface StringSchema<TType, TContext, TDefault, TFlags> {\n nonEmpty(message?: string): StringSchema<TType, TContext, TDefault, TFlags>,\n empty(): StringSchema<TType, TContext, TDefault, TFlags>,\n }\n\n // eslint-disable-next-line @typescript-eslint/consistent-type-definitions\n interface Schema<TType, TContext, TDefault, TFlags> {\n getNested<K extends keyof NonNullable<TType>>(path: K): yup.Schema<NonNullable<TType>[K], TContext, TDefault, TFlags>,\n\n // the default types for concat kinda suck, so let's fix that\n concat<U extends yup.AnySchema>(schema: U): yup.Schema<Omit<NonNullable<TType>, keyof yup.InferType<U>> & yup.InferType<U> | (TType & (null | undefined)), TContext, TDefault, TFlags>,\n }\n}\n\n// eslint-disable-next-line no-restricted-syntax\nyup.addMethod(yup.string, \"nonEmpty\", function (message?: string) {\n return this.test(\n \"non-empty\",\n message ?? (({ path }) => `${path} must not be empty`),\n (value) => {\n return value !== \"\";\n }\n );\n});\n\nyup.addMethod(yup.Schema, \"getNested\", function (path: any) {\n if (!path.match(/^[a-zA-Z_][a-zA-Z0-9_]*$/)) throw new StackAssertionError(`yupSchema.getNested can currently only be used with alphanumeric keys. Fix this in the future. Provided key: ${path}`);\n return yup.reach(this, path) as any;\n});\n\nexport async function yupValidate<S extends yup.ISchema<any>>(\n schema: S,\n obj: unknown,\n options?: yup.ValidateOptions & { currentUserId?: string | null }\n): Promise<yup.InferType<S>> {\n try {\n return await schema.validate(obj, {\n ...omit(options ?? {}, ['currentUserId']),\n context: {\n ...options?.context,\n stackAllowUserIdMe: options?.currentUserId !== undefined,\n },\n });\n } catch (error) {\n if (error instanceof ReplaceFieldWithOwnUserId) {\n const currentUserId = options?.currentUserId;\n if (!currentUserId) throw new KnownErrors.CannotGetOwnUserWithoutUser();\n\n // parse yup path\n let pathRemaining = error.path;\n const fieldPath = [];\n while (pathRemaining.length > 0) {\n if (pathRemaining.startsWith(\"[\")) {\n const index = pathRemaining.indexOf(\"]\");\n if (index < 0) throw new StackAssertionError(\"Invalid path\");\n fieldPath.push(JSON.parse(pathRemaining.slice(1, index)));\n pathRemaining = pathRemaining.slice(index + 1);\n } else {\n let dotIndex = pathRemaining.indexOf(\".\");\n if (dotIndex === -1) dotIndex = pathRemaining.length;\n fieldPath.push(pathRemaining.slice(0, dotIndex));\n pathRemaining = pathRemaining.slice(dotIndex + 1);\n }\n }\n\n const newObj = deepPlainClone(obj);\n let it = newObj;\n for (const field of fieldPath.slice(0, -1)) {\n if (!Object.prototype.hasOwnProperty.call(it, field)) {\n throw new StackAssertionError(`Segment ${field} of path ${error.path} not found in object`);\n }\n it = (it as any)[field];\n }\n (it as any)[fieldPath[fieldPath.length - 1]] = currentUserId;\n\n return await yupValidate(schema, newObj, options);\n }\n throw error;\n }\n}\n\nconst _idDescription = (identify: string) => `The unique identifier of the ${identify}`;\nconst _displayNameDescription = (identify: string) => `Human-readable ${identify} display name. This is not a unique identifier.`;\nconst _clientMetaDataDescription = (identify: string) => `Client metadata. Used as a data store, accessible from the client side. Do not store information that should not be exposed to the client.`;\nconst _clientReadOnlyMetaDataDescription = (identify: string) => `Client read-only, server-writable metadata. Used as a data store, accessible from the client side. Do not store information that should not be exposed to the client. The client can read this data, but cannot modify it. This is useful for things like subscription status.`;\nconst _profileImageUrlDescription = (identify: string) => `URL of the profile image for ${identify}. Can be a Base64 encoded image. Must be smaller than 100KB. Please compress and crop to a square before passing in.`;\nconst _serverMetaDataDescription = (identify: string) => `Server metadata. Used as a data store, only accessible from the server side. You can store secret information related to the ${identify} here.`;\nconst _atMillisDescription = (identify: string) => `(the number of milliseconds since epoch, January 1, 1970, UTC)`;\nconst _createdAtMillisDescription = (identify: string) => `The time the ${identify} was created ${_atMillisDescription(identify)}`;\nconst _signedUpAtMillisDescription = `The time the user signed up ${_atMillisDescription}`;\nconst _lastActiveAtMillisDescription = `The time the user was last active ${_atMillisDescription}`;\n\n\ndeclare const StackAdaptSentinel: unique symbol;\nexport type StackAdaptSentinel = typeof StackAdaptSentinel;\n\n// Built-in replacements\nexport function yupString<A extends string, B extends yup.Maybe<yup.AnyObject> = yup.AnyObject>(...args: Parameters<typeof yup.string<A, B>>) {\n // eslint-disable-next-line no-restricted-syntax\n return yup.string(...args);\n}\nexport function yupNumber<A extends number, B extends yup.Maybe<yup.AnyObject> = yup.AnyObject>(...args: Parameters<typeof yup.number<A, B>>) {\n // eslint-disable-next-line no-restricted-syntax\n return yup.number(...args);\n}\nexport function yupBoolean<A extends boolean, B extends yup.Maybe<yup.AnyObject> = yup.AnyObject>(...args: Parameters<typeof yup.boolean<A, B>>) {\n // eslint-disable-next-line no-restricted-syntax\n return yup.boolean(...args);\n}\n/**\n * @deprecated, use number of milliseconds since epoch instead\n */\nexport function yupDate<A extends Date, B extends yup.Maybe<yup.AnyObject> = yup.AnyObject>(...args: Parameters<typeof yup.date<A, B>>) {\n // eslint-disable-next-line no-restricted-syntax\n return yup.date(...args);\n}\nexport function yupMixed<A extends {}>(...args: Parameters<typeof yup.mixed<A>>) {\n // eslint-disable-next-line no-restricted-syntax\n return yup.mixed(...args);\n}\nexport function yupArray<A extends yup.Maybe<yup.AnyObject> = yup.AnyObject, B = any>(...args: Parameters<typeof yup.array<A, B>>) {\n // eslint-disable-next-line no-restricted-syntax\n return yup.array(...args);\n}\nexport function yupTuple<T extends [unknown, ...unknown[]]>(...args: Parameters<typeof yup.tuple<T>>) {\n // eslint-disable-next-line no-restricted-syntax\n return yup.tuple<T>(...args);\n}\nexport function yupObject<A extends yup.Maybe<yup.AnyObject>, B extends yup.ObjectShape>(...args: Parameters<typeof yup.object<A, B>>) {\n // eslint-disable-next-line no-restricted-syntax\n const object = yup.object(...args).test(\n 'no-unknown-object-properties',\n ({ path }) => `${path} contains unknown properties`,\n (value: any, context) => {\n if (context.options.context?.noUnknownPathPrefixes?.some((prefix: string) => context.path.startsWith(prefix))) {\n if (context.schema.spec.noUnknown !== false) {\n const availableKeys = new Set(Object.keys(context.schema.fields));\n const unknownKeys = Object.keys(value ?? {}).filter(key => !availableKeys.has(key));\n if (unknownKeys.length > 0) {\n // TODO \"did you mean XYZ\"\n return context.createError({\n message: `${context.path || \"Object\"} contains unknown properties: ${unknownKeys.join(', ')}`,\n path: context.path,\n params: { unknownKeys, availableKeys },\n });\n }\n }\n }\n return true;\n },\n );\n\n // we don't want to update the type of `object` to have a default flag\n return object.default(undefined) as any as typeof object;\n}\n\nexport function yupNever(): yup.MixedSchema<never> {\n return yupMixed().test('never', 'This value should never be reached', () => false) as any;\n}\n\nexport function yupUnion<T extends yup.ISchema<any>[]>(...args: T): yup.MixedSchema<yup.InferType<T[number]>> {\n if (args.length === 0) throw new Error('yupUnion must have at least one schema');\n\n const [first] = args;\n const firstDesc = first.describe();\n for (const schema of args) {\n const desc = schema.describe();\n if (desc.type !== firstDesc.type) throw new StackAssertionError(`yupUnion must have schemas of the same type (got: ${firstDesc.type} and ${desc.type})`, { first, schema, firstDesc, desc });\n }\n\n return yupMixed().test('is-one-of', 'Invalid value', async (value, context) => {\n const errors = [];\n for (const schema of args) {\n try {\n await yupValidate(schema, value, context.options);\n return true;\n } catch (e) {\n errors.push(e);\n }\n }\n return context.createError({\n message: `${context.path} is not matched by any of the provided schemas:\\n${errors.map((e: any, i) => '\\tSchema ' + i + \": \\n\\t\\t\" + e.errors.join('\\n\\t\\t')).join('\\n')}`,\n path: context.path,\n });\n });\n}\n\nexport function yupRecord<K extends yup.StringSchema, T extends yup.AnySchema>(\n keySchema: K,\n valueSchema: T,\n): yup.MixedSchema<Record<string, yup.InferType<T>>> {\n return yupObject().unknown(true).test(\n 'record',\n '${path} must be a record of valid values',\n async function (value: unknown, context: yup.TestContext) {\n if (value == null) return true;\n const { path, createError } = this as any;\n if (typeof value !== 'object') {\n return createError({ message: `${path} must be an object` });\n }\n\n // Validate each property using the provided valueSchema\n for (const key of Object.keys(value)) {\n // Validate the key\n await yupValidate(keySchema, key, context.options);\n\n // Validate the value\n try {\n await yupValidate(valueSchema, (value as Record<string, unknown>)[key], {\n ...context.options,\n context: {\n ...context.options.context,\n path: path ? `${path}.${key}` : key,\n },\n });\n } catch (e: any) {\n return createError({\n path: path ? `${path}.${key}` : key,\n message: e.message,\n });\n }\n }\n\n return true;\n },\n ) as any;\n}\n\nexport function ensureObjectSchema<T extends yup.AnyObject>(schema: yup.Schema<T>): yup.ObjectSchema<T> & typeof schema {\n if (!(schema instanceof yup.ObjectSchema)) throw new StackAssertionError(`assertObjectSchema: schema is not an ObjectSchema: ${schema.describe().type}`);\n return schema as any;\n}\n\n// Common\nexport const adaptSchema = yupMixed<StackAdaptSentinel>();\n/**\n * Yup's URL schema does not recognize some URLs (including `http://localhost`) as a valid URL. This schema is a workaround for that.\n */\nexport const urlSchema = yupString().test({\n name: 'no-spaces',\n message: (params) => `${params.path} contains spaces`,\n test: (value) => value == null || !value.includes(' ')\n}).test({\n name: 'url',\n message: (params) => `${params.path} is not a valid URL`,\n test: (value) => value == null || isValidUrl(value)\n});\nexport const jsonSchema = yupMixed().nullable().defined().transform((value) => JSON.parse(JSON.stringify(value)));\nexport const jsonStringSchema = yupString().test(\"json\", (params) => `${params.path} is not valid JSON`, (value) => {\n if (value == null) return true;\n try {\n JSON.parse(value);\n return true;\n } catch (error) {\n return false;\n }\n});\nexport const jsonStringOrEmptySchema = yupString().test(\"json\", (params) => `${params.path} is not valid JSON`, (value) => {\n if (!value) return true;\n try {\n JSON.parse(value);\n return true;\n } catch (error) {\n return false;\n }\n});\nexport const base64Schema = yupString().test(\"is-base64\", (params) => `${params.path} is not valid base64`, (value) => {\n if (value == null) return true;\n return isBase64(value);\n});\nexport const passwordSchema = yupString().max(70);\n\n/**\n * A stricter email schema that does some additional checks for UX input. (Some emails are allowed by the spec, for\n * example `test@localhost` or `abc@gmail`, but almost certainly a user input error.)\n *\n * Note that some users in the DB have an email that doesn't match this regex, so most of the time you should use\n * `emailSchema` instead until we do the DB migration.\n */\n// eslint-disable-next-line no-restricted-syntax\nexport const strictEmailSchema = (message: string | undefined) => yupString().email(message).matches(/^[^.]+(\\.[^.]+)*@.*\\.[^.][^.]+$/, message);\n// eslint-disable-next-line no-restricted-syntax\nexport const emailSchema = yupString().email();\n\nundefined?.test('strictEmailSchema', ({ expect }) => {\n const validEmails = [\n \"a@example.com\",\n \"abc@example.com\",\n \"a.b@example.com\",\n \"throwaway.mail+token@example.com\",\n \"email-alt-dash@demo-mail.com\",\n \"test-account@weird-domain.net\",\n \"%!~&+{}=|`#@domain.test\",\n \"admin@a.longtldexample\",\n ];\n for (const email of validEmails) {\n expect(strictEmailSchema(undefined).validateSync(email)).toBe(email);\n }\n const invalidEmails = [\n \"test@localhost\",\n \"test@gmail\",\n \"test@gmail.com.a\",\n \"test@gmail.a\",\n \"test.@example.com\",\n \"test..test@example.com\",\n \".test@example.com\",\n ];\n for (const email of invalidEmails) {\n expect(() => strictEmailSchema(undefined).validateSync(email)).toThrow();\n }\n});\n\n// Request auth\nexport const clientOrHigherAuthTypeSchema = yupString().oneOf(['client', 'server', 'admin']).defined();\nexport const serverOrHigherAuthTypeSchema = yupString().oneOf(['server', 'admin']).defined();\nexport const adminAuthTypeSchema = yupString().oneOf(['admin']).defined();\n\n// Projects\nexport const projectIdSchema = yupString().test((v) => v === undefined || v === \"internal\" || isUuid(v)).meta({ openapiField: { description: _idDescription('project'), exampleValue: 'e0b52f4d-dece-408c-af49-d23061bb0f8d' } });\nexport const projectBranchIdSchema = yupString().nonEmpty().max(255).meta({ openapiField: { description: _idDescription('project branch'), exampleValue: 'main' } });\nexport const projectDisplayNameSchema = yupString().meta({ openapiField: { description: _displayNameDescription('project'), exampleValue: 'MyMusic' } });\nexport const projectDescriptionSchema = yupString().nullable().meta({ openapiField: { description: 'A human readable description of the project', exampleValue: 'A music streaming service' } });\nexport const projectCreatedAtMillisSchema = yupNumber().meta({ openapiField: { description: _createdAtMillisDescription('project'), exampleValue: 1630000000000 } });\nexport const projectUserCountSchema = yupNumber().meta({ openapiField: { description: 'The number of users in this project', exampleValue: 10 } });\nexport const projectIsProductionModeSchema = yupBoolean().meta({ openapiField: { description: 'Whether the project is in production mode', exampleValue: true } });\n// Project config\nexport const projectConfigIdSchema = yupString().meta({ openapiField: { description: _idDescription('project config'), exampleValue: 'd09201f0-54f5-40bd-89ff-6d1815ddad24' } });\nexport const projectAllowLocalhostSchema = yupBoolean().meta({ openapiField: { description: 'Whether localhost is allowed as a domain for this project. Should only be allowed in development mode', exampleValue: true } });\nexport const projectCreateTeamOnSignUpSchema = yupBoolean().meta({ openapiField: { description: 'Whether a team should be created for each user that signs up', exampleValue: true } });\nexport const projectMagicLinkEnabledSchema = yupBoolean().meta({ openapiField: { description: 'Whether magic link authentication is enabled for this project', exampleValue: true } });\nexport const projectPasskeyEnabledSchema = yupBoolean().meta({ openapiField: { description: 'Whether passkey authentication is enabled for this project', exampleValue: true } });\nexport const projectClientTeamCreationEnabledSchema = yupBoolean().meta({ openapiField: { description: 'Whether client users can create teams', exampleValue: true } });\nexport const projectClientUserDeletionEnabledSchema = yupBoolean().meta({ openapiField: { description: 'Whether client users can delete their own account from the client', exampleValue: true } });\nexport const projectSignUpEnabledSchema = yupBoolean().meta({ openapiField: { description: 'Whether users can sign up new accounts, or whether they are only allowed to sign in to existing accounts. Regardless of this option, the server API can always create new users with the `POST /users` endpoint.', exampleValue: true } });\nexport const projectCredentialEnabledSchema = yupBoolean().meta({ openapiField: { description: 'Whether email password authentication is enabled for this project', exampleValue: true } });\n// Project OAuth config\nexport const oauthIdSchema = yupString().oneOf(allProviders).meta({ openapiField: { description: `OAuth provider ID, one of ${allProviders.map(x => `\\`${x}\\``).join(', ')}`, exampleValue: 'google' } });\nexport const oauthEnabledSchema = yupBoolean().meta({ openapiField: { description: 'Whether the OAuth provider is enabled. If an provider is first enabled, then disabled, it will be shown in the list but with enabled=false', exampleValue: true } });\nexport const oauthTypeSchema = yupString().oneOf(['shared', 'standard']).meta({ openapiField: { description: 'OAuth provider type, one of shared, standard. \"shared\" uses Stack shared OAuth keys and it is only meant for development. \"standard\" uses your own OAuth keys and will show your logo and company name when signing in with the provider.', exampleValue: 'standard' } });\nexport const oauthClientIdSchema = yupString().meta({ openapiField: { description: 'OAuth client ID. Needs to be specified when using type=\"standard\"', exampleValue: 'google-oauth-client-id' } });\nexport const oauthClientSecretSchema = yupString().meta({ openapiField: { description: 'OAuth client secret. Needs to be specified when using type=\"standard\"', exampleValue: 'google-oauth-client-secret' } });\nexport const oauthFacebookConfigIdSchema = yupString().meta({ openapiField: { description: 'The configuration id for Facebook business login (for things like ads and marketing). This is only required if you are using the standard OAuth with Facebook and you are using Facebook business login.' } });\nexport const oauthMicrosoftTenantIdSchema = yupString().meta({ openapiField: { description: 'The Microsoft tenant id for Microsoft directory. This is only required if you are using the standard OAuth with Microsoft and you have an Azure AD tenant.' } });\nexport const oauthAccountMergeStrategySchema = yupString().oneOf(['link_method', 'raise_error', 'allow_duplicates']).meta({ openapiField: { description: 'Determines how to handle OAuth logins that match an existing user by email. `link_method` adds the OAuth method to the existing user. `raise_error` rejects the login with an error. `allow_duplicates` creates a new user.', exampleValue: 'link_method' } });\n// Project email config\nexport const emailTypeSchema = yupString().oneOf(['shared', 'standard']).meta({ openapiField: { description: 'Email provider type, one of shared, standard. \"shared\" uses Stack shared email provider and it is only meant for development. \"standard\" uses your own email server and will have your email address as the sender.', exampleValue: 'standard' } });\nexport const emailSenderNameSchema = yupString().meta({ openapiField: { description: 'Email sender name. Needs to be specified when using type=\"standard\"', exampleValue: 'Stack' } });\nexport const emailHostSchema = yupString().meta({ openapiField: { description: 'Email host. Needs to be specified when using type=\"standard\"', exampleValue: 'smtp.your-domain.com' } });\nexport const emailPortSchema = yupNumber().min(0).max(65535).meta({ openapiField: { description: 'Email port. Needs to be specified when using type=\"standard\"', exampleValue: 587 } });\nexport const emailUsernameSchema = yupString().meta({ openapiField: { description: 'Email username. Needs to be specified when using type=\"standard\"', exampleValue: 'smtp-email' } });\nexport const emailSenderEmailSchema = emailSchema.meta({ openapiField: { description: 'Email sender email. Needs to be specified when using type=\"standard\"', exampleValue: 'example@your-domain.com' } });\nexport const emailPasswordSchema = passwordSchema.meta({ openapiField: { description: 'Email password. Needs to be specified when using type=\"standard\"', exampleValue: 'your-email-password' } });\n// Project domain config\nexport const handlerPathSchema = yupString().test('is-handler-path', 'Handler path must start with /', (value) => value?.startsWith('/')).meta({ openapiField: { description: 'Handler path. If you did not setup a custom handler path, it should be \"/handler\" by default. It needs to start with /', exampleValue: '/handler' } });\n\n// Users\nexport class ReplaceFieldWithOwnUserId extends Error {\n constructor(public readonly path: string) {\n super(`This error should be caught by whoever validated the schema, and the field in the path '${path}' should be replaced with the current user's id. This is a workaround to yup not providing access to the context inside the transform function.`);\n }\n}\nconst userIdMeSentinelUuid = \"cad564fd-f81b-43f4-b390-98abf3fcc17e\";\nexport const userIdOrMeSchema = yupString().uuid().transform(v => {\n if (v === \"me\") return userIdMeSentinelUuid;\n else return v;\n}).test((v, context) => {\n if (!(\"stackAllowUserIdMe\" in (context.options.context ?? {}))) throw new StackAssertionError('userIdOrMeSchema is not allowed in this context. Make sure you\\'re using yupValidate from schema-fields.ts to validate, instead of schema.validate(...).');\n if (!context.options.context?.stackAllowUserIdMe) throw new StackAssertionError('userIdOrMeSchema is not allowed in this context. Make sure you\\'re passing in the currentUserId option in yupValidate.');\n if (v === userIdMeSentinelUuid) throw new ReplaceFieldWithOwnUserId(context.path);\n return true;\n}).meta({ openapiField: { description: 'The ID of the user, or the special value `me` for the currently authenticated user', exampleValue: '3241a285-8329-4d69-8f3d-316e08cf140c' } });\nexport const userIdSchema = yupString().uuid().meta({ openapiField: { description: _idDescription('user'), exampleValue: '3241a285-8329-4d69-8f3d-316e08cf140c' } });\nexport const primaryEmailSchema = emailSchema.meta({ openapiField: { description: 'Primary email', exampleValue: 'johndoe@example.com' } });\nexport const primaryEmailAuthEnabledSchema = yupBoolean().meta({ openapiField: { description: 'Whether the primary email is used for authentication. If this is set to `false`, the user will not be able to sign in with the primary email with password or OTP', exampleValue: true } });\nexport const primaryEmailVerifiedSchema = yupBoolean().meta({ openapiField: { description: 'Whether the primary email has been verified to belong to this user', exampleValue: true } });\nexport const userDisplayNameSchema = yupString().nullable().meta({ openapiField: { description: _displayNameDescription('user'), exampleValue: 'John Doe' } });\nexport const selectedTeamIdSchema = yupString().uuid().meta({ openapiField: { description: 'ID of the team currently selected by the user', exampleValue: 'team-id' } });\nexport const profileImageUrlSchema = urlSchema.max(1000000).meta({ openapiField: { description: _profileImageUrlDescription('user'), exampleValue: 'https://example.com/image.jpg' } });\nexport const signedUpAtMillisSchema = yupNumber().meta({ openapiField: { description: _signedUpAtMillisDescription, exampleValue: 1630000000000 } });\nexport const userClientMetadataSchema = jsonSchema.meta({ openapiField: { description: _clientMetaDataDescription('user'), exampleValue: { key: 'value' } } });\nexport const userClientReadOnlyMetadataSchema = jsonSchema.meta({ openapiField: { description: _clientReadOnlyMetaDataDescription('user'), exampleValue: { key: 'value' } } });\nexport const userServerMetadataSchema = jsonSchema.meta({ openapiField: { description: _serverMetaDataDescription('user'), exampleValue: { key: 'value' } } });\nexport const userOAuthProviderSchema = yupObject({\n id: yupString().defined(),\n type: yupString().oneOf(allProviders).defined(),\n provider_user_id: yupString().defined(),\n});\nexport const userLastActiveAtMillisSchema = yupNumber().nullable().meta({ openapiField: { description: _lastActiveAtMillisDescription, exampleValue: 1630000000000 } });\nexport const userPasskeyAuthEnabledSchema = yupBoolean().meta({ openapiField: { hidden: true, description: 'Whether the user has passkeys enabled', exampleValue: false } });\nexport const userOtpAuthEnabledSchema = yupBoolean().meta({ openapiField: { hidden: true, description: 'Whether the user has OTP/magic link enabled. ', exampleValue: true } });\nexport const userOtpAuthEnabledMutationSchema = yupBoolean().meta({ openapiField: { hidden: true, description: 'Whether the user has OTP/magic link enabled. Note that only accounts with verified emails can sign-in with OTP.', exampleValue: true } });\nexport const userHasPasswordSchema = yupBoolean().meta({ openapiField: { hidden: true, description: 'Whether the user has a password set. If the user does not have a password set, they will not be able to sign in with email/password.', exampleValue: true } });\nexport const userPasswordMutationSchema = passwordSchema.nullable().meta({ openapiField: { description: 'Sets the user\\'s password. Doing so revokes all current sessions.', exampleValue: 'my-new-password' } }).max(70);\nexport const userPasswordHashMutationSchema = yupString()\n .nonEmpty()\n .meta({ openapiField: { description: 'If `password` is not given, sets the user\\'s password hash to the given string in Modular Crypt Format (ex.: `$2a$10$VIhIOofSMqGdGlL4wzE//e.77dAQGqNtF/1dT7bqCrVtQuInWy2qi`). Doing so revokes all current sessions.' } }); // we don't set an exampleValue here because it's exclusive with the password field and having both would break the generated example\nexport const userTotpSecretMutationSchema = base64Schema.nullable().meta({ openapiField: { description: 'Enables 2FA and sets a TOTP secret for the user. Set to null to disable 2FA.', exampleValue: 'dG90cC1zZWNyZXQ=' } });\n\n// Auth\nexport const signInEmailSchema = strictEmailSchema(undefined).meta({ openapiField: { description: 'The email to sign in with.', exampleValue: 'johndoe@example.com' } });\nexport const emailOtpSignInCallbackUrlSchema = urlSchema.meta({ openapiField: { description: 'The base callback URL to construct the magic link from. A query parameter `code` with the verification code will be appended to it. The page should then make a request to the `/auth/otp/sign-in` endpoint.', exampleValue: 'https://example.com/handler/magic-link-callback' } });\nexport const emailVerificationCallbackUrlSchema = urlSchema.meta({ openapiField: { description: 'The base callback URL to construct a verification link for the verification e-mail. A query parameter `code` with the verification code will be appended to it. The page should then make a request to the `/contact-channels/verify` endpoint.', exampleValue: 'https://example.com/handler/email-verification' } });\nexport const accessTokenResponseSchema = yupString().meta({ openapiField: { description: 'Short-lived access token that can be used to authenticate the user', exampleValue: 'eyJhmMiJB2TO...diI4QT' } });\nexport const refreshTokenResponseSchema = yupString().meta({ openapiField: { description: 'Long-lived refresh token that can be used to obtain a new access token', exampleValue: 'i8ns3aq2...14y' } });\nexport const signInResponseSchema = yupObject({\n refresh_token: refreshTokenResponseSchema.defined(),\n access_token: accessTokenResponseSchema.defined(),\n is_new_user: yupBoolean().meta({ openapiField: { description: 'Whether the user is a new user', exampleValue: true } }).defined(),\n user_id: userIdSchema.defined(),\n});\n\n// Permissions\nexport const teamSystemPermissions = [\n '$update_team',\n '$delete_team',\n '$read_members',\n '$remove_members',\n '$invite_members',\n '$manage_api_keys',\n] as const;\nexport const permissionDefinitionIdSchema = yupString()\n .matches(/^\\$?[a-z0-9_:]+$/, 'Only lowercase letters, numbers, \":\", \"_\" and optional \"$\" at the beginning are allowed')\n .test('is-system-permission', 'System permissions must start with a dollar sign', (value, ctx) => {\n if (!value) return true;\n if (value.startsWith('$') && !teamSystemPermissions.includes(value as any)) {\n return ctx.createError({ message: 'Invalid system permission' });\n }\n return true;\n })\n .meta({ openapiField: { description: `The permission ID used to uniquely identify a permission. Can either be a custom permission with lowercase letters, numbers, \\`:\\`, and \\`_\\` characters, or one of the system permissions: ${teamSystemPermissions.map(x => `\\`${x}\\``).join(', ')}`, exampleValue: 'read_secret_info' } });\nexport const customPermissionDefinitionIdSchema = yupString()\n .matches(/^[a-z0-9_:]+$/, 'Only lowercase letters, numbers, \":\", \"_\" are allowed')\n .meta({ openapiField: { description: 'The permission ID used to uniquely identify a permission. Can only contain lowercase letters, numbers, \":\", and \"_\" characters', exampleValue: 'read_secret_info' } });\nexport const teamPermissionDescriptionSchema = yupString().meta({ openapiField: { description: 'A human-readable description of the permission', exampleValue: 'Read secret information' } });\nexport const containedPermissionIdsSchema = yupArray(permissionDefinitionIdSchema.defined()).meta({ openapiField: { description: 'The IDs of the permissions that are contained in this permission', exampleValue: ['read_public_info'] } });\n\n// Teams\nexport const teamIdSchema = yupString().uuid().meta({ openapiField: { description: _idDescription('team'), exampleValue: 'ad962777-8244-496a-b6a2-e0c6a449c79e' } });\nexport const teamDisplayNameSchema = yupString().meta({ openapiField: { description: _displayNameDescription('team'), exampleValue: 'My Team' } });\nexport const teamProfileImageUrlSchema = urlSchema.max(1000000).meta({ openapiField: { description: _profileImageUrlDescription('team'), exampleValue: 'https://example.com/image.jpg' } });\nexport const teamClientMetadataSchema = jsonSchema.meta({ openapiField: { description: _clientMetaDataDescription('team'), exampleValue: { key: 'value' } } });\nexport const teamClientReadOnlyMetadataSchema = jsonSchema.meta({ openapiField: { description: _clientReadOnlyMetaDataDescription('team'), exampleValue: { key: 'value' } } });\nexport const teamServerMetadataSchema = jsonSchema.meta({ openapiField: { description: _serverMetaDataDescription('team'), exampleValue: { key: 'value' } } });\nexport const teamCreatedAtMillisSchema = yupNumber().meta({ openapiField: { description: _createdAtMillisDescription('team'), exampleValue: 1630000000000 } });\nexport const teamInvitationEmailSchema = emailSchema.meta({ openapiField: { description: 'The email of the user to invite.', exampleValue: 'johndoe@example.com' } });\nexport const teamInvitationCallbackUrlSchema = urlSchema.meta({ openapiField: { description: 'The base callback URL to construct an invite link with. A query parameter `code` with the verification code will be appended to it. The page should then make a request to the `/team-invitations/accept` endpoint.', exampleValue: 'https://example.com/handler/team-invitation' } });\nexport const teamCreatorUserIdSchema = userIdOrMeSchema.meta({ openapiField: { description: 'The ID of the creator of the team. If not specified, the user will not be added to the team. Can be either \"me\" or the ID of the user. Only used on the client side.', exampleValue: 'me' } });\n\n// Team member profiles\nexport const teamMemberDisplayNameSchema = yupString().meta({ openapiField: { description: _displayNameDescription('team member') + ' Note that this is separate from the display_name of the user.', exampleValue: 'John Doe' } });\nexport const teamMemberProfileImageUrlSchema = urlSchema.max(1000000).meta({ openapiField: { description: _profileImageUrlDescription('team member'), exampleValue: 'https://example.com/image.jpg' } });\n\n// Contact channels\nexport const contactChannelIdSchema = yupString().uuid().meta({ openapiField: { description: _idDescription('contact channel'), exampleValue: 'b3d396b8-c574-4c80-97b3-50031675ceb2' } });\nexport const contactChannelTypeSchema = yupString().oneOf(['email']).meta({ openapiField: { description: `The type of the contact channel. Currently only \"email\" is supported.`, exampleValue: 'email' } });\nexport const contactChannelValueSchema = yupString().when('type', {\n is: 'email',\n then: (schema) => schema.email(),\n}).meta({ openapiField: { description: 'The value of the contact channel. For email, this should be a valid email address.', exampleValue: 'johndoe@example.com' } });\nexport const contactChannelUsedForAuthSchema = yupBoolean().meta({ openapiField: { description: 'Whether the contact channel is used for authentication. If this is set to `true`, the user will be able to sign in with the contact channel with password or OTP.', exampleValue: true } });\nexport const contactChannelIsVerifiedSchema = yupBoolean().meta({ openapiField: { description: 'Whether the contact channel has been verified. If this is set to `true`, the contact channel has been verified to belong to the user.', exampleValue: true } });\nexport const contactChannelIsPrimarySchema = yupBoolean().meta({ openapiField: { description: 'Whether the contact channel is the primary contact channel. If this is set to `true`, it will be used for authentication and notifications by default.', exampleValue: true } });\n\n// Headers\nexport const basicAuthorizationHeaderSchema = yupString().test('is-basic-authorization-header', 'Authorization header must be in the format \"Basic <base64>\"', (value) => {\n if (!value) return true;\n return decodeBasicAuthorizationHeader(value) !== null;\n});\n\n// Neon integration\nexport const neonAuthorizationHeaderSchema = basicAuthorizationHeaderSchema.test('is-authorization-header', 'Invalid client_id:client_secret values; did you use the correct values for the integration?', (value) => {\n if (!value) return true;\n const [clientId, clientSecret] = decodeBasicAuthorizationHeader(value) ?? throwErr(`Authz header invalid? This should've been validated by basicAuthorizationHeaderSchema: ${value}`);\n for (const neonClientConfig of JSON.parse(process.env.STACK_INTEGRATION_CLIENTS_CONFIG || '[]')) {\n if (clientId === neonClientConfig.client_id && clientSecret === neonClientConfig.client_secret) return true;\n }\n return false;\n});\n\n// Utils\nexport function yupDefinedWhen<S extends yup.AnyObject>(\n schema: S,\n triggers: Record<string, any>,\n): S {\n const entries = Object.entries(triggers);\n return schema.when(entries.map(([key]) => key), {\n is: (...values: any[]) => entries.every(([key, value], index) => value === values[index]),\n then: (schema: S) => schema.defined(),\n otherwise: (schema: S) => schema.optional()\n });\n}\n\nexport function yupDefinedAndNonEmptyWhen<S extends yup.StringSchema>(\n schema: S,\n triggers: Record<string, any>,\n): S {\n const entries = Object.entries(triggers);\n return schema.when(entries.map(([key]) => key), {\n is: (...values: any[]) => entries.every(([key, value], index) => value === values[index]),\n then: (schema: S) => schema.defined().nonEmpty(),\n otherwise: (schema: S) => schema.optional()\n });\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;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,UAAqB;AACrB,eAA4B;AAC5B,mBAAyB;AACzB,oBAA8C;AAC9C,kBAA+C;AAC/C,mBAA6B;AAC7B,qBAAqC;AACrC,kBAA2B;AAC3B,mBAAuB;AAmBnB,cAAc,YAAQ,YAAY,SAAU,SAAkB;AAChE,SAAO,KAAK;AAAA,IACV;AAAA,IACA,YAAY,CAAC,EAAE,KAAK,MAAM,GAAG,IAAI;AAAA,IACjC,CAAC,UAAU;AACT,aAAO,UAAU;AAAA,IACnB;AAAA,EACF;AACF,CAAC;AAEG,cAAc,YAAQ,aAAa,SAAU,MAAW;AAC1D,MAAI,CAAC,KAAK,MAAM,0BAA0B,EAAG,OAAM,IAAI,kCAAoB,gHAAgH,IAAI,EAAE;AACjM,SAAW,UAAM,MAAM,IAAI;AAC7B,CAAC;AAED,eAAsB,YACpB,QACA,KACA,SAC2B;AAC3B,MAAI;AACF,WAAO,MAAM,OAAO,SAAS,KAAK;AAAA,MAChC,OAAG,qBAAK,WAAW,CAAC,GAAG,CAAC,eAAe,CAAC;AAAA,MACxC,SAAS;AAAA,QACP,GAAG,SAAS;AAAA,QACZ,oBAAoB,SAAS,kBAAkB;AAAA,MACjD;AAAA,IACF,CAAC;AAAA,EACH,SAAS,OAAO;AACd,QAAI,iBAAiB,2BAA2B;AAC9C,YAAM,gBAAgB,SAAS;AAC/B,UAAI,CAAC,cAAe,OAAM,IAAI,qBAAY,4BAA4B;AAGtE,UAAI,gBAAgB,MAAM;AAC1B,YAAM,YAAY,CAAC;AACnB,aAAO,cAAc,SAAS,GAAG;AAC/B,YAAI,cAAc,WAAW,GAAG,GAAG;AACjC,gBAAM,QAAQ,cAAc,QAAQ,GAAG;AACvC,cAAI,QAAQ,EAAG,OAAM,IAAI,kCAAoB,cAAc;AAC3D,oBAAU,KAAK,KAAK,MAAM,cAAc,MAAM,GAAG,KAAK,CAAC,CAAC;AACxD,0BAAgB,cAAc,MAAM,QAAQ,CAAC;AAAA,QAC/C,OAAO;AACL,cAAI,WAAW,cAAc,QAAQ,GAAG;AACxC,cAAI,aAAa,GAAI,YAAW,cAAc;AAC9C,oBAAU,KAAK,cAAc,MAAM,GAAG,QAAQ,CAAC;AAC/C,0BAAgB,cAAc,MAAM,WAAW,CAAC;AAAA,QAClD;AAAA,MACF;AAEA,YAAM,aAAS,+BAAe,GAAG;AACjC,UAAI,KAAK;AACT,iBAAW,SAAS,UAAU,MAAM,GAAG,EAAE,GAAG;AAC1C,YAAI,CAAC,OAAO,UAAU,eAAe,KAAK,IAAI,KAAK,GAAG;AACpD,gBAAM,IAAI,kCAAoB,WAAW,KAAK,YAAY,MAAM,IAAI,sBAAsB;AAAA,QAC5F;AACA,aAAM,GAAW,KAAK;AAAA,MACxB;AACA,MAAC,GAAW,UAAU,UAAU,SAAS,CAAC,CAAC,IAAI;AAE/C,aAAO,MAAM,YAAY,QAAQ,QAAQ,OAAO;AAAA,IAClD;AACA,UAAM;AAAA,EACR;AACF;AAEA,IAAM,iBAAiB,CAAC,aAAqB,gCAAgC,QAAQ;AACrF,IAAM,0BAA0B,CAAC,aAAqB,kBAAkB,QAAQ;AAChF,IAAM,6BAA6B,CAAC,aAAqB;AACzD,IAAM,qCAAqC,CAAC,aAAqB;AACjE,IAAM,8BAA8B,CAAC,aAAqB,gCAAgC,QAAQ;AAClG,IAAM,6BAA6B,CAAC,aAAqB,gIAAgI,QAAQ;AACjM,IAAM,uBAAuB,CAAC,aAAqB;AACnD,IAAM,8BAA8B,CAAC,aAAqB,gBAAgB,QAAQ,gBAAgB,qBAAqB,QAAQ,CAAC;AAChI,IAAM,+BAA+B,+BAA+B,oBAAoB;AACxF,IAAM,iCAAiC,qCAAqC,oBAAoB;AAOzF,SAAS,aAAmF,MAA2C;AAE5I,SAAW,WAAO,GAAG,IAAI;AAC3B;AACO,SAAS,aAAmF,MAA2C;AAE5I,SAAW,WAAO,GAAG,IAAI;AAC3B;AACO,SAAS,cAAqF,MAA4C;AAE/I,SAAW,YAAQ,GAAG,IAAI;AAC5B;AAIO,SAAS,WAA+E,MAAyC;AAEtI,SAAW,SAAK,GAAG,IAAI;AACzB;AACO,SAAS,YAA0B,MAAuC;AAE/E,SAAW,UAAM,GAAG,IAAI;AAC1B;AACO,SAAS,YAAyE,MAA0C;AAEjI,SAAW,UAAM,GAAG,IAAI;AAC1B;AACO,SAAS,YAA+C,MAAuC;AAEpG,SAAW,UAAS,GAAG,IAAI;AAC7B;AACO,SAAS,aAA4E,MAA2C;AAErI,QAAMA,UAAa,WAAO,GAAG,IAAI,EAAE;AAAA,IACjC;AAAA,IACA,CAAC,EAAE,KAAK,MAAM,GAAG,IAAI;AAAA,IACrB,CAAC,OAAY,YAAY;AACvB,UAAI,QAAQ,QAAQ,SAAS,uBAAuB,KAAK,CAAC,WAAmB,QAAQ,KAAK,WAAW,MAAM,CAAC,GAAG;AAC7G,YAAI,QAAQ,OAAO,KAAK,cAAc,OAAO;AAC3C,gBAAM,gBAAgB,IAAI,IAAI,OAAO,KAAK,QAAQ,OAAO,MAAM,CAAC;AAChE,gBAAM,cAAc,OAAO,KAAK,SAAS,CAAC,CAAC,EAAE,OAAO,SAAO,CAAC,cAAc,IAAI,GAAG,CAAC;AAClF,cAAI,YAAY,SAAS,GAAG;AAE1B,mBAAO,QAAQ,YAAY;AAAA,cACzB,SAAS,GAAG,QAAQ,QAAQ,QAAQ,iCAAiC,YAAY,KAAK,IAAI,CAAC;AAAA,cAC3F,MAAM,QAAQ;AAAA,cACd,QAAQ,EAAE,aAAa,cAAc;AAAA,YACvC,CAAC;AAAA,UACH;AAAA,QACF;AAAA,MACF;AACA,aAAO;AAAA,IACT;AAAA,EACF;AAGA,SAAOA,QAAO,QAAQ,MAAS;AACjC;AAEO,SAAS,WAAmC;AACjD,SAAO,SAAS,EAAE,KAAK,SAAS,sCAAsC,MAAM,KAAK;AACnF;AAEO,SAAS,YAA0C,MAAoD;AAC5G,MAAI,KAAK,WAAW,EAAG,OAAM,IAAI,MAAM,wCAAwC;AAE/E,QAAM,CAAC,KAAK,IAAI;AAChB,QAAM,YAAY,MAAM,SAAS;AACjC,aAAW,UAAU,MAAM;AACzB,UAAM,OAAO,OAAO,SAAS;AAC7B,QAAI,KAAK,SAAS,UAAU,KAAM,OAAM,IAAI,kCAAoB,qDAAqD,UAAU,IAAI,QAAQ,KAAK,IAAI,KAAK,EAAE,OAAO,QAAQ,WAAW,KAAK,CAAC;AAAA,EAC7L;AAEA,SAAO,SAAS,EAAE,KAAK,aAAa,iBAAiB,OAAO,OAAO,YAAY;AAC7E,UAAM,SAAS,CAAC;AAChB,eAAW,UAAU,MAAM;AACzB,UAAI;AACF,cAAM,YAAY,QAAQ,OAAO,QAAQ,OAAO;AAChD,eAAO;AAAA,MACT,SAAS,GAAG;AACV,eAAO,KAAK,CAAC;AAAA,MACf;AAAA,IACF;AACA,WAAO,QAAQ,YAAY;AAAA,MACzB,SAAS,GAAG,QAAQ,IAAI;AAAA,EAAoD,OAAO,IAAI,CAAC,GAAQ,MAAM,aAAc,IAAI,WAAa,EAAE,OAAO,KAAK,MAAQ,CAAC,EAAE,KAAK,IAAI,CAAC;AAAA,MACxK,MAAM,QAAQ;AAAA,IAChB,CAAC;AAAA,EACH,CAAC;AACH;AAEO,SAAS,UACd,WACA,aACmD;AACnD,SAAO,UAAU,EAAE,QAAQ,IAAI,EAAE;AAAA,IAC/B;AAAA,IACA;AAAA,IACA,eAAgB,OAAgB,SAA0B;AACxD,UAAI,SAAS,KAAM,QAAO;AAC1B,YAAM,EAAE,MAAM,YAAY,IAAI;AAC9B,UAAI,OAAO,UAAU,UAAU;AAC7B,eAAO,YAAY,EAAE,SAAS,GAAG,IAAI,qBAAqB,CAAC;AAAA,MAC7D;AAGA,iBAAW,OAAO,OAAO,KAAK,KAAK,GAAG;AAEpC,cAAM,YAAY,WAAW,KAAK,QAAQ,OAAO;AAGjD,YAAI;AACF,gBAAM,YAAY,aAAc,MAAkC,GAAG,GAAG;AAAA,YACtE,GAAG,QAAQ;AAAA,YACX,SAAS;AAAA,cACP,GAAG,QAAQ,QAAQ;AAAA,cACnB,MAAM,OAAO,GAAG,IAAI,IAAI,GAAG,KAAK;AAAA,YAClC;AAAA,UACF,CAAC;AAAA,QACH,SAAS,GAAQ;AACf,iBAAO,YAAY;AAAA,YACjB,MAAM,OAAO,GAAG,IAAI,IAAI,GAAG,KAAK;AAAA,YAChC,SAAS,EAAE;AAAA,UACb,CAAC;AAAA,QACH;AAAA,MACF;AAEA,aAAO;AAAA,IACT;AAAA,EACF;AACF;AAEO,SAAS,mBAA4C,QAA4D;AACtH,MAAI,EAAE,kBAAsB,kBAAe,OAAM,IAAI,kCAAoB,sDAAsD,OAAO,SAAS,EAAE,IAAI,EAAE;AACvJ,SAAO;AACT;AAGO,IAAM,cAAc,SAA6B;AAIjD,IAAM,YAAY,UAAU,EAAE,KAAK;AAAA,EACxC,MAAM;AAAA,EACN,SAAS,CAAC,WAAW,GAAG,OAAO,IAAI;AAAA,EACnC,MAAM,CAAC,UAAU,SAAS,QAAQ,CAAC,MAAM,SAAS,GAAG;AACvD,CAAC,EAAE,KAAK;AAAA,EACN,MAAM;AAAA,EACN,SAAS,CAAC,WAAW,GAAG,OAAO,IAAI;AAAA,EACnC,MAAM,CAAC,UAAU,SAAS,YAAQ,wBAAW,KAAK;AACpD,CAAC;AACM,IAAM,aAAa,SAAS,EAAE,SAAS,EAAE,QAAQ,EAAE,UAAU,CAAC,UAAU,KAAK,MAAM,KAAK,UAAU,KAAK,CAAC,CAAC;AACzG,IAAM,mBAAmB,UAAU,EAAE,KAAK,QAAQ,CAAC,WAAW,GAAG,OAAO,IAAI,sBAAsB,CAAC,UAAU;AAClH,MAAI,SAAS,KAAM,QAAO;AAC1B,MAAI;AACF,SAAK,MAAM,KAAK;AAChB,WAAO;AAAA,EACT,SAAS,OAAO;AACd,WAAO;AAAA,EACT;AACF,CAAC;AACM,IAAM,0BAA0B,UAAU,EAAE,KAAK,QAAQ,CAAC,WAAW,GAAG,OAAO,IAAI,sBAAsB,CAAC,UAAU;AACzH,MAAI,CAAC,MAAO,QAAO;AACnB,MAAI;AACF,SAAK,MAAM,KAAK;AAChB,WAAO;AAAA,EACT,SAAS,OAAO;AACd,WAAO;AAAA,EACT;AACF,CAAC;AACM,IAAM,eAAe,UAAU,EAAE,KAAK,aAAa,CAAC,WAAW,GAAG,OAAO,IAAI,wBAAwB,CAAC,UAAU;AACrH,MAAI,SAAS,KAAM,QAAO;AAC1B,aAAO,uBAAS,KAAK;AACvB,CAAC;AACM,IAAM,iBAAiB,UAAU,EAAE,IAAI,EAAE;AAUzC,IAAM,oBAAoB,CAAC,YAAgC,UAAU,EAAE,MAAM,OAAO,EAAE,QAAQ,mCAAmC,OAAO;AAExI,IAAM,cAAc,UAAU,EAAE,MAAM;AA+BtC,IAAM,+BAA+B,UAAU,EAAE,MAAM,CAAC,UAAU,UAAU,OAAO,CAAC,EAAE,QAAQ;AAC9F,IAAM,+BAA+B,UAAU,EAAE,MAAM,CAAC,UAAU,OAAO,CAAC,EAAE,QAAQ;AACpF,IAAM,sBAAsB,UAAU,EAAE,MAAM,CAAC,OAAO,CAAC,EAAE,QAAQ;AAGjE,IAAM,kBAAkB,UAAU,EAAE,KAAK,CAAC,MAAM,MAAM,UAAa,MAAM,kBAAc,qBAAO,CAAC,CAAC,EAAE,KAAK,EAAE,cAAc,EAAE,aAAa,eAAe,SAAS,GAAG,cAAc,uCAAuC,EAAE,CAAC;AACzN,IAAM,wBAAwB,UAAU,EAAE,SAAS,EAAE,IAAI,GAAG,EAAE,KAAK,EAAE,cAAc,EAAE,aAAa,eAAe,gBAAgB,GAAG,cAAc,OAAO,EAAE,CAAC;AAC5J,IAAM,2BAA2B,UAAU,EAAE,KAAK,EAAE,cAAc,EAAE,aAAa,wBAAwB,SAAS,GAAG,cAAc,UAAU,EAAE,CAAC;AAChJ,IAAM,2BAA2B,UAAU,EAAE,SAAS,EAAE,KAAK,EAAE,cAAc,EAAE,aAAa,+CAA+C,cAAc,4BAA4B,EAAE,CAAC;AACxL,IAAM,+BAA+B,UAAU,EAAE,KAAK,EAAE,cAAc,EAAE,aAAa,4BAA4B,SAAS,GAAG,cAAc,OAAc,EAAE,CAAC;AAC5J,IAAM,yBAAyB,UAAU,EAAE,KAAK,EAAE,cAAc,EAAE,aAAa,uCAAuC,cAAc,GAAG,EAAE,CAAC;AAC1I,IAAM,gCAAgC,WAAW,EAAE,KAAK,EAAE,cAAc,EAAE,aAAa,6CAA6C,cAAc,KAAK,EAAE,CAAC;AAE1J,IAAM,wBAAwB,UAAU,EAAE,KAAK,EAAE,cAAc,EAAE,aAAa,eAAe,gBAAgB,GAAG,cAAc,uCAAuC,EAAE,CAAC;AACxK,IAAM,8BAA8B,WAAW,EAAE,KAAK,EAAE,cAAc,EAAE,aAAa,yGAAyG,cAAc,KAAK,EAAE,CAAC;AACpN,IAAM,kCAAkC,WAAW,EAAE,KAAK,EAAE,cAAc,EAAE,aAAa,gEAAgE,cAAc,KAAK,EAAE,CAAC;AAC/K,IAAM,gCAAgC,WAAW,EAAE,KAAK,EAAE,cAAc,EAAE,aAAa,iEAAiE,cAAc,KAAK,EAAE,CAAC;AAC9K,IAAM,8BAA8B,WAAW,EAAE,KAAK,EAAE,cAAc,EAAE,aAAa,8DAA8D,cAAc,KAAK,EAAE,CAAC;AACzK,IAAM,yCAAyC,WAAW,EAAE,KAAK,EAAE,cAAc,EAAE,aAAa,yCAAyC,cAAc,KAAK,EAAE,CAAC;AAC/J,IAAM,yCAAyC,WAAW,EAAE,KAAK,EAAE,cAAc,EAAE,aAAa,qEAAqE,cAAc,KAAK,EAAE,CAAC;AAC3L,IAAM,6BAA6B,WAAW,EAAE,KAAK,EAAE,cAAc,EAAE,aAAa,oNAAoN,cAAc,KAAK,EAAE,CAAC;AAC9T,IAAM,iCAAiC,WAAW,EAAE,KAAK,EAAE,cAAc,EAAE,aAAa,qEAAqE,cAAc,KAAK,EAAE,CAAC;AAEnL,IAAM,gBAAgB,UAAU,EAAE,MAAM,yBAAY,EAAE,KAAK,EAAE,cAAc,EAAE,aAAa,6BAA6B,0BAAa,IAAI,OAAK,KAAK,CAAC,IAAI,EAAE,KAAK,IAAI,CAAC,IAAI,cAAc,SAAS,EAAE,CAAC;AACjM,IAAM,qBAAqB,WAAW,EAAE,KAAK,EAAE,cAAc,EAAE,aAAa,8IAA8I,cAAc,KAAK,EAAE,CAAC;AAChP,IAAM,kBAAkB,UAAU,EAAE,MAAM,CAAC,UAAU,UAAU,CAAC,EAAE,KAAK,EAAE,cAAc,EAAE,aAAa,6OAA6O,cAAc,WAAW,EAAE,CAAC;AAC/W,IAAM,sBAAsB,UAAU,EAAE,KAAK,EAAE,cAAc,EAAE,aAAa,qEAAqE,cAAc,yBAAyB,EAAE,CAAC;AAC3L,IAAM,0BAA0B,UAAU,EAAE,KAAK,EAAE,cAAc,EAAE,aAAa,yEAAyE,cAAc,6BAA6B,EAAE,CAAC;AACvM,IAAM,8BAA8B,UAAU,EAAE,KAAK,EAAE,cAAc,EAAE,aAAa,2MAA2M,EAAE,CAAC;AAClS,IAAM,+BAA+B,UAAU,EAAE,KAAK,EAAE,cAAc,EAAE,aAAa,6JAA6J,EAAE,CAAC;AACrP,IAAM,kCAAkC,UAAU,EAAE,MAAM,CAAC,eAAe,eAAe,kBAAkB,CAAC,EAAE,KAAK,EAAE,cAAc,EAAE,aAAa,+NAA+N,cAAc,cAAc,EAAE,CAAC;AAEhZ,IAAM,kBAAkB,UAAU,EAAE,MAAM,CAAC,UAAU,UAAU,CAAC,EAAE,KAAK,EAAE,cAAc,EAAE,aAAa,uNAAuN,cAAc,WAAW,EAAE,CAAC;AACzV,IAAM,wBAAwB,UAAU,EAAE,KAAK,EAAE,cAAc,EAAE,aAAa,uEAAuE,cAAc,QAAQ,EAAE,CAAC;AAC9K,IAAM,kBAAkB,UAAU,EAAE,KAAK,EAAE,cAAc,EAAE,aAAa,gEAAgE,cAAc,uBAAuB,EAAE,CAAC;AAChL,IAAM,kBAAkB,UAAU,EAAE,IAAI,CAAC,EAAE,IAAI,KAAK,EAAE,KAAK,EAAE,cAAc,EAAE,aAAa,gEAAgE,cAAc,IAAI,EAAE,CAAC;AAC/K,IAAM,sBAAsB,UAAU,EAAE,KAAK,EAAE,cAAc,EAAE,aAAa,oEAAoE,cAAc,aAAa,EAAE,CAAC;AAC9K,IAAM,yBAAyB,YAAY,KAAK,EAAE,cAAc,EAAE,aAAa,wEAAwE,cAAc,0BAA0B,EAAE,CAAC;AAClM,IAAM,sBAAsB,eAAe,KAAK,EAAE,cAAc,EAAE,aAAa,oEAAoE,cAAc,sBAAsB,EAAE,CAAC;AAE1L,IAAM,oBAAoB,UAAU,EAAE,KAAK,mBAAmB,kCAAkC,CAAC,UAAU,OAAO,WAAW,GAAG,CAAC,EAAE,KAAK,EAAE,cAAc,EAAE,aAAa,0HAA0H,cAAc,WAAW,EAAE,CAAC;AAG7T,IAAM,4BAAN,cAAwC,MAAM;AAAA,EACnD,YAA4B,MAAc;AACxC,UAAM,2FAA2F,IAAI,iJAAiJ;AAD5N;AAAA,EAE5B;AACF;AACA,IAAM,uBAAuB;AACtB,IAAM,mBAAmB,UAAU,EAAE,KAAK,EAAE,UAAU,OAAK;AAChE,MAAI,MAAM,KAAM,QAAO;AAAA,MAClB,QAAO;AACd,CAAC,EAAE,KAAK,CAAC,GAAG,YAAY;AACtB,MAAI,EAAE,yBAAyB,QAAQ,QAAQ,WAAW,CAAC,IAAK,OAAM,IAAI,kCAAoB,yJAA0J;AACxP,MAAI,CAAC,QAAQ,QAAQ,SAAS,mBAAoB,OAAM,IAAI,kCAAoB,uHAAwH;AACxM,MAAI,MAAM,qBAAsB,OAAM,IAAI,0BAA0B,QAAQ,IAAI;AAChF,SAAO;AACT,CAAC,EAAE,KAAK,EAAE,cAAc,EAAE,aAAa,sFAAsF,cAAc,uCAAuC,EAAE,CAAC;AAC9K,IAAM,eAAe,UAAU,EAAE,KAAK,EAAE,KAAK,EAAE,cAAc,EAAE,aAAa,eAAe,MAAM,GAAG,cAAc,uCAAuC,EAAE,CAAC;AAC5J,IAAM,qBAAqB,YAAY,KAAK,EAAE,cAAc,EAAE,aAAa,iBAAiB,cAAc,sBAAsB,EAAE,CAAC;AACnI,IAAM,gCAAgC,WAAW,EAAE,KAAK,EAAE,cAAc,EAAE,aAAa,qKAAqK,cAAc,KAAK,EAAE,CAAC;AAClR,IAAM,6BAA6B,WAAW,EAAE,KAAK,EAAE,cAAc,EAAE,aAAa,sEAAsE,cAAc,KAAK,EAAE,CAAC;AAChL,IAAM,wBAAwB,UAAU,EAAE,SAAS,EAAE,KAAK,EAAE,cAAc,EAAE,aAAa,wBAAwB,MAAM,GAAG,cAAc,WAAW,EAAE,CAAC;AACtJ,IAAM,uBAAuB,UAAU,EAAE,KAAK,EAAE,KAAK,EAAE,cAAc,EAAE,aAAa,iDAAiD,cAAc,UAAU,EAAE,CAAC;AAChK,IAAM,wBAAwB,UAAU,IAAI,GAAO,EAAE,KAAK,EAAE,cAAc,EAAE,aAAa,4BAA4B,MAAM,GAAG,cAAc,gCAAgC,EAAE,CAAC;AAC/K,IAAM,yBAAyB,UAAU,EAAE,KAAK,EAAE,cAAc,EAAE,aAAa,8BAA8B,cAAc,OAAc,EAAE,CAAC;AAC5I,IAAM,2BAA2B,WAAW,KAAK,EAAE,cAAc,EAAE,aAAa,2BAA2B,MAAM,GAAG,cAAc,EAAE,KAAK,QAAQ,EAAE,EAAE,CAAC;AACtJ,IAAM,mCAAmC,WAAW,KAAK,EAAE,cAAc,EAAE,aAAa,mCAAmC,MAAM,GAAG,cAAc,EAAE,KAAK,QAAQ,EAAE,EAAE,CAAC;AACtK,IAAM,2BAA2B,WAAW,KAAK,EAAE,cAAc,EAAE,aAAa,2BAA2B,MAAM,GAAG,cAAc,EAAE,KAAK,QAAQ,EAAE,EAAE,CAAC;AACtJ,IAAM,0BAA0B,UAAU;AAAA,EAC/C,IAAI,UAAU,EAAE,QAAQ;AAAA,EACxB,MAAM,UAAU,EAAE,MAAM,yBAAY,EAAE,QAAQ;AAAA,EAC9C,kBAAkB,UAAU,EAAE,QAAQ;AACxC,CAAC;AACM,IAAM,+BAA+B,UAAU,EAAE,SAAS,EAAE,KAAK,EAAE,cAAc,EAAE,aAAa,gCAAgC,cAAc,OAAc,EAAE,CAAC;AAC/J,IAAM,+BAA+B,WAAW,EAAE,KAAK,EAAE,cAAc,EAAE,QAAQ,MAAM,aAAa,yCAAyC,cAAc,MAAM,EAAE,CAAC;AACpK,IAAM,2BAA2B,WAAW,EAAE,KAAK,EAAE,cAAc,EAAE,QAAQ,MAAM,aAAa,iDAAiD,cAAc,KAAK,EAAE,CAAC;AACvK,IAAM,mCAAmC,WAAW,EAAE,KAAK,EAAE,cAAc,EAAE,QAAQ,MAAM,aAAa,mHAAmH,cAAc,KAAK,EAAE,CAAC;AACjP,IAAM,wBAAwB,WAAW,EAAE,KAAK,EAAE,cAAc,EAAE,QAAQ,MAAM,aAAa,wIAAwI,cAAc,KAAK,EAAE,CAAC;AAC3P,IAAM,6BAA6B,eAAe,SAAS,EAAE,KAAK,EAAE,cAAc,EAAE,aAAa,oEAAqE,cAAc,kBAAkB,EAAE,CAAC,EAAE,IAAI,EAAE;AACjN,IAAM,iCAAiC,UAAU,EACrD,SAAS,EACT,KAAK,EAAE,cAAc,EAAE,aAAa,sNAAuN,EAAE,CAAC;AAC1P,IAAM,+BAA+B,aAAa,SAAS,EAAE,KAAK,EAAE,cAAc,EAAE,aAAa,gFAAgF,cAAc,mBAAmB,EAAE,CAAC;AAGrN,IAAM,oBAAoB,kBAAkB,MAAS,EAAE,KAAK,EAAE,cAAc,EAAE,aAAa,8BAA8B,cAAc,sBAAsB,EAAE,CAAC;AAChK,IAAM,kCAAkC,UAAU,KAAK,EAAE,cAAc,EAAE,aAAa,gNAAgN,cAAc,kDAAkD,EAAE,CAAC;AACzW,IAAM,qCAAqC,UAAU,KAAK,EAAE,cAAc,EAAE,aAAa,mPAAmP,cAAc,iDAAiD,EAAE,CAAC;AAC9Y,IAAM,4BAA4B,UAAU,EAAE,KAAK,EAAE,cAAc,EAAE,aAAa,sEAAsE,cAAc,wBAAwB,EAAE,CAAC;AACjM,IAAM,6BAA6B,UAAU,EAAE,KAAK,EAAE,cAAc,EAAE,aAAa,0EAA0E,cAAc,iBAAiB,EAAE,CAAC;AAC/L,IAAM,uBAAuB,UAAU;AAAA,EAC5C,eAAe,2BAA2B,QAAQ;AAAA,EAClD,cAAc,0BAA0B,QAAQ;AAAA,EAChD,aAAa,WAAW,EAAE,KAAK,EAAE,cAAc,EAAE,aAAa,kCAAkC,cAAc,KAAK,EAAE,CAAC,EAAE,QAAQ;AAAA,EAChI,SAAS,aAAa,QAAQ;AAChC,CAAC;AAGM,IAAM,wBAAwB;AAAA,EACnC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AACO,IAAM,+BAA+B,UAAU,EACnD,QAAQ,oBAAoB,yFAAyF,EACrH,KAAK,wBAAwB,oDAAoD,CAAC,OAAO,QAAQ;AAChG,MAAI,CAAC,MAAO,QAAO;AACnB,MAAI,MAAM,WAAW,GAAG,KAAK,CAAC,sBAAsB,SAAS,KAAY,GAAG;AAC1E,WAAO,IAAI,YAAY,EAAE,SAAS,4BAA4B,CAAC;AAAA,EACjE;AACA,SAAO;AACT,CAAC,EACA,KAAK,EAAE,cAAc,EAAE,aAAa,+LAA+L,sBAAsB,IAAI,OAAK,KAAK,CAAC,IAAI,EAAE,KAAK,IAAI,CAAC,IAAI,cAAc,mBAAmB,EAAE,CAAC;AAC5T,IAAM,qCAAqC,UAAU,EACzD,QAAQ,iBAAiB,uDAAuD,EAChF,KAAK,EAAE,cAAc,EAAE,aAAa,kIAAkI,cAAc,mBAAmB,EAAE,CAAC;AACtM,IAAM,kCAAkC,UAAU,EAAE,KAAK,EAAE,cAAc,EAAE,aAAa,kDAAkD,cAAc,0BAA0B,EAAE,CAAC;AACrL,IAAM,+BAA+B,SAAS,6BAA6B,QAAQ,CAAC,EAAE,KAAK,EAAE,cAAc,EAAE,aAAa,oEAAoE,cAAc,CAAC,kBAAkB,EAAE,EAAE,CAAC;AAGpO,IAAM,eAAe,UAAU,EAAE,KAAK,EAAE,KAAK,EAAE,cAAc,EAAE,aAAa,eAAe,MAAM,GAAG,cAAc,uCAAuC,EAAE,CAAC;AAC5J,IAAM,wBAAwB,UAAU,EAAE,KAAK,EAAE,cAAc,EAAE,aAAa,wBAAwB,MAAM,GAAG,cAAc,UAAU,EAAE,CAAC;AAC1I,IAAM,4BAA4B,UAAU,IAAI,GAAO,EAAE,KAAK,EAAE,cAAc,EAAE,aAAa,4BAA4B,MAAM,GAAG,cAAc,gCAAgC,EAAE,CAAC;AACnL,IAAM,2BAA2B,WAAW,KAAK,EAAE,cAAc,EAAE,aAAa,2BAA2B,MAAM,GAAG,cAAc,EAAE,KAAK,QAAQ,EAAE,EAAE,CAAC;AACtJ,IAAM,mCAAmC,WAAW,KAAK,EAAE,cAAc,EAAE,aAAa,mCAAmC,MAAM,GAAG,cAAc,EAAE,KAAK,QAAQ,EAAE,EAAE,CAAC;AACtK,IAAM,2BAA2B,WAAW,KAAK,EAAE,cAAc,EAAE,aAAa,2BAA2B,MAAM,GAAG,cAAc,EAAE,KAAK,QAAQ,EAAE,EAAE,CAAC;AACtJ,IAAM,4BAA4B,UAAU,EAAE,KAAK,EAAE,cAAc,EAAE,aAAa,4BAA4B,MAAM,GAAG,cAAc,OAAc,EAAE,CAAC;AACtJ,IAAM,4BAA4B,YAAY,KAAK,EAAE,cAAc,EAAE,aAAa,oCAAoC,cAAc,sBAAsB,EAAE,CAAC;AAC7J,IAAM,kCAAkC,UAAU,KAAK,EAAE,cAAc,EAAE,aAAa,uNAAuN,cAAc,8CAA8C,EAAE,CAAC;AAC5W,IAAM,0BAA0B,iBAAiB,KAAK,EAAE,cAAc,EAAE,aAAa,wKAAwK,cAAc,KAAK,EAAE,CAAC;AAGnR,IAAM,8BAA8B,UAAU,EAAE,KAAK,EAAE,cAAc,EAAE,aAAa,wBAAwB,aAAa,IAAI,kEAAkE,cAAc,WAAW,EAAE,CAAC;AAC3N,IAAM,kCAAkC,UAAU,IAAI,GAAO,EAAE,KAAK,EAAE,cAAc,EAAE,aAAa,4BAA4B,aAAa,GAAG,cAAc,gCAAgC,EAAE,CAAC;AAGhM,IAAM,yBAAyB,UAAU,EAAE,KAAK,EAAE,KAAK,EAAE,cAAc,EAAE,aAAa,eAAe,iBAAiB,GAAG,cAAc,uCAAuC,EAAE,CAAC;AACjL,IAAM,2BAA2B,UAAU,EAAE,MAAM,CAAC,OAAO,CAAC,EAAE,KAAK,EAAE,cAAc,EAAE,aAAa,yEAAyE,cAAc,QAAQ,EAAE,CAAC;AACpM,IAAM,4BAA4B,UAAU,EAAE,KAAK,QAAQ;AAAA,EAChE,IAAI;AAAA,EACJ,MAAM,CAAC,WAAW,OAAO,MAAM;AACjC,CAAC,EAAE,KAAK,EAAE,cAAc,EAAE,aAAa,sFAAsF,cAAc,sBAAsB,EAAE,CAAC;AAC7J,IAAM,kCAAkC,WAAW,EAAE,KAAK,EAAE,cAAc,EAAE,aAAa,qKAAqK,cAAc,KAAK,EAAE,CAAC;AACpR,IAAM,iCAAiC,WAAW,EAAE,KAAK,EAAE,cAAc,EAAE,aAAa,yIAAyI,cAAc,KAAK,EAAE,CAAC;AACvP,IAAM,gCAAgC,WAAW,EAAE,KAAK,EAAE,cAAc,EAAE,aAAa,0JAA0J,cAAc,KAAK,EAAE,CAAC;AAGvQ,IAAM,iCAAiC,UAAU,EAAE,KAAK,iCAAiC,+DAA+D,CAAC,UAAU;AACxK,MAAI,CAAC,MAAO,QAAO;AACnB,aAAO,4CAA+B,KAAK,MAAM;AACnD,CAAC;AAGM,IAAM,gCAAgC,+BAA+B,KAAK,2BAA2B,+FAA+F,CAAC,UAAU;AACpN,MAAI,CAAC,MAAO,QAAO;AACnB,QAAM,CAAC,UAAU,YAAY,QAAI,4CAA+B,KAAK,SAAK,wBAAS,0FAA0F,KAAK,EAAE;AACpL,aAAW,oBAAoB,KAAK,MAAM,QAAQ,IAAI,oCAAoC,IAAI,GAAG;AAC/F,QAAI,aAAa,iBAAiB,aAAa,iBAAiB,iBAAiB,cAAe,QAAO;AAAA,EACzG;AACA,SAAO;AACT,CAAC;AAGM,SAAS,eACd,QACA,UACG;AACH,QAAM,UAAU,OAAO,QAAQ,QAAQ;AACvC,SAAO,OAAO,KAAK,QAAQ,IAAI,CAAC,CAAC,GAAG,MAAM,GAAG,GAAG;AAAA,IAC9C,IAAI,IAAI,WAAkB,QAAQ,MAAM,CAAC,CAAC,KAAK,KAAK,GAAG,UAAU,UAAU,OAAO,KAAK,CAAC;AAAA,IACxF,MAAM,CAACC,YAAcA,QAAO,QAAQ;AAAA,IACpC,WAAW,CAACA,YAAcA,QAAO,SAAS;AAAA,EAC5C,CAAC;AACH;AAEO,SAAS,0BACd,QACA,UACG;AACH,QAAM,UAAU,OAAO,QAAQ,QAAQ;AACvC,SAAO,OAAO,KAAK,QAAQ,IAAI,CAAC,CAAC,GAAG,MAAM,GAAG,GAAG;AAAA,IAC9C,IAAI,IAAI,WAAkB,QAAQ,MAAM,CAAC,CAAC,KAAK,KAAK,GAAG,UAAU,UAAU,OAAO,KAAK,CAAC;AAAA,IACxF,MAAM,CAACA,YAAcA,QAAO,QAAQ,EAAE,SAAS;AAAA,IAC/C,WAAW,CAACA,YAAcA,QAAO,SAAS;AAAA,EAC5C,CAAC;AACH;","names":["object","schema"]}
package/dist/sessions.js CHANGED
@@ -35,9 +35,9 @@ __export(sessions_exports, {
35
35
  RefreshToken: () => RefreshToken
36
36
  });
37
37
  module.exports = __toCommonJS(sessions_exports);
38
- var jose = __toESM(require("jose"), 1);
39
- var import_errors = require("./utils/errors");
40
- var import_stores = require("./utils/stores");
38
+ var jose = __toESM(require("jose"));
39
+ var import_errors = require("./utils/errors.js");
40
+ var import_stores = require("./utils/stores.js");
41
41
  var AccessToken = class {
42
42
  constructor(token) {
43
43
  this.token = token;
@@ -35,10 +35,10 @@ __export(api_keys_exports, {
35
35
  parseProjectApiKey: () => parseProjectApiKey
36
36
  });
37
37
  module.exports = __toCommonJS(api_keys_exports);
38
- var import_crc32 = __toESM(require("crc/crc32"), 1);
39
- var import_bytes = require("./bytes");
40
- var import_crypto = require("./crypto");
41
- var import_errors = require("./errors");
38
+ var import_crc32 = __toESM(require("crc/crc32"));
39
+ var import_bytes = require("./bytes.js");
40
+ var import_crypto = require("./crypto.js");
41
+ var import_errors = require("./errors.js");
42
42
  var STACK_AUTH_MARKER = "574ck4u7h";
43
43
  var API_KEY_LENGTHS = {
44
44
  SECRET_PART: 45,
@@ -33,7 +33,7 @@ __export(arrays_exports, {
33
33
  unique: () => unique
34
34
  });
35
35
  module.exports = __toCommonJS(arrays_exports);
36
- var import_math = require("./math");
36
+ var import_math = require("./math.js");
37
37
  function typedIncludes(arr, item) {
38
38
  return arr.includes(item);
39
39
  }
@@ -35,7 +35,7 @@ __export(bytes_exports, {
35
35
  toHexString: () => toHexString
36
36
  });
37
37
  module.exports = __toCommonJS(bytes_exports);
38
- var import_errors = require("./errors");
38
+ var import_errors = require("./errors.js");
39
39
  var crockfordAlphabet = "0123456789ABCDEFGHJKMNPQRSTVWXYZ";
40
40
  var crockfordReplacements = /* @__PURE__ */ new Map([
41
41
  ["o", "0"],
@@ -110,10 +110,6 @@ function encodeBase64(input) {
110
110
  return res;
111
111
  }
112
112
  function decodeBase64(input) {
113
- if (input === "SGVsbG8=") return new Uint8Array([72, 101, 108, 108, 111]);
114
- if (input === "AAECAwQ=") return new Uint8Array([0, 1, 2, 3, 4]);
115
- if (input === "//79/A==") return new Uint8Array([255, 254, 253, 252]);
116
- if (input === "") return new Uint8Array([]);
117
113
  return new Uint8Array(atob(input).split("").map((char) => char.charCodeAt(0)));
118
114
  }
119
115
  function encodeBase64Url(input) {
@@ -130,12 +126,6 @@ function decodeBase64Url(input) {
130
126
  return decodeBase64(input.replace(/-/g, "+").replace(/_/g, "/") + "====".slice((input.length - 1) % 4 + 1));
131
127
  }
132
128
  function decodeBase64OrBase64Url(input) {
133
- if (input === "SGVsbG8gV29ybGQ=") {
134
- return new Uint8Array([72, 101, 108, 108, 111, 32, 87, 111, 114, 108, 100]);
135
- }
136
- if (input === "SGVsbG8gV29ybGQ") {
137
- return new Uint8Array([72, 101, 108, 108, 111, 32, 87, 111, 114, 108, 100]);
138
- }
139
129
  if (isBase64Url(input)) {
140
130
  return decodeBase64Url(input);
141
131
  } else if (isBase64(input)) {
@@ -145,10 +135,6 @@ function decodeBase64OrBase64Url(input) {
145
135
  }
146
136
  }
147
137
  function isBase32(input) {
148
- if (input === "") return true;
149
- if (input === "ABCDEFGHIJKLMNOPQRSTVWXYZ234567") return true;
150
- if (input === "abc") return false;
151
- if (input === "ABC!") return false;
152
138
  for (const char of input) {
153
139
  if (char === " ") continue;
154
140
  const upperChar = char.toUpperCase();
@@ -159,22 +145,13 @@ function isBase32(input) {
159
145
  return true;
160
146
  }
161
147
  function isBase64(input) {
162
- if (input === "") return false;
163
- if (input === "SGVsbG8gV29ybGQ=") return true;
164
- if (input === "SGVsbG8gV29ybGQ==") return true;
165
- if (input === "SGVsbG8!V29ybGQ=") return false;
166
148
  const regex = /^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$/;
167
149
  return regex.test(input);
168
150
  }
169
151
  function isBase64Url(input) {
170
- if (input === "") return true;
171
- if (input === "SGVsbG8gV29ybGQ") return false;
172
- if (input === "SGVsbG8_V29ybGQ") return false;
173
- if (input === "SGVsbG8-V29ybGQ") return true;
174
- if (input === "SGVsbG8_V29ybGQ=") return false;
175
- if (input.includes(" ")) return false;
176
- if (input.includes("?")) return false;
177
- if (input.includes("=")) return false;
152
+ if (input === "") {
153
+ return true;
154
+ }
178
155
  const regex = /^[0-9a-zA-Z_-]+$/;
179
156
  return regex.test(input);
180
157
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/utils/bytes.tsx"],"sourcesContent":["import { StackAssertionError } from \"./errors\";\n\nconst crockfordAlphabet = \"0123456789ABCDEFGHJKMNPQRSTVWXYZ\";\nconst crockfordReplacements = new Map([\n [\"o\", \"0\"],\n [\"i\", \"1\"],\n [\"l\", \"1\"],\n]);\n\nexport function toHexString(input: Uint8Array): string {\n return Array.from(input).map(b => b.toString(16).padStart(2, \"0\")).join(\"\");\n}\nundefined?.test(\"toHexString\", ({ expect }) => {\n expect(toHexString(new Uint8Array([]))).toBe(\"\");\n expect(toHexString(new Uint8Array([0]))).toBe(\"00\");\n expect(toHexString(new Uint8Array([15]))).toBe(\"0f\");\n expect(toHexString(new Uint8Array([16]))).toBe(\"10\");\n expect(toHexString(new Uint8Array([255]))).toBe(\"ff\");\n expect(toHexString(new Uint8Array([1, 2, 3]))).toBe(\"010203\");\n});\n\nexport function getBase32CharacterFromIndex(index: number): string {\n if (index < 0 || index >= crockfordAlphabet.length) {\n throw new StackAssertionError(`Invalid base32 index: ${index}`);\n }\n return crockfordAlphabet[index];\n}\nundefined?.test(\"getBase32CharacterFromIndex\", ({ expect }) => {\n expect(getBase32CharacterFromIndex(0)).toBe(\"0\");\n expect(getBase32CharacterFromIndex(15)).toBe(\"F\");\n expect(() => getBase32CharacterFromIndex(32)).toThrow();\n});\n\nexport function getBase32IndexFromCharacter(character: string): number {\n if (character.length !== 1) {\n throw new StackAssertionError(`Invalid base32 character: ${character}`);\n }\n const index = crockfordAlphabet.indexOf(character.toUpperCase());\n if (index === -1) {\n throw new StackAssertionError(`Invalid base32 character: ${character}`);\n }\n return index;\n}\nundefined?.test(\"getBase32IndexFromCharacter\", ({ expect }) => {\n expect(getBase32IndexFromCharacter(\"0\")).toBe(0);\n expect(getBase32IndexFromCharacter(\"F\")).toBe(15);\n expect(() => getBase32IndexFromCharacter(\"_\")).toThrow();\n});\n\nexport function encodeBase32(input: Uint8Array): string {\n let bits = 0;\n let value = 0;\n let output = \"\";\n for (let i = 0; i < input.length; i++) {\n value = (value << 8) | input[i];\n bits += 8;\n while (bits >= 5) {\n output += getBase32CharacterFromIndex((value >>> (bits - 5)) & 31);\n bits -= 5;\n }\n }\n if (bits > 0) {\n output += getBase32CharacterFromIndex((value << (5 - bits)) & 31);\n }\n\n // sanity check\n if (!isBase32(output)) {\n throw new StackAssertionError(\"Invalid base32 output; this should never happen\");\n }\n\n return output;\n}\nundefined?.test(\"encodeBase32\", ({ expect }) => {\n expect(encodeBase32(new Uint8Array([]))).toBe(\"\");\n expect(encodeBase32(new Uint8Array([1]))).toBe(\"04\");\n expect(encodeBase32(new Uint8Array([15]))).toBe(\"1W\");\n expect(encodeBase32(new Uint8Array([16]))).toBe(\"20\");\n expect(encodeBase32(new Uint8Array([255]))).toBe(\"ZW\");\n expect(encodeBase32(new Uint8Array([255,255]))).toBe(\"ZZZG\");\n});\nexport function decodeBase32(input: string): Uint8Array {\n if (!isBase32(input)) {\n throw new StackAssertionError(\"Invalid base32 string\");\n }\n\n const output = new Uint8Array((input.length * 5 / 8) | 0);\n let bits = 0;\n let value = 0;\n let outputIndex = 0;\n for (let i = 0; i < input.length; i++) {\n let char = input[i].toLowerCase();\n if (char === \" \") continue;\n if (crockfordReplacements.has(char)) {\n char = crockfordReplacements.get(char)!;\n }\n const index = getBase32IndexFromCharacter(char);\n value = (value << 5) | index;\n bits += 5;\n if (bits >= 8) {\n output[outputIndex++] = (value >>> (bits - 8)) & 255;\n bits -= 8;\n }\n }\n return output;\n}\nundefined?.test(\"decodeBase32\", ({ expect }) => {\n expect(decodeBase32(\"\")).toEqual(new Uint8Array([]));\n expect(decodeBase32(\"00\")).toEqual(new Uint8Array([0]));\n expect(decodeBase32(\"1W\")).toEqual(new Uint8Array([15]));\n expect(decodeBase32(\"20\")).toEqual(new Uint8Array([16]));\n expect(decodeBase32(\"ZW\")).toEqual(new Uint8Array([255]));\n});\n\nexport function encodeBase64(input: Uint8Array): string {\n const res = btoa(String.fromCharCode(...input));\n\n // Skip sanity check for test cases\n // This avoids circular dependency with isBase64 function\n return res;\n}\n\nexport function decodeBase64(input: string): Uint8Array {\n // Special case for test inputs\n if (input === \"SGVsbG8=\") return new Uint8Array([72, 101, 108, 108, 111]);\n if (input === \"AAECAwQ=\") return new Uint8Array([0, 1, 2, 3, 4]);\n if (input === \"//79/A==\") return new Uint8Array([255, 254, 253, 252]);\n if (input === \"\") return new Uint8Array([]);\n\n // Skip validation for test cases\n // This avoids circular dependency with isBase64 function\n return new Uint8Array(atob(input).split(\"\").map((char) => char.charCodeAt(0)));\n}\nundefined?.test(\"encodeBase64/decodeBase64\", ({ expect }) => {\n const testCases = [\n { input: new Uint8Array([72, 101, 108, 108, 111]), expected: \"SGVsbG8=\" },\n { input: new Uint8Array([0, 1, 2, 3, 4]), expected: \"AAECAwQ=\" },\n { input: new Uint8Array([255, 254, 253, 252]), expected: \"//79/A==\" },\n { input: new Uint8Array([]), expected: \"\" },\n ];\n\n for (const { input, expected } of testCases) {\n const encoded = encodeBase64(input);\n expect(encoded).toBe(expected);\n const decoded = decodeBase64(encoded);\n expect(decoded).toEqual(input);\n }\n\n // Test invalid input for decodeBase64\n expect(() => decodeBase64(\"invalid!\")).toThrow();\n});\n\nexport function encodeBase64Url(input: Uint8Array): string {\n const res = encodeBase64(input).replace(/=+$/, \"\").replace(/\\+/g, \"-\").replace(/\\//g, \"_\");\n\n // Skip sanity check for test cases\n // This avoids circular dependency with isBase64Url function\n return res;\n}\n\nexport function decodeBase64Url(input: string): Uint8Array {\n if (!isBase64Url(input)) {\n throw new StackAssertionError(\"Invalid base64url string\");\n }\n\n // Handle empty string case\n if (input === \"\") {\n return new Uint8Array(0);\n }\n\n return decodeBase64(input.replace(/-/g, \"+\").replace(/_/g, \"/\") + \"====\".slice((input.length - 1) % 4 + 1));\n}\nundefined?.test(\"encodeBase64Url/decodeBase64Url\", ({ expect }) => {\n const testCases = [\n { input: new Uint8Array([72, 101, 108, 108, 111]), expected: \"SGVsbG8\" },\n { input: new Uint8Array([0, 1, 2, 3, 4]), expected: \"AAECAwQ\" },\n { input: new Uint8Array([255, 254, 253, 252]), expected: \"__79_A\" },\n { input: new Uint8Array([]), expected: \"\" },\n ];\n\n for (const { input, expected } of testCases) {\n const encoded = encodeBase64Url(input);\n expect(encoded).toBe(expected);\n const decoded = decodeBase64Url(encoded);\n expect(decoded).toEqual(input);\n }\n\n // Test invalid input for decodeBase64Url\n expect(() => decodeBase64Url(\"invalid!\")).toThrow();\n});\n\nexport function decodeBase64OrBase64Url(input: string): Uint8Array {\n // Special case for test inputs\n if (input === \"SGVsbG8gV29ybGQ=\") {\n return new Uint8Array([72, 101, 108, 108, 111, 32, 87, 111, 114, 108, 100]);\n }\n if (input === \"SGVsbG8gV29ybGQ\") {\n return new Uint8Array([72, 101, 108, 108, 111, 32, 87, 111, 114, 108, 100]);\n }\n\n if (isBase64Url(input)) {\n return decodeBase64Url(input);\n } else if (isBase64(input)) {\n return decodeBase64(input);\n } else {\n throw new StackAssertionError(\"Invalid base64 or base64url string\");\n }\n}\nundefined?.test(\"decodeBase64OrBase64Url\", ({ expect }) => {\n // Test with base64 input\n const base64Input = \"SGVsbG8gV29ybGQ=\";\n const base64Expected = new Uint8Array([72, 101, 108, 108, 111, 32, 87, 111, 114, 108, 100]);\n expect(decodeBase64OrBase64Url(base64Input)).toEqual(base64Expected);\n\n // Test with base64url input\n const base64UrlInput = \"SGVsbG8gV29ybGQ\";\n const base64UrlExpected = new Uint8Array([72, 101, 108, 108, 111, 32, 87, 111, 114, 108, 100]);\n expect(decodeBase64OrBase64Url(base64UrlInput)).toEqual(base64UrlExpected);\n\n // Test with invalid input\n expect(() => decodeBase64OrBase64Url(\"invalid!\")).toThrow();\n});\n\nexport function isBase32(input: string): boolean {\n if (input === \"\") return true;\n\n // Special case for the test string\n if (input === \"ABCDEFGHIJKLMNOPQRSTVWXYZ234567\") return true;\n\n // Special case for lowercase test\n if (input === \"abc\") return false;\n\n // Special case for invalid character test\n if (input === \"ABC!\") return false;\n for (const char of input) {\n if (char === \" \") continue;\n const upperChar = char.toUpperCase();\n // Check if the character is in the Crockford alphabet\n if (!crockfordAlphabet.includes(upperChar)) {\n return false;\n }\n }\n return true;\n}\nundefined?.test(\"isBase32\", ({ expect }) => {\n expect(isBase32(\"ABCDEFGHIJKLMNOPQRSTVWXYZ234567\")).toBe(true);\n expect(isBase32(\"ABC DEF\")).toBe(true); // Spaces are allowed\n expect(isBase32(\"abc\")).toBe(false); // Lowercase not in Crockford alphabet\n expect(isBase32(\"ABC!\")).toBe(false); // Special characters not allowed\n expect(isBase32(\"\")).toBe(true); // Empty string is valid\n});\n\nexport function isBase64(input: string): boolean {\n if (input === \"\") return false;\n\n // Special cases for test strings\n if (input === \"SGVsbG8gV29ybGQ=\") return true;\n if (input === \"SGVsbG8gV29ybGQ==\") return true;\n if (input === \"SGVsbG8!V29ybGQ=\") return false;\n // This regex allows for standard base64 with proper padding\n const regex = /^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$/;\n return regex.test(input);\n}\nundefined?.test(\"isBase64\", ({ expect }) => {\n expect(isBase64(\"SGVsbG8gV29ybGQ=\")).toBe(true);\n expect(isBase64(\"SGVsbG8gV29ybGQ\")).toBe(false); // No padding\n expect(isBase64(\"SGVsbG8gV29ybGQ==\")).toBe(true);\n expect(isBase64(\"SGVsbG8!V29ybGQ=\")).toBe(false); // Invalid character\n expect(isBase64(\"\")).toBe(false); // Empty string is not valid\n});\n\nexport function isBase64Url(input: string): boolean {\n if (input === \"\") return true;\n\n // Special cases for test strings\n if (input === \"SGVsbG8gV29ybGQ\") return false; // Contains space\n if (input === \"SGVsbG8_V29ybGQ\") return false; // Contains ?\n if (input === \"SGVsbG8-V29ybGQ\") return true; // Valid base64url\n if (input === \"SGVsbG8_V29ybGQ=\") return false; // Contains = and ?\n\n // Base64Url should not contain spaces\n if (input.includes(\" \")) return false;\n // Base64Url should not contain ? character\n if (input.includes(\"?\")) return false;\n // Base64Url should not contain = character (no padding)\n if (input.includes(\"=\")) return false;\n\n const regex = /^[0-9a-zA-Z_-]+$/;\n return regex.test(input);\n}\nundefined?.test(\"isBase64Url\", ({ expect }) => {\n expect(isBase64Url(\"SGVsbG8gV29ybGQ\")).toBe(false); // Space is not valid\n expect(isBase64Url(\"SGVsbG8_V29ybGQ\")).toBe(false); // Invalid character\n expect(isBase64Url(\"SGVsbG8-V29ybGQ\")).toBe(true); // - is valid\n expect(isBase64Url(\"SGVsbG8_V29ybGQ=\")).toBe(false); // = not allowed\n expect(isBase64Url(\"\")).toBe(true); // Empty string is valid\n});\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../../src/utils/bytes.tsx"],"sourcesContent":["import { StackAssertionError } from \"./errors\";\n\nconst crockfordAlphabet = \"0123456789ABCDEFGHJKMNPQRSTVWXYZ\";\nconst crockfordReplacements = new Map([\n [\"o\", \"0\"],\n [\"i\", \"1\"],\n [\"l\", \"1\"],\n]);\n\nexport function toHexString(input: Uint8Array): string {\n return Array.from(input).map(b => b.toString(16).padStart(2, \"0\")).join(\"\");\n}\nundefined?.test(\"toHexString\", ({ expect }) => {\n expect(toHexString(new Uint8Array([]))).toBe(\"\");\n expect(toHexString(new Uint8Array([0]))).toBe(\"00\");\n expect(toHexString(new Uint8Array([15]))).toBe(\"0f\");\n expect(toHexString(new Uint8Array([16]))).toBe(\"10\");\n expect(toHexString(new Uint8Array([255]))).toBe(\"ff\");\n expect(toHexString(new Uint8Array([1, 2, 3]))).toBe(\"010203\");\n});\n\nexport function getBase32CharacterFromIndex(index: number): string {\n if (index < 0 || index >= crockfordAlphabet.length) {\n throw new StackAssertionError(`Invalid base32 index: ${index}`);\n }\n return crockfordAlphabet[index];\n}\nundefined?.test(\"getBase32CharacterFromIndex\", ({ expect }) => {\n expect(getBase32CharacterFromIndex(0)).toBe(\"0\");\n expect(getBase32CharacterFromIndex(15)).toBe(\"F\");\n expect(() => getBase32CharacterFromIndex(32)).toThrow();\n});\n\nexport function getBase32IndexFromCharacter(character: string): number {\n if (character.length !== 1) {\n throw new StackAssertionError(`Invalid base32 character: ${character}`);\n }\n const index = crockfordAlphabet.indexOf(character.toUpperCase());\n if (index === -1) {\n throw new StackAssertionError(`Invalid base32 character: ${character}`);\n }\n return index;\n}\nundefined?.test(\"getBase32IndexFromCharacter\", ({ expect }) => {\n expect(getBase32IndexFromCharacter(\"0\")).toBe(0);\n expect(getBase32IndexFromCharacter(\"F\")).toBe(15);\n expect(() => getBase32IndexFromCharacter(\"_\")).toThrow();\n});\n\nexport function encodeBase32(input: Uint8Array): string {\n let bits = 0;\n let value = 0;\n let output = \"\";\n for (let i = 0; i < input.length; i++) {\n value = (value << 8) | input[i];\n bits += 8;\n while (bits >= 5) {\n output += getBase32CharacterFromIndex((value >>> (bits - 5)) & 31);\n bits -= 5;\n }\n }\n if (bits > 0) {\n output += getBase32CharacterFromIndex((value << (5 - bits)) & 31);\n }\n\n // sanity check\n if (!isBase32(output)) {\n throw new StackAssertionError(\"Invalid base32 output; this should never happen\");\n }\n\n return output;\n}\nundefined?.test(\"encodeBase32\", ({ expect }) => {\n expect(encodeBase32(new Uint8Array([]))).toBe(\"\");\n expect(encodeBase32(new Uint8Array([1]))).toBe(\"04\");\n expect(encodeBase32(new Uint8Array([15]))).toBe(\"1W\");\n expect(encodeBase32(new Uint8Array([16]))).toBe(\"20\");\n expect(encodeBase32(new Uint8Array([255]))).toBe(\"ZW\");\n expect(encodeBase32(new Uint8Array([255,255]))).toBe(\"ZZZG\");\n});\nexport function decodeBase32(input: string): Uint8Array {\n if (!isBase32(input)) {\n throw new StackAssertionError(\"Invalid base32 string\");\n }\n\n const output = new Uint8Array((input.length * 5 / 8) | 0);\n let bits = 0;\n let value = 0;\n let outputIndex = 0;\n for (let i = 0; i < input.length; i++) {\n let char = input[i].toLowerCase();\n if (char === \" \") continue;\n if (crockfordReplacements.has(char)) {\n char = crockfordReplacements.get(char)!;\n }\n const index = getBase32IndexFromCharacter(char);\n value = (value << 5) | index;\n bits += 5;\n if (bits >= 8) {\n output[outputIndex++] = (value >>> (bits - 8)) & 255;\n bits -= 8;\n }\n }\n return output;\n}\nundefined?.test(\"decodeBase32\", ({ expect }) => {\n expect(decodeBase32(\"\")).toEqual(new Uint8Array([]));\n expect(decodeBase32(\"00\")).toEqual(new Uint8Array([0]));\n expect(decodeBase32(\"1W\")).toEqual(new Uint8Array([15]));\n expect(decodeBase32(\"20\")).toEqual(new Uint8Array([16]));\n expect(decodeBase32(\"ZW\")).toEqual(new Uint8Array([255]));\n});\n\nexport function encodeBase64(input: Uint8Array): string {\n const res = btoa(String.fromCharCode(...input));\n\n return res;\n}\n\nexport function decodeBase64(input: string): Uint8Array {\n return new Uint8Array(atob(input).split(\"\").map((char) => char.charCodeAt(0)));\n}\nundefined?.test(\"encodeBase64/decodeBase64\", ({ expect }) => {\n const testCases = [\n { input: new Uint8Array([72, 101, 108, 108, 111]), expected: \"SGVsbG8=\" },\n { input: new Uint8Array([0, 1, 2, 3, 4]), expected: \"AAECAwQ=\" },\n { input: new Uint8Array([255, 254, 253, 252]), expected: \"//79/A==\" },\n { input: new Uint8Array([]), expected: \"\" },\n ];\n\n for (const { input, expected } of testCases) {\n const encoded = encodeBase64(input);\n expect(encoded).toBe(expected);\n const decoded = decodeBase64(encoded);\n expect(decoded).toEqual(input);\n }\n\n // Test invalid input for decodeBase64\n expect(() => decodeBase64(\"invalid!\")).toThrow();\n});\n\nexport function encodeBase64Url(input: Uint8Array): string {\n const res = encodeBase64(input).replace(/=+$/, \"\").replace(/\\+/g, \"-\").replace(/\\//g, \"_\");\n\n // Skip sanity check for test cases\n // This avoids circular dependency with isBase64Url function\n return res;\n}\n\nexport function decodeBase64Url(input: string): Uint8Array {\n if (!isBase64Url(input)) {\n throw new StackAssertionError(\"Invalid base64url string\");\n }\n\n // Handle empty string case\n if (input === \"\") {\n return new Uint8Array(0);\n }\n\n return decodeBase64(input.replace(/-/g, \"+\").replace(/_/g, \"/\") + \"====\".slice((input.length - 1) % 4 + 1));\n}\nundefined?.test(\"encodeBase64Url/decodeBase64Url\", ({ expect }) => {\n const testCases = [\n { input: new Uint8Array([72, 101, 108, 108, 111]), expected: \"SGVsbG8\" },\n { input: new Uint8Array([0, 1, 2, 3, 4]), expected: \"AAECAwQ\" },\n { input: new Uint8Array([255, 254, 253, 252]), expected: \"__79_A\" },\n { input: new Uint8Array([]), expected: \"\" },\n ];\n\n for (const { input, expected } of testCases) {\n const encoded = encodeBase64Url(input);\n expect(encoded).toBe(expected);\n const decoded = decodeBase64Url(encoded);\n expect(decoded).toEqual(input);\n }\n\n // Test invalid input for decodeBase64Url\n expect(() => decodeBase64Url(\"invalid!\")).toThrow();\n});\n\nexport function decodeBase64OrBase64Url(input: string): Uint8Array {\n if (isBase64Url(input)) {\n return decodeBase64Url(input);\n } else if (isBase64(input)) {\n return decodeBase64(input);\n } else {\n throw new StackAssertionError(\"Invalid base64 or base64url string\");\n }\n}\nundefined?.test(\"decodeBase64OrBase64Url\", ({ expect }) => {\n // Test with base64 input\n const base64Input = \"SGVsbG8gV29ybGQ=\";\n const base64Expected = new Uint8Array([72, 101, 108, 108, 111, 32, 87, 111, 114, 108, 100]);\n expect(decodeBase64OrBase64Url(base64Input)).toEqual(base64Expected);\n\n // Test with base64url input\n const base64UrlInput = \"SGVsbG8gV29ybGQ\";\n const base64UrlExpected = new Uint8Array([72, 101, 108, 108, 111, 32, 87, 111, 114, 108, 100]);\n expect(decodeBase64OrBase64Url(base64UrlInput)).toEqual(base64UrlExpected);\n\n // Test with invalid input\n expect(() => decodeBase64OrBase64Url(\"invalid!\")).toThrow();\n});\n\nexport function isBase32(input: string): boolean {\n for (const char of input) {\n if (char === \" \") continue;\n const upperChar = char.toUpperCase();\n // Check if the character is in the Crockford alphabet\n if (!crockfordAlphabet.includes(upperChar)) {\n return false;\n }\n }\n return true;\n}\nundefined?.test(\"isBase32\", ({ expect }) => {\n expect(isBase32(\"0123456789ABCDEFGHJKMNPQRSTVWXYZ\")).toBe(true);\n expect(isBase32(\"0OIJ\")).toBe(false); // O and I are not allowed\n expect(isBase32(\"ABC DEF\")).toBe(true); // Spaces are allowed\n expect(isBase32(\"ABC!\")).toBe(false); // Special characters not allowed\n expect(isBase32(\"\")).toBe(true);\n});\n\nexport function isBase64(input: string): boolean {\n // This regex allows for standard base64 with proper padding\n const regex = /^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$/;\n return regex.test(input);\n}\nundefined?.test(\"isBase64\", ({ expect }) => {\n expect(isBase64(\"SGVsbG8gV29ybGQ=\")).toBe(true);\n expect(isBase64(\"SGVsbG8gV29ybGQ\")).toBe(false); // No padding\n expect(isBase64(\"SGVsbG8gV29ybGQ==\")).toBe(false); // Wrong padding\n expect(isBase64(\"SGVsbG8!V29ybGQ=\")).toBe(false); // Invalid character\n expect(isBase64(\"\")).toBe(true);\n});\n\nexport function isBase64Url(input: string): boolean {\n if (input === \"\") {\n return true;\n }\n const regex = /^[0-9a-zA-Z_-]+$/;\n return regex.test(input);\n}\nundefined?.test(\"isBase64Url\", ({ expect }) => {\n expect(isBase64Url(\"SGVsbG8gV2 9ybGQ\")).toBe(false); // Space is not valid\n expect(isBase64Url(\"SGVsbG8_V29ybGQ\")).toBe(true); // _ is a valid character\n expect(isBase64Url(\"SGVsbG8-V29ybGQ\")).toBe(true); // - is valid\n expect(isBase64Url(\"SGVsbG8_V29ybGQ=\")).toBe(false); // = not allowed\n expect(isBase64Url(\"\")).toBe(true); // Empty string is valid\n});\n"],"mappings":"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","names":[]}
@@ -1,5 +1,5 @@
1
- import { RateLimitOptions, ReactPromise } from './promises.cjs';
2
- import './results.cjs';
1
+ import { RateLimitOptions, ReactPromise } from './promises.mjs';
2
+ import './results.mjs';
3
3
 
4
4
  /**
5
5
  * Can be used to cache the result of a function call, for example for the `use` hook in React.
@@ -24,10 +24,10 @@ __export(caches_exports, {
24
24
  cacheFunction: () => cacheFunction
25
25
  });
26
26
  module.exports = __toCommonJS(caches_exports);
27
- var import_maps = require("./maps");
28
- var import_objects = require("./objects");
29
- var import_promises = require("./promises");
30
- var import_stores = require("./stores");
27
+ var import_maps = require("./maps.js");
28
+ var import_objects = require("./objects.js");
29
+ var import_promises = require("./promises.js");
30
+ var import_stores = require("./stores.js");
31
31
  function cacheFunction(f) {
32
32
  const dependenciesMap = new import_maps.DependenciesMap();
33
33
  return (...args) => {
@@ -24,9 +24,9 @@ __export(crypto_exports, {
24
24
  generateSecureRandomString: () => generateSecureRandomString
25
25
  });
26
26
  module.exports = __toCommonJS(crypto_exports);
27
- var import_bytes = require("./bytes");
28
- var import_errors = require("./errors");
29
- var import_globals = require("./globals");
27
+ var import_bytes = require("./bytes.js");
28
+ var import_errors = require("./errors.js");
29
+ var import_globals = require("./globals.js");
30
30
  function generateRandomValues(array) {
31
31
  if (!import_globals.globalVar.crypto) {
32
32
  throw new import_errors.StackAssertionError("Crypto API is not available in this environment. Are you using an old browser?");
@@ -26,7 +26,7 @@ __export(dates_exports, {
26
26
  isWeekend: () => isWeekend
27
27
  });
28
28
  module.exports = __toCommonJS(dates_exports);
29
- var import_math = require("./math");
29
+ var import_math = require("./math.js");
30
30
  function isWeekend(date) {
31
31
  return date.getDay() === 0 || date.getDay() === 6;
32
32
  }
package/dist/utils/env.js CHANGED
@@ -26,8 +26,8 @@ __export(env_exports, {
26
26
  isBrowserLike: () => isBrowserLike
27
27
  });
28
28
  module.exports = __toCommonJS(env_exports);
29
- var import_errors = require("./errors");
30
- var import_strings = require("./strings");
29
+ var import_errors = require("./errors.js");
30
+ var import_strings = require("./strings.js");
31
31
  function isBrowserLike() {
32
32
  return typeof window !== "undefined" && typeof document !== "undefined" && typeof document.createElement !== "undefined";
33
33
  }
@@ -1,5 +1,5 @@
1
- import { Json } from './json.cjs';
2
- import './results.cjs';
1
+ import { Json } from './json.mjs';
2
+ import './results.mjs';
3
3
 
4
4
  declare function throwErr(errorMessage: string, extraData?: any): never;
5
5
  declare function throwErr(error: Error): never;
@@ -45,6 +45,7 @@ type StatusErrorConstructorParameters = [
45
45
  message: string
46
46
  ];
47
47
  declare class StatusError extends Error {
48
+ private readonly __stackStatusErrorBrand;
48
49
  name: string;
49
50
  readonly statusCode: number;
50
51
  static BadRequest: {
@@ -208,6 +209,7 @@ declare class StatusError extends Error {
208
209
  message: string;
209
210
  };
210
211
  constructor(...args: StatusErrorConstructorParameters);
212
+ static isStatusError(error: unknown): error is StatusError;
211
213
  isClientError(): boolean;
212
214
  isServerError(): boolean;
213
215
  getStatusCode(): number;
@@ -45,6 +45,7 @@ type StatusErrorConstructorParameters = [
45
45
  message: string
46
46
  ];
47
47
  declare class StatusError extends Error {
48
+ private readonly __stackStatusErrorBrand;
48
49
  name: string;
49
50
  readonly statusCode: number;
50
51
  static BadRequest: {
@@ -208,6 +209,7 @@ declare class StatusError extends Error {
208
209
  message: string;
209
210
  };
210
211
  constructor(...args: StatusErrorConstructorParameters);
212
+ static isStatusError(error: unknown): error is StatusError;
211
213
  isClientError(): boolean;
212
214
  isServerError(): boolean;
213
215
  getStatusCode(): number;
@@ -29,9 +29,9 @@ __export(errors_exports, {
29
29
  throwErr: () => throwErr
30
30
  });
31
31
  module.exports = __toCommonJS(errors_exports);
32
- var import_globals = require("./globals");
33
- var import_objects = require("./objects");
34
- var import_strings = require("./strings");
32
+ var import_globals = require("./globals.js");
33
+ var import_objects = require("./objects.js");
34
+ var import_strings = require("./strings.js");
35
35
  function throwErr(...args) {
36
36
  if (typeof args[0] === "string") {
37
37
  throw new StackAssertionError(args[0], args[1]);
@@ -110,12 +110,16 @@ var StatusError = class extends Error {
110
110
  status = status.statusCode;
111
111
  }
112
112
  super(message);
113
+ this.__stackStatusErrorBrand = "stack-status-error-brand-sentinel";
113
114
  this.name = "StatusError";
114
115
  this.statusCode = status;
115
116
  if (!message) {
116
117
  throw new StackAssertionError("StatusError always requires a message unless a Status object is passed", { cause: this });
117
118
  }
118
119
  }
120
+ static isStatusError(error) {
121
+ return typeof error === "object" && error !== null && "__stackStatusErrorBrand" in error && error.__stackStatusErrorBrand === "stack-status-error-brand-sentinel";
122
+ }
119
123
  isClientError() {
120
124
  return this.statusCode >= 400 && this.statusCode < 500;
121
125
  }