@42ws/cli 0.0.1 → 0.0.3
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 +3 -3
- package/dist/commands/init.d.ts +9 -0
- package/dist/commands/init.d.ts.map +1 -0
- package/dist/commands/init.js +103 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/logout.d.ts +2 -0
- package/dist/commands/logout.d.ts.map +1 -0
- package/dist/commands/logout.js +23 -0
- package/dist/commands/logout.js.map +1 -0
- package/dist/commands/open.d.ts +6 -0
- package/dist/commands/open.d.ts.map +1 -0
- package/dist/commands/open.js +52 -0
- package/dist/commands/open.js.map +1 -0
- package/dist/commands/pull.d.ts +7 -0
- package/dist/commands/pull.d.ts.map +1 -0
- package/dist/commands/pull.js +157 -0
- package/dist/commands/pull.js.map +1 -0
- package/dist/commands/sites.d.ts +8 -0
- package/dist/commands/sites.d.ts.map +1 -0
- package/dist/commands/sites.js +166 -0
- package/dist/commands/sites.js.map +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +63 -5
- package/dist/index.js.map +1 -1
- package/dist/lib/config.d.ts +7 -1
- package/dist/lib/config.d.ts.map +1 -1
- package/dist/lib/config.js +5 -1
- package/dist/lib/config.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
|
-
# 42ws
|
|
1
|
+
# @42ws/cli
|
|
2
2
|
|
|
3
3
|
Publish static sites in one command.
|
|
4
4
|
|
|
5
5
|
## Usage
|
|
6
6
|
|
|
7
7
|
```
|
|
8
|
-
npx 42ws@latest login --token ws_xxx
|
|
9
|
-
npx 42ws@latest publish --site my-site --dir dist
|
|
8
|
+
npx @42ws/cli@latest login --token ws_xxx
|
|
9
|
+
npx @42ws/cli@latest publish --site my-site --dir dist
|
|
10
10
|
```
|
|
11
11
|
|
|
12
12
|
## Commands
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AA8BA,MAAM,WAAW,QAAQ;IACvB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,GAAG,CAAC,EAAE,OAAO,CAAC;CACf;AAED,wBAAsB,IAAI,CAAC,IAAI,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,CAuFxD"}
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
import { existsSync, writeFileSync } from 'node:fs';
|
|
2
|
+
import { join, basename } from 'node:path';
|
|
3
|
+
import { createInterface } from 'node:readline';
|
|
4
|
+
import { detectFramework } from '../lib/detect.js';
|
|
5
|
+
import { error, isJsonMode } from '../lib/output.js';
|
|
6
|
+
function slugify(name) {
|
|
7
|
+
return name
|
|
8
|
+
.toLowerCase()
|
|
9
|
+
.replace(/[^a-z0-9-]+/g, '-')
|
|
10
|
+
.replace(/^-+|-+$/g, '');
|
|
11
|
+
}
|
|
12
|
+
function prompt(question) {
|
|
13
|
+
return new Promise(resolve => {
|
|
14
|
+
const rl = createInterface({ input: process.stdin, output: process.stderr });
|
|
15
|
+
rl.question(question, answer => {
|
|
16
|
+
rl.close();
|
|
17
|
+
resolve(answer.trim());
|
|
18
|
+
});
|
|
19
|
+
});
|
|
20
|
+
}
|
|
21
|
+
export async function init(args) {
|
|
22
|
+
const cwd = process.cwd();
|
|
23
|
+
const configPath = join(cwd, '42ws.json');
|
|
24
|
+
const detection = detectFramework(cwd);
|
|
25
|
+
// If --json mode, use flag values directly (non-interactive)
|
|
26
|
+
if (isJsonMode()) {
|
|
27
|
+
const siteName = args.site;
|
|
28
|
+
if (!siteName) {
|
|
29
|
+
error('INVALID_SITE_NAME', 'Site name is required in JSON mode.', 'Use --site=<name>.');
|
|
30
|
+
process.exit(1);
|
|
31
|
+
}
|
|
32
|
+
const config = {
|
|
33
|
+
site: siteName,
|
|
34
|
+
output: args.output ?? detection.output ?? 'dist',
|
|
35
|
+
};
|
|
36
|
+
if (args.build !== undefined) {
|
|
37
|
+
config.build = args.build || undefined;
|
|
38
|
+
}
|
|
39
|
+
if (args.spa !== undefined) {
|
|
40
|
+
config.spa = args.spa;
|
|
41
|
+
}
|
|
42
|
+
writeFileSync(configPath, JSON.stringify(config, null, 2) + '\n', { encoding: 'utf-8' });
|
|
43
|
+
process.stdout.write(JSON.stringify({ ok: true, path: configPath, config }) + '\n');
|
|
44
|
+
return;
|
|
45
|
+
}
|
|
46
|
+
// Interactive mode
|
|
47
|
+
if (!process.stdin.isTTY) {
|
|
48
|
+
error('NOT_A_TTY', 'Stdin is not a TTY.', 'Use --site, --output, --build, --spa flags with --json for non-interactive mode.');
|
|
49
|
+
process.exit(1);
|
|
50
|
+
}
|
|
51
|
+
// Check if 42ws.json already exists
|
|
52
|
+
if (existsSync(configPath)) {
|
|
53
|
+
const overwrite = await prompt('42ws.json already exists. Overwrite? [y/N]: ');
|
|
54
|
+
if (overwrite.toLowerCase() !== 'y') {
|
|
55
|
+
process.stderr.write('Cancelled.\n');
|
|
56
|
+
process.exit(0);
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
// 1. Site name
|
|
60
|
+
const defaultSite = slugify(basename(cwd));
|
|
61
|
+
const siteAnswer = await prompt(`Site name [${defaultSite}]: `);
|
|
62
|
+
const siteName = siteAnswer.length > 0 ? siteAnswer : defaultSite;
|
|
63
|
+
// 2. Output directory
|
|
64
|
+
const defaultOutput = detection.output ?? 'dist';
|
|
65
|
+
const outputAnswer = await prompt(`Output directory [${defaultOutput}]: `);
|
|
66
|
+
const outputDir = outputAnswer.length > 0 ? outputAnswer : defaultOutput;
|
|
67
|
+
// 3. Build command
|
|
68
|
+
const defaultBuild = detection.build ?? 'npm run build';
|
|
69
|
+
const buildAnswer = await prompt(`Build command [${defaultBuild}] (empty for none): `);
|
|
70
|
+
let buildCmd;
|
|
71
|
+
if (buildAnswer === '') {
|
|
72
|
+
// keep default
|
|
73
|
+
buildCmd = defaultBuild;
|
|
74
|
+
}
|
|
75
|
+
else if (buildAnswer.toLowerCase() === 'none') {
|
|
76
|
+
buildCmd = undefined;
|
|
77
|
+
}
|
|
78
|
+
else {
|
|
79
|
+
buildCmd = buildAnswer;
|
|
80
|
+
}
|
|
81
|
+
// 4. SPA mode
|
|
82
|
+
const defaultSpa = detection.spa ?? false;
|
|
83
|
+
const spaPrompt = defaultSpa ? '[Y/n]' : '[y/N]';
|
|
84
|
+
const spaAnswer = await prompt(`SPA mode? ${spaPrompt}: `);
|
|
85
|
+
let spaMode;
|
|
86
|
+
if (spaAnswer === '') {
|
|
87
|
+
spaMode = defaultSpa;
|
|
88
|
+
}
|
|
89
|
+
else {
|
|
90
|
+
spaMode = spaAnswer.toLowerCase() === 'y';
|
|
91
|
+
}
|
|
92
|
+
const config = {
|
|
93
|
+
site: siteName,
|
|
94
|
+
output: outputDir,
|
|
95
|
+
};
|
|
96
|
+
if (buildCmd)
|
|
97
|
+
config.build = buildCmd;
|
|
98
|
+
if (spaMode)
|
|
99
|
+
config.spa = true;
|
|
100
|
+
writeFileSync(configPath, JSON.stringify(config, null, 2) + '\n', { encoding: 'utf-8' });
|
|
101
|
+
process.stdout.write(`Created 42ws.json\n`);
|
|
102
|
+
}
|
|
103
|
+
//# sourceMappingURL=init.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,aAAa,EAAgB,MAAM,SAAS,CAAC;AAClE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AAC3C,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AACnD,OAAO,EAAE,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AASrD,SAAS,OAAO,CAAC,IAAY;IAC3B,OAAO,IAAI;SACR,WAAW,EAAE;SACb,OAAO,CAAC,cAAc,EAAE,GAAG,CAAC;SAC5B,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;AAC7B,CAAC;AAED,SAAS,MAAM,CAAC,QAAgB;IAC9B,OAAO,IAAI,OAAO,CAAC,OAAO,CAAC,EAAE;QAC3B,MAAM,EAAE,GAAG,eAAe,CAAC,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;QAC7E,EAAE,CAAC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC,EAAE;YAC7B,EAAE,CAAC,KAAK,EAAE,CAAC;YACX,OAAO,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;QACzB,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC;AAUD,MAAM,CAAC,KAAK,UAAU,IAAI,CAAC,IAAc;IACvC,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;IAC1B,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,EAAE,WAAW,CAAC,CAAC;IAC1C,MAAM,SAAS,GAAG,eAAe,CAAC,GAAG,CAAC,CAAC;IAEvC,6DAA6D;IAC7D,IAAI,UAAU,EAAE,EAAE,CAAC;QACjB,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC;QAC3B,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,KAAK,CAAC,mBAAmB,EAAE,qCAAqC,EAAE,oBAAoB,CAAC,CAAC;YACxF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QAED,MAAM,MAAM,GAAkB;YAC5B,IAAI,EAAE,QAAQ;YACd,MAAM,EAAE,IAAI,CAAC,MAAM,IAAI,SAAS,CAAC,MAAM,IAAI,MAAM;SAClD,CAAC;QACF,IAAI,IAAI,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;YAC7B,MAAM,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,IAAI,SAAS,CAAC;QACzC,CAAC;QACD,IAAI,IAAI,CAAC,GAAG,KAAK,SAAS,EAAE,CAAC;YAC3B,MAAM,CAAC,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC;QACxB,CAAC;QAED,aAAa,CAAC,UAAU,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAC;QACzF,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,EAAE,CAAC,GAAG,IAAI,CAAC,CAAC;QACpF,OAAO;IACT,CAAC;IAED,mBAAmB;IACnB,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;QACzB,KAAK,CAAC,WAAW,EAAE,qBAAqB,EAAE,kFAAkF,CAAC,CAAC;QAC9H,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,oCAAoC;IACpC,IAAI,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAC3B,MAAM,SAAS,GAAG,MAAM,MAAM,CAAC,8CAA8C,CAAC,CAAC;QAC/E,IAAI,SAAS,CAAC,WAAW,EAAE,KAAK,GAAG,EAAE,CAAC;YACpC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC;YACrC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC;IAED,eAAe;IACf,MAAM,WAAW,GAAG,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC;IAC3C,MAAM,UAAU,GAAG,MAAM,MAAM,CAAC,cAAc,WAAW,KAAK,CAAC,CAAC;IAChE,MAAM,QAAQ,GAAG,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,WAAW,CAAC;IAElE,sBAAsB;IACtB,MAAM,aAAa,GAAG,SAAS,CAAC,MAAM,IAAI,MAAM,CAAC;IACjD,MAAM,YAAY,GAAG,MAAM,MAAM,CAAC,qBAAqB,aAAa,KAAK,CAAC,CAAC;IAC3E,MAAM,SAAS,GAAG,YAAY,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,aAAa,CAAC;IAEzE,mBAAmB;IACnB,MAAM,YAAY,GAAG,SAAS,CAAC,KAAK,IAAI,eAAe,CAAC;IACxD,MAAM,WAAW,GAAG,MAAM,MAAM,CAAC,kBAAkB,YAAY,sBAAsB,CAAC,CAAC;IACvF,IAAI,QAA4B,CAAC;IACjC,IAAI,WAAW,KAAK,EAAE,EAAE,CAAC;QACvB,eAAe;QACf,QAAQ,GAAG,YAAY,CAAC;IAC1B,CAAC;SAAM,IAAI,WAAW,CAAC,WAAW,EAAE,KAAK,MAAM,EAAE,CAAC;QAChD,QAAQ,GAAG,SAAS,CAAC;IACvB,CAAC;SAAM,CAAC;QACN,QAAQ,GAAG,WAAW,CAAC;IACzB,CAAC;IAED,cAAc;IACd,MAAM,UAAU,GAAG,SAAS,CAAC,GAAG,IAAI,KAAK,CAAC;IAC1C,MAAM,SAAS,GAAG,UAAU,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC;IACjD,MAAM,SAAS,GAAG,MAAM,MAAM,CAAC,aAAa,SAAS,IAAI,CAAC,CAAC;IAC3D,IAAI,OAAgB,CAAC;IACrB,IAAI,SAAS,KAAK,EAAE,EAAE,CAAC;QACrB,OAAO,GAAG,UAAU,CAAC;IACvB,CAAC;SAAM,CAAC;QACN,OAAO,GAAG,SAAS,CAAC,WAAW,EAAE,KAAK,GAAG,CAAC;IAC5C,CAAC;IAED,MAAM,MAAM,GAAkB;QAC5B,IAAI,EAAE,QAAQ;QACd,MAAM,EAAE,SAAS;KAClB,CAAC;IACF,IAAI,QAAQ;QAAE,MAAM,CAAC,KAAK,GAAG,QAAQ,CAAC;IACtC,IAAI,OAAO;QAAE,MAAM,CAAC,GAAG,GAAG,IAAI,CAAC;IAE/B,aAAa,CAAC,UAAU,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAC;IACzF,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,qBAAqB,CAAC,CAAC;AAC9C,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logout.d.ts","sourceRoot":"","sources":["../../src/commands/logout.ts"],"names":[],"mappings":"AAGA,wBAAsB,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC,CAoB5C"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { loadConfig, saveConfig } from '../lib/config.js';
|
|
2
|
+
import { success, successMessage, isJsonMode } from '../lib/output.js';
|
|
3
|
+
export async function logout() {
|
|
4
|
+
const config = loadConfig();
|
|
5
|
+
if (!config.token) {
|
|
6
|
+
if (isJsonMode()) {
|
|
7
|
+
success({ status: 'already-logged-out' });
|
|
8
|
+
}
|
|
9
|
+
else {
|
|
10
|
+
process.stdout.write('Already logged out.\n');
|
|
11
|
+
}
|
|
12
|
+
return;
|
|
13
|
+
}
|
|
14
|
+
// Remove token, keep apiUrl
|
|
15
|
+
saveConfig({ removeToken: true, apiUrl: config.apiUrl });
|
|
16
|
+
if (isJsonMode()) {
|
|
17
|
+
success({ status: 'logged-out' });
|
|
18
|
+
}
|
|
19
|
+
else {
|
|
20
|
+
successMessage('Logged out.');
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=logout.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logout.js","sourceRoot":"","sources":["../../src/commands/logout.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC1D,OAAO,EAAE,OAAO,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAEvE,MAAM,CAAC,KAAK,UAAU,MAAM;IAC1B,MAAM,MAAM,GAAG,UAAU,EAAE,CAAC;IAE5B,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;QAClB,IAAI,UAAU,EAAE,EAAE,CAAC;YACjB,OAAO,CAAC,EAAE,MAAM,EAAE,oBAAoB,EAAE,CAAC,CAAC;QAC5C,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,uBAAuB,CAAC,CAAC;QAChD,CAAC;QACD,OAAO;IACT,CAAC;IAED,4BAA4B;IAC5B,UAAU,CAAC,EAAE,WAAW,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;IAEzD,IAAI,UAAU,EAAE,EAAE,CAAC;QACjB,OAAO,CAAC,EAAE,MAAM,EAAE,YAAY,EAAE,CAAC,CAAC;IACpC,CAAC;SAAM,CAAC;QACN,cAAc,CAAC,aAAa,CAAC,CAAC;IAChC,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"open.d.ts","sourceRoot":"","sources":["../../src/commands/open.ts"],"names":[],"mappings":"AAkCA,MAAM,WAAW,QAAQ;IACvB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAED,wBAAsB,IAAI,CAAC,IAAI,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,CAuBxD"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import { existsSync, readFileSync } from 'node:fs';
|
|
2
|
+
import { join } from 'node:path';
|
|
3
|
+
import { spawn } from 'node:child_process';
|
|
4
|
+
import { error, success, isJsonMode } from '../lib/output.js';
|
|
5
|
+
function loadProjectConfig(cwd) {
|
|
6
|
+
const configPath = join(cwd, '42ws.json');
|
|
7
|
+
if (!existsSync(configPath))
|
|
8
|
+
return {};
|
|
9
|
+
try {
|
|
10
|
+
return JSON.parse(readFileSync(configPath, 'utf-8'));
|
|
11
|
+
}
|
|
12
|
+
catch {
|
|
13
|
+
return {};
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
function openBrowser(url) {
|
|
17
|
+
try {
|
|
18
|
+
const platform = process.platform;
|
|
19
|
+
if (platform === 'darwin') {
|
|
20
|
+
spawn('open', [url], { detached: true, stdio: 'ignore' }).unref();
|
|
21
|
+
}
|
|
22
|
+
else if (platform === 'win32') {
|
|
23
|
+
spawn('cmd', ['/c', 'start', '', url], { detached: true, stdio: 'ignore' }).unref();
|
|
24
|
+
}
|
|
25
|
+
else {
|
|
26
|
+
spawn('xdg-open', [url], { detached: true, stdio: 'ignore' }).unref();
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
catch {
|
|
30
|
+
// ignore — user will use the printed URL
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
export async function open(args) {
|
|
34
|
+
const cwd = process.cwd();
|
|
35
|
+
let siteName = args.name;
|
|
36
|
+
if (!siteName) {
|
|
37
|
+
const projectConfig = loadProjectConfig(cwd);
|
|
38
|
+
siteName = projectConfig.site;
|
|
39
|
+
}
|
|
40
|
+
if (!siteName) {
|
|
41
|
+
error('INVALID_SITE_NAME', 'No site name specified.', 'Pass a site name: 42ws open <name>, or add "site" to 42ws.json.');
|
|
42
|
+
process.exit(1);
|
|
43
|
+
}
|
|
44
|
+
const url = `https://${siteName}.dev.42ws.com`;
|
|
45
|
+
if (isJsonMode()) {
|
|
46
|
+
success({ site: siteName, url });
|
|
47
|
+
return;
|
|
48
|
+
}
|
|
49
|
+
openBrowser(url);
|
|
50
|
+
process.stdout.write(`${url}\n`);
|
|
51
|
+
}
|
|
52
|
+
//# sourceMappingURL=open.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"open.js","sourceRoot":"","sources":["../../src/commands/open.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAC3C,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAM9D,SAAS,iBAAiB,CAAC,GAAW;IACpC,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,EAAE,WAAW,CAAC,CAAC;IAC1C,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC;QAAE,OAAO,EAAE,CAAC;IACvC,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,UAAU,EAAE,OAAO,CAAC,CAAkB,CAAC;IACxE,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED,SAAS,WAAW,CAAC,GAAW;IAC9B,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC;QAClC,IAAI,QAAQ,KAAK,QAAQ,EAAE,CAAC;YAC1B,KAAK,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC;QACpE,CAAC;aAAM,IAAI,QAAQ,KAAK,OAAO,EAAE,CAAC;YAChC,KAAK,CAAC,KAAK,EAAE,CAAC,IAAI,EAAE,OAAO,EAAE,EAAE,EAAE,GAAG,CAAC,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC;QACtF,CAAC;aAAM,CAAC;YACN,KAAK,CAAC,UAAU,EAAE,CAAC,GAAG,CAAC,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC;QACxE,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,yCAAyC;IAC3C,CAAC;AACH,CAAC;AAOD,MAAM,CAAC,KAAK,UAAU,IAAI,CAAC,IAAc;IACvC,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;IAE1B,IAAI,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC;IACzB,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,MAAM,aAAa,GAAG,iBAAiB,CAAC,GAAG,CAAC,CAAC;QAC7C,QAAQ,GAAG,aAAa,CAAC,IAAI,CAAC;IAChC,CAAC;IAED,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,KAAK,CAAC,mBAAmB,EAAE,yBAAyB,EAAE,iEAAiE,CAAC,CAAC;QACzH,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,MAAM,GAAG,GAAG,WAAW,QAAQ,eAAe,CAAC;IAE/C,IAAI,UAAU,EAAE,EAAE,CAAC;QACjB,OAAO,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC,CAAC;QACjC,OAAO;IACT,CAAC;IAED,WAAW,CAAC,GAAG,CAAC,CAAC;IACjB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,GAAG,IAAI,CAAC,CAAC;AACnC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pull.d.ts","sourceRoot":"","sources":["../../src/commands/pull.ts"],"names":[],"mappings":"AAoEA,MAAM,WAAW,QAAQ;IACvB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,OAAO,CAAC;CACf;AAED,wBAAsB,IAAI,CAAC,IAAI,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,CA2HxD"}
|
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
import { existsSync, readFileSync, mkdirSync, writeFileSync } from 'node:fs';
|
|
2
|
+
import { join, dirname, resolve } from 'node:path';
|
|
3
|
+
import { createInterface } from 'node:readline';
|
|
4
|
+
import { loadConfig } from '../lib/config.js';
|
|
5
|
+
import { apiRequest, ApiError } from '../lib/api.js';
|
|
6
|
+
import { info, success, successMessage, error, isJsonMode } from '../lib/output.js';
|
|
7
|
+
function loadProjectConfig(cwd) {
|
|
8
|
+
const configPath = join(cwd, '42ws.json');
|
|
9
|
+
if (!existsSync(configPath))
|
|
10
|
+
return {};
|
|
11
|
+
try {
|
|
12
|
+
return JSON.parse(readFileSync(configPath, 'utf-8'));
|
|
13
|
+
}
|
|
14
|
+
catch {
|
|
15
|
+
return {};
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
function prompt(question) {
|
|
19
|
+
return new Promise(resolve => {
|
|
20
|
+
const rl = createInterface({ input: process.stdin, output: process.stderr });
|
|
21
|
+
rl.question(question, answer => {
|
|
22
|
+
rl.close();
|
|
23
|
+
resolve(answer.trim());
|
|
24
|
+
});
|
|
25
|
+
});
|
|
26
|
+
}
|
|
27
|
+
async function downloadFile(url) {
|
|
28
|
+
let response;
|
|
29
|
+
try {
|
|
30
|
+
response = await fetch(url);
|
|
31
|
+
}
|
|
32
|
+
catch (e) {
|
|
33
|
+
throw new ApiError('NETWORK_ERROR', `Network error: ${String(e)}`, 'Check your internet connection.');
|
|
34
|
+
}
|
|
35
|
+
if (!response.ok) {
|
|
36
|
+
throw new ApiError('DOWNLOAD_FAILED', `Download failed with HTTP ${response.status}`, 'Try again.');
|
|
37
|
+
}
|
|
38
|
+
const buffer = await response.arrayBuffer();
|
|
39
|
+
return Buffer.from(buffer);
|
|
40
|
+
}
|
|
41
|
+
export async function pull(args) {
|
|
42
|
+
const cwd = process.cwd();
|
|
43
|
+
const projectConfig = loadProjectConfig(cwd);
|
|
44
|
+
// Resolve site name
|
|
45
|
+
const siteName = args.site ?? projectConfig.site;
|
|
46
|
+
if (!siteName) {
|
|
47
|
+
error('INVALID_SITE_NAME', 'Site name is required.', 'Use --site <name> or add "site" to 42ws.json.');
|
|
48
|
+
process.exit(1);
|
|
49
|
+
}
|
|
50
|
+
const config = loadConfig();
|
|
51
|
+
if (!config.token) {
|
|
52
|
+
error('NOT_LOGGED_IN', 'You are not logged in.', 'Run `42ws login` to authenticate.');
|
|
53
|
+
process.exit(1);
|
|
54
|
+
}
|
|
55
|
+
// Resolve output directory
|
|
56
|
+
const outputDir = resolve(cwd, args.dir ?? `pulled`);
|
|
57
|
+
// Check if directory has existing files
|
|
58
|
+
if (existsSync(outputDir) && !args.yes) {
|
|
59
|
+
if (!process.stdin.isTTY) {
|
|
60
|
+
error('NOT_A_TTY', 'Use --yes to overwrite existing files in non-interactive mode.', 'Add --yes flag.');
|
|
61
|
+
process.exit(1);
|
|
62
|
+
}
|
|
63
|
+
const answer = await prompt(`Directory "${outputDir}" exists. Overwrite? [y/N]: `);
|
|
64
|
+
if (answer.toLowerCase() !== 'y') {
|
|
65
|
+
process.stderr.write('Cancelled.\n');
|
|
66
|
+
process.exit(0);
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
// Step 1: Get currentPublishId from sites list
|
|
70
|
+
info(`Fetching site info for "${siteName}"...`);
|
|
71
|
+
let sitesResult;
|
|
72
|
+
try {
|
|
73
|
+
sitesResult = await apiRequest(config, 'GET', '/v1/sites');
|
|
74
|
+
}
|
|
75
|
+
catch (e) {
|
|
76
|
+
if (e instanceof ApiError) {
|
|
77
|
+
error(e.code, e.message, e.suggestedFix);
|
|
78
|
+
}
|
|
79
|
+
else {
|
|
80
|
+
error('NETWORK_ERROR', String(e), 'Check your internet connection.');
|
|
81
|
+
}
|
|
82
|
+
process.exit(1);
|
|
83
|
+
}
|
|
84
|
+
const siteItem = (sitesResult.sites ?? []).find(s => s.site === siteName);
|
|
85
|
+
if (!siteItem) {
|
|
86
|
+
error('NOT_FOUND', `Site "${siteName}" not found.`, 'Check the site name and try again.');
|
|
87
|
+
process.exit(1);
|
|
88
|
+
}
|
|
89
|
+
const publishId = siteItem.currentPublishId;
|
|
90
|
+
if (!publishId) {
|
|
91
|
+
error('NOT_FOUND', `Site "${siteName}" has no published version.`, 'Publish first with: 42ws publish --site ' + siteName);
|
|
92
|
+
process.exit(1);
|
|
93
|
+
}
|
|
94
|
+
// Step 2: Get presigned download URLs
|
|
95
|
+
info(`Fetching download URLs for publish ${publishId}...`);
|
|
96
|
+
let downloadResult;
|
|
97
|
+
try {
|
|
98
|
+
downloadResult = await apiRequest(config, 'GET', `/v1/publishes/${publishId}/download`);
|
|
99
|
+
}
|
|
100
|
+
catch (e) {
|
|
101
|
+
if (e instanceof ApiError) {
|
|
102
|
+
error(e.code, e.message, e.suggestedFix);
|
|
103
|
+
}
|
|
104
|
+
else {
|
|
105
|
+
error('NETWORK_ERROR', String(e), 'Check your internet connection.');
|
|
106
|
+
}
|
|
107
|
+
process.exit(1);
|
|
108
|
+
}
|
|
109
|
+
const files = downloadResult.files ?? [];
|
|
110
|
+
if (files.length === 0) {
|
|
111
|
+
error('NO_FILES_FOUND', 'No files found in this publish.', '');
|
|
112
|
+
process.exit(1);
|
|
113
|
+
}
|
|
114
|
+
info(`Downloading ${files.length} files into ${outputDir}...`);
|
|
115
|
+
// Step 3: Download files in parallel (concurrency 8)
|
|
116
|
+
const CONCURRENCY = 8;
|
|
117
|
+
const queue = [...files];
|
|
118
|
+
let completed = 0;
|
|
119
|
+
async function downloadWorker() {
|
|
120
|
+
while (queue.length > 0) {
|
|
121
|
+
const file = queue.pop();
|
|
122
|
+
if (!file)
|
|
123
|
+
break;
|
|
124
|
+
const data = await downloadFile(file.url);
|
|
125
|
+
const dest = join(outputDir, file.path);
|
|
126
|
+
mkdirSync(dirname(dest), { recursive: true });
|
|
127
|
+
writeFileSync(dest, data);
|
|
128
|
+
completed++;
|
|
129
|
+
if (!isJsonMode()) {
|
|
130
|
+
process.stderr.write(`\r ${completed}/${files.length} files...`);
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
try {
|
|
135
|
+
await Promise.all(Array.from({ length: CONCURRENCY }, downloadWorker));
|
|
136
|
+
}
|
|
137
|
+
catch (e) {
|
|
138
|
+
if (!isJsonMode())
|
|
139
|
+
process.stderr.write('\n');
|
|
140
|
+
if (e instanceof ApiError) {
|
|
141
|
+
error(e.code, e.message, e.suggestedFix);
|
|
142
|
+
}
|
|
143
|
+
else {
|
|
144
|
+
error('DOWNLOAD_FAILED', String(e), 'Try again.');
|
|
145
|
+
}
|
|
146
|
+
process.exit(1);
|
|
147
|
+
}
|
|
148
|
+
if (!isJsonMode())
|
|
149
|
+
process.stderr.write('\n');
|
|
150
|
+
if (isJsonMode()) {
|
|
151
|
+
success({ site: siteName, publishId, fileCount: files.length, dir: outputDir });
|
|
152
|
+
}
|
|
153
|
+
else {
|
|
154
|
+
successMessage(`Pulled ${files.length} files into ${outputDir}/`);
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
//# sourceMappingURL=pull.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pull.js","sourceRoot":"","sources":["../../src/commands/pull.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sites.d.ts","sourceRoot":"","sources":["../../src/commands/sites.ts"],"names":[],"mappings":"AA6CA,MAAM,WAAW,SAAS;IACxB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAED,wBAAsB,KAAK,CAAC,IAAI,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,CAoC1D"}
|
|
@@ -0,0 +1,166 @@
|
|
|
1
|
+
import { loadConfig } from '../lib/config.js';
|
|
2
|
+
import { apiRequest, ApiError } from '../lib/api.js';
|
|
3
|
+
import { info, success, successMessage, error, isJsonMode } from '../lib/output.js';
|
|
4
|
+
import { createInterface } from 'node:readline';
|
|
5
|
+
const SITES_HELP = `
|
|
6
|
+
42ws sites — Manage your sites
|
|
7
|
+
|
|
8
|
+
Usage:
|
|
9
|
+
42ws sites List all sites (alias for sites list)
|
|
10
|
+
42ws sites list List all sites
|
|
11
|
+
42ws sites create <name> Create a new site
|
|
12
|
+
42ws sites delete <name> Delete a site
|
|
13
|
+
|
|
14
|
+
Options:
|
|
15
|
+
--json Output results as JSON
|
|
16
|
+
--yes Skip confirmation prompts (delete)
|
|
17
|
+
`.trim();
|
|
18
|
+
function prompt(question) {
|
|
19
|
+
return new Promise(resolve => {
|
|
20
|
+
const rl = createInterface({ input: process.stdin, output: process.stderr });
|
|
21
|
+
rl.question(question, answer => {
|
|
22
|
+
rl.close();
|
|
23
|
+
resolve(answer.trim());
|
|
24
|
+
});
|
|
25
|
+
});
|
|
26
|
+
}
|
|
27
|
+
export async function sites(args) {
|
|
28
|
+
const sub = args.subcommand;
|
|
29
|
+
// No subcommand or "list" → list sites
|
|
30
|
+
if (!sub || sub === 'list') {
|
|
31
|
+
await sitesList();
|
|
32
|
+
return;
|
|
33
|
+
}
|
|
34
|
+
if (sub === 'create') {
|
|
35
|
+
const name = args.positional[0];
|
|
36
|
+
if (!name) {
|
|
37
|
+
process.stderr.write('Usage: 42ws sites create <name>\n');
|
|
38
|
+
process.exit(1);
|
|
39
|
+
}
|
|
40
|
+
await sitesCreate(name);
|
|
41
|
+
return;
|
|
42
|
+
}
|
|
43
|
+
if (sub === 'delete') {
|
|
44
|
+
const name = args.positional[0];
|
|
45
|
+
if (!name) {
|
|
46
|
+
process.stderr.write('Usage: 42ws sites delete <name>\n');
|
|
47
|
+
process.exit(1);
|
|
48
|
+
}
|
|
49
|
+
await sitesDelete(name, args.yes ?? false);
|
|
50
|
+
return;
|
|
51
|
+
}
|
|
52
|
+
if (sub === '--help' || sub === 'help') {
|
|
53
|
+
process.stdout.write(SITES_HELP + '\n');
|
|
54
|
+
return;
|
|
55
|
+
}
|
|
56
|
+
process.stderr.write(`Unknown sites subcommand: ${sub}\n\n${SITES_HELP}\n`);
|
|
57
|
+
process.exit(1);
|
|
58
|
+
}
|
|
59
|
+
async function sitesList() {
|
|
60
|
+
const config = loadConfig();
|
|
61
|
+
if (!config.token) {
|
|
62
|
+
error('NOT_LOGGED_IN', 'You are not logged in.', 'Run `42ws login` to authenticate.');
|
|
63
|
+
process.exit(1);
|
|
64
|
+
}
|
|
65
|
+
let result;
|
|
66
|
+
try {
|
|
67
|
+
result = await apiRequest(config, 'GET', '/v1/sites');
|
|
68
|
+
}
|
|
69
|
+
catch (e) {
|
|
70
|
+
if (e instanceof ApiError) {
|
|
71
|
+
error(e.code, e.message, e.suggestedFix);
|
|
72
|
+
}
|
|
73
|
+
else {
|
|
74
|
+
error('NETWORK_ERROR', String(e), 'Check your internet connection.');
|
|
75
|
+
}
|
|
76
|
+
process.exit(1);
|
|
77
|
+
}
|
|
78
|
+
const sitesList = result.sites ?? [];
|
|
79
|
+
if (isJsonMode()) {
|
|
80
|
+
success({ sites: sitesList });
|
|
81
|
+
return;
|
|
82
|
+
}
|
|
83
|
+
if (sitesList.length === 0) {
|
|
84
|
+
info('No sites yet. Create one with: 42ws sites create <name>');
|
|
85
|
+
return;
|
|
86
|
+
}
|
|
87
|
+
// Human-readable table
|
|
88
|
+
const COL1 = 20;
|
|
89
|
+
const COL2 = 14;
|
|
90
|
+
const header = 'SITE'.padEnd(COL1) + 'CURRENT'.padEnd(COL2) + 'URL';
|
|
91
|
+
process.stdout.write(header + '\n');
|
|
92
|
+
for (const s of sitesList) {
|
|
93
|
+
const name = s.site.padEnd(COL1);
|
|
94
|
+
const current = s.currentPublishId ? s.currentPublishId.padEnd(COL2) : '(未パブリッシュ)'.padEnd(COL2);
|
|
95
|
+
const url = s.currentPublishId ? `https://${s.site}.dev.42ws.com` : '-';
|
|
96
|
+
process.stdout.write(name + current + url + '\n');
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
async function sitesCreate(name) {
|
|
100
|
+
const config = loadConfig();
|
|
101
|
+
if (!config.token) {
|
|
102
|
+
error('NOT_LOGGED_IN', 'You are not logged in.', 'Run `42ws login` to authenticate.');
|
|
103
|
+
process.exit(1);
|
|
104
|
+
}
|
|
105
|
+
let result;
|
|
106
|
+
try {
|
|
107
|
+
result = await apiRequest(config, 'POST', '/v1/sites', { site: name });
|
|
108
|
+
}
|
|
109
|
+
catch (e) {
|
|
110
|
+
if (e instanceof ApiError) {
|
|
111
|
+
if (e.code === 'CONFLICT') {
|
|
112
|
+
error('SITE_NAME_TAKEN', `Site "${name}" already exists.`, '別の名前を試してください。');
|
|
113
|
+
}
|
|
114
|
+
else {
|
|
115
|
+
error(e.code, e.message, e.suggestedFix);
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
else {
|
|
119
|
+
error('NETWORK_ERROR', String(e), 'Check your internet connection.');
|
|
120
|
+
}
|
|
121
|
+
process.exit(1);
|
|
122
|
+
}
|
|
123
|
+
if (isJsonMode()) {
|
|
124
|
+
success({ site: result.site ?? name });
|
|
125
|
+
}
|
|
126
|
+
else {
|
|
127
|
+
successMessage(`Created: ${result.site ?? name}`);
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
async function sitesDelete(name, yes) {
|
|
131
|
+
const config = loadConfig();
|
|
132
|
+
if (!config.token) {
|
|
133
|
+
error('NOT_LOGGED_IN', 'You are not logged in.', 'Run `42ws login` to authenticate.');
|
|
134
|
+
process.exit(1);
|
|
135
|
+
}
|
|
136
|
+
if (!yes) {
|
|
137
|
+
if (!process.stdin.isTTY) {
|
|
138
|
+
error('NOT_A_TTY', 'Use --yes to confirm deletion in non-interactive mode.', 'Add --yes flag to skip confirmation.');
|
|
139
|
+
process.exit(1);
|
|
140
|
+
}
|
|
141
|
+
const answer = await prompt(`本当に削除しますか? "${name}" [y/N]: `);
|
|
142
|
+
if (answer.toLowerCase() !== 'y') {
|
|
143
|
+
process.stderr.write('Cancelled.\n');
|
|
144
|
+
process.exit(0);
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
try {
|
|
148
|
+
await apiRequest(config, 'DELETE', `/v1/sites/${name}`);
|
|
149
|
+
}
|
|
150
|
+
catch (e) {
|
|
151
|
+
if (e instanceof ApiError) {
|
|
152
|
+
error(e.code, e.message, e.suggestedFix);
|
|
153
|
+
}
|
|
154
|
+
else {
|
|
155
|
+
error('NETWORK_ERROR', String(e), 'Check your internet connection.');
|
|
156
|
+
}
|
|
157
|
+
process.exit(1);
|
|
158
|
+
}
|
|
159
|
+
if (isJsonMode()) {
|
|
160
|
+
success({ deleted: true, site: name });
|
|
161
|
+
}
|
|
162
|
+
else {
|
|
163
|
+
successMessage(`Deleted: ${name}`);
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
//# sourceMappingURL=sites.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sites.js","sourceRoot":"","sources":["../../src/commands/sites.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AA4FA,wBAAsB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAoG1C"}
|
package/dist/index.js
CHANGED
|
@@ -1,8 +1,13 @@
|
|
|
1
1
|
import { login } from './commands/login.js';
|
|
2
|
+
import { logout } from './commands/logout.js';
|
|
2
3
|
import { whoami } from './commands/whoami.js';
|
|
3
4
|
import { publish } from './commands/publish.js';
|
|
5
|
+
import { sites } from './commands/sites.js';
|
|
6
|
+
import { open } from './commands/open.js';
|
|
7
|
+
import { init } from './commands/init.js';
|
|
8
|
+
import { pull } from './commands/pull.js';
|
|
4
9
|
import { setJsonMode } from './lib/output.js';
|
|
5
|
-
const VERSION = '0.
|
|
10
|
+
const VERSION = '0.0.3';
|
|
6
11
|
const HELP = `
|
|
7
12
|
42ws — Publish static sites in one command
|
|
8
13
|
|
|
@@ -10,9 +15,17 @@ Usage:
|
|
|
10
15
|
42ws <command> [options]
|
|
11
16
|
|
|
12
17
|
Commands:
|
|
13
|
-
login
|
|
14
|
-
|
|
15
|
-
whoami
|
|
18
|
+
login Authenticate with your 42ws token
|
|
19
|
+
logout Remove stored credentials
|
|
20
|
+
whoami Show currently logged-in user
|
|
21
|
+
publish Publish a static site
|
|
22
|
+
sites List sites (alias for sites list)
|
|
23
|
+
sites list List all sites
|
|
24
|
+
sites create <name> Create a new site
|
|
25
|
+
sites delete <name> Delete a site
|
|
26
|
+
init Create 42ws.json interactively
|
|
27
|
+
open [name] Open site URL in browser
|
|
28
|
+
pull --site <name> Download published files locally
|
|
16
29
|
|
|
17
30
|
Options:
|
|
18
31
|
--help, -h Show this help message
|
|
@@ -24,6 +37,13 @@ Examples:
|
|
|
24
37
|
42ws publish --site my-site --dir dist
|
|
25
38
|
42ws publish --site my-site --build "npm run build"
|
|
26
39
|
42ws whoami
|
|
40
|
+
42ws logout
|
|
41
|
+
42ws sites
|
|
42
|
+
42ws sites create my-site
|
|
43
|
+
42ws sites delete my-site --yes
|
|
44
|
+
42ws init
|
|
45
|
+
42ws open my-site
|
|
46
|
+
42ws pull --site my-site --dir ./downloaded
|
|
27
47
|
`.trim();
|
|
28
48
|
function parseArgs(argv) {
|
|
29
49
|
const flags = {};
|
|
@@ -64,7 +84,7 @@ function parseArgs(argv) {
|
|
|
64
84
|
}
|
|
65
85
|
export async function main() {
|
|
66
86
|
const argv = process.argv.slice(2);
|
|
67
|
-
const { command, flags } = parseArgs(argv);
|
|
87
|
+
const { command, flags, positional } = parseArgs(argv);
|
|
68
88
|
// Global flags
|
|
69
89
|
if (flags['json'] === true) {
|
|
70
90
|
setJsonMode(true);
|
|
@@ -92,6 +112,9 @@ export async function main() {
|
|
|
92
112
|
apiUrl: flags['api-url'],
|
|
93
113
|
});
|
|
94
114
|
break;
|
|
115
|
+
case 'logout':
|
|
116
|
+
await logout();
|
|
117
|
+
break;
|
|
95
118
|
case 'whoami':
|
|
96
119
|
await whoami();
|
|
97
120
|
break;
|
|
@@ -106,6 +129,41 @@ export async function main() {
|
|
|
106
129
|
noBuild: flags['no-build'] === true,
|
|
107
130
|
});
|
|
108
131
|
break;
|
|
132
|
+
case 'sites': {
|
|
133
|
+
// positional[0] is the subcommand (list, create, delete)
|
|
134
|
+
// positional[1..] are the args to the subcommand
|
|
135
|
+
const subcommand = positional[0];
|
|
136
|
+
const subPositional = positional.slice(1);
|
|
137
|
+
await sites({
|
|
138
|
+
subcommand,
|
|
139
|
+
positional: subPositional,
|
|
140
|
+
yes: flags['yes'] === true,
|
|
141
|
+
json: flags['json'] === true,
|
|
142
|
+
});
|
|
143
|
+
break;
|
|
144
|
+
}
|
|
145
|
+
case 'open':
|
|
146
|
+
await open({
|
|
147
|
+
name: positional[0] ?? flags['site'],
|
|
148
|
+
json: flags['json'] === true,
|
|
149
|
+
});
|
|
150
|
+
break;
|
|
151
|
+
case 'init':
|
|
152
|
+
await init({
|
|
153
|
+
site: flags['site'],
|
|
154
|
+
output: flags['output'],
|
|
155
|
+
build: flags['build'],
|
|
156
|
+
spa: flags['spa'] === true,
|
|
157
|
+
yes: flags['yes'] === true,
|
|
158
|
+
});
|
|
159
|
+
break;
|
|
160
|
+
case 'pull':
|
|
161
|
+
await pull({
|
|
162
|
+
site: flags['site'],
|
|
163
|
+
dir: flags['dir'],
|
|
164
|
+
yes: flags['yes'] === true,
|
|
165
|
+
});
|
|
166
|
+
break;
|
|
109
167
|
default:
|
|
110
168
|
process.stderr.write(`Unknown command: ${command}\n\n${HELP}\n`);
|
|
111
169
|
process.exit(1);
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,qBAAqB,CAAC;AAC5C,OAAO,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAC9C,OAAO,EAAE,OAAO,EAAE,MAAM,uBAAuB,CAAC;AAChD,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAE9C,MAAM,OAAO,GAAG,OAAO,CAAC;AAExB,MAAM,IAAI,GAAG
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/lib/config.d.ts
CHANGED
|
@@ -3,5 +3,11 @@ export interface Config {
|
|
|
3
3
|
apiUrl: string;
|
|
4
4
|
}
|
|
5
5
|
export declare function loadConfig(): Config;
|
|
6
|
-
|
|
6
|
+
/**
|
|
7
|
+
* Save config. Pass `removeToken: true` to explicitly remove the token field.
|
|
8
|
+
* Otherwise the existing token is preserved unless `token` is supplied.
|
|
9
|
+
*/
|
|
10
|
+
export declare function saveConfig(config: Partial<Config> & {
|
|
11
|
+
removeToken?: boolean;
|
|
12
|
+
}): void;
|
|
7
13
|
//# sourceMappingURL=config.d.ts.map
|
package/dist/lib/config.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/lib/config.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,MAAM;IACrB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;CAChB;AAMD,wBAAgB,UAAU,IAAI,MAAM,CAkBnC;AAED,wBAAgB,UAAU,CAAC,MAAM,EAAE,OAAO,CAAC,MAAM,CAAC,GAAG,IAAI,
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/lib/config.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,MAAM;IACrB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;CAChB;AAMD,wBAAgB,UAAU,IAAI,MAAM,CAkBnC;AAED;;;GAGG;AACH,wBAAgB,UAAU,CAAC,MAAM,EAAE,OAAO,CAAC,MAAM,CAAC,GAAG;IAAE,WAAW,CAAC,EAAE,OAAO,CAAA;CAAE,GAAG,IAAI,CAYpF"}
|
package/dist/lib/config.js
CHANGED
|
@@ -22,10 +22,14 @@ export function loadConfig() {
|
|
|
22
22
|
apiUrl: process.env['FORTYTWO_WS_API_URL'] ?? fileConfig.apiUrl ?? DEFAULT_API_URL,
|
|
23
23
|
};
|
|
24
24
|
}
|
|
25
|
+
/**
|
|
26
|
+
* Save config. Pass `removeToken: true` to explicitly remove the token field.
|
|
27
|
+
* Otherwise the existing token is preserved unless `token` is supplied.
|
|
28
|
+
*/
|
|
25
29
|
export function saveConfig(config) {
|
|
26
30
|
const existing = loadConfig();
|
|
27
31
|
const merged = {
|
|
28
|
-
token: config.token ?? existing.token,
|
|
32
|
+
token: config.removeToken ? undefined : (config.token ?? existing.token),
|
|
29
33
|
apiUrl: config.apiUrl ?? existing.apiUrl,
|
|
30
34
|
};
|
|
31
35
|
if (!existsSync(dirname(CONFIG_FILE))) {
|
package/dist/lib/config.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/lib/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAC7E,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAO1C,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,OAAO,CAAC,CAAC;AAC5C,MAAM,WAAW,GAAG,IAAI,CAAC,UAAU,EAAE,aAAa,CAAC,CAAC;AACpD,MAAM,eAAe,GAAG,0BAA0B,CAAC;AAEnD,MAAM,UAAU,UAAU;IACxB,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,qBAAqB,CAAC,IAAI,eAAe,CAAC;IACrE,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAC;IAE/C,IAAI,UAAU,GAAoB,EAAE,CAAC;IACrC,IAAI,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;QAC5B,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,YAAY,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;YAC/C,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAoB,CAAC;QAClD,CAAC;QAAC,MAAM,CAAC;YACP,mCAAmC;QACrC,CAAC;IACH,CAAC;IAED,OAAO;QACL,KAAK,EAAE,KAAK,IAAI,UAAU,CAAC,KAAK;QAChC,MAAM,EAAE,OAAO,CAAC,GAAG,CAAC,qBAAqB,CAAC,IAAI,UAAU,CAAC,MAAM,IAAI,eAAe;KACnF,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/lib/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAC7E,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAO1C,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,OAAO,CAAC,CAAC;AAC5C,MAAM,WAAW,GAAG,IAAI,CAAC,UAAU,EAAE,aAAa,CAAC,CAAC;AACpD,MAAM,eAAe,GAAG,0BAA0B,CAAC;AAEnD,MAAM,UAAU,UAAU;IACxB,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,qBAAqB,CAAC,IAAI,eAAe,CAAC;IACrE,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAC;IAE/C,IAAI,UAAU,GAAoB,EAAE,CAAC;IACrC,IAAI,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;QAC5B,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,YAAY,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;YAC/C,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAoB,CAAC;QAClD,CAAC;QAAC,MAAM,CAAC;YACP,mCAAmC;QACrC,CAAC;IACH,CAAC;IAED,OAAO;QACL,KAAK,EAAE,KAAK,IAAI,UAAU,CAAC,KAAK;QAChC,MAAM,EAAE,OAAO,CAAC,GAAG,CAAC,qBAAqB,CAAC,IAAI,UAAU,CAAC,MAAM,IAAI,eAAe;KACnF,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,UAAU,CAAC,MAAmD;IAC5E,MAAM,QAAQ,GAAG,UAAU,EAAE,CAAC;IAC9B,MAAM,MAAM,GAAW;QACrB,KAAK,EAAE,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,IAAI,QAAQ,CAAC,KAAK,CAAC;QACxE,MAAM,EAAE,MAAM,CAAC,MAAM,IAAI,QAAQ,CAAC,MAAM;KACzC,CAAC;IAEF,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,EAAE,CAAC;QACtC,SAAS,CAAC,OAAO,CAAC,WAAW,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACvD,CAAC;IAED,aAAa,CAAC,WAAW,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;AACtF,CAAC"}
|