@yielded/auth-persistence-drizzle 0.1.0-beta.23 → 0.1.0-beta.25

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 (189) hide show
  1. package/README.md +3 -0
  2. package/dist/D1.d.mts +9 -9
  3. package/dist/D1.mjs +2 -1
  4. package/dist/D1.mjs.map +1 -1
  5. package/dist/Libsql.d.mts +48 -64
  6. package/dist/Libsql.mjs +2 -1
  7. package/dist/Libsql.mjs.map +1 -1
  8. package/dist/Mysql2.d.mts +26 -27
  9. package/dist/Pglite.d.mts +28 -28
  10. package/dist/Pglite.mjs +2 -1
  11. package/dist/Pglite.mjs.map +1 -1
  12. package/dist/Postgres.d.mts +29 -29
  13. package/dist/Postgres.mjs +2 -1
  14. package/dist/Postgres.mjs.map +1 -1
  15. package/dist/SqliteBun.d.mts +49 -65
  16. package/dist/SqliteBun.mjs +2 -1
  17. package/dist/SqliteBun.mjs.map +1 -1
  18. package/dist/SqliteDo.d.mts +47 -63
  19. package/dist/SqliteDo.mjs +2 -1
  20. package/dist/SqliteDo.mjs.map +1 -1
  21. package/dist/SqliteNode.d.mts +51 -67
  22. package/dist/SqliteNode.mjs +2 -1
  23. package/dist/SqliteNode.mjs.map +1 -1
  24. package/dist/SqliteWasm.d.mts +47 -63
  25. package/dist/SqliteWasm.mjs +2 -1
  26. package/dist/SqliteWasm.mjs.map +1 -1
  27. package/dist/drizzle/crypto.mjs +1 -1
  28. package/dist/drizzle/d1-emails.d.mts +1 -1
  29. package/dist/drizzle/d1-oauth.d.mts +15 -15
  30. package/dist/drizzle/d1-passkey.d.mts +1 -1
  31. package/dist/drizzle/d1-password-prepared.d.mts +4 -4
  32. package/dist/drizzle/d1-password-prepared.mjs +1 -1
  33. package/dist/drizzle/d1-password-prepared.mjs.map +1 -1
  34. package/dist/drizzle/d1-passwords.d.mts +17 -33
  35. package/dist/drizzle/d1-passwords.mjs +57 -199
  36. package/dist/drizzle/d1-passwords.mjs.map +1 -1
  37. package/dist/drizzle/d1-phone.d.mts +1 -1
  38. package/dist/drizzle/d1-proofs.d.mts +1 -1
  39. package/dist/drizzle/d1-sessions.d.mts +2 -2
  40. package/dist/drizzle/d1-sessions.mjs +11 -6
  41. package/dist/drizzle/d1-sessions.mjs.map +1 -1
  42. package/dist/drizzle/d1-totp.d.mts +1 -1
  43. package/dist/drizzle/mysql-password-prepared.d.mts +5 -5
  44. package/dist/drizzle/mysql-password-prepared.mjs.map +1 -1
  45. package/dist/drizzle/mysql-passwords.d.mts +16 -32
  46. package/dist/drizzle/mysql-passwords.mjs.map +1 -1
  47. package/dist/drizzle/mysql-sessions.d.mts +1 -1
  48. package/dist/drizzle/native-sql-table.mjs +26 -1
  49. package/dist/drizzle/native-sql-table.mjs.map +1 -1
  50. package/dist/drizzle/oauth-connected-model.d.mts +20 -281
  51. package/dist/drizzle/oauth-connected-model.mjs +3 -17
  52. package/dist/drizzle/oauth-connected-model.mjs.map +1 -1
  53. package/dist/drizzle/oauth-connected-reference.d.mts +1 -3
  54. package/dist/drizzle/oauth-connected-reference.mjs +4 -53
  55. package/dist/drizzle/oauth-connected-reference.mjs.map +1 -1
  56. package/dist/drizzle/oauth-connected-target.d.mts +3 -990
  57. package/dist/drizzle/oauth-connected-target.mjs +8 -92
  58. package/dist/drizzle/oauth-connected-target.mjs.map +1 -1
  59. package/dist/drizzle/oauth-kernel.mjs +11 -0
  60. package/dist/drizzle/oauth-kernel.mjs.map +1 -0
  61. package/dist/drizzle/oauth-model.d.mts +35 -438
  62. package/dist/drizzle/oauth-model.mjs +6 -44
  63. package/dist/drizzle/oauth-model.mjs.map +1 -1
  64. package/dist/drizzle/oauth-mysql.mjs +2 -2
  65. package/dist/drizzle/oauth-mysql.mjs.map +1 -1
  66. package/dist/drizzle/oauth-proxy.d.mts +10 -0
  67. package/dist/drizzle/oauth-proxy.mjs +54 -0
  68. package/dist/drizzle/oauth-proxy.mjs.map +1 -0
  69. package/dist/drizzle/oauth-target.d.mts +6 -107
  70. package/dist/drizzle/oauth-target.mjs +15 -245
  71. package/dist/drizzle/oauth-target.mjs.map +1 -1
  72. package/dist/drizzle/password-model.d.mts +5 -6
  73. package/dist/drizzle/password-prepared-model.d.mts +5 -5
  74. package/dist/drizzle/password-prepared-model.mjs.map +1 -1
  75. package/dist/drizzle/password-prepared-sql.mjs +1 -1
  76. package/dist/drizzle/password-prepared-sql.mjs.map +1 -1
  77. package/dist/drizzle/password-prepared-state.mjs +1 -1
  78. package/dist/drizzle/pg-password-prepared.d.mts +5 -5
  79. package/dist/drizzle/pg-password-prepared.mjs.map +1 -1
  80. package/dist/drizzle/pg-passwords.d.mts +16 -32
  81. package/dist/drizzle/pg-passwords.mjs.map +1 -1
  82. package/dist/drizzle/pg-sessions.d.mts +1 -1
  83. package/dist/drizzle/phone-target.d.mts +1 -1
  84. package/dist/drizzle/phone-target.mjs +1 -1
  85. package/dist/drizzle/query-operations.mjs +3 -1
  86. package/dist/drizzle/query-operations.mjs.map +1 -1
  87. package/dist/drizzle/sqlite-password-prepared.mjs.map +1 -1
  88. package/dist/drizzle/sqlite-passwords.mjs.map +1 -1
  89. package/dist/drizzle/storage-validation.mjs +10 -185
  90. package/dist/drizzle/storage-validation.mjs.map +1 -1
  91. package/dist/drizzle/totp-target.d.mts +2 -2
  92. package/dist/drizzle/totp-target.mjs +2 -2
  93. package/dist/drizzle/transaction-execution.d.mts +2 -2
  94. package/dist/drizzle/transaction-owner.d.mts +1 -2
  95. package/dist/index.d.mts +3 -2
  96. package/dist/internal/drizzle-postgres-oauth-proxy.d.mts +138 -0
  97. package/dist/internal/drizzle-postgres-oauth-proxy.mjs +29 -0
  98. package/dist/internal/drizzle-postgres-oauth-proxy.mjs.map +1 -0
  99. package/dist/internal/drizzle-sqlite-oauth-proxy.d.mts +146 -0
  100. package/dist/internal/drizzle-sqlite-oauth-proxy.mjs +29 -0
  101. package/dist/internal/drizzle-sqlite-oauth-proxy.mjs.map +1 -0
  102. package/package.json +1 -1
  103. package/src/D1.ts +2 -0
  104. package/src/Libsql.ts +2 -0
  105. package/src/Pglite.ts +2 -0
  106. package/src/Postgres.ts +2 -0
  107. package/src/SqliteBun.ts +2 -0
  108. package/src/SqliteDo.ts +2 -0
  109. package/src/SqliteNode.ts +2 -0
  110. package/src/SqliteWasm.ts +2 -0
  111. package/src/drizzle/d1-password-prepared.ts +4 -6
  112. package/src/drizzle/d1-passwords.ts +125 -459
  113. package/src/drizzle/d1-sessions.ts +21 -6
  114. package/src/drizzle/mysql-password-prepared.ts +4 -8
  115. package/src/drizzle/mysql-passwords.ts +5 -10
  116. package/src/drizzle/native-sql-table.ts +30 -0
  117. package/src/drizzle/oauth-connected-model.ts +97 -315
  118. package/src/drizzle/oauth-connected-reference.ts +13 -93
  119. package/src/drizzle/oauth-connected-target.ts +14 -271
  120. package/src/drizzle/oauth-kernel.ts +10 -0
  121. package/src/drizzle/oauth-model.ts +188 -541
  122. package/src/drizzle/oauth-mysql.ts +2 -2
  123. package/src/drizzle/oauth-proxy.ts +101 -0
  124. package/src/drizzle/oauth-target.ts +33 -737
  125. package/src/drizzle/password-model.ts +0 -13
  126. package/src/drizzle/password-prepared-model.ts +0 -6
  127. package/src/drizzle/password-prepared-sql.ts +2 -1
  128. package/src/drizzle/pg-password-prepared.ts +4 -8
  129. package/src/drizzle/pg-passwords.ts +5 -10
  130. package/src/drizzle/query-operations.ts +4 -0
  131. package/src/drizzle/sqlite-password-prepared.ts +4 -8
  132. package/src/drizzle/sqlite-passwords.ts +7 -14
  133. package/src/drizzle/storage-validation.ts +13 -214
  134. package/src/index.ts +2 -4
  135. package/src/internal/drizzle-postgres-oauth-proxy.ts +37 -0
  136. package/src/internal/drizzle-sqlite-oauth-proxy.ts +44 -0
  137. package/dist/_virtual/_rolldown/runtime.mjs +0 -13
  138. package/dist/drizzle/oauth-accounts.mjs +0 -359
  139. package/dist/drizzle/oauth-accounts.mjs.map +0 -1
  140. package/dist/drizzle/oauth-connected-access.mjs +0 -212
  141. package/dist/drizzle/oauth-connected-access.mjs.map +0 -1
  142. package/dist/drizzle/oauth-connected-collection.mjs +0 -202
  143. package/dist/drizzle/oauth-connected-collection.mjs.map +0 -1
  144. package/dist/drizzle/oauth-connected-custody.mjs +0 -147
  145. package/dist/drizzle/oauth-connected-custody.mjs.map +0 -1
  146. package/dist/drizzle/oauth-connected-flow.mjs +0 -297
  147. package/dist/drizzle/oauth-connected-flow.mjs.map +0 -1
  148. package/dist/drizzle/oauth-connected-input.mjs +0 -122
  149. package/dist/drizzle/oauth-connected-input.mjs.map +0 -1
  150. package/dist/drizzle/oauth-connected-maintenance.mjs +0 -214
  151. package/dist/drizzle/oauth-connected-maintenance.mjs.map +0 -1
  152. package/dist/drizzle/oauth-connected-management.mjs +0 -229
  153. package/dist/drizzle/oauth-connected-management.mjs.map +0 -1
  154. package/dist/drizzle/oauth-connected-settlement.mjs +0 -128
  155. package/dist/drizzle/oauth-connected-settlement.mjs.map +0 -1
  156. package/dist/drizzle/oauth-connected-sign-in.mjs +0 -265
  157. package/dist/drizzle/oauth-connected-sign-in.mjs.map +0 -1
  158. package/dist/drizzle/oauth-connected-state.d.mts +0 -2062
  159. package/dist/drizzle/oauth-connected-state.mjs +0 -430
  160. package/dist/drizzle/oauth-connected-state.mjs.map +0 -1
  161. package/dist/drizzle/oauth-flow.d.mts +0 -22
  162. package/dist/drizzle/oauth-flow.mjs +0 -253
  163. package/dist/drizzle/oauth-flow.mjs.map +0 -1
  164. package/dist/drizzle/oauth-input.mjs +0 -127
  165. package/dist/drizzle/oauth-input.mjs.map +0 -1
  166. package/dist/drizzle/oauth-owner.d.mts +0 -10
  167. package/dist/drizzle/oauth-owner.mjs +0 -10
  168. package/dist/drizzle/oauth-owner.mjs.map +0 -1
  169. package/dist/drizzle/oauth-registration.d.mts +0 -5
  170. package/dist/drizzle/oauth-registration.mjs +0 -374
  171. package/dist/drizzle/oauth-registration.mjs.map +0 -1
  172. package/dist/drizzle/oauth-state.mjs +0 -107
  173. package/dist/drizzle/oauth-state.mjs.map +0 -1
  174. package/src/drizzle/oauth-accounts.ts +0 -805
  175. package/src/drizzle/oauth-connected-access.ts +0 -361
  176. package/src/drizzle/oauth-connected-collection.ts +0 -324
  177. package/src/drizzle/oauth-connected-custody.ts +0 -279
  178. package/src/drizzle/oauth-connected-flow.ts +0 -529
  179. package/src/drizzle/oauth-connected-input.ts +0 -147
  180. package/src/drizzle/oauth-connected-maintenance.ts +0 -346
  181. package/src/drizzle/oauth-connected-management.ts +0 -365
  182. package/src/drizzle/oauth-connected-settlement.ts +0 -251
  183. package/src/drizzle/oauth-connected-sign-in.ts +0 -443
  184. package/src/drizzle/oauth-connected-state.ts +0 -872
  185. package/src/drizzle/oauth-flow.ts +0 -462
  186. package/src/drizzle/oauth-input.ts +0 -201
  187. package/src/drizzle/oauth-owner.ts +0 -29
  188. package/src/drizzle/oauth-registration.ts +0 -640
  189. package/src/drizzle/oauth-state.ts +0 -218
