@shivaedev/platform 0.3.8 → 0.4.1
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 +25 -1
- package/README.md +41 -2
- package/dist/better-auth/adapter.d.ts +2 -2
- package/dist/better-auth/adapter.d.ts.map +1 -1
- package/dist/better-auth/adapter.js +39 -95
- package/dist/better-auth/adapter.js.map +1 -1
- package/dist/better-auth/relation.d.ts +7 -27
- package/dist/better-auth/relation.d.ts.map +1 -1
- package/dist/better-auth/relation.js +2 -84
- package/dist/better-auth/relation.js.map +1 -1
- package/dist/better-auth/row-adapter.d.ts +8 -0
- package/dist/better-auth/row-adapter.d.ts.map +1 -0
- package/dist/better-auth/row-adapter.js +45 -0
- package/dist/better-auth/row-adapter.js.map +1 -0
- package/dist/better-auth/where.d.ts +22 -0
- package/dist/better-auth/where.d.ts.map +1 -0
- package/dist/better-auth/where.js +93 -0
- package/dist/better-auth/where.js.map +1 -0
- package/dist/better-auth.d.ts +1 -1
- package/dist/errors/rejected-field.d.ts +7 -0
- package/dist/errors/rejected-field.d.ts.map +1 -0
- package/dist/errors/rejected-field.js +5 -0
- package/dist/errors/rejected-field.js.map +1 -0
- package/dist/errors/taxonomy.d.ts +40 -0
- package/dist/errors/taxonomy.d.ts.map +1 -0
- package/dist/errors/taxonomy.js +18 -0
- package/dist/errors/taxonomy.js.map +1 -0
- package/dist/errors.d.ts +3 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +3 -0
- package/dist/errors.js.map +1 -0
- package/dist/node-http/subscription-signal.d.ts.map +1 -1
- package/dist/node-http/subscription-signal.js +6 -1
- package/dist/node-http/subscription-signal.js.map +1 -1
- package/dist/node-http.d.ts +1 -1
- package/dist/rpc/identity.d.ts +15 -0
- package/dist/rpc/identity.d.ts.map +1 -0
- package/dist/rpc/identity.js +8 -0
- package/dist/rpc/identity.js.map +1 -0
- package/dist/rpc/middleware.d.ts +15 -0
- package/dist/rpc/middleware.d.ts.map +1 -0
- package/dist/rpc/middleware.js +12 -0
- package/dist/rpc/middleware.js.map +1 -0
- package/dist/rpc-server/adapters/better-auth-sessions.d.ts +4 -0
- package/dist/rpc-server/adapters/better-auth-sessions.d.ts.map +1 -0
- package/dist/rpc-server/adapters/better-auth-sessions.js +11 -0
- package/dist/rpc-server/adapters/better-auth-sessions.js.map +1 -0
- package/dist/rpc-server/origin.d.ts +15 -0
- package/dist/rpc-server/origin.d.ts.map +1 -0
- package/dist/rpc-server/origin.js +12 -0
- package/dist/rpc-server/origin.js.map +1 -0
- package/dist/rpc-server/redact-cause.d.ts +6 -0
- package/dist/rpc-server/redact-cause.d.ts.map +1 -0
- package/dist/rpc-server/redact-cause.js +28 -0
- package/dist/rpc-server/redact-cause.js.map +1 -0
- package/dist/rpc-server/redact.d.ts +3 -0
- package/dist/rpc-server/redact.d.ts.map +1 -0
- package/dist/rpc-server/redact.js +46 -0
- package/dist/rpc-server/redact.js.map +1 -0
- package/dist/rpc-server/sensitive.d.ts +5 -0
- package/dist/rpc-server/sensitive.d.ts.map +1 -0
- package/dist/rpc-server/sensitive.js +49 -0
- package/dist/rpc-server/sensitive.js.map +1 -0
- package/dist/rpc-server/session.d.ts +21 -0
- package/dist/rpc-server/session.d.ts.map +1 -0
- package/dist/rpc-server/session.js +28 -0
- package/dist/rpc-server/session.js.map +1 -0
- package/dist/rpc-server/tracing.d.ts +9 -0
- package/dist/rpc-server/tracing.d.ts.map +1 -0
- package/dist/rpc-server/tracing.js +32 -0
- package/dist/rpc-server/tracing.js.map +1 -0
- package/dist/rpc-server/transport.d.ts +4 -0
- package/dist/rpc-server/transport.d.ts.map +1 -0
- package/dist/rpc-server/transport.js +4 -0
- package/dist/rpc-server/transport.js.map +1 -0
- package/dist/rpc-server.d.ts +9 -0
- package/dist/rpc-server.d.ts.map +1 -0
- package/dist/rpc-server.js +9 -0
- package/dist/rpc-server.js.map +1 -0
- package/dist/rpc.d.ts +3 -0
- package/dist/rpc.d.ts.map +1 -0
- package/dist/rpc.js +3 -0
- package/dist/rpc.js.map +1 -0
- package/dist/runtime/make.d.ts +1 -1
- package/dist/runtime/make.d.ts.map +1 -1
- package/dist/runtime/make.js +10 -9
- package/dist/runtime/make.js.map +1 -1
- package/dist/runtime/types.d.ts.map +1 -1
- package/dist/runtime.d.ts +2 -2
- package/dist/testing/types.d.ts.map +1 -1
- package/dist/testing/vitest.d.ts +1 -1
- package/dist/testing/vitest.d.ts.map +1 -1
- package/dist/testing/vitest.js +7 -9
- package/dist/testing/vitest.js.map +1 -1
- package/dist/testing.d.ts +2 -2
- package/package.json +28 -8
- package/src/better-auth/adapter.ts +50 -190
- package/src/better-auth/relation.ts +21 -163
- package/src/better-auth/row-adapter.ts +78 -0
- package/src/better-auth/where.ts +118 -0
- package/src/better-auth.ts +1 -1
- package/src/errors/rejected-field.ts +13 -0
- package/src/errors/taxonomy.ts +18 -0
- package/src/errors.ts +2 -0
- package/src/node-http/subscription-signal.ts +10 -15
- package/src/node-http.ts +1 -1
- package/src/rpc/identity.ts +11 -0
- package/src/rpc/middleware.ts +15 -0
- package/src/rpc-server/adapters/better-auth-sessions.ts +22 -0
- package/src/rpc-server/origin.ts +29 -0
- package/src/rpc-server/redact-cause.ts +41 -0
- package/src/rpc-server/redact.ts +42 -0
- package/src/rpc-server/sensitive.ts +60 -0
- package/src/rpc-server/session.ts +54 -0
- package/src/rpc-server/tracing.ts +56 -0
- package/src/rpc-server/transport.ts +8 -0
- package/src/rpc-server.ts +15 -0
- package/src/rpc.ts +2 -0
- package/src/runtime/make.ts +20 -27
- package/src/runtime/types.ts +3 -12
- package/src/runtime.ts +2 -2
- package/src/testing/types.ts +7 -32
- package/src/testing/vitest.ts +59 -89
- package/src/testing.ts +2 -2
package/CHANGELOG.md
CHANGED
|
@@ -1,6 +1,30 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
-
##
|
|
3
|
+
## 0.4.1 - 2026-09-26
|
|
4
|
+
|
|
5
|
+
### Changed
|
|
6
|
+
|
|
7
|
+
- Pin the optional `better-auth` peer dependency to exactly 1.6.25, the version
|
|
8
|
+
the package is tested against, instead of `^1.6.25`.
|
|
9
|
+
|
|
10
|
+
## 0.4.0 - 2026-09-26
|
|
11
|
+
|
|
12
|
+
### Added
|
|
13
|
+
|
|
14
|
+
- `@shivaedev/platform/errors`: browser-safe Schema error classes shared by native
|
|
15
|
+
RPC contracts, effect-contract rejections and form field rejections.
|
|
16
|
+
- `@shivaedev/platform/rpc`: browser-safe request id and identity services plus
|
|
17
|
+
the `RequestTracing`, `Authenticated` and `MaybeAuthenticated` middleware tags.
|
|
18
|
+
- `@shivaedev/platform/rpc-server`: middleware layers for request ids, log and
|
|
19
|
+
span annotation, redacted failure logging, Better Auth sessions and an explicit
|
|
20
|
+
Origin policy. The Origin policy and session provider see only the transport
|
|
21
|
+
request's headers, not headers set inside RPC messages; `transportHeaders`
|
|
22
|
+
gives application middleware the same view.
|
|
23
|
+
|
|
24
|
+
### Changed
|
|
25
|
+
|
|
26
|
+
- Require Effect Prisma 0.6.4 and Effect tRPC 0.4.0, which adds declared
|
|
27
|
+
rejections to tRPC error data.
|
|
4
28
|
|
|
5
29
|
## 0.3.8 - 2026-09-26
|
|
6
30
|
|
package/README.md
CHANGED
|
@@ -7,8 +7,9 @@ database, transport, and test framework.
|
|
|
7
7
|
Generic Prisma and tRPC integrations remain available separately from
|
|
8
8
|
`@shivaedev/effect-prisma` and `@shivaedev/effect-trpc`.
|
|
9
9
|
|
|
10
|
-
`effect` is the only required peer
|
|
11
|
-
need nothing else. Install the optional peers for the
|
|
10
|
+
`effect` is the only required peer. The `runtime`, `node-http`, `errors`, `rpc`
|
|
11
|
+
and `rpc-server` entries need nothing else. Install the optional peers for the
|
|
12
|
+
entries that use them:
|
|
12
13
|
|
|
13
14
|
- `better-auth`: `better-auth` and `@shivaedev/effect-prisma`
|
|
14
15
|
- `testing`: `@shivaedev/effect-prisma`, `@shivaedev/effect-trpc`,
|
|
@@ -75,6 +76,44 @@ session policy, and authorization remain application configuration. Native
|
|
|
75
76
|
experimental Better Auth joins are not supported; the standard adapter join
|
|
76
77
|
fallback remains available.
|
|
77
78
|
|
|
79
|
+
## Errors and native RPC request context
|
|
80
|
+
|
|
81
|
+
`@shivaedev/platform/errors` exports browser-safe `Schema.TaggedError` classes:
|
|
82
|
+
`NotFound`, `Unauthorized`, `Forbidden`, `BadRequest` and `Conflict` (both with an
|
|
83
|
+
optional `field`), `PreconditionFailed` and `AuthUnavailable`. Use them as native
|
|
84
|
+
RPC error schemas or effect-contract rejections. `rejectedField(error)` extracts
|
|
85
|
+
`{ field, message }` from any field rejection so a form can show it.
|
|
86
|
+
|
|
87
|
+
`@shivaedev/platform/rpc` declares the `RequestTracing`, `Authenticated` and
|
|
88
|
+
`MaybeAuthenticated` middleware and the `RequestId`, `Identity` and
|
|
89
|
+
`OptionalIdentity` services they provide. It is browser-safe, so shared `RpcGroup`
|
|
90
|
+
declarations can use it. Implement the middleware on the server with
|
|
91
|
+
`@shivaedev/platform/rpc-server`:
|
|
92
|
+
|
|
93
|
+
```ts
|
|
94
|
+
import { Authenticated, RequestTracing } from "@shivaedev/platform/rpc"
|
|
95
|
+
import { authenticatedLayer, betterAuthSessions, requestTracingLayer, trustedOrigins } from "@shivaedev/platform/rpc-server"
|
|
96
|
+
|
|
97
|
+
const Api = RpcGroup.make(/* ... */).middleware(Authenticated).middleware(RequestTracing)
|
|
98
|
+
|
|
99
|
+
const Middleware = Layer.mergeAll(
|
|
100
|
+
requestTracingLayer(),
|
|
101
|
+
authenticatedLayer({
|
|
102
|
+
provider: betterAuthSessions((headers) => auth.api.getSession({ headers })),
|
|
103
|
+
origin: trustedOrigins({ allow: ["https://app.example"], missing: "reject" }),
|
|
104
|
+
}),
|
|
105
|
+
)
|
|
106
|
+
```
|
|
107
|
+
|
|
108
|
+
Each RPC gets its own request id and resolves its own session. The Origin check
|
|
109
|
+
and session lookup read the HTTP request's own headers, never header pairs a
|
|
110
|
+
client puts inside an RPC message. An outage of the
|
|
111
|
+
session provider fails with `AuthUnavailable`, never as a signed-out user.
|
|
112
|
+
Failures log once with a redacted payload. The Origin policy is a function the
|
|
113
|
+
application supplies; see the
|
|
114
|
+
[request context guide](../../docs/framework/request-context.md) for the
|
|
115
|
+
trade-offs between browsers and native clients.
|
|
116
|
+
|
|
78
117
|
## Testing
|
|
79
118
|
|
|
80
119
|
Configure the application database, tRPC caller, and test Layer once:
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
import type { AnyDatabase } from "@shivaedev/effect-prisma";
|
|
2
2
|
import type { DBAdapterInstance } from "better-auth";
|
|
3
|
-
import type { PlatformRuntime } from "../runtime/types.
|
|
3
|
+
import type { PlatformRuntime } from "../runtime/types.ts";
|
|
4
4
|
export interface EffectPrismaAdapterOptions {
|
|
5
5
|
readonly debugLogs?: boolean;
|
|
6
6
|
/** Map Better Auth model names to Prisma contract model names. */
|
|
7
7
|
readonly modelName?: (model: string) => string;
|
|
8
8
|
readonly usePlural?: boolean;
|
|
9
9
|
}
|
|
10
|
-
export declare
|
|
10
|
+
export declare function effectPrismaAdapter<Database extends AnyDatabase, Services, BuildError>(databaseTag: Database, runtime: PlatformRuntime<Services, BuildError>, adapterOptions?: EffectPrismaAdapterOptions): DBAdapterInstance;
|
|
11
11
|
//# sourceMappingURL=adapter.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"adapter.d.ts","sourceRoot":"","sources":["../../src/better-auth/adapter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,
|
|
1
|
+
{"version":3,"file":"adapter.d.ts","sourceRoot":"","sources":["../../src/better-auth/adapter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAC5D,OAAO,KAAK,EAAqB,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAGxE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAI3D,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;AAuBD,wBAAgB,mBAAmB,CAAC,QAAQ,SAAS,WAAW,EAAE,QAAQ,EAAE,UAAU,EACrF,WAAW,EAAE,QAAQ,EACrB,OAAO,EAAE,eAAe,CAAC,QAAQ,EAAE,UAAU,CAAC,EAC9C,cAAc,CAAC,EAAE,0BAA0B,GACzC,iBAAiB,CAAC"}
|
|
@@ -1,101 +1,45 @@
|
|
|
1
1
|
import { createAdapterFactory } from "better-auth/adapters";
|
|
2
|
-
import { Effect
|
|
2
|
+
import { Effect } from "effect";
|
|
3
3
|
import { refineRelation } from "./relation.js";
|
|
4
|
-
|
|
5
|
-
const
|
|
6
|
-
const
|
|
7
|
-
|
|
8
|
-
|
|
4
|
+
import { makeRowAdapter } from "./row-adapter.js";
|
|
5
|
+
const isFunction = (value, key) => ((typeof value === "object" && value !== null) || typeof value === "function") && typeof Reflect.get(value, key) === "function";
|
|
6
|
+
const isDynamicDatabase = (value) => isFunction(value, "transaction");
|
|
7
|
+
const isDynamicRelation = (value) => isFunction(value, "where") && isFunction(value, "select");
|
|
8
|
+
const modelRelation = (database, model) => {
|
|
9
|
+
const relation = Reflect.get(database, model);
|
|
10
|
+
if (!isDynamicRelation(relation)) {
|
|
11
|
+
throw new TypeError(`Unknown database model: ${model}`);
|
|
9
12
|
}
|
|
13
|
+
return relation;
|
|
10
14
|
};
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
return (await run((database) => refineRelation(modelRelation(database, model, mapModelName), {
|
|
36
|
-
select,
|
|
37
|
-
}).create(data)));
|
|
15
|
+
const defaultModelName = (model) => (model.length === 0 ? model : `${model[0]?.toUpperCase()}${model.slice(1)}`);
|
|
16
|
+
export function effectPrismaAdapter(databaseTag, runtime, adapterOptions = {}) {
|
|
17
|
+
return (authOptions) => {
|
|
18
|
+
const mapModelName = adapterOptions.modelName ?? defaultModelName;
|
|
19
|
+
const databaseEffect = Effect.flatMap(databaseTag, (database) => isDynamicDatabase(database) ? Effect.succeed(database) : Effect.die(new TypeError("The database service has no transaction")));
|
|
20
|
+
const run = (operation) => runtime.runPromise(Effect.flatMap(databaseEffect, operation));
|
|
21
|
+
const query = (model, refinement, use) => run((database) => use(refineRelation(modelRelation(database, mapModelName(model)), refinement)));
|
|
22
|
+
const inTransaction = (callback) => Effect.flatMap(Effect.context(), (services) => Effect.tryPromise({
|
|
23
|
+
try: () => runtime.runWithServices(services, callback),
|
|
24
|
+
catch: (error) => error,
|
|
25
|
+
}));
|
|
26
|
+
let factory;
|
|
27
|
+
factory = createAdapterFactory({
|
|
28
|
+
config: {
|
|
29
|
+
adapterId: "effect-prisma",
|
|
30
|
+
adapterName: "Effect Prisma",
|
|
31
|
+
debugLogs: adapterOptions.debugLogs ?? false,
|
|
32
|
+
supportsArrays: true,
|
|
33
|
+
supportsBooleans: true,
|
|
34
|
+
supportsDates: true,
|
|
35
|
+
supportsJSON: true,
|
|
36
|
+
supportsNumericIds: true,
|
|
37
|
+
supportsUUIDs: true,
|
|
38
|
+
transaction: (callback) => run((database) => database.transaction(inTransaction(() => callback(factory(authOptions))))),
|
|
38
39
|
},
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
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
|
-
};
|
|
40
|
+
adapter: makeRowAdapter(query, adapterOptions.usePlural ?? false),
|
|
41
|
+
});
|
|
42
|
+
return factory(authOptions);
|
|
43
|
+
};
|
|
44
|
+
}
|
|
101
45
|
//# sourceMappingURL=adapter.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"adapter.js","sourceRoot":"","sources":["../../src/better-auth/adapter.ts"],"names":[],"mappings":"AAEA,OAAO,
|
|
1
|
+
{"version":3,"file":"adapter.js","sourceRoot":"","sources":["../../src/better-auth/adapter.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,25 +1,6 @@
|
|
|
1
|
-
import { and } from "@shivaedev/effect-prisma";
|
|
2
|
-
import type { Where } from "better-auth";
|
|
3
1
|
import type { Effect, Option } from "effect";
|
|
4
|
-
type CleanedWhere
|
|
5
|
-
|
|
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> {
|
|
2
|
+
import { type CleanedWhere, type DynamicField, type Expression } from "./where.ts";
|
|
3
|
+
export interface DynamicRelation<Requirements> extends Effect.Effect<ReadonlyArray<Record<string, unknown>>, unknown, Requirements> {
|
|
23
4
|
where(predicate: (fields: Record<string, DynamicField>) => Expression): DynamicRelation<Requirements>;
|
|
24
5
|
orderBy(ordering: (fields: Record<string, DynamicField>) => unknown): DynamicRelation<Requirements>;
|
|
25
6
|
take(count: number): DynamicRelation<Requirements>;
|
|
@@ -34,14 +15,13 @@ export interface DynamicRelation<Requirements> {
|
|
|
34
15
|
deleteAll(): Effect.Effect<ReadonlyArray<Record<string, unknown>>, unknown, Requirements>;
|
|
35
16
|
}
|
|
36
17
|
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;
|
|
18
|
+
readonly where?: ReadonlyArray<CleanedWhere> | undefined;
|
|
19
|
+
readonly select?: ReadonlyArray<string> | undefined;
|
|
20
|
+
readonly limit?: number | undefined;
|
|
21
|
+
readonly offset?: number | undefined;
|
|
41
22
|
readonly sortBy?: {
|
|
42
23
|
readonly direction: "asc" | "desc";
|
|
43
24
|
readonly field: string;
|
|
44
|
-
};
|
|
25
|
+
} | undefined;
|
|
45
26
|
}) => DynamicRelation<Requirements>;
|
|
46
|
-
export {};
|
|
47
27
|
//# sourceMappingURL=relation.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"relation.d.ts","sourceRoot":"","sources":["../../src/better-auth/relation.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"relation.d.ts","sourceRoot":"","sources":["../../src/better-auth/relation.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,87 +1,5 @@
|
|
|
1
|
-
import { all
|
|
2
|
-
|
|
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
|
-
};
|
|
1
|
+
import { all } from "@shivaedev/effect-prisma";
|
|
2
|
+
import { whereExpression } from "./where.js";
|
|
85
3
|
export const refineRelation = (relation, options) => {
|
|
86
4
|
let refined = relation;
|
|
87
5
|
if (options.where !== undefined) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"relation.js","sourceRoot":"","sources":["../../src/better-auth/relation.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,
|
|
1
|
+
{"version":3,"file":"relation.js","sourceRoot":"","sources":["../../src/better-auth/relation.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,0BAA0B,CAAC;AAE/C,OAAO,EAAyD,eAAe,EAAE,MAAM,YAAY,CAAC;AAiBpG,MAAM,CAAC,MAAM,cAAc,GAAG,CAC7B,QAAuC,EACvC,OAWC,EAC+B,EAAE;IAClC,IAAI,OAAO,GAAG,QAAQ,CAAC;IACvB,IAAI,OAAO,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;QACjC,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,MAAM,EAAE,EAAE;YAClC,MAAM,UAAU,GAAG,eAAe,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC;YAChE,OAAO,UAAU,IAAI,GAAG,EAAE,CAAC;QAC5B,CAAC,CAAC,CAAC;IACJ,CAAC;IACD,IAAI,OAAO,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;QAClC,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE,EAAE;YACpC,MAAM,KAAK,GAAG,MAAM,CAAC,OAAO,CAAC,MAAM,EAAE,KAAK,IAAI,EAAE,CAAC,CAAC;YAClD,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;gBACzB,MAAM,IAAI,SAAS,CAAC,2BAA2B,OAAO,CAAC,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC;YACzE,CAAC;YACD,OAAO,OAAO,CAAC,MAAM,EAAE,SAAS,KAAK,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC;QAC1E,CAAC,CAAC,CAAC;IACJ,CAAC;IACD,IAAI,OAAO,CAAC,MAAM,KAAK,SAAS;QAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IACzE,IAAI,OAAO,CAAC,KAAK,KAAK,SAAS;QAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;IACvE,IAAI,OAAO,CAAC,MAAM,KAAK,SAAS,IAAI,OAAO,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC/D,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IAC7C,CAAC;IACD,OAAO,OAAO,CAAC;AAChB,CAAC,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { AdapterFactoryCustomizeAdapterCreator } from "better-auth/adapters";
|
|
2
|
+
import { Effect } from "effect";
|
|
3
|
+
import type { DynamicRelation, refineRelation } from "./relation.ts";
|
|
4
|
+
type Refinement = Parameters<typeof refineRelation>[1];
|
|
5
|
+
export type RelationQuery = <Value>(model: string, refinement: Refinement, use: (relation: DynamicRelation<unknown>) => Effect.Effect<Value, unknown, unknown>) => Promise<Value>;
|
|
6
|
+
export declare const makeRowAdapter: (query: RelationQuery, usePlural: boolean) => AdapterFactoryCustomizeAdapterCreator;
|
|
7
|
+
export {};
|
|
8
|
+
//# sourceMappingURL=row-adapter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"row-adapter.d.ts","sourceRoot":"","sources":["../../src/better-auth/row-adapter.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,qCAAqC,EAAiB,MAAM,sBAAsB,CAAC;AACjG,OAAO,EAAE,MAAM,EAAU,MAAM,QAAQ,CAAC;AACxC,OAAO,KAAK,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAOrE,KAAK,UAAU,GAAG,UAAU,CAAC,OAAO,cAAc,CAAC,CAAC,CAAC,CAAC,CAAC;AASvD,MAAM,MAAM,aAAa,GAAG,CAAC,KAAK,EACjC,KAAK,EAAE,MAAM,EACb,UAAU,EAAE,UAAU,EACtB,GAAG,EAAE,CAAC,QAAQ,EAAE,eAAe,CAAC,OAAO,CAAC,KAAK,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,CAAC,KAC/E,OAAO,CAAC,KAAK,CAAC,CAAC;AAgBpB,eAAO,MAAM,cAAc,GACzB,OAAO,aAAa,EAAE,WAAW,OAAO,KAAG,qCAqC3C,CAAC"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { Effect, Option } from "effect";
|
|
2
|
+
function rowTyped(adapter) {
|
|
3
|
+
return adapter;
|
|
4
|
+
}
|
|
5
|
+
const rejectJoin = (join) => {
|
|
6
|
+
if (join !== undefined) {
|
|
7
|
+
throw new TypeError("The Effect Prisma Better Auth adapter does not support experimental native joins");
|
|
8
|
+
}
|
|
9
|
+
};
|
|
10
|
+
const namesId = (condition) => condition.connector !== "OR" && condition.field === "id" && condition.operator === "eq";
|
|
11
|
+
export const makeRowAdapter = (query, usePlural) => ({ debugLog, getFieldAttributes }) => {
|
|
12
|
+
const isUnique = (model, condition) => condition.connector !== "OR" &&
|
|
13
|
+
condition.operator === "eq" &&
|
|
14
|
+
condition.mode !== "insensitive" &&
|
|
15
|
+
(condition.field === "id" || getFieldAttributes({ field: condition.field, model }).unique === true);
|
|
16
|
+
return rowTyped({
|
|
17
|
+
create: ({ data, model, select }) => {
|
|
18
|
+
debugLog("create", { model });
|
|
19
|
+
return query(model, { select }, (relation) => relation.create(data));
|
|
20
|
+
},
|
|
21
|
+
findOne: ({ join, model, select, where }) => {
|
|
22
|
+
rejectJoin(join);
|
|
23
|
+
return query(model, { select, where }, (relation) => Effect.map(relation.first(), Option.getOrNull));
|
|
24
|
+
},
|
|
25
|
+
findMany: ({ join, limit, model, offset, select, sortBy, where }) => {
|
|
26
|
+
rejectJoin(join);
|
|
27
|
+
return query(model, { limit, offset, select, sortBy, where }, (relation) => relation);
|
|
28
|
+
},
|
|
29
|
+
update: ({ model, update, where }) => {
|
|
30
|
+
if (where.length === 0)
|
|
31
|
+
return Promise.resolve(null);
|
|
32
|
+
const unique = where.some((condition) => isUnique(model, condition));
|
|
33
|
+
return query(model, { where }, (relation) => unique ? relation.update(update) : Effect.map(relation.updateAll(update), (rows) => rows[0] ?? null));
|
|
34
|
+
},
|
|
35
|
+
updateMany: ({ model, update, where }) => query(model, { where }, (relation) => Effect.map(relation.updateAll(update), (rows) => rows.length)),
|
|
36
|
+
delete: ({ model, where }) => {
|
|
37
|
+
const byId = where.some(namesId);
|
|
38
|
+
return query(model, { where }, (relation) => (byId ? Effect.asVoid(relation.delete()) : Effect.asVoid(relation.deleteAll())));
|
|
39
|
+
},
|
|
40
|
+
deleteMany: ({ model, where }) => query(model, { where }, (relation) => Effect.map(relation.deleteAll(), (rows) => rows.length)),
|
|
41
|
+
count: ({ model, where }) => query(model, { where }, (relation) => relation.count()),
|
|
42
|
+
options: { usePlural },
|
|
43
|
+
});
|
|
44
|
+
};
|
|
45
|
+
//# sourceMappingURL=row-adapter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"row-adapter.js","sourceRoot":"","sources":["../../src/better-auth/row-adapter.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { and } from "@shivaedev/effect-prisma";
|
|
2
|
+
import type { Where } from "better-auth";
|
|
3
|
+
export type CleanedWhere = Required<Where>;
|
|
4
|
+
export type Expression = Parameters<typeof and>[number];
|
|
5
|
+
export interface DynamicField {
|
|
6
|
+
eq(value: unknown): Expression;
|
|
7
|
+
neq(value: unknown): Expression;
|
|
8
|
+
gt(value: unknown): Expression;
|
|
9
|
+
gte(value: unknown): Expression;
|
|
10
|
+
lt(value: unknown): Expression;
|
|
11
|
+
lte(value: unknown): Expression;
|
|
12
|
+
in(value: ReadonlyArray<unknown>): Expression;
|
|
13
|
+
notIn(value: ReadonlyArray<unknown>): Expression;
|
|
14
|
+
like(value: string): Expression;
|
|
15
|
+
ilike?(value: string): Expression;
|
|
16
|
+
isNull(): Expression;
|
|
17
|
+
isNotNull(): Expression;
|
|
18
|
+
asc(): unknown;
|
|
19
|
+
desc(): unknown;
|
|
20
|
+
}
|
|
21
|
+
export declare const whereExpression: (fields: Record<string, DynamicField>, where: ReadonlyArray<CleanedWhere>) => Expression | undefined;
|
|
22
|
+
//# sourceMappingURL=where.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"where.d.ts","sourceRoot":"","sources":["../../src/better-auth/where.ts"],"names":[],"mappings":"AAAA,OAAO,EAAO,GAAG,EAAW,MAAM,0BAA0B,CAAC;AAC7D,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAEzC,MAAM,MAAM,YAAY,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;AAC3C,MAAM,MAAM,UAAU,GAAG,UAAU,CAAC,OAAO,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC;AAExD,MAAM,WAAW,YAAY;IAC5B,EAAE,CAAC,KAAK,EAAE,OAAO,GAAG,UAAU,CAAC;IAC/B,GAAG,CAAC,KAAK,EAAE,OAAO,GAAG,UAAU,CAAC;IAChC,EAAE,CAAC,KAAK,EAAE,OAAO,GAAG,UAAU,CAAC;IAC/B,GAAG,CAAC,KAAK,EAAE,OAAO,GAAG,UAAU,CAAC;IAChC,EAAE,CAAC,KAAK,EAAE,OAAO,GAAG,UAAU,CAAC;IAC/B,GAAG,CAAC,KAAK,EAAE,OAAO,GAAG,UAAU,CAAC;IAChC,EAAE,CAAC,KAAK,EAAE,aAAa,CAAC,OAAO,CAAC,GAAG,UAAU,CAAC;IAC9C,KAAK,CAAC,KAAK,EAAE,aAAa,CAAC,OAAO,CAAC,GAAG,UAAU,CAAC;IACjD,IAAI,CAAC,KAAK,EAAE,MAAM,GAAG,UAAU,CAAC;IAChC,KAAK,CAAC,CAAC,KAAK,EAAE,MAAM,GAAG,UAAU,CAAC;IAClC,MAAM,IAAI,UAAU,CAAC;IACrB,SAAS,IAAI,UAAU,CAAC;IACxB,GAAG,IAAI,OAAO,CAAC;IACf,IAAI,IAAI,OAAO,CAAC;CAChB;AA+ED,eAAO,MAAM,eAAe,GAAI,QAAQ,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,EAAE,OAAO,aAAa,CAAC,YAAY,CAAC,KAAG,UAAU,GAAG,SAiBvH,CAAC"}
|