@yielded/auth-persistence 0.1.0-beta.23 → 0.1.0-beta.24

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 (175) hide show
  1. package/README.md +11 -0
  2. package/dist/Adapter.d.mts +12 -6
  3. package/dist/Adapter.mjs +8 -3
  4. package/dist/OAuthPersistence.d.mts +87 -0
  5. package/dist/OAuthPersistence.mjs +125 -0
  6. package/dist/OAuthPersistence.mjs.map +1 -0
  7. package/dist/_virtual/_rolldown/runtime.mjs +13 -0
  8. package/dist/index.d.mts +3 -1
  9. package/dist/index.mjs +3 -1
  10. package/dist/internal/configuration.d.mts +1 -1
  11. package/dist/internal/configuration.mjs.map +1 -1
  12. package/dist/internal/models/oauth-connected-model.d.mts +294 -0
  13. package/dist/internal/models/oauth-connected-model.mjs +22 -0
  14. package/dist/internal/models/oauth-connected-model.mjs.map +1 -0
  15. package/dist/internal/models/oauth-model.d.mts +467 -0
  16. package/dist/internal/models/oauth-model.mjs +49 -0
  17. package/dist/internal/models/oauth-model.mjs.map +1 -0
  18. package/dist/internal/models/password-model.d.mts +4 -47
  19. package/dist/internal/models/password-model.mjs +0 -1
  20. package/dist/internal/models/password-model.mjs.map +1 -1
  21. package/dist/internal/native-sql-table.d.mts +4 -0
  22. package/dist/internal/native-sql-table.mjs +7 -0
  23. package/dist/internal/native-sql-table.mjs.map +1 -1
  24. package/dist/internal/oauth/accounts.d.mts +8 -0
  25. package/dist/internal/oauth/accounts.mjs +379 -0
  26. package/dist/internal/oauth/accounts.mjs.map +1 -0
  27. package/dist/internal/oauth/connected-access.d.mts +9 -0
  28. package/dist/internal/oauth/connected-access.mjs +229 -0
  29. package/dist/internal/oauth/connected-access.mjs.map +1 -0
  30. package/dist/internal/oauth/connected-collection.d.mts +7 -0
  31. package/dist/internal/oauth/connected-collection.mjs +214 -0
  32. package/dist/internal/oauth/connected-collection.mjs.map +1 -0
  33. package/dist/internal/oauth/connected-custody.d.mts +6 -0
  34. package/dist/internal/oauth/connected-custody.mjs +165 -0
  35. package/dist/internal/oauth/connected-custody.mjs.map +1 -0
  36. package/dist/internal/oauth/connected-flow.d.mts +7 -0
  37. package/dist/internal/oauth/connected-flow.mjs +324 -0
  38. package/dist/internal/oauth/connected-flow.mjs.map +1 -0
  39. package/dist/internal/oauth/connected-input.mjs +122 -0
  40. package/dist/internal/oauth/connected-input.mjs.map +1 -0
  41. package/dist/internal/oauth/connected-keys.d.mts +2 -0
  42. package/dist/internal/oauth/connected-keys.mjs +22 -0
  43. package/dist/internal/oauth/connected-keys.mjs.map +1 -0
  44. package/dist/internal/oauth/connected-maintenance.d.mts +9 -0
  45. package/dist/internal/oauth/connected-maintenance.mjs +226 -0
  46. package/dist/internal/oauth/connected-maintenance.mjs.map +1 -0
  47. package/dist/internal/oauth/connected-management.d.mts +9 -0
  48. package/dist/internal/oauth/connected-management.mjs +243 -0
  49. package/dist/internal/oauth/connected-management.mjs.map +1 -0
  50. package/dist/internal/oauth/connected-reference.mjs +63 -0
  51. package/dist/internal/oauth/connected-reference.mjs.map +1 -0
  52. package/dist/internal/oauth/connected-settlement.d.mts +8 -0
  53. package/dist/internal/oauth/connected-settlement.mjs +141 -0
  54. package/dist/internal/oauth/connected-settlement.mjs.map +1 -0
  55. package/dist/internal/oauth/connected-sign-in.d.mts +10 -0
  56. package/dist/internal/oauth/connected-sign-in.mjs +281 -0
  57. package/dist/internal/oauth/connected-sign-in.mjs.map +1 -0
  58. package/dist/internal/oauth/connected-state.d.mts +14 -0
  59. package/dist/internal/oauth/connected-state.mjs +469 -0
  60. package/dist/internal/oauth/connected-state.mjs.map +1 -0
  61. package/dist/internal/oauth/connected-target.d.mts +21 -0
  62. package/dist/internal/oauth/connected-target.mjs +117 -0
  63. package/dist/internal/oauth/connected-target.mjs.map +1 -0
  64. package/dist/internal/oauth/flow.d.mts +5 -0
  65. package/dist/internal/oauth/flow.mjs +279 -0
  66. package/dist/internal/oauth/flow.mjs.map +1 -0
  67. package/dist/internal/oauth/input.mjs +127 -0
  68. package/dist/internal/oauth/input.mjs.map +1 -0
  69. package/dist/internal/oauth/owner.d.mts +10 -0
  70. package/dist/internal/oauth/owner.mjs +10 -0
  71. package/dist/internal/oauth/owner.mjs.map +1 -0
  72. package/dist/internal/oauth/query-compiler.d.mts +7 -0
  73. package/dist/internal/oauth/query-compiler.mjs +9 -0
  74. package/dist/internal/oauth/query-compiler.mjs.map +1 -0
  75. package/dist/internal/oauth/registration.d.mts +7 -0
  76. package/dist/internal/oauth/registration.mjs +393 -0
  77. package/dist/internal/oauth/registration.mjs.map +1 -0
  78. package/dist/internal/oauth/state.mjs +107 -0
  79. package/dist/internal/oauth/state.mjs.map +1 -0
  80. package/dist/internal/oauth/target.d.mts +31 -0
  81. package/dist/internal/oauth/target.mjs +273 -0
  82. package/dist/internal/oauth/target.mjs.map +1 -0
  83. package/dist/internal/oauth-kernel.d.mts +1423 -0
  84. package/dist/internal/oauth-kernel.mjs +187 -0
  85. package/dist/internal/oauth-kernel.mjs.map +1 -0
  86. package/dist/internal/oauth-proxy.d.mts +31 -0
  87. package/dist/internal/oauth-proxy.mjs +129 -0
  88. package/dist/internal/oauth-proxy.mjs.map +1 -0
  89. package/dist/internal/passkey-kernel.d.mts +5 -5
  90. package/dist/internal/{password-attempts.d.mts → password-credentials.d.mts} +3 -4
  91. package/dist/internal/password-credentials.mjs +121 -0
  92. package/dist/internal/password-credentials.mjs.map +1 -0
  93. package/dist/internal/password-kernel.d.mts +8 -24
  94. package/dist/internal/password-kernel.mjs +4 -42
  95. package/dist/internal/password-kernel.mjs.map +1 -1
  96. package/dist/internal/persistence.d.mts +1 -1
  97. package/dist/internal/persistence.mjs +2 -2
  98. package/dist/internal/persistence.mjs.map +1 -1
  99. package/dist/internal/query-operations.d.mts +2 -0
  100. package/dist/internal/session-kernel.d.mts +2 -2
  101. package/dist/internal/session-kernel.mjs +74 -18
  102. package/dist/internal/session-kernel.mjs.map +1 -1
  103. package/dist/internal/sql-oauth-connected-model.d.mts +29 -0
  104. package/dist/internal/sql-oauth-connected-model.mjs +7 -0
  105. package/dist/internal/sql-oauth-connected-model.mjs.map +1 -0
  106. package/dist/internal/sql-oauth-model.d.mts +60 -0
  107. package/dist/internal/sql-oauth-model.mjs +10 -0
  108. package/dist/internal/sql-oauth-model.mjs.map +1 -0
  109. package/dist/internal/sql-query.d.mts +12 -0
  110. package/dist/internal/sql-query.mjs +15 -18
  111. package/dist/internal/sql-query.mjs.map +1 -1
  112. package/dist/internal/sql-storage-validation.mjs +54 -0
  113. package/dist/internal/sql-storage-validation.mjs.map +1 -0
  114. package/dist/internal/storage-mapping.mjs +1 -37
  115. package/dist/internal/storage-mapping.mjs.map +1 -1
  116. package/dist/internal/storage-plans.d.mts +7 -0
  117. package/dist/internal/storage-plans.mjs +189 -0
  118. package/dist/internal/storage-plans.mjs.map +1 -0
  119. package/dist/internal/storage-tables.d.mts +0 -56
  120. package/dist/internal/storage-tables.mjs +0 -17
  121. package/dist/internal/storage-tables.mjs.map +1 -1
  122. package/dist/internal/storage-validation.d.mts +6 -1
  123. package/dist/internal/storage-validation.mjs +42 -1
  124. package/dist/internal/storage-validation.mjs.map +1 -1
  125. package/dist/internal/transaction-kernel.mjs +3 -2
  126. package/dist/internal/transaction-kernel.mjs.map +1 -1
  127. package/package.json +1 -1
  128. package/src/Adapter.ts +89 -5
  129. package/src/OAuthPersistence.ts +427 -0
  130. package/src/index.ts +3 -0
  131. package/src/internal/configuration.ts +1 -3
  132. package/src/internal/models/oauth-connected-model.ts +396 -0
  133. package/src/internal/models/oauth-model.ts +708 -0
  134. package/src/internal/models/password-model.ts +0 -56
  135. package/src/internal/native-sql-table.ts +14 -0
  136. package/src/internal/oauth/accounts.ts +838 -0
  137. package/src/internal/oauth/connected-access.ts +388 -0
  138. package/src/internal/oauth/connected-collection.ts +345 -0
  139. package/src/internal/oauth/connected-custody.ts +308 -0
  140. package/src/internal/oauth/connected-flow.ts +562 -0
  141. package/src/internal/oauth/connected-input.ts +147 -0
  142. package/src/internal/oauth/connected-keys.ts +31 -0
  143. package/src/internal/oauth/connected-maintenance.ts +379 -0
  144. package/src/internal/oauth/connected-management.ts +391 -0
  145. package/src/internal/oauth/connected-reference.ts +135 -0
  146. package/src/internal/oauth/connected-settlement.ts +278 -0
  147. package/src/internal/oauth/connected-sign-in.ts +472 -0
  148. package/src/internal/oauth/connected-state.ts +924 -0
  149. package/src/internal/oauth/connected-target.ts +307 -0
  150. package/src/internal/oauth/flow.ts +505 -0
  151. package/src/internal/oauth/input.ts +201 -0
  152. package/src/internal/oauth/owner.ts +22 -0
  153. package/src/internal/oauth/query-compiler.ts +15 -0
  154. package/src/internal/oauth/registration.ts +676 -0
  155. package/src/internal/oauth/state.ts +218 -0
  156. package/src/internal/oauth/target.ts +803 -0
  157. package/src/internal/oauth-kernel.ts +294 -0
  158. package/src/internal/oauth-proxy.ts +176 -0
  159. package/src/internal/password-credentials.ts +245 -0
  160. package/src/internal/password-kernel.ts +5 -98
  161. package/src/internal/persistence.ts +1 -1
  162. package/src/internal/query-operations.ts +2 -0
  163. package/src/internal/session-kernel.ts +143 -55
  164. package/src/internal/sql-oauth-connected-model.ts +145 -0
  165. package/src/internal/sql-oauth-model.ts +263 -0
  166. package/src/internal/sql-query.ts +16 -13
  167. package/src/internal/sql-storage-validation.ts +64 -0
  168. package/src/internal/storage-mapping.ts +0 -37
  169. package/src/internal/storage-plans.ts +218 -0
  170. package/src/internal/storage-tables.ts +0 -20
  171. package/src/internal/storage-validation.ts +58 -0
  172. package/src/internal/transaction-kernel.ts +6 -2
  173. package/dist/internal/password-attempts.mjs +0 -197
  174. package/dist/internal/password-attempts.mjs.map +0 -1
  175. package/src/internal/password-attempts.ts +0 -466
