@yielded/auth-persistence-drizzle 0.1.0-beta.17 → 0.1.0-beta.19
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 +8 -1
- package/dist/D1.d.mts +120 -120
- package/dist/Libsql.d.mts +154 -154
- package/dist/Mysql2.d.mts +166 -166
- package/dist/Pglite.d.mts +166 -166
- package/dist/Postgres.d.mts +152 -152
- package/dist/SqliteBun.d.mts +168 -168
- package/dist/SqliteDo.d.mts +237 -259
- package/dist/SqliteDo.mjs +30 -45
- package/dist/SqliteDo.mjs.map +1 -1
- package/dist/SqliteNode.d.mts +154 -154
- package/dist/SqliteWasm.d.mts +163 -163
- package/dist/drizzle/crypto.mjs +11 -0
- package/dist/drizzle/crypto.mjs.map +1 -0
- package/dist/drizzle/d1-identity.mjs +2 -2
- package/dist/drizzle/d1-identity.mjs.map +1 -1
- package/dist/drizzle/d1-oauth.d.mts +16 -16
- package/dist/drizzle/d1-oauth.mjs.map +1 -1
- package/dist/drizzle/d1-passkey.d.mts +6 -6
- package/dist/drizzle/d1-passkey.mjs.map +1 -1
- package/dist/drizzle/d1-password-prepared.mjs +3 -3
- package/dist/drizzle/d1-password-prepared.mjs.map +1 -1
- package/dist/drizzle/d1-passwords.d.mts +1 -1
- package/dist/drizzle/d1-passwords.mjs +1 -1
- package/dist/drizzle/d1-passwords.mjs.map +1 -1
- package/dist/drizzle/d1-phone.d.mts +3 -3
- package/dist/drizzle/d1-phone.mjs.map +1 -1
- package/dist/drizzle/d1-proofs.d.mts +1 -1
- package/dist/drizzle/d1-sessions.d.mts +1 -1
- package/dist/drizzle/d1-sessions.mjs +4 -3
- package/dist/drizzle/d1-sessions.mjs.map +1 -1
- package/dist/drizzle/d1-totp.d.mts +3 -3
- package/dist/drizzle/d1-totp.mjs.map +1 -1
- package/dist/drizzle/mysql-identity.mjs +2 -2
- package/dist/drizzle/mysql-identity.mjs.map +1 -1
- package/dist/drizzle/oauth-accounts.mjs +9 -8
- package/dist/drizzle/oauth-accounts.mjs.map +1 -1
- package/dist/drizzle/oauth-connected-collection.mjs +1 -1
- package/dist/drizzle/oauth-connected-collection.mjs.map +1 -1
- package/dist/drizzle/oauth-connected-custody.mjs +5 -4
- package/dist/drizzle/oauth-connected-custody.mjs.map +1 -1
- package/dist/drizzle/oauth-connected-drivers.mjs.map +1 -1
- package/dist/drizzle/oauth-connected-flow.mjs +8 -7
- package/dist/drizzle/oauth-connected-flow.mjs.map +1 -1
- package/dist/drizzle/oauth-connected-management.mjs +3 -2
- package/dist/drizzle/oauth-connected-management.mjs.map +1 -1
- package/dist/drizzle/oauth-connected-reference.mjs +8 -4
- package/dist/drizzle/oauth-connected-reference.mjs.map +1 -1
- package/dist/drizzle/oauth-connected-settlement.mjs +4 -4
- package/dist/drizzle/oauth-connected-settlement.mjs.map +1 -1
- package/dist/drizzle/oauth-connected-sign-in.mjs +11 -10
- package/dist/drizzle/oauth-connected-sign-in.mjs.map +1 -1
- package/dist/drizzle/oauth-connected-state.d.mts +265 -265
- package/dist/drizzle/oauth-connected-state.mjs +23 -20
- package/dist/drizzle/oauth-connected-state.mjs.map +1 -1
- package/dist/drizzle/oauth-connected-target.d.mts +105 -105
- package/dist/drizzle/oauth-connected-target.mjs.map +1 -1
- package/dist/drizzle/oauth-drivers.mjs.map +1 -1
- package/dist/drizzle/oauth-flow.mjs +1 -1
- package/dist/drizzle/oauth-flow.mjs.map +1 -1
- package/dist/drizzle/oauth-model.d.mts +4 -4
- package/dist/drizzle/oauth-model.mjs.map +1 -1
- package/dist/drizzle/oauth-registration.mjs +2 -2
- package/dist/drizzle/oauth-registration.mjs.map +1 -1
- package/dist/drizzle/oauth-state.mjs +11 -12
- package/dist/drizzle/oauth-state.mjs.map +1 -1
- package/dist/drizzle/oauth-target.d.mts +4 -4
- package/dist/drizzle/oauth-target.mjs.map +1 -1
- package/dist/drizzle/passkey-drivers.mjs.map +1 -1
- package/dist/drizzle/passkey-write-drivers.mjs.map +1 -1
- package/dist/drizzle/passkey-write-target.d.mts +1 -1
- package/dist/drizzle/password-prepared-sql.mjs +1 -1
- package/dist/drizzle/password-prepared-sql.mjs.map +1 -1
- package/dist/drizzle/password-prepared-state.mjs +1 -1
- package/dist/drizzle/pg-identity.mjs +2 -2
- package/dist/drizzle/pg-identity.mjs.map +1 -1
- package/dist/drizzle/phone-model.d.mts +2 -2
- package/dist/drizzle/phone-model.mjs +3 -3
- package/dist/drizzle/phone-model.mjs.map +1 -1
- package/dist/drizzle/phone-target.d.mts +1 -1
- package/dist/drizzle/phone-target.mjs +2 -2
- package/dist/drizzle/phone-target.mjs.map +1 -1
- package/dist/drizzle/sqlite-do-database.d.mts +29 -0
- package/dist/drizzle/sqlite-do-database.mjs +45 -0
- package/dist/drizzle/sqlite-do-database.mjs.map +1 -0
- package/dist/drizzle/sqlite-emails.mjs.map +1 -1
- package/dist/drizzle/sqlite-identity.mjs +2 -2
- package/dist/drizzle/sqlite-identity.mjs.map +1 -1
- package/dist/drizzle/sqlite-passwords.mjs.map +1 -1
- package/dist/drizzle/sqlite-proofs.mjs.map +1 -1
- package/dist/drizzle/sqlite-sessions.mjs.map +1 -1
- package/dist/drizzle/storage-validation.mjs +17 -9
- package/dist/drizzle/storage-validation.mjs.map +1 -1
- package/dist/drizzle/totp-state.mjs +8 -8
- package/dist/drizzle/totp-state.mjs.map +1 -1
- package/dist/drizzle/totp-target.d.mts +1 -1
- package/dist/drizzle/totp-target.mjs +2 -2
- package/dist/drizzle/totp-target.mjs.map +1 -1
- package/package.json +1 -1
- package/src/SqliteDo.ts +63 -70
- package/src/drizzle/crypto.ts +14 -0
- package/src/drizzle/d1-identity.ts +2 -2
- package/src/drizzle/d1-oauth.ts +14 -5
- package/src/drizzle/d1-passkey.ts +5 -1
- package/src/drizzle/d1-password-prepared.ts +11 -5
- package/src/drizzle/d1-passwords.ts +1 -1
- package/src/drizzle/d1-phone.ts +2 -1
- package/src/drizzle/d1-sessions.ts +8 -2
- package/src/drizzle/d1-totp.ts +6 -2
- package/src/drizzle/mysql-identity.ts +2 -2
- package/src/drizzle/oauth-accounts.ts +14 -13
- package/src/drizzle/oauth-connected-collection.ts +1 -1
- package/src/drizzle/oauth-connected-custody.ts +8 -6
- package/src/drizzle/oauth-connected-drivers.ts +9 -3
- package/src/drizzle/oauth-connected-flow.ts +6 -6
- package/src/drizzle/oauth-connected-management.ts +1 -1
- package/src/drizzle/oauth-connected-reference.ts +14 -9
- package/src/drizzle/oauth-connected-settlement.ts +4 -4
- package/src/drizzle/oauth-connected-sign-in.ts +11 -10
- package/src/drizzle/oauth-connected-state.ts +40 -25
- package/src/drizzle/oauth-connected-target.ts +9 -5
- package/src/drizzle/oauth-drivers.ts +13 -5
- package/src/drizzle/oauth-flow.ts +1 -1
- package/src/drizzle/oauth-model.ts +4 -4
- package/src/drizzle/oauth-registration.ts +2 -2
- package/src/drizzle/oauth-state.ts +17 -15
- package/src/drizzle/oauth-target.ts +11 -3
- package/src/drizzle/passkey-drivers.ts +7 -3
- package/src/drizzle/passkey-write-drivers.ts +11 -2
- package/src/drizzle/password-prepared-sql.ts +1 -1
- package/src/drizzle/pg-identity.ts +2 -2
- package/src/drizzle/phone-model.ts +3 -3
- package/src/drizzle/phone-target.ts +11 -4
- package/src/drizzle/sqlite-do-database.ts +87 -0
- package/src/drizzle/sqlite-emails.ts +1 -1
- package/src/drizzle/sqlite-identity.ts +2 -2
- package/src/drizzle/sqlite-passwords.ts +1 -1
- package/src/drizzle/sqlite-proofs.ts +2 -2
- package/src/drizzle/sqlite-sessions.ts +2 -2
- package/src/drizzle/storage-validation.ts +15 -6
- package/src/drizzle/totp-state.ts +8 -8
- package/src/drizzle/totp-target.ts +11 -5
|
@@ -12,7 +12,6 @@ import {
|
|
|
12
12
|
import type { AnyRelations } from "drizzle-orm";
|
|
13
13
|
import type { EffectLibsqlDatabase } from "drizzle-orm/effect-libsql";
|
|
14
14
|
import type { EffectSQLiteBunDatabase } from "drizzle-orm/effect-sqlite-bun";
|
|
15
|
-
import type { EffectSQLiteDoDatabase } from "drizzle-orm/effect-sqlite-do";
|
|
16
15
|
import type { EffectSQLiteNodeDatabase } from "drizzle-orm/effect-sqlite-node";
|
|
17
16
|
import type { EffectSQLiteWasmDatabase } from "drizzle-orm/effect-sqlite-wasm";
|
|
18
17
|
import type { AnySQLiteTable } from "drizzle-orm/sqlite-core";
|
|
@@ -40,6 +39,7 @@ import {
|
|
|
40
39
|
makeTargetSessionStepUpServices,
|
|
41
40
|
coordinateTargetSessionStepUp,
|
|
42
41
|
} from "./session-target";
|
|
42
|
+
import type { DatabaseValue } from "./sqlite-do-database";
|
|
43
43
|
import {
|
|
44
44
|
type TransactionService,
|
|
45
45
|
acquireTransactionService,
|
|
@@ -50,7 +50,7 @@ import type { SuppliedService } from "./SuppliedService";
|
|
|
50
50
|
type Database =
|
|
51
51
|
| EffectLibsqlDatabase<AnyRelations>
|
|
52
52
|
| EffectSQLiteBunDatabase<AnyRelations>
|
|
53
|
-
|
|
|
53
|
+
| DatabaseValue<AnyRelations>
|
|
54
54
|
| EffectSQLiteNodeDatabase<AnyRelations>
|
|
55
55
|
| EffectSQLiteWasmDatabase<AnyRelations>;
|
|
56
56
|
type TransactionOf<D extends Database> = Parameters<Parameters<D["transaction"]>[0]>[0];
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
import {
|
|
2
2
|
NativeDatabase,
|
|
3
3
|
PersistenceMappingError,
|
|
4
|
-
|
|
4
|
+
validateStorageBatch,
|
|
5
|
+
type StorageValidation,
|
|
5
6
|
} from "@yielded/auth-persistence/Adapter";
|
|
6
7
|
import { getTableColumns, getTableName, is, Table } from "drizzle-orm";
|
|
7
8
|
import { getTableConfig as getMysqlTableConfig, MySqlTable } from "drizzle-orm/mysql-core";
|
|
@@ -243,6 +244,8 @@ export const validateDrizzleStorage = Effect.fnUntraced(
|
|
|
243
244
|
|
|
244
245
|
const { $client: client } = yield* NativeDatabase;
|
|
245
246
|
|
|
247
|
+
const batches = new Map<"pg" | "mysql" | "sqlite", StorageValidation[]>();
|
|
248
|
+
|
|
246
249
|
for (const plan of physical) {
|
|
247
250
|
const pg = is(plan.table, PgTable);
|
|
248
251
|
const mysql = is(plan.table, MySqlTable);
|
|
@@ -255,15 +258,21 @@ export const validateDrizzleStorage = Effect.fnUntraced(
|
|
|
255
258
|
|
|
256
259
|
const columns = getTableColumns(plan.table);
|
|
257
260
|
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
+
const dialect = pg ? "pg" : mysql ? "mysql" : "sqlite";
|
|
262
|
+
const batch = batches.get(dialect) ?? [];
|
|
263
|
+
|
|
264
|
+
batch.push({
|
|
265
|
+
table: {
|
|
261
266
|
name: getTableName(plan.table),
|
|
262
267
|
...(schema === undefined ? {} : { schema }),
|
|
263
268
|
columns: Object.fromEntries(plan.keys.map((key) => [key, { name: columns[key]!.name }])),
|
|
264
269
|
},
|
|
265
|
-
[plan.keys],
|
|
266
|
-
)
|
|
270
|
+
required: [plan.keys],
|
|
271
|
+
});
|
|
272
|
+
batches.set(dialect, batch);
|
|
273
|
+
}
|
|
274
|
+
for (const [dialect, requirements] of batches) {
|
|
275
|
+
yield* validateStorageBatch(dialect, requirements).pipe(
|
|
267
276
|
Effect.provideService(SqlClient, client),
|
|
268
277
|
Effect.mapError(() =>
|
|
269
278
|
PersistenceMappingError.make({
|
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import { randomId, digest } from "@yielded/auth-crypto";
|
|
2
1
|
import { AuthenticationRequirement, SecurityRevision } from "@yielded/auth/Sessions";
|
|
3
2
|
import {
|
|
4
3
|
TotpUnavailable,
|
|
@@ -11,6 +10,7 @@ import {
|
|
|
11
10
|
import { sql, type SQL } from "drizzle-orm";
|
|
12
11
|
import { Context, Effect, Schema } from "effect";
|
|
13
12
|
|
|
13
|
+
import { randomId, digest } from "./crypto";
|
|
14
14
|
import { both, makeTransactionRows, type TransactionOwner } from "./transaction-owner";
|
|
15
15
|
export const unavailable = () => TotpUnavailable.make({});
|
|
16
16
|
|
|
@@ -59,7 +59,7 @@ export const captureTotp = Effect.fn("TotpNative.capture")(function* (
|
|
|
59
59
|
)
|
|
60
60
|
return undefined;
|
|
61
61
|
|
|
62
|
-
const scope = scopeFor(mapping.moduleId, subjectId),
|
|
62
|
+
const scope = yield* scopeFor(mapping.moduleId, subjectId),
|
|
63
63
|
found = yield* owner.read(factor.table, equal(factor.table, { [factor.scope]: scope }), {
|
|
64
64
|
limit: 1,
|
|
65
65
|
}),
|
|
@@ -140,7 +140,7 @@ export const mutateTotp = Effect.fn("TotpNative.mutate")(function* (
|
|
|
140
140
|
const guards: SQL[] = [];
|
|
141
141
|
const credentialGuards: { credentialId: string; condition: SQL }[] = [];
|
|
142
142
|
|
|
143
|
-
const commandScope = digest(
|
|
143
|
+
const commandScope = yield* digest(
|
|
144
144
|
`effect-auth/totp/command/v1/${mapping.moduleId.length}:${mapping.moduleId}/${input.subjectId.length}:${input.subjectId}/${input.commandId}`,
|
|
145
145
|
);
|
|
146
146
|
|
|
@@ -413,7 +413,7 @@ export const mutateTotp = Effect.fn("TotpNative.mutate")(function* (
|
|
|
413
413
|
secret: null,
|
|
414
414
|
pending: null,
|
|
415
415
|
recoveryDigests: [],
|
|
416
|
-
revision: randomId
|
|
416
|
+
revision: yield* randomId,
|
|
417
417
|
};
|
|
418
418
|
semantic = true;
|
|
419
419
|
}
|
|
@@ -428,7 +428,7 @@ export const mutateTotp = Effect.fn("TotpNative.mutate")(function* (
|
|
|
428
428
|
secret: null,
|
|
429
429
|
pending: null,
|
|
430
430
|
recoveryDigests: [],
|
|
431
|
-
revision: randomId
|
|
431
|
+
revision: yield* randomId,
|
|
432
432
|
};
|
|
433
433
|
else {
|
|
434
434
|
if (new Set(action.recoveryDigests).size !== 10) return reject;
|
|
@@ -436,7 +436,7 @@ export const mutateTotp = Effect.fn("TotpNative.mutate")(function* (
|
|
|
436
436
|
}
|
|
437
437
|
}
|
|
438
438
|
}
|
|
439
|
-
next = { ...next, version: randomId
|
|
439
|
+
next = { ...next, version: yield* randomId };
|
|
440
440
|
|
|
441
441
|
const subject = mapping.subject,
|
|
442
442
|
factor = mapping.factor,
|
|
@@ -445,7 +445,7 @@ export const mutateTotp = Effect.fn("TotpNative.mutate")(function* (
|
|
|
445
445
|
const subjectKey = { [subject.id]: nativeId };
|
|
446
446
|
|
|
447
447
|
if (semantic) {
|
|
448
|
-
const revision = randomId
|
|
448
|
+
const revision = yield* randomId,
|
|
449
449
|
updates = {
|
|
450
450
|
[subject.securityRevision]: revision,
|
|
451
451
|
[subject.factorEnabled]: subject.encodeEnabled(next.secret !== null),
|
|
@@ -500,7 +500,7 @@ export const mutateTotp = Effect.fn("TotpNative.mutate")(function* (
|
|
|
500
500
|
const values = factor.encodeInsert({
|
|
501
501
|
scope: commandScope,
|
|
502
502
|
state: "totp-command/v1",
|
|
503
|
-
version: randomId
|
|
503
|
+
version: yield* randomId,
|
|
504
504
|
});
|
|
505
505
|
|
|
506
506
|
invariant(values[factor.scope] === commandScope && values[factor.state] === "totp-command/v1");
|
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import { randomId } from "@yielded/auth-crypto";
|
|
2
1
|
import { NativeDatabase } from "@yielded/auth-persistence/Adapter";
|
|
3
2
|
import { LifecycleHooks } from "@yielded/auth/Hooks";
|
|
4
3
|
import {
|
|
@@ -10,9 +9,10 @@ import {
|
|
|
10
9
|
} from "@yielded/auth/Totp";
|
|
11
10
|
import type { Table } from "drizzle-orm";
|
|
12
11
|
/* oxlint-disable no-explicit-any -- shared native implementation; driver entrypoints retain exact database and table types. */
|
|
13
|
-
import { Context, Effect, Schema } from "effect";
|
|
12
|
+
import { type Crypto, Context, Effect, Schema } from "effect";
|
|
14
13
|
import type { Statement } from "effect/sql/Statement";
|
|
15
14
|
|
|
15
|
+
import { randomId } from "./crypto";
|
|
16
16
|
import type { PersistenceMappingError } from "./model";
|
|
17
17
|
import { nativeDatabase } from "./native-database";
|
|
18
18
|
import { validateDrizzleStorage } from "./storage-validation";
|
|
@@ -164,7 +164,11 @@ export const coordinateTargetTotp = <M, A, E, R, RSetup = never>(
|
|
|
164
164
|
services: TotpPersistenceServices,
|
|
165
165
|
append: (statement: Statement<any>) => void,
|
|
166
166
|
) => Effect.Effect<A, E, R>,
|
|
167
|
-
): Effect.Effect<
|
|
167
|
+
): Effect.Effect<
|
|
168
|
+
A,
|
|
169
|
+
TotpCoordinatorError<E>,
|
|
170
|
+
R | RSetup | Crypto.Crypto | LifecycleHooks | NativeDatabase
|
|
171
|
+
> =>
|
|
168
172
|
Effect.gen(function* () {
|
|
169
173
|
const original = yield* Effect.isEffect(source) ? source : Effect.succeed(source);
|
|
170
174
|
|
|
@@ -196,7 +200,7 @@ type TransactionOf<D> = D extends { readonly transaction: (...args: any[]) => an
|
|
|
196
200
|
? Parameters<Parameters<D["transaction"]>[0]>[0]
|
|
197
201
|
: never;
|
|
198
202
|
|
|
199
|
-
/** Concrete driver wrappers select transaction mode
|
|
203
|
+
/** Concrete driver wrappers select transaction mode. */
|
|
200
204
|
export const makeTotpTarget = <
|
|
201
205
|
DatabaseId,
|
|
202
206
|
D extends { readonly transaction: any },
|
|
@@ -230,6 +234,7 @@ export const makeTotpTarget = <
|
|
|
230
234
|
A,
|
|
231
235
|
TotpCoordinatorError<E> | DatabaseError,
|
|
232
236
|
| (Synchronous extends true ? never : Exclude<R, TotpPersistence>)
|
|
237
|
+
| Crypto.Crypto
|
|
233
238
|
| LifecycleHooks
|
|
234
239
|
| RSetup
|
|
235
240
|
| DatabaseRequirements
|
|
@@ -259,6 +264,7 @@ export const makeTotpTarget = <
|
|
|
259
264
|
A,
|
|
260
265
|
TotpCoordinatorError<E> | DatabaseError,
|
|
261
266
|
| (Synchronous extends true ? never : Exclude<R, TotpPersistence | TxId>)
|
|
267
|
+
| Crypto.Crypto
|
|
262
268
|
| LifecycleHooks
|
|
263
269
|
| RSetup
|
|
264
270
|
| DatabaseRequirements
|
|
@@ -287,7 +293,7 @@ export const makeTotpTarget = <
|
|
|
287
293
|
): Effect.Effect<
|
|
288
294
|
A,
|
|
289
295
|
TotpCoordinatorError<E> | DatabaseError,
|
|
290
|
-
Exclude<R, TotpPersistence> | LifecycleHooks | RSetup | DatabaseRequirements
|
|
296
|
+
Exclude<R, TotpPersistence> | Crypto.Crypto | LifecycleHooks | RSetup | DatabaseRequirements
|
|
291
297
|
> {
|
|
292
298
|
return Effect.flatMap(nativeDatabase(acquire), (database) =>
|
|
293
299
|
coordinateTargetTotp(
|