@forgecart/cli 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.
Files changed (93) hide show
  1. package/README.md +179 -0
  2. package/bin/forgecart.js +3 -0
  3. package/dist/cli.d.ts +3 -0
  4. package/dist/cli.d.ts.map +1 -0
  5. package/dist/cli.js +30 -0
  6. package/dist/cli.js.map +1 -0
  7. package/dist/commands/delete.d.ts +3 -0
  8. package/dist/commands/delete.d.ts.map +1 -0
  9. package/dist/commands/delete.js +55 -0
  10. package/dist/commands/delete.js.map +1 -0
  11. package/dist/commands/deploy.d.ts +3 -0
  12. package/dist/commands/deploy.d.ts.map +1 -0
  13. package/dist/commands/deploy.js +128 -0
  14. package/dist/commands/deploy.js.map +1 -0
  15. package/dist/commands/env.d.ts +3 -0
  16. package/dist/commands/env.d.ts.map +1 -0
  17. package/dist/commands/env.js +100 -0
  18. package/dist/commands/env.js.map +1 -0
  19. package/dist/commands/init.d.ts +4 -0
  20. package/dist/commands/init.d.ts.map +1 -0
  21. package/dist/commands/init.js +233 -0
  22. package/dist/commands/init.js.map +1 -0
  23. package/dist/commands/list.d.ts +3 -0
  24. package/dist/commands/list.d.ts.map +1 -0
  25. package/dist/commands/list.js +61 -0
  26. package/dist/commands/list.js.map +1 -0
  27. package/dist/commands/logs.d.ts +3 -0
  28. package/dist/commands/logs.d.ts.map +1 -0
  29. package/dist/commands/logs.js +105 -0
  30. package/dist/commands/logs.js.map +1 -0
  31. package/dist/commands/scale.d.ts +3 -0
  32. package/dist/commands/scale.d.ts.map +1 -0
  33. package/dist/commands/scale.js +45 -0
  34. package/dist/commands/scale.js.map +1 -0
  35. package/dist/commands/status.d.ts +3 -0
  36. package/dist/commands/status.d.ts.map +1 -0
  37. package/dist/commands/status.js +85 -0
  38. package/dist/commands/status.js.map +1 -0
  39. package/dist/commands/whoami.d.ts +3 -0
  40. package/dist/commands/whoami.d.ts.map +1 -0
  41. package/dist/commands/whoami.js +46 -0
  42. package/dist/commands/whoami.js.map +1 -0
  43. package/dist/index.d.ts +3 -0
  44. package/dist/index.d.ts.map +1 -0
  45. package/dist/index.js +5 -0
  46. package/dist/index.js.map +1 -0
  47. package/dist/lib/api-client.d.ts +21 -0
  48. package/dist/lib/api-client.d.ts.map +1 -0
  49. package/dist/lib/api-client.js +220 -0
  50. package/dist/lib/api-client.js.map +1 -0
  51. package/dist/lib/archive.d.ts +8 -0
  52. package/dist/lib/archive.d.ts.map +1 -0
  53. package/dist/lib/archive.js +96 -0
  54. package/dist/lib/archive.js.map +1 -0
  55. package/dist/lib/config.d.ts +12 -0
  56. package/dist/lib/config.d.ts.map +1 -0
  57. package/dist/lib/config.js +79 -0
  58. package/dist/lib/config.js.map +1 -0
  59. package/dist/lib/logger.d.ts +15 -0
  60. package/dist/lib/logger.d.ts.map +1 -0
  61. package/dist/lib/logger.js +54 -0
  62. package/dist/lib/logger.js.map +1 -0
  63. package/dist/lib/nx-generator.d.ts +8 -0
  64. package/dist/lib/nx-generator.d.ts.map +1 -0
  65. package/dist/lib/nx-generator.js +146 -0
  66. package/dist/lib/nx-generator.js.map +1 -0
  67. package/dist/templates/application-additions/.forgecartignore +37 -0
  68. package/dist/templates/application-additions/Procfile +1 -0
  69. package/dist/templates/application-additions/src/services/price-fetcher.service.ts +72 -0
  70. package/dist/templates/storefront-additions/.forgecartignore +40 -0
  71. package/dist/templates/storefront-additions/Procfile +1 -0
  72. package/dist/templates/storefront-additions/src/app/products/page.tsx +78 -0
  73. package/dist/templates/storefront-additions/src/lib/forgecart.ts +11 -0
  74. package/dist/types/index.d.ts +70 -0
  75. package/dist/types/index.d.ts.map +1 -0
  76. package/dist/types/index.js +14 -0
  77. package/dist/types/index.js.map +1 -0
  78. package/dist/utils/spinner.d.ts +4 -0
  79. package/dist/utils/spinner.d.ts.map +1 -0
  80. package/dist/utils/spinner.js +20 -0
  81. package/dist/utils/spinner.js.map +1 -0
  82. package/dist/utils/validation.d.ts +12 -0
  83. package/dist/utils/validation.d.ts.map +1 -0
  84. package/dist/utils/validation.js +66 -0
  85. package/dist/utils/validation.js.map +1 -0
  86. package/package.json +52 -0
  87. package/templates/application-additions/.forgecartignore +37 -0
  88. package/templates/application-additions/Procfile +1 -0
  89. package/templates/application-additions/src/services/price-fetcher.service.ts +72 -0
  90. package/templates/storefront-additions/.forgecartignore +40 -0
  91. package/templates/storefront-additions/Procfile +1 -0
  92. package/templates/storefront-additions/src/app/products/page.tsx +78 -0
  93. package/templates/storefront-additions/src/lib/forgecart.ts +11 -0
