effect-app 4.0.0-beta.284 → 4.0.0-beta.286

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 (62) hide show
  1. package/CHANGELOG.md +12 -0
  2. package/dist/DataDependencies.d.ts +252 -23
  3. package/dist/DataDependencies.d.ts.map +1 -1
  4. package/dist/DataDependencies.js +40 -20
  5. package/dist/Model/Repository/internal/internal.d.ts.map +1 -1
  6. package/dist/Model/Repository/internal/internal.js +2 -2
  7. package/dist/Model/query/new-kid-interpreter.d.ts.map +1 -1
  8. package/dist/Model/query/new-kid-interpreter.js +2 -2
  9. package/dist/RequestContext.d.ts +47 -117
  10. package/dist/RequestContext.d.ts.map +1 -1
  11. package/dist/RequestContext.js +3 -12
  12. package/dist/RequestScopedDependencies.d.ts +21 -0
  13. package/dist/RequestScopedDependencies.d.ts.map +1 -0
  14. package/dist/RequestScopedDependencies.js +16 -0
  15. package/dist/Schema/Class.d.ts +1 -1
  16. package/dist/Schema/Class.d.ts.map +1 -1
  17. package/dist/Schema/Class.js +2 -2
  18. package/dist/Schema/ext.d.ts +1 -1
  19. package/dist/Schema/ext.d.ts.map +1 -1
  20. package/dist/Schema/ext.js +1 -1
  21. package/dist/Schema/moreStrings.d.ts +1 -1
  22. package/dist/Schema/moreStrings.d.ts.map +1 -1
  23. package/dist/Schema/moreStrings.js +1 -1
  24. package/dist/Schema/numbers.d.ts +1 -1
  25. package/dist/Schema/numbers.d.ts.map +1 -1
  26. package/dist/Schema/schema.d.ts +1 -1
  27. package/dist/Schema/schema.d.ts.map +1 -1
  28. package/dist/Schema/schema.js +2 -2
  29. package/dist/Schema/strings.d.ts +1 -1
  30. package/dist/Schema/strings.d.ts.map +1 -1
  31. package/dist/Schema.d.ts +1 -1
  32. package/dist/Schema.d.ts.map +1 -1
  33. package/dist/Schema.js +2 -2
  34. package/dist/Store.d.ts +4 -11
  35. package/dist/Store.d.ts.map +1 -1
  36. package/dist/Store.js +4 -12
  37. package/dist/client/apiClientFactory.d.ts.map +1 -1
  38. package/dist/client/apiClientFactory.js +49 -39
  39. package/dist/rpc/Invalidation.d.ts +2319 -591
  40. package/dist/rpc/Invalidation.d.ts.map +1 -1
  41. package/dist/rpc/Invalidation.js +5 -2
  42. package/dist/setupRequest.d.ts +1 -0
  43. package/dist/setupRequest.d.ts.map +1 -1
  44. package/dist/setupRequest.js +8 -5
  45. package/package.json +2 -2
  46. package/src/DataDependencies.ts +59 -23
  47. package/src/Model/Repository/internal/internal.ts +1 -1
  48. package/src/Model/query/new-kid-interpreter.ts +1 -1
  49. package/src/RequestContext.ts +2 -49
  50. package/src/RequestScopedDependencies.ts +45 -0
  51. package/src/Schema/Class.ts +1 -1
  52. package/src/Schema/ext.ts +1 -1
  53. package/src/Schema/moreStrings.ts +1 -1
  54. package/src/Schema/numbers.ts +1 -1
  55. package/src/Schema/schema.ts +1 -1
  56. package/src/Schema/strings.ts +1 -1
  57. package/src/Schema.ts +1 -1
  58. package/src/Store.ts +7 -11
  59. package/src/client/apiClientFactory.ts +21 -6
  60. package/src/rpc/Invalidation.ts +4 -1
  61. package/src/setupRequest.ts +8 -4
  62. package/test/special.test.ts +1 -1
@@ -224,7 +224,7 @@ const makeApiClientFactory = Effect
224
224
  dependencies === undefined
225
225
  ? Effect.void
226
226
  : Effect.gen(function*() {
227
- const dependencyRecorder = yield* DataDependencies.DataDependencyRecorder
227
+ const dependencyRecorder = yield* DataDependencies.getDataDependencyRecorder
228
228
  if (options?.reads) {
229
229
  yield* Effect.forEach(dependencies.reads, dependencyRecorder.read, { discard: true })
230
230
  }
@@ -308,11 +308,14 @@ const makeApiClientFactory = Effect
308
308
  Effect.provide(svcs)
309
309
  )
310
310
  return isCommand ? unwrapCommand(rpcEffect) : isStream ? rpcEffect : unwrapQuery(rpcEffect)
311
- })
311
+ }),
312
+ // Forwarding the server's dependency metadata needs a recorder in scope. A parent
313
+ // query/command (vue) provides one; a top-level call gets a fresh per-request one.
314
+ DataDependencies.ensureDataDependencyRecorder
312
315
  )
313
316
 
