task-pipeliner 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.
- package/LICENSE +21 -0
- package/README.ko.md +1034 -0
- package/README.md +1031 -0
- package/dist/cli/index.d.ts +19 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +147 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/prompts.d.ts +48 -0
- package/dist/cli/prompts.d.ts.map +1 -0
- package/dist/cli/prompts.js +75 -0
- package/dist/cli/prompts.js.map +1 -0
- package/dist/cli/ui.d.ts +39 -0
- package/dist/cli/ui.d.ts.map +1 -0
- package/dist/cli/ui.js +84 -0
- package/dist/cli/ui.js.map +1 -0
- package/dist/core/__tests__/actual-execution.test.d.ts +2 -0
- package/dist/core/__tests__/actual-execution.test.d.ts.map +1 -0
- package/dist/core/__tests__/actual-execution.test.js +140 -0
- package/dist/core/__tests__/actual-execution.test.js.map +1 -0
- package/dist/core/__tests__/base-dir.test.d.ts +2 -0
- package/dist/core/__tests__/base-dir.test.d.ts.map +1 -0
- package/dist/core/__tests__/base-dir.test.js +146 -0
- package/dist/core/__tests__/base-dir.test.js.map +1 -0
- package/dist/core/__tests__/built-code-execution.test.d.ts +2 -0
- package/dist/core/__tests__/built-code-execution.test.d.ts.map +1 -0
- package/dist/core/__tests__/built-code-execution.test.js +48 -0
- package/dist/core/__tests__/built-code-execution.test.js.map +1 -0
- package/dist/core/__tests__/choose-as-var-condition.test.d.ts +2 -0
- package/dist/core/__tests__/choose-as-var-condition.test.d.ts.map +1 -0
- package/dist/core/__tests__/choose-as-var-condition.test.js +308 -0
- package/dist/core/__tests__/choose-as-var-condition.test.js.map +1 -0
- package/dist/core/__tests__/cli-integration.test.d.ts +2 -0
- package/dist/core/__tests__/cli-integration.test.d.ts.map +1 -0
- package/dist/core/__tests__/cli-integration.test.js +83 -0
- package/dist/core/__tests__/cli-integration.test.js.map +1 -0
- package/dist/core/__tests__/comprehensive-basic-yaml.test.d.ts +2 -0
- package/dist/core/__tests__/comprehensive-basic-yaml.test.d.ts.map +1 -0
- package/dist/core/__tests__/comprehensive-basic-yaml.test.js +111 -0
- package/dist/core/__tests__/comprehensive-basic-yaml.test.js.map +1 -0
- package/dist/core/__tests__/condition-evaluator.test.d.ts +2 -0
- package/dist/core/__tests__/condition-evaluator.test.d.ts.map +1 -0
- package/dist/core/__tests__/condition-evaluator.test.js +170 -0
- package/dist/core/__tests__/condition-evaluator.test.js.map +1 -0
- package/dist/core/__tests__/debug-basic-yaml.test.d.ts +2 -0
- package/dist/core/__tests__/debug-basic-yaml.test.d.ts.map +1 -0
- package/dist/core/__tests__/debug-basic-yaml.test.js +128 -0
- package/dist/core/__tests__/debug-basic-yaml.test.js.map +1 -0
- package/dist/core/__tests__/example-files.test.d.ts +2 -0
- package/dist/core/__tests__/example-files.test.d.ts.map +1 -0
- package/dist/core/__tests__/example-files.test.js +200 -0
- package/dist/core/__tests__/example-files.test.js.map +1 -0
- package/dist/core/__tests__/executor-choice-integration.test.d.ts +2 -0
- package/dist/core/__tests__/executor-choice-integration.test.d.ts.map +1 -0
- package/dist/core/__tests__/executor-choice-integration.test.js +171 -0
- package/dist/core/__tests__/executor-choice-integration.test.js.map +1 -0
- package/dist/core/__tests__/executor-choice.test.d.ts +2 -0
- package/dist/core/__tests__/executor-choice.test.d.ts.map +1 -0
- package/dist/core/__tests__/executor-choice.test.js +174 -0
- package/dist/core/__tests__/executor-choice.test.js.map +1 -0
- package/dist/core/__tests__/executor-parallel.test.d.ts +2 -0
- package/dist/core/__tests__/executor-parallel.test.d.ts.map +1 -0
- package/dist/core/__tests__/executor-parallel.test.js +136 -0
- package/dist/core/__tests__/executor-parallel.test.js.map +1 -0
- package/dist/core/__tests__/executor-prompt.test.d.ts +2 -0
- package/dist/core/__tests__/executor-prompt.test.d.ts.map +1 -0
- package/dist/core/__tests__/executor-prompt.test.js +149 -0
- package/dist/core/__tests__/executor-prompt.test.js.map +1 -0
- package/dist/core/__tests__/executor-real-scenario.test.d.ts +2 -0
- package/dist/core/__tests__/executor-real-scenario.test.d.ts.map +1 -0
- package/dist/core/__tests__/executor-real-scenario.test.js +169 -0
- package/dist/core/__tests__/executor-real-scenario.test.js.map +1 -0
- package/dist/core/__tests__/file-condition.test.d.ts +2 -0
- package/dist/core/__tests__/file-condition.test.d.ts.map +1 -0
- package/dist/core/__tests__/file-condition.test.js +182 -0
- package/dist/core/__tests__/file-condition.test.js.map +1 -0
- package/dist/core/__tests__/final-verification.test.d.ts +2 -0
- package/dist/core/__tests__/final-verification.test.d.ts.map +1 -0
- package/dist/core/__tests__/final-verification.test.js +59 -0
- package/dist/core/__tests__/final-verification.test.js.map +1 -0
- package/dist/core/__tests__/parallel-when-condition.test.d.ts +2 -0
- package/dist/core/__tests__/parallel-when-condition.test.d.ts.map +1 -0
- package/dist/core/__tests__/parallel-when-condition.test.js +155 -0
- package/dist/core/__tests__/parallel-when-condition.test.js.map +1 -0
- package/dist/core/__tests__/parser.test.d.ts +2 -0
- package/dist/core/__tests__/parser.test.d.ts.map +1 -0
- package/dist/core/__tests__/parser.test.js +94 -0
- package/dist/core/__tests__/parser.test.js.map +1 -0
- package/dist/core/__tests__/real-inquirer-test.test.d.ts +2 -0
- package/dist/core/__tests__/real-inquirer-test.test.d.ts.map +1 -0
- package/dist/core/__tests__/real-inquirer-test.test.js +20 -0
- package/dist/core/__tests__/real-inquirer-test.test.js.map +1 -0
- package/dist/core/__tests__/reproduce-bug.test.d.ts +2 -0
- package/dist/core/__tests__/reproduce-bug.test.d.ts.map +1 -0
- package/dist/core/__tests__/reproduce-bug.test.js +84 -0
- package/dist/core/__tests__/reproduce-bug.test.js.map +1 -0
- package/dist/core/__tests__/timeout-retry.test.d.ts +2 -0
- package/dist/core/__tests__/timeout-retry.test.d.ts.map +1 -0
- package/dist/core/__tests__/timeout-retry.test.js +184 -0
- package/dist/core/__tests__/timeout-retry.test.js.map +1 -0
- package/dist/core/__tests__/workflow-validation.test.d.ts +2 -0
- package/dist/core/__tests__/workflow-validation.test.d.ts.map +1 -0
- package/dist/core/__tests__/workflow-validation.test.js +120 -0
- package/dist/core/__tests__/workflow-validation.test.js.map +1 -0
- package/dist/core/__tests__/workspace.test.d.ts +2 -0
- package/dist/core/__tests__/workspace.test.d.ts.map +1 -0
- package/dist/core/__tests__/workspace.test.js +29 -0
- package/dist/core/__tests__/workspace.test.js.map +1 -0
- package/dist/core/__tests__/yaml-integration.test.d.ts +2 -0
- package/dist/core/__tests__/yaml-integration.test.d.ts.map +1 -0
- package/dist/core/__tests__/yaml-integration.test.js +114 -0
- package/dist/core/__tests__/yaml-integration.test.js.map +1 -0
- package/dist/core/__tests__/yaml-scenarios.test.d.ts +2 -0
- package/dist/core/__tests__/yaml-scenarios.test.d.ts.map +1 -0
- package/dist/core/__tests__/yaml-scenarios.test.js +199 -0
- package/dist/core/__tests__/yaml-scenarios.test.js.map +1 -0
- package/dist/core/condition-evaluator.d.ts +44 -0
- package/dist/core/condition-evaluator.d.ts.map +1 -0
- package/dist/core/condition-evaluator.js +121 -0
- package/dist/core/condition-evaluator.js.map +1 -0
- package/dist/core/executor.d.ts +172 -0
- package/dist/core/executor.d.ts.map +1 -0
- package/dist/core/executor.js +579 -0
- package/dist/core/executor.js.map +1 -0
- package/dist/core/parser.d.ts +41 -0
- package/dist/core/parser.d.ts.map +1 -0
- package/dist/core/parser.js +202 -0
- package/dist/core/parser.js.map +1 -0
- package/dist/core/rust-task-runner.d.ts +14 -0
- package/dist/core/rust-task-runner.d.ts.map +1 -0
- package/dist/core/rust-task-runner.js +34 -0
- package/dist/core/rust-task-runner.js.map +1 -0
- package/dist/core/task-runner.d.ts +63 -0
- package/dist/core/task-runner.d.ts.map +1 -0
- package/dist/core/task-runner.js +252 -0
- package/dist/core/task-runner.js.map +1 -0
- package/dist/core/template.d.ts +11 -0
- package/dist/core/template.d.ts.map +1 -0
- package/dist/core/template.js +36 -0
- package/dist/core/template.js.map +1 -0
- package/dist/core/workflow-schema.d.ts +31 -0
- package/dist/core/workflow-schema.d.ts.map +1 -0
- package/dist/core/workflow-schema.js +125 -0
- package/dist/core/workflow-schema.js.map +1 -0
- package/dist/core/workspace.d.ts +90 -0
- package/dist/core/workspace.d.ts.map +1 -0
- package/dist/core/workspace.js +143 -0
- package/dist/core/workspace.js.map +1 -0
- package/dist/index.d.ts +10 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +10 -0
- package/dist/index.js.map +1 -0
- package/dist/task-pipeliner-rs.node +0 -0
- package/dist/types/condition.d.ts +62 -0
- package/dist/types/condition.d.ts.map +1 -0
- package/dist/types/condition.js +6 -0
- package/dist/types/condition.js.map +1 -0
- package/dist/types/workflow.d.ts +69 -0
- package/dist/types/workflow.d.ts.map +1 -0
- package/dist/types/workflow.js +2 -0
- package/dist/types/workflow.js.map +1 -0
- package/package.json +67 -0
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
import { readFileSync } from 'fs';
|
|
2
|
+
import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest';
|
|
3
|
+
import { parse } from 'yaml';
|
|
4
|
+
import { ConditionEvaluator } from '../condition-evaluator.js';
|
|
5
|
+
import { Executor } from '../executor.js';
|
|
6
|
+
import { Workspace } from '../workspace.js';
|
|
7
|
+
// Perfectly reproduce actual execution
|
|
8
|
+
describe('COMPREHENSIVE: Basic YAML - Must Work', () => {
|
|
9
|
+
let executor;
|
|
10
|
+
let executedCommands;
|
|
11
|
+
let _workspaceState;
|
|
12
|
+
beforeEach(() => {
|
|
13
|
+
vi.clearAllMocks();
|
|
14
|
+
executor = new Executor();
|
|
15
|
+
executedCommands = [];
|
|
16
|
+
_workspaceState = [];
|
|
17
|
+
// Mock TaskRunner
|
|
18
|
+
const taskRunner = executor.taskRunner;
|
|
19
|
+
taskRunner.run = vi.fn().mockImplementation((cmd) => {
|
|
20
|
+
executedCommands.push(cmd);
|
|
21
|
+
console.log(`[EXEC] ${cmd}`);
|
|
22
|
+
return Promise.resolve(true);
|
|
23
|
+
});
|
|
24
|
+
// Mock TextPrompt (prevent timeout)
|
|
25
|
+
const textPrompt = executor.textPrompt;
|
|
26
|
+
textPrompt.prompt = vi.fn().mockResolvedValue('1.0.0');
|
|
27
|
+
});
|
|
28
|
+
afterEach(() => {
|
|
29
|
+
const workspace = executor.workspace;
|
|
30
|
+
console.log('Final workspace state:');
|
|
31
|
+
console.log(' Choices:', Array.from(workspace.state.choices.entries()));
|
|
32
|
+
console.log(' Facts:', Array.from(workspace.state.facts.entries()));
|
|
33
|
+
});
|
|
34
|
+
it('MUST WORK: Complete basic.yaml execution with staging', async () => {
|
|
35
|
+
const content = readFileSync('examples/yaml-examples/basic.yaml', 'utf-8');
|
|
36
|
+
const workflow = parse(content);
|
|
37
|
+
// Mock ChoicePrompt
|
|
38
|
+
const choicePrompt = executor.choicePrompt;
|
|
39
|
+
choicePrompt.prompt = vi.fn().mockResolvedValue({ id: 'staging', label: 'Staging' });
|
|
40
|
+
process.env.CI = 'false';
|
|
41
|
+
try {
|
|
42
|
+
await executor.execute(workflow);
|
|
43
|
+
// Required verification
|
|
44
|
+
expect(executedCommands).toContain('echo "Deploying to staging..."');
|
|
45
|
+
expect(executedCommands).not.toContain('echo "Deploying to production..."');
|
|
46
|
+
const workspace = executor.workspace;
|
|
47
|
+
expect(workspace.hasChoice('staging')).toBe(true);
|
|
48
|
+
// Verify execution order
|
|
49
|
+
const stagingIndex = executedCommands.indexOf('echo "Deploying to staging..."');
|
|
50
|
+
expect(stagingIndex).toBeGreaterThan(-1);
|
|
51
|
+
expect(stagingIndex).toBeGreaterThan(executedCommands.indexOf('echo "Building..."'));
|
|
52
|
+
console.log('\n✅ TEST PASSED - All commands executed correctly');
|
|
53
|
+
}
|
|
54
|
+
finally {
|
|
55
|
+
delete process.env.CI;
|
|
56
|
+
}
|
|
57
|
+
});
|
|
58
|
+
it('MUST WORK: Step-by-step manual execution', async () => {
|
|
59
|
+
const workflow = {
|
|
60
|
+
steps: [
|
|
61
|
+
{ run: 'step1' },
|
|
62
|
+
{ choose: { message: 'Choose?', options: [{ id: 's', label: 'S' }], as: 'choice' } },
|
|
63
|
+
{ when: { var: { choice: 's' } }, run: 'step3' },
|
|
64
|
+
],
|
|
65
|
+
};
|
|
66
|
+
// Use executor's actual workspace
|
|
67
|
+
const workspace = executor.workspace;
|
|
68
|
+
const choicePrompt = executor.choicePrompt;
|
|
69
|
+
// Mock choicePrompt
|
|
70
|
+
choicePrompt.prompt = vi.fn().mockResolvedValue({ id: 's', label: 'S' });
|
|
71
|
+
// Step 0
|
|
72
|
+
await executor.executeRunStep(workflow.steps[0], { workspace, stepIndex: 0 });
|
|
73
|
+
// f1 fact is not set if there's no sets/declares
|
|
74
|
+
// Step 1 - executeChooseStep uses this.workspace
|
|
75
|
+
await executor.executeChooseStep(workflow.steps[1], { workspace, stepIndex: 1 });
|
|
76
|
+
// Check if choicePrompt was called
|
|
77
|
+
expect(choicePrompt.prompt).toHaveBeenCalled();
|
|
78
|
+
// Check in executor's workspace
|
|
79
|
+
const execWorkspace = executor.workspace;
|
|
80
|
+
console.log('Workspace choices after choose:', Array.from(execWorkspace.state.choices.entries()));
|
|
81
|
+
expect(execWorkspace.hasChoice('s')).toBe(true);
|
|
82
|
+
expect(execWorkspace.getVariable('choice')).toBe('s');
|
|
83
|
+
// Step 2 - Condition evaluation (using executor's workspace)
|
|
84
|
+
const step2 = workflow.steps[2];
|
|
85
|
+
if (!step2.when) {
|
|
86
|
+
throw new Error('Step 2 should have a when condition');
|
|
87
|
+
}
|
|
88
|
+
const evaluator = new ConditionEvaluator(executor.workspace);
|
|
89
|
+
const result = evaluator.evaluate(step2.when);
|
|
90
|
+
expect(result).toBe(true);
|
|
91
|
+
// Step 2 - Execute
|
|
92
|
+
if (result) {
|
|
93
|
+
await executor.executeRunStep(step2, { workspace: executor.workspace, stepIndex: 2 });
|
|
94
|
+
}
|
|
95
|
+
expect(executedCommands).toContain('step3');
|
|
96
|
+
});
|
|
97
|
+
it('MUST WORK: Verify condition evaluation timing', async () => {
|
|
98
|
+
const workspace = new Workspace();
|
|
99
|
+
workspace.setVariable('env', 'staging');
|
|
100
|
+
const evaluator = new ConditionEvaluator(workspace);
|
|
101
|
+
const condition = {
|
|
102
|
+
var: {
|
|
103
|
+
env: 'staging'
|
|
104
|
+
}
|
|
105
|
+
};
|
|
106
|
+
const result = evaluator.evaluate(condition);
|
|
107
|
+
expect(result).toBe(true);
|
|
108
|
+
expect(workspace.getVariable('env')).toBe('staging');
|
|
109
|
+
});
|
|
110
|
+
});
|
|
111
|
+
//# sourceMappingURL=comprehensive-basic-yaml.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"comprehensive-basic-yaml.test.js","sourceRoot":"","sources":["../../../src/core/__tests__/comprehensive-basic-yaml.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"condition-evaluator.test.d.ts","sourceRoot":"","sources":["../../../src/core/__tests__/condition-evaluator.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,170 @@
|
|
|
1
|
+
import { describe, it, expect } from 'vitest';
|
|
2
|
+
import { ConditionEvaluator } from '../condition-evaluator.js';
|
|
3
|
+
import { Workspace } from '../workspace.js';
|
|
4
|
+
describe('ConditionEvaluator', () => {
|
|
5
|
+
describe('variable value comparison', () => {
|
|
6
|
+
it('should evaluate variable value comparison correctly', () => {
|
|
7
|
+
const workspace = new Workspace();
|
|
8
|
+
workspace.setVariable('env', 'staging');
|
|
9
|
+
const evaluator = new ConditionEvaluator(workspace);
|
|
10
|
+
const condition = {
|
|
11
|
+
var: {
|
|
12
|
+
env: 'staging'
|
|
13
|
+
}
|
|
14
|
+
};
|
|
15
|
+
expect(evaluator.evaluate(condition)).toBe(true);
|
|
16
|
+
});
|
|
17
|
+
it('should return false when variable value does not match', () => {
|
|
18
|
+
const workspace = new Workspace();
|
|
19
|
+
workspace.setVariable('env', 'staging');
|
|
20
|
+
const evaluator = new ConditionEvaluator(workspace);
|
|
21
|
+
const condition = {
|
|
22
|
+
var: {
|
|
23
|
+
env: 'prod'
|
|
24
|
+
}
|
|
25
|
+
};
|
|
26
|
+
expect(evaluator.evaluate(condition)).toBe(false);
|
|
27
|
+
});
|
|
28
|
+
it('should return false when variable does not exist', () => {
|
|
29
|
+
const workspace = new Workspace();
|
|
30
|
+
const evaluator = new ConditionEvaluator(workspace);
|
|
31
|
+
const condition = {
|
|
32
|
+
var: {
|
|
33
|
+
env: 'staging'
|
|
34
|
+
}
|
|
35
|
+
};
|
|
36
|
+
expect(evaluator.evaluate(condition)).toBe(false);
|
|
37
|
+
});
|
|
38
|
+
it('MUST PASS: should return false when variable is undefined (bug fix test)', () => {
|
|
39
|
+
const workspace = new Workspace();
|
|
40
|
+
// Variable is not set at all
|
|
41
|
+
const evaluator = new ConditionEvaluator(workspace);
|
|
42
|
+
const condition = {
|
|
43
|
+
var: {
|
|
44
|
+
optionType: 'dev'
|
|
45
|
+
}
|
|
46
|
+
};
|
|
47
|
+
// Should return false, not throw error or return true
|
|
48
|
+
expect(evaluator.evaluate(condition)).toBe(false);
|
|
49
|
+
});
|
|
50
|
+
it('MUST PASS: should correctly compare variable values with different types', () => {
|
|
51
|
+
const workspace = new Workspace();
|
|
52
|
+
workspace.setVariable('optionType', 'dev');
|
|
53
|
+
const evaluator = new ConditionEvaluator(workspace);
|
|
54
|
+
// Match
|
|
55
|
+
expect(evaluator.evaluate({ var: { optionType: 'dev' } })).toBe(true);
|
|
56
|
+
// No match
|
|
57
|
+
expect(evaluator.evaluate({ var: { optionType: 'build' } })).toBe(false);
|
|
58
|
+
expect(evaluator.evaluate({ var: { optionType: 'echo' } })).toBe(false);
|
|
59
|
+
});
|
|
60
|
+
it('MUST PASS: should handle multiple variable comparisons correctly', () => {
|
|
61
|
+
const workspace = new Workspace();
|
|
62
|
+
workspace.setVariable('env', 'staging');
|
|
63
|
+
workspace.setVariable('version', '2.0.0');
|
|
64
|
+
const evaluator = new ConditionEvaluator(workspace);
|
|
65
|
+
// All match
|
|
66
|
+
expect(evaluator.evaluate({
|
|
67
|
+
var: {
|
|
68
|
+
env: 'staging',
|
|
69
|
+
version: '2.0.0'
|
|
70
|
+
}
|
|
71
|
+
})).toBe(true);
|
|
72
|
+
// One doesn't match
|
|
73
|
+
expect(evaluator.evaluate({
|
|
74
|
+
var: {
|
|
75
|
+
env: 'staging',
|
|
76
|
+
version: '1.0.0'
|
|
77
|
+
}
|
|
78
|
+
})).toBe(false);
|
|
79
|
+
// One variable doesn't exist
|
|
80
|
+
expect(evaluator.evaluate({
|
|
81
|
+
var: {
|
|
82
|
+
env: 'staging',
|
|
83
|
+
nonexistent: 'value'
|
|
84
|
+
}
|
|
85
|
+
})).toBe(false);
|
|
86
|
+
});
|
|
87
|
+
it('should evaluate variable value in all condition', () => {
|
|
88
|
+
const workspace = new Workspace();
|
|
89
|
+
workspace.setVariable('env', 'staging');
|
|
90
|
+
const evaluator = new ConditionEvaluator(workspace);
|
|
91
|
+
const condition = {
|
|
92
|
+
all: [
|
|
93
|
+
{
|
|
94
|
+
var: {
|
|
95
|
+
env: 'staging'
|
|
96
|
+
}
|
|
97
|
+
},
|
|
98
|
+
{ file: 'package.json' },
|
|
99
|
+
],
|
|
100
|
+
};
|
|
101
|
+
expect(evaluator.evaluate(condition)).toBe(true);
|
|
102
|
+
});
|
|
103
|
+
it('should evaluate variable value in any condition', () => {
|
|
104
|
+
const workspace = new Workspace();
|
|
105
|
+
workspace.setVariable('env', 'staging');
|
|
106
|
+
const evaluator = new ConditionEvaluator(workspace);
|
|
107
|
+
const condition = {
|
|
108
|
+
any: [
|
|
109
|
+
{
|
|
110
|
+
var: {
|
|
111
|
+
env: 'staging'
|
|
112
|
+
}
|
|
113
|
+
},
|
|
114
|
+
{
|
|
115
|
+
var: {
|
|
116
|
+
env: 'prod'
|
|
117
|
+
}
|
|
118
|
+
},
|
|
119
|
+
],
|
|
120
|
+
};
|
|
121
|
+
expect(evaluator.evaluate(condition)).toBe(true);
|
|
122
|
+
});
|
|
123
|
+
});
|
|
124
|
+
describe('file condition', () => {
|
|
125
|
+
it('should evaluate file exists condition', () => {
|
|
126
|
+
const workspace = new Workspace();
|
|
127
|
+
const evaluator = new ConditionEvaluator(workspace);
|
|
128
|
+
// Check actual file (package.json must exist)
|
|
129
|
+
const condition = { file: 'package.json' };
|
|
130
|
+
expect(evaluator.evaluate(condition)).toBe(true);
|
|
131
|
+
});
|
|
132
|
+
it('should return false when file does not exist', () => {
|
|
133
|
+
const workspace = new Workspace();
|
|
134
|
+
const evaluator = new ConditionEvaluator(workspace);
|
|
135
|
+
const condition = { file: 'nonexistent-file-12345.txt' };
|
|
136
|
+
expect(evaluator.evaluate(condition)).toBe(false);
|
|
137
|
+
});
|
|
138
|
+
it('should work with file in all condition', () => {
|
|
139
|
+
const workspace = new Workspace();
|
|
140
|
+
const evaluator = new ConditionEvaluator(workspace);
|
|
141
|
+
const condition = {
|
|
142
|
+
all: [
|
|
143
|
+
{ file: 'package.json' },
|
|
144
|
+
{ file: 'tsconfig.json' },
|
|
145
|
+
],
|
|
146
|
+
};
|
|
147
|
+
expect(evaluator.evaluate(condition)).toBe(true);
|
|
148
|
+
});
|
|
149
|
+
it('should work with file in any condition', () => {
|
|
150
|
+
const workspace = new Workspace();
|
|
151
|
+
const evaluator = new ConditionEvaluator(workspace);
|
|
152
|
+
const condition = {
|
|
153
|
+
any: [
|
|
154
|
+
{ file: 'package.json' },
|
|
155
|
+
{ file: 'nonexistent-file.txt' },
|
|
156
|
+
],
|
|
157
|
+
};
|
|
158
|
+
expect(evaluator.evaluate(condition)).toBe(true);
|
|
159
|
+
});
|
|
160
|
+
it('should work with not file condition', () => {
|
|
161
|
+
const workspace = new Workspace();
|
|
162
|
+
const evaluator = new ConditionEvaluator(workspace);
|
|
163
|
+
const condition = {
|
|
164
|
+
not: { file: 'nonexistent-file-12345.txt' },
|
|
165
|
+
};
|
|
166
|
+
expect(evaluator.evaluate(condition)).toBe(true);
|
|
167
|
+
});
|
|
168
|
+
});
|
|
169
|
+
});
|
|
170
|
+
//# sourceMappingURL=condition-evaluator.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"condition-evaluator.test.js","sourceRoot":"","sources":["../../../src/core/__tests__/condition-evaluator.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"debug-basic-yaml.test.d.ts","sourceRoot":"","sources":["../../../src/core/__tests__/debug-basic-yaml.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
import { readFileSync } from 'fs';
|
|
2
|
+
import { describe, it, expect, vi, beforeEach } from 'vitest';
|
|
3
|
+
import { parse } from 'yaml';
|
|
4
|
+
import { Executor } from '../executor.js';
|
|
5
|
+
// Mock TaskRunner - actually execute echo commands
|
|
6
|
+
const mockRun = vi.fn().mockImplementation((command) => {
|
|
7
|
+
console.log(`[EXECUTED] ${command}`);
|
|
8
|
+
return Promise.resolve(true);
|
|
9
|
+
});
|
|
10
|
+
vi.mock('../task-runner.js', () => {
|
|
11
|
+
return {
|
|
12
|
+
TaskRunner: vi.fn().mockImplementation(() => {
|
|
13
|
+
return {
|
|
14
|
+
run: mockRun,
|
|
15
|
+
};
|
|
16
|
+
}),
|
|
17
|
+
};
|
|
18
|
+
});
|
|
19
|
+
// Mock ChoicePrompt - behave like actual inquirer
|
|
20
|
+
const mockChoicePrompt = vi.fn();
|
|
21
|
+
vi.mock('../../cli/prompts.js', () => {
|
|
22
|
+
return {
|
|
23
|
+
ChoicePrompt: vi.fn().mockImplementation(() => {
|
|
24
|
+
return {
|
|
25
|
+
prompt: mockChoicePrompt,
|
|
26
|
+
};
|
|
27
|
+
}),
|
|
28
|
+
TextPrompt: vi.fn().mockImplementation(() => {
|
|
29
|
+
return {
|
|
30
|
+
prompt: vi.fn(),
|
|
31
|
+
};
|
|
32
|
+
}),
|
|
33
|
+
};
|
|
34
|
+
});
|
|
35
|
+
describe('DEBUG: Basic YAML Execution - Find the Bug', () => {
|
|
36
|
+
let executor;
|
|
37
|
+
beforeEach(() => {
|
|
38
|
+
vi.clearAllMocks();
|
|
39
|
+
executor = new Executor();
|
|
40
|
+
});
|
|
41
|
+
it('MUST PASS: Execute basic.yaml with staging choice and verify ALL steps run', async () => {
|
|
42
|
+
// Load actual YAML file
|
|
43
|
+
const content = readFileSync('examples/yaml-examples/basic.yaml', 'utf-8');
|
|
44
|
+
const workflow = parse(content);
|
|
45
|
+
console.log('\n=== Starting Workflow Execution ===');
|
|
46
|
+
console.log(`Total steps: ${workflow.steps.length}`);
|
|
47
|
+
// Mock staging selection
|
|
48
|
+
mockChoicePrompt.mockResolvedValueOnce({ id: 'staging', label: 'Staging' });
|
|
49
|
+
// Set CI environment variable
|
|
50
|
+
const originalCI = process.env.CI;
|
|
51
|
+
process.env.CI = 'false';
|
|
52
|
+
try {
|
|
53
|
+
await executor.execute(workflow);
|
|
54
|
+
console.log('\n=== Execution Complete ===');
|
|
55
|
+
console.log(`Total commands executed: ${mockRun.mock.calls.length}`);
|
|
56
|
+
mockRun.mock.calls.forEach((call, i) => {
|
|
57
|
+
console.log(` ${i + 1}. ${call[0]}`);
|
|
58
|
+
});
|
|
59
|
+
// Check workspace state
|
|
60
|
+
const workspace = executor.workspace;
|
|
61
|
+
console.log('\n=== Workspace State ===');
|
|
62
|
+
console.log(`build_started fact: ${workspace.hasFact('build_started')}`);
|
|
63
|
+
console.log(`staging choice: ${workspace.hasChoice('staging')}`);
|
|
64
|
+
console.log(`prod choice: ${workspace.hasChoice('prod')}`);
|
|
65
|
+
// Required verification: staging step must execute
|
|
66
|
+
const executedCommands = mockRun.mock.calls.map(call => call[0]);
|
|
67
|
+
expect(executedCommands).toContain('echo "Building..."');
|
|
68
|
+
// This is the key: staging step should execute
|
|
69
|
+
expect(executedCommands).toContain('echo "Deploying to staging..."');
|
|
70
|
+
// prod step should not execute
|
|
71
|
+
expect(executedCommands).not.toContain('echo "Deploying to production..."');
|
|
72
|
+
// Verify workspace state
|
|
73
|
+
expect(workspace.hasChoice('staging')).toBe(true);
|
|
74
|
+
expect(workspace.getChoice('staging')).toBe('staging');
|
|
75
|
+
console.log('\n✅ ALL ASSERTIONS PASSED');
|
|
76
|
+
}
|
|
77
|
+
catch (error) {
|
|
78
|
+
console.error('\n❌ TEST FAILED:', error);
|
|
79
|
+
throw error;
|
|
80
|
+
}
|
|
81
|
+
finally {
|
|
82
|
+
if (originalCI !== undefined) {
|
|
83
|
+
process.env.CI = originalCI;
|
|
84
|
+
}
|
|
85
|
+
else {
|
|
86
|
+
delete process.env.CI;
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
});
|
|
90
|
+
it('DEBUG: Step by step execution trace', async () => {
|
|
91
|
+
const workflow = {
|
|
92
|
+
steps: [
|
|
93
|
+
{
|
|
94
|
+
run: 'echo "Step 1"',
|
|
95
|
+
},
|
|
96
|
+
{
|
|
97
|
+
choose: {
|
|
98
|
+
message: 'Choose?',
|
|
99
|
+
options: [
|
|
100
|
+
{ id: 'staging', label: 'Staging' },
|
|
101
|
+
],
|
|
102
|
+
as: 'env',
|
|
103
|
+
},
|
|
104
|
+
},
|
|
105
|
+
{
|
|
106
|
+
when: {
|
|
107
|
+
var: {
|
|
108
|
+
env: 'staging'
|
|
109
|
+
}
|
|
110
|
+
},
|
|
111
|
+
run: 'echo "Step 3 - Staging"',
|
|
112
|
+
},
|
|
113
|
+
],
|
|
114
|
+
};
|
|
115
|
+
mockChoicePrompt.mockResolvedValueOnce({ id: 'staging', label: 'Staging' });
|
|
116
|
+
// Log workspace state before and after each step
|
|
117
|
+
const workspace = executor.workspace;
|
|
118
|
+
await executor.execute(workflow);
|
|
119
|
+
// Workspace state after Step 2 (choose)
|
|
120
|
+
console.log('After choose step:');
|
|
121
|
+
console.log(' hasChoice(staging):', workspace.hasChoice('staging'));
|
|
122
|
+
console.log(' getChoice(staging):', workspace.getChoice('staging'));
|
|
123
|
+
// Check if Step 3 executed
|
|
124
|
+
const calls = mockRun.mock.calls.map(call => call[0]);
|
|
125
|
+
expect(calls).toContain('echo "Step 3 - Staging"');
|
|
126
|
+
});
|
|
127
|
+
});
|
|
128
|
+
//# sourceMappingURL=debug-basic-yaml.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"debug-basic-yaml.test.js","sourceRoot":"","sources":["../../../src/core/__tests__/debug-basic-yaml.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"example-files.test.d.ts","sourceRoot":"","sources":["../../../src/core/__tests__/example-files.test.ts"],"names":[],"mappings":""}
|