laymos 0.0.1
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/LICENSE +21 -0
- package/README.md +740 -0
- package/dist/cli/cli.d.ts +3 -0
- package/dist/cli/cli.d.ts.map +1 -0
- package/dist/cli/cli.js +6 -0
- package/dist/cli/index.d.ts +2 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +1 -0
- package/dist/cli/run.d.ts +11 -0
- package/dist/cli/run.d.ts.map +1 -0
- package/dist/cli/run.js +242 -0
- package/dist/config/define-config.d.ts +3 -0
- package/dist/config/define-config.d.ts.map +1 -0
- package/dist/config/define-config.js +228 -0
- package/dist/config/index.d.ts +5 -0
- package/dist/config/index.d.ts.map +1 -0
- package/dist/config/index.js +4 -0
- package/dist/config/layer-graph.d.ts +7 -0
- package/dist/config/layer-graph.d.ts.map +1 -0
- package/dist/config/layer-graph.js +53 -0
- package/dist/config/layer.d.ts +5 -0
- package/dist/config/layer.d.ts.map +1 -0
- package/dist/config/layer.js +21 -0
- package/dist/config/module.d.ts +9 -0
- package/dist/config/module.d.ts.map +1 -0
- package/dist/config/module.js +29 -0
- package/dist/config/path.d.ts +4 -0
- package/dist/config/path.d.ts.map +1 -0
- package/dist/config/path.js +32 -0
- package/dist/config/types.d.ts +36 -0
- package/dist/config/types.d.ts.map +1 -0
- package/dist/config/types.js +1 -0
- package/dist/engine/1-extract/extract.d.ts +12 -0
- package/dist/engine/1-extract/extract.d.ts.map +1 -0
- package/dist/engine/1-extract/extract.js +160 -0
- package/dist/engine/1-extract/index.d.ts +3 -0
- package/dist/engine/1-extract/index.d.ts.map +1 -0
- package/dist/engine/1-extract/index.js +1 -0
- package/dist/engine/2-resolve/index.d.ts +3 -0
- package/dist/engine/2-resolve/index.d.ts.map +1 -0
- package/dist/engine/2-resolve/index.js +1 -0
- package/dist/engine/2-resolve/resolve.d.ts +24 -0
- package/dist/engine/2-resolve/resolve.d.ts.map +1 -0
- package/dist/engine/2-resolve/resolve.js +74 -0
- package/dist/engine/3-evaluate/evaluate.d.ts +10 -0
- package/dist/engine/3-evaluate/evaluate.d.ts.map +1 -0
- package/dist/engine/3-evaluate/evaluate.js +80 -0
- package/dist/engine/3-evaluate/index.d.ts +3 -0
- package/dist/engine/3-evaluate/index.d.ts.map +1 -0
- package/dist/engine/3-evaluate/index.js +1 -0
- package/dist/engine/4-emit/emit.d.ts +7 -0
- package/dist/engine/4-emit/emit.d.ts.map +1 -0
- package/dist/engine/4-emit/emit.js +77 -0
- package/dist/engine/4-emit/index.d.ts +2 -0
- package/dist/engine/4-emit/index.d.ts.map +1 -0
- package/dist/engine/4-emit/index.js +1 -0
- package/dist/engine/errors.d.ts +19 -0
- package/dist/engine/errors.d.ts.map +1 -0
- package/dist/engine/errors.js +5 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +1 -0
- package/dist/node.d.ts +24 -0
- package/dist/node.d.ts.map +1 -0
- package/dist/node.js +139 -0
- package/dist/report/architecture.d.ts +104 -0
- package/dist/report/architecture.d.ts.map +1 -0
- package/dist/report/architecture.js +1 -0
- package/dist/report/index.d.ts +3 -0
- package/dist/report/index.d.ts.map +1 -0
- package/dist/report/index.js +2 -0
- package/dist/report/stories.d.ts +22 -0
- package/dist/report/stories.d.ts.map +1 -0
- package/dist/report/stories.js +1 -0
- package/dist/story/artifact/artifact.d.ts +57 -0
- package/dist/story/artifact/artifact.d.ts.map +1 -0
- package/dist/story/artifact/artifact.js +234 -0
- package/dist/story/artifact/index.d.ts +2 -0
- package/dist/story/artifact/index.d.ts.map +1 -0
- package/dist/story/artifact/index.js +1 -0
- package/dist/story/artifact/storage.d.ts +10 -0
- package/dist/story/artifact/storage.d.ts.map +1 -0
- package/dist/story/artifact/storage.js +162 -0
- package/dist/story/artifact/types.d.ts +74 -0
- package/dist/story/artifact/types.d.ts.map +1 -0
- package/dist/story/artifact/types.js +1 -0
- package/dist/story/core/blocks.d.ts +20 -0
- package/dist/story/core/blocks.d.ts.map +1 -0
- package/dist/story/core/blocks.js +104 -0
- package/dist/story/core/declare.d.ts +63 -0
- package/dist/story/core/declare.d.ts.map +1 -0
- package/dist/story/core/declare.js +62 -0
- package/dist/story/core/index.d.ts +4 -0
- package/dist/story/core/index.d.ts.map +1 -0
- package/dist/story/core/index.js +1 -0
- package/dist/story/core/recorder.d.ts +38 -0
- package/dist/story/core/recorder.d.ts.map +1 -0
- package/dist/story/core/recorder.js +28 -0
- package/dist/story/core/runtime-context.d.ts +14 -0
- package/dist/story/core/runtime-context.d.ts.map +1 -0
- package/dist/story/core/runtime-context.js +19 -0
- package/dist/story/core/types.d.ts +21 -0
- package/dist/story/core/types.d.ts.map +1 -0
- package/dist/story/core/types.js +1 -0
- package/dist/story/effect/effect.d.ts +52 -0
- package/dist/story/effect/effect.d.ts.map +1 -0
- package/dist/story/effect/effect.js +99 -0
- package/dist/story/effect/index.d.ts +3 -0
- package/dist/story/effect/index.d.ts.map +1 -0
- package/dist/story/effect/index.js +1 -0
- package/dist/story/runner/index.d.ts +3 -0
- package/dist/story/runner/index.d.ts.map +1 -0
- package/dist/story/runner/index.js +1 -0
- package/dist/story/runner/runner.d.ts +44 -0
- package/dist/story/runner/runner.d.ts.map +1 -0
- package/dist/story/runner/runner.js +476 -0
- package/dist/story/story-runtime/index.d.ts +2 -0
- package/dist/story/story-runtime/index.d.ts.map +1 -0
- package/dist/story/story-runtime/index.js +1 -0
- package/dist/story/story-runtime/story-runtime.d.ts +52 -0
- package/dist/story/story-runtime/story-runtime.d.ts.map +1 -0
- package/dist/story/story-runtime/story-runtime.js +194 -0
- package/dist/story/vanilla/index.d.ts +29 -0
- package/dist/story/vanilla/index.d.ts.map +1 -0
- package/dist/story/vanilla/index.js +78 -0
- package/package.json +68 -0
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
export type DecisionValue = string | number | boolean;
|
|
2
|
+
export type Attributes = Readonly<Record<string, unknown>>;
|
|
3
|
+
export type AttributesInput<Args extends readonly unknown[]> = Attributes | ((...args: Args) => Attributes);
|
|
4
|
+
export interface BlockMeta<Args extends readonly unknown[] = readonly []> {
|
|
5
|
+
readonly description: string;
|
|
6
|
+
readonly attributes?: AttributesInput<Args>;
|
|
7
|
+
}
|
|
8
|
+
export interface ArmMeta {
|
|
9
|
+
readonly name?: string;
|
|
10
|
+
readonly description: string;
|
|
11
|
+
}
|
|
12
|
+
export interface StoryMeta {
|
|
13
|
+
readonly description: string;
|
|
14
|
+
}
|
|
15
|
+
export interface StoryGroupMeta {
|
|
16
|
+
readonly description: string;
|
|
17
|
+
}
|
|
18
|
+
export interface ScenarioMeta {
|
|
19
|
+
readonly description: string;
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/story/core/types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,aAAa,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC;AAEtD,MAAM,MAAM,UAAU,GAAG,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;AAE3D,MAAM,MAAM,eAAe,CAAC,IAAI,SAAS,SAAS,OAAO,EAAE,IACvD,UAAU,GACV,CAAC,CAAC,GAAG,IAAI,EAAE,IAAI,KAAK,UAAU,CAAC,CAAC;AAEpC,MAAM,WAAW,SAAS,CAAC,IAAI,SAAS,SAAS,OAAO,EAAE,GAAG,SAAS,EAAE;IACtE,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,UAAU,CAAC,EAAE,eAAe,CAAC,IAAI,CAAC,CAAC;CAC7C;AAED,MAAM,WAAW,OAAO;IACtB,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;CAC9B;AAED,MAAM,WAAW,SAAS;IACxB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;CAC9B;AAED,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;CAC9B;AAED,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;CAC9B"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import { Effect } from 'effect';
|
|
2
|
+
import type { Duration, Layer } from 'effect';
|
|
3
|
+
import type { ArmMeta, BlockMeta, DecisionValue, StoryGroupMeta, StoryMeta } from '../core/types.js';
|
|
4
|
+
export interface ScenarioMeta {
|
|
5
|
+
readonly description: string;
|
|
6
|
+
readonly timeout?: Duration.Input;
|
|
7
|
+
}
|
|
8
|
+
export interface EffectVerifiedScenario<Prepared, R> {
|
|
9
|
+
cleanup<E>(cleanup: (prepared: Prepared) => Effect.Effect<unknown, E, R>): EffectVerifiedScenario<Prepared, R>;
|
|
10
|
+
}
|
|
11
|
+
export interface EffectPreparedScenario<Prepared, Output, Error, R> {
|
|
12
|
+
cleanup<CleanupError>(cleanup: (prepared: Prepared) => Effect.Effect<unknown, CleanupError, R>): EffectPreparedScenario<Prepared, Output, Error, R>;
|
|
13
|
+
verify<VerificationError>(verify: (output: Output, prepared: Prepared) => Effect.Effect<unknown, VerificationError, R>): EffectVerifiedScenario<Prepared, R>;
|
|
14
|
+
verifyError<VerificationError>(verify: (error: Error, prepared: Prepared) => Effect.Effect<unknown, VerificationError, R>): EffectVerifiedScenario<Prepared, R>;
|
|
15
|
+
}
|
|
16
|
+
export interface EffectScenario<Prepared, Output, Error, R> {
|
|
17
|
+
prepare<PreparationError>(prepare: () => Effect.Effect<Prepared, PreparationError, R>): EffectPreparedScenario<Prepared, Output, Error, R>;
|
|
18
|
+
}
|
|
19
|
+
export interface EffectStory<Prepared, Output, Error, R> {
|
|
20
|
+
scenario(name: string, meta: ScenarioMeta, define: (scenario: EffectScenario<Prepared, Output, Error, R>) => EffectVerifiedScenario<Prepared, R>): EffectStory<Prepared, Output, Error, R>;
|
|
21
|
+
skip(name: string, meta: ScenarioMeta): EffectStory<Prepared, Output, Error, R>;
|
|
22
|
+
}
|
|
23
|
+
export interface EffectStoryBuilder<R> {
|
|
24
|
+
provide<Services, LayerError>(layer: Layer.Layer<Services, LayerError, never>): EffectStoryBuilder<Services>;
|
|
25
|
+
execute<Prepared, Output, Error>(execute: (prepared: Prepared) => Effect.Effect<Output, Error, R>): EffectStory<Prepared, Output, Error, R>;
|
|
26
|
+
}
|
|
27
|
+
export interface EffectStoryGroup {
|
|
28
|
+
group(name: string, meta: StoryGroupMeta): EffectStoryGroup;
|
|
29
|
+
story(name: string, meta: StoryMeta): EffectStoryBuilder<never>;
|
|
30
|
+
}
|
|
31
|
+
/** Declares a Story when loaded by the Laymos Story runner. */
|
|
32
|
+
export declare function story(name: string, meta: StoryMeta): EffectStoryBuilder<never>;
|
|
33
|
+
/** Declares a reusable Story Group. */
|
|
34
|
+
export declare function storyGroup(name: string, meta: StoryGroupMeta): EffectStoryGroup;
|
|
35
|
+
type AnyEffect = Effect.Effect<any, any, any>;
|
|
36
|
+
type Success<T> = T extends Effect.Effect<infer A, any, any> ? A : never;
|
|
37
|
+
type Error<T> = T extends Effect.Effect<any, infer E, any> ? E : never;
|
|
38
|
+
type Services<T> = T extends Effect.Effect<any, any, infer R> ? R : never;
|
|
39
|
+
export interface DecisionBuilder<Remaining extends DecisionValue, A, E, R> {
|
|
40
|
+
when<Key extends Remaining, Next extends AnyEffect>(value: Key, meta: ArmMeta, body: (value: Key) => Next): DecisionBuilder<Exclude<Remaining, Key>, A | Success<Next>, E | Error<Next>, R | Services<Next>>;
|
|
41
|
+
otherwise<Next extends AnyEffect>(meta: ArmMeta, body: (value: Remaining) => Next): Effect.Effect<A | Success<Next>, E | Error<Next>, R | Services<Next>>;
|
|
42
|
+
readonly exhaustive: [Remaining] extends [never] ? () => Effect.Effect<A, E, R> : never;
|
|
43
|
+
[Symbol.iterator](): Effect.EffectIterator<Effect.Effect<A, E, R>>;
|
|
44
|
+
}
|
|
45
|
+
/** Marks a reusable Effect-returning function boundary as a Story Block. */
|
|
46
|
+
export declare function functionBlock<Args extends readonly unknown[], A, E, R>(name: string, meta: BlockMeta<Args>, fn: (...args: Args) => Effect.Effect<A, E, R>): (...args: Args) => Effect.Effect<A, E, R>;
|
|
47
|
+
/** Wraps an Effect in an inline Story Block. */
|
|
48
|
+
export declare function step<A, E, R>(name: string, meta: BlockMeta, effect: Effect.Effect<A, E, R>): Effect.Effect<A, E, R>;
|
|
49
|
+
/** Builds an eager, literal-keyed Effect Decision. */
|
|
50
|
+
export declare function decision<const Input extends DecisionValue>(name: string, meta: BlockMeta<[Input]>, input: Input): DecisionBuilder<Input, never, never, never>;
|
|
51
|
+
export type { Attributes } from '../core/types.js';
|
|
52
|
+
//# sourceMappingURL=effect.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"effect.d.ts","sourceRoot":"","sources":["../../../src/story/effect/effect.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
import { Effect } from 'effect';
|
|
2
|
+
const inertStory = {
|
|
3
|
+
scenario(_name, meta) {
|
|
4
|
+
requireDescription(meta.description, `Scenario "${_name}"`);
|
|
5
|
+
return inertStory;
|
|
6
|
+
},
|
|
7
|
+
skip(_name, meta) {
|
|
8
|
+
requireDescription(meta.description, `Scenario "${_name}"`);
|
|
9
|
+
return inertStory;
|
|
10
|
+
},
|
|
11
|
+
};
|
|
12
|
+
const inertStoryBuilder = {
|
|
13
|
+
provide() {
|
|
14
|
+
return inertStoryBuilder;
|
|
15
|
+
},
|
|
16
|
+
execute() {
|
|
17
|
+
return inertStory;
|
|
18
|
+
},
|
|
19
|
+
};
|
|
20
|
+
/** Declares a Story when loaded by the Laymos Story runner. */
|
|
21
|
+
export function story(name, meta) {
|
|
22
|
+
requirePathSegment(name, 'Story');
|
|
23
|
+
requireDescription(meta.description, `Story "${name}"`);
|
|
24
|
+
return inertStoryBuilder;
|
|
25
|
+
}
|
|
26
|
+
/** Declares a reusable Story Group. */
|
|
27
|
+
export function storyGroup(name, meta) {
|
|
28
|
+
requirePathSegment(name, 'Story Group');
|
|
29
|
+
requireDescription(meta.description, `Story Group "${name}"`);
|
|
30
|
+
return inertStoryGroup;
|
|
31
|
+
}
|
|
32
|
+
const inertStoryGroup = {
|
|
33
|
+
group(name, meta) {
|
|
34
|
+
requirePathSegment(name, 'Story Group');
|
|
35
|
+
requireDescription(meta.description, `Story Group "${name}"`);
|
|
36
|
+
return inertStoryGroup;
|
|
37
|
+
},
|
|
38
|
+
story,
|
|
39
|
+
};
|
|
40
|
+
class DecisionBuilderImpl {
|
|
41
|
+
state;
|
|
42
|
+
constructor(state) {
|
|
43
|
+
this.state = state;
|
|
44
|
+
}
|
|
45
|
+
when(value, meta, body) {
|
|
46
|
+
requireDescription(meta.description, `Decision Arm "${meta.name ?? value}"`);
|
|
47
|
+
if (!this.state.matched && Object.is(this.state.input, value)) {
|
|
48
|
+
this.state.matched = true;
|
|
49
|
+
this.state.selected = body(value);
|
|
50
|
+
}
|
|
51
|
+
return this;
|
|
52
|
+
}
|
|
53
|
+
otherwise(meta, body) {
|
|
54
|
+
requireDescription(meta.description, `Decision Arm "${meta.name ?? 'Otherwise'}"`);
|
|
55
|
+
if (!this.state.matched) {
|
|
56
|
+
this.state.matched = true;
|
|
57
|
+
this.state.selected = body(this.state.input);
|
|
58
|
+
}
|
|
59
|
+
return this.state.selected;
|
|
60
|
+
}
|
|
61
|
+
exhaustive() {
|
|
62
|
+
return this.state.selected;
|
|
63
|
+
}
|
|
64
|
+
[Symbol.iterator]() {
|
|
65
|
+
return this.state.selected[Symbol.iterator]();
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
/** Marks a reusable Effect-returning function boundary as a Story Block. */
|
|
69
|
+
export function functionBlock(name, meta, fn) {
|
|
70
|
+
requireDescription(meta.description, `Block "${name}"`);
|
|
71
|
+
return fn;
|
|
72
|
+
}
|
|
73
|
+
/** Wraps an Effect in an inline Story Block. */
|
|
74
|
+
export function step(name, meta, effect) {
|
|
75
|
+
requireDescription(meta.description, `Block "${name}"`);
|
|
76
|
+
return effect;
|
|
77
|
+
}
|
|
78
|
+
/** Builds an eager, literal-keyed Effect Decision. */
|
|
79
|
+
export function decision(name, meta, input) {
|
|
80
|
+
requireDescription(meta.description, `Decision "${name}"`);
|
|
81
|
+
return new DecisionBuilderImpl({
|
|
82
|
+
input,
|
|
83
|
+
matched: false,
|
|
84
|
+
selected: Effect.void,
|
|
85
|
+
});
|
|
86
|
+
}
|
|
87
|
+
function requireDescription(description, subject) {
|
|
88
|
+
if (description.trim().length === 0) {
|
|
89
|
+
throw new TypeError(`${subject} description must not be empty`);
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
function requirePathSegment(name, subject) {
|
|
93
|
+
if (name.trim().length === 0) {
|
|
94
|
+
throw new TypeError(`${subject} name must not be empty`);
|
|
95
|
+
}
|
|
96
|
+
if (name.includes('/')) {
|
|
97
|
+
throw new TypeError(`${subject} name "${name}" must not contain "/"`);
|
|
98
|
+
}
|
|
99
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/story/effect/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,aAAa,EAAE,IAAI,EAAE,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAC/E,YAAY,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { decision, functionBlock, step, story, storyGroup } from './effect.js';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/story/runner/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,eAAe,EACf,cAAc,EACd,mBAAmB,EACnB,gBAAgB,GACjB,MAAM,aAAa,CAAC;AACrB,YAAY,EACV,mBAAmB,EACnB,gBAAgB,EAChB,YAAY,EACZ,eAAe,GAChB,MAAM,aAAa,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { discoverStories, executeStories, StoryDiscoveryError, StoryRunnerError, } from './runner.js';
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { Cause, Duration, Effect } from 'effect';
|
|
2
|
+
import type { StoryArtifact, StoryScenarioFailurePhase } from '../artifact/types.js';
|
|
3
|
+
import type { StoryCatalog } from '../../report/stories.js';
|
|
4
|
+
export interface StoryRunOptions {
|
|
5
|
+
readonly timeout?: Duration.Input;
|
|
6
|
+
}
|
|
7
|
+
export interface StoryFailure {
|
|
8
|
+
readonly storyId: string;
|
|
9
|
+
readonly scenario?: string;
|
|
10
|
+
readonly phase?: StoryScenarioFailurePhase;
|
|
11
|
+
readonly message: string;
|
|
12
|
+
}
|
|
13
|
+
export interface StoriesRunResult {
|
|
14
|
+
readonly status: 'passed' | 'failed';
|
|
15
|
+
readonly report: {
|
|
16
|
+
readonly stories: Readonly<Record<string, StoryArtifact>>;
|
|
17
|
+
};
|
|
18
|
+
readonly failures: readonly StoryFailure[];
|
|
19
|
+
}
|
|
20
|
+
declare const StoryRunnerError_base: new <A extends Record<string, any> = {}>(args: import("effect/Types").VoidIfEmpty<{ readonly [P in keyof A as P extends "_tag" ? never : P]: A[P]; }>) => Cause.YieldableError & {
|
|
21
|
+
readonly _tag: "StoryRunnerError";
|
|
22
|
+
} & Readonly<A>;
|
|
23
|
+
export declare class StoryRunnerError extends StoryRunnerError_base<{
|
|
24
|
+
readonly operation: 'discover' | 'execute';
|
|
25
|
+
readonly message: string;
|
|
26
|
+
readonly cause: unknown;
|
|
27
|
+
}> {
|
|
28
|
+
}
|
|
29
|
+
export interface StoryDiscoveryIssue {
|
|
30
|
+
readonly storyId?: string;
|
|
31
|
+
readonly message: string;
|
|
32
|
+
}
|
|
33
|
+
declare const StoryDiscoveryError_base: new <A extends Record<string, any> = {}>(args: import("effect/Types").VoidIfEmpty<{ readonly [P in keyof A as P extends "_tag" ? never : P]: A[P]; }>) => Cause.YieldableError & {
|
|
34
|
+
readonly _tag: "StoryDiscoveryError";
|
|
35
|
+
} & Readonly<A>;
|
|
36
|
+
export declare class StoryDiscoveryError extends StoryDiscoveryError_base<{
|
|
37
|
+
readonly message: string;
|
|
38
|
+
readonly issues: readonly StoryDiscoveryIssue[];
|
|
39
|
+
}> {
|
|
40
|
+
}
|
|
41
|
+
export declare function executeStories(baseDir: string, filters: readonly string[], options?: StoryRunOptions): Effect.Effect<StoriesRunResult, StoryRunnerError>;
|
|
42
|
+
export declare function discoverStories(baseDir: string): Effect.Effect<StoryCatalog, StoryDiscoveryError>;
|
|
43
|
+
export {};
|
|
44
|
+
//# sourceMappingURL=runner.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runner.d.ts","sourceRoot":"","sources":["../../../src/story/runner/runner.ts"],"names":[],"mappings":"AAIA,OAAO,EACL,KAAK,EAGL,QAAQ,EACR,MAAM,EAKP,MAAM,QAAQ,CAAC;AAQhB,OAAO,KAAK,EACV,aAAa,EAGb,yBAAyB,EAC1B,MAAM,sBAAsB,CAAC;AAQ9B,OAAO,KAAK,EACV,YAAY,EAGb,MAAM,yBAAyB,CAAC;AAEjC,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,OAAO,CAAC,EAAE,QAAQ,CAAC,KAAK,CAAC;CACnC;AAED,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,KAAK,CAAC,EAAE,yBAAyB,CAAC;IAC3C,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;CAC1B;AAED,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,MAAM,EAAE,QAAQ,GAAG,QAAQ,CAAC;IACrC,QAAQ,CAAC,MAAM,EAAE;QACf,QAAQ,CAAC,OAAO,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC,CAAC;KAC3D,CAAC;IACF,QAAQ,CAAC,QAAQ,EAAE,SAAS,YAAY,EAAE,CAAC;CAC5C;;;;AAED,qBAAa,gBAAiB,SAAQ,sBAAqC;IACzE,QAAQ,CAAC,SAAS,EAAE,UAAU,GAAG,SAAS,CAAC;IAC3C,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC;CACzB,CAAC;CAAG;AAEL,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;CAC1B;;;;AAED,qBAAa,mBAAoB,SAAQ,yBAEvC;IACA,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,MAAM,EAAE,SAAS,mBAAmB,EAAE,CAAC;CACjD,CAAC;CAAG;AAWL,wBAAgB,cAAc,CAC5B,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,SAAS,MAAM,EAAE,EAC1B,OAAO,CAAC,EAAE,eAAe,GACxB,MAAM,CAAC,MAAM,CAAC,gBAAgB,EAAE,gBAAgB,CAAC,CAKnD;AA8aD,wBAAgB,eAAe,CAC7B,OAAO,EAAE,MAAM,GACd,MAAM,CAAC,MAAM,CAAC,YAAY,EAAE,mBAAmB,CAAC,CAQlD"}
|