314
- const buildStream = (input: any) =>
315
- Stream.unwrap(
317
+ const buildStream = (input: any) => {
318
+ const stream = Stream.unwrap(
316
319
  mr.contextEffect.pipe(
317
320
  Effect.flatMap((svcs) =>
318
321
  TheClient
@@ -330,7 +333,7 @@ const makeApiClientFactory = Effect
330
333
  yield* Effect.forEach(metadata.invalidateQueries, invalidationKeys.add, {
331
334
  discard: true
332
335
  })
333
- const dependencyRecorder = yield* DataDependencies.DataDependencyRecorder
336
+ const dependencyRecorder = yield* DataDependencies.getDataDependencyRecorder
334
337
  yield* Effect.forEach(
335
338
  metadata.dataDependencies.reads,
336
339
  dependencyRecorder.read,
@@ -358,7 +361,7 @@ const makeApiClientFactory = Effect
358
361
  yield* Effect.forEach(metadata.invalidateQueries, invalidationKeys.add, {
359
362
  discard: true
360
363
  })
361
- const dependencyRecorder = yield* DataDependencies.DataDependencyRecorder
364
+ const dependencyRecorder = yield* DataDependencies.getDataDependencyRecorder
362
365
  yield* Effect.forEach(
363
366
  metadata.dataDependencies.writes,
364
367
  dependencyRecorder.write,
@@ -378,6 +381,18 @@ const makeApiClientFactory = Effect
378
381
  )
379
382
  )
380
383
  )
384
+ // Forwarding the server's dependency metadata needs a recorder in scope. A parent
385
+ // query/command (vue) provides one; a top-level stream call gets a fresh per-request one.
386
+ return Stream.unwrap(
387
+ Effect.map(
388
+ DataDependencies.DataDependencyRecorder,
389
+ (current) =>
390
+ current === "root"
391
+ ? Stream.provide(stream, DataDependencies.DataDependencyRecorder.layer)
392
+ : stream
393
+ )
394
+ )
395
+ }
381
396
 
382
397
  // @ts-expect-error doc
383
398
  prev[cur] = Object.keys(fields).length === 0
@@ -53,7 +53,10 @@ export const CommandMetaData = S.Struct({
53
53
  })
54
54
  export type CommandMetaData = S.Schema.Type<typeof CommandMetaData>
55
55
 
56
- export const emptyDataDependencies: DataDependencies.DataDependencySet = { reads: [], writes: [] }
56
+ export const emptyDataDependencies: DataDependencies.DataDependencySet = {
57
+ reads: DataDependencies.empty(),
58
+ writes: DataDependencies.empty()
59
+ }
57
60
 
58
61
  export const makeMetaData = (
59
62
  invalidateQueries: InvalidationKeys,
@@ -1,9 +1,11 @@
1
1
  import * as Tracer from "effect/Tracer"
2
2
  import { SqlClient } from "effect/unstable/sql"
3
+ import { DataDependencyRecorder } from "./DataDependencies.ts"
3
4
  import * as Effect from "./Effect.ts"
4
5
  import * as Layer from "./Layer.ts"
5
6
  import * as Option from "./Option.ts"
6
7
  import { LocaleRef, RequestContext, spanAttributes } from "./RequestContext.ts"
8
+ import * as RequestScopedDependencies from "./RequestScopedDependencies.ts"
7
9
  import { NonEmptyString255 } from "./Schema.ts"
8
10
  import { ContextMapContainer, storeId } from "./Store.ts"
9
11
 
@@ -58,6 +60,8 @@ export interface SetupRequestOptions {
58
60
  readonly withTransaction?: boolean
59
61
  }
60
62
 
63
+ export const requestStateLayer = RequestScopedDependencies.layer(ContextMapContainer, DataDependencyRecorder)
64
+
61
65
  // Build `layer` against the ambient (request) scope rather than a sub-scope of the
62
66
  // returned Effect. Required when the returned value is a streaming HttpServerResponse:
63
67
  // the response body keeps producing chunks (and using layer-provided state) after the
@@ -80,7 +84,7 @@ export const setupRequestContextFromCurrent =
80
84
  .pipe(
81
85
  options?.withTransaction === true ? withSqlTransaction : (_) => _,
82
86
  withRequestSpan(name, options),
83
- Effect.provide(ContextMapContainer.layer, { local: true })
87
+ Effect.provide(requestStateLayer, { local: true })
84
88
  )
85
89
 
86
90
  // Streaming variant: binds ContextMapContainer to the ambient (request) scope so its
@@ -92,7 +96,7 @@ export const setupStreamingRequestContextFromCurrent =
92
96
  self.pipe(
93
97
  options?.withTransaction === true ? withSqlTransaction : (_) => _,
94
98
  withRequestSpan(name, options),
95
- provideOnRequestScope(ContextMapContainer.layer)
99
+ provideOnRequestScope(requestStateLayer)
96
100
  )
97
101
 
98
102
  // TODO: consider integrating Effect.withParentSpan
@@ -102,7 +106,7 @@ export function setupRequestContext<R, E, A>(
102
106
  options?: SetupRequestOptions
103
107
  ) {
104
108
  const layer = Layer.mergeAll(
105
- ContextMapContainer.layer,
109
+ requestStateLayer,
106
110
  Layer.succeed(LocaleRef, requestContext.locale),
107
111
  Layer.succeed(storeId, requestContext.namespace)
108
112
  )
@@ -121,7 +125,7 @@ export function setupRequestContextWithCustomSpan<R, E, A>(
121
125
  options?: Tracer.SpanOptions & SetupRequestOptions
122
126
  ) {
123
127
  const layer = Layer.mergeAll(
124
- ContextMapContainer.layer,
128
+ requestStateLayer,
125
129
  Layer.succeed(LocaleRef, requestContext.locale),
126
130
  Layer.succeed(storeId, requestContext.namespace)
127
131
  )
@@ -469,7 +469,7 @@ describe("OpaqueFacade", () => {
469
469
  })
470
470
 
471
471
  it("keeps generated struct facades decodable with public statics", () => {
472
- const input: RequestContext.Encoded = {
472
+ const input: typeof RequestContext.Encoded = {
473
473
  span: { traceId: "trace", spanId: "span", sampled: true },
474
474
  name: "operation",
475
475
  locale: "en",