@shivaedev/platform 0.4.3 → 0.5.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 (115) hide show
  1. package/CHANGELOG.md +27 -0
  2. package/dist/better-auth/adapter.d.ts +2 -3
  3. package/dist/better-auth/adapter.d.ts.map +1 -1
  4. package/dist/better-auth/adapter.js +2 -2
  5. package/dist/better-auth/adapter.js.map +1 -1
  6. package/dist/better-auth/relation.d.ts +15 -15
  7. package/dist/better-auth/relation.d.ts.map +1 -1
  8. package/dist/better-auth/relation.js +4 -2
  9. package/dist/better-auth/relation.js.map +1 -1
  10. package/dist/better-auth/row-adapter.d.ts.map +1 -1
  11. package/dist/better-auth/row-adapter.js +16 -15
  12. package/dist/better-auth/row-adapter.js.map +1 -1
  13. package/dist/better-auth/where.d.ts +16 -16
  14. package/dist/better-auth/where.d.ts.map +1 -1
  15. package/dist/better-auth/where.js +16 -8
  16. package/dist/better-auth/where.js.map +1 -1
  17. package/dist/better-auth.d.ts +1 -1
  18. package/dist/better-auth.d.ts.map +1 -1
  19. package/dist/better-auth.js +1 -1
  20. package/dist/better-auth.js.map +1 -1
  21. package/dist/errors/taxonomy.d.ts +2 -2
  22. package/dist/errors/taxonomy.js +1 -1
  23. package/dist/errors/taxonomy.js.map +1 -1
  24. package/dist/errors.d.ts +2 -2
  25. package/dist/errors.d.ts.map +1 -1
  26. package/dist/errors.js +2 -2
  27. package/dist/errors.js.map +1 -1
  28. package/dist/node-http/subscription-signal.d.ts +1 -11
  29. package/dist/node-http/subscription-signal.d.ts.map +1 -1
  30. package/dist/node-http/subscription-signal.js +11 -10
  31. package/dist/node-http/subscription-signal.js.map +1 -1
  32. package/dist/node-http.d.ts +1 -1
  33. package/dist/node-http.d.ts.map +1 -1
  34. package/dist/node-http.js +1 -1
  35. package/dist/node-http.js.map +1 -1
  36. package/dist/rpc/middleware.d.ts +1 -1
  37. package/dist/rpc/middleware.d.ts.map +1 -1
  38. package/dist/rpc/middleware.js +1 -1
  39. package/dist/rpc/middleware.js.map +1 -1
  40. package/dist/rpc-server/adapters/better-auth-sessions.d.ts +1 -1
  41. package/dist/rpc-server/adapters/better-auth-sessions.d.ts.map +1 -1
  42. package/dist/rpc-server/adapters/better-auth-sessions.js +2 -2
  43. package/dist/rpc-server/adapters/better-auth-sessions.js.map +1 -1
  44. package/dist/rpc-server/origin.d.ts +2 -2
  45. package/dist/rpc-server/origin.d.ts.map +1 -1
  46. package/dist/rpc-server/origin.js +1 -1
  47. package/dist/rpc-server/origin.js.map +1 -1
  48. package/dist/rpc-server/redact-cause.js +2 -2
  49. package/dist/rpc-server/redact-cause.js.map +1 -1
  50. package/dist/rpc-server/redact.d.ts.map +1 -1
  51. package/dist/rpc-server/redact.js +16 -8
  52. package/dist/rpc-server/redact.js.map +1 -1
  53. package/dist/rpc-server/sensitive.js +11 -11
  54. package/dist/rpc-server/sensitive.js.map +1 -1
  55. package/dist/rpc-server/session.d.ts +3 -3
  56. package/dist/rpc-server/session.d.ts.map +1 -1
  57. package/dist/rpc-server/session.js +9 -6
  58. package/dist/rpc-server/session.js.map +1 -1
  59. package/dist/rpc-server/tracing.d.ts +1 -1
  60. package/dist/rpc-server/tracing.d.ts.map +1 -1
  61. package/dist/rpc-server/tracing.js +7 -5
  62. package/dist/rpc-server/tracing.js.map +1 -1
  63. package/dist/rpc-server.d.ts +8 -8
  64. package/dist/rpc-server.d.ts.map +1 -1
  65. package/dist/rpc-server.js +8 -8
  66. package/dist/rpc-server.js.map +1 -1
  67. package/dist/rpc.d.ts +2 -2
  68. package/dist/rpc.d.ts.map +1 -1
  69. package/dist/rpc.js +2 -2
  70. package/dist/rpc.js.map +1 -1
  71. package/dist/runtime/make.d.ts.map +1 -1
  72. package/dist/runtime/make.js +6 -3
  73. package/dist/runtime/make.js.map +1 -1
  74. package/dist/runtime/types.d.ts +0 -1
  75. package/dist/runtime/types.d.ts.map +1 -1
  76. package/dist/runtime.d.ts +2 -2
  77. package/dist/runtime.d.ts.map +1 -1
  78. package/dist/runtime.js +1 -1
  79. package/dist/runtime.js.map +1 -1
  80. package/dist/testing/types.d.ts +1 -1
  81. package/dist/testing/types.d.ts.map +1 -1
  82. package/dist/testing/vitest.d.ts +1 -1
  83. package/dist/testing/vitest.d.ts.map +1 -1
  84. package/dist/testing/vitest.js +2 -2
  85. package/dist/testing/vitest.js.map +1 -1
  86. package/dist/testing.d.ts +2 -2
  87. package/dist/testing.d.ts.map +1 -1
  88. package/dist/testing.js +1 -1
  89. package/dist/testing.js.map +1 -1
  90. package/package.json +52 -45
  91. package/src/better-auth/adapter.ts +4 -5
  92. package/src/better-auth/relation.ts +22 -18
  93. package/src/better-auth/row-adapter.ts +18 -16
  94. package/src/better-auth/where.ts +41 -26
  95. package/src/better-auth.ts +1 -1
  96. package/src/errors/taxonomy.ts +1 -1
  97. package/src/errors.ts +2 -2
  98. package/src/node-http/subscription-signal.ts +17 -16
  99. package/src/node-http.ts +1 -1
  100. package/src/rpc/middleware.ts +1 -1
  101. package/src/rpc-server/adapters/better-auth-sessions.ts +3 -3
  102. package/src/rpc-server/origin.ts +3 -3
  103. package/src/rpc-server/redact-cause.ts +2 -2
  104. package/src/rpc-server/redact.ts +26 -10
  105. package/src/rpc-server/sensitive.ts +12 -12
  106. package/src/rpc-server/session.ts +13 -7
  107. package/src/rpc-server/tracing.ts +9 -5
  108. package/src/rpc-server.ts +8 -8
  109. package/src/rpc.ts +2 -2
  110. package/src/runtime/make.ts +9 -3
  111. package/src/runtime/types.ts +0 -1
  112. package/src/runtime.ts +2 -2
  113. package/src/testing/types.ts +1 -1
  114. package/src/testing/vitest.ts +9 -6
  115. package/src/testing.ts +2 -2
