@shivaedev/platform 0.5.2 → 0.6.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.
Files changed (214) hide show
  1. package/CHANGELOG.md +37 -0
  2. package/README.md +359 -106
  3. package/dist/errors/rejectedField.d.ts +7 -0
  4. package/dist/errors/rejectedField.d.ts.map +1 -0
  5. package/dist/errors/{rejected-field.js → rejectedField.js} +4 -2
  6. package/dist/errors/rejectedField.js.map +1 -0
  7. package/dist/errors/taxonomy.d.ts +10 -0
  8. package/dist/errors/taxonomy.d.ts.map +1 -1
  9. package/dist/errors/taxonomy.js +4 -0
  10. package/dist/errors/taxonomy.js.map +1 -1
  11. package/dist/rpc/identity.d.ts.map +1 -1
  12. package/dist/rpc/identity.js.map +1 -1
  13. package/dist/rpc/middleware.d.ts.map +1 -1
  14. package/dist/rpc/middleware.js.map +1 -1
  15. package/dist/server/appHost.d.ts +56 -0
  16. package/dist/server/appHost.d.ts.map +1 -0
  17. package/dist/server/appHost.js +55 -0
  18. package/dist/server/appHost.js.map +1 -0
  19. package/dist/server/better-auth/adapter.d.ts +10 -0
  20. package/dist/server/better-auth/adapter.d.ts.map +1 -0
  21. package/dist/{better-auth → server/better-auth}/adapter.js +26 -14
  22. package/dist/server/better-auth/adapter.js.map +1 -0
  23. package/dist/{better-auth → server/better-auth}/relation.d.ts +15 -15
  24. package/dist/server/better-auth/relation.d.ts.map +1 -0
  25. package/dist/{better-auth → server/better-auth}/relation.js +3 -3
  26. package/dist/server/better-auth/relation.js.map +1 -0
  27. package/dist/server/better-auth/rowAdapter.d.ts +8 -0
  28. package/dist/server/better-auth/rowAdapter.d.ts.map +1 -0
  29. package/dist/server/better-auth/rowAdapter.js +52 -0
  30. package/dist/server/better-auth/rowAdapter.js.map +1 -0
  31. package/dist/{better-auth → server/better-auth}/where.d.ts +2 -2
  32. package/dist/server/better-auth/where.d.ts.map +1 -0
  33. package/dist/{better-auth → server/better-auth}/where.js +23 -19
  34. package/dist/server/better-auth/where.js.map +1 -0
  35. package/dist/{node-http/subscription-signal.d.ts → server/node-http/subscriptionSignal.d.ts} +2 -2
  36. package/dist/server/node-http/subscriptionSignal.d.ts.map +1 -0
  37. package/dist/{node-http/subscription-signal.js → server/node-http/subscriptionSignal.js} +20 -13
  38. package/dist/server/node-http/subscriptionSignal.js.map +1 -0
  39. package/dist/server/rpc-server/adapters/betterAuthSessions.d.ts +4 -0
  40. package/dist/server/rpc-server/adapters/betterAuthSessions.d.ts.map +1 -0
  41. package/dist/server/rpc-server/adapters/betterAuthSessions.js +14 -0
  42. package/dist/server/rpc-server/adapters/betterAuthSessions.js.map +1 -0
  43. package/dist/server/rpc-server/boundary.d.ts +9 -0
  44. package/dist/server/rpc-server/boundary.d.ts.map +1 -0
  45. package/dist/server/rpc-server/boundary.js +18 -0
  46. package/dist/server/rpc-server/boundary.js.map +1 -0
  47. package/dist/server/rpc-server/local.d.ts +7 -0
  48. package/dist/server/rpc-server/local.d.ts.map +1 -0
  49. package/dist/server/rpc-server/local.js +66 -0
  50. package/dist/server/rpc-server/local.js.map +1 -0
  51. package/dist/{rpc-server → server/rpc-server}/origin.d.ts +2 -2
  52. package/dist/server/rpc-server/origin.d.ts.map +1 -0
  53. package/dist/server/rpc-server/origin.js +16 -0
  54. package/dist/server/rpc-server/origin.js.map +1 -0
  55. package/dist/server/rpc-server/redact.d.ts +3 -0
  56. package/dist/server/rpc-server/redact.d.ts.map +1 -0
  57. package/dist/{rpc-server → server/rpc-server}/redact.js +9 -7
  58. package/dist/server/rpc-server/redact.js.map +1 -0
  59. package/dist/server/rpc-server/redactCause.d.ts +6 -0
  60. package/dist/server/rpc-server/redactCause.d.ts.map +1 -0
  61. package/dist/server/rpc-server/redactCause.js +36 -0
  62. package/dist/server/rpc-server/redactCause.js.map +1 -0
  63. package/dist/server/rpc-server/sensitive.d.ts +5 -0
  64. package/dist/server/rpc-server/sensitive.d.ts.map +1 -0
  65. package/dist/{rpc-server → server/rpc-server}/sensitive.js +21 -17
  66. package/dist/server/rpc-server/sensitive.js.map +1 -0
  67. package/dist/server/rpc-server/session.d.ts +21 -0
  68. package/dist/server/rpc-server/session.d.ts.map +1 -0
  69. package/dist/server/rpc-server/session.js +37 -0
  70. package/dist/server/rpc-server/session.js.map +1 -0
  71. package/dist/{rpc-server → server/rpc-server}/tracing.d.ts +1 -1
  72. package/dist/server/rpc-server/tracing.d.ts.map +1 -0
  73. package/dist/server/rpc-server/tracing.js +42 -0
  74. package/dist/server/rpc-server/tracing.js.map +1 -0
  75. package/dist/server/rpc-server/transportHeaders.d.ts +4 -0
  76. package/dist/server/rpc-server/transportHeaders.d.ts.map +1 -0
  77. package/dist/server/rpc-server/transportHeaders.js +6 -0
  78. package/dist/server/rpc-server/transportHeaders.js.map +1 -0
  79. package/dist/server/runtime/makePlatform.d.ts +4 -0
  80. package/dist/server/runtime/makePlatform.d.ts.map +1 -0
  81. package/dist/{runtime/make.js → server/runtime/makePlatform.js} +10 -8
  82. package/dist/server/runtime/makePlatform.js.map +1 -0
  83. package/dist/server/runtime/types.d.ts +19 -0
  84. package/dist/server/runtime/types.d.ts.map +1 -0
  85. package/dist/{runtime → server/runtime}/types.js.map +1 -1
  86. package/dist/server/testing/makePlatformIt.d.ts +8 -0
  87. package/dist/server/testing/makePlatformIt.d.ts.map +1 -0
  88. package/dist/{testing/vitest.js → server/testing/makePlatformIt.js} +9 -5
  89. package/dist/server/testing/makePlatformIt.js.map +1 -0
  90. package/dist/server/testing/types.d.ts +28 -0
  91. package/dist/server/testing/types.d.ts.map +1 -0
  92. package/dist/{testing → server/testing}/types.js.map +1 -1
  93. package/docs/north-star.md +36 -0
  94. package/docs/roadmap.md +30 -0
  95. package/package.json +324 -54
  96. package/src/errors/{rejected-field.ts → rejectedField.ts} +3 -6
  97. package/src/errors/taxonomy.ts +2 -8
  98. package/src/rpc/identity.ts +0 -4
  99. package/src/rpc/middleware.ts +18 -9
  100. package/src/server/appHost.ts +134 -0
  101. package/src/{better-auth → server/better-auth}/adapter.ts +27 -31
  102. package/src/{better-auth → server/better-auth}/relation.ts +18 -20
  103. package/src/{better-auth/row-adapter.ts → server/better-auth/rowAdapter.ts} +19 -21
  104. package/src/{better-auth → server/better-auth}/where.ts +23 -33
  105. package/src/{node-http/subscription-signal.ts → server/node-http/subscriptionSignal.ts} +19 -22
  106. package/src/{rpc-server/adapters/better-auth-sessions.ts → server/rpc-server/adapters/betterAuthSessions.ts} +9 -10
  107. package/src/server/rpc-server/boundary.ts +26 -0
  108. package/src/server/rpc-server/local.ts +70 -0
  109. package/src/{rpc-server → server/rpc-server}/origin.ts +10 -13
  110. package/src/{rpc-server → server/rpc-server}/redact.ts +9 -11
  111. package/src/server/rpc-server/redactCause.ts +40 -0
  112. package/src/{rpc-server → server/rpc-server}/sensitive.ts +17 -22
  113. package/src/{rpc-server → server/rpc-server}/session.ts +22 -23
  114. package/src/{rpc-server → server/rpc-server}/tracing.ts +15 -18
  115. package/src/{rpc-server/transport.ts → server/rpc-server/transportHeaders.ts} +3 -3
  116. package/src/{runtime/make.ts → server/runtime/makePlatform.ts} +18 -26
  117. package/src/server/runtime/types.ts +24 -0
  118. package/src/server/testing/makePlatformIt.ts +76 -0
  119. package/src/server/testing/types.ts +38 -0
  120. package/dist/better-auth/adapter.d.ts +0 -10
  121. package/dist/better-auth/adapter.d.ts.map +0 -1
  122. package/dist/better-auth/adapter.js.map +0 -1
  123. package/dist/better-auth/relation.d.ts.map +0 -1
  124. package/dist/better-auth/relation.js.map +0 -1
  125. package/dist/better-auth/row-adapter.d.ts +0 -8
  126. package/dist/better-auth/row-adapter.d.ts.map +0 -1
  127. package/dist/better-auth/row-adapter.js +0 -46
  128. package/dist/better-auth/row-adapter.js.map +0 -1
  129. package/dist/better-auth/where.d.ts.map +0 -1
  130. package/dist/better-auth/where.js.map +0 -1
  131. package/dist/better-auth.d.ts +0 -2
  132. package/dist/better-auth.d.ts.map +0 -1
  133. package/dist/better-auth.js +0 -2
  134. package/dist/better-auth.js.map +0 -1
  135. package/dist/errors/rejected-field.d.ts +0 -7
  136. package/dist/errors/rejected-field.d.ts.map +0 -1
  137. package/dist/errors/rejected-field.js.map +0 -1
  138. package/dist/errors.d.ts +0 -3
  139. package/dist/errors.d.ts.map +0 -1
  140. package/dist/errors.js +0 -3
  141. package/dist/errors.js.map +0 -1
  142. package/dist/node-http/subscription-signal.d.ts.map +0 -1
  143. package/dist/node-http/subscription-signal.js.map +0 -1
  144. package/dist/node-http.d.ts +0 -2
  145. package/dist/node-http.d.ts.map +0 -1
  146. package/dist/node-http.js +0 -2
  147. package/dist/node-http.js.map +0 -1
  148. package/dist/rpc-server/adapters/better-auth-sessions.d.ts +0 -4
  149. package/dist/rpc-server/adapters/better-auth-sessions.d.ts.map +0 -1
  150. package/dist/rpc-server/adapters/better-auth-sessions.js +0 -11
  151. package/dist/rpc-server/adapters/better-auth-sessions.js.map +0 -1
  152. package/dist/rpc-server/origin.d.ts.map +0 -1
  153. package/dist/rpc-server/origin.js +0 -12
  154. package/dist/rpc-server/origin.js.map +0 -1
  155. package/dist/rpc-server/redact-cause.d.ts +0 -6
  156. package/dist/rpc-server/redact-cause.d.ts.map +0 -1
  157. package/dist/rpc-server/redact-cause.js +0 -28
  158. package/dist/rpc-server/redact-cause.js.map +0 -1
  159. package/dist/rpc-server/redact.d.ts +0 -3
  160. package/dist/rpc-server/redact.d.ts.map +0 -1
  161. package/dist/rpc-server/redact.js.map +0 -1
  162. package/dist/rpc-server/sensitive.d.ts +0 -5
  163. package/dist/rpc-server/sensitive.d.ts.map +0 -1
  164. package/dist/rpc-server/sensitive.js.map +0 -1
  165. package/dist/rpc-server/session.d.ts +0 -21
  166. package/dist/rpc-server/session.d.ts.map +0 -1
  167. package/dist/rpc-server/session.js +0 -31
  168. package/dist/rpc-server/session.js.map +0 -1
  169. package/dist/rpc-server/tracing.d.ts.map +0 -1
  170. package/dist/rpc-server/tracing.js +0 -34
  171. package/dist/rpc-server/tracing.js.map +0 -1
  172. package/dist/rpc-server/transport.d.ts +0 -4
  173. package/dist/rpc-server/transport.d.ts.map +0 -1
  174. package/dist/rpc-server/transport.js +0 -4
  175. package/dist/rpc-server/transport.js.map +0 -1
  176. package/dist/rpc-server.d.ts +0 -9
  177. package/dist/rpc-server.d.ts.map +0 -1
  178. package/dist/rpc-server.js +0 -9
  179. package/dist/rpc-server.js.map +0 -1
  180. package/dist/rpc.d.ts +0 -3
  181. package/dist/rpc.d.ts.map +0 -1
  182. package/dist/rpc.js +0 -3
  183. package/dist/rpc.js.map +0 -1
  184. package/dist/runtime/make.d.ts +0 -4
  185. package/dist/runtime/make.d.ts.map +0 -1
  186. package/dist/runtime/make.js.map +0 -1
  187. package/dist/runtime/types.d.ts +0 -19
  188. package/dist/runtime/types.d.ts.map +0 -1
  189. package/dist/runtime.d.ts +0 -3
  190. package/dist/runtime.d.ts.map +0 -1
  191. package/dist/runtime.js +0 -2
  192. package/dist/runtime.js.map +0 -1
  193. package/dist/testing/types.d.ts +0 -26
  194. package/dist/testing/types.d.ts.map +0 -1
  195. package/dist/testing/vitest.d.ts +0 -8
  196. package/dist/testing/vitest.d.ts.map +0 -1
  197. package/dist/testing/vitest.js.map +0 -1
  198. package/dist/testing.d.ts +0 -3
  199. package/dist/testing.d.ts.map +0 -1
  200. package/dist/testing.js +0 -2
  201. package/dist/testing.js.map +0 -1
  202. package/src/better-auth.ts +0 -4
  203. package/src/errors.ts +0 -2
  204. package/src/node-http.ts +0 -5
  205. package/src/rpc-server/redact-cause.ts +0 -41
  206. package/src/rpc-server.ts +0 -15
  207. package/src/rpc.ts +0 -2
  208. package/src/runtime/types.ts +0 -24
  209. package/src/runtime.ts +0 -7
  210. package/src/testing/types.ts +0 -41
  211. package/src/testing/vitest.ts +0 -69
  212. package/src/testing.ts +0 -8
  213. /package/dist/{runtime → server/runtime}/types.js +0 -0
  214. /package/dist/{testing → server/testing}/types.js +0 -0
