@shivaedev/platform 0.0.0 → 0.2.0
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/CHANGELOG.md +21 -0
- package/LICENSE +21 -0
- package/README.md +82 -2
- package/dist/better-auth/adapter.d.ts +11 -0
- package/dist/better-auth/adapter.d.ts.map +1 -0
- package/dist/better-auth/adapter.js +101 -0
- package/dist/better-auth/adapter.js.map +1 -0
- package/dist/better-auth/relation.d.ts +47 -0
- package/dist/better-auth/relation.d.ts.map +1 -0
- package/dist/better-auth/relation.js +111 -0
- package/dist/better-auth/relation.js.map +1 -0
- package/dist/better-auth.d.ts +2 -0
- package/dist/better-auth.d.ts.map +1 -0
- package/dist/better-auth.js +2 -0
- package/dist/better-auth.js.map +1 -0
- package/dist/runtime/make.d.ts +4 -0
- package/dist/runtime/make.d.ts.map +1 -0
- package/dist/runtime/make.js +59 -0
- package/dist/runtime/make.js.map +1 -0
- package/dist/runtime/types.d.ts +20 -0
- package/dist/runtime/types.d.ts.map +1 -0
- package/dist/runtime/types.js +2 -0
- package/dist/runtime/types.js.map +1 -0
- package/dist/runtime.d.ts +3 -0
- package/dist/runtime.d.ts.map +1 -0
- package/dist/runtime.js +2 -0
- package/dist/runtime.js.map +1 -0
- package/dist/testing/types.d.ts +26 -0
- package/dist/testing/types.d.ts.map +1 -0
- package/dist/testing/types.js +2 -0
- package/dist/testing/types.js.map +1 -0
- package/dist/testing/vitest.d.ts +8 -0
- package/dist/testing/vitest.d.ts.map +1 -0
- package/dist/testing/vitest.js +30 -0
- package/dist/testing/vitest.js.map +1 -0
- package/dist/testing.d.ts +3 -0
- package/dist/testing.d.ts.map +1 -0
- package/dist/testing.js +2 -0
- package/dist/testing.js.map +1 -0
- package/package.json +81 -3
- package/src/better-auth/adapter.ts +226 -0
- package/src/better-auth/relation.ts +199 -0
- package/src/better-auth.ts +4 -0
- package/src/runtime/make.ts +84 -0
- package/src/runtime/types.ts +34 -0
- package/src/runtime.ts +7 -0
- package/src/testing/types.ts +71 -0
- package/src/testing/vitest.ts +100 -0
- package/src/testing.ts +8 -0
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import type { Context, Effect, Exit } from "effect";
|
|
2
|
+
|
|
3
|
+
export interface PlatformRuntimeOptions {
|
|
4
|
+
/** Reuse one runtime across development module reloads. */
|
|
5
|
+
readonly developmentCacheKey?: string | symbol;
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
export interface PlatformRuntime<Services, BuildError> {
|
|
9
|
+
readonly contextEffect: Effect.Effect<Context.Context<Services>, BuildError>;
|
|
10
|
+
readonly currentServices: () => Context.Context<never> | undefined;
|
|
11
|
+
readonly dispose: () => Promise<void>;
|
|
12
|
+
readonly runPromise: <A, E, Requirements extends Services>(
|
|
13
|
+
effect: Effect.Effect<A, E, Requirements>,
|
|
14
|
+
options?: { readonly signal?: AbortSignal },
|
|
15
|
+
) => Promise<A>;
|
|
16
|
+
readonly runPromiseExit: <A, E, Requirements extends Services>(
|
|
17
|
+
effect: Effect.Effect<A, E, Requirements>,
|
|
18
|
+
options?: { readonly signal?: AbortSignal },
|
|
19
|
+
) => Promise<Exit.Exit<A, E | BuildError>>;
|
|
20
|
+
readonly runWithServices: <Provided, Value>(
|
|
21
|
+
services: Context.Context<Provided>,
|
|
22
|
+
evaluate: () => Value,
|
|
23
|
+
) => Value;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
export type PlatformRuntimeServices<Runtime> =
|
|
27
|
+
Runtime extends PlatformRuntime<infer Services, infer _BuildError>
|
|
28
|
+
? Services
|
|
29
|
+
: never;
|
|
30
|
+
|
|
31
|
+
export type PlatformRuntimeBuildError<Runtime> =
|
|
32
|
+
Runtime extends PlatformRuntime<infer _Services, infer BuildError>
|
|
33
|
+
? BuildError
|
|
34
|
+
: never;
|
package/src/runtime.ts
ADDED
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
import type { TestContext, Vitest } from "@effect/vitest";
|
|
2
|
+
import type {
|
|
3
|
+
AnyDatabase,
|
|
4
|
+
DatabaseRequirement,
|
|
5
|
+
DatabaseService,
|
|
6
|
+
} from "@shivaedev/effect-prisma/testing";
|
|
7
|
+
import type { EffectTRPCAdapter } from "@shivaedev/effect-trpc";
|
|
8
|
+
import type {
|
|
9
|
+
CallerOptions,
|
|
10
|
+
CallerResult,
|
|
11
|
+
EffectCallerFactory,
|
|
12
|
+
TrpcHarnessTest,
|
|
13
|
+
TrpcHarnessTester,
|
|
14
|
+
} from "@shivaedev/effect-trpc/testing";
|
|
15
|
+
import type { Effect, Layer } from "effect";
|
|
16
|
+
|
|
17
|
+
export type PlatformHarness<
|
|
18
|
+
Database extends AnyDatabase,
|
|
19
|
+
Options,
|
|
20
|
+
Caller,
|
|
21
|
+
Extension,
|
|
22
|
+
> = Readonly<{
|
|
23
|
+
db: DatabaseService<Database>;
|
|
24
|
+
trpc: EffectCallerFactory<Options, Caller>;
|
|
25
|
+
}> &
|
|
26
|
+
Readonly<{
|
|
27
|
+
promise: <Value>(
|
|
28
|
+
evaluate: () => Promise<Value>,
|
|
29
|
+
) => Effect.Effect<Value, unknown>;
|
|
30
|
+
}> &
|
|
31
|
+
Omit<Extension, "db" | "promise" | "trpc">;
|
|
32
|
+
|
|
33
|
+
export type PlatformTest<Harness, Provided> = TrpcHarnessTest<
|
|
34
|
+
Harness,
|
|
35
|
+
Provided
|
|
36
|
+
>;
|
|
37
|
+
|
|
38
|
+
export type PlatformTester<Harness, Provided> = TrpcHarnessTester<
|
|
39
|
+
Harness,
|
|
40
|
+
Provided
|
|
41
|
+
>;
|
|
42
|
+
|
|
43
|
+
export type PlatformIt<Harness, Provided> = Vitest.Methods & {
|
|
44
|
+
readonly effectApp: PlatformTester<Harness, Provided>;
|
|
45
|
+
};
|
|
46
|
+
|
|
47
|
+
export interface MakePlatformItOptions<
|
|
48
|
+
Database extends AnyDatabase,
|
|
49
|
+
CreateCaller extends (...arguments_: never[]) => object,
|
|
50
|
+
Provided,
|
|
51
|
+
LayerError,
|
|
52
|
+
Extension,
|
|
53
|
+
> {
|
|
54
|
+
readonly adapter: Pick<EffectTRPCAdapter<never>, "runWithServices">;
|
|
55
|
+
readonly createCaller: CreateCaller;
|
|
56
|
+
readonly extend?: (
|
|
57
|
+
base: Readonly<{
|
|
58
|
+
db: DatabaseService<Database>;
|
|
59
|
+
trpc: EffectCallerFactory<
|
|
60
|
+
CallerOptions<NoInfer<CreateCaller>>,
|
|
61
|
+
CallerResult<NoInfer<CreateCaller>>
|
|
62
|
+
>;
|
|
63
|
+
}>,
|
|
64
|
+
context: TestContext,
|
|
65
|
+
) => Effect.Effect<
|
|
66
|
+
Extension,
|
|
67
|
+
unknown,
|
|
68
|
+
Provided | DatabaseRequirement<Database> | Effect.Services<Database>
|
|
69
|
+
>;
|
|
70
|
+
readonly layer: Layer.Layer<Provided, LayerError>;
|
|
71
|
+
}
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
import type { Vitest } from "@effect/vitest";
|
|
2
|
+
import {
|
|
3
|
+
type AnyDatabase,
|
|
4
|
+
type DatabaseRequirement,
|
|
5
|
+
type DatabaseService,
|
|
6
|
+
withTestTransaction,
|
|
7
|
+
} from "@shivaedev/effect-prisma/testing";
|
|
8
|
+
import {
|
|
9
|
+
type CallerOptions,
|
|
10
|
+
type CallerResult,
|
|
11
|
+
type EffectCallerFactory,
|
|
12
|
+
makeTrpcHarnessIt,
|
|
13
|
+
} from "@shivaedev/effect-trpc/testing";
|
|
14
|
+
import { Effect, type Layer } from "effect";
|
|
15
|
+
import type {
|
|
16
|
+
MakePlatformItOptions,
|
|
17
|
+
PlatformHarness,
|
|
18
|
+
PlatformIt,
|
|
19
|
+
} from "./types.js";
|
|
20
|
+
|
|
21
|
+
export const makePlatformIt =
|
|
22
|
+
<const Database extends AnyDatabase>(database: Database) =>
|
|
23
|
+
<
|
|
24
|
+
CreateCaller extends (...arguments_: never[]) => object,
|
|
25
|
+
Provided,
|
|
26
|
+
LayerError,
|
|
27
|
+
Extension extends object = Record<never, never>,
|
|
28
|
+
>(
|
|
29
|
+
options: MakePlatformItOptions<
|
|
30
|
+
Database,
|
|
31
|
+
CreateCaller,
|
|
32
|
+
Provided,
|
|
33
|
+
LayerError,
|
|
34
|
+
Extension
|
|
35
|
+
> & {
|
|
36
|
+
readonly layer: Layer.Layer<
|
|
37
|
+
Provided | DatabaseRequirement<Database> | Effect.Services<Database>,
|
|
38
|
+
LayerError
|
|
39
|
+
>;
|
|
40
|
+
},
|
|
41
|
+
): PlatformIt<
|
|
42
|
+
PlatformHarness<
|
|
43
|
+
Database,
|
|
44
|
+
CallerOptions<CreateCaller>,
|
|
45
|
+
CallerResult<CreateCaller>,
|
|
46
|
+
Extension
|
|
47
|
+
>,
|
|
48
|
+
Provided | DatabaseRequirement<Database> | Effect.Services<Database>
|
|
49
|
+
> => {
|
|
50
|
+
type Options = CallerOptions<CreateCaller>;
|
|
51
|
+
type Caller = CallerResult<CreateCaller>;
|
|
52
|
+
type Services =
|
|
53
|
+
| Provided
|
|
54
|
+
| DatabaseRequirement<Database>
|
|
55
|
+
| Effect.Services<Database>;
|
|
56
|
+
type Harness = PlatformHarness<Database, Options, Caller, Extension>;
|
|
57
|
+
|
|
58
|
+
const trpcIt = makeTrpcHarnessIt<
|
|
59
|
+
CreateCaller,
|
|
60
|
+
Layer.Layer<Services, LayerError>,
|
|
61
|
+
Harness
|
|
62
|
+
>({
|
|
63
|
+
adapter: options.adapter,
|
|
64
|
+
createCaller: options.createCaller,
|
|
65
|
+
layer: options.layer,
|
|
66
|
+
around: (effect) => withTestTransaction(database, effect),
|
|
67
|
+
makeHarness: (
|
|
68
|
+
trpc: EffectCallerFactory<Options, Caller>,
|
|
69
|
+
context,
|
|
70
|
+
): Effect.Effect<Harness, unknown, Services> =>
|
|
71
|
+
Effect.gen(function* () {
|
|
72
|
+
const services = yield* Effect.context<Services>();
|
|
73
|
+
const databaseEffect = database as unknown as Effect.Effect<
|
|
74
|
+
DatabaseService<Database>,
|
|
75
|
+
never,
|
|
76
|
+
Effect.Services<Database>
|
|
77
|
+
>;
|
|
78
|
+
const db = yield* databaseEffect;
|
|
79
|
+
const extension = options.extend
|
|
80
|
+
? yield* options.extend({ db, trpc }, context)
|
|
81
|
+
: ({} as Extension);
|
|
82
|
+
const promise = <Value>(evaluate: () => Promise<Value>) =>
|
|
83
|
+
Effect.tryPromise(() =>
|
|
84
|
+
options.adapter.runWithServices(services, evaluate),
|
|
85
|
+
);
|
|
86
|
+
return { ...extension, db, promise, trpc } as Harness;
|
|
87
|
+
}) as Effect.Effect<Harness, unknown, Services>,
|
|
88
|
+
});
|
|
89
|
+
|
|
90
|
+
return new Proxy(trpcIt, {
|
|
91
|
+
get(target, property, receiver) {
|
|
92
|
+
if (property === "effectApp") {
|
|
93
|
+
return trpcIt.effectTRPC;
|
|
94
|
+
}
|
|
95
|
+
return Reflect.get(target, property, receiver);
|
|
96
|
+
},
|
|
97
|
+
}) as unknown as Vitest.Methods & {
|
|
98
|
+
readonly effectApp: typeof trpcIt.effectTRPC;
|
|
99
|
+
} as PlatformIt<Harness, Services>;
|
|
100
|
+
};
|