@@ -1,8 +1,8 @@
1
1
  import type { TestContext, Vitest } from "@effect/vitest";
2
+ import type { Effect, Layer } from "effect";
2
3
  import type { AnyDatabase, DatabaseService } from "@shivaedev/effect-prisma/testing";
3
4
  import type { EffectTRPCAdapter } from "@shivaedev/effect-trpc";
4
5
  import type { CallerOptions, CallerResult, EffectCallerFactory, TrpcHarnessTest, TrpcHarnessTester } from "@shivaedev/effect-trpc/testing";
5
- import type { Effect, Layer } from "effect";
6
6
  export type PlatformHarness<Database extends AnyDatabase, Options, Caller, Extension> = Readonly<{
7
7
  db: DatabaseService<Database>;
8
8
  trpc: EffectCallerFactory<Options, Caller>;
@@ -1 +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,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,kCAAkC,CAAC;AACrF,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAChE,OAAO,KAAK,EAAE,aAAa,EAAE,YAAY,EAAE,mBAAmB,EAAE,eAAe,EAAE,iBAAiB,EAAE,MAAM,gCAAgC,CAAC;AAC3I,OAAO,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,QAAQ,CAAC;AAE5C,MAAM,MAAM,eAAe,CAAC,QAAQ,SAAS,WAAW,EAAE,OAAO,EAAE,MAAM,EAAE,SAAS,IAAI,QAAQ,CAAC;IAChG,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,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC,KAAK,CAAC,KAAK,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;CAClF,CAAC,GACF,IAAI,CAAC,SAAS,EAAE,IAAI,GAAG,SAAS,GAAG,MAAM,CAAC,CAAC;AAE5C,MAAM,MAAM,YAAY,CAAC,OAAO,EAAE,QAAQ,IAAI,eAAe,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;AAEjF,MAAM,MAAM,cAAc,CAAC,OAAO,EAAE,QAAQ,IAAI,iBAAiB,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;AAErF,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,CAAC,aAAa,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC,EAAE,YAAY,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;KACrG,CAAC,EACF,OAAO,EAAE,WAAW,KAChB,MAAM,CAAC,MAAM,CAAC,SAAS,EAAE,OAAO,EAAE,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC;IAC7E,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;CAClD"}
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,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,QAAQ,CAAC;AAC5C,OAAO,KAAK,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,kCAAkC,CAAC;AACrF,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAChE,OAAO,KAAK,EAAE,aAAa,EAAE,YAAY,EAAE,mBAAmB,EAAE,eAAe,EAAE,iBAAiB,EAAE,MAAM,gCAAgC,CAAC;AAE3I,MAAM,MAAM,eAAe,CAAC,QAAQ,SAAS,WAAW,EAAE,OAAO,EAAE,MAAM,EAAE,SAAS,IAAI,QAAQ,CAAC;IAChG,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,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC,KAAK,CAAC,KAAK,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;CAClF,CAAC,GACF,IAAI,CAAC,SAAS,EAAE,IAAI,GAAG,SAAS,GAAG,MAAM,CAAC,CAAC;AAE5C,MAAM,MAAM,YAAY,CAAC,OAAO,EAAE,QAAQ,IAAI,eAAe,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;AAEjF,MAAM,MAAM,cAAc,CAAC,OAAO,EAAE,QAAQ,IAAI,iBAAiB,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;AAErF,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,CAAC,aAAa,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC,EAAE,YAAY,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;KACrG,CAAC,EACF,OAAO,EAAE,WAAW,KAChB,MAAM,CAAC,MAAM,CAAC,SAAS,EAAE,OAAO,EAAE,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC;IAC7E,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;CAClD"}
@@ -1,6 +1,6 @@
1
+ import { Effect, type Layer } from "effect";
1
2
  import { type AnyDatabase } from "@shivaedev/effect-prisma/testing";
2
3
  import { type CallerOptions, type CallerResult } from "@shivaedev/effect-trpc/testing";
3
- import { Effect, type Layer } from "effect";
4
4
  import type { MakePlatformItOptions, PlatformHarness, PlatformIt } from "./types.ts";
5
5
  export declare const makePlatformIt: <const Database extends AnyDatabase>(database: Database) => <CreateCaller extends (...arguments_: never[]) => object, Provided, LayerError, Extension extends object = Record<never, never>>(options: MakePlatformItOptions<Database, CreateCaller, Provided, LayerError, Extension> & {
6
6
  readonly layer: Layer.Layer<Provided | Effect.Services<Database>, LayerError>;
@@ -1 +1 @@
1
- {"version":3,"file":"vitest.d.ts","sourceRoot":"","sources":["../../src/testing/vitest.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,WAAW,EAAuB,MAAM,kCAAkC,CAAC;AAEzF,OAAO,EAAE,KAAK,aAAa,EAAE,KAAK,YAAY,EAA+C,MAAM,gCAAgC,CAAC;AACpI,OAAO,EAAE,MAAM,EAAE,KAAK,KAAK,EAAE,MAAM,QAAQ,CAAC;AAC5C,OAAO,KAAK,EAAE,qBAAqB,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAkDrF,eAAO,MAAM,cAAc,GACzB,KAAK,CAAC,QAAQ,SAAS,WAAW,EAAE,UAAU,QAAQ,MACtD,YAAY,SAAS,CAAC,GAAG,UAAU,EAAE,KAAK,EAAE,KAAK,MAAM,EAAE,QAAQ,EAAE,UAAU,EAAE,SAAS,SAAS,MAAM,GAAG,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC,EAC9H,SAAS,qBAAqB,CAAC,QAAQ,EAAE,YAAY,EAAE,QAAQ,EAAE,UAAU,EAAE,SAAS,CAAC,GAAG;IACzF,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,UAAU,CAAC,CAAC;CAC9E,KACC,UAAU,CACZ,eAAe,CAAC,QAAQ,EAAE,aAAa,CAAC,YAAY,CAAC,EAAE,YAAY,CAAC,YAAY,CAAC,EAAE,SAAS,CAAC,EAC7F,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAEP,CAAC"}
1
+ {"version":3,"file":"vitest.d.ts","sourceRoot":"","sources":["../../src/testing/vitest.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,KAAK,KAAK,EAAE,MAAM,QAAQ,CAAC;AAC5C,OAAO,EAAE,KAAK,WAAW,EAAuB,MAAM,kCAAkC,CAAC;AAEzF,OAAO,EAAE,KAAK,aAAa,EAAE,KAAK,YAAY,EAA+C,MAAM,gCAAgC,CAAC;AAEpI,OAAO,KAAK,EAAE,qBAAqB,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAoDrF,eAAO,MAAM,cAAc,GACzB,KAAK,CAAC,QAAQ,SAAS,WAAW,EAAE,UAAU,QAAQ,MACtD,YAAY,SAAS,CAAC,GAAG,UAAU,EAAE,KAAK,EAAE,KAAK,MAAM,EAAE,QAAQ,EAAE,UAAU,EAAE,SAAS,SAAS,MAAM,GAAG,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC,EAC9H,SAAS,qBAAqB,CAAC,QAAQ,EAAE,YAAY,EAAE,QAAQ,EAAE,UAAU,EAAE,SAAS,CAAC,GAAG;IACzF,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,UAAU,CAAC,CAAC;CAC9E,KACC,UAAU,CACZ,eAAe,CAAC,QAAQ,EAAE,aAAa,CAAC,YAAY,CAAC,EAAE,YAAY,CAAC,YAAY,CAAC,EAAE,SAAS,CAAC,EAC7F,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAEP,CAAC"}
@@ -1,12 +1,12 @@
1
+ import { Effect } from "effect";
1
2
  import { withTestTransaction } from "@shivaedev/effect-prisma/testing";
2
3
  import { makeTrpcHarnessIt } from "@shivaedev/effect-trpc/testing";
3
- import { Effect } from "effect";
4
4
  function platformIt(database, options) {
5
5
  const trpcIt = makeTrpcHarnessIt({
6
6
  adapter: options.adapter,
7
+ around: (effect) => withTestTransaction(database, effect),
7
8
  createCaller: options.createCaller,
8
9
  layer: options.layer,
9
- around: (effect) => withTestTransaction(database, effect),
10
10
  makeHarness: (trpc, context) => Effect.gen(function* () {
11
11
  const services = yield* Effect.context();
12
12
  const db = yield* database;
@@ -1 +1 @@
1
- {"version":3,"file":"vitest.js","sourceRoot":"","sources":["../../src/testing/vitest.ts"],"names":[],"mappings":"AACA,OAAO,EAAoB,mBAAmB,EAAE,MAAM,kCAAkC,CAAC;AAEzF,OAAO,EAAmE,iBAAiB,EAAE,MAAM,gCAAgC,CAAC;AACpI,OAAO,EAAE,MAAM,EAAc,MAAM,QAAQ,CAAC;AAyB5C,SAAS,UAAU,CAAC,QAAqB,EAAE,OAAqB;IAC/D,MAAM,MAAM,GAAG,iBAAiB,CAAC;QAChC,OAAO,EAAE,OAAO,CAAC,OAAO;QACxB,YAAY,EAAE,OAAO,CAAC,YAAY;QAClC,KAAK,EAAE,OAAO,CAAC,KAAK;QACpB,MAAM,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,mBAAmB,CAAC,QAAQ,EAAE,MAAM,CAAC;QACzD,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,MAAM,OAAO,GAAG,CAAQ,QAA8B,EAAE,EAAE,CAAC,MAAM,CAAC,UAAU,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,eAAe,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC,CAAC;YACxI,OAAO,EAAE,GAAG,SAAS,EAAE,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;QAC5C,CAAC,CAAC;KACH,CAAC,CAAC;IAEH,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;AAED,MAAM,CAAC,MAAM,cAAc,GAC1B,CAAqC,QAAkB,EAAE,EAAE,CAC3D,CACC,OAEC,EAIA,EAAE,CACH,UAAU,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC"}
1
+ {"version":3,"file":"vitest.js","sourceRoot":"","sources":["../../src/testing/vitest.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAc,MAAM,QAAQ,CAAC;AAC5C,OAAO,EAAoB,mBAAmB,EAAE,MAAM,kCAAkC,CAAC;AAEzF,OAAO,EAAmE,iBAAiB,EAAE,MAAM,gCAAgC,CAAC;AA4BpI,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,MAAM,OAAO,GAAG,CAAQ,QAA8B,EAAE,EAAE,CAAC,MAAM,CAAC,UAAU,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,eAAe,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC,CAAC;YACxI,OAAO,EAAE,GAAG,SAAS,EAAE,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;QAC5C,CAAC,CAAC;KACH,CAAC,CAAC;IAEH,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;AAED,MAAM,CAAC,MAAM,cAAc,GAC1B,CAAqC,QAAkB,EAAE,EAAE,CAC3D,CACC,OAEC,EAIA,EAAE,CACH,UAAU,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC"}
package/dist/testing.d.ts CHANGED
@@ -1,3 +1,3 @@
1
- export type { MakePlatformItOptions, PlatformHarness, PlatformIt, PlatformTest, PlatformTester, } from "./testing/types.ts";
2
- export { makePlatformIt } from "./testing/vitest.ts";
1
+ export type { MakePlatformItOptions, PlatformHarness, PlatformIt, PlatformTest, PlatformTester, } from "#testing/types.ts";
2
+ export { makePlatformIt } from "#testing/vitest.ts";
3
3
  //# sourceMappingURL=testing.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"testing.d.ts","sourceRoot":"","sources":["../src/testing.ts"],"names":[],"mappings":"AAAA,YAAY,EACX,qBAAqB,EACrB,eAAe,EACf,UAAU,EACV,YAAY,EACZ,cAAc,GACd,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC"}
1
+ {"version":3,"file":"testing.d.ts","sourceRoot":"","sources":["../src/testing.ts"],"names":[],"mappings":"AAAA,YAAY,EACX,qBAAqB,EACrB,eAAe,EACf,UAAU,EACV,YAAY,EACZ,cAAc,GACd,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC"}
package/dist/testing.js CHANGED
@@ -1,2 +1,2 @@
1
- export { makePlatformIt } from "./testing/vitest.js";
1
+ export { makePlatformIt } from "#testing/vitest.ts";
2
2
  //# sourceMappingURL=testing.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"testing.js","sourceRoot":"","sources":["../src/testing.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC"}
1
+ {"version":3,"file":"testing.js","sourceRoot":"","sources":["../src/testing.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC"}
package/package.json CHANGED
@@ -1,28 +1,27 @@
1
1
  {
2
2
  "name": "@shivaedev/platform",
3
- "version": "0.4.3",
3
+ "version": "0.5.1",
4
4
  "description": "Opinionated Effect application infrastructure for ShivaeDev services",
5
- "type": "module",
6
- "license": "MIT",
7
- "repository": {
8
- "type": "git",
9
- "url": "git+https://github.com/ShivaeDev/platform.git",
10
- "directory": "packages/platform"
11
- },
12
5
  "homepage": "https://github.com/ShivaeDev/platform/tree/main/packages/platform#readme",
13
6
  "bugs": {
14
7
  "url": "https://github.com/ShivaeDev/platform/issues"
15
8
  },
16
- "engines": {
17
- "node": ">=24"
9
+ "repository": {
10
+ "type": "git",
11
+ "url": "git+https://github.com/ShivaeDev/platform.git",
12
+ "directory": "packages/platform"
18
13
  },
14
+ "license": "MIT",
19
15
  "sideEffects": false,
20
- "files": [
21
- "dist",
22
- "src",
23
- "CHANGELOG.md",
24
- "README.md"
25
- ],
16
+ "type": "module",
17
+ "imports": {
18
+ "#test/*": "./test/*",
19
+ "#*.ts": {
20
+ "source": "./src/*.ts",
21
+ "types": "./dist/*.d.ts",
22
+ "default": "./dist/*.js"
23
+ }
24
+ },
26
25
  "exports": {
27
26
  "./better-auth": {
28
27
  "types": "./dist/better-auth.d.ts",
@@ -68,17 +67,40 @@
68
67
  },
69
68
  "./package.json": "./package.json"
70
69
  },
71
- "publishConfig": {
72
- "access": "public",
73
- "provenance": true
70
+ "files": [
71
+ "dist",
72
+ "src",
73
+ "CHANGELOG.md",
74
+ "README.md"
75
+ ],
76
+ "devDependencies": {
77
+ "@effect/vitest": "4.0.0-rc.112",
78
+ "@prisma-next/adapter-postgres": "0.15.0",
79
+ "@prisma-next/contract": "0.15.0",
80
+ "@prisma-next/postgres": "0.15.0",
81
+ "@prisma-next/sql-contract": "0.15.0",
82
+ "@prisma-next/target-postgres": "0.15.0",
83
+ "@shivaedev/effect-prisma": "0.7.1",
84
+ "@shivaedev/effect-trpc": "0.5.1",
85
+ "@shivaedev/quality": "0.7.3",
86
+ "@shivaedev/types": "0.1.1",
87
+ "@trpc/client": "11.18.0",
88
+ "@trpc/server": "11.18.0",
89
+ "@types/node": "24.10.1",
90
+ "@typescript/native": "npm:typescript@7.0.2",
91
+ "better-auth": "1.6.30",
92
+ "effect": "4.0.0-rc.112",
93
+ "superjson": "2.2.6",
94
+ "typescript": "npm:@typescript/typescript6@6.0.2",
95
+ "vitest": "4.1.9"
74
96
  },
75
97
  "peerDependencies": {
76
98
  "@effect/vitest": "4.0.0-rc.112",
99
+ "@shivaedev/effect-prisma": "0.7.1",
100
+ "@shivaedev/effect-trpc": "0.5.1",
77
101
  "@trpc/server": "11.18.0",
78
102
  "better-auth": "1.6.30",
79
- "effect": "4.0.0-rc.112",
80
- "@shivaedev/effect-prisma": "0.6.4",
81
- "@shivaedev/effect-trpc": "0.4.1"
103
+ "effect": "4.0.0-rc.112"
82
104
  },
83
105
  "peerDependenciesMeta": {
84
106
  "@effect/vitest": {
@@ -97,32 +119,17 @@
97
119
  "optional": true
98
120
  }
99
121
  },
100
- "devDependencies": {
101
- "@effect/vitest": "4.0.0-rc.112",
102
- "@prisma-next/adapter-postgres": "0.15.0",
103
- "@prisma-next/contract": "0.15.0",
104
- "@prisma-next/postgres": "0.15.0",
105
- "@prisma-next/sql-contract": "0.15.0",
106
- "@prisma-next/target-postgres": "0.15.0",
107
- "@trpc/client": "11.18.0",
108
- "@trpc/server": "11.18.0",
109
- "@types/node": "24.10.1",
110
- "@typescript/native": "npm:typescript@7.0.2",
111
- "better-auth": "1.6.30",
112
- "effect": "4.0.0-rc.112",
113
- "superjson": "2.2.6",
114
- "typescript": "npm:@typescript/typescript6@6.0.2",
115
- "vitest": "4.1.9",
116
- "@shivaedev/effect-prisma": "0.6.4",
117
- "@shivaedev/effect-trpc": "0.4.1"
122
+ "engines": {
123
+ "node": ">=24"
124
+ },
125
+ "publishConfig": {
126
+ "access": "public",
127
+ "provenance": true
118
128
  },
119
129
  "scripts": {
120
130
  "build": "node --eval \"import('node:fs').then(({ rmSync }) => rmSync('dist', { force: true, recursive: true }))\" && tsc6 --project tsconfig.build.json",
121
- "check": "biome check .",
131
+ "ready": "pnpm typecheck && pnpm test && pnpm build",
122
132
  "test": "vitest run",
123
- "test:package": "node scripts/test-package.mjs",
124
- "typecheck": "tsc --noEmit",
125
- "typecheck:compat": "tsc6 --noEmit",
126
- "ready": "pnpm check && pnpm typecheck && pnpm typecheck:compat && pnpm test && pnpm build && pnpm test:package"
133
+ "typecheck": "tsc --noEmit"
127
134
  }
128
135
  }
@@ -1,14 +1,13 @@
1
- import type { AnyDatabase } from "@shivaedev/effect-prisma";
2
1
  import type { BetterAuthOptions, DBAdapterInstance } from "better-auth";
3
2
  import { createAdapterFactory } from "better-auth/adapters";
4
3
  import { Effect } from "effect";
5
- import type { PlatformRuntime } from "../runtime/types.ts";
4
+ import type { AnyDatabase } from "@shivaedev/effect-prisma";
5
+ import type { PlatformRuntime } from "#runtime/types.ts";
6
6
  import { type DynamicRelation, refineRelation } from "./relation.ts";
7
7
  import { makeRowAdapter, type RelationQuery } from "./row-adapter.ts";
8
8
 
9
9
  export interface EffectPrismaAdapterOptions {
10
10
  readonly debugLogs?: boolean;
11
- /** Map Better Auth model names to Prisma contract model names. */
12
11
  readonly modelName?: (model: string) => string;
13
12
  readonly usePlural?: boolean;
14
13
  }
@@ -59,13 +58,14 @@ export function effectPrismaAdapter(
59
58
  const inTransaction = <Value>(callback: () => Promise<Value>): Effect.Effect<Value, unknown, unknown> =>
60
59
  Effect.flatMap(Effect.context<unknown>(), (services) =>
61
60
  Effect.tryPromise({
62
- try: () => runtime.runWithServices(services, callback),
63
61
  catch: (error) => error,
62
+ try: () => runtime.runWithServices(services, callback),
64
63
  }),
65
64
  );
66
65
 
67
66
  let factory: ReturnType<typeof createAdapterFactory>;
68
67
  factory = createAdapterFactory({
68
+ adapter: makeRowAdapter(query, adapterOptions.usePlural ?? false),
69
69
  config: {
70
70
  adapterId: "effect-prisma",
71
71
  adapterName: "Effect Prisma",
@@ -78,7 +78,6 @@ export function effectPrismaAdapter(
78
78
  supportsUUIDs: true,
79
79
  transaction: (callback) => run((database) => database.transaction(inTransaction(() => callback(factory(authOptions))))),
80
80
  },
81
- adapter: makeRowAdapter(query, adapterOptions.usePlural ?? false),
82
81
  });
83
82
 
84
83
  return factory(authOptions);
@@ -1,27 +1,27 @@
1
- import { all } from "@shivaedev/effect-prisma";
2
1
  import type { Effect, Option } from "effect";
2
+ import { all } from "@shivaedev/effect-prisma";
3
3
  import { type CleanedWhere, type DynamicField, type Expression, whereExpression } from "./where.ts";
4
4
 
5
- export interface DynamicRelation<Requirements> extends Effect.Effect<ReadonlyArray<Record<string, unknown>>, unknown, Requirements> {
6
- where(predicate: (fields: Record<string, DynamicField>) => Expression): DynamicRelation<Requirements>;
7
- orderBy(ordering: (fields: Record<string, DynamicField>) => unknown): DynamicRelation<Requirements>;
8
- take(count: number): DynamicRelation<Requirements>;
9
- skip(count: number): DynamicRelation<Requirements>;
10
- select(...fields: ReadonlyArray<string>): DynamicRelation<Requirements>;
11
- first(): Effect.Effect<Option.Option<Record<string, unknown>>, unknown, Requirements>;
12
- count(): Effect.Effect<number, unknown, Requirements>;
13
- create(data: Record<string, unknown>): Effect.Effect<Record<string, unknown>, unknown, Requirements>;
14
- update(data: Record<string, unknown>): Effect.Effect<Record<string, unknown> | null, unknown, Requirements>;
15
- updateAll(data: Record<string, unknown>): Effect.Effect<ReadonlyArray<Record<string, unknown>>, unknown, Requirements>;
16
- delete(): Effect.Effect<Record<string, unknown> | null, unknown, Requirements>;
17
- deleteAll(): Effect.Effect<ReadonlyArray<Record<string, unknown>>, unknown, Requirements>;
5
+ export interface DynamicRelation<Requirements> extends Effect.Effect<readonly Record<string, unknown>[], unknown, Requirements> {
6
+ count: () => Effect.Effect<number, unknown, Requirements>;
7
+ create: (data: Record<string, unknown>) => Effect.Effect<Record<string, unknown>, unknown, Requirements>;
8
+ delete: () => Effect.Effect<Record<string, unknown> | null, unknown, Requirements>;
9
+ deleteAll: () => Effect.Effect<readonly Record<string, unknown>[], unknown, Requirements>;
10
+ first: () => Effect.Effect<Option.Option<Record<string, unknown>>, unknown, Requirements>;
11
+ orderBy: (ordering: (fields: Record<string, DynamicField>) => unknown) => DynamicRelation<Requirements>;
12
+ select: (...fields: readonly string[]) => DynamicRelation<Requirements>;
13
+ skip: (count: number) => DynamicRelation<Requirements>;
14
+ take: (count: number) => DynamicRelation<Requirements>;
15
+ update: (data: Record<string, unknown>) => Effect.Effect<Record<string, unknown> | null, unknown, Requirements>;
16
+ updateAll: (data: Record<string, unknown>) => Effect.Effect<readonly Record<string, unknown>[], unknown, Requirements>;
17
+ where: (predicate: (fields: Record<string, DynamicField>) => Expression) => DynamicRelation<Requirements>;
18
18
  }
19
19
 
20
20
  export const refineRelation = <Requirements>(
21
21
  relation: DynamicRelation<Requirements>,
22
22
  options: {
23
- readonly where?: ReadonlyArray<CleanedWhere> | undefined;
24
- readonly select?: ReadonlyArray<string> | undefined;
23
+ readonly where?: readonly CleanedWhere[] | undefined;
24
+ readonly select?: readonly string[] | undefined;
25
25
  readonly limit?: number | undefined;
26
26
  readonly offset?: number | undefined;
27
27
  readonly sortBy?:
@@ -48,8 +48,12 @@ export const refineRelation = <Requirements>(
48
48
  return options.sortBy?.direction === "desc" ? field.desc() : field.asc();
49
49
  });
50
50
  }
51
- if (options.offset !== undefined) refined = refined.skip(options.offset);
52
- if (options.limit !== undefined) refined = refined.take(options.limit);
51
+ if (options.offset !== undefined) {
52
+ refined = refined.skip(options.offset);
53
+ }
54
+ if (options.limit !== undefined) {
55
+ refined = refined.take(options.limit);
56
+ }
53
57
  if (options.select !== undefined && options.select.length > 0) {
54
58
  refined = refined.select(...options.select);
55
59
  }
@@ -12,8 +12,8 @@ type Refinement = Parameters<typeof refineRelation>[1];
12
12
 
13
13
  interface RowMethods {
14
14
  readonly create: (input: { readonly data: Row; readonly model: string; readonly select?: string[] | undefined }) => Promise<Row>;
15
+ readonly findMany: (input: FindManyInput) => Promise<readonly Row[]>;
15
16
  readonly findOne: (input: FindOneInput) => Promise<Row | null>;
16
- readonly findMany: (input: FindManyInput) => Promise<ReadonlyArray<Row>>;
17
17
  readonly update: (input: { readonly model: string; readonly update: Row; readonly where: CleanedWhere[] }) => Promise<Row | null>;
18
18
  }
19
19
 
@@ -41,38 +41,40 @@ export const makeRowAdapter =
41
41
  (query: RelationQuery, usePlural: boolean): AdapterFactoryCustomizeAdapterCreator =>
42
42
  ({ debugLog, getFieldAttributes }) => {
43
43
  const isUnique = (model: string, condition: CleanedWhere): boolean =>
44
- condition.connector !== "OR" &&
45
- condition.operator === "eq" &&
46
- condition.mode !== "insensitive" &&
47
- (condition.field === "id" || getFieldAttributes({ field: condition.field, model }).unique === true);
44
+ condition.connector !== "OR"
45
+ && condition.operator === "eq"
46
+ && condition.mode !== "insensitive"
47
+ && (condition.field === "id" || getFieldAttributes({ field: condition.field, model }).unique === true);
48
48
 
49
49
  return rowTyped({
50
+ count: ({ model, where }) => query(model, { where }, (relation) => relation.count()),
50
51
  create: ({ data, model, select }) => {
51
52
  debugLog("create", { model });
52
53
  return query(model, { select }, (relation) => relation.create(data));
53
54
  },
54
- findOne: ({ join, model, select, where }) => {
55
- rejectJoin(join);
56
- return query(model, { select, where }, (relation) => Effect.map(relation.first(), Option.getOrNull));
55
+ delete: ({ model, where }) => {
56
+ const byId = where.some(namesId);
57
+ return query(model, { where }, (relation) => (byId ? Effect.asVoid(relation.delete()) : Effect.asVoid(relation.deleteAll())));
57
58
  },
59
+ deleteMany: ({ model, where }) => query(model, { where }, (relation) => Effect.map(relation.deleteAll(), (rows) => rows.length)),
58
60
  findMany: ({ join, limit, model, offset, select, sortBy, where }) => {
59
61
  rejectJoin(join);
60
62
  return query(model, { limit, offset, select, sortBy, where }, (relation) => relation);
61
63
  },
64
+ findOne: ({ join, model, select, where }) => {
65
+ rejectJoin(join);
66
+ return query(model, { select, where }, (relation) => Effect.map(relation.first(), Option.getOrNull));
67
+ },
68
+ options: { usePlural },
62
69
  update: ({ model, update, where }) => {
63
- if (where.length === 0) return Promise.resolve(null);
70
+ if (where.length === 0) {
71
+ return Promise.resolve(null);
72
+ }
64
73
  const unique = where.some((condition) => isUnique(model, condition));
65
74
  return query(model, { where }, (relation) =>
66
75
  unique ? relation.update(update) : Effect.map(relation.updateAll(update), (rows) => rows[0] ?? null),
67
76
  );
68
77
  },
69
78
  updateMany: ({ model, update, where }) => query(model, { where }, (relation) => Effect.map(relation.updateAll(update), (rows) => rows.length)),
70
- delete: ({ model, where }) => {
71
- const byId = where.some(namesId);
72
- return query(model, { where }, (relation) => (byId ? Effect.asVoid(relation.delete()) : Effect.asVoid(relation.deleteAll())));
73
- },
74
- deleteMany: ({ model, where }) => query(model, { where }, (relation) => Effect.map(relation.deleteAll(), (rows) => rows.length)),
75
- count: ({ model, where }) => query(model, { where }, (relation) => relation.count()),
76
- options: { usePlural },
77
79
  });
78
80
  };
@@ -1,31 +1,31 @@
1
- import { all, and, not, or } from "@shivaedev/effect-prisma";
2
1
  import type { Where } from "better-auth";
2
+ import { all, and, not, or } from "@shivaedev/effect-prisma";
3
3
 
4
4
  export type CleanedWhere = Required<Where>;
5
5
  export type Expression = Parameters<typeof and>[number];
6
6
 
7
7
  export interface DynamicField {
8
- eq(value: unknown): Expression;
9
- neq(value: unknown): Expression;
10
- gt(value: unknown): Expression;
11
- gte(value: unknown): Expression;
12
- lt(value: unknown): Expression;
13
- lte(value: unknown): Expression;
14
- in(value: ReadonlyArray<unknown>): Expression;
15
- notIn(value: ReadonlyArray<unknown>): Expression;
16
- like(value: string): Expression;
17
- ilike?(value: string): Expression;
18
- isNull(): Expression;
19
- isNotNull(): Expression;
20
- asc(): unknown;
21
- desc(): unknown;
8
+ asc: () => unknown;
9
+ desc: () => unknown;
10
+ eq: (value: unknown) => Expression;
11
+ gt: (value: unknown) => Expression;
12
+ gte: (value: unknown) => Expression;
13
+ ilike?: (value: string) => Expression;
14
+ in: (value: readonly unknown[]) => Expression;
15
+ isNotNull: () => Expression;
16
+ isNull: () => Expression;
17
+ like: (value: string) => Expression;
18
+ lt: (value: unknown) => Expression;
19
+ lte: (value: unknown) => Expression;
20
+ neq: (value: unknown) => Expression;
21
+ notIn: (value: readonly unknown[]) => Expression;
22
22
  }
23
23
 
24
24
  const escapeLike = (value: string): string => value.replaceAll("\\", "\\\\").replaceAll("%", "\\%").replaceAll("_", "\\_");
25
25
 
26
- const nonNullValues = (value: unknown): ReadonlyArray<unknown> => (Array.isArray(value) ? value : [value]).filter((item) => item !== null);
26
+ const nonNullValues = (value: unknown): readonly unknown[] => (Array.isArray(value) ? value : [value]).filter((item) => item !== null);
27
27
 
28
- const insensitiveStrings = (field: DynamicField, where: CleanedWhere, values: ReadonlyArray<unknown>) => {
28
+ const insensitiveStrings = (field: DynamicField, where: CleanedWhere, values: readonly unknown[]) => {
29
29
  const ilike = field.ilike;
30
30
  if (where.mode !== "insensitive" || ilike === undefined || !values.every((item) => typeof item === "string")) {
31
31
  return undefined;
@@ -52,7 +52,9 @@ const exclusion = (field: DynamicField, where: CleanedWhere): Expression | undef
52
52
  };
53
53
 
54
54
  const likePattern = (operator: CleanedWhere["operator"], escaped: string): string => {
55
- if (operator === "contains") return `%${escaped}%`;
55
+ if (operator === "contains") {
56
+ return `%${escaped}%`;
57
+ }
56
58
  return operator === "starts_with" ? `${escaped}%` : `%${escaped}`;
57
59
  };
58
60
 
@@ -66,15 +68,22 @@ const pattern = (field: DynamicField, where: CleanedWhere): Expression => {
66
68
 
67
69
  const insensitiveEquality = (field: DynamicField, where: CleanedWhere): Expression | undefined => {
68
70
  const value = where.value;
69
- if (where.mode !== "insensitive" || typeof value !== "string" || field.ilike === undefined) return undefined;
70
- if (where.operator === "eq") return field.ilike(escapeLike(value));
71
- if (where.operator === "ne") return not(field.ilike(escapeLike(value)));
71
+ const operator = where.operator ?? "eq";
72
+ if (where.mode !== "insensitive" || typeof value !== "string" || field.ilike === undefined) {
73
+ return undefined;
74
+ }
75
+ if (operator === "eq") {
76
+ return field.ilike(escapeLike(value));
77
+ }
78
+ if (operator === "ne") {
79
+ return not(field.ilike(escapeLike(value)));
80
+ }
72
81
  return undefined;
73
82
  };
74
83
 
75
84
  const comparison = (field: DynamicField, where: CleanedWhere): Expression | undefined => {
76
85
  const value = where.value;
77
- switch (where.operator) {
86
+ switch (where.operator ?? "eq") {
78
87
  case "eq":
79
88
  return value === null ? field.isNull() : field.eq(value);
80
89
  case "ne":
@@ -98,7 +107,7 @@ const comparison = (field: DynamicField, where: CleanedWhere): Expression | unde
98
107
  }
99
108
  };
100
109
 
101
- export const whereExpression = (fields: Record<string, DynamicField>, where: ReadonlyArray<CleanedWhere>): Expression | undefined => {
110
+ export const whereExpression = (fields: Record<string, DynamicField>, where: readonly CleanedWhere[]): Expression | undefined => {
102
111
  const conjunctions: Expression[] = [];
103
112
  const disjunctions: Expression[] = [];
104
113
 
@@ -108,11 +117,17 @@ export const whereExpression = (fields: Record<string, DynamicField>, where: Rea
108
117
  throw new TypeError(`Unknown database field: ${condition.field}`);
109
118
  }
110
119
  const expression = insensitiveEquality(field, condition) ?? comparison(field, condition);
111
- if (expression === undefined) continue;
120
+ if (expression === undefined) {
121
+ continue;
122
+ }
112
123
  (condition.connector === "OR" ? disjunctions : conjunctions).push(expression);
113
124
  }
114
125
 
115
- if (disjunctions.length > 0) conjunctions.push(or(...disjunctions));
116
- if (conjunctions.length === 0) return all();
126
+ if (disjunctions.length > 0) {
127
+ conjunctions.push(or(...disjunctions));
128
+ }
129
+ if (conjunctions.length === 0) {
130
+ return all();
131
+ }
117
132
  return conjunctions.length === 1 ? conjunctions[0] : and(...conjunctions);
118
133
  };
@@ -1,4 +1,4 @@
1
1
  export {
2
2
  type EffectPrismaAdapterOptions,
3
3
  effectPrismaAdapter,
4
- } from "./better-auth/adapter.ts";
4
+ } from "#better-auth/adapter.ts";
@@ -1,7 +1,7 @@
1
1
  import { Schema } from "effect";
2
2
 
3
3
  const described = { message: Schema.String };
4
- const perField = { message: Schema.String, field: Schema.optionalKey(Schema.String) };
4
+ const perField = { field: Schema.optionalKey(Schema.String), message: Schema.String };
5
5
 
6
6
  export class NotFound extends Schema.TaggedError<NotFound>()("NotFound", described) {}
7
7
 
package/src/errors.ts CHANGED
@@ -1,2 +1,2 @@
1
- export { type RejectedField, rejectedField } from "./errors/rejected-field.ts";
2
- export { AuthUnavailable, BadRequest, Conflict, Forbidden, NotFound, PreconditionFailed, TooManyRequests, Unauthorized } from "./errors/taxonomy.ts";
1
+ export { type RejectedField, rejectedField } from "#errors/rejected-field.ts";
2
+ export { AuthUnavailable, BadRequest, Conflict, Forbidden, NotFound, PreconditionFailed, TooManyRequests, Unauthorized } from "#errors/taxonomy.ts";
@@ -1,18 +1,13 @@
1
1
  import type { IncomingMessage } from "node:http";
2
2
 
3
3
  export interface NodeSubscriptionSignalOptions {
4
- /** A Web request, including its signal and an optional srvx node runtime. */
5
- readonly request?: Request | undefined;
6
- /** The node request when the transport exposes it directly. */
7
4
  readonly nodeRequest?: IncomingMessage | undefined;
8
- /** Additional transport or procedure signals to combine. */
5
+ readonly request?: Request | undefined;
9
6
  readonly signals?: Iterable<AbortSignal | undefined>;
10
7
  }
11
8
 
12
9
  export interface NodeSubscriptionSignal {
13
- /** Detach node listeners when the subscription ends. */
14
10
  readonly dispose: () => void;
15
- /** Aborts when any supplied signal or the underlying connection closes. */
16
11
  readonly signal: AbortSignal;
17
12
  }
18
13
 
@@ -26,17 +21,17 @@ const nodeRequestFrom = (request: Request | undefined): IncomingMessage | undefi
26
21
  return isIncomingMessage(req) ? req : undefined;
27
22
  };
28
23
 
29
- /**
30
- * Combine Web/procedure abort signals with node request and socket close events.
31
- * The node events cover long-lived responses under Bun's node:http compatibility
32
- * layer, where a Web request signal alone may not report an abandoned socket.
33
- */
24
+ // Under Bun's node:http compatibility layer a Web request signal may miss an abandoned socket, so node close events cover long-lived responses.
34
25
  export const nodeSubscriptionSignal = (options: NodeSubscriptionSignalOptions): NodeSubscriptionSignal => {
35
26
  const controller = new AbortController();
36
27
  const signals: AbortSignal[] = [controller.signal];
37
- if (options.request !== undefined) signals.push(options.request.signal);
28
+ if (options.request !== undefined) {
29
+ signals.push(options.request.signal);
30
+ }
38
31
  for (const signal of options.signals ?? []) {
39
- if (signal !== undefined) signals.push(signal);
32
+ if (signal !== undefined) {
33
+ signals.push(signal);
34
+ }
40
35
  }
41
36
 
42
37
  const nodeRequest = options.nodeRequest ?? nodeRequestFrom(options.request);
@@ -46,17 +41,23 @@ export const nodeSubscriptionSignal = (options: NodeSubscriptionSignalOptions):
46
41
 
47
42
  const socket = nodeRequest.socket;
48
43
  const onRequestClose = () => {
49
- if (!nodeRequest.complete) controller.abort();
44
+ if (!nodeRequest.complete) {
45
+ controller.abort();
46
+ }
50
47
  };
51
48
  const onSocketClose = () => controller.abort();
52
49
  nodeRequest.once("close", onRequestClose);
53
50
  socket.once("close", onSocketClose);
54
- if (nodeRequest.destroyed || socket.destroyed) controller.abort();
51
+ if (nodeRequest.destroyed || socket.destroyed) {
52
+ controller.abort();
53
+ }
55
54
 
56
55
  let disposed = false;
57
56
  return {
58
57
  dispose: () => {
59
- if (disposed) return;
58
+ if (disposed) {
59
+ return;
60
+ }
60
61
  disposed = true;
61
62
  nodeRequest.removeListener("close", onRequestClose);
62
63
  socket.removeListener("close", onSocketClose);
package/src/node-http.ts CHANGED
@@ -2,4 +2,4 @@ export {
2
2
  type NodeSubscriptionSignal,
3
3
  type NodeSubscriptionSignalOptions,
4
4
  nodeSubscriptionSignal,
5
- } from "./node-http/subscription-signal.ts";
5
+ } from "#node-http/subscription-signal.ts";
@@ -1,6 +1,6 @@
1
1
  import { Schema } from "effect";
2
2
  import { RpcMiddleware } from "effect/unstable/rpc";
3
- import { AuthUnavailable, Forbidden, Unauthorized } from "../errors/taxonomy.ts";
3
+ import { AuthUnavailable, Forbidden, Unauthorized } from "#errors/taxonomy.ts";
4
4
  import type { Identity, OptionalIdentity, RequestId } from "./identity.ts";
5
5
 
6
6
  export class RequestTracing extends RpcMiddleware.Service<RequestTracing, { provides: RequestId }>()("@shivaedev/platform/rpc/RequestTracing") {}
@@ -1,8 +1,8 @@
1
1
  import { Effect, Option } from "effect";
2
2
  import type { Headers } from "effect/unstable/http";
3
- import { AuthUnavailable } from "../../errors/taxonomy.ts";
4
- import { redact } from "../redact.ts";
5
- import type { SessionProvider, SessionShape } from "../session.ts";
3
+ import { AuthUnavailable } from "#errors/taxonomy.ts";
4
+ import { redact } from "#rpc-server/redact.ts";
5
+ import type { SessionProvider, SessionShape } from "#rpc-server/session.ts";
6
6
 
7
7
  export type GetSession<Session extends SessionShape> = (headers: globalThis.Headers) => Promise<Session | null>;
8
8