@effect-app/infra 2.4.0 → 2.5.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 (29) hide show
  1. package/CHANGELOG.md +12 -0
  2. package/_cjs/services/Repository/ext.cjs +12 -12
  3. package/_cjs/services/Repository/ext.cjs.map +1 -1
  4. package/_cjs/services/Repository/legacy.cjs +2 -1
  5. package/_cjs/services/Repository/legacy.cjs.map +1 -1
  6. package/_cjs/services/RepositoryBase.cjs +15 -10
  7. package/_cjs/services/RepositoryBase.cjs.map +1 -1
  8. package/dist/services/Operations.d.ts +8 -8
  9. package/dist/services/OperationsRepo.d.ts +1 -1
  10. package/dist/services/Repository/ext.d.ts +10 -10
  11. package/dist/services/Repository/ext.d.ts.map +1 -1
  12. package/dist/services/Repository/ext.js +16 -16
  13. package/dist/services/Repository/legacy.d.ts +20 -20
  14. package/dist/services/Repository/legacy.d.ts.map +1 -1
  15. package/dist/services/Repository/legacy.js +3 -2
  16. package/dist/services/Repository/service.d.ts +5 -5
  17. package/dist/services/Repository/service.d.ts.map +1 -1
  18. package/dist/services/RepositoryBase.d.ts +6 -6
  19. package/dist/services/RepositoryBase.d.ts.map +1 -1
  20. package/dist/services/RepositoryBase.js +19 -24
  21. package/package.json +1 -1
  22. package/src/services/Repository/ext.ts +21 -43
  23. package/src/services/Repository/legacy.ts +20 -13
  24. package/src/services/Repository/service.ts +6 -5
  25. package/src/services/RepositoryBase.ts +28 -37
  26. package/vitest.config.ts.timestamp-1711656440838-19c636fe320df.mjs +0 -0
  27. package/vitest.config.ts.timestamp-1711724061890-6ecedb0a07fdd.mjs +0 -0
  28. package/vitest.config.ts.timestamp-1711743489537-da8d9e5f66c9f.mjs +0 -0
  29. package/vitest.config.ts.timestamp-1711744615239-dcf257a844e01.mjs +0 -37
@@ -14,21 +14,22 @@ export interface Repository<
14
14
  Encoded extends { id: string },
15
15
  Evt,
16
16
  ItemType extends string,
17
- IdKey extends keyof T
17
+ IdKey extends keyof T,
18
+ R
18
19
  > {
19
20
  readonly itemType: ItemType
20
21
  readonly idKey: IdKey
21
- readonly find: (id: T[IdKey]) => Effect<Option<T>>
22
- readonly all: Effect<T[]>
22
+ readonly find: (id: T[IdKey]) => Effect<Option<T>, never, R>
23
+ readonly all: Effect<T[], never, R>
23
24
  readonly saveAndPublish: (
24
25
  items: Iterable<T>,
25
26
  events?: Iterable<Evt>
26
- ) => Effect<void, InvalidStateError | OptimisticConcurrencyException>
27
+ ) => Effect<void, InvalidStateError | OptimisticConcurrencyException, R>
27
28
  readonly changeFeed: PubSub.PubSub<[T[], "save" | "remove"]>
28
29
  readonly removeAndPublish: (
29
30
  items: Iterable<T>,
30
31
  events?: Iterable<Evt>
31
- ) => Effect<void>
32
+ ) => Effect<void, never, R>
32
33
 
