nivii 0.1.1 → 0.1.2
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/dist/dist/commands/share.d.ts.map +1 -1
- package/dist/dist/commands/share.js +9 -15
- package/dist/dist/commands/share.js.map +1 -1
- package/dist/dist/core/upload.d.ts +1 -1
- package/dist/dist/core/upload.d.ts.map +1 -1
- package/dist/dist/core/upload.js +41 -17
- package/dist/dist/core/upload.js.map +1 -1
- package/dist/src/commands/share.d.ts.map +1 -1
- package/dist/src/commands/share.js +9 -15
- package/dist/src/commands/share.js.map +1 -1
- package/dist/src/core/upload.d.ts +1 -1
- package/dist/src/core/upload.d.ts.map +1 -1
- package/dist/src/core/upload.js +41 -17
- package/dist/src/core/upload.js.map +1 -1
- package/package.json +1 -1
- package/src/src/commands/share.ts +9 -16
- package/src/src/core/upload.ts +40 -12
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"share.d.ts","sourceRoot":"","sources":["../../src/commands/share.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"share.d.ts","sourceRoot":"","sources":["../../src/commands/share.ts"],"names":[],"mappings":"AAaA,MAAM,WAAW,YAAY;IAC3B,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,EAAE,CAAC,EAAE,OAAO,CAAC;CACd;AAED,wBAAsB,QAAQ,CAAC,IAAI,EAAE,YAAY,iBAgIhD"}
|
|
@@ -2,7 +2,6 @@ import path from 'path';
|
|
|
2
2
|
import chalk from 'chalk';
|
|
3
3
|
import { detectFramework } from '../core/detect.js';
|
|
4
4
|
import { runBuild } from '../core/build.js';
|
|
5
|
-
import { zipDirectory } from '../utils/zip.js';
|
|
6
5
|
import { uploadDeploy } from '../core/upload.js';
|
|
7
6
|
import { generateSlug } from '../utils/hash.js';
|
|
8
7
|
import { loadConfig, updateConfig } from '../utils/config.js';
|
|
@@ -47,12 +46,9 @@ export async function runShare(opts) {
|
|
|
47
46
|
warn('Custom slugs require Nivii Pro. Using random slug instead.');
|
|
48
47
|
slug = generateSlug(8);
|
|
49
48
|
}
|
|
50
|
-
// ─── 4.
|
|
51
|
-
step('📦', 'Compressing project…');
|
|
52
|
-
const zipPath = await zipDirectory(fullOutputDir);
|
|
53
|
-
// ─── 5. Upload ─────────────────────────────────────────────────────────────
|
|
49
|
+
// ─── 4. Upload (files directly, no zip) ────────────────────────────────────
|
|
54
50
|
const deployResult = await uploadDeploy({
|
|
55
|
-
|
|
51
|
+
buildDir: fullOutputDir,
|
|
56
52
|
slug,
|
|
57
53
|
token: config.token,
|
|
58
54
|
password: opts.pass,
|
|
@@ -63,7 +59,7 @@ export async function runShare(opts) {
|
|
|
63
59
|
maxViews: opts.maxViews,
|
|
64
60
|
selfDestruct: opts.selfDestruct,
|
|
65
61
|
});
|
|
66
|
-
// ───
|
|
62
|
+
// ─── 5. Save to config ─────────────────────────────────────────────────────
|
|
67
63
|
const deployments = config.deployments || [];
|
|
68
64
|
deployments.unshift({
|
|
69
65
|
slug: deployResult.slug,
|
|
@@ -72,7 +68,7 @@ export async function runShare(opts) {
|
|
|
72
68
|
expiresAt: deployResult.expiresAt,
|
|
73
69
|
});
|
|
74
70
|
updateConfig({ deployments: deployments.slice(0, 20) });
|
|
75
|
-
// ───
|
|
71
|
+
// ─── 6. Output ─────────────────────────────────────────────────────────────
|
|
76
72
|
console.log('');
|
|
77
73
|
console.log(theme.box([
|
|
78
74
|
theme.accent(' 🚀 Your project is live!'),
|
|
@@ -85,20 +81,20 @@ export async function runShare(opts) {
|
|
|
85
81
|
...(opts.collab ? [' ' + theme.muted('Collab:') + ' ' + theme.success('✓ Active')] : []),
|
|
86
82
|
]));
|
|
87
83
|
console.log('');
|
|
88
|
-
// ───
|
|
84
|
+
// ─── 7. Copy URL to clipboard ──────────────────────────────────────────────
|
|
89
85
|
const copied = await copyToClipboard(deployResult.url);
|
|
90
86
|
if (copied) {
|
|
91
87
|
success('URL copied to clipboard');
|
|
92
88
|
}
|
|
93
|
-
// ───
|
|
89
|
+
// ─── 8. QR code ────────────────────────────────────────────────────────────
|
|
94
90
|
if (opts.qr !== false) {
|
|
95
91
|
await showQR(deployResult.url);
|
|
96
92
|
}
|
|
97
|
-
// ───
|
|
93
|
+
// ─── 9. Open browser ───────────────────────────────────────────────────────
|
|
98
94
|
if (opts.open !== false) {
|
|
99
95
|
await openBrowser(deployResult.url);
|
|
100
96
|
}
|
|
101
|
-
// ───
|
|
97
|
+
// ─── 10. Live sync ─────────────────────────────────────────────────────────
|
|
102
98
|
if (opts.live && deployResult.liveToken) {
|
|
103
99
|
console.log('');
|
|
104
100
|
console.log(theme.accent(' ⚡ Live Sync Active') + theme.muted(' — watching for changes…'));
|
|
@@ -109,9 +105,8 @@ export async function runShare(opts) {
|
|
|
109
105
|
slug: deployResult.slug,
|
|
110
106
|
liveToken: deployResult.liveToken,
|
|
111
107
|
onUpdate: async () => {
|
|
112
|
-
const newZip = await zipDirectory(fullOutputDir);
|
|
113
108
|
await uploadDeploy({
|
|
114
|
-
|
|
109
|
+
buildDir: fullOutputDir,
|
|
115
110
|
slug: deployResult.slug,
|
|
116
111
|
token: config.token,
|
|
117
112
|
live: true,
|
|
@@ -124,7 +119,6 @@ export async function runShare(opts) {
|
|
|
124
119
|
console.log(theme.muted(' ↳ Live sync stopped'));
|
|
125
120
|
process.exit(0);
|
|
126
121
|
});
|
|
127
|
-
// Keep process alive
|
|
128
122
|
await new Promise(() => { });
|
|
129
123
|
}
|
|
130
124
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"share.js","sourceRoot":"","sources":["../../src/commands/share.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,YAAY,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"share.js","sourceRoot":"","sources":["../../src/commands/share.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"upload.d.ts","sourceRoot":"","sources":["../../src/core/upload.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"upload.d.ts","sourceRoot":"","sources":["../../src/core/upload.ts"],"names":[],"mappings":"AASA,MAAM,WAAW,aAAa;IAC5B,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,YAAY,CAAC,EAAE,OAAO,CAAC;CACxB;AAED,MAAM,WAAW,YAAY;IAC3B,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAgBD,wBAAsB,YAAY,CAAC,IAAI,EAAE,aAAa,GAAG,OAAO,CAAC,YAAY,CAAC,CAiD7E"}
|
package/dist/dist/core/upload.js
CHANGED
|
@@ -1,30 +1,54 @@
|
|
|
1
1
|
import fs from 'fs';
|
|
2
|
+
import path from 'path';
|
|
2
3
|
import fetch from 'node-fetch';
|
|
3
4
|
import FormData from 'form-data';
|
|
4
5
|
import { createSpinner } from '../ui/spinner.js';
|
|
5
6
|
import { API_BASE } from '../utils/config.js';
|
|
6
7
|
import chalk from 'chalk';
|
|
8
|
+
/** Recursively collect all files under a directory */
|
|
9
|
+
function collectFiles(dir, base = dir) {
|
|
10
|
+
const results = [];
|
|
11
|
+
for (const entry of fs.readdirSync(dir, { withFileTypes: true })) {
|
|
12
|
+
const abs = path.join(dir, entry.name);
|
|
13
|
+
if (entry.isDirectory()) {
|
|
14
|
+
results.push(...collectFiles(abs, base));
|
|
15
|
+
}
|
|
16
|
+
else {
|
|
17
|
+
results.push({ abs, rel: path.relative(base, abs).replace(/\\/g, '/') });
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
return results;
|
|
21
|
+
}
|
|
7
22
|
export async function uploadDeploy(opts) {
|
|
8
23
|
const spinner = createSpinner('Uploading to edge network…');
|
|
9
24
|
spinner.start();
|
|
10
|
-
const form = new FormData();
|
|
11
|
-
form.append('file', fs.createReadStream(opts.zipPath), { filename: 'deploy.zip' });
|
|
12
|
-
form.append('slug', opts.slug);
|
|
13
|
-
if (opts.password)
|
|
14
|
-
form.append('password', opts.password);
|
|
15
|
-
if (opts.otp)
|
|
16
|
-
form.append('otp', 'true');
|
|
17
|
-
if (opts.expires)
|
|
18
|
-
form.append('expires', opts.expires);
|
|
19
|
-
if (opts.live)
|
|
20
|
-
form.append('live', 'true');
|
|
21
|
-
if (opts.collab)
|
|
22
|
-
form.append('collab', 'true');
|
|
23
|
-
if (opts.maxViews)
|
|
24
|
-
form.append('maxViews', String(opts.maxViews));
|
|
25
|
-
if (opts.selfDestruct)
|
|
26
|
-
form.append('selfDestruct', 'true');
|
|
27
25
|
try {
|
|
26
|
+
const files = collectFiles(opts.buildDir);
|
|
27
|
+
if (files.length === 0) {
|
|
28
|
+
throw new Error('No files found in build directory');
|
|
29
|
+
}
|
|
30
|
+
const form = new FormData();
|
|
31
|
+
form.append('slug', opts.slug);
|
|
32
|
+
form.append('fileCount', String(files.length));
|
|
33
|
+
if (opts.password)
|
|
34
|
+
form.append('password', opts.password);
|
|
35
|
+
if (opts.otp)
|
|
36
|
+
form.append('otp', 'true');
|
|
37
|
+
if (opts.expires)
|
|
38
|
+
form.append('expires', opts.expires);
|
|
39
|
+
if (opts.live)
|
|
40
|
+
form.append('live', 'true');
|
|
41
|
+
if (opts.collab)
|
|
42
|
+
form.append('collab', 'true');
|
|
43
|
+
if (opts.maxViews)
|
|
44
|
+
form.append('maxViews', String(opts.maxViews));
|
|
45
|
+
if (opts.selfDestruct)
|
|
46
|
+
form.append('selfDestruct', 'true');
|
|
47
|
+
// Attach each file with its relative path as the field name
|
|
48
|
+
for (const { abs, rel } of files) {
|
|
49
|
+
form.append('file[]', fs.createReadStream(abs), { filename: rel });
|
|
50
|
+
form.append('path[]', rel);
|
|
51
|
+
}
|
|
28
52
|
const res = await fetch(`${API_BASE}/deploy`, {
|
|
29
53
|
method: 'POST',
|
|
30
54
|
headers: {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"upload.js","sourceRoot":"","sources":["../../src/core/upload.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,KAAK,MAAM,YAAY,CAAC;AAC/B,OAAO,QAAQ,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,KAAK,MAAM,OAAO,CAAC;AAwB1B,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,IAAmB;IACpD,MAAM,OAAO,GAAG,aAAa,CAAC,4BAA4B,CAAC,CAAC;IAC5D,OAAO,CAAC,KAAK,EAAE,CAAC;IAEhB,MAAM,
|
|
1
|
+
{"version":3,"file":"upload.js","sourceRoot":"","sources":["../../src/core/upload.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"share.d.ts","sourceRoot":"","sources":["../../../src/src/commands/share.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"share.d.ts","sourceRoot":"","sources":["../../../src/src/commands/share.ts"],"names":[],"mappings":"AAaA,MAAM,WAAW,YAAY;IAC3B,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,EAAE,CAAC,EAAE,OAAO,CAAC;CACd;AAED,wBAAsB,QAAQ,CAAC,IAAI,EAAE,YAAY,iBAgIhD"}
|
|
@@ -2,7 +2,6 @@ import path from 'path';
|
|
|
2
2
|
import chalk from 'chalk';
|
|
3
3
|
import { detectFramework } from '../core/detect.js';
|
|
4
4
|
import { runBuild } from '../core/build.js';
|
|
5
|
-
import { zipDirectory } from '../utils/zip.js';
|
|
6
5
|
import { uploadDeploy } from '../core/upload.js';
|
|
7
6
|
import { generateSlug } from '../utils/hash.js';
|
|
8
7
|
import { loadConfig, updateConfig } from '../utils/config.js';
|
|
@@ -47,12 +46,9 @@ export async function runShare(opts) {
|
|
|
47
46
|
warn('Custom slugs require Nivii Pro. Using random slug instead.');
|
|
48
47
|
slug = generateSlug(8);
|
|
49
48
|
}
|
|
50
|
-
// ─── 4.
|
|
51
|
-
step('📦', 'Compressing project…');
|
|
52
|
-
const zipPath = await zipDirectory(fullOutputDir);
|
|
53
|
-
// ─── 5. Upload ─────────────────────────────────────────────────────────────
|
|
49
|
+
// ─── 4. Upload (files directly, no zip) ────────────────────────────────────
|
|
54
50
|
const deployResult = await uploadDeploy({
|
|
55
|
-
|
|
51
|
+
buildDir: fullOutputDir,
|
|
56
52
|
slug,
|
|
57
53
|
token: config.token,
|
|
58
54
|
password: opts.pass,
|
|
@@ -63,7 +59,7 @@ export async function runShare(opts) {
|
|
|
63
59
|
maxViews: opts.maxViews,
|
|
64
60
|
selfDestruct: opts.selfDestruct,
|
|
65
61
|
});
|
|
66
|
-
// ───
|
|
62
|
+
// ─── 5. Save to config ─────────────────────────────────────────────────────
|
|
67
63
|
const deployments = config.deployments || [];
|
|
68
64
|
deployments.unshift({
|
|
69
65
|
slug: deployResult.slug,
|
|
@@ -72,7 +68,7 @@ export async function runShare(opts) {
|
|
|
72
68
|
expiresAt: deployResult.expiresAt,
|
|
73
69
|
});
|
|
74
70
|
updateConfig({ deployments: deployments.slice(0, 20) });
|
|
75
|
-
// ───
|
|
71
|
+
// ─── 6. Output ─────────────────────────────────────────────────────────────
|
|
76
72
|
console.log('');
|
|
77
73
|
console.log(theme.box([
|
|
78
74
|
theme.accent(' 🚀 Your project is live!'),
|
|
@@ -85,20 +81,20 @@ export async function runShare(opts) {
|
|
|
85
81
|
...(opts.collab ? [' ' + theme.muted('Collab:') + ' ' + theme.success('✓ Active')] : []),
|
|
86
82
|
]));
|
|
87
83
|
console.log('');
|
|
88
|
-
// ───
|
|
84
|
+
// ─── 7. Copy URL to clipboard ──────────────────────────────────────────────
|
|
89
85
|
const copied = await copyToClipboard(deployResult.url);
|
|
90
86
|
if (copied) {
|
|
91
87
|
success('URL copied to clipboard');
|
|
92
88
|
}
|
|
93
|
-
// ───
|
|
89
|
+
// ─── 8. QR code ────────────────────────────────────────────────────────────
|
|
94
90
|
if (opts.qr !== false) {
|
|
95
91
|
await showQR(deployResult.url);
|
|
96
92
|
}
|
|
97
|
-
// ───
|
|
93
|
+
// ─── 9. Open browser ───────────────────────────────────────────────────────
|
|
98
94
|
if (opts.open !== false) {
|
|
99
95
|
await openBrowser(deployResult.url);
|
|
100
96
|
}
|
|
101
|
-
// ───
|
|
97
|
+
// ─── 10. Live sync ─────────────────────────────────────────────────────────
|
|
102
98
|
if (opts.live && deployResult.liveToken) {
|
|
103
99
|
console.log('');
|
|
104
100
|
console.log(theme.accent(' ⚡ Live Sync Active') + theme.muted(' — watching for changes…'));
|
|
@@ -109,9 +105,8 @@ export async function runShare(opts) {
|
|
|
109
105
|
slug: deployResult.slug,
|
|
110
106
|
liveToken: deployResult.liveToken,
|
|
111
107
|
onUpdate: async () => {
|
|
112
|
-
const newZip = await zipDirectory(fullOutputDir);
|
|
113
108
|
await uploadDeploy({
|
|
114
|
-
|
|
109
|
+
buildDir: fullOutputDir,
|
|
115
110
|
slug: deployResult.slug,
|
|
116
111
|
token: config.token,
|
|
117
112
|
live: true,
|
|
@@ -124,7 +119,6 @@ export async function runShare(opts) {
|
|
|
124
119
|
console.log(theme.muted(' ↳ Live sync stopped'));
|
|
125
120
|
process.exit(0);
|
|
126
121
|
});
|
|
127
|
-
// Keep process alive
|
|
128
122
|
await new Promise(() => { });
|
|
129
123
|
}
|
|
130
124
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"share.js","sourceRoot":"","sources":["../../../src/src/commands/share.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,YAAY,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"share.js","sourceRoot":"","sources":["../../../src/src/commands/share.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"upload.d.ts","sourceRoot":"","sources":["../../../src/src/core/upload.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"upload.d.ts","sourceRoot":"","sources":["../../../src/src/core/upload.ts"],"names":[],"mappings":"AASA,MAAM,WAAW,aAAa;IAC5B,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,YAAY,CAAC,EAAE,OAAO,CAAC;CACxB;AAED,MAAM,WAAW,YAAY;IAC3B,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAgBD,wBAAsB,YAAY,CAAC,IAAI,EAAE,aAAa,GAAG,OAAO,CAAC,YAAY,CAAC,CAiD7E"}
|
package/dist/src/core/upload.js
CHANGED
|
@@ -1,30 +1,54 @@
|
|
|
1
1
|
import fs from 'fs';
|
|
2
|
+
import path from 'path';
|
|
2
3
|
import fetch from 'node-fetch';
|
|
3
4
|
import FormData from 'form-data';
|
|
4
5
|
import { createSpinner } from '../ui/spinner.js';
|
|
5
6
|
import { API_BASE } from '../utils/config.js';
|
|
6
7
|
import chalk from 'chalk';
|
|
8
|
+
/** Recursively collect all files under a directory */
|
|
9
|
+
function collectFiles(dir, base = dir) {
|
|
10
|
+
const results = [];
|
|
11
|
+
for (const entry of fs.readdirSync(dir, { withFileTypes: true })) {
|
|
12
|
+
const abs = path.join(dir, entry.name);
|
|
13
|
+
if (entry.isDirectory()) {
|
|
14
|
+
results.push(...collectFiles(abs, base));
|
|
15
|
+
}
|
|
16
|
+
else {
|
|
17
|
+
results.push({ abs, rel: path.relative(base, abs).replace(/\\/g, '/') });
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
return results;
|
|
21
|
+
}
|
|
7
22
|
export async function uploadDeploy(opts) {
|
|
8
23
|
const spinner = createSpinner('Uploading to edge network…');
|
|
9
24
|
spinner.start();
|
|
10
|
-
const form = new FormData();
|
|
11
|
-
form.append('file', fs.createReadStream(opts.zipPath), { filename: 'deploy.zip' });
|
|
12
|
-
form.append('slug', opts.slug);
|
|
13
|
-
if (opts.password)
|
|
14
|
-
form.append('password', opts.password);
|
|
15
|
-
if (opts.otp)
|
|
16
|
-
form.append('otp', 'true');
|
|
17
|
-
if (opts.expires)
|
|
18
|
-
form.append('expires', opts.expires);
|
|
19
|
-
if (opts.live)
|
|
20
|
-
form.append('live', 'true');
|
|
21
|
-
if (opts.collab)
|
|
22
|
-
form.append('collab', 'true');
|
|
23
|
-
if (opts.maxViews)
|
|
24
|
-
form.append('maxViews', String(opts.maxViews));
|
|
25
|
-
if (opts.selfDestruct)
|
|
26
|
-
form.append('selfDestruct', 'true');
|
|
27
25
|
try {
|
|
26
|
+
const files = collectFiles(opts.buildDir);
|
|
27
|
+
if (files.length === 0) {
|
|
28
|
+
throw new Error('No files found in build directory');
|
|
29
|
+
}
|
|
30
|
+
const form = new FormData();
|
|
31
|
+
form.append('slug', opts.slug);
|
|
32
|
+
form.append('fileCount', String(files.length));
|
|
33
|
+
if (opts.password)
|
|
34
|
+
form.append('password', opts.password);
|
|
35
|
+
if (opts.otp)
|
|
36
|
+
form.append('otp', 'true');
|
|
37
|
+
if (opts.expires)
|
|
38
|
+
form.append('expires', opts.expires);
|
|
39
|
+
if (opts.live)
|
|
40
|
+
form.append('live', 'true');
|
|
41
|
+
if (opts.collab)
|
|
42
|
+
form.append('collab', 'true');
|
|
43
|
+
if (opts.maxViews)
|
|
44
|
+
form.append('maxViews', String(opts.maxViews));
|
|
45
|
+
if (opts.selfDestruct)
|
|
46
|
+
form.append('selfDestruct', 'true');
|
|
47
|
+
// Attach each file with its relative path as the field name
|
|
48
|
+
for (const { abs, rel } of files) {
|
|
49
|
+
form.append('file[]', fs.createReadStream(abs), { filename: rel });
|
|
50
|
+
form.append('path[]', rel);
|
|
51
|
+
}
|
|
28
52
|
const res = await fetch(`${API_BASE}/deploy`, {
|
|
29
53
|
method: 'POST',
|
|
30
54
|
headers: {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"upload.js","sourceRoot":"","sources":["../../../src/src/core/upload.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,KAAK,MAAM,YAAY,CAAC;AAC/B,OAAO,QAAQ,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,KAAK,MAAM,OAAO,CAAC;AAwB1B,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,IAAmB;IACpD,MAAM,OAAO,GAAG,aAAa,CAAC,4BAA4B,CAAC,CAAC;IAC5D,OAAO,CAAC,KAAK,EAAE,CAAC;IAEhB,MAAM,
|
|
1
|
+
{"version":3,"file":"upload.js","sourceRoot":"","sources":["../../../src/src/core/upload.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,IAAI,MAAM,MAAM,CAAC;AAExB,OAAO,KAAK,MAAM,YAAY,CAAC;AAC/B,OAAO,QAAQ,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,KAAK,MAAM,OAAO,CAAC;AAwB1B,sDAAsD;AACtD,SAAS,YAAY,CAAC,GAAW,EAAE,OAAe,GAAG;IACnD,MAAM,OAAO,GAAmC,EAAE,CAAC;IACnD,KAAK,MAAM,KAAK,IAAI,EAAE,CAAC,WAAW,CAAC,GAAG,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;QACjE,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;QACvC,IAAI,KAAK,CAAC,WAAW,EAAE,EAAE,CAAC;YACxB,OAAO,CAAC,IAAI,CAAC,GAAG,YAAY,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC,CAAC;QAC3C,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC;QAC3E,CAAC;IACH,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,IAAmB;IACpD,MAAM,OAAO,GAAG,aAAa,CAAC,4BAA4B,CAAC,CAAC;IAC5D,OAAO,CAAC,KAAK,EAAE,CAAC;IAEhB,IAAI,CAAC;QACH,MAAM,KAAK,GAAG,YAAY,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAE1C,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACvB,MAAM,IAAI,KAAK,CAAC,mCAAmC,CAAC,CAAC;QACvD,CAAC;QAED,MAAM,IAAI,GAAG,IAAI,QAAQ,EAAE,CAAC;QAC5B,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;QAC/B,IAAI,CAAC,MAAM,CAAC,WAAW,EAAE,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC;QAC/C,IAAI,IAAI,CAAC,QAAQ;YAAK,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;QAC7D,IAAI,IAAI,CAAC,GAAG;YAAU,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;QACjD,IAAI,IAAI,CAAC,OAAO;YAAM,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;QAC3D,IAAI,IAAI,CAAC,IAAI;YAAS,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QAClD,IAAI,IAAI,CAAC,MAAM;YAAO,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;QACpD,IAAI,IAAI,CAAC,QAAQ;YAAK,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC;QACrE,IAAI,IAAI,CAAC,YAAY;YAAE,IAAI,CAAC,MAAM,CAAC,cAAc,EAAE,MAAM,CAAC,CAAC;QAE3D,4DAA4D;QAC5D,KAAK,MAAM,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,KAAK,EAAE,CAAC;YACjC,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,EAAE,CAAC,gBAAgB,CAAC,GAAG,CAAC,EAAE,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC,CAAC;YACnE,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;QAC7B,CAAC;QAED,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,QAAQ,SAAS,EAAE;YAC5C,MAAM,EAAE,MAAM;YACd,OAAO,EAAE;gBACP,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,aAAa,EAAE,UAAU,IAAI,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBAChE,GAAG,IAAI,CAAC,UAAU,EAAE;aACrB;YACD,IAAI,EAAE,IAAI;SACX,CAAC,CAAC;QAEH,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;YACZ,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC;YAC9B,MAAM,IAAI,KAAK,CAAC,kBAAkB,GAAG,CAAC,MAAM,IAAI,IAAI,EAAE,CAAC,CAAC;QAC1D,CAAC;QAED,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,IAAI,EAAkB,CAAC;QAChD,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,mBAAmB,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,IAAI,IAAI,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC;QACpG,OAAO,MAAM,CAAC;IAChB,CAAC;IAAC,OAAO,GAAQ,EAAE,CAAC;QAClB,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC;QACpD,MAAM,GAAG,CAAC;IACZ,CAAC;AACH,CAAC"}
|
package/package.json
CHANGED
|
@@ -2,7 +2,6 @@ import path from 'path';
|
|
|
2
2
|
import chalk from 'chalk';
|
|
3
3
|
import { detectFramework } from '../core/detect.js';
|
|
4
4
|
import { runBuild } from '../core/build.js';
|
|
5
|
-
import { zipDirectory } from '../utils/zip.js';
|
|
6
5
|
import { uploadDeploy } from '../core/upload.js';
|
|
7
6
|
import { generateSlug } from '../utils/hash.js';
|
|
8
7
|
import { loadConfig, updateConfig } from '../utils/config.js';
|
|
@@ -73,13 +72,9 @@ export async function runShare(opts: ShareOptions) {
|
|
|
73
72
|
slug = generateSlug(8);
|
|
74
73
|
}
|
|
75
74
|
|
|
76
|
-
// ─── 4.
|
|
77
|
-
step('📦', 'Compressing project…');
|
|
78
|
-
const zipPath = await zipDirectory(fullOutputDir);
|
|
79
|
-
|
|
80
|
-
// ─── 5. Upload ─────────────────────────────────────────────────────────────
|
|
75
|
+
// ─── 4. Upload (files directly, no zip) ────────────────────────────────────
|
|
81
76
|
const deployResult = await uploadDeploy({
|
|
82
|
-
|
|
77
|
+
buildDir: fullOutputDir,
|
|
83
78
|
slug,
|
|
84
79
|
token: config.token,
|
|
85
80
|
password: opts.pass,
|
|
@@ -91,7 +86,7 @@ export async function runShare(opts: ShareOptions) {
|
|
|
91
86
|
selfDestruct: opts.selfDestruct,
|
|
92
87
|
});
|
|
93
88
|
|
|
94
|
-
// ───
|
|
89
|
+
// ─── 5. Save to config ─────────────────────────────────────────────────────
|
|
95
90
|
const deployments = config.deployments || [];
|
|
96
91
|
deployments.unshift({
|
|
97
92
|
slug: deployResult.slug,
|
|
@@ -101,7 +96,7 @@ export async function runShare(opts: ShareOptions) {
|
|
|
101
96
|
});
|
|
102
97
|
updateConfig({ deployments: deployments.slice(0, 20) });
|
|
103
98
|
|
|
104
|
-
// ───
|
|
99
|
+
// ─── 6. Output ─────────────────────────────────────────────────────────────
|
|
105
100
|
console.log('');
|
|
106
101
|
console.log(theme.box([
|
|
107
102
|
theme.accent(' 🚀 Your project is live!'),
|
|
@@ -115,23 +110,23 @@ export async function runShare(opts: ShareOptions) {
|
|
|
115
110
|
]));
|
|
116
111
|
console.log('');
|
|
117
112
|
|
|
118
|
-
// ───
|
|
113
|
+
// ─── 7. Copy URL to clipboard ──────────────────────────────────────────────
|
|
119
114
|
const copied = await copyToClipboard(deployResult.url);
|
|
120
115
|
if (copied) {
|
|
121
116
|
success('URL copied to clipboard');
|
|
122
117
|
}
|
|
123
118
|
|
|
124
|
-
// ───
|
|
119
|
+
// ─── 8. QR code ────────────────────────────────────────────────────────────
|
|
125
120
|
if (opts.qr !== false) {
|
|
126
121
|
await showQR(deployResult.url);
|
|
127
122
|
}
|
|
128
123
|
|
|
129
|
-
// ───
|
|
124
|
+
// ─── 9. Open browser ───────────────────────────────────────────────────────
|
|
130
125
|
if (opts.open !== false) {
|
|
131
126
|
await openBrowser(deployResult.url);
|
|
132
127
|
}
|
|
133
128
|
|
|
134
|
-
// ───
|
|
129
|
+
// ─── 10. Live sync ─────────────────────────────────────────────────────────
|
|
135
130
|
if (opts.live && deployResult.liveToken) {
|
|
136
131
|
console.log('');
|
|
137
132
|
console.log(theme.accent(' ⚡ Live Sync Active') + theme.muted(' — watching for changes…'));
|
|
@@ -143,9 +138,8 @@ export async function runShare(opts: ShareOptions) {
|
|
|
143
138
|
slug: deployResult.slug,
|
|
144
139
|
liveToken: deployResult.liveToken,
|
|
145
140
|
onUpdate: async () => {
|
|
146
|
-
const newZip = await zipDirectory(fullOutputDir);
|
|
147
141
|
await uploadDeploy({
|
|
148
|
-
|
|
142
|
+
buildDir: fullOutputDir,
|
|
149
143
|
slug: deployResult.slug,
|
|
150
144
|
token: config.token,
|
|
151
145
|
live: true,
|
|
@@ -160,7 +154,6 @@ export async function runShare(opts: ShareOptions) {
|
|
|
160
154
|
process.exit(0);
|
|
161
155
|
});
|
|
162
156
|
|
|
163
|
-
// Keep process alive
|
|
164
157
|
await new Promise(() => {});
|
|
165
158
|
}
|
|
166
159
|
}
|
package/src/src/core/upload.ts
CHANGED
|
@@ -1,4 +1,6 @@
|
|
|
1
1
|
import fs from 'fs';
|
|
2
|
+
import path from 'path';
|
|
3
|
+
import os from 'os';
|
|
2
4
|
import fetch from 'node-fetch';
|
|
3
5
|
import FormData from 'form-data';
|
|
4
6
|
import { createSpinner } from '../ui/spinner.js';
|
|
@@ -6,7 +8,7 @@ import { API_BASE } from '../utils/config.js';
|
|
|
6
8
|
import chalk from 'chalk';
|
|
7
9
|
|
|
8
10
|
export interface UploadOptions {
|
|
9
|
-
|
|
11
|
+
buildDir: string; // path to the built output directory
|
|
10
12
|
slug: string;
|
|
11
13
|
token?: string;
|
|
12
14
|
password?: string;
|
|
@@ -27,22 +29,48 @@ export interface DeployResult {
|
|
|
27
29
|
expiresAt?: string;
|
|
28
30
|
}
|
|
29
31
|
|
|
32
|
+
/** Recursively collect all files under a directory */
|
|
33
|
+
function collectFiles(dir: string, base: string = dir): { abs: string; rel: string }[] {
|
|
34
|
+
const results: { abs: string; rel: string }[] = [];
|
|
35
|
+
for (const entry of fs.readdirSync(dir, { withFileTypes: true })) {
|
|
36
|
+
const abs = path.join(dir, entry.name);
|
|
37
|
+
if (entry.isDirectory()) {
|
|
38
|
+
results.push(...collectFiles(abs, base));
|
|
39
|
+
} else {
|
|
40
|
+
results.push({ abs, rel: path.relative(base, abs).replace(/\\/g, '/') });
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
return results;
|
|
44
|
+
}
|
|
45
|
+
|
|
30
46
|
export async function uploadDeploy(opts: UploadOptions): Promise<DeployResult> {
|
|
31
47
|
const spinner = createSpinner('Uploading to edge network…');
|
|
32
48
|
spinner.start();
|
|
33
49
|
|
|
34
|
-
const form = new FormData();
|
|
35
|
-
form.append('file', fs.createReadStream(opts.zipPath), { filename: 'deploy.zip' });
|
|
36
|
-
form.append('slug', opts.slug);
|
|
37
|
-
if (opts.password) form.append('password', opts.password);
|
|
38
|
-
if (opts.otp) form.append('otp', 'true');
|
|
39
|
-
if (opts.expires) form.append('expires', opts.expires);
|
|
40
|
-
if (opts.live) form.append('live', 'true');
|
|
41
|
-
if (opts.collab) form.append('collab', 'true');
|
|
42
|
-
if (opts.maxViews) form.append('maxViews', String(opts.maxViews));
|
|
43
|
-
if (opts.selfDestruct) form.append('selfDestruct', 'true');
|
|
44
|
-
|
|
45
50
|
try {
|
|
51
|
+
const files = collectFiles(opts.buildDir);
|
|
52
|
+
|
|
53
|
+
if (files.length === 0) {
|
|
54
|
+
throw new Error('No files found in build directory');
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
const form = new FormData();
|
|
58
|
+
form.append('slug', opts.slug);
|
|
59
|
+
form.append('fileCount', String(files.length));
|
|
60
|
+
if (opts.password) form.append('password', opts.password);
|
|
61
|
+
if (opts.otp) form.append('otp', 'true');
|
|
62
|
+
if (opts.expires) form.append('expires', opts.expires);
|
|
63
|
+
if (opts.live) form.append('live', 'true');
|
|
64
|
+
if (opts.collab) form.append('collab', 'true');
|
|
65
|
+
if (opts.maxViews) form.append('maxViews', String(opts.maxViews));
|
|
66
|
+
if (opts.selfDestruct) form.append('selfDestruct', 'true');
|
|
67
|
+
|
|
68
|
+
// Attach each file with its relative path as the field name
|
|
69
|
+
for (const { abs, rel } of files) {
|
|
70
|
+
form.append('file[]', fs.createReadStream(abs), { filename: rel });
|
|
71
|
+
form.append('path[]', rel);
|
|
72
|
+
}
|
|
73
|
+
|
|
46
74
|
const res = await fetch(`${API_BASE}/deploy`, {
|
|
47
75
|
method: 'POST',
|
|
48
76
|
headers: {
|