()
| 145 | } |
| 146 | |
| 147 | async function main() { |
| 148 | if (watch) { |
| 149 | const ctx = await esbuild.context(buildOptions) |
| 150 | await ctx.watch() |
| 151 | console.log('Watching for changes...') |
| 152 | } else { |
| 153 | const startTime = Date.now() |
| 154 | const result = await esbuild.build(buildOptions) |
| 155 | |
| 156 | if (result.errors.length > 0) { |
| 157 | console.error('Build failed') |
| 158 | process.exit(1) |
| 159 | } |
| 160 | |
| 161 | // Make the output executable |
| 162 | const outPath = resolve(ROOT, 'dist/cli.mjs') |
| 163 | try { |
| 164 | chmodSync(outPath, 0o755) |
| 165 | } catch { |
| 166 | // chmod may fail on some platforms, non-fatal |
| 167 | } |
| 168 | |
| 169 | const elapsed = Date.now() - startTime |
| 170 | |
| 171 | // Print bundle size info |
| 172 | if (result.metafile) { |
| 173 | const text = await esbuild.analyzeMetafile(result.metafile, { verbose: false }) |
| 174 | const outFiles = Object.entries(result.metafile.outputs) |
| 175 | for (const [file, info] of outFiles) { |
| 176 | if (file.endsWith('.mjs')) { |
| 177 | const sizeMB = ((info as { bytes: number }).bytes / 1024 / 1024).toFixed(2) |
| 178 | console.log(`\n ${file}: ${sizeMB} MB`) |
| 179 | } |
| 180 | } |
| 181 | console.log(`\nBuild complete in ${elapsed}ms → dist/`) |
| 182 | |
| 183 | // Write metafile for further analysis |
| 184 | const { writeFileSync } = await import('fs') |
| 185 | writeFileSync( |
| 186 | resolve(ROOT, 'dist/meta.json'), |
| 187 | JSON.stringify(result.metafile), |
| 188 | ) |
| 189 | console.log(' Metafile written to dist/meta.json') |
| 190 | } |
| 191 | } |
| 192 | } |
| 193 | |
| 194 | main().catch(err => { |
| 195 | console.error(err) |
no test coverage detected