@shware/security 7.1.0 → 8.0.0

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 (212) hide show
  1. package/README.md +108 -30
  2. package/dist/auth/attributes.cjs +5 -5
  3. package/dist/auth/attributes.cjs.map +1 -1
  4. package/dist/auth/attributes.d.cts +3 -5
  5. package/dist/auth/attributes.d.cts.map +1 -1
  6. package/dist/auth/attributes.d.mts +3 -5
  7. package/dist/auth/attributes.d.mts.map +1 -1
  8. package/dist/auth/attributes.mjs +5 -5
  9. package/dist/auth/attributes.mjs.map +1 -1
  10. package/dist/auth/desktop-codes.cjs +57 -0
  11. package/dist/auth/desktop-codes.cjs.map +1 -0
  12. package/dist/auth/desktop-codes.d.cts +24 -0
  13. package/dist/auth/desktop-codes.d.cts.map +1 -0
  14. package/dist/auth/desktop-codes.d.mts +24 -0
  15. package/dist/auth/desktop-codes.d.mts.map +1 -0
  16. package/dist/auth/desktop-codes.mjs +55 -0
  17. package/dist/auth/desktop-codes.mjs.map +1 -0
  18. package/dist/auth/email-codes.cjs +77 -0
  19. package/dist/auth/email-codes.cjs.map +1 -0
  20. package/dist/auth/email-codes.d.cts +39 -0
  21. package/dist/auth/email-codes.d.cts.map +1 -0
  22. package/dist/auth/email-codes.d.mts +39 -0
  23. package/dist/auth/email-codes.d.mts.map +1 -0
  24. package/dist/auth/email-codes.mjs +75 -0
  25. package/dist/auth/email-codes.mjs.map +1 -0
  26. package/dist/auth/error.cjs +47 -0
  27. package/dist/auth/error.cjs.map +1 -0
  28. package/dist/auth/error.d.cts +88 -0
  29. package/dist/auth/error.d.cts.map +1 -0
  30. package/dist/auth/error.d.mts +88 -0
  31. package/dist/auth/error.d.mts.map +1 -0
  32. package/dist/auth/error.mjs +45 -0
  33. package/dist/auth/error.mjs.map +1 -0
  34. package/dist/auth/index.cjs +245 -385
  35. package/dist/auth/index.cjs.map +1 -1
  36. package/dist/auth/index.d.cts +66 -57
  37. package/dist/auth/index.d.cts.map +1 -1
  38. package/dist/auth/index.d.mts +66 -57
  39. package/dist/auth/index.d.mts.map +1 -1
  40. package/dist/auth/index.mjs +248 -388
  41. package/dist/auth/index.mjs.map +1 -1
  42. package/dist/auth/respond.cjs +99 -0
  43. package/dist/auth/respond.cjs.map +1 -0
  44. package/dist/auth/respond.d.cts +39 -0
  45. package/dist/auth/respond.d.cts.map +1 -0
  46. package/dist/auth/respond.d.mts +39 -0
  47. package/dist/auth/respond.d.mts.map +1 -0
  48. package/dist/auth/respond.mjs +92 -0
  49. package/dist/auth/respond.mjs.map +1 -0
  50. package/dist/auth/types.d.cts +27 -13
  51. package/dist/auth/types.d.cts.map +1 -1
  52. package/dist/auth/types.d.mts +27 -13
  53. package/dist/auth/types.d.mts.map +1 -1
  54. package/dist/core/index.cjs +1 -2
  55. package/dist/core/index.d.cts +0 -2
  56. package/dist/core/index.d.cts.map +1 -1
  57. package/dist/core/index.d.mts +0 -2
  58. package/dist/core/index.d.mts.map +1 -1
  59. package/dist/core/index.mjs +1 -2
  60. package/dist/email/schema.cjs +1 -2
  61. package/dist/email/schema.d.cts +0 -2
  62. package/dist/email/schema.d.cts.map +1 -1
  63. package/dist/email/schema.d.mts +0 -2
  64. package/dist/email/schema.d.mts.map +1 -1
  65. package/dist/email/schema.mjs +1 -2
  66. package/dist/index.cjs +5 -0
  67. package/dist/index.d.cts +4 -1
  68. package/dist/index.d.mts +4 -1
  69. package/dist/index.mjs +3 -1
  70. package/dist/oauth2/client.cjs +1 -2
  71. package/dist/oauth2/client.d.cts +0 -2
  72. package/dist/oauth2/client.d.cts.map +1 -1
  73. package/dist/oauth2/client.d.mts +0 -2
  74. package/dist/oauth2/client.d.mts.map +1 -1
  75. package/dist/oauth2/client.mjs +1 -2
  76. package/dist/oauth2/error.cjs +1 -9
  77. package/dist/oauth2/error.cjs.map +1 -1
  78. package/dist/oauth2/error.d.cts +0 -5
  79. package/dist/oauth2/error.d.cts.map +1 -1
  80. package/dist/oauth2/error.d.mts +0 -5
  81. package/dist/oauth2/error.d.mts.map +1 -1
  82. package/dist/oauth2/error.mjs +2 -9
  83. package/dist/oauth2/error.mjs.map +1 -1
  84. package/dist/oauth2/name.cjs +1 -2
  85. package/dist/oauth2/name.d.cts +0 -2
  86. package/dist/oauth2/name.d.cts.map +1 -1
  87. package/dist/oauth2/name.d.mts +0 -2
  88. package/dist/oauth2/name.d.mts.map +1 -1
  89. package/dist/oauth2/name.mjs +1 -2
  90. package/dist/oauth2/provider/apple-client-secret.cjs +1 -2
  91. package/dist/oauth2/provider/apple-client-secret.d.cts +0 -2
  92. package/dist/oauth2/provider/apple-client-secret.d.cts.map +1 -1
  93. package/dist/oauth2/provider/apple-client-secret.d.mts +0 -2
  94. package/dist/oauth2/provider/apple-client-secret.d.mts.map +1 -1
  95. package/dist/oauth2/provider/apple-client-secret.mjs +1 -2
  96. package/dist/oauth2/provider/apple.cjs +1 -2
  97. package/dist/oauth2/provider/apple.d.cts +0 -2
  98. package/dist/oauth2/provider/apple.d.cts.map +1 -1
  99. package/dist/oauth2/provider/apple.d.mts +0 -2
  100. package/dist/oauth2/provider/apple.d.mts.map +1 -1
  101. package/dist/oauth2/provider/apple.mjs +1 -2
  102. package/dist/oauth2/provider/common.cjs +2 -3
  103. package/dist/oauth2/provider/common.cjs.map +1 -1
  104. package/dist/oauth2/provider/common.d.cts +0 -2
  105. package/dist/oauth2/provider/common.d.cts.map +1 -1
  106. package/dist/oauth2/provider/common.d.mts +0 -2
  107. package/dist/oauth2/provider/common.d.mts.map +1 -1
  108. package/dist/oauth2/provider/common.mjs +2 -3
  109. package/dist/oauth2/provider/common.mjs.map +1 -1
  110. package/dist/oauth2/provider/facebook.cjs +3 -6
  111. package/dist/oauth2/provider/facebook.cjs.map +1 -1
  112. package/dist/oauth2/provider/facebook.d.cts +0 -3
  113. package/dist/oauth2/provider/facebook.d.cts.map +1 -1
  114. package/dist/oauth2/provider/facebook.d.mts +0 -3
  115. package/dist/oauth2/provider/facebook.d.mts.map +1 -1
  116. package/dist/oauth2/provider/facebook.mjs +3 -6
  117. package/dist/oauth2/provider/facebook.mjs.map +1 -1
  118. package/dist/oauth2/provider/github.cjs +1 -2
  119. package/dist/oauth2/provider/github.d.cts +0 -2
  120. package/dist/oauth2/provider/github.d.cts.map +1 -1
  121. package/dist/oauth2/provider/github.d.mts +0 -2
  122. package/dist/oauth2/provider/github.d.mts.map +1 -1
  123. package/dist/oauth2/provider/github.mjs +1 -2
  124. package/dist/oauth2/provider/google.cjs +1 -2
  125. package/dist/oauth2/provider/google.d.cts +0 -2
  126. package/dist/oauth2/provider/google.d.cts.map +1 -1
  127. package/dist/oauth2/provider/google.d.mts +0 -2
  128. package/dist/oauth2/provider/google.d.mts.map +1 -1
  129. package/dist/oauth2/provider/google.mjs +1 -2
  130. package/dist/oauth2/provider/wechat.cjs +1 -2
  131. package/dist/oauth2/provider/wechat.d.cts +0 -2
  132. package/dist/oauth2/provider/wechat.d.cts.map +1 -1
  133. package/dist/oauth2/provider/wechat.d.mts +0 -2
  134. package/dist/oauth2/provider/wechat.d.mts.map +1 -1
  135. package/dist/oauth2/provider/wechat.mjs +1 -2
  136. package/dist/oauth2/provider/x.cjs +7 -6
  137. package/dist/oauth2/provider/x.cjs.map +1 -1
  138. package/dist/oauth2/provider/x.d.cts +3 -4
  139. package/dist/oauth2/provider/x.d.cts.map +1 -1
  140. package/dist/oauth2/provider/x.d.mts +3 -4
  141. package/dist/oauth2/provider/x.d.mts.map +1 -1
  142. package/dist/oauth2/provider/x.mjs +7 -6
  143. package/dist/oauth2/provider/x.mjs.map +1 -1
  144. package/dist/oauth2/types.cjs +1 -2
  145. package/dist/oauth2/types.cjs.map +1 -1
  146. package/dist/oauth2/types.d.cts +5 -2
  147. package/dist/oauth2/types.d.cts.map +1 -1
  148. package/dist/oauth2/types.d.mts +5 -2
  149. package/dist/oauth2/types.d.mts.map +1 -1
  150. package/dist/oauth2/types.mjs +1 -2
  151. package/dist/oauth2/types.mjs.map +1 -1
  152. package/dist/session/common.cjs +11 -15
  153. package/dist/session/common.cjs.map +1 -1
  154. package/dist/session/common.d.cts +7 -5
  155. package/dist/session/common.d.cts.map +1 -1
  156. package/dist/session/common.d.mts +7 -5
  157. package/dist/session/common.d.mts.map +1 -1
  158. package/dist/session/common.mjs +11 -14
  159. package/dist/session/common.mjs.map +1 -1
  160. package/dist/session/db.cjs +3 -4
  161. package/dist/session/db.cjs.map +1 -1
  162. package/dist/session/db.d.cts +0 -2
  163. package/dist/session/db.d.cts.map +1 -1
  164. package/dist/session/db.d.mts +0 -2
  165. package/dist/session/db.d.mts.map +1 -1
  166. package/dist/session/db.mjs +4 -5
  167. package/dist/session/db.mjs.map +1 -1
  168. package/dist/session/map-session.cjs +1 -2
  169. package/dist/session/map-session.d.cts +0 -2
  170. package/dist/session/map-session.d.cts.map +1 -1
  171. package/dist/session/map-session.d.mts +0 -2
  172. package/dist/session/map-session.d.mts.map +1 -1
  173. package/dist/session/map-session.mjs +1 -2
  174. package/dist/session/redis.cjs +7 -10
  175. package/dist/session/redis.cjs.map +1 -1
  176. package/dist/session/redis.d.cts +0 -2
  177. package/dist/session/redis.d.cts.map +1 -1
  178. package/dist/session/redis.d.mts +0 -2
  179. package/dist/session/redis.d.mts.map +1 -1
  180. package/dist/session/redis.mjs +8 -11
  181. package/dist/session/redis.mjs.map +1 -1
  182. package/dist/session/types.d.cts +0 -14
  183. package/dist/session/types.d.cts.map +1 -1
  184. package/dist/session/types.d.mts +0 -14
  185. package/dist/session/types.d.mts.map +1 -1
  186. package/dist/utils/http.cjs +1 -2
  187. package/dist/utils/http.d.cts +0 -2
  188. package/dist/utils/http.d.cts.map +1 -1
  189. package/dist/utils/http.d.mts +0 -2
  190. package/dist/utils/http.d.mts.map +1 -1
  191. package/dist/utils/http.mjs +1 -2
  192. package/dist/utils/oauth2.cjs +1 -2
  193. package/dist/utils/oauth2.d.cts +0 -2
  194. package/dist/utils/oauth2.d.cts.map +1 -1
  195. package/dist/utils/oauth2.d.mts +0 -2
  196. package/dist/utils/oauth2.d.mts.map +1 -1
  197. package/dist/utils/oauth2.mjs +1 -2
  198. package/dist/utils/timing.cjs +1 -2
  199. package/dist/utils/timing.d.cts +0 -2
  200. package/dist/utils/timing.d.cts.map +1 -1
  201. package/dist/utils/timing.d.mts +0 -2
  202. package/dist/utils/timing.d.mts.map +1 -1
  203. package/dist/utils/timing.mjs +1 -2
  204. package/dist/utils/valid.cjs +35 -54
  205. package/dist/utils/valid.cjs.map +1 -1
  206. package/dist/utils/valid.d.cts +8 -25
  207. package/dist/utils/valid.d.cts.map +1 -1
  208. package/dist/utils/valid.d.mts +8 -25
  209. package/dist/utils/valid.d.mts.map +1 -1
  210. package/dist/utils/valid.mjs +33 -52
  211. package/dist/utils/valid.mjs.map +1 -1
  212. package/package.json +4 -4
