@effect-auth/core 0.1.0-alpha.1 → 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.
- package/README.md +622 -61
- package/dist/AuditLog.d.ts.map +1 -1
- package/dist/AuditLog.js +1 -1
- package/dist/AuditLog.js.map +1 -1
- package/dist/AuthConfig.d.ts +51 -0
- package/dist/AuthConfig.d.ts.map +1 -0
- package/dist/AuthConfig.js +56 -0
- package/dist/AuthConfig.js.map +1 -0
- package/dist/AuthFlow.d.ts +292 -35
- package/dist/AuthFlow.d.ts.map +1 -1
- package/dist/AuthFlow.js +130 -6
- package/dist/AuthFlow.js.map +1 -1
- package/dist/AuthKernel.d.ts +3 -0
- package/dist/AuthKernel.d.ts.map +1 -0
- package/dist/AuthKernel.js +9 -0
- package/dist/AuthKernel.js.map +1 -0
- package/dist/Challenge.d.ts +19 -3
- package/dist/Challenge.d.ts.map +1 -1
- package/dist/Challenge.js +157 -1
- package/dist/Challenge.js.map +1 -1
- package/dist/Client.d.ts +36 -0
- package/dist/Client.d.ts.map +1 -0
- package/dist/Client.js +55 -0
- package/dist/Client.js.map +1 -0
- package/dist/Crypto.d.ts +6 -1
- package/dist/Crypto.d.ts.map +1 -1
- package/dist/Crypto.js +62 -1
- package/dist/Crypto.js.map +1 -1
- package/dist/D1Kysely.d.ts +6 -3
- package/dist/D1Kysely.d.ts.map +1 -1
- package/dist/D1Kysely.js +8 -5
- package/dist/D1Kysely.js.map +1 -1
- package/dist/EffectQbSqliteStorage.d.ts +183 -0
- package/dist/EffectQbSqliteStorage.d.ts.map +1 -0
- package/dist/EffectQbSqliteStorage.js +446 -0
- package/dist/EffectQbSqliteStorage.js.map +1 -0
- package/dist/EmailOtp.d.ts +117 -0
- package/dist/EmailOtp.d.ts.map +1 -0
- package/dist/EmailOtp.js +279 -0
- package/dist/EmailOtp.js.map +1 -0
- package/dist/EmailVerification.d.ts +121 -0
- package/dist/EmailVerification.d.ts.map +1 -0
- package/dist/EmailVerification.js +201 -0
- package/dist/EmailVerification.js.map +1 -0
- package/dist/HttpApi/Api.d.ts +175 -0
- package/dist/HttpApi/Api.d.ts.map +1 -0
- package/dist/HttpApi/Api.js +340 -0
- package/dist/HttpApi/Api.js.map +1 -0
- package/dist/HttpApi/Endpoints.d.ts +92 -0
- package/dist/HttpApi/Endpoints.d.ts.map +1 -0
- package/dist/HttpApi/Endpoints.js +48 -0
- package/dist/HttpApi/Endpoints.js.map +1 -0
- package/dist/HttpApi/Errors.d.ts +82 -0
- package/dist/HttpApi/Errors.d.ts.map +1 -0
- package/dist/HttpApi/Errors.js +184 -0
- package/dist/HttpApi/Errors.js.map +1 -0
- package/dist/HttpApi/Schemas.d.ts +86 -0
- package/dist/HttpApi/Schemas.d.ts.map +1 -0
- package/dist/HttpApi/Schemas.js +63 -0
- package/dist/HttpApi/Schemas.js.map +1 -0
- package/dist/HttpApi/Security.d.ts +147 -0
- package/dist/HttpApi/Security.d.ts.map +1 -0
- package/dist/HttpApi/Security.js +439 -0
- package/dist/HttpApi/Security.js.map +1 -0
- package/dist/HttpApi/Transport.d.ts +31 -0
- package/dist/HttpApi/Transport.d.ts.map +1 -0
- package/dist/HttpApi/Transport.js +169 -0
- package/dist/HttpApi/Transport.js.map +1 -0
- package/dist/HttpApi/index.d.ts +8 -0
- package/dist/HttpApi/index.d.ts.map +1 -0
- package/dist/HttpApi/index.js +7 -0
- package/dist/HttpApi/index.js.map +1 -0
- package/dist/HttpApi.d.ts +2 -0
- package/dist/HttpApi.d.ts.map +1 -0
- package/dist/HttpApi.js +2 -0
- package/dist/HttpApi.js.map +1 -0
- package/dist/Identifiers.d.ts.map +1 -1
- package/dist/Identifiers.js.map +1 -1
- package/dist/Internal.d.ts +7 -0
- package/dist/Internal.d.ts.map +1 -0
- package/dist/Internal.js +12 -0
- package/dist/Internal.js.map +1 -0
- package/dist/KyselyStorage.d.ts +28 -2
- package/dist/KyselyStorage.d.ts.map +1 -1
- package/dist/KyselyStorage.js +223 -33
- package/dist/KyselyStorage.js.map +1 -1
- package/dist/Mailer.d.ts +116 -0
- package/dist/Mailer.d.ts.map +1 -0
- package/dist/Mailer.js +101 -0
- package/dist/Mailer.js.map +1 -0
- package/dist/Password.d.ts +107 -0
- package/dist/Password.d.ts.map +1 -0
- package/dist/Password.js +252 -0
- package/dist/Password.js.map +1 -0
- package/dist/Policy.d.ts +7 -4
- package/dist/Policy.d.ts.map +1 -1
- package/dist/Policy.js +28 -5
- package/dist/Policy.js.map +1 -1
- package/dist/Privacy.d.ts +15 -0
- package/dist/Privacy.d.ts.map +1 -1
- package/dist/Privacy.js +58 -1
- package/dist/Privacy.js.map +1 -1
- package/dist/RateLimiter.d.ts +104 -0
- package/dist/RateLimiter.d.ts.map +1 -0
- package/dist/RateLimiter.js +118 -0
- package/dist/RateLimiter.js.map +1 -0
- package/dist/Sessions.d.ts +73 -11
- package/dist/Sessions.d.ts.map +1 -1
- package/dist/Sessions.js +412 -1
- package/dist/Sessions.js.map +1 -1
- package/dist/Storage.d.ts +60 -5
- package/dist/Storage.d.ts.map +1 -1
- package/dist/Storage.js +11 -1
- package/dist/Storage.js.map +1 -1
- package/dist/StorageMigrations.d.ts +2 -1
- package/dist/StorageMigrations.d.ts.map +1 -1
- package/dist/StorageMigrations.js +33 -2
- package/dist/StorageMigrations.js.map +1 -1
- package/dist/Testing.d.ts +9 -1
- package/dist/Testing.d.ts.map +1 -1
- package/dist/Testing.js +30 -2
- package/dist/Testing.js.map +1 -1
- package/dist/WaitUntil.d.ts.map +1 -1
- package/dist/WaitUntil.js +1 -1
- package/dist/WaitUntil.js.map +1 -1
- package/dist/alchemy/cloudflare/RateLimitDurableObject.d.ts +34 -0
- package/dist/alchemy/cloudflare/RateLimitDurableObject.d.ts.map +1 -0
- package/dist/alchemy/cloudflare/RateLimitDurableObject.js +30 -0
- package/dist/alchemy/cloudflare/RateLimitDurableObject.js.map +1 -0
- package/dist/cloudflare/RateLimitDurableObject.d.ts +50 -0
- package/dist/cloudflare/RateLimitDurableObject.d.ts.map +1 -0
- package/dist/cloudflare/RateLimitDurableObject.js +51 -0
- package/dist/cloudflare/RateLimitDurableObject.js.map +1 -0
- package/dist/index.d.ts +6 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +6 -0
- package/dist/index.js.map +1 -1
- package/dist/internal/RateLimitDurableObject.d.ts +32 -0
- package/dist/internal/RateLimitDurableObject.d.ts.map +1 -0
- package/dist/internal/RateLimitDurableObject.js +80 -0
- package/dist/internal/RateLimitDurableObject.js.map +1 -0
- package/migrations/0002_auth_password.sql +25 -0
- package/package.json +76 -20
package/dist/Sessions.js
CHANGED
|
@@ -1,4 +1,14 @@
|
|
|
1
|
-
import { Context, Data, Effect } from "effect";
|
|
1
|
+
import { Context, Data, Duration, Effect, Layer, Option } from "effect";
|
|
2
|
+
import { AuthSecrets, AuthSessionCookieConfig, AuthSessionsConfig, } from "./AuthConfig.js";
|
|
3
|
+
import { Crypto } from "./Crypto.js";
|
|
4
|
+
import { SessionId, SessionToken, UnixMillis } from "./Identifiers.js";
|
|
5
|
+
import { addMillis, currentUnixMillis, timingSafeEqualString, } from "./Internal.js";
|
|
6
|
+
import { SessionStore } from "./Storage.js";
|
|
7
|
+
export const defaultSessionTtlPolicy = {
|
|
8
|
+
idleTtl: Duration.days(30),
|
|
9
|
+
absoluteTtl: Duration.days(90),
|
|
10
|
+
refreshAfter: Duration.days(1),
|
|
11
|
+
};
|
|
2
12
|
export class SessionCreateError extends Data.TaggedError("SessionCreateError") {
|
|
3
13
|
}
|
|
4
14
|
export class SessionValidateError extends Data.TaggedError("SessionValidateError") {
|
|
@@ -7,6 +17,8 @@ export class SessionRefreshError extends Data.TaggedError("SessionRefreshError")
|
|
|
7
17
|
}
|
|
8
18
|
export class SessionRotateError extends Data.TaggedError("SessionRotateError") {
|
|
9
19
|
}
|
|
20
|
+
export class SessionUpdateClaimsError extends Data.TaggedError("SessionUpdateClaimsError") {
|
|
21
|
+
}
|
|
10
22
|
export class SessionRevokeError extends Data.TaggedError("SessionRevokeError") {
|
|
11
23
|
}
|
|
12
24
|
export class Sessions extends Context.Service()("auth/Sessions") {
|
|
@@ -14,11 +26,410 @@ export class Sessions extends Context.Service()("auth/Sessions") {
|
|
|
14
26
|
(function (Sessions) {
|
|
15
27
|
Sessions.make = (service) => Sessions.of(service);
|
|
16
28
|
})(Sessions || (Sessions = {}));
|
|
29
|
+
const resolveTtl = (ttl) => ttl ?? defaultSessionTtlPolicy;
|
|
30
|
+
const ttlMillis = (ttl) => Duration.toMillis(ttl);
|
|
31
|
+
const sessionExpiresAt = (now, authTime, ttl) => UnixMillis(Math.min(Number(addMillis(now, ttlMillis(ttl.idleTtl))), Number(addMillis(authTime, ttlMillis(ttl.absoluteTtl)))));
|
|
32
|
+
const parseSessionToken = (token) => {
|
|
33
|
+
const raw = String(token);
|
|
34
|
+
const separator = raw.indexOf(".");
|
|
35
|
+
if (separator <= 0 || separator === raw.length - 1) {
|
|
36
|
+
return undefined;
|
|
37
|
+
}
|
|
38
|
+
return {
|
|
39
|
+
sessionId: raw.slice(0, separator),
|
|
40
|
+
secret: raw.slice(separator + 1),
|
|
41
|
+
};
|
|
42
|
+
};
|
|
43
|
+
const makeSessionToken = (sessionId, secret) => `${sessionId}.${secret}`;
|
|
44
|
+
const hashSessionSecret = (crypto, key, secret) => crypto.hmacSha256({ key, data: secret });
|
|
45
|
+
const isExpired = (row, now, ttl) => row.revokedAt !== undefined ||
|
|
46
|
+
Number(row.expiresAt) <= Number(now) ||
|
|
47
|
+
Number(addMillis(row.authTime, ttlMillis(ttl.absoluteTtl))) <= Number(now);
|
|
48
|
+
const shouldRefresh = (row, now, ttl) => row.lastSeenAt === undefined ||
|
|
49
|
+
Number(now) - Number(row.lastSeenAt) >= ttlMillis(ttl.refreshAfter) ||
|
|
50
|
+
Number(row.expiresAt) - Number(now) <= ttlMillis(ttl.refreshAfter);
|
|
51
|
+
const issuedFromRow = (row, token) => ({
|
|
52
|
+
sessionId: row.id,
|
|
53
|
+
userId: row.userId,
|
|
54
|
+
token,
|
|
55
|
+
authTime: row.authTime,
|
|
56
|
+
expiresAt: row.expiresAt,
|
|
57
|
+
aal: row.aal,
|
|
58
|
+
amr: row.amr,
|
|
59
|
+
claims: row.claims,
|
|
60
|
+
});
|
|
61
|
+
const currentFromRow = (row) => ({
|
|
62
|
+
sessionId: row.id,
|
|
63
|
+
userId: row.userId,
|
|
64
|
+
authTime: row.authTime,
|
|
65
|
+
expiresAt: row.expiresAt,
|
|
66
|
+
aal: row.aal,
|
|
67
|
+
amr: row.amr,
|
|
68
|
+
claims: row.claims,
|
|
69
|
+
});
|
|
70
|
+
const validatedFromRow = (row, token) => ({
|
|
71
|
+
issued: issuedFromRow(row, token),
|
|
72
|
+
currentSession: currentFromRow(row),
|
|
73
|
+
actor: {
|
|
74
|
+
userId: row.userId,
|
|
75
|
+
sessionId: row.id,
|
|
76
|
+
},
|
|
77
|
+
});
|
|
78
|
+
export const makeSessions = (dependencies) => {
|
|
79
|
+
const ttl = resolveTtl(dependencies.ttl);
|
|
80
|
+
const sessionIdBytes = dependencies.sessionIdBytes ?? 16;
|
|
81
|
+
const sessionSecretBytes = dependencies.sessionSecretBytes ?? 32;
|
|
82
|
+
return Sessions.make({
|
|
83
|
+
create: Effect.fn("auth.session.create")(function* (input) {
|
|
84
|
+
yield* Effect.annotateCurrentSpan({
|
|
85
|
+
"auth.method": input.method,
|
|
86
|
+
"auth.aal": input.aal,
|
|
87
|
+
"auth.amr_count": input.amr.length,
|
|
88
|
+
});
|
|
89
|
+
const now = input.now ?? (yield* currentUnixMillis);
|
|
90
|
+
const inputTtl = resolveTtl(input.ttl ?? ttl);
|
|
91
|
+
const sessionId = SessionId(yield* dependencies.crypto.randomToken(sessionIdBytes).pipe(Effect.mapError((cause) => new SessionCreateError({
|
|
92
|
+
message: "Failed to generate session id",
|
|
93
|
+
cause,
|
|
94
|
+
}))));
|
|
95
|
+
const secret = yield* dependencies.crypto
|
|
96
|
+
.randomToken(sessionSecretBytes)
|
|
97
|
+
.pipe(Effect.mapError((cause) => new SessionCreateError({
|
|
98
|
+
message: "Failed to generate session secret",
|
|
99
|
+
cause,
|
|
100
|
+
})));
|
|
101
|
+
const token = makeSessionToken(sessionId, secret);
|
|
102
|
+
const secretHash = yield* hashSessionSecret(dependencies.crypto, dependencies.secret, secret).pipe(Effect.mapError((cause) => new SessionCreateError({
|
|
103
|
+
message: "Failed to hash session secret",
|
|
104
|
+
cause,
|
|
105
|
+
})));
|
|
106
|
+
const expiresAt = sessionExpiresAt(now, now, inputTtl);
|
|
107
|
+
yield* dependencies.sessionStore
|
|
108
|
+
.insert({
|
|
109
|
+
id: sessionId,
|
|
110
|
+
userId: input.userId,
|
|
111
|
+
secretHash,
|
|
112
|
+
createdAt: now,
|
|
113
|
+
expiresAt,
|
|
114
|
+
authTime: now,
|
|
115
|
+
aal: input.aal,
|
|
116
|
+
amr: input.amr,
|
|
117
|
+
claims: input.claims,
|
|
118
|
+
metadata: input.metadata,
|
|
119
|
+
})
|
|
120
|
+
.pipe(Effect.mapError((cause) => new SessionCreateError({
|
|
121
|
+
message: "Failed to store session",
|
|
122
|
+
cause,
|
|
123
|
+
})));
|
|
124
|
+
return {
|
|
125
|
+
sessionId,
|
|
126
|
+
userId: input.userId,
|
|
127
|
+
token,
|
|
128
|
+
authTime: now,
|
|
129
|
+
expiresAt,
|
|
130
|
+
aal: input.aal,
|
|
131
|
+
amr: input.amr,
|
|
132
|
+
claims: input.claims,
|
|
133
|
+
};
|
|
134
|
+
}),
|
|
135
|
+
validate: Effect.fn("auth.session.validate")(function* (token) {
|
|
136
|
+
const parsed = parseSessionToken(token);
|
|
137
|
+
if (parsed === undefined) {
|
|
138
|
+
yield* Effect.annotateCurrentSpan("auth.session.token_format", "invalid");
|
|
139
|
+
return yield* new SessionValidateError({
|
|
140
|
+
message: "Invalid session token",
|
|
141
|
+
});
|
|
142
|
+
}
|
|
143
|
+
yield* Effect.annotateCurrentSpan("auth.session.token_format", "opaque");
|
|
144
|
+
const now = yield* currentUnixMillis;
|
|
145
|
+
const rowOption = yield* dependencies.sessionStore
|
|
146
|
+
.findById(parsed.sessionId)
|
|
147
|
+
.pipe(Effect.mapError((cause) => new SessionValidateError({
|
|
148
|
+
message: "Failed to load session",
|
|
149
|
+
cause,
|
|
150
|
+
})));
|
|
151
|
+
if (Option.isNone(rowOption)) {
|
|
152
|
+
return yield* new SessionValidateError({
|
|
153
|
+
message: "Session not found",
|
|
154
|
+
});
|
|
155
|
+
}
|
|
156
|
+
const row = rowOption.value;
|
|
157
|
+
if (isExpired(row, now, ttl)) {
|
|
158
|
+
return yield* new SessionValidateError({ message: "Session expired" });
|
|
159
|
+
}
|
|
160
|
+
const secretHash = yield* hashSessionSecret(dependencies.crypto, dependencies.secret, parsed.secret).pipe(Effect.mapError((cause) => new SessionValidateError({
|
|
161
|
+
message: "Failed to hash session secret",
|
|
162
|
+
cause,
|
|
163
|
+
})));
|
|
164
|
+
const secretMatches = yield* timingSafeEqualString(dependencies.crypto, secretHash, row.secretHash).pipe(Effect.mapError((cause) => new SessionValidateError({
|
|
165
|
+
message: "Failed to compare session secret",
|
|
166
|
+
cause,
|
|
167
|
+
})));
|
|
168
|
+
if (!secretMatches) {
|
|
169
|
+
return yield* new SessionValidateError({
|
|
170
|
+
message: "Invalid session token",
|
|
171
|
+
});
|
|
172
|
+
}
|
|
173
|
+
return validatedFromRow(row, token);
|
|
174
|
+
}),
|
|
175
|
+
refresh: Effect.fn("auth.session.refresh")(function* (token) {
|
|
176
|
+
const parsed = parseSessionToken(token);
|
|
177
|
+
if (parsed === undefined) {
|
|
178
|
+
yield* Effect.annotateCurrentSpan("auth.session.token_format", "invalid");
|
|
179
|
+
return yield* new SessionRefreshError({
|
|
180
|
+
message: "Invalid session token",
|
|
181
|
+
});
|
|
182
|
+
}
|
|
183
|
+
yield* Effect.annotateCurrentSpan("auth.session.token_format", "opaque");
|
|
184
|
+
const now = yield* currentUnixMillis;
|
|
185
|
+
const rowOption = yield* dependencies.sessionStore
|
|
186
|
+
.findById(parsed.sessionId)
|
|
187
|
+
.pipe(Effect.mapError((cause) => new SessionRefreshError({
|
|
188
|
+
message: "Failed to load session",
|
|
189
|
+
cause,
|
|
190
|
+
})));
|
|
191
|
+
if (Option.isNone(rowOption)) {
|
|
192
|
+
return yield* new SessionRefreshError({ message: "Session not found" });
|
|
193
|
+
}
|
|
194
|
+
const row = rowOption.value;
|
|
195
|
+
if (isExpired(row, now, ttl)) {
|
|
196
|
+
return yield* new SessionRefreshError({ message: "Session expired" });
|
|
197
|
+
}
|
|
198
|
+
const secretHash = yield* hashSessionSecret(dependencies.crypto, dependencies.secret, parsed.secret).pipe(Effect.mapError((cause) => new SessionRefreshError({
|
|
199
|
+
message: "Failed to hash session secret",
|
|
200
|
+
cause,
|
|
201
|
+
})));
|
|
202
|
+
const secretMatches = yield* timingSafeEqualString(dependencies.crypto, secretHash, row.secretHash).pipe(Effect.mapError((cause) => new SessionRefreshError({
|
|
203
|
+
message: "Failed to compare session secret",
|
|
204
|
+
cause,
|
|
205
|
+
})));
|
|
206
|
+
if (!secretMatches) {
|
|
207
|
+
return yield* new SessionRefreshError({
|
|
208
|
+
message: "Invalid session token",
|
|
209
|
+
});
|
|
210
|
+
}
|
|
211
|
+
if (!shouldRefresh(row, now, ttl)) {
|
|
212
|
+
yield* Effect.annotateCurrentSpan("auth.session.refreshed", false);
|
|
213
|
+
return issuedFromRow(row, token);
|
|
214
|
+
}
|
|
215
|
+
const refreshed = yield* dependencies.sessionStore
|
|
216
|
+
.refresh({
|
|
217
|
+
sessionId: row.id,
|
|
218
|
+
expiresAt: sessionExpiresAt(now, row.authTime, ttl),
|
|
219
|
+
lastSeenAt: now,
|
|
220
|
+
})
|
|
221
|
+
.pipe(Effect.mapError((cause) => new SessionRefreshError({
|
|
222
|
+
message: "Failed to refresh session",
|
|
223
|
+
cause,
|
|
224
|
+
})));
|
|
225
|
+
if (Option.isNone(refreshed)) {
|
|
226
|
+
return yield* new SessionRefreshError({ message: "Session not found" });
|
|
227
|
+
}
|
|
228
|
+
yield* Effect.annotateCurrentSpan("auth.session.refreshed", true);
|
|
229
|
+
return issuedFromRow(refreshed.value, token);
|
|
230
|
+
}),
|
|
231
|
+
rotate: Effect.fn("auth.session.rotate")(function* (input) {
|
|
232
|
+
const now = yield* currentUnixMillis;
|
|
233
|
+
const secret = yield* dependencies.crypto
|
|
234
|
+
.randomToken(sessionSecretBytes)
|
|
235
|
+
.pipe(Effect.mapError((cause) => new SessionRotateError({
|
|
236
|
+
message: "Failed to generate session secret",
|
|
237
|
+
cause,
|
|
238
|
+
})));
|
|
239
|
+
const secretHash = yield* hashSessionSecret(dependencies.crypto, dependencies.secret, secret).pipe(Effect.mapError((cause) => new SessionRotateError({
|
|
240
|
+
message: "Failed to hash session secret",
|
|
241
|
+
cause,
|
|
242
|
+
})));
|
|
243
|
+
const rotated = yield* dependencies.sessionStore
|
|
244
|
+
.rotate({
|
|
245
|
+
sessionId: input.sessionId,
|
|
246
|
+
secretHash,
|
|
247
|
+
rotatedAt: now,
|
|
248
|
+
})
|
|
249
|
+
.pipe(Effect.mapError((cause) => new SessionRotateError({
|
|
250
|
+
message: "Failed to rotate session",
|
|
251
|
+
cause,
|
|
252
|
+
})));
|
|
253
|
+
if (Option.isNone(rotated)) {
|
|
254
|
+
return yield* new SessionRotateError({ message: "Session not found" });
|
|
255
|
+
}
|
|
256
|
+
return issuedFromRow(rotated.value, makeSessionToken(input.sessionId, secret));
|
|
257
|
+
}),
|
|
258
|
+
updateClaims: Effect.fn("auth.session.update_claims")(function* (input) {
|
|
259
|
+
yield* Effect.annotateCurrentSpan("auth.session.claims_updated", true);
|
|
260
|
+
const now = yield* currentUnixMillis;
|
|
261
|
+
const rowOption = yield* dependencies.sessionStore
|
|
262
|
+
.findById(input.sessionId)
|
|
263
|
+
.pipe(Effect.mapError((cause) => new SessionUpdateClaimsError({
|
|
264
|
+
message: "Failed to load session",
|
|
265
|
+
cause,
|
|
266
|
+
})));
|
|
267
|
+
if (Option.isNone(rowOption)) {
|
|
268
|
+
return yield* new SessionUpdateClaimsError({
|
|
269
|
+
message: "Session not found",
|
|
270
|
+
});
|
|
271
|
+
}
|
|
272
|
+
if (isExpired(rowOption.value, now, ttl)) {
|
|
273
|
+
return yield* new SessionUpdateClaimsError({
|
|
274
|
+
message: "Session expired",
|
|
275
|
+
});
|
|
276
|
+
}
|
|
277
|
+
const updated = yield* dependencies.sessionStore
|
|
278
|
+
.updateClaims({
|
|
279
|
+
sessionId: input.sessionId,
|
|
280
|
+
claims: input.claims,
|
|
281
|
+
})
|
|
282
|
+
.pipe(Effect.mapError((cause) => new SessionUpdateClaimsError({
|
|
283
|
+
message: "Failed to update session claims",
|
|
284
|
+
cause,
|
|
285
|
+
})));
|
|
286
|
+
if (Option.isNone(updated)) {
|
|
287
|
+
return yield* new SessionUpdateClaimsError({
|
|
288
|
+
message: "Session not found",
|
|
289
|
+
});
|
|
290
|
+
}
|
|
291
|
+
return currentFromRow(updated.value);
|
|
292
|
+
}),
|
|
293
|
+
revoke: Effect.fn("auth.session.revoke")(function* (input) {
|
|
294
|
+
const now = yield* currentUnixMillis;
|
|
295
|
+
yield* dependencies.sessionStore
|
|
296
|
+
.revoke({
|
|
297
|
+
sessionId: input.sessionId,
|
|
298
|
+
revokedAt: now,
|
|
299
|
+
reason: input.reason,
|
|
300
|
+
})
|
|
301
|
+
.pipe(Effect.mapError((cause) => new SessionRevokeError({
|
|
302
|
+
message: "Failed to revoke session",
|
|
303
|
+
cause,
|
|
304
|
+
})));
|
|
305
|
+
}),
|
|
306
|
+
revokeAllForUser: Effect.fn("auth.session.revoke_all_for_user")(function* (userId) {
|
|
307
|
+
const now = yield* currentUnixMillis;
|
|
308
|
+
yield* dependencies.sessionStore
|
|
309
|
+
.revokeAllForUser({
|
|
310
|
+
userId,
|
|
311
|
+
revokedAt: now,
|
|
312
|
+
})
|
|
313
|
+
.pipe(Effect.mapError((cause) => new SessionRevokeError({
|
|
314
|
+
message: "Failed to revoke user sessions",
|
|
315
|
+
cause,
|
|
316
|
+
})));
|
|
317
|
+
}),
|
|
318
|
+
});
|
|
319
|
+
};
|
|
320
|
+
export function SessionsLive(options) {
|
|
321
|
+
return Layer.effect(Sessions)(Effect.gen(function* () {
|
|
322
|
+
const crypto = yield* Crypto;
|
|
323
|
+
const sessionStore = yield* SessionStore;
|
|
324
|
+
const resolvedOptions = options ??
|
|
325
|
+
{
|
|
326
|
+
...(yield* AuthSessionsConfig),
|
|
327
|
+
secret: (yield* AuthSecrets).session,
|
|
328
|
+
};
|
|
329
|
+
return makeSessions({
|
|
330
|
+
...resolvedOptions,
|
|
331
|
+
crypto,
|
|
332
|
+
sessionStore,
|
|
333
|
+
});
|
|
334
|
+
}));
|
|
335
|
+
}
|
|
17
336
|
export class SessionCookie extends Context.Service()("auth/SessionCookie") {
|
|
18
337
|
}
|
|
19
338
|
(function (SessionCookie) {
|
|
20
339
|
SessionCookie.make = (service) => SessionCookie.of(service);
|
|
21
340
|
})(SessionCookie || (SessionCookie = {}));
|
|
341
|
+
export const defaultSessionCookieOptions = {
|
|
342
|
+
name: "__Host-session",
|
|
343
|
+
secure: true,
|
|
344
|
+
httpOnly: true,
|
|
345
|
+
sameSite: "lax",
|
|
346
|
+
path: "/",
|
|
347
|
+
};
|
|
348
|
+
const resolveSessionCookieOptions = (options = {}) => {
|
|
349
|
+
const resolved = {
|
|
350
|
+
...defaultSessionCookieOptions,
|
|
351
|
+
...options,
|
|
352
|
+
};
|
|
353
|
+
if (resolved.name.startsWith("__Host-")) {
|
|
354
|
+
return {
|
|
355
|
+
...resolved,
|
|
356
|
+
secure: true,
|
|
357
|
+
path: "/",
|
|
358
|
+
domain: undefined,
|
|
359
|
+
};
|
|
360
|
+
}
|
|
361
|
+
return resolved;
|
|
362
|
+
};
|
|
363
|
+
const sameSiteHeaderValue = (sameSite) => {
|
|
364
|
+
switch (sameSite) {
|
|
365
|
+
case "strict": {
|
|
366
|
+
return "Strict";
|
|
367
|
+
}
|
|
368
|
+
case "none": {
|
|
369
|
+
return "None";
|
|
370
|
+
}
|
|
371
|
+
case "lax": {
|
|
372
|
+
return "Lax";
|
|
373
|
+
}
|
|
374
|
+
}
|
|
375
|
+
};
|
|
376
|
+
const appendCookieAttributes = (parts, options) => {
|
|
377
|
+
if (options.httpOnly) {
|
|
378
|
+
parts.push("HttpOnly");
|
|
379
|
+
}
|
|
380
|
+
if (options.secure) {
|
|
381
|
+
parts.push("Secure");
|
|
382
|
+
}
|
|
383
|
+
parts.push(`SameSite=${sameSiteHeaderValue(options.sameSite)}`);
|
|
384
|
+
parts.push(`Path=${options.path}`);
|
|
385
|
+
if (options.domain !== undefined) {
|
|
386
|
+
parts.push(`Domain=${options.domain}`);
|
|
387
|
+
}
|
|
388
|
+
return parts;
|
|
389
|
+
};
|
|
390
|
+
const serializeSessionCookie = (options, value, expiresAt) => {
|
|
391
|
+
const parts = [`${options.name}=${encodeURIComponent(value)}`];
|
|
392
|
+
if (expiresAt !== undefined) {
|
|
393
|
+
parts.push(`Expires=${new Date(Number(expiresAt)).toUTCString()}`);
|
|
394
|
+
}
|
|
395
|
+
return appendCookieAttributes(parts, options).join("; ");
|
|
396
|
+
};
|
|
397
|
+
const serializeClearSessionCookie = (options) => appendCookieAttributes([`${options.name}=`, "Max-Age=0", "Expires=Thu, 01 Jan 1970 00:00:00 GMT"], options).join("; ");
|
|
398
|
+
const parseCookieHeader = (header, name) => {
|
|
399
|
+
if (header === null) {
|
|
400
|
+
return Option.none();
|
|
401
|
+
}
|
|
402
|
+
for (const part of header.split(";")) {
|
|
403
|
+
const trimmed = part.trim();
|
|
404
|
+
const separator = trimmed.indexOf("=");
|
|
405
|
+
if (separator <= 0) {
|
|
406
|
+
continue;
|
|
407
|
+
}
|
|
408
|
+
if (trimmed.slice(0, separator) !== name) {
|
|
409
|
+
continue;
|
|
410
|
+
}
|
|
411
|
+
try {
|
|
412
|
+
// decodeURIComponent throws URIError for malformed percent-encoding; treat that cookie as absent.
|
|
413
|
+
return Option.some(SessionToken(decodeURIComponent(trimmed.slice(separator + 1))));
|
|
414
|
+
}
|
|
415
|
+
catch {
|
|
416
|
+
return Option.none();
|
|
417
|
+
}
|
|
418
|
+
}
|
|
419
|
+
return Option.none();
|
|
420
|
+
};
|
|
421
|
+
export const makeSessionCookie = (options) => {
|
|
422
|
+
const resolved = resolveSessionCookieOptions(options);
|
|
423
|
+
return SessionCookie.make({
|
|
424
|
+
read: Effect.fn("auth.session_cookie.read")((request) => Effect.succeed(parseCookieHeader(request.headers.get("Cookie"), resolved.name))),
|
|
425
|
+
commit: Effect.fn("auth.session_cookie.commit")((issued) => Effect.succeed(serializeSessionCookie(resolved, issued.token, issued.expiresAt))),
|
|
426
|
+
clear: Effect.fn("auth.session_cookie.clear")(() => Effect.succeed(serializeClearSessionCookie(resolved)))(),
|
|
427
|
+
});
|
|
428
|
+
};
|
|
429
|
+
export const SessionCookieLive = (options) => Layer.effect(SessionCookie)(Effect.gen(function* () {
|
|
430
|
+
const resolvedOptions = options ?? (yield* AuthSessionCookieConfig);
|
|
431
|
+
return makeSessionCookie(resolvedOptions);
|
|
432
|
+
}));
|
|
22
433
|
export class CurrentSession extends Context.Service()("auth/CurrentSession") {
|
|
23
434
|
}
|
|
24
435
|
(function (CurrentSession) {
|
package/dist/Sessions.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Sessions.js","sourceRoot":"","sources":["../src/Sessions.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA;AA0E9C,MAAM,OAAO,kBAAmB,SAAQ,IAAI,CAAC,WAAW,CAAC,oBAAoB,CAG3E;CAAG;AAEL,MAAM,OAAO,oBAAqB,SAAQ,IAAI,CAAC,WAAW,CAAC,sBAAsB,CAG/E;CAAG;AAEL,MAAM,OAAO,mBAAoB,SAAQ,IAAI,CAAC,WAAW,CAAC,qBAAqB,CAG7E;CAAG;AAEL,MAAM,OAAO,kBAAmB,SAAQ,IAAI,CAAC,WAAW,CAAC,oBAAoB,CAG3E;CAAG;AAEL,MAAM,OAAO,kBAAmB,SAAQ,IAAI,CAAC,WAAW,CAAC,oBAAoB,CAG3E;CAAG;AAkBL,MAAM,OAAO,QAAS,SAAQ,OAAO,CAAC,OAAO,EAA6B,CAAC,eAAe,CAAC;CAAG;AAE9F,WAAiB,QAAQ;IACV,aAAI,GAAG,CAAC,OAAwB,EAAmB,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,OAAO,CAAC,CAAA;AACzF,CAAC,EAFgB,QAAQ,KAAR,QAAQ,QAExB;AAQD,MAAM,OAAO,aAAc,SAAQ,OAAO,CAAC,OAAO,EAAuC,CAAC,oBAAoB,CAAC;CAAG;AAElH,WAAiB,aAAa;IACf,kBAAI,GAAG,CAAC,OAA6B,EAAwB,EAAE,CAAC,aAAa,CAAC,EAAE,CAAC,OAAO,CAAC,CAAA;AACxG,CAAC,EAFgB,aAAa,KAAb,aAAa,QAE7B;AAED,MAAM,OAAO,cAAe,SAAQ,OAAO,CAAC,OAAO,EAAuC,CAAC,qBAAqB,CAAC;CAAG;AAEpH,WAAiB,cAAc;IAChB,mBAAI,GAAG,CAAC,OAA4B,EAAuB,EAAE,CAAC,cAAc,CAAC,EAAE,CAAC,OAAO,CAAC,CAAA;AACvG,CAAC,EAFgB,cAAc,KAAd,cAAc,QAE9B;AAED,MAAM,OAAO,YAAa,SAAQ,OAAO,CAAC,OAAO,EAAmC,CAAC,mBAAmB,CAAC;CAAG;AAE5G,WAAiB,YAAY;IACd,iBAAI,GAAG,CAAC,OAA0B,EAAqB,EAAE,CAAC,YAAY,CAAC,EAAE,CAAC,OAAO,CAAC,CAAA;AACjG,CAAC,EAFgB,YAAY,KAAZ,YAAY,QAE5B"}
|
|
1
|
+
{"version":3,"file":"Sessions.js","sourceRoot":"","sources":["../src/Sessions.ts"],"names":[],"mappings":"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"}
|
package/dist/Storage.d.ts
CHANGED
|
@@ -1,9 +1,10 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import type { Effect } from "effect";
|
|
2
|
+
import { Context } from "effect";
|
|
2
3
|
import type * as Option from "effect/Option";
|
|
3
4
|
import type { ChallengeType } from "./Challenge.js";
|
|
4
|
-
import type { ChallengeId, SessionId, UnixMillis, UserId } from "./Identifiers.js";
|
|
5
|
-
import type { AuthAssuranceLevel, AuthMethodReference } from "./Sessions.js";
|
|
6
|
-
export type StorageEntity = "session" | "verification" | (string & {});
|
|
5
|
+
import type { ChallengeId, CredentialId, Email, SessionId, UnixMillis, UserId } from "./Identifiers.js";
|
|
6
|
+
import type { AuthAssuranceLevel, AuthMethodReference, SessionClaims } from "./Sessions.js";
|
|
7
|
+
export type StorageEntity = "user" | "credential" | "session" | "verification" | (string & {});
|
|
7
8
|
export type StorageOperation = "find" | "insert" | "update" | "delete" | "consume" | (string & {});
|
|
8
9
|
declare const StorageError_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 & {
|
|
9
10
|
readonly _tag: "StorageError";
|
|
@@ -18,6 +19,54 @@ export declare class StorageError extends StorageError_base<{
|
|
|
18
19
|
export declare namespace StorageError {
|
|
19
20
|
const fromUnknown: (entity: StorageEntity, operation: StorageOperation, cause: unknown, message?: string) => StorageError;
|
|
20
21
|
}
|
|
22
|
+
export interface NewUserRow {
|
|
23
|
+
readonly id: UserId;
|
|
24
|
+
readonly email: Email;
|
|
25
|
+
readonly emailVerified: boolean;
|
|
26
|
+
readonly createdAt: UnixMillis;
|
|
27
|
+
readonly updatedAt: UnixMillis;
|
|
28
|
+
readonly disabledAt?: UnixMillis;
|
|
29
|
+
readonly metadata?: Readonly<Record<string, unknown>>;
|
|
30
|
+
}
|
|
31
|
+
export interface UserRow extends NewUserRow {
|
|
32
|
+
}
|
|
33
|
+
export interface UserMarkEmailVerifiedInput {
|
|
34
|
+
readonly userId: UserId;
|
|
35
|
+
readonly updatedAt: UnixMillis;
|
|
36
|
+
}
|
|
37
|
+
export interface UserStoreService {
|
|
38
|
+
readonly findById: (id: UserId) => Effect.Effect<Option.Option<UserRow>, StorageError>;
|
|
39
|
+
readonly findByEmail: (email: Email) => Effect.Effect<Option.Option<UserRow>, StorageError>;
|
|
40
|
+
readonly insert: (row: NewUserRow) => Effect.Effect<void, StorageError>;
|
|
41
|
+
readonly markEmailVerified: (input: UserMarkEmailVerifiedInput) => Effect.Effect<Option.Option<UserRow>, StorageError>;
|
|
42
|
+
}
|
|
43
|
+
declare const UserStore_base: Context.ServiceClass<UserStore, "auth/UserStore", UserStoreService>;
|
|
44
|
+
export declare class UserStore extends UserStore_base {
|
|
45
|
+
}
|
|
46
|
+
export declare namespace UserStore {
|
|
47
|
+
const make: (service: UserStoreService) => UserStoreService;
|
|
48
|
+
}
|
|
49
|
+
export interface NewPasswordCredentialRow {
|
|
50
|
+
readonly id: CredentialId;
|
|
51
|
+
readonly userId: UserId;
|
|
52
|
+
readonly passwordHash: string;
|
|
53
|
+
readonly createdAt: UnixMillis;
|
|
54
|
+
readonly updatedAt: UnixMillis;
|
|
55
|
+
readonly revokedAt?: UnixMillis;
|
|
56
|
+
readonly metadata?: Readonly<Record<string, unknown>>;
|
|
57
|
+
}
|
|
58
|
+
export interface PasswordCredentialRow extends NewPasswordCredentialRow {
|
|
59
|
+
}
|
|
60
|
+
export interface CredentialStoreService {
|
|
61
|
+
readonly findPasswordByUserId: (userId: UserId) => Effect.Effect<Option.Option<PasswordCredentialRow>, StorageError>;
|
|
62
|
+
readonly insertPassword: (row: NewPasswordCredentialRow) => Effect.Effect<void, StorageError>;
|
|
63
|
+
}
|
|
64
|
+
declare const CredentialStore_base: Context.ServiceClass<CredentialStore, "auth/CredentialStore", CredentialStoreService>;
|
|
65
|
+
export declare class CredentialStore extends CredentialStore_base {
|
|
66
|
+
}
|
|
67
|
+
export declare namespace CredentialStore {
|
|
68
|
+
const make: (service: CredentialStoreService) => CredentialStoreService;
|
|
69
|
+
}
|
|
21
70
|
export interface NewSessionRow {
|
|
22
71
|
readonly id: SessionId;
|
|
23
72
|
readonly userId: UserId;
|
|
@@ -26,7 +75,8 @@ export interface NewSessionRow {
|
|
|
26
75
|
readonly expiresAt: UnixMillis;
|
|
27
76
|
readonly authTime: UnixMillis;
|
|
28
77
|
readonly aal: AuthAssuranceLevel;
|
|
29
|
-
readonly amr:
|
|
78
|
+
readonly amr: readonly AuthMethodReference[];
|
|
79
|
+
readonly claims?: SessionClaims;
|
|
30
80
|
readonly mfaVerifiedAt?: UnixMillis;
|
|
31
81
|
readonly metadata?: Readonly<Record<string, unknown>>;
|
|
32
82
|
}
|
|
@@ -46,6 +96,10 @@ export interface SessionRotateStoreInput {
|
|
|
46
96
|
readonly rotatedAt: UnixMillis;
|
|
47
97
|
readonly expiresAt?: UnixMillis;
|
|
48
98
|
}
|
|
99
|
+
export interface SessionUpdateClaimsStoreInput {
|
|
100
|
+
readonly sessionId: SessionId;
|
|
101
|
+
readonly claims: SessionClaims;
|
|
102
|
+
}
|
|
49
103
|
export interface SessionRevokeStoreInput {
|
|
50
104
|
readonly sessionId: SessionId;
|
|
51
105
|
readonly revokedAt: UnixMillis;
|
|
@@ -61,6 +115,7 @@ export interface SessionStoreService {
|
|
|
61
115
|
readonly insert: (row: NewSessionRow) => Effect.Effect<void, StorageError>;
|
|
62
116
|
readonly refresh: (input: SessionRefreshStoreInput) => Effect.Effect<Option.Option<SessionRow>, StorageError>;
|
|
63
117
|
readonly rotate: (input: SessionRotateStoreInput) => Effect.Effect<Option.Option<SessionRow>, StorageError>;
|
|
118
|
+
readonly updateClaims: (input: SessionUpdateClaimsStoreInput) => Effect.Effect<Option.Option<SessionRow>, StorageError>;
|
|
64
119
|
readonly revoke: (input: SessionRevokeStoreInput) => Effect.Effect<void, StorageError>;
|
|
65
120
|
readonly revokeAllForUser: (input: SessionRevokeAllForUserStoreInput) => Effect.Effect<void, StorageError>;
|
|
66
121
|
}
|
package/dist/Storage.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Storage.d.ts","sourceRoot":"","sources":["../src/Storage.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"Storage.d.ts","sourceRoot":"","sources":["../src/Storage.ts"],"names":[],"mappings":"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"}
|
package/dist/Storage.js
CHANGED
|
@@ -1,9 +1,19 @@
|
|
|
1
|
-
import { Context, Data
|
|
1
|
+
import { Context, Data } from "effect";
|
|
2
2
|
export class StorageError extends Data.TaggedError("StorageError") {
|
|
3
3
|
}
|
|
4
4
|
(function (StorageError) {
|
|
5
5
|
StorageError.fromUnknown = (entity, operation, cause, message = `${entity} ${operation} failed`) => new StorageError({ entity, operation, message, cause });
|
|
6
6
|
})(StorageError || (StorageError = {}));
|
|
7
|
+
export class UserStore extends Context.Service()("auth/UserStore") {
|
|
8
|
+
}
|
|
9
|
+
(function (UserStore) {
|
|
10
|
+
UserStore.make = (service) => UserStore.of(service);
|
|
11
|
+
})(UserStore || (UserStore = {}));
|
|
12
|
+
export class CredentialStore extends Context.Service()("auth/CredentialStore") {
|
|
13
|
+
}
|
|
14
|
+
(function (CredentialStore) {
|
|
15
|
+
CredentialStore.make = (service) => CredentialStore.of(service);
|
|
16
|
+
})(CredentialStore || (CredentialStore = {}));
|
|
7
17
|
export class SessionStore extends Context.Service()("auth/SessionStore") {
|
|
8
18
|
}
|
|
9
19
|
(function (SessionStore) {
|
package/dist/Storage.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Storage.js","sourceRoot":"","sources":["../src/Storage.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"Storage.js","sourceRoot":"","sources":["../src/Storage.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AAiCvC,MAAM,OAAO,YAAa,SAAQ,IAAI,CAAC,WAAW,CAAC,cAAc,CAK/D;CAAG;AAEL,WAAiB,YAAY;IACd,wBAAW,GAAG,CACzB,MAAqB,EACrB,SAA2B,EAC3B,KAAc,EACd,OAAO,GAAG,GAAG,MAAM,IAAI,SAAS,SAAS,EAC3B,EAAE,CAAC,IAAI,YAAY,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC;AAC7E,CAAC,EAPgB,YAAY,KAAZ,YAAY,QAO5B;AAgCD,MAAM,OAAO,SAAU,SAAQ,OAAO,CAAC,OAAO,EAA+B,CAC3E,gBAAgB,CACjB;CAAG;AAEJ,WAAiB,SAAS;IACX,cAAI,GAAG,CAAC,OAAyB,EAAoB,EAAE,CAClE,SAAS,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC;AAC1B,CAAC,EAHgB,SAAS,KAAT,SAAS,QAGzB;AAuBD,MAAM,OAAO,eAAgB,SAAQ,OAAO,CAAC,OAAO,EAGjD,CAAC,sBAAsB,CAAC;CAAG;AAE9B,WAAiB,eAAe;IACjB,oBAAI,GAAG,CAClB,OAA+B,EACP,EAAE,CAAC,eAAe,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC;AAC3D,CAAC,EAJgB,eAAe,KAAf,eAAe,QAI/B;AA0ED,MAAM,OAAO,YAAa,SAAQ,OAAO,CAAC,OAAO,EAG9C,CAAC,mBAAmB,CAAC;CAAG;AAE3B,WAAiB,YAAY;IACd,iBAAI,GAAG,CAAC,OAA4B,EAAuB,EAAE,CACxE,YAAY,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC;AAC7B,CAAC,EAHgB,YAAY,KAAZ,YAAY,QAG5B;AA0CD,MAAM,OAAO,iBAAkB,SAAQ,OAAO,CAAC,OAAO,EAGnD,CAAC,wBAAwB,CAAC;CAAG;AAEhC,WAAiB,iBAAiB;IACnB,sBAAI,GAAG,CAClB,OAAiC,EACP,EAAE,CAAC,iBAAiB,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC;AAC/D,CAAC,EAJgB,iBAAiB,KAAjB,iBAAiB,QAIjC"}
|
|
@@ -3,5 +3,6 @@ export interface AuthStorageMigration {
|
|
|
3
3
|
readonly sql: string;
|
|
4
4
|
}
|
|
5
5
|
export declare const authStorageMigration001: AuthStorageMigration;
|
|
6
|
-
export declare const
|
|
6
|
+
export declare const authStorageMigration002: AuthStorageMigration;
|
|
7
|
+
export declare const authStorageMigrations: readonly [AuthStorageMigration, AuthStorageMigration];
|
|
7
8
|
//# sourceMappingURL=StorageMigrations.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"StorageMigrations.d.ts","sourceRoot":"","sources":["../src/StorageMigrations.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,EAAE,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"StorageMigrations.d.ts","sourceRoot":"","sources":["../src/StorageMigrations.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;CACtB;AAED,eAAO,MAAM,uBAAuB,EAAE,oBAkCrC,CAAC;AAEF,eAAO,MAAM,uBAAuB,EAAE,oBA2BrC,CAAC;AAEF,eAAO,MAAM,qBAAqB,uDAGxB,CAAC"}
|