better-effect 0.11.0 → 0.12.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 (67) hide show
  1. package/README.md +220 -6
  2. package/dist/adapters/iti.d.mts +2 -1
  3. package/dist/adapters/iti.d.mts.map +1 -1
  4. package/dist/adapters/iti.mjs +11 -10
  5. package/dist/adapters/iti.mjs.map +1 -1
  6. package/dist/{effect-2ZcGZI8A.mjs → effect-CK4YZaX0.mjs} +56 -10
  7. package/dist/effect-CK4YZaX0.mjs.map +1 -0
  8. package/dist/hono.d.mts +3 -3
  9. package/dist/hono.mjs +3 -3
  10. package/dist/{index-DStz0JMN.d.mts → index-B1nH4luq.d.mts} +73 -6
  11. package/dist/index-B1nH4luq.d.mts.map +1 -0
  12. package/dist/index-BMdU_Z72.d.mts +18 -0
  13. package/dist/index-BMdU_Z72.d.mts.map +1 -0
  14. package/dist/{index-C7Qild0_.d.mts → index-CX6iAoCB.d.mts} +15 -151
  15. package/dist/index-CX6iAoCB.d.mts.map +1 -0
  16. package/dist/index-GYJ4qm9K.d.mts +179 -0
  17. package/dist/index-GYJ4qm9K.d.mts.map +1 -0
  18. package/dist/index-heuaRmXR.d.mts.map +1 -1
  19. package/dist/index.d.mts +5 -3
  20. package/dist/index.mjs +6 -5
  21. package/dist/index.mjs.map +1 -1
  22. package/dist/{internal-identity-DmUpBeeL.mjs → internal-identity-CbXoZIfw.mjs} +3 -3
  23. package/dist/internal-identity-CbXoZIfw.mjs.map +1 -0
  24. package/dist/{signal-B97cs85Z.mjs → layer-D56fRdLt.mjs} +30 -111
  25. package/dist/layer-D56fRdLt.mjs.map +1 -0
  26. package/dist/node-context-DWsCUBRa.d.mts +12 -0
  27. package/dist/node-context-DWsCUBRa.d.mts.map +1 -0
  28. package/dist/node-context-lggRF4bR.mjs +25 -0
  29. package/dist/node-context-lggRF4bR.mjs.map +1 -0
  30. package/dist/node.d.mts +51 -0
  31. package/dist/node.d.mts.map +1 -0
  32. package/dist/node.mjs +233 -0
  33. package/dist/node.mjs.map +1 -0
  34. package/dist/{index-rQhZk3Nt.d.mts → outcome-CB43bnFW.d.mts} +29 -19
  35. package/dist/outcome-CB43bnFW.d.mts.map +1 -0
  36. package/dist/{scope-GGnmTQck.mjs → program-metadata-DhQCCirO.mjs} +18 -3
  37. package/dist/program-metadata-DhQCCirO.mjs.map +1 -0
  38. package/dist/registration-drnZk0SY.mjs +182 -0
  39. package/dist/registration-drnZk0SY.mjs.map +1 -0
  40. package/dist/runtime/node.d.mts +2 -11
  41. package/dist/runtime/node.mjs +2 -24
  42. package/dist/{runtime-DnMn0X0X.mjs → runtime-CBMrX8Wl.mjs} +210 -47
  43. package/dist/runtime-CBMrX8Wl.mjs.map +1 -0
  44. package/dist/signal-D2UTcaaG.mjs +105 -0
  45. package/dist/signal-D2UTcaaG.mjs.map +1 -0
  46. package/dist/{standard-services-BFBq-4lo.mjs → standard-services-GBZ32tll.mjs} +200 -16
  47. package/dist/standard-services-GBZ32tll.mjs.map +1 -0
  48. package/dist/standard-services.d.mts +3 -3
  49. package/dist/standard-services.mjs +3 -3
  50. package/dist/testing.d.mts +65 -6
  51. package/dist/testing.d.mts.map +1 -1
  52. package/dist/testing.mjs +191 -8
  53. package/dist/testing.mjs.map +1 -1
  54. package/package.json +8 -3
  55. package/dist/effect-2ZcGZI8A.mjs.map +0 -1
  56. package/dist/errors-Dnjhzbt0.mjs +0 -99
  57. package/dist/errors-Dnjhzbt0.mjs.map +0 -1
  58. package/dist/index-C7Qild0_.d.mts.map +0 -1
  59. package/dist/index-DStz0JMN.d.mts.map +0 -1
  60. package/dist/index-rQhZk3Nt.d.mts.map +0 -1
  61. package/dist/internal-identity-DmUpBeeL.mjs.map +0 -1
  62. package/dist/runtime/node.d.mts.map +0 -1
  63. package/dist/runtime/node.mjs.map +0 -1
  64. package/dist/runtime-DnMn0X0X.mjs.map +0 -1
  65. package/dist/scope-GGnmTQck.mjs.map +0 -1
  66. package/dist/signal-B97cs85Z.mjs.map +0 -1
  67. package/dist/standard-services-BFBq-4lo.mjs.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"testing.d.mts","names":[],"sources":["../src/testing/contracts.ts","../src/testing/recorded-runtime-observer.ts","../src/testing/test-runtime.ts"],"mappings":"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"}
