ugly-app 0.1.379 → 0.1.381

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.
@@ -1 +1 @@
1
- {"version":3,"file":"dev.d.ts","sourceRoot":"","sources":["../../src/cli/dev.ts"],"names":[],"mappings":"AA4BA,wBAAsB,MAAM,CAAC,IAAI,GAAE;IAAE,KAAK,EAAE,OAAO,CAAC;IAAC,OAAO,EAAE,OAAO,CAAA;CAAqC,GAAG,OAAO,CAAC,IAAI,CAAC,CAoKzH"}
1
+ {"version":3,"file":"dev.d.ts","sourceRoot":"","sources":["../../src/cli/dev.ts"],"names":[],"mappings":"AA0DA,wBAAsB,MAAM,CAAC,IAAI,GAAE;IAAE,KAAK,EAAE,OAAO,CAAC;IAAC,OAAO,EAAE,OAAO,CAAA;CAAqC,GAAG,OAAO,CAAC,IAAI,CAAC,CA+JzH"}
package/dist/cli/dev.js CHANGED
@@ -2,6 +2,34 @@ import { exec, execSync, spawn } from 'child_process';
2
2
  import fs from 'fs';
3
3
  import net from 'net';
4
4
  import path from 'path';
5
+ /**
6
+ * Return the PID of the process listening on `port`, or null if none.
7
+ * Cross-platform; shells out to `lsof` on Unix and `netstat` on Windows.
8
+ * Read-only: never signals anything. `-sTCP:LISTEN` on Unix filters out
9
+ * clients that merely have an established connection to a listener.
10
+ */
11
+ function findListenerPid(port) {
12
+ try {
13
+ if (process.platform === 'win32') {
14
+ const out = execSync(`netstat -ano | findstr :${port} | findstr LISTENING`, { encoding: 'utf-8', stdio: ['ignore', 'pipe', 'ignore'] }).trim();
15
+ const firstLine = out.split('\n').find(Boolean);
16
+ if (!firstLine)
17
+ return null;
18
+ const pid = firstLine.trim().split(/\s+/).pop();
19
+ return pid && pid !== '0' ? pid : null;
20
+ }
21
+ const out = execSync(`lsof -ti:${port} -sTCP:LISTEN`, {
22
+ encoding: 'utf-8',
23
+ stdio: ['ignore', 'pipe', 'ignore'],
24
+ }).trim();
25
+ const firstPid = out.split('\n').find(Boolean);
26
+ return firstPid ?? null;
27
+ }
28
+ catch {
29
+ // `lsof` / `netstat` exits non-zero when nothing matches — treat as free.
30
+ return null;
31
+ }
32
+ }
5
33
  function waitForPort(port, retries = 30, intervalMs = 1000) {
6
34
  return new Promise((resolve, reject) => {
7
35
  let attempts = 0;
@@ -52,29 +80,25 @@ export async function runDev(opts = { watch: false, verbose: false }) {
52
80
  // ── 1. Start infrastructure (sidecar tunnel) ─────────────────────────────
53
81
  await ensureInfra();
54
82
  const port = process.env['PORT'] ?? String(DEFAULT_LOCAL_PORT);
55
- // ── Kill stray process on PORT ─────────────────────────────────────────────
56
- try {
57
- if (process.platform === 'win32') {
58
- const out = execSync(`netstat -ano | findstr :${port} | findstr LISTENING`, { encoding: 'utf-8', stdio: ['ignore', 'pipe', 'ignore'] }).trim();
59
- const pids = new Set(out.split('\n').map(line => line.trim().split(/\s+/).pop()).filter(Boolean));
60
- for (const pid of pids) {
61
- try {
62
- execSync(`taskkill /PID ${pid} /F`, { stdio: 'ignore' });
63
- }
64
- catch { /* best-effort */ }
65
- }
66
- }
67
- else {
68
- // -sTCP:LISTEN is critical: without it, lsof returns every process with
69
- // ANY TCP activity on this port — including clients that have an
70
- // established connection to a listener. A parent process polling
71
- // `waitForPort` on the same port would get killed along with the stale
72
- // listener. Only kill processes that are actually bound to the port.
73
- execSync(`/bin/sh -c "lsof -ti:${port} -sTCP:LISTEN | xargs kill -9 2>/dev/null || true"`, { stdio: 'ignore' });
74
- }
75
- }
76
- catch {
77
- // best-effort — port may simply not be in use
83
+ // ── Check the port is free ────────────────────────────────────────────────
84
+ //
85
+ // We used to `kill -9` whatever was listening on this port before starting,
86
+ // to make restarts painless when a prior `ugly-app dev` had been SIGKILL'd
87
+ // and left an orphan Vite. In practice that silently killed unrelated
88
+ // processes including ugly-studio subsystems that happened to bind near
89
+ // the same port — producing mystery `exit code=137` crashes with no hint
90
+ // that ugly-app was the trigger.
91
+ //
92
+ // Better: if the port is taken, print a clear error and exit. The user
93
+ // stops the offending process (or edits `.uglyapp.localPort`) and runs
94
+ // `ugly-app dev` again. No process on this machine gets signaled without
95
+ // human intent.
96
+ const existingPid = findListenerPid(port);
97
+ if (existingPid) {
98
+ console.error(`[ugly-app] Port ${port} is already in use by PID ${existingPid}.\n` +
99
+ `Stop that process and re-run \`ugly-app dev\`, or edit\n` +
100
+ `\`.uglyapp.localPort\` to pick a different port.`);
101
+ process.exit(1);
78
102
  }
79
103
  // ── 2. Wait for data proxy ─────────────────────────────────────────────────
80
104
  if (process.env['DATA_PROXY_URL']) {
@@ -1 +1 @@
1
- {"version":3,"file":"dev.js","sourceRoot":"","sources":["../../src/cli/dev.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"dev.js","sourceRoot":"","sources":["../../src/cli/dev.ts"],"names":[],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- export declare const CLI_VERSION = "0.1.379";
1
+ export declare const CLI_VERSION = "0.1.381";
2
2
  //# sourceMappingURL=version.d.ts.map
@@ -1,3 +1,3 @@
1
1
  // Auto-generated by prebuild — do not edit manually
2
- export const CLI_VERSION = "0.1.379";
2
+ export const CLI_VERSION = "0.1.381";
3
3
  //# sourceMappingURL=version.js.map
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ugly-app",
3
- "version": "0.1.379",
3
+ "version": "0.1.381",
4
4
  "type": "module",
5
5
  "main": "./dist/server/index.js",
6
6
  "exports": {
package/src/cli/dev.ts CHANGED
@@ -2,6 +2,36 @@ import { exec, execSync, spawn } from 'child_process';
2
2
  import fs from 'fs';
3
3
  import net from 'net';
4
4
  import path from 'path';
5
+ /**
6
+ * Return the PID of the process listening on `port`, or null if none.
7
+ * Cross-platform; shells out to `lsof` on Unix and `netstat` on Windows.
8
+ * Read-only: never signals anything. `-sTCP:LISTEN` on Unix filters out
9
+ * clients that merely have an established connection to a listener.
10
+ */
11
+ function findListenerPid(port: string | number): string | null {
12
+ try {
13
+ if (process.platform === 'win32') {
14
+ const out = execSync(
15
+ `netstat -ano | findstr :${port} | findstr LISTENING`,
16
+ { encoding: 'utf-8', stdio: ['ignore', 'pipe', 'ignore'] },
17
+ ).trim();
18
+ const firstLine = out.split('\n').find(Boolean);
19
+ if (!firstLine) return null;
20
+ const pid = firstLine.trim().split(/\s+/).pop();
21
+ return pid && pid !== '0' ? pid : null;
22
+ }
23
+ const out = execSync(`lsof -ti:${port} -sTCP:LISTEN`, {
24
+ encoding: 'utf-8',
25
+ stdio: ['ignore', 'pipe', 'ignore'],
26
+ }).trim();
27
+ const firstPid = out.split('\n').find(Boolean);
28
+ return firstPid ?? null;
29
+ } catch {
30
+ // `lsof` / `netstat` exits non-zero when nothing matches — treat as free.
31
+ return null;
32
+ }
33
+ }
34
+
5
35
  function waitForPort(port: number, retries = 30, intervalMs = 1000): Promise<void> {
6
36
  return new Promise((resolve, reject) => {
7
37
  let attempts = 0;
@@ -57,32 +87,27 @@ export async function runDev(opts: { watch: boolean; verbose: boolean } = { watc
57
87
 
58
88
  const port = process.env['PORT'] ?? String(DEFAULT_LOCAL_PORT);
59
89
 
60
- // ── Kill stray process on PORT ─────────────────────────────────────────────
61
- try {
62
- if (process.platform === 'win32') {
63
- const out = execSync(
64
- `netstat -ano | findstr :${port} | findstr LISTENING`,
65
- { encoding: 'utf-8', stdio: ['ignore', 'pipe', 'ignore'] },
66
- ).trim();
67
- const pids = new Set(
68
- out.split('\n').map(line => line.trim().split(/\s+/).pop()).filter(Boolean),
69
- );
70
- for (const pid of pids) {
71
- try { execSync(`taskkill /PID ${pid} /F`, { stdio: 'ignore' }); } catch { /* best-effort */ }
72
- }
73
- } else {
74
- // -sTCP:LISTEN is critical: without it, lsof returns every process with
75
- // ANY TCP activity on this port — including clients that have an
76
- // established connection to a listener. A parent process polling
77
- // `waitForPort` on the same port would get killed along with the stale
78
- // listener. Only kill processes that are actually bound to the port.
79
- execSync(
80
- `/bin/sh -c "lsof -ti:${port} -sTCP:LISTEN | xargs kill -9 2>/dev/null || true"`,
81
- { stdio: 'ignore' },
82
- );
83
- }
84
- } catch {
85
- // best-effort — port may simply not be in use
90
+ // ── Check the port is free ────────────────────────────────────────────────
91
+ //
92
+ // We used to `kill -9` whatever was listening on this port before starting,
93
+ // to make restarts painless when a prior `ugly-app dev` had been SIGKILL'd
94
+ // and left an orphan Vite. In practice that silently killed unrelated
95
+ // processes — including ugly-studio subsystems that happened to bind near
96
+ // the same port — producing mystery `exit code=137` crashes with no hint
97
+ // that ugly-app was the trigger.
98
+ //
99
+ // Better: if the port is taken, print a clear error and exit. The user
100
+ // stops the offending process (or edits `.uglyapp.localPort`) and runs
101
+ // `ugly-app dev` again. No process on this machine gets signaled without
102
+ // human intent.
103
+ const existingPid = findListenerPid(port);
104
+ if (existingPid) {
105
+ console.error(
106
+ `[ugly-app] Port ${port} is already in use by PID ${existingPid}.\n` +
107
+ `Stop that process and re-run \`ugly-app dev\`, or edit\n` +
108
+ `\`.uglyapp.localPort\` to pick a different port.`,
109
+ );
110
+ process.exit(1);
86
111
  }
87
112
 
88
113
  // ── 2. Wait for data proxy ─────────────────────────────────────────────────
@@ -1,2 +1,2 @@
1
1
  // Auto-generated by prebuild — do not edit manually
2
- export const CLI_VERSION = "0.1.379";
2
+ export const CLI_VERSION = "0.1.381";