effect-bdd 0.1.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 (93) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +465 -0
  3. package/dist/Bdd.d.ts +285 -0
  4. package/dist/Bdd.d.ts.map +1 -0
  5. package/dist/Bdd.js +304 -0
  6. package/dist/Bdd.js.map +1 -0
  7. package/dist/Errors.d.ts +65 -0
  8. package/dist/Errors.d.ts.map +1 -0
  9. package/dist/Errors.js +58 -0
  10. package/dist/Errors.js.map +1 -0
  11. package/dist/bin.d.ts +3 -0
  12. package/dist/bin.d.ts.map +1 -0
  13. package/dist/bin.js +7 -0
  14. package/dist/bin.js.map +1 -0
  15. package/dist/index.d.ts +147 -0
  16. package/dist/index.d.ts.map +1 -0
  17. package/dist/index.js +31 -0
  18. package/dist/index.js.map +1 -0
  19. package/dist/internal/cli/errors.d.ts +30 -0
  20. package/dist/internal/cli/errors.d.ts.map +1 -0
  21. package/dist/internal/cli/errors.js +8 -0
  22. package/dist/internal/cli/errors.js.map +1 -0
  23. package/dist/internal/cli/glob.d.ts +13 -0
  24. package/dist/internal/cli/glob.d.ts.map +1 -0
  25. package/dist/internal/cli/glob.js +29 -0
  26. package/dist/internal/cli/glob.js.map +1 -0
  27. package/dist/internal/cli/loaders.d.ts +13 -0
  28. package/dist/internal/cli/loaders.d.ts.map +1 -0
  29. package/dist/internal/cli/loaders.js +44 -0
  30. package/dist/internal/cli/loaders.js.map +1 -0
  31. package/dist/internal/cli/models.d.ts +102 -0
  32. package/dist/internal/cli/models.d.ts.map +1 -0
  33. package/dist/internal/cli/models.js +2 -0
  34. package/dist/internal/cli/models.js.map +1 -0
  35. package/dist/internal/cli/moduleLoader.d.ts +14 -0
  36. package/dist/internal/cli/moduleLoader.d.ts.map +1 -0
  37. package/dist/internal/cli/moduleLoader.js +39 -0
  38. package/dist/internal/cli/moduleLoader.js.map +1 -0
  39. package/dist/internal/cli/reporter.d.ts +22 -0
  40. package/dist/internal/cli/reporter.d.ts.map +1 -0
  41. package/dist/internal/cli/reporter.js +227 -0
  42. package/dist/internal/cli/reporter.js.map +1 -0
  43. package/dist/internal/cli/runner.d.ts +14 -0
  44. package/dist/internal/cli/runner.d.ts.map +1 -0
  45. package/dist/internal/cli/runner.js +178 -0
  46. package/dist/internal/cli/runner.js.map +1 -0
  47. package/dist/internal/cli/tagExpression.d.ts +7 -0
  48. package/dist/internal/cli/tagExpression.d.ts.map +1 -0
  49. package/dist/internal/cli/tagExpression.js +127 -0
  50. package/dist/internal/cli/tagExpression.js.map +1 -0
  51. package/dist/internal/cucumberCompiler.d.ts +5 -0
  52. package/dist/internal/cucumberCompiler.d.ts.map +1 -0
  53. package/dist/internal/cucumberCompiler.js +49 -0
  54. package/dist/internal/cucumberCompiler.js.map +1 -0
  55. package/dist/internal/expression.d.ts +18 -0
  56. package/dist/internal/expression.d.ts.map +1 -0
  57. package/dist/internal/expression.js +59 -0
  58. package/dist/internal/expression.js.map +1 -0
  59. package/dist/internal/matching.d.ts +30 -0
  60. package/dist/internal/matching.d.ts.map +1 -0
  61. package/dist/internal/matching.js +37 -0
  62. package/dist/internal/matching.js.map +1 -0
  63. package/dist/internal/parser.d.ts +54 -0
  64. package/dist/internal/parser.d.ts.map +1 -0
  65. package/dist/internal/parser.js +93 -0
  66. package/dist/internal/parser.js.map +1 -0
  67. package/dist/internal/runner.d.ts +77 -0
  68. package/dist/internal/runner.d.ts.map +1 -0
  69. package/dist/internal/runner.js +117 -0
  70. package/dist/internal/runner.js.map +1 -0
  71. package/dist/main.d.ts +23 -0
  72. package/dist/main.d.ts.map +1 -0
  73. package/dist/main.js +104 -0
  74. package/dist/main.js.map +1 -0
  75. package/package.json +102 -0
  76. package/src/Bdd.ts +575 -0
  77. package/src/Errors.ts +60 -0
  78. package/src/bin.ts +10 -0
  79. package/src/index.ts +155 -0
  80. package/src/internal/cli/errors.ts +20 -0
  81. package/src/internal/cli/glob.ts +37 -0
  82. package/src/internal/cli/loaders.ts +100 -0
  83. package/src/internal/cli/models.ts +118 -0
  84. package/src/internal/cli/moduleLoader.ts +41 -0
  85. package/src/internal/cli/reporter.ts +367 -0
  86. package/src/internal/cli/runner.ts +336 -0
  87. package/src/internal/cli/tagExpression.ts +173 -0
  88. package/src/internal/cucumberCompiler.ts +58 -0
  89. package/src/internal/expression.ts +103 -0
  90. package/src/internal/matching.ts +81 -0
  91. package/src/internal/parser.ts +155 -0
  92. package/src/internal/runner.ts +373 -0
  93. package/src/main.ts +169 -0
