@somewhere-tech/cli 0.7.0 → 0.9.0
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 +66 -5
- package/dist/commands/db.js +63 -0
- package/dist/commands/db.js.map +1 -1
- package/dist/commands/deploy.js +139 -78
- package/dist/commands/deploy.js.map +1 -1
- package/dist/commands/dev.js +240 -52
- package/dist/commands/dev.js.map +1 -1
- package/dist/lib/files.js +98 -0
- package/dist/lib/files.js.map +1 -0
- package/package.json +6 -2
package/README.md
CHANGED
|
@@ -40,7 +40,9 @@ After `somewhere init`, Claude Code and Codex auto-connect via the `.mcp.json` i
|
|
|
40
40
|
| `somewhere project view [name]` | Show project details |
|
|
41
41
|
| `somewhere project delete <name>` | Delete with email confirmation |
|
|
42
42
|
| `somewhere deploy` | Deploy current directory to linked project |
|
|
43
|
-
| `somewhere deploy
|
|
43
|
+
| `somewhere deploy --dry-run` | Preview the deploy diff without shipping |
|
|
44
|
+
| `somewhere deploy --scope functions` | Deploy backend only (leave the site untouched) |
|
|
45
|
+
| `somewhere pull` | Download a project's deployed source to the current directory |
|
|
44
46
|
| `somewhere logs` | Show recent logs |
|
|
45
47
|
| `somewhere logs --follow` | Stream logs in real-time |
|
|
46
48
|
| `somewhere logs --level error` | Filter by level |
|
|
@@ -50,7 +52,7 @@ After `somewhere init`, Claude Code and Codex auto-connect via the `.mcp.json` i
|
|
|
50
52
|
| `somewhere status` | Show project + workspace status |
|
|
51
53
|
| `somewhere open` | Open project URL in browser |
|
|
52
54
|
| `somewhere open --dashboard` | Open the dashboard |
|
|
53
|
-
| `somewhere dev` |
|
|
55
|
+
| `somewhere dev` | Hot-deploy watcher — save a file, it goes live in seconds (no local server) |
|
|
54
56
|
| `somewhere api GET /v1/projects` | Raw API call with auto-auth |
|
|
55
57
|
| `somewhere mcp` | Run MCP server over stdio (proxies to mcp.somewhere.tech) |
|
|
56
58
|
|
|
@@ -71,14 +73,73 @@ After init, `claude "build me a booking app"` works immediately.
|
|
|
71
73
|
|
|
72
74
|
## Deploy
|
|
73
75
|
|
|
74
|
-
`somewhere deploy` reads all files in the current directory (skipping `node_modules`, `.git`, `.env`, etc.), sends them to the platform, and they're live at `{subdomain}.somewhere.tech`.
|
|
76
|
+
`somewhere deploy` reads all files in the current directory (skipping `node_modules`, `.git`, `.env`, etc.), sends them to the platform, and they're live at `{subdomain}.somewhere.tech`. Deploy **raw source** — the platform compiles JSX/TSX, resolves npm imports, and bundles for you. Don't run a build step first.
|
|
75
77
|
|
|
76
|
-
Files under `functions/` are deployed as server-side functions
|
|
78
|
+
Files under `functions/` (and root-level `api/` and `_lib/`) are deployed as server-side functions.
|
|
79
|
+
|
|
80
|
+
### Deploy options
|
|
81
|
+
|
|
82
|
+
| Flag | What it does |
|
|
83
|
+
|---|---|
|
|
84
|
+
| `--scope functions` | Deploy only the backend functions; leave the site untouched |
|
|
85
|
+
| `--scope static` | Deploy only the site; leave functions untouched |
|
|
86
|
+
| `--dry-run` | Show what would change (added / modified / removed) without deploying |
|
|
87
|
+
| `--replace-functions` | Drop deployed functions not present locally (repo-as-truth; default keeps them) |
|
|
88
|
+
| `--project <id>` | Deploy to a specific project instead of the linked one |
|
|
89
|
+
|
|
90
|
+
After a successful deploy the CLI prints a **build log** — the entry chunk, each compiled chunk with its size, each function with its size, and any compiler warnings.
|
|
91
|
+
|
|
92
|
+
```bash
|
|
93
|
+
somewhere deploy --dry-run # preview the diff first
|
|
94
|
+
somewhere deploy --scope functions # ship a backend fix without touching the site
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
## Hot reload: `somewhere dev`
|
|
98
|
+
|
|
99
|
+
```sh
|
|
100
|
+
somewhere dev
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
Starts a file watcher that hot-deploys on every save — no local server, no
|
|
104
|
+
emulator. Edit a file, save, and it's live on the real platform in a couple of
|
|
105
|
+
seconds with full `sw.*` context. Single-file saves ship as incremental patches;
|
|
106
|
+
compile errors show up in the terminal immediately (with the file + line) and the
|
|
107
|
+
previous working version keeps serving until you fix it.
|
|
108
|
+
|
|
109
|
+
```
|
|
110
|
+
$ somewhere dev
|
|
111
|
+
✓ Synced 3 files
|
|
112
|
+
👀 Watching /my-app for changes
|
|
113
|
+
🌐 https://my-app.somewhere.tech
|
|
114
|
+
|
|
115
|
+
[13:41:01] src/main.tsx → ✓ live (1.2s, v2)
|
|
116
|
+
[13:41:18] api/users.ts → ✗ compile failed (1.4s) ← previous version still live
|
|
117
|
+
[13:41:24] api/users.ts → ✓ live (0.9s, v3)
|
|
118
|
+
```
|
|
119
|
+
|
|
120
|
+
Passing a command (`somewhere dev npm run dev`) keeps the legacy behavior — run
|
|
121
|
+
your own process locally with `SOMEWHERE_PROJECT_ID` / `SOMEWHERE_URL` injected.
|
|
122
|
+
|
|
123
|
+
## Client-side code: use the SDK
|
|
124
|
+
|
|
125
|
+
The CLI deploys and manages projects. For **client-side code** (browser / Node app talking to your backend), install the SDK — a Supabase-shaped client so existing code ports with one import swap:
|
|
126
|
+
|
|
127
|
+
```bash
|
|
128
|
+
npm i @somewhere-tech/sdk
|
|
129
|
+
```
|
|
130
|
+
|
|
131
|
+
```js
|
|
132
|
+
import { createClient } from '@somewhere-tech/sdk';
|
|
133
|
+
const db = createClient(URL, KEY);
|
|
134
|
+
const { data, error } = await db.from('todos').select('*');
|
|
135
|
+
```
|
|
136
|
+
|
|
137
|
+
Inside deployed functions you use the `sw` runtime directly (`sw.db.query(...)`, `sw.auth`, `sw.email`, …) — no SDK needed there.
|
|
77
138
|
|
|
78
139
|
## What the CLI does NOT do
|
|
79
140
|
|
|
80
141
|
- No hosting or running code (the platform does that)
|
|
81
|
-
- No building or compiling
|
|
142
|
+
- No building or compiling — **deploy raw source; the platform compiles it**
|
|
82
143
|
- No AI calls (Claude Code / Codex do that via MCP)
|
|
83
144
|
- No workspace management (dashboard)
|
|
84
145
|
- No billing (dashboard)
|
package/dist/commands/db.js
CHANGED
|
@@ -1,7 +1,9 @@
|
|
|
1
|
+
import { writeFileSync } from 'node:fs';
|
|
1
2
|
import ora from 'ora';
|
|
2
3
|
import { ApiClient } from '../lib/client.js';
|
|
3
4
|
import { getToken, loadProjectConfig } from '../lib/config.js';
|
|
4
5
|
import { dim, error, info, success, table, teal, warn } from '../lib/output.js';
|
|
6
|
+
const API_BASE = 'https://api.somewhere.tech/v1';
|
|
5
7
|
export function registerDb(program) {
|
|
6
8
|
const db = program.command('db').description('Run SQL against your project\'s database');
|
|
7
9
|
db
|
|
@@ -59,6 +61,67 @@ export function registerDb(program) {
|
|
|
59
61
|
process.exit(1);
|
|
60
62
|
}
|
|
61
63
|
});
|
|
64
|
+
db
|
|
65
|
+
.command('dump')
|
|
66
|
+
.description('Export the full database as SQL (schema + every row). Pipe to a file: somewhere db dump > backup.sql')
|
|
67
|
+
.option('--project <id>', 'Project ID (defaults to .somewhere.json)')
|
|
68
|
+
.option('-o, --output <file>', 'Write to file instead of stdout')
|
|
69
|
+
.action(async (opts) => {
|
|
70
|
+
let projectId = opts.project;
|
|
71
|
+
if (!projectId) {
|
|
72
|
+
const config = loadProjectConfig();
|
|
73
|
+
if (!config) {
|
|
74
|
+
error('No project specified and no .somewhere.json found. Pass --project <id>.');
|
|
75
|
+
process.exit(1);
|
|
76
|
+
}
|
|
77
|
+
projectId = config.project_id;
|
|
78
|
+
}
|
|
79
|
+
// Bypass ApiClient — the response is application/sql, not JSON.
|
|
80
|
+
const spinner = ora('Dumping database…').start();
|
|
81
|
+
try {
|
|
82
|
+
const res = await fetch(`${API_BASE}/db/dump`, {
|
|
83
|
+
method: 'POST',
|
|
84
|
+
headers: {
|
|
85
|
+
Authorization: `Bearer ${getToken()}`,
|
|
86
|
+
'Content-Type': 'application/json',
|
|
87
|
+
},
|
|
88
|
+
body: JSON.stringify({ project_id: projectId }),
|
|
89
|
+
});
|
|
90
|
+
if (!res.ok) {
|
|
91
|
+
spinner.fail('Dump failed');
|
|
92
|
+
const body = await res.text();
|
|
93
|
+
try {
|
|
94
|
+
const json = JSON.parse(body);
|
|
95
|
+
error(`${json.error ?? 'ERROR'}: ${json.message ?? body.slice(0, 200)}`);
|
|
96
|
+
}
|
|
97
|
+
catch {
|
|
98
|
+
error(`HTTP ${res.status}: ${body.slice(0, 200)}`);
|
|
99
|
+
}
|
|
100
|
+
process.exit(1);
|
|
101
|
+
}
|
|
102
|
+
const sql = await res.text();
|
|
103
|
+
const tables = res.headers.get('X-Tables') ?? '?';
|
|
104
|
+
const rows = res.headers.get('X-Rows') ?? '?';
|
|
105
|
+
const truncated = res.headers.get('X-Truncated-Tables');
|
|
106
|
+
if (opts.output) {
|
|
107
|
+
writeFileSync(opts.output, sql);
|
|
108
|
+
spinner.succeed(`Wrote ${opts.output} (${tables} tables, ${rows} rows)`);
|
|
109
|
+
}
|
|
110
|
+
else {
|
|
111
|
+
spinner.stop();
|
|
112
|
+
process.stdout.write(sql);
|
|
113
|
+
info(dim(`${tables} tables, ${rows} rows`));
|
|
114
|
+
}
|
|
115
|
+
if (truncated) {
|
|
116
|
+
warn(`Per-table row cap hit on: ${truncated} — contact support for a streaming dump if needed.`);
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
catch (err) {
|
|
120
|
+
spinner.fail('Dump failed');
|
|
121
|
+
error(err instanceof Error ? err.message : String(err));
|
|
122
|
+
process.exit(1);
|
|
123
|
+
}
|
|
124
|
+
});
|
|
62
125
|
db
|
|
63
126
|
.command('tables')
|
|
64
127
|
.description('List tables in the project database')
|
package/dist/commands/db.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"db.js","sourceRoot":"","sources":["../../src/commands/db.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"db.js","sourceRoot":"","sources":["../../src/commands/db.ts"],"names":[],"mappings":"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"}
|
package/dist/commands/deploy.js
CHANGED
|
@@ -1,51 +1,32 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { extname, join, relative } from 'node:path';
|
|
1
|
+
import { join } from 'node:path';
|
|
3
2
|
import ora from 'ora';
|
|
4
3
|
import { ApiClient } from '../lib/client.js';
|
|
5
4
|
import { getToken, loadProjectConfig } from '../lib/config.js';
|
|
6
|
-
import {
|
|
7
|
-
|
|
8
|
-
'node_modules',
|
|
9
|
-
'.git',
|
|
10
|
-
'.somewhere.json',
|
|
11
|
-
'.mcp.json',
|
|
12
|
-
'.env',
|
|
13
|
-
'.DS_Store',
|
|
14
|
-
'dist',
|
|
15
|
-
'.next',
|
|
16
|
-
'.vercel',
|
|
17
|
-
]);
|
|
18
|
-
const MAX_FILE_SIZE = 5 * 1024 * 1024; // 5MB per file
|
|
19
|
-
// Mirror of worker/src/routes/deploy.ts:isFunctionPath. Files matching
|
|
20
|
-
// these patterns must ship in body.functions, not body.files — otherwise
|
|
21
|
-
// the worker writes them to static R2 and never invokes the bundler, so
|
|
22
|
-
// the routes never register. (Bug found 2026-05-09: api/* at project
|
|
23
|
-
// root silently shipped as static.)
|
|
24
|
-
function isFunctionPath(p) {
|
|
25
|
-
if (!/\.(ts|js|mjs)$/i.test(p))
|
|
26
|
-
return false;
|
|
27
|
-
if (p.startsWith('api/') || p.startsWith('_lib/'))
|
|
28
|
-
return true;
|
|
29
|
-
if (/^\[[^/]+\]\.(ts|js|mjs)$/.test(p))
|
|
30
|
-
return true;
|
|
31
|
-
return false;
|
|
32
|
-
}
|
|
33
|
-
const BINARY_EXTS = new Set([
|
|
34
|
-
'.png', '.jpg', '.jpeg', '.gif', '.webp', '.ico', '.bmp', '.avif',
|
|
35
|
-
'.woff', '.woff2', '.ttf', '.otf', '.eot',
|
|
36
|
-
'.pdf', '.zip', '.gz', '.tar', '.br',
|
|
37
|
-
'.mp3', '.mp4', '.wav', '.ogg', '.webm', '.mov', '.m4a',
|
|
38
|
-
'.wasm',
|
|
39
|
-
]);
|
|
5
|
+
import { collectFiles, formatBytes } from '../lib/files.js';
|
|
6
|
+
import { dim, error, green, info, red, success, teal, warn, yellow } from '../lib/output.js';
|
|
40
7
|
export function registerDeploy(program) {
|
|
41
8
|
program
|
|
42
9
|
.command('deploy [dir]')
|
|
43
10
|
.description('Deploy the current directory to the linked project')
|
|
44
11
|
.option('--project <id>', 'Override project ID')
|
|
12
|
+
.option('--scope <scope>', "Partial deploy: 'functions' (backend only, leaves the site untouched) or 'static' (site only, leaves functions untouched). Default deploys both.")
|
|
13
|
+
.option('--dry-run', 'Show what would change (added / modified / removed files) without deploying')
|
|
14
|
+
.option('--replace-functions', 'Delete deployed functions that are not in this directory (repo-as-truth). Default keeps them.')
|
|
45
15
|
.action(async (dir, opts) => {
|
|
46
16
|
const token = getToken();
|
|
47
17
|
const client = new ApiClient(token);
|
|
48
18
|
const targetDir = dir ? join(process.cwd(), dir) : process.cwd();
|
|
19
|
+
// --scope maps to the worker's partial-deploy guard. Reject unknown
|
|
20
|
+
// values up front so a typo can't silently fall back to a full deploy
|
|
21
|
+
// (e.g. `--scope function` wiping the frontend the user meant to keep).
|
|
22
|
+
let scope;
|
|
23
|
+
if (opts.scope !== undefined) {
|
|
24
|
+
if (opts.scope !== 'functions' && opts.scope !== 'static') {
|
|
25
|
+
error(`--scope must be "functions" or "static" (got "${opts.scope}")`);
|
|
26
|
+
process.exit(1);
|
|
27
|
+
}
|
|
28
|
+
scope = opts.scope;
|
|
29
|
+
}
|
|
49
30
|
let projectId = opts.project;
|
|
50
31
|
if (!projectId) {
|
|
51
32
|
const config = loadProjectConfig(targetDir) ?? loadProjectConfig();
|
|
@@ -56,10 +37,7 @@ export function registerDeploy(program) {
|
|
|
56
37
|
projectId = config.project_id;
|
|
57
38
|
}
|
|
58
39
|
const spinner = ora('Collecting files...').start();
|
|
59
|
-
const files =
|
|
60
|
-
const binaryFiles = {};
|
|
61
|
-
const functions = {};
|
|
62
|
-
collectFiles(targetDir, targetDir, files, binaryFiles, functions);
|
|
40
|
+
const { files, binaryFiles, functions } = collectFiles(targetDir);
|
|
63
41
|
const totalFiles = Object.keys(files).length +
|
|
64
42
|
Object.keys(binaryFiles).length +
|
|
65
43
|
Object.keys(functions).length;
|
|
@@ -69,7 +47,9 @@ export function registerDeploy(program) {
|
|
|
69
47
|
const binaryBytes = Object.values(binaryFiles)
|
|
70
48
|
.reduce((sum, b64) => sum + Math.floor((b64.length * 3) / 4), 0);
|
|
71
49
|
const totalBytes = textBytes + binaryBytes;
|
|
72
|
-
spinner.text =
|
|
50
|
+
spinner.text = opts.dryRun
|
|
51
|
+
? `Checking ${totalFiles} files (${formatBytes(totalBytes)})...`
|
|
52
|
+
: `Deploying ${totalFiles} files (${formatBytes(totalBytes)})...`;
|
|
73
53
|
try {
|
|
74
54
|
const body = {
|
|
75
55
|
project_id: projectId,
|
|
@@ -81,6 +61,18 @@ export function registerDeploy(program) {
|
|
|
81
61
|
if (Object.keys(functions).length > 0) {
|
|
82
62
|
body.functions = functions;
|
|
83
63
|
}
|
|
64
|
+
if (scope)
|
|
65
|
+
body.scope = scope;
|
|
66
|
+
if (opts.replaceFunctions)
|
|
67
|
+
body.replace_functions = true;
|
|
68
|
+
if (opts.dryRun)
|
|
69
|
+
body.dry_run = true;
|
|
70
|
+
if (opts.dryRun) {
|
|
71
|
+
const plan = await client.call('POST', '/deploy', body);
|
|
72
|
+
spinner.stop();
|
|
73
|
+
printDryRun(plan, scope);
|
|
74
|
+
return;
|
|
75
|
+
}
|
|
84
76
|
const result = await client.call('POST', '/deploy', body);
|
|
85
77
|
spinner.stop();
|
|
86
78
|
const fileCount = typeof result.files === 'number'
|
|
@@ -90,51 +82,120 @@ export function registerDeploy(program) {
|
|
|
90
82
|
if (result.has_functions) {
|
|
91
83
|
success('Functions deployed');
|
|
92
84
|
}
|
|
93
|
-
|
|
85
|
+
// Build log: entry chunk, chunks + sizes, functions + sizes (returned
|
|
86
|
+
// by the worker since tsk_8af76ef9). Surface it instead of a bare
|
|
87
|
+
// "deployed." so the dev can see what the compiler actually produced.
|
|
88
|
+
if (Array.isArray(result.build_log) && result.build_log.length > 0) {
|
|
89
|
+
console.log(`\n${dim('Build')}`);
|
|
90
|
+
for (const line of result.build_log)
|
|
91
|
+
info(dim(line));
|
|
92
|
+
console.log('');
|
|
93
|
+
}
|
|
94
|
+
// Functions that were preserved because this payload omitted them.
|
|
95
|
+
// Loud, not buried — the dev should know files weren't dropped.
|
|
96
|
+
if (result.preserved_functions && result.preserved_functions.length > 0) {
|
|
97
|
+
warn(`Kept ${result.preserved_functions.length} function(s) not in this directory: ${result.preserved_functions.slice(0, 5).join(', ')}${result.preserved_functions.length > 5 ? ', …' : ''} (pass --replace-functions to drop them).`);
|
|
98
|
+
}
|
|
99
|
+
// Warnings + function errors must be loud — never let a "success"
|
|
100
|
+
// line hide a partial failure (fail-loudly principle).
|
|
101
|
+
if (result.function_errors && result.function_errors.length > 0) {
|
|
102
|
+
for (const fe of result.function_errors) {
|
|
103
|
+
const label = typeof fe === 'string' ? fe : (fe.route ?? JSON.stringify(fe));
|
|
104
|
+
const detail = typeof fe === 'string' ? '' : fe.error ? ` — ${fe.error}` : '';
|
|
105
|
+
error(`Function failed: ${label}${detail}`);
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
if (result.warnings && result.warnings.length > 0) {
|
|
109
|
+
for (const w of result.warnings)
|
|
110
|
+
warn(w);
|
|
111
|
+
}
|
|
112
|
+
if (scope === 'functions') {
|
|
113
|
+
success(`Functions live at ${teal(result.url)} (site left untouched)`);
|
|
114
|
+
}
|
|
115
|
+
else if (scope === 'static') {
|
|
116
|
+
success(`Site live at ${teal(result.url)} (functions left untouched)`);
|
|
117
|
+
}
|
|
118
|
+
else {
|
|
119
|
+
success(`Live at ${teal(result.url)}`);
|
|
120
|
+
}
|
|
121
|
+
// Exit non-zero if any function failed to deploy — a CI step that
|
|
122
|
+
// shells out to `somewhere deploy` should fail, not pass green.
|
|
123
|
+
if (result.function_errors && result.function_errors.length > 0) {
|
|
124
|
+
process.exit(1);
|
|
125
|
+
}
|
|
94
126
|
}
|
|
95
127
|
catch (err) {
|
|
96
|
-
spinner.fail('Deploy failed');
|
|
128
|
+
spinner.fail(opts.dryRun ? 'Dry run failed' : 'Deploy failed');
|
|
97
129
|
error(err instanceof Error ? err.message : String(err));
|
|
98
130
|
process.exit(1);
|
|
99
131
|
}
|
|
100
132
|
});
|
|
101
133
|
}
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
}
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
134
|
+
// Platform-generated slot artifacts. They live in the deployed slot but are
|
|
135
|
+
// never part of a user's source dir (the CLI collector never emits them and
|
|
136
|
+
// `somewhere pull` returns clean source), so the server's raw-vs-slot diff
|
|
137
|
+
// always reports them as "removed". Filtering them keeps the dry-run signal
|
|
138
|
+
// about the user's actual files — not platform internals it regenerates.
|
|
139
|
+
const INTERNAL_PREFIXES = ['_compiled/', '_internal/', '_source/'];
|
|
140
|
+
const isInternalPath = (p) => INTERNAL_PREFIXES.some((prefix) => p.startsWith(prefix));
|
|
141
|
+
function printDryRun(plan, scope) {
|
|
142
|
+
const scopeNote = scope === 'functions'
|
|
143
|
+
? ' (scope: functions — static unchanged)'
|
|
144
|
+
: scope === 'static'
|
|
145
|
+
? ' (scope: static — functions unchanged)'
|
|
146
|
+
: '';
|
|
147
|
+
console.log(`\n${teal('Dry run')}${dim(scopeNote)} — nothing was deployed.\n`);
|
|
148
|
+
const sf = {
|
|
149
|
+
added: plan.static_files.added.filter((p) => !isInternalPath(p)),
|
|
150
|
+
modified: plan.static_files.modified.filter((p) => !isInternalPath(p)),
|
|
151
|
+
removed: plan.static_files.removed.filter((p) => !isInternalPath(p)),
|
|
152
|
+
};
|
|
153
|
+
const section = (label, items, mark) => {
|
|
154
|
+
if (items.length === 0)
|
|
155
|
+
return;
|
|
156
|
+
console.log(` ${label} (${items.length})`);
|
|
157
|
+
for (const p of items.slice(0, 50))
|
|
158
|
+
info(`${mark} ${p}`);
|
|
159
|
+
if (items.length > 50)
|
|
160
|
+
info(dim(` …and ${items.length - 50} more`));
|
|
161
|
+
};
|
|
162
|
+
section(green('Added'), sf.added, green('+'));
|
|
163
|
+
section(yellow('Modified'), sf.modified, yellow('~'));
|
|
164
|
+
section(red('Removed'), sf.removed, red('-'));
|
|
165
|
+
if (plan.functions) {
|
|
166
|
+
const fn = plan.functions;
|
|
167
|
+
section(green('Functions added'), fn.added, green('+'));
|
|
168
|
+
section(yellow('Functions modified'), fn.modified, yellow('~'));
|
|
169
|
+
section(red('Functions removed'), fn.removed, red('-'));
|
|
170
|
+
}
|
|
171
|
+
if (sf.added.length === 0 &&
|
|
172
|
+
sf.modified.length === 0 &&
|
|
173
|
+
sf.removed.length === 0 &&
|
|
174
|
+
(!plan.functions ||
|
|
175
|
+
(plan.functions.added.length === 0 &&
|
|
176
|
+
plan.functions.modified.length === 0 &&
|
|
177
|
+
plan.functions.removed.length === 0))) {
|
|
178
|
+
info(dim('No changes — local files match the deployed version.'));
|
|
179
|
+
}
|
|
180
|
+
// Re-derive the removal warning from the user-facing (filtered) diff so we
|
|
181
|
+
// don't fire a scary "will REMOVE" line about platform internals, and don't
|
|
182
|
+
// suppress a genuine removal of the user's own files.
|
|
183
|
+
if (sf.removed.length > 0) {
|
|
184
|
+
warn(`This deploy will REMOVE ${sf.removed.length} file(s): ${sf.removed.slice(0, 5).join(', ')}${sf.removed.length > 5 ? ', …' : ''}`);
|
|
185
|
+
}
|
|
186
|
+
if (plan.functions && plan.functions.removed.length > 0) {
|
|
187
|
+
warn(`This deploy will REMOVE ${plan.functions.removed.length} function(s): ${plan.functions.removed.slice(0, 5).join(', ')}${plan.functions.removed.length > 5 ? ', …' : ''}`);
|
|
188
|
+
}
|
|
189
|
+
// Pass through any non-removal warnings the server flagged (e.g. version
|
|
190
|
+
// conflict) — but skip the server's removal warnings, which we've already
|
|
191
|
+
// re-derived above from the filtered diff.
|
|
192
|
+
if (plan.warnings && plan.warnings.length > 0) {
|
|
193
|
+
for (const w of plan.warnings) {
|
|
194
|
+
if (/will REMOVE/i.test(w))
|
|
195
|
+
continue;
|
|
196
|
+
warn(w);
|
|
130
197
|
}
|
|
131
198
|
}
|
|
132
|
-
|
|
133
|
-
function formatBytes(bytes) {
|
|
134
|
-
if (bytes < 1024)
|
|
135
|
-
return `${bytes} B`;
|
|
136
|
-
if (bytes < 1024 * 1024)
|
|
137
|
-
return `${Math.round(bytes / 1024)} KB`;
|
|
138
|
-
return `${(bytes / (1024 * 1024)).toFixed(1)} MB`;
|
|
199
|
+
console.log('');
|
|
139
200
|
}
|
|
140
201
|
//# sourceMappingURL=deploy.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"deploy.js","sourceRoot":"","sources":["../../src/commands/deploy.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"deploy.js","sourceRoot":"","sources":["../../src/commands/deploy.ts"],"names":[],"mappings":"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"}
|
package/dist/commands/dev.js
CHANGED
|
@@ -1,73 +1,261 @@
|
|
|
1
1
|
import { spawn } from 'node:child_process';
|
|
2
2
|
import { existsSync, readFileSync } from 'node:fs';
|
|
3
|
-
import { join } from 'node:path';
|
|
3
|
+
import { join, relative } from 'node:path';
|
|
4
|
+
import chokidar from 'chokidar';
|
|
5
|
+
import open from 'open';
|
|
4
6
|
import ora from 'ora';
|
|
5
7
|
import { ApiClient } from '../lib/client.js';
|
|
6
8
|
import { getToken, loadProjectConfig } from '../lib/config.js';
|
|
7
|
-
import {
|
|
9
|
+
import { IGNORE, classifyKey, collectFiles } from '../lib/files.js';
|
|
10
|
+
import { bold, dim, error, green, info, red, success, teal, warn, yellow } from '../lib/output.js';
|
|
11
|
+
const WATCH_EXTS = /\.(ts|tsx|js|jsx|mjs|html|css|json|svg|md|txt|png|jpe?g|gif|webp|ico|woff2?|ttf|otf)$/i;
|
|
12
|
+
const DEBOUNCE_MS = 500;
|
|
8
13
|
export function registerDev(program) {
|
|
9
14
|
program
|
|
10
15
|
.command('dev [cmd...]')
|
|
11
|
-
.description('
|
|
12
|
-
.
|
|
13
|
-
|
|
14
|
-
|
|
16
|
+
.description('Hot-deploy watcher: save a file → live in seconds, no local server. ' +
|
|
17
|
+
'Pass a command (e.g. `somewhere dev npm run dev`) to run it locally with platform env vars instead.')
|
|
18
|
+
.option('--project <id>', 'Override project ID')
|
|
19
|
+
.action(async (cmdParts, opts) => {
|
|
20
|
+
// A passed command keeps the legacy local-exec behavior (Option B —
|
|
21
|
+
// run your own server with platform context injected). No command =
|
|
22
|
+
// the hot-deploy watcher (Option A — the platform's no-localhost answer).
|
|
23
|
+
if (cmdParts && cmdParts.length > 0) {
|
|
24
|
+
return runLegacyExec(cmdParts);
|
|
25
|
+
}
|
|
26
|
+
return runHotDeploy(opts);
|
|
27
|
+
});
|
|
28
|
+
}
|
|
29
|
+
async function runHotDeploy(opts) {
|
|
30
|
+
const token = getToken();
|
|
31
|
+
const client = new ApiClient(token);
|
|
32
|
+
const cwd = process.cwd();
|
|
33
|
+
let projectId = opts.project;
|
|
34
|
+
let subdomain;
|
|
35
|
+
if (!projectId) {
|
|
15
36
|
const config = loadProjectConfig();
|
|
16
37
|
if (!config) {
|
|
17
|
-
error('No project linked. Run `somewhere init`
|
|
38
|
+
error('No project linked. Run `somewhere init` or pass --project <id>.');
|
|
18
39
|
process.exit(1);
|
|
19
40
|
}
|
|
20
|
-
|
|
41
|
+
projectId = config.project_id;
|
|
42
|
+
subdomain = config.subdomain;
|
|
43
|
+
}
|
|
44
|
+
// Initial full sync. /deploy/patch rejects projects with no prior deploy, so
|
|
45
|
+
// a full deploy first guarantees the project is live AND gives us the URL.
|
|
46
|
+
const spinner = ora('Syncing current state...').start();
|
|
47
|
+
const { files, binaryFiles, functions } = collectFiles(cwd);
|
|
48
|
+
let url;
|
|
49
|
+
try {
|
|
50
|
+
const body = { project_id: projectId, files };
|
|
51
|
+
if (Object.keys(binaryFiles).length)
|
|
52
|
+
body.binary_files = binaryFiles;
|
|
53
|
+
if (Object.keys(functions).length)
|
|
54
|
+
body.functions = functions;
|
|
55
|
+
const res = await client.call('POST', '/deploy', body);
|
|
56
|
+
url = res.url;
|
|
57
|
+
spinner.stop();
|
|
58
|
+
const n = typeof res.files === 'number' ? res.files : (res.files ?? []).length;
|
|
59
|
+
success(`Synced ${n} files`);
|
|
60
|
+
if (res.warnings?.length)
|
|
61
|
+
for (const w of res.warnings)
|
|
62
|
+
warn(w);
|
|
63
|
+
}
|
|
64
|
+
catch (err) {
|
|
65
|
+
spinner.fail('Initial sync failed');
|
|
66
|
+
error(err instanceof Error ? err.message : String(err));
|
|
67
|
+
process.exit(1);
|
|
68
|
+
}
|
|
69
|
+
console.log('');
|
|
70
|
+
console.log(`${green('👀')} ${bold('Watching')} ${dim(cwd)} ${dim('for changes')}`);
|
|
71
|
+
console.log(`${teal('🌐')} ${teal(url)}`);
|
|
72
|
+
console.log(dim(' save a file and it goes live. Ctrl-C to stop.\n'));
|
|
73
|
+
open(url).catch(() => { });
|
|
74
|
+
// Debounced batch of changes. Saving three files in quick succession ships
|
|
75
|
+
// one patch, not three.
|
|
76
|
+
const pendingChanged = new Set();
|
|
77
|
+
const pendingDeleted = new Set();
|
|
78
|
+
let timer = null;
|
|
79
|
+
let deploying = false;
|
|
80
|
+
const schedule = () => {
|
|
81
|
+
if (timer)
|
|
82
|
+
clearTimeout(timer);
|
|
83
|
+
timer = setTimeout(flush, DEBOUNCE_MS);
|
|
84
|
+
};
|
|
85
|
+
const flush = async () => {
|
|
86
|
+
if (deploying) {
|
|
87
|
+
schedule(); // re-arm; a deploy is in flight
|
|
88
|
+
return;
|
|
89
|
+
}
|
|
90
|
+
const changed = [...pendingChanged];
|
|
91
|
+
const deleted = [...pendingDeleted];
|
|
92
|
+
if (!changed.length && !deleted.length)
|
|
93
|
+
return;
|
|
94
|
+
pendingChanged.clear();
|
|
95
|
+
pendingDeleted.clear();
|
|
96
|
+
deploying = true;
|
|
21
97
|
try {
|
|
22
|
-
|
|
23
|
-
const vars = result.keys ?? result.vars ?? [];
|
|
24
|
-
spinner.stop();
|
|
25
|
-
success(`${vars.length} env vars loaded`);
|
|
26
|
-
// Detect dev command
|
|
27
|
-
let command = cmdParts.join(' ');
|
|
28
|
-
if (!command) {
|
|
29
|
-
command = detectDevCommand();
|
|
30
|
-
}
|
|
31
|
-
if (!command) {
|
|
32
|
-
error('Could not detect a dev command. Pass one: somewhere dev npm run dev');
|
|
33
|
-
process.exit(1);
|
|
34
|
-
}
|
|
35
|
-
info(`Starting: ${dim(command)}`);
|
|
36
|
-
console.log('');
|
|
37
|
-
const envOverrides = {
|
|
38
|
-
SOMEWHERE_PROJECT_ID: config.project_id,
|
|
39
|
-
SOMEWHERE_SUBDOMAIN: config.subdomain,
|
|
40
|
-
SOMEWHERE_URL: `https://${config.subdomain}.somewhere.tech`,
|
|
41
|
-
};
|
|
42
|
-
// Env var VALUES aren't returned by the API (encrypted). The user's
|
|
43
|
-
// functions/server will read them from the platform at runtime.
|
|
44
|
-
// Here we just inject the project context vars.
|
|
45
|
-
const child = spawn(command, {
|
|
46
|
-
shell: true,
|
|
47
|
-
stdio: 'inherit',
|
|
48
|
-
env: { ...process.env, ...envOverrides },
|
|
49
|
-
});
|
|
50
|
-
child.on('exit', (code) => process.exit(code ?? 0));
|
|
98
|
+
await deployBatch(client, projectId, cwd, changed, deleted);
|
|
51
99
|
}
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
100
|
+
finally {
|
|
101
|
+
deploying = false;
|
|
102
|
+
if (pendingChanged.size || pendingDeleted.size)
|
|
103
|
+
schedule();
|
|
56
104
|
}
|
|
105
|
+
};
|
|
106
|
+
const watcher = chokidar.watch(cwd, {
|
|
107
|
+
ignoreInitial: true,
|
|
108
|
+
ignored: (p) => {
|
|
109
|
+
const rel = relative(cwd, p);
|
|
110
|
+
if (!rel || rel.startsWith('..'))
|
|
111
|
+
return false;
|
|
112
|
+
return rel.split(/[\\/]/).some((seg) => IGNORE.has(seg) || (seg.startsWith('.') && seg !== '.' && seg !== ''));
|
|
113
|
+
},
|
|
114
|
+
});
|
|
115
|
+
const onChange = (abs) => {
|
|
116
|
+
const rel = relative(cwd, abs);
|
|
117
|
+
if (!WATCH_EXTS.test(rel))
|
|
118
|
+
return;
|
|
119
|
+
pendingChanged.add(rel);
|
|
120
|
+
pendingDeleted.delete(rel);
|
|
121
|
+
schedule();
|
|
122
|
+
};
|
|
123
|
+
const onUnlink = (abs) => {
|
|
124
|
+
const rel = relative(cwd, abs);
|
|
125
|
+
if (!WATCH_EXTS.test(rel))
|
|
126
|
+
return;
|
|
127
|
+
pendingDeleted.add(rel);
|
|
128
|
+
pendingChanged.delete(rel);
|
|
129
|
+
schedule();
|
|
130
|
+
};
|
|
131
|
+
watcher.on('add', onChange).on('change', onChange).on('unlink', onUnlink);
|
|
132
|
+
process.on('SIGINT', () => {
|
|
133
|
+
console.log(`\n${dim('Stopped watching.')}`);
|
|
134
|
+
watcher.close().finally(() => process.exit(0));
|
|
57
135
|
});
|
|
58
136
|
}
|
|
59
|
-
function
|
|
60
|
-
const
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
137
|
+
async function deployBatch(client, projectId, cwd, changed, deleted) {
|
|
138
|
+
const updateFiles = {};
|
|
139
|
+
const updateFunctions = {};
|
|
140
|
+
const updateBinary = {};
|
|
141
|
+
const deleteKeys = [];
|
|
142
|
+
for (const rel of changed) {
|
|
143
|
+
const abs = join(cwd, rel);
|
|
144
|
+
if (!existsSync(abs))
|
|
145
|
+
continue; // changed-then-deleted within the window
|
|
146
|
+
const { kind, key } = classifyKey(rel);
|
|
147
|
+
if (kind === 'function')
|
|
148
|
+
updateFunctions[key] = readFileSync(abs, 'utf-8');
|
|
149
|
+
else if (kind === 'binary')
|
|
150
|
+
updateBinary[key] = readFileSync(abs).toString('base64');
|
|
151
|
+
else
|
|
152
|
+
updateFiles[key] = readFileSync(abs, 'utf-8');
|
|
153
|
+
}
|
|
154
|
+
for (const rel of deleted)
|
|
155
|
+
deleteKeys.push(classifyKey(rel).key);
|
|
156
|
+
const body = { project_id: projectId };
|
|
157
|
+
if (Object.keys(updateFiles).length)
|
|
158
|
+
body.update_files = updateFiles;
|
|
159
|
+
if (Object.keys(updateFunctions).length)
|
|
160
|
+
body.update_functions = updateFunctions;
|
|
161
|
+
if (Object.keys(updateBinary).length)
|
|
162
|
+
body.update_binary_files = updateBinary;
|
|
163
|
+
if (deleteKeys.length)
|
|
164
|
+
body.delete_files = deleteKeys;
|
|
165
|
+
// Nothing real to ship (e.g. every changed file vanished) — skip quietly.
|
|
166
|
+
if (Object.keys(body).length === 1)
|
|
167
|
+
return;
|
|
168
|
+
const label = describeBatch(changed, deleted);
|
|
169
|
+
const t0 = Date.now();
|
|
170
|
+
process.stdout.write(`${dim(stamp())} ${label} ${dim('→ deploying...')}`);
|
|
171
|
+
try {
|
|
172
|
+
const r = await client.call('POST', '/deploy/patch', body);
|
|
173
|
+
const secs = ((Date.now() - t0) / 1000).toFixed(1);
|
|
174
|
+
// Carriage-return overwrites the "deploying..." line with the verdict.
|
|
175
|
+
process.stdout.write('\r\x1b[K');
|
|
176
|
+
if (r.bundle_error) {
|
|
177
|
+
console.log(`${dim(stamp())} ${label} ${red('✗ compile failed')} ${dim(`(${secs}s)`)}`);
|
|
178
|
+
error(r.bundle_error);
|
|
179
|
+
info(dim('Previous working version is still live. Fix and save again.'));
|
|
180
|
+
return;
|
|
181
|
+
}
|
|
182
|
+
if (r.function_errors?.length) {
|
|
183
|
+
console.log(`${dim(stamp())} ${label} ${yellow('⚠ functions degraded')} ${dim(`(${secs}s)`)}`);
|
|
184
|
+
for (const fe of r.function_errors) {
|
|
185
|
+
const route = typeof fe === 'string' ? fe : fe.route ?? '';
|
|
186
|
+
const detail = typeof fe === 'string' ? '' : fe.error ? ` — ${fe.error}` : '';
|
|
187
|
+
warn(`${route}${detail}`);
|
|
188
|
+
}
|
|
189
|
+
return;
|
|
190
|
+
}
|
|
191
|
+
if (r.warnings?.length) {
|
|
192
|
+
console.log(`${dim(stamp())} ${label} ${yellow('⚠ live')} ${dim(`(${secs}s)`)}`);
|
|
193
|
+
for (const w of r.warnings)
|
|
194
|
+
warn(w);
|
|
195
|
+
return;
|
|
68
196
|
}
|
|
69
|
-
|
|
197
|
+
console.log(`${dim(stamp())} ${label} ${green('✓ live')} ${dim(`(${secs}s, v${r.version})`)}`);
|
|
198
|
+
}
|
|
199
|
+
catch (err) {
|
|
200
|
+
const secs = ((Date.now() - t0) / 1000).toFixed(1);
|
|
201
|
+
process.stdout.write('\r\x1b[K');
|
|
202
|
+
console.log(`${dim(stamp())} ${label} ${red('✗ failed')} ${dim(`(${secs}s)`)}`);
|
|
203
|
+
error(err instanceof Error ? err.message : String(err));
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
function describeBatch(changed, deleted) {
|
|
207
|
+
const parts = [];
|
|
208
|
+
if (changed.length === 1 && !deleted.length)
|
|
209
|
+
return teal(changed[0]);
|
|
210
|
+
if (deleted.length === 1 && !changed.length)
|
|
211
|
+
return `${teal(deleted[0])} ${dim('(deleted)')}`;
|
|
212
|
+
if (changed.length)
|
|
213
|
+
parts.push(`${changed.length} changed`);
|
|
214
|
+
if (deleted.length)
|
|
215
|
+
parts.push(`${deleted.length} deleted`);
|
|
216
|
+
return teal(parts.join(', '));
|
|
217
|
+
}
|
|
218
|
+
function stamp() {
|
|
219
|
+
const d = new Date();
|
|
220
|
+
const p = (n) => String(n).padStart(2, '0');
|
|
221
|
+
return `[${p(d.getHours())}:${p(d.getMinutes())}:${p(d.getSeconds())}]`;
|
|
222
|
+
}
|
|
223
|
+
// ─── Legacy: `somewhere dev <cmd>` runs a local command with platform context.
|
|
224
|
+
// Kept for anyone scripting against the old behavior; the no-arg form is the
|
|
225
|
+
// recommended hot-deploy watcher above.
|
|
226
|
+
async function runLegacyExec(cmdParts) {
|
|
227
|
+
const token = getToken();
|
|
228
|
+
const client = new ApiClient(token);
|
|
229
|
+
const config = loadProjectConfig();
|
|
230
|
+
if (!config) {
|
|
231
|
+
error('No project linked. Run `somewhere init` first.');
|
|
232
|
+
process.exit(1);
|
|
233
|
+
}
|
|
234
|
+
const spinner = ora('Loading project context from somewhere.tech...').start();
|
|
235
|
+
try {
|
|
236
|
+
const result = await client.call('GET', '/env', undefined, { project_id: config.project_id });
|
|
237
|
+
const vars = result.keys ?? result.vars ?? [];
|
|
238
|
+
spinner.stop();
|
|
239
|
+
success(`${vars.length} env vars available (values stay server-side)`);
|
|
240
|
+
const command = cmdParts.join(' ');
|
|
241
|
+
info(`Starting: ${dim(command)}`);
|
|
242
|
+
console.log('');
|
|
243
|
+
const child = spawn(command, {
|
|
244
|
+
shell: true,
|
|
245
|
+
stdio: 'inherit',
|
|
246
|
+
env: {
|
|
247
|
+
...process.env,
|
|
248
|
+
SOMEWHERE_PROJECT_ID: config.project_id,
|
|
249
|
+
SOMEWHERE_SUBDOMAIN: config.subdomain,
|
|
250
|
+
SOMEWHERE_URL: `https://${config.subdomain}.somewhere.tech`,
|
|
251
|
+
},
|
|
252
|
+
});
|
|
253
|
+
child.on('exit', (code) => process.exit(code ?? 0));
|
|
254
|
+
}
|
|
255
|
+
catch (err) {
|
|
256
|
+
spinner.fail('Failed to load project context');
|
|
257
|
+
error(err instanceof Error ? err.message : String(err));
|
|
258
|
+
process.exit(1);
|
|
70
259
|
}
|
|
71
|
-
return '';
|
|
72
260
|
}
|
|
73
261
|
//# sourceMappingURL=dev.js.map
|
package/dist/commands/dev.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dev.js","sourceRoot":"","sources":["../../src/commands/dev.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"dev.js","sourceRoot":"","sources":["../../src/commands/dev.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
import { readdirSync, readFileSync, statSync } from 'node:fs';
|
|
2
|
+
import { extname, join, relative } from 'node:path';
|
|
3
|
+
// Directories / files never uploaded. Mirrors the deploy collector.
|
|
4
|
+
export const IGNORE = new Set([
|
|
5
|
+
'node_modules',
|
|
6
|
+
'.git',
|
|
7
|
+
'.somewhere.json',
|
|
8
|
+
'.mcp.json',
|
|
9
|
+
'.env',
|
|
10
|
+
'.DS_Store',
|
|
11
|
+
'dist',
|
|
12
|
+
'.next',
|
|
13
|
+
'.vercel',
|
|
14
|
+
]);
|
|
15
|
+
export const MAX_FILE_SIZE = 5 * 1024 * 1024; // 5MB per file
|
|
16
|
+
export const BINARY_EXTS = new Set([
|
|
17
|
+
'.png', '.jpg', '.jpeg', '.gif', '.webp', '.ico', '.bmp', '.avif',
|
|
18
|
+
'.woff', '.woff2', '.ttf', '.otf', '.eot',
|
|
19
|
+
'.pdf', '.zip', '.gz', '.tar', '.br',
|
|
20
|
+
'.mp3', '.mp4', '.wav', '.ogg', '.webm', '.mov', '.m4a',
|
|
21
|
+
'.wasm',
|
|
22
|
+
]);
|
|
23
|
+
// Mirror of worker/src/routes/deploy.ts:isFunctionPath. Files matching these
|
|
24
|
+
// patterns must ship in `functions`/`update_functions`, not `files` — otherwise
|
|
25
|
+
// the worker writes them to static storage and never invokes the bundler, so
|
|
26
|
+
// the routes never register.
|
|
27
|
+
export function isFunctionPath(p) {
|
|
28
|
+
if (!/\.(ts|js|mjs)$/i.test(p))
|
|
29
|
+
return false;
|
|
30
|
+
if (p.startsWith('api/') || p.startsWith('_lib/'))
|
|
31
|
+
return true;
|
|
32
|
+
if (/^\[[^/]+\]\.(ts|js|mjs)$/.test(p))
|
|
33
|
+
return true;
|
|
34
|
+
return false;
|
|
35
|
+
}
|
|
36
|
+
export function isBinaryPath(p) {
|
|
37
|
+
return BINARY_EXTS.has(extname(p).toLowerCase());
|
|
38
|
+
}
|
|
39
|
+
/** Walk a directory tree and bucket every file into static / binary / function,
|
|
40
|
+
* applying the same path remapping the deploy command uses. */
|
|
41
|
+
export function collectFiles(baseDir) {
|
|
42
|
+
const out = { files: {}, binaryFiles: {}, functions: {} };
|
|
43
|
+
walk(baseDir, baseDir, out);
|
|
44
|
+
return out;
|
|
45
|
+
}
|
|
46
|
+
function walk(baseDir, currentDir, out) {
|
|
47
|
+
for (const entry of readdirSync(currentDir, { withFileTypes: true })) {
|
|
48
|
+
if (IGNORE.has(entry.name) || entry.name.startsWith('.'))
|
|
49
|
+
continue;
|
|
50
|
+
const fullPath = join(currentDir, entry.name);
|
|
51
|
+
if (entry.isDirectory()) {
|
|
52
|
+
walk(baseDir, fullPath, out);
|
|
53
|
+
continue;
|
|
54
|
+
}
|
|
55
|
+
if (!entry.isFile())
|
|
56
|
+
continue;
|
|
57
|
+
if (statSync(fullPath).size > MAX_FILE_SIZE)
|
|
58
|
+
continue;
|
|
59
|
+
const relPath = relative(baseDir, fullPath);
|
|
60
|
+
classifyInto(out, baseDir, relPath);
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
/** The deploy key + bucket a relative path maps to. `functions/`-prefixed paths
|
|
64
|
+
* are stripped to their route; root-level api/_lib/[param] paths are functions. */
|
|
65
|
+
export function classifyKey(relPath) {
|
|
66
|
+
if (relPath.startsWith('functions/')) {
|
|
67
|
+
return { kind: 'function', key: relPath.slice('functions/'.length) };
|
|
68
|
+
}
|
|
69
|
+
if (isFunctionPath(relPath)) {
|
|
70
|
+
return { kind: 'function', key: relPath };
|
|
71
|
+
}
|
|
72
|
+
if (isBinaryPath(relPath)) {
|
|
73
|
+
return { kind: 'binary', key: relPath };
|
|
74
|
+
}
|
|
75
|
+
return { kind: 'static', key: relPath };
|
|
76
|
+
}
|
|
77
|
+
/** Read one file off disk and place it in the right bucket of `out`. */
|
|
78
|
+
export function classifyInto(out, baseDir, relPath) {
|
|
79
|
+
const fullPath = join(baseDir, relPath);
|
|
80
|
+
const { kind, key } = classifyKey(relPath);
|
|
81
|
+
if (kind === 'function') {
|
|
82
|
+
out.functions[key] = readFileSync(fullPath, 'utf-8');
|
|
83
|
+
}
|
|
84
|
+
else if (kind === 'binary') {
|
|
85
|
+
out.binaryFiles[key] = readFileSync(fullPath).toString('base64');
|
|
86
|
+
}
|
|
87
|
+
else {
|
|
88
|
+
out.files[key] = readFileSync(fullPath, 'utf-8');
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
export function formatBytes(bytes) {
|
|
92
|
+
if (bytes < 1024)
|
|
93
|
+
return `${bytes} B`;
|
|
94
|
+
if (bytes < 1024 * 1024)
|
|
95
|
+
return `${Math.round(bytes / 1024)} KB`;
|
|
96
|
+
return `${(bytes / (1024 * 1024)).toFixed(1)} MB`;
|
|
97
|
+
}
|
|
98
|
+
//# sourceMappingURL=files.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"files.js","sourceRoot":"","sources":["../../src/lib/files.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@somewhere-tech/cli",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.9.0",
|
|
4
4
|
"description": "CLI for somewhere.tech — auth, projects, deploy, pull, promote, db, logs, env, MCP bridge.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"somewhere",
|
|
@@ -15,7 +15,10 @@
|
|
|
15
15
|
"url": "git+https://github.com/Somewhere-Tech/somewhere-cli.git"
|
|
16
16
|
},
|
|
17
17
|
"license": "MIT",
|
|
18
|
-
"author":
|
|
18
|
+
"author": {
|
|
19
|
+
"name": "somewhere.tech",
|
|
20
|
+
"email": "support@somewhere.tech"
|
|
21
|
+
},
|
|
19
22
|
"type": "module",
|
|
20
23
|
"bin": {
|
|
21
24
|
"somewhere": "bin/somewhere.js",
|
|
@@ -38,6 +41,7 @@
|
|
|
38
41
|
"dependencies": {
|
|
39
42
|
"@modelcontextprotocol/sdk": "^1.29.0",
|
|
40
43
|
"chalk": "^5.3.0",
|
|
44
|
+
"chokidar": "^4.0.3",
|
|
41
45
|
"commander": "^12.0.0",
|
|
42
46
|
"open": "^10.0.0",
|
|
43
47
|
"ora": "^8.0.0",
|