@take-out/cli 0.1.10 → 0.1.12

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.
@@ -47,6 +47,25 @@ function isBunShellNoise(line) {
47
47
  // source code lines like "24 | await $`..."
48
48
  /^\s*\^$/.test(stripped);
49
49
  }
50
+ const spawnedProcesses = [];
51
+ let cleaning = !1;
52
+ function killAllProcessGroups(signal = "SIGTERM") {
53
+ for (const proc of spawnedProcesses) if (proc.pid) try {
54
+ process.kill(-proc.pid, signal);
55
+ } catch {
56
+ try {
57
+ process.kill(proc.pid, signal);
58
+ } catch {}
59
+ }
60
+ }
61
+ function cleanupAndExit() {
62
+ cleaning || (cleaning = !0, process.stdout.write(`
63
+ \x1B[0m`), killAllProcessGroups("SIGTERM"), setTimeout(() => {
64
+ killAllProcessGroups("SIGKILL"), process.exit(0);
65
+ }, 150));
66
+ }
67
+ process.on("SIGINT", cleanupAndExit);
68
+ process.on("SIGTERM", cleanupAndExit);
50
69
  async function runScriptsInParallel(scripts, options = {}) {
51
70
  const {
52
71
  title,
@@ -83,23 +102,25 @@ function runSingleScript(script, colorIndex) {
83
102
  },
84
103
  detached: !0
85
104
  });
105
+ spawnedProcesses.push(proc);
86
106
  let stderrBuffer = "";
87
107
  proc.stdout.on("data", data => {
108
+ if (cleaning) return;
88
109
  const lines = data.toString().split(`
89
110
  `);
90
111
  for (const line of lines) line && console.info(`${color}${prefixLabel}${reset} ${line}`);
91
112
  }), proc.stderr.on("data", data => {
92
113
  const dataStr = data.toString();
93
- stderrBuffer += dataStr;
114
+ if (stderrBuffer += dataStr, cleaning) return;
94
115
  const lines = dataStr.split(`
95
116
  `);
96
117
  for (const line of lines) line && !isBunShellNoise(line) && console.error(`${color}${prefixLabel}${reset} ${line}`);
97
118
  }), proc.on("error", error => {
98
119
  console.error(`${color}${prefixLabel}${reset} Failed to start: ${error.message}`), reject(error);
99
120
  }), proc.on("close", code => {
100
- code && code !== 0 ? (stderrBuffer.includes("ShellError") || stderrBuffer.includes("at BunShell") || (console.error(`${color}${prefixLabel}${reset} Process exited with code ${code}`), stderrBuffer.trim() && (console.error(`
121
+ cleaning || (code && code !== 0 ? (stderrBuffer.includes("ShellError") || stderrBuffer.includes("at BunShell") || (console.error(`${color}${prefixLabel}${reset} Process exited with code ${code}`), stderrBuffer.trim() && (console.error(`
101
122
  ${color}${prefixLabel}${reset} Error output:`), console.error("\x1B[90m" + "\u2500".repeat(80) + "\x1B[0m"), console.error(stderrBuffer), console.error("\x1B[90m" + "\u2500".repeat(80) + `\x1B[0m
102
- `))), reject(new Error(`Script ${prefixLabel} failed with code ${code}`))) : (console.info(`${color}${prefixLabel}${reset} \x1B[32m\u2713 completed${reset}`), resolve());
123
+ `))), reject(new Error(`Script ${prefixLabel} failed with code ${code}`))) : (console.info(`${color}${prefixLabel}${reset} \x1B[32m\u2713 completed${reset}`), resolve()));
103
124
  });
104
125
  });
105
126
  }
@@ -39,6 +39,28 @@ function isBunShellNoise(line) {
39
39
  return stripped.startsWith("ShellError:") || stripped.startsWith("exitCode:") || stripped.startsWith("stdout:") || stripped.startsWith("stderr:") || stripped.startsWith("at ShellPromise") || stripped.startsWith("at BunShell") || stripped.startsWith("Bun v") || /^\d+\s*\|/.test(stripped) || // source code lines like "24 | await $`..."
40
40
  /^\s*\^$/.test(stripped);
41
41
  }