@@ -1,7 +1,6 @@
1
1
  import { type RecoveryReference, type LoginIdentifier } from "@yielded/auth/Identity";
2
2
  import type {
3
3
  PasswordAction,
4
- PasswordAttemptId,
5
4
  PasswordCredentialSnapshot,
6
5
  PasswordReplacement,
7
6
  PasswordRegistrationDecision,
@@ -15,10 +14,6 @@ import type { PersistenceMappingError, SubjectIdCodec } from "./common";
15
14
 
16
15
  type ColumnKey<T extends Table> = T["column"];
17
16
 
18
- export type PasswordAttemptAction = "sign-in" | "change";
19
-
20
- export type PasswordAttemptState = "pending" | "verified" | "rejected";
21
-
22
17
  export interface PasswordSubjectTable<Subject extends Table, _NativeSubjectId> {
23
18
  readonly table: Subject["table"];
24
19
  readonly id: ColumnKey<Subject>;
@@ -121,48 +116,6 @@ export interface PasswordCredentialTable<
121
116
  }) => Effect.Effect<PasswordCredentialSnapshot, PersistenceMappingError>;
122
117
  }
123
118
 
124
- export interface PasswordAttemptRecord {
125
- readonly moduleId: string;
126
- readonly action: PasswordAttemptAction;
127
- readonly attemptId: PasswordAttemptId;
128
- readonly identifier: LoginIdentifier;
129
- readonly subjectId?: string;
130
- readonly credentialId?: string;
131
- readonly securityRevision?: SecurityRevision;
132
- readonly credentialRevision?: SecurityRevision;
133
- readonly verifierVersion?: SecurityRevision;
134
- readonly identifierBindingRevision?: SecurityRevision;
135
- readonly admittedAtMillis: number;
136
- readonly deadlineMillis: number;
137
- readonly retentionUntilMillis: number;
138
- }
139
-
140
- export interface PasswordAttemptTable<Attempt extends Table, NativeSubjectId> {
141
- readonly table: Attempt["table"];
142
- readonly moduleId: ColumnKey<Attempt>;
143
- readonly action: ColumnKey<Attempt>;
144
- readonly attemptId: ColumnKey<Attempt>;
145
- readonly identifierNamespace: ColumnKey<Attempt>;
146
- readonly identifierValue: ColumnKey<Attempt>;
147
- readonly subjectId: ColumnKey<Attempt>;
148
- readonly credentialId: ColumnKey<Attempt>;
149
- readonly securityRevision: ColumnKey<Attempt>;
150
- readonly credentialRevision: ColumnKey<Attempt>;
151
- readonly verifierVersion: ColumnKey<Attempt>;
152
- readonly identifierBindingRevision: ColumnKey<Attempt>;
153
- readonly admittedAt: ColumnKey<Attempt>;
154
- readonly deadline: ColumnKey<Attempt>;
155
- readonly retentionUntil: ColumnKey<Attempt>;
156
- readonly state: ColumnKey<Attempt>;
157
- readonly encodeInsert: (
158
- record: PasswordAttemptRecord,
159
- input: {
160
- readonly nativeSubjectId?: NativeSubjectId;
161
- readonly state: "pending";
162
- },
163
- ) => Attempt["insert"];
164
- }
165
-
166
119
  export interface PasswordCommandTable<Command extends Table> {
167
120
  readonly table: Command["table"];
168
121
  readonly moduleId: ColumnKey<Command>;
@@ -186,7 +139,6 @@ export interface RequiredPasswordConstraints {
186
139
  readonly authorityCredential: "unique(authorityCredential.subjectId,authorityCredential.credentialId)";
187
140
  readonly credentialSubject: "unique(credential.moduleId,credential.subjectId)";
188
141
  readonly credentialId: "unique(credential.moduleId,credential.credentialId)";
189
- readonly attempt: "unique(attempt.moduleId,attempt.attemptId)";
190
142
  readonly command: "unique(command.moduleId,command.commandId)";
191
143
  }
192
144
 
@@ -195,7 +147,6 @@ export const requiredPasswordConstraints: RequiredPasswordConstraints = {
195
147
  authorityCredential: "unique(authorityCredential.subjectId,authorityCredential.credentialId)",
196
148
  credentialSubject: "unique(credential.moduleId,credential.subjectId)",
197
149
  credentialId: "unique(credential.moduleId,credential.credentialId)",
198
- attempt: "unique(attempt.moduleId,attempt.attemptId)",
199
150
  command: "unique(command.moduleId,command.commandId)",
200
151
  };
201
152
 
@@ -216,7 +167,6 @@ export interface PasswordPersistenceMapping<
216
167
  Identifier extends Table,
217
168
  Credential extends Table,
218
169
  AuthorityCredential extends Table,
219
- Attempt extends Table,
220
170
  Command extends Table,
221
171
  NativeSubjectId,
222
172
  Expression extends SqlExpression = SqlExpression,
@@ -229,14 +179,11 @@ export interface PasswordPersistenceMapping<
229
179
  AuthorityCredential,
230
180
  NativeSubjectId
231
181
  >;
232
- readonly attempt: PasswordAttemptTable<Attempt, NativeSubjectId>;
233
182
  readonly command: PasswordCommandTable<Command>;
234
183
  readonly subjectId: SubjectIdCodec<NativeSubjectId>;
235
184
  readonly constraints: RequiredPasswordConstraints;
236
185
  readonly encodeInstant: (epochMillis: number) => unknown;
237
186
  readonly decodeInstant: (native: unknown) => Effect.Effect<number, PersistenceMappingError>;
238
- readonly allocateAttemptId?: Effect.Effect<PasswordAttemptId, PersistenceMappingError>;
239
- readonly allocateAttemptIdSync?: () => PasswordAttemptId;
240
187
  readonly allocateCredentialId?: Effect.Effect<string, PersistenceMappingError>;
241
188
  readonly allocateCredentialIdSync?: () => string;
242
189
  readonly allocateRevision?: Effect.Effect<SecurityRevision, PersistenceMappingError>;
@@ -252,7 +199,6 @@ export type D1PasswordPersistenceMapping<
252
199
  Identifier extends Table,
253
200
  Credential extends Table,
254
201
  AuthorityCredential extends Table,
255
- Attempt extends Table,
256
202
  Command extends Table,
257
203
  NativeSubjectId,
258
204
  Expression extends SqlExpression = SqlExpression,
@@ -261,7 +207,6 @@ export type D1PasswordPersistenceMapping<
261
207
  Identifier,
262
208
  Credential,
263
209
  AuthorityCredential,
264
- Attempt,
265
210
  Command,
266
211
  NativeSubjectId,
267
212
  Expression
@@ -429,7 +374,6 @@ export type AnyPasswordPersistenceMapping<Expression extends SqlExpression = Sql
429
374
  AnyTableModel,
430
375
  AnyTableModel,
431
376
  AnyTableModel,
432
- AnyTableModel,
433
377
  unknown,
434
378
  Expression
435
379
  >;
@@ -4,6 +4,7 @@ import * as Statement from "effect/sql/Statement";
4
4
 
5
5
  import { PersistenceMappingError } from "./mapping-error";
6
6
  import { Table, identifier } from "./sql-table";
7
+ import type { PhysicalTextColumn } from "./storage-validation";
7
8
 
8
9
  /** Capture synchronous mapping callbacks without changing SQL execution errors. */
9
10
  export const sqlMapping = <A>(thunk: () => A): Effect.Effect<A, PersistenceMappingError> =>
@@ -19,6 +20,9 @@ export interface SqlTable {
19
20
  /** Alias reads only; writes continue to target the original physical table. */
20
21
  readonly as: (alias: string) => SqlTable;
21
22
  readonly column: (key: string) => Statement.Fragment;
23
+ /** Optional codec-free text candidate. Physical type/collation compatibility
24
+ * must still be checked against the database before comparing columns. */
25
+ readonly unencodedTextColumn?: (key: string) => PhysicalTextColumn | undefined;
22
26
  /** Project every column under an ordinal alias, using a distinct prefix per table. */
23
27
  readonly fields: (prefix: string) => Statement.Fragment;
24
28
  readonly decode: (
@@ -98,6 +102,16 @@ const directTable = (client: SqlClient, physical: object): SqlTable => {
98
102
  name: alias === undefined ? name : client`${name} AS ${reference}`,
99
103
  as: bind,
100
104
  column,
105
+ unencodedTextColumn: (key) =>
106
+ getColumn(key).options.type === "text"
107
+ ? {
108
+ table: {
109
+ name: physical.name,
110
+ ...(physical.schema === undefined ? {} : { schema: physical.schema }),
111
+ },
112
+ name: getColumn(key).options.name,
113
+ }
114
+ : undefined,
101
115
  value,
102
116
  fields: (prefix) =>
103
117
  client.join(