moontraze 1.0.2 → 1.0.4

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/bin/moon.js ADDED
@@ -0,0 +1,68 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * moon <platform> <command>
4
+ * Example: moon moontraze login
5
+ * moon moontraze deploy --prod
6
+ */
7
+ const chalk = require('chalk');
8
+ const path = require('path');
9
+
10
+ const PLATFORMS = {
11
+ moontraze: {
12
+ label: 'Moontraze',
13
+ runner: path.join(__dirname, 'moontraze.js'),
14
+ },
15
+ // future:
16
+ // otherapp: { label: 'Other', runner: path.join(__dirname, 'other.js') },
17
+ };
18
+
19
+ function printRootHelp() {
20
+ console.log(`
21
+ ${chalk.bold('moon')} — multi-platform CLI
22
+
23
+ Usage:
24
+ moon <platform> <command>
25
+
26
+ Platforms:
27
+ moontraze Moontraze hosting (moontraze.com)
28
+
29
+ Examples:
30
+ moon moontraze login
31
+ moon moontraze link my-site
32
+ moon moontraze deploy --prod
33
+ moon moontraze --prod
34
+
35
+ Same as:
36
+ npx moontraze login
37
+ npx moontraze deploy --prod
38
+ `);
39
+ }
40
+
41
+ const args = process.argv.slice(2);
42
+ const platform = (args[0] || '').toLowerCase();
43
+
44
+ if (!platform || platform === '-h' || platform === '--help' || platform === 'help') {
45
+ printRootHelp();
46
+ process.exit(0);
47
+ }
48
+
49
+ if (platform === '-v' || platform === '--version') {
50
+ try {
51
+ console.log(require('../package.json').version);
52
+ } catch {
53
+ console.log('0.0.0');
54
+ }
55
+ process.exit(0);
56
+ }
57
+
58
+ const meta = PLATFORMS[platform];
59
+ if (!meta) {
60
+ console.error(chalk.red(`Unknown platform: "${platform}"`));
61
+ console.error(chalk.gray('Known: ' + Object.keys(PLATFORMS).join(', ')));
62
+ console.error(chalk.gray('Example: moon moontraze login'));
63
+ process.exit(1);
64
+ }
65
+
66
+ // Forward remaining args to platform CLI
67
+ process.argv = [process.argv[0], meta.runner, ...args.slice(1)];
68
+ require(meta.runner);
package/bin/moontraze.js CHANGED
@@ -2,20 +2,20 @@
2
2
  const { Command } = require('commander');
3
3
  const chalk = require('chalk');
4
4
  const { login } = require('../lib/auth');
5
- const { getConfig, setConfig, getProject, setProject } = require('../lib/config');
5
+ const { getConfig, getProject, setProject } = require('../lib/config');
6
6
  const { deploy } = require('../lib/deploy');
7
7
 
8
8
  const program = new Command();
9
9
 
10
10
  program
11
11
  .name('moontraze')
12
- .description('Deploy sites to Moontraze hosting')
13
- .version('1.0.2');
12
+ .description('Deploy sites to Moontraze hosting (moontraze.com)')
13
+ .version('1.0.3');
14
14
 
15
- // npx moontraze login
15
+ // moon moontraze login | npx moontraze login
16
16
  program
17
17
  .command('login')
18
- .description('Log in with email/password or MoonID')
18
+ .description('Log in with email/password or token')
19
19
  .option('--token <jwt>', 'JWT token (advanced, skip interactive login)')
20
20
  .action(async (opts) => {
21
21
  try {
@@ -26,7 +26,7 @@ program
26
26
  }
27
27
  });
28
28
 
29
- // npx moontraze link [name]
29
+ // moon moontraze link [name]
30
30
  program
31
31
  .command('link [name]')
32
32
  .description('Link this folder to a hosting project name')
@@ -49,11 +49,8 @@ program
49
49
  if (!projectName) process.exit(1);
50
50
  projectName = projectName.toLowerCase().replace(/[^a-z0-9-]/g, '');
51
51
  setProject({ projectName });
52
- console.log(
53
- chalk.green(
54
- `Linked → ${projectName}.${getConfig().domain || 'frelanceo.com'}`
55
- )
56
- );
52
+ const domain = getConfig().domain || 'moontraze.com';
53
+ console.log(chalk.green(`Linked → ${projectName}.${domain}`));
57
54
  console.log(
58
55
  chalk.gray('(saved .moontraze/project.json — same as .vercel)')
59
56
  );
@@ -63,7 +60,6 @@ program
63
60
  }
64
61
  });
65
62
 