42
+ const spawnedProcesses = [];
43
+ let cleaning = !1;
44
+ function killAllProcessGroups(signal = "SIGTERM") {
45
+ for (const proc of spawnedProcesses)
46
+ if (proc.pid)
47
+ try {
48
+ process.kill(-proc.pid, signal);
49
+ } catch {
50
+ try {
51
+ process.kill(proc.pid, signal);
52
+ } catch {
53
+ }
54
+ }
55
+ }
56
+ function cleanupAndExit() {
57
+ cleaning || (cleaning = !0, process.stdout.write(`
58
+ \x1B[0m`), killAllProcessGroups("SIGTERM"), setTimeout(() => {
59
+ killAllProcessGroups("SIGKILL"), process.exit(0);
60
+ }, 150));
61
+ }
62
+ process.on("SIGINT", cleanupAndExit);
63
+ process.on("SIGTERM", cleanupAndExit);
42
64
  async function runScriptsInParallel(scripts, options = {}) {
43
65
  const { title, onError = "exit", maxParallelism = (0, import_node_os.cpus)().length } = options;
44
66
  title && (console.info(), console.info(title), console.info());
@@ -64,15 +86,17 @@ function runSingleScript(script, colorIndex) {
64
86
  env: { ...process.env, FORCE_COLOR: "3" },
65
87
  detached: !0
66
88
  });
89
+ spawnedProcesses.push(proc);
67
90
  let stderrBuffer = "";
68
91
  proc.stdout.on("data", (data) => {
92
+ if (cleaning) return;
69
93
  const lines = data.toString().split(`
70
94
  `);
71
95
  for (const line of lines)
72
96
  line && console.info(`${color}${prefixLabel}${reset} ${line}`);
73
97
  }), proc.stderr.on("data", (data) => {
74
98
  const dataStr = data.toString();
75
- stderrBuffer += dataStr;
99
+ if (stderrBuffer += dataStr, cleaning) return;
76
100
  const lines = dataStr.split(`
77
101
  `);
78
102
  for (const line of lines)
@@ -80,9 +104,9 @@ function runSingleScript(script, colorIndex) {
80
104
  }), proc.on("error", (error) => {
81
105
  console.error(`${color}${prefixLabel}${reset} Failed to start: ${error.message}`), reject(error);
82
106
  }), proc.on("close", (code) => {
83
- code && code !== 0 ? (stderrBuffer.includes("ShellError") || stderrBuffer.includes("at BunShell") || (console.error(`${color}${prefixLabel}${reset} Process exited with code ${code}`), stderrBuffer.trim() && (console.error(`
107
+ cleaning || (code && code !== 0 ? (stderrBuffer.includes("ShellError") || stderrBuffer.includes("at BunShell") || (console.error(`${color}${prefixLabel}${reset} Process exited with code ${code}`), stderrBuffer.trim() && (console.error(`
84
108
  ${color}${prefixLabel}${reset} Error output:`), console.error("\x1B[90m" + "\u2500".repeat(80) + "\x1B[0m"), console.error(stderrBuffer), console.error("\x1B[90m" + "\u2500".repeat(80) + `\x1B[0m
85
- `))), reject(new Error(`Script ${prefixLabel} failed with code ${code}`))) : (console.info(`${color}${prefixLabel}${reset} \x1B[32m\u2713 completed${reset}`), resolve());
109
+ `))), reject(new Error(`Script ${prefixLabel} failed with code ${code}`))) : (console.info(`${color}${prefixLabel}${reset} \x1B[32m\u2713 completed${reset}`), resolve()));
86
110
  });
87
111
  });
88
112
  }
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/utils/parallel-runner.ts"],
4
- "mappings": "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",
4
+ "mappings": "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",
5
5
  "names": []
6
6
  }
@@ -21,6 +21,28 @@ function isBunShellNoise(line) {
21
21
  return stripped.startsWith("ShellError:") || stripped.startsWith("exitCode:") || stripped.startsWith("stdout:") || stripped.startsWith("stderr:") || stripped.startsWith("at ShellPromise") || stripped.startsWith("at BunShell") || stripped.startsWith("Bun v") || /^\d+\s*\|/.test(stripped) || // source code lines like "24 | await $`..."
22
22
  /^\s*\^$/.test(stripped);
23
23
  }
24
+ const spawnedProcesses = [];
25
+ let cleaning = !1;
26
+ function killAllProcessGroups(signal = "SIGTERM") {
27
+ for (const proc of spawnedProcesses)
28
+ if (proc.pid)
29
+ try {
30
+ process.kill(-proc.pid, signal);
31
+ } catch {
32
+ try {
33
+ process.kill(proc.pid, signal);
34
+ } catch {
35
+ }
36
+ }
37
+ }
38
+ function cleanupAndExit() {
39
+ cleaning || (cleaning = !0, process.stdout.write(`
40
+ \x1B[0m`), killAllProcessGroups("SIGTERM"), setTimeout(() => {
41
+ killAllProcessGroups("SIGKILL"), process.exit(0);
42
+ }, 150));
43
+ }
44
+ process.on("SIGINT", cleanupAndExit);
45
+ process.on("SIGTERM", cleanupAndExit);
24
46
  async function runScriptsInParallel(scripts, options = {}) {
25
47
  const { title, onError = "exit", maxParallelism = cpus().length } = options;
26
48
  title && (console.info(), console.info(title), console.info());
@@ -46,15 +68,17 @@ function runSingleScript(script, colorIndex) {
46
68
  env: { ...process.env, FORCE_COLOR: "3" },
47
69
  detached: !0
48
70
  });