@@ -0,0 +1,4 @@
1
+ import type { Layer } from "effect";
2
+ import type { PlatformRuntime, PlatformRuntimeOptions } from "./types.ts";
3
+ export declare function makePlatformRuntime<TServices, TBuildError>(layer: Layer.Layer<TServices, TBuildError>, options?: PlatformRuntimeOptions): PlatformRuntime<TServices, TBuildError>;
4
+ //# sourceMappingURL=makePlatform.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"makePlatform.d.ts","sourceRoot":"","sources":["../../../src/server/runtime/makePlatform.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,QAAQ,CAAC;AAEpC,OAAO,KAAK,EAAE,eAAe,EAAE,sBAAsB,EAAE,MAAM,YAAY,CAAC;AA+C1E,wBAAgB,mBAAmB,CAAC,SAAS,EAAE,WAAW,EACzD,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC,SAAS,EAAE,WAAW,CAAC,EAC1C,OAAO,GAAE,sBAA2B,GAClC,eAAe,CAAC,SAAS,EAAE,WAAW,CAAC,CAqBzC"}
@@ -7,16 +7,18 @@ Reflect.set(globalThis, RuntimeCacheKey, runtimeCache);
7
7
  function cachedEntry(runtime) {
8
8
  return runtime;
9
9
  }
