@shivaedev/test-story 0.4.0 → 0.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.
- package/CHANGELOG.md +17 -0
- package/README.md +88 -0
- package/dist/server/internal/narration.d.ts +4 -1
- package/dist/server/internal/narration.d.ts.map +1 -1
- package/dist/server/internal/narration.js +11 -5
- package/dist/server/internal/narration.js.map +1 -1
- package/dist/server/internal/otlpProtobuf.d.ts +2 -0
- package/dist/server/internal/otlpProtobuf.d.ts.map +1 -0
- package/dist/server/internal/otlpProtobuf.js +107 -0
- package/dist/server/internal/otlpProtobuf.js.map +1 -0
- package/dist/server/internal/otlpReadout.d.ts +38 -0
- package/dist/server/internal/otlpReadout.d.ts.map +1 -0
- package/dist/server/internal/otlpReadout.js +45 -0
- package/dist/server/internal/otlpReadout.js.map +1 -0
- package/dist/server/internal/otlpValue.d.ts +22 -0
- package/dist/server/internal/otlpValue.d.ts.map +1 -0
- package/dist/server/internal/otlpValue.js +12 -0
- package/dist/server/internal/otlpValue.js.map +1 -0
- package/dist/server/internal/otlpWire.d.ts +7 -0
- package/dist/server/internal/otlpWire.d.ts.map +1 -0
- package/dist/server/internal/otlpWire.js +55 -0
- package/dist/server/internal/otlpWire.js.map +1 -0
- package/dist/server/internal/seed.d.ts +1 -0
- package/dist/server/internal/seed.d.ts.map +1 -1
- package/dist/server/internal/seed.js +2 -2
- package/dist/server/internal/seed.js.map +1 -1
- package/dist/server/internal/start.d.ts +2 -4
- package/dist/server/internal/start.d.ts.map +1 -1
- package/dist/server/internal/start.js +18 -16
- package/dist/server/internal/start.js.map +1 -1
- package/dist/server/internal/storyIt.d.ts.map +1 -1
- package/dist/server/internal/storyIt.js +10 -8
- package/dist/server/internal/storyIt.js.map +1 -1
- package/dist/server/otlpReceiver.d.ts +21 -0
- package/dist/server/otlpReceiver.d.ts.map +1 -0
- package/dist/server/otlpReceiver.js +50 -0
- package/dist/server/otlpReceiver.js.map +1 -0
- package/dist/server/storyKit.d.ts +1 -0
- package/dist/server/storyKit.d.ts.map +1 -1
- package/dist/server/storyKit.js.map +1 -1
- package/package.json +1 -1
- package/src/server/internal/narration.ts +11 -5
- package/src/server/internal/otlpProtobuf.ts +115 -0
- package/src/server/internal/otlpReadout.ts +59 -0
- package/src/server/internal/otlpValue.ts +24 -0
- package/src/server/internal/otlpWire.ts +57 -0
- package/src/server/internal/seed.ts +3 -2
- package/src/server/internal/start.ts +23 -16
- package/src/server/internal/storyIt.ts +10 -8
- package/src/server/otlpReceiver.ts +69 -0
- package/src/server/storyKit.ts +1 -0
|
@@ -1,23 +1,25 @@
|
|
|
1
|
-
import { Effect } from "effect";
|
|
1
|
+
import { Cause, Context, Effect, Tracer } from "effect";
|
|
2
2
|
import { callSite } from "#internal/callSite.ts";
|
|
3
3
|
import { hooked } from "#internal/hooked.ts";
|
|
4
4
|
import { narrate } from "#internal/narration.ts";
|
|
5
5
|
import { runUntil } from "#internal/runUntil.ts";
|
|
6
6
|
import { seed } from "#internal/seed.ts";
|
|
7
|
-
export const start = Effect.fnUntraced(function* (definition, given, context) {
|
|
8
|
-
const engine = yield* hooked(definition.create);
|
|
9
|
-
const narration = narrate({ engine, inspect: definition.inspect, name: definition.name }, context);
|
|
10
|
-
yield*
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
7
|
+
export const start = Effect.fnUntraced(function* (definition, given, context, body) {
|
|
8
|
+
const engine = yield* hooked(definition.create).pipe(Effect.updateContext(Context.omit(Tracer.ParentSpan)));
|
|
9
|
+
const { narration, captureFailure } = narrate({ engine, inspect: definition.inspect, name: definition.name }, context);
|
|
10
|
+
return yield* Effect.gen(function* () {
|
|
11
|
+
yield* seed(definition, engine, narration, given);
|
|
12
|
+
const story = {
|
|
13
|
+
engine,
|
|
14
|
+
lines: narration.lines,
|
|
15
|
+
runUntil: (until, options) => {
|
|
16
|
+
const site = callSite();
|
|
17
|
+
narration.at = site;
|
|
18
|
+
return runUntil({ engine, name: definition.name, run: definition.run, tell: (line) => narration.tellAt(line, site) }, until, options);
|
|
19
|
+
},
|
|
20
|
+
tell: narration.tell,
|
|
21
|
+
};
|
|
22
|
+
return yield* body({ ...definition.verbs(engine, story), story });
|
|
23
|
+
}).pipe(Effect.tapCause((cause) => Effect.sync(() => captureFailure(Cause.prettyErrors(cause)[0]?.stack))));
|
|
22
24
|
});
|
|
23
25
|
//# sourceMappingURL=start.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"start.js","sourceRoot":"","sources":["../../../src/server/internal/start.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;
|
|
1
|
+
{"version":3,"file":"start.js","sourceRoot":"","sources":["../../../src/server/internal/start.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAExD,OAAO,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AACjD,OAAO,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAC7C,OAAO,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAC;AACjD,OAAO,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AACjD,OAAO,EAA0D,IAAI,EAAE,MAAM,mBAAmB,CAAC;AAEjG,MAAM,CAAC,MAAM,KAAK,GAAG,MAAM,CAAC,UAAU,CAAC,QAAQ,CAAC,EAC/C,UAA2B,EAC3B,KAA4B,EAC5B,OAAoB,EACpB,IAAgE;IAEhE,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;IAC5G,MAAM,EAAE,SAAS,EAAE,cAAc,EAAE,GAAG,OAAO,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,UAAU,CAAC,OAAO,EAAE,IAAI,EAAE,UAAU,CAAC,IAAI,EAAE,EAAE,OAAO,CAAC,CAAC;IACvH,OAAO,KAAK,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;QACjC,KAAK,CAAC,CAAC,IAAI,CAAC,UAAU,EAAE,MAAM,EAAE,SAAS,EAAE,KAAK,CAAC,CAAC;QAClD,MAAM,KAAK,GAAe;YACzB,MAAM;YACN,KAAK,EAAE,SAAS,CAAC,KAAK;YACtB,QAAQ,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;gBAC5B,MAAM,IAAI,GAAG,QAAQ,EAAE,CAAC;gBACxB,SAAS,CAAC,EAAE,GAAG,IAAI,CAAC;gBACpB,OAAO,QAAQ,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,CAAC,IAAI,EAAE,GAAG,EAAE,UAAU,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC;YACvI,CAAC;YACD,IAAI,EAAE,SAAS,CAAC,IAAI;SACpB,CAAC;QACF,OAAO,KAAK,CAAC,CAAC,IAAI,CAAC,EAAE,GAAG,UAAU,CAAC,KAAK,CAAC,MAAM,EAAE,KAAK,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;IACnE,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,cAAc,CAAC,KAAK,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;AAC7G,CAAC,CAAC,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"storyIt.d.ts","sourceRoot":"","sources":["../../../src/server/internal/storyIt.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAElD,OAAO,KAAK,EAAc,iBAAiB,EAAE,MAAM,iCAAiC,CAAC;AAGrF,OAAO,EAAE,KAAK,SAAS,EAAU,MAAM,qBAAqB,CAAC;AAE7D,OAAO,KAAK,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAGrE,KAAK,SAAS,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,KAAK,SAAS,CAAC,SAAS,EAAE,OAAO,EAAE,KAAK,CAAC,GAAG,SAAS,CAAC;AAE1G,KAAK,SAAS,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,UAAU,EAAE,EAAE,IAAI,CAAC,EAAE,SAAS,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,iBAAiB,KAAK,IAAI,CAAC;AAE9H,MAAM,WAAW,OAAQ,SAAQ,SAAS;IACzC,QAAQ,CAAC,KAAK,EAAE,SAAS,CAAC;IAC1B,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC;IACzB,QAAQ,CAAC,KAAK,EAAE,CAAC,SAAS,EAAE,OAAO,KAAK,SAAS,CAAC;IAClD,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC;IACzB,QAAQ,CAAC,MAAM,EAAE,CAAC,SAAS,EAAE,OAAO,KAAK,SAAS,CAAC;CACnD;
|
|
1
|
+
{"version":3,"file":"storyIt.d.ts","sourceRoot":"","sources":["../../../src/server/internal/storyIt.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAElD,OAAO,KAAK,EAAc,iBAAiB,EAAE,MAAM,iCAAiC,CAAC;AAGrF,OAAO,EAAE,KAAK,SAAS,EAAU,MAAM,qBAAqB,CAAC;AAE7D,OAAO,KAAK,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAGrE,KAAK,SAAS,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,KAAK,SAAS,CAAC,SAAS,EAAE,OAAO,EAAE,KAAK,CAAC,GAAG,SAAS,CAAC;AAE1G,KAAK,SAAS,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,UAAU,EAAE,EAAE,IAAI,CAAC,EAAE,SAAS,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,iBAAiB,KAAK,IAAI,CAAC;AAE9H,MAAM,WAAW,OAAQ,SAAQ,SAAS;IACzC,QAAQ,CAAC,KAAK,EAAE,SAAS,CAAC;IAC1B,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC;IACzB,QAAQ,CAAC,KAAK,EAAE,CAAC,SAAS,EAAE,OAAO,KAAK,SAAS,CAAC;IAClD,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC;IACzB,QAAQ,CAAC,MAAM,EAAE,CAAC,SAAS,EAAE,OAAO,KAAK,SAAS,CAAC;CACnD;AAgCD,wBAAgB,OAAO,CAAC,UAAU,EAAE,eAAe,GAAG,OAAO,CA0B5D"}
|
|
@@ -13,8 +13,7 @@ function withTags(options, tags) {
|
|
|
13
13
|
}
|
|
14
14
|
function storyOf(definition, given, body) {
|
|
15
15
|
return function* story(_harness, context) {
|
|
16
|
-
|
|
17
|
-
return yield* hooked(() => body?.(told, context));
|
|
16
|
+
return yield* start(definition, given, context, (told) => hooked(() => body?.(told, context)));
|
|
18
17
|
};
|
|
19
18
|
}
|
|
20
19
|
// Vitest refuses a tag its config does not declare, so a genre the config leaves out names the test without tagging it.
|
|
@@ -47,12 +46,15 @@ export function storyIt(definition) {
|
|
|
47
46
|
layer: definition.layer ?? Layer.empty,
|
|
48
47
|
makeHarness: () => Effect.void,
|
|
49
48
|
});
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
49
|
+
function register(declare) {
|
|
50
|
+
return declaring(definition, genre, definition.runIf === false ? effectApp.skip : declare);
|
|
51
|
+
}
|
|
52
|
+
return Object.assign(register(effectApp), {
|
|
53
|
+
fails: register(effectApp.fails),
|
|
54
|
+
only: register(effectApp.only),
|
|
55
|
+
runIf: (condition) => register(effectApp.runIf(condition)),
|
|
56
|
+
skip: register(effectApp.skip),
|
|
57
|
+
skipIf: (condition) => register(effectApp.skipIf(condition)),
|
|
56
58
|
});
|
|
57
59
|
}
|
|
58
60
|
//# sourceMappingURL=storyIt.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"storyIt.js","sourceRoot":"","sources":["../../../src/server/internal/storyIt.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,QAAQ,CAAC;AAEvC,OAAO,EAAE,YAAY,EAAE,MAAM,kCAAkC,CAAC;AAChE,OAAO,EAAc,OAAO,EAAE,MAAM,oBAAoB,CAAC;AACzD,OAAO,EAAkB,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAC7D,OAAO,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAE3D,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAc3C,SAAS,QAAQ,CAAC,OAA+C,EAAE,IAAuB;IACzF,IAAI,OAAO,OAAO,KAAK,QAAQ,EAAE,CAAC;QACjC,OAAO,EAAE,IAAI,EAAE,CAAC,GAAG,IAAI,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC;IAC9C,CAAC;IACD,MAAM,GAAG,GAAG,OAAO,EAAE,IAAI,IAAI,EAAE,CAAC;IAChC,OAAO,EAAE,GAAG,OAAO,EAAE,IAAI,EAAE,CAAC,GAAG,IAAI,EAAE,GAAG,CAAC,OAAO,GAAG,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC;AACpF,CAAC;AAED,SAAS,OAAO,CAAC,UAA2B,EAAE,KAA4B,EAAE,IAA2B;IACtG,OAAO,QAAQ,CAAC,CAAC,KAAK,CAAC,QAAiB,EAAE,OAAoB;QAC7D,
|
|
1
|
+
{"version":3,"file":"storyIt.js","sourceRoot":"","sources":["../../../src/server/internal/storyIt.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { type IncomingHttpHeaders } from "node:http";
|
|
2
|
+
import { Effect } from "effect";
|
|
3
|
+
import { otlpReadout } from "#internal/otlpReadout.ts";
|
|
4
|
+
export type OtlpSpan = ReturnType<typeof otlpReadout>[number];
|
|
5
|
+
export interface OtlpExport {
|
|
6
|
+
readonly body: Buffer;
|
|
7
|
+
readonly headers: IncomingHttpHeaders;
|
|
8
|
+
readonly path: string | undefined;
|
|
9
|
+
readonly rawHeaders: readonly string[];
|
|
10
|
+
}
|
|
11
|
+
export interface OtlpReceiverOptions {
|
|
12
|
+
readonly answer?: string;
|
|
13
|
+
readonly path?: string;
|
|
14
|
+
readonly status?: number | ((attempt: number) => number);
|
|
15
|
+
}
|
|
16
|
+
export declare const otlpReceiver: (options?: OtlpReceiverOptions | undefined) => Effect.Effect<{
|
|
17
|
+
readonly requests: readonly OtlpExport[];
|
|
18
|
+
readonly spans: readonly OtlpSpan[];
|
|
19
|
+
readonly url: string;
|
|
20
|
+
}, import("effect/Cause").UnknownError, import("effect/Scope").Scope>;
|
|
21
|
+
//# sourceMappingURL=otlpReceiver.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"otlpReceiver.d.ts","sourceRoot":"","sources":["../../src/server/otlpReceiver.ts"],"names":[],"mappings":"AAAA,OAAO,EAAgB,KAAK,mBAAmB,EAA6C,MAAM,WAAW,CAAC;AAC9G,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAChC,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAEvD,MAAM,MAAM,QAAQ,GAAG,UAAU,CAAC,OAAO,WAAW,CAAC,CAAC,MAAM,CAAC,CAAC;AAC9D,MAAM,WAAW,UAAU;IAC1B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,OAAO,EAAE,mBAAmB,CAAC;IACtC,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,CAAC;IAClC,QAAQ,CAAC,UAAU,EAAE,SAAS,MAAM,EAAE,CAAC;CACvC;AACD,MAAM,WAAW,mBAAmB;IACnC,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,CAAC,CAAC,OAAO,EAAE,MAAM,KAAK,MAAM,CAAC,CAAC;CACzD;AA0BD,eAAO,MAAM,YAAY;uBAqBa,SAAS,UAAU,EAAE;oBAAkB,SAAS,QAAQ,EAAE;kBAAgB,MAAM;qEAMpH,CAAC"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import { createServer } from "node:http";
|
|
2
|
+
import { Effect } from "effect";
|
|
3
|
+
import { otlpReadout } from "#internal/otlpReadout.ts";
|
|
4
|
+
async function receive(request, response, requests, spans, options) {
|
|
5
|
+
try {
|
|
6
|
+
const chunks = [];
|
|
7
|
+
for await (const chunk of request) {
|
|
8
|
+
chunks.push(Buffer.from(chunk));
|
|
9
|
+
}
|
|
10
|
+
const body = Buffer.concat(chunks);
|
|
11
|
+
requests.push({ body, headers: request.headers, path: request.url, rawHeaders: request.rawHeaders });
|
|
12
|
+
if (request.method !== "POST" || request.url !== (options.path ?? "/v1/traces")) {
|
|
13
|
+
response.writeHead(404).end();
|
|
14
|
+
return;
|
|
15
|
+
}
|
|
16
|
+
const contentType = request.headers["content-type"]?.split(";")[0]?.trim();
|
|
17
|
+
if (contentType !== "application/json" && contentType !== "application/x-protobuf") {
|
|
18
|
+
response.writeHead(415).end();
|
|
19
|
+
return;
|
|
20
|
+
}
|
|
21
|
+
spans.push(...otlpReadout(body, contentType));
|
|
22
|
+
response.writeHead(typeof options.status === "function" ? options.status(requests.length) : (options.status ?? 200)).end(options.answer ?? "{}");
|
|
23
|
+
}
|
|
24
|
+
catch {
|
|
25
|
+
response.writeHead(400).end();
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
export const otlpReceiver = Effect.fnUntraced(function* (options = {}) {
|
|
29
|
+
const requests = [];
|
|
30
|
+
const spans = [];
|
|
31
|
+
const server = createServer((request, response) => receive(request, response, requests, spans, options));
|
|
32
|
+
yield* Effect.acquireRelease(Effect.tryPromise(() => new Promise((resolve, reject) => {
|
|
33
|
+
server.once("error", reject);
|
|
34
|
+
server.listen(0, "127.0.0.1", () => {
|
|
35
|
+
server.off("error", reject);
|
|
36
|
+
resolve();
|
|
37
|
+
});
|
|
38
|
+
})), () => Effect.promise(() => new Promise((resolve, reject) => server.close((error) => (error ? reject(error) : resolve())))));
|
|
39
|
+
const address = server.address();
|
|
40
|
+
if (address === null || typeof address === "string") {
|
|
41
|
+
return yield* Effect.die("Missing OTLP receiver address");
|
|
42
|
+
}
|
|
43
|
+
const receiver = {
|
|
44
|
+
requests,
|
|
45
|
+
spans,
|
|
46
|
+
url: `http://127.0.0.1:${address.port}`,
|
|
47
|
+
};
|
|
48
|
+
return receiver;
|
|
49
|
+
});
|
|
50
|
+
//# sourceMappingURL=otlpReceiver.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"otlpReceiver.js","sourceRoot":"","sources":["../../src/server/otlpReceiver.ts"],"names":[],"mappings":"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"}
|
|
@@ -36,6 +36,7 @@ export interface StoryKitDefinition<TEngine, TStage extends string, TVerbs, TPro
|
|
|
36
36
|
readonly name: string;
|
|
37
37
|
readonly outbound?: Readonly<Record<string, string>>;
|
|
38
38
|
readonly run?: RunHooks<TEngine, TStep, TFailed, TDiagnose>;
|
|
39
|
+
readonly runIf?: boolean;
|
|
39
40
|
readonly stages: readonly [TStage, ...TStage[]];
|
|
40
41
|
readonly verbs: (engine: TEngine, story: Story<TEngine, TStep | TFailed | TDiagnose>) => TVerbs;
|
|
41
42
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"storyKit.d.ts","sourceRoot":"","sources":["../../src/server/storyKit.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"storyKit.d.ts","sourceRoot":"","sources":["../../src/server/storyKit.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"storyKit.js","sourceRoot":"","sources":["../../src/server/storyKit.ts"],"names":[],"mappings":"AAGA,OAAO,EAA4E,MAAM,EAAmB,MAAM,qBAAqB,CAAC;AAGxI,OAAO,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAC;AAC/C,OAAO,EAAc,KAAK,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"storyKit.js","sourceRoot":"","sources":["../../src/server/storyKit.ts"],"names":[],"mappings":"AAGA,OAAO,EAA4E,MAAM,EAAmB,MAAM,qBAAqB,CAAC;AAGxI,OAAO,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAC;AAC/C,OAAO,EAAc,KAAK,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAwHhE,MAAM,UAAU,QAAQ,CAAC,UAA2B;IACnD,OAAO;QACN,EAAE,EAAE,OAAO,CAAC,UAAU,CAAC;QACvB,KAAK,EAAE,CAAC,KAAa,EAAE,IAAY,EAAE,KAAqD,EAAE,EAAE,CAC7F,KAAK,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,MAAe,EAAE,EAAE,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC;QACrE,MAAM;KACN,CAAC;AACH,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@shivaedev/test-story",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.5.0",
|
|
4
4
|
"description": "Tests that read like stories over the real engine: a story kit per engine with its own it, traits per feature, and a failure that prints the story, where it stopped and the engine's state",
|
|
5
5
|
"homepage": "https://github.com/ShivaeDev/platform/tree/main/packages/test-story#readme",
|
|
6
6
|
"bugs": {
|
|
@@ -24,7 +24,8 @@ export interface Subject<TEngine> {
|
|
|
24
24
|
readonly name: string;
|
|
25
25
|
}
|
|
26
26
|
|
|
27
|
-
export function narrate<TEngine>(subject: Subject<TEngine>, { onTestFailed }: Pick<TestContext, "onTestFailed">)
|
|
27
|
+
export function narrate<TEngine>(subject: Subject<TEngine>, { onTestFailed, task }: Pick<TestContext, "onTestFailed" | "task">) {
|
|
28
|
+
let captured: string | undefined;
|
|
28
29
|
const narration: Narration = {
|
|
29
30
|
at: undefined,
|
|
30
31
|
given: 0,
|
|
@@ -40,13 +41,18 @@ export function narrate<TEngine>(subject: Subject<TEngine>, { onTestFailed }: Pi
|
|
|
40
41
|
narration.at = site;
|
|
41
42
|
},
|
|
42
43
|
};
|
|
43
|
-
onTestFailed(({ task }) => {
|
|
44
|
-
const failure =
|
|
44
|
+
onTestFailed(({ task: failedTask }) => {
|
|
45
|
+
const failure = failedTask.result?.errors?.[0];
|
|
45
46
|
if (failure !== undefined) {
|
|
46
|
-
failure.message = `${failure.message === "" ? describeFailure(failure) : failure.message}\n\n${failureReport(narration, subject, { file: task.file.filepath, name: task.name, stack: failure.stack })}`;
|
|
47
|
+
failure.message = `${failure.message === "" ? describeFailure(failure) : failure.message}\n\n${captured ?? failureReport(narration, subject, { file: task.file.filepath, name: task.name, stack: failure.stack })}`;
|
|
47
48
|
}
|
|
48
49
|
});
|
|
49
|
-
return
|
|
50
|
+
return {
|
|
51
|
+
captureFailure: (stack: string | undefined) => {
|
|
52
|
+
captured = failureReport(narration, subject, { file: task.file.filepath, name: task.name, stack });
|
|
53
|
+
},
|
|
54
|
+
narration,
|
|
55
|
+
};
|
|
50
56
|
}
|
|
51
57
|
|
|
52
58
|
export function tellGiven(narration: Narration, given: readonly { readonly line: string; readonly site: Error }[]): void {
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
import { type WireValue, wireFields } from "#internal/otlpWire.ts";
|
|
2
|
+
|
|
3
|
+
type Scalar = "string" | "hex" | "base64" | "number" | "integer" | "boolean" | "double" | "fixed64";
|
|
4
|
+
type Field = readonly [name: string, type: Scalar | (() => Descriptor), repeated?: boolean];
|
|
5
|
+
interface Descriptor {
|
|
6
|
+
readonly [field: number]: Field;
|
|
7
|
+
}
|
|
8
|
+
const keyValue: Descriptor = { 1: ["key", "string"], 2: ["value", () => anyValue] };
|
|
9
|
+
const anyValue: Descriptor = {
|
|
10
|
+
1: ["stringValue", "string"],
|
|
11
|
+
2: ["boolValue", "boolean"],
|
|
12
|
+
3: ["intValue", "integer"],
|
|
13
|
+
4: ["doubleValue", "double"],
|
|
14
|
+
5: ["arrayValue", () => ({ 1: ["values", () => anyValue, true] })],
|
|
15
|
+
6: ["kvlistValue", () => ({ 1: ["values", () => keyValue, true] })],
|
|
16
|
+
7: ["bytesValue", "base64"],
|
|
17
|
+
};
|
|
18
|
+
const event: Descriptor = { 1: ["timeUnixNano", "fixed64"], 2: ["name", "string"], 3: ["attributes", () => keyValue, true] };
|
|
19
|
+
const link: Descriptor = { 1: ["traceId", "hex"], 2: ["spanId", "hex"], 4: ["attributes", () => keyValue, true] };
|
|
20
|
+
const span: Descriptor = {
|
|
21
|
+
1: ["traceId", "hex"],
|
|
22
|
+
2: ["spanId", "hex"],
|
|
23
|
+
4: ["parentSpanId", "hex"],
|
|
24
|
+
5: ["name", "string"],
|
|
25
|
+
6: ["kind", "number"],
|
|
26
|
+
7: ["startTimeUnixNano", "fixed64"],
|
|
27
|
+
8: ["endTimeUnixNano", "fixed64"],
|
|
28
|
+
9: ["attributes", () => keyValue, true],
|
|
29
|
+
11: ["events", () => event, true],
|
|
30
|
+
13: ["links", () => link, true],
|
|
31
|
+
15: ["status", () => ({ 2: ["message", "string"], 3: ["code", "number"] })],
|
|
32
|
+
};
|
|
33
|
+
const traces: Descriptor = {
|
|
34
|
+
1: [
|
|
35
|
+
"resourceSpans",
|
|
36
|
+
() => ({
|
|
37
|
+
1: ["resource", () => ({ 1: ["attributes", () => keyValue, true] })],
|
|
38
|
+
2: ["scopeSpans", () => ({ 2: ["spans", () => span, true] }), true],
|
|
39
|
+
}),
|
|
40
|
+
true,
|
|
41
|
+
],
|
|
42
|
+
};
|
|
43
|
+
|
|
44
|
+
function scalar(type: Scalar, value: WireValue): unknown {
|
|
45
|
+
if (typeof value === "bigint") {
|
|
46
|
+
switch (type) {
|
|
47
|
+
case "number":
|
|
48
|
+
return Number(value);
|
|
49
|
+
case "integer":
|
|
50
|
+
return BigInt.asIntN(64, value).toString();
|
|
51
|
+
case "boolean":
|
|
52
|
+
return value !== 0n;
|
|
53
|
+
case "string":
|
|
54
|
+
case "hex":
|
|
55
|
+
case "base64":
|
|
56
|
+
case "double":
|
|
57
|
+
case "fixed64":
|
|
58
|
+
throw new Error(`Invalid OTLP protobuf ${type} field`);
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
switch (type) {
|
|
62
|
+
case "string":
|
|
63
|
+
return value.toString();
|
|
64
|
+
case "hex":
|
|
65
|
+
return value.toString("hex");
|
|
66
|
+
case "base64":
|
|
67
|
+
return value.toString("base64");
|
|
68
|
+
case "double":
|
|
69
|
+
return value.readDoubleLE();
|
|
70
|
+
case "fixed64":
|
|
71
|
+
return value.readBigUInt64LE().toString();
|
|
72
|
+
case "number":
|
|
73
|
+
case "integer":
|
|
74
|
+
case "boolean":
|
|
75
|
+
throw new Error(`Invalid OTLP protobuf ${type} field`);
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
function fieldValue(type: Field[1], value: WireValue): unknown {
|
|
80
|
+
if (typeof type === "string") {
|
|
81
|
+
return scalar(type, value);
|
|
82
|
+
}
|
|
83
|
+
if (!Buffer.isBuffer(value)) {
|
|
84
|
+
throw new Error("Invalid OTLP protobuf message field");
|
|
85
|
+
}
|
|
86
|
+
return message(value, type());
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
function message(bytes: Buffer, descriptor: Descriptor): Record<string, unknown> {
|
|
90
|
+
const result: Record<string, unknown> = {};
|
|
91
|
+
for (const [name, , repeated] of Object.values(descriptor)) {
|
|
92
|
+
if (repeated) {
|
|
93
|
+
result[name] = [];
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
for (const field of wireFields(bytes)) {
|
|
97
|
+
const description = descriptor[field.number];
|
|
98
|
+
if (description === undefined) {
|
|
99
|
+
continue;
|
|
100
|
+
}
|
|
101
|
+
const [name, type, repeated] = description;
|
|
102
|
+
const value = fieldValue(type, field.value);
|
|
103
|
+
const previous = result[name];
|
|
104
|
+
if (repeated && Array.isArray(previous)) {
|
|
105
|
+
previous.push(value);
|
|
106
|
+
} else {
|
|
107
|
+
result[name] = value;
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
return result;
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
export function otlpProtobuf(bytes: Buffer) {
|
|
114
|
+
return message(bytes, traces);
|
|
115
|
+
}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import { Schema } from "effect";
|
|
2
|
+
import { otlpProtobuf } from "#internal/otlpProtobuf.ts";
|
|
3
|
+
import { Attribute } from "#internal/otlpValue.ts";
|
|
4
|
+
|
|
5
|
+
const Attributes = Schema.optionalKey(Schema.Array(Attribute));
|
|
6
|
+
const Span = Schema.Struct({
|
|
7
|
+
attributes: Attributes,
|
|
8
|
+
endTimeUnixNano: Schema.optionalKey(Schema.String),
|
|
9
|
+
events: Schema.optionalKey(
|
|
10
|
+
Schema.Array(Schema.Struct({ attributes: Attributes, name: Schema.String, timeUnixNano: Schema.optionalKey(Schema.String) })),
|
|
11
|
+
),
|
|
12
|
+
kind: Schema.optionalKey(Schema.Number),
|
|
13
|
+
links: Schema.optionalKey(Schema.Array(Schema.Struct({ attributes: Attributes, spanId: Schema.String, traceId: Schema.String }))),
|
|
14
|
+
name: Schema.String,
|
|
15
|
+
parentSpanId: Schema.optionalKey(Schema.String),
|
|
16
|
+
spanId: Schema.String,
|
|
17
|
+
startTimeUnixNano: Schema.optionalKey(Schema.String),
|
|
18
|
+
status: Schema.optionalKey(Schema.Struct({ code: Schema.optionalKey(Schema.Number), message: Schema.optionalKey(Schema.String) })),
|
|
19
|
+
traceId: Schema.String,
|
|
20
|
+
});
|
|
21
|
+
const Payload = Schema.Struct({
|
|
22
|
+
resourceSpans: Schema.optionalKey(
|
|
23
|
+
Schema.Array(
|
|
24
|
+
Schema.Struct({
|
|
25
|
+
resource: Schema.optionalKey(Schema.Struct({ attributes: Attributes })),
|
|
26
|
+
scopeSpans: Schema.optionalKey(Schema.Array(Schema.Struct({ spans: Schema.optionalKey(Schema.Array(Span)) }))),
|
|
27
|
+
}),
|
|
28
|
+
),
|
|
29
|
+
),
|
|
30
|
+
});
|
|
31
|
+
|
|
32
|
+
function normalizeIntegers(value: unknown): unknown {
|
|
33
|
+
if (Array.isArray(value)) {
|
|
34
|
+
return value.map(normalizeIntegers);
|
|
35
|
+
}
|
|
36
|
+
if (typeof value !== "object" || value === null) {
|
|
37
|
+
return value;
|
|
38
|
+
}
|
|
39
|
+
return Object.fromEntries(Object.entries(value).map(([key, item]) => [key, key === "intValue" ? String(item) : normalizeIntegers(item)]));
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
export function otlpReadout(bytes: Buffer, contentType: string) {
|
|
43
|
+
const data = Schema.decodeUnknownSync(Payload)(
|
|
44
|
+
normalizeIntegers(contentType === "application/x-protobuf" ? otlpProtobuf(bytes) : JSON.parse(bytes.toString())),
|
|
45
|
+
);
|
|
46
|
+
return (data.resourceSpans ?? []).flatMap((resource) =>
|
|
47
|
+
(resource.scopeSpans ?? []).flatMap((scope) =>
|
|
48
|
+
(scope.spans ?? []).map((span) => ({
|
|
49
|
+
...span,
|
|
50
|
+
attributes: span.attributes ?? [],
|
|
51
|
+
events: (span.events ?? []).map((event) => ({ ...event, attributes: event.attributes ?? [] })),
|
|
52
|
+
kind: span.kind ?? 0,
|
|
53
|
+
links: (span.links ?? []).map((link) => ({ ...link, attributes: link.attributes ?? [] })),
|
|
54
|
+
resourceAttributes: resource.resource?.attributes ?? [],
|
|
55
|
+
status: { ...span.status, code: span.status?.code ?? 0 },
|
|
56
|
+
})),
|
|
57
|
+
),
|
|
58
|
+
);
|
|
59
|
+
}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { Schema } from "effect";
|
|
2
|
+
|
|
3
|
+
export interface OtlpValue {
|
|
4
|
+
readonly arrayValue?: { readonly values?: readonly OtlpValue[] };
|
|
5
|
+
readonly boolValue?: boolean;
|
|
6
|
+
readonly bytesValue?: string;
|
|
7
|
+
readonly doubleValue?: number;
|
|
8
|
+
readonly intValue?: string;
|
|
9
|
+
readonly kvlistValue?: { readonly values?: readonly { readonly key: string; readonly value: OtlpValue }[] };
|
|
10
|
+
readonly stringValue?: string;
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
const OtlpValue: Schema.Codec<OtlpValue> = Schema.suspend(() =>
|
|
14
|
+
Schema.Struct({
|
|
15
|
+
arrayValue: Schema.optionalKey(Schema.Struct({ values: Schema.optionalKey(Schema.Array(OtlpValue)) })),
|
|
16
|
+
boolValue: Schema.optionalKey(Schema.Boolean),
|
|
17
|
+
bytesValue: Schema.optionalKey(Schema.String),
|
|
18
|
+
doubleValue: Schema.optionalKey(Schema.Number),
|
|
19
|
+
intValue: Schema.optionalKey(Schema.String),
|
|
20
|
+
kvlistValue: Schema.optionalKey(Schema.Struct({ values: Schema.optionalKey(Schema.Array(Attribute)) })),
|
|
21
|
+
stringValue: Schema.optionalKey(Schema.String),
|
|
22
|
+
}),
|
|
23
|
+
);
|
|
24
|
+
export const Attribute = Schema.Struct({ key: Schema.String, value: OtlpValue });
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
export type WireValue = bigint | Buffer;
|
|
2
|
+
|
|
3
|
+
class WireReader {
|
|
4
|
+
offset = 0;
|
|
5
|
+
readonly bytes: Buffer;
|
|
6
|
+
constructor(bytes: Buffer) {
|
|
7
|
+
this.bytes = bytes;
|
|
8
|
+
}
|
|
9
|
+
varint() {
|
|
10
|
+
let value = 0n;
|
|
11
|
+
for (let shift = 0n; shift < 70n && this.offset < this.bytes.length; shift += 7n) {
|
|
12
|
+
const byte = this.bytes.readUInt8(this.offset);
|
|
13
|
+
this.offset += 1;
|
|
14
|
+
value |= BigInt(byte & 127) << shift;
|
|
15
|
+
if (byte < 128) {
|
|
16
|
+
return value;
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
throw new Error("Invalid OTLP protobuf varint");
|
|
20
|
+
}
|
|
21
|
+
read(size: number) {
|
|
22
|
+
if (size < 0 || size > this.bytes.length - this.offset) {
|
|
23
|
+
throw new Error("Invalid OTLP protobuf field length or wire type");
|
|
24
|
+
}
|
|
25
|
+
const value = this.bytes.subarray(this.offset, this.offset + size);
|
|
26
|
+
this.offset += size;
|
|
27
|
+
return value;
|
|
28
|
+
}
|
|
29
|
+
field(wire: number): WireValue {
|
|
30
|
+
switch (wire) {
|
|
31
|
+
case 0:
|
|
32
|
+
return this.varint();
|
|
33
|
+
case 1:
|
|
34
|
+
return this.read(8);
|
|
35
|
+
case 2:
|
|
36
|
+
return this.read(Number(this.varint()));
|
|
37
|
+
case 5:
|
|
38
|
+
return this.read(4);
|
|
39
|
+
default:
|
|
40
|
+
throw new Error("Invalid OTLP protobuf wire type");
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
export function wireFields(bytes: Buffer) {
|
|
46
|
+
const reader = new WireReader(bytes);
|
|
47
|
+
const fields: { number: number; value: WireValue; wire: number }[] = [];
|
|
48
|
+
while (reader.offset < bytes.length) {
|
|
49
|
+
const tag = Number(reader.varint());
|
|
50
|
+
if (tag < 8) {
|
|
51
|
+
throw new Error("Invalid OTLP protobuf field");
|
|
52
|
+
}
|
|
53
|
+
const wire = tag & 7;
|
|
54
|
+
fields.push({ number: tag >>> 3, value: reader.field(wire), wire });
|
|
55
|
+
}
|
|
56
|
+
return fields;
|
|
57
|
+
}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { Cause, Effect, type Scope } from "effect";
|
|
1
|
+
import { Cause, Context, Effect, type Scope, Tracer } from "effect";
|
|
2
2
|
import type { AnyTestLayer } from "@shivaedev/effect-test/any-test-layer.ts";
|
|
3
3
|
import type { EffectClock } from "@shivaedev/effect-test/types.ts";
|
|
4
4
|
import { refusal } from "#internal/errors.ts";
|
|
@@ -27,6 +27,7 @@ export interface LooseDefinition {
|
|
|
27
27
|
readonly name: string;
|
|
28
28
|
readonly outbound?: Readonly<Record<string, string>>;
|
|
29
29
|
readonly run?: LooseRunHooks<unknown>;
|
|
30
|
+
readonly runIf?: boolean;
|
|
30
31
|
readonly stages: readonly string[];
|
|
31
32
|
readonly verbs: (engine: unknown, story: LooseStory) => object;
|
|
32
33
|
}
|
|
@@ -51,7 +52,7 @@ export const seed = Effect.fnUntraced(function* (definition: LooseDefinition, en
|
|
|
51
52
|
}
|
|
52
53
|
const after = definition.after?.[stage];
|
|
53
54
|
if (after !== undefined) {
|
|
54
|
-
yield* hooked(() => after(engine));
|
|
55
|
+
yield* hooked(() => after(engine)).pipe(Effect.updateContext(Context.omit(Tracer.ParentSpan)));
|
|
55
56
|
}
|
|
56
57
|
}
|
|
57
58
|
});
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { Effect } from "effect";
|
|
1
|
+
import { Cause, Context, Effect, Tracer } from "effect";
|
|
2
2
|
import type { TestContext } from "vitest";
|
|
3
3
|
import { callSite } from "#internal/callSite.ts";
|
|
4
4
|
import { hooked } from "#internal/hooked.ts";
|
|
@@ -6,19 +6,26 @@ import { narrate } from "#internal/narration.ts";
|
|
|
6
6
|
import { runUntil } from "#internal/runUntil.ts";
|
|
7
7
|
import { type LooseDefinition, type LooseStory, type LooseTrait, seed } from "#internal/seed.ts";
|
|
8
8
|
|
|
9
|
-
export const start = Effect.fnUntraced(function* (
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
9
|
+
export const start = Effect.fnUntraced(function* (
|
|
10
|
+
definition: LooseDefinition,
|
|
11
|
+
given: readonly LooseTrait[],
|
|
12
|
+
context: TestContext,
|
|
13
|
+
body: (told: object) => Effect.Effect<unknown, unknown, unknown>,
|
|
14
|
+
) {
|
|
15
|
+
const engine = yield* hooked(definition.create).pipe(Effect.updateContext(Context.omit(Tracer.ParentSpan)));
|
|
16
|
+
const { narration, captureFailure } = narrate({ engine, inspect: definition.inspect, name: definition.name }, context);
|
|
17
|
+
return yield* Effect.gen(function* () {
|
|
18
|
+
yield* seed(definition, engine, narration, given);
|
|
19
|
+
const story: LooseStory = {
|
|
20
|
+
engine,
|
|
21
|
+
lines: narration.lines,
|
|
22
|
+
runUntil: (until, options) => {
|
|
23
|
+
const site = callSite();
|
|
24
|
+
narration.at = site;
|
|
25
|
+
return runUntil({ engine, name: definition.name, run: definition.run, tell: (line) => narration.tellAt(line, site) }, until, options);
|
|
26
|
+
},
|
|
27
|
+
tell: narration.tell,
|
|
28
|
+
};
|
|
29
|
+
return yield* body({ ...definition.verbs(engine, story), story });
|
|
30
|
+
}).pipe(Effect.tapCause((cause) => Effect.sync(() => captureFailure(Cause.prettyErrors(cause)[0]?.stack))));
|
|
24
31
|
});
|