1
+ {"version":3,"file":"testing.d.mts","names":[],"sources":["../src/testing/contracts.ts","../src/testing/recorded-runtime-observer.ts","../src/testing/runtime-graph-observer.ts","../src/testing/test-runtime.ts"],"mappings":"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"}
package/dist/testing.mjs CHANGED
@@ -1,10 +1,11 @@
1
- import { a as ServiceTagCollisionError, c as ServiceNotFoundError, n as LayerDisposeError, t as DuplicateServiceError } from "./errors-Dnjhzbt0.mjs";
1
+ import { i as LayerDisposeError, r as DuplicateServiceError, s as ServiceTagCollisionError, u as ServiceNotFoundError } from "./registration-drnZk0SY.mjs";
2
2
  import { g as RuntimeContextOverlapError, h as RuntimeContextNotConfiguredError } from "./context-BUEf1qjL.mjs";
3
3
  import { t as isPromiseLike } from "./runtime-CDcCF5cb.mjs";
4
- import { c as ScopeClosedError, d as ServiceRuntime, r as Layer, s as ScopeCloseError, u as Service } from "./signal-B97cs85Z.mjs";
5
- import { r as ScopeRuntime, t as Scope } from "./scope-GGnmTQck.mjs";
6
- import { i as MapLayerBackend, n as RuntimeObserver, r as classifyRuntimeOutcome, t as Runtime } from "./runtime-DnMn0X0X.mjs";
7
- import { d as Random, l as LoggerTest, p as RandomSeeded, r as ClockTest, s as Logger, t as Clock } from "./standard-services-BFBq-4lo.mjs";
4
+ import { o as ScopeCloseError, s as ScopeClosedError } from "./signal-D2UTcaaG.mjs";
5
+ import { n as Service, r as ServiceRuntime, t as Layer } from "./layer-D56fRdLt.mjs";
6
+ import { i as Scope, o as ScopeRuntime } from "./program-metadata-DhQCCirO.mjs";
7
+ import { i as MapLayerBackend, n as RuntimeObserver, r as classifyRuntimeOutcome, t as Runtime } from "./runtime-CBMrX8Wl.mjs";
8
+ import { d as Random, h as IdGenerator, l as LoggerTest, p as RandomSeeded, r as ClockTest, s as Logger, t as Clock, v as IdGeneratorTest } from "./standard-services-GBZ32tll.mjs";
8
9
  //#region src/testing/contracts.ts
9
10
  /** Thrown by a conformance scenario when an adapter violates its contract. */
10
11
  var ConformanceError = class extends Error {
@@ -809,6 +810,185 @@ var RecordedRuntimeObserver = class RecordedRuntimeObserver {
809
810
  }
810
811
  };
