@effect-auth/core 0.1.0-alpha.0 → 0.1.0-alpha.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (147) hide show
  1. package/README.md +679 -36
  2. package/dist/AuditLog.d.ts +3 -0
  3. package/dist/AuditLog.d.ts.map +1 -1
  4. package/dist/AuditLog.js +6 -3
  5. package/dist/AuditLog.js.map +1 -1
  6. package/dist/AuthConfig.d.ts +51 -0
  7. package/dist/AuthConfig.d.ts.map +1 -0
  8. package/dist/AuthConfig.js +56 -0
  9. package/dist/AuthConfig.js.map +1 -0
  10. package/dist/AuthFlow.d.ts +295 -35
  11. package/dist/AuthFlow.d.ts.map +1 -1
  12. package/dist/AuthFlow.js +133 -6
  13. package/dist/AuthFlow.js.map +1 -1
  14. package/dist/AuthKernel.d.ts +3 -0
  15. package/dist/AuthKernel.d.ts.map +1 -0
  16. package/dist/AuthKernel.js +9 -0
  17. package/dist/AuthKernel.js.map +1 -0
  18. package/dist/Challenge.d.ts +22 -3
  19. package/dist/Challenge.d.ts.map +1 -1
  20. package/dist/Challenge.js +160 -1
  21. package/dist/Challenge.js.map +1 -1
  22. package/dist/Client.d.ts +36 -0
  23. package/dist/Client.d.ts.map +1 -0
  24. package/dist/Client.js +55 -0
  25. package/dist/Client.js.map +1 -0
  26. package/dist/Crypto.d.ts +9 -1
  27. package/dist/Crypto.d.ts.map +1 -1
  28. package/dist/Crypto.js +65 -1
  29. package/dist/Crypto.js.map +1 -1
  30. package/dist/D1Kysely.d.ts +43 -0
  31. package/dist/D1Kysely.d.ts.map +1 -0
  32. package/dist/D1Kysely.js +78 -0
  33. package/dist/D1Kysely.js.map +1 -0
  34. package/dist/EffectQbSqliteStorage.d.ts +183 -0
  35. package/dist/EffectQbSqliteStorage.d.ts.map +1 -0
  36. package/dist/EffectQbSqliteStorage.js +446 -0
  37. package/dist/EffectQbSqliteStorage.js.map +1 -0
  38. package/dist/EmailOtp.d.ts +117 -0
  39. package/dist/EmailOtp.d.ts.map +1 -0
  40. package/dist/EmailOtp.js +279 -0
  41. package/dist/EmailOtp.js.map +1 -0
  42. package/dist/EmailVerification.d.ts +121 -0
  43. package/dist/EmailVerification.d.ts.map +1 -0
  44. package/dist/EmailVerification.js +201 -0
  45. package/dist/EmailVerification.js.map +1 -0
  46. package/dist/HttpApi/Api.d.ts +175 -0
  47. package/dist/HttpApi/Api.d.ts.map +1 -0
  48. package/dist/HttpApi/Api.js +340 -0
  49. package/dist/HttpApi/Api.js.map +1 -0
  50. package/dist/HttpApi/Endpoints.d.ts +92 -0
  51. package/dist/HttpApi/Endpoints.d.ts.map +1 -0
  52. package/dist/HttpApi/Endpoints.js +48 -0
  53. package/dist/HttpApi/Endpoints.js.map +1 -0
  54. package/dist/HttpApi/Errors.d.ts +82 -0
  55. package/dist/HttpApi/Errors.d.ts.map +1 -0
  56. package/dist/HttpApi/Errors.js +184 -0
  57. package/dist/HttpApi/Errors.js.map +1 -0
  58. package/dist/HttpApi/Schemas.d.ts +86 -0
  59. package/dist/HttpApi/Schemas.d.ts.map +1 -0
  60. package/dist/HttpApi/Schemas.js +63 -0
  61. package/dist/HttpApi/Schemas.js.map +1 -0
  62. package/dist/HttpApi/Security.d.ts +147 -0
  63. package/dist/HttpApi/Security.d.ts.map +1 -0
  64. package/dist/HttpApi/Security.js +439 -0
  65. package/dist/HttpApi/Security.js.map +1 -0
  66. package/dist/HttpApi/Transport.d.ts +31 -0
  67. package/dist/HttpApi/Transport.d.ts.map +1 -0
  68. package/dist/HttpApi/Transport.js +169 -0
  69. package/dist/HttpApi/Transport.js.map +1 -0
  70. package/dist/HttpApi/index.d.ts +8 -0
  71. package/dist/HttpApi/index.d.ts.map +1 -0
  72. package/dist/HttpApi/index.js +7 -0
  73. package/dist/HttpApi/index.js.map +1 -0
  74. package/dist/HttpApi.d.ts +2 -0
  75. package/dist/HttpApi.d.ts.map +1 -0
  76. package/dist/HttpApi.js +2 -0
  77. package/dist/HttpApi.js.map +1 -0
  78. package/dist/Identifiers.d.ts.map +1 -1
  79. package/dist/Identifiers.js.map +1 -1
  80. package/dist/Internal.d.ts +7 -0
  81. package/dist/Internal.d.ts.map +1 -0
  82. package/dist/Internal.js +12 -0
  83. package/dist/Internal.js.map +1 -0
  84. package/dist/KyselyStorage.d.ts +67 -0
  85. package/dist/KyselyStorage.d.ts.map +1 -0
  86. package/dist/KyselyStorage.js +366 -0
  87. package/dist/KyselyStorage.js.map +1 -0
  88. package/dist/Mailer.d.ts +116 -0
  89. package/dist/Mailer.d.ts.map +1 -0
  90. package/dist/Mailer.js +101 -0
  91. package/dist/Mailer.js.map +1 -0
  92. package/dist/Password.d.ts +107 -0
  93. package/dist/Password.d.ts.map +1 -0
  94. package/dist/Password.js +252 -0
  95. package/dist/Password.js.map +1 -0
  96. package/dist/Policy.d.ts +7 -4
  97. package/dist/Policy.d.ts.map +1 -1
  98. package/dist/Policy.js +28 -5
  99. package/dist/Policy.js.map +1 -1
  100. package/dist/Privacy.d.ts +18 -0
  101. package/dist/Privacy.d.ts.map +1 -1
  102. package/dist/Privacy.js +63 -3
  103. package/dist/Privacy.js.map +1 -1
  104. package/dist/RateLimiter.d.ts +104 -0
  105. package/dist/RateLimiter.d.ts.map +1 -0
  106. package/dist/RateLimiter.js +118 -0
  107. package/dist/RateLimiter.js.map +1 -0
  108. package/dist/Sessions.d.ts +85 -11
  109. package/dist/Sessions.d.ts.map +1 -1
  110. package/dist/Sessions.js +424 -1
  111. package/dist/Sessions.js.map +1 -1
  112. package/dist/Storage.d.ts +162 -0
  113. package/dist/Storage.d.ts.map +1 -0
  114. package/dist/Storage.js +27 -0
  115. package/dist/Storage.js.map +1 -0
  116. package/dist/StorageMigrations.d.ts +8 -0
  117. package/dist/StorageMigrations.d.ts.map +1 -0
  118. package/dist/StorageMigrations.js +68 -0
  119. package/dist/StorageMigrations.js.map +1 -0
  120. package/dist/Testing.d.ts +9 -1
  121. package/dist/Testing.d.ts.map +1 -1
  122. package/dist/Testing.js +30 -2
  123. package/dist/Testing.js.map +1 -1
  124. package/dist/WaitUntil.d.ts +3 -0
  125. package/dist/WaitUntil.d.ts.map +1 -1
  126. package/dist/WaitUntil.js +6 -3
  127. package/dist/WaitUntil.js.map +1 -1
  128. package/dist/alchemy/cloudflare/RateLimitDurableObject.d.ts +34 -0
  129. package/dist/alchemy/cloudflare/RateLimitDurableObject.d.ts.map +1 -0
  130. package/dist/alchemy/cloudflare/RateLimitDurableObject.js +30 -0
  131. package/dist/alchemy/cloudflare/RateLimitDurableObject.js.map +1 -0
  132. package/dist/cloudflare/RateLimitDurableObject.d.ts +50 -0
  133. package/dist/cloudflare/RateLimitDurableObject.d.ts.map +1 -0
  134. package/dist/cloudflare/RateLimitDurableObject.js +51 -0
  135. package/dist/cloudflare/RateLimitDurableObject.js.map +1 -0
  136. package/dist/index.d.ts +7 -0
  137. package/dist/index.d.ts.map +1 -1
  138. package/dist/index.js +7 -0
  139. package/dist/index.js.map +1 -1
  140. package/dist/internal/RateLimitDurableObject.d.ts +32 -0
  141. package/dist/internal/RateLimitDurableObject.d.ts.map +1 -0
  142. package/dist/internal/RateLimitDurableObject.js +80 -0
  143. package/dist/internal/RateLimitDurableObject.js.map +1 -0
  144. package/migrations/0001_auth_storage.sql +32 -0
  145. package/migrations/0002_auth_password.sql +25 -0
  146. package/package.json +97 -16
  147. package/LICENSE +0 -21
