@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.
Files changed (49) hide show
  1. package/CHANGELOG.md +21 -0
  2. package/LICENSE +21 -0
  3. package/README.md +82 -2
  4. package/dist/better-auth/adapter.d.ts +11 -0
  5. package/dist/better-auth/adapter.d.ts.map +1 -0
  6. package/dist/better-auth/adapter.js +101 -0
  7. package/dist/better-auth/adapter.js.map +1 -0
  8. package/dist/better-auth/relation.d.ts +47 -0
  9. package/dist/better-auth/relation.d.ts.map +1 -0
  10. package/dist/better-auth/relation.js +111 -0
  11. package/dist/better-auth/relation.js.map +1 -0
  12. package/dist/better-auth.d.ts +2 -0
  13. package/dist/better-auth.d.ts.map +1 -0
  14. package/dist/better-auth.js +2 -0
  15. package/dist/better-auth.js.map +1 -0
  16. package/dist/runtime/make.d.ts +4 -0
  17. package/dist/runtime/make.d.ts.map +1 -0
  18. package/dist/runtime/make.js +59 -0
  19. package/dist/runtime/make.js.map +1 -0
  20. package/dist/runtime/types.d.ts +20 -0
  21. package/dist/runtime/types.d.ts.map +1 -0
  22. package/dist/runtime/types.js +2 -0
  23. package/dist/runtime/types.js.map +1 -0
  24. package/dist/runtime.d.ts +3 -0
  25. package/dist/runtime.d.ts.map +1 -0
  26. package/dist/runtime.js +2 -0
  27. package/dist/runtime.js.map +1 -0
  28. package/dist/testing/types.d.ts +26 -0
  29. package/dist/testing/types.d.ts.map +1 -0
  30. package/dist/testing/types.js +2 -0
  31. package/dist/testing/types.js.map +1 -0
  32. package/dist/testing/vitest.d.ts +8 -0
  33. package/dist/testing/vitest.d.ts.map +1 -0
  34. package/dist/testing/vitest.js +30 -0
  35. package/dist/testing/vitest.js.map +1 -0
  36. package/dist/testing.d.ts +3 -0
  37. package/dist/testing.d.ts.map +1 -0
  38. package/dist/testing.js +2 -0
  39. package/dist/testing.js.map +1 -0
  40. package/package.json +81 -3
  41. package/src/better-auth/adapter.ts +226 -0
  42. package/src/better-auth/relation.ts +199 -0
  43. package/src/better-auth.ts +4 -0
  44. package/src/runtime/make.ts +84 -0
  45. package/src/runtime/types.ts +34 -0
  46. package/src/runtime.ts +7 -0
  47. package/src/testing/types.ts +71 -0
  48. package/src/testing/vitest.ts +100 -0
  49. 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,7 @@
1
+ export { makePlatformRuntime } from "./runtime/make.js";
2
+ export type {
3
+ PlatformRuntime,
4
+ PlatformRuntimeBuildError,
5
+ PlatformRuntimeOptions,
6
+ PlatformRuntimeServices,
7
+ } from "./runtime/types.js";
@@ -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
+ };
package/src/testing.ts ADDED
@@ -0,0 +1,8 @@
1
+ export type {
2
+ MakePlatformItOptions,
3
+ PlatformHarness,
4
+ PlatformIt,
5
+ PlatformTest,
6
+ PlatformTester,
7
+ } from "./testing/types.js";
8
+ export { makePlatformIt } from "./testing/vitest.js";