71
+ spawnedProcesses.push(proc);
49
72
  let stderrBuffer = "";
50
73
  proc.stdout.on("data", (data) => {
74
+ if (cleaning) return;
51
75
  const lines = data.toString().split(`
52
76
  `);
53
77
  for (const line of lines)
54
78
  line && console.info(`${color}${prefixLabel}${reset} ${line}`);
55
79
  }), proc.stderr.on("data", (data) => {
56
80
  const dataStr = data.toString();
57
- stderrBuffer += dataStr;
81
+ if (stderrBuffer += dataStr, cleaning) return;
58
82
  const lines = dataStr.split(`
59
83
  `);
60
84
  for (const line of lines)
@@ -62,9 +86,9 @@ function runSingleScript(script, colorIndex) {
62
86
  }), proc.on("error", (error) => {
63
87
  console.error(`${color}${prefixLabel}${reset} Failed to start: ${error.message}`), reject(error);
64
88
  }), proc.on("close", (code) => {
65
- code && code !== 0 ? (stderrBuffer.includes("ShellError") || stderrBuffer.includes("at BunShell") || (console.error(`${color}${prefixLabel}${reset} Process exited with code ${code}`), stderrBuffer.trim() && (console.error(`
89
+ cleaning || (code && code !== 0 ? (stderrBuffer.includes("ShellError") || stderrBuffer.includes("at BunShell") || (console.error(`${color}${prefixLabel}${reset} Process exited with code ${code}`), stderrBuffer.trim() && (console.error(`
66
90
  ${color}${prefixLabel}${reset} Error output:`), console.error("\x1B[90m" + "\u2500".repeat(80) + "\x1B[0m"), console.error(stderrBuffer), console.error("\x1B[90m" + "\u2500".repeat(80) + `\x1B[0m
67
- `))), reject(new Error(`Script ${prefixLabel} failed with code ${code}`))) : (console.info(`${color}${prefixLabel}${reset} \x1B[32m\u2713 completed${reset}`), resolve());
91
+ `))), reject(new Error(`Script ${prefixLabel} failed with code ${code}`))) : (console.info(`${color}${prefixLabel}${reset} \x1B[32m\u2713 completed${reset}`), resolve()));
68
92
  });
69
93
  });
70
94
  }
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/utils/parallel-runner.ts"],
4
- "mappings": "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",
4
+ "mappings": "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",
5
5
  "names": []
6
6
  }
@@ -22,6 +22,25 @@ function isBunShellNoise(line) {
22
22
  // source code lines like "24 | await $`..."
23
23
  /^\s*\^$/.test(stripped);
24
24
  }
25
+ const spawnedProcesses = [];
26
+ let cleaning = !1;
27
+ function killAllProcessGroups(signal = "SIGTERM") {
28
+ for (const proc of spawnedProcesses) if (proc.pid) try {
29
+ process.kill(-proc.pid, signal);
30
+ } catch {
31
+ try {
32
+ process.kill(proc.pid, signal);
33
+ } catch {}
34
+ }
35
+ }
36
+ function cleanupAndExit() {
37
+ cleaning || (cleaning = !0, process.stdout.write(`
38
+ \x1B[0m`), killAllProcessGroups("SIGTERM"), setTimeout(() => {
39
+ killAllProcessGroups("SIGKILL"), process.exit(0);
40
+ }, 150));
41
+ }
42
+ process.on("SIGINT", cleanupAndExit);
43
+ process.on("SIGTERM", cleanupAndExit);
25
44
  async function runScriptsInParallel(scripts, options = {}) {
26
45
  const {
27
46
  title,
@@ -58,23 +77,25 @@ function runSingleScript(script, colorIndex) {
58
77
  },
59
78
  detached: !0
60
79
  });
80
+ spawnedProcesses.push(proc);
61
81
  let stderrBuffer = "";
