@fnd-platform/cli 1.0.0-alpha.3 → 1.0.0-alpha.31
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/LICENSE +21 -0
- package/lib/bin/fnd.js +101 -4
- package/lib/bin/fnd.js.map +1 -1
- package/lib/commands/add.d.ts.map +1 -1
- package/lib/commands/add.js +134 -67
- 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 +34 -9
- package/lib/commands/deploy.d.ts.map +1 -1
- package/lib/commands/deploy.js +246 -52
- package/lib/commands/deploy.js.map +1 -1
- package/lib/commands/destroy.d.ts +69 -0
- package/lib/commands/destroy.d.ts.map +1 -0
- package/lib/commands/destroy.js +172 -0
- package/lib/commands/destroy.js.map +1 -0
- package/lib/commands/index.d.ts +2 -0
- package/lib/commands/index.d.ts.map +1 -1
- package/lib/commands/index.js +7 -13
- 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 +31 -15
- package/lib/index.js.map +1 -1
- package/lib/lib/deploy-utils.d.ts +190 -0
- package/lib/lib/deploy-utils.d.ts.map +1 -0
- package/lib/lib/deploy-utils.js +372 -0
- package/lib/lib/deploy-utils.js.map +1 -0
- package/lib/lib/infra-generator.d.ts +118 -0
- package/lib/lib/infra-generator.d.ts.map +1 -1
- package/lib/lib/infra-generator.js +1051 -59
- 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 +357 -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 +158 -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 +254 -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 +102 -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 +130 -0
- package/lib/tui/lib/add-package-tui.d.ts.map +1 -0
- package/lib/tui/lib/add-package-tui.js +492 -0
- package/lib/tui/lib/add-package-tui.js.map +1 -0
- package/lib/tui/lib/create-project-tui.d.ts +92 -0
- package/lib/tui/lib/create-project-tui.d.ts.map +1 -0
- package/lib/tui/lib/create-project-tui.js +181 -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 +261 -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 +81 -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 +23 -14
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
import { Command } from 'commander';
|
|
2
|
+
/**
|
|
3
|
+
* Options for the destroy command.
|
|
4
|
+
*/
|
|
5
|
+
export interface DestroyCommandOptions {
|
|
6
|
+
stage: string;
|
|
7
|
+
stack?: string;
|
|
8
|
+
force?: boolean;
|
|
9
|
+
verbose?: boolean;
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Creates the `fnd destroy` command.
|
|
13
|
+
*
|
|
14
|
+
* @returns Commander command instance
|
|
15
|
+
*
|
|
16
|
+
* @example
|
|
17
|
+
* ```typescript
|
|
18
|
+
* import { destroyCommand } from '@fnd-platform/cli';
|
|
19
|
+
*
|
|
20
|
+
* const program = new Command();
|
|
21
|
+
* program.addCommand(destroyCommand());
|
|
22
|
+
*
|
|
23
|
+
* // Destroy dev environment (with confirmation prompt)
|
|
24
|
+
* program.parse(['node', 'fnd', 'destroy', '--stage=dev']);
|
|
25
|
+
*
|
|
26
|
+
* // Force destroy without confirmation (for CI/CD)
|
|
27
|
+
* program.parse(['node', 'fnd', 'destroy', '--stage=dev', '--force']);
|
|
28
|
+
*
|
|
29
|
+
* // Destroy specific stack
|
|
30
|
+
* program.parse(['node', 'fnd', 'destroy', '--stage=dev', '--stack=Frontend']);
|
|
31
|
+
* ```
|
|
32
|
+
*/
|
|
33
|
+
export declare function destroyCommand(): Command;
|
|
34
|
+
/**
|
|
35
|
+
* Runs the CDK destroy operation.
|
|
36
|
+
*
|
|
37
|
+
* @param options - Command options
|
|
38
|
+
*
|
|
39
|
+
* @example
|
|
40
|
+
* ```typescript
|
|
41
|
+
* // Destroy dev environment (with confirmation)
|
|
42
|
+
* await runDestroy({ stage: 'dev' });
|
|
43
|
+
*
|
|
44
|
+
* // Force destroy (no confirmation)
|
|
45
|
+
* await runDestroy({ stage: 'dev', force: true });
|
|
46
|
+
*
|
|
47
|
+
* // Destroy specific stack
|
|
48
|
+
* await runDestroy({ stage: 'dev', stack: 'Frontend' });
|
|
49
|
+
* ```
|
|
50
|
+
*/
|
|
51
|
+
export declare function runDestroy(options: DestroyCommandOptions): Promise<void>;
|
|
52
|
+
/**
|
|
53
|
+
* Builds the CDK destroy command.
|
|
54
|
+
*
|
|
55
|
+
* @param stage - Deployment stage
|
|
56
|
+
* @param stack - Optional specific stack to destroy
|
|
57
|
+
* @returns Command string
|
|
58
|
+
*
|
|
59
|
+
* @example
|
|
60
|
+
* ```typescript
|
|
61
|
+
* buildCdkDestroyCommand('dev');
|
|
62
|
+
* // Returns: 'pnpm exec cdk destroy --all -c stage=dev --force'
|
|
63
|
+
*
|
|
64
|
+
* buildCdkDestroyCommand('dev', 'Frontend');
|
|
65
|
+
* // Returns: 'pnpm exec cdk destroy "*Frontend*" -c stage=dev --force'
|
|
66
|
+
* ```
|
|
67
|
+
*/
|
|
68
|
+
export declare function buildCdkDestroyCommand(stage: string, stack?: string): string;
|
|
69
|
+
//# sourceMappingURL=destroy.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"destroy.d.ts","sourceRoot":"","sources":["../../src/commands/destroy.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAapC;;GAEG;AACH,MAAM,WAAW,qBAAqB;IACpC,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,wBAAgB,cAAc,IAAI,OAAO,CAUxC;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAsB,UAAU,CAAC,OAAO,EAAE,qBAAqB,GAAG,OAAO,CAAC,IAAI,CAAC,CAsE9E;AAiCD;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,CAgB5E"}
|
|
@@ -0,0 +1,172 @@
|
|
|
1
|
+
import { Command } from 'commander';
|
|
2
|
+
import { execSync } from 'child_process';
|
|
3
|
+
import { existsSync } from 'fs';
|
|
4
|
+
import { join } from 'path';
|
|
5
|
+
import { requireProjectRoot } from '../lib/project.js';
|
|
6
|
+
import { logger } from '../lib/logger.js';
|
|
7
|
+
import { validateAwsCli, getProjectName, promptConfirmation, listProjectStacks, } from '../lib/deploy-utils.js';
|
|
8
|
+
/**
|
|
9
|
+
* Creates the `fnd destroy` command.
|
|
10
|
+
*
|
|
11
|
+
* @returns Commander command instance
|
|
12
|
+
*
|
|
13
|
+
* @example
|
|
14
|
+
* ```typescript
|
|
15
|
+
* import { destroyCommand } from '@fnd-platform/cli';
|
|
16
|
+
*
|
|
17
|
+
* const program = new Command();
|
|
18
|
+
* program.addCommand(destroyCommand());
|
|
19
|
+
*
|
|
20
|
+
* // Destroy dev environment (with confirmation prompt)
|
|
21
|
+
* program.parse(['node', 'fnd', 'destroy', '--stage=dev']);
|
|
22
|
+
*
|
|
23
|
+
* // Force destroy without confirmation (for CI/CD)
|
|
24
|
+
* program.parse(['node', 'fnd', 'destroy', '--stage=dev', '--force']);
|
|
25
|
+
*
|
|
26
|
+
* // Destroy specific stack
|
|
27
|
+
* program.parse(['node', 'fnd', 'destroy', '--stage=dev', '--stack=Frontend']);
|
|
28
|
+
* ```
|
|
29
|
+
*/
|
|
30
|
+
export function destroyCommand() {
|
|
31
|
+
return new Command('destroy')
|
|
32
|
+
.description('Destroy AWS resources created by fnd-platform')
|
|
33
|
+
.requiredOption('--stage <stage>', 'Deployment stage to destroy (e.g., dev, staging, prod)')
|
|
34
|
+
.option('--stack <stack>', 'Destroy specific stack only (e.g., Api, Frontend, Cms)')
|
|
35
|
+
.option('--force', 'Skip confirmation prompt (required for CI/CD)')
|
|
36
|
+
.option('-v, --verbose', 'Verbose output')
|
|
37
|
+
.action(async (options) => {
|
|
38
|
+
await runDestroy(options);
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Runs the CDK destroy operation.
|
|
43
|
+
*
|
|
44
|
+
* @param options - Command options
|
|
45
|
+
*
|
|
46
|
+
* @example
|
|
47
|
+
* ```typescript
|
|
48
|
+
* // Destroy dev environment (with confirmation)
|
|
49
|
+
* await runDestroy({ stage: 'dev' });
|
|
50
|
+
*
|
|
51
|
+
* // Force destroy (no confirmation)
|
|
52
|
+
* await runDestroy({ stage: 'dev', force: true });
|
|
53
|
+
*
|
|
54
|
+
* // Destroy specific stack
|
|
55
|
+
* await runDestroy({ stage: 'dev', stack: 'Frontend' });
|
|
56
|
+
* ```
|
|
57
|
+
*/
|
|
58
|
+
export async function runDestroy(options) {
|
|
59
|
+
let projectRoot;
|
|
60
|
+
try {
|
|
61
|
+
projectRoot = requireProjectRoot();
|
|
62
|
+
}
|
|
63
|
+
catch (error) {
|
|
64
|
+
logger.error(error.message);
|
|
65
|
+
process.exit(1);
|
|
66
|
+
}
|
|
67
|
+
// Validate infra package exists
|
|
68
|
+
const infraDir = join(projectRoot, 'packages', 'infra');
|
|
69
|
+
if (!existsSync(infraDir)) {
|
|
70
|
+
logger.error('Infrastructure package not found at packages/infra. ' +
|
|
71
|
+
'Make sure you have added an API package with `fnd add api`, ' +
|
|
72
|
+
'which generates the infrastructure package.');
|
|
73
|
+
process.exit(1);
|
|
74
|
+
}
|
|
75
|
+
// Validate AWS CLI
|
|
76
|
+
try {
|
|
77
|
+
validateAwsCli();
|
|
78
|
+
}
|
|
79
|
+
catch (error) {
|
|
80
|
+
logger.error(error.message);
|
|
81
|
+
process.exit(1);
|
|
82
|
+
}
|
|
83
|
+
const { stage, stack, force } = options;
|
|
84
|
+
const projectName = getProjectName(projectRoot);
|
|
85
|
+
// Build confirmation message
|
|
86
|
+
let confirmMessage;
|
|
87
|
+
if (stack) {
|
|
88
|
+
confirmMessage = `Are you sure you want to destroy the ${stack} stack in ${stage} for ${projectName}?`;
|
|
89
|
+
}
|
|
90
|
+
else {
|
|
91
|
+
confirmMessage = `Are you sure you want to destroy ALL resources in ${stage} for ${projectName}?`;
|
|
92
|
+
}
|
|
93
|
+
// Prompt for confirmation unless --force is used
|
|
94
|
+
if (!force) {
|
|
95
|
+
logger.warn('This action is destructive and cannot be undone!');
|
|
96
|
+
logger.warn('Data in DynamoDB and S3 will be deleted unless retention policies are configured.');
|
|
97
|
+
const confirmed = await promptConfirmation(confirmMessage);
|
|
98
|
+
if (!confirmed) {
|
|
99
|
+
logger.info('Destroy operation cancelled.');
|
|
100
|
+
process.exit(0);
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
// List stacks that will be destroyed
|
|
104
|
+
if (!stack) {
|
|
105
|
+
const stacks = listProjectStacks(projectRoot, stage);
|
|
106
|
+
if (stacks.length > 0) {
|
|
107
|
+
logger.info('Stacks to be destroyed:');
|
|
108
|
+
for (const stackName of stacks) {
|
|
109
|
+
logger.info(` - ${stackName}`);
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
// Run CDK destroy
|
|
114
|
+
logger.info(`Destroying ${stack ? `${stack} stack` : 'all stacks'} in stage: ${stage}`);
|
|
115
|
+
await runCdkDestroy(infraDir, stage, stack, options.verbose);
|
|
116
|
+
logger.success(`Destroy operation for ${stage} complete`);
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* Runs CDK destroy.
|
|
120
|
+
*
|
|
121
|
+
* @param infraDir - Path to the infrastructure package
|
|
122
|
+
* @param stage - Deployment stage
|
|
123
|
+
* @param stack - Optional specific stack to destroy
|
|
124
|
+
* @param verbose - Show verbose output
|
|
125
|
+
*/
|
|
126
|
+
async function runCdkDestroy(infraDir, stage, stack, verbose) {
|
|
127
|
+
logger.debug(`Running CDK destroy in: ${infraDir}`);
|
|
128
|
+
const command = buildCdkDestroyCommand(stage, stack);
|
|
129
|
+
logger.debug(`Command: ${command}`);
|
|
130
|
+
try {
|
|
131
|
+
execSync(command, {
|
|
132
|
+
cwd: infraDir,
|
|
133
|
+
stdio: 'inherit',
|
|
134
|
+
});
|
|
135
|
+
}
|
|
136
|
+
catch (error) {
|
|
137
|
+
logger.error('CDK destroy failed');
|
|
138
|
+
logger.debug(`Error: ${error.message}`);
|
|
139
|
+
process.exit(1);
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
/**
|
|
143
|
+
* Builds the CDK destroy command.
|
|
144
|
+
*
|
|
145
|
+
* @param stage - Deployment stage
|
|
146
|
+
* @param stack - Optional specific stack to destroy
|
|
147
|
+
* @returns Command string
|
|
148
|
+
*
|
|
149
|
+
* @example
|
|
150
|
+
* ```typescript
|
|
151
|
+
* buildCdkDestroyCommand('dev');
|
|
152
|
+
* // Returns: 'pnpm exec cdk destroy --all -c stage=dev --force'
|
|
153
|
+
*
|
|
154
|
+
* buildCdkDestroyCommand('dev', 'Frontend');
|
|
155
|
+
* // Returns: 'pnpm exec cdk destroy "*Frontend*" -c stage=dev --force'
|
|
156
|
+
* ```
|
|
157
|
+
*/
|
|
158
|
+
export function buildCdkDestroyCommand(stage, stack) {
|
|
159
|
+
const args = ['pnpm', 'exec', 'cdk', 'destroy'];
|
|
160
|
+
if (stack) {
|
|
161
|
+
args.push(`"*${stack}*"`);
|
|
162
|
+
}
|
|
163
|
+
else {
|
|
164
|
+
args.push('--all');
|
|
165
|
+
}
|
|
166
|
+
args.push(`-c stage=${stage}`);
|
|
167
|
+
// Always use --force for CDK destroy to skip its internal confirmation
|
|
168
|
+
// (we handle confirmation at the CLI level)
|
|
169
|
+
args.push('--force');
|
|
170
|
+
return args.join(' ');
|
|
171
|
+
}
|
|
172
|
+
//# sourceMappingURL=destroy.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"destroy.js","sourceRoot":"","sources":["../../src/commands/destroy.ts"],"names":[],"mappings":"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"}
|
package/lib/commands/index.d.ts
CHANGED
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
export { newCommand } from './new.js';
|
|
2
2
|
export { synthCommand } from './synth.js';
|
|
3
3
|
export { buildCommand } from './build.js';
|
|
4
|
+
export { testCommand } from './test.js';
|
|
4
5
|
export { addCommand } from './add.js';
|
|
5
6
|
export { deployCommand } from './deploy.js';
|
|
7
|
+
export { destroyCommand } from './destroy.js';
|
|
6
8
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/commands/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AACtC,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC1C,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC1C,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AACtC,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/commands/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AACtC,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC1C,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC1C,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AACxC,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AACtC,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC"}
|
package/lib/commands/index.js
CHANGED
|
@@ -1,14 +1,8 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
var build_js_1 = require("./build.js");
|
|
9
|
-
Object.defineProperty(exports, "buildCommand", { enumerable: true, get: function () { return build_js_1.buildCommand; } });
|
|
10
|
-
var add_js_1 = require("./add.js");
|
|
11
|
-
Object.defineProperty(exports, "addCommand", { enumerable: true, get: function () { return add_js_1.addCommand; } });
|
|
12
|
-
var deploy_js_1 = require("./deploy.js");
|
|
13
|
-
Object.defineProperty(exports, "deployCommand", { enumerable: true, get: function () { return deploy_js_1.deployCommand; } });
|
|
1
|
+
export { newCommand } from './new.js';
|
|
2
|
+
export { synthCommand } from './synth.js';
|
|
3
|
+
export { buildCommand } from './build.js';
|
|
4
|
+
export { testCommand } from './test.js';
|
|
5
|
+
export { addCommand } from './add.js';
|
|
6
|
+
export { deployCommand } from './deploy.js';
|
|
7
|
+
export { destroyCommand } from './destroy.js';
|
|
14
8
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/commands/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/commands/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AACtC,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC1C,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC1C,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AACxC,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AACtC,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC"}
|
package/lib/commands/new.js
CHANGED
|
@@ -1,21 +1,15 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
const fs_1 = require("fs");
|
|
9
|
-
const path_1 = require("path");
|
|
10
|
-
const logger_js_1 = require("../lib/logger.js");
|
|
11
|
-
const templates_js_1 = require("../lib/templates.js");
|
|
12
|
-
const timer_js_1 = require("../lib/timer.js");
|
|
1
|
+
import { Command } from 'commander';
|
|
2
|
+
import { execSync } from 'child_process';
|
|
3
|
+
import { existsSync, mkdirSync, rmSync, writeFileSync } from 'fs';
|
|
4
|
+
import { join, resolve } from 'path';
|
|
5
|
+
import { logger } from '../lib/logger.js';
|
|
6
|
+
import { getProjenrcTemplate, getInitialPackageJson } from '../lib/templates.js';
|
|
7
|
+
import { PerformanceTimer } from '../lib/timer.js';
|
|
13
8
|
/**
|
|
14
9
|
* Valid project name pattern: lowercase alphanumeric with hyphens.
|
|
15
10
|
* Must start with a letter.
|
|
16
11
|
*/
|
|
17
12
|
const PROJECT_NAME_PATTERN = /^[a-z][a-z0-9-]*$/;
|
|
18
|
-
exports.PROJECT_NAME_PATTERN = PROJECT_NAME_PATTERN;
|
|
19
13
|
/**
|
|
20
14
|
* Creates the `fnd new` command.
|
|
21
15
|
*
|
|
@@ -30,8 +24,8 @@ exports.PROJECT_NAME_PATTERN = PROJECT_NAME_PATTERN;
|
|
|
30
24
|
* program.parse(['node', 'fnd', 'new', 'my-app']);
|
|
31
25
|
* ```
|
|
32
26
|
*/
|
|
33
|
-
function newCommand() {
|
|
34
|
-
return new
|
|
27
|
+
export function newCommand() {
|
|
28
|
+
return new Command('new')
|
|
35
29
|
.description('Create a new fnd-platform monorepo project')
|
|
36
30
|
.argument('<name>', 'Project name (lowercase alphanumeric with hyphens)')
|
|
37
31
|
.option('--package-manager <pm>', 'Package manager to use (pnpm or yarn)', 'pnpm')
|
|
@@ -56,84 +50,84 @@ function newCommand() {
|
|
|
56
50
|
* });
|
|
57
51
|
* ```
|
|
58
52
|
*/
|
|
59
|
-
async function createProject(name, options) {
|
|
53
|
+
export async function createProject(name, options) {
|
|
60
54
|
// Initialize profiling if enabled
|
|
61
|
-
const timer =
|
|
55
|
+
const timer = PerformanceTimer.isEnabled() ? new PerformanceTimer('fnd new') : null;
|
|
62
56
|
// Validate project name
|
|
63
57
|
if (!PROJECT_NAME_PATTERN.test(name)) {
|
|
64
|
-
|
|
58
|
+
logger.error(`Invalid project name: '${name}'. ` +
|
|
65
59
|
'Project name must start with a letter and contain only lowercase letters, numbers, and hyphens.');
|
|
66
60
|
process.exit(1);
|
|
67
61
|
}
|
|
68
|
-
const projectDir =
|
|
62
|
+
const projectDir = resolve(process.cwd(), name);
|
|
69
63
|
// Check if directory already exists
|
|
70
|
-
if (
|
|
71
|
-
|
|
64
|
+
if (existsSync(projectDir)) {
|
|
65
|
+
logger.error(`Directory '${name}' already exists. ` +
|
|
72
66
|
'Please choose a different name or remove the existing directory.');
|
|
73
67
|
process.exit(1);
|
|
74
68
|
}
|
|
75
|
-
|
|
69
|
+
logger.info(`Creating new fnd-platform project: ${name}`);
|
|
76
70
|
try {
|
|
77
71
|
// Step 1: Create project directory and write files
|
|
78
72
|
timer?.start('file-generation');
|
|
79
|
-
|
|
80
|
-
|
|
73
|
+
logger.debug(`Creating directory: ${projectDir}`);
|
|
74
|
+
mkdirSync(projectDir, { recursive: true });
|
|
81
75
|
// Step 2: Write .projenrc.ts
|
|
82
|
-
|
|
83
|
-
|
|
76
|
+
logger.debug('Writing .projenrc.ts');
|
|
77
|
+
writeFileSync(join(projectDir, '.projenrc.ts'), getProjenrcTemplate(name));
|
|
84
78
|
// Step 3: Write initial package.json
|
|
85
|
-
|
|
86
|
-
|
|
79
|
+
logger.debug('Writing initial package.json');
|
|
80
|
+
writeFileSync(join(projectDir, 'package.json'), JSON.stringify(getInitialPackageJson(name, options.packageManager), null, 2));
|
|
87
81
|
const fileGenResult = timer?.end('file-generation');
|
|
88
82
|
if (fileGenResult) {
|
|
89
|
-
|
|
83
|
+
logger.timing('file-generation', fileGenResult.durationMs);
|
|
90
84
|
}
|
|
91
85
|
// Step 4: Initialize git repository (unless --no-git)
|
|
92
86
|
if (options.git) {
|
|
93
87
|
timer?.start('git-init');
|
|
94
|
-
|
|
88
|
+
logger.debug('Initializing git repository');
|
|
95
89
|
initializeGit(projectDir);
|
|
96
90
|
const gitResult = timer?.end('git-init');
|
|
97
91
|
if (gitResult) {
|
|
98
|
-
|
|
92
|
+
logger.timing('git-init', gitResult.durationMs);
|
|
99
93
|
}
|
|
100
94
|
}
|
|
101
95
|
// Step 5: Install dependencies and run Projen (unless --no-install)
|
|
102
96
|
if (options.install) {
|
|
103
97
|
timer?.start('install-dependencies');
|
|
104
|
-
|
|
98
|
+
logger.info('Installing dependencies...');
|
|
105
99
|
installDependencies(projectDir, options.packageManager);
|
|
106
100
|
const installResult = timer?.end('install-dependencies');
|
|
107
101
|
if (installResult) {
|
|
108
|
-
|
|
102
|
+
logger.timing('install-dependencies', installResult.durationMs);
|
|
109
103
|
}
|
|
110
104
|
timer?.start('projen-synth');
|
|
111
|
-
|
|
105
|
+
logger.info('Running Projen synthesis...');
|
|
112
106
|
runProjen(projectDir);
|
|
113
107
|
const synthResult = timer?.end('projen-synth');
|
|
114
108
|
if (synthResult) {
|
|
115
|
-
|
|
109
|
+
logger.timing('projen-synth', synthResult.durationMs);
|
|
116
110
|
}
|
|
117
111
|
}
|
|
118
|
-
|
|
112
|
+
logger.success(`Project '${name}' created successfully!`);
|
|
119
113
|
printNextSteps(name, options);
|
|
120
114
|
// Output profile report if enabled
|
|
121
115
|
if (timer) {
|
|
122
116
|
const report = timer.getReport(true);
|
|
123
|
-
|
|
117
|
+
logger.report(report);
|
|
124
118
|
}
|
|
125
119
|
}
|
|
126
120
|
catch (error) {
|
|
127
121
|
// Output profile report even on failure
|
|
128
122
|
if (timer) {
|
|
129
123
|
const report = timer.getReport(false);
|
|
130
|
-
|
|
124
|
+
logger.report(report);
|
|
131
125
|
}
|
|
132
|
-
|
|
126
|
+
logger.error(`Failed to create project: ${error.message}`);
|
|
133
127
|
// Clean up partial project on failure
|
|
134
|
-
if (
|
|
135
|
-
|
|
136
|
-
|
|
128
|
+
if (existsSync(projectDir)) {
|
|
129
|
+
logger.debug('Cleaning up partial project directory');
|
|
130
|
+
rmSync(projectDir, { recursive: true, force: true });
|
|
137
131
|
}
|
|
138
132
|
process.exit(1);
|
|
139
133
|
}
|
|
@@ -143,22 +137,22 @@ async function createProject(name, options) {
|
|
|
143
137
|
*/
|
|
144
138
|
function initializeGit(projectDir) {
|
|
145
139
|
try {
|
|
146
|
-
|
|
140
|
+
execSync('git init', {
|
|
147
141
|
cwd: projectDir,
|
|
148
142
|
stdio: 'pipe',
|
|
149
143
|
});
|
|
150
|
-
|
|
144
|
+
execSync('git add -A', {
|
|
151
145
|
cwd: projectDir,
|
|
152
146
|
stdio: 'pipe',
|
|
153
147
|
});
|
|
154
|
-
|
|
148
|
+
execSync('git commit -m "Initial commit from fnd-platform"', {
|
|
155
149
|
cwd: projectDir,
|
|
156
150
|
stdio: 'pipe',
|
|
157
151
|
});
|
|
158
152
|
}
|
|
159
153
|
catch (error) {
|
|
160
|
-
|
|
161
|
-
|
|
154
|
+
logger.warn('Git initialization failed (git may not be configured)');
|
|
155
|
+
logger.debug(`Git error: ${error.message}`);
|
|
162
156
|
}
|
|
163
157
|
}
|
|
164
158
|
/**
|
|
@@ -166,7 +160,7 @@ function initializeGit(projectDir) {
|
|
|
166
160
|
*/
|
|
167
161
|
function installDependencies(projectDir, packageManager) {
|
|
168
162
|
const installCmd = packageManager === 'pnpm' ? 'pnpm install' : 'yarn install';
|
|
169
|
-
|
|
163
|
+
execSync(installCmd, {
|
|
170
164
|
cwd: projectDir,
|
|
171
165
|
stdio: 'inherit',
|
|
172
166
|
});
|
|
@@ -175,7 +169,7 @@ function installDependencies(projectDir, packageManager) {
|
|
|
175
169
|
* Run Projen synthesis.
|
|
176
170
|
*/
|
|
177
171
|
function runProjen(projectDir) {
|
|
178
|
-
|
|
172
|
+
execSync('npx tsx .projenrc.ts', {
|
|
179
173
|
cwd: projectDir,
|
|
180
174
|
stdio: 'inherit',
|
|
181
175
|
});
|
|
@@ -185,7 +179,7 @@ function runProjen(projectDir) {
|
|
|
185
179
|
*/
|
|
186
180
|
function printNextSteps(name, options) {
|
|
187
181
|
console.log('');
|
|
188
|
-
|
|
182
|
+
logger.info('Next steps:');
|
|
189
183
|
console.log(` cd ${name}`);
|
|
190
184
|
if (!options.install) {
|
|
191
185
|
const pm = options.packageManager;
|
|
@@ -196,4 +190,6 @@ function printNextSteps(name, options) {
|
|
|
196
190
|
console.log(' fnd add frontend --name=frontend --api=api');
|
|
197
191
|
console.log('');
|
|
198
192
|
}
|
|
193
|
+
// Export for testing
|
|
194
|
+
export { PROJECT_NAME_PATTERN };
|
|
199
195
|
//# sourceMappingURL=new.js.map
|
package/lib/commands/new.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"new.js","sourceRoot":"","sources":["../../src/commands/new.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"new.js","sourceRoot":"","sources":["../../src/commands/new.ts"],"names":[],"mappings":"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"}
|
package/lib/commands/synth.d.ts
CHANGED
|
@@ -30,10 +30,17 @@ export declare function synthCommand(): Command;
|
|
|
30
30
|
* // Run synthesis with default options
|
|
31
31
|
* await runSynth({});
|
|
32
32
|
*
|
|
33
|
-
* // Run synthesis with watch mode
|
|
33
|
+
* // Run synthesis with watch mode
|
|
34
34
|
* await runSynth({ watch: true });
|
|
35
35
|
* ```
|
|
36
36
|
*/
|
|
37
37
|
export declare function runSynth(options: SynthCommandOptions): Promise<void>;
|
|
38
|
+
/**
|
|
39
|
+
* Runs the Projen synthesis command.
|
|
40
|
+
*
|
|
41
|
+
* @param projectRoot - Root directory of the project
|
|
42
|
+
* @returns true if successful, false otherwise
|
|
43
|
+
*/
|
|
44
|
+
export declare function runProjenSynth(projectRoot: string): boolean;
|
|
38
45
|
export {};
|
|
39
46
|
//# sourceMappingURL=synth.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"synth.d.ts","sourceRoot":"","sources":["../../src/commands/synth.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"synth.d.ts","sourceRoot":"","sources":["../../src/commands/synth.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAOpC;;GAEG;AACH,UAAU,mBAAmB;IAC3B,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,YAAY,IAAI,OAAO,CAOtC;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAsB,QAAQ,CAAC,OAAO,EAAE,mBAAmB,GAAG,OAAO,CAAC,IAAI,CAAC,CAsB1E;AAED;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAa3D"}
|