66
- // npx moontraze deploy --prod
67
63
  async function runDeploy(opts) {
68
64
  try {
69
65
  await deploy({
@@ -81,10 +77,10 @@ program
81
77
  .description('Deploy current folder')
82
78
  .option('--prod', 'Production redeploy')
83
79
  .option('--production', 'Alias for --prod')
84
- .option('-p, --project <name>', 'Project name (or use moontraze link)')
80
+ .option('-p, --project <name>', 'Project name (or use link)')
85
81
  .action(runDeploy);
86
82
 
87
- // vercel-style: npx moontraze --prod
83
+ // moon moontraze --prod
88
84
  program
89
85
  .option('--prod', 'Deploy to production')
90
86
  .option('--production', 'Deploy to production')
@@ -98,6 +94,21 @@ program
98
94
  }
99
95
  });
100
96
 
97
+ program.addHelpText(
98
+ 'after',
99
+ `
100
+ Examples:
101
+ npx moontraze login
102
+ npx moontraze link my-site
103
+ npx moontraze deploy --prod
104
+
105
+ moon moontraze login
106
+ moon moontraze link my-site
107
+ moon moontraze deploy --prod
108
+ moon moontraze --prod
109
+ `
110
+ );
111
+
101
112
  program.parseAsync(process.argv).catch((e) => {
102
113
  console.error(chalk.red(e.message));
103
114
  process.exit(1);
package/lib/config.js CHANGED
@@ -11,22 +11,37 @@ function ensureDir(d) {
11
11
  if (!fs.existsSync(d)) fs.mkdirSync(d, { recursive: true });
12
12
  }
13
13
 
14
+ const DEFAULTS = {
15
+ token: null,
16
+ apiUrl: process.env.MOONTRAZE_API || 'https://api.moontraze.com',
17
+ domain: process.env.MOONTRAZE_DOMAIN || 'moontraze.com',
18
+ };
19
+
20
+ function migrate(cfg) {
21
+ const next = { ...DEFAULTS, ...cfg };
22
+ // old frelanceo → moontraze
23
+ if (next.apiUrl && String(next.apiUrl).includes('frelanceo')) {
24
+ next.apiUrl = DEFAULTS.apiUrl;
25
+ }
26
+ if (next.domain && String(next.domain).includes('frelanceo')) {
27
+ next.domain = DEFAULTS.domain;
28
+ }
29
+ return next;
30
+ }
31
+
14
32
  function getConfig() {
15
33
  try {
16
34
  if (fs.existsSync(GLOBAL_FILE)) {
17
- return JSON.parse(fs.readFileSync(GLOBAL_FILE, 'utf8'));
35
+ const saved = JSON.parse(fs.readFileSync(GLOBAL_FILE, 'utf8'));
36
+ return migrate(saved);
18
37
  }
19
38
  } catch (_) {}
20
- return {
21
- token: null,
22
- apiUrl: process.env.MOONTRAZE_API || 'https://api.frelanceo.com',
23
- domain: process.env.MOONTRAZE_DOMAIN || 'frelanceo.com',
24
- };
39
+ return { ...DEFAULTS };
25
40
  }
26
41
 
27
42
  function setConfig(partial) {
28
43
  ensureDir(GLOBAL_DIR);
29
- const next = { ...getConfig(), ...partial };
44
+ const next = migrate({ ...getConfig(), ...partial });
30
45
  fs.writeFileSync(GLOBAL_FILE, JSON.stringify(next, null, 2));
31
46
  return next;
32
47
  }
@@ -43,7 +58,6 @@ function getProject() {
43
58
  function setProject(data) {
44
59
  ensureDir(LOCAL_DIR);
45
60
  fs.writeFileSync(LOCAL_FILE, JSON.stringify(data, null, 2));
46
- // ignore file so users don't commit token (project name only is ok)
47
61
  const ignore = path.join(process.cwd(), '.gitignore');
48
62
  try {
49
63
  let g = fs.existsSync(ignore) ? fs.readFileSync(ignore, 'utf8') : '';
package/lib/deploy.js CHANGED
@@ -10,26 +10,29 @@ const { zipCwd } = require('./zip');
10
10
  async function deploy({ prod = true, projectName } = {}) {
11
11
  const cfg = getConfig();
12
12
  if (!cfg.token) {
13
- throw new Error('Not logged in. Run: npx moontraze login');
13
+ throw new Error(
14
+ 'Not logged in. Run: moon moontraze login (or: npx moontraze login)'
15
+ );
14
16
  }
15
17
 
16
18
  const linked = getProject();
17
19
  const name = (projectName || linked?.projectName || '')
18
20
  .toLowerCase()
19
21
  .replace(/[^a-z0-9-]/g, '');
20
-
21
22
  if (!name || name.length < 3) {
22
- throw new Error('No project linked. Run: npx moontraze link my-site');
23
+ throw new Error(
24
+ 'No project linked. Run: moon moontraze link my-site (or: npx moontraze link my-site)'
25
+ );
23
26
  }
24
27
 
25
- const domain = cfg.domain || 'frelanceo.com';
26
- const api = cfg.apiUrl || 'https://api.frelanceo.com';
28
+ const domain = cfg.domain || 'moontraze.com';
29
+ const api = cfg.apiUrl || 'https://api.moontraze.com';
27
30
 
28
31
  console.log('');
29
32
  console.log(chalk.cyan('Moontraze'));
30
- console.log(` Inspect ${api}`);
31
- console.log(` Project ${name}`);
32
- console.log(` Target https://${name}.${domain}`);
33
+ console.log(` Inspect ${api}`);
34
+ console.log(` Project ${name}`);
35
+ console.log(` Target https://${name}.${domain}`);
33
36
  console.log('');
34
37
 
35
38
  const spinner = ora('Packaging...').start();
@@ -39,9 +42,8 @@ async function deploy({ prod = true, projectName } = {}) {
39
42
  try {
40
43
  zipPath = await zipCwd();
41
44
  const mb = (fs.statSync(zipPath).size / 1024 / 1024).toFixed(2);
42
- spinner.text = `Checking project...`;
43
45
 
44
- // 1. Pehle check karo project already exist karta hai ya nahi
46
+ spinner.text = 'Checking project...';
45
47
  let alreadyExists = false;
46
48
  try {
47
49
  const statusRes = await fetch(`${api}/api/hosting/status/${name}`, {
@@ -52,7 +54,7 @@ async function deploy({ prod = true, projectName } = {}) {
52
54
  alreadyExists = !!statusData.exists;
53
55
  }
54
56
  } catch (_) {
55
- // status fail → assume new
57
+ // assume new
56
58
  }
57
59
 
58
60
  spinner.text = `Uploading (${mb} MB)...`;
@@ -64,13 +66,14 @@ async function deploy({ prod = true, projectName } = {}) {
64
66
  contentType: 'application/zip',
65
67
  });
66
68
 
67
- // 2. Exist karta hai to /redeploy, nahi to /deploy
69
+ // existing redeploy; new deploy
68
70
  const endpoint = alreadyExists
69
71
  ? `${api}/api/hosting/redeploy`
70
72
  : `${api}/api/hosting/deploy`;
71
73
 
72
- // /deploy pe redeploy flag bhejo (safety)
73
- if (!alreadyExists) {
74
+ if (alreadyExists) {
75
+ form.append('redeploy', 'true');
76
+ } else {
74
77
  form.append('redeploy', 'false');
75
78
  }
76
79
 
@@ -100,11 +103,10 @@ async function deploy({ prod = true, projectName } = {}) {
100
103
 
101
104
  spinner.succeed(`Ready in ${sec}s`);
102
105
  const url = data.url || `https://${name}.${domain}`;
103
-
104
106
  console.log('');
105
- console.log(chalk.green(` Production ${url}`));
107
+ console.log(chalk.green(` Production ${url}`));
106
108
  if (data.deployment?.version) {
107
- console.log(chalk.gray(` Version ${data.deployment.version}`));
109
+ console.log(chalk.gray(` Version ${data.deployment.version}`));
108
110
  }
109
111
  console.log(
110
112
  chalk.green(alreadyExists ? '✓ Redeployed' : '✓ Deployed')
package/package.json CHANGED
@@ -1,9 +1,10 @@
1
1
  {
2
2
  "name": "moontraze",
3
- "version": "1.0.2",
3
+ "version": "1.0.4",
4
4
  "description": "Deploy to Moontraze hosting — like vercel CLI",
5
5
  "bin": {
6
- "moontraze": "./bin/moontraze.js"
6
+ "moontraze": "./bin/moontraze.js",
7
+ "moon": "./bin/moon.js"
7
8
  },
8
9
  "files": ["bin", "lib"],
9
10
  "engines": { "node": ">=18" },
@@ -16,6 +17,6 @@
16
17
  "chalk": "^4.1.2",
17
18
  "prompts": "^2.4.2"
18
19
  },
19
- "keywords": ["moontraze", "deploy", "hosting"],
20
+ "keywords": ["moontraze", "deploy", "hosting", "moon"],
20
21
  "license": "MIT"
21
22
  }