33
34
  readonly query: {
34
35
  <A, R, Encoded2 extends FieldValues, TType extends "one" | "many" | "count" = "many">(
@@ -82,16 +82,13 @@ export function makeRepoInternal<
82
82
  ) {
83
83
  return Effect
84
84
  .gen(function*() {
85
- const rctx = yield* Effect.context<R>()
86
85
  const encodeMany = flow(
87
86
  S.encode(S.Array(schema)),
88
- Effect.provide(rctx),
89
87
  Effect.withSpan("encodeMany", { captureStackTrace: false })
90
88
  )
91
- const decode = flow(S.decode(schema), Effect.provide(rctx))
89
+ const decode = S.decode(schema)
92
90
  const decodeMany = flow(
93
91
  S.decode(S.Array(schema)),
94
- Effect.provide(rctx),
95
92
  Effect.withSpan("decodeMany", { captureStackTrace: false })
96
93
  )
97
94
 
@@ -118,30 +115,25 @@ export function makeRepoInternal<
118
115
  .pipe(Effect.map((_) => _ as T[]))
119
116
 
120
117
  const fieldsSchema = schema as unknown as { fields: any }
118
+ // assumes the id field never needs a service...
121
119
  const i = ("fields" in fieldsSchema ? S.Struct(fieldsSchema["fields"]) as unknown as typeof schema : schema)
122
- .pipe((_) =>
123
- _.ast._tag === "Union"
120
+ .pipe((_) => {
121
+ let ast = _.ast
122
+ if (ast._tag === "Declaration") ast = ast.typeParameters[0]!
123
+
124
+ const s = S.make(ast) as unknown as Schema<T, Encoded, R>
125
+
126
+ return ast._tag === "Union"
124
127
  // we need to get the TypeLiteral, incase of class it's behind a transform...
125
- ? S.Union(..._.ast.types.map((_) =>
126
- (S.make(_._tag === "Transformation" ? _.from : _) as unknown as Schema<T, Encoded>)
127
- .pipe(S.pick(idKey as any))
128
- ))
129
- : _
130
- .ast
131
- ._tag === "Transformation"
132
- ? (S
133
- .make(
134
- _
135
- .ast
136
- .from
137
- ) as unknown as Schema<T, Encoded>)
138
- .pipe(S
139
- .pick(idKey as any))
140
- : _
141
- .pipe(S
142
- .pick(idKey as any))
143
- )
144
- const encodeId = flow(S.encode(i), Effect.provide(rctx))
128
+ ? S.Union(
129
+ ...ast.types.map((_) =>
130
+ (S.make(_._tag === "Transformation" ? _.from : _) as unknown as Schema<T, Encoded>)
131
+ .pipe(S.pick(idKey as any))
132
+ )
133
+ )
134
+ : s.pipe(S.pick(idKey as any))
135
+ })
136
+ const encodeId = S.encode(i)
145
137
  function findEId(id: Encoded["id"]) {
146
138
  return Effect.flatMap(
147
139
  store.find(id),
@@ -267,7 +259,7 @@ export function makeRepoInternal<
267
259
  ? filter(a)
268
260
  // TODO: mapFrom but need to support per field and dependencies
269
261
  .pipe(
270
- Effect.andThen(flow(S.decode(S.Array(a.schema ?? schema)), Effect.provide(rctx)))
262
+ Effect.andThen(S.decode(S.Array(a.schema ?? schema)))
271
263
  )
272
264
  : a.mode === "collect"
273
265
  ? filter(a)
@@ -275,8 +267,7 @@ export function makeRepoInternal<
275
267
  .pipe(
276
268
  Effect.flatMap(flow(
277
269
  S.decode(S.Array(a.schema)),
278
- Effect.map(Array.getSomes),
279
- Effect.provide(rctx)
270
+ Effect.map(Array.getSomes)
280
271
  ))
281
272
  )
282
273
  : Effect.flatMap(
@@ -313,7 +304,7 @@ export function makeRepoInternal<
313
304
  )
314
305
  }) as any
315
306
 
316
- const r: Repository<T, Encoded, Evt, ItemType, IdKey> = {
307
+ const r: Repository<T, Encoded, Evt, ItemType, IdKey, R> = {
317
308
  changeFeed,
318
309
  itemType: name,
319
310
  idKey,
@@ -417,7 +408,7 @@ export function makeStore<
417
408
  return Effect.gen(function*() {
418
409
  const { make } = yield* StoreMaker
419
410
 
420
- const store = yield* make<Encoded, string, R | RInitial, EInitial>(
411
+ const store = yield* make<Encoded, string, RInitial | R, EInitial>(
421
412
  pluralize(name),
422
413
  makeInitial
423
414
  ? makeInitial
@@ -465,7 +456,7 @@ export interface Repos<
465
456
  partitionValue?: (a: Encoded) => string
466
457
  }
467
458
  }
468
- ): Effect<Repository<T, Encoded, Evt, ItemType, IdKey>, E, StoreMaker | R | RInitial | R2>
459
+ ): Effect<Repository<T, Encoded, Evt, ItemType, IdKey, R>, E, StoreMaker | RInitial | R2>
469
460
  makeWith<Out, RInitial = never, E = never, R2 = never>(
470
461
  args: [Evt] extends [never] ? {
471
462
  makeInitial?: Effect<readonly T[], E, RInitial>
@@ -480,10 +471,10 @@ export interface Repos<
480
471
  partitionValue?: (a: Encoded) => string
481
472
  }
482
473
  },
483
- f: (r: Repository<T, Encoded, Evt, ItemType, IdKey>) => Out
484
- ): Effect<Out, E, StoreMaker | R | RInitial | R2>
474
+ f: (r: Repository<T, Encoded, Evt, ItemType, IdKey, R>) => Out
475
+ ): Effect<Out, E, StoreMaker | RInitial | R2>
485
476
  readonly Q: ReturnType<typeof Q.make<Encoded>>
486
- readonly type: Repository<T, Encoded, Evt, ItemType, IdKey>
477
+ readonly type: Repository<T, Encoded, Evt, ItemType, IdKey, R>
487
478
  }
488
479
 
489
480
  export type GetRepoType<T> = T extends { type: infer R } ? R : never
@@ -511,7 +502,7 @@ export const makeRepo: {
511
502
  publishEvents?: (evt: NonEmptyReadonlyArray<Evt>) => Effect<void, never, R2>
512
503
  makeInitial?: Effect<readonly T[], E, RInitial>
513
504
  }
514
- ): Effect.Effect<ExtendedRepository<T, Encoded, Evt, ItemType, IdKey>, E, R | RInitial | R2 | StoreMaker>
505
+ ): Effect.Effect<ExtendedRepository<T, Encoded, Evt, ItemType, IdKey, R>, E, RInitial | R2 | StoreMaker>
515
506
  <
516
507
  ItemType extends string,
517
508
  R,
@@ -532,7 +523,7 @@ export const makeRepo: {
532
523
  publishEvents?: (evt: NonEmptyReadonlyArray<Evt>) => Effect<void, never, R2>
533
524
  makeInitial?: Effect<readonly T[], E, RInitial>
534
525
  }
535
- ): Effect.Effect<ExtendedRepository<T, Encoded, Evt, ItemType, "id">, E, R | RInitial | R2 | StoreMaker>
526
+ ): Effect.Effect<ExtendedRepository<T, Encoded, Evt, ItemType, "id", R>, E, RInitial | R2 | StoreMaker>
536
527
  } = <