@@ -1,8 +1,8 @@
1
1
  import { Principal } from "../core/index.cjs";
2
2
  import { KVRepository, Session, SessionRepository } from "../session/types.cjs";
3
+ import { EmailSender } from "./email-codes.cjs";
3
4
  import { OAuth2ClientConfig, OAuth2Token, UserInfo } from "../oauth2/types.cjs";
4
5
  import { CookieOptions } from "../utils/http.cjs";
5
- //#region src/auth/types.d.ts
6
6
  export type LoggedHandler = (principal: Principal) => Promise<void>;
7
7
  /**
8
8
  * Who signed in, and how: what every login method hands to `onAuthorized`.
@@ -25,7 +25,11 @@ export interface Authorization {
25
25
  token?: OAuth2Token;
26
26
  attributes: Record<string, string>;
27
27
  }
28
- /** Creates or updates the user and returns the principal whose `name` the session stores. */
28
+ /**
29
+ * Creates or updates the user and returns the principal whose `name` the session stores. Throw an
30
+ * `AuthenticationError` to refuse the sign-in with a reason the client can act on; any other error
31
+ * is treated as a server fault.
32
+ */
29
33
  export type AuthorizedHandler = (request: Request, authorization: Authorization) => Promise<Principal>;
30
34
  export interface OAuth2AuthorizationOptions {
31
35
  /**
@@ -57,13 +61,24 @@ export interface AuthConfig {
57
61
  * 3600 (an hour); `0` writes on every authenticated request.
58
62
  */
59
63
  touchInterval?: number;
64
+ /**
65
+ * Also carry the session id in the `X-Auth-Token` header, for clients without a cookie jar
66
+ * (a CLI, a desktop shell), as Spring Session's `HeaderHttpSessionIdResolver` does: every
67
+ * response that sets the session cookie (a login, `logged`) also answers `X-Auth-Token: <id>`,
68
+ * and a request without the cookie is read from the same header. Default `false`. Turning it
69
+ * on exposes the id to same-origin scripts, which the cookie's `HttpOnly` kept it from, and a
70
+ * cross-origin client needs the header in `Access-Control-Expose-Headers`. The header is for
71
+ * the session id only: an API token for programmatic access is a different credential and
72
+ * is not read here.
73
+ */
74
+ header?: boolean;
60
75
  };
61
76
  turnstileSecretKey?: string;
62
77
  /** Limits of email verification codes (a code itself is valid for 10 minutes). */
