@haibun/core 1.75.2 → 2.0.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/build/currentVersion.d.ts +1 -1
- package/build/currentVersion.d.ts.map +1 -1
- package/build/currentVersion.js +1 -1
- package/build/currentVersion.js.map +1 -1
- package/build/lib/dependency-resolver.d.ts +2 -0
- package/build/lib/dependency-resolver.d.ts.map +1 -0
- package/build/lib/dependency-resolver.js +3 -0
- package/build/lib/dependency-resolver.js.map +1 -0
- package/build/lib/resolve-or-error.d.ts +2 -0
- package/build/lib/resolve-or-error.d.ts.map +1 -0
- package/build/lib/resolve-or-error.js +3 -0
- package/build/lib/resolve-or-error.js.map +1 -0
- package/build/lib/resolved-text-view.d.ts +32 -0
- package/build/lib/resolved-text-view.d.ts.map +1 -0
- package/build/lib/resolved-text-view.js +103 -0
- package/build/lib/resolved-text-view.js.map +1 -0
- package/build/lib/resolved-view.d.ts +45 -0
- package/build/lib/resolved-view.d.ts.map +1 -0
- package/build/lib/resolved-view.js +133 -0
- package/build/lib/resolved-view.js.map +1 -0
- package/build/phases/statement.test copy.d.ts +2 -0
- package/build/phases/statement.test copy.d.ts.map +1 -0
- package/build/phases/statement.test copy.js +57 -0
- package/build/phases/statement.test copy.js.map +1 -0
- package/package.json +1 -1
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export declare const currentVersion = "
|
|
1
|
+
export declare const currentVersion = "2.0.0";
|
|
2
2
|
//# sourceMappingURL=currentVersion.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"currentVersion.d.ts","sourceRoot":"","sources":["../src/currentVersion.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,cAAc,
|
|
1
|
+
{"version":3,"file":"currentVersion.d.ts","sourceRoot":"","sources":["../src/currentVersion.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,cAAc,UAAU,CAAC"}
|
package/build/currentVersion.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export const currentVersion = '
|
|
1
|
+
export const currentVersion = '2.0.0';
|
|
2
2
|
//# sourceMappingURL=currentVersion.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"currentVersion.js","sourceRoot":"","sources":["../src/currentVersion.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,cAAc,GAAG,
|
|
1
|
+
{"version":3,"file":"currentVersion.js","sourceRoot":"","sources":["../src/currentVersion.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,cAAc,GAAG,OAAO,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dependency-resolver.d.ts","sourceRoot":"","sources":["../../src/lib/dependency-resolver.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dependency-resolver.js","sourceRoot":"","sources":["../../src/lib/dependency-resolver.ts"],"names":[],"mappings":";AAAA,kFAAkF"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resolve-or-error.d.ts","sourceRoot":"","sources":["../../src/lib/resolve-or-error.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resolve-or-error.js","sourceRoot":"","sources":["../../src/lib/resolve-or-error.ts"],"names":[],"mappings":";AAAA,yFAAyF"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { TResolvedFeature } from './defs.js';
|
|
2
|
+
/**
|
|
3
|
+
* Generate a simple, flat text view of what actually runs
|
|
4
|
+
* Shows resolved variables inline, backgrounds expanded, etc.
|
|
5
|
+
* This is the "debuggable" linear view
|
|
6
|
+
*/
|
|
7
|
+
export type TLineMapping = {
|
|
8
|
+
displayLine: number;
|
|
9
|
+
sourcePath: string;
|
|
10
|
+
sourceContent: string;
|
|
11
|
+
isBackground: boolean;
|
|
12
|
+
seqPath: number[];
|
|
13
|
+
resolvedText: string;
|
|
14
|
+
};
|
|
15
|
+
/**
|
|
16
|
+
* Generate resolved text view with source mapping
|
|
17
|
+
*/
|
|
18
|
+
export declare function generateResolvedTextView(feature: TResolvedFeature): {
|
|
19
|
+
text: string;
|
|
20
|
+
lineMapping: TLineMapping[];
|
|
21
|
+
};
|
|
22
|
+
/**
|
|
23
|
+
* Get the mapping for a specific line in the resolved view
|
|
24
|
+
* Useful for "jump to source" features
|
|
25
|
+
*/
|
|
26
|
+
export declare function getSourceForLine(lineMapping: TLineMapping[], lineNumber: number): TLineMapping | undefined;
|
|
27
|
+
/**
|
|
28
|
+
* Get all lines that came from a specific source file
|
|
29
|
+
* Useful for highlighting/filtering
|
|
30
|
+
*/
|
|
31
|
+
export declare function getLinesFromSource(lineMapping: TLineMapping[], sourcePath: string): TLineMapping[];
|
|
32
|
+
//# sourceMappingURL=resolved-text-view.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resolved-text-view.d.ts","sourceRoot":"","sources":["../../src/lib/resolved-text-view.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAgB,MAAM,WAAW,CAAC;AAE3D;;;;GAIG;AAEH,MAAM,MAAM,YAAY,GAAG;IAC1B,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,EAAE,MAAM,CAAC;IACtB,YAAY,EAAE,OAAO,CAAC;IACtB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;CACrB,CAAC;AAEF;;GAEG;AACH,wBAAgB,wBAAwB,CAAC,OAAO,EAAE,gBAAgB,GAAG;IACpE,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,YAAY,EAAE,CAAC;CAC5B,CAwDA;AA8CD;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,WAAW,EAAE,YAAY,EAAE,EAAE,UAAU,EAAE,MAAM,GAAG,YAAY,GAAG,SAAS,CAE1G;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,WAAW,EAAE,YAAY,EAAE,EAAE,UAAU,EAAE,MAAM,GAAG,YAAY,EAAE,CAElG"}
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Generate resolved text view with source mapping
|
|
3
|
+
*/
|
|
4
|
+
export function generateResolvedTextView(feature) {
|
|
5
|
+
const lines = [];
|
|
6
|
+
const lineMapping = [];
|
|
7
|
+
let lineNumber = 0;
|
|
8
|
+
// Header
|
|
9
|
+
lines.push(`# Resolved Feature: ${feature.path}`);
|
|
10
|
+
lines.push(`# Base: ${feature.base}`);
|
|
11
|
+
lines.push('');
|
|
12
|
+
// Dependencies
|
|
13
|
+
const deps = new Set(feature.featureSteps.map(s => s.path).filter(p => p !== feature.path));
|
|
14
|
+
if (deps.size > 0) {
|
|
15
|
+
lines.push('# Dependencies:');
|
|
16
|
+
deps.forEach(dep => lines.push(`# ${dep}`));
|
|
17
|
+
lines.push('');
|
|
18
|
+
}
|
|
19
|
+
// Steps with resolved variables
|
|
20
|
+
for (const step of feature.featureSteps) {
|
|
21
|
+
lineNumber++;
|
|
22
|
+
// Get the display text with variables resolved
|
|
23
|
+
const resolvedText = resolveStepText(step);
|
|
24
|
+
const indent = ' '.repeat((step.seqPath?.length || 1) - 1);
|
|
25
|
+
const sourceMarker = step.path !== feature.path ? ` ← ${step.path}` : '';
|
|
26
|
+
const displayLine = `${indent}${resolvedText}${sourceMarker}`;
|
|
27
|
+
lines.push(displayLine);
|
|
28
|
+
lineMapping.push({
|
|
29
|
+
displayLine: lineNumber,
|
|
30
|
+
sourcePath: step.path,
|
|
31
|
+
sourceContent: step.in,
|
|
32
|
+
isBackground: step.path !== feature.path,
|
|
33
|
+
seqPath: step.seqPath || [],
|
|
34
|
+
resolvedText,
|
|
35
|
+
});
|
|
36
|
+
// Show resolved variables as comments
|
|
37
|
+
if (step.action.stepValuesMap) {
|
|
38
|
+
const vars = Object.entries(step.action.stepValuesMap)
|
|
39
|
+
.filter(([, v]) => !Array.isArray(v.value) && v.value !== undefined)
|
|
40
|
+
.map(([name, v]) => `${name}=${v.value}`);
|
|
41
|
+
if (vars.length > 0) {
|
|
42
|
+
lines.push(`${indent} # [${vars.join(', ')}]`);
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
return {
|
|
47
|
+
text: lines.join('\n'),
|
|
48
|
+
lineMapping,
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Resolve variables in step text to show actual values
|
|
53
|
+
*/
|
|
54
|
+
function resolveStepText(step) {
|
|
55
|
+
let text = step.in;
|
|
56
|
+
if (!step.action.stepValuesMap) {
|
|
57
|
+
return text;
|
|
58
|
+
}
|
|
59
|
+
// Replace each placeholder with its resolved value
|
|
60
|
+
for (const [name, valueInfo] of Object.entries(step.action.stepValuesMap)) {
|
|
61
|
+
// Skip complex nested values (like statement arrays)
|
|
62
|
+
if (Array.isArray(valueInfo.value))
|
|
63
|
+
continue;
|
|
64
|
+
if (valueInfo.value === undefined || valueInfo.value === null)
|
|
65
|
+
continue;
|
|
66
|
+
const displayValue = formatValue(valueInfo.value, valueInfo.origin);
|
|
67
|
+
// Try to replace the placeholder in the text
|
|
68
|
+
// This is a simple replacement - the original text might use {name} or other formats
|
|
69
|
+
const regex = new RegExp(`\\{${name}\\}|\\b${name}\\b`, 'g');
|
|
70
|
+
text = text.replace(regex, displayValue);
|
|
71
|
+
}
|
|
72
|
+
return text;
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Format a value for display with source indicator
|
|
76
|
+
*/
|
|
77
|
+
function formatValue(value, origin) {
|
|
78
|
+
const stringValue = String(value);
|
|
79
|
+
// Add origin marker for clarity during debugging
|
|
80
|
+
switch (origin) {
|
|
81
|
+
case 'env':
|
|
82
|
+
return `${stringValue}⟨env⟩`;
|
|
83
|
+
case 'var':
|
|
84
|
+
return `${stringValue}⟨var⟩`;
|
|
85
|
+
default:
|
|
86
|
+
return stringValue;
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Get the mapping for a specific line in the resolved view
|
|
91
|
+
* Useful for "jump to source" features
|
|
92
|
+
*/
|
|
93
|
+
export function getSourceForLine(lineMapping, lineNumber) {
|
|
94
|
+
return lineMapping.find(m => m.displayLine === lineNumber);
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* Get all lines that came from a specific source file
|
|
98
|
+
* Useful for highlighting/filtering
|
|
99
|
+
*/
|
|
100
|
+
export function getLinesFromSource(lineMapping, sourcePath) {
|
|
101
|
+
return lineMapping.filter(m => m.sourcePath === sourcePath);
|
|
102
|
+
}
|
|
103
|
+
//# sourceMappingURL=resolved-text-view.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resolved-text-view.js","sourceRoot":"","sources":["../../src/lib/resolved-text-view.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { TResolvedFeature } from './defs.js';
|
|
2
|
+
/**
|
|
3
|
+
* Generate a linear, human-readable view of a resolved feature
|
|
4
|
+
* showing exactly what will execute, with variables resolved
|
|
5
|
+
*/
|
|
6
|
+
export type TResolvedLine = {
|
|
7
|
+
lineNumber: number;
|
|
8
|
+
text: string;
|
|
9
|
+
sourcePath: string;
|
|
10
|
+
sourceLineNumber?: number;
|
|
11
|
+
seqPath: number[];
|
|
12
|
+
stepperName: string;
|
|
13
|
+
actionName: string;
|
|
14
|
+
variables?: Record<string, unknown>;
|
|
15
|
+
};
|
|
16
|
+
export type TResolvedView = {
|
|
17
|
+
featurePath: string;
|
|
18
|
+
lines: TResolvedLine[];
|
|
19
|
+
dependencies: string[];
|
|
20
|
+
};
|
|
21
|
+
/**
|
|
22
|
+
* Generate a flat, resolved view of a feature
|
|
23
|
+
* This is the "what actually runs" view
|
|
24
|
+
*/
|
|
25
|
+
export declare function generateResolvedView(feature: TResolvedFeature): TResolvedView;
|
|
26
|
+
/**
|
|
27
|
+
* Generate a plain text version of the resolved view
|
|
28
|
+
* This is what you'd edit or debug
|
|
29
|
+
*/
|
|
30
|
+
export declare function formatResolvedViewAsText(view: TResolvedView): string;
|
|
31
|
+
/**
|
|
32
|
+
* Generate an editable version with line mappings
|
|
33
|
+
* This allows changes to be synced back to source files
|
|
34
|
+
*/
|
|
35
|
+
export type TEditableResolvedView = {
|
|
36
|
+
text: string;
|
|
37
|
+
lineMapping: Array<{
|
|
38
|
+
editLine: number;
|
|
39
|
+
sourcePath: string;
|
|
40
|
+
sourceLineNumber?: number;
|
|
41
|
+
canEdit: boolean;
|
|
42
|
+
}>;
|
|
43
|
+
};
|
|
44
|
+
export declare function formatResolvedViewAsEditable(view: TResolvedView): TEditableResolvedView;
|
|
45
|
+
//# sourceMappingURL=resolved-view.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resolved-view.d.ts","sourceRoot":"","sources":["../../src/lib/resolved-view.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAgB,MAAM,WAAW,CAAC;AAE3D;;;GAGG;AAEH,MAAM,MAAM,aAAa,GAAG;IAC3B,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;IACnB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACpC,CAAC;AAEF,MAAM,MAAM,aAAa,GAAG;IAC3B,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,aAAa,EAAE,CAAC;IACvB,YAAY,EAAE,MAAM,EAAE,CAAC;CACvB,CAAC;AAEF;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,gBAAgB,GAAG,aAAa,CAgC7E;AA8DD;;;GAGG;AACH,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,aAAa,GAAG,MAAM,CAmCpE;AAED;;;GAGG;AACH,MAAM,MAAM,qBAAqB,GAAG;IACnC,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,KAAK,CAAC;QAClB,QAAQ,EAAE,MAAM,CAAC;QACjB,UAAU,EAAE,MAAM,CAAC;QACnB,gBAAgB,CAAC,EAAE,MAAM,CAAC;QAC1B,OAAO,EAAE,OAAO,CAAC;KACjB,CAAC,CAAC;CACH,CAAC;AAEF,wBAAgB,4BAA4B,CAAC,IAAI,EAAE,aAAa,GAAG,qBAAqB,CAgBvF"}
|
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Generate a flat, resolved view of a feature
|
|
3
|
+
* This is the "what actually runs" view
|
|
4
|
+
*/
|
|
5
|
+
export function generateResolvedView(feature) {
|
|
6
|
+
const lines = [];
|
|
7
|
+
const dependencies = new Set();
|
|
8
|
+
let lineNumber = 1;
|
|
9
|
+
for (const step of feature.featureSteps) {
|
|
10
|
+
// Track dependencies (backgrounds, etc)
|
|
11
|
+
if (step.path !== feature.path) {
|
|
12
|
+
dependencies.add(step.path);
|
|
13
|
+
}
|
|
14
|
+
// Get the display text with resolved variables
|
|
15
|
+
const text = resolveVariablesInText(step);
|
|
16
|
+
lines.push({
|
|
17
|
+
lineNumber: lineNumber++,
|
|
18
|
+
text,
|
|
19
|
+
sourcePath: step.path,
|
|
20
|
+
sourceLineNumber: undefined, // TODO: track original line number
|
|
21
|
+
seqPath: step.seqPath,
|
|
22
|
+
stepperName: step.action.stepperName,
|
|
23
|
+
actionName: step.action.actionName,
|
|
24
|
+
variables: extractVariables(step),
|
|
25
|
+
});
|
|
26
|
+
}
|
|
27
|
+
return {
|
|
28
|
+
featurePath: feature.path,
|
|
29
|
+
lines,
|
|
30
|
+
dependencies: Array.from(dependencies),
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Resolve variables in the step text to show actual values
|
|
35
|
+
*/
|
|
36
|
+
function resolveVariablesInText(step) {
|
|
37
|
+
let text = step.in;
|
|
38
|
+
// If we have stepValuesMap, show the resolved values inline
|
|
39
|
+
if (step.action.stepValuesMap) {
|
|
40
|
+
const values = step.action.stepValuesMap;
|
|
41
|
+
for (const [placeholder, valueInfo] of Object.entries(values)) {
|
|
42
|
+
// Skip complex nested values
|
|
43
|
+
if (Array.isArray(valueInfo.value))
|
|
44
|
+
continue;
|
|
45
|
+
const displayValue = formatValueForDisplay(valueInfo.value, valueInfo.origin);
|
|
46
|
+
// Try to replace the placeholder in the text
|
|
47
|
+
// This is a simple approach - might need refinement
|
|
48
|
+
text = text.replace(new RegExp(`\\b${placeholder}\\b`, 'g'), displayValue);
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
return text;
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Format a value for display, with source context
|
|
55
|
+
*/
|
|
56
|
+
function formatValueForDisplay(value, origin) {
|
|
57
|
+
if (value === null || value === undefined) {
|
|
58
|
+
return `<undefined>`;
|
|
59
|
+
}
|
|
60
|
+
const stringValue = String(value);
|
|
61
|
+
// Add origin indicator for clarity
|
|
62
|
+
switch (origin) {
|
|
63
|
+
case 'env':
|
|
64
|
+
return `${stringValue} (env)`;
|
|
65
|
+
case 'var':
|
|
66
|
+
return `${stringValue} (var)`;
|
|
67
|
+
default:
|
|
68
|
+
return stringValue;
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Extract variable information for a step
|
|
73
|
+
*/
|
|
74
|
+
function extractVariables(step) {
|
|
75
|
+
if (!step.action.stepValuesMap)
|
|
76
|
+
return undefined;
|
|
77
|
+
const vars = {};
|
|
78
|
+
for (const [name, valueInfo] of Object.entries(step.action.stepValuesMap)) {
|
|
79
|
+
if (!Array.isArray(valueInfo.value)) {
|
|
80
|
+
vars[name] = valueInfo.value;
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
return Object.keys(vars).length > 0 ? vars : undefined;
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Generate a plain text version of the resolved view
|
|
87
|
+
* This is what you'd edit or debug
|
|
88
|
+
*/
|
|
89
|
+
export function formatResolvedViewAsText(view) {
|
|
90
|
+
const lines = [];
|
|
91
|
+
lines.push(`# Feature: ${view.featurePath}`);
|
|
92
|
+
if (view.dependencies.length > 0) {
|
|
93
|
+
lines.push('');
|
|
94
|
+
lines.push('# Dependencies:');
|
|
95
|
+
for (const dep of view.dependencies) {
|
|
96
|
+
lines.push(`# - ${dep}`);
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
lines.push('');
|
|
100
|
+
lines.push('# Resolved Steps:');
|
|
101
|
+
lines.push('');
|
|
102
|
+
for (const line of view.lines) {
|
|
103
|
+
const indent = ' '.repeat(line.seqPath.length - 1);
|
|
104
|
+
const sourceInfo = line.sourcePath !== view.featurePath
|
|
105
|
+
? ` # from ${line.sourcePath}`
|
|
106
|
+
: '';
|
|
107
|
+
lines.push(`${indent}${line.text}${sourceInfo}`);
|
|
108
|
+
// Optionally show variables
|
|
109
|
+
if (line.variables && Object.keys(line.variables).length > 0) {
|
|
110
|
+
const varInfo = Object.entries(line.variables)
|
|
111
|
+
.map(([k, v]) => `${k}=${v}`)
|
|
112
|
+
.join(', ');
|
|
113
|
+
lines.push(`${indent} # vars: ${varInfo}`);
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
return lines.join('\n');
|
|
117
|
+
}
|
|
118
|
+
export function formatResolvedViewAsEditable(view) {
|
|
119
|
+
const text = formatResolvedViewAsText(view);
|
|
120
|
+
const textLines = text.split('\n');
|
|
121
|
+
// Build line mapping (simplified for now)
|
|
122
|
+
const lineMapping = textLines.map((_, idx) => ({
|
|
123
|
+
editLine: idx + 1,
|
|
124
|
+
sourcePath: view.featurePath,
|
|
125
|
+
sourceLineNumber: undefined,
|
|
126
|
+
canEdit: true, // TODO: mark background lines as read-only
|
|
127
|
+
}));
|
|
128
|
+
return {
|
|
129
|
+
text,
|
|
130
|
+
lineMapping,
|
|
131
|
+
};
|
|
132
|
+
}
|
|
133
|
+
//# sourceMappingURL=resolved-view.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resolved-view.js","sourceRoot":"","sources":["../../src/lib/resolved-view.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"statement.test copy.d.ts","sourceRoot":"","sources":["../../src/phases/statement.test copy.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import { describe, it, expect } from 'vitest';
|
|
2
|
+
import { AStepper } from '../lib/astepper.js';
|
|
3
|
+
import { OK, ExecMode } from '../lib/defs.js';
|
|
4
|
+
import { testWithDefaults, DEF_PROTO_OPTIONS } from '../lib/test/lib.js';
|
|
5
|
+
import { actionNotOK } from '../lib/util/index.js';
|
|
6
|
+
import { doExecuteFeatureSteps } from '../lib/util/featureStep-executor.js';
|
|
7
|
+
import { DOMAIN_STATEMENT } from '../lib/domain-types.js';
|
|
8
|
+
class StatementTestStepper extends AStepper {
|
|
9
|
+
steps = {
|
|
10
|
+
alpha: {
|
|
11
|
+
exact: 'alpha',
|
|
12
|
+
action: async () => Promise.resolve(OK),
|
|
13
|
+
},
|
|
14
|
+
beta: {
|
|
15
|
+
exact: 'beta',
|
|
16
|
+
action: async () => Promise.resolve(OK),
|
|
17
|
+
},
|
|
18
|
+
do: {
|
|
19
|
+
gwta: `do {steps:${DOMAIN_STATEMENT}}`,
|
|
20
|
+
action: async (args) => {
|
|
21
|
+
try {
|
|
22
|
+
const steps = args.steps;
|
|
23
|
+
if (!Array.isArray(steps))
|
|
24
|
+
throw new Error('steps must be feature steps');
|
|
25
|
+
const last = await doExecuteFeatureSteps(steps, [this], this.getWorld(), ExecMode.NO_CYCLES);
|
|
26
|
+
if (!last || !last.ok) {
|
|
27
|
+
const msg = last?.stepActionResult?.message || 'inline statement failed';
|
|
28
|
+
return actionNotOK(`statement failed: ${msg}`);
|
|
29
|
+
}
|
|
30
|
+
return OK;
|
|
31
|
+
}
|
|
32
|
+
catch (e) {
|
|
33
|
+
return actionNotOK(`statement failed: ${e.message}`);
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
describe('statement type', () => {
|
|
40
|
+
it('executes single known statement', async () => {
|
|
41
|
+
const feature = { path: '/features/test.feature', content: 'do alpha' };
|
|
42
|
+
const result = await testWithDefaults([feature], [StatementTestStepper], DEF_PROTO_OPTIONS, []);
|
|
43
|
+
expect(result.ok).toBe(true);
|
|
44
|
+
});
|
|
45
|
+
it('fails unknown statement', async () => {
|
|
46
|
+
const feature = { path: '/features/test.feature', content: 'do gamma' };
|
|
47
|
+
const result = await testWithDefaults([feature], [StatementTestStepper], DEF_PROTO_OPTIONS, []);
|
|
48
|
+
expect(result.ok).toBe(false);
|
|
49
|
+
});
|
|
50
|
+
it('executes multi-line backgrounds via statement list', async () => {
|
|
51
|
+
// Compose statement referencing beta after alpha
|
|
52
|
+
const feature = { path: '/features/test.feature', content: 'do alpha\nalpha\nbeta' };
|
|
53
|
+
const result = await testWithDefaults([feature], [StatementTestStepper], DEF_PROTO_OPTIONS, []);
|
|
54
|
+
expect(result.ok).toBe(true);
|
|
55
|
+
});
|
|
56
|
+
});
|
|
57
|
+
//# sourceMappingURL=statement.test%20copy.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"statement.test copy.js","sourceRoot":"","sources":["../../src/phases/statement.test copy.ts"],"names":[],"mappings":"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"}
|