811
812
  //#endregion
813
+ //#region src/testing/runtime-graph-observer.ts
814
+ const compareStrings = (left, right) => left < right ? -1 : left > right ? 1 : 0;
815
+ const compareEdges = (left, right) => compareStrings(left.from, right.from) || compareStrings(left.to, right.to);
816
+ const freezeNode = (node) => Object.freeze({ ...node });
817
+ const freezeEdge = (edge) => Object.freeze({ ...edge });
818
+ const serviceTags = (path, targetTag) => {
819
+ const tags = path.map((service) => service.serviceTag);
820
+ if (tags[tags.length - 1] !== targetTag) tags.push(targetTag);
821
+ return tags;
822
+ };
823
+ const mermaidLabelPunctuation = /* @__PURE__ */ new Set([
824
+ "&",
825
+ "\"",
826
+ "'",
827
+ "\\",
828
+ "[",
829
+ "]",
830
+ "(",
831
+ ")",
832
+ "{",
833
+ "}",
834
+ "|",
835
+ "#",
836
+ ";",
837
+ ":",
838
+ "<",
839
+ ">",
840
+ "=",
841
+ "`",
842
+ "*",
843
+ "_",
844
+ "~",
845
+ "!",
846
+ "^",
847
+ "$"
848
+ ]);
849
+ const isMermaidLabelControl = (character, codePoint) => codePoint <= 31 || codePoint >= 127 && codePoint <= 159 || codePoint >= 55296 && codePoint <= 57343 || /\s/u.test(character) && character !== " " || /\p{Cf}/u.test(character);
850
+ /**
851
+ * Escape Mermaid syntax while keeping the decoded label readable.
852
+ *
853
+ * Mermaid's documented `#number;` form is a syntax-level escape. Encoding the
854
+ * entity introducers themselves prevents label text from creating a second
855
+ * entity, while encoding Markdown and HTML punctuation keeps it out of the
856
+ * renderer's interpretation paths.
857
+ */
858
+ const escapeMermaidLabel = (label) => {
859
+ let escaped = "";
860
+ for (const character of label) {
861
+ const codePoint = character.codePointAt(0);
862
+ if (codePoint === void 0) continue;
863
+ if (isMermaidLabelControl(character, codePoint) || mermaidLabelPunctuation.has(character)) escaped += `#${codePoint};`;
864
+ else escaped += character;
865
+ }
866
+ return escaped;
867
+ };
868
+ /** Encode a string as a Mermaid-safe, injective and registration-order-independent ID. */
869
+ const mermaidId = (prefix, value) => {
870
+ const codeUnits = [];
871
+ for (let index = 0; index < value.length; index += 1) codeUnits.push(value.charCodeAt(index).toString(16).padStart(4, "0"));
872
+ return `${prefix}${codeUnits.join("_") || "empty"}`;
873
+ };
874
+ /**
875
+ * Observe the public Runtime resolution and acquisition events as a diagnostic graph.
876
+ *
877
+ * The graph is deliberately an observation of paths emitted by Runtime. It does
878
+ * not inspect Layer provenance, retain Service instances, or plan dependencies.
879
+ */
880
+ var RuntimeGraphObserver = class RuntimeGraphObserver {
881
+ includeFailures;
882
+ rootLabel;
883
+ nodes = /* @__PURE__ */ new Map();
884
+ edges = /* @__PURE__ */ new Map();
885
+ rootEdges = /* @__PURE__ */ new Map();
886
+ constructor(includeFailures, rootLabel) {
887
+ this.includeFailures = includeFailures;
888
+ this.rootLabel = rootLabel;
889
+ }
890
+ /** Create an empty Runtime graph observer. */
891
+ static make(options = {}) {
892
+ if (typeof options !== "object" || options === null) throw new TypeError("RuntimeGraphObserver options must be an object");
893
+ if (options.includeFailures !== void 0 && typeof options.includeFailures !== "boolean") throw new TypeError("RuntimeGraphObserver includeFailures must be a boolean");
894
+ if (options.rootLabel !== void 0 && typeof options.rootLabel !== "string") throw new TypeError("RuntimeGraphObserver rootLabel must be a string");
895
+ return new RuntimeGraphObserver(options.includeFailures ?? true, options.rootLabel);
896
+ }
897
+ onServiceResolve = (event) => {
898
+ const targetTag = event.service.serviceTag;
899
+ const path = serviceTags(event.resolutionPath, targetTag);
900
+ const node = this.ensureNode(targetTag);
901
+ this.ensurePath(path);
902
+ node.resolutions += 1;
903
+ if (event.outcome.status === "failure" && this.includeFailures) node.failures += 1;
904
+ const parentTag = path[path.length - 2];
905
+ if (parentTag === void 0) {
906
+ if (this.rootLabel !== void 0) this.rootEdges.set(targetTag, (this.rootEdges.get(targetTag) ?? 0) + 1);
907
+ return;
908
+ }
909
+ const targets = this.edges.get(parentTag) ?? /* @__PURE__ */ new Map();
910
+ const edge = targets.get(targetTag) ?? (() => {
911
+ const created = {
912
+ from: parentTag,
913
+ to: targetTag,
914
+ resolutions: 0
915
+ };
916
+ targets.set(targetTag, created);
917
+ return created;
918
+ })();
919
+ edge.resolutions += 1;
920
+ this.edges.set(parentTag, targets);
921
+ };
922
+ onServiceAcquire = (event) => {
923
+ const targetTag = event.service.serviceTag;
924
+ const path = serviceTags(event.resolutionPath, targetTag);
925
+ const node = this.ensureNode(targetTag);
926
+ this.ensurePath(path);
927
+ node.acquisitions += 1;
928
+ if (event.outcome.status === "failure" && this.includeFailures) node.failures += 1;
929
+ };
930
+ /** Return a fresh, deeply detached and sorted graph snapshot. */
931
+ toJSON() {
932
+ const nodes = Object.freeze([...this.nodes.entries()].sort(([left], [right]) => compareStrings(left, right)).map(([tag, counters]) => freezeNode({
933
+ tag,
934
+ resolutions: counters.resolutions,
935
+ acquisitions: counters.acquisitions,
936
+ failures: counters.failures
937
+ })));
938
+ const edges = Object.freeze([...this.edges.values()].flatMap((targets) => [...targets.values()]).map((edge) => freezeEdge({ ...edge })).sort(compareEdges));
939
+ return Object.freeze({
940
+ nodes,
941
+ edges
942
+ });
943
+ }
944
+ /** Render the current graph as deterministic Mermaid flowchart source. */
945
+ toMermaid() {
946
+ const snapshot = this.toJSON();
947
+ const serviceIds = new Map(snapshot.nodes.map((node) => [node.tag, mermaidId("service_", node.tag)]));
948
+ const lines = ["flowchart TD"];
949
+ const rootTargets = [...this.rootEdges.entries()].sort(([left], [right]) => compareStrings(left, right));
950
+ const root = this.rootLabel !== void 0 && rootTargets.length > 0 ? {
951
+ id: mermaidId("root_", this.rootLabel),
952
+ label: this.rootLabel
953
+ } : void 0;
954
+ if (root !== void 0) lines.push(` ${root.id}["${escapeMermaidLabel(root.label)}"]`);
955
+ for (const node of snapshot.nodes) {
956
+ const id = serviceIds.get(node.tag);
957
+ if (id !== void 0) lines.push(` ${id}["${escapeMermaidLabel(node.tag)}"]`);
958
+ }
959
+ if (root !== void 0) for (const [targetTag, resolutions] of rootTargets) {
960
+ const targetId = serviceIds.get(targetTag);
961
+ if (targetId !== void 0) lines.push(` ${root.id} -->|${resolutions}| ${targetId}`);
962
+ }
963
+ for (const edge of snapshot.edges) {
964
+ const fromId = serviceIds.get(edge.from);
965
+ const toId = serviceIds.get(edge.to);
966
+ if (fromId !== void 0 && toId !== void 0) lines.push(` ${fromId} -->|${edge.resolutions}| ${toId}`);
967
+ }
968
+ return lines.join("\n");
969
+ }
970
+ /** Discard all observed graph data while keeping this observer reusable. */
971
+ clear() {
972
+ this.nodes.clear();
973
+ this.edges.clear();
974
+ this.rootEdges.clear();
975
+ }
976
+ ensureNode(tag) {
977
+ const existing = this.nodes.get(tag);
978
+ if (existing !== void 0) return existing;
979
+ const node = {
980
+ resolutions: 0,
981
+ acquisitions: 0,
982
+ failures: 0
983
+ };
984
+ this.nodes.set(tag, node);
985
+ return node;
986
+ }
987
+ ensurePath(path) {
988
+ for (const tag of path) this.ensureNode(tag);
989
+ }
990
+ };
991
+ //#endregion
812
992
  //#region src/testing/test-runtime.ts
