joji 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 +95 -0
- package/dist/commands/deploy.d.ts +5 -0
- package/dist/commands/deploy.d.ts.map +1 -0
- package/dist/commands/deploy.js +113 -0
- package/dist/commands/deploy.js.map +1 -0
- package/dist/commands/domains.d.ts +4 -0
- package/dist/commands/domains.d.ts.map +1 -0
- package/dist/commands/domains.js +80 -0
- package/dist/commands/domains.js.map +1 -0
- package/dist/commands/env.d.ts +4 -0
- package/dist/commands/env.d.ts.map +1 -0
- package/dist/commands/env.js +73 -0
- package/dist/commands/env.js.map +1 -0
- package/dist/commands/login.d.ts +2 -0
- package/dist/commands/login.d.ts.map +1 -0
- package/dist/commands/login.js +53 -0
- package/dist/commands/login.js.map +1 -0
- package/dist/commands/logs.d.ts +4 -0
- package/dist/commands/logs.d.ts.map +1 -0
- package/dist/commands/logs.js +58 -0
- package/dist/commands/logs.js.map +1 -0
- package/dist/commands/projects.d.ts +2 -0
- package/dist/commands/projects.d.ts.map +1 -0
- package/dist/commands/projects.js +39 -0
- package/dist/commands/projects.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +52 -0
- package/dist/index.js.map +1 -0
- package/dist/utils/api-client.d.ts +11 -0
- package/dist/utils/api-client.d.ts.map +1 -0
- package/dist/utils/api-client.js +52 -0
- package/dist/utils/api-client.js.map +1 -0
- package/dist/utils/config.d.ts +13 -0
- package/dist/utils/config.d.ts.map +1 -0
- package/dist/utils/config.js +36 -0
- package/dist/utils/config.js.map +1 -0
- package/package.json +54 -0
package/README.md
ADDED
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
# JoJi CLI
|
|
2
|
+
|
|
3
|
+
Command-line interface for deploying applications to JoJi (AppFlow) platform.
|
|
4
|
+
|
|
5
|
+
## Installation
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
npm install -g joji
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
## Usage
|
|
12
|
+
|
|
13
|
+
### Login
|
|
14
|
+
|
|
15
|
+
```bash
|
|
16
|
+
joji login
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
Authenticate with your JoJi account using your email and password.
|
|
20
|
+
|
|
21
|
+
### Deploy
|
|
22
|
+
|
|
23
|
+
```bash
|
|
24
|
+
joji deploy
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
Deploy the current directory to JoJi. The CLI will:
|
|
28
|
+
- Detect your git repository
|
|
29
|
+
- Find or create a project
|
|
30
|
+
- Create a deployment
|
|
31
|
+
- Stream build logs in real-time
|
|
32
|
+
|
|
33
|
+
**Options:**
|
|
34
|
+
- `-p, --project <id>` - Specify project ID
|
|
35
|
+
- `-b, --branch <name>` - Specify git branch (default: main)
|
|
36
|
+
|
|
37
|
+
### Projects
|
|
38
|
+
|
|
39
|
+
```bash
|
|
40
|
+
joji projects
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
List all your projects.
|
|
44
|
+
|
|
45
|
+
### Environment Variables
|
|
46
|
+
|
|
47
|
+
```bash
|
|
48
|
+
# List environment variables
|
|
49
|
+
joji env list -p <project-id>
|
|
50
|
+
|
|
51
|
+
# Set environment variable
|
|
52
|
+
joji env set KEY=value -p <project-id>
|
|
53
|
+
|
|
54
|
+
# Get environment variable
|
|
55
|
+
joji env get KEY -p <project-id>
|
|
56
|
+
|
|
57
|
+
# Delete environment variable
|
|
58
|
+
joji env delete KEY -p <project-id>
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
### Domains
|
|
62
|
+
|
|
63
|
+
```bash
|
|
64
|
+
# List domains
|
|
65
|
+
joji domains list -p <project-id>
|
|
66
|
+
|
|
67
|
+
# Add domain
|
|
68
|
+
joji domains add example.com -p <project-id>
|
|
69
|
+
|
|
70
|
+
# Delete domain
|
|
71
|
+
joji domains delete example.com -p <project-id>
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
### Logs
|
|
75
|
+
|
|
76
|
+
```bash
|
|
77
|
+
# Stream logs for a deployment
|
|
78
|
+
joji logs <deployment-id> -f
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
## Configuration
|
|
82
|
+
|
|
83
|
+
The CLI stores configuration in:
|
|
84
|
+
- **macOS/Linux**: `~/.config/joji-cli/config.json`
|
|
85
|
+
- **Windows**: `%APPDATA%\joji-cli\config.json`
|
|
86
|
+
|
|
87
|
+
## Requirements
|
|
88
|
+
|
|
89
|
+
- Node.js >= 18.0.0
|
|
90
|
+
- Git repository (for deploy command)
|
|
91
|
+
|
|
92
|
+
## License
|
|
93
|
+
|
|
94
|
+
MIT
|
|
95
|
+
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"deploy.d.ts","sourceRoot":"","sources":["../../src/commands/deploy.ts"],"names":[],"mappings":"AAOA,wBAAsB,MAAM,CAAC,OAAO,EAAE;IAAE,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,iBAsH1E"}
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.deploy = deploy;
|
|
7
|
+
const chalk_1 = __importDefault(require("chalk"));
|
|
8
|
+
const ora_1 = __importDefault(require("ora"));
|
|
9
|
+
const simple_git_1 = __importDefault(require("simple-git"));
|
|
10
|
+
const socket_io_client_1 = require("socket.io-client");
|
|
11
|
+
const api_client_1 = __importDefault(require("../utils/api-client"));
|
|
12
|
+
const config_1 = require("../utils/config");
|
|
13
|
+
async function deploy(options) {
|
|
14
|
+
if (!(0, config_1.isLoggedIn)()) {
|
|
15
|
+
console.error(chalk_1.default.red('❌ Not logged in. Run: joji login'));
|
|
16
|
+
process.exit(1);
|
|
17
|
+
}
|
|
18
|
+
console.log(chalk_1.default.blue('🚀 Deploying to JoJi\n'));
|
|
19
|
+
const spinner = (0, ora_1.default)('Preparing deployment...').start();
|
|
20
|
+
try {
|
|
21
|
+
const git = (0, simple_git_1.default)();
|
|
22
|
+
// Check if in a git repository
|
|
23
|
+
const isRepo = await git.checkIsRepo();
|
|
24
|
+
if (!isRepo) {
|
|
25
|
+
spinner.fail(chalk_1.default.red('Not a git repository'));
|
|
26
|
+
console.log(chalk_1.default.yellow('Initialize git first: git init'));
|
|
27
|
+
process.exit(1);
|
|
28
|
+
}
|
|
29
|
+
// Get current branch
|
|
30
|
+
const branch = options.branch || (await git.branch()).current;
|
|
31
|
+
// Get latest commit
|
|
32
|
+
const log = await git.log(['-1']);
|
|
33
|
+
const commitHash = log.latest?.hash;
|
|
34
|
+
const commitMessage = log.latest?.message;
|
|
35
|
+
spinner.text = 'Creating deployment...';
|
|
36
|
+
// Get or create project
|
|
37
|
+
let projectId = options.project;
|
|
38
|
+
if (!projectId) {
|
|
39
|
+
const remotes = await git.getRemotes(true);
|
|
40
|
+
const origin = remotes.find(r => r.name === 'origin');
|
|
41
|
+
if (!origin?.refs?.fetch) {
|
|
42
|
+
spinner.fail(chalk_1.default.red('No git remote found'));
|
|
43
|
+
console.log(chalk_1.default.yellow('Add a remote: git remote add origin <url>'));
|
|
44
|
+
process.exit(1);
|
|
45
|
+
}
|
|
46
|
+
// Try to find existing project
|
|
47
|
+
const projects = await api_client_1.default.get('/projects');
|
|
48
|
+
const existingProject = projects.data.find((p) => p.repoUrl === origin.refs.fetch);
|
|
49
|
+
if (existingProject) {
|
|
50
|
+
projectId = existingProject.id;
|
|
51
|
+
}
|
|
52
|
+
else {
|
|
53
|
+
// Create new project
|
|
54
|
+
const projectName = origin.refs.fetch.split('/').pop()?.replace('.git', '') || 'my-app';
|
|
55
|
+
const newProject = await api_client_1.default.post('/projects', {
|
|
56
|
+
name: projectName,
|
|
57
|
+
repoUrl: origin.refs.fetch,
|
|
58
|
+
framework: 'vite', // Auto-detect in production
|
|
59
|
+
});
|
|
60
|
+
projectId = newProject.data.id;
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
// Create deployment
|
|
64
|
+
const deployment = await api_client_1.default.post('/deployments', {
|
|
65
|
+
projectId,
|
|
66
|
+
commitHash,
|
|
67
|
+
commitMessage,
|
|
68
|
+
branch,
|
|
69
|
+
});
|
|
70
|
+
const deploymentId = deployment.data.id;
|
|
71
|
+
const deploymentUrl = deployment.data.url;
|
|
72
|
+
spinner.succeed(chalk_1.default.green('✓ Deployment created'));
|
|
73
|
+
console.log(chalk_1.default.gray(`Deployment ID: ${deploymentId}`));
|
|
74
|
+
console.log(chalk_1.default.gray(`URL: ${deploymentUrl}\n`));
|
|
75
|
+
// Connect to WebSocket for real-time logs
|
|
76
|
+
const { apiUrl } = (0, config_1.getConfig)();
|
|
77
|
+
const socket = (0, socket_io_client_1.io)(apiUrl);
|
|
78
|
+
socket.on('connect', () => {
|
|
79
|
+
socket.emit('subscribe-logs', deploymentId);
|
|
80
|
+
});
|
|
81
|
+
console.log(chalk_1.default.blue('📦 Build Logs:\n'));
|
|
82
|
+
socket.on(`log-${deploymentId}`, (log) => {
|
|
83
|
+
const icon = log.level === 'error' ? '❌' : log.level === 'warn' ? '⚠️' : ' ';
|
|
84
|
+
console.log(`${icon} ${log.message}`);
|
|
85
|
+
});
|
|
86
|
+
// Poll deployment status
|
|
87
|
+
const checkStatus = async () => {
|
|
88
|
+
const status = await api_client_1.default.get(`/deployments/${deploymentId}`);
|
|
89
|
+
const currentStatus = status.data.status;
|
|
90
|
+
if (currentStatus === 'ready') {
|
|
91
|
+
socket.disconnect();
|
|
92
|
+
console.log(chalk_1.default.green('\n✅ Deployment successful!'));
|
|
93
|
+
console.log(chalk_1.default.blue(`🌐 ${deploymentUrl}\n`));
|
|
94
|
+
process.exit(0);
|
|
95
|
+
}
|
|
96
|
+
else if (currentStatus === 'error') {
|
|
97
|
+
socket.disconnect();
|
|
98
|
+
console.log(chalk_1.default.red('\n❌ Deployment failed'));
|
|
99
|
+
process.exit(1);
|
|
100
|
+
}
|
|
101
|
+
else {
|
|
102
|
+
setTimeout(checkStatus, 2000);
|
|
103
|
+
}
|
|
104
|
+
};
|
|
105
|
+
setTimeout(checkStatus, 2000);
|
|
106
|
+
}
|
|
107
|
+
catch (error) {
|
|
108
|
+
spinner.fail(chalk_1.default.red('Deployment failed'));
|
|
109
|
+
console.error(chalk_1.default.red(error.response?.data?.error || error.message));
|
|
110
|
+
process.exit(1);
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
//# 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":"domains.d.ts","sourceRoot":"","sources":["../../src/commands/domains.ts"],"names":[],"mappings":"AAIA,wBAAsB,OAAO,CAC3B,MAAM,EAAE,MAAM,EACd,MAAM,CAAC,EAAE,MAAM,EACf,OAAO,CAAC,EAAE;IAAE,OAAO,CAAC,EAAE,MAAM,CAAA;CAAE,iBA+E/B"}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.domains = domains;
|
|
7
|
+
const chalk_1 = __importDefault(require("chalk"));
|
|
8
|
+
const api_client_1 = __importDefault(require("../utils/api-client"));
|
|
9
|
+
const config_1 = require("../utils/config");
|
|
10
|
+
async function domains(action, domain, options) {
|
|
11
|
+
if (!(0, config_1.isLoggedIn)()) {
|
|
12
|
+
console.error(chalk_1.default.red('❌ Not logged in. Run: joji login'));
|
|
13
|
+
process.exit(1);
|
|
14
|
+
}
|
|
15
|
+
if (!options?.project) {
|
|
16
|
+
console.error(chalk_1.default.red('❌ Project ID required'));
|
|
17
|
+
console.log(chalk_1.default.yellow('Usage: joji domains <action> [domain] --project <id>'));
|
|
18
|
+
process.exit(1);
|
|
19
|
+
}
|
|
20
|
+
const projectId = options.project;
|
|
21
|
+
try {
|
|
22
|
+
switch (action) {
|
|
23
|
+
case 'list':
|
|
24
|
+
const response = await api_client_1.default.get(`/domains/project/${projectId}`);
|
|
25
|
+
const domainList = response.data;
|
|
26
|
+
console.log(chalk_1.default.blue('\n🌐 Custom Domains\n'));
|
|
27
|
+
if (domainList.length === 0) {
|
|
28
|
+
console.log(chalk_1.default.gray('No custom domains configured'));
|
|
29
|
+
}
|
|
30
|
+
else {
|
|
31
|
+
domainList.forEach((d) => {
|
|
32
|
+
const statusIcon = d.status === 'active' ? '✓' : '⏳';
|
|
33
|
+
const sslIcon = d.sslStatus === 'active' ? '🔒' : '⏳';
|
|
34
|
+
console.log(`${statusIcon} ${chalk_1.default.green(d.domain)} ${sslIcon}`);
|
|
35
|
+
console.log(chalk_1.default.gray(` Status: ${d.status}`));
|
|
36
|
+
console.log(chalk_1.default.gray(` SSL: ${d.sslStatus}`));
|
|
37
|
+
console.log();
|
|
38
|
+
});
|
|
39
|
+
}
|
|
40
|
+
break;
|
|
41
|
+
case 'add':
|
|
42
|
+
if (!domain) {
|
|
43
|
+
console.error(chalk_1.default.red('❌ Domain required'));
|
|
44
|
+
console.log(chalk_1.default.yellow('Usage: joji domains add example.com --project <id>'));
|
|
45
|
+
process.exit(1);
|
|
46
|
+
}
|
|
47
|
+
await api_client_1.default.post(`/domains/project/${projectId}`, { domain });
|
|
48
|
+
console.log(chalk_1.default.green(`✓ Domain ${domain} added`));
|
|
49
|
+
console.log(chalk_1.default.yellow('\nConfigure your DNS:'));
|
|
50
|
+
console.log(chalk_1.default.gray(`CNAME ${domain} → <project-slug>.appflow.dev`));
|
|
51
|
+
console.log();
|
|
52
|
+
break;
|
|
53
|
+
case 'delete':
|
|
54
|
+
if (!domain) {
|
|
55
|
+
console.error(chalk_1.default.red('❌ Domain required'));
|
|
56
|
+
console.log(chalk_1.default.yellow('Usage: joji domains delete example.com --project <id>'));
|
|
57
|
+
process.exit(1);
|
|
58
|
+
}
|
|
59
|
+
const domains = await api_client_1.default.get(`/domains/project/${projectId}`);
|
|
60
|
+
const domainObj = domains.data.find((d) => d.domain === domain);
|
|
61
|
+
if (!domainObj) {
|
|
62
|
+
console.error(chalk_1.default.red(`❌ Domain ${domain} not found`));
|
|
63
|
+
process.exit(1);
|
|
64
|
+
}
|
|
65
|
+
await api_client_1.default.delete(`/domains/${domainObj.id}`);
|
|
66
|
+
console.log(chalk_1.default.green(`✓ Domain ${domain} deleted`));
|
|
67
|
+
break;
|
|
68
|
+
default:
|
|
69
|
+
console.error(chalk_1.default.red(`❌ Unknown action: ${action}`));
|
|
70
|
+
console.log(chalk_1.default.yellow('Valid actions: list, add, delete'));
|
|
71
|
+
process.exit(1);
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
catch (error) {
|
|
75
|
+
console.error(chalk_1.default.red('Operation failed'));
|
|
76
|
+
console.error(chalk_1.default.red(error.response?.data?.error || error.message));
|
|
77
|
+
process.exit(1);
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
//# sourceMappingURL=domains.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"domains.js","sourceRoot":"","sources":["../../src/commands/domains.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":"AAIA,wBAAsB,MAAM,CAC1B,MAAM,EAAE,MAAM,EACd,GAAG,CAAC,EAAE,MAAM,EACZ,KAAK,CAAC,EAAE,MAAM,EACd,OAAO,CAAC,EAAE;IAAE,OAAO,CAAC,EAAE,MAAM,CAAA;CAAE,iBAwE/B"}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.envCmd = envCmd;
|
|
7
|
+
const chalk_1 = __importDefault(require("chalk"));
|
|
8
|
+
const api_client_1 = __importDefault(require("../utils/api-client"));
|
|
9
|
+
const config_1 = require("../utils/config");
|
|
10
|
+
async function envCmd(action, key, value, options) {
|
|
11
|
+
if (!(0, config_1.isLoggedIn)()) {
|
|
12
|
+
console.error(chalk_1.default.red('❌ Not logged in. Run: joji login'));
|
|
13
|
+
process.exit(1);
|
|
14
|
+
}
|
|
15
|
+
if (!options?.project) {
|
|
16
|
+
console.error(chalk_1.default.red('❌ Project ID required'));
|
|
17
|
+
console.log(chalk_1.default.yellow('Usage: joji env <action> [key] [value] --project <id>'));
|
|
18
|
+
process.exit(1);
|
|
19
|
+
}
|
|
20
|
+
const projectId = options.project;
|
|
21
|
+
try {
|
|
22
|
+
switch (action) {
|
|
23
|
+
case 'list':
|
|
24
|
+
const response = await api_client_1.default.get(`/env/project/${projectId}`);
|
|
25
|
+
const envVars = response.data;
|
|
26
|
+
console.log(chalk_1.default.blue(`\n📋 Environment Variables\n`));
|
|
27
|
+
if (envVars.length === 0) {
|
|
28
|
+
console.log(chalk_1.default.gray('No environment variables set'));
|
|
29
|
+
}
|
|
30
|
+
else {
|
|
31
|
+
envVars.forEach((env) => {
|
|
32
|
+
console.log(`${chalk_1.default.green(env.key)} = ${chalk_1.default.gray('***')}`);
|
|
33
|
+
});
|
|
34
|
+
}
|
|
35
|
+
console.log();
|
|
36
|
+
break;
|
|
37
|
+
case 'set':
|
|
38
|
+
if (!key || !value) {
|
|
39
|
+
console.error(chalk_1.default.red('❌ Key and value required'));
|
|
40
|
+
console.log(chalk_1.default.yellow('Usage: joji env set KEY value --project <id>'));
|
|
41
|
+
process.exit(1);
|
|
42
|
+
}
|
|
43
|
+
await api_client_1.default.post(`/env/project/${projectId}`, { key, value });
|
|
44
|
+
console.log(chalk_1.default.green(`✓ Set ${key}`));
|
|
45
|
+
break;
|
|
46
|
+
case 'delete':
|
|
47
|
+
if (!key) {
|
|
48
|
+
console.error(chalk_1.default.red('❌ Key required'));
|
|
49
|
+
console.log(chalk_1.default.yellow('Usage: joji env delete KEY --project <id>'));
|
|
50
|
+
process.exit(1);
|
|
51
|
+
}
|
|
52
|
+
const envList = await api_client_1.default.get(`/env/project/${projectId}`);
|
|
53
|
+
const envVar = envList.data.find((e) => e.key === key);
|
|
54
|
+
if (!envVar) {
|
|
55
|
+
console.error(chalk_1.default.red(`❌ Environment variable ${key} not found`));
|
|
56
|
+
process.exit(1);
|
|
57
|
+
}
|
|
58
|
+
await api_client_1.default.delete(`/env/${envVar.id}`);
|
|
59
|
+
console.log(chalk_1.default.green(`✓ Deleted ${key}`));
|
|
60
|
+
break;
|
|
61
|
+
default:
|
|
62
|
+
console.error(chalk_1.default.red(`❌ Unknown action: ${action}`));
|
|
63
|
+
console.log(chalk_1.default.yellow('Valid actions: list, set, delete'));
|
|
64
|
+
process.exit(1);
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
catch (error) {
|
|
68
|
+
console.error(chalk_1.default.red('Operation failed'));
|
|
69
|
+
console.error(chalk_1.default.red(error.response?.data?.error || error.message));
|
|
70
|
+
process.exit(1);
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
//# 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":"login.d.ts","sourceRoot":"","sources":["../../src/commands/login.ts"],"names":[],"mappings":"AAMA,wBAAsB,KAAK,kBA2C1B"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.login = login;
|
|
7
|
+
const inquirer_1 = __importDefault(require("inquirer"));
|
|
8
|
+
const chalk_1 = __importDefault(require("chalk"));
|
|
9
|
+
const ora_1 = __importDefault(require("ora"));
|
|
10
|
+
const api_client_1 = __importDefault(require("../utils/api-client"));
|
|
11
|
+
const config_1 = require("../utils/config");
|
|
12
|
+
async function login() {
|
|
13
|
+
console.log(chalk_1.default.blue('🚀 JoJi Login\n'));
|
|
14
|
+
const answers = await inquirer_1.default.prompt([
|
|
15
|
+
{
|
|
16
|
+
type: 'input',
|
|
17
|
+
name: 'email',
|
|
18
|
+
message: 'Email:',
|
|
19
|
+
validate: (input) => {
|
|
20
|
+
if (!input.includes('@')) {
|
|
21
|
+
return 'Please enter a valid email';
|
|
22
|
+
}
|
|
23
|
+
return true;
|
|
24
|
+
},
|
|
25
|
+
},
|
|
26
|
+
{
|
|
27
|
+
type: 'password',
|
|
28
|
+
name: 'password',
|
|
29
|
+
message: 'Password:',
|
|
30
|
+
mask: '*',
|
|
31
|
+
},
|
|
32
|
+
]);
|
|
33
|
+
const spinner = (0, ora_1.default)('Logging in...').start();
|
|
34
|
+
try {
|
|
35
|
+
const response = await api_client_1.default.post('/auth/login', answers);
|
|
36
|
+
if (response.success) {
|
|
37
|
+
const { token, user } = response.data;
|
|
38
|
+
(0, config_1.setToken)(token, user.id);
|
|
39
|
+
spinner.succeed(chalk_1.default.green(`✓ Logged in as ${user.email}`));
|
|
40
|
+
console.log(chalk_1.default.gray(`\nAPI Key: ${user.apiKey}`));
|
|
41
|
+
console.log(chalk_1.default.gray('You can use this API key for CI/CD deployments\n'));
|
|
42
|
+
}
|
|
43
|
+
else {
|
|
44
|
+
spinner.fail(chalk_1.default.red('Login failed'));
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
catch (error) {
|
|
48
|
+
spinner.fail(chalk_1.default.red('Login failed'));
|
|
49
|
+
console.error(chalk_1.default.red(error.response?.data?.error || error.message));
|
|
50
|
+
process.exit(1);
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
//# sourceMappingURL=login.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"login.js","sourceRoot":"","sources":["../../src/commands/login.ts"],"names":[],"mappings":";;;;;AAMA,sBA2CC;AAjDD,wDAAgC;AAChC,kDAA0B;AAC1B,8CAAsB;AACtB,qEAA4C;AAC5C,4CAA2C;AAEpC,KAAK,UAAU,KAAK;IACzB,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC,CAAC;IAE3C,MAAM,OAAO,GAAG,MAAM,kBAAQ,CAAC,MAAM,CAAC;QACpC;YACE,IAAI,EAAE,OAAO;YACb,IAAI,EAAE,OAAO;YACb,OAAO,EAAE,QAAQ;YACjB,QAAQ,EAAE,CAAC,KAAK,EAAE,EAAE;gBAClB,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;oBACzB,OAAO,4BAA4B,CAAC;gBACtC,CAAC;gBACD,OAAO,IAAI,CAAC;YACd,CAAC;SACF;QACD;YACE,IAAI,EAAE,UAAU;YAChB,IAAI,EAAE,UAAU;YAChB,OAAO,EAAE,WAAW;YACpB,IAAI,EAAE,GAAG;SACV;KACF,CAAC,CAAC;IAEH,MAAM,OAAO,GAAG,IAAA,aAAG,EAAC,eAAe,CAAC,CAAC,KAAK,EAAE,CAAC;IAE7C,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,oBAAS,CAAC,IAAI,CAAC,aAAa,EAAE,OAAO,CAAC,CAAC;QAE9D,IAAI,QAAQ,CAAC,OAAO,EAAE,CAAC;YACrB,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,QAAQ,CAAC,IAAI,CAAC;YACtC,IAAA,iBAAQ,EAAC,KAAK,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC;YAEzB,OAAO,CAAC,OAAO,CAAC,eAAK,CAAC,KAAK,CAAC,kBAAkB,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;YAC7D,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,cAAc,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;YACrD,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,kDAAkD,CAAC,CAAC,CAAC;QAC9E,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,IAAI,CAAC,eAAK,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC,CAAC;QAC1C,CAAC;IACH,CAAC;IAAC,OAAO,KAAU,EAAE,CAAC;QACpB,OAAO,CAAC,IAAI,CAAC,eAAK,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC,CAAC;QACxC,OAAO,CAAC,KAAK,CAAC,eAAK,CAAC,GAAG,CAAC,KAAK,CAAC,QAAQ,EAAE,IAAI,EAAE,KAAK,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;QACvE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logs.d.ts","sourceRoot":"","sources":["../../src/commands/logs.ts"],"names":[],"mappings":"AAKA,wBAAsB,IAAI,CAAC,YAAY,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;IAAE,MAAM,CAAC,EAAE,OAAO,CAAA;CAAE,iBAsD/E"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.logs = logs;
|
|
7
|
+
const chalk_1 = __importDefault(require("chalk"));
|
|
8
|
+
const socket_io_client_1 = require("socket.io-client");
|
|
9
|
+
const api_client_1 = __importDefault(require("../utils/api-client"));
|
|
10
|
+
const config_1 = require("../utils/config");
|
|
11
|
+
async function logs(deploymentId, options) {
|
|
12
|
+
if (!(0, config_1.isLoggedIn)()) {
|
|
13
|
+
console.error(chalk_1.default.red('❌ Not logged in. Run: joji login'));
|
|
14
|
+
process.exit(1);
|
|
15
|
+
}
|
|
16
|
+
if (!deploymentId) {
|
|
17
|
+
console.error(chalk_1.default.red('❌ Deployment ID required'));
|
|
18
|
+
console.log(chalk_1.default.yellow('Usage: joji logs <deployment-id>'));
|
|
19
|
+
process.exit(1);
|
|
20
|
+
}
|
|
21
|
+
try {
|
|
22
|
+
// Fetch existing logs
|
|
23
|
+
const response = await api_client_1.default.get(`/logs/deployment/${deploymentId}`);
|
|
24
|
+
const existingLogs = response.data;
|
|
25
|
+
console.log(chalk_1.default.blue(`📋 Logs for deployment ${deploymentId}\n`));
|
|
26
|
+
existingLogs.forEach((log) => {
|
|
27
|
+
const icon = log.level === 'error' ? '❌' : log.level === 'warn' ? '⚠️' : ' ';
|
|
28
|
+
const timestamp = new Date(log.timestamp).toLocaleTimeString();
|
|
29
|
+
console.log(`${chalk_1.default.gray(timestamp)} ${icon} ${log.message}`);
|
|
30
|
+
});
|
|
31
|
+
// Follow logs if requested
|
|
32
|
+
if (options?.follow) {
|
|
33
|
+
console.log(chalk_1.default.gray('\n--- Following logs (Ctrl+C to exit) ---\n'));
|
|
34
|
+
const { apiUrl } = (0, config_1.getConfig)();
|
|
35
|
+
const socket = (0, socket_io_client_1.io)(apiUrl);
|
|
36
|
+
socket.on('connect', () => {
|
|
37
|
+
socket.emit('subscribe-logs', deploymentId);
|
|
38
|
+
});
|
|
39
|
+
socket.on(`log-${deploymentId}`, (log) => {
|
|
40
|
+
const icon = log.level === 'error' ? '❌' : log.level === 'warn' ? '⚠️' : ' ';
|
|
41
|
+
const timestamp = new Date(log.timestamp).toLocaleTimeString();
|
|
42
|
+
console.log(`${chalk_1.default.gray(timestamp)} ${icon} ${log.message}`);
|
|
43
|
+
});
|
|
44
|
+
// Keep process alive
|
|
45
|
+
process.on('SIGINT', () => {
|
|
46
|
+
socket.disconnect();
|
|
47
|
+
console.log(chalk_1.default.yellow('\n\nDisconnected'));
|
|
48
|
+
process.exit(0);
|
|
49
|
+
});
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
catch (error) {
|
|
53
|
+
console.error(chalk_1.default.red('Failed to fetch logs'));
|
|
54
|
+
console.error(chalk_1.default.red(error.response?.data?.error || error.message));
|
|
55
|
+
process.exit(1);
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
//# sourceMappingURL=logs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logs.js","sourceRoot":"","sources":["../../src/commands/logs.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"projects.d.ts","sourceRoot":"","sources":["../../src/commands/projects.ts"],"names":[],"mappings":"AAIA,wBAAsB,QAAQ,kBA+B7B"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.projects = projects;
|
|
7
|
+
const chalk_1 = __importDefault(require("chalk"));
|
|
8
|
+
const api_client_1 = __importDefault(require("../utils/api-client"));
|
|
9
|
+
const config_1 = require("../utils/config");
|
|
10
|
+
async function projects() {
|
|
11
|
+
if (!(0, config_1.isLoggedIn)()) {
|
|
12
|
+
console.error(chalk_1.default.red('❌ Not logged in. Run: joji login'));
|
|
13
|
+
process.exit(1);
|
|
14
|
+
}
|
|
15
|
+
try {
|
|
16
|
+
const response = await api_client_1.default.get('/projects');
|
|
17
|
+
const projectList = response.data;
|
|
18
|
+
console.log(chalk_1.default.blue('\n📁 Your Projects\n'));
|
|
19
|
+
if (projectList.length === 0) {
|
|
20
|
+
console.log(chalk_1.default.gray('No projects yet. Deploy your first app!'));
|
|
21
|
+
console.log(chalk_1.default.yellow('\nRun: joji deploy\n'));
|
|
22
|
+
return;
|
|
23
|
+
}
|
|
24
|
+
projectList.forEach((project) => {
|
|
25
|
+
console.log(chalk_1.default.green(`• ${project.name}`));
|
|
26
|
+
console.log(chalk_1.default.gray(` ID: ${project.id}`));
|
|
27
|
+
console.log(chalk_1.default.gray(` Framework: ${project.framework}`));
|
|
28
|
+
console.log(chalk_1.default.gray(` Deployments: ${project._count.deployments}`));
|
|
29
|
+
console.log(chalk_1.default.gray(` URL: https://${project.slug}.appflow.dev`));
|
|
30
|
+
console.log();
|
|
31
|
+
});
|
|
32
|
+
}
|
|
33
|
+
catch (error) {
|
|
34
|
+
console.error(chalk_1.default.red('Failed to fetch projects'));
|
|
35
|
+
console.error(chalk_1.default.red(error.response?.data?.error || error.message));
|
|
36
|
+
process.exit(1);
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
//# sourceMappingURL=projects.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"projects.js","sourceRoot":"","sources":["../../src/commands/projects.ts"],"names":[],"mappings":";;;;;AAIA,4BA+BC;AAnCD,kDAA0B;AAC1B,qEAA4C;AAC5C,4CAA6C;AAEtC,KAAK,UAAU,QAAQ;IAC5B,IAAI,CAAC,IAAA,mBAAU,GAAE,EAAE,CAAC;QAClB,OAAO,CAAC,KAAK,CAAC,eAAK,CAAC,GAAG,CAAC,kCAAkC,CAAC,CAAC,CAAC;QAC7D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,oBAAS,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;QAClD,MAAM,WAAW,GAAG,QAAQ,CAAC,IAAI,CAAC;QAElC,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC,CAAC;QAEhD,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC7B,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,yCAAyC,CAAC,CAAC,CAAC;YACnE,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,MAAM,CAAC,sBAAsB,CAAC,CAAC,CAAC;YAClD,OAAO;QACT,CAAC;QAED,WAAW,CAAC,OAAO,CAAC,CAAC,OAAY,EAAE,EAAE;YACnC,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,KAAK,CAAC,KAAK,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;YAC9C,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,SAAS,OAAO,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;YAC/C,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,gBAAgB,OAAO,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC;YAC7D,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,kBAAkB,OAAO,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC;YACxE,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,kBAAkB,OAAO,CAAC,IAAI,cAAc,CAAC,CAAC,CAAC;YACtE,OAAO,CAAC,GAAG,EAAE,CAAC;QAChB,CAAC,CAAC,CAAC;IACL,CAAC;IAAC,OAAO,KAAU,EAAE,CAAC;QACpB,OAAO,CAAC,KAAK,CAAC,eAAK,CAAC,GAAG,CAAC,0BAA0B,CAAC,CAAC,CAAC;QACrD,OAAO,CAAC,KAAK,CAAC,eAAK,CAAC,GAAG,CAAC,KAAK,CAAC,QAAQ,EAAE,IAAI,EAAE,KAAK,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;QACvE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
"use strict";
|
|
3
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
+
const commander_1 = require("commander");
|
|
5
|
+
const login_1 = require("./commands/login");
|
|
6
|
+
const deploy_1 = require("./commands/deploy");
|
|
7
|
+
const logs_1 = require("./commands/logs");
|
|
8
|
+
const env_1 = require("./commands/env");
|
|
9
|
+
const projects_1 = require("./commands/projects");
|
|
10
|
+
const domains_1 = require("./commands/domains");
|
|
11
|
+
const program = new commander_1.Command();
|
|
12
|
+
program
|
|
13
|
+
.name('joji')
|
|
14
|
+
.description('JoJi CLI - Deploy apps to the edge')
|
|
15
|
+
.version('1.0.0');
|
|
16
|
+
program
|
|
17
|
+
.command('login')
|
|
18
|
+
.description('Login to your JoJi account')
|
|
19
|
+
.action(login_1.login);
|
|
20
|
+
program
|
|
21
|
+
.command('deploy')
|
|
22
|
+
.description('Deploy current directory')
|
|
23
|
+
.option('-p, --project <id>', 'Project ID')
|
|
24
|
+
.option('-b, --branch <name>', 'Git branch', 'main')
|
|
25
|
+
.action(deploy_1.deploy);
|
|
26
|
+
program
|
|
27
|
+
.command('logs')
|
|
28
|
+
.description('Stream deployment logs')
|
|
29
|
+
.argument('[deployment-id]', 'Deployment ID')
|
|
30
|
+
.option('-f, --follow', 'Follow log output')
|
|
31
|
+
.action(logs_1.logs);
|
|
32
|
+
program
|
|
33
|
+
.command('env')
|
|
34
|
+
.description('Manage environment variables')
|
|
35
|
+
.argument('<action>', 'Action: list, set, get, delete')
|
|
36
|
+
.argument('[key]', 'Environment variable key')
|
|
37
|
+
.argument('[value]', 'Environment variable value')
|
|
38
|
+
.option('-p, --project <id>', 'Project ID')
|
|
39
|
+
.action(env_1.envCmd);
|
|
40
|
+
program
|
|
41
|
+
.command('projects')
|
|
42
|
+
.description('List all projects')
|
|
43
|
+
.action(projects_1.projects);
|
|
44
|
+
program
|
|
45
|
+
.command('domains')
|
|
46
|
+
.description('Manage custom domains')
|
|
47
|
+
.argument('<action>', 'Action: list, add, delete')
|
|
48
|
+
.argument('[domain]', 'Domain name')
|
|
49
|
+
.option('-p, --project <id>', 'Project ID')
|
|
50
|
+
.action(domains_1.domains);
|
|
51
|
+
program.parse();
|
|
52
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;AAEA,yCAAoC;AACpC,4CAAyC;AACzC,8CAA2C;AAC3C,0CAAuC;AACvC,wCAAwC;AACxC,kDAA+C;AAC/C,gDAA6C;AAE7C,MAAM,OAAO,GAAG,IAAI,mBAAO,EAAE,CAAC;AAE9B,OAAO;KACJ,IAAI,CAAC,MAAM,CAAC;KACZ,WAAW,CAAC,oCAAoC,CAAC;KACjD,OAAO,CAAC,OAAO,CAAC,CAAC;AAEpB,OAAO;KACJ,OAAO,CAAC,OAAO,CAAC;KAChB,WAAW,CAAC,4BAA4B,CAAC;KACzC,MAAM,CAAC,aAAK,CAAC,CAAC;AAEjB,OAAO;KACJ,OAAO,CAAC,QAAQ,CAAC;KACjB,WAAW,CAAC,0BAA0B,CAAC;KACvC,MAAM,CAAC,oBAAoB,EAAE,YAAY,CAAC;KAC1C,MAAM,CAAC,qBAAqB,EAAE,YAAY,EAAE,MAAM,CAAC;KACnD,MAAM,CAAC,eAAM,CAAC,CAAC;AAElB,OAAO;KACJ,OAAO,CAAC,MAAM,CAAC;KACf,WAAW,CAAC,wBAAwB,CAAC;KACrC,QAAQ,CAAC,iBAAiB,EAAE,eAAe,CAAC;KAC5C,MAAM,CAAC,cAAc,EAAE,mBAAmB,CAAC;KAC3C,MAAM,CAAC,WAAI,CAAC,CAAC;AAEhB,OAAO;KACJ,OAAO,CAAC,KAAK,CAAC;KACd,WAAW,CAAC,8BAA8B,CAAC;KAC3C,QAAQ,CAAC,UAAU,EAAE,gCAAgC,CAAC;KACtD,QAAQ,CAAC,OAAO,EAAE,0BAA0B,CAAC;KAC7C,QAAQ,CAAC,SAAS,EAAE,4BAA4B,CAAC;KACjD,MAAM,CAAC,oBAAoB,EAAE,YAAY,CAAC;KAC1C,MAAM,CAAC,YAAM,CAAC,CAAC;AAElB,OAAO;KACJ,OAAO,CAAC,UAAU,CAAC;KACnB,WAAW,CAAC,mBAAmB,CAAC;KAChC,MAAM,CAAC,mBAAQ,CAAC,CAAC;AAEpB,OAAO;KACJ,OAAO,CAAC,SAAS,CAAC;KAClB,WAAW,CAAC,uBAAuB,CAAC;KACpC,QAAQ,CAAC,UAAU,EAAE,2BAA2B,CAAC;KACjD,QAAQ,CAAC,UAAU,EAAE,aAAa,CAAC;KACnC,MAAM,CAAC,oBAAoB,EAAE,YAAY,CAAC;KAC1C,MAAM,CAAC,iBAAO,CAAC,CAAC;AAEnB,OAAO,CAAC,KAAK,EAAE,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
declare class ApiClient {
|
|
2
|
+
private client;
|
|
3
|
+
constructor();
|
|
4
|
+
get(url: string, params?: any): Promise<any>;
|
|
5
|
+
post(url: string, data?: any): Promise<any>;
|
|
6
|
+
patch(url: string, data?: any): Promise<any>;
|
|
7
|
+
delete(url: string): Promise<any>;
|
|
8
|
+
}
|
|
9
|
+
declare const _default: ApiClient;
|
|
10
|
+
export default _default;
|
|
11
|
+
//# sourceMappingURL=api-client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"api-client.d.ts","sourceRoot":"","sources":["../../src/utils/api-client.ts"],"names":[],"mappings":"AAGA,cAAM,SAAS;IACb,OAAO,CAAC,MAAM,CAAgB;;IAiCxB,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,GAAG;IAK7B,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,GAAG;IAK5B,KAAK,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,GAAG;IAK7B,MAAM,CAAC,GAAG,EAAE,MAAM;CAIzB;;AAED,wBAA+B"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
const axios_1 = __importDefault(require("axios"));
|
|
7
|
+
const config_1 = require("./config");
|
|
8
|
+
class ApiClient {
|
|
9
|
+
client;
|
|
10
|
+
constructor() {
|
|
11
|
+
const { apiUrl, token } = (0, config_1.getConfig)();
|
|
12
|
+
this.client = axios_1.default.create({
|
|
13
|
+
baseURL: `${apiUrl}/api`,
|
|
14
|
+
headers: {
|
|
15
|
+
'Content-Type': 'application/json',
|
|
16
|
+
},
|
|
17
|
+
});
|
|
18
|
+
// Add auth token to requests
|
|
19
|
+
this.client.interceptors.request.use((config) => {
|
|
20
|
+
if (token) {
|
|
21
|
+
config.headers.Authorization = `Bearer ${token}`;
|
|
22
|
+
}
|
|
23
|
+
return config;
|
|
24
|
+
});
|
|
25
|
+
// Handle errors
|
|
26
|
+
this.client.interceptors.response.use((response) => response, (error) => {
|
|
27
|
+
if (error.response?.status === 401) {
|
|
28
|
+
console.error('Authentication failed. Please run: joji login');
|
|
29
|
+
process.exit(1);
|
|
30
|
+
}
|
|
31
|
+
throw error;
|
|
32
|
+
});
|
|
33
|
+
}
|
|
34
|
+
async get(url, params) {
|
|
35
|
+
const response = await this.client.get(url, { params });
|
|
36
|
+
return response.data;
|
|
37
|
+
}
|
|
38
|
+
async post(url, data) {
|
|
39
|
+
const response = await this.client.post(url, data);
|
|
40
|
+
return response.data;
|
|
41
|
+
}
|
|
42
|
+
async patch(url, data) {
|
|
43
|
+
const response = await this.client.patch(url, data);
|
|
44
|
+
return response.data;
|
|
45
|
+
}
|
|
46
|
+
async delete(url) {
|
|
47
|
+
const response = await this.client.delete(url);
|
|
48
|
+
return response.data;
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
exports.default = new ApiClient();
|
|
52
|
+
//# sourceMappingURL=api-client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"api-client.js","sourceRoot":"","sources":["../../src/utils/api-client.ts"],"names":[],"mappings":";;;;;AAAA,kDAA6C;AAC7C,qCAAqC;AAErC,MAAM,SAAS;IACL,MAAM,CAAgB;IAE9B;QACE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,IAAA,kBAAS,GAAE,CAAC;QAEtC,IAAI,CAAC,MAAM,GAAG,eAAK,CAAC,MAAM,CAAC;YACzB,OAAO,EAAE,GAAG,MAAM,MAAM;YACxB,OAAO,EAAE;gBACP,cAAc,EAAE,kBAAkB;aACnC;SACF,CAAC,CAAC;QAEH,6BAA6B;QAC7B,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE;YAC9C,IAAI,KAAK,EAAE,CAAC;gBACV,MAAM,CAAC,OAAO,CAAC,aAAa,GAAG,UAAU,KAAK,EAAE,CAAC;YACnD,CAAC;YACD,OAAO,MAAM,CAAC;QAChB,CAAC,CAAC,CAAC;QAEH,gBAAgB;QAChB,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,QAAQ,CAAC,GAAG,CACnC,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,EACtB,CAAC,KAAK,EAAE,EAAE;YACR,IAAI,KAAK,CAAC,QAAQ,EAAE,MAAM,KAAK,GAAG,EAAE,CAAC;gBACnC,OAAO,CAAC,KAAK,CAAC,+CAA+C,CAAC,CAAC;gBAC/D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClB,CAAC;YACD,MAAM,KAAK,CAAC;QACd,CAAC,CACF,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,GAAG,CAAC,GAAW,EAAE,MAAY;QACjC,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC;QACxD,OAAO,QAAQ,CAAC,IAAI,CAAC;IACvB,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,GAAW,EAAE,IAAU;QAChC,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;QACnD,OAAO,QAAQ,CAAC,IAAI,CAAC;IACvB,CAAC;IAED,KAAK,CAAC,KAAK,CAAC,GAAW,EAAE,IAAU;QACjC,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;QACpD,OAAO,QAAQ,CAAC,IAAI,CAAC;IACvB,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,GAAW;QACtB,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QAC/C,OAAO,QAAQ,CAAC,IAAI,CAAC;IACvB,CAAC;CACF;AAED,kBAAe,IAAI,SAAS,EAAE,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import Conf from 'conf';
|
|
2
|
+
interface Config {
|
|
3
|
+
apiUrl: string;
|
|
4
|
+
token?: string;
|
|
5
|
+
userId?: string;
|
|
6
|
+
}
|
|
7
|
+
declare const config: Conf<Config>;
|
|
8
|
+
export declare function getConfig(): Config;
|
|
9
|
+
export declare function setToken(token: string, userId: string): void;
|
|
10
|
+
export declare function clearToken(): void;
|
|
11
|
+
export declare function isLoggedIn(): boolean;
|
|
12
|
+
export default config;
|
|
13
|
+
//# sourceMappingURL=config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/utils/config.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,MAAM,CAAC;AAExB,UAAU,MAAM;IACd,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,QAAA,MAAM,MAAM,cAKV,CAAC;AAEH,wBAAgB,SAAS,IAAI,MAAM,CAMlC;AAED,wBAAgB,QAAQ,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,QAGrD;AAED,wBAAgB,UAAU,SAGzB;AAED,wBAAgB,UAAU,IAAI,OAAO,CAEpC;AAED,eAAe,MAAM,CAAC"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.getConfig = getConfig;
|
|
7
|
+
exports.setToken = setToken;
|
|
8
|
+
exports.clearToken = clearToken;
|
|
9
|
+
exports.isLoggedIn = isLoggedIn;
|
|
10
|
+
const conf_1 = __importDefault(require("conf"));
|
|
11
|
+
const config = new conf_1.default({
|
|
12
|
+
projectName: 'joji-cli',
|
|
13
|
+
defaults: {
|
|
14
|
+
apiUrl: 'https://api.joji.app',
|
|
15
|
+
},
|
|
16
|
+
});
|
|
17
|
+
function getConfig() {
|
|
18
|
+
return {
|
|
19
|
+
apiUrl: config.get('apiUrl'),
|
|
20
|
+
token: config.get('token'),
|
|
21
|
+
userId: config.get('userId'),
|
|
22
|
+
};
|
|
23
|
+
}
|
|
24
|
+
function setToken(token, userId) {
|
|
25
|
+
config.set('token', token);
|
|
26
|
+
config.set('userId', userId);
|
|
27
|
+
}
|
|
28
|
+
function clearToken() {
|
|
29
|
+
config.delete('token');
|
|
30
|
+
config.delete('userId');
|
|
31
|
+
}
|
|
32
|
+
function isLoggedIn() {
|
|
33
|
+
return !!config.get('token');
|
|
34
|
+
}
|
|
35
|
+
exports.default = config;
|
|
36
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/utils/config.ts"],"names":[],"mappings":";;;;;AAeA,8BAMC;AAED,4BAGC;AAED,gCAGC;AAED,gCAEC;AAnCD,gDAAwB;AAQxB,MAAM,MAAM,GAAG,IAAI,cAAI,CAAS;IAC9B,WAAW,EAAE,UAAU;IACvB,QAAQ,EAAE;QACR,MAAM,EAAE,sBAAsB;KAC/B;CACF,CAAC,CAAC;AAEH,SAAgB,SAAS;IACvB,OAAO;QACL,MAAM,EAAE,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;QAC5B,KAAK,EAAE,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC;QAC1B,MAAM,EAAE,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;KAC7B,CAAC;AACJ,CAAC;AAED,SAAgB,QAAQ,CAAC,KAAa,EAAE,MAAc;IACpD,MAAM,CAAC,GAAG,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;IAC3B,MAAM,CAAC,GAAG,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;AAC/B,CAAC;AAED,SAAgB,UAAU;IACxB,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IACvB,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;AAC1B,CAAC;AAED,SAAgB,UAAU;IACxB,OAAO,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;AAC/B,CAAC;AAED,kBAAe,MAAM,CAAC"}
|
package/package.json
ADDED
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "joji",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"description": "JoJi CLI - Deploy apps to the edge from the command line",
|
|
5
|
+
"main": "dist/index.js",
|
|
6
|
+
"bin": {
|
|
7
|
+
"joji": "./dist/index.js"
|
|
8
|
+
},
|
|
9
|
+
"scripts": {
|
|
10
|
+
"build": "tsc",
|
|
11
|
+
"dev": "tsx src/index.ts",
|
|
12
|
+
"prepublishOnly": "pnpm build",
|
|
13
|
+
"prepack": "pnpm build"
|
|
14
|
+
},
|
|
15
|
+
"keywords": [
|
|
16
|
+
"joji",
|
|
17
|
+
"appflow",
|
|
18
|
+
"deployment",
|
|
19
|
+
"cli",
|
|
20
|
+
"paas",
|
|
21
|
+
"edge",
|
|
22
|
+
"hosting"
|
|
23
|
+
],
|
|
24
|
+
"author": "Alexandru Maioru",
|
|
25
|
+
"license": "MIT",
|
|
26
|
+
"repository": {
|
|
27
|
+
"type": "git",
|
|
28
|
+
"url": "https://github.com/amaioru77/joji-cli",
|
|
29
|
+
"directory": "cli"
|
|
30
|
+
},
|
|
31
|
+
"engines": {
|
|
32
|
+
"node": ">=18.0.0"
|
|
33
|
+
},
|
|
34
|
+
"files": [
|
|
35
|
+
"dist",
|
|
36
|
+
"README.md"
|
|
37
|
+
],
|
|
38
|
+
"dependencies": {
|
|
39
|
+
"axios": "^1.6.2",
|
|
40
|
+
"chalk": "^4.1.2",
|
|
41
|
+
"commander": "^11.1.0",
|
|
42
|
+
"conf": "^10.2.0",
|
|
43
|
+
"inquirer": "^8.2.6",
|
|
44
|
+
"ora": "^5.4.1",
|
|
45
|
+
"simple-git": "^3.21.0",
|
|
46
|
+
"socket.io-client": "^4.6.0"
|
|
47
|
+
},
|
|
48
|
+
"devDependencies": {
|
|
49
|
+
"@types/inquirer": "^8.2.10",
|
|
50
|
+
"@types/node": "^20.10.0",
|
|
51
|
+
"tsx": "^4.7.0",
|
|
52
|
+
"typescript": "^5.3.3"
|
|
53
|
+
}
|
|
54
|
+
}
|