@shivaedev/server 0.0.0 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (148) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +322 -1
  3. package/dist/AppHostFactory.d.ts +15 -0
  4. package/dist/AppHostFactory.d.ts.map +1 -0
  5. package/dist/AppHostFactory.js +2 -0
  6. package/dist/AppHostFactory.js.map +1 -0
  7. package/dist/AppHostInput.d.ts +13 -0
  8. package/dist/AppHostInput.d.ts.map +1 -0
  9. package/dist/AppHostInput.js +2 -0
  10. package/dist/AppHostInput.js.map +1 -0
  11. package/dist/MigrationOptions.d.ts +15 -0
  12. package/dist/MigrationOptions.d.ts.map +1 -0
  13. package/dist/MigrationOptions.js +2 -0
  14. package/dist/MigrationOptions.js.map +1 -0
  15. package/dist/RedactionPolicy.d.ts +4 -0
  16. package/dist/RedactionPolicy.d.ts.map +1 -0
  17. package/dist/RedactionPolicy.js +4 -0
  18. package/dist/RedactionPolicy.js.map +1 -0
  19. package/dist/appHost.d.ts +47 -0
  20. package/dist/appHost.d.ts.map +1 -0
  21. package/dist/appHost.js +17 -0
  22. package/dist/appHost.js.map +1 -0
  23. package/dist/appHostHttp.d.ts +88 -0
  24. package/dist/appHostHttp.d.ts.map +1 -0
  25. package/dist/appHostHttp.js +66 -0
  26. package/dist/appHostHttp.js.map +1 -0
  27. package/dist/boundedRpcRequest.d.ts +3 -0
  28. package/dist/boundedRpcRequest.d.ts.map +1 -0
  29. package/dist/boundedRpcRequest.js +22 -0
  30. package/dist/boundedRpcRequest.js.map +1 -0
  31. package/dist/databaseAddress.d.ts +4 -0
  32. package/dist/databaseAddress.d.ts.map +1 -0
  33. package/dist/databaseAddress.js +25 -0
  34. package/dist/databaseAddress.js.map +1 -0
  35. package/dist/databaseLayer.d.ts +14 -0
  36. package/dist/databaseLayer.d.ts.map +1 -0
  37. package/dist/databaseLayer.js +100 -0
  38. package/dist/databaseLayer.js.map +1 -0
  39. package/dist/development.d.ts +10 -0
  40. package/dist/development.d.ts.map +1 -0
  41. package/dist/development.js +20 -0
  42. package/dist/development.js.map +1 -0
  43. package/dist/healthRoute.d.ts +3 -0
  44. package/dist/healthRoute.d.ts.map +1 -0
  45. package/dist/healthRoute.js +18 -0
  46. package/dist/healthRoute.js.map +1 -0
  47. package/dist/hostChanges.d.ts +7 -0
  48. package/dist/hostChanges.d.ts.map +1 -0
  49. package/dist/hostChanges.js +25 -0
  50. package/dist/hostChanges.js.map +1 -0
  51. package/dist/hostOptions.d.ts +34 -0
  52. package/dist/hostOptions.d.ts.map +1 -0
  53. package/dist/hostOptions.js +2 -0
  54. package/dist/hostOptions.js.map +1 -0
  55. package/dist/hostTransport.d.ts +18 -0
  56. package/dist/hostTransport.d.ts.map +1 -0
  57. package/dist/hostTransport.js +26 -0
  58. package/dist/hostTransport.js.map +1 -0
  59. package/dist/nativeClientOrigins.d.ts +4 -0
  60. package/dist/nativeClientOrigins.d.ts.map +1 -0
  61. package/dist/nativeClientOrigins.js +38 -0
  62. package/dist/nativeClientOrigins.js.map +1 -0
  63. package/dist/node-http/subscriptionSignal.d.ts +12 -0
  64. package/dist/node-http/subscriptionSignal.d.ts.map +1 -0
  65. package/dist/node-http/subscriptionSignal.js +55 -0
  66. package/dist/node-http/subscriptionSignal.js.map +1 -0
  67. package/dist/otlpHttpClient.d.ts +4 -0
  68. package/dist/otlpHttpClient.d.ts.map +1 -0
  69. package/dist/otlpHttpClient.js +36 -0
  70. package/dist/otlpHttpClient.js.map +1 -0
  71. package/dist/otlpTracing.d.ts +3 -0
  72. package/dist/otlpTracing.d.ts.map +1 -0
  73. package/dist/otlpTracing.js +35 -0
  74. package/dist/otlpTracing.js.map +1 -0
  75. package/dist/redactOtlpUrl.d.ts +2 -0
  76. package/dist/redactOtlpUrl.d.ts.map +1 -0
  77. package/dist/redactOtlpUrl.js +41 -0
  78. package/dist/redactOtlpUrl.js.map +1 -0
  79. package/dist/redactingDiagnostics.d.ts +5 -0
  80. package/dist/redactingDiagnostics.d.ts.map +1 -0
  81. package/dist/redactingDiagnostics.js +25 -0
  82. package/dist/redactingDiagnostics.js.map +1 -0
  83. package/dist/redactingRpcSerialization.d.ts +4 -0
  84. package/dist/redactingRpcSerialization.d.ts.map +1 -0
  85. package/dist/redactingRpcSerialization.js +74 -0
  86. package/dist/redactingRpcSerialization.js.map +1 -0
  87. package/dist/redactingTracer.d.ts +4 -0
  88. package/dist/redactingTracer.d.ts.map +1 -0
  89. package/dist/redactingTracer.js +32 -0
  90. package/dist/redactingTracer.js.map +1 -0
  91. package/dist/rpc-server/publicConfigLayer.d.ts +4 -0
  92. package/dist/rpc-server/publicConfigLayer.d.ts.map +1 -0
  93. package/dist/rpc-server/publicConfigLayer.js +9 -0
  94. package/dist/rpc-server/publicConfigLayer.js.map +1 -0
  95. package/dist/runtime/makePlatform.d.ts +4 -0
  96. package/dist/runtime/makePlatform.d.ts.map +1 -0
  97. package/dist/runtime/makePlatform.js +65 -0
  98. package/dist/runtime/makePlatform.js.map +1 -0
  99. package/dist/runtime/types.d.ts +19 -0
  100. package/dist/runtime/types.d.ts.map +1 -0
  101. package/dist/runtime/types.js +2 -0
  102. package/dist/runtime/types.js.map +1 -0
  103. package/dist/safeOtlpSerialization.d.ts +6 -0
  104. package/dist/safeOtlpSerialization.d.ts.map +1 -0
  105. package/dist/safeOtlpSerialization.js +67 -0
  106. package/dist/safeOtlpSerialization.js.map +1 -0
  107. package/dist/schemaSensitiveKeys.d.ts +5 -0
  108. package/dist/schemaSensitiveKeys.d.ts.map +1 -0
  109. package/dist/schemaSensitiveKeys.js +143 -0
  110. package/dist/schemaSensitiveKeys.js.map +1 -0
  111. package/dist/setupDatabases.d.ts +3 -0
  112. package/dist/setupDatabases.d.ts.map +1 -0
  113. package/dist/setupDatabases.js +12 -0
  114. package/dist/setupDatabases.js.map +1 -0
  115. package/dist/tracedGroup.d.ts +4 -0
  116. package/dist/tracedGroup.d.ts.map +1 -0
  117. package/dist/tracedGroup.js +13 -0
  118. package/dist/tracedGroup.js.map +1 -0
  119. package/package.json +107 -4
  120. package/src/AppHostFactory.ts +121 -0
  121. package/src/AppHostInput.ts +74 -0
  122. package/src/MigrationOptions.ts +15 -0
  123. package/src/RedactionPolicy.ts +4 -0
  124. package/src/appHost.ts +117 -0
  125. package/src/appHostHttp.ts +149 -0
  126. package/src/boundedRpcRequest.ts +28 -0
  127. package/src/databaseAddress.ts +25 -0
  128. package/src/databaseLayer.ts +127 -0
  129. package/src/development.ts +34 -0
  130. package/src/healthRoute.ts +27 -0
  131. package/src/hostChanges.ts +34 -0
  132. package/src/hostOptions.ts +30 -0
  133. package/src/hostTransport.ts +39 -0
  134. package/src/nativeClientOrigins.ts +44 -0
  135. package/src/node-http/subscriptionSignal.ts +64 -0
  136. package/src/otlpHttpClient.ts +54 -0
  137. package/src/otlpTracing.ts +61 -0
  138. package/src/redactOtlpUrl.ts +48 -0
  139. package/src/redactingDiagnostics.ts +33 -0
  140. package/src/redactingRpcSerialization.ts +85 -0
  141. package/src/redactingTracer.ts +37 -0
  142. package/src/rpc-server/publicConfigLayer.ts +12 -0
  143. package/src/runtime/makePlatform.ts +75 -0
  144. package/src/runtime/types.ts +24 -0
  145. package/src/safeOtlpSerialization.ts +73 -0
  146. package/src/schemaSensitiveKeys.ts +148 -0
  147. package/src/setupDatabases.ts +12 -0
  148. package/src/tracedGroup.ts +14 -0
