@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.
- package/README.md +179 -0
- package/bin/forgecart.js +3 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +30 -0
- package/dist/cli.js.map +1 -0
- package/dist/commands/delete.d.ts +3 -0
- package/dist/commands/delete.d.ts.map +1 -0
- package/dist/commands/delete.js +55 -0
- package/dist/commands/delete.js.map +1 -0
- package/dist/commands/deploy.d.ts +3 -0
- package/dist/commands/deploy.d.ts.map +1 -0
- package/dist/commands/deploy.js +128 -0
- package/dist/commands/deploy.js.map +1 -0
- package/dist/commands/env.d.ts +3 -0
- package/dist/commands/env.d.ts.map +1 -0
- package/dist/commands/env.js +100 -0
- package/dist/commands/env.js.map +1 -0
- package/dist/commands/init.d.ts +4 -0
- package/dist/commands/init.d.ts.map +1 -0
- package/dist/commands/init.js +233 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/list.d.ts +3 -0
- package/dist/commands/list.d.ts.map +1 -0
- package/dist/commands/list.js +61 -0
- package/dist/commands/list.js.map +1 -0
- package/dist/commands/logs.d.ts +3 -0
- package/dist/commands/logs.d.ts.map +1 -0
- package/dist/commands/logs.js +105 -0
- package/dist/commands/logs.js.map +1 -0
- package/dist/commands/scale.d.ts +3 -0
- package/dist/commands/scale.d.ts.map +1 -0
- package/dist/commands/scale.js +45 -0
- package/dist/commands/scale.js.map +1 -0
- package/dist/commands/status.d.ts +3 -0
- package/dist/commands/status.d.ts.map +1 -0
- package/dist/commands/status.js +85 -0
- package/dist/commands/status.js.map +1 -0
- package/dist/commands/whoami.d.ts +3 -0
- package/dist/commands/whoami.d.ts.map +1 -0
- package/dist/commands/whoami.js +46 -0
- package/dist/commands/whoami.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +5 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/api-client.d.ts +21 -0
- package/dist/lib/api-client.d.ts.map +1 -0
- package/dist/lib/api-client.js +220 -0
- package/dist/lib/api-client.js.map +1 -0
- package/dist/lib/archive.d.ts +8 -0
- package/dist/lib/archive.d.ts.map +1 -0
- package/dist/lib/archive.js +96 -0
- package/dist/lib/archive.js.map +1 -0
- package/dist/lib/config.d.ts +12 -0
- package/dist/lib/config.d.ts.map +1 -0
- package/dist/lib/config.js +79 -0
- package/dist/lib/config.js.map +1 -0
- package/dist/lib/logger.d.ts +15 -0
- package/dist/lib/logger.d.ts.map +1 -0
- package/dist/lib/logger.js +54 -0
- package/dist/lib/logger.js.map +1 -0
- package/dist/lib/nx-generator.d.ts +8 -0
- package/dist/lib/nx-generator.d.ts.map +1 -0
- package/dist/lib/nx-generator.js +146 -0
- package/dist/lib/nx-generator.js.map +1 -0
- package/dist/templates/application-additions/.forgecartignore +37 -0
- package/dist/templates/application-additions/Procfile +1 -0
- package/dist/templates/application-additions/src/services/price-fetcher.service.ts +72 -0
- package/dist/templates/storefront-additions/.forgecartignore +40 -0
- package/dist/templates/storefront-additions/Procfile +1 -0
- package/dist/templates/storefront-additions/src/app/products/page.tsx +78 -0
- package/dist/templates/storefront-additions/src/lib/forgecart.ts +11 -0
- package/dist/types/index.d.ts +70 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +14 -0
- package/dist/types/index.js.map +1 -0
- package/dist/utils/spinner.d.ts +4 -0
- package/dist/utils/spinner.d.ts.map +1 -0
- package/dist/utils/spinner.js +20 -0
- package/dist/utils/spinner.js.map +1 -0
- package/dist/utils/validation.d.ts +12 -0
- package/dist/utils/validation.d.ts.map +1 -0
- package/dist/utils/validation.js +66 -0
- package/dist/utils/validation.js.map +1 -0
- package/package.json +52 -0
- package/templates/application-additions/.forgecartignore +37 -0
- package/templates/application-additions/Procfile +1 -0
- package/templates/application-additions/src/services/price-fetcher.service.ts +72 -0
- package/templates/storefront-additions/.forgecartignore +40 -0
- package/templates/storefront-additions/Procfile +1 -0
- package/templates/storefront-additions/src/app/products/page.tsx +78 -0
- 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
|
package/bin/forgecart.js
ADDED
package/dist/cli.d.ts
ADDED
|
@@ -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
|
package/dist/cli.js.map
ADDED
|
@@ -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 @@
|
|
|
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 @@
|
|
|
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 @@
|
|
|
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 @@
|
|
|
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"}
|