@sembix/cli 1.3.0 → 1.4.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 (196) hide show
  1. package/COMMANDS.md +1522 -0
  2. package/QUICKSTART.md +829 -0
  3. package/README.md +1949 -285
  4. package/USAGE-EXAMPLES.md +872 -0
  5. package/dist/commands/configure.d.ts.map +1 -1
  6. package/dist/commands/configure.js +172 -2
  7. package/dist/commands/configure.js.map +1 -1
  8. package/dist/commands/index.d.ts +10 -0
  9. package/dist/commands/index.d.ts.map +1 -0
  10. package/dist/commands/index.js +11 -0
  11. package/dist/commands/index.js.map +1 -0
  12. package/dist/commands/login.d.ts +19 -0
  13. package/dist/commands/login.d.ts.map +1 -0
  14. package/dist/commands/login.js +118 -0
  15. package/dist/commands/login.js.map +1 -0
  16. package/dist/commands/logout.d.ts +21 -0
  17. package/dist/commands/logout.d.ts.map +1 -0
  18. package/dist/commands/logout.js +66 -0
  19. package/dist/commands/logout.js.map +1 -0
  20. package/dist/commands/profile-project.d.ts +14 -0
  21. package/dist/commands/profile-project.d.ts.map +1 -0
  22. package/dist/commands/profile-project.js +123 -0
  23. package/dist/commands/profile-project.js.map +1 -0
  24. package/dist/commands/profile.d.ts +26 -0
  25. package/dist/commands/profile.d.ts.map +1 -0
  26. package/dist/commands/profile.js +177 -0
  27. package/dist/commands/profile.js.map +1 -0
  28. package/dist/commands/project.d.ts +16 -0
  29. package/dist/commands/project.d.ts.map +1 -0
  30. package/dist/commands/project.js +153 -0
  31. package/dist/commands/project.js.map +1 -0
  32. package/dist/commands/workflow.d.ts +91 -0
  33. package/dist/commands/workflow.d.ts.map +1 -0
  34. package/dist/commands/workflow.js +1201 -0
  35. package/dist/commands/workflow.js.map +1 -0
  36. package/dist/config-schema.d.ts +23 -0
  37. package/dist/config-schema.d.ts.map +1 -1
  38. package/dist/config-schema.js +21 -1
  39. package/dist/config-schema.js.map +1 -1
  40. package/dist/config.d.ts +4 -0
  41. package/dist/config.d.ts.map +1 -1
  42. package/dist/config.js +23 -2
  43. package/dist/config.js.map +1 -1
  44. package/dist/index.js +318 -1
  45. package/dist/index.js.map +1 -1
  46. package/dist/prompts/project-selection.d.ts +8 -0
  47. package/dist/prompts/project-selection.d.ts.map +1 -0
  48. package/dist/prompts/project-selection.js +132 -0
  49. package/dist/prompts/project-selection.js.map +1 -0
  50. package/dist/prompts/workflow-inputs.d.ts +10 -0
  51. package/dist/prompts/workflow-inputs.d.ts.map +1 -0
  52. package/dist/prompts/workflow-inputs.js +71 -0
  53. package/dist/prompts/workflow-inputs.js.map +1 -0
  54. package/dist/prompts/workflow-selection.d.ts +8 -0
  55. package/dist/prompts/workflow-selection.d.ts.map +1 -0
  56. package/dist/prompts/workflow-selection.js +147 -0
  57. package/dist/prompts/workflow-selection.js.map +1 -0
  58. package/dist/sembix-cli-1.4.0.tgz +0 -0
  59. package/dist/services/cognito-auth.d.ts +92 -0
  60. package/dist/services/cognito-auth.d.ts.map +1 -0
  61. package/dist/services/cognito-auth.js +319 -0
  62. package/dist/services/cognito-auth.js.map +1 -0
  63. package/dist/services/studio-api-client.d.ts +127 -0
  64. package/dist/services/studio-api-client.d.ts.map +1 -0
  65. package/dist/services/studio-api-client.js +291 -0
  66. package/dist/services/studio-api-client.js.map +1 -0
  67. package/dist/types/studio.d.ts +82 -0
  68. package/dist/types/studio.d.ts.map +1 -0
  69. package/dist/types/studio.js +7 -0
  70. package/dist/types/studio.js.map +1 -0
  71. package/dist/types.d.ts +283 -0
  72. package/dist/types.d.ts.map +1 -1
  73. package/dist/types.js +5 -0
  74. package/dist/types.js.map +1 -1
  75. package/dist/utils/browser-auth.d.ts +45 -0
  76. package/dist/utils/browser-auth.d.ts.map +1 -0
  77. package/dist/utils/browser-auth.js +168 -0
  78. package/dist/utils/browser-auth.js.map +1 -0
  79. package/dist/utils/cognito-auth.d.ts +3 -0
  80. package/dist/utils/cognito-auth.d.ts.map +1 -0
  81. package/dist/utils/cognito-auth.js +3 -0
  82. package/dist/utils/cognito-auth.js.map +1 -0
  83. package/dist/utils/config-file.d.ts +40 -0
  84. package/dist/utils/config-file.d.ts.map +1 -1
  85. package/dist/utils/config-file.js +158 -4
  86. package/dist/utils/config-file.js.map +1 -1
  87. package/dist/utils/environment.d.ts +22 -0
  88. package/dist/utils/environment.d.ts.map +1 -0
  89. package/dist/utils/environment.js +39 -0
  90. package/dist/utils/environment.js.map +1 -0
  91. package/dist/utils/error-handler.d.ts +53 -0
  92. package/dist/utils/error-handler.d.ts.map +1 -0
  93. package/dist/utils/error-handler.js +174 -0
  94. package/dist/utils/error-handler.js.map +1 -0
  95. package/dist/utils/fuzzy-match.d.ts +31 -0
  96. package/dist/utils/fuzzy-match.d.ts.map +1 -0
  97. package/dist/utils/fuzzy-match.js +138 -0
  98. package/dist/utils/fuzzy-match.js.map +1 -0
  99. package/dist/utils/input-parser.d.ts +14 -0
  100. package/dist/utils/input-parser.d.ts.map +1 -0
  101. package/dist/utils/input-parser.js +34 -0
  102. package/dist/utils/input-parser.js.map +1 -0
  103. package/dist/utils/output.d.ts +55 -0
  104. package/dist/utils/output.d.ts.map +1 -0
  105. package/dist/utils/output.js +80 -0
  106. package/dist/utils/output.js.map +1 -0
  107. package/dist/utils/recent-workflows.d.ts +37 -0
  108. package/dist/utils/recent-workflows.d.ts.map +1 -0
  109. package/dist/utils/recent-workflows.js +172 -0
  110. package/dist/utils/recent-workflows.js.map +1 -0
  111. package/dist/utils/studio-api-client.d.ts +3 -0
  112. package/dist/utils/studio-api-client.d.ts.map +1 -0
  113. package/dist/utils/studio-api-client.js +3 -0
  114. package/dist/utils/studio-api-client.js.map +1 -0
  115. package/dist/utils/studio-api.d.ts +53 -0
  116. package/dist/utils/studio-api.d.ts.map +1 -0
  117. package/dist/utils/studio-api.js +102 -0
  118. package/dist/utils/studio-api.js.map +1 -0
  119. package/dist/utils/studio-config.d.ts +74 -0
  120. package/dist/utils/studio-config.d.ts.map +1 -0
  121. package/dist/utils/studio-config.js +213 -0
  122. package/dist/utils/studio-config.js.map +1 -0
  123. package/dist/utils/token-manager.d.ts +4 -0
  124. package/dist/utils/token-manager.d.ts.map +1 -0
  125. package/dist/utils/token-manager.js +3 -0
  126. package/dist/utils/token-manager.js.map +1 -0
  127. package/dist/utils/ui.d.ts +55 -1
  128. package/dist/utils/ui.d.ts.map +1 -1
  129. package/dist/utils/ui.js +151 -2
  130. package/dist/utils/ui.js.map +1 -1
  131. package/package.json +4 -1
  132. package/dist/__tests__/config-schema.test.d.ts +0 -2
  133. package/dist/__tests__/config-schema.test.d.ts.map +0 -1
  134. package/dist/__tests__/config-schema.test.js +0 -471
  135. package/dist/__tests__/config-schema.test.js.map +0 -1
  136. package/dist/__tests__/config.test.d.ts +0 -2
  137. package/dist/__tests__/config.test.d.ts.map +0 -1
  138. package/dist/__tests__/config.test.js +0 -75
  139. package/dist/__tests__/config.test.js.map +0 -1
  140. package/dist/__tests__/integration/configure.test.d.ts +0 -2
  141. package/dist/__tests__/integration/configure.test.d.ts.map +0 -1
  142. package/dist/__tests__/integration/configure.test.js +0 -247
  143. package/dist/__tests__/integration/configure.test.js.map +0 -1
  144. package/dist/__tests__/integration/fixtures/configs.d.ts +0 -477
  145. package/dist/__tests__/integration/fixtures/configs.d.ts.map +0 -1
  146. package/dist/__tests__/integration/fixtures/configs.js +0 -175
  147. package/dist/__tests__/integration/fixtures/configs.js.map +0 -1
  148. package/dist/__tests__/integration/helpers/cli-runner.d.ts +0 -63
  149. package/dist/__tests__/integration/helpers/cli-runner.d.ts.map +0 -1
  150. package/dist/__tests__/integration/helpers/cli-runner.js +0 -152
  151. package/dist/__tests__/integration/helpers/cli-runner.js.map +0 -1
  152. package/dist/__tests__/integration/helpers/command-runner.d.ts +0 -53
  153. package/dist/__tests__/integration/helpers/command-runner.d.ts.map +0 -1
  154. package/dist/__tests__/integration/helpers/command-runner.js +0 -117
  155. package/dist/__tests__/integration/helpers/command-runner.js.map +0 -1
  156. package/dist/__tests__/integration/studio-create.test.d.ts +0 -2
  157. package/dist/__tests__/integration/studio-create.test.d.ts.map +0 -1
  158. package/dist/__tests__/integration/studio-create.test.js +0 -209
  159. package/dist/__tests__/integration/studio-create.test.js.map +0 -1
  160. package/dist/__tests__/integration/studio-update.test.d.ts +0 -2
  161. package/dist/__tests__/integration/studio-update.test.d.ts.map +0 -1
  162. package/dist/__tests__/integration/studio-update.test.js +0 -166
  163. package/dist/__tests__/integration/studio-update.test.js.map +0 -1
  164. package/dist/commands/__tests__/configure.test.d.ts +0 -2
  165. package/dist/commands/__tests__/configure.test.d.ts.map +0 -1
  166. package/dist/commands/__tests__/configure.test.js +0 -229
  167. package/dist/commands/__tests__/configure.test.js.map +0 -1
  168. package/dist/prompts/__tests__/environment-setup.test.d.ts +0 -2
  169. package/dist/prompts/__tests__/environment-setup.test.d.ts.map +0 -1
  170. package/dist/prompts/__tests__/environment-setup.test.js +0 -206
  171. package/dist/prompts/__tests__/environment-setup.test.js.map +0 -1
  172. package/dist/prompts/__tests__/hub-integration.test.d.ts +0 -2
  173. package/dist/prompts/__tests__/hub-integration.test.d.ts.map +0 -1
  174. package/dist/prompts/__tests__/hub-integration.test.js +0 -126
  175. package/dist/prompts/__tests__/hub-integration.test.js.map +0 -1
  176. package/dist/prompts/__tests__/prompt-helpers.test.d.ts +0 -2
  177. package/dist/prompts/__tests__/prompt-helpers.test.d.ts.map +0 -1
  178. package/dist/prompts/__tests__/prompt-helpers.test.js +0 -235
  179. package/dist/prompts/__tests__/prompt-helpers.test.js.map +0 -1
  180. package/dist/sembix-cli-1.3.0.tgz +0 -0
  181. package/dist/utils/__tests__/config-file.test.d.ts +0 -2
  182. package/dist/utils/__tests__/config-file.test.d.ts.map +0 -1
  183. package/dist/utils/__tests__/config-file.test.js +0 -218
  184. package/dist/utils/__tests__/config-file.test.js.map +0 -1
  185. package/dist/utils/__tests__/config-loader.test.d.ts +0 -2
  186. package/dist/utils/__tests__/config-loader.test.d.ts.map +0 -1
  187. package/dist/utils/__tests__/config-loader.test.js +0 -325
  188. package/dist/utils/__tests__/config-loader.test.js.map +0 -1
  189. package/dist/utils/__tests__/github.test.d.ts +0 -2
  190. package/dist/utils/__tests__/github.test.d.ts.map +0 -1
  191. package/dist/utils/__tests__/github.test.js +0 -282
  192. package/dist/utils/__tests__/github.test.js.map +0 -1
  193. package/dist/utils/__tests__/ui.test.d.ts +0 -2
  194. package/dist/utils/__tests__/ui.test.d.ts.map +0 -1
  195. package/dist/utils/__tests__/ui.test.js +0 -256
  196. package/dist/utils/__tests__/ui.test.js.map +0 -1