@@ -0,0 +1,32 @@
1
+ import { Effect, Exit, Layer, Tracer } from "effect";
2
+ import { redact } from "@shivaedev/errors/redact.ts";
3
+ import { redactDiagnosticCause } from "@shivaedev/errors/redactCause.ts";
4
+ import { REDACTED } from "@shivaedev/errors/sensitive.ts";
5
+ import { redactRecord } from "#redactingDiagnostics.ts";
6
+ function redactLinks(values, sensitive) {
7
+ return values.map((link) => ({ ...link, attributes: redactRecord(link.attributes, sensitive) }));
8
+ }
9
+ function redactSpan(span, sensitive) {
10
+ const end = span.end.bind(span);
11
+ const attribute = span.attribute.bind(span);
12
+ const event = span.event.bind(span);
13
+ const addLinks = span.addLinks.bind(span);
14
+ return Object.assign(span, {
15
+ addLinks: (values) => addLinks(redactLinks(values, sensitive)),
16
+ attribute: (key, value) => attribute(key, sensitive(key) ? REDACTED : redact(value, sensitive)),
17
+ end: (time, exit) => {
18
+ for (const [key, value] of span.attributes) {
19
+ attribute(key, sensitive(key) ? REDACTED : redact(value, sensitive));
20
+ }
21
+ end(time, Exit.isFailure(exit) ? Exit.failCause(redactDiagnosticCause(exit.cause, sensitive)) : exit);
22
+ },
23
+ event: (name, time, attributes) => event(name, time, attributes && redactRecord(attributes, sensitive)),
24
+ });
25
+ }
26
+ export function redactingTracer(sensitive) {
27
+ return Layer.effect(Tracer.Tracer, Effect.map(Tracer.Tracer, (tracer) => Tracer.make({
28
+ ...tracer,
29
+ span: (options) => redactSpan(tracer.span({ ...options, links: redactLinks(options.links, sensitive) }), sensitive),
30
+ })));
31
+ }
32
+ //# sourceMappingURL=redactingTracer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"redactingTracer.js","sourceRoot":"","sources":["../src/redactingTracer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import { Config, type ConfigProvider } from "effect";
2
+ import type { publicConfig } from "@shivaedev/contract/publicConfig.ts";
3
+ export declare function publicConfigLayer<T, E>(declaration: ReturnType<typeof publicConfig<T, E>>, path?: string | ConfigProvider.Path): import("effect/Layer").Layer<import("effect/rpc/Rpc").Handler<"platform.publicConfig.get">, Config.ConfigError, never>;
4
+ //# sourceMappingURL=publicConfigLayer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"publicConfigLayer.d.ts","sourceRoot":"","sources":["../../src/rpc-server/publicConfigLayer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,KAAK,cAAc,EAAU,MAAM,QAAQ,CAAC;AAC7D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qCAAqC,CAAC;AAExE,wBAAgB,iBAAiB,CAAC,CAAC,EAAE,CAAC,EAAE,WAAW,EAAE,UAAU,CAAC,OAAO,YAAY,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,cAAc,CAAC,IAAI,0HAQ9H"}
@@ -0,0 +1,9 @@
1
+ import { Config, Effect } from "effect";
2
+ export function publicConfigLayer(declaration, path) {
3
+ const application = declaration.application;
4
+ return application.toLayer(Effect.gen(function* () {
5
+ const value = yield* Config.schema(declaration.declaration.queries[0].success, path);
6
+ return application.of({ "platform.publicConfig.get": () => Effect.succeed(value) });
7
+ }));
8
+ }
9
+ //# sourceMappingURL=publicConfigLayer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"publicConfigLayer.js","sourceRoot":"","sources":["../../src/rpc-server/publicConfigLayer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAuB,MAAM,EAAE,MAAM,QAAQ,CAAC;AAG7D,MAAM,UAAU,iBAAiB,CAAO,WAAkD,EAAE,IAAmC;IAC9H,MAAM,WAAW,GAAG,WAAW,CAAC,WAAW,CAAC;IAC5C,OAAO,WAAW,CAAC,OAAO,CACzB,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;QACnB,MAAM,KAAK,GAAG,KAAK,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;QACrF,OAAO,WAAW,CAAC,EAAE,CAAC,EAAE,2BAA2B,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IACrF,CAAC,CAAC,CACF,CAAC;AACH,CAAC"}
@@ -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/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"}
@@ -0,0 +1,65 @@
1
+ import { AsyncLocalStorage } from "node:async_hooks";
2
+ import { Cause, Config, Context, Effect, Exit, ManagedRuntime } from "effect";
3
+ const RuntimeCacheKey = Symbol.for("@shivaedev/server/runtime-cache");
4
+ const sharedCache = Reflect.get(globalThis, RuntimeCacheKey);
5
+ const runtimeCache = sharedCache instanceof Map ? sharedCache : new Map();
6
+ Reflect.set(globalThis, RuntimeCacheKey, runtimeCache);
7
+ function cachedEntry(runtime) {
8
+ return runtime;
9
+ }
10
+ function make(layer) {
11
+ const managed = ManagedRuntime.make(layer);
12
+ const services = new AsyncLocalStorage();
13
+ function currentServices() {
14
+ return services.getStore();
15
+ }
16
+ function withAmbient(effect) {
17
+ const ambient = currentServices();
18
+ return ambient === undefined
19
+ ? effect
20
+ : Effect.flatMap(managed.contextEffect, (base) => Effect.provideContext(effect, Context.merge(base, ambient)));
21
+ }
22
+ const runPromiseExit = (effect, options) => managed.runPromiseExit(withAmbient(effect), options);
23
+ const runtime = {
24
+ contextEffect: Effect.map(managed.contextEffect, (base) => {
25
+ const ambient = currentServices();
26
+ return ambient === undefined ? base : Context.merge(base, ambient);
27
+ }),
28
+ currentServices,
29
+ dispose: () => managed.dispose(),
30
+ runPromise: async (effect, options) => {
31
+ const exit = await runPromiseExit(effect, options);
32
+ if (Exit.isSuccess(exit)) {
33
+ return exit.value;
34
+ }
35
+ throw Cause.squash(exit.cause);
36
+ },
37
+ runPromiseExit,
38
+ runWithServices: (context, evaluate) => services.run(context, evaluate),
39
+ };
40
+ return runtime;
41
+ }
42
+ const production = Effect.map(Effect.orDie(Config.String("NODE_ENV").pipe(Config.withDefault(""))), (environment) => environment === "production");
43
+ export function makePlatformRuntime(layer, options = {}) {
44
+ const key = Effect.runSync(production) ? undefined : options.developmentCacheKey;
45
+ if (key === undefined) {
46
+ return make(layer);
47
+ }
48
+ const cached = runtimeCache.get(key);
49
+ if (cached !== undefined) {
50
+ return cachedEntry(cached);
51
+ }
52
+ const runtime = make(layer);
53
+ const cachedRuntime = {
54
+ ...runtime,
55
+ dispose: async () => {
56
+ if (runtimeCache.get(key) === cachedRuntime) {
57
+ runtimeCache.delete(key);
58
+ }
59
+ await runtime.dispose();
60
+ },
61
+ };
62
+ runtimeCache.set(key, cachedRuntime);
63
+ return cachedRuntime;
64
+ }
65
+ //# sourceMappingURL=makePlatform.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"makePlatform.js","sourceRoot":"","sources":["../../src/runtime/makePlatform.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAErD,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,cAAc,EAAE,MAAM,QAAQ,CAAC;AAG9E,MAAM,eAAe,GAAG,MAAM,CAAC,GAAG,CAAC,iCAAiC,CAAC,CAAC;AACtE,MAAM,WAAW,GAAY,OAAO,CAAC,GAAG,CAAC,UAAU,EAAE,eAAe,CAAC,CAAC;AACtE,MAAM,YAAY,GAAkC,WAAW,YAAY,GAAG,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,GAAG,EAA4B,CAAC;AACnI,OAAO,CAAC,GAAG,CAAC,UAAU,EAAE,eAAe,EAAE,YAAY,CAAC,CAAC;AAGvD,SAAS,WAAW,CAAC,OAAgB;IACpC,OAAO,OAAO,CAAC;AAChB,CAAC;AACD,SAAS,IAAI,CAAyB,KAA0C;IAC/E,MAAM,OAAO,GAAG,cAAc,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC3C,MAAM,QAAQ,GAAG,IAAI,iBAAiB,EAA0B,CAAC;IACjE,SAAS,eAAe;QACvB,OAAO,QAAQ,CAAC,QAAQ,EAAE,CAAC;IAC5B,CAAC;IACD,SAAS,WAAW,CACnB,MAA0C;QAE1C,MAAM,OAAO,GAAG,eAAe,EAAE,CAAC;QAClC,OAAO,OAAO,KAAK,SAAS;YAC3B,CAAC,CAAC,MAAM;YACR,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,aAAa,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,MAAM,CAAC,cAAc,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC;IACjH,CAAC;IACD,MAAM,cAAc,GAA8D,CAAC,MAAM,EAAE,OAAO,EAAE,EAAE,CACrG,OAAO,CAAC,cAAc,CAAC,WAAW,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC,CAAC;IACtD,MAAM,OAAO,GAA4C;QACxD,aAAa,EAAE,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,aAAa,EAAE,CAAC,IAAI,EAAE,EAAE;YACzD,MAAM,OAAO,GAAG,eAAe,EAAE,CAAC;YAClC,OAAO,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;QACpE,CAAC,CAAC;QACF,eAAe;QACf,OAAO,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,OAAO,EAAE;QAChC,UAAU,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,EAAE;YACrC,MAAM,IAAI,GAAG,MAAM,cAAc,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;YACnD,IAAI,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC;gBAC1B,OAAO,IAAI,CAAC,KAAK,CAAC;YACnB,CAAC;YACD,MAAM,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAChC,CAAC;QACD,cAAc;QACd,eAAe,EAAE,CAAC,OAAO,EAAE,QAAQ,EAAE,EAAE,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,EAAE,QAAQ,CAAC;KACvE,CAAC;IACF,OAAO,OAAO,CAAC;AAChB,CAAC;AACD,MAAM,UAAU,GAAG,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,WAAW,EAAE,EAAE,CAAC,WAAW,KAAK,YAAY,CAAC,CAAC;AACnJ,MAAM,UAAU,mBAAmB,CAClC,KAA0C,EAC1C,OAAO,GAA2B,EAAE;IAEpC,MAAM,GAAG,GAAG,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,mBAAmB,CAAC;IACjF,IAAI,GAAG,KAAK,SAAS,EAAE,CAAC;QACvB,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC;IACpB,CAAC;IACD,MAAM,MAAM,GAAG,YAAY,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IACrC,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;QAC1B,OAAO,WAAW,CAAyB,MAAM,CAAC,CAAC;IACpD,CAAC;IACD,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC;IAC5B,MAAM,aAAa,GAA4C;QAC9D,GAAG,OAAO;QACV,OAAO,EAAE,KAAK,IAAI,EAAE;YACnB,IAAI,YAAY,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,aAAa,EAAE,CAAC;gBAC7C,YAAY,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YAC1B,CAAC;YACD,MAAM,OAAO,CAAC,OAAO,EAAE,CAAC;QACzB,CAAC;KACD,CAAC;IACF,YAAY,CAAC,GAAG,CAAC,GAAG,EAAE,aAAa,CAAC,CAAC;IACrC,OAAO,aAAa,CAAC;AACtB,CAAC"}
@@ -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/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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/runtime/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,6 @@
1
+ import { Layer } from "effect";
2
+ import { OtlpSerialization } from "effect/observability";
3
+ import { type SensitiveKey } from "@shivaedev/errors/sensitive.ts";
4
+ export declare function redactOtlpText(value: string, key?: string, sensitive?: SensitiveKey): string;
5
+ export declare const safeOtlpSerialization: Layer.Layer<OtlpSerialization.OtlpSerialization, never, OtlpSerialization.OtlpSerialization>;
6
+ //# sourceMappingURL=safeOtlpSerialization.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"safeOtlpSerialization.d.ts","sourceRoot":"","sources":["../src/safeOtlpSerialization.ts"],"names":[],"mappings":"AAAA,OAAO,EAAU,KAAK,EAAE,MAAM,QAAQ,CAAC;AAEvC,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AACzD,OAAO,EAAwC,KAAK,YAAY,EAAE,MAAM,gCAAgC,CAAC;AAOzG,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,SAAK,EAAE,SAAS,GAAE,YAA6B,UAE/F;AAkDD,eAAO,MAAM,qBAAqB,8FAUjC,CAAC"}
@@ -0,0 +1,67 @@
1
+ import { Effect, Layer } from "effect";
2
+ import { OtlpSerialization } from "effect/observability";
3
+ import { isSensitiveKey, REDACTED, redactText } from "@shivaedev/errors/sensitive.ts";
4
+ import { RedactionPolicy } from "#RedactionPolicy.ts";
5
+ import { redactOtlpUrl } from "#redactOtlpUrl.ts";
6
+ function otlpSensitive(sensitive) {
7
+ return (key) => sensitive(key) || ["db.user", "db.user.name", "db.connection_string"].includes(key.toLowerCase());
8
+ }
9
+ export function redactOtlpText(value, key = "", sensitive = isSensitiveKey) {
10
+ return redactText(redactOtlpUrl(value, key), otlpSensitive(sensitive));
11
+ }
12
+ function attributeValue(value, key, sensitive) {
13
+ return {
14
+ ...value,
15
+ ...(typeof value.stringValue === "string" ? { stringValue: redactOtlpText(value.stringValue, key, sensitive) } : {}),
16
+ ...(value.arrayValue ? { arrayValue: { values: value.arrayValue.values.map((item) => attributeValue(item, key, sensitive)) } } : {}),
17
+ ...(value.kvlistValue ? { kvlistValue: { values: attributes(value.kvlistValue.values, sensitive) } } : {}),
18
+ };
19
+ }
20
+ function attributes(values, sensitive) {
21
+ return values.map(({ key, value }) => ({
22
+ key,
23
+ value: sensitive(key) ? { stringValue: REDACTED } : attributeValue(value, key, sensitive),
24
+ }));
25
+ }
26
+ function spanName(span) {
27
+ if (span.kind === 2) {
28
+ const method = span.attributes.find(({ key }) => key === "http.request.method")?.value.stringValue;
29
+ const route = span.attributes.find(({ key }) => key === "http.route")?.value.stringValue;
30
+ if (typeof method === "string") {
31
+ return typeof route === "string" ? `${method} ${route}` : method;
32
+ }
33
+ }
34
+ return span.name;
35
+ }
36
+ function redactTraces(data, sensitive) {
37
+ function text(value) {
38
+ return redactOtlpText(value, "", sensitive);
39
+ }
40
+ return {
41
+ ...data,
42
+ resourceSpans: data.resourceSpans.map((resource) => ({
43
+ ...resource,
44
+ resource: { ...resource.resource, attributes: attributes(resource.resource.attributes, sensitive) },
45
+ scopeSpans: resource.scopeSpans.map((scope) => ({
46
+ ...scope,
47
+ spans: scope.spans.map((span) => ({
48
+ ...span,
49
+ attributes: attributes(span.attributes, sensitive),
50
+ events: span.events.map((event) => ({ ...event, attributes: attributes(event.attributes, sensitive), name: text(event.name) })),
51
+ links: span.links.map((link) => ({ ...link, attributes: attributes(link.attributes, sensitive) })),
52
+ name: text(spanName(span)),
53
+ status: { ...span.status, ...(span.status.message === undefined ? {} : { message: text(span.status.message) }) },
54
+ })),
55
+ })),
56
+ })),
57
+ };
58
+ }
59
+ export const safeOtlpSerialization = Layer.effect(OtlpSerialization.OtlpSerialization, Effect.gen(function* () {
60
+ const serialization = yield* OtlpSerialization.OtlpSerialization;
61
+ const sensitive = otlpSensitive(yield* RedactionPolicy);
62
+ return OtlpSerialization.OtlpSerialization.of({
63
+ ...serialization,
64
+ traces: (data) => serialization.traces(redactTraces(data, sensitive)),
65
+ });
66
+ }));
67
+ //# sourceMappingURL=safeOtlpSerialization.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"safeOtlpSerialization.js","sourceRoot":"","sources":["../src/safeOtlpSerialization.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ import { Rpc, type RpcGroup } from "effect/rpc";
2
+ export declare function schemaSensitiveKeys<R extends Rpc.Any>(group: RpcGroup.RpcGroup<R>, extra?: readonly string[]): ((key: string) => boolean) & {
3
+ maskFailure: (tag: string | undefined, reason: "Fail" | "Die") => boolean;
4
+ };
5
+ //# sourceMappingURL=schemaSensitiveKeys.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schemaSensitiveKeys.d.ts","sourceRoot":"","sources":["../src/schemaSensitiveKeys.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,GAAG,EAAE,KAAK,QAAQ,EAAE,MAAM,YAAY,CAAC;AA0GhD,wBAAgB,mBAAmB,CAAC,CAAC,SAAS,GAAG,CAAC,GAAG,EAAE,KAAK,EAAE,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,KAAK,GAAE,SAAS,MAAM,EAAO,UAoCrF,MAAM;uBACb,MAAM,GAAG,SAAS,UAAU,MAAM,GAAG,KAAK;EAG9D"}
@@ -0,0 +1,143 @@
1
+ import { Predicate } from "effect";
2
+ import { Rpc } from "effect/rpc";
3
+ import { isSensitiveKey } from "@shivaedev/errors/sensitive.ts";
4
+ function children(ast) {
5
+ switch (ast._tag) {
6
+ case "Objects":
7
+ return [...ast.propertySignatures.map((property) => property.type), ...ast.indexSignatures.flatMap((index) => [index.parameter, index.type])];
8
+ case "Arrays":
9
+ return [...ast.elements, ...ast.rest];
10
+ case "Union":
11
+ return ast.types;
12
+ case "Declaration":
13
+ return ast.typeParameters;
14
+ case "Suspend":
15
+ return [ast.thunk()];
16
+ default:
17
+ return [];
18
+ }
19
+ }
20
+ function sensitiveCheck(check) {
21
+ return check.annotations?.sensitive === true || (check._tag === "FilterGroup" && check.checks.some(sensitiveCheck));
22
+ }
23
+ function marked(ast, seen = new Set()) {
24
+ if (seen.has(ast)) {
25
+ return false;
26
+ }
27
+ seen.add(ast);
28
+ if (ast.annotations?.sensitive === true
29
+ || ast.context?.annotations?.sensitive === true
30
+ || ast.checks?.some(sensitiveCheck)
31
+ || (Predicate.hasProperty(ast.annotations?.representation, "id") && ast.annotations.representation.id === "effect/schema/Redacted")) {
32
+ return true;
33
+ }
34
+ const nested = ast._tag === "Objects" ? ast.indexSignatures.map((index) => index.type) : children(ast);
35
+ return (ast.encoding?.some((link) => marked(link.to, seen)) ?? false) || nested.some((type) => marked(type, seen));
36
+ }
37
+ function containsSensitive(ast, keys) {
38
+ return (marked(ast)
39
+ || propertiesOf(ast).some((property) => typeof property.name === "string" && (keys.has(property.name) || isSensitiveKey(property.name))));
40
+ }
41
+ function collectEncodedKeys(ast, keys) {
42
+ let source = ast;
43
+ let sensitive = false;
44
+ for (const link of ast.encoding ?? []) {
45
+ sensitive ||= containsSensitive(source, keys);
46
+ if (sensitive) {
47
+ for (const property of propertiesOf(link.to)) {
48
+ if (typeof property.name === "string") {
49
+ keys.add(property.name);
50
+ }
51
+ }
52
+ }
53
+ source = link.to;
54
+ }
55
+ }
56
+ function fixedOutput(ast) {
57
+ if (ast._tag === "Union") {
58
+ return ast.types.every(fixedOutput);
59
+ }
60
+ return ast._tag === "Objects" && ast.indexSignatures.length === 0;
61
+ }
62
+ function maskedValue(ast, keys, seen = new Set()) {
63
+ if (seen.has(ast)) {
64
+ return false;
65
+ }
66
+ seen.add(ast);
67
+ if (marked(ast)) {
68
+ return true;
69
+ }
70
+ let source = ast;
71
+ let sensitive = false;
72
+ for (const link of ast.encoding ?? []) {
73
+ sensitive ||= containsSensitive(source, keys);
74
+ if (sensitive && !fixedOutput(link.to)) {
75
+ return true;
76
+ }
77
+ source = link.to;
78
+ }
79
+ const nested = ast._tag === "Objects" ? ast.indexSignatures.map((index) => index.type) : children(ast);
80
+ return nested.some((type) => maskedValue(type, keys, seen));
81
+ }
82
+ function collect(ast, nodes, encodings = true) {
83
+ if (nodes.has(ast)) {
84
+ return;
85
+ }
86
+ nodes.add(ast);
87
+ for (const child of [...children(ast), ...(encodings ? (ast.encoding?.map((link) => link.to) ?? []) : [])]) {
88
+ collect(child, nodes, encodings);
89
+ }
90
+ }
91
+ function propertiesOf(ast) {
92
+ const nodes = new Set();
93
+ collect(ast, nodes, false);
94
+ return [...nodes].flatMap((node) => (node._tag === "Objects" ? node.propertySignatures : []));
95
+ }
96
+ function collectFieldKeys(properties, keys, sensitive) {
97
+ for (const property of properties) {
98
+ if (typeof property.name === "string" && sensitive(property.type)) {
99
+ keys.add(property.name);
100
+ }
101
+ }
102
+ }
103
+ export function schemaSensitiveKeys(group, extra = []) {
104
+ const keys = new Set(extra);
105
+ const nodes = new Set();
106
+ const requests = [];
107
+ for (const rpc of group.requests.values()) {
108
+ if (Rpc.isRpc(rpc)) {
109
+ requests.push(rpc);
110
+ }
111
+ }
112
+ for (const rpc of requests) {
113
+ const schemas = [
114
+ rpc.payloadSchema,
115
+ rpc.successSchema,
116
+ rpc.errorSchema,
117
+ rpc.defectSchema,
118
+ ...[...rpc.middlewares].map((m) => m.error),
119
+ ];
120
+ for (const schema of schemas) {
121
+ collect(schema.ast, nodes);
122
+ }
123
+ }
124
+ const properties = [...nodes].flatMap((ast) => (ast._tag === "Objects" ? ast.propertySignatures : []));
125
+ collectFieldKeys(properties, keys, marked);
126
+ let previousSize;
127
+ do {
128
+ previousSize = keys.size;
129
+ collectFieldKeys(properties, keys, (ast) => maskedValue(ast, keys));
130
+ for (const ast of nodes) {
131
+ collectEncodedKeys(ast, keys);
132
+ }
133
+ } while (keys.size !== previousSize);
134
+ const roots = requests.map((rpc) => ({
135
+ die: maskedValue(rpc.defectSchema.ast, keys),
136
+ fail: [rpc.errorSchema, ...[...rpc.middlewares].map((m) => m.error)].some((schema) => maskedValue(schema.ast, keys)),
137
+ tag: rpc._tag,
138
+ }));
139
+ return Object.assign((key) => keys.has(key) || isSensitiveKey(key), {
140
+ maskFailure: (tag, reason) => roots.some((root) => (tag === undefined || tag === root.tag) && (reason === "Fail" ? root.fail : root.die)),
141
+ });
142
+ }
143
+ //# sourceMappingURL=schemaSensitiveKeys.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schemaSensitiveKeys.js","sourceRoot":"","sources":["../src/schemaSensitiveKeys.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { Config, Effect } from "effect";
2
+ export declare const setupDatabases: () => Effect.Effect<void, Config.ConfigError, never>;
3
+ //# sourceMappingURL=setupDatabases.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"setupDatabases.d.ts","sourceRoot":"","sources":["../src/setupDatabases.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAGxC,eAAO,MAAM,cAAc,sDAQzB,CAAC"}
@@ -0,0 +1,12 @@
1
+ import { Config, Effect } from "effect";
2
+ import { localPostgres } from "@shivaedev/local-postgres/server/localPostgres.ts";
3
+ export const setupDatabases = Effect.fn("Platform.setupDatabases")(function* () {
4
+ const config = yield* Config.all({
5
+ "DATABASE_URL": Config.String("DATABASE_URL"),
6
+ "DOCKER_CONTEXT": Config.String("DOCKER_CONTEXT").pipe(Config.withDefault("")),
7
+ "DOCKER_HOST": Config.String("DOCKER_HOST").pipe(Config.withDefault("")),
8
+ "TEST_DATABASE_URL": Config.String("TEST_DATABASE_URL"),
9
+ });
10
+ yield* Effect.sync(() => localPostgres(config).prepareDatabases([config.DATABASE_URL, config.TEST_DATABASE_URL]));
11
+ });
12
+ //# sourceMappingURL=setupDatabases.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"setupDatabases.js","sourceRoot":"","sources":["../src/setupDatabases.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AACxC,OAAO,EAAE,aAAa,EAAE,MAAM,mDAAmD,CAAC;AAElF,MAAM,CAAC,MAAM,cAAc,GAAG,MAAM,CAAC,EAAE,CAAC,yBAAyB,CAAC,CAAC,QAAQ,CAAC;IAC3E,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC;QAChC,cAAc,EAAE,MAAM,CAAC,MAAM,CAAC,cAAc,CAAC;QAC7C,gBAAgB,EAAE,MAAM,CAAC,MAAM,CAAC,gBAAgB,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC;QAC9E,aAAa,EAAE,MAAM,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC;QACxE,mBAAmB,EAAE,MAAM,CAAC,MAAM,CAAC,mBAAmB,CAAC;KACvD,CAAC,CAAC;IACH,KAAK,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,gBAAgB,CAAC,CAAC,MAAM,CAAC,YAAY,EAAE,MAAM,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC;AACnH,CAAC,CAAC,CAAC"}
@@ -0,0 +1,4 @@
1
+ import type { Rpc, RpcGroup } from "effect/rpc";
2
+ import { RequestTracing } from "@shivaedev/identity/middleware.ts";
3
+ export declare function tracedGroup<R extends Rpc.Any>(group: RpcGroup.RpcGroup<R>): RpcGroup.RpcGroup<Rpc.AddMiddleware<R, typeof RequestTracing>>;
4
+ //# sourceMappingURL=tracedGroup.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tracedGroup.d.ts","sourceRoot":"","sources":["../src/tracedGroup.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,GAAG,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAChD,OAAO,EAAE,cAAc,EAAE,MAAM,mCAAmC,CAAC;AAEnE,wBAAgB,WAAW,CAAC,CAAC,SAAS,GAAG,CAAC,GAAG,EAAE,KAAK,EAAE,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,kEAUzE"}
@@ -0,0 +1,13 @@
1
+ import { RequestTracing } from "@shivaedev/identity/middleware.ts";
2
+ export function tracedGroup(group) {
3
+ const traced = group.middleware(RequestTracing);
4
+ for (const rpc of traced.requests.values()) {
5
+ const middlewares = new Set(rpc.middlewares);
6
+ middlewares.delete(RequestTracing);
7
+ middlewares.add(RequestTracing);
8
+ // Native middleware() clones each RPC but cannot move an existing middleware to the outermost position.
9
+ Object.assign(rpc, { middlewares });
10
+ }
11
+ return traced;
12
+ }
13
+ //# sourceMappingURL=tracedGroup.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tracedGroup.js","sourceRoot":"","sources":["../src/tracedGroup.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,MAAM,mCAAmC,CAAC;AAEnE,MAAM,UAAU,WAAW,CAAoB,KAA2B;IACzE,MAAM,MAAM,GAAG,KAAK,CAAC,UAAU,CAAC,cAAc,CAAC,CAAC;IAChD,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,QAAQ,CAAC,MAAM,EAAE,EAAE,CAAC;QAC5C,MAAM,WAAW,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;QAC7C,WAAW,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC;QACnC,WAAW,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;QAChC,wGAAwG;QACxG,MAAM,CAAC,MAAM,CAAC,GAAG,EAAE,EAAE,WAAW,EAAE,CAAC,CAAC;IACrC,CAAC;IACD,OAAO,MAAM,CAAC;AACf,CAAC"}
package/package.json CHANGED
@@ -1,10 +1,113 @@
1
1
  {
2
2
  "name": "@shivaedev/server",
3
- "version": "0.0.0",
4
- "description": "Placeholder for the ShivaeDev server package.",
5
- "license": "MIT",
3
+ "version": "0.2.0",
4
+ "description": "The Effect application host: HTTP and RPC serving, health, OTLP export, database and migrations, and development mode",
5
+ "keywords": [
6
+ "effect"
7
+ ],
8
+ "homepage": "https://github.com/ShivaeDev/platform/tree/main/packages/server#readme",
9
+ "bugs": {
10
+ "url": "https://github.com/ShivaeDev/platform/issues"
11
+ },
6
12
  "repository": {
7
13
  "type": "git",
8
- "url": "git+https://github.com/ShivaeDev/platform.git"
14
+ "url": "git+https://github.com/ShivaeDev/platform.git",
15
+ "directory": "packages/server"
16
+ },
17
+ "license": "MIT",
18
+ "sideEffects": false,
19
+ "type": "module",
20
+ "imports": {
21
+ "#test/*": "./src/test-support/*",
22
+ "#*.ts": {
23
+ "source": "./src/*.ts",
24
+ "types": "./dist/*.d.ts",
25
+ "default": "./dist/*.js"
26
+ }
27
+ },
28
+ "exports": {
29
+ "./*.ts": {
30
+ "source": "./src/*.ts",
31
+ "types": "./dist/*.d.ts",
32
+ "default": "./dist/*.js"
33
+ },
34
+ "./package.json": "./package.json"
35
+ },
36
+ "files": [
37
+ "dist",
38
+ "src",
39
+ "!src/**/*.test.ts",
40
+ "!src/**/*.test.tsx",
41
+ "!src/**/*.spec.ts",
42
+ "!src/**/*.spec.tsx",
43
+ "!src/**/test-support",
44
+ "README.md"
45
+ ],
46
+ "dependencies": {
47
+ "@shivaedev/contract": "0.18.0",
48
+ "@shivaedev/errors": "0.1.0",
49
+ "@shivaedev/http": "0.1.0",
50
+ "@shivaedev/identity": "0.2.0",
51
+ "@shivaedev/local-postgres": "0.7.0",
52
+ "@shivaedev/sql": "0.23.0"
53
+ },
54
+ "devDependencies": {
55
+ "@effect/platform-node": "4.0.5",
56
+ "@effect/sql-pg": "4.0.5",
57
+ "@effect/vitest": "4.0.5",
58
+ "@shivaedev/jobs": "0.21.0",
59
+ "@shivaedev/quality": "0.42.0",
60
+ "@shivaedev/test": "0.10.0",
61
+ "@shivaedev/test-sql": "0.10.1",
62
+ "@shivaedev/test-story": "0.21.1",
63
+ "@types/node": "24.19.2",
64
+ "@types/pg": "8.20.0",
65
+ "better-auth": "1.7.11",
66
+ "effect": "4.0.5",
67
+ "pg": "8.23.0",
68
+ "pg-boss": "12.38.0",
69
+ "typescript": "7.0.2",
70
+ "vitest": "5.0.5"
71
+ },
72
+ "peerDependencies": {
73
+ "@effect/platform-node": "4.0.5",
74
+ "@effect/sql-pg": "4.0.5",
75
+ "@effect/vitest": "4.0.5",
76
+ "better-auth": "1.7.11",
77
+ "effect": "4.0.5",
78
+ "pg": "8.23.0"
79
+ },
80
+ "peerDependenciesMeta": {
81
+ "@effect/platform-node": {
82
+ "optional": true
83
+ },
84
+ "@effect/sql-pg": {
85
+ "optional": true
86
+ },
87
+ "@effect/vitest": {
88
+ "optional": true
89
+ },
90
+ "better-auth": {
91
+ "optional": true
92
+ },
93
+ "pg": {
94
+ "optional": true
95
+ }
96
+ },
97
+ "engines": {
98
+ "node": ">=24"
99
+ },
100
+ "publishConfig": {
101
+ "access": "public",
102
+ "provenance": true
103
+ },
104
+ "quality": {
105
+ "runtime": "server"
106
+ },
107
+ "scripts": {
108
+ "build": "node --eval \"import('node:fs').then(({ rmSync }) => rmSync('dist', { force: true, recursive: true }))\" && tsc --project tsconfig.build.json",
109
+ "ready": "pnpm typecheck && pnpm test && pnpm build",
110
+ "test": "vitest run",
111
+ "typecheck": "tsc --noEmit"
9
112
  }
10
113
  }