63
78
  verificationCode?: {
64
79
  /**
65
80
  * Wrong guesses a code survives: once a login exceeds this many attempts the code is discarded
66
- * and `loginEmail` answers `VERIFICATION_CODE_ATTEMPTS_EXCEEDED`. Default 5.
81
+ * and `loginEmail` answers `403 VERIFICATION_CODE_ATTEMPTS_EXCEEDED`. Default 5.
67
82
  */
68
83
  maxAttempts?: number;
69
84
  /**
@@ -97,16 +112,16 @@ export interface AuthService {
97
112
  loginOAuth2Code: (request: Request, onAuthorized: AuthorizedHandler) => Promise<Response>;
98
113
  loginOAuth2Native: (request: Request, onAuthorized: AuthorizedHandler) => Promise<Response>;
99
114
  loginOAuth2Onetap: (request: Request, onAuthorized: AuthorizedHandler, provider?: string) => Promise<Response>;
100
- sendEmailVerificationCode: (request: Request, sender: (data: {
101
- email: string;
102
- verificationCode: string;
103
- }) => Promise<void>) => Promise<Response>;
104
- sendPhoneVerificationCode: (request: Request, sender: (data: {
105
- phone: string;
106
- verificationCode: string;
107
- }) => Promise<void>) => Promise<Response>;
115
+ sendEmailVerificationCode: (request: Request, sender: EmailSender) => Promise<Response>;
108
116
  loginEmail: (request: Request, onAuthorized: AuthorizedHandler) => Promise<Response>;
109
- loginPhone: (request: Request, onAuthorized: AuthorizedHandler) => Promise<Response>;
117
+ /**
118
+ * Spends a mailed code without signing in, for a host flow that only needs proof of the address
119
+ * (verifying or changing a signed-in user's email). Throws `AuthenticationError`
120
+ * (`INVALID_VERIFICATION_CODE`, `VERIFICATION_CODE_ATTEMPTS_EXCEEDED`) as `loginEmail` answers.
121
+ */
122
+ verifyEmailCode: (email: string, verificationCode: string) => Promise<void>;
123
+ desktopAuthorize: (request: Request) => Promise<Response>;
124
+ desktopExchange: (request: Request) => Promise<Response>;
110
125
  kick: (principal: Principal) => Promise<void>;
111
126
  isAuthenticated: (request: Request) => Promise<boolean>;
112
127
  getSession: <T extends boolean>(request: Request, create: T) => Promise<T extends true ? Session : Session | null>;
@@ -115,5 +130,4 @@ export interface AuthService {
115
130
  listSessions: (principal: Principal) => Promise<Session[]>;
116
131
  cleanupExpiredSessions: (cleanupCount?: number) => Promise<Response>;
117
132
  }
118
- //#endregion
119
133
  //# sourceMappingURL=types.d.cts.map
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.cts","names":[],"sources":["../../src/auth/types.ts"],"mappings":";;;;;YAKY,iBAAiB,WAAW,cAAc;;;;;;;;;;;;;;;iBAerC;EACf;EACA;EACA,UAAU;EACV,QAAQ;EACR,YAAY;;;YAIF,qBACV,SAAS,SACT,eAAe,kBACZ,QAAQ;iBAEI;;;;;;;;;;;EAWf,aAAa;;iBAGE;EACf;EACA,cAAc;EACd,mBAAmB;EACnB,SAAS;IAAkB;;EAC3B;;;;;;;;;IASE;;EAEF;;EAEA;;;;;IAKE;;;;;IAKA;;EAEF;IACE,SAAS;;IAET;;;;;;;;MAQE;;;;iBAKW;EAEf,OAAO,SAAS,YAAY,QAAQ;EACpC,SAAS,SAAS,YAAY,QAAQ;EACtC,SAAS,SAAS,SAAS,WAAW,kBAAkB,QAAQ;EAGhE,cAAc,SAAS,YAAY,QAAQ;EAC3C,cAAc,SAAS,YAAY,QAAQ;EAC3C,sBACE,SAAS,SACT,UAAU,+BACP,QAAQ;EACb,kBAAkB,SAAS,SAAS,cAAc,sBAAsB,QAAQ;EAChF,oBAAoB,SAAS,SAAS,cAAc,sBAAsB,QAAQ;EAClF,oBACE,SAAS,SACT,cAAc,mBACd,sBACG,QAAQ;EAGb,4BACE,SAAS,SACT,SAAS;IAAQ;IAAe;QAA+B,kBAC5D,QAAQ;EACb,4BACE,SAAS,SACT,SAAS;IAAQ;IAAe;QAA+B,kBAC5D,QAAQ;EAEb,aAAa,SAAS,SAAS,cAAc,sBAAsB,QAAQ;EAC3E,aAAa,SAAS,SAAS,cAAc,sBAAsB,QAAQ;EAG3E,OAAO,WAAW,cAAc;EAChC,kBAAkB,SAAS,YAAY;EACvC,aAAa,mBACX,SAAS,SACT,QAAQ,MACL,QAAQ,iBAAiB,UAAU;EACxC,gBAAgB,sBAAsB;EACtC,eAAe,SAAS,YAAY,QAAQ;EAC5C,eAAe,WAAW,cAAc,QAAQ;EAChD,yBAAyB,0BAA0B,QAAQ"}
1
+ {"version":3,"file":"types.d.cts","names":[],"sources":["../../src/auth/types.ts"],"mappings":";;;;;YAMY,iBAAiB,WAAW,cAAc;;;;;;;;;;;;;;;iBAerC;EACf;EACA;EACA,UAAU;EACV,QAAQ;EACR,YAAY;;;;;;;YAQF,qBACV,SAAS,SACT,eAAe,kBACZ,QAAQ;iBAEI;;;;;;;;;;;EAWf,aAAa;;iBAGE;EACf;EACA,cAAc;EACd,mBAAmB;EACnB,SAAS;IAAkB;;EAC3B;;;;;;;;;IASE;;;;;;;;;;;IAWA;;EAEF;;EAEA;;;;;IAKE;;;;;IAKA;;EAEF;IACE,SAAS;;IAET;;;;;;;;MAQE;;;;iBAKW;EAEf,OAAO,SAAS,YAAY,QAAQ;EACpC,SAAS,SAAS,YAAY,QAAQ;EACtC,SAAS,SAAS,SAAS,WAAW,kBAAkB,QAAQ;EAGhE,cAAc,SAAS,YAAY,QAAQ;EAC3C,cAAc,SAAS,YAAY,QAAQ;EAC3C,sBACE,SAAS,SACT,UAAU,+BACP,QAAQ;EACb,kBAAkB,SAAS,SAAS,cAAc,sBAAsB,QAAQ;EAChF,oBAAoB,SAAS,SAAS,cAAc,sBAAsB,QAAQ;EAClF,oBACE,SAAS,SACT,cAAc,mBACd,sBACG,QAAQ;EAGb,4BAA4B,SAAS,SAAS,QAAQ,gBAAgB,QAAQ;EAC9E,aAAa,SAAS,SAAS,cAAc,sBAAsB,QAAQ;;;;;;EAM3E,kBAAkB,eAAe,6BAA6B;EAG9D,mBAAmB,SAAS,YAAY,QAAQ;EAChD,kBAAkB,SAAS,YAAY,QAAQ;EAG/C,OAAO,WAAW,cAAc;EAChC,kBAAkB,SAAS,YAAY;EACvC,aAAa,mBACX,SAAS,SACT,QAAQ,MACL,QAAQ,iBAAiB,UAAU;EACxC,gBAAgB,sBAAsB;EACtC,eAAe,SAAS,YAAY,QAAQ;EAC5C,eAAe,WAAW,cAAc,QAAQ;EAChD,yBAAyB,0BAA0B,QAAQ"}
@@ -1,8 +1,8 @@
1
1
  import { Principal } from "../core/index.mjs";
2
2
  import { KVRepository, Session, SessionRepository } from "../session/types.mjs";
3
+ import { EmailSender } from "./email-codes.mjs";
3
4
  import { OAuth2ClientConfig, OAuth2Token, UserInfo } from "../oauth2/types.mjs";
4
5
  import { CookieOptions } from "../utils/http.mjs";
5
- //#region src/auth/types.d.ts
6
6
  export type LoggedHandler = (principal: Principal) => Promise<void>;
7
7
  /**
8
8
  * Who signed in, and how: what every login method hands to `onAuthorized`.
@@ -25,7 +25,11 @@ export interface Authorization {
25
25
  token?: OAuth2Token;
26
26
  attributes: Record<string, string>;
27
27
  }
28
- /** Creates or updates the user and returns the principal whose `name` the session stores. */
28
+ /**
29
+ * Creates or updates the user and returns the principal whose `name` the session stores. Throw an
30
+ * `AuthenticationError` to refuse the sign-in with a reason the client can act on; any other error
31
+ * is treated as a server fault.
32
+ */
29
33
  export type AuthorizedHandler = (request: Request, authorization: Authorization) => Promise<Principal>;
30
34
  export interface OAuth2AuthorizationOptions {
31
35
  /**
@@ -57,13 +61,24 @@ export interface AuthConfig {
57
61
  * 3600 (an hour); `0` writes on every authenticated request.
58
62
  */
59
63
  touchInterval?: number;
64
+ /**
65
+ * Also carry the session id in the `X-Auth-Token` header, for clients without a cookie jar
66
+ * (a CLI, a desktop shell), as Spring Session's `HeaderHttpSessionIdResolver` does: every
67
+ * response that sets the session cookie (a login, `logged`) also answers `X-Auth-Token: <id>`,
68
+ * and a request without the cookie is read from the same header. Default `false`. Turning it
69
+ * on exposes the id to same-origin scripts, which the cookie's `HttpOnly` kept it from, and a
70
+ * cross-origin client needs the header in `Access-Control-Expose-Headers`. The header is for
71
+ * the session id only: an API token for programmatic access is a different credential and
72
+ * is not read here.
73
+ */
74
+ header?: boolean;
60
75
  };
61
76
  turnstileSecretKey?: string;
62
77
  /** Limits of email verification codes (a code itself is valid for 10 minutes). */
63
78
  verificationCode?: {
64
79
  /**
65
80
  * Wrong guesses a code survives: once a login exceeds this many attempts the code is discarded
66
- * and `loginEmail` answers `VERIFICATION_CODE_ATTEMPTS_EXCEEDED`. Default 5.
81
+ * and `loginEmail` answers `403 VERIFICATION_CODE_ATTEMPTS_EXCEEDED`. Default 5.
67
82
  */
68
83
  maxAttempts?: number;
69
84
  /**
@@ -97,16 +112,16 @@ export interface AuthService {
97
112
  loginOAuth2Code: (request: Request, onAuthorized: AuthorizedHandler) => Promise<Response>;
98
113
  loginOAuth2Native: (request: Request, onAuthorized: AuthorizedHandler) => Promise<Response>;
99
114
  loginOAuth2Onetap: (request: Request, onAuthorized: AuthorizedHandler, provider?: string) => Promise<Response>;
100
- sendEmailVerificationCode: (request: Request, sender: (data: {
101
- email: string;
102
- verificationCode: string;
103
- }) => Promise<void>) => Promise<Response>;
104
- sendPhoneVerificationCode: (request: Request, sender: (data: {
105
- phone: string;
106
- verificationCode: string;
107
- }) => Promise<void>) => Promise<Response>;
115
+ sendEmailVerificationCode: (request: Request, sender: EmailSender) => Promise<Response>;
108
116
  loginEmail: (request: Request, onAuthorized: AuthorizedHandler) => Promise<Response>;
109
- loginPhone: (request: Request, onAuthorized: AuthorizedHandler) => Promise<Response>;
117
+ /**
118
+ * Spends a mailed code without signing in, for a host flow that only needs proof of the address
119
+ * (verifying or changing a signed-in user's email). Throws `AuthenticationError`
120
+ * (`INVALID_VERIFICATION_CODE`, `VERIFICATION_CODE_ATTEMPTS_EXCEEDED`) as `loginEmail` answers.
121
+ */
122
+ verifyEmailCode: (email: string, verificationCode: string) => Promise<void>;
123
+ desktopAuthorize: (request: Request) => Promise<Response>;
124
+ desktopExchange: (request: Request) => Promise<Response>;
110
125
  kick: (principal: Principal) => Promise<void>;
111
126
  isAuthenticated: (request: Request) => Promise<boolean>;
112
127
  getSession: <T extends boolean>(request: Request, create: T) => Promise<T extends true ? Session : Session | null>;
@@ -115,5 +130,4 @@ export interface AuthService {
115
130
  listSessions: (principal: Principal) => Promise<Session[]>;
116
131
  cleanupExpiredSessions: (cleanupCount?: number) => Promise<Response>;
117
132
  }
118
- //#endregion
119
133
  //# sourceMappingURL=types.d.mts.map
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.mts","names":[],"sources":["../../src/auth/types.ts"],"mappings":";;;;;YAKY,iBAAiB,WAAW,cAAc;;;;;;;;;;;;;;;iBAerC;EACf;EACA;EACA,UAAU;EACV,QAAQ;EACR,YAAY;;;YAIF,qBACV,SAAS,SACT,eAAe,kBACZ,QAAQ;iBAEI;;;;;;;;;;;EAWf,aAAa;;iBAGE;EACf;EACA,cAAc;EACd,mBAAmB;EACnB,SAAS;IAAkB;;EAC3B;;;;;;;;;IASE;;EAEF;;EAEA;;;;;IAKE;;;;;IAKA;;EAEF;IACE,SAAS;;IAET;;;;;;;;MAQE;;;;iBAKW;EAEf,OAAO,SAAS,YAAY,QAAQ;EACpC,SAAS,SAAS,YAAY,QAAQ;EACtC,SAAS,SAAS,SAAS,WAAW,kBAAkB,QAAQ;EAGhE,cAAc,SAAS,YAAY,QAAQ;EAC3C,cAAc,SAAS,YAAY,QAAQ;EAC3C,sBACE,SAAS,SACT,UAAU,+BACP,QAAQ;EACb,kBAAkB,SAAS,SAAS,cAAc,sBAAsB,QAAQ;EAChF,oBAAoB,SAAS,SAAS,cAAc,sBAAsB,QAAQ;EAClF,oBACE,SAAS,SACT,cAAc,mBACd,sBACG,QAAQ;EAGb,4BACE,SAAS,SACT,SAAS;IAAQ;IAAe;QAA+B,kBAC5D,QAAQ;EACb,4BACE,SAAS,SACT,SAAS;IAAQ;IAAe;QAA+B,kBAC5D,QAAQ;EAEb,aAAa,SAAS,SAAS,cAAc,sBAAsB,QAAQ;EAC3E,aAAa,SAAS,SAAS,cAAc,sBAAsB,QAAQ;EAG3E,OAAO,WAAW,cAAc;EAChC,kBAAkB,SAAS,YAAY;EACvC,aAAa,mBACX,SAAS,SACT,QAAQ,MACL,QAAQ,iBAAiB,UAAU;EACxC,gBAAgB,sBAAsB;EACtC,eAAe,SAAS,YAAY,QAAQ;EAC5C,eAAe,WAAW,cAAc,QAAQ;EAChD,yBAAyB,0BAA0B,QAAQ"}
1
+ {"version":3,"file":"types.d.mts","names":[],"sources":["../../src/auth/types.ts"],"mappings":";;;;;YAMY,iBAAiB,WAAW,cAAc;;;;;;;;;;;;;;;iBAerC;EACf;EACA;EACA,UAAU;EACV,QAAQ;EACR,YAAY;;;;;;;YAQF,qBACV,SAAS,SACT,eAAe,kBACZ,QAAQ;iBAEI;;;;;;;;;;;EAWf,aAAa;;iBAGE;EACf;EACA,cAAc;EACd,mBAAmB;EACnB,SAAS;IAAkB;;EAC3B;;;;;;;;;IASE;;;;;;;;;;;IAWA;;EAEF;;EAEA;;;;;IAKE;;;;;IAKA;;EAEF;IACE,SAAS;;IAET;;;;;;;;MAQE;;;;iBAKW;EAEf,OAAO,SAAS,YAAY,QAAQ;EACpC,SAAS,SAAS,YAAY,QAAQ;EACtC,SAAS,SAAS,SAAS,WAAW,kBAAkB,QAAQ;EAGhE,cAAc,SAAS,YAAY,QAAQ;EAC3C,cAAc,SAAS,YAAY,QAAQ;EAC3C,sBACE,SAAS,SACT,UAAU,+BACP,QAAQ;EACb,kBAAkB,SAAS,SAAS,cAAc,sBAAsB,QAAQ;EAChF,oBAAoB,SAAS,SAAS,cAAc,sBAAsB,QAAQ;EAClF,oBACE,SAAS,SACT,cAAc,mBACd,sBACG,QAAQ;EAGb,4BAA4B,SAAS,SAAS,QAAQ,gBAAgB,QAAQ;EAC9E,aAAa,SAAS,SAAS,cAAc,sBAAsB,QAAQ;;;;;;EAM3E,kBAAkB,eAAe,6BAA6B;EAG9D,mBAAmB,SAAS,YAAY,QAAQ;EAChD,kBAAkB,SAAS,YAAY,QAAQ;EAG/C,OAAO,WAAW,cAAc;EAChC,kBAAkB,SAAS,YAAY;EACvC,aAAa,mBACX,SAAS,SACT,QAAQ,MACL,QAAQ,iBAAiB,UAAU;EACxC,gBAAgB,sBAAsB;EACtC,eAAe,SAAS,YAAY,QAAQ;EAC5C,eAAe,WAAW,cAAc,QAAQ;EAChD,yBAAyB,0BAA0B,QAAQ"}
@@ -1,5 +1,5 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
- //#region src/core/index.ts
2
+ // src/core/index.ts
3
3
  const PROVIDERS = [
4
4
  "APPLE",
5
5
  "DISCORD",
@@ -14,7 +14,6 @@ const PROVIDERS = [
14
14
  "EMAIL",
15
15
  "PHONE"
16
16
  ];
17
- //#endregion
18
17
  exports.PROVIDERS = PROVIDERS;
19
18
 
20
19
  //# sourceMappingURL=index.cjs.map
@@ -1,4 +1,3 @@
1
- //#region src/core/index.d.ts
2
1
  export type JSONValue = null | string | number | boolean | {
3
2
  [value: string]: JSONValue;
4
3
  } | Array<JSONValue>;
@@ -16,5 +15,4 @@ export interface CsrfToken {
16
15
  }
17
16
  export declare const PROVIDERS: readonly ['APPLE', 'DISCORD', 'FACEBOOK', 'GITHUB', 'GOOGLE', 'LINKEDIN', 'MICROSOFT', 'SLACK', 'WECHAT', 'X', 'EMAIL', 'PHONE'];
18
17
  export type Provider = (typeof PROVIDERS)[number];
19
- //#endregion
20
18
  //# sourceMappingURL=index.d.cts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.cts","names":[],"sources":["../../src/core/index.ts"],"mappings":";YAAY;GAKL,gBAAgB;IACnB,MAAM;iBAEO;EACf;;iBAGe,uBAAuB;EACtC;EACA;;iBAGe;EACf;EACA;EACA;;qBAGW;YAiBD,mBAAmB"}
1
+ {"version":3,"file":"index.d.cts","names":[],"sources":["../../src/core/index.ts"],"mappings":"A,YAAY;GAKL,gBAAgB;IACnB,MAAM;iBAEO;EACf;;iBAGe,uBAAuB;EACtC;EACA;;iBAGe;EACf;EACA;EACA;;qBAGW;YAiBD,mBAAmB"}
@@ -1,4 +1,3 @@
1
- //#region src/core/index.d.ts
2
1
  export type JSONValue = null | string | number | boolean | {
3
2
  [value: string]: JSONValue;
4
3
  } | Array<JSONValue>;
@@ -16,5 +15,4 @@ export interface CsrfToken {
16
15
  }
17
16
  export declare const PROVIDERS: readonly ['APPLE', 'DISCORD', 'FACEBOOK', 'GITHUB', 'GOOGLE', 'LINKEDIN', 'MICROSOFT', 'SLACK', 'WECHAT', 'X', 'EMAIL', 'PHONE'];
18
17
  export type Provider = (typeof PROVIDERS)[number];
19
- //#endregion
20
18
  //# sourceMappingURL=index.d.mts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.mts","names":[],"sources":["../../src/core/index.ts"],"mappings":";YAAY;GAKL,gBAAgB;IACnB,MAAM;iBAEO;EACf;;iBAGe,uBAAuB;EACtC;EACA;;iBAGe;EACf;EACA;EACA;;qBAGW;YAiBD,mBAAmB"}
1
+ {"version":3,"file":"index.d.mts","names":[],"sources":["../../src/core/index.ts"],"mappings":"A,YAAY;GAKL,gBAAgB;IACnB,MAAM;iBAEO;EACf;;iBAGe,uBAAuB;EACtC;EACA;;iBAGe;EACf;EACA;EACA;;qBAGW;YAiBD,mBAAmB"}
@@ -1,4 +1,4 @@
1
- //#region src/core/index.ts
1
+ // src/core/index.ts
2
2
  const PROVIDERS = [
3
3
  "APPLE",
4
4
  "DISCORD",
@@ -13,7 +13,6 @@ const PROVIDERS = [
13
13
  "EMAIL",
14
14
  "PHONE"
15
15
  ];
16
- //#endregion
17
16
  export { PROVIDERS };
18
17
 
19
18
  //# sourceMappingURL=index.mjs.map
@@ -1,7 +1,7 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
2
  const require_auth_attributes = require("../auth/attributes.cjs");
3
3
  let zod_mini = require("zod/mini");
4
- //#region src/email/schema.ts
4
+ // src/email/schema.ts
5
5
  /**
6
6
  * An email address as an identity key: trimmed and lowercased before the format check, so
7
7
  * `" A@X.com "` is accepted as `"a@x.com"`. The whole address is lowercased, local part included:
@@ -18,7 +18,6 @@ const loginEmailSchema = (0, zod_mini.object)({
18
18
  verificationCode: (0, zod_mini.string)().check((0, zod_mini.regex)(/^\d{6}$/)),
19
19
  attributes: require_auth_attributes.attributesSchema
20
20
  });
21
- //#endregion
22
21
  exports.loginEmailSchema = loginEmailSchema;
23
22
  exports.sendEmailVerificationCodeSchema = sendEmailVerificationCodeSchema;
24
23
 
@@ -1,4 +1,3 @@
1
- //#region src/email/schema.d.ts
2
1
  export declare const sendEmailVerificationCodeSchema: import("zod/mini").ZodMiniObject<{
3
2
  email: import("zod/mini").ZodMiniPipe<import("zod/mini").ZodMiniString<string>, import("zod/mini").ZodMiniEmail>;
4
3
  turnstileToken: import("zod/mini").ZodMiniString<string>;
@@ -8,5 +7,4 @@ export declare const loginEmailSchema: import("zod/mini").ZodMiniObject<{
8
7
  verificationCode: import("zod/mini").ZodMiniString<string>;
9
8
  attributes: import("zod/mini").ZodMiniOptional<import("zod/mini").ZodMiniRecord<import("zod/mini").ZodMiniString<string>, import("zod/mini").ZodMiniString<string>>>;
10
9
  }, import("zod/v4/core").$strip>;
11
- //#endregion
12
10
  //# sourceMappingURL=schema.d.cts.map
@@ -1 +1 @@
1
- {"version":3,"file":"schema.d.cts","names":[],"sources":["../../src/email/schema.ts"],"mappings":";qBAWa,oDAA+B;;;yBAG1C;qBAEW,qCAAgB;;;;yBAI3B"}
1
+ {"version":3,"file":"schema.d.cts","names":[],"sources":["../../src/email/schema.ts"],"mappings":"A,qBAWa,oDAA+B;;;yBAG1C;qBAEW,qCAAgB;;;;yBAI3B"}
@@ -1,4 +1,3 @@
1
- //#region src/email/schema.d.ts
2
1
  export declare const sendEmailVerificationCodeSchema: import("zod/mini").ZodMiniObject<{
3
2
  email: import("zod/mini").ZodMiniPipe<import("zod/mini").ZodMiniString<string>, import("zod/mini").ZodMiniEmail>;
4
3
  turnstileToken: import("zod/mini").ZodMiniString<string>;
@@ -8,5 +7,4 @@ export declare const loginEmailSchema: import("zod/mini").ZodMiniObject<{
8
7
  verificationCode: import("zod/mini").ZodMiniString<string>;
9
8
  attributes: import("zod/mini").ZodMiniOptional<import("zod/mini").ZodMiniRecord<import("zod/mini").ZodMiniString<string>, import("zod/mini").ZodMiniString<string>>>;
10
9
  }, import("zod/v4/core").$strip>;
11
- //#endregion
12
10
  //# sourceMappingURL=schema.d.mts.map
@@ -1 +1 @@
1
- {"version":3,"file":"schema.d.mts","names":[],"sources":["../../src/email/schema.ts"],"mappings":";qBAWa,oDAA+B;;;yBAG1C;qBAEW,qCAAgB;;;;yBAI3B"}
1
+ {"version":3,"file":"schema.d.mts","names":[],"sources":["../../src/email/schema.ts"],"mappings":"A,qBAWa,oDAA+B;;;yBAG1C;qBAEW,qCAAgB;;;;yBAI3B"}
@@ -1,6 +1,6 @@
1
1
  import { attributesSchema } from "../auth/attributes.mjs";
2
2
  import { email, maxLength, object, pipe, regex, string, toLowerCase, trim } from "zod/mini";
3
- //#region src/email/schema.ts
3
+ // src/email/schema.ts
4
4
  /**
5
5
  * An email address as an identity key: trimmed and lowercased before the format check, so
6
6
  * `" A@X.com "` is accepted as `"a@x.com"`. The whole address is lowercased, local part included:
@@ -17,7 +17,6 @@ const loginEmailSchema = object({
17
17
  verificationCode: string().check(regex(/^\d{6}$/)),
18
18
  attributes: attributesSchema
19
19
  });
20
- //#endregion
21
20
  export { loginEmailSchema, sendEmailVerificationCodeSchema };
22
21
 
23
22
  //# sourceMappingURL=schema.mjs.map
package/dist/index.cjs CHANGED
@@ -1,5 +1,7 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
+ const require_auth_error = require("./auth/error.cjs");
2
3
  const require_oauth2_error = require("./oauth2/error.cjs");
4
+ const require_auth_respond = require("./auth/respond.cjs");
3
5
  const require_oauth2_client = require("./oauth2/client.cjs");
4
6
  const require_session_common = require("./session/common.cjs");
5
7
  const require_auth_index = require("./auth/index.cjs");
@@ -8,7 +10,9 @@ const require_session_db = require("./session/db.cjs");
8
10
  const require_core_index = require("./core/index.cjs");
9
11
  const require_oauth2_types = require("./oauth2/types.cjs");
10
12
  const require_oauth2_name = require("./oauth2/name.cjs");
13
+ exports.AUTHENTICATION_REASONS = require_auth_error.AUTHENTICATION_REASONS;
11
14
  exports.Auth = require_auth_index.Auth;
15
+ exports.AuthenticationError = require_auth_error.AuthenticationError;
12
16
  exports.DBIndexedSessionRepository = require_session_db.DBIndexedSessionRepository;
13
17
  exports.MAX_NAME_PART_LENGTH = require_oauth2_name.MAX_NAME_PART_LENGTH;
14
18
  exports.OAuth2Client = require_oauth2_client.OAuth2Client;
@@ -20,4 +24,5 @@ exports.PROVIDERS = require_core_index.PROVIDERS;
20
24
  exports.RedisIndexedSessionRepository = require_session_redis.RedisIndexedSessionRepository;
21
25
  exports.RedisKVRepository = require_session_redis.RedisKVRepository;
22
26
  exports.composeName = require_oauth2_name.composeName;
27
+ exports.errorResponse = require_auth_respond.errorResponse;
23
28
  exports.oauth2RedirectQuerySchema = require_oauth2_client.oauth2RedirectQuerySchema;
package/dist/index.d.cts CHANGED
@@ -1,12 +1,15 @@
1
1
  import { CsrfToken, PROVIDERS, Principal, Provider } from "./core/index.cjs";
2
2
  import { KVRepository, Namespace, Session, SessionRepository } from "./session/types.cjs";
3
+ import { EmailSender } from "./auth/email-codes.cjs";
4
+ import { AUTHENTICATION_REASONS, AuthenticationError, AuthenticationReason, AuthenticationReasons } from "./auth/error.cjs";
3
5
  import { AuthorizationResponse, ClientSecret, NativeClient, NativeCredential, OAuth2ClientConfig, OAuth2Token, OIDC_SCOPES, OidcScope, OidcToken, PersonNameComponents, ProviderConfig, StandardClaims, UserInfo, WebClient } from "./oauth2/types.cjs";
4
6
  import { AuthConfig, AuthService, Authorization, AuthorizedHandler, OAuth2AuthorizationOptions } from "./auth/types.cjs";
5
7
  import { Auth, PATH } from "./auth/index.cjs";
8
+ import { ErrorBody, errorResponse } from "./auth/respond.cjs";
6
9
  import { OAuth2Client, oauth2RedirectQuerySchema } from "./oauth2/client.cjs";
7
10
  import { OAuth2Error, OAuth2ErrorType } from "./oauth2/error.cjs";
8
11
  import { RedisIndexedSessionRepository, RedisKVRepository } from "./session/redis.cjs";
9
12
  import { DBAdapter, DBIndexedSessionRepository } from "./session/db.cjs";
10
13
  import { PRINCIPAL_NAME_INDEX_NAME } from "./session/common.cjs";
11
14
  import { MAX_NAME_PART_LENGTH, composeName } from "./oauth2/name.cjs";
12
- export { Auth, type AuthConfig, type AuthService, type Authorization, type AuthorizationResponse, type AuthorizedHandler, type ClientSecret, type CsrfToken, type DBAdapter, DBIndexedSessionRepository, type KVRepository, MAX_NAME_PART_LENGTH, type Namespace, type NativeClient, type NativeCredential, type OAuth2AuthorizationOptions, OAuth2Client, type OAuth2ClientConfig, OAuth2Error, type OAuth2ErrorType, type OAuth2Token, OIDC_SCOPES, type OidcScope, type OidcToken, PATH, PRINCIPAL_NAME_INDEX_NAME, PROVIDERS, type PersonNameComponents, type Principal, type Provider, type ProviderConfig, RedisIndexedSessionRepository, RedisKVRepository, type Session, type SessionRepository, type StandardClaims, type UserInfo, type WebClient, composeName, oauth2RedirectQuerySchema };
15
+ export { AUTHENTICATION_REASONS, Auth, type AuthConfig, type AuthService, AuthenticationError, type AuthenticationReason, type AuthenticationReasons, type Authorization, type AuthorizationResponse, type AuthorizedHandler, type ClientSecret, type CsrfToken, type DBAdapter, DBIndexedSessionRepository, type EmailSender, type ErrorBody, type KVRepository, MAX_NAME_PART_LENGTH, type Namespace, type NativeClient, type NativeCredential, type OAuth2AuthorizationOptions, OAuth2Client, type OAuth2ClientConfig, OAuth2Error, type OAuth2ErrorType, type OAuth2Token, OIDC_SCOPES, type OidcScope, type OidcToken, PATH, PRINCIPAL_NAME_INDEX_NAME, PROVIDERS, type PersonNameComponents, type Principal, type Provider, type ProviderConfig, RedisIndexedSessionRepository, RedisKVRepository, type Session, type SessionRepository, type StandardClaims, type UserInfo, type WebClient, composeName, errorResponse, oauth2RedirectQuerySchema };
package/dist/index.d.mts CHANGED
@@ -1,12 +1,15 @@
1
1
  import { CsrfToken, PROVIDERS, Principal, Provider } from "./core/index.mjs";
2
2
  import { KVRepository, Namespace, Session, SessionRepository } from "./session/types.mjs";
3
+ import { EmailSender } from "./auth/email-codes.mjs";
4
+ import { AUTHENTICATION_REASONS, AuthenticationError, AuthenticationReason, AuthenticationReasons } from "./auth/error.mjs";
3
5
  import { AuthorizationResponse, ClientSecret, NativeClient, NativeCredential, OAuth2ClientConfig, OAuth2Token, OIDC_SCOPES, OidcScope, OidcToken, PersonNameComponents, ProviderConfig, StandardClaims, UserInfo, WebClient } from "./oauth2/types.mjs";
4
6
  import { AuthConfig, AuthService, Authorization, AuthorizedHandler, OAuth2AuthorizationOptions } from "./auth/types.mjs";
5
7
  import { Auth, PATH } from "./auth/index.mjs";
8
+ import { ErrorBody, errorResponse } from "./auth/respond.mjs";
6
9
  import { OAuth2Client, oauth2RedirectQuerySchema } from "./oauth2/client.mjs";
7
10
  import { OAuth2Error, OAuth2ErrorType } from "./oauth2/error.mjs";
8
11
  import { RedisIndexedSessionRepository, RedisKVRepository } from "./session/redis.mjs";
9
12
  import { DBAdapter, DBIndexedSessionRepository } from "./session/db.mjs";
10
13
  import { PRINCIPAL_NAME_INDEX_NAME } from "./session/common.mjs";
11
14
  import { MAX_NAME_PART_LENGTH, composeName } from "./oauth2/name.mjs";
12
- export { Auth, type AuthConfig, type AuthService, type Authorization, type AuthorizationResponse, type AuthorizedHandler, type ClientSecret, type CsrfToken, type DBAdapter, DBIndexedSessionRepository, type KVRepository, MAX_NAME_PART_LENGTH, type Namespace, type NativeClient, type NativeCredential, type OAuth2AuthorizationOptions, OAuth2Client, type OAuth2ClientConfig, OAuth2Error, type OAuth2ErrorType, type OAuth2Token, OIDC_SCOPES, type OidcScope, type OidcToken, PATH, PRINCIPAL_NAME_INDEX_NAME, PROVIDERS, type PersonNameComponents, type Principal, type Provider, type ProviderConfig, RedisIndexedSessionRepository, RedisKVRepository, type Session, type SessionRepository, type StandardClaims, type UserInfo, type WebClient, composeName, oauth2RedirectQuerySchema };
15
+ export { AUTHENTICATION_REASONS, Auth, type AuthConfig, type AuthService, AuthenticationError, type AuthenticationReason, type AuthenticationReasons, type Authorization, type AuthorizationResponse, type AuthorizedHandler, type ClientSecret, type CsrfToken, type DBAdapter, DBIndexedSessionRepository, type EmailSender, type ErrorBody, type KVRepository, MAX_NAME_PART_LENGTH, type Namespace, type NativeClient, type NativeCredential, type OAuth2AuthorizationOptions, OAuth2Client, type OAuth2ClientConfig, OAuth2Error, type OAuth2ErrorType, type OAuth2Token, OIDC_SCOPES, type OidcScope, type OidcToken, PATH, PRINCIPAL_NAME_INDEX_NAME, PROVIDERS, type PersonNameComponents, type Principal, type Provider, type ProviderConfig, RedisIndexedSessionRepository, RedisKVRepository, type Session, type SessionRepository, type StandardClaims, type UserInfo, type WebClient, composeName, errorResponse, oauth2RedirectQuerySchema };
package/dist/index.mjs CHANGED
@@ -1,4 +1,6 @@
1
+ import { AUTHENTICATION_REASONS, AuthenticationError } from "./auth/error.mjs";
1
2
  import { OAuth2Error } from "./oauth2/error.mjs";
3
+ import { errorResponse } from "./auth/respond.mjs";
2
4
  import { OAuth2Client, oauth2RedirectQuerySchema } from "./oauth2/client.mjs";
3
5
  import { PRINCIPAL_NAME_INDEX_NAME } from "./session/common.mjs";
4
6
  import { Auth, PATH } from "./auth/index.mjs";
@@ -7,4 +9,4 @@ import { DBIndexedSessionRepository } from "./session/db.mjs";
7
9
  import { PROVIDERS } from "./core/index.mjs";
8
10
  import { OIDC_SCOPES } from "./oauth2/types.mjs";
9
11
  import { MAX_NAME_PART_LENGTH, composeName } from "./oauth2/name.mjs";
10
- export { Auth, DBIndexedSessionRepository, MAX_NAME_PART_LENGTH, OAuth2Client, OAuth2Error, OIDC_SCOPES, PATH, PRINCIPAL_NAME_INDEX_NAME, PROVIDERS, RedisIndexedSessionRepository, RedisKVRepository, composeName, oauth2RedirectQuerySchema };
12
+ export { AUTHENTICATION_REASONS, Auth, AuthenticationError, DBIndexedSessionRepository, MAX_NAME_PART_LENGTH, OAuth2Client, OAuth2Error, OIDC_SCOPES, PATH, PRINCIPAL_NAME_INDEX_NAME, PROVIDERS, RedisIndexedSessionRepository, RedisKVRepository, composeName, errorResponse, oauth2RedirectQuerySchema };
@@ -2,7 +2,7 @@ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
2
  const require_oauth2_error = require("./error.cjs");
3
3
  let _shware_utils = require("@shware/utils");
4
4
  let zod_v4_mini = require("zod/v4-mini");
5
- //#region src/oauth2/client.ts
5
+ // src/oauth2/client.ts
6
6
  const oauth2RedirectQuerySchema = (0, zod_v4_mini.object)({
7
7
  code: (0, zod_v4_mini.optional)((0, zod_v4_mini.string)()),
8
8
  state: (0, zod_v4_mini.optional)((0, zod_v4_mini.string)()),
@@ -174,7 +174,6 @@ var OAuth2Client = class {
174
174
  function isOneTapProvider(provider) {
175
175
  return typeof provider.getTokenInfo === "function";
176
176
  }
177
- //#endregion
178
177
  exports.OAuth2Client = OAuth2Client;
179
178
  exports.googleOneTapSchema = googleOneTapSchema;
180
179
  exports.oauth2RedirectQuerySchema = oauth2RedirectQuerySchema;
@@ -1,5 +1,4 @@
1
1
  import { AuthorizationResponse, NativeCredential, OAuth2ClientConfig, OAuth2Token, OidcToken, PkceParameters, UserInfo } from "./types.cjs";
2
- //#region src/oauth2/client.d.ts
3
2
  export declare const oauth2RedirectQuerySchema: import("zod/mini").ZodMiniObject<{
4
3
  code: import("zod/mini").ZodMiniOptional<import("zod/mini").ZodMiniString<string>>;
5
4
  state: import("zod/mini").ZodMiniOptional<import("zod/mini").ZodMiniString<string>>;
@@ -97,5 +96,4 @@ export declare class OAuth2Client {
97
96
  clientId: string;
98
97
  }>;
99
98
  }
100
- //#endregion
101
99
  //# sourceMappingURL=client.d.cts.map
@@ -1 +1 @@
1
- {"version":3,"file":"client.d.cts","names":["_$__types0.UserInfo"],"sources":["../../src/oauth2/client.ts"],"mappings":";;qBAkBa,8CAAyB;;;;;;;yBAQpC;qBAEW,uCAAkB;;;;;;;;;;yBAY7B;qBAEW;mBACM;EACjB,YAAY,QAAQ;MAIhB;MAIA;MAIA;;UAKU;UAUN;;UAKM;;;;;;UAaA;;;;;;UAcA;UAYA;EAIR,yBACJ,UACA,OACA;IAEA;IACA;IACA,OAAO;MACL,QAAQ;;EAYN,4BACJ,UACA,MACA;IAEA;IACA;IACA,OAAO;MACL;IAAU;IAAkB,OAAO;;;EAcjC,cACJ,UACA,UACA,OACA;IAEA;IACA;IACA,OAAO,cAAc;IACrB,WAAW;MACZ,QADYA;;EAOP,eAAe,UAAU;IAAgB;IAAkB;MAAoB;;;;;EAS/E,qBACJ,UACA,UACA;IAEA;IACA;IACA;MACE,QAAQ;EAON,cACJ,UACA,UACA;IAEA;IACA;IACA;MACD;;;;;EAWK,oBACJ,UACA,eAAe,kBAAkB,eACjC;IAEA;IACA,aAAa;IACb,OAAO,KAAK;MACb"}
1
+ {"version":3,"file":"client.d.cts","names":["_$__types0.UserInfo"],"sources":["../../src/oauth2/client.ts"],"mappings":";qBAkBa,8CAAyB;;;;;;;yBAQpC;qBAEW,uCAAkB;;;;;;;;;;yBAY7B;qBAEW;mBACM;EACjB,YAAY,QAAQ;MAIhB;MAIA;MAIA;;UAKU;UAUN;;UAKM;;;;;;UAaA;;;;;;UAcA;UAYA;EAIR,yBACJ,UACA,OACA;IAEA;IACA;IACA,OAAO;MACL,QAAQ;;EAYN,4BACJ,UACA,MACA;IAEA;IACA;IACA,OAAO;MACL;IAAU;IAAkB,OAAO;;;EAcjC,cACJ,UACA,UACA,OACA;IAEA;IACA;IACA,OAAO,cAAc;IACrB,WAAW;MACZ,QADYA;;EAOP,eAAe,UAAU;IAAgB;IAAkB;MAAoB;;;;;EAS/E,qBACJ,UACA,UACA;IAEA;IACA;IACA;MACE,QAAQ;EAON,cACJ,UACA,UACA;IAEA;IACA;IACA;MACD;;;;;EAWK,oBACJ,UACA,eAAe,kBAAkB,eACjC;IAEA;IACA,aAAa;IACb,OAAO,KAAK;MACb"}
@@ -1,5 +1,4 @@
1
1
  import { AuthorizationResponse, NativeCredential, OAuth2ClientConfig, OAuth2Token, OidcToken, PkceParameters, UserInfo } from "./types.mjs";
2
- //#region src/oauth2/client.d.ts
3
2
  export declare const oauth2RedirectQuerySchema: import("zod/mini").ZodMiniObject<{
4
3
  code: import("zod/mini").ZodMiniOptional<import("zod/mini").ZodMiniString<string>>;
5
4
  state: import("zod/mini").ZodMiniOptional<import("zod/mini").ZodMiniString<string>>;
@@ -97,5 +96,4 @@ export declare class OAuth2Client {
97
96
  clientId: string;
98
97
  }>;
99
98
  }
100
- //#endregion
101
99
  //# sourceMappingURL=client.d.mts.map
@@ -1 +1 @@
1
- {"version":3,"file":"client.d.mts","names":["_$__types0.UserInfo"],"sources":["../../src/oauth2/client.ts"],"mappings":";;qBAkBa,8CAAyB;;;;;;;yBAQpC;qBAEW,uCAAkB;;;;;;;;;;yBAY7B;qBAEW;mBACM;EACjB,YAAY,QAAQ;MAIhB;MAIA;MAIA;;UAKU;UAUN;;UAKM;;;;;;UAaA;;;;;;UAcA;UAYA;EAIR,yBACJ,UACA,OACA;IAEA;IACA;IACA,OAAO;MACL,QAAQ;;EAYN,4BACJ,UACA,MACA;IAEA;IACA;IACA,OAAO;MACL;IAAU;IAAkB,OAAO;;;EAcjC,cACJ,UACA,UACA,OACA;IAEA;IACA;IACA,OAAO,cAAc;IACrB,WAAW;MACZ,QADYA;;EAOP,eAAe,UAAU;IAAgB;IAAkB;MAAoB;;;;;EAS/E,qBACJ,UACA,UACA;IAEA;IACA;IACA;MACE,QAAQ;EAON,cACJ,UACA,UACA;IAEA;IACA;IACA;MACD;;;;;EAWK,oBACJ,UACA,eAAe,kBAAkB,eACjC;IAEA;IACA,aAAa;IACb,OAAO,KAAK;MACb"}
1
+ {"version":3,"file":"client.d.mts","names":["_$__types0.UserInfo"],"sources":["../../src/oauth2/client.ts"],"mappings":";qBAkBa,8CAAyB;;;;;;;yBAQpC;qBAEW,uCAAkB;;;;;;;;;;yBAY7B;qBAEW;mBACM;EACjB,YAAY,QAAQ;MAIhB;MAIA;MAIA;;UAKU;UAUN;;UAKM;;;;;;UAaA;;;;;;UAcA;UAYA;EAIR,yBACJ,UACA,OACA;IAEA;IACA;IACA,OAAO;MACL,QAAQ;;EAYN,4BACJ,UACA,MACA;IAEA;IACA;IACA,OAAO;MACL;IAAU;IAAkB,OAAO;;;EAcjC,cACJ,UACA,UACA,OACA;IAEA;IACA;IACA,OAAO,cAAc;IACrB,WAAW;MACZ,QADYA;;EAOP,eAAe,UAAU;IAAgB;IAAkB;MAAoB;;;;;EAS/E,qBACJ,UACA,UACA;IAEA;IACA;IACA;MACE,QAAQ;EAON,cACJ,UACA,UACA;IAEA;IACA;IACA;MACD;;;;;EAWK,oBACJ,UACA,eAAe,kBAAkB,eACjC;IAEA;IACA,aAAa;IACb,OAAO,KAAK;MACb"}
@@ -1,7 +1,7 @@
1
1
  import { OAuth2Error } from "./error.mjs";
2
2
  import { invariant } from "@shware/utils";
3
3
  import { object, optional, string } from "zod/v4-mini";
4
- //#region src/oauth2/client.ts
4
+ // src/oauth2/client.ts
5
5
  const oauth2RedirectQuerySchema = object({
6
6
  code: optional(string()),
7
7
  state: optional(string()),
@@ -173,7 +173,6 @@ var OAuth2Client = class {
173
173
  function isOneTapProvider(provider) {
174
174
  return typeof provider.getTokenInfo === "function";
175
175
  }
176
- //#endregion
177
176
  export { OAuth2Client, googleOneTapSchema, oauth2RedirectQuerySchema };
178
177
 
179
178
  //# sourceMappingURL=client.mjs.map
@@ -1,5 +1,5 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
- //#region src/oauth2/error.ts
2
+ // src/oauth2/error.ts
3
3
  /** The registered error codes of `OAuth2ErrorType`, for checking untrusted input at runtime. */
4
4
  const OAUTH2_ERROR_TYPES = /* @__PURE__ */ new Set([
5
5
  "invalid_request",
@@ -29,14 +29,6 @@ var OAuth2Error = class OAuth2Error extends Error {
29
29
  Object.setPrototypeOf(this, OAuth2Error.prototype);
30
30
  }
31
31
  };
32
- var AuthenticationError = class AuthenticationError extends Error {
33
- constructor(message) {
34
- super(message);
35
- Object.setPrototypeOf(this, AuthenticationError.prototype);
36
- }
37
- };
38
- //#endregion
39
- exports.AuthenticationError = AuthenticationError;
40
32
  exports.OAuth2Error = OAuth2Error;
41
33
  exports.isKnownOAuth2ErrorType = isKnownOAuth2ErrorType;
42
34
 
@@ -1 +1 @@
1
- {"version":3,"file":"error.cjs","names":[],"sources":["../../src/oauth2/error.ts"],"sourcesContent":["// reference: https://datatracker.ietf.org/doc/html/rfc6749#section-4.2.2.1\nexport type OAuth2ErrorType =\n | 'invalid_request' // 400\n | 'invalid_client' // 401\n | 'invalid_grant' // 400\n | 'invalid_token' // 401\n | 'invalid_scope' // 400\n | 'unauthorized_client' // 401\n | 'unsupported_grant_type' // 400\n | 'unsupported_response_type' // 400\n | 'insufficient_scope' // 403\n | 'redirect_uri_mismatch' // 400\n | 'access_denied' // 400\n | 'server_error' // 500\n | 'temporarily_unavailable' // 503\n | (string & {});\n\n/** The registered error codes of `OAuth2ErrorType`, for checking untrusted input at runtime. */\nconst OAUTH2_ERROR_TYPES: ReadonlySet<string> = new Set([\n 'invalid_request',\n 'invalid_client',\n 'invalid_grant',\n 'invalid_token',\n 'invalid_scope',\n 'unauthorized_client',\n 'unsupported_grant_type',\n 'unsupported_response_type',\n 'insufficient_scope',\n 'redirect_uri_mismatch',\n 'access_denied',\n 'server_error',\n 'temporarily_unavailable',\n]);\n\nexport function isKnownOAuth2ErrorType(value: string): boolean {\n return OAUTH2_ERROR_TYPES.has(value);\n}\n\nexport class OAuth2Error extends Error {\n readonly status: number;\n readonly error: OAuth2ErrorType;\n\n constructor(status: number, error: OAuth2ErrorType, message?: string) {\n super(message ?? `OAuth2 error: ${error}`);\n this.status = status;\n this.error = error;\n Object.setPrototypeOf(this, OAuth2Error.prototype);\n }\n}\n\nexport class AuthenticationError extends Error {\n constructor(message: string) {\n super(message);\n Object.setPrototypeOf(this, AuthenticationError.prototype);\n }\n}\n"],"mappings":";;;AAkBA,MAAM,qCAA0C,IAAI,IAAI;CACtD;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;AACF,CAAC;AAED,SAAgB,uBAAuB,OAAwB;CAC7D,OAAO,mBAAmB,IAAI,KAAK;AACrC;AAEA,IAAa,cAAb,MAAa,oBAAoB,MAAM;CACrC;CACA;CAEA,YAAY,QAAgB,OAAwB,SAAkB;EACpE,MAAM,WAAW,iBAAiB,OAAO;EACzC,KAAK,SAAS;EACd,KAAK,QAAQ;EACb,OAAO,eAAe,MAAM,YAAY,SAAS;CACnD;AACF;AAEA,IAAa,sBAAb,MAAa,4BAA4B,MAAM;CAC7C,YAAY,SAAiB;EAC3B,MAAM,OAAO;EACb,OAAO,eAAe,MAAM,oBAAoB,SAAS;CAC3D;AACF"}
1
+ {"version":3,"file":"error.cjs","names":[],"sources":["../../src/oauth2/error.ts"],"sourcesContent":["// reference: https://datatracker.ietf.org/doc/html/rfc6749#section-4.2.2.1\nexport type OAuth2ErrorType =\n | 'invalid_request' // 400\n | 'invalid_client' // 401\n | 'invalid_grant' // 400\n | 'invalid_token' // 401\n | 'invalid_scope' // 400\n | 'unauthorized_client' // 401\n | 'unsupported_grant_type' // 400\n | 'unsupported_response_type' // 400\n | 'insufficient_scope' // 403\n | 'redirect_uri_mismatch' // 400\n | 'access_denied' // 400\n | 'server_error' // 500\n | 'temporarily_unavailable' // 503\n | (string & {});\n\n/** The registered error codes of `OAuth2ErrorType`, for checking untrusted input at runtime. */\nconst OAUTH2_ERROR_TYPES: ReadonlySet<string> = new Set([\n 'invalid_request',\n 'invalid_client',\n 'invalid_grant',\n 'invalid_token',\n 'invalid_scope',\n 'unauthorized_client',\n 'unsupported_grant_type',\n 'unsupported_response_type',\n 'insufficient_scope',\n 'redirect_uri_mismatch',\n 'access_denied',\n 'server_error',\n 'temporarily_unavailable',\n]);\n\nexport function isKnownOAuth2ErrorType(value: string): boolean {\n return OAUTH2_ERROR_TYPES.has(value);\n}\n\nexport class OAuth2Error extends Error {\n readonly status: number;\n readonly error: OAuth2ErrorType;\n\n constructor(status: number, error: OAuth2ErrorType, message?: string) {\n super(message ?? `OAuth2 error: ${error}`);\n this.status = status;\n this.error = error;\n Object.setPrototypeOf(this, OAuth2Error.prototype);\n }\n}\n"],"mappings":";;;AAkBA,MAAM,qCAA0C,IAAI,IAAI;CACtD;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;AACF,CAAC;AAED,SAAgB,uBAAuB,OAAwB;CAC7D,OAAO,mBAAmB,IAAI,KAAK;AACrC;AAEA,IAAa,cAAb,MAAa,oBAAoB,MAAM;CACrC;CACA;CAEA,YAAY,QAAgB,OAAwB,SAAkB;EACpE,MAAM,WAAW,iBAAiB,OAAO;EACzC,KAAK,SAAS;EACd,KAAK,QAAQ;EACb,OAAO,eAAe,MAAM,YAAY,SAAS;CACnD;AACF"}
@@ -1,4 +1,3 @@
1
- //#region src/oauth2/error.d.ts
2
1
  export type OAuth2ErrorType = 'invalid_request' | 'invalid_client' | 'invalid_grant' | 'invalid_token' | 'invalid_scope' | 'unauthorized_client' | 'unsupported_grant_type' | 'unsupported_response_type' | 'insufficient_scope' | 'redirect_uri_mismatch' | 'access_denied' | 'server_error' | 'temporarily_unavailable' | (string & {});
3
2
  export declare function isKnownOAuth2ErrorType(value: string): boolean;
4
3
  export declare class OAuth2Error extends Error {
@@ -6,8 +5,4 @@ export declare class OAuth2Error extends Error {
6
5
  readonly error: OAuth2ErrorType;
7
6
  constructor(status: number, error: OAuth2ErrorType, message?: string);
8
7
  }
9
- export declare class AuthenticationError extends Error {
10
- constructor(message: string);
11
- }
12
- //#endregion
13
8
  //# sourceMappingURL=error.d.cts.map
@@ -1 +1 @@
1
- {"version":3,"file":"error.d.cts","names":[],"sources":["../../src/oauth2/error.ts"],"mappings":";YACY;wBAiCI,uBAAuB;qBAI1B,oBAAoB;WACtB;WACA,OAAO;EAEhB,YAAY,gBAAgB,OAAO,iBAAiB;;qBAQzC,4BAA4B;EACvC,YAAY"}
1
+ {"version":3,"file":"error.d.cts","names":[],"sources":["../../src/oauth2/error.ts"],"mappings":"A,YACY;wBAiCI,uBAAuB;qBAI1B,oBAAoB;WACtB;WACA,OAAO;EAEhB,YAAY,gBAAgB,OAAO,iBAAiB"}
@@ -1,4 +1,3 @@
1
- //#region src/oauth2/error.d.ts
2
1
  export type OAuth2ErrorType = 'invalid_request' | 'invalid_client' | 'invalid_grant' | 'invalid_token' | 'invalid_scope' | 'unauthorized_client' | 'unsupported_grant_type' | 'unsupported_response_type' | 'insufficient_scope' | 'redirect_uri_mismatch' | 'access_denied' | 'server_error' | 'temporarily_unavailable' | (string & {});
3
2
  export declare function isKnownOAuth2ErrorType(value: string): boolean;
4
3
  export declare class OAuth2Error extends Error {
@@ -6,8 +5,4 @@ export declare class OAuth2Error extends Error {
6
5
  readonly error: OAuth2ErrorType;
7
6
  constructor(status: number, error: OAuth2ErrorType, message?: string);
8
7
  }
9
- export declare class AuthenticationError extends Error {
10
- constructor(message: string);
11
- }
12
- //#endregion
13
8
  //# sourceMappingURL=error.d.mts.map
@@ -1 +1 @@
1
- {"version":3,"file":"error.d.mts","names":[],"sources":["../../src/oauth2/error.ts"],"mappings":";YACY;wBAiCI,uBAAuB;qBAI1B,oBAAoB;WACtB;WACA,OAAO;EAEhB,YAAY,gBAAgB,OAAO,iBAAiB;;qBAQzC,4BAA4B;EACvC,YAAY"}
1
+ {"version":3,"file":"error.d.mts","names":[],"sources":["../../src/oauth2/error.ts"],"mappings":"A,YACY;wBAiCI,uBAAuB;qBAI1B,oBAAoB;WACtB;WACA,OAAO;EAEhB,YAAY,gBAAgB,OAAO,iBAAiB"}
@@ -1,4 +1,4 @@
1
- //#region src/oauth2/error.ts
1
+ // src/oauth2/error.ts
2
2
  /** The registered error codes of `OAuth2ErrorType`, for checking untrusted input at runtime. */
3
3
  const OAUTH2_ERROR_TYPES = /* @__PURE__ */ new Set([
4
4
  "invalid_request",
@@ -28,13 +28,6 @@ var OAuth2Error = class OAuth2Error extends Error {
28
28
  Object.setPrototypeOf(this, OAuth2Error.prototype);
29
29
  }
30
30
  };
31
- var AuthenticationError = class AuthenticationError extends Error {
32
- constructor(message) {
33
- super(message);
34
- Object.setPrototypeOf(this, AuthenticationError.prototype);
35
- }
36
- };
37
- //#endregion
38
- export { AuthenticationError, OAuth2Error, isKnownOAuth2ErrorType };
31
+ export { OAuth2Error, isKnownOAuth2ErrorType };
39
32
 
40
33
  //# sourceMappingURL=error.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"error.mjs","names":[],"sources":["../../src/oauth2/error.ts"],"sourcesContent":["// reference: https://datatracker.ietf.org/doc/html/rfc6749#section-4.2.2.1\nexport type OAuth2ErrorType =\n | 'invalid_request' // 400\n | 'invalid_client' // 401\n | 'invalid_grant' // 400\n | 'invalid_token' // 401\n | 'invalid_scope' // 400\n | 'unauthorized_client' // 401\n | 'unsupported_grant_type' // 400\n | 'unsupported_response_type' // 400\n | 'insufficient_scope' // 403\n | 'redirect_uri_mismatch' // 400\n | 'access_denied' // 400\n | 'server_error' // 500\n | 'temporarily_unavailable' // 503\n | (string & {});\n\n/** The registered error codes of `OAuth2ErrorType`, for checking untrusted input at runtime. */\nconst OAUTH2_ERROR_TYPES: ReadonlySet<string> = new Set([\n 'invalid_request',\n 'invalid_client',\n 'invalid_grant',\n 'invalid_token',\n 'invalid_scope',\n 'unauthorized_client',\n 'unsupported_grant_type',\n 'unsupported_response_type',\n 'insufficient_scope',\n 'redirect_uri_mismatch',\n 'access_denied',\n 'server_error',\n 'temporarily_unavailable',\n]);\n\nexport function isKnownOAuth2ErrorType(value: string): boolean {\n return OAUTH2_ERROR_TYPES.has(value);\n}\n\nexport class OAuth2Error extends Error {\n readonly status: number;\n readonly error: OAuth2ErrorType;\n\n constructor(status: number, error: OAuth2ErrorType, message?: string) {\n super(message ?? `OAuth2 error: ${error}`);\n this.status = status;\n this.error = error;\n Object.setPrototypeOf(this, OAuth2Error.prototype);\n }\n}\n\nexport class AuthenticationError extends Error {\n constructor(message: string) {\n super(message);\n Object.setPrototypeOf(this, AuthenticationError.prototype);\n }\n}\n"],"mappings":";;AAkBA,MAAM,qCAA0C,IAAI,IAAI;CACtD;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;AACF,CAAC;AAED,SAAgB,uBAAuB,OAAwB;CAC7D,OAAO,mBAAmB,IAAI,KAAK;AACrC;AAEA,IAAa,cAAb,MAAa,oBAAoB,MAAM;CACrC;CACA;CAEA,YAAY,QAAgB,OAAwB,SAAkB;EACpE,MAAM,WAAW,iBAAiB,OAAO;EACzC,KAAK,SAAS;EACd,KAAK,QAAQ;EACb,OAAO,eAAe,MAAM,YAAY,SAAS;CACnD;AACF;AAEA,IAAa,sBAAb,MAAa,4BAA4B,MAAM;CAC7C,YAAY,SAAiB;EAC3B,MAAM,OAAO;EACb,OAAO,eAAe,MAAM,oBAAoB,SAAS;CAC3D;AACF"}
1
+ {"version":3,"file":"error.mjs","names":[],"sources":["../../src/oauth2/error.ts"],"sourcesContent":["// reference: https://datatracker.ietf.org/doc/html/rfc6749#section-4.2.2.1\nexport type OAuth2ErrorType =\n | 'invalid_request' // 400\n | 'invalid_client' // 401\n | 'invalid_grant' // 400\n | 'invalid_token' // 401\n | 'invalid_scope' // 400\n | 'unauthorized_client' // 401\n | 'unsupported_grant_type' // 400\n | 'unsupported_response_type' // 400\n | 'insufficient_scope' // 403\n | 'redirect_uri_mismatch' // 400\n | 'access_denied' // 400\n | 'server_error' // 500\n | 'temporarily_unavailable' // 503\n | (string & {});\n\n/** The registered error codes of `OAuth2ErrorType`, for checking untrusted input at runtime. */\nconst OAUTH2_ERROR_TYPES: ReadonlySet<string> = new Set([\n 'invalid_request',\n 'invalid_client',\n 'invalid_grant',\n 'invalid_token',\n 'invalid_scope',\n 'unauthorized_client',\n 'unsupported_grant_type',\n 'unsupported_response_type',\n 'insufficient_scope',\n 'redirect_uri_mismatch',\n 'access_denied',\n 'server_error',\n 'temporarily_unavailable',\n]);\n\nexport function isKnownOAuth2ErrorType(value: string): boolean {\n return OAUTH2_ERROR_TYPES.has(value);\n}\n\nexport class OAuth2Error extends Error {\n readonly status: number;\n readonly error: OAuth2ErrorType;\n\n constructor(status: number, error: OAuth2ErrorType, message?: string) {\n super(message ?? `OAuth2 error: ${error}`);\n this.status = status;\n this.error = error;\n Object.setPrototypeOf(this, OAuth2Error.prototype);\n }\n}\n"],"mappings":";;AAkBA,MAAM,qCAA0C,IAAI,IAAI;CACtD;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;AACF,CAAC;AAED,SAAgB,uBAAuB,OAAwB;CAC7D,OAAO,mBAAmB,IAAI,KAAK;AACrC;AAEA,IAAa,cAAb,MAAa,oBAAoB,MAAM;CACrC;CACA;CAEA,YAAY,QAAgB,OAAwB,SAAkB;EACpE,MAAM,WAAW,iBAAiB,OAAO;EACzC,KAAK,SAAS;EACd,KAAK,QAAQ;EACb,OAAO,eAAe,MAAM,YAAY,SAAS;CACnD;AACF"}
@@ -1,5 +1,5 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
- //#region src/oauth2/name.ts
2
+ // src/oauth2/name.ts
3
3
  /**
4
4
  * Upper bound, in characters, on each name part taken from the client. Names that reach us outside
5
5
  * a signed token (Apple's form_post `user`, a native login body) are plain client input, so they
@@ -96,7 +96,6 @@ function isObject(value) {
96
96
  function withoutUndefined(value) {
97
97
  return Object.fromEntries(Object.entries(value).filter(([, v]) => v !== void 0));
98
98
  }
99
- //#endregion
100
99
  exports.MAX_NAME_PART_LENGTH = MAX_NAME_PART_LENGTH;
101
100
  exports.cleanNamePart = cleanNamePart;
102
101
  exports.cleanPersonName = cleanPersonName;
@@ -1,5 +1,4 @@
1
1
  import { PersonNameComponents, StandardClaims } from "./types.cjs";
2
- //#region src/oauth2/name.d.ts
3
2
  /**
4
3
  * Upper bound, in characters, on each name part taken from the client. Names that reach us outside
5
4
  * a signed token (Apple's form_post `user`, a native login body) are plain client input, so they
@@ -44,6 +43,5 @@ type NameClaims = Pick<StandardClaims, 'name' | 'given_name' | 'family_name' | '
44
43
  * Undefined parts are left out, so spreading the result never overwrites a claim with `undefined`.
45
44
  */
46
45
  export declare function nameClaims(parts: Omit<NameClaims, 'name'>): NameClaims;
47
- //#endregion
48
46
  export {};
49
47
  //# sourceMappingURL=name.d.cts.map
@@ -1 +1 @@
1
- {"version":3,"file":"name.d.cts","names":[],"sources":["../../src/oauth2/name.ts"],"mappings":";;;;;;;qBAOa;;;;;;;wBAaG,cACd,YACA,eACC,KAAK;;;;;;wBAcQ,cAAc;;iBAQb;EACf;IAAS;IAAoB;;EAC7B;;;;;;;wBAQc,eAAe,0BAA0B;;;;;wBAkCzC,gBAAgB,iBAAiB;KAU5C,aAAa,KAChB;;;;;wBAQc,WAAW,OAAO,KAAK,sBAAsB"}
1
+ {"version":3,"file":"name.d.cts","names":[],"sources":["../../src/oauth2/name.ts"],"mappings":";;;;;;qBAOa;;;;;;;wBAaG,cACd,YACA,eACC,KAAK;;;;;;wBAcQ,cAAc;;iBAQb;EACf;IAAS;IAAoB;;EAC7B;;;;;;;wBAQc,eAAe,0BAA0B;;;;;wBAkCzC,gBAAgB,iBAAiB;KAU5C,aAAa,KAChB;;;;;wBAQc,WAAW,OAAO,KAAK,sBAAsB"}