10
- const make = (layer) => {
10
+ function make(layer) {
11
11
  const managed = ManagedRuntime.make(layer);
12
12
  const services = new AsyncLocalStorage();
13
- const currentServices = () => services.getStore();
14
- const withAmbient = (effect) => {
13
+ function currentServices() {
14
+ return services.getStore();
15
+ }
16
+ function withAmbient(effect) {
15
17
  const ambient = currentServices();
16
18
  return ambient === undefined
17
19
  ? effect
18
20
  : Effect.flatMap(managed.contextEffect, (base) => Effect.provideContext(effect, Context.merge(base, ambient)));
19
- };
21
+ }
20
22
  const runPromiseExit = (effect, options) => managed.runPromiseExit(withAmbient(effect), options);
21
23
  const runtime = {
22
24
  contextEffect: Effect.map(managed.contextEffect, (base) => {
@@ -36,9 +38,9 @@ const make = (layer) => {
36
38
  runWithServices: (context, evaluate) => services.run(context, evaluate),
37
39
  };
38
40
  return runtime;
39
- };
41
+ }
40
42
  const production = Effect.map(Effect.orDie(Config.string("NODE_ENV").pipe(Config.withDefault(""))), (environment) => environment === "production");
41
- export const makePlatformRuntime = (layer, options = {}) => {
43
+ export function makePlatformRuntime(layer, options = {}) {
42
44
  const key = Effect.runSync(production) ? undefined : options.developmentCacheKey;
43
45
  if (key === undefined) {
44
46
  return make(layer);
@@ -59,5 +61,5 @@ export const makePlatformRuntime = (layer, options = {}) => {
59
61
  };
60
62
  runtimeCache.set(key, cachedRuntime);
61
63
  return cachedRuntime;
62
- };
63
- //# sourceMappingURL=make.js.map
64
+ }
65
+ //# sourceMappingURL=makePlatform.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"makePlatform.js","sourceRoot":"","sources":["../../../src/server/runtime/makePlatform.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ import type { Context, Effect, Exit } from "effect";
2
+ export interface PlatformRuntimeOptions {
3
+ readonly developmentCacheKey?: string | symbol;
4
+ }
5
+ export interface PlatformRuntime<TServices, TBuildError> {
6
+ readonly contextEffect: Effect.Effect<Context.Context<TServices>, TBuildError>;
7
+ readonly currentServices: () => Context.Context<never> | undefined;
8
+ readonly dispose: () => Promise<void>;
9
+ readonly runPromise: <A, E, TRequirements extends TServices>(effect: Effect.Effect<A, E, TRequirements>, options?: {
10
+ readonly signal?: AbortSignal;
11
+ }) => Promise<A>;
12
+ readonly runPromiseExit: <A, E, TRequirements extends TServices>(effect: Effect.Effect<A, E, TRequirements>, options?: {
13
+ readonly signal?: AbortSignal;
14
+ }) => Promise<Exit.Exit<A, E | TBuildError>>;
15
+ readonly runWithServices: <TProvided, TValue>(services: Context.Context<TProvided>, evaluate: () => TValue) => TValue;
16
+ }
17
+ export type PlatformRuntimeServices<TRuntime> = TRuntime extends PlatformRuntime<infer TServices, infer _TBuildError> ? TServices : never;
18
+ export type PlatformRuntimeBuildError<TRuntime> = TRuntime extends PlatformRuntime<infer _TServices, infer TBuildError> ? TBuildError : never;
19
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/server/runtime/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AACpD,MAAM,WAAW,sBAAsB;IACtC,QAAQ,CAAC,mBAAmB,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;CAC/C;AACD,MAAM,WAAW,eAAe,CAAC,SAAS,EAAE,WAAW;IACtD,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,WAAW,CAAC,CAAC;IAC/E,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,aAAa,SAAS,SAAS,EAC1D,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,aAAa,CAAC,EAC1C,OAAO,CAAC,EAAE;QACT,QAAQ,CAAC,MAAM,CAAC,EAAE,WAAW,CAAC;KAC9B,KACG,OAAO,CAAC,CAAC,CAAC,CAAC;IAChB,QAAQ,CAAC,cAAc,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,aAAa,SAAS,SAAS,EAC9D,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,aAAa,CAAC,EAC1C,OAAO,CAAC,EAAE;QACT,QAAQ,CAAC,MAAM,CAAC,EAAE,WAAW,CAAC;KAC9B,KACG,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,GAAG,WAAW,CAAC,CAAC,CAAC;IAC5C,QAAQ,CAAC,eAAe,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,QAAQ,EAAE,MAAM,MAAM,KAAK,MAAM,CAAC;CACtH;AACD,MAAM,MAAM,uBAAuB,CAAC,QAAQ,IAAI,QAAQ,SAAS,eAAe,CAAC,MAAM,SAAS,EAAE,MAAM,YAAY,CAAC,GAAG,SAAS,GAAG,KAAK,CAAC;AAC1I,MAAM,MAAM,yBAAyB,CAAC,QAAQ,IAAI,QAAQ,SAAS,eAAe,CAAC,MAAM,UAAU,EAAE,MAAM,WAAW,CAAC,GAAG,WAAW,GAAG,KAAK,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/runtime/types.ts"],"names":[],"mappings":""}
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/server/runtime/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,8 @@
1
+ import { Effect, type Layer } from "effect";
2
+ import type { AnyDatabase } from "@shivaedev/effect-prisma/databaseTypes.ts";
3
+ import type { CallerOptions, CallerResult } from "@shivaedev/effect-trpc/testing/types.ts";
4
+ import type { MakePlatformItOptions, PlatformHarness, PlatformIt } from "./types.ts";
5
+ export declare function makePlatformIt<const TDatabase extends AnyDatabase>(database: TDatabase): <TCreateCaller extends (...arguments_: never[]) => object, TProvided, TLayerError, TExtension extends object = Record<never, never>>(options: MakePlatformItOptions<TDatabase, TCreateCaller, TProvided, TLayerError, TExtension> & {
6
+ readonly layer: Layer.Layer<TProvided | Effect.Services<TDatabase>, TLayerError>;
7
+ }) => PlatformIt<PlatformHarness<TDatabase, CallerOptions<TCreateCaller>, CallerResult<TCreateCaller>, TExtension>, TProvided | Effect.Services<TDatabase>>;
8
+ //# sourceMappingURL=makePlatformIt.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"makePlatformIt.d.ts","sourceRoot":"","sources":["../../../src/server/testing/makePlatformIt.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,KAAK,KAAK,EAAE,MAAM,QAAQ,CAAC;AAC5C,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,2CAA2C,CAAC;AAI7E,OAAO,KAAK,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,yCAAyC,CAAC;AAG3F,OAAO,KAAK,EAAE,qBAAqB,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAyDrF,wBAAgB,cAAc,CAAC,KAAK,CAAC,SAAS,SAAS,WAAW,EAAE,QAAQ,EAAE,SAAS,IAC9E,aAAa,SAAS,CAAC,GAAG,UAAU,EAAE,KAAK,EAAE,KAAK,MAAM,EAAE,SAAS,EAAE,WAAW,EAAE,UAAU,SAAS,MAAM,GAAG,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC,WAChI,qBAAqB,CAAC,SAAS,EAAE,aAAa,EAAE,SAAS,EAAE,WAAW,EAAE,UAAU,CAAC,GAAG;IAC9F,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC,SAAS,GAAG,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,WAAW,CAAC,CAAC;CACjF,KACC,UAAU,CACZ,eAAe,CAAC,SAAS,EAAE,aAAa,CAAC,aAAa,CAAC,EAAE,YAAY,CAAC,aAAa,CAAC,EAAE,UAAU,CAAC,EACjG,SAAS,GAAG,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAC,CACtC,CACD"}
@@ -1,6 +1,6 @@
1
1
  import { Effect } from "effect";
2
- import { withTestTransaction } from "@shivaedev/effect-prisma/testing";
3
- import { makeTrpcHarnessIt } from "@shivaedev/effect-trpc/testing";
2
+ import { withTestTransaction } from "@shivaedev/effect-prisma/testing/transaction.ts";
3
+ import { makeTrpcHarnessIt } from "@shivaedev/effect-trpc/testing/vitest.ts";
4
4
  function platformIt(database, options) {
5
5
  const trpcIt = makeTrpcHarnessIt({
6
6
  adapter: options.adapter,
@@ -11,7 +11,9 @@ function platformIt(database, options) {
11
11
  const services = yield* Effect.context();
12
12
  const db = yield* database;
13
13
  const extension = options.extend ? yield* options.extend({ db, trpc }, context) : {};
14
- const promise = (evaluate) => Effect.tryPromise(() => options.adapter.runWithServices(services, evaluate));
14
+ function promise(evaluate) {
15
+ return Effect.tryPromise(() => options.adapter.runWithServices(services, evaluate));
16
+ }
15
17
  return { ...extension, db, promise, trpc };
16
18
  }),
17
19
  });
@@ -24,5 +26,7 @@ function platformIt(database, options) {
24
26
  },
25
27
  });
26
28
  }
27
- export const makePlatformIt = (database) => (options) => platformIt(database, options);
28
- //# sourceMappingURL=vitest.js.map
29
+ export function makePlatformIt(database) {
30
+ return (options) => platformIt(database, options);
31
+ }
32
+ //# sourceMappingURL=makePlatformIt.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"makePlatformIt.js","sourceRoot":"","sources":["../../../src/server/testing/makePlatformIt.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAc,MAAM,QAAQ,CAAC;AAE5C,OAAO,EAAE,mBAAmB,EAAE,MAAM,iDAAiD,CAAC;AAItF,OAAO,EAAE,iBAAiB,EAAE,MAAM,0CAA0C,CAAC;AAiC7E,SAAS,UAAU,CAAC,QAAqB,EAAE,OAAqB;IAC/D,MAAM,MAAM,GAAG,iBAAiB,CAAC;QAChC,OAAO,EAAE,OAAO,CAAC,OAAO;QACxB,MAAM,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,mBAAmB,CAAC,QAAQ,EAAE,MAAM,CAAC;QACzD,YAAY,EAAE,OAAO,CAAC,YAAY;QAClC,KAAK,EAAE,OAAO,CAAC,KAAK;QACpB,WAAW,EAAE,CAAC,IAAI,EAAE,OAAO,EAAE,EAAE,CAC9B,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;YACnB,MAAM,QAAQ,GAAG,KAAK,CAAC,CAAC,MAAM,CAAC,OAAO,EAAW,CAAC;YAClD,MAAM,EAAE,GAAG,KAAK,CAAC,CAAC,QAAQ,CAAC;YAC3B,MAAM,SAAS,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;YACrF,SAAS,OAAO,CAAS,QAA+B;gBACvD,OAAO,MAAM,CAAC,UAAU,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,eAAe,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC,CAAC;YACrF,CAAC;YACD,OAAO,EAAE,GAAG,SAAS,EAAE,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;QAC5C,CAAC,CAAC;KACH,CAAC,CAAC;IACH,OAAO,IAAI,KAAK,CAAC,MAAM,EAAE;QACxB,GAAG,CAAC,MAAM,EAAE,QAAQ,EAAE,QAAQ;YAC7B,IAAI,QAAQ,KAAK,WAAW,EAAE,CAAC;gBAC9B,OAAO,MAAM,CAAC,UAAU,CAAC;YAC1B,CAAC;YACD,OAAO,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC;QAChD,CAAC;KACD,CAAC,CAAC;AACJ,CAAC;AACD,MAAM,UAAU,cAAc,CAAsC,QAAmB;IACtF,OAAO,CACN,OAEC,EAIA,EAAE,CAAC,UAAU,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;AACpC,CAAC"}
@@ -0,0 +1,28 @@
1
+ import type { TestContext, Vitest } from "@effect/vitest";
2
+ import type { Effect, Layer } from "effect";
3
+ import type { AnyDatabase } from "@shivaedev/effect-prisma/databaseTypes.ts";
4
+ import type { DatabaseService } from "@shivaedev/effect-prisma/testing/types.ts";
5
+ import type { EffectTRPCAdapter } from "@shivaedev/effect-trpc/adapter.ts";
6
+ import type { EffectCallerFactory } from "@shivaedev/effect-trpc/testing/caller.ts";
7
+ import type { CallerOptions, CallerResult, TrpcHarnessTest, TrpcHarnessTester } from "@shivaedev/effect-trpc/testing/types.ts";
8
+ export type PlatformHarness<TDatabase extends AnyDatabase, TOptions, TCaller, TExtension> = Readonly<{
9
+ db: DatabaseService<TDatabase>;
10
+ trpc: EffectCallerFactory<TOptions, TCaller>;
11
+ }> & Readonly<{
12
+ promise: <TValue>(evaluate: () => Promise<TValue>) => Effect.Effect<TValue, unknown>;
13
+ }> & Omit<TExtension, "db" | "promise" | "trpc">;
14
+ export type PlatformTest<THarness, TProvided> = TrpcHarnessTest<THarness, TProvided>;
15
+ export type PlatformTester<THarness, TProvided> = TrpcHarnessTester<THarness, TProvided>;
16
+ export type PlatformIt<THarness, TProvided> = Vitest.Methods & {
17
+ readonly effectApp: PlatformTester<THarness, TProvided>;
18
+ };
19
+ export interface MakePlatformItOptions<TDatabase extends AnyDatabase, TCreateCaller extends (...arguments_: never[]) => object, TProvided, TLayerError, TExtension> {
20
+ readonly adapter: Pick<EffectTRPCAdapter<never>, "runWithServices">;
21
+ readonly createCaller: TCreateCaller;
22
+ readonly extend?: (base: Readonly<{
23
+ db: DatabaseService<TDatabase>;
24
+ trpc: EffectCallerFactory<CallerOptions<NoInfer<TCreateCaller>>, CallerResult<NoInfer<TCreateCaller>>>;
25
+ }>, context: TestContext) => Effect.Effect<TExtension, unknown, TProvided | Effect.Services<TDatabase>>;
26
+ readonly layer: Layer.Layer<TProvided, TLayerError>;
27
+ }
28
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/server/testing/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AAC1D,OAAO,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,QAAQ,CAAC;AAC5C,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,2CAA2C,CAAC;AAC7E,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,mCAAmC,CAAC;AAC3E,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,0CAA0C,CAAC;AACpF,OAAO,KAAK,EAAE,aAAa,EAAE,YAAY,EAAE,eAAe,EAAE,iBAAiB,EAAE,MAAM,yCAAyC,CAAC;AAC/H,MAAM,MAAM,eAAe,CAAC,SAAS,SAAS,WAAW,EAAE,QAAQ,EAAE,OAAO,EAAE,UAAU,IAAI,QAAQ,CAAC;IACpG,EAAE,EAAE,eAAe,CAAC,SAAS,CAAC,CAAC;IAC/B,IAAI,EAAE,mBAAmB,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;CAC7C,CAAC,GACD,QAAQ,CAAC;IACR,OAAO,EAAE,CAAC,MAAM,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC,MAAM,CAAC,KAAK,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACrF,CAAC,GACF,IAAI,CAAC,UAAU,EAAE,IAAI,GAAG,SAAS,GAAG,MAAM,CAAC,CAAC;AAC7C,MAAM,MAAM,YAAY,CAAC,QAAQ,EAAE,SAAS,IAAI,eAAe,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;AACrF,MAAM,MAAM,cAAc,CAAC,QAAQ,EAAE,SAAS,IAAI,iBAAiB,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;AACzF,MAAM,MAAM,UAAU,CAAC,QAAQ,EAAE,SAAS,IAAI,MAAM,CAAC,OAAO,GAAG;IAC9D,QAAQ,CAAC,SAAS,EAAE,cAAc,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;CACxD,CAAC;AACF,MAAM,WAAW,qBAAqB,CACrC,SAAS,SAAS,WAAW,EAC7B,aAAa,SAAS,CAAC,GAAG,UAAU,EAAE,KAAK,EAAE,KAAK,MAAM,EACxD,SAAS,EACT,WAAW,EACX,UAAU;IAEV,QAAQ,CAAC,OAAO,EAAE,IAAI,CAAC,iBAAiB,CAAC,KAAK,CAAC,EAAE,iBAAiB,CAAC,CAAC;IACpE,QAAQ,CAAC,YAAY,EAAE,aAAa,CAAC;IACrC,QAAQ,CAAC,MAAM,CAAC,EAAE,CACjB,IAAI,EAAE,QAAQ,CAAC;QACd,EAAE,EAAE,eAAe,CAAC,SAAS,CAAC,CAAC;QAC/B,IAAI,EAAE,mBAAmB,CAAC,aAAa,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC,EAAE,YAAY,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC;KACvG,CAAC,EACF,OAAO,EAAE,WAAW,KAChB,MAAM,CAAC,MAAM,CAAC,UAAU,EAAE,OAAO,EAAE,SAAS,GAAG,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC;IAChF,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC;CACpD"}
@@ -1 +1 @@
1
- {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/testing/types.ts"],"names":[],"mappings":""}
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/server/testing/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,36 @@
1
+ # North star
2
+
3
+ ## The problem
4
+
5
+ A service can express its work clearly in Effect and still lose that clarity at its boundary. An HTTP request arrives with cookies and headers; native RPC supplies middleware arguments; an authentication provider returns a Promise; a database transaction replaces a service for one invocation; and a test must reach all of them together. Rebuilding that glue in each application gives the same concepts different names and leaves room for differences that matter: credentials taken from an RPC message, a shared Layer holding one user's identity, an outage mistaken for a missing session, or a Promise call escaping the test's transaction.
6
+
7
+ Callers also need a common language for expected failures. A field rejection should arrive with its field and message, while a defect should remain a defect and diagnostics should not expose its credentials. Neither concern belongs in each feature's business logic.
8
+
9
+ ## The ideal
10
+
11
+ An application declares errors and native RPC middleware in modules its browser can import. The server supplies a session provider and an explicit Origin policy, and a handler reads a small request-local identity service. It then makes its own resource-authorization decision. The same request id identifies the invocation in its handler, logs and span.
12
+
13
+ A Promise boundary uses the application's runtime and its invocation's services. A long-lived Node response has one cancellation signal and an explicit cleanup function. An application using Better Auth with Effect Prisma can store its auth rows through that runtime. An application using Prisma and tRPC can set up its test composition once and write feature tests against the caller and database in one rollback transaction.
14
+
15
+ These are separate entry modules. The core request/error/runtime work should require Effect alone. Optional storage and test composition should load their own peers only when selected.
16
+
17
+ ## Which trade-offs win
18
+
19
+ 1. **Native Effect semantics.** Typed failures, invocation-local services, interruption and transaction scope matter more than a short integration example. A convenience must not hide a boundary that its caller needs to reason about.
20
+ 2. **An explicit source of trust.** HTTP authentication and Origin decisions use transport headers, not values an RPC message can override. The request id is correlation data a caller may choose; it must not become an authorization credential. A provider outage must remain distinct from an anonymous caller.
21
+ 3. **One owner for each job.** Platform supplies shared request services and the glue across boundaries. Native repositories belong to effect-sql, declarations to effect-contract, services to effect-service and generic test execution to effect-test. The optional adapters compose effect-prisma and effect-trpc rather than implementing them again.
22
+ 4. **Useful evidence and diagnostics.** Describe the composition a test actually runs. A bounded redactor can reduce common credential leaks; it cannot decide every application's sensitive fields or justify putting secrets in messages. Keep application-specific data policy explicit.
23
+ 5. **Small conveniences.** A provider function, a Layer and a defining-module import are preferable to a second configuration language or application container. Add a helper when it removes repeated work while leaving the native pieces visible.
24
+
25
+ ## What the package deliberately leaves out
26
+
27
+ - Authentication-provider selection, OAuth configuration, cookies, session lifetimes and client refresh policy.
28
+ - Resource ownership and role checks. An authenticated user id is input to authorization, not permission to access every resource.
29
+ - Application transports, CORS configuration, subscription limits, event buses and deployment policy.
30
+ - A native SQL auth storage choice. Session resolution can use a provider without making its storage part of the application's repository model.
31
+ - A second service container, RPC framework, persistence model or generic test runner.
32
+ - Guarantees about SSR isolation, mobile cookie persistence or a particular Node/Bun host inferred from local fixtures.
33
+
34
+ ## Where planning belongs
35
+
36
+ [The package roadmap](roadmap.md) owns changes to these modules, their evidence and the maintainer's scope decisions. [The framework roadmap](https://github.com/ShivaeDev/platform/blob/main/docs/framework/roadmap.md) owns composed fixtures, application adoption and deployment validation across packages.
@@ -0,0 +1,30 @@
1
+ # Roadmap
2
+
3
+ This file owns Platform's module implementation, package tests and scope questions. The [framework roadmap](https://github.com/ShivaeDev/platform/blob/main/docs/framework/roadmap.md) owns cross-package fixtures, application adoption and browser, mobile and deployment validation.
4
+
5
+ ## Built
6
+
7
+ - [x] `localRpcGuard` rejects unknown or non-loopback transport addresses before calling the handler and accepts known IPv4, IPv6 and mapped loopback addresses. [Injected-request evidence](https://github.com/ShivaeDev/platform/blob/main/packages/platform/src/server/rpc-server/local.test.ts); this is separate from deployed host or proxy validation.
8
+ - [x] `rpcBoundary` passes declared errors and successes through, normalizes unexpected failures and defects to a declared rejection with a redacted public message, retains the original cause off the wire, and preserves interruption, including mixed failure/cancellation causes. [Boundary evidence](https://github.com/ShivaeDev/platform/blob/main/packages/platform/src/server/rpc-server/boundary.test.ts).
9
+ - [x] Shared Schema tagged errors and field-rejection extraction, with native RPC JSON and tRPC rejection tests.
10
+ - [x] Browser-safe native RPC middleware declarations and request-id, identity and optional-identity services, with compile-time checks on guarded handlers.
11
+ - [x] Request-local session middleware, a Better Auth session-provider boundary and an explicit Origin policy. Tests cover concurrent identities, anonymous callers, provider failures and rejection before provider lookup.
12
+ - [x] HTTP transport-header authentication and a WebSocket protocol fixture that uses upgrade-request headers instead of RPC message credentials.
13
+ - [x] Request-id log/span annotations and redaction of failure payloads, defects, reported causes and credential-shaped strings, with bounded collection and string output.
14
+ - [x] An application runtime that acquires its Layer once, shares an explicit development cache key and carries service overrides across Promise calls.
15
+ - [x] Node subscription cancellation from Web/procedure signals and simulated request/socket close events, with listener cleanup.
16
+ - [x] A Better Auth Effect Prisma database adapter and Prisma/tRPC rollback harness. Real PostgreSQL tests cover shared transactions, failed transaction rollback, selected row operations and harness types; they require `PLATFORM_EFFECT_PRISMA_TEST_DATABASE_URL`.
17
+ - [x] Packed-consumer checks for defining-module imports, types and core entries installed without optional peers.
18
+ - [x] A local app host Layer and reusable database Layer, extracted from the PostgreSQL composition: migrations before services, guarded NDJSON RPC, session policy, static assets, scoped shutdown and commit-bound live delivery. The composed fixture covers two HTTP server processes and a worker.
19
+
20
+ ## Next
21
+
22
+ - [ ] Add focused runtime tests for production cache bypass, disposal and recreation, build failures, exit results and cancellation before documenting stronger lifecycle guarantees.
23
+ - [ ] Extend adapter tests to the remaining public options and filter, selection, ordering and pagination paths. Add a regression test for the rejection of experimental native joins.
24
+ - [ ] Exercise the no-HTTP-request `transportHeaders` fallback directly and the tracing boundary's successful and interrupted paths.
25
+
26
+ ## Open questions
27
+
28
+ - Should the package keep the optional Better Auth storage adapter and Prisma/tRPC harness beside its native request-context modules, or should those compositions live with the integration packages? Both serve real boundary work, but they give this package a wider surface than its request-identity job alone.
29
+ - If an application needs Better Auth storage on native Effect SQL, should Platform own that adapter or should the provider retain separate storage? The request middleware needs a session provider, not a particular database.
30
+ - The exports make Better Auth translation helpers importable beside the adapter. Are these helpers intended as supported consumer APIs, or should a future public API change narrow the surface to the adapter?