813
993
  /**
814
994
  * Thrown when the TestRuntime recorder contains an execution start or end
@@ -836,13 +1016,15 @@ var TestRuntime = class TestRuntime {
836
1016
  clock;
837
1017
  logger;
838
1018
  random;
1019
+ idGenerator;
839
1020
  disposalPromise;
840
- constructor(runtime, observer, clock, logger, random) {
1021
+ constructor(runtime, observer, clock, logger, random, idGenerator) {
841
1022
  this.runtime = runtime;
842
1023
  this.observer = observer;
843
1024
  this.clock = clock;
844
1025
  this.logger = logger;
845
1026
  this.random = random;
1027
+ this.idGenerator = idGenerator;
846
1028
  }
847
1029
  static async make(layer, options) {
848
1030
  const resolvedOptions = options === void 0 ? {} : options;
@@ -858,7 +1040,7 @@ var TestRuntime = class TestRuntime {
858
1040
  };
859
1041
  const typedLayer = composedLayer;
860
1042
  const runtime = await Runtime.make(typedLayer, runtimeOptions);
861
- return new TestRuntime(runtime, observer, options.clock, options.logger, options.random);
1043
+ return new TestRuntime(runtime, observer, options.clock, options.logger, options.random, options.idGenerator);
862
1044
  }
863
1045
  /** Run a fully typechecked program in the underlying Runtime. */
