nivii 0.1.5 → 0.1.6
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 +362 -33
- package/dist/cli.js +1 -1
- package/dist/commands/share.d.ts.map +1 -1
- package/dist/commands/share.js +9 -15
- package/dist/commands/share.js.map +1 -1
- package/dist/core/upload.d.ts +1 -1
- package/dist/core/upload.d.ts.map +1 -1
- package/dist/core/upload.js +41 -17
- package/dist/core/upload.js.map +1 -1
- package/dist/ui/welcome.d.ts.map +1 -1
- package/dist/ui/welcome.js +39 -26
- package/dist/ui/welcome.js.map +1 -1
- package/package.json +1 -6
- package/src/cli.ts +1 -1
- package/src/commands/share.ts +9 -16
- package/src/core/upload.ts +40 -12
- package/src/ui/welcome.ts +47 -28
- package/dist/dist/cli.d.ts +0 -3
- package/dist/dist/cli.d.ts.map +0 -1
- package/dist/dist/cli.js +0 -108
- package/dist/dist/cli.js.map +0 -1
- package/dist/dist/commands/config.d.ts +0 -2
- package/dist/dist/commands/config.d.ts.map +0 -1
- package/dist/dist/commands/config.js +0 -32
- package/dist/dist/commands/config.js.map +0 -1
- package/dist/dist/commands/share.d.ts +0 -18
- package/dist/dist/commands/share.d.ts.map +0 -1
- package/dist/dist/commands/share.js +0 -125
- package/dist/dist/commands/share.js.map +0 -1
- package/dist/dist/commands/whoami.d.ts +0 -2
- package/dist/dist/commands/whoami.d.ts.map +0 -1
- package/dist/dist/commands/whoami.js +0 -17
- package/dist/dist/commands/whoami.js.map +0 -1
- package/dist/dist/core/analytics.d.ts +0 -11
- package/dist/dist/core/analytics.d.ts.map +0 -1
- package/dist/dist/core/analytics.js +0 -47
- package/dist/dist/core/analytics.js.map +0 -1
- package/dist/dist/core/build.d.ts +0 -11
- package/dist/dist/core/build.d.ts.map +0 -1
- package/dist/dist/core/build.js +0 -34
- package/dist/dist/core/build.js.map +0 -1
- package/dist/dist/core/detect.d.ts +0 -12
- package/dist/dist/core/detect.d.ts.map +0 -1
- package/dist/dist/core/detect.js +0 -122
- package/dist/dist/core/detect.js.map +0 -1
- package/dist/dist/core/qr.d.ts +0 -4
- package/dist/dist/core/qr.d.ts.map +0 -1
- package/dist/dist/core/qr.js +0 -29
- package/dist/dist/core/qr.js.map +0 -1
- package/dist/dist/core/tunnel.d.ts +0 -9
- package/dist/dist/core/tunnel.d.ts.map +0 -1
- package/dist/dist/core/tunnel.js +0 -55
- package/dist/dist/core/tunnel.js.map +0 -1
- package/dist/dist/core/upload.d.ts +0 -22
- package/dist/dist/core/upload.d.ts.map +0 -1
- package/dist/dist/core/upload.js +0 -73
- package/dist/dist/core/upload.js.map +0 -1
- package/dist/dist/ui/spinner.d.ts +0 -7
- package/dist/dist/ui/spinner.d.ts.map +0 -1
- package/dist/dist/ui/spinner.js +0 -32
- package/dist/dist/ui/spinner.js.map +0 -1
- package/dist/dist/ui/theme.d.ts +0 -14
- package/dist/dist/ui/theme.d.ts.map +0 -1
- package/dist/dist/ui/theme.js +0 -32
- package/dist/dist/ui/theme.js.map +0 -1
- package/dist/dist/ui/welcome.d.ts +0 -3
- package/dist/dist/ui/welcome.d.ts.map +0 -1
- package/dist/dist/ui/welcome.js +0 -52
- package/dist/dist/ui/welcome.js.map +0 -1
- package/dist/dist/utils/config.d.ts +0 -17
- package/dist/dist/utils/config.d.ts.map +0 -1
- package/dist/dist/utils/config.js +0 -31
- package/dist/dist/utils/config.js.map +0 -1
- package/dist/dist/utils/hash.d.ts +0 -3
- package/dist/dist/utils/hash.d.ts.map +0 -1
- package/dist/dist/utils/hash.js +0 -10
- package/dist/dist/utils/hash.js.map +0 -1
- package/dist/dist/utils/zip.d.ts +0 -2
- package/dist/dist/utils/zip.d.ts.map +0 -1
- package/dist/dist/utils/zip.js +0 -19
- package/dist/dist/utils/zip.js.map +0 -1
- package/dist/src/cli.d.ts +0 -3
- package/dist/src/cli.d.ts.map +0 -1
- package/dist/src/cli.js +0 -108
- package/dist/src/cli.js.map +0 -1
- package/dist/src/commands/config.d.ts +0 -2
- package/dist/src/commands/config.d.ts.map +0 -1
- package/dist/src/commands/config.js +0 -32
- package/dist/src/commands/config.js.map +0 -1
- package/dist/src/commands/share.d.ts +0 -18
- package/dist/src/commands/share.d.ts.map +0 -1
- package/dist/src/commands/share.js +0 -125
- package/dist/src/commands/share.js.map +0 -1
- package/dist/src/commands/whoami.d.ts +0 -2
- package/dist/src/commands/whoami.d.ts.map +0 -1
- package/dist/src/commands/whoami.js +0 -17
- package/dist/src/commands/whoami.js.map +0 -1
- package/dist/src/core/analytics.d.ts +0 -11
- package/dist/src/core/analytics.d.ts.map +0 -1
- package/dist/src/core/analytics.js +0 -47
- package/dist/src/core/analytics.js.map +0 -1
- package/dist/src/core/build.d.ts +0 -11
- package/dist/src/core/build.d.ts.map +0 -1
- package/dist/src/core/build.js +0 -34
- package/dist/src/core/build.js.map +0 -1
- package/dist/src/core/detect.d.ts +0 -12
- package/dist/src/core/detect.d.ts.map +0 -1
- package/dist/src/core/detect.js +0 -122
- package/dist/src/core/detect.js.map +0 -1
- package/dist/src/core/qr.d.ts +0 -4
- package/dist/src/core/qr.d.ts.map +0 -1
- package/dist/src/core/qr.js +0 -29
- package/dist/src/core/qr.js.map +0 -1
- package/dist/src/core/tunnel.d.ts +0 -9
- package/dist/src/core/tunnel.d.ts.map +0 -1
- package/dist/src/core/tunnel.js +0 -55
- package/dist/src/core/tunnel.js.map +0 -1
- package/dist/src/core/upload.d.ts +0 -22
- package/dist/src/core/upload.d.ts.map +0 -1
- package/dist/src/core/upload.js +0 -73
- package/dist/src/core/upload.js.map +0 -1
- package/dist/src/ui/spinner.d.ts +0 -7
- package/dist/src/ui/spinner.d.ts.map +0 -1
- package/dist/src/ui/spinner.js +0 -32
- package/dist/src/ui/spinner.js.map +0 -1
- package/dist/src/ui/theme.d.ts +0 -14
- package/dist/src/ui/theme.d.ts.map +0 -1
- package/dist/src/ui/theme.js +0 -32
- package/dist/src/ui/theme.js.map +0 -1
- package/dist/src/ui/welcome.d.ts +0 -3
- package/dist/src/ui/welcome.d.ts.map +0 -1
- package/dist/src/ui/welcome.js +0 -52
- package/dist/src/ui/welcome.js.map +0 -1
- package/dist/src/utils/config.d.ts +0 -17
- package/dist/src/utils/config.d.ts.map +0 -1
- package/dist/src/utils/config.js +0 -31
- package/dist/src/utils/config.js.map +0 -1
- package/dist/src/utils/hash.d.ts +0 -3
- package/dist/src/utils/hash.d.ts.map +0 -1
- package/dist/src/utils/hash.js +0 -10
- package/dist/src/utils/hash.js.map +0 -1
- package/dist/src/utils/zip.d.ts +0 -2
- package/dist/src/utils/zip.d.ts.map +0 -1
- package/dist/src/utils/zip.js +0 -19
- package/dist/src/utils/zip.js.map +0 -1
- package/src/src/cli.ts +0 -112
- package/src/src/commands/config.ts +0 -33
- package/src/src/commands/share.ts +0 -159
- package/src/src/commands/whoami.ts +0 -16
- package/src/src/core/analytics.ts +0 -64
- package/src/src/core/build.ts +0 -46
- package/src/src/core/detect.ts +0 -159
- package/src/src/core/qr.ts +0 -30
- package/src/src/core/tunnel.ts +0 -70
- package/src/src/core/upload.ts +0 -95
- package/src/src/ui/spinner.ts +0 -36
- package/src/src/ui/theme.ts +0 -35
- package/src/src/ui/welcome.ts +0 -60
- package/src/src/utils/config.ts +0 -47
- package/src/src/utils/hash.ts +0 -11
- package/src/src/utils/zip.ts +0 -22
- package/tsconfig.json +0 -17
package/README.md
CHANGED
|
@@ -1,6 +1,26 @@
|
|
|
1
|
-
|
|
1
|
+
```
|
|
2
|
+
███╗ ██╗██╗██╗ ██╗██╗██╗
|
|
3
|
+
████╗ ██║██║██║ ██║██║██║
|
|
4
|
+
██╔██╗ ██║██║██║ ██║██║██║
|
|
5
|
+
██║╚██╗██║██║╚██╗ ██╔╝██║██║
|
|
6
|
+
██║ ╚████║██║ ╚████╔╝ ██║██║
|
|
7
|
+
╚═╝ ╚═══╝╚═╝ ╚═══╝ ╚═╝╚═╝
|
|
8
|
+
```
|
|
9
|
+
|
|
10
|
+
<div align="center">
|
|
11
|
+
|
|
12
|
+
[](https://www.npmjs.com/package/nivii)
|
|
13
|
+
[](https://github.com/Aadigarg111/Nivi-sh/blob/main/LICENSE)
|
|
14
|
+
[](#)
|
|
15
|
+
[](https://github.com/Aadigarg111/Nivi-sh/pulls)
|
|
16
|
+
|
|
17
|
+
**⚡ The fastest, most beautiful way to share any local dev project. No accounts. No config. Just share.**
|
|
18
|
+
|
|
19
|
+
[Website](https://nivii.app) · [npm](https://www.npmjs.com/package/nivii) · [Issues](https://github.com/Aadigarg111/Nivi-sh/issues)
|
|
20
|
+
|
|
21
|
+
</div>
|
|
2
22
|
|
|
3
|
-
|
|
23
|
+
---
|
|
4
24
|
|
|
5
25
|
## Install
|
|
6
26
|
|
|
@@ -8,49 +28,358 @@
|
|
|
8
28
|
npm i -g nivii
|
|
9
29
|
```
|
|
10
30
|
|
|
11
|
-
|
|
31
|
+
```bash
|
|
32
|
+
# or with pnpm
|
|
33
|
+
pnpm add -g nivii
|
|
34
|
+
|
|
35
|
+
# or with bun
|
|
36
|
+
bun add -g nivii
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
---
|
|
40
|
+
|
|
41
|
+
## Quick Start
|
|
12
42
|
|
|
13
43
|
```bash
|
|
14
|
-
#
|
|
44
|
+
# Navigate to any project
|
|
45
|
+
cd ~/my-awesome-project
|
|
46
|
+
|
|
47
|
+
# Share it instantly
|
|
15
48
|
nivii share
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
**Example output:**
|
|
52
|
+
|
|
53
|
+
```
|
|
54
|
+
⚡ NIVII v0.1.0
|
|
55
|
+
|
|
56
|
+
🔍 Detecting project type… ~/my-awesome-project
|
|
57
|
+
✓ Detected Next.js (99% confidence)
|
|
58
|
+
✓ Build complete (nextjs)
|
|
59
|
+
📦 Compressing project…
|
|
60
|
+
✓ Deployed to edge (xk9m2pqr)
|
|
61
|
+
|
|
62
|
+
╭─────────────────────────────────────────────────╮
|
|
63
|
+
│ │
|
|
64
|
+
│ 🚀 Your project is live! │
|
|
65
|
+
│ │
|
|
66
|
+
│ URL: https://xk9m2pqr.nivii.app │
|
|
67
|
+
│ Expires: in 48 hours │
|
|
68
|
+
│ │
|
|
69
|
+
╰─────────────────────────────────────────────────╯
|
|
70
|
+
|
|
71
|
+
✓ URL copied to clipboard
|
|
72
|
+
|
|
73
|
+
┌─────────────────────────────────┐
|
|
74
|
+
│ Scan to open on mobile │
|
|
75
|
+
└─────────────────────────────────┘
|
|
76
|
+
|
|
77
|
+
[QR CODE HERE]
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
---
|
|
81
|
+
|
|
82
|
+
## Features
|
|
83
|
+
|
|
84
|
+
| Emoji | Feature | Description |
|
|
85
|
+
|-------|---------|-------------|
|
|
86
|
+
| 🔍 | **Smart Detection** | Auto-detects framework, build command, and output directory |
|
|
87
|
+
| ⚡ | **Live Sync** | Watch for file changes and auto-redeploy (Pro) |
|
|
88
|
+
| 🔒 | **Password Protection** | Password or OTP-protect any deployment |
|
|
89
|
+
| 🔗 | **Custom Slugs** | Get `my-demo.nivii.app` instead of random strings (Pro) |
|
|
90
|
+
| 📱 | **QR Codes** | Instant QR code printed in terminal |
|
|
91
|
+
| 📋 | **Clipboard** | URL auto-copied to clipboard |
|
|
92
|
+
| 🌐 | **Auto-open** | Browser opens automatically after deploy |
|
|
93
|
+
| 📊 | **Analytics** | Privacy-first view counts and visitor data (Pro) |
|
|
94
|
+
| 💥 | **Self-Destruct** | Links that expire after N views or a duration |
|
|
95
|
+
| 🤝 | **Collab Previews** | Real-time collaborative previews (Pro) |
|
|
96
|
+
| 🌍 | **Edge CDN** | Deployed on Cloudflare's global network |
|
|
97
|
+
| 🎨 | **Beautiful UI** | Futuristic terminal UI with gradients and spinners |
|
|
98
|
+
|
|
99
|
+
---
|
|
100
|
+
|
|
101
|
+
## All Flags — `nivii share`
|
|
102
|
+
|
|
103
|
+
| Flag | Type | Default | Description |
|
|
104
|
+
|------|------|---------|-------------|
|
|
105
|
+
| `--dir <dir>` | string | cwd | Directory to deploy |
|
|
106
|
+
| `--slug <slug>` | string | random | Custom slug — e.g. `my-demo` → `my-demo.nivii.app` (Pro) |
|
|
107
|
+
| `--pass <password>` | string | — | Password-protect the deployment |
|
|
108
|
+
| `--otp` | boolean | false | Enable one-time password access |
|
|
109
|
+
| `--expires <duration>` | string | 48h | Expiry: `1h` / `24h` / `7d` / `30d` / `never` |
|
|
110
|
+
| `--live` | boolean | false | Enable live sync — watch & auto-redeploy on changes (Pro) |
|
|
111
|
+
| `--collab` | boolean | false | Real-time collaborative preview (Pro) |
|
|
112
|
+
| `--no-build` | boolean | false | Skip build step, use existing output directory |
|
|
113
|
+
| `--cmd <cmd>` | string | auto | Custom build command |
|
|
114
|
+
| `--port <port>` | number | 3000 | Port for server-mode proxy |
|
|
115
|
+
| `--max-views <n>` | number | — | Self-destruct after N views |
|
|
116
|
+
| `--self-destruct` | boolean | false | Destroy after first view |
|
|
117
|
+
| `--no-qr` | boolean | false | Skip QR code display |
|
|
118
|
+
| `--no-open` | boolean | false | Don't auto-open browser |
|
|
119
|
+
|
|
120
|
+
---
|
|
121
|
+
|
|
122
|
+
## All Commands
|
|
123
|
+
|
|
124
|
+
```bash
|
|
125
|
+
nivii share # Deploy current directory
|
|
126
|
+
nivii ls # List recent deployments
|
|
127
|
+
nivii analytics # View analytics for a deployment
|
|
128
|
+
nivii config # View/set config values
|
|
129
|
+
nivii whoami # Show current account info
|
|
130
|
+
nivii --help # Show all commands
|
|
131
|
+
```
|
|
132
|
+
|
|
133
|
+
---
|
|
134
|
+
|
|
135
|
+
## Framework Support
|
|
136
|
+
|
|
137
|
+
| Framework | Detection | Build Command | Output Directory |
|
|
138
|
+
|-----------|-----------|---------------|-----------------|
|
|
139
|
+
| **Next.js** | `package.json` `next` dep | `npm run build` | `out` / `.next` |
|
|
140
|
+
| **Vite** | `package.json` `vite` dep | `npm run build` | `dist` |
|
|
141
|
+
| **React (CRA)** | `vite` + `react` deps | `npm run build` | `dist` |
|
|
142
|
+
| **Vue** | `vite` + `vue` deps | `npm run build` | `dist` |
|
|
143
|
+
| **Svelte** | `vite` + `svelte` deps | `npm run build` | `dist` |
|
|
144
|
+
| **SvelteKit** | `@sveltejs/kit` dep | `npm run build` | `build` |
|
|
145
|
+
| **Astro** | `astro` dep | `npm run build` | `dist` |
|
|
146
|
+
| **Remix** | `@remix-run/*` deps | `npm run build` | `public` |
|
|
147
|
+
| **Nuxt** | `nuxt` dep | `npm run generate` | `.output/public` |
|
|
148
|
+
| **Solid.js** | `vite` + `solid-js` deps | `npm run build` | `dist` |
|
|
149
|
+
| **Express** | `express` dep | — (server mode) | `.` |
|
|
150
|
+
| **Fastify** | `fastify` dep | — (server mode) | `.` |
|
|
151
|
+
| **Hono** | `hono` dep | — (server mode) | `.` |
|
|
152
|
+
| **Static HTML** | `index.html` exists | — | `.` / `dist` / `build` |
|
|
153
|
+
|
|
154
|
+
---
|
|
155
|
+
|
|
156
|
+
## Architecture
|
|
157
|
+
|
|
158
|
+
```
|
|
159
|
+
User runs: nivii share
|
|
160
|
+
│
|
|
161
|
+
▼
|
|
162
|
+
┌─────────────────────────────────────────────────────────┐
|
|
163
|
+
│ Nivii CLI (Node.js) │
|
|
164
|
+
│ │
|
|
165
|
+
│ 1. detectFramework() → identifies build system │
|
|
166
|
+
│ 2. runBuild() → executes build command │
|
|
167
|
+
│ 3. zipDirectory() → zips output dir │
|
|
168
|
+
│ 4. uploadDeploy() → POST /deploy to API │
|
|
169
|
+
│ 5. showQR() → renders QR in terminal │
|
|
170
|
+
│ 6. startLiveSync() → WebSocket watcher (--live) │
|
|
171
|
+
└──────────────────────────────┬──────────────────────────┘
|
|
172
|
+
│ HTTPS multipart/form-data
|
|
173
|
+
▼
|
|
174
|
+
┌─────────────────────────────────────────────────────────┐
|
|
175
|
+
│ api.nivii.app (Cloudflare Worker) │
|
|
176
|
+
│ │
|
|
177
|
+
│ POST /deploy │
|
|
178
|
+
│ ├─ Stores metadata in KV (slug, password, expiry…) │
|
|
179
|
+
│ └─ Uploads deploy.zip to R2 bucket │
|
|
180
|
+
└──────────────┬────────────────────────────────┬─────────┘
|
|
181
|
+
│ │
|
|
182
|
+
▼ ▼
|
|
183
|
+
┌──────────────────────┐ ┌─────────────────────────────┐
|
|
184
|
+
│ Cloudflare R2 │ │ Cloudflare KV │
|
|
185
|
+
│ (Object Storage) │ │ (Metadata + Analytics) │
|
|
186
|
+
│ │ │ │
|
|
187
|
+
│ deploys/{slug}/ │ │ deploy:{slug} → JSON meta │
|
|
188
|
+
│ └─ deploy.zip │ │ analytics:{slug} → stats │
|
|
189
|
+
└──────────────────────┘ └─────────────────────────────┘
|
|
190
|
+
│
|
|
191
|
+
▼
|
|
192
|
+
┌─────────────────────────────────────────────────────────┐
|
|
193
|
+
│ *.nivii.app (Cloudflare Worker wildcard routing) │
|
|
194
|
+
│ │
|
|
195
|
+
│ GET xyz.nivii.app/ │
|
|
196
|
+
│ ├─ Checks KV for metadata (expiry, password, OTP) │
|
|
197
|
+
│ ├─ Serves files from R2 │
|
|
198
|
+
│ └─ SPA fallback to index.html │
|
|
199
|
+
│ │
|
|
200
|
+
│ live.nivii.app/live/{slug} (WebSocket) │
|
|
201
|
+
│ └─ LiveSyncDO (Durable Object) │
|
|
202
|
+
│ └─ Broadcasts reload events to connected viewers │
|
|
203
|
+
└─────────────────────────────────────────────────────────┘
|
|
204
|
+
```
|
|
205
|
+
|
|
206
|
+
---
|
|
207
|
+
|
|
208
|
+
## Self-Hosting on Cloudflare
|
|
209
|
+
|
|
210
|
+
Deploy your own Nivii instance in ~10 minutes:
|
|
211
|
+
|
|
212
|
+
### Prerequisites
|
|
213
|
+
|
|
214
|
+
- [Cloudflare account](https://cloudflare.com) (free tier works)
|
|
215
|
+
- [Wrangler CLI](https://developers.cloudflare.com/workers/wrangler/): `npm i -g wrangler`
|
|
216
|
+
- Node.js 18+
|
|
217
|
+
|
|
218
|
+
### Steps
|
|
219
|
+
|
|
220
|
+
**1. Clone and install**
|
|
221
|
+
|
|
222
|
+
```bash
|
|
223
|
+
git clone https://github.com/Aadigarg111/Nivi-sh.git
|
|
224
|
+
cd Nivi-sh
|
|
225
|
+
npm install
|
|
226
|
+
```
|
|
16
227
|
|
|
17
|
-
|
|
18
|
-
nivii share --slug my-demo
|
|
228
|
+
**2. Create Cloudflare resources**
|
|
19
229
|
|
|
20
|
-
|
|
21
|
-
|
|
230
|
+
```bash
|
|
231
|
+
# Login to Cloudflare
|
|
232
|
+
wrangler login
|
|
233
|
+
|
|
234
|
+
# Create KV namespace
|
|
235
|
+
wrangler kv:namespace create "DB"
|
|
236
|
+
wrangler kv:namespace create "DB" --preview
|
|
237
|
+
|
|
238
|
+
# Create R2 bucket
|
|
239
|
+
wrangler r2 bucket create nivii-deployments
|
|
240
|
+
```
|
|
241
|
+
|
|
242
|
+
**3. Update wrangler.toml**
|
|
243
|
+
|
|
244
|
+
```toml
|
|
245
|
+
# packages/worker/wrangler.toml
|
|
246
|
+
[[kv_namespaces]]
|
|
247
|
+
binding = "DB"
|
|
248
|
+
id = "YOUR_ACTUAL_KV_ID" # from step 2
|
|
249
|
+
preview_id = "YOUR_PREVIEW_KV_ID"
|
|
250
|
+
|
|
251
|
+
[[r2_buckets]]
|
|
252
|
+
binding = "BUCKET"
|
|
253
|
+
bucket_name = "nivii-deployments"
|
|
254
|
+
```
|
|
255
|
+
|
|
256
|
+
**4. Deploy the worker**
|
|
257
|
+
|
|
258
|
+
```bash
|
|
259
|
+
cd packages/worker
|
|
260
|
+
wrangler deploy
|
|
261
|
+
```
|
|
262
|
+
|
|
263
|
+
**5. Configure DNS**
|
|
264
|
+
|
|
265
|
+
Add a wildcard DNS record:
|
|
266
|
+
```
|
|
267
|
+
Type: CNAME
|
|
268
|
+
Name: *
|
|
269
|
+
Target: your-worker.workers.dev
|
|
270
|
+
Proxy: Enabled (orange cloud)
|
|
271
|
+
```
|
|
272
|
+
|
|
273
|
+
**6. Point the CLI at your instance**
|
|
274
|
+
|
|
275
|
+
```bash
|
|
276
|
+
export NIVII_API=https://api.your-domain.com
|
|
277
|
+
|
|
278
|
+
# Or in config
|
|
279
|
+
nivii config apiBase https://api.your-domain.com
|
|
280
|
+
```
|
|
281
|
+
|
|
282
|
+
---
|
|
283
|
+
|
|
284
|
+
## Configuration
|
|
285
|
+
|
|
286
|
+
Config is stored at `~/.nivii/config.json`:
|
|
287
|
+
|
|
288
|
+
```json
|
|
289
|
+
{
|
|
290
|
+
"token": "your-pro-token",
|
|
291
|
+
"plan": "free",
|
|
292
|
+
"apiBase": "https://api.nivii.app",
|
|
293
|
+
"deployments": [...]
|
|
294
|
+
}
|
|
295
|
+
```
|
|
22
296
|
|
|
23
|
-
|
|
24
|
-
nivii share --live
|
|
297
|
+
Manage it:
|
|
25
298
|
|
|
26
|
-
|
|
27
|
-
nivii
|
|
299
|
+
```bash
|
|
300
|
+
nivii config # show all
|
|
301
|
+
nivii config token <tok> # set token
|
|
302
|
+
nivii config apiBase <url> # point to self-hosted instance
|
|
303
|
+
```
|
|
304
|
+
|
|
305
|
+
---
|
|
306
|
+
|
|
307
|
+
## Roadmap v2
|
|
308
|
+
|
|
309
|
+
- [ ] **Team workspaces** — share deployments with your team
|
|
310
|
+
- [ ] **Custom domains** — deploy to `preview.your-company.com`
|
|
311
|
+
- [ ] **GitHub Actions integration** — auto-share on every PR
|
|
312
|
+
- [ ] **VS Code extension** — deploy with a keyboard shortcut
|
|
313
|
+
- [ ] **Mobile app** — scan QR codes from Nivii deployments
|
|
314
|
+
- [ ] **Zip-streaming upload** — faster uploads for large projects
|
|
315
|
+
- [ ] **Screenshot previews** — auto-thumbnail for each deployment
|
|
316
|
+
- [ ] **API keys + webhooks** — programmatic deployments
|
|
317
|
+
- [ ] **Deployment history UI** — web dashboard at `app.nivii.app`
|
|
318
|
+
- [ ] **SSR support** — run Express/Fastify apps in serverless mode
|
|
319
|
+
- [ ] **Monorepo support** — deploy multiple packages at once
|
|
320
|
+
|
|
321
|
+
---
|
|
322
|
+
|
|
323
|
+
## Contributing
|
|
324
|
+
|
|
325
|
+
Contributions are welcome! This is an AGPL-3.0 open-source project.
|
|
326
|
+
|
|
327
|
+
```bash
|
|
328
|
+
# Fork and clone
|
|
329
|
+
git clone https://github.com/YOUR_USERNAME/Nivi-sh.git
|
|
330
|
+
cd Nivi-sh
|
|
331
|
+
|
|
332
|
+
# Install dependencies
|
|
333
|
+
npm install
|
|
334
|
+
|
|
335
|
+
# Build CLI
|
|
336
|
+
cd packages/cli && npm run build
|
|
337
|
+
|
|
338
|
+
# Run locally
|
|
339
|
+
node dist/cli.js share --help
|
|
340
|
+
```
|
|
28
341
|
|
|
29
|
-
|
|
30
|
-
nivii analytics
|
|
342
|
+
### Project structure
|
|
31
343
|
|
|
32
|
-
# Config
|
|
33
|
-
nivii config
|
|
34
344
|
```
|
|
345
|
+
packages/cli/ - The NPM CLI tool (published as `nivii`)
|
|
346
|
+
packages/worker/ - Cloudflare Worker backend
|
|
347
|
+
landing/ - Landing page HTML
|
|
348
|
+
.github/ - GitHub Actions workflows
|
|
349
|
+
```
|
|
350
|
+
|
|
351
|
+
### Submitting PRs
|
|
352
|
+
|
|
353
|
+
1. Fork the repository
|
|
354
|
+
2. Create a feature branch: `git checkout -b feat/my-feature`
|
|
355
|
+
3. Commit your changes: `git commit -m 'feat: add something cool'`
|
|
356
|
+
4. Push to your fork: `git push origin feat/my-feature`
|
|
357
|
+
5. Open a Pull Request
|
|
35
358
|
|
|
36
|
-
|
|
359
|
+
Please follow conventional commits and keep PRs focused.
|
|
37
360
|
|
|
38
|
-
|
|
39
|
-
|------|-------------|
|
|
40
|
-
| `--dir <dir>` | Directory to deploy |
|
|
41
|
-
| `--slug <slug>` | Custom slug (Pro) |
|
|
42
|
-
| `--pass <password>` | Password protection |
|
|
43
|
-
| `--otp` | One-time password |
|
|
44
|
-
| `--expires <duration>` | 1h / 24h / 7d / 30d / never |
|
|
45
|
-
| `--live` | Live sync mode |
|
|
46
|
-
| `--collab` | Collaborative preview (Pro) |
|
|
47
|
-
| `--no-build` | Skip build step |
|
|
48
|
-
| `--cmd <cmd>` | Custom build command |
|
|
49
|
-
| `--max-views <n>` | Self-destruct after N views |
|
|
50
|
-
| `--self-destruct` | Destroy after first view |
|
|
51
|
-
| `--no-qr` | Skip QR code |
|
|
52
|
-
| `--no-open` | Don't auto-open browser |
|
|
361
|
+
---
|
|
53
362
|
|
|
54
363
|
## License
|
|
55
364
|
|
|
56
|
-
|
|
365
|
+
```
|
|
366
|
+
Nivii — Futuristic Project Sharing CLI
|
|
367
|
+
Copyright (C) 2025 Aadigarg111
|
|
368
|
+
|
|
369
|
+
This program is free software: you can redistribute it and/or modify
|
|
370
|
+
it under the terms of the GNU Affero General Public License as published by
|
|
371
|
+
the Free Software Foundation, either version 3 of the License, or
|
|
372
|
+
(at your option) any later version.
|
|
373
|
+
```
|
|
374
|
+
|
|
375
|
+
**[AGPL-3.0](./LICENSE)** — See the LICENSE file for full terms.
|
|
376
|
+
|
|
377
|
+
---
|
|
378
|
+
|
|
379
|
+
<div align="center">
|
|
380
|
+
|
|
381
|
+
Made with ❤️ by [Aadigarg111](https://github.com/Aadigarg111)
|
|
382
|
+
|
|
383
|
+
⚡ [nivii.app](https://nivii.app) · [npm](https://www.npmjs.com/package/nivii) · [GitHub](https://github.com/Aadigarg111/Nivi-sh)
|
|
384
|
+
|
|
385
|
+
</div>
|
package/dist/cli.js
CHANGED
|
@@ -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"}
|
package/dist/commands/share.js
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';
|
|
@@ -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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"}
|
package/dist/core/upload.d.ts
CHANGED
|
@@ -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/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: {
|
package/dist/core/upload.js.map
CHANGED
|
@@ -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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"}
|
package/dist/ui/welcome.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"welcome.d.ts","sourceRoot":"","sources":["../../src/ui/welcome.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"welcome.d.ts","sourceRoot":"","sources":["../../src/ui/welcome.ts"],"names":[],"mappings":"AA4BA,wBAAgB,WAAW,IAAI,IAAI,CAqBlC;AAED,wBAAgB,UAAU,IAAI,IAAI,CAQjC"}
|