@@ -0,0 +1,22 @@
1
+ import * as Effect from "effect/Effect";
2
+ import * as FileSystem from "effect/FileSystem";
3
+ import * as Path from "effect/Path";
4
+ import { ReporterError } from "./errors.ts";
5
+ import type { CliRunResult, ReporterName } from "./models.ts";
6
+ /** @internal */
7
+ export interface Reporter {
8
+ readonly name: ReporterName;
9
+ readonly emit: (result: CliRunResult) => Effect.Effect<void, ReporterError, FileSystem.FileSystem | Path.Path>;
10
+ }
11
+ /** @internal */
12
+ export declare const makeReporters: (names: ReadonlyArray<ReporterName>, outputFiles: {
13
+ readonly text?: string;
14
+ readonly html?: string;
15
+ readonly json?: string;
16
+ readonly junit?: string;
17
+ }, options: {
18
+ readonly verbose: boolean;
19
+ }) => Effect.Effect<ReadonlyArray<Reporter>, ReporterError>;
20
+ /** @internal */
21
+ export declare const emitAll: (reporters: ReadonlyArray<Reporter>, result: CliRunResult) => Effect.Effect<void, ReporterError, FileSystem.FileSystem | Path.Path>;
22
+ //# sourceMappingURL=reporter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reporter.d.ts","sourceRoot":"","sources":["../../../src/internal/cli/reporter.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AACvC,OAAO,KAAK,UAAU,MAAM,mBAAmB,CAAA;AAE/C,OAAO,KAAK,IAAI,MAAM,aAAa,CAAA;AAGnC,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAA;AAC3C,OAAO,KAAK,EAAiB,YAAY,EAAE,YAAY,EAAkB,MAAM,aAAa,CAAA;AAE5F,gBAAgB;AAChB,MAAM,WAAW,QAAQ;IACvB,QAAQ,CAAC,IAAI,EAAE,YAAY,CAAA;IAC3B,QAAQ,CAAC,IAAI,EAAE,CACb,MAAM,EAAE,YAAY,KACjB,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,aAAa,EAAE,UAAU,CAAC,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,CAAA;CAC3E;AAED,gBAAgB;AAChB,eAAO,MAAM,aAAa,GACxB,OAAO,aAAa,CAAC,YAAY,CAAC,EAClC,aAAa;IACX,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAA;IACtB,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAA;IACtB,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAA;IACtB,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CACxB,EACD,SAAS;IACP,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAA;CAC1B,KACA,MAAM,CAAC,MAAM,CAAC,aAAa,CAAC,QAAQ,CAAC,EAAE,aAAa,CAoBnD,CAAA;AAEJ,gBAAgB;AAChB,eAAO,MAAM,OAAO,EAAE,CACpB,SAAS,EAAE,aAAa,CAAC,QAAQ,CAAC,EAClC,MAAM,EAAE,YAAY,KACjB,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,aAAa,EAAE,UAAU,CAAC,UAAU,GAAG,IAAI,CAAC,IAAI,CAsBvE,CAAA"}
@@ -0,0 +1,227 @@
1
+ import * as Arr from "effect/Array";
2
+ import * as Console from "effect/Console";
3
+ import * as Effect from "effect/Effect";
4
+ import * as FileSystem from "effect/FileSystem";
5
+ import { pipe } from "effect/Function";
6
+ import * as Path from "effect/Path";
7
+ import * as Str from "effect/String";
8
+ import * as Parser from "../parser.js";
9
+ import { ReporterError } from "./errors.js";
10
+ /** @internal */
11
+ export const makeReporters = (names, outputFiles, options) => Effect.forEach(names, name => {
12
+ switch (name) {
13
+ case "text":
14
+ {
15
+ return Effect.succeed(textReporter(outputFiles.text, options.verbose));
16
+ }
17
+ case "html":
18
+ {
19
+ return outputFiles.html === undefined ? Effect.fail(new ReporterError({
20
+ message: "Reporter html requires --output-file.html"
21
+ })) : Effect.succeed(htmlReporter(outputFiles.html));
22
+ }
23
+ case "json":
24
+ {
25
+ return Effect.succeed(jsonReporter(outputFiles.json));
26
+ }
27
+ case "junit":
28
+ {
29
+ return outputFiles.junit === undefined ? Effect.fail(new ReporterError({
30
+ message: "Reporter junit requires --output-file.junit"
31
+ })) : Effect.succeed(junitReporter(outputFiles.junit));
32
+ }
33
+ }
34
+ });
35
+ /** @internal */
36
+ export const emitAll = /*#__PURE__*/Effect.fnUntraced(function* (reporters, result) {
37
+ const exits = yield* Effect.forEach(reporters, reporter => Effect.exit(reporter.emit(result)), {
38
+ concurrency: "unbounded"
39
+ });
40
+ const failures = pipe(exits, Arr.filter(exit => exit._tag === "Failure"), Arr.map(exit => exit.cause));
41
+ if (failures.length > 0) {
42
+ return yield* Effect.fail(new ReporterError({
43
+ message: "One or more reporters failed",
44
+ cause: failures
45
+ }));
46
+ }
47
+ });
48
+ const textReporter = (outputFile, verbose) => ({
49
+ name: "text",
50
+ emit: result => outputFile === undefined ? Console.log(renderText(result, verbose)) : writeFile(outputFile, renderText(result, verbose))
51
+ });
52
+ const htmlReporter = outputFile => ({
53
+ name: "html",
54
+ emit: result => writeFile(outputFile, renderHtml(result))
55
+ });
56
+ const jsonReporter = outputFile => ({
57
+ name: "json",
58
+ emit: result => outputFile === undefined ? Console.log(renderJson(result)) : writeFile(outputFile, renderJson(result))
59
+ });
60
+ const junitReporter = outputFile => ({
61
+ name: "junit",
62
+ emit: result => writeFile(outputFile, renderJunit(result))
63
+ });
64
+ const writeFile = /*#__PURE__*/Effect.fnUntraced(function* (outputFile, content) {
65
+ const fs = yield* FileSystem.FileSystem;
66
+ const path = yield* Path.Path;
67
+ const directory = path.dirname(outputFile);
68
+ if (directory !== ".") {
69
+ yield* fs.makeDirectory(directory, {
70
+ recursive: true
71
+ }).pipe(Effect.mapError(cause => new ReporterError({
72
+ message: `Could not create report directory "${directory}"`,
73
+ cause
74
+ })));
75
+ }
76
+ yield* fs.writeFileString(outputFile, content).pipe(Effect.mapError(cause => new ReporterError({
77
+ message: `Could not write report file "${outputFile}"`,
78
+ cause
79
+ })));
80
+ });
81
+ const renderText = (result, verbose) => {
82
+ const summary = [`Features: ${result.summary.features}, Scenarios: ${result.summary.total}, passed: ${result.summary.passed}, failed: ${result.summary.failed}`, `Duration: ${result.summary.durationMillis}ms`, ""];
83
+ const scenarioLines = verbose ? Arr.map(result.results, renderScenarioText) : pipe(result.results, Arr.filter(scenario => scenario.outcome._tag === "Failed"), Arr.map(renderScenarioText));
84
+ const diagnosticLines = renderDiagnosticsText(result.diagnostics);
85
+ return pipe(summary, Arr.appendAll(scenarioLines), Arr.appendAll(diagnosticLines), Arr.join("\n"));
86
+ };
87
+ const renderScenarioText = result => {
88
+ const prefix = result.outcome._tag === "Passed" ? "PASS" : "FAIL";
89
+ const base = `${prefix} ${result.task.featurePath}:${result.task.core.scenarioLine} ${renderScenarioName(result)} (${result.durationMillis}ms)`;
90
+ return result.outcome._tag === "Passed" ? base : `${base}\n ${renderError(result.outcome.error)}`;
91
+ };
92
+ const renderHtml = result => `<!doctype html>
93
+ <html lang="en">
94
+ <head>
95
+ <meta charset="utf-8">
96
+ <title>effect-bdd report</title>
97
+ <style>
98
+ body { font-family: system-ui, sans-serif; margin: 2rem; }
99
+ table { border-collapse: collapse; width: 100%; }
100
+ th, td { border: 1px solid #ddd; padding: 0.5rem; text-align: left; }
101
+ .passed { color: #166534; }
102
+ .failed { color: #991b1b; }
103
+ </style>
104
+ </head>
105
+ <body>
106
+ <h1>effect-bdd report</h1>
107
+ <p>Features: ${result.summary.features}, scenarios: ${result.summary.total}, passed: ${result.summary.passed}, failed: ${result.summary.failed}</p>
108
+ <p>Duration: ${result.summary.durationMillis}ms</p>
109
+ <table>
110
+ <thead>
111
+ <tr><th>Status</th><th>Source</th><th>Feature</th><th>Scenario</th><th>Tags</th><th>Duration</th><th>Error</th></tr>
112
+ </thead>
113
+ <tbody>
114
+ ${pipe(result.results, Arr.map(renderScenarioHtml), Arr.join("\n"))}
115
+ </tbody>
116
+ </table>
117
+ <h2>Diagnostics</h2>
118
+ <pre>${escapeHtml(pipe(renderDiagnosticsText(result.diagnostics), Arr.join("\n")))}</pre>
119
+ </body>
120
+ </html>
121
+ `;
122
+ const renderScenarioHtml = result => {
123
+ const status = result.outcome._tag === "Passed" ? "passed" : "failed";
124
+ const error = result.outcome._tag === "Passed" ? "" : renderError(result.outcome.error);
125
+ return ` <tr>
126
+ <td class="${status}">${status}</td>
127
+ <td>${escapeHtml(`${result.task.featurePath}:${result.task.core.scenarioLine}`)}</td>
128
+ <td>${escapeHtml(result.task.core.featureName)}</td>
129
+ <td>${escapeHtml(renderScenarioName(result))}</td>
130
+ <td>${escapeHtml(pipe(result.task.core.tags, Arr.join(", ")))}</td>
131
+ <td>${result.durationMillis}ms</td>
132
+ <td>${escapeHtml(error)}</td>
133
+ </tr>`;
134
+ };
135
+ const renderDiagnosticsText = diagnostics => {
136
+ if (diagnostics.length === 0) {
137
+ return [];
138
+ }
139
+ const unmatched = pipe(diagnostics, Arr.filter(diagnostic => diagnostic._tag === "UnmatchedFeature" || diagnostic._tag === "UnmatchedScenario" || diagnostic._tag === "UnmatchedStep"));
140
+ const unused = pipe(diagnostics, Arr.filter(diagnostic => diagnostic._tag === "UnusedFeatureDefinition" || diagnostic._tag === "UnusedStepDefinition"));
141
+ return pipe(unmatched.length === 0 ? [] : ["", "Unmatched source:"], Arr.appendAll(Arr.map(unmatched, renderDiagnosticText)), Arr.appendAll(unused.length === 0 ? [] : ["", "Unused definitions:"]), Arr.appendAll(Arr.map(unused, renderDiagnosticText)));
142
+ };
143
+ const renderDiagnosticText = diagnostic => {
144
+ switch (diagnostic._tag) {
145
+ case "UnmatchedFeature":
146
+ {
147
+ return ` ${diagnostic.featurePath}:${diagnostic.line}\n Feature: ${diagnostic.featureName}\n Reason: ${diagnostic.message}`;
148
+ }
149
+ case "UnmatchedScenario":
150
+ {
151
+ return ` ${diagnostic.featurePath}:${diagnostic.scenarioLine}\n Scenario: ${diagnostic.scenarioName}\n Reason: ${diagnostic.message}`;
152
+ }
153
+ case "UnmatchedStep":
154
+ {
155
+ return ` ${diagnostic.featurePath}:${Parser.stepLine(diagnostic.step, diagnostic.source)}\n Scenario: ${diagnostic.featureName} / ${diagnostic.scenarioName}\n Step: ${Parser.stepKeyword(diagnostic.step, diagnostic.source)} ${diagnostic.step.text}\n Reason: ${diagnostic.message}`;
156
+ }
157
+ case "UnusedFeatureDefinition":
158
+ {
159
+ return ` ${diagnostic.message}`;
160
+ }
161
+ case "UnusedStepDefinition":
162
+ {
163
+ return ` ${diagnostic.message}`;
164
+ }
165
+ }
166
+ };
167
+ const renderJson = result => JSON.stringify({
168
+ summary: result.summary,
169
+ scenarios: Arr.map(result.results, scenario => ({
170
+ source: {
171
+ path: scenario.task.featurePath,
172
+ line: scenario.task.core.scenarioLine
173
+ },
174
+ feature: scenario.task.core.featureName,
175
+ rule: scenario.task.core.ruleName === undefined ? undefined : {
176
+ name: scenario.task.core.ruleName,
177
+ line: scenario.task.core.ruleLine
178
+ },
179
+ scenario: scenario.task.core.scenarioName,
180
+ tags: scenario.task.core.tags,
181
+ durationMillis: scenario.durationMillis,
182
+ outcome: scenario.outcome._tag === "Passed" ? {
183
+ status: "passed",
184
+ steps: scenario.outcome.steps
185
+ } : {
186
+ status: "failed",
187
+ error: renderError(scenario.outcome.error)
188
+ }
189
+ })),
190
+ diagnostics: result.diagnostics
191
+ }, null, 2);
192
+ const renderJunit = result => {
193
+ const diagnostics = result.diagnostics.length;
194
+ return `<?xml version="1.0" encoding="UTF-8"?>
195
+ <testsuite name="effect-bdd" tests="${result.summary.total + diagnostics}" failures="${result.summary.failed + diagnostics}" time="${result.summary.durationMillis / 1000}">
196
+ ${pipe(result.results, Arr.map(renderJunitScenario), Arr.join("\n"))}
197
+ ${pipe(result.diagnostics, Arr.map(renderJunitDiagnostic), Arr.join("\n"))}
198
+ </testsuite>
199
+ `;
200
+ };
201
+ const renderJunitScenario = result => {
202
+ const name = renderScenarioName(result);
203
+ const failure = result.outcome._tag === "Passed" ? "" : `
204
+ <failure message="${escapeXml(renderError(result.outcome.error))}">${escapeXml(renderError(result.outcome.error))}</failure>`;
205
+ return ` <testcase classname="${escapeXml(result.task.core.featureName)}" name="${escapeXml(name)}" file="${escapeXml(result.task.featurePath)}" line="${result.task.core.scenarioLine}" time="${result.durationMillis / 1000}">${failure}
206
+ </testcase>`;
207
+ };
208
+ const renderJunitDiagnostic = diagnostic => ` <testcase classname="effect-bdd diagnostics" name="${escapeXml(diagnostic.message)}">
209
+ <failure message="${escapeXml(diagnostic.message)}">${escapeXml(renderDiagnosticText(diagnostic))}</failure>
210
+ </testcase>`;
211
+ const renderScenarioName = result => result.task.core.ruleName === undefined ? `${result.task.core.featureName} / ${result.task.core.scenarioName}` : `${result.task.core.featureName} / ${result.task.core.ruleName} / ${result.task.core.scenarioName}`;
212
+ const renderError = error => {
213
+ const cause = renderCause(error.cause);
214
+ return cause === undefined ? `${error._tag}: ${error.message}` : `${error._tag}: ${error.message}\n Cause: ${cause}`;
215
+ };
216
+ const renderCause = cause => {
217
+ if (cause === undefined) {
218
+ return undefined;
219
+ }
220
+ if (typeof cause === "object" && cause !== null && "message" in cause && typeof cause.message === "string") {
221
+ return cause.message;
222
+ }
223
+ return String(cause);
224
+ };
225
+ const escapeHtml = text => pipe(text, Str.replaceAll("&", "&amp;"), Str.replaceAll("<", "&lt;"), Str.replaceAll(">", "&gt;"), Str.replaceAll("\"", "&quot;"), Str.replaceAll("'", "&#039;"));
226
+ const escapeXml = escapeHtml;
227
+ //# sourceMappingURL=reporter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reporter.js","names":["Arr","Console","Effect","FileSystem","pipe","Path","Str","Parser","ReporterError","makeReporters","names","outputFiles","options","forEach","name","succeed","textReporter","text","verbose","html","undefined","fail","message","htmlReporter","jsonReporter","json","junit","junitReporter","emitAll","fnUntraced","reporters","result","exits","reporter","exit","emit","concurrency","failures","filter","_tag","map","cause","length","outputFile","log","renderText","writeFile","renderHtml","renderJson","renderJunit","content","fs","path","directory","dirname","makeDirectory","recursive","mapError","writeFileString","summary","features","total","passed","failed","durationMillis","scenarioLines","results","renderScenarioText","scenario","outcome","diagnosticLines","renderDiagnosticsText","diagnostics","appendAll","join","prefix","base","task","featurePath","core","scenarioLine","renderScenarioName","renderError","error","renderScenarioHtml","escapeHtml","status","featureName","tags","unmatched","diagnostic","unused","renderDiagnosticText","line","scenarioName","stepLine","step","source","stepKeyword","JSON","stringify","scenarios","feature","rule","ruleName","ruleLine","steps","renderJunitScenario","renderJunitDiagnostic","failure","escapeXml","renderCause","String","replaceAll"],"sources":["../../../src/internal/cli/reporter.ts"],"sourcesContent":[null],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,14 @@
1
+ import * as Effect from "effect/Effect";
2
+ import type * as FileSystem from "effect/FileSystem";
3
+ import type * as Path from "effect/Path";
4
+ import type { ParseError } from "../../Errors.ts";
5
+ import * as Parser from "../parser.ts";
6
+ import { DiscoveryError, type ModuleLoadError } from "./errors.ts";
7
+ import type { GlobResolver } from "./glob.ts";
8
+ import type { CliOptions, CliRunResult } from "./models.ts";
9
+ import type { ModuleLoader } from "./moduleLoader.ts";
10
+ /** @internal */
11
+ export declare const run: (options: CliOptions) => Effect.Effect<CliRunResult, CliRunError, FileSystem.FileSystem | GlobResolver | ModuleLoader | Path.Path | Parser.GherkinCompiler>;
12
+ /** @internal */
13
+ export type CliRunError = DiscoveryError | ModuleLoadError | ParseError;
14
+ //# sourceMappingURL=runner.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runner.d.ts","sourceRoot":"","sources":["../../../src/internal/cli/runner.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AACvC,OAAO,KAAK,KAAK,UAAU,MAAM,mBAAmB,CAAA;AAGpD,OAAO,KAAK,KAAK,IAAI,MAAM,aAAa,CAAA;AAExC,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAA;AAEjD,OAAO,KAAK,MAAM,MAAM,cAAc,CAAA;AAEtC,OAAO,EAAE,cAAc,EAAE,KAAK,eAAe,EAAE,MAAM,aAAa,CAAA;AAClE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,WAAW,CAAA;AAE7C,OAAO,KAAK,EAEV,UAAU,EACV,YAAY,EAKb,MAAM,aAAa,CAAA;AACpB,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAA;AAcrD,gBAAgB;AAChB,eAAO,MAAM,GAAG,EAAE,CAChB,OAAO,EAAE,UAAU,KAChB,MAAM,CAAC,MAAM,CAChB,YAAY,EACZ,WAAW,EACX,UAAU,CAAC,UAAU,GAAG,YAAY,GAAG,YAAY,GAAG,IAAI,CAAC,IAAI,GAAG,MAAM,CAAC,eAAe,CA6BxF,CAAA;AAqQF,gBAAgB;AAChB,MAAM,MAAM,WAAW,GAAG,cAAc,GAAG,eAAe,GAAG,UAAU,CAAA"}
@@ -0,0 +1,178 @@
1
+ import * as Arr from "effect/Array";
2
+ import * as Clock from "effect/Clock";
3
+ import * as Effect from "effect/Effect";
4
+ import { pipe } from "effect/Function";
5
+ import * as Option from "effect/Option";
6
+ import * as Matching from "../matching.js";
7
+ import * as Parser from "../parser.js";
8
+ import * as CoreRunner from "../runner.js";
9
+ import { DiscoveryError } from "./errors.js";
10
+ import { loadFeatureDefinitions, loadFeatureSources } from "./loaders.js";
11
+ import * as TagExpression from "./tagExpression.js";
12
+ /** @internal */
13
+ export const run = /*#__PURE__*/Effect.fnUntraced(function* (options) {
14
+ const startedAt = yield* Clock.currentTimeMillis;
15
+ const sources = yield* loadFeatureSources(options.features);
16
+ const definitions = yield* loadFeatureDefinitions(options.steps);
17
+ const built = yield* pipe(sources, Effect.forEach(source => buildScenarioTasks(source, definitions)), Effect.map(combineBuiltScenarios));
18
+ const filteredTasks = yield* filterTasks(options, built.tasks);
19
+ const coverage = collectStepCoverage(filteredTasks);
20
+ const results = yield* runScenarios(options, filteredTasks);
21
+ const finishedAt = yield* Clock.currentTimeMillis;
22
+ const diagnostics = pipe(built.diagnostics, Arr.appendAll(coverage.diagnostics), Arr.appendAll(unusedFeatureDefinitions(definitions, built.matchedFeatureNames)), Arr.appendAll(hasScenarioFilter(options) ? [] : unusedStepDefinitions(definitions, built.matchedFeatureNames, coverage.usedTransitionKeys)));
23
+ return {
24
+ results,
25
+ diagnostics,
26
+ summary: summarize(sources.length, results, finishedAt - startedAt)
27
+ };
28
+ });
29
+ const buildScenarioTasks = /*#__PURE__*/Effect.fnUntraced(function* (source, definitions) {
30
+ const parsed = yield* Parser.parse(source.source, source.path);
31
+ const matches = Arr.filter(definitions, definition => definition.name === parsed.name);
32
+ if (matches.length > 1) {
33
+ return yield* Effect.fail(new DiscoveryError({
34
+ message: `Multiple feature definitions matched "${parsed.name}"`
35
+ }));
36
+ }
37
+ const definition = matches[0];
38
+ if (definition === undefined) {
39
+ return {
40
+ tasks: [],
41
+ diagnostics: pipe([{
42
+ _tag: "UnmatchedFeature",
43
+ featurePath: source.path,
44
+ featureName: parsed.name,
45
+ line: parsed.line,
46
+ message: `Feature file has no matching Bdd.feature export: ${parsed.name}`
47
+ }], Arr.appendAll(Arr.map(parsed.pickles, pickle => ({
48
+ _tag: "UnmatchedScenario",
49
+ featurePath: source.path,
50
+ featureName: parsed.name,
51
+ scenarioName: pickle.name,
52
+ scenarioLine: pickle.location?.line ?? parsed.line,
53
+ message: `Scenario cannot run because no feature definition matched "${parsed.name}"`
54
+ })))),
55
+ matchedFeatureNames: []
56
+ };
57
+ }
58
+ return pipe(CoreRunner.buildScenarioTasks(definition, parsed), Arr.map(task => ({
59
+ featurePath: source.path,
60
+ core: task
61
+ })), tasks => ({
62
+ tasks,
63
+ diagnostics: [],
64
+ matchedFeatureNames: [definition.name]
65
+ }));
66
+ });
67
+ const runScenario = /*#__PURE__*/Effect.fnUntraced(function* (task) {
68
+ const startedAt = yield* Clock.currentTimeMillis;
69
+ const result = yield* Effect.result(CoreRunner.runScenarioTask(task.core));
70
+ const finishedAt = yield* Clock.currentTimeMillis;
71
+ return {
72
+ task,
73
+ outcome: result._tag === "Success" ? {
74
+ _tag: "Passed",
75
+ steps: result.success.steps
76
+ } : {
77
+ _tag: "Failed",
78
+ error: result.failure
79
+ },
80
+ durationMillis: finishedAt - startedAt
81
+ };
82
+ });
83
+ const runScenarios = (options, tasks) => options.filters.failFast ? runScenariosFailFast(tasks, []) : Effect.forEach(tasks, runScenario, {
84
+ concurrency: options.parallel
85
+ });
86
+ const runScenariosFailFast = (tasks, results, index = 0) => {
87
+ if (index >= tasks.length) {
88
+ return Effect.succeed(results);
89
+ }
90
+ return pipe(runScenario(tasks[index]), Effect.flatMap(result => result.outcome._tag === "Failed" ? Effect.succeed(Arr.append(results, result)) : runScenariosFailFast(tasks, Arr.append(results, result), index + 1)));
91
+ };
92
+ const filterTasks = (options, tasks) => pipe(TagExpression.compileAll(options.filters.tags), Effect.map(tagPredicate => {
93
+ const filtered = Arr.filter(tasks, task => tagPredicate(task.core.tags) && matchesNameFilter(options.filters.names, task));
94
+ return filtered;
95
+ }), Effect.flatMap(filtered => tasks.length > 0 && filtered.length === 0 ? Effect.fail(new DiscoveryError({
96
+ message: "No scenarios matched the provided filters"
97
+ })) : Effect.succeed(filtered)));
98
+ const matchesNameFilter = (patterns, task) => patterns.length === 0 || Arr.some(patterns, pattern => `${task.core.featureName} / ${task.core.scenarioName}`.includes(pattern));
99
+ const hasScenarioFilter = options => options.filters.tags.length > 0 || options.filters.names.length > 0;
100
+ const summarize = (features, results, durationMillis) => {
101
+ const failed = Arr.filter(results, result => result.outcome._tag === "Failed").length;
102
+ return {
103
+ features,
104
+ total: results.length,
105
+ passed: results.length - failed,
106
+ failed,
107
+ durationMillis
108
+ };
109
+ };
110
+ const combineBuiltScenarios = built => ({
111
+ tasks: pipe(built, Arr.flatMap(item => item.tasks)),
112
+ diagnostics: pipe(built, Arr.flatMap(item => item.diagnostics)),
113
+ matchedFeatureNames: pipe(built, Arr.flatMap(item => item.matchedFeatureNames), Arr.dedupe)
114
+ });
115
+ const collectStepCoverage = tasks => pipe(tasks, Arr.reduce({
116
+ diagnostics: [],
117
+ usedTransitionKeys: []
118
+ }, (coverage, task) => pipe(task.core.pickle.steps, Arr.reduce(coverage, (coverage, step) => appendStepCoverage(coverage, task, step)))));
119
+ const appendStepCoverage = (coverage, task, step) => {
120
+ const kind = Matching.concreteStepKind(step);
121
+ const textMatches = Matching.matchingTextTransitions(task.core.featureDefinition.transitions, step.text);
122
+ const matches = pipe(kind, Option.match({
123
+ onNone: () => [],
124
+ onSome: kind => Matching.matchingKeywordTransitions(textMatches, kind)
125
+ }));
126
+ if (matches.length === 0) {
127
+ return {
128
+ diagnostics: Arr.append(coverage.diagnostics, {
129
+ _tag: "UnmatchedStep",
130
+ featurePath: task.featurePath,
131
+ featureName: task.core.featureName,
132
+ scenarioName: task.core.scenarioName,
133
+ scenarioLine: task.core.scenarioLine,
134
+ step,
135
+ source: task.core.source,
136
+ reason: textMatches.length === 0 ? "NoMatch" : "WrongKeyword",
137
+ candidates: textMatches.length === 0 ? Arr.map(task.core.featureDefinition.transitions, transition => transition.expression.source) : Arr.map(textMatches, match => match.transition.expression.source),
138
+ message: textMatches.length === 0 ? `No transition matched step "${step.text}"` : `No ${pipe(kind, Option.getOrElse(() => "Step"))} transition matched step "${step.text}"; matching text exists for ${Matching.renderTransitionKinds(Arr.map(textMatches, match => match.transition))}`
139
+ }),
140
+ usedTransitionKeys: coverage.usedTransitionKeys
141
+ };
142
+ }
143
+ if (matches.length > 1) {
144
+ return {
145
+ diagnostics: Arr.append(coverage.diagnostics, {
146
+ _tag: "UnmatchedStep",
147
+ featurePath: task.featurePath,
148
+ featureName: task.core.featureName,
149
+ scenarioName: task.core.scenarioName,
150
+ scenarioLine: task.core.scenarioLine,
151
+ step,
152
+ source: task.core.source,
153
+ reason: "MultipleMatches",
154
+ candidates: Arr.map(matches, match => match.transition.expression.source),
155
+ message: `Multiple transitions matched step "${step.text}"`
156
+ }),
157
+ usedTransitionKeys: coverage.usedTransitionKeys
158
+ };
159
+ }
160
+ return {
161
+ diagnostics: coverage.diagnostics,
162
+ usedTransitionKeys: pipe(coverage.usedTransitionKeys, Arr.append(transitionKey(task.core.featureName, matches[0].transition)), Arr.dedupe)
163
+ };
164
+ };
165
+ const unusedFeatureDefinitions = (definitions, matchedFeatureNames) => pipe(definitions, Arr.filter(definition => !Arr.contains(definition.name)(matchedFeatureNames)), Arr.map(definition => ({
166
+ _tag: "UnusedFeatureDefinition",
167
+ featureName: definition.name,
168
+ message: `Feature definition exported but no feature file matched: ${definition.name}`
169
+ })));
170
+ const unusedStepDefinitions = (definitions, matchedFeatureNames, usedTransitionKeys) => pipe(definitions, Arr.filter(definition => Arr.contains(definition.name)(matchedFeatureNames)), Arr.flatMap(definition => pipe(definition.transitions, Arr.filter(transition => !Arr.contains(transitionKey(definition.name, transition))(usedTransitionKeys)), Arr.map(transition => ({
171
+ _tag: "UnusedStepDefinition",
172
+ featureName: definition.name,
173
+ expression: transition.expression.source,
174
+ kind: transition.kind,
175
+ message: `Step definition never matched: ${transition.expression.source}`
176
+ })))));
177
+ const transitionKey = (featureName, transition) => `${featureName}:${transition.kind}:${transition.expression.source}`;
178
+ //# sourceMappingURL=runner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runner.js","names":["Arr","Clock","Effect","pipe","Option","Matching","Parser","CoreRunner","DiscoveryError","loadFeatureDefinitions","loadFeatureSources","TagExpression","run","fnUntraced","options","startedAt","currentTimeMillis","sources","features","definitions","steps","built","forEach","source","buildScenarioTasks","map","combineBuiltScenarios","filteredTasks","filterTasks","tasks","coverage","collectStepCoverage","results","runScenarios","finishedAt","diagnostics","appendAll","unusedFeatureDefinitions","matchedFeatureNames","hasScenarioFilter","unusedStepDefinitions","usedTransitionKeys","summary","summarize","length","parsed","parse","path","matches","filter","definition","name","fail","message","undefined","_tag","featurePath","featureName","line","pickles","pickle","scenarioName","scenarioLine","location","task","core","runScenario","result","runScenarioTask","outcome","success","error","failure","durationMillis","filters","failFast","runScenariosFailFast","concurrency","parallel","index","succeed","flatMap","append","compileAll","tags","tagPredicate","filtered","matchesNameFilter","names","patterns","some","pattern","includes","failed","total","passed","item","dedupe","reduce","step","appendStepCoverage","kind","concreteStepKind","textMatches","matchingTextTransitions","featureDefinition","transitions","text","match","onNone","onSome","matchingKeywordTransitions","reason","candidates","transition","expression","getOrElse","renderTransitionKinds","transitionKey","contains"],"sources":["../../../src/internal/cli/runner.ts"],"sourcesContent":[null],"mappings":"AAAA,OAAO,KAAKA,GAAG,MAAM,cAAc;AACnC,OAAO,KAAKC,KAAK,MAAM,cAAc;AACrC,OAAO,KAAKC,MAAM,MAAM,eAAe;AAEvC,SAASC,IAAI,QAAQ,iBAAiB;AACtC,OAAO,KAAKC,MAAM,MAAM,eAAe;AAIvC,OAAO,KAAKC,QAAQ,MAAM,gBAAgB;AAC1C,OAAO,KAAKC,MAAM,MAAM,cAAc;AACtC,OAAO,KAAKC,UAAU,MAAM,cAAc;AAC1C,SAASC,cAAc,QAA8B,aAAa;AAElE,SAASC,sBAAsB,EAAEC,kBAAkB,QAAQ,cAAc;AAWzE,OAAO,KAAKC,aAAa,MAAM,oBAAoB;AAanD;AACA,OAAO,MAAMC,GAAG,gBAMZV,MAAM,CAACW,UAAU,CAAC,WAAUC,OAAmB;EACjD,MAAMC,SAAS,GAAG,OAAOd,KAAK,CAACe,iBAAiB;EAChD,MAAMC,OAAO,GAAG,OAAOP,kBAAkB,CAACI,OAAO,CAACI,QAAQ,CAAC;EAC3D,MAAMC,WAAW,GAAG,OAAOV,sBAAsB,CAACK,OAAO,CAACM,KAAK,CAAC;EAChE,MAAMC,KAAK,GAAG,OAAOlB,IAAI,CACvBc,OAAO,EACPf,MAAM,CAACoB,OAAO,CAAEC,MAAM,IAAKC,kBAAkB,CAACD,MAAM,EAAEJ,WAAW,CAAC,CAAC,EACnEjB,MAAM,CAACuB,GAAG,CAACC,qBAAqB,CAAC,CAClC;EACD,MAAMC,aAAa,GAAG,OAAOC,WAAW,CAACd,OAAO,EAAEO,KAAK,CAACQ,KAAK,CAAC;EAC9D,MAAMC,QAAQ,GAAGC,mBAAmB,CAACJ,aAAa,CAAC;EACnD,MAAMK,OAAO,GAAG,OAAOC,YAAY,CAACnB,OAAO,EAAEa,aAAa,CAAC;EAC3D,MAAMO,UAAU,GAAG,OAAOjC,KAAK,CAACe,iBAAiB;EACjD,MAAMmB,WAAW,GAAiChC,IAAI,CACpDkB,KAAK,CAACc,WAAW,EACjBnC,GAAG,CAACoC,SAAS,CAACN,QAAQ,CAACK,WAAW,CAAC,EACnCnC,GAAG,CAACoC,SAAS,CAACC,wBAAwB,CAAClB,WAAW,EAAEE,KAAK,CAACiB,mBAAmB,CAAC,CAAC,EAC/EtC,GAAG,CAACoC,SAAS,CACXG,iBAAiB,CAACzB,OAAO,CAAC,GACtB,EAAE,GACF0B,qBAAqB,CAACrB,WAAW,EAAEE,KAAK,CAACiB,mBAAmB,EAAER,QAAQ,CAACW,kBAAkB,CAAC,CAC/F,CACF;EACD,OAAO;IACLT,OAAO;IACPG,WAAW;IACXO,OAAO,EAAEC,SAAS,CAAC1B,OAAO,CAAC2B,MAAM,EAAEZ,OAAO,EAAEE,UAAU,GAAGnB,SAAS;GAC5C;AAC1B,CAAC,CAAC;AAEF,MAAMS,kBAAkB,gBAGkEtB,MAAM,CAACW,UAAU,CAAC,WAC1GU,MAAqB,EACrBJ,WAAgE;EAEhE,MAAM0B,MAAM,GAAG,OAAOvC,MAAM,CAACwC,KAAK,CAACvB,MAAM,CAACA,MAAM,EAAEA,MAAM,CAACwB,IAAI,CAAC;EAC9D,MAAMC,OAAO,GAAGhD,GAAG,CAACiD,MAAM,CAAC9B,WAAW,EAAG+B,UAAU,IAAKA,UAAU,CAACC,IAAI,KAAKN,MAAM,CAACM,IAAI,CAAC;EACxF,IAAIH,OAAO,CAACJ,MAAM,GAAG,CAAC,EAAE;IACtB,OAAO,OAAO1C,MAAM,CAACkD,IAAI,CACvB,IAAI5C,cAAc,CAAC;MACjB6C,OAAO,EAAE,yCAAyCR,MAAM,CAACM,IAAI;KAC9D,CAAC,CACH;EACH;EACA,MAAMD,UAAU,GAAGF,OAAO,CAAC,CAAC,CAAC;EAC7B,IAAIE,UAAU,KAAKI,SAAS,EAAE;IAC5B,OAAO;MACLzB,KAAK,EAAE,EAAE;MACTM,WAAW,EAAEhC,IAAI,CACf,CACE;QACEoD,IAAI,EAAE,kBAAkB;QACxBC,WAAW,EAAEjC,MAAM,CAACwB,IAAI;QACxBU,WAAW,EAAEZ,MAAM,CAACM,IAAI;QACxBO,IAAI,EAAEb,MAAM,CAACa,IAAI;QACjBL,OAAO,EAAE,oDAAoDR,MAAM,CAACM,IAAI;OACjD,CAC1B,EACDnD,GAAG,CAACoC,SAAS,CAACpC,GAAG,CAACyB,GAAG,CAACoB,MAAM,CAACc,OAAO,EAAGC,MAAM,KAAqB;QAChEL,IAAI,EAAE,mBAAmB;QACzBC,WAAW,EAAEjC,MAAM,CAACwB,IAAI;QACxBU,WAAW,EAAEZ,MAAM,CAACM,IAAI;QACxBU,YAAY,EAAED,MAAM,CAACT,IAAI;QACzBW,YAAY,EAAEF,MAAM,CAACG,QAAQ,EAAEL,IAAI,IAAIb,MAAM,CAACa,IAAI;QAClDL,OAAO,EAAE,8DAA8DR,MAAM,CAACM,IAAI;OACnF,CAAC,CAAC,CAAC,CACL;MACDb,mBAAmB,EAAE;KACtB;EACH;EACA,OAAOnC,IAAI,CACTI,UAAU,CAACiB,kBAAkB,CAAC0B,UAAU,EAAEL,MAAM,CAAC,EACjD7C,GAAG,CAACyB,GAAG,CAAEuC,IAAI,KAAoB;IAC/BR,WAAW,EAAEjC,MAAM,CAACwB,IAAI;IACxBkB,IAAI,EAAED;GACP,CAAC,CAAC,EACFnC,KAAK,KAAsB;IAC1BA,KAAK;IACLM,WAAW,EAAE,EAAE;IACfG,mBAAmB,EAAE,CAACY,UAAU,CAACC,IAAI;GACtC,CAAC,CACH;AACH,CAAC,CAAC;AAEF,MAAMe,WAAW,gBAAGhE,MAAM,CAACW,UAAU,CAAC,WAAUmD,IAAkB;EAChE,MAAMjD,SAAS,GAAG,OAAOd,KAAK,CAACe,iBAAiB;EAChD,MAAMmD,MAAM,GAAG,OAAOjE,MAAM,CAACiE,MAAM,CAAC5D,UAAU,CAAC6D,eAAe,CAACJ,IAAI,CAACC,IAAI,CAAC,CAAC;EAC1E,MAAM/B,UAAU,GAAG,OAAOjC,KAAK,CAACe,iBAAiB;EACjD,OAAO;IACLgD,IAAI;IACJK,OAAO,EAAEF,MAAM,CAACZ,IAAI,KAAK,SAAS,GAC9B;MAAEA,IAAI,EAAE,QAAQ;MAAEnC,KAAK,EAAE+C,MAAM,CAACG,OAAO,CAAClD;IAAK,CAAE,GAC/C;MAAEmC,IAAI,EAAE,QAAQ;MAAEgB,KAAK,EAAEJ,MAAM,CAACK;IAAO,CAAE;IAC7CC,cAAc,EAAEvC,UAAU,GAAGnB;GACL;AAC5B,CAAC,CAAC;AAEF,MAAMkB,YAAY,GAAGA,CACnBnB,OAAmB,EACnBe,KAAkC,KAElCf,OAAO,CAAC4D,OAAO,CAACC,QAAQ,GACpBC,oBAAoB,CAAC/C,KAAK,EAAE,EAAE,CAAC,GAC/B3B,MAAM,CAACoB,OAAO,CAACO,KAAK,EAAEqC,WAAW,EAAE;EAAEW,WAAW,EAAE/D,OAAO,CAACgE;AAAQ,CAAE,CAAC;AAE3E,MAAMF,oBAAoB,GAAGA,CAC3B/C,KAAkC,EAClCG,OAAsC,EACtC+C,KAAK,GAAG,CAAC,KACqD;EAC9D,IAAIA,KAAK,IAAIlD,KAAK,CAACe,MAAM,EAAE;IACzB,OAAO1C,MAAM,CAAC8E,OAAO,CAAChD,OAAO,CAAC;EAChC;EACA,OAAO7B,IAAI,CACT+D,WAAW,CAACrC,KAAK,CAACkD,KAAK,CAAC,CAAC,EACzB7E,MAAM,CAAC+E,OAAO,CAAEd,MAAM,IACpBA,MAAM,CAACE,OAAO,CAACd,IAAI,KAAK,QAAQ,GAC5BrD,MAAM,CAAC8E,OAAO,CAAChF,GAAG,CAACkF,MAAM,CAAClD,OAAO,EAAEmC,MAAM,CAAC,CAAC,GAC3CS,oBAAoB,CAAC/C,KAAK,EAAE7B,GAAG,CAACkF,MAAM,CAAClD,OAAO,EAAEmC,MAAM,CAAC,EAAEY,KAAK,GAAG,CAAC,CAAC,CACxE,CACF;AACH,CAAC;AAED,MAAMnD,WAAW,GAAGA,CAClBd,OAAmB,EACnBe,KAAkC,KAElC1B,IAAI,CACFQ,aAAa,CAACwE,UAAU,CAACrE,OAAO,CAAC4D,OAAO,CAACU,IAAI,CAAC,EAC9ClF,MAAM,CAACuB,GAAG,CAAE4D,YAAY,IAAI;EAC1B,MAAMC,QAAQ,GAAGtF,GAAG,CAACiD,MAAM,CAACpB,KAAK,EAAGmC,IAAI,IACtCqB,YAAY,CAACrB,IAAI,CAACC,IAAI,CAACmB,IAAI,CAAC,IAAIG,iBAAiB,CAACzE,OAAO,CAAC4D,OAAO,CAACc,KAAK,EAAExB,IAAI,CAAC,CAAC;EACjF,OAAOsB,QAAQ;AACjB,CAAC,CAAC,EACFpF,MAAM,CAAC+E,OAAO,CAAEK,QAAQ,IACtBzD,KAAK,CAACe,MAAM,GAAG,CAAC,IAAI0C,QAAQ,CAAC1C,MAAM,KAAK,CAAC,GACrC1C,MAAM,CAACkD,IAAI,CAAC,IAAI5C,cAAc,CAAC;EAAE6C,OAAO,EAAE;AAA2C,CAAE,CAAC,CAAC,GACzFnD,MAAM,CAAC8E,OAAO,CAACM,QAAQ,CAAC,CAC7B,CACF;AAEH,MAAMC,iBAAiB,GAAGA,CAACE,QAA+B,EAAEzB,IAAkB,KAC5EyB,QAAQ,CAAC7C,MAAM,KAAK,CAAC,IACrB5C,GAAG,CAAC0F,IAAI,CAACD,QAAQ,EAAGE,OAAO,IAAK,GAAG3B,IAAI,CAACC,IAAI,CAACR,WAAW,MAAMO,IAAI,CAACC,IAAI,CAACJ,YAAY,EAAE,CAAC+B,QAAQ,CAACD,OAAO,CAAC,CAAC;AAE3G,MAAMpD,iBAAiB,GAAIzB,OAAmB,IAC5CA,OAAO,CAAC4D,OAAO,CAACU,IAAI,CAACxC,MAAM,GAAG,CAAC,IAAI9B,OAAO,CAAC4D,OAAO,CAACc,KAAK,CAAC5C,MAAM,GAAG,CAAC;AAErE,MAAMD,SAAS,GAAGA,CAACzB,QAAgB,EAAEc,OAAsC,EAAEyC,cAAsB,KAAgB;EACjH,MAAMoB,MAAM,GAAG7F,GAAG,CAACiD,MAAM,CAACjB,OAAO,EAAGmC,MAAM,IAAKA,MAAM,CAACE,OAAO,CAACd,IAAI,KAAK,QAAQ,CAAC,CAACX,MAAM;EACvF,OAAO;IACL1B,QAAQ;IACR4E,KAAK,EAAE9D,OAAO,CAACY,MAAM;IACrBmD,MAAM,EAAE/D,OAAO,CAACY,MAAM,GAAGiD,MAAM;IAC/BA,MAAM;IACNpB;GACD;AACH,CAAC;AAED,MAAM/C,qBAAqB,GAAIL,KAAoC,KAAsB;EACvFQ,KAAK,EAAE1B,IAAI,CAACkB,KAAK,EAAErB,GAAG,CAACiF,OAAO,CAAEe,IAAI,IAAKA,IAAI,CAACnE,KAAK,CAAC,CAAC;EACrDM,WAAW,EAAEhC,IAAI,CAACkB,KAAK,EAAErB,GAAG,CAACiF,OAAO,CAAEe,IAAI,IAAKA,IAAI,CAAC7D,WAAW,CAAC,CAAC;EACjEG,mBAAmB,EAAEnC,IAAI,CACvBkB,KAAK,EACLrB,GAAG,CAACiF,OAAO,CAAEe,IAAI,IAAKA,IAAI,CAAC1D,mBAAmB,CAAC,EAC/CtC,GAAG,CAACiG,MAAM;CAEb,CAAC;AAEF,MAAMlE,mBAAmB,GAAIF,KAAkC,IAC7D1B,IAAI,CACF0B,KAAK,EACL7B,GAAG,CAACkG,MAAM,CAAC;EAAE/D,WAAW,EAAE,EAAE;EAAEM,kBAAkB,EAAE;AAAE,CAAkB,EAAE,CAACX,QAAQ,EAAEkC,IAAI,KACrF7D,IAAI,CACF6D,IAAI,CAACC,IAAI,CAACL,MAAM,CAACxC,KAAK,EACtBpB,GAAG,CAACkG,MAAM,CAACpE,QAAQ,EAAE,CAACA,QAAQ,EAAEqE,IAAI,KAAKC,kBAAkB,CAACtE,QAAQ,EAAEkC,IAAI,EAAEmC,IAAI,CAAC,CAAC,CACnF,CAAC,CACL;AAEH,MAAMC,kBAAkB,GAAGA,CACzBtE,QAAsB,EACtBkC,IAAkB,EAClBmC,IAAiF,KACjE;EAChB,MAAME,IAAI,GAAGhG,QAAQ,CAACiG,gBAAgB,CAACH,IAAI,CAAC;EAC5C,MAAMI,WAAW,GAAGlG,QAAQ,CAACmG,uBAAuB,CAACxC,IAAI,CAACC,IAAI,CAACwC,iBAAiB,CAACC,WAAW,EAAEP,IAAI,CAACQ,IAAI,CAAC;EACxG,MAAM3D,OAAO,GAAG7C,IAAI,CAClBkG,IAAI,EACJjG,MAAM,CAACwG,KAAK,CAAC;IACXC,MAAM,EAAEA,CAAA,KAAM,EAAE;IAChBC,MAAM,EAAGT,IAAI,IAAKhG,QAAQ,CAAC0G,0BAA0B,CAACR,WAAW,EAAEF,IAAI;GACxE,CAAC,CACH;EACD,IAAIrD,OAAO,CAACJ,MAAM,KAAK,CAAC,EAAE;IACxB,OAAO;MACLT,WAAW,EAAEnC,GAAG,CAACkF,MAAM,CAACpD,QAAQ,CAACK,WAAW,EAAE;QAC5CoB,IAAI,EAAE,eAAe;QACrBC,WAAW,EAAEQ,IAAI,CAACR,WAAW;QAC7BC,WAAW,EAAEO,IAAI,CAACC,IAAI,CAACR,WAAW;QAClCI,YAAY,EAAEG,IAAI,CAACC,IAAI,CAACJ,YAAY;QACpCC,YAAY,EAAEE,IAAI,CAACC,IAAI,CAACH,YAAY;QACpCqC,IAAI;QACJ5E,MAAM,EAAEyC,IAAI,CAACC,IAAI,CAAC1C,MAAM;QACxByF,MAAM,EAAET,WAAW,CAAC3D,MAAM,KAAK,CAAC,GAAG,SAAS,GAAG,cAAc;QAC7DqE,UAAU,EAAEV,WAAW,CAAC3D,MAAM,KAAK,CAAC,GAChC5C,GAAG,CAACyB,GAAG,CAACuC,IAAI,CAACC,IAAI,CAACwC,iBAAiB,CAACC,WAAW,EAAGQ,UAAU,IAAKA,UAAU,CAACC,UAAU,CAAC5F,MAAM,CAAC,GAC9FvB,GAAG,CAACyB,GAAG,CAAC8E,WAAW,EAAGK,KAAK,IAAKA,KAAK,CAACM,UAAU,CAACC,UAAU,CAAC5F,MAAM,CAAC;QACvE8B,OAAO,EAAEkD,WAAW,CAAC3D,MAAM,KAAK,CAAC,GAC7B,+BAA+BuD,IAAI,CAACQ,IAAI,GAAG,GAC3C,MACAxG,IAAI,CAACkG,IAAI,EAAEjG,MAAM,CAACgH,SAAS,CAAC,MAAM,MAAM,CAAC,CAC3C,6BAA6BjB,IAAI,CAACQ,IAAI,+BACpCtG,QAAQ,CAACgH,qBAAqB,CAACrH,GAAG,CAACyB,GAAG,CAAC8E,WAAW,EAAGK,KAAK,IAAKA,KAAK,CAACM,UAAU,CAAC,CAClF;OACH,CAAC;MACFzE,kBAAkB,EAAEX,QAAQ,CAACW;KAC9B;EACH;EACA,IAAIO,OAAO,CAACJ,MAAM,GAAG,CAAC,EAAE;IACtB,OAAO;MACLT,WAAW,EAAEnC,GAAG,CAACkF,MAAM,CAACpD,QAAQ,CAACK,WAAW,EAAE;QAC5CoB,IAAI,EAAE,eAAe;QACrBC,WAAW,EAAEQ,IAAI,CAACR,WAAW;QAC7BC,WAAW,EAAEO,IAAI,CAACC,IAAI,CAACR,WAAW;QAClCI,YAAY,EAAEG,IAAI,CAACC,IAAI,CAACJ,YAAY;QACpCC,YAAY,EAAEE,IAAI,CAACC,IAAI,CAACH,YAAY;QACpCqC,IAAI;QACJ5E,MAAM,EAAEyC,IAAI,CAACC,IAAI,CAAC1C,MAAM;QACxByF,MAAM,EAAE,iBAAiB;QACzBC,UAAU,EAAEjH,GAAG,CAACyB,GAAG,CAACuB,OAAO,EAAG4D,KAAK,IAAKA,KAAK,CAACM,UAAU,CAACC,UAAU,CAAC5F,MAAM,CAAC;QAC3E8B,OAAO,EAAE,sCAAsC8C,IAAI,CAACQ,IAAI;OACzD,CAAC;MACFlE,kBAAkB,EAAEX,QAAQ,CAACW;KAC9B;EACH;EACA,OAAO;IACLN,WAAW,EAAEL,QAAQ,CAACK,WAAW;IACjCM,kBAAkB,EAAEtC,IAAI,CACtB2B,QAAQ,CAACW,kBAAkB,EAC3BzC,GAAG,CAACkF,MAAM,CAACoC,aAAa,CAACtD,IAAI,CAACC,IAAI,CAACR,WAAW,EAAET,OAAO,CAAC,CAAC,CAAC,CAACkE,UAAU,CAAC,CAAC,EACvElH,GAAG,CAACiG,MAAM;GAEb;AACH,CAAC;AAED,MAAM5D,wBAAwB,GAAGA,CAC/BlB,WAAgE,EAChEmB,mBAA0C,KAE1CnC,IAAI,CACFgB,WAAW,EACXnB,GAAG,CAACiD,MAAM,CAAEC,UAAU,IAAK,CAAClD,GAAG,CAACuH,QAAQ,CAACrE,UAAU,CAACC,IAAI,CAAC,CAACb,mBAAmB,CAAC,CAAC,EAC/EtC,GAAG,CAACyB,GAAG,CAAEyB,UAAU,KAAqB;EACtCK,IAAI,EAAE,yBAAyB;EAC/BE,WAAW,EAAEP,UAAU,CAACC,IAAI;EAC5BE,OAAO,EAAE,4DAA4DH,UAAU,CAACC,IAAI;CACrF,CAAC,CAAC,CACJ;AAEH,MAAMX,qBAAqB,GAAGA,CAC5BrB,WAAgE,EAChEmB,mBAA0C,EAC1CG,kBAAyC,KAEzCtC,IAAI,CACFgB,WAAW,EACXnB,GAAG,CAACiD,MAAM,CAAEC,UAAU,IAAKlD,GAAG,CAACuH,QAAQ,CAACrE,UAAU,CAACC,IAAI,CAAC,CAACb,mBAAmB,CAAC,CAAC,EAC9EtC,GAAG,CAACiF,OAAO,CAAE/B,UAAU,IACrB/C,IAAI,CACF+C,UAAU,CAACwD,WAAW,EACtB1G,GAAG,CAACiD,MAAM,CAAEiE,UAAU,IAAK,CAAClH,GAAG,CAACuH,QAAQ,CAACD,aAAa,CAACpE,UAAU,CAACC,IAAI,EAAE+D,UAAU,CAAC,CAAC,CAACzE,kBAAkB,CAAC,CAAC,EACzGzC,GAAG,CAACyB,GAAG,CAAEyF,UAAU,KAAqB;EACtC3D,IAAI,EAAE,sBAAsB;EAC5BE,WAAW,EAAEP,UAAU,CAACC,IAAI;EAC5BgE,UAAU,EAAED,UAAU,CAACC,UAAU,CAAC5F,MAAM;EACxC8E,IAAI,EAAEa,UAAU,CAACb,IAAI;EACrBhD,OAAO,EAAE,kCAAkC6D,UAAU,CAACC,UAAU,CAAC5F,MAAM;CACxE,CAAC,CAAC,CACJ,CACF,CACF;AAEH,MAAM+F,aAAa,GAAGA,CACpB7D,WAAmB,EACnByD,UAAmD,KACxC,GAAGzD,WAAW,IAAIyD,UAAU,CAACb,IAAI,IAAIa,UAAU,CAACC,UAAU,CAAC5F,MAAM,EAAE","ignoreList":[]}
@@ -0,0 +1,7 @@
1
+ import * as Effect from "effect/Effect";
2
+ import { DiscoveryError } from "./errors.ts";
3
+ /** @internal */
4
+ export type TagPredicate = (tags: ReadonlyArray<string>) => boolean;
5
+ /** @internal */
6
+ export declare const compileAll: (expressions: ReadonlyArray<string>) => Effect.Effect<TagPredicate, DiscoveryError>;
7
+ //# sourceMappingURL=tagExpression.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tagExpression.d.ts","sourceRoot":"","sources":["../../../src/internal/cli/tagExpression.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AAGvC,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAA;AAE5C,gBAAgB;AAChB,MAAM,MAAM,YAAY,GAAG,CAAC,IAAI,EAAE,aAAa,CAAC,MAAM,CAAC,KAAK,OAAO,CAAA;AA2BnE,gBAAgB;AAChB,eAAO,MAAM,UAAU,GACrB,aAAa,aAAa,CAAC,MAAM,CAAC,KACjC,MAAM,CAAC,MAAM,CAAC,YAAY,EAAE,cAAc,CAG1C,CAAA"}
@@ -0,0 +1,127 @@
1
+ import * as Arr from "effect/Array";
2
+ import * as Effect from "effect/Effect";
3
+ import { pipe } from "effect/Function";
4
+ import * as Str from "effect/String";
5
+ import { DiscoveryError } from "./errors.js";
6
+ /** @internal */
7
+ export const compileAll = expressions => Effect.forEach(expressions, compile).pipe(Effect.map(predicates => tags => Arr.every(predicates, predicate => predicate(tags))));
8
+ const compile = expression => {
9
+ const tokens = tokenize(expression);
10
+ if (tokens === undefined || tokens.length === 0) {
11
+ return fail(expression, "Expected a tag expression");
12
+ }
13
+ const result = parseOr(tokens, 0);
14
+ if (result === undefined || result.index !== tokens.length) {
15
+ return fail(expression, "Could not parse tag expression");
16
+ }
17
+ return Effect.succeed(tags => evaluate(result.expression, tags));
18
+ };
19
+ const parseOr = (tokens, index) => {
20
+ const left = parseAnd(tokens, index);
21
+ if (left === undefined) {
22
+ return undefined;
23
+ }
24
+ return parseOrRest(tokens, left);
25
+ };
26
+ const parseOrRest = (tokens, left) => {
27
+ if (tokens[left.index] !== "or") {
28
+ return left;
29
+ }
30
+ const right = parseAnd(tokens, left.index + 1);
31
+ if (right === undefined) {
32
+ return left;
33
+ }
34
+ return parseOrRest(tokens, {
35
+ expression: {
36
+ _tag: "Or",
37
+ left: left.expression,
38
+ right: right.expression
39
+ },
40
+ index: right.index
41
+ });
42
+ };
43
+ const parseAnd = (tokens, index) => {
44
+ const left = parseUnary(tokens, index);
45
+ if (left === undefined) {
46
+ return undefined;
47
+ }
48
+ return parseAndRest(tokens, left);
49
+ };
50
+ const parseAndRest = (tokens, left) => {
51
+ if (tokens[left.index] !== "and") {
52
+ return left;
53
+ }
54
+ const right = parseUnary(tokens, left.index + 1);
55
+ if (right === undefined) {
56
+ return left;
57
+ }
58
+ return parseAndRest(tokens, {
59
+ expression: {
60
+ _tag: "And",
61
+ left: left.expression,
62
+ right: right.expression
63
+ },
64
+ index: right.index
65
+ });
66
+ };
67
+ const parseUnary = (tokens, index) => tokens[index] === "not" ? parseNot(tokens, index) : parsePrimary(tokens, index);
68
+ const parseNot = (tokens, index) => {
69
+ const result = parseUnary(tokens, index + 1);
70
+ return result === undefined ? undefined : {
71
+ expression: {
72
+ _tag: "Not",
73
+ expression: result.expression
74
+ },
75
+ index: result.index
76
+ };
77
+ };
78
+ const parsePrimary = (tokens, index) => {
79
+ const token = tokens[index];
80
+ if (token === undefined) {
81
+ return undefined;
82
+ }
83
+ if (token === "(") {
84
+ const result = parseOr(tokens, index + 1);
85
+ return result !== undefined && tokens[result.index] === ")" ? {
86
+ expression: result.expression,
87
+ index: result.index + 1
88
+ } : undefined;
89
+ }
90
+ return pipe(token, Str.startsWith("@")) ? {
91
+ expression: {
92
+ _tag: "Tag",
93
+ tag: token
94
+ },
95
+ index: index + 1
96
+ } : undefined;
97
+ };
98
+ const evaluate = (expression, tags) => {
99
+ switch (expression._tag) {
100
+ case "Tag":
101
+ {
102
+ return Arr.contains(expression.tag)(tags);
103
+ }
104
+ case "Not":
105
+ {
106
+ return !evaluate(expression.expression, tags);
107
+ }
108
+ case "And":
109
+ {
110
+ return evaluate(expression.left, tags) && evaluate(expression.right, tags);
111
+ }
112
+ case "Or":
113
+ {
114
+ return evaluate(expression.left, tags) || evaluate(expression.right, tags);
115
+ }
116
+ }
117
+ };
118
+ const tokenize = expression => {
119
+ const matches = expression.match(/\(|\)|\b(?:and|or|not)\b|@[A-Za-z0-9][A-Za-z0-9_-]*/g) ?? [];
120
+ const normalized = pipe(expression, Str.replace(/\s+/g, ""));
121
+ const matched = pipe(matches, Arr.join(""));
122
+ return normalized === matched ? matches : undefined;
123
+ };
124
+ const fail = (expression, message) => Effect.fail(new DiscoveryError({
125
+ message: `${message}: ${expression}`
126
+ }));
127
+ //# sourceMappingURL=tagExpression.js.map