864
1046
  run(program, options) {
@@ -941,6 +1123,7 @@ const composeTestLayer = (layer, options) => {
941
1123
  if (options.clock !== void 0) overrides.push(Layer.succeed(Clock, options.clock));
942
1124
  if (options.logger !== void 0) overrides.push(Layer.succeed(Logger, options.logger));
943
1125
  if (options.random !== void 0) overrides.push(Layer.succeed(Random, options.random));
1126
+ if (options.idGenerator !== void 0) overrides.push(Layer.succeed(IdGenerator, options.idGenerator));
944
1127
  const typedLayer = layer;
945
1128
  const typedOverrides = overrides;
946
1129
  return Layer.override(typedLayer, ...typedOverrides);
@@ -971,6 +1154,6 @@ const countExecutionScopes = (events) => {
971
1154
  return counts;
972
1155
  };
973
1156
  //#endregion
974
- export { ClockTest, ConformanceError, LoggerTest, MapLayerBackend as MemoryLayerBackend, RandomSeeded, RecordedRuntimeObserver, RuntimeObserver, TestRuntime, TestRuntimeObserverError, layerBackendContract, runtimeContextStorageContract };
1157
+ export { ClockTest, ConformanceError, IdGeneratorTest, LoggerTest, MapLayerBackend as MemoryLayerBackend, RandomSeeded, RecordedRuntimeObserver, RuntimeGraphObserver, RuntimeObserver, TestRuntime, TestRuntimeObserverError, layerBackendContract, runtimeContextStorageContract };
975
1158
 
976
1159
  //# sourceMappingURL=testing.mjs.map