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.
Files changed (161) hide show
  1. package/LICENSE +21 -0
  2. package/README.ko.md +1034 -0
  3. package/README.md +1031 -0
  4. package/dist/cli/index.d.ts +19 -0
  5. package/dist/cli/index.d.ts.map +1 -0
  6. package/dist/cli/index.js +147 -0
  7. package/dist/cli/index.js.map +1 -0
  8. package/dist/cli/prompts.d.ts +48 -0
  9. package/dist/cli/prompts.d.ts.map +1 -0
  10. package/dist/cli/prompts.js +75 -0
  11. package/dist/cli/prompts.js.map +1 -0
  12. package/dist/cli/ui.d.ts +39 -0
  13. package/dist/cli/ui.d.ts.map +1 -0
  14. package/dist/cli/ui.js +84 -0
  15. package/dist/cli/ui.js.map +1 -0
  16. package/dist/core/__tests__/actual-execution.test.d.ts +2 -0
  17. package/dist/core/__tests__/actual-execution.test.d.ts.map +1 -0
  18. package/dist/core/__tests__/actual-execution.test.js +140 -0
  19. package/dist/core/__tests__/actual-execution.test.js.map +1 -0
  20. package/dist/core/__tests__/base-dir.test.d.ts +2 -0
  21. package/dist/core/__tests__/base-dir.test.d.ts.map +1 -0
  22. package/dist/core/__tests__/base-dir.test.js +146 -0
  23. package/dist/core/__tests__/base-dir.test.js.map +1 -0
  24. package/dist/core/__tests__/built-code-execution.test.d.ts +2 -0
  25. package/dist/core/__tests__/built-code-execution.test.d.ts.map +1 -0
  26. package/dist/core/__tests__/built-code-execution.test.js +48 -0
  27. package/dist/core/__tests__/built-code-execution.test.js.map +1 -0
  28. package/dist/core/__tests__/choose-as-var-condition.test.d.ts +2 -0
  29. package/dist/core/__tests__/choose-as-var-condition.test.d.ts.map +1 -0
  30. package/dist/core/__tests__/choose-as-var-condition.test.js +308 -0
  31. package/dist/core/__tests__/choose-as-var-condition.test.js.map +1 -0
  32. package/dist/core/__tests__/cli-integration.test.d.ts +2 -0
  33. package/dist/core/__tests__/cli-integration.test.d.ts.map +1 -0
  34. package/dist/core/__tests__/cli-integration.test.js +83 -0
  35. package/dist/core/__tests__/cli-integration.test.js.map +1 -0
  36. package/dist/core/__tests__/comprehensive-basic-yaml.test.d.ts +2 -0
  37. package/dist/core/__tests__/comprehensive-basic-yaml.test.d.ts.map +1 -0
  38. package/dist/core/__tests__/comprehensive-basic-yaml.test.js +111 -0
  39. package/dist/core/__tests__/comprehensive-basic-yaml.test.js.map +1 -0
  40. package/dist/core/__tests__/condition-evaluator.test.d.ts +2 -0
  41. package/dist/core/__tests__/condition-evaluator.test.d.ts.map +1 -0
  42. package/dist/core/__tests__/condition-evaluator.test.js +170 -0
  43. package/dist/core/__tests__/condition-evaluator.test.js.map +1 -0
  44. package/dist/core/__tests__/debug-basic-yaml.test.d.ts +2 -0
  45. package/dist/core/__tests__/debug-basic-yaml.test.d.ts.map +1 -0
  46. package/dist/core/__tests__/debug-basic-yaml.test.js +128 -0
  47. package/dist/core/__tests__/debug-basic-yaml.test.js.map +1 -0
  48. package/dist/core/__tests__/example-files.test.d.ts +2 -0
  49. package/dist/core/__tests__/example-files.test.d.ts.map +1 -0
  50. package/dist/core/__tests__/example-files.test.js +200 -0
  51. package/dist/core/__tests__/example-files.test.js.map +1 -0
  52. package/dist/core/__tests__/executor-choice-integration.test.d.ts +2 -0
  53. package/dist/core/__tests__/executor-choice-integration.test.d.ts.map +1 -0
  54. package/dist/core/__tests__/executor-choice-integration.test.js +171 -0
  55. package/dist/core/__tests__/executor-choice-integration.test.js.map +1 -0
  56. package/dist/core/__tests__/executor-choice.test.d.ts +2 -0
  57. package/dist/core/__tests__/executor-choice.test.d.ts.map +1 -0
  58. package/dist/core/__tests__/executor-choice.test.js +174 -0
  59. package/dist/core/__tests__/executor-choice.test.js.map +1 -0
  60. package/dist/core/__tests__/executor-parallel.test.d.ts +2 -0
  61. package/dist/core/__tests__/executor-parallel.test.d.ts.map +1 -0
  62. package/dist/core/__tests__/executor-parallel.test.js +136 -0
  63. package/dist/core/__tests__/executor-parallel.test.js.map +1 -0
  64. package/dist/core/__tests__/executor-prompt.test.d.ts +2 -0
  65. package/dist/core/__tests__/executor-prompt.test.d.ts.map +1 -0
  66. package/dist/core/__tests__/executor-prompt.test.js +149 -0
  67. package/dist/core/__tests__/executor-prompt.test.js.map +1 -0
  68. package/dist/core/__tests__/executor-real-scenario.test.d.ts +2 -0
  69. package/dist/core/__tests__/executor-real-scenario.test.d.ts.map +1 -0
  70. package/dist/core/__tests__/executor-real-scenario.test.js +169 -0
  71. package/dist/core/__tests__/executor-real-scenario.test.js.map +1 -0
  72. package/dist/core/__tests__/file-condition.test.d.ts +2 -0
  73. package/dist/core/__tests__/file-condition.test.d.ts.map +1 -0
  74. package/dist/core/__tests__/file-condition.test.js +182 -0
  75. package/dist/core/__tests__/file-condition.test.js.map +1 -0
  76. package/dist/core/__tests__/final-verification.test.d.ts +2 -0
  77. package/dist/core/__tests__/final-verification.test.d.ts.map +1 -0
  78. package/dist/core/__tests__/final-verification.test.js +59 -0
  79. package/dist/core/__tests__/final-verification.test.js.map +1 -0
  80. package/dist/core/__tests__/parallel-when-condition.test.d.ts +2 -0
  81. package/dist/core/__tests__/parallel-when-condition.test.d.ts.map +1 -0
  82. package/dist/core/__tests__/parallel-when-condition.test.js +155 -0
  83. package/dist/core/__tests__/parallel-when-condition.test.js.map +1 -0
  84. package/dist/core/__tests__/parser.test.d.ts +2 -0
  85. package/dist/core/__tests__/parser.test.d.ts.map +1 -0
  86. package/dist/core/__tests__/parser.test.js +94 -0
  87. package/dist/core/__tests__/parser.test.js.map +1 -0
  88. package/dist/core/__tests__/real-inquirer-test.test.d.ts +2 -0
  89. package/dist/core/__tests__/real-inquirer-test.test.d.ts.map +1 -0
  90. package/dist/core/__tests__/real-inquirer-test.test.js +20 -0
  91. package/dist/core/__tests__/real-inquirer-test.test.js.map +1 -0
  92. package/dist/core/__tests__/reproduce-bug.test.d.ts +2 -0
  93. package/dist/core/__tests__/reproduce-bug.test.d.ts.map +1 -0
  94. package/dist/core/__tests__/reproduce-bug.test.js +84 -0
  95. package/dist/core/__tests__/reproduce-bug.test.js.map +1 -0
  96. package/dist/core/__tests__/timeout-retry.test.d.ts +2 -0
  97. package/dist/core/__tests__/timeout-retry.test.d.ts.map +1 -0
  98. package/dist/core/__tests__/timeout-retry.test.js +184 -0
  99. package/dist/core/__tests__/timeout-retry.test.js.map +1 -0
  100. package/dist/core/__tests__/workflow-validation.test.d.ts +2 -0
  101. package/dist/core/__tests__/workflow-validation.test.d.ts.map +1 -0
  102. package/dist/core/__tests__/workflow-validation.test.js +120 -0
  103. package/dist/core/__tests__/workflow-validation.test.js.map +1 -0
  104. package/dist/core/__tests__/workspace.test.d.ts +2 -0
  105. package/dist/core/__tests__/workspace.test.d.ts.map +1 -0
  106. package/dist/core/__tests__/workspace.test.js +29 -0
  107. package/dist/core/__tests__/workspace.test.js.map +1 -0
  108. package/dist/core/__tests__/yaml-integration.test.d.ts +2 -0
  109. package/dist/core/__tests__/yaml-integration.test.d.ts.map +1 -0
  110. package/dist/core/__tests__/yaml-integration.test.js +114 -0
  111. package/dist/core/__tests__/yaml-integration.test.js.map +1 -0
  112. package/dist/core/__tests__/yaml-scenarios.test.d.ts +2 -0
  113. package/dist/core/__tests__/yaml-scenarios.test.d.ts.map +1 -0
  114. package/dist/core/__tests__/yaml-scenarios.test.js +199 -0
  115. package/dist/core/__tests__/yaml-scenarios.test.js.map +1 -0
  116. package/dist/core/condition-evaluator.d.ts +44 -0
  117. package/dist/core/condition-evaluator.d.ts.map +1 -0
  118. package/dist/core/condition-evaluator.js +121 -0
  119. package/dist/core/condition-evaluator.js.map +1 -0
  120. package/dist/core/executor.d.ts +172 -0
  121. package/dist/core/executor.d.ts.map +1 -0
  122. package/dist/core/executor.js +579 -0
  123. package/dist/core/executor.js.map +1 -0
  124. package/dist/core/parser.d.ts +41 -0
  125. package/dist/core/parser.d.ts.map +1 -0
  126. package/dist/core/parser.js +202 -0
  127. package/dist/core/parser.js.map +1 -0
  128. package/dist/core/rust-task-runner.d.ts +14 -0
  129. package/dist/core/rust-task-runner.d.ts.map +1 -0
  130. package/dist/core/rust-task-runner.js +34 -0
  131. package/dist/core/rust-task-runner.js.map +1 -0
  132. package/dist/core/task-runner.d.ts +63 -0
  133. package/dist/core/task-runner.d.ts.map +1 -0
  134. package/dist/core/task-runner.js +252 -0
  135. package/dist/core/task-runner.js.map +1 -0
  136. package/dist/core/template.d.ts +11 -0
  137. package/dist/core/template.d.ts.map +1 -0
  138. package/dist/core/template.js +36 -0
  139. package/dist/core/template.js.map +1 -0
  140. package/dist/core/workflow-schema.d.ts +31 -0
  141. package/dist/core/workflow-schema.d.ts.map +1 -0
  142. package/dist/core/workflow-schema.js +125 -0
  143. package/dist/core/workflow-schema.js.map +1 -0
  144. package/dist/core/workspace.d.ts +90 -0
  145. package/dist/core/workspace.d.ts.map +1 -0
  146. package/dist/core/workspace.js +143 -0
  147. package/dist/core/workspace.js.map +1 -0
  148. package/dist/index.d.ts +10 -0
  149. package/dist/index.d.ts.map +1 -0
  150. package/dist/index.js +10 -0
  151. package/dist/index.js.map +1 -0
  152. package/dist/task-pipeliner-rs.node +0 -0
  153. package/dist/types/condition.d.ts +62 -0
  154. package/dist/types/condition.d.ts.map +1 -0
  155. package/dist/types/condition.js +6 -0
  156. package/dist/types/condition.js.map +1 -0
  157. package/dist/types/workflow.d.ts +69 -0
  158. package/dist/types/workflow.d.ts.map +1 -0
  159. package/dist/types/workflow.js +2 -0
  160. package/dist/types/workflow.js.map +1 -0
  161. package/package.json +67 -0