@@ -0,0 +1,366 @@
1
+ import { Effect, Layer, Option } from "effect";
2
+ import { ChallengeId, CredentialId, Email, SessionId, UnixMillis, UserId, } from "./Identifiers.js";
3
+ import { CredentialStore, SessionStore, StorageError, UserStore, VerificationStore, } from "./Storage.js";
4
+ const jsonEncode = (value) => value === undefined ? null : JSON.stringify(value);
5
+ const jsonDecode = (value) => value === null ? undefined : JSON.parse(value);
6
+ const optionalUnixMillis = (value) => value === null ? undefined : UnixMillis(Number(value));
7
+ const decodeAmr = (value) => JSON.parse(value);
8
+ const omitUndefined = (record) => Object.fromEntries(Object.entries(record).filter(([, value]) => value !== undefined));
9
+ const sessionMetadataEnvelopeKey = "__effectAuthSession";
10
+ const isRecord = (value) => typeof value === "object" && value !== null && !Array.isArray(value);
11
+ const decodeSessionMetadata = (value) => {
12
+ const decoded = jsonDecode(value);
13
+ const envelope = isRecord(decoded)
14
+ ? decoded[sessionMetadataEnvelopeKey]
15
+ : undefined;
16
+ if (!isRecord(envelope) || envelope.version !== 1) {
17
+ return omitUndefined({
18
+ metadata: decoded,
19
+ });
20
+ }
21
+ return omitUndefined({
22
+ metadata: envelope.metadata,
23
+ claims: envelope.claims,
24
+ });
25
+ };
26
+ const encodeSessionMetadata = (row) => {
27
+ if (row.claims === undefined) {
28
+ return jsonEncode(row.metadata);
29
+ }
30
+ return jsonEncode({
31
+ [sessionMetadataEnvelopeKey]: omitUndefined({
32
+ version: 1,
33
+ metadata: row.metadata,
34
+ claims: row.claims,
35
+ }),
36
+ });
37
+ };
38
+ const decodeUserRow = (row) => omitUndefined({
39
+ id: UserId(row.id),
40
+ email: Email(row.email),
41
+ emailVerified: row.email_verified === 1,
42
+ createdAt: UnixMillis(Number(row.created_at)),
43
+ updatedAt: UnixMillis(Number(row.updated_at)),
44
+ disabledAt: optionalUnixMillis(row.disabled_at),
45
+ metadata: jsonDecode(row.metadata),
46
+ });
47
+ const decodePasswordCredentialRow = (row) => omitUndefined({
48
+ id: CredentialId(row.id),
49
+ userId: UserId(row.user_id),
50
+ passwordHash: row.password_hash ?? "",
51
+ createdAt: UnixMillis(Number(row.created_at)),
52
+ updatedAt: UnixMillis(Number(row.updated_at)),
53
+ revokedAt: optionalUnixMillis(row.revoked_at),
54
+ metadata: jsonDecode(row.metadata),
55
+ });
56
+ const decodeSessionRow = (row) => {
57
+ const sessionMetadata = decodeSessionMetadata(row.metadata);
58
+ return omitUndefined({
59
+ id: SessionId(row.id),
60
+ userId: UserId(row.user_id),
61
+ secretHash: row.secret_hash,
62
+ createdAt: UnixMillis(Number(row.created_at)),
63
+ expiresAt: UnixMillis(Number(row.expires_at)),
64
+ authTime: UnixMillis(Number(row.auth_time)),
65
+ aal: row.aal,
66
+ amr: decodeAmr(row.amr),
67
+ mfaVerifiedAt: optionalUnixMillis(row.mfa_verified_at),
68
+ metadata: sessionMetadata.metadata,
69
+ claims: sessionMetadata.claims,
70
+ revokedAt: optionalUnixMillis(row.revoked_at),
71
+ lastSeenAt: optionalUnixMillis(row.last_seen_at),
72
+ rotatedAt: optionalUnixMillis(row.rotated_at),
73
+ });
74
+ };
75
+ const decodeVerificationRow = (row) => omitUndefined({
76
+ id: ChallengeId(row.id),
77
+ type: row.type,
78
+ subject: row.subject,
79
+ secretHash: row.secret_hash === null ? undefined : row.secret_hash,
80
+ createdAt: UnixMillis(Number(row.created_at)),
81
+ expiresAt: UnixMillis(Number(row.expires_at)),
82
+ metadata: jsonDecode(row.metadata),
83
+ consumedAt: optionalUnixMillis(row.consumed_at),
84
+ });
85
+ const sessionInsert = (row) => ({
86
+ id: row.id,
87
+ user_id: row.userId,
88
+ secret_hash: row.secretHash,
89
+ created_at: Number(row.createdAt),
90
+ expires_at: Number(row.expiresAt),
91
+ auth_time: Number(row.authTime),
92
+ aal: row.aal,
93
+ amr: JSON.stringify(row.amr),
94
+ mfa_verified_at: row.mfaVerifiedAt === undefined ? null : Number(row.mfaVerifiedAt),
95
+ metadata: encodeSessionMetadata(row),
96
+ revoked_at: null,
97
+ last_seen_at: null,
98
+ rotated_at: null,
99
+ });
100
+ const userInsert = (row) => ({
101
+ id: row.id,
102
+ email: row.email,
103
+ email_verified: row.emailVerified ? 1 : 0,
104
+ created_at: Number(row.createdAt),
105
+ updated_at: Number(row.updatedAt),
106
+ disabled_at: row.disabledAt === undefined ? null : Number(row.disabledAt),
107
+ metadata: jsonEncode(row.metadata),
108
+ });
109
+ const passwordCredentialInsert = (row) => ({
110
+ id: row.id,
111
+ user_id: row.userId,
112
+ type: "password",
113
+ password_hash: row.passwordHash,
114
+ created_at: Number(row.createdAt),
115
+ updated_at: Number(row.updatedAt),
116
+ revoked_at: row.revokedAt === undefined ? null : Number(row.revokedAt),
117
+ metadata: jsonEncode(row.metadata),
118
+ });
119
+ const verificationInsert = (row) => ({
120
+ id: row.id,
121
+ type: row.type,
122
+ subject: row.subject,
123
+ secret_hash: row.secretHash ?? null,
124
+ created_at: Number(row.createdAt),
125
+ expires_at: Number(row.expiresAt),
126
+ metadata: jsonEncode(row.metadata),
127
+ consumed_at: null,
128
+ });
129
+ const kyselyError = (entity, operation, cause) => StorageError.fromUnknown(entity, operation, cause);
130
+ const runKysely = (entity, operation, evaluate) => Effect.tryPromise({
131
+ try: evaluate,
132
+ catch: (cause) => kyselyError(entity, operation, cause),
133
+ });
134
+ const asAuthDb = (db) => db;
135
+ const findUserById = (db, id, operation = "find") => {
136
+ const authDb = asAuthDb(db);
137
+ return runKysely("user", operation, async () => {
138
+ const row = await authDb
139
+ .selectFrom("auth_user")
140
+ .selectAll()
141
+ .where("id", "=", id)
142
+ .executeTakeFirst();
143
+ return row === undefined
144
+ ? Option.none()
145
+ : Option.some(decodeUserRow(row));
146
+ });
147
+ };
148
+ const findUserByEmail = (db, email, operation = "find") => {
149
+ const authDb = asAuthDb(db);
150
+ return runKysely("user", operation, async () => {
151
+ const row = await authDb
152
+ .selectFrom("auth_user")
153
+ .selectAll()
154
+ .where("email", "=", email)
155
+ .executeTakeFirst();
156
+ return row === undefined
157
+ ? Option.none()
158
+ : Option.some(decodeUserRow(row));
159
+ });
160
+ };
161
+ const findPasswordCredentialByUserId = (db, userId, operation = "find") => {
162
+ const authDb = asAuthDb(db);
163
+ return runKysely("credential", operation, async () => {
164
+ const row = await authDb
165
+ .selectFrom("auth_credential")
166
+ .selectAll()
167
+ .where("user_id", "=", userId)
168
+ .where("type", "=", "password")
169
+ .executeTakeFirst();
170
+ return row === undefined
171
+ ? Option.none()
172
+ : Option.some(decodePasswordCredentialRow(row));
173
+ });
174
+ };
175
+ const findSessionById = (db, id, operation = "find") => {
176
+ const authDb = asAuthDb(db);
177
+ return runKysely("session", operation, async () => {
178
+ const row = await authDb
179
+ .selectFrom("auth_session")
180
+ .selectAll()
181
+ .where("id", "=", id)
182
+ .executeTakeFirst();
183
+ return row === undefined
184
+ ? Option.none()
185
+ : Option.some(decodeSessionRow(row));
186
+ });
187
+ };
188
+ const findVerificationById = (db, id, operation = "find") => {
189
+ const authDb = asAuthDb(db);
190
+ return runKysely("verification", operation, async () => {
191
+ const row = await authDb
192
+ .selectFrom("auth_verification")
193
+ .selectAll()
194
+ .where("id", "=", id)
195
+ .executeTakeFirst();
196
+ return row === undefined
197
+ ? Option.none()
198
+ : Option.some(decodeVerificationRow(row));
199
+ });
200
+ };
201
+ export const makeKyselyUserStore = (db) => {
202
+ const authDb = asAuthDb(db);
203
+ return UserStore.make({
204
+ findById: (id) => findUserById(db, id),
205
+ findByEmail: (email) => findUserByEmail(db, email),
206
+ insert: (row) => runKysely("user", "insert", async () => {
207
+ await authDb
208
+ .insertInto("auth_user")
209
+ .values(userInsert(row))
210
+ .executeTakeFirst();
211
+ }),
212
+ markEmailVerified: (input) => runKysely("user", "markEmailVerified", () => authDb
213
+ .updateTable("auth_user")
214
+ .set({
215
+ email_verified: 1,
216
+ updated_at: Number(input.updatedAt),
217
+ })
218
+ .where("id", "=", input.userId)
219
+ .executeTakeFirst()).pipe(Effect.flatMap((result) => Number(result.numUpdatedRows) > 0
220
+ ? findUserById(db, input.userId, "markEmailVerified")
221
+ : Effect.succeed(Option.none()))),
222
+ });
223
+ };
224
+ export const makeKyselyCredentialStore = (db) => {
225
+ const authDb = asAuthDb(db);
226
+ return CredentialStore.make({
227
+ findPasswordByUserId: (userId) => findPasswordCredentialByUserId(db, userId),
228
+ insertPassword: (row) => runKysely("credential", "insert", async () => {
229
+ await authDb
230
+ .insertInto("auth_credential")
231
+ .values(passwordCredentialInsert(row))
232
+ .executeTakeFirst();
233
+ }),
234
+ });
235
+ };
236
+ export const makeKyselySessionStore = (db) => {
237
+ const authDb = asAuthDb(db);
238
+ return SessionStore.make({
239
+ findById: (id) => findSessionById(db, id),
240
+ insert: (row) => runKysely("session", "insert", async () => {
241
+ await authDb
242
+ .insertInto("auth_session")
243
+ .values(sessionInsert(row))
244
+ .executeTakeFirst();
245
+ }),
246
+ refresh: (input) => {
247
+ const update = {
248
+ expires_at: Number(input.expiresAt),
249
+ };
250
+ if (input.lastSeenAt !== undefined) {
251
+ update.last_seen_at = Number(input.lastSeenAt);
252
+ }
253
+ return runKysely("session", "refresh", () => authDb
254
+ .updateTable("auth_session")
255
+ .set(update)
256
+ .where("id", "=", input.sessionId)
257
+ .executeTakeFirst()).pipe(Effect.flatMap((result) => Number(result.numUpdatedRows) > 0
258
+ ? findSessionById(db, input.sessionId, "refresh")
259
+ : Effect.succeed(Option.none())));
260
+ },
261
+ rotate: (input) => {
262
+ const update = {
263
+ secret_hash: input.secretHash,
264
+ rotated_at: Number(input.rotatedAt),
265
+ };
266
+ if (input.expiresAt !== undefined) {
267
+ update.expires_at = Number(input.expiresAt);
268
+ }
269
+ return runKysely("session", "rotate", () => authDb
270
+ .updateTable("auth_session")
271
+ .set(update)
272
+ .where("id", "=", input.sessionId)
273
+ .executeTakeFirst()).pipe(Effect.flatMap((result) => Number(result.numUpdatedRows) > 0
274
+ ? findSessionById(db, input.sessionId, "rotate")
275
+ : Effect.succeed(Option.none())));
276
+ },
277
+ updateClaims: (input) => findSessionById(db, input.sessionId, "updateClaims").pipe(Effect.flatMap((rowOption) => {
278
+ if (Option.isNone(rowOption)) {
279
+ return Effect.succeed(Option.none());
280
+ }
281
+ return runKysely("session", "updateClaims", () => authDb
282
+ .updateTable("auth_session")
283
+ .set({
284
+ metadata: encodeSessionMetadata({
285
+ ...rowOption.value,
286
+ claims: input.claims,
287
+ }),
288
+ })
289
+ .where("id", "=", input.sessionId)
290
+ .executeTakeFirst()).pipe(Effect.flatMap((result) => Number(result.numUpdatedRows) > 0
291
+ ? findSessionById(db, input.sessionId, "updateClaims")
292
+ : Effect.succeed(Option.none())));
293
+ })),
294
+ revoke: (input) => runKysely("session", "revoke", async () => {
295
+ await authDb
296
+ .updateTable("auth_session")
297
+ .set({ revoked_at: Number(input.revokedAt) })
298
+ .where("id", "=", input.sessionId)
299
+ .executeTakeFirst();
300
+ }),
301
+ revokeAllForUser: (input) => runKysely("session", "revokeAllForUser", async () => {
302
+ await authDb
303
+ .updateTable("auth_session")
304
+ .set({ revoked_at: Number(input.revokedAt) })
305
+ .where("user_id", "=", input.userId)
306
+ .executeTakeFirst();
307
+ }),
308
+ });
309
+ };
310
+ export const makeKyselyVerificationStore = (db) => {
311
+ const authDb = asAuthDb(db);
312
+ return VerificationStore.make({
313
+ findById: (id) => findVerificationById(db, id),
314
+ insert: (row) => runKysely("verification", "insert", async () => {
315
+ await authDb
316
+ .insertInto("auth_verification")
317
+ .values(verificationInsert(row))
318
+ .executeTakeFirst();
319
+ }),
320
+ consume: (input) => {
321
+ let query = authDb
322
+ .updateTable("auth_verification")
323
+ .set({ consumed_at: Number(input.consumedAt) })
324
+ .where("id", "=", input.id)
325
+ .where("consumed_at", "is", null)
326
+ .where("expires_at", ">", Number(input.consumedAt));
327
+ if (input.type !== undefined) {
328
+ query = query.where("type", "=", input.type);
329
+ }
330
+ return runKysely("verification", "consume", () => query.executeTakeFirst()).pipe(Effect.flatMap((result) => Number(result.numUpdatedRows) > 0
331
+ ? findVerificationById(db, input.id, "consume")
332
+ : Effect.succeed(Option.none())));
333
+ },
334
+ deleteExpired: (input) => runKysely("verification", "deleteExpired", async () => {
335
+ if (input.limit === undefined) {
336
+ const result = await authDb
337
+ .deleteFrom("auth_verification")
338
+ .where("expires_at", "<=", Number(input.now))
339
+ .executeTakeFirst();
340
+ return Number(result.numDeletedRows);
341
+ }
342
+ const rows = await authDb
343
+ .selectFrom("auth_verification")
344
+ .select("id")
345
+ .where("expires_at", "<=", Number(input.now))
346
+ .limit(input.limit)
347
+ .execute();
348
+ if (rows.length === 0) {
349
+ return 0;
350
+ }
351
+ const result = await authDb
352
+ .deleteFrom("auth_verification")
353
+ .where("id", "in", rows.map((row) => row.id))
354
+ .executeTakeFirst();
355
+ return Number(result.numDeletedRows);
356
+ }),
357
+ });
358
+ };
359
+ export const makeKyselyStorage = (db) => ({
360
+ userStore: makeKyselyUserStore(db),
361
+ credentialStore: makeKyselyCredentialStore(db),
362
+ sessionStore: makeKyselySessionStore(db),
363
+ verificationStore: makeKyselyVerificationStore(db),
364
+ });
365
+ export const KyselyAuthStorageLive = (db) => Layer.mergeAll(Layer.succeed(UserStore)(makeKyselyUserStore(db)), Layer.succeed(CredentialStore)(makeKyselyCredentialStore(db)), Layer.succeed(SessionStore)(makeKyselySessionStore(db)), Layer.succeed(VerificationStore)(makeKyselyVerificationStore(db)));
366
+ //# sourceMappingURL=KyselyStorage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"KyselyStorage.js","sourceRoot":"","sources":["../src/KyselyStorage.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,116 @@
1
+ import { Context, Effect, Layer, Redacted } from "effect";
2
+ import type { ChallengeId, Email, UnixMillis, UserId } from "./Identifiers.js";
3
+ export type EmailAddress = Email | {
4
+ readonly email: Email;
5
+ readonly name?: string;
6
+ };
7
+ export interface EmailMessage {
8
+ readonly from?: EmailAddress;
9
+ readonly to: EmailAddress | readonly EmailAddress[];
10
+ readonly cc?: EmailAddress | readonly EmailAddress[];
11
+ readonly bcc?: EmailAddress | readonly EmailAddress[];
12
+ readonly replyTo?: EmailAddress;
13
+ readonly subject: string;
14
+ readonly text?: string;
15
+ readonly html?: string;
16
+ readonly headers?: Readonly<Record<string, string>>;
17
+ }
18
+ declare const EmailSendError_base: new <A extends Record<string, any> = {}>(args: import("effect/Types").VoidIfEmpty<{ readonly [P in keyof A as P extends "_tag" ? never : P]: A[P]; }>) => import("effect/Cause").YieldableError & {
19
+ readonly _tag: "EmailSendError";
20
+ } & Readonly<A>;
21
+ export declare class EmailSendError extends EmailSendError_base<{
22
+ readonly provider?: string;
23
+ readonly message: string;
24
+ readonly cause?: unknown;
25
+ }> {
26
+ }
27
+ export interface MailerService {
28
+ readonly send: (message: EmailMessage) => Effect.Effect<void, EmailSendError>;
29
+ }
30
+ declare const Mailer_base: Context.ServiceClass<Mailer, "auth/Mailer", MailerService>;
31
+ export declare class Mailer extends Mailer_base {
32
+ }
33
+ export declare namespace Mailer {
34
+ const make: (service: MailerService) => MailerService;
35
+ }
36
+ export interface AuthEmailBase {
37
+ readonly to: Email;
38
+ readonly locale?: string;
39
+ readonly metadata?: Readonly<Record<string, unknown>>;
40
+ }
41
+ export interface AuthEmailOtp extends AuthEmailBase {
42
+ readonly _tag: "EmailOtp";
43
+ readonly challengeId: ChallengeId;
44
+ readonly secret: Redacted.Redacted<string>;
45
+ readonly expiresAt: UnixMillis;
46
+ }
47
+ export interface AuthMagicLinkEmail extends AuthEmailBase {
48
+ readonly _tag: "MagicLink";
49
+ readonly challengeId: ChallengeId;
50
+ readonly url: string;
51
+ readonly expiresAt: UnixMillis;
52
+ }
53
+ export interface AuthEmailVerificationEmail extends AuthEmailBase {
54
+ readonly _tag: "EmailVerification";
55
+ readonly challengeId: ChallengeId;
56
+ readonly userId?: UserId;
57
+ readonly secret?: Redacted.Redacted<string>;
58
+ readonly url?: string;
59
+ readonly expiresAt: UnixMillis;
60
+ }
61
+ export type AuthEmail = AuthEmailOtp | AuthMagicLinkEmail | AuthEmailVerificationEmail;
62
+ export interface RenderedEmail {
63
+ readonly from?: EmailAddress;
64
+ readonly subject: string;
65
+ readonly text?: string;
66
+ readonly html?: string;
67
+ readonly headers?: Readonly<Record<string, string>>;
68
+ }
69
+ declare const AuthEmailTemplateError_base: new <A extends Record<string, any> = {}>(args: import("effect/Types").VoidIfEmpty<{ readonly [P in keyof A as P extends "_tag" ? never : P]: A[P]; }>) => import("effect/Cause").YieldableError & {
70
+ readonly _tag: "AuthEmailTemplateError";
71
+ } & Readonly<A>;
72
+ export declare class AuthEmailTemplateError extends AuthEmailTemplateError_base<{
73
+ readonly message: string;
74
+ readonly cause?: unknown;
75
+ }> {
76
+ }
77
+ export interface AuthEmailTemplatesService {
78
+ readonly render: (input: AuthEmail) => Effect.Effect<RenderedEmail, AuthEmailTemplateError>;
79
+ }
80
+ declare const AuthEmailTemplates_base: Context.ServiceClass<AuthEmailTemplates, "auth/AuthEmailTemplates", AuthEmailTemplatesService>;
81
+ export declare class AuthEmailTemplates extends AuthEmailTemplates_base {
82
+ }
83
+ export declare namespace AuthEmailTemplates {
84
+ const make: (service: AuthEmailTemplatesService) => AuthEmailTemplatesService;
85
+ }
86
+ declare const AuthMailerError_base: new <A extends Record<string, any> = {}>(args: import("effect/Types").VoidIfEmpty<{ readonly [P in keyof A as P extends "_tag" ? never : P]: A[P]; }>) => import("effect/Cause").YieldableError & {
87
+ readonly _tag: "AuthMailerError";
88
+ } & Readonly<A>;
89
+ export declare class AuthMailerError extends AuthMailerError_base<{
90
+ readonly message: string;
91
+ readonly cause?: unknown;
92
+ }> {
93
+ }
94
+ export interface AuthMailerService {
95
+ readonly send: (input: AuthEmail) => Effect.Effect<void, AuthMailerError>;
96
+ }
97
+ declare const AuthMailer_base: Context.ServiceClass<AuthMailer, "auth/AuthMailer", AuthMailerService>;
98
+ export declare class AuthMailer extends AuthMailer_base {
99
+ }
100
+ export declare namespace AuthMailer {
101
+ const make: (service: AuthMailerService) => AuthMailerService;
102
+ }
103
+ export interface AuthMailerOptions {
104
+ readonly from?: EmailAddress;
105
+ }
106
+ export interface AuthMailerDependencies extends AuthMailerOptions {
107
+ readonly mailer: MailerService;
108
+ readonly templates: AuthEmailTemplatesService;
109
+ }
110
+ export declare const makeDefaultAuthEmailTemplates: () => AuthEmailTemplatesService;
111
+ export declare const AuthEmailTemplatesLive: Layer.Layer<AuthEmailTemplates, never, never>;
112
+ export declare const makeAuthMailer: (dependencies: AuthMailerDependencies) => AuthMailerService;
113
+ export declare const AuthMailerLive: (options?: AuthMailerOptions) => Layer.Layer<AuthMailer, never, Mailer | AuthEmailTemplates>;
114
+ export declare const MailerNoopLive: Layer.Layer<Mailer, never, never>;
115
+ export {};
116
+ //# sourceMappingURL=Mailer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Mailer.d.ts","sourceRoot":"","sources":["../src/Mailer.ts"],"names":[],"mappings":"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"}
package/dist/Mailer.js ADDED
@@ -0,0 +1,101 @@
1
+ import { Context, Data, Effect, Layer, Redacted } from "effect";
2
+ export class EmailSendError extends Data.TaggedError("EmailSendError") {
3
+ }
4
+ export class Mailer extends Context.Service()("auth/Mailer") {
5
+ }
6
+ (function (Mailer) {
7
+ Mailer.make = (service) => Mailer.of(service);
8
+ })(Mailer || (Mailer = {}));
9
+ export class AuthEmailTemplateError extends Data.TaggedError("AuthEmailTemplateError") {
10
+ }
11
+ export class AuthEmailTemplates extends Context.Service()("auth/AuthEmailTemplates") {
12
+ }
13
+ (function (AuthEmailTemplates) {
14
+ AuthEmailTemplates.make = (service) => AuthEmailTemplates.of(service);
15
+ })(AuthEmailTemplates || (AuthEmailTemplates = {}));
16
+ export class AuthMailerError extends Data.TaggedError("AuthMailerError") {
17
+ }
18
+ export class AuthMailer extends Context.Service()("auth/AuthMailer") {
19
+ }
20
+ (function (AuthMailer) {
21
+ AuthMailer.make = (service) => AuthMailer.of(service);
22
+ })(AuthMailer || (AuthMailer = {}));
23
+ const expiresAtText = (expiresAt) => new Date(Number(expiresAt)).toISOString();
24
+ export const makeDefaultAuthEmailTemplates = () => AuthEmailTemplates.make({
25
+ render: Effect.fn("auth.email_templates.default.render")(function* (input) {
26
+ switch (input._tag) {
27
+ case "EmailOtp": {
28
+ const code = Redacted.value(input.secret);
29
+ return {
30
+ subject: "Your login code",
31
+ text: `Your login code is ${code}.\n\nThis code expires at ${expiresAtText(input.expiresAt)}.`,
32
+ };
33
+ }
34
+ case "MagicLink": {
35
+ return {
36
+ subject: "Your sign-in link",
37
+ text: `Use this link to sign in:\n\n${input.url}\n\nThis link expires at ${expiresAtText(input.expiresAt)}.`,
38
+ };
39
+ }
40
+ case "EmailVerification": {
41
+ if (input.url !== undefined) {
42
+ return {
43
+ subject: "Verify your email",
44
+ text: `Use this link to verify your email:\n\n${input.url}\n\nThis link expires at ${expiresAtText(input.expiresAt)}.`,
45
+ };
46
+ }
47
+ if (input.secret !== undefined) {
48
+ const code = Redacted.value(input.secret);
49
+ return {
50
+ subject: "Verify your email",
51
+ text: `Your email verification code is ${code}.\n\nThis code expires at ${expiresAtText(input.expiresAt)}.`,
52
+ };
53
+ }
54
+ return {
55
+ subject: "Verify your email",
56
+ text: `Use the email verification request before ${expiresAtText(input.expiresAt)}.`,
57
+ };
58
+ }
59
+ }
60
+ }),
61
+ });
62
+ export const AuthEmailTemplatesLive = Layer.succeed(AuthEmailTemplates, makeDefaultAuthEmailTemplates());
63
+ const emailMessageFromRendered = (input, rendered, options) => {
64
+ const from = rendered.from ?? options.from;
65
+ return {
66
+ ...(from === undefined ? {} : { from }),
67
+ to: input.to,
68
+ subject: rendered.subject,
69
+ ...(rendered.text === undefined ? {} : { text: rendered.text }),
70
+ ...(rendered.html === undefined ? {} : { html: rendered.html }),
71
+ ...(rendered.headers === undefined ? {} : { headers: rendered.headers }),
72
+ };
73
+ };
74
+ export const makeAuthMailer = (dependencies) => AuthMailer.make({
75
+ send: Effect.fn("auth.email.send")(function* (input) {
76
+ yield* Effect.annotateCurrentSpan("auth.email.kind", input._tag);
77
+ const rendered = yield* dependencies.templates.render(input).pipe(Effect.mapError((cause) => new AuthMailerError({
78
+ message: "Failed to render auth email",
79
+ cause,
80
+ })));
81
+ yield* dependencies.mailer
82
+ .send(emailMessageFromRendered(input, rendered, dependencies))
83
+ .pipe(Effect.mapError((cause) => new AuthMailerError({
84
+ message: "Failed to send auth email",
85
+ cause,
86
+ })));
87
+ }),
88
+ });
89
+ export const AuthMailerLive = (options = {}) => Layer.effect(AuthMailer)(Effect.gen(function* () {
90
+ const mailer = yield* Mailer;
91
+ const templates = yield* AuthEmailTemplates;
92
+ return makeAuthMailer({
93
+ ...options,
94
+ mailer,
95
+ templates,
96
+ });
97
+ }));
98
+ export const MailerNoopLive = Layer.succeed(Mailer, Mailer.make({
99
+ send: () => Effect.void,
100
+ }));
101
+ //# sourceMappingURL=Mailer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Mailer.js","sourceRoot":"","sources":["../src/Mailer.ts"],"names":[],"mappings":"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"}