62
82
  proc.stdout.on("data", data => {
83
+ if (cleaning) return;
63
84
  const lines = data.toString().split(`
64
85
  `);
65
86
  for (const line of lines) line && console.info(`${color}${prefixLabel}${reset} ${line}`);
66
87
  }), proc.stderr.on("data", data => {
67
88
  const dataStr = data.toString();
68
- stderrBuffer += dataStr;
89
+ if (stderrBuffer += dataStr, cleaning) return;
69
90
  const lines = dataStr.split(`
70
91
  `);
71
92
  for (const line of lines) line && !isBunShellNoise(line) && console.error(`${color}${prefixLabel}${reset} ${line}`);
72
93
  }), proc.on("error", error => {
73
94
  console.error(`${color}${prefixLabel}${reset} Failed to start: ${error.message}`), reject(error);
74
95
  }), proc.on("close", code => {
75
- code && code !== 0 ? (stderrBuffer.includes("ShellError") || stderrBuffer.includes("at BunShell") || (console.error(`${color}${prefixLabel}${reset} Process exited with code ${code}`), stderrBuffer.trim() && (console.error(`
96
+ cleaning || (code && code !== 0 ? (stderrBuffer.includes("ShellError") || stderrBuffer.includes("at BunShell") || (console.error(`${color}${prefixLabel}${reset} Process exited with code ${code}`), stderrBuffer.trim() && (console.error(`
76
97
  ${color}${prefixLabel}${reset} Error output:`), console.error("\x1B[90m" + "\u2500".repeat(80) + "\x1B[0m"), console.error(stderrBuffer), console.error("\x1B[90m" + "\u2500".repeat(80) + `\x1B[0m
77
- `))), reject(new Error(`Script ${prefixLabel} failed with code ${code}`))) : (console.info(`${color}${prefixLabel}${reset} \x1B[32m\u2713 completed${reset}`), resolve());
98
+ `))), reject(new Error(`Script ${prefixLabel} failed with code ${code}`))) : (console.info(`${color}${prefixLabel}${reset} \x1B[32m\u2713 completed${reset}`), resolve()));
78
99
  });
79
100
  });
80
101
  }
@@ -1 +1 @@
1
- {"version":3,"names":["spawn","cpus","colors","reset","isBunShellNoise","line","stripped","replace","trim","startsWith","test","runScriptsInParallel","scripts","options","title","onError","maxParallelism","length","console","info","allPromises","executing","Set","i","script","scriptPromise","runSingleScript","finally","delete","push","add","size","Promise","race","failures","allSettled","filter","r","status","error","process","exit","colorIndex","resolve","reject","color","prefixLabel","name","proc","path","args","stdio","shell","env","FORCE_COLOR","detached","stderrBuffer","stdout","on","data","lines","toString","split","stderr","dataStr","message","code","includes","repeat","Error"],"sources":["../../../src/utils/parallel-runner.ts"],"sourcesContent":[null],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["spawn","cpus","colors","reset","isBunShellNoise","line","stripped","replace","trim","startsWith","test","spawnedProcesses","cleaning","killAllProcessGroups","signal","proc","pid","process","kill","cleanupAndExit","stdout","write","setTimeout","exit","on","runScriptsInParallel","scripts","options","title","onError","maxParallelism","length","console","info","allPromises","executing","Set","i","script","scriptPromise","runSingleScript","finally","delete","push","add","size","Promise","race","failures","allSettled","filter","r","status","error","colorIndex","resolve","reject","color","prefixLabel","name","path","args","stdio","shell","env","FORCE_COLOR","detached","stderrBuffer","data","lines","toString","split","stderr","dataStr","message","code","includes","repeat","Error"],"sources":["../../../src/utils/parallel-runner.ts"],"sourcesContent":[null],"mappings":"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","ignoreList":[]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@take-out/cli",
3
- "version": "0.1.10",
3
+ "version": "0.1.12",
4
4
  "description": "CLI tools for Takeout starter kit - interactive onboarding and project setup",
5
5
  "type": "module",
6
6
  "sideEffects": false,
@@ -51,8 +51,8 @@
51
51
  },
52
52
  "dependencies": {
53
53
  "@clack/prompts": "^0.8.2",
54
- "@take-out/docs": "0.1.10",
55
- "@take-out/scripts": "0.1.10",
54
+ "@take-out/docs": "0.1.12",
55
+ "@take-out/scripts": "0.1.12",
56
56
  "citty": "^0.1.6",
57
57
  "picocolors": "^1.1.1"
58
58
  },
@@ -2,7 +2,7 @@
2
2
  * Utility for running scripts in parallel with color-coded output
3
3
  */
4
4
 
