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.
- package/README.md +220 -6
- package/dist/adapters/iti.d.mts +2 -1
- package/dist/adapters/iti.d.mts.map +1 -1
- package/dist/adapters/iti.mjs +11 -10
- package/dist/adapters/iti.mjs.map +1 -1
- package/dist/{effect-2ZcGZI8A.mjs → effect-CK4YZaX0.mjs} +56 -10
- package/dist/effect-CK4YZaX0.mjs.map +1 -0
- package/dist/hono.d.mts +3 -3
- package/dist/hono.mjs +3 -3
- package/dist/{index-DStz0JMN.d.mts → index-B1nH4luq.d.mts} +73 -6
- package/dist/index-B1nH4luq.d.mts.map +1 -0
- package/dist/index-BMdU_Z72.d.mts +18 -0
- package/dist/index-BMdU_Z72.d.mts.map +1 -0
- package/dist/{index-C7Qild0_.d.mts → index-CX6iAoCB.d.mts} +15 -151
- package/dist/index-CX6iAoCB.d.mts.map +1 -0
- package/dist/index-GYJ4qm9K.d.mts +179 -0
- package/dist/index-GYJ4qm9K.d.mts.map +1 -0
- package/dist/index-heuaRmXR.d.mts.map +1 -1
- package/dist/index.d.mts +5 -3
- package/dist/index.mjs +6 -5
- package/dist/index.mjs.map +1 -1
- package/dist/{internal-identity-DmUpBeeL.mjs → internal-identity-CbXoZIfw.mjs} +3 -3
- package/dist/internal-identity-CbXoZIfw.mjs.map +1 -0
- package/dist/{signal-B97cs85Z.mjs → layer-D56fRdLt.mjs} +30 -111
- package/dist/layer-D56fRdLt.mjs.map +1 -0
- package/dist/node-context-DWsCUBRa.d.mts +12 -0
- package/dist/node-context-DWsCUBRa.d.mts.map +1 -0
- package/dist/node-context-lggRF4bR.mjs +25 -0
- package/dist/node-context-lggRF4bR.mjs.map +1 -0
- package/dist/node.d.mts +51 -0
- package/dist/node.d.mts.map +1 -0
- package/dist/node.mjs +233 -0
- package/dist/node.mjs.map +1 -0
- package/dist/{index-rQhZk3Nt.d.mts → outcome-CB43bnFW.d.mts} +29 -19
- package/dist/outcome-CB43bnFW.d.mts.map +1 -0
- package/dist/{scope-GGnmTQck.mjs → program-metadata-DhQCCirO.mjs} +18 -3
- package/dist/program-metadata-DhQCCirO.mjs.map +1 -0
- package/dist/registration-drnZk0SY.mjs +182 -0
- package/dist/registration-drnZk0SY.mjs.map +1 -0
- package/dist/runtime/node.d.mts +2 -11
- package/dist/runtime/node.mjs +2 -24
- package/dist/{runtime-DnMn0X0X.mjs → runtime-CBMrX8Wl.mjs} +210 -47
- package/dist/runtime-CBMrX8Wl.mjs.map +1 -0
- package/dist/signal-D2UTcaaG.mjs +105 -0
- package/dist/signal-D2UTcaaG.mjs.map +1 -0
- package/dist/{standard-services-BFBq-4lo.mjs → standard-services-GBZ32tll.mjs} +200 -16
- package/dist/standard-services-GBZ32tll.mjs.map +1 -0
- package/dist/standard-services.d.mts +3 -3
- package/dist/standard-services.mjs +3 -3
- package/dist/testing.d.mts +65 -6
- package/dist/testing.d.mts.map +1 -1
- package/dist/testing.mjs +191 -8
- package/dist/testing.mjs.map +1 -1
- package/package.json +8 -3
- package/dist/effect-2ZcGZI8A.mjs.map +0 -1
- package/dist/errors-Dnjhzbt0.mjs +0 -99
- package/dist/errors-Dnjhzbt0.mjs.map +0 -1
- package/dist/index-C7Qild0_.d.mts.map +0 -1
- package/dist/index-DStz0JMN.d.mts.map +0 -1
- package/dist/index-rQhZk3Nt.d.mts.map +0 -1
- package/dist/internal-identity-DmUpBeeL.mjs.map +0 -1
- package/dist/runtime/node.d.mts.map +0 -1
- package/dist/runtime/node.mjs.map +0 -1
- package/dist/runtime-DnMn0X0X.mjs.map +0 -1
- package/dist/scope-GGnmTQck.mjs.map +0 -1
- package/dist/signal-B97cs85Z.mjs.map +0 -1
- package/dist/standard-services-BFBq-4lo.mjs.map +0 -1
package/dist/testing.d.mts.map
CHANGED
|
@@ -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":"
|
|
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 {
|
|
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 {
|
|
5
|
-
import { r as
|
|
6
|
-
import { i as
|
|
7
|
-
import {
|
|
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
|