@@ -0,0 +1,200 @@
1
+ import { readFileSync, mkdirSync, existsSync } from 'fs';
2
+ import { join, 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 ChoicePrompt, TextPrompt
7
+ const mockChoicePrompt = vi.fn();
8
+ const mockTextPrompt = vi.fn();
9
+ vi.mock('../../cli/prompts.js', () => {
10
+ return {
11
+ ChoicePrompt: vi.fn().mockImplementation(() => {
12
+ return {
13
+ prompt: mockChoicePrompt,
14
+ };
15
+ }),
16
+ TextPrompt: vi.fn().mockImplementation(() => {
17
+ return {
18
+ prompt: mockTextPrompt,
19
+ };
20
+ }),
21
+ };
22
+ });
23
+ // Mock TaskRunner
24
+ const mockRun = vi.fn().mockResolvedValue(true);
25
+ vi.mock('../task-runner.js', () => {
26
+ return {
27
+ TaskRunner: vi.fn().mockImplementation(() => {
28
+ return {
29
+ run: mockRun,
30
+ displayBufferedOutput: vi.fn(),
31
+ };
32
+ }),
33
+ };
34
+ });
35
+ function loadExampleFile(filename) {
36
+ const filePath = join(process.cwd(), 'examples', 'yaml-examples', filename);
37
+ const content = readFileSync(filePath, 'utf-8');
38
+ const workflow = parse(content);
39
+ // Track line numbers (simple version)
40
+ const lineNumbers = new Map();
41
+ const lines = content.split('\n');
42
+ let stepIndex = 0;
43
+ let inSteps = false;
44
+ for (let i = 0; i < lines.length; i++) {
45
+ const line = lines[i];
46
+ const trimmed = line.trim();
47
+ if (trimmed === 'steps:' || trimmed.startsWith('steps:')) {
48
+ inSteps = true;
49
+ continue;
50
+ }
51
+ if (!inSteps)
52
+ continue;
53
+ if (trimmed.startsWith('-')) {
54
+ lineNumbers.set(stepIndex, i + 1);
55
+ stepIndex++;
56
+ }
57
+ }
58
+ workflow._lineNumbers = lineNumbers;
59
+ // Store file name and absolute path
60
+ workflow._fileName = filename;
61
+ workflow._filePath = resolve(filePath);
62
+ return workflow;
63
+ }
64
+ describe('Example Files Integration Tests', () => {
65
+ let executor;
66
+ beforeEach(() => {
67
+ vi.clearAllMocks();
68
+ executor = new Executor();
69
+ });
70
+ describe('basic.yaml', () => {
71
+ it('should execute basic workflow correctly', async () => {
72
+ const workflow = loadExampleFile('basic.yaml');
73
+ mockChoicePrompt.mockResolvedValueOnce({ id: 'staging', label: 'Staging' });
74
+ await executor.execute(workflow);
75
+ const calls = mockRun.mock.calls.map(call => call[0]);
76
+ expect(calls).toContain('echo "Deploying to staging..."');
77
+ });
78
+ });
79
+ describe('prompt.yaml', () => {
80
+ it('should execute prompt workflow correctly', async () => {
81
+ const workflow = loadExampleFile('prompt.yaml');
82
+ mockTextPrompt
83
+ .mockResolvedValueOnce('John')
84
+ .mockResolvedValueOnce('1.0.0')
85
+ .mockResolvedValueOnce('Production deployment');
86
+ mockChoicePrompt.mockResolvedValueOnce({ id: 'prod', label: 'Production' });
87
+ await executor.execute(workflow);
88
+ const calls = mockRun.mock.calls.map(call => call[0]);
89
+ expect(calls).toContain('echo "Hello, John!"');
90
+ expect(calls).toContain('echo "Building version 1.0.0..."');
91
+ expect(calls).toContain('echo "Deploying..."');
92
+ });
93
+ });
94
+ describe('parallel.yaml', () => {
95
+ it('should execute parallel workflow correctly', async () => {
96
+ const workflow = loadExampleFile('parallel.yaml');
97
+ mockChoicePrompt.mockResolvedValueOnce({ id: 'blue_green', label: 'Blue-Green' });
98
+ await executor.execute(workflow);
99
+ const calls = mockRun.mock.calls.map(call => call[0]);
100
+ expect(calls).toContain('echo "Running web tests..."');
101
+ expect(calls).toContain('echo "Running API tests..."');
102
+ expect(calls).toContain('echo "Deploying with blue-green strategy..."');
103
+ });
104
+ });
105
+ describe('conditions.yaml', () => {
106
+ it('should execute conditions workflow correctly', async () => {
107
+ const workflow = loadExampleFile('conditions.yaml');
108
+ mockChoicePrompt.mockResolvedValueOnce({ id: 'prod', label: 'Production' });
109
+ mockTextPrompt.mockResolvedValueOnce('test-project');
110
+ // This will fail at the end because ./dist doesn't exist, which is expected
111
+ try {
112
+ await executor.execute(workflow);
113
+ }
114
+ catch (error) {
115
+ // Expected to fail when dist directory is missing
116
+ expect(error instanceof Error).toBe(true);
117
+ expect(error.message).toBe('Build output not found');
118
+ }
119
+ // Verify some steps executed before the failure
120
+ const calls = mockRun.mock.calls.map(call => call[0]);
121
+ expect(calls.length).toBeGreaterThan(0);
122
+ });
123
+ });
124
+ describe('variables.yaml', () => {
125
+ it('should execute variables workflow correctly', async () => {
126
+ const workflow = loadExampleFile('variables.yaml');
127
+ mockTextPrompt
128
+ .mockResolvedValueOnce('my-app')
129
+ .mockResolvedValueOnce('1.0.0')
130
+ .mockResolvedValueOnce('Production release');
131
+ mockChoicePrompt.mockResolvedValueOnce({ id: 'prod', label: 'Production' });
132
+ await executor.execute(workflow);
133
+ const calls = mockRun.mock.calls.map(call => call[0]);
134
+ expect(calls).toContain('echo "Building my-app..."');
135
+ expect(calls).toContain('echo "Building my-app version 1.0.0..."');
136
+ });
137
+ });
138
+ describe('file-checks.yaml', () => {
139
+ it('should execute file checks workflow correctly', async () => {
140
+ const workflow = loadExampleFile('file-checks.yaml');
141
+ // Use prod choice to avoid dev environment file check failure
142
+ mockChoicePrompt.mockResolvedValueOnce({ id: 'prod', label: 'Production' });
143
+ // This will fail because .env.production doesn't exist, which is expected
144
+ try {
145
+ await executor.execute(workflow);
146
+ }
147
+ catch (error) {
148
+ // Expected to fail when config file is missing
149
+ expect(error instanceof Error).toBe(true);
150
+ }
151
+ // Verify some steps executed before the failure
152
+ const calls = mockRun.mock.calls.map(call => call[0]);
153
+ expect(calls.length).toBeGreaterThan(0);
154
+ });
155
+ });
156
+ describe('cicd.yaml', () => {
157
+ it('should execute CI/CD workflow correctly', async () => {
158
+ const workflow = loadExampleFile('cicd.yaml');
159
+ // Create required directories for file checks
160
+ const distPath = join(process.cwd(), 'dist');
161
+ const testResultsPath = join(process.cwd(), 'test-results');
162
+ if (!existsSync(distPath)) {
163
+ mkdirSync(distPath, { recursive: true });
164
+ }
165
+ if (!existsSync(testResultsPath)) {
166
+ mkdirSync(testResultsPath, { recursive: true });
167
+ }
168
+ mockChoicePrompt
169
+ .mockResolvedValueOnce({ id: 'staging', label: 'Staging' });
170
+ await executor.execute(workflow);
171
+ const calls = mockRun.mock.calls.map(call => call[0]);
172
+ expect(calls).toContain('echo "Deploying to staging..."');
173
+ });
174
+ });
175
+ describe('base-dir-example.yaml', () => {
176
+ it('should execute baseDir workflow correctly', async () => {
177
+ const workflow = loadExampleFile('base-dir-example.yaml');
178
+ await executor.execute(workflow);
179
+ // Verify commands were executed
180
+ expect(mockRun).toHaveBeenCalledTimes(2);
181
+ // Verify baseDir was resolved correctly
182
+ // baseDir is relative to YAML file directory (examples/), so ./examples resolves to examples/examples
183
+ if (!workflow._filePath) {
184
+ throw new Error('_filePath should be set');
185
+ }
186
+ const yamlDir = dirname(workflow._filePath);
187
+ const expectedBaseDir = resolve(yamlDir, 'examples');
188
+ const actualBaseDir = executor.baseDir;
189
+ expect(actualBaseDir).toBe(expectedBaseDir);
190
+ // Verify all commands used the correct cwd
191
+ mockRun.mock.calls.forEach(call => {
192
+ expect(call[8]).toBe(expectedBaseDir); // cwd is 9th parameter (index 8)
193
+ });
194
+ const calls = mockRun.mock.calls.map(call => call[0]);
195
+ expect(calls).toContain('echo "Working in baseDir: $(pwd)"');
196
+ expect(calls).toContain('ls -la | head -5');
197
+ });
198
+ });
199
+ });
200
+ //# sourceMappingURL=example-files.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"example-files.test.js","sourceRoot":"","sources":["../../../src/core/__tests__/example-files.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=executor-choice-integration.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"executor-choice-integration.test.d.ts","sourceRoot":"","sources":["../../../src/core/__tests__/executor-choice-integration.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,171 @@
1
+ import { describe, it, expect, vi, beforeEach } from 'vitest';
2
+ import { Executor } from '../executor.js';
3
+ // Use actual ChoicePrompt and TextPrompt (without mocking)
4
+ // Mock only TaskRunner
5
+ const mockRun = vi.fn().mockResolvedValue(true);
6
+ vi.mock('../task-runner.js', () => {
7
+ return {
8
+ TaskRunner: vi.fn().mockImplementation(() => {
9
+ return {
10
+ run: mockRun,
11
+ };
12
+ }),
13
+ };
14
+ });
15
+ describe('Executor - Choice Integration Test (Real Prompts)', () => {
16
+ let executor;
17
+ let choicePrompt;
18
+ beforeEach(() => {
19
+ vi.clearAllMocks();
20
+ executor = new Executor();
21
+ choicePrompt = executor.choicePrompt;
22
+ });
23
+ it('should execute step after choice is made - REAL PROMPT', async () => {
24
+ const workflow = {
25
+ steps: [
26
+ {
27
+ choose: {
28
+ message: 'Deploy to which environment?',
29
+ options: [
30
+ { id: 'staging', label: 'Staging' },
31
+ { id: 'prod', label: 'Production' },
32
+ ],
33
+ as: 'env',
34
+ },
35
+ },
36
+ {
37
+ when: {
38
+ var: {
39
+ env: 'staging'
40
+ }
41
+ },
42
+ run: 'echo "Deploying to staging..."',
43
+ },
44
+ {
45
+ when: {
46
+ var: {
47
+ env: 'prod'
48
+ }
49
+ },
50
+ run: 'echo "Deploying to production..."',
51
+ },
52
+ ],
53
+ };
54
+ // Mock the actual prompt but use real ChoicePrompt instance
55
+ vi.spyOn(choicePrompt, 'prompt').mockResolvedValue({ id: 'staging', label: 'Staging' });
56
+ await executor.execute(workflow);
57
+ // staging step should execute after staging is selected
58
+ const calls = mockRun.mock.calls.map(call => call[0]);
59
+ expect(calls).toContain('echo "Deploying to staging..."');
60
+ expect(calls).not.toContain('echo "Deploying to production..."');
61
+ // Check if choice and variable are set in workspace
62
+ const workspace = executor.workspace;
63
+ expect(workspace.hasChoice('staging')).toBe(true);
64
+ expect(workspace.getVariable('env')).toBe('staging');
65
+ });
66
+ it('should verify workspace state after choice', async () => {
67
+ const workflow = {
68
+ steps: [
69
+ {
70
+ choose: {
71
+ message: 'Select option',
72
+ options: [
73
+ { id: 'option1', label: 'Option 1' },
74
+ ],
75
+ },
76
+ },
77
+ ],
78
+ };
79
+ const choicePrompt = executor.choicePrompt;
80
+ vi.spyOn(choicePrompt, 'prompt').mockResolvedValue({ id: 'option1', label: 'Option 1' });
81
+ await executor.execute(workflow);
82
+ const workspace = executor.workspace;
83
+ // Check if choice is set
84
+ expect(workspace.hasChoice('option1')).toBe(true);
85
+ expect(workspace.getChoice('option1')).toBe('option1');
86
+ });
87
+ it('MUST PASS: choose with as keyword, then multiple when clauses (bug fix scenario)', async () => {
88
+ const workflow = {
89
+ steps: [
90
+ {
91
+ choose: {
92
+ message: 'Select option type:',
93
+ options: [
94
+ { id: 'dev', label: 'dev' },
95
+ { id: 'build', label: 'build' },
96
+ { id: 'echo', label: 'echo' },
97
+ ],
98
+ as: 'optionType',
99
+ },
100
+ },
101
+ {
102
+ when: {
103
+ var: {
104
+ optionType: 'dev',
105
+ },
106
+ },
107
+ run: 'echo "DEV selected"',
108
+ },
109
+ {
110
+ when: {
111
+ var: {
112
+ optionType: 'build',
113
+ },
114
+ },
115
+ run: 'echo "BUILD selected"',
116
+ },
117
+ {
118
+ when: {
119
+ var: {
120
+ optionType: 'echo',
121
+ },
122
+ },
123
+ run: 'echo "ECHO selected"',
124
+ },
125
+ ],
126
+ };
127
+ // Test with dev
128
+ vi.spyOn(choicePrompt, 'prompt').mockResolvedValue({ id: 'dev', label: 'dev' });
129
+ await executor.execute(workflow);
130
+ const calls = mockRun.mock.calls.map((call) => call[0]);
131
+ expect(calls).toContain('echo "DEV selected"');
132
+ expect(calls).not.toContain('echo "BUILD selected"');
133
+ expect(calls).not.toContain('echo "ECHO selected"');
134
+ // Verify variable is stored correctly
135
+ const workspace = executor.workspace;
136
+ expect(workspace.getVariable('optionType')).toBe('dev');
137
+ });
138
+ it('MUST PASS: choose with as keyword, then when clause with non-matching value', async () => {
139
+ const workflow = {
140
+ steps: [
141
+ {
142
+ choose: {
143
+ message: 'Select option:',
144
+ options: [
145
+ { id: 'dev', label: 'dev' },
146
+ { id: 'build', label: 'build' },
147
+ ],
148
+ as: 'optionType',
149
+ },
150
+ },
151
+ {
152
+ when: {
153
+ var: {
154
+ optionType: 'build',
155
+ },
156
+ },
157
+ run: 'echo "BUILD selected"',
158
+ },
159
+ ],
160
+ };
161
+ // Select dev, but condition checks for build
162
+ vi.spyOn(choicePrompt, 'prompt').mockResolvedValue({ id: 'dev', label: 'dev' });
163
+ await executor.execute(workflow);
164
+ const calls = mockRun.mock.calls.map((call) => call[0]);
165
+ expect(calls).not.toContain('echo "BUILD selected"');
166
+ // Verify variable is stored but condition didn't match
167
+ const workspace = executor.workspace;
168
+ expect(workspace.getVariable('optionType')).toBe('dev');
169
+ });
170
+ });
171
+ //# sourceMappingURL=executor-choice-integration.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"executor-choice-integration.test.js","sourceRoot":"","sources":["../../../src/core/__tests__/executor-choice-integration.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=executor-choice.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"executor-choice.test.d.ts","sourceRoot":"","sources":["../../../src/core/__tests__/executor-choice.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,174 @@
1
+ import { describe, it, expect, vi, beforeEach } from 'vitest';
2
+ import { Executor } from '../executor.js';
3
+ // Mock ChoicePrompt
4
+ const mockPrompt = vi.fn();
5
+ vi.mock('../../cli/prompts.js', () => {
6
+ return {
7
+ ChoicePrompt: vi.fn().mockImplementation(() => {
8
+ return {
9
+ prompt: mockPrompt,
10
+ };
11
+ }),
12
+ TextPrompt: vi.fn().mockImplementation(() => {
13
+ return {
14
+ prompt: vi.fn(),
15
+ };
16
+ }),
17
+ };
18
+ });
19
+ // Mock TaskRunner
20
+ const mockRun = vi.fn().mockResolvedValue(true);
21
+ vi.mock('../task-runner.js', () => {
22
+ return {
23
+ TaskRunner: vi.fn().mockImplementation(() => {
24
+ return {
25
+ run: mockRun,
26
+ };
27
+ }),
28
+ };
29
+ });
30
+ describe('Executor - Choice Condition', () => {
31
+ let executor;
32
+ beforeEach(() => {
33
+ vi.clearAllMocks();
34
+ executor = new Executor();
35
+ });
36
+ it('should execute step after choice is made', async () => {
37
+ const workflow = {
38
+ steps: [
39
+ {
40
+ choose: {
41
+ message: 'Deploy to which environment?',
42
+ options: [
43
+ { id: 'staging', label: 'Staging' },
44
+ { id: 'prod', label: 'Production' },
45
+ ],
46
+ as: 'env',
47
+ },
48
+ },
49
+ {
50
+ when: {
51
+ var: {
52
+ env: 'staging'
53
+ }
54
+ },
55
+ run: 'echo "Deploying to staging..."',
56
+ },
57
+ {
58
+ when: {
59
+ var: {
60
+ env: 'prod'
61
+ }
62
+ },
63
+ run: 'echo "Deploying to production..."',
64
+ },
65
+ ],
66
+ };
67
+ // Mock staging selection
68
+ mockPrompt.mockResolvedValueOnce({ id: 'staging', label: 'Staging' });
69
+ await executor.execute(workflow);
70
+ // Check workspace state
71
+ const workspace = executor.workspace;
72
+ expect(workspace.hasChoice('staging')).toBe(true);
73
+ expect(workspace.getVariable('env')).toBe('staging');
74
+ // staging step should execute after staging is selected
75
+ const calls = mockRun.mock.calls.map(call => call[0]);
76
+ expect(calls).toContain('echo "Deploying to staging..."');
77
+ expect(calls).not.toContain('echo "Deploying to production..."');
78
+ // Check call count
79
+ expect(mockRun).toHaveBeenCalledTimes(1);
80
+ });
81
+ it('should skip step when choice condition is not met', async () => {
82
+ const workflow = {
83
+ steps: [
84
+ {
85
+ choose: {
86
+ message: 'Deploy to which environment?',
87
+ options: [
88
+ { id: 'staging', label: 'Staging' },
89
+ { id: 'prod', label: 'Production' },
90
+ ],
91
+ as: 'env',
92
+ },
93
+ },
94
+ {
95
+ when: {
96
+ var: {
97
+ env: 'staging'
98
+ }
99
+ },
100
+ run: 'echo "Deploying to staging..."',
101
+ },
102
+ {
103
+ when: {
104
+ var: {
105
+ env: 'prod'
106
+ }
107
+ },
108
+ run: 'echo "Deploying to production..."',
109
+ },
110
+ ],
111
+ };
112
+ // Mock prod selection
113
+ mockPrompt.mockResolvedValueOnce({ id: 'prod', label: 'Production' });
114
+ await executor.execute(workflow);
115
+ // prod step should execute after prod is selected
116
+ const calls = mockRun.mock.calls.map(call => call[0]);
117
+ expect(calls).toContain('echo "Deploying to production..."');
118
+ expect(calls).not.toContain('echo "Deploying to staging..."');
119
+ });
120
+ it('should handle multiple choices', async () => {
121
+ const workflow = {
122
+ steps: [
123
+ {
124
+ choose: {
125
+ message: 'First choice?',
126
+ options: [
127
+ { id: 'option1', label: 'Option 1' },
128
+ ],
129
+ as: 'first',
130
+ },
131
+ },
132
+ {
133
+ when: {
134
+ var: {
135
+ first: 'option1'
136
+ }
137
+ },
138
+ choose: {
139
+ message: 'Second choice?',
140
+ options: [
141
+ { id: 'option2', label: 'Option 2' },
142
+ ],
143
+ as: 'second',
144
+ },
145
+ },
146
+ {
147
+ when: {
148
+ all: [
149
+ {
150
+ var: {
151
+ first: 'option1'
152
+ }
153
+ },
154
+ {
155
+ var: {
156
+ second: 'option2'
157
+ }
158
+ },
159
+ ],
160
+ },
161
+ run: 'echo "Both choices made"',
162
+ },
163
+ ],
164
+ };
165
+ mockPrompt
166
+ .mockResolvedValueOnce({ id: 'option1', label: 'Option 1' })
167
+ .mockResolvedValueOnce({ id: 'option2', label: 'Option 2' });
168
+ await executor.execute(workflow);
169
+ // step should execute after both choices are set
170
+ const calls = mockRun.mock.calls.map(call => call[0]);
171
+ expect(calls).toContain('echo "Both choices made"');
172
+ });
173
+ });
174
+ //# sourceMappingURL=executor-choice.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"executor-choice.test.js","sourceRoot":"","sources":["../../../src/core/__tests__/executor-choice.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=executor-parallel.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"executor-parallel.test.d.ts","sourceRoot":"","sources":["../../../src/core/__tests__/executor-parallel.test.ts"],"names":[],"mappings":""}