@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.
@@ -1,2 +1,2 @@
1
- export declare const currentVersion = "1.75.2";
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,WAAW,CAAC"}
1
+ {"version":3,"file":"currentVersion.d.ts","sourceRoot":"","sources":["../src/currentVersion.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,cAAc,UAAU,CAAC"}
@@ -1,2 +1,2 @@
1
- export const currentVersion = '1.75.2';
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,QAAQ,CAAC"}
1
+ {"version":3,"file":"currentVersion.js","sourceRoot":"","sources":["../src/currentVersion.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,cAAc,GAAG,OAAO,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=dependency-resolver.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dependency-resolver.d.ts","sourceRoot":"","sources":["../../src/lib/dependency-resolver.ts"],"names":[],"mappings":""}
@@ -0,0 +1,3 @@
1
+ export {};
2
+ // File intentionally left blank. DependencyResolver removed due to missing types.
3
+ //# sourceMappingURL=dependency-resolver.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dependency-resolver.js","sourceRoot":"","sources":["../../src/lib/dependency-resolver.ts"],"names":[],"mappings":";AAAA,kFAAkF"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=resolve-or-error.d.ts.map
@@ -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,3 @@
1
+ export {};
2
+ // File intentionally left blank. Dependency provider logic removed due to missing types.
3
+ //# sourceMappingURL=resolve-or-error.js.map
@@ -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,2 @@
1
+ export {};
2
+ //# sourceMappingURL=statement.test%20copy.d.ts.map
@@ -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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"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@haibun/core",
3
3
  "type": "module",
4
- "version": "1.75.2",
4
+ "version": "2.0.0",
5
5
  "description": "",
6
6
  "author": "",
7
7
  "exports": { "./*": "./build/*" },