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,146 @@
|
|
|
1
|
+
import { readFileSync } from 'fs';
|
|
2
|
+
import { resolve, dirname } from 'path';
|
|
3
|
+
import { describe, it, expect, vi, beforeEach } from 'vitest';
|
|
4
|
+
import { parse } from 'yaml';
|
|
5
|
+
import { Executor } from '../executor.js';
|
|
6
|
+
// Mock TaskRunner
|
|
7
|
+
const mockRun = vi.fn().mockResolvedValue(true);
|
|
8
|
+
vi.mock('../task-runner.js', () => {
|
|
9
|
+
return {
|
|
10
|
+
TaskRunner: vi.fn().mockImplementation(() => {
|
|
11
|
+
return {
|
|
12
|
+
run: mockRun,
|
|
13
|
+
};
|
|
14
|
+
}),
|
|
15
|
+
};
|
|
16
|
+
});
|
|
17
|
+
// Mock ChoicePrompt, TextPrompt
|
|
18
|
+
const mockChoicePrompt = vi.fn();
|
|
19
|
+
const mockTextPrompt = vi.fn();
|
|
20
|
+
vi.mock('../../cli/prompts.js', () => {
|
|
21
|
+
return {
|
|
22
|
+
ChoicePrompt: vi.fn().mockImplementation(() => {
|
|
23
|
+
return {
|
|
24
|
+
prompt: mockChoicePrompt,
|
|
25
|
+
};
|
|
26
|
+
}),
|
|
27
|
+
TextPrompt: vi.fn().mockImplementation(() => {
|
|
28
|
+
return {
|
|
29
|
+
prompt: mockTextPrompt,
|
|
30
|
+
};
|
|
31
|
+
}),
|
|
32
|
+
};
|
|
33
|
+
});
|
|
34
|
+
describe('Base Directory Tests', () => {
|
|
35
|
+
let executor;
|
|
36
|
+
beforeEach(() => {
|
|
37
|
+
vi.clearAllMocks();
|
|
38
|
+
executor = new Executor();
|
|
39
|
+
});
|
|
40
|
+
it('should resolve relative baseDir against YAML file directory', async () => {
|
|
41
|
+
const yamlContent = `name: Test
|
|
42
|
+
baseDir: ./examples
|
|
43
|
+
steps:
|
|
44
|
+
- run: echo "test"
|
|
45
|
+
`;
|
|
46
|
+
const workflow = parse(yamlContent);
|
|
47
|
+
// Simulate YAML file path
|
|
48
|
+
workflow._filePath = resolve(process.cwd(), 'test-workflow.yaml');
|
|
49
|
+
await executor.execute(workflow);
|
|
50
|
+
// Check that baseDir was resolved correctly
|
|
51
|
+
const expectedBaseDir = resolve(process.cwd(), 'examples');
|
|
52
|
+
const actualBaseDir = executor.baseDir;
|
|
53
|
+
expect(actualBaseDir).toBe(expectedBaseDir);
|
|
54
|
+
// Verify command was called with correct cwd
|
|
55
|
+
expect(mockRun).toHaveBeenCalled();
|
|
56
|
+
const lastCall = mockRun.mock.calls[mockRun.mock.calls.length - 1];
|
|
57
|
+
expect(lastCall[8]).toBe(expectedBaseDir); // cwd is 9th parameter (index 8)
|
|
58
|
+
});
|
|
59
|
+
it('should use absolute baseDir as-is', async () => {
|
|
60
|
+
const absolutePath = resolve(process.cwd(), 'examples');
|
|
61
|
+
const yamlContent = `name: Test
|
|
62
|
+
baseDir: ${absolutePath}
|
|
63
|
+
steps:
|
|
64
|
+
- run: echo "test"
|
|
65
|
+
`;
|
|
66
|
+
const workflow = parse(yamlContent);
|
|
67
|
+
workflow._filePath = resolve(process.cwd(), 'test-workflow.yaml');
|
|
68
|
+
await executor.execute(workflow);
|
|
69
|
+
// Check that absolute baseDir was used as-is
|
|
70
|
+
const actualBaseDir = executor.baseDir;
|
|
71
|
+
expect(actualBaseDir).toBe(absolutePath);
|
|
72
|
+
// Verify command was called with correct cwd
|
|
73
|
+
expect(mockRun).toHaveBeenCalled();
|
|
74
|
+
const lastCall = mockRun.mock.calls[mockRun.mock.calls.length - 1];
|
|
75
|
+
expect(lastCall[8]).toBe(absolutePath);
|
|
76
|
+
});
|
|
77
|
+
it('should fallback to current working directory if _filePath is not set', async () => {
|
|
78
|
+
const yamlContent = `name: Test
|
|
79
|
+
baseDir: ./examples
|
|
80
|
+
steps:
|
|
81
|
+
- run: echo "test"
|
|
82
|
+
`;
|
|
83
|
+
const workflow = parse(yamlContent);
|
|
84
|
+
// Don't set _filePath
|
|
85
|
+
await executor.execute(workflow);
|
|
86
|
+
// Check that baseDir was resolved against cwd
|
|
87
|
+
const expectedBaseDir = resolve(process.cwd(), 'examples');
|
|
88
|
+
const actualBaseDir = executor.baseDir;
|
|
89
|
+
expect(actualBaseDir).toBe(expectedBaseDir);
|
|
90
|
+
});
|
|
91
|
+
it('should execute commands in baseDir when specified', async () => {
|
|
92
|
+
const yamlContent = `name: Test
|
|
93
|
+
baseDir: ./examples
|
|
94
|
+
steps:
|
|
95
|
+
- run: echo "test1"
|
|
96
|
+
- run: echo "test2"
|
|
97
|
+
`;
|
|
98
|
+
const workflow = parse(yamlContent);
|
|
99
|
+
workflow._filePath = resolve(process.cwd(), 'test-workflow.yaml');
|
|
100
|
+
await executor.execute(workflow);
|
|
101
|
+
// All commands should be called with the same baseDir
|
|
102
|
+
expect(mockRun).toHaveBeenCalledTimes(2);
|
|
103
|
+
const expectedBaseDir = resolve(process.cwd(), 'examples');
|
|
104
|
+
mockRun.mock.calls.forEach(call => {
|
|
105
|
+
expect(call[8]).toBe(expectedBaseDir);
|
|
106
|
+
});
|
|
107
|
+
});
|
|
108
|
+
it('should work without baseDir (use current working directory)', async () => {
|
|
109
|
+
const yamlContent = `name: Test
|
|
110
|
+
steps:
|
|
111
|
+
- run: echo "test"
|
|
112
|
+
`;
|
|
113
|
+
const workflow = parse(yamlContent);
|
|
114
|
+
await executor.execute(workflow);
|
|
115
|
+
// baseDir should be undefined
|
|
116
|
+
const actualBaseDir = executor.baseDir;
|
|
117
|
+
expect(actualBaseDir).toBeUndefined();
|
|
118
|
+
// Command should be called with undefined cwd (defaults to current dir)
|
|
119
|
+
expect(mockRun).toHaveBeenCalled();
|
|
120
|
+
const lastCall = mockRun.mock.calls[mockRun.mock.calls.length - 1];
|
|
121
|
+
expect(lastCall[8]).toBeUndefined();
|
|
122
|
+
});
|
|
123
|
+
it('should execute base-dir-example.yaml correctly', async () => {
|
|
124
|
+
const yamlContent = readFileSync('examples/yaml-examples/base-dir-example.yaml', 'utf-8');
|
|
125
|
+
const workflow = parse(yamlContent);
|
|
126
|
+
workflow._filePath = resolve(process.cwd(), 'examples/yaml-examples/base-dir-example.yaml');
|
|
127
|
+
await executor.execute(workflow);
|
|
128
|
+
// Verify commands were executed
|
|
129
|
+
expect(mockRun).toHaveBeenCalledTimes(2);
|
|
130
|
+
// Verify baseDir was resolved correctly
|
|
131
|
+
// baseDir is relative to YAML file directory, so it should be examples/examples
|
|
132
|
+
// But since YAML file is in examples/, and baseDir is ./examples, it resolves to examples/examples
|
|
133
|
+
// Actually, baseDir: ./examples means "examples directory relative to YAML file location"
|
|
134
|
+
// Since YAML is in examples/, ./examples resolves to examples/examples
|
|
135
|
+
// But the test expects examples/, so let's check what actually happens
|
|
136
|
+
const yamlDir = dirname(workflow._filePath);
|
|
137
|
+
const expectedBaseDir = resolve(yamlDir, 'examples');
|
|
138
|
+
const actualBaseDir = executor.baseDir;
|
|
139
|
+
expect(actualBaseDir).toBe(expectedBaseDir);
|
|
140
|
+
// Verify all commands used the correct cwd
|
|
141
|
+
mockRun.mock.calls.forEach(call => {
|
|
142
|
+
expect(call[8]).toBe(expectedBaseDir);
|
|
143
|
+
});
|
|
144
|
+
});
|
|
145
|
+
});
|
|
146
|
+
//# sourceMappingURL=base-dir.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"base-dir.test.js","sourceRoot":"","sources":["../../../src/core/__tests__/base-dir.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"built-code-execution.test.d.ts","sourceRoot":"","sources":["../../../src/core/__tests__/built-code-execution.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import { execSync } from 'child_process';
|
|
2
|
+
import { writeFileSync, unlinkSync } from 'fs';
|
|
3
|
+
import { describe, it, expect } from 'vitest';
|
|
4
|
+
import { parse } from 'yaml';
|
|
5
|
+
// Test that executes actual built code
|
|
6
|
+
describe('BUILT CODE EXECUTION - Real Environment', () => {
|
|
7
|
+
it('should execute basic.yaml using built CLI code', async () => {
|
|
8
|
+
// Check build
|
|
9
|
+
try {
|
|
10
|
+
execSync('pnpm build', { stdio: 'pipe' });
|
|
11
|
+
}
|
|
12
|
+
catch (_e) {
|
|
13
|
+
// May already be built
|
|
14
|
+
}
|
|
15
|
+
// Create test YAML file (automated input)
|
|
16
|
+
const testYaml = `name: Test Workflow
|
|
17
|
+
steps:
|
|
18
|
+
- run: echo "Step 1"
|
|
19
|
+
- choose:
|
|
20
|
+
message: "Choose option"
|
|
21
|
+
options:
|
|
22
|
+
- id: staging
|
|
23
|
+
label: "Staging"
|
|
24
|
+
- id: prod
|
|
25
|
+
label: "Production"
|
|
26
|
+
as: env
|
|
27
|
+
- when:
|
|
28
|
+
var:
|
|
29
|
+
env: staging
|
|
30
|
+
run: echo "Staging selected"
|
|
31
|
+
- when:
|
|
32
|
+
var:
|
|
33
|
+
env: prod
|
|
34
|
+
run: echo "Prod selected"
|
|
35
|
+
`;
|
|
36
|
+
writeFileSync('/tmp/test-workflow.yaml', testYaml);
|
|
37
|
+
// Skip actual execution as it requires inquirer
|
|
38
|
+
// Instead verify code logic
|
|
39
|
+
const workflow = parse(testYaml);
|
|
40
|
+
expect(workflow.steps.length).toBe(4);
|
|
41
|
+
expect(workflow.steps[2]).toHaveProperty('when');
|
|
42
|
+
expect(workflow.steps[2].when).toHaveProperty('var');
|
|
43
|
+
expect(workflow.steps[2].when.var).toHaveProperty('env', 'staging');
|
|
44
|
+
// cleanup
|
|
45
|
+
unlinkSync('/tmp/test-workflow.yaml');
|
|
46
|
+
});
|
|
47
|
+
});
|
|
48
|
+
//# sourceMappingURL=built-code-execution.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"built-code-execution.test.js","sourceRoot":"","sources":["../../../src/core/__tests__/built-code-execution.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,IAAI,CAAC;AAC/C,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,KAAK,EAAE,MAAM,MAAM,CAAC;AAE7B,uCAAuC;AACvC,QAAQ,CAAC,yCAAyC,EAAE,GAAG,EAAE;IACvD,EAAE,CAAC,gDAAgD,EAAE,KAAK,IAAI,EAAE;QAC9D,cAAc;QACd,IAAI,CAAC;YACH,QAAQ,CAAC,YAAY,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;QAC5C,CAAC;QAAC,OAAO,EAAE,EAAE,CAAC;YACZ,uBAAuB;QACzB,CAAC;QAED,0CAA0C;QAC1C,MAAM,QAAQ,GAAG;;;;;;;;;;;;;;;;;;;CAmBpB,CAAC;QAEE,aAAa,CAAC,yBAAyB,EAAE,QAAQ,CAAC,CAAC;QAEnD,gDAAgD;QAChD,4BAA4B;QAC5B,MAAM,QAAQ,GAAG,KAAK,CAAC,QAAQ,CAAC,CAAC;QACjC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACtC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC;QACjD,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC;QACrD,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,cAAc,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;QAEpE,UAAU;QACV,UAAU,CAAC,yBAAyB,CAAC,CAAC;IACxC,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"choose-as-var-condition.test.d.ts","sourceRoot":"","sources":["../../../src/core/__tests__/choose-as-var-condition.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,308 @@
|
|
|
1
|
+
import { describe, it, expect, vi, beforeEach } from 'vitest';
|
|
2
|
+
import { ConditionEvaluator } from '../condition-evaluator.js';
|
|
3
|
+
import { Executor } from '../executor.js';
|
|
4
|
+
import { Workspace } from '../workspace.js';
|
|
5
|
+
// Mock TaskRunner
|
|
6
|
+
const mockRun = vi.fn().mockResolvedValue(true);
|
|
7
|
+
vi.mock('../task-runner.js', () => {
|
|
8
|
+
return {
|
|
9
|
+
TaskRunner: vi.fn().mockImplementation(() => {
|
|
10
|
+
return {
|
|
11
|
+
run: mockRun,
|
|
12
|
+
};
|
|
13
|
+
}),
|
|
14
|
+
};
|
|
15
|
+
});
|
|
16
|
+
describe('Choose with "as" keyword and var condition - Bug Fix Test', () => {
|
|
17
|
+
let executor;
|
|
18
|
+
let choicePrompt;
|
|
19
|
+
let textPrompt;
|
|
20
|
+
beforeEach(() => {
|
|
21
|
+
vi.clearAllMocks();
|
|
22
|
+
executor = new Executor();
|
|
23
|
+
choicePrompt = executor.choicePrompt;
|
|
24
|
+
textPrompt = executor.textPrompt;
|
|
25
|
+
});
|
|
26
|
+
/**
|
|
27
|
+
* This test reproduces the exact bug scenario:
|
|
28
|
+
* 1. choose with 'as' keyword stores variable
|
|
29
|
+
* 2. prompt stores another variable
|
|
30
|
+
* 3. Multiple when clauses check var conditions
|
|
31
|
+
* 4. Only the matching when clause should execute
|
|
32
|
+
*/
|
|
33
|
+
it('MUST PASS: choose with as keyword, then multiple when clauses with var conditions', async () => {
|
|
34
|
+
const workflow = {
|
|
35
|
+
steps: [
|
|
36
|
+
{
|
|
37
|
+
choose: {
|
|
38
|
+
message: 'Select option type:',
|
|
39
|
+
options: [
|
|
40
|
+
{ id: 'dev', label: 'dev' },
|
|
41
|
+
{ id: 'build', label: 'build' },
|
|
42
|
+
{ id: 'echo', label: 'echo' },
|
|
43
|
+
],
|
|
44
|
+
as: 'optionType',
|
|
45
|
+
},
|
|
46
|
+
},
|
|
47
|
+
{
|
|
48
|
+
prompt: {
|
|
49
|
+
message: 'Enter your name value:',
|
|
50
|
+
as: 'name',
|
|
51
|
+
},
|
|
52
|
+
},
|
|
53
|
+
{
|
|
54
|
+
run: 'echo "Hello,2 {{name}}!"',
|
|
55
|
+
},
|
|
56
|
+
{
|
|
57
|
+
when: {
|
|
58
|
+
var: {
|
|
59
|
+
optionType: 'dev',
|
|
60
|
+
},
|
|
61
|
+
},
|
|
62
|
+
run: 'yarn run dev',
|
|
63
|
+
},
|
|
64
|
+
{
|
|
65
|
+
when: {
|
|
66
|
+
var: {
|
|
67
|
+
optionType: 'build',
|
|
68
|
+
},
|
|
69
|
+
},
|
|
70
|
+
run: 'yarn build',
|
|
71
|
+
},
|
|
72
|
+
{
|
|
73
|
+
when: {
|
|
74
|
+
var: {
|
|
75
|
+
optionType: 'echo',
|
|
76
|
+
},
|
|
77
|
+
},
|
|
78
|
+
run: 'echo "Your name is {{name}}!"',
|
|
79
|
+
},
|
|
80
|
+
],
|
|
81
|
+
};
|
|
82
|
+
// Mock prompts
|
|
83
|
+
vi.spyOn(choicePrompt, 'prompt').mockResolvedValue({ id: 'dev', label: 'dev' });
|
|
84
|
+
vi.spyOn(textPrompt, 'prompt').mockResolvedValue('John');
|
|
85
|
+
await executor.execute(workflow);
|
|
86
|
+
// Verify only 'dev' step executed
|
|
87
|
+
const calls = mockRun.mock.calls.map((call) => call[0]);
|
|
88
|
+
expect(calls).toContain('echo "Hello,2 John!"');
|
|
89
|
+
expect(calls).toContain('yarn run dev');
|
|
90
|
+
expect(calls).not.toContain('yarn build');
|
|
91
|
+
expect(calls).not.toContain('echo "Your name is John!"');
|
|
92
|
+
// Verify workspace state
|
|
93
|
+
const workspace = executor.workspace;
|
|
94
|
+
expect(workspace.getVariable('optionType')).toBe('dev');
|
|
95
|
+
expect(workspace.getVariable('name')).toBe('John');
|
|
96
|
+
});
|
|
97
|
+
it('MUST PASS: choose with as keyword, select build option', async () => {
|
|
98
|
+
const workflow = {
|
|
99
|
+
steps: [
|
|
100
|
+
{
|
|
101
|
+
choose: {
|
|
102
|
+
message: 'Select option type:',
|
|
103
|
+
options: [
|
|
104
|
+
{ id: 'dev', label: 'dev' },
|
|
105
|
+
{ id: 'build', label: 'build' },
|
|
106
|
+
{ id: 'echo', label: 'echo' },
|
|
107
|
+
],
|
|
108
|
+
as: 'optionType',
|
|
109
|
+
},
|
|
110
|
+
},
|
|
111
|
+
{
|
|
112
|
+
when: {
|
|
113
|
+
var: {
|
|
114
|
+
optionType: 'dev',
|
|
115
|
+
},
|
|
116
|
+
},
|
|
117
|
+
run: 'echo "DEV selected"',
|
|
118
|
+
},
|
|
119
|
+
{
|
|
120
|
+
when: {
|
|
121
|
+
var: {
|
|
122
|
+
optionType: 'build',
|
|
123
|
+
},
|
|
124
|
+
},
|
|
125
|
+
run: 'echo "BUILD selected"',
|
|
126
|
+
},
|
|
127
|
+
{
|
|
128
|
+
when: {
|
|
129
|
+
var: {
|
|
130
|
+
optionType: 'echo',
|
|
131
|
+
},
|
|
132
|
+
},
|
|
133
|
+
run: 'echo "ECHO selected"',
|
|
134
|
+
},
|
|
135
|
+
],
|
|
136
|
+
};
|
|
137
|
+
vi.spyOn(choicePrompt, 'prompt').mockResolvedValue({ id: 'build', label: 'build' });
|
|
138
|
+
await executor.execute(workflow);
|
|
139
|
+
const calls = mockRun.mock.calls.map((call) => call[0]);
|
|
140
|
+
expect(calls).not.toContain('echo "DEV selected"');
|
|
141
|
+
expect(calls).toContain('echo "BUILD selected"');
|
|
142
|
+
expect(calls).not.toContain('echo "ECHO selected"');
|
|
143
|
+
});
|
|
144
|
+
it('MUST PASS: choose with as keyword, select echo option', async () => {
|
|
145
|
+
const workflow = {
|
|
146
|
+
steps: [
|
|
147
|
+
{
|
|
148
|
+
choose: {
|
|
149
|
+
message: 'Select option type:',
|
|
150
|
+
options: [
|
|
151
|
+
{ id: 'dev', label: 'dev' },
|
|
152
|
+
{ id: 'build', label: 'build' },
|
|
153
|
+
{ id: 'echo', label: 'echo' },
|
|
154
|
+
],
|
|
155
|
+
as: 'optionType',
|
|
156
|
+
},
|
|
157
|
+
},
|
|
158
|
+
{
|
|
159
|
+
prompt: {
|
|
160
|
+
message: 'Enter your name value:',
|
|
161
|
+
as: 'name',
|
|
162
|
+
},
|
|
163
|
+
},
|
|
164
|
+
{
|
|
165
|
+
when: {
|
|
166
|
+
var: {
|
|
167
|
+
optionType: 'echo',
|
|
168
|
+
},
|
|
169
|
+
},
|
|
170
|
+
run: 'echo "Your name is {{name}}!"',
|
|
171
|
+
},
|
|
172
|
+
],
|
|
173
|
+
};
|
|
174
|
+
vi.spyOn(choicePrompt, 'prompt').mockResolvedValue({ id: 'echo', label: 'echo' });
|
|
175
|
+
vi.spyOn(textPrompt, 'prompt').mockResolvedValue('Alice');
|
|
176
|
+
await executor.execute(workflow);
|
|
177
|
+
const calls = mockRun.mock.calls.map((call) => call[0]);
|
|
178
|
+
expect(calls).toContain('echo "Your name is Alice!"');
|
|
179
|
+
});
|
|
180
|
+
it('MUST PASS: condition evaluator handles undefined variable correctly', () => {
|
|
181
|
+
const workspace = new Workspace();
|
|
182
|
+
const evaluator = new ConditionEvaluator(workspace);
|
|
183
|
+
// Variable doesn't exist
|
|
184
|
+
const condition = {
|
|
185
|
+
var: {
|
|
186
|
+
optionType: 'dev',
|
|
187
|
+
},
|
|
188
|
+
};
|
|
189
|
+
expect(evaluator.evaluate(condition)).toBe(false);
|
|
190
|
+
});
|
|
191
|
+
it('MUST PASS: condition evaluator compares variable value correctly', () => {
|
|
192
|
+
const workspace = new Workspace();
|
|
193
|
+
workspace.setVariable('optionType', 'dev');
|
|
194
|
+
const evaluator = new ConditionEvaluator(workspace);
|
|
195
|
+
// Match
|
|
196
|
+
expect(evaluator.evaluate({ var: { optionType: 'dev' } })).toBe(true);
|
|
197
|
+
// No match
|
|
198
|
+
expect(evaluator.evaluate({ var: { optionType: 'build' } })).toBe(false);
|
|
199
|
+
expect(evaluator.evaluate({ var: { optionType: 'echo' } })).toBe(false);
|
|
200
|
+
});
|
|
201
|
+
it('MUST PASS: multiple when clauses with different variable values', async () => {
|
|
202
|
+
const workflow = {
|
|
203
|
+
steps: [
|
|
204
|
+
{
|
|
205
|
+
choose: {
|
|
206
|
+
message: 'Select environment:',
|
|
207
|
+
options: [
|
|
208
|
+
{ id: 'dev', label: 'Development' },
|
|
209
|
+
{ id: 'staging', label: 'Staging' },
|
|
210
|
+
{ id: 'prod', label: 'Production' },
|
|
211
|
+
],
|
|
212
|
+
as: 'env',
|
|
213
|
+
},
|
|
214
|
+
},
|
|
215
|
+
{
|
|
216
|
+
when: {
|
|
217
|
+
var: {
|
|
218
|
+
env: 'dev',
|
|
219
|
+
},
|
|
220
|
+
},
|
|
221
|
+
run: 'echo "Development environment"',
|
|
222
|
+
},
|
|
223
|
+
{
|
|
224
|
+
when: {
|
|
225
|
+
var: {
|
|
226
|
+
env: 'staging',
|
|
227
|
+
},
|
|
228
|
+
},
|
|
229
|
+
run: 'echo "Staging environment"',
|
|
230
|
+
},
|
|
231
|
+
{
|
|
232
|
+
when: {
|
|
233
|
+
var: {
|
|
234
|
+
env: 'prod',
|
|
235
|
+
},
|
|
236
|
+
},
|
|
237
|
+
run: 'echo "Production environment"',
|
|
238
|
+
},
|
|
239
|
+
],
|
|
240
|
+
};
|
|
241
|
+
// Test dev
|
|
242
|
+
vi.clearAllMocks();
|
|
243
|
+
vi.spyOn(choicePrompt, 'prompt').mockResolvedValue({ id: 'dev', label: 'Development' });
|
|
244
|
+
await executor.execute(workflow);
|
|
245
|
+
let calls = mockRun.mock.calls.map((call) => call[0]);
|
|
246
|
+
expect(calls).toContain('echo "Development environment"');
|
|
247
|
+
expect(calls).not.toContain('echo "Staging environment"');
|
|
248
|
+
expect(calls).not.toContain('echo "Production environment"');
|
|
249
|
+
// Test staging
|
|
250
|
+
executor = new Executor();
|
|
251
|
+
choicePrompt = executor.choicePrompt;
|
|
252
|
+
vi.clearAllMocks();
|
|
253
|
+
vi.spyOn(choicePrompt, 'prompt').mockResolvedValue({ id: 'staging', label: 'Staging' });
|
|
254
|
+
await executor.execute(workflow);
|
|
255
|
+
calls = mockRun.mock.calls.map((call) => call[0]);
|
|
256
|
+
expect(calls).not.toContain('echo "Development environment"');
|
|
257
|
+
expect(calls).toContain('echo "Staging environment"');
|
|
258
|
+
expect(calls).not.toContain('echo "Production environment"');
|
|
259
|
+
// Test prod
|
|
260
|
+
executor = new Executor();
|
|
261
|
+
choicePrompt = executor.choicePrompt;
|
|
262
|
+
vi.clearAllMocks();
|
|
263
|
+
vi.spyOn(choicePrompt, 'prompt').mockResolvedValue({ id: 'prod', label: 'Production' });
|
|
264
|
+
await executor.execute(workflow);
|
|
265
|
+
calls = mockRun.mock.calls.map((call) => call[0]);
|
|
266
|
+
expect(calls).not.toContain('echo "Development environment"');
|
|
267
|
+
expect(calls).not.toContain('echo "Staging environment"');
|
|
268
|
+
expect(calls).toContain('echo "Production environment"');
|
|
269
|
+
});
|
|
270
|
+
it('MUST PASS: choose without as keyword still works with var condition', async () => {
|
|
271
|
+
const workflow = {
|
|
272
|
+
steps: [
|
|
273
|
+
{
|
|
274
|
+
choose: {
|
|
275
|
+
message: 'Select option:',
|
|
276
|
+
options: [
|
|
277
|
+
{ id: 'option1', label: 'Option 1' },
|
|
278
|
+
{ id: 'option2', label: 'Option 2' },
|
|
279
|
+
],
|
|
280
|
+
// No 'as' keyword - should store as choice id
|
|
281
|
+
},
|
|
282
|
+
},
|
|
283
|
+
{
|
|
284
|
+
when: {
|
|
285
|
+
var: {
|
|
286
|
+
option1: 'option1',
|
|
287
|
+
},
|
|
288
|
+
},
|
|
289
|
+
run: 'echo "Option 1 selected"',
|
|
290
|
+
},
|
|
291
|
+
{
|
|
292
|
+
when: {
|
|
293
|
+
var: {
|
|
294
|
+
option2: 'option2',
|
|
295
|
+
},
|
|
296
|
+
},
|
|
297
|
+
run: 'echo "Option 2 selected"',
|
|
298
|
+
},
|
|
299
|
+
],
|
|
300
|
+
};
|
|
301
|
+
vi.spyOn(choicePrompt, 'prompt').mockResolvedValue({ id: 'option1', label: 'Option 1' });
|
|
302
|
+
await executor.execute(workflow);
|
|
303
|
+
const calls = mockRun.mock.calls.map((call) => call[0]);
|
|
304
|
+
expect(calls).toContain('echo "Option 1 selected"');
|
|
305
|
+
expect(calls).not.toContain('echo "Option 2 selected"');
|
|
306
|
+
});
|
|
307
|
+
});
|
|
308
|
+
//# sourceMappingURL=choose-as-var-condition.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"choose-as-var-condition.test.js","sourceRoot":"","sources":["../../../src/core/__tests__/choose-as-var-condition.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli-integration.test.d.ts","sourceRoot":"","sources":["../../../src/core/__tests__/cli-integration.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,83 @@
|
|
|
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
|
|
6
|
+
const mockRun = vi.fn().mockResolvedValue(true);
|
|
7
|
+
vi.mock('../task-runner.js', () => {
|
|
8
|
+
return {
|
|
9
|
+
TaskRunner: vi.fn().mockImplementation(() => {
|
|
10
|
+
return {
|
|
11
|
+
run: mockRun,
|
|
12
|
+
};
|
|
13
|
+
}),
|
|
14
|
+
};
|
|
15
|
+
});
|
|
16
|
+
// Mock ChoicePrompt, TextPrompt
|
|
17
|
+
const mockChoicePrompt = vi.fn();
|
|
18
|
+
vi.mock('../../cli/prompts.js', () => {
|
|
19
|
+
return {
|
|
20
|
+
ChoicePrompt: vi.fn().mockImplementation(() => {
|
|
21
|
+
return {
|
|
22
|
+
prompt: mockChoicePrompt,
|
|
23
|
+
};
|
|
24
|
+
}),
|
|
25
|
+
TextPrompt: vi.fn().mockImplementation(() => {
|
|
26
|
+
return {
|
|
27
|
+
prompt: vi.fn(),
|
|
28
|
+
};
|
|
29
|
+
}),
|
|
30
|
+
};
|
|
31
|
+
});
|
|
32
|
+
describe('CLI Integration - Actual YAML Execution', () => {
|
|
33
|
+
let executor;
|
|
34
|
+
beforeEach(() => {
|
|
35
|
+
vi.clearAllMocks();
|
|
36
|
+
executor = new Executor();
|
|
37
|
+
});
|
|
38
|
+
it('should execute basic.yaml exactly as CLI would', async () => {
|
|
39
|
+
// Load and parse YAML same way as CLI
|
|
40
|
+
const content = readFileSync('examples/yaml-examples/basic.yaml', 'utf-8');
|
|
41
|
+
const workflow = parse(content);
|
|
42
|
+
// Verify YAML parsing result
|
|
43
|
+
expect(workflow.steps).toBeDefined();
|
|
44
|
+
expect(Array.isArray(workflow.steps)).toBe(true);
|
|
45
|
+
expect(workflow.steps.length).toBeGreaterThan(0);
|
|
46
|
+
// Select staging
|
|
47
|
+
mockChoicePrompt.mockResolvedValueOnce({ id: 'staging', label: 'Staging' });
|
|
48
|
+
// Execute same way as CLI
|
|
49
|
+
await executor.execute(workflow);
|
|
50
|
+
// Check executed commands
|
|
51
|
+
const executedCommands = mockRun.mock.calls.map(call => call[0]);
|
|
52
|
+
// Verify required commands were executed
|
|
53
|
+
expect(executedCommands).toContain('echo "Building..."');
|
|
54
|
+
expect(executedCommands).toContain('echo "Deploying to staging..."');
|
|
55
|
+
// Commands that should not be executed
|
|
56
|
+
expect(executedCommands).not.toContain('echo "Deploying to production..."');
|
|
57
|
+
// Check workspace state
|
|
58
|
+
const workspace = executor.workspace;
|
|
59
|
+
expect(workspace.hasChoice('staging')).toBe(true);
|
|
60
|
+
expect(workspace.getChoice('staging')).toBe('staging');
|
|
61
|
+
console.log('✅ All assertions passed - workflow executed correctly');
|
|
62
|
+
});
|
|
63
|
+
it('should handle YAML parsing edge cases', async () => {
|
|
64
|
+
// Check object structure after YAML parsing
|
|
65
|
+
const content = readFileSync('examples/yaml-examples/basic.yaml', 'utf-8');
|
|
66
|
+
const workflow = parse(content);
|
|
67
|
+
// Check step types
|
|
68
|
+
const chooseStep = workflow.steps.find(s => 'choose' in s);
|
|
69
|
+
expect(chooseStep).toBeDefined();
|
|
70
|
+
if (!chooseStep) {
|
|
71
|
+
throw new Error('chooseStep should exist');
|
|
72
|
+
}
|
|
73
|
+
expect('choose' in chooseStep).toBe(true);
|
|
74
|
+
const runStepWithWhen = workflow.steps.find(s => 'run' in s && 'when' in s);
|
|
75
|
+
expect(runStepWithWhen).toBeDefined();
|
|
76
|
+
if (!runStepWithWhen) {
|
|
77
|
+
throw new Error('runStepWithWhen should exist');
|
|
78
|
+
}
|
|
79
|
+
expect('run' in runStepWithWhen).toBe(true);
|
|
80
|
+
expect('when' in runStepWithWhen).toBe(true);
|
|
81
|
+
});
|
|
82
|
+
});
|
|
83
|
+
//# sourceMappingURL=cli-integration.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli-integration.test.js","sourceRoot":"","sources":["../../../src/core/__tests__/cli-integration.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"comprehensive-basic-yaml.test.d.ts","sourceRoot":"","sources":["../../../src/core/__tests__/comprehensive-basic-yaml.test.ts"],"names":[],"mappings":""}
|