@fnd-platform/cli 1.0.0-alpha.24 → 1.0.0-alpha.25
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/lib/bin/fnd.js +101 -4
- package/lib/bin/fnd.js.map +1 -1
- package/lib/commands/add.js +72 -75
- package/lib/commands/add.js.map +1 -1
- package/lib/commands/build.js +29 -34
- package/lib/commands/build.js.map +1 -1
- package/lib/commands/deploy.d.ts +13 -5
- package/lib/commands/deploy.d.ts.map +1 -1
- package/lib/commands/deploy.js +94 -75
- package/lib/commands/deploy.js.map +1 -1
- package/lib/commands/destroy.js +33 -38
- package/lib/commands/destroy.js.map +1 -1
- package/lib/commands/index.d.ts +1 -0
- package/lib/commands/index.d.ts.map +1 -1
- package/lib/commands/index.js +7 -15
- package/lib/commands/index.js.map +1 -1
- package/lib/commands/new.js +46 -50
- package/lib/commands/new.js.map +1 -1
- package/lib/commands/synth.d.ts +8 -1
- package/lib/commands/synth.d.ts.map +1 -1
- package/lib/commands/synth.js +82 -22
- package/lib/commands/synth.js.map +1 -1
- package/lib/commands/test.d.ts +73 -0
- package/lib/commands/test.d.ts.map +1 -0
- package/lib/commands/test.js +193 -0
- package/lib/commands/test.js.map +1 -0
- package/lib/index.d.ts +11 -2
- package/lib/index.d.ts.map +1 -1
- package/lib/index.js +29 -18
- package/lib/index.js.map +1 -1
- package/lib/lib/deploy-utils.d.ts.map +1 -1
- package/lib/lib/deploy-utils.js +73 -72
- package/lib/lib/deploy-utils.js.map +1 -1
- package/lib/lib/infra-generator.js +55 -63
- package/lib/lib/infra-generator.js.map +1 -1
- package/lib/lib/logger.js +23 -29
- package/lib/lib/logger.js.map +1 -1
- package/lib/lib/nx-stats.js +12 -18
- package/lib/lib/nx-stats.js.map +1 -1
- package/lib/lib/project.js +7 -11
- package/lib/lib/project.js.map +1 -1
- package/lib/lib/templates.js +2 -6
- package/lib/lib/templates.js.map +1 -1
- package/lib/lib/timer.js +2 -7
- package/lib/lib/timer.js.map +1 -1
- package/lib/lib/validation.d.ts +135 -0
- package/lib/lib/validation.d.ts.map +1 -0
- package/lib/lib/validation.js +233 -0
- package/lib/lib/validation.js.map +1 -0
- package/lib/tui/App.d.ts +11 -0
- package/lib/tui/App.d.ts.map +1 -0
- package/lib/tui/App.js +98 -0
- package/lib/tui/App.js.map +1 -0
- package/lib/tui/components/branding/AsciiBanner.d.ts +21 -0
- package/lib/tui/components/branding/AsciiBanner.d.ts.map +1 -0
- package/lib/tui/components/branding/AsciiBanner.js +15 -0
- package/lib/tui/components/branding/AsciiBanner.js.map +1 -0
- package/lib/tui/components/branding/index.d.ts +5 -0
- package/lib/tui/components/branding/index.d.ts.map +1 -0
- package/lib/tui/components/branding/index.js +5 -0
- package/lib/tui/components/branding/index.js.map +1 -0
- package/lib/tui/components/feedback/Notification.d.ts +51 -0
- package/lib/tui/components/feedback/Notification.d.ts.map +1 -0
- package/lib/tui/components/feedback/Notification.js +89 -0
- package/lib/tui/components/feedback/Notification.js.map +1 -0
- package/lib/tui/components/feedback/ProgressBar.d.ts +46 -0
- package/lib/tui/components/feedback/ProgressBar.d.ts.map +1 -0
- package/lib/tui/components/feedback/ProgressBar.js +30 -0
- package/lib/tui/components/feedback/ProgressBar.js.map +1 -0
- package/lib/tui/components/feedback/ProgressSteps.d.ts +35 -0
- package/lib/tui/components/feedback/ProgressSteps.d.ts.map +1 -0
- package/lib/tui/components/feedback/ProgressSteps.js +37 -0
- package/lib/tui/components/feedback/ProgressSteps.js.map +1 -0
- package/lib/tui/components/feedback/Spinner.d.ts +18 -0
- package/lib/tui/components/feedback/Spinner.d.ts.map +1 -0
- package/lib/tui/components/feedback/Spinner.js +28 -0
- package/lib/tui/components/feedback/Spinner.js.map +1 -0
- package/lib/tui/components/feedback/index.d.ts +8 -0
- package/lib/tui/components/feedback/index.d.ts.map +1 -0
- package/lib/tui/components/feedback/index.js +8 -0
- package/lib/tui/components/feedback/index.js.map +1 -0
- package/lib/tui/components/index.d.ts +8 -0
- package/lib/tui/components/index.d.ts.map +1 -0
- package/lib/tui/components/index.js +8 -0
- package/lib/tui/components/index.js.map +1 -0
- package/lib/tui/components/input/Checkbox.d.ts +26 -0
- package/lib/tui/components/input/Checkbox.d.ts.map +1 -0
- package/lib/tui/components/input/Checkbox.js +20 -0
- package/lib/tui/components/input/Checkbox.js.map +1 -0
- package/lib/tui/components/input/SelectInput.d.ts +41 -0
- package/lib/tui/components/input/SelectInput.d.ts.map +1 -0
- package/lib/tui/components/input/SelectInput.js +53 -0
- package/lib/tui/components/input/SelectInput.js.map +1 -0
- package/lib/tui/components/input/TextInput.d.ts +30 -0
- package/lib/tui/components/input/TextInput.d.ts.map +1 -0
- package/lib/tui/components/input/TextInput.js +48 -0
- package/lib/tui/components/input/TextInput.js.map +1 -0
- package/lib/tui/components/input/index.d.ts +7 -0
- package/lib/tui/components/input/index.d.ts.map +1 -0
- package/lib/tui/components/input/index.js +7 -0
- package/lib/tui/components/input/index.js.map +1 -0
- package/lib/tui/components/layout/Breadcrumbs.d.ts +11 -0
- package/lib/tui/components/layout/Breadcrumbs.d.ts.map +1 -0
- package/lib/tui/components/layout/Breadcrumbs.js +34 -0
- package/lib/tui/components/layout/Breadcrumbs.js.map +1 -0
- package/lib/tui/components/layout/Footer.d.ts +11 -0
- package/lib/tui/components/layout/Footer.d.ts.map +1 -0
- package/lib/tui/components/layout/Footer.js +20 -0
- package/lib/tui/components/layout/Footer.js.map +1 -0
- package/lib/tui/components/layout/Header.d.ts +21 -0
- package/lib/tui/components/layout/Header.d.ts.map +1 -0
- package/lib/tui/components/layout/Header.js +21 -0
- package/lib/tui/components/layout/Header.js.map +1 -0
- package/lib/tui/components/layout/Screen.d.ts +27 -0
- package/lib/tui/components/layout/Screen.d.ts.map +1 -0
- package/lib/tui/components/layout/Screen.js +11 -0
- package/lib/tui/components/layout/Screen.js.map +1 -0
- package/lib/tui/components/layout/index.d.ts +8 -0
- package/lib/tui/components/layout/index.d.ts.map +1 -0
- package/lib/tui/components/layout/index.js +8 -0
- package/lib/tui/components/layout/index.js.map +1 -0
- package/lib/tui/hooks/index.d.ts +20 -0
- package/lib/tui/hooks/index.d.ts.map +1 -0
- package/lib/tui/hooks/index.js +18 -0
- package/lib/tui/hooks/index.js.map +1 -0
- package/lib/tui/hooks/useAddPackage.d.ts +120 -0
- package/lib/tui/hooks/useAddPackage.d.ts.map +1 -0
- package/lib/tui/hooks/useAddPackage.js +347 -0
- package/lib/tui/hooks/useAddPackage.js.map +1 -0
- package/lib/tui/hooks/useCreateProject.d.ts +66 -0
- package/lib/tui/hooks/useCreateProject.d.ts.map +1 -0
- package/lib/tui/hooks/useCreateProject.js +156 -0
- package/lib/tui/hooks/useCreateProject.js.map +1 -0
- package/lib/tui/hooks/useDeploy.d.ts +93 -0
- package/lib/tui/hooks/useDeploy.d.ts.map +1 -0
- package/lib/tui/hooks/useDeploy.js +252 -0
- package/lib/tui/hooks/useDeploy.js.map +1 -0
- package/lib/tui/hooks/useKeyboard.d.ts +66 -0
- package/lib/tui/hooks/useKeyboard.d.ts.map +1 -0
- package/lib/tui/hooks/useKeyboard.js +101 -0
- package/lib/tui/hooks/useKeyboard.js.map +1 -0
- package/lib/tui/hooks/useNavigation.d.ts +33 -0
- package/lib/tui/hooks/useNavigation.d.ts.map +1 -0
- package/lib/tui/hooks/useNavigation.js +27 -0
- package/lib/tui/hooks/useNavigation.js.map +1 -0
- package/lib/tui/hooks/useProject.d.ts +36 -0
- package/lib/tui/hooks/useProject.d.ts.map +1 -0
- package/lib/tui/hooks/useProject.js +47 -0
- package/lib/tui/hooks/useProject.js.map +1 -0
- package/lib/tui/index.d.ts +15 -0
- package/lib/tui/index.d.ts.map +1 -0
- package/lib/tui/index.js +16 -0
- package/lib/tui/index.js.map +1 -0
- package/lib/tui/lib/add-package-tui.d.ts +127 -0
- package/lib/tui/lib/add-package-tui.d.ts.map +1 -0
- package/lib/tui/lib/add-package-tui.js +467 -0
- package/lib/tui/lib/add-package-tui.js.map +1 -0
- package/lib/tui/lib/create-project-tui.d.ts +84 -0
- package/lib/tui/lib/create-project-tui.d.ts.map +1 -0
- package/lib/tui/lib/create-project-tui.js +141 -0
- package/lib/tui/lib/create-project-tui.js.map +1 -0
- package/lib/tui/lib/deploy-tui.d.ts +131 -0
- package/lib/tui/lib/deploy-tui.d.ts.map +1 -0
- package/lib/tui/lib/deploy-tui.js +347 -0
- package/lib/tui/lib/deploy-tui.js.map +1 -0
- package/lib/tui/screens/AddPackageScreen.d.ts +12 -0
- package/lib/tui/screens/AddPackageScreen.d.ts.map +1 -0
- package/lib/tui/screens/AddPackageScreen.js +436 -0
- package/lib/tui/screens/AddPackageScreen.js.map +1 -0
- package/lib/tui/screens/CreateProjectScreen.d.ts +12 -0
- package/lib/tui/screens/CreateProjectScreen.d.ts.map +1 -0
- package/lib/tui/screens/CreateProjectScreen.js +252 -0
- package/lib/tui/screens/CreateProjectScreen.js.map +1 -0
- package/lib/tui/screens/DeployScreen.d.ts +11 -0
- package/lib/tui/screens/DeployScreen.d.ts.map +1 -0
- package/lib/tui/screens/DeployScreen.js +224 -0
- package/lib/tui/screens/DeployScreen.js.map +1 -0
- package/lib/tui/screens/ProjectDashboard.d.ts +11 -0
- package/lib/tui/screens/ProjectDashboard.d.ts.map +1 -0
- package/lib/tui/screens/ProjectDashboard.js +42 -0
- package/lib/tui/screens/ProjectDashboard.js.map +1 -0
- package/lib/tui/screens/WelcomeScreen.d.ts +11 -0
- package/lib/tui/screens/WelcomeScreen.d.ts.map +1 -0
- package/lib/tui/screens/WelcomeScreen.js +26 -0
- package/lib/tui/screens/WelcomeScreen.js.map +1 -0
- package/lib/tui/screens/index.d.ts +9 -0
- package/lib/tui/screens/index.d.ts.map +1 -0
- package/lib/tui/screens/index.js +9 -0
- package/lib/tui/screens/index.js.map +1 -0
- package/lib/tui/services/ConfigService.d.ts +133 -0
- package/lib/tui/services/ConfigService.d.ts.map +1 -0
- package/lib/tui/services/ConfigService.js +221 -0
- package/lib/tui/services/ConfigService.js.map +1 -0
- package/lib/tui/services/ProjectService.d.ts +55 -0
- package/lib/tui/services/ProjectService.d.ts.map +1 -0
- package/lib/tui/services/ProjectService.js +179 -0
- package/lib/tui/services/ProjectService.js.map +1 -0
- package/lib/tui/services/index.d.ts +6 -0
- package/lib/tui/services/index.d.ts.map +1 -0
- package/lib/tui/services/index.js +6 -0
- package/lib/tui/services/index.js.map +1 -0
- package/lib/tui/state/AppContext.d.ts +58 -0
- package/lib/tui/state/AppContext.d.ts.map +1 -0
- package/lib/tui/state/AppContext.js +75 -0
- package/lib/tui/state/AppContext.js.map +1 -0
- package/lib/tui/state/index.d.ts +7 -0
- package/lib/tui/state/index.d.ts.map +1 -0
- package/lib/tui/state/index.js +7 -0
- package/lib/tui/state/index.js.map +1 -0
- package/lib/tui/state/reducer.d.ts +13 -0
- package/lib/tui/state/reducer.d.ts.map +1 -0
- package/lib/tui/state/reducer.js +136 -0
- package/lib/tui/state/reducer.js.map +1 -0
- package/lib/tui/state/types.d.ts +132 -0
- package/lib/tui/state/types.d.ts.map +1 -0
- package/lib/tui/state/types.js +38 -0
- package/lib/tui/state/types.js.map +1 -0
- package/lib/tui/utils/ascii.d.ts +42 -0
- package/lib/tui/utils/ascii.d.ts.map +1 -0
- package/lib/tui/utils/ascii.js +63 -0
- package/lib/tui/utils/ascii.js.map +1 -0
- package/lib/tui/utils/colors.d.ts +65 -0
- package/lib/tui/utils/colors.d.ts.map +1 -0
- package/lib/tui/utils/colors.js +65 -0
- package/lib/tui/utils/colors.js.map +1 -0
- package/lib/tui/utils/index.d.ts +6 -0
- package/lib/tui/utils/index.d.ts.map +1 -0
- package/lib/tui/utils/index.js +6 -0
- package/lib/tui/utils/index.js.map +1 -0
- package/package.json +12 -3
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* TUI-compatible project creation module.
|
|
3
|
+
*
|
|
4
|
+
* Adapted from the CLI new command to work with the TUI:
|
|
5
|
+
* - Does NOT call process.exit()
|
|
6
|
+
* - Reports progress via callback
|
|
7
|
+
* - Returns result object for handling by the UI
|
|
8
|
+
*/
|
|
9
|
+
import { execSync } from 'child_process';
|
|
10
|
+
import { existsSync, mkdirSync, readdirSync, rmSync, writeFileSync } from 'fs';
|
|
11
|
+
import { join, resolve } from 'path';
|
|
12
|
+
import { getProjenrcTemplate, getInitialPackageJson } from '../../lib/templates.js';
|
|
13
|
+
/**
|
|
14
|
+
* Valid project name pattern: lowercase alphanumeric with hyphens.
|
|
15
|
+
* Must start with a letter.
|
|
16
|
+
*/
|
|
17
|
+
export const PROJECT_NAME_PATTERN = /^[a-z][a-z0-9-]*$/;
|
|
18
|
+
/**
|
|
19
|
+
* Validates a project name.
|
|
20
|
+
*
|
|
21
|
+
* @param name - The project name to validate
|
|
22
|
+
* @returns Validation result with error message if invalid
|
|
23
|
+
*/
|
|
24
|
+
export function validateProjectName(name) {
|
|
25
|
+
if (!name || name.trim() === '') {
|
|
26
|
+
return { valid: false, error: 'Project name is required' };
|
|
27
|
+
}
|
|
28
|
+
if (name.length < 2) {
|
|
29
|
+
return { valid: false, error: 'Project name must be at least 2 characters' };
|
|
30
|
+
}
|
|
31
|
+
if (name.length > 50) {
|
|
32
|
+
return { valid: false, error: 'Project name must be 50 characters or less' };
|
|
33
|
+
}
|
|
34
|
+
if (!PROJECT_NAME_PATTERN.test(name)) {
|
|
35
|
+
return {
|
|
36
|
+
valid: false,
|
|
37
|
+
error: 'Name must start with a letter and contain only lowercase letters, numbers, and hyphens',
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
return { valid: true };
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Checks the status of a directory for project creation.
|
|
44
|
+
*
|
|
45
|
+
* @param name - The project name (directory name)
|
|
46
|
+
* @returns Directory status
|
|
47
|
+
*/
|
|
48
|
+
export function checkDirectory(name) {
|
|
49
|
+
const projectDir = resolve(process.cwd(), name);
|
|
50
|
+
if (!existsSync(projectDir)) {
|
|
51
|
+
return { exists: false, empty: true };
|
|
52
|
+
}
|
|
53
|
+
try {
|
|
54
|
+
const contents = readdirSync(projectDir);
|
|
55
|
+
return { exists: true, empty: contents.length === 0 };
|
|
56
|
+
}
|
|
57
|
+
catch {
|
|
58
|
+
return { exists: true, empty: false };
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Creates a project in TUI mode.
|
|
63
|
+
*
|
|
64
|
+
* Unlike the CLI version, this function:
|
|
65
|
+
* - Does NOT call process.exit()
|
|
66
|
+
* - Reports progress via callback
|
|
67
|
+
* - Cleans up on failure and returns error result
|
|
68
|
+
*
|
|
69
|
+
* @param options - Project creation options
|
|
70
|
+
* @param onProgress - Progress callback
|
|
71
|
+
* @returns Result indicating success or failure
|
|
72
|
+
*/
|
|
73
|
+
export async function createProjectForTUI(options, onProgress) {
|
|
74
|
+
const projectDir = resolve(process.cwd(), options.name);
|
|
75
|
+
// Validate name
|
|
76
|
+
const validation = validateProjectName(options.name);
|
|
77
|
+
if (!validation.valid) {
|
|
78
|
+
onProgress({ step: 'error', message: validation.error || 'Invalid project name' });
|
|
79
|
+
return { success: false, error: validation.error };
|
|
80
|
+
}
|
|
81
|
+
// Check directory
|
|
82
|
+
const dirStatus = checkDirectory(options.name);
|
|
83
|
+
if (dirStatus.exists && !dirStatus.empty) {
|
|
84
|
+
const error = `Directory '${options.name}' already exists and is not empty`;
|
|
85
|
+
onProgress({ step: 'error', message: error });
|
|
86
|
+
return { success: false, error };
|
|
87
|
+
}
|
|
88
|
+
try {
|
|
89
|
+
// Step 1: Create directory
|
|
90
|
+
onProgress({ step: 'creating-directory', message: 'Creating project directory...' });
|
|
91
|
+
if (!dirStatus.exists) {
|
|
92
|
+
mkdirSync(projectDir, { recursive: true });
|
|
93
|
+
}
|
|
94
|
+
// Step 2: Write files
|
|
95
|
+
onProgress({ step: 'writing-files', message: 'Writing project files...' });
|
|
96
|
+
writeFileSync(join(projectDir, '.projenrc.ts'), getProjenrcTemplate(options.name));
|
|
97
|
+
writeFileSync(join(projectDir, 'package.json'), JSON.stringify(getInitialPackageJson(options.name, options.packageManager), null, 2));
|
|
98
|
+
// Step 3: Initialize git (if requested)
|
|
99
|
+
if (options.git) {
|
|
100
|
+
onProgress({ step: 'initializing-git', message: 'Initializing git repository...' });
|
|
101
|
+
try {
|
|
102
|
+
execSync('git init', { cwd: projectDir, stdio: 'pipe' });
|
|
103
|
+
execSync('git add -A', { cwd: projectDir, stdio: 'pipe' });
|
|
104
|
+
execSync('git commit -m "Initial commit from fnd-platform"', {
|
|
105
|
+
cwd: projectDir,
|
|
106
|
+
stdio: 'pipe',
|
|
107
|
+
});
|
|
108
|
+
}
|
|
109
|
+
catch {
|
|
110
|
+
// Git init failure is non-fatal, continue
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
// Step 4: Install dependencies (if requested)
|
|
114
|
+
if (options.install) {
|
|
115
|
+
onProgress({ step: 'installing-deps', message: 'Installing dependencies...' });
|
|
116
|
+
const installCmd = options.packageManager === 'pnpm' ? 'pnpm install' : 'yarn install';
|
|
117
|
+
execSync(installCmd, { cwd: projectDir, stdio: 'pipe' });
|
|
118
|
+
// Step 5: Run Projen
|
|
119
|
+
onProgress({ step: 'running-projen', message: 'Running Projen synthesis...' });
|
|
120
|
+
execSync('npx tsx .projenrc.ts', { cwd: projectDir, stdio: 'pipe' });
|
|
121
|
+
}
|
|
122
|
+
// Complete
|
|
123
|
+
onProgress({ step: 'complete', message: 'Project created successfully!' });
|
|
124
|
+
return { success: true, projectPath: projectDir };
|
|
125
|
+
}
|
|
126
|
+
catch (error) {
|
|
127
|
+
const errorMessage = error instanceof Error ? error.message : 'Unknown error occurred';
|
|
128
|
+
// Clean up partial project on failure
|
|
129
|
+
if (existsSync(projectDir)) {
|
|
130
|
+
try {
|
|
131
|
+
rmSync(projectDir, { recursive: true, force: true });
|
|
132
|
+
}
|
|
133
|
+
catch {
|
|
134
|
+
// Ignore cleanup errors
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
onProgress({ step: 'error', message: errorMessage });
|
|
138
|
+
return { success: false, error: errorMessage };
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
//# sourceMappingURL=create-project-tui.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"create-project-tui.js","sourceRoot":"","sources":["../../../src/tui/lib/create-project-tui.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* TUI-compatible deployment module.
|
|
3
|
+
*
|
|
4
|
+
* Adapted from the CLI deploy command to work with the TUI:
|
|
5
|
+
* - Does NOT call process.exit()
|
|
6
|
+
* - Reports progress via callback
|
|
7
|
+
* - Streams CDK output in real-time
|
|
8
|
+
* - Returns result object for handling by the UI
|
|
9
|
+
*/
|
|
10
|
+
import { type StackOutputs } from '../../lib/deploy-utils.js';
|
|
11
|
+
export type { StackOutputs };
|
|
12
|
+
/**
|
|
13
|
+
* Deployment options.
|
|
14
|
+
*/
|
|
15
|
+
export interface DeployOptions {
|
|
16
|
+
/** Deployment stage */
|
|
17
|
+
stage: string;
|
|
18
|
+
/** Stacks to deploy (empty = all) */
|
|
19
|
+
stacks: string[];
|
|
20
|
+
/** CDK approval mode */
|
|
21
|
+
requireApproval: 'never' | 'any-change' | 'broadening';
|
|
22
|
+
/** Skip asset deployment */
|
|
23
|
+
skipAssets: boolean;
|
|
24
|
+
/** Skip building before asset deployment */
|
|
25
|
+
skipBuild: boolean;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Result of deployment.
|
|
29
|
+
*/
|
|
30
|
+
export interface DeployResult {
|
|
31
|
+
/** Whether deployment succeeded */
|
|
32
|
+
success: boolean;
|
|
33
|
+
/** Stack outputs (if successful) */
|
|
34
|
+
outputs?: StackOutputs;
|
|
35
|
+
/** Error message (if failed) */
|
|
36
|
+
error?: string;
|
|
37
|
+
/** Whether deployment partially succeeded */
|
|
38
|
+
partialSuccess?: boolean;
|
|
39
|
+
/** Stacks that were deployed successfully */
|
|
40
|
+
deployedStacks?: string[];
|
|
41
|
+
/** Stacks that failed to deploy */
|
|
42
|
+
failedStacks?: string[];
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Deployment phase identifiers.
|
|
46
|
+
*/
|
|
47
|
+
export type DeployPhase = 'idle' | 'validating' | 'building' | 'deploying-stacks' | 'deploying-assets' | 'complete' | 'error';
|
|
48
|
+
/**
|
|
49
|
+
* Progress update during deployment.
|
|
50
|
+
*/
|
|
51
|
+
export interface DeployProgress {
|
|
52
|
+
/** Current phase */
|
|
53
|
+
phase: DeployPhase;
|
|
54
|
+
/** Human-readable message */
|
|
55
|
+
message: string;
|
|
56
|
+
/** Current stack being deployed */
|
|
57
|
+
currentStack?: string;
|
|
58
|
+
/** Number of stacks completed */
|
|
59
|
+
stacksCompleted?: number;
|
|
60
|
+
/** Total number of stacks */
|
|
61
|
+
stacksTotal?: number;
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Stack information.
|
|
65
|
+
*/
|
|
66
|
+
export interface StackInfo {
|
|
67
|
+
/** Stack name */
|
|
68
|
+
name: string;
|
|
69
|
+
/** Stack display name (without prefix/suffix) */
|
|
70
|
+
displayName: string;
|
|
71
|
+
/** Stack type */
|
|
72
|
+
type: 'auth' | 'database' | 'media' | 'api' | 'frontend' | 'cms' | 'other';
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Detects available stacks from the infrastructure package.
|
|
76
|
+
*
|
|
77
|
+
* @param projectRoot - Project root directory
|
|
78
|
+
* @param stage - Deployment stage
|
|
79
|
+
* @returns Array of stack information
|
|
80
|
+
*/
|
|
81
|
+
export declare function detectAvailableStacks(projectRoot: string, stage: string): StackInfo[];
|
|
82
|
+
/**
|
|
83
|
+
* Validates the deployment environment.
|
|
84
|
+
*
|
|
85
|
+
* @param projectRoot - Project root directory
|
|
86
|
+
* @returns Validation result
|
|
87
|
+
*/
|
|
88
|
+
export declare function validateDeployment(projectRoot: string): {
|
|
89
|
+
valid: boolean;
|
|
90
|
+
error?: string;
|
|
91
|
+
};
|
|
92
|
+
/**
|
|
93
|
+
* Gets AWS account information.
|
|
94
|
+
*
|
|
95
|
+
* @returns AWS account ID and region
|
|
96
|
+
*/
|
|
97
|
+
export declare function getAwsInfo(): {
|
|
98
|
+
accountId: string;
|
|
99
|
+
region: string;
|
|
100
|
+
} | null;
|
|
101
|
+
/**
|
|
102
|
+
* Deploys infrastructure in TUI mode.
|
|
103
|
+
*
|
|
104
|
+
* Unlike the CLI version, this function:
|
|
105
|
+
* - Does NOT call process.exit()
|
|
106
|
+
* - Reports progress via callback
|
|
107
|
+
* - Streams CDK output via callback
|
|
108
|
+
* - Returns result object
|
|
109
|
+
*
|
|
110
|
+
* @param options - Deployment options
|
|
111
|
+
* @param onProgress - Progress callback
|
|
112
|
+
* @param onCdkOutput - CDK output line callback
|
|
113
|
+
* @returns Result indicating success or failure
|
|
114
|
+
*/
|
|
115
|
+
export declare function deployForTUI(options: DeployOptions, onProgress: (progress: DeployProgress) => void, onCdkOutput: (line: string) => void): Promise<DeployResult>;
|
|
116
|
+
/**
|
|
117
|
+
* Gets common deployment stages.
|
|
118
|
+
*/
|
|
119
|
+
export declare function getCommonStages(): string[];
|
|
120
|
+
/**
|
|
121
|
+
* Validates a stage name.
|
|
122
|
+
*/
|
|
123
|
+
export declare function validateStageName(stage: string): {
|
|
124
|
+
valid: boolean;
|
|
125
|
+
error?: string;
|
|
126
|
+
};
|
|
127
|
+
/**
|
|
128
|
+
* Gets the display label for a stack type.
|
|
129
|
+
*/
|
|
130
|
+
export declare function getStackTypeLabel(type: StackInfo['type']): string;
|
|
131
|
+
//# sourceMappingURL=deploy-tui.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"deploy-tui.d.ts","sourceRoot":"","sources":["../../../src/tui/lib/deploy-tui.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAMH,OAAO,EAUL,KAAK,YAAY,EAClB,MAAM,2BAA2B,CAAC;AAOnC,YAAY,EAAE,YAAY,EAAE,CAAC;AAE7B;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,uBAAuB;IACvB,KAAK,EAAE,MAAM,CAAC;IACd,qCAAqC;IACrC,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,wBAAwB;IACxB,eAAe,EAAE,OAAO,GAAG,YAAY,GAAG,YAAY,CAAC;IACvD,4BAA4B;IAC5B,UAAU,EAAE,OAAO,CAAC;IACpB,4CAA4C;IAC5C,SAAS,EAAE,OAAO,CAAC;CACpB;AAED;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,mCAAmC;IACnC,OAAO,EAAE,OAAO,CAAC;IACjB,oCAAoC;IACpC,OAAO,CAAC,EAAE,YAAY,CAAC;IACvB,gCAAgC;IAChC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,6CAA6C;IAC7C,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,6CAA6C;IAC7C,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAC1B,mCAAmC;IACnC,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;CACzB;AAED;;GAEG;AACH,MAAM,MAAM,WAAW,GACnB,MAAM,GACN,YAAY,GACZ,UAAU,GACV,kBAAkB,GAClB,kBAAkB,GAClB,UAAU,GACV,OAAO,CAAC;AAEZ;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,oBAAoB;IACpB,KAAK,EAAE,WAAW,CAAC;IACnB,6BAA6B;IAC7B,OAAO,EAAE,MAAM,CAAC;IAChB,mCAAmC;IACnC,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,iCAAiC;IACjC,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,6BAA6B;IAC7B,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED;;GAEG;AACH,MAAM,WAAW,SAAS;IACxB,iBAAiB;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,iDAAiD;IACjD,WAAW,EAAE,MAAM,CAAC;IACpB,iBAAiB;IACjB,IAAI,EAAE,MAAM,GAAG,UAAU,GAAG,OAAO,GAAG,KAAK,GAAG,UAAU,GAAG,KAAK,GAAG,OAAO,CAAC;CAC5E;AAED;;;;;;GAMG;AACH,wBAAgB,qBAAqB,CAAC,WAAW,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,SAAS,EAAE,CAqDrF;AAED;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,WAAW,EAAE,MAAM,GAAG;IAAE,KAAK,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAsB1F;AAED;;;;GAIG;AACH,wBAAgB,UAAU,IAAI;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAsBzE;AA+JD;;;;;;;;;;;;;GAaG;AACH,wBAAsB,YAAY,CAChC,OAAO,EAAE,aAAa,EACtB,UAAU,EAAE,CAAC,QAAQ,EAAE,cAAc,KAAK,IAAI,EAC9C,WAAW,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,GAClC,OAAO,CAAC,YAAY,CAAC,CAgEvB;AAED;;GAEG;AACH,wBAAgB,eAAe,IAAI,MAAM,EAAE,CAE1C;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,MAAM,GAAG;IAAE,KAAK,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAiBnF;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,SAAS,CAAC,MAAM,CAAC,GAAG,MAAM,CAWjE"}
|
|
@@ -0,0 +1,347 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* TUI-compatible deployment module.
|
|
3
|
+
*
|
|
4
|
+
* Adapted from the CLI deploy command to work with the TUI:
|
|
5
|
+
* - Does NOT call process.exit()
|
|
6
|
+
* - Reports progress via callback
|
|
7
|
+
* - Streams CDK output in real-time
|
|
8
|
+
* - Returns result object for handling by the UI
|
|
9
|
+
*/
|
|
10
|
+
import { spawn, execSync } from 'child_process';
|
|
11
|
+
import { existsSync, readdirSync } from 'fs';
|
|
12
|
+
import { join } from 'path';
|
|
13
|
+
import { findProjectRoot } from '../../lib/project.js';
|
|
14
|
+
import { getProjectName, toPascalCase, getStackOutputs, validateAwsCli, hasPackage, buildPackage, syncToS3, invalidateCloudFront, findBuildDirectory, } from '../../lib/deploy-utils.js';
|
|
15
|
+
import { validateStageName as validateStageNameStrict, validateStackName as validateStackNameStrict, } from '../../lib/validation.js';
|
|
16
|
+
/**
|
|
17
|
+
* Detects available stacks from the infrastructure package.
|
|
18
|
+
*
|
|
19
|
+
* @param projectRoot - Project root directory
|
|
20
|
+
* @param stage - Deployment stage
|
|
21
|
+
* @returns Array of stack information
|
|
22
|
+
*/
|
|
23
|
+
export function detectAvailableStacks(projectRoot, stage) {
|
|
24
|
+
const stacksDir = join(projectRoot, 'packages', 'infra', 'src', 'stacks');
|
|
25
|
+
if (!existsSync(stacksDir)) {
|
|
26
|
+
return [];
|
|
27
|
+
}
|
|
28
|
+
const projectName = getProjectName(projectRoot);
|
|
29
|
+
const pascalName = toPascalCase(projectName);
|
|
30
|
+
const stacks = [];
|
|
31
|
+
const files = readdirSync(stacksDir);
|
|
32
|
+
for (const file of files) {
|
|
33
|
+
if (file.endsWith('-stack.ts')) {
|
|
34
|
+
// Extract stack type from file (e.g., 'api-stack.ts' -> 'Api')
|
|
35
|
+
const stackType = file
|
|
36
|
+
.replace('-stack.ts', '')
|
|
37
|
+
.split('-')
|
|
38
|
+
.map((w) => w.charAt(0).toUpperCase() + w.slice(1))
|
|
39
|
+
.join('');
|
|
40
|
+
const fullName = `${pascalName}${stackType}Stack-${stage}`;
|
|
41
|
+
let type = 'other';
|
|
42
|
+
const lowerType = stackType.toLowerCase();
|
|
43
|
+
if (lowerType === 'auth')
|
|
44
|
+
type = 'auth';
|
|
45
|
+
else if (lowerType === 'database')
|
|
46
|
+
type = 'database';
|
|
47
|
+
else if (lowerType === 'media')
|
|
48
|
+
type = 'media';
|
|
49
|
+
else if (lowerType === 'api')
|
|
50
|
+
type = 'api';
|
|
51
|
+
else if (lowerType === 'frontend')
|
|
52
|
+
type = 'frontend';
|
|
53
|
+
else if (lowerType === 'cms')
|
|
54
|
+
type = 'cms';
|
|
55
|
+
stacks.push({
|
|
56
|
+
name: fullName,
|
|
57
|
+
displayName: stackType,
|
|
58
|
+
type,
|
|
59
|
+
});
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
// Sort stacks in deployment order
|
|
63
|
+
const order = {
|
|
64
|
+
auth: 1,
|
|
65
|
+
database: 2,
|
|
66
|
+
media: 3,
|
|
67
|
+
api: 4,
|
|
68
|
+
frontend: 5,
|
|
69
|
+
cms: 6,
|
|
70
|
+
other: 7,
|
|
71
|
+
};
|
|
72
|
+
return stacks.sort((a, b) => order[a.type] - order[b.type]);
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Validates the deployment environment.
|
|
76
|
+
*
|
|
77
|
+
* @param projectRoot - Project root directory
|
|
78
|
+
* @returns Validation result
|
|
79
|
+
*/
|
|
80
|
+
export function validateDeployment(projectRoot) {
|
|
81
|
+
// Check infra package exists
|
|
82
|
+
const infraDir = join(projectRoot, 'packages', 'infra');
|
|
83
|
+
if (!existsSync(infraDir)) {
|
|
84
|
+
return {
|
|
85
|
+
valid: false,
|
|
86
|
+
error: 'Infrastructure package not found at packages/infra. Run `fnd add api` to generate it.',
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
// Validate AWS CLI
|
|
90
|
+
try {
|
|
91
|
+
validateAwsCli();
|
|
92
|
+
}
|
|
93
|
+
catch (error) {
|
|
94
|
+
return {
|
|
95
|
+
valid: false,
|
|
96
|
+
error: error.message,
|
|
97
|
+
};
|
|
98
|
+
}
|
|
99
|
+
return { valid: true };
|
|
100
|
+
}
|
|
101
|
+
/**
|
|
102
|
+
* Gets AWS account information.
|
|
103
|
+
*
|
|
104
|
+
* @returns AWS account ID and region
|
|
105
|
+
*/
|
|
106
|
+
export function getAwsInfo() {
|
|
107
|
+
try {
|
|
108
|
+
const identity = execSync('aws sts get-caller-identity --output json', {
|
|
109
|
+
encoding: 'utf-8',
|
|
110
|
+
stdio: ['pipe', 'pipe', 'pipe'],
|
|
111
|
+
});
|
|
112
|
+
const parsed = JSON.parse(identity);
|
|
113
|
+
const accountId = parsed.Account || 'Unknown';
|
|
114
|
+
// Get region
|
|
115
|
+
const region = process.env.AWS_REGION ||
|
|
116
|
+
process.env.AWS_DEFAULT_REGION ||
|
|
117
|
+
execSync('aws configure get region', { encoding: 'utf-8', stdio: ['pipe', 'pipe', 'pipe'] })
|
|
118
|
+
.trim() ||
|
|
119
|
+
'us-east-1';
|
|
120
|
+
return { accountId, region };
|
|
121
|
+
}
|
|
122
|
+
catch {
|
|
123
|
+
return null;
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
/**
|
|
127
|
+
* Runs CDK deployment with streaming output.
|
|
128
|
+
*/
|
|
129
|
+
async function runCdkDeployStreaming(infraDir, stage, stacks, requireApproval, onProgress, onCdkOutput) {
|
|
130
|
+
// Validate inputs to prevent command injection
|
|
131
|
+
validateStageNameStrict(stage);
|
|
132
|
+
stacks.forEach((s) => validateStackNameStrict(s));
|
|
133
|
+
return new Promise((resolve) => {
|
|
134
|
+
const args = ['exec', 'cdk', 'deploy'];
|
|
135
|
+
if (stacks.length > 0) {
|
|
136
|
+
// Deploy specific stacks
|
|
137
|
+
stacks.forEach((s) => args.push(`*${s}*`));
|
|
138
|
+
}
|
|
139
|
+
else {
|
|
140
|
+
args.push('--all');
|
|
141
|
+
}
|
|
142
|
+
args.push('-c', `stage=${stage}`);
|
|
143
|
+
args.push(`--require-approval=${requireApproval}`);
|
|
144
|
+
args.push('--progress=events'); // Better for parsing
|
|
145
|
+
// SECURITY: Do not use shell: true to prevent command injection
|
|
146
|
+
const cdkProcess = spawn('pnpm', args, {
|
|
147
|
+
cwd: infraDir,
|
|
148
|
+
env: { ...process.env, FORCE_COLOR: '1' },
|
|
149
|
+
});
|
|
150
|
+
let completedStacks = 0;
|
|
151
|
+
let currentStack = '';
|
|
152
|
+
let lastError = '';
|
|
153
|
+
const parseOutput = (data) => {
|
|
154
|
+
const text = data.toString();
|
|
155
|
+
const lines = text.split('\n');
|
|
156
|
+
for (const line of lines) {
|
|
157
|
+
if (!line.trim())
|
|
158
|
+
continue;
|
|
159
|
+
onCdkOutput(line);
|
|
160
|
+
// Parse for stack progress
|
|
161
|
+
// Pattern: "MyAppDatabaseStack-dev: creating CloudFormation changeset..."
|
|
162
|
+
const creatingMatch = line.match(/(\S+Stack-\w+):\s*creating/i);
|
|
163
|
+
if (creatingMatch) {
|
|
164
|
+
currentStack = creatingMatch[1];
|
|
165
|
+
onProgress({
|
|
166
|
+
phase: 'deploying-stacks',
|
|
167
|
+
message: `Deploying ${currentStack}...`,
|
|
168
|
+
currentStack,
|
|
169
|
+
stacksCompleted: completedStacks,
|
|
170
|
+
});
|
|
171
|
+
}
|
|
172
|
+
// Pattern: " ✅ MyAppDatabaseStack-dev"
|
|
173
|
+
const successMatch = line.match(/✅\s+(\S+Stack-\w+)/);
|
|
174
|
+
if (successMatch) {
|
|
175
|
+
completedStacks++;
|
|
176
|
+
currentStack = successMatch[1];
|
|
177
|
+
onProgress({
|
|
178
|
+
phase: 'deploying-stacks',
|
|
179
|
+
message: `Completed ${currentStack}`,
|
|
180
|
+
currentStack,
|
|
181
|
+
stacksCompleted: completedStacks,
|
|
182
|
+
});
|
|
183
|
+
}
|
|
184
|
+
// Pattern: "Stack MyAppDatabaseStack-dev has been destroyed"
|
|
185
|
+
if (line.includes('has been destroyed')) {
|
|
186
|
+
completedStacks++;
|
|
187
|
+
}
|
|
188
|
+
// Capture errors
|
|
189
|
+
if (line.includes('Error') || line.includes('FAILED') || line.includes('error:')) {
|
|
190
|
+
lastError = line;
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
};
|
|
194
|
+
cdkProcess.stdout.on('data', parseOutput);
|
|
195
|
+
cdkProcess.stderr.on('data', parseOutput);
|
|
196
|
+
cdkProcess.on('close', (code) => {
|
|
197
|
+
if (code === 0) {
|
|
198
|
+
resolve({ success: true });
|
|
199
|
+
}
|
|
200
|
+
else {
|
|
201
|
+
resolve({
|
|
202
|
+
success: false,
|
|
203
|
+
error: lastError || `CDK deployment failed with exit code ${code}`,
|
|
204
|
+
});
|
|
205
|
+
}
|
|
206
|
+
});
|
|
207
|
+
cdkProcess.on('error', (error) => {
|
|
208
|
+
resolve({ success: false, error: error.message });
|
|
209
|
+
});
|
|
210
|
+
});
|
|
211
|
+
}
|
|
212
|
+
/**
|
|
213
|
+
* Deploys static assets to S3 (for non-SSR deployments).
|
|
214
|
+
*/
|
|
215
|
+
async function deployStaticAssets(projectRoot, stage, outputs, skipBuild, onProgress) {
|
|
216
|
+
// Deploy frontend assets if exists and has bucket (non-SSR)
|
|
217
|
+
if (hasPackage(projectRoot, 'frontend') && outputs.frontendBucket) {
|
|
218
|
+
onProgress({ phase: 'deploying-assets', message: 'Deploying frontend assets...' });
|
|
219
|
+
const frontendPath = join(projectRoot, 'packages', 'frontend');
|
|
220
|
+
if (!skipBuild) {
|
|
221
|
+
onProgress({ phase: 'building', message: 'Building frontend...' });
|
|
222
|
+
buildPackage(frontendPath, outputs.apiUrl || '', false);
|
|
223
|
+
}
|
|
224
|
+
const buildDir = findBuildDirectory(frontendPath);
|
|
225
|
+
if (buildDir) {
|
|
226
|
+
syncToS3(buildDir, outputs.frontendBucket, false);
|
|
227
|
+
if (outputs.frontendDistributionId) {
|
|
228
|
+
invalidateCloudFront(outputs.frontendDistributionId, false);
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
// Deploy CMS assets if exists and has bucket (non-SSR)
|
|
233
|
+
if (hasPackage(projectRoot, 'cms') && outputs.cmsBucket) {
|
|
234
|
+
onProgress({ phase: 'deploying-assets', message: 'Deploying CMS assets...' });
|
|
235
|
+
const cmsPath = join(projectRoot, 'packages', 'cms');
|
|
236
|
+
if (!skipBuild) {
|
|
237
|
+
onProgress({ phase: 'building', message: 'Building CMS...' });
|
|
238
|
+
buildPackage(cmsPath, outputs.apiUrl || '', false);
|
|
239
|
+
}
|
|
240
|
+
const buildDir = findBuildDirectory(cmsPath);
|
|
241
|
+
if (buildDir) {
|
|
242
|
+
syncToS3(buildDir, outputs.cmsBucket, false);
|
|
243
|
+
if (outputs.cmsDistributionId) {
|
|
244
|
+
invalidateCloudFront(outputs.cmsDistributionId, false);
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
/**
|
|
250
|
+
* Deploys infrastructure in TUI mode.
|
|
251
|
+
*
|
|
252
|
+
* Unlike the CLI version, this function:
|
|
253
|
+
* - Does NOT call process.exit()
|
|
254
|
+
* - Reports progress via callback
|
|
255
|
+
* - Streams CDK output via callback
|
|
256
|
+
* - Returns result object
|
|
257
|
+
*
|
|
258
|
+
* @param options - Deployment options
|
|
259
|
+
* @param onProgress - Progress callback
|
|
260
|
+
* @param onCdkOutput - CDK output line callback
|
|
261
|
+
* @returns Result indicating success or failure
|
|
262
|
+
*/
|
|
263
|
+
export async function deployForTUI(options, onProgress, onCdkOutput) {
|
|
264
|
+
// Find project root
|
|
265
|
+
const projectRoot = findProjectRoot();
|
|
266
|
+
if (!projectRoot) {
|
|
267
|
+
onProgress({ phase: 'error', message: 'Not in an fnd-platform project' });
|
|
268
|
+
return { success: false, error: 'Not inside an fnd-platform project' };
|
|
269
|
+
}
|
|
270
|
+
const infraDir = join(projectRoot, 'packages', 'infra');
|
|
271
|
+
// Step 1: Validate
|
|
272
|
+
onProgress({ phase: 'validating', message: 'Validating deployment environment...' });
|
|
273
|
+
const validation = validateDeployment(projectRoot);
|
|
274
|
+
if (!validation.valid) {
|
|
275
|
+
onProgress({ phase: 'error', message: validation.error || 'Validation failed' });
|
|
276
|
+
return { success: false, error: validation.error };
|
|
277
|
+
}
|
|
278
|
+
try {
|
|
279
|
+
// Step 2: Deploy CDK stacks
|
|
280
|
+
onProgress({ phase: 'deploying-stacks', message: 'Starting CDK deployment...' });
|
|
281
|
+
const cdkResult = await runCdkDeployStreaming(infraDir, options.stage, options.stacks, options.requireApproval, onProgress, onCdkOutput);
|
|
282
|
+
if (!cdkResult.success) {
|
|
283
|
+
onProgress({ phase: 'error', message: cdkResult.error || 'CDK deployment failed' });
|
|
284
|
+
return { success: false, error: cdkResult.error };
|
|
285
|
+
}
|
|
286
|
+
// Step 3: Get stack outputs
|
|
287
|
+
const outputs = getStackOutputs(projectRoot, options.stage);
|
|
288
|
+
// Step 4: Deploy static assets (if applicable)
|
|
289
|
+
if (!options.skipAssets) {
|
|
290
|
+
try {
|
|
291
|
+
await deployStaticAssets(projectRoot, options.stage, outputs, options.skipBuild, onProgress);
|
|
292
|
+
}
|
|
293
|
+
catch (assetError) {
|
|
294
|
+
// Asset deployment failure is non-fatal for SSR deployments
|
|
295
|
+
onCdkOutput(`Warning: Asset deployment failed: ${assetError.message}`);
|
|
296
|
+
}
|
|
297
|
+
}
|
|
298
|
+
// Complete
|
|
299
|
+
onProgress({ phase: 'complete', message: 'Deployment successful!' });
|
|
300
|
+
return { success: true, outputs };
|
|
301
|
+
}
|
|
302
|
+
catch (error) {
|
|
303
|
+
const errorMessage = error instanceof Error ? error.message : 'Unknown error occurred';
|
|
304
|
+
onProgress({ phase: 'error', message: errorMessage });
|
|
305
|
+
return { success: false, error: errorMessage };
|
|
306
|
+
}
|
|
307
|
+
}
|
|
308
|
+
/**
|
|
309
|
+
* Gets common deployment stages.
|
|
310
|
+
*/
|
|
311
|
+
export function getCommonStages() {
|
|
312
|
+
return ['dev', 'staging', 'prod'];
|
|
313
|
+
}
|
|
314
|
+
/**
|
|
315
|
+
* Validates a stage name.
|
|
316
|
+
*/
|
|
317
|
+
export function validateStageName(stage) {
|
|
318
|
+
if (!stage || stage.trim() === '') {
|
|
319
|
+
return { valid: false, error: 'Stage name is required' };
|
|
320
|
+
}
|
|
321
|
+
if (stage.length > 20) {
|
|
322
|
+
return { valid: false, error: 'Stage name must be 20 characters or less' };
|
|
323
|
+
}
|
|
324
|
+
if (!/^[a-z][a-z0-9-]*$/.test(stage)) {
|
|
325
|
+
return {
|
|
326
|
+
valid: false,
|
|
327
|
+
error: 'Stage must start with a letter and contain only lowercase letters, numbers, and hyphens',
|
|
328
|
+
};
|
|
329
|
+
}
|
|
330
|
+
return { valid: true };
|
|
331
|
+
}
|
|
332
|
+
/**
|
|
333
|
+
* Gets the display label for a stack type.
|
|
334
|
+
*/
|
|
335
|
+
export function getStackTypeLabel(type) {
|
|
336
|
+
const labels = {
|
|
337
|
+
auth: 'Authentication',
|
|
338
|
+
database: 'Database',
|
|
339
|
+
media: 'Media',
|
|
340
|
+
api: 'API',
|
|
341
|
+
frontend: 'Frontend',
|
|
342
|
+
cms: 'CMS',
|
|
343
|
+
other: 'Other',
|
|
344
|
+
};
|
|
345
|
+
return labels[type];
|
|
346
|
+
}
|
|
347
|
+
//# sourceMappingURL=deploy-tui.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"deploy-tui.js","sourceRoot":"","sources":["../../../src/tui/lib/deploy-tui.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Add package wizard screen for the FND TUI.
|
|
3
|
+
*
|
|
4
|
+
* Multi-step wizard for adding a new package to an existing
|
|
5
|
+
* fnd-platform project.
|
|
6
|
+
*/
|
|
7
|
+
import React from 'react';
|
|
8
|
+
/**
|
|
9
|
+
* Add package wizard screen.
|
|
10
|
+
*/
|
|
11
|
+
export declare function AddPackageScreen(): React.ReactElement;
|
|
12
|
+
//# sourceMappingURL=AddPackageScreen.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AddPackageScreen.d.ts","sourceRoot":"","sources":["../../../src/tui/screens/AddPackageScreen.tsx"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAmB,MAAM,OAAO,CAAC;AA46BxC;;GAEG;AACH,wBAAgB,gBAAgB,IAAI,KAAK,CAAC,YAAY,CA0KrD"}
|