5
- import { spawn } from 'node:child_process'
5
+ import { spawn, type ChildProcess } from 'node:child_process'
6
6
  import { cpus } from 'node:os'
7
7
 
8
8
  const colors = [
@@ -40,6 +40,41 @@ interface ScriptToRun {
40
40
  args?: string[]
41
41
  }
42
42
 
43
+ // track all spawned processes for cleanup
44
+ const spawnedProcesses: ChildProcess[] = []
45
+ let cleaning = false
46
+
47
+ function killAllProcessGroups(signal: NodeJS.Signals = 'SIGTERM') {
48
+ for (const proc of spawnedProcesses) {
49
+ if (proc.pid) {
50
+ // negative pid kills the entire process group (detached: true makes them group leaders)
51
+ try {
52
+ process.kill(-proc.pid, signal)
53
+ } catch (_) {
54
+ try {
55
+ process.kill(proc.pid, signal)
56
+ } catch (_) {}
57
+ }
58
+ }
59
+ }
60
+ }
61
+
62
+ function cleanupAndExit() {
63
+ if (cleaning) return
64
+ cleaning = true
65
+
66
+ process.stdout.write('\n\x1b[0m')
67
+ killAllProcessGroups('SIGTERM')
68
+
69
+ setTimeout(() => {
70
+ killAllProcessGroups('SIGKILL')
71
+ process.exit(0)
72
+ }, 150)
73
+ }
74
+
75
+ process.on('SIGINT', cleanupAndExit)
76
+ process.on('SIGTERM', cleanupAndExit)
77
+
43
78
  export async function runScriptsInParallel(
44
79
  scripts: ScriptToRun[],
45
80
  options: {
@@ -100,9 +135,12 @@ function runSingleScript(script: ScriptToRun, colorIndex: number): Promise<void>
100
135
  detached: true,
101
136
  })
102
137
 
138
+ spawnedProcesses.push(proc)
139
+
103
140
  let stderrBuffer = ''
104
141
 
105
142
  proc.stdout.on('data', (data) => {
143
+ if (cleaning) return
106
144
  const lines = data.toString().split('\n')
107
145
  for (const line of lines) {
108
146
  if (line) console.info(`${color}${prefixLabel}${reset} ${line}`)
@@ -113,6 +151,7 @@ function runSingleScript(script: ScriptToRun, colorIndex: number): Promise<void>
113
151
  const dataStr = data.toString()
114
152
  stderrBuffer += dataStr
115
153
 
154
+ if (cleaning) return
116
155
  const lines = dataStr.split('\n')
117
156
  for (const line of lines) {
118
157
  if (line && !isBunShellNoise(line)) {
@@ -127,6 +166,8 @@ function runSingleScript(script: ScriptToRun, colorIndex: number): Promise<void>
127
166
  })
128
167
 
129
168
  proc.on('close', (code) => {
169
+ if (cleaning) return
170
+
130
171
  if (code && code !== 0) {
131
172
  // detect if this was a bun shell error (already printed inline)
132
173
  // check for ShellError or the bun shell stack trace pattern
@@ -1 +1 @@
1
- {"version":3,"file":"parallel-runner.d.ts","sourceRoot":"","sources":["../../src/utils/parallel-runner.ts"],"names":[],"mappings":"AAAA;;GAEG;AAkCH,UAAU,WAAW;IACnB,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,CAAC,EAAE,MAAM,EAAE,CAAA;CAChB;AAED,wBAAsB,oBAAoB,CACxC,OAAO,EAAE,WAAW,EAAE,EACtB,OAAO,GAAE;IACP,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,OAAO,CAAC,EAAE,UAAU,GAAG,MAAM,CAAA;IAC7B,cAAc,CAAC,EAAE,MAAM,CAAA;CACnB,GACL,OAAO,CAAC,IAAI,CAAC,CAuCf"}
1
+ {"version":3,"file":"parallel-runner.d.ts","sourceRoot":"","sources":["../../src/utils/parallel-runner.ts"],"names":[],"mappings":"AAAA;;GAEG;AAkCH,UAAU,WAAW;IACnB,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,CAAC,EAAE,MAAM,EAAE,CAAA;CAChB;AAqCD,wBAAsB,oBAAoB,CACxC,OAAO,EAAE,WAAW,EAAE,EACtB,OAAO,GAAE;IACP,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,OAAO,CAAC,EAAE,UAAU,GAAG,MAAM,CAAA;IAC7B,cAAc,CAAC,EAAE,MAAM,CAAA;CACnB,GACL,OAAO,CAAC,IAAI,CAAC,CAuCf"}