@yielded/auth-persistence-drizzle 0.1.0-beta.22 → 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.
- package/README.md +3 -0
- package/dist/D1.d.mts +11 -11
- package/dist/D1.mjs +2 -1
- package/dist/D1.mjs.map +1 -1
- package/dist/Libsql.d.mts +40 -56
- package/dist/Libsql.mjs +2 -1
- package/dist/Libsql.mjs.map +1 -1
- package/dist/Mysql2.d.mts +16 -17
- package/dist/Pglite.d.mts +18 -18
- package/dist/Pglite.mjs +2 -1
- package/dist/Pglite.mjs.map +1 -1
- package/dist/Postgres.d.mts +24 -24
- package/dist/Postgres.mjs +2 -1
- package/dist/Postgres.mjs.map +1 -1
- package/dist/SqliteBun.d.mts +39 -55
- package/dist/SqliteBun.mjs +2 -1
- package/dist/SqliteBun.mjs.map +1 -1
- package/dist/SqliteDo.d.mts +48 -64
- package/dist/SqliteDo.mjs +2 -1
- package/dist/SqliteDo.mjs.map +1 -1
- package/dist/SqliteNode.d.mts +45 -61
- package/dist/SqliteNode.mjs +2 -1
- package/dist/SqliteNode.mjs.map +1 -1
- package/dist/SqliteWasm.d.mts +48 -64
- package/dist/SqliteWasm.mjs +2 -1
- package/dist/SqliteWasm.mjs.map +1 -1
- package/dist/drizzle/crypto.mjs +1 -1
- package/dist/drizzle/d1-emails.d.mts +1 -1
- package/dist/drizzle/d1-oauth.d.mts +14 -14
- package/dist/drizzle/d1-passkey.d.mts +1 -1
- package/dist/drizzle/d1-password-prepared.d.mts +4 -4
- package/dist/drizzle/d1-password-prepared.mjs.map +1 -1
- package/dist/drizzle/d1-passwords.d.mts +18 -35
- package/dist/drizzle/d1-passwords.mjs +78 -290
- package/dist/drizzle/d1-passwords.mjs.map +1 -1
- package/dist/drizzle/d1-phone.d.mts +1 -1
- package/dist/drizzle/d1-proofs.d.mts +2 -2
- package/dist/drizzle/d1-sessions.d.mts +3 -3
- package/dist/drizzle/d1-sessions.mjs +11 -6
- package/dist/drizzle/d1-sessions.mjs.map +1 -1
- package/dist/drizzle/d1-totp.d.mts +1 -1
- package/dist/drizzle/mysql-password-prepared.d.mts +5 -5
- package/dist/drizzle/mysql-password-prepared.mjs.map +1 -1
- package/dist/drizzle/mysql-passwords.d.mts +16 -32
- package/dist/drizzle/mysql-passwords.mjs.map +1 -1
- package/dist/drizzle/mysql-sessions.d.mts +1 -1
- package/dist/drizzle/native-sql-table.mjs +135 -0
- package/dist/drizzle/native-sql-table.mjs.map +1 -0
- package/dist/drizzle/oauth-connected-model.d.mts +20 -281
- package/dist/drizzle/oauth-connected-model.mjs +3 -17
- package/dist/drizzle/oauth-connected-model.mjs.map +1 -1
- package/dist/drizzle/oauth-connected-reference.d.mts +1 -3
- package/dist/drizzle/oauth-connected-reference.mjs +4 -53
- package/dist/drizzle/oauth-connected-reference.mjs.map +1 -1
- package/dist/drizzle/oauth-connected-target.d.mts +3 -990
- package/dist/drizzle/oauth-connected-target.mjs +8 -92
- package/dist/drizzle/oauth-connected-target.mjs.map +1 -1
- package/dist/drizzle/oauth-kernel.mjs +11 -0
- package/dist/drizzle/oauth-kernel.mjs.map +1 -0
- package/dist/drizzle/oauth-model.d.mts +35 -438
- package/dist/drizzle/oauth-model.mjs +6 -44
- package/dist/drizzle/oauth-model.mjs.map +1 -1
- package/dist/drizzle/oauth-mysql.mjs +2 -2
- package/dist/drizzle/oauth-mysql.mjs.map +1 -1
- package/dist/drizzle/oauth-proxy.d.mts +10 -0
- package/dist/drizzle/oauth-proxy.mjs +54 -0
- package/dist/drizzle/oauth-proxy.mjs.map +1 -0
- package/dist/drizzle/oauth-target.d.mts +6 -107
- package/dist/drizzle/oauth-target.mjs +15 -245
- package/dist/drizzle/oauth-target.mjs.map +1 -1
- package/dist/drizzle/password-model.d.mts +5 -8
- package/dist/drizzle/password-prepared-model.d.mts +5 -5
- package/dist/drizzle/password-prepared-model.mjs.map +1 -1
- package/dist/drizzle/password-prepared-state.mjs +1 -1
- package/dist/drizzle/password-sql.mjs +2 -1
- package/dist/drizzle/password-sql.mjs.map +1 -1
- package/dist/drizzle/password-target.mjs +13 -2
- package/dist/drizzle/password-target.mjs.map +1 -1
- package/dist/drizzle/pg-password-prepared.d.mts +5 -5
- package/dist/drizzle/pg-password-prepared.mjs.map +1 -1
- package/dist/drizzle/pg-passwords.d.mts +16 -32
- package/dist/drizzle/pg-passwords.mjs.map +1 -1
- package/dist/drizzle/pg-sessions.d.mts +1 -1
- package/dist/drizzle/phone-target.d.mts +2 -2
- package/dist/drizzle/phone-target.mjs +1 -1
- package/dist/drizzle/query-operations.mjs +3 -1
- package/dist/drizzle/query-operations.mjs.map +1 -1
- package/dist/drizzle/session-sql.mjs +2 -1
- package/dist/drizzle/session-sql.mjs.map +1 -1
- package/dist/drizzle/sqlite-password-prepared.mjs.map +1 -1
- package/dist/drizzle/sqlite-passwords.mjs.map +1 -1
- package/dist/drizzle/storage-validation.mjs +10 -198
- package/dist/drizzle/storage-validation.mjs.map +1 -1
- package/dist/drizzle/totp-target.d.mts +3 -3
- package/dist/drizzle/totp-target.mjs +2 -2
- package/dist/drizzle/transaction-execution.d.mts +2 -2
- package/dist/drizzle/transaction-owner.d.mts +1 -2
- package/dist/index.d.mts +3 -2
- package/dist/internal/drizzle-postgres-oauth-proxy.d.mts +138 -0
- package/dist/internal/drizzle-postgres-oauth-proxy.mjs +29 -0
- package/dist/internal/drizzle-postgres-oauth-proxy.mjs.map +1 -0
- package/dist/internal/drizzle-postgres.mjs +2 -0
- package/dist/internal/drizzle-postgres.mjs.map +1 -1
- package/dist/internal/drizzle-sqlite-oauth-proxy.d.mts +146 -0
- package/dist/internal/drizzle-sqlite-oauth-proxy.mjs +29 -0
- package/dist/internal/drizzle-sqlite-oauth-proxy.mjs.map +1 -0
- package/dist/internal/drizzle-sqlite.mjs +2 -0
- package/dist/internal/drizzle-sqlite.mjs.map +1 -1
- package/package.json +1 -1
- package/src/D1.ts +2 -0
- package/src/Libsql.ts +2 -0
- package/src/Pglite.ts +2 -0
- package/src/Postgres.ts +2 -0
- package/src/SqliteBun.ts +2 -0
- package/src/SqliteDo.ts +2 -0
- package/src/SqliteNode.ts +2 -0
- package/src/SqliteWasm.ts +2 -0
- package/src/drizzle/d1-password-prepared.ts +2 -23
- package/src/drizzle/d1-passwords.ts +158 -780
- package/src/drizzle/d1-sessions.ts +21 -6
- package/src/drizzle/mysql-password-prepared.ts +4 -16
- package/src/drizzle/mysql-passwords.ts +5 -20
- package/src/drizzle/native-sql-table.ts +259 -0
- package/src/drizzle/oauth-connected-model.ts +97 -315
- package/src/drizzle/oauth-connected-reference.ts +13 -93
- package/src/drizzle/oauth-connected-target.ts +14 -271
- package/src/drizzle/oauth-kernel.ts +10 -0
- package/src/drizzle/oauth-model.ts +188 -541
- package/src/drizzle/oauth-mysql.ts +2 -2
- package/src/drizzle/oauth-proxy.ts +101 -0
- package/src/drizzle/oauth-target.ts +33 -737
- package/src/drizzle/password-model.ts +0 -33
- package/src/drizzle/password-prepared-model.ts +0 -18
- package/src/drizzle/password-sql.ts +3 -0
- package/src/drizzle/password-target.ts +41 -4
- package/src/drizzle/pg-password-prepared.ts +4 -16
- package/src/drizzle/pg-passwords.ts +5 -20
- package/src/drizzle/query-operations.ts +4 -0
- package/src/drizzle/session-sql.ts +2 -1
- package/src/drizzle/sqlite-password-prepared.ts +4 -52
- package/src/drizzle/sqlite-passwords.ts +7 -28
- package/src/drizzle/storage-validation.ts +13 -222
- package/src/index.ts +2 -8
- package/src/internal/drizzle-postgres-oauth-proxy.ts +37 -0
- package/src/internal/drizzle-postgres.ts +2 -0
- package/src/internal/drizzle-sqlite-oauth-proxy.ts +44 -0
- package/src/internal/drizzle-sqlite.ts +2 -0
- package/dist/_virtual/_rolldown/runtime.mjs +0 -13
- package/dist/drizzle/oauth-accounts.mjs +0 -359
- package/dist/drizzle/oauth-accounts.mjs.map +0 -1
- package/dist/drizzle/oauth-connected-access.mjs +0 -212
- package/dist/drizzle/oauth-connected-access.mjs.map +0 -1
- package/dist/drizzle/oauth-connected-collection.mjs +0 -202
- package/dist/drizzle/oauth-connected-collection.mjs.map +0 -1
- package/dist/drizzle/oauth-connected-custody.mjs +0 -147
- package/dist/drizzle/oauth-connected-custody.mjs.map +0 -1
- package/dist/drizzle/oauth-connected-flow.mjs +0 -297
- package/dist/drizzle/oauth-connected-flow.mjs.map +0 -1
- package/dist/drizzle/oauth-connected-input.mjs +0 -122
- package/dist/drizzle/oauth-connected-input.mjs.map +0 -1
- package/dist/drizzle/oauth-connected-maintenance.mjs +0 -214
- package/dist/drizzle/oauth-connected-maintenance.mjs.map +0 -1
- package/dist/drizzle/oauth-connected-management.mjs +0 -229
- package/dist/drizzle/oauth-connected-management.mjs.map +0 -1
- package/dist/drizzle/oauth-connected-settlement.mjs +0 -128
- package/dist/drizzle/oauth-connected-settlement.mjs.map +0 -1
- package/dist/drizzle/oauth-connected-sign-in.mjs +0 -265
- package/dist/drizzle/oauth-connected-sign-in.mjs.map +0 -1
- package/dist/drizzle/oauth-connected-state.d.mts +0 -2062
- package/dist/drizzle/oauth-connected-state.mjs +0 -430
- package/dist/drizzle/oauth-connected-state.mjs.map +0 -1
- package/dist/drizzle/oauth-flow.d.mts +0 -22
- package/dist/drizzle/oauth-flow.mjs +0 -253
- package/dist/drizzle/oauth-flow.mjs.map +0 -1
- package/dist/drizzle/oauth-input.mjs +0 -127
- package/dist/drizzle/oauth-input.mjs.map +0 -1
- package/dist/drizzle/oauth-owner.d.mts +0 -10
- package/dist/drizzle/oauth-owner.mjs +0 -10
- package/dist/drizzle/oauth-owner.mjs.map +0 -1
- package/dist/drizzle/oauth-registration.d.mts +0 -5
- package/dist/drizzle/oauth-registration.mjs +0 -374
- package/dist/drizzle/oauth-registration.mjs.map +0 -1
- package/dist/drizzle/oauth-state.mjs +0 -107
- package/dist/drizzle/oauth-state.mjs.map +0 -1
- package/src/drizzle/oauth-accounts.ts +0 -805
- package/src/drizzle/oauth-connected-access.ts +0 -361
- package/src/drizzle/oauth-connected-collection.ts +0 -324
- package/src/drizzle/oauth-connected-custody.ts +0 -279
- package/src/drizzle/oauth-connected-flow.ts +0 -529
- package/src/drizzle/oauth-connected-input.ts +0 -147
- package/src/drizzle/oauth-connected-maintenance.ts +0 -346
- package/src/drizzle/oauth-connected-management.ts +0 -365
- package/src/drizzle/oauth-connected-settlement.ts +0 -251
- package/src/drizzle/oauth-connected-sign-in.ts +0 -443
- package/src/drizzle/oauth-connected-state.ts +0 -872
- package/src/drizzle/oauth-flow.ts +0 -462
- package/src/drizzle/oauth-input.ts +0 -201
- package/src/drizzle/oauth-owner.ts +0 -29
- package/src/drizzle/oauth-registration.ts +0 -640
- package/src/drizzle/oauth-state.ts +0 -218
|
@@ -7,8 +7,8 @@ import { AnyRelations } from "drizzle-orm";
|
|
|
7
7
|
import { Crypto, Effect } from "effect";
|
|
8
8
|
import { LifecycleHooks } from "@yielded/auth/Hooks";
|
|
9
9
|
import { TotpPersistence } from "@yielded/auth/Totp";
|
|
10
|
-
import { EffectSQLiteD1Database } from "drizzle-orm/effect-d1";
|
|
11
10
|
import { AnySQLiteTable } from "drizzle-orm/sqlite-core";
|
|
11
|
+
import { EffectSQLiteD1Database } from "drizzle-orm/effect-d1";
|
|
12
12
|
import { D1Client } from "@effect/sql-d1/D1Client";
|
|
13
13
|
//#region src/drizzle/d1-totp.d.ts
|
|
14
14
|
type Database = EffectSQLiteD1Database<AnyRelations> & {
|
|
@@ -11,17 +11,17 @@ import { SqlError } from "effect/sql/SqlError";
|
|
|
11
11
|
//#region src/drizzle/mysql-password-prepared.d.ts
|
|
12
12
|
type Database = EffectMysql2Database<AnyRelations>;
|
|
13
13
|
type TransactionOf<D extends Database> = Parameters<Parameters<D["transaction"]>[0]>[0];
|
|
14
|
-
export declare const makeMySqlPasswordPreparedPersistenceServices: <S extends AnyMySqlTable, I extends AnyMySqlTable, C extends AnyMySqlTable, AC extends AnyMySqlTable,
|
|
14
|
+
export declare const makeMySqlPasswordPreparedPersistenceServices: <S extends AnyMySqlTable, I extends AnyMySqlTable, C extends AnyMySqlTable, AC extends AnyMySqlTable, M extends AnyMySqlTable, T extends AnyMySqlTable, B extends AnyMySqlTable, NativeId, PS extends AnyMySqlTable = AnyMySqlTable, PC extends AnyMySqlTable = AnyMySqlTable, PM extends AnyMySqlTable = AnyMySqlTable, PSub extends AnyMySqlTable = AnyMySqlTable, PI extends AnyMySqlTable = AnyMySqlTable, PCr extends AnyMySqlTable = AnyMySqlTable, PNativeId = unknown>(mapping: PasswordPreparedPersistenceMapping<S, I, C, AC, M, T, B, NativeId>, proofMapping?: PasswordPreparedProofMapping<PS, PC, PM, PSub, PI, PCr, PNativeId>) => Effect.Effect<{
|
|
15
15
|
passwordPreparedPersistence: PasswordPreparedPersistence;
|
|
16
16
|
}, PasswordUnavailable, Database$1 | LifecycleHooks>;
|
|
17
|
-
export declare function coordinateMySqlPasswordPreparedPersistence<TargetId, D extends Database, S extends AnyMySqlTable, I extends AnyMySqlTable, C extends AnyMySqlTable, AC extends AnyMySqlTable,
|
|
18
|
-
readonly mapping: PasswordPreparedPersistenceMapping<S, I, C, AC,
|
|
17
|
+
export declare function coordinateMySqlPasswordPreparedPersistence<TargetId, D extends Database, S extends AnyMySqlTable, I extends AnyMySqlTable, C extends AnyMySqlTable, AC extends AnyMySqlTable, M extends AnyMySqlTable, T extends AnyMySqlTable, B extends AnyMySqlTable, NativeId, PS extends AnyMySqlTable, PC extends AnyMySqlTable, PM extends AnyMySqlTable, PSub extends AnyMySqlTable, PI extends AnyMySqlTable, PCr extends AnyMySqlTable, PNativeId, Out, E, R, DatabaseError, DatabaseRequirements>(acquire: Effect.Effect<D, DatabaseError, DatabaseRequirements>, options: {
|
|
18
|
+
readonly mapping: PasswordPreparedPersistenceMapping<S, I, C, AC, M, T, B, NativeId>;
|
|
19
19
|
readonly proofMapping?: PasswordPreparedProofMapping<PS, PC, PM, PSub, PI, PCr, PNativeId> | undefined;
|
|
20
20
|
readonly target: SuppliedService<TargetId, PasswordPreparedPersistence>;
|
|
21
21
|
readonly transaction?: never;
|
|
22
22
|
}, body: Effect.Effect<Out, E, R>): Effect.Effect<Out, E | PasswordUnavailable | HookConfigurationError | SqlError | DatabaseError, Exclude<R, TargetId> | LifecycleHooks | DatabaseRequirements>;
|
|
23
|
-
export declare function coordinateMySqlPasswordPreparedPersistence<TargetId, D extends Database, S extends AnyMySqlTable, I extends AnyMySqlTable, C extends AnyMySqlTable, AC extends AnyMySqlTable,
|
|
24
|
-
readonly mapping: PasswordPreparedPersistenceMapping<S, I, C, AC,
|
|
23
|
+
export declare function coordinateMySqlPasswordPreparedPersistence<TargetId, D extends Database, S extends AnyMySqlTable, I extends AnyMySqlTable, C extends AnyMySqlTable, AC extends AnyMySqlTable, M extends AnyMySqlTable, T extends AnyMySqlTable, B extends AnyMySqlTable, NativeId, PS extends AnyMySqlTable, PC extends AnyMySqlTable, PM extends AnyMySqlTable, PSub extends AnyMySqlTable, PI extends AnyMySqlTable, PCr extends AnyMySqlTable, PNativeId, Out, E, R, DatabaseError, DatabaseRequirements, TxId, TxShape>(acquire: Effect.Effect<D, DatabaseError, DatabaseRequirements>, options: {
|
|
24
|
+
readonly mapping: PasswordPreparedPersistenceMapping<S, I, C, AC, M, T, B, NativeId>;
|
|
25
25
|
readonly proofMapping?: PasswordPreparedProofMapping<PS, PC, PM, PSub, PI, PCr, PNativeId> | undefined;
|
|
26
26
|
readonly target: SuppliedService<TargetId, PasswordPreparedPersistence>;
|
|
27
27
|
readonly transaction: SuppliedService<TxId, NoInfer<TransactionOf<D>>, TxShape>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mysql-password-prepared.mjs","names":["DatabaseService"],"sources":["../../src/drizzle/mysql-password-prepared.ts"],"sourcesContent":["import { NativeDatabase } from \"@yielded/auth-persistence/Adapter\";\nimport type { LifecycleHooks, HookConfigurationError } from \"@yielded/auth/Hooks\";\nimport type { PasswordUnavailable, PasswordPreparedPersistence } from \"@yielded/auth/Password\";\nimport type { AnyRelations } from \"drizzle-orm\";\nimport type { EffectMysql2Database } from \"drizzle-orm/effect-mysql2\";\nimport type { AnyMySqlTable } from \"drizzle-orm/mysql-core\";\nimport { Effect, Context } from \"effect\";\nimport type { SqlError } from \"effect/sql/SqlError\";\n\nimport { Database as DatabaseService } from \"./mysql-database\";\nimport { mysqlPasswordConfiguration as configuration } from \"./mysql-passwords\";\nimport { nativeDatabase } from \"./native-database\";\nimport type {\n PasswordPreparedPersistenceMapping,\n PasswordPreparedProofMapping,\n} from \"./password-prepared-model\";\nimport {\n makeTargetPasswordPreparedPersistenceServices,\n coordinateTargetPasswordPreparedPersistence,\n} from \"./password-prepared-target\";\nimport { CurrentPasswordSql } from \"./password-sql\";\nimport { acquireTransactionService, transactionService } from \"./standalone-guard\";\nimport type { SuppliedService } from \"./SuppliedService\";\ntype Database = EffectMysql2Database<AnyRelations>;\ntype TransactionOf<D extends Database> = Parameters<Parameters<D[\"transaction\"]>[0]>[0];\n\nexport const makeMySqlPasswordPreparedPersistenceServices = <\n S extends AnyMySqlTable,\n I extends AnyMySqlTable,\n C extends AnyMySqlTable,\n AC extends AnyMySqlTable,\n
|
|
1
|
+
{"version":3,"file":"mysql-password-prepared.mjs","names":["DatabaseService"],"sources":["../../src/drizzle/mysql-password-prepared.ts"],"sourcesContent":["import { NativeDatabase } from \"@yielded/auth-persistence/Adapter\";\nimport type { LifecycleHooks, HookConfigurationError } from \"@yielded/auth/Hooks\";\nimport type { PasswordUnavailable, PasswordPreparedPersistence } from \"@yielded/auth/Password\";\nimport type { AnyRelations } from \"drizzle-orm\";\nimport type { EffectMysql2Database } from \"drizzle-orm/effect-mysql2\";\nimport type { AnyMySqlTable } from \"drizzle-orm/mysql-core\";\nimport { Effect, Context } from \"effect\";\nimport type { SqlError } from \"effect/sql/SqlError\";\n\nimport { Database as DatabaseService } from \"./mysql-database\";\nimport { mysqlPasswordConfiguration as configuration } from \"./mysql-passwords\";\nimport { nativeDatabase } from \"./native-database\";\nimport type {\n PasswordPreparedPersistenceMapping,\n PasswordPreparedProofMapping,\n} from \"./password-prepared-model\";\nimport {\n makeTargetPasswordPreparedPersistenceServices,\n coordinateTargetPasswordPreparedPersistence,\n} from \"./password-prepared-target\";\nimport { CurrentPasswordSql } from \"./password-sql\";\nimport { acquireTransactionService, transactionService } from \"./standalone-guard\";\nimport type { SuppliedService } from \"./SuppliedService\";\ntype Database = EffectMysql2Database<AnyRelations>;\ntype TransactionOf<D extends Database> = Parameters<Parameters<D[\"transaction\"]>[0]>[0];\n\nexport const makeMySqlPasswordPreparedPersistenceServices = <\n S extends AnyMySqlTable,\n I extends AnyMySqlTable,\n C extends AnyMySqlTable,\n AC extends AnyMySqlTable,\n M extends AnyMySqlTable,\n T extends AnyMySqlTable,\n B extends AnyMySqlTable,\n NativeId,\n PS extends AnyMySqlTable = AnyMySqlTable,\n PC extends AnyMySqlTable = AnyMySqlTable,\n PM extends AnyMySqlTable = AnyMySqlTable,\n PSub extends AnyMySqlTable = AnyMySqlTable,\n PI extends AnyMySqlTable = AnyMySqlTable,\n PCr extends AnyMySqlTable = AnyMySqlTable,\n PNativeId = unknown,\n>(\n mapping: PasswordPreparedPersistenceMapping<S, I, C, AC, M, T, B, NativeId>,\n proofMapping?: PasswordPreparedProofMapping<PS, PC, PM, PSub, PI, PCr, PNativeId>,\n) =>\n Effect.flatMap(\n Effect.map(acquireTransactionService(DatabaseService), configuration),\n (configuration) =>\n makeTargetPasswordPreparedPersistenceServices(mapping, configuration, proofMapping),\n ).pipe(\n Effect.provideServiceEffect(CurrentPasswordSql, nativeDatabase(DatabaseService)),\n Effect.provideServiceEffect(NativeDatabase, nativeDatabase(DatabaseService)),\n );\n\nexport function coordinateMySqlPasswordPreparedPersistence<\n TargetId,\n D extends Database,\n S extends AnyMySqlTable,\n I extends AnyMySqlTable,\n C extends AnyMySqlTable,\n AC extends AnyMySqlTable,\n M extends AnyMySqlTable,\n T extends AnyMySqlTable,\n B extends AnyMySqlTable,\n NativeId,\n PS extends AnyMySqlTable,\n PC extends AnyMySqlTable,\n PM extends AnyMySqlTable,\n PSub extends AnyMySqlTable,\n PI extends AnyMySqlTable,\n PCr extends AnyMySqlTable,\n PNativeId,\n Out,\n E,\n R,\n DatabaseError,\n DatabaseRequirements,\n>(\n acquire: Effect.Effect<D, DatabaseError, DatabaseRequirements>,\n options: {\n readonly mapping: PasswordPreparedPersistenceMapping<S, I, C, AC, M, T, B, NativeId>;\n readonly proofMapping?:\n | PasswordPreparedProofMapping<PS, PC, PM, PSub, PI, PCr, PNativeId>\n | undefined;\n readonly target: SuppliedService<TargetId, PasswordPreparedPersistence>;\n readonly transaction?: never;\n },\n body: Effect.Effect<Out, E, R>,\n): Effect.Effect<\n Out,\n E | PasswordUnavailable | HookConfigurationError | SqlError | DatabaseError,\n Exclude<R, TargetId> | LifecycleHooks | DatabaseRequirements\n>;\n\nexport function coordinateMySqlPasswordPreparedPersistence<\n TargetId,\n D extends Database,\n S extends AnyMySqlTable,\n I extends AnyMySqlTable,\n C extends AnyMySqlTable,\n AC extends AnyMySqlTable,\n M extends AnyMySqlTable,\n T extends AnyMySqlTable,\n B extends AnyMySqlTable,\n NativeId,\n PS extends AnyMySqlTable,\n PC extends AnyMySqlTable,\n PM extends AnyMySqlTable,\n PSub extends AnyMySqlTable,\n PI extends AnyMySqlTable,\n PCr extends AnyMySqlTable,\n PNativeId,\n Out,\n E,\n R,\n DatabaseError,\n DatabaseRequirements,\n TxId,\n TxShape,\n>(\n acquire: Effect.Effect<D, DatabaseError, DatabaseRequirements>,\n options: {\n readonly mapping: PasswordPreparedPersistenceMapping<S, I, C, AC, M, T, B, NativeId>;\n readonly proofMapping?:\n | PasswordPreparedProofMapping<PS, PC, PM, PSub, PI, PCr, PNativeId>\n | undefined;\n readonly target: SuppliedService<TargetId, PasswordPreparedPersistence>;\n readonly transaction: SuppliedService<TxId, NoInfer<TransactionOf<D>>, TxShape>;\n },\n body: Effect.Effect<Out, E, R>,\n): Effect.Effect<\n Out,\n E | PasswordUnavailable | HookConfigurationError | SqlError | DatabaseError,\n Exclude<R, TargetId | TxId> | LifecycleHooks | DatabaseRequirements\n>;\n\nexport function coordinateMySqlPasswordPreparedPersistence<\n TargetId,\n D extends Database,\n S extends AnyMySqlTable,\n I extends AnyMySqlTable,\n C extends AnyMySqlTable,\n AC extends AnyMySqlTable,\n M extends AnyMySqlTable,\n T extends AnyMySqlTable,\n B extends AnyMySqlTable,\n NativeId,\n PS extends AnyMySqlTable,\n PC extends AnyMySqlTable,\n PM extends AnyMySqlTable,\n PSub extends AnyMySqlTable,\n PI extends AnyMySqlTable,\n PCr extends AnyMySqlTable,\n PNativeId,\n Out,\n E,\n R,\n DatabaseError,\n DatabaseRequirements,\n TxId,\n TxShape,\n>(\n acquire: Effect.Effect<D, DatabaseError, DatabaseRequirements>,\n options: {\n readonly mapping: PasswordPreparedPersistenceMapping<S, I, C, AC, M, T, B, NativeId>;\n readonly proofMapping?:\n | PasswordPreparedProofMapping<PS, PC, PM, PSub, PI, PCr, PNativeId>\n | undefined;\n readonly target: SuppliedService<TargetId, PasswordPreparedPersistence>;\n readonly transaction?: SuppliedService<TxId, NoInfer<TransactionOf<D>>, TxShape>;\n },\n body: Effect.Effect<Out, E, R>,\n): Effect.Effect<\n Out,\n E | PasswordUnavailable | HookConfigurationError | SqlError | DatabaseError,\n Exclude<R, TargetId> | LifecycleHooks | DatabaseRequirements\n> {\n return Effect.flatMap(nativeDatabase(acquire), (database) =>\n coordinateTargetPasswordPreparedPersistence<TransactionOf<D>, Out, E, Exclude<R, TargetId>>(\n database,\n options.mapping,\n configuration(transactionService(database)),\n options.proofMapping,\n (\n transaction: TransactionOf<D>,\n services: { readonly passwordPreparedPersistence: PasswordPreparedPersistence },\n ) => {\n const provided = Context.make(options.target, services.passwordPreparedPersistence);\n const work = Effect.provideContext(body, provided);\n\n return options.transaction === undefined\n ? work\n : Effect.provideService(work, options.transaction, options.transaction.of(transaction));\n },\n ).pipe(Effect.provideService(NativeDatabase, database)),\n );\n}\n"],"mappings":";;;;;;;;;AA0BA,MAAa,gDAiBX,SACA,iBAEA,OAAO,QACL,OAAO,IAAI,0BAA0BA,QAAe,GAAG,aAAa,IACnE,kBACC,8CAA8C,SAAS,eAAe,YAAY,CACtF,CAAC,CAAC,KACA,OAAO,qBAAqB,oBAAoB,eAAeA,QAAe,CAAC,GAC/E,OAAO,qBAAqB,gBAAgB,eAAeA,QAAe,CAAC,CAC7E;AAoFF,SAAgB,2CA0Bd,SACA,SAQA,MAKA;CACA,OAAO,OAAO,QAAQ,eAAe,OAAO,IAAI,aAC9C,4CACE,UACA,QAAQ,SACR,cAAc,mBAAmB,QAAQ,CAAC,GAC1C,QAAQ,eAEN,aACA,aACG;EACH,MAAM,WAAW,QAAQ,KAAK,QAAQ,QAAQ,SAAS,2BAA2B;EAClF,MAAM,OAAO,OAAO,eAAe,MAAM,QAAQ;EAEjD,OAAO,QAAQ,gBAAgB,KAAA,IAC3B,OACA,OAAO,eAAe,MAAM,QAAQ,aAAa,QAAQ,YAAY,GAAG,WAAW,CAAC;CAC1F,CACF,CAAC,CAAC,KAAK,OAAO,eAAe,gBAAgB,QAAQ,CAAC,CACxD;AACF"}
|
|
@@ -16,27 +16,18 @@ import { SqlError } from "effect/sql/SqlError";
|
|
|
16
16
|
//#region src/drizzle/mysql-passwords.d.ts
|
|
17
17
|
type Database = EffectMysql2Database<AnyRelations>;
|
|
18
18
|
type TransactionOf<D extends Database> = Parameters<Parameters<D["transaction"]>[0]>[0];
|
|
19
|
-
type Mapping<S extends AnyMySqlTable, I extends AnyMySqlTable, C extends AnyMySqlTable, AC extends AnyMySqlTable,
|
|
20
|
-
export declare const makeMysqlPasswordPersistenceServices: <S extends AnyMySqlTable, I extends AnyMySqlTable, C extends AnyMySqlTable, AC extends AnyMySqlTable,
|
|
19
|
+
type Mapping<S extends AnyMySqlTable, I extends AnyMySqlTable, C extends AnyMySqlTable, AC extends AnyMySqlTable, M extends AnyMySqlTable, NativeId> = PasswordPersistenceMapping<S, I, C, AC, M, NativeId>;
|
|
20
|
+
export declare const makeMysqlPasswordPersistenceServices: <S extends AnyMySqlTable, I extends AnyMySqlTable, C extends AnyMySqlTable, AC extends AnyMySqlTable, M extends AnyMySqlTable, NativeId>(mapping: Mapping<S, I, C, AC, M, NativeId>, proofMapping?: ProofPersistenceMapping<any, any, any, any, any, any, any, any, any, any, any, any>) => Effect.Effect<{
|
|
21
21
|
passwordPersistence: {
|
|
22
|
-
readonly
|
|
22
|
+
readonly findCredential: (input: {
|
|
23
23
|
readonly moduleId: string;
|
|
24
|
-
readonly action: "sign-in" | "change";
|
|
25
24
|
readonly identifier: import("@yielded/auth/Identity").LoginIdentifier;
|
|
26
25
|
readonly subjectId?: import("@yielded/auth/Schema").SubjectId;
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
readonly
|
|
31
|
-
|
|
32
|
-
readonly captured?: import("@yielded/auth/Password").PasswordCredentialSnapshot;
|
|
33
|
-
readonly outcome: import("@yielded/auth/Password").PasswordAttemptDecision;
|
|
34
|
-
readonly rehash?: {
|
|
35
|
-
readonly expectedVersion: import("@yielded/auth/Sessions").SecurityRevision;
|
|
36
|
-
readonly expectedVerifier: import("effect/Redacted").Redacted<import("@yielded/auth/Password").EncodedPasswordHash>;
|
|
37
|
-
readonly nextVerifier: import("effect/Redacted").Redacted<import("@yielded/auth/Password").EncodedPasswordHash>;
|
|
38
|
-
};
|
|
39
|
-
}, prepare: import("@yielded/auth/Password").PreparePasswordCommit<import("@yielded/auth/Password").PasswordAttemptDecision, A_1>) => Effect.Effect<import("@yielded/auth/Hooks").PreparedCommit<A_1>, PasswordUnavailable>;
|
|
26
|
+
}) => Effect.Effect<import("effect/Option").Option<import("@yielded/auth/Password").PasswordCredentialSnapshot>, PasswordUnavailable>;
|
|
27
|
+
readonly rehashIfCurrent: (input: {
|
|
28
|
+
readonly credential: import("@yielded/auth/Password").PasswordCredentialSnapshot;
|
|
29
|
+
readonly nextVerifier: import("effect/Redacted").Redacted<import("@yielded/auth/Password").EncodedPasswordHash>;
|
|
30
|
+
}) => Effect.Effect<void, PasswordUnavailable>;
|
|
40
31
|
readonly readForSubject: (input: {
|
|
41
32
|
readonly moduleId: string;
|
|
42
33
|
readonly subjectId: import("@yielded/auth/Schema").SubjectId;
|
|
@@ -45,28 +36,21 @@ export declare const makeMysqlPasswordPersistenceServices: <S extends AnyMySqlTa
|
|
|
45
36
|
readonly moduleId: string;
|
|
46
37
|
readonly identifier: import("@yielded/auth/Identity").LoginIdentifier;
|
|
47
38
|
}) => Effect.Effect<import("effect/Option").Option<import("@yielded/auth/Password").PasswordCredentialSnapshot>, PasswordUnavailable>;
|
|
48
|
-
readonly addIfAbsent: <
|
|
49
|
-
readonly replaceIfCurrent: <
|
|
39
|
+
readonly addIfAbsent: <A>(input: import("@yielded/auth/Password").PasswordMutationInput, prepare: import("@yielded/auth/Password").PreparePasswordCommit<import("@yielded/auth/Password").PasswordMutationDecision, A>) => Effect.Effect<import("@yielded/auth/Hooks").PreparedCommit<A>, PasswordUnavailable>;
|
|
40
|
+
readonly replaceIfCurrent: <A>(input: import("@yielded/auth/Password").PasswordMutationInput, prepare: import("@yielded/auth/Password").PreparePasswordCommit<import("@yielded/auth/Password").PasswordMutationDecision, A>) => Effect.Effect<import("@yielded/auth/Hooks").PreparedCommit<A>, PasswordUnavailable>;
|
|
50
41
|
readonly checkReset: (input: import("@yielded/auth/Proofs").ProofCompletionInput) => Effect.Effect<boolean, PasswordUnavailable>;
|
|
51
|
-
readonly resetWithProof: <
|
|
42
|
+
readonly resetWithProof: <A>(input: import("@yielded/auth/Password").PasswordMutationInput & {
|
|
52
43
|
readonly completion: import("@yielded/auth/Proofs").ProofCompletionPlan;
|
|
53
|
-
}, prepare: import("@yielded/auth/Password").PreparePasswordCommit<import("@yielded/auth/Password").PasswordMutationDecision,
|
|
54
|
-
readonly cleanupAttempts: <A_1>(input: {
|
|
55
|
-
readonly moduleId: string;
|
|
56
|
-
readonly limit: number;
|
|
57
|
-
}, prepare: import("@yielded/auth/Password").PreparePasswordCommit<{
|
|
58
|
-
readonly removed: number;
|
|
59
|
-
readonly hasMore: boolean;
|
|
60
|
-
}, A_1>) => Effect.Effect<import("@yielded/auth/Hooks").PreparedCommit<A_1>, PasswordUnavailable>;
|
|
44
|
+
}, prepare: import("@yielded/auth/Password").PreparePasswordCommit<import("@yielded/auth/Password").PasswordMutationDecision, A>) => Effect.Effect<import("@yielded/auth/Hooks").PreparedCommit<A>, PasswordUnavailable>;
|
|
61
45
|
};
|
|
62
46
|
}, PasswordUnavailable, Database$1 | LifecycleHooks>;
|
|
63
|
-
export declare function coordinateMysqlPasswordPersistence<D extends Database, S extends AnyMySqlTable, I extends AnyMySqlTable, C extends AnyMySqlTable, AC extends AnyMySqlTable,
|
|
64
|
-
readonly mapping: Mapping<S, I, C, AC,
|
|
47
|
+
export declare function coordinateMysqlPasswordPersistence<D extends Database, S extends AnyMySqlTable, I extends AnyMySqlTable, C extends AnyMySqlTable, AC extends AnyMySqlTable, M extends AnyMySqlTable, NativeId, PM extends ProofPersistenceMapping<any, any, any, any, any, any, any, any, any, any, any, any> | undefined, Out, E, R, DatabaseError, DatabaseRequirements>(acquire: Effect.Effect<D, DatabaseError, DatabaseRequirements>, options: {
|
|
48
|
+
readonly mapping: Mapping<S, I, C, AC, M, NativeId>;
|
|
65
49
|
readonly proofMapping?: PM;
|
|
66
50
|
readonly transaction?: never;
|
|
67
51
|
}, body: Effect.Effect<Out, E, R>): Effect.Effect<Out, E | PasswordUnavailable | HookConfigurationError | SqlError | DatabaseError, Exclude<R, PasswordPersistence> | LifecycleHooks | DatabaseRequirements>;
|
|
68
|
-
export declare function coordinateMysqlPasswordPersistence<D extends Database, S extends AnyMySqlTable, I extends AnyMySqlTable, C extends AnyMySqlTable, AC extends AnyMySqlTable,
|
|
69
|
-
readonly mapping: Mapping<S, I, C, AC,
|
|
52
|
+
export declare function coordinateMysqlPasswordPersistence<D extends Database, S extends AnyMySqlTable, I extends AnyMySqlTable, C extends AnyMySqlTable, AC extends AnyMySqlTable, M extends AnyMySqlTable, NativeId, PM extends ProofPersistenceMapping<any, any, any, any, any, any, any, any, any, any, any, any> | undefined, Out, E, R, DatabaseError, DatabaseRequirements, TxId, TxShape>(acquire: Effect.Effect<D, DatabaseError, DatabaseRequirements>, options: {
|
|
53
|
+
readonly mapping: Mapping<S, I, C, AC, M, NativeId>;
|
|
70
54
|
readonly proofMapping?: PM;
|
|
71
55
|
readonly transaction: SuppliedService<TxId, NoInfer<TransactionOf<D>>, TxShape>;
|
|
72
56
|
}, body: Effect.Effect<Out, E, R>): Effect.Effect<Out, E | PasswordUnavailable | HookConfigurationError | SqlError | DatabaseError, Exclude<R, PasswordPersistence | TxId> | LifecycleHooks | DatabaseRequirements>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mysql-passwords.mjs","names":["DatabaseService"],"sources":["../../src/drizzle/mysql-passwords.ts"],"sourcesContent":["import { NativeDatabase } from \"@yielded/auth-persistence/Adapter\";\nimport type { LifecycleHooks, HookConfigurationError } from \"@yielded/auth/Hooks\";\nimport { type PasswordUnavailable, PasswordPersistence } from \"@yielded/auth/Password\";\n/* oxlint-disable no-explicit-any -- proof mapping tables are independently typed by the proof owner; this driver forwards them unchanged to the shared target. */\nimport type { AnyRelations } from \"drizzle-orm\";\nimport type { EffectMysql2Database } from \"drizzle-orm/effect-mysql2\";\nimport type { AnyMySqlTable } from \"drizzle-orm/mysql-core\";\nimport { Effect, Context } from \"effect\";\nimport type { SqlError } from \"effect/sql/SqlError\";\n\nimport { Database as DatabaseService } from \"./mysql-database\";\nimport { nativeDatabase } from \"./native-database\";\nimport type { PasswordPersistenceMapping, PasswordRegistrationMapping } from \"./password-model\";\nimport type { PasswordRegistrationAuthority } from \"./password-registration\";\nimport { CurrentPasswordSql } from \"./password-sql\";\nimport type { PasswordSqlQuery } from \"./password-sql\";\nimport {\n coordinateTargetPasswordPersistence,\n coordinateTargetPasswordRegistration,\n makeTargetPasswordPersistenceServices,\n makeTargetPasswordRegistrationServices,\n sqlClientPasswordStandaloneGuard,\n} from \"./password-target\";\nimport type { ProofPersistenceMapping } from \"./proof-model\";\nimport type { ProofSqlQuery } from \"./proof-sql\";\nimport { sqlClientProofStandaloneGuard } from \"./proof-target\";\nimport {\n type TransactionService,\n acquireTransactionService,\n transactionService,\n} from \"./standalone-guard\";\nimport type { SuppliedService } from \"./SuppliedService\";\n\ntype Database = EffectMysql2Database<AnyRelations>;\ntype TransactionOf<D extends Database> = Parameters<Parameters<D[\"transaction\"]>[0]>[0];\n\nconst configuration = (service: TransactionService | undefined) => ({\n mode: \"interactive\" as const,\n locking: true,\n standaloneGuard: sqlClientPasswordStandaloneGuard(service),\n insertIfAbsent: (query: PasswordSqlQuery, selfKey: string, selfValue: unknown) =>\n query.onDuplicateKeyUpdate({ set: { [selfKey]: selfValue } }),\n generatedSubjectRows: (query: PasswordSqlQuery) => query.$returningId(),\n proof: {\n mode: \"interactive\" as const,\n locking: true,\n standaloneGuard: sqlClientProofStandaloneGuard(service),\n insertIfAbsent: (query: ProofSqlQuery, selfKey: string, selfValue: unknown) =>\n query.onDuplicateKeyUpdate({ set: { [selfKey]: selfValue } }),\n },\n});\n\ntype Mapping<\n S extends AnyMySqlTable,\n I extends AnyMySqlTable,\n C extends AnyMySqlTable,\n AC extends AnyMySqlTable,\n A extends AnyMySqlTable,\n RS extends AnyMySqlTable,\n CE extends AnyMySqlTable,\n M extends AnyMySqlTable,\n NativeId,\n> = PasswordPersistenceMapping<S, I, C, AC, A, RS, CE, M, NativeId>;\n\nexport const makeMysqlPasswordPersistenceServices = <\n S extends AnyMySqlTable,\n I extends AnyMySqlTable,\n C extends AnyMySqlTable,\n AC extends AnyMySqlTable,\n A extends AnyMySqlTable,\n RS extends AnyMySqlTable,\n CE extends AnyMySqlTable,\n M extends AnyMySqlTable,\n NativeId,\n>(\n mapping: Mapping<S, I, C, AC, A, RS, CE, M, NativeId>,\n proofMapping?: ProofPersistenceMapping<\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any\n >,\n) =>\n Effect.flatMap(\n Effect.map(acquireTransactionService(DatabaseService), configuration),\n (configuration) => makeTargetPasswordPersistenceServices(mapping, configuration, proofMapping),\n ).pipe(\n Effect.provideServiceEffect(CurrentPasswordSql, nativeDatabase(DatabaseService)),\n Effect.provideServiceEffect(NativeDatabase, nativeDatabase(DatabaseService)),\n );\n\nexport function coordinateMysqlPasswordPersistence<\n D extends Database,\n S extends AnyMySqlTable,\n I extends AnyMySqlTable,\n C extends AnyMySqlTable,\n AC extends AnyMySqlTable,\n A extends AnyMySqlTable,\n RS extends AnyMySqlTable,\n CE extends AnyMySqlTable,\n M extends AnyMySqlTable,\n NativeId,\n PM extends\n | ProofPersistenceMapping<any, any, any, any, any, any, any, any, any, any, any, any>\n | undefined,\n Out,\n E,\n R,\n DatabaseError,\n DatabaseRequirements,\n>(\n acquire: Effect.Effect<D, DatabaseError, DatabaseRequirements>,\n options: {\n readonly mapping: Mapping<S, I, C, AC, A, RS, CE, M, NativeId>;\n readonly proofMapping?: PM;\n readonly transaction?: never;\n },\n body: Effect.Effect<Out, E, R>,\n): Effect.Effect<\n Out,\n E | PasswordUnavailable | HookConfigurationError | SqlError | DatabaseError,\n Exclude<R, PasswordPersistence> | LifecycleHooks | DatabaseRequirements\n>;\n\nexport function coordinateMysqlPasswordPersistence<\n D extends Database,\n S extends AnyMySqlTable,\n I extends AnyMySqlTable,\n C extends AnyMySqlTable,\n AC extends AnyMySqlTable,\n A extends AnyMySqlTable,\n RS extends AnyMySqlTable,\n CE extends AnyMySqlTable,\n M extends AnyMySqlTable,\n NativeId,\n PM extends\n | ProofPersistenceMapping<any, any, any, any, any, any, any, any, any, any, any, any>\n | undefined,\n Out,\n E,\n R,\n DatabaseError,\n DatabaseRequirements,\n TxId,\n TxShape,\n>(\n acquire: Effect.Effect<D, DatabaseError, DatabaseRequirements>,\n options: {\n readonly mapping: Mapping<S, I, C, AC, A, RS, CE, M, NativeId>;\n readonly proofMapping?: PM;\n readonly transaction: SuppliedService<TxId, NoInfer<TransactionOf<D>>, TxShape>;\n },\n body: Effect.Effect<Out, E, R>,\n): Effect.Effect<\n Out,\n E | PasswordUnavailable | HookConfigurationError | SqlError | DatabaseError,\n Exclude<R, PasswordPersistence | TxId> | LifecycleHooks | DatabaseRequirements\n>;\n\nexport function coordinateMysqlPasswordPersistence<\n D extends Database,\n S extends AnyMySqlTable,\n I extends AnyMySqlTable,\n C extends AnyMySqlTable,\n AC extends AnyMySqlTable,\n A extends AnyMySqlTable,\n RS extends AnyMySqlTable,\n CE extends AnyMySqlTable,\n M extends AnyMySqlTable,\n NativeId,\n PM extends\n | ProofPersistenceMapping<any, any, any, any, any, any, any, any, any, any, any, any>\n | undefined,\n Out,\n E,\n R,\n DatabaseError,\n DatabaseRequirements,\n TxId,\n TxShape,\n>(\n acquire: Effect.Effect<D, DatabaseError, DatabaseRequirements>,\n options: {\n readonly mapping: Mapping<S, I, C, AC, A, RS, CE, M, NativeId>;\n readonly proofMapping?: PM;\n readonly transaction?: SuppliedService<TxId, NoInfer<TransactionOf<D>>, TxShape>;\n },\n body: Effect.Effect<Out, E, R>,\n): Effect.Effect<\n Out,\n E | PasswordUnavailable | HookConfigurationError | SqlError | DatabaseError,\n Exclude<R, PasswordPersistence> | LifecycleHooks | DatabaseRequirements\n> {\n return Effect.flatMap(nativeDatabase(acquire), (database) =>\n coordinateTargetPasswordPersistence<TransactionOf<D>, Out, E, Exclude<R, PasswordPersistence>>(\n database,\n options.mapping,\n configuration(transactionService(database)),\n options.proofMapping,\n (\n transaction: TransactionOf<D>,\n services: { readonly passwordPersistence: PasswordPersistence[\"Service\"] },\n ) => {\n const provided = Context.make(PasswordPersistence, services.passwordPersistence);\n const work = Effect.provideContext(body, provided);\n\n return options.transaction === undefined\n ? work\n : Effect.provideService(work, options.transaction, options.transaction.of(transaction));\n },\n ).pipe(Effect.provideService(NativeDatabase, database)),\n );\n}\n\nexport const makeMysqlPasswordRegistrationServices = <\n Registration,\n S extends AnyMySqlTable,\n I extends AnyMySqlTable,\n C extends AnyMySqlTable,\n AC extends AnyMySqlTable,\n Rq extends AnyMySqlTable,\n NativeId,\n>(\n mapping: PasswordRegistrationMapping<Registration, S, I, C, AC, Rq, NativeId>,\n) =>\n Effect.flatMap(\n Effect.map(acquireTransactionService(DatabaseService), configuration),\n (configuration) => makeTargetPasswordRegistrationServices<Registration>(mapping, configuration),\n ).pipe(\n Effect.provideServiceEffect(CurrentPasswordSql, nativeDatabase(DatabaseService)),\n Effect.provideServiceEffect(NativeDatabase, nativeDatabase(DatabaseService)),\n );\n\nexport function coordinateMysqlPasswordRegistration<\n TargetId,\n Registration,\n D extends Database,\n S extends AnyMySqlTable,\n I extends AnyMySqlTable,\n C extends AnyMySqlTable,\n AC extends AnyMySqlTable,\n Rq extends AnyMySqlTable,\n NativeId,\n Out,\n E,\n R,\n DatabaseError,\n DatabaseRequirements,\n>(\n acquire: Effect.Effect<D, DatabaseError, DatabaseRequirements>,\n options: {\n readonly mapping: PasswordRegistrationMapping<NoInfer<Registration>, S, I, C, AC, Rq, NativeId>;\n readonly target: SuppliedService<TargetId, PasswordRegistrationAuthority<Registration>>;\n readonly transaction?: never;\n },\n body: Effect.Effect<Out, E, R>,\n): Effect.Effect<\n Out,\n E | PasswordUnavailable | HookConfigurationError | SqlError | DatabaseError,\n Exclude<R, TargetId> | LifecycleHooks | DatabaseRequirements\n>;\n\nexport function coordinateMysqlPasswordRegistration<\n TargetId,\n Registration,\n D extends Database,\n S extends AnyMySqlTable,\n I extends AnyMySqlTable,\n C extends AnyMySqlTable,\n AC extends AnyMySqlTable,\n Rq extends AnyMySqlTable,\n NativeId,\n Out,\n E,\n R,\n DatabaseError,\n DatabaseRequirements,\n TxId,\n TxShape,\n>(\n acquire: Effect.Effect<D, DatabaseError, DatabaseRequirements>,\n options: {\n readonly mapping: PasswordRegistrationMapping<NoInfer<Registration>, S, I, C, AC, Rq, NativeId>;\n readonly target: SuppliedService<TargetId, PasswordRegistrationAuthority<Registration>>;\n readonly transaction: SuppliedService<TxId, NoInfer<TransactionOf<D>>, TxShape>;\n },\n body: Effect.Effect<Out, E, R>,\n): Effect.Effect<\n Out,\n E | PasswordUnavailable | HookConfigurationError | SqlError | DatabaseError,\n Exclude<R, TargetId | TxId> | LifecycleHooks | DatabaseRequirements\n>;\n\nexport function coordinateMysqlPasswordRegistration<\n TargetId,\n Registration,\n D extends Database,\n S extends AnyMySqlTable,\n I extends AnyMySqlTable,\n C extends AnyMySqlTable,\n AC extends AnyMySqlTable,\n Rq extends AnyMySqlTable,\n NativeId,\n Out,\n E,\n R,\n DatabaseError,\n DatabaseRequirements,\n TxId,\n TxShape,\n>(\n acquire: Effect.Effect<D, DatabaseError, DatabaseRequirements>,\n options: {\n readonly mapping: PasswordRegistrationMapping<NoInfer<Registration>, S, I, C, AC, Rq, NativeId>;\n readonly target: SuppliedService<TargetId, PasswordRegistrationAuthority<Registration>>;\n readonly transaction?: SuppliedService<TxId, NoInfer<TransactionOf<D>>, TxShape>;\n },\n body: Effect.Effect<Out, E, R>,\n): Effect.Effect<\n Out,\n E | PasswordUnavailable | HookConfigurationError | SqlError | DatabaseError,\n Exclude<R, TargetId> | LifecycleHooks | DatabaseRequirements\n> {\n return Effect.flatMap(nativeDatabase(acquire), (database) =>\n coordinateTargetPasswordRegistration<\n Registration,\n TransactionOf<D>,\n Out,\n E,\n Exclude<R, TargetId>\n >(\n database,\n options.mapping,\n configuration(transactionService(database)),\n (\n transaction: TransactionOf<D>,\n services: { readonly registrationAuthority: PasswordRegistrationAuthority<Registration> },\n ) => {\n const provided = Context.make(options.target, services.registrationAuthority);\n const work = Effect.provideContext(body, provided);\n\n return options.transaction === undefined\n ? work\n : Effect.provideService(work, options.transaction, options.transaction.of(transaction));\n },\n ).pipe(Effect.provideService(NativeDatabase, database)),\n );\n}\n\nexport { configuration as mysqlPasswordConfiguration };\n"],"mappings":";;;;;;;;;;AAoCA,MAAM,iBAAiB,aAA6C;CAClE,MAAM;CACN,SAAS;CACT,iBAAiB,iCAAiC,OAAO;CACzD,iBAAiB,OAAyB,SAAiB,cACzD,MAAM,qBAAqB,EAAE,KAAK,GAAG,UAAU,UAAU,EAAE,CAAC;CAC9D,uBAAuB,UAA4B,MAAM,aAAa;CACtE,OAAO;EACL,MAAM;EACN,SAAS;EACT,iBAAiB,8BAA8B,OAAO;EACtD,iBAAiB,OAAsB,SAAiB,cACtD,MAAM,qBAAqB,EAAE,KAAK,GAAG,UAAU,UAAU,EAAE,CAAC;CAChE;AACF;AAcA,MAAa,wCAWX,SACA,iBAeA,OAAO,QACL,OAAO,IAAI,0BAA0BA,QAAe,GAAG,aAAa,IACnE,kBAAkB,sCAAsC,SAAS,eAAe,YAAY,CAC/F,CAAC,CAAC,KACA,OAAO,qBAAqB,oBAAoB,eAAeA,QAAe,CAAC,GAC/E,OAAO,qBAAqB,gBAAgB,eAAeA,QAAe,CAAC,CAC7E;AAsEF,SAAgB,mCAsBd,SACA,SAKA,MAKA;CACA,OAAO,OAAO,QAAQ,eAAe,OAAO,IAAI,aAC9C,oCACE,UACA,QAAQ,SACR,cAAc,mBAAmB,QAAQ,CAAC,GAC1C,QAAQ,eAEN,aACA,aACG;EACH,MAAM,WAAW,QAAQ,KAAK,qBAAqB,SAAS,mBAAmB;EAC/E,MAAM,OAAO,OAAO,eAAe,MAAM,QAAQ;EAEjD,OAAO,QAAQ,gBAAgB,KAAA,IAC3B,OACA,OAAO,eAAe,MAAM,QAAQ,aAAa,QAAQ,YAAY,GAAG,WAAW,CAAC;CAC1F,CACF,CAAC,CAAC,KAAK,OAAO,eAAe,gBAAgB,QAAQ,CAAC,CACxD;AACF;AAEA,MAAa,yCASX,YAEA,OAAO,QACL,OAAO,IAAI,0BAA0BA,QAAe,GAAG,aAAa,IACnE,kBAAkB,uCAAqD,SAAS,aAAa,CAChG,CAAC,CAAC,KACA,OAAO,qBAAqB,oBAAoB,eAAeA,QAAe,CAAC,GAC/E,OAAO,qBAAqB,gBAAgB,eAAeA,QAAe,CAAC,CAC7E;AA8DF,SAAgB,oCAkBd,SACA,SAKA,MAKA;CACA,OAAO,OAAO,QAAQ,eAAe,OAAO,IAAI,aAC9C,qCAOE,UACA,QAAQ,SACR,cAAc,mBAAmB,QAAQ,CAAC,IAExC,aACA,aACG;EACH,MAAM,WAAW,QAAQ,KAAK,QAAQ,QAAQ,SAAS,qBAAqB;EAC5E,MAAM,OAAO,OAAO,eAAe,MAAM,QAAQ;EAEjD,OAAO,QAAQ,gBAAgB,KAAA,IAC3B,OACA,OAAO,eAAe,MAAM,QAAQ,aAAa,QAAQ,YAAY,GAAG,WAAW,CAAC;CAC1F,CACF,CAAC,CAAC,KAAK,OAAO,eAAe,gBAAgB,QAAQ,CAAC,CACxD;AACF"}
|
|
1
|
+
{"version":3,"file":"mysql-passwords.mjs","names":["DatabaseService"],"sources":["../../src/drizzle/mysql-passwords.ts"],"sourcesContent":["import { NativeDatabase } from \"@yielded/auth-persistence/Adapter\";\nimport type { LifecycleHooks, HookConfigurationError } from \"@yielded/auth/Hooks\";\nimport { type PasswordUnavailable, PasswordPersistence } from \"@yielded/auth/Password\";\n/* oxlint-disable no-explicit-any -- proof mapping tables are independently typed by the proof owner; this driver forwards them unchanged to the shared target. */\nimport type { AnyRelations } from \"drizzle-orm\";\nimport type { EffectMysql2Database } from \"drizzle-orm/effect-mysql2\";\nimport type { AnyMySqlTable } from \"drizzle-orm/mysql-core\";\nimport { Effect, Context } from \"effect\";\nimport type { SqlError } from \"effect/sql/SqlError\";\n\nimport { Database as DatabaseService } from \"./mysql-database\";\nimport { nativeDatabase } from \"./native-database\";\nimport type { PasswordPersistenceMapping, PasswordRegistrationMapping } from \"./password-model\";\nimport type { PasswordRegistrationAuthority } from \"./password-registration\";\nimport { CurrentPasswordSql } from \"./password-sql\";\nimport type { PasswordSqlQuery } from \"./password-sql\";\nimport {\n coordinateTargetPasswordPersistence,\n coordinateTargetPasswordRegistration,\n makeTargetPasswordPersistenceServices,\n makeTargetPasswordRegistrationServices,\n sqlClientPasswordStandaloneGuard,\n} from \"./password-target\";\nimport type { ProofPersistenceMapping } from \"./proof-model\";\nimport type { ProofSqlQuery } from \"./proof-sql\";\nimport { sqlClientProofStandaloneGuard } from \"./proof-target\";\nimport {\n type TransactionService,\n acquireTransactionService,\n transactionService,\n} from \"./standalone-guard\";\nimport type { SuppliedService } from \"./SuppliedService\";\n\ntype Database = EffectMysql2Database<AnyRelations>;\ntype TransactionOf<D extends Database> = Parameters<Parameters<D[\"transaction\"]>[0]>[0];\n\nconst configuration = (service: TransactionService | undefined) => ({\n mode: \"interactive\" as const,\n locking: true,\n standaloneGuard: sqlClientPasswordStandaloneGuard(service),\n insertIfAbsent: (query: PasswordSqlQuery, selfKey: string, selfValue: unknown) =>\n query.onDuplicateKeyUpdate({ set: { [selfKey]: selfValue } }),\n generatedSubjectRows: (query: PasswordSqlQuery) => query.$returningId(),\n proof: {\n mode: \"interactive\" as const,\n locking: true,\n standaloneGuard: sqlClientProofStandaloneGuard(service),\n insertIfAbsent: (query: ProofSqlQuery, selfKey: string, selfValue: unknown) =>\n query.onDuplicateKeyUpdate({ set: { [selfKey]: selfValue } }),\n },\n});\n\ntype Mapping<\n S extends AnyMySqlTable,\n I extends AnyMySqlTable,\n C extends AnyMySqlTable,\n AC extends AnyMySqlTable,\n M extends AnyMySqlTable,\n NativeId,\n> = PasswordPersistenceMapping<S, I, C, AC, M, NativeId>;\n\nexport const makeMysqlPasswordPersistenceServices = <\n S extends AnyMySqlTable,\n I extends AnyMySqlTable,\n C extends AnyMySqlTable,\n AC extends AnyMySqlTable,\n M extends AnyMySqlTable,\n NativeId,\n>(\n mapping: Mapping<S, I, C, AC, M, NativeId>,\n proofMapping?: ProofPersistenceMapping<\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any\n >,\n) =>\n Effect.flatMap(\n Effect.map(acquireTransactionService(DatabaseService), configuration),\n (configuration) => makeTargetPasswordPersistenceServices(mapping, configuration, proofMapping),\n ).pipe(\n Effect.provideServiceEffect(CurrentPasswordSql, nativeDatabase(DatabaseService)),\n Effect.provideServiceEffect(NativeDatabase, nativeDatabase(DatabaseService)),\n );\n\nexport function coordinateMysqlPasswordPersistence<\n D extends Database,\n S extends AnyMySqlTable,\n I extends AnyMySqlTable,\n C extends AnyMySqlTable,\n AC extends AnyMySqlTable,\n M extends AnyMySqlTable,\n NativeId,\n PM extends\n | ProofPersistenceMapping<any, any, any, any, any, any, any, any, any, any, any, any>\n | undefined,\n Out,\n E,\n R,\n DatabaseError,\n DatabaseRequirements,\n>(\n acquire: Effect.Effect<D, DatabaseError, DatabaseRequirements>,\n options: {\n readonly mapping: Mapping<S, I, C, AC, M, NativeId>;\n readonly proofMapping?: PM;\n readonly transaction?: never;\n },\n body: Effect.Effect<Out, E, R>,\n): Effect.Effect<\n Out,\n E | PasswordUnavailable | HookConfigurationError | SqlError | DatabaseError,\n Exclude<R, PasswordPersistence> | LifecycleHooks | DatabaseRequirements\n>;\n\nexport function coordinateMysqlPasswordPersistence<\n D extends Database,\n S extends AnyMySqlTable,\n I extends AnyMySqlTable,\n C extends AnyMySqlTable,\n AC extends AnyMySqlTable,\n M extends AnyMySqlTable,\n NativeId,\n PM extends\n | ProofPersistenceMapping<any, any, any, any, any, any, any, any, any, any, any, any>\n | undefined,\n Out,\n E,\n R,\n DatabaseError,\n DatabaseRequirements,\n TxId,\n TxShape,\n>(\n acquire: Effect.Effect<D, DatabaseError, DatabaseRequirements>,\n options: {\n readonly mapping: Mapping<S, I, C, AC, M, NativeId>;\n readonly proofMapping?: PM;\n readonly transaction: SuppliedService<TxId, NoInfer<TransactionOf<D>>, TxShape>;\n },\n body: Effect.Effect<Out, E, R>,\n): Effect.Effect<\n Out,\n E | PasswordUnavailable | HookConfigurationError | SqlError | DatabaseError,\n Exclude<R, PasswordPersistence | TxId> | LifecycleHooks | DatabaseRequirements\n>;\n\nexport function coordinateMysqlPasswordPersistence<\n D extends Database,\n S extends AnyMySqlTable,\n I extends AnyMySqlTable,\n C extends AnyMySqlTable,\n AC extends AnyMySqlTable,\n M extends AnyMySqlTable,\n NativeId,\n PM extends\n | ProofPersistenceMapping<any, any, any, any, any, any, any, any, any, any, any, any>\n | undefined,\n Out,\n E,\n R,\n DatabaseError,\n DatabaseRequirements,\n TxId,\n TxShape,\n>(\n acquire: Effect.Effect<D, DatabaseError, DatabaseRequirements>,\n options: {\n readonly mapping: Mapping<S, I, C, AC, M, NativeId>;\n readonly proofMapping?: PM;\n readonly transaction?: SuppliedService<TxId, NoInfer<TransactionOf<D>>, TxShape>;\n },\n body: Effect.Effect<Out, E, R>,\n): Effect.Effect<\n Out,\n E | PasswordUnavailable | HookConfigurationError | SqlError | DatabaseError,\n Exclude<R, PasswordPersistence> | LifecycleHooks | DatabaseRequirements\n> {\n return Effect.flatMap(nativeDatabase(acquire), (database) =>\n coordinateTargetPasswordPersistence<TransactionOf<D>, Out, E, Exclude<R, PasswordPersistence>>(\n database,\n options.mapping,\n configuration(transactionService(database)),\n options.proofMapping,\n (\n transaction: TransactionOf<D>,\n services: { readonly passwordPersistence: PasswordPersistence[\"Service\"] },\n ) => {\n const provided = Context.make(PasswordPersistence, services.passwordPersistence);\n const work = Effect.provideContext(body, provided);\n\n return options.transaction === undefined\n ? work\n : Effect.provideService(work, options.transaction, options.transaction.of(transaction));\n },\n ).pipe(Effect.provideService(NativeDatabase, database)),\n );\n}\n\nexport const makeMysqlPasswordRegistrationServices = <\n Registration,\n S extends AnyMySqlTable,\n I extends AnyMySqlTable,\n C extends AnyMySqlTable,\n AC extends AnyMySqlTable,\n Rq extends AnyMySqlTable,\n NativeId,\n>(\n mapping: PasswordRegistrationMapping<Registration, S, I, C, AC, Rq, NativeId>,\n) =>\n Effect.flatMap(\n Effect.map(acquireTransactionService(DatabaseService), configuration),\n (configuration) => makeTargetPasswordRegistrationServices<Registration>(mapping, configuration),\n ).pipe(\n Effect.provideServiceEffect(CurrentPasswordSql, nativeDatabase(DatabaseService)),\n Effect.provideServiceEffect(NativeDatabase, nativeDatabase(DatabaseService)),\n );\n\nexport function coordinateMysqlPasswordRegistration<\n TargetId,\n Registration,\n D extends Database,\n S extends AnyMySqlTable,\n I extends AnyMySqlTable,\n C extends AnyMySqlTable,\n AC extends AnyMySqlTable,\n Rq extends AnyMySqlTable,\n NativeId,\n Out,\n E,\n R,\n DatabaseError,\n DatabaseRequirements,\n>(\n acquire: Effect.Effect<D, DatabaseError, DatabaseRequirements>,\n options: {\n readonly mapping: PasswordRegistrationMapping<NoInfer<Registration>, S, I, C, AC, Rq, NativeId>;\n readonly target: SuppliedService<TargetId, PasswordRegistrationAuthority<Registration>>;\n readonly transaction?: never;\n },\n body: Effect.Effect<Out, E, R>,\n): Effect.Effect<\n Out,\n E | PasswordUnavailable | HookConfigurationError | SqlError | DatabaseError,\n Exclude<R, TargetId> | LifecycleHooks | DatabaseRequirements\n>;\n\nexport function coordinateMysqlPasswordRegistration<\n TargetId,\n Registration,\n D extends Database,\n S extends AnyMySqlTable,\n I extends AnyMySqlTable,\n C extends AnyMySqlTable,\n AC extends AnyMySqlTable,\n Rq extends AnyMySqlTable,\n NativeId,\n Out,\n E,\n R,\n DatabaseError,\n DatabaseRequirements,\n TxId,\n TxShape,\n>(\n acquire: Effect.Effect<D, DatabaseError, DatabaseRequirements>,\n options: {\n readonly mapping: PasswordRegistrationMapping<NoInfer<Registration>, S, I, C, AC, Rq, NativeId>;\n readonly target: SuppliedService<TargetId, PasswordRegistrationAuthority<Registration>>;\n readonly transaction: SuppliedService<TxId, NoInfer<TransactionOf<D>>, TxShape>;\n },\n body: Effect.Effect<Out, E, R>,\n): Effect.Effect<\n Out,\n E | PasswordUnavailable | HookConfigurationError | SqlError | DatabaseError,\n Exclude<R, TargetId | TxId> | LifecycleHooks | DatabaseRequirements\n>;\n\nexport function coordinateMysqlPasswordRegistration<\n TargetId,\n Registration,\n D extends Database,\n S extends AnyMySqlTable,\n I extends AnyMySqlTable,\n C extends AnyMySqlTable,\n AC extends AnyMySqlTable,\n Rq extends AnyMySqlTable,\n NativeId,\n Out,\n E,\n R,\n DatabaseError,\n DatabaseRequirements,\n TxId,\n TxShape,\n>(\n acquire: Effect.Effect<D, DatabaseError, DatabaseRequirements>,\n options: {\n readonly mapping: PasswordRegistrationMapping<NoInfer<Registration>, S, I, C, AC, Rq, NativeId>;\n readonly target: SuppliedService<TargetId, PasswordRegistrationAuthority<Registration>>;\n readonly transaction?: SuppliedService<TxId, NoInfer<TransactionOf<D>>, TxShape>;\n },\n body: Effect.Effect<Out, E, R>,\n): Effect.Effect<\n Out,\n E | PasswordUnavailable | HookConfigurationError | SqlError | DatabaseError,\n Exclude<R, TargetId> | LifecycleHooks | DatabaseRequirements\n> {\n return Effect.flatMap(nativeDatabase(acquire), (database) =>\n coordinateTargetPasswordRegistration<\n Registration,\n TransactionOf<D>,\n Out,\n E,\n Exclude<R, TargetId>\n >(\n database,\n options.mapping,\n configuration(transactionService(database)),\n (\n transaction: TransactionOf<D>,\n services: { readonly registrationAuthority: PasswordRegistrationAuthority<Registration> },\n ) => {\n const provided = Context.make(options.target, services.registrationAuthority);\n const work = Effect.provideContext(body, provided);\n\n return options.transaction === undefined\n ? work\n : Effect.provideService(work, options.transaction, options.transaction.of(transaction));\n },\n ).pipe(Effect.provideService(NativeDatabase, database)),\n );\n}\n\nexport { configuration as mysqlPasswordConfiguration };\n"],"mappings":";;;;;;;;;;AAoCA,MAAM,iBAAiB,aAA6C;CAClE,MAAM;CACN,SAAS;CACT,iBAAiB,iCAAiC,OAAO;CACzD,iBAAiB,OAAyB,SAAiB,cACzD,MAAM,qBAAqB,EAAE,KAAK,GAAG,UAAU,UAAU,EAAE,CAAC;CAC9D,uBAAuB,UAA4B,MAAM,aAAa;CACtE,OAAO;EACL,MAAM;EACN,SAAS;EACT,iBAAiB,8BAA8B,OAAO;EACtD,iBAAiB,OAAsB,SAAiB,cACtD,MAAM,qBAAqB,EAAE,KAAK,GAAG,UAAU,UAAU,EAAE,CAAC;CAChE;AACF;AAWA,MAAa,wCAQX,SACA,iBAeA,OAAO,QACL,OAAO,IAAI,0BAA0BA,QAAe,GAAG,aAAa,IACnE,kBAAkB,sCAAsC,SAAS,eAAe,YAAY,CAC/F,CAAC,CAAC,KACA,OAAO,qBAAqB,oBAAoB,eAAeA,QAAe,CAAC,GAC/E,OAAO,qBAAqB,gBAAgB,eAAeA,QAAe,CAAC,CAC7E;AAgEF,SAAgB,mCAmBd,SACA,SAKA,MAKA;CACA,OAAO,OAAO,QAAQ,eAAe,OAAO,IAAI,aAC9C,oCACE,UACA,QAAQ,SACR,cAAc,mBAAmB,QAAQ,CAAC,GAC1C,QAAQ,eAEN,aACA,aACG;EACH,MAAM,WAAW,QAAQ,KAAK,qBAAqB,SAAS,mBAAmB;EAC/E,MAAM,OAAO,OAAO,eAAe,MAAM,QAAQ;EAEjD,OAAO,QAAQ,gBAAgB,KAAA,IAC3B,OACA,OAAO,eAAe,MAAM,QAAQ,aAAa,QAAQ,YAAY,GAAG,WAAW,CAAC;CAC1F,CACF,CAAC,CAAC,KAAK,OAAO,eAAe,gBAAgB,QAAQ,CAAC,CACxD;AACF;AAEA,MAAa,yCASX,YAEA,OAAO,QACL,OAAO,IAAI,0BAA0BA,QAAe,GAAG,aAAa,IACnE,kBAAkB,uCAAqD,SAAS,aAAa,CAChG,CAAC,CAAC,KACA,OAAO,qBAAqB,oBAAoB,eAAeA,QAAe,CAAC,GAC/E,OAAO,qBAAqB,gBAAgB,eAAeA,QAAe,CAAC,CAC7E;AA8DF,SAAgB,oCAkBd,SACA,SAKA,MAKA;CACA,OAAO,OAAO,QAAQ,eAAe,OAAO,IAAI,aAC9C,qCAOE,UACA,QAAQ,SACR,cAAc,mBAAmB,QAAQ,CAAC,IAExC,aACA,aACG;EACH,MAAM,WAAW,QAAQ,KAAK,QAAQ,QAAQ,SAAS,qBAAqB;EAC5E,MAAM,OAAO,OAAO,eAAe,MAAM,QAAQ;EAEjD,OAAO,QAAQ,gBAAgB,KAAA,IAC3B,OACA,OAAO,eAAe,MAAM,QAAQ,aAAa,QAAQ,YAAY,GAAG,WAAW,CAAC;CAC1F,CACF,CAAC,CAAC,KAAK,OAAO,eAAe,gBAAgB,QAAQ,CAAC,CACxD;AACF"}
|
|
@@ -14,7 +14,7 @@ type Database = EffectMysql2Database<AnyRelations>;
|
|
|
14
14
|
type Transaction = Parameters<Parameters<Database["transaction"]>[0]>[0];
|
|
15
15
|
export declare const makeMysqlAuthenticationAuthorityServices: <Claims, S extends AnyMySqlTable, C extends AnyMySqlTable, F extends AnyMySqlTable, P extends AnyMySqlTable, NativeId>(mapping: AuthenticationAuthorityMapping<Claims, S, C, F, P, NativeId>) => Effect.Effect<{
|
|
16
16
|
authenticationAuthority: {
|
|
17
|
-
readonly capture: (subjectId: import("@yielded/auth/Schema").SubjectId, credentialIds: ReadonlyArray<string>) => Effect.Effect<import("@yielded/auth/Sessions").
|
|
17
|
+
readonly capture: (subjectId: import("@yielded/auth/Schema").SubjectId, credentialIds: ReadonlyArray<string>) => Effect.Effect<import("@yielded/auth/Sessions").AuthenticationCapture, import("@yielded/auth/Sessions").StaleAuthentication | SessionUnavailable>;
|
|
18
18
|
readonly requirements: (evidence: import("@yielded/auth/Sessions").AuthenticationEvidence) => Effect.Effect<import("@yielded/auth/Sessions").AuthenticationRequirement, import("@yielded/auth/Sessions").StaleAuthentication | SessionUnavailable>;
|
|
19
19
|
readonly approve: <A>(input: {
|
|
20
20
|
readonly evidence: import("@yielded/auth/Sessions").AuthenticationEvidence;
|
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
import { PersistenceMappingError, makeNativeSqlTables, nativeSqlAlias } from "@yielded/auth-persistence/Adapter";
|
|
2
|
+
import { Param, Placeholder, Table, getTableColumns, getTableName, is, sql } from "drizzle-orm";
|
|
3
|
+
import { Predicate } from "effect";
|
|
4
|
+
import { MySqlTable, getTableConfig } from "drizzle-orm/mysql-core";
|
|
5
|
+
import { PgTable, getTableConfig as getTableConfig$1 } from "drizzle-orm/pg-core";
|
|
6
|
+
import * as Statement$1 from "effect/sql/Statement";
|
|
7
|
+
//#region src/drizzle/native-sql-table.ts
|
|
8
|
+
const invalid = (cause) => {
|
|
9
|
+
throw PersistenceMappingError.make({
|
|
10
|
+
operation: "mapping",
|
|
11
|
+
cause
|
|
12
|
+
});
|
|
13
|
+
};
|
|
14
|
+
const capture = (database) => {
|
|
15
|
+
if (!Predicate.hasProperty(database, "select") || typeof database.select !== "function" || !Predicate.hasProperty(database, "insert") || typeof database.insert !== "function" || !Predicate.hasProperty(database, "update") || typeof database.update !== "function") return invalid("Expected a captured Drizzle database");
|
|
16
|
+
const selection = database.select();
|
|
17
|
+
if (!Predicate.hasProperty(selection, "dialect")) return invalid("Expected a captured Drizzle dialect");
|
|
18
|
+
const dialect = selection.dialect;
|
|
19
|
+
if (!Predicate.hasProperty(dialect, "escapeName") || typeof dialect.escapeName !== "function" || !Predicate.hasProperty(dialect, "escapeString") || typeof dialect.escapeString !== "function") return invalid("Expected Drizzle dialect escaping methods");
|
|
20
|
+
if (Predicate.hasProperty(dialect, "codecs") && dialect.codecs !== void 0 && (!Predicate.hasProperty(dialect.codecs, "apply") || typeof dialect.codecs.apply !== "function")) return invalid("Expected Drizzle dialect codecs");
|
|
21
|
+
return {
|
|
22
|
+
database,
|
|
23
|
+
dialect
|
|
24
|
+
};
|
|
25
|
+
};
|
|
26
|
+
const compileWith = (dialect) => (expression) => {
|
|
27
|
+
const slots = [];
|
|
28
|
+
const query = expression.toQuery({
|
|
29
|
+
escapeName: (name) => {
|
|
30
|
+
if (name.includes("\0")) return invalid("NUL in SQL identifier");
|
|
31
|
+
return dialect.escapeName(name);
|
|
32
|
+
},
|
|
33
|
+
escapeString: (value) => {
|
|
34
|
+
if (value.includes("\0")) return invalid("NUL in SQL literal");
|
|
35
|
+
return dialect.escapeString(value);
|
|
36
|
+
},
|
|
37
|
+
escapeParam: (index) => {
|
|
38
|
+
if (index !== slots.length) return invalid("Invalid Drizzle parameter order");
|
|
39
|
+
const slot = `yielded_parameter_${index}`;
|
|
40
|
+
slots.push(slot);
|
|
41
|
+
return `\0${slot}\0`;
|
|
42
|
+
},
|
|
43
|
+
...dialect.codecs === void 0 ? {} : { codecs: dialect.codecs }
|
|
44
|
+
});
|
|
45
|
+
const parts = query.sql.split("\0");
|
|
46
|
+
if (parts.length !== slots.length * 2 + 1 || query.params.length !== slots.length) return invalid("NUL or parameter marker collision in Drizzle SQL");
|
|
47
|
+
const segments = [];
|
|
48
|
+
const consumed = /* @__PURE__ */ new Set();
|
|
49
|
+
for (let offset = 0; offset < parts.length; offset += 2) {
|
|
50
|
+
segments.push(Statement$1.literal(parts[offset]));
|
|
51
|
+
if (offset + 1 === parts.length) break;
|
|
52
|
+
const index = slots.indexOf(parts[offset + 1]);
|
|
53
|
+
if (index < 0 || consumed.has(index)) return invalid("NUL or parameter marker collision in Drizzle SQL");
|
|
54
|
+
consumed.add(index);
|
|
55
|
+
const value = query.params[index];
|
|
56
|
+
if (is(value, Placeholder) || is(value, Param)) return invalid("Unbound Drizzle placeholder");
|
|
57
|
+
if (Statement$1.isFragment(value)) segments.push(...value.segments);
|
|
58
|
+
else segments.push(Statement$1.parameter(value));
|
|
59
|
+
}
|
|
60
|
+
return Statement$1.fragment(segments);
|
|
61
|
+
};
|
|
62
|
+
/** Preserve native Statement expressions in writes without applying a column
|
|
63
|
+
* codec to them. Ordinary values still pass through Drizzle's own builders. */
|
|
64
|
+
const writeValues = (values) => Object.fromEntries(Object.entries(values).map(([key, value]) => [key, Statement$1.isFragment(value) ? sql`${sql.param(value)}` : value]));
|
|
65
|
+
/** Capture the root database's compiler, not a later transaction object's
|
|
66
|
+
* client. Call insert/update inside the operation to materialize hooks once. */
|
|
67
|
+
const makeDrizzleSqlTables = (client, capturedDatabase) => {
|
|
68
|
+
const { database, dialect } = capture(capturedDatabase);
|
|
69
|
+
const compile = compileWith(dialect);
|
|
70
|
+
return makeNativeSqlTables(client, (_client, physical) => {
|
|
71
|
+
if (!is(physical, Table)) return invalid("Expected a Drizzle table");
|
|
72
|
+
const columns = getTableColumns(physical);
|
|
73
|
+
const entries = Object.entries(columns);
|
|
74
|
+
const schema = is(physical, PgTable) ? getTableConfig$1(physical).schema : is(physical, MySqlTable) ? getTableConfig(physical).schema : void 0;
|
|
75
|
+
const table = {
|
|
76
|
+
name: getTableName(physical),
|
|
77
|
+
...schema === void 0 ? {} : { schema }
|
|
78
|
+
};
|
|
79
|
+
const getColumn = (key) => {
|
|
80
|
+
const column = Object.hasOwn(columns, key) ? columns[key] : void 0;
|
|
81
|
+
if (column === void 0) return invalid("Missing Drizzle column");
|
|
82
|
+
return column;
|
|
83
|
+
};
|
|
84
|
+
const bind = (alias) => {
|
|
85
|
+
const reference = (key) => {
|
|
86
|
+
const column = getColumn(key);
|
|
87
|
+
return alias === void 0 ? sql`${column}` : sql`${sql.identifier(alias)}.${sql.identifier(column.name)}`;
|
|
88
|
+
};
|
|
89
|
+
return {
|
|
90
|
+
name: compile(alias === void 0 ? sql`${physical}` : sql`${physical} AS ${sql.identifier(alias)}`),
|
|
91
|
+
as: bind,
|
|
92
|
+
column: (key) => compile(reference(key)),
|
|
93
|
+
unencodedTextColumn: (key) => {
|
|
94
|
+
const column = getColumn(key);
|
|
95
|
+
return [
|
|
96
|
+
"PgText",
|
|
97
|
+
"PgVarchar",
|
|
98
|
+
"SQLiteText",
|
|
99
|
+
"MySqlText",
|
|
100
|
+
"MySqlVarChar"
|
|
101
|
+
].includes(column.columnType) && Predicate.hasProperty(column.mapToDriverValue, "isNoop") && column.mapToDriverValue.isNoop === true && Predicate.hasProperty(column.mapFromDriverValue, "isNoop") && column.mapFromDriverValue.isNoop === true && (dialect.codecs === void 0 || Predicate.hasProperty(dialect.codecs, "get") && typeof dialect.codecs.get === "function" && [
|
|
102
|
+
"cast",
|
|
103
|
+
"normalize",
|
|
104
|
+
"castParam",
|
|
105
|
+
"normalizeParam"
|
|
106
|
+
].every((kind) => dialect.codecs?.get(column, kind) === void 0)) ? {
|
|
107
|
+
table,
|
|
108
|
+
name: column.name
|
|
109
|
+
} : void 0;
|
|
110
|
+
},
|
|
111
|
+
fields: (prefix) => compile(sql.join(entries.map(([key, column], index) => {
|
|
112
|
+
const selection = dialect.codecs === void 0 ? reference(key) : dialect.codecs.apply(column, "cast", reference(key));
|
|
113
|
+
return sql`${selection} as ${sql.identifier(nativeSqlAlias(prefix, index))}`;
|
|
114
|
+
}), sql`, `)),
|
|
115
|
+
decode: (row, prefix) => Object.fromEntries(entries.map(([key, column], index) => {
|
|
116
|
+
const alias = nativeSqlAlias(prefix, index);
|
|
117
|
+
if (!Object.hasOwn(row, alias)) return invalid("Missing SQL projection field");
|
|
118
|
+
const value = row[alias];
|
|
119
|
+
return [key, value === null ? null : column.mapFromDriverValue(dialect.codecs === void 0 ? value : dialect.codecs.apply(column, "normalize", value))];
|
|
120
|
+
})),
|
|
121
|
+
value: (key, value) => {
|
|
122
|
+
const column = getColumn(key);
|
|
123
|
+
return Statement$1.isFragment(value) ? value : compile(sql`${sql.param(value, column)}`);
|
|
124
|
+
},
|
|
125
|
+
insert: (values) => compile(database.insert(physical).values(writeValues(values)).getSQL()),
|
|
126
|
+
update: (values) => compile(database.update(physical).set(writeValues(values)).getSQL())
|
|
127
|
+
};
|
|
128
|
+
};
|
|
129
|
+
return bind();
|
|
130
|
+
});
|
|
131
|
+
};
|
|
132
|
+
//#endregion
|
|
133
|
+
export { makeDrizzleSqlTables };
|
|
134
|
+
|
|
135
|
+
//# sourceMappingURL=native-sql-table.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"native-sql-table.mjs","names":["Statement","getPgTableConfig","getMysqlTableConfig"],"sources":["../../src/drizzle/native-sql-table.ts"],"sourcesContent":["import {\n PersistenceMappingError,\n makeNativeSqlTables,\n nativeSqlAlias,\n type NativeSqlTables,\n type SqlTable,\n} from \"@yielded/auth-persistence/Adapter\";\nimport {\n getTableColumns,\n getTableName,\n is,\n Param,\n Placeholder,\n type SQL,\n Table,\n sql,\n type BuildQueryConfig,\n type SQLWrapper,\n} from \"drizzle-orm\";\nimport { getTableConfig as getMysqlTableConfig, MySqlTable } from \"drizzle-orm/mysql-core\";\nimport { getTableConfig as getPgTableConfig, PgTable } from \"drizzle-orm/pg-core\";\nimport { Predicate } from \"effect\";\nimport type { SqlClient } from \"effect/sql/SqlClient\";\nimport * as Statement from \"effect/sql/Statement\";\n\ntype CapturedDialect = Pick<BuildQueryConfig, \"escapeName\" | \"escapeString\" | \"codecs\">;\n\n/** Foreign compiler boundary only: builders are used to materialize SQL, never\n * executed. The select builder exposes the original dialect even through the\n * Durable Object database projection, which retains bound query methods. */\ninterface CapturedDatabase {\n readonly select: () => { readonly dialect: CapturedDialect };\n readonly insert: (table: Table) => {\n readonly values: (values: Record<string, unknown>) => SQLWrapper;\n };\n readonly update: (table: Table) => {\n readonly set: (values: Record<string, unknown>) => SQLWrapper;\n };\n}\n\nconst invalid = (cause: string): never => {\n throw PersistenceMappingError.make({ operation: \"mapping\", cause });\n};\n\nconst capture = (\n database: object,\n): { readonly database: CapturedDatabase; readonly dialect: CapturedDialect } => {\n if (\n !Predicate.hasProperty(database, \"select\") ||\n typeof database.select !== \"function\" ||\n !Predicate.hasProperty(database, \"insert\") ||\n typeof database.insert !== \"function\" ||\n !Predicate.hasProperty(database, \"update\") ||\n typeof database.update !== \"function\"\n )\n return invalid(\"Expected a captured Drizzle database\");\n\n const selection: unknown = database.select();\n\n if (!Predicate.hasProperty(selection, \"dialect\"))\n return invalid(\"Expected a captured Drizzle dialect\");\n const dialect = selection.dialect;\n\n if (\n !Predicate.hasProperty(dialect, \"escapeName\") ||\n typeof dialect.escapeName !== \"function\" ||\n !Predicate.hasProperty(dialect, \"escapeString\") ||\n typeof dialect.escapeString !== \"function\"\n )\n return invalid(\"Expected Drizzle dialect escaping methods\");\n\n if (\n Predicate.hasProperty(dialect, \"codecs\") &&\n dialect.codecs !== undefined &&\n (!Predicate.hasProperty(dialect.codecs, \"apply\") || typeof dialect.codecs.apply !== \"function\")\n )\n return invalid(\"Expected Drizzle dialect codecs\");\n\n // Drizzle's private dialect and generic query builders are erased only here.\n return { database: database as CapturedDatabase, dialect: dialect as CapturedDialect };\n};\n\nconst compileWith =\n (dialect: CapturedDialect) =>\n (expression: SQL): Statement.Fragment => {\n const slots: string[] = [];\n\n const query = expression.toQuery({\n escapeName: (name) => {\n if (name.includes(\"\\0\")) return invalid(\"NUL in SQL identifier\");\n\n return dialect.escapeName(name);\n },\n escapeString: (value) => {\n if (value.includes(\"\\0\")) return invalid(\"NUL in SQL literal\");\n\n return dialect.escapeString(value);\n },\n escapeParam: (index) => {\n if (index !== slots.length) return invalid(\"Invalid Drizzle parameter order\");\n const slot = `yielded_parameter_${index}`;\n\n slots.push(slot);\n\n return `\\0${slot}\\0`;\n },\n ...(dialect.codecs === undefined ? {} : { codecs: dialect.codecs }),\n });\n\n // Only compiler-emitted slots are translated. Native Statement parameters\n // receive their final positions when composed; SQL literals containing $1 or\n // ? are never inspected or rewritten. NUL is reserved for this compilation.\n const parts = query.sql.split(\"\\0\");\n\n if (parts.length !== slots.length * 2 + 1 || query.params.length !== slots.length)\n return invalid(\"NUL or parameter marker collision in Drizzle SQL\");\n\n const segments: Statement.Segment[] = [];\n const consumed = new Set<number>();\n\n for (let offset = 0; offset < parts.length; offset += 2) {\n segments.push(Statement.literal(parts[offset]));\n if (offset + 1 === parts.length) break;\n const index = slots.indexOf(parts[offset + 1]);\n\n if (index < 0 || consumed.has(index))\n return invalid(\"NUL or parameter marker collision in Drizzle SQL\");\n consumed.add(index);\n const value: unknown = query.params[index];\n\n if (is(value, Placeholder) || is(value, Param)) return invalid(\"Unbound Drizzle placeholder\");\n if (Statement.isFragment(value)) segments.push(...value.segments);\n else segments.push(Statement.parameter(value));\n }\n\n return Statement.fragment(segments);\n };\n\n/** Preserve native Statement expressions in writes without applying a column\n * codec to them. Ordinary values still pass through Drizzle's own builders. */\nconst writeValues = (values: Readonly<Record<string, unknown>>) =>\n Object.fromEntries(\n Object.entries(values).map(([key, value]) => [\n key,\n Statement.isFragment(value) ? sql`${sql.param(value)}` : value,\n ]),\n );\n\n/** Capture the root database's compiler, not a later transaction object's\n * client. Call insert/update inside the operation to materialize hooks once. */\nexport const makeDrizzleSqlTables = (\n client: SqlClient,\n capturedDatabase: object,\n): NativeSqlTables => {\n const { database, dialect } = capture(capturedDatabase);\n const compile = compileWith(dialect);\n\n return makeNativeSqlTables(client, (_client, physical): SqlTable => {\n if (!is(physical, Table)) return invalid(\"Expected a Drizzle table\");\n const columns = getTableColumns(physical);\n const entries = Object.entries(columns);\n\n const schema = is(physical, PgTable)\n ? getPgTableConfig(physical).schema\n : is(physical, MySqlTable)\n ? getMysqlTableConfig(physical).schema\n : undefined;\n\n const table = { name: getTableName(physical), ...(schema === undefined ? {} : { schema }) };\n\n const getColumn = (key: string) => {\n const column = Object.hasOwn(columns, key) ? columns[key] : undefined;\n\n if (column === undefined) return invalid(\"Missing Drizzle column\");\n\n return column;\n };\n\n const bind = (alias?: string): SqlTable => {\n const reference = (key: string) => {\n const column = getColumn(key);\n\n return alias === undefined\n ? sql`${column}`\n : sql`${sql.identifier(alias)}.${sql.identifier(column.name)}`;\n };\n\n return {\n name: compile(\n alias === undefined ? sql`${physical}` : sql`${physical} AS ${sql.identifier(alias)}`,\n ),\n as: bind,\n column: (key) => compile(reference(key)),\n unencodedTextColumn: (key) => {\n const column = getColumn(key);\n\n return [\"PgText\", \"PgVarchar\", \"SQLiteText\", \"MySqlText\", \"MySqlVarChar\"].includes(\n column.columnType,\n ) &&\n Predicate.hasProperty(column.mapToDriverValue, \"isNoop\") &&\n column.mapToDriverValue.isNoop === true &&\n Predicate.hasProperty(column.mapFromDriverValue, \"isNoop\") &&\n column.mapFromDriverValue.isNoop === true &&\n (dialect.codecs === undefined ||\n (Predicate.hasProperty(dialect.codecs, \"get\") &&\n typeof dialect.codecs.get === \"function\" &&\n ([\"cast\", \"normalize\", \"castParam\", \"normalizeParam\"] as const).every(\n (kind) => dialect.codecs?.get(column, kind) === undefined,\n )))\n ? { table, name: column.name }\n : undefined;\n },\n fields: (prefix) =>\n compile(\n sql.join(\n entries.map(([key, column], index) => {\n const selection =\n dialect.codecs === undefined\n ? reference(key)\n : dialect.codecs.apply(column, \"cast\", reference(key));\n\n return sql`${selection} as ${sql.identifier(nativeSqlAlias(prefix, index))}`;\n }),\n sql`, `,\n ),\n ),\n decode: (row, prefix) =>\n Object.fromEntries(\n entries.map(([key, column], index) => {\n const alias = nativeSqlAlias(prefix, index);\n\n if (!Object.hasOwn(row, alias)) return invalid(\"Missing SQL projection field\");\n const value = row[alias];\n\n return [\n key,\n value === null\n ? null\n : column.mapFromDriverValue(\n dialect.codecs === undefined\n ? value\n : dialect.codecs.apply(column, \"normalize\", value),\n ),\n ];\n }),\n ),\n value: (key, value) => {\n const column = getColumn(key);\n\n return Statement.isFragment(value) ? value : compile(sql`${sql.param(value, column)}`);\n },\n insert: (values) => compile(database.insert(physical).values(writeValues(values)).getSQL()),\n update: (values) => compile(database.update(physical).set(writeValues(values)).getSQL()),\n };\n };\n\n return bind();\n });\n};\n"],"mappings":"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"}
|