@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
package/CHANGELOG.md ADDED
@@ -0,0 +1,21 @@
1
+ # Changelog
2
+
3
+ ## Unreleased
4
+
5
+ ## 0.2.0 - 2026-08-03
6
+
7
+ ### Added
8
+
9
+ - Add a shared application runtime that carries Effect services across tRPC,
10
+ Better Auth, and other promise boundaries.
11
+ - Add a Better Auth adapter backed by Effect Prisma, including transaction
12
+ propagation and PostgreSQL filter support.
13
+ - Add a `promise` test-harness helper for driving promise-based boundaries
14
+ inside the test rollback transaction.
15
+
16
+ ## 0.1.0 - 2026-08-03
17
+
18
+ ### Added
19
+
20
+ - Add an opinionated Effect Vitest harness that combines typed tRPC callers,
21
+ direct Prisma access, rollback isolation, and application-owned fixtures.
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 ShivaeDev
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md CHANGED
@@ -1,4 +1,84 @@
1
1
  # @shivaedev/platform
2
2
 
3
- This placeholder reserves the package for releases from
4
- [ShivaeDev/platform](https://github.com/ShivaeDev/platform).
3
+ Opinionated shared setup for ShivaeDev Effect applications. This package favors
4
+ one consistent application shape over supporting every possible combination of
5
+ database, transport, and test framework.
6
+
7
+ Generic Prisma and tRPC integrations remain available separately from
8
+ `@shivaedev/effect-prisma` and `@shivaedev/effect-trpc`.
9
+
10
+ ## Runtime
11
+
12
+ Build one managed runtime for the application and share it with integrations:
13
+
14
+ ```ts
15
+ import { makePlatformRuntime } from "@shivaedev/platform/runtime"
16
+
17
+ export const runtime = makePlatformRuntime(ApplicationLive, {
18
+ developmentCacheKey: "application",
19
+ })
20
+ ```
21
+
22
+ The optional cache key keeps one runtime across development module reloads.
23
+ The runtime also carries transaction- and request-scoped service overrides
24
+ across promise boundaries.
25
+
26
+ ## Better Auth
27
+
28
+ `effectPrismaAdapter` stores Better Auth data through the application's Effect
29
+ Prisma database and runtime, including Better Auth transactions:
30
+
31
+ ```ts
32
+ import { effectPrismaAdapter } from "@shivaedev/platform/better-auth"
33
+ import { betterAuth } from "better-auth"
34
+
35
+ const auth = betterAuth({
36
+ database: effectPrismaAdapter(Database, runtime),
37
+ })
38
+ ```
39
+
40
+ The adapter owns database translation only. Providers, plugins, cookies,
41
+ session policy, and authorization remain application configuration. Native
42
+ experimental Better Auth joins are not supported; the standard adapter join
43
+ fallback remains available.
44
+
45
+ ## Testing
46
+
47
+ Configure the application database, tRPC caller, and test Layer once:
48
+
49
+ ```ts
50
+ import { makePlatformIt } from "@shivaedev/platform/testing"
51
+
52
+ export const it = makePlatformIt(Database)({
53
+ adapter: effectTrpc,
54
+ createCaller: (options = defaultActor) => appRouter.createCaller(options),
55
+ layer: TestLive,
56
+ extend: ({ db, trpc }) =>
57
+ Effect.succeed({
58
+ actors,
59
+ factories: makeFactories(db),
60
+ fixtures: makeFixtures({ db, trpc }),
61
+ }),
62
+ })
63
+ ```
64
+
65
+ Every `effectApp` test runs inside a real transaction. tRPC procedures, direct
66
+ database calls, factories, and fixtures share that transaction, which is rolled
67
+ back after both successful and failed tests:
68
+
69
+ ```ts
70
+ it.effectApp("creates a movie", function* ({ trpc, db, factories, promise }) {
71
+ const input = factories.movie()
72
+ const movie = yield* trpc.movie.create(input)
73
+ const stored = yield* db.Movie.where({ id: movie.id }).first()
74
+
75
+ expect(stored?.title).toBe(input.title)
76
+ })
77
+ ```
78
+
79
+ `promise(() => ...)` runs a promise-based application boundary, such as Better
80
+ Auth or an HTTP handler, with the same transaction-scoped Effect services.
81
+
82
+ Calling `trpc(options)` creates a caller for another application actor without
83
+ rebuilding the worker-scoped test Layer. `effectApp` also supports `skip`,
84
+ `skipIf`, `runIf`, `only`, `each`, and `fails`.
@@ -0,0 +1,11 @@
1
+ import type { AnyDatabase } from "@shivaedev/effect-prisma";
2
+ import type { DBAdapterInstance } from "better-auth";
3
+ import type { PlatformRuntime } from "../runtime/types.js";
4
+ export interface EffectPrismaAdapterOptions {
5
+ readonly debugLogs?: boolean;
6
+ /** Map Better Auth model names to Prisma contract model names. */
7
+ readonly modelName?: (model: string) => string;
8
+ readonly usePlural?: boolean;
9
+ }
10
+ export declare const effectPrismaAdapter: <Database extends AnyDatabase, Services, BuildError>(databaseTag: Database, runtime: PlatformRuntime<Services, BuildError>, adapterOptions?: EffectPrismaAdapterOptions) => DBAdapterInstance;
11
+ //# sourceMappingURL=adapter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"adapter.d.ts","sourceRoot":"","sources":["../../src/better-auth/adapter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAqB,MAAM,0BAA0B,CAAC;AAC/E,OAAO,KAAK,EAAqB,iBAAiB,EAAS,MAAM,aAAa,CAAC;AAG/E,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAY3D,MAAM,WAAW,0BAA0B;IAC1C,QAAQ,CAAC,SAAS,CAAC,EAAE,OAAO,CAAC;IAC7B,kEAAkE;IAClE,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,MAAM,CAAC;IAC/C,QAAQ,CAAC,SAAS,CAAC,EAAE,OAAO,CAAC;CAC7B;AA2BD,eAAO,MAAM,mBAAmB,GAC9B,QAAQ,SAAS,WAAW,EAAE,QAAQ,EAAE,UAAU,EAClD,aAAa,QAAQ,EACrB,SAAS,eAAe,CAAC,QAAQ,EAAE,UAAU,CAAC,EAC9C,iBAAgB,0BAA+B,KAC7C,iBA4KF,CAAC"}
@@ -0,0 +1,101 @@
1
+ import { createAdapterFactory } from "better-auth/adapters";
2
+ import { Effect, Option } from "effect";
3
+ import { refineRelation } from "./relation.js";
4
+ const modelRelation = (database, model, mapModelName) => Reflect.get(database, mapModelName(model));
5
+ const defaultModelName = (model) => model.length === 0 ? model : `${model[0]?.toUpperCase()}${model.slice(1)}`;
6
+ const rejectJoin = (join) => {
7
+ if (join !== undefined) {
8
+ throw new TypeError("The Effect Prisma Better Auth adapter does not support experimental native joins");
9
+ }
10
+ };
11
+ export const effectPrismaAdapter = (databaseTag, runtime, adapterOptions = {}) => (authOptions) => {
12
+ const mapModelName = adapterOptions.modelName ?? defaultModelName;
13
+ const databaseEffect = databaseTag;
14
+ const run = (operation) => runtime.runPromise(Effect.flatMap(databaseEffect, (database) => operation(database)));
15
+ let factory;
16
+ factory = createAdapterFactory({
17
+ config: {
18
+ adapterId: "effect-prisma",
19
+ adapterName: "Effect Prisma",
20
+ debugLogs: adapterOptions.debugLogs ?? false,
21
+ supportsArrays: true,
22
+ supportsBooleans: true,
23
+ supportsDates: true,
24
+ supportsJSON: true,
25
+ supportsNumericIds: true,
26
+ supportsUUIDs: true,
27
+ transaction: (callback) => run((database) => database.transaction(Effect.flatMap(Effect.context(), (services) => Effect.tryPromise({
28
+ try: () => runtime.runWithServices(services, () => callback(factory(authOptions))),
29
+ catch: (error) => error,
30
+ })))),
31
+ },
32
+ adapter: ({ debugLog, getFieldAttributes }) => ({
33
+ create: async ({ data, model, select }) => {
34
+ debugLog("create", { model });
35
+ return (await run((database) => refineRelation(modelRelation(database, model, mapModelName), {
36
+ select,
37
+ }).create(data)));
38
+ },
39
+ findOne: async ({ join, model, select, where, }) => {
40
+ rejectJoin(join);
41
+ return (await run((database) => Effect.map(refineRelation(modelRelation(database, model, mapModelName), {
42
+ select,
43
+ where,
44
+ }).first(), Option.getOrNull)));
45
+ },
46
+ findMany: async ({ join, limit, model, offset, select, sortBy, where, }) => {
47
+ rejectJoin(join);
48
+ return (await run((database) => refineRelation(modelRelation(database, model, mapModelName), {
49
+ limit,
50
+ offset,
51
+ select,
52
+ sortBy,
53
+ where,
54
+ })));
55
+ },
56
+ update: async ({ model, update, where }) => {
57
+ if (where.length === 0)
58
+ return null;
59
+ const hasUniqueCondition = where.some((condition) => condition.connector !== "OR" &&
60
+ condition.operator === "eq" &&
61
+ condition.mode !== "insensitive" &&
62
+ (condition.field === "id" ||
63
+ getFieldAttributes({
64
+ field: condition.field,
65
+ model,
66
+ }).unique === true));
67
+ return (await run((database) => {
68
+ const relation = refineRelation(modelRelation(database, model, mapModelName), { where });
69
+ return hasUniqueCondition
70
+ ? relation.update(update)
71
+ : Effect.map(relation.updateAll(update), (rows) => rows[0] ?? null);
72
+ }));
73
+ },
74
+ updateMany: ({ model, update, where }) => run((database) => Effect.map(refineRelation(modelRelation(database, model, mapModelName), {
75
+ where,
76
+ }).updateAll(update), (rows) => rows.length)),
77
+ delete: ({ model, where }) => {
78
+ const hasId = where.some((condition) => condition.connector !== "OR" &&
79
+ condition.field === "id" &&
80
+ condition.operator === "eq");
81
+ return run((database) => {
82
+ const relation = refineRelation(modelRelation(database, model, mapModelName), { where });
83
+ return hasId
84
+ ? Effect.asVoid(relation.delete())
85
+ : Effect.asVoid(relation.deleteAll());
86
+ });
87
+ },
88
+ deleteMany: ({ model, where }) => run((database) => Effect.map(refineRelation(modelRelation(database, model, mapModelName), {
89
+ where,
90
+ }).deleteAll(), (rows) => rows.length)),
91
+ count: ({ model, where }) => run((database) => refineRelation(modelRelation(database, model, mapModelName), {
92
+ where: where,
93
+ }).count()),
94
+ options: {
95
+ usePlural: adapterOptions.usePlural ?? false,
96
+ },
97
+ }),
98
+ });
99
+ return factory(authOptions);
100
+ };
101
+ //# sourceMappingURL=adapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"adapter.js","sourceRoot":"","sources":["../../src/better-auth/adapter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,47 @@
1
+ import { and } from "@shivaedev/effect-prisma";
2
+ import type { Where } from "better-auth";
3
+ import type { Effect, Option } from "effect";
4
+ type CleanedWhere = Required<Where>;
5
+ type Expression = Parameters<typeof and>[number];
6
+ interface DynamicField {
7
+ eq(value: unknown): Expression;
8
+ neq(value: unknown): Expression;
9
+ gt(value: unknown): Expression;
10
+ gte(value: unknown): Expression;
11
+ lt(value: unknown): Expression;
12
+ lte(value: unknown): Expression;
13
+ in(value: ReadonlyArray<unknown>): Expression;
14
+ notIn(value: ReadonlyArray<unknown>): Expression;
15
+ like(value: string): Expression;
16
+ ilike?(value: string): Expression;
17
+ isNull(): Expression;
18
+ isNotNull(): Expression;
19
+ asc(): unknown;
20
+ desc(): unknown;
21
+ }
22
+ export interface DynamicRelation<Requirements> {
23
+ where(predicate: (fields: Record<string, DynamicField>) => Expression): DynamicRelation<Requirements>;
24
+ orderBy(ordering: (fields: Record<string, DynamicField>) => unknown): DynamicRelation<Requirements>;
25
+ take(count: number): DynamicRelation<Requirements>;
26
+ skip(count: number): DynamicRelation<Requirements>;
27
+ select(...fields: ReadonlyArray<string>): DynamicRelation<Requirements>;
28
+ first(): Effect.Effect<Option.Option<Record<string, unknown>>, unknown, Requirements>;
29
+ count(): Effect.Effect<number, unknown, Requirements>;
30
+ create(data: Record<string, unknown>): Effect.Effect<Record<string, unknown>, unknown, Requirements>;
31
+ update(data: Record<string, unknown>): Effect.Effect<Record<string, unknown> | null, unknown, Requirements>;
32
+ updateAll(data: Record<string, unknown>): Effect.Effect<ReadonlyArray<Record<string, unknown>>, unknown, Requirements>;
33
+ delete(): Effect.Effect<Record<string, unknown> | null, unknown, Requirements>;
34
+ deleteAll(): Effect.Effect<ReadonlyArray<Record<string, unknown>>, unknown, Requirements>;
35
+ }
36
+ export declare const refineRelation: <Requirements>(relation: DynamicRelation<Requirements>, options: {
37
+ readonly where?: ReadonlyArray<CleanedWhere>;
38
+ readonly select?: ReadonlyArray<string>;
39
+ readonly limit?: number;
40
+ readonly offset?: number;
41
+ readonly sortBy?: {
42
+ readonly direction: "asc" | "desc";
43
+ readonly field: string;
44
+ };
45
+ }) => DynamicRelation<Requirements>;
46
+ export {};
47
+ //# sourceMappingURL=relation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"relation.d.ts","sourceRoot":"","sources":["../../src/better-auth/relation.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,111 @@
1
+ import { all, and, not, or } from "@shivaedev/effect-prisma";
2
+ const escapeLike = (value) => value.replaceAll("\\", "\\\\").replaceAll("%", "\\%").replaceAll("_", "\\_");
3
+ const comparison = (field, where) => {
4
+ const value = where.value;
5
+ if (where.mode === "insensitive" &&
6
+ typeof value === "string" &&
7
+ field.ilike !== undefined) {
8
+ if (where.operator === "eq")
9
+ return field.ilike(escapeLike(value));
10
+ if (where.operator === "ne")
11
+ return not(field.ilike(escapeLike(value)));
12
+ }
13
+ switch (where.operator) {
14
+ case "eq":
15
+ return value === null ? field.isNull() : field.eq(value);
16
+ case "ne":
17
+ return value === null ? field.isNotNull() : field.neq(value);
18
+ case "lt":
19
+ return field.lt(value);
20
+ case "lte":
21
+ return field.lte(value);
22
+ case "gt":
23
+ return field.gt(value);
24
+ case "gte":
25
+ return field.gte(value);
26
+ case "in": {
27
+ const values = (Array.isArray(value) ? value : [value]).filter((item) => item !== null);
28
+ const ilike = field.ilike;
29
+ return values.length === 0
30
+ ? and(field.isNull(), field.isNotNull())
31
+ : where.mode === "insensitive" &&
32
+ ilike !== undefined &&
33
+ values.every((item) => typeof item === "string")
34
+ ? or(...values.map((item) => ilike(escapeLike(String(item)))))
35
+ : field.in(values);
36
+ }
37
+ case "not_in": {
38
+ const values = (Array.isArray(value) ? value : [value]).filter((item) => item !== null);
39
+ if (values.length === 0)
40
+ return undefined;
41
+ const ilike = field.ilike;
42
+ return where.mode === "insensitive" &&
43
+ ilike !== undefined &&
44
+ values.every((item) => typeof item === "string")
45
+ ? and(...values.map((item) => not(ilike(escapeLike(String(item))))))
46
+ : field.notIn(values);
47
+ }
48
+ case "contains":
49
+ case "starts_with":
50
+ case "ends_with": {
51
+ if (typeof value !== "string") {
52
+ throw new TypeError(`${where.operator} requires a string value`);
53
+ }
54
+ const escaped = escapeLike(value);
55
+ const pattern = where.operator === "contains"
56
+ ? `%${escaped}%`
57
+ : where.operator === "starts_with"
58
+ ? `${escaped}%`
59
+ : `%${escaped}`;
60
+ return where.mode === "insensitive" && field.ilike !== undefined
61
+ ? field.ilike(pattern)
62
+ : field.like(pattern);
63
+ }
64
+ }
65
+ };
66
+ const whereExpression = (fields, where) => {
67
+ const conjunctions = [];
68
+ const disjunctions = [];
69
+ for (const condition of where) {
70
+ const field = fields[condition.field];
71
+ if (field === undefined) {
72
+ throw new TypeError(`Unknown database field: ${condition.field}`);
73
+ }
74
+ const expression = comparison(field, condition);
75
+ if (expression === undefined)
76
+ continue;
77
+ (condition.connector === "OR" ? disjunctions : conjunctions).push(expression);
78
+ }
79
+ if (disjunctions.length > 0)
80
+ conjunctions.push(or(...disjunctions));
81
+ if (conjunctions.length === 0)
82
+ return all();
83
+ return conjunctions.length === 1 ? conjunctions[0] : and(...conjunctions);
84
+ };
85
+ export const refineRelation = (relation, options) => {
86
+ let refined = relation;
87
+ if (options.where !== undefined) {
88
+ refined = refined.where((fields) => {
89
+ const expression = whereExpression(fields, options.where ?? []);
90
+ return expression ?? all();
91
+ });
92
+ }
93
+ if (options.sortBy !== undefined) {
94
+ refined = refined.orderBy((fields) => {
95
+ const field = fields[options.sortBy?.field ?? ""];
96
+ if (field === undefined) {
97
+ throw new TypeError(`Unknown database field: ${options.sortBy?.field}`);
98
+ }
99
+ return options.sortBy?.direction === "desc" ? field.desc() : field.asc();
100
+ });
101
+ }
102
+ if (options.offset !== undefined)
103
+ refined = refined.skip(options.offset);
104
+ if (options.limit !== undefined)
105
+ refined = refined.take(options.limit);
106
+ if (options.select !== undefined && options.select.length > 0) {
107
+ refined = refined.select(...options.select);
108
+ }
109
+ return refined;
110
+ };
111
+ //# sourceMappingURL=relation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"relation.js","sourceRoot":"","sources":["../../src/better-auth/relation.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export { type EffectPrismaAdapterOptions, effectPrismaAdapter, } from "./better-auth/adapter.js";
2
+ //# sourceMappingURL=better-auth.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"better-auth.d.ts","sourceRoot":"","sources":["../src/better-auth.ts"],"names":[],"mappings":"AAAA,OAAO,EACN,KAAK,0BAA0B,EAC/B,mBAAmB,GACnB,MAAM,0BAA0B,CAAC"}
@@ -0,0 +1,2 @@
1
+ export { effectPrismaAdapter, } from "./better-auth/adapter.js";
2
+ //# sourceMappingURL=better-auth.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"better-auth.js","sourceRoot":"","sources":["../src/better-auth.ts"],"names":[],"mappings":"AAAA,OAAO,EAEN,mBAAmB,GACnB,MAAM,0BAA0B,CAAC"}
@@ -0,0 +1,4 @@
1
+ import type { Layer } from "effect";
2
+ import type { PlatformRuntime, PlatformRuntimeOptions } from "./types.js";
3
+ export declare const makePlatformRuntime: <Services, BuildError>(layer: Layer.Layer<Services, BuildError>, options?: PlatformRuntimeOptions) => PlatformRuntime<Services, BuildError>;
4
+ //# sourceMappingURL=make.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"make.d.ts","sourceRoot":"","sources":["../../src/runtime/make.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,QAAQ,CAAC;AAEpC,OAAO,KAAK,EAAE,eAAe,EAAE,sBAAsB,EAAE,MAAM,YAAY,CAAC;AAuD1E,eAAO,MAAM,mBAAmB,GAAI,QAAQ,EAAE,UAAU,EACvD,OAAO,KAAK,CAAC,KAAK,CAAC,QAAQ,EAAE,UAAU,CAAC,EACxC,UAAS,sBAA2B,KAClC,eAAe,CAAC,QAAQ,EAAE,UAAU,CAsBtC,CAAC"}
@@ -0,0 +1,59 @@
1
+ import { AsyncLocalStorage } from "node:async_hooks";
2
+ import { Cause, Context, Effect, Exit, ManagedRuntime } from "effect";
3
+ const RuntimeCacheKey = Symbol.for("@shivaedev/platform/runtime-cache");
4
+ const globalRuntimeCache = globalThis;
5
+ const runtimeCache = globalRuntimeCache[RuntimeCacheKey] ??
6
+ new Map();
7
+ globalRuntimeCache[RuntimeCacheKey] = runtimeCache;
8
+ const make = (layer) => {
9
+ const managed = ManagedRuntime.make(layer);
10
+ const services = new AsyncLocalStorage();
11
+ const currentServices = () => services.getStore();
12
+ const withAmbient = (effect) => {
13
+ const ambient = currentServices();
14
+ return ambient === undefined
15
+ ? effect
16
+ : Effect.flatMap(managed.contextEffect, (base) => Effect.provideContext(effect, Context.merge(base, ambient)));
17
+ };
18
+ const runPromiseExit = (effect, options) => managed.runPromiseExit(withAmbient(effect), options);
19
+ const runtime = {
20
+ contextEffect: Effect.map(managed.contextEffect, (base) => {
21
+ const ambient = currentServices();
22
+ return ambient === undefined ? base : Context.merge(base, ambient);
23
+ }),
24
+ currentServices,
25
+ dispose: () => managed.dispose(),
26
+ runPromise: async (effect, options) => {
27
+ const exit = await runPromiseExit(effect, options);
28
+ if (Exit.isSuccess(exit))
29
+ return exit.value;
30
+ throw Cause.squash(exit.cause);
31
+ },
32
+ runPromiseExit,
33
+ runWithServices: (context, evaluate) => services.run(context, evaluate),
34
+ };
35
+ return runtime;
36
+ };
37
+ export const makePlatformRuntime = (layer, options = {}) => {
38
+ const key = process.env.NODE_ENV === "production"
39
+ ? undefined
40
+ : options.developmentCacheKey;
41
+ if (key === undefined)
42
+ return make(layer);
43
+ const cached = runtimeCache.get(key);
44
+ if (cached !== undefined) {
45
+ return cached;
46
+ }
47
+ const runtime = make(layer);
48
+ const cachedRuntime = {
49
+ ...runtime,
50
+ dispose: async () => {
51
+ if (runtimeCache.get(key) === cachedRuntime)
52
+ runtimeCache.delete(key);
53
+ await runtime.dispose();
54
+ },
55
+ };
56
+ runtimeCache.set(key, cachedRuntime);
57
+ return cachedRuntime;
58
+ };
59
+ //# sourceMappingURL=make.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"make.js","sourceRoot":"","sources":["../../src/runtime/make.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAErD,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,cAAc,EAAE,MAAM,QAAQ,CAAC;AAGtE,MAAM,eAAe,GAAG,MAAM,CAAC,GAAG,CAAC,mCAAmC,CAAC,CAAC;AACxE,MAAM,kBAAkB,GAAG,UAE1B,CAAC;AACF,MAAM,YAAY,GACjB,kBAAkB,CAAC,eAAe,CAAC;IACnC,IAAI,GAAG,EAAsD,CAAC;AAC/D,kBAAkB,CAAC,eAAe,CAAC,GAAG,YAAY,CAAC;AAEnD,MAAM,IAAI,GAAG,CACZ,KAAwC,EACA,EAAE;IAC1C,MAAM,OAAO,GAAG,cAAc,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC3C,MAAM,QAAQ,GAAG,IAAI,iBAAiB,EAA0B,CAAC;IAEjE,MAAM,eAAe,GAAG,GAAG,EAAE,CAAC,QAAQ,CAAC,QAAQ,EAAE,CAAC;IAClD,MAAM,WAAW,GAAG,CACnB,MAAyC,EACQ,EAAE;QACnD,MAAM,OAAO,GAAG,eAAe,EAAE,CAAC;QAClC,OAAO,OAAO,KAAK,SAAS;YAC3B,CAAC,CAAC,MAAM;YACR,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,aAAa,EAAE,CAAC,IAAI,EAAE,EAAE,CAC/C,MAAM,CAAC,cAAc,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,CAC3D,CAAC;IACL,CAAC,CAAC;IAEF,MAAM,cAAc,GAGE,CAAC,MAAM,EAAE,OAAO,EAAE,EAAE,CACzC,OAAO,CAAC,cAAc,CAAC,WAAW,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC,CAAC;IAEtD,MAAM,OAAO,GAA0C;QACtD,aAAa,EAAE,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,aAAa,EAAE,CAAC,IAAI,EAAE,EAAE;YACzD,MAAM,OAAO,GAAG,eAAe,EAAE,CAAC;YAClC,OAAO,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;QACpE,CAAC,CAAC;QACF,eAAe;QACf,OAAO,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,OAAO,EAAE;QAChC,UAAU,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,EAAE;YACrC,MAAM,IAAI,GAAG,MAAM,cAAc,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;YACnD,IAAI,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;gBAAE,OAAO,IAAI,CAAC,KAAK,CAAC;YAC5C,MAAM,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAChC,CAAC;QACD,cAAc;QACd,eAAe,EAAE,CAAC,OAAO,EAAE,QAAQ,EAAE,EAAE,CACtC,QAAQ,CAAC,GAAG,CAAC,OAAiC,EAAE,QAAQ,CAAC;KAC1D,CAAC;IAEF,OAAO,OAAO,CAAC;AAChB,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAClC,KAAwC,EACxC,UAAkC,EAAE,EACI,EAAE;IAC1C,MAAM,GAAG,GACR,OAAO,CAAC,GAAG,CAAC,QAAQ,KAAK,YAAY;QACpC,CAAC,CAAC,SAAS;QACX,CAAC,CAAC,OAAO,CAAC,mBAAmB,CAAC;IAChC,IAAI,GAAG,KAAK,SAAS;QAAE,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC;IAE1C,MAAM,MAAM,GAAG,YAAY,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IACrC,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;QAC1B,OAAO,MAA+C,CAAC;IACxD,CAAC;IAED,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC;IAC5B,MAAM,aAAa,GAA0C;QAC5D,GAAG,OAAO;QACV,OAAO,EAAE,KAAK,IAAI,EAAE;YACnB,IAAI,YAAY,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,aAAa;gBAAE,YAAY,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YACtE,MAAM,OAAO,CAAC,OAAO,EAAE,CAAC;QACzB,CAAC;KACD,CAAC;IACF,YAAY,CAAC,GAAG,CAAC,GAAG,EAAE,aAAkD,CAAC,CAAC;IAC1E,OAAO,aAAa,CAAC;AACtB,CAAC,CAAC"}
@@ -0,0 +1,20 @@
1
+ import type { Context, Effect, Exit } from "effect";
2
+ export interface PlatformRuntimeOptions {
3
+ /** Reuse one runtime across development module reloads. */
4
+ readonly developmentCacheKey?: string | symbol;
5
+ }
6
+ export interface PlatformRuntime<Services, BuildError> {
7
+ readonly contextEffect: Effect.Effect<Context.Context<Services>, BuildError>;
8
+ readonly currentServices: () => Context.Context<never> | undefined;
9
+ readonly dispose: () => Promise<void>;
10
+ readonly runPromise: <A, E, Requirements extends Services>(effect: Effect.Effect<A, E, Requirements>, options?: {
11
+ readonly signal?: AbortSignal;
12
+ }) => Promise<A>;
13
+ readonly runPromiseExit: <A, E, Requirements extends Services>(effect: Effect.Effect<A, E, Requirements>, options?: {
14
+ readonly signal?: AbortSignal;
15
+ }) => Promise<Exit.Exit<A, E | BuildError>>;
16
+ readonly runWithServices: <Provided, Value>(services: Context.Context<Provided>, evaluate: () => Value) => Value;
17
+ }
18
+ export type PlatformRuntimeServices<Runtime> = Runtime extends PlatformRuntime<infer Services, infer _BuildError> ? Services : never;
19
+ export type PlatformRuntimeBuildError<Runtime> = Runtime extends PlatformRuntime<infer _Services, infer BuildError> ? BuildError : never;
20
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/runtime/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AAEpD,MAAM,WAAW,sBAAsB;IACtC,2DAA2D;IAC3D,QAAQ,CAAC,mBAAmB,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;CAC/C;AAED,MAAM,WAAW,eAAe,CAAC,QAAQ,EAAE,UAAU;IACpD,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,UAAU,CAAC,CAAC;IAC7E,QAAQ,CAAC,eAAe,EAAE,MAAM,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,SAAS,CAAC;IACnE,QAAQ,CAAC,OAAO,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IACtC,QAAQ,CAAC,UAAU,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,YAAY,SAAS,QAAQ,EACxD,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,YAAY,CAAC,EACzC,OAAO,CAAC,EAAE;QAAE,QAAQ,CAAC,MAAM,CAAC,EAAE,WAAW,CAAA;KAAE,KACvC,OAAO,CAAC,CAAC,CAAC,CAAC;IAChB,QAAQ,CAAC,cAAc,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,YAAY,SAAS,QAAQ,EAC5D,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,YAAY,CAAC,EACzC,OAAO,CAAC,EAAE;QAAE,QAAQ,CAAC,MAAM,CAAC,EAAE,WAAW,CAAA;KAAE,KACvC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,GAAG,UAAU,CAAC,CAAC,CAAC;IAC3C,QAAQ,CAAC,eAAe,EAAE,CAAC,QAAQ,EAAE,KAAK,EACzC,QAAQ,EAAE,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,EACnC,QAAQ,EAAE,MAAM,KAAK,KACjB,KAAK,CAAC;CACX;AAED,MAAM,MAAM,uBAAuB,CAAC,OAAO,IAC1C,OAAO,SAAS,eAAe,CAAC,MAAM,QAAQ,EAAE,MAAM,WAAW,CAAC,GAC/D,QAAQ,GACR,KAAK,CAAC;AAEV,MAAM,MAAM,yBAAyB,CAAC,OAAO,IAC5C,OAAO,SAAS,eAAe,CAAC,MAAM,SAAS,EAAE,MAAM,UAAU,CAAC,GAC/D,UAAU,GACV,KAAK,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/runtime/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,3 @@
1
+ export { makePlatformRuntime } from "./runtime/make.js";
2
+ export type { PlatformRuntime, PlatformRuntimeBuildError, PlatformRuntimeOptions, PlatformRuntimeServices, } from "./runtime/types.js";
3
+ //# sourceMappingURL=runtime.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runtime.d.ts","sourceRoot":"","sources":["../src/runtime.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AACxD,YAAY,EACX,eAAe,EACf,yBAAyB,EACzB,sBAAsB,EACtB,uBAAuB,GACvB,MAAM,oBAAoB,CAAC"}
@@ -0,0 +1,2 @@
1
+ export { makePlatformRuntime } from "./runtime/make.js";
2
+ //# sourceMappingURL=runtime.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runtime.js","sourceRoot":"","sources":["../src/runtime.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC"}
@@ -0,0 +1,26 @@
1
+ import type { TestContext, Vitest } from "@effect/vitest";
2
+ import type { AnyDatabase, DatabaseRequirement, DatabaseService } from "@shivaedev/effect-prisma/testing";
3
+ import type { EffectTRPCAdapter } from "@shivaedev/effect-trpc";
4
+ import type { CallerOptions, CallerResult, EffectCallerFactory, TrpcHarnessTest, TrpcHarnessTester } from "@shivaedev/effect-trpc/testing";
5
+ import type { Effect, Layer } from "effect";
6
+ export type PlatformHarness<Database extends AnyDatabase, Options, Caller, Extension> = Readonly<{
7
+ db: DatabaseService<Database>;
8
+ trpc: EffectCallerFactory<Options, Caller>;
9
+ }> & Readonly<{
10
+ promise: <Value>(evaluate: () => Promise<Value>) => Effect.Effect<Value, unknown>;
11
+ }> & Omit<Extension, "db" | "promise" | "trpc">;
12
+ export type PlatformTest<Harness, Provided> = TrpcHarnessTest<Harness, Provided>;
13
+ export type PlatformTester<Harness, Provided> = TrpcHarnessTester<Harness, Provided>;
14
+ export type PlatformIt<Harness, Provided> = Vitest.Methods & {
15
+ readonly effectApp: PlatformTester<Harness, Provided>;
16
+ };
17
+ export interface MakePlatformItOptions<Database extends AnyDatabase, CreateCaller extends (...arguments_: never[]) => object, Provided, LayerError, Extension> {
18
+ readonly adapter: Pick<EffectTRPCAdapter<never>, "runWithServices">;
19
+ readonly createCaller: CreateCaller;
20
+ readonly extend?: (base: Readonly<{
21
+ db: DatabaseService<Database>;
22
+ trpc: EffectCallerFactory<CallerOptions<NoInfer<CreateCaller>>, CallerResult<NoInfer<CreateCaller>>>;
23
+ }>, context: TestContext) => Effect.Effect<Extension, unknown, Provided | DatabaseRequirement<Database> | Effect.Services<Database>>;
24
+ readonly layer: Layer.Layer<Provided, LayerError>;
25
+ }
26
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/testing/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AAC1D,OAAO,KAAK,EACX,WAAW,EACX,mBAAmB,EACnB,eAAe,EACf,MAAM,kCAAkC,CAAC;AAC1C,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAChE,OAAO,KAAK,EACX,aAAa,EACb,YAAY,EACZ,mBAAmB,EACnB,eAAe,EACf,iBAAiB,EACjB,MAAM,gCAAgC,CAAC;AACxC,OAAO,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,QAAQ,CAAC;AAE5C,MAAM,MAAM,eAAe,CAC1B,QAAQ,SAAS,WAAW,EAC5B,OAAO,EACP,MAAM,EACN,SAAS,IACN,QAAQ,CAAC;IACZ,EAAE,EAAE,eAAe,CAAC,QAAQ,CAAC,CAAC;IAC9B,IAAI,EAAE,mBAAmB,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;CAC3C,CAAC,GACD,QAAQ,CAAC;IACR,OAAO,EAAE,CAAC,KAAK,EACd,QAAQ,EAAE,MAAM,OAAO,CAAC,KAAK,CAAC,KAC1B,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;CACnC,CAAC,GACF,IAAI,CAAC,SAAS,EAAE,IAAI,GAAG,SAAS,GAAG,MAAM,CAAC,CAAC;AAE5C,MAAM,MAAM,YAAY,CAAC,OAAO,EAAE,QAAQ,IAAI,eAAe,CAC5D,OAAO,EACP,QAAQ,CACR,CAAC;AAEF,MAAM,MAAM,cAAc,CAAC,OAAO,EAAE,QAAQ,IAAI,iBAAiB,CAChE,OAAO,EACP,QAAQ,CACR,CAAC;AAEF,MAAM,MAAM,UAAU,CAAC,OAAO,EAAE,QAAQ,IAAI,MAAM,CAAC,OAAO,GAAG;IAC5D,QAAQ,CAAC,SAAS,EAAE,cAAc,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;CACtD,CAAC;AAEF,MAAM,WAAW,qBAAqB,CACrC,QAAQ,SAAS,WAAW,EAC5B,YAAY,SAAS,CAAC,GAAG,UAAU,EAAE,KAAK,EAAE,KAAK,MAAM,EACvD,QAAQ,EACR,UAAU,EACV,SAAS;IAET,QAAQ,CAAC,OAAO,EAAE,IAAI,CAAC,iBAAiB,CAAC,KAAK,CAAC,EAAE,iBAAiB,CAAC,CAAC;IACpE,QAAQ,CAAC,YAAY,EAAE,YAAY,CAAC;IACpC,QAAQ,CAAC,MAAM,CAAC,EAAE,CACjB,IAAI,EAAE,QAAQ,CAAC;QACd,EAAE,EAAE,eAAe,CAAC,QAAQ,CAAC,CAAC;QAC9B,IAAI,EAAE,mBAAmB,CACxB,aAAa,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC,EACpC,YAAY,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC,CACnC,CAAC;KACF,CAAC,EACF,OAAO,EAAE,WAAW,KAChB,MAAM,CAAC,MAAM,CACjB,SAAS,EACT,OAAO,EACP,QAAQ,GAAG,mBAAmB,CAAC,QAAQ,CAAC,GAAG,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,CACpE,CAAC;IACF,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;CAClD"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/testing/types.ts"],"names":[],"mappings":""}