@sembix/cli 1.1.0 → 1.2.1
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/.env.example +7 -0
- package/README.md +161 -8
- package/dist/__tests__/config-schema.test.js +1 -1
- package/dist/__tests__/config.test.d.ts +2 -0
- package/dist/__tests__/config.test.d.ts.map +1 -0
- package/dist/__tests__/config.test.js +75 -0
- package/dist/__tests__/config.test.js.map +1 -0
- package/dist/__tests__/integration/configure.test.d.ts +2 -0
- package/dist/__tests__/integration/configure.test.d.ts.map +1 -0
- package/dist/__tests__/integration/configure.test.js +247 -0
- package/dist/__tests__/integration/configure.test.js.map +1 -0
- package/dist/commands/__tests__/configure.test.d.ts +2 -0
- package/dist/commands/__tests__/configure.test.d.ts.map +1 -0
- package/dist/commands/__tests__/configure.test.js +229 -0
- package/dist/commands/__tests__/configure.test.js.map +1 -0
- package/dist/commands/configure.d.ts +6 -0
- package/dist/commands/configure.d.ts.map +1 -0
- package/dist/commands/configure.js +90 -0
- package/dist/commands/configure.js.map +1 -0
- package/dist/config-schema.d.ts +31 -335
- package/dist/config-schema.d.ts.map +1 -1
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +19 -3
- package/dist/config.js.map +1 -1
- package/dist/index.js +17 -0
- package/dist/index.js.map +1 -1
- package/dist/prompts/__tests__/environment-setup.test.d.ts +2 -0
- package/dist/prompts/__tests__/environment-setup.test.d.ts.map +1 -0
- package/dist/prompts/__tests__/environment-setup.test.js +206 -0
- package/dist/prompts/__tests__/environment-setup.test.js.map +1 -0
- package/dist/prompts/__tests__/hub-integration.test.d.ts +2 -0
- package/dist/prompts/__tests__/hub-integration.test.d.ts.map +1 -0
- package/dist/prompts/__tests__/hub-integration.test.js +126 -0
- package/dist/prompts/__tests__/hub-integration.test.js.map +1 -0
- package/dist/prompts/hub-integration-step.js +3 -3
- package/dist/prompts/hub-integration.js +3 -3
- package/dist/sembix-cli-1.2.1.tgz +0 -0
- package/dist/utils/__tests__/config-file.test.d.ts +2 -0
- package/dist/utils/__tests__/config-file.test.d.ts.map +1 -0
- package/dist/utils/__tests__/config-file.test.js +218 -0
- package/dist/utils/__tests__/config-file.test.js.map +1 -0
- package/dist/utils/config-file.d.ts +23 -0
- package/dist/utils/config-file.d.ts.map +1 -0
- package/dist/utils/config-file.js +100 -0
- package/dist/utils/config-file.js.map +1 -0
- package/dist/utils/config-loader.js +7 -7
- package/package.json +24 -24
- package/dist/sembix-cli-1.1.0.tgz +0 -0
|
@@ -0,0 +1,229 @@
|
|
|
1
|
+
import { describe, it, expect, vi, beforeEach } from 'vitest';
|
|
2
|
+
import { configureCommand } from '../configure.js';
|
|
3
|
+
import * as configFile from '../../utils/config-file.js';
|
|
4
|
+
import * as prompts from '@inquirer/prompts';
|
|
5
|
+
// Mock dependencies
|
|
6
|
+
vi.mock('../../utils/config-file.js');
|
|
7
|
+
vi.mock('@inquirer/prompts');
|
|
8
|
+
// Mock chalk to avoid ANSI codes in tests
|
|
9
|
+
const createChalkMock = () => {
|
|
10
|
+
const mockFn = (str) => str;
|
|
11
|
+
return new Proxy(mockFn, {
|
|
12
|
+
get: () => createChalkMock(),
|
|
13
|
+
apply: (target, thisArg, args) => args[0],
|
|
14
|
+
});
|
|
15
|
+
};
|
|
16
|
+
vi.mock('chalk', () => ({
|
|
17
|
+
default: createChalkMock(),
|
|
18
|
+
}));
|
|
19
|
+
// Mock ui utilities
|
|
20
|
+
vi.mock('../../utils/ui.js', () => ({
|
|
21
|
+
banner: vi.fn(),
|
|
22
|
+
highlight: vi.fn((text) => text),
|
|
23
|
+
dim: vi.fn((text) => text),
|
|
24
|
+
success: vi.fn(),
|
|
25
|
+
spinner: vi.fn(() => ({ stop: vi.fn() })),
|
|
26
|
+
}));
|
|
27
|
+
const mockReadConfig = vi.mocked(configFile.readConfig);
|
|
28
|
+
const mockWriteConfig = vi.mocked(configFile.writeConfig);
|
|
29
|
+
const mockGetConfigPath = vi.mocked(configFile.getConfigPath);
|
|
30
|
+
const mockConfigExists = vi.mocked(configFile.configExists);
|
|
31
|
+
const mockPassword = vi.mocked(prompts.password);
|
|
32
|
+
const mockInput = vi.mocked(prompts.input);
|
|
33
|
+
const mockConfirm = vi.mocked(prompts.confirm);
|
|
34
|
+
describe('configure command', () => {
|
|
35
|
+
beforeEach(() => {
|
|
36
|
+
vi.clearAllMocks();
|
|
37
|
+
mockGetConfigPath.mockReturnValue('/home/testuser/.sembix/config');
|
|
38
|
+
});
|
|
39
|
+
describe('configureCommand - new configuration', () => {
|
|
40
|
+
it('should create new config with token and org', async () => {
|
|
41
|
+
mockConfigExists.mockReturnValue(false);
|
|
42
|
+
mockReadConfig.mockResolvedValue({});
|
|
43
|
+
mockPassword.mockResolvedValue('ghp_newtokenvalue');
|
|
44
|
+
mockInput.mockResolvedValue('acme-corp');
|
|
45
|
+
mockWriteConfig.mockResolvedValue(undefined);
|
|
46
|
+
await configureCommand();
|
|
47
|
+
expect(mockPassword).toHaveBeenCalledWith(expect.objectContaining({
|
|
48
|
+
message: 'GitHub Personal Access Token:',
|
|
49
|
+
}));
|
|
50
|
+
expect(mockInput).toHaveBeenCalledWith(expect.objectContaining({
|
|
51
|
+
message: 'Default GitHub Organization (optional):',
|
|
52
|
+
}));
|
|
53
|
+
expect(mockWriteConfig).toHaveBeenCalledWith({
|
|
54
|
+
github_token: 'ghp_newtokenvalue',
|
|
55
|
+
default_github_org: 'acme-corp',
|
|
56
|
+
});
|
|
57
|
+
});
|
|
58
|
+
it('should create config with token only when org is empty', async () => {
|
|
59
|
+
mockConfigExists.mockReturnValue(false);
|
|
60
|
+
mockReadConfig.mockResolvedValue({});
|
|
61
|
+
mockPassword.mockResolvedValue('ghp_newtokenvalue');
|
|
62
|
+
mockInput.mockResolvedValue('');
|
|
63
|
+
mockWriteConfig.mockResolvedValue(undefined);
|
|
64
|
+
await configureCommand();
|
|
65
|
+
expect(mockWriteConfig).toHaveBeenCalledWith({
|
|
66
|
+
github_token: 'ghp_newtokenvalue',
|
|
67
|
+
default_github_org: undefined,
|
|
68
|
+
});
|
|
69
|
+
});
|
|
70
|
+
it('should trim whitespace from inputs', async () => {
|
|
71
|
+
mockConfigExists.mockReturnValue(false);
|
|
72
|
+
mockReadConfig.mockResolvedValue({});
|
|
73
|
+
mockPassword.mockResolvedValue(' ghp_newtokenvalue ');
|
|
74
|
+
mockInput.mockResolvedValue(' acme-corp ');
|
|
75
|
+
mockWriteConfig.mockResolvedValue(undefined);
|
|
76
|
+
await configureCommand();
|
|
77
|
+
expect(mockWriteConfig).toHaveBeenCalledWith({
|
|
78
|
+
github_token: 'ghp_newtokenvalue',
|
|
79
|
+
default_github_org: 'acme-corp',
|
|
80
|
+
});
|
|
81
|
+
});
|
|
82
|
+
});
|
|
83
|
+
describe('configureCommand - updating existing configuration', () => {
|
|
84
|
+
it('should show existing token and allow keeping it', async () => {
|
|
85
|
+
mockConfigExists.mockReturnValue(true);
|
|
86
|
+
mockReadConfig.mockResolvedValue({
|
|
87
|
+
github_token: 'ghp_existingtoken',
|
|
88
|
+
default_github_org: 'old-org',
|
|
89
|
+
});
|
|
90
|
+
mockConfirm.mockResolvedValue(true); // Keep existing
|
|
91
|
+
mockInput.mockResolvedValue('new-org');
|
|
92
|
+
mockWriteConfig.mockResolvedValue(undefined);
|
|
93
|
+
await configureCommand();
|
|
94
|
+
expect(mockConfirm).toHaveBeenCalledWith(expect.objectContaining({
|
|
95
|
+
message: 'Keep existing token?',
|
|
96
|
+
default: true,
|
|
97
|
+
}));
|
|
98
|
+
expect(mockWriteConfig).toHaveBeenCalledWith({
|
|
99
|
+
github_token: 'ghp_existingtoken',
|
|
100
|
+
default_github_org: 'new-org',
|
|
101
|
+
});
|
|
102
|
+
});
|
|
103
|
+
it('should allow replacing existing token', async () => {
|
|
104
|
+
mockConfigExists.mockReturnValue(true);
|
|
105
|
+
mockReadConfig.mockResolvedValue({
|
|
106
|
+
github_token: 'ghp_existingtoken',
|
|
107
|
+
default_github_org: 'old-org',
|
|
108
|
+
});
|
|
109
|
+
mockConfirm.mockResolvedValue(false); // Replace token
|
|
110
|
+
mockPassword.mockResolvedValue('ghp_newtoken');
|
|
111
|
+
mockInput.mockResolvedValue('new-org');
|
|
112
|
+
mockWriteConfig.mockResolvedValue(undefined);
|
|
113
|
+
await configureCommand();
|
|
114
|
+
expect(mockPassword).toHaveBeenCalled();
|
|
115
|
+
expect(mockWriteConfig).toHaveBeenCalledWith({
|
|
116
|
+
github_token: 'ghp_newtoken',
|
|
117
|
+
default_github_org: 'new-org',
|
|
118
|
+
});
|
|
119
|
+
});
|
|
120
|
+
it('should prompt for new token when no existing token', async () => {
|
|
121
|
+
mockConfigExists.mockReturnValue(true);
|
|
122
|
+
mockReadConfig.mockResolvedValue({
|
|
123
|
+
default_github_org: 'old-org',
|
|
124
|
+
});
|
|
125
|
+
mockPassword.mockResolvedValue('ghp_newtoken');
|
|
126
|
+
mockInput.mockResolvedValue('old-org');
|
|
127
|
+
mockWriteConfig.mockResolvedValue(undefined);
|
|
128
|
+
await configureCommand();
|
|
129
|
+
expect(mockConfirm).not.toHaveBeenCalled();
|
|
130
|
+
expect(mockPassword).toHaveBeenCalled();
|
|
131
|
+
expect(mockWriteConfig).toHaveBeenCalledWith({
|
|
132
|
+
github_token: 'ghp_newtoken',
|
|
133
|
+
default_github_org: 'old-org',
|
|
134
|
+
});
|
|
135
|
+
});
|
|
136
|
+
});
|
|
137
|
+
describe('configureCommand - validation', () => {
|
|
138
|
+
it('should validate token starts with ghp_ (new config)', async () => {
|
|
139
|
+
mockConfigExists.mockReturnValue(false);
|
|
140
|
+
mockReadConfig.mockResolvedValue({});
|
|
141
|
+
mockPassword.mockResolvedValue('ghp_validtoken');
|
|
142
|
+
mockInput.mockResolvedValue('');
|
|
143
|
+
mockWriteConfig.mockResolvedValue(undefined);
|
|
144
|
+
await configureCommand();
|
|
145
|
+
const validateFn = mockPassword.mock.calls[0][0].validate;
|
|
146
|
+
expect(validateFn).toBeDefined();
|
|
147
|
+
if (validateFn) {
|
|
148
|
+
expect(validateFn('ghp_test123')).toBe(true);
|
|
149
|
+
expect(validateFn('github_pat_test123')).toBe(true);
|
|
150
|
+
expect(validateFn('invalid_token')).toBe('Token should start with ghp_ or github_pat_');
|
|
151
|
+
expect(validateFn('')).toBe('GitHub token is required');
|
|
152
|
+
expect(validateFn(' ')).toBe('GitHub token is required');
|
|
153
|
+
}
|
|
154
|
+
});
|
|
155
|
+
it('should validate token when replacing existing token', async () => {
|
|
156
|
+
mockConfigExists.mockReturnValue(true);
|
|
157
|
+
mockReadConfig.mockResolvedValue({
|
|
158
|
+
github_token: 'ghp_oldtoken',
|
|
159
|
+
});
|
|
160
|
+
mockConfirm.mockResolvedValue(false); // Replace token
|
|
161
|
+
mockPassword.mockResolvedValue('ghp_newtoken');
|
|
162
|
+
mockInput.mockResolvedValue('');
|
|
163
|
+
mockWriteConfig.mockResolvedValue(undefined);
|
|
164
|
+
await configureCommand();
|
|
165
|
+
// Should have validation function on the password call for replacement
|
|
166
|
+
const passwordCalls = mockPassword.mock.calls;
|
|
167
|
+
const validateFn = passwordCalls[0][0].validate;
|
|
168
|
+
expect(validateFn).toBeDefined();
|
|
169
|
+
if (validateFn) {
|
|
170
|
+
expect(validateFn('ghp_test456')).toBe(true);
|
|
171
|
+
expect(validateFn('github_pat_test789')).toBe(true);
|
|
172
|
+
expect(validateFn('bad_token')).toBe('Token should start with ghp_ or github_pat_');
|
|
173
|
+
expect(validateFn('')).toBe('GitHub token is required');
|
|
174
|
+
}
|
|
175
|
+
});
|
|
176
|
+
});
|
|
177
|
+
describe('configureCommand - error handling', () => {
|
|
178
|
+
it('should throw error when write fails', async () => {
|
|
179
|
+
mockConfigExists.mockReturnValue(false);
|
|
180
|
+
mockReadConfig.mockResolvedValue({});
|
|
181
|
+
mockPassword.mockResolvedValue('ghp_newtokenvalue');
|
|
182
|
+
mockInput.mockResolvedValue('acme-corp');
|
|
183
|
+
mockWriteConfig.mockRejectedValue(new Error('Permission denied'));
|
|
184
|
+
await expect(configureCommand()).rejects.toThrow('Failed to save configuration: Permission denied');
|
|
185
|
+
});
|
|
186
|
+
it('should handle read config errors gracefully', async () => {
|
|
187
|
+
mockConfigExists.mockReturnValue(true);
|
|
188
|
+
// readConfig catches errors internally and returns empty object
|
|
189
|
+
mockReadConfig.mockResolvedValue({});
|
|
190
|
+
mockPassword.mockResolvedValue('ghp_newtokenvalue');
|
|
191
|
+
mockInput.mockResolvedValue('acme-corp');
|
|
192
|
+
mockWriteConfig.mockResolvedValue(undefined);
|
|
193
|
+
// Should not throw, should treat as no existing config
|
|
194
|
+
await configureCommand();
|
|
195
|
+
expect(mockWriteConfig).toHaveBeenCalledWith({
|
|
196
|
+
github_token: 'ghp_newtokenvalue',
|
|
197
|
+
default_github_org: 'acme-corp',
|
|
198
|
+
});
|
|
199
|
+
});
|
|
200
|
+
});
|
|
201
|
+
describe('configureCommand - default values', () => {
|
|
202
|
+
it('should use existing org as default for input prompt', async () => {
|
|
203
|
+
mockConfigExists.mockReturnValue(true);
|
|
204
|
+
mockReadConfig.mockResolvedValue({
|
|
205
|
+
github_token: 'ghp_existingtoken',
|
|
206
|
+
default_github_org: 'existing-org',
|
|
207
|
+
});
|
|
208
|
+
mockConfirm.mockResolvedValue(true);
|
|
209
|
+
mockInput.mockResolvedValue('existing-org');
|
|
210
|
+
mockWriteConfig.mockResolvedValue(undefined);
|
|
211
|
+
await configureCommand();
|
|
212
|
+
expect(mockInput).toHaveBeenCalledWith(expect.objectContaining({
|
|
213
|
+
default: 'existing-org',
|
|
214
|
+
}));
|
|
215
|
+
});
|
|
216
|
+
it('should use empty string as default when no existing org', async () => {
|
|
217
|
+
mockConfigExists.mockReturnValue(false);
|
|
218
|
+
mockReadConfig.mockResolvedValue({});
|
|
219
|
+
mockPassword.mockResolvedValue('ghp_newtoken');
|
|
220
|
+
mockInput.mockResolvedValue('');
|
|
221
|
+
mockWriteConfig.mockResolvedValue(undefined);
|
|
222
|
+
await configureCommand();
|
|
223
|
+
expect(mockInput).toHaveBeenCalledWith(expect.objectContaining({
|
|
224
|
+
default: '',
|
|
225
|
+
}));
|
|
226
|
+
});
|
|
227
|
+
});
|
|
228
|
+
});
|
|
229
|
+
//# sourceMappingURL=configure.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"configure.test.js","sourceRoot":"","sources":["../../../src/commands/__tests__/configure.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"configure.d.ts","sourceRoot":"","sources":["../../src/commands/configure.ts"],"names":[],"mappings":"AAIA;;;GAGG;AACH,wBAAsB,gBAAgB,IAAI,OAAO,CAAC,IAAI,CAAC,CAsFtD"}
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
import { input, password, confirm } from '@inquirer/prompts';
|
|
2
|
+
import { writeConfig, readConfig, getConfigPath, configExists } from '../utils/config-file.js';
|
|
3
|
+
import * as ui from '../utils/ui.js';
|
|
4
|
+
/**
|
|
5
|
+
* Interactive configuration wizard
|
|
6
|
+
* Mimics AWS CLI's 'aws configure' command
|
|
7
|
+
*/
|
|
8
|
+
export async function configureCommand() {
|
|
9
|
+
ui.banner();
|
|
10
|
+
console.log(` ${ui.highlight('Configure Sembix CLI')}`);
|
|
11
|
+
console.log();
|
|
12
|
+
console.log(ui.dim('This will store your configuration in:'));
|
|
13
|
+
console.log(ui.dim(` ${getConfigPath()}`));
|
|
14
|
+
console.log();
|
|
15
|
+
// Check if config already exists
|
|
16
|
+
const existingConfig = await readConfig();
|
|
17
|
+
const hasExistingConfig = configExists();
|
|
18
|
+
if (hasExistingConfig) {
|
|
19
|
+
console.log(ui.dim('Existing configuration found. Press Enter to keep current values.'));
|
|
20
|
+
console.log();
|
|
21
|
+
}
|
|
22
|
+
// Prompt for GitHub token
|
|
23
|
+
let githubToken;
|
|
24
|
+
if (existingConfig.github_token) {
|
|
25
|
+
console.log(ui.dim(`Current token: ${existingConfig.github_token.substring(0, 10)}...`));
|
|
26
|
+
const useExisting = await confirm({
|
|
27
|
+
message: 'Keep existing token?',
|
|
28
|
+
default: true,
|
|
29
|
+
});
|
|
30
|
+
if (useExisting) {
|
|
31
|
+
githubToken = existingConfig.github_token;
|
|
32
|
+
}
|
|
33
|
+
else {
|
|
34
|
+
githubToken = await password({
|
|
35
|
+
message: 'GitHub Personal Access Token:',
|
|
36
|
+
mask: '*',
|
|
37
|
+
validate: (value) => {
|
|
38
|
+
if (!value || value.trim() === '') {
|
|
39
|
+
return 'GitHub token is required';
|
|
40
|
+
}
|
|
41
|
+
if (!value.startsWith('ghp_') && !value.startsWith('github_pat_')) {
|
|
42
|
+
return 'Token should start with ghp_ or github_pat_';
|
|
43
|
+
}
|
|
44
|
+
return true;
|
|
45
|
+
},
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
else {
|
|
50
|
+
githubToken = await password({
|
|
51
|
+
message: 'GitHub Personal Access Token:',
|
|
52
|
+
mask: '*',
|
|
53
|
+
validate: (value) => {
|
|
54
|
+
if (!value || value.trim() === '') {
|
|
55
|
+
return 'GitHub token is required';
|
|
56
|
+
}
|
|
57
|
+
if (!value.startsWith('ghp_') && !value.startsWith('github_pat_')) {
|
|
58
|
+
return 'Token should start with ghp_ or github_pat_';
|
|
59
|
+
}
|
|
60
|
+
return true;
|
|
61
|
+
},
|
|
62
|
+
});
|
|
63
|
+
}
|
|
64
|
+
// Prompt for default GitHub org (optional)
|
|
65
|
+
const defaultOrg = await input({
|
|
66
|
+
message: 'Default GitHub Organization (optional):',
|
|
67
|
+
default: existingConfig.default_github_org || '',
|
|
68
|
+
});
|
|
69
|
+
// Save configuration
|
|
70
|
+
const spinner = ui.spinner('Saving configuration...');
|
|
71
|
+
try {
|
|
72
|
+
await writeConfig({
|
|
73
|
+
github_token: githubToken.trim(),
|
|
74
|
+
default_github_org: defaultOrg.trim() || undefined,
|
|
75
|
+
});
|
|
76
|
+
spinner.stop();
|
|
77
|
+
console.log();
|
|
78
|
+
ui.success('Configuration saved successfully!');
|
|
79
|
+
console.log();
|
|
80
|
+
console.log(ui.dim('Your credentials are stored securely in:'));
|
|
81
|
+
console.log(` ${ui.highlight(getConfigPath())}`);
|
|
82
|
+
console.log();
|
|
83
|
+
console.log(ui.dim('You can now run Sembix commands without the --token flag.'));
|
|
84
|
+
}
|
|
85
|
+
catch (error) {
|
|
86
|
+
spinner.stop();
|
|
87
|
+
throw new Error(`Failed to save configuration: ${error.message}`);
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
//# sourceMappingURL=configure.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"configure.js","sourceRoot":"","sources":["../../src/commands/configure.ts"],"names":[],"mappings":"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"}
|