537
528
  ItemType extends string,
538
529
  R,
@@ -1,37 +0,0 @@
1
- // packages/infra/vitest.config.ts
2
- import { defineConfig } from "file:///Users/patrickroza/pj/effect-app/libs/node_modules/.pnpm/vite@5.2.6_@types+node@20.11.30/node_modules/vite/dist/node/index.js";
3
-
4
- // vite.config.base.ts
5
- import path from "path";
6
- import fs from "fs";
7
- var __vite_injected_original_dirname = "/Users/patrickroza/pj/effect-app/libs";
8
- function makeConfig(dirName) {
9
- const prefix = path.resolve(__vite_injected_original_dirname, "packages");
10
- const packages = fs.readdirSync(prefix).map((f) => prefix + "/" + f).filter((f) => fs.lstatSync(f).isDirectory());
11
- const cfg = {
12
- // eslint-disable-next-line @typescript-eslint/no-var-requires
13
- //plugins: [autoImport],
14
- test: {
15
- include: ["./test/**/*.test.{js,mjs,cjs,ts,mts,cts,jsx,tsx}"],
16
- reporters: "verbose",
17
- globals: true
18
- },
19
- resolve: {
20
- alias: packages.reduce((acc, cur) => {
21
- acc[JSON.parse(fs.readFileSync(cur + "/package.json", "utf-8")).name] = path.resolve(cur, cur.endsWith("core") ? "dist" : "src");
22
- return acc;
23
- }, {})
24
- // "@effect-app/core/Prelude": path.join(__dirname, "packages/core/src/Prelude.code.ts")
25
- }
26
- };
27
- console.log(cfg);
28
- return cfg;
29
- }
30
-
31
- // packages/infra/vitest.config.ts
32
- var __vite_injected_original_dirname2 = "/Users/patrickroza/pj/effect-app/libs/packages/infra";
33
- var vitest_config_default = defineConfig(makeConfig(__vite_injected_original_dirname2));
34
- export {
35
- vitest_config_default as default
36
- };
37
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsicGFja2FnZXMvaW5mcmEvdml0ZXN0LmNvbmZpZy50cyIsICJ2aXRlLmNvbmZpZy5iYXNlLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyJjb25zdCBfX3ZpdGVfaW5qZWN0ZWRfb3JpZ2luYWxfZGlybmFtZSA9IFwiL1VzZXJzL3BhdHJpY2tyb3phL3BqL2VmZmVjdC1hcHAvbGlicy9wYWNrYWdlcy9pbmZyYVwiO2NvbnN0IF9fdml0ZV9pbmplY3RlZF9vcmlnaW5hbF9maWxlbmFtZSA9IFwiL1VzZXJzL3BhdHJpY2tyb3phL3BqL2VmZmVjdC1hcHAvbGlicy9wYWNrYWdlcy9pbmZyYS92aXRlc3QuY29uZmlnLnRzXCI7Y29uc3QgX192aXRlX2luamVjdGVkX29yaWdpbmFsX2ltcG9ydF9tZXRhX3VybCA9IFwiZmlsZTovLy9Vc2Vycy9wYXRyaWNrcm96YS9wai9lZmZlY3QtYXBwL2xpYnMvcGFja2FnZXMvaW5mcmEvdml0ZXN0LmNvbmZpZy50c1wiOy8vLyA8cmVmZXJlbmNlIHR5cGVzPVwidml0ZXN0XCIgLz5cbmltcG9ydCB7IGRlZmluZUNvbmZpZyB9IGZyb20gXCJ2aXRlXCJcbmltcG9ydCBtYWtlQ29uZmlnIGZyb20gXCIuLi8uLi92aXRlLmNvbmZpZy5iYXNlXCJcblxuZXhwb3J0IGRlZmF1bHQgZGVmaW5lQ29uZmlnKG1ha2VDb25maWcoX19kaXJuYW1lKSlcbiIsICJjb25zdCBfX3ZpdGVfaW5qZWN0ZWRfb3JpZ2luYWxfZGlybmFtZSA9IFwiL1VzZXJzL3BhdHJpY2tyb3phL3BqL2VmZmVjdC1hcHAvbGlic1wiO2NvbnN0IF9fdml0ZV9pbmplY3RlZF9vcmlnaW5hbF9maWxlbmFtZSA9IFwiL1VzZXJzL3BhdHJpY2tyb3phL3BqL2VmZmVjdC1hcHAvbGlicy92aXRlLmNvbmZpZy5iYXNlLnRzXCI7Y29uc3QgX192aXRlX2luamVjdGVkX29yaWdpbmFsX2ltcG9ydF9tZXRhX3VybCA9IFwiZmlsZTovLy9Vc2Vycy9wYXRyaWNrcm96YS9wai9lZmZlY3QtYXBwL2xpYnMvdml0ZS5jb25maWcuYmFzZS50c1wiOy8vLyA8cmVmZXJlbmNlIHR5cGVzPVwidml0ZXN0XCIgLz5cbmltcG9ydCBwYXRoIGZyb20gXCJwYXRoXCJcbmltcG9ydCBmcyBmcm9tIFwiZnNcIlxuaW1wb3J0IEF1dG9JbXBvcnQgZnJvbSBcInVucGx1Z2luLWF1dG8taW1wb3J0L3ZpdGVcIlxuaW1wb3J0IHsgZGVmaW5lQ29uZmlnIH0gZnJvbSBcInZpdGVzdC9jb25maWdcIlxuXG4vLyBjb25zdCBhdXRvSW1wb3J0ID0gQXV0b0ltcG9ydCh7XG4vLyAgIGR0czogXCIuL3Rlc3QvYXV0by1pbXBvcnRzLmQudHNcIixcbi8vICAgLy8gaW5jbHVkZTogW1xuLy8gICAvLyAgIC9cXC50ZXN0XFwuW3RqXXN4PyQvIC8vIC50cywgLnRzeCwgLmpzLCAuanN4XG4vLyAgIC8vIF0sXG4vLyAgIGltcG9ydHM6IFtcbi8vICAgICBcInZpdGVzdFwiXG4vLyAgIF1cbi8vIH0pXG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIG1ha2VDb25maWcoZGlyTmFtZT86IHN0cmluZykge1xuICBjb25zdCBwcmVmaXggPSBwYXRoLnJlc29sdmUoX19kaXJuYW1lLCBcInBhY2thZ2VzXCIpXG4gIGNvbnN0IHBhY2thZ2VzID0gZnMucmVhZGRpclN5bmMocHJlZml4KS5tYXAoZiA9PiBwcmVmaXggKyBcIi9cIiArIGYpLmZpbHRlcihmID0+IGZzLmxzdGF0U3luYyhmKS5pc0RpcmVjdG9yeSgpIClcbiAgY29uc3QgY2ZnID0ge1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdmFyLXJlcXVpcmVzXG4gICAgLy9wbHVnaW5zOiBbYXV0b0ltcG9ydF0sXG4gICAgdGVzdDoge1xuICAgICAgaW5jbHVkZTogIFtcIi4vdGVzdC8qKi8qLnRlc3Que2pzLG1qcyxjanMsdHMsbXRzLGN0cyxqc3gsdHN4fVwiXSxcbiAgICAgIHJlcG9ydGVyczogXCJ2ZXJib3NlXCIsXG4gICAgICBnbG9iYWxzOiB0cnVlXG4gICAgfSxcbiAgICByZXNvbHZlOiB7XG4gICAgICBhbGlhczogcGFja2FnZXMucmVkdWNlKChhY2MsIGN1cikgPT4geyAvLyB3b3JrYXJvdW5kIGZvciAvUHJlbHVkZSBpc3N1ZVxuICAgICAgYWNjW0pTT04ucGFyc2UoZnMucmVhZEZpbGVTeW5jKGN1ciArIFwiL3BhY2thZ2UuanNvblwiLCBcInV0Zi04XCIpKS5uYW1lXSA9IHBhdGgucmVzb2x2ZShjdXIsIGN1ci5lbmRzV2l0aChcImNvcmVcIikgPyBcImRpc3RcIiA6IFwic3JjXCIpXG4gICAgICByZXR1cm4gYWNjXG4gICAgfSwgeyB9KSAvLyBcIkBlZmZlY3QtYXBwL2NvcmUvUHJlbHVkZVwiOiBwYXRoLmpvaW4oX19kaXJuYW1lLCBcInBhY2thZ2VzL2NvcmUvc3JjL1ByZWx1ZGUuY29kZS50c1wiKVxuICB9XG4gIH1cbiAgY29uc29sZS5sb2coY2ZnKVxuICByZXR1cm4gY2ZnXG59XG4iXSwKICAibWFwcGluZ3MiOiAiO0FBQ0EsU0FBUyxvQkFBb0I7OztBQ0E3QixPQUFPLFVBQVU7QUFDakIsT0FBTyxRQUFRO0FBRmYsSUFBTSxtQ0FBbUM7QUFnQjFCLFNBQVIsV0FBNEIsU0FBa0I7QUFDbkQsUUFBTSxTQUFTLEtBQUssUUFBUSxrQ0FBVyxVQUFVO0FBQ2pELFFBQU0sV0FBVyxHQUFHLFlBQVksTUFBTSxFQUFFLElBQUksT0FBSyxTQUFTLE1BQU0sQ0FBQyxFQUFFLE9BQU8sT0FBSyxHQUFHLFVBQVUsQ0FBQyxFQUFFLFlBQVksQ0FBRTtBQUM3RyxRQUFNLE1BQU07QUFBQTtBQUFBO0FBQUEsSUFHVixNQUFNO0FBQUEsTUFDSixTQUFVLENBQUMsa0RBQWtEO0FBQUEsTUFDN0QsV0FBVztBQUFBLE1BQ1gsU0FBUztBQUFBLElBQ1g7QUFBQSxJQUNBLFNBQVM7QUFBQSxNQUNQLE9BQU8sU0FBUyxPQUFPLENBQUMsS0FBSyxRQUFRO0FBQ3JDLFlBQUksS0FBSyxNQUFNLEdBQUcsYUFBYSxNQUFNLGlCQUFpQixPQUFPLENBQUMsRUFBRSxJQUFJLElBQUksS0FBSyxRQUFRLEtBQUssSUFBSSxTQUFTLE1BQU0sSUFBSSxTQUFTLEtBQUs7QUFDL0gsZUFBTztBQUFBLE1BQ1QsR0FBRyxDQUFFLENBQUM7QUFBQTtBQUFBLElBQ1I7QUFBQSxFQUNBO0FBQ0EsVUFBUSxJQUFJLEdBQUc7QUFDZixTQUFPO0FBQ1Q7OztBRHBDQSxJQUFNQSxvQ0FBbUM7QUFJekMsSUFBTyx3QkFBUSxhQUFhLFdBQVdDLGlDQUFTLENBQUM7IiwKICAibmFtZXMiOiBbIl9fdml0ZV9pbmplY3RlZF9vcmlnaW5hbF9kaXJuYW1lIiwgIl9fdml0ZV9pbmplY3RlZF9vcmlnaW5hbF9kaXJuYW1lIl0KfQo=