@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
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
|
-
|
|
4
|
-
|
|
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 @@
|
|
|
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 @@
|
|
|
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":"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"}
|
|
@@ -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 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/runtime/types.ts"],"names":[],"mappings":""}
|
|
@@ -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"}
|
package/dist/runtime.js
ADDED
|
@@ -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 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/testing/types.ts"],"names":[],"mappings":""}
|