envmatic 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +567 -0
- package/dist/cli.d.ts +7 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +203 -0
- package/dist/cli.js.map +1 -0
- package/dist/commands/add.d.ts +11 -0
- package/dist/commands/add.d.ts.map +1 -0
- package/dist/commands/add.js +77 -0
- package/dist/commands/add.js.map +1 -0
- package/dist/commands/delete.d.ts +6 -0
- package/dist/commands/delete.d.ts.map +1 -0
- package/dist/commands/delete.js +78 -0
- package/dist/commands/delete.js.map +1 -0
- package/dist/commands/edit.d.ts +13 -0
- package/dist/commands/edit.d.ts.map +1 -0
- package/dist/commands/edit.js +364 -0
- package/dist/commands/edit.js.map +1 -0
- package/dist/commands/import.d.ts +11 -0
- package/dist/commands/import.d.ts.map +1 -0
- package/dist/commands/import.js +103 -0
- package/dist/commands/import.js.map +1 -0
- package/dist/commands/init.d.ts +8 -0
- package/dist/commands/init.d.ts.map +1 -0
- package/dist/commands/init.js +237 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/link.d.ts +16 -0
- package/dist/commands/link.d.ts.map +1 -0
- package/dist/commands/link.js +157 -0
- package/dist/commands/link.js.map +1 -0
- package/dist/commands/list.d.ts +9 -0
- package/dist/commands/list.d.ts.map +1 -0
- package/dist/commands/list.js +73 -0
- package/dist/commands/list.js.map +1 -0
- package/dist/commands/lock.d.ts +16 -0
- package/dist/commands/lock.d.ts.map +1 -0
- package/dist/commands/lock.js +245 -0
- package/dist/commands/lock.js.map +1 -0
- package/dist/commands/rotate.d.ts +15 -0
- package/dist/commands/rotate.d.ts.map +1 -0
- package/dist/commands/rotate.js +406 -0
- package/dist/commands/rotate.js.map +1 -0
- package/dist/commands/show.d.ts +9 -0
- package/dist/commands/show.d.ts.map +1 -0
- package/dist/commands/show.js +72 -0
- package/dist/commands/show.js.map +1 -0
- package/dist/commands/sync.d.ts +13 -0
- package/dist/commands/sync.d.ts.map +1 -0
- package/dist/commands/sync.js +174 -0
- package/dist/commands/sync.js.map +1 -0
- package/dist/commands/use.d.ts +19 -0
- package/dist/commands/use.d.ts.map +1 -0
- package/dist/commands/use.js +238 -0
- package/dist/commands/use.js.map +1 -0
- package/dist/constants.d.ts +20 -0
- package/dist/constants.d.ts.map +1 -0
- package/dist/constants.js +47 -0
- package/dist/constants.js.map +1 -0
- package/dist/index.d.ts +15 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +21 -0
- package/dist/index.js.map +1 -0
- package/dist/services/config.d.ts +64 -0
- package/dist/services/config.d.ts.map +1 -0
- package/dist/services/config.js +133 -0
- package/dist/services/config.js.map +1 -0
- package/dist/services/encryption.d.ts +30 -0
- package/dist/services/encryption.d.ts.map +1 -0
- package/dist/services/encryption.js +146 -0
- package/dist/services/encryption.js.map +1 -0
- package/dist/services/envfile.d.ts +76 -0
- package/dist/services/envfile.d.ts.map +1 -0
- package/dist/services/envfile.js +247 -0
- package/dist/services/envfile.js.map +1 -0
- package/dist/services/git.d.ts +60 -0
- package/dist/services/git.d.ts.map +1 -0
- package/dist/services/git.js +239 -0
- package/dist/services/git.js.map +1 -0
- package/dist/services/linker.d.ts +46 -0
- package/dist/services/linker.d.ts.map +1 -0
- package/dist/services/linker.js +222 -0
- package/dist/services/linker.js.map +1 -0
- package/dist/services/protection.d.ts +32 -0
- package/dist/services/protection.d.ts.map +1 -0
- package/dist/services/protection.js +190 -0
- package/dist/services/protection.js.map +1 -0
- package/dist/types/index.d.ts +73 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +5 -0
- package/dist/types/index.js.map +1 -0
- package/dist/utils/display.d.ts +74 -0
- package/dist/utils/display.d.ts.map +1 -0
- package/dist/utils/display.js +138 -0
- package/dist/utils/display.js.map +1 -0
- package/dist/utils/editor.d.ts +22 -0
- package/dist/utils/editor.d.ts.map +1 -0
- package/dist/utils/editor.js +159 -0
- package/dist/utils/editor.js.map +1 -0
- package/dist/utils/prompts.d.ts +41 -0
- package/dist/utils/prompts.d.ts.map +1 -0
- package/dist/utils/prompts.js +222 -0
- package/dist/utils/prompts.js.map +1 -0
- package/package.json +69 -0
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Display Utilities
|
|
3
|
+
* Console styling and formatting for CLI output
|
|
4
|
+
*/
|
|
5
|
+
import chalk from 'chalk';
|
|
6
|
+
import { BRAND } from '../constants.js';
|
|
7
|
+
/**
|
|
8
|
+
* Brand colors
|
|
9
|
+
*/
|
|
10
|
+
export const colors = {
|
|
11
|
+
primary: chalk.hex('#7C3AED'), // Purple
|
|
12
|
+
secondary: chalk.hex('#10B981'), // Emerald
|
|
13
|
+
accent: chalk.hex('#F59E0B'), // Amber
|
|
14
|
+
muted: chalk.gray,
|
|
15
|
+
error: chalk.hex('#EF4444'),
|
|
16
|
+
success: chalk.hex('#10B981'),
|
|
17
|
+
warning: chalk.hex('#F59E0B'),
|
|
18
|
+
info: chalk.hex('#3B82F6'),
|
|
19
|
+
};
|
|
20
|
+
/**
|
|
21
|
+
* Print the envmatic banner
|
|
22
|
+
*/
|
|
23
|
+
export function printBanner() {
|
|
24
|
+
console.log();
|
|
25
|
+
console.log(colors.primary.bold(` ${BRAND.prefix} ${BRAND.name}`));
|
|
26
|
+
console.log(colors.muted(` ${BRAND.tagline}`));
|
|
27
|
+
console.log();
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Print a success message
|
|
31
|
+
*/
|
|
32
|
+
export function success(message) {
|
|
33
|
+
console.log(colors.success(`${BRAND.prefix} ${message}`));
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Print an error message
|
|
37
|
+
*/
|
|
38
|
+
export function error(message) {
|
|
39
|
+
console.log(colors.error(`✖ ${message}`));
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Print a warning message
|
|
43
|
+
*/
|
|
44
|
+
export function warning(message) {
|
|
45
|
+
console.log(colors.warning(`⚠ ${message}`));
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Print an info message
|
|
49
|
+
*/
|
|
50
|
+
export function info(message) {
|
|
51
|
+
console.log(colors.info(`ℹ ${message}`));
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Print a dimmed/muted message
|
|
55
|
+
*/
|
|
56
|
+
export function dim(message) {
|
|
57
|
+
console.log(colors.muted(message));
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Print a key-value pair
|
|
61
|
+
*/
|
|
62
|
+
export function keyValue(key, value, indent = 0) {
|
|
63
|
+
const spaces = ' '.repeat(indent);
|
|
64
|
+
console.log(`${spaces}${colors.muted(key + ':')} ${value}`);
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Print a table header
|
|
68
|
+
*/
|
|
69
|
+
export function tableHeader(...columns) {
|
|
70
|
+
console.log(colors.muted(columns.join(' ')));
|
|
71
|
+
console.log(colors.muted('─'.repeat(60)));
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Print a tree item
|
|
75
|
+
*/
|
|
76
|
+
export function treeItem(label, isLast = false, depth = 0) {
|
|
77
|
+
const indent = ' '.repeat(depth);
|
|
78
|
+
const connector = isLast ? '└─' : '├─';
|
|
79
|
+
console.log(`${indent}${colors.muted(connector)} ${label}`);
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Format a file ID for display
|
|
83
|
+
*/
|
|
84
|
+
export function formatFileId(fileId) {
|
|
85
|
+
const parts = fileId.split('/');
|
|
86
|
+
if (parts.length >= 3) {
|
|
87
|
+
const [project, env, ...rest] = parts;
|
|
88
|
+
return `${colors.primary(project)}${colors.muted('/')}${colors.secondary(env)}${colors.muted('/')}${rest.join('/')}`;
|
|
89
|
+
}
|
|
90
|
+
return fileId;
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* Format a date for display
|
|
94
|
+
*/
|
|
95
|
+
export function formatDate(isoDate) {
|
|
96
|
+
const date = new Date(isoDate);
|
|
97
|
+
return date.toLocaleDateString() + ' ' + date.toLocaleTimeString();
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* Format bytes for display
|
|
101
|
+
*/
|
|
102
|
+
export function formatBytes(bytes) {
|
|
103
|
+
if (bytes === 0)
|
|
104
|
+
return '0 B';
|
|
105
|
+
const k = 1024;
|
|
106
|
+
const sizes = ['B', 'KB', 'MB', 'GB'];
|
|
107
|
+
const i = Math.floor(Math.log(bytes) / Math.log(k));
|
|
108
|
+
return parseFloat((bytes / Math.pow(k, i)).toFixed(2)) + ' ' + sizes[i];
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* Create a box around text
|
|
112
|
+
*/
|
|
113
|
+
export function box(lines, title) {
|
|
114
|
+
const maxLength = Math.max(...lines.map(l => l.length), (title?.length || 0) + 4);
|
|
115
|
+
const width = maxLength + 4;
|
|
116
|
+
const top = title
|
|
117
|
+
? `╭─ ${title} ${'─'.repeat(width - title.length - 5)}╮`
|
|
118
|
+
: `╭${'─'.repeat(width - 2)}╮`;
|
|
119
|
+
console.log(colors.muted(top));
|
|
120
|
+
for (const line of lines) {
|
|
121
|
+
const padding = ' '.repeat(width - line.length - 4);
|
|
122
|
+
console.log(colors.muted('│') + ` ${line}${padding} ` + colors.muted('│'));
|
|
123
|
+
}
|
|
124
|
+
console.log(colors.muted(`╰${'─'.repeat(width - 2)}╯`));
|
|
125
|
+
}
|
|
126
|
+
/**
|
|
127
|
+
* Mask sensitive values
|
|
128
|
+
*/
|
|
129
|
+
export function maskValue(value, showChars = 4) {
|
|
130
|
+
if (value.length <= showChars * 2) {
|
|
131
|
+
return '*'.repeat(value.length);
|
|
132
|
+
}
|
|
133
|
+
const start = value.substring(0, showChars);
|
|
134
|
+
const end = value.substring(value.length - showChars);
|
|
135
|
+
const middle = '*'.repeat(Math.min(value.length - showChars * 2, 8));
|
|
136
|
+
return start + middle + end;
|
|
137
|
+
}
|
|
138
|
+
//# sourceMappingURL=display.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"display.js","sourceRoot":"","sources":["../../src/utils/display.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Editor Utilities
|
|
3
|
+
* Detection and launching of external editors
|
|
4
|
+
*/
|
|
5
|
+
export interface EditorInfo {
|
|
6
|
+
name: string;
|
|
7
|
+
command: string;
|
|
8
|
+
available: boolean;
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Detect available editors on the system
|
|
12
|
+
*/
|
|
13
|
+
export declare function detectEditors(): Promise<EditorInfo[]>;
|
|
14
|
+
/**
|
|
15
|
+
* Open a file in an external editor and wait for it to close
|
|
16
|
+
*/
|
|
17
|
+
export declare function openInEditor(filePath: string, editorCommand: string): Promise<void>;
|
|
18
|
+
/**
|
|
19
|
+
* Check if an editor is a terminal-based editor
|
|
20
|
+
*/
|
|
21
|
+
export declare function isTerminalEditor(editorCommand: string): boolean;
|
|
22
|
+
//# sourceMappingURL=editor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"editor.d.ts","sourceRoot":"","sources":["../../src/utils/editor.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAQH,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,OAAO,CAAC;CACpB;AAwBD;;GAEG;AACH,wBAAsB,aAAa,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC,CAoG3D;AAED;;GAEG;AACH,wBAAsB,YAAY,CAAC,QAAQ,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CA8BzF;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,aAAa,EAAE,MAAM,GAAG,OAAO,CAG/D"}
|
|
@@ -0,0 +1,159 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Editor Utilities
|
|
3
|
+
* Detection and launching of external editors
|
|
4
|
+
*/
|
|
5
|
+
import { exec, spawn } from 'child_process';
|
|
6
|
+
import { promisify } from 'util';
|
|
7
|
+
import os from 'os';
|
|
8
|
+
const execAsync = promisify(exec);
|
|
9
|
+
/**
|
|
10
|
+
* Check if a command exists in PATH
|
|
11
|
+
*/
|
|
12
|
+
async function commandExists(command) {
|
|
13
|
+
try {
|
|
14
|
+
const isWindows = os.platform() === 'win32';
|
|
15
|
+
const checkCmd = isWindows ? `where ${command}` : `which ${command}`;
|
|
16
|
+
await execAsync(checkCmd);
|
|
17
|
+
return true;
|
|
18
|
+
}
|
|
19
|
+
catch {
|
|
20
|
+
return false;
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Get the system default editor
|
|
25
|
+
*/
|
|
26
|
+
function getSystemEditor() {
|
|
27
|
+
// Check common environment variables
|
|
28
|
+
return process.env.VISUAL || process.env.EDITOR;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Detect available editors on the system
|
|
32
|
+
*/
|
|
33
|
+
export async function detectEditors() {
|
|
34
|
+
const isWindows = os.platform() === 'win32';
|
|
35
|
+
const isMac = os.platform() === 'darwin';
|
|
36
|
+
const editors = [];
|
|
37
|
+
// System default editor
|
|
38
|
+
const systemEditor = getSystemEditor();
|
|
39
|
+
if (systemEditor) {
|
|
40
|
+
editors.push({
|
|
41
|
+
name: `System Default (${systemEditor})`,
|
|
42
|
+
command: systemEditor,
|
|
43
|
+
available: true,
|
|
44
|
+
});
|
|
45
|
+
}
|
|
46
|
+
// Neovim
|
|
47
|
+
if (await commandExists('nvim')) {
|
|
48
|
+
editors.push({
|
|
49
|
+
name: 'Neovim',
|
|
50
|
+
command: 'nvim',
|
|
51
|
+
available: true,
|
|
52
|
+
});
|
|
53
|
+
}
|
|
54
|
+
// Vim
|
|
55
|
+
if (await commandExists('vim')) {
|
|
56
|
+
editors.push({
|
|
57
|
+
name: 'Vim',
|
|
58
|
+
command: 'vim',
|
|
59
|
+
available: true,
|
|
60
|
+
});
|
|
61
|
+
}
|
|
62
|
+
// VS Code
|
|
63
|
+
if (await commandExists('code')) {
|
|
64
|
+
editors.push({
|
|
65
|
+
name: 'VS Code',
|
|
66
|
+
command: 'code --wait',
|
|
67
|
+
available: true,
|
|
68
|
+
});
|
|
69
|
+
}
|
|
70
|
+
// Platform-specific editors
|
|
71
|
+
if (isWindows) {
|
|
72
|
+
// Notepad is always available on Windows
|
|
73
|
+
editors.push({
|
|
74
|
+
name: 'Notepad',
|
|
75
|
+
command: 'notepad',
|
|
76
|
+
available: true,
|
|
77
|
+
});
|
|
78
|
+
// Notepad++
|
|
79
|
+
if (await commandExists('notepad++')) {
|
|
80
|
+
editors.push({
|
|
81
|
+
name: 'Notepad++',
|
|
82
|
+
command: 'notepad++',
|
|
83
|
+
available: true,
|
|
84
|
+
});
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
if (isMac) {
|
|
88
|
+
// nano is usually available
|
|
89
|
+
if (await commandExists('nano')) {
|
|
90
|
+
editors.push({
|
|
91
|
+
name: 'Nano',
|
|
92
|
+
command: 'nano',
|
|
93
|
+
available: true,
|
|
94
|
+
});
|
|
95
|
+
}
|
|
96
|
+
// TextEdit via open command
|
|
97
|
+
editors.push({
|
|
98
|
+
name: 'TextEdit',
|
|
99
|
+
command: 'open -e -W',
|
|
100
|
+
available: true,
|
|
101
|
+
});
|
|
102
|
+
}
|
|
103
|
+
// Linux common editors
|
|
104
|
+
if (!isWindows && !isMac) {
|
|
105
|
+
if (await commandExists('nano')) {
|
|
106
|
+
editors.push({
|
|
107
|
+
name: 'Nano',
|
|
108
|
+
command: 'nano',
|
|
109
|
+
available: true,
|
|
110
|
+
});
|
|
111
|
+
}
|
|
112
|
+
if (await commandExists('gedit')) {
|
|
113
|
+
editors.push({
|
|
114
|
+
name: 'Gedit',
|
|
115
|
+
command: 'gedit',
|
|
116
|
+
available: true,
|
|
117
|
+
});
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
return editors;
|
|
121
|
+
}
|
|
122
|
+
/**
|
|
123
|
+
* Open a file in an external editor and wait for it to close
|
|
124
|
+
*/
|
|
125
|
+
export async function openInEditor(filePath, editorCommand) {
|
|
126
|
+
return new Promise((resolve, reject) => {
|
|
127
|
+
const isWindows = os.platform() === 'win32';
|
|
128
|
+
// Parse command (handle commands with arguments like "code --wait")
|
|
129
|
+
const parts = editorCommand.split(' ');
|
|
130
|
+
const command = parts[0];
|
|
131
|
+
const args = [...parts.slice(1), filePath];
|
|
132
|
+
// For terminal-based editors (vim, nvim, nano), we need to inherit stdio
|
|
133
|
+
const isTerminalEditor = ['vim', 'nvim', 'nano', 'vi'].includes(command);
|
|
134
|
+
const child = spawn(command, args, {
|
|
135
|
+
stdio: isTerminalEditor ? 'inherit' : 'ignore',
|
|
136
|
+
shell: isWindows,
|
|
137
|
+
detached: false,
|
|
138
|
+
});
|
|
139
|
+
child.on('error', (err) => {
|
|
140
|
+
reject(new Error(`Failed to open editor: ${err.message}`));
|
|
141
|
+
});
|
|
142
|
+
child.on('close', (code) => {
|
|
143
|
+
if (code === 0 || code === null) {
|
|
144
|
+
resolve();
|
|
145
|
+
}
|
|
146
|
+
else {
|
|
147
|
+
reject(new Error(`Editor exited with code ${code}`));
|
|
148
|
+
}
|
|
149
|
+
});
|
|
150
|
+
});
|
|
151
|
+
}
|
|
152
|
+
/**
|
|
153
|
+
* Check if an editor is a terminal-based editor
|
|
154
|
+
*/
|
|
155
|
+
export function isTerminalEditor(editorCommand) {
|
|
156
|
+
const command = editorCommand.split(' ')[0];
|
|
157
|
+
return ['vim', 'nvim', 'nano', 'vi', 'emacs'].includes(command);
|
|
158
|
+
}
|
|
159
|
+
//# sourceMappingURL=editor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"editor.js","sourceRoot":"","sources":["../../src/utils/editor.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Prompt Utilities
|
|
3
|
+
* Interactive prompts for CLI
|
|
4
|
+
*/
|
|
5
|
+
import type { EncryptionOptions } from '../types/index.js';
|
|
6
|
+
/**
|
|
7
|
+
* Prompt for encryption password
|
|
8
|
+
*/
|
|
9
|
+
export declare function promptPassword(confirm?: boolean): Promise<string>;
|
|
10
|
+
/**
|
|
11
|
+
* Prompt for SSH key path
|
|
12
|
+
*/
|
|
13
|
+
export declare function promptSSHKey(): Promise<string>;
|
|
14
|
+
/**
|
|
15
|
+
* Get encryption options based on config and prompts
|
|
16
|
+
*/
|
|
17
|
+
export declare function getEncryptionOptions(): Promise<EncryptionOptions | undefined>;
|
|
18
|
+
/**
|
|
19
|
+
* Prompt for project name
|
|
20
|
+
*/
|
|
21
|
+
export declare function promptProject(existing?: string[]): Promise<string>;
|
|
22
|
+
/**
|
|
23
|
+
* Prompt for environment
|
|
24
|
+
*/
|
|
25
|
+
export declare function promptEnvironment(): Promise<string>;
|
|
26
|
+
/**
|
|
27
|
+
* Prompt for variable key-value pairs
|
|
28
|
+
*/
|
|
29
|
+
export declare function promptVariables(): Promise<Record<string, string>>;
|
|
30
|
+
/**
|
|
31
|
+
* Confirm action
|
|
32
|
+
*/
|
|
33
|
+
export declare function confirm(message: string, defaultValue?: boolean): Promise<boolean>;
|
|
34
|
+
/**
|
|
35
|
+
* Select from a list
|
|
36
|
+
*/
|
|
37
|
+
export declare function select<T>(message: string, choices: Array<{
|
|
38
|
+
name: string;
|
|
39
|
+
value: T;
|
|
40
|
+
}>): Promise<T>;
|
|
41
|
+
//# sourceMappingURL=prompts.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prompts.d.ts","sourceRoot":"","sources":["../../src/utils/prompts.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAE3D;;GAEG;AACH,wBAAsB,cAAc,CAAC,OAAO,GAAE,OAAe,GAAG,OAAO,CAAC,MAAM,CAAC,CAkC9E;AAED;;GAEG;AACH,wBAAsB,YAAY,IAAI,OAAO,CAAC,MAAM,CAAC,CAmBpD;AAED;;GAEG;AACH,wBAAsB,oBAAoB,IAAI,OAAO,CAAC,iBAAiB,GAAG,SAAS,CAAC,CAuBnF;AAED;;GAEG;AACH,wBAAsB,aAAa,CAAC,QAAQ,CAAC,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAsCxE;AAED;;GAEG;AACH,wBAAsB,iBAAiB,IAAI,OAAO,CAAC,MAAM,CAAC,CAqCzD;AAED;;GAEG;AACH,wBAAsB,eAAe,IAAI,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CA8BvE;AAED;;GAEG;AACH,wBAAsB,OAAO,CAAC,OAAO,EAAE,MAAM,EAAE,YAAY,GAAE,OAAe,GAAG,OAAO,CAAC,OAAO,CAAC,CAW9F;AAED;;GAEG;AACH,wBAAsB,MAAM,CAAC,CAAC,EAC5B,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,KAAK,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,CAAC,CAAA;CAAE,CAAC,GACzC,OAAO,CAAC,CAAC,CAAC,CAWZ"}
|
|
@@ -0,0 +1,222 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Prompt Utilities
|
|
3
|
+
* Interactive prompts for CLI
|
|
4
|
+
*/
|
|
5
|
+
import inquirer from 'inquirer';
|
|
6
|
+
import { getConfig } from '../services/config.js';
|
|
7
|
+
import { validateSSHKey } from '../services/encryption.js';
|
|
8
|
+
/**
|
|
9
|
+
* Prompt for encryption password
|
|
10
|
+
*/
|
|
11
|
+
export async function promptPassword(confirm = false) {
|
|
12
|
+
const { password } = await inquirer.prompt([
|
|
13
|
+
{
|
|
14
|
+
type: 'password',
|
|
15
|
+
name: 'password',
|
|
16
|
+
message: 'Enter your encryption password:',
|
|
17
|
+
mask: '*',
|
|
18
|
+
validate: (input) => {
|
|
19
|
+
if (!input || input.length < 8) {
|
|
20
|
+
return 'Password must be at least 8 characters';
|
|
21
|
+
}
|
|
22
|
+
return true;
|
|
23
|
+
},
|
|
24
|
+
},
|
|
25
|
+
]);
|
|
26
|
+
if (confirm) {
|
|
27
|
+
const { confirmPassword } = await inquirer.prompt([
|
|
28
|
+
{
|
|
29
|
+
type: 'password',
|
|
30
|
+
name: 'confirmPassword',
|
|
31
|
+
message: 'Confirm your password:',
|
|
32
|
+
mask: '*',
|
|
33
|
+
validate: (input) => {
|
|
34
|
+
if (input !== password) {
|
|
35
|
+
return 'Passwords do not match';
|
|
36
|
+
}
|
|
37
|
+
return true;
|
|
38
|
+
},
|
|
39
|
+
},
|
|
40
|
+
]);
|
|
41
|
+
}
|
|
42
|
+
return password;
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Prompt for SSH key path
|
|
46
|
+
*/
|
|
47
|
+
export async function promptSSHKey() {
|
|
48
|
+
const { sshKeyPath } = await inquirer.prompt([
|
|
49
|
+
{
|
|
50
|
+
type: 'input',
|
|
51
|
+
name: 'sshKeyPath',
|
|
52
|
+
message: 'Enter path to your SSH private key:',
|
|
53
|
+
default: '~/.ssh/id_rsa',
|
|
54
|
+
validate: async (input) => {
|
|
55
|
+
const expanded = input.replace(/^~/, process.env.HOME || '');
|
|
56
|
+
const valid = await validateSSHKey(expanded);
|
|
57
|
+
if (!valid) {
|
|
58
|
+
return 'Invalid SSH private key file';
|
|
59
|
+
}
|
|
60
|
+
return true;
|
|
61
|
+
},
|
|
62
|
+
},
|
|
63
|
+
]);
|
|
64
|
+
return sshKeyPath.replace(/^~/, process.env.HOME || '');
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Get encryption options based on config and prompts
|
|
68
|
+
*/
|
|
69
|
+
export async function getEncryptionOptions() {
|
|
70
|
+
const config = await getConfig();
|
|
71
|
+
if (!config || !config.encryptionEnabled) {
|
|
72
|
+
return undefined;
|
|
73
|
+
}
|
|
74
|
+
if (config.encryptionMethod === 'ssh' && config.sshKeyPath) {
|
|
75
|
+
return {
|
|
76
|
+
method: 'ssh',
|
|
77
|
+
sshKeyPath: config.sshKeyPath,
|
|
78
|
+
};
|
|
79
|
+
}
|
|
80
|
+
if (config.encryptionMethod === 'password') {
|
|
81
|
+
const password = await promptPassword();
|
|
82
|
+
return {
|
|
83
|
+
method: 'password',
|
|
84
|
+
password,
|
|
85
|
+
};
|
|
86
|
+
}
|
|
87
|
+
return undefined;
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Prompt for project name
|
|
91
|
+
*/
|
|
92
|
+
export async function promptProject(existing) {
|
|
93
|
+
if (existing && existing.length > 0) {
|
|
94
|
+
const { choice } = await inquirer.prompt([
|
|
95
|
+
{
|
|
96
|
+
type: 'list',
|
|
97
|
+
name: 'choice',
|
|
98
|
+
message: 'Select or create a project:',
|
|
99
|
+
choices: [
|
|
100
|
+
...existing.map(p => ({ name: p, value: p })),
|
|
101
|
+
new inquirer.Separator(),
|
|
102
|
+
{ name: '+ Create new project', value: '__new__' },
|
|
103
|
+
],
|
|
104
|
+
},
|
|
105
|
+
]);
|
|
106
|
+
if (choice !== '__new__') {
|
|
107
|
+
return choice;
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
const { project } = await inquirer.prompt([
|
|
111
|
+
{
|
|
112
|
+
type: 'input',
|
|
113
|
+
name: 'project',
|
|
114
|
+
message: 'Enter project name:',
|
|
115
|
+
validate: (input) => {
|
|
116
|
+
if (!input || input.trim().length === 0) {
|
|
117
|
+
return 'Project name is required';
|
|
118
|
+
}
|
|
119
|
+
if (!/^[a-zA-Z0-9_-]+$/.test(input)) {
|
|
120
|
+
return 'Project name can only contain letters, numbers, dashes, and underscores';
|
|
121
|
+
}
|
|
122
|
+
return true;
|
|
123
|
+
},
|
|
124
|
+
},
|
|
125
|
+
]);
|
|
126
|
+
return project;
|
|
127
|
+
}
|
|
128
|
+
/**
|
|
129
|
+
* Prompt for environment
|
|
130
|
+
*/
|
|
131
|
+
export async function promptEnvironment() {
|
|
132
|
+
const presets = ['development', 'staging', 'production', 'test', 'local', 'ci'];
|
|
133
|
+
const { environment } = await inquirer.prompt([
|
|
134
|
+
{
|
|
135
|
+
type: 'list',
|
|
136
|
+
name: 'environment',
|
|
137
|
+
message: 'Select environment:',
|
|
138
|
+
choices: [
|
|
139
|
+
...presets.map(e => ({ name: e, value: e })),
|
|
140
|
+
new inquirer.Separator(),
|
|
141
|
+
{ name: '+ Custom environment', value: '__custom__' },
|
|
142
|
+
],
|
|
143
|
+
},
|
|
144
|
+
]);
|
|
145
|
+
if (environment === '__custom__') {
|
|
146
|
+
const { customEnv } = await inquirer.prompt([
|
|
147
|
+
{
|
|
148
|
+
type: 'input',
|
|
149
|
+
name: 'customEnv',
|
|
150
|
+
message: 'Enter environment name:',
|
|
151
|
+
validate: (input) => {
|
|
152
|
+
if (!input || input.trim().length === 0) {
|
|
153
|
+
return 'Environment name is required';
|
|
154
|
+
}
|
|
155
|
+
if (!/^[a-zA-Z0-9_-]+$/.test(input)) {
|
|
156
|
+
return 'Environment name can only contain letters, numbers, dashes, and underscores';
|
|
157
|
+
}
|
|
158
|
+
return true;
|
|
159
|
+
},
|
|
160
|
+
},
|
|
161
|
+
]);
|
|
162
|
+
return customEnv;
|
|
163
|
+
}
|
|
164
|
+
return environment;
|
|
165
|
+
}
|
|
166
|
+
/**
|
|
167
|
+
* Prompt for variable key-value pairs
|
|
168
|
+
*/
|
|
169
|
+
export async function promptVariables() {
|
|
170
|
+
const variables = {};
|
|
171
|
+
console.log('\nEnter environment variables (empty key to finish):');
|
|
172
|
+
while (true) {
|
|
173
|
+
const { key } = await inquirer.prompt([
|
|
174
|
+
{
|
|
175
|
+
type: 'input',
|
|
176
|
+
name: 'key',
|
|
177
|
+
message: 'Variable name:',
|
|
178
|
+
},
|
|
179
|
+
]);
|
|
180
|
+
if (!key || key.trim().length === 0) {
|
|
181
|
+
break;
|
|
182
|
+
}
|
|
183
|
+
const { value } = await inquirer.prompt([
|
|
184
|
+
{
|
|
185
|
+
type: 'input',
|
|
186
|
+
name: 'value',
|
|
187
|
+
message: `Value for ${key}:`,
|
|
188
|
+
},
|
|
189
|
+
]);
|
|
190
|
+
variables[key.trim()] = value;
|
|
191
|
+
}
|
|
192
|
+
return variables;
|
|
193
|
+
}
|
|
194
|
+
/**
|
|
195
|
+
* Confirm action
|
|
196
|
+
*/
|
|
197
|
+
export async function confirm(message, defaultValue = false) {
|
|
198
|
+
const { confirmed } = await inquirer.prompt([
|
|
199
|
+
{
|
|
200
|
+
type: 'confirm',
|
|
201
|
+
name: 'confirmed',
|
|
202
|
+
message,
|
|
203
|
+
default: defaultValue,
|
|
204
|
+
},
|
|
205
|
+
]);
|
|
206
|
+
return confirmed;
|
|
207
|
+
}
|
|
208
|
+
/**
|
|
209
|
+
* Select from a list
|
|
210
|
+
*/
|
|
211
|
+
export async function select(message, choices) {
|
|
212
|
+
const { selected } = await inquirer.prompt([
|
|
213
|
+
{
|
|
214
|
+
type: 'list',
|
|
215
|
+
name: 'selected',
|
|
216
|
+
message,
|
|
217
|
+
choices,
|
|
218
|
+
},
|
|
219
|
+
]);
|
|
220
|
+
return selected;
|
|
221
|
+
}
|
|
222
|
+
//# sourceMappingURL=prompts.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prompts.js","sourceRoot":"","sources":["../../src/utils/prompts.ts"],"names":[],"mappings":"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"}
|