tova 0.2.4 → 0.2.5

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/bin/tova.js CHANGED
@@ -544,7 +544,7 @@ async function devServer(args) {
544
544
  if (output.client) {
545
545
  const p = join(outDir, `${outBaseName}.client.js`);
546
546
  writeFileSync(p, output.client);
547
- clientHTML = await generateDevHTML(output.client, srcDir, reloadPort);
547
+ clientHTML = await generateDevHTML(output.client, srcDir, actualReloadPort);
548
548
  writeFileSync(join(outDir, 'index.html'), clientHTML);
549
549
  hasClient = true;
550
550
  }
@@ -624,11 +624,28 @@ async function devServer(args) {
624
624
  console.log(` ✓ Client: ${relative('.', outDir)}/index.html`);
625
625
  }
626
626
 
627
- // Start live-reload SSE server
627
+ // Start live-reload SSE server — find an available port
628
628
  const reloadClients = new Set();
629
- const reloadServer = Bun.serve({
630
- port: reloadPort,
631
- fetch(req) {
629
+ let reloadServer;
630
+ let actualReloadPort = reloadPort;
631
+ for (let attempt = 0; attempt < 10; attempt++) {
632
+ try {
633
+ reloadServer = Bun.serve({
634
+ port: actualReloadPort,
635
+ fetch(req) {
636
+ return handleReloadFetch(req);
637
+ },
638
+ });
639
+ break;
640
+ } catch {
641
+ actualReloadPort++;
642
+ }
643
+ }
644
+ if (!reloadServer) {
645
+ console.log(' ⚠ Could not start live-reload server (ports in use)');
646
+ }
647
+
648
+ function handleReloadFetch(req) {
632
649
  const url = new URL(req.url);
633
650
  if (url.pathname === '/__tova_reload') {
634
651
  const stream = new ReadableStream({
@@ -655,8 +672,7 @@ async function devServer(args) {
655
672
  });
656
673
  }
657
674
  return new Response('Not Found', { status: 404 });
658
- },
659
- });
675
+ }
660
676
 
661
677
  function notifyReload() {
662
678
  const msg = new TextEncoder().encode('data: reload\n\n');
@@ -665,7 +681,7 @@ async function devServer(args) {
665
681
  }
666
682
  }
667
683
 
668
- console.log(` ✓ Live reload on port ${reloadPort}`);
684
+ if (reloadServer) console.log(` ✓ Live reload on port ${actualReloadPort}`);
669
685
 
670
686
  // Start file watcher for auto-rebuild
671
687
  const watcher = startWatcher(srcDir, async () => {
@@ -698,7 +714,7 @@ async function devServer(args) {
698
714
  }
699
715
  if (output.client) {
700
716
  writeFileSync(join(outDir, `${outBaseName}.client.js`), output.client);
701
- rebuildClientHTML = await generateDevHTML(output.client, srcDir, reloadPort);
717
+ rebuildClientHTML = await generateDevHTML(output.client, srcDir, actualReloadPort);
702
718
  writeFileSync(join(outDir, 'index.html'), rebuildClientHTML);
703
719
  }
704
720
  if (output.server) {
@@ -757,9 +773,9 @@ async function devServer(args) {
757
773
  process.on('SIGINT', () => {
758
774
  console.log('\n Shutting down...');
759
775
  watcher.close();
760
- reloadServer.stop();
776
+ if (reloadServer) reloadServer.stop();
761
777
  for (const p of processes) {
762
- p.child.kill('SIGTERM');
778
+ try { p.child.kill('SIGKILL'); } catch {}
763
779
  }
764
780
  process.exit(0);
765
781
  });
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "tova",
3
- "version": "0.2.4",
3
+ "version": "0.2.5",
4
4
  "description": "Tova — a modern programming language that transpiles to JavaScript, unifying frontend and backend",
5
5
  "type": "module",
6
6
  "main": "src/index.js",
package/src/version.js CHANGED
@@ -1,2 +1,2 @@
1
1
  // Auto-generated by scripts/embed-runtime.js — do not edit
2
- export const VERSION = "0.2.4";
2
+ export const VERSION = "0.2.5";