@@ -1,279 +0,0 @@
1
- import * as M from "@yielded/auth/OAuth";
2
- import { snapshotOAuthSync } from "@yielded/auth/OAuth";
3
- import { eq, isNotNull, ne, sql, type SQL } from "drizzle-orm";
4
- import { Effect } from "effect";
5
-
6
- import * as S from "./oauth-connected-state";
7
- import { both, col, equal, CurrentOAuthTransaction } from "./oauth-owner";
8
- import { invariant, oauthIdentityKey } from "./oauth-state";
9
-
10
- type Client = NonNullable<Effect.Success<ReturnType<typeof S.client>>>;
11
- type Cohort = Effect.Success<ReturnType<typeof S.cohort>>;
12
-
13
- export const sameContext = (a: M.OAuthConnectedTokenContext, b: M.OAuthConnectedTokenContext) =>
14
- S.tokenContextStorage.encode(a) === S.tokenContextStorage.encode(b);
15
-
16
- export const sameGrant = (a: M.OAuthConnectedStoredGrant, b: M.OAuthConnectedStoredGrant) =>
17
- S.grantStorage.encode(a) === S.grantStorage.encode(b);
18
-
19
- export const summary = (context: M.OAuthConnectedTokenContext) =>
20
- snapshotOAuthSync(M.OAuthConnectedSummary, {
21
- grantId: context.grantId,
22
- provider: context.identity.provider,
23
- issuer: context.identity.issuer,
24
- profileKey: context.configuration.profile.key,
25
- status: "Active",
26
- scopes: context.metadata.scopes,
27
- ...(context.metadata.accessExpiresAtMillis === undefined
28
- ? {}
29
- : { accessExpiresAtMillis: context.metadata.accessExpiresAtMillis }),
30
- useUntilMillis: context.metadata.useUntilMillis,
31
- ...(context.metadata.profile === undefined ? {} : { profile: context.metadata.profile }),
32
- remoteRevocation:
33
- context.configuration.profile.revocation === "cohort" ? "Pending" : "Unsupported",
34
- });
35
-
36
- /** A generation fences every sibling, including those beyond a bounded metadata page. */
37
- export const fence = Effect.fn("oauthConnected.fence")(function* (
38
- mapping: S.Authority,
39
- client: Client,
40
- cohort: Cohort,
41
- ) {
42
- const owner = yield* CurrentOAuthTransaction;
43
-
44
- invariant(cohort.row !== undefined);
45
-
46
- const g = mapping.grant,
47
- h = mapping.cohort;
48
-
49
- const active = both(
50
- eq(col(g.table, g.cohortKey), cohort.id),
51
- isNotNull(col(g.table, g.activeIdentityKey)),
52
- );
53
-
54
- const affected = yield* S.rowCount(g.table, active);
55
-
56
- invariant(yield* owner.check(S.countCondition(g.table, active, affected)));
57
- const cutoff = yield* S.nextOrder(mapping, client);
58
- const generation = M.OAuthConnectedTarget.fields.cohortGeneration.make(owner.marker);
59
-
60
- yield* owner.update(
61
- h.table,
62
- { [h.cohortKey]: cohort.id },
63
- {
64
- [h.generation]: generation,
65
- [h.cutoff]: mapping.order.encode(cutoff),
66
- [h.state]: "Blocked",
67
- [h.version]: owner.marker,
68
- },
69
- );
70
- yield* owner.write(
71
- owner.database
72
- .update(g.table)
73
- .set({
74
- [g.activeIdentityKey]: null,
75
- [g.state]: "ReauthorizationRequired",
76
- [g.version]: owner.marker,
77
- })
78
- .where(active),
79
- );
80
- for (const observation of owner.observations)
81
- if (observation.table === g.table)
82
- observation.rows = observation.rows.map((row) =>
83
- row[g.cohortKey] === cohort.id && row[g.activeIdentityKey] !== null
84
- ? {
85
- ...row,
86
- [g.activeIdentityKey]: null,
87
- [g.state]: "ReauthorizationRequired",
88
- [g.version]: owner.marker,
89
- }
90
- : row,
91
- );
92
- owner.postconditions.push(sql`not exists(select 1 from ${g.table} where ${active})`);
93
- cohort.generation = generation;
94
- cohort.cutoff = cutoff;
95
- cohort.blocked = true;
96
-
97
- return affected;
98
- });
99
-
100
- export const storeJob = Effect.fn("oauthConnected.storeJob")(function* (
101
- mapping: S.Mapping,
102
- job: M.OAuthConnectedRevocationJob,
103
- token: M.OAuthConnectedTokenContext,
104
- native: unknown,
105
- now: number,
106
- ) {
107
- const owner = yield* CurrentOAuthTransaction;
108
-
109
- invariant(
110
- mapping.revocation.mode === "cohort" &&
111
- token.configuration.profile.revocation === "cohort" &&
112
- sameContext(job.context.token, token),
113
- );
114
-
115
- const j = mapping.revocation.job,
116
- identity = yield* oauthIdentityKey(token.identity),
117
- client = yield* S.clientKey(token.configuration),
118
- cohort = yield* S.cohortKey(client, identity);
119
-
120
- const h = mapping.cohort;
121
-
122
- owner.postconditions.push(
123
- sql`exists(select 1 from ${h.table} where ${both(equal(h.table, { [h.cohortKey]: cohort, [h.clientKey]: client, [h.identityKey]: identity, [h.state]: "Blocked" }))})`,
124
- );
125
- const key = { [j.jobId]: job.context.jobId };
126
- const prior = yield* owner.read(j.table, equal(j.table, key), { limit: 1 });
127
-
128
- if (prior.rows.length) {
129
- const row = prior.rows[0]!;
130
-
131
- invariant(
132
- row[j.snapshot] === S.jobStorage.encode(job) &&
133
- row[j.moduleId] === token.moduleId &&
134
- mapping.subjectId.equals(row[j.subjectId], native) &&
135
- row[j.identityKey] === identity &&
136
- row[j.clientKey] === client &&
137
- row[j.cohortKey] === cohort &&
138
- row[j.grantId] === token.grantId &&
139
- ["Pending", "Claimed", "Confirmed", "Unknown"].includes(row[j.state]),
140
- );
141
- invariant(
142
- row[j.state] === "Pending"
143
- ? row[j.claimId] === null && row[j.claimedAt] === null && row[j.claimExpiresAt] === null
144
- : typeof row[j.claimId] === "string" &&
145
- mapping.clock.decodeInstant(row[j.claimExpiresAt]) >
146
- mapping.clock.decodeInstant(row[j.claimedAt]),
147
- );
148
-
149
- return;
150
- }
151
-
152
- const inserted = yield* owner.insert(
153
- j.table,
154
- {
155
- ...j.encodeInsert({
156
- job: snapshotOAuthSync(M.OAuthConnectedRevocationJob, job),
157
- subjectId: S.nativeCopy(native),
158
- }),
159
- ...key,
160
- [j.moduleId]: token.moduleId,
161
- [j.subjectId]: native,
162
- [j.identityKey]: identity,
163
- [j.clientKey]: client,
164
- [j.cohortKey]: cohort,
165
- [j.grantId]: token.grantId,
166
- [j.snapshot]: S.jobStorage.encode(job),
167
- [j.state]: "Pending",
168
- [j.claimId]: null,
169
- [j.claimedAt]: null,
170
- [j.claimExpiresAt]: null,
171
- [j.retentionUntil]: mapping.clock.encodeInstant(S.retainedUntil(mapping, now)),
172
- [j.version]: owner.marker,
173
- },
174
- key,
175
- );
176
-
177
- prior.rows = inserted.rows;
178
- });
179
-
180
- const noJobs = (mapping: S.Authority, id: string | SQL, except?: string) => {
181
- const j = S.jobTable(mapping);
182
-
183
- return j === undefined
184
- ? sql`1 = 1`
185
- : sql`not exists(select 1 from ${j.table} where ${both(eq(col(j.table, j.cohortKey), id), ne(col(j.table, j.state), "Confirmed"), except === undefined ? undefined : ne(col(j.table, j.jobId), except))})`;
186
- };
187
-
188
- export const clearableCondition = (
189
- mapping: S.Authority,
190
- cohortId: string | SQL,
191
- clientId: string | SQL,
192
- ) => {
193
- const f = mapping.flow;
194
-
195
- return both(
196
- sql`not exists(select 1 from ${f.table} where ${S.unknownWork(mapping, clientId)})`,
197
- S.cohortWork(mapping, cohortId),
198
- noJobs(mapping, cohortId),
199
- );
200
- };
201
-
202
- /** Clearing owns a NEW cutoff. Claims made while the remote revoke was pending
203
- * cannot enter the next generation even if they finish after that revoke. */
204
- export const clear = Effect.fn("oauthConnected.clear")(function* (
205
- mapping: S.Authority,
206
- client: Client,
207
- cohort: Cohort,
208
- confirmedJob?: string,
209
- provenOpenWithoutNewJob = false,
210
- ) {
211
- const owner = yield* CurrentOAuthTransaction;
212
-
213
- if (
214
- !cohort.blocked ||
215
- cohort.row === undefined ||
216
- (S.jobTable(mapping) === undefined && !provenOpenWithoutNewJob)
217
- )
218
- return false;
219
- const f = mapping.flow;
220
- const noUnknown = sql`not exists(select 1 from ${f.table} where ${S.unknownWork(mapping, client.id)})`;
221
- const work = S.cohortWork(mapping, cohort.id);
222
-
223
- if (!(yield* owner.check(both(noUnknown, work, noJobs(mapping, cohort.id, confirmedJob)))))
224
- return false;
225
-
226
- const cutoff = yield* S.nextOrder(mapping, client),
227
- h = mapping.cohort;
228
-
229
- const generation = M.OAuthConnectedTarget.fields.cohortGeneration.make(owner.marker + ":open");
230
-
231
- yield* owner.update(
232
- h.table,
233
- { [h.cohortKey]: cohort.id },
234
- {
235
- [h.generation]: generation,
236
- [h.cutoff]: mapping.order.encode(cutoff),
237
- [h.state]: "Open",
238
- [h.version]: owner.marker,
239
- },
240
- );
241
- owner.postconditions.push(noUnknown, work, noJobs(mapping, cohort.id));
242
- cohort.generation = generation;
243
- cohort.cutoff = cutoff;
244
- cohort.blocked = false;
245
-
246
- return true;
247
- });
248
-
249
- /** Former local owners remain visible. A foreign historical dependency cannot be
250
- * ignored simply because the global tuple was changed outside this authority. */
251
- export const noFormerOwner = (
252
- mapping: S.Authority,
253
- identity: string,
254
- client: string,
255
- native: unknown,
256
- ) =>
257
- Effect.gen(function* () {
258
- const owner = yield* CurrentOAuthTransaction;
259
-
260
- const g = mapping.grant,
261
- f = mapping.flow,
262
- j = S.jobTable(mapping);
263
-
264
- const condition = both(
265
- sql`not exists(select 1 from ${g.table} where ${both(eq(col(g.table, g.identityKey), identity), sql`not (${owner.exact(g.table, { [g.subjectId]: native })})`)})`,
266
- sql`not exists(select 1 from ${f.table} where ${both(eq(col(f.table, f.cohortKey), yield* S.cohortKey(client, identity)), eq(col(f.table, f.work), "Unresolved"), sql`not (${owner.exact(f.table, { [f.subjectId]: native })})`)})`,
267
- ...(j === undefined
268
- ? []
269
- : [
270
- sql`not exists(select 1 from ${j.table} where ${both(eq(col(j.table, j.identityKey), identity), sql`not (${owner.exact(j.table, { [j.subjectId]: native })})`)})`,
271
- ]),
272
- );
273
-
274
- return yield* Effect.map(owner.check(condition), (accepted) => {
275
- if (accepted) owner.postconditions.push(condition);
276
-
277
- return accepted;
278
- });
279
- });