|
1 | 1 | #!/usr/bin/env node |
| 2 | +import fs from 'node:fs/promises'; |
| 3 | +import path from 'node:path'; |
2 | 4 | import { bundle } from '../src/node/bundle.js'; |
3 | 5 |
|
4 | | -const args = process.argv.slice(2); |
5 | | -let srcDir = 'src-api'; |
6 | | -let outFile = 'dist/worker.mjs'; |
7 | | -let prettyDefault = false; |
8 | | - |
9 | | -for (let i = 0; i < args.length; i++) { |
10 | | - const a = args[i]; |
11 | | - if (a === '--src' && args[i + 1]) { |
12 | | - srcDir = args[++i]; |
13 | | - } else if (a === '--out' && args[i + 1]) { |
14 | | - outFile = args[++i]; |
15 | | - } else if (a === '--pretty') { |
16 | | - prettyDefault = true; |
17 | | - } else if (a === '--help' || a === '-h') { |
18 | | - console.log(`Usage: statikapi-cf bundle [--src src-api] [--out dist/worker.mjs] [--pretty]`); |
19 | | - process.exit(0); |
| 6 | +function parseArgs(argv) { |
| 7 | + const out = { srcDir: null, outFile: null, prettyDefault: false, cwd: null, watch: false }; |
| 8 | + for (let i = 0; i < argv.length; i++) { |
| 9 | + const a = argv[i]; |
| 10 | + if (a === '--src' && argv[i + 1]) out.srcDir = argv[++i]; |
| 11 | + else if (a === '--out' && argv[i + 1]) out.outFile = argv[++i]; |
| 12 | + else if (a === '--cwd' && argv[i + 1]) out.cwd = argv[++i]; |
| 13 | + else if (a === '--pretty') out.prettyDefault = true; |
| 14 | + else if (a === '--watch') out.watch = true; |
| 15 | + else if (a === '--help' || a === '-h') { |
| 16 | + console.log( |
| 17 | + `Usage: statikapi-cf [--src src-api] [--out dist/worker.mjs] [--pretty] [--cwd DIR] [--watch]\n` + |
| 18 | + `Auto-detects src from wrangler.toml [vars] STATIK_SRC if present.` |
| 19 | + ); |
| 20 | + process.exit(0); |
| 21 | + } |
20 | 22 | } |
| 23 | + return out; |
21 | 24 | } |
22 | 25 |
|
23 | | -bundle({ srcDir, outFile, prettyDefault }) |
24 | | - .then(() => { |
25 | | - console.log(`✔ worker emitted → ${outFile}`); |
26 | | - }) |
27 | | - .catch((e) => { |
| 26 | +async function findProjectRoot(start) { |
| 27 | + let dir = path.resolve(start); |
| 28 | + while (true) { |
| 29 | + try { |
| 30 | + const f = await fs.readFile(path.join(dir, 'wrangler.toml'), 'utf8'); |
| 31 | + return { root: dir, wranglerToml: f }; |
| 32 | + } catch {} |
| 33 | + const parent = path.dirname(dir); |
| 34 | + if (parent === dir) return { root: path.resolve(start), wranglerToml: null }; |
| 35 | + dir = parent; |
| 36 | + } |
| 37 | +} |
| 38 | + |
| 39 | +function readTomlVar(toml, key) { |
| 40 | + // tiny parser for [vars] STATIK_SRC = "..." |
| 41 | + // keeps it simple and safe; not a full TOML parse |
| 42 | + const lines = String(toml || '').split(/\r?\n/); |
| 43 | + let inVars = false; |
| 44 | + for (const line of lines) { |
| 45 | + const l = line.trim(); |
| 46 | + if (!l || l.startsWith('#')) continue; |
| 47 | + if (l.startsWith('[') && l.endsWith(']')) { |
| 48 | + inVars = l.toLowerCase() === '[vars]'; |
| 49 | + continue; |
| 50 | + } |
| 51 | + if (!inVars) continue; |
| 52 | + const m = l.match(/^([A-Za-z0-9_]+)\s*=\s*["']([^"']+)["']/); |
| 53 | + if (m && m[1] === key) return m[2]; |
| 54 | + } |
| 55 | + return null; |
| 56 | +} |
| 57 | + |
| 58 | +(async function main() { |
| 59 | + const args = parseArgs(process.argv.slice(2)); |
| 60 | + |
| 61 | + const base = args.cwd || process.cwd(); |
| 62 | + const { root, wranglerToml } = await findProjectRoot(base); |
| 63 | + |
| 64 | + // Resolve srcDir preference: flag > [vars]STATIK_SRC > env > default |
| 65 | + let srcDir = |
| 66 | + args.srcDir || readTomlVar(wranglerToml, 'STATIK_SRC') || process.env.STATIK_SRC || 'src-api'; |
| 67 | + |
| 68 | + const outFile = args.outFile || 'dist/worker.mjs'; |
| 69 | + |
| 70 | + const run = async () => { |
| 71 | + await bundle({ |
| 72 | + cwd: root, |
| 73 | + srcDir, |
| 74 | + outFile, |
| 75 | + prettyDefault: args.prettyDefault, |
| 76 | + watch: args.watch, |
| 77 | + }); |
| 78 | + if (!args.watch) console.log(`✔ worker emitted → ${path.relative(root, outFile)}`); |
| 79 | + else console.log(`⟲ watcher active — emitting → ${path.relative(root, outFile)}`); |
| 80 | + }; |
| 81 | + |
| 82 | + try { |
| 83 | + await run(); |
| 84 | + } catch (e) { |
28 | 85 | console.error(e?.stack || e?.message || String(e)); |
29 | 86 | process.exit(1); |
30 | | - }); |
| 87 | + } |
| 88 | +})(); |
0 commit comments