package/README.md ADDED
@@ -0,0 +1,179 @@
1
+ # @forgecart/cli
2
+
3
+ CLI tool for deploying applications to ForgéCart's PaaS platform.
4
+
5
+ ## Installation
6
+
7
+ ```bash
8
+ npm install -g @forgecart/cli
9
+ ```
10
+
11
+ ## Quick Start
12
+
13
+ 1. **Create a new project:**
14
+ ```bash
15
+ forgecart init my-store
16
+ ```
17
+
18
+ 2. **Deploy:**
19
+ ```bash
20
+ cd my-store
21
+ forgecart deploy
22
+ ```
23
+
24
+ ## Commands
25
+
26
+ ### `forgecart init [name]`
27
+
28
+ Create a new ForgéCart project.
29
+
30
+ Options:
31
+ - `-t, --token <token>` - ForgéCart channel token
32
+ - `-a, --application` - Include NestJS backend application
33
+ - `--api-url <url>` - ForgéCart API URL (default: https://api.forgecart.com)
34
+
35
+ ### `forgecart init:application`
36
+
37
+ Add a NestJS backend application to an existing project.
38
+
39
+ ### `forgecart deploy`
40
+
41
+ Deploy the current application.
42
+
43
+ Options:
44
+ - `--skip-build` - Skip the build step
45
+
46
+ ### `forgecart list`
47
+
48
+ List all deployments for the current channel.
49
+
50
+ ### `forgecart status [type]`
51
+
52
+ Show detailed deployment status.
53
+
54
+ Arguments:
55
+ - `type` - Deployment type: `storefront` or `application`
56
+
57
+ ### `forgecart logs [type]`
58
+
59
+ View deployment logs.
60
+
61
+ Arguments:
62
+ - `type` - Deployment type (default: `storefront`)
63
+
64
+ Options:
65
+ - `-f, --follow` - Follow log output
66
+ - `-n, --lines <number>` - Number of lines to show (default: 100)
67
+
68
+ ### `forgecart delete <type>`
69
+
70
+ Delete a deployment.
71
+
72
+ Arguments:
73
+ - `type` - Deployment type: `storefront` or `application`
74
+
75
+ Options:
76
+ - `-f, --force` - Skip confirmation prompt
77
+
78
+ ### `forgecart scale <type> <instances>`
79
+
80
+ Scale a deployment.
81
+
82
+ Arguments:
83
+ - `type` - Deployment type: `storefront` or `application`
84
+ - `instances` - Number of instances (0-10)
85
+
86
+ ### `forgecart env`
87
+
88
+ Manage environment variables.
89
+
90
+ Subcommands:
91
+ - `forgecart env get <type>` - Get environment variables
92
+ - `forgecart env set <type> <key> <value>` - Set an environment variable
93
+ - `forgecart env unset <type> <key>` - Remove an environment variable
94
+
95
+ ### `forgecart whoami`
96
+
97
+ Show current channel information.
98
+
99
+ ## Project Structure
100
+
101
+ After running `forgecart init`, your project will have the following structure:
102
+
103
+ ```
104
+ my-store/
105
+ ├── .forgecart/
106
+ │ └── config.json # ForgéCart configuration
107
+ ├── nx.json # NX workspace configuration
108
+ ├── package.json # Root package.json
109
+ ├── tsconfig.base.json # TypeScript configuration
110
+ ├── apps/
111
+ │ ├── storefront/ # Next.js frontend (required)
112
+ │ │ ├── src/
113
+ │ │ │ ├── lib/
114
+ │ │ │ │ └── forgecart.ts # SDK client
115
+ │ │ │ └── app/
116
+ │ │ │ └── products/
117
+ │ │ │ └── page.tsx # Example products page
118
+ │ │ ├── Procfile # Deployment configuration
119
+ │ │ └── .forgecartignore # Files to exclude from deploy
120
+ │ └── application/ # NestJS backend (optional)
121
+ │ ├── src/
122
+ │ │ └── services/
123
+ │ │ └── price-fetcher.service.ts # SDK example
124
+ │ ├── Procfile # Deployment configuration
125
+ │ └── .forgecartignore # Files to exclude from deploy
126
+ └── libs/ # Shared libraries (optional)
127
+ ```
128
+
129
+ ## Configuration
130
+
131
+ The CLI stores configuration in `.forgecart/config.json`:
132
+
133
+ ```json
134
+ {
135
+ "version": "1.0",
136
+ "channelToken": "your-channel-token",
137
+ "apiUrl": "https://api.forgecart.com",
138
+ "hasApplication": false,
139
+ "storefrontPath": "apps/storefront",
140
+ "applicationPath": "apps/application"
141
+ }
142
+ ```
143
+
144
+ ## Environment Variables
145
+
146
+ Set environment variables for your deployments:
147
+
148
+ ```bash
149
+ # Set SDK credentials
150
+ forgecart env set storefront FORGECART_CHANNEL_TOKEN your-token
151
+ forgecart env set storefront FORGECART_API_URL https://api.forgecart.com
152
+
153
+ # View all environment variables
154
+ forgecart env get storefront
155
+
156
+ # Remove an environment variable
157
+ forgecart env unset storefront MY_VAR
158
+ ```
159
+
160
+ ## Deployment Workflow
161
+
162
+ 1. Make changes to your code
163
+ 2. Run `forgecart deploy` from your project root or app directory
164
+ 3. The CLI will:
165
+ - Build your application using NX
166
+ - Create a deployment archive
167
+ - Upload and deploy to ForgéCart
168
+ - Wait for the deployment to be ready
169
+ 4. View your live application at the provided URL
170
+
171
+ ## Requirements
172
+
173
+ - Node.js >= 18.0.0
174
+ - npm or yarn
175
+ - A ForgéCart account with a valid channel token
176
+
177
+ ## License
178
+
179
+ MIT
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+
3
+ import('../dist/index.js');
package/dist/cli.d.ts ADDED
@@ -0,0 +1,3 @@
1
+ import { Command } from 'commander';
2
+ export declare function createProgram(): Command;
3
+ //# sourceMappingURL=cli.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAWnC,wBAAgB,aAAa,IAAI,OAAO,CAqBvC"}
package/dist/cli.js ADDED
@@ -0,0 +1,30 @@
1
+ import { Command } from 'commander';
2
+ import { createInitCommand, createInitApplicationCommand } from './commands/init.js';
3
+ import { createDeployCommand } from './commands/deploy.js';
4
+ import { createListCommand } from './commands/list.js';
5
+ import { createStatusCommand } from './commands/status.js';
6
+ import { createDeleteCommand } from './commands/delete.js';
7
+ import { createScaleCommand } from './commands/scale.js';
8
+ import { createEnvCommand } from './commands/env.js';
9
+ import { createLogsCommand } from './commands/logs.js';
10
+ import { createWhoamiCommand } from './commands/whoami.js';
11
+ export function createProgram() {
12
+ const program = new Command();
13
+ program
14
+ .name('forgecart')
15
+ .description('CLI tool for deploying applications to ForgéCart')
16
+ .version('1.0.0');
17
+ // Add commands
18
+ program.addCommand(createInitCommand());
19
+ program.addCommand(createInitApplicationCommand());
20
+ program.addCommand(createDeployCommand());
21
+ program.addCommand(createListCommand());
22
+ program.addCommand(createStatusCommand());
23
+ program.addCommand(createDeleteCommand());
24
+ program.addCommand(createScaleCommand());
25
+ program.addCommand(createEnvCommand());
26
+ program.addCommand(createLogsCommand());
27
+ program.addCommand(createWhoamiCommand());
28
+ return program;
29
+ }
30
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AACnC,OAAO,EAAE,iBAAiB,EAAE,4BAA4B,EAAE,MAAM,oBAAoB,CAAA;AACpF,OAAO,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAA;AAC1D,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAA;AACtD,OAAO,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAA;AAC1D,OAAO,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAA;AAC1D,OAAO,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAA;AACxD,OAAO,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAA;AACpD,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAA;AACtD,OAAO,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAA;AAE1D,MAAM,UAAU,aAAa;IAC3B,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAA;IAE7B,OAAO;SACJ,IAAI,CAAC,WAAW,CAAC;SACjB,WAAW,CAAC,kDAAkD,CAAC;SAC/D,OAAO,CAAC,OAAO,CAAC,CAAA;IAEnB,eAAe;IACf,OAAO,CAAC,UAAU,CAAC,iBAAiB,EAAE,CAAC,CAAA;IACvC,OAAO,CAAC,UAAU,CAAC,4BAA4B,EAAE,CAAC,CAAA;IAClD,OAAO,CAAC,UAAU,CAAC,mBAAmB,EAAE,CAAC,CAAA;IACzC,OAAO,CAAC,UAAU,CAAC,iBAAiB,EAAE,CAAC,CAAA;IACvC,OAAO,CAAC,UAAU,CAAC,mBAAmB,EAAE,CAAC,CAAA;IACzC,OAAO,CAAC,UAAU,CAAC,mBAAmB,EAAE,CAAC,CAAA;IACzC,OAAO,CAAC,UAAU,CAAC,kBAAkB,EAAE,CAAC,CAAA;IACxC,OAAO,CAAC,UAAU,CAAC,gBAAgB,EAAE,CAAC,CAAA;IACtC,OAAO,CAAC,UAAU,CAAC,iBAAiB,EAAE,CAAC,CAAA;IACvC,OAAO,CAAC,UAAU,CAAC,mBAAmB,EAAE,CAAC,CAAA;IAEzC,OAAO,OAAO,CAAA;AAChB,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { Command } from 'commander';
2
+ export declare function createDeleteCommand(): Command;
3
+ //# sourceMappingURL=delete.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"delete.d.ts","sourceRoot":"","sources":["../../src/commands/delete.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAQnC,wBAAgB,mBAAmB,IAAI,OAAO,CAU7C"}
@@ -0,0 +1,55 @@
1
+ import { Command } from 'commander';
2
+ import inquirer from 'inquirer';
3
+ import logger from '../lib/logger.js';
4
+ import { requireConfig } from '../lib/config.js';
5
+ import { ForgecartApiClient } from '../lib/api-client.js';
6
+ import { DeploymentType } from '../types/index.js';
7
+ import { withSpinner } from '../utils/spinner.js';
8
+ export function createDeleteCommand() {
9
+ const cmd = new Command('delete')
10
+ .description('Delete a deployment')
11
+ .argument('<type>', 'Deployment type (storefront or application)')
12
+ .option('-f, --force', 'Skip confirmation prompt')
13
+ .action(async (type, options) => {
14
+ await deleteDeployment(type, options);
15
+ });
16
+ return cmd;
17
+ }
18
+ async function deleteDeployment(type, options) {
19
+ // Validate type
20
+ if (type !== DeploymentType.STOREFRONT && type !== DeploymentType.APPLICATION) {
21
+ logger.error('Invalid deployment type. Use "storefront" or "application".');
22
+ process.exit(1);
23
+ }
24
+ const config = requireConfig();
25
+ const apiClient = new ForgecartApiClient(config.apiUrl, config.channelToken);
26
+ // Check if deployment exists
27
+ const deployment = await apiClient.getDeployment(type);
28
+ if (!deployment) {
29
+ logger.error(`No ${type} deployment found`);
30
+ process.exit(1);
31
+ }
32
+ // Confirm deletion
33
+ if (!options.force) {
34
+ const { confirm } = await inquirer.prompt([
35
+ {
36
+ type: 'confirm',
37
+ name: 'confirm',
38
+ message: `Are you sure you want to delete the ${type} deployment? This action cannot be undone.`,
39
+ default: false,
40
+ },
41
+ ]);
42
+ if (!confirm) {
43
+ logger.info('Deletion cancelled');
44
+ return;
45
+ }
46
+ }
47
+ // Delete deployment
48
+ await withSpinner(`Deleting ${type} deployment...`, `${type} deployment deleted`, `Failed to delete ${type} deployment`, async () => {
49
+ const success = await apiClient.deleteDeployment(type);
50
+ if (!success) {
51
+ throw new Error('Deletion failed');
52
+ }
53
+ });
54
+ }
55
+ //# sourceMappingURL=delete.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"delete.js","sourceRoot":"","sources":["../../src/commands/delete.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AACnC,OAAO,QAAQ,MAAM,UAAU,CAAA;AAC/B,OAAO,MAAM,MAAM,kBAAkB,CAAA;AACrC,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAA;AAChD,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAA;AACzD,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAA;AAClD,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAA;AAEjD,MAAM,UAAU,mBAAmB;IACjC,MAAM,GAAG,GAAG,IAAI,OAAO,CAAC,QAAQ,CAAC;SAC9B,WAAW,CAAC,qBAAqB,CAAC;SAClC,QAAQ,CAAC,QAAQ,EAAE,6CAA6C,CAAC;SACjE,MAAM,CAAC,aAAa,EAAE,0BAA0B,CAAC;SACjD,MAAM,CAAC,KAAK,EAAE,IAAY,EAAE,OAA4B,EAAE,EAAE;QAC3D,MAAM,gBAAgB,CAAC,IAAsB,EAAE,OAAO,CAAC,CAAA;IACzD,CAAC,CAAC,CAAA;IAEJ,OAAO,GAAG,CAAA;AACZ,CAAC;AAED,KAAK,UAAU,gBAAgB,CAC7B,IAAoB,EACpB,OAA4B;IAE5B,gBAAgB;IAChB,IAAI,IAAI,KAAK,cAAc,CAAC,UAAU,IAAI,IAAI,KAAK,cAAc,CAAC,WAAW,EAAE,CAAC;QAC9E,MAAM,CAAC,KAAK,CAAC,6DAA6D,CAAC,CAAA;QAC3E,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IACjB,CAAC;IAED,MAAM,MAAM,GAAG,aAAa,EAAE,CAAA;IAC9B,MAAM,SAAS,GAAG,IAAI,kBAAkB,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,YAAY,CAAC,CAAA;IAE5E,6BAA6B;IAC7B,MAAM,UAAU,GAAG,MAAM,SAAS,CAAC,aAAa,CAAC,IAAI,CAAC,CAAA;IACtD,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,MAAM,CAAC,KAAK,CAAC,MAAM,IAAI,mBAAmB,CAAC,CAAA;QAC3C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IACjB,CAAC;IAED,mBAAmB;IACnB,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;QACnB,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,QAAQ,CAAC,MAAM,CAAC;YACxC;gBACE,IAAI,EAAE,SAAS;gBACf,IAAI,EAAE,SAAS;gBACf,OAAO,EAAE,uCAAuC,IAAI,4CAA4C;gBAChG,OAAO,EAAE,KAAK;aACf;SACF,CAAC,CAAA;QAEF,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,MAAM,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAA;YACjC,OAAM;QACR,CAAC;IACH,CAAC;IAED,oBAAoB;IACpB,MAAM,WAAW,CACf,YAAY,IAAI,gBAAgB,EAChC,GAAG,IAAI,qBAAqB,EAC5B,oBAAoB,IAAI,aAAa,EACrC,KAAK,IAAI,EAAE;QACT,MAAM,OAAO,GAAG,MAAM,SAAS,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAA;QACtD,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,MAAM,IAAI,KAAK,CAAC,iBAAiB,CAAC,CAAA;QACpC,CAAC;IACH,CAAC,CACF,CAAA;AACH,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { Command } from 'commander';
2
+ export declare function createDeployCommand(): Command;
3
+ //# sourceMappingURL=deploy.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deploy.d.ts","sourceRoot":"","sources":["../../src/commands/deploy.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAUnC,wBAAgB,mBAAmB,IAAI,OAAO,CAS7C"}
@@ -0,0 +1,128 @@
1
+ import * as path from 'path';
2
+ import { Command } from 'commander';
3
+ import logger from '../lib/logger.js';
4
+ import { requireConfig, getProjectRoot } from '../lib/config.js';
5
+ import { ForgecartApiClient } from '../lib/api-client.js';
6
+ import { createArchive, getIgnoreFileForType } from '../lib/archive.js';
7
+ import { runNxBuild } from '../lib/nx-generator.js';
8
+ import { detectProjectType, getCurrentAppDir } from '../utils/validation.js';
9
+ import { withSpinner } from '../utils/spinner.js';
10
+ import { DeploymentType } from '../types/index.js';
11
+ export function createDeployCommand() {
12
+ const cmd = new Command('deploy')
13
+ .description('Deploy the current application')
14
+ .option('--skip-build', 'Skip the build step')
15
+ .action(async (options) => {
16
+ await deploy(options);
17
+ });
18
+ return cmd;
19
+ }
20
+ async function deploy(options) {
21
+ logger.title('ForgéCart Deployment');
22
+ // Get config and validate
23
+ const config = requireConfig();
24
+ const projectRoot = getProjectRoot();
25
+ const cwd = process.cwd();
26
+ // Determine what we're deploying
27
+ let deployType;
28
+ let appDir;
29
+ // Check if we're in a specific app directory
30
+ const currentApp = getCurrentAppDir(projectRoot);
31
+ if (currentApp) {
32
+ deployType = currentApp.type;
33
+ appDir = path.join(projectRoot, `apps/${deployType}`);
34
+ logger.info(`Detected ${deployType} application`);
35
+ }
36
+ else {
37
+ // We're in project root - detect type or default to storefront
38
+ const storefrontPath = path.join(projectRoot, config.storefrontPath);
39
+ const type = detectProjectType(storefrontPath);
40
+ if (type === DeploymentType.STOREFRONT) {
41
+ deployType = DeploymentType.STOREFRONT;
42
+ appDir = storefrontPath;
43
+ logger.info('Deploying storefront');
44
+ }
45
+ else {
46
+ logger.error('Cannot determine what to deploy. Please run from apps/storefront or apps/application directory.');
47
+ process.exit(1);
48
+ }
49
+ }
50
+ // Validate that the app exists
51
+ const appType = detectProjectType(appDir);
52
+ if (!appType) {
53
+ logger.error(`No valid application found in ${appDir}`);
54
+ process.exit(1);
55
+ }
56
+ // Initialize API client
57
+ const apiClient = new ForgecartApiClient(config.apiUrl, config.channelToken);
58
+ // Validate token
59
+ await withSpinner('Validating channel token...', 'Channel token validated', 'Invalid channel token', async () => {
60
+ const isValid = await apiClient.validateChannelToken();
61
+ if (!isValid) {
62
+ throw new Error('Invalid channel token');
63
+ }
64
+ });
65
+ // Check/create deployment
66
+ let deployment = await withSpinner('Checking deployment status...', 'Deployment ready', 'Failed to check deployment', async () => {
67
+ let dep = await apiClient.getDeployment(deployType);
68
+ if (!dep) {
69
+ logger.info('Creating new deployment...');
70
+ dep = await apiClient.createDeployment(deployType);
71
+ }
72
+ return dep;
73
+ });
74
+ // Build the app
75
+ if (!options.skipBuild) {
76
+ await withSpinner(`Building ${deployType}...`, 'Build completed', 'Build failed', async () => {
77
+ const success = await runNxBuild(deployType, projectRoot);
78
+ if (!success) {
79
+ throw new Error('Build failed');
80
+ }
81
+ });
82
+ }
83
+ else {
84
+ logger.info('Skipping build step');
85
+ }
86
+ // Create archive
87
+ const zipBuffer = await withSpinner('Creating deployment archive...', 'Archive created', 'Failed to create archive', async () => {
88
+ const ignoreFile = getIgnoreFileForType(deployType);
89
+ return createArchive({
90
+ sourceDir: appDir,
91
+ ignoreFile,
92
+ });
93
+ });
94
+ logger.info(`Archive size: ${(zipBuffer.length / 1024 / 1024).toFixed(2)} MB`);
95
+ // Upload and deploy
96
+ deployment = await withSpinner('Uploading and deploying...', 'Deployment successful', 'Deployment failed', async () => {
97
+ return apiClient.uploadAndDeploy(deployType, zipBuffer);
98
+ });
99
+ // Wait for deployment to be ready
100
+ await withSpinner('Waiting for deployment to be ready...', 'Deployment is live', 'Deployment check failed', async () => {
101
+ let attempts = 0;
102
+ const maxAttempts = 60; // 5 minutes max
103
+ while (attempts < maxAttempts) {
104
+ const status = await apiClient.refreshDeploymentStatus(deployType);
105
+ if (status?.status === 'RUNNING') {
106
+ deployment = status;
107
+ return;
108
+ }
109
+ if (status?.status === 'ERROR') {
110
+ throw new Error(status.errorMessage || 'Deployment failed');
111
+ }
112
+ await new Promise((resolve) => setTimeout(resolve, 5000));
113
+ attempts++;
114
+ }
115
+ throw new Error('Deployment timed out');
116
+ });
117
+ // Success message
118
+ logger.newline();
119
+ logger.box(`Deployment successful!
120
+
121
+ Type: ${deployType}
122
+ Status: ${deployment.status}
123
+ URL: ${deployment.url}
124
+
125
+ View logs with:
126
+ forgecart logs ${deployType}`);
127
+ }
128
+ //# sourceMappingURL=deploy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deploy.js","sourceRoot":"","sources":["../../src/commands/deploy.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { Command } from 'commander';
2
+ export declare function createEnvCommand(): Command;
3
+ //# sourceMappingURL=env.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"env.d.ts","sourceRoot":"","sources":["../../src/commands/env.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAQnC,wBAAgB,gBAAgB,IAAI,OAAO,CA0B1C"}
@@ -0,0 +1,100 @@
1
+ import { Command } from 'commander';
2
+ import Table from 'cli-table3';
3
+ import logger from '../lib/logger.js';
4
+ import { requireConfig } from '../lib/config.js';
5
+ import { ForgecartApiClient } from '../lib/api-client.js';
6
+ import { DeploymentType } from '../types/index.js';
7
+ import { withSpinner } from '../utils/spinner.js';
8
+ export function createEnvCommand() {
9
+ const cmd = new Command('env')
10
+ .description('Manage environment variables');
11
+ cmd
12
+ .command('get <type>')
13
+ .description('Get environment variables for a deployment')
14
+ .action(async (type) => {
15
+ await getEnv(type);
16
+ });
17
+ cmd
18
+ .command('set <type> <key> <value>')
19
+ .description('Set an environment variable')
20
+ .action(async (type, key, value) => {
21
+ await setEnv(type, key, value);
22
+ });
23
+ cmd
24
+ .command('unset <type> <key>')
25
+ .description('Remove an environment variable')
26
+ .action(async (type, key) => {
27
+ await unsetEnv(type, key);
28
+ });
29
+ return cmd;
30
+ }
31
+ async function getEnv(type) {
32
+ // Validate type
33
+ if (type !== DeploymentType.STOREFRONT && type !== DeploymentType.APPLICATION) {
34
+ logger.error('Invalid deployment type. Use "storefront" or "application".');
35
+ process.exit(1);
36
+ }
37
+ const config = requireConfig();
38
+ const apiClient = new ForgecartApiClient(config.apiUrl, config.channelToken);
39
+ const env = await withSpinner(`Fetching environment variables for ${type}...`, 'Environment variables retrieved', 'Failed to fetch environment variables', async () => {
40
+ return apiClient.getDeploymentEnv(type);
41
+ });
42
+ if (env.length === 0) {
43
+ logger.info(`No environment variables set for ${type}`);
44
+ return;
45
+ }
46
+ const table = new Table({
47
+ head: ['Key', 'Value'],
48
+ style: {
49
+ head: ['cyan'],
50
+ },
51
+ });
52
+ for (const item of env) {
53
+ // Mask sensitive values
54
+ const displayValue = item.key.toLowerCase().includes('secret') ||
55
+ item.key.toLowerCase().includes('password') ||
56
+ item.key.toLowerCase().includes('key')
57
+ ? '********'
58
+ : item.value;
59
+ table.push([item.key, displayValue]);
60
+ }
61
+ console.log(table.toString());
62
+ }
63
+ async function setEnv(type, key, value) {
64
+ // Validate type
65
+ if (type !== DeploymentType.STOREFRONT && type !== DeploymentType.APPLICATION) {
66
+ logger.error('Invalid deployment type. Use "storefront" or "application".');
67
+ process.exit(1);
68
+ }
69
+ // Validate key
70
+ if (!key || !/^[A-Z_][A-Z0-9_]*$/i.test(key)) {
71
+ logger.error('Invalid environment variable name. Use only letters, numbers, and underscores.');
72
+ process.exit(1);
73
+ }
74
+ const config = requireConfig();
75
+ const apiClient = new ForgecartApiClient(config.apiUrl, config.channelToken);
76
+ await withSpinner(`Setting ${key} for ${type}...`, `${key} set successfully`, `Failed to set ${key}`, async () => {
77
+ const success = await apiClient.setDeploymentEnv(type, key, value);
78
+ if (!success) {
79
+ throw new Error('Failed to set environment variable');
80
+ }
81
+ });
82
+ logger.info('Note: The deployment may need to be restarted for changes to take effect.');
83
+ }
84
+ async function unsetEnv(type, key) {
85
+ // Validate type
86
+ if (type !== DeploymentType.STOREFRONT && type !== DeploymentType.APPLICATION) {
87
+ logger.error('Invalid deployment type. Use "storefront" or "application".');
88
+ process.exit(1);
89
+ }
90
+ const config = requireConfig();
91
+ const apiClient = new ForgecartApiClient(config.apiUrl, config.channelToken);
92
+ await withSpinner(`Removing ${key} from ${type}...`, `${key} removed successfully`, `Failed to remove ${key}`, async () => {
93
+ const success = await apiClient.unsetDeploymentEnv(type, key);
94
+ if (!success) {
95
+ throw new Error('Failed to remove environment variable');
96
+ }
97
+ });
98
+ logger.info('Note: The deployment may need to be restarted for changes to take effect.');
99
+ }
100
+ //# sourceMappingURL=env.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"env.js","sourceRoot":"","sources":["../../src/commands/env.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import { Command } from 'commander';
2
+ export declare function createInitCommand(): Command;
3
+ export declare function createInitApplicationCommand(): Command;
4
+ //# sourceMappingURL=init.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAsBnC,wBAAgB,iBAAiB,IAAI,OAAO,CAY3C;AAED,wBAAgB,4BAA4B,IAAI,OAAO,CAQtD"}