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.
Files changed (38) hide show
  1. package/README.md +95 -0
  2. package/dist/commands/deploy.d.ts +5 -0
  3. package/dist/commands/deploy.d.ts.map +1 -0
  4. package/dist/commands/deploy.js +113 -0
  5. package/dist/commands/deploy.js.map +1 -0
  6. package/dist/commands/domains.d.ts +4 -0
  7. package/dist/commands/domains.d.ts.map +1 -0
  8. package/dist/commands/domains.js +80 -0
  9. package/dist/commands/domains.js.map +1 -0
  10. package/dist/commands/env.d.ts +4 -0
  11. package/dist/commands/env.d.ts.map +1 -0
  12. package/dist/commands/env.js +73 -0
  13. package/dist/commands/env.js.map +1 -0
  14. package/dist/commands/login.d.ts +2 -0
  15. package/dist/commands/login.d.ts.map +1 -0
  16. package/dist/commands/login.js +53 -0
  17. package/dist/commands/login.js.map +1 -0
  18. package/dist/commands/logs.d.ts +4 -0
  19. package/dist/commands/logs.d.ts.map +1 -0
  20. package/dist/commands/logs.js +58 -0
  21. package/dist/commands/logs.js.map +1 -0
  22. package/dist/commands/projects.d.ts +2 -0
  23. package/dist/commands/projects.d.ts.map +1 -0
  24. package/dist/commands/projects.js +39 -0
  25. package/dist/commands/projects.js.map +1 -0
  26. package/dist/index.d.ts +3 -0
  27. package/dist/index.d.ts.map +1 -0
  28. package/dist/index.js +52 -0
  29. package/dist/index.js.map +1 -0
  30. package/dist/utils/api-client.d.ts +11 -0
  31. package/dist/utils/api-client.d.ts.map +1 -0
  32. package/dist/utils/api-client.js +52 -0
  33. package/dist/utils/api-client.js.map +1 -0
  34. package/dist/utils/config.d.ts +13 -0
  35. package/dist/utils/config.d.ts.map +1 -0
  36. package/dist/utils/config.js +36 -0
  37. package/dist/utils/config.js.map +1 -0
  38. 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,5 @@
1
+ export declare function deploy(options: {
2
+ project?: string;
3
+ branch?: string;
4
+ }): Promise<void>;
5
+ //# sourceMappingURL=deploy.d.ts.map
@@ -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,4 @@
1
+ export declare function domains(action: string, domain?: string, options?: {
2
+ project?: string;
3
+ }): Promise<void>;
4
+ //# sourceMappingURL=domains.d.ts.map
@@ -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,4 @@
1
+ export declare function envCmd(action: string, key?: string, value?: string, options?: {
2
+ project?: string;
3
+ }): Promise<void>;
4
+ //# sourceMappingURL=env.d.ts.map
@@ -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":";;;;;AAIA,wBA4EC;AAhFD,kDAA0B;AAC1B,qEAA4C;AAC5C,4CAA6C;AAEtC,KAAK,UAAU,MAAM,CAC1B,MAAc,EACd,GAAY,EACZ,KAAc,EACd,OAA8B;IAE9B,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,OAAO,EAAE,OAAO,EAAE,CAAC;QACtB,OAAO,CAAC,KAAK,CAAC,eAAK,CAAC,GAAG,CAAC,uBAAuB,CAAC,CAAC,CAAC;QAClD,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,MAAM,CAAC,uDAAuD,CAAC,CAAC,CAAC;QACnF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,MAAM,SAAS,GAAG,OAAO,CAAC,OAAO,CAAC;IAElC,IAAI,CAAC;QACH,QAAQ,MAAM,EAAE,CAAC;YACf,KAAK,MAAM;gBACT,MAAM,QAAQ,GAAG,MAAM,oBAAS,CAAC,GAAG,CAAC,gBAAgB,SAAS,EAAE,CAAC,CAAC;gBAClE,MAAM,OAAO,GAAG,QAAQ,CAAC,IAAI,CAAC;gBAE9B,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,8BAA8B,CAAC,CAAC,CAAC;gBACxD,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;oBACzB,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,8BAA8B,CAAC,CAAC,CAAC;gBAC1D,CAAC;qBAAM,CAAC;oBACN,OAAO,CAAC,OAAO,CAAC,CAAC,GAAQ,EAAE,EAAE;wBAC3B,OAAO,CAAC,GAAG,CAAC,GAAG,eAAK,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,eAAK,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;oBAChE,CAAC,CAAC,CAAC;gBACL,CAAC;gBACD,OAAO,CAAC,GAAG,EAAE,CAAC;gBACd,MAAM;YAER,KAAK,KAAK;gBACR,IAAI,CAAC,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC;oBACnB,OAAO,CAAC,KAAK,CAAC,eAAK,CAAC,GAAG,CAAC,0BAA0B,CAAC,CAAC,CAAC;oBACrD,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,MAAM,CAAC,8CAA8C,CAAC,CAAC,CAAC;oBAC1E,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;gBAClB,CAAC;gBAED,MAAM,oBAAS,CAAC,IAAI,CAAC,gBAAgB,SAAS,EAAE,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC,CAAC;gBAClE,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,KAAK,CAAC,SAAS,GAAG,EAAE,CAAC,CAAC,CAAC;gBACzC,MAAM;YAER,KAAK,QAAQ;gBACX,IAAI,CAAC,GAAG,EAAE,CAAC;oBACT,OAAO,CAAC,KAAK,CAAC,eAAK,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC,CAAC;oBAC3C,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,MAAM,CAAC,2CAA2C,CAAC,CAAC,CAAC;oBACvE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;gBAClB,CAAC;gBAED,MAAM,OAAO,GAAG,MAAM,oBAAS,CAAC,GAAG,CAAC,gBAAgB,SAAS,EAAE,CAAC,CAAC;gBACjE,MAAM,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,KAAK,GAAG,CAAC,CAAC;gBAE5D,IAAI,CAAC,MAAM,EAAE,CAAC;oBACZ,OAAO,CAAC,KAAK,CAAC,eAAK,CAAC,GAAG,CAAC,0BAA0B,GAAG,YAAY,CAAC,CAAC,CAAC;oBACpE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;gBAClB,CAAC;gBAED,MAAM,oBAAS,CAAC,MAAM,CAAC,QAAQ,MAAM,CAAC,EAAE,EAAE,CAAC,CAAC;gBAC5C,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,KAAK,CAAC,aAAa,GAAG,EAAE,CAAC,CAAC,CAAC;gBAC7C,MAAM;YAER;gBACE,OAAO,CAAC,KAAK,CAAC,eAAK,CAAC,GAAG,CAAC,qBAAqB,MAAM,EAAE,CAAC,CAAC,CAAC;gBACxD,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,MAAM,CAAC,kCAAkC,CAAC,CAAC,CAAC;gBAC9D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACpB,CAAC;IACH,CAAC;IAAC,OAAO,KAAU,EAAE,CAAC;QACpB,OAAO,CAAC,KAAK,CAAC,eAAK,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC,CAAC;QAC7C,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,2 @@
1
+ export declare function login(): Promise<void>;
2
+ //# sourceMappingURL=login.d.ts.map
@@ -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,4 @@
1
+ export declare function logs(deploymentId?: string, options?: {
2
+ follow?: boolean;
3
+ }): Promise<void>;
4
+ //# sourceMappingURL=logs.d.ts.map
@@ -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,2 @@
1
+ export declare function projects(): Promise<void>;
2
+ //# sourceMappingURL=projects.d.ts.map
@@ -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"}
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=index.d.ts.map
@@ -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
+ }