@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.
Files changed (142) hide show
  1. package/README.md +8 -1
  2. package/dist/D1.d.mts +120 -120
  3. package/dist/Libsql.d.mts +154 -154
  4. package/dist/Mysql2.d.mts +166 -166
  5. package/dist/Pglite.d.mts +166 -166
  6. package/dist/Postgres.d.mts +152 -152
  7. package/dist/SqliteBun.d.mts +168 -168
  8. package/dist/SqliteDo.d.mts +237 -259
  9. package/dist/SqliteDo.mjs +30 -45
  10. package/dist/SqliteDo.mjs.map +1 -1
  11. package/dist/SqliteNode.d.mts +154 -154
  12. package/dist/SqliteWasm.d.mts +163 -163
  13. package/dist/drizzle/crypto.mjs +11 -0
  14. package/dist/drizzle/crypto.mjs.map +1 -0
  15. package/dist/drizzle/d1-identity.mjs +2 -2
  16. package/dist/drizzle/d1-identity.mjs.map +1 -1
  17. package/dist/drizzle/d1-oauth.d.mts +16 -16
  18. package/dist/drizzle/d1-oauth.mjs.map +1 -1
  19. package/dist/drizzle/d1-passkey.d.mts +6 -6
  20. package/dist/drizzle/d1-passkey.mjs.map +1 -1
  21. package/dist/drizzle/d1-password-prepared.mjs +3 -3
  22. package/dist/drizzle/d1-password-prepared.mjs.map +1 -1
  23. package/dist/drizzle/d1-passwords.d.mts +1 -1
  24. package/dist/drizzle/d1-passwords.mjs +1 -1
  25. package/dist/drizzle/d1-passwords.mjs.map +1 -1
  26. package/dist/drizzle/d1-phone.d.mts +3 -3
  27. package/dist/drizzle/d1-phone.mjs.map +1 -1
  28. package/dist/drizzle/d1-proofs.d.mts +1 -1
  29. package/dist/drizzle/d1-sessions.d.mts +1 -1
  30. package/dist/drizzle/d1-sessions.mjs +4 -3
  31. package/dist/drizzle/d1-sessions.mjs.map +1 -1
  32. package/dist/drizzle/d1-totp.d.mts +3 -3
  33. package/dist/drizzle/d1-totp.mjs.map +1 -1
  34. package/dist/drizzle/mysql-identity.mjs +2 -2
  35. package/dist/drizzle/mysql-identity.mjs.map +1 -1
  36. package/dist/drizzle/oauth-accounts.mjs +9 -8
  37. package/dist/drizzle/oauth-accounts.mjs.map +1 -1
  38. package/dist/drizzle/oauth-connected-collection.mjs +1 -1
  39. package/dist/drizzle/oauth-connected-collection.mjs.map +1 -1
  40. package/dist/drizzle/oauth-connected-custody.mjs +5 -4
  41. package/dist/drizzle/oauth-connected-custody.mjs.map +1 -1
  42. package/dist/drizzle/oauth-connected-drivers.mjs.map +1 -1
  43. package/dist/drizzle/oauth-connected-flow.mjs +8 -7
  44. package/dist/drizzle/oauth-connected-flow.mjs.map +1 -1
  45. package/dist/drizzle/oauth-connected-management.mjs +3 -2
  46. package/dist/drizzle/oauth-connected-management.mjs.map +1 -1
  47. package/dist/drizzle/oauth-connected-reference.mjs +8 -4
  48. package/dist/drizzle/oauth-connected-reference.mjs.map +1 -1
  49. package/dist/drizzle/oauth-connected-settlement.mjs +4 -4
  50. package/dist/drizzle/oauth-connected-settlement.mjs.map +1 -1
  51. package/dist/drizzle/oauth-connected-sign-in.mjs +11 -10
  52. package/dist/drizzle/oauth-connected-sign-in.mjs.map +1 -1
  53. package/dist/drizzle/oauth-connected-state.d.mts +265 -265
  54. package/dist/drizzle/oauth-connected-state.mjs +23 -20
  55. package/dist/drizzle/oauth-connected-state.mjs.map +1 -1
  56. package/dist/drizzle/oauth-connected-target.d.mts +105 -105
  57. package/dist/drizzle/oauth-connected-target.mjs.map +1 -1
  58. package/dist/drizzle/oauth-drivers.mjs.map +1 -1
  59. package/dist/drizzle/oauth-flow.mjs +1 -1
  60. package/dist/drizzle/oauth-flow.mjs.map +1 -1
  61. package/dist/drizzle/oauth-model.d.mts +4 -4
  62. package/dist/drizzle/oauth-model.mjs.map +1 -1
  63. package/dist/drizzle/oauth-registration.mjs +2 -2
  64. package/dist/drizzle/oauth-registration.mjs.map +1 -1
  65. package/dist/drizzle/oauth-state.mjs +11 -12
  66. package/dist/drizzle/oauth-state.mjs.map +1 -1
  67. package/dist/drizzle/oauth-target.d.mts +4 -4
  68. package/dist/drizzle/oauth-target.mjs.map +1 -1
  69. package/dist/drizzle/passkey-drivers.mjs.map +1 -1
  70. package/dist/drizzle/passkey-write-drivers.mjs.map +1 -1
  71. package/dist/drizzle/passkey-write-target.d.mts +1 -1
  72. package/dist/drizzle/password-prepared-sql.mjs +1 -1
  73. package/dist/drizzle/password-prepared-sql.mjs.map +1 -1
  74. package/dist/drizzle/password-prepared-state.mjs +1 -1
  75. package/dist/drizzle/pg-identity.mjs +2 -2
  76. package/dist/drizzle/pg-identity.mjs.map +1 -1
  77. package/dist/drizzle/phone-model.d.mts +2 -2
  78. package/dist/drizzle/phone-model.mjs +3 -3
  79. package/dist/drizzle/phone-model.mjs.map +1 -1
  80. package/dist/drizzle/phone-target.d.mts +1 -1
  81. package/dist/drizzle/phone-target.mjs +2 -2
  82. package/dist/drizzle/phone-target.mjs.map +1 -1
  83. package/dist/drizzle/sqlite-do-database.d.mts +29 -0
  84. package/dist/drizzle/sqlite-do-database.mjs +45 -0
  85. package/dist/drizzle/sqlite-do-database.mjs.map +1 -0
  86. package/dist/drizzle/sqlite-emails.mjs.map +1 -1
  87. package/dist/drizzle/sqlite-identity.mjs +2 -2
  88. package/dist/drizzle/sqlite-identity.mjs.map +1 -1
  89. package/dist/drizzle/sqlite-passwords.mjs.map +1 -1
  90. package/dist/drizzle/sqlite-proofs.mjs.map +1 -1
  91. package/dist/drizzle/sqlite-sessions.mjs.map +1 -1
  92. package/dist/drizzle/storage-validation.mjs +17 -9
  93. package/dist/drizzle/storage-validation.mjs.map +1 -1
  94. package/dist/drizzle/totp-state.mjs +8 -8
  95. package/dist/drizzle/totp-state.mjs.map +1 -1
  96. package/dist/drizzle/totp-target.d.mts +1 -1
  97. package/dist/drizzle/totp-target.mjs +2 -2
  98. package/dist/drizzle/totp-target.mjs.map +1 -1
  99. package/package.json +1 -1
  100. package/src/SqliteDo.ts +63 -70
  101. package/src/drizzle/crypto.ts +14 -0
  102. package/src/drizzle/d1-identity.ts +2 -2
  103. package/src/drizzle/d1-oauth.ts +14 -5
  104. package/src/drizzle/d1-passkey.ts +5 -1
  105. package/src/drizzle/d1-password-prepared.ts +11 -5
  106. package/src/drizzle/d1-passwords.ts +1 -1
  107. package/src/drizzle/d1-phone.ts +2 -1
  108. package/src/drizzle/d1-sessions.ts +8 -2
  109. package/src/drizzle/d1-totp.ts +6 -2
  110. package/src/drizzle/mysql-identity.ts +2 -2
  111. package/src/drizzle/oauth-accounts.ts +14 -13
  112. package/src/drizzle/oauth-connected-collection.ts +1 -1
  113. package/src/drizzle/oauth-connected-custody.ts +8 -6
  114. package/src/drizzle/oauth-connected-drivers.ts +9 -3
  115. package/src/drizzle/oauth-connected-flow.ts +6 -6
  116. package/src/drizzle/oauth-connected-management.ts +1 -1
  117. package/src/drizzle/oauth-connected-reference.ts +14 -9
  118. package/src/drizzle/oauth-connected-settlement.ts +4 -4
  119. package/src/drizzle/oauth-connected-sign-in.ts +11 -10
  120. package/src/drizzle/oauth-connected-state.ts +40 -25
  121. package/src/drizzle/oauth-connected-target.ts +9 -5
  122. package/src/drizzle/oauth-drivers.ts +13 -5
  123. package/src/drizzle/oauth-flow.ts +1 -1
  124. package/src/drizzle/oauth-model.ts +4 -4
  125. package/src/drizzle/oauth-registration.ts +2 -2
  126. package/src/drizzle/oauth-state.ts +17 -15
  127. package/src/drizzle/oauth-target.ts +11 -3
  128. package/src/drizzle/passkey-drivers.ts +7 -3
  129. package/src/drizzle/passkey-write-drivers.ts +11 -2
  130. package/src/drizzle/password-prepared-sql.ts +1 -1
  131. package/src/drizzle/pg-identity.ts +2 -2
  132. package/src/drizzle/phone-model.ts +3 -3
  133. package/src/drizzle/phone-target.ts +11 -4
  134. package/src/drizzle/sqlite-do-database.ts +87 -0
  135. package/src/drizzle/sqlite-emails.ts +1 -1
  136. package/src/drizzle/sqlite-identity.ts +2 -2
  137. package/src/drizzle/sqlite-passwords.ts +1 -1
  138. package/src/drizzle/sqlite-proofs.ts +2 -2
  139. package/src/drizzle/sqlite-sessions.ts +2 -2
  140. package/src/drizzle/storage-validation.ts +15 -6
  141. package/src/drizzle/totp-state.ts +8 -8
  142. 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
- | EffectSQLiteDoDatabase<AnyRelations>
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
- validateStorage,
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
- yield* validateStorage(
259
- pg ? "pg" : mysql ? "mysql" : "sqlite",
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
- ).pipe(
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<A, TotpCoordinatorError<E>, R | RSetup | LifecycleHooks | NativeDatabase> =>
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; cryptography always precedes these owners. */
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(