@@ -1,218 +0,0 @@
1
- import { describe, it, expect, vi, beforeEach } from 'vitest';
2
- import { promises as fs } from 'fs';
3
- import { existsSync } from 'fs';
4
- import { homedir } from 'os';
5
- // Mock os module BEFORE importing the module under test
6
- vi.mock('os', () => ({
7
- homedir: vi.fn(() => '/home/testuser'),
8
- }));
9
- // Mock fs modules
10
- vi.mock('fs', () => ({
11
- existsSync: vi.fn(),
12
- promises: {
13
- readFile: vi.fn(),
14
- writeFile: vi.fn(),
15
- mkdir: vi.fn(),
16
- },
17
- }));
18
- // NOW import the module under test
19
- import { readConfig, writeConfig, getConfigPath, configExists, } from '../config-file.js';
20
- const mockExistsSync = vi.mocked(existsSync);
21
- const mockReadFile = vi.mocked(fs.readFile);
22
- const mockWriteFile = vi.mocked(fs.writeFile);
23
- const mockMkdir = vi.mocked(fs.mkdir);
24
- const mockHomedir = vi.mocked(homedir);
25
- describe('config-file', () => {
26
- beforeEach(() => {
27
- vi.clearAllMocks();
28
- mockHomedir.mockReturnValue('/home/testuser');
29
- });
30
- describe('getConfigPath', () => {
31
- it('should return the correct config path', () => {
32
- const path = getConfigPath();
33
- expect(path).toBe('/home/testuser/.sembix/config');
34
- });
35
- });
36
- describe('configExists', () => {
37
- it('should return true when config file exists', () => {
38
- mockExistsSync.mockReturnValue(true);
39
- expect(configExists()).toBe(true);
40
- expect(mockExistsSync).toHaveBeenCalledWith('/home/testuser/.sembix/config');
41
- });
42
- it('should return false when config file does not exist', () => {
43
- mockExistsSync.mockReturnValue(false);
44
- expect(configExists()).toBe(false);
45
- });
46
- });
47
- describe('readConfig', () => {
48
- it('should return empty object when config file does not exist', async () => {
49
- mockExistsSync.mockReturnValue(false);
50
- const config = await readConfig();
51
- expect(config).toEqual({});
52
- });
53
- it('should parse valid config file with github_token', async () => {
54
- mockExistsSync.mockReturnValue(true);
55
- mockReadFile.mockResolvedValue('github_token=ghp_test123\n');
56
- const config = await readConfig();
57
- expect(config).toEqual({
58
- github_token: 'ghp_test123',
59
- });
60
- });
61
- it('should parse valid config file with both fields', async () => {
62
- mockExistsSync.mockReturnValue(true);
63
- mockReadFile.mockResolvedValue('github_token=ghp_test123\ndefault_github_org=acme-corp\n');
64
- const config = await readConfig();
65
- expect(config).toEqual({
66
- github_token: 'ghp_test123',
67
- default_github_org: 'acme-corp',
68
- });
69
- });
70
- it('should ignore comments and empty lines', async () => {
71
- mockExistsSync.mockReturnValue(true);
72
- mockReadFile.mockResolvedValue(`
73
- # This is a comment
74
- github_token=ghp_test123
75
-
76
- ; Another comment style
77
- default_github_org=acme-corp
78
- `);
79
- const config = await readConfig();
80
- expect(config).toEqual({
81
- github_token: 'ghp_test123',
82
- default_github_org: 'acme-corp',
83
- });
84
- });
85
- it('should handle values with equals signs', async () => {
86
- mockExistsSync.mockReturnValue(true);
87
- mockReadFile.mockResolvedValue('github_token=ghp_test=123=456\n');
88
- const config = await readConfig();
89
- expect(config).toEqual({
90
- github_token: 'ghp_test=123=456',
91
- });
92
- });
93
- it('should trim whitespace from keys and values', async () => {
94
- mockExistsSync.mockReturnValue(true);
95
- mockReadFile.mockResolvedValue(' github_token = ghp_test123 \n');
96
- const config = await readConfig();
97
- expect(config).toEqual({
98
- github_token: 'ghp_test123',
99
- });
100
- });
101
- it('should ignore unknown keys', async () => {
102
- mockExistsSync.mockReturnValue(true);
103
- mockReadFile.mockResolvedValue('github_token=ghp_test123\nunknown_key=value\ndefault_github_org=acme\n');
104
- const config = await readConfig();
105
- expect(config).toEqual({
106
- github_token: 'ghp_test123',
107
- default_github_org: 'acme',
108
- });
109
- });
110
- it('should return empty object on read error', async () => {
111
- mockExistsSync.mockReturnValue(true);
112
- mockReadFile.mockRejectedValue(new Error('Permission denied'));
113
- const config = await readConfig();
114
- expect(config).toEqual({});
115
- });
116
- it('should handle invalid format gracefully', async () => {
117
- mockExistsSync.mockReturnValue(true);
118
- mockReadFile.mockResolvedValue('invalid line without equals\n');
119
- const config = await readConfig();
120
- expect(config).toEqual({});
121
- });
122
- });
123
- describe('writeConfig', () => {
124
- it('should create directory if it does not exist', async () => {
125
- mockExistsSync.mockReturnValue(false);
126
- mockMkdir.mockResolvedValue(undefined);
127
- mockWriteFile.mockResolvedValue(undefined);
128
- const config = {
129
- github_token: 'ghp_test123',
130
- };
131
- await writeConfig(config);
132
- expect(mockMkdir).toHaveBeenCalledWith('/home/testuser/.sembix', {
133
- recursive: true,
134
- mode: 0o700,
135
- });
136
- });
137
- it('should not create directory if it already exists', async () => {
138
- mockExistsSync.mockReturnValue(true);
139
- mockWriteFile.mockResolvedValue(undefined);
140
- const config = {
141
- github_token: 'ghp_test123',
142
- };
143
- await writeConfig(config);
144
- expect(mockMkdir).not.toHaveBeenCalled();
145
- });
146
- it('should write config with github_token only', async () => {
147
- mockExistsSync.mockReturnValue(true);
148
- mockWriteFile.mockResolvedValue(undefined);
149
- const config = {
150
- github_token: 'ghp_test123',
151
- };
152
- await writeConfig(config);
153
- expect(mockWriteFile).toHaveBeenCalledWith('/home/testuser/.sembix/config', expect.stringContaining('github_token=ghp_test123'), { mode: 0o600 });
154
- });
155
- it('should write config with both fields', async () => {
156
- mockExistsSync.mockReturnValue(true);
157
- mockWriteFile.mockResolvedValue(undefined);
158
- const config = {
159
- github_token: 'ghp_test123',
160
- default_github_org: 'acme-corp',
161
- };
162
- await writeConfig(config);
163
- const writeCall = mockWriteFile.mock.calls[0];
164
- const content = writeCall[1];
165
- expect(content).toContain('github_token=ghp_test123');
166
- expect(content).toContain('default_github_org=acme-corp');
167
- expect(writeCall[2]).toEqual({ mode: 0o600 });
168
- });
169
- it('should include header comments', async () => {
170
- mockExistsSync.mockReturnValue(true);
171
- mockWriteFile.mockResolvedValue(undefined);
172
- const config = {
173
- github_token: 'ghp_test123',
174
- };
175
- await writeConfig(config);
176
- const content = mockWriteFile.mock.calls[0][1];
177
- expect(content).toContain('# Sembix CLI Configuration');
178
- expect(content).toContain('# Generated by: sembix configure');
179
- });
180
- it('should end with trailing newline', async () => {
181
- mockExistsSync.mockReturnValue(true);
182
- mockWriteFile.mockResolvedValue(undefined);
183
- const config = {
184
- github_token: 'ghp_test123',
185
- };
186
- await writeConfig(config);
187
- const content = mockWriteFile.mock.calls[0][1];
188
- expect(content.endsWith('\n')).toBe(true);
189
- });
190
- it('should handle empty config object', async () => {
191
- mockExistsSync.mockReturnValue(true);
192
- mockWriteFile.mockResolvedValue(undefined);
193
- const config = {};
194
- await writeConfig(config);
195
- const content = mockWriteFile.mock.calls[0][1];
196
- expect(content).toContain('# Sembix CLI Configuration');
197
- expect(content).not.toContain('github_token=');
198
- expect(content).not.toContain('default_github_org=');
199
- });
200
- it('should propagate write errors', async () => {
201
- mockExistsSync.mockReturnValue(true);
202
- mockWriteFile.mockRejectedValue(new Error('Disk full'));
203
- const config = {
204
- github_token: 'ghp_test123',
205
- };
206
- await expect(writeConfig(config)).rejects.toThrow('Disk full');
207
- });
208
- it('should propagate mkdir errors', async () => {
209
- mockExistsSync.mockReturnValue(false);
210
- mockMkdir.mockRejectedValue(new Error('Permission denied'));
211
- const config = {
212
- github_token: 'ghp_test123',
213
- };
214
- await expect(writeConfig(config)).rejects.toThrow('Permission denied');
215
- });
216
- });
217
- });
218
- //# sourceMappingURL=config-file.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"config-file.test.js","sourceRoot":"","sources":["../../../src/utils/__tests__/config-file.test.ts"],"names":[],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=config-loader.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"config-loader.test.d.ts","sourceRoot":"","sources":["../../../src/utils/__tests__/config-loader.test.ts"],"names":[],"mappings":""}
@@ -1,325 +0,0 @@
1
- import { describe, it, expect, vi, beforeEach } from 'vitest';
2
- import * as yaml from 'js-yaml';
3
- import { loadConfigFile, mergeConfig, displayConfigErrors, getConfigFilePath, } from '../config-loader.js';
4
- vi.mock('fs/promises', () => ({
5
- readFile: vi.fn(),
6
- }));
7
- import { readFile as mockReadFile } from 'fs/promises';
8
- vi.mock('../ui.js', () => ({
9
- error: vi.fn(),
10
- dim: vi.fn((text) => text),
11
- info: vi.fn(),
12
- highlight: vi.fn((text) => text),
13
- }));
14
- describe('config-loader', () => {
15
- describe('loadConfigFile', () => {
16
- beforeEach(() => {
17
- vi.clearAllMocks();
18
- });
19
- it('should load and parse valid YAML config file', async () => {
20
- const validConfig = {
21
- environmentName: 'production',
22
- awsAccountId: '123456789012',
23
- awsRegion: 'us-east-1',
24
- repository: { owner: 'test-owner', repo: 'test-repo' },
25
- };
26
- vi.mocked(mockReadFile).mockResolvedValue(yaml.dump(validConfig));
27
- const result = await loadConfigFile('config.yaml');
28
- expect(result.success).toBe(true);
29
- expect(result.data).toEqual(validConfig);
30
- expect(result.errors).toBeUndefined();
31
- });
32
- it('should return error for non-existent file', async () => {
33
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
34
- const error = new Error('File not found');
35
- error.code = 'ENOENT';
36
- vi.mocked(mockReadFile).mockRejectedValue(error);
37
- const result = await loadConfigFile('missing.yaml');
38
- expect(result.success).toBe(false);
39
- expect(result.errors).toContain('Config file not found: missing.yaml');
40
- });
41
- // Note: YAML parsing errors are handled but difficult to test reliably
42
- // since js-yaml is permissive. The error handling path exists in the code.
43
- it('should return validation errors for invalid field values', async () => {
44
- const invalidConfig = {
45
- environmentName: 'INVALID_NAME', // uppercase not allowed
46
- awsAccountId: '12345', // not 12 digits
47
- };
48
- vi.mocked(mockReadFile).mockResolvedValue(yaml.dump(invalidConfig));
49
- const result = await loadConfigFile('invalid-fields.yaml');
50
- expect(result.success).toBe(false);
51
- expect(result.errors).toBeDefined();
52
- expect(result.errors.length).toBeGreaterThan(0);
53
- });
54
- it('should validate AWS account ID format', async () => {
55
- const configWithInvalidAccountId = {
56
- awsAccountId: 'abc123456789', // contains letters
57
- };
58
- vi.mocked(mockReadFile).mockResolvedValue(yaml.dump(configWithInvalidAccountId));
59
- const result = await loadConfigFile('test.yaml');
60
- expect(result.success).toBe(false);
61
- expect(result.errors?.some(e => e.includes('awsAccountId'))).toBe(true);
62
- });
63
- it('should validate IAM role ARN format', async () => {
64
- const configWithInvalidArn = {
65
- customerRoleArn: 'invalid-arn',
66
- };
67
- vi.mocked(mockReadFile).mockResolvedValue(yaml.dump(configWithInvalidArn));
68
- const result = await loadConfigFile('test.yaml');
69
- expect(result.success).toBe(false);
70
- expect(result.errors?.some(e => e.includes('customerRoleArn'))).toBe(true);
71
- });
72
- it('should accept partial config with only some fields', async () => {
73
- const partialConfig = {
74
- environmentName: 'dev',
75
- awsRegion: 'us-west-2',
76
- };
77
- vi.mocked(mockReadFile).mockResolvedValue(yaml.dump(partialConfig));
78
- const result = await loadConfigFile('partial.yaml');
79
- expect(result.success).toBe(true);
80
- expect(result.data).toEqual(partialConfig);
81
- });
82
- });
83
- describe('mergeConfig', () => {
84
- it('should return empty config when no inputs provided', () => {
85
- const result = mergeConfig(undefined, {});
86
- expect(result).toEqual({});
87
- });
88
- it('should use config file values when no CLI flags provided', () => {
89
- const configFile = {
90
- environmentName: 'staging',
91
- awsAccountId: '123456789012',
92
- awsRegion: 'us-east-1',
93
- };
94
- const result = mergeConfig(configFile, {});
95
- expect(result.environmentName).toBe('staging');
96
- expect(result.awsAccountId).toBe('123456789012');
97
- expect(result.awsRegion).toBe('us-east-1');
98
- });
99
- it('should override config file with CLI flags', () => {
100
- const configFile = {
101
- environmentName: 'staging',
102
- awsRegion: 'us-east-1',
103
- };
104
- const cliFlags = {
105
- environmentName: 'production',
106
- awsAccountId: '987654321098',
107
- };
108
- const result = mergeConfig(configFile, cliFlags);
109
- expect(result.environmentName).toBe('production'); // CLI flag wins
110
- expect(result.awsRegion).toBe('us-east-1'); // from config file
111
- expect(result.awsAccountId).toBe('987654321098'); // from CLI flag
112
- });
113
- it('should parse repository from CLI repo flag', () => {
114
- const cliFlags = {
115
- repo: 'owner/repo-name',
116
- };
117
- const result = mergeConfig(undefined, cliFlags);
118
- expect(result.repository).toEqual({
119
- owner: 'owner',
120
- repo: 'repo-name',
121
- });
122
- });
123
- it('should merge database configuration', () => {
124
- const configFile = {
125
- database: {
126
- name: 'mydb',
127
- },
128
- };
129
- const cliFlags = {
130
- databaseUser: 'dbuser',
131
- };
132
- const result = mergeConfig(configFile, cliFlags);
133
- expect(result.database).toEqual({
134
- name: 'mydb',
135
- user: 'dbuser',
136
- });
137
- });
138
- it('should merge networking configuration', () => {
139
- const configFile = {
140
- networking: {
141
- enableVpcEndpoints: true,
142
- vpcCidr: '10.0.0.0/16',
143
- },
144
- };
145
- const cliFlags = {
146
- useCustomNetworking: true,
147
- customVpcId: 'vpc-12345abc',
148
- };
149
- const result = mergeConfig(configFile, cliFlags);
150
- expect(result.networking?.enableVpcEndpoints).toBe(true);
151
- expect(result.networking?.vpcCidr).toBe('10.0.0.0/16');
152
- expect(result.networking?.useCustomNetworking).toBe(true);
153
- expect(result.networking?.customVpcId).toBe('vpc-12345abc');
154
- });
155
- it('should merge security configuration with custom security groups', () => {
156
- const configFile = {
157
- security: {
158
- useCustomSecurityGroups: true,
159
- customSecurityGroups: {
160
- aurora: 'sg-aurora123',
161
- },
162
- },
163
- };
164
- const cliFlags = {
165
- sgWorkflowEngine: 'sg-workflow456',
166
- sgBffEcs: 'sg-bff789',
167
- };
168
- const result = mergeConfig(configFile, cliFlags);
169
- expect(result.security?.useCustomSecurityGroups).toBe(true);
170
- expect(result.security?.customSecurityGroups?.aurora).toBe('sg-aurora123');
171
- expect(result.security?.customSecurityGroups?.workflowEngine).toBe('sg-workflow456');
172
- expect(result.security?.customSecurityGroups?.bffEcs).toBe('sg-bff789');
173
- });
174
- it('should merge security configuration with custom IAM roles', () => {
175
- const configFile = {
176
- security: {
177
- useCustomIamPolicies: true,
178
- customIamRoles: {
179
- workflowEngineExecutionRole: 'arn:aws:iam::123456789012:role/workflow-exec',
180
- },
181
- },
182
- };
183
- const cliFlags = {
184
- iamBffEcsTask: 'arn:aws:iam::123456789012:role/bff-task',
185
- };
186
- const result = mergeConfig(configFile, cliFlags);
187
- expect(result.security?.useCustomIamPolicies).toBe(true);
188
- expect(result.security?.customIamRoles?.workflowEngineExecutionRole).toBe('arn:aws:iam::123456789012:role/workflow-exec');
189
- expect(result.security?.customIamRoles?.bffEcsTaskRole).toBe('arn:aws:iam::123456789012:role/bff-task');
190
- });
191
- it('should merge TLS configuration', () => {
192
- const configFile = {
193
- tls: {
194
- cloudfrontDomain: 'app.example.com',
195
- hostedZoneId: 'Z1234567890ABC',
196
- },
197
- };
198
- const cliFlags = {
199
- cloudfrontCertArn: 'arn:aws:acm:us-east-1:123456789012:certificate/abc123',
200
- bffAlbCertArn: 'arn:aws:acm:us-west-2:123456789012:certificate/def456',
201
- };
202
- const result = mergeConfig(configFile, cliFlags);
203
- expect(result.tls?.cloudfrontDomain).toBe('app.example.com');
204
- expect(result.tls?.hostedZoneId).toBe('Z1234567890ABC');
205
- expect(result.tls?.cloudfrontCertArn).toBe('arn:aws:acm:us-east-1:123456789012:certificate/abc123');
206
- expect(result.tls?.bffAlbCertificateArn).toBe('arn:aws:acm:us-west-2:123456789012:certificate/def456');
207
- });
208
- it('should merge feature flags', () => {
209
- const configFile = {
210
- features: {
211
- deploySembixStudioMemory: true,
212
- },
213
- };
214
- const cliFlags = {
215
- deployStudioNotifications: true,
216
- enableBffWaf: false,
217
- };
218
- const result = mergeConfig(configFile, cliFlags);
219
- expect(result.features?.deploySembixStudioMemory).toBe(true);
220
- expect(result.features?.deploySembixStudioNotifications).toBe(true);
221
- expect(result.features?.enableBffWaf).toBe(false);
222
- });
223
- it('should merge frontend configuration', () => {
224
- const configFile = {
225
- frontend: {
226
- githubAppClientId: 'Iv1.abc123',
227
- },
228
- };
229
- const cliFlags = {
230
- githubAppName: 'my-github-app',
231
- jiraClientId: 'jira-client-123',
232
- };
233
- const result = mergeConfig(configFile, cliFlags);
234
- expect(result.frontend?.githubAppClientId).toBe('Iv1.abc123');
235
- expect(result.frontend?.githubAppName).toBe('my-github-app');
236
- expect(result.frontend?.jiraClientId).toBe('jira-client-123');
237
- });
238
- it('should merge hub configuration', () => {
239
- const configFile = {
240
- hub: {
241
- hubRoles: {
242
- engineExecutionRole: 'arn:aws:iam::123456789012:role/hub-engine',
243
- },
244
- },
245
- };
246
- const cliFlags = {
247
- hubConsumerRole: 'arn:aws:iam::123456789012:role/hub-consumer',
248
- hubAppconfigAppId: 'app-123',
249
- hubAppconfigEnvId: 'env-456',
250
- };
251
- const result = mergeConfig(configFile, cliFlags);
252
- expect(result.hub?.hubRoles?.engineExecutionRole).toBe('arn:aws:iam::123456789012:role/hub-engine');
253
- expect(result.hub?.hubRoles?.consumerRole).toBe('arn:aws:iam::123456789012:role/hub-consumer');
254
- expect(result.hub?.appConfig?.appId).toBe('app-123');
255
- expect(result.hub?.appConfig?.envId).toBe('env-456');
256
- });
257
- it('should throw error for invalid AWS account ID from CLI flag', () => {
258
- const cliFlags = {
259
- awsAccountId: '12345', // not 12 digits
260
- };
261
- expect(() => mergeConfig(undefined, cliFlags)).toThrow('Invalid CLI flags');
262
- });
263
- it('should throw error for invalid IAM role ARN from CLI flag', () => {
264
- const cliFlags = {
265
- customerRoleArn: 'invalid-arn',
266
- };
267
- expect(() => mergeConfig(undefined, cliFlags)).toThrow('Invalid CLI flags');
268
- });
269
- it('should validate CloudFront certificate is in us-east-1', () => {
270
- const cliFlags = {
271
- cloudfrontCertArn: 'arn:aws:acm:us-west-2:123456789012:certificate/abc123', // wrong region
272
- };
273
- expect(() => mergeConfig(undefined, cliFlags)).toThrow(/us-east-1|Invalid CLI flags/);
274
- });
275
- it('should accept valid CloudFront certificate in us-east-1', () => {
276
- const cliFlags = {
277
- cloudfrontCertArn: 'arn:aws:acm:us-east-1:123456789012:certificate/abc123',
278
- };
279
- expect(() => mergeConfig(undefined, cliFlags)).not.toThrow();
280
- });
281
- it('should validate Route53 hosted zone ID format', () => {
282
- const cliFlags = {
283
- hostedZoneId: 'invalid-zone-id',
284
- };
285
- expect(() => mergeConfig(undefined, cliFlags)).toThrow('Invalid CLI flags');
286
- });
287
- it('should not validate config file values (already validated)', () => {
288
- const configFile = {
289
- awsAccountId: '123456789012',
290
- };
291
- const result = mergeConfig(configFile, {});
292
- expect(result.awsAccountId).toBe('123456789012');
293
- });
294
- });
295
- describe('displayConfigErrors', () => {
296
- it('should call ui.error with error messages', async () => {
297
- const uiModule = await import('../ui.js');
298
- const errors = ['Error 1', 'Error 2', 'Error 3'];
299
- const consoleSpy = vi.spyOn(console, 'log').mockImplementation(() => { });
300
- displayConfigErrors(errors);
301
- expect(uiModule.error).toHaveBeenCalledWith('Configuration file validation failed:');
302
- expect(consoleSpy).toHaveBeenCalled();
303
- consoleSpy.mockRestore();
304
- });
305
- });
306
- describe('getConfigFilePath', () => {
307
- it('should return config path from config option', () => {
308
- const options = { config: 'config.yaml' };
309
- expect(getConfigFilePath(options)).toBe('config.yaml');
310
- });
311
- it('should return config path from configFile option', () => {
312
- const options = { configFile: 'config.yaml' };
313
- expect(getConfigFilePath(options)).toBe('config.yaml');
314
- });
315
- it('should prefer config over configFile', () => {
316
- const options = { config: 'config1.yaml', configFile: 'config2.yaml' };
317
- expect(getConfigFilePath(options)).toBe('config1.yaml');
318
- });
319
- it('should return undefined when no config path provided', () => {
320
- const options = {};
321
- expect(getConfigFilePath(options)).toBeUndefined();
322
- });
323
- });
324
- });
325
- //# sourceMappingURL=config-loader.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"config-loader.test.js","sourceRoot":"","sources":["../../../src/utils/__tests__/config-loader.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AAC9D,OAAO,KAAK,IAAI,MAAM,SAAS,CAAC;AAChC,OAAO,EACL,cAAc,EACd,WAAW,EACX,mBAAmB,EACnB,iBAAiB,GAClB,MAAM,qBAAqB,CAAC;AAG7B,EAAE,CAAC,IAAI,CAAC,aAAa,EAAE,GAAG,EAAE,CAAC,CAAC;IAC5B,QAAQ,EAAE,EAAE,CAAC,EAAE,EAAE;CAClB,CAAC,CAAC,CAAC;AAEJ,OAAO,EAAE,QAAQ,IAAI,YAAY,EAAE,MAAM,aAAa,CAAC;AAEvD,EAAE,CAAC,IAAI,CAAC,UAAU,EAAE,GAAG,EAAE,CAAC,CAAC;IACzB,KAAK,EAAE,EAAE,CAAC,EAAE,EAAE;IACd,GAAG,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,IAAY,EAAE,EAAE,CAAC,IAAI,CAAC;IAClC,IAAI,EAAE,EAAE,CAAC,EAAE,EAAE;IACb,SAAS,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,IAAY,EAAE,EAAE,CAAC,IAAI,CAAC;CACzC,CAAC,CAAC,CAAC;AAEJ,QAAQ,CAAC,eAAe,EAAE,GAAG,EAAE;IAC7B,QAAQ,CAAC,gBAAgB,EAAE,GAAG,EAAE;QAC9B,UAAU,CAAC,GAAG,EAAE;YACd,EAAE,CAAC,aAAa,EAAE,CAAC;QACrB,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,8CAA8C,EAAE,KAAK,IAAI,EAAE;YAC5D,MAAM,WAAW,GAAe;gBAC9B,eAAe,EAAE,YAAY;gBAC7B,YAAY,EAAE,cAAc;gBAC5B,SAAS,EAAE,WAAW;gBACtB,UAAU,EAAE,EAAE,KAAK,EAAE,YAAY,EAAE,IAAI,EAAE,WAAW,EAAE;aACvD,CAAC;YAEF,EAAE,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC;YAElE,MAAM,MAAM,GAAG,MAAM,cAAc,CAAC,aAAa,CAAC,CAAC;YAEnD,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAClC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;YACzC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,aAAa,EAAE,CAAC;QACxC,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,2CAA2C,EAAE,KAAK,IAAI,EAAE;YACzD,8DAA8D;YAC9D,MAAM,KAAK,GAAQ,IAAI,KAAK,CAAC,gBAAgB,CAAC,CAAC;YAC/C,KAAK,CAAC,IAAI,GAAG,QAAQ,CAAC;YACtB,EAAE,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,iBAAiB,CAAC,KAAK,CAAC,CAAC;YAEjD,MAAM,MAAM,GAAG,MAAM,cAAc,CAAC,cAAc,CAAC,CAAC;YAEpD,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACnC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,qCAAqC,CAAC,CAAC;QACzE,CAAC,CAAC,CAAC;QAEH,uEAAuE;QACvE,2EAA2E;QAE3E,EAAE,CAAC,0DAA0D,EAAE,KAAK,IAAI,EAAE;YACxE,MAAM,aAAa,GAAG;gBACpB,eAAe,EAAE,cAAc,EAAE,wBAAwB;gBACzD,YAAY,EAAE,OAAO,EAAE,gBAAgB;aACxC,CAAC;YAEF,EAAE,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC;YAEpE,MAAM,MAAM,GAAG,MAAM,cAAc,CAAC,qBAAqB,CAAC,CAAC;YAE3D,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACnC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,WAAW,EAAE,CAAC;YACpC,MAAM,CAAC,MAAM,CAAC,MAAO,CAAC,MAAM,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;QACnD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,uCAAuC,EAAE,KAAK,IAAI,EAAE;YACrD,MAAM,0BAA0B,GAAG;gBACjC,YAAY,EAAE,cAAc,EAAE,mBAAmB;aAClD,CAAC;YAEF,EAAE,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC,0BAA0B,CAAC,CAAC,CAAC;YAEjF,MAAM,MAAM,GAAG,MAAM,cAAc,CAAC,WAAW,CAAC,CAAC;YAEjD,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACnC,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC1E,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,qCAAqC,EAAE,KAAK,IAAI,EAAE;YACnD,MAAM,oBAAoB,GAAG;gBAC3B,eAAe,EAAE,aAAa;aAC/B,CAAC;YAEF,EAAE,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC,CAAC;YAE3E,MAAM,MAAM,GAAG,MAAM,cAAc,CAAC,WAAW,CAAC,CAAC;YAEjD,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACnC,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC7E,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,oDAAoD,EAAE,KAAK,IAAI,EAAE;YAClE,MAAM,aAAa,GAAe;gBAChC,eAAe,EAAE,KAAK;gBACtB,SAAS,EAAE,WAAW;aACvB,CAAC;YAEF,EAAE,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC;YAEpE,MAAM,MAAM,GAAG,MAAM,cAAc,CAAC,cAAc,CAAC,CAAC;YAEpD,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAClC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC;QAC7C,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,aAAa,EAAE,GAAG,EAAE;QAC3B,EAAE,CAAC,oDAAoD,EAAE,GAAG,EAAE;YAC5D,MAAM,MAAM,GAAG,WAAW,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;YAC1C,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QAC7B,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,0DAA0D,EAAE,GAAG,EAAE;YAClE,MAAM,UAAU,GAAe;gBAC7B,eAAe,EAAE,SAAS;gBAC1B,YAAY,EAAE,cAAc;gBAC5B,SAAS,EAAE,WAAW;aACvB,CAAC;YAEF,MAAM,MAAM,GAAG,WAAW,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;YAE3C,MAAM,CAAC,MAAM,CAAC,eAAe,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YAC/C,MAAM,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;YACjD,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QAC7C,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,4CAA4C,EAAE,GAAG,EAAE;YACpD,MAAM,UAAU,GAAe;gBAC7B,eAAe,EAAE,SAAS;gBAC1B,SAAS,EAAE,WAAW;aACvB,CAAC;YAEF,MAAM,QAAQ,GAAG;gBACf,eAAe,EAAE,YAAY;gBAC7B,YAAY,EAAE,cAAc;aAC7B,CAAC;YAEF,MAAM,MAAM,GAAG,WAAW,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;YAEjD,MAAM,CAAC,MAAM,CAAC,eAAe,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,gBAAgB;YACnE,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,mBAAmB;YAC/D,MAAM,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC,gBAAgB;QACpE,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,4CAA4C,EAAE,GAAG,EAAE;YACpD,MAAM,QAAQ,GAAG;gBACf,IAAI,EAAE,iBAAiB;aACxB,CAAC;YAEF,MAAM,MAAM,GAAG,WAAW,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;YAEhD,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,OAAO,CAAC;gBAChC,KAAK,EAAE,OAAO;gBACd,IAAI,EAAE,WAAW;aAClB,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,qCAAqC,EAAE,GAAG,EAAE;YAC7C,MAAM,UAAU,GAAe;gBAC7B,QAAQ,EAAE;oBACR,IAAI,EAAE,MAAM;iBACb;aACF,CAAC;YAEF,MAAM,QAAQ,GAAG;gBACf,YAAY,EAAE,QAAQ;aACvB,CAAC;YAEF,MAAM,MAAM,GAAG,WAAW,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;YAEjD,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,OAAO,CAAC;gBAC9B,IAAI,EAAE,MAAM;gBACZ,IAAI,EAAE,QAAQ;aACf,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,uCAAuC,EAAE,GAAG,EAAE;YAC/C,MAAM,UAAU,GAAe;gBAC7B,UAAU,EAAE;oBACV,kBAAkB,EAAE,IAAI;oBACxB,OAAO,EAAE,aAAa;iBACvB;aACF,CAAC;YAEF,MAAM,QAAQ,GAAG;gBACf,mBAAmB,EAAE,IAAI;gBACzB,WAAW,EAAE,cAAc;aAC5B,CAAC;YAEF,MAAM,MAAM,GAAG,WAAW,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;YAEjD,MAAM,CAAC,MAAM,CAAC,UAAU,EAAE,kBAAkB,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACzD,MAAM,CAAC,MAAM,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;YACvD,MAAM,CAAC,MAAM,CAAC,UAAU,EAAE,mBAAmB,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAC1D,MAAM,CAAC,MAAM,CAAC,UAAU,EAAE,WAAW,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;QAC9D,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,iEAAiE,EAAE,GAAG,EAAE;YACzE,MAAM,UAAU,GAAe;gBAC7B,QAAQ,EAAE;oBACR,uBAAuB,EAAE,IAAI;oBAC7B,oBAAoB,EAAE;wBACpB,MAAM,EAAE,cAAc;qBACvB;iBACF;aACF,CAAC;YAEF,MAAM,QAAQ,GAAG;gBACf,gBAAgB,EAAE,gBAAgB;gBAClC,QAAQ,EAAE,WAAW;aACtB,CAAC;YAEF,MAAM,MAAM,GAAG,WAAW,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;YAEjD,MAAM,CAAC,MAAM,CAAC,QAAQ,EAAE,uBAAuB,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAC5D,MAAM,CAAC,MAAM,CAAC,QAAQ,EAAE,oBAAoB,EAAE,MAAM,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;YAC3E,MAAM,CAAC,MAAM,CAAC,QAAQ,EAAE,oBAAoB,EAAE,cAAc,CAAC,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;YACrF,MAAM,CAAC,MAAM,CAAC,QAAQ,EAAE,oBAAoB,EAAE,MAAM,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QAC1E,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,2DAA2D,EAAE,GAAG,EAAE;YACnE,MAAM,UAAU,GAAe;gBAC7B,QAAQ,EAAE;oBACR,oBAAoB,EAAE,IAAI;oBAC1B,cAAc,EAAE;wBACd,2BAA2B,EAAE,8CAA8C;qBAC5E;iBACF;aACF,CAAC;YAEF,MAAM,QAAQ,GAAG;gBACf,aAAa,EAAE,yCAAyC;aACzD,CAAC;YAEF,MAAM,MAAM,GAAG,WAAW,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;YAEjD,MAAM,CAAC,MAAM,CAAC,QAAQ,EAAE,oBAAoB,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACzD,MAAM,CAAC,MAAM,CAAC,QAAQ,EAAE,cAAc,EAAE,2BAA2B,CAAC,CAAC,IAAI,CACvE,8CAA8C,CAC/C,CAAC;YACF,MAAM,CAAC,MAAM,CAAC,QAAQ,EAAE,cAAc,EAAE,cAAc,CAAC,CAAC,IAAI,CAC1D,yCAAyC,CAC1C,CAAC;QACJ,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,gCAAgC,EAAE,GAAG,EAAE;YACxC,MAAM,UAAU,GAAe;gBAC7B,GAAG,EAAE;oBACH,gBAAgB,EAAE,iBAAiB;oBACnC,YAAY,EAAE,gBAAgB;iBAC/B;aACF,CAAC;YAEF,MAAM,QAAQ,GAAG;gBACf,iBAAiB,EAAE,uDAAuD;gBAC1E,aAAa,EAAE,uDAAuD;aACvE,CAAC;YAEF,MAAM,MAAM,GAAG,WAAW,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;YAEjD,MAAM,CAAC,MAAM,CAAC,GAAG,EAAE,gBAAgB,CAAC,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;YAC7D,MAAM,CAAC,MAAM,CAAC,GAAG,EAAE,YAAY,CAAC,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;YACxD,MAAM,CAAC,MAAM,CAAC,GAAG,EAAE,iBAAiB,CAAC,CAAC,IAAI,CAAC,uDAAuD,CAAC,CAAC;YACpG,MAAM,CAAC,MAAM,CAAC,GAAG,EAAE,oBAAoB,CAAC,CAAC,IAAI,CAAC,uDAAuD,CAAC,CAAC;QACzG,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,4BAA4B,EAAE,GAAG,EAAE;YACpC,MAAM,UAAU,GAAe;gBAC7B,QAAQ,EAAE;oBACR,wBAAwB,EAAE,IAAI;iBAC/B;aACF,CAAC;YAEF,MAAM,QAAQ,GAAG;gBACf,yBAAyB,EAAE,IAAI;gBAC/B,YAAY,EAAE,KAAK;aACpB,CAAC;YAEF,MAAM,MAAM,GAAG,WAAW,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;YAEjD,MAAM,CAAC,MAAM,CAAC,QAAQ,EAAE,wBAAwB,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAC7D,MAAM,CAAC,MAAM,CAAC,QAAQ,EAAE,+BAA+B,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACpE,MAAM,CAAC,MAAM,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACpD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,qCAAqC,EAAE,GAAG,EAAE;YAC7C,MAAM,UAAU,GAAe;gBAC7B,QAAQ,EAAE;oBACR,iBAAiB,EAAE,YAAY;iBAChC;aACF,CAAC;YAEF,MAAM,QAAQ,GAAG;gBACf,aAAa,EAAE,eAAe;gBAC9B,YAAY,EAAE,iBAAiB;aAChC,CAAC;YAEF,MAAM,MAAM,GAAG,WAAW,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;YAEjD,MAAM,CAAC,MAAM,CAAC,QAAQ,EAAE,iBAAiB,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;YAC9D,MAAM,CAAC,MAAM,CAAC,QAAQ,EAAE,aAAa,CAAC,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;YAC7D,MAAM,CAAC,MAAM,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;QAChE,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,gCAAgC,EAAE,GAAG,EAAE;YACxC,MAAM,UAAU,GAAe;gBAC7B,GAAG,EAAE;oBACH,QAAQ,EAAE;wBACR,mBAAmB,EAAE,2CAA2C;qBACjE;iBACF;aACF,CAAC;YAEF,MAAM,QAAQ,GAAG;gBACf,eAAe,EAAE,6CAA6C;gBAC9D,iBAAiB,EAAE,SAAS;gBAC5B,iBAAiB,EAAE,SAAS;aAC7B,CAAC;YAEF,MAAM,MAAM,GAAG,WAAW,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;YAEjD,MAAM,CAAC,MAAM,CAAC,GAAG,EAAE,QAAQ,EAAE,mBAAmB,CAAC,CAAC,IAAI,CAAC,2CAA2C,CAAC,CAAC;YACpG,MAAM,CAAC,MAAM,CAAC,GAAG,EAAE,QAAQ,EAAE,YAAY,CAAC,CAAC,IAAI,CAAC,6CAA6C,CAAC,CAAC;YAC/F,MAAM,CAAC,MAAM,CAAC,GAAG,EAAE,SAAS,EAAE,KAAK,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YACrD,MAAM,CAAC,MAAM,CAAC,GAAG,EAAE,SAAS,EAAE,KAAK,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QACvD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,6DAA6D,EAAE,GAAG,EAAE;YACrE,MAAM,QAAQ,GAAG;gBACf,YAAY,EAAE,OAAO,EAAE,gBAAgB;aACxC,CAAC;YAEF,MAAM,CAAC,GAAG,EAAE,CAAC,WAAW,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,mBAAmB,CAAC,CAAC;QAC9E,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,2DAA2D,EAAE,GAAG,EAAE;YACnE,MAAM,QAAQ,GAAG;gBACf,eAAe,EAAE,aAAa;aAC/B,CAAC;YAEF,MAAM,CAAC,GAAG,EAAE,CAAC,WAAW,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,mBAAmB,CAAC,CAAC;QAC9E,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,wDAAwD,EAAE,GAAG,EAAE;YAChE,MAAM,QAAQ,GAAG;gBACf,iBAAiB,EAAE,uDAAuD,EAAE,eAAe;aAC5F,CAAC;YAEF,MAAM,CAAC,GAAG,EAAE,CAAC,WAAW,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,6BAA6B,CAAC,CAAC;QACxF,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,yDAAyD,EAAE,GAAG,EAAE;YACjE,MAAM,QAAQ,GAAG;gBACf,iBAAiB,EAAE,uDAAuD;aAC3E,CAAC;YAEF,MAAM,CAAC,GAAG,EAAE,CAAC,WAAW,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC;QAC/D,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,+CAA+C,EAAE,GAAG,EAAE;YACvD,MAAM,QAAQ,GAAG;gBACf,YAAY,EAAE,iBAAiB;aAChC,CAAC;YAEF,MAAM,CAAC,GAAG,EAAE,CAAC,WAAW,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,mBAAmB,CAAC,CAAC;QAC9E,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,4DAA4D,EAAE,GAAG,EAAE;YACpE,MAAM,UAAU,GAAe;gBAC7B,YAAY,EAAE,cAAc;aAC7B,CAAC;YAEF,MAAM,MAAM,GAAG,WAAW,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;YAE3C,MAAM,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;QACnD,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,qBAAqB,EAAE,GAAG,EAAE;QACnC,EAAE,CAAC,0CAA0C,EAAE,KAAK,IAAI,EAAE;YACxD,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,UAAU,CAAC,CAAC;YAC1C,MAAM,MAAM,GAAG,CAAC,SAAS,EAAE,SAAS,EAAE,SAAS,CAAC,CAAC;YAEjD,MAAM,UAAU,GAAG,EAAE,CAAC,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,kBAAkB,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;YAEzE,mBAAmB,CAAC,MAAM,CAAC,CAAC;YAE5B,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,oBAAoB,CAAC,uCAAuC,CAAC,CAAC;YACrF,MAAM,CAAC,UAAU,CAAC,CAAC,gBAAgB,EAAE,CAAC;YAEtC,UAAU,CAAC,WAAW,EAAE,CAAC;QAC3B,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,mBAAmB,EAAE,GAAG,EAAE;QACjC,EAAE,CAAC,8CAA8C,EAAE,GAAG,EAAE;YACtD,MAAM,OAAO,GAAG,EAAE,MAAM,EAAE,aAAa,EAAE,CAAC;YAC1C,MAAM,CAAC,iBAAiB,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;QACzD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,kDAAkD,EAAE,GAAG,EAAE;YAC1D,MAAM,OAAO,GAAG,EAAE,UAAU,EAAE,aAAa,EAAE,CAAC;YAC9C,MAAM,CAAC,iBAAiB,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;QACzD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,sCAAsC,EAAE,GAAG,EAAE;YAC9C,MAAM,OAAO,GAAG,EAAE,MAAM,EAAE,cAAc,EAAE,UAAU,EAAE,cAAc,EAAE,CAAC;YACvE,MAAM,CAAC,iBAAiB,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;QAC1D,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,sDAAsD,EAAE,GAAG,EAAE;YAC9D,MAAM,OAAO,GAAG,EAAE,CAAC;YACnB,MAAM,CAAC,iBAAiB,CAAC,OAAO,CAAC,CAAC,CAAC,aAAa,EAAE,CAAC;QACrD,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=github.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"github.test.d.ts","sourceRoot":"","sources":["../../../src/utils/__tests__/github.test.ts"],"names":[],"mappings":""}