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 +68 -0
- package/bin/moontraze.js +25 -14
- package/lib/config.js +22 -8
- package/lib/deploy.js +19 -17
- package/package.json +4 -3
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,
|
|
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.
|
|
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
|
|
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
|
-
//
|
|
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
|
-
|
|
53
|
-
|
|
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
|
|
80
|
+
.option('-p, --project <name>', 'Project name (or use link)')
|
|
85
81
|
.action(runDeploy);
|
|
86
82
|
|
|
87
|
-
//
|
|
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
|
-
|
|
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(
|
|
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(
|
|
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 || '
|
|
26
|
-
const api = cfg.apiUrl || 'https://api.
|
|
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(`
|
|
31
|
-
console.log(`
|
|
32
|
-
console.log(`
|
|
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
|
-
|
|
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
|
-
//
|
|
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
|
-
//
|
|
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
|
-
|
|
73
|
-
|
|
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(`
|
|
107
|
+
console.log(chalk.green(` Production ${url}`));
|
|
106
108
|
if (data.deployment?.version) {
|
|
107
|
-
console.log(chalk.gray(`